Files
zyt/artifacts/prescription-ai-visibility-desktop-implementation.md
T
2026-10-17 16:51:48 +08:00

5.4 KiB
Raw Blame History

处方 AI 一致度可见范围:桌面实现交接

日期:2026-10-17。范围仅 app/ 与本报告/离线截图;未修改 admin/、server/,未 commit、部署或调用生产接口。

完成行为

  • 新增 DoctorRepository / RemoteDoctorRepository.get_prescription_ai_capabilities(),GET tcm.prescriptionAi/capabilities。
  • 一致度只接受服务端明确的 agreement_visible is True。没有本地 root、角色 ID、*、管理策略能力的豁免;缺失字段、非布尔 true、能力请求失败均拒绝。
  • 列表把 AI 状态与第 12 列一致度分离:状态仍按现有权限及分析开关加载,能力查询不阻塞状态请求。分数另需 capability + statuses 顶层 flag + 每批次 flag;统计按钮另需原 statistics 权限。
  • 列表隐藏/重显、刷新都会重查能力;重新授权会重新取已完成批次的分数,避免从已清理的缓存展示空白。
  • 共用报告(包括诊单入口)要求 reports 顶层、历史批次、detail 均明确授权。一致度受限时仍保留报告正文、模型筛选、AI 候选原文、来源与资料缺口、处理进度、历史批次选择与分页、重新分析、重试和复核。
  • 受限时总览使用原有复核清单作为“报告复核”安全骨架,隐藏结论、组成归属、剂量图、风险剂量图及差异/共识计数。原“候选与逐味”导航改为“AI 候选处方”,跳到现有候选原文页;逐味页、比较原文和历史趋势不可导航进入。
  • 顶部保留模型状态、资料状态与失败重试行,只隐藏分数、重合度、差值和仪表刻度;因此没有丢失原来附着在仪表卡上的重试按钮。
  • 未授权数据进入缓存前清除 comparison、score、herb_score、比较状态/类型、算法版本及相关聚合元数据。撤权和读取失败同时清空旧数字、图表数据、比较 HTML、历史图/表、tooltip、accessibility 值和派生计数。
  • 请求 token / generation 拒绝旧异步响应恢复分数;主题重建保持能力状态和复核草稿。
  • 统计对话框直接构造也先请求 capability;未明确授权不发 statistics 请求。每次查询先清图,能力/统计失败、隐藏窗口、旧响应都会清理或拒绝旧结果。

修改文件

  • app/src/doctor_workstation/services/repository.py:能力接口协议及远程实现。
  • app/src/doctor_workstation/ui/pages/prescriptions.py:独立列/统计能力、列表缓存清理、异步 guard、受限入口文案。
  • app/src/doctor_workstation/ui/dialogs/issued_prescription_ai.py:共享数据清理、报告各入口统一切换、统计 capability 门禁。
  • app/src/doctor_workstation/ui/dialogs/issued_prescription_ai_console.py:仪表指标切换,同时保留状态与重试。
  • app/src/doctor_workstation/ui/dialogs/issued_prescription_ai_workspace.py:复核安全骨架;旧行先清文本、hide、detach、delete,防窗口瞬闪和残留轴控件。
  • app/tests/test_issued_prescription_ai.py:既有授权 fixture 明确 true;新增拒绝/缺失字段/非布尔 true、root 不豁免、撤权、失败、旧回调、主题、列表重显与统计直接入口回归。
  • app/scripts/render_issued_prescription_ai.py:原有授权预览 fixture 明确 true。
  • app/scripts/render_prescription_ai_visibility.py:可重复生成授权/受限离线截图。

变更行使用 LF,未改变的行按 HEAD 保留原始行尾 bytes,避免仓库原有混合换行导致整文件 diff。

验证

  1. 核心 AI 测试,249 项通过(独立进程):

    app/.venv/Scripts/python.exe -m pytest app/tests/test_issued_prescription_ai.py app/tests/test_issued_prescription_ai_workspace.py app/tests/test_issued_prescription_ai_pages.py app/tests/test_issued_prescription_ai_comparison.py -q --tb=short

  2. 外围权限与处方界面测试,32 项通过(独立进程):

    app/.venv/Scripts/python.exe -m pytest app/tests/test_permissions.py app/tests/test_prescription_security_ui.py app/tests/test_prescription_list_density.py app/tests/test_prescriptions_tech_blue.py -q --tb=short

  3. Ruff 对上述 8 个变更 Python 文件检查通过。

  4. git diff --check -- app 通过。

  5. 新截图脚本离线执行通过;已目视检查受限列表、正文、候选原文、复核/重试和统计拒绝截图。

联合运行这 281 项时,核心及前面外围测试共 272 项无失败后,最后一组 ShellWindow 交互测试出现 Qt 同进程状态阻塞,已中断该联合进程;同一外围组单独执行通过。先前定位到的两个真实回归(旧控件瞬闪、旧轴残留)均已修复,相关定向测试通过。本交接采用上述两个独立进程验证结果,不宣称联合进程完整通过。

截图

目录:artifacts/prescription-ai-visibility/。全部为内存演示数据,无生产读取。

  • list-authorized.png / list-restricted.png
  • report-authorized.png / report-restricted.png
  • review-restricted.png:复核清单、表单、保存与模型重试仍可用。
  • candidate-restricted.png:候选原文可读,无贡献/一致度。
  • statistics-restricted.png:直接统计入口拒绝,空图表且未请求统计。

服务端仍需按既定策略在 read API 屏蔽结构化比较,并在 statistics 强制校验;桌面不会从角色或登录快照重建授权。授权策略变更在下一次能力/状态/报告读取时更新显示,当前没有新增服务端推送通道。