130 lines
7.5 KiB
Markdown
130 lines
7.5 KiB
Markdown
# 服务机构端 · C1 待遇档案 · 设计文档
|
||
|
||
> 日期:2026-10-14
|
||
> 范围:待遇档案域——老人档案(elder)+ 十态待遇状态机 + 状态变更留痕(elder_status_log)+ 评估结论副本上传。
|
||
> 依据:P0 PRD §3.2/§5.2/§5.5.1/§7.2/§7.4/§8.2;C0 设计 `2026-10-14-服务机构端-C0基础骨架-design.md`。
|
||
> 后续:C2 派单工单(含 `elder_svc` 老人个人项目库 + 服务计划)。
|
||
|
||
## 1. 背景与目标
|
||
|
||
在 C0 基础骨架(机构=租户、RBAC、目录四层、菜单、多租户过滤)之上,落地「待遇档案」域。C1 只做:老人档案建档、十态待遇状态机与变更留痕、评估结论副本上传。承接 C2 的状态机消费(L1 硬锁)与 `elder_svc`。
|
||
|
||
## 2. 已定决策(用户 2026-10-14 拍板)
|
||
|
||
- 评估结论承载=**上传副本 + 存字段**(等级唯一来源=评估结论,禁止建档人自行填写)。
|
||
- OCR 后置(C1 手工录入身份证 + 18 位校验位校验)。
|
||
- 批量导入后置(C1 先单条建档)。
|
||
- `elder_svc` 放 C2(与「制定计划时带入」一起做)。
|
||
- 文件存 MinIO(`http://localhost:9000`,bucket `carelink`,S3 兼容,后续切腾讯云 COS 只换配置)。
|
||
|
||
## 3. 数据模型(新增 2 张表)
|
||
|
||
通用字段:`created_at`/`created_by`/`updated_at`/`deleted_at`。主键 UUID v7。
|
||
|
||
**`elder` 老人档案表**(`@@map("sys_elder")`):
|
||
|
||
| 字段 | 类型 | 说明 |
|
||
|---|---|---|
|
||
| id | uuid | 主键 |
|
||
| tenant_code | varchar(64) | 机构(多租户隔离) |
|
||
| loc_code | varchar(12) | 参保地/统筹区(取目录依据) |
|
||
| prev_loc_code | varchar(12)? | 跨统筹区转移前参保地 |
|
||
| transfer_confirm_at | datetime? | 转移确认时间 |
|
||
| name | varchar(30) | 姓名 |
|
||
| gender | char(1) | M/F |
|
||
| birth_date | date | 出生日期(系统算年龄) |
|
||
| id_card_no | varchar(255) | 身份证号(加密预留;本期明文+TODO,掩码见 §7) |
|
||
| phone | varchar(15)? | 联系电话 |
|
||
| address | varchar(200) | 居住地址 |
|
||
| guardian_name | varchar(30)? | 紧急联系人 |
|
||
| guardian_phone | varchar(15)? | 紧急联系人电话 |
|
||
| insur_no | varchar(30) | 医保参保号 |
|
||
| insur_type | varchar(10) | employee/resident |
|
||
| insur_years | int? | 缴费年限 |
|
||
| insur_verify_status | varchar(20)? | verified/unverified(本期线下确认) |
|
||
| insur_verify_date | date? | 参保核验日期 |
|
||
| assess_level | varchar(20) | 失能等级 sev_1(重度一级·最高级)/sev_2/sev_3 |
|
||
| care_level | varchar(20) | 护理等级 care_1(一级·最高级)/care_2/care_3 |
|
||
| assess_date | date | 评估结论日期 |
|
||
| assess_org | varchar(100)? | 评估机构名称 |
|
||
| assess_evidence_file | varchar(255)? | 评估结论副本(MinIO key)【补】 |
|
||
| benefit_start | date | 待遇有效期起 |
|
||
| benefit_end | date | 待遇有效期止 |
|
||
| treat_status | varchar(20) | 待遇状态(§4) |
|
||
| status_source | varchar(10) | manual(恒)/api 预留 |
|
||
| status_change_date | date? | 状态最后变更日 |
|
||
| hosp_start / hosp_end | date? | 住院起止 |
|
||
| photo_tier_override | json? | 拍照分档加严覆盖 |
|
||
| need_assess | json? | 上门需求评估五块信息(建表留结构,采集交互后置 C2) |
|
||
| note | text? | 备注(含「注意事项」区块) |
|
||
| biz_line | varchar(20) | 恒 ltci |
|
||
|
||
索引:`tenant_code`、`tenant_code+id_card_no`(唯一,身份证防重)。
|
||
|
||
**`elder_status_log` 待遇状态变更日志**(`@@map("sys_elder_status_log")`):
|
||
|
||
| 字段 | 类型 | 说明 |
|
||
|---|---|---|
|
||
| id | uuid | 主键 |
|
||
| elder_id | varchar(36) | 老人 |
|
||
| from_status / to_status | varchar(20) | 变更前后 |
|
||
| change_reason | varchar(200) | 变更原因(必填) |
|
||
| source | varchar(10) | manual |
|
||
| operator_id | varchar(36) | 操作人 |
|
||
| evidence_file | varchar(255)? | 佐证材料 |
|
||
| changed_at | datetime | 变更时间 |
|
||
|
||
## 4. 十态待遇状态机
|
||
|
||
`treat_status` 十态与语义(可否派单/计费/恢复,PRD §7.4):
|
||
|
||
| 状态 | 值 | 可否派单 | 可否计费 | 恢复 |
|
||
|---|---|:---:|:---:|---|
|
||
| 待建档 | pending_file | ❌ | ❌ | 建档完成→active |
|
||
| 待起付(等待期/垫付期) | waiting_period | ✅(垫付台账) | ❌ | 待遇生效→结转 active |
|
||
| 正常享受 | active | ✅ | ✅ | — |
|
||
| 住院暂停 | hosp_pause | ❌ | ❌ | 出院人工确认→active |
|
||
| 复评等待期 | review_waiting | ❌ | ❌ | 复评结论出 |
|
||
| 跨统筹区转移中 | transferring | ❌ | ❌ | 新参保地确认 |
|
||
| 死亡 | dead | ❌ | ❌ | 不可恢复 |
|
||
| 长期异地居住 | long_away | ❌ | ❌ | 回迁确认 |
|
||
| 待遇到期 | benefit_expired | ❌ | ❌ | 续评通过 |
|
||
| 已终止 | terminated | ❌ | ❌ | 不可恢复 |
|
||
|
||
- 变更接口 `/elder/status/change`:`to_status` + `change_reason`(必填) + 可选 `evidence_file`;写 `elder_status_log` + 审计。
|
||
- 建档初始状态:待遇有效期覆盖今天 → `active`;否则 → `waiting_period`。
|
||
- L1 硬锁(无有效待遇不可服务)在 C2 派单时消费;C1 只实现状态机数据层与变更语义。
|
||
|
||
## 5. 接口(A 组 + 上传)
|
||
|
||
| 接口 | 方法 | 权限 | 说明 |
|
||
|---|---|---|---|
|
||
| `/elder/list` | GET | elder:list | 状态/等级/姓名筛选;身份证服务端掩码 |
|
||
| `/elder/create` | POST | elder:create | 建档;18 位校验、防重、等级来自评估结论 |
|
||
| `/elder/detail` | GET | elder:detail | 详情;admin/qc 可看身份证明文+留痕 |
|
||
| `/elder/status/change` | POST | elder:status-change | 变更状态,change_reason 必填 |
|
||
| `/elder/status/log` | GET | elder:detail | 状态变更历史 |
|
||
| `/elder/assess-evidence/upload` | POST | elder:create | 上传评估结论副本到 MinIO,返回 file key |
|
||
|
||
统一响应沿用 `{code,message,data,hint}`(hint 为硬锁提示,本期多数接口不触发)。
|
||
|
||
## 6. 前端
|
||
|
||
- 服务对象列表页(`ltc/elder`):状态筛选(全部/正常享受/住院暂停/待建档/待遇到期)、列表(姓名/护理等级带「(最高级)」/状态/计划/下次服务/操作)。
|
||
- 建档表单:必填校验(身份证 18 位+校验位、出生日期自动带出、参保地默认取机构属地、待遇止>起)、身份证防重提示、参保核验(线下确认字段)、**等级区块=上传评估结论副本(必做,禁止手填等级)**。
|
||
- 档案详情:完整信息 + 状态变更(下拉十态 + 原因必填)+ 状态日志时间线 + 身份证明文查看(admin/qc,留痕)。
|
||
|
||
## 7. 横切
|
||
|
||
- **身份证防重**:同机构 `id_card_no` 唯一;命中已有档案提示「已有档案,是否查看」。
|
||
- **掩码在服务端**:列表返回 `5301**********1234`;前端不做掩码。
|
||
- **明文查看留痕**:`/elder/detail` 请求明文身份证时落审计(谁/何时/看了谁的)。
|
||
- **等级唯一来源**:`/elder/create` 不接受前端传 `assess_level/care_level`;等级由「上传评估结论副本」后由机构/质控录入(走 `assess_*` 字段),或由后续官方接口带出。禁止建档表单直接填等级。
|
||
- **id_card_no 存储层加密后置**:C1 存明文 + TODO(与 staff 一起走统一 security change);掩码 + 明文查看留痕 C1 做。
|
||
- **审计**:建档、改状态、明文查看身份证落审计(复用脚手架 audit-log)。
|
||
- **MinIO 配置**:`.env` 新增 `MINIO_ENDPOINT/MINIO_ACCESS_KEY/MINIO_SECRET_KEY/MINIO_BUCKET`(默认 carelink),S3 兼容,后续切 COS 只换配置。
|
||
|
||
## 8. 非目标(本期不做)
|
||
|
||
OCR 回填、Excel 批量导入、`elder_svc`、评估结论打水印、`id_card_no` 存储层加密、官方接口拉取评估结论(B 路径)、`need_assess` 采集交互。
|