供需协同与 CPFR
牛鞭效应的根本原因是信息不透明——CPFR(协同计划、预测与补货)和 VMI(供应商管理库存)通过共享数据,让整条链路同步响应真实需求。
供需协同层次
graph TD
L1["层次1: 信息共享\n最低门槛"] --> L2["层次2: VMI\n供应商管库存"]
L2 --> L3["层次3: CPFR\n联合预测与计划"]
L3 --> L4["层次4: 需求驱动供应链\n消费数据直接触发"]
L1 -.- D1["POS 数据共享\n库存水位共享"]
L2 -.- D2["供应商控制补货\n客户只关注最终销售"]
L3 -.- D3["联合制定需求计划\n共同优化供应策略"]
L4 -.- D4["RFID/IoT 实时感知\nAI 自动触发采购"]
style L3 fill:#e3f2fd,stroke:#1565c0,stroke-width:2px
style L4 fill:#c8e6c9,stroke:#388e3c,stroke-width:2px
VMI 供应商管理库存模拟
"""
VMI 系统模拟
"""
from dataclasses import dataclass
@dataclass
class VMIContract:
"""VMI 合同参数"""
sku: str
min_stock: int # 最低库存线(触发补货)
max_stock: int # 最高库存线(上限)
review_period: int # 检查周期(天)
lead_time: int # 供应商补货前置期(天)
@dataclass
class VMIState:
"""VMI 当前状态"""
current_stock: int
daily_consumption: float
pending_orders: int = 0 # 在途订单量
class VMISystem:
"""VMI 系统"""
def __init__(
self, contract: VMIContract, state: VMIState
):
self.contract = contract
self.state = state
self.orders_placed: list[dict] = []
def daily_review(self, day: int) -> dict:
"""每日库存检视"""
c = self.contract
s = self.state
# 消耗当日库存
actual_consumption = round(s.daily_consumption * (0.9 + 0.2 * (day % 7) / 7))
s.current_stock = max(0, s.current_stock - actual_consumption)
# 预测库存(考虑在途)
projected_stock = s.current_stock + s.pending_orders
# 判断是否需要补货
order_qty = 0
if projected_stock < c.min_stock:
# 补至最高库存线
order_qty = c.max_stock - projected_stock
s.pending_orders += order_qty
self.orders_placed.append({
"天": day,
"补货量": order_qty,
"预计到货": day + c.lead_time,
"触发库存": s.current_stock,
})
return {
"天": day,
"实际消耗": actual_consumption,
"当前库存": s.current_stock,
"在途": s.pending_orders,
"预测库存": projected_stock,
"触发补货": "是" if order_qty > 0 else "否",
"补货量": order_qty,
}
def simulate(self, days: int) -> dict:
"""模拟 N 天运营"""
stockouts = 0
total_orders = 0
for day in range(1, days + 1):
result = self.daily_review(day)
# 在途到货处理
for order in self.orders_placed:
if order["预计到货"] == day:
self.state.current_stock += order["补货量"]
self.state.pending_orders -= order["补货量"]
if result["当前库存"] == 0:
stockouts += 1
if result["触发补货"] == "是":
total_orders += 1
return {
"模拟天数": days,
"缺货天数": stockouts,
"缺货率": f"{stockouts/days*100:.1f}%",
"补货次数": total_orders,
"期末库存": self.state.current_stock,
"平均库存": f"约 {self.contract.min_stock // 2 + self.contract.max_stock // 2} 件",
}
# 演示
contract = VMIContract(
sku="SKU-A001",
min_stock=200,
max_stock=600,
review_period=1,
lead_time=5,
)
state = VMIState(current_stock=400, daily_consumption=30)
vmi = VMISystem(contract, state)
print("=== VMI 30 天模拟 ===")
summary = vmi.simulate(30)
for k, v in summary.items():
print(f" {k}: {v}")
print("\n=== 补货记录 ===")
for order in vmi.orders_placed[:5]:
print(f" 第{order['天']}天: 补货 {order['补货量']} 件(触发库存 {order['触发库存']} 件)")
CPFR 协同步骤
| 步骤 | 参与方 | 活动 | 输出 |
|---|---|---|---|
| 1. 前端协议 | 买卖双方 | 确定协作范围、数据共享规则 | CPFR 合同 |
| 2. 联合业务计划 | 销售+采购 | 共同制定促销、新品、淡旺季计划 | 年度业务计划 |
| 3. 销售预测 | 零售商为主 | 基于 POS 数据生成门店需求预测 | 零售需求预测 |
| 4. 订单预测 | 供应商为主 | 结合生产能力生成补货订单预测 | 订单预测 |
| 5. 例外处理 | 双方协商 | 识别并解决超出容差的差异 | 修订计划 |
| 6. 执行 | 供应商 | 按协同计划生产和配送 | 实物配送 |
VMI vs CPFR 选择指南
| 维度 | VMI | CPFR |
|---|---|---|
| 数据共享深度 | 库存数据 | 销售预测+促销计划 |
| 控制权 | 供应商控制补货决策 | 双方联合决策 |
| 适合关系 | 成熟稳定的供应商 | 战略合作伙伴 |
| 实施复杂度 | 中 | 高 |
| 信任要求 | 中 | 高(需共享敏感数据) |
| 效益 | 库存降低 20–30% | 库存降低 30–50%,服务水平提升 |
行动清单
- [ ] 识别 2–3 个重要供应商或大客户,作为 VMI 或 CPFR 试点
- [ ] 建立数据共享机制:将库存水位和 POS 数据定期推送给试点供应商
- [ ] 明确 VMI 合同参数:最低/最高库存线、补货提前期、盘点频率
- [ ] 设置协同效果 KPI:库存周转提升率、缺货率降低幅度、补货响应时间
- [ ] 评估是否采购 EDI(电子数据交换)或供应商门户,实现数据自动传输
- [ ] 对首批协同数据做 4 周回顾,验证模型假设并校准参数
下一章:供应链可视化 → — 用技术让整条链路透明可见。