Odoo15自定义模块创建出库操作:库存数量异常增加问题
Odoo15 库存扣减异常问题修复方案
你的代码里有几个关键错误导致库存不仅没扣减反而异常增加,以下是问题分析和修正后的代码:
问题根源
- 库存方向搞反了:你给
stock.move的location_id直接传了rec.stock_delivery_id.id(这应该是出库类型ID,不是位置ID),而且源位置和目标位置的逻辑完全颠倒,导致库存从目标位置往源位置移动,自然会让库存增加。 - Move与Picking关联格式错误:
move_ids_without_package是Many2many字段,直接传对象实例会导致关联异常,必须用Odoo标准的Many2many赋值格式。 - 冗余步骤干扰:
action_set_quantities_to_reservation会把预留量同步到已完成量,和你提前设置的quantity_done冲突,反而打乱了库存计算。
修正后的代码
def action_confirm(self): for rec in self: # 先确认出库类型对应的源/目标位置 picking_type = rec.stock_delivery_id # 创建库存移动,确保方向是从库存位置转出 move = self.env['stock.move'].create({ 'name': 'Use on MyLocation', 'location_id': picking_type.default_location_src_id.id, # 库存源位置 'location_dest_id': picking_type.default_location_dest_id.id, # 目标位置(如客户/消耗) 'product_id': rec.product_id.id, 'product_uom': rec.product_id.uom_id.id, 'product_uom_qty': rec.quantity, 'quantity_done': rec.quantity, 'picking_type_id': picking_type.id, # 关联出库类型 }) # 创建拣货单,正确关联库存移动 stock_picking = self.env['stock.picking'].create({ 'partner_id': rec.partner_id.id, 'picking_type_id': picking_type.id, 'location_id': picking_type.default_location_src_id.id, 'location_dest_id': picking_type.default_location_dest_id.id, 'move_ids_without_package': [(6, 0, [move.id])], # Many2many标准赋值格式 }) # 执行拣货单确认和验证流程 stock_picking.action_confirm() stock_picking.button_validate() rec.state = 'confirmed'
关键修改说明
- 修正库存位置方向:把
stock.move的location_id改为出库类型的default_location_src_id(库存所在的源位置),确保库存是从这里转出到目标位置,实现扣减逻辑。 - 规范Many2many字段赋值:用
[(6, 0, [move.id])]格式关联已创建的库存移动,这是Odoo中Many2many字段添加记录的标准写法。 - 移除冗余步骤:删掉
action_set_quantities_to_reservation,因为你已经在move里设置了quantity_done,这个步骤会覆盖已有的值,导致库存计算错误。 - 关联出库类型到move:给
stock.move加上picking_type_id,确保移动和拣货单的出库类型一致,避免流程校验出错。
内容的提问来源于stack exchange,提问作者Abdullah Elshoura
相关产品推荐
相关产品推荐

