patient.js 8.2 KB

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