|
@ -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");
|
|
@ -33,6 +34,7 @@ const STICKY_SESSION_BASE_SCORE = require('../../include/commons').STICKY_SESSIO
|
|
|
const PARTICIPANT_ROLES = require('../../include/commons').PARTICIPANT_ROLES;
|
|
|
const CONTENT_TYPES = require('../../include/commons').CONTENT_TYPES;
|
|
|
const SESSION_BUSINESS_TYPE = require('../../include/commons').SESSION_BUSINESS_TYPE;
|
|
|
const SESSION_STATUS = require('../../include/commons').SESSION_STATUS;
|
|
|
|
|
|
|
|
|
class Sessions extends RedisModel {
|
|
@ -64,6 +66,7 @@ class Sessions extends RedisModel {
|
|
|
}
|
|
|
ModelUtil.emitError(self.eventEmitter, {message: err, status: -1}, null);
|
|
|
} else {
|
|
|
name = res.name;
|
|
|
//创建session到redis
|
|
|
self.createSessionToRedis(sessionId, name, type, participantArray, messageId, function (err, res) {
|
|
|
if (err) {
|
|
@ -118,8 +121,12 @@ class Sessions extends RedisModel {
|
|
|
}
|
|
|
} else {
|
|
|
if (!sessionId) {
|
|
|
handler("MUC OR GROUP session sessionId is not allow null .", null);
|
|
|
return;
|
|
|
if(type == SESSION_TYPES.DISCUSSION){
|
|
|
sessionId = messageId;
|
|
|
}else {
|
|
|
handler("MUC OR GROUP session sessionId is not allow null .", null);
|
|
|
return;
|
|
|
}
|
|
|
}
|
|
|
callBusinessType(sessionId);
|
|
|
}
|
|
@ -127,6 +134,8 @@ class Sessions extends RedisModel {
|
|
|
function callBusinessType(sessionId) {
|
|
|
if(type == SESSION_TYPES.MUC||type == SESSION_TYPES.PRESCRIPTION || SESSION_TYPES.PRESCRIPTION_HOSPITAL || SESSION_TYPES.ONDOOR_NURSING){
|
|
|
callCreate(sessionId, SESSION_BUSINESS_TYPE.PATIENT);
|
|
|
}else if(type==SESSION_TYPES.DISCUSSION||type==SESSION_TYPES.GROUP){
|
|
|
callCreate(sessionId, SESSION_BUSINESS_TYPE.DOCTOR);
|
|
|
}else {
|
|
|
ParticipantRepo.getBusinessType(participantIdArray, function (err, businessType) {
|
|
|
callCreate(sessionId, businessType);
|
|
@ -183,6 +192,9 @@ class Sessions extends RedisModel {
|
|
|
sessionId = res;
|
|
|
callBusinessType();
|
|
|
});
|
|
|
} else if(type == SESSION_TYPES.DISCUSSION){
|
|
|
sessionId = messageId;
|
|
|
callBusinessType();
|
|
|
} else {
|
|
|
return handler("MUC模式和团队模式,不允许sessionId为空!", null);
|
|
|
}
|
|
@ -194,6 +206,8 @@ class Sessions extends RedisModel {
|
|
|
function callBusinessType() {
|
|
|
if(type==SESSION_TYPES.MUC||type==SESSION_TYPES.PRESCRIPTION || SESSION_TYPES.PRESCRIPTION_HOSPITAL || SESSION_TYPES.ONDOOR_NURSING){
|
|
|
callCreateSession(SESSION_BUSINESS_TYPE.PATIENT);
|
|
|
}else if(type==SESSION_TYPES.SPECIALISTGROUP||type==SESSION_TYPES.DISCUSSION){
|
|
|
callCreateSession(SESSION_BUSINESS_TYPE.DOCTOR);
|
|
|
}else{
|
|
|
ParticipantRepo.getBusinessType(participantIdArray, function (err, businessType) {
|
|
|
if (err) {
|
|
@ -210,6 +224,8 @@ class Sessions extends RedisModel {
|
|
|
//查找该sessionId是否存在存在则直接返回实例
|
|
|
SessionRepo.findOne(sessionId, function (err, res) {
|
|
|
if (res.length > 0) {//已经存在
|
|
|
//已存在的会话不修改名称
|
|
|
name = res[0].name;
|
|
|
//更新成员
|
|
|
Participants.saveParticipantsToMysql(sessionId, participantArray, function (err, update) {
|
|
|
handler(null, res[0]);
|
|
@ -319,6 +335,25 @@ class Sessions extends RedisModel {
|
|
|
SessionRepo.findOne(sessionId, handler);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 判断会话是否存在
|
|
|
* @param sessionId
|
|
|
* @param handler
|
|
|
*/
|
|
|
isExist(sessionId) {
|
|
|
let self = this;
|
|
|
SessionRepo.findOne(sessionId, function (err, res) {
|
|
|
if(err){
|
|
|
log.error(err);
|
|
|
ModelUtil.emitError(self.eventEmitter, {message: err, status: -1}, null);
|
|
|
} else if(res&&res.length>0){
|
|
|
ModelUtil.emitOK(self.eventEmitter, {sessionId: res[0].id, status: 200});
|
|
|
}else {
|
|
|
ModelUtil.emitOK(self.eventEmitter, {sessionId: '', status: 200});
|
|
|
}
|
|
|
});
|
|
|
}
|
|
|
|
|
|
getSession(sessionId,userId,handler){
|
|
|
let self = this;
|
|
|
let sessionKey = RedisModel.makeRedisKey(REDIS_KEYS.Session, sessionId);
|
|
@ -367,15 +402,28 @@ class Sessions extends RedisModel {
|
|
|
}
|
|
|
async.waterfall([
|
|
|
// 获取会话ID列表
|
|
|
// function (callback) {
|
|
|
// redis.zrevrangeAsync(userSessionKey, page, size)
|
|
|
// .then(function (sessionIds) {
|
|
|
// if (sessionIds.length == 0) {
|
|
|
// ModelUtil.emitOK(self.eventEmitter, []);
|
|
|
// return;
|
|
|
// }
|
|
|
// callback(null, sessionIds);
|
|
|
// })
|
|
|
// },
|
|
|
function (callback) {
|
|
|
redis.zrevrangeAsync(userSessionKey, page, size)
|
|
|
.then(function (sessionIds) {
|
|
|
if (sessionIds.length == 0) {
|
|
|
ModelUtil.emitOK(self.eventEmitter, []);
|
|
|
return;
|
|
|
}
|
|
|
callback(null, sessionIds);
|
|
|
})
|
|
|
SessionRepo.findAllByType(userId,businessType,page,size,function(err,res){
|
|
|
if (res.length == 0) {
|
|
|
ModelUtil.emitOK(self.eventEmitter, []);
|
|
|
return;
|
|
|
}
|
|
|
var sessionIds=[];
|
|
|
for(var j in res){
|
|
|
sessionIds.push(res[j].id);
|
|
|
}
|
|
|
callback(null,sessionIds);
|
|
|
})
|
|
|
},
|
|
|
// 遍历会话
|
|
|
function (sessionIds) {
|
|
@ -407,6 +455,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;
|
|
@ -491,6 +670,149 @@ class Sessions extends RedisModel {
|
|
|
]);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 查找会话数
|
|
|
* @param userId
|
|
|
* @param type
|
|
|
* @param handler
|
|
|
*/
|
|
|
getSessionCountByType(userId,type,handler){
|
|
|
let self = this;
|
|
|
SessionRepo.findSessionCountByType(userId,type,function (err,res) {
|
|
|
if(res){
|
|
|
ModelUtil.emitOK(self.eventEmitter,{status:200,count:res[0].count});
|
|
|
return;
|
|
|
}else {
|
|
|
ModelUtil.emitOK(self.eventEmitter,{status:200,count:0});
|
|
|
return;
|
|
|
}
|
|
|
})
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 根据用户类型获取用户的session列表
|
|
|
* @param userId
|
|
|
* @param page
|
|
|
* @param size
|
|
|
* @param businessType
|
|
|
*/
|
|
|
getUserSessionsByType(userId,type,page, size) {
|
|
|
let userSessionKey = RedisModel.makeRedisKey(REDIS_KEYS.UserSessions, userId);
|
|
|
let self = this;
|
|
|
async.waterfall([
|
|
|
// 获取会话ID列表
|
|
|
function (callback) {
|
|
|
SessionRepo.findListByType(userId,type,page,size,function(err,res){
|
|
|
if (res.length == 0) {
|
|
|
ModelUtil.emitOK(self.eventEmitter, []);
|
|
|
return;
|
|
|
}
|
|
|
callback(null,res);
|
|
|
})
|
|
|
},
|
|
|
// 遍历会话
|
|
|
function (sessionIds) {
|
|
|
let sessionList = [];
|
|
|
let functionList = [];
|
|
|
for (let j = 0; j < sessionIds.length; j++) {
|
|
|
let fun = function (index, callback) {
|
|
|
if (!callback) {
|
|
|
callback = index, index = 0
|
|
|
}
|
|
|
|
|
|
let mysqlSession = sessionIds[index];
|
|
|
let sessionId = mysqlSession.id;
|
|
|
let sessionKey = RedisModel.makeRedisKey(REDIS_KEYS.Session, sessionId);
|
|
|
let sessionParticipantsKey = RedisModel.makeRedisKey(REDIS_KEYS.SessionParticipants, sessionId);
|
|
|
redis.multi()
|
|
|
.hgetall(sessionKey) // 会话实体
|
|
|
.zscore(sessionParticipantsKey, userId) // 用户在此会话中最后一次获取未读消息的时间
|
|
|
.zrange(sessionParticipantsKey, 0, -1)
|
|
|
.zrange(sessionParticipantsKey, 0,-1,'withscores') // 所有用户在此会话中最后一次获取未读消息的时间
|
|
|
.execAsync()
|
|
|
.then(function (res) {
|
|
|
let session = res[0];
|
|
|
let lastFetchTime = res[1];
|
|
|
let users = res[2];
|
|
|
let participantsTimeArray = res[3];
|
|
|
let participantsTime = [];
|
|
|
for(var j = 0 ;j<participantsTimeArray.length;j++){
|
|
|
if(j%2!=0)continue;
|
|
|
let participantsTimeJson = {};
|
|
|
participantsTimeJson[participantsTimeArray[j]] = participantsTimeArray[j+1];
|
|
|
participantsTime.push(participantsTimeJson);
|
|
|
}
|
|
|
let sessionName = "";
|
|
|
let otherUserId = "";
|
|
|
if (session.type == SESSION_TYPES.P2P) {
|
|
|
for (let j in users) {
|
|
|
if (users[j] != userId) {
|
|
|
otherUserId = users[j];
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
if (!lastFetchTime) lastFetchTime = new Date().getTime();
|
|
|
|
|
|
// 计算未读消息数
|
|
|
let messagesByTimestampKey = RedisModel.makeRedisKey(REDIS_KEYS.MessagesByTimestamp, sessionId);
|
|
|
redis.zcountAsync(messagesByTimestampKey, parseInt(lastFetchTime)+1, 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;
|
|
|
}
|
|
|
var bir = new Date().getTime();
|
|
|
if (res.length != 0 && res[0].birthdate) {
|
|
|
bir = res[0].birthdate.getTime();
|
|
|
}
|
|
|
var sex = 1;
|
|
|
if (res.length != 0 && res[0].sex) {
|
|
|
sex = res[0].sex;
|
|
|
}
|
|
|
|
|
|
sessionList.push({
|
|
|
id: sessionId,
|
|
|
name: sessionName,
|
|
|
create_date: new Date(mysqlSession.last_message_time).getTime(),
|
|
|
last_content_type: session.last_content_type,
|
|
|
last_content: session.last_content,
|
|
|
sender_id: session.last_sender_id,
|
|
|
type: session.type,
|
|
|
sender_name: session.last_sender_name,
|
|
|
unread_count: count,
|
|
|
business_type: session.business_type,
|
|
|
sender_sex: sex,
|
|
|
sender_birthday: bir,
|
|
|
participantsTimeArray:participantsTime,
|
|
|
status:session.status,
|
|
|
});
|
|
|
|
|
|
index = (parseInt(index) + 1);
|
|
|
if (index == sessionIds.length) {
|
|
|
ModelUtil.emitOK(self.eventEmitter, sessionList);
|
|
|
} else {
|
|
|
callback(null, index);
|
|
|
}
|
|
|
})
|
|
|
})
|
|
|
})
|
|
|
.catch(function (err) {
|
|
|
logger.error("Get sessions:"+sessionId+" failed: ", err);
|
|
|
});
|
|
|
};
|
|
|
|
|
|
functionList.push(fun);
|
|
|
}
|
|
|
|
|
|
async.waterfall(functionList);
|
|
|
}
|
|
|
]);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 根据用户ID获取用户已经结束咨询的session列表
|
|
|
* @param userId
|
|
@ -509,11 +831,11 @@ class Sessions extends RedisModel {
|
|
|
ModelUtil.emitOK(self.eventEmitter, []);
|
|
|
return;
|
|
|
}
|
|
|
var sessionIds=[];
|
|
|
for(var j in res){
|
|
|
sessionIds.push(res[j].id);
|
|
|
}
|
|
|
callback(null,sessionIds);
|
|
|
// var sessionIds=[];
|
|
|
// for(var j in res){
|
|
|
// sessionIds.push(res[j].id);
|
|
|
// }
|
|
|
callback(null,res);
|
|
|
})
|
|
|
},
|
|
|
// 遍历会话
|
|
@ -526,7 +848,8 @@ class Sessions extends RedisModel {
|
|
|
callback = index, index = 0
|
|
|
}
|
|
|
|
|
|
let sessionId = sessionIds[index];
|
|
|
let mysqlSession = sessionIds[index];
|
|
|
let sessionId = mysqlSession.id;
|
|
|
let sessionKey = RedisModel.makeRedisKey(REDIS_KEYS.Session, sessionId);
|
|
|
let participantsRoleKey = RedisModel.makeRedisKey(REDIS_KEYS.SessionParticipantsRole, sessionId);
|
|
|
let sessionParticipantsKey = RedisModel.makeRedisKey(REDIS_KEYS.SessionParticipants, sessionId);
|
|
@ -595,7 +918,7 @@ class Sessions extends RedisModel {
|
|
|
sessionList.push({
|
|
|
id: sessionId,
|
|
|
name: sessionName,
|
|
|
create_date: session.create_date,
|
|
|
create_date: new Date(mysqlSession.last_message_time).getTime(),
|
|
|
last_content_type: session.last_content_type,
|
|
|
last_content: session.last_content,
|
|
|
sender_id: session.last_sender_id,
|
|
@ -621,7 +944,7 @@ class Sessions extends RedisModel {
|
|
|
})
|
|
|
})
|
|
|
.catch(function (err) {
|
|
|
logger.error("Get sessions failed: ", err);
|
|
|
logger.error("Get sessions:"+sessionId+" failed: ", err);
|
|
|
});
|
|
|
};
|
|
|
|
|
@ -653,13 +976,48 @@ 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) {
|
|
|
logger.info("redis return res-----"+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) {
|
|
@ -884,7 +1242,9 @@ class Sessions extends RedisModel {
|
|
|
let count = 0;
|
|
|
let patientCount = 0;
|
|
|
let doctorCount = 0;
|
|
|
let patientEndCount = 0;
|
|
|
SessionRepo.findAll(userId, function (err, res) {
|
|
|
// SessionRepo.findUnEndAll(userId, function (err, res) {
|
|
|
if (err) {
|
|
|
if(handler)
|
|
|
{
|
|
@ -933,7 +1293,11 @@ class Sessions extends RedisModel {
|
|
|
|
|
|
count = count + con;
|
|
|
if (session.business_type == SESSION_BUSINESS_TYPE.PATIENT) {
|
|
|
patientCount = patientCount + con;
|
|
|
if(session.status == SESSION_STATUS.ENDED){//新增判断是否咨询结束
|
|
|
patientEndCount = patientEndCount + con;
|
|
|
}else{
|
|
|
patientCount = patientCount + con;
|
|
|
}
|
|
|
} else {
|
|
|
doctorCount = doctorCount + con;
|
|
|
}
|
|
@ -943,7 +1307,7 @@ class Sessions extends RedisModel {
|
|
|
handler(err,count)
|
|
|
return;
|
|
|
}
|
|
|
ModelUtil.emitOK(self.eventEmitter, {count: count, patient: patientCount, doctor: doctorCount});
|
|
|
ModelUtil.emitOK(self.eventEmitter, {count: count, patient: patientCount,patientEnd: patientEndCount, doctor: doctorCount});
|
|
|
}
|
|
|
})
|
|
|
}
|
|
@ -972,7 +1336,7 @@ class Sessions extends RedisModel {
|
|
|
function (lastFetchTime, callback) {
|
|
|
if (!lastFetchTime) lastFetchTime = 0;
|
|
|
let now = new Date().getTime();
|
|
|
redis.zcountAsync(messagesByTimestampKey, lastFetchTime, now)
|
|
|
redis.zcountAsync(messagesByTimestampKey, parseInt(lastFetchTime)+1, now)
|
|
|
.then(function (count) {
|
|
|
if (handler) {
|
|
|
handler(null, count);
|
|
@ -1059,6 +1423,7 @@ class Sessions extends RedisModel {
|
|
|
let sessionKey = RedisModel.makeRedisKey(REDIS_KEYS.Session, sessionId);
|
|
|
let messageId = mongoose.Types.ObjectId().toString();
|
|
|
let sessionType =0;
|
|
|
let sessionName;
|
|
|
message.id = messageId;
|
|
|
|
|
|
// 检查会话中是否存在此成员
|
|
@ -1073,8 +1438,49 @@ class Sessions extends RedisModel {
|
|
|
sessionType = res[0];
|
|
|
let sessionName = res[1];
|
|
|
if (sessionType == null) {
|
|
|
ModelUtil.emitError(self.eventEmitter, "Session " + sessionId + " is not found.");
|
|
|
return;
|
|
|
self.getSessions(sessionId,function(err,res){
|
|
|
if (err){
|
|
|
logger.error("session data is error");
|
|
|
} else {
|
|
|
sessionName=res[0].name;
|
|
|
sessionType = res[0].type;
|
|
|
}
|
|
|
});
|
|
|
let participantArray = [];
|
|
|
let participantsStr="{";
|
|
|
ParticipantRepo.findAll(sessionId, function (err, participants) {
|
|
|
if (err) {
|
|
|
ModelUtil.emitError(self.eventEmitter, err.message);
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
participants.forEach(function (participant) {
|
|
|
let participantId = participant.id;
|
|
|
let participantRole = participant.role;
|
|
|
let score = ObjectUtil.timestampToLong(participant.last_fetch_time||(new Date()));
|
|
|
participantsStr +="\""+participantId+"\":\""+participantRole+"\",";
|
|
|
});
|
|
|
|
|
|
participantsStr = participantsStr.substring(0,participantsStr.length-1)+'}';
|
|
|
participantsStr = JSON.parse(participantsStr);
|
|
|
for (let j in participantsStr) {
|
|
|
participantArray.push(j + ":" + participantsStr[j]);
|
|
|
}
|
|
|
//创建session到redis
|
|
|
self.createSessionToRedis(sessionId, sessionName, sessionType, participantArray, messageId, function (err, res) {
|
|
|
if (err) {
|
|
|
if (handler) {
|
|
|
handler(err, null);
|
|
|
}
|
|
|
ModelUtil.emitError(self.eventEmitter, {message: err, status: -1}, null);
|
|
|
} else {
|
|
|
if (handler) {
|
|
|
handler(null, res);
|
|
|
}
|
|
|
ModelUtil.emitOK(self.eventEmitter, {status: 200, data: res});
|
|
|
}
|
|
|
});
|
|
|
});
|
|
|
}
|
|
|
if(sessionType == SESSION_TYPES.MUC || sessionType == SESSION_TYPES.PRESCRIPTION || SESSION_TYPES.PRESCRIPTION_HOSPITAL || SESSION_TYPES.ONDOOR_NURSING){
|
|
|
if(message.content_type == CONTENT_TYPES.PlainText ||
|
|
@ -1094,6 +1500,7 @@ class Sessions extends RedisModel {
|
|
|
})
|
|
|
}
|
|
|
}
|
|
|
|
|
|
// 消息保存到Redis,并更新会话最后状态、用户最后消息获取时间
|
|
|
messages.saveMessageToRedis(sessionId, sessionType, messageId, message);
|
|
|
Messages.updateLastContent(sessionKey, sessionType, sessionName, message);
|
|
@ -1140,6 +1547,7 @@ class Sessions extends RedisModel {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
sendTopicMessages(topicId, message) {
|
|
|
let self = this;
|
|
|
TopicRepo.findAllByTopicId(topicId, function (err, res) {
|
|
@ -1227,7 +1635,8 @@ class Sessions extends RedisModel {
|
|
|
});
|
|
|
function callPush(participants,message){
|
|
|
participants.forEach(function (participant) {
|
|
|
if (participant.id !== message.sender_id &&
|
|
|
if ((participant.id !== message.sender_id||message.content_type == CONTENT_TYPES.PrescriptionBloodStatus ||
|
|
|
message.content_type == CONTENT_TYPES.PrescriptionFollowupContent) &&
|
|
|
participant.participant_role == PARTICIPANT_ROLES.HOST) {
|
|
|
Sessions.pushNotification(participant.id, participant.name, message,sessionType);
|
|
|
}
|
|
@ -1403,7 +1812,7 @@ class Sessions extends RedisModel {
|
|
|
let self = this;
|
|
|
Users.isPatientId(targetUserId, function (err, isPatient) {
|
|
|
if (isPatient) {
|
|
|
if(config.environment!='prodPC'){//pc版不直接发送给居民,通过redis的publish
|
|
|
if(config.environment!='local'){//pc版不直接发送给居民,通过redis的publish
|
|
|
WechatClient.sendMessage(targetUserId, targetUserName, message);
|
|
|
}
|
|
|
message.targetUserId = targetUserId;
|
|
@ -1416,17 +1825,47 @@ class Sessions extends RedisModel {
|
|
|
}
|
|
|
//告知医生新消息
|
|
|
WechatClient.sendSocketMessageToDoctor(targetUserId,message);
|
|
|
if(config.environment!='prodPC'){//pc版不推送个推,通过redis的publish
|
|
|
WlyySDK.request(targetUserId, '', '', '', '/im/common/message/messages', 'POST', function (err, res) {
|
|
|
let count = 0;
|
|
|
res = JSON.parse(res)
|
|
|
if (res.status == 200) {
|
|
|
let data = res.data;
|
|
|
count = parseInt(JSON.parse(data.imMsgCount).count) + parseInt(data.system.amount) + parseInt(data.healthIndex.amount) + parseInt(data.sign.amount);
|
|
|
}
|
|
|
AppClient.sendNotification(targetUserId, message,sessionType,count);
|
|
|
});
|
|
|
|
|
|
let count = 0;
|
|
|
//系统消息
|
|
|
MessageRepo.getWlyyMessageCount(targetUserId,function (err,res) {
|
|
|
if(res){
|
|
|
count = res[0].count;
|
|
|
}
|
|
|
});
|
|
|
//im消息
|
|
|
let sessions = new Sessions();
|
|
|
sessions.getAllSessionsUnreadMessageCount(targetUserId,function (err,res) {
|
|
|
if(res){
|
|
|
count += res;
|
|
|
}
|
|
|
});
|
|
|
|
|
|
if(config.environment!='local'){//pc版不推送个推,通过redis的publish
|
|
|
AppClient.sendNotification(targetUserId, message,sessionType,count);
|
|
|
}
|
|
|
//外网pcim通过socket推送
|
|
|
WechatClient.sendPcImSocket(targetUserId,message,sessionType);
|
|
|
|
|
|
// WlyySDK.request(targetUserId, '', '', '', '/im/common/message/messages', 'POST', function (err, res) {
|
|
|
// let count = 0;
|
|
|
// if(err){
|
|
|
// logger.error(err);
|
|
|
// }else {
|
|
|
// logger.error(res);
|
|
|
// res = JSON.parse(res)
|
|
|
// if (res.status == 200) {
|
|
|
// let data = res.data;
|
|
|
// count = parseInt(JSON.parse(data.imMsgCount).count) + parseInt(data.system.amount) + parseInt(data.healthIndex.amount) + parseInt(data.sign.amount);
|
|
|
// }
|
|
|
// }
|
|
|
// if(config.environment!='local'){//pc版不推送个推,通过redis的publish
|
|
|
// AppClient.sendNotification(targetUserId, message,sessionType,count);
|
|
|
// }
|
|
|
// //外网pcim通过socket推送
|
|
|
// WechatClient.sendPcImSocket(targetUserId,message,sessionType);
|
|
|
// });
|
|
|
|
|
|
message.targetUserId = targetUserId;
|
|
|
message.targetUserName = targetUserName;
|
|
|
message.sessionType = sessionType;
|
|
@ -1448,7 +1887,7 @@ class Sessions extends RedisModel {
|
|
|
*/
|
|
|
static getRedisPushNotification(message) {
|
|
|
if (message.targetType=='patient') {
|
|
|
if(config.environment!='prodPC'){//pc版接收要发给居民的消息不做处理
|
|
|
if(config.environment!='local'){//pc版接收要发给居民的消息不做处理
|
|
|
WechatClient.sendMessage(message.targetUserId, message.targetUserName, message);
|
|
|
}
|
|
|
} else {
|
|
@ -1457,7 +1896,7 @@ class Sessions extends RedisModel {
|
|
|
}
|
|
|
//告知医生新消息
|
|
|
WechatClient.sendSocketMessageToDoctor(message.targetUserId,message);
|
|
|
if(config.environment!='prodPC'){//pc版不推送个推
|
|
|
if(config.environment!='local'){//pc版不推送个推
|
|
|
WlyySDK.request(message.targetUserId, '', '', '', '/im/common/message/messages', 'POST', function (err, res) {
|
|
|
let count = 0;
|
|
|
res = JSON.parse(res)
|
|
@ -1510,6 +1949,32 @@ class Sessions extends RedisModel {
|
|
|
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 针对专科医生和家医模式更新会话的名称
|
|
|
* @param sessionId
|
|
|
* @param name
|
|
|
*/
|
|
|
updateSessionName(sessionId,name,handler){
|
|
|
let self = this;
|
|
|
let sessionKey = RedisModel.makeRedisKey(REDIS_KEYS.Session,sessionId);
|
|
|
redis.hsetAsync(sessionKey,"name",name).then(function(res){
|
|
|
SessionRepo.updateSessionName(sessionId,name,function(err,sqlResult){
|
|
|
if(handler){
|
|
|
handler(err,sqlResult);
|
|
|
return;
|
|
|
}
|
|
|
if(err){
|
|
|
logger.error("set session name to mysql is error !");
|
|
|
ModelUtil.emitError(self.eventEmitter,"set session name to mysql is error !",err)
|
|
|
}else{
|
|
|
logger.info("set session name is success");
|
|
|
ModelUtil.emitOK(self.eventEmitter, []);
|
|
|
}
|
|
|
});
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
// Expose class
|