销售与运营计划 S&OP
High Contrast
Dark Mode
Light Mode
Sepia
Forest
2 min read498 words

销售与运营计划 S&OP

S&OP 是供应链最重要的跨职能协同机制——每月一次,销售、供应链、财务和高管坐在一起,让供需真正平衡。

S&OP 月度流程

graph TD W1["第1周\n数据收集与刷新"] --> W2["第2周\n需求评审"] W2 --> W3["第3周\n供应评审"] W3 --> W4["第4周\n管理层决策会"] W4 --> EXEC["执行计划\n下月开始"] W1 --> D1["历史销售数据\n市场预测\n新品计划"] W2 --> D2["共识需求计划\n机会与风险标注"] W3 --> D3["供应能力评估\n差距分析\n备选方案"] W4 --> D4["最终批准计划\n产能投资决策\n KPI 目标"] style W4 fill:#e3f2fd,stroke:#1565c0,stroke-width:2px style EXEC fill:#c8e6c9,stroke:#388e3c,stroke-width:2px

S&OP 核心计算模型

"""
S&OP 供需平衡分析
"""
from dataclasses import dataclass
@dataclass
class MonthPlan:
month: str
demand_forecast: int    # 需求预测(件)
confirmed_orders: int   # 已确认订单
opening_stock: int      # 期初库存
production_plan: int    # 生产计划
capacity_max: int       # 最大产能
safety_stock_target: int  # 安全库存目标
class SOPAnalyzer:
"""S&OP 供需平衡分析器"""
@staticmethod
def analyze(plan: MonthPlan) -> dict:
"""供需平衡分析"""
# 需求取预测和确认订单的最大值(保守原则)
effective_demand = max(
plan.demand_forecast, plan.confirmed_orders
)
# 期末库存
closing_stock = (
plan.opening_stock
+ plan.production_plan
- effective_demand
)
# 供需差距
gap = plan.production_plan - effective_demand + plan.opening_stock
# 产能利用率
utilization = plan.production_plan / plan.capacity_max
# 库存健康
stock_days = closing_stock / (effective_demand / 30) if effective_demand else 0
return {
"月份": plan.month,
"有效需求": effective_demand,
"生产计划": plan.production_plan,
"期初库存": plan.opening_stock,
"期末库存": closing_stock,
"库存天数": round(stock_days, 1),
"安全库存目标": plan.safety_stock_target,
"产能利用率": f"{utilization*100:.1f}%",
"供需平衡": (
"供不应求 — 需扩产或增库存"
if closing_stock < plan.safety_stock_target
else "库存过高 — 考虑减产"
if closing_stock > plan.safety_stock_target * 3
else "平衡"
),
}
@staticmethod
def rolling_plan(
months: list[MonthPlan],
) -> list[dict]:
"""滚动计划分析"""
results = []
prev_closing = months[0].opening_stock
for i, month in enumerate(months):
month.opening_stock = prev_closing
result = SOPAnalyzer.analyze(month)
prev_closing = month.opening_stock + month.production_plan - max(
month.demand_forecast, month.confirmed_orders
)
results.append(result)
return results
@staticmethod
def gap_scenarios(
demand: int,
current_capacity: int,
options: dict[str, int],
) -> list[dict]:
"""差距填补方案对比"""
gap = demand - current_capacity
if gap <= 0:
return [{"状态": "产能充足,无需调整"}]
scenarios = []
for option, additional_capacity in options.items():
can_fill = min(gap, additional_capacity)
remaining_gap = max(0, gap - additional_capacity)
scenarios.append({
"方案": option,
"新增产能": additional_capacity,
"可填补差距": can_fill,
"剩余缺口": remaining_gap,
"填补率": f"{can_fill/gap*100:.0f}%",
})
return sorted(scenarios, key=lambda x: x["剩余缺口"])
# 演示 — 6 个月滚动 S&OP
monthly_plans = [
MonthPlan("2024-04", 12000, 10500, 3000, 11000, 15000, 2000),
MonthPlan("2024-05", 13500, 12000, 0, 12000, 15000, 2200),  # 旺季来临
MonthPlan("2024-06", 15000, 14200, 0, 13000, 15000, 2500),  # 6月大促
MonthPlan("2024-07", 11000, 9000, 0, 12000, 15000, 2000),   # 旺季结束
MonthPlan("2024-08", 10000, 8500, 0, 10500, 15000, 1800),
MonthPlan("2024-09", 14000, 13000, 0, 13500, 15000, 2300),  # Q3 大促备货
]
print("=== 6 个月滚动 S&OP ===")
for result in SOPAnalyzer.rolling_plan(monthly_plans):
status = result["供需平衡"]
print(f"\n{result['月份']}:")
print(f"  需求: {result['有效需求']:,}  生产: {result['生产计划']:,}  期末库存: {result['期末库存']:,}")
print(f"  库存天数: {result['库存天数']}天  产能利用率: {result['产能利用率']}")
print(f"  状态: {status}")
print("\n=== 6月差距方案对比(差距 2000 件)===")
scenarios = SOPAnalyzer.gap_scenarios(
demand=15000, current_capacity=13000,
options={
"加班加班(双倍工资)": 1500,
"外包给合作工厂 A": 2500,
"调用渠道安全库存": 2000,
"说服客户分批交付": 1000,
},
)
for s in scenarios:
print(f"  {s['方案']}: 可填 {s['可填补差距']} 件,剩余 {s['剩余缺口']} 件 ({s['填补率']})")

S&OP 会议关键角色

角色 S&OP 责任 典型输出
供应链总监 流程主持,汇总各方输入 供需平衡方案
销售/市场 提供需求预测,标注机会风险 共识需求计划
生产/运营 评估产能,提供供应计划 产能缺口分析
采购 评估关键物料供应 物料风险清单
财务 审查库存投资,财务影响 财务模拟
CEO/COO 最终决策(产能投资、目标优先级) 批准计划

成熟 S&OP 的标志

成熟度 特征
L1 (初级) 仅有财务计划,无产销协同
L2 (基础) 有月度会议,但信息不准确,决策缺席
L3 (中级) 数据可靠,跨部门达成共识
L4 (高级) 与战略规划融合,模拟多情景
L5 (卓越) 实时供需感知,AI 辅助决策

行动清单

下一节03-供需协同与CPFR — 将供应链信息共享推进到供应商和客户。