仓库运营与 WMS
仓库是供应链的物理枢纽——货物在这里收、存、拣、发。WMS 系统的核心价值不是管理软件,而是让每一件货物的位置和状态实时可知。
仓库功能区布局
graph LR
RECEIVE[收货区] --> QC[质检区]
QC --> STORAGE[存储区]
STORAGE --> PICK[拣货区]
PICK --> PACK[打包区]
PACK --> DISPATCH[发货区]
STORAGE --> BULK[散货区\n托盘整板]
STORAGE --> SHELF[货架区\n零散拣货]
STORAGE --> COLD[冷链区\n温控货物]
STORAGE --> DANGER[危险品区\n隔离存放]
RETURN[退货区] --> QC
style STORAGE fill:#e3f2fd,stroke:#1565c0,stroke-width:2px
style PICK fill:#c8e6c9,stroke:#388e3c,stroke-width:2px
WMS 核心功能
"""
WMS 仓库管理系统核心模块
"""
from dataclasses import dataclass, field
from datetime import datetime
@dataclass
class Location:
"""仓位"""
code: str # 如 A-03-05-2(区-排-列-层)
zone: str # A=快速拣货区, B=普通区, C=大件区
capacity: int # 最大托盘数
occupied: int = 0
sku: str = ""
@property
def utilization(self) -> float:
return self.occupied / self.capacity if self.capacity else 0
@property
def is_full(self) -> bool:
return self.occupied >= self.capacity
@dataclass
class StockMovement:
"""库存移动记录"""
timestamp: str
sku: str
qty: int
from_loc: str
to_loc: str
movement_type: str # inbound / outbound / transfer / adjust
class WMS:
"""简化 WMS 系统"""
def __init__(self):
self.locations: dict[str, Location] = {}
self.inventory: dict[str, dict] = {} # sku -> {loc: qty}
self.movements: list[StockMovement] = []
def add_location(self, location: Location):
self.locations[location.code] = location
def receive(self, sku: str, qty: int, loc_code: str) -> dict:
"""入库"""
loc = self.locations.get(loc_code)
if not loc:
return {"success": False, "error": "仓位不存在"}
if loc.is_full:
return {"success": False, "error": "仓位已满"}
# 更新库存
if sku not in self.inventory:
self.inventory[sku] = {}
self.inventory[sku][loc_code] = (
self.inventory[sku].get(loc_code, 0) + qty
)
loc.occupied += 1
loc.sku = sku
self.movements.append(StockMovement(
timestamp=datetime.now().strftime("%Y-%m-%d %H:%M"),
sku=sku, qty=qty,
from_loc="RECEIVE", to_loc=loc_code,
movement_type="inbound",
))
return {"success": True, "sku": sku, "qty": qty, "location": loc_code}
def pick(self, sku: str, qty: int) -> dict:
"""拣货(FEFO 优先)"""
stock = self.inventory.get(sku, {})
if not stock:
return {"success": False, "error": f"{sku} 无库存"}
total_available = sum(stock.values())
if total_available < qty:
return {
"success": False,
"error": f"库存不足,需要 {qty},现有 {total_available}",
}
# 逐位置扣减
pick_plan = []
remaining = qty
for loc, available in sorted(stock.items()):
if remaining <= 0:
break
pick_qty = min(available, remaining)
pick_plan.append({"位置": loc, "拣货量": pick_qty})
remaining -= pick_qty
self.movements.append(StockMovement(
timestamp=datetime.now().strftime("%Y-%m-%d %H:%M"),
sku=sku, qty=qty,
from_loc=str(list(stock.keys())[0]), to_loc="DISPATCH",
movement_type="outbound",
))
return {
"success": True, "sku": sku, "qty": qty,
"拣货路径": pick_plan,
}
def stock_query(self, sku: str = "") -> dict:
"""库存查询"""
if sku:
stock = self.inventory.get(sku, {})
total = sum(stock.values())
return {"SKU": sku, "总库存": total, "分布": stock}
return {
s: sum(locs.values())
for s, locs in self.inventory.items()
}
def location_utilization(self) -> list[dict]:
"""仓位利用率"""
return [
{
"仓位": loc.code,
"区域": loc.zone,
"利用率": f"{loc.utilization*100:.0f}%",
"状态": "满" if loc.is_full else "空" if loc.occupied == 0 else "在用",
}
for loc in self.locations.values()
]
# 演示
wms = WMS()
# 初始化仓位
for i in range(1, 6):
wms.add_location(Location(f"A-01-0{i}-1", "A", 2))
for i in range(1, 4):
wms.add_location(Location(f"B-01-0{i}-1", "B", 5))
# 入库
wms.receive("SKU-A001", 100, "A-01-01-1")
wms.receive("SKU-A001", 200, "A-01-02-1")
wms.receive("SKU-B001", 500, "B-01-01-1")
print("=== 库存查询 ===")
for sku, qty in wms.stock_query().items():
print(f" {sku}: {qty} 件")
print("\n=== 拣货指令 SKU-A001 x 150 ===")
result = wms.pick("SKU-A001", 150)
for k, v in result.items():
print(f" {k}: {v}")
拣货策略对比
| 策略 | 原理 | 适用 | 效率 |
|---|---|---|---|
| 单单拣货 | 每单独立拣货 | 大件/特殊需求 | 低 |
| 批量拣货 | 多单合并路线 | 标准品 | 高 |
| 波次拣货 | 按时间窗口批量触发 | 电商仓高峰 | 高 |
| 区域拣货 | 拣货员负责固定区域 | 大型仓库 | 高 |
| 播种式拣货 | 先拣后分 | 多品种小批量 | 极高 |
仓库 KPI 体系
| KPI | 定义 | 优秀基准 |
|---|---|---|
| 拣货准确率 | 正确拣货次数 / 总拣货次数 | ≥ 99.9% |
| 入库到上架时间 | 收货至系统可用时长 | ≤ 4 小时 |
| 订单处理周期 | 接单至发货完成时长 | ≤ 24 小时 |
| 仓位利用率 | 已用仓位 / 总仓位 | 75–85% |
| 发货准时率 | 准时发货次数 / 总发货次数 | ≥ 98% |
| 损耗率 | 库存损耗金额 / 总库存价值 | ≤ 0.1% |
行动清单
- [ ] 绘制现有仓库平面图,标注各功能区(收货/存储/拣货/发货/退货)
- [ ] 对货品进行 ABC 分类,将 A 类货品移至距发货区最近的快速拣货区
- [ ] 评估现有 WMS 能否支持批量拣货和波次拣货
- [ ] 建立仓位编码规范(区-排-列-层 4 维编码)并录入系统
- [ ] 设置月度拣货准确率和发货准时率 KPI 看板
- [ ] 对仓管员进行 5S 和 FIFO/FEFO 操作规范培训
下一节:03-库存盘点与损耗控制 — 如何保持库存数据准确,控制损耗在合理范围内。