库存盘点与损耗控制
库存准确率 99% 和 95% 的差距,可能意味着缺货率高 5 倍——盘点不是为了"交差",而是为了让系统数据与物理现实保持一致。
盘点体系设计
graph TD
ANNUAL[年度全盘\n生产停线,全员盘点] --> CYCLE[循环盘点\n每日/每周小范围]
CYCLE --> TRIGGER[触发盘点\n异常时立即盘]
ANNUAL --> |准确率 ≥99.5%| PASS[通过]
ANNUAL --> |准确率 <99.5%| INVESTIGATE[根因分析]
CYCLE --> ABC_FREQ[A类: 每月\nB类: 每季\nC类: 每年]
TRIGGER --> CASES["缺货不合逻辑\n大额出入库后\n系统负库存\n转仓后"]
style CYCLE fill:#e3f2fd,stroke:#1565c0,stroke-width:2px
style TRIGGER fill:#fff3e0,stroke:#e65100,stroke-width:2px
循环盘点调度系统
"""
循环盘点计划生成器
"""
from dataclasses import dataclass
from datetime import date, timedelta
from math import ceil
@dataclass
class SkuProfile:
sku: str
abc_class: str # A / B / C
unit_cost: float
on_hand: int
last_count_date: str = ""
class CycleCountScheduler:
"""循环盘点调度器"""
# 每年盘点频率
COUNT_FREQ = {
"A": 12, # 每月
"B": 4, # 每季
"C": 1, # 每年
}
# 盘点容差(差异率阈值)
TOLERANCE = {
"A": 0.005, # ±0.5%
"B": 0.010, # ±1.0%
"C": 0.020, # ±2.0%
}
def __init__(self, skus: list[SkuProfile]):
self.skus = skus
def generate_monthly_plan(
self, year: int, month: int
) -> list[dict]:
"""生成月度盘点计划"""
plan = []
for sku in self.skus:
freq = self.COUNT_FREQ[sku.abc_class]
# 判断本月是否需要盘点
should_count = True
if sku.abc_class == "B" and month not in [3, 6, 9, 12]:
should_count = False
elif sku.abc_class == "C" and month != 12:
should_count = False
if should_count:
plan.append({
"SKU": sku.sku,
"类别": sku.abc_class,
"系统库存": sku.on_hand,
"库存价值": f"¥{sku.on_hand * sku.unit_cost:,.0f}",
"容差": f"±{self.TOLERANCE[sku.abc_class]*100:.1f}%",
"年盘次数": f"{freq} 次",
})
return sorted(plan, key=lambda x: x["类别"])
def variance_analysis(
self,
sku: SkuProfile,
physical_count: int,
) -> dict:
"""盘点差异分析"""
variance = physical_count - sku.on_hand
variance_rate = abs(variance) / sku.on_hand if sku.on_hand else 1
tolerance = self.TOLERANCE[sku.abc_class]
value_impact = abs(variance) * sku.unit_cost
if variance_rate <= tolerance:
action = "通过 — 差异在容差范围内"
elif variance_rate <= tolerance * 3:
action = "警告 — 需查明原因后调整"
else:
action = "严重 — 立即调查,暂停出库"
return {
"SKU": sku.sku,
"系统库存": sku.on_hand,
"实盘数量": physical_count,
"差异": f"{'+' if variance >= 0 else ''}{variance}",
"差异率": f"{variance_rate*100:.2f}%",
"差异金额": f"¥{value_impact:,.0f}",
"处理建议": action,
}
# 演示
skus = [
SkuProfile("CPU-X100", "A", 350, 1500),
SkuProfile("PCB-001", "A", 45, 2000),
SkuProfile("CABLE-USB", "B", 8, 5000),
SkuProfile("SCREW-M3", "C", 0.05, 200000),
]
scheduler = CycleCountScheduler(skus)
print("=== 本月盘点计划(3月)===")
for item in scheduler.generate_monthly_plan(2024, 3):
print(f" [{item['类别']}] {item['SKU']}: "
f"系统 {item['系统库存']}件,容差 {item['容差']}")
print("\n=== 差异分析 ===")
# 模拟实盘结果
actual = [1480, 2020, 5000, 198000]
for sku, count in zip(skus, actual):
result = scheduler.variance_analysis(sku, count)
print(f"\n {result['SKU']}:")
print(f" 差异: {result['差异']} ({result['差异率']})")
print(f" 金额影响: {result['差异金额']}")
print(f" 建议: {result['处理建议']}")
库存损耗来源与控制
| 损耗类型 | 典型原因 | 控制措施 | 行业参考 |
|---|---|---|---|
| 实物损坏 | 搬运不当、包装破损 | 标准化包装、SOP 培训 | 电商仓 <0.1% |
| 过期报废 | FEFO 未执行 | WMS 强制 FEFO、批次到期预警 | 食品 <0.5% |
| 盗损/丢失 | 内部管理漏洞 | 进出闸口扫码、视频监控 | <0.05% |
| 系统误差 | 人工漏录/多录 | WMS 强制扫码操作 | 接近 0 |
| 自然损耗 | 挥发、重量误差 | 签约时明确自然损耗比例 | 化工 1–3% |
盘点差异根因分析
"""
盘点差异帕累托分析
"""
VARIANCE_CAUSES = {
"入库未扫描即上架": 35, # 出现频率%
"出库漏扫或多扫": 28,
"损坏未及时录系统": 15,
"仓位混放/错放": 12,
"退货未入库录单": 7,
"其他": 3,
}
print("=== 盘点差异根因帕累托 ===")
cumulative = 0
items = sorted(VARIANCE_CAUSES.items(), key=lambda x: x[1], reverse=True)
for cause, pct in items:
cumulative += pct
bar = "█" * (pct // 2)
print(f" {cause:<20} {pct:3}% {bar} [累计 {cumulative}%]")
print("\n前2项根因占", sum(v for _, v in items[:2]), "% — 优先解决扫码规范问题")
行动清单
- [ ] 建立年度全盘计划(通常选年初或春节前后)并通知各部门
- [ ] 按 ABC 分类设定循环盘点频率(A 类每月、B 类每季、C 类每年)
- [ ] 设置差异率阈值:A 类 ±0.5%、B 类 ±1%、C 类 ±2%,超过触发调查
- [ ] 对过去 6 个月盘点差异做帕累托分析,找出 TOP 3 根因并制定对策
- [ ] 在 WMS 中设置批次到期预警(距到期 30 天/60 天提醒)
- [ ] 计算当前库存损耗率,设定年度改善目标(例如从 0.3% 降至 0.15%)
下一章:物流与运输 → — 让货物高效流动的运输网络设计。