| 
					
				 | 
			
			
				@ -236,58 +236,114 @@ class Sessions extends RedisModel { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @param page 第几页 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @param pagesize 分页数量 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    getMessages(sessionId, user, page, pagesize) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    getMessages(sessionId, user, start_msg_id, end_msg_id, page, pagesize) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        let self = this; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        let message_timestamp_key = RedisModel.makeRedisKey(REDIS_KEYS.MessagesByTimestamp, sessionId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        let message_key = RedisModel.makeRedisKey(REDIS_KEYS.Messages, sessionId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        let participants_key = RedisModel.makeRedisKey(REDIS_KEYS.SessionParticipants, sessionId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        //超过最大限制后从mysql获取数据 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        if (page * pagesize >= config.sessionConfig.maxMessageCount) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            self.getMessageFromMySQL(sessionId, page, pagesize, function (err, res) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                if (!err) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    ModelUtil.emitOK(self.eventEmitter, {"status": 200, "data": res}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    ModelUtil.emitOK(self.eventEmitter, {"status": -1, "data": err}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        if (!start_msg_id && !end_msg_id) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            redis.zrevrangeAsync(message_timestamp_key, 0, 0).then(function (res) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                start_msg_id = res[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                redis.zrangeAsync(message_timestamp_key, 0, 0).then(function (res) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    end_msg_id = res[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    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); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                        } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                            ModelUtil.emitOK(self.eventEmitter, res); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        } else if (!start_msg_id) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            redis.zrevrangeAsync(message_timestamp_key, 0, 0).then(function (res) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                start_msg_id = res[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                self.getMessagesByPage(sessionId, user, startMsgId, endMsgId, page, pagesize, function (err, res) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    if (err) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                        logger.error("getMessagesByPage error" + err); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                        ModelUtil.emitError(self.eventEmitter,err,err); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                        ModelUtil.emitOK(self.eventEmitter, res); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        } else if (!end_msg_id) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            redis.zrangeAsync(message_timestamp_key, 0, 0).then(function (res) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                end_msg_id = res[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                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); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                        ModelUtil.emitOK(self.eventEmitter, res); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            if (page > 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                page = page * pagesize; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                pagesize = pagesize + page; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            let participants = new Participants(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            participants.existsParticipant(sessionId, user, function (res) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                if (!res) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    ModelUtil.emitOK(self.eventEmitter, {"status": -1, "msg": "用户不在此会话中!"}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            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); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    //倒序取出最后N条消息 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    redis.zrevrangeAsync(message_timestamp_key, page, pagesize).then(function (res) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                        //取出消息实体 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                        if (res.length == 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                            ModelUtil.emitOK(self.eventEmitter, {"status": 200, "data": []}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                            return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                        redis.hmgetAsync(message_key, res).then(function (messages) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                            console.log(messages) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                            //将取到的消息返回给前端 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                            ModelUtil.emitOK(self.eventEmitter, {"status": 200, "data": messages}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                        }).then(function () { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                            //更新患者最后一次获取消息的日期 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                            redis.zaddAsync(participants_key, (new Date().getTime()), user).then(function (res) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                console.log(res); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                            }).catch(function (res) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                throw res; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                            }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                        }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    }).catch(function (res) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                        ModelUtil.emitOK(self.eventEmitter, {"status": -1, "msg": res}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    ModelUtil.emitOK(self.eventEmitter, res); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    getAllSessionsUnreadMessageCount(){} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    getMessagesByPage(sessionId, user, startMsgId, endMsgId, page, pagesize, handler) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        let self = this; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        let message_timestamp_key = RedisModel.makeRedisKey(REDIS_KEYS.MessagesByTimestamp, sessionId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        let message_key = RedisModel.makeRedisKey(REDIS_KEYS.Messages, sessionId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        let participants_key = RedisModel.makeRedisKey(REDIS_KEYS.SessionParticipants, sessionId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        let participants = new Participants(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        page = page - 1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        if (page < 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            page = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        if (page > 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            page = page * pagesize; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            pagesize = pagesize + page; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        participants.existsParticipant(sessionId, user, function (err,res) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            if (!res) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                handler("用户不在此会话中!", false); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                //将消息ID转换成分值 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                redis.zscoreAsync(message_timestamp_key, startMsgId).then(function (res) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    let startMsgScore = res; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    redis.zscoreAsync(message_timestamp_key, endMsgId).then(function (res) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                        let endMsgScore = res; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                        //倒序取出最后N条消息 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                        redis.zrevrangebyscoreAsync(message_timestamp_key, startMsgScore, endMsgScore, "limit", page, pagesize).then(function (res) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                            //取出消息实体 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                            if (res.length == 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                handler(null, res); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                            redis.hmgetAsync(message_key, res).then(function (messages) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                console.log(messages) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                //将取到的消息返回给前端 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                handler(null, messages); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                            }).then(function () { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                //更新患者最后一次获取消息的日期 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                redis.zaddAsync(participants_key, (new Date().getTime()), user).then(function (res) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                    console.log(res); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                }).catch(function (res) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                    throw res; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                            }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                        }).catch(function (res) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                            handler(res, false); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                        }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    getAllSessionsUnreadMessageCount() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * 获取会话的未读消息数。 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@ -295,7 +351,7 @@ class Sessions extends RedisModel { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @param sessionId 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @param userId 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    getSessionUnreadMessageCount(sessionId, userId){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    getSessionUnreadMessageCount(sessionId, userId) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@ -372,13 +428,13 @@ class Sessions extends RedisModel { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                }).then(function (res) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    //更新消息相关 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    return messages.saveMessageToRedis(sessionId,sessionType,messageId, message); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    return messages.saveMessageToRedis(sessionId, sessionType, messageId, message); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                }).then(function (res) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    //更新session的最后一条聊天记录 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    return Messages.updateLastContent(session_key, sessionType, name, message); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                }).then(function (res) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    //操作mysql数据库 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    messages.saveMessageToMysql(sessionId, sessionType, messageId, message,function(err,res){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    messages.saveMessageToMysql(sessionId, sessionType, messageId, message, function (err, res) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                        //返回数据给前端。 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                        handler(null, messageId) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    }); 
			 |