在现代制造业中,生产排产(Production Scheduling)是工厂运营的核心环节。一个糟糕的排产计划会导致机器闲置、在制品(WIP)堆积、交货延期以及成本飙升;而一个优秀的排产计划则能最大化资源利用率,确保准时交货,并显著减少生产瓶颈。

制定一份能够避免瓶颈与延期的排期表,不能仅靠经验或简单的Excel表格,而需要结合科学的方法论、数据驱动的分析以及合适的工具。以下是制定高效生产排产计划的详细指南。


一、 基础数据准备:垃圾进,垃圾出

排产计划的准确性完全取决于输入数据的质量。在制定计划前,必须建立完善的基础数据库。

1. 精确的物料清单(BOM)与工艺路线(Routing)

  • BOM(Bill of Materials): 必须明确生产一个成品需要哪些原材料、零部件,以及它们的消耗比例。
  • Routing(工艺路线): 定义产品经过哪些工序、在哪些机器上加工、标准工时是多少。
  • 目的: 确保排产时能反向推导出何时需要备料,以及每个工序的预计耗时。

2. 实时的资源能力数据

  • 设备能力: 机器的最大产出率(件/小时)、良品率、是否需要模具更换(Setup Time)。
  • 人员技能: 哪些工人能操作哪些机器,是否存在人员短缺风险。
  • 目的: 避免将任务排产到不存在的资源上,或高估产能。

3. 准确的库存状态

  • 原材料库存: 现有量、安全库存、在途量(PO未交)。
  • 半成品/成品库存: 现有量,是否可以直接满足部分订单。
  • 目的: 避免因缺料导致的生产中断(瓶颈)。

二、 排产策略的选择:决定效率的关键

在数据准备好的基础上,你需要决定如何安排顺序。这是避免瓶颈的核心逻辑。

1. 优先级策略(Prioritization)

  • FCFS(First Come First Served): 先到先做。简单,但容易导致急单被延误。
  • EDD(Earliest Due Date): 按照客户交期最早优先。这是避免延期交货最直接的策略
  • SPT(Shortest Processing Time): 优先做时间最短的工序。这能快速减少在制品数量,提高设备周转率,但可能忽略交期。
  • CR(Critical Ratio): 关键比率法。计算公式为:(交期 - 当前时间) / 剩余加工时间。CR < 1 表示延期风险高,必须优先排产。

2. 约束理论(TOC)与瓶颈管理

根据高德拉特的约束理论,系统的产出由瓶颈工序决定

  • 识别瓶颈: 找出产能最低或需求最高的工序(如注塑、喷涂)。
  • 保护瓶颈: 在瓶颈工序前设置“缓冲库存”(Buffer),确保瓶颈机器永远有活干,不因缺料而停机。
  • 非瓶颈工序配合: 非瓶颈工序的排产不能快于瓶颈工序,否则会造成堆积。

三、 解决生产瓶颈的具体战术

瓶颈是生产排产中的“堵点”,必须提前规划解决。

1. 负荷平衡(Load Leveling)

不要将所有相似的订单集中在同一时间段生产。

  • 做法: 将大订单拆分,或者将不同产品的生产穿插进行,平滑对特定设备的需求曲线。
  • 例子: 如果工厂只有一台丝印机,而A产品和B产品都需要它。不要先做完A的所有订单再做B,而应该按A-B-A-B的节奏排产,防止B订单积压太久。

2. 设备预维护与备机计划

  • 做法: 在排期表中预留“设备保养时间”,而不是等到机器坏了才停。
  • 缓冲: 对于关键瓶颈设备,如果可能,准备备用机器或寻找外协(外包)作为Plan B。

3. 缩换模时间(SMED)

  • 做法: 如果瓶颈设备需要频繁更换模具或夹具,推行快速换模(SMED)。
  • 排期优化: 将需要相同模具的订单排在一起(Batching),减少换模次数,增加有效生产时间。

四、 避免延期交货的排期表制定流程

1. 产能与需求的粗能力计划(RCCP)

在生成详细排期表之前,先进行宏观检查。

  • 计算: 总订单需求工时 vs 总可用工时。
  • 预警: 如果需求 > 产能,必须立即采取行动:与销售沟通延期、增加班次(加班)、或外包部分工序。

2. 详细排程(Detailed Scheduling)

使用甘特图(Gantt Chart)思维进行可视化排程。

  • 时间轴: 精确到小时甚至分钟。
  • 锁定关键路径: 确定从原材料到成品的最长路径,优先保障该路径上的物料和设备到位。

3. 动态调整机制

排产表不是死的。必须建立重排(Rescheduling)机制。

  • 插单处理: 当急单进入时,计算其对现有计划的影响(延期风险),只插入那些对整体影响最小的位置。
  • 缺料预警: 每天检查未来3-7天的物料到位情况。

五、 实战案例:如何用代码逻辑模拟排产(Python示例)

虽然工厂通常使用ERP或APS(高级计划与排程)系统,但理解其背后的逻辑非常重要。以下是一个简化的Python示例,展示如何根据交期紧迫程度(EDD策略)来自动排序生产任务,从而避免延期。

