企业 Shop Floor

Odoo 企业版 Shop Floor 为什么有时自动带出 lot/serial、有时却必须现场再扫:预填批次、序列生成与组件登记边界

Shop Floor 不是统一的扫码界面。mrp_workorder 会根据 picking type 的 prefill_shop_floor_lots、保留批次、成品/副产品的追踪方式和工位测试流程,决定哪些 lot/serial 可以直接带出,哪些必须由现场重新选择、生成或确认。

企业 制造
进阶 开发者 1 分钟阅读
0 评论 0 点赞 0 收藏 5 阅读

很多人把 Shop Floor 理解成“把工单搬到平板上,再给几个扫码按钮”。

但 Odoo 企业版在批次号和序列号这件事上,非常明确地划了一条边界:系统可以帮你预填、帮你带出、甚至帮你生成,但不会把所有追踪决策都替现场做掉。

这篇文章主要参考:

  • enterprise/mrp_workorder/models/stock_picking_type.py
  • enterprise/mrp_workorder/tests/test_shopfloor.py
  • enterprise/mrp_workorder/static/tests/tours/tour_shopfloor.js

一、先看总开关:prefill_shop_floor_lots 不是体验优化,而是责任划分

stock.picking.type 在企业版里新增了 prefill_shop_floor_lots

帮助文字写得很直白:

  • 打开时,组件 move 上已经预留的批次/序列号会显示在 Shop Floor
  • 关闭时,现场处理组件时永远需要手动选择

这说明它不是一个“UI convenience”小配置,而是在决定:

  • 系统预留是否足够可信,能直接拿来给操作员确认
  • 还是必须把最终 lot/serial 的选择权放在工位现场

对离散制造来说,这个边界很关键。

因为很多企业不是不知道该用批次追踪,而是不敢让系统自动替人确认“这一次到底拿了哪一个 lot”。prefill_shop_floor_lots 实际上就是把这种治理选择显式配置化。

二、能自动带出的前提,是后台已经有“被保留的答案”

当这个开关开启时,Shop Floor 并不是凭空猜 lot/serial。

它能带出的,前提是后台组件 move 已经有保留结果。也就是说,前面的库存分配、预留、库位与可用批次选择,已经先在库存链路里形成了一个“候选答案”。

于是 Shop Floor 做的事情更像是:

  • 把后台已经保留的追踪结果带到工位端
  • 让现场继续执行、核对、必要时调整

而不是:

  • 在工位界面里临时决定整条库存追踪逻辑

这也是为什么同样是扫码作业,有的企业会觉得 Shop Floor “很聪明”,有的企业却觉得“怎么还要我自己选”。因为它依赖的不是页面本身,而是你前面库存预留链路做到了哪一步。

三、成品或副产品需要 SN 时,系统可以帮你生成,但仍然要在正确节点确认

test_generate_serials_in_shopfloor() 对这个设计说明得非常清楚。

这个测试做了几件事:

  • 开启 tracking 与 by-product
  • 建一个带副产品的 BoM
  • 让副产品 byprod 走 serial tracking
  • 在 Shop Floor 里打开副产品登记向导
  • 输入 00001,并通过 many2one 创建生成该序列号
  • 保存后完成工单
  • 最终断言 mo.move_byproduct_ids.lot_ids.name == "00001"

这里最值得注意的不是“可以生成序列号”,而是生成动作被放在工位作业流程的业务节点里

Odoo 没有在后台悄悄替你生成一个随机序列号直接完成,而是要求操作员在副产品行上进入向导、确认或创建序列,再继续完工。这意味着:

  • 系统可以辅助生成追踪对象
  • 但追踪对象的业务确认,仍然属于作业过程的一部分

这正是企业版 Shop Floor 的一贯风格:给自动化,但不偷走责任。

四、组件登记、成品登记、副产品登记,其实不是同一种“扫描”

从测试和前端 tour 可以看出,Shop Floor 里至少有三类不同的追踪动作:

  1. 组件消耗登记:更多依赖 move 预留、现场确认和数量变更
  2. 成品登记:要处理产量、qty producing、追踪方式以及是否自动结单
  3. 副产品登记:要额外考虑 cost share 之外的 lot/serial 绑定与产出确认

这三类动作虽然都发生在同一个工位界面,但后台语义完全不同。

所以不要把 Shop Floor 当成一个“大而全的扫码壳子”。它本质上是在同一个入口里,承载不同业务对象的确认动作:

  • 有的是确认库存消耗
  • 有的是确认成品产出
  • 有的是确认追踪实体本身被创建并绑定

五、为什么企业现场最容易误解这里

最常见的误解是:

既然系统知道我这张 MO 该消耗什么料、该产出什么货,为什么不能全部自动填完?

答案是:因为“知道应该发生什么”,不等于“知道现场实际发生了什么”。

尤其在 lot/serial 追踪场景里,系统需要在三个目标之间权衡:

  • 效率:尽量少让操作员重复输入
  • 可追溯性:最终 lot/serial 必须准确
  • 责任边界:谁确认了哪一个追踪对象,必须说得清

prefill_shop_floor_lots、生成 serial 的向导流程、组件/副产品分别登记,都是围绕这三个目标做出来的折中。

六、这套设计真正适合什么工厂

如果你的工厂:

  • 组件 lot 通常在发料前就已分配好
  • 现场更像核对和执行,而不是临时决策
  • 对成品或副产品的序列号确认要求高

那么企业版 Shop Floor 这套机制会很好用。

因为它让“库存系统已知答案”和“现场最后确认动作”能顺畅接起来。

但如果你的现场经常边做边找料、边做边决定批次,那你就不能期待 Shop Floor 自动带出一切;你更应该把重点放在库存预留和作业纪律上。


结论

Odoo 企业版 Shop Floor 对 lot/serial 的处理,不是“能不能扫码”这么简单。

它真正做的是:把预留结果、工位确认、序列生成和组件/副产品登记拆成不同责任层级。

所以有时它会替你带出 lot/serial,有时却坚持让你在现场再扫一次——这不是不智能,而是在保护追踪准确性和责任边界。

DISCUSSION

评论区

想参与讨论?先 登录 再发表评论。
还没有评论,你可以成为第一个留言的人。