Bläddra i källkod

Merge branch 'dev' of lyr/im.doctor into dev

linzhuo 8 år sedan
förälder
incheckning
e8f3e94848

+ 51 - 1
src/doctor/models/patient.js

@ -22,7 +22,10 @@ const CONTENT_TYPES = require('../include/commons').CONTENT_TYPE;
let clientCache = require('./socket.io/client.cache').clientCache();
class Patient extends BaseModel{
let doctorRepo = require('../repository/doctor.repo');
let wechatUtil = require('../util/wechatUtil');
class Patient extends BaseModel {
    constructor() {
        super();
    }
@ -80,6 +83,7 @@ class Patient extends BaseModel{
                let patientClient = clientCache.findById(message.to);
                if (!patientClient) {
                    log.warn("User is not online, user id: ", message.to);
                    self.sendConsultWechatReplyTempMsg(message);
                    return;
                }
@ -97,6 +101,52 @@ class Patient extends BaseModel{
            });
        });
    };
    /**
     * 发送微信模板消息给居民
     *
     * @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;

+ 8 - 0
src/doctor/repository/doctor.repo.js

@ -62,3 +62,11 @@ exports.updateStatus = function(userId, status, handler) {
        "handler": handler
    });
};
exports.getDoctorInfo = function (code, handler) {
    wlyyRepo.execQuery({
        "sql":"select code,name from wlyy_doctor where code = ? ",
        "args":[code],
        "handler":handler
    });
};

+ 10 - 0
src/doctor/repository/patient.repo.js

@ -16,4 +16,14 @@ exports.isPatientCode = function (code, handler) {
        "args": [],
        "handler": handler
    });
};
exports.getPatientOpenid = function (code, handler) {
    var sql = "select openid from wlyy_patient where code = ? ";
    wlyyDb.execQuery({
        "sql": sql,
        "args": [code],
        "handler": handler
    });
};

+ 34 - 0
src/doctor/repository/wechat.token.repo.js

@ -0,0 +1,34 @@
/**
 * 微信AccessToken
 *
 * Created by lyr-pc on 2016/11/25.
 */
"use strict";
var log = require('../util/log');
var wlyyDb = require('./database/wlyy.db');
/**
 * 获取微信AccessToken
 *
 * @param handler 回调函数
 */
exports.getAccessToken = function(handler) {
    wlyyDb.execQuery({
        "sql":"select p.* from wx_access_token p order by p.add_timestamp desc limit 0,1"
        ,"handler":handler
    });
};
/**
 * 保存AccessToken
 *
 * @param accessToken 微信AccessToken
 * @param hanlder 回调函数
 */
exports.saveAccessToken = function(accessToken,handler) {
    wlyyDb.execQuery({
        "sql":"insert into wx_access_token (access_token,add_timestamp,expires_in,czrq) values (?,?,?,?)"
        ,"args":accessToken
        ,"handler":handler
    });
}

+ 19 - 5
src/doctor/resources/config/config.dev.js

