touyun-elderly-care/docs/tech-debt.md
liuyun c564822de8 docs: 服务机构端 C4 质控闸门落地 + 更新子模块指针与遗留项
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-10-15 02:08:16 +08:00

76 lines
7.6 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.

# 服务机构端 · 遗留项清单(Tech Debt)
> 记录 C0 基础骨架 / C1 待遇档案的遗留项,供后续 change 处理。来源:各 change 的 SDD ledger(deferred minor / parked / pre-existing)。按优先级分组。
## 安全 / 合规(优先处理)
- [ ] **id_card_no 存储层加密**:staff + elder 的身份证目前明文存(代码留 TODO),需统一走一个 security change(AES 加密;掩码/查看留痕已做)。
- [ ] **tenant_super_admin 未纳入身份证明文查看口径**:`elder` detail 明文目前仅 admin/qc/super_admin,业务租户顶层管理员 `tenant_super_admin` 遗漏(低危,C1 遗留)。
- [ ] **身份核验 P-9**(扫脸/人证核验):依赖医保 APP 能力,后置;本期兜底=拍照留痕 + 实名账号 + 家属可选确认。
- [ ] **评估结论副本孤儿文件**:建档先上传副本、create 失败(如重复身份证)会在 MinIO 留孤儿对象,需失败清理。
## 数据完整性
- [ ] **staff.entryDate/leaveDate 字符串直传 Prisma**:潜在 50000(C0 遗留,与 C1 elder 日期 bug 同类),需按 `toDateOnly` 方式统一修。
- [ ] **Agency.deletedAt 未纳入 SOFT_DELETE**:C0 无机构删除 flow,后续需要软删时补。
- [ ] **catalog 白名单对未声明字段覆盖不全**(parked Important):`data` pick 已兜底、无完整性风险;全站 `forbidNonWhitelisted` 后续再评估。
- [ ] **changeStatus 写 statusChangeDate 用 `new Date()` 未走 `toDateOnly`**:理论上 UTC 回退一天,当前无前端展示、零实际影响。
## 契约 / 文档
- [ ] **统一响应 `hint` 字段**:api-contract 要求 `{code,message,data,hint}`,`TransformInterceptor` 现仍 `{code,message,data}`,硬锁接口需补 hint。
- [ ] **api-contract 错误码列表(1001–4001)未实现**:实际用 5 位 `[域2][序3]`(如 40001),spec 内部不一致,需先收敛 spec 再对齐。
- [ ] **登录页属地提示**:frontend spec「属地提示」未实现(多租户登录前属地未知,需先厘清语义)。
- [ ] **前端等级筛选未暴露**:后端 `ListElderQuery.level` 已实现,前端搜索未用。
## seed / 数据
- [ ] **全量 L1 36 项 / 昆明 L2 45 项 / L3 映射未 seed**:C0 只落样例,全量数据延后到 C3/C4 或运营导入(异常分类/拍照分档字典已复用脚手架并 seed)。
## 测试 / 健壮性(次要)
- [ ] error-codes 头注释 legend 缺域 40–43(cosmetic)。
- [ ] StorageService 默认凭据回退、useSSL 硬编码、size 断言过松。
- [ ] 身份证格式错误用通用 400(无 `ELDER_ID_CARD_INVALID` 专用码)。
- [ ] staff `groupLeaderId` 未校验组长存在、listStaff 过滤字段自行推断、`UpdateStaffDto.userId` 不支持 null 解绑。
- [ ] catalog `loc_code` 缺失未校验、newNational 返全量、config 空更新。
- [ ] agency PATCH 空 body、NOT_FOUND 分支未测。
- [ ] 建档表单未收集 `insurYears`/`hospStart`/`hospEnd`/`guardian*`(spec 未要求)。
- [ ] 状态变更 `evidenceFile` 前端未提供上传(后端字段已留)。
## C2 派单工单
- [ ] **[高] 迁移链损坏**:`c1_elder` 在 `c0_rename_ltc` 之前对 `ltc_*/svc_*` 表 RENAME 索引,干净回放 shadow DB 报 Table doesn't exist → `migrate dev` 不可用,只能 `migrate diff --from-schema-datasource` + 手工迁移目录 + `migrate deploy`。C3/C4 建表前必修。
- [ ] **[高] 业务角色未授 elder/plan/order 权限**:`BUSINESS_ROLES` 只授 agency/staff/svcOrg,director/admin/qc/leader/nurse 无法访问 elder/plan/order(仅 tenant_super_admin 可,权限靠 RBAC UI 手动配)。需统一梳理角色权限。
- [ ] **生成工单 UI 入口缺失**:frontend spec 未要求,但端到端「计划→生成工单→派单」缺「生成工单」按钮(后端 `POST /order/generate` 已实现、已测)。C2.5/C3 补。
- [ ] **待派工单在排班日视图不可见**:日视图 `ordersOf` 只按 `assigneeId` 挂卡,`to_assign` 工单只出现在批量推荐下拉,网格无法一眼看出待派。
- [ ] **L4 机构项目库未 seed + 无创建端点**:`svc_org` 无 HTTP 创建端点、seed 未含 L4(冒烟用 Prisma 直插 18 行绕过)。补 seed + 端点(与 C0「全量 L1/L2/L3 未 seed」同批)。
- [ ] **属地项数 2002 前端未展示提示**:后端已改提示级(`item_count_rule` 记 `2002:…`),但 plan-form 未显示该警告。
- [ ] **当班无排班模型**:staff 无 shift/duty 字段,派单「当班」用 `employStatus` 代理(pass-through + TODO 指向未来排班模型)。
- [ ] **toDateOnly 跨域引用**:order.service 从 elder.service 引 `toDateOnly`,宜提公共 util。
- [ ] **billable 硬编码 + price_snapshot/settle_period 留 C3**(垫付/结转)。
- [ ] **batchRecommend 复用 order.assign 权限码**(无独立 `order.recommend`);C3 前在 shared/ 登记。
- [ ] **plan_status ended 无入口**(无结束计划端点);`plan.change` 不要求旧计划 active。
- [ ] **非事务多写**:`plan.create`(head+items)、`elder-svc.put`(delete+create)、`change`(create+update)中途失败留部分状态。
- [ ] **toDateTime 硬编码 +08:00**(业务假设北京时区,已注释;如多时区属地需配置化)。
## C3 履约留痕
- [ ] **[高] 缺事务**:扑空 `order.update` + `recordAbnormal.create`、record itemSave 整表覆盖(先删后写)、`prepaidCarryover` 多写——中途失败留部分状态。C4/settlement 前加 `$transaction`。
- [ ] **扑空证据缺失用通用 40000**(无 `ABNORMAL_EVIDENCE_REQUIRED` 专用码,规则号 3003 写 message)。
- [ ] **照片/语音无 presign/下载端点**:前端只显示 file_path/key、有无,无法预览;APP 上线前补。
- [ ] **留痕/异常列表不分页**(`findMany` 全量);admin B3 规模可接受,APP 前补分页。
- [ ] **record.detail 嵌套 abnormals 的 visitLat/visitLng 仍带 Decimal**(顶层坐标已修,嵌套未序列化,minor 不一致)。
- [ ] **业务角色未授 record/abnormal 权限**(同 C2 的 elder/plan/order,靠 super 或 RBAC UI 配置);新租户靠 `sync:resources` 同步资源。
- [ ] **offlineSync 接受客户端 checkinTime/checkoutTime**(离线补传固有例外,仅 client_md5 去重兜底,防补录时间有缺口——可加 serviceDate 窗口约束)。
- [ ] **prepaidCarryover 不限制 record_status=submitted**(serving 垫付记录也能被结转);prepaidList 有 N+1 查询。
- [ ] 前端 pageSize 200 固定、serviceDate 文本输入、`loadPrepaid` 非 active 也请求(小浪费)。
## C4 质控闸门
- [ ] **[高] nurse 角色零 record.*/qc.correct 权限**(护理员留痕录入 + 补正)——C2/C3/C4 共性问题:业务角色只有 agency/staff/svcOrg,elder/plan/order/record/abnormal/qc 权限均未授,靠 super 或 RBAC UI。**APP 上线前必须统一梳理角色权限矩阵**。
- [ ] **batchPass 两阶段预检但未包 `$transaction`**(并发下仍可能部分落库);定时任务 + 五类聚合有 N+1 查询;prepaidList 同。
- [ ] **QC_NOTE_REQUIRED(46005) 死代码**(DTO @IsNotEmpty 先拦,实际返回 40000);qc_note 纯空白串会漏过 DTO。
- [ ] **5 工作日不含节假日**(只跳周末);cron raw 扫描未过滤 `deletedAt`(软删留痕也可能生成 qc);qc 表 `record_id` 无唯一约束(并发重入可能重复生成)。
- [ ] **handleAbnormal 无状态机**(closed→handling 可重开,仅枚举限制);前端批量放行只挡 correctionCount>0(其余靠后端 QC_BATCH_UNSAFE 兜底);goAbnormal 不清其他筛选(UX)。