仓库现场常把条码扫描理解成“把数量录进去就结束”。企业版真正复杂的部分,其实发生在扫描之后。
这篇文章主要参考:
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_done 与 reserved_uom_qty 的较大者作为上限。如果 move 当前数量更高,就在 unreserve_unpicked_only 上下文里把数量截回去。它不是简单按已完成量截,而是兼顾“已做”和“已保留”的上限。
四、结论
企业版条码模块真正厉害的地方,不在“能扫码”,而在扫完以后还能把现场不完整、带时序差的操作,重写成一套可追踪、可回单、可继续分配的库存事实。
DISCUSSION
评论区