patient.js 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. /**
  2. * 患者模型。
  3. */
  4. "use strict";
  5. let configFile = require('../../include/commons').CONFIG_FILE;
  6. let config = require('../../resources/config/' + configFile);
  7. let log = require("../../util/log.js");
  8. let RedisModel = require('../redis.model');
  9. let ObjectUtil = require("../../util/object.util.js");
  10. let ModelUtil = require('../../util/model.util');
  11. let WechatClient = require('../../models/client/wechat.client');
  12. let Doctor = require('./doctor');
  13. let DoctorRepo = require('../../repository/mysql/doctor.repo');
  14. let PatientRepo = require('../../repository/mysql/patient.repo');
  15. let PmRepo = require('../../repository/mysql/private.msg.repo');
  16. let clientCache = require('../socket.io/client.cache').clientCache();
  17. const CONTENT_TYPES = require('../../include/commons').CONTENT_TYPE;
  18. class Patient extends RedisModel {
  19. constructor(patientId) {
  20. super();
  21. this._id = patientId;
  22. }
  23. get id(){
  24. return this._id;
  25. }
  26. /**
  27. * 向患者发送消息。
  28. *
  29. * 注意:患者消息的保存发送与医生的实现不同。
  30. *
  31. * @param message 消息
  32. */
  33. sendMessage(message) {
  34. // 保存消息
  35. let self = this;
  36. let tempContent = message.contentType === CONTENT_TYPES.Article ? JSON.stringify(message.content) : message.content;
  37. PmRepo.save(message.to, message.from, message.contentType, tempContent, function (err, result) {
  38. if (err) {
  39. ModelUtil.emitError(self.eventEmitter, 'Save private message failed', err);
  40. return;
  41. }
  42. // 结束网络连接,后续操作继续执行
  43. PmRepo.findOnePatientMessage(result.insertId, function (err, msg) {
  44. if (err) {
  45. ModelUtil.emitError(self.eventEmitter, 'Save private message success, but return last message failed', err);
  46. return;
  47. }
  48. ModelUtil.emitOK(self.eventEmitter, Doctor.fillMessages(msg));
  49. // 通过Web Socket推送给患者
  50. let patientClient = clientCache.findById(message.to);
  51. if (!patientClient) {
  52. log.warn("User is not online, user id: ", message.to);
  53. //发送微信模板消息
  54. self.sendConsultWechatReplyTempMsg(message);
  55. return;
  56. }
  57. let row = msg[0];
  58. row.timestamp = ObjectUtil.timestampToLong(row.timestamp);
  59. patientClient.socketServer.sockets.emit('message', row);
  60. });
  61. // 更新自身的聊天统计信息
  62. StatsRepo.updatePrivateChatSummary(message.from, message.to, message.from, message.contentType, message.content, function (err, result) {
  63. if (err) log.error(err);
  64. });
  65. // 更新对端的聊天统计信息
  66. StatsRepo.updatePrivateChatSummary(message.to, message.from, message.from, message.contentType, message.content, function (err, result) {
  67. if (err) log.error(err);
  68. });
  69. });
  70. };
  71. /**
  72. * 推送群组消息给居民
  73. *
  74. * @param message
  75. */
  76. pushGroupMessage(message) {
  77. let self = this;
  78. // 通过Web Socket推送给患者
  79. let patientClient = clientCache.findById(message.to);
  80. if (!patientClient) {
  81. log.warn("User is not online, user id: ", message.to);
  82. //发送微信模板消息
  83. self.sendConsultWechatReplyTempMsg(message);
  84. return;
  85. }
  86. GroupRepo.getOnGroupMsg(message.msgId, function (err, result) {
  87. if (err) {
  88. ModelUtil.emitError(self.eventEmitter, "get group msg info failed", err);
  89. }
  90. var msg = result ? result[0] : "";
  91. if (msg) {
  92. patientClient.socketServer.sockets.emit('message', msg);
  93. }
  94. })
  95. };
  96. /**
  97. * 发送微信模板消息给居民
  98. *
  99. * @param message
  100. */
  101. sendConsultWechatReplyTempMsg(message) {
  102. let self = this;
  103. // 发送微信消息
  104. function sendWxMessage(openid, name, consult) {
  105. var replyContent = message.content;
  106. switch (Number.parseInt(message.contentType)) {
  107. case CONTENT_TYPES.Image:
  108. replyContent = "[图片]";
  109. break;
  110. case CONTENT_TYPES.Audio:
  111. replyContent = "[语音]";
  112. break;
  113. case 0:
  114. case CONTENT_TYPES.Article:
  115. case CONTENT_TYPES.GoTo:
  116. case CONTENT_TYPES.TopicBegin:
  117. case CONTENT_TYPES.TopicEnd:
  118. return;
  119. default:
  120. break;
  121. }
  122. // 模板消息数据
  123. var msg = {
  124. touser: openid,
  125. template_id: config.wechatConfig.template.consultTemplate,
  126. url: config.wechatConfig.baseUrl + "/wx/html/yszx/html/consulting-doctor.html?openid=" + openid +
  127. "&consult=" + consult.consult + "&toUser=" + message.to,
  128. data: {
  129. first: {value: "您的健康咨询有新的回复", color: "#000000"}
  130. , remark: {value: "", color: "#000000"}
  131. , keyword1: {value: consult.symptoms, color: "#000000"}
  132. , keyword2: {value: replyContent, color: "#000000"}
  133. , keyword3: {value: name, color: "#000000"}
  134. }
  135. };
  136. // 发送模板消息
  137. WechatClient.sendWxTemplateMessage(msg);
  138. }
  139. // 查询居民openid
  140. PatientRepo.findPatientOpenId(message.to, function (err, result) {
  141. if (err) {
  142. ModelUtil.emitError(self.eventEmitter, "get patient openid failed", err);
  143. return;
  144. }
  145. var openid = result && result.length > 0 ? result[0].openid : "";
  146. if (openid) {
  147. // 查询医生信息
  148. DoctorRepo.findOne(message.from, function (err, result) {
  149. if (err) {
  150. ModelUtil.emitError(self.eventEmitter, "get doctor info failed", err);
  151. return;
  152. }
  153. if (result && result.length > 0) {
  154. var name = result[0].name;
  155. if (message.group) {
  156. GroupRepo.getGroupConsultInfo(message.group, function (err, result) {
  157. if (err) {
  158. ModelUtil.emitError(self.eventEmitter, "get patient and doctor consult info failed", err);
  159. return;
  160. }
  161. var consult = result && result.length > 0 ? result[0] : "";
  162. if (consult) {
  163. sendWxMessage(openid, name, consult);
  164. }
  165. });
  166. } else {
  167. // 查询医生与居民对应的咨询信息
  168. PatientRepo.getPatientDoctorConsult(message.to, message.from, function (err, result) {
  169. if (err) {
  170. ModelUtil.emitError(self.eventEmitter, "get patient and doctor consult info failed", err);
  171. return;
  172. }
  173. var consult = result && result.length > 0 ? result[0] : "";
  174. if (consult) {
  175. sendWxMessage(openid, name, consult);
  176. }
  177. });
  178. }
  179. } else {
  180. ModelUtil.emitError(self.eventEmitter, "can not find doctor info", err);
  181. }
  182. });
  183. } else {
  184. ModelUtil.logError("patient does not bind wechat", err);
  185. }
  186. });
  187. };
  188. }
  189. module.exports = Patient;