Files
hms/docs/superpowers/specs/2026-04-25-hms-v2-iteration-design.md
iven 16c63925ce
Some checks failed
CI / rust-check (push) Has been cancelled
CI / rust-test (push) Has been cancelled
CI / frontend-build (push) Has been cancelled
CI / security-audit (push) Has been cancelled
feat(health): V2 血透专科数据模型 — dialysis_record + lab_report 审阅流程
- 新增 dialysis_record 表和完整 CRUD API(透析日期/体重/血压/超滤量/透析类型/症状)
- ALTER lab_report 增加 source/status/reviewed_by/reviewed_at 字段
- 重命名 lab_report: indicators→items, doctor_interpretation→doctor_notes
- 新增透析记录审阅端点 PUT /dialysis-records/{id}/review
- 新增化验报告审阅端点 PUT /patients/{id}/lab-reports/{rid}/review
- 化验报告 items JSON 支持 V2 结构(name/value/unit/reference/is_abnormal)
- 迁移 m000051 含完整 up/down 回滚
- 94 个后端测试全部通过,API 全链路验证通过
2026-04-25 13:45:11 +08:00

24 KiB
Raw Blame History

HMS V2 迭代设计 — 血透专科健康管理平台

日期: 2026-04-25 状态: 待评审 前置文档: 2026-04-23-health-management-module-design.md, 2026-04-24-health-module-iteration-design.md 需求来源: 客户功能需求文档 docs/健康管理/管理系统功能文档(1).xlsx


1. 背景与动机

1.1 业务定位变化

V1 的健康管理模块定位为通用健康管理平台,覆盖患者管理、健康数据、预约排班、随访管理、咨询管理五大功能。

客户反馈后,明确业务定位为血透(透析)专科健康管理平台,面向肾病/透析患者和医护群体。这带来三个重大变化:

  1. 数据模型专科化 — 从通用健康指标(血压/心率/血糖/体重/体温)扩展为血透专科指标(透析记录、化验报告、日常监测)
  2. 新增积分商城 — 替代原计划的完整电商,用积分体系驱动患者活跃度
  3. 新增医护端小程序 — 独立入口,医护可查看患者数据、填写透析记录、回复咨询

1.2 客户需求来源

客户通过 Excel 功能文档定义了三端需求:

核心功能
患者端小程序 首页、数据上报(透析/化验/日常)、在线咨询、积分商城、预约与随访、个人中心
医护端小程序 数据概览、患者管理、咨询回复、随访管理、报告解读
PC 管理后台 系统管理、患者管理、健康数据中心、咨询管理、商城管理、内容管理、统计报表、系统设置

2. 需求-实现差距分析

2.1 已有功能匹配度

客户需求 已有实现 匹配度 需要的工作
患者列表/档案 Patient CRUD + 18 实体 90% 微调
在线咨询(图文) Consultation 模块 70% 加语音/客服通道
预约管理 Appointment 模块 60% 加透析专项预约
随访任务/台账 Follow-up 模块 80% 微调
科普文章 Article 模块 90% 微调
医护管理 Doctor 模块 80% 微调
账号权限/操作日志 erp-auth RBAC 95% 基本不变
患者标签 Tag 模块 90% 微调
小程序健康数据 6 种指标录入 + ECharts 趋势图 80% 扩展指标 + 透析数据

2.2 全新模块

模块 说明 复杂度
血透透析记录 透析日期/时间、干体重、透前/后血压、心率、超滤量、症状
日常监测扩展 饮水量、尿量 + 打卡模式
化验报告上传 拍照上传 + 指标录入
积分商城 积分获取、商品兑换、二维码核销
线下活动 活动管理、报名、扫码签到
在线咨询IM 客服通道、医生通道、图文/语音消息
医护端小程序 独立小程序,医护专属功能
统计报表中心 患者增长、咨询量、随访完成率、商城销售 中-高

3. 积分商城设计

