-- 订单-计划-产品关联修复(本地/测试库需执行) -- 背景: -- 1) mes_product_plan.shift_id 为 char(1),但 mes_shift.id 为 varchar(64) 的雪花ID, -- 导致计划保存真实班次ID时报 “Data too long”,getCurPlan 也永远匹配不到班次。 -- 2) 部分环境缺少代码已使用的字段/表,导致创建件、打包、按计划领料接口 500。 -- 说明:本脚本只做结构补齐,不自动改写历史 shift_id=1/2 的业务数据。 -- 历史计划需要按实际班次人工确认后再迁移。 -- 1. 计划表班次字段扩宽,保存真实 mes_shift.id ALTER TABLE `mes_product_plan` MODIFY COLUMN `shift_id` VARCHAR(64) NULL COMMENT '班次'; -- 2. 产品型号表补 cate_sn(MesProductModel 实体已映射) SET @col_exists = (SELECT COUNT(1) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'mes_product_model' AND COLUMN_NAME = 'cate_sn'); SET @ddl = IF(@col_exists = 0, 'ALTER TABLE `mes_product_model` ADD COLUMN `cate_sn` VARCHAR(50) DEFAULT NULL COMMENT ''工件类型'' AFTER `state`', 'SELECT ''mes_product_model.cate_sn 已存在'' AS message'); PREPARE stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt; -- 3. 后面板记录表补 line_sn(MesProductHmb 实体已映射) SET @col_exists = (SELECT COUNT(1) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'mes_product_hmb' AND COLUMN_NAME = 'line_sn'); SET @ddl = IF(@col_exists = 0, 'ALTER TABLE `mes_product_hmb` ADD COLUMN `line_sn` VARCHAR(100) DEFAULT NULL COMMENT ''产线编号'' AFTER `state`', 'SELECT ''mes_product_hmb.line_sn 已存在'' AS message'); PREPARE stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt; -- 4. 领料单表补 plan_id(WmsPick 实体已映射,按计划领料需要) SET @col_exists = (SELECT COUNT(1) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'wms_pick' AND COLUMN_NAME = 'plan_id'); SET @ddl = IF(@col_exists = 0, 'ALTER TABLE `wms_pick` ADD COLUMN `plan_id` VARCHAR(64) DEFAULT NULL COMMENT ''生产计划'' AFTER `order_id`', 'SELECT ''wms_pick.plan_id 已存在'' AS message'); PREPARE stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt; -- 5. BOM 表补 product_cate_id(生产计划按工件类型匹配 BOM 使用) SET @col_exists = (SELECT COUNT(1) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'wms_bom' AND COLUMN_NAME = 'product_cate_id'); SET @ddl = IF(@col_exists = 0, 'ALTER TABLE `wms_bom` ADD COLUMN `product_cate_id` VARCHAR(50) DEFAULT NULL COMMENT ''工件类型''', 'SELECT ''wms_bom.product_cate_id 已存在'' AS message'); PREPARE stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt; -- 6. 打码规则配置表(MesProductPreConfig 实体已使用) CREATE TABLE IF NOT EXISTS `mes_product_pre_config` ( `id` VARCHAR(64) NOT NULL COMMENT 'id', `title` VARCHAR(64) DEFAULT NULL COMMENT '标题', `cate` CHAR(1) DEFAULT NULL COMMENT '类型', `line_sn` VARCHAR(64) DEFAULT NULL COMMENT '产线编号', `start_date` DATETIME DEFAULT NULL COMMENT '开始时间', `end_date` DATETIME DEFAULT NULL COMMENT '结束时间', `content` TEXT COMMENT '规则', `remark` VARCHAR(255) DEFAULT NULL COMMENT '备注', `status` CHAR(1) DEFAULT '0' COMMENT '状态(0正常 1删除 2停用)', `create_by` VARCHAR(64) DEFAULT NULL COMMENT '创建人', `create_date` DATETIME DEFAULT NULL COMMENT '创建日期', `update_by` VARCHAR(64) DEFAULT NULL COMMENT '修改人', `update_date` DATETIME DEFAULT NULL COMMENT '修改日期', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='打码规则配置信息'; -- 6. 关联查询索引(按需保留) SET @idx_exists = (SELECT COUNT(1) FROM information_schema.STATISTICS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'mes_product_plan' AND INDEX_NAME = 'idx_mpp_day_shift_status'); SET @ddl = IF(@idx_exists = 0, 'CREATE INDEX `idx_mpp_day_shift_status` ON `mes_product_plan` (`day`, `shift_id`, `status`)', 'SELECT ''idx_mpp_day_shift_status 已存在'' AS message'); PREPARE stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt; SET @idx_exists = (SELECT COUNT(1) FROM information_schema.STATISTICS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'mes_product' AND INDEX_NAME = 'idx_mp_plan_id'); SET @ddl = IF(@idx_exists = 0, 'CREATE INDEX `idx_mp_plan_id` ON `mes_product` (`plan_id`)', 'SELECT ''idx_mp_plan_id 已存在'' AS message'); PREPARE stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt; -- 7. 历史数据提示(默认不执行,请确认班次名称唯一后人工执行) -- 旧计划中的 shift_id=1/2 是历史占位值,不会自动映射,避免误改。 -- UPDATE mes_product_plan p -- JOIN mes_shift s ON s.title = '白班' -- SET p.shift_id = s.id -- WHERE p.shift_id = '1'; -- UPDATE mes_product_plan p -- JOIN mes_shift s ON s.title = '晚班' -- SET p.shift_id = s.id -- WHERE p.shift_id = '2'; -- -- 另外,生产订单关联的 BOM 必须维护 wms_bom.product_cate_id, -- 否则该订单无法排产。请按实际产品类型补全后再上线。 SELECT '订单-计划-产品关联修复脚本执行完成' AS message;