4. 工单数据模型设计

工单不是一张“大表”,而是一组围绕生产执行逐步展开的对象集合。MES 中一个工单从下达到完工,会同时牵动工序、物料、工艺路线、资源需求、状态与版本六类信息。如果把它们全部塞进一张宽表,字段会迅速膨胀到上百列,且不同产品、不同工艺的差异只能靠大量空字段和特殊判断来兼容。可扩展的工单对象模型,核心思路是:把工单拆成“主数据 + 明细结构 + 状态与版本”三层,用稳定的主键和引用关系把变化隔离在各自的边界内。

一、工单主数据:稳定标识与业务属性分离

工单主数据承担“这个工单是谁、要做什么、做多少”的职责。建议至少包含以下字段:

字段示例值说明
work_order_idWO-20240612-0017系统内唯一主键,不可变
order_noMO20240612017业务单号,可读、可追溯
material_codeFG-A1001产出物料编码
plan_qty1200计划数量
uomPCS计量单位
route_idRT-A1001-V3引用的工艺路线版本
bom_idBOM-A1001-V5引用的物料清单版本
statusRELEASED当前状态
version2工单自身版本号

关键设计原则是:主数据只放“不随执行过程频繁变化”的字段。实际产出数量、报废数量、当前工序进度等动态数据,应放在执行记录或工序实例中,而不是反复更新主表。这样主表更新频率低,锁竞争小,历史追溯也更清晰。

二、工序与工艺路线:把“怎么做”结构化

工艺路线描述从原材料到成品的加工顺序,工序是路线上的节点。一个可扩展的工序对象通常包含:工序号、工序名称、工作中心、标准工时、前置工序、是否关键工序、检验要求。例如:

route_id: RT-A1001-V3
  op_seq: 10   op_name: 下料    work_center: WC-CUT-01   std_time: 0.5 min/pcs
  op_seq: 20   op_name: 冲压    work_center: WC-PRS-02   std_time: 1.2 min/pcs
  op_seq: 30   op_name: 焊接    work_center: WC-WLD-01   std_time: 2.0 min/pcs
  op_seq: 40   op_name: 检验    work_center: QC-01       std_time: 0.8 min/pcs

工序之间通过 op_seq 和 pre_op_seq 建立有向依赖,而不是靠数组下标隐式表达。这样在插入临时工序、并行工序或返修工序时,不需要重排整个列表,只需新增节点并调整引用。工艺路线本身应带版本号,工单引用的是“路线版本”而非“路线名称”,这是后续版本控制的基础。

三、物料清单与资源需求:输入与能力的双向约束

物料清单(BOM)回答“每个工单需要消耗什么、消耗多少”。在工单对象模型中,BOM 不应直接复制到工单主表,而应通过 bom_id 引用,并在工单下达时生成一份工单级物料需求快照。快照记录:物料编码、单位用量、计划用量、已发料量、已消耗量。这样即使 BOM 后续升版,已下达工单仍按原快照执行,避免“中途换料”导致的数量混乱。

资源需求则回答“需要什么设备、模具、人员或能源”。它通常与工序绑定,字段包括:资源类型、资源编码、需求数量、占用时长、是否可替代。资源需求与工序是多对多关系,因此应独立成表,用 op_seq + resource_id 作为联合引用,而不是在工序表里堆叠多个资源字段。

四、状态机:用显式迁移约束执行路径

工单状态不能靠一个 status 字段随意赋值,而应定义明确的状态集合与合法迁移。推荐状态集合:DRAFT → RELEASED → IN_PROGRESS → PAUSED → COMPLETED → CLOSED,并允许 IN_PROGRESS → CANCELLED。每次状态变更都应记录:原状态、目标状态、操作人、时间戳、原因码。这样状态机既是控制逻辑,也是审计线索。

工单对象模型:主数据、结构明细与状态版本的关系 工单主数据 work_order_id (PK) material_code / plan_qty route_id / bom_id status / version 稳定标识,低频更新 工艺路线 / 工序 route_id + version op_seq / op_name work_center / std_time pre_op_seq 依赖 有序节点,支持插入 物料清单 / 需求快照 bom_id + version component_code qty_per / plan_qty issued_qty / consumed_qty 下达时生成快照 资源需求 op_seq + resource_id resource_type / qty occupy_time / replaceable 与工序多对多 状态机 DRAFT → RELEASED → IN_PROGRESS → PAUSED → COMPLETED → CLOSED 显式迁移 + 审计记录 版本控制 route_version bom_version work_order_version 引用版本,不引用名称 引用 引用 绑定 约束 管理 主数据通过 route_id / bom_id 引用版本化结构;工序与资源需求独立成表;状态机控制迁移;版本控制保证历史可追溯。 扩展方式:新增工序节点、新增资源类型、新增状态迁移,均不修改主数据表结构。

五、版本控制:让“变更”不破坏“已执行”

版本控制要解决三个问题:工艺路线升版后,已下达工单是否跟着变?BOM 换料后,已发料工单如何追溯?工单自身修改数量或交期后,如何保留历史?推荐做法是:路线和 BOM 各自独立版本化,工单引用具体版本号;工单自身也保留版本号,每次关键字段变更生成新版本记录,旧版本只读。

例如,工单 WO-20240612-0017 初始引用 RT-A1001-V3。当工艺部门发布 RT-A1001-V4 时,该工单仍按 V3 执行,除非计划员显式执行“升版”操作。升版时系统生成工单版本 2,记录新路线版本、变更人、变更时间和原因。这样既支持工程变更,又不会让在制品突然“换工艺”。

六、可扩展性的落地检查

判断一个工单对象模型是否可扩展,可以用四个问题检验:新增一种资源类型,是否需要改主表?新增一道临时工序,是否需要重排已有工序号?BOM 升版后,已下达工单是否仍能按原快照追溯?状态新增一个“待料暂停”,是否只需增加迁移规则而不改业务代码?如果答案都是“不需要大改”,模型就具备了工程可用的扩展性。

实践建议:工单主数据表字段控制在 20 个以内,动态执行数据放入工序实例表和物料消耗记录表;所有跨表引用使用“业务主键 + 版本号”组合,避免仅用名称引用导致升版后指向漂移。

最后需要强调,工单对象模型不是一次设计完就固定不变的。随着产线增加、工艺变化、质量追溯要求提高,模型需要定期评审。评审的重点不是“字段够不够多”,而是“变化是否被隔离在正确的边界内”。主数据稳定、结构明细可扩展、状态与版本可追溯,这三条同时成立,工单才能真正支撑 MES 的执行闭环。