patient.js 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  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 BaseModel = require('./base.model');
  9. let patientRepo = require('../repository/patient.repo');
  10. let statsRepo = require("../repository/stats.msg.repo.js");
  11. let pmRepo = require('../repository/private.msg.repo');
  12. let objectUtil = require("../util/objectUtil.js");
  13. let modelUtil = require('../util/modelUtil');
  14. let Doctor = require('../models/doctor');
  15. const CONTENT_TYPES = require('../include/commons').CONTENT_TYPE;
  16. let clientCache = require('./socket.io/client.cache').clientCache();
  17. let doctorRepo = require('../repository/doctor.repo');
  18. let wechatUtil = require('../util/wechatUtil');
  19. class Patient extends BaseModel {
  20. constructor() {
  21. super();
  22. }
  23. /**
  24. * 是否为患者代码。
  25. *
  26. * @param code
  27. * @param passedCallback 测试通过回调
  28. * @param failedCallback 测试失败回调
  29. */
  30. static isPatientCode(code, passedCallback, failedCallback) {
  31. patientRepo.isPatientCode(code, function (err, result) {
  32. if (err) {
  33. log.error('Send message to patient failed: ', err);
  34. return;
  35. }
  36. if (result[0].c > 0) {
  37. passedCallback();
  38. } else {
  39. failedCallback();
  40. }
  41. });
  42. }
  43. /**
  44. * 向患者发送消息。
  45. *
  46. * 注意:患者消息的保存发送与医生的实现不同。
  47. *
  48. * @param message 消息
  49. */
  50. sendMessage(message) {
  51. // 保存消息
  52. let self = this;
  53. let tempContent = message.contentType === CONTENT_TYPES.Article ? JSON.stringify(message.content) : message.content;
  54. pmRepo.save(message.to, message.from, message.contentType, tempContent, function (err, result) {
  55. if (err) {
  56. modelUtil.emitDbError(self.eventEmitter, 'Save private message failed', err);
  57. return;
  58. }
  59. // 结束网络连接,后续操作继续执行
  60. pmRepo.findOneMessage(result.insertId, function (err, msg) {
  61. if (err) {
  62. modelUtil.emitDbError(self.eventEmitter, 'Save private message success, but return last message failed', err);
  63. return;
  64. }
  65. modelUtil.emitData(self.eventEmitter, Doctor.fillMessages(msg));
  66. // 通过Web Socket推送给患者
  67. let patientClient = clientCache.findById(message.to);
  68. if (!patientClient) {
  69. log.warn("User is not online, user id: ", message.to);
  70. self.sendConsultWechatReplyTempMsg(message);
  71. return;
  72. }
  73. patientClient.socketServer.sockets.emit('message', message);
  74. });
  75. // 更新自身的聊天统计信息
  76. statsRepo.updatePrivateChatSummary(message.from, message.to, message.from, message.contentType, message.content, function (err, result) {
  77. if (err) log.error(err);
  78. });
  79. // 更新对端的聊天统计信息
  80. statsRepo.updatePrivateChatSummary(message.to, message.from, message.from, message.contentType, message.content, function (err, result) {
  81. if (err) log.error(err);
  82. });
  83. });
  84. };
  85. /**
  86. * 发送微信模板消息给居民
  87. *
  88. * @param message
  89. */
  90. sendConsultWechatReplyTempMsg(message) {
  91. // 推送微信模板消息
  92. patientRepo.getPatientOpenid(message.to, function (err, result) {
  93. if (err) {
  94. modelUtil.emitDbError(self.eventEmitter, "get patient openid failed", err);
  95. return;
  96. }
  97. var openid = result && result.length > 0 ? result[0].openid : "";
  98. if (openid) {
  99. doctorRepo.getDoctorInfo(message.from, function (err, result) {
  100. if (err) {
  101. modelUtil.emitDbError(self.eventEmitter, "get doctor info failed", err);
  102. return;
  103. }
  104. if (result && result.length > 0) {
  105. var name = result[0].name;
  106. var msg = {
  107. touser: openid,
  108. template_id: config.wechatConfig.template.consultTemplate,
  109. url: config.wechatConfig.baseUrl + "/wx/html/yszx/html/consulting-doctor.html?openid=" + openid +
  110. "&consult=" + "" + "&toUser=" + message.to,
  111. data: {
  112. first: {value: "您的健康咨询有新的回复", color: "#000000"}
  113. , remark: {value: "", color: "#000000"}
  114. , keyword1: {value: "XXXX咨询", color: "#000000"}
  115. , keyword2: {value: "XXXX回复", color: "#000000"}
  116. , keyword3: {value: name, color: "#000000"}
  117. }
  118. };
  119. wechatUtil.sendWxTemplateMessage(msg);
  120. }
  121. });
  122. } else {
  123. modelUtil.logError("patient does not bind wechat", err);
  124. }
  125. });
  126. };
  127. }
  128. module.exports = Patient;