Commit 04443ff8 by luoqi

feat(sync/friday): treat[] 三路分流补全 — review/recommendation 两资源接入

补 Phase 1 缺口(与 jvs-dw C.3 同语义):treat[] normalize 后 route_by_pattern
① 建议/推荐 → recommendation(共享 recommendation-code 字典;实测 153 行全部翻出召回码:
   拔除 69 / RCT 49 / 冠 15 / 充填 9 / 种植 3 / SRP 1,仅 7 行长尾落空)
② 流程/复查/行政词 → treatment_review(category=review 哨兵;chain S4"已复查"信号)
③ 其余 → actual。拆线(50 行)按 jvs-dw 2026-06-11 一线判例排除出 review 词表 →
   actual→本地 enum 拆线→surgical(判例与 route 语境耦合,留宿主本地不入共享)。

external_id 沿用原始 value(与已摄入数据幂等键连续):重摄 failed=0,老 fact 全量
unchanged;之前被 keyword 误收进 actual 的"牙周复查"类 6 行经版本流 supersede 自动
纠正为 review,无残留。终态新增 recommendation_record 153 + review 56。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
parent 6e2b549e
# recommendation — FRIDAY 医生建议("建议根管治疗"/"建议拔除"等;treat[] route 分流产物)
# 实测 153 行(建议充填/建议拔除/建议根管治疗…),经共享 recommendation-code 字典翻召回码。
# code 用归一后的 value_norm("建议充填," → "建议充填" 精确命中;长尾靠共享 keyword 兜底)。
canonical: recommendation
emits:
action: recommendation_extracted
subjectType: recommendation
occurredAtField: occurredAt
primary:
table: recommendation_rows
key: rec_external_id
dedup_by: rec_external_id
field_mapping:
externalId: rec_external_id
updatedAt: updated_gmt_at
createdAt: created_gmt_at
patientExternalId: patient_id
clinicId: organization_id
occurredAt: clinic_time
sourceEncounterExternalId: emr_sub_id
code: value_norm # "建议种植" 等 → 共享字典翻 PAC 推荐码
name: value # 医生原文(病历忠实展示;长尾建议靠它)
toothPosition: tooth_position
doctorId: user_id
doctorName: user_name
# ── 字典分层:标准"建议X"词典(enum+keyword)全在共享文件 ──
dict_includes:
- ../../_shared/dict/recommendation-code.yaml
enum_mapping:
code:
_default: "" # 未识别"建议X" → 共享 keyword 兜底;再不中 → 丢弃(不入 fact)
......@@ -38,5 +38,8 @@ dict_includes:
enum_mapping:
category:
# 拆线 = 术后护理 = 外科治疗动作(jvs-dw 2026-06-11 一线判例:归 review 不算治疗会误召;
# 判例与 route 分流语境耦合 → 留宿主本地,不入共享层)。FRIDAY 实测 50 行。
拆线: surgical
# 长尾兜底:未命中 → category='',parser 跳过该 fact(数据损失换质量,jvs-dw 同款纪律)
_default: ""
# treatment_review — FRIDAY 流程性事实(复查/暂观/观察等;treat[] route 分流产物)
# 全部 fact 打 category='review'(canonical-codes 第 11 类);chain S4"已复查"信号源。
# kind=actual:treat[] = 本次治疗(用户确认),复查/观察是"本次确实做的"流程事件。
# 注:拆线不入 review(route 词表已排除)—— 按 jvs-dw 2026-06-11 一线判例,
# 拆线=术后护理=外科治疗动作,归 actual→surgical(见 treatment_actual.yaml 本地 enum)。
canonical: treatment
emits:
action: treatment_completed
subjectType: treatment
occurredAtField: occurredAt
kind: actual
primary:
table: treatment_review_rows
key: treat_external_id
dedup_by: treat_external_id
field_mapping:
externalId: treat_external_id
updatedAt: updated_gmt_at
createdAt: created_gmt_at
patientExternalId: patient_id
clinicId: organization_id
occurredAt: clinic_time
sourceEncounterExternalId: emr_sub_id
category: category_raw # transforms 已固定填 _review_sentinel
subtype: value # 原始动作名("复查"/"暂观"等)
toothPosition: tooth_position
doctorId: user_id
doctorName: user_name
enum_mapping:
category:
_review_sentinel: review
......@@ -172,17 +172,93 @@ transforms:
tooth_position: toothPosition
where:
value: { not_empty: true }
# E.3.1 归一(新列 value_norm;external_id 仍用原始 value,保持与已摄入数据的幂等键连续)
- kind: derive
input: _treat_raw
output: treatment_actual_rows
output: _treat_raw
fields:
category_raw:
value_norm:
op: normalize
from: value
# E.3.2 三路分流(同 jvs-dw C.3 语义):建议→recommendation / 流程复查→review / 其余→actual
# 实测(2026-07-18 全量):建议/推荐开头 153 行、复查类 60 行(其中拆线 50——不入 review,
# 按 jvs-dw 2026-06-11 一线判例 拆线=术后护理=外科治疗动作,走 default→actual→enum 拆线→surgical)
- kind: route_by_pattern
input: _treat_raw
field: value_norm
routes:
- output: _rec_raw
when:
starts_with: ['建议', '推荐']
# 流程/复查/行政词表(取自 jvs-dw review_terms 核心,normalize 后 ASCII 形态)
- output: _review_raw
when:
equals:
- 常规复查
- 复查
- 定期复查
- 检查
- 初诊检查
- 正畸复查
- 正畸检查
- 正畸复诊
- 种植复查
- 牙周复查
- 保持器复诊
- 暂观
- 观察
- 观察随访
- 随诊观察
- 随访观察
- 无治疗
- 重复
- 取资料
- 转诊
- 正畸咨询
- 正畸会诊
- 方案沟通
- 沟通治疗方案
- 听方案
- 缴费
- 未拍片
- output: _actual_raw
when:
default: true
# E.3.3 真治疗 → actual
- kind: derive
input: _actual_raw
output: treatment_actual_rows
fields:
category_raw:
op: coalesce
from: ['value_norm']
treat_external_id:
op: concat
parts: ['${emr_sub_id}', '|treat|', '${value}', '|', '${tooth_position}']
# E.3.4 流程复查 → review(category 固定哨兵,assembler 翻成 review)
- kind: derive
input: _review_raw
output: treatment_review_rows
fields:
category_raw:
op: concat
parts: ['_review_sentinel']
treat_external_id:
op: concat
parts: ['${emr_sub_id}', '|treat|', '${value}', '|', '${tooth_position}']
# E.3.5 建议/推荐 → recommendation(共享 recommendation-code 字典翻召回码)
- kind: derive
input: _rec_raw
output: recommendation_rows
fields:
rec_external_id:
op: concat
parts: ['${emr_sub_id}', '|rec|', '${value}', '|', '${tooth_position}']
# ── E.4 影像:med_check + 类型字典 → class_name(modality 经共享字典翻)──
- kind: lookup
input: med_check
......@@ -227,3 +303,5 @@ assemblers:
- { file: assemblers/treatment_actual.yaml }
- { file: assemblers/treatment_planned.yaml }
- { file: assemblers/image.yaml }
- { file: assemblers/treatment_review.yaml }
- { file: assemblers/recommendation.yaml }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment