Files
hms/docs/superpowers/specs/2026-05-17-system-six-dimension-analysis-design.md
iven 8d3c5915c9 docs(analysis): 六维度全面均衡分析 + wiki 关键数字校正
- 6 专家组并行分析:架构 8.5 / 安全 7.5 / 测试 5.5 / 前端 7.2 / DevOps 3.8 / 产品 8.0
- 综合评分 6.8/10 (B),分析报告 + 讨论记录
- wiki 关键数字校正:源文件 652、迁移 147、权限码 128、Web 307 TS/TSX 等
2026-05-17 12:01:15 +08:00

397 lines
17 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-05-17
> 日期: 2026-05-17 | 方法: 6 专家组并行分析 + 代码级核实 | 数据基准: feat/media-library-banner 分支
## 1. 概述
### 1.1 分析方法
本次分析采用"6 专家组并行头脑风暴"模式,每个专家从不同维度审视系统:
| 专家 | 角色 | 分析维度 |
|------|------|----------|
| 首席架构师 | Senior Developer | 架构演进、事件系统、技术债务 |
| 安全工程师 | Security Engineer | 漏洞修复、合规差距、密钥管理 |
| QA 测试专家 | Senior Developer | 测试覆盖、质量门禁、工具链 |
| 前端/UX 架构师 | Frontend Developer | 前端架构、Design Token、性能 |
| DevOps/SRE | DevOps Automator | 生产就绪度、监控、CI/CD |
| 产品经理 | Senior Project Manager | 产品完整度、用户价值、路线图 |
数据来源652 个 Rust 源文件136,908 行、307 个 Web TS/TSX 文件、161 个小程序 TS/TSX 文件、147 个数据库迁移、128 个权限码,全部经过代码级核实。
### 1.2 六维度综合评分
| 维度 | 评分 | 等级 | 上次(2026-05-11) | 变化 |
|------|------|------|-----------------|------|
| 架构 | 8.5/10 | A- | 7.5 | +1.0 |
| 安全 | 7.5/10 | B+ | 7.0 | +0.5 |
| 测试 | 5.5/10 | C+ | 6.5 | -1.0 |
| 前端/UX | 7.2/10 | B+ | 6.0 | +1.2 |
| DevOps | 3.8/10 | D+ | 4.0 | -0.2 |
| 产品 | 8.0/10 | B+ | 7.5 | +0.5 |
| **综合** | **6.8/10** | **B** | **6.9** | -0.1 |
**核心判断:** 架构和产品是系统最强维度DevOps 是最明显短板。综合评分与上次基本持平,但内部结构变化显著——前端/UX 因统一组件库迁移大幅提升,测试因小程序零单元测试被拉低。
---
## 2. 维度一:架构 (8.5/10)
### 2.1 架构健康度评估
**依赖拓扑:** 严格星型结构10 个 L2 crate 全部仅依赖 erp-core零循环依赖。erp-server 是唯一聚合点。这在 17 crate 规模下是完全合理的。
```
erp-core (零业务依赖)
/ | \ \ \
erp-auth config workflow message health ai dialysis
\ | /
erp-server
erp-plugin (依赖 erp-coreWASM 运行时)
```
**模块边界:** 所有业务 crate 通过 EventBus + trait 通信,不创建直接依赖。新模块(如 erp-billing接入仅需 1-2 天,遵循成熟的 crate 模板。
### 2.2 事件系统成熟度
| 指标 | 值 | 评价 |
|------|-----|------|
| Health 域事件类型 | 31 | 覆盖全面 |
| 全系统事件类型 | 51 | 跨模块联动完善 |
| 事件发布点 | 82 | 密度合理 |
| 消费者模块 | 12 | 主要业务域覆盖 |
| Outbox 可靠性 | 7/10 | 持久化+NOTIFY+兜底轮询三重保障 |
**待改进:** 事件 payload 使用 `serde_json::Value`(无类型约束),超过 50 个事件类型后 schema 演进会变危险。建议为每个事件定义 Typed payload struct。
### 2.3 技术债务 TOP 5
| 排名 | 目标 | 问题 | 优先级 | 工作量 |
|------|------|------|--------|--------|
| #1 | erp-server/main.rs (991行) | OpenAPI 注解+路由+启动全在一个文件65次clone | P1 | 2天 |
| #2 | erp-plugin 三巨头 (5,474行) | data_service+manifest+dynamic_table 过于庞大 | P2 | 3天 |
| #3 | version.unwrap() 模式 (8+处) | 系统性重复,数据损坏时 panic | P1 | 0.5天 |
| #4 | erp-health service 层日志缺失 | 26 个 service 仅 11 处 tracing | P1 | 1天 |
| #5 | erp-message/module.rs (1,220行) | 单文件包含全部消息逻辑 | P2 | 1天 |
### 2.4 erp-health 模块评估
214 文件 / 40,306 行,不需要拆分为子 crate但需要内部模块化
- Entity: 59 文件 / Handler: 32 文件 / Service: 57 文件(含子目录)
- 4 个文件超 800 行action_inbox_service(1,104)、follow_up_service(1,000)、validation(916)、consultation_service(859)
- 建议:将大 service 拆为子目录(如 `action_inbox/crud.rs + query.rs + event_publish.rs`
### 2.5 10x 数据量瓶颈
假设扩展到 1,000 租户 / 100 万患者:
- **瓶颈1**: 健康数据趋势查询聚合计算,需物化视图或预计算汇总表
- **瓶颈2**: Outbox Relay 单线程处理,需按 tenant_id 分片
- **瓶颈3**: EventBus broadcast channel 消费者 lag需考虑 Redis Streams
- **非瓶颈**: UUID v7 B-treeappend-only、Axum 路由260+无压力、SeaORM编译时生成
---
## 3. 维度二:安全 (7.5/10)
### 3.1 漏洞修复优先级
**P0立即修复共 ~4h**
| 编号 | 问题 | 文件 | 方案 | 工作量 |
|------|------|------|------|--------|
| NEW-1 | 文件上传无 MIME 白名单 | media_handler.rs | 添加 ALLOWED_MIME_TYPES + 扩展名清理 | 2-3h |
| NEW-2 | OAuth JWT 密钥独立读取 | oauth/handler.rs | 复用 AppState 已验证密钥 | 1-2h |
**P1短期修复共 ~6h**
| 编号 | 问题 | 文件 | 方案 | 工作量 |
|------|------|------|------|--------|
| HIGH-1 | JWT RwLock unwrap 热路径 | jwt_auth.rs:80,210 | 替换为 DashMap | 1-2h |
| MED-3 | Storage Secret 启动检查缺失 | config.rs | 添加与 JWT 相同的 exit(1) 检查 | 0.5h |
| COMP-1 | 审计日志 fire-and-forget 写入 | audit_service.rs:59 | 关键操作改为同步写入 | 4-6h |
**P2中期修复共 ~15h**
| 编号 | 问题 | 方案 | 工作量 |
|------|------|------|--------|
| HIGH-2 | 动态表名 SQL 引号不一致 | 统一 safe_table_name() | 2-3h |
| HIGH-3 | WASM host block_on | spawn_blocking 线程池隔离 | 4-6h |
| MED-1 | version unwrap 20+处 | erp-core bump_version() 工具函数 | 2-3h |
| COMP-2 | PII 加密覆盖度无注册表 | 建立加密字段注册表 | 4-6h |
### 3.2 安全架构评分
| 子维度 | 评分 | 关键发现 |
|--------|------|----------|
| 认证体系 | 8/10 | Argon2 + 分层路由 + Token 黑名单 + 账户锁定 |
| 授权体系 | 7.5/10 | 128 权限码 + RBAC + 行级数据权限 + RLS |
| 数据保护 | 7/10 | AES-256-GCM PII + 哈希链审计日志 + Zeroizing |
| API 安全 | 8/10 | 三层限速 + fail-close + SeaORM 参数化 + sanitize_identifier |
### 3.3 医疗合规差距
| 合规领域 | 状态 | 关键差距 |
|----------|------|----------|
| HIPAA 访问控制 | PASS | RBAC + 多租户 + Argon2 |
| HIPAA 传输加密 | WARN | 代码无 TLS需反向代理层文档化 |
| HIPAA 紧急访问 | MISSING | 无 break-glass 机制 |
| GDPR 被遗忘权 | MISSING | 软删除≠匿名化,需 GDPR 删除端点 |
| GDPR 数据可携带 | MISSING | 无数据导出端点 |
| 等保三级通信保密 | WARN | 需 TLS 部署证明 |
| 等保三级个人信息保护 | PARTIAL | 需同意管理 + 数据保留策略 |
### 3.4 积极发现
- 生产环境启动检查JWT/CORS/KEK 全部 exit(1))是业界最佳实践
- 哈希链审计日志在医疗 SaaS 中极为罕见
- 多层限速 + fail-close 体现安全工程成熟度
- Argon2 + Zeroizing + AES-256-GCM 密码学最佳实践组合
---
## 4. 维度三:测试 (5.5/10)
### 4.1 后端测试密度
| Crate | 测试函数 | 测试/文件 | Service 覆盖率 |
|-------|---------|-----------|---------------|
| erp-health | 203 | 0.95 | 15.8% (9/57) |
| erp-ai | 141 | 2.27 | 61.1% (11/18) |
| erp-config | 78 | 3.25 | 80% (4/5) |
| erp-core | 77 | 3.21 | N/A |
| erp-message | 77 | 4.28 | 75% (3/4) |
| erp-plugin | 78 | 3.25 | N/A |
| erp-workflow | 63 | 2.42 | **0%** (0/5) |
| erp-auth | 41 | 1.08 | 25% (3/12) |
| **合计** | **943** | **1.45** | -- |
**关键风险:** erp-health 是最关键模块215 文件),但 service 层仅 15.8% 有测试。erp-workflow 完全没有 service 层测试。13/31 handler 无集成测试。
### 4.2 前端测试现状
| 平台 | 单元测试 | E2E | 最大风险 |
|------|---------|-----|---------|
| Web | 62 文件 / ~693 断言 | 13 spec | 页面覆盖 21% |
| 小程序 | **0 文件** | 4 spec | **全部逻辑层零测试** |
**小程序零单元测试是最严重的质量盲区。** 42 个 service 文件、5 个 store、7 个 utils 全部无测试保护。API 契约同步完全依赖手动发现。
### 4.3 测试补全策略
**Phase A — 小程序基础层2-3天**
- utils/ 全覆盖 (~35 测试)
- services/request.ts 核心逻辑 (~20 测试)
- stores/ 全覆盖 (~40 测试)
**Phase B — 小程序 Service 层3-5天**
- health/auth/consultation services (~95 测试)
**Phase C — 后端安全关键路径1周**
- erp-auth service 层: 25% → 80% (~45 测试)
- erp-workflow service 层: 0% → 60% (~30 测试)
- 告警 handler 集成测试: 0 → 覆盖 (~20 测试)
### 4.4 质量门禁建议
| 套件 | 耗时 | 频率 | 包含 |
|------|------|------|------|
| 快速反馈 | ~3min | 每次 commit | unit tests + type check |
| 标准验证 | ~10min | 每个 PR | + integration tests + clippy + lint |
| 完整回归 | ~30min | main merge | + E2E + coverage + security |
| 性能基准 | ~15min | 版本发布前 | benchmarks + load tests |
### 4.5 覆盖率目标
| 层级 | 当前 | 3个月 | 6个月 |
|------|------|-------|-------|
| 后端 service 层 | ~30% | 60% | 80% |
| 后端 handler 集成测试 | 58% (18/31) | 80% | 100% |
| 小程序 service+store | 0% | 60% | 80% |
| Web 页面组件 | 21% | 40% | 60% |
| E2E 覆盖 | 5 条核心链路 | 10 条 | 15 条 |
---
## 5. 维度四:前端/UX (7.2/10)
### 5.1 前端架构评分
| 子维度 | Web | 小程序 | 评价 |
|--------|-----|--------|------|
| 代码组织 | 8.0/10 | 7.0/10 | 目录结构清晰,分层合理 |
| 状态管理 | 优秀 | 良好 | Zustand 5Web 6 store / MP 5 store |
| Design Token | 8.5/10 | 8.5/10 | 11 级字号 + 非线性关怀模式放大 |
| 请求层抽象 | 优秀 | 优秀 | JWT 主动刷新 / 并发限制 MAX_CONCURRENT=8 |
| 组件化 | 7.0/10 | 7.0/10 | Web 18 + MP 21 组件,仍有提升空间 |
| 测试覆盖 | 7.0/10 | **0/10** | MP 零单元测试 |
### 5.2 Design Token 亮点
Token 三层架构是项目做得最好的部分之一:
```
tokens.scss (定义 11 级字号 + 12 结构 token)
→ variables.scss (语义色 var(--tk-pri))
→ 页面 SCSS (75 页面全量接入 var(--tk-*))
```
- 非线性关怀模式放大:标题 x1.15 / 正文 x1.35 / 辅助 x1.55
- 医生端靛蓝色系通过 `.doctor-mode` CSS 变量级联覆盖
- Web 端 4 套主题通过 Ant Design ConfigProvider 动态切换
### 5.3 小程序核心亮点
- `request.ts`:并发限制(8) + inflight 去重 + 响应缓存(TTL+patientId 隔离) + Token 刷新去重
- 统一组件库PageShell/ContentCard/StatusTag/ListItem/VitalCard 等 17 UI + 4 pattern 组件
- 分包策略:主包 12 页面 + 7 分包按业务域划分
- `safeNavigateTo` 栈深度保护解决微信 10 层限制
### 5.4 前端待改进项
| 问题 | 优先级 | 工作量 | 方案 |
|------|--------|--------|------|
| OpenAPI spec 自动生成 TS 类型 | P0 | 3天 | 引入 openapi-typescript根治 35 次接口不同步 fix |
| MP 核心层单元测试 | P0 | 5-8天 | request.ts + stores + 核心 services |
| Web 大文件拆分(>400行 x15) | P1 | 5天 | 提取共享表单/列表模式 |
| MP service 层 doctor/ 重复逻辑 | P1 | 2天 | 提取 services/shared/ 共享接口 |
| Storybook 组件文档 | P1 | 3天 | MP 17 组件逐个建档 |
---
## 6. 维度五DevOps (3.8/10)
### 6.1 生产就绪度评分
| 子维度 | 评分 | 关键差距 |
|--------|------|----------|
| 部署方案 | 5/10 | Docker 完善,但无 HTTPS/LB/多副本 |
| 高可用性 | 2/10 | 单容器,无水平扩展,文件上传存本地磁盘 |
| 灾难恢复 | 3/10 | pg_dump 有,但无恢复测试、无异地备份 |
| 监控告警 | 3/10 | Prometheus exporter 已实现(端口 9090),但未接入采集端 |
| CI/CD | 4/10 | 基础 CI 存在,无 CD/安全扫描/E2E |
| 密钥管理 | 4/10 | 环境变量注入,无 Vault/KMS |
### 6.2 紧急修复路线图
**Phase 0 — 安全修复1-2天**
- Redis 连接启用 TLS
- 数据库连接 SSL mode
- 固定 Docker 基础镜像版本
- 备份推送到异地存储(S3/OSS)
**Phase 1 — 最小可观测性3-5天**
- Docker Compose 添加 Prometheus + Grafana代码已有 exporter
- 基础仪表盘HTTP QPS/延迟/错误率 + DB/Redis 健康)
- 基础告警规则(服务宕机、错误率 >5%
- 接入告警通道(企业微信/钉钉 Webhook
**Phase 2 — CI/CD 完善3-5天**
- Docker 镜像构建 + 推送到 Registry
- 安全扫描cargo audit + npm audit + Trivy
- 部署脚本pull + migrate + health check + switch
**Phase 3 — 生产加固5-7天**
- Nginx/Caddy 反向代理 + HTTPSLet's Encrypt
- 上传文件存储迁移到对象存储(解锁多副本前提)
- 日志聚合Loki+ 审计日志持久化
- 密钥管理迁移到 Vault/云 KMS
### 6.3 医疗 SaaS 合规硬性要求
| 要求 | 当前状态 | 优先级 |
|------|---------|--------|
| 数据传输加密(HTTPS) | 无 | P0 |
| 审计日志持久化(6年+) | 无 | P0 |
| 数据备份恢复测试 | 未验证 | P0 |
| 安全漏洞扫描 | 无 | P1 |
| 密钥管理服务 | .env 文件 | P1 |
| 灾难恢复计划 | 无 | P1 |
---
## 7. 维度六:产品 (8.0/10)
### 7.1 功能完整度评估
| 梯队 | 模块 | 后端 | 管理后台 | 小程序 | 综合评分 |
|------|------|------|---------|--------|---------|
| 第一梯队(>85%) | 患者管理 | 完整 | PatientList+Detail | 建档/查看 | 95% |
| | 健康数据 | 完整 | 健康记录+化验 Tab | 体征/趋势/监测 | 90% |
| | 预约排班 | 完整 | AppointmentList | 创建/详情 | 90% |
| | 咨询管理 | 完整 | ConsultationList | 列表/聊天 | 90% |
| | 告警系统 | 完整 | AlertDashboard | 列表/详情 | 90% |
| | 内容管理 | 完整 | ArticleEditor+Banner | 文章/轮播图 | 88% |
| | 积分商城 | 完整 | PointsRule/Product | 商城/兑换 | 85% |
| 第二梯队(60-84%) | 随访管理 | 完整 | 三页面齐全 | 工作流联动弱 | 80% |
| | AI 分析 | 9实体+4Provider | 页面存在但缺触发入口 | AI 报告列表 | 70% |
| | 设备采集 | 完整 | RealtimeMonitor | BLE 同步 | 70% |
### 7.2 AI 能力"最后一公里"问题
| AI 能力 | 后端 | 前端入口 | 可触达率 |
|---------|------|---------|---------|
| 化验单解读 | SSE 端点完整 | 缺触发按钮 | ~40% |
| 趋势分析 | SSE 端点完整 | 缺触发入口 | ~30% |
| 报告摘要 | SSE 端点完整 | 缺入口 | ~20% |
| AI 客服聊天 | 完整 | 小华助手页面 | ~80% |
**核心判断:** AI 管理能力Prompt 管理 + 用量统计)已完整,但核心消费场景缺少 UI 入口。这是"有了发动机但没有方向盘"的状态。
### 7.3 差异化竞争力
1. **AI + 医疗数据深度整合** — 化验解读/趋势分析/报告摘要Prompt 可配置
2. **Rust 事件驱动架构** — 高并发稳定、模块可独立部署、数据不丢失
3. **多租户 SaaS + FHIR 开放平台** — 零部署、数据隔离、与 HIS/LIS 互操作
### 7.4 SaaS 定价建议
| 层级 | 目标 | 核心功能 | 定价锚点 |
|------|------|---------|---------|
| 免费层 | 引流体验 | 患者管理+基础排班+咨询+3篇文章/月 | 0 |
| 专业层 | 核心营收 | AI 分析+护理计划+告警+设备+透析+FHIR | 按年检量阶梯定价 |
| 企业层 | 高价值增值 | 多租户集团+FHIR 读写+AI 自定义+专属部署 | 定制报价 |
---
## 8. TOP 10 紧急行动清单
| # | 行动项 | 维度 | 优先级 | 工作量 | 预期效果 |
|---|--------|------|--------|--------|----------|
| 1 | 文件上传 MIME 白名单 | 安全 | P0 | 2-3h | 消除存储型 XSS |
| 2 | OAuth JWT 密钥路径统一 | 安全 | P0 | 1-2h | 消除空密钥绕过 |
| 3 | CI 添加安全扫描 | DevOps | P0 | 0.5天 | 持续安全防线 |
| 4 | AI 分析前端触发入口 | 产品 | P0 | 3-5天 | AI 可触达率 30%→80% |
| 5 | JWT RwLock→DashMap | 安全 | P1 | 1-2h | 消除认证热路径 DoS |
| 6 | version.unwrap() 消除 | 架构 | P1 | 0.5天 | 消除 8+ 处潜在 panic |
| 7 | MP 核心层单元测试 | 测试 | P1 | 5-8天 | 消除最大质量盲区 |
| 8 | 最小可观测性(Prometheus+Grafana) | DevOps | P1 | 3-5天 | 代码已有 exporter |
| 9 | main.rs 拆分重构 | 架构 | P1 | 2天 | 消除 65 次 clone |
| 10 | OpenAPI 自动生成 TS 类型 | 前端 | P1 | 3天 | 根治 35 次接口不同步 |
**P0 总工作量:~4-5 天**#1-#4
**P1 总工作量:~15-20 天**#5-#10
---
## 9. Wiki 关键数字校正表
| 指标 | Wiki 旧值 | 实际值 | 变化 |
|------|-----------|--------|------|
| Rust 源文件 | 649 | **652** | +3 |
| 数据库迁移 | 146 | **147** (m20260516) | +1 |
| erp-health 文件 | 189 | **214** | +25 |
| erp-health Entity | 57 | **59** (handler 32/service 41) | +2 |
| erp-ai 文件 | 45 | **62** | +17 |
| 权限码 | 132 | **128** (health 52 + 其他 76) | -4 |
| Web TS/TSX | 332 | **307** | -25 |
| Web 活跃路由 | 29 | **36** (冻结 5) | +7 |
| Web API 模块 | 52 | **42** | -10 |
| 小程序 TS/TSX | 163 | **161** | -2 |
| 小程序页面 | 66 | **60** | -6 |
| 前端测试断言 | 472+39 | **~757** | 重新定义口径 |
| 事件类型 | 31(health) | **31**(health)/**51**(全系统) | 补全系统口径 |
| utoipa 注解文件 | 88 | **89** | +1 |
| Rust 代码总行数 | 未记录 | **136,908** | 新增 |
| Entity 总数(全系统) | 未记录 | **109** | 新增 |
| Service 总数(全系统) | 未记录 | **107** | 新增 |