Files
hms/wiki/index.md
2026-05-21 12:25:41 +08:00

202 lines
24 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 健康管理平台 — 知识库
> **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 个** Entity32 handler / 41 service / 22 DTO214 文件) |
| erp-ai 实体 | 9 个 Entity62 文件4 AI Providerchat_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 18167 个 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 结构 token75 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 0HIGH×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 审查 | 原生 `<input type='date'>` | **已修复:** 替换为 `<Picker mode='date'>` |
| 透析记录列表过滤不准 | [[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 chainclaude→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 12026-05-21 |
| 知情同意未在数据访问层强制执行 | [[erp-health]] consent 拦截 | 撤回同意后数据仍可访问 | **已修复:** handler 层 check_consent_active 默认拒绝 + 现有患者批量 consent 迁移Phase 22026-05-21 |
| 患者电话号码字段缺失 | [[erp-health]] patient entity | DTO 和 Entity 均无 phone 列 | **已修复:** phone 加密存储 + phone_hash 盲索引 + 列表搜索支持Phase 22026-05-21 |
| 积分触发点太少(仅签到) | [[erp-health]] points | earn_points 仅 daily_checkin 调用 | **已修复:** follow_up.completed + care_plan.completed 触发积分Phase 32026-05-21 |
| 随访模板与任务关联断裂 | [[erp-health]] follow_up | task 无 template_idrecord 无 form_data | **已修复:** task 增加 template_id FK + record 增加 form_data JSONB + create_task_from_templatePhase 32026-05-21 |
| Dead-letter 无自动重试 | [[erp-core]] events | 失败事件永驻无恢复机制 | **已修复:** retry_dead_letters() + 每小时定时任务 + 最多 5 次指数退避Phase 42026-05-21 |
| 生产 KEK 无编译防护 | [[erp-core]] crypto | dev_default 在 release 可用 | **已修复:** dev_default 添加 cfg(debug_assertions) + from_env_or_panic()Phase 42026-05-21 |
| 文章发布无推送闭环 | [[erp-health]] article | article.published 事件无消费者 | **已修复:** 新增 article 事件消费者匹配 patient_tag 推送消息Phase 42026-05-21 |
| 患者批量导入缺失 | [[erp-health]] patient | 体检中心每天 200-500 人只有单条创建 | **已修复:** batch_import_patients + CSV 解析 + 盲索引去重Phase 52026-05-21 |
| 患者自助绑定缺失 | [[erp-health]] patient | 患者无法匹配已有档案 | **已修复:** bind_by_phone 手机号+盲索引匹配Phase 52026-05-21 |
| 咨询满意度评价缺失 | [[erp-health]] consultation | 关闭后无评价入口 | **已修复:** rate_session rating+feedback + 数据库迁移Phase 52026-05-21 |
| 咨询文件上传未实现 | [[erp-health]] consultation | DTO 支持 image/file/voice 但无上传链路 | **已修复:** media_id 附件上传端点 + MIME 白名单Phase 62026-05-21 |
| AI 输出无引用来源 | [[erp-ai]] analysis | LLM 回复无 reference 标注 | **已修复:** system prompt 引用指令 + [ref:id] 格式 + references JSONB 存储Phase 62026-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+fallbackPhase 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/` |