Commit 33a826e7 by luoqi

feat(push): 存量/增量同一通道 —— 归一统一 / 乱序裁决 / stub 自建 / 并发闸 + 断流告警

把 push(形态 A/C)打磨成宿主唯一接入通道,存量=按批重放的增量:

摄入一致性(消除同源分叉):
- 形态 C 复用 normalizeCanonical(金额元→分 / 无时区时间补 offset),含 envelope
  occurredAt/updatedAt —— 与形态 A/pull 同一转,宿主用自己系统的格式发,不做转换。
- 业务事件先于患者主档到达 → dispatcher stub 自建空壳患者(对齐 form A),主档后到补全
  同一行,不双人;push 跨批顺序无关。

幂等/乱序:
- patient_facts 加 source_updated_at,fact-writer 按它裁决:更旧版本晚到 → stale_skipped
  跳过,不旧覆新。关掉"补推快照 vs 实时推送并发交错"的乱序窗口。

体制/性能:
- 限批 500(A 从 2000 对齐 C);persona 入队去抖(5min 桶去重,存量批次合并重算)。
- 同 host 并发闸(信号量,PAC_PUSH_CONCURRENCY 默认 4;幂等+裁决保证并发语义=串行)。
- 单飞锁索引收窄 WHERE direction='pull' —— 原索引把并发 push 批次拦成 P2002/500。

异常/可观测:
- 整批全失败 → 拒收 30802 + SyncLog FAILED;失败率/疑似改表 → 告警。
- 未知 source → 10001(非 90000,避免宿主对永久错误无限重试)。
- push 断流监控(超 26h 无 push 告警);form A 响应透出 mappingMisses/suspectFields 供自检。

文档 channel-push 按宿主视角重写(subjectType 单一口径、金额时间统一"原样发 PAC 归一")。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
parent 984e05cc
Pipeline #3339 failed in 0 seconds