3.1 核心链路

赚积分 → 攒积分 → 花积分 → 核销

3.2 实现方式

放在 erp-health 原生模块内,直接复用现有患者体系和事件机制。

3.3 积分获取渠道(数据库可配置)

渠道 积分 说明
每日健康打卡 可配置/天 完成日常监测数据填写触发
数据上报 可配置/次 上传化验单、填透析记录
线下活动签到 活动配置 到院参加讲座/义诊等
连续打卡奖励 阶梯配置 连续 7/14/30 天额外加分
医生互动 可配置/次 完成一次咨询、回复随访问卷

积分获取规则通过 points_rule 表配置,管理员可在 PC 端调整积分值、每日上限、连续奖励等参数。

3.4 兑换品类

类型 兑换物 履约方式
实物 血透护理用品、肾病食品、慢病器械 到院自提(二维码核销)
服务券 免费抽血、肾功能检查、营养咨询 生成预约券 → 线下二维码核销
权益 免费停车券、优先预约权 虚拟权益即时生效

3.5 核销方式

用户兑换后生成二维码UUID到院后工作人员扫码核销。

服务券类型核销后可自动关联预约系统创建预约。

3.6 积分过期机制

滚动 12 个月过期FIFO 先进先出结算。

  • 每笔积分earn有独立 expires_at(创建时间 + 12 个月)
  • 每日后台任务扫描并标记过期积分
  • 消费时从最老的未过期积分开始扣减
  • 每笔积分支持部分消费(remaining_amount 字段)

3.7 数据模型8 张新表)

points_account积分账户

字段 类型 说明
id UUID v7 PK
patient_id UUID FK → patient唯一约束
balance i32 当前可用积分
total_earned i32 累计获得
total_spent i32 累计消耗
total_expired i32 累计过期
version i32 乐观锁
tenant_id UUID 租户
created_at / updated_at / created_by / updated_by / deleted_at 标准字段

points_rule积分规则数据库可配置

字段 类型 说明
id UUID v7 PK
event_type String 触发事件daily_checkin / data_report / lab_upload / event_checkin / consultation_complete / followup_complete
name String 规则名称(展示用)
description String 规则描述
points_value i32 单次获得积分
daily_cap i32 每日上限0 = 无限制)
streak_7d_bonus i32 连续 7 天额外奖励
streak_14d_bonus i32 连续 14 天额外奖励
streak_30d_bonus i32 连续 30 天额外奖励
is_active bool 是否启用
tenant_id UUID 租户
标准字段

points_transaction积分流水FIFO 桶模型)

字段 类型 说明
id UUID v7 PK
account_id UUID FK → points_account
type Enum earn / spend / expired / refund
amount i32 正数=获得,负数=消耗
remaining_amount i32 该笔积分剩余可用量earn 类型)
status Enum active / expired / consumed
expires_at DateTime 过期时间earn 类型:创建 + 12 个月)
balance_after i32 操作后账户余额快照
rule_id UUID FK → points_ruleearn 类型)
order_id UUID FK → points_orderspend 类型,可空)
description String 流水描述
tenant_id UUID 租户
标准字段

points_product兑换商品

字段 类型 说明
id UUID v7 PK
name String 商品名称
type Enum physical / service / privilege
points_cost i32 兑换所需积分
stock i32 库存数量(-1 = 无限)
image_url String 商品图片
description Text 商品描述
service_config JSON 服务类型配置service 类型:关联检查项目、有效期等)
is_active bool 是否上架
sort_order i32 排序权重
tenant_id UUID 租户
标准字段

points_order兑换订单

字段 类型 说明
id UUID v7 PK
patient_id UUID FK → patient
product_id UUID FK → points_product
points_cost i32 消耗积分(冗余,防商品价格变化)
status Enum pending / verified / cancelled / expired
qr_code UUID 核销二维码UUID v4
verified_by UUID 核销人 FK → user
verified_at DateTime 核销时间
expires_at DateTime 订单过期时间(实物/服务券有效期)
notes String 备注
tenant_id UUID 租户
标准字段

