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

如何在Odoo 9的stock.quant中添加字段并同步采购产品描述

解决Odoo 9中Stock Quant自动同步采购/询价单产品描述的问题

嘿,我来帮你搞定这个需求!首先得理清楚Odoo里的数据流:stock.quant是入库操作完成后生成的库存批次记录,它和stock.move(库存移动)关联,而采购入库的stock.move又能追溯到对应的采购订单行(purchase.order.line)。咱们的核心就是把采购/询价单里填的产品描述,通过这条链路自动同步到stock.quant的designation2字段里。


第一步:优化字段定义(可选但推荐)

你现在给designation2加了required=True,但如果是自动赋值的话,手动创建库存批次时容易触发必填校验报错。建议先把必填属性去掉,等逻辑跑通后再根据实际需求调整:

from openerp.osv import fields, osv
from openerp import tools
import openerp.addons.decimal_precision as dp
from openerp.tools.translate import _

class StockQuantTreeDesignation(osv.osv):
    _inherit = 'stock.quant'
    _columns = {
        'designation2': fields.char(string="Désignation", select=True),
    }

第二步:实现自动赋值的核心逻辑

这里给你两种靠谱的实现方式,选哪种都能满足需求:

方式一:在Stock Move完成时同步到Quant

因为stock.quant是由stock.move触发生成的,所以可以在库存移动状态变为done(入库完成)时,把采购订单行的描述同步过去。在你的模块里新增或修改Python代码:

class StockMove(osv.osv):
    _inherit = 'stock.move'

    def write(self, cr, uid, ids, vals, context=None):
        # 先调用父类的write方法完成基础状态更新
        res = super(StockMove, self).write(cr, uid, ids, vals, context=context)
        
        # 当移动状态更新为done时,同步采购描述到关联的quant
        if 'state' in vals and vals['state'] == 'done':
            for move in self.browse(cr, uid, ids, context=context):
                # 只处理来自采购订单的库存移动
                if move.purchase_line_id:
                    # 获取采购订单行里填写的产品描述
                    po_line_desc = move.purchase_line_id.name
                    # 找到该move对应的所有quant记录
                    quant_ids = self.pool.get('stock.quant').search(cr, uid, [
                        ('move_id', '=', move.id)
                    ], context=context)
                    # 批量更新designation2字段
                    if quant_ids:
                        self.pool.get('stock.quant').write(cr, uid, quant_ids, {
                            'designation2': po_line_desc
                        }, context=context)
        return res

方式二:直接在Quant创建时赋值

另一种思路是在stock.quant创建的瞬间,直接从关联的stock.move里追溯采购订单的描述:

class StockQuantTreeDesignation(osv.osv):
    _inherit = 'stock.quant'
    _columns = {
        'designation2': fields.char(string="Désignation", select=True),
    }

    def create(self, cr, uid, vals, context=None):
        # 创建quant前,先检查是否关联了库存移动
        if vals.get('move_id'):
            move = self.pool.get('stock.move').browse(cr, uid, vals['move_id'], context=context)
            # 如果是采购入库的move,就把采购行的描述赋值给designation2
            if move.purchase_line_id:
                vals['designation2'] = move.purchase_line_id.name
        # 调用父类方法完成quant创建
        return super(StockQuantTreeDesignation, self).create(cr, uid, vals, context=context)

第三步:模块配置与测试

  1. 记得在你的模块的__openerp__.py里添加依赖,确保模块加载顺序正确:
'depends': ['base', 'stock', 'purchase'],
  1. 升级模块后,按这个流程测试:
    • 创建询价单(RFQ),填写自定义的产品描述
    • 确认询价单成为正式采购订单
    • 执行采购入库操作(生成收货单并验证)
    • 打开库存批次(Stock Quant)列表,查看designation2字段,应该已经自动填充了采购订单里的描述!

补充小提示

  • 如果你的需求是同步产品模板的默认名称,而非采购订单行自定义的描述,可以把代码里的move.purchase_line_id.name换成move.product_id.display_name或者move.product_id.name。
  • 对于已经存在的库存批次记录,你可以通过Odoo的批量更新功能,手动关联采购订单行的描述来补全数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:26:13