如何在Odoo中通过自动化操作从销售订单创建订阅记录?
解决Odoo销售订单BOM内订阅产品自动创建订阅的问题
你的代码存在几个关键问题导致RPC_ERROR,以下是问题分析和修正方案:
问题分析
- 硬编码公司ID:直接写死
company_id:3会导致多公司环境下出错,不符合Odoo数据一致性原则。 - 链式调用空值风险:
self.order_line.product_id.bom_ids.bom_line_ids.product_id.subscription_template_id.id的链式调用中,任何环节(比如产品无BOM、BOM子件无订阅模板)为空都会触发AttributeError,进而引发RPC_ERROR。 - 未处理订单行集合:
order_line是订单行集合,直接取product_id无法正确遍历所有行的产品。 - 手动提交事务:Odoo自动化操作中手动执行
self.env.cr.commit()会破坏事务管理,可能引发数据不一致或异常。
修正后的代码
# 遍历销售订单的所有订单行 for line in self.order_line: product = line.product_id # 仅处理包含BOM的产品 if product.bom_ids: # 遍历该产品的所有BOM for bom in product.bom_ids: # 遍历BOM中的所有子件 for bom_line in bom.bom_line_ids: sub_product = bom_line.product_id # 检查子件是否关联了订阅模板 if sub_product.subscription_template_id: # 构造订阅记录的字段值 vals = { 'company_id': self.company_id.id, # 使用订单所属公司ID 'partner_id': self.partner_id.id, 'pricelist_id': self.pricelist_id.id, 'template_id': sub_product.subscription_template_id.id, 'code': self.name, 'name': f"{self.partner_id.name} - {sub_product.name}" # 生成有意义的订阅名称 } # 创建订阅记录 self.env['sale.subscription'].create(vals) # 无需手动提交事务,Odoo会自动处理
关键注意事项
- 触发时机配置:将自动化操作的触发时机设置为销售订单确认后(如状态变为
sale或done),避免重复创建订阅。 - 权限检查:确保自动化操作的执行用户拥有
sale.subscription模型的创建权限。 - 重复创建防护:若需避免重复创建,可在创建前增加判断,比如检查是否已存在该订单+订阅模板的订阅记录:
existing_sub = self.env['sale.subscription'].search([ ('code', '=', self.name), ('template_id', '=', sub_product.subscription_template_id.id) ], limit=1) if not existing_sub: self.env['sale.subscription'].create(vals) - 日志排查:开启Odoo调试模式,查看后台日志获取RPC_ERROR的具体异常信息,便于精准定位问题。
内容的提问来源于stack exchange,提问作者AlwaysTryingMyBest
相关产品推荐
相关产品推荐

