# 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。
enum_mapping:
  code:
    # K 大类直通
    K00: K00
    K01: K01
    K02: K02
    K03: K03
    K04: K04
    K05: K05
    K06: K06
    K07: K07
    K08: K08
    K09: K09
    K10: K10
    K11: K11
    K12: K12
    K13: K13
    K14: K14
    # ── 中文术语 → K 码(高置信草案,trim 已去尾部标点)──
    # K05 牙周 / 牙龈
    慢性牙龈炎: K05
    牙龈炎: K05
    慢性龈炎: K05
    龈炎: K05
    菌斑性龈炎: K05
    菌斑性牙龈炎: K05               # W4 末补,DW top 200 漏配("牙龈"vs"龈"长写)
    慢性牙周炎: K05
    牙周炎: K05
    重度牙周炎: K05
    中度牙周炎: K05
    侵袭性牙周炎: K05
    # K02 龋
    龋: K02
    龋齿: K02
    龋坏: K02
    浅龋: K02
    中龋: K02
    深龋: K02
    继发龋: K02
    # ⚠️ 深窝沟 故意不映射(落 _default → code=null,不召、病历照原文显示):
    #    它是龋【风险】(窝沟深易蛀,无龋洞),对症是窝沟封闭(preventive 预防),
    #    不属于"应治未治(龋洞没补)"召回范畴。归任何疾病码都会误召(预防治疗满足不了"已治"闸)。
    # K04 牙髓 / 根尖周
    牙髓炎: K04
    慢性牙髓炎: K04
    急性牙髓炎: K04
    根尖周炎: K04
    慢性根尖周炎: K04
    慢性根尖炎: K04
    急性根尖周炎: K04
    牙髓坏死: K04
    # K03 牙体硬组织其他(楔缺 / 缺损 / 残根冠)
    楔状缺损: K03
    楔形缺损: K03
    楔缺: K03
    牙体缺损: K03
    残根: K03
    残冠: K03
    # K01 阻生 / 埋伏
    阻生齿: K01
    阻生牙: K01
    阻生: K01
    埋伏牙: K01
    # K07 牙颌面异常 / 错颌
    错颌畸形: K07
    牙列不齐: K07
    牙列拥挤: K07
    安氏I类错颌畸形: K07
    安氏II类错颌畸形: K07
    安氏III类错颌畸形: K07
    # K08 缺牙 / 缺失
    牙缺失: K08
    缺失: K08
    缺失牙: K08
    牙列缺损: K08
    牙列缺失: K08
    后天性牙齿缺失: K08
    全口牙列缺失: K08
    上颌牙列缺损: K08
    下颌牙列缺损: K08
    废用牙: K08             # 临床功能性缺失
    无功能牙: K08

    # ── W3 末扩 K00-K08 全覆盖(源 DW 数据驱动,见 dw-data-source-issues #15)──

    # K00 牙发育 / 萌出障碍 — 只收"真病种",不收"乳牙列 / 混合牙列"等正常生理态(走 _default 不入诊断)
    乳牙滞留: K00
    滞留乳牙: K00
    乳牙早失: K00
    乳牙松动: K00            # 替换期非自然脱落
    替换期乳牙松动: K00
    松动乳牙: K00
    多生牙: K00
    额外牙: K00
    埋伏多生牙: K00
    根方多生牙: K00
    间多生牙: K00
    腭侧多生牙: K00
    前牙区埋伏多生牙: K00
    先天缺失: K00
    先天缺牙: K00
    # ⭐ "牙齿缺少" 实际是 host 通用术语,大多用于成人后天缺失(临床路径=种植/修复,跟 K08 完全一致)
    # 之前误归 K00 导致陆伟根(62 岁)等成人患者出现"先天/萌出处置"链 — 不合临床
    # 改归 K08 — 跟 "牙缺失"/"后天性牙齿缺失" 同处理
    牙齿缺少: K08
    釉质发育不全: K00        # = K00.2 釉质形成
    釉质发育不良: K00
    牙釉质发育不全: K00
    牙釉质发育不良: K00
    氟斑牙: K00              # K00.3 牙齿氟中毒着色
    四环素牙: K00            # K00.3 内源性着色
    迟萌: K00                # K00.6 萌出障碍
    恒牙迟萌: K00
    萌出迟缓: K00
    萌出不全: K00
    异位萌出: K00
    萌出间隙不足: K00
    部分萌出: K00
    未萌出: K00
    牙萌出障碍: K00
    牙萌出延迟: K00

    # K01 阻生 / 埋伏(补 host 真实用词)
    智齿: K01                # host 大量直接录"智齿"作为诊断,实际是阻生齿
    阻生智齿: K01
    近中阻生: K01
    垂直位阻生齿: K01
    垂直位智齿: K01
    异位阻生: K01

    # K03 牙体硬组织其他(补复合 / 不良修复体 / 牙齿磨耗)
    牙齿楔状缺损: K03
    牙体磨耗: K03
    牙磨耗: K03
    重度磨耗: K03
    不良修复体: K03          # 已存在 host 数据,主要走 restorative / prosthodontic 重做
    不良充填体: K03
    死髓牙: K03              # 牙体已失活,临床走 prosthodontic 桩冠 / surgical 拔除
    修复体脱落: K03
    充填脱落: K03
    冠折: K03
    简单冠折: K03
    复杂冠折: K03
    根折: K03
    牙外伤: K03
    # ⚠️ 脱矿 / 牙本质敏感 故意不映射(落 _default → code=null):
    #    脱矿=早期龋【风险】(对症涂氟,预防)、牙本质敏感=【症状】(对症脱敏,非修复缺损)。
    #    跟已 null 的"牙釉质脱矿/釉质脱矿"口径统一,均不作"应治未治"召回信号。

    # K05 牙周 / 牙龈(补 host 真实高频用词)
    牙周病: K05
    全口慢性牙周炎: K05
    萌出性龈炎: K05          # 实际牙龈炎,临床路径同 K05
    # ⚠️ 牙菌斑堆积 不映射(卫生/菌斑【风险】,对症洁治/宣教=预防);菌斑性龈炎是真龈炎,保留 K05

    # K06 牙龈 / 牙槽嵴疾患(原本走 _default → code=null,W3 末归 K06)
    牙周脓肿: K06
    慢性牙周脓肿: K06
    急性牙周脓肿: K06
    冠周炎: K06              # K05.2 / K06 边缘,临床归 K06 (智齿冠周特化)
    智齿冠周炎: K06
    急性冠周炎: K06
    慢性冠周炎: K06
    牙龈萎缩: K06
    龈萎缩: K06
    牙龈增生: K06
    龈增生: K06
    药物性牙龈增生: K06
    牙龈瘤: K06
    龈瘤: K06
    龈息肉: K06
    根分叉病变: K06          # K05.x 并发,但临床上独立标
    重度根分叉病变: K06
    # ⚠️ 食物嵌塞 不映射(【症状】,对症调牙合/牙周处置,非"应治未治"病灶)→ 落 _default code=null
    附着丧失: K06
    附着龈缺如: K06
    牙槽骨缺损: K06
    牙槽骨骨尖: K06
    牙槽嵴: K06
    唇系带附着低: K06
    唇系带附着过低: K06
    唇系带附丽过低: K06
    唇系带附着异常: K06
    上唇系带附着低: K06
    上唇系带附着异常: K06
    舌系带过短: K06
    舌系带短: K06
    舌系带附着低: K06
    舌系带附着异常: K06
    舌系带附着过前: K06
    系带异常: K06

    # K09 牙发生囊肿(根尖囊肿/含牙囊肿/颌骨囊肿)— DW 真实数据 ~170 条,临床必摘除
    根尖囊肿: K09
    根尖周囊肿: K09
    慢性根尖囊肿: K09
    含牙囊肿: K09
    颌骨囊肿: K09
    上颌骨囊肿: K09
    下颌骨囊肿: K09
    牙源性囊肿: K09

    # K07 错颌畸形(补"合"字版本 + 安氏分类异写)
    错合畸形: K07            # host 用"合"而非"颌"也很多
    错合畸形安氏Ⅰ类: K07
    错合畸形安氏Ⅱ类: K07
    错合畸形安氏Ⅲ类: K07
    错合畸形安氏II类: K07    # 阿拉伯数字版本
    错合畸形安氏III类: K07
    安氏I类: K07
    安氏II类: K07
    安氏III类: K07
    安氏Ⅰ类: K07
    安氏Ⅱ类: K07
    安氏Ⅲ类: K07
    前牙反合: K07
    前牙反颌: K07
    深覆合: K07
    深覆颌: K07
    牙位置异常: K07
    骨性I类: K07
    骨性II类: K07
    骨性III类: K07
    骨性Ⅰ类: K07
    骨性Ⅱ类: K07
    骨性Ⅲ类: K07

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