points_checkin每日打卡

字段 类型 说明
id UUID v7 PK
patient_id UUID FK → patient
checkin_date Date 打卡日期
consecutive_days i32 连续打卡天数(计算值)
tenant_id UUID 租户
created_at DateTime

唯一约束:(patient_id, checkin_date)

offline_event线下活动

字段 类型 说明
id UUID v7 PK
title String 活动标题
description Text 活动描述
event_date Date 活动日期
start_time / end_time Time 活动时间
location String 活动地点
points_reward i32 参与奖励积分
max_participants i32 最大参与人数0 = 无限制)
current_participants i32 已报名人数
status Enum draft / published / ongoing / completed / cancelled
image_url String 活动封面图
tenant_id UUID 租户
标准字段

offline_event_registration活动报名 + 签到)

字段 类型 说明
id UUID v7 PK
event_id UUID FK → offline_event
patient_id UUID FK → patient
status Enum registered / checked_in / cancelled
checked_in_at DateTime 签到时间
checked_in_by UUID 签到确认人 FK → user
points_granted bool 是否已发放积分
tenant_id UUID 租户
标准字段

唯一约束:(event_id, patient_id)

3.8 积分获取链路

健康打卡 → 触发事件 → points_rule 匹配规则 → 写入 points_transaction → 更新 points_account.balance
数据上报 → 同上                                          ↓
咨询完成 → 同上                                     连续打卡检查
线下签到 → 同上                                     → 达到 7/14/30 天?
                                                    → 额外 bonus transaction

3.9 兑换核销链路

