|
@ -7,9 +7,9 @@ let RedisClient = require('../../repository/redis/redis.client');
|
|
|
let RedisModel = require('../redis.model');
|
|
|
let ObjectUtil = require("../../util/object.util.js");
|
|
|
let ModelUtil = require('../../util/model.util');
|
|
|
let DoctorRepo = require('../../repository/mysql/doctor.repo');
|
|
|
let WechatSDK = require('../../util/wechat.sdk');
|
|
|
let PatientRepo = require('../../repository/mysql/patient.repo');
|
|
|
let TopicRepo = require("../../repository/mysql/topics.repo.js");
|
|
|
|
|
|
let redisConn = RedisClient.redisClient().connection;
|
|
|
let clientCache = require('../socket.io/client.cache').clientCache();
|
|
@ -17,6 +17,7 @@ let configFile = require('../../include/commons').CONFIG_FILE;
|
|
|
let config = require('../../resources/config/' + configFile);
|
|
|
let log = require("../../util/log.js");
|
|
|
let https = require('https');
|
|
|
let async = require('async');
|
|
|
|
|
|
const CONTENT_TYPES = require('../../include/commons').CONTENT_TYPES;
|
|
|
const REDIS_KEYS = require('../../include/commons').REDIS_KEYS;
|
|
@ -38,7 +39,7 @@ class WechatClient extends RedisModel {
|
|
|
if (status == null) {
|
|
|
PatientRepo.findWechatOpenId(userId, handler);
|
|
|
} else {
|
|
|
handler(null, {open_id: status.open_id});
|
|
|
handler(null, {openid: status.openid});
|
|
|
}
|
|
|
})
|
|
|
.catch(function (err) {
|
|
@ -49,95 +50,119 @@ class WechatClient extends RedisModel {
|
|
|
/**
|
|
|
* 向微信端用户发送消息。若用户微信端在线,通过Web Socket推送给患者,如果不在线则通过微信的模板消息。
|
|
|
*
|
|
|
* @param targetUserId
|
|
|
* @param message 消息
|
|
|
*/
|
|
|
static sendMessage(message) {
|
|
|
let patientClient = clientCache.findById(message.to);
|
|
|
static sendMessage(targetUserId, message) {
|
|
|
let patientClient = clientCache.findById(targetUserId);
|
|
|
|
|
|
if (patientClient) {
|
|
|
WechatClient.sendViaWebSocket(patientClient.socket, message);
|
|
|
} else {
|
|
|
log.info("User of wechat endpoint is not online, user id: ", message.to, ", sending via wechat template message.");
|
|
|
log.info("User's wechat endpoint is not online, sending via wechat template message. User id: ", targetUserId);
|
|
|
|
|
|
WechatClient.sendViaTemplateMessage(message);
|
|
|
WechatClient.sendViaTemplateMessage(targetUserId, message);
|
|
|
}
|
|
|
};
|
|
|
|
|
|
static sendViaWebSocket(socket, message){
|
|
|
message.timestamp = ObjectUtil.timestampToLong(message.timestamp);
|
|
|
socket.emit('message', message);
|
|
|
static sendViaWebSocket(socket, message) {
|
|
|
socket.emit('message', {
|
|
|
id: message.id,
|
|
|
session_id: message.session_id,
|
|
|
sender_id: message.sender_id,
|
|
|
sender_name: message.sender_name,
|
|
|
content_type: message.content_type,
|
|
|
content: message.content,
|
|
|
timestamp: ObjectUtil.timestampToLong(message.timestamp)
|
|
|
});
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 发送微信模板消息给居民
|
|
|
*
|
|
|
* @param targetUserId
|
|
|
* @param message
|
|
|
*/
|
|
|
static sendViaTemplateMessage(message) {
|
|
|
function sendWxMessage(openid, name, topic) {
|
|
|
let 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;
|
|
|
}
|
|
|
|
|
|
// 发送模板消息
|
|
|
WechatSDK.sendTemplateMessage({
|
|
|
touser: openid,
|
|
|
template_id: config.wechatConfig.template.consultTemplate,
|
|
|
url: config.wechatConfig.baseUrl + "/wx/html/yszx/html/consulting-doctor.html?openid=" + openid +
|
|
|
"&consult=" + topic.name + "&toUser=" + message.to,
|
|
|
data: {
|
|
|
first: {value: "您的健康咨询有新的回复", color: "#000000"}
|
|
|
, remark: {value: "", color: "#000000"}
|
|
|
, keyword1: {value: topic.description, color: "#000000"}
|
|
|
, keyword2: {value: replyContent, color: "#000000"}
|
|
|
, keyword3: {value: name, color: "#000000"}
|
|
|
}
|
|
|
});
|
|
|
}
|
|
|
static sendViaTemplateMessage(targetUserId, message) {
|
|
|
async.waterfall([
|
|
|
// 获取微信openid
|
|
|
function (callback) {
|
|
|
PatientRepo.findWechatOpenId(targetUserId, function (err, result) {
|
|
|
if (err) {
|
|
|
ModelUtil.logError("Get wechat openid failed", err);
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
// 查询微信OpenId及医生信息,用于构建微信模板消息
|
|
|
PatientRepo.findWechatOpenId(message.to, function (err, result) {
|
|
|
if (err) {
|
|
|
ModelUtil.logError("Get wechat openid failed", err);
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
let openid = result && result.length > 0 ? result[0].openid : "";
|
|
|
if (openid) {
|
|
|
DoctorRepo.findOne(message.from, function (err, result) {
|
|
|
if (err) {
|
|
|
ModelUtil.logError("Get doctor info failed", err);
|
|
|
return;
|
|
|
}
|
|
|
let openid = result && result.length > 0 ? result[0].openid : null;
|
|
|
if (!openid) {
|
|
|
ModelUtil.logError("User haven't bound with wechat, user id: " + targetUserId);
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
callback(null, openid);
|
|
|
});
|
|
|
},
|
|
|
// 获取议题信息
|
|
|
function (openid, callback) {
|
|
|
TopicRepo.findLastTopicStatus(message.session_id, function (err, res) {
|
|
|
if (err) {
|
|
|
ModelUtil.logError("Get topic failed", err);
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
if (result && result.length > 0) {
|
|
|
let name = result[0].name;
|
|
|
let topic = result && result.length > 0 ? result[0] : "";
|
|
|
if (topic) {
|
|
|
sendWxMessage(openid, name, topic);
|
|
|
if (!res || res.length == 0) {
|
|
|
ModelUtil.logError("Unable to find session last topic");
|
|
|
return;
|
|
|
}
|
|
|
} else {
|
|
|
ModelUtil.logError("Can not find user info", err);
|
|
|
|
|
|
callback(null, openid, message.sender_name, res[0]);
|
|
|
});
|
|
|
},
|
|
|
// 发送消息
|
|
|
function (openid, senderName, topic, callback) {
|
|
|
let 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;
|
|
|
}
|
|
|
});
|
|
|
} else {
|
|
|
ModelUtil.logError("User haven't bound with wechat, user id: " + message.to, err);
|
|
|
}
|
|
|
});
|
|
|
|
|
|
// 发送模板消息
|
|
|
WechatSDK.sendTemplateMessage({
|
|
|
touser: openid,
|
|
|
template_id: config.wechatConfig.template.consultTemplate,
|
|
|
url: config.wechatConfig.baseUrl + "/wx/html/yszx/html/consulting-doctor.html?openid=" + openid +
|
|
|
"&consult=" + topic.name + "&toUser=" + targetUserId,
|
|
|
data: {
|
|
|
first: {value: "您的健康咨询有新的回复", color: "#000000"}
|
|
|
, remark: {value: "", color: "#000000"}
|
|
|
, keyword1: {value: topic.description, color: "#000000"}
|
|
|
, keyword2: {value: replyContent, color: "#000000"}
|
|
|
, keyword3: {value: senderName, color: "#000000"}
|
|
|
}
|
|
|
}, function (err, res) {
|
|
|
err ? log.error(err) : log.info(res);
|
|
|
});
|
|
|
|
|
|
callback(null, null);
|
|
|
}
|
|
|
],
|
|
|
function (err, res) {
|
|
|
if (!err) {
|
|
|
log.info("Send via wechat template message, DONE!");
|
|
|
}
|
|
|
});
|
|
|
};
|
|
|
}
|
|
|
|