wechat.client.js 61 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308
  1. /**
  2. * 用户微信客户端。
  3. */
  4. "use strict";
  5. let RedisClient = require('../../repository/redis/redis.client');
  6. let RedisModel = require('../redis.model');
  7. let ObjectUtil = require("../../util/object.util.js");
  8. let ModelUtil = require('../../util/model.util');
  9. let WechatSDK = require('../../util/wechat.sdk');
  10. let PatientRepo = require('../../repository/mysql/patient.repo');
  11. let TopicRepo = require("../../repository/mysql/topics.repo.js");
  12. let ParticipantRepo = require("../../repository/mysql/participant.repo");
  13. let redisConn = RedisClient.redisClient().connection;
  14. let clientCache = require('../socket.io/client.cache').clientCache();
  15. let configFile = require('../../include/commons').CONFIG_FILE;
  16. let config = require('../../resources/config/' + configFile);
  17. let log = require("../../util/log.js");
  18. let https = require('https');
  19. let http = require('http');
  20. let async = require('async');
  21. let querystring = require('querystring');
  22. let HlwyyWechatAssistantSDK = require("../../util/hlwyyWechatAssistant.sdk");
  23. var reqq = require('request');
  24. const CONTENT_TYPES = require('../../include/commons').CONTENT_TYPES;
  25. const SESSION_TYPES = require('../../include/commons').SESSION_TYPES;
  26. const SOCKET_TYPES = require('../../include/commons').SOCKET_TYPES;
  27. const REDIS_KEYS = require('../../include/commons').REDIS_KEYS;
  28. class WechatClient extends RedisModel {
  29. constructor() {
  30. super();
  31. }
  32. /**
  33. * 取得用户微信端状态。若Redis中找不到,则从MySQL中查找。
  34. *
  35. * @param userId
  36. * @param handler
  37. */
  38. static getWechatStatus(userId, handler) {
  39. redisConn.hgetallAsync(RedisModel.makeRedisKey(REDIS_KEYS.UserWechatStatus, userId))
  40. .then(function (status) {
  41. if (status == null) {
  42. PatientRepo.findWechatOpenId(userId, handler);
  43. } else {
  44. handler(null, {openid: status.openid});
  45. }
  46. })
  47. .catch(function (err) {
  48. handler(err, null);
  49. });
  50. }
  51. /**
  52. * 向微信端用户发送消息。若用户微信端在线,通过Web Socket推送给患者,如果不在线则通过微信的模板消息。
  53. *
  54. * 只推送文本、图片及语音消息
  55. *
  56. * @param targetUserId
  57. * @param message 消息体
  58. */
  59. static sendMessage(targetUserId, targetUserName, message) {
  60. if (message&&(message.content_type == CONTENT_TYPES.PlainText ||
  61. message.content_type == CONTENT_TYPES.Image ||
  62. message.content_type == CONTENT_TYPES.Audio||
  63. message.content_type == CONTENT_TYPES.PrescriptionBloodStatus ||
  64. message.content_type == CONTENT_TYPES.PrescriptionFollowupContent ||
  65. message.content_type == CONTENT_TYPES.ReservationDoorCardInfo ||
  66. message.content_type == CONTENT_TYPES.ChangeDoorCardInfo ||
  67. message.content_type == CONTENT_TYPES.ChangeDoorDoctor ||
  68. message.content_type == CONTENT_TYPES.ChangeDoorPackageItems ||
  69. message.content_type == CONTENT_TYPES.ReservationDoorCoachCardInfo ||
  70. message.content_type == CONTENT_TYPES.ChangeDoorCoachCardInfo ||
  71. message.content_type == CONTENT_TYPES.ChangeDoorCoachDoctor ||
  72. message.content_type == CONTENT_TYPES.ChangeDoorCoachPackageItems ||
  73. message.content_type == CONTENT_TYPES.VideoAnswerStatus ||
  74. message.content_type == CONTENT_TYPES.VideoAnswerAck ||
  75. message.content_type == CONTENT_TYPES.Screening ||
  76. message.content_type == CONTENT_TYPES.PrescriptionReject ||
  77. message.content_type == CONTENT_TYPES.PrescriptionSuggest ||
  78. message.content_type == CONTENT_TYPES.ConsultSuggest ||
  79. message.content_type == CONTENT_TYPES.PayMessage||
  80. message.content_type== CONTENT_TYPES.Article||
  81. message.content_type==CONTENT_TYPES.surveyMessage||
  82. message.content_type==CONTENT_TYPES.PersonalCard||
  83. message.content_type==CONTENT_TYPES.Video||
  84. message.content_type==CONTENT_TYPES.PrescriptionInfo||
  85. message.content_type==CONTENT_TYPES.PrescriptionDiagnosis||message.content_type==CONTENT_TYPES.EmergencyAssistanceMessage
  86. )) {
  87. let patientClient = clientCache.findById(targetUserId);
  88. let pc_patientClient = clientCache.findById("pcpatient_"+targetUserId);
  89. let doctorClient = clientCache.findByIdAndType(message.sender_id,SOCKET_TYPES.DOCTOR);
  90. let pc_doctorClient = clientCache.findByIdAndType("pc_"+message.sender_id,SOCKET_TYPES.PC_DOCTOR);
  91. let pc_patient_system_Client = clientCache.findByIdAndType("pcpatient_system_"+targetUserId,SOCKET_TYPES.PC_PATIENT_SYSTEM);
  92. let patient_system_Client = clientCache.findByIdAndType("patient_system_"+targetUserId,SOCKET_TYPES.PATIENT_SYSTEM);
  93. var count = 0;
  94. if (patientClient || pc_patientClient || pc_patient_system_Client || patient_system_Client) {
  95. if(patientClient){
  96. log.warn("User's wechat endpoint is online, sending via web socket. User id: ", targetUserId);
  97. WechatClient.sendViaWebSocket(patientClient.socket, message);
  98. }
  99. if(pc_patientClient){
  100. log.warn("User's pc endpoint is online, sending via web socket. User id: ", targetUserId);
  101. WechatClient.sendViaWebSocket(pc_patientClient.socket, message);
  102. }
  103. if(pc_patient_system_Client){
  104. log.warn("User's pc systme endpoint is online, sending via web socket. User id: ", targetUserId);
  105. WechatClient.sendViaWebSocket(pc_patient_system_Client.socket, message);
  106. }
  107. if(patient_system_Client){
  108. log.warn("User's systme endpoint is online, sending via web socket. User id: ", targetUserId);
  109. WechatClient.sendViaWebSocket(patient_system_Client.socket, message);
  110. }
  111. if(doctorClient && (patientClient || pc_patientClient) ){
  112. log.error("doctor sessionid "+doctorClient.sessionId);
  113. if(patientClient && patientClient.sessionId==doctorClient.sessionId){
  114. log.error("patient sessionid "+patientClient.sessionId);
  115. //用户socket在线,推送给用户后,告知医生此消息已读
  116. WechatClient.updateParticipantLastFetchTime(doctorClient.sessionId, targetUserId, ObjectUtil.timestampToLong(message.timestamp));
  117. WechatClient.sendReadDoctor(doctorClient.socket, message);
  118. }
  119. if(pc_patientClient && pc_patientClient.sessionId==doctorClient.sessionId){
  120. log.error("pc_patient sessionid "+pc_patientClient.sessionId);
  121. //用户socket在线,推送给用户后,告知医生此消息已读
  122. WechatClient.updateParticipantLastFetchTime(doctorClient.sessionId, targetUserId, ObjectUtil.timestampToLong(message.timestamp));
  123. WechatClient.sendReadDoctor(doctorClient.socket, message);
  124. }
  125. }else{
  126. count++;
  127. }
  128. if(pc_doctorClient){
  129. log.error("pc_doctor sessionid "+pc_doctorClient.sessionId);
  130. if(patientClient){
  131. log.error("patient sessionid "+patientClient.sessionId);
  132. if(patientClient.sessionId==pc_doctorClient.sessionId){
  133. //用户socket在线,推送给用户后,告知医生此消息已读
  134. WechatClient.updateParticipantLastFetchTime(pc_doctorClient.sessionId, targetUserId, ObjectUtil.timestampToLong(message.timestamp));
  135. WechatClient.sendReadDoctor(pc_doctorClient.socket, message);
  136. }
  137. }
  138. if(pc_patientClient){
  139. log.error("pc_patient sessionid "+pc_patientClient.sessionId);
  140. if(pc_patientClient.sessionId==pc_doctorClient.sessionId){
  141. //用户socket在线,推送给用户后,告知医生此消息已读
  142. WechatClient.updateParticipantLastFetchTime(pc_doctorClient.sessionId, targetUserId, ObjectUtil.timestampToLong(message.timestamp));
  143. WechatClient.sendReadDoctor(pc_doctorClient.socket, message);
  144. }
  145. }
  146. }else{
  147. count++;
  148. }
  149. if(count==0){
  150. log.error("doctor client not found");
  151. }
  152. } else {
  153. log.info("User's wechat and pc endpoint is not online, sending via wechat template message. User id: ", targetUserId);
  154. var isSendWXTem = true;//是否发送微信模板
  155. if(message.content_type == CONTENT_TYPES.PrescriptionBloodStatus||message.content_type == CONTENT_TYPES.PrescriptionFollowupContent){
  156. var content = JSON.parse(message.content);
  157. if(content.isSendWxTemplate){
  158. message.content = content.text;
  159. }else {
  160. isSendWXTem = false;
  161. }
  162. }else if (message.content_type==CONTENT_TYPES.Article){
  163. var content = JSON.parse(message.content);
  164. message.content = content.title;
  165. }
  166. if(isSendWXTem){
  167. //发送第三方接口的微信模版消息
  168. WechatClient.sendThirdMessageTemplate(targetUserId, targetUserName, message);
  169. //发送厦门i健康的微信模版消息
  170. // WechatClient.sendViaMessageTemplate(targetUserId, targetUserName, message);
  171. }
  172. }
  173. } else if(message.content_type == CONTENT_TYPES.TopicEnd){
  174. let patientClient = clientCache.findById(targetUserId);
  175. if(patientClient){//结束咨询的告知患者
  176. WechatClient.sendViaWebSocket(patientClient.socket, message);
  177. }
  178. let pc_patientClient = clientCache.findById("pcpatient_"+targetUserId);
  179. if(pc_patientClient)//结束咨询的告知患者
  180. {
  181. WechatClient.sendViaWebSocket(pc_patientClient.socket, message);
  182. }
  183. }
  184. };
  185. static sendViaWebSocket(socket, message) {
  186. socket.emit('message', {
  187. id: message.id,
  188. session_id: message.session_id,
  189. sender_id: message.sender_id,
  190. sender_name: message.sender_name,
  191. content_type: message.content_type,
  192. content: message.content,
  193. timestamp: ObjectUtil.timestampToLong(message.timestamp),
  194. type: message.content_type, // legacy support
  195. name: message.sender_name,
  196. sender_img : message.sender_img,
  197. extend:message.extend
  198. });
  199. }
  200. static sendAllRead(doctorId,sessionId){
  201. let doctorClient = clientCache.findByIdAndType(doctorId,SOCKET_TYPES.DOCTOR);
  202. let pc_doctorClient = clientCache.findByIdAndType("pc_"+doctorId,SOCKET_TYPES.PC_DOCTOR);
  203. if(doctorClient){
  204. if(doctorClient.sessionId==sessionId){
  205. doctorClient.socket.emit('message',{ read:"all"});
  206. }else{
  207. log.warn(" doctor not in the same session ");
  208. }
  209. }else{
  210. if(pc_doctorClient && pc_doctorClient.sessionId == sessionId){
  211. pc_doctorClient.socket.emit('message',{ read:"all"});
  212. }else{
  213. log.warn(doctorId+" target doctor is not online!");
  214. }
  215. }
  216. }
  217. static sendMucAllRead(doctorId,loginUserId,sessionId){
  218. let loginClinet = clientCache.findByIdAndType(loginUserId,SOCKET_TYPES.DOCTOR);
  219. if(loginClinet){
  220. //muc是医生来获取数据不能更新成已读
  221. log.warn("type is muc login is doctor not send all read to other doctor!")
  222. return;
  223. }
  224. let doctorClient = clientCache.findByIdAndType(doctorId,SOCKET_TYPES.DOCTOR);
  225. let pc_doctorClient = clientCache.findByIdAndType("pc_"+doctorId,SOCKET_TYPES.PC_DOCTOR);
  226. if(doctorClient){
  227. if(doctorClient.sessionId==sessionId){
  228. doctorClient.socket.emit('message',{ read:"all"});
  229. }else{
  230. log.warn(" doctor not in the same session ");
  231. }
  232. }else{
  233. if(pc_doctorClient && pc_doctorClient.sessionId == sessionId){
  234. pc_doctorClient.socket.emit('message',{ read:"all"});
  235. }else{
  236. log.warn(doctorId+" target doctor is not online!");
  237. }
  238. }
  239. }
  240. static sendReadDoctor(socket, message) {
  241. socket.emit('message', {
  242. id: message.id,
  243. session_id: message.session_id,
  244. sender_id: message.sender_id,
  245. sender_name: message.sender_name,
  246. content_type: message.content_type,
  247. content: message.content,
  248. timestamp: ObjectUtil.timestampToLong(message.timestamp),
  249. type: message.content_type, // legacy support
  250. name: message.sender_name,
  251. read:"one"
  252. });
  253. }
  254. static sendReadDoctorByDoctorId(doctorId, message) {
  255. if(doctorId==message.sender_id){
  256. return;
  257. }
  258. let doctorClient = clientCache.findByIdAndType(doctorId,SOCKET_TYPES.DOCTOR);
  259. let pc_doctorClient = clientCache.findByIdAndType("pc_"+doctorId,SOCKET_TYPES.PC_DOCTOR);
  260. if(!doctorClient&&!pc_doctorClient){
  261. log.warn("target doctor is not online!");
  262. return;
  263. }
  264. let sendDoctorClient = clientCache.findByIdAndType(message.sender_id,SOCKET_TYPES.DOCTOR);
  265. if(!sendDoctorClient){
  266. sendDoctorClient = clientCache.findByIdAndType("pc_"+message.sender_id,SOCKET_TYPES.PC_DOCTOR);
  267. }
  268. var count = 0;
  269. if(doctorClient&&sendDoctorClient&&sendDoctorClient.sessionId==doctorClient.sessionId){
  270. WechatClient.updateParticipantLastFetchTime(doctorClient.sessionId, doctorId, ObjectUtil.timestampToLong(message.timestamp));
  271. sendDoctorClient.socket.emit('message', {
  272. id: message.id,
  273. session_id: message.session_id,
  274. sender_id: message.sender_id,
  275. sender_name: message.sender_name,
  276. content_type: message.content_type,
  277. content: message.content,
  278. timestamp: ObjectUtil.timestampToLong(message.timestamp),
  279. type: message.content_type, // legacy support
  280. name: message.sender_name,
  281. read:"one"
  282. });
  283. }else{
  284. count++;
  285. }
  286. //发送pc版医生端
  287. if(pc_doctorClient&&sendDoctorClient&&sendDoctorClient.sessionId==pc_doctorClient.sessionId){
  288. WechatClient.updateParticipantLastFetchTime(pc_doctorClient.sessionId, doctorId, ObjectUtil.timestampToLong(message.timestamp));
  289. pc_doctorClient.socket.emit('message', {
  290. id: message.id,
  291. session_id: message.session_id,
  292. sender_id: message.sender_id,
  293. sender_name: message.sender_name,
  294. content_type: message.content_type,
  295. content: message.content,
  296. timestamp: ObjectUtil.timestampToLong(message.timestamp),
  297. type: message.content_type, // legacy support
  298. name: message.sender_name,
  299. read:"one"
  300. });
  301. }else{
  302. count++;
  303. }
  304. if(count==2){
  305. log.warn("doctor is not in the same session or is not online");
  306. }
  307. }
  308. static sendSocketMessageToDoctor(doctorId, message) {
  309. let doctorClient = clientCache.findByIdAndType(doctorId,SOCKET_TYPES.DOCTOR);
  310. let pc_doctorClient = clientCache.findByIdAndType("pc_"+doctorId,SOCKET_TYPES.PC_DOCTOR);
  311. if(!doctorClient&&!pc_doctorClient){
  312. log.warn("target doctor is not online!");
  313. return;
  314. }
  315. // let sendClient = clientCache.findByIdAndType(message.sender_id,SOCKET_TYPES.DOCTOR);//app医生发送的消息
  316. // if(!sendClient){//pc医生发送的消息
  317. // sendClient = clientCache.findByIdAndType("pc_"+message.sender_id,SOCKET_TYPES.PC_DOCTOR);
  318. // }
  319. // if(!sendClient){//居民发送的消息
  320. // sendClient = clientCache.findByIdAndType(message.sender_id,SOCKET_TYPES.PATIENT);
  321. // }
  322. var count = 0;
  323. if(doctorClient&&message.session_id==doctorClient.sessionId){
  324. WechatClient.updateParticipantLastFetchTime(doctorClient.sessionId, doctorId, ObjectUtil.timestampToLong(message.timestamp));
  325. doctorClient.socket.emit('message', {
  326. id: message.id,
  327. session_id: message.session_id,
  328. sender_id: message.sender_id,
  329. sender_name: message.sender_name,
  330. content_type: message.content_type,
  331. content: message.content,
  332. timestamp: ObjectUtil.timestampToLong(message.timestamp),
  333. type: message.content_type, // legacy support
  334. name: message.sender_name,
  335. extend:message.extend
  336. });
  337. }else{
  338. count++;
  339. }
  340. //发送pc端 - PC端消息不做sessionid的判断,前端自己判断消息归属于哪个会话,自行渲染--20191012-huangwenjie
  341. // if(pc_doctorClient&&message.session_id==pc_doctorClient.sessionId){
  342. if(pc_doctorClient){
  343. WechatClient.updateParticipantLastFetchTime(pc_doctorClient.sessionId, doctorId, ObjectUtil.timestampToLong(message.timestamp));
  344. pc_doctorClient.socket.emit('message', {
  345. id: message.id,
  346. session_id: message.session_id,
  347. sender_id: message.sender_id,
  348. sender_name: message.sender_name,
  349. content_type: message.content_type,
  350. content: message.content,
  351. timestamp: ObjectUtil.timestampToLong(message.timestamp),
  352. type: message.content_type, // legacy support
  353. name: message.sender_name,
  354. extend:message.extend
  355. });
  356. }else{
  357. count++;
  358. }
  359. if(count==2){
  360. log.warn("doctor is not in the same session or is not online");
  361. }
  362. }
  363. /**
  364. * 推送MDT,医生外层新消息
  365. * @param doctorId
  366. * @param message
  367. */
  368. static sendMDTSocketMessageToDoctor(doctorId, message) {
  369. log.info("doctor======="+doctorId)
  370. // let doctorMDTClient = clientCache.findByIdAndType("pcim_"+doctorId,SOCKET_TYPES.PCIM_DOCTOR);
  371. let doctorSYSTEMClient = clientCache.findByIdAndType("pc_system_"+doctorId,SOCKET_TYPES.PC_DOCTOR_SYSTEM);
  372. let doctorAPPSYSTEMClient = clientCache.findByIdAndType("doctor_system_"+doctorId,SOCKET_TYPES.DOCTOR_SYSTEM);
  373. //外层
  374. if(!doctorSYSTEMClient){
  375. log.warn("target system doctor is not online!");
  376. }else{
  377. doctorSYSTEMClient.socket.emit('message', {
  378. id: message.id,
  379. session_id: 'system',
  380. sender_id: message.sender_id,
  381. sender_name: message.sender_name,
  382. content_type: 1,
  383. content: {"socket_sms_type":4},
  384. timestamp: ObjectUtil.timestampToLong(message.timestamp),
  385. type: message.content_type, // legacy support
  386. name: message.sender_name,
  387. patient_name:message.patient_name,
  388. patient_age:message.patient_age,
  389. patient_sex:message.patient_sex,
  390. extend:message.extend
  391. });
  392. }
  393. if(!doctorAPPSYSTEMClient){
  394. log.warn("target system app doctor is not online!");
  395. }else{
  396. doctorAPPSYSTEMClient.socket.emit('message', {
  397. id: message.id,
  398. session_id: 'system',
  399. sender_id: message.sender_id,
  400. sender_name: message.sender_name,
  401. content_type: 1,
  402. content: {"socket_sms_type":4},
  403. timestamp: ObjectUtil.timestampToLong(message.timestamp),
  404. type: message.content_type, // legacy support
  405. name: message.sender_name,
  406. patient_name:message.patient_name,
  407. patient_age:message.patient_age,
  408. patient_sex:message.patient_sex,
  409. extend:message.extend
  410. });
  411. //新增发送医生外层
  412. if(message.content_type == CONTENT_TYPES.VideoAnswerStatus ||
  413. message.content_type == CONTENT_TYPES.VideoAnswerAck){
  414. doctorAPPSYSTEMClient.socket.emit('message', {
  415. id: message.id,
  416. session_id: message.session_id,
  417. sender_id: message.sender_id,
  418. sender_name: message.sender_name,
  419. content_type: message.content_type,
  420. content: message.content,
  421. timestamp: ObjectUtil.timestampToLong(message.timestamp),
  422. type: message.content_type, // legacy support
  423. name: message.sender_name,
  424. patient_name:message.patient_name,
  425. patient_age:message.patient_age,
  426. patient_sex:message.patient_sex,
  427. extend:message.extend
  428. });
  429. }
  430. }
  431. }
  432. /**
  433. * 医疗云 医生外层新消息
  434. * @param doctorId
  435. * @param message
  436. * @param response
  437. */
  438. cloudSendMDTSocketMessageToDoctor(doctorId, message,handler) {
  439. log.info("doctor======="+doctorId)
  440. let self = this;
  441. // let doctorMDTClient = clientCache.findByIdAndType("pcim_"+doctorId,SOCKET_TYPES.PCIM_DOCTOR);
  442. let doctorSYSTEMClient = clientCache.findByIdAndType("pc_system_"+doctorId,SOCKET_TYPES.PC_DOCTOR_SYSTEM);
  443. let doctorAPPSYSTEMClient = clientCache.findByIdAndType("doctor_system_"+doctorId,SOCKET_TYPES.DOCTOR_SYSTEM);
  444. if(!doctorSYSTEMClient&&!doctorAPPSYSTEMClient){
  445. log.warn("target system doctor is not online!");
  446. ModelUtil.emitOK(self.eventEmitter, {status: 1,message:"doctor_not_online"});
  447. return;
  448. }
  449. //外层
  450. if(!doctorSYSTEMClient){
  451. log.warn("target system doctor is not online!");
  452. }else{
  453. if (message.content_type==CONTENT_TYPES.emergencyAssistance) {
  454. doctorSYSTEMClient.socket.emit('message', {
  455. session_id: message.session_id,
  456. sender_name: message.sender_name,
  457. content_notice: message.content_notice,
  458. sender_code: message.sender_code,
  459. OrderType: message.OrderType, //20紧急救助工单21上门预约工单22安防警报工单
  460. order_id: message.order_id,
  461. type: message.content_type,
  462. extend: message.extend
  463. });
  464. }else {
  465. doctorSYSTEMClient.socket.emit('message', {
  466. id: message.id,
  467. session_id: 'system',
  468. sender_id: message.sender_id,
  469. sender_name: message.sender_name,
  470. content_type: 1,
  471. content: {"socket_sms_type":4},
  472. timestamp: ObjectUtil.timestampToLong(message.timestamp),
  473. type: message.content_type, // legacy support
  474. name: message.sender_name,
  475. patient_name:message.patient_name,
  476. patient_age:message.patient_age,
  477. patient_sex:message.patient_sex,
  478. extend:message.extend
  479. });
  480. }
  481. }
  482. if(!doctorAPPSYSTEMClient){
  483. log.warn("target system app doctor is not online!");
  484. }else{
  485. if (message.content_type+""==CONTENT_TYPES.emergencyAssistance) {
  486. doctorAPPSYSTEMClient.socket.emit('message', {
  487. session_id: message.session_id,
  488. sender_name: message.sender_name,
  489. content_notice: message.content_notice,
  490. sender_code: message.sender_code,
  491. OrderType: message.OrderType,
  492. order_id: message.order_id,
  493. type: message.content_type,
  494. extend: message.extend
  495. });
  496. }else {
  497. doctorAPPSYSTEMClient.socket.emit('message', {
  498. id: message.id,
  499. session_id: 'system',
  500. sender_id: message.sender_id,
  501. sender_name: message.sender_name,
  502. content_type: 1,
  503. content: {"socket_sms_type":4},
  504. timestamp: ObjectUtil.timestampToLong(message.timestamp),
  505. type: message.content_type, // legacy support
  506. name: message.sender_name,
  507. patient_name:message.patient_name,
  508. patient_age:message.patient_age,
  509. patient_sex:message.patient_sex,
  510. extend:message.extend
  511. });
  512. }
  513. }
  514. ModelUtil.emitOK(self.eventEmitter, {status: 200});
  515. return;
  516. }
  517. /**
  518. * 医疗云 PC管理端发送socket
  519. * @param doctorId
  520. * @param message
  521. * @param response
  522. */
  523. CloudCarePcManageMessageToPc(clientType,message,handler) {
  524. let self = this;
  525. let CloudCarePcManageClients = clientCache.findByType(clientType);
  526. if(CloudCarePcManageClients.size==0){
  527. log.warn("target pcManage is not online!");
  528. ModelUtil.emitOK(self.eventEmitter, {status: 1,message:"pcManage_not_online"});
  529. return;
  530. }else {
  531. for (let clientKye of CloudCarePcManageClients.keys()){
  532. let CloudCarePcManageClient = CloudCarePcManageClients.get(clientKye);
  533. if (CloudCarePcManageClient){
  534. if (message.content_type==CONTENT_TYPES.emergencyAssistance) {
  535. CloudCarePcManageClient.socket.emit('message', {
  536. session_id: message.session_id,
  537. sender_name: message.sender_name,
  538. content_notice: message.content_notice,
  539. OrderStatus:message.OrderStatus,
  540. sender_code: message.sender_code,
  541. OrderType: message.OrderType, //20紧急救助工单21上门预约工单22安防警报工单
  542. order_id: message.order_id,
  543. type: message.content_type,
  544. latLon: message.latLon,
  545. categoryCode: message.categoryCode,
  546. orgType: message.orgType,
  547. contactStatus: message.contactStatus,
  548. serverDesc:message.serverDesc,
  549. residentialArea:message.residentialArea,
  550. extend: message.extend
  551. });
  552. }
  553. }
  554. }
  555. }
  556. ModelUtil.emitOK(self.eventEmitter, {status: 200});
  557. return;
  558. }
  559. /**
  560. * 医疗云 居民端发送socket
  561. * @param doctorId
  562. * @param message
  563. * @param response
  564. */
  565. CloudPatientSystemMessage(patient,message,handler) {
  566. let self = this;
  567. let patientSYSTEMClient = clientCache.findByIdAndType("patient_system_"+patient,SOCKET_TYPES.PATIENT_SYSTEM);
  568. if(!patientSYSTEMClient){
  569. log.warn("target pcManage is not online!");
  570. ModelUtil.emitOK(self.eventEmitter, {status: 1,message:"pcManage_not_online"});
  571. return;
  572. }else {
  573. if (message.content_type+""==CONTENT_TYPES.BirthdayToPatientAssistance) {//人文关怀(生日祝福)
  574. patientSYSTEMClient.socket.emit('message', {
  575. title:message.title,
  576. code:message.code,
  577. content: message.content,
  578. relation_code:message.relation_code,
  579. type: message.content_type,
  580. extend: message.extend
  581. });
  582. }
  583. if (message.content_type+""==CONTENT_TYPES.HealthIndexToPatientAssistance) {//体征设备上传
  584. patientSYSTEMClient.socket.emit('message', {
  585. title:message.title,
  586. code:message.code,
  587. content: message.content,//体征数据
  588. relation_code:message.relation_code,
  589. type: message.content_type,
  590. content_notice:message.content_notice,
  591. extend: message.extend
  592. });
  593. }
  594. if(message.content_type+""==CONTENT_TYPES.SystemMessagePushAssistance){
  595. patientSYSTEMClient.socket.emit('message',{
  596. title:message.title,
  597. type:message.type,
  598. content: message.content,
  599. content_tyep:message.content_type,
  600. audioUrl: message.audioUrl,
  601. extend: message.extend
  602. });
  603. }
  604. }
  605. ModelUtil.emitOK(self.eventEmitter, {status: 200});
  606. return;
  607. }
  608. static sendPcImSocket(targetId, message, sessionType) {
  609. if (message.content_type == CONTENT_TYPES.PlainText ||
  610. message.content_type == CONTENT_TYPES.Image ||
  611. message.content_type == CONTENT_TYPES.Audio||
  612. message.content_type == CONTENT_TYPES.Video||
  613. message.content_type == CONTENT_TYPES.GoTo||
  614. sessionType==SESSION_TYPES.SYSTEM) {
  615. let pcim_doctorClient = clientCache.findByIdAndType("pcim_"+targetId,SOCKET_TYPES.PCIM_DOCTOR);
  616. if(pcim_doctorClient) {
  617. let customData = {
  618. session_id: message.session_id||'',
  619. session_type: sessionType,
  620. from: message.sender_id|| '',
  621. data: message.content,
  622. business_type: message.business_type || 1
  623. };
  624. pcim_doctorClient.socket.emit('message', {
  625. session_id: message.session_id||'',
  626. session_type: sessionType,
  627. from: message.sender_id|| '',
  628. data: message.content,
  629. business_type: message.business_type || 1,
  630. sender_name: message.sender_name,
  631. content_type: message.content_type,
  632. content: message.content,
  633. timestamp: ObjectUtil.timestampToLong(message.timestamp),
  634. type: message.content_type, // legacy support
  635. name: message.sender_name,
  636. patient_name:message.patient_name,
  637. patient_age:message.patient_age,
  638. patient_sex:message.patient_sex,
  639. extend:message.extend
  640. });
  641. }
  642. }
  643. }
  644. /**
  645. * 发送socket给居民
  646. * @param patientId
  647. * @param message
  648. */
  649. static sendSocketMessageToPatient(patientId, message) {
  650. let patientClient = clientCache.findByIdAndType(patientId,SOCKET_TYPES.PATIENT);
  651. let pc_patientClient = clientCache.findByIdAndType("pcpatient_"+patientId,SOCKET_TYPES.PC_PATIENT);
  652. if(!patientClient&&!pc_patientClient){
  653. log.warn("target patient is not online!");
  654. return;
  655. }
  656. // let sendClient = clientCache.findByIdAndType(message.sender_id,SOCKET_TYPES.DOCTOR);//app医生发送的消息
  657. // if(!sendClient){//pc医生发送的消息
  658. // sendClient = clientCache.findByIdAndType("pc_"+message.sender_id,SOCKET_TYPES.PC_DOCTOR);
  659. // }
  660. // if(!sendClient){//居民发送的消息
  661. // sendClient = clientCache.findByIdAndType(message.sender_id,SOCKET_TYPES.PATIENT);
  662. // }
  663. var count = 0;
  664. if(patientClient&&message.session_id==patientClient.sessionId){
  665. WechatClient.updateParticipantLastFetchTime(patientClient.sessionId, patientId, ObjectUtil.timestampToLong(message.timestamp));
  666. patientClient.socket.emit('message', {
  667. id: message.id,
  668. session_id: message.session_id,
  669. sender_id: message.sender_id,
  670. sender_name: message.sender_name,
  671. content_type: message.content_type,
  672. content: message.content,
  673. timestamp: ObjectUtil.timestampToLong(message.timestamp),
  674. type: message.content_type, // legacy support
  675. name: message.sender_name,
  676. extend:message.extend
  677. });
  678. }else{
  679. count++;
  680. }
  681. //发送pc端
  682. if(pc_patientClient&&message.session_id==pc_patientClient.sessionId){
  683. WechatClient.updateParticipantLastFetchTime(pc_patientClient.sessionId, patientId, ObjectUtil.timestampToLong(message.timestamp));
  684. pc_patientClient.socket.emit('message', {
  685. id: message.id,
  686. session_id: message.session_id,
  687. sender_id: message.sender_id,
  688. sender_name: message.sender_name,
  689. content_type: message.content_type,
  690. content: message.content,
  691. timestamp: ObjectUtil.timestampToLong(message.timestamp),
  692. type: message.content_type, // legacy support
  693. name: message.sender_name,
  694. extend:message.extend
  695. });
  696. }else{
  697. count++;
  698. }
  699. if(count==2){
  700. log.warn("patient is not in the same session or is not online");
  701. }
  702. }
  703. //推送居民、居民PC、医生、医生PC外层推送
  704. static sendSystemSocketMessage(targetUserId, message) {
  705. //居民外层消息推送
  706. let patientClient = clientCache.findByIdAndType("patient_system_"+targetUserId,SOCKET_TYPES.PATIENT_SYSTEM);
  707. let pc_patientClient = clientCache.findByIdAndType("pcpatient_system_"+targetUserId,SOCKET_TYPES.PC_PATIENT_SYSTEM);
  708. if(!patientClient&&!pc_patientClient){
  709. log.warn("target patient systemt is not online!");
  710. // return;
  711. }
  712. var patientcount = 0;
  713. if(patientClient&&message.session_id==patientClient.sessionId){
  714. WechatClient.updateParticipantLastFetchTime(patientClient.sessionId, targetUserId, ObjectUtil.timestampToLong(message.timestamp));
  715. patientClient.socket.emit('message', {
  716. id: message.id,
  717. session_id: message.session_id,
  718. sender_id: message.sender_id,
  719. sender_name: message.sender_name,
  720. content_type: message.content_type,
  721. content: message.content,
  722. timestamp: ObjectUtil.timestampToLong(message.timestamp),
  723. type: message.content_type, // legacy support
  724. name: message.sender_name,
  725. extend:message.extend
  726. });
  727. }else{
  728. patientcount++;
  729. }
  730. //发送pc端
  731. if(pc_patientClient&&message.session_id==pc_patientClient.sessionId){
  732. WechatClient.updateParticipantLastFetchTime(pc_patientClient.sessionId, targetUserId, ObjectUtil.timestampToLong(message.timestamp));
  733. pc_patientClient.socket.emit('message', {
  734. id: message.id,
  735. session_id: message.session_id,
  736. sender_id: message.sender_id,
  737. sender_name: message.sender_name,
  738. content_type: message.content_type,
  739. content: message.content,
  740. timestamp: ObjectUtil.timestampToLong(message.timestamp),
  741. type: message.content_type, // legacy support
  742. name: message.sender_name,
  743. extend:message.extend
  744. });
  745. }else{
  746. patientcount++;
  747. }
  748. if(patientcount==2){
  749. log.warn("patient system is not in the same session or is not online");
  750. }
  751. //医生外层消息推送
  752. let doctorClient = clientCache.findByIdAndType("doctor_system_"+targetUserId,SOCKET_TYPES.DOCTOR_SYSTEM);
  753. let pc_doctorClient = clientCache.findByIdAndType("pc_system_"+targetUserId,SOCKET_TYPES.PC_DOCTOR_SYSTEM);
  754. if(!doctorClient&&!pc_doctorClient){
  755. log.warn("target doctor system is not online!");
  756. // return;
  757. }
  758. var doctorcount = 0;
  759. if(doctorClient&&message.session_id==doctorClient.sessionId){
  760. WechatClient.updateParticipantLastFetchTime(doctorClient.sessionId, targetUserId, ObjectUtil.timestampToLong(message.timestamp));
  761. doctorClient.socket.emit('message', {
  762. id: message.id,
  763. session_id: message.session_id,
  764. sender_id: message.sender_id,
  765. sender_name: message.sender_name,
  766. content_type: message.content_type,
  767. content: message.content,
  768. timestamp: ObjectUtil.timestampToLong(message.timestamp),
  769. type: message.content_type, // legacy support
  770. name: message.sender_name,
  771. extend:message.extend
  772. });
  773. }else{
  774. doctorcount++;
  775. }
  776. //发送pc端 - PC端消息不做sessionid的判断,前端自己判断消息归属于哪个会话,自行渲染--20191012-huangwenjie
  777. // if(pc_doctorClient&&message.session_id==pc_doctorClient.sessionId){
  778. if(pc_doctorClient){
  779. WechatClient.updateParticipantLastFetchTime(pc_doctorClient.sessionId, targetUserId, ObjectUtil.timestampToLong(message.timestamp));
  780. pc_doctorClient.socket.emit('message', {
  781. id: message.id,
  782. session_id: message.session_id,
  783. sender_id: message.sender_id,
  784. sender_name: message.sender_name,
  785. content_type: message.content_type,
  786. content: message.content,
  787. timestamp: ObjectUtil.timestampToLong(message.timestamp),
  788. type: message.content_type, // legacy support
  789. name: message.sender_name,
  790. extend:message.extend
  791. });
  792. }else{
  793. doctorcount++;
  794. }
  795. if(doctorcount==2){
  796. log.warn("doctor system is not in the same session or is not online");
  797. }
  798. }
  799. //推送托盘消息
  800. static sendMDTSystemSocketMessage(targetUserId, message) {
  801. //居民外层消息推送
  802. let mdtDcotorClient = clientCache.findByIdAndType("pcim_"+targetUserId,SOCKET_TYPES.PCIM_DOCTOR);
  803. if(!mdtDcotorClient){
  804. log.warn("target mdt doctor is not online!");
  805. }
  806. var mdtDoctorCount = 0;
  807. if(mdtDcotorClient&&message.session_id==mdtDcotorClient.sessionId){
  808. WechatClient.updateParticipantLastFetchTime(mdtDcotorClient.sessionId, targetUserId, ObjectUtil.timestampToLong(message.timestamp));
  809. mdtDcotorClient.socket.emit('message', {
  810. id: message.id,
  811. session_id: message.session_id,
  812. sender_id: message.sender_id,
  813. sender_name: message.sender_name,
  814. content_type: message.content_type,
  815. content: message.content,
  816. timestamp: ObjectUtil.timestampToLong(message.timestamp),
  817. type: message.content_type, // legacy support
  818. name: message.sender_name,
  819. extend:message.extend
  820. });
  821. }else{
  822. mdtDoctorCount++;
  823. }
  824. if(mdtDoctorCount==2){
  825. log.warn("doctor system is not in the same session or is not online");
  826. }
  827. }
  828. /**
  829. *
  830. * 发送微信模板消息给居民
  831. *
  832. * @param targetUserId
  833. * @param message
  834. */
  835. static sendViaMessageTemplate(targetUserId, targetUserName, message) {
  836. async.waterfall([
  837. // 获取微信openid
  838. function (callback) {
  839. PatientRepo.findWechatOpenIds(targetUserId, function (err, res) {
  840. if (err) {
  841. ModelUtil.logError("Get wechat openid failed", err);
  842. return;
  843. }
  844. var map = new Map();
  845. res.forEach(function (participant) {
  846. let openid = participant.openid;
  847. if (targetUserId==participant.code) {
  848. if (!openid) {
  849. ModelUtil.logError("User haven't bound with wechat, user id: " + targetUserId);
  850. }
  851. map.set("openid",participant);
  852. }else {
  853. if(!map.has(openid)){
  854. map.set(openid,participant);
  855. }
  856. }
  857. })
  858. //
  859. // let openid = result && result.length > 0 ? result[0].openid : null;
  860. // if (!openid) {
  861. // ModelUtil.logError("User haven't bound with wechat, user id: " + targetUserId);
  862. // return;
  863. // }
  864. //
  865. // log.warn("Send via wechat message template, user id: " + targetUserId + ", openid: " + openid);
  866. callback(null, map);
  867. });
  868. },
  869. // 获取议题信息
  870. function (map, callback) {
  871. TopicRepo.findLastTopicStatusAndType(message.session_id, function (err, res) {
  872. if (err) {
  873. ModelUtil.logError("Get topic failed", err);
  874. return;
  875. }
  876. if (!res || res.length == 0) {
  877. ModelUtil.logError("Unable to find session last topic");
  878. return;
  879. }
  880. callback(null, map, message.sender_name, res[0]);
  881. });
  882. },
  883. // 发送消息
  884. function (map, senderName, topic,callback) {
  885. let replyContent = message.content;
  886. switch (Number.parseInt(message.content_type)) {
  887. case CONTENT_TYPES.Image:
  888. replyContent = "[图片]";
  889. break;
  890. case CONTENT_TYPES.Audio:
  891. replyContent = "[语音]";
  892. break;
  893. default:
  894. break;
  895. }
  896. var patient = map.get("openid");
  897. map.delete("openid");
  898. let agent = topic.agent;
  899. let consultTitle = null;
  900. let description = null;
  901. let url = config.wechatConfig.baseUrl;
  902. switch (topic.type) {
  903. case 8:
  904. consultTitle = "续方";
  905. description = "续方咨询";
  906. url = url + "/wx/html/yszx/html/prescription-consulting.html";
  907. case 11:
  908. consultTitle = "上门服务";
  909. description = "上门服务咨询";
  910. url = url + "wx/html/appoint_service/html/appoint-serviceDetail.html";
  911. default:
  912. consultTitle = "健康";
  913. description = topic.description;
  914. url = url + "/wx/html/yszx/html/consulting-doctor.html";
  915. }
  916. if(agent){//代理人发起的议题
  917. var agentOpenid = "";
  918. if(map.size>0){
  919. for(var key of map.keys()){
  920. var member = map.get(key);
  921. if(agent == member.code){
  922. agentOpenid = key;
  923. var openid = key;
  924. var first = "您的家人("+patient.name+")的"+consultTitle+"咨询有新的回复";
  925. // 发送模板消息
  926. WechatSDK.sendTemplateMessage({
  927. touser: openid,
  928. name: member.name,
  929. patient: member.code,
  930. template_id: config.wechatConfig.template.consultTemplate,
  931. url: url + "?openid=" + openid + "&type="+topic.type+"&doctor="+message.sender_id+
  932. "&consult=" + topic.id + "&toUser=" + member.code + "&toName=" + member.name+"&represented="+patient.code,
  933. data: {
  934. first: {value: first, color: "#000000"}
  935. , remark: {value: "", color: "#000000"}
  936. , keyword1: {value: description, color: "#000000"}
  937. , keyword2: {value: replyContent, color: "#000000"}
  938. , keyword3: {value: senderName, color: "#000000"}
  939. }
  940. }, function (err, res) {
  941. err ? log.error(err) : log.info(res);
  942. });
  943. }
  944. }
  945. }
  946. if(patient.openid&&patient.openid!=agentOpenid){
  947. var first = "您的"+consultTitle+"咨询有新的回复";
  948. // 发送模板消息
  949. WechatSDK.sendTemplateMessage({
  950. touser: patient.openid,
  951. name: targetUserName,
  952. patient: targetUserId,
  953. template_id: config.wechatConfig.template.consultTemplate,
  954. url: url + "?openid=" + patient.openid +"&type="+topic.type+"&doctor="+message.sender_id+
  955. "&consult=" + topic.id + "&toUser=" + targetUserId + "&toName=" + targetUserName+"&represented="+patient.code,
  956. data: {
  957. first: {value: first, color: "#000000"}
  958. , remark: {value: "", color: "#000000"}
  959. , keyword1: {value: description, color: "#000000"}
  960. , keyword2: {value: replyContent, color: "#000000"}
  961. , keyword3: {value: senderName, color: "#000000"}
  962. }
  963. }, function (err, res) {
  964. err ? log.error(err) : log.info(res);
  965. });
  966. }
  967. }else {//自己发起的议题
  968. // 发送模板消息
  969. if(patient.openid){
  970. WechatSDK.sendTemplateMessage({
  971. touser: patient.openid,
  972. name: targetUserName,
  973. patient: targetUserId,
  974. template_id: config.wechatConfig.template.consultTemplate,
  975. url: url + "?openid=" + patient.openid +"&type="+topic.type+"&doctor="+message.sender_id+
  976. "&consult=" + topic.id + "&toUser=" + targetUserId + "&toName=" + targetUserName+"&represented="+patient.code,
  977. data: {
  978. first: {value: "您的"+consultTitle+"咨询有新的回复", color: "#000000"}
  979. , remark: {value: "", color: "#000000"}
  980. , keyword1: {value: description, color: "#000000"}
  981. , keyword2: {value: replyContent, color: "#000000"}
  982. , keyword3: {value: senderName, color: "#000000"}
  983. }
  984. }, function (err, res) {
  985. err ? log.error(err) : log.info(res);
  986. });
  987. }
  988. if(map.size>0){
  989. for(var key of map.keys()){
  990. if(!patient.openid||key!=patient.openid){
  991. var member = map.get(key);
  992. var openid = key;
  993. var first = "您的家人("+patient.name+")的"+consultTitle+"咨询有新的回复";
  994. // 发送模板消息
  995. WechatSDK.sendTemplateMessage({
  996. touser: openid,
  997. name: member.name,
  998. patient: member.code,
  999. template_id: config.wechatConfig.template.consultTemplate,
  1000. url: url + "?openid=" + openid +"&type="+topic.type+"&doctor="+message.sender_id+
  1001. "&consult=" + topic.id + "&toUser=" + member.code + "&toName=" + member.name+"&represented="+patient.code,
  1002. data: {
  1003. first: {value: first, color: "#000000"}
  1004. , remark: {value: "", color: "#000000"}
  1005. , keyword1: {value: description, color: "#000000"}
  1006. , keyword2: {value: replyContent, color: "#000000"}
  1007. , keyword3: {value: senderName, color: "#000000"}
  1008. }
  1009. }, function (err, res) {
  1010. err ? log.error(err) : log.info(res);
  1011. });
  1012. }
  1013. }
  1014. }
  1015. }
  1016. callback(null, null);
  1017. }
  1018. ],
  1019. function (err, res) {
  1020. if (!err) {
  1021. log.info("Send via wechat template message, DONE!");
  1022. }
  1023. });
  1024. };
  1025. static updateParticipantLastFetchTime(sessionId, userId, score) {
  1026. score = score + 1000;
  1027. let participantsKey = RedisModel.makeRedisKey(REDIS_KEYS.SessionParticipants, sessionId);
  1028. redisConn.zaddAsync(participantsKey, score, userId)
  1029. .then(function (res) {
  1030. ParticipantRepo.updateLastFetchTime(new Date(score), sessionId, userId, function (err, res) {
  1031. if (err) {
  1032. log.error("Update participant last fetch time failed: ", err);
  1033. }
  1034. });
  1035. })
  1036. .catch(function (err) {
  1037. log.error("Update participant last fetch time failed: ", err);
  1038. });
  1039. };
  1040. /**
  1041. * 发送第三方接口的微信模版消息
  1042. * @param targetUserId
  1043. * @param message
  1044. */
  1045. static sendThirdMessageTemplate(targetUserId, targetUserName, message) {
  1046. async.waterfall([
  1047. // 获取微信openid
  1048. function (callback) {
  1049. PatientRepo.findOne(targetUserId, function (err, res) {
  1050. if (err) {
  1051. ModelUtil.logError("Get wechat openid failed", err);
  1052. return;
  1053. }
  1054. var map = new Map();
  1055. res.forEach(function (participant) {
  1056. let openid = participant.openid;
  1057. let idcard = participant.idcard;
  1058. let mobile = participant.mobile;
  1059. let name = participant.name;
  1060. let id = participant.id;
  1061. map.set("openid",openid);
  1062. map.set("idcard",idcard);
  1063. map.set("mobile",mobile);
  1064. map.set("name",name);
  1065. map.set("id",id);
  1066. })
  1067. //
  1068. // let openid = result && result.length > 0 ? result[0].openid : null;
  1069. // if (!openid) {
  1070. // ModelUtil.logError("User haven't bound with wechat, user id: " + targetUserId);
  1071. // return;
  1072. // }
  1073. //
  1074. // log.warn("Send via wechat message template, user id: " + targetUserId + ", openid: " + openid);
  1075. callback(null, map);
  1076. });
  1077. },
  1078. // 获取议题信息
  1079. function (map, callback) {
  1080. TopicRepo.findLastTopicStatusAndType(message.session_id, function (err, res) {
  1081. if (err) {
  1082. ModelUtil.logError("Get topic failed", err);
  1083. return;
  1084. }
  1085. if (!res || res.length == 0) {
  1086. ModelUtil.logError("Unable to find session last topic");
  1087. return;
  1088. }
  1089. callback(null, map, message.sender_name, res[0]);
  1090. });
  1091. },
  1092. // 发送消息
  1093. function (map, senderName, topic,callback) {
  1094. let replyContent = message.content;
  1095. switch (Number.parseInt(message.content_type)) {
  1096. case CONTENT_TYPES.Image:
  1097. replyContent = "[图片]";
  1098. break;
  1099. case CONTENT_TYPES.Audio:
  1100. replyContent = "[语音]";
  1101. break;
  1102. case CONTENT_TYPES.ConsultSuggest:
  1103. var tmpContent = JSON.parse(message.content);
  1104. var arr = [], consultAdvice = "";
  1105. log.error("tmpContent1:"+tmpContent);
  1106. tmpContent.forEach(function (v) {
  1107. if(v.advice_type==1){
  1108. arr.push(v.advice_value);
  1109. } else {
  1110. consultAdvice = v.advice_value;
  1111. }
  1112. });
  1113. log.error("tmpContent2:"+arr);
  1114. replyContent = "参考疾病:"+arr.join("、")+"\r\n"+"咨询建议:"+consultAdvice;
  1115. log.error("replyContent:"+replyContent);
  1116. break;
  1117. default:
  1118. break;
  1119. }
  1120. let consultTitle = null;
  1121. let description = null;
  1122. let url = null;
  1123. switch (topic.type) {
  1124. case 8:
  1125. consultTitle = "续方";
  1126. description = "续方咨询";
  1127. url = url + "/wx/html/yszx/html/prescription-consulting.html";
  1128. case 11:
  1129. consultTitle = "上门服务";
  1130. description = "上门服务咨询";
  1131. url = url + "wx/html/appoint_service/html/appoint-serviceDetail.html";
  1132. default:
  1133. consultTitle = "咨询回复提醒";
  1134. description = topic.description;
  1135. if("xmijk" == config.imClientType.id){
  1136. url = "https://zb.xmtyw.cn/ims-wx/index.html#/chatRoom?type=1&consultCode="+topic.id;
  1137. }else if("zsyy" == config.imClientType.id){
  1138. url = "https://hlwyy.xmzsh.com/ims-wx/index.html#/chatRoom?type=1&consultCode="+topic.id;
  1139. }else if("xm_xzzx_wx" == config.imClientType.id){
  1140. url = "https://ih.xmheart.com/hlwyy/ims-wx/index.html#/chatRoom?type=1&consultCode="+topic.id;
  1141. }else if("sd_tnzyy_wx" == config.imClientType.id){
  1142. url = "https://zyy.jkta.com.cn/ims-wx/index.html#/chatRoom?type=1&consultCode="+topic.id;
  1143. }else if("hz_yyyzh_wx" == config.imClientType.id){
  1144. url = "http://hzijk.cityihealth.com?type=1&consultCode="+topic.id;
  1145. }else{
  1146. }
  1147. }
  1148. log.info("内容类型"+message.content_type);
  1149. log.info("内容"+message.content);
  1150. //1、2、3、18、19、12、34
  1151. // 发送模板消息
  1152. if(map != null && (message.content_type==CONTENT_TYPES.PlainText||
  1153. message.content_type==CONTENT_TYPES.Image||
  1154. message.content_type==CONTENT_TYPES.Audio||
  1155. message.content_type==CONTENT_TYPES.Video||
  1156. message.content_type==CONTENT_TYPES.PersonalCard||
  1157. message.content_type==CONTENT_TYPES.MessageForward||
  1158. message.content_type==CONTENT_TYPES.PrescriptionSuggest||
  1159. message.content_type==CONTENT_TYPES.ConsultSuggest||
  1160. message.content_type==CONTENT_TYPES.Article||
  1161. message.content_type==CONTENT_TYPES.surveyMessage||message.content_type==CONTENT_TYPES.EmergencyAssistanceMessage)){
  1162. log.info("内容类型122:"+message.content_type);
  1163. let userName = map.get("name");
  1164. let idCard = map.get("idcard");
  1165. let phone = map.get("mobile");
  1166. let title = consultTitle;
  1167. let content = "您的咨询有新的回复";
  1168. let contentString = replyContent;
  1169. let topidId = topic.id;
  1170. let sessionId = message.session_id;
  1171. // log.info("推送居民公众号:params:"+params)
  1172. let params = 'senderName='+encodeURIComponent(senderName)+'&userName='+encodeURIComponent(userName)+'&idCard='+idCard
  1173. +"&phone="+phone+'&title='+encodeURIComponent(consultTitle)+'&content='+encodeURIComponent(content)
  1174. +'&contentString='+encodeURIComponent(contentString)+'&url='+encodeURIComponent(url)
  1175. +'&topidId='+encodeURIComponent(topidId)+'&sessionId='+encodeURIComponent(sessionId);
  1176. HlwyyWechatAssistantSDK.request(userName,idCard,phone,title,content,contentString,url,params, function (err, res) {
  1177. // WlyyAssistantSDK.request('admin', '0a5c5258-8863-4b07-a3f9-88c768528ab4', '', 'admin_imei', '/doctor/feldsher/sendDoctorTemplate', param, function (err, res) {
  1178. // WlyySDK.request('admin', '0a5c5258-8863-4b07-a3f9-88c768528ab4', '', 'admin_imei', '/doctor/feldsher/sendDoctorTemplate?' + params, 'GET', function (err, res) {
  1179. if(err){
  1180. log.error(err);
  1181. }else {
  1182. log.info(res);
  1183. }
  1184. });
  1185. }
  1186. callback(null, null);
  1187. }
  1188. ],
  1189. function (err, res) {
  1190. if (!err) {
  1191. log.info("Send via wechat template message, DONE!");
  1192. }
  1193. });
  1194. };
  1195. }
  1196. module.exports = WechatClient;