# patient — 主档 upsert(不进 transaction,无 emits)
# 直接消费 source table fact_client_out(transforms 不需要,fact_client_out 形态干净)
canonical: patient

primary:
  table: fact_client_out
  key: patient_id

field_mapping:
  externalId:           patient_id    # Int64 → ColdImportService 入库时 String 化
  # W4 末 DW upsert:updatedAt 进 source_event_id 幂等键,host UPDATE → 新 transaction(否则永久 dedup 漏 update)
  updatedAt:         last_visit_time
  createdAt:         first_visit_time
  name:                 client_name
  gender:               client_gender
  birthDate:            birthday
  medicalRecordNumber:  file_num       # 病历号(辅助标识,客服沟通用)
  notes:                follow_content
  # 专属客服(当前任务负责人)— 路由/指派属性,非画像特征。upsert 时并入 patients.preferences.dedicatedCs。
  #   时效:"当前"会换 → 存当前值(upsert 覆盖);用于详情页展示 + 推送人匹配。
  dedicatedCsName:      current_task_director
  dedicatedCsId:        current_task_director_id
  # 获客渠道(初诊来源,A.2.1)— 一级经 enum_mapping 归一 PAC 标准;二级原值透传
  acquisitionChannel:   primary_category
  acquisitionSub:       sub_category
  # 转介绍(B.1.2):推荐人数 / 带来转化总额(元;dispatcher 转分)
  referralCount:        recommend_num
  referralAmount:       recommend_amount
  # 宿主跟进闸 —— DW「潜在治疗池」(= FRIDAY 侧「复杂病例」)在跟 → PAC 不再电话召回,
  #   避免两边同时联系同一个人。列由 manifest 主档 SQL 的标量子查询算出(口径/坑见那里),
  #   经 canonical booleanFields coerce 成布尔 → patient_profiles.host_follow_up_active。
  #   落 false(非 null)= 明确"宿主没在跟",与 FRIDAY 侧语义一致;闸判 IS NOT TRUE,行为相同。
  hostFollowUpActive:   has_active_complex_case
  # doNotContact / deceased 不映射 — 走 PatientCanonicalSchema default false

# host(瑞尔/瑞泰)初诊一级渠道 → PAC 立柱标准(canonical-codes.PACAcquisitionChannels)
enum_mapping:
  acquisitionChannel:
    走入:         walk_in
    口碑客户:     word_of_mouth
    集团销售渠道: group_sales
    集团营销渠道: group_marketing
    地区营销渠道: regional_marketing
    电商平台:     ecommerce
    自媒体网络:   social_media
    瑞尔员工:     employee
    其他:         other
    _default:     other
