-- =============================================
-- 统一物料主数据模块 (MDM) 建表 SQL
-- 创建日期: 2026-06-29
-- 说明: 整合 MES/ERP/WMS 的物料数据，实现跨模块数据打通
-- 注意: 不开启多租户模式
-- =============================================

-- ---------------------------------------------
-- 1. 物料主数据表 (md_item)
-- 核心表，所有模块共用唯一产品编码
-- ---------------------------------------------
DROP TABLE IF EXISTS `md_item`;
CREATE TABLE `md_item` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '物料ID（全局唯一）',
  `code` varchar(64) NOT NULL COMMENT '物料编码（全局唯一）',
  `name` varchar(255) NOT NULL COMMENT '物料名称',
  `bar_code` varchar(64) DEFAULT NULL COMMENT '物料条码',
  `specification` varchar(500) DEFAULT NULL COMMENT '规格型号',

  -- 分类与单位
  `category_id` bigint NOT NULL COMMENT '物料分类编号',
  `unit_measure_id` bigint NOT NULL COMMENT '主计量单位编号',
  `brand_id` bigint DEFAULT NULL COMMENT '品牌编号',

  -- 物料类型
  `item_type` tinyint NOT NULL DEFAULT 1 COMMENT '物料类型(1:原料, 2:半成品, 3:成品, 4:辅料)',

  -- 状态
  `status` tinyint NOT NULL DEFAULT 0 COMMENT '状态(0:启用, 1:禁用)',

  -- 价格信息
  `purchase_price` decimal(24,6) DEFAULT NULL COMMENT '采购价',
  `sales_price` decimal(24,6) DEFAULT NULL COMMENT '销售价',
  `cost_price` decimal(24,6) DEFAULT NULL COMMENT '成本价',
  `min_price` decimal(24,6) DEFAULT NULL COMMENT '最低价',

  -- 库存管理
  `safety_stock` decimal(24,6) DEFAULT NULL COMMENT '安全库存',
  `min_stock` decimal(24,6) DEFAULT NULL COMMENT '最低库存量',
  `max_stock` decimal(24,6) DEFAULT NULL COMMENT '最高库存量',
  `min_order_qty` decimal(24,6) DEFAULT NULL COMMENT '最小订货量',
  `lead_time` int DEFAULT NULL COMMENT '采购提前期（天）',

  -- 批次与序列号管理
  `is_batch_managed` bit(1) DEFAULT b'0' COMMENT '是否批次管理',
  `is_serial_managed` bit(1) DEFAULT b'0' COMMENT '是否序列号管理',
  `barcode_rule_id` bigint DEFAULT NULL COMMENT '条码规则ID',

  -- 质量管理
  `expiry_day` int DEFAULT NULL COMMENT '保质期天数',
  `high_value` bit(1) DEFAULT b'0' COMMENT '是否高值物料',

  -- 物理属性
  `weight` decimal(24,6) DEFAULT NULL COMMENT '重量(kg)',

  -- 备注
  `remark` varchar(500) 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_code` (`code`),
  KEY `idx_category_id` (`category_id`),
  KEY `idx_unit_measure_id` (`unit_measure_id`),
  KEY `idx_brand_id` (`brand_id`),
  KEY `idx_item_type` (`item_type`),
  KEY `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='物料主数据表';

-- ---------------------------------------------
-- 2. 物料分类表 (md_item_category)
-- 统一分类，支持树形结构
-- ---------------------------------------------
DROP TABLE IF EXISTS `md_item_category`;
CREATE TABLE `md_item_category` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '分类编号',
  `parent_id` bigint NOT NULL DEFAULT 0 COMMENT '父分类编号(根节点=0)',
  `code` varchar(64) NOT NULL COMMENT '分类编码',
  `name` varchar(255) NOT NULL COMMENT '分类名称',
  `item_type` tinyint DEFAULT NULL COMMENT '适用物料类型(1:原料, 2:半成品, 3:成品, 4:辅料, NULL:全部)',
  `sort` int NOT NULL DEFAULT 0 COMMENT '排序',
  `status` tinyint NOT NULL DEFAULT 0 COMMENT '状态(0:启用, 1:禁用)',
  `remark` varchar(500) 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_code` (`code`),
  KEY `idx_parent_id` (`parent_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='物料分类表';

