Browse Source

整理URL;增加APIv1的禁止访问提示

Sand Wen 8 năm trước cách đây
mục cha
commit
73549a95f7

+ 1 - 1
readme.md

@ -76,7 +76,7 @@ IM提供了开发SDK,一个JS脚本。客户端可以通过引用此脚本或
## 工程结构
- 消息流: 首先要明白即时消息的流程,有助于理解整个过程。医生端的IM仅关注医生部分,即下图中蓝色标注的内容。
- 消息流: 首先要明白即时消息的流程,有助于理解整个过程。
![IM活动图](./doc/images/activity.png)

+ 0 - 149
src/doctor/include/commons.js

@ -1,149 +0,0 @@
/**
 * 此文件内容为常用的系统枚举及变量。
 */
/**
 * 系统部署时的配置文件。
 *
 * @type {string}
 */
"use strict";
let configFile = "config.";
if (process.env.IM_PROFILE === "prod") {
    configFile += "prod";
} else if (process.env.IM_PROFILE === "test") {
    configFile += "test";
} else {
    configFile += "dev";
}
exports.CONFIG_FILE = configFile;
/**
 * 会话类型
 */
const SESSION_TYPES = {
    SYSTEM: 0,          // 系统会话
    MUC: 1,             // MUC会话
    P2P: 2,             // P2P
    GROUP: 3,           // 固定组
    DISCUSSION: 4       // 临时讨论组
};
exports.SESSION_TYPES = SESSION_TYPES;
/**
 *  消息内容类型。
 */
exports.CONTENT_TYPE = {
    PlainText: 1,   // 信息
    Image: 2,       // 图片信息
    Audio: 3,       // 语音信息
    Article: 4,     // 文章信息
    GoTo: 5,        // 跳转信息
    TopicBegin: 6,  // 议题开始
    TopicEnd: 7     // 议题结束
};
/**
 * 客户端平台。
 */
exports.PLATFORM = {
    iOS: 0,
    Android: 1,
    Wechat: 10
};
/**
 * 组类型。
 */
exports.GROUP_TYPE = {
    AdminTeam: 1,
    DiscussionGroup: 2
};
/**
 * 模型事件。
 *
 * @type {{Error: string, DataNotFound: string, OK: string}}
 */
exports.MODEL_EVENTS = {
    Error: "error",                 // 数据库访问出错
    DataNotFound: "no_data",        // 找不到指定的数据
    OK: "ok"                        // 操作结束或有数据返回
};
/**
 * 整型最大值。
 */
exports.MAX_INT = 9007199254740992;
/**
 * 置顶会话基础分值,以此为下限向上递增。
 */
exports.STICKY_SESSION_BASE_SCORE = 9000000000000;
/**
 * 默认分页大小。
 */
exports.DEFAULT_PAGE_SIZE = 100;
/**
 * Redis Key列表与占位符。
 */
const REDIS_KEY_REPLACER = "{id}";
exports.REDIS_KEY_REPLACER = REDIS_KEY_REPLACER;
exports.REDIS_KEYS = {
    Users: "users:",
    User: "users:" + REDIS_KEY_REPLACER,
    UserAppStatus: "users:" + REDIS_KEY_REPLACER + ":app_status",
    UserWechatStatus: "users:" + REDIS_KEY_REPLACER + ":wechat_status",
    UserSessions: "users:" + REDIS_KEY_REPLACER + ":sessions",
    Sessions: "sessions:",
    Session: "sessions:" + REDIS_KEY_REPLACER,
    Participants: "participants:" + REDIS_KEY_REPLACER,
    ParticipantsRole: "participants:" + REDIS_KEY_REPLACER + ":role",
    Topics: "sessions:" + REDIS_KEY_REPLACER + ":topics",
    Topic: "topics:" + REDIS_KEY_REPLACER,
    Messages: "sessions:" + REDIS_KEY_REPLACER + ":messages",
    MessagesByTimestamp: "sessions:" + REDIS_KEY_REPLACER + ":messages_by_timestamp"
};
exports.DB_TABLES = {
    P2pMessages: "p2p_messages",
    MucMessages: "muc_messages",
    GroupMessages: "group_messages",
    DiscussionMessages: "discussion_messages",
    SystemMessages: "system_messages",
    Participants: "participants",
    Sessions: "sessions",
    Topics: "topics",
    StickySessions: "sticky_sessions",
    sessionTypeToTableName: function (sessionType) {
        switch (sessionType) {
            case SESSION_TYPES.SYSTEM:
                return DB_TABLES.SystemMessages;
            case SESSION_TYPES.MUC:
                return DB_TABLES.MucMessages;
            case SESSION_TYPES.P2P:
                return DB_TABLES.P2pMessages;
            case SESSION_TYPES.GROUP:
                return DB_TABLES.GroupMessages;
            case SESSION_TYPES.DISCUSSION:
                return DB_TABLES.DiscussionMessages;
            default:
                throw {message: "Unknown session type"};
        }
    }
};

+ 0 - 775
src/doctor/models/doctor.js

@ -1,775 +0,0 @@
/**
 * 医生模型。
 */
