feat(pipeline): 实现健康档案 upsert 编排(T-213)
This commit is contained in:
+8
-2
@@ -159,6 +159,12 @@ type ManageInfo struct { DSFMC, OperateUnit, OperateUser string }
|
||||
|
||||
### 4.6 `pipeline` —— 投递编排
|
||||
|
||||
T-213 已落地可复用的 `HealthRecordUpsertService`。它接收 `source.HealthRecordTask`,通过注入的 `Converter`、`HealthRecordClient`、`IdempotencyStore`、`ReportSink` 和 `PHISStatusWriter` 完成单条健康档案编排;HTTP handler 与未来 worker 必须复用该服务,不复制分支规则。
|
||||
|
||||
健康档案采用 query-first:映射校验通过后,以稳定 `checkId + idCard` 的哈希键原子获取幂等租约,再按身份证调用 JKDA00002。明确 0 条才调用 JKDA00001;恰好 1 条且身份证、状态、机构、责任医生、`phrId` 均安全时调用 JKDA00003;多条或任一授权条件不满足均转 `manual_review`。查询失败、创建失败、更新失败均不切换另一种写操作。
|
||||
|
||||
当前幂等接口是带 owner token 的 `Acquire/Complete/Release` 契约,完成和释放必须匹配租约 token,防止过期 worker 改写新租约;T-213 只用假实现验证占用和完成语义,Redis/文件持久化、租约超时与恢复属于阶段 3。报告与 PHIS 状态同样仅定义端口,真实回写由 T-214 实现。CHIS 已明确写入成功后,必须先完成幂等记录再发布 `done`;完成失败时保留业务结果 `done`、返回基础设施错误且不发送成功通知,调用方不得据此重放 CHIS 写入。副作用失败通过 `NotificationError` 分别暴露 `PriorErr/ReportErr/StatusErr`,并只携带失败端的补偿载荷,补偿时不重新执行 upsert。
|
||||
|
||||
单条投递流程(继承旧项目 worker 经验):
|
||||
|
||||
```
|
||||
@@ -171,13 +177,13 @@ type ManageInfo struct { DSFMC, OperateUnit, OperateUser string }
|
||||
```
|
||||
|
||||
- **重试分类**(移植并适配 OSI):网络错误 / HTTP 5xx / 429 / `code==405`(超时) 可重试;参数错、权限错、映射校验错不可重试;退避 `2s*attempt`,最多 3 次。
|
||||
- **幂等**:键 = `checkId`(替代旧项目报文哈希);存储 redis 优先、文件降级。
|
||||
- **幂等**:健康档案键 = `sha256(checkId + "|" + idCard)`,原子获取带 owner token 的租约;存储 redis 优先、文件降级。
|
||||
- **熔断**:连续网络失败达阈值则暂停(阈值/休眠秒可配)。
|
||||
- **批次报告**:`total/success/failed/skipped/retry`、失败 Top、逐条明细(沿用旧项目格式)。
|
||||
|
||||
### 4.7 `observ` / `store` —— 可观测与存储
|
||||
|
||||
- 一套 report log(收敛旧项目的 apitrace/reportlog/snapshot 三套):记录每次 PHIS 输入、映射结果、OSI 请求/响应、最终判定。
|
||||
- 一套 report log(收敛旧项目的 apitrace/reportlog/snapshot 三套):普通日志只记录脱敏标识、serviceId、响应码和最终判定;原始 PHIS 输入与完整 OSI 请求/响应不得写入普通日志。
|
||||
- Redis 优先、本地 JSONL 降级;Redis 启动失败不阻断(沿用旧项目)。
|
||||
|
||||
---
|
||||
|
||||
Reference in New Issue
Block a user