topics.js 6.9 KB

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