app.client.js 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. /**
  2. * App客户端。
  3. */
  4. "use strict";
  5. let RedisClient = require('../../repository/redis/redis.client');
  6. let RedisModel = require('./../redis.model');
  7. let AppStatusRepo = require('../../repository/mysql/app.status.repo');
  8. let ModelUtil = require('../../util/model.util');
  9. let clientCache = require('../socket.io/client.cache').clientCache();
  10. let WlyyAssistantSDK = require("../../util/wlyyAssistant.sdk");
  11. let WlyySDK = require("../../util/wlyy.sdk");
  12. let log = require("../../util/log.js");
  13. let pusher = require('../push/pusher');
  14. let redisConn = RedisClient.redisClient().connection;
  15. const CONTENT_TYPES = require('../../include/commons').CONTENT_TYPES;
  16. const SESSION_TYPES = require('../../include/commons').SESSION_TYPES;
  17. const REDIS_KEYS = require('../../include/commons').REDIS_KEYS;
  18. const PLATFORMS = require('../../include/commons').PLATFORM;
  19. class AppClient extends RedisModel {
  20. constructor() {
  21. super();
  22. }
  23. /**
  24. * 更新客户端App状态。
  25. *
  26. * @param userId
  27. * @param appInBg
  28. * @param handler
  29. */
  30. updateAppStatus(userId, appInBg, handler) {
  31. let self = this;
  32. let userStatusKey = RedisModel.makeRedisKey(REDIS_KEYS.UserAppStatus, userId);
  33. redisConn.hgetAsync(userStatusKey, 'app_in_bg').then(function (res) {
  34. if (res !== null) {
  35. redisConn.hsetAsync(userStatusKey, 'app_in_bg', appInBg ? 1 : 0).then(function (res) {
  36. if (handler) {
  37. handler(null, true);
  38. } else {
  39. ModelUtil.emitOK(self.eventEmitter, {});
  40. }
  41. });
  42. } else {
  43. if (handler) {
  44. handler(null, true);
  45. } else {
  46. ModelUtil.emitDataNotFound(self.eventEmitter, {"message": "User is offline, unable to update app status."});
  47. }
  48. }
  49. });
  50. }
  51. /**
  52. * 获取用户App端状态。若Redis中找不到,则从MySQL中查找。
  53. *
  54. * @param userId
  55. * @param handler
  56. */
  57. static getAppStatus(userId, handler) {
  58. let userStatusKey = RedisModel.makeRedisKey(REDIS_KEYS.UserAppStatus, userId);
  59. redisConn.hgetallAsync(userStatusKey)
  60. .then(function (res) {
  61. if (res) {
  62. handler(null, res);
  63. } else {
  64. AppStatusRepo.findOne(userId, function (err, res) {
  65. if (err) throw err;
  66. let userStatus = null;
  67. if (res.length > 0) {
  68. userStatus = {
  69. platform: res[0].platform,
  70. device_token: res[0].device_token,
  71. client_id: res[0].client_id,
  72. app_in_bg: res[0].app_in_bg == 1,
  73. last_login_time: res[0].last_login_time
  74. }
  75. }
  76. handler(null, userStatus);
  77. });
  78. }
  79. })
  80. .catch(function (err) {
  81. handler(err, null);
  82. });
  83. }
  84. /**
  85. * 向App端推送消息。指令性消息不推。
  86. *
  87. * @param targetId
  88. * @param message
  89. * @param sessionType
  90. */
  91. static sendNotification(targetId, message, sessionType,badge) {
  92. if (message.content_type == CONTENT_TYPES.PlainText ||
  93. message.content_type == CONTENT_TYPES.Image ||
  94. message.content_type == CONTENT_TYPES.Audio||
  95. message.content_type == CONTENT_TYPES.Video||
  96. message.content_type == CONTENT_TYPES.GoTo||
  97. sessionType==SESSION_TYPES.SYSTEM) {
  98. AppClient.getAppStatus(targetId, function (err, userStatus) {
  99. if (err) {
  100. ModelUtil.logError("Get user app status failed", err);
  101. return;
  102. }
  103. // let pc_doctorClient = clientCache.findByIdAndType("pc_"+targetId,SOCKET_TYPES.PC_DOCTOR);
  104. // if(pc_doctorClient){
  105. // log.warn("User's pc is online, user id: " + targetId + ", we cannot send getui.");
  106. // return;
  107. // }
  108. //调用接口推送医生助手微信模板
  109. let param = {
  110. sessionId:message.session_id||'',
  111. sessionType:sessionType,
  112. from:message.sender_id|| '',
  113. content:message.content,
  114. contentType:message.content_type,
  115. businessType:message.businessType || 1,
  116. doctorCode:targetId
  117. }
  118. // let params = 'sessionId='+(message.session_id||'')+'&sessionType='+sessionType+"&from="+(message.sender_id|| '')+'&content='+message.content+'&businessType='+(message.business_type || 1)+'&doctorCode='+targetId;
  119. WlyyAssistantSDK.request('admin', '0a5c5258-8863-4b07-a3f9-88c768528ab4', '', 'admin_imei', '/doctor/feldsher/sendDoctorTemplate', param, function (err, res) {
  120. // WlyySDK.request('admin', '0a5c5258-8863-4b07-a3f9-88c768528ab4', '', 'admin_imei', '/doctor/feldsher/sendDoctorTemplate?' + params, 'GET', function (err, res) {
  121. if(err){
  122. log.error(err);
  123. }else {
  124. log.info(res);
  125. }
  126. });
  127. if (!userStatus) {
  128. log.warn("User's app status is not found, user id: " + targetId + ", maybe user never login yet or logout?");
  129. return;
  130. }
  131. let tipMessage = CONTENT_TYPES.typeToDescription(parseInt(message.content_type), "您有一条新消息") || message.content;
  132. let customData = {
  133. session_id: message.session_id||'',
  134. session_type: sessionType,
  135. from: message.sender_id|| '',
  136. data: message.content,
  137. business_type: message.business_type || 1
  138. };
  139. if (userStatus.platform == PLATFORMS.iOS) {
  140. pusher.pushToSingleViaAPN(tipMessage, customData, message.content_type, userStatus.device_token,badge, function (err, res) {
  141. if (err) {
  142. ModelUtil.logError("Send notification via APN failed:"+userStatus.device_token, err);
  143. } else {
  144. log.info("Send notification via APN succeed: ", JSON.stringify(res));
  145. }
  146. });
  147. } else if (userStatus.platform == PLATFORMS.Android) {
  148. let title = '新消息';
  149. pusher.pushToSingleViaAndroid(title, tipMessage, customData, userStatus.client_id, userStatus.app_in_bg, function (err, res) {
  150. if (err) {
  151. ModelUtil.logError("Send notification via Android failed", err);
  152. } else {
  153. log.info("Send notification via Android succeed: ", JSON.stringify(res));
  154. }
  155. });
  156. }
  157. });
  158. }
  159. }
  160. }
  161. // Expose class
  162. module.exports = AppClient;