1.0.512.sql 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. -- =====================================================================================
  2. -- WIP-C3A · S0 · C3-A 物料桥:ProdLineDetail / RoutingOpDetail
  3. -- (占位名,提交那刻 rename 为正式 1.0.<next>.sql)
  4. --
  5. -- ProdLineDetail → mdp_stg_s0_item_op_line → bridge_item_op_line
  6. -- RoutingOpDetail → mdp_stg_s0_item_routing_op → bridge_item_routing_op
  7. --
  8. -- 两桥的父都是 dim_item,走**自然键 item_code**。
  9. -- 🔴 父连接是 `p.<col> <=> d.<col>` 同名列 join(S0DimSqlBuilder.OrphanFromWhere),
  10. -- 故子表该列必须逐字命名 item_code;命名成 item_num 会 Validate() 通过而运行时报未知列。
  11. -- 🔴 绝不用 dim 代理 id 建关系:每轮 FULL REPLACE 后 dim_item.id 都会变。
  12. -- =====================================================================================
  13. -- ── 1. ProdLineDetail → 物料-工序-产线产能 ────────────────────────────────────────────
  14. -- 身份 tenant+Part+Op+Line(重复 0 组);去掉 Line 会塌陷成 197 组/394 行重复。
  15. -- Domain 每租户单值,零判别力 → LEGACY_SCOPE 不入身份。
  16. CREATE TABLE IF NOT EXISTS `mdp_stg_s0_item_op_line` (
  17. `id` bigint NOT NULL AUTO_INCREMENT,
  18. `tenant_id` bigint NOT NULL DEFAULT 0,
  19. `factory_id` bigint DEFAULT NULL,
  20. `source_system` varchar(50) NOT NULL DEFAULT 'AIDOPDEV_MYSQL',
  21. `source_table` varchar(100) NOT NULL,
  22. `source_row_id` varchar(100) NOT NULL,
  23. `source_biz_key` varchar(300) DEFAULT NULL,
  24. `sync_batch_id` varchar(100) NOT NULL,
  25. `sync_time` datetime NOT NULL,
  26. `process_status` varchar(20) NOT NULL DEFAULT 'PENDING',
  27. `raw_data` json NOT NULL,
  28. `process_message` varchar(500) DEFAULT NULL,
  29. `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  30. `create_time` datetime DEFAULT CURRENT_TIMESTAMP,
  31. PRIMARY KEY (`id`),
  32. UNIQUE KEY `uk_stg_s0_item_op_line` (`tenant_id`,`source_system`,`source_table`,`source_row_id`),
  33. KEY `idx_stg_s0_item_op_line_biz` (`source_biz_key`),
  34. KEY `idx_stg_s0_item_op_line_batch` (`tenant_id`,`sync_batch_id`)
  35. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='S0 贴源:物料工序产线产能(源 ProdLineDetail)';
  36. CREATE TABLE IF NOT EXISTS `bridge_item_op_line` (
  37. `id` bigint NOT NULL AUTO_INCREMENT,
  38. `tenant_id` bigint NOT NULL,
  39. `item_code` varchar(100) NOT NULL COMMENT '业务键 + 父键 ← $.Part;父 = dim_item.item_code(实测孤儿 0/10646)',
  40. `operation_no` int NOT NULL COMMENT '业务键 ← $.Op(本仓首个 Int 业务键,三侧渲染已验证一致)',
  41. `line_code` varchar(100) NOT NULL COMMENT '业务键 ← $.Line;11 行带尾随空格,NO PAD 下是真实差异,禁止 TRIM;软引用 dim_line(8848/10646 对不上)故不设父',
  42. `domain_code` varchar(50) NOT NULL COMMENT 'LEGACY_SCOPE ← $.Domain(每租户单值,零判别力)',
  43. `work_center_code` varchar(100) DEFAULT NULL COMMENT '← $.Site(5823/10646 为 NULL);软引用 dim_work_center,不设父',
  44. `rate` decimal(18,6) DEFAULT NULL COMMENT '← $.Rate;scale 必须与源逐位一致',
  45. `setup_time` decimal(18,6) DEFAULT NULL COMMENT '← $.SetupTime',
  46. `overlap_time` decimal(18,6) DEFAULT NULL COMMENT '← $.OverlapTime',
  47. `sequence_no` decimal(18,6) DEFAULT NULL COMMENT '← $.Sequence',
  48. `standard_staff_count` decimal(18,6) DEFAULT NULL COMMENT '← $.StandardStaffCount',
  49. `skill_code` varchar(100) DEFAULT NULL COMMENT '← $.SkillNo',
  50. `internal_equipment_code` varchar(100) DEFAULT NULL COMMENT '🔴 ← $.InternalEquipmentCode(2430/10646 有值)。**不是**同表 0/10646 的死影子列 internal_equipment_type_code',
  51. `mold_type_code` varchar(100) DEFAULT NULL COMMENT '← $.MoldTypeCode',
  52. `start_marker` bigint DEFAULT NULL COMMENT '← $.Start(列名避开 MySQL 保留字 START)',
  53. `is_active` tinyint(1) NOT NULL COMMENT '← $.IsActive(源 NOT NULL)',
  54. `is_confirmed` tinyint(1) NOT NULL COMMENT '← $.IsConfirm(源 NOT NULL)',
  55. `run_crew` varchar(8) DEFAULT NULL COMMENT '🔴 ← $.RunCrew,源 varchar(8)。dim_line_post 的同名列源自 LineSkillMaster 是 decimal(10,3),同名不同型',
  56. `op_type` varchar(50) DEFAULT NULL COMMENT '← $.OpType',
  57. `bom_code` varchar(24) DEFAULT NULL COMMENT '← $.Bom',
  58. `source_system` varchar(50) NOT NULL,
  59. `source_biz_key` varchar(300) NOT NULL,
  60. `source_updated_at` datetime DEFAULT NULL COMMENT '← $.UpdateTime(5283/10646)',
  61. `sync_batch_id` varchar(64) NOT NULL,
  62. `sync_time` datetime NOT NULL,
  63. `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  64. `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  65. PRIMARY KEY (`id`),
  66. -- 索引字节 = 8 + 100*4 + 4 + 100*4 = 812 < 3072(DYNAMIC/utf8mb4)。加宽任一 varchar 前须重算。
  67. UNIQUE KEY `uk_bridge_item_op_line` (`tenant_id`,`item_code`,`operation_no`,`line_code`),
  68. KEY `idx_biol_parent` (`tenant_id`,`item_code`),
  69. KEY `idx_biol_batch` (`sync_batch_id`)
  70. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
  71. COMMENT='S0 关系桥:物料-工序-产线产能。源 ProdLineDetail,FULL REPLACE。父 = dim_item(自然键 item_code)。';
  72. -- ── 2. RoutingOpDetail → 物料工艺路线工序(S0 最大的桥,38806 行)────────────────────
  73. -- 身份 tenant+MaterialCode+OperationCode(重复 0 组);去掉 OperationCode 塌陷成 2879 组。
  74. -- 🔴 时间列是 UpdatedAt/CreatedAt,不是全仓通用的 UpdateTime。
  75. -- 🔴 六组新旧列近重复:真列 RouteCode/OperationCode/OperationDescription,
  76. -- 旧列 RoutingCode/Op/Descr 不得取(38805/38806 同值,取错得到「看起来合法的错值」)。
  77. CREATE TABLE IF NOT EXISTS `mdp_stg_s0_item_routing_op` (
  78. `id` bigint NOT NULL AUTO_INCREMENT,
  79. `tenant_id` bigint NOT NULL DEFAULT 0,
  80. `factory_id` bigint DEFAULT NULL,
  81. `source_system` varchar(50) NOT NULL DEFAULT 'AIDOPDEV_MYSQL',
  82. `source_table` varchar(100) NOT NULL,
  83. `source_row_id` varchar(100) NOT NULL,
  84. `source_biz_key` varchar(300) DEFAULT NULL,
  85. `sync_batch_id` varchar(100) NOT NULL,
  86. `sync_time` datetime NOT NULL,
  87. `process_status` varchar(20) NOT NULL DEFAULT 'PENDING',
  88. `raw_data` json NOT NULL,
  89. `process_message` varchar(500) DEFAULT NULL,
  90. `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  91. `create_time` datetime DEFAULT CURRENT_TIMESTAMP,
  92. PRIMARY KEY (`id`),
  93. UNIQUE KEY `uk_stg_s0_item_routing_op` (`tenant_id`,`source_system`,`source_table`,`source_row_id`),
  94. KEY `idx_stg_s0_item_routing_op_biz` (`source_biz_key`),
  95. KEY `idx_stg_s0_item_routing_op_batch` (`tenant_id`,`sync_batch_id`)
  96. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='S0 贴源:物料工艺路线工序(源 RoutingOpDetail)';
  97. CREATE TABLE IF NOT EXISTS `bridge_item_routing_op` (
  98. `id` bigint NOT NULL AUTO_INCREMENT,
  99. `tenant_id` bigint NOT NULL,
  100. `item_code` varchar(100) NOT NULL COMMENT '业务键 + 父键 ← $.MaterialCode;父 = dim_item(实测孤儿 44/38806,ALLOW+WARNING 不阻断)',
  101. `operation_code` varchar(100) NOT NULL COMMENT '业务键 ← $.OperationCode;🔴 不是同表旧列 Op(int)',
  102. `route_code` varchar(100) DEFAULT NULL COMMENT '← $.RouteCode;🔴 不是旧列 RoutingCode。与 MaterialCode 38805/38806 逐值相同',
  103. `route_name` varchar(200) DEFAULT NULL COMMENT '← $.RouteName;实测存的是码不是名(distinct 与 RouteCode 同为 2797)',
  104. `operation_description` varchar(200) DEFAULT NULL COMMENT '← $.OperationDescription;🔴 不是旧列 Descr。1 行为空串(RecID=106435)',
  105. `work_center_code` varchar(100) DEFAULT NULL COMMENT '← $.WorkCenterCode(12067/38806 非空);软引用,5630 孤儿故不设父',
  106. `std_op` varchar(100) DEFAULT NULL COMMENT '🔴 ← $.StdOp,**不设父**:对 StdOpMaster 孤儿 37112/38746,CRUD 不写、UI 无下拉、码空间不同构(0010 vs 1-1/包装)。与 item 孤儿(44)是两回事',
  107. `domain_code` varchar(100) DEFAULT NULL COMMENT 'LEGACY_SCOPE ← $.Domain;源 1 行 NULL(RecID=106435)故不设 Required',
  108. `company_id` bigint NOT NULL COMMENT 'LEGACY_SCOPE ← $.CompanyRefId',
  109. `factory_id` bigint NOT NULL COMMENT 'LEGACY_SCOPE ← $.FactoryRefId',
  110. `ufld1` varchar(200) DEFAULT NULL COMMENT '← $.Ufld1(Ufld2..Ufld9 全库 distinct=1,不物化)',
  111. `udeci1` decimal(18,5) DEFAULT NULL COMMENT '← $.UDeci1',
  112. `udeci2` decimal(18,5) DEFAULT NULL COMMENT '← $.UDeci2',
  113. `udeci3` decimal(18,5) DEFAULT NULL COMMENT '← $.UDeci3',
  114. `udeci4` decimal(18,5) DEFAULT NULL COMMENT '← $.UDeci4',
  115. `udeci5` decimal(18,5) DEFAULT NULL COMMENT '← $.UDeci5',
  116. `run_time` decimal(18,6) DEFAULT NULL COMMENT '🔴 ← $.RunTime,源是 (18,6),与 UDeci* 的 (18,5) 不同,不得统一',
  117. `outsourced_lead_time` int DEFAULT NULL COMMENT '← $.OutsourcedLeadTime',
  118. `sort_no` int DEFAULT NULL COMMENT '← $.SortNo(在源 UK 内但近乎常量,保留可见性)',
  119. `comment_index` int DEFAULT NULL COMMENT '← $.CommentIndex',
  120. `parent_op` int DEFAULT NULL COMMENT '← $.ParentOp',
  121. `is_confirmed` tinyint(1) NOT NULL COMMENT '← $.IsConfirm;本表唯一可安全物化的布尔(IsEnabled distinct=1;IsActive/MilestoneOp 是可空 tinyint(1),见表注释)',
  122. `source_system` varchar(50) NOT NULL,
  123. `source_biz_key` varchar(300) NOT NULL,
  124. `source_updated_at` datetime DEFAULT NULL COMMENT '🔴 ← $.UpdatedAt(本表审计列叫 CreatedAt/UpdatedAt,不是 CreateTime/UpdateTime);仅 5/38806',
  125. `sync_batch_id` varchar(64) NOT NULL,
  126. `sync_time` datetime NOT NULL,
  127. `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  128. `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  129. PRIMARY KEY (`id`),
  130. -- 索引字节 = 8 + 100*4 + 100*4 = 808 < 3072
  131. UNIQUE KEY `uk_bridge_item_routing_op` (`tenant_id`,`item_code`,`operation_code`),
  132. KEY `idx_biro_parent` (`tenant_id`,`item_code`),
  133. KEY `idx_biro_batch` (`sync_batch_id`)
  134. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
  135. COMMENT='S0 关系桥:物料工艺路线工序。源 RoutingOpDetail,FULL REPLACE。父 = dim_item(自然键 item_code,44 孤儿 WARN)。「报工工序」与「启用状态」本轮不可物化:MilestoneOperation 0 填充、MilestoneOp/IsActive 是可空 tinyint(1)。';
  136. -- ── 3. mdp_entity 登记 ────────────────────────────────────────────────────────────────
  137. -- batch_size 按各自最大租户行数留 3× 余量:ProdLineDetail 5817 → 20000;RoutingOpDetail 32309 → 100000。
  138. -- AssertNoSourceDuplicateAsync 是 sourceCount >= batchSize 严格判定,必须单页装下。
  139. -- 🔴 batch_size 是 **entity 级**(S0DimMaterializer 读 entity.BatchSize),不影响其它任何维度。
  140. SET @src_id = (SELECT `id` FROM `mdp_source` WHERE `source_code` = 'AIDOPDEV_MYSQL' LIMIT 1);
  141. INSERT INTO `mdp_entity`
  142. (`tenant_id`,`source_id`,`entity_code`,`entity_name`,`entity_type`,
  143. `source_table_name`,`target_table_name`,`sync_mode`,`incr_column`,`batch_size`,
  144. `biz_key_expr`,`status`,`create_time`,`update_time`)
  145. SELECT 0, @src_id, 'S0_ITEM_OP_LINE', 'S0 物料工序产线产能入站', 'TABLE',
  146. 'ProdLineDetail', 'mdp_stg_s0_item_op_line', 'FULL', NULL, 20000,
  147. 'Part,Op,Line', 1, NOW(), NOW()
  148. WHERE @src_id IS NOT NULL
  149. AND NOT EXISTS (SELECT 1 FROM `mdp_entity` WHERE `entity_code` = 'S0_ITEM_OP_LINE');
  150. INSERT INTO `mdp_entity`
  151. (`tenant_id`,`source_id`,`entity_code`,`entity_name`,`entity_type`,
  152. `source_table_name`,`target_table_name`,`sync_mode`,`incr_column`,`batch_size`,
  153. `biz_key_expr`,`status`,`create_time`,`update_time`)
  154. SELECT 0, @src_id, 'S0_ITEM_ROUTING_OP', 'S0 物料工艺路线工序入站', 'TABLE',
  155. 'RoutingOpDetail', 'mdp_stg_s0_item_routing_op', 'FULL', NULL, 100000,
  156. 'MaterialCode,OperationCode', 1, NOW(), NOW()
  157. WHERE @src_id IS NOT NULL
  158. AND NOT EXISTS (SELECT 1 FROM `mdp_entity` WHERE `entity_code` = 'S0_ITEM_ROUTING_OP');
  159. -- ── 回滚(注释,非可执行)──
  160. -- DROP TABLE IF EXISTS `bridge_item_op_line`, `bridge_item_routing_op`;
  161. -- DROP TABLE IF EXISTS `mdp_stg_s0_item_op_line`, `mdp_stg_s0_item_routing_op`;
  162. -- DELETE FROM `mdp_entity` WHERE `tenant_id`=0 AND `entity_code` IN ('S0_ITEM_OP_LINE','S0_ITEM_ROUTING_OP');