mcpField
S
supplier-collaboration

supplier-collaboration

github.com/kishorkukreja其他8452 次安装3 周前更新
代码仓库

关于 supplier-collaboration

用于规划供应商协作关系与项目的技能,适合采购及供应链团队。内容涵盖协作成熟度、合作模式、实施步骤和绩效衡量。

主要功能

  1. 01协作成熟度评估
  2. 02供应商分层
  3. 03VMI 与 CPFR 模式
  4. 04联合业务规划
  5. 05挑战与应对方案

适用场景

  1. 01设计供应商协作项目
  2. 02制定联合预测与补货流程
  3. 03评估协作计划的绩效

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/kishorkukreja/awesome-supply-chain --skill supplier-collaboration

安装后在 Claude Code 中输入/supplier-collaboration确认已加载。

详细介绍

供应商协作

你是供应商协作和合作伙伴关系管理方面的专家。你的目标是帮助组织建立战略供应商关系、实施协作流程,并通过加强信息共享和联合规划创造互惠价值。

初步评估

实施供应商协作之前,请先了解:

  1. 协作目标

    • 协作目标是什么?(降低成本、创新、风险缓解、改善服务)
    • 预期成果和收益是什么?
    • 供应商属于战略型还是交易型?
    • 现有合作关系的成熟度如何?
  2. 供应商细分

    • 涉及多少家供应商?
    • 如何对供应商分类?(战略型、优选型、获批型、交易型)
    • 供应商是价值高还是数量大?
    • 地理分布如何?
  3. 当前关系状况

    • 关系质量和信任程度如何?
    • 现有的协作机制有哪些?
    • 信息共享实践如何?
    • 是否有联合计划或项目?
  4. 组织准备情况

    • 跨职能协同情况如何?
    • 技术能力如何(门户、EDI、API)?
    • 供应商管理方面有哪些资源?
    • 变革管理能力如何?

供应商协作框架

协作成熟度模型

级别 1:交易型

  • 以价格为重点的谈判
  • 保持一定距离的关系
  • 信息共享有限
  • 基于订单的互动
  • 每年审查合同

级别 2:合作型

  • 开放沟通
  • 基本绩效指标
  • 定期审查
  • 共同解决问题
  • 多年期合同

级别 3:协调型

  • 联合规划流程
  • 共享预测和计划
  • 绩效改进计划
  • 技术集成(EDI、门户)
  • 共同分担风险和收益

级别 4:协作型

  • 战略协同
  • 联合创新与开发
  • 系统和流程集成
  • 联合创造价值
  • 长期合作伙伴关系

级别 5:同步型

  • 无缝集成
  • 实时可视性和规划
  • 自动补货
  • 生态系统统筹
  • 共同愿景和路线图
协作模式

1. 供应商管理库存(VMI)

  • 供应商管理买方库存
  • 获取消耗数据
  • 自动补货
  • 减少缺货和库存

2. 协同计划、预测与补货(CPFR)

  • 联合需求规划
  • 共享预测并管理异常情况
  • 同步运营
  • 提高预测准确性

3. 供应商早期参与(ESI)

  • 供应商参与产品设计
  • 发挥技术专长
  • 面向可制造性的设计
  • 缩短上市时间

4. 联合业务规划(JBP)

  • 年度规划会议
  • 目标和指标协同
  • 投资规划
  • 增长战略

5. 联合创新合作伙伴关系

  • 联合研发项目
  • 知识产权共享协议
  • 创新路线图
  • 共同出资

供应商协作实施

VMI 计划设计
import pandas as pd
import numpy as np
from datetime import datetime, timedelta

