123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225 |
- /**
- * 患者模型。
- */
- "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/wechat.client/wechat.client');
- let Doctor = require('../../models/user/doctor');
- let DoctorRepo = require('../../repository/mysql/doctor.repo');
- let GroupRepo = require('../../repository/mysql/group.repo');
- let PatientRepo = require('../../repository/mysql/patient.repo');
- let StatsRepo = require("../../repository/mysql/stats.msg.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.getPatientOpenid(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;
|