-- ---------------------------------------------
-- 3. 计量单位表 (md_unit_measure)
-- 统一计量单位
-- ---------------------------------------------
DROP TABLE IF EXISTS `md_unit_measure`;
CREATE TABLE `md_unit_measure` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '单位编号',
  `code` varchar(64) NOT NULL COMMENT '单位编码',
  `name` varchar(64) NOT NULL COMMENT '单位名称',
  `primary_flag` bit(1) DEFAULT b'0' COMMENT '是否主单位',
  `primary_id` bigint DEFAULT NULL COMMENT '主单位编号',
  `change_rate` decimal(24,6) DEFAULT NULL COMMENT '与主单位换算比例',
  `status` tinyint NOT NULL DEFAULT 0 COMMENT '状态(0:启用, 1:禁用)',
  `remark` varchar(500) 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_code` (`code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='计量单位表';

-- ---------------------------------------------
-- 4. 品牌表 (md_brand)
-- 统一品牌数据
-- ---------------------------------------------
DROP TABLE IF EXISTS `md_brand`;
CREATE TABLE `md_brand` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '品牌编号',
  `code` varchar(64) NOT NULL COMMENT '品牌编码',
  `name` varchar(255) NOT NULL COMMENT '品牌名称',
  `status` tinyint NOT NULL DEFAULT 0 COMMENT '状态(0:启用, 1:禁用)',
  `remark` varchar(500) 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_code` (`code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='品牌表';

-- ---------------------------------------------
-- 5. 物料批次属性配置表 (md_item_batch_config)
-- 来自 MES 的批次管理配置
-- ---------------------------------------------
DROP TABLE IF EXISTS `md_item_batch_config`;
CREATE TABLE `md_item_batch_config` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号',
  `item_id` bigint NOT NULL COMMENT '物料编号',

  -- 批次属性开关
  `produce_date_flag` bit(1) DEFAULT b'0' COMMENT '生产日期',
  `expire_date_flag` bit(1) DEFAULT b'0' COMMENT '有效期',
  `receipt_date_flag` bit(1) DEFAULT b'0' COMMENT '入库日期',
  `vendor_flag` bit(1) DEFAULT b'0' COMMENT '供应商',
  `client_flag` bit(1) DEFAULT b'0' COMMENT '客户',
  `sales_order_code_flag` bit(1) DEFAULT b'0' COMMENT '销售订单编号',
  `purchase_order_code_flag` bit(1) DEFAULT b'0' COMMENT '采购订单编号',
  `work_order_flag` bit(1) DEFAULT b'0' COMMENT '生产工单',
  `task_flag` bit(1) DEFAULT b'0' COMMENT '生产任务',
  `workstation_flag` bit(1) DEFAULT b'0' COMMENT '工作站',
  `tool_flag` bit(1) DEFAULT b'0' COMMENT '工具',
  `mold_flag` bit(1) DEFAULT b'0' COMMENT '模具',
  `lot_number_flag` bit(1) DEFAULT b'0' COMMENT '生产批号',
  `quality_status_flag` bit(1) DEFAULT b'0' 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_item_id` (`item_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='物料批次属性配置表';

-- ---------------------------------------------
-- 6. 仓库主数据表 (md_warehouse)
-- 统一仓库数据，WMS 为主数据源
-- ---------------------------------------------
DROP TABLE IF EXISTS `md_warehouse`;
CREATE TABLE `md_warehouse` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '仓库ID',
  `code` varchar(64) NOT NULL COMMENT '仓库编码',
  `name` varchar(255) NOT NULL COMMENT '仓库名称',
  `address` varchar(500) DEFAULT NULL COMMENT '仓库地址',
  `area` decimal(24,6) DEFAULT NULL COMMENT '面积(平方米)',
  `type` tinyint DEFAULT NULL COMMENT '仓库类型(1:原料仓, 2:成品仓, 3:半成品仓, 4:线边仓)',
  `charge_user_id` bigint DEFAULT NULL COMMENT '负责人用户ID',
  `status` tinyint NOT NULL DEFAULT 0 COMMENT '状态(0:启用, 1:禁用)',
  `frozen` bit(1) DEFAULT b'0' COMMENT '是否冻结',
  `remark` varchar(500) 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_code` (`code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='仓库主数据表';

