|
@@ -264,7 +264,7 @@ public class S2MdpSyncTransformService : ITransient
|
|
|
yield return Cmd(
|
|
yield return Cmd(
|
|
|
"""
|
|
"""
|
|
|
INSERT INTO mdp_std_work_order_schedule
|
|
INSERT INTO mdp_std_work_order_schedule
|
|
|
- (tenant_id, factory_id, source_system, work_order, sales_order_no, item_code, item_name, site_code, status,
|
|
|
|
|
|
|
+ (tenant_id, factory_id, source_system, work_order, sales_order_no, sales_order_entry_id, item_code, item_name, site_code, status,
|
|
|
priority, urgent_flag, qty_ordered, qty_completed, order_date, due_date, release_date, prod_line,
|
|
priority, urgent_flag, qty_ordered, qty_completed, order_date, due_date, release_date, prod_line,
|
|
|
specification, lot_serial, drawing_no, project, work_order_type, labor_variance,
|
|
specification, lot_serial, drawing_no, project, work_order_type, labor_variance,
|
|
|
source_biz_key, sync_batch_id, sync_time)
|
|
source_biz_key, sync_batch_id, sync_time)
|
|
@@ -273,6 +273,12 @@ public class S2MdpSyncTransformService : ITransient
|
|
|
'AIDOP',
|
|
'AIDOP',
|
|
|
JSON_UNQUOTE(JSON_EXTRACT(s.raw_data,'$.WorkOrd')),
|
|
JSON_UNQUOTE(JSON_EXTRACT(s.raw_data,'$.WorkOrd')),
|
|
|
JSON_UNQUOTE(JSON_EXTRACT(s.raw_data,'$.SalesJob')),
|
|
JSON_UNQUOTE(JSON_EXTRACT(s.raw_data,'$.SalesJob')),
|
|
|
|
|
+ -- 订单行 ID 桥:WorkOrdMaster.BusinessID,>0 时恒等于 crm_seorderentry.Id
|
|
|
|
|
+ -- (全库实测 28/28 命中同租户订单行、0 孤儿)。源值 0 表示「无关联订单行」,
|
|
|
|
|
+ -- 必须归一为 NULL —— 0 不是合法订单行 Id,落 0 会在桥上造出假关联。
|
|
|
|
|
+ -- sales_order_no(=SalesJob) 只是文本,禁止用它做归因。
|
|
|
|
|
+ NULLIF(CASE WHEN JSON_UNQUOTE(JSON_EXTRACT(s.raw_data,'$.BusinessID')) REGEXP '^[0-9]+$'
|
|
|
|
|
+ THEN CAST(JSON_UNQUOTE(JSON_EXTRACT(s.raw_data,'$.BusinessID')) AS SIGNED) END, 0),
|
|
|
JSON_UNQUOTE(JSON_EXTRACT(s.raw_data,'$.ItemNum')),
|
|
JSON_UNQUOTE(JSON_EXTRACT(s.raw_data,'$.ItemNum')),
|
|
|
JSON_UNQUOTE(JSON_EXTRACT(s.raw_data,'$.ItemName')),
|
|
JSON_UNQUOTE(JSON_EXTRACT(s.raw_data,'$.ItemName')),
|
|
|
JSON_UNQUOTE(JSON_EXTRACT(s.raw_data,'$.Site')),
|
|
JSON_UNQUOTE(JSON_EXTRACT(s.raw_data,'$.Site')),
|
|
@@ -303,7 +309,8 @@ public class S2MdpSyncTransformService : ITransient
|
|
|
AND im.ItemNum = JSON_UNQUOTE(JSON_EXTRACT(s.raw_data,'$.ItemNum'))
|
|
AND im.ItemNum = JSON_UNQUOTE(JSON_EXTRACT(s.raw_data,'$.ItemNum'))
|
|
|
WHERE s.source_table='WorkOrdMaster' AND IFNULL(JSON_UNQUOTE(JSON_EXTRACT(s.raw_data,'$.WorkOrd')), '') <> ''
|
|
WHERE s.source_table='WorkOrdMaster' AND IFNULL(JSON_UNQUOTE(JSON_EXTRACT(s.raw_data,'$.WorkOrd')), '') <> ''
|
|
|
ON DUPLICATE KEY UPDATE
|
|
ON DUPLICATE KEY UPDATE
|
|
|
- sales_order_no=VALUES(sales_order_no), item_code=VALUES(item_code), item_name=VALUES(item_name),
|
|
|
|
|
|
|
+ sales_order_no=VALUES(sales_order_no), sales_order_entry_id=VALUES(sales_order_entry_id),
|
|
|
|
|
+ item_code=VALUES(item_code), item_name=VALUES(item_name),
|
|
|
site_code=VALUES(site_code), status=VALUES(status), priority=VALUES(priority), urgent_flag=VALUES(urgent_flag),
|
|
site_code=VALUES(site_code), status=VALUES(status), priority=VALUES(priority), urgent_flag=VALUES(urgent_flag),
|
|
|
qty_ordered=VALUES(qty_ordered), qty_completed=VALUES(qty_completed), order_date=VALUES(order_date),
|
|
qty_ordered=VALUES(qty_ordered), qty_completed=VALUES(qty_completed), order_date=VALUES(order_date),
|
|
|
due_date=VALUES(due_date), release_date=VALUES(release_date), prod_line=VALUES(prod_line),
|
|
due_date=VALUES(due_date), release_date=VALUES(release_date), prod_line=VALUES(prod_line),
|
|
@@ -316,7 +323,7 @@ public class S2MdpSyncTransformService : ITransient
|
|
|
"""
|
|
"""
|
|
|
INSERT INTO mdp_std_operation_schedule
|
|
INSERT INTO mdp_std_operation_schedule
|
|
|
(tenant_id, factory_id, source_system, work_order, op_no, work_center, line_code, item_code,
|
|
(tenant_id, factory_id, source_system, work_order, op_no, work_center, line_code, item_code,
|
|
|
- plan_date, prod_date, start_time, end_time, ord_qty, comp_qty, run_crew, employee,
|
|
|
|
|
|
|
+ plan_date, prod_date, start_time, end_time, ord_qty, comp_qty, run_crew, employee, status,
|
|
|
source_biz_key, sync_batch_id, sync_time)
|
|
source_biz_key, sync_batch_id, sync_time)
|
|
|
SELECT tenant_id,
|
|
SELECT tenant_id,
|
|
|
CASE WHEN factory_id REGEXP '^[0-9]+$' THEN CAST(factory_id AS UNSIGNED) ELSE 1 END,
|
|
CASE WHEN factory_id REGEXP '^[0-9]+$' THEN CAST(factory_id AS UNSIGNED) ELSE 1 END,
|
|
@@ -334,6 +341,11 @@ public class S2MdpSyncTransformService : ITransient
|
|
|
CASE WHEN JSON_UNQUOTE(JSON_EXTRACT(raw_data,'$.CompQty')) REGEXP '^-?[0-9]+(\\.[0-9]+)?$' THEN CAST(JSON_UNQUOTE(JSON_EXTRACT(raw_data,'$.CompQty')) AS DECIMAL(18,6)) ELSE 0 END,
|
|
CASE WHEN JSON_UNQUOTE(JSON_EXTRACT(raw_data,'$.CompQty')) REGEXP '^-?[0-9]+(\\.[0-9]+)?$' THEN CAST(JSON_UNQUOTE(JSON_EXTRACT(raw_data,'$.CompQty')) AS DECIMAL(18,6)) ELSE 0 END,
|
|
|
CASE WHEN JSON_UNQUOTE(JSON_EXTRACT(raw_data,'$.RunCrew')) REGEXP '^-?[0-9]+(\\.[0-9]+)?$' THEN CAST(JSON_UNQUOTE(JSON_EXTRACT(raw_data,'$.RunCrew')) AS DECIMAL(18,6)) END,
|
|
CASE WHEN JSON_UNQUOTE(JSON_EXTRACT(raw_data,'$.RunCrew')) REGEXP '^-?[0-9]+(\\.[0-9]+)?$' THEN CAST(JSON_UNQUOTE(JSON_EXTRACT(raw_data,'$.RunCrew')) AS DECIMAL(18,6)) END,
|
|
|
JSON_UNQUOTE(JSON_EXTRACT(raw_data,'$.Employee')),
|
|
JSON_UNQUOTE(JSON_EXTRACT(raw_data,'$.Employee')),
|
|
|
|
|
+ -- 日计划下达状态:'Y'=已下达(可执行),空=未下达。原样投影 PeriodSequenceDet.Status。
|
|
|
|
|
+ -- 它只是【状态佐证】—— Stage-2 End 的时间 Authority 一律取
|
|
|
|
|
+ -- S2_DAILY_PLAN_RELEASE SUCCESS 的 end_time,绝不能用 update_time 当下达时间
|
|
|
|
|
+ -- (update_time 会被后续任意一次 UPDATE 覆盖)。
|
|
|
|
|
+ JSON_UNQUOTE(JSON_EXTRACT(raw_data,'$.Status')),
|
|
|
source_biz_key, @BatchId, @Now
|
|
source_biz_key, @BatchId, @Now
|
|
|
FROM mdp_stg_schedule
|
|
FROM mdp_stg_schedule
|
|
|
WHERE source_table='PeriodSequenceDet' AND IFNULL(JSON_UNQUOTE(JSON_EXTRACT(raw_data,'$.WorkOrds')), '') <> ''
|
|
WHERE source_table='PeriodSequenceDet' AND IFNULL(JSON_UNQUOTE(JSON_EXTRACT(raw_data,'$.WorkOrds')), '') <> ''
|
|
@@ -341,9 +353,14 @@ public class S2MdpSyncTransformService : ITransient
|
|
|
work_center=VALUES(work_center), line_code=VALUES(line_code), item_code=VALUES(item_code),
|
|
work_center=VALUES(work_center), line_code=VALUES(line_code), item_code=VALUES(item_code),
|
|
|
plan_date=VALUES(plan_date), prod_date=VALUES(prod_date), start_time=VALUES(start_time), end_time=VALUES(end_time),
|
|
plan_date=VALUES(plan_date), prod_date=VALUES(prod_date), start_time=VALUES(start_time), end_time=VALUES(end_time),
|
|
|
ord_qty=VALUES(ord_qty), comp_qty=VALUES(comp_qty), run_crew=VALUES(run_crew), employee=VALUES(employee),
|
|
ord_qty=VALUES(ord_qty), comp_qty=VALUES(comp_qty), run_crew=VALUES(run_crew), employee=VALUES(employee),
|
|
|
|
|
+ status=VALUES(status),
|
|
|
sync_batch_id=VALUES(sync_batch_id), sync_time=VALUES(sync_time), update_time=CURRENT_TIMESTAMP
|
|
sync_batch_id=VALUES(sync_batch_id), sync_time=VALUES(sync_time), update_time=CURRENT_TIMESTAMP
|
|
|
""", batchId, now);
|
|
""", batchId, now);
|
|
|
|
|
|
|
|
|
|
+ // ⚠️ 同表的另一个来源:ScheduleResultOpMaster —— 它没有「日计划下达」这个概念。
|
|
|
|
|
+ // 因此既不投影 status,ODKU 里也【刻意不列】status,
|
|
|
|
|
+ // 否则会把 PeriodSequenceDet 分支刚投影进来的下达状态覆盖成 NULL。
|
|
|
|
|
+ // (两来源 source_biz_key 格式不同,uk=(tenant_id,source_biz_key) 实测不碰撞;此为纵深防御。)
|
|
|
yield return Cmd(
|
|
yield return Cmd(
|
|
|
"""
|
|
"""
|
|
|
INSERT INTO mdp_std_operation_schedule
|
|
INSERT INTO mdp_std_operation_schedule
|