fix(plan): 确认分配 500 —— 全 null 数组被 Prisma 推成 integer[],撞上 ::timestamptz[]
FRIDAY 宿主接入测试机后,点「确认分配」必 500: POST /pac/v1/plans/assignments → 42846 cannot cast type integer[] to timestamp with time zone[] at plan-assignment.service.ts:392 ($transaction 内) 机理:Prisma 从**值**推断数组元素类型。`aDedicatedCsLastVisit`(该患者专属客服的 最近到诊时间)整个数组非空且全是 null 时推不出来,退化成 integer[],撞上显式 ::timestamptz[]。⚠ ️ 空数组 [] 反而安全(走不到转换),**只有「非空且全 null」才炸**。 为什么瑞尔一直没事:那边有回访历史,多数患者有专属客服 → 数组里总有非 null。 FRIDAY 是新宿主、无回访历史 → 整批全 null。 ⇒ **这不是 FRIDAY 特有的**,瑞尔只要碰上「这批人恰好都没有专属客服」一样炸。 修法:参数以 ISO 文本传,再整体 ::text[]::timestamptz[]。三种形态(全 null / 混合 / 全有值)都在测试机实测通过。不动 t(...) 的列名与顺序 —— 九个数组的位置 对应关系很脆,那里原本就有一条警告。 实测哪些目标类型会塌(2026-09-21 测试机): ::timestamptz[]❌ ::uuid[]❌ ::text[]✅ ::double precision[]✅ ::int[]✅ ⇒ 同段的 aDedicatedCs(::text[])、aSourceConfidence(::double precision[]) 虽然也可空但**没病**,没有顺手改 —— 测试里专门锁了这一点。 测试:新增仓库级守卫 —— 凡 ${x}::timestamptz[] / ::uuid[] 且 x 声明含 `| null` 即判失败,覆盖全 src 而不只是这一处。5 项变异全部被咬红,其中一项 (toContain('toISOString()'))第一版没牙、被变异测试当场抓到后已收紧为只锁那一行。 全量 1979 passed。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Showing
Please
register
or
sign in
to comment