docs: 全面更新 wiki 文档至当前实现状态
9 个 wiki 页面全部更新: - index: 关键数字更新(15 crate/48 表/50 迁移/6 模块) - erp-health: 从"规划中"更新为"已实现"(18 实体/14 权限) - erp-server: 6 模块注册/8 环境变量/5 后台任务 - database: 50 迁移/48 表/健康模块迁移(m000042-m000050) - frontend: 10 健康路由/12 共享组件/7 健康 API/3 单元测试 - miniprogram: 20 页面/10 服务/9 组件 - testing: 93 后端测试+3 前端测试/全链路验证结果 - erp-core: 新增 erp-health 集成契约 - architecture: 6 模块实现状态表/预约 CAS/PII 加密
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
---
|
||||
title: erp-health 健康管理模块
|
||||
updated: 2026-04-23
|
||||
status: developing
|
||||
updated: 2026-04-25
|
||||
status: implemented
|
||||
tags: [health, patient, appointment, follow-up, consultation]
|
||||
---
|
||||
|
||||
@@ -17,7 +17,7 @@ tags: [health, patient, appointment, follow-up, consultation]
|
||||
|
||||
| WASM 插件限制 | 健康模块需求 |
|
||||
|---------------|-------------|
|
||||
| 实体上限 20 个 | 16+ 强类型医疗实体 |
|
||||
| 实体上限 20 个 | 18 强类型医疗实体 |
|
||||
| JSONB 动态存储 | 医疗数据需要强类型、索引、关联 |
|
||||
| 无自定义 API | 趋势分析、统计报表需专用端点 |
|
||||
| 无文件上传 | 化验单、体检报告需存储 |
|
||||
@@ -30,8 +30,9 @@ tags: [health, patient, appointment, follow-up, consultation]
|
||||
### 核心架构选择
|
||||
|
||||
- **原生 Rust crate** — 与 erp-auth、erp-workflow 同等地位,直接访问数据库
|
||||
- **固有方法暴露路由** — `public_routes()` / `protected_routes()`,在 erp-server 中 `.nest("/api/v1/health", ...)`
|
||||
- **ErpModule trait 实现** — `HealthModule` 在 erp-server 注册,路由挂载到 `/api/v1/health`
|
||||
- **EventBus 通信** — 发布 `patient.created`、`appointment.confirmed` 等,订阅 `workflow.task.completed`
|
||||
- **HealthCrypto** — AES-256-GCM 加密 + HMAC-SHA256 哈希,保护 PII 数据
|
||||
|
||||
## 2. 关键文件 + 数据流
|
||||
|
||||
@@ -40,17 +41,22 @@ tags: [health, patient, appointment, follow-up, consultation]
|
||||
```
|
||||
crates/erp-health/
|
||||
├── src/
|
||||
│ ├── lib.rs ← ErpModule trait + routes()
|
||||
│ ├── error.rs ← HealthError → AppError
|
||||
│ ├── state.rs ← HealthState
|
||||
│ ├── entity/ ← 16 个 SeaORM Entity
|
||||
│ ├── service/ ← 5 个业务 service
|
||||
│ ├── handler/ ← 5 个路由 handler
|
||||
│ ├── dto/ ← 请求/响应结构体
|
||||
│ └── event.rs ← 事件定义和处理器
|
||||
│ ├── lib.rs ← 模块导出 (HealthCrypto, HealthModule, HealthState)
|
||||
│ ├── module.rs ← ErpModule trait 实现, 14 权限码, 全部路由定义
|
||||
│ ├── error.rs ← HealthError (17 变体) → AppError
|
||||
│ ├── state.rs ← HealthState { db, event_bus, crypto }
|
||||
│ ├── crypto.rs ← AES-256-GCM 加密 + HMAC-SHA256 (PII 保护)
|
||||
│ ├── event.rs ← 事件处理器 (订阅 workflow/message 事件)
|
||||
│ ├── entity/ ← 18 个 SeaORM Entity (872 行)
|
||||
│ ├── service/ ← 11 个业务 service (4122 行)
|
||||
│ ├── handler/ ← 7 个路由 handler (1493 行)
|
||||
│ ├── dto/ ← 7 个请求/响应 DTO (814 行)
|
||||
│ ├── validation.rs ← 输入验证逻辑 (302 行, 57 纯函数测试)
|
||||
│ ├── masking.rs ← PII 数据脱敏 (手机号/身份证)
|
||||
│ └── seed.rs ← 租户种子数据 + 软删除清理
|
||||
```
|
||||
|
||||
### 实体模型(16 张表)
|
||||
### 实体模型(18 个实体,对应数据库表 + 1 个文章实体)
|
||||
|
||||
| 域 | 实体 |
|
||||
|----|------|
|
||||
@@ -60,12 +66,25 @@ crates/erp-health/
|
||||
| 预约排班 | appointment, doctor_schedule |
|
||||
| 随访管理 | follow_up_task, follow_up_record |
|
||||
| 咨询管理 | consultation_session, consultation_message |
|
||||
| 内容管理 | article |
|
||||
|
||||
### 权限码(14 个)
|
||||
|
||||
| 权限码 | 说明 |
|
||||
|--------|------|
|
||||
| `health.patient.list` / `health.patient.manage` | 患者查看/管理 |
|
||||
| `health.health-data.list` / `health.health-data.manage` | 健康数据查看/管理 |
|
||||
| `health.appointment.list` / `health.appointment.manage` | 预约查看/管理 |
|
||||
| `health.follow-up.list` / `health.follow-up.manage` | 随访查看/管理 |
|
||||
| `health.consultation.list` / `health.consultation.manage` | 咨询查看/管理 |
|
||||
| `health.doctor.list` / `health.doctor.manage` | 医护查看/管理 |
|
||||
| `health.articles.list` / `health.articles.manage` | 文章查看/管理 |
|
||||
|
||||
### 集成契约
|
||||
|
||||
| 方向 | 模块 | 接口 | 触发时机 |
|
||||
|------|------|------|---------|
|
||||
| 提供 → | [[erp-server]] | `protected_routes()` | 启动时注册 `/api/v1/health/*` |
|
||||
| 提供 → | [[erp-server]] | `HealthModule` | 启动时注册 `/api/v1/health/*` |
|
||||
| 调用 → | [[erp-core]] | EventBus | 发布/订阅领域事件 |
|
||||
| 关联 → | erp-auth | `users` 表 (user_id FK) | 患者/医护关联账号 |
|
||||
| 订阅 ← | erp-workflow | `workflow.task.completed` | 随访任务状态更新 |
|
||||
@@ -76,47 +95,84 @@ crates/erp-health/
|
||||
### API 前缀: `/api/v1/health/`
|
||||
|
||||
关键端点分组:
|
||||
- `/patients` — 患者列表/详情/标签管理/健康摘要
|
||||
- `/patients/:id/vital-signs` — 日常监测数据(血压/心率/体重/血糖)
|
||||
- `/patients/:id/lab-reports` — 化验报告(JSONB 指标数据)
|
||||
- `/patients/:id/trends` — 健康趋势报告(自动/手动生成)
|
||||
- `/appointments` — 预约管理(状态机: pending→confirmed→completed)
|
||||
- `/doctor-schedules` — 排班管理(日历视图)
|
||||
- `/follow-up-tasks` — 随访任务(逾期自动标记)
|
||||
- `/consultation-sessions` — 咨询会话管理
|
||||
- `/patients` — 患者列表/详情/标签管理/健康摘要/家庭成团/医生关联
|
||||
- `/patients/{id}/vital-signs` — 日常监测数据(血压/心率/体重/血糖)
|
||||
- `/patients/{id}/lab-reports` — 化验报告(JSONB 指标数据)
|
||||
- `/patients/{id}/health-records` — 健康档案
|
||||
- `/patients/{id}/trends` — 健康趋势报告(自动/手动生成,时间序列查询)
|
||||
- `/vital-signs/trend` — 小程序趋势(JWT user → patient)
|
||||
- `/vital-signs/today` — 小程序当日体征摘要
|
||||
- `/appointments` — 预约管理 + 状态变更(pending→confirmed→completed/cancelled/no_show)
|
||||
- `/appointments/{id}/status` — 预约状态流转(乐观锁)
|
||||
- `/doctor-schedules` — 排班管理 CRUD + 日历视图
|
||||
- `/doctor-schedules/calendar` — 月度排班日历
|
||||
- `/follow-up-tasks` — 随访任务 CRUD + 逾期自动标记
|
||||
- `/follow-up-tasks/{id}/records` — 随访记录
|
||||
- `/consultation-sessions` — 咨询会话管理 + 消息 + 导出 + 关闭
|
||||
- `/consultation-messages` — 咨询消息发送
|
||||
- `/doctors` — 医护档案 CRUD
|
||||
- `/articles` — 健康文章 CRUD
|
||||
|
||||
### 预约并发控制
|
||||
|
||||
创建预约时使用原子 CAS:`UPDATE doctor_schedule SET current_appointments = current_appointments + 1 WHERE id = $1 AND current_appointments < max_appointments RETURNING *`
|
||||
创建预约时使用原子 CAS(事务内):
|
||||
1. 查找匹配日期+时段的排班
|
||||
2. 原子 `UPDATE current_appointments + 1 WHERE current < max`
|
||||
3. CAS 成功后 INSERT 预约记录
|
||||
4. 事务保证 CAS + INSERT 原子性
|
||||
|
||||
### 随访自动链接
|
||||
### 预约状态机
|
||||
|
||||
`follow_up_record.next_follow_up_date` 不为空时,自动创建新的 `follow_up_task`。
|
||||
```
|
||||
pending → confirmed → completed
|
||||
→ no_show → confirmed (重新确认)
|
||||
→ cancelled
|
||||
pending → cancelled
|
||||
```
|
||||
|
||||
### 权限码
|
||||
### PII 数据保护
|
||||
|
||||
`health.patient.list/manage` · `health.health-data.list/manage` · `health.appointment.list/manage` · `health.follow-up.list/manage` · `health.consultation.list/manage` · `health.doctor.list/manage`
|
||||
- `HealthCrypto`: AES-256-GCM 加密敏感字段,HMAC-SHA256 哈希身份证号
|
||||
- `masking.rs`: 手机号脱敏 `138****1234`,身份证脱敏 `110****1111`
|
||||
- 生产密钥通过环境变量 `ERP__HEALTH__AES_KEY` / `ERP__HEALTH__HMAC_KEY` 配置
|
||||
|
||||
### 后台任务
|
||||
|
||||
- 随访逾期检查器 — 每 5 分钟扫描 `follow_up_task` 中超过 `planned_date` 仍未完成的任务
|
||||
|
||||
⚡ **不变量**: 预约创建必须走原子 CAS,不能用 read-then-write
|
||||
⚡ **不变量**: `patient.user_id` 允许 NULL(先建档后绑定)
|
||||
⚡ **不变量**: `consultation_message` 对 `created_at` 按月分区,超 1 年归档
|
||||
⚡ **不变量**: `doctor_id` 在创建预约时必填(关联排班做 CAS)
|
||||
⚡ **不变量**: 状态流转必须带 `version` 字段(乐观锁)
|
||||
|
||||
## 4. 活跃问题 + 陷阱
|
||||
|
||||
### 当前状态: 🔧 开发中
|
||||
### 当前状态: ✅ 已完成
|
||||
|
||||
设计规格已确认,尚未开始编码。
|
||||
18 实体、14 权限、13 Web 页面、20 小程序页面,全链路流通性验证通过。
|
||||
|
||||
### 待解决
|
||||
### 待优化
|
||||
|
||||
| 问题 | 级别 | 说明 |
|
||||
|------|------|------|
|
||||
| 文件上传基础能力 | P1 | 化验单/体检报告需要文件存储服务 |
|
||||
| ECharts 趋势图 | P1 | 前端健康趋势可视化 |
|
||||
| 导出功能 | P2 | 随访台账/咨询记录导出 Excel |
|
||||
| 健康趋势图 ECharts | P1 | 小程序已有 echarts 集成,Web 端待接入 |
|
||||
| 咨询导出 Excel | P2 | 后端已有 `rust_xlsxwriter` 依赖,导出端点已实现 |
|
||||
|
||||
### 全链路验证结果(2026-04-25)
|
||||
|
||||
| 链路 | API | 前端 UI | 状态 |
|
||||
|------|-----|---------|------|
|
||||
| 医生 CRUD | 创建/搜索/编辑 | 医护管理页面 | ✅ |
|
||||
| 排班管理 | 创建/列表/日历 | 排班管理页面 | ✅ |
|
||||
| 预约管理 | 创建+状态流转 | 预约列表/新建弹窗 | ✅ |
|
||||
| 随访管理 | 创建→进行→完成 | 随访列表/操作 | ✅ |
|
||||
| 咨询管理 | 创建会话+消息 | 咨询列表/导出 | ✅ |
|
||||
| 患者详情 | 详情/编辑/标签 | 详情页+健康数据标签 | ✅ |
|
||||
|
||||
## 5. 变更记录
|
||||
|
||||
| 日期 | 变更 |
|
||||
|------|------|
|
||||
| 2026-04-25 | 全面更新为已实现状态:18 实体、14 权限、全链路验证通过 |
|
||||
| 2026-04-23 | 创建模块 wiki 页,设计规格确认 |
|
||||
|
||||
Reference in New Issue
Block a user