123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177 |
- /**
- * 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;
|