3 天以前 1ba0dbfde5634c8bf2ec20891d6b226b996f6b59
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
-- =====================================================================
-- 新建合格仓库 + 仓库类型 + 质检入合格库改造
--
-- 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;