/** * App客户端。 */ "use strict"; let RedisClient = require('../../repository/redis/redis.client'); let RedisModel = require('./../redis.model'); let AppStatusRepo = require('../../repository/mysql/app.status.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 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) { 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); }); } /** * 向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; } // let pc_doctorClient = clientCache.findByIdAndType("pc_"+targetId,SOCKET_TYPES.PC_DOCTOR); // if(pc_doctorClient){ // log.warn("User's pc is online, user id: " + targetId + ", we cannot send getui."); // return; // } //调用接口推送医生助手微信模板 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; 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)); } }); } }); } } } // Expose class module.exports = AppClient;