先说结论
如果你把 Odoo 质量模块理解成“做完以后补一次抽检”,那你会完全看错它在制造里的定位。
从 quality_mrp 和 quality_mrp_workorder 的源码看,Odoo 想做的是:
- 在生产单级别插入质量检查
- 在工序 / 工单级别继续插入更细的质量检查
- 如果失败,直接改变成品去向或弹出失败向导
所以质量不是制造后的附件,而是制造步骤本身的一部分。
两层嵌入:生产单级检查 + 工单级检查
制造质量检查至少有两层:
1. 生产单级
quality.check 上有 production_id,系统知道这次检查属于哪张 MO。
这带来两个直接结果:
- 允许产品范围可从
production_id.move_finished_ids.product_id推导 - 失败时可以把成品 move 的目标库位改到
failure_location_id
2. 工单级
在 quality_mrp_workorder 里,quality point 还能跟 operation_id 关联。
这意味着检查不是笼统发生在“制造完工前”,而是能卡在某个具体步骤前后,比如:
- 首件确认
- 扭矩测量
- 包装前外观放行
为什么“嵌入步骤”比“完工后补检”更重要
如果检查放在完工后,系统只能告诉你:
- 这批东西做完了
- 现在发现不合格
但如果把检查挂在工单步骤里,系统能更早介入:
- 某道工序是否允许继续下一步
- 当前失败是影响整个生产单,还是只影响某个产品 / move
- 失败后成品要不要直接去 failure location
源码里 action_pass_and_next()、action_fail_and_next()、_next() 这些方法,就是在表达这种“检查完成后驱动后续动作”的过程控制语义。
failure location 为什么关键
很多团队做制造质检,只关心 Pass / Fail 两个按钮,却忽略了失败后的物流去向。
但 quality_mrp 里很明确:
- 如果检查关联
production_id - 且质量状态为 fail
- 系统可以通过
_move_to_failure_location_operation()/_move_to_failure_location_product()把成品或指定产品 move 改送到失败库位
这件事很重要,因为它把质量与库存动作连起来了:
- 不只是“记录不合格”
- 而是直接决定库存下一步应该去哪
工单质量检查最容易被误解的地方
1. 以为 on-demand 可以随便挂到工序质量点
源码里有限制,某些频率和工序级质量点不能随意组合。
2. 以为质量检查只影响看板提醒
不是,失败可能改变 move 的目标位置,或阻断继续流程。
3. 以为 production 级和 workorder 级检查作用一样
不一样。一个更偏整张 MO 结果控制,一个更偏工序节点控制。
4. 以为质量警报和质量检查是同一个东西
不是。检查是过程节点,alert 是后续问题管理对象。
设计制造质检流程时,最该想清楚的 4 个问题
- 这道检查是针对整张 MO,还是针对某个 operation?
- 失败时要不要把成品或部分成品送去 failure location?
- 失败后只是记录,还是必须阻断下一步?
- 这道检查是在首件、每件、每批,还是特定条件下触发?
只有把这几个问题想清楚,quality point 才不是“多配几条规则”。
排错顺序
如果制造质量检查没有按预期出现或放行,按这个顺序查:
- quality point 是绑在 production 还是 operation
- 检查频率与 test type 是否和工序级限制冲突
quality.check是否正确生成并关联production_id/workorder_id- fail 时是否配置了
failure_location_id - 失败弹窗、next check 与后续工单推进逻辑是否被自定义覆盖
- 再看 alert 流程和团队分派
一句话记忆法
Odoo 制造质检的重点不是“做个检查”,而是把质量决策插进制造步骤,并让失败结果直接影响库存去向和流程推进。
DISCUSSION
评论区