|  | @ -79,7 +79,7 @@ class Sessions extends RedisModel {
 | 
	
		
			
				|  |  |                 // 保存会话及成员至MySQL中
 | 
	
		
			
				|  |  |                 self.saveSessionToMysql(sessionId, name, type, createDate, function (err, res) {
 | 
	
		
			
				|  |  |                     Participants.saveParticipantsToMysql(sessionId, participantArray, function (err, res) {
 | 
	
		
			
				|  |  |                         if(err){
 | 
	
		
			
				|  |  |                         if (err) {
 | 
	
		
			
				|  |  |                             ModelUtil.emitError(self.eventEmitter, err.message);
 | 
	
		
			
				|  |  |                             return;
 | 
	
		
			
				|  |  |                         }
 | 
	
	
		
			
				|  | @ -152,86 +152,64 @@ class Sessions extends RedisModel {
 | 
	
		
			
				|  |  |             size = size + page;
 | 
	
		
			
				|  |  |         }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |         // 倒序获取
 | 
	
		
			
				|  |  |         redis.zrevrangeAsync(userSessionKey, page, size).then(function (res) {
 | 
	
		
			
				|  |  |             let sessionList = [];
 | 
	
		
			
				|  |  |             if (res.length == 0) {
 | 
	
		
			
				|  |  |                 ModelUtil.emitOK(self.eventEmitter, []);
 | 
	
		
			
				|  |  |                 return;
 | 
	
		
			
				|  |  |             }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |             for (let i in res) {
 | 
	
		
			
				|  |  |                 callGetSessions(res[i], i == res.length - 1);
 | 
	
		
			
				|  |  |             }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |             function callGetSessions(sessionId, lastOne) {
 | 
	
		
			
				|  |  |                 let sessionKey = RedisModel.makeRedisKey(REDIS_KEYS.Session, sessionId);
 | 
	
		
			
				|  |  |                 redis.hgetallAsync(sessionKey).then(function (session) {
 | 
	
		
			
				|  |  |                     let sessionParticipantsKey = RedisModel.makeRedisKey(REDIS_KEYS.SessionParticipants, sessionId);
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |                     // 对比当前用户最后一次此会话消息的时间与会话中最新的消息时间,以此判断未读消息数量
 | 
	
		
			
				|  |  |                     redis.zscoreAsync(sessionParticipantsKey, userId).then(function (lastFetchTime) {
 | 
	
		
			
				|  |  |                         callGetUnreadCount(session, sessionId, lastFetchTime, lastOne);
 | 
	
		
			
				|  |  |                     })
 | 
	
		
			
				|  |  |                 }).catch(function (err) {
 | 
	
		
			
				|  |  |                     throw err;
 | 
	
		
			
				|  |  |                 })
 | 
	
		
			
				|  |  |             }
 | 
	
		
			
				|  |  |         async.waterfall([
 | 
	
		
			
				|  |  |             // 获取会话ID列表
 | 
	
		
			
				|  |  |             function (callback) {
 | 
	
		
			
				|  |  |                 redis.zrevrangeAsync(userSessionKey, page, size)
 | 
	
		
			
				|  |  |                     .then(function (sessionIds) {
 | 
	
		
			
				|  |  |                         if (sessionIds.length == 0) {
 | 
	
		
			
				|  |  |                             ModelUtil.emitOK(self.eventEmitter, []);
 | 
	
		
			
				|  |  |                             return;
 | 
	
		
			
				|  |  |                         }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |             /**
 | 
	
		
			
				|  |  |              * 统计未读消息数。以当前时间为准。
 | 
	
		
			
				|  |  |              *
 | 
	
		
			
				|  |  |              * @param session 返回的会话列表
 | 
	
		
			
				|  |  |              * @param sessionId 当前会话ID
 | 
	
		
			
				|  |  |              * @param lastFetchTime 当前会话当前用户的最后一次时间搓
 | 
	
		
			
				|  |  |              * @param lastOne
 | 
	
		
			
				|  |  |              */
 | 
	
		
			
				|  |  |             function callGetUnreadCount(session, sessionId, lastFetchTime, lastOne) {
 | 
	
		
			
				|  |  |                 let messagesByTimestampKey = RedisModel.makeRedisKey(REDIS_KEYS.MessagesByTimestamp, sessionId);
 | 
	
		
			
				|  |  |                 redis.zrangebyscoreAsync(messagesByTimestampKey, lastFetchTime, (new Date().getTime()))
 | 
	
		
			
				|  |  |                     .then(function (messagetimelist) {
 | 
	
		
			
				|  |  |                         session.id = sessionId;
 | 
	
		
			
				|  |  |                         session.unread_count = messagetimelist.length;
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |                         callGetMyRole(session, sessionId, lastOne);
 | 
	
		
			
				|  |  |                         callback(null, sessionIds);
 | 
	
		
			
				|  |  |                     })
 | 
	
		
			
				|  |  |                     .catch(function (err) {
 | 
	
		
			
				|  |  |                         throw err;
 | 
	
		
			
				|  |  |                     });
 | 
	
		
			
				|  |  |             }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |             /**
 | 
	
		
			
				|  |  |              * 获取用户在此会话中的角色。
 | 
	
		
			
				|  |  |              *
 | 
	
		
			
				|  |  |              * @param session 要返回的JSON
 | 
	
		
			
				|  |  |              * @param sessionId
 | 
	
		
			
				|  |  |              * @param lastOne
 | 
	
		
			
				|  |  |              */
 | 
	
		
			
				|  |  |             function callGetMyRole(session, sessionId, lastOne) {
 | 
	
		
			
				|  |  |                 let participantsRoleKey = RedisModel.makeRedisKey(REDIS_KEYS.SessionParticipantsRole, sessionId);
 | 
	
		
			
				|  |  |                 redis.hgetAsync(participantsRoleKey, userId).then(function (role) {
 | 
	
		
			
				|  |  |                     session.my_role = role;
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |                     callback(session, lastOne);
 | 
	
		
			
				|  |  |                 })
 | 
	
		
			
				|  |  |             }
 | 
	
		
			
				|  |  |             },
 | 
	
		
			
				|  |  |             // 遍历会话
 | 
	
		
			
				|  |  |             function (sessionIds, callback) {
 | 
	
		
			
				|  |  |                 let sessionList = [];
 | 
	
		
			
				|  |  |                 sessionIds.forEach(function (sessionId) {
 | 
	
		
			
				|  |  |                     let sessionKey = RedisModel.makeRedisKey(REDIS_KEYS.Session, sessionId);
 | 
	
		
			
				|  |  |                     let participantsRoleKey = RedisModel.makeRedisKey(REDIS_KEYS.SessionParticipantsRole, sessionId);
 | 
	
		
			
				|  |  |                     let sessionParticipantsKey = RedisModel.makeRedisKey(REDIS_KEYS.SessionParticipants, sessionId);
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |             /**
 | 
	
		
			
				|  |  |              * 列表封装完毕后由此回调返回数据界面
 | 
	
		
			
				|  |  |              *
 | 
	
		
			
				|  |  |              * @param session
 | 
	
		
			
				|  |  |              * @param lastOne
 | 
	
		
			
				|  |  |              */
 | 
	
		
			
				|  |  |             function callback(session, lastOne) {
 | 
	
		
			
				|  |  |                 sessionList.push(session);
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |                 if (lastOne) {
 | 
	
		
			
				|  |  |                     ModelUtil.emitOK(self.eventEmitter, sessionList);
 | 
	
		
			
				|  |  |                 }
 | 
	
		
			
				|  |  |                     redis.multi()
 | 
	
		
			
				|  |  |                         .hgetall(sessionKey)                       // 会话实体
 | 
	
		
			
				|  |  |                         .hget(participantsRoleKey, userId)         // 用户在此会话中的角色
 | 
	
		
			
				|  |  |                         .zscore(sessionParticipantsKey, userId)    // 用户在此会话中最后一次获取未读消息的时间
 | 
	
		
			
				|  |  |                         .execAsync()
 | 
	
		
			
				|  |  |                         .then(function (res) {
 | 
	
		
			
				|  |  |                             let session = res[0];
 | 
	
		
			
				|  |  |                             let role = res[1];
 | 
	
		
			
				|  |  |                             let lastFetchTime = res[2];
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |                             // 计算未读消息数
 | 
	
		
			
				|  |  |                             let messagesByTimestampKey = RedisModel.makeRedisKey(REDIS_KEYS.MessagesByTimestamp, sessionId);
 | 
	
		
			
				|  |  |                             redis.zcountAsync(messagesByTimestampKey, lastFetchTime, new Date().getTime())
 | 
	
		
			
				|  |  |                                 .then(function (count) {
 | 
	
		
			
				|  |  |                                     sessionList.push({
 | 
	
		
			
				|  |  |                                         id: sessionId,
 | 
	
		
			
				|  |  |                                         name: session.name,
 | 
	
		
			
				|  |  |                                         create_date: session.create_date,
 | 
	
		
			
				|  |  |                                         last_content_type: session.last_content_type,
 | 
	
		
			
				|  |  |                                         last_content: session.last_content,
 | 
	
		
			
				|  |  |                                         sender_id: session.sender_id,
 | 
	
		
			
				|  |  |                                         sender_name: session.sender_name,
 | 
	
		
			
				|  |  |                                         unread_count: count,
 | 
	
		
			
				|  |  |                                         my_role: role
 | 
	
		
			
				|  |  |                                     });
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |                                     if (sessionId === sessionIds[sessionIds.length - 1]) {
 | 
	
		
			
				|  |  |                                         ModelUtil.emitOK(self.eventEmitter, sessionList);
 | 
	
		
			
				|  |  |                                     }
 | 
	
		
			
				|  |  |                                 });
 | 
	
		
			
				|  |  |                         })
 | 
	
		
			
				|  |  |                         .catch(function (err) {
 | 
	
		
			
				|  |  |                             ModelUtil.emitError(self.eventEmitter, "Get sessions failed: " + err);
 | 
	
		
			
				|  |  |                         });
 | 
	
		
			
				|  |  |                 });
 | 
	
		
			
				|  |  |             }
 | 
	
		
			
				|  |  |         }).catch(function (err) {
 | 
	
		
			
				|  |  |             ModelUtil.emitError(self.eventEmitter, {message: "Get sessions failed: " + err});
 | 
	
		
			
				|  |  |         })
 | 
	
		
			
				|  |  |         ]);
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     /**
 | 
	
	
		
			
				|  | @ -247,13 +225,13 @@ class Sessions extends RedisModel {
 | 
	
		
			
				|  |  |         let message_timestamp_key = RedisModel.makeRedisKey(REDIS_KEYS.MessagesByTimestamp, sessionId);
 | 
	
		
			
				|  |  |         if (!start_msg_id && !end_msg_id) {
 | 
	
		
			
				|  |  |             redis.zrevrangeAsync(message_timestamp_key, 0, 0).then(function (res) {
 | 
	
		
			
				|  |  |                 if(res.length==0){
 | 
	
		
			
				|  |  |                 if (res.length == 0) {
 | 
	
		
			
				|  |  |                     ModelUtil.emitOK(self.eventEmitter, res);
 | 
	
		
			
				|  |  |                     return;
 | 
	
		
			
				|  |  |                 }
 | 
	
		
			
				|  |  |                 start_msg_id = res[0];
 | 
	
		
			
				|  |  |                 redis.zrangeAsync(message_timestamp_key, 0, 0).then(function (res) {
 | 
	
		
			
				|  |  |                     if(res.length==0){
 | 
	
		
			
				|  |  |                     if (res.length == 0) {
 | 
	
		
			
				|  |  |                         ModelUtil.emitOK(self.eventEmitter, res);
 | 
	
		
			
				|  |  |                         return;
 | 
	
		
			
				|  |  |                     }
 | 
	
	
		
			
				|  | @ -261,7 +239,7 @@ class Sessions extends RedisModel {
 | 
	
		
			
				|  |  |                     self.getMessagesByPage(sessionId, user, start_msg_id, end_msg_id, page, pagesize, function (err, res) {
 | 
	
		
			
				|  |  |                         if (err) {
 | 
	
		
			
				|  |  |                             logger.error("getMessagesByPage error" + err);
 | 
	
		
			
				|  |  |                             ModelUtil.emitError(self.eventEmitter,err,err);
 | 
	
		
			
				|  |  |                             ModelUtil.emitError(self.eventEmitter, err, err);
 | 
	
		
			
				|  |  |                         } else {
 | 
	
		
			
				|  |  |                             ModelUtil.emitOK(self.eventEmitter, res);
 | 
	
		
			
				|  |  |                         }
 | 
	
	
		
			
				|  | @ -270,7 +248,7 @@ class Sessions extends RedisModel {
 | 
	
		
			
				|  |  |             })
 | 
	
		
			
				|  |  |         } else if (!start_msg_id) {
 | 
	
		
			
				|  |  |             redis.zrevrangeAsync(message_timestamp_key, 0, 0).then(function (res) {
 | 
	
		
			
				|  |  |                 if(res.length==0){
 | 
	
		
			
				|  |  |                 if (res.length == 0) {
 | 
	
		
			
				|  |  |                     ModelUtil.emitOK(self.eventEmitter, res);
 | 
	
		
			
				|  |  |                     return;
 | 
	
		
			
				|  |  |                 }
 | 
	
	
		
			
				|  | @ -278,7 +256,7 @@ class Sessions extends RedisModel {
 | 
	
		
			
				|  |  |                 self.getMessagesByPage(sessionId, user, startMsgId, endMsgId, page, pagesize, function (err, res) {
 | 
	
		
			
				|  |  |                     if (err) {
 | 
	
		
			
				|  |  |                         logger.error("getMessagesByPage error" + err);
 | 
	
		
			
				|  |  |                         ModelUtil.emitError(self.eventEmitter,err,err);
 | 
	
		
			
				|  |  |                         ModelUtil.emitError(self.eventEmitter, err, err);
 | 
	
		
			
				|  |  |                     } else {
 | 
	
		
			
				|  |  |                         ModelUtil.emitOK(self.eventEmitter, res);
 | 
	
		
			
				|  |  |                     }
 | 
	
	
		
			
				|  | @ -286,7 +264,7 @@ class Sessions extends RedisModel {
 | 
	
		
			
				|  |  |             })
 | 
	
		
			
				|  |  |         } else if (!end_msg_id) {
 | 
	
		
			
				|  |  |             redis.zrangeAsync(message_timestamp_key, 0, 0).then(function (res) {
 | 
	
		
			
				|  |  |                 if(res.length==0){
 | 
	
		
			
				|  |  |                 if (res.length == 0) {
 | 
	
		
			
				|  |  |                     ModelUtil.emitOK(self.eventEmitter, res);
 | 
	
		
			
				|  |  |                     return;
 | 
	
		
			
				|  |  |                 }
 | 
	
	
		
			
				|  | @ -294,7 +272,7 @@ class Sessions extends RedisModel {
 | 
	
		
			
				|  |  |                 self.getMessagesByPage(sessionId, user, start_msg_id, end_msg_id, page, pagesize, function (err, res) {
 | 
	
		
			
				|  |  |                     if (err) {
 | 
	
		
			
				|  |  |                         logger.error("getMessagesByPage error" + err);
 | 
	
		
			
				|  |  |                         ModelUtil.emitError(self.eventEmitter,err,err);
 | 
	
		
			
				|  |  |                         ModelUtil.emitError(self.eventEmitter, err, err);
 | 
	
		
			
				|  |  |                     } else {
 | 
	
		
			
				|  |  |                         ModelUtil.emitOK(self.eventEmitter, res);
 | 
	
		
			
				|  |  |                     }
 | 
	
	
		
			
				|  | @ -304,7 +282,7 @@ class Sessions extends RedisModel {
 | 
	
		
			
				|  |  |             self.getMessagesByPage(sessionId, user, start_msg_id, end_msg_id, page, pagesize, function (err, res) {
 | 
	
		
			
				|  |  |                 if (err) {
 | 
	
		
			
				|  |  |                     logger.error("getMessagesByPage error" + err);
 | 
	
		
			
				|  |  |                     ModelUtil.emitError(self.eventEmitter,err,err);
 | 
	
		
			
				|  |  |                     ModelUtil.emitError(self.eventEmitter, err, err);
 | 
	
		
			
				|  |  |                 } else {
 | 
	
		
			
				|  |  |                     ModelUtil.emitOK(self.eventEmitter, res);
 | 
	
		
			
				|  |  |                 }
 | 
	
	
		
			
				|  | @ -333,7 +311,7 @@ class Sessions extends RedisModel {
 | 
	
		
			
				|  |  |         let offset = (page - 1 < 0 ? 0 : page - 1) * size;
 | 
	
		
			
				|  |  |         let count = 20;
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |         participants.existsParticipant(sessionId, user, function (err,res) {
 | 
	
		
			
				|  |  |         participants.existsParticipant(sessionId, user, function (err, res) {
 | 
	
		
			
				|  |  |             if (!res) {
 | 
	
		
			
				|  |  |                 handler("用户不在此会话中!", false);
 | 
	
		
			
				|  |  |             } else {
 | 
	
	
		
			
				|  | @ -491,7 +469,7 @@ class Sessions extends RedisModel {
 | 
	
		
			
				|  |  |             if (res) {
 | 
	
		
			
				|  |  |                 redis.hmgetAsync(sessionKey, ["type", "name"]).then(function (res) {
 | 
	
		
			
				|  |  |                     let sessionType = res[0];
 | 
	
		
			
				|  |  |                     if(sessionType == null){
 | 
	
		
			
				|  |  |                     if (sessionType == null) {
 | 
	
		
			
				|  |  |                         ModelUtil.emitError(self.eventEmitter, "Session with id " + sessionId + " not found.");
 | 
	
		
			
				|  |  |                         return;
 | 
	
		
			
				|  |  |                     }
 |