/** * 用户微信客户端。 */ "use strict"; 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 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(); 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; class WechatClient extends RedisModel { constructor() { super(); } /** * 取得用户微信端状态。若Redis中找不到,则从MySQL中查找。 * * @param userId * @param handler */ static getWechatStatus(userId, handler) { redisConn.hgetallAsync(RedisModel.makeRedisKey(REDIS_KEYS.UserWechatStatus, userId)) .then(function (status) { if (status == null) { PatientRepo.findWechatOpenId(userId, handler); } else { handler(null, {openid: status.openid}); } }) .catch(function (err) { handler(err, null); }); } /** * 向微信端用户发送消息。若用户微信端在线,通过Web Socket推送给患者,如果不在线则通过微信的模板消息。 * * @param targetUserId * @param message 消息 */ static sendMessage(targetUserId, message) { let patientClient = clientCache.findById(targetUserId); if (patientClient) { WechatClient.sendViaWebSocket(patientClient.socket, message); } else { log.info("User's wechat endpoint is not online, sending via wechat template message. User id: ", targetUserId); WechatClient.sendViaTemplateMessage(targetUserId, 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(targetUserId, message) { async.waterfall([ // 获取微信openid function (callback) { PatientRepo.findWechatOpenId(targetUserId, function (err, result) { if (err) { ModelUtil.logError("Get wechat openid 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 (!res || res.length == 0) { ModelUtil.logError("Unable to find session last topic"); return; } 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; } // 发送模板消息 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!"); } }); }; } module.exports = WechatClient;