wangzhinan 5 vuotta sitten
vanhempi
commit
ce5dc873be

+ 24 - 0
src/server/endpoints/v2/session.endpoint.js

@ -221,6 +221,30 @@ router.get(APIv2.Sessions.SessionListByType, function (req, res) {
    sessions.getUserSessionsByType(userId,type,page,size,status);
});
router.get(APIv2.Sessions.SessionListByNoParticipant, function (req, res) {
    let page = req.query.page;
    let size = req.query.size;
    let userId = req.query.user_id;
    let type = req.query.type;
    let status = req.query.status;
    if (!page) {
        throw {httpStatus: 406, message: 'Missing page.'};
    }
    if (!size) {
        throw {httpStatus: 406, message: 'Missing size.'};
    }
    if (!type) {
        throw {httpStatus: 406, message: 'Missing type.'};
    }
    if (!userId) {
        throw {httpStatus: 406, message: 'Missing user.'};
    }
    let sessions = new Sessions();
    ControllerUtil.regModelEventHandler(sessions, res);
    sessions.getUserSessionsByTypeAndNoParticipant(userId,type,page,size,status);
});
/**
 * 按会话类型获取会话总数
 * 请求URL /sessions/sessionCountByType?user_id=3121&type=4

+ 3 - 0
src/server/include/commons.js

@ -43,6 +43,7 @@ const SESSION_TYPES = {
    GENERAL_EXPERT:15,   //全科医生发起求助专科医生的专家咨询
    PRESCRIPTION_HOSPITAL_VIDEO:16, //互联网医院医院在线复诊-视频
    MUC_VIDEO:17, //视频咨询
    GUIDANCE_ASSISTANT: 18,//导诊助手
};
exports.SESSION_TYPES = SESSION_TYPES;
@ -259,6 +260,8 @@ const DB_TABLES = {
            return DB_TABLES.MucMessages;
        else if (sessionType == SESSION_TYPES.GUIDANCE_HOSPITAL)
            return DB_TABLES.MucMessages;
        else if (sessionType == SESSION_TYPES.GUIDANCE_ASSISTANT)
            return DB_TABLES.MucMessages;
        else if (sessionType == SESSION_TYPES.PRESCRIPTION_HOSPITAL)
            return DB_TABLES.MucMessages;
        else if (sessionType == SESSION_TYPES.ONDOOR_NURSING)

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

@ -36,6 +36,7 @@ const APIv2 = {
        Session: '/:session_id/session',                                // 获取会话
        SessionListByType: '/sessionListByType',                        // 按会话类型获取会话
        SessionListByNoParticipant: '/sessionListByNoParticipant',    //导诊获取没有参与会话的列表
        SessionCountByType: '/sessionCountByType',                      // 按会话类型获取会话数量
        SessionSticky: '/:session_id/sticky',                           // 会话置顶,置顶使用PUT,取消置顶使用DELETE
        SessionStatus: '/:session_id/status',                           // 更新状态

+ 1 - 0
src/server/models/client/app.client.js

@ -229,6 +229,7 @@ class AppClient extends RedisModel {
                    session_type==SESSION_TYPES.GENERAL_EXPERT||
                    session_type==SESSION_TYPES.PRESCRIPTION_HOSPITAL_VIDEO||
                    session_type==SESSION_TYPES.MUC_VIDEO||
                    session_type==SESSION_TYPES.GUIDANCE_ASSISTANT||
                    message.business_type == MESSAGE_BUSSINESS_TYPE.D_CT_01||
                    message.business_type == MESSAGE_BUSSINESS_TYPE.D_CT_02||
                    message.business_type == MESSAGE_BUSSINESS_TYPE.D_CT_03||

+ 156 - 30
src/server/models/sessions/sessions.js

@ -136,13 +136,14 @@ class Sessions extends RedisModel {
        function callBusinessType(sessionId) {
            if(type == SESSION_TYPES.MUC||
                type == SESSION_TYPES.PRESCRIPTION ||
                SESSION_TYPES.PRESCRIPTION_HOSPITAL ||
                SESSION_TYPES.COLLABORATION_HOSPITAL ||
                SESSION_TYPES.GUIDANCE_HOSPITAL ||
                SESSION_TYPES.GENERAL_EXPERT ||
                SESSION_TYPES.PRESCRIPTION_HOSPITAL_VIDEO ||
                SESSION_TYPES.MUC_VIDEO ||
                SESSION_TYPES.ONDOOR_NURSING){
                type == SESSION_TYPES.PRESCRIPTION_HOSPITAL ||
                type==SESSION_TYPES.COLLABORATION_HOSPITAL ||
                type==SESSION_TYPES.GUIDANCE_HOSPITAL ||
                type==SESSION_TYPES.GENERAL_EXPERT ||
                type==SESSION_TYPES.PRESCRIPTION_HOSPITAL_VIDEO ||
                type==SESSION_TYPES.MUC_VIDEO ||
                type==SESSION_TYPES.ONDOOR_NURSING||
                type==SESSION_TYPES.GUIDANCE_ASSISTANT){
                callCreate(sessionId, SESSION_BUSINESS_TYPE.PATIENT);
            }else if(type==SESSION_TYPES.DISCUSSION||type==SESSION_TYPES.GROUP){
                callCreate(sessionId, SESSION_BUSINESS_TYPE.DOCTOR);
@ -159,13 +160,14 @@ class Sessions extends RedisModel {
                let sessionKey = RedisModel.makeRedisKey(REDIS_KEYS.Session, sessionId);
                if (type == SESSION_TYPES.MUC||
                    type == SESSION_TYPES.PRESCRIPTION ||
                    SESSION_TYPES.PRESCRIPTION_HOSPITAL ||
                    SESSION_TYPES.COLLABORATION_HOSPITAL ||
                    SESSION_TYPES.GUIDANCE_HOSPITAL ||
                    SESSION_TYPES.GENERAL_EXPERT ||
                    SESSION_TYPES.PRESCRIPTION_HOSPITAL_VIDEO ||
                    SESSION_TYPES.MUC_VIDEO ||
                    SESSION_TYPES.ONDOOR_NURSING) {
                    type == SESSION_TYPES.PRESCRIPTION_HOSPITAL ||
                    type == SESSION_TYPES.COLLABORATION_HOSPITAL ||
                    type ==SESSION_TYPES.GUIDANCE_HOSPITAL ||
                    type==SESSION_TYPES.GENERAL_EXPERT ||
                    type==SESSION_TYPES.PRESCRIPTION_HOSPITAL_VIDEO ||
                    type==SESSION_TYPES.MUC_VIDEO ||
                    type==SESSION_TYPES.ONDOOR_NURSING||
                    type==SESSION_TYPES.GUIDANCE_ASSISTANT) {
                    businessType = 2;
                }
                let session = {
@ -230,7 +232,8 @@ class Sessions extends RedisModel {
                type==SESSION_TYPES.GENERAL_EXPERT ||
                type==SESSION_TYPES.PRESCRIPTION_HOSPITAL_VIDEO ||
                type==SESSION_TYPES.MUC_VIDEO ||
                type==SESSION_TYPES.ONDOOR_NURSING){
                type==SESSION_TYPES.ONDOOR_NURSING||
                type==SESSION_TYPES.GUIDANCE_ASSISTANT){
                callCreateSession(SESSION_BUSINESS_TYPE.PATIENT);
            }else if(type==SESSION_TYPES.SPECIALISTGROUP||type==SESSION_TYPES.DISCUSSION){
                callCreateSession(SESSION_BUSINESS_TYPE.DOCTOR);
@ -907,6 +910,126 @@ class Sessions extends RedisModel {
        ]);
    }
    getUserSessionsByTypeAndNoParticipant(userId,type,page, size,status) {
        let self = this;
        logger.info("根据用户类型获取用户的session列表2: ");
        async.waterfall([
            // 获取会话ID列表
            function (callback) {
                SessionRepo.findListByTypeAndNoParticipant(userId,type,page,size,status,function(err,res){
                    logger.info("根据用户类型获取用户的session列表: res :"+res);
                    if (res == null || 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 && res.length != 0 && res[0].birthdate) {
                                                bir = res[0].birthdate.getTime();
                                            }
                                            var sex = 1;
                                            if (res && 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
@ -1283,13 +1406,14 @@ class Sessions extends RedisModel {
                                            }
                                        }else if(session.type == SESSION_TYPES.MUC ||
                                            session.type == SESSION_TYPES.PRESCRIPTION ||
                                            SESSION_TYPES.PRESCRIPTION_HOSPITAL ||
                                            SESSION_TYPES.COLLABORATION_HOSPITAL ||
                                            SESSION_TYPES.GUIDANCE_HOSPITAL ||
                                            SESSION_TYPES.GENERAL_EXPERT ||
                                            SESSION_TYPES.PRESCRIPTION_HOSPITAL_VIDEO ||
                                            SESSION_TYPES.MUC_VIDEO ||
                                            SESSION_TYPES.ONDOOR_NURSING){
                                            session.type==SESSION_TYPES.PRESCRIPTION_HOSPITAL ||
                                            session.type==SESSION_TYPES.COLLABORATION_HOSPITAL ||
                                            session.type==SESSION_TYPES.GUIDANCE_HOSPITAL ||
                                            session.type==SESSION_TYPES.GENERAL_EXPERT ||
                                            session.type==SESSION_TYPES.PRESCRIPTION_HOSPITAL_VIDEO ||
                                            session.type==SESSION_TYPES.MUC_VIDEO ||
                                            session.type==SESSION_TYPES.ONDOOR_NURSING||
                                            session.type==SESSION_TYPES.GUIDANCE_ASSISTANT){
                                            for(var j in users){
                                                if(users[j]==userId)continue;
                                                WechatClient.sendMucAllRead(users[j],userId,sessionId);
@ -1324,13 +1448,14 @@ class Sessions extends RedisModel {
                                            }
                                        }else if(session.type == SESSION_TYPES.MUC ||
                                            session.type == SESSION_TYPES.PRESCRIPTION ||
                                            SESSION_TYPES.PRESCRIPTION_HOSPITAL ||
                                            SESSION_TYPES.COLLABORATION_HOSPITAL ||
                                            SESSION_TYPES.GUIDANCE_HOSPITAL ||
                                            SESSION_TYPES.GENERAL_EXPERT ||
                                            SESSION_TYPES.PRESCRIPTION_HOSPITAL_VIDEO ||
                                            SESSION_TYPES.MUC_VIDEO ||
                                            SESSION_TYPES.ONDOOR_NURSING){
                                            session.type==SESSION_TYPES.PRESCRIPTION_HOSPITAL ||
                                            session.type==SESSION_TYPES.COLLABORATION_HOSPITAL ||
                                            session.type==SESSION_TYPES.GUIDANCE_HOSPITAL ||
                                            session.type==SESSION_TYPES.GENERAL_EXPERT ||
                                            session.type==SESSION_TYPES.PRESCRIPTION_HOSPITAL_VIDEO ||
                                            session.type==SESSION_TYPES.MUC_VIDEO ||
                                            session.type==SESSION_TYPES.ONDOOR_NURSING||
                                            session.type==SESSION_TYPES.GUIDANCE_ASSISTANT){
                                            for(var j in users){
                                                if(users[j]==userId)continue;
                                                //如果是患者拉取数据告诉在线的医生患者已经读取数据
@ -1656,7 +1781,8 @@ class Sessions extends RedisModel {
                        sessionType ==SESSION_TYPES.GENERAL_EXPERT ||
                        sessionType ==SESSION_TYPES.PRESCRIPTION_HOSPITAL_VIDEO ||
                        sessionType ==SESSION_TYPES.MUC_VIDEO ||
                        sessionType ==SESSION_TYPES.ONDOOR_NURSING){
                        sessionType ==SESSION_TYPES.ONDOOR_NURSING||
                        sessionType ==SESSION_TYPES.GUIDANCE_ASSISTANT){
                        if(message.content_type == CONTENT_TYPES.PlainText ||
                           message.content_type == CONTENT_TYPES.Image ||
                           message.content_type == CONTENT_TYPES.Audio||

+ 8 - 7
src/server/models/sessions/topics.js

@ -267,13 +267,14 @@ class Topics extends RedisModel {
        let self = this;
        if (!sessionId && (sessionType == SESSION_TYPES.MUC||
                sessionType == SESSION_TYPES.PRESCRIPTION ||
                SESSION_TYPES.PRESCRIPTION_HOSPITAL ||
                SESSION_TYPES.COLLABORATION_HOSPITAL ||
                SESSION_TYPES.GUIDANCE_HOSPITAL ||
                SESSION_TYPES.GENERAL_EXPERT ||
                SESSION_TYPES.PRESCRIPTION_HOSPITAL_VIDEO ||
                SESSION_TYPES.MUC_VIDEO ||
                SESSION_TYPES.ONDOOR_NURSING)) {
                sessionType ==SESSION_TYPES.PRESCRIPTION_HOSPITAL ||
                sessionType ==SESSION_TYPES.COLLABORATION_HOSPITAL ||
                sessionType ==SESSION_TYPES.GUIDANCE_HOSPITAL ||
                sessionType ==SESSION_TYPES.GENERAL_EXPERT ||
                sessionType ==SESSION_TYPES.PRESCRIPTION_HOSPITAL_VIDEO ||
                sessionType ==SESSION_TYPES.MUC_VIDEO ||
                sessionType ==SESSION_TYPES.ONDOOR_NURSING||
                sessionType ==SESSION_TYPES.GUIDANCE_ASSISTANT)) {
            ModelUtil.emitOK(self.eventEmitter, {status: -1, message: "会话ID为空,请先生成会话ID"});
            return;
        }

+ 36 - 1
src/server/repository/mysql/session.repo.js

@ -21,7 +21,7 @@ class SessionRepo {
     * @param handler
     */
    static findOne(sessionId, handler) {
        let sessionSQL = "select id,name,type,create_date,business_type from " + DB_TABLES.Sessions + " s where s.id = ?";
        let sessionSQL = "select id,name,type,create_date,business_type,status from " + DB_TABLES.Sessions + " s where s.id = ?";
        ImDb.execQuery({
            "sql": sessionSQL,
            "args": [sessionId],
@ -192,6 +192,41 @@ class SessionRepo {
        });
    }
    /**
     * 分页获取用户会话列表
     * @param userId
     * @param type
     * @param handler
     */
    static findListByTypeAndNoParticipant(userId, type,page,pagesize, status,handler) {
        log.info("type="+type);
        if (page > 0) {
            if (page == 1) {
                page = 0;
            }else{
                page = (parseInt(page)-1) * parseInt(pagesize);
            }
        }
        let sql = "select session_id from " + DB_TABLES.Participants + " w where w.participant_role <>0 group by w.session_id";
        let sessionSQL = "select id, name, type, create_date, last_sender_id, last_sender_name, last_content_type, last_content, last_message_time from "
            + DB_TABLES.Sessions + " s where s.id not in(" + sql + ") and s.type in("+type+") ";
        if(status != null && status != ""){
            sessionSQL += " and s.status="+status
        }
        sessionSQL +=  " order by s.last_message_time desc limit "+page+","+pagesize;
        log.info(sessionSQL)
        ImDb.execQuery({
            "sql": sessionSQL,
            "args": [userId],
            "handler": handler || function (err, res) {
                if(err) log.error(err);
            }
        });
    }
    static findAllByTypeAndStatus(userId, businessType,status,page,pagesize, handler) {
        if (page > 0) {
            if (page == 1) {