如何在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
相关产品推荐
相关产品推荐

