库存盘点与损耗控制
High Contrast
Dark Mode
Light Mode
Sepia
Forest
2 min read414 words

库存盘点与损耗控制

库存准确率 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]), "% — 优先解决扫码规范问题")

行动清单

下一章物流与运输 → — 让货物高效流动的运输网络设计。