wechat.client.js 60 KB

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