You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Odoo创建stock.move.line无法正常处理库存预留问题求助

问题分析与解决

问题1:手动创建stock.move.line后库存转移无法完成

你创建stock.move.line时仅关联了picking_id,但未关联对应的stock.move(即缺失move_id参数),导致Odoo库存流程无法识别该明细对应的转移需求,进而无法完成验证;取消时的报错是因为系统认为你试图取消一个未实际预留的库存。

问题2:stock.quant操作报错'int' object has no attribute 'categ_id'

_get_available_quantity和_update_available_quantity方法需要传入记录对象(如product.product实例),而非整数ID。你直接传入product_id、location_id等整数,方法内部尝试访问对象属性(如categ_id)时自然会报错。


修复方案

方案1:规范创建stock.move.line,触发系统自动预留

创建move.line时必须关联对应的stock.move,让Odoo按标准流程处理库存预留:

product_id = 465
location_id = 8
product_qty = 1
lot_id = 118

# 获取对应的picking和move(假设picking是record)
picking = record
# 从picking中筛选对应产品的库存转移move(根据业务调整筛选逻辑)
stock_move = picking.move_ids.filtered(lambda m: m.product_id.id == product_id)[0]

# 创建move.line并关联move_id
env['stock.move.line'].create({
    'company_id': 1,
    'picking_id': picking.id,
    'move_id': stock_move.id,  # 关键:关联对应的stock.move
    'lot_id': lot_id,
    'date': picking.date,
    'location_dest_id': 5,
    'location_id': location_id,
    'product_uom_qty': product_qty,
    'product_uom_id': 32,
    'product_id': product_id
})

# 触发picking的库存预留逻辑
picking.action_assign()

方案2:修正stock.quant的调用方式(不推荐,易导致数据不一致)

如果必须手动操作quant,需先将ID转换为对应对象:

product_id = 465
location_id = 8
product_qty = 1
lot_id = 118

# 将ID转换为对应的记录对象
product = env['product.product'].browse(product_id)
location = env['stock.location'].browse(location_id)
lot = env['stock.production.lot'].browse(lot_id)

# 检查可用库存并更新
if env['stock.quant']._get_available_quantity(product, location, lot, strict=True) >= product_qty:
    env['stock.quant']._update_available_quantity(
        product, 
        location, 
        -product_qty, 
        lot_id=lot, 
        package_id=False, 
        owner_id=False
    )

注意:优先使用方案1,直接操作stock.quant会绕过Odoo的库存校验逻辑,容易导致库存数据异常。

内容的提问来源于stack exchange,提问作者Ryan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 18:37:13