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:
@@ -23,8 +23,11 @@ const AFTER_SALES_CASE_SELECT = `
|
||||
COALESCE(
|
||||
NULLIF(BTRIM(o.shop_name), ''),
|
||||
NULLIF(BTRIM(o.shop_id), ''),
|
||||
NULLIF(BTRIM(ft.shop_name), ''),
|
||||
NULLIF(BTRIM(ft.shop_id), ''),
|
||||
-- 原先兜底用 fulfillment_tasks,但 wo.task_id 是残留字段(无代码写入、
|
||||
-- 两套系统订单集合零交集),那个 LEFT JOIN 永远匹配不上,兜底形同虚设。
|
||||
-- 改用工单自己的 material_json 快照(生产实测覆盖 2,478 条中的 2,476 条)。
|
||||
NULLIF(BTRIM(wo.material_json->'source'->>'shopName'), ''),
|
||||
NULLIF(BTRIM(wo.material_json->'source'->>'shopId'), ''),
|
||||
''
|
||||
) AS shop_name,
|
||||
wu.username AS worker_username,
|
||||
@@ -33,7 +36,6 @@ const AFTER_SALES_CASE_SELECT = `
|
||||
FROM worker_after_sales_cases ac
|
||||
INNER JOIN work_orders wo ON wo.id = ac.work_order_id
|
||||
LEFT JOIN orders o ON o.id = wo.order_id
|
||||
LEFT JOIN fulfillment_tasks ft ON ft.id = wo.task_id
|
||||
INNER JOIN worker_users wu ON wu.id = ac.worker_id
|
||||
LEFT JOIN work_order_shares wos ON wos.id = ac.work_order_share_id
|
||||
`
|
||||
|
||||
@@ -36,6 +36,8 @@ export async function createWorkOrder(input: CreateWorkOrderInput): Promise<Work
|
||||
input.productRuleId || null,
|
||||
input.orderId || null,
|
||||
input.orderItemId || null,
|
||||
// task_id 是残留字段(见迁移 091):没有调用方会传非空值,工单与履约任务的
|
||||
// 订单集合也零交集,所以这里恒为 NULL。保留列是为了不改结构,勿据此做关联查询。
|
||||
input.taskId || null,
|
||||
input.platformOrderId,
|
||||
input.productName,
|
||||
|
||||
@@ -19,12 +19,17 @@ import type { WorkerCancelRequestRow, WorkOrderRow, WorkOrderShareRow } from './
|
||||
const WORKER_CANCEL_REQUEST_SELECT = `
|
||||
SELECT
|
||||
cr.*,
|
||||
COALESCE(NULLIF(BTRIM(wo.platform_order_id), ''), o.platform_order_id, ft.platform_order_id, '') AS platform_order_id,
|
||||
COALESCE(NULLIF(BTRIM(wo.platform_order_id), ''), o.platform_order_id, '') AS platform_order_id,
|
||||
-- 店铺名兜底:orders 为空时退回工单自己的 material_json 快照。
|
||||
-- 这里原先兜底用的是 fulfillment_tasks,但 wo.task_id 是残留字段(无任何代码写入,
|
||||
-- 且工单与履约任务的订单集合零交集),那个 LEFT JOIN 永远匹配不上,
|
||||
-- 生产实测 2,478 条 orders 店铺名为空的工单因此显示成空。
|
||||
-- material_json->'source'->>'shopName' 实测覆盖其中 2,476 条。
|
||||
COALESCE(
|
||||
NULLIF(BTRIM(o.shop_name), ''),
|
||||
NULLIF(BTRIM(o.shop_id), ''),
|
||||
NULLIF(BTRIM(ft.shop_name), ''),
|
||||
NULLIF(BTRIM(ft.shop_id), ''),
|
||||
NULLIF(BTRIM(wo.material_json->'source'->>'shopName'), ''),
|
||||
NULLIF(BTRIM(wo.material_json->'source'->>'shopId'), ''),
|
||||
''
|
||||
) AS shop_name,
|
||||
wo.product_name,
|
||||
@@ -34,7 +39,6 @@ const WORKER_CANCEL_REQUEST_SELECT = `
|
||||
FROM worker_order_cancel_requests cr
|
||||
INNER JOIN work_orders wo ON wo.id = cr.work_order_id
|
||||
LEFT JOIN orders o ON o.id = wo.order_id
|
||||
LEFT JOIN fulfillment_tasks ft ON ft.id = wo.task_id
|
||||
INNER JOIN worker_users wu ON wu.id = cr.worker_id
|
||||
LEFT JOIN work_order_shares wos ON wos.id = cr.work_order_share_id
|
||||
`
|
||||
|
||||
@@ -13,8 +13,11 @@ const WORKER_ORDER_FEEDBACK_SELECT = `
|
||||
COALESCE(
|
||||
NULLIF(BTRIM(o.shop_name), ''),
|
||||
NULLIF(BTRIM(o.shop_id), ''),
|
||||
NULLIF(BTRIM(ft.shop_name), ''),
|
||||
NULLIF(BTRIM(ft.shop_id), ''),
|
||||
-- 原先兜底用 fulfillment_tasks,但 wo.task_id 是残留字段(无代码写入、
|
||||
-- 两套系统订单集合零交集),那个 LEFT JOIN 永远匹配不上,兜底形同虚设。
|
||||
-- 改用工单自己的 material_json 快照(生产实测覆盖 2,478 条中的 2,476 条)。
|
||||
NULLIF(BTRIM(wo.material_json->'source'->>'shopName'), ''),
|
||||
NULLIF(BTRIM(wo.material_json->'source'->>'shopId'), ''),
|
||||
''
|
||||
) AS shop_name,
|
||||
wu.username AS worker_username,
|
||||
@@ -23,7 +26,6 @@ const WORKER_ORDER_FEEDBACK_SELECT = `
|
||||
FROM worker_order_feedbacks wf
|
||||
INNER JOIN work_orders wo ON wo.id = wf.work_order_id
|
||||
LEFT JOIN orders o ON o.id = wo.order_id
|
||||
LEFT JOIN fulfillment_tasks ft ON ft.id = wo.task_id
|
||||
INNER JOIN worker_users wu ON wu.id = wf.worker_id
|
||||
LEFT JOIN work_order_shares wos ON wos.id = wf.work_order_share_id
|
||||
`
|
||||
|
||||
Reference in New Issue
Block a user