feat(frontend): prototype 1:1 rebuild P0-P2 + cleanup #221

Open
redxin wants to merge 19 commits from claude/frosty-knuth-efd579 into main
Owner

P0-P2 rebuild + decorative cleanup

P0-P2 rebuild + decorative cleanup
- 布局:左侧 212px 全高侧栏 + 右侧 60px header(保留 data-tauri-drag-region)
- 侧栏:logo + 9 项平铺导航(图标/激活#2563EB·#EFF6FF/徽标三色)+ 底部 管理控制台
- 顶栏:网点切换下拉(248px,真实网点)+ 内联全局搜索下拉(患者真实/预约·订单占位TODO)
  + 铃铛红点 + 用户档(姓名+RBAC角色)+ 退出
- 新增通知中心 384px 右抽屉(遮罩/通知中心+计数/全部已读/三组/查看全部),第一遍完全缺失
- 移除非原型 chrome 顶栏入口(titlebar/statusbar/折叠/分组/换肤·锁屏·安全),保留功能代码+Ctrl+L
- 侧栏权限门控保留(功能必需);通知feed/预约·订单搜索为占位(后端未提供)
- 审计:design/audit/workbench-chrome.md

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- PageHeader 加 crumbRoot 向后兼容面包屑模式(工作台/标题 + 标题副标题同行);admin 等旧调用点不受影响
- 今日待办:6 汇总卡(原型图标圆角方块/逾期徽标/30px数字/点击切tab)+ tab条 + 列表行(头像/姓名meta/事项/时间/标签/操作/锁定态)+ 导出·新增待办;真实 todo 接入,缺字段占位TODO
- 经营分析:面包屑模式 + range tabs实底 + KPI6卡本地重建 + 跨店四列(网点/营收/椅位/成交率)+ 柱状/环形 + 配色字面hex;真实 reports/finance 接入,缺字段占位TODO
- 审计:design/audit/workbench-{today,analytics}.md
- typecheck + build:vite 独立验证 PASS

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- 预约:日/周排期(时间轴×医生·牙椅列彩色块)+ 待确认列表 + 新建预约;真实 appointments API;剔除原型没有的图例/列表视图/浮层详情
- 叫号·排队·签到:签到/排队队列/当前叫号 三栏;真实 queue API;剔除原型没有的KPI卡/选椅modal/行内动作(动作仅右栏大按钮)
- 收费:待收费列表+sticky结算面板+开发票(PR#217)/退费+收款凭证;剔除原型没有的tabs/KPI卡/快速收费
- 停机补录:离线告警条+单卡6列表+一键补录;真实 reconcile API
- 耗材库:3统计卡+自绘grid表(低库存红标)+出入库右抽屉;真实 inventory API;批次/近效期占位TODO
- dfFade/dfPulse 提到 globals.css 全局定义(CSS Modules 会哈希 keyframe 名致内联裸名失效;修复通知抽屉/下拉/抽屉淡入)
- 各面板用 PageHeader crumbRoot 面包屑;审计 design/audit/workbench-*.md
- typecheck + build:vite 独立验证 PASS

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- 接诊(TreatmentPlansPage):整页重建为原型5步接诊向导(主诉检查/患者标签/治疗方案/治疗开药/完成复诊);队列驱动当前就诊患者,接真实 encounters/records/treatments/drug/advice/charge-preview;无患者空态;过期截图忽略以 .dc.html 5步 encStepDef 为准
- 患者列表(PatientSearchPage):检索框+新建患者+列表(头像/性别年龄/手机/建档日期/标签)+新建患者表单;真实 patients API
- 患者档案壳(PatientProfilePage):修正 ALL_TABS 错位(原15项→严格13项 profTabsDef 顺序+标签);自带患者头卡(渐变头像/过敏警示接真实allergies/标签/建档);去 PageHeader(档案页 showStdHeader=false);移除原型外的 RecordsTab/ConsentTab nav 入口(组件保留)
- 审计:design/audit/workbench-{treatment,patients-list,patient-profile-shell}.md
- typecheck + build:vite 独立验证 PASS

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
时间线/就诊(+就诊详情modal)/预约记录/初诊表/修订历史/他院病历/牙周图(牙位网格+探诊色阶+点击弹窗)/治疗方案(横向节点轴)/处方/收费记录/影像文件(+查看器modal缩放平移)/家庭成员/关系网(SVG图+拖拽+缩放)逐tab重建;真实API接入,缺字段占位TODO
- 牙周图未碰共享 PerioChartsSection(内联重建避免撞 RecordsTab)
- typecheck+build:vite 绿;Chrome 验全13tab顺序/标签/渲染无崩
- 审计:design/audit/workbench-tabs-*.md(5份)
- 注:部分tab残留原型外装饰(onJump/新建预约/新建方案/开方打印作废/添加联系人等),待任务#7统一清理

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- 激活态 rgba(37,99,235,.9)实蓝白字(原误为白透明);删 ::before 左竖条/分区标题uppercase/多余ThemeSwitcher
- 面包屑+H1 移入内容区(原型顶栏只静态管理控制台);补设置齿轮(TODO占位)
- ADMIN徽标#7DD3FC、分区标题#475569、brand/topbar间距对齐原型;保留权限门控
- 审计 design/audit/admin-shell.md(含17项导航↔现状路由映射,路径命名差异留监工)
- typecheck 零错误

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
运营总览(概览仪表盘)/组织与权限(员工·排班·权限矩阵·药品·诊所)/经营(营收·报表·应收·发票·提成)/审计安全(审计·安全事件·在线会话)/系统运维(告警·系统状态·大屏设备)逐面板重建
- 删除原型外的 antd Table/Segmented/筛选条/侧详情/统计卡等旧附加物;改原型内联grid表+hex
- security/sessions 走通用列表模板;真实API接入(PR#217发票·#218提成两级 已就绪);缺字段占位TODO
- 共享 RevenueOverviewPage 按admin营收原型重建(/admin/revenue复用)
- typecheck+build:vite 绿;Chrome验5分区/17导航/深色壳#0F172A/概览+多面板渲染
- 审计 design/audit/admin-*.md(7份)
- 注:部分面板残留原型外装饰(网点筛选/相互作用tab/开票申请等),记任务#7清理

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- chairStatusMeta 返回 cardBg/cardBorder,牙椅卡片动态背景随状态变色
- 顶栏追加"退出"按钮 → navigate('/login')
- 修复 resetFab → resetBtn (CSS module class 名)
- 牙椅/排队区段标题改用 chairSectionTitle/chairSectionEn (17px)
- 正在叫号区添加"工作台叫号已联动"同步徽标(读 df_queue_sync)
- 牙椅区段加 sectionChairs 类(box-shadow 精细对齐)
- CSS module 从深色高对比主题迁移至浅色主题(对齐原型浅色设计)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
LoginPage:
- 背景: 135°渐变 + 两个装饰气泡(absolute 定位)
- 卡片: 404px 宽 border-radius:16px 精确阴影
- Logo: 44×44px 蓝色渐变方块 + DentalFlow+副标题双行
- 标题「欢迎回来」+ 副标题
- 自定义输入框(SVG图标+高42px背景#F8FAFC)
- 记住本机复选框 + 忘记密码链接
- OR分隔线 + 短信验证码登录按钮(→ /login/totp)
- 页脚: 候诊大屏↗(/view) · 服务器设置 · 演示404

TotpPage:
- 自定义6格码输入(退格/跳格/粘贴支持)
- 60s倒计时"重新发送"
- 描述改为「验证码已发送至 138****6021」
- 蓝色渐变「验 证」按钮 + 「← 返回登录」底链

TemplatesPage:
- 分类: antd Segmented → 自定义pill按钮(全部/病历/路径/医嘱)
- 移除归属筛选(ownerFilter Dropdown)
- 全部视图: 并发拉3类数据按分区渲染
- 模板卡: 38×38图标+badge+归属+描述+路径节点链+卡脚
- 路径节点链: 内联渲染(#14B8A6圆点+连接线)
- 新建模板: 固定遮罩480px居中modal(4字段) → API创建→打开Drawer编辑

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
refactor(ui): 清除原型外装饰增强(保留必要态口径)
Some checks are pending
CI / Backend (Go) (pull_request) Waiting to run
CI / Frontend (Tauri/TS) (pull_request) Waiting to run
3bd08320fe
- AnalyticsPage: 移除 storeRow/docRow 点击跳转报表中心(及 useNavigate)
- PatientProfilePage: 移除「合并档案」button + MergePatientModal 全部引用
- TimelineTab: 移除 onJump prop + EVENT_TAB + clickable 行点击/悬停行为
- DrugDictionaryPage: 移除「相互作用库」整个 InteractionsPanel + Tab 切换器
- Cargo.lock: 更新依赖锁定

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- 梳理 37 条功能回归差异(A装饰/B移出面板/C移出tab/D降级),标注 4 个🔴高风险孤儿能力(合并档案/相互作用库/知情同意/预约取消)
- 5 层测试规则(UT/IT/UI/EX/REG决议)+ 编号规范 + 数据准备 + 三阶段门禁
- 功能UI验收(17屏对照)/集成(12条含孤儿api验证)/单元(7组vitest)/异常(12条)案例
- 验收标准: 静态门禁→UI对照→集成回归→REG全决议→缺陷清零
- 补提交 P2 阶段 bigscreen/login/templates 审计文档

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- 新增 4 helper(publicView/drugDictionary/timeline/analytics)抽出 chairStatusMeta/
  maskName/parseQueueSyncActive/categoryBadge/usageSummary/styleFor/formatDate/wan
- 新增 4 测试文件,vitest 29 files / 221 tests 全绿(原 25 文件无回退)
- 修 Task#7 遗留 typecheck 回归: PatientProfilePage 删 TimelineTab onJump 传递 + 悬空 reloadPatient
- 修 LoginPage 既有 unused: getServerApiBase / SERVER_SOURCE_LABEL
- 门禁: npm run typecheck 0 error / vitest 221 passed / build:vite 6.4s 绿

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
docs(refactor): 4 个🔴高风险功能回归补回方案
Some checks are pending
CI / Backend (Go) (pull_request) Waiting to run
CI / Frontend (Tauri/TS) (pull_request) Waiting to run
3059114e08
- REG-B8 合并档案: 孤儿组件 MergePatientModal 完整, 方案A(编辑modal内入口)~0.5h, 建议立即补回
- REG-B6 预约取消/爽约/提醒: 后端 cancel/no_show/reminder API 全在, 块点击操作弹层 ~1.5h
- REG-B12 相互作用库: 3 API + 类型完整, InteractionsPanel git 可恢复, rowDrawer 详情段 ~1h
- REG-C2 知情同意: 评估修正——ConsentTab 本为空占位, 实际签署在接诊 STEP3/4, 无真实功能丢失, 改登记后端 consent 资源工单
- 原则: 补回业务能力但不破坏原型 1:1 主视觉; 每项独立 PR + UT/IT/UI 验收

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- 新建 MergePatientPanel.tsx: 自绘右侧抽屉,内联样式+原型令牌;候选列表自绘单选/
  合并预览冲突字段/原因必填/不可逆自绘二次确认;仅 antd App 取 message toast
- PatientProfilePage: 档案头加「合并档案」描边按钮(patient:merge门控+非merged),
  恢复 reloadPatient(loadSeqRef竞态防护)合并后刷新
- 接 getMergeCandidates/getMergePreview/mergePatient,弃用旧 MergePatientModal(不引用)
- REG-B8 补回

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- 新建 AppointmentActionPopover.tsx: 零antd自绘操作弹层(锚定块/Esc/点外部关闭);
  查看档案/取消预约(原因+二确认)/标记爽约/查看·取消提醒
- AppointmentCalendarPage: 块点击从直接navigate改为开弹层,主排期网格1:1视觉零改动
- 接 cancelAppointment/markNoShow(POST :id/no-show)/get·cancelAppointmentReminder
  (后端无 createReminder 端点,提醒仅查看/取消,已注明)
- REG-B6 补回

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
feat(drugs): 补回药品相互作用管理(药品详情抽屉自绘,契合rowDrawer)
Some checks are pending
CI / Backend (Go) (pull_request) Waiting to run
CI / Frontend (Tauri/TS) (pull_request) Waiting to run
e608a5b4f1
- 新建 DrugDetailDrawer.tsx: 零antd自绘右侧抽屉(自绘NativeSelect);药品基本信息+
  相互作用段(列表/新增表单/删除二确认),内联令牌与 DrugDictionaryPage 一致
- DrugDictionaryPage: 行点击开抽屉(操作列stopPropagation),5列主列表视觉不变
- drugDictionaryHelpers: 追加 severityBadge/SEVERITY_LABEL + 6 个 vitest(227 全绿)
- 接 list/create/deleteDrugInteraction,不复用旧 InteractionsPanel
- REG-B12 补回

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
fix(appointments): 修正预约操作权限契约与后端对齐(全量验收发现)
Some checks are pending
CI / Backend (Go) (pull_request) Waiting to run
CI / Frontend (Tauri/TS) (pull_request) Waiting to run
863748796d
前端门控宽于后端→显示无权按钮→点击必 403,与后端 routes.go 精确对齐:
- canCancel: (cancel||edit) → 仅 appointment:cancel
- canMarkNoShow: appointment:edit → appointment:no_show(后端真实权限码)
- 「取消提醒」按钮新增 appointment:edit 门控(后端 reminder/cancel 要求)
- typecheck 0/vitest 227/build 绿

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
fix(appointment): listAppointments date_to 含当天(集群全量验收发现)
Some checks are pending
CI / Backend (Go) (pull_request) Waiting to run
CI / Frontend (Tauri/TS) (pull_request) Waiting to run
631aa336a2
- 既有 bug: date_to 过滤 `scheduled_at <= $date_to`,postgres 把 '2026-06-24'
  解析为当天 00:00:00,`<=` 漏掉当天所有非零点预约
- 前端预约页单日视图传 date_from=date_to=同日,故当天上午预约永远查不到
- 改为 `scheduled_at < ($date_to::date + interval '1 day')` 含整天
- 实测(210集群): date_from=date_to=2026-06-24 修复前 total 0 → 修复后 total 8
- 非本次 B6 引入,Chrome 实机验证 B6 预约操作弹层时发现;已在 210 重 build 验证

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
docs(testing): 全量系统测试计划(多角色·并发·9机集群)
Some checks failed
CI / Frontend (Tauri/TS) (pull_request) Has been cancelled
CI / Backend (Go) (pull_request) Has been cancelled
557211a22a
供新会话执行: 监工 + 5 类角色子agent(功能/架构/安全/实用/体验)+并发(R6)在 9 机 HA 集群全量测试
- 环境(完整HA vs 最小栈)/批量数据(≥1000患者/5000预约)+测试图片生成(口内照/X光/CBCT)/造数避坑(GBK→Chrome JS fetch/时区/有效医生)
- 五维度用例矩阵: 全模块功能可用性 / HA主从切换+备份恢复+节点接入 / 越权+加密+审计+生产门控 / 端到端业务闭环 / UI体验
- 并发负载(乐观锁/幂等/SSE/并发上传/HA期间在途请求)
- 子agent零崩溃配方 + 监工编排 + 返工报告格式
- 仅排除外设(小票/A4打印/读卡器),其余全量

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Some checks failed
CI / Frontend (Tauri/TS) (pull_request) Has been cancelled
CI / Backend (Go) (pull_request) Has been cancelled
This pull request has changes conflicting with the target branch.
  • client/src/renderer/src/pages/admin/AccountsReceivablePage.tsx
  • client/src/renderer/src/pages/admin/CommissionPage.tsx
  • client/src/renderer/src/pages/admin/InvoicesPage.tsx
  • client/src/renderer/src/pages/login/LoginPage.tsx
  • client/src/renderer/src/pages/workbench/WorkbenchShell.tsx
  • client/src/renderer/src/pages/workbench/appointments/AppointmentCalendarPage.tsx
  • client/src/renderer/src/pages/workbench/billing/BillingPage.tsx
  • client/src/renderer/src/pages/workbench/patients/PatientProfilePage.tsx
  • client/src/renderer/src/pages/workbench/patients/tabs/PrescriptionsSection.tsx
  • client/src/renderer/src/pages/workbench/patients/tabs/RelationsTab.tsx
View command line instructions

Checkout

From your project repository, check out a new branch and test the changes.
git fetch -u origin claude/frosty-knuth-efd579:claude/frosty-knuth-efd579
git switch claude/frosty-knuth-efd579

Merge

Merge the changes and update on Forgejo.

Warning: The "Autodetect manual merge" setting is not enabled for this repository, you will have to mark this pull request as manually merged afterwards.

git switch main
git merge --no-ff claude/frosty-knuth-efd579
git switch claude/frosty-knuth-efd579
git rebase main
git switch main
git merge --ff-only claude/frosty-knuth-efd579
git switch claude/frosty-knuth-efd579
git rebase main
git switch main
git merge --no-ff claude/frosty-knuth-efd579
git switch main
git merge --squash claude/frosty-knuth-efd579
git switch main
git merge --ff-only claude/frosty-knuth-efd579
git switch main
git merge claude/frosty-knuth-efd579
git push origin main
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
redxin/DentalFlow!221
No description provided.