Odoo11:Cron任务触发库存预警弹窗失效问题排查
解决Odoo 11 Cron任务无法弹出库存预警窗口的问题
嘿,我一眼就瞅出你这问题的核心了——Cron任务是后台运行的,根本没法直接弹出前端窗口!这不是你代码写得有问题,是对Odoo的Cron运行机制理解错了。
咱们先拆解下你原代码的问题,再给你改出能用的方案:
原代码的几个坑
- 后台进程没法触发前端弹窗:Cron是在服务器端默默跑的,没有绑定任何用户的浏览器会话,你返回的
ir.actions.act_window在这种场景下完全没用,因为没人的浏览器来响应这个动作。 - 循环逻辑有漏洞:你在循环里只要找到第一个库存不足的产品就直接
return了,后面的产品根本不会检查,等于只处理第一个符合条件的条目。 - 库存计算不准确:你取了
quants[0]的数量,但一个产品在同一个库位可能有多个stock.quant记录,应该用求和来算总库存才对。
修正后的实现方案
既然Cron没法直接弹窗口,咱们换个思路:给用户发系统消息通知,或者创建预警记录让用户能看到。下面是调整后的代码,我改成了给当前用户发送库存预警消息:
@api.model def to_do(self): # 收集所有需要预警的库存信息 alert_list = [] # 遍历所有库存规则 for orderpoint in self.env['stock.warehouse.orderpoint'].search([]): # 查找对应产品和库位的库存记录 quants = self.env['stock.quant'].search([ ('product_id', '=', orderpoint.product_id.id), ('location_id', '=', orderpoint.location_id.id), ]) # 计算当前总库存 current_stock = sum(quant.quantity for quant in quants) # 判断是否低于最低库存 if current_stock <= orderpoint.product_min_qty: alert_msg = f"⚠️ 产品【{orderpoint.product_id.name}】在库位【{orderpoint.location_id.name}】的当前库存{current_stock},已低于设定的最低库存{orderpoint.product_min_qty}" alert_list.append(alert_msg) # 如果有预警信息,给用户发送系统消息 if alert_list: # 这里可以指定接收消息的用户,比如用管理员或者当前Cron执行对应的用户 target_user = self.env.user target_user.message_post( body='<br>'.join(alert_list), subject='库存预警通知', message_type='notification', subtype='mail.mt_comment' ) # Cron任务必须返回True或者有效结果,不然可能被标记为失败 return True
额外优化建议
如果你还是想在用户登录时看到弹窗提醒,可以这么做:
- 创建一个专门的预警模型(比如
stock.limit.alert),把库存不足的记录存进去。 - 在用户登录的前端事件里,检查这个模型有没有未读的预警记录,然后触发弹窗。
- 或者用Odoo的内置消息机制,用户登录后在顶部的消息图标里就能看到预警,体验也不差。
最后记得先手动测试这个方法(调试模式下找到模型执行方法),确认能生成消息后再配置Cron运行哦!
内容的提问来源于stack exchange,提问作者Penda Diallo
相关产品推荐
相关产品推荐

