2. 生产任务与订单对象建模
在排产与插单系统中,真正被调度、被抢占、被延期的并不是“订单”这个业务名词,而是一组彼此关联的对象:订单、BOM、工艺路线、工单、工序、资源与日历。理解这些对象的边界与关系,是后续判断“谁该优先、插单插到哪里、插单会挤掉谁”的前提。本节先建立对象模型,再说明它们之间的引用与派生关系。
一、从订单到工序:三层展开
客户订单(Sales Order)是需求源头,它只描述“要什么、要多少、什么时候要”。要变成可排产的对象,需要经过两次展开:
- 订单 → BOM 展开:BOM(Bill of Materials,物料清单)描述产品的层级结构,即一个成品由哪些半成品、零件、原材料构成,以及每单位父件的用量。BOM 展开把订单数量换算成各层物料的需求数量。
- 订单 → 工艺路线展开:工艺路线(Routing)描述“怎么做”,即制造某物料需要经过哪些工序、每道工序在什么资源上、标准工时是多少、前后工序的约束是什么。
- 工单 → 工序展开:工单(Work Order)是订单与 BOM、工艺路线结合后的可执行制造指令,它按工艺路线生成若干工序(Operation),每道工序才是真正占用资源、占用日历时间的最小排产单元。
因此,排产的最小对象是工序,而不是订单。插单的本质,是把一张新工单的若干工序插入到已有工序序列中,并重新分配资源与时间。
二、核心对象及其关键属性
为了让对象可计算,每个对象都需要一组最小属性。下表给出示例字段(数值为教学示例,非实测数据):
| 对象 | 关键属性 | 示例 |
|---|---|---|
| 订单 | 订单号、物料、数量、交期、优先级 | SO-2024-018,A 产品,200 件,交期 3 月 20 日,优先级 2 |
| BOM | 父件、子件、用量、层级 | A 由 1 个 B 和 2 个 C 组成;B 由 3 个 D 组成 |
| 工艺路线 | 物料、工序号、工序名、资源组、标准工时、准备时间 | OP10 下料/切割机/0.5h;OP20 机加/CNC/1.2h;OP30 装配/装配线/0.8h |
| 工单 | 工单号、来源订单、物料、数量、计划开工/完工、状态 | WO-018-01,A,200 件,计划 3 月 12 日开工,状态“已下达” |
| 工序 | 工序号、所属工单、资源、工时、前后置关系、状态 | WO-018-01-OP20,CNC-03,1.2h,前置 OP10,状态“待排” |
| 资源 | 资源号、资源组、能力、可用日历、效率 | CNC-03,CNC 组,单件工时系数 1.0,日历“两班制” |
| 日历 | 工作日、班次、休息、停机、例外日 | 周一至周五 8:00–20:00,周六 8:00–12:00,周日休息 |
其中,资源与日历共同决定“时间是否可用”。资源回答“谁能做”,日历回答“什么时候能做”。排产时,工序必须同时满足资源可用和日历可用,二者缺一不可。
三、对象之间的关系
这些对象不是孤立的,而是通过引用关系连成一张网:
- 订单通过 BOM 展开得到物料需求,通过工艺路线得到工序模板;
- 工单引用订单、BOM 版本和工艺路线版本,是“订单 + 结构 + 方法”的实例化;
- 工单按工艺路线生成工序,工序之间通过前后置关系形成工序链;
- 工序占用资源,资源绑定日历,日历决定工序可用的时间窗口;
- 同一资源上的多道工序形成资源时间轴上的排队序列,插单就是在这个序列中插入新工序。
下面用一张关系图把上述对象与引用方向固定下来,便于后续章节反复引用。
四、对象建模中的三个关键约定
第一,版本与生效日期。BOM 和工艺路线都可能存在多个版本。工单在创建时必须锁定一个具体版本,否则后续排产结果无法复现。例如 BOM 版本 V2 在 3 月 1 日生效,则 3 月 1 日之后创建的工单应引用 V2,之前创建的工单仍引用 V1。
第二,工序的前后置关系。工序之间通常存在“完成—开始”(FS)约束,即前道工序完成后后道才能开始。也存在少量“开始—开始”(SS)或“完成—完成”(FF)约束。排产时,工序链上的时间必须满足这些约束,插单不能破坏已有工序链的合法性。
第三,资源与日历的绑定。资源不是永远可用的,它绑定一个日历。日历中的班次、休息、停机、例外日都会影响可用时间。例如某 CNC 资源绑定“两班制”日历,周一至周五 8:00–20:00 可用,周日不可用。排产时,工序的加工时间必须落在可用窗口内,跨窗口时需要顺延。
五、一个可复用的对象关系检查清单
在建立或检查对象模型时,可以按以下清单逐项确认,避免后续排产出现“找不到资源”“时间算不出来”“插单后工序链断裂”等问题:
- 订单是否已关联物料、数量、交期和优先级?
- 该物料是否有生效的 BOM 版本?BOM 层级是否完整?
- 该物料是否有生效的工艺路线?每道工序是否指定了资源组和标准工时?
- 工单是否锁定了 BOM 版本和工艺路线版本?
- 工单是否已生成工序?工序的前后置关系是否完整?
- 每道工序引用的资源是否存在?资源是否绑定了日历?
- 日历是否覆盖了计划排产的时间范围?是否有例外日需要处理?
- 同一资源上的工序是否已形成可排序的队列?
完成对象建模后,下一步才能讨论“优先级”如何在这些对象上定义和计算。因为优先级最终要落到工序上,而工序的可用时间又由资源和日历决定。理解本节的对象关系,是后续插单执行工程的基础。