fix(worker): 删除依赖残留字段 task_id 的死 JOIN,店铺名兜底改读 material_json
核查结论:work_orders.task_id 是残留字段,不是"数据没同步上来"。
1. 唯一写入点 createWorkOrder 写的是 input.taskId || null,而两个调用方
一个硬编码 taskId: null、一个根本不传;updateWorkOrder 的白名单里也没有它;
git 全历史检索 `taskId:` 只出现过 null 一种取值。
2. 即便强写也无从关联:工单关联 100,231 个订单、履约任务关联 87,603 个订单,
交集为 0;按 order_item_id 比对 100,229 条同样 0 命中。而两者时间范围
(2026-07~10)与 orders.id 区间(1~280k)都重叠 —— 说明是按规则表分流的
两条并行履约通道,一单只走一条。
3. 依赖它的 idx_work_orders_task_unique 为空(8KB)。
改动:
- 三处 `LEFT JOIN fulfillment_tasks ft ON ft.id = wo.task_id`
(取消申请 / 售后案 / 工单反馈)恒为空,删除;
- 店铺名兜底 `ft.shop_name/shop_id` 改为读工单自己的
material_json->'source'->>'shopName'/'shopId';
- 取消申请里的 `ft.platform_order_id` 一并删除(实测 needs_ft_pid_fallback = 0,纯 no-op);
- 迁移 091 给列与索引打上注释,避免后续再被当成数据问题重复排查。
生产逐行回归(旧逻辑 vs 新逻辑取差集):
取消申请 715/715 行、103 条店铺名从空变有值、回归 0;
售后案 21/21 行、1 条、回归 0;工单反馈 348/348 行、15 条、回归 0;
合计 119 条修复、0 条回归、行数与 platform_order_id 零变化。
验证:新增源码级守卫(禁止再 JOIN fulfillment_tasks、兜底必须读 material_json)。
This commit is contained in:
@@ -0,0 +1,30 @@
|
||||
-- 091_annotate_vestigial_work_order_task_id.sql —— 标注残留字段 work_orders.task_id。
|
||||
--
|
||||
-- 该列自迁移 004 引入,设计意图是把接单工单关联到履约任务(fulfillment_tasks)。
|
||||
-- 但生产核查(2026-10-03,库 order_site @47.114.114.225)确认它从未被写入过,
|
||||
-- 且结构上也无从关联:
|
||||
--
|
||||
-- 1) 唯一写入点是 createWorkOrder 的 `input.taskId || null`,而两个调用方
|
||||
-- 一个是硬编码 `taskId: null`(sync-worker-orders-service),另一个根本不传;
|
||||
-- updateWorkOrder 的 patch 白名单里也没有这一列;
|
||||
-- git 全历史检索 `taskId:` 只出现过 null 一种取值。
|
||||
--
|
||||
-- 2) 即便强行写值也无从关联:工单关联 100,231 个订单、履约任务关联 87,603 个订单,
|
||||
-- 交集为 0;按 order_item_id 比对 100,229 条同样 0 命中。而两者的时间范围
|
||||
-- (2026-07 ~ 10)与 orders.id 区间(1 ~ 280k)却都是重叠的 —— 说明两套系统
|
||||
-- 是按规则表分流的两条并行履约通道(命中 work_product_rules 建工单、
|
||||
-- 命中 fulfillment_profiles 建履约任务),一单只走一条,本就不存在对应关系。
|
||||
--
|
||||
-- 3) 依赖该列的三处 `LEFT JOIN fulfillment_tasks ft ON ft.id = wo.task_id`
|
||||
-- (取消申请 / 售后案 / 工单反馈)永远匹配不上;其中用作店铺名兜底的那部分
|
||||
-- 已改为读 wo.material_json->'source'->>'shopName'(生产实测覆盖 2478 条
|
||||
-- 中 2476 条),死 JOIN 已删除。
|
||||
--
|
||||
-- 结论:保留列与索引(drop 不可逆,且类型定义与类型行多处引用),仅作标注,
|
||||
-- 避免后续再被当成"数据没同步上来"重复排查。
|
||||
|
||||
COMMENT ON COLUMN work_orders.task_id IS
|
||||
'【残留字段,勿用】设计上用于关联履约任务,但无任何代码写入,且工单与履约任务的订单集合零交集(order_id / order_item_id 比对均为 0)。需要店铺名等信息请读 material_json->''source'',不要 JOIN fulfillment_tasks。';
|
||||
|
||||
COMMENT ON INDEX idx_work_orders_task_unique IS
|
||||
'【残留索引】服务于永不写入的 work_orders.task_id,当前 0 行;保留以免重建时结构漂移。';
|
||||
Reference in New Issue
Block a user