-- =====================================================
-- Batch 1: WMS API 模块建设 - 数据库变更脚本
-- 版本: v1.0
-- 日期: 2026-06-26
-- 说明: 新增库存预留相关表，扩展库存字段
-- =====================================================

-- =====================================================
-- 1. 新增库存预留表
-- =====================================================

-- 库存预留表（用于销售订单等业务预留库存）
CREATE TABLE IF NOT EXISTS `wms_inventory_reserve` (
  `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '编号',
  `reserve_no` VARCHAR(64) NOT NULL COMMENT '预留单号',
  `biz_type` INT NOT NULL COMMENT '业务类型（10=销售预留 20=生产预留）',
  `biz_id` BIGINT NOT NULL COMMENT '业务单据ID',
  `biz_no` VARCHAR(64) DEFAULT NULL COMMENT '业务单据号',
  `sku_id` BIGINT NOT NULL COMMENT 'SKU编号',
  `warehouse_id` BIGINT NOT NULL COMMENT '仓库编号',
  `reserve_quantity` DECIMAL(24,6) NOT NULL COMMENT '预留数量',
  `used_quantity` DECIMAL(24,6) DEFAULT 0 COMMENT '已使用数量',
  `status` INT NOT NULL DEFAULT 0 COMMENT '状态（0=预留中 1=部分使用 2=已使用 3=已释放）',
  `expire_time` DATETIME DEFAULT NULL COMMENT '过期时间',
  `remark` VARCHAR(255) DEFAULT NULL COMMENT '备注',
  `creator` VARCHAR(64) DEFAULT '' COMMENT '创建者',
  `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `updater` VARCHAR(64) 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`),
  UNIQUE KEY `uk_reserve_no` (`reserve_no`),
  KEY `idx_biz` (`biz_type`, `biz_id`),
  KEY `idx_sku_warehouse` (`sku_id`, `warehouse_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='库存预留表';

-- =====================================================
-- 2. 新增库存事务流水表
-- =====================================================

CREATE TABLE IF NOT EXISTS `wms_inventory_transaction` (
  `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '编号',
  `transaction_no` VARCHAR(64) NOT NULL COMMENT '事务流水号',
  `transaction_type` INT NOT NULL COMMENT '事务类型（10=入库 20=出库 30=预留 40=释放 50=盘点 60=调拨）',
  `biz_type` INT NOT NULL COMMENT '业务类型',
  `biz_id` BIGINT NOT NULL COMMENT '业务单据ID',
  `biz_no` VARCHAR(64) DEFAULT NULL COMMENT '业务单据号',
  `sku_id` BIGINT NOT NULL COMMENT 'SKU编号',
  `warehouse_id` BIGINT NOT NULL COMMENT '仓库编号',
  `quantity` DECIMAL(24,6) NOT NULL COMMENT '变动数量（正数入库，负数出库）',
  `before_quantity` DECIMAL(24,6) DEFAULT NULL COMMENT '变动前数量',
  `after_quantity` DECIMAL(24,6) DEFAULT NULL COMMENT '变动后数量',
  `reserve_id` BIGINT DEFAULT NULL COMMENT '关联预留ID',
  `reserve_no` VARCHAR(64) DEFAULT NULL COMMENT '关联预留单号',
  `transaction_time` DATETIME NOT NULL COMMENT '事务时间',
  `remark` VARCHAR(255) DEFAULT NULL COMMENT '备注',
  `creator` VARCHAR(64) DEFAULT '' COMMENT '创建者',
  `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `updater` VARCHAR(64) 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`),
  UNIQUE KEY `uk_transaction_no` (`transaction_no`),
  KEY `idx_biz` (`biz_type`, `biz_id`),
  KEY `idx_sku` (`sku_id`),
  KEY `idx_transaction_time` (`transaction_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='库存事务流水表';

-- =====================================================
-- 3. 数据字典新增
-- =====================================================

-- 库存预留业务类型
INSERT INTO `system_dict_type` (`name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
VALUES ('WMS 库存预留业务类型', 'wms_reserve_biz_type', 0, '库存预留的业务来源类型', '1', NOW(), '1', NOW(), b'0')
ON DUPLICATE KEY UPDATE `name` = 'WMS 库存预留业务类型';

INSERT INTO `system_dict_data` (`sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
VALUES
(10, '销售预留', '10', 'wms_reserve_biz_type', 0, 'primary', '', '销售订单预留库存', '1', NOW(), '1', NOW(), b'0'),
(20, '生产预留', '20', 'wms_reserve_biz_type', 0, 'success', '', '生产工单预留库存', '1', NOW(), '1', NOW(), b'0')
ON DUPLICATE KEY UPDATE `label` = VALUES(`label`);

-- 库存事务类型
INSERT INTO `system_dict_type` (`name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
VALUES ('WMS 库存事务类型', 'wms_transaction_type', 0, '库存事务流水类型', '1', NOW(), '1', NOW(), b'0')
ON DUPLICATE KEY UPDATE `name` = 'WMS 库存事务类型';

INSERT INTO `system_dict_data` (`sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
VALUES
(10, '入库', '10', 'wms_transaction_type', 0, 'success', '', '库存入库', '1', NOW(), '1', NOW(), b'0'),
(20, '出库', '20', 'wms_transaction_type', 0, 'warning', '', '库存出库', '1', NOW(), '1', NOW(), b'0'),
(30, '预留', '30', 'wms_transaction_type', 0, 'primary', '', '库存预留', '1', NOW(), '1', NOW(), b'0'),
(40, '释放', '40', 'wms_transaction_type', 0, 'info', '', '预留释放', '1', NOW(), '1', NOW(), b'0'),
(50, '盘点', '50', 'wms_transaction_type', 0, 'default', '', '库存盘点', '1', NOW(), '1', NOW(), b'0'),
(60, '调拨', '60', 'wms_transaction_type', 0, 'default', '', '库存调拨', '1', NOW(), '1', NOW(), b'0')
ON DUPLICATE KEY UPDATE `label` = VALUES(`label`);

-- 库存预留状态
INSERT INTO `system_dict_type` (`name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
VALUES ('WMS 库存预留状态', 'wms_reserve_status', 0, '库存预留状态', '1', NOW(), '1', NOW(), b'0')
ON DUPLICATE KEY UPDATE `name` = 'WMS 库存预留状态';

INSERT INTO `system_dict_data` (`sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
VALUES
(0, '预留中', '0', 'wms_reserve_status', 0, 'primary', '', '库存预留中', '1', NOW(), '1', NOW(), b'0'),
(1, '部分使用', '1', 'wms_reserve_status', 0, 'warning', '', '部分已使用', '1', NOW(), '1', NOW(), b'0'),
(2, '已使用', '2', 'wms_reserve_status', 0, 'success', '', '已全部使用', '1', NOW(), '1', NOW(), b'0'),
(3, '已释放', '3', 'wms_reserve_status', 0, 'info', '', '预留已释放', '1', NOW(), '1', NOW(), b'0')
ON DUPLICATE KEY UPDATE `label` = VALUES(`label`);

-- =====================================================
-- 4. 菜单新增（库存预留管理）
-- =====================================================

-- 库存预留放在"库存管理"菜单下（ID: 6440）
-- 如果库存管理菜单不存在，则放在 WMS 系统菜单下（ID: 6400）

-- 方案一：使用固定的库存管理菜单ID（推荐，如果数据库结构一致）
-- SET @inventory_menu_id = 6440;

-- 方案二：动态查询库存管理菜单ID（更安全）
SET @inventory_menu_id = (SELECT `id` FROM `system_menu` WHERE `name` = '库存管理' AND `parent_id` = 6400 AND `deleted` = b'0' LIMIT 1);

-- 如果库存管理菜单不存在，使用 WMS 系统菜单ID
SET @inventory_menu_id = IFNULL(@inventory_menu_id, 6400);

-- 新增库存预留菜单
INSERT INTO `system_menu` (`name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
VALUES ('库存预留', '', 2, 30, @inventory_menu_id, 'reserve', 'ep:lock', 'wms/inventory/reserve/index', 'WmsInventoryReserve', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0')
ON DUPLICATE KEY UPDATE `name` = '库存预留';

-- 获取菜单ID
SET @reserve_menu_id = (SELECT `id` FROM `system_menu` WHERE `path` = 'reserve' AND `parent_id` = @inventory_menu_id AND `deleted` = b'0');

-- 查询按钮
INSERT INTO `system_menu` (`name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
VALUES ('库存预留查询', 'wms:inventory-reserve:query', 3, 1, @reserve_menu_id, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0')
ON DUPLICATE KEY UPDATE `permission` = 'wms:inventory-reserve:query';

-- 释放按钮
INSERT INTO `system_menu` (`name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
VALUES ('库存预留释放', 'wms:inventory-reserve:release', 3, 2, @reserve_menu_id, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0')
ON DUPLICATE KEY UPDATE `permission` = 'wms:inventory-reserve:release';

-- =====================================================
-- 回滚脚本（如需回滚，执行以下语句）
-- =====================================================

/*
-- 删除新增表
DROP TABLE IF EXISTS `wms_inventory_reserve`;
DROP TABLE IF EXISTS `wms_inventory_transaction`;

-- 删除字典
DELETE FROM `system_dict_type` WHERE `type` = 'wms_reserve_biz_type';
DELETE FROM `system_dict_data` WHERE `dict_type` = 'wms_reserve_biz_type';
DELETE FROM `system_dict_type` WHERE `type` = 'wms_transaction_type';
DELETE FROM `system_dict_data` WHERE `dict_type` = 'wms_transaction_type';
DELETE FROM `system_dict_type` WHERE `type` = 'wms_reserve_status';
DELETE FROM `system_dict_data` WHERE `dict_type` = 'wms_reserve_status';

-- 删除菜单
DELETE FROM `system_menu` WHERE `path` = 'reserve' AND `name` = '库存预留';
DELETE FROM `system_menu` WHERE `permission` LIKE 'wms:inventory-reserve:%';
*/