假设我们有一组待排产的订单,我们需要计算它们的紧迫程度并生成排产顺序。

from datetime import datetime, timedelta

class ProductionOrder:
    def __init__(self, order_id, product_name, due_date, process_time, priority_score=0):
        self.order_id = order_id
        self.product_name = product_name
        self.due_date = datetime.strptime(due_date, "%Y-%m-%d") # 交期
        self.process_time = process_time # 预计加工时间(小时)
        self.priority_score = priority_score
        
    def __repr__(self):
        return f"订单ID: {self.order_id}, 产品: {self.product_name}, 交期: {self.due_date.strftime('%Y-%m-%d')}, 需时: {self.process_time}小时"

def calculate_priority(orders, current_date):
    """
    计算关键比率 (Critical Ratio) 和紧迫因子
    CR = (交期 - 当前时间) / 剩余加工时间
    CR越小,越紧急
    """
    scheduled_list = []
    
    for order in orders:
        # 计算距离交期的天数
        days_until_due = (order.due_date - current_date).days
        
        # 计算关键比率 (简化版:如果剩余时间小于加工时间,视为极度紧急)
        if days_until_due * 24 < order.process_time: # 假设每天工作8小时
            order.priority_score = 1 # 极度紧急
        elif days_until_due * 24 < order.process_time * 2:
            order.priority_score = 2 # 紧急
        else:
            order.priority_score = 3 # 正常
            
        scheduled_list.append(order)
    
    # 排序:先按优先级(数字小的在前),再按交期早的在前
    scheduled_list.sort(key=lambda x: (x.priority_score, x.due_date))
    
    return scheduled_list

# --- 模拟场景 ---
# 当前日期
today = datetime(2023, 10, 27)

# 待排产订单列表
orders_data = [
    ProductionOrder("PO-001", "齿轮A", "2023-10-30", 12), # 交期近,需时短 -> 紧急
    ProductionOrder("PO-002", "外壳B", "2023-11-05", 40), # 交期远,需时长 -> 正常
    ProductionOrder("PO-003", "轴承C", "2023-10-29", 20), # 交期非常近 -> 极度紧急
    ProductionOrder("PO-004", "底座D", "2023-11-02", 10), # 交期中等 -> 紧急
]

# 执行排产逻辑
final_schedule = calculate_priority(orders_data, today)

# 输出排产计划表
print(f"--- {today.strftime('%Y-%m-%d')} 生产排产计划表 ---")
print(f"{'优先级':<8} {'订单号':<10} {'产品名称':<10} {'交期':<12} {'预估工时':<8}")
print("-" * 55)

for order in final_schedule:
    priority_str = "紧急" if order.priority_score == 1 else "预警" if order.priority_score == 2 else "正常"
    print(f"{priority_str:<8} {order.order_id:<10} {order.product_name:<10} {order.due_date.strftime('%Y-%m-%d'):<12} {order.process_time:<8}小时")

# 结果分析:
# 1. 轴承C (PO-003) 交期最近,排第一。
# 2. 齿轮A (PO-001) 交期次近,排第二。
# 3. 底座D (PO-004) 交期稍远,排第三。
# 4. 外壳B (PO-002) 交期最远,排最后。
# 这种逻辑能有效防止急单漏做导致的延期交货。

代码逻辑解析: 这段代码演示了基于约束和交期的动态排序。在实际工厂中,你会将机器容量(Capacity)作为约束加入循环。如果某天的累计工时超过8小时,系统会自动将订单顺延到第二天。这正是APS系统的核心算法之一。


六、 工具与技术栈建议

为了执行上述策略,建议根据工厂规模选择工具:

  1. Excel(适用于小型工厂):

    • 使用甘特图模板。
    • 利用条件格式(Conditional Formatting)高亮显示延期风险。
    • 缺点: 无法处理复杂的资源冲突,手动调整耗时。
  2. ERP系统(适用于中型工厂):

    • 如SAP, Oracle, 金蝶, 用友。
    • 提供MRP(物料需求计划)自动计算采购。
    • 缺点: 通常偏向于计划,而非详细的现场调度。
  3. APS(高级计划与排程系统)(适用于大型/复杂工厂):

    • 如西门子Opcenter, Asprova, PlanetTogether。
    • 功能: 考虑有限产能(Finite Capacity),自动进行启发式算法排程,支持插单模拟。
    • 优势: 能真正解决瓶颈问题,实现可视化排程。

七、 总结:制定排期表的“黄金法则”

要避免瓶颈与延期,制定排期表时请反复核对以下三点:

  1. 料到才排: 确保物料齐套(齐套检查),不排“无米之炊”。
  2. 瓶颈优先: 所有非瓶颈资源必须服从瓶颈资源的节奏。
  3. 留有余地: 在计划中预留5%-10%的缓冲时间(Buffer)应对突发异常(如设备故障、员工请假)。

通过遵循以上步骤,结合数据的准确性和科学的排序逻辑,工厂可以显著提升排产计划的执行力,从而从根本上消除生产瓶颈,确保准时交货。