18 KiB
18 KiB
诊疗工作台第三次、最终只读视觉同型审计
审计日期:2026-08-10
审计性质:最终只读终验;除更新本报告外,未修改任何业务代码、测试、renderer 或 PNG。
事实源:当前 Python 源码、D:/web/zyt/admin/src/views/tcm/diagnosis/ 下 Vue 基准、三份既有视觉规格,以及 artifacts/diagnosis_visual/ 当前 43 张 PNG。
判定方法:43 张 PNG 均按原始尺寸逐张目检;源码只用于解释可见结果与确认真实能力。测试通过数不作为任何视觉结论的依据,本轮也未以测试替代目检。
最终结论
PARTIAL,不是 PASS。
- P0:0 OPEN。语义表单、1024 栅格、右固定列、双尺寸 60% 抽屉、固定 footer、核心 loading/empty/error/focus/permission 状态均未回退。
- 上一版 12 项 P1:8 项 CLOSED / EXACT,4 项仍 OPEN / PARTIAL。
- 43 张当前 PNG:36 张 EXACT(其中两张 edit 仅指入镜区域)、7 张 PARTIAL、0 张乱码或不可读。
- 列表、详情、预约与 Shell 的所有 loading 图均为真实圆弧 spinner;没有字符型 spinner、方框箭头、中文乱码或缺字。
- 当前不能判 PASS 的原因是:1024 Daily 动作行裁切及按钮语义态被压平;完整菜单仍缺 Vue 图标、danger 删除色和精确文案;备注附件视觉仍未命中预期样式;处方/订单/视频/聊天仍有可见简化或缺少关键截图证据。
- “既有笔记整条正文覆盖 / 删除整条笔记”另列为服务端合同限制,不计作伪造桌面能力,也不用于掩盖上述视觉 P1。
上一版 12 项 OPEN 逐项终验
| # | 上一版问题 | 状态 | 同型分类 | 最新精确证据与目检结论 |
|---|---|---|---|---|
| 1 | 统计端就诊卡仍非 switch | CLOSED | EXACT(组件) | 当前已使用自绘二态 DiagnosisSwitch,44×24 轨道、圆形滑块、0/1 文本合同:src/doctor_workstation/ui/diagnosis_drawer.py:643-675;表单 show_card 分支:src/doctor_workstation/ui/dialogs/diagnosis.py:924-925;Vue 基准:D:/web/zyt/admin/src/views/tcm/diagnosis/edit.vue:341-348。现有 edit PNG 没有滚到该字段,因此本项是源码级确定结论,不引用测试,也不声称有单独的 switch 截图。 |
| 2 | Daily 编辑动作不完整 | OPEN | PARTIAL | + 血糖 / + 饮食 / + 运动 / + 备注、刷新、新增待办和精确可取消动作均已接入:src/doctor_workstation/ui/diagnosis_drawer.py:1431-1450、:1486-1512、:1764-1784;真实处理:src/doctor_workstation/ui/dialogs/diagnosis.py:2175-2356。可是 diagnosis_state_daily_1024x640.png 中最右“刷新”被抽屉右缘裁掉;原因是单个 QHBoxLayout 不换行(diagnosis_drawer.py:1398-1451),而 Vue 明确 flex-wrap(D:/web/zyt/admin/src/views/tcm/diagnosis/components/DailyMatrix.vue:1094-1109)。同时“最近7天”的 checked 态、+血糖 与新增待办的 primary 态均被 scoped 基础按钮规则压平;Vue 的主动作在 DailyMatrix.vue:25-35、DiagnosisTodoList.vue:3-19。 |
| 3 | “更多”菜单动作被关闭 | OPEN | PARTIAL | 能力缺口已补齐:权限/真实方法策略在 src/doctor_workstation/ui/pages/consultations.py:1002-1031,handler 在 :1672-1692;diagnosis_full_menu_1280x800.png 已出现指派、取消指派、视频二维码、确认二维码、取消挂号、挂号日志、创建订单、删除。仍不同型:Python 只创建纯文字 QAction(src/doctor_workstation/ui/diagnosis_index_widgets.py:1381-1431),Vue 每项有图标,删除为 divided + danger 红,并使用“二维码”而不是“确认二维码”(D:/web/zyt/admin/src/views/tcm/diagnosis/index.vue:379-400)。QMenu 白底、边框、hover 与分隔线样式已生效(diagnosis_index_widgets.py:1371-1380),但未覆盖这些剩余语义。 |
| 4 | Tab 溢出仍用左右箭头 | CLOSED | EXACT | 原生左右工具按钮宽度归零,额外 4 px 横向滚动条可见并驱动选中 Tab:src/doctor_workstation/ui/diagnosis_drawer.py:194-242、:749-792;Vue 基准:D:/web/zyt/admin/src/views/tcm/diagnosis/edit.vue:1798-1828。所有 1024 详情状态图均无盒状左右箭头,蓝色细滚动条连续可见。 |
| 5 | footer 缺上投影 | CLOSED | EXACT | footer 使用 blur 18、offset 0/-4、半透明深色 QGraphicsDropShadowEffect:src/doctor_workstation/ui/dialogs/diagnosis.py:784-803;Vue 为 0 -4px 24px / 7%:D:/web/zyt/admin/src/views/tcm/diagnosis/edit.vue:1792-1796。edit/viewOnly/daily/save 状态图均可见 footer 上缘阴影,且 footer 始终在滚动体外。 |
| 6 | 保存中无按钮 spinner / 结果态 | CLOSED | EXACT | SaveStateButton 以 QTimer + QPainter 画 loading 圆弧、成功勾和失败叉:src/doctor_workstation/ui/diagnosis_drawer.py:678-746;只在 editable/basic 显示:src/doctor_workstation/ui/dialogs/diagnosis.py:1652-1661;真实保存状态切换::3044-3163。diagnosis_state_save_loading/success/failure_1024x640.png 分别完整显示“正在保存 / 保存成功 / 保存失败”,无缺字。 |
| 7 | readonly 摘要拆“客服” | CLOSED | EXACT | 摘要值禁止换行并使用 MinimumExpanding:src/doctor_workstation/ui/dialogs/diagnosis.py:681-712;“客服:…”赋值::1767-1770。diagnosis_readonly_1024x640.png 与 diagnosis_readonly_1440x900.png 均完整显示“客服:赵医助”,不再拆字。 |
| 8 | Notes 缺新增、上传、删除动作 | OPEN | PARTIAL | 动作和真实端点已存在:NotesTimeline 信号/工具栏/单附件删除在 src/doctor_workstation/ui/diagnosis_drawer.py:1804-1962;处理在 src/doctor_workstation/ui/dialogs/diagnosis.py:2376-2478;远端合同在 src/doctor_workstation/services/repository.py:935-985。diagnosis_state_notes_actions_1024x640.png 已显示新增/追加、上传舌象、上传报告、打开与单附件删除。但视觉仍不同型:QSS 写的是 QLabel#DiagnosisTongueThumb 与 QLabel#DiagnosisAttachmentChip(diagnosis_drawer.py:486-500),运行时却创建 QPushButton(:1897-1900、:1932-1937),所以截图中的“舌象/查看”和报告附件退化为普通白按钮,而非 Vue 的真实缩略图、文件 chip 与叠加 CircleClose(D:/web/zyt/admin/src/views/patient/reception/components/NoteTimeline.vue:42-100)。 |
| 9 | 处方、订单、视频、聊天仍为简化实现 | OPEN | PARTIAL / MISSING | 处方已接完整 PrescriptionEditorDialog 和真实 create_prescription(src/doctor_workstation/ui/dialogs/diagnosis.py:2489-2539),订单偏移及详情入口已接真实方法(:2613-2650、:2883-2941),视频上传/回放和聊天归档同步也已接真实方法(:2541-2611、:2844-2881)。但视觉仍未闭合:处方按钮在 diagnosis_state_empty_1024x640.png 中为普通白色“开具处方”,而 Vue 是 primary 小号“开方”(D:/web/zyt/admin/src/views/tcm/diagnosis/components/CaseRecordList.vue:1-5);当前证据集没有处方编辑器或订单详情抽屉 PNG。diagnosis_state_video_replay_1024x640.png 只有外链“播放回放”,代码通过 QDesktopServices 打开 HTTP(S)(diagnosis.py:2652-2658、:2874-2881),而 Vue 是表格内 RecordingPlaybackBlock(D:/web/zyt/admin/src/views/tcm/diagnosis/components/CallRecordPanel.vue:17-34)。diagnosis_state_chat_archive_1024x640.png 有气泡、文件和同步/重载,但省略 Vue 的完整 info alert 和详细归档说明(D:/web/zyt/admin/src/views/tcm/diagnosis/components/ImChatRecordPanel.vue:1-20)。订单偏移可见部分本身为 EXACT。 |
| 10 | 表格状态仍整格着色而非 pill | CLOSED | EXACT | set_status_tag 以 QLabel pill 放入 cell widget,不再染整格:src/doctor_workstation/ui/diagnosis_drawer.py:2366-2384;所有状态列经 semanticize 转换:src/doctor_workstation/ui/dialogs/diagnosis.py:1900-1921、:2752-2754、:2822-2825、:2870-2874、:2898-2902。diagnosis_state_daily_lower_1024x640.png 的“待执行”蓝色 pill 是直接视觉证据。 |
| 11 | Shell 仍为 216/68 且无 40 px tabs | CLOSED | EXACT | 侧栏 183:src/doctor_workstation/ui/shell.py:537-540;topbar 50::599-603;multiple-tabs 40::683-687。diagnosis_shell_1024x640.png 与 diagnosis_shell_1440x900.png 均可直接量出 183/50/40 三段,比例一致。 |
| 12 | Shell 颜色偏离且箭头缺字 | CLOSED | EXACT(本项范围) | 侧栏为 #1D2124:src/doctor_workstation/ui/shell.py:541-569;方向、刷新、全屏、下拉、关闭图形均由 QPainter 自绘,不依赖字体 glyph::257-395;topbar/tab QMenu 样式::599-628、:683-723。两张最新 Shell PNG 中“更多筛选”、行“更多”、用户菜单和 tabs 菜单箭头均正常,没有方框或乱码。 |
最后增加的三个专项检查
| 专项 | 状态 | 结论 |
|---|---|---|
| scoped panel 按钮 | OPEN / PARTIAL | src/doctor_workstation/ui/diagnosis_drawer.py:112-136 的 QDialog#DiagnosisDialogRoot QPushButton 规则确实把详情按钮从全局暖灰绿主题隔离出来;但它的 ID 选择器优先级高于全局 QPushButton[variant="primary/ghost"](src/doctor_workstation/ui/theme.py:87-118),而局部 QSS 没有补 primary、ghost、dangerGhost、diagnosisRange:checked 规则。结果在 daily/处方/视频/待办 PNG 中所有动作都被压成同一白色按钮,选中态也不清楚。这是实图结果,不是测试推断。 |
| QMenu | OPEN / PARTIAL | diagnosis_full_menu_1280x800.png 证明局部白底、细边框、32 px 左右行高、分隔线和菜单宽度已生效;但与 Vue 相比仍缺每项图标、danger 删除色,且“确认二维码”文案不精确。证据:src/doctor_workstation/ui/diagnosis_index_widgets.py:1371-1431 对照 D:/web/zyt/admin/src/views/tcm/diagnosis/index.vue:379-400、:2706-2708。 |
| 紧凑 close | CLOSED / EXACT | Header close 被限定 32×32、透明常态、蓝色 hover/focus:src/doctor_workstation/ui/diagnosis_drawer.py:137-154;创建位置:src/doctor_workstation/ui/dialogs/diagnosis.py:754-782。diagnosis_state_focus_1024x640.png 显示紧凑透明常态,默认 edit/viewOnly 图显示蓝色 focus/hover 外观,没有被全局 40 px footer 按钮规则放大。 |
43 张 PNG 原尺寸目检矩阵
下表的 EXACT 只针对该张 PNG 实际入镜内容;不以不可见的滚动下方内容作证明。
| PNG | 分类 | 原尺寸目检结论 |
|---|---|---|
| diagnosis_1024x640.png | EXACT | 窄屏筛选换行、表格内部横向溢出、右固定列和阴影稳定,无硬裁切。 |
| diagnosis_1440x900.png | EXACT | 宽屏列密度、复合挂号卡、斑马/业务语义色和固定操作区成立。 |
| diagnosis_advanced_filters_1280x800.png | EXACT | 高级筛选即时展开,日期范围、控件顺序和重置入口完整。 |
| diagnosis_double_appointment_cancel_1280x800.png | EXACT | 同一诊单两条预约均有各自取消入口,虚线层级和固定列正常。 |
| diagnosis_empty_1280x800.png | EXACT | 表头、内部空态、横向滚动和 0 条分页均保留。 |
| diagnosis_error_1280x800.png | EXACT | 错误文本居中可读,无旧数据穿透。 |
| diagnosis_focus_1280x800.png | EXACT | 搜索框蓝色 focus ring 清楚且不挤压布局。 |
| diagnosis_full_menu_1280x800.png | PARTIAL | 8 项动作与分隔线齐全;缺 Vue 图标、danger 删除色,二维码文案不同。 |
| diagnosis_horizontal_scroll_1024x640.png | EXACT | 主表横移、右 460 px 固定区不动,左缘阴影连续。 |
| diagnosis_hover_warning_1280x800.png | EXACT | warning 行 hover 渐变、3 px 左条和固定区同步。 |
| diagnosis_loading_1280x800.png | EXACT | 表内真实圆弧 spinner,内容淡化,无字符缺字。 |
| diagnosis_pending_assign_1280x800.png | EXACT | 待分配 chip、月份与宽搜索保持同一流式区。 |
| diagnosis_permissions_cropped_1280x800.png | EXACT | 权限裁掉 toolbar 与敏感动作,仅保留查看。 |
| diagnosis_edit_1024x640.png | EXACT(可见区) | 60% 抽屉、2/3 列语义表单、细 tab 条、固定 footer 无裁切;switch 未入镜。 |
| diagnosis_edit_1440x900.png | EXACT(可见区) | 宽屏密度、字段比例和 footer 稳定;switch 未入镜。 |
| diagnosis_readonly_1024x640.png | EXACT | 独立只读页、hero、病例卡完整,“客服”不拆字。 |
| diagnosis_readonly_1440x900.png | EXACT | 4 列病例密度和异常指标层级完整,无不必要换行。 |
| diagnosis_viewonly_1024x640.png | EXACT | 60% 只读抽屉、权限提示、禁用表单与仅关闭 footer 成立。 |
| diagnosis_viewonly_1440x900.png | EXACT | 宽屏只读栅格、全 Tab 条和固定 footer 成立。 |
| diagnosis_state_daily_1024x640.png | PARTIAL | DailyMatrix、异常/自录内容和新增动作出现;最右“刷新”被裁,range/primary 语义态被压平。 |
| diagnosis_state_daily_lower_1024x640.png | PARTIAL | 趋势、待办筛选、表格与 pill 出现;“新增待办”不是 Vue primary,toolbar 语义层级不足。 |
| diagnosis_state_empty_1024x640.png | PARTIAL | 处方空态和仅取消 footer 正确;“开具处方”按钮文案/primary 样式不同,且未覆盖真实处方编辑器。 |
| diagnosis_state_error_1024x640.png | EXACT | danger banner、重试、空表单、禁用保存完整。 |
| diagnosis_state_focus_1024x640.png | EXACT | 姓名 focus ring、紧凑 close 常态和固定 footer 清晰。 |
| diagnosis_state_loading_1024x640.png | EXACT | 圆弧 spinner 与“正在加载诊单...”完整,无旧 seed 或缺字。 |
| diagnosis_state_permission_1024x640.png | EXACT | 只保留病历/医生备注,手机号与身份证掩码,footer 仅关闭。 |
| diagnosis_state_notes_actions_1024x640.png | PARTIAL | 增加/上传/打开/单附件删除均出现;舌象与报告未呈现为 Vue 缩略图/chip。 |
| diagnosis_state_order_offset_1024x640.png | EXACT(可见区) | 偏移数值框、保存、订单表、分页与横向滚动完整;订单详情未入镜。 |
| diagnosis_state_save_failure_1024x640.png | EXACT | 红色叉与“保存失败”完整。 |
| diagnosis_state_save_loading_1024x640.png | EXACT | 白色圆弧 spinner 与“正在保存”完整。 |
| diagnosis_state_save_success_1024x640.png | EXACT | 绿色勾与“保存成功”完整。 |
| diagnosis_state_video_replay_1024x640.png | PARTIAL | 回放动作可见且文案完整;仍是外链按钮,不是 Vue 表内播放器。 |
| diagnosis_state_chat_archive_1024x640.png | PARTIAL | 左右气泡、图片/文件入口、同步/重载可见;完整 info alert 与原文案缺失。 |
| diagnosis_shell_1024x640.png | EXACT(本项范围) | 183/50/40,深色侧栏、分页、三角箭头和中文均无缺字。 |
| diagnosis_shell_1440x900.png | EXACT(本项范围) | 同一 Shell 比例在宽屏保持,固定列阴影和 horizontal scroll 清楚。 |
| appointment_drawer_1024x640.png | EXACT | 60% 右抽屉、日期/时段、body 滚动与固定 footer 无裁切。 |
| appointment_drawer_1440x900.png | EXACT | 医生 radio、四个 130×40 日期按钮、时段网格、备注与 footer 对齐。 |
| appointment_drawer_empty_doctors_1440x900.png | EXACT | warning、80 px 空态插图、“暂无可预约医生”和禁用确认完整。 |
| appointment_drawer_empty_roster_1440x900.png | EXACT | 无排班 warning、空态插图和“该医生暂无排班”可读。 |
| appointment_drawer_error_1440x900.png | EXACT | “号源加载失败:号源服务暂时不可用”、刷新入口与空态并存。 |
| appointment_drawer_keyboard_focus_1440x900.png | EXACT | 130×40 日期按钮的蓝色键盘 focus 边界清楚。 |
| appointment_drawer_loading_1440x900.png | EXACT | “正在加载医生、渠道与挂号状态...”与真实圆弧 spinner 完整,无缺字。 |
| appointment_drawer_refreshing_1440x900.png | EXACT | “正在刷新可用号源...”与 overlay spinner 完整,确认禁用。 |
服务端合同限制:不归入视觉 P1
当前服务端只提供“当日追加 / 查询 / 删除单个附件”,没有“任意覆盖既有正文”或“删除整条笔记”端点:
- D:/web/zyt/server/app/adminapi/controller/doctor/AppointmentController.php:168-196 只公开 addDoctorNote、doctorNotes、deleteDoctorNoteImage。
- D:/web/zyt/server/app/adminapi/logic/doctor/DoctorNoteLogic.php:14-69 按 diagnosis_id + 当天 find-or-create,并把新正文追加为新行,不是任意覆盖。
- D:/web/zyt/server/app/adminapi/logic/doctor/DoctorNoteLogic.php:114-136 只删除 tongue_images / report_files 中的单个路径。
- D:/web/zyt/admin/src/api/patient.ts:19-40 同样只有上述三个客户端 API。
- Python 远端仓库与该合同一致:src/doctor_workstation/services/repository.py:935-985。
因此桌面端没有伪造“覆盖旧正文 / 删除整条笔记”按钮是正确的 fail-closed 行为。该限制不能被当作视觉 PASS 的理由,也不应混入上面 4 个仍可修的 UI P1。
最终判定
- P0:0 OPEN。
- P1:4 OPEN / PARTIAL:Daily 动作行与 scoped 按钮语义;完整菜单图标/删除色/文案;Notes 附件视觉;处方/订单/视频/聊天视觉与证据覆盖。
- MISSING 视觉证据:当前 diagnosis_visual 没有滚动到 switch 的截图,也没有完整处方编辑器和订单详情抽屉截图;源码能力存在,但不能用测试代替这些像素证据。
- 乱码 / 缺字:0。 43 张图中的中文、圆弧 loading、箭头、保存勾叉均完整。
- 最终:PARTIAL。 只有消除上述 4 组可见差异并补齐处方编辑器、订单详情与 switch 的当前截图后,才可给视觉同型 PASS。