/** * App客户端。 */ "use strict"; let RedisClient = require('../../repository/redis/redis.client'); let RedisModel = require('./../redis.model'); let AppStatusRepo = require('../../repository/mysql/app.status.repo'); let MessageNoticeSettingRepo = require('../../repository/mysql/message.noticeSetting.repo'); let SignFamilyRepo = require('../../repository/mysql/sign.family.repo'); let ModelUtil = require('../../util/model.util'); let clientCache = require('../socket.io/client.cache').clientCache(); let WlyyAssistantSDK = require("../../util/wlyyAssistant.sdk"); let WlyySDK = require("../../util/wlyy.sdk"); let log = require("../../util/log.js"); let pusher = require('../push/pusher'); let redisConn = RedisClient.redisClient().connection; const CONTENT_TYPES = require('../../include/commons').CONTENT_TYPES; const SESSION_TYPES = require('../../include/commons').SESSION_TYPES; const MESSAGE_BUSSINESS_TYPE = require('../../include/commons').MESSAGE_BUSSINESS_TYPE; const REDIS_KEYS = require('../../include/commons').REDIS_KEYS; const PLATFORMS = require('../../include/commons').PLATFORM; class AppClient extends RedisModel { constructor() { super(); } /** * 更新客户端App状态。 * * @param userId * @param appInBg * @param handler */ updateAppStatus(userId, appInBg, handler) { let self = this; let userStatusKey = RedisModel.makeRedisKey(REDIS_KEYS.UserAppStatus, userId); redisConn.hgetAsync(userStatusKey, 'app_in_bg').then(function (res) { if (res !== null) { // redisConn.hsetAsync(userStatusKey, 'app_in_bg', appInBg ? 1 : 0).then(function (res) { redisConn.hsetAsync(userStatusKey, 'app_in_bg', appInBg).then(function (res) { if (handler) { handler(null, true); } else { ModelUtil.emitOK(self.eventEmitter, {}); } }); } else { if (handler) { handler(null, true); } else { ModelUtil.emitDataNotFound(self.eventEmitter, {"message": "User is offline, unable to update app status."}); } } }); } /** * 获取用户App端状态。若Redis中找不到,则从MySQL中查找。 * * @param userId * @param handler */ static getAppStatus(userId, handler) { let userStatusKey = RedisModel.makeRedisKey(REDIS_KEYS.UserAppStatus, userId); redisConn.hgetallAsync(userStatusKey) .then(function (res) { if (res) { handler(null, res); } else { AppStatusRepo.findOne(userId, function (err, res) { if (err) throw err; let userStatus = null; if (res.length > 0) { userStatus = { platform: res[0].platform, device_token: res[0].device_token, client_id: res[0].client_id, app_in_bg: res[0].app_in_bg == 1, last_login_time: res[0].last_login_time } } handler(null, userStatus); }); } }) .catch(function (err) { handler(err, null); }); } static sendNotice(targetId, message, sessionType,badge,userStatus){ //调用接口推送医生助手微信模板 let param = { sessionId:message.session_id||'', sessionType:sessionType, from:message.sender_id|| '', content:message.content, contentType:message.content_type, businessType:message.businessType || 1, doctorCode:targetId } // let params = 'sessionId='+(message.session_id||'')+'&sessionType='+sessionType+"&from="+(message.sender_id|| '')+'&content='+message.content+'&businessType='+(message.business_type || 1)+'&doctorCode='+targetId; // 医生助手有自己的模板消息,不需要通过im发送 // WlyyAssistantSDK.request('admin', '0a5c5258-8863-4b07-a3f9-88c768528ab4', '', 'admin_imei', '/doctor/feldsher/sendDoctorTemplate', param, function (err, res) { // // WlyySDK.request('admin', '0a5c5258-8863-4b07-a3f9-88c768528ab4', '', 'admin_imei', '/doctor/feldsher/sendDoctorTemplate?' + params, 'GET', function (err, res) { // if(err){ // log.error(err); // }else { // log.info(res); // } // }); if (!userStatus) { log.warn("User's app status is not found, user id: " + targetId + ", maybe user never login yet or logout?"); return; } let tipMessage = CONTENT_TYPES.typeToDescription(parseInt(message.content_type), "您有一条新消息") || message.content; let customData = { session_id: message.session_id||'', session_type: sessionType, from: message.sender_id|| '', data: message.content, business_type: message.business_type || 1 }; if (userStatus.platform == PLATFORMS.iOS) { pusher.pushToSingleViaAPN(tipMessage, customData, message.content_type, userStatus.device_token,badge, function (err, res) { if (err) { ModelUtil.logError("Send notification via APN failed:"+userStatus.device_token, err); } else { log.info("Send notification via APN succeed: ", JSON.stringify(res)); } }); } else if (userStatus.platform == PLATFORMS.Android) { let title = '新消息'; pusher.pushToSingleViaAndroid(title, tipMessage, customData, userStatus.client_id, userStatus.app_in_bg, function (err, res) { if (err) { ModelUtil.logError("Send notification via Android failed", err); } else { log.info("Send notification via Android succeed: ", JSON.stringify(res)); } }); } } /** * 向App端推送消息。指令性消息不推。 * * @param targetId * @param message * @param sessionType */ static sendNotification(targetId, message, sessionType,badge) { if (message.content_type == CONTENT_TYPES.PlainText || message.content_type == CONTENT_TYPES.Image || message.content_type == CONTENT_TYPES.Audio|| message.content_type == CONTENT_TYPES.Video|| message.content_type == CONTENT_TYPES.GoTo|| sessionType==SESSION_TYPES.SYSTEM) { AppClient.getAppStatus(targetId, function (err, userStatus) { if (err) { ModelUtil.logError("Get user app status failed", err); return; } var session_type = isNaN(Number(sessionType))?sessionType:Number(sessionType); if( session_type==SESSION_TYPES.MUC|| session_type==SESSION_TYPES.P2P|| session_type==SESSION_TYPES.GROUP|| session_type==SESSION_TYPES.DISCUSSION|| session_type==SESSION_TYPES.SPECIALISTGROUP|| session_type==SESSION_TYPES.PRESCRIPTION|| 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|| message.business_type == MESSAGE_BUSSINESS_TYPE.D_CT_04){ //是否发送消息 MessageNoticeSettingRepo.findOne(targetId,'1',function (err,res) { if(res&&res.length>0){ let master_switch = res[0].master_switch; let im_switch = res[0].im_switch; let family_topic_switch = res[0].family_topic_switch; if(master_switch==0||im_switch==0){ ModelUtil.logError(targetId+"-关闭im消息,消息id", message.id); } // else if(session_type==SESSION_TYPES.MUC&&family_topic_switch==1){ // SignFamilyRepo.isHealthDoctor(message.session_id,targetId,function (err,res) { // if(res&&res.length==0){ // ModelUtil.logError("全科医生:"+targetId+"-关闭im消息,消息id", message.id); // }else{ // AppClient.sendNotice(targetId, message, sessionType,badge,userStatus) // } // }) // } else{ AppClient.sendNotice(targetId, message, sessionType,badge,userStatus) } } }); }else{ AppClient.sendNotice(targetId, message, sessionType,badge,userStatus) } }); } } } // Expose class module.exports = AppClient;