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

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

验证步骤

  1. 创建并确认销售订单,触发out、pack、pick三个步骤的move记录
  2. 查看所有stock.move记录的sale_line_id字段,确认均已赋值
  3. 测试库存充足/不足场景下的MTS触发逻辑,确保字段传递正常

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 19:16:07