topics.js 7.7 KB

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