class VMIProgram:
    """Vendor-Managed Inventory program implementation"""

    def __init__(self, buyer_id, supplier_id):
        self.buyer_id = buyer_id
        self.supplier_id = supplier_id
        self.inventory_positions = []
        self.replenishment_orders = []
        self.performance_metrics = {}

    def set_vmi_parameters(self, product_id, min_level, max_level,
                          order_multiple, lead_time_days, service_level=0.95):
        """
        Set VMI parameters for a product

        min_level: Reorder point
        max_level: Maximum inventory level (order-up-to)
        order_multiple: Minimum order quantity or multiple
        """

        return {
            'product_id': product_id,
            'min_level': min_level,
            'max_level': max_level,
            'order_multiple': order_multiple,
            'lead_time_days': lead_time_days,
            'service_level': service_level,
            'last_update': datetime.now()
        }

    def calculate_vmi_replenishment(self, current_inventory, pipeline_inventory,
                                   daily_consumption, vmi_params):
        """
        Calculate VMI replenishment quantity

        current_inventory: On-hand inventory
        pipeline_inventory: In-transit/on-order inventory
        daily_consumption: Average daily consumption
        vmi_params: VMI parameters dict
        """

        # Inventory position = on-hand + pipeline
        inventory_position = current_inventory + pipeline_inventory

        # Check if replenishment needed
        if inventory_position <= vmi_params['min_level']:
            # Calculate order quantity to reach max level
            target_inventory = vmi_params['max_level']
            order_quantity = target_inventory - inventory_position

            # Round to order multiple
            order_multiple = vmi_params['order_multiple']
            if order_multiple > 0:
                order_quantity = np.ceil(order_quantity / order_multiple) * order_multiple

            # Calculate days of supply
            days_of_supply = order_quantity / daily_consumption if daily_consumption > 0 else 0

            return {
                'replenishment_needed': True,
                'order_quantity': int(order_quantity),
                'inventory_position': inventory_position,
                'target_inventory': target_inventory,
                'days_of_supply': round(days_of_supply, 1),
                'reason': 'Inventory below minimum threshold'
            }
        else:
            return {
                'replenishment_needed': False,
                'order_quantity': 0,
                'inventory_position': inventory_position,
                'days_of_supply': round(inventory_position / daily_consumption if daily_consumption > 0 else 0, 1),
                'reason': 'Inventory sufficient'
            }

    def simulate_vmi_performance(self, demand_series, vmi_params, initial_inventory):
        """
        Simulate VMI program performance

        demand_series: Daily demand data
        vmi_params: VMI parameters
        initial_inventory: Starting inventory
        """

        results = []
        current_inventory = initial_inventory
        pipeline = 0
        orders_placed = []

        for day, demand in enumerate(demand_series):
            # Check for arriving orders
            arriving_orders = [o for o in orders_placed if o['arrival_day'] == day]
            for order in arriving_orders:
                current_inventory += order['quantity']
                pipeline -= order['quantity']
                orders_placed.remove(order)

            # Satisfy demand
            demand_satisfied = min(demand, current_inventory)
            stockout = max(0, demand - current_inventory)
            current_inventory = max(0, current_inventory - demand)

            # Check if replenishment needed
            daily_avg_consumption = np.mean(demand_series[:day+1]) if day > 0 else demand
            replenishment = self.calculate_vmi_replenishment(
                current_inventory, pipeline, daily_avg_consumption, vmi_params
            )

            if replenishment['replenishment_needed']:
                # Place order
                order = {
                    'day': day,
                    'quantity': replenishment['order_quantity'],
                    'arrival_day': day + vmi_params['lead_time_days']
                }
                orders_placed.append(order)
                pipeline += order['quantity']

            results.append({
                'day': day,
                'demand': demand,
                'demand_satisfied': demand_satisfied,
                'stockout': stockout,
                'ending_inventory': current_inventory,
                'pipeline_inventory': pipeline,
                'order_placed': replenishment['replenishment_needed'],
                'order_quantity': replenishment['order_quantity']
            })

        df = pd.DataFrame(results)

        # Calculate metrics
        metrics = {
            'avg_inventory': df['ending_inventory'].mean(),
            'max_inventory': df['ending_inventory'].max(),
            'min_inventory': df['ending_inventory'].min(),
            'total_stockouts': df['stockout'].sum(),
            'fill_rate': (df['demand_satisfied'].sum() / df['demand'].sum() * 100) if df['demand'].sum() > 0 else 100,
            'orders_placed': df['order_placed'].sum(),
            'avg_order_size': df[df['order_placed']]['order_quantity'].mean() if df['order_placed'].sum() > 0 else 0
        }

        return {
            'simulation_results': df,
            'performance_metrics': metrics
        }


# Example VMI implementation
vmi = VMIProgram(buyer_id='BUYER001', supplier_id='SUP001')

# Set VMI parameters
vmi_params = vmi.set_vmi_parameters(
    product_id='PROD001',
    min_level=500,      # Reorder point
    max_level=2000,     # Order-up-to level
    order_multiple=100,  # Order in multiples of 100
    lead_time_days=7,
    service_level=0.95
)

# Simulate 90 days of VMI
np.random.seed(42)
demand_series = np.random.poisson(lam=150, size=90)  # Average demand of 150 units/day

simulation = vmi.simulate_vmi_performance(
    demand_series, vmi_params, initial_inventory=1500
)

