Просмотр исходного кода

Merge branch 'feature-refactor' of liubing/im.doctor into feature-refactor

shikejing 4 лет назад
Родитель
Сommit
c3f2d15bb1

+ 1 - 0
src/client/im.client.js

@ -68,6 +68,7 @@ var ENDPOINTS = {
        Message: '/sessions/:session_id/messages/:message_id',
        SessionsUnreadMessageCount: '/sessions/unread_message_count',
        SessionsUnreadMessageCountByType: '/sessions/unread_message_count_type',
        SessionUnreadMessageCount: '/sessions/:session_id/unread_message_count',
        SessionUnreadMessages: '/sessions/:session_id/messages/unread',

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

@ -114,6 +114,7 @@ router.get(APIv2.Sessions.SessionListByType, function (req, res) {
    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.'};
    }
@ -129,7 +130,7 @@ router.get(APIv2.Sessions.SessionListByType, function (req, res) {
    let sessions = new Sessions();
    ControllerUtil.regModelEventHandler(sessions, res);
    sessions.getUserSessionsByType(userId,type,page,size);
    sessions.getUserSessionsByType(userId,type,page,size,status);
});
/**
@ -494,6 +495,25 @@ router.get(APIv2.Sessions.SessionsUnreadMessageCount, function (req, res) {
    sessions.getAllSessionsUnreadMessageCount(userId);
});
/**
 * 按会话类型获取未读消息数量  status不传为获取所有状态
 * 请求URL:/sessions/unread_message_count?user_id=xyz&type=18&status=0
 */
router.get(APIv2.Sessions.SessionsUnreadMessageCountByType, function (req, res) {
    let userId = req.query.user_id;
    let type = req.query.type;
    let status = req.query.status;
    if (!type) {
        throw {httpStatus: 406, message: 'Missing type.'};
    }
    let sessions = new Sessions();
    ControllerUtil.regModelEventHandler(sessions, res);
    sessions.getAllSessionsUnreadMessageCountByType(userId,type,status);
});
/**
 * 获取指定会话未读消息数
 *

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

@ -61,6 +61,7 @@ const APIv2 = {
        MessageUpdate: '/:session_id/messages/:message_id/update',      // 更新消息内容(消息里有i健康业务状态时)
        SessionsUnreadMessageCount: '/unread_message_count',            // 所有会话的未读消息数
        SessionsUnreadMessageCountByType: '/unread_message_count_type', // 按会话类型查找未读消息数
        SessionUnreadMessageCount: '/:session_id/unread_message_count', // 指定会话的未读消息数
        SessionUnreadMessages: '/:session_id/messages/unread',          // 会话未读消息

+ 80 - 2
src/server/models/sessions/sessions.js

@ -699,13 +699,13 @@ class Sessions extends RedisModel {
     * @param size
     * @param businessType
     */
    getUserSessionsByType(userId,type,page, size) {
    getUserSessionsByType(userId,type,page, size,status) {
        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){
                SessionRepo.findListByType(userId,type,page,size,status,function(err,res){
                    if (res.length == 0) {
                        ModelUtil.emitOK(self.eventEmitter, []);
                        return;
@ -1321,6 +1321,84 @@ class Sessions extends RedisModel {
        }
    }
    /**
     * 按会话类型获取会话的未读消息数。
     */
    getAllSessionsUnreadMessageCountByType(userId,type,status,handler) {
        let self = this;
        let count = 0;
        let patientCount = 0;
        let doctorCount = 0;
        let patientEndCount = 0;
        SessionRepo.findAllSessionByTypeAndStatus(userId,type,status, function (err, res) {
            if (err) {
                if(handler)
                {
                    handler(err,res);
                    return;
                }
                ModelUtil.logError("getAllSessionsUnreadMessageCount is failed", err);
                return;
            }
            if (res.length == 0) {
                if(handler)
                {
                    handler(err,count);
                    return;
                }
                ModelUtil.emitOK(self.eventEmitter, {count: count});
                return;
            }
            for (let j in res) {
                if (res[j].type == SESSION_TYPES.SYSTEM) {
                    if (j == res.length - 1) {
                        if(handler){
                            handler(err,count);
                            return;
                        }
                        ModelUtil.emitOK(self.eventEmitter, {count: count, patient: patientCount, doctor: doctorCount});
                    }
                    continue;
                }
                callback(res, j, res[j]);
            }
        });
        function callback(res, j, session) {
            self.getSessionUnreadMessageCount(res[j].id, userId, function (err, con) {
                if (err) {
                    if(handler)
                    {
                        handler(err,count);
                        return;
                    }
                    ModelUtil.logError("getAllSessionsUnreadMessageCount is failed", err);
                }
                count = count + con;
                if (session.business_type == SESSION_BUSINESS_TYPE.PATIENT) {
                    if(session.status == SESSION_STATUS.ENDED){//新增判断是否咨询结束
                        patientEndCount = patientEndCount + con;
                    }else{
                        patientCount = patientCount + con;
                    }
                } else {
                    doctorCount = doctorCount + con;
                }
                if (j == res.length - 1) {
                    if(handler)
                    {
                        handler(err,count)
                        return;
                    }
                    ModelUtil.emitOK(self.eventEmitter, {count: count, patient: patientCount,patientEnd: patientEndCount, doctor: doctorCount});
                }
            })
        }
    }
    /**
     * 获取会话的未读消息数。根据成员最后一次获取消息的时候与当前时间。
     *

+ 31 - 3
src/server/repository/mysql/session.repo.js

@ -51,6 +51,27 @@ class SessionRepo {
        });
    }
    static findAllSessionByTypeAndStatus(userId,type,status, handler) {
        let sql = "select session_id from " + DB_TABLES.Participants + " w where w.participant_id = ? and participant_role =0  group by w.session_id";
        let sys_session = "select session_id from " + DB_TABLES.Participants + " w where w.participant_id = 'system' and participant_role =0  group by w.session_id";
        let sessionSQL;
        if (!status){
            sessionSQL  = "select id, name, type, create_date,business_type, last_sender_id, last_sender_name, last_content_type, last_content, last_message_time,status from "
                + DB_TABLES.Sessions + " s where s.id in(" + sql + ") and s.type="+type+" and s.id not in ("+sys_session+")";
        }
        else{
            sessionSQL  = "select id, name, type, create_date,business_type, last_sender_id, last_sender_name, last_content_type, last_content, last_message_time,status from "
                + DB_TABLES.Sessions + " s where s.id in(" + sql + ") and s.type="+type+" and s.status="+status+" and s.id not in ("+sys_session+")";
        }
        ImDb.execQuery({
            "sql": sessionSQL,
            "args": [userId],
            "handler": handler || function (err, res) {
                if(err) log.error(err);
            }
        });
    }
    /**
     * 获取用户全部(未结束的)会话不包含角色未1的会话
     * @param userId
@ -137,7 +158,7 @@ class SessionRepo {
     * @param type
     * @param handler
     */
    static findListByType(userId, type,page,pagesize, handler) {
    static findListByType(userId, type,page,pagesize,status, handler) {
        if (page > 0) {
            if (page == 1) {
                page = 0;
@ -147,8 +168,15 @@ class SessionRepo {
        }
        let sql = "select session_id from " + DB_TABLES.Participants + " w where w.participant_id = ? 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 in(" + sql + ") and s.type=? order by s.last_message_time desc limit "+page+","+pagesize;
        let sessionSQL;
        if (!status){
            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 in(" + sql + ") and s.type=? order by s.last_message_time desc limit "+page+","+pagesize;
        }
        else {
            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 in(" + sql + ") and s.type=? and s.status="+status+" order by s.last_message_time desc limit "+page+","+pagesize;
        }
        ImDb.execQuery({
            "sql": sessionSQL,
            "args": [userId, type],