|
|
@@ -717,25 +717,44 @@ public class S3MdpSyncTransformService : ITransient
|
|
|
yield return Cmd(
|
|
|
"""
|
|
|
INSERT INTO mdp_std_purchase_request
|
|
|
- (tenant_id, factory_id, company_id, source_system, pr_no, pr_line, item_code, item_name, supplier_code, request_qty, request_date, send_date, arrive_date, status, source_biz_key, sync_batch_id, sync_time)
|
|
|
- SELECT tenant_id, factory_id, company_id, 'AIDOP',
|
|
|
- COALESCE(JSON_UNQUOTE(JSON_EXTRACT(raw_data,'$.pr_billno')), source_row_id),
|
|
|
- JSON_UNQUOTE(JSON_EXTRACT(raw_data,'$.line_no')),
|
|
|
- IFNULL(JSON_UNQUOTE(JSON_EXTRACT(raw_data,'$.item_number')), ''),
|
|
|
- IFNULL(JSON_UNQUOTE(JSON_EXTRACT(raw_data,'$.item_name')), ''),
|
|
|
- JSON_UNQUOTE(JSON_EXTRACT(raw_data,'$.supplier_number')),
|
|
|
+ (tenant_id, factory_id, company_id, source_system, pr_no, pr_line, work_order, sales_order_entry_id, item_code, item_name, supplier_code, request_qty, request_date, send_date, arrive_date, status, source_biz_key, sync_batch_id, sync_time)
|
|
|
+ SELECT g.tenant_id, g.factory_id, g.company_id, 'AIDOP',
|
|
|
+ COALESCE(JSON_UNQUOTE(JSON_EXTRACT(g.raw_data,'$.pr_billno')), g.source_row_id),
|
|
|
+ JSON_UNQUOTE(JSON_EXTRACT(g.raw_data,'$.line_no')),
|
|
|
+ -- Stage-3 订单归因第 1 段:PR 所属工单号(源 srm_pr_main.pr_mono)。
|
|
|
+ -- 必须把 JSON 的字面量 'null' 归一成真 NULL —— 否则下游 JOIN 会去匹配
|
|
|
+ -- 一个叫 "null" 的工单号(既有 mdp_std_purchase_order.work_order 正是踩了
|
|
|
+ -- 这个坑:451 行里 208 行是字面量 'null')。
|
|
|
+ NULLIF(NULLIF(JSON_UNQUOTE(JSON_EXTRACT(g.raw_data,'$.pr_mono')), 'null'), ''),
|
|
|
+ -- Stage-3 订单归因第 2 段:由工单号派生销售订单明细行 Id。
|
|
|
+ -- 刻意不读源表 srm_pr_main.sentry_id —— 该字段源侧 1012/1012 全 NULL,
|
|
|
+ -- 生产代码从未写过;这里改从 S2 标准层(1.0.532 建立的桥)派生。
|
|
|
+ -- LEFT JOIN:S2 跑批未覆盖的租户得到 NULL,而不是让 PR 整行消失。
|
|
|
+ wo.sales_order_entry_id,
|
|
|
+ IFNULL(JSON_UNQUOTE(JSON_EXTRACT(g.raw_data,'$.item_number')), ''),
|
|
|
+ IFNULL(JSON_UNQUOTE(JSON_EXTRACT(g.raw_data,'$.item_name')), ''),
|
|
|
+ JSON_UNQUOTE(JSON_EXTRACT(g.raw_data,'$.supplier_number')),
|
|
|
COALESCE(
|
|
|
- CASE WHEN JSON_UNQUOTE(JSON_EXTRACT(raw_data,'$.qty')) REGEXP '^-?[0-9]+(\\.[0-9]+)?$' THEN CAST(JSON_UNQUOTE(JSON_EXTRACT(raw_data,'$.qty')) AS DECIMAL(18,6)) END,
|
|
|
- CASE WHEN JSON_UNQUOTE(JSON_EXTRACT(raw_data,'$.request_qty')) REGEXP '^-?[0-9]+(\\.[0-9]+)?$' THEN CAST(JSON_UNQUOTE(JSON_EXTRACT(raw_data,'$.request_qty')) AS DECIMAL(18,6)) END,
|
|
|
+ CASE WHEN JSON_UNQUOTE(JSON_EXTRACT(g.raw_data,'$.qty')) REGEXP '^-?[0-9]+(\\.[0-9]+)?$' THEN CAST(JSON_UNQUOTE(JSON_EXTRACT(g.raw_data,'$.qty')) AS DECIMAL(18,6)) END,
|
|
|
+ CASE WHEN JSON_UNQUOTE(JSON_EXTRACT(g.raw_data,'$.request_qty')) REGEXP '^-?[0-9]+(\\.[0-9]+)?$' THEN CAST(JSON_UNQUOTE(JSON_EXTRACT(g.raw_data,'$.request_qty')) AS DECIMAL(18,6)) END,
|
|
|
0),
|
|
|
- NULLIF(NULLIF(JSON_UNQUOTE(JSON_EXTRACT(raw_data,'$.create_time')), 'null'), ''),
|
|
|
- NULLIF(NULLIF(JSON_UNQUOTE(JSON_EXTRACT(raw_data,'$.send_date')), 'null'), ''),
|
|
|
- NULLIF(NULLIF(JSON_UNQUOTE(JSON_EXTRACT(raw_data,'$.arrive_date')), 'null'), ''),
|
|
|
- JSON_UNQUOTE(JSON_EXTRACT(raw_data,'$.status')),
|
|
|
- source_biz_key, @BatchId, @Now
|
|
|
- FROM mdp_stg_supply_demand
|
|
|
- WHERE source_table='srm_pr_main'
|
|
|
- ON DUPLICATE KEY UPDATE factory_id=VALUES(factory_id), item_code=VALUES(item_code), item_name=VALUES(item_name), supplier_code=VALUES(supplier_code),
|
|
|
+ NULLIF(NULLIF(JSON_UNQUOTE(JSON_EXTRACT(g.raw_data,'$.create_time')), 'null'), ''),
|
|
|
+ NULLIF(NULLIF(JSON_UNQUOTE(JSON_EXTRACT(g.raw_data,'$.send_date')), 'null'), ''),
|
|
|
+ NULLIF(NULLIF(JSON_UNQUOTE(JSON_EXTRACT(g.raw_data,'$.arrive_date')), 'null'), ''),
|
|
|
+ JSON_UNQUOTE(JSON_EXTRACT(g.raw_data,'$.status')),
|
|
|
+ g.source_biz_key, @BatchId, @Now
|
|
|
+ FROM mdp_stg_supply_demand g
|
|
|
+ -- 订单行 Id 派生。ON 里必须【自带】租户谓词:MdpSqlScope.InjectTenantFactory
|
|
|
+ -- 只改写筛选子句,结构上够不到 JOIN...ON;少了它工单号就成了跨租户字符串匹配。
|
|
|
+ -- (这里刻意不写出那个关键字:注入器对 SQL 注释同样生效,写了会被就地改写。)
|
|
|
+ -- 同租户同工单号在 mdp_std_work_order_schedule 内唯一(实测重复组 = 0),故不会扇出。
|
|
|
+ LEFT JOIN mdp_std_work_order_schedule wo
|
|
|
+ ON wo.tenant_id = g.tenant_id
|
|
|
+ AND wo.work_order = NULLIF(NULLIF(JSON_UNQUOTE(JSON_EXTRACT(g.raw_data,'$.pr_mono')), 'null'), '')
|
|
|
+ WHERE g.source_table='srm_pr_main'
|
|
|
+ ON DUPLICATE KEY UPDATE factory_id=VALUES(factory_id),
|
|
|
+ work_order=VALUES(work_order), sales_order_entry_id=VALUES(sales_order_entry_id),
|
|
|
+ item_code=VALUES(item_code), item_name=VALUES(item_name), supplier_code=VALUES(supplier_code),
|
|
|
request_qty=VALUES(request_qty), request_date=VALUES(request_date), send_date=VALUES(send_date),
|
|
|
arrive_date=VALUES(arrive_date), status=VALUES(status), sync_batch_id=VALUES(sync_batch_id), sync_time=VALUES(sync_time),
|
|
|
update_time=CURRENT_TIMESTAMP
|
|
|
@@ -744,10 +763,15 @@ public class S3MdpSyncTransformService : ITransient
|
|
|
yield return Cmd(
|
|
|
"""
|
|
|
INSERT INTO mdp_std_purchase_order
|
|
|
- (tenant_id, factory_id, company_id, source_system, po_no, po_line, po_type, supplier_code, item_code, item_name, order_qty, received_qty, returned_qty, due_date, need_date, order_date, status, buyer, work_order, source_biz_key, sync_batch_id, sync_time)
|
|
|
+ (tenant_id, factory_id, company_id, source_system, po_no, po_line, purchase_request_no, po_type, supplier_code, item_code, item_name, order_qty, received_qty, returned_qty, due_date, need_date, order_date, status, buyer, work_order, source_biz_key, sync_batch_id, sync_time)
|
|
|
SELECT d.tenant_id, d.factory_id, d.company_id, 'AIDOP',
|
|
|
JSON_UNQUOTE(JSON_EXTRACT(d.raw_data,'$.PurOrd')),
|
|
|
CAST(JSON_UNQUOTE(JSON_EXTRACT(d.raw_data,'$.Line')) AS CHAR),
|
|
|
+ -- Stage-3 订单归因主键路径:PO 行 → 采购申请单号(源 PurOrdDetail.Req,实测 1:1)。
|
|
|
+ -- 归因走这里,【不走】下面的 work_order —— 后者只在历史/UAT 批量导入的工单上
|
|
|
+ -- 有值,而源侧 PurOrdDetail.SalesJob 实测 0/448、BusinessID 实测全 0。
|
|
|
+ -- 共享采购(同物料跨多工单)因此仍能按 PO 行精确切分到各自订单。
|
|
|
+ NULLIF(NULLIF(JSON_UNQUOTE(JSON_EXTRACT(d.raw_data,'$.Req')), 'null'), ''),
|
|
|
JSON_UNQUOTE(JSON_EXTRACT(d.raw_data,'$.Potype')),
|
|
|
JSON_UNQUOTE(JSON_EXTRACT(m.raw_data,'$.Supp')),
|
|
|
IFNULL(JSON_UNQUOTE(JSON_EXTRACT(d.raw_data,'$.ItemNum')), ''),
|
|
|
@@ -763,7 +787,9 @@ public class S3MdpSyncTransformService : ITransient
|
|
|
NULLIF(NULLIF(JSON_UNQUOTE(JSON_EXTRACT(m.raw_data,'$.OrdDate')), 'null'), ''),
|
|
|
JSON_UNQUOTE(JSON_EXTRACT(d.raw_data,'$.Status')),
|
|
|
JSON_UNQUOTE(JSON_EXTRACT(m.raw_data,'$.Buyer')),
|
|
|
- JSON_UNQUOTE(JSON_EXTRACT(d.raw_data,'$.WorkOrd')),
|
|
|
+ -- 归一字面量 'null':改造前 451 行中 208 行落的是字符串 "null",
|
|
|
+ -- 任何按 work_order 的 JOIN 都会被它污染。本列只作参考,不作归因。
|
|
|
+ NULLIF(NULLIF(JSON_UNQUOTE(JSON_EXTRACT(d.raw_data,'$.WorkOrd')), 'null'), ''),
|
|
|
d.source_biz_key, @BatchId, @Now
|
|
|
FROM mdp_stg_purchase_order d
|
|
|
-- ── enrichment JOIN 的两个约束,缺一不可 ────────────────────────────────────
|
|
|
@@ -835,7 +861,8 @@ public class S3MdpSyncTransformService : ITransient
|
|
|
WHERE d.tenant_id=@TenantId AND COALESCE(NULLIF(d.factory_id,0),1)=@FactoryId
|
|
|
AND d.source_table='PurOrdDetail' AND d.sync_batch_id=@BatchId
|
|
|
AND IFNULL(JSON_UNQUOTE(JSON_EXTRACT(d.raw_data,'$.PurOrd')), '') <> ''
|
|
|
- ON DUPLICATE KEY UPDATE po_type=VALUES(po_type), supplier_code=VALUES(supplier_code), item_code=VALUES(item_code),
|
|
|
+ ON DUPLICATE KEY UPDATE purchase_request_no=VALUES(purchase_request_no),
|
|
|
+ po_type=VALUES(po_type), supplier_code=VALUES(supplier_code), item_code=VALUES(item_code),
|
|
|
item_name=VALUES(item_name), order_qty=VALUES(order_qty), received_qty=VALUES(received_qty), returned_qty=VALUES(returned_qty),
|
|
|
due_date=VALUES(due_date), need_date=VALUES(need_date), order_date=VALUES(order_date), status=VALUES(status),
|
|
|
buyer=VALUES(buyer), work_order=VALUES(work_order), sync_batch_id=VALUES(sync_batch_id), sync_time=VALUES(sync_time),
|