| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170 |
- -- =====================================================================================
- -- WIP-C3A · S0 · C3-A 物料桥:ProdLineDetail / RoutingOpDetail
- -- (占位名,提交那刻 rename 为正式 1.0.<next>.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.<col> <=> d.<col>` 同名列 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');
|