Files
hms/docs/audits/08-audit-report-2026-04-30.md
iven d712ad78c3 docs: 审计报告(8 份) + 讨论记录(4 份)
审计报告: 基线快照/功能清单/后端完整性/事件系统/参数配置/
差距模式/错误处理/测试覆盖/审计总结报告
讨论记录: 设备管线/端到端测试/三端审计/工作台重构
2026-05-03 19:32:15 +08:00

364 lines
16 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# HMS 功能审计报告
> 日期: 2026-04-30 | Git: `84fafb0` | 审计范围: 全系统(后端 + Web + 小程序)
## 执行摘要
| 维度 | 结果 |
|------|------|
| 总体完成度 | **83%** |
| CRITICAL 发现 | **2 项**(小程序晚间血压丢失、告警权限码拼写错误) |
| HIGH 发现 | **3 项**(透析/知情同意小程序缺失、前端日志严重不足) |
| MEDIUM 发现 | **8 项** |
| LOW 发现 | **12 项** |
| 后端健康度 | 优秀97.5% 测试通过100% 调用链连通) |
| 前端覆盖度 | 中等Web 管理端完善,小程序关键功能缺失) |
### 审计范围
- 328 个后端路由8 公开 + 320 受保护)
- 235 个 Web 前端 API 调用
- 76 个小程序 API 调用
- 38 个 Web 页面路由
- 40 个小程序页面
- 45 个数据库 Entity
- 25 个事件类型
- 772 个测试函数
---
## 功能域评分
### 评分方法
每个功能域按 10 项审计清单打分0-100%),加权求和:
| 检查项 | 权重 | 100% 标准 |
|--------|------|----------|
| 代码存在性 | 15% | Handler + Service + Entity 全部存在 |
| 调用链连通性 | 15% | Handler→Service→DB 完整连通 |
| 配置参数传递 | 5% | 所有配置字段被正确读取和使用 |
| 降级策略 | 5% | 外部依赖不可用时有优雅降级 |
| 错误处理 | 10% | 所有错误路径返回适当 HTTP 响应 |
| 性能 | 5% | 列表端点有分页,查询有索引 |
| 安全合规 | 15% | tenant_id 过滤 + 权限检查 + PII 保护 |
| 兼容性 | 5% | Web 和小程序 API 契约一致 |
| 日志完整性 | 10% | 关键操作有日志和审计记录 |
| UX 一致性 | 15% | 两端展示数据一致,交互逻辑统一 |
### 1. 患者管理: 93%
| 检查项 | 评分 | 说明 |
|--------|------|------|
| 代码存在性 | 100% | 17 handler + 完整 service + 6 entity |
| 调用链 | 100% | Handler→Service→Entity 全连通 |
| 配置参数 | 100% | PII 加密密钥正确使用 |
| 降级策略 | 90% | 加密失败有错误处理 |
| 错误处理 | 100% | 26 种领域错误完整映射 |
| 性能 | 90% | 分页查询 + HMAC 盲索引搜索 |
| 安全合规 | 100% | tenant_id + RLS + PII AES-256-GCM + HMAC |
| 兼容性 | 90% | Web/MP 基本对齐MP 无删除(预期) |
| 日志 | 95% | 12 处审计日志(含变更快照),运行时日志不足 |
| UX 一致性 | 70% | 健康摘要仅 MP家庭医生管理仅 Web |
### 2. 医生/排班: 88%
| 检查项 | 评分 | 说明 |
|--------|------|------|
| 代码存在性 | 100% | 5 handler + service + 2 entity |
| 调用链 | 100% | 全连通 |
| 配置参数 | 100% | 正确 |
| 降级策略 | 90% | 标准 |
| 错误处理 | 100% | 领域错误映射 |
| 性能 | 90% | 排班 CAS 并发控制 |
| 安全合规 | 100% | tenant_id + 权限检查 |
| 兼容性 | 60% | MP 仅只读列表,无管理操作 |
| 日志 | 90% | 3 处审计日志 |
| UX 一致性 | 60% | Web 有排班 CRUDMP 仅查看日历 |
### 3. 健康数据: 85%
| 检查项 | 评分 | 说明 |
|--------|------|------|
| 代码存在性 | 100% | 18 handler + service + 7 entity |
| 调用链 | 100% | 全连通 |
| 配置参数 | 100% | AES/HMAC 密钥正确使用 |
| 降级策略 | 90% | 加密失败安全处理 |
| 错误处理 | 100% | 完整错误映射 |
| 性能 | 85% | 分页 + 趋势缓存,但趋势生成可能慢 |
| 安全合规 | 100% | PII 加密 + 权限 + 危急值检测 |
| 兼容性 | 70% | MP 丢失晚间血压/体温/血氧字段 |
| 日志 | 80% | 10 处审计日志,运行时 tracing 不足 |
| UX 一致性 | 60% | 小程序 indicator_type 模型限制数据录入 |
### 4. 预约管理: 95%
| 检查项 | 评分 | 说明 |
|--------|------|------|
| 代码存在性 | 100% | 8 handler + 完整 CRUD |
| 调用链 | 100% | 全连通 |
| 配置参数 | 100% | 正确 |
| 降级策略 | 95% | CAS 原子操作保证 |
| 错误处理 | 100% | 排班满额/状态转换错误 |
| 性能 | 100% | CAS 并发控制 + 分页 |
| 安全合规 | 100% | tenant_id + 权限 |
| 兼容性 | 90% | Web/MP 基本对齐 |
| 日志 | 90% | 4 处审计 + 1 处 tracing |
| UX 一致性 | 85% | Web 排班管理MP 预约创建/查看 |
### 5. 随访管理: 88%
| 检查项 | 评分 | 说明 |
|--------|------|------|
| 代码存在性 | 100% | 10+5 handler + 模板管理 |
| 调用链 | 100% | 全连通 |
| 配置参数 | 100% | 正确 |
| 降级策略 | 90% | 事件驱动逾期检测 |
| 错误处理 | 100% | 完整 |
| 性能 | 90% | 批量操作支持 |
| 安全合规 | 100% | 权限检查 |
| 兼容性 | 80% | MP 仅列表+创建,无管理 |
| 日志 | 90% | 7 处审计 |
| UX 一致性 | 70% | Web 批量操作MP 基础功能 |
### 6. 咨询管理: 94%
| 检查项 | 评分 | 说明 |
|--------|------|------|
| 代码存在性 | 100% | 9 handler |
| 调用链 | 100% | 全连通 |
| 配置参数 | 100% | 正确 |
| 降级策略 | 95% | 消息持久化保证 |
| 错误处理 | 100% | 完整 |
| 性能 | 90% | 分页消息列表 |
| 安全合规 | 100% | 权限 + 数据隔离 |
| 兼容性 | 95% | Web/MP 高度对齐 |
| 日志 | 85% | 3 处审计 |
| UX 一致性 | 90% | Web 有导出MP 无(预期) |
### 7. 内容管理: 86%
| 检查项 | 评分 | 说明 |
|--------|------|------|
| 代码存在性 | 100% | 11+4+4 handler文章+分类+标签) |
| 调用链 | 100% | 全连通 |
| 配置参数 | 100% | 文件上传配置 |
| 降级策略 | 90% | 标准 |
| 错误处理 | 100% | 审核流程错误 |
| 性能 | 90% | 分页 |
| 安全合规 | 100% | 审核权限分离 |
| 兼容性 | 70% | MP 仅只读 published 文章 |
| 日志 | 90% | 7 处审计 |
| UX 一致性 | 65% | Web 完整 CMSMP 仅文章列表 |
### 8. 积分商城: 90%
| 检查项 | 评分 | 说明 |
|--------|------|------|
| 代码存在性 | 100% | 28 handler最复杂的 handler |
| 调用链 | 100% | 全连通 |
| 配置参数 | 100% | 正确 |
| 降级策略 | 90% | 幂等签到检查 |
| 错误处理 | 100% | 完整 |
| 性能 | 90% | 分页 + 统计缓存 |
| 安全合规 | 95% | 权限检查,但积分操作无事务日志 |
| 兼容性 | 90% | Web 管理端 + MP 患者端对齐 |
| 日志 | 85% | 12 处审计 |
| UX 一致性 | 85% | 角色分叉正常 |
### 9. 告警系统: 87%
| 检查项 | 评分 | 说明 |
|--------|------|------|
| 代码存在性 | 100% | 4+4+3+4 handler |
| 调用链 | 100% | 全连通 |
| 配置参数 | 100% | 正确 |
| 降级策略 | 90% | 事件驱动评估 |
| 错误处理 | 100% | 完整 |
| 性能 | 90% | 分页 |
| 安全合规 | 100% | 权限检查 |
| 兼容性 | 70% | MP 仅查看+处理,无规则管理 |
| 日志 | 85% | 审计日志 |
| UX 一致性 | 60% | ⚠️ 前端 `health.alert.manage` 拼写错误导致按钮不显示 |
### 10. AI 分析: 70%
| 检查项 | 评分 | 说明 |
|--------|------|------|
| 代码存在性 | 100% | 12 handler + 3 entity |
| 调用链 | 100% | 全连通 |
| 配置参数 | 40% | 6/8 AiConfig 字段未使用 |
| 降级策略 | 95% | SSE 不挂起Provider 不可用优雅终止 |
| 错误处理 | 100% | 预流/流中完整错误处理 |
| 性能 | 80% | SSE 流式返回,但无缓存层 |
| 安全合规 | 100% | 权限检查 + 输入消毒 |
| 兼容性 | 50% | SSE 端点无前端 UI 调用 |
| 日志 | 70% | 分析成功/失败有事件发布 |
| UX 一致性 | 30% | 仅历史查看有 UI分析触发无入口 |
### 11. 透析管理: 67%
| 检查项 | 评分 | 说明 |
|--------|------|------|
| 代码存在性 | 100% | 12 handler |
| 调用链 | 100% | 全连通 |
| 配置参数 | 100% | 正确 |
| 降级策略 | 90% | 标准 |
| 错误处理 | 100% | 完整 |
| 性能 | 90% | 分页 |
| 安全合规 | 100% | 5 个权限码 |
| 兼容性 | 0% | 小程序完全无入口 |
| 日志 | 90% | 审计 + 事件 |
| UX 一致性 | 0% | 小程序无透析功能 |
### 12. 统计仪表盘: 85%
| 检查项 | 评分 | 说明 |
|--------|------|------|
| 代码存在性 | 100% | 9 handler |
| 调用链 | 100% | 全连通 |
| 配置参数 | 100% | 正确 |
| 降级策略 | 85% | 统计查询失败返回 500 |
| 错误处理 | 90% | 标准 |
| 性能 | 80% | 聚合查询可能慢 |
| 安全合规 | 100% | 权限检查 |
| 兼容性 | 60% | MP 仅 3 个医护端统计 |
| 日志 | 80% | 标准 |
| UX 一致性 | 70% | Web 完整仪表盘MP 部分 |
---
## 发现清单(按严重程度排序)
### CRITICAL2 项)
| # | 发现 | 模块 | 来源 |
|---|------|------|------|
| C1 | **小程序晚间血压数据永久丢失**`inputVitalSign()``blood_pressure` 类型固定映射到 `*_morning` 字段,`systolic_bp_evening`/`diastolic_bp_evening` 从未写入。后端趋势服务和危急值检测支持晚间血压,但数据源缺失 | Phase 4 §4.3 | |
| C2 | **告警管理按钮永远不显示** — 前端 AlertList.tsx 使用 `health.alert.manage`(单数),后端声明 `health.alerts.manage`(复数),权限码不匹配导致 AuthButton 永远隐藏 | Phase 4 §3.4 | |
### HIGH3 项)
| # | 发现 | 模块 | 来源 |
|---|------|------|------|
| H1 | **透析管理小程序完全无入口** — 后端 12 个路由完整实现Web 有管理界面,但小程序 0 个 API 调用、0 个页面。透析患者无法在移动端查看记录和处方 | Phase 1 §2.11, Phase 5 §5.2 | |
| H2 | **知情同意小程序完全无入口** — 同上,后端完整但小程序无任何入口 | Phase 1 §2.12 | |
| H3 | **Health service 层运行时日志极缺** — 26 个 service 文件仅 11 处 tracing 日志patient_service949 行0 处日志,运维排查困难 | Phase 6 §3.1 | |
### MEDIUM8 项)
| # | 发现 | 说明 | 来源 |
|---|------|------|------|
| M1 | 56 个基础模块权限码未通过 PermissionDescriptor 声明 | auth/config/workflow/message/plugin 的权限通过种子数据手动注册 | Phase 4 §3.3 |
| M2 | 4 个 AI 分析 SSE 端点无前端 UI 调用 | 可能仅通过 API 工具直接测试 | Phase 5 §1 |
| M3 | 小程序丢失体温/血氧数据 | body_temperature/spo2 无 indicator_type | Phase 4 §4.3 |
| M4 | 前端 SSE 重连无指数退避 | 依赖浏览器原生 EventSource固定 3 秒间隔 | Phase 6 §2.4 |
| M5 | erp-ai 无集成测试 | SSE 流 + 外部 API 调用无法回归测试 | Phase 7 §3.1 |
| M6 | Web 前端测试仅 10 个 | 163 个文件仅 5 单元 + 5 E2E | Phase 7 §1.2 |
| M7 | 小程序完全无测试 | 40 个页面全靠手工验证 | Phase 7 §1.2 |
| M8 | 健康记录/诊断记录小程序无入口 | 患者移动端无法查看 | Phase 1 §2.2 |
### LOW12 项)
| # | 发现 | 说明 | 来源 |
|---|------|------|------|
| L1 | 14 个事件无业务消费者 | 通过 SSE 推送仍有价值,但无后端消费者 | Phase 3 §4.2 |
| L2 | AiConfig 6 字段声明未使用 | 预留全局默认值per-prompt 已覆盖 | Phase 4 §2.3 |
| L3 | device_readings.raw_data 无读取入口 | 数据溯源需要但无 UI | Phase 5 §4.2 |
| L4 | RefRow struct 从未构造 | 重构残留,编译器警告 | Phase 2 §1.2 |
| L5 | 2 处 unwrap() 中等风险 | PluginHost::db + 信号量 acquire | Phase 6 §1.6 |
| L6 | 审计日志 Fire-and-forget | 写入失败静默,无重试 | Phase 6 §3.2 |
| L7 | health.dialysis.stats 权限无前端引用 | 透析统计页面可能无按钮 | Phase 4 §3.2 |
| L8 | ai.provider.manage 声明但无 Handler | 预留提供商管理功能 | Phase 4 §3.2 |
| L9 | 咨询消息导出仅 Web | 小程序无导出功能(预期) | Phase 1 §2.5 |
| L10 | 趋势生成路由无前端调用 | 可能仅后台任务触发 | Phase 5 §1 |
| L11 | 9 个测试因 blind_indexes 表失败 | 环境配置问题,非代码缺陷 | Phase 0 |
| L12 | 40 个编译警告 | 多为未使用导入/变量 | Phase 0 |
---
## 差距模式分析
基于 Phase 5 的系统性检测,五种差距模式的发生频率和影响:
| 模式 | 发现数 | 最大影响 | 整体评估 |
|------|--------|---------|---------|
| 写了没接 | 5 | AI SSE 端点无 UI 入口 | 低风险(功能完整,缺触发入口) |
| 接了没传 | 6 | 晚间血压数据丢失 | 高风险(数据永久丢失) |
| 传了没存 | 0 | — | 无问题 |
| 存了没用 | 16 | 14 事件无消费者 + raw_data 无入口 | 低风险(审计追踪仍有价值) |
| 双系统不同步 | 9 | 透析/知情同意小程序完全缺失 | 高风险(核心功能移动端空白) |
**根因模式**
1. **后端先行,前端跟进不足** — 后端功能完整度高100% 调用链),但小程序覆盖仅 60%
2. **角色分叉设计正确但执行不彻底** — 透析/知情同意应覆盖小程序医护端但未实现
3. **数据模型差异** — 小程序 indicator_type 简化模型与后端完整字段不匹配
---
## 测试覆盖率总结
| 层级 | 测试数 | 通过率 | 评估 |
|------|--------|--------|------|
| Rust 单元测试 | 611 | 100% | 良好 |
| Rust 集成测试 | 153 | 94% | 良好 |
| Web 前端 | 10 | N/A | **极低** |
| 小程序 | 0 | N/A | **无测试** |
| **合计** | **772** | **97.5%** | |
关键缺口AI 模块无集成测试SSE + 外部 API小程序完全无测试。
---
## 建议与优先级排序
### P0 — 立即修复1-2 天)
| # | 建议 | 影响 | 工作量 |
|---|------|------|--------|
| C2 | 修复前端权限码拼写:`health.alert.manage``health.alerts.manage` | 告警管理按钮恢复可用 | 5 分钟 |
| C1-fix | 小程序新增 `blood_pressure_evening` indicator_type | 晚间血压数据可正常录入 | 2 小时 |
### P1 — 短期优化1-2 周)
| # | 建议 | 影响 | 工作量 |
|---|------|------|--------|
| H1 | 实现小程序透析模块(患者查看记录 + 医护端录入) | 透析患者移动端可用 | 1 周 |
| H2 | 实现小程序知情同意页面 | 患者可管理同意书 | 3 天 |
| H3 | 补充 health service 层 tracing 日志 | 运维可追踪关键操作 | 2 天 |
| M5 | 补充 erp-ai 集成测试 | AI SSE 流可回归测试 | 3 天 |
### P2 — 中期改进1-2 月)
| # | 建议 | 影响 | 工作量 |
|---|------|------|--------|
| M1 | 为 auth/config/workflow/message/plugin 模块补充 PermissionDescriptor 声明 | 权限码自动注册,一致性提升 | 1 周 |
| M3 | 小程序新增 body_temperature/spo2 indicator_type | 体温/血氧可录入 | 1 天 |
| M8 | 实现小程序健康记录/诊断记录查看页面 | 患者可查看完整健康档案 | 1 周 |
| M4/M6/M7 | 补充前端 SSE 指数退避 + 前端/小程序测试 | 系统健壮性提升 | 持续 |
### P3 — 长期规划
| # | 建议 | 影响 | 工作量 |
|---|------|------|--------|
| L1 | 为高价值事件添加消费者(如 consultation.opened 发送通知) | 事件驱动更完善 | 按需 |
| L2 | 清理或接入 AiConfig 未使用字段 | 配置一致性 | 1 天 |
| L5 | 替换 2 处中风险 unwrap() | 消除潜在 panic | 1 小时 |
| L11 | 修复 blind_indexes 迁移使 9 个测试通过 | 测试通过率 100% | 1 小时 |
---
## 审计产出文件索引
| Phase | 文件 | 内容 |
|-------|------|------|
| 0 | [00-baseline-snapshot.md](docs/audits/00-baseline-snapshot.md) | 基线快照 |
| 1 | [01-feature-inventory.md](docs/audits/01-feature-inventory.md) | 功能清单 + 三端映射矩阵 |
| 2 | [02-backend-integrity.md](docs/audits/02-backend-integrity.md) | 死代码 + 调用链 + trait 覆盖率 |
| 3 | [03-event-system.md](docs/audits/03-event-system.md) | 事件发布-消费矩阵 |
| 4 | [04-parameter-config.md](docs/audits/04-parameter-config.md) | DTO + 配置 + 权限码 + 数据映射 |
| 5 | [05-gap-patterns.md](docs/audits/05-gap-patterns.md) | 五种差距模式 |
| 6 | [06-error-handling.md](docs/audits/06-error-handling.md) | 错误处理 + 降级 + 日志 |
| 7 | [07-test-coverage.md](docs/audits/07-test-coverage.md) | 测试分布与缺口 |
| 8 | [08-audit-report-2026-04-30.md](docs/audits/08-audit-report-2026-04-30.md) | 最终评分报告(本文档) |