先说结论
在 Odoo 里,MO 负责表达“要生产什么”,而 Work Order 负责表达“现场具体怎么做”。
你可以把它记成:
MO 是整单视角,Operation 是工艺设计,Work Order 是实际执行单元。
所以工单绝不是 MO 下随便挂几个步骤那么简单。
Operation 和 Work Order 不是一回事
很多人第一次接触制造,会把这两个词混在一起。
但它们分别对应两层:
- Operation:定义在 BOM / Routing 上的工艺步骤模板
- Work Order:MO 确认后,根据这些步骤实际长出来的执行记录
也就是说,Operation 更像蓝图,Work Order 更像施工任务。
官方源码里最关键的关系
从源码可以看到:
mrp.bom有operation_idsmrp.production有workorder_idsmrp.workorder挂着operation_id、workcenter_id
这说明系统设计非常明确:
- 工艺步骤先定义在 BOM 上
- MO 落地后再实例化成具体工单
- 工单才进入工位、时间、执行和阻塞关系
为什么工单对制造现场这么重要
因为制造现场最关心的不是“有一张 MO”,而是:
- 下一步哪个工位做
- 哪个步骤被前序阻塞
- 实际做了多久
- 原料该在哪个步骤消耗
- 副产品在哪个步骤产出
这些都更接近 Work Order,而不是 MO 头信息。
所以 Odoo 把很多执行层字段都放到了工单这边。
阻塞关系为什么很关键
在 mrp.workorder 里,官方维护了:
blocked_by_workorder_idsneeded_by_workorder_ids
这说明 Odoo 并不是把制造步骤当成线性文本,而是真把它当成有依赖约束的执行图。
所以某个工单不能开工,不一定是系统卡你,而可能是前置工单还没完成。
为什么工位和工单强绑定
因为 Operation 只是“做什么”,工位还解决“在哪做”。
源码里 operation_id 改变时,会联动 workcenter_id、名称等信息。
这背后的含义是:
制造不是只有工艺顺序,还要落到实际产能资源。
一旦进入工位,就会牵涉:
- 冲突
- 计划开始/结束时间
- 产能占用
- 实际时长与成本模式
新手最容易误解的 4 件事
1. 以为 Work Order 只是 MO 的子表
其实它承载的是现场执行语义。
2. 以为 Operation 和 Work Order 是同义词
前者偏模板,后者偏实例。
3. 以为制造排程只看 MO 时间
真正落地时更常看工位与工单冲突。
4. 以为原料消耗和副产品只跟 MO 有关
很多执行细节其实和具体 operation / workorder 绑定。
一句话记忆法
Operation 负责定义工艺,Work Order 负责执行工艺;MO 管整单,工单管现场。
DISCUSSION
评论区