用户浏览商品 → 兑换(扣积分)→ 生成 points_order + QRUUID v4
                                        ↓
                            用户到院出示二维码
                                        ↓
                            工作人员扫码(小程序/PC→ 状态变 verified
                                        ↓
                            type=service → 自动创建预约券
                            type=physical → 库存扣减

3.10 后台任务

任务 频率 说明
积分过期扫描 每日 扫描 expires_at < now 的 earn 记录,标记 expired扣减 balance
订单过期扫描 每日 扫描未核销且过期的订单,标记 expired退还积分
连续打卡计算 每日 计算各患者连续打卡天数,触发阶梯奖励

3.11 API 端点

患者端:

方法 路径 说明
GET /api/v1/points/account 查看我的积分账户
POST /api/v1/points/checkin 每日打卡
GET /api/v1/points/checkin/status 打卡状态(连续天数等)
GET /api/v1/points/transactions 积分流水(分页)
GET /api/v1/points/products 商品列表(分页、按类型筛选)
GET /api/v1/points/products/{id} 商品详情
POST /api/v1/points/exchange 兑换商品
GET /api/v1/points/orders 我的兑换订单
GET /api/v1/points/orders/{id} 订单详情(含二维码)
GET /api/v1/offline-events 线下活动列表
GET /api/v1/offline-events/{id} 活动详情
POST /api/v1/offline-events/{id}/register 报名活动

医护/管理员端:

方法 路径 说明
POST /api/v1/points/verify 扫码核销
CRUD /api/v1/admin/points/rules 积分规则管理
CRUD /api/v1/admin/points/products 商品管理
GET /api/v1/admin/points/orders 订单管理(导出)
GET /api/v1/admin/points/statistics 积分统计
CRUD /api/v1/admin/offline-events 线下活动管理
POST /api/v1/admin/offline-events/{id}/checkin 活动扫码签到

3.12 PC 管理后台新增页面

页面 功能
积分规则管理 增删改规则、启用/禁用、调整积分值和上限
商品管理 增删改兑换品、设置库存、上传图片、设置积分价格
订单管理 查看兑换记录、手动核销、导出
线下活动管理 创建活动、设置积分奖励、查看报名/签到名单
积分统计 总发放/总消耗/活跃用户排行、积分流水查询

4. 血透专科数据模型

4.1 设计决策

  • 独立实体表:不复用现有 health_data 键值对结构,每类数据一张独立表
  • 医护+患者协同上报:透析记录由医护填写,化验报告由患者上传/医护审阅,日常监测由患者填写

4.2 权限矩阵

数据 患者端 医护端 PC 管理后台
透析记录 查看(只读) 创建/编辑 查看/导出/统计
化验报告 上传照片/查看 审阅/标注/解读 查看/导出
日常监测 创建/查看 查看/预警 查看/统计
AI 健康报告 查看 查看/编辑 查看/导出

4.3 新增实体

dialysis_record透析记录

字段 类型 说明
id UUID v7 PK
patient_id UUID FK → patient
dialysis_date Date 透析日期
start_time Time 开始时间
end_time Time 结束时间
dry_weight Decimal(5,1) 干体重 (kg)
pre_weight Decimal(5,1) 透前体重 (kg)
post_weight Decimal(5,1) 透后体重 (kg)
pre_bp_systolic i32 透前收缩压
pre_bp_diastolic i32 透前舒张压
post_bp_systolic i32 透后收缩压
post_bp_diastolic i32 透后舒张压
pre_heart_rate i32 透前心率
post_heart_rate i32 透后心率
ultrafiltration_volume i32 超滤量 (ml)
dialysis_duration i32 透析时长 (min)
blood_flow_rate i32 血流量 (ml/min)
dialysis_type Enum HD / HDF / HF
symptoms JSON 不适症状数组 ["低血压","恶心","抽筋"]
complication_notes Text 并发症备注
status Enum draft / completed / reviewed
reviewed_by UUID FK → user审阅医生
reviewed_at DateTime 审阅时间
tenant_id UUID 租户
标准字段 created_at / updated_at / created_by / updated_by / deleted_at / version

lab_report化验报告

字段 类型 说明
id UUID v7 PK
patient_id UUID FK → patient
report_date Date 化验日期
report_type Enum kidney_function / blood_routine / electrolyte / liver_function / other
source Enum manual_input / photo_upload
image_urls JSON 化验单照片 URL 数组
items JSON 指标数据数组(见下方结构)
doctor_notes Text 医生解读/批注
reviewed_by UUID FK → user审阅医生
reviewed_at DateTime 审阅时间
status Enum pending / reviewed
tenant_id UUID 租户
标准字段

items JSON 结构:

[
  {
    "name": "肌酐",
    "value": "856",
    "unit": "μmol/L",
    "reference_low": 44,
    "reference_high": 133,
    "is_abnormal": true
  },
  {
    "name": "血钾",
    "value": "6.2",
    "unit": "mmol/L",
    "reference_low": 3.5,
    "reference_high": 5.3,
    "is_abnormal": true
  }
]

daily_monitoring日常监测

字段 类型 说明
id UUID v7 PK
patient_id UUID FK → patient
record_date Date 记录日期
morning_bp_systolic i32 晨起收缩压
morning_bp_diastolic i32 晨起舒张压
evening_bp_systolic i32 晚间收缩压
evening_bp_diastolic i32 晚间舒张压
weight Decimal(5,1) 体重 (kg)
blood_sugar Decimal(4,1) 血糖 (mmol/L)
fluid_intake i32 饮水量 (ml)
urine_output i32 尿量 (ml)
notes Text 备注
tenant_id UUID 租户
标准字段

唯一约束:(patient_id, record_date)

4.4 与现有模块的关系

patient已有
  ├── dialysis_record新增   1:N  每次透析一条
  ├── lab_report新增        1:N  每次化验一份
  ├── daily_monitoring新增  1:N  每天一条
  ├── health_data已有保留 1:N  通用指标仍可用
  ├── appointment已有       1:N  透析预约走这里
  └── follow_up已有         1:N  随访任务

4.5 化验报告 items 用 JSON 的原因

  • 化验项目数量和类型因报告而异(肾功能 8 项 vs 血常规 20+ 项)
  • 不需要按单个指标做复杂查询(都是按患者+日期范围查整份报告)
  • JSON 内含 is_abnormal 标记,前端直接渲染异常标红
  • PostgreSQL JSONB 支持按单个指标查询趋势(未来可加物化视图展平)

4.6 数据上报协同流程

透析记录:医护在医护端小程序/PC 填写 → 患者端只读查看

化验报告:患者拍照上传照片 + 手动填写指标 → 医护审阅/标注/解读 → 患者查看异常标红+医生解读

日常监测:患者每日填写(血压/体重/血糖/饮水量/尿量)→ 触发积分获取 → 医护端查看趋势+异常预警

4.7 新增 API 端点

透析记录:

方法 路径 说明
GET /api/v1/health/patients/{id}/dialysis-records 患者透析记录列表
GET /api/v1/health/dialysis-records/{id} 透析记录详情
POST /api/v1/health/dialysis-records 创建透析记录(医护)
PUT /api/v1/health/dialysis-records/{id} 更新透析记录(医护)

化验报告:

方法 路径 说明
GET /api/v1/health/patients/{id}/lab-reports 患者化验报告列表
GET /api/v1/health/lab-reports/{id} 报告详情
POST /api/v1/health/lab-reports 上传化验报告(患者/医护)
PUT /api/v1/health/lab-reports/{id}/review 医生审阅(标注+解读)

日常监测:

方法 路径 说明
GET /api/v1/health/patients/{id}/daily-monitoring 患者日常监测列表
POST /api/v1/health/daily-monitoring 上报日常监测(患者)
GET /api/v1/health/daily-monitoring/trend 趋势数据查询

5. 小程序迭代设计

5.1 患者端小程序

新 TabBar 结构

首页 | 上报 | 咨询 | 商城 | 我的

替换现有:首页 | 健康 | 预约 | 资讯 | 我的

首页(改造)

  • 公告轮播Banner 组件)
  • 功能入口 Grid数据上报、我的医生、在线咨询、血透预约、积分商城
  • 今日健康打卡入口(未打卡时醒目提示)
  • 健康概览卡片:血压、体重、最近透析记录
  • 今日提醒列表:透析预约、血压测量、用药提醒

