wechat.client.js 61 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322
  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. audioUrl: message.audioUrl,
  581. extend: message.extend
  582. });
  583. }
  584. if (message.content_type+""==CONTENT_TYPES.HealthIndexToPatientAssistance) {//体征设备上传
  585. patientSYSTEMClient.socket.emit('message', {
  586. title:message.title,
  587. code:message.code,
  588. content: message.content,//体征数据
  589. relation_code:message.relation_code,
  590. type: message.content_type,
  591. content_notice:message.content_notice,
  592. audioUrl: message.audioUrl,
  593. extend: message.extend
  594. });
  595. }
  596. if(message.content_type+""==CONTENT_TYPES.SystemMessagePushAssistance){//系统消息推送
  597. patientSYSTEMClient.socket.emit('message',{
  598. title:message.title,
  599. type:message.type,
  600. content: message.content,
  601. content_type:message.content_type,
  602. audioUrl: message.audioUrl,
  603. extend: message.extend
  604. });
  605. }
  606. if (message.content_type+""==CONTENT_TYPES.DeviceMessagePushAssistance){//设备消息推送
  607. patientSYSTEMClient.socket.emit('message',{
  608. title:message.title,
  609. deviceSn:message.deviceSn,
  610. type:message.type,
  611. content: message.content,
  612. content_type:message.content_type,
  613. audioUrl: message.audioUrl,
  614. extend: message.extend
  615. });
  616. }
  617. }
  618. ModelUtil.emitOK(self.eventEmitter, {status: 200});
  619. return;
  620. }
  621. static sendPcImSocket(targetId, message, sessionType) {
  622. if (message.content_type == CONTENT_TYPES.PlainText ||
  623. message.content_type == CONTENT_TYPES.Image ||
  624. message.content_type == CONTENT_TYPES.Audio||
  625. message.content_type == CONTENT_TYPES.Video||
  626. message.content_type == CONTENT_TYPES.GoTo||
  627. sessionType==SESSION_TYPES.SYSTEM) {
  628. let pcim_doctorClient = clientCache.findByIdAndType("pcim_"+targetId,SOCKET_TYPES.PCIM_DOCTOR);
  629. if(pcim_doctorClient) {
  630. let customData = {
  631. session_id: message.session_id||'',
  632. session_type: sessionType,
  633. from: message.sender_id|| '',
  634. data: message.content,
  635. business_type: message.business_type || 1
  636. };
  637. pcim_doctorClient.socket.emit('message', {
  638. session_id: message.session_id||'',
  639. session_type: sessionType,
  640. from: message.sender_id|| '',
  641. data: message.content,
  642. business_type: message.business_type || 1,
  643. sender_name: message.sender_name,
  644. content_type: message.content_type,
  645. content: message.content,
  646. timestamp: ObjectUtil.timestampToLong(message.timestamp),
  647. type: message.content_type, // legacy support
  648. name: message.sender_name,
  649. patient_name:message.patient_name,
  650. patient_age:message.patient_age,
  651. patient_sex:message.patient_sex,
  652. extend:message.extend
  653. });
  654. }
  655. }
  656. }
  657. /**
  658. * 发送socket给居民
  659. * @param patientId
  660. * @param message
  661. */
  662. static sendSocketMessageToPatient(patientId, message) {
  663. let patientClient = clientCache.findByIdAndType(patientId,SOCKET_TYPES.PATIENT);
  664. let pc_patientClient = clientCache.findByIdAndType("pcpatient_"+patientId,SOCKET_TYPES.PC_PATIENT);
  665. if(!patientClient&&!pc_patientClient){
  666. log.warn("target patient is not online!");
  667. return;
  668. }
  669. // let sendClient = clientCache.findByIdAndType(message.sender_id,SOCKET_TYPES.DOCTOR);//app医生发送的消息
  670. // if(!sendClient){//pc医生发送的消息
  671. // sendClient = clientCache.findByIdAndType("pc_"+message.sender_id,SOCKET_TYPES.PC_DOCTOR);
  672. // }
  673. // if(!sendClient){//居民发送的消息
  674. // sendClient = clientCache.findByIdAndType(message.sender_id,SOCKET_TYPES.PATIENT);
  675. // }
  676. var count = 0;
  677. if(patientClient&&message.session_id==patientClient.sessionId){
  678. WechatClient.updateParticipantLastFetchTime(patientClient.sessionId, patientId, ObjectUtil.timestampToLong(message.timestamp));
  679. patientClient.socket.emit('message', {
  680. id: message.id,
  681. session_id: message.session_id,
  682. sender_id: message.sender_id,
  683. sender_name: message.sender_name,
  684. content_type: message.content_type,
  685. content: message.content,
  686. timestamp: ObjectUtil.timestampToLong(message.timestamp),
  687. type: message.content_type, // legacy support
  688. name: message.sender_name,
  689. extend:message.extend
  690. });
  691. }else{
  692. count++;
  693. }
  694. //发送pc端
  695. if(pc_patientClient&&message.session_id==pc_patientClient.sessionId){
  696. WechatClient.updateParticipantLastFetchTime(pc_patientClient.sessionId, patientId, ObjectUtil.timestampToLong(message.timestamp));
  697. pc_patientClient.socket.emit('message', {
  698. id: message.id,
  699. session_id: message.session_id,
  700. sender_id: message.sender_id,
  701. sender_name: message.sender_name,
  702. content_type: message.content_type,
  703. content: message.content,
  704. timestamp: ObjectUtil.timestampToLong(message.timestamp),
  705. type: message.content_type, // legacy support
  706. name: message.sender_name,
  707. extend:message.extend
  708. });
  709. }else{
  710. count++;
  711. }
  712. if(count==2){
  713. log.warn("patient is not in the same session or is not online");
  714. }
  715. }
  716. //推送居民、居民PC、医生、医生PC外层推送
  717. static sendSystemSocketMessage(targetUserId, message) {
  718. //居民外层消息推送
  719. let patientClient = clientCache.findByIdAndType("patient_system_"+targetUserId,SOCKET_TYPES.PATIENT_SYSTEM);
  720. let pc_patientClient = clientCache.findByIdAndType("pcpatient_system_"+targetUserId,SOCKET_TYPES.PC_PATIENT_SYSTEM);
  721. if(!patientClient&&!pc_patientClient){
  722. log.warn("target patient systemt is not online!");
  723. // return;
  724. }
  725. var patientcount = 0;
  726. if(patientClient&&message.session_id==patientClient.sessionId){
  727. WechatClient.updateParticipantLastFetchTime(patientClient.sessionId, targetUserId, ObjectUtil.timestampToLong(message.timestamp));
  728. patientClient.socket.emit('message', {
  729. id: message.id,
  730. session_id: message.session_id,
  731. sender_id: message.sender_id,
  732. sender_name: message.sender_name,
  733. content_type: message.content_type,
  734. content: message.content,
  735. timestamp: ObjectUtil.timestampToLong(message.timestamp),
  736. type: message.content_type, // legacy support
  737. name: message.sender_name,
  738. extend:message.extend
  739. });
  740. }else{
  741. patientcount++;
  742. }
  743. //发送pc端
  744. if(pc_patientClient&&message.session_id==pc_patientClient.sessionId){
  745. WechatClient.updateParticipantLastFetchTime(pc_patientClient.sessionId, targetUserId, ObjectUtil.timestampToLong(message.timestamp));
  746. pc_patientClient.socket.emit('message', {
  747. id: message.id,
  748. session_id: message.session_id,
  749. sender_id: message.sender_id,
  750. sender_name: message.sender_name,
  751. content_type: message.content_type,
  752. content: message.content,
  753. timestamp: ObjectUtil.timestampToLong(message.timestamp),
  754. type: message.content_type, // legacy support
  755. name: message.sender_name,
  756. extend:message.extend
  757. });
  758. }else{
  759. patientcount++;
  760. }
  761. if(patientcount==2){
  762. log.warn("patient system is not in the same session or is not online");
  763. }
  764. //医生外层消息推送
  765. let doctorClient = clientCache.findByIdAndType("doctor_system_"+targetUserId,SOCKET_TYPES.DOCTOR_SYSTEM);
  766. let pc_doctorClient = clientCache.findByIdAndType("pc_system_"+targetUserId,SOCKET_TYPES.PC_DOCTOR_SYSTEM);
  767. if(!doctorClient&&!pc_doctorClient){
  768. log.warn("target doctor system is not online!");
  769. // return;
  770. }
  771. var doctorcount = 0;
  772. if(doctorClient&&message.session_id==doctorClient.sessionId){
  773. WechatClient.updateParticipantLastFetchTime(doctorClient.sessionId, targetUserId, ObjectUtil.timestampToLong(message.timestamp));
  774. doctorClient.socket.emit('message', {
  775. id: message.id,
  776. session_id: message.session_id,
  777. sender_id: message.sender_id,
  778. sender_name: message.sender_name,
  779. content_type: message.content_type,
  780. content: message.content,
  781. timestamp: ObjectUtil.timestampToLong(message.timestamp),
  782. type: message.content_type, // legacy support
  783. name: message.sender_name,
  784. extend:message.extend
  785. });
  786. }else{
  787. doctorcount++;
  788. }
  789. //发送pc端 - PC端消息不做sessionid的判断,前端自己判断消息归属于哪个会话,自行渲染--20191012-huangwenjie
  790. // if(pc_doctorClient&&message.session_id==pc_doctorClient.sessionId){
  791. if(pc_doctorClient){
  792. WechatClient.updateParticipantLastFetchTime(pc_doctorClient.sessionId, targetUserId, ObjectUtil.timestampToLong(message.timestamp));
  793. pc_doctorClient.socket.emit('message', {
  794. id: message.id,
  795. session_id: message.session_id,
  796. sender_id: message.sender_id,
  797. sender_name: message.sender_name,
  798. content_type: message.content_type,
  799. content: message.content,
  800. timestamp: ObjectUtil.timestampToLong(message.timestamp),
  801. type: message.content_type, // legacy support
  802. name: message.sender_name,
  803. extend:message.extend
  804. });
  805. }else{
  806. doctorcount++;
  807. }
  808. if(doctorcount==2){
  809. log.warn("doctor system is not in the same session or is not online");
  810. }
  811. }
  812. //推送托盘消息
  813. static sendMDTSystemSocketMessage(targetUserId, message) {
  814. //居民外层消息推送
  815. let mdtDcotorClient = clientCache.findByIdAndType("pcim_"+targetUserId,SOCKET_TYPES.PCIM_DOCTOR);
  816. if(!mdtDcotorClient){
  817. log.warn("target mdt doctor is not online!");
  818. }
  819. var mdtDoctorCount = 0;
  820. if(mdtDcotorClient&&message.session_id==mdtDcotorClient.sessionId){
  821. WechatClient.updateParticipantLastFetchTime(mdtDcotorClient.sessionId, targetUserId, ObjectUtil.timestampToLong(message.timestamp));
  822. mdtDcotorClient.socket.emit('message', {
  823. id: message.id,
  824. session_id: message.session_id,
  825. sender_id: message.sender_id,
  826. sender_name: message.sender_name,
  827. content_type: message.content_type,
  828. content: message.content,
  829. timestamp: ObjectUtil.timestampToLong(message.timestamp),
  830. type: message.content_type, // legacy support
  831. name: message.sender_name,
  832. extend:message.extend
  833. });
  834. }else{
  835. mdtDoctorCount++;
  836. }
  837. if(mdtDoctorCount==2){
  838. log.warn("doctor system is not in the same session or is not online");
  839. }
  840. }
  841. /**
  842. *
  843. * 发送微信模板消息给居民
  844. *
  845. * @param targetUserId
  846. * @param message
  847. */
  848. static sendViaMessageTemplate(targetUserId, targetUserName, message) {
  849. async.waterfall([
  850. // 获取微信openid
  851. function (callback) {
  852. PatientRepo.findWechatOpenIds(targetUserId, function (err, res) {
  853. if (err) {
  854. ModelUtil.logError("Get wechat openid failed", err);
  855. return;
  856. }
  857. var map = new Map();
  858. res.forEach(function (participant) {
  859. let openid = participant.openid;
  860. if (targetUserId==participant.code) {
  861. if (!openid) {
  862. ModelUtil.logError("User haven't bound with wechat, user id: " + targetUserId);
  863. }
  864. map.set("openid",participant);
  865. }else {
  866. if(!map.has(openid)){
  867. map.set(openid,participant);
  868. }
  869. }
  870. })
  871. //
  872. // let openid = result && result.length > 0 ? result[0].openid : null;
  873. // if (!openid) {
  874. // ModelUtil.logError("User haven't bound with wechat, user id: " + targetUserId);
  875. // return;
  876. // }
  877. //
  878. // log.warn("Send via wechat message template, user id: " + targetUserId + ", openid: " + openid);
  879. callback(null, map);
  880. });
  881. },
  882. // 获取议题信息
  883. function (map, callback) {
  884. TopicRepo.findLastTopicStatusAndType(message.session_id, function (err, res) {
  885. if (err) {
  886. ModelUtil.logError("Get topic failed", err);
  887. return;
  888. }
  889. if (!res || res.length == 0) {
  890. ModelUtil.logError("Unable to find session last topic");
  891. return;
  892. }
  893. callback(null, map, message.sender_name, res[0]);
  894. });
  895. },
  896. // 发送消息
  897. function (map, senderName, topic,callback) {
  898. let replyContent = message.content;
  899. switch (Number.parseInt(message.content_type)) {
  900. case CONTENT_TYPES.Image:
  901. replyContent = "[图片]";
  902. break;
  903. case CONTENT_TYPES.Audio:
  904. replyContent = "[语音]";
  905. break;
  906. default:
  907. break;
  908. }
  909. var patient = map.get("openid");
  910. map.delete("openid");
  911. let agent = topic.agent;
  912. let consultTitle = null;
  913. let description = null;
  914. let url = config.wechatConfig.baseUrl;
  915. switch (topic.type) {
  916. case 8:
  917. consultTitle = "续方";
  918. description = "续方咨询";
  919. url = url + "/wx/html/yszx/html/prescription-consulting.html";
  920. case 11:
  921. consultTitle = "上门服务";
  922. description = "上门服务咨询";
  923. url = url + "wx/html/appoint_service/html/appoint-serviceDetail.html";
  924. default:
  925. consultTitle = "健康";
  926. description = topic.description;
  927. url = url + "/wx/html/yszx/html/consulting-doctor.html";
  928. }
  929. if(agent){//代理人发起的议题
  930. var agentOpenid = "";
  931. if(map.size>0){
  932. for(var key of map.keys()){
  933. var member = map.get(key);
  934. if(agent == member.code){
  935. agentOpenid = key;
  936. var openid = key;
  937. var first = "您的家人("+patient.name+")的"+consultTitle+"咨询有新的回复";
  938. // 发送模板消息
  939. WechatSDK.sendTemplateMessage({
  940. touser: openid,
  941. name: member.name,
  942. patient: member.code,
  943. template_id: config.wechatConfig.template.consultTemplate,
  944. url: url + "?openid=" + openid + "&type="+topic.type+"&doctor="+message.sender_id+
  945. "&consult=" + topic.id + "&toUser=" + member.code + "&toName=" + member.name+"&represented="+patient.code,
  946. data: {
  947. first: {value: first, color: "#000000"}
  948. , remark: {value: "", color: "#000000"}
  949. , keyword1: {value: description, color: "#000000"}
  950. , keyword2: {value: replyContent, color: "#000000"}
  951. , keyword3: {value: senderName, color: "#000000"}
  952. }
  953. }, function (err, res) {
  954. err ? log.error(err) : log.info(res);
  955. });
  956. }
  957. }
  958. }
  959. if(patient.openid&&patient.openid!=agentOpenid){
  960. var first = "您的"+consultTitle+"咨询有新的回复";
  961. // 发送模板消息
  962. WechatSDK.sendTemplateMessage({
  963. touser: patient.openid,
  964. name: targetUserName,
  965. patient: targetUserId,
  966. template_id: config.wechatConfig.template.consultTemplate,
  967. url: url + "?openid=" + patient.openid +"&type="+topic.type+"&doctor="+message.sender_id+
  968. "&consult=" + topic.id + "&toUser=" + targetUserId + "&toName=" + targetUserName+"&represented="+patient.code,
  969. data: {
  970. first: {value: first, color: "#000000"}
  971. , remark: {value: "", color: "#000000"}
  972. , keyword1: {value: description, color: "#000000"}
  973. , keyword2: {value: replyContent, color: "#000000"}
  974. , keyword3: {value: senderName, color: "#000000"}
  975. }
  976. }, function (err, res) {
  977. err ? log.error(err) : log.info(res);
  978. });
  979. }
  980. }else {//自己发起的议题
  981. // 发送模板消息
  982. if(patient.openid){
  983. WechatSDK.sendTemplateMessage({
  984. touser: patient.openid,
  985. name: targetUserName,
  986. patient: targetUserId,
  987. template_id: config.wechatConfig.template.consultTemplate,
  988. url: url + "?openid=" + patient.openid +"&type="+topic.type+"&doctor="+message.sender_id+
  989. "&consult=" + topic.id + "&toUser=" + targetUserId + "&toName=" + targetUserName+"&represented="+patient.code,
  990. data: {
  991. first: {value: "您的"+consultTitle+"咨询有新的回复", color: "#000000"}
  992. , remark: {value: "", color: "#000000"}
  993. , keyword1: {value: description, color: "#000000"}
  994. , keyword2: {value: replyContent, color: "#000000"}
  995. , keyword3: {value: senderName, color: "#000000"}
  996. }
  997. }, function (err, res) {
  998. err ? log.error(err) : log.info(res);
  999. });
  1000. }
  1001. if(map.size>0){
  1002. for(var key of map.keys()){
  1003. if(!patient.openid||key!=patient.openid){
  1004. var member = map.get(key);
  1005. var openid = key;
  1006. var first = "您的家人("+patient.name+")的"+consultTitle+"咨询有新的回复";
  1007. // 发送模板消息
  1008. WechatSDK.sendTemplateMessage({
  1009. touser: openid,
  1010. name: member.name,
  1011. patient: member.code,
  1012. template_id: config.wechatConfig.template.consultTemplate,
  1013. url: url + "?openid=" + openid +"&type="+topic.type+"&doctor="+message.sender_id+
  1014. "&consult=" + topic.id + "&toUser=" + member.code + "&toName=" + member.name+"&represented="+patient.code,
  1015. data: {
  1016. first: {value: first, color: "#000000"}
  1017. , remark: {value: "", color: "#000000"}
  1018. , keyword1: {value: description, color: "#000000"}
  1019. , keyword2: {value: replyContent, color: "#000000"}
  1020. , keyword3: {value: senderName, color: "#000000"}
  1021. }
  1022. }, function (err, res) {
  1023. err ? log.error(err) : log.info(res);
  1024. });
  1025. }
  1026. }
  1027. }
  1028. }
  1029. callback(null, null);
  1030. }
  1031. ],
  1032. function (err, res) {
  1033. if (!err) {
  1034. log.info("Send via wechat template message, DONE!");
  1035. }
  1036. });
  1037. };
  1038. static updateParticipantLastFetchTime(sessionId, userId, score) {
  1039. score = score + 1000;
  1040. let participantsKey = RedisModel.makeRedisKey(REDIS_KEYS.SessionParticipants, sessionId);
  1041. redisConn.zaddAsync(participantsKey, score, userId)
  1042. .then(function (res) {
  1043. ParticipantRepo.updateLastFetchTime(new Date(score), sessionId, userId, function (err, res) {
  1044. if (err) {
  1045. log.error("Update participant last fetch time failed: ", err);
  1046. }
  1047. });
  1048. })
  1049. .catch(function (err) {
  1050. log.error("Update participant last fetch time failed: ", err);
  1051. });
  1052. };
  1053. /**
  1054. * 发送第三方接口的微信模版消息
  1055. * @param targetUserId
  1056. * @param message
  1057. */
  1058. static sendThirdMessageTemplate(targetUserId, targetUserName, message) {
  1059. async.waterfall([
  1060. // 获取微信openid
  1061. function (callback) {
  1062. PatientRepo.findOne(targetUserId, function (err, res) {
  1063. if (err) {
  1064. ModelUtil.logError("Get wechat openid failed", err);
  1065. return;
  1066. }
  1067. var map = new Map();
  1068. res.forEach(function (participant) {
  1069. let openid = participant.openid;
  1070. let idcard = participant.idcard;
  1071. let mobile = participant.mobile;
  1072. let name = participant.name;
  1073. let id = participant.id;
  1074. map.set("openid",openid);
  1075. map.set("idcard",idcard);
  1076. map.set("mobile",mobile);
  1077. map.set("name",name);
  1078. map.set("id",id);
  1079. })
  1080. //
  1081. // let openid = result && result.length > 0 ? result[0].openid : null;
  1082. // if (!openid) {
  1083. // ModelUtil.logError("User haven't bound with wechat, user id: " + targetUserId);
  1084. // return;
  1085. // }
  1086. //
  1087. // log.warn("Send via wechat message template, user id: " + targetUserId + ", openid: " + openid);
  1088. callback(null, map);
  1089. });
  1090. },
  1091. // 获取议题信息
  1092. function (map, callback) {
  1093. TopicRepo.findLastTopicStatusAndType(message.session_id, function (err, res) {
  1094. if (err) {
  1095. ModelUtil.logError("Get topic failed", err);
  1096. return;
  1097. }
  1098. if (!res || res.length == 0) {
  1099. ModelUtil.logError("Unable to find session last topic");
  1100. return;
  1101. }
  1102. callback(null, map, message.sender_name, res[0]);
  1103. });
  1104. },
  1105. // 发送消息
  1106. function (map, senderName, topic,callback) {
  1107. let replyContent = message.content;
  1108. switch (Number.parseInt(message.content_type)) {
  1109. case CONTENT_TYPES.Image:
  1110. replyContent = "[图片]";
  1111. break;
  1112. case CONTENT_TYPES.Audio:
  1113. replyContent = "[语音]";
  1114. break;
  1115. case CONTENT_TYPES.ConsultSuggest:
  1116. var tmpContent = JSON.parse(message.content);
  1117. var arr = [], consultAdvice = "";
  1118. log.error("tmpContent1:"+tmpContent);
  1119. tmpContent.forEach(function (v) {
  1120. if(v.advice_type==1){
  1121. arr.push(v.advice_value);
  1122. } else {
  1123. consultAdvice = v.advice_value;
  1124. }
  1125. });
  1126. log.error("tmpContent2:"+arr);
  1127. replyContent = "参考疾病:"+arr.join("、")+"\r\n"+"咨询建议:"+consultAdvice;
  1128. log.error("replyContent:"+replyContent);
  1129. break;
  1130. default:
  1131. break;
  1132. }
  1133. let consultTitle = null;
  1134. let description = null;
  1135. let url = null;
  1136. switch (topic.type) {
  1137. case 8:
  1138. consultTitle = "续方";
  1139. description = "续方咨询";
  1140. url = url + "/wx/html/yszx/html/prescription-consulting.html";
  1141. case 11:
  1142. consultTitle = "上门服务";
  1143. description = "上门服务咨询";
  1144. url = url + "wx/html/appoint_service/html/appoint-serviceDetail.html";
  1145. default:
  1146. consultTitle = "咨询回复提醒";
  1147. description = topic.description;
  1148. if("xmijk" == config.imClientType.id){
  1149. url = "https://zb.xmtyw.cn/ims-wx/index.html#/chatRoom?type=1&consultCode="+topic.id;
  1150. }else if("zsyy" == config.imClientType.id){
  1151. url = "https://hlwyy.xmzsh.com/ims-wx/index.html#/chatRoom?type=1&consultCode="+topic.id;
  1152. }else if("xm_xzzx_wx" == config.imClientType.id){
  1153. url = "https://ih.xmheart.com/hlwyy/ims-wx/index.html#/chatRoom?type=1&consultCode="+topic.id;
  1154. }else if("sd_tnzyy_wx" == config.imClientType.id){
  1155. url = "https://zyy.jkta.com.cn/ims-wx/index.html#/chatRoom?type=1&consultCode="+topic.id;
  1156. }else if("hz_yyyzh_wx" == config.imClientType.id){
  1157. url = "http://hzijk.cityihealth.com?type=1&consultCode="+topic.id;
  1158. }else{
  1159. }
  1160. }
  1161. log.info("内容类型"+message.content_type);
  1162. log.info("内容"+message.content);
  1163. //1、2、3、18、19、12、34
  1164. // 发送模板消息
  1165. if(map != null && (message.content_type==CONTENT_TYPES.PlainText||
  1166. message.content_type==CONTENT_TYPES.Image||
  1167. message.content_type==CONTENT_TYPES.Audio||
  1168. message.content_type==CONTENT_TYPES.Video||
  1169. message.content_type==CONTENT_TYPES.PersonalCard||
  1170. message.content_type==CONTENT_TYPES.MessageForward||
  1171. message.content_type==CONTENT_TYPES.PrescriptionSuggest||
  1172. message.content_type==CONTENT_TYPES.ConsultSuggest||
  1173. message.content_type==CONTENT_TYPES.Article||
  1174. message.content_type==CONTENT_TYPES.surveyMessage||message.content_type==CONTENT_TYPES.EmergencyAssistanceMessage)){
  1175. log.info("内容类型122:"+message.content_type);
  1176. let userName = map.get("name");
  1177. let idCard = map.get("idcard");
  1178. let phone = map.get("mobile");
  1179. let title = consultTitle;
  1180. let content = "您的咨询有新的回复";
  1181. let contentString = replyContent;
  1182. let topidId = topic.id;
  1183. let sessionId = message.session_id;
  1184. // log.info("推送居民公众号:params:"+params)
  1185. let params = 'senderName='+encodeURIComponent(senderName)+'&userName='+encodeURIComponent(userName)+'&idCard='+idCard
  1186. +"&phone="+phone+'&title='+encodeURIComponent(consultTitle)+'&content='+encodeURIComponent(content)
  1187. +'&contentString='+encodeURIComponent(contentString)+'&url='+encodeURIComponent(url)
  1188. +'&topidId='+encodeURIComponent(topidId)+'&sessionId='+encodeURIComponent(sessionId);
  1189. HlwyyWechatAssistantSDK.request(userName,idCard,phone,title,content,contentString,url,params, function (err, res) {
  1190. // WlyyAssistantSDK.request('admin', '0a5c5258-8863-4b07-a3f9-88c768528ab4', '', 'admin_imei', '/doctor/feldsher/sendDoctorTemplate', param, function (err, res) {
  1191. // WlyySDK.request('admin', '0a5c5258-8863-4b07-a3f9-88c768528ab4', '', 'admin_imei', '/doctor/feldsher/sendDoctorTemplate?' + params, 'GET', function (err, res) {
  1192. if(err){
  1193. log.error(err);
  1194. }else {
  1195. log.info(res);
  1196. }
  1197. });
  1198. }
  1199. callback(null, null);
  1200. }
  1201. ],
  1202. function (err, res) {
  1203. if (!err) {
  1204. log.info("Send via wechat template message, DONE!");
  1205. }
  1206. });
  1207. };
  1208. }
  1209. module.exports = WechatClient;