浏览代码

代码修改

LAPTOP-KB9HII50\70708 3 年之前
父节点
当前提交
3794d1d2d8
共有 2 个文件被更改,包括 113 次插入9 次删除
  1. 2 1
      src/server/endpoints/v2/session.endpoint.js
  2. 111 8
      src/server/models/sessions/sessions.js

+ 2 - 1
src/server/endpoints/v2/session.endpoint.js

@ -598,6 +598,7 @@ router.get(APIv2.Sessions.Messages, function (req, res) {
    let sessionId = req.query.session_id;
    let content_type = req.query.content_type;
    let isoffset = req.query.isoffset;
    let type = req.query.type;//类型 1获取消息时医生不在session内要自动加入会话
    if (!user) {
        throw {httpStatus: 406, message: 'Missing user.'};
    }
@ -618,7 +619,7 @@ router.get(APIv2.Sessions.Messages, function (req, res) {
        let sessions = new Sessions();
        ControllerUtil.regModelEventHandler(sessions, res);
        sessions.getMessages(sessionId, user, startMsgId, endMsgId, page, pagesize, isoffset);
        sessions.getMessages(sessionId, user, startMsgId, endMsgId, page, pagesize, isoffset,type);
    }
});

+ 111 - 8
src/server/models/sessions/sessions.js

@ -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)