上报 Tab改造自"健康"

  • 打卡区:血压/体重/血糖/饮水/尿量 快捷填写入口
  • 数据类型切换:日常监测 / 透析记录(只读)/ 化验报告
  • 趋势图ECharts血压/体重/血糖 折线图
  • 子页面:
    • 日常监测填写表单
    • 化验报告上传(拍照 + 指标填写)
    • 透析记录详情(只读)
    • 化验报告详情(含医生批注)
    • 趋势分析详情(大图 + AI 解读)

咨询 Tab全新

  • 咨询类型切换:医生 / 客服
  • 最近对话列表(未读红点)
  • 子页面:
    • 选择医生
    • 聊天界面(图文/语音 + 上传报告)
    • 客服对话

商城 Tab全新

  • 我的积分 + 签到按钮
  • 商品分类:全部 / 实物 / 检查 / 权益
  • 商品列表(网格)
  • 线下活动入口
  • 子页面:
    • 商品详情 + 兑换
    • 兑换确认(生成二维码)
    • 我的订单(待核销/已核销/已过期)
    • 线下活动详情 + 报名
    • 积分明细

我的 Tab改造

  • 个人信息 + 积分展示 + 连续打卡天数
  • 就诊人管理(已有)
  • 健康档案
  • 我的医生
  • 我的预约(从 TabBar 降级为菜单入口)
  • 我的报告(已有)
  • 我的随访(已有)
  • 我的订单(积分商城)
  • 消息通知(新增)
  • 用药提醒(已有,需接入后端)
  • 设置(已有)

