You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Odoo Bus服务实时通信配置求助:预约计数无法实时更新

问题排查与修复方案

一、解决"Missing dependencies: 'bus.bus'"报错

  1. 修正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',
        ],
    },
    
  2. 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');
    
        // 后续代码逻辑
    });
    
  3. 清除Odoo缓存
    执行命令刷新模块并清除缓存:
    odoo-bin r -u your_module_name --clear-cache
    
    或在后台开发者模式下点击「Clear Cache and Reload」,避免旧缓存导致依赖未加载。

二、实现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 11:23:18