WMS仓储系统(二)—— 核心数据库设计与库存模型(附完整表结构)
WMS仓储系统(二)—— 核心数据库设计与库存模型(附完整表结构)
接上一篇:我开源了一套WMS仓储系统,附完整业务设计思路(Java学习者实战项目):我们了解了WMS的整体业务流程和技术栈。本文将深入数据库设计,基于真实生产级别的表结构,重点拆解入库流程设计、出库流程设计、库存模型以及盘点机制。
快速上手(3分钟跑起来)
- 克隆代码:
git clone https://gitee.com/jeeslee/wms.git - 导入MySQL脚本:
docs/sql/wms.sql - 修改
application.yml中的数据库连接 - 启动Spring Boot应用:
mvn spring-boot:run
项目地址
⭐ Gitee:https://gitee.com/jeeslee/wms
⭐ GitHub:https://gitee.com/li_tongs/jeecgboot-vue3
如果对你有帮助,欢迎点个Star支持一下,这是我持续更新的动力!
一、整体表结构概览
本系统共设计20+张表,核心业务模块如下:
| 模块 | 核心表 | 说明 |
|---|---|---|
| 基础数据 | wms_warehouse、wms_warehouse_area、wms_kw、wms_kw_type |
仓库/库区/库位/库位类型 |
| 货主与物料 | wms_cus、wms_goods、wms_goods_type、wms_supply |
客户/物料/物料类型/供应商 |
| 入库模块 | wms_order_header、wms_order_line、wms_audit_in、wms_stock_in |
入库单 → 待上架 → 已上架 |
| 出库模块 | wms_out_order_header、wms_out_order_line、wms_audit_out、wms_stock_out |
出库单 → 待下架 → 已下架 |
| 库存模块 | wms_inventory |
即时库存(核心表) |
| 盘点模块 | wms_stock_take |
盘点单及差异处理 |
| 变更追溯 | wms_stock_in_change |
库位/箱码/托盘变更记录 |
| 月台管理 | wms_plat |
车辆进出月台管理 |
| 辅助信息 | wms_unit、wms_order_type、wms_comtype |
单位/订单类型/企业类型 |
二、核心流程表设计(面试重点)
1. 入库流程(三张核心表)
入库流程链路:
wms_order_header→wms_order_line→wms_audit_in→wms_stock_in
入库单主表 wms_order_header
CREATE TABLE wms_order_header (
id varchar(36) NOT NULL,
order_num varchar(32) DEFAULT NULL COMMENT ‘单号’,
order_type_code varchar(32) DEFAULT NULL COMMENT ‘订单类型’,
order_status varchar(32) DEFAULT NULL COMMENT ‘单据状态’,
cus_code text COMMENT ‘客户编码’,
sup_code varchar(45) DEFAULT NULL COMMENT ‘供应商编码’,
arrival_date datetime DEFAULT NULL COMMENT ‘预计到货时间’,
car_driver varchar(32) DEFAULT NULL COMMENT ‘司机’
) COMMENT=‘入库单主表’;
text
入库单子表 wms_order_line
CREATE TABLE wms_order_line (
id varchar(36) NOT NULL,
order_num varchar(36) DEFAULT NULL COMMENT ‘到货通知单号’,
goods_code varchar(255) DEFAULT NULL COMMENT ‘物料编码’,
goods_count varchar(32) DEFAULT NULL COMMENT ‘采购原始数量’,
goods_dj_count varchar(32) DEFAULT NULL COMMENT ‘实际收货登记数量’,
goods_ys_count varchar(255) DEFAULT NULL COMMENT ‘此次验收数量’,
line_status varchar(45) DEFAULT NULL COMMENT ‘行项目状态’,
goods_pro_date datetime DEFAULT NULL COMMENT ‘生产日期’,
goods_batch varchar(32) DEFAULT NULL COMMENT ‘批次’,
kw_plan_code varchar(128) DEFAULT NULL COMMENT ‘计划库位’,
bin_code varchar(255) DEFAULT NULL COMMENT ‘箱子编码’,
tray_code varchar(45) DEFAULT NULL COMMENT ‘托盘编码’
) COMMENT=‘入库单子表’;
text
待上架表 wms_audit_in
CREATE TABLE wms_audit_in (
id varchar(36) NOT NULL,
order_num varchar(36) DEFAULT NULL COMMENT ‘到货通知单’,
goods_code varchar(36) DEFAULT NULL COMMENT ‘商品编码’,
audit_count varchar(32) DEFAULT NULL COMMENT ‘验收数量’,
shelf_dj_count varchar(255) DEFAULT NULL COMMENT ‘上架数量’,
shelf_sy_count varchar(32) DEFAULT NULL COMMENT ‘上架剩余数量’,
quality_lever varchar(255) DEFAULT NULL COMMENT ‘物料质量(不良品,良品等)’,
kw_code varchar(32) DEFAULT NULL COMMENT ‘仓位’,
shelf_status varchar(32) DEFAULT NULL COMMENT ‘是否已上架’,
bin_code varchar(255) DEFAULT NULL COMMENT ‘箱子编码’,
tray_code varchar(32) DEFAULT NULL COMMENT ‘托盘编码’,
goods_batch varchar(32) DEFAULT NULL COMMENT ‘批次’,
goods_pro_date varchar(32) DEFAULT NULL COMMENT ‘生产日期’
) COMMENT=‘待上架表’;
text
已上架表 wms_stock_in
CREATE TABLE wms_stock_in (
id varchar(36) NOT NULL,
goods_code varchar(36) DEFAULT NULL COMMENT ‘商品编码’,
shelf_dj_count varchar(32) DEFAULT NULL COMMENT ‘数量’,
order_num varchar(36) DEFAULT NULL COMMENT ‘原始单据编码’,
audit_id varchar(36) DEFAULT NULL COMMENT ‘待上架ID’,
kw_code varchar(32) DEFAULT NULL COMMENT ‘库位编码’,
bin_code varchar(255) DEFAULT NULL COMMENT ‘箱码’,
tray_code varchar(32) DEFAULT NULL COMMENT ‘托盘码’,
goods_batch varchar(32) DEFAULT NULL COMMENT ‘批次’,
goods_pro_date varchar(32) DEFAULT NULL COMMENT ‘生产日期’,
qc_mark varchar(255) DEFAULT NULL COMMENT ‘质检标识’
) COMMENT=‘已上架表’;
text
2. 出库流程(三张核心表)
出库流程链路:
wms_out_order_header→wms_out_order_line→wms_audit_out→wms_stock_out
出库单主表 wms_out_order_header
CREATE TABLE wms_out_order_header (
id varchar(36) NOT NULL,
order_num varchar(32) DEFAULT NULL COMMENT ‘出货单号’,
order_type_code varchar(45) DEFAULT NULL COMMENT ‘订单类型’,
order_status varchar(32) DEFAULT NULL COMMENT ‘状态’,
cus_code text COMMENT ‘客户’,
receive_date datetime DEFAULT NULL COMMENT ‘要求交货时间’,
receiver_code varchar(32) DEFAULT NULL COMMENT ‘收货人’,
plat_code varchar(32) DEFAULT NULL COMMENT ‘发货月台’
) COMMENT=‘出库单主表’;
text
出库单子表 wms_out_order_line
CREATE TABLE wms_out_order_line (
id varchar(36) NOT NULL,
order_num varchar(36) DEFAULT NULL COMMENT ‘出货通知ID’,
goods_code varchar(36) DEFAULT NULL COMMENT ‘出货商品’,
goods_qua varchar(32) DEFAULT NULL COMMENT ‘预计出货数量’,
goods_ok_qua varchar(32) DEFAULT NULL COMMENT ‘已出货数量’,
goods_sy_qua varchar(32) DEFAULT NULL COMMENT ‘剩余出货数量’,
order_line_status varchar(45) DEFAULT NULL COMMENT ‘状态’,
out_of_stock varchar(255) DEFAULT NULL COMMENT ‘缺货标识’,
out_of_stock_num varchar(255) DEFAULT NULL COMMENT ‘缺少多少数量’
) COMMENT=‘出库单子表’;
text
待下架表 wms_audit_out
CREATE TABLE wms_audit_out (
id varchar(36) NOT NULL,
order_num varchar(36) DEFAULT NULL COMMENT ‘单号’,
goods_code varchar(36) DEFAULT NULL COMMENT ‘商品编码’,
goods_qua varchar(32) DEFAULT NULL COMMENT ‘确认数量’,
shelf_ok_qua varchar(32) DEFAULT NULL COMMENT ‘已下架数量’,
shelf_sy_qua varchar(32) DEFAULT NULL COMMENT ‘待下架数量’,
kw_code varchar(32) DEFAULT NULL COMMENT ‘仓位’,
order_status varchar(32) DEFAULT NULL COMMENT ‘是否已下架’,
wave_code varchar(45) DEFAULT NULL COMMENT ‘波次号’,
out_stock_qua varchar(255) DEFAULT NULL COMMENT ‘缺货数量’
) COMMENT=‘待下架表’;
text
已下架表 wms_stock_out
CREATE TABLE wms_stock_out (
id varchar(36) NOT NULL,
goods_code varchar(36) DEFAULT NULL COMMENT ‘商品编码’,
goods_qua varchar(32) DEFAULT NULL COMMENT ‘预计出货数量’,
audit_id varchar(36) DEFAULT NULL COMMENT ‘待下架ID’,
down_status varchar(32) DEFAULT NULL COMMENT ‘状态’,
confirm_date datetime DEFAULT NULL COMMENT ‘确认时间’,
kw_code varchar(32) DEFAULT NULL COMMENT ‘库位编码’
) COMMENT=‘已下架表’;
text
3. 即时库存表(核心中的核心)
即时库存表 wms_inventory
CREATE TABLE wms_inventory (
id varchar(36) NOT NULL,
goods_code varchar(36) DEFAULT NULL COMMENT ‘商品编码’,
goods_name varchar(145) DEFAULT NULL COMMENT ‘物料名称’,
base_count varchar(32) DEFAULT NULL COMMENT ‘数量’,
goods_batch varchar(32) DEFAULT NULL COMMENT ‘批次’,
goods_pro_date varchar(32) DEFAULT NULL COMMENT ‘生产日期’,
kw_code varchar(32) DEFAULT NULL COMMENT ‘库位编码’,
bin_code varchar(255) DEFAULT NULL COMMENT ‘箱码’,
tray_code varchar(32) DEFAULT NULL COMMENT ‘托盘码’,
cus_code varchar(32) DEFAULT NULL COMMENT ‘客户编码’,
order_type_code varchar(36) DEFAULT NULL COMMENT ‘原始单据类型’,
qc_mark varchar(255) DEFAULT NULL COMMENT ‘质检标识’
) COMMENT=‘即时库存’;
text
库存维度说明:
| 维度 | 字段 | 作用 |
|---|---|---|
| 物料 | goods_code |
唯一标识商品 |
| 批次 | goods_batch |
支持先进先出 |
| 库位 | kw_code |
精确到货架位置 |
| 箱码 | bin_code |
最小管理单元 |
| 托盘 | tray_code |
批量移动 |
| 货主 | cus_code |
支持多货主隔离 |
| 质检状态 | qc_mark |
良品/不良品分离 |
4. 盘点表
盘点单 wms_stock_take
CREATE TABLE wms_stock_take (
id varchar(36) NOT NULL,
goods_code varchar(36) DEFAULT NULL COMMENT ‘物料编码’,
base_count varchar(32) DEFAULT NULL COMMENT ‘库存数量’,
take_qua varchar(32) DEFAULT NULL COMMENT ‘盘点数量’,
take_cy_qua varchar(32) DEFAULT NULL COMMENT ‘差异数量’,
take_status varchar(32) DEFAULT NULL COMMENT ‘盘点状态’,
take_num varchar(32) DEFAULT NULL COMMENT ‘盘点单号’,
kw_code varchar(32) DEFAULT NULL COMMENT ‘库位编码’,
inventory_id varchar(255) DEFAULT NULL COMMENT ‘库存id’
) COMMENT=‘盘点单’;
text
盘点流程:
创建盘点单 → 录入实盘数量 → 系统计算差异 → 审批通过后调整库存
5. 库位表
库位表 wms_kw
CREATE TABLE wms_kw (
id varchar(36) NOT NULL,
ware_code varchar(50) DEFAULT NULL COMMENT ‘仓库代码’,
area_code varchar(32) DEFAULT NULL COMMENT ‘库区编码’,
kw_code varchar(50) DEFAULT NULL COMMENT ‘库位编码’,
kw_name varchar(200) DEFAULT NULL COMMENT ‘库位名称’,
kw_type_code varchar(255) DEFAULT NULL COMMENT ‘库位类型编码’,
kw_status varchar(255) DEFAULT NULL COMMENT ‘库位状态’,
max_stock varchar(50) DEFAULT NULL COMMENT ‘最大库存量’,
length int(32) DEFAULT NULL COMMENT ‘长度’,
width int(32) DEFAULT NULL COMMENT ‘宽度’,
heigh int(32) DEFAULT NULL COMMENT ‘高度’
) COMMENT=‘库位表’;
text
三、核心SQL与业务实现
1. 上架:待上架 → 已上架 → 增加库存
– 开启事务
START TRANSACTION;
– 1. 更新待上架表(减少剩余数量)
UPDATE wms_audit_in
SET shelf_sy_count = shelf_sy_count - #{qty},
shelf_dj_count = shelf_dj_count + #{qty},
shelf_status = CASE WHEN shelf_sy_count - #{qty} = 0 THEN ‘已上架’ ELSE ‘部分上架’ END
WHERE id = #{auditId} AND shelf_sy_count >= #{qty};
– 2. 插入已上架记录
INSERT INTO wms_stock_in (id, goods_code, shelf_dj_count, order_num, audit_id, kw_code, bin_code, tray_code, goods_batch, goods_pro_date, qc_mark)
VALUES (…, #{qty}, …);
– 3. 增加或更新即时库存
INSERT INTO wms_inventory (id, goods_code, base_count, goods_batch, goods_pro_date, kw_code, bin_code, tray_code, cus_code, qc_mark)
VALUES (…, #{qty}, …)
ON DUPLICATE KEY UPDATE base_count = base_count + #{qty};
COMMIT;
text
2. 下架:待下架 → 已下架 → 扣减库存
– 开启事务
START TRANSACTION;
– 1. 更新待下架表
UPDATE wms_audit_out
SET shelf_ok_qua = shelf_ok_qua + #{qty},
shelf_sy_qua = shelf_sy_qua - #{qty},
order_status = CASE WHEN shelf_sy_qua - #{qty} = 0 THEN ‘已下架’ ELSE ‘部分下架’ END
WHERE id = #{auditId} AND shelf_sy_qua >= #{qty};
– 2. 插入已下架记录
INSERT INTO wms_stock_out (id, goods_code, goods_qua, audit_id, kw_code, down_status, confirm_date)
VALUES (…, #{qty}, …, ‘已下架’, NOW());
– 3. 扣减即时库存
UPDATE wms_inventory
SET base_count = base_count - #{qty}
WHERE id = #{inventoryId} AND base_count >= #{qty};
– 检查是否扣减成功
SELECT ROW_COUNT() INTO @affected;
IF @affected = 0 THEN
ROLLBACK;
SIGNAL SQLSTATE ‘45000’ SET MESSAGE_TEXT = ‘库存不足’;
END IF;
COMMIT;
text
3. 查询可用库存(先进先出)
– 按物料+货主查询所有库位的库存,按生产日期排序
SELECT
id,
goods_code,
kw_code,
base_count,
goods_batch,
goods_pro_date,
bin_code,
tray_code
FROM wms_inventory
WHERE goods_code = #{goodsCode}
AND cus_code = #{cusCode}
AND base_count > 0
AND qc_mark = ‘良品’
ORDER BY goods_pro_date ASC
FOR UPDATE;
text
四、面试常见追问(附解答)
| 问题 | 解答 |
|---|---|
| 一个入库单可以分多次上架吗? | 可以。wms_audit_in 中的 shelf_sy_count 记录剩余数量,支持多次上架直到为0 |
| 一个出库单可以分多次下架吗? | 可以。wms_audit_out 中的 shelf_sy_qua 记录待下架数量,支持分批出库 |
| 如何防止库存扣成负数? | 在UPDATE时加上 base_count >= #{qty} 条件,检查 ROW_COUNT(),为0则回滚 |
| 批次/保质期如何管理? | goods_batch 和 goods_pro_date 字段,出库时按生产日期排序实现先进先出 |
| 缺货怎么处理? | wms_out_order_line 中有 out_of_stock 和 out_of_stock_num 字段,标识缺货数量和原因 |
| 质检不合格的货怎么办? | qc_mark 标记为"不良品",入库到不良品库区,不出库或单独处理 |
| 如何追溯库存变更? | 有 wms_stock_in_change 表记录库位/箱码/托盘的变更历史 |
| 多租户如何隔离? | 所有表都有 tenant_id,查询时加上 AND tenant_id = #{tenantId} |
五、设计亮点总结
| 亮点 | 说明 |
|---|---|
| 流程完整 | 入库:到货→待上架→已上架;出库:出库单→待下架→已下架 |
| 精细化管理 | 支持按物料+批次+库位+箱码+托盘+货主+质检状态管理库存 |
| 分批操作 | 支持一个单多次上架/下架,剩余数量字段是关键 |
| 缺货处理 | 出库时记录缺货数量和原因,便于补货 |
| 变更追溯 | 库位/箱码/托盘变更都有记录 |
| 多租户 | 所有表都有 tenant_id 和 del_flag,支持SaaS和软删除 |
| 库位管理 | 支持仓库→库区→库位三级结构,可设置库位容量和尺寸 |
六、下篇预告
下一篇:WMS仓储系统(三)—— 库存扣减的并发控制(面试必问)
- 高并发下如何防止超卖
- 乐观锁 vs 悲观锁 vs 分布式锁
- 基于本项目的库存扣减代码实现(Java)
- Redis分布式锁完整代码
快速上手与项目地址(再次附上)
快速上手(3分钟跑起来)
- 克隆代码:
git clone https://gitee.com/jeeslee/wms.git - 导入MySQL脚本:
docs/sql/wms.sql - 修改
application.yml中的数据库连接 - 启动Spring Boot应用:
mvn spring-boot:run
项目地址
⭐ Gitee:https://gitee.com/jeeslee/wms
⭐ GitHub:https://gitee.com/li_tongs/jeecgboot-vue3
如果对你有帮助,欢迎点个Star支持一下,这是我持续更新的动力!
📚 上一篇:我开源了一套WMS仓储系统,附完整业务设计思路(Java学习者实战项目)
这个项目的真实业务表设计完全可以写在简历的“项目亮点”中。欢迎Star跟踪更新,下一期会手写完整并发控制代码。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐

所有评论(0)