-- ===================================================================================== -- WIP-C3A · S0 · C3-A 物料桥:ProdLineDetail / RoutingOpDetail -- (占位名,提交那刻 rename 为正式 1.0..sql) -- -- ProdLineDetail → mdp_stg_s0_item_op_line → bridge_item_op_line -- RoutingOpDetail → mdp_stg_s0_item_routing_op → bridge_item_routing_op -- -- 两桥的父都是 dim_item,走**自然键 item_code**。 -- 🔴 父连接是 `p. <=> d.` 同名列 join(S0DimSqlBuilder.OrphanFromWhere), -- 故子表该列必须逐字命名 item_code;命名成 item_num 会 Validate() 通过而运行时报未知列。 -- 🔴 绝不用 dim 代理 id 建关系:每轮 FULL REPLACE 后 dim_item.id 都会变。 -- ===================================================================================== -- ── 1. ProdLineDetail → 物料-工序-产线产能 ──────────────────────────────────────────── -- 身份 tenant+Part+Op+Line(重复 0 组);去掉 Line 会塌陷成 197 组/394 行重复。 -- Domain 每租户单值,零判别力 → LEGACY_SCOPE 不入身份。 CREATE TABLE IF NOT EXISTS `mdp_stg_s0_item_op_line` ( `id` bigint NOT NULL AUTO_INCREMENT, `tenant_id` bigint NOT NULL DEFAULT 0, `factory_id` bigint DEFAULT NULL, `source_system` varchar(50) NOT NULL DEFAULT 'AIDOPDEV_MYSQL', `source_table` varchar(100) NOT NULL, `source_row_id` varchar(100) NOT NULL, `source_biz_key` varchar(300) DEFAULT NULL, `sync_batch_id` varchar(100) NOT NULL, `sync_time` datetime NOT NULL, `process_status` varchar(20) NOT NULL DEFAULT 'PENDING', `raw_data` json NOT NULL, `process_message` varchar(500) DEFAULT NULL, `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `create_time` datetime DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`), UNIQUE KEY `uk_stg_s0_item_op_line` (`tenant_id`,`source_system`,`source_table`,`source_row_id`), KEY `idx_stg_s0_item_op_line_biz` (`source_biz_key`), KEY `idx_stg_s0_item_op_line_batch` (`tenant_id`,`sync_batch_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='S0 贴源:物料工序产线产能(源 ProdLineDetail)'; CREATE TABLE IF NOT EXISTS `bridge_item_op_line` ( `id` bigint NOT NULL AUTO_INCREMENT, `tenant_id` bigint NOT NULL, `item_code` varchar(100) NOT NULL COMMENT '业务键 + 父键 ← $.Part;父 = dim_item.item_code(实测孤儿 0/10646)', `operation_no` int NOT NULL COMMENT '业务键 ← $.Op(本仓首个 Int 业务键,三侧渲染已验证一致)', `line_code` varchar(100) NOT NULL COMMENT '业务键 ← $.Line;11 行带尾随空格,NO PAD 下是真实差异,禁止 TRIM;软引用 dim_line(8848/10646 对不上)故不设父', `domain_code` varchar(50) NOT NULL COMMENT 'LEGACY_SCOPE ← $.Domain(每租户单值,零判别力)', `work_center_code` varchar(100) DEFAULT NULL COMMENT '← $.Site(5823/10646 为 NULL);软引用 dim_work_center,不设父', `rate` decimal(18,6) DEFAULT NULL COMMENT '← $.Rate;scale 必须与源逐位一致', `setup_time` decimal(18,6) DEFAULT NULL COMMENT '← $.SetupTime', `overlap_time` decimal(18,6) DEFAULT NULL COMMENT '← $.OverlapTime', `sequence_no` decimal(18,6) DEFAULT NULL COMMENT '← $.Sequence', `standard_staff_count` decimal(18,6) DEFAULT NULL COMMENT '← $.StandardStaffCount', `skill_code` varchar(100) DEFAULT NULL COMMENT '← $.SkillNo', `internal_equipment_code` varchar(100) DEFAULT NULL COMMENT '🔴 ← $.InternalEquipmentCode(2430/10646 有值)。**不是**同表 0/10646 的死影子列 internal_equipment_type_code', `mold_type_code` varchar(100) DEFAULT NULL COMMENT '← $.MoldTypeCode', `start_marker` bigint DEFAULT NULL COMMENT '← $.Start(列名避开 MySQL 保留字 START)', `is_active` tinyint(1) NOT NULL COMMENT '← $.IsActive(源 NOT NULL)', `is_confirmed` tinyint(1) NOT NULL COMMENT '← $.IsConfirm(源 NOT NULL)', `run_crew` varchar(8) DEFAULT NULL COMMENT '🔴 ← $.RunCrew,源 varchar(8)。dim_line_post 的同名列源自 LineSkillMaster 是 decimal(10,3),同名不同型', `op_type` varchar(50) DEFAULT NULL COMMENT '← $.OpType', `bom_code` varchar(24) DEFAULT NULL COMMENT '← $.Bom', `source_system` varchar(50) NOT NULL, `source_biz_key` varchar(300) NOT NULL, `source_updated_at` datetime DEFAULT NULL COMMENT '← $.UpdateTime(5283/10646)', `sync_batch_id` varchar(64) NOT NULL, `sync_time` datetime NOT NULL, `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`), -- 索引字节 = 8 + 100*4 + 4 + 100*4 = 812 < 3072(DYNAMIC/utf8mb4)。加宽任一 varchar 前须重算。 UNIQUE KEY `uk_bridge_item_op_line` (`tenant_id`,`item_code`,`operation_no`,`line_code`), KEY `idx_biol_parent` (`tenant_id`,`item_code`), KEY `idx_biol_batch` (`sync_batch_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='S0 关系桥:物料-工序-产线产能。源 ProdLineDetail,FULL REPLACE。父 = dim_item(自然键 item_code)。'; -- ── 2. RoutingOpDetail → 物料工艺路线工序(S0 最大的桥,38806 行)──────────────────── -- 身份 tenant+MaterialCode+OperationCode(重复 0 组);去掉 OperationCode 塌陷成 2879 组。 -- 🔴 时间列是 UpdatedAt/CreatedAt,不是全仓通用的 UpdateTime。 -- 🔴 六组新旧列近重复:真列 RouteCode/OperationCode/OperationDescription, -- 旧列 RoutingCode/Op/Descr 不得取(38805/38806 同值,取错得到「看起来合法的错值」)。 CREATE TABLE IF NOT EXISTS `mdp_stg_s0_item_routing_op` ( `id` bigint NOT NULL AUTO_INCREMENT, `tenant_id` bigint NOT NULL DEFAULT 0, `factory_id` bigint DEFAULT NULL, `source_system` varchar(50) NOT NULL DEFAULT 'AIDOPDEV_MYSQL', `source_table` varchar(100) NOT NULL, `source_row_id` varchar(100) NOT NULL, `source_biz_key` varchar(300) DEFAULT NULL, `sync_batch_id` varchar(100) NOT NULL, `sync_time` datetime NOT NULL, `process_status` varchar(20) NOT NULL DEFAULT 'PENDING', `raw_data` json NOT NULL, `process_message` varchar(500) DEFAULT NULL, `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `create_time` datetime DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`), UNIQUE KEY `uk_stg_s0_item_routing_op` (`tenant_id`,`source_system`,`source_table`,`source_row_id`), KEY `idx_stg_s0_item_routing_op_biz` (`source_biz_key`), KEY `idx_stg_s0_item_routing_op_batch` (`tenant_id`,`sync_batch_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='S0 贴源:物料工艺路线工序(源 RoutingOpDetail)'; CREATE TABLE IF NOT EXISTS `bridge_item_routing_op` ( `id` bigint NOT NULL AUTO_INCREMENT, `tenant_id` bigint NOT NULL, `item_code` varchar(100) NOT NULL COMMENT '业务键 + 父键 ← $.MaterialCode;父 = dim_item(实测孤儿 44/38806,ALLOW+WARNING 不阻断)', `operation_code` varchar(100) NOT NULL COMMENT '业务键 ← $.OperationCode;🔴 不是同表旧列 Op(int)', `route_code` varchar(100) DEFAULT NULL COMMENT '← $.RouteCode;🔴 不是旧列 RoutingCode。与 MaterialCode 38805/38806 逐值相同', `route_name` varchar(200) DEFAULT NULL COMMENT '← $.RouteName;实测存的是码不是名(distinct 与 RouteCode 同为 2797)', `operation_description` varchar(200) DEFAULT NULL COMMENT '← $.OperationDescription;🔴 不是旧列 Descr。1 行为空串(RecID=106435)', `work_center_code` varchar(100) DEFAULT NULL COMMENT '← $.WorkCenterCode(12067/38806 非空);软引用,5630 孤儿故不设父', `std_op` varchar(100) DEFAULT NULL COMMENT '🔴 ← $.StdOp,**不设父**:对 StdOpMaster 孤儿 37112/38746,CRUD 不写、UI 无下拉、码空间不同构(0010 vs 1-1/包装)。与 item 孤儿(44)是两回事', `domain_code` varchar(100) DEFAULT NULL COMMENT 'LEGACY_SCOPE ← $.Domain;源 1 行 NULL(RecID=106435)故不设 Required', `company_id` bigint NOT NULL COMMENT 'LEGACY_SCOPE ← $.CompanyRefId', `factory_id` bigint NOT NULL COMMENT 'LEGACY_SCOPE ← $.FactoryRefId', `ufld1` varchar(200) DEFAULT NULL COMMENT '← $.Ufld1(Ufld2..Ufld9 全库 distinct=1,不物化)', `udeci1` decimal(18,5) DEFAULT NULL COMMENT '← $.UDeci1', `udeci2` decimal(18,5) DEFAULT NULL COMMENT '← $.UDeci2', `udeci3` decimal(18,5) DEFAULT NULL COMMENT '← $.UDeci3', `udeci4` decimal(18,5) DEFAULT NULL COMMENT '← $.UDeci4', `udeci5` decimal(18,5) DEFAULT NULL COMMENT '← $.UDeci5', `run_time` decimal(18,6) DEFAULT NULL COMMENT '🔴 ← $.RunTime,源是 (18,6),与 UDeci* 的 (18,5) 不同,不得统一', `outsourced_lead_time` int DEFAULT NULL COMMENT '← $.OutsourcedLeadTime', `sort_no` int DEFAULT NULL COMMENT '← $.SortNo(在源 UK 内但近乎常量,保留可见性)', `comment_index` int DEFAULT NULL COMMENT '← $.CommentIndex', `parent_op` int DEFAULT NULL COMMENT '← $.ParentOp', `is_confirmed` tinyint(1) NOT NULL COMMENT '← $.IsConfirm;本表唯一可安全物化的布尔(IsEnabled distinct=1;IsActive/MilestoneOp 是可空 tinyint(1),见表注释)', `source_system` varchar(50) NOT NULL, `source_biz_key` varchar(300) NOT NULL, `source_updated_at` datetime DEFAULT NULL COMMENT '🔴 ← $.UpdatedAt(本表审计列叫 CreatedAt/UpdatedAt,不是 CreateTime/UpdateTime);仅 5/38806', `sync_batch_id` varchar(64) NOT NULL, `sync_time` datetime NOT NULL, `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`), -- 索引字节 = 8 + 100*4 + 100*4 = 808 < 3072 UNIQUE KEY `uk_bridge_item_routing_op` (`tenant_id`,`item_code`,`operation_code`), KEY `idx_biro_parent` (`tenant_id`,`item_code`), KEY `idx_biro_batch` (`sync_batch_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='S0 关系桥:物料工艺路线工序。源 RoutingOpDetail,FULL REPLACE。父 = dim_item(自然键 item_code,44 孤儿 WARN)。「报工工序」与「启用状态」本轮不可物化:MilestoneOperation 0 填充、MilestoneOp/IsActive 是可空 tinyint(1)。'; -- ── 3. mdp_entity 登记 ──────────────────────────────────────────────────────────────── -- batch_size 按各自最大租户行数留 3× 余量:ProdLineDetail 5817 → 20000;RoutingOpDetail 32309 → 100000。 -- AssertNoSourceDuplicateAsync 是 sourceCount >= batchSize 严格判定,必须单页装下。 -- 🔴 batch_size 是 **entity 级**(S0DimMaterializer 读 entity.BatchSize),不影响其它任何维度。 SET @src_id = (SELECT `id` FROM `mdp_source` WHERE `source_code` = 'AIDOPDEV_MYSQL' LIMIT 1); INSERT INTO `mdp_entity` (`tenant_id`,`source_id`,`entity_code`,`entity_name`,`entity_type`, `source_table_name`,`target_table_name`,`sync_mode`,`incr_column`,`batch_size`, `biz_key_expr`,`status`,`create_time`,`update_time`) SELECT 0, @src_id, 'S0_ITEM_OP_LINE', 'S0 物料工序产线产能入站', 'TABLE', 'ProdLineDetail', 'mdp_stg_s0_item_op_line', 'FULL', NULL, 20000, 'Part,Op,Line', 1, NOW(), NOW() WHERE @src_id IS NOT NULL AND NOT EXISTS (SELECT 1 FROM `mdp_entity` WHERE `entity_code` = 'S0_ITEM_OP_LINE'); INSERT INTO `mdp_entity` (`tenant_id`,`source_id`,`entity_code`,`entity_name`,`entity_type`, `source_table_name`,`target_table_name`,`sync_mode`,`incr_column`,`batch_size`, `biz_key_expr`,`status`,`create_time`,`update_time`) SELECT 0, @src_id, 'S0_ITEM_ROUTING_OP', 'S0 物料工艺路线工序入站', 'TABLE', 'RoutingOpDetail', 'mdp_stg_s0_item_routing_op', 'FULL', NULL, 100000, 'MaterialCode,OperationCode', 1, NOW(), NOW() WHERE @src_id IS NOT NULL AND NOT EXISTS (SELECT 1 FROM `mdp_entity` WHERE `entity_code` = 'S0_ITEM_ROUTING_OP'); -- ── 回滚(注释,非可执行)── -- DROP TABLE IF EXISTS `bridge_item_op_line`, `bridge_item_routing_op`; -- DROP TABLE IF EXISTS `mdp_stg_s0_item_op_line`, `mdp_stg_s0_item_routing_op`; -- DELETE FROM `mdp_entity` WHERE `tenant_id`=0 AND `entity_code` IN ('S0_ITEM_OP_LINE','S0_ITEM_ROUTING_OP');