| 
					
				 | 
			
			
				@ -15,7 +15,6 @@ let ParticipantRepo = require('../../repository/mysql/participant.repo'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				let WechatClient = require("../client/wechat.client.js"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				let AppClient = require("../client/app.client.js"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				let configFile = require('../../include/commons').CONFIG_FILE; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				let config = require('../../resources/config/' + configFile); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				let redis = RedisClient.redisClient().connection; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@ -64,14 +63,12 @@ class Sessions extends RedisModel { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    handler(err, null); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                ; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                ModelUtil.emitError(self.eventEmitter, {message: err, status: -1}, null); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                if (handler) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    handler(null, res); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                ; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                ModelUtil.emitOK(self.eventEmitter, {status: 200, data: res}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        }); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@ -143,7 +140,7 @@ class Sessions extends RedisModel { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                last_message_time: message.timestamp.getTime(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                last_content: message.content, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                last_content_type: message.content_type 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            redis.hmsetAsync(sessionKey, session).then(function () { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                Participants.saveParticipantsToRedis(sessionId, participantArray, createDate, function (res) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    handler(null, session); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@ -231,7 +228,6 @@ class Sessions extends RedisModel { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    handler(err, null); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                ; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                callBeginTrans(session); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        } 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@ -264,7 +260,6 @@ class Sessions extends RedisModel { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                        handler(err, null); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                        return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    ; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    handler(null, session); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        } 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@ -359,69 +354,79 @@ class Sessions extends RedisModel { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            // 遍历会话 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            function (sessionIds, callback) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            function (sessionIds) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                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); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    let participantsKey = RedisModel.makeRedisKey(REDIS_KEYS.SessionParticipants, sessionId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    redis.multi() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                        .hgetall(sessionKey)                       // 会话实体 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                        .hget(participantsRoleKey, userId)         // 用户在此会话中的角色 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                        .zscore(sessionParticipantsKey, userId)    // 用户在此会话中最后一次获取未读消息的时间 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                        .zrange(participantsKey, 0, -1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                        .execAsync() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                        .then(function (res) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                            let session = res[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                            let role = res[1]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                            let lastFetchTime = res[2]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                            let users = res[3]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                            let sessionName = ""; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                            let otheruserId = ""; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                            if (session.type == SESSION_TYPES.P2P) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                for (let j in users) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                    if (users[j] != userId) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                        otheruserId = users[j]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                            if (!role) role = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                            if (!lastFetchTime) lastFetchTime = new Date().getTime(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                            // 计算未读消息数 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                            let messagesByTimestampKey = RedisModel.makeRedisKey(REDIS_KEYS.MessagesByTimestamp, sessionId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                            redis.zcountAsync(messagesByTimestampKey, lastFetchTime, new Date().getTime()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                .then(function (count) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                    if (!otheruserId) otheruserId = userId; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                    ParticipantRepo.findNameById(otheruserId, function (err, res) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                        if ((res && res.length == 0) || session.type != SESSION_TYPES.P2P) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                            sessionName = session.name; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                        } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                            sessionName = res[0].name; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                        sessionList.push({ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                            id: sessionId, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                            name: sessionName, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                            create_date: session.create_date, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                            last_content_type: session.last_content_type, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                            last_content: session.last_content, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                            sender_id: session.sender_id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                            type: session.type, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                            sender_name: session.sender_name, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                            unread_count: count, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                            business_type: session.business_type, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                            my_role: role 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                        }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                        if (sessionId === sessionIds[sessionIds.length - 1]) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                            ModelUtil.emitOK(self.eventEmitter, sessionList); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                let functionList =[]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                for(var j = 0 ;j<sessionIds.length;j++){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    let fun = function(index,callback){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                            if(!callback) {callback =index,index=0}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                            let sessionId = sessionIds[index] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                            let sessionKey = RedisModel.makeRedisKey(REDIS_KEYS.Session, sessionId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                            let participantsRoleKey = RedisModel.makeRedisKey(REDIS_KEYS.SessionParticipantsRole, sessionId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                            let sessionParticipantsKey = RedisModel.makeRedisKey(REDIS_KEYS.SessionParticipants, sessionId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                            let participantsKey = RedisModel.makeRedisKey(REDIS_KEYS.SessionParticipants,sessionId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                            redis.multi() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                .hgetall(sessionKey)                       // 会话实体 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                .hget(participantsRoleKey, userId)         // 用户在此会话中的角色 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                .zscore(sessionParticipantsKey, userId)    // 用户在此会话中最后一次获取未读消息的时间 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                .zrange(participantsKey,0,-1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                .execAsync() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                .then(function (res) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                    let session = res[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                    let role = res[1]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                    let lastFetchTime = res[2]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                    let users = res[3]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                    let sessionName=""; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                    let otheruserId =""; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                    if(session.type==SESSION_TYPES.P2P){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                        for(var j in users){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                            if(users[j]!=userId){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                                otheruserId = users[j]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                    }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                        }).catch(function (err) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                        logger.error("Get sessions failed: ", ex); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                        ModelUtil.emitError(self.eventEmitter, "Get sessions failed: " + err); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                    if(!role)role =0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                    if(!lastFetchTime)lastFetchTime=new Date().getTime(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                    // 计算未读消息数 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                    let messagesByTimestampKey = RedisModel.makeRedisKey(REDIS_KEYS.MessagesByTimestamp, sessionId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                    redis.zcountAsync(messagesByTimestampKey, lastFetchTime, new Date().getTime()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                        .then(function (count) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                            if(!otheruserId)otheruserId=userId; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                            ParticipantRepo.findNameById(otheruserId, function (err, res) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                                if((res&&res.length==0)||session.type!=SESSION_TYPES.P2P){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                                    sessionName = session.name; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                                }else{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                                    sessionName = res[0].name; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                                sessionList.push({ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                                    id: sessionId, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                                    name: sessionName, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                                    create_date: session.create_date, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                                    last_content_type: session.last_content_type, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                                    last_content: session.last_content, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                                    sender_id: session.sender_id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                                    type: session.type, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                                    sender_name: session.sender_name, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                                    unread_count: count, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                                    business_type: session.business_type, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                                    my_role: role 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                                }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                                index=(parseInt(index)+1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                                if(index==sessionIds.length){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                                    ModelUtil.emitOK(self.eventEmitter, sessionList); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                                }else{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                                    callback(null,index); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                            }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                        }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                }).catch(function (err) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                logger.error("Get sessions failed: ", err); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                            }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    functionList.push(fun); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                async.waterfall(functionList); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        ]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    } 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@ -631,7 +636,7 @@ class Sessions extends RedisModel { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                ModelUtil.emitOK(self.eventEmitter, {count: count}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            for (let j in res) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                if (res[j].type == SESSION_TYPES.SYSTEM) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    if (j == res.length - 1) { 
			 |