105 lines
4.1 KiB
Python
105 lines
4.1 KiB
Python
# -*- 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 |