/** * 议题模型。 */ "use strict"; let RedisClient = require('../../repository/redis/redis.client.js'); let TopicsRepo = require('../../repository/mysql/topics.repo'); let SessionRepo = require('../../repository/mysql/session.repo'); let ParticipantRepo = require('../../repository/mysql/participant.repo'); let RedisModel = require('./../redis.model.js'); let ModelUtil = require('../../util/model.util'); let Sessions = require("./sessions"); let log = require('../../util/log.js'); let redis = RedisClient.redisClient().connection; let configFile = require('../../include/commons').CONFIG_FILE; let config = require('../../resources/config/' + configFile); const REDIS_KEYS = require('../../include/commons').REDIS_KEYS; const TOPIC_STATUS = require('../../include/commons').TOPIC_STATUS; const SESSION_TYPES = require('../../include/commons').SESSION_TYPES; class Topics extends RedisModel { constructor() { super(); } getTopics(user,status,page,pagesize,sessionType){ let self = this; let session = new Sessions(); page = (page - 1 < 0 ? 0 : page - 1) * pagesize; if(!pagesize)pagesize =10; pagesize = parseInt(pagesize); if(!sessionType) sessionType = SESSION_TYPES.MUC; SessionRepo.findAllByType(user,sessionType,function(err,res){ if(err){ ModelUtil.emitError(self.eventEmitter, "获取列表失败"+err); }else if(res&&res.length==0){ ModelUtil.emitOK(self.eventEmitter, []); } var sessionIds=[]; for(var j in res){ sessionIds.push(res[j].id); } TopicsRepo.findAllBySessionIdsAndStatus(sessionIds,status,page,pagesize,function(err,res){ if(err){ ModelUtil.emitError(self.eventEmitter, "获取列表失败"+err); } else if(res&&res.length==0){ ModelUtil.emitOK(self.eventEmitter, []); }else{ for(var j = 0;j0){ ParticipantRepo.findAll(res[0].session_id,function (err,users) { if(err){ ModelUtil.emitOK(self.eventEmitter, {status:-1,message:err}); }else{ ModelUtil.emitOK(self.eventEmitter, {status:200,data:{"list":messages,"users":users}}); } }) }else{ ModelUtil.emitOK(self.eventEmitter, {status:200,data:[]}); } } }); }) } /** * 创建议题。 * * @param topicName 发起议题的名称 * @param topicId * @param sessionId * @param users 发起议题的患者,格式:{"userId1:role", "userId2:role"} * @param messages 发送的消息对象,格式:{description:"",title:"",img:"image1,image2",sender_id:"",sender_name:""},多个图片用逗号隔开 */ createTopic(topicName, topicId, sessionId, users, messages,sessionType) { let self = this; if(!sessionId&&sessionType==SESSION_TYPES.MUC) { ModelUtil.emitOK(self.eventEmitter, {status:-1,message:"会话ID为空,请先生成会话ID"}); return; } if(!topicId) { ModelUtil.emitOK(self.eventEmitter, {status:-1,message:"议题ID为空,请先生成议题ID"}); return; } var pars = []; for (var j in users) { pars.push(j + ":" + users[j]); } let sessions = new Sessions(); let date = new Date(); sessions.createSession(sessionId, messages.sender_name, sessionType, pars, function (err, res) { sessionId = res.id; self.saveTopicToRedis(topicName,topicId,sessionId,messages,date,function(err,res){ if(err){ ModelUtil.emitOK(self.eventEmitter,{status:-1,message:"议题创建失败!"}); return; } //返回给前端 ModelUtil.emitOK(self.eventEmitter,{status:200,message:"议题创建成功!",start_msg_id:res}); //执行数据库操作 self.saveTopicToMySQL(topicName,topicId,sessionId,res,date,messages.description,TOPIC_STATUS.NEW,function(err,res){ if(err){ log.info("save topic to mysql is error : "+err); return; } }) }) }); } saveTopicToRedis(topicName, topicId, sessionId, messages,date,handler){ let topics_key = RedisModel.makeRedisKey(REDIS_KEYS.Topics, sessionId); let topic_key = RedisModel.makeRedisKey(REDIS_KEYS.Topic, topicId); let sessions = new Sessions(); //step1:创建topic到redis redis.zaddAsync(topics_key, date.getTime(), topicId).then(function (res) { redis.hmsetAsync(topic_key, "name", topicName, "session_id", sessionId,"create_time", date.getTime(), "description", messages.description,"status", TOPIC_STATUS.NEW, "end_time", "", "end_by", "" ).then(function (res) { sendBeginMsg(); }).catch(function(err){ handler(err,null); return; }); }).catch(function(err){ handler(err,null); return; }); //step2:发送开始会话 function sendBeginMsg() { let msg = {}; msg.sender_id = messages.sender_id; msg.sender_name = messages.sender_name; msg.content_type = 10; msg.content = messages.sender_name+"发起了咨询"; msg.timestamp = date; sessions.saveMessageByTopic(msg, sessionId, function (err, msgId) { if (err) { handler(err,null); } else { sendQuesionMsg(msgId); handler(null,msgId); } }) } //step3:发送求助内容的文本 function sendQuesionMsg(startMsgId) { let msg = {}; msg.sender_id = messages.sender_id; msg.sender_name = messages.sender_name; msg.content_type = 6; msg.content = messages.description; msg.timestamp = new Date(); sessions.saveMessageByTopic(msg, sessionId, function (err, msgId) { if (messages.img) { sendQuesionImg(startMsgId); } if(err){ log.info("send create message error "+msg); } }); } //step4:发送求助内容的图片 function sendQuesionImg(startMsgId){ let imgs = messages.img.split(","); for (var j in imgs) { let msgimg = {}; msgimg.sender_id = messages.sender_id; msgimg.sender_name = messages.sender_name; msgimg.content_type = 2; msgimg.content = imgs[j]; msgimg.timestamp = new Date(); sessions.saveMessageByTopic(msgimg, sessionId, function (err, msgId) { if(err){ log.info("send create img error "+imgs[j]); } }) } } } saveTopicToMySQL(topicName, topicId, sessionId, messageId, date, description,status,handler) { TopicsRepo.saveTopic(topicName, topicId, sessionId, messageId, date, description,status,handler); } /** * 议题是否已结束。 * * @param sessionId * @param topicId * @param handler */ isTopicEnded(sessionId, topicId, handler) { let self = this; if (topicId == "current") { TopicsRepo.findLastTopicStatus(sessionId, callback); } else { TopicsRepo.findTopicStatus(topicId, callback); } function callback(err, res) { if (err) { handler != null ? handler(err, res) : ModelUtil.emitError(self.eventEmitter, err); } else { if (null == res) { handler != null ? handler(err, res) : ModelUtil.emitOK(self.eventEmitter,{}); } else { let ended = res[0].status == TOPIC_STATUS.ENDED; handler != null ? handler(err, res) : ModelUtil.emitOK(self.eventEmitter, res[0]); } } } } /** * 结束议题 * @param topicId * @param endUser * @param endUserName */ endTopic(topicId, endUser, endUserName) { let endDate = new Date(); let self = this; let topic_key = RedisModel.makeRedisKey(REDIS_KEYS.Topic, topicId); redis.hmsetAsync(topic_key, "end_time", endDate.getTime(), "end_by", endUser, "status", TOPIC_STATUS.ENDED).then(function (res) { redis.hgetallAsync(topic_key).then(function (topic) { callEnd(topic.session_id); }) }); /** * 结束消息发送 */ function callEnd(sessionId) { let msg = { sender_id: endUser, sender_name: endUserName, content_type: 7, content: endUserName + "结束了咨询", timestamp: new Date() }; let sessions = new Sessions(); sessions.saveMessageByTopic(msg, sessionId, function (err, msgId) { if (err) { ModelUtil.emitOK(self.eventEmitter,{status:-1,"message": err} ); } else { ModelUtil.emitOK(self.eventEmitter, {status:200,"id": msgId,"message":"结束成功!"}); TopicsRepo.endTopic(topicId, endUser, msg.date, msgId,TOPIC_STATUS.ENDED); } }) } } updateTopic(topicId, valueJson) { let self = this; let topickey = RedisModel.makeRedisKey(REDIS_KEYS.Topic, topicId); var dataArray = []; for (var j in valueJson) { dataArray.push(j); dataArray.push(valueJson[j]); } redis.hmsetAsync(topickey, dataArray).then(function (res) { TopicsRepo.updateTopics(topicId, valueJson,function (err,res) { if(!err){ ModelUtil.emitOK(self.eventEmitter, {"status": 200}); }else{ ModelUtil.emitOK(self.eventEmitter, {"status": -1}); } }); }); } } // Expose class module.exports = Topics;