print("VMI Performance Metrics:")
print(f"  Average Inventory: {simulation['performance_metrics']['avg_inventory']:.0f} units")
print(f"  Fill Rate: {simulation['performance_metrics']['fill_rate']:.1f}%")
print(f"  Total Stockouts: {simulation['performance_metrics']['total_stockouts']:.0f} units")
print(f"  Orders Placed: {simulation['performance_metrics']['orders_placed']:.0f}")
print(f"  Average Order Size: {simulation['performance_metrics']['avg_order_size']:.0f} units")

CPFR 实施

协同规划流程
class CPFRProgram:
    """Collaborative Planning, Forecasting, and Replenishment program"""

    def __init__(self, buyer_name, supplier_name):
        self.buyer_name = buyer_name
        self.supplier_name = supplier_name
        self.shared_forecast = {}
        self.exceptions = []

    def create_joint_forecast(self, buyer_forecast, supplier_forecast, product_id):
        """
        Create joint forecast from buyer and supplier inputs

        Use weighted average or exception-based consensus
        """

        if len(buyer_forecast) != len(supplier_forecast):
            raise ValueError("Forecast lengths must match")

        joint_forecast = []
        exceptions = []

        for i, (buyer_qty, supplier_qty) in enumerate(zip(buyer_forecast, supplier_forecast)):
            # Calculate variance
            variance_pct = abs(buyer_qty - supplier_qty) / ((buyer_qty + supplier_qty) / 2) * 100 if (buyer_qty + supplier_qty) > 0 else 0

            # If variance > threshold, flag as exception
            if variance_pct > 20:  # 20% threshold
                exceptions.append({
                    'period': i + 1,
                    'buyer_forecast': buyer_qty,
                    'supplier_forecast': supplier_qty,
                    'variance_pct': round(variance_pct, 1),
                    'status': 'Requires Resolution',
                    'consensus_qty': None
                })

                # Use weighted average (60% buyer, 40% supplier) pending resolution
                consensus_qty = int(buyer_qty * 0.6 + supplier_qty * 0.4)
            else:
                # Use weighted average
                consensus_qty = int(buyer_qty * 0.6 + supplier_qty * 0.4)

            joint_forecast.append({
                'period': i + 1,
                'buyer_forecast': buyer_qty,
                'supplier_forecast': supplier_qty,
                'variance_pct': round(variance_pct, 1),
                'consensus_forecast': consensus_qty,
                'has_exception': variance_pct > 20
            })

        self.shared_forecast[product_id] = joint_forecast
        self.exceptions.extend(exceptions)

        return {
            'joint_forecast': pd.DataFrame(joint_forecast),
            'exceptions': pd.DataFrame(exceptions) if exceptions else pd.DataFrame(),
            'forecast_accuracy_alignment': round(100 - variance_pct, 1) if variance_pct < 100 else 0
        }

    def resolve_exception(self, period, consensus_qty, resolution_notes):
        """Resolve forecast exception with agreed quantity"""

        for exception in self.exceptions:
            if exception['period'] == period and exception['status'] == 'Requires Resolution':
                exception['consensus_qty'] = consensus_qty
                exception['status'] = 'Resolved'
                exception['resolution_notes'] = resolution_notes
                exception['resolution_date'] = datetime.now()

                # Update shared forecast
                for product_id, forecast_list in self.shared_forecast.items():
                    for period_forecast in forecast_list:
                        if period_forecast['period'] == period:
                            period_forecast['consensus_forecast'] = consensus_qty
                            break

                return True

        return False

    def calculate_collaboration_benefits(self, baseline_metrics, cpfr_metrics):
        """
        Calculate benefits from CPFR collaboration

        baseline_metrics: Pre-CPFR performance
        cpfr_metrics: Post-CPFR performance
        """

        # Forecast accuracy improvement
        forecast_improvement = cpfr_metrics['forecast_accuracy'] - baseline_metrics['forecast_accuracy']

        # Inventory reduction
        inventory_reduction_pct = (baseline_metrics['avg_inventory'] - cpfr_metrics['avg_inventory']) / baseline_metrics['avg_inventory'] * 100

        # Service level improvement
        service_improvement = cpfr_metrics['fill_rate'] - baseline_metrics['fill_rate']

        # Cost savings
        inventory_cost_rate = 0.25  # 25% annual carrying cost
        inventory_value_reduction = (baseline_metrics['avg_inventory'] - cpfr_metrics['avg_inventory']) * cpfr_metrics['unit_cost']
        annual_savings = inventory_value_reduction * inventory_cost_rate

        # Stockout reduction
        stockout_reduction = baseline_metrics['stockout_events'] - cpfr_metrics['stockout_events']
        stockout_cost_avoided = stockout_reduction * cpfr_metrics['stockout_cost_per_event']

        total_annual_benefit = annual_savings + stockout_cost_avoided

        return {
            'forecast_accuracy_improvement_pts': round(forecast_improvement, 1),
            'inventory_reduction_pct': round(inventory_reduction_pct, 1),
            'inventory_value_reduction': round(inventory_value_reduction, 2),
            'service_level_improvement_pts': round(service_improvement, 1),
            'annual_inventory_savings': round(annual_savings, 2),
            'stockout_cost_avoided': round(stockout_cost_avoided, 2),
            'total_annual_benefit': round(total_annual_benefit, 2)
        }


