企业 条码履约

Odoo 企业版条码拣货为什么不是“扫完即 done”:未完成 move 拆分、回单生成与过度预留截断

post_barcode_process() 的核心不是收尾,而是重算事实:已拣未完的 move 会拆成已完成与待回单两部分,条码前端额外生成的 move line 还会触发过度预留数量截断。

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

仓库现场常把条码扫描理解成“把数量录进去就结束”。企业版真正复杂的部分,其实发生在扫描之后。

这篇文章主要参考:

  • enterprise/stock_barcode/models/stock_move.py

一、扫描结果不会直接原样落库,系统还要先“整理事实”

post_barcode_process(barcode_quantities) 做了两件大事:split_uncompleted_moves() 把已拣但未完整完成的 move 拆开,_truncate_overreserved_moves() 把因为前端扫描创建 move line 而导致的过度预留数量截断回来。这说明条码端录到的只是现场动作草稿,真正入账前还要做一次后处理清洗。

二、为什么要拆未完成 move

一条 move 里既可能包含“已经拣到的量”,也可能还有“没拣到的剩余量”。如果继续混在一条 move 上,后续回单、差异和追溯都会变得模糊。因此源码会对已拣未完成 move 走 _create_backorder(),必要时手工 _action_assign(),再按 picking 分组 _merge_moves(),把部分完成这件事表达成系统可结算的结构。

三、为什么还要处理 overreserved

条码前端为了让扫描顺畅,可能会先生成 move line,再回头让后端收敛数量。_truncate_overreserved_moves() 会拿 quantity_donereserved_uom_qty 的较大者作为上限。如果 move 当前数量更高,就在 unreserve_unpicked_only 上下文里把数量截回去。它不是简单按已完成量截,而是兼顾“已做”和“已保留”的上限。

四、结论

企业版条码模块真正厉害的地方,不在“能扫码”,而在扫完以后还能把现场不完整、带时序差的操作,重写成一套可追踪、可回单、可继续分配的库存事实。

DISCUSSION

评论区

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