Explorar o código

消息发送整改

%!s(int64=8) %!d(string=hai) anos
pai
achega
930829fd48

+ 7 - 4
src/server/endpoints/v2/topic.endpoint.js

@ -21,11 +21,14 @@ const APIv2 = require('../../include/endpoints').APIv2;
 */
router.get(APIv2.Sessions.TopicMessages, function (req, res) {
    let topicId = req.query.topic_id;
    let startMsgId = req.query.start;
    let endMsgId = req.query.end;
    let page = req.query.page;
    let pagesize = req.query.pagesize;
    let user = req.query.user;
    let topic = new Topics();
    ControllerUtil.regModelEventHandler(topic, res);
    topic.getTopicMessages(topicId);
    topic.getTopicMessages(topicId,user,startMsgId,endMsgId,page,pagesize);
});
router.get(APIv2.Sessions.TopicList, function (req, res) {
@ -43,7 +46,7 @@ router.get(APIv2.Sessions.TopicList, function (req, res) {
router.post(APIv2.Sessions.Topics, function (req, res) {
    let payload = req.body;
    let testing = ObjectUtil.fieldsCheck(payload, "topic_id", "topic_name", "participants", "messages", "session_id", "session_type");
    let testing = ObjectUtil.fieldsCheck(payload, "topic_id", "topic_name", "participants", "messages", "session_type");
    if (!testing.pass) {
        throw {httpStatus: 406, message: testing.message}
    }

+ 1 - 1
src/server/include/endpoints.js

@ -30,7 +30,7 @@ const APIv2 = {
        RecentSessions: '/recent',                                      // 最近会话,使用类型过滤出'患者'或'医生'会话
        Topics: '/:session_id/topics',
        Topics: '/:topic_id/topics',
        Topic: '/:session_id/topics/:topic_id',                          // 议题,指定ID的议题将返回其信息
        TopicEnded: '/:session_id/topics/:topic_id/ended',              // 议题是否已结束,若top_id为current,则检查最后一个议题的状态
        TopicList:'/topics',

+ 73 - 21
src/server/models/sessions/sessions.js

@ -10,6 +10,7 @@ let Messages = require('../messages/messages');
let Users = require('../user/users');
let Participants = require('./Participants');
let SessionRepo = require('../../repository/mysql/session.repo');
let TopicRepo = require('../../repository/mysql/topics.repo');
let ParticipantRepo = require('../../repository/mysql/participant.repo');
let MessageRepo = require('../../repository/mysql/message.repo');
@ -62,10 +63,10 @@ class Sessions extends RedisModel {
        self.createSessionToRedis(sessionId, name, type, participantArray,messageId, function(err,res){
            if(err){
                if(handler){handler(err,null);return;};
                ModelUtil.emitError(self.eventEmitter, {message:err}, null);
                ModelUtil.emitError(self.eventEmitter, {message:err,status:-1}, null);
            }else{
                if(handler){handler(null,res);return;};
                ModelUtil.emitOK(self.eventEmitter,res);
                ModelUtil.emitOK(self.eventEmitter,{status:200,data:res});
            }
        });
    }
@ -120,7 +121,7 @@ class Sessions extends RedisModel {
            let message = {
                sender_id: "system",
                sender_name: "system",
                content_type: 6,
                content_type: 11,
                content: "会话创建成功",
                timestamp: createDate,
                id:messageId
@ -140,7 +141,7 @@ class Sessions extends RedisModel {
            redis.hmsetAsync(sessionKey, session).then(function(){
                Participants.saveParticipantsToRedis(sessionId, participantArray, createDate, function (res) {
                    handler(null, session);
                    messages.saveMessageToRedisFromCreateSession(sessionId, messageId, message);
                    //messages.saveMessageToRedisFromCreateSession(sessionId, messageId, message);
                });
            })
        }
@ -238,18 +239,15 @@ class Sessions extends RedisModel {
            session.last_content  = message.content;
            session.last_content_type = message.content_type;
            MessageRepo.save(message,type,messageId,sessionId,function(err,res){
                SessionRepo.updateSessionLastStatus(message.sender_id,
                    message.sender_name,
                    message.timestamp,
                    message.content,
                    message.content_type,
                    sessionId, function (err, res) {
                        if (err) {handler(err,null);return;};
                        handler(null,session);
                    });
            })
            SessionRepo.updateSessionLastStatus(message.sender_id,
                message.sender_name,
                message.timestamp,
                message.content,
                message.content_type,
                sessionId, function (err, res) {
                if (err) {handler(err,null);return;};
                handler(null,session);
            });
        }
    }
@ -375,27 +373,43 @@ class Sessions extends RedisModel {
     * @param start_msg_id 消息会话最新的一条消息的ID
     * @param end_msg_id 消息会话刚开始的消息ID
     */
    getMessages(sessionId, user, start_msg_id, end_msg_id, page, pagesize, isoffset) {
    getMessages(sessionId, user, start_msg_id, end_msg_id, page, pagesize, isoffset,handler) {
        let self = this;
        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) {
                if (res.length == 0) {
                    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) {
                    if (res.length == 0) {
                        if(handler){
                            handler(null,res);
                            return;
                        }
                        ModelUtil.emitOK(self.eventEmitter, res);
                        return;
                    }
                    end_msg_id = res[0];
                    self.getMessagesByPage(sessionId, user, end_msg_id, start_msg_id, page, pagesize, isoffset, function (err, res) {
                        if (err) {
                            if(handler){
                                handler(err,null);
                                return;
                            }
                            logger.error("getMessagesByPage error" + err);
                            ModelUtil.emitError(self.eventEmitter, err, err);
                        } else {
                            if(handler){
                                handler(null,res);
                                return;
                            }
                            ModelUtil.emitOK(self.eventEmitter, res);
                        }
                    })
@ -404,15 +418,27 @@ class Sessions extends RedisModel {
        } else if (!start_msg_id) {
            redis.zrevrangeAsync(message_timestamp_key, 0, 0).then(function (res) {
                if (res.length == 0) {
                    if(handler){
                        handler(null,res);
                        return;
                    }
                    ModelUtil.emitOK(self.eventEmitter, res);
                    return;
                }
                start_msg_id = res[0];
                self.getMessagesByPage(sessionId, user, end_msg_id, start_msg_id, page, pagesize, isoffset, function (err, res) {
                    if (err) {
                        if(handler){
                            handler(err,null);
                            return;
                        }
                        logger.error("getMessagesByPage error" + err);
                        ModelUtil.emitError(self.eventEmitter, err, err);
                    } else {
                        if(handler){
                            handler(null,res);
                            return;
                        }
                        ModelUtil.emitOK(self.eventEmitter, res);
                    }
                })
@ -426,9 +452,17 @@ class Sessions extends RedisModel {
                end_msg_id = res[0];
                self.getMessagesByPage(sessionId, user, start_msg_id, end_msg_id, page, pagesize, isoffset, function (err, res) {
                    if (err) {
                        if(handler){
                            handler(err,null);
                            return;
                        }
                        logger.error("getMessagesByPage error" + err);
                        ModelUtil.emitError(self.eventEmitter, err, err);
                    } else {
                        if(handler){
                            handler(null,res);
                            return;
                        }
                        ModelUtil.emitOK(self.eventEmitter, res);
                    }
                })
@ -436,9 +470,17 @@ class Sessions extends RedisModel {
        } else {
            self.getMessagesByPage(sessionId, user, end_msg_id, start_msg_id, page, pagesize, isoffset, function (err, res) {
                if (err) {
                    if(handler){
                        handler(err,null);
                        return;
                    }
                    logger.error("getMessagesByPage error" + err);
                    ModelUtil.emitError(self.eventEmitter, err, err);
                } else {
                    if(handler){
                        handler(null,res);
                        return;
                    }
                    ModelUtil.emitOK(self.eventEmitter, res);
                }
            })
@ -685,10 +727,20 @@ class Sessions extends RedisModel {
    sendTopicMessages(topicId,message){
        let self = this;
        let topicKey = RedisModel.makeRedisKey(REDIS_KEYS.Topic, topicId);
        redis.hgetallAsync(topicKey).then(function (topic) {
            self.saveMessageBySession(topic.session_id,message);
        })
        TopicRepo.findAllByTopicId(topicId,function(err,res){
            if(err||res.length==0){
                ModelUtil.emitOK(self.eventEmitter, {status:-1,"message": "议题获取失败"});
                return;
            }
            self.saveMessageByTopic(message,res[0].session_id,function(err,messageId){
                if(err){
                    ModelUtil.emitOK(self.eventEmitter, {status:-1,"message":err});
                }else{
                    message.id = messageId;
                    ModelUtil.emitOK(self.eventEmitter, {status:200,"message":"发送成功",data:message});
                }
            });
        });
    }
    /**

+ 19 - 24
src/server/models/sessions/topics.js

@ -102,25 +102,20 @@ class Topics extends RedisModel {
     * 根据topicId获取对应的消息
     * @param topicId
     */
    getTopicMessages(topicId) {
    getTopicMessages(topicId,user,startMsgId,endMsgId,page,pagesize) {
        let self = this;
        let topicKey = RedisModel.makeRedisKey(REDIS_KEYS.Topic, topicId);
        redis.hgetallAsync(topicKey).then(function (topic) {
            let message_time_key = RedisModel.makeRedisKey(REDIS_KEYS.MessagesByTimestamp, topic.session_id);
            let message_key = RedisModel.makeRedisKey(REDIS_KEYS.Messages, topic.session_id);
            //倒序取出所有的消息ID
            let createTime = topic.create_time;
            let endTime = topic.end_time;
            if (!endTime) {
                endTime = new Date().getTime();
        TopicsRepo.findAllByTopicId(topicId,function(err,res){
            if(err||res.length==0){
                ModelUtil.emitOK(self.eventEmitter, {status:-1,message:"找不到对应的会话记录!"});
            }
            redis.zrevrangebyscoreAsync(message_time_key, endTime, createTime).then(function (messages) {
                redis.hmgetAsync(message_key, messages).then(function (res) {
                    ModelUtil.emitOK(self.eventEmitter, res);
                });
            })
            let sessions = new Sessions();
            sessions.getMessages(res[0].session_id,user,startMsgId,endMsgId,page,pagesize,0,function(err,res){
                if(err){
                    ModelUtil.emitOK(self.eventEmitter, {status:-1,message:err});
                }else{
                    ModelUtil.emitOK(self.eventEmitter, {status:200,data:res});
                }
            });
        })
    }
@ -135,12 +130,12 @@ class Topics extends RedisModel {
     */
    createTopic(topicName, topicId, sessionId, users, messages,sessionType) {
        let self = this;
        if(!sessionId) {
            ModelUtil.emitOK(self.eventEmitter, "会话ID为空,请先生成会话ID");
        if(!sessionId&&sessionType==SESSION_TYPES.MUC) {
            ModelUtil.emitOK(self.eventEmitter, {status:-1,message:"会话ID为空,请先生成会话ID"});
            return;
        }
        if(!topicId) {
            ModelUtil.emitOK(self.eventEmitter, "议题ID为空,请先生成议题ID");
            ModelUtil.emitOK(self.eventEmitter, {status:-1,message:"议题ID为空,请先生成议题ID"});
            return;
        }
        var pars = [];
@ -196,7 +191,7 @@ class Topics extends RedisModel {
            let msg = {};
            msg.sender_id = messages.sender_id;
            msg.sender_name = messages.sender_name;
            msg.content_type = 6;
            msg.content_type = 10;
            msg.content = messages.sender_name+"发起了咨询";
            msg.timestamp = date;
            sessions.saveMessageByTopic(msg, sessionId, function (err, msgId) {
@ -214,7 +209,7 @@ class Topics extends RedisModel {
            let msg = {};
            msg.sender_id = messages.sender_id;
            msg.sender_name = messages.sender_name;
            msg.content_type = 1;
            msg.content_type = 6;
            msg.content = messages.description;
            msg.timestamp = new Date();
            sessions.saveMessageByTopic(msg, sessionId, function (err, msgId) {
@ -311,9 +306,9 @@ class Topics extends RedisModel {
            let sessions = new Sessions();
            sessions.saveMessageByTopic(msg, sessionId, function (err, msgId) {
                if (err) {
                    ModelUtil.emitOK(self.eventEmitter, err);
                    ModelUtil.emitOK(self.eventEmitter,{status:-1,"message": err} );
                } else {
                    ModelUtil.emitOK(self.eventEmitter, {"id": msgId});
                    ModelUtil.emitOK(self.eventEmitter, {status:200,"id": msgId,"message":"结束成功!"});
                    TopicsRepo.endTopic(topicId, endUser, msg.date, msgId,TOPIC_STATUS.ENDED);
                }
            })

+ 17 - 0
src/server/repository/mysql/topics.repo.js

@ -71,6 +71,23 @@ class TopicRepo {
        });
    }
    /**
     * 获取会话中的议题。
     *
     * @param sessionId
     * @param handler
     */
    static findAllByTopicId(id, handler) {
        let sql = "select id, session_id, name, create_time, end_by, end_time," +
            " start_message_id, end_message_id, description, status from " + DB_TABLES.Topics + " where id = ? order by id";
        ImDb.execQuery({
            sql: sql,
            args: [id],
            handler: handler
        });
    }
    static findAllBySessionIdsAndStatus(sessionIds,status,page,pagesize,handler){
        let sql = "select id, session_id, name, create_time, end_by, end_time," +
            " start_message_id, end_message_id, description, status from " + DB_TABLES.Topics + " where session_id in ('"+sessionIds+"') and status in ("+status+") order by status desc limit ?,? ";