# Example CPFR implementation
cpfr = CPFRProgram(buyer_name='Acme Corp', supplier_name='Widget Manufacturing')

# Buyer and supplier forecasts for next 12 months
buyer_forecast = [1000, 1100, 1200, 1500, 1800, 1600, 1400, 1300, 1200, 1100, 1000, 950]
supplier_forecast = [1050, 1150, 1100, 1400, 2000, 1650, 1500, 1250, 1200, 1150, 1050, 1000]

# Create joint forecast
joint_forecast_result = cpfr.create_joint_forecast(
    buyer_forecast, supplier_forecast, product_id='PROD001'
)

print("CPFR Joint Forecast:")
print(joint_forecast_result['joint_forecast'][['period', 'buyer_forecast', 'supplier_forecast', 'variance_pct', 'consensus_forecast', 'has_exception']])

print(f"\n\nExceptions Requiring Resolution:")
if not joint_forecast_result['exceptions'].empty:
    print(joint_forecast_result['exceptions'])
else:
    print("None")

# Resolve exception for period 5
cpfr.resolve_exception(
    period=5,
    consensus_qty=1850,
    resolution_notes='Agreed to buyer forecast due to confirmed promotion'
)

# Calculate benefits
baseline = {
    'forecast_accuracy': 70,
    'avg_inventory': 5000,
    'fill_rate': 92,
    'stockout_events': 12
}

cpfr_performance = {
    'forecast_accuracy': 85,
    'avg_inventory': 4200,
    'fill_rate': 96,
    'stockout_events': 4,
    'unit_cost': 50,
    'stockout_cost_per_event': 5000
}

benefits = cpfr.calculate_collaboration_benefits(baseline, cpfr_performance)

print(f"\n\nCPFR Benefits:")
print(f"  Forecast Accuracy Improvement: +{benefits['forecast_accuracy_improvement_pts']} pts")
print(f"  Inventory Reduction: {benefits['inventory_reduction_pct']}%")
print(f"  Service Level Improvement: +{benefits['service_level_improvement_pts']} pts")
print(f"  Annual Inventory Savings: ${benefits['annual_inventory_savings']:,.2f}")
print(f"  Stockout Cost Avoided: ${benefits['stockout_cost_avoided']:,.2f}")
print(f"  Total Annual Benefit: ${benefits['total_annual_benefit']:,.2f}")

工具与库

Python 库

协作平台:

  • pandas:数据处理
  • numpy:数值计算
  • flask / fastapi:开发门户 API

沟通:

  • requests:API 集成
  • smtplib:电子邮件通知
  • twilio:短信提醒

数据交换:

  • xml.etree:用于 EDI 的 XML 处理
  • json:JSON 数据处理
  • ftplib:文件传输

可视化:

  • matplotlib、plotly:仪表板
  • dash:交互式门户
商业软件

供应商协作:

  • SAP Ariba:供应商网络与协作
  • Coupa Supplier Portal:供应商互动
  • Ivalua:供应商协作
  • Jaggaer:供应商管理

CPFR 与计划:

  • Blue Yonder:协同计划
  • Kinaxis RapidResponse:协同 S&OP
  • o9 Solutions:协同计划
  • E2open:供应链协作

VMI 与补货:

  • Blue Yonder (JDA) Replenishment:VMI 和自动补货
  • SAP IBP:集成计划与 VMI
  • Manhattan VMI:供应商管理库存

沟通与门户:

  • Salesforce:供应商门户功能
  • Microsoft SharePoint:协作工作区
  • Slack:团队沟通
  • Microsoft Teams:协作平台

常见挑战与解决方案

挑战:信任与透明度

问题:

  • 不愿分享敏感数据
  • 担心信息被滥用
  • 历史上存在对立关系
  • 竞争方面的顾虑

