主管指派工单要选人,而 host **不提供「客服归属诊所」字段**,只能按行为反推
「该诊所近 N 月有过回访记录的客服」。DW fact_returnvisit_out 一直带 task_director_id/name,
PAC 侧此前没映射 —— 花名册只能靠离线快照 data/jvs-dw/users.json(已陈旧、无刷新机制,
之前排查生产操作人时 10 个 id 有 8 个查不到姓名就是这个原因)。
【与「专属客服」是两回事,刻意不合并】
patients.preferences.dedicatedCs ← fact_client_out.current_task_director(患者挂谁名下)
patient_return_visits.task_director_* ← 本次回访是谁做的
两者可以是不同人;口径差 2.7 倍(回访表 5,110 个 distinct 客服 vs 患者表 1,865 个)——
回访是操作留痕,覆盖更全,97.2% 的专属客服在此出现过。合并成一列会让名册少掉大半人。
改动(三层,通用代码零改动):
- manifest query 补 SELECT 两列(漏了则映射静默失效 → 落 null)
- assembler 映射 taskDirectorId / taskDirectorName
- canonical 加两字段(id 用 z.coerce.string:host 是 Int64,PAC 的 external 标识一律字符串)
- schema + migration:可空两列(166.7 万存量加列不重写表)+ 名册复合索引
(host, tenant, clinic, task_director, task_date desc) —— 单列不够,clinic 基数仅 64
- upsert 落库经 emptyToNull:空串 / "0" 归 null,否则名册会多出假的"无名客服"分组
【存量怎么补(本次不含)】reparse **无效** —— 回访是 upsert 资源、不进 transaction,
没有 rawPayload 可重放;整表重摄又会连带重摄这批患者的病历/结算/预约(2026-08-01 实测
那条路把测试服磁盘写满)。存量走一次性 DW 回填:按 external_id 批量 UPDATE 两列。
测试 806 项(+7),锁住"两处客服字段不互相挪用"与源 query 必须选这两列。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>