diff --git a/yuthon_base/models/__init__.py b/yuthon_base/models/__init__.py index 3b4f225ed..19457e29a 100644 --- a/yuthon_base/models/__init__.py +++ b/yuthon_base/models/__init__.py @@ -8,4 +8,5 @@ from . import yuthon_phone_lottery from . import res_partner from . import base_month_year from . import system_logs -from . import res_users \ No newline at end of file +from . import res_users +from . import mail_thread \ No newline at end of file diff --git a/yuthon_base/models/mail_thread.py b/yuthon_base/models/mail_thread.py new file mode 100644 index 000000000..6db20afbb --- /dev/null +++ b/yuthon_base/models/mail_thread.py @@ -0,0 +1,43 @@ +# -*- coding: utf-8 -*- +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html). + +from odoo import models +import json + + +class MailThread(models.AbstractModel): + _inherit = "mail.thread" + + def _notify_by_web_push(self, message, recipients_data, msg_vals=False): + """ + 重写 Web Push 通知方法,强制使用异步发送方式, + 避免同步发送导致的请求阻塞问题(如加班审批转交按钮反应慢)。 + """ + msg_vals = dict(msg_vals or {}) + partner_ids = self._extract_partner_ids_for_notifications(message, msg_vals, recipients_data) + if not partner_ids: + return + + partner_devices_sudo = self.env['mail.partner.device'].sudo() + devices = partner_devices_sudo.search([ + ('partner_id', 'in', partner_ids) + ]) + if not devices: + return + + ir_parameter_sudo = self.env['ir.config_parameter'].sudo() + vapid_private_key = ir_parameter_sudo.get_param('mail.web_push_vapid_private_key') + vapid_public_key = ir_parameter_sudo.get_param('mail.web_push_vapid_public_key') + if not vapid_private_key or not vapid_public_key: + return + + payload = self._notify_by_web_push_prepare_payload(message, msg_vals=msg_vals) + payload = self._truncate_payload(payload) + + # 强制使用异步发送方式 + # 不再同步调用 push_to_end_point,避免阻塞请求 + self.env['mail.notification.web.push'].sudo().create([{ + 'user_device': device.id, + 'payload': json.dumps(payload), + } for device in devices]) + self.env.ref('mail.ir_cron_web_push_notification')._trigger()