From 4e62a074da01a14f0e2b222e16109722a56abbcb Mon Sep 17 00:00:00 2001 From: pengyuthon Date: Sun, 8 Mar 2026 21:19:16 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B0=8F=E7=BA=A2=E7=82=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wizard/soong_workflow_comment_wizard.py | 13 ++++ .../static/src/webclient/navbar/navbar.js | 62 ++++++++++++++++--- 2 files changed, 67 insertions(+), 8 deletions(-) diff --git a/soong_workflow/wizard/soong_workflow_comment_wizard.py b/soong_workflow/wizard/soong_workflow_comment_wizard.py index 6ce7f90e0..a9ab587e6 100644 --- a/soong_workflow/wizard/soong_workflow_comment_wizard.py +++ b/soong_workflow/wizard/soong_workflow_comment_wizard.py @@ -391,7 +391,20 @@ class SoongWorkflowCommentWizard(models.TransientModel): return record_id.users_id.employee_id return self.env['hr.employee'] # 默认返回空记录集 + def _send_workflow_notifications(self, partners=None): + """ 通知前端刷新红点、播放音频 + :param partners: 需要通知的用户(res.partner) + """ + if not partners: + partners = self.env['res.partner'].search([]) + bus_message = {'type': 'wkf_notify'} + notifications = [[partner, 'sun_badge_menu.reload_menu_data', [bus_message]] for partner in partners] + self.env["bus.bus"]._sendmany(notifications) + def add_comment(self): + # test + return self._send_workflow_notifications() + self.ensure_one() cx = self.env.context.copy() or {} record_id = self.env[self.res_model].search([('id', '=', self.res_id)]) diff --git a/sun_badge_menu/static/src/webclient/navbar/navbar.js b/sun_badge_menu/static/src/webclient/navbar/navbar.js index e849b3084..4e6b5be46 100644 --- a/sun_badge_menu/static/src/webclient/navbar/navbar.js +++ b/sun_badge_menu/static/src/webclient/navbar/navbar.js @@ -1,19 +1,65 @@ /** @odoo-module **/ - -import {NavBar} from "@web/webclient/navbar/navbar"; -import {patch} from "@web/core/utils/patch"; +import { browser } from "@web/core/browser/browser"; +import { NavBar } from "@web/webclient/navbar/navbar"; +import { patch } from "@web/core/utils/patch"; +import { deepCopy } from "@web/core/utils/objects"; import { useService } from "@web/core/utils/hooks"; +import { url } from "@web/core/utils/urls"; + +const WKF_NOTIFY_TYPE = 'wkf_notify' patch(NavBar.prototype, { setup() { super.setup(); this.busService = this.env.services.bus_service - console.log(this.env.services.bus_service) - // 监听后端发送的信号,重新加载菜单数据 - this.busService.subscribe("sun_badge_menu.reload_menu_data", () => { - // - console.log('重新加载数据...') + this.audio = new Audio(); + this.audio.src = this.audio.canPlayType("audio/ogg; codecs=vorbis") + ? url("/mail/static/src/audio/ting.ogg") + : url("/mail/static/src/audio/ting.mp3"); + /** + * 监听后端发送的信号,重新加载菜单数据 + * 1. 通知类型为WKF_NOTIFY_TYPE时,直接刷新菜单播放音频 + * 2. 其余则通过菜单badge_count对比 + */ + this.busService.subscribe("sun_badge_menu.reload_menu_data", (detail) => { + console.log('[sun_badge_menu.reload_menu_data]重新加载数据...') + debugger + for (const d of detail) { + if (d?.type === WKF_NOTIFY_TYPE) { + this.menuService.reload(); + return this.audio.play().catch((e) => { + console.log(e) + }); + } + } + + const oldMenuApps = deepCopy(this.menuService.getApps()) this.menuService.reload(); + const getReduceCount = (value) => { + return value ? value.reduce((count, app) => count + (app?.badge_count || 0), 0) : 0; + } + browser.setTimeout(() => { + debugger + const oldCount = getReduceCount(oldMenuApps) + const newMenuApps = this.menuService.getApps() + const newCount = getReduceCount(newMenuApps) + if (newCount > oldCount) { + return this.audio.play().catch((e) => { + console.log(e) + }); + } + if (oldMenuApps.length === newMenuApps.length) { + const oldCountArr = oldMenuApps.map((app) => (app?.badge_count || 0)) + const newCountArr = newMenuApps.map((app) => (app?.badge_count || 0)) + for (let i = 0; i < oldMenuApps.length; i++) { + if (oldCountArr[i] < newCountArr[i]) { + return this.audio.play().catch((e) => { + console.log(e) + }); + } + } + } + }, 300) }); } });