-- 回访执行客服(patient_return_visits.task_director_id / _name)
--
-- 【要解决什么】主管指派工单时要选人,但 host **不提供"客服归属诊所"字段** —— 只能按行为反推:
--   「该诊所近 N 月有过回访记录的客服」。DW fact_returnvisit_out 早就带 task_director_id/name,
--   PAC 侧此前没映射,于是花名册只能靠离线快照 data/jvs-dw/users.json(已陈旧,无刷新机制)。
--
-- 【为什么不是"专属客服"】患者主档的 current_task_director 落在 patients.preferences.dedicatedCs,
--   语义是"这个患者当前挂在谁名下";本字段是"**这次回访是谁做的**",两者可以是不同人。
--   实测口径差异也很大:回访表 5,110 个 distinct 客服 vs 患者表 1,865 个(2.7 倍)——
--   回访是操作留痕,覆盖更全。故各存各的,不复用同一列。
--
-- 【索引】(host, tenant, clinic, task_director, task_date desc) 正是名册查询的形状:
--   按诊所圈人 + 时间窗过滤 + 去重客服。单列索引不够(clinic 基数只有 64,选择性差)。
--
-- 【存量】加可空列不重写表(PG11+ 元数据操作),存量行为 NULL —— 名册查询自动跳过它们。
--   166.7 万存量行走一次性 DW 回填(按 external_id 批量 UPDATE),不走 cold-import:
--   回访是 upsert 资源、**不进 transaction**,所以 reparse 无效;而整表重摄会连带
--   重摄这批患者的病历/结算/预约(2026-08-01 实测:那条路把测试服磁盘写满了)。
-- 【顺带补宿主侧时间】host created_date / updated_date 一直没摄。
--   注意**不能**复用本表已有的 created_at / updated_at —— 那两个是 PAC 入库时间
--   (@default(now()) / @updatedAt),回填和重摄都会刷成"现在",反映不了业务时间。
--   命名沿用 patient_facts.source_updated_at 的既有口径(source* = 宿主侧时间)。
--   用处:名册的"近 N 月在岗"若改用任务创建时间而非 task_date 会更准 —— task_date 含未来排程
--   (生产实测最远到 2033-11-12),拿它卡时间窗会把排了远期任务的人误算成在岗。
ALTER TABLE "patient_return_visits"
  ADD COLUMN IF NOT EXISTS "task_director_id"   TEXT,
  ADD COLUMN IF NOT EXISTS "task_director_name" TEXT,
  ADD COLUMN IF NOT EXISTS "source_created_at"  TIMESTAMPTZ(3),
  ADD COLUMN IF NOT EXISTS "source_updated_at"  TIMESTAMPTZ(3);

CREATE INDEX IF NOT EXISTS "patient_return_visits_roster_idx"
  ON "patient_return_visits" ("host_id", "tenant_id", "clinic_id", "task_director_id", "task_date" DESC);
