引言
在上一篇《WMS系统全景图》中,我们从宏观层面理解了WMS的定义、核心功能和业务流程。本文将深入微观层面,系统性地学习WMS领域的核心概念、数据模型设计、库位编码规则和库存状态流转。掌握这些基础术语和数据结构,是设计和实施WMS系统的基石。
1. 核心概念
1.1 仓库层级结构
现代仓库采用层级化管理,从宏观到微观分为多个层级:
Warehouse(仓库)
└─ Zone(库区)
└─ Aisle(巷道/排)
└─ Shelf(货架/列)
└─ Bin(库位/层)
详细说明:
1. Warehouse(仓库)
- 定义:独立的物理仓储建筑
- 示例:
- 京东北京亚洲一号仓库
- 亚马逊上海FBA仓库
- 菜鸟广州智能仓库
- 属性:
- 仓库编码:WH001、WH002
- 仓库名称:北京仓、上海仓
- 仓库地址:北京市通州区XX路XX号
- 仓库类型:常温仓、冷链仓、保税仓
2. Zone(库区)
- 定义:仓库内的功能分区
- 分类:
- 按功能分:收货区、质检区、存储区、拣货区、打包区、发货区
- 按温度分:常温区、冷藏区(0-4℃)、冷冻区(-18℃以下)
- 按商品属性分:高价值区、普通区、退货区、不良品区
- 示例:
- A区:电子产品存储区
- B区:日用品存储区
- C区:食品冷藏区
- D区:退货隔离区
3. Aisle(巷道/排)
- 定义:库区内的货架排列行
- 编码:A01、A02、A03…(A区第1排、第2排、第3排)
- 设计原则:
- 巷道宽度:叉车通行需2.5-3米
- 人工拣货巷道:1.2-1.5米
- 单向 vs 双向:根据仓库布局
4. Shelf(货架/列)
- 定义:巷道内的货架列
- 编码:A01-02(A区第1排第2列)
- 货架类型:
- 重型货架:存储托盘货物
- 中型货架:存储箱装货物
- 轻型货架:存储小件商品
- 自动化货架:配合穿梭车、堆垛机
5. Bin(库位/层)
- 定义:货架上的最小存储单元
- 编码:A01-02-03(A区第1排第2列第3层)
- 属性:
- 库位尺寸:长×宽×高(米)
- 承重能力:最大载重(公斤)
- 库位状态:可用、占用、锁定、维护
- 温湿度要求:常温、冷藏、冷冻
实际案例:亚马逊FBA仓库
仓库: SHG1(上海仓库1号)
库区: A区(电子产品)、B区(日用品)、C区(图书)
库位示例: A-05-12-03
└─ A: A区(电子产品)
└─ 05: 第5排
└─ 12: 第12列
└─ 03: 第3层
1.2 SKU、批次、序列号
1. SKU(Stock Keeping Unit,库存单位)
- 定义:商品管理的最小单位,唯一标识一种商品
- 组成:品牌+型号+规格+颜色+尺寸
- 示例:
- SKU: iPhone-15Pro-256GB-Black
- SKU: Nike-AirMax-270-White-US10
- SKU: Coca-Cola-330ml-24cans
SKU设计原则:
- 唯一性:一个SKU对应一种商品,不能重复
- 可读性:尽量包含商品关键信息
- 扩展性:预留编码空间,方便新增商品
SKU编码规范(示例):
品牌(2位) + 品类(2位) + 系列(3位) + 规格(3位) + 颜色(2位)
示例: AP-01-001-256-01
└─ AP: Apple(苹果)
└─ 01: 手机
└─ 001: iPhone 15 Pro系列
└─ 256: 256GB
└─ 01: 黑色
2. Batch(批次)
- 定义:同一时间生产或采购的一批商品
- 作用:
- 质量追溯:出现质量问题时,快速定位批次
- 保质期管理:先进先出(FIFO),优先出库早批次
- 库存分层:同一SKU的不同批次分开存储
- 批次号组成:
- 生产日期:20251120
- 供应商编码:SUP001
- 批次流水号:001
- 完整批次号:20251120-SUP001-001
示例:
SKU: 伊利纯牛奶250ml
批次1: 20251101(生产日期2025-11-01,保质期6个月)
批次2: 20251115(生产日期2025-11-15,保质期6个月)
出库策略: 先进先出,优先出库批次1
3. Serial Number(序列号)
- 定义:唯一标识单个商品的编号
- 适用场景:高价值、需追溯的商品
- 示例:
- 手机IMEI号:354891234567890
- 笔记本电脑SN:NB123456789
- 汽车VIN码:LVSHCAMB1CE012345
SKU vs 批次 vs 序列号:
| 维度 | SKU | 批次 | 序列号 |
|---|---|---|---|
| 粒度 | 商品类别 | 一批商品 | 单个商品 |
| 唯一性 | 商品唯一 | 批次唯一 | 商品唯一 |
| 数量 | 1个SKU = N批次 | 1批次 = N个商品 | 1序列号 = 1商品 |
| 应用 | 库存管理 | 质量追溯 | 防伪追溯 |
| 示例 | iPhone 15 Pro | 20251120 | IMEI: 354891… |
1.3 库存单位 vs 存储单位
1. Inventory Unit(库存单位)
- 定义:库存管理的计量单位
- 常见单位:件、箱、托盘、吨、升
- 示例:
- 可口可乐:以「箱」为单位(1箱=24罐)
- 大米:以「吨」为单位
- 手机:以「件」为单位
2. Storage Unit(存储单位)
- 定义:实际存储的物理单位
- 层级关系:
Pallet(托盘) └─ Carton(箱) └─ Piece(件)
3. 单位换算
- 案例:可口可乐330ml
1 托盘 = 40 箱 1 箱 = 24 罐 1 托盘 = 40 × 24 = 960 罐
WMS中的单位管理:
-- 商品基础信息表
CREATE TABLE sku (
sku_code VARCHAR(50) PRIMARY KEY,
sku_name VARCHAR(200),
base_unit VARCHAR(20), -- 基础单位:件、罐、瓶
carton_qty INT, -- 1箱=24罐
pallet_qty INT, -- 1托盘=40箱=960罐
...
);
-- 库存表(以基础单位存储)
CREATE TABLE inventory (
sku_code VARCHAR(50),
location_code VARCHAR(50),
qty INT, -- 数量(以基础单位计)
unit VARCHAR(20), -- 单位:件
...
);
单位换算逻辑:
// 查询库存:用户想知道有多少托盘
int baseQty = 960; // 基础库存:960罐
int palletQty = baseQty / (40 * 24); // 托盘数 = 960 / 960 = 1托盘
// 入库:供应商送货40箱
int cartonQty = 40; // 40箱
int baseQty = cartonQty * 24; // 基础库存 = 40 * 24 = 960罐
1.4 托盘、箱、件
1. Pallet(托盘)
- 定义:承载货物的平台,便于叉车搬运
- 标准尺寸:
- 国际标准:1200mm × 1000mm
- 欧洲标准:1200mm × 800mm
- 日本标准:1100mm × 1100mm
- 材质:
- 木托盘:成本低,但需熏蒸(跨境贸易)
- 塑料托盘:耐用、防水、可循环
- 金属托盘:承重大,适用于重型货物
- 托盘管理:
- 托盘编码:PLT001、PLT002…
- 托盘循环:租赁 vs 购买
- 托盘追踪:RFID标签
2. Carton(箱)
- 定义:包装商品的纸箱或塑料箱
- 规格:
- 小号:30cm × 20cm × 15cm
- 中号:40cm × 30cm × 25cm
- 大号:60cm × 40cm × 40cm
- 箱码管理:
- 箱码条码:识别箱内商品
- 箱内清单:SKU + 数量
3. Piece(件)
- 定义:单个商品
- 示例:1部手机、1瓶矿泉水、1本书
层级关系示例:
1 托盘可口可乐
├─ 箱1:24罐(生产日期2025-11-01)
├─ 箱2:24罐(生产日期2025-11-01)
├─ ...
└─ 箱40:24罐(生产日期2025-11-01)
总计: 1托盘 = 40箱 = 960罐
2. 数据模型设计
2.1 仓库层级结构数据模型
表结构设计:
-- 1. 仓库表
CREATE TABLE warehouse (
warehouse_code VARCHAR(20) PRIMARY KEY,
warehouse_name VARCHAR(100),
address VARCHAR(200),
warehouse_type VARCHAR(20), -- 常温仓、冷链仓、保税仓
status VARCHAR(20), -- 运营中、维护中、停用
created_at TIMESTAMP,
updated_at TIMESTAMP
);
-- 2. 库区表
CREATE TABLE zone (
zone_code VARCHAR(20) PRIMARY KEY,
warehouse_code VARCHAR(20),
zone_name VARCHAR(100),
zone_type VARCHAR(20), -- 存储区、拣货区、打包区
temperature_min DECIMAL(5,2), -- 最低温度
temperature_max DECIMAL(5,2), -- 最高温度
FOREIGN KEY (warehouse_code) REFERENCES warehouse(warehouse_code)
);
-- 3. 库位表
CREATE TABLE location (
location_code VARCHAR(50) PRIMARY KEY,
warehouse_code VARCHAR(20),
zone_code VARCHAR(20),
aisle VARCHAR(10), -- 排:01、02、03
shelf VARCHAR(10), -- 列:01、02、03
bin VARCHAR(10), -- 层:01、02、03
location_type VARCHAR(20), -- 普通库位、临时库位、质检库位
length DECIMAL(8,2), -- 长度(米)
width DECIMAL(8,2), -- 宽度(米)
height DECIMAL(8,2), -- 高度(米)
max_weight DECIMAL(10,2), -- 最大承重(公斤)
status VARCHAR(20), -- 可用、占用、锁定、维护
created_at TIMESTAMP,
updated_at TIMESTAMP,
FOREIGN KEY (warehouse_code) REFERENCES warehouse(warehouse_code),
FOREIGN KEY (zone_code) REFERENCES zone(zone_code)
);
索引设计:
-- 加快库位查询速度
CREATE INDEX idx_location_warehouse ON location(warehouse_code);
CREATE INDEX idx_location_zone ON location(zone_code);
CREATE INDEX idx_location_status ON location(status);
CREATE INDEX idx_location_code ON location(location_code);
2.2 库存数据模型
库存的三个维度:
- 可用库存(Available Inventory):可以用于销售的库存
- 锁定库存(Locked Inventory):已分配订单但未出库的库存
- 在途库存(In-Transit Inventory):正在调拨途中的库存
库存关系:
总库存 = 可用库存 + 锁定库存 + 在途库存
可用库存 = 总库存 - 锁定库存 - 在途库存
表结构设计:
-- 库存表
CREATE TABLE inventory (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
sku_code VARCHAR(50),
warehouse_code VARCHAR(20),
location_code VARCHAR(50),
batch_no VARCHAR(50), -- 批次号
qty INT, -- 数量
locked_qty INT DEFAULT 0, -- 锁定数量
available_qty INT, -- 可用数量 = qty - locked_qty
unit VARCHAR(20), -- 单位
production_date DATE, -- 生产日期
expiry_date DATE, -- 过期日期
status VARCHAR(20), -- 正常、待检、不良、冻结
created_at TIMESTAMP,
updated_at TIMESTAMP,
INDEX idx_sku (sku_code),
INDEX idx_location (location_code),
INDEX idx_batch (batch_no)
);
-- 库存操作日志表(审计追踪)
CREATE TABLE inventory_log (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
sku_code VARCHAR(50),
warehouse_code VARCHAR(20),
location_code VARCHAR(50),
batch_no VARCHAR(50),
operation_type VARCHAR(20), -- 入库、出库、调拨、盘点
qty_before INT, -- 操作前数量
qty_after INT, -- 操作后数量
qty_change INT, -- 变化数量
operator VARCHAR(50),
remark VARCHAR(200),
created_at TIMESTAMP,
INDEX idx_sku (sku_code),
INDEX idx_operation (operation_type),
INDEX idx_created_at (created_at)
);
库存扣减逻辑(并发安全):
-- 悲观锁:FOR UPDATE
BEGIN;
SELECT qty, locked_qty
FROM inventory
WHERE sku_code = 'iPhone-15Pro-256GB-Black'
AND location_code = 'A01-02-03'
FOR UPDATE;
-- 锁定库存
UPDATE inventory
SET locked_qty = locked_qty + 1,
available_qty = available_qty - 1
WHERE sku_code = 'iPhone-15Pro-256GB-Black'
AND location_code = 'A01-02-03'
AND available_qty >= 1; -- 防止超卖
COMMIT;
2.3 单据数据模型
WMS中的核心单据包括:入库单、出库单、调拨单、盘点单
1. 入库单
-- 入库单主表
CREATE TABLE inbound_order (
order_no VARCHAR(50) PRIMARY KEY,
warehouse_code VARCHAR(20),
order_type VARCHAR(20), -- 采购入库、退货入库、调拨入库
supplier_code VARCHAR(50),
expect_arrival_date DATE, -- 预计到货日期
status VARCHAR(20), -- 待收货、收货中、已完成、已取消
created_at TIMESTAMP,
updated_at TIMESTAMP
);
-- 入库单明细表
CREATE TABLE inbound_order_detail (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
order_no VARCHAR(50),
sku_code VARCHAR(50),
batch_no VARCHAR(50),
expect_qty INT, -- 预期数量
received_qty INT DEFAULT 0, -- 实收数量
location_code VARCHAR(50), -- 上架库位
status VARCHAR(20), -- 待收货、已收货、已上架
FOREIGN KEY (order_no) REFERENCES inbound_order(order_no)
);
2. 出库单
-- 出库单主表
CREATE TABLE outbound_order (
order_no VARCHAR(50) PRIMARY KEY,
warehouse_code VARCHAR(20),
order_type VARCHAR(20), -- 销售出库、调拨出库
customer_code VARCHAR(50),
priority INT DEFAULT 0, -- 优先级(VIP订单)
expect_ship_date DATE, -- 预计发货日期
status VARCHAR(20), -- 待拣货、拣货中、已复核、已发货
created_at TIMESTAMP,
updated_at TIMESTAMP
);
-- 出库单明细表
CREATE TABLE outbound_order_detail (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
order_no VARCHAR(50),
sku_code VARCHAR(50),
batch_no VARCHAR(50),
location_code VARCHAR(50), -- 拣货库位
order_qty INT, -- 订单数量
picked_qty INT DEFAULT 0, -- 已拣数量
status VARCHAR(20), -- 待拣货、已拣货、已复核
FOREIGN KEY (order_no) REFERENCES outbound_order(order_no)
);
3. 库位编码规则
3.1 常见编码方式
1. 数字编码
库位: 010203
└─ 01: 第1排
└─ 02: 第2列
└─ 03: 第3层
优点: 简洁、易输入
缺点: 可读性差,不知道库区
2. 字母+数字编码
库位: A-01-02-03
└─ A: A区
└─ 01: 第1排
└─ 02: 第2列
└─ 03: 第3层
优点: 可读性好,直观
缺点: 编码较长
3. 混合编码(推荐)
库位: A010203
└─ A: A区(字母)
└─ 01: 第1排(数字)
└─ 02: 第2列(数字)
└─ 03: 第3层(数字)
优点: 兼顾简洁性和可读性
缺点: 需要解析规则
3.2 库位编码设计原则
1. 唯一性
- 每个库位编码全局唯一
- 跨仓库、跨库区不重复
2. 可扩展性
- 预留编码空间,支持新增库位
- 示例:01-99(支持99排)
3. 易识别性
- 前缀区分库区(A、B、C)
- 数字区分排、列、层
4. 顺序性
- 编码顺序与物理位置一致
- 方便拣货路径优化
5. 容错性
- 避免易混淆字符(O vs 0, I vs 1)
- 使用校验位(可选)
3.3 案例:亚马逊FBA的库位编码
亚马逊FBA使用混合编码:
库位编码: FC-SHG1-A-05-12-03
解析:
└─ FC: Fulfillment Center(运营中心)
└─ SHG1: 上海仓库1号
└─ A: A区
└─ 05: 第5排
└─ 12: 第12列
└─ 03: 第3层
特点:
- 包含仓库编码:支持全球多仓管理
- 包含库区编码:区分不同功能区
- 层级清晰:便于系统解析和人工识别
4. 库存状态流转
4.1 库存状态定义
1. 正常库存(Normal)
- 已上架、质检合格、可销售
2. 质检库存(QC)
- 待质检、暂不可用
3. 冻结库存(Frozen)
- 质量问题、法律纠纷、暂不可销售
4. 不良库存(Defective)
- 质检不合格、破损、待退货
5. 在途库存(In-Transit)
- 调拨中、尚未到达目标仓库
4.2 库存状态机设计
入库收货
↓
┌─────────┐
│ 质检库存 │
└─────────┘
↓
质检合格?
/ \
Yes No
↓ ↓
┌─────────┐ ┌─────────┐
│ 正常库存 │ │ 不良库存 │
└─────────┘ └─────────┘
↓ ↓
可销售 退货/报废
↓
订单分配
↓
┌─────────┐
│ 锁定库存 │
└─────────┘
↓
出库发货
↓
库存减少
状态流转规则:
-- 入库:质检库存
INSERT INTO inventory (sku_code, qty, status)
VALUES ('iPhone-15Pro', 100, 'QC');
-- 质检合格:质检库存 → 正常库存
UPDATE inventory
SET status = 'Normal'
WHERE sku_code = 'iPhone-15Pro' AND status = 'QC';
-- 质检不合格:质检库存 → 不良库存
UPDATE inventory
SET status = 'Defective'
WHERE sku_code = 'iPhone-15Pro' AND status = 'QC';
-- 订单分配:正常库存 → 锁定库存
UPDATE inventory
SET locked_qty = locked_qty + 1,
available_qty = available_qty - 1
WHERE sku_code = 'iPhone-15Pro' AND status = 'Normal';
-- 出库发货:锁定库存 → 库存减少
UPDATE inventory
SET qty = qty - 1,
locked_qty = locked_qty - 1
WHERE sku_code = 'iPhone-15Pro';
5. 实战案例:设计一个SKU的完整数据链路
场景:可口可乐330ml入库到出库的完整数据流
5.1 SKU定义
INSERT INTO sku (sku_code, sku_name, base_unit, carton_qty, pallet_qty)
VALUES ('COKE-330ML', '可口可乐330ml', '罐', 24, 40);
5.2 ASN预报
INSERT INTO inbound_order (order_no, warehouse_code, order_type, supplier_code)
VALUES ('ASN202511220001', 'WH001', '采购入库', 'SUP-COKE');
INSERT INTO inbound_order_detail (order_no, sku_code, batch_no, expect_qty)
VALUES ('ASN202511220001', 'COKE-330ML', '20251120', 960); -- 1托盘=960罐
5.3 收货入库
-- 更新实收数量
UPDATE inbound_order_detail
SET received_qty = 960, status = '已收货'
WHERE order_no = 'ASN202511220001' AND sku_code = 'COKE-330ML';
-- 创建库存(质检库存)
INSERT INTO inventory (sku_code, warehouse_code, location_code, batch_no, qty, status)
VALUES ('COKE-330ML', 'WH001', 'QC-01', '20251120', 960, 'QC');
5.4 质检上架
-- 质检合格
UPDATE inventory
SET status = 'Normal', location_code = 'A01-02-03'
WHERE sku_code = 'COKE-330ML' AND batch_no = '20251120';
5.5 订单分配
-- 订单需要24罐(1箱)
UPDATE inventory
SET locked_qty = locked_qty + 24,
available_qty = available_qty - 24
WHERE sku_code = 'COKE-330ML' AND location_code = 'A01-02-03';
5.6 拣货出库
-- 扣减库存
UPDATE inventory
SET qty = qty - 24,
locked_qty = locked_qty - 24
WHERE sku_code = 'COKE-330ML' AND location_code = 'A01-02-03';
-- 记录操作日志
INSERT INTO inventory_log (sku_code, location_code, operation_type, qty_before, qty_after, qty_change)
VALUES ('COKE-330ML', 'A01-02-03', '出库', 960, 936, -24);
完整数据流:
ASN预报(960罐) → 收货(960罐,QC) → 质检(960罐,Normal)
→ 订单锁定(24罐) → 拣货出库(936罐剩余)
6. 总结
核心概念回顾:
- 仓库层级:Warehouse → Zone → Aisle → Shelf → Bin
- 商品管理:SKU(类别) → Batch(批次) → Serial Number(序列号)
- 存储单位:Pallet(托盘) → Carton(箱) → Piece(件)
数据模型要点:
- 库位表:支持层级查询、状态管理、属性扩展
- 库存表:区分可用/锁定/在途,支持批次管理
- 单据表:主表+明细表,支持状态流转
库位编码原则:
- 唯一性、可扩展性、易识别性
- 推荐使用混合编码(字母+数字)
- 参考行业标准(亚马逊FBA)
库存状态流转:
- 质检库存 → 正常库存 → 锁定库存 → 出库
- 质检库存 → 不良库存 → 退货/报废
- 正常库存 → 冻结库存 → 解冻/报废
下一篇预告: 在下一篇文章中,我们将深入学习入库管理:从收货到上架的完整流程,包括:
- ASN预报的作用和数据模型
- 收货模式:盲收 vs 对单收货
- 质检流程与差异处理
- 上架策略:随机上架、指定上架、就近上架
- 实战案例:电商仓库的入库流程优化
敬请期待!
参考资料
- 《数据库设计与关系理论》- C.J. Date
- 《仓储管理实务》- 中国物流学会
- Amazon FBA库位编码规范 - https://sell.amazon.com/fba
- 《Supply Chain Management》- Sunil Chopra
关于作者: 专注于跨境电商供应链技术,从业8年,擅长WMS、OMS、TMS系统设计与实施。本系列文章将系统性地分享WMS从入门到精通的知识体系,欢迎关注交流。
版权声明: 本文为原创文章,转载请注明出处。