Odoo自动动作创建重复订阅问题及服务产品添加需求
Odoo销售订单生成订阅问题修复方案
问题分析
当前代码存在两个核心问题:
- 订阅数量超出预期:循环逻辑错误,未按服务产品维度创建订阅,且数据处理导致重复/多余订阅生成;
- 订阅行添加失败:One2many字段写入格式错误,赋值逻辑有误,仅能添加最后一个产品行。
修复后代码
for order in records: # 遍历当前销售订单的所有行 for order_line in order.order_line: # 获取订单行产品对应的BOM组件集合 bom_components = order_line.product_id.bom_ids.mapped('bom_line_ids.product_id') # 遍历每个BOM组件产品 for prod in bom_components: # 筛选需要生成订阅的服务产品(recurring_invoice为True) if prod.recurring_invoice: # 为单个服务产品创建订阅 sub_vals = { 'company_id': order.company_id.id, 'partner_id': order.partner_id.id, 'pricelist_id': order.pricelist_id.id, 'template_id': prod.subscription_template_id.id if prod.subscription_template_id else False, 'name': f"订阅 - {prod.name} ({order.name})" } sub = env['sale.subscription'].create(sub_vals) # 为订阅添加对应的产品行 line_vals = { 'price_unit': prod.list_price, 'product_id': prod.product_variant_id.id, 'uom_id': prod.uom_id.id, 'name': prod.name, 'quantity': order_line.product_uom_qty } sub.write({'recurring_invoice_line_ids': [(0, 0, line_vals)]})
关键修复点说明
针对问题1(多余订阅):
- 调整循环层级:按「销售订单→订单行→BOM组件产品」的层级遍历,确保每个符合条件的服务产品单独生成一个订阅;
- 使用
mapped方法获取BOM组件,避免重复产品数据; - 订阅名称关联产品名称与订单号,便于后续识别;
- 兼容
subscription_template_id为空的场景,避免空值报错。
针对问题2(订阅行添加失效):
- 将订阅行写入操作移至产品循环内部,每个服务产品对应添加一行;
- 修正
uom_id赋值:使用产品本身的单位ID(prod.uom_id.id),原代码错误地将订单行数量赋值给单位字段; - 删除
(5, 0, 0)清空指令,改为用(0, 0, line_vals)逐个添加行,避免覆盖已有数据; - 添加
quantity字段,关联订单行的产品数量,匹配业务逻辑。
额外注意事项
确保自动动作的触发配置正确:建议设置为「销售订单状态变为已确认」时触发,避免重复执行导致多余订阅生成。
内容的提问来源于stack exchange,提问作者AlwaysTryingMyBest
相关产品推荐
相关产品推荐

