搞制造业ERP的朋友,对物料清单(BOM)改版这种事的麻烦程度应该都不陌生。工程师在系统里改了1个用量字段,图纸还是旧版;采购看到了新BOM,仓库还按旧BOM入库;生产工单打印出来的又是另一份配方。最离谱的是,等一批货都造完了,才发现工程变更单(ECO)根本没有走完流程,旧物料早就停产,新的替代料还在技术部抽屉里。我在 Odoo 18 上把这套流程重新整理了一遍,发现新版 PLM 模块把 BOM 和产品变更变成了可以管控的工作单:每次改动都挂在工程变更单下面,有状态、有版本、有审批记录,甚至可以查出来是谁、在什么时间、因为什么原因改了哪个字段。这篇文章就围绕 Odoo 18 PLM 中物料清单和产品两个入口,完整讲一遍工程变更单的处理思路和实际操作。
1. 项目背景:为什么工程变更必须交给 PLM,而不是直接改表
1.1 直接改 BOM 的代价
很多公司在刚上 Odoo 的时候,并没有认真对待工程变更这件事。工程师要改一个零件,最常见的做法是打开物料清单,找到那一行,把用量从 2 改成 3,保存,完事。听起来很高效,但代价会在三周之后集中爆发。
直接改 BOM 的第一个问题是没有审计。改动前是多少、改动后是多少、谁在什么时间改的、为什么要改,全都没有留下有效记录。第二个问题是没法走审批。就算你们企业对外说自己有“变更流程”,实际执行时也只是群里面吼一声“我改了轴承型号啊”,项目经理点个头,改单的人就已经做完了。第三个问题是版本混乱。同一条产线、同一张 BOM,工程师 A 改了用量,工程师 B 又在同一张单子里换了一批替代料,两个人都认为自己是对的,结果生产领料时才发现两版配方混在一起。
我见过一个非常典型的例子:一台设备的关键组件 BOM 中,有一行组件本来用的是“铜垫片”,工程师为了降成本直接改成了“尼龙垫片”,没有走任何流程。三个月后客户投诉设备漏油,追溯时发现尼龙垫片在高温环境下老化失效。这时候再想去查当初谁改的、为什么改,系统里只有一条操作日志写着“用量修改”,没有审批单,也没有变更原因,整个追溯链条当场断掉。
1.2 Odoo 18 PLM 模块在整条链路里的位置
Odoo 18 的 PLM 模块,严格来说不是一个独立的“设计软件”,它是工程部门和制造、采购、库存之间的连接器。PLM 负责管理三样核心内容:产品定义、物料清单、工程变更单。其中物料清单是制造模块的根基,产品定义是采购和销售模块的根基,而工程变更单就是把这两个“根基”上所有改动串起来的那根线。
你可以把 PLM 理解成“工程部门的中控台”。设计师在企业外部用 CAD 画图也好,直接用 Odoo 表单维护产品也好,最终要落地到生产,必须经由 PLM 做一次“换挡”操作。这个换挡操作就是工程变更单:明确本次要改哪些产品、改哪些 BOM 行、改完之后产品是不是要停用、是不是要升级版本、需要谁审批、从几号开始生效。
和过去直接在 BOM 上改一个字段相比,PLM 的优势是它把“修改”这件事情本身变成了一条带状态的记录。你不再是在表格里点两下,而是在创建一张单、提交、审批、发布等一系列可控动作。所有相关方看到的是同一条变更链,而不是各自脑补出来的“最近一次修改”。
1.3 启用 PLM 之前的准备
安装 PLM 模块本身很简单:打开 Odoo 18“应用”菜单,搜索“PLM”,找到“PLM by Odoo”直接安装。但如果你只装了 PLM,没装“制造”,那基本等于买了一台没有发动机的车。PLM 依赖 MRP 模块里的物料清单、工艺路线、生产订单等基础数据,所以我通常的建议是先安装“制造”模块,把基础物料、仓库、采购规则都配置好,再安装 PLM。
装完模块之后,还需要在制造模块的设置里打开“工程变更”相关选项。这一步很多人会忽略,结果工程师在 BOM 页面上找不到“创建工程变更”按钮。在 Odoo 18 的设置里,进入“制造”模块,勾选“启用工程变更”和“启用可配置式 BOM”。勾完之后刷新浏览器,物料清单表单顶部的动作按钮里就会多出工程变更相关入口。
提示:尽量不要在已经跑了三个月生产、BOM 数据很脏的情况下直接启用 PLM。先把重复的 BOM 清一遍,把产品名称、单位、型号这些基础字段统一好,否则变更单关联到错误产品以后,你会花更多时间在清理关联数据上。
2. 工程变更单(ECO)的核心机制
2.1 ECO 到底是一张什么样的单
ECO 是 Engineering Change Order 的缩写,Odoo 18 里叫“工程变更单”。它本质上是一张“清单式工作单”,不是简单的一条通达记录。单头上你可以填:变更针对的产品、希望生效的日期、优先级、负责人、变更原因说明。单子上可以挂一批“变更行”,每一行代表一个具体动作。
打个比方:你在家里照着菜谱做菜,突然想改用低钠盐。直接改菜谱偷吃是“非法修改”,没过问任何人。而 ECO 就是写着“今天将盐从 3 克改成 2 克”的一张红色通知单。通知单先记录打算怎么改、为什么改、谁批准,通过之后才把新菜谱誊写到主本上,而且旧主本还能用来回看对比。
在 Odoo 18 的 ECO 表单上,你会看到多个按钮或选项卡,分别对应不同类型的变更:比如“物料变更”、“物料清单行变更”、“工艺路线变更”、“产品属性变更”等。每个选项卡都可以往里加行。字段不外乎是“变更类型”、“物料/组件”、“数量”、“生效范围”。这些变更行最后都会被系统逐条解读,在 ECO 发布时真正应用到底层 BOM 或产品上。
2.2 工作流状态与阶段设计
Odoo 18 的 PLM 工程变更单在使用上并不是单一路径,不同的企业版本和配置会有不同的状态表现。但我建议你始终围绕一个基本的四阶段闭环来做,不要因为系统灵活就跳步:
- 草稿阶段:ECO 刚建立,变更行可以随便改,不影响生产。
- 审批阶段:提交之后进入评审,相关人员看差异、提意见。
- 发布阶段:审批通过,系统把变更行写入真正的 BOM 或产品。
- 归档阶段:变更确认做完,关闭单据,留档备查。
Odoo 本身支持对工程变更单做看板视图,你可以按阶段拖拽卡片,也可以在表单里通过“确认”“批准”“应用变更”这类按钮推进。一般我会在配置里建三个看板列:待处理、已批准、已发布。工程师把变更单提交到“待处理”,工程经理把审批通过的拖到“已批准”,最后由系统或专人执行发布。
这个设计最大的好处是可以强制“先审批后生效”。任何没有审批关系的变更,都无法被系统自动应用到底层 BOM。这对制造企业来说特别重要,因为它把过去只靠人情的流程,变成了一条硬约束。
2.3 角色与权限配置
我在给企业做 Odoo 落地时,最常遇到的一个问题是“所有人都能审批”。这听起来不像是问题,直到某次变更在几个小时后被生产线发现有问题,追查时发现审批人是做销售的,他只是在 OA 上习惯性点了同意。
Odoo 18 的权限体系里,工程师组和管理员组默认能力不同。我一般建议这样配:
- 工程师:能创建和编辑 ECO、能提交变更,但不可点最终批准。
- 生产经理 / 工程经理:能审批、能发布,能看到变更对库存和采购的潜在影响。
- 管理员:只在异常处理时使用,日常不碰审批,避免“最高权限顺手通过”。
权限配置时还有个细节:PLM 变更单会关联到具体产品和 BOM,所以负责这个产品线的工程师至少要有该产品、该 BOM 的读取权限,否则他在变更单里看不到任何可编辑的字段,会很困惑。
注意:千万不要为了让操作方便,把所有用户都塞进“制造/管理员”组。一旦有用户在权限组里,他能直接绕过 PLM 去改 BOM,所谓工程变更流程就形同虚设了。
3. 从物料清单发起工程变更:完整实操流程
3.1 入口:从 BOM 表单创建 ECO
我们拿一个小案例来说。假设你们公司做一台“伺服电机座”,物料清单里有四行:机座铸件、轴承 6020、端盖密封垫、M8x25 螺栓。现在客户反馈轴承 6020 在高温工况下寿命差,工程部决定换成更大一号的轴承 6220,同时把机座铸件的内孔直径跟着加大,端盖密封垫保留,螺栓用量从 4 颗改成 5 颗。
在 Odoo 18 中,你可以直接打开这张 BOM 表单,在页面顶部的“操作”下拉菜单里找到“创建工程变更”入口。点进去以后,系统会自动把当前 BOM 带进新 ECO,并关联到该产品。这样有一个好处:变更单里默认就知道这张 BOM 是“伺服电机座”的,后续要更新的物料行也不会关联错。
如果你没在产品或 BOM 上看到这个入口,别慌。你可以直接到“PLM”应用下新建工程变更单,手动指定“产品”和“物料清单”。两种方式效果一样,但从 BOM 页面创建可以减少人为选错对象。
3.2 在 ECO 里维护物料清单变更行
ECO 表单建好之后,重点在“物料清单变更”选项卡里。这里的逻辑很简单:你要告诉系统,这个组件在原 BOM 的哪一行存在,针对这一行做“添加”、“修改”还是“删除”。
继续上头的案例。我在“物料清单变更”里加一行:
- 物料清单:伺服电机座 BOM
- 变更类型:修改
- 组件:轴承 6020
- 新组件:轴承 6220
- 数量:1
- 变更原因:客户反馈高温工况寿命不足,更换为更大号轴承
再加一行:
- 变更类型:修改
- 组件:机座铸件
- 新组件:机座铸件(新版内孔)
- 数量:1
- 变更原因:匹配 6220 轴承外形尺寸
最后把 M8x25 螺栓这一行改成 5 颗,类型选择“用量变更”。
填完之后,ECO 表单里通常能看到一个“变更前 / 变更后”对比效果。有些视图会直接列出旧用量和新用量,方便审批人一眼看出哪里变了。不要小看这个对比功能,审批时最怕的就是“说改 A,实际把 B 也改了”,对比视图能极大降低人工核对成本。
3.3 BOM 版本和生效日期处理
工程变更最大的一个决策点:这次改动是“立即改掉现有 BOM”,还是“另起一个新版本,到了时间自动切换”。
Odoo 18 的 BOM 已经支持版本和生效日期。在 ECO 中,你可以明确指定这次变更是更新当前版本,还是创建一个全新的 BOM 版本。比如你想从 3 月 1 日开始切换新配方,就在变更单里设置新版本的生效日期,并把旧版本的失效日期写成 2 月 28 日。
生产上有个常见误解:新版本发布了,旧版本就彻底没用了。实际上很多企业的旧产品还要继续生产,新规格只是针对新订单。所以你在处理 BOM 版本时要想清楚:
- 如果旧品完全停产,直接替换无妨。
- 如果新旧并存,一定要分别维护两条 BOM 记录,在产品上指定默认 BOM。
- 如果只是阶段性切换,设置好生效日期,让 Odoo 在日期到达后自动切到新版本。
我见过不少工程师偷懒,把所有旧 BOM 全部“失效”。结果跨了几个月的售后维修要再生产旧备件,临时又找不到旧 BOM,只能在系统里手工重建。正确的做法是保留旧版本并标记“过期”,一旦遇到售后订单还能通过历史版本恢复装配清单。
3.4 变更后的 BOM 联动和采购影响
ECO 发布后,Odoo 会自动更新物料清单,然后生产订单、物料需求计划、成本计算都会跟着变。比如刚才把螺栓用量从 4 改成 5,系统在跑 MRP 或生成采购建议时,就会按每台 5 颗去算需要多少库存。轴承从 6020 换成了 6220,采购部门拿到的物料需求清单也会自动指向新料号。
这里有一个很容易踩坑的地方:变更单里的“数量”指的是新用量,但有些工程师会把它误填成“相对变化量”。比如原来用量是 4 颗,想改成 5 颗,是填 5,不是填 1。我在 Odoo 里见过把数量填成 1 之后,整条 BOM 行变成“每台机器只配 1 颗螺栓”的乌龙,扩散到采购时浪费了两三天。填完变更行之后,建议你切到对比视图再复核一遍相对值,确认“从 4 变成 5”而不是“填错成 1”。
注意:在 BOM 里直接删除正在被生产订单使用的组件,容易导致已经确认的工单出现“找不到物料”的报错。如果是替换物料,尽量在变更单里同时把“旧组件停用”和“新组件加入”做成两个动作,并且关注库存里的旧料余量。
4. 从产品层面处理工程变更
4.1 产品字段变更怎么通过 ECO 完成
PLM 不只是改 BOM 行,它还能直接改“产品”档案。这个功能被用得最多的是两种情况:一是产品要从“采购件”改成“自制件”或反过来;二是产品的库存追踪方式要从“无追踪”改成“批次”或“序列号”。
举个例子。你们某个零件原本一直是外购的,现在老板决定买两台注塑机自己做。这时候你不需要跑到产品表单里手动改“产品类型”字段,可以在工程变更单里增加一条产品属性变更,明确新旧值。发布之后,Odoo 会同步把这个零件从“可采购”切换成“可生产”,并且会提示你是否需要创建对应的 BOM 和工艺路线。
同样的道理,一个设备装配件如果从“整台卖”改成“序列号追踪”,这属于严格的产品主数据变更。过去直接在后台改字段,万一改坏了,可能连原始值都记不清。用 ECO 来做就会留下一条记录:变更前是 no tracking,变更后是 serial number,审批人签字,理由写在原因栏里,后续出了问题还能追溯。
4.2 产品模板、变体和 BOM 的匹配问题
做服装、鞋帽、电子产品的朋友要注意,Odoo 里的“产品”有产品模板和产品变体两层概念。模板通常是一类产品,比如“冲锋衣-经典款”,变体则是带不同颜色、不同尺码的具体 SKU。
在 ECO 里改 BOM 时,系统可能提示你要针对“产品模板”还是“产品变体”的 BOM。很多初用者直接选了模板上的 BOM,结果发布之后发现只有某个特定变体收到了更新,其他颜色尺码还是旧 BOM。
我在实际项目中的建议是:变更行里尽量把“产品”字段精确到具体变体,不要偷懒只选模板。如果你确实希望模板下所有变体都一起改,那就要在 BOM 行的配置条件上处理清楚,保证每个变体都能匹配到这条更新的 BOM。
这个步骤很繁琐,但也是 PLM 存在的意义之一。Odoo 不像一套简单的 Excel 表可以直接全选覆盖,它通过变更单让你逐一确认“这次改动到底影响哪些颜色、哪些尺寸”,避免生产线上出现同一个型号两种配方并存。
4.3 产品生命周期:停用、替代与恢复
产品数量一多,总有些“半死不活”的料号。不用 PLM 的时候,产品停用往往是在后台把 available 勾选去掉。让采购下不了单就算完了。但停用之后,旧 BOM 还在,库存也还有,甚至客户返修还要领旧料,系统没有任何提示。
用 ECO 来处理产品停用,效果会好很多。你在变更单里把产品的“有效”字段从开改为关,同时可以填一个“替代产品”。这样当采购在询价单里想选旧料时,系统会给出替代提示,告诉你这个产品已经停用,你是否要换到新产品。
反过来,有些产品因为售后市场又恢复了需求。这时候不要直接到后台把“有效”打勾,而是新建一条 ECO,写明“恢复产品 A,替代原产品 C”,发布后系统自动把有效字段改回开。这样产品履历里就清清楚楚地记着:哪天停的、哪天恢复的、为什么恢复。
4.4 对在途库存和生产订单的影响节奏
产品主数据一旦变更,很多人最担心的就是“会不会把正在做的工单搞乱”。Odoo 18 的设计不会粗暴破坏已经确认的制造订单。已经领料、已经生产的工单,BOM 快照也已经锁定了,即使你把物料清单换了一版,已经下达的工单依然按旧 BOM 执行。
这一点在 ECO 发布前想明白很有用。如果你在生产旺季推新版本,可以算好一个时间点:旧 BOM 覆盖手头所有在途工单,新 BOM 从下一批新工单开始。在 ECO 里把生效日期推迟,而不是一发布就当天生效,生产现场就不用考虑“这张单到底是按哪个版本”。
当然,如果确实需要把某个已经开工的订单强制改成新版本,你可以在制造订单里人工重选 BOM,或者在订单尚未开始前取消重新确认。但这属于特殊情况,不建议作为常态操作。
5. 审批、发布与全过程追溯
5.1 把多人审批流程做进系统
工程变更最忌讳单人拍板。一套严谨的 ECO 审批流程,至少会涉及三层:提出人、技术负责人、生产或计划负责人。提出人负责把变更内容写清楚,技术负责人判断方案是否可行,生产和计划负责人评估库存切换、采购期和生产线混料风险。
Odoo 18 默认的 PLM 工作流不会替你做企业专属的审批设计,但它有条件让你们把规则沉淀下来。你可以把 ECO 放到看板里,通过阶段迁移实现一级级审批;也可以在 ECO 上挂“活动”(Activity),指定一个审批人在弹出的待办里点同意或拒绝。实际操作中,我推荐三种信息一次性填齐:
- 变更原因:不要写“客户要求”,要写具体是什么问题导致变更。
- 影响范围:说明受影响的 BOM、产品、客户订单、在途库存。
- 切换计划:什么时候生效、采用什么方式发布。
审批人在系统里看到的不应该只是一句话,而是一份可以决策的变更说明。如果你们企业在变更单上把理由都写成“优化”、“临时调整”,那审批流程最后就是走过场。
5.2 发布动作和系统后台的变化
ECO 审批通过后,下一步就是发布或应用变更。这个动作一旦执行,Odoo 会把之前填好的物料清单变更行、产品属性变更行逐条写入最终单据。
发布之后你回到对应的物料清单页面,会看到那一行的组件已经换成新的,用量也已经修改,BOM 版本号通常会更新。产品页面也能看到有效字段、制造方式、追踪方式等相应变化。更关键的是,PLM 的“变更历史”里会自动生成一条关联,记录这一版 BOM 是通过哪张 ECO 发布更新的。
我在操作时一般会做两步复核。第一步,回到 ECO 看对比视图,确认变更行全部显示为“已应用”。第二步,打开发布后的 BOM 草稿,把关键几行再肉眼扫一遍。不要嫌麻烦,Odoo 再聪明,也需要人做最终确认,尤其是涉及多行多产品批量发布的时候,一条漏掉的行会在生产线的某个周一早上突然显灵。
提示:如果 ECO 里面还挂着“待处理”的变更行,系统通常会阻止你点最终完成。原因就是为了避免一张变更单只应用了一半就当办结。所以当你发现“完成”按钮灰掉时,第一件事不是找 IT,而是去变更行列表里看哪一行还停留在待处理。
5.3 发布之后如何追踪和修正
PLM 的价值不在于发布那一刻,而在于发布之后还能拉出一条完整的追溯链。Odoo 18 的产品和物料清单页面上,通常会有“工程变更”或“变更历史”相关的统计标签。点进去就能看到:这张 BOM 一共被哪些 ECO 动过,每一次改动对应什么原因、什么审批状态。
这条链对质量溯源极其有用。试想客户投诉某批次产品使用了旧料,你不需要翻 Excel,也不需要问工程师“你上次究竟有没有确认”,直接在产品 BOM 的变更历史上看时间线:旧组件在什么时间被停用,新组件从哪张 ECO 开始启用,当时库存里还剩多少旧料。整个过程清清楚楚。
如果发布后发现错了怎么办?我的建议是绝对不要直接去 BOM 上把字段改回来,因为那样会把审计链条切断。正确做法是新建一张反方向的 ECO,比如原来把轴承 6020 改成 6220,现在反过来把 6220 改回 6020,并在原因里写明“撤销 #ECO-0001,原因:新料可靠性验证未通过”。这样系统里就保留了两次变更的完整记录,看起来像绕了一圈,但审计上是干净且可辩护的。
6. 常见问题与排查技巧实录
6.1 变更单无法推进到下一步
这个问题出现频率非常高。ECO 填完了,点了提交或确认,结果按钮没反应,或者弹了个红色报错。
遇到这种情况,先检查权限。确认当前用户具备“工程经理”或审批相关权限。然后在变更单里查看是否还有未填完的必填字段,特别是“变更行”和“审批人”。有时候你把 BOM 行填了,但忘了填产品,系统就会卡在验证环节。
还有一种情况是审批人没有收到待办。在 Odoo 18 里,如果你通过“活动”方式指定审批人,审批人的界面里应该有一个任务徽标。如果没看到,检查是不是把审批人指定成了没有权限的外部门用户。不能怪系统,只能怪一开始权限配置的时候就漏了人。
6.2 新 BOM 版本没有自动切换
你说设置了新版本生效日期,到了那天发现生产订单还是引用旧 BOM。这通常和“默认 BOM”字段有关。在 Odoo 里,一个产品可以挂多个 BOM,但真正被制造订单默认读取的,是在产品上指定的那个 BOM,或者当前满足生效日期条件的 BOM。新版本发布后,你要确认产品页面上关联的默认 BOM 已经指向新版本,或者让旧版本失效。
如果产品有多个变体,这个问题更隐蔽。你可能只给其中一个变体创建了新 BOM,另一个变体仍然指向旧 BOM。生产时选了另一个变体,出来的自然就是旧配方。排查思路很简单:打开产品变体,看它的“物料清单”标签页,确认到底挂的是哪一版。
6.3 在产品停用之后,系统仍允许选择
这个现象通常不是权限问题,而是你和系统之间对“有效”字段的理解不一致。Odoo 的可用字段只是控制新单据里能否默认选择,但历史往来记录、已存在订单行依然能带出该产品。
如果你的目标是彻底禁止新采购单选择旧料,只靠产品“有效”可能还不够。建议在采购模块或品类设置里做额外的限制,或者在 ECO 里明确填写“替代产品”,让系统在用户选择旧料时给出替代提示。想靠一个开关管住所有入口,往往是徒劳的。
6.4 制造订单打印出来还是旧 BOM
我在现场遇到过不止一次:工程师明明发布完新 BOM,车间领料单还是旧的组件。检查后发现,制造订单在确认时就已经把 BOM 快照固化到了工单上。ECP 发布新版本,不会把已经确认的旧工单强行改成新配方。
所以我给一个非常实用的操作建议:如果变更发生在订单确认之前,取消原订单重新确认,工单会重新拉取最新 BOM。如果订单已经进入执行阶段,就不要硬改了,按旧工单把眼前这批做完,从下一张新工单开始切换新配方。硬改一张已经领料的工单,库存变动会乱成一锅粥,追溯时更加说不清。
6.5 多级 BOM 改了子件,父件没有重新计算
很多产品是多级结构:成品是总装 BOM,里面有组件;组件自己又有一张 BOM,包含更小的零件。你在 ECO 里改了组件的 BOM,认为总装 BOM 也会自动变,结果发现总装的成本、可用性、采购建议没变化。
这里要理解 Odoo 的逻辑:总装 BOM 引用的是“组件产品”,而不是直接引用组件内部的子件。组件 BOM 变化后,总装 BOM 的“物料结构内容”并不会动态显示到明细里,它只会通过 MRP 运算时逐层展开。所以如果你看到总装 BOM 明细里没有变化,不代表变更失败,而是层次展开的机制如此。要验证,最好跑一次 MRP 计算或模拟制造订单,看系统给这颗组件生成了什么子件需求。
独家避坑技巧:做多级 BOM 变更时,别只盯总装的预览界面。我习惯在发布 ECO 后,直接开一个新的“制造订单”草稿,选择最终成品,查看系统展开出来的需求明细。这样能看到完整物料层级,比在静态 BOM 页面里反复刷要可靠得多。
最后分享一点实战体会
用了 Odoo 18 PLM 这么长时间,我个人最大的感触是:这个模块并不负责“替你做工程决策”,它只是把工程决策的全过程暴露在阳光下。真正让变更流程顺畅运转的,是企业自己有没有把“变更理由”和“生效计划”写清楚。很多团队败给的不是系统,而是把 ECO 当成一张快速改资料的表单,填完就点通过,根本没把审批、追溯和切换时点当回事。
如果你正准备在企业里推进 PLM,我的建议是从一个小产品线开始试点,先让工程师把最近三个月的 BOM 变更全部通过 ECO 来走,哪怕是换个螺丝也走一遍。两个月后,你再看那个产品的变更历史,就会直观感受到记录的价值:透明、可审、可回滚。这些短期的“麻烦”,换来的是长期再也不怕客户审计和内部扯皮。