mes_product_plan_link_fix.sql 5.1 KB

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