-- ===================================================================== -- 新建合格仓库 + 仓库类型 + 质检入合格库改造 -- -- 1) mes_wm_warehouse 增加 type 字段(10 暂存库 / 20 合格库) -- 2) 现有仓库分类:虚拟线边仓库=10(暂存库),产品库/物料库=20(合格库) -- 3) 新建"成品合格库"(type=20) + 一个库区 + 一个库位 -- 4) 虚拟仓库中 stock_state=20 的合格库存迁移到新合格库 -- -- 说明:本脚本幂等,可重复执行;无租户字段。 -- ===================================================================== -- 1) 增加仓库类型字段(MySQL 不支持 ALTER ADD COLUMN IF NOT EXISTS,先查存在性) SET @type_exists = ( SELECT COUNT(*) FROM information_schema.columns WHERE table_schema = DATABASE() AND table_name = 'mes_wm_warehouse' AND column_name = 'type' ); SET @type_sql = IF( @type_exists = 0, 'ALTER TABLE mes_wm_warehouse ADD COLUMN type tinyint NOT NULL DEFAULT 10 COMMENT ''仓库类型:10暂存库,20合格库'' AFTER frozen', 'SELECT 1' ); PREPARE type_stmt FROM @type_sql; EXECUTE type_stmt; DEALLOCATE PREPARE type_stmt; -- 2) 现有仓库分类 UPDATE mes_wm_warehouse SET type = 10 WHERE code = 'WIP_VIRTUAL_WAREHOUSE' AND deleted = 0; UPDATE mes_wm_warehouse SET type = 20 WHERE code IN ('1212', 'WHS000001') AND deleted = 0; -- 3) 新建"成品合格库"(type=20) SET @wh_exists = ( SELECT COUNT(*) FROM mes_wm_warehouse WHERE code = 'FG_QUALIFIED_WH' AND deleted = 0 ); INSERT INTO mes_wm_warehouse (code, name, frozen, type, remark) SELECT 'FG_QUALIFIED_WH', '成品合格库', 0, 20, '质检合格直接入库的目标仓库(type=20 合格库)' WHERE @wh_exists = 0; SET @wh_id = (SELECT id FROM mes_wm_warehouse WHERE code = 'FG_QUALIFIED_WH' AND deleted = 0 LIMIT 1); -- 新建"成品合格库区" SET @loc_exists = ( SELECT COUNT(*) FROM mes_wm_warehouse_location WHERE code = 'FG_QUALIFIED_WH_LOC' AND deleted = 0 ); INSERT INTO mes_wm_warehouse_location (code, name, warehouse_id, frozen, remark) SELECT 'FG_QUALIFIED_WH_LOC', '成品合格库区', @wh_id, 0, '质检合格入库默认库区' WHERE @loc_exists = 0; SET @loc_id = (SELECT id FROM mes_wm_warehouse_location WHERE code = 'FG_QUALIFIED_WH_LOC' AND deleted = 0 LIMIT 1); -- 新建"成品合格库位" SET @area_exists = ( SELECT COUNT(*) FROM mes_wm_warehouse_area WHERE code = 'FG_QUALIFIED_WH_AREA' AND deleted = 0 ); INSERT INTO mes_wm_warehouse_area (code, name, location_id, frozen, remark) SELECT 'FG_QUALIFIED_WH_AREA', '成品合格库位', @loc_id, 0, '质检合格入库默认库位' WHERE @area_exists = 0; SET @area_id = (SELECT id FROM mes_wm_warehouse_area WHERE code = 'FG_QUALIFIED_WH_AREA' AND deleted = 0 LIMIT 1); -- 4) 迁移虚拟仓库合格库存到新合格库 -- 4.1 若新合格库已存在同 (item_id, batch_id, vendor_id) 的 state=20 记录,先数量累加合并 UPDATE mes_wm_material_stock t JOIN mes_wm_material_stock s ON s.warehouse_id = 3 AND s.stock_state = 20 AND s.deleted = 0 AND t.warehouse_id = @wh_id AND t.stock_state = 20 AND t.deleted = 0 AND t.item_id = s.item_id AND IFNULL(t.batch_id, 0) = IFNULL(s.batch_id, 0) AND IFNULL(t.vendor_id, 0) = IFNULL(s.vendor_id, 0) SET t.quantity = t.quantity + s.quantity, t.reserved_quantity = t.reserved_quantity + s.reserved_quantity, t.frozen_quantity = t.frozen_quantity + s.frozen_quantity; -- 4.2 删除已合并到新合格库的源记录(虚拟仓库中) DELETE s FROM mes_wm_material_stock s JOIN mes_wm_material_stock t ON s.warehouse_id = 3 AND s.stock_state = 20 AND s.deleted = 0 AND t.warehouse_id = @wh_id AND t.stock_state = 20 AND t.deleted = 0 AND t.item_id = s.item_id AND IFNULL(t.batch_id, 0) = IFNULL(s.batch_id, 0) AND IFNULL(t.vendor_id, 0) = IFNULL(s.vendor_id, 0); -- 4.3 其余合格库存直接改仓库/库区/库位 UPDATE mes_wm_material_stock SET warehouse_id = @wh_id, location_id = @loc_id, area_id = @area_id WHERE warehouse_id = 3 AND stock_state = 20 AND deleted = 0;