工单管理模块:工单生命周期管理、工单创建与下达、工单拆分与合并、工单状态流转设计、工单优先级与调度策略
工单管理,说白了就是MES系统的“指挥中心”。我做了这么多年MES,见过太多工厂因为工单乱、状态不清、优先级打架导致产线停摆。今天咱们就把这块硬骨头啃下来。
一、工单生命周期管理:从生到死的完整旅程
工单不是一张纸,它是有生命的。我个人习惯把工单生命周期分成五个阶段:创建期、待产期、执行期、完工期、归档期。
你想想看,一个工单从计划员手里诞生,到车间里流转,最后变成成品入库,中间要经历多少状态变化?我见过最复杂的项目,工单状态多达20多个,但说实话,大部分都是冗余的。
核心原则:状态设计要“够用就好”,别搞成迷宫。一般建议控制在6-8个核心状态。
我给大家画一张工单生命周期的流程图,这样更直观:
嗯,这里要注意:暂停/挂起状态特别重要。我在项目中遇到过,产线突然缺料,工单不能取消但也不能继续,这时候就需要一个“挂起”状态来兜底。千万别让工单卡在半空中,上下不沾。
二、工单创建与下达:别让数据成为瓶颈
工单创建,看起来简单,其实坑最多。我见过最夸张的案例,一个工单创建要填40多个字段,操作员直接崩溃。
我个人建议,工单创建分两步走:
- 快速创建:只填必填项(产品编码、数量、计划日期),其他默认。
- 补充完善:在工单下达前,再补全工艺路线、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级。
- 加权优先级:客户等级 × 交期紧迫度 × 利润贡献。适合多维度评估。
调度策略三选一:
- FIFO(先进先出):简单公平,适合标准品生产。
- EDD(最早交期):优先处理交期最紧的,适合项目型生产。
- 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