# treatment_review — 复查 / 拆线 / 暂观 / 无治疗 等流程性事实
# 消费 transforms 输出表 treatment_review_rows(route_by_pattern 已分流)
# 全部 fact 都打 category='review'(canonical-codes 第 11 类)
#
# ⭐ kind=actual:treatment_review_rows 100% 来自 EMR.treat_plan(=本次治疗 actual,
#    本次确实做了的复查/拆线/暂观/流程事件);EMR.plan 字段的复查项当前是 drop 的。
#    旧版误写 kind=planned → 拆线等"本次做的"被错误落到「治疗计划」。
#    ⚠️ 未来若把 EMR.plan 的复查项 union 进来(那才是 planned/未来),需按来源分流 kind,
#       不能再共用本 assembler 的固定 actual(见 manifest C.4 TODO)。
canonical: treatment

emits:
  action: treatment_completed   # → parser 推 kind=actual / status=fulfilled(本次已做)
  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
  # 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
  category:                    category_raw    # transforms 已固定填 _review_sentinel
  subtype:                     treat_name      # 原始动作名("常规复查"/"拆线"等)
  toothPosition:               tooth_position
  doctorId:                    user_id          # 计划医生(从 emr 父级继承)
  doctorName:                  doctor_name      # 计划医生名(快照)

enum_mapping:
  category:
    _review_sentinel: review