-- ---------------------------------------------
-- 7. 库存表 (wms_stock)
-- WMS 作为唯一库存管理者
-- ---------------------------------------------
DROP TABLE IF EXISTS `wms_stock`;
CREATE TABLE `wms_stock` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '库存ID',
  `item_id` bigint NOT NULL COMMENT '物料ID（关联 md_item）',
  `warehouse_id` bigint NOT NULL COMMENT '仓库ID（关联 md_warehouse）',
  `location_id` bigint DEFAULT NULL COMMENT '库位ID',
  `batch_code` varchar(64) DEFAULT NULL COMMENT '批次号',

  -- 库存数量
  `quantity` decimal(24,6) NOT NULL DEFAULT 0 COMMENT '当前库存数量',
  `quantity_locked` decimal(24,6) NOT NULL DEFAULT 0 COMMENT '锁定数量',
  `quantity_available` decimal(24,6) NOT NULL DEFAULT 0 COMMENT '可用数量 = quantity - quantity_locked',

  `unit_measure_id` bigint NOT NULL COMMENT '计量单位ID',

  -- 系统字段
  `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_item_warehouse_batch` (`item_id`, `warehouse_id`, `batch_code`),
  KEY `idx_item_id` (`item_id`),
  KEY `idx_warehouse_id` (`warehouse_id`),
  KEY `idx_batch_code` (`batch_code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='库存表';

-- ---------------------------------------------
-- 8. 库存事务流水表 (wms_stock_transaction)
-- 记录所有库存变动
-- ---------------------------------------------
DROP TABLE IF EXISTS `wms_stock_transaction`;
CREATE TABLE `wms_stock_transaction` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '流水ID',
  `item_id` bigint NOT NULL COMMENT '物料ID',
  `warehouse_id` bigint NOT NULL COMMENT '仓库ID',
  `location_id` bigint DEFAULT NULL COMMENT '库位ID',
  `batch_code` varchar(64) DEFAULT NULL COMMENT '批次号',

  -- 变动信息
  `quantity` decimal(24,6) NOT NULL COMMENT '变动数量(正数入库,负数出库)',
  `biz_type` tinyint NOT NULL COMMENT '业务类型(见枚举)',
  `biz_id` bigint DEFAULT NULL COMMENT '业务单据ID',
  `biz_no` varchar(64) DEFAULT NULL COMMENT '业务单据号',

  -- 关联库存记录
  `stock_id` bigint DEFAULT NULL COMMENT '关联库存记录ID',

  `remark` varchar(500) 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`),
  KEY `idx_item_id` (`item_id`),
  KEY `idx_warehouse_id` (`warehouse_id`),
  KEY `idx_biz_type` (`biz_type`),
  KEY `idx_biz_id` (`biz_id`),
  KEY `idx_create_time` (`create_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='库存事务流水表';

-- ---------------------------------------------
-- 9. 物料迁移映射表 (md_item_migration_map)
-- 用于记录旧表数据到新表的映射关系
-- ---------------------------------------------
DROP TABLE IF EXISTS `md_item_migration_map`;
CREATE TABLE `md_item_migration_map` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '映射ID',
  `source_module` varchar(20) NOT NULL COMMENT '来源模块(ERP/MES/WMS)',
  `source_table` varchar(64) NOT NULL COMMENT '来源表名',
  `source_id` bigint NOT NULL COMMENT '原ID',
  `target_item_id` bigint NOT NULL COMMENT 'MDM物料ID',

  -- 系统字段
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',

  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_source` (`source_module`, `source_table`, `source_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='物料迁移映射表';

-- ---------------------------------------------
-- 10. 库存变动业务类型枚举值
-- ---------------------------------------------
-- 业务类型说明：
-- 10: 采购入库 (ERP)
-- 11: 采购入库作废 (ERP)
-- 20: 销售出库 (ERP)
-- 21: 销售出库作废 (ERP)
-- 30: 生产入库 (MES)
-- 31: 生产入库作废 (MES)
-- 40: 生产领料 (MES)
-- 41: 生产领料作废 (MES)
-- 50: 生产退料 (MES)
-- 51: 生产退料作废 (MES)
-- 60: 采购退货出库 (ERP)
-- 61: 采购退货出库作废 (ERP)
-- 70: 销售退货入库 (ERP)
-- 71: 销售退货入库作废 (ERP)
-- 80: 调拨入库 (WMS)
-- 81: 调拨入库作废 (WMS)
-- 90: 调拨出库 (WMS)
-- 91: 调拨出库作废 (WMS)
-- 100: 盘盈入库 (WMS)
-- 101: 盘盈入库作废 (WMS)
-- 110: 盘亏出库 (WMS)
-- 111: 盘亏出库作废 (WMS)

-- =============================================
-- 完成建表 SQL
-- =============================================