Odoo 14社区版三步配送中,如何从打包单获取拣货单?
从打包单关联对应拣货单的方法
在Odoo的多步配送流程(拣货>打包>发货)中,你可以通过以下两种方式从打包单关联到对应的拣货单stock_picking对象:
方法一:通过库存移动的上下游关联(精准匹配)
打包单的库存移动(move_ids)会关联上游拣货环节的原始移动(move_orig_ids),通过这个关联可以定位到对应的拣货单:
# 假设当前打包单对象为 packing_picking target_pickings = set() # 遍历打包单的所有库存移动 for move in packing_picking.move_ids: # 遍历每条移动对应的上游原始移动 for orig_move in move.move_orig_ids: # 根据实际拣货单的类型和状态筛选,比如拣货单是出库类型且已完成 if orig_move.picking_id.picking_type_code == 'outgoing' and orig_move.picking_id.state == 'done': target_pickings.add(orig_move.picking_id) # 提取唯一的拣货单(按你的流程应该仅存在一个) pick_picking = target_pickings.pop() if target_pickings else None
方法二:通过库存组(group_id)关联(简洁高效)
同一配送流程下的拣货单、打包单、发货单会共享同一个group_id(库存组),可以直接通过这个字段筛选:
# 假设当前打包单对象为 packing_picking pick_picking = self.env['stock.picking'].search([ ('group_id', '=', packing_picking.group_id.id), ('picking_type_code', '=', 'outgoing'), # 替换为你实际的拣货单类型 ('state', '=', 'done'), # 筛选已完成的拣货单 ('id', '!=', packing_picking.id) # 排除当前打包单本身 ], limit=1)
注意事项
- 请根据你的实际配置调整
picking_type_code的值,比如内部拣货可能用'internal',入库用'incoming' - 方法一适用于同一库存组下存在多套单据的场景,匹配更精准;方法二更适合单套流程的场景,代码更简洁
内容的提问来源于stack exchange,提问作者holydragon
相关产品推荐
相关产品推荐

