Odoo 15能否在stock.move.line层级实现库存预留?
问题
我正尝试为stock.picking记录预留产品。由于拣货流程的需求,我希望在stock.move.line层级进行库存预留。我曾尝试移除其他行后仅对stock.picking进行预留操作,但系统仍会尝试预留整单。由于存在需拣选多个零散数量的情况,我必须在行层级进行预留。
请问是否真的可以在stock.move.line层级实现库存预留?
我通过以下代码创建了行,该代码可正常运行:
# Update the move line associated with the move record move_line = odoo.env['stock.move.line'].create({ 'move_id': move.id, 'product_id': product_id, 'qty_done': amount_picking, 'location_id': quant_location_id, # Use the location of the quant_id ##change to source location 'location_dest_id': move.location_id.id, 'lot_id': lot_id or False, 'product_uom_id': move.product_uom.id, # Add the missing 'product_uom_id' field 'picking_id': picking_id, })
我希望实现的效果是仅让这一行被预留。
解决方案
可以在stock.move.line层级实现库存预留,核心是通过配置行的预留字段、关联库存批次,避免触发整单预留逻辑,具体操作如下:
调整move_line字段配置
你当前的代码把qty_done设为预留数量,这是错误的——qty_done是实际拣货完成的数量,预留阶段应该用reserved_qty字段标记预留量,同时修正location_dest_id为拣货目标位置(原代码写反成了源位置)。手动关联库存批次(可选)
如果已经明确要预留的库存批次(quant),可以直接在创建行时关联quant_id;如果需要系统自动分配,可调用专属预留方法。避免整单预留
不要调用stock.picking的action_assign(),而是单独处理目标行或其对应的stock.move。
修改后的示例代码:
# 创建用于预留的move line move_line = odoo.env['stock.move.line'].create({ 'move_id': move.id, 'product_id': product_id, 'reserved_qty': amount_picking, # 设置预留数量 'qty_done': 0, # 拣货完成前留空 'location_id': quant_location_id, 'location_dest_id': move.location_dest_id.id, # 修正为拣货目标位置 'lot_id': lot_id or False, 'product_uom_id': move.product_uom.id, 'picking_id': picking_id, 'quant_id': quant_id or False, # 明确预留批次时直接关联 }) # 未指定quant_id时,触发该行的自动预留逻辑 if not quant_id: move_line._reserve_quant(amount_picking, move_line.location_id, move_line.location_dest_id)
- 额外注意:
确保对应的stock.move状态不是已完成,否则无法执行预留操作;如果需要批量处理多行,需逐行单独执行预留逻辑,避免触发整单的批量预留。
内容的提问来源于stack exchange,提问作者apexprogramming
相关产品推荐
相关产品推荐

