| 
					
				 | 
			
			
				@ -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) { 
			 |