| 
					
				 | 
			
			
				@ -13,8 +13,10 @@ let Participants = require('./Participants'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				let imDb = require('../../repository/mysql/db/im.db'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				let log = require('../../util/log.js'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				const RedisKeys = require('../../include/commons').REDIS_KEYS; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				const IMTABLE = require('../../include/commons').IM_DB; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				const Commons = require('../../include/commons') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				const Commons = require('../../include/commons'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				let configFile = require('../../include/commons').CONFIG_FILE; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				let config = require('../../resources/config/' + configFile); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				let SessionRepo = require('../repository/mysql/session.repo'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				let mongoose = require('mongoose'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				class Sessions extends RedisModel { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@ -28,20 +30,7 @@ class Sessions extends RedisModel { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @param handler 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    getUserSessionsFromMysql(userId,handler){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        let sql ="select select session_id from participants w where w.participaint_id = ? group by w.session_id"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        let sessionsql = "select id,name,type,create_date from session s where s.id in("+sql+")"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        imDb.execQuery({ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            "sql": sessionsql, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            "args": [userId], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            "handler": function (err, res) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                if(err) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    log.error("sql:"+sessionsql+"data:userId:"+userId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                }else{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    log.info("getMysqlUserSessions success by userId :"+userId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                handler(err,res); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        SessionRepo.getUserSessionsFromMysql(userId,handler); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    /** 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@ -50,19 +39,7 @@ class Sessions extends RedisModel { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @param handler 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    getSessions(sessionId,handler){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        let sessionsql = "select id,name,type,create_date from session s where s.id=?"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        imDb.execQuery({ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            "sql": sessionsql, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            "args": [sessionId], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            "handler": function (err, res) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                if(err) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    log.error("sql:"+sessionsql+"data:sessionId:"+sessionId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                }else{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    log.info("getSessions success by sessionId :"+sessionId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                handler(err,res); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        SessionRepo.getSessions(sessionId,handler); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    /** 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@ -149,39 +126,51 @@ class Sessions extends RedisModel { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        let message_timestamp_key = super.makeRedisKey(RedisKeys.MessagesTimestamp,sessionId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        let message_key = super.makeRedisKey(RedisKeys.Messages,sessionId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        let participants_key = super.makeRedisKey(RedisKeys.Participants,sessionId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        if(page>0){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            page = page*pagesize; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            pagesize = pagesize+page; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        let participants = new Participants(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        participants.existsUser(sessionId,user,function(res){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            if(!res){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                modelUtil.emitData(self.eventEmitter,{"status":-1,"msg":"用户不在此会话中!"}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            }else{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                //倒序取出最后N条消息 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                redis.zrevrangeAsync(message_timestamp_key,page,pagesize).then(function(res){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    //取出消息实体 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    if(res.length==0){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                        modelUtil.emitData(self.eventEmitter,{"status":200,"data":[]}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                        return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    redis.hmgetAsync(message_key,res).then(function(messages) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                        console.log(messages) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                        //将取到的消息返回给前端 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                        modelUtil.emitData(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; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        //超过最大限制后从mysql获取数据 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        if(page*pagesize>=config.sessionConfig.maxMessageCount){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            let message = new Messages(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            message.getMessageByPage(sessionId,page,pagesize,function(err,res){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                if(!err){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                      modelUtil.emitData(self.eventEmitter,{"status":200,"data":res}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                }else{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    modelUtil.emitData(self.eventEmitter,{"status":-1,"data":err}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        }else{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            if(page>0){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                page = page*pagesize; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                pagesize = pagesize+page; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            let participants = new Participants(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            participants.existsUser(sessionId,user,function(res){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                if(!res){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    modelUtil.emitData(self.eventEmitter,{"status":-1,"msg":"用户不在此会话中!"}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                }else{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    //倒序取出最后N条消息 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    redis.zrevrangeAsync(message_timestamp_key,page,pagesize).then(function(res){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                        //取出消息实体 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                        if(res.length==0){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                            modelUtil.emitData(self.eventEmitter,{"status":200,"data":[]}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                            return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                        redis.hmgetAsync(message_key,res).then(function(messages) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                            console.log(messages) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                            //将取到的消息返回给前端 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                            modelUtil.emitData(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.emitData(self.eventEmitter,{"status":-1,"msg":res}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                }).catch(function(res){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    modelUtil.emitData(self.eventEmitter,{"status":-1,"msg":res}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    /** 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@ -295,18 +284,7 @@ class Sessions extends RedisModel { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @param createDate 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    saveSessionToMysql(sessionId,name,type,createDate){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        let sql ="insert into "+IMTABLE.SESSIONS+" (id,name,type,create_date) VALUES (?,?,?,?) "; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        imDb.execQuery({ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            "sql": sql, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            "args": [sessionId,name,type,createDate], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            "handler": function (err, res) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                if(err) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    log.error("sql:"+sql+"data:sessionId:"+sessionId+",name:"+name+",type:"+type+",createDate:"+createDate); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                }else{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    log.info("save session to mysql is success by session :"+sessionId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        SessionRepo.saveSessionToMysql(sessionId,name,type,createDate); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    /** 
			 |