topics.js 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352
  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 SessionRepo = require('../../repository/mysql/session.repo');
  8. let ParticipantRepo = require('../../repository/mysql/participant.repo');
  9. let RedisModel = require('./../redis.model.js');
  10. let ModelUtil = require('../../util/model.util');
  11. let Sessions = require("./sessions");
  12. let log = require('../../util/log.js');
  13. let redis = RedisClient.redisClient().connection;
  14. let configFile = require('../../include/commons').CONFIG_FILE;
  15. let config = require('../../resources/config/' + configFile);
  16. const REDIS_KEYS = require('../../include/commons').REDIS_KEYS;
  17. const TOPIC_STATUS = require('../../include/commons').TOPIC_STATUS;
  18. const SESSION_TYPES = require('../../include/commons').SESSION_TYPES;
  19. class Topics extends RedisModel {
  20. constructor() {
  21. super();
  22. }
  23. getTopics(user,status,page,pagesize,sessionType){
  24. let self = this;
  25. let session = new Sessions();
  26. page = (page - 1 < 0 ? 0 : page - 1) * pagesize;
  27. if(!pagesize)pagesize =10;
  28. pagesize = parseInt(pagesize);
  29. if(!sessionType) sessionType = SESSION_TYPES.MUC;
  30. SessionRepo.findAllByType(user,sessionType,function(err,res){
  31. if(err){
  32. ModelUtil.emitError(self.eventEmitter, "获取列表失败"+err);
  33. }else if(res&&res.length==0){
  34. ModelUtil.emitOK(self.eventEmitter, []);
  35. }
  36. var sessionIds=[];
  37. for(var j in res){
  38. sessionIds.push(res[j].id);
  39. }
  40. TopicsRepo.findAllBySessionIdsAndStatus(sessionIds,status,page,pagesize,function(err,res){
  41. if(err){
  42. ModelUtil.emitError(self.eventEmitter, "获取列表失败"+err);
  43. }
  44. else if(res&&res.length==0){
  45. ModelUtil.emitOK(self.eventEmitter, []);
  46. }else{
  47. for(var j = 0;j<res.length;j++){
  48. callAmount(j,res,res[j]);
  49. }
  50. }
  51. function callAmount(i,res,r){
  52. session.getSessionUnreadMessageCount(res[i].session_id,user,function(err,msgcount){
  53. if(err){
  54. log.error("getSessionUnreadMessageCount is error:"+err);
  55. ModelUtil.emitError(self.eventEmitter, "获取未读消息失败!"+err);
  56. }else{
  57. callGetImg(i,res,r,msgcount);
  58. }
  59. })
  60. }
  61. var result =[];
  62. function callGetImg(i,res,r,msgcount){
  63. ParticipantRepo.findAll(res[i].session_id,function(err,p){
  64. if(err){
  65. log.error("获取头像失败:"+err);
  66. }else{
  67. r.create_time = r.create_time.getTime();
  68. for(var j in p){
  69. if(p[j].is_patient){
  70. r.avatar = p[j].avatar;
  71. r.patient = p[j].id;
  72. r.patient_name = p[j].name;
  73. r.sex = p[j].sex;
  74. r.birthdate = p[j].birthdate.getTime();
  75. if(r.status!=TOPIC_STATUS.ENDED){
  76. r.msg_count = msgcount;
  77. }
  78. }
  79. }
  80. result.push(r);
  81. if(result.length==res.length){
  82. ModelUtil.emitOK(self.eventEmitter, res);
  83. }
  84. }
  85. })
  86. }
  87. })
  88. })
  89. }
  90. /**
  91. * 根据topicId获取对应的消息
  92. * @param topicId
  93. */
  94. getTopicMessages(topicId,user,startMsgId,endMsgId,page,pagesize) {
  95. let self = this;
  96. TopicsRepo.findAllByTopicId(topicId,function(err,res){
  97. if(err||res.length==0){
  98. ModelUtil.emitOK(self.eventEmitter, {status:-1,message:"找不到对应的会话记录!"});
  99. }
  100. let sessions = new Sessions();
  101. sessions.getMessages(res[0].session_id,user,startMsgId,endMsgId,page,pagesize,0,function(err,messages){
  102. if(err){
  103. ModelUtil.emitOK(self.eventEmitter, {status:-1,message:err});
  104. }else{
  105. if(messages&&messages.length>0){
  106. ParticipantRepo.findAll(res[0].session_id,function (err,users) {
  107. if(err){
  108. ModelUtil.emitOK(self.eventEmitter, {status:-1,message:err});
  109. }else{
  110. ModelUtil.emitOK(self.eventEmitter, {status:200,data:{"list":messages,"users":users}});
  111. }
  112. })
  113. }else{
  114. ModelUtil.emitOK(self.eventEmitter, {status:200,data:[]});
  115. }
  116. }
  117. });
  118. })
  119. }
  120. /**
  121. * 创建议题。
  122. *
  123. * @param topicName 发起议题的名称
  124. * @param topicId
  125. * @param sessionId
  126. * @param users 发起议题的患者,格式:{"userId1:role", "userId2:role"}
  127. * @param messages 发送的消息对象,格式:{description:"",title:"",img:"image1,image2",sender_id:"",sender_name:""},多个图片用逗号隔开
  128. */
  129. createTopic(topicName, topicId, sessionId, users, messages,sessionType) {
  130. let self = this;
  131. if(!sessionId&&sessionType==SESSION_TYPES.MUC) {
  132. ModelUtil.emitOK(self.eventEmitter, {status:-1,message:"会话ID为空,请先生成会话ID"});
  133. return;
  134. }
  135. if(!topicId) {
  136. ModelUtil.emitOK(self.eventEmitter, {status:-1,message:"议题ID为空,请先生成议题ID"});
  137. return;
  138. }
  139. var pars = [];
  140. for (var j in users) {
  141. pars.push(j + ":" + users[j]);
  142. }
  143. let sessions = new Sessions();
  144. let date = new Date();
  145. sessions.createSession(sessionId, messages.sender_name, sessionType, pars, function (err, res) {
  146. sessionId = res.id;
  147. self.saveTopicToRedis(topicName,topicId,sessionId,messages,date,function(err,res){
  148. if(err){
  149. ModelUtil.emitOK(self.eventEmitter,{status:-1,message:"议题创建失败!"});
  150. return;
  151. }
  152. //返回给前端
  153. ModelUtil.emitOK(self.eventEmitter,{status:200,message:"议题创建成功!",start_msg_id:res});
  154. //执行数据库操作
  155. self.saveTopicToMySQL(topicName,topicId,sessionId,res,date,messages.description,TOPIC_STATUS.NEW,function(err,res){
  156. if(err){
  157. log.info("save topic to mysql is error : "+err);
  158. return;
  159. }
  160. })
  161. })
  162. });
  163. }
  164. saveTopicToRedis(topicName, topicId, sessionId, messages,date,handler){
  165. let topics_key = RedisModel.makeRedisKey(REDIS_KEYS.Topics, sessionId);
  166. let topic_key = RedisModel.makeRedisKey(REDIS_KEYS.Topic, topicId);
  167. let sessions = new Sessions();
  168. //step1:创建topic到redis
  169. redis.zaddAsync(topics_key, date.getTime(), topicId).then(function (res) {
  170. redis.hmsetAsync(topic_key, "name", topicName,
  171. "session_id", sessionId,"create_time", date.getTime(),
  172. "description", messages.description,"status", TOPIC_STATUS.NEW,
  173. "end_time", "", "end_by", ""
  174. ).then(function (res) {
  175. sendBeginMsg();
  176. }).catch(function(err){
  177. handler(err,null);
  178. return;
  179. });
  180. }).catch(function(err){
  181. handler(err,null);
  182. return;
  183. });
  184. //step2:发送开始会话
  185. function sendBeginMsg() {
  186. let msg = {};
  187. msg.sender_id = messages.sender_id;
  188. msg.sender_name = messages.sender_name;
  189. msg.content_type = 10;
  190. msg.content = messages.sender_name+"发起了咨询";
  191. msg.timestamp = date;
  192. sessions.saveMessageByTopic(msg, sessionId, function (err, msgId) {
  193. if (err) {
  194. handler(err,null);
  195. } else {
  196. sendQuesionMsg(msgId);
  197. handler(null,msgId);
  198. }
  199. })
  200. }
  201. //step3:发送求助内容的文本
  202. function sendQuesionMsg(startMsgId) {
  203. let msg = {};
  204. msg.sender_id = messages.sender_id;
  205. msg.sender_name = messages.sender_name;
  206. msg.content_type = 6;
  207. msg.content = messages.description;
  208. msg.timestamp = new Date();
  209. sessions.saveMessageByTopic(msg, sessionId, function (err, msgId) {
  210. if (messages.img) {
  211. sendQuesionImg(startMsgId);
  212. }
  213. if(err){
  214. log.info("send create message error "+msg);
  215. }
  216. });
  217. }
  218. //step4:发送求助内容的图片
  219. function sendQuesionImg(startMsgId){
  220. let imgs = messages.img.split(",");
  221. for (var j in imgs) {
  222. let msgimg = {};
  223. msgimg.sender_id = messages.sender_id;
  224. msgimg.sender_name = messages.sender_name;
  225. msgimg.content_type = 2;
  226. msgimg.content = imgs[j];
  227. msgimg.timestamp = new Date();
  228. sessions.saveMessageByTopic(msgimg, sessionId, function (err, msgId) {
  229. if(err){
  230. log.info("send create img error "+imgs[j]);
  231. }
  232. })
  233. }
  234. }
  235. }
  236. saveTopicToMySQL(topicName, topicId, sessionId, messageId, date, description,status,handler) {
  237. TopicsRepo.saveTopic(topicName, topicId, sessionId, messageId, date, description,status,handler);
  238. }
  239. /**
  240. * 议题是否已结束。
  241. *
  242. * @param sessionId
  243. * @param topicId
  244. * @param handler
  245. */
  246. isTopicEnded(sessionId, topicId, handler) {
  247. let self = this;
  248. if (topicId == "current") {
  249. TopicsRepo.findLastTopicStatus(sessionId, callback);
  250. } else {
  251. TopicsRepo.findTopicStatus(topicId, callback);
  252. }
  253. function callback(err, res) {
  254. if (err) {
  255. handler != null ? handler(err, res) : ModelUtil.emitError(self.eventEmitter, err);
  256. } else {
  257. if (null == res) {
  258. handler != null ? handler(err, res) : ModelUtil.emitOK(self.eventEmitter,{});
  259. } else {
  260. let ended = res[0].status == TOPIC_STATUS.ENDED;
  261. handler != null ? handler(err, res) : ModelUtil.emitOK(self.eventEmitter, res[0]);
  262. }
  263. }
  264. }
  265. }
  266. /**
  267. * 结束议题
  268. * @param topicId
  269. * @param endUser
  270. * @param endUserName
  271. */
  272. endTopic(topicId, endUser, endUserName) {
  273. let endDate = new Date();
  274. let self = this;
  275. let topic_key = RedisModel.makeRedisKey(REDIS_KEYS.Topic, topicId);
  276. redis.hmsetAsync(topic_key, "end_time", endDate.getTime(), "end_by", endUser, "status", TOPIC_STATUS.ENDED).then(function (res) {
  277. redis.hgetallAsync(topic_key).then(function (topic) {
  278. callEnd(topic.session_id);
  279. })
  280. });
  281. /**
  282. * 结束消息发送
  283. */
  284. function callEnd(sessionId) {
  285. let msg = {
  286. sender_id: endUser,
  287. sender_name: endUserName,
  288. content_type: 7,
  289. content: endUserName + "结束了咨询",
  290. timestamp: new Date()
  291. };
  292. let sessions = new Sessions();
  293. sessions.saveMessageByTopic(msg, sessionId, function (err, msgId) {
  294. if (err) {
  295. ModelUtil.emitOK(self.eventEmitter,{status:-1,"message": err} );
  296. } else {
  297. ModelUtil.emitOK(self.eventEmitter, {status:200,"id": msgId,"message":"结束成功!"});
  298. TopicsRepo.endTopic(topicId, endUser, msg.date, msgId,TOPIC_STATUS.ENDED);
  299. }
  300. })
  301. }
  302. }
  303. updateTopic(topicId, valueJson) {
  304. let self = this;
  305. let topickey = RedisModel.makeRedisKey(REDIS_KEYS.Topic, topicId);
  306. var dataArray = [];
  307. for (var j in valueJson) {
  308. dataArray.push(j);
  309. dataArray.push(valueJson[j]);
  310. }
  311. redis.hmsetAsync(topickey, dataArray).then(function (res) {
  312. TopicsRepo.updateTopics(topicId, valueJson,function (err,res) {
  313. if(!err){
  314. ModelUtil.emitOK(self.eventEmitter, {"status": 200});
  315. }else{
  316. ModelUtil.emitOK(self.eventEmitter, {"status": -1});
  317. }
  318. });
  319. });
  320. }
  321. }
  322. // Expose class
  323. module.exports = Topics;