@ -40,10 +40,22 @@ let geTuiConfig = {
// AppStore版的推送App配置
let geTuiAppStoreCfg = {
    HOST : 'https://api.getui.com/apiex.htm',
    APPID : 'H6FYbDejks6VjMmW3uH7V6',
    APPKEY : '0PFWlKmLBN9YzhCfFWVgYA',
    MASTERSECRET : 'pvjCGtRZJx9SRVODkxc816'
    HOST: 'https://api.getui.com/apiex.htm',
    APPID: 'H6FYbDejks6VjMmW3uH7V6',
    APPKEY: '0PFWlKmLBN9YzhCfFWVgYA',
    MASTERSECRET: 'pvjCGtRZJx9SRVODkxc816'
};
// 微信配置
let wechatConfig = {
    appId: 'wxd03f859efdf0873d'
    , appSecret: '2935b54b53a957d9516c920a544f2537'
    , token: '27eb3bb24f149a7760cf1bb154b08040'
    , baseUrl: 'weixin.xmtyw.cn/wlyy'
    , template: {
        // 咨询回复模板
        consultTemplate: 'qSOW0DBxO3qEBm4ucG0Ial0jxsOyD7_f2TFK5e-mQEc'
    }
};
exports.app = 'IM.Server';
@ -59,4 +71,6 @@ exports.imDbConfig = imDbConfig;
exports.geTuiConfig = geTuiConfig;
exports.geTuiAppStoreCfg = geTuiAppStoreCfg;
exports.wlyyServerConfig = wlyyServerConfig;
exports.transServerConfig = transServerConfig;
exports.transServerConfig = transServerConfig;
exports.wechatConfig = wechatConfig;

+ 16 - 4
src/doctor/resources/config/config.prod.js

@ -26,10 +26,10 @@ let geTuiConfig = {
//AppStore版的推送App配置
let geTuiAppStoreCfg = {
    HOST : 'https://api.getui.com/apiex.htm',
    APPID : 'H6FYbDejks6VjMmW3uH7V6',
    APPKEY : '0PFWlKmLBN9YzhCfFWVgYA',
    MASTERSECRET : 'pvjCGtRZJx9SRVODkxc816'
    HOST: 'https://api.getui.com/apiex.htm',
    APPID: 'H6FYbDejks6VjMmW3uH7V6',
    APPKEY: '0PFWlKmLBN9YzhCfFWVgYA',
    MASTERSECRET: 'pvjCGtRZJx9SRVODkxc816'
};
// 三师后台
@ -44,6 +44,18 @@ let transServerConfig = {
    port: 3030
};
// 微信配置
let wechatConfig = {
    appId: 'wxad04e9c4c5255acf'
    , appSecret: 'ae77c48ccf1af5d07069f5153d1ac8d3'
    , token: '27eb3bb24f149a7760cf1bb154b08040'
    , baseUrl: 'www.xmtyw.cn/wlyy'
    , template: {
        // 咨询回复模板
        consultTemplate: '0mF_vHj-ILx8EH8DwzmAi7LqzjqYiU9IrSRRmziTZyc'
    }
};
exports.app = 'im.server';
exports.version = '1.2.5.20161107';
exports.debug = true;

+ 17 - 5
src/doctor/resources/config/config.test.js

@ -26,10 +26,10 @@ let geTuiConfig = {
//AppStore版的推送App配置
let geTuiAppStoreCfg = {
    HOST : 'https://api.getui.com/apiex.htm',
    APPID : 'H6FYbDejks6VjMmW3uH7V6',
    APPKEY : '0PFWlKmLBN9YzhCfFWVgYA',
    MASTERSECRET : 'pvjCGtRZJx9SRVODkxc816'
    HOST: 'https://api.getui.com/apiex.htm',
    APPID: 'H6FYbDejks6VjMmW3uH7V6',
    APPKEY: '0PFWlKmLBN9YzhCfFWVgYA',
    MASTERSECRET: 'pvjCGtRZJx9SRVODkxc816'
};
// 三师后台
@ -44,13 +44,25 @@ let transServerConfig = {
    port: 8000
};
// 微信配置
let wechatConfig = {
    appId: 'wx1f129f7b51701428'
    , appSecret: '988f005d8309ed1795939e0f042431fb'
    , token: '27eb3bb24f149a7760cf1bb154b08040'
    , baseUrl: 'ehr.yihu.com/wlyy'
    , template: {
        // 咨询回复模板
        consultTemplate: '-dr4QNyFoRvVsf8uWxXMC1dRyjwnbUuJwJ21vBLhf18'
    }
};
exports.app = 'im.server';
exports.version = '1.2.5.20161107';
exports.debug = true;
exports.serverPort = 3000;
exports.sessionExpire = 1800;
exports.showSQL= true;
exports.showSQL = true;
exports.wlyyDbConfig = wlyyDbConfig;
exports.imDbConfig = imDbConfig;

+ 149 - 0
src/doctor/util/wechatUtil.js

@ -0,0 +1,149 @@
/**
 * 微信工具类
 *
 * Created by lyr-pc on 2016/11/25.
 */
"use strict"
var log = require('./log');
var configFile = require('../include/commons').CONFIG_FILE;
var config = require('../resources/config/' + configFile);
var wxTokenRepo = require('../repository/wechat.token.repo.js');
var https = require('https');
/**
 * 发送微信模板消息
 *
 * @param message {"touser":"","template_id":"","url":"","data":{"firts":{"value":"","color":""}}}
 */
function sendWxTemplateMessage(message, handler) {
    getWxAccessToken(function (err, token) {
        if (err) {
            log.error("get access_token failed:" + err);
            return;
        }
        var opt = {
            host: 'api.weixin.qq.com',
            path: '/cgi-bin/message/template/send?access_token=' + token,
            method: 'POST'
        };
        var msg = JSON.stringify(message);
        log.info("sending wechat template message:" + msg);
        // 发送模板消息
        var req = https.request(opt, function (res) {
            res.setEncoding('utf8');
            var data = "";
            res.on('data', (d) => {
                data += d;
            });
            res.on('end', () => {
                var result = JSON.parse(data);
                if (result && result.errcode === 0) {
                    log.info("send wechat template message success:" + msg);
                    if (handler) {
                        handler(null, result);
                    }
                } else {
                    log.error("send wechat template message failed:" + msg);
                    if (handler) {
                        handler(result, null);
                    }
                }
            });
            res.on('error', function (err) {
                log.error('send wechat template message failed: ' + err.message);
                if (handler) {
                    handler(err, null);
                }
            });
        }).on('error', (e) => {
            log.error("send wechat template message failed:" + e.message);
            if (handler) {
                handler(e, null);
            }
        });
        req.end(msg);
    });
};
/**
 * 获取微信access_token
 *
 * @param handler 回调函数
 */
function getWxAccessToken(handler) {
    wxTokenRepo.getAccessToken(function (err, result) {
        if (err) {
            log.error("get wechat accessToken failed", err);
            return;
        }
        var data = result && result.length > 0 ? result[0] : null;
        var accessToken = "";
        if (data) {
            // 判断access_token是否有效
            if ((new Date().getTime() - data.add_timestamp) < (data.expires_in * 1000)) {
                accessToken = data.access_token;
            }
        }
        // access_token为空时从微信重新获取并执行回调,否则直接执行回调
        if (!accessToken) {
            var token_url = "https://api.weixin.qq.com/cgi-bin/token?";
            var params = "grant_type=client_credential&appid=" + config.wechatConfig.appId
                + "&secret=" + config.wechatConfig.appSecret;
            // 从微信获取access_token
            https.get(token_url + params, function (res) {
                var data = '';
                res.on('data', (d) => {
                    data += d;
                });
                res.on('end', () => {
                    data = data ? JSON.parse(data) : {};
                    if (data.access_token) {
                        accessToken = data.access_token;
                        var expiresIn = data.expires_in;
                        if (handler) {
                            // 执行回调
                            handler(null, accessToken);
                        }
                        var tokenData = [accessToken, new Date().getTime(), expiresIn, new Date()];
                        // 保存access_token
                        wxTokenRepo.saveAccessToken(tokenData, function (err, result) {
                            if (err) {
                                log.error("insert wechat access_token failed:" + err.message);
                            }
                        })
                    } else {
                        log.error("get wechat access_token failed:" + data);
                        if (handler) {
                            // 执行回调
                            handler(data, null);
                        }
                    }
                });
            }).on('error', (e) => {
                log.error("get wechat access_token from wechat failed:" + e.message);
                if (handler) {
                    // 执行回调
                    handler(e, null);
                }
            });
        } else {
            if (handler) {
                // 执行回调
                handler(null, accessToken);
            }
        }
    });
};
exports.sendWxTemplateMessage = sendWxTemplateMessage;
exports.getWxAccessToken = getWxAccessToken;