工单管理模块:工单生命周期管理、工单创建与下达、工单拆分与合并、工单状态流转设计、工单优先级与调度策略

工单管理,说白了就是MES系统的“指挥中心”。我做了这么多年MES,见过太多工厂因为工单乱、状态不清、优先级打架导致产线停摆。今天咱们就把这块硬骨头啃下来。

一、工单生命周期管理:从生到死的完整旅程

工单不是一张纸,它是有生命的。我个人习惯把工单生命周期分成五个阶段:创建期、待产期、执行期、完工期、归档期

你想想看,一个工单从计划员手里诞生,到车间里流转,最后变成成品入库,中间要经历多少状态变化?我见过最复杂的项目,工单状态多达20多个,但说实话,大部分都是冗余的。

核心原则:状态设计要“够用就好”,别搞成迷宫。一般建议控制在6-8个核心状态。

我给大家画一张工单生命周期的流程图,这样更直观:

工单生命周期状态流转图 创建 已下达 生产中 完工 已归档 暂停/挂起 取消/关闭 —— 正常流转 - - - 异常分支 - - - 恢复流转

嗯,这里要注意:暂停/挂起状态特别重要。我在项目中遇到过,产线突然缺料,工单不能取消但也不能继续,这时候就需要一个“挂起”状态来兜底。千万别让工单卡在半空中,上下不沾。

二、工单创建与下达:别让数据成为瓶颈

工单创建,看起来简单,其实坑最多。我见过最夸张的案例,一个工单创建要填40多个字段,操作员直接崩溃。

我个人建议,工单创建分两步走:

  1. 快速创建:只填必填项(产品编码、数量、计划日期),其他默认。
  2. 补充完善:在工单下达前,再补全工艺路线、BOM版本、质检方案等。

我的经验:工单创建接口一定要支持ERP同步。很多企业ERP里已经排好工单了,MES直接拉过来就行,别让人再敲一遍。我曾经帮一家客户优化,光这一步就把工单创建时间从5分钟降到了30秒。

工单下达,说白了就是“发令枪”。下达那一刻,系统要干三件事:

  • 锁定物料库存(防止被别的工单抢走)
  • 生成工序任务(派给对应工位)
  • 打印流转卡/条码(现场作业依据)

为什么会这样?因为工单一经下达,就进入执行态了,不能再随便改。我建议在下达前加一个“预检”步骤,检查物料够不够、设备有没有排期冲突、工艺参数对不对。预检不通过,系统直接弹警告,别让工单带着问题下车间。

三、工单拆分与合并:灵活应对现场变化

这个功能,说实话,很多MES厂商做得稀烂。但实际生产中,拆分和合并是家常便饭。

工单拆分的场景:

  • 一张大工单,要分给两条产线同时做
  • 紧急插单,从现有工单里切一部分出来优先生产
  • 外协加工,把部分工序拆分出去

工单合并的场景:

  • 多张小批量工单,合并成一张大工单提高效率
  • 相同产品、相同工艺的工单,合并后统一调度

避坑指南:我曾经遇到一个项目,拆分后的子工单和父工单状态不同步,导致财务结算时数量对不上。后来我强制要求:子工单完工后,父工单自动扣减数量;子工单全部完工,父工单才能关闭。这个逻辑一定要做死。

拆分合并的数据结构,我一般这样设计:

-- 工单主表
CREATE TABLE work_order (
    wo_id VARCHAR(20) PRIMARY KEY,        -- 工单号
    parent_wo_id VARCHAR(20),             -- 父工单号(拆分时用)
    quantity DECIMAL(10,2),               -- 计划数量
    completed_qty DECIMAL(10,2),          -- 完工数量
    status VARCHAR(20),                   -- 状态
    priority INT                          -- 优先级
);

-- 工单关系表(处理多级拆分)
CREATE TABLE wo_relation (
    relation_id INT PRIMARY KEY,
    from_wo_id VARCHAR(20),               -- 源工单
    to_wo_id VARCHAR(20),                 -- 目标工单
    split_qty DECIMAL(10,2),              -- 拆分数量
    relation_type VARCHAR(10)             -- 'SPLIT' 或 'MERGE'
);

你想想看,有了这个结构,不管拆多少层、合多少次,都能追溯得清清楚楚。

四、工单状态流转设计:别让状态“跳来跳去”

状态流转,核心就一句话:谁在什么条件下,能把工单从A状态变成B状态

我一般用状态机来设计,画成矩阵表:

当前状态 下一状态 触发条件 操作角色 系统动作
创建 已下达 预检通过 计划员 锁定物料、生成工序
已下达 生产中 首件报工 操作工 记录开始时间
生产中 暂停 异常上报 班组长 记录暂停原因
暂停 生产中 异常解除 班组长 恢复计时
生产中 完工 最后工序报工 操作工 计算工时、良率
完工 已归档 质检通过、财务结算 系统自动 关闭工单、释放资源

嗯,这里有个细节:状态回退要不要允许?我个人建议,原则上不允许回退,除非有审批。比如“生产中”不能直接退回“已下达”,但可以走“取消”流程。为什么?因为一旦开始生产,物料已经消耗、工时已经记录,回退会导致数据混乱。

五、工单优先级与调度策略:让急单插队不乱套

优先级,说白了就是“谁先干”。但光有优先级不够,还得有调度策略。

我常用的优先级模型:

  • 数值优先级:1-10级,1级最高,10级最低。默认5级。
  • 动态优先级:根据交期剩余天数自动调整。比如还剩1天的工单,优先级自动升到2级。
  • 加权优先级:客户等级 × 交期紧迫度 × 利润贡献。适合多维度评估。

调度策略三选一:

  1. FIFO(先进先出):简单公平,适合标准品生产。
  2. EDD(最早交期):优先处理交期最紧的,适合项目型生产。
  3. SPT(最短加工时间):先做耗时短的,适合小批量多品种。

我在项目中遇到过最头疼的问题:优先级“通货膨胀”。所有工单都标1级,那优先级就形同虚设了。后来我强制规定:每个班组同时只能有3张高优先级工单,超过的自动降级。这才把秩序拉回来。

调度策略的代码实现,我一般这样写:

// 工单排序算法(C#示例)
public List<WorkOrder> SortWorkOrders(List<WorkOrder> orders)
{
    // 先按优先级排序,同优先级按交期排序
    return orders
        .OrderBy(o => o.Priority)           // 优先级升序(1最高)
        .ThenBy(o => o.DueDate)             // 交期升序
        .ThenBy(o => o.CreateTime)          // 创建时间升序
        .ToList();
}

// 动态优先级调整(每天凌晨执行)
public void AdjustPriority()
{
    foreach (var order in GetActiveOrders())
    {
        int daysLeft = (order.DueDate - DateTime.Now).Days;
        if (daysLeft <= 1) order.Priority = 2;
        else if (daysLeft <= 3) order.Priority = 3;
        // 其他规则...
    }
}

最后说一句:工单管理没有银弹。每个工厂的痛点都不一样,有的缺物料,有的缺设备,有的缺人。我建议你先把基础的状态流转和优先级机制搭好,再根据实际痛点做定制。别一上来就想搞个大而全的系统,那往往是灾难的开始。

我的忠告:工单模块上线后,前三个月一定要盯着看。看工单状态流转是否顺畅、优先级是否合理、拆分合并有没有出bug。发现问题及时调,别等到数据量大了再改,那代价就大了。


公众号:蓝海资料掘金营,微信deep3321