小红点

This commit is contained in:
pengyuthon
2026-03-08 21:19:16 +08:00
parent 3e3fda84b4
commit 4e62a074da
2 changed files with 67 additions and 8 deletions
@@ -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)])
@@ -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)
});
}
});