from odoo import api, models, fields import logging from odoo.http import request import datetime _logger = logging.getLogger(__name__) class WechatEnterpriseReceiveMessage(models.Model): _name = 'we.receive.message' _description = 'Wechat Enterprise Receive Message Manage' name = fields.Char(required=True, index=True) ToUserName = fields.Char(u'企业号CorpID') FromUserName = fields.Char(u'成员UserID') CreateTime = fields.Char(u'消息创建时间') MsgId = fields.Char(u'消息id') AgentID = fields.Many2one('we.app', u'企业应用') MsgType = fields.Selection([('text', u'文本'), ('voice', u'语音'), ('image', u'图片'), ('video', u'视频'), ('shortvideo', u'短视频'), ('location', u'位置'), ('link', u'链接'), ('subscribe', u'关注'), ('unsubscribe', u'取消关注'), ('xml', u'自定义菜单链接跳转'), ('click', u'自定义菜单点击'), ('scan', u'扫描二维码'), ('scancode_waitmsg', u'扫描二维码并等待'), ('event', u'取消关注')], string=u'消息类型', required=True, default='text') Content = fields.Text(u'文本消息内容') state = fields.Selection([('1', u'未处理'), ('2', u'已处理'), ('3', u'处理失败')], u'状态', default='1') PicUrl = fields.Char(u'图片链接') MediaId = fields.Char(u'图片媒体文件id') Format = fields.Char(u'语音格式') ThumbMediaId = fields.Char(u'视频消息缩略图的媒体id') Location_X = fields.Char(u'地理位置纬度') Location_Y = fields.Char(u'地理位置经度') Scale = fields.Char(u'地图缩放大小') Label = fields.Char(u'地理位置信息') Title = fields.Char(u'标题') Description = fields.Char(u'描述') Cover_PicUrl = fields.Char(u'封面缩略图的url') @api.depends('MsgType', 'MsgId') def name_get(self): result = [] for receive in self: name = receive.MsgType + '_' + receive.MsgId result.append((receive.id, name)) return result def add_message(self, data): """ 增加一条待处理的上传消息 :param data: :return: """ app = request.env['we.app'].sudo().search([("agentid", "=", data["AgentID"])]) receive_message_data = { 'AgentID': app.id, 'MsgType': data["MsgType"], 'FromUserName': data["FromUserName"], 'ToUserName': data["ToUserName"] } current_time = datetime.datetime.now() real_time = current_time + datetime.timedelta(hours=8) receive_message_data["CreateTime"] = real_time receive_message_data["name"] = data["MsgType"] + data["MsgId"] if data["MsgType"] == "text": receive_message_data["MsgId"] = data["MsgId"] receive_message_data["Content"] = data["Content"] if data["MsgType"] == "image": receive_message_data["MsgId"] = data["MsgId"] receive_message_data["PicUrl"] = data["PicUrl"] receive_message_data["MediaId"] = data["MediaId"] if data["MsgType"] == "voice": receive_message_data["MsgId"] = data["MsgId"] receive_message_data["MediaId"] = data["MediaId"] receive_message_data["Format"] = data["Format"] if data["MsgType"] == "video" or data["MsgType"] == "shortvideo": receive_message_data["MsgId"] = data["MsgId"] receive_message_data["MediaId"] = data["MediaId"] receive_message_data["ThumbMediaId"] = data["ThumbMediaId"] if data["MsgType"] == "location": receive_message_data["MsgId"] = data["MsgId"] receive_message_data["Location_X"] = data["Location_X"] receive_message_data["Location_Y"] = data["Location_Y"] receive_message_data["Scale"] = data["Scale"] receive_message_data["Label"] = data["Label"] if data["MsgType"] == "link": receive_message_data["MsgId"] = data["MsgId"] receive_message_data["Title"] = data["Title"] receive_message_data["Description"] = data["Description"] receive_message_data["Cover_PicUrl"] = data["PicUrl"] if data["MsgType"] == "event": if data["Event"] == "subscribe": receive_message_data["MsgType"] = "subscribe" if data["Event"] == "unsubscribe": receive_message_data["MsgType"] = "unsubscribe" return super(WechatEnterpriseReceiveMessage, self).create(receive_message_data) def process_message(self, data): """ 处理未处理和失败的消息 :param data: :return: """ messages = self.sudo().add_message(data) for message in messages: if message: if message.state == '2': break if data["MsgType"] == "text": process = self.env['we.receive.message.process'].get_message_process(data["MsgType"], data["Content"], data["AgentID"]) else: process = self.env['we.receive.message.process'].get_message_process(data["MsgType"], " ", data["AgentID"]) try: if process: if data["MsgType"] == "voice" or data["MsgType"] == "image" or data["MsgType"] == "video" or \ data["MsgType"] == "shortvideo": process.sudo().exec_class_mothed(data["FromUserName"], data["AgentID"], data["MediaId"]) else: process.sudo().exec_class_mothed(data["FromUserName"], data["AgentID"]) else: return self.env['we.send.message'].sudo().send_text_message(data["FromUserName"], data["AgentID"], content=u'感谢您的关注!') message.sudo().write({'state': '1'}) except Exception as e: message.sudo().write({'state': u'处理失败'}) raise Warning(u'处理失败, 原因:%s', str(e))