Odoo 14社区版:为交货单全步骤添加sale_line_id字段方法咨询
问题描述
在Odoo 14社区版中,stock.move模型的sale_line_id字段仅在创建out步骤的交货单时被赋值。现有pick、pack、out三个库存操作步骤,仅out步骤的move记录带有sale_line_id值,需定制实现让所有步骤的stock.move记录都包含该字段值。
已追踪过_action_launch_stock_rule、_run_pull、_get_stock_move_values、_get_custom_move_fields等方法,但未找到合适调整点;后续发现_action_launch_stock_rule由销售订单行调用,用于创建带sale_line_id的采购单,但仍未定位到pick、pack步骤无sale_line_id的move记录创建逻辑。
当前库存规则配置:
- PICK:动作类型为pull,采购方式为make_to_stock
- PACK:动作类型为pull,采购方式为make_to_order
- OUT:动作类型为pull,采购方式为make_to_order
注:该配置非本人设置,不清楚具体配置原因。
解决方案
核心逻辑
pick步骤为MTS(按库存生产),其move记录从现有库存触发,默认不关联销售订单行;pack步骤的move由out步骤需求生成,但默认不会继承上游需求的sale_line_id。我们需要在move记录创建时,自动追溯需求链中的sale_line_id并赋值。
具体实现
方法1:重写_get_stock_move_values传递字段
在自定义模块中继承stock.rule,重写_get_stock_move_values方法,生成下游move时传递上游的sale_line_id:
from odoo import models, api class StockRule(models.Model): _inherit = 'stock.rule' def _get_stock_move_values(self, product_id, product_qty, product_uom, location_id, name, origin, company_id, values): res = super()._get_stock_move_values(product_id, product_qty, product_uom, location_id, name, origin, company_id, values) # 从下游目标move中获取sale_line_id if values.get('move_dest_ids'): dest_vals = values['move_dest_ids'][0][2] if dest_vals.get('sale_line_id'): res['sale_line_id'] = dest_vals['sale_line_id'] # 直接从传入值中继承sale_line_id elif values.get('sale_line_id'): res['sale_line_id'] = values['sale_line_id'] return res
方法2:在stock.move创建时自动补全字段
若方法1无法覆盖所有场景,可重写stock.move的create方法,通过追溯上下游move链补全sale_line_id:
from odoo import models, api class StockMove(models.Model): _inherit = 'stock.move' @api.model def create(self, vals): move = super().create(vals) if not move.sale_line_id: # 先追溯下游目标move current_move = move while current_move.move_dest_ids: current_move = current_move.move_dest_ids[0] if current_move.sale_line_id: move.sale_line_id = current_move.sale_line_id break # 下游无结果则追溯上游来源move if not move.sale_line_id: current_move = move while current_move.move_orig_ids: current_move = current_move.move_orig_ids[0] if current_move.sale_line_id: move.sale_line_id = current_move.sale_line_id break return move
验证步骤
- 创建并确认销售订单,触发out、pack、pick三个步骤的move记录
- 查看所有
stock.move记录的sale_line_id字段,确认均已赋值 - 测试库存充足/不足场景下的MTS触发逻辑,确保字段传递正常
内容的提问来源于stack exchange,提问作者holydragon
相关产品推荐
相关产品推荐

