|
@ -1456,8 +1456,9 @@ class Sessions extends RedisModel {
|
|
|
* start_msg_id 为空 end_msg_id 不为空根据end_msg_id取旧的消息(offset=1可以排除本身)返回指定分页的数据
|
|
|
* end_msg_id 为空 start_msg_id 不为空 根据 start_msg_id 取出新消息(offset=1可以排除本身)返回指定分页的数据
|
|
|
* end_msg_id start_msg_id 都不为空返回指定区间的消息
|
|
|
* type 类型 1获取消息时医生不在session内要自动加入会话
|
|
|
*/
|
|
|
getMessages(sessionId, user, start_msg_id, end_msg_id, page, pagesize, isoffset, handler) {
|
|
|
getMessages(sessionId, user, start_msg_id, end_msg_id, page, pagesize, isoffset,type, handler) {
|
|
|
let self = this;
|
|
|
let message_timestamp_key = RedisModel.makeRedisKey(REDIS_KEYS.MessagesByTimestamp, sessionId);
|
|
|
if (!start_msg_id && !end_msg_id) {
|
|
@ -1517,7 +1518,7 @@ class Sessions extends RedisModel {
|
|
|
return;
|
|
|
}
|
|
|
end_msg_id = res[0];
|
|
|
self.getMessagesByPage(sessionId, user, end_msg_id, start_msg_id, page, pagesize, isoffset, function (err, res) {
|
|
|
self.getMessagesByPage(sessionId, user, end_msg_id, start_msg_id, page, pagesize, isoffset,type, function (err, res) {
|
|
|
if (err) {
|
|
|
if (handler) {
|
|
|
handler(err, null);
|
|
@ -1546,7 +1547,7 @@ class Sessions extends RedisModel {
|
|
|
return;
|
|
|
}
|
|
|
start_msg_id = res[0];
|
|
|
self.getMessagesByPage(sessionId, user, start_msg_id,end_msg_id , page, pagesize, isoffset, function (err, res) {
|
|
|
self.getMessagesByPage(sessionId, user, start_msg_id,end_msg_id , page, pagesize, isoffset,type, function (err, res) {
|
|
|
if (err) {
|
|
|
if (handler) {
|
|
|
handler(err, null);
|
|
@ -1570,7 +1571,7 @@ class Sessions extends RedisModel {
|
|
|
return;
|
|
|
}
|
|
|
end_msg_id = res[0];
|
|
|
self.getMessagesByPage(sessionId, user, end_msg_id,start_msg_id, page, pagesize, isoffset, function (err, res) {
|
|
|
self.getMessagesByPage(sessionId, user, end_msg_id,start_msg_id, page, pagesize, isoffset,type, function (err, res) {
|
|
|
if (err) {
|
|
|
if (handler) {
|
|
|
handler(err, null);
|
|
@ -1588,7 +1589,7 @@ class Sessions extends RedisModel {
|
|
|
})
|
|
|
})
|
|
|
} else {
|
|
|
self.getMessagesByPage(sessionId, user, end_msg_id, start_msg_id, page, pagesize, isoffset, function (err, res) {
|
|
|
self.getMessagesByPage(sessionId, user, end_msg_id, start_msg_id, page, pagesize, isoffset,type, function (err, res) {
|
|
|
if (err) {
|
|
|
if (handler) {
|
|
|
handler(err, null);
|
|
@ -1616,9 +1617,10 @@ class Sessions extends RedisModel {
|
|
|
* @param endMsgId 必选。会话中的结束消息ID
|
|
|
* @param page 必选。页码
|
|
|
* @param size 必选。页面大小
|
|
|
* @param type 可选。类型 1获取消息时医生不在session内要自动加入会话
|
|
|
* @param handler 必选。回调
|
|
|
*/
|
|
|
getMessagesByPage(sessionId, userId, startMsgId, endMsgId, page, size, isoffset, handler) {
|
|
|
getMessagesByPage(sessionId, userId, startMsgId, endMsgId, page, size, isoffset,type, handler) {
|
|
|
let messagesTimestampKey = RedisModel.makeRedisKey(REDIS_KEYS.MessagesByTimestamp, sessionId);
|
|
|
let messagesKey = RedisModel.makeRedisKey(REDIS_KEYS.Messages, sessionId);
|
|
|
let sessionKey = RedisModel.makeRedisKey(REDIS_KEYS.Session, sessionId);
|
|
@ -1635,8 +1637,109 @@ class Sessions extends RedisModel {
|
|
|
log.info(" res[0].exist=" + res[0].exist);
|
|
|
log.info(!res[0].exist && userId != "system");
|
|
|
if (! res[0].exist && userId != "system") {
|
|
|
handler(Error("User not found in session " + sessionId), null);
|
|
|
} else {
|
|
|
if(type==1){
|
|
|
let users = [userId+":1"];
|
|
|
Participants.saveParticipantsToRedis(sessionId, users, new Date(), function (res) {
|
|
|
if (res) {
|
|
|
Participants.saveParticipantsToMysql(sessionId, users,function(err,res){
|
|
|
if(err){
|
|
|
log.error("成员添加失败");
|
|
|
handler(Error("User not found in session " + sessionId), null);
|
|
|
}else{
|
|
|
//将消息ID转换成分值
|
|
|
redis.multi()
|
|
|
.zscore(messagesTimestampKey, startMsgId)
|
|
|
.zscore(messagesTimestampKey, endMsgId)
|
|
|
.hgetall(sessionKey)
|
|
|
.zrange(sessionParticipantsKey, 0, -1)
|
|
|
.execAsync()
|
|
|
.then(function (res) {
|
|
|
let startMsgScore = res[1];
|
|
|
let endMsgScore = res[0];
|
|
|
let session = res[2];
|
|
|
let users = res[3];
|
|
|
if (startMsgScore == null || endMsgScore == null || (startMsgScore == endMsgScore && isoffset == 1)) {
|
|
|
handler(null, []);
|
|
|
return;
|
|
|
}
|
|
|
//结束大于开始,正序取数据,返回的数据顺序也是逆序的,反向拉取数据,
|
|
|
// 当end>start取出来都是空的,为了给前端获取新数据使用,一般不出现这种情况
|
|
|
if(endMsgScore>startMsgScore){
|
|
|
redis.zrangebyscoreAsync(messagesTimestampKey, startMsgScore, endMsgScore, "limit", offset, count)
|
|
|
.then(function (res) {
|
|
|
if (res && res.length == 0) {
|
|
|
handler(null, []);
|
|
|
return;
|
|
|
}
|
|
|
redis.hmgetAsync(messagesKey, res).then(function (messages) {
|
|
|
messages.reverse();
|
|
|
handler(null, messages);
|
|
|
}).then(function () {
|
|
|
Sessions.updateParticipantLastFetchTime(sessionId, userId, new Date().getTime());
|
|
|
if(session.type == SESSION_TYPES.P2P){
|
|
|
for(var j in users){
|
|
|
if(users[j]==userId)continue;
|
|
|
WechatClient.sendAllRead(users[j],sessionId);
|
|
|
}
|
|
|
}else if(SESSION_TYPES.contantsTopticType(session.type)){
|
|
|
for(var j in users){
|
|
|
if(users[j]==userId)continue;
|
|
|
WechatClient.sendMucAllRead(users[j],userId,sessionId);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
})
|
|
|
})
|
|
|
.catch(function (err) {
|
|
|
logger.error("Get message by page failed: ", err);
|
|
|
|
|
|
handler(err, false);
|
|
|
})
|
|
|
}else{
|
|
|
// 从消息时间表中过滤出要获取的消息ID列表,倒序取出消息
|
|
|
redis.zrevrangebyscoreAsync(messagesTimestampKey, startMsgScore, endMsgScore, "limit", offset, count)
|
|
|
.then(function (res) {
|
|
|
if (res && res.length == 0) {
|
|
|
handler(null, []);
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
redis.hmgetAsync(messagesKey, res).then(function (messages) {
|
|
|
handler(null, messages);
|
|
|
}).then(function () {
|
|
|
Sessions.updateParticipantLastFetchTime(sessionId, userId, new Date().getTime());
|
|
|
if(session.type == SESSION_TYPES.P2P){
|
|
|
for(var j in users){
|
|
|
if(users[j]==userId)continue;
|
|
|
//通知对方自己已经读取数据
|
|
|
WechatClient.sendAllRead(users[j],sessionId);
|
|
|
}
|
|
|
}else if(SESSION_TYPES.contantsTopticType(session.type)){
|
|
|
for(var j in users){
|
|
|
if(users[j]==userId)continue;
|
|
|
//如果是患者拉取数据告诉在线的医生患者已经读取数据
|
|
|
WechatClient.sendMucAllRead(users[j],userId,sessionId);
|
|
|
}
|
|
|
}
|
|
|
})
|
|
|
})
|
|
|
.catch(function (err) {
|
|
|
logger.error("Get message by page failed: ", err);
|
|
|
handler(err, false);
|
|
|
})
|
|
|
}
|
|
|
})
|
|
|
}
|
|
|
});
|
|
|
} else {
|
|
|
log.error("成员添加失败");
|
|
|
handler(Error("User not found in session " + sessionId), null);
|
|
|
}
|
|
|
})
|
|
|
}else{
|
|
|
handler(Error("User not found in session " + sessionId), null);
|
|
|
}
|
|
|
}else{
|
|
|
//将消息ID转换成分值
|
|
|
redis.multi()
|
|
|
.zscore(messagesTimestampKey, startMsgId)
|