解决方案:

  • 从非敏感数据开始(如预测数据,而非成本数据)
  • 明确的数据使用协议与治理机制
  • 展示互惠互利
  • 使用第三方平台实现匿名
  • 逐步建立信任
  • 发展高管关系
挑战:技术集成

问题:

  • 系统和平台各不相同
  • 遗留技术的限制
  • IT 资源有限
  • 安全方面的顾虑

解决方案:

  • 采用 API 优先的方法
  • 使用基于云的协作平台
  • 使用 EDI 处理标准化交易
  • 制定分阶段集成路线图
  • 使用托管服务提供商
  • 使用轻量级工具(门户、电子表格)
挑战:组织协调

问题:

  • 内部阻力
  • 激励机制不一致
  • 职能部门各自为政
  • 优先事项相互冲突

解决方案:

  • 建立跨职能治理机制
  • 设定共享 KPI 和记分卡
  • 获得高管支持
  • 制定变革管理计划
  • 通过快速见效的成果建立势头
  • 提供认可与奖励
挑战:供应商能力差距

问题:

  • 小型供应商能力不足
  • 技术接入受限
  • 资源有限
  • 知识不足

解决方案:

  • 采用分层协作方式
  • 为供应商提供培训与支持
  • 提供技术(门户访问权限)
  • 为小型供应商简化流程
  • 分阶段实施
  • 共享资源并提供支持
挑战:绩效衡量

问题:

  • 难以单独衡量协作的影响
  • 多种变量会影响结果
  • 衡量方法各不相同
  • 数据可用性有限

解决方案:

  • 在协作前建立基准
  • 在可行时设置对照组
  • 开展前后对比分析
  • 明确归因方法
  • 定期审查并调整
  • 采用定性和定量指标
挑战:维持参与度

问题:

  • 初期热情逐渐消退
  • 日常任务遭到忽视
  • 合作关系逐渐疏远
  • 优先事项相互冲突

解决方案:

  • 定期开展结构化评审(每季度进行 JBP)
  • 持续展示价值
  • 建立关系管理流程
  • 使用绩效仪表板并提高可见性
  • 制定认可计划
  • 推动合作关系演进与创新

输出格式

供应商协作报告

执行摘要:

  • 协作计划状态
  • 主要成就和收益
  • 活跃合作关系
  • 投资和投资回报率

协作组合:

供应商协作模式成熟度级别年度支出已实现收益关系评分
供应商 ACPFRLevel 4$5.0M$450K8.5/10
供应商 BVMILevel 3$3.5M$280K7.8/10
供应商 CESILevel 3$2.8M$320K8.2/10
供应商 DJBPLevel 2$2.2M$120K7.0/10

计划绩效:

指标基准值当前值改进幅度目标
预测准确率68%82%+14 pts85%
库存周转次数6.28.5+2.39.0
订单满足率91%96%+5 pts97%
交货周期28 days21 days-7 days18 days
供应商准时交付率88%94%+6 pts96%

收益汇总:

收益类别年度价值来源
库存削减$850K通过 VMI/CPFR 降低安全库存
服务提升$420K减少缺货和加急配送
流程效率$230K自动补货、减少订单数量
创新价值$500K联合产品开发(ESI)
总计$2.0M

进行中的项目:

项目供应商开始日期状态预期收益
扩展 CPFR供应商 EQ1 2026进行中$300K/yr
VMI 试点供应商 FQ2 2026规划中$150K/yr
联合创新项目供应商 AQ3 2025活跃待定
供应商培训计划全部持续进行活跃能力建设

要问的问题

如果需要更多背景信息:

  1. 协作目标是什么?(成本、服务、创新、风险)
  2. 哪些供应商是协作对象?
  3. 当前的合作关系质量和成熟度如何?
  4. 正在考虑哪些协作模式?(VMI、CPFR、ESI、JBP)
  5. 可以与供应商共享哪些数据?
  6. 现有哪些技术基础设施?
  7. 有哪些资源可用于供应商管理?
  8. 是否有可借鉴的成功协作案例?
  9. 协作面临哪些障碍?
  10. 如何衡量成功?

相关技能

  • supplier-selection:用于识别战略协作伙伴
  • supplier-risk-management:用于监控协作供应商风险
  • procurement-optimization:用于优化协作采购
  • demand-forecasting:用于 CPFR 中的共享预测
  • inventory-optimization:用于设置 VMI 参数
  • contract-management:用于制定协作协议
  • control-tower-design:用于整合供应商可视性
  • demand-supply-matching:用于协作计划流程

评论

支持 Markdown