# diagnosis — 独立诊断 fact
# 消费 transforms 输出表 diagnosis_rows(split_json_array + trim + coalesce 拼好)
#
# code 来源(diag_code_src):有 stdCode → K 码(已截短);否则 → 归一中文名,由下方 enum_mapping 翻译。
# 翻不出的中文名 → _default "" → parser 落 code=null(不丢 fact,留 message 给 Layer C LLM 补码)。
canonical: diagnosis

emits:
  action: diagnosis_recorded
  subjectType: diagnosis
  occurredAtField: occurredAt

primary:
  table: diagnosis_rows
  key: diag_external_id

field_mapping:
  externalId:                   diag_external_id
  # W4 末 DW upsert:updatedAt 进 source_event_id 幂等键,host UPDATE → 新 transaction(否则永久 dedup 漏 update)
  updatedAt:         updated_date
  createdAt:         created_date
  patientExternalId:            patient_id
  clinicId:                     organization_id
  occurredAt:                   created_date   # 就诊精确时刻(rq 只到日→零点,无法跟带时间的预约比先后);created_date=初次录入=就诊点,100% 同 rq 日
  sourceEncounterExternalId:    emr_id
  code:                         diag_code_src    # K 码 或 归一中文名 → enum_mapping 翻译
  stdCodeRaw:                   std_code         # 溯源:判 code_source(std_code / name_map / null)
  name:                         message          # 原始中文名(展示 + LLM 输入)
  toothPosition:                tooth_position
  doctorId:                     user_id          # 诊断医生(从 emr 父级继承)
  doctorName:                   doctor_name      # 诊断医生名(快照)

# ── code 翻译 ──
# ① ICD K 大类直通(已 substring 的 stdCode);② 中文标准术语 → K 码白名单(草案,⚠️ 待牙医 review)
# 实测 ~98% 诊断没填 stdCode,只给标准中文名,这张表把高频高置信术语救回 K 码。
# 不在白名单的(复合 / 不确定 / 流程性,如"龋(16.继发龋)"、"种植术后")→ _default → code=null。

# ── 字典分层(2026-07 重构):临床通用层抽到 _shared/dict,本地只留 jvs-dw 判例 ──
# 合并语义:本地 enum 同 key 覆盖共享;本地 keyword 规则优先;_default 本地声明。
dict_includes:
  - ../../_shared/dict/diagnosis-kcode.yaml

enum_mapping:
  code:
    # ⭐ "牙齿缺少" 实际是 host 通用术语,大多用于成人后天缺失(临床路径=种植/修复,跟 K08 完全一致)
    # 之前误归 K00 导致陆伟根(62 岁)等成人患者出现"先天/萌出处置"链 — 不合临床
    # 改归 K08 — 跟 "牙缺失"/"后天性牙齿缺失" 同处理。【宿主判例:jvs-dw 用词语义,不入共享层】
    牙齿缺少: K08

    # 兜底:翻不出 → 共享层 keyword_mapping 含词兜底;再不中 → 空 → code=null(不丢 fact)
    _default: ""
