topics.js 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. /**
  2. * 议题模型。
  3. */
  4. "use strict";
  5. let RedisClient = require('../../repository/redis/redis.client.js');
  6. let TopicsRepo = require('../../repository/mysql/topics.repo');
  7. let RedisModel = require('./../redis.model.js');
  8. let ModelUtil = require('../../util/model.util');
  9. let Participants = require("./participants");
  10. let Sessions = require("./sessions");
  11. let log = require('../../util/log.js');
  12. let redis = RedisClient.redisClient().connection;
  13. let configFile = require('../../include/commons').CONFIG_FILE;
  14. let config = require('../../resources/config/' + configFile);
  15. const REDIS_KEYS = require('../../include/commons').REDIS_KEYS;
  16. const SESSION_USER_STATUS = require('../../include/commons').SESSION_USER_STATUS;
  17. class Topics extends RedisModel {
  18. constructor() {
  19. super();
  20. }
  21. /**
  22. * 根据topicId获取对应的消息
  23. * @param topicId
  24. * @param page
  25. * @param size
  26. */
  27. getTopicMessages(topicId) {
  28. let self = this;
  29. let topic_key = RedisModel.makeRedisKey(REDIS_KEYS.Topic, topicId);
  30. let _super = RedisModel.makeRedisKey;
  31. redis.hgetallAsync(topic_key).then(function (topic) {
  32. let message_time_key = _super(REDIS_KEYS.MessagesByTimestamp, topic.session_id);
  33. let message_key = _super(REDIS_KEYS.Messages, topic.session_id);
  34. //倒序取出所有的消息ID
  35. let create_time = topic.create_time;
  36. let end_time = topic.end_time;
  37. if (!end_time) {
  38. end_time = new Date().getTime();
  39. }
  40. redis.zrevrangebyscoreAsync(message_time_key, end_time, create_time).then(function (messages) {
  41. //取出消息实例
  42. redis.hmgetAsync(message_key, messages).then(function (res) {
  43. ModelUtil.emitOK(self.eventEmitter, res);
  44. });
  45. })
  46. })
  47. }
  48. /**
  49. *
  50. * @param topicName 发起议题的名称
  51. * @param topicId
  52. * @param users 发起议题的患者{"userId1:role", "userId2:role"}
  53. * @param messages 发送的消息对象{description:"",title:"",img:"",patient:"",patientName:""}图片多个用逗号隔开
  54. */
  55. createTopics(topicName, topicId,sessionId,users, messages) {
  56. let self = this;
  57. //MUC模式中sessionID就是患者ID
  58. let topics_key = RedisModel.makeRedisKey(REDIS_KEYS.Topics, sessionId);
  59. let topic_key = RedisModel.makeRedisKey(REDIS_KEYS.Topic, topicId);
  60. let sessions = new Sessions();
  61. let participants = new Participants();
  62. //从数据库中获取sessionId
  63. let date = new Date();
  64. var pars=[];
  65. redis.zaddAsync(topics_key, date.getTime(), topicId).then(function (res) {
  66. redis.hmsetAsync(topic_key, "name", topicName, "end_by", "", "session_id", sessionId, "create_time", date.getTime(), "end_time", "", "description", messages.description).then(function (res) {
  67. sessions.getSessions(sessionId, function (err, res) {
  68. //已经存在对应的会话更新全科为旁听
  69. if (res && res.length > 0) {
  70. for(var j in users){
  71. participants.updateUser(sessionId, j, users[j]);
  72. }
  73. callbegin();
  74. } else {//不存在创建SESSION
  75. for(var j in users){
  76. pars.push(j+":"+users[j]);
  77. }
  78. sessions.createSession(sessionId, messages.patientName, config.sessionConfig.MUC, pars, function (res) {
  79. if (res) {
  80. callbegin();
  81. }
  82. });
  83. }
  84. })
  85. })
  86. });
  87. /**
  88. * 开始消息发送
  89. */
  90. function callbegin() {
  91. let msg = {};
  92. msg.senderId = messages.patient;
  93. msg.senderName = messages.patientName;
  94. msg.contentType = 6;
  95. msg.content = "开始咨询"
  96. msg.timestamp = date;
  97. sessions.saveMessageByTopic(msg, sessionId, function (err, msgId) {
  98. if (err) {
  99. ModelUtil.emitOK(self.eventEmitter, err);
  100. } else {
  101. self.saveTopicsToSql(topicName, topicId, sessionId, msgId, date);
  102. callBeginMsg(startMsgId);
  103. }
  104. })
  105. }
  106. /**
  107. * 发送求助内容
  108. */
  109. function callBeginMsg(startMsgId) {
  110. let msg = {};
  111. msg.senderId = messages.patient;
  112. msg.senderName = messages.patientName;
  113. msg.contentType = 1;
  114. msg.content = messages.description;
  115. msg.timestamp = new Date();
  116. sessions.saveMessageByTopic(msg, patient, function (err, msgId) {
  117. log.info("begin send" + messages.description);
  118. });
  119. if (messages.img) {
  120. let imgs = messages.img.split(",");
  121. for (var j in imgs) {
  122. let msgimg = {};
  123. msgimg.senderId = messages.patient;
  124. msgimg.senderName = messages.patientName;
  125. msgimg.contentType = 2;
  126. msgimg.content = imgs[j];
  127. msgimg.timestamp = new Date();
  128. sessions.saveMessageByTopic(msgimg, patient, function (err, msgId) {
  129. log.info("begin send" + imgs[j]);
  130. })
  131. }
  132. }
  133. ModelUtil.emitOK(self.eventEmitter, startMsgId);
  134. }
  135. }
  136. saveTopicsToSql(topicName, topicId, sessionId, messageId, date) {
  137. TopicsRepo.saveTopic(topicName, topicId, sessionId, messageId, date);
  138. }
  139. /**
  140. * 结束议题
  141. * @param topicId
  142. * @param endUser
  143. */
  144. endTopic(topicId, endUser, endUserName) {
  145. let endDate = new Date();
  146. let self = this;
  147. let topic_key = RedisModel.makeRedisKey(REDIS_KEYS.Topic, topicId);
  148. redis.hmsetAsync(topic_key, "end_time", endDate.getTime(), "end_by", endUser).then(function (res) {
  149. redis.hgetallAsync(topic_key).then(function (topic) {
  150. callEnd(topic.session_id);
  151. })
  152. });
  153. /**
  154. * 结束消息发送
  155. */
  156. function callEnd(sessionId) {
  157. let msg = {};
  158. msg.senderId = endUser;
  159. msg.senderName = endUserName;
  160. msg.contentType = 7;
  161. msg.content = endUserName + "结束了咨询"
  162. msg.timestamp = new Date();
  163. let sessions = new Sessions();
  164. sessions.saveMessageByTopic(msg, sessionId, function (err, msgId) {
  165. if (err) {
  166. ModelUtil.emitOK(self.eventEmitter, err);
  167. } else {
  168. ModelUtil.emitOK(self.eventEmitter, "结束成功!");
  169. TopicsRepo.endTopic(topicId, endUser, msg.date, msgId);
  170. }
  171. })
  172. }
  173. }
  174. }
  175. // Expose class
  176. module.exports = Topics;