Odoo 17.4(在线版)生产订单报表过滤自动化动作报错求助
Odoo 17.4在线版生产订单自定义筛选视图修复方案
问题根源
你遇到的语法错误是因为第19行写了return = {——在Python里return是关键字,不能当作变量赋值,直接写return {就能解决这个语法问题。原有报表失效大概率是代码错误导致自动化动作执行异常,干扰了原有逻辑。
修正后的实现代码
以下是修复语法问题、同时优化逻辑的完整代码,确保每种产品仅显示2条符合状态要求的生产订单:
# 获取状态为"已确认"或"进行中"的生产订单,按产品ID+创建时间倒序排序,确保取最新的2条 production_orders = env['mrp.production'].search( [('state', 'in', ['confirmed', 'in_progress'])], order='product_id, create_date desc' ) # 按产品ID分组,每组最多保留2条记录 filtered_orders = {} for order in production_orders: product_key = order.product_id.id if product_key not in filtered_orders: filtered_orders[product_key] = [] if len(filtered_orders[product_key]) < 2: filtered_orders[product_key].append(order) # 提取筛选后的订单ID列表 result_ids = [order.id for group in filtered_orders.values() for order in group] # 返回自定义视图动作 return { 'type': 'ir.actions.act_window', 'name': '筛选后的生产订单', 'res_model': 'mrp.production', 'view_mode': 'tree', 'domain': [('id', 'in', result_ids)], 'context': env.context, # 保留原有上下文,避免视图显示异常 }
关键优化说明
- 语法修复:移除
return后的等号,直接返回动作字典 - 排序逻辑:添加
order='product_id, create_date desc',确保每个产品取最新创建的2条订单,更贴合业务实际需求 - 上下文保留:加入
'context': env.context,避免自定义视图丢失原有配置(如默认筛选、视图布局等) - 高性能备选方案:如果生产订单数量极大,建议用SQL直接分组取数,避免循环遍历的性能损耗,示例写法:
self.env.cr.execute(""" SELECT id FROM ( SELECT id, product_id, ROW_NUMBER() OVER (PARTITION BY product_id ORDER BY create_date DESC) AS rn FROM mrp_production WHERE state IN ('confirmed', 'in_progress') ) AS sub WHERE rn <= 2 """) result_ids = [row[0] for row in self.env.cr.fetchall()]
部署验证步骤
- 进入Odoo后台「设置-自动化-自动化动作」,找到对应的目标动作
- 替换代码为修正后的版本,保存时确认无语法错误提示
- 触发动作(如菜单点击、按钮触发),验证是否显示符合要求的生产订单列表
- 检查原有报表是否恢复正常,若仍有问题需排查动作的触发条件是否与原有逻辑冲突
内容的提问来源于stack exchange,提问作者franckcesk
相关产品推荐
相关产品推荐

