yeshijie 6 år sedan
förälder
incheckning
ed464b2961

+ 2 - 0
src/server/endpoints/url.initializer.js

@ -16,6 +16,7 @@ let socket = require('../controllers/socket');
// endpoints
let application = require('./v2/application.endpoint');
let message = require('./v2/message.endpoint');
let users = require('./v2/user.endpoint');
let sessions = require('./v2/session.endpoint');
let topics = require('./v2/topic.endpoint');
@ -51,6 +52,7 @@ class UrlInitializer {
        });
        app.use(APIv2.Application.Base, application);
        app.use(APIv2.Message.Base, message);
        app.use(APIv2.Management.Base, management);
        app.use(APIv2.Users.Base, users);
        app.use(APIv2.Sessions.Base, sessions);

+ 33 - 0
src/server/endpoints/v2/message.endpoint.js

@ -0,0 +1,33 @@
/**
 * 独立的发送消息接口
 */
"use strict";
let express = require('express');
let router = express.Router();
let ObjectUtil = require('../../util/object.util');
let ControllerUtil = require('../../util/controller.util');
let APIv2 = require('../../include/endpoints').APIv2;
let MODEL_EVENTS = require('../../include/commons').MODEL_EVENTS;
let Messages = require('../../models/messages/messages');
/**
 * 发送消息
 */
router.post(APIv2.Message.Send, function (req, res) {
    let payload = req.body;
    let testing = ObjectUtil.fieldsCheck(payload, "sender_id", "sender_name", "content_type", "content");
    if (!testing.pass) {
        throw {httpStatus: 406, message: testing.message}
    }
    // 消息的发送时间由服务端决定
    payload.timestamp = new Date((new Date().getTime()));
    let messages = new Messages();
    ControllerUtil.regModelEventHandler(messages, res);
    messages.sendMessage(payload);
});
module.exports = router;

+ 1 - 1
src/server/endpoints/v2/topic.endpoint.js

