从Sale Order创建Manufacturing Order的后端方法及状态修改咨询
销售订单创建制造订单的相关后端方法及状态调整方案
一、负责从销售订单创建制造订单的核心后端方法
在Odoo标准代码体系中,销售订单触发制造订单(MO)的流程涉及以下关键方法:
sale.order.action_confirm:销售订单确认的入口方法,会触发后续库存规则的执行逻辑。sale.order._action_launch_stock_rule:调用库存规则(stock.rule)的执行逻辑,针对配置为“需制造”的产品,匹配到类型为manufacture的库存规则。stock.rule._run_manufacture:这是创建制造订单的核心触发方法,内部会调用mrp.production.create()生成MO,同时将销售订单名称写入MO的origin字段。mrp.production.create:制造订单的基础创建方法,默认会将MO状态设置为confirmed(具体取决于Odoo版本的默认配置)。
如果要直接定位销售订单链路中创建MO的关键节点,stock.rule._run_manufacture是最直接的触发点。
二、让MO创建时处于Draft状态的修改方案
默认通过销售订单创建的MO会自动进入confirmed状态,原因是在stock.rule._run_manufacture方法中,调用mrp.production.create()时传入了state='confirmed'的参数,或者mrp.production的create方法有默认状态设置。要改为draft状态,可通过以下两种方式实现:
方法1:修改stock.rule._run_manufacture的创建参数
找到_run_manufacture方法中调用mrp.production.create()的代码段,将原本的state='confirmed'替换为state='draft',示例代码片段:
# 原核心逻辑片段 mrp_production = self.env['mrp.production'].create({ 'origin': move.group_id.origin or move.origin, 'product_id': move.product_id.id, # 其他必要参数 'state': 'draft', # 替换原有的'confirmed' })
方法2:通过继承重写mrp.production.create方法
若不想修改核心模块代码,可通过自定义模块继承mrp.production模型,重写create方法,当检测到MO来源于销售订单时,强制设置状态为draft:
from odoo import models, api class MrpProduction(models.Model): _inherit = 'mrp.production' @api.model def create(self, vals): # 根据销售订单编号特征判断来源(可根据实际场景调整判断逻辑) if vals.get('origin') and vals['origin'].startswith('SO'): vals['state'] = 'draft' return super(MrpProduction, self).create(vals)
注意:不同Odoo版本的代码细节略有差异,以上方案基于Odoo 14-16的标准逻辑,实际修改时需对应版本的代码结构调整。
内容的提问来源于stack exchange,提问作者Sidharth Panda
相关产品推荐
相关产品推荐

