This commit is contained in:
Yangxt
2026-09-30 11:11:54 +08:00
parent cb9b7a4bd4
commit 2fb57ec490
160 changed files with 14764 additions and 53 deletions
+22
View File
@@ -0,0 +1,22 @@
-- 表:wms_batch
-- 用途:批次。启用批次或效期管理的 SKU 的批次档案。
-- 约定:InnoDB / utf8mb4 / 无外键,表间按业务编码关联。详见 docs/database/00-conventions.md
-- 说明:不管批次的 SKU 在库存行上使用空批次号,不强制建本表记录。
CREATE TABLE `wms_batch` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '内部主键',
`tenant_code` VARCHAR(32) NOT NULL COMMENT '租户编码',
`customer_code` VARCHAR(32) NOT NULL COMMENT '货主编码',
`sku_code` VARCHAR(64) NOT NULL COMMENT 'SKU 编码',
`batch_no` VARCHAR(64) NOT NULL COMMENT '批次号,SKU 内唯一',
`production_date` DATE NULL COMMENT '生产日期',
`expiry_date` DATE NULL COMMENT '失效日期',
`supplier_code` VARCHAR(32) NOT NULL DEFAULT '' COMMENT '供应商编码,可空',
`supplier_batch_no` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '供应商批次号',
`inbound_no` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '首次入库单号',
`created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间',
`updated_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3) COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_tenant_sku_batch` (`tenant_code`, `sku_code`, `batch_no`),
KEY `idx_tenant_expiry` (`tenant_code`, `expiry_date`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='批次';
@@ -0,0 +1,32 @@
-- 表:wms_inventory
-- 用途:库存余额。某个货主、仓库、库位、SKU、批次上的数量结果。
-- 约定:InnoDB / utf8mb4 / 无外键,表间按业务编码关联。详见 docs/database/00-conventions.md
-- 说明:余额是结果。任何数量变化必须与 wms_stock_log 处于同一事务。扣减使用带数量条件的原子 UPDATE(affected rows = 0 即库存不足),禁止先 SELECT 再在应用里计算后 UPDATE。多行更新按 id 升序加锁。库位上的待检、待上架库存放在收货或质检库位,靠库位策略排除出可分配范围,不另设数量桶。
CREATE TABLE `wms_inventory` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '内部主键',
`tenant_code` VARCHAR(32) NOT NULL COMMENT '租户编码',
`warehouse_code` VARCHAR(32) NOT NULL COMMENT '仓库编码',
`customer_code` VARCHAR(32) NOT NULL COMMENT '货主编码',
`location_code` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '库位编码;在途库存使用空字符串,表示仓库级',
`sku_code` VARCHAR(64) NOT NULL COMMENT 'SKU 编码',
`batch_no` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '批次号,不管批次时为空字符串',
`available_qty` DECIMAL(16,4) NOT NULL DEFAULT 0.0000 COMMENT '可用数量',
`reserved_qty` DECIMAL(16,4) NOT NULL DEFAULT 0.0000 COMMENT '预占数量,已分配给出库尚未拣货',
`picked_qty` DECIMAL(16,4) NOT NULL DEFAULT 0.0000 COMMENT '已拣数量,已拣下尚未出库',
`hold_qty` DECIMAL(16,4) NOT NULL DEFAULT 0.0000 COMMENT '冻结数量',
`damaged_qty` DECIMAL(16,4) NOT NULL DEFAULT 0.0000 COMMENT '残损数量',
`in_transit_qty` DECIMAL(16,4) NOT NULL DEFAULT 0.0000 COMMENT '在途数量,只出现在库位编码为空的行',
`version` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '乐观锁版本',
`created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间',
`updated_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3) COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_inventory_bucket` (`tenant_code`, `warehouse_code`, `customer_code`, `location_code`, `sku_code`, `batch_no`),
KEY `idx_tenant_wh_sku` (`tenant_code`, `warehouse_code`, `sku_code`),
KEY `idx_tenant_sku` (`tenant_code`, `sku_code`),
KEY `idx_tenant_wh_location` (`tenant_code`, `warehouse_code`, `location_code`),
CONSTRAINT `chk_inventory_qty_nonneg` CHECK (
`available_qty` >= 0 AND `reserved_qty` >= 0 AND `picked_qty` >= 0
AND `hold_qty` >= 0 AND `damaged_qty` >= 0 AND `in_transit_qty` >= 0
)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='库存余额';
@@ -0,0 +1,18 @@
-- 表:wms_inventory_alert
-- 用途:库存预警规则。SKU 在仓库的最低可用量阈值。
-- 约定:InnoDB / utf8mb4 / 无外键,表间按业务编码关联。详见 docs/database/00-conventions.md
-- 说明:本表只存规则。预警扫描由定时任务完成,不在这里存每次预警记录。
CREATE TABLE `wms_inventory_alert` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '内部主键',
`tenant_code` VARCHAR(32) NOT NULL COMMENT '租户编码',
`warehouse_code` VARCHAR(32) NOT NULL DEFAULT '' COMMENT '仓库编码,空表示该货主全仓合计',
`customer_code` VARCHAR(32) NOT NULL COMMENT '货主编码',
`sku_code` VARCHAR(64) NOT NULL COMMENT 'SKU 编码',
`min_available_qty` DECIMAL(16,4) NOT NULL DEFAULT 0.0000 COMMENT '可用数量低于该值时预警',
`status` VARCHAR(32) NOT NULL DEFAULT 'active' COMMENT 'active 启用,disabled 停用',
`created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间',
`updated_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3) COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_alert_rule` (`tenant_code`, `warehouse_code`, `customer_code`, `sku_code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='库存预警规则';
@@ -0,0 +1,21 @@
-- 表:wms_inventory_hold
-- 用途:库存冻结单。把可用库存转为冻结的业务单据。
-- 约定:InnoDB / utf8mb4 / 无外键,表间按业务编码关联。详见 docs/database/00-conventions.md
-- 说明:frozen 时 available 转为 hold;released 时反向转回。两次变化都写流水,biz_type 分别为 freeze、unfreeze。
CREATE TABLE `wms_inventory_hold` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '内部主键',
`tenant_code` VARCHAR(32) NOT NULL COMMENT '租户编码',
`hold_no` VARCHAR(64) NOT NULL COMMENT '冻结单号,租户内唯一',
`warehouse_code` VARCHAR(32) NOT NULL COMMENT '仓库编码',
`status` VARCHAR(32) NOT NULL DEFAULT 'draft' COMMENT 'draft 草稿,frozen 已冻结,released 已解冻,cancelled 已取消',
`reason` VARCHAR(255) NOT NULL DEFAULT '' COMMENT '冻结原因',
`remark` VARCHAR(500) NOT NULL DEFAULT '' COMMENT '备注',
`created_by` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '创建人 user_code,系统任务为空',
`updated_by` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '更新人 user_code',
`created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间',
`updated_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3) COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_tenant_hold_no` (`tenant_code`, `hold_no`),
KEY `idx_tenant_wh_status` (`tenant_code`, `warehouse_code`, `status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='库存冻结单';
@@ -0,0 +1,22 @@
-- 表:wms_inventory_hold_item
-- 用途:库存冻结明细。冻结单的库位与数量。
-- 约定:InnoDB / utf8mb4 / 无外键,表间按业务编码关联。详见 docs/database/00-conventions.md
-- 说明:解冻按本行数量执行,不部分解冻;需要部分解冻时另开冻结单。
CREATE TABLE `wms_inventory_hold_item` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '内部主键',
`tenant_code` VARCHAR(32) NOT NULL COMMENT '租户编码',
`hold_no` VARCHAR(64) NOT NULL COMMENT '冻结单号',
`line_no` INT UNSIGNED NOT NULL COMMENT '行号,单内唯一',
`customer_code` VARCHAR(32) NOT NULL COMMENT '货主编码',
`location_code` VARCHAR(64) NOT NULL COMMENT '库位编码',
`sku_code` VARCHAR(64) NOT NULL COMMENT 'SKU 编码',
`batch_no` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '批次号,可空',
`qty` DECIMAL(16,4) NOT NULL DEFAULT 0.0000 COMMENT '冻结数量',
`created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间',
`updated_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3) COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_tenant_hold_line` (`tenant_code`, `hold_no`, `line_no`),
KEY `idx_tenant_sku` (`tenant_code`, `sku_code`),
CONSTRAINT `chk_hold_qty_positive` CHECK (`qty` > 0)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='库存冻结明细';
@@ -0,0 +1,24 @@
-- 表:wms_stock_adjustment
-- 用途:库存调整单。盘盈盘亏、报损等人工调整。
-- 约定:InnoDB / utf8mb4 / 无外键,表间按业务编码关联。详见 docs/database/00-conventions.md
-- 说明:只有 completed 时改余额并写流水,biz_type=adjust 或 stocktake。完成后不可修改。
CREATE TABLE `wms_stock_adjustment` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '内部主键',
`tenant_code` VARCHAR(32) NOT NULL COMMENT '租户编码',
`adjustment_no` VARCHAR(64) NOT NULL COMMENT '调整单号,租户内唯一',
`warehouse_code` VARCHAR(32) NOT NULL COMMENT '仓库编码',
`status` VARCHAR(32) NOT NULL DEFAULT 'draft' COMMENT 'draft 草稿,completed 已完成,cancelled 已取消',
`reason_type` VARCHAR(32) NOT NULL COMMENT 'gain 盘盈,loss 盘亏,damage 转残,other 其他',
`stocktake_no` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '来源盘点单号,手工调整为空',
`reason` VARCHAR(255) NOT NULL DEFAULT '' COMMENT '调整原因',
`remark` VARCHAR(500) NOT NULL DEFAULT '' COMMENT '备注',
`created_by` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '创建人 user_code,系统任务为空',
`updated_by` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '更新人 user_code',
`created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间',
`updated_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3) COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_tenant_adjustment_no` (`tenant_code`, `adjustment_no`),
KEY `idx_tenant_wh_status` (`tenant_code`, `warehouse_code`, `status`),
KEY `idx_tenant_stocktake` (`tenant_code`, `stocktake_no`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='库存调整单';
@@ -0,0 +1,24 @@
-- 表:wms_stock_adjustment_item
-- 用途:库存调整明细。调整的数量桶与变化量。
-- 约定:InnoDB / utf8mb4 / 无外键,表间按业务编码关联。详见 docs/database/00-conventions.md
-- 说明:草稿阶段不写 qty_before/qty_after。完成时以当时余额为准回填,并受非负约束。
CREATE TABLE `wms_stock_adjustment_item` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '内部主键',
`tenant_code` VARCHAR(32) NOT NULL COMMENT '租户编码',
`adjustment_no` VARCHAR(64) NOT NULL COMMENT '调整单号',
`line_no` INT UNSIGNED NOT NULL COMMENT '行号',
`customer_code` VARCHAR(32) NOT NULL COMMENT '货主编码',
`location_code` VARCHAR(64) NOT NULL COMMENT '库位编码',
`sku_code` VARCHAR(64) NOT NULL COMMENT 'SKU 编码',
`batch_no` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '批次号,可空',
`bucket` VARCHAR(32) NOT NULL COMMENT '被调整的数量桶,取值同 wms_stock_log.bucket',
`qty_change` DECIMAL(16,4) NOT NULL DEFAULT 0.0000 COMMENT '变化量,可正可负',
`qty_before` DECIMAL(16,4) NULL COMMENT '完成时回填的变化前数量',
`qty_after` DECIMAL(16,4) NULL COMMENT '完成时回填的变化后数量',
`created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间',
`updated_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3) COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_tenant_adjustment_line` (`tenant_code`, `adjustment_no`, `line_no`),
KEY `idx_tenant_sku` (`tenant_code`, `sku_code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='库存调整明细';
@@ -0,0 +1,35 @@
-- 表:wms_stock_log
-- 用途:库存流水。库存变化的事实记录,只能追加。
-- 约定:InnoDB / utf8mb4 / 无外键,表间按业务编码关联。详见 docs/database/00-conventions.md
-- 说明:一次业务动作跨两个数量桶或两个库位时写多行,共用 biz_type 与 biz_no。例如预占写 available 减少和 reserved 增加;上架写移出库位与移入库位各一行,桶仍是 available_qty。打包不改变数量桶。禁止 UPDATE 与 DELETE。
CREATE TABLE `wms_stock_log` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '内部主键',
`tenant_code` VARCHAR(32) NOT NULL COMMENT '租户编码',
`stock_log_no` VARCHAR(64) NOT NULL COMMENT '流水号,租户内唯一',
`idempotency_key` VARCHAR(128) NOT NULL COMMENT '幂等键,同一租户重复写入必须被唯一约束拒绝',
`warehouse_code` VARCHAR(32) NOT NULL COMMENT '仓库编码',
`customer_code` VARCHAR(32) NOT NULL COMMENT '货主编码',
`location_code` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '库位编码',
`sku_code` VARCHAR(64) NOT NULL COMMENT 'SKU 编码',
`batch_no` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '批次号',
`inventory_id` BIGINT UNSIGNED NOT NULL COMMENT '余额行内部主键,仅用于对账,业务关联以编码为准',
`bucket` VARCHAR(32) NOT NULL COMMENT '变化的数量桶:available_qty、reserved_qty、picked_qty、hold_qty、damaged_qty、in_transit_qty',
`biz_type` VARCHAR(32) NOT NULL COMMENT '业务类型:inbound_receipt、inbound_putaway、reserve、release、pick、ship、adjust、stocktake、freeze、unfreeze、return_restock、scrap、transfer',
`biz_no` VARCHAR(64) NOT NULL COMMENT '业务单号',
`qty_before` DECIMAL(16,4) NOT NULL COMMENT '变化前数量',
`qty_change` DECIMAL(16,4) NOT NULL COMMENT '变化量,入库为正、出库为负',
`qty_after` DECIMAL(16,4) NOT NULL COMMENT '变化后数量',
`request_id` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '请求 ID',
`occurred_at` DATETIME(3) NOT NULL COMMENT '业务发生时间',
`created_by` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '操作人 user_code,系统任务为空',
`created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间',
`updated_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3) COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_tenant_stock_log_no` (`tenant_code`, `stock_log_no`),
UNIQUE KEY `uk_tenant_idempotency` (`tenant_code`, `idempotency_key`),
KEY `idx_tenant_sku_time` (`tenant_code`, `warehouse_code`, `sku_code`, `occurred_at`),
KEY `idx_tenant_biz` (`tenant_code`, `biz_type`, `biz_no`),
KEY `idx_inventory_id` (`inventory_id`),
CONSTRAINT `chk_stock_log_balance` CHECK (`qty_after` = `qty_before` + `qty_change`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='库存流水';
@@ -0,0 +1,21 @@
-- 表:wms_stocktake
-- 用途:盘点单。仓库盘点任务。
-- 约定:InnoDB / utf8mb4 / 无外键,表间按业务编码关联。详见 docs/database/00-conventions.md
-- 说明:进入 counting 时按范围对库位加锁定。确认差异后生成 wms_stock_adjustment,不直接改余额。
CREATE TABLE `wms_stocktake` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '内部主键',
`tenant_code` VARCHAR(32) NOT NULL COMMENT '租户编码',
`stocktake_no` VARCHAR(64) NOT NULL COMMENT '盘点单号,租户内唯一',
`warehouse_code` VARCHAR(32) NOT NULL COMMENT '仓库编码',
`zone_code` VARCHAR(32) NOT NULL DEFAULT '' COMMENT '库区编码,空表示全仓',
`status` VARCHAR(32) NOT NULL DEFAULT 'draft' COMMENT 'draft 草稿,counting 盘点中,confirming 待确认,completed 已完成,cancelled 已取消',
`remark` VARCHAR(500) NOT NULL DEFAULT '' COMMENT '备注',
`created_by` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '创建人 user_code,系统任务为空',
`updated_by` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '更新人 user_code',
`created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间',
`updated_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3) COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_tenant_stocktake_no` (`tenant_code`, `stocktake_no`),
KEY `idx_tenant_wh_status` (`tenant_code`, `warehouse_code`, `status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='盘点单';
@@ -0,0 +1,24 @@
-- 表:wms_stocktake_item
-- 用途:盘点明细。系统数量与实盘数量。
-- 约定:InnoDB / utf8mb4 / 无外键,表间按业务编码关联。详见 docs/database/00-conventions.md
-- 说明:system_qty 是开盘快照。确认前若发生其他库存变化,由应用层拦截或重算,不在盘点中途覆盖快照。
CREATE TABLE `wms_stocktake_item` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '内部主键',
`tenant_code` VARCHAR(32) NOT NULL COMMENT '租户编码',
`stocktake_no` VARCHAR(64) NOT NULL COMMENT '盘点单号',
`line_no` INT UNSIGNED NOT NULL COMMENT '行号',
`customer_code` VARCHAR(32) NOT NULL COMMENT '货主编码',
`location_code` VARCHAR(64) NOT NULL COMMENT '库位编码',
`sku_code` VARCHAR(64) NOT NULL COMMENT 'SKU 编码',
`batch_no` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '批次号,可空',
`system_qty` DECIMAL(16,4) NOT NULL DEFAULT 0.0000 COMMENT '快照时的可用数量',
`counted_qty` DECIMAL(16,4) NULL COMMENT '实盘数量,未盘为空',
`diff_qty` DECIMAL(16,4) NULL COMMENT '实盘减系统,确认时回填',
`count_status` VARCHAR(32) NOT NULL DEFAULT 'pending' COMMENT 'pending 待盘,counted 已盘',
`created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间',
`updated_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3) COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_tenant_stocktake_line` (`tenant_code`, `stocktake_no`, `line_no`),
KEY `idx_tenant_location` (`tenant_code`, `location_code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='盘点明细';