yeshijie 4 years ago
parent
commit
0b6311c3e7

+ 11 - 1
readme.md

@ -372,4 +372,14 @@ post请求
 
 ###备注
 topic的id=wlyy_consult的code
 
###SOCKET客户端登陆类型
居民微信:patient
居民微信外层:patient_system
居民PC: pc_patient
居民PC外层: pc_patient_system
医生App: doctor
医生App外层:doctor_system
医生PC:pc_doctor
医生PC外层:pc_doctor_system

+ 20 - 0
src/server/endpoints/v2/message.endpoint.js

@ -11,6 +11,7 @@ let ControllerUtil = require('../../util/controller.util');
let APIv2 = require('../../include/endpoints').APIv2;
let MODEL_EVENTS = require('../../include/commons').MODEL_EVENTS;
let Messages = require('../../models/messages/messages');
let WechatClient = require("../../models/client/wechat.client.js");
/**
 * 发送消息
@ -30,6 +31,25 @@ router.post(APIv2.Message.Send, function (req, res) {
    messages.sendMessage(payload);
});
/**
 * 发送医生外层socket消息
 */
router.post(APIv2.Message.DoctorSystemMessage, function (req, res) {
    let targetUserId = req.body.targetUserId;
    let message = req.body.message;
    let wechatClient = new WechatClient();
    if (!targetUserId) {
        throw {httpStatus: 406, message: 'Missing targetUserId.'};
    }
    if (!message) {
        throw {httpStatus: 406, message: 'Missing message.'};
    }
    ControllerUtil.regModelEventHandler(wechatClient, res);
    //告知医生新消息
    wechatClient.sendSystemSocketMessage(targetUserId,JSON.parse(message));
});
router.get(APIv2.Message.DataMessage, function (req, res) {
    let sessionId = req.query.sessionId;
    let messages = new Messages();

+ 2 - 0
src/server/handlers/socket.handler.js

@ -45,6 +45,8 @@ class SocketHandler {
                        data.userId = "pc_"+data.userId;
                    }else if("pcim_doctor"===data.clientType){//用于pcim 消息通知
                        data.userId = "pcim_"+data.userId;
                    }else if("doctor_system"===data.clientType){//新增医生APP外层-登陆类型
                        data.userId= "doctor_system_"+data.userId;
                    }
                    if(clientCache.removeByUserId(data.userId)){

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

@ -97,6 +97,12 @@ const CONTENT_TYPES = {
    PrescriptionBloodStatus:16,//续方咨询血糖血压咨询消息
    PrescriptionFollowupContent:17,//续方咨询随访问卷消息
    Rehabilitation: 20, //康复计划发送
    VideoStart:40,// 视频通讯-发起视频
    VideoHangUp:41,// 视频通讯-医生主动挂断视频
    VideoAutoHangUp:42,// 视频通讯-自动挂断视频
    VideoRefuse:43,// 视频通讯-拒绝视频
    VideoOver:44,// 视频通讯-结束视频
    VideoCancel:45,// 视频通讯-居民取消视频
    ReservationDoorCardInfo: 2101,//上门服务-预约工单卡片信息
    ChangeDoorCardInfo: 2102,//上门服务-修改工单卡片信息
    ChangeDoorDoctor: 2103,//上门服务-变更工单医生信息
@ -123,9 +129,14 @@ exports.CONTENT_TYPES = CONTENT_TYPES;
exports.SOCKET_TYPES={
    PATIENT:"patient",
    PATIENT_SYSTEM:"patient_system",//居民微信外层
    PC_PATIENT:"pc_patient",//居民PC
    PC_PATIENT_SYSTEM:"pc_patient_system",//居民PC外层
    DOCTOR:"doctor",
    PC_DOCTOR:"pc_doctor",
    PCIM_DOCTOR:"pcim_doctor",
    PC_DOCTOR_SYSTEM:"pc_doctor_system",//医生PC外层
    DOCTOR_SYSTEM:"doctor_system",//医生APP外层
    DEMO:"demo"
}

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

@ -19,6 +19,7 @@ const APIv2 = {
        Send: '/send',       //发送消息,和会话无关,内外网通信
        DataMessage: '/dataMessage',
        CleanMessageToRedis: '/cleanMessageToRedis',
        DoctorSystemMessage: '/doctorSystemMessage',
        CleanMessageLastFetchTimeToRedis: '/cleanMessageLastFetchTimeToRedis'
    },
    Users: {

+ 145 - 2
src/server/models/client/wechat.client.js

@ -66,6 +66,12 @@ class WechatClient extends RedisModel {
            message.content_type == CONTENT_TYPES.ReservationDoorCardInfo ||
            message.content_type == CONTENT_TYPES.ChangeDoorCardInfo ||
            message.content_type == CONTENT_TYPES.ChangeDoorDoctor ||
            message.content_type == CONTENT_TYPES.VideoStart ||
            message.content_type == CONTENT_TYPES.VideoHangUp ||
            message.content_type == CONTENT_TYPES.VideoAutoHangUp ||
            message.content_type == CONTENT_TYPES.VideoRefuse ||
            message.content_type == CONTENT_TYPES.VideoOver ||
            message.content_type == CONTENT_TYPES.VideoCancel ||
            message.content_type == CONTENT_TYPES.ChangeDoorPackageItems)) {
            let patientClient = clientCache.findById(targetUserId);
            let doctorClient = clientCache.findByIdAndType(message.sender_id,SOCKET_TYPES.DOCTOR);
@ -104,7 +110,7 @@ class WechatClient extends RedisModel {
            } else {
                if(doctorClient){
/*                if(doctorClient){
                    log.warn("doctor is online, sending via web socket. User id: ", targetUserId);
                    WechatClient.sendViaWebSocket(doctorClient.socket, message);
                }
@ -112,7 +118,7 @@ class WechatClient extends RedisModel {
                if(pc_doctorClient){
                    log.warn("pc_doctor is online, sending via web socket. User id: ", targetUserId);
                    WechatClient.sendViaWebSocket(pc_doctorClient.socket, message);
                }
                }*/
                log.info("User's wechat endpoint is not online, sending via wechat template message. User id: ", targetUserId);
                var isSendWXTem = true;//是否发送微信模板
@ -255,6 +261,8 @@ class WechatClient extends RedisModel {
        }
    }
    static sendSocketMessageToDoctor(doctorId, message) {
        let doctorClient = clientCache.findByIdAndType(doctorId,SOCKET_TYPES.DOCTOR);
        let pc_doctorClient = clientCache.findByIdAndType("pc_"+doctorId,SOCKET_TYPES.PC_DOCTOR);
@ -341,6 +349,141 @@ class WechatClient extends RedisModel {
        }
    }
    //推送居民、居民PC、医生、医生PC外层推送
    sendSystemSocketMessage(targetUserId, message,handler) {
        let self = this;
        //医生外层消息推送
        let doctorClient = clientCache.findByIdAndType("doctor_system_"+targetUserId,SOCKET_TYPES.DOCTOR_SYSTEM);
        if(!doctorClient){
            log.warn("target doctor system is not online!");
            ModelUtil.emitOK(self.eventEmitter, {status: 1,message:"doctor_not_online"});
            return;
        }
        if(doctorClient&&message.session_id==doctorClient.sessionId){
            doctorClient.socket.emit('message', {
                id: message.id,
                session_id: message.session_id,
                sender_id: message.sender_id,
                sender_name: message.sender_name,
                content_type: message.content_type,
                content: message.content,
                timestamp: ObjectUtil.timestampToLong(message.timestamp),
                type: message.content_type,          // legacy support
                name: message.sender_name,
            });
            ModelUtil.emitOK(self.eventEmitter, {status: 200});
            return;
        }else{
            ModelUtil.emitOK(self.eventEmitter, {status: 2,message:"sessionId is error"});
            return;
        }
    }
    //推送居民、居民PC、医生、医生PC外层推送
    static sendSystemSocketMessage(targetUserId, message) {
/*        //居民外层消息推送
        let patientClient = clientCache.findByIdAndType("patient_system_"+targetUserId,SOCKET_TYPES.PATIENT_SYSTEM);
        let pc_patientClient = clientCache.findByIdAndType("pcpatient_system_"+targetUserId,SOCKET_TYPES.PC_PATIENT_SYSTEM);
        if(!patientClient&&!pc_patientClient){
            log.warn("target  patient systemt is not online!");
            // return;
        }
        var patientcount = 0;
        if(patientClient&&message.session_id==patientClient.sessionId){
            WechatClient.updateParticipantLastFetchTime(patientClient.sessionId, targetUserId, ObjectUtil.timestampToLong(message.timestamp));
            patientClient.socket.emit('message', {
                id: message.id,
                session_id: message.session_id,
                sender_id: message.sender_id,
                sender_name: message.sender_name,
                content_type: message.content_type,
                content: message.content,
                timestamp: ObjectUtil.timestampToLong(message.timestamp),
                type: message.content_type,          // legacy support
                name: message.sender_name,
            });
        }else{
            patientcount++;
        }
        //发送pc端
        if(pc_patientClient&&message.session_id==pc_patientClient.sessionId){
            WechatClient.updateParticipantLastFetchTime(pc_patientClient.sessionId, targetUserId, ObjectUtil.timestampToLong(message.timestamp));
            pc_patientClient.socket.emit('message', {
                id: message.id,
                session_id: message.session_id,
                sender_id: message.sender_id,
                sender_name: message.sender_name,
                content_type: message.content_type,
                content: message.content,
                timestamp: ObjectUtil.timestampToLong(message.timestamp),
                type: message.content_type,          // legacy support
                name: message.sender_name,
            });
        }else{
            patientcount++;
        }
        if(patientcount==2){
            log.warn("patient system is not in the same session or is not online");
        }*/
        //医生外层消息推送
        let doctorClient = clientCache.findByIdAndType("doctor_system_"+targetUserId,SOCKET_TYPES.DOCTOR_SYSTEM);
        let pc_doctorClient = clientCache.findByIdAndType("pc_system_"+targetUserId,SOCKET_TYPES.PC_DOCTOR_SYSTEM);
        if(!doctorClient&&!pc_doctorClient){
            log.warn("target doctor system is not online!");
            // return;
        }
        var doctorcount = 0;
        if(doctorClient&&message.session_id==doctorClient.sessionId){
            WechatClient.updateParticipantLastFetchTime(doctorClient.sessionId, targetUserId, ObjectUtil.timestampToLong(message.timestamp));
            doctorClient.socket.emit('message', {
                id: message.id,
                session_id: message.session_id,
                sender_id: message.sender_id,
                sender_name: message.sender_name,
                content_type: message.content_type,
                content: message.content,
                timestamp: ObjectUtil.timestampToLong(message.timestamp),
                type: message.content_type,          // legacy support
                name: message.sender_name,
            });
        }else{
            doctorcount++;
        }
        //发送pc端 - PC端消息不做sessionid的判断,前端自己判断消息归属于哪个会话,自行渲染--20191012-huangwenjie
        // if(pc_doctorClient&&message.session_id==pc_doctorClient.sessionId){
/*        if(pc_doctorClient){
            WechatClient.updateParticipantLastFetchTime(pc_doctorClient.sessionId, targetUserId, ObjectUtil.timestampToLong(message.timestamp));
            pc_doctorClient.socket.emit('message', {
                id: message.id,
                session_id: message.session_id,
                sender_id: message.sender_id,
                sender_name: message.sender_name,
                content_type: message.content_type,
                content: message.content,
                timestamp: ObjectUtil.timestampToLong(message.timestamp),
                type: message.content_type,          // legacy support
                name: message.sender_name,
            });
        }else{
            doctorcount++;
        }
        if(doctorcount==2){
            log.warn("doctor system is not in the same session or is not online");
        }*/
    }
    /**
     *
     * 发送微信模板消息给居民