# ─────────────────────────────────────────────────────────
# 含词兜底 —— 精确 enum 未命中时,按序含词匹配 → K 码。
# 治本长尾:诊断常是复合/变体("埋伏阻生;"、"前倾位阻生,颌面龋"、"牙齿缺失"、"窝沟龋"…),
# 精确白名单永远漏(沈建锋 28/38 阻生智齿 → null → 漏召)。引擎按 canonicalKey 通用。
# 顺序=优先级:阻生/缺失/牙髓 在 龋 之前 → 复合"阻生+龋"判 K01(智齿该评估拔除,非补)。
# ⚠️ 龋:any=[龋] + none=[风险,可疑,脱矿] —— 排除"高龋风险/可疑龋"(=风险,非龋洞,同深窝沟不召);
#    深窝沟/食物嵌塞/牙本质敏感 不含上述关键词 → 仍落 null,故意不召(无回归)。
keyword_mapping:
  code:
    - { value: K08, any: [缺失, 缺牙, 牙列缺损] }
    - { value: K01, any: [阻生, 埋伏, 智齿] }
    - { value: K09, any: [颌骨囊肿, 含牙囊肿, 根尖囊肿] }
    - { value: K04, any: [牙髓炎, 牙髓坏死, 根尖周, 根尖炎, 牙髓] }
    - { value: K03, any: [楔状, 残根, 残冠, 隐裂, 牙体缺损, 牙折] }
    - { value: K05, any: [牙周炎, 龈炎, 牙周袋] }
    - { value: K02, any: [龋], none: [风险, 可疑, 脱矿] }
