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

如何在Odoo V13中创建服务器操作更新生产订单的BoM

在Odoo V13中创建服务器操作更新生产订单BoM

1. 构建BoM选择向导

1.1 创建向导表单视图

进入设置 > 技术 > 视图 > 视图,新增表单视图,代码如下:

<odoo>
    <record id="view_change_bom_wizard_form" model="ir.ui.view">
        <field name="name">change.bom.wizard.form</field>
        <field name="model">change.bom.wizard</field>
        <field name="arch" type="xml">
            <form string="选择目标BoM版本">
                <group>
                    <!-- 仅显示当前生产订单产品对应的BoM -->
                    <field name="bom_id" required="1" domain="[('product_id', '=', active_id.product_id.id)]"/>
                </group>
                <footer>
                    <button name="action_update_bom" string="更新BoM" type="object" class="btn-primary"/>
                    <button string="取消" class="btn-default" special="cancel"/>
                </footer>
            </form>
        </field>
    </record>
</odoo>

1.2 创建向导模型

进入设置 > 技术 > 模型 > 模型,新增临时模型(TransientModel):

from odoo import models, fields, api, exceptions

class ChangeBomWizard(models.TransientModel):
    _name = 'change.bom.wizard'
    _description = '生产订单更换BoM向导'

    bom_id = fields.Many2one('mrp.bom', string='目标BoM版本')

    def action_update_bom(self):
        production = self.env['mrp.production'].browse(self._context.get('active_id'))
        # 仅允许草稿状态订单修改
        if production.state != 'draft':
            raise exceptions.UserError('仅可更新草稿状态的生产订单')
        
        # 清空原有物料移动记录
        production.move_raw_ids.unlink()
        production.move_finished_ids.unlink()
        
        # 绑定新BoM并触发核心onchange逻辑
        production.bom_id = self.bom_id
        production._onchange_bom_id()
        production._onchange_move_raw()
        
        # 手动生成成品移动记录(V13无_onchange_move_finished方法)
        bom = self.bom_id
        if bom.product_id == production.product_id:
            self.env['stock.move'].create({
                'name': production.name,
                'product_id': bom.product_id.id,
                'product_uom_qty': production.product_qty,
                'product_uom': bom.product_uom_id.id,
                'location_id': production.location_src_id.id,
                'location_dest_id': production.location_dest_id.id,
                'production_id': production.id,
                'origin': production.name,
            })
        
        return {'type': 'ir.actions.act_window_close'}

2. 创建服务器操作

进入设置 > 技术 > 动作 > 服务器操作,新增操作:

  • 模型:mrp.production(生产订单)
  • 动作类型:执行Python代码
  • 代码内容:
# 替换下方的「your_module_name」为部署向导的模块名称
action = self.env.ref('your_module_name.view_change_bom_wizard_form').read()[0]
return action

3. 给生产订单添加触发按钮

编辑生产订单表单视图,在合适位置添加按钮(仅草稿状态可见):

<button name="%(your_module_name.view_change_bom_wizard_form)d" string="更换BoM版本" type="action" states="draft"/>

记得替换「your_module_name」为实际模块名称

关键注意事项

  • 仅支持草稿状态生产订单:已开始的订单修改BoM会导致库存、工序数据混乱,禁止操作
  • 验证BoM有效性:确保PLM中修改的BoM版本已激活,且与生产订单产品匹配
  • 先测试再上线:在测试环境验证逻辑,确认物料清单、成品移动记录更新正确后再部署到生产环境

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 16:24:12