# HMS 健康管理平台 — 知识库
> **Health Management System (HMS)** — 面向体检中心/医疗机构的综合健康管理平台。从 ERP 底座分叉,继承身份权限/工作流/消息/配置等基础能力,`erp-health` 原生模块承载医疗业务。
## 关键数字
> 最后更新: 2026-05-21 | 数据截止: feat/media-library-banner 分支(侧边栏 Ant Design Menu 重构 + 菜单方案B重组)
| 指标 | 值 |
|------|-----|
| Rust crate | 17 个(erp-core + 5 基础业务 + erp-health + erp-ai + erp-dialysis + erp-plugin + 7 插件/原型) |
| Rust 源文件 | **703 个**(~128,000 行) |
| 数据库表 | 30 基础表 + 49 健康业务表 + 13 AI 表(+4 会话/消息/tool_log/user_profile) + 3 媒体库/轮播图表 |
| 数据库迁移 | **164 个**(最新 m20260521_000164) |
| 后端路由 | **382+ 个**(11 公开 + 14 FHIR + 2 网关 + ~355 受保护) |
| 核心模块 | 5 基础 (auth/config/workflow/message/plugin) + 3 业务 (health + ai + dialysis) |
| erp-health 实体 | **59 个** Entity(32 handler / 41 service / 22 DTO,214 文件) |
| erp-ai 实体 | 9 个 Entity(62 文件,4 AI Provider,chat_handler 支持 FC/Ollama fallback) |
| 全系统 Entity | **109 个** / Handler **47 个** / Service **107 个** / DTO **29 个** |
| Web 前端 | 316 个 TS/TSX 文件(36 活跃路由 + 6 冻结路由,54 API 模块,161 页面) |
| 微信小程序 | Taro 4.2 + React 18,167 个 TS/TSX 文件 / 59 页面(12 主包 + 47 子包) / 4 TabBar + 医生端分包,34 组件 / 38 service 文件,统一组件库 + CSS 变量主题(93 页面 SCSS 全量接入 `var(--tk-*)`,字号 token 对齐原型统计,医生端 `.doctor-mode` 靛蓝覆盖,登录页账号密码+微信一键登录);**并发安全**:长轮询独立通道 `requestUnlimited` + ConcurrencyLimiter(12) + safeNavigateTo 全局页栈保护 + reLaunch 去重 + 分包预加载 preloadRule |
| 前端测试 | Web 62 单元测试文件(~693 断言) + 17 E2E spec(13 Web + 4 MP,~64 断言);小程序 0 单元测试 |
| 后端测试 | **1024+ 个函数**(802 同步 + 188 异步),110 个文件含测试 |
| 事件系统 | 31 事件类型(health)/ 51 全系统 / 82 发布点 / 15 消费者模块 / Outbox + LISTEN/NOTIFY |
| 权限码 | **140 个**(health 57 + ai 21 + auth 24 + config 18 + workflow 8 + message 5 + plugin 2 + dialysis 5) |
| utoipa 注解 | **94 个**文件含注解 |
| Clippy | **全 workspace 0 警告**(2026-05-07 清零) |
| 依赖版本 | 全部最新主版本线(Rust edition 2024) |
| API 文档 | `http://localhost:3000/api/docs/openapi.json` |
| Git 提交 | **948 次** |
| 系统分析评分 | **6.3/10 (B-)**(六维度全面均衡分析,2026-05-20:架构 8.0 / 安全 7.5 / 测试 5.5 / 前端 7.2 / DevOps 3.8 / 产品 7.0) |
| 审计状态 | V1: 83% → V2: 85%,P0 安全修复已完成;E2E 测试 157 端点(Health 63% / AI+Plugin 92.4%),CRITICAL×2 待修复 |
| 角色测试 | R01-R05 全角色验证完成,86.5% 通过率,5 个 BUG 已修复;小程序 MP 多角色 96.2% 通过率 |
| Design Token | 11 级字号(对齐 18 份原型稿 fontSize 统计:h1=28/h2=22/body-lg=18/body=16/body-sm=14/cap=13)+ 12 结构 token,75 SCSS 页面全量接入 `var(--tk-*)`,`.doctor-mode` / `.elder-mode` CSS 变量级联覆盖,ContentCard 支持 padding+margin prop |
| 长者模式 | 58/58 页面 100% 覆盖 |
| UI 合规审计 | T40: 60 页面全覆盖(PASS 24 / PASS_WITH_ISSUES 36 / NEEDS_WORK 0),HIGH×2 + MEDIUM×6 + LOW×67 全部修复,评分 95/100 |
| 项目阶段 | **V1 CONDITIONAL GO** — 六维度分析综合 6.3/10 B-,P0 阻塞项约 4 天(备份加密 + 安全头 + analytics 权限 + TLS + 迁移回滚),P1 测试约 3 天 |
## 症状导航
| 症状 | 先查 | 再查 | 常见根因 |
|------|------|------|----------|
| API 返回 403 | 权限码检查 | [[wasm-plugin]] 权限系统 | 权限码不匹配 / 缺少 .list 权限 |
| API 返回 500 无日志 | [[erp-core]] 错误链 | 后端 tracing 输出 | AppError::Internal 静默 |
| 数据库连接失败 | [[infrastructure]] | PostgreSQL 服务状态 | 服务未启动 / 环境变量未设置 |
| 前端 401 刷新时 | [[frontend]] auth store | API client token 刷新 | token 过期未主动刷新 |
| 迁移执行失败 | [[database]] | PostgreSQL 日志 | 表冲突 / 唯一索引 + 软删除 / 缺失迁移文件 |
| 端口被占用 | [[infrastructure]] dev.ps1 | 端口 5174-5189 进程 | 残留 Vite 进程 |
| 预约创建 400 doctor_id is required | [[erp-health]] 预约并发控制 | AppointmentList.tsx | 医生字段为必填(后端 CAS 要求) |
| 预约超额 | [[erp-health]] 排班并发 | appointment CAS 操作 | 并发控制未走原子 CAS |
| 患者创建 422 birth_date trailing input | [[frontend]] 日期序列化 | DatePicker dayjs 对象 | 未格式化为 YYYY-MM-DD 字符串 |
| 跨租户数据泄漏 | [[architecture]] 多租户策略 | [[database]] tenant_id | 查询缺少 tenant_id 过滤 |
| 小程序页面空白 | [[miniprogram]] defineConstants | `process.env` 未替换 | 编译时未注入环境变量 |
| 小程序登录失败 `btoa is not defined` | [[miniprogram]] secure-storage | Web API 不可用 | 使用 `Taro.arrayBufferToBase64` 替代 |
| 微信登录 500 | [[database]] wechat_users 表结构 | Entity 字段与表不匹配 | 补 `created_by/updated_by/version` 列 |
| 迁移文件缺失报错 | [[database]] 迁移注册 | migration/src/lib.rs | 已应用的迁移文件被删除,需创建 stub |
| MCP 连接失败 `split` error | [[miniprogram]] MCP 联调 | project.config.json | 未开启 `automationAudits` |
| MCP mp_screenshot 超时 | [[miniprogram]] MCP 联调 | automator 已知 bug | 用 `page_getElement` 替代截图 |
| MCP 导航后跳回登录页 | [[miniprogram]] MCP 联调 §6.4 | storage 被清空 | 明文 token 写入后立即 reLaunch |
| MCP token 注入后仍 401 | [[miniprogram]] MCP 联调 §6.1 | 用了生产构建 | dev 构建(`NODE_ENV=development`)+ 空密钥 |
| MCP App 级命令全部超时 | [[miniprogram]] MCP 联调 §6.2 | 多 DevTools 实例冲突 | `taskkill /F /IM wechatdevtools.exe` 后重开 |
| MCP CLI 报"需要重新登录" | [[miniprogram]] MCP 联调 §6.2 | DevTools 未扫码 | 在 DevTools 中先扫码登录 |
| 积分商城 Tab 页空白 | [[miniprogram]] 待优化 | 未关联患者档案 | 需增加降级 UI 引导建档 |
| MCP 批量审计页面栈溢出 | [[miniprogram]] MCP 联调 §6.6 | `navigateTo` 超 10 层 | 改用 `reLaunch` 逐页测试 |
| 告警管理按钮不显示 | [[frontend]] 权限码拼写 | AlertList.tsx | `health.alert.manage` → `health.alerts.manage`(缺 s) |
| 小程序晚间血压丢失 | [[miniprogram]] 体征录入 | indicator_type 映射 | **已修复:** 新增 `blood_pressure_evening` 类型,录入页+日常监测页+后端+测试全覆盖 |
| 咨询页长轮询 CPU 飙升 | [[miniprogram]] §5 审查 | longPoll delay=0 递归 | **已修复:** 成功路径加 3s 间隔 + 连续失败上限 50 次 |
| 小程序 DevTools 卡死(所有 API ERR_SSL_PROTOCOL_ERROR) | [[miniprogram]] request.ts | `process.env.NODE_ENV === 'production'` 时 http→https 自动转换 | **已修复:** 移除 `getHeaders` 中自动 http→https 升级,URL 以 `.env` 为唯一来源 |
| 小程序 Tab 切换卡死(并发请求阻塞 30s) | [[miniprogram]] request.ts | `getHeaders()` 中 `await tryRefreshToken()` 预检查 | **已修复:** 移除 getHeaders 中的同步 Token 刷新预检查,仅依赖 401 重试路径 |
| 小程序患者端登录后卡死(Tab 切换频繁卡死) | [[miniprogram]] §5 审查 | 并发请求超微信 10 限制排队 + 长轮询重叠 + 防重入缺失 | **已修复:** 全局并发限制 MAX_CONCURRENT=8 + generation counter 长轮询 + loadingRef 防重入 |
| 小程序咨询页闭会话崩溃(pollingRef is not defined) | [[miniprogram]] 审计第二轮 | generation counter 重构后 loadData 残留 pollingRef 引用 | **已修复:** 移除 loadData 中 `pollingRef.current = false` 残余行 |
| 小程序深层页面导航失败(页栈超 10 层) | [[miniprogram]] navigate.ts | `navigateTo` 超微信 10 层限制 | **已修复:** 新增 `safeNavigateTo`,栈≥9 自动降级为 `redirectTo` |
| 小程序登录卡死(getPhoneNumber 无响应) | [[miniprogram]] login 页 | DevTools 中 `openType='getPhoneNumber'` 不弹窗 | **已修复:** dev 模式新增"开发模式快速登录"按钮绕过手机号授权 |
| 轮播图图片 500 | [[erp-health]] banner_handler | 媒体文件不在磁盘上 | 测试数据问题,生产环境不影响 |
| 设备同步内存无限增长 | [[miniprogram]] §5 审查 | BLE 模块单例 + readings 无上限 | **已修复:** useRef 懒初始化 + MAX_LIVE_READINGS=200 |
| 医生端日期选择器不可用 | [[miniprogram]] §5 审查 | 原生 `` | **已修复:** 替换为 `` |
| 透析记录列表过滤不准 | [[miniprogram]] §5 审查 | 客户端过滤代替服务端过滤 | **已修复:** 传 status 参数给后端 |
| 告警详情加载失败 | [[miniprogram]] §5 审查 | 列表加载 100 条客户端过滤 | **已修复:** 新增 `getAlert(id)` 单条查询 |
| AI 分析 SSE 无 UI 入口 | [[erp-health]] AI 分析 | 前端未调用 | 4 个 SSE 端点无管理界面触发 |
| AI 分析返回对话式回复 | [[erp-ai]] prompt 模板 | 迁移 000123 | system_prompt 未加非对话指令 / 数据为空 |
| AI 分析结果显示原始 JSON | [[erp-ai]] 缓存回放 | `replay_cached` | 迁移 000123 前的嵌套 JSON bug,前端 `extractPlainText` 兼容 |
| AI 分析输出全空(SSE content="") | [[erp-ai]] qwen3 thinking | `strip_think_block` | qwen3 流式 API content 为空,改非流式 + 剥离 think 块 |
| Ollama 内存不足 `memory layout` | [[infrastructure]] Ollama 配置 | `OLLAMA_CONTEXT_LENGTH` | 默认 262144 导致 35GB KV cache,设为 4096 |
| Ollama 暴露到局域网 | [[infrastructure]] Ollama 安全 | `OLLAMA_HOST` | 默认 `0.0.0.0`,必须设 `127.0.0.1` |
| AI 趋势/报告分析 500 模板渲染失败 | [[erp-ai]] Handlebars 模板 | `anomalies.length` | `.length` 不是有效 Handlebars 语法,改为 `{{#if anomalies}}` |
| AI 分析 400 缺少数据 | 后端预校验 | handler 层 | 化验报告 items 为空 / 趋势数据 metrics 为空 |
| 患者创建空名称成功 | [[erp-health]] patient_handler | `name.trim().is_empty()` | **已修复:** 后端添加空名称校验返回 Validation 错误 |
| 仪表盘统计 500 | [[erp-health]] stats_handler | 单个查询异常导致整接口崩溃 | **已修复:** 容错处理,单个查询失败返回零值 |
| FHIR 端点全部 404 | [[erp-server]] main.rs | 路由注册在 `/fhir` 非 `/api/v1/fhir` | **已修复:** 移到 `/api/v1/fhir` |
| 冻结模块 API 可绕过 | [[erp-server]] frozen_module | 后端无拦截中间件 | **已修复:** 新增 `frozen_module_middleware` |
| 积分端点 403 权限码错 | [[erp-health]] points_handler | 患者端用了 `health.health-data.list` | **已修复:** 改为 `health.points.list` |
| MCP 审计大量 LOGIN_REDIRECT | [[miniprogram]] §6.8 审计脚本 | 测试用户密码配置错误 | **已修复:** 所有测试用户密码均为 `Admin@2026`(不是 `Test@2026`) |
| 小程序访客轮播图不显示 | [[miniprogram]] 访客首页 | `TARO_APP_DEFAULT_TENANT_ID` 未配置 | **已修复:** `.env` 添加默认 tenant_id,空字符串时跳过 API 调用 |
| 小程序轮播图图片 404 | [[erp-health]] 公开端点 | Axum 路由参数 `:id` → `{id}` 语法变更 + URL 拼接缺失 `/api/v1` | **已修复:** 路由改用 `{banner_id}`,新增 `/public/banner-image/{id}` 图片服务端点 |
| 前端媒体库图片 401 | [[frontend]] MediaLibrary | `/uploads` 路径需要 JWT 认证 | **已修复:** 新增 `resolveMediaUrl()` 工具函数自动拼接 `?token=`,Vite 代理 `/uploads` |
| 后端启动 panic "Path segments must not start with `:`" | [[erp-health]] module.rs | Axum v0.8+ 路由参数语法变更 | 路由定义使用 `{param}` 而非 `:param` |
| 小程序分包页 navigateTo:fail timeout | [[miniprogram]] 页面生命周期 | `useEffect` + `usePageData`(useDidShow) 双重初始化 | **已修复:** 合并为 `usePageData` 单次回调,移除独立 `useEffect` |
| 小程序/开发者工具卡死无响应 | [[miniprogram]] request.ts 并发控制 | 长轮询占用 ConcurrencyLimiter 槽位 25-30s,叠加 401 形成死锁 | **已修复:** 长轮询走 `requestUnlimited` 独立通道 + 并发上限 8→12 + reLaunch 去重 + maxFailures 50→10 |
| AI 对话 500 / 配额已用尽 | [[erp-ai]] chat_handler | `ai_tenant_config` Entity 表名错误(复数 vs 单数) | **已修复:** Entity table_name 改为 `ai_tenant_config`(单数),配额检查错误区分耗尽/DB 异常 |
| AI 对话 Provider 不可用 | [[erp-ai]] provider_registry | 硬编码 `get_provider("claude")` 忽略配置 | **已修复:** 改为 `config.default_provider` 优先 + fallback chain(claude→openai→ollama) |
| Ollama generate_with_tools 未实现 | [[erp-ai]] chat_handler | Ollama FC 是 stub 返回错误 | **已修复:** 非 FC provider 降级为 `generate()` 简单对话模式 |
| AI 侧边栏/ChatPage 刷新丢失消息 | [[frontend]] ChatPage | 无后端消息加载 API | **已修复:** 新增 `GET /ai/chat/sessions/{id}/messages` + 前端切换时加载历史 |
| AI 菜单缺失 / 客服入口不存在 | [[database]] 菜单迁移 | AI 客服菜单未配置 | **已修复:** 迁移 000155-000156 添加 AI 客服菜单 + 角色绑定 |
| copilot 患者风险 500 | [[erp-ai]] risk_service | SQL 列名/表名与实际 schema 不匹配 | **已修复:** `vital_signs_daily.device_type/avg_val` + `lab_report`(单数)+ JSON 查询 |
| DTO 校验缺失(Update 无 Validate) | [[architecture]] §4 DTO 校验规范 | handler 层未调 `.validate()` | **已修复:** 6 个 crate / 8 个文件 / 44 处缺失修复(erp-auth + erp-config + erp-workflow + erp-message + erp-plugin + erp-health/oauth) |
| SSRF 通过 ServiceTaskConfig.url | [[architecture]] §4 DTO 校验规范 | 工作流 ServiceTask 可访问内网 | **已修复:** 禁止 localhost/127.0.0.1 + 仅 http/https + method 白名单 GET/POST |
| 空标签名导致 500 | [[erp-health]] patient_tags | DTO 缺少 name 字段校验 | **已修复:** CreateTagReq 添加 `validate(length(min=1))` + handler 调 `.validate()`(2026-05-20 确认已修复) |
| 媒体库 folders 路由冲突 | [[erp-health]] media_handler | `/media/{id}` 先匹配,folders 被 UUID 解析 | **非 BUG:** 实际路径为 `/health/media-folders`(连字符),测试使用错误路径(2026-05-20 确认无冲突) |
| 积分商城路由缺失 | [[erp-health]] points | rules/account/checkin/transactions 5 个端点 404 | **非 BUG:** 实际路径 `/health/admin/points/rules`(管理端)和 `/health/points/account`(患者端),21 条路由已覆盖(2026-05-20 确认) |
| 未来出生日期未校验 | [[erp-health]] patient_handler | birth_date=2099 被接受创建 | **已修复:** handler 添加 birth_date ≤ today 校验(2026-05-20 确认已修复) |
| 插件 metrics 500 | [[erp-plugin]] plugin_handler | get_metrics 手动 map_err 覆盖了错误映射 | **已修复:** 移除手动 map_err,使用 From trait 自动映射(NotFound→404) |
| Analytics 批量埋点越权 | [[erp-server]] analytics_handler | `batch()` 未调用 `require_permission` | **已修复:** 添加 require_permission + 事件数上限 100 |
| 缺少 HSTS/CSP 安全头 | [[erp-server]] main.rs | security_headers_middleware 未添加 HSTS/CSP | **已修复:** 添加 HSTS + CSP + Permissions-Policy |
| SSE token URL query parameter 泄漏 | [[erp-message]] sse_handler | JWT 支持从 URL `?token=` 提取(SSE 兼容) | **已修复:** SSE 响应添加 Cache-Control: no-store |
| PII 字段解密失败静默返回 None | [[erp-health]] patient helper.rs | `.ok().flatten()` 吞掉解密错误无日志 | **已修复:** 提取 `decrypt_field` 辅助函数,失败时输出 warn 日志(2026-05-20) |
| 患者列表负年龄显示 "-72岁" | [[frontend]] format.ts calcAge | 未来出生日期 `dayjs().diff()` 返回负数 | **已修复:** `age < 0` 返回 `'--'`(2026-05-20) |
| 随访页面日期选择器英文占位符 | [[frontend]] FollowUpTaskList | RangePicker 缺少 `placeholder` 属性 | **已修复:** 添加 `placeholder={['开始日期', '结束日期']}`(2026-05-20) |
| 两套告警系统不互通 | [[erp-health]] 告警管线 | 手动录入与设备同步走不同告警表 | **已修复:** critical_alert 双写 alerts 表 + source 字段区分来源 + 设备同步触发危急值检测(Phase 1,2026-05-21) |
| 知情同意未在数据访问层强制执行 | [[erp-health]] consent 拦截 | 撤回同意后数据仍可访问 | **已修复:** handler 层 check_consent_active 默认拒绝 + 现有患者批量 consent 迁移(Phase 2,2026-05-21) |
| 患者电话号码字段缺失 | [[erp-health]] patient entity | DTO 和 Entity 均无 phone 列 | **已修复:** phone 加密存储 + phone_hash 盲索引 + 列表搜索支持(Phase 2,2026-05-21) |
| 积分触发点太少(仅签到) | [[erp-health]] points | earn_points 仅 daily_checkin 调用 | **已修复:** follow_up.completed + care_plan.completed 触发积分(Phase 3,2026-05-21) |
| 随访模板与任务关联断裂 | [[erp-health]] follow_up | task 无 template_id,record 无 form_data | **已修复:** task 增加 template_id FK + record 增加 form_data JSONB + create_task_from_template(Phase 3,2026-05-21) |
| Dead-letter 无自动重试 | [[erp-core]] events | 失败事件永驻无恢复机制 | **已修复:** retry_dead_letters() + 每小时定时任务 + 最多 5 次指数退避(Phase 4,2026-05-21) |
| 生产 KEK 无编译防护 | [[erp-core]] crypto | dev_default 在 release 可用 | **已修复:** dev_default 添加 cfg(debug_assertions) + from_env_or_panic()(Phase 4,2026-05-21) |
| 文章发布无推送闭环 | [[erp-health]] article | article.published 事件无消费者 | **已修复:** 新增 article 事件消费者匹配 patient_tag 推送消息(Phase 4,2026-05-21) |
| 患者批量导入缺失 | [[erp-health]] patient | 体检中心每天 200-500 人只有单条创建 | **已修复:** batch_import_patients + CSV 解析 + 盲索引去重(Phase 5,2026-05-21) |
| 患者自助绑定缺失 | [[erp-health]] patient | 患者无法匹配已有档案 | **已修复:** bind_by_phone 手机号+盲索引匹配(Phase 5,2026-05-21) |
| 咨询满意度评价缺失 | [[erp-health]] consultation | 关闭后无评价入口 | **已修复:** rate_session rating+feedback + 数据库迁移(Phase 5,2026-05-21) |
| 咨询文件上传未实现 | [[erp-health]] consultation | DTO 支持 image/file/voice 但无上传链路 | **已修复:** media_id 附件上传端点 + MIME 白名单(Phase 6,2026-05-21) |
| AI 输出无引用来源 | [[erp-ai]] analysis | LLM 回复无 reference 标注 | **已修复:** system prompt 引用指令 + [ref:id] 格式 + references JSONB 存储(Phase 6,2026-05-21) |
| 工作台行动收件箱 500 | [[erp-health]] action_inbox_service | `count_sql` 缺少 `$4`/`$5` 占位符导致参数绑定数不匹配 | **已修复:** count 查询补齐 8 个参数绑定与 data 查询一致(2026-05-21) |
## 模块导航
### 基础层(继承自 ERP 底座)
- [[erp-core]] — 错误体系 · 事件总线 · 模块 trait · 共享类型
- [[architecture]] — 架构决策 · 设计原则 · 技术选型
### 业务层(继承自 ERP 底座)
- erp-auth — 用户/角色/权限/组织/部门/岗位 · JWT · RBAC · 行级数据权限
- erp-config — 字典/菜单/设置/编号规则/主题/语言
- erp-workflow — BPMN 解析 · Token 驱动 · 任务分配
- erp-message — 消息 CRUD · 模板 · 订阅 · 通知面板
- erp-plugin — WASM 运行时 · 动态表 · 热更新(HMS 保留但非主要扩展方式)
### 核心业务层(HMS 专属)
- [[erp-health]] — **患者管理 · 健康数据 · 预约排班 · 随访管理 · 咨询管理 · 内容管理 · 媒体库 · 轮播图管理 · 积分商城 · 透析管理 · 线下活动 · 日常监测 · 告警系统**(原生 Rust 模块,57 实体 / 31 handler / 36 service,已实现)
- [[erp-ai]] — **AI 智能分析 · 化验单解读 · 趋势分析 · 报告摘要 · AI 对话(ChatPage+AiSidebar) · 会话持久化**(原生 Rust 模块,9 实体 / 62 文件 / 4 AI Provider / chat_handler FC+fallback,Phase 1 MVP)
### 组装层
- [[erp-server]] — Axum 入口 · AppState · 7+ 模块注册 · 后台任务 · 优雅关闭
### 患者端
- [[miniprogram]] — **微信小程序** · Taro 4.2 · 微信登录 · 手机绑定 · 健康数据查看
- [[miniprogram-quality-checklist]] — **小程序质量规范清单** · 12 类 44 条规则 · 66+ fix 提交抽象 · 提交前检查/PR Review/里程碑审计
### 基础设施
- [[infrastructure]] — 连接信息 · 环境变量 · 一键启动 (**单一真相源**)
- [[database]] — SeaORM 迁移 · 多租户表结构(145 迁移)
- [[frontend]] — React 19 SPA · 健康管理页面(29 活跃路由 + 6 冻结 + 工作台组件)
- [[testing]] — 验证清单 · 测试分布 · 性能基准
## 核心架构问答
**为什么 erp-health 用原生模块而非 WASM 插件?** 医疗业务需要 18 强类型实体、自定义 API(趋势分析/统计报表)、文件上传(化验单/体检报告)、未来 AI 集成,超出 WASM 插件能力范围。详见 [[erp-health]]。
**模块间如何通信?** [[erp-core]] EventBus 发布/订阅 DomainEvent。erp-health 发布 `patient.created`、`appointment.confirmed` 等事件,订阅 `workflow.task.completed` 等。详见 [[architecture]]。
**多租户怎么隔离?** 共享数据库 + `tenant_id` 列过滤,中间件从 JWT 注入。详见 [[database]] [[architecture]]。
**患者/医护与 erp-auth 的关系?** 账号走 `users` 表,erp-health 通过 `user_id` 外键关联扩展字段(科室、职称、档案等)。患者可先建档后绑定账号。
## 文档索引
| 类型 | 位置 |
|------|------|
| 健康模块设计规格 | `docs/superpowers/specs/2026-04-23-health-management-module-design.md`(已归档到 `archive/superpowers-completed/`) |
| AI 模块设计规格 | `docs/superpowers/specs/2026-04-25-erp-ai-module-design.md` |
| 内容管理设计规格 | `docs/superpowers/specs/2026-04-26-content-management-design.md` |
| 媒体库+轮播图设计规格 | `docs/superpowers/specs/2026-05-10-media-library-banner-design.md` |
| Copilot 基因化设计 | `docs/superpowers/specs/2026-05-11-copilot-gene-design.md` |
| 六维度全面均衡分析 | `docs/superpowers/specs/2026-05-11-system-comprehensive-analysis-design.md`(6.9/10 B,六维度评估) |
| V1 发布就绪度六维度分析 | `docs/superpowers/specs/2026-05-20-v1-readiness-six-dimension-analysis.md`(6.3/10 B-,V1 CONDITIONAL GO) |
| PII 加密扩展规格 | `docs/superpowers/specs/2026-04-26-pii-encryption-expansion-design.md` |
| 设计规格(活跃) | `docs/superpowers/specs/` (33 份) |
| 实施计划(活跃) | `docs/superpowers/plans/` (30 份) |
| UI/UX 重构设计规格 | `docs/superpowers/specs/2026-04-28-ui-ux-overhaul-design.md` |
| UI/UX 重构实施计划 | `docs/superpowers/plans/2026-04-28-ui-ux-overhaul-plan.md` |
| 全系统审计报告(V1) | `docs/archive/audits-v1/08-audit-report-2026-04-30.md`(已归档) |
| 全系统审计报告(V2) | `docs/audits/v2/13-final-report.md`(85% 总体完成度,P0 安全修复已完成) |
| 讨论记录 | `docs/discussions/` (42 份) |
| 事件注册表 | `docs/event-registry.md` |
| 角色测试计划(全量) | `docs/qa/role-test-plans/` (R01-R05) |
| 角色测试结果 | `docs/qa/role-test-results/` (R01 100% / R02 100% / R03 90.9% / R04 90.0% / R05 72.7% → 修复后待复测) |
| 协作规则 | `CLAUDE.md` |
| 插件制作指南 | `.claude/skills/plugin-development/SKILL.md` |
| **归档** | |
| 早期 CRM/插件设计 | `docs/archive/superpowers-early/` (13 份,4月13-20日早期迭代) |
| 已完成设计/计划 | `docs/archive/superpowers-completed/` (28 份,已实施完成) |
| V1 审计报告 | `docs/archive/audits-v1/` (13 份,已被 V2 取代) |
| 早期讨论/测试报告 | `docs/archive/discussions-early/` + `docs/archive/test-reports-early/` |