引言

在上一篇《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 Pro20251120IMEI: 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 库存数据模型

库存的三个维度

  1. 可用库存(Available Inventory):可以用于销售的库存
  2. 锁定库存(Locked Inventory):已分配订单但未出库的库存
  3. 在途库存(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. 总结

核心概念回顾

  1. 仓库层级:Warehouse → Zone → Aisle → Shelf → Bin
  2. 商品管理:SKU(类别) → Batch(批次) → Serial Number(序列号)
  3. 存储单位:Pallet(托盘) → Carton(箱) → Piece(件)

数据模型要点

  1. 库位表:支持层级查询、状态管理、属性扩展
  2. 库存表:区分可用/锁定/在途,支持批次管理
  3. 单据表:主表+明细表,支持状态流转

库位编码原则

  1. 唯一性、可扩展性、易识别性
  2. 推荐使用混合编码(字母+数字)
  3. 参考行业标准(亚马逊FBA)

库存状态流转

  1. 质检库存 → 正常库存 → 锁定库存 → 出库
  2. 质检库存 → 不良库存 → 退货/报废
  3. 正常库存 → 冻结库存 → 解冻/报废

下一篇预告: 在下一篇文章中,我们将深入学习入库管理:从收货到上架的完整流程,包括:

  • ASN预报的作用和数据模型
  • 收货模式:盲收 vs 对单收货
  • 质检流程与差异处理
  • 上架策略:随机上架、指定上架、就近上架
  • 实战案例:电商仓库的入库流程优化

敬请期待!


参考资料

  1. 《数据库设计与关系理论》- C.J. Date
  2. 《仓储管理实务》- 中国物流学会
  3. Amazon FBA库位编码规范 - https://sell.amazon.com/fba
  4. 《Supply Chain Management》- Sunil Chopra

关于作者: 专注于跨境电商供应链技术,从业8年,擅长WMS、OMS、TMS系统设计与实施。本系列文章将系统性地分享WMS从入门到精通的知识体系,欢迎关注交流。

版权声明: 本文为原创文章,转载请注明出处。