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

Odoo多步骤交付中销售订单行自定义字段值传递至库存移动

问题描述

我在sale.order.line和stock.move中各创建了一个名为type_id的自定义字段。确认sale.order时会生成包含产品明细的stock.picking及stock.move,需要将销售订单行的自定义字段值传递至库存移动。通过_prepare_procurement_values可实现单步骤交付场景下的传递,但在两步、三步交付场景中,后续移动的该字段值无法继承,显示为None。如何确保多步骤交付场景下所有库存移动均能正确获取该自定义字段值?

现有代码

def _get_stock_move_values(self, product_id, product_qty, product_uom, location_dest_id, name, origin, company_id,
                           values):
    res = super()._get_stock_move_values(product_id, product_qty, product_uom, location_dest_id, name, origin,
                                         company_id, values)

    type_id = values.get('type_id')
    res.update({
        'type_id': type_id,
    })
    print('res..................', res)
    return res
解决方案

多步骤交付中,后续库存移动(如仓库到分拣区、分拣区到客户的移动)是通过复制初始移动或库存规则生成的,不会再走_get_stock_move_values或采购值准备逻辑,因此需要在移动复制/生成的关键方法中传递自定义字段:

  • 重写stock.move的copy方法
    当库存移动被复制(比如生成内部转移的后续移动)时,手动将type_id字段复制到新移动中:
class StockMove(models.Model):
    _inherit = 'stock.move'

    def copy(self, default=None):
        default = default or {}
        default['type_id'] = self.type_id.id
        return super().copy(default)
  • 处理库存规则生成的后续移动
    如果后续移动通过库存规则(stock.rule)生成,重写_get_move_values方法,从原始需求对应的源移动中获取字段值:
class StockRule(models.Model):
    _inherit = 'stock.rule'

    def _get_move_values(self, product_id, product_qty, product_uom, location_id, name, origin, values, group_id):
        res = super()._get_move_values(product_id, product_qty, product_uom, location_id, name, origin, values, group_id)
        if values.get('move_dest_ids'):
            res['type_id'] = values['move_dest_ids'][0].type_id.id
        return res
  • 确保初始移动字段值正确传递
    保留原有_get_stock_move_values方法的同时,需确保sale.order.line的_prepare_procurement_values正确传递字段值:
class SaleOrderLine(models.Model):
    _inherit = 'sale.order.line'

    def _prepare_procurement_values(self, group_id=False):
        values = super()._prepare_procurement_values(group_id=group_id)
        values['type_id'] = self.type_id.id
        return values

逻辑说明

单步骤交付仅生成一次移动,_prepare_procurement_values + _get_stock_move_values即可完成字段传递;多步骤交付的后续移动要么复制初始移动,要么基于前序移动通过库存规则生成,因此需在这两个场景手动传递字段,避免值丢失。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 14:52:22