Files
hms/docs/audits/v2/12-expert-review.md
iven df1d85bfde docs: T40 UI 审计报告 + wiki 更新 + Docker 配置
- T40 UI 审计计划和结果文档(docs/qa/)
- wiki 更新:miniprogram 设计系统合规审计记录 + index 关键数字更新
- 审计 V2 完整报告(docs/audits/v2/)
- 讨论记录文档(docs/discussions/)
- 设计规格和实施计划(docs/superpowers/)
- 角色测试计划和结果(docs/qa/role-test-*)
- Docker 生产部署配置
2026-05-13 23:29:42 +08:00

330 lines
13 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.
# V2 审计 — 多角色专家评审
> 日期: 2026-05-04 | 方法: 5 角色专家审视,按 10 维度评分
## 一、评审概述
本报告由 5 个专家角色分别审视 HMS 系统的 20 个功能域,按统一评分框架打分。每个角色关注不同维度,最终汇总为系统级评价。
### 评审角色
| 角色 | 关注维度 | 权重 |
|------|---------|------|
| 产品经理 | D1 目标 + D3 连通 + D10 UX | 25% |
| 技术架构师 | D2 代码 + D4 数据流 + D8 性能 | 25% |
| 安全专家 | D5 安全 + D6 错误处理 | 20% |
| DevOps 工程师 | D7 日志 + D8 性能 + D9 测试 | 15% |
| 医疗领域专家 | D1 目标 + D4 数据流 + D10 UX | 15% |
### 评分方法
- 每个角色对每个功能域给出 0-100 分
- 系统总分 = 各角色加权平均
- 评级: A(90+) / B(80-89) / C(70-79) / D(60-69) / F(<60)
---
## 二、系统级总评
| 角色 | 评分 | 评级 |
|------|------|------|
| 产品经理 | 78 | C |
| 技术架构师 | 70 | C |
| 安全专家 | 65 | D |
| DevOps 工程师 | 68 | D |
| 医疗领域专家 | 75 | C |
| **加权总分** | **72** | **C** |
> V1 审计未做专家评审无法对比。72 分反映"后端完整但前端未接入、安全有漏洞、测试覆盖不足"的现状。
---
## 三、产品经理评审78/C
### 3.1 功能完整性 vs 客户需求
**已交付的核心价值链**(覆盖血透中心主要工作流):
- 透析治疗全流程预约→透析记录→KDIGO 风险评估(后端完整,前端部分接入)
- 健康监测闭环体征录入→阈值告警→SSE 推送→行动收件箱
- 患者触达:小程序体征录入/查看/咨询/随访完成
- AI 辅助决策:趋势分析 SSE + 建议系统(后端完整)
**未交付的关键体验**
- 护理计划/班次/BLE 网关/家庭代理 — 4 个模块 34 条路由完全无 UI无法交付给客户
- AI 前后对比功能 — 关怀闭环的核心价值,目前仅日志
- MP 适老化不足 — 15 处字号低于 22px 阈值,老年患者体验差
### 3.2 MVP 边界评估
| 功能 | MVP 必须 | 当前状态 | 缺口 |
|------|---------|---------|------|
| 透析全流程 | 是 | 85% | 风险评分未自动串联 |
| 健康监测 | 是 | 90% | 危急值阈值管理页缺失 |
| 告警推送 | 是 | 80% | 双路径可能重复 |
| 护理计划 | 否P1 | 50%(仅后端) | 全部前端 |
| 家庭代理 | 否P2 | 50%(仅后端) | 全部前端 |
| AI 报告 | 是 | 70% | 前后对比缺失 |
### 3.3 按域评分
| 域 | 分数 | 说明 |
|----|------|------|
| F1-F6 核心医疗 | 85 | 目标清晰,三端覆盖较好 |
| F7-F8 内容/积分 | 75 | 非核心但完善 |
| F9 告警 | 80 | 功能完整UX 可优化 |
| F10 AI | 70 | 后端强,前端弱,对比缺失 |
| F11 透析 | 88 | MP 100% 覆盖,流程顺畅 |
| F12 仪表盘 | 75 | 统计维度够但展示偏简 |
| F13 行动收件箱 | 78 | SQL 注入风险影响交付 |
| F14-F17 孤立模块 | 30 | 后端完整但无法交付 |
| F18-F19 FHIR/OAuth | 55 | 基础设施,非 MVP 必需 |
| F20 日聚合 | 72 | 数据层完整,展示层不足 |
---
## 四、技术架构师评审70/C
### 4.1 架构优势
1. **模块边界清晰** — 18 crate 严格通过 EventBus + trait 通信,无跨 crate 直接依赖
2. **SeaORM Entity 统一标准** — 所有实体含 tenant_id/version/软删除/审计字段
3. **事件驱动** — 51 个事件类型outbox 模式保证可靠投递
4. **PII 加密完备** — AES-256-GCM + HMAC 盲索引,覆盖所有敏感字段
5. **服务拆分合理** — health_data_service 拆为 vital_signs/alert/daily_monitoring 等子模块
### 4.2 架构风险
| 风险 | 严重度 | 说明 |
|------|--------|------|
| SQL 注入 | **CRITICAL** | action_inbox_service.rs:272-306 format! 拼接 |
| BLE 双写无事务 | **HIGH** | vital_signs 与 device_readings 可能不一致 |
| 护理计划无事务 | **HIGH** | 三表写入无包裹,中间失败致孤立记录 |
| SSE unbounded | MEDIUM | 告警风暴时内存压力 |
| 串行处理多患者 | MEDIUM | BLE 网关 for 循环,延迟线性增长 |
| 护理计划状态无枚举 | LOW | 自由字符串可写入非法状态 |
### 4.3 微服务拆分准备度
| 维度 | 准备度 | 说明 |
|------|--------|------|
| 模块独立性 | 90% | EventBus 解耦良好 |
| 数据库拆分 | 70% | 共享 PostgreSQL需 schema 分离 |
| 认证独立 | 85% | JWT + middleware 已解耦 |
| API 网关 | 40% | 无统一网关层 |
| 服务发现 | 0% | 单体架构,未规划 |
### 4.4 按域评分
| 域 | 分数 | 说明 |
|----|------|------|
| F1-F6 核心医疗 | 78 | 代码结构好,数据流有缺口 |
| F9 告警 | 72 | 双路径复杂度高 |
| F10 AI | 68 | 缓存未启用,前后对比缺失 |
| F13 行动收件箱 | 55 | SQL 注入拉低 |
| F14-F17 孤立模块 | 40 | 代码存在但架构断裂 |
| F18 FHIR | 50 | allowed_patient_ids 越权 |
| F19 OAuth | 45 | 权限缺失 + JWT fallback |
---
## 五、安全专家评审65/D
### 5.1 安全合规状态
| 检查项 | 状态 | 说明 |
|--------|------|------|
| SQL 注入防护 | **FAIL** | action_inbox_service.rs format! 拼接 patient_id/user_id |
| PII 加密 | **PASS** | AES-256-GCM8 个实体全覆盖 |
| 多租户隔离 | **PASS** | 应用层 tenant_id + PostgreSQL RLS |
| 权限码完整性 | **WARN** | 53 个 Descriptor 声明OAuth 5 端点缺失 |
| API Key 安全 | **PASS** | SHA-256 哈希 + OsRng 随机生成 |
| XSS 防护 | **PASS** | 未发现 dangerouslySetInnerHTML |
| SSE 认证 | **PASS** | JWT query param + tenant_id 验证 |
| JWT Secret | **WARN** | 硬编码 fallback "dev-secret-key" |
| FHIR 越权 | **FAIL** | allowed_patient_ids 未在查询层执行 |
| 速率限制 | **WARN** | 已建模未执行 |
### 5.2 合规风险评估
**《个人信息保护法》合规**:
- PII 加密: 合规AES-256-GCM
- 数据最小化: 基本合规(脱敏查看支持)
- 第三方数据共享: 风险FHIR allowed_patient_ids 未强制执行)
- 审计日志: 合规140+ 处审计记录)
**《健康医疗数据安全指南》合规**:
- 数据分类分级: 部分合规(加密字段覆盖全,但分类标签缺失)
- 数据出境: 不适用(私有部署)
- 应急响应: 不合规(无安全事件自动告警机制)
### 5.3 按域评分
| 域 | 分数 | 关键问题 |
|----|------|---------|
| F13 行动收件箱 | 40 | SQL 注入SEC-01 |
| F18 FHIR | 50 | allowed_patient_ids 越权SEC-03 |
| F19 OAuth | 45 | 权限缺失SEC-02+ JWT fallbackSEC-04 |
| F1-F6 核心医疗 | 85 | 权限+PII 完善 |
| F9 告警 | 75 | SSE 认证 OK无特殊风险 |
| F16 BLE 网关 | 70 | API Key 安全 OKHTTPS 需反向代理 |
---
## 六、DevOps 工程师评审68/D
### 6.1 可观测性评估
| 维度 | 状态 | 说明 |
|------|------|------|
| tracing 覆盖 | **70%** | 17 个 service 文件 116 处 tracing4/6 新增 service 零覆盖 |
| 审计日志 | **85%** | 140+ 处,覆盖所有关键操作 |
| 错误监控 | **60%** | AppError 统一响应但无外部告警Sentry/Datadog |
| 性能指标 | **30%** | 无 Prometheus/Grafana 集成 |
| 分布式追踪 | **0%** | 无 OpenTelemetry |
### 6.2 部署复杂度
| 组件 | 复杂度 | 说明 |
|------|--------|------|
| 后端服务 | 中 | 单 Axum 进程cargo run 即可 |
| 数据库 | 低 | PostgreSQL + SeaORM 自动迁移 |
| 前端 Web | 低 | Vite SPApnpm build |
| 小程序 | 中 | Taro 编译 + 微信审核 |
| 插件系统 | 高 | WASM 编译 + 热加载 |
| 基础设施 | 中 | Docker Compose 一键启动 |
### 6.3 测试覆盖评估
| 层 | 覆盖率 | 说明 |
|----|--------|------|
| 后端单元+集成 | **80%+** | 772 测试函数97.5% 通过 |
| Web 前端 | **15%** | 62 文件,但断言深度未知 |
| MP 小程序 | **0%** | 40+ 页面零测试 |
| E2E | **5%** | 仅 5 个 Playwright spec |
| 新增模块 | **0%** | care_plan/shift/ble_gateway/family_proxy 零测试 |
### 6.4 按域评分
| 域 | 分数 | 说明 |
|----|------|------|
| F1-F6 核心医疗 | 72 | 后端测试好,前端弱 |
| F14-F17 新增模块 | 30 | 零测试+零日志 |
| F10 AI | 55 | 集成测试有E2E 无 |
| F18 FHIR | 25 | 零测试 |
| F19 OAuth | 30 | 零测试 |
---
## 七、医疗领域专家评审75/C
### 7.1 临床工作流合理性
**透析全流程**(核心工作流):
- 预约→透析记录→干体重/超滤量/血流量记录 → 合理
- KDIGO 风险评分 → 有价值,但未自动串联 → 效率低
- 透析间期监测(体征录入)→ 合理MP 支持好
**随访工作流**:
- 随访任务创建→分配→执行→记录 → 标准化流程,合理
- AI 建议关联随访 → 设计好,但前后对比未实现,闭环断裂
- 批量随访操作后端有但前端未调用 → 限制效率
**护理工作流**:
- 护理计划→项目→预后 → 概念正确
- 班次→交接班 → 血透中心刚需
- 但两个模块完全无 UI → 无法使用
### 7.2 FHIR 标准合规性
| R4 要求 | 状态 | 说明 |
|---------|------|------|
| 资源类型覆盖 | **60%** | Patient/Observation/Encounter/Device缺少 Condition/MedicationRequest |
| Bundle 结构 | **70%** | 缺 link 字段 |
| 搜索参数 | **50%** | 仅支持 gt/lt缺 eq/ge/le |
| $everything 操作 | **40%** | 无分页限制,血压 ID 重复 |
| OAuth2 保护 | **60%** | Client Credentials OK缺 Authorization Code |
### 7.3 患者安全评估
| 风险 | 严重度 | 说明 |
|------|--------|------|
| 告警延迟/丢失 | 中 | SSE 无背压,告警风暴可能丢失 |
| 体征数据不一致 | 高 | BLE 双写无事务,可能影响临床决策 |
| 危急值阈值管理 | 中 | 后端有阈值配置,但 Web 无管理页 |
| 适老化不足 | 中 | 15 处字号低于 22px老年患者操作困难 |
### 7.4 按域评分
| 域 | 分数 | 说明 |
|----|------|------|
| F11 透析 | 85 | 流程完整MP 覆盖好 |
| F4 预约 | 88 | 三端 100%,血透刚需 |
| F5 随访 | 82 | 流程合理,对比功能缺失 |
| F3 健康数据 | 78 | 数据完整BLE 有风险 |
| F14 护理计划 | 35 | 概念好但无法使用 |
| F18 FHIR | 40 | R4 合规不足 |
---
## 八、综合结论与 Top 5 必修项
### 8.1 各角色共识
5 个专家角色一致认同以下结构性问题:
1. **安全基础不牢** — SQL 注入 + FHIR 越权 + OAuth 权限缺失,不修复不能上线
2. **5 个模块孤立** — 后端投入产出为零34 条路由无 UI需明确交付计划
3. **测试覆盖严重不足** — MP 零测试 + 新增模块零测试,回归风险极高
4. **AI 关怀闭环断裂** — 前后对比未实现,"AI 驱动主动关怀"定位不成立
5. **可观测性缺口** — 4/6 新增 service 零 tracing生产排障困难
### 8.2 Top 5 必修项Phase 2 前必须完成)
| # | 问题 | 角色共识度 | 工作量 |
|---|------|-----------|--------|
| 1 | **C1: SQL 注入修复** — action_inbox_service.rs 参数化查询 | 5/5 | 2h |
| 2 | **C2: FHIR allowed_patient_ids 强制执行** — 查询层过滤 | 4/5 | 4h |
| 3 | **H5: OAuth handler require_permission** — 5 端点权限 | 4/5 | 1h |
| 4 | **M3: JWT Secret 移除硬编码 fallback** — 启动时校验 | 4/5 | 1h |
| 5 | **H2: AI 前后对比功能实现** — 关怀闭环核心 | 4/5 | 8h |
**总工作量: ~16h**
### 8.3 Phase 2 前置条件评估
| 条件 | 状态 | 说明 |
|------|------|------|
| P0 安全修复完成 | **未开始** | C1/C2/H5/M3 四项 |
| AI 关怀闭环通 | **未开始** | H2 前后对比 |
| 核心模块有测试 | **部分** | 后端 80%,前端/MP 不足 |
| 日志覆盖 80%+ | **未达标** | 4/6 新 service 零 tracing |
**结论**: Phase 2患者体验重构可规划但需先完成 P0 安全修复(~8h和 AI 闭环(~8h。安全基础不牢则生产部署风险不可接受。
---
## 九、专家评审按域评分汇总
| 功能域 | 产品 | 架构 | 安全 | DevOps | 医疗 | 加权均 |
|--------|------|------|------|--------|------|--------|
| F1 患者 | 85 | 78 | 85 | 72 | 80 | **81** |
| F2 医生 | 82 | 80 | 85 | 70 | 78 | **80** |
| F3 健康数据 | 80 | 75 | 85 | 68 | 78 | **78** |
| F4 预约 | 88 | 82 | 85 | 75 | 88 | **85** |
| F5 随访 | 82 | 78 | 80 | 72 | 82 | **80** |
| F6 咨询 | 85 | 80 | 85 | 72 | 80 | **81** |
| F7 内容 | 75 | 72 | 80 | 65 | 70 | **73** |
| F8 积分 | 72 | 70 | 80 | 60 | 65 | **70** |
| F9 告警 | 80 | 72 | 75 | 68 | 78 | **76** |
| F10 AI | 70 | 68 | 78 | 55 | 72 | **69** |
| F11 透析 | 88 | 78 | 80 | 75 | 85 | **82** |
| F12 仪表盘 | 75 | 72 | 78 | 65 | 70 | **73** |
| F13 行动收件箱 | 78 | 55 | 40 | 68 | 75 | **61** |
| F14 护理计划 | 30 | 40 | 78 | 30 | 35 | **41** |
| F15 班次 | 30 | 40 | 78 | 30 | 35 | **41** |
| F16 BLE 网关 | 30 | 45 | 70 | 25 | 30 | **41** |
| F17 家庭代理 | 30 | 40 | 78 | 30 | 35 | **41** |
| F18 FHIR | 55 | 50 | 50 | 25 | 40 | **46** |
| F19 OAuth | 55 | 45 | 45 | 30 | 40 | **45** |
| F20 日聚合 | 72 | 65 | 80 | 55 | 70 | **69** |