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 有排班 CRUD,MP 仅查看日历 |
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 完整 CMS,MP 仅文章列表 |
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 部分 |
发现清单(按严重程度排序)
CRITICAL(2 项)
| # |
发现 |
模块 |
来源 |
| 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 |
|
HIGH(3 项)
| # |
发现 |
模块 |
来源 |
| 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_service(949 行)0 处日志,运维排查困难 |
Phase 6 §3.1 |
|
MEDIUM(8 项)
| # |
发现 |
说明 |
来源 |
| 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 |
LOW(12 项)
| # |
发现 |
说明 |
来源 |
| 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 |
透析/知情同意小程序完全缺失 |
高风险(核心功能移动端空白) |
根因模式:
- 后端先行,前端跟进不足 — 后端功能完整度高(100% 调用链),但小程序覆盖仅 60%
- 角色分叉设计正确但执行不彻底 — 透析/知情同意应覆盖小程序医护端但未实现
- 数据模型差异 — 小程序 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 小时 |
审计产出文件索引