5.2 医护端小程序V2

医护端为独立小程序(独立 AppIDV2 实现。V1 阶段医护功能通过 PC 管理后台覆盖。

V2 页面结构(约 18 页)

TabBar概览 | 患者 | 咨询 | 随访 | 我的

  • 概览:今日待回复咨询数、异常预警列表、今日透析患者数、随访任务数
  • 患者:患者列表(按透析/高危/标签筛选)、患者详情(档案+透析记录+化验+趋势图+标签)、填写透析记录、报告解读
  • 咨询:未读消息列表、图文/语音回复、发送科普文章
  • 随访:随访任务列表、填写记录、台账导出
  • 我的:医生信息、我的患者、排班日历、科普文章管理

5.3 页面工作量统计

改造页 新增页 总计
患者端 5首页/健康/我的/预约/资讯改造) ~15咨询3+商城6+上报子页4+通知2 ~20 页
医护端V2 0 18 18 页

6. 在线咨询设计V2 详情待补充)

6.1 核心需求

  • 客服通道:订单/物流/使用问题
  • 医生通道:选择医生、发送问题、上传报告、语音/文字沟通
  • 留言功能:医生离线时留存问题

6.2 技术方向

  • V1 可先实现基于轮询的图文消息(复用现有 Consultation 模块)
  • V2 升级为 WebSocket 实时通信 + 语音消息
  • 客服通道可对接第三方客服系统(如美洽、智齿)

7. PC 管理后台新增页面

7.1 健康数据中心(新增)

页面 功能
透析数据统计 透析次数趋势、干体重变化、超滤量统计
异常指标排行 血钾/血磷/肌酐异常患者排行
上报率统计 患者数据上报活跃度、打卡率

7.2 商城管理(新增)

页面 功能
积分规则管理 增删改积分获取规则
商品管理 增删改兑换商品、库存管理
订单管理 兑换记录查看、手动核销、导出
线下活动管理 活动创建、报名/签到管理
积分统计 发放/消耗/活跃排行

7.3 统计报表(新增)

页面 功能
患者增长 新增患者趋势、活跃度
咨询量 咨询次数/回复率/满意度
随访完成率 随访任务执行统计
商城数据 兑换排行、库存周转

8. AI 分析能力V2

8.1 V1 预留

  • 趋势图已通过 ECharts 实现(现有 TrendChart 组件)
  • 异常指标通过 is_abnormal 标记和阈值校验实现
  • 健康报告可生成基础版(数据汇总 + 异常标注)

8.2 V2 增强

  • LLM 集成:自然语言健康报告生成
  • AI 辅助:化验单 OCR 自动识别
  • 智能预警:基于历史数据的异常趋势预测

9. 分期建议

V1.1(建议优先)

  1. 血透专科数据模型3 张新表 + API
  2. 患者端小程序改造TabBar + 首页 + 上报扩展)
  3. 积分商城后端 + 小程序前端
  4. 线下活动管理

V1.2

  1. 在线咨询(轮询版)
  2. 化验报告上传 + 审阅流程
  3. PC 管理后台新增页面
  4. 统计报表

V2

  1. 医护端小程序
  2. 在线咨询升级WebSocket + 语音)
  3. AI 分析增强LLM + OCR
  4. Redis 缓存层

10. 风险与缓解

风险 影响 缓解措施
积分 FIFO 结算复杂度 并发消费时积分桶冲突 使用数据库事务 + 乐观锁account.version
在线咨询工作量超预期 V1.2 延期 V1 先做轮询图文WebSocket 推迟到 V2
医护端小程序工作量大 V2 延期 V1 阶段用 PC 后台替代医护端功能
化验单 OCR 准确率 用户体验差 V1 先做手动填写OCR 作为 V2 AI 增量
积分通胀 积分价值稀释 可配置每日上限 + 过期机制 + 运营调整积分价格