appointment-doctor-name.spec.ts
5.73 KB
-
feat(sync): 预约事实补上医生姓名 —— DW 一直在给,只是没映射 · b9564716
预约事实历来只有 doctor_id 没有姓名(前端/话术拿到裸 ID),而 DW 的 fact_appointment_out 每一行都带 resource_name。列名叫「排班资源名」有误导性, 先把它到底是不是医生姓名核实清楚: · 椅位另有列 appo_chair(仅 3 个取值),资源另有 resource_id —— 不是它们 · resource_name 与 appo_doc_id 的绑定比与 resource_id 更紧 (本地 (doc_id,name) 140 组 < (resource_id,name) 151 组) · 已到诊预约按 (患者,日期) 对当天病历 doctor_name:生产近 90 天 99,170/101,192 = 98.0% 命中;144,148 条明细里「id 对上而名字不对」与 「名字对上而 id 不对」各 0 条 → 就是 appo_doc_id 这个人的姓名 · create_name / appo_handler 是呼叫中心约号人(值形如 400-叶玉娇), director_name 是另一个角色 —— 都排除 口径:doctor_name = **约号时约的那位医生**,不是实际接诊医生(改派时不同, 实际接诊仍以病历为准)。两个口径别混。 少数排班资源不是人而是房间/服务/台席("预约"/"学前街手术室"/"正畸咨询"), 生产近 180 天 9,838/1,047,901 = 0.94%,不拦的话时间轴每 106 条就出现一次 「预约医生」,详情页「主治医生」的最高频兜底还可能解析成「学前街手术室」。 故加 AppointmentParser.isPersonResource: · 九词词表从那份实测清单反推,覆盖全部 19 个取值 · 误伤核验:生产 1,314 个真实医生名过规则,命中 1 个(「公共诊室」, 本身就是漏进病历的房间名)—— 真人零误伤 · 独立判据复核(不用词表):过闸的 428 个资源里 426 个的 id 在临床记录里 真的当过医生,漏网 105 行 = 0.010% · 被拦下的原值不丢,另存 content.resource_name; `WHERE resource_name IS NOT NULL AND doctor_name IS NULL` 即可审计 本地全量 reparse 验证(241,228 个版本 / 15 分钟):最新版 240,517 条, resource_name 100%、doctor_name 99.83%,拦下 413 条全是非人资源; 逐行对源 transaction,(doctor_id, resource_name) 240,517/240,517 成对回溯。 前端零改动 —— facts-timeline 的预约分支本来就把医生拼进 note,只是取不到值。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>luoqi committed