-- WIP-C3A.verify.sql
-- 契约(CURRENT.md > F-11):禁 SET @var · 每条返回 1/0 · 一条一断言 · 末条为真 SELECT。
SELECT (SELECT COUNT(*) FROM information_schema.TABLES WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME IN ('mdp_stg_s0_item_op_line','bridge_item_op_line',
'mdp_stg_s0_item_routing_op','bridge_item_routing_op')) = 4;
SELECT IFNULL((SELECT GROUP_CONCAT(COLUMN_NAME ORDER BY SEQ_IN_INDEX) FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'bridge_item_op_line'
AND INDEX_NAME = 'uk_bridge_item_op_line' AND NON_UNIQUE = 0), '')
= 'tenant_id,item_code,operation_no,line_code';
SELECT IFNULL((SELECT GROUP_CONCAT(COLUMN_NAME ORDER BY SEQ_IN_INDEX) FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'bridge_item_routing_op'
AND INDEX_NAME = 'uk_bridge_item_routing_op' AND NON_UNIQUE = 0), '')
= 'tenant_id,item_code,operation_code';
-- 父键列名必须逐字是 item_code:OrphanFromWhere 用 p.
<=> d. 同名列 join
SELECT (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME IN ('bridge_item_op_line','bridge_item_routing_op')
AND COLUMN_NAME = 'item_code') = 2;
SELECT (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME IN ('bridge_item_op_line','bridge_item_routing_op')
AND COLUMN_NAME IN ('item_num','dim_item_id','parent_id')) = 0;
-- LEGACY_SCOPE 绝不进唯一键
SELECT (SELECT COUNT(*) FROM information_schema.STATISTICS WHERE TABLE_SCHEMA = DATABASE()
AND INDEX_NAME IN ('uk_bridge_item_op_line','uk_bridge_item_routing_op')
AND COLUMN_NAME IN ('domain_code','company_id','factory_id','work_center_code','route_code')) = 0;
-- 影子列绝不能出现在目标表
SELECT (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'bridge_item_op_line'
AND COLUMN_NAME IN ('internal_equipment_type_code')) = 0;
SELECT (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'bridge_item_op_line'
AND COLUMN_NAME = 'internal_equipment_code') = 1;
-- 不可物化的列绝不能出现在目标表
SELECT (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'bridge_item_routing_op'
AND COLUMN_NAME IN ('milestone_operation','milestone_op','is_active','is_enabled',
'routing_code','descr','op')) = 0;
-- Dec 精度必须与源逐位一致:op_line 五列 (18,6)
SELECT (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'bridge_item_op_line'
AND COLUMN_NAME IN ('rate','setup_time','overlap_time','sequence_no','standard_staff_count')
AND NUMERIC_PRECISION = 18 AND NUMERIC_SCALE = 6) = 5;
-- routing_op:UDeci* 是 (18,5),run_time 是 (18,6),不得统一
SELECT (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'bridge_item_routing_op'
AND COLUMN_NAME IN ('udeci1','udeci2','udeci3','udeci4','udeci5')
AND NUMERIC_PRECISION = 18 AND NUMERIC_SCALE = 5) = 5;
SELECT (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'bridge_item_routing_op'
AND COLUMN_NAME = 'run_time' AND NUMERIC_PRECISION = 18 AND NUMERIC_SCALE = 6) = 1;
-- run_crew 在本桥是字符串(源 varchar(8)),不得建成 decimal
SELECT (SELECT DATA_TYPE FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'bridge_item_op_line' AND COLUMN_NAME = 'run_crew') = 'varchar';
-- domain_code 在 routing_op 必须可空(RecID=106435 那行 Domain 为 NULL)
SELECT (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'bridge_item_routing_op'
AND COLUMN_NAME = 'domain_code' AND IS_NULLABLE = 'YES') = 1;
-- mdp_entity 契约:biz_key_expr 须与 SourceBizKeyColumns 逐字一致(AssertEntityContractAsync 硬比对)
SELECT (SELECT COUNT(*) FROM `mdp_entity`
WHERE `entity_code` = 'S0_ITEM_OP_LINE'
AND `biz_key_expr` COLLATE utf8mb4_bin = 'Part,Op,Line'
AND `source_table_name` COLLATE utf8mb4_bin = 'ProdLineDetail'
AND `target_table_name` COLLATE utf8mb4_bin = 'mdp_stg_s0_item_op_line'
AND `status` = 1 AND `sync_mode` = 'FULL' AND `incr_column` IS NULL
AND `batch_size` = 20000) = 1;
SELECT (SELECT COUNT(*) FROM `mdp_entity`
WHERE `entity_code` = 'S0_ITEM_ROUTING_OP'
AND `biz_key_expr` COLLATE utf8mb4_bin = 'MaterialCode,OperationCode'
AND `source_table_name` COLLATE utf8mb4_bin = 'RoutingOpDetail'
AND `target_table_name` COLLATE utf8mb4_bin = 'mdp_stg_s0_item_routing_op'
AND `status` = 1 AND `sync_mode` = 'FULL' AND `incr_column` IS NULL
AND `batch_size` = 100000) = 1;
-- batch_size 必须够装下最大租户(AssertNoSourceDuplicateAsync 是 >= 严格判定)
SELECT (SELECT `batch_size` FROM `mdp_entity` WHERE `entity_code` = 'S0_ITEM_OP_LINE')
> (SELECT MAX(c) FROM (SELECT COUNT(*) c FROM `ProdLineDetail` GROUP BY `tenant_id`) x);
SELECT (SELECT `batch_size` FROM `mdp_entity` WHERE `entity_code` = 'S0_ITEM_ROUTING_OP')
> (SELECT MAX(c) FROM (SELECT COUNT(*) c FROM `RoutingOpDetail` GROUP BY `tenant_id`) x);
-- 未因本批放大其它 entity 的 batch_size
SELECT (SELECT COUNT(*) FROM `mdp_entity` WHERE `entity_code` LIKE 'S0\_%'
AND `batch_size` NOT IN (5000, 20000, 50000, 100000)) = 0;