55 lines
4.1 KiB
Markdown
55 lines
4.1 KiB
Markdown
## Context
|
||
|
||
C0 已落地机构=租户、RBAC、目录四层、菜单、多租户过滤(PrismaService 注入 tenantCode)。C1 新增待遇档案域(elder + elder_status_log),纯新增、不侵入脚手架。设计背景见 `docs/superpowers/specs/2026-10-14-服务机构端-C1待遇档案-design.md`。
|
||
|
||
## Goals / Non-Goals
|
||
|
||
**Goals:**
|
||
- elder 建档(身份证校验/防重、参保核验留痕、评估结论承载)。
|
||
- 十态待遇状态机 + elder_status_log 变更留痕。
|
||
- 评估结论副本上传(MinIO)+ 等级唯一来源约束。
|
||
- 身份证服务端掩码 + 明文查看留痕。
|
||
|
||
**Non-Goals:**
|
||
- OCR、Excel 批量导入、elder_svc、评估结论打水印、id_card_no 存储层加密、官方接口拉评估结论、need_assess 采集交互。
|
||
|
||
## Decisions
|
||
|
||
1. **文件存储用 MinIO**(`http://localhost:9000`,bucket `carelink`,minioadmin/minioadmin)。抽象 `StorageService.upload(buffer, key)` 接口,内部用 `minio` 官方包;后续切腾讯云 COS 只换实现与配置。
|
||
2. **等级唯一来源=「评估结论副本 + 评估结论字段」绑定**:建档时 `assess_level/care_level/assess_date/assess_org` 与 `assess_evidence_file` 绑定——有副本才能填等级,填等级必须有副本。前端不提供「直接填等级」的自由入口,等级区块 = 上传副本 + 录入评估结论字段。
|
||
3. **身份证掩码在服务端**:`maskIdCard()` 返回 `前4 + 10个* + 后4`(18 位)/`前3+*+后4`(15 位兜底)。列表用掩码;详情仅 admin/qc 可明文 + 落审计。
|
||
4. **id_card_no 存储层加密后置**(与 staff 统一走 security change);C1 明文存 + TODO。掩码/查看留痕 C1 做。
|
||
5. **建档初始状态**:`benefit_start ≤ today ≤ benefit_end` → `active`;否则 `waiting_period`。
|
||
|
||
## 数据模型(DDL 概览)
|
||
|
||
通用字段 `created_at/by`、`updated_at`、`deleted_at`;主键 UUID v7;`@@map` snake_case;软删。
|
||
|
||
- **elder**(`sys_elder`):id、tenant_code、loc_code、prev_loc_code、transfer_confirm_at、name、gender(char1)、birth_date、id_card_no(varchar255)、phone、address、guardian_name、guardian_phone、insur_no、insur_type、insur_years、insur_verify_status、insur_verify_date、assess_level、care_level、assess_date、assess_org、assess_evidence_file、benefit_start、benefit_end、treat_status、status_source、status_change_date、hosp_start、hosp_end、photo_tier_override(json)、need_assess(json)、note(text)、biz_line。唯一索引 `(tenant_code, id_card_no)`。
|
||
- **elder_status_log**(`sys_elder_status_log`):id、elder_id、from_status、to_status、change_reason(必填)、source、operator_id、evidence_file、changed_at。
|
||
|
||
PrismaService:`elder`/`elder_status_log` 均为租户级模型(带 tenantCode,自动过滤);`elder` 加入 SOFT_DELETE。
|
||
|
||
## 接口(`@Controller('elder')`)
|
||
|
||
| 方法/路径 | 权限 | 说明 |
|
||
|---|---|---|
|
||
| GET `/elder` | elder:list | 分页 + 状态/等级/姓名筛选;身份证掩码 |
|
||
| POST `/elder` | elder:create | 建档(18 位校验、防重、等级与副本绑定) |
|
||
| GET `/elder/:id` | elder:detail | 详情;admin/qc 明文 + 审计 |
|
||
| POST `/elder/:id/status` | elder:status-change | 变更状态,change_reason 必填,写日志 |
|
||
| GET `/elder/:id/status/log` | elder:detail | 状态日志 |
|
||
| POST `/elder/assess-evidence` | elder:create | 上传副本到 MinIO,返回 key |
|
||
|
||
权限码 `elder:list/create/detail/status-change` 已在 C0 permissions.ts 预留;APIS 数组登记 6 条资源(parent=elder 菜单)。
|
||
|
||
## Risks / Trade-offs
|
||
|
||
- [评估结论副本是合规证据,本地 MinIO 单点] → 副本 key 存 elder 表、MinIO 数据卷已挂本机;生产切 COS(异地冗余)。
|
||
- [等级唯一来源依赖「有副本」约束,机构可能绕过] → 后端强制校验 assess_evidence_file 与 assess_level 绑定,前端不提供自由填等级入口。
|
||
- [明文查看留痕依赖审计拦截器] → `/elder/:id` 明文分支显式写 audit-log。
|
||
|
||
## Migration Plan
|
||
|
||
新增迁移建 `sys_elder` + `sys_elder_status_log`(utf8mb4_general_ci,迁移 SQL 手改 collation)。回滚=删除迁移。
|