WMS仓储系统(二)—— 核心数据库设计与库存模型(附完整表结构)

接上一篇:我开源了一套WMS仓储系统,附完整业务设计思路(Java学习者实战项目):我们了解了WMS的整体业务流程和技术栈。本文将深入数据库设计,基于真实生产级别的表结构,重点拆解入库流程设计出库流程设计库存模型以及盘点机制


快速上手(3分钟跑起来)

  1. 克隆代码:git clone https://gitee.com/jeeslee/wms.git
  2. 导入MySQL脚本:docs/sql/wms.sql
  3. 修改 application.yml 中的数据库连接
  4. 启动Spring Boot应用:mvn spring-boot:run

项目地址

⭐ Gitee:https://gitee.com/jeeslee/wms

⭐ GitHub:https://gitee.com/li_tongs/jeecgboot-vue3

如果对你有帮助,欢迎点个Star支持一下,这是我持续更新的动力!


一、整体表结构概览

本系统共设计20+张表,核心业务模块如下:

模块 核心表 说明
基础数据 wms_warehousewms_warehouse_areawms_kwwms_kw_type 仓库/库区/库位/库位类型
货主与物料 wms_cuswms_goodswms_goods_typewms_supply 客户/物料/物料类型/供应商
入库模块 wms_order_headerwms_order_linewms_audit_inwms_stock_in 入库单 → 待上架 → 已上架
出库模块 wms_out_order_headerwms_out_order_linewms_audit_outwms_stock_out 出库单 → 待下架 → 已下架
库存模块 wms_inventory 即时库存(核心表)
盘点模块 wms_stock_take 盘点单及差异处理
变更追溯 wms_stock_in_change 库位/箱码/托盘变更记录
月台管理 wms_plat 车辆进出月台管理
辅助信息 wms_unitwms_order_typewms_comtype 单位/订单类型/企业类型

二、核心流程表设计(面试重点)

1. 入库流程(三张核心表)

入库流程链路:wms_order_headerwms_order_linewms_audit_inwms_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_headerwms_out_order_linewms_audit_outwms_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_batchgoods_pro_date 字段,出库时按生产日期排序实现先进先出
缺货怎么处理? wms_out_order_line 中有 out_of_stockout_of_stock_num 字段,标识缺货数量和原因
质检不合格的货怎么办? qc_mark 标记为"不良品",入库到不良品库区,不出库或单独处理
如何追溯库存变更? wms_stock_in_change 表记录库位/箱码/托盘的变更历史
多租户如何隔离? 所有表都有 tenant_id,查询时加上 AND tenant_id = #{tenantId}

五、设计亮点总结

亮点 说明
流程完整 入库:到货→待上架→已上架;出库:出库单→待下架→已下架
精细化管理 支持按物料+批次+库位+箱码+托盘+货主+质检状态管理库存
分批操作 支持一个单多次上架/下架,剩余数量字段是关键
缺货处理 出库时记录缺货数量和原因,便于补货
变更追溯 库位/箱码/托盘变更都有记录
多租户 所有表都有 tenant_iddel_flag,支持SaaS和软删除
库位管理 支持仓库→库区→库位三级结构,可设置库位容量和尺寸

六、下篇预告

下一篇:WMS仓储系统(三)—— 库存扣减的并发控制(面试必问)

  • 高并发下如何防止超卖
  • 乐观锁 vs 悲观锁 vs 分布式锁
  • 基于本项目的库存扣减代码实现(Java)
  • Redis分布式锁完整代码

快速上手与项目地址(再次附上)

快速上手(3分钟跑起来)

  1. 克隆代码:git clone https://gitee.com/jeeslee/wms.git
  2. 导入MySQL脚本:docs/sql/wms.sql
  3. 修改 application.yml 中的数据库连接
  4. 启动Spring Boot应用:mvn spring-boot:run

项目地址

⭐ Gitee:https://gitee.com/jeeslee/wms

⭐ GitHub:https://gitee.com/li_tongs/jeecgboot-vue3

如果对你有帮助,欢迎点个Star支持一下,这是我持续更新的动力!


📚 上一篇我开源了一套WMS仓储系统,附完整业务设计思路(Java学习者实战项目)

这个项目的真实业务表设计完全可以写在简历的“项目亮点”中。欢迎Star跟踪更新,下一期会手写完整并发控制代码。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