"use strict";
let log = require("../../util/log.js");
let getui = require('getui');
let RedisModel = require('./../redis.model');
let Schedule = require("./../schedule/schedule.js");
let DoctorRepo = require('../../repository/mysql/doctor.repo.js');
let GroupMsgRepo = require('../../repository/mysql/group.msg.repo');
let PrivateMsgRepo = require('../../repository/mysql/private.msg.repo');
let NotifyMsgRepo = require("../../repository/mysql/notify.msg.repo");
let SystemMsgRepo = require("../../repository/mysql/system.msg.repo.js");
let StatsRepo = require("../../repository/mysql/stats.msg.repo");
let ObjectUtil = require("../../util/object.util.js");
let ModelUtil = require('../../util/model.util');
const CONTENT_TYPES = require('../../include/commons').CONTENT_TYPE;
const PLATFORMS = require('../../include/commons').PLATFORM;
const MAX_INT = require('../../include/commons').MAX_INT;
class Doctor extends RedisModel {
    constructor(doctorId) {
        super();
        this._id = doctorId;
    }
    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;
        PrivateMsgRepo.save(message.to, message.from, message.contentType, tempContent, function (err, result) {
            if (err) {
                ModelUtil.emitDbError(self.eventEmitter, 'Save private message failed', err);
                return;
            }
            // 返回新插入的消息数据,并推送
            PrivateMsgRepo.findOneMessage(result.insertId, function (err, msg) {
                if (err) {
                    ModelUtil.emitDbError(self.eventEmitter, 'Save private message success, but return last message failed', err);
                    return;
                }
                // 先结束网络连接,再推送给客户端
                ModelUtil.emitData(self.eventEmitter, Doctor.fillMessages(msg));
                Doctor.pushMessage(message, 'p2p_msg');
            });
            // 更新自身的聊天统计信息
            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
     */
    sendSystemMessage(message) {
        let self = this;
        SystemMsgRepo.save(message.to,
            message.contentType,
            message.title,
            message.summary,
            message.content,
            function (err, result) {
                if (err) {
                    ModelUtil.emitDbError(self.eventEmitter, "Save system message failed", err);
                    return;
                }
                // 先结束网络连接,再推送给客户端
                ModelUtil.emitData(self.eventEmitter, {});
                Doctor.pushMessage(message, 'system_msg');
            });
    }
    /**
     * 推送消息。
     *
     * @param message
     * @param channel
     */
    static pushMessage(message, channel){
        DoctorRepo.getUserStatus(message.to, function (err, result) {
            if (err) {
                log.error('Lookup notify message receiver failed: ' + message.to);
                return;
            }
            if (result.length == 0) {
                log.warn('Notify message receiver is not found: ', message.to);
                return;
            }
            let userStatus = result[0];
            let isOnline = result.length > 0 && userStatus.is_online === 1;
            let delay = null;
            // 构建通知消息
            let notifyMessage = {type: channel, data: message.content};
            if (message.from) notifyMessage.from_uid = message.from;
            if (message.gid) notifyMessage.gid = message.gid;
            if (message.delay && message.delay !== "null") delay = new Date(Date.parse(message.delay));
            let title = '新消息';
            let content = message.content;
            if (message.contentType === CONTENT_TYPES.Image) {
                content = '[图片]';
            } else if (message.contentType === CONTENT_TYPES.Audio) {
                content = '[语音]';
            } else if (message.contentType > 3) {
                content = '您有一条新消息';
            }
            // 保存通知消息到数据库中,并根据用户在线状态推送此消息
            NotifyMsgRepo.save(message.to, message.contentType, title, content, JSON.stringify(notifyMessage), isOnline, delay, function (err, result) {
                if (err) {
                    log.error('Save notify message failed, ', err);
                    return;
                }
                if (delay) {
                    Schedule.dateSchedule(delay, function (message, client_id, status, token, title, content, notifyMessage, platform) {
                        Doctor.pushToClient(message.to, client_id, status, token, message.contentType,
                            title, content, notifyMessage, platform, function (err, result) {
                                if (err != null) {
                                    log.error(err);
                                } else {
                                    log.info(result);
                                }
                            });
                    }.bind(null, message, userStatus.client_id, userStatus.status, userStatus.token, title, content, notifyMessage, userStatus.platform));
                } else if (isOnline) {
                    Doctor.pushToClient(message.to, userStatus.client_id, userStatus.status, userStatus.token, message.contentType,
                        title, content, notifyMessage, userStatus.platform, function (err, result) {
                            if (err != null) {
                                log.error(err);
                            } else {
                                log.info(result);
                            }
                        });
                }
            });
        });
    }
    /**
     * 推送消息给医生客户端。
     *
     * @param userId            用户ID
     * @param clientId          客户端设备ID
     * @param appStatus         客户端App状态
     * @param token
     * @param contentType
     * @param title
     * @param content
     * @param notifyMessage
     * @param platform
     * @param handler
     */
    static pushToClient(userId, clientId, appStatus, token, contentType, title, content, notifyMessage, platform, handler) {
        if (platform === PLATFORMS.iOS) {
            getui.pushAPN(userId, token, contentType, title, content, notifyMessage, handler);
        } else if (platform === PLATFORMS.Android) {
            getui.pushAndroid(clientId, contentType, title, content, notifyMessage, appStatus, handler);
        }
    }
    /**
     * 获取最近聊天的用户,组。
     */
    getRecentChatList(userId, days) {
        let self = this;
        StatsRepo.getRecentChats(userId, days, function (err, rows) {
            if (err) {
                ModelUtil.emitDbError(self.eventEmitter, 'Get recent chat objects failed', err);
                return;
            }
            let data = {patients: [], doctors: [], groups: []};
            if (rows.length > 0) {
                for (let i = 0; i < rows.length; ++i) {
                    let row = rows[i];
                    if (row.type.indexOf('patient') > -1) {
                        data.patients.push({
                            code: row.code,
                            name: row.name,
                            birthday: row.birthday === null ? "" : row.birthday,
                            sex: row.sex,
                            avatar: row.photo === null ? "" : row.photo
                        });
                    } else if (row.type.indexOf('doctor') > -1) {
                        data.doctors.push({
                            code: row.code,
                            name: row.name,
                            birthday: row.birthday === null ? "" : row.birthday,
                            sex: row.sex,
                            avatar: row.photo === null ? "" : row.photo
                        });
                    } else if (row.type.indexOf('group') > -1) {
                        data.groups.push({
                            code: row.code,
                            name: row.name
                        });
                    }
                }
            }
            ModelUtil.emitData(self.eventEmitter, data);
        });
    }
    /**
     * 获取参与的聊天列表,包括:点对点,参与的讨论组,系统消息等。
     *
     * @param userId
     */
    getChatList(userId) {
        let self = this;
        // 与患者的私信
        PrivateMsgRepo.findAllP2PWithPatient(userId, function (err, patients) {
            if (err) {
                ModelUtil.emitDbError(self.eventEmitter, 'Get chat list with patient failed', err);
                return;
            }
            let chats = {patients: [], doctors: [], groups: []};
            for (let i = 0; i < patients.length; i++) {
                let patient = patients[i];
                chats.patients.push({
                    code: patient.code,
                    name: patient.name,
                    birthday: patient.birthday,
                    sex: patient.sex,
                    avatar: patient.photo == null ? "" : patient.photo,
                    newMessageCount: patient.new_msg_count,
                    lastContentType: patient.last_content_type,
                    lastContent: patient.last_content,
                    timestamp: ObjectUtil.timestampToLong(patient.timestamp)
                });
            }
            // 含有患者的群
            GroupMsgRepo.findAllGroupsWithPatient(userId, function (err, groups) {
                if (err) {
                    ModelUtil.emitDbError(self.eventEmitter, 'Get group list with patient failed', err);
                    return;
                }
                for (let i = 0; i < groups.length; i++) {
                    let group = groups[i];
                    // 过滤掉医生间的求助团队
                    if (group.group_type === 2) continue;
                    chats.groups.push({
                        code: group.code,
                        name: group.name,
                        groupType: group.msg_type,
                        newMessageCount: group.new_msg_count,
                        lastContentType: group.last_content_type,
                        lastContent: group.last_content,
                        timestamp: ObjectUtil.timestampToLong(group.timestamp)
                    });
                }
                // 医生间的私聊
                PrivateMsgRepo.findAllP2PWithDoctor(userId, function (err, doctors) {
                    if (err) {
                        ModelUtil.emitDbError(self.eventEmitter, 'Get chat list with doctor failed', err);
                        return;
                    }
                    for (let i = 0; i < doctors.length; i++) {
                        let doctor = doctors[i];
                        chats.doctors.push({
                            code: doctor.code,
                            name: doctor.name,
                            sex: doctor.sex,
                            avatar: doctor.photo === null ? "" : doctor.photo,
                            newMessageCount: doctor.new_msg_count,
                            lastContentType: doctor.last_content_type,
                            lastContent: doctor.last_content,
                            timestamp: ObjectUtil.timestampToLong(doctor.timestamp)
                        });
                    }
                    // 获取医生间的组
                    GroupMsgRepo.findAllGroupsWithDoctor(userId, function (err, groups) {
                        if (err) {
                            ModelUtil.emitDbError(self.eventEmitter, 'Get group list with doctor failed', err);
                            return;
                        }
                        for (let i = 0; i < groups.length; i++) {
                            let group = groups[i];
                            chats.groups.push({
                                code: group.code,
                                name: group.name,
                                groupType: group.group_type, // 行政团队 or 求助
                                newMessageCount: group.new_msg_count,
                                lastContentType: group.last_content_type,
                                lastContent: group.last_content,
                                timestamp: ObjectUtil.timestampToLong(group.timestamp)
                            });
                        }
                        ModelUtil.emitData(self.eventEmitter, chats);
                    });
                });
            })
        });
    }
    /**
     * 获取与患者的聊天列表。
     */
    getChatsListWithPatient(userId) {
        let self = this;
        PrivateMsgRepo.findAllP2PWithPatient(userId, function (err, patients) {
            if (err) {
                ModelUtil.emitDbError(self.eventEmitter, 'Get chat list with patient failed', err);
                return;
            }
            let chats = {patients: [], groups: []};
            for (let i = 0; i < patients.length; i++) {
                let patient = patients[i];
                chats.patients.push({
                    code: patient.code,
                    name: patient.name,
                    birthday: patient.birthday,
                    sex: patient.sex,
                    avatar: patient.photo == null ? "" : patient.photo,
                    newMessageCount: patient.new_msg_count,
                    lastContentType: patient.last_content_type,
                    lastContent: patient.last_content,
                    timestamp: ObjectUtil.timestampToLong(patient.timestamp)
                });
            }
            GroupMsgRepo.findAllGroupsWithPatient(userId, function (err, groups) {
                if (err) {
                    ModelUtil.emitDbError(self.eventEmitter, 'Get group list with patient failed', err);
                    return;
                }
                for (let i = 0; i < groups.length; i++) {
                    let group = groups[i];
                    // 过滤掉医生间的求助团队
                    if (group.group_type === 2) continue;
                    chats.groups.push({
                        code: group.code,
                        name: group.name,
                        groupType: group.msg_type,
                        newMessageCount: group.new_msg_count,
                        lastContentType: group.last_content_type,
                        lastContent: group.last_content,
                        timestamp: ObjectUtil.timestampToLong(group.timestamp)
                    });
                }
                ModelUtil.emitData(self.eventEmitter, chats);
            })
        });
    }
    /**
     * 获取与医生的聊天列表,包括:点对点,参与的讨论组。
     *
     * @param userId
     */
    getChatListWithDoctor(userId) {
        let self = this;
        // 先获取医生间的私聊
        PrivateMsgRepo.findAllP2PWithDoctor(userId, function (err, doctors) {
            if (err) {
                ModelUtil.emitDbError(self.eventEmitter, 'Get chat list with doctor failed', err);
                return;
            }
            let chats = {doctors: [], groups: []};
            for (let i = 0; i < doctors.length; i++) {
                let doctor = doctors[i];
                chats.doctors.push({
                    code: doctor.code,
                    name: doctor.name,
                    sex: doctor.sex,
                    avatar: doctor.photo === null ? "" : doctor.photo,
                    newMessageCount: doctor.new_msg_count,
                    lastContentType: doctor.last_content_type,
                    lastContent: doctor.last_content,
                    timestamp: ObjectUtil.timestampToLong(doctor.timestamp)
                });
            }
            // 再获取医生间的组
            GroupMsgRepo.findAllGroupsWithDoctor(userId, function (err, groups) {
                if (err) {
                    ModelUtil.emitDbError(self.eventEmitter, 'Get group list with doctor failed', err);
                    return;
                }
                for (let i = 0; i < groups.length; i++) {
                    let group = groups[i];
                    chats.groups.push({
                        code: group.code,
                        name: group.name,
                        groupType: group.group_type, // 行政团队 or 求助
                        newMessageCount: group.new_msg_count,
                        lastContentType: group.last_content_type,
                        lastContent: group.last_content,
                        timestamp: ObjectUtil.timestampToLong(group.timestamp)
                    });
                }
                ModelUtil.emitData(self.eventEmitter, chats);
            });
        });
    }
    /**
     * 获取与医生,患者的聊天列表,包括:点对点,参与的讨论组。消息数量
     *
     * @param userId
     */
    getChatListMsgAmount(userId) {
        let self = this;
        let chats = {doctor: {}, patient: {}};
        // 先获取医生间的私聊
        PrivateMsgRepo.findAllP2PWithDoctor(userId, function (err, doctors) {
            if (err) {
                ModelUtil.emitDbError(self.eventEmitter, 'Get chat list with doctor failed', err);
                return;
            }
            var amount = 0;
            for (let i = 0; i < doctors.length; i++) {
                let doctor = doctors[i];
                //过滤结束的咨询
                //if(doctor.last_content_type==7)continue;
                amount = doctor.new_msg_count+amount;
            }
            // 再获取医生间的组
            GroupMsgRepo.findAllGroupsWithDoctor(userId, function (err, groups) {
                if (err) {
                    ModelUtil.emitDbError(self.eventEmitter, 'Get group list with doctor failed', err);
                    return;
                }
                for (let i = 0; i < groups.length; i++) {
                    let group = groups[i];
                    //过滤结束的咨询
                    //if(group.last_content_type==7)continue;
                    amount =   group.new_msg_count+amount;
                }
                chats.doctor = amount;
                var patientAmount =0;
                //获取患者记录数量
                PrivateMsgRepo.findAllP2PWithPatient(userId, function (err, patients) {
                    if (err) {
                        ModelUtil.emitDbError(self.eventEmitter, 'Get chat list with patient failed', err);
                        return;
                    }
                    for (let i = 0; i < patients.length; i++) {
                        let patient = patients[i];
                        //过滤结束的咨询
                        // if(patient.last_content_type==7)continue;
                        patientAmount =patientAmount+ patient.new_msg_count;
                    }
                    //获取患者记录数量
                    GroupMsgRepo.findAllGroupsWithPatient(userId, function (err, groups) {
                        if (err) {
                            ModelUtil.emitDbError(self.eventEmitter, 'Get group list with patient failed', err);
                            return;
                        }
                        for (let i = 0; i < groups.length; i++) {
                            let group = groups[i];
                            // 过滤掉医生间的求助团队
                            if (group.group_type === 2) continue;
                            //过滤结束的咨询
                            //if(group.last_content_type==7)continue;
                            patientAmount = patientAmount+ group.new_msg_count;
                        }
                        chats.patient = patientAmount;
                        ModelUtil.emitData(self.eventEmitter, chats);
                    });
                });
            });
        });
    }
    /**
     * 获取与指定用户的聊天记录。
     *
     * @param userId
     * @param peerId
     * @param contentType
     * @param msgStartId
     * @param msgEndId
     * @param count
     * @param closedInterval
     */
    getPrivateMessages(userId, peerId, contentType, msgStartId, msgEndId, count, closedInterval) {
        let self = this;
        PrivateMsgRepo.findAllMessages(userId, peerId, contentType === undefined ? "0,1,2,3,4,5,6" : contentType, msgStartId, msgEndId, count, closedInterval, function (err, rows) {
            if (err) {
                ModelUtil.emitDbError(self.eventEmitter, 'Get private message failed', err);
                return;
            }
            let messages = Doctor.fillMessages(rows);
            ModelUtil.emitData(self.eventEmitter, messages);
            // 清空统计信息
            StatsRepo.clearPrivateChatSummary(userId, peerId, function (err, result) {
                if (err) log.error(err);
            });
        });
    }
    /**
     * 获取与某人聊天的未读消息数。
     *
     * @param userId
     * @param peerId
     */
    getUnreadMessageCount(userId, peerId) {
        let self = this;
        StatsRepo.getPrivateChatAllUnReadCount(userId, function (err, result) {
            if (err) {
                ModelUtil.emitDbError(self.eventEmitter, "Get unread private message count failed", err);
                return;
            }
            let data = {userId: userId, messageType: 1, newMessageCount: 0};
            for (let i = 0; i < result.length; i++) {
                data.newMessageCount += result[i].new_msg_count;
            }
            ModelUtil.emitData(self.eventEmitter, data);
        });
    }
    /**
     * 获取所有未读的消息数,包括群。
     *
     * @param userId
     */
    getAllUnreadMessageCount(userId) {
        let self = this;
        StatsRepo.getChatAllUnReadCount(userId, function (err, result) {
            if (err) {
                ModelUtil.emitDbError(self.eventEmitter, "Get all unread message count failed", err);
                return;
            }
            let data = {userId: userId, messageType: 0, newMessageCount: 0};
            for (let index = 0; index < result.length; index++) {
                data.newMessageCount += result[index].new_msg_count;
            }
            ModelUtil.emitData(self.eventEmitter, data);
        });
    }
    /**
     * 获取与指定用户的未读聊天记录。
     *
     * @param userId
     * @param peerId
     */
    getUnreadPrivateMessages(userId, peerId) {
        let self = this;
        StatsRepo.getPrivateChatSummary(userId, peerId, function (err, summary) {
            if (err) {
                ModelUtil.emitDbError(self.eventEmitter, 'Get unread private messages failed', err);
                return;
            }
            // 没有未读消息,直接返回
            if (summary.length == 0 || summary[0].new_msg_count === 0) {
                ModelUtil.emitData(self.eventEmitter, {startId: 0, count: 0, records: []});
                return;
            }
            PrivateMsgRepo.findUnread(peerId, userId, MAX_INT, summary[0].new_msg_count, function (err, rows) {
                if (err) {
                    ModelUtil.emitDbError(self.eventEmitter, "Get unread private messages failed", err);
                    return;
                }
                let messages = Doctor.fillMessages(rows);
                ModelUtil.emitData(self.eventEmitter, messages);
            });
        });
    }
    /**
     * 获取聊天统计摘要。
     *
     * @param userId
     * @param peerId
     */
    getChatSummary(userId, peerId) {
        let self = this;
        StatsRepo.getPrivateChatSummary(userId, peerId, function (err, result) {
            if (err) {
                ModelUtil.emitDbError(self.eventEmitter, "Get private messages statistic failed", err);
                return;
            }
            let data = {
                userId: userId,
                peerId: peerId,
                lastCContentType: 1,
                lastContent: "",
                newMessageCount: 0,
                timestamp: 0
            };
            if (result.length > 0) {
                let row = result[0];
                data.userId = row.uid;
                data.peerId = row.from_uid;
                data.lastContentType = row.last_content_type;
                data.lastContent = row.last_content;
                data.newMessageCount = row.new_msg_count;
                data.timestamp = ObjectUtil.timestampToLong(row.timestamp)
            }
            ModelUtil.emitData(self.eventEmitter, data);
        });
    }
    getMessage(messageId, messageType) {
        let self = this;
        if (messageType == 1) {
            // 私信
            PrivateMsgRepo.findOneMessage(messageId, function (err, result) {
                if (err) {
                    ModelUtil.emitDbError(self.eventEmitter, "Get message failed", err);
                    return;
                }
                if (result.length == 0) {
                    ModelUtil.emitDataNotFound(self.eventEmitter, "Message not found.");
                    return;
                }
                ModelUtil.emitData(self.eventEmitter, {
                    id: result[0].msg_id,
                    from: result[0].from_uid,
                    to: result[0].to_uid,
                    contentType: result[0].type,
                    content: result[0].content,
                    timestamp: ObjectUtil.timestampToLong(result[0].timestamp)
                });
            })
        } else {
            // 群信
            GroupMsgRepo.findOneMessage(messageId, function (err, result) {
                if (err) {
                    ModelUtil.emitDbError(self.eventEmitter, "Get message failed", err);
                    return;
                }
                if (result.length == 0) {
                    ModelUtil.emitDataNotFound(self.eventEmitter, "Message not found.");
                    return;
                }
                ModelUtil.emitData(self.eventEmitter, {
                    id: result[0].msg_id,
                    from: result[0].from_uid,
                    at: result[0].at_uid,
                    groupId: result[0].to_gid,
                    contentType: result[0].type,
                    content: result[0].content,
                    timestamp: ObjectUtil.timestampToLong(result[0].timestamp)
                });
            });
        }
    }
    /**
     * 判断与患者的最新咨询会话是否已经结束。
     */
    isConsultFinished(doctorId, patientId) {
        let self = this;
        PrivateMsgRepo.isCurrentSessionFinished(doctorId, patientId, function (err, result) {
            if (err) {
                ModelUtil.emitDbError(self.eventEmitter, "Get session finish status failed: ", err);
                return;
            }
            let data = {finished: true, consultId: ''};
            if (result.length > 0) {
                let finishRow = result[0];
                data.finished = finishRow.finished === 1;
                if (!data.finished) {
                    data.consultId = finishRow.consult_id;
                }
            }
            ModelUtil.emitData(self.eventEmitter, data);
        })
    }
    /**
     * 将消息的返回结果合并成JSON。
     *
     * @param rows
     *
     * @returns {startId: 0, count: 0, records: []}
     */
    static fillMessages(rows) {
        let messages = {startId: rows.length > 0 ? rows[0].msg_id : '', count: rows.length, records: []};
        for (let i = 0; i < rows.length; i++) {
            let row = rows[i];
            let record = {
                id: row.msg_id,
                from: row.from_uid,
                contentType: row.type,
                content: row.content,
                timestamp: ObjectUtil.timestampToLong(row.timestamp)
            };
            if (row.to_uid !== undefined) record.to = row.to_uid;
            if (row.at_uid !== undefined) record.at = row.at_uid;
            messages.records.push(record);
        }
        return messages;
    }
}
// Expose class
module.exports = Doctor;

+ 0 - 296
src/doctor/models/group.js

@ -1,296 +0,0 @@
/**
 * 聊天组模型。
 */
"use strict";
let BaseModel = require('./base.model');
let log = require("../util/log.js");
let ModelUtil = require('../util/model.util');
let getui = require('getui');
let Patient = new require("../models/user/patient");
let Doctor = new require('../models/user/doctor');
let GroupRepo = require('../repository/mysql/group.repo');
let GroupMsgRepo = require('../repository/mysql/group.msg.repo');
let StatsRepo = require("../repository/mysql/stats.msg.repo");
let ObjectUtil = require("../util/object.util.js");
const GROUP_TYPES = require('../include/commons').GROUP_TYPE;
const MAX_INT = require('../include/commons').MAX_INT;
class GroupMessage extends BaseModel {
    constructor() {
        super();
    }
    /**
     * 发送消息。
     *
     * @param message
     */
    sendMessage(message) {
        let self = this;
        GroupRepo.isGroupMember(message.group, message.groupType, message.from, function (err, result) {
            if (err) {
                ModelUtil.emitDbError(self.eventEmitter, 'Check group member failed', err);
                return;
            }
            if (result.length == 0) {
                ModelUtil.emitDataNotFound(self.eventEmitter, 'Member with id "' + message.from + '" is not in group "' + message.group + '"');
                return;
            }
            // 保存群组消息
            GroupMsgRepo.save(message.from, message.group, message.at, message.contentType, message.content, function (err, insertedRow) {
                if (err) {
                    ModelUtil.emitDbError(self.eventEmitter, 'Save group message failed', err);
                    return;
                }
                GroupMsgRepo.findOneMessage(insertedRow.insertId, function (err, groupMsg) {
                    if (err) {
                        ModelUtil.emitDbError(self.eventEmitter, 'Save group message success, but return this message failed', err);
                        return;
                    }
                    // 关闭网络连接后执行后续操作
                    let feedback = Doctor.fillMessages(groupMsg);
                    ModelUtil.emitData(self.eventEmitter, feedback);
                    // 推送通知消息给群组成员
                    GroupRepo.getMembers(message.group, message.groupType, function (err, members) {
                        if (err) {
                            log.error('Get group members failed: ', err);
                            return;
                        }
                        if (members.length == 0) {
                            log.warn('No members in group ', message.group,
                                message.groupType === GROUP_TYPES.AdminTeam ? " of admin team." : "of discussion group.");
                            return;
                        }
                        // 逐个推送通知,患者与医生推送方式不一样
                        for (let i = 0; i < members.length; i++) {
                            let member = members[i];
                            if (member.user_id === message.from) continue;
                            (function (userId) {
                                Patient.isPatientCode(userId,
                                    function () {
                                        let msg = {
                                            from: message.from,
                                            to: userId,
                                            contentType: message.contentType,
                                            content: message.content,
                                            msgId: groupMsg[0].msg_id,
                                            group: message.group
                                        };
                                        new Patient().pushGroupMessage(msg);
                                    },
                                    function () {
                                        let msg = {
                                            from: message.from,
                                            to: userId,
                                            contentType: message.contentType,
                                            content: message.content,
                                            msgId: groupMsg[0].msg_id,
                                            group: message.group
                                        };
                                        Doctor.pushMessage(msg, 'group_msg');
                                        // 更新用户组内消息摘要
                                        let at = message.at == userId ? 1 : 0;
                                        StatsRepo.updateGroupChatSummary(userId,
                                            message.group,
                                            message.from,
                                            at,
                                            message.contentType,
                                            message.content,
                                            true,
                                            function (err, result) {
                                                if (err) log.error(err);
                                            });
                                    });
                            })(member.user_id);
                        }
                    });
                });
                // 更新组内统计信息
                StatsRepo.updateGroupChatSummary(message.from, message.group, message.from, 0, message.contentType, message.content, false, function (err, result) {
                    if (err) log.error(err);
                });
            });
        });
    }
    /**
     * 获取组消息。
     */
    getMessages(groupId, memberId, contentType, msgStartId, msgEndId, count) {
        let self = this;
        GroupMsgRepo.findAllMessages(groupId, !contentType ? "1,2,3,5,6" : contentType, msgStartId, msgEndId, count, function (err, rows) {
            if (err) {
                ModelUtil.emitDbError(self.eventEmitter, 'Get group message failed', err);
                return;
            }
            // 先给客户端返回数据
            let messages = Doctor.fillMessages(rows);
            ModelUtil.emitData(self.eventEmitter, messages);
            // 清空统计信息
            StatsRepo.clearGroupChatSummary(memberId, groupId, function (err, result) {
                if (err) console.log(err);
            });
        });
    }
    /**
     * 获取组内未读消息。
     * @param groupId
     */
    getUnreadMessages(groupId, memberId) {
        let self = this;
        StatsRepo.getGroupChatSummary(memberId, groupId, function (err, summary) {
                if (err) {
                    ModelUtil.emitDbError(self.eventEmitter, "Get unread group messages failed", err);
                    return;
                }
                let messages = {startId: 0, count: 0, records: []};
                if (summary.length == 0 || summary[0].new_msg_count === 0) {
                    ModelUtil.emitData(messages);
                    return;
                }
                messages.count = summary[0].new_msg_count;
                GroupMsgRepo.findUnread(groupId, MAX_INT, messages.count, function (err, rows) {
                    if (err) {
                        ModelUtil.emitDbError(self.eventEmitter, "Get unread group messages failed", err);
                        return;
                    }
                    let feedback = Doctor.fillMessages(rows);
                    ModelUtil.emitData(feedback);
                });
            }
        )
        ;
    }
    /**
     * 获取未读消息数量。
     *
     * @param memberId
     */
    getUnreadMessageCount(memberId) {
        let self = this;
        StatsRepo.getGroupChatAllUnReadCount(memberId, function (err, result) {
            if (err) {
                ModelUtil.emitDbError(self.eventEmitter, 'Get all unread messages failed', err);
                return;
            }
            let data = {
                userId: memberId,
                messageType: 2,
                newMessageCount: 0
            };
            if (result.length > 0) {
                for (let index = 0; index < result.length; index++) {
                    data.newMessageCount += result[index].new_msg_count;
                }
            }
            ModelUtil.emitData(self.eventEmitter, data);
        });
    }
    /**
     * 获取特定群组消息统计情况.
     *
     * @param groupId
     * @param memberId
     */
    getChatSummary(groupId, memberId) {
        let self = this;
        StatsRepo.getGroupChatSummary(memberId, groupId, function (err, result) {
            if (err) {
                ModelUtil.emitDbError(self.eventEmitter, 'Get group stats failed', err);
                return;
            }
            let data = {
                userId: userId,
                from: "",
                groupId: groupId,
                atMe: 0,
                lastContentType: 1,
                lastContent: "",
                newMessageCount: 0,
                timestamp: 0
            };
            if (result.length > 0) {
                let row = result[0];
                data.from = row.from_uid;
                data.groupId = row.gid;
                data.atMe = row.at_me;
                data.lastContentType = row.last_content_type;
                data.lastContent = row.lastContent;
                data.newMessageCount = row.new_msg_count;
                data.timestamp = ObjectUtil.timestampToLong(row.timestamp)
            }
            ModelUtil.emitData(self.eventEmitter, data);
        });
    }
    /**
     * 获取成员头像。
     *
     * @param groups 要获取的组ID列表。
     */
    getMemberAvatars(groups) {
        let self = this;
        let avatars = [];
        GroupRepo.getMembersAvatar(groups, function (err, members) {
            if (err) {
                ModelUtil.emitDbError(self.eventEmitter, "Get group member's avatar list failed", err);
                return;
            }
            let lastGroup;
            let lastGroupCode = '';
            for (let i = 0; i < members.length; ++i) {
                let member = members[i];
                let groupCode = member.g_code;
                if (lastGroupCode !== groupCode) {
                    lastGroupCode = groupCode;
                    lastGroup = {groupCode: groupCode, avatars: []};
                    if (lastGroupCode !== '') {
                        avatars.push(lastGroup);
                    }
                }
                lastGroup.avatars.push({
                    code: member.code,
                    name: member.name,
                    avatar: member.photo === null ? "" : member.photo,
                    role: member.type
                });
            }
            ModelUtil.emitData(self.eventEmitter, avatars);
        });
    }
}
module.exports = GroupMessage;

+ 0 - 225
src/doctor/models/patient.js

@ -1,225 +0,0 @@
/**
 * 患者模型。
 */
"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.emitDbError(self.eventEmitter, 'Save private message failed', err);
                return;
            }
            // 结束网络连接,后续操作继续执行
            PmRepo.findOnePatientMessage(result.insertId, function (err, msg) {
                if (err) {
                    ModelUtil.emitDbError(self.eventEmitter, 'Save private message success, but return last message failed', err);
                    return;
                }
                ModelUtil.emitData(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.emitDbError(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.emitDbError(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.emitDbError(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.emitDbError(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.emitDbError(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.emitDbError(self.eventEmitter, "can not find doctor info", err);
                    }
                });
            } else {
                ModelUtil.logError("patient does not bind wechat", err);
            }
        });
    };
}
module.exports = Patient;

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 0 - 125
src/doctor/repository/group.msg.repo.js


+ 0 - 150
src/doctor/repository/private.msg.repo.js

@ -1,150 +0,0 @@
"use strict";
var imRepo = require("./database/im.db.js");
/**
 * 保存消息。
 *
 * @param to
 * @param from
 * @param type
 * @param content
 * @param handler
 */
exports.save = function (to, from, type, content, handler) {
    imRepo.execQuery({
        "sql": "INSERT INTO msg_p2p (to_uid,from_uid,type,content) VALUES (?,?,?,?)",
        "args": [to, from, type, content],
        "handler": handler
    });
};
exports.findOneMessage = function (messageId, handler) {
    imRepo.execQuery({
        "sql": "SELECT msg_id, to_uid, from_uid, type, content, timestamp from msg_p2p where msg_id = ?",
        "args": [messageId],
        "handler": handler
    });
};
exports.findOnePatientMessage = function (messageId,handler) {
    imRepo.execQuery({
        "sql": "SELECT m.*,d.name,d.photo FROM msg_p2p m, wlyy.wlyy_doctor d, wlyy.wlyy_patient p WHERE m.from_uid = d. CODE AND m.to_uid = p. CODE AND m.msg_id =?",
        "args": [messageId],
        "handler": handler
    });
};
/**
 * 查找所有消息。
 *
 * @param to
 * @param from
 * @param contentType
 * @param start
 * @param end
 * @param count
 * @param closedInterval
 * @param handler
 */
exports.findAllMessages = function (to, from, contentType, start, end, count, closedInterval, handler) {
    var sql = "SELECT msg_id, to_uid, from_uid, type, content, timestamp from msg_p2p " +
        "WHERE ((to_uid=? AND from_uid=?) OR (to_uid=? AND from_uid=?)) " +
        "   AND type in (" + contentType + ") AND msg_id between ? and ? ORDER BY timestamp DESC,msg_id DESC LIMIT ?";
    imRepo.execQuery({
        "sql": sql,
        "args": [to, from, from, to, closedInterval ? end : end + 1, closedInterval ? start : start - 1, count],
        "handler": handler
    });
};
/**
 * 查找用户聊天过的医生列表。
 *
 * @param userId 指定的用户
 * @param handler
 */
exports.findAllP2PWithDoctor = function (userId, handler) {
    //var sql = "SELECT DISTINCT d.code, d.name, d.sex, d.photo, ms3.last_content_type, ms3.last_content, ms3.timestamp, ms3.new_msg_count " +
    //    "FROM (SELECT DISTINCT CASE WHEN ms1.timestamp > ms2.timestamp THEN ms1.id ELSE ms2.id END id " +
    //    "      FROM msg_statistic ms1, msg_statistic ms2 " +
    //    "      WHERE ms1.from_gid IS NULL AND ms2.from_gid IS NULL " +
    //    "            AND ms1.uid = ms2.peer_uid AND ms1.peer_uid = ms2.uid) x, msg_statistic ms3, wlyy.wlyy_doctor d " +
    //    "WHERE x.id = ms3.id AND ms3.last_content_type in (1,2,3,5,6) AND " +
    //    "(ms3.uid = ? AND ms3.peer_uid = d.code) GROUP BY d.code, d.name ORDER BY ms3.timestamp DESC";
    var sql ="SELECT d. CODE as code, d. NAME as name,  d.sex, d.photo, s.last_content_type, s.last_content, s. TIMESTAMP as timestamp, s.new_msg_count " +
        "FROM msg_p2p p, wlyy.wlyy_doctor d, msg_statistic s " +
        "WHERE (( p.from_uid = d. CODE AND p.to_uid = ? ) OR ( p.to_uid = d. CODE AND p.from_uid = ? )) " +
        "AND s.from_gid IS NULL AND s.uid = ? " +
        "AND s.peer_uid = d. CODE " +
        "GROUP BY d. NAME, d. CODE, d.hospital_name, d.job_name, d.sex, d.photo ORDER BY p.msg_id DESC"
    imRepo.execQuery({
        "sql": sql,
        "args": [userId, userId,userId],
        "handler": handler
    });
};
/**
 * 查找用户聊天过的患者列表。
 *
 * @param userId
 * @param handler
 */
exports.findAllP2PWithPatient = function (userId, handler) {
    //var sql = "SELECT p.code, p.name, p.birthday, p.sex, p.photo, ms.last_content_type, ms.last_content, ms.timestamp, ms.new_msg_count " +
    //    "FROM msg_statistic ms, wlyy.wlyy_patient p " +
    //    "WHERE ms.msg_type = 1 AND ms.last_content_type in (1,2,3,5,6) " +
    //    "AND ((ms.from_uid = ? AND ms.uid = p.code) OR (ms.uid = ? AND ms.from_uid = p.code)) ORDER BY ms.timestamp";
    var sql="SELECT p1. CODE as code , p1. NAME as name, p1.birthday, p1.sex, p1.photo, w.last_content, w.last_content_type, w. TIMESTAMP as timestamp, w.new_msg_count " +
        "FROM msg_p2p p, wlyy.wlyy_patient p1, msg_statistic w " +
        "WHERE (( p.to_uid = p1.`code` AND p.from_uid = ? ) OR ( p.from_uid = p1.`code` AND p.to_uid = ? )) " +
        "AND w.last_content_type IN (0,1, 2, 3, 4, 5, 6) AND w.uid = ? AND w.peer_uid = p1.`code` AND w.from_gid IS NULL " +
        "GROUP BY p1. CODE, p1. NAME, p1.birthday, p1.sex, p1.photo " +
        "union all " +
        "SELECT p1. CODE AS code, p1. NAME AS name, p1.birthday, p1.sex, p1.photo, w.last_content, t.type, w. TIMESTAMP AS timestamp, w.new_msg_count " +
        "FROM msg_p2p p, wlyy.wlyy_patient p1, msg_statistic w, wlyy.wlyy_consult_team t " +
        "WHERE (( p.to_uid = p1.`code` AND p.from_uid = ? ) OR ( p.from_uid = p1.`code` AND p.to_uid = ? )) " +
        "AND w.last_content_type = 7 AND t.type = 6 " +
        "AND (( t.patient = p.from_uid AND t.doctor = p.to_uid ) OR ( t.patient = p.to_uid AND t.doctor = p.from_uid )) " +
        "AND w.uid = ? AND w.peer_uid = p1.`code` AND w.from_gid IS NULL GROUP BY p1. CODE, p1. NAME, p1.birthday, p1.sex, p1.photo;";
    imRepo.execQuery({
        "sql": sql,
        "args": [userId, userId,userId,userId, userId,userId],
        "handler": handler
    });
};
/**
 * 查找未读消息。
 *
 * @param from
 * @param to
 * @param start
 * @param count
 * @param handler
 */
exports.findUnread = function(from, to, start, count, handler) {
    var sql = "SELECT msg_id, to_uid, from_uid, type, content, timestamp from msg_p2p " +
        "WHERE from_uid = ? AND to_uid = ? AND msg_id < ? ORDER BY timestamp DESC LIMIT ?";
    imRepo.execQuery({
        "sql": sql,
        "args": [from, to, start, count],
        "handler": handler
    });
};
exports.isCurrentSessionFinished = function (doctorId, patientId, handler) {
    var sql = "SELECT c.consult consult_id, case when c.end_msg_id is not null then 1 else 0 end finished " +
        "FROM wlyy.wlyy_consult_team c where c.doctor=? and c.patient = ? ORDER BY id DESC LIMIT 1";
    imRepo.execQuery({
        "sql": sql,
        "args": [doctorId, patientId],
        "handler": handler
    });
};

+ 0 - 292
src/doctor/repository/stats.msg.repo.js

@ -1,292 +0,0 @@
/**
 * 消息统计。方便前端获取聊天的状态。
 */
"use strict";
var http = require('http');
var async = require('async');
var configFile = require('../../include/commons').CONFIG_FILE;
var config = require('../../resources/config/' + configFile);
var log = require('../../util/log');
var ImDb = require("../mysql/db/im.db.js");
var WLYY_ENDPOINTS = require('../../include/wlyy.endpoints').WLYY_ENDPOINTS;
class StatsRepo {
    constructor() {
    }
    //--------------------About all chats--------------------
    /**
     * 所有聊天列表。
     *
     * @param userId
     * @param handler
     */
    static getChatList(userId, handler) {
        ImDb.execQuery({
            "sql": "SELECT uid,from_uid,from_gid,peer_uid,at_me,msg_type,last_content_type,last_content,new_msg_count,timestamp from msg_statistic WHERE uid = ?",
            "args": [userId],
            "handler": handler
        });
    };
    /**
     * 所有未读聊天记录数。
     *
     * @param userId
     * @param handler
     */
    static getChatAllUnReadCount(userId, handler) {
        ImDb.execQuery({
            "sql": "SELECT new_msg_count from msg_statistic WHERE uid=? AND new_msg_count>0",
            "args": [userId],
            "handler": handler
        });
    };
//--------------------About private chat summary--------------------
    static updatePrivateChatSummary(userId, peerId, from, type, content, handler) {
        var uuid = userId + '_' + peerId;
        if (userId == from) {
            //userId  = from ,peerId = to from = from
            // 更新自身的统计信息
            var sql = "INSERT INTO msg_statistic (uid,uuid,from_uid,peer_uid,msg_type,last_content_type,last_content,new_msg_count) " +
                "VALUES (?,?,?,?,?,?,?,?) ON DUPLICATE KEY UPDATE peer_uid=?,last_content_type=?,last_content=?";
            ImDb.execQuery({
                "sql": sql,
                "args": [userId, uuid, from, peerId, 1, type, content, 0, peerId, type, content],
                "handler": handler
            });
        } else {
            var sql = "";
            if (type == 7) {//结束的咨询
                //userId  = to ,peerId = from, from = from
                sql = "INSERT INTO msg_statistic (uid,uuid,from_uid,peer_uid,msg_type,last_content_type,last_content) " +
                    "VALUES (?,?,?,?,?,?,?) ON DUPLICATE KEY UPDATE peer_uid=?,last_content_type=?,last_content=?";
                // 更新对端的统计信息
                ImDb.execQuery({
                    "sql": sql,
                    "args": [userId, uuid, from, peerId, 1, type, content, peerId, type, content],
                    "handler": handler
                });
            } else {
                //userId  = to ,peerId = from, from = from
                sql = "INSERT INTO msg_statistic (uid,uuid,from_uid,peer_uid,msg_type,last_content_type,last_content,new_msg_count) " +
                    "VALUES (?,?,?,?,?,?,?,?) ON DUPLICATE KEY UPDATE peer_uid=?,last_content_type=?,last_content=?,new_msg_count=new_msg_count+1";
                // 更新对端的统计信息
                ImDb.execQuery({
                    "sql": sql,
                    "args": [userId, uuid, from, peerId, 1, type, content, 1, peerId, type, content],
                    "handler": handler
                });
            }
        }
    };
    static clearPrivateChatSummary(userId, peerId, handler) {
        var uuid = userId + '_' + peerId;
        ImDb.execQuery({
            "sql": "UPDATE msg_statistic SET new_msg_count='0' WHERE uuid=?",
            "args": [uuid],
            "handler": handler
        });
    };
    static getPrivateChatSummary(userId, peerId, handler) {
        var uuid = userId + '_' + peerId;
        ImDb.execQuery({
            "sql": "SELECT uid,from_uid,last_content_type,last_content,new_msg_count,timestamp from msg_statistic WHERE uuid = ?",
            "args": [uuid],
            "handler": handler
        });
    };
    static getPrivateChatAllUnReadCount(userId, handler) {
        ImDb.execQuery({
            "sql": "SELECT new_msg_count from msg_statistic WHERE uid = ? AND msg_type = 1 AND new_msg_count > 0",
            "args": [userId],
            "handler": handler
        });
    };
    /**
     * 最近聊天对象,如患者,医生与群等基本信息。
     *
     * @param userId
     * @param days
     * @param handler
     */
    static getRecentChats(userId, days, handler) {
        var timespan = 60 * 60 * 24 * days; // 多少天内的联系对象
        var sql = "SELECT * FROM(" +
            "SELECT DISTINCT p.code code, p.name name, p.birthday birthday, p.sex sex, p.photo photo, ms.timestamp timestamp, 'patient' type " +
            "FROM msg_statistic ms, wlyy.wlyy_patient p " +
            "WHERE ms.uid = ? AND ms.uid = p.code AND " +
            "UNIX_TIMESTAMP(NOW()) - UNIX_TIMESTAMP(ms.timestamp) < ? AND msg_type = 1" +
            " UNION " +
            "SELECT DISTINCT d.code code, d.name name, d.birthday birthday, d.sex sex, d.photo photo, ms.timestamp timestamp,'doctor' type " +
            "FROM msg_statistic ms, wlyy.wlyy_doctor d, (SELECT CASE WHEN ms1.timestamp > ms2.timestamp THEN ms1.id ELSE ms2.id END id " +
            "                                                   FROM msg_statistic ms1, msg_statistic ms2 " +
            "                                                   WHERE ms1.from_gid IS NULL AND ms2.from_gid IS NULL AND ms1.uid = ms2.peer_uid AND ms1.peer_uid = ms2.uid) x " +
            "WHERE x.id = ms.id AND ((ms.uid = ? AND ms.peer_uid = d.code) OR (ms.uid = d.code AND ms.peer_uid = ?)) AND UNIX_TIMESTAMP(NOW()) - UNIX_TIMESTAMP(ms.timestamp) < ?" +
            " UNION " +
            "SELECT g.id code, g.name name, '' birthday, '' sex, '' photo, max(ms.timestamp) timestamp, 'type' ':group' " +
            "FROM msg_statistic ms, wlyy.wlyy_admin_team g, wlyy.wlyy_admin_team_member m, wlyy.wlyy_doctor d " +
            "WHERE d.code = ? AND d.code = m.doctor_code AND m.team_id = g.id AND g.id = ms.from_gid " +
            "   AND (ms.uid = d.code or ms.from_uid = d.code) AND UNIX_TIMESTAMP(NOW()) - UNIX_TIMESTAMP(ms.timestamp) < ? group by g.id, g.name " +
            ") x ORDER BY timestamp DESC";
        ImDb.execQuery({
            "sql": sql,
            "args": [userId, timespan, userId, userId, timespan, userId, timespan],
            "handler": handler
        });
    };
    //--------------------About group chat summary--------------------
    /**
     * 更新群聊统计摘要。
     *
     * @param userId
     * @param groupId
     * @param from
     * @param atMe
     * @param type
     * @param content
     * @param msgCountPlusOne
     * @param handler
     */
    static updateGroupChatSummary(userId, groupId, from, atMe, type, content, msgCountPlusOne, handler) {
        var uuid = userId + '_' + groupId;
        if (msgCountPlusOne) {
            ImDb.execQuery({
                "sql": "INSERT INTO msg_statistic (uid,uuid,from_uid,from_gid,at_me,msg_type,last_content_type,last_content,new_msg_count) VALUES (?,?,?,?,?,?,?,?,?) ON DUPLICATE KEY UPDATE from_uid=?,at_me=?,last_content_type=?,last_content=?,new_msg_count=new_msg_count+1",
                "args": [userId, uuid, from, groupId, atMe, 2, type, content, 1, from, atMe, type, content],
                "handler": handler
            });
        } else {
            ImDb.execQuery({
                "sql": "INSERT INTO msg_statistic (uid,uuid,from_uid,from_gid,at_me,msg_type,last_content_type,last_content,new_msg_count) VALUES (?,?,?,?,?,?,?,?,?) ON DUPLICATE KEY UPDATE from_uid=?,at_me=?,last_content_type=?,last_content=?",
                "args": [userId, uuid, from, groupId, atMe, 2, type, content, 0, from, atMe, type, content],
                "handler": handler
            });
        }
    };
    static getGroupChatAllUnReadCount(userId, handler) {
        ImDb.execQuery({
            "sql": "SELECT new_msg_count from msg_statistic WHERE uid=? AND msg_type=2 AND new_msg_count>0",
            "args": [userId],
            "handler": handler
        });
    };
    static getGroupChatSummary(userId, groupId, handler) {
        var uuid = userId + '_' + groupId;
        ImDb.execQuery({
            "sql": "SELECT uid,from_uid,from_gid,at_me,last_content_type,last_content,new_msg_count,timestamp from msg_statistic WHERE uuid = ?",
            "args": [uuid],
            "handler": handler
        });
    };
    static clearGroupChatSummaryclearGroupChatInfo(userId, groupId, handler) {
        var uuid = userId + '_' + groupId;
        ImDb.execQuery({
            "sql": "UPDATE msg_statistic SET new_msg_count='0' WHERE uuid=?",
            "args": [uuid],
            "handler": handler
        });
    };
    //--------------------Others--------------------
    static getAppMsgAmount(userId, handler) {
        ImDb.execQuery({
            "sql": "SELECT imei,token from wlyy_token WHERE user=?",
            "args": [userId],
            "handler": function (err, result) {
                if (err || result.length == 0) {
                    handler(null, 0);
                    return;
                }
                var options = {
                    hostname: config.wlyyServerConfig.host,
                    port: config.wlyyServerConfig.port,
                    path: WLYY_ENDPOINTS.Doctor.MessageCount.Path,
                    method: WLYY_ENDPOINTS.Doctor.MessageCount.Method,
                    headers: {
                        'userAgent': '{"token":"' + result[0].token + '","uid":"' + userId + '","imei":"' + result[0].imei + '"}'
                    }
                };
                var req = http.request(options, function (res) {
                    res.setEncoding('utf8');
                    log.info('请求家庭医生平台: http://', options.hostname + ":" + options.port + options.path);
                    res.on('data', function (chunk) {
                        log.info('家庭医生平台返回: ', chunk);
                        handler(null, JSON.parse(chunk));
                    });
                });
                req.on('error', function (e) {
                    log.error('家庭医生平台接口调用出错: ', e.message);
                    handler(e, null);
                });
                req.end();
            }
        });
    };
    static getBadgeNumber(userId, handler) {
        var self = this;
        async.parallel([
                function (callback) {
                    callback(null, 0);
                },
                function (callback) {
                    self.getAppMsgAmount(userId, function (err, result) {
                        if (err) {
                            callback(null, 0);
                        } else {
                            var count = 0;
                            try {
                                count += parseInt(result.data.healthIndex.amount);
                                count += parseInt(result.data.sign.amount);
                                count += parseInt(result.data.system.amount);
                                var immsg = JSON.parse(result.data.imMsgCount);
                                count += parseInt(immsg.patient);
                                count += parseInt(immsg.doctor);
                                callback(null, count);
                            } catch (e) {
                                callback(null, 0);
                            }
                        }
                    });
                }],
            function (err, results) {
                var badge = 0;
                for (var index = 0; index < results.length; index++) {
                    badge += results[index];
                }
                handler(null, badge);
            });
    };
}
module.exports = StatsRepo;

+ 0 - 92
src/doctor/resources/config/config.prod.js

@ -1,92 +0,0 @@
"use strict";
let wlyyDbConfig = {
    host: '59.61.92.94',
    user: 'wlyy',
    password: 'jkzlehr@123',
    database: 'wlyy',
    connectionLimit: '100',
    charset : 'utf8mb4'
};
let imDbConfig = {
    host: '59.61.92.94',
    user: 'wlyy',
    password: 'jkzlehr@123',
    database: 'wlyy',
    connectionLimit: '100',
    charset : 'utf8mb4'
};
// Redis
let redisConfig = {
    host: '192.168.1.220',
    port: 6379,
    db: 1
};
// 企业版的推送配置
let geTuiConfig = {
    HOST: 'https://api.getui.com/apiex.htm',
    APPID: 'qWmRh2X88l7HuE36z3qBe8',
    APPKEY: 'EzERfV8c849lBkZqHWzQG1',
    MASTERSECRET: 'veXiajQrId6iojy7Qv8kZ2'
};
//AppStore版的推送App配置
let geTuiAppStoreCfg = {
    HOST: 'https://api.getui.com/apiex.htm',
    APPID: 'H6FYbDejks6VjMmW3uH7V6',
    APPKEY: '0PFWlKmLBN9YzhCfFWVgYA',
    MASTERSECRET: 'pvjCGtRZJx9SRVODkxc816'
};
// 三师后台
let wlyyServerConfig = {
    host: '120.41.252.108',
    port: 9660
};
// 透传服务
let transServerConfig = {
    host: '120.41.253.95',
    port: 3030
};
// 微信配置
let wechatConfig = {
    appId: 'wxad04e9c4c5255acf',
    appSecret: 'ae77c48ccf1af5d07069f5153d1ac8d3',
    token: '27eb3bb24f149a7760cf1bb154b08040',
    baseUrl: 'www.xmtyw.cn/wlyy',
    template: {
        consultTemplate: '0mF_vHj-ILx8EH8DwzmAi7LqzjqYiU9IrSRRmziTZyc'  // 咨询回复模板
    }
};
// 会话配置
let sessionConfig = {
    maxMessageCount: 1000,                  // 会话缓存的消息数量
    maxMessageTimespan: 7 * 24 * 3600,      // 会话缓存的最大时间跨度
    expireTime: 3 * 60 * 60 * 1000,         // 会话过期时间,以毫秒计
    expireSessionCleanCount: 10             // 每次清理多少个过期会话
};
exports.app = 'im.server';
exports.version = '1.2.7';
exports.debug = true;
exports.serverPort = 3000;
exports.sessionExpire = 1800;
exports.showSQL = false;
exports.wlyyDbConfig = wlyyDbConfig;
exports.imDbConfig = imDbConfig;
exports.redisConfig = redisConfig;
exports.geTuiConfig = geTuiConfig;
exports.geTuiAppStoreCfg = geTuiAppStoreCfg;
exports.wlyyServerConfig = wlyyServerConfig;
exports.transServerConfig = transServerConfig;
exports.wechatConfig = wechatConfig;
exports.sessionConfig = sessionConfig;

+ 14 - 12
src/server/endpoints/url.initializer.js

@ -14,28 +14,30 @@ let index = require('../controllers/index');
let socket = require('../controllers/socket');
// endpoints
let application = require('../endpoints/v2/application.endpoint');
let users = require('../endpoints/v2/user.endpoint');
let sessions = require('../endpoints/v2/session.endpoint');
let topics = require('../endpoints/v2/topic.endpoint');
let management = require('../endpoints/v2/management.endpoint');
let application = require('./v2/application.endpoint');
let users = require('./v2/user.endpoint');
let sessions = require('./v2/session.endpoint');
let topics = require('./v2/topic.endpoint');
let management = require('./v2/management.endpoint');
class UrlInitializer{
    constructor(){
    }
    static initRestApi(app){
        app.use(function (req, res, next) {
            if(req.url.indexOf('/api/v1') >= 0){
                res.status(403).send({message: "API v1 is invalid since 1.2.8, please use API v2."});
            } else {
                next();
            }
        });
        app.use(APIv2.Application.Base, application);
        app.use(APIv2.Management.Base, management);
        app.use(APIv2.Users.Base, users);
        app.use(APIv2.Sessions.Base,sessions);
        app.use(APIv2.Topics.Base,topics);
        // TODO: 过滤APIv1接口调用
        app.user(function (url) {
        });
        app.use(APIv2.Sessions.Topics,topics);
    }
    static initWebPages(app){

+ 4 - 4
src/server/endpoints/v2/application.endpoint.js

@ -3,10 +3,10 @@
let express = require('express');
let router = express.Router();
const APIv1 = require('../include/endpoints').APIv1;
const MODEL_EVENTS = require('../include/commons').MODEL_EVENTS;
const APIv2 = require('../../include/endpoints').APIv2;
const MODEL_EVENTS = require('../../include/commons').MODEL_EVENTS;
let StatsMessage = require("../models/stats");
let StatsMessage = require("../../models/stats");
/**
 * 获取应用角标数。
@ -16,7 +16,7 @@ let StatsMessage = require("../models/stats");
 * 参数:
 * uid:用户id
 */
router.get(APIv1.Application.BadgeNo, function (req, res) {
router.get(APIv2.Application.BadgeNo, function (req, res) {
    let userId = req.query.user_id;
    let statsMsg = new StatsMessage();

+ 4 - 4
src/server/endpoints/v2/management.endpoint.js

@ -6,15 +6,15 @@
let express = require('express');
let router = express.Router();
let APIv1 = require('../include/endpoints').APIv1;
let MODEL_EVENTS = require('../include/commons').MODEL_EVENTS;
let APIv2 = require('../../include/endpoints').APIv2;
let MODEL_EVENTS = require('../../include/commons').MODEL_EVENTS;
let Management = require('../models/server/management');
let Management = require('../../models/server/management');
/**
 * 数据库检查,包括所有表,连接状态。
 */
router.get(APIv1.Management.DbStatus, function (req, res) {
router.get(APIv2.Management.DbStatus, function (req, res) {
    let management = new Management();
    management.on(MODEL_EVENTS.OK, function (data) {

+ 64 - 90
src/server/endpoints/v2/session.endpoint.js

@ -9,51 +9,81 @@
let express = require('express');
let router = express.Router();
let http = require('http');
let log = require('../util/log.js');
let log = require('../../util/log.js');
let ObjectUtil = require("../util/object.util.js");
let ControllerUtil = require('../util/controller.util');
let Sessions = require('../models/sessions/sessions');
let Participants = require('../models/sessions/participants');
let ObjectUtil = require("../../util/object.util.js");
let ControllerUtil = require('../../util/controller.util');
let Sessions = require('../../models/sessions/sessions');
let Participants = require('../../models/sessions/participants');
const APIv1 = require('../include/endpoints').APIv1;
const APIv2 = require('../../include/endpoints').APIv2;
/**
 * 获取用户的聊天列表
 * 请求URL /sessions?page=0&pagesize=10&user=3121
 * 请求URL /sessions?page=0&size=10&user=3121
 */
router.get(APIv1.Sessions.SessionList,function(req,res){
router.get("/", function (req, res) {
    let page = req.query.page;
    let pagesize = req.query.pagesize;
    let size = req.query.size;
    let user = req.query.user;
    if (!page) {
        throw {httpStatus: 406, message: 'Missing page.'};
    }
    if (!pagesize) {
        throw {httpStatus: 406, message: 'Missing pagesize.'};
    if (!size) {
        throw {httpStatus: 406, message: 'Missing size.'};
    }
    if (!user) {
        throw {httpStatus: 406, message: 'Missing user.'};
    }
    
    let sessions = new Sessions();
    ControllerUtil.regModelEventHandler(sessions, res);
    sessions.getUserSessions(user,page,pagesize);
    sessions.getUserSessions(user, page, size);
});
/**
 * 创建会话
 * sessionType:1表示MUC会话,2表示P2P,3表示群会话,4表示临时讨论组
 * users 讨论组包含的用户标示
 * sessionId 会话ID
 * 请求URL /create?sessionId=0&users={10:1,20:1}&name=3121&sessionType=2
 */
router.post("/", function (req, res) {
    let sessionId = req.query.sessionId;
    let users = req.query.users;
    let name = req.query.name;
    let sessionType = req.query.sessionType;
    if (!sessionId) {
        throw {httpStatus: 406, message: 'Missing sessionId.'};
    }
    if (!users) {
        throw {httpStatus: 406, message: 'Missing users.'};
    }
    if (!name) {
        throw {httpStatus: 406, message: 'Missing name.'};
    }
    if (!sessionType) {
        throw {httpStatus: 406, message: 'Missing sessionType.'};
    }
    let sessions = new Sessions();
    ControllerUtil.regModelEventHandler(sessions, res);
    sessions.createSession(sessionId, name, sessionType, users);
});
/**
 * 获取用户的聊天信息列表
 * 请求URL /messages?page=0&pagesize=10&user=3121&sessionId=testsessionmsg1
 * 请求URL /messages?page=0&size=10&user=3121&sessionId=testsessionmsg1
 */
router.get(APIv1.Sessions.MessageList,function(req,res){
router.get(APIv2.Sessions.Messages, function (req, res) {
    let page = req.query.page;
    let pagesize = req.query.pagesize;
    let size = req.query.size;
    let user = req.query.user;
    let sessionId =req.query.sessionId;
    let sessionId = req.query.sessionId;
    if (!page) {
        throw {httpStatus: 406, message: 'Missing page.'};
    }
    if (!pagesize) {
        throw {httpStatus: 406, message: 'Missing pagesize.'};
    if (!size) {
        throw {httpStatus: 406, message: 'Missing size.'};
    }
    if (!user) {
        throw {httpStatus: 406, message: 'Missing user.'};
@ -63,16 +93,16 @@ router.get(APIv1.Sessions.MessageList,function(req,res){
    }
    let sessions = new Sessions();
    ControllerUtil.regModelEventHandler(sessions, res);
    sessions.getMessages(sessionId,user,page,pagesize);
    sessions.getMessages(sessionId, user, page, size);
});
/**
 * 某个聊天记录置顶操作
 * 请求URL /stick?user=3121&sessionId=testsessionmsg1
 */
router.post(APIv1.Sessions.StickSession,function(req,res){
router.post(APIv2.Sessions.SessionSticky, function (req, res) {
    let user = req.query.user;
    let sessionId =req.query.sessionId;
    let sessionId = req.query.sessionId;
    if (!user) {
        throw {httpStatus: 406, message: 'Missing user.'};
    }
@ -81,16 +111,16 @@ router.post(APIv1.Sessions.StickSession,function(req,res){
    }
    let sessions = new Sessions();
    ControllerUtil.regModelEventHandler(sessions, res);
    sessions.stickSession(sessionId,user);
    sessions.stickSession(sessionId, user);
});
/**
 * 取消置顶
 * 请求URL /cancelStick?user=3121&sessionId=testsessionmsg1
 */
router.post(APIv1.Sessions.UnStickSession,function(req,res){
router.delete(APIv2.Sessions.SessionSticky, function (req, res) {
    let user = req.query.user;
    let sessionId =req.query.sessionId;
    let sessionId = req.query.sessionId;
    if (!user) {
        throw {httpStatus: 406, message: 'Missing user.'};
    }
@ -99,45 +129,16 @@ router.post(APIv1.Sessions.UnStickSession,function(req,res){
    }
    let sessions = new Sessions();
    ControllerUtil.regModelEventHandler(sessions, res);
    sessions.cancelStickSession(sessionId,user);
    sessions.cancelStickSession(sessionId, user);
});
/**
 * 创建讨论组
 * sessionType:1表示MUC会话,2表示P2P,3表示群会话,4表示临时讨论组
 * users 讨论组包含的用户标示
 * sessionId 会话ID
 * 请求URL /create?sessionId=0&users={10:1,20:1}&name=3121&sessionType=2
 */
router.get(APIv1.Sessions.CreateSession,function(req,res){
    let sessionId = req.query.sessionId;
    let users = req.query.users;
    let name = req.query.name;
    let sessionType = req.query.sessionType;
    if (!sessionId) {
        throw {httpStatus: 406, message: 'Missing sessionId.'};
    }
    if (!users) {
        throw {httpStatus: 406, message: 'Missing users.'};
    }
    if (!name) {
        throw {httpStatus: 406, message: 'Missing name.'};
    }
    if (!sessionType) {
        throw {httpStatus: 406, message: 'Missing sessionType.'};
    }
    let sessions = new Sessions();
    ControllerUtil.regModelEventHandler(sessions, res);
    sessions.createSession(sessionId,name,sessionType,users);
});
/**
 * 发送消息
 * message:消息发送对象
 * sessionId 会话ID
 */
router.post(APIv1.Sessions.SendMsg,function(req,res){
router.post(APIv2.Sessions.Messages, function (req, res) {
    let message = req.body;
    if (!ObjectUtil.isJsonObject(message)) {
        throw {httpStatus: 406, message: 'Problems parsing JSON.'}
@ -157,43 +158,16 @@ router.post(APIv1.Sessions.SendMsg,function(req,res){
    }
    let sessions = new Sessions();
    ControllerUtil.regModelEventHandler(sessions, res);
    message.timestamp=new Date();
    sessions.saveMessageBySession(message,sessionId,type);
    message.timestamp = new Date();
    sessions.saveMessageBySession(message, sessionId, type);
});
/**
 * 发送消息
 * message:消息发送对象
 * sessionId 会话ID
 */
router.post(APIv1.Sessions.SendMsg,function(req,res){
    let message = req.body;
    if (!ObjectUtil.isJsonObject(message)) {
        throw {httpStatus: 406, message: 'Problems parsing JSON.'}
    }
    // 字段判断
    let testing = ObjectUtil.fieldsCheck(message, "senderId", "senderName", "contentType", "content");
    if (!testing.pass) {
        throw {httpStatus: 406, message: testing.message}
    }
    let sessionId = req.query.sessionId;
    if (!sessionId) {
        throw {httpStatus: 406, message: 'Missing sessionId.'};
    }
    let sessions = new Sessions();
    ControllerUtil.regModelEventHandler(sessions, res);
    message.timestamp=new Date();
    sessions.saveMessageBySession(message,sessionId);
});
/**
 * 移除人员
 * 移除成员
 * user:移除的人员
 * sessionId 会话ID
 */
router.post(APIv1.Sessions.RemoveSessionUser,function(req,res){
router.delete(APIv2.Sessions.Participant, function (req, res) {
    let user = req.query.user;
    if (!user) {
        throw {httpStatus: 406, message: 'Missing user.'};
@ -204,15 +178,15 @@ router.post(APIv1.Sessions.RemoveSessionUser,function(req,res){
    }
    let participants = new Participants();
    ControllerUtil.regModelEventHandler(sessions, res);
    participants.deleteUser(sessionId,user);
    participants.deleteUser(sessionId, user);
});
/**
 * 移除人员
 * 增加成员
 * user:移除的人员
 * sessionId 会话ID
 */
router.post(APIv1.Sessions.PushSessionUser,function(req,res){
router.put(APIv2.Sessions.Participant, function (req, res) {
    let user = req.query.user;
    if (!user) {
        throw {httpStatus: 406, message: 'Missing user.'};
@ -223,7 +197,7 @@ router.post(APIv1.Sessions.PushSessionUser,function(req,res){
    }
    let participants = new Participants();
    ControllerUtil.regModelEventHandler(sessions, res);
    participants.pushUser(sessionId,user);
    participants.pushUser(sessionId, user);
});
module.exports = router;

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

@ -9,25 +9,25 @@
let express = require('express');
let router = express.Router();
let http = require('http');
let log = require('../util/log.js');
let log = require('../../util/log.js');
let ObjectUtil = require("../util/object.util.js");
let ControllerUtil = require('../util/controller.util');
let Topics = require('../models/sessions/topics');
let ObjectUtil = require("../../util/object.util.js");
let ControllerUtil = require('../../util/controller.util');
let Topics = require('../../models/sessions/topics');
const APIv1 = require('../include/endpoints').APIv1;
const APIv2 = require('../../include/endpoints').APIv2;
/**
 * 获取用户的聊天列表
 */
router.get(APIv1.Topics.Topics,function(req,res){
router.get(APIv2.Sessions.Topics, function (req, res) {
    let topicId = req.query.topicId;
    let topic = new Topics();
    ControllerUtil.regModelEventHandler(topic, res);
    topic.getTopicMessages(topicId);
});
router.post(APIv1.Topics.StartTopic,function(req,res){
router.post(APIv2.Sessions.Topics, function (req, res) {
    let data = req.body;
    //    data.topicName ="topicstest1";
    //    data.topicId ="12132312";
@ -55,17 +55,17 @@ router.post(APIv1.Topics.StartTopic,function(req,res){
    //}
    let topic = new Topics();
    ControllerUtil.regModelEventHandler(topic, res);
    topic.createTopics(data.topicName,data.topicId,data.message.patient,data.healthDoctor,data.doctor,data.message);
    topic.createTopics(data.topicName, data.topicId, data.message.patient, data.healthDoctor, data.doctor, data.message);
});
router.get(APIv1.Topics.EndTopic,function(req,res){
router.get(APIv2.Sessions.TopicEnded, function (req, res) {
    let data = req.body;
    let endUser = data.endUser;
    let endUserName = data.endUserName;
    let topicId = data.topicId
    let topic = new Topics();
    ControllerUtil.regModelEventHandler(topic, res);
    topic.endTopic(topicId,endUser,endUserName);
    topic.endTopic(topicId, endUser, endUserName);
});
module.exports = router;

+ 11 - 10
src/server/endpoints/v2/user.endpoint.js

@ -3,18 +3,19 @@
 */
"use strict";
let ObjectUtil = require('../../util/object.util');
let ControllerUtil = require('../../util/controller.util');
let Users = require('../../models/user/users');
let express = require('express');
let router = express.Router();
let http = require('http');
let configFile = require('../include/commons').CONFIG_FILE;
let config = require('../resources/config/' + configFile);
let log = require("../util/log.js");
let ObjectUtil = require('../util/object.util');
let ControllerUtil = require('../util/controller.util');
let Users = require('../models/user/users');
let configFile = require('../../include/commons').CONFIG_FILE;
let config = require('../../resources/config/' + configFile);
let log = require("../../util/log.js");
const APIv1 = require('../include/endpoints').APIv1;
const APIv2 = require('../../include/endpoints').APIv2;
/**
 * 登录。用户登录后,更新数据库中的在线状态。
@ -31,7 +32,7 @@ const APIv1 = require('../include/endpoints').APIv1;
 *  client_id:个推的client id
 *  platform:平台类型,0为iOS,1为Android
 */
router.get(APIv1.Users.Login, function (req, res) {
router.get(APIv2.Users.Login, function (req, res) {
    let userId = req.query.user_id;
    let token = req.query.token;
    let clientId = req.query.client_id;
@ -67,7 +68,7 @@ router.get(APIv1.Users.Login, function (req, res) {
 * 参数:
 *  user_id:用户ID
 */
router.get(APIv1.Users.Logout, function (req, res) {
router.get(APIv2.Users.Logout, function (req, res) {
    let userId = req.query.user_id;
    if (userId == null) {
        throw {httpStatus: 406, message: 'Logout Failed. Missing field: user_id.'};
@ -88,7 +89,7 @@ router.get(APIv1.Users.Logout, function (req, res) {
 * POST参数格式:
 *  {status: 1}, app状态,0在后台,1在前台
 */
router.post(APIv1.Users.UserStatus, function (req, res) {
router.post(APIv2.Users.UserStatus, function (req, res) {
    let userId = req.param('user_id');
    let status = req.body;
    if (!ObjectUtil.isJsonObject(status)) {

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

@ -70,5 +70,4 @@ const pages = {
};
module.exports.PAGES = pages;
module.exports.APIv1 = APIv1;
module.exports.APIv2 = APIv2;

+ 1 - 1
src/server/models/group.js

@ -6,7 +6,7 @@
let BaseModel = require('./base.model');
let log = require("../util/log.js");
let ModelUtil = require('../util/model.util');
let getui = require('getui');
//let getui = require('getui');
let Patient = new require("../models/user/patient");
let Doctor = new require('../models/user/doctor');

+ 1 - 1
src/server/models/user/doctor.js

@ -4,7 +4,7 @@
"use strict";
let log = require("../../util/log.js");
let getui = require('getui');
//let getui = require('getui');
let RedisModel = require('./../redis.model');
let Schedule = require("./../schedule/schedule.js");