wechat.client.js 60 KB

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