app.client.js 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  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 MessageNoticeSettingRepo = require('../../repository/mysql/message.noticeSetting.repo');
  9. let SignFamilyRepo = require('../../repository/mysql/sign.family.repo');
  10. let ModelUtil = require('../../util/model.util');
  11. let clientCache = require('../socket.io/client.cache').clientCache();
  12. let WlyyAssistantSDK = require("../../util/wlyyAssistant.sdk");
  13. let WlyySDK = require("../../util/wlyy.sdk");
  14. let log = require("../../util/log.js");
  15. let pusher = require('../push/pusher');
  16. let redisConn = RedisClient.redisClient().connection;
  17. const CONTENT_TYPES = require('../../include/commons').CONTENT_TYPES;
  18. const SESSION_TYPES = require('../../include/commons').SESSION_TYPES;
  19. const MESSAGE_BUSSINESS_TYPE = require('../../include/commons').MESSAGE_BUSSINESS_TYPE;
  20. const REDIS_KEYS = require('../../include/commons').REDIS_KEYS;
  21. const PLATFORMS = require('../../include/commons').PLATFORM;
  22. class AppClient extends RedisModel {
  23. constructor() {
  24. super();
  25. }
  26. /**
  27. * 更新客户端App状态。
  28. *
  29. * @param userId
  30. * @param appInBg
  31. * @param handler
  32. */
  33. updateAppStatus(userId, appInBg, handler) {
  34. let self = this;
  35. let userStatusKey = RedisModel.makeRedisKey(REDIS_KEYS.UserAppStatus, userId);
  36. redisConn.hgetAsync(userStatusKey, 'app_in_bg').then(function (res) {
  37. if (res !== null) {
  38. // redisConn.hsetAsync(userStatusKey, 'app_in_bg', appInBg ? 1 : 0).then(function (res) {
  39. redisConn.hsetAsync(userStatusKey, 'app_in_bg', appInBg).then(function (res) {
  40. if (handler) {
  41. handler(null, true);
  42. } else {
  43. ModelUtil.emitOK(self.eventEmitter, {});
  44. }
  45. });
  46. } else {
  47. if (handler) {
  48. handler(null, true);
  49. } else {
  50. ModelUtil.emitDataNotFound(self.eventEmitter, {"message": "User is offline, unable to update app status."});
  51. }
  52. }
  53. });
  54. }
  55. /**
  56. * 获取用户App端状态。若Redis中找不到,则从MySQL中查找。
  57. *
  58. * @param userId
  59. * @param handler
  60. */
  61. static getAppStatus(userId, handler) {
  62. let userStatusKey = RedisModel.makeRedisKey(REDIS_KEYS.UserAppStatus, userId);
  63. redisConn.hgetallAsync(userStatusKey)
  64. .then(function (res) {
  65. if (res) {
  66. handler(null, res);
  67. } else {
  68. AppStatusRepo.findOne(userId, function (err, res) {
  69. if (err) throw err;
  70. let userStatus = null;
  71. if (res.length > 0) {
  72. userStatus = {
  73. platform: res[0].platform,
  74. device_token: res[0].device_token,
  75. client_id: res[0].client_id,
  76. app_in_bg: res[0].app_in_bg == 1,
  77. last_login_time: res[0].last_login_time
  78. }
  79. }
  80. handler(null, userStatus);
  81. });
  82. }
  83. })
  84. .catch(function (err) {
  85. handler(err, null);
  86. });
  87. }
  88. static sendNotice(targetId, message, sessionType,badge,userStatus){
  89. //调用接口推送医生助手微信模板
  90. let param = {
  91. sessionId:message.session_id||'',
  92. sessionType:sessionType,
  93. from:message.sender_id|| '',
  94. content:message.content,
  95. contentType:message.content_type,
  96. businessType:message.businessType || 1,
  97. doctorCode:targetId
  98. }
  99. // let params = 'sessionId='+(message.session_id||'')+'&sessionType='+sessionType+"&from="+(message.sender_id|| '')+'&content='+message.content+'&businessType='+(message.business_type || 1)+'&doctorCode='+targetId;
  100. // 医生助手有自己的模板消息,不需要通过im发送
  101. // WlyyAssistantSDK.request('admin', '0a5c5258-8863-4b07-a3f9-88c768528ab4', '', 'admin_imei', '/doctor/feldsher/sendDoctorTemplate', param, function (err, res) {
  102. // // WlyySDK.request('admin', '0a5c5258-8863-4b07-a3f9-88c768528ab4', '', 'admin_imei', '/doctor/feldsher/sendDoctorTemplate?' + params, 'GET', function (err, res) {
  103. // if(err){
  104. // log.error(err);
  105. // }else {
  106. // log.info(res);
  107. // }
  108. // });
  109. if (!userStatus) {
  110. log.warn("User's app status is not found, user id: " + targetId + ", maybe user never login yet or logout?");
  111. return;
  112. }
  113. let tipMessage = CONTENT_TYPES.typeToDescription(parseInt(message.content_type), "您有一条新消息") || message.content;
  114. let customData = {
  115. session_id: message.session_id||'',
  116. session_type: sessionType,
  117. from: message.sender_id|| '',
  118. data: message.content,
  119. business_type: message.business_type || 1
  120. };
  121. if (userStatus.platform == PLATFORMS.iOS) {
  122. pusher.pushToSingleViaAPN(tipMessage, customData, message.content_type, userStatus.device_token,badge, function (err, res) {
  123. if (err) {
  124. ModelUtil.logError("Send notification via APN failed:"+userStatus.device_token, err);
  125. } else {
  126. log.info("Send notification via APN succeed: ", JSON.stringify(res));
  127. }
  128. });
  129. } else if (userStatus.platform == PLATFORMS.Android) {
  130. let title = '新消息';
  131. pusher.pushToSingleViaAndroid(title, tipMessage, customData, userStatus.client_id, userStatus.app_in_bg, function (err, res) {
  132. if (err) {
  133. ModelUtil.logError("Send notification via Android failed", err);
  134. } else {
  135. log.info("Send notification via Android succeed: ", JSON.stringify(res));
  136. }
  137. });
  138. }
  139. }
  140. /**
  141. * 向App端推送消息。指令性消息不推。
  142. *
  143. * @param targetId
  144. * @param message
  145. * @param sessionType
  146. */
  147. static sendNotification(targetId, message, sessionType,badge) {
  148. if (message.content_type == CONTENT_TYPES.PlainText ||
  149. message.content_type == CONTENT_TYPES.Image ||
  150. message.content_type == CONTENT_TYPES.Audio||
  151. message.content_type == CONTENT_TYPES.Video||
  152. message.content_type == CONTENT_TYPES.GoTo||
  153. sessionType==SESSION_TYPES.SYSTEM) {
  154. AppClient.getAppStatus(targetId, function (err, userStatus) {
  155. if (err) {
  156. ModelUtil.logError("Get user app status failed", err);
  157. return;
  158. }
  159. var session_type = isNaN(Number(sessionType))?sessionType:Number(sessionType);
  160. if( session_type==SESSION_TYPES.MUC||
  161. session_type==SESSION_TYPES.P2P||
  162. session_type==SESSION_TYPES.GROUP||
  163. session_type==SESSION_TYPES.DISCUSSION||
  164. session_type==SESSION_TYPES.SPECIALISTGROUP||
  165. session_type==SESSION_TYPES.PRESCRIPTION||
  166. message.business_type == MESSAGE_BUSSINESS_TYPE.D_CT_01||
  167. message.business_type == MESSAGE_BUSSINESS_TYPE.D_CT_02||
  168. message.business_type == MESSAGE_BUSSINESS_TYPE.D_CT_03||
  169. message.business_type == MESSAGE_BUSSINESS_TYPE.D_CT_04){
  170. //是否发送消息
  171. MessageNoticeSettingRepo.findOne(targetId,'1',function (err,res) {
  172. if(res&&res.length>0){
  173. let master_switch = res[0].master_switch;
  174. let im_switch = res[0].im_switch;
  175. let family_topic_switch = res[0].family_topic_switch;
  176. if(master_switch==0||im_switch==0){
  177. ModelUtil.logError(targetId+"-关闭im消息,消息id", message.id);
  178. }
  179. // else if(session_type==SESSION_TYPES.MUC&&family_topic_switch==1){
  180. // SignFamilyRepo.isHealthDoctor(message.session_id,targetId,function (err,res) {
  181. // if(res&&res.length==0){
  182. // ModelUtil.logError("全科医生:"+targetId+"-关闭im消息,消息id", message.id);
  183. // }else{
  184. // AppClient.sendNotice(targetId, message, sessionType,badge,userStatus)
  185. // }
  186. // })
  187. // }
  188. else{
  189. AppClient.sendNotice(targetId, message, sessionType,badge,userStatus)
  190. }
  191. }
  192. });
  193. }else{
  194. AppClient.sendNotice(targetId, message, sessionType,badge,userStatus)
  195. }
  196. });
  197. }
  198. }
  199. }
  200. // Expose class
  201. module.exports = AppClient;