@ -84,7 +84,7 @@ router.get(APIv2.Sessions.TopicListByType,function (req,res) {
});
router.get(APIv2.Sessions.topicListCountByType,function (req,res) {
router.get(APIv2.Sessions.TopicListCountByType,function (req,res) {
    let user = req.query.user;
    let status = req.query.status;
    let type = req.query.type;

+ 6 - 1
src/server/include/endpoints.js

@ -13,6 +13,11 @@ const APIv2 = {
        Health: '/health',
        DbStatus: '/db'
    },
    Message: {
        Base: '/api/v2/message',
        Send: '/send'                                                  //发送消息,和会话无关,内外网通信
    },
    Users: {
        Base: '/api/v2/users',
@ -42,7 +47,7 @@ const APIv2 = {
        TopicList:'/topics',                                            //获取议题列表
        HealthTopicList:'/healthTopics',                                //健康咨询
        TopicListByType:'/topicListByType',                             //按类型查找咨询(未回复,进行中,已回复)
        topicListCountByType:'/topicListCountByType',                   //按类型查找咨询(未回复,进行中,已回复)的数量
        TopicListCountByType:'/topicListCountByType',                   //按类型查找咨询(未回复,进行中,已回复)的数量
        HealthTeamTopicList:'/healthTeamTopics',                        //健康咨询(区分团队)
        TopicReplyCount:"/topics/count/reply",                          //议题回复数统计
        TopicMessages:'/topic/:topic_id/messages',                      //议题消息

+ 41 - 0
src/server/models/messages/messages.js

@ -9,12 +9,16 @@ let SessionRepo = require('../../repository/mysql/session.repo');
let RedisClient = require('../../repository/redis/redis.client.js');
let ModelUtil = require('../../util/model.util');
var ObjectUtil = require("../../util/object.util.js");
let WechatClient = require("../client/wechat.client.js");
let AppClient = require("../client/app.client.js");
let mongoose = require('mongoose');
let redis = RedisClient.redisClient().connection;
let log = require('../../util/log.js');
let configFile = require('../../include/commons').CONFIG_FILE;
let config = require('../../resources/config/' + configFile);
let logger = require('../../util/log');
let pubSub = require("../redis/pubSub.js");
const REDIS_KEYS = require('../../include/commons').REDIS_KEYS;
@ -152,6 +156,43 @@ class Messages extends RedisModel {
    /**
     * 内外网通信。
     * 消息内容 存系统表
     * @param message
     */
    sendMessage(message) {
        let self = this;
        let messages = new Messages();
        let messageId = mongoose.Types.ObjectId().toString();
        let sessionType =0;
        message.id = messageId;
        message.session_id = "system";
        messages.saveMessageToMysql("system", sessionType, messageId, message, function (err, res) {
            if (err) {
                ModelUtil.emitError(self.eventEmitter, {message: "Failed to save message to mysql: " + err});
            } else {
                message.timestamp = message.timestamp.getTime();
                let targetUserId = message.sender_name;
                //告知医生新消息
                WechatClient.sendSocketMessageToDoctor(targetUserId,message);
                if(config.environment!='local'){//pc版不推送个推,通过redis的publish
                    AppClient.sendNotification(targetUserId, message,sessionType,1);
                }
                //外网pcim通过socket推送
                WechatClient.sendPcImSocket(targetUserId,message,sessionType);
                //redis发布消息
                if(config.pubSubSwitch) {//接收订阅消息处理开关,本地运行和测试库单独运行时防止用户接收消息2次
                    pubSub.publish(config.pubChannel,JSON.stringify(message));
                }
                ModelUtil.emitOK(self.eventEmitter, {status: 200});
            }
        });
    }
    /**
     * 保存Message 到mysql
     * @param message 消息对象

+ 0 - 3
src/server/models/sessions/sessions.js

@ -1504,9 +1504,6 @@ class Sessions extends RedisModel {
        }
    }
    static getMessagesBySessionId(){
    }
    sendTopicMessages(topicId, message) {
        let self = this;

+ 3 - 3
src/server/repository/mysql/search.repo.js

@ -24,7 +24,7 @@ class SearchRepo {
            " UNION " +
            "SELECT s.id " +
            "FROM sessions s, participants p " +
            "WHERE p.participant_id = ? AND p.session_id = s.id AND s.`type` IN (2, 3)";
            "WHERE p.participant_id = ? AND p.session_id = s.id AND s.`type` IN (2, 3, 4)";
        ImDb.execQuery({
            sql: sql,
@ -46,7 +46,7 @@ class SearchRepo {
            " UNION " +
            "SELECT s.id " +
            "FROM sessions s, participants p " +
            "WHERE p.participant_id = ? AND p.session_id = s.id  AND s.`type` IN (2,3)  and s.id not in(" +
            "WHERE p.participant_id = ? AND p.session_id = s.id  AND s.`type` IN (2,3,4)  and s.id not in(" +
            " select DISTINCT p1.session_id from  participants p1 ,topics t where p1.participant_id = ? and  t.session_id = p1.session_id  " +
            ") ";
        ImDb.execQuery({
@ -141,7 +141,7 @@ class SearchRepo {
        let sql = "SELECT * FROM(" +
            "SELECT s.id, s.name, s.type, s.create_date, s.business_type,GROUP_CONCAT(u. NAME) as participant_name " +
            "FROM sessions s,  doctors u ,participants p " +
            "WHERE s.id IN (?) and s.type in (3,5) AND s.id = p.session_id AND p.participant_id = u.id and p.participant_id<>? AND (u.name like ? or s.name like ?) group by s.id " +
            "WHERE s.id IN (?) and s.type in (3,4) AND s.id = p.session_id AND p.participant_id = u.id and p.participant_id<>? AND (u.name like ? or s.name like ?) group by s.id " +
            ") X LIMIT ?, ?";
        keyword = '%' + keyword + '%';