# -*- coding: utf-8 -*- import logging from odoo import models from odoo import exceptions from wechatpy.enterprise import WeChatClient from odoo.exceptions import UserError _logger = logging.getLogger(__name__) class JikimoMessageDispatch(models.AbstractModel): _name = "jikimo.message.dispatch" _description = '消息发送' def add_queue(self, bussiness_node, urgency="normal", **kwargs): """ 添加消息队列 """ bussiness_node_id = self.env["jikimo.message.bussiness.node"].search([ ("model", "=", self._name), ("name", "=", bussiness_node) ]) # 根据模型与紧急程度获取消息模板 message_template_id = self.env["jikimo.message.template"].search([ ("model", "=", self._name), ("urgency", "=", urgency), ("bussiness_node_id", "=", bussiness_node_id.id) ]) if not message_template_id: _logger.warning(f"{self._name}消息推送模板未配置") return False data_list = [] for record in self: data_list.append({ 'res_id': record.id, 'model': record._name, 'message_template_id': message_template_id.id, }) return self.env["jikimo.message.queue"].create(data_list) def _merge_message_queue(self): """ 合并相同业务节点与相同模型的消息 """ pass def _get_message(self, message_queue_ids): """ 根据消息队列获取消息内容 :param message_queue_ids: 消息队列ID列表 :return: 消息内容 """ contents = [] for message_queue_id in message_queue_ids: content = message_queue_id.message_template_id.content # 获取模板中带有{{}}的变量 import re variables = re.findall(r"{{[^{}]+}}", content) if variables: model_data = self.env[message_queue_id.model].browse(int(message_queue_id.res_id)) for variable in variables: # 获取变量对应的值 variable_value = model_data[variable.strip("{{}}")] # 将变量替换为值 content = content.replace(variable, variable_value) contents.append(content) return contents def _send_message(self, message_content, we_user_list): """ 发送消息 """ enterprise = self.env['we.config'].search([('company_id', '=', 1)], limit=1) if enterprise.odoo_app_id: enterprise_app = self.env['we.app'].search([('agentid', '=', enterprise.odoo_app_id.agentid)]) wechat = WeChatClient(corp_id=enterprise.corp_id, secret=enterprise_app.secret) data = { 'agentid': enterprise.odoo_app_id.agentid, 'touser': we_user_list, 'content': message_content } wechat.message.send_markdown(agent_id=data['agentid'], user_ids=data['touser'], content=data['content']) else: raise UserError('Odoo应用未配置. ') def _cron_dispatch(self): """ 定时发送消息 """ # 从消息队列中获取所有待发送消息的message_template_id message_template_ids = self.env["jikimo.message.queue"].read_group([ ("message_status", "=", "pending") ], ['message_template_id'], ['message_template_id']) # 根据模板类型来发送消息 for message_template_id in message_template_ids[0]['message_template_id']: message_queue_ids = self.env["jikimo.message.queue"].search([ ("message_template_id", "=", message_template_id), ("message_status", "=", "pending") ]) message_contents = self.env[message_queue_ids[0].message_template_id.model]._get_message(message_queue_ids) # 发送消息 for message_content in message_contents: self._send_message(message_content, "HuYao") return True