|  | @ -15,6 +15,7 @@ let MessageRepo = require('../../repository/mysql/message.repo');
 | 
	
		
			
				|  |  | let ParticipantRepo = require('../../repository/mysql/participant.repo');
 | 
	
		
			
				|  |  | let ImDb = require('../../repository/mysql/db/im.db');
 | 
	
		
			
				|  |  | let WlyySDK = require("../../util/wlyy.sdk");
 | 
	
		
			
				|  |  | let ObjectUtil = require("../../util/object.util.js");
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  | let WechatClient = require("../client/wechat.client.js");
 | 
	
		
			
				|  |  | let AppClient = require("../client/app.client.js");
 | 
	
	
		
			
				|  | @ -440,6 +441,137 @@ class Sessions extends RedisModel {
 | 
	
		
			
				|  |  |                                 let userRoles = res[5];
 | 
	
		
			
				|  |  |                                 let participantsTime = [];
 | 
	
		
			
				|  |  |                                 let isInvite = true;
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |                                 //处理session未加入redis的bug
 | 
	
		
			
				|  |  |                                 if(session==null){
 | 
	
		
			
				|  |  |                                     let lastLoginTime = new Date();
 | 
	
		
			
				|  |  |                                     SessionRepo.findOne(sessionId, function (err, res) {
 | 
	
		
			
				|  |  |                                         if(res){
 | 
	
		
			
				|  |  |                                             session = res;
 | 
	
		
			
				|  |  |                                             let redisSession = [
 | 
	
		
			
				|  |  |                                                 "id", session.id,
 | 
	
		
			
				|  |  |                                                 "name", session.name,
 | 
	
		
			
				|  |  |                                                 "type", session.type,
 | 
	
		
			
				|  |  |                                                 "business_type", session.business_type,
 | 
	
		
			
				|  |  |                                                 "last_sender_id", session.last_sender_id||"",
 | 
	
		
			
				|  |  |                                                 "last_sender_name", session.last_sender_name||"",
 | 
	
		
			
				|  |  |                                                 "last_content_type", session.last_content_type||"",
 | 
	
		
			
				|  |  |                                                 "last_content", session.last_content||"",
 | 
	
		
			
				|  |  |                                                 "last_message_time", session.last_message_time||"",
 | 
	
		
			
				|  |  |                                                 "create_date", ObjectUtil.timestampToLong(session.create_date),
 | 
	
		
			
				|  |  |                                                 "status",session.status==null?0:session.status
 | 
	
		
			
				|  |  |                                             ];
 | 
	
		
			
				|  |  |                                             // cache sessions
 | 
	
		
			
				|  |  |                                             redis.multi()
 | 
	
		
			
				|  |  |                                                 .zadd(REDIS_KEYS.Sessions, lastLoginTime.getTime(), sessionId)                                           // 会话的最后活动时间设置为此用户的登录时间
 | 
	
		
			
				|  |  |                                                 .zadd(RedisModel.makeRedisKey(REDIS_KEYS.UserSessions, userId), lastLoginTime.getTime(), sessionId)      // 会话的最后活动时间设置为此用户的登录时间
 | 
	
		
			
				|  |  |                                                 .hmset(RedisModel.makeRedisKey(REDIS_KEYS.Session, sessionId), redisSession)
 | 
	
		
			
				|  |  |                                                 .execAsync()
 | 
	
		
			
				|  |  |                                                 .then(function (res) {
 | 
	
		
			
				|  |  |                                                     // cache participants
 | 
	
		
			
				|  |  |                                                     let sessionParticipantsKey = RedisModel.makeRedisKey(REDIS_KEYS.SessionParticipants, sessionId);
 | 
	
		
			
				|  |  |                                                     let sessionParticipantsRoleKey = RedisModel.makeRedisKey(REDIS_KEYS.SessionParticipantsRole, sessionId);
 | 
	
		
			
				|  |  |                                                     ParticipantRepo.findAll(sessionId, function (err, participants) {
 | 
	
		
			
				|  |  |                                                         if (err) {
 | 
	
		
			
				|  |  |                                                             ModelUtil.emitError(self.eventEmitter, err.message);
 | 
	
		
			
				|  |  |                                                             return;
 | 
	
		
			
				|  |  |                                                         }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |                                                         let multi = redis.multi();
 | 
	
		
			
				|  |  |                                                         participants.forEach(function (participant) {
 | 
	
		
			
				|  |  |                                                             let participantId = participant.id;
 | 
	
		
			
				|  |  |                                                             let participantRole = participant.role;
 | 
	
		
			
				|  |  |                                                             let score = ObjectUtil.timestampToLong(participant.last_fetch_time||(new Date()));
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |                                                             multi = multi.zadd(sessionParticipantsKey, score, participantId)
 | 
	
		
			
				|  |  |                                                                 .hset(sessionParticipantsRoleKey, participantId, participantRole);
 | 
	
		
			
				|  |  |                                                         });
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |                                                         multi.execAsync()
 | 
	
		
			
				|  |  |                                                             .then(function (res) {
 | 
	
		
			
				|  |  |                                                             })
 | 
	
		
			
				|  |  |                                                             .catch(function (ex) {
 | 
	
		
			
				|  |  |                                                                 log.error("Login failed while caching participants: ", ex);
 | 
	
		
			
				|  |  |                                                             });
 | 
	
		
			
				|  |  |                                                     });
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |                                                     // cache messages
 | 
	
		
			
				|  |  |                                                     let messagesKey = RedisModel.makeRedisKey(REDIS_KEYS.Messages, sessionId);
 | 
	
		
			
				|  |  |                                                     let messagesByTimestampKey = RedisModel.makeRedisKey(REDIS_KEYS.MessagesByTimestamp, sessionId);
 | 
	
		
			
				|  |  |                                                     MessageRepo.findBySessionId(sessionId, 0, config.sessionConfig.maxMessageCount, null, function (err, messages) {
 | 
	
		
			
				|  |  |                                                         if (err) {
 | 
	
		
			
				|  |  |                                                             ModelUtil.emitError(self.eventEmitter, err.message);
 | 
	
		
			
				|  |  |                                                             return;
 | 
	
		
			
				|  |  |                                                         }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |                                                         let multi = redis.multi();
 | 
	
		
			
				|  |  |                                                         messages.forEach(function (message) {
 | 
	
		
			
				|  |  |                                                             let msgJson = {
 | 
	
		
			
				|  |  |                                                                 id: message.id,
 | 
	
		
			
				|  |  |                                                                 sender_id: message.sender_id,
 | 
	
		
			
				|  |  |                                                                 sender_name: message.sender_name,
 | 
	
		
			
				|  |  |                                                                 timestamp: ObjectUtil.timestampToLong(message.timestamp),
 | 
	
		
			
				|  |  |                                                                 content_type: message.content_type,
 | 
	
		
			
				|  |  |                                                                 content: message.content
 | 
	
		
			
				|  |  |                                                             };
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |                                                             multi = multi.hset(messagesKey, message.id, JSON.stringify(msgJson))
 | 
	
		
			
				|  |  |                                                                 .zadd(messagesByTimestampKey, ObjectUtil.timestampToLong(message.timestamp), message.id);
 | 
	
		
			
				|  |  |                                                         });
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |                                                         multi.execAsync()
 | 
	
		
			
				|  |  |                                                             .then(function (res) {
 | 
	
		
			
				|  |  |                                                             })
 | 
	
		
			
				|  |  |                                                             .catch(function (ex) {
 | 
	
		
			
				|  |  |                                                                 log.error("Login failed while caching messages: ", ex);
 | 
	
		
			
				|  |  |                                                             });
 | 
	
		
			
				|  |  |                                                     });
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |                                                     // cache topics for MUC
 | 
	
		
			
				|  |  |                                                     let topicsKey = RedisModel.makeRedisKey(REDIS_KEYS.Topics, sessionId);
 | 
	
		
			
				|  |  |                                                     TopicRepo.findAllBySessionId(sessionId, function (err, topics) {
 | 
	
		
			
				|  |  |                                                         if (err) {
 | 
	
		
			
				|  |  |                                                             ModelUtil.emitError(self.eventEmitter, err.message);
 | 
	
		
			
				|  |  |                                                             return;
 | 
	
		
			
				|  |  |                                                         }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |                                                         topics.forEach(function (topic) {
 | 
	
		
			
				|  |  |                                                             let topicKey = RedisModel.makeRedisKey(REDIS_KEYS.Topic, topic.id);
 | 
	
		
			
				|  |  |                                                             let topicId = topic.id;
 | 
	
		
			
				|  |  |                                                             let name = topic.name == null ? "" : topic.name;
 | 
	
		
			
				|  |  |                                                             let createTime = ObjectUtil.timestampToLong(topic.create_time);
 | 
	
		
			
				|  |  |                                                             let endBy = topic.end_by == null ? "" : topic.end_by;
 | 
	
		
			
				|  |  |                                                             let endTime = topic.end_time == null ? 0 : ObjectUtil.timestampToLong(topic.end_time);
 | 
	
		
			
				|  |  |                                                             let startMessageId = topic.start_message_id == null ? "" : topic.start_message_id;
 | 
	
		
			
				|  |  |                                                             let endMessageId = topic.end_message_id == null ? "" : topic.end_message_id;
 | 
	
		
			
				|  |  |                                                             let description = topic.description == null ? "" : topic.description;
 | 
	
		
			
				|  |  |                                                             let status = topic.status == null ? 0 : topic.status;
 | 
	
		
			
				|  |  |                                                             redisConn.multi()
 | 
	
		
			
				|  |  |                                                                 .zadd(topicsKey, createTime, topicId)
 | 
	
		
			
				|  |  |                                                                 .hmset(topicKey,
 | 
	
		
			
				|  |  |                                                                     'name', name,
 | 
	
		
			
				|  |  |                                                                     'session_id', sessionId,
 | 
	
		
			
				|  |  |                                                                     'create_time', createTime,
 | 
	
		
			
				|  |  |                                                                     'end_by', endBy,
 | 
	
		
			
				|  |  |                                                                     'end_time', endTime,
 | 
	
		
			
				|  |  |                                                                     'start_message_id', startMessageId,
 | 
	
		
			
				|  |  |                                                                     'end_message_id', endMessageId,
 | 
	
		
			
				|  |  |                                                                     'description', description,
 | 
	
		
			
				|  |  |                                                                     'status', status)
 | 
	
		
			
				|  |  |                                                                 .execAsync()
 | 
	
		
			
				|  |  |                                                                 .catch(function (ex) {
 | 
	
		
			
				|  |  |                                                                     log.error("Login failed while caching topics: ", ex);
 | 
	
		
			
				|  |  |                                                                 });
 | 
	
		
			
				|  |  |                                                         });
 | 
	
		
			
				|  |  |                                                     });
 | 
	
		
			
				|  |  |                                                 })
 | 
	
		
			
				|  |  |                                                 .catch(function (ex) {
 | 
	
		
			
				|  |  |                                                     log.error("Login failed while caching sessions: ", ex);
 | 
	
		
			
				|  |  |                                                 });
 | 
	
		
			
				|  |  |                                         }
 | 
	
		
			
				|  |  |                                     });
 | 
	
		
			
				|  |  |                                 }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |                                 for(var j in userRoles){
 | 
	
		
			
				|  |  |                                     if(userRoles[j]==1){
 | 
	
		
			
				|  |  |                                         isInvite = false;
 | 
	
	
		
			
				|  | @ -687,12 +819,46 @@ class Sessions extends RedisModel {
 | 
	
		
			
				|  |  |         if (!start_msg_id && !end_msg_id) {
 | 
	
		
			
				|  |  |             redis.zrevrangeAsync(message_timestamp_key, 0, 0).then(function (res) {
 | 
	
		
			
				|  |  |                 if (res.length == 0) {
 | 
	
		
			
				|  |  |                     if (handler) {
 | 
	
		
			
				|  |  |                         handler(null, res);
 | 
	
		
			
				|  |  |                         return;
 | 
	
		
			
				|  |  |                     }
 | 
	
		
			
				|  |  |                     ModelUtil.emitOK(self.eventEmitter, res);
 | 
	
		
			
				|  |  |                     return;
 | 
	
		
			
				|  |  |                     //修复应redis没有缓冲聊天记录导致会话列表加载不出来
 | 
	
		
			
				|  |  |                     // cache messages
 | 
	
		
			
				|  |  |                     let messagesKey = RedisModel.makeRedisKey(REDIS_KEYS.Messages, sessionId);
 | 
	
		
			
				|  |  |                     MessageRepo.findBySessionId(sessionId, 0, config.sessionConfig.maxMessageCount, null, function (err, messages) {
 | 
	
		
			
				|  |  |                         if (err) {
 | 
	
		
			
				|  |  |                             ModelUtil.emitError(self.eventEmitter, err.message);
 | 
	
		
			
				|  |  |                             return;
 | 
	
		
			
				|  |  |                         }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |                         let multi = redis.multi();
 | 
	
		
			
				|  |  |                         messages.forEach(function (message) {
 | 
	
		
			
				|  |  |                             let msgJson = {
 | 
	
		
			
				|  |  |                                 id: message.id,
 | 
	
		
			
				|  |  |                                 sender_id: message.sender_id,
 | 
	
		
			
				|  |  |                                 sender_name: message.sender_name,
 | 
	
		
			
				|  |  |                                 timestamp: ObjectUtil.timestampToLong(message.timestamp),
 | 
	
		
			
				|  |  |                                 content_type: message.content_type,
 | 
	
		
			
				|  |  |                                 content: message.content
 | 
	
		
			
				|  |  |                             };
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |                             multi = multi.hset(messagesKey, message.id, JSON.stringify(msgJson))
 | 
	
		
			
				|  |  |                                 .zadd(message_timestamp_key, ObjectUtil.timestampToLong(message.timestamp), message.id);
 | 
	
		
			
				|  |  |                         });
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |                         multi.execAsync()
 | 
	
		
			
				|  |  |                             .then(function (res) {
 | 
	
		
			
				|  |  |                             })
 | 
	
		
			
				|  |  |                             .catch(function (ex) {
 | 
	
		
			
				|  |  |                                 log.error("Login failed while caching messages: ", ex);
 | 
	
		
			
				|  |  |                                 ModelUtil.emitOK(self.eventEmitter, res);
 | 
	
		
			
				|  |  |                                 return;
 | 
	
		
			
				|  |  |                             });
 | 
	
		
			
				|  |  |                     });
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |                     // if (handler) {
 | 
	
		
			
				|  |  |                     //     handler(null, res);
 | 
	
		
			
				|  |  |                     //     return;
 | 
	
		
			
				|  |  |                     // }
 | 
	
		
			
				|  |  |                     // ModelUtil.emitOK(self.eventEmitter, res);
 | 
	
		
			
				|  |  |                     // return;
 | 
	
		
			
				|  |  |                 }
 | 
	
		
			
				|  |  |                 start_msg_id = res[0];
 | 
	
		
			
				|  |  |                 redis.zrangeAsync(message_timestamp_key, 0, 0).then(function (res) {
 |