364 lines
16 KiB
Markdown
364 lines
16 KiB
Markdown
# 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 | 透析/知情同意小程序完全缺失 | 高风险(核心功能移动端空白) |
|
||
|
||
**根因模式**:
|
||
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) | 最终评分报告(本文档) |
|