/** * 患者模型。 */ "use strict"; let configFile = require('../../include/commons').CONFIG_FILE; let config = require('../../resources/config/' + configFile); let log = require("../../util/log.js"); let RedisModel = require('../redis.model'); let ObjectUtil = require("../../util/object.util.js"); let ModelUtil = require('../../util/model.util'); let WechatClient = require('../../models/client/wechat.client'); let Doctor = require('./doctor'); let DoctorRepo = require('../../repository/mysql/doctor.repo'); let PatientRepo = require('../../repository/mysql/patient.repo'); let PmRepo = require('../../repository/mysql/private.msg.repo'); let clientCache = require('../socket.io/client.cache').clientCache(); const CONTENT_TYPES = require('../../include/commons').CONTENT_TYPE; class Patient extends RedisModel { constructor(patientId) { super(); this._id = patientId; } get id(){ return this._id; } /** * 向患者发送消息。 * * 注意:患者消息的保存发送与医生的实现不同。 * * @param message 消息 */ sendMessage(message) { // 保存消息 let self = this; let tempContent = message.contentType === CONTENT_TYPES.Article ? JSON.stringify(message.content) : message.content; PmRepo.save(message.to, message.from, message.contentType, tempContent, function (err, result) { if (err) { ModelUtil.emitError(self.eventEmitter, 'Save private message failed', err); return; } // 结束网络连接,后续操作继续执行 PmRepo.findOnePatientMessage(result.insertId, function (err, msg) { if (err) { ModelUtil.emitError(self.eventEmitter, 'Save private message success, but return last message failed', err); return; } ModelUtil.emitOK(self.eventEmitter, Doctor.fillMessages(msg)); // 通过Web Socket推送给患者 let patientClient = clientCache.findById(message.to); if (!patientClient) { log.warn("User is not online, user id: ", message.to); //发送微信模板消息 self.sendConsultWechatReplyTempMsg(message); return; } let row = msg[0]; row.timestamp = ObjectUtil.timestampToLong(row.timestamp); patientClient.socketServer.sockets.emit('message', row); }); // 更新自身的聊天统计信息 StatsRepo.updatePrivateChatSummary(message.from, message.to, message.from, message.contentType, message.content, function (err, result) { if (err) log.error(err); }); // 更新对端的聊天统计信息 StatsRepo.updatePrivateChatSummary(message.to, message.from, message.from, message.contentType, message.content, function (err, result) { if (err) log.error(err); }); }); }; /** * 推送群组消息给居民 * * @param message */ pushGroupMessage(message) { let self = this; // 通过Web Socket推送给患者 let patientClient = clientCache.findById(message.to); if (!patientClient) { log.warn("User is not online, user id: ", message.to); //发送微信模板消息 self.sendConsultWechatReplyTempMsg(message); return; } GroupRepo.getOnGroupMsg(message.msgId, function (err, result) { if (err) { ModelUtil.emitError(self.eventEmitter, "get group msg info failed", err); } var msg = result ? result[0] : ""; if (msg) { patientClient.socketServer.sockets.emit('message', msg); } }) }; /** * 发送微信模板消息给居民 * * @param message */ sendConsultWechatReplyTempMsg(message) { let self = this; // 发送微信消息 function sendWxMessage(openid, name, consult) { var replyContent = message.content; switch (Number.parseInt(message.contentType)) { case CONTENT_TYPES.Image: replyContent = "[图片]"; break; case CONTENT_TYPES.Audio: replyContent = "[语音]"; break; case 0: case CONTENT_TYPES.Article: case CONTENT_TYPES.GoTo: case CONTENT_TYPES.TopicBegin: case CONTENT_TYPES.TopicEnd: return; default: break; } // 模板消息数据 var msg = { touser: openid, template_id: config.wechatConfig.template.consultTemplate, url: config.wechatConfig.baseUrl + "/wx/html/yszx/html/consulting-doctor.html?openid=" + openid + "&consult=" + consult.consult + "&toUser=" + message.to, data: { first: {value: "您的健康咨询有新的回复", color: "#000000"} , remark: {value: "", color: "#000000"} , keyword1: {value: consult.symptoms, color: "#000000"} , keyword2: {value: replyContent, color: "#000000"} , keyword3: {value: name, color: "#000000"} } }; // 发送模板消息 WechatClient.sendWxTemplateMessage(msg); } // 查询居民openid PatientRepo.findPatientOpenId(message.to, function (err, result) { if (err) { ModelUtil.emitError(self.eventEmitter, "get patient openid failed", err); return; } var openid = result && result.length > 0 ? result[0].openid : ""; if (openid) { // 查询医生信息 DoctorRepo.findOne(message.from, function (err, result) { if (err) { ModelUtil.emitError(self.eventEmitter, "get doctor info failed", err); return; } if (result && result.length > 0) { var name = result[0].name; if (message.group) { GroupRepo.getGroupConsultInfo(message.group, function (err, result) { if (err) { ModelUtil.emitError(self.eventEmitter, "get patient and doctor consult info failed", err); return; } var consult = result && result.length > 0 ? result[0] : ""; if (consult) { sendWxMessage(openid, name, consult); } }); } else { // 查询医生与居民对应的咨询信息 PatientRepo.getPatientDoctorConsult(message.to, message.from, function (err, result) { if (err) { ModelUtil.emitError(self.eventEmitter, "get patient and doctor consult info failed", err); return; } var consult = result && result.length > 0 ? result[0] : ""; if (consult) { sendWxMessage(openid, name, consult); } }); } } else { ModelUtil.emitError(self.eventEmitter, "can not find doctor info", err); } }); } else { ModelUtil.logError("patient does not bind wechat", err); } }); }; } module.exports = Patient;