/** * 患者模型。 */ "use strict"; let configFile = require('../include/commons').CONFIG_FILE; let config = require('../resources/config/' + configFile); let log = require("../util/log.js"); let BaseModel = require('./base.model'); let patientRepo = require('../repository/patient.repo'); let statsRepo = require("../repository/stats.msg.repo.js"); let pmRepo = require('../repository/private.msg.repo'); let objectUtil = require("../util/objectUtil.js"); let modelUtil = require('../util/modelUtil'); let Doctor = require('../models/doctor'); const CONTENT_TYPES = require('../include/commons').CONTENT_TYPE; let clientCache = require('./socket.io/client.cache').clientCache(); let doctorRepo = require('../repository/doctor.repo'); let wechatUtil = require('../util/wechatUtil'); class Patient extends BaseModel { constructor() { super(); } /** * 是否为患者代码。 * * @param code * @param passedCallback 测试通过回调 * @param failedCallback 测试失败回调 */ static isPatientCode(code, passedCallback, failedCallback) { patientRepo.isPatientCode(code, function (err, result) { if (err) { log.error('Send message to patient failed: ', err); return; } if (result[0].c > 0) { passedCallback(); } else { failedCallback(); } }); } /** * 向患者发送消息。 * * 注意:患者消息的保存发送与医生的实现不同。 * * @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.emitDbError(self.eventEmitter, 'Save private message failed', err); return; } // 结束网络连接,后续操作继续执行 pmRepo.findOneMessage(result.insertId, function (err, msg) { if (err) { modelUtil.emitDbError(self.eventEmitter, 'Save private message success, but return last message failed', err); return; } modelUtil.emitData(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; } patientClient.socketServer.sockets.emit('message', message); }); // 更新自身的聊天统计信息 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 */ sendConsultWechatReplyTempMsg(message) { // 推送微信模板消息 patientRepo.getPatientOpenid(message.to, function (err, result) { if (err) { modelUtil.emitDbError(self.eventEmitter, "get patient openid failed", err); return; } var openid = result && result.length > 0 ? result[0].openid : ""; if (openid) { doctorRepo.getDoctorInfo(message.from, function (err, result) { if (err) { modelUtil.emitDbError(self.eventEmitter, "get doctor info failed", err); return; } if (result && result.length > 0) { var name = result[0].name; var msg = { touser: openid, template_id: config.wechatConfig.template.consultTemplate, url: config.wechatConfig.baseUrl + "/wx/html/yszx/html/consulting-doctor.html?openid=" + openid + "&consult=" + "" + "&toUser=" + message.to, data: { first: {value: "您的健康咨询有新的回复", color: "#000000"} , remark: {value: "", color: "#000000"} , keyword1: {value: "XXXX咨询", color: "#000000"} , keyword2: {value: "XXXX回复", color: "#000000"} , keyword3: {value: name, color: "#000000"} } }; wechatUtil.sendWxTemplateMessage(msg); } }); } else { modelUtil.logError("patient does not bind wechat", err); } }); }; } module.exports = Patient;