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

从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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 12:45:37