-- 工艺路线工序产出:按产品归属(product_id 为空表示多产品通用) CREATE TABLE IF NOT EXISTS `mes_pro_route_process_output` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号', `route_process_id` bigint NOT NULL COMMENT '工艺路线工序编号', `route_id` bigint NOT NULL COMMENT '工艺路线编号', `process_id` bigint NOT NULL COMMENT '工序编号', `product_id` bigint DEFAULT NULL COMMENT '归属产品编号,为空表示多产品通用', `item_id` bigint NOT NULL COMMENT '产出物料编号', `sort` int DEFAULT NULL COMMENT '排序', `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '备注', `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '创建者', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '更新者', `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', PRIMARY KEY (`id`) USING BTREE, KEY `idx_route_process_id` (`route_process_id`) USING BTREE, KEY `idx_route_id` (`route_id`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci ROW_FORMAT=DYNAMIC COMMENT='MES 工艺路线工序产出归属'; -- 存量迁移:拆分 output_item_id。 -- 规则:产出物料是当前路线绑定的产品 → 归属到自身(产品专属);否则 → 通用(NULL)。 INSERT INTO `mes_pro_route_process_output` (`route_process_id`, `route_id`, `process_id`, `product_id`, `item_id`, `sort`) WITH RECURSIVE seq AS ( SELECT 1 AS n UNION ALL SELECT n + 1 FROM seq WHERE n < 100 ) SELECT p.`id`, p.`route_id`, p.`process_id`, rp.`item_id` AS product_id, CAST(TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(p.`output_item_id`, ',', seq.n), ',', -1)) AS UNSIGNED) AS item_id, seq.n FROM `mes_pro_route_process` p JOIN seq ON seq.n <= 1 + LENGTH(p.`output_item_id`) - LENGTH(REPLACE(p.`output_item_id`, ',', '')) LEFT JOIN `mes_pro_route_product` rp ON rp.`route_id` = p.`route_id` AND rp.`deleted` = 0 AND rp.`item_id` = CAST(TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(p.`output_item_id`, ',', seq.n), ',', -1)) AS UNSIGNED) WHERE p.`deleted` = 0 AND p.`output_item_id` IS NOT NULL AND p.`output_item_id` <> '' AND TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(p.`output_item_id`, ',', seq.n), ',', -1)) <> '' AND NOT EXISTS ( SELECT 1 FROM `mes_pro_route_process_output` o WHERE o.`route_process_id` = p.`id` AND o.`item_id` = CAST(TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(p.`output_item_id`, ',', seq.n), ',', -1)) AS UNSIGNED) );