Odoo Bus服务实时通信配置求助:预约计数无法实时更新
问题排查与修复方案
一、解决"Missing dependencies: 'bus.bus'"报错
- 修正manifest依赖配置
确保__manifest__.py的depends列表包含'bus',同时assets配置无需手动添加bus资源(Odoo会自动加载依赖模块的前端资源):# __manifest__.py 'depends': ['base', 'bus', 'medical'], # 必须包含bus 'assets': { 'web.assets_backend': [ 'your_module_name/static/src/js/*.js', ], }, - JS模块显式声明bus依赖
你的自定义JS文件必须在模块定义时明确依赖'bus.bus',示例:odoo.define('your_module_name.appointment_updater', function (require) { "use strict"; // 必须引入bus模块 var Bus = require('bus.bus'); var ListController = require('web.ListController'); var session = require('web.session'); // 后续代码逻辑 }); - 清除Odoo缓存
执行命令刷新模块并清除缓存:
或在后台开发者模式下点击「Clear Cache and Reload」,避免旧缓存导致依赖未加载。odoo-bin r -u your_module_name --clear-cache
二、实现doctor_appointment_count实时更新
后端:发送实时通知
在预约创建/修改时,通过bus模块向指定频道推送更新消息:
# models/medical_appointment.py from odoo import models from odoo.addons.bus.models.bus import Bus class MedicalAppointment(models.Model): _inherit = 'medical.appointment' def create(self, vals): res = super().create(vals) # 向对应医生的partner推送更新消息 doctor_partner = res.doctor_id.partner_id Bus._sendone( doctor_partner, 'medical.appointment.count', # 自定义频道标识 {'doctor_id': res.doctor_id.id} ) return res def write(self, vals): res = super().write(vals) # 仅在影响count的字段变更时推送消息 if 'doctor_id' in vals or 'state' in vals: for rec in self: Bus._sendone( rec.doctor_id.partner_id, 'medical.appointment.count', {'doctor_id': rec.doctor_id.id} ) return res
前端:订阅频道并刷新数据
扩展列表控制器,订阅频道并在收到消息时重新加载count字段:
odoo.define('your_module_name.appointment_updater', function (require) { "use strict"; var Bus = require('bus.bus'); var ListController = require('web.ListController'); ListController.include({ init: function () { this._super.apply(this, arguments); this.bus = Bus.bus; // 订阅自定义频道 this.bus.addChannel('medical.appointment.count'); // 绑定消息监听 this.bus.on('notification', this, this._handleCountUpdate); }, _handleCountUpdate: function (notification) { var channel = notification[0]; var msg = notification[1]; // 仅处理目标频道的消息 if (channel === 'medical.appointment.count' && this.modelName === 'medical.doctor') { // 重新加载当前列表数据,自动更新count字段 this.reload().then(() => { this.renderer.render(); }); } }, // 组件销毁时移除监听,避免内存泄漏 destroy: function () { this.bus.off('notification', this, this._handleCountUpdate); this._super.apply(this, arguments); } }); });
视图:确认count字段配置
确保医生模型的doctor_appointment_count是正确的计算字段,且视图中使用了正确的widget:
<!-- views/medical_doctor_views.xml --> <record id="medical_doctor_tree_view" model="ir.ui.view"> <field name="name">medical.doctor.tree</field> <field name="model">medical.doctor</field> <field name="arch" type="xml"> <tree> <field name="name"/> <!-- 使用statinfo widget展示计数 --> <field name="doctor_appointment_count" widget="statinfo"/> </tree> </field> </record>
额外排查点
- 确认医生的
partner_id已正确关联,bus消息基于partner推送,无关联则无法接收消息。 - 在浏览器开发者工具Network标签下,检查
/longpolling/poll请求是否正常,确认消息是否被发送和接收。 - 若为多用户场景,确保消息推送给了目标医生的partner,而非全局频道,避免无效更新。
内容的提问来源于stack exchange,提问作者tttt
相关产品推荐
相关产品推荐

