Sfoglia il codice sorgente

oracle连接池问题修改

huangwenjie 5 anni fa
parent
commit
654278532c

+ 0 - 88
src/server/repository/mysql/app.status.repo.js

@ -1,88 +0,0 @@
/**
 * 客户端App状态库。
 *
 * 客户端App状态对每个用户来讲只保存一个,不区分设备。
 * 因此当用户从iOS切换至Android平台时,先前的状态将被新的替换。
 *
 * author: Sand
 * since: 12/14/2016
 */
"use strict";
let ImDb = require("./db/im.db.js");
class AppStatusRepo {
    constructor() {
    }
    /**
     * 查找客户端App状态。
     *
     * @param userId
     * @param handler
     */
    static findOne(userId, handler) {
        let sql = "SELECT platform, token, client_id, app_in_bg, last_login_time " +
            "FROM app_status WHERE user_id = ?";
        ImDb.execQuery({
            "sql": sql,
            "args": [userId],
            "handler": handler
        });
    };
    /**
     * 保存App的最新状态。
     *
     * @param userId
     * @param deviceToken
     * @param client_id
     * @param platform
     * @param handler
     */
    static save(userId, deviceToken, client_id, platform, handler) {
        let sql = "INSERT INTO app_status (user_id, platform, token, client_id, app_in_bg, last_login_time) " +
            "VALUES (?, ?, ?, ?, 0, now()) " +
            "ON DUPLICATE KEY UPDATE platform=?, token=?, client_id=?, app_in_bg=0,last_login_time=now()";
        ImDb.execQuery({
            sql: sql,
            args: [userId, platform, deviceToken, client_id, platform, deviceToken, client_id],
            handler: function(err,res){
                handler(err,res);
            }
        });
    };
    /**
     * 更新App前后台状态。
     *
     * @param userId
     * @param appInBg
     * @param handler
     */
    static updateStatus(userId, appInBg, handler) {
        ImDb.execQuery({
            "sql": "UPDATE app_status SET app_in_bg = ? WHERE user_id = ",
            "args": [appInBg, userId],
            "handler": handler
        });
    };
    /**
     * 销毁用户状态
     *
     * @param userId
     * @param handler
     */
    static destroy(userId, handler) {
        ImDb.execQuery({
            "sql": "DELETE FROM app_status WHERE user_id = ?",
            "args": [userId],
            "handler": handler
        });
    };
}
module.exports = AppStatusRepo;

+ 0 - 23
src/server/repository/mysql/db/im.db.js

@ -1,23 +0,0 @@
/**
 * IM数据库。
 */
"use strict";
var configFile = require('../../../include/commons').CONFIG_FILE;
var config = require('../../../resources/config/' + configFile);
var mysql = require('mysql');
var dbUtil = require('../../../util/db.util');
var pool = mysql.createPool(config.imDbConfig);
class ImDb {
    constructor() {
    }
    static execQuery (options) {
        dbUtil.execQuery(pool, options);
    };
}
module.exports = ImDb;

+ 0 - 40
src/server/repository/mysql/doctor.repo.js

@ -1,40 +0,0 @@
/**
 * i健康用户库,即医生数据,此命名为解藉用户与特定角色的关条。
 *
 * 目前,医生真实数据存在于家庭医生平台数据库,IM数据库仅是做视图。将来根据需要将通过同步机制将数据同步到IM数据库。
 */
"use strict";
var ImDb = require("./db/im.db.js");
var log = require('../../util/log');
class DoctorRepo {
    constructor() {
    }
    static findOne(doctorId, handler) {
        ImDb.execQuery({
            "sql": "select id, name, sex, birthdate, avatar ,idcard from doctors where id = ? ",
            "args": [doctorId],
            "handler": handler
        });
    };
    static findByMobile(mobile, handler) {
        ImDb.execQuery({
            "sql": "select id, name, sex, birthdate, avatar from doctors where mobile = ? ",
            "args": [mobile],
            "handler": handler
        });
    };
    static addDoctor(id,name,mobile,sex,birthdate,avatar,hospital_name,level,idcard, handler) {
        ImDb.execQuery({
            "sql": "insert into base.base_doctor (id,name,mobile,sex,birthdate,photo,idcard,del) values (?,?,?,?,?,?,?,1)",
            "args": [id,name,mobile,sex,birthdate,avatar,idcard],
            "handler": handler
        });
    };
}
module.exports = DoctorRepo;

+ 0 - 56
src/server/repository/mysql/message.noticeSetting.repo.js

@ -1,56 +0,0 @@
/**
 * 消息提醒设置
 * Created by ysj on 2017/12/4.
 */
"use strict";
let log = require('../../util/log');
let ImDb = require('../mysql/db/im.db');
const DB_TABLES = require('../../include/commons').DB_TABLES;
class MessageNoticeSettingRepo{
    constructor(){
    }
    /**
     * 获取单个MessageNoticeSetting对象
     *
     * @param user
     * @param type
     * @param handler
     * return  master_switch 总开关(1开,0关)',im_switch im消息开关(1开,0关)',family_topic_switch 健管师邀请后推送开关(1开,0关)',
     */
    static findOne(user,type, handler) {
        let sql = "select master_switch,im_switch,family_topic_switch,sound_switch,vibration_switch from " + DB_TABLES.MessageNoticeSetting + " s where s.user = ? and s.type=? ";
        ImDb.execQuery({
            "sql": sql,
            "args": [user,type],
            "handler": handler || function (err, res) {
                if(err) log.error(err);
            }
        });
    }
    /**
     * 保存MessageNoticeSetting
     *
     * @param user 用户id
     * @param type 用户类型 1doctor 2patient
     * @param createTime
     * @param handler 回调函数
     */
    static save(user, type, createTime, handler) {
        let sql = "insert into " + DB_TABLES.MessageNoticeSetting + " (user,type,master_switch,im_switch,family_topic_switch," +
            "sign_switch,health_sign_switch,system_switch,prescription_switch,sound_switch,vibration_switch,coordination_switch,create_time)" +
            " values (?,?,1,1,1,1,1,1,1,1,1,1,?)";
        ImDb.execQuery({
            "sql": sql,
            "args": [user, type, createTime.getTime()],
            "handler": handler
        });
    }
}
module.exports = MessageNoticeSettingRepo;

+ 0 - 181
src/server/repository/mysql/message.repo.js

@ -1,181 +0,0 @@
/**
 * 消息库。
 */
"use strict";
let configFile = require('../../include/commons').CONFIG_FILE;
let config = require('../../resources/config/' + configFile);
let log = require('../../util/log.js');
let SessionRepo = require('../../repository/mysql/session.repo');
let ImDb = require('../mysql/db/im.db');
const DB_TABLES = require('../../include/commons').DB_TABLES;
class MessageRepo {
    constructor() {
    }
    /**
     * 分页获取消息
     *
     * @param sessionId
     * @param page
     * @param size
     * @param messageType
     * @param handler
     */
    static findBySessionId(sessionId, page, size, messageType, handler) {
        page = page < 0 ? 0 : page;
        SessionRepo.findOne(sessionId, function (err, res) {
            if (!err) {
                if (res && res.length == 0) {
                    handler(null, null);
                    return;
                }
                let params = [];
                let type = res[0].type;
                let MessageTable = "";
                if (type == 1 || type == 8) {
                    MessageTable = DB_TABLES.MucMessages;
                } else if (type == 2) {
                    MessageTable = DB_TABLES.P2pMessages;
                } else {
                    MessageTable = DB_TABLES.GroupMessages;
                }
                let where = " w.session_id = ? ";
                params.push(sessionId);
                if (messageType) {
                    where += " and content_type=? ";
                    params.push(messageType);
                }
                let sql = "select id, session_id, sender_id, sender_name, content_type, content, timestamp from " +
                    MessageTable + " w where " + where + " order by w.id limit ?, ?";
                params.push(page);
                params.push(size);
                ImDb.execQuery({
                    "sql": sql,
                    "args": params,
                    "handler": handler || function (err, res) {
                        if(err) log.error(err);
                    }
                });
            }
        });
    }
    /**
     * 保存消息
     *
     * @param message 消息对象
     * @param sessionType 会话类型,参见 SESSIONS_TYPES
     * @param messageId
     * @param sessionId
     * @param handler
     */
    static save(message, sessionType, messageId, sessionId, handler) {
        if(message.agent){
            let sql = "INSERT INTO " + DB_TABLES.sessionTypeToTableName(sessionType) +
                " (id, session_id, sender_id, sender_name,content_type, content, timestamp,business_type,agent) VALUES (?,?,?,?,?,?,?,?,?)";
            ImDb.execQuery({
                "sql": sql,
                "args": [messageId, sessionId, message.sender_id, message.sender_name, message.content_type, message.content, message.timestamp, message.business_type || 1,message.agent],
                "handler": handler || function (err, res) {
                    if(err) log.error(err);
                }
            });
        }else {
            let sql = "INSERT INTO " + DB_TABLES.sessionTypeToTableName(sessionType) +
                " (id, session_id, sender_id, sender_name,content_type, content, timestamp,business_type) VALUES (?,?,?,?,?,?,?,?)";
            ImDb.execQuery({
                "sql": sql,
                "args": [messageId, sessionId, message.sender_id, message.sender_name, message.content_type, message.content, message.timestamp, message.business_type || 1],
                "handler": handler || function (err, res) {
                    if(err) log.error(err);
                }
            });
        }
    }
    /**
     * 修改消息内容
     *
     * @param message 消息对象
     * @param sessionType 会话类型,参见 SESSIONS_TYPES
     * @param messageId
     * @param sessionId
     * @param handler
     */
    static updateMsgContent(sessionType, sessionId,messageId, content,handler) {
        let sql = "UPDATE " + DB_TABLES.sessionTypeToTableName(sessionType)  + " set content =  ? , timestamp = ? where id = ? and session_id = ?";
        log.info(sql);
        ImDb.execQuery({
            "sql": sql,
            "args": [content.toString(),new Date(), messageId,sessionId],
            "handler": handler || function (err, res) {
                if (err) log.error(err);
            }
        });
    }
    /**
     * 修改消息内容
     *
     * @param message 消息对象
     * @param sessionType 会话类型,参见 SESSIONS_TYPES
     * @param messageId
     * @param sessionId
     * @param handler
     */
    static selectOneMessage(sessionType,messageId,handler) {
        let sql = "SELECT * from " + DB_TABLES.sessionTypeToTableName(sessionType)  + "  where id = ?";
        log.info(sql);
        ImDb.execQuery({
            "sql": sql,
            "args": [messageId],
            "handler": handler || function (err, res) {
                if (err) log.error(err);
            }
        });
    }
    /**
     * 获取会话医生的id
     * @param sessionId
     * @param handler
     */
    static findLastMessage(sessionId,sessionType,handler){
        let sql =
            "SELECT s.content_type, s.content,s.agent FROM " + DB_TABLES.sessionTypeToTableName(sessionType) + " s " +
            "WHERE s.session_id = ? order by s.timestamp desc limit 1 ";
        log.info("获取会话医生的id sql : " + sql);
        log.info("获取会话医生的id args : " + [sessionId]);
        ImDb.execQuery({
            "sql": sql,
            "args": [sessionId],
            "handler": handler
        });
    }
    /**
     * i健康未读消息数
     * @param user
     * @param handler
     */
    static getWlyyMessageCount(user, handler) {
        let sql = "SELECT count(1) as count FROM "+DB_TABLES.WlyyMessage+" a WHERE a.has_read= 1 and a.receiver = ?";
        ImDb.execQuery({
            "sql": sql,
            "args": [user],
            "handler": handler
        });
    }
}
module.exports = MessageRepo;

+ 0 - 320
src/server/repository/mysql/participant.repo.js

@ -1,320 +0,0 @@
/**
 * 搜索功能。
 */
"use strict";
let ImDb = require('../mysql/db/im.db');
let DbUtil = require('../../util/db.util');
let log = require('../../util/log.js');
const DB_TABLES = require('../../include/commons').DB_TABLES;
const SESSION_USER_STATUS = require('../../include/commons').SESSION_USER_STATUS;
const SESSION_TYPES = require('../../include/commons').SESSION_TYPES;
const SESSION_BUSINESS_TYPE = require('../../include/commons').SESSION_BUSINESS_TYPE;
class ParticipantRepo {
    constructor() {
    }
    /**
     * 获取会话的成员列表
     *
     * @param sessionId
     * @param handler
     */
    static findAll(sessionId, handler) {
        let sql = "SELECT u.id, u.name, u.sex, u.birthdate, u.avatar,u.hospital_name, p.participant_role role, false is_patient,p.last_fetch_time,u.level,u.mobile FROM sessions s, participants p, doctors u " +
            "WHERE s.id = ? AND s.id = p.session_id AND p.participant_id = u.id union " +
            "SELECT u.id, u.name, u.sex, u.birthdate, u.avatar,u.hospital_name, p.participant_role role, true is_patient,p.last_fetch_time,0 as level,u.mobile FROM sessions s, participants p, patients u " +
            "WHERE s.id = ? AND s.id = p.session_id AND p.participant_id = u.id";
        ImDb.execQuery({
            "sql": sql,
            "args": [sessionId, sessionId],
            "handler": function(err,res){
                if(res&&res.length>0){
                    for(var j in res){
                        if(res[j].last_fetch_time){
                            res[j].last_fetch_time = res[j].last_fetch_time.getTime();
                        }
                    }
                }
                handler(err,res);
            }
        });
    }
    /**
     * 获取会话的成员ID列表
     *
     * @param sessionId
     * @param handler
     */
    static findIds(sessionId, handler) {
        let sql =
            "SELECT u.id, u.name, false is_patient, p.participant_role,u.avatar FROM sessions s, participants p, doctors u " +
            "WHERE s.id = ? AND s.id = p.session_id AND p.participant_id = u.id " +
            "UNION " +
            "SELECT u.id, u.name, true is_patient, p.participant_role,u.avatar FROM sessions s, participants p, patients u " +
            "WHERE s.id = ? AND s.id = p.session_id AND p.participant_id = u.id ";
        ImDb.execQuery({
            "sql": sql,
            "args": [sessionId, sessionId],
            "handler": handler
        });
    }
    /**
     * 根据会话id查找会话成员
     * @param sessionId
     * @param handler
     */
    static findParricipantBySessionId(sessionId,handler){
        let sql = "select participant_id,participant_role from participants p where p.session_id = ?";
        ImDb.execQuery({
            "sql": sql,
            "args": [sessionId],
            "handler": handler
        });
    }
    /**
     * 获取会话医生的id
     * @param sessionId
     * @param handler
     */
    static findDoctorIds(sessionId,handler){
        let sql =
            "SELECT u.id, u.name, false is_patient, p.participant_role,u.avatar FROM sessions s, participants p, doctors u " +
            "WHERE s.id = ? AND s.id = p.session_id AND p.participant_id = u.id ";
        ImDb.execQuery({
            "sql": sql,
            "args": [sessionId],
            "handler": handler
        });
    }
    /**
     * 获取会话的居民的家庭成员
     * @param sessionId
     * @param handler
     */
    static findFamilyIds(sessionId, handler){
        let sql =
            "SELECT u.id, u.name, true is_patient, p.participant_role,u.avatar,ps.name pname,ps.id pid " +
            "FROM sessions s, participants p, patients u ,wlyy.wlyy_patient_family_member m,patients ps " +
            "WHERE s.id = ? and s.id = p.session_id and p.participant_id = m.patient AND m.family_member = u.id and m.is_authorize = 1 and p.participant_id = ps.id ";
        //新增发送代理人
        ImDb.execQuery({
            "sql": sql,
            "args": [sessionId],
            "handler": handler
        });
    }
    /**
     * 获取会话的成员头像列表
     *
     * @param sessionId
     * @param handler
     */
    static findAllAvatars(sessionId, handler) {
        let sql = "SELECT u.id, u.avatar,'0' as ispatient,u.name as name FROM sessions s, participants p, doctors u " +
            "WHERE s.id = ? AND s.id = p.session_id AND p.participant_id = u.id union " +
            "SELECT u.id, u.avatar,'1' as ispatient,u.name as name FROM sessions s, participants p, patients u " +
            "WHERE s.id = ? AND s.id = p.session_id AND p.participant_id = u.id";
        ImDb.execQuery({
            "sql": sql,
            "args": [sessionId, sessionId],
            "handler": handler
        });
    }
    /**
     * 获取会话的成员列表
     *
     * @param sessionId
     * @param participantId
     * @param role
     * @param handler
     */
    static updateParticipant(sessionId, participantId, role, handler) {
        let sql = "update participants set participant_role = ? WHERE session_id = ? AND participant_id = ?";
        ImDb.execQuery({
            "sql": sql,
            "args": [role, sessionId, participantId],
            "handler": handler
        });
    }
    /**
     * 获取P2P成员所在会话。将成员的ID排序后取哈希值即可。
     *
     * @param userId
     * @param anotherUserId
     * @param handler
     */
    static findSessionIdByParticipantIds(userId, anotherUserId, handler) {
        let sessionId = DbUtil.stringArrayHash([userId, anotherUserId]);
        handler(null, sessionId);
    }
    static getBusinessType(users, handler) {
        let sql = "SELECT count(1) as count FROM patients p WHERE p.id in (?)";
        ImDb.execQuery({
            "sql": sql,
            "args": [users],
            "handler": function (err, res) {
                if (err) {
                    console.log("err businessType  : " + err);
                } else {
                    if (res[0].count > 0) {
                        handler(err, SESSION_BUSINESS_TYPE.PATIENT);
                    } else {
                        handler(err, SESSION_BUSINESS_TYPE.DOCTOR);
                    }
                }
            }
        });
    }
    static findNameById(userId, handler) {
        let sql = "SELECT p.name,p.sex,p.birthdate FROM patients p WHERE p.id =? union SELECT d.name,d.sex,d.birthdate FROM doctors d WHERE d.id =?";
        ImDb.execQuery({
            "sql": sql,
            "args": [userId, userId],
            "handler": function (err, res) {
                if (err) {
                    console.log("err businessType  : " + err);
                } else {
                    handler(null, res);
                }
            }
        });
    }
    static findMucSessionIdByUser(users, handler) {
        //先匹配出在线用户
        let userTemp = [];
        users.forEach(function (user) {
            if (user == SESSION_USER_STATUS.ONLINE) {
                userTemp.push(user);
            }
        });
        let sql = "SELECT DISTINCT s.* FROM " + DB_TABLES.Participants + " p1," + DB_TABLES.Participants + " p2," +
            DB_TABLES.Sessions + " s WHERE p1.session_id =  s.id  AND p2.session_id = s.id  AND s.type =? " +
            "AND ((p1.participant_id =? AND p2.participant_id = ?) or (p1.participant_id =? AND p2.participant_id = ?))";
        ImDb.execQuery({
            "sql": sql,
            "args": [SESSION_TYPES.MUC, userTemp[0], userTemp[1], userTemp[1], userTemp[0]],
            "handler": handler
        });
    }
    /**
     * 更新最后消息获取时间。
     *
     * @param lastMessageTime
     * @param sessionId
     * @param participantId
     * @param handler
     */
    static updateLastFetchTime(lastMessageTime, sessionId, participantId, handler) {
        let sql = "update " + DB_TABLES.Participants + " set last_fetch_time=? WHERE session_id = ? AND participant_id =?";
        ImDb.execQuery({
            "sql": sql,
            "args": [lastMessageTime, sessionId, participantId],
            "handler": handler
        });
    }
    /**
     * 用户是否在指定Session中
     *
     * @param sessionId
     * @param userId
     * @param handler
     */
    static existsParticipant(sessionId, userId, handler) {
        let sql = "SELECT case when count(*) > 0 then true else false end exist FROM participants w WHERE w.session_id =? AND w.participant_id = ? ";
        log.info("用户是否在指定Session中:sql:" + sql);
        log.info("用户是否在指定Session中:args:" + [sessionId, userId]);
        ImDb.execQuery({
            "sql": sql,
            "args": [sessionId, userId],
            "handler": handler
        });
    }
    /**
     * mysql成员创建
     *
     * @param sessionId
     * @param users JSON
     * @param handler
     */
    static saveParticipantsToMysql(sessionId, users, handler) {
        let sql = "INSERT INTO " + DB_TABLES.Participants + " (session_id,participant_id,participant_role,last_fetch_time) VALUES ";
        let args = [];
        let nowDate = new Date();
        log.info("saveParticipantsToMysql:[sql] = " + sql);
        log.info("saveParticipantsToMysql:[users.length] = " + users.length);
        for (let j in users) {
            let tokens = users[j].split(":");
            sql += "(?,?,?,?)";
            args.push(sessionId);
            args.push(tokens[0]);
            args.push(tokens.length > 1 ? tokens[1] : '0');
            args.push(nowDate);
            if (j != users.length - 1) sql += ", ";
            log.info("saveParticipantsToMysql:[args] = " + args);
        }
        sql += " ON DUPLICATE KEY UPDATE participant_role = VALUES(participant_role)";
        ImDb.execQuery({
            "sql": sql,
            "args": args,
            "handler": handler
        });
    }
    static deleteUserFromMysql(sessionId, userId, handler) {
        let sql = "delete from " + DB_TABLES.Participants + " where participant_id=? and session_id=? ";
        ImDb.execQuery({
            "sql": sql,
            "args": [userId, sessionId],
            "handler": handler || function (err, res) {
                log.info("deleteUserFromMysql");
            }
        });
    }
    static deleteAllUser(sessionId, handler) {
        let sql = "delete from " + DB_TABLES.Participants + " where session_id=? ";
        ImDb.execQuery({
            "sql": sql,
            "args": [sessionId],
            "handler": handler || function (err, res) {
                log.info("deleteUserFromMysql");
            }
        });
    }
    static findLastFetchTime(sessionId,userId,handler){
        let sql = "select last_fetch_time from participants p where p.session_id = ? and p.participant_id=?";
        ImDb.execQuery({
            "sql": sql,
            "args": [sessionId,userId],
            "handler": handler
        });
    }
}
module.exports = ParticipantRepo;

+ 0 - 64
src/server/repository/mysql/patient.repo.js

@ -1,64 +0,0 @@
/**
 * 微信用户库,即患者数据库。
 *
 * 目前,患者真实数据存在于家庭医生平台数据库,IM数据库仅是做视图。将来根据需要将通过同步机制将数据同步到IM数据库。
 *
 * author: Sand
 * since: 2016/11/18
 */
"use strict";
let ImDb = require('./db/im.db');
class PatientRepo {
    constructor() {
    }
    static findOne(patientId, handler){
        ImDb.execQuery({
            "sql": "select id, name, sex, birthdate, avatar, openid, idcard,mobile from patients where id = ? ",
            "args": [patientId],
            "handler": handler
        });
    }
    static findWechatOpenId(code, handler) {
        var sql = "select openid from patients where id = ? ";
        ImDb.execQuery({
            "sql": sql,
            "args": [code],
            "handler": handler
        });
    }
    /**
     * 查找自己和家人的openid
     * @param code
     * @param handler
     */
    static findWechatOpenIds(code, handler){
        var sql = "SELECT m.family_member code,p.name,p.openid from wlyy.wlyy_patient p,wlyy.wlyy_patient_family_member m" +
            "  WHERE m.patient = ? and m.family_member=p.code and p.openid is not null and m.is_authorize = 1 " +
            " UNION ALL" +
            "  SELECT p.code,p.name,p.openid  from wlyy.wlyy_patient p WHERE p.code = ?";
        ImDb.execQuery({
            "sql": sql,
            "args": [code,code],
            "handler": handler
        });
    }
    // TODO: 不能直接访问三师库
    static getPatientDoctorConsult(patient, doctor, handler) {
        var sql = "select * from wlyy_consult_team where patient = ? and doctor = ? and status = 0 and del = '1' ";
        ImDb.execQuery({
            "sql": sql,
            "args": [patient, doctor],
            "handler": handler
        });
    };
}
module.exports = PatientRepo;

+ 0 - 160
src/server/repository/mysql/private.msg.repo.js

@ -1,160 +0,0 @@
/**
 * P2P消息库。
 */
"use strict";
var ImDb = require("../mysql/db/im.db.js");
class PrivateMsgRepo {
    constructor() {
    }
    /**
     * 保存消息。
     *
     * @param to
     * @param from
     * @param type
     * @param content
     * @param handler
     */
    static save(to, from, type, content, handler) {
        ImDb.execQuery({
            "sql": "INSERT INTO msg_p2p (to_uid,from_uid,type,content) VALUES (?,?,?,?)",
            "args": [to, from, type, content],
            "handler": handler
        });
    };
    static findOneMessage(messageId, handler) {
        ImDb.execQuery({
            "sql": "SELECT msg_id, to_uid, from_uid, type, content, timestamp from msg_p2p where msg_id = ?",
            "args": [messageId],
            "handler": handler
        });
    };
    static findOnePatientMessage(messageId, handler) {
        ImDb.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
     */
    static findAllMessages(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 msg_id DESC LIMIT ?";
        ImDb.execQuery({
            "sql": sql,
            "args": [to, from, from, to, closedInterval ? end : end + 1, closedInterval ? start : start - 1, count],
            "handler": handler
        });
    };
    /**
     * 查找用户聊天过的医生列表。
     *
     * @param userId 指定的用户
     * @param handler
     */
    static findAllP2PWithDoctor(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"
        ImDb.execQuery({
            "sql": sql,
            "args": [userId, userId, userId],
            "handler": handler
        });
    };
    /**
     * 查找用户聊天过的患者列表。
     *
     * @param userId
     * @param handler
     */
    static findAllP2PWithPatient(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 (1, 2, 3, 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;";
        ImDb.execQuery({
            "sql": sql,
            "args": [userId, userId, userId, userId, userId, userId],
            "handler": handler
        });
    };
    /**
     * 查找未读消息。
     *
     * @param from
     * @param to
     * @param start
     * @param count
     * @param handler
     */
    static findUnread  (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 ?";
        ImDb.execQuery({
            "sql": sql,
            "args": [from, to, start, count],
            "handler": handler
        });
    };
    static isCurrentSessionFinished(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";
        ImDb.execQuery({
            "sql": sql,
            "args": [doctorId, patientId],
            "handler": handler
        });
    };
}
module.exports = PrivateMsgRepo;

+ 0 - 248
src/server/repository/mysql/search.repo.js

@ -1,248 +0,0 @@
'use strict';
let ImDb = require('../mysql/db/im.db');
let async = require("async");
let ObjectUtil = require("../../util/object.util.js");
let vsprintf = require("sprintf-js").vsprintf;
const DB_TABLES = require('../../include/commons').DB_TABLES;
class SearchRepo {
    constructor() {
    }
    /**
     * 查询正常会话及议题已结束的会话(P2P, MUC)
     *
     * @param userId
     * @param handler
     */
    static findTopicEndedSessionIdList(userId, handler) {
        let sql = "SELECT s.id " +
            "FROM sessions s, topics t, participants p " +
            "WHERE p.participant_id = ? AND p.session_id = s.id AND s.id = t.session_id AND t.end_message_id IS NOT NULL AND s.`type` IN (1,2,8) " +
            " 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, 4)";
        ImDb.execQuery({
            sql: sql,
            args: [userId, userId],
            handler: handler
        });
    }
    /**
     * 查询正常会话及议题已结束的会话(P2P, MUC)
     *
     * @param userId
     * @param handler
     */
    static findTopicActiveSessionIdList(userId, handler) {
        let sql = "SELECT s.id " +
            "FROM sessions s, topics t, participants p " +
            "WHERE p.participant_id = ? AND p.session_id = s.id AND s.id = t.session_id AND t.end_message_id IS NULL  AND s.`type` IN (1,2,8) " +
            " 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,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({
            sql: sql,
            args: [userId, userId,userId],
            handler: handler
        });
    }
    /**
     * 全部搜索
     *
     * @param sessionIdList
     * @param keyword
     * @param userTable
     * @param handler
     */
    static searchAll(sessionIdList,userId, keyword, userTable, handler) {
        let data = {};
        async.waterfall([
            function (callback) {
                SearchRepo.searchUser(sessionIdList,userId, keyword, userTable, 0, 4, function (err, res) {
                    if (err) return handler(err, null);
                    let buffer = SearchRepo.userForge(res);
                    data.users = buffer;
                    callback(null);
                });
            },
            function (callback) {
                SearchRepo.searchSessions(sessionIdList,userId, keyword, 0, 4, function (err, res) {
                    if (err) return handler(err, null);
                    data.sessions = SearchRepo.sessionForge(res, keyword);
                    callback(null);
                })
            },
            function (callback) {
                SearchRepo.searchMessages(sessionIdList,userId, keyword, 0, 4, function (err, res) {
                    if (err) return handler(err, null);
                    data.messages = SearchRepo.messageForge(res);
                    handler(null, data);
                })
            }
        ]);
    }
    /**
     * 用户搜索
     *
     * @param sessionIdList
     * @param keyword
     * @param userTable
     * @param page
     * @param size
     * @param handler
     */
    static searchUser(sessionIdList,userId, keyword, userTable, page, size, handler) {
        let sql = "SELECT DISTINCT u.name user_name,s.id session_id, s.name session_name, s.type session_type, s.business_type, u.id user_id,u.sex, u.birthdate, u.avatar,u.idcard %s " +
            " FROM  participants p, " + userTable +
            " u,sessions s WHERE s.id in (?) AND s.id = p.session_id AND p.participant_id = u.id and p.participant_id<>? AND (u.name like ? or u.idcard like ?) ";
        if (userTable === DB_TABLES.Doctors) {
            sql += " AND s.type = 2 and s.business_type = 1 ";
        }else{
            sql += " AND s.type in (1,2,8)  and s.business_type = 2 ";
        }
        sql += " limit ?, ? ";
        sql = vsprintf(sql, [userTable == DB_TABLES.Doctors ? ', hospital_name' : '']);
        keyword = '%' + keyword + '%';
        ImDb.execQuery({
            sql: sql,
            args: [sessionIdList,userId, keyword,keyword, page * size, size],
            handler: handler
        });
    }
    /**
     * 会话搜索。搜索会话名称与会话成员的名称。若有一个符合,就选中。
     */
    static searchSessions(sessionIdList,userId, keyword, page, size, handler) {
          if (sessionIdList.length == 0) {
            return handler(null, []);
        }
        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,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 + '%';
        ImDb.execQuery({
            sql: sql,
            args: [sessionIdList,userId, keyword,keyword, page * size, size],
            handler: handler
        });
    }
    /**
     * 消息搜索
     */
    static searchMessages(sessionIdList,userId, keyword, page, size, handler) {
        let sql = "SELECT * FROM(" +
            "SELECT s.id session_id, s.name session_name, s.type session_type, s.business_type session_business_type, m.id message_id, m.sender_id, m.sender_name, m.timestamp, m.content " +
            "FROM sessions s, muc_messages m " +
            "WHERE s.id IN (?) AND s.id = m.session_id AND s.`type` = 1 AND m.content_type = 1 AND m.content LIKE ? " +
            " UNION " +
            "SELECT s.id session_id, s.name session_name, s.type session_type, s.business_type session_business_type, m.id message_id, m.sender_id, m.sender_name, m.timestamp, m.content " +
            "FROM sessions s, p2p_messages m " +
            "WHERE s.id IN (?) AND s.id = m.session_id AND s.`type` = 2 AND m.content_type = 1 AND m.content LIKE ? " +
            " UNION " +
            "SELECT s.id session_id, s.name session_name, s.type session_type, s.business_type session_business_type, m.id message_id, m.sender_id, m.sender_name, m.timestamp, m.content " +
            "FROM sessions s, group_messages m " +
            "WHERE s.id IN (?) AND s.id = m.session_id AND s.`type` in (3,5) AND m.content_type = 1 AND m.content LIKE ? ) X " +
            "ORDER BY X.session_id, X.message_id LIMIT ?, ?";
        keyword = '%' + keyword + '%';
        ImDb.execQuery({
            sql: sql,
            args: [sessionIdList, keyword, sessionIdList, keyword, sessionIdList, keyword, page * size, size],
            handler: handler
        });
    }
    static userForge(res) {
        res.forEach(function (user) {
            if (!user.avatar) user.avatar = "";
                user.birthdate = user.birthdate ? user.birthdate.getTime():"";
        });
        return res;
    }
    static sessionForge(res, keyword) {
        let result = [];
        let lastSessionId = null;
        let tempSession = null;
        res.forEach(function (session) {
            if (session.id !== lastSessionId) {
                lastSessionId = session.id;
                tempSession = {
                    id: session.id,
                    name: session.name,
                    type: session.type,
                    business_type: session.business_type,
                    /*create_date: ObjectUtil.timestampToLong(session.create_date),*/
                    members: []
                };
                result.push(tempSession);
            }
            if (session.participant_name.indexOf(keyword) >= 0) tempSession.members.push({name: session.participant_name});
        });
        return result;
    }
    static messageForge(res) {
        let result = [];
        let lastSessionId = null;
        let session = null;
        res.forEach(function (message) {
            if (message.session_id !== lastSessionId) {
                lastSessionId = message.session_id;
                session = {
                    session_id: message.session_id,
                    session_name: message.session_name,
                    session_type: message.session_type,
                    /*session_business_type: message.session_business_type,*/
                    messages: []
                };
                result.push(session);
            }
            session.messages.push({
                id: message.message_id,
                sender_id: message.sender_id,
                sender_name: message.sender_name,
                timestamp: ObjectUtil.timestampToLong(message.timestamp),
                content: message.content
            });
        });
        return result;
    }
}
module.exports = SearchRepo;

+ 0 - 433
src/server/repository/mysql/session.repo.js

@ -1,433 +0,0 @@
/**
 * 会话库。
 */
"use strict";
let ImDb = require('../mysql/db/im.db');
let log = require('../../util/log.js');
const DB_TABLES = require('../../include/commons').DB_TABLES;
const PARTICIPANT_ROLES = require('../../include/commons').PARTICIPANT_ROLES;
const SESSION_STATUS = require('../../include/commons').SESSION_STATUS;
const SESSION_BUSINESS_TYPE = require('../../include/commons').SESSION_BUSINESS_TYPE;
class SessionRepo {
    constructor() {
    }
    /**
     * 获取单个session对象
     *
     * @param sessionId
     * @param handler
     */
    static findOne(sessionId, handler) {
        let sessionSQL = "select id,name,type,create_date,business_type from " + DB_TABLES.Sessions + " s where s.id = ?";
        ImDb.execQuery({
            "sql": sessionSQL,
            "args": [sessionId],
            "handler": handler || function (err, res) {
                if(err) log.error(err);
            }
        });
    }
    /**
     * 获取用户全部会话不包含角色未1的会话
     *
     * @param userId
     * @param handler
     */
    static findAll(userId, handler) {
        let sql = "select session_id from " + DB_TABLES.Participants + " w where w.participant_id = ? and participant_role =0  group by w.session_id";
        let sys_session = "select session_id from " + DB_TABLES.Participants + " w where w.participant_id = 'system' and participant_role =0  group by w.session_id";
        let sessionSQL = "select id, name, type, create_date,business_type, last_sender_id, last_sender_name, last_content_type, last_content, last_message_time,status from "
            + DB_TABLES.Sessions + " s where s.id in(" + sql + ") and s.id not in ("+sys_session+")";
        ImDb.execQuery({
            "sql": sessionSQL,
            "args": [userId],
            "handler": handler || function (err, res) {
                if(err) log.error(err);
            }
        });
    }
    /**
     * 获取用户全部(未结束的)会话不包含角色未1的会话
     * @param userId
     * @param handler
     */
    static findUnEndAll(userId, handler) {
        let sql = "select session_id from " + DB_TABLES.Participants + " w where w.participant_id = ? and participant_role =0  group by w.session_id";
        let sys_session = "select session_id from " + DB_TABLES.Participants + " w where w.participant_id = 'system' and participant_role =0  group by w.session_id";
        let sessionSQL = "select id, name, type, create_date,business_type, last_sender_id, last_sender_name, last_content_type, last_content, last_message_time,status from "
            + DB_TABLES.Sessions + " s where s.id in(" + sql + ") and s.id not in ("+sys_session+") and s.`status` = 0";
        ImDb.execQuery({
            "sql": sessionSQL,
            "args": [userId],
            "handler": handler || function (err, res) {
                if(err) log.error(err);
            }
        });
    }
    /**
     * 获取用户全部会话忽略角色
     *
     * @param userId
     * @param handler
     */
    static findAllIgnoreRole(userId, handler) {
        let sql = "select session_id from " + DB_TABLES.Participants + " w where w.participant_id = ?  group by w.session_id";
        let sys_session = "select session_id from " + DB_TABLES.Participants + " w where w.participant_id = 'system' and participant_role =0  group by w.session_id";
        let sessionSQL = "select id, name, type, create_date,business_type, last_sender_id, last_sender_name, last_content_type, last_content, last_message_time,status from "
            + DB_TABLES.Sessions + " s where s.id in(" + sql + ") and s.id not in ("+sys_session+")";
        ImDb.execQuery({
            "sql": sessionSQL,
            "args": [userId],
            "handler": handler || function (err, res) {
                if(err) log.error(err);
            }
        });
    }
    /**
     * 获取用户全部会话
     *
     * @param userId
     * @param type
     * @param handler
     */
    static findAllByType(userId, type, handler) {
        let sql = "select session_id from " + DB_TABLES.Participants + " w where w.participant_id = ? and type=? group by w.session_id";
        let sessionSQL = "select id, name, type, create_date, last_sender_id, last_sender_name, last_content_type, last_content, last_message_time from "
            + DB_TABLES.Sessions + " s where s.id in(" + sql + ") ";
        log.info("获取用户全部会话: sql :" + sql);
        log.info("获取用户全部会话: args :" + args);
        ImDb.execQuery({
            "sql": sessionSQL,
            "args": [userId, type],
            "handler": handler || function (err, res) {
                if(err) log.error(err);
            }
        });
    }
    /**
     * 查找某类型的用户的会话数量
     * @param userId
     * @param type
     * @param handler
     */
    static findSessionCountByType(userId,type,status,handler){
        let sql = "select session_id count from " + DB_TABLES.Participants + " w where w.participant_id = ? group by w.session_id";
        let sessionSQL = "select count(id) count from " + DB_TABLES.Sessions + " s where s.id in(" + sql + ") and s.type=?";
        if(status != null){
            sessionSQL = sessionSQL + " and s.status="+status;
        }
        ImDb.execQuery({
            "sql": sessionSQL,
            "args": [userId, type],
            "handler": handler || function (err, res) {
                if(err) log.error(err);
            }
        });
    }
    /**
     * 分页获取用户会话列表
     * @param userId
     * @param type
     * @param handler
     */
    static findListByType(userId, type,page,pagesize, status,handler) {
        log.info("type="+type);
        if (page > 0) {
            if (page == 1) {
                page = 0;
            }else{
                page = (parseInt(page)-1) * parseInt(pagesize);
            }
        }
        let sql = "select session_id from " + DB_TABLES.Participants + " w where w.participant_id in(?) group by w.session_id";
        let sessionSQL = "select id, name, type, create_date, last_sender_id, last_sender_name, last_content_type, last_content, last_message_time from "
            + DB_TABLES.Sessions + " s where s.id in(" + sql + ") and s.type in("+type+") ";
        if(status != null && status != ""){
            sessionSQL += " and s.status="+status
        }
        sessionSQL +=  " order by s.last_message_time desc limit "+page+","+pagesize;
        log.info(sessionSQL)
        ImDb.execQuery({
            "sql": sessionSQL,
            "args": [userId],
            "handler": handler || function (err, res) {
                if(err) log.error(err);
            }
        });
    }
    static findAllByTypeAndStatus(userId, businessType,status,page,pagesize, handler) {
        if (page > 0) {
            if (page == 1) {
                page = 0;
            }else{
                page = (parseInt(page)-1) * parseInt(pagesize);
            }
        }
        let sessionSQL ="";
        let sql ="";
        if(status == SESSION_STATUS.ENDED){
            if(businessType == SESSION_BUSINESS_TYPE.PATIENT){//区分居民,有未读消息的置顶排列
                //找出已经结束的咨询
                sql = "select session_id from " + DB_TABLES.Participants + " w where w.participant_id = ?  group by w.session_id";
                //找出角色讨论组中为旁听且未结束的咨询
                let sql1 = ("select session_id from " + DB_TABLES.Participants + " w where w.participant_id = ? and participant_role ="+PARTICIPANT_ROLES.REGULAR+" group by w.session_id")
                sessionSQL =  "select s.* from " + DB_TABLES.Sessions + " s, " + DB_TABLES.Participants + " p " +
                    " where ((s.id in(" + sql + ") and s.business_type = ? and s.status = 1) or (s.id in(" + sql1 + ") and s.business_type = ? and s.status = 0)) " +
                    // " and s.id = p.session_id and p.participant_id = ? ORDER BY (p.last_fetch_time - s.last_message_time+1)>0,s.create_date desc limit "+page+","+pagesize;
                    " and s.id = p.session_id and p.participant_id = ? ORDER BY s.last_message_time desc limit "+page+","+pagesize;
                ImDb.execQuery({
                    "sql": sessionSQL,
                    "args": [userId, businessType,userId,businessType,userId],
                    "handler": handler || function (err, res) {
                        if(err) log.error(err);
                    }
                });
            }else{
                //找出已经结束的咨询
                sql = "select session_id from " + DB_TABLES.Participants + " w where w.participant_id = ?  group by w.session_id";
                //找出角色讨论组中为旁听且未结束的咨询
                let sql1 = ("select session_id from " + DB_TABLES.Participants + " w where w.participant_id = ? and participant_role ="+PARTICIPANT_ROLES.REGULAR+" group by w.session_id")
                sessionSQL =  "select * from "
                    + DB_TABLES.Sessions + " s where (s.id in(" + sql + ") and s.business_type = ? and s.status = 1) or (s.id in(" + sql1 + ") and s.business_type = ? and s.status = 0) limit "+page+","+pagesize;
                log.info("findAllByTypeAndStatus: sql " + sessionSQL);
                log.info("findAllByTypeAndStatus: args " + [userId, businessType,userId,businessType]);
                ImDb.execQuery({
                    "sql": sessionSQL,
                    "args": [userId, businessType,userId,businessType],
                    "handler": handler || function (err, res) {
                        if(err) log.error(err);
                    }
                });
            }
        }else{
            sql = "select session_id from " + DB_TABLES.Participants + " w where w.participant_id = ? and participant_role ="+PARTICIPANT_ROLES.HOST+" group by w.session_id";
            sessionSQL =  "select * from "
                + DB_TABLES.Sessions + " s where s.id in(" + sql + ") and s.business_type = ? and s.status = ? limit "+page+","+pagesize;
            log.info("findAllByTypeAndStatus: sql : "+sessionSQL);
            log.info("findAllByTypeAndStatus: args : "+[userId, businessType,status]);
            ImDb.execQuery({
                "sql": sessionSQL,
                "args": [userId, businessType,status],
                "handler": handler || function (err, res) {
                    if(err) log.error(err);
                }
            });
        }
    }
    static findAllByType(userId, businessType,page,pagesize, handler) {
        if (page > 0) {
            if (page == 1) {
                page = 0;
            }else{
                page = (parseInt(page)-1) * parseInt(pagesize);
            }
        }
        // MDT 不执行 businessType 的过滤查询 20191028
        if(businessType){
            let sessionSQL ="";
            let sql ="";
            //sql = "select session_id from " + DB_TABLES.Participants + " w where w.participant_id = ? and participant_role ="+PARTICIPANT_ROLES.HOST+" group by w.session_id";
            //中山医院无法查询到所有会话记录,暂时取消participant_role的判断条件 20190619
            sql = "select session_id from " + DB_TABLES.Participants + " w where w.participant_id = ? group by w.session_id";
            sessionSQL =  "select * from "
                + DB_TABLES.Sessions + " s where s.id in(" + sql + ") and s.business_type = ? and s.type!=0 limit "+page+","+pagesize;
            ImDb.execQuery({
                "sql": sessionSQL,
                "args": [userId, businessType],
                "handler": handler || function (err, res) {
                    if(err) log.error(err);
                }
            });
        }else{
            let sessionSQL ="";
            let sql ="";
            //sql = "select session_id from " + DB_TABLES.Participants + " w where w.participant_id = ? and participant_role ="+PARTICIPANT_ROLES.HOST+" group by w.session_id";
            //中山医院无法查询到所有会话记录,暂时取消participant_role的判断条件 20190619
            sql = "select session_id from " + DB_TABLES.Participants + " w where w.participant_id = ? group by w.session_id";
            sessionSQL =  "select * from "
                + DB_TABLES.Sessions + " s where s.id in(" + sql + ") and s.type!=0 limit "+page+","+pagesize;
            ImDb.execQuery({
                "sql": sessionSQL,
                "args": [userId],
                "handler": handler || function (err, res) {
                    if(err) log.error(err);
                }
            });
        }
    }
    /**
     * 按时间跨度查询会话。
     *
     * TODO: 暂时屏蔽与患者相关的会话,包括MUC与患者名医咨询
     *
     * @param userId
     * @param dateSpan
     * @param handler
     */
    static findAllByTimestampAndType(userId, dateSpan, handler) {
        let sql = "SELECT DISTINCT s.id, CASE WHEN TYPE = 2 THEN d.name ELSE s.name END 'name',s.last_content_type, s.type, s.create_date, s.business_type " +
        "FROM sessions s, participants p " +
        "LEFT JOIN doctors d ON p.participant_id = d.id " +
        "WHERE s.id = p.session_id AND s.last_sender_id <> 'system' " +
        "AND UNIX_TIMESTAMP(s.last_message_time) > UNIX_TIMESTAMP(NOW()) - ? " +
        "AND p.participant_id <> ? AND s.type <> 1 AND s.business_type = 1 " +
        "AND s.id in (select s.id from sessions s, participants p where s.id = p.session_id and p.participant_id = ?) " +
         "ORDER BY s.last_message_time DESC";
        ImDb.execQuery({
            sql: sql,
            args: [dateSpan * 3600 * 24, userId, userId],
            handler: handler || function (err, res) {
                if(err) log.error(err);
            }
        });
    }
    /**
     * 获取用户置顶会话
     *
     * @param userId
     * @param handler
     */
    static findStickySessions(userId, handler) {
        let sql = "select session_id from " + DB_TABLES.Participants + " w where w.participant_id = ? group by w.session_id";
        let sessionSQL = "select s.id,s.name,s.type,s.create_date from " + DB_TABLES.Sessions + " s," + DB_TABLES.StickySessions + " ss  where s.id = ss.session_id s.id in(" + sql + ")";
        ImDb.execQuery({
            "sql": sessionSQL,
            "args": [userId],
            "handler": handler || function (err, res) {
                if(err) log.error(err);
            }
        });
    }
    /**
     * 保存session。若会话重复创建,则更新会话名称。
     *
     * @param sessionId
     * @param name
     * @param type
     * @param createDate
     * @param businessType
     * @param handler
     */
    static saveSession(sessionId, name, type, createDate, businessType, handler) {
        let sql = "insert into " + DB_TABLES.Sessions + " (id, name, type, create_date,business_type) VALUES (?,?,?,?,?) " +
            "ON DUPLICATE KEY UPDATE name = ?,type = ?";
        ImDb.execQuery({
            "sql": sql,
            "args": [sessionId, name, type, createDate, businessType, name,type],
            "handler": handler || function (err, res) {
                if(err) log.error(err);
            }
        });
    }
    /**
     * 更新会话的最终状态。
     *
     * @param lastSenderId
     * @param lastSenderName
     * @param lastMessageTime
     * @param lastContent
     * @param lastContentType
     * @param sessionId
     * @param handler
     */
    static updateSessionLastStatus(lastSenderId, lastSenderName, lastMessageTime, lastContent, lastContentType, sessionId, handler) {
        let sql = "update " + DB_TABLES.Sessions + " set last_sender_id=?,last_sender_name=?,last_message_time=?,last_content=?,last_content_type=? where id = ?";
        ImDb.execQuery({
            "sql": sql,
            "args": [lastSenderId, lastSenderName, lastMessageTime, lastContent, lastContentType, sessionId],
            "handler": handler || function (err, res) {
                if(err) log.error(err);
            }
        });
    }
    /**
     * 保存置顶会话。
     *
     * @param sessionId
     * @param user
     * @param score
     */
    static saveStickySession(sessionId, user, score) {
        let sql = "insert into " + DB_TABLES.StickySessions + " (user_id,session_id,score) VALUES (?,?,?) ";
        ImDb.execQuery({
            "sql": sql,
            "args": [user, sessionId, score],
            "handler": function (err, res) {
                if (err) {
                    log.error("sql:" + sql + "data:sessionId:" + sessionId + ",user:" + user + ",score:" + score);
                }
            }
        });
    }
    /**
     * 取消会话置顶。
     *
     * @param sessionId
     * @param userId
     */
    static unStickySession(sessionId, userId) {
        let sql = "delete from " + DB_TABLES.StickySessions + " where user_id=? and session_id=? ";
        ImDb.execQuery({
            "sql": sql,
            "args": [userId, sessionId],
            "handler": function (err, res) {
                if (err) {
                    log.error("sql:" + sql + "data:sessionId:" + sessionId + ",user:" + userId);
                }
            }
        });
    }
    static updateSessionStatus(sessionId,status,handler){
        let sql = "update " + DB_TABLES.Sessions + " set status=? where id = ?";
        ImDb.execQuery({
            "sql": sql,
            "args": [status, sessionId],
            "handler": handler || function (err, res) {
                if(err) log.error(err);
            }
        });
    }
    static updateSessionName(sessionId,name,handler){
        let sql = "update " + DB_TABLES.Sessions + " set name=? where id = ?";
        ImDb.execQuery({
            "sql": sql,
            "args": [name, sessionId],
            "handler": handler || function (err, res) {
                if(err) log.error(err);
            }
        });
    }
}
module.exports = SessionRepo;

+ 0 - 51
src/server/repository/mysql/sign.family.repo.js

@ -1,51 +0,0 @@
/**
 * Created by ysj on 2017/12/4.
 */
"use strict";
let log = require('../../util/log');
let ImDb = require('../mysql/db/im.db');
const DB_TABLES = require('../../include/commons').DB_TABLES;
class SignFamilyRepo{
    constructor(){
    }
    /**
     * 获取单个MessageNoticeSetting对象
     *
     * @param session_id
     * @param handler
     */
    static findDoctor(session_id, handler) {
        let sql = "SELECT s.doctor,s.doctor_health from "+DB_TABLES.Participants+" p,"+DB_TABLES.SignFamily+" s WHERE p.session_id = ? and p.participant_id = s.patient and s.`status`>0";
        ImDb.execQuery({
            "sql": sql,
            "args": [session_id],
            "handler": handler || function (err, res) {
                if(err) log.error(err);
            }
        });
    }
    /**
     * 判断医生在会话中是否是健管师
     * @param session_id
     * @param doctor
     * @param handler
     */
    static isHealthDoctor(session_id,doctor, handler) {
        let sql = "SELECT s.doctor_health from "+DB_TABLES.Participants+" p,"+DB_TABLES.SignFamily+" s WHERE p.session_id = ? and p.participant_id = s.patient and s.doctor_health=? and s.`status`>0";
        ImDb.execQuery({
            "sql": sql,
            "args": [session_id,doctor],
            "handler": handler || function (err, res) {
                if(err) log.error(err);
            }
        });
    }
}
module.exports = SignFamilyRepo;

+ 0 - 18
src/server/repository/mysql/system.msg.repo.js

@ -1,18 +0,0 @@
"use strict";
var log = require('../../util/log');
var ImDb = require("../mysql/db/im.db.js");
class SystemMsgRepo {
    constructor(){}
    static save(to, contentType, title, summary, content, handler) {
        ImDb.execQuery({
            "sql": "INSERT INTO msg_system (to_uid,type,title,content,data) VALUES (?,?,?,?,?)",
            "args": [to, contentType, title, summary, content],
            "handler": handler
        });
    }
}
module.exports = SystemMsgRepo;

+ 0 - 481
src/server/repository/mysql/topics.repo.js

@ -1,481 +0,0 @@
/**
 * 搜索功能。
 */
"use strict";
let ImDb = require('../mysql/db/im.db');
let log = require('../../util/log.js');
const DB_TABLES = require('../../include/commons').DB_TABLES;
class TopicRepo {
    constructor() {
    }
    /**
     * 查找议题.
     *
     * @param topicId
     * @param handler
     */
    static findOne(topicId, handler) {
        let sql = "select id, session_id, name, create_time, end_by, end_time," +
            " start_message_id, end_message_id, description, status from " + DB_TABLES.Topics + " where id = ?";
        ImDb.execQuery({
            sql: sql,
            args: [topicId],
            handler: handler || function (err, res) {
                if (err) log.error(err);
            }
        });
    }
    static findLastTopicStatus(sessionId, handler) {
        let sql = "select id from " + DB_TABLES.Topics + " where  session_id = ? order by create_time desc limit 0, 1";
        ImDb.execQuery({
            sql: sql,
            args: [sessionId],
            handler: function (err, res) {
                if (res && res.length == 0) {
                    handler(null, null);
                } else {
                    TopicRepo.findTopicStatus(res[0].id, handler);
                }
            }
        });
    }
    static findLastBySessionId(sessionId, handler) {
        let sql = "select * from " + DB_TABLES.Topics + " where  session_id = ? order by create_time desc limit 0, 1";
        ImDb.execQuery({
            sql: sql,
            args: [sessionId],
            handler: function (err, res) {
                handler(err, res);
            }
        });
    }
    static findAllByUserAndReplyAndStatus(userId,reply,status,page,size,handler){
        let sql = "";
        var args =[];
        if(status==10){
            args.push(userId,status,page,size);
            sql =  "SELECT t.*, s.avatar,s.sex,s.birthdate, s.`name` AS patient_name,c.doctor FROM "+
                  DB_TABLES.Topics+" t,"+DB_TABLES.Participants+" p,"+DB_TABLES.Doctors+" d,"+DB_TABLES.WlyyConsult+" c,"+DB_TABLES.Patients+" s "+
                  "WHERE d.id = p.participant_id AND c.id = t.id AND c.patient = s.id AND p.session_id = t.session_id "+
                  "AND d.id in (?) AND t. STATUS = ? ORDER BY create_time DESC limit ?,?";
        }else{
            args.push(userId,status,reply,page,size);
            sql =  "SELECT t.*, s.avatar,s.sex,s.birthdate, s.`name` AS patient_name,c.doctor FROM "+
                DB_TABLES.Topics+" t,"+DB_TABLES.Participants+" p,"+DB_TABLES.Doctors+" d,"+DB_TABLES.WlyyConsult+" c,"+DB_TABLES.Patients+" s "+
                "WHERE d.id = p.participant_id AND c.id = t.id AND c.patient = s.id AND p.session_id = t.session_id "+
                "AND d.id in (?) AND t. STATUS = ? and t.reply=? ORDER BY create_time DESC limit ?,?";
        }
        ImDb.execQuery({
            sql: sql,
            args: args,
            handler: function (err, res) {
                handler(err, res);
            }
        });
    }
    /**
     * 过滤名医咨询和续方咨询
     * @param userId
     * @param reply
     * @param status
     * @param page
     * @param size
     * @param handler
     */
    static findAllByUserAndReplyAndStatusHealthTopic(userId,reply,status,page,size,handler){
        let sql = "";
        var args =[];
        if(status==10){
            args.push(userId,status,page,size);
            sql =  "SELECT t.*, s.avatar,s.sex,s.birthdate, s.`name` AS patient_name,c.doctor FROM "+
                DB_TABLES.Topics+" t,"+DB_TABLES.Participants+" p,"+DB_TABLES.Doctors+" d,"+DB_TABLES.WlyyConsult+" c,"+DB_TABLES.Patients+" s "+
                "WHERE d.id = p.participant_id AND c.id = t.id AND c.patient = s.id AND p.session_id = t.session_id "+
                "AND d.id in (?) AND t. STATUS = ? AND c.type not in ('6','8') ORDER BY create_time DESC limit ?,?";
        }else{
            args.push(userId,status,reply,page,size);
            sql =  "SELECT t.*, s.avatar,s.sex,s.birthdate, s.`name` AS patient_name,c.doctor FROM "+
                DB_TABLES.Topics+" t,"+DB_TABLES.Participants+" p,"+DB_TABLES.Doctors+" d,"+DB_TABLES.WlyyConsult+" c,"+DB_TABLES.Patients+" s "+
                "WHERE d.id = p.participant_id AND c.id = t.id AND c.patient = s.id AND p.session_id = t.session_id "+
                "AND d.id in (?) AND t. STATUS = ? and t.reply=? AND c.type not in ('6','8') ORDER BY create_time DESC limit ?,?";
        }
        ImDb.execQuery({
            sql: sql,
            args: args,
            handler: function (err, res) {
                handler(err, res);
            }
        });
    }
    /**
     * 按类型查找医生的未回复,进行中,已完成的咨询
     * @param userId
     * @param reply
     * @param status
     * @param type
     * @param page
     * @param size
     * @param handler
     */
    static findAllTopicByType(userId,reply,status,type,patientName,startTime,endTime,page,size,handler){
        let sql = "";
        var args =[];
        var tempParms = "";
        if(patientName){
            tempParms += " and s.name like '%"+patientName+"%' ";
        }
        if(startTime){
            tempParms += " and t.create_time >= '"+startTime+"' ";
        }
        if(endTime){
            tempParms += " and t.create_time <= '"+endTime+"' ";
        }
        if(status==10){
            args.push(userId,status,type,page,size);
            sql =  "SELECT t.*, s.avatar,s.sex,s.birthdate, s.`name` AS patient_name,c.doctor FROM "+
                DB_TABLES.Topics+" t,"+DB_TABLES.Participants+" p,"+DB_TABLES.Doctors+" d,"+DB_TABLES.WlyyConsult+" c,"+DB_TABLES.Patients+" s "+
                "WHERE d.id = p.participant_id AND c.id = t.id AND c.patient = s.id AND p.session_id = t.session_id "+
                "AND d.id in (?) AND t. STATUS = ? AND c.type =? "+tempParms+" ORDER BY create_time DESC limit ?,?";
        }else{
            args.push(userId,status,reply,type,page,size);
            sql =  "SELECT t.*, s.avatar,s.sex,s.birthdate, s.`name` AS patient_name,c.doctor FROM "+
                DB_TABLES.Topics+" t,"+DB_TABLES.Participants+" p,"+DB_TABLES.Doctors+" d,"+DB_TABLES.WlyyConsult+" c,"+DB_TABLES.Patients+" s "+
                "WHERE d.id = p.participant_id AND c.id = t.id AND c.patient = s.id AND p.session_id = t.session_id "+
                "AND d.id in (?) AND t. STATUS = ? and t.reply=? AND c.type = ? "+tempParms+" ORDER BY create_time DESC limit ?,?";
        }
        ImDb.execQuery({
            sql: sql,
            args: args,
            handler: function (err, res) {
                handler(err, res);
            }
        });
    }
    /**
     * 按类型查找医生的未回复,进行中,已完成的咨询 总数
     * @param userId
     * @param reply
     * @param status
     * @param type
     * @param handler
     */
    static topicListCountByType(userId,reply,status,type,patientName,startTime,endTime,handler){
        let sql = "";
        var args =[];
        var tempParms = "";
        if(patientName){
            tempParms += " and s.name like '%"+patientName+"%' ";
        }
        if(startTime){
            tempParms += " and t.create_time >= '"+startTime+"' ";
        }
        if(endTime){
            tempParms += " and t.create_time <= '"+endTime+"' ";
        }
        if(status==10){
            args.push(userId,status,type);
            sql =  "SELECT count(t.id) count FROM "+
                DB_TABLES.Topics+" t,"+DB_TABLES.Participants+" p,"+DB_TABLES.Doctors+" d,"+DB_TABLES.WlyyConsult+" c,"+DB_TABLES.Patients+" s "+
                "WHERE d.id = p.participant_id AND c.id = t.id AND c.patient = s.id AND p.session_id = t.session_id "+
                "AND d.id in (?) AND t. STATUS = ? AND c.type =? "+tempParms;
        }else{
            args.push(userId,status,reply,type);
            sql =  "SELECT count(t.id) count FROM "+
                DB_TABLES.Topics+" t,"+DB_TABLES.Participants+" p,"+DB_TABLES.Doctors+" d,"+DB_TABLES.WlyyConsult+" c,"+DB_TABLES.Patients+" s "+
                "WHERE d.id = p.participant_id AND c.id = t.id AND c.patient = s.id AND p.session_id = t.session_id "+
                "AND d.id in (?) AND t. STATUS = ? and t.reply=? AND c.type = ? "+tempParms;
        }
        ImDb.execQuery({
            sql: sql,
            args: args,
            handler: function (err, res) {
                handler(err, res);
            }
        });
    }
    /**
     * 过滤名医咨询和续方咨询(区分团队)
     * @param userId
     * @param reply
     * @param status
     * @param page
     * @param size
     * @param handler
     */
    static findAllByUserAndReplyAndStatusHealthTeamTopic(userId,reply,status,adminTeamCode,page,size,handler){
        let sql = "";
        var args =[];
        if(status==10){
            args.push(adminTeamCode,userId,status,page,size);
            sql =  "SELECT t.*, s.avatar,s.sex,s.birthdate, s.`name` AS patient_name,c.doctor FROM "+
                DB_TABLES.Topics+" t,"+DB_TABLES.Participants+" p,"+DB_TABLES.Doctors+" d,"+DB_TABLES.WlyyConsultTeam+" c,"+DB_TABLES.Patients+" s "+
                "WHERE d.id = p.participant_id AND c.consult = t.id AND c.patient = s.id AND p.session_id = t.session_id "+
                "AND c.admin_team_code =? AND d.id in (?) AND t. STATUS = ? AND c.type not in ('6','8') ORDER BY create_time DESC limit ?,?";
        }else{
            args.push(adminTeamCode,userId,status,reply,page,size);
            sql =  "SELECT t.*, s.avatar,s.sex,s.birthdate, s.`name` AS patient_name,c.doctor FROM "+
                DB_TABLES.Topics+" t,"+DB_TABLES.Participants+" p,"+DB_TABLES.Doctors+" d,"+DB_TABLES.WlyyConsultTeam+" c,"+DB_TABLES.Patients+" s "+
                "WHERE d.id = p.participant_id AND c.consult = t.id AND c.patient = s.id AND p.session_id = t.session_id "+
                "AND c.admin_team_code =? AND d.id in (?) AND t. STATUS = ? and t.reply=? AND c.type not in ('6','8') ORDER BY create_time DESC limit ?,?";
        }
        ImDb.execQuery({
            sql: sql,
            args: args,
            handler: function (err, res) {
                handler(err, res);
            }
        });
    }
    static findReplyCount(userId,reply,status,adminTeamCode,handler){
        let sql = "";
        var args =[];
        if(status==10){
            args.push(adminTeamCode,userId,status);
            sql =  "SELECT count(1)  as count FROM "+
                DB_TABLES.Topics+" t,"+DB_TABLES.Participants+" p,"+DB_TABLES.Doctors+" d,"+DB_TABLES.WlyyConsultTeam+" c,"+DB_TABLES.Patients+" s "+
                "WHERE d.id = p.participant_id AND c.consult = t.id AND c.patient = s.id AND p.session_id = t.session_id "+
                "AND c.admin_team_code=? AND c.type!=8 AND d.id in (?) AND t. STATUS = ? ";
        }else if(status){
            args.push(adminTeamCode,userId,status,reply);
            sql =  "SELECT count(1) as count FROM "+
                DB_TABLES.Topics+" t,"+DB_TABLES.Participants+" p,"+DB_TABLES.Doctors+" d,"+DB_TABLES.WlyyConsultTeam+" c,"+DB_TABLES.Patients+" s "+
                "WHERE d.id = p.participant_id AND c.consult = t.id AND c.patient = s.id AND p.session_id = t.session_id "+
                "AND c.admin_team_code=? AND c.type!=8 AND d.id in (?) AND t. STATUS = ? and t.reply=? ";
        }else{
            args.push(adminTeamCode,userId);
            sql =  "SELECT count(1) as count FROM "+
                DB_TABLES.Topics+" t,"+DB_TABLES.Participants+" p,"+DB_TABLES.Doctors+" d,"+DB_TABLES.WlyyConsultTeam+" c,"+DB_TABLES.Patients+" s "+
                "WHERE d.id = p.participant_id AND c.consult = t.id AND c.patient = s.id AND p.session_id = t.session_id "+
                "AND c.admin_team_code=? AND c.type!=8 AND d.id in (?)";
        }
        ImDb.execQuery({
            sql: sql,
            args: args,
            handler: function (err, res) {
                if(err){
                    log.error("get topic count error");
                    handler(err,0);
                    return;
                }
                handler(err, res[0].count);
            }
        });
    }
    static findLastTopicStatusAndType(sessionId, handler) {
        let sql = "select id from " + DB_TABLES.Topics + " where  session_id = ? order by create_time desc limit 0, 1";
        ImDb.execQuery({
            sql: sql,
            args: [sessionId],
            handler: function (err, res) {
                if (res && res.length == 0) {
                    handler(null, null);
                } else {
                    TopicRepo.findTopicStatusAndType(res[0].id, handler);
                }
            }
        });
    }
    static findTopicStatus(topicId, handler) {
        let sql = "select id, name, description, status,agent from " + DB_TABLES.Topics + " where id = ?";
        ImDb.execQuery({
            sql: sql,
            args: [topicId],
            handler: handler || function (err, res) {
                if (err) log.error(err);
            }
        });
    }
    static findTopicStatusAndType(topicId, handler) {
        let sql = "select t.id, t.name, t.description, t.status,t.agent,c.type from topics t,base.wlyy_consult c where t.id = ? and t.id = c.id";
        ImDb.execQuery({
            sql: sql,
            args: [topicId],
            handler: handler || function (err, res) {
                if (err) log.error(err);
            }
        });
    }
    /**
     * 获取会话中的议题。
     *
     * @param sessionId
     * @param handler
     */
    static findAllBySessionId(sessionId, handler) {
        let sql = "select id, session_id, name, create_time, end_by, end_time," +
            " start_message_id, end_message_id, description, status from " + DB_TABLES.Topics + " where session_id = ? order by id";
        ImDb.execQuery({
            sql: sql,
            args: [sessionId],
            handler: handler || function (err, res) {
                if (err) log.error(err);
            }
        });
    }
    /**
     * 获取会话中的议题。
     *
     * @param id
     * @param handler
     */
    static findAllByTopicId(id, handler) {
        let sql = "select id, session_id, name, create_time, end_by, end_time," +
            " start_message_id, end_message_id, description, status from " + DB_TABLES.Topics + " where id = ? order by id";
        ImDb.execQuery({
            sql: sql,
            args: [id],
            handler: handler || function (err, res) {
                if (err) log.error(err);
            }
        });
    }
    static findAllBySessionIdsAndStatus(sessionIds, status, page, pagesize, handler) {
        let sql = "select id, session_id, name, create_time, end_by, end_time," +
            " start_message_id, end_message_id, description, status from " + DB_TABLES.Topics + " where session_id in ('" + sessionIds + "') and status in (" + status + ") order by status desc limit ?,? ";
        ImDb.execQuery({
            sql: sql,
            args: [page, pagesize],
            handler: handler || function (err, res) {
                if (err) log.error(err);
            }
        });
    }
    /**
     * 保存议题
     *
     * @param topicName
     * @param topicId
     * @param sessionId
     * @param messageId
     * @param date
     * @param description
     * @param status
     * @param agent
     * @param handler
     */
    static saveTopic(topicName, topicId, sessionId, messageId, date, description, status, agent, handler) {
        let sql = "insert into " + DB_TABLES.Topics + " (id,session_id,name,create_time,start_message_id,description,status,agent) VALUES (?,?,?,?,?,?,?,?)";
        ImDb.execQuery({
            "sql": sql,
            "args": [topicId, sessionId, topicName, date, messageId, description, status, agent],
            "handler": function (err, res) {
                handler(err, res);
            }
        });
    }
    /**
     * 结束议题
     *
     * @param topicId
     * @param endUser
     * @param date
     * @param messageId
     * @param status
     */
    static endTopic(topicId, endUser, date, messageId, status) {
        let sql = "update " + DB_TABLES.Topics + " set end_by = ?,end_time=?,end_message_id=?,status = ? where  id = ?";
        ImDb.execQuery({
            "sql": sql,
            "args": [endUser, date, messageId, status, topicId],
            "handler": function (err, res) {
                if (err) {
                    log.error("endTopic is fail error: " + err);
                } else {
                    log.info("endTopic is success");
                }
            }
        });
    }
    /**
     * 医生第一次回复咨询
     * @param reply_user
     * @param reply_message_id
     * @param topicId
     */
    static replyTopic(reply_user,reply_message_id,topicId,handler){
        let sql = "UPDATE " + DB_TABLES.Topics + " SET reply = 1,reply_time = now(),reply_user = ?,reply_message_id = ? WHERE id = ?";
        ImDb.execQuery({
            "sql": sql,
            "args": [reply_user, reply_message_id, topicId],
            "handler": handler
        });
    }
    /**
     * 更新议题状态。
     *
     * @param topicId
     * @param jsonValue
     * @param handler
     */
    static updateTopics(topicId, jsonValue, handler) {
        let values = [];
        let sql = "UPDATE topics SET ";
        let key = [];
        for (let j in jsonValue) {
            key.push(j + " = ?");
            values.push(jsonValue[j]);
        }
        sql = sql + key.join(",");
        sql = sql + " WHERE id = ?";
        values.push(topicId);
        ImDb.execQuery({
            "sql": sql,
            "args": values,
            "handler": handler
        });
    }
    /**
     * 搜索最后回复时间超过指定时限的议题,此议题最后一条消息的回复者必须是医生,即医生发送消息后,患者未理睬的,关闭。
     *
     * @param timespan 时限,以小时计
     * @param handler
     */
    static findAllBySessionLastActiveTime(timespan, handler) {
        let sql = "SELECT s.id session_id, s.name session_name, s.create_date session_create_time, s.last_message_time, " +
            "t.id topic_id, t.name topic_name, t.create_time topic_create_time, t.start_message_id " +
            "FROM sessions s, wlyy_consults t " +
            "WHERE s.id = t.session_id  AND t.end_message_id IS NULL AND s.last_content_type in(1,2,3,4) and s.last_sender_id IN (SELECT id FROM doctors d where d.id<>t.patient) " +
            "AND UNIX_TIMESTAMP(now()) - UNIX_TIMESTAMP(s.last_message_time) > ? " +
            "ORDER BY t.create_time";
        ImDb.execQuery({
            sql: sql,
            args: [timespan * 3600],
            handler: handler
        });
    }
}
module.exports = TopicRepo;

+ 0 - 65
src/server/repository/mysql/wechat.token.repo.js

@ -1,65 +0,0 @@
/**
 * 微信AccessToken库。
 *
 * author:lyr
 * since: 2016/11/25.
 */
"use strict";
let log = require('../../util/log');
let ImDb = require('../mysql/db/im.db');
let configFile = require('../../include/commons').CONFIG_FILE;
let config = require('../../resources/config/' + configFile);
class WeChatTokenRepo {
    constructor() {
    }
    /**
     * 获取微信AccessToken
     *
     * @param handler 回调函数
     */
    static findOne(handler) {
        ImDb.execQuery({
            "sql": "select access_token, expires_in, add_timestamp from wlyy.wx_access_token where acc_id = '"+config.wechatConfig.accId+"' order by add_timestamp desc limit 0, 1"
            , "handler": handler
        });
    };
    /**
     * 保存AccessToken
     *
     * @param accessToken 微信AccessToken
     * @param expireIn
     * @param createTime
     * @param handler 回调函数
     */
    static save(accessToken, expireIn, createTime, handler) {
        ImDb.execQuery({
            "sql": "insert into wlyy.wx_access_token (acc_id,access_token, expires_in, add_timestamp) values ('"+config.wechatConfig.accId+"',?,?,?)"
            , "args": [accessToken, expireIn, createTime.getTime()]
            , "handler": handler
        });
    }
    /**
     * 微信推送日志
     * @param openid
     * @param patient
     * @param name
     * @param request
     * @param response
     * @param status
     * @param createTime
     */
    static saveLog(openid,patient,name,request,response,status,createTime,handler){
        ImDb.execQuery({
            "sql": "insert into wlyy.wlyy_wx_push_log (type,openid, patient,name,request,response,status, create_time) values (3,?,?,?,?,?,?,?)"
            , "args": [openid,patient,name,request,response,status, createTime]
            , "handler": handler
        });
    }
}
module.exports = WeChatTokenRepo;

+ 7 - 1
src/server/repository/oracle/db/im.db.js

@ -9,6 +9,12 @@ var config =  require('../../../resources/config/' + configFile);
var oracledb = require('oracledb')
var dbUtil = require('../../../util/db.util');
oracledb.poolMax = 100;
oracledb.poolMin = 1;
oracledb.poolPingInterval = 20;
oracledb.poolTimeout = 0;
// 初始化连接池
var pool = oracledb.createPool(config.imDbConfig);
class ImDb {
@ -16,7 +22,7 @@ class ImDb {
    }
    static execQuery (options) {
        dbUtil.execQuery(pool, options);
        dbUtil.execQuery(config.imDbConfig.poolAlias, options);
    };
}

+ 139 - 0
src/server/repository/oracle/db/server2.js

@ -0,0 +1,139 @@
/*
 * @Author: Dongge
 * @Date: 2019-05-16 10:35:38
 * @LastEditTime: 2019-05-24 09:56:04
 * @Description: server for front-end,mock--getfpdjson V1.0
 */
// 经过和node-oracle 模块作者的讨论,合理配置了连接池参数,poolMax:连接池最大保持连接数,需要小于128,poolMin:连接池最小存活连接,poolPingInterval:探活时间,poolTimeout:连接被销毁时间,0为永远不销毁,针对个人开发测试,推荐永远不销毁。--20190520
// 同步和异步ajax测试均通过,模拟原始getresult接口的datasorce成功,增加数据库信息配置文件datasource.ini,增加读取配置文件功能 --20150523
// 编写批处理启动server.cmd,整合运行环境:nodejs包,oracle客户端包instantclient_11_2,发布版V1.0 --20150524
var http = require('http');
var oracledb = require("oracledb");
var fs = require("fs");
var readline = require("readline");
var path = require('path')
var querystring = require('querystring')
oracledb.poolMax = 100;
oracledb.poolMin = 1;
oracledb.poolPingInterval = 20;
oracledb.poolTimeout = 0;
process
    .once('SIGTERM', closePoolAndExit)
    .once('SIGINT', closePoolAndExit);
// readFile 读取文件函数,返回promise
var readFile = async function (path) {
    var rl = readline.createInterface({
        input: fs.createReadStream(path).setEncoding('utf8')
    });
    return new Promise((resolve, reject) => {
        var array = [];
        rl.on("line", line => {
            array.push(line);
        });
        rl.on("close", () => {
            resolve(array);
        });
    });
};
// 初始化连接池
var pool = {};
var initPool = async function () {
    // var dbconfig = await readFile('./datasource.ini');
    // for (var i = 0; i < dbconfig.length; i++) {
    //     var temp = dbconfig[i].split(',');
        try {
            await oracledb.createPool({
                _enableStats: true,
                user: "HLWYY",
                password: 'Xmykzxhlwyy963',  // mypw contains the hr schema password
                connectString: "10.10.10.16:1521/rac",
                poolAlias: "im"
            });
            pool["im"] = true;
        } catch (err) {
            pool["im"] = false;
            console.error(err.message);
            throw new Error('连接池"im"创建失败!");
        }
    // }
}
//退出执行函数
async function closePoolAndExit() {
    console.log("\nTerminating");
    try {
        for(var key in pool){
            await oracledb.getPool(key).close(10);
        }
        process.exit(0);
    } catch (err) {
        console.error(err.message);
        process.exit(1);
    }
}
//查询函数
var executeSql = async function (dataSource, sql) {
    var pool_flag = pool[dataSource];
    if (!pool_flag) {
        return
    }
    var pool_name = oracledb.getPool(dataSource);
    try {
        var connection = await pool_name.getConnection();
        let result = await connection.execute(sql);
        await connection.close();
        return Promise.resolve(result);
    } catch (err) {
        console.log(err.message)
    }
};
(async () => {
    await initPool();
//启动服务器
    var server = http.createServer((req, res) => {
        if (req.url === "/getResult") {
            // 跨域,null是开启本地直接访问服务器特权
            res.setHeader('Access-Control-Allow-Origin', 'null');
            var params = '';
            req.setEncoding('utf8');
            // 采用post请求,接收前端的参数,这里考虑到sql里面可能有汉字,所以前端传过来的是编码后的JSON字符串。
            req.on('data', function (chunk) {
                params += chunk;
            });
            req.on('end', () => {
                params = decodeURIComponent(unescape(params));
                var { sql, dataSource } = JSON.parse(params);
                (async () => {
                    try {
                        var { metaData, rows } = await executeSql(dataSource, sql);
                        var data = [];
                        for (var i = 0; i < rows.length; i++) {
                            var temp = {}
                            for (var j = 0; j < metaData.length; j++) {
                                temp[metaData[j]['name']] = rows[i][j];
                            }
                            data.push(temp);
                        }
                        var dataReturn = { flag: 1, data: data }
                        res.end(JSON.stringify(dataReturn));
                    } catch (err) {
                        res.end(JSON.stringify({ flag: 0, data: err.message }));
                    }
                })();
            })
        } else if (req.url === "/getlog") {
            //查看连接池状态信息接口,暂时写死了别名,调试用的,需要换成你自己的别名。
            oracledb.getPool('J1_SGS')._logStats();
            res.end();
        }
    })
}

+ 0 - 434
src/server/repository/oracle/session.repo.js

@ -1,434 +0,0 @@
/**
 * 会话库。
 */
"use strict";
let ImDb = require('../oracle/db/im.db');
let log = require('../../util/log.js');
const DB_TABLES = require('../../include/commons').DB_TABLES;
const PARTICIPANT_ROLES = require('../../include/commons').PARTICIPANT_ROLES;
const SESSION_STATUS = require('../../include/commons').SESSION_STATUS;
const SESSION_BUSINESS_TYPE = require('../../include/commons').SESSION_BUSINESS_TYPE;
class SessionRepo {
    constructor() {
    }
    /**
     * 获取单个session对象
     *
     * @param sessionId
     * @param handler
     */
    static findOne(sessionId, handler) {
        let sessionSQL = "SELECT ID,NAME,TYPE,CREATE_DATE,BUSINESS_TYPE FROM " + DB_TABLES.Sessions + " S WHERE S.ID = ?";
        ImDb.execQuery({
            "sql": sessionSQL,
            "args": [sessionId],
            "handler": handler || function (err, res) {
                if(err) log.error(err);
            }
        });
    }
    /**
     * 获取用户全部会话不包含角色未1的会话
     *
     * @param userId
     * @param handler
     */
    static findAll(userId, handler) {
        let sql = "SELECT SESSION_ID FROM " + DB_TABLES.Participants + " W WHERE W.PARTICIPANT_ID = ? AND PARTICIPANT_ROLE =0  GROUP BY W.SESSION_ID";
        let sys_session = "SELECT SESSION_ID FROM " + DB_TABLES.Participants + " W WHERE W.PARTICIPANT_ID = 'SYSTEM' AND PARTICIPANT_ROLE =0  GROUP BY W.SESSION_ID";
        let sessionSQL = "SELECT ID, NAME, TYPE, CREATE_DATE,BUSINESS_TYPE, LAST_SENDER_ID, LAST_SENDER_NAME, LAST_CONTENT_TYPE, LAST_CONTENT, LAST_MESSAGE_TIME,STATUS FROM "
            + DB_TABLES.Sessions + " S WHERE S.ID IN(" + sql + ") AND S.ID NOT IN ("+sys_session+")";
        ImDb.execQuery({
            "sql": sessionSQL,
            "args": [userId],
            "handler": handler || function (err, res) {
                if(err) log.error(err);
            }
        });
    }
    /**
     * 获取用户全部(未结束的)会话不包含角色未1的会话
     * @param userId
     * @param handler
     */
    static findUnEndAll(userId, handler) {
        let sql = "SELECT SESSION_ID FROM " + DB_TABLES.Participants + " W WHERE W.PARTICIPANT_ID = ? AND PARTICIPANT_ROLE =0  GROUP BY W.SESSION_ID";
        let sys_session = "SELECT SESSION_ID FROM " + DB_TABLES.Participants + " W WHERE W.PARTICIPANT_ID = 'SYSTEM' AND PARTICIPANT_ROLE =0  GROUP BY W.SESSION_ID";
        let sessionSQL = "SELECT ID, NAME, TYPE, CREATE_DATE,BUSINESS_TYPE, LAST_SENDER_ID, LAST_SENDER_NAME, LAST_CONTENT_TYPE, LAST_CONTENT, LAST_MESSAGE_TIME,STATUS FROM "
            + DB_TABLES.Sessions + " S WHERE S.ID IN(" + sql + ") AND S.ID NOT IN ("+sys_session+") AND S.`STATUS` = 0";
        ImDb.execQuery({
            "sql": sessionSQL,
            "args": [userId],
            "handler": handler || function (err, res) {
                if(err) log.error(err);
            }
        });
    }
    /**
     * 获取用户全部会话忽略角色
     *
     * @param userId
     * @param handler
     */
    static findAllIgnoreRole(userId, handler) {
        let sql = "SELECT SESSION_ID FROM " + DB_TABLES.Participants + " W WHERE W.PARTICIPANT_ID = ?  GROUP BY W.SESSION_ID";
        let sys_session = "SELECT SESSION_ID FROM " + DB_TABLES.Participants + " W WHERE W.PARTICIPANT_ID = 'SYSTEM' AND PARTICIPANT_ROLE =0  GROUP BY W.SESSION_ID";
        let sessionSQL = "SELECT ID, NAME, TYPE, CREATE_DATE,BUSINESS_TYPE, LAST_SENDER_ID, LAST_SENDER_NAME, LAST_CONTENT_TYPE, LAST_CONTENT, LAST_MESSAGE_TIME,STATUS FROM "
            + DB_TABLES.Sessions + " S WHERE S.ID IN(" + sql + ") AND S.ID NOT IN ("+sys_session+")";
        ImDb.execQuery({
            "sql": sessionSQL,
            "args": [userId],
            "handler": handler || function (err, res) {
                if(err) log.error(err);
            }
        });
    }
    /**
     * 获取用户全部会话
     *
     * @param userId
     * @param type
     * @param handler
     */
    static findAllByType(userId, type, handler) {
        let sql = "SELECT SESSION_ID FROM " + DB_TABLES.Participants + " W WHERE W.PARTICIPANT_ID = ? AND TYPE=? GROUP BY W.SESSION_ID";
        let sessionSQL = "SELECT ID, NAME, TYPE, CREATE_DATE, LAST_SENDER_ID, LAST_SENDER_NAME, LAST_CONTENT_TYPE, LAST_CONTENT, LAST_MESSAGE_TIME FROM "
            + DB_TABLES.Sessions + " S WHERE S.ID IN(" + sql + ") ";
        log.info("获取用户全部会话: sql :" + sql);
        log.info("获取用户全部会话: args :" + args);
        ImDb.execQuery({
            "sql": sessionSQL,
            "args": [userId, type],
            "handler": handler || function (err, res) {
                if(err) log.error(err);
            }
        });
    }
    /**
     * 查找某类型的用户的会话数量
     * @param userId
     * @param type
     * @param handler
     */
    static findSessionCountByType(userId,type,status,handler){
        let sql = "SELECT SESSION_ID COUNT FROM " + DB_TABLES.Participants + " W WHERE W.PARTICIPANT_ID = ? GROUP BY W.SESSION_ID";
        let sessionSQL = "SELECT COUNT(ID) COUNT FROM " + DB_TABLES.Sessions + " S WHERE S.ID IN(" + sql + ") AND S.TYPE=?";
        if(status != null){
            sessionSQL = sessionSQL + " AND S.STATUS="+status;
        }
        ImDb.execQuery({
            "sql": sessionSQL,
            "args": [userId, type],
            "handler": handler || function (err, res) {
                if(err) log.error(err);
            }
        });
    }
    /**
     * 分页获取用户会话列表
     * @param userId
     * @param type
     * @param handler
     */
    static findListByType(userId, type,page,pagesize, status,handler) {
        log.info("type="+type);
        if (page > 0) {
            if (page == 1) {
                page = 0;
            }else{
                page = (parseInt(page)-1) * parseInt(pagesize);
            }
        }
        let sqlTemp = "SELECT rownum r,SESSION_ID FROM " + DB_TABLES.Participants + " W WHERE W.PARTICIPANT_ID IN(?) GROUP BY W.SESSION_ID";
        let sessionSQL = "SELECT ID, NAME, TYPE, CREATE_DATE, LAST_SENDER_ID, LAST_SENDER_NAME, LAST_CONTENT_TYPE, LAST_CONTENT, LAST_MESSAGE_TIME FROM "
            + DB_TABLES.Sessions + " S WHERE S.ID IN(" + sqlTemp + ") AND S.TYPE IN("+type+") ";
        if(status != null && status != ""){
            sessionSQL += " AND S.STATUS="+status
        }
        sessionSQL +=  " ORDER BY S.LAST_MESSAGE_TIME DESC "
        let sql = "SELECT*FROM ( "+sessionSQL+" AND rownum<="+pagesize+") WHERE r>="+page
        log.info(sessionSQL)
        ImDb.execQuery({
            "sql": sql,
            "args": [userId],
            "handler": handler || function (err, res) {
                if(err) log.error(err);
            }
        });
    }
    static findAllByTypeAndStatus(userId, businessType,status,page,pagesize, handler) {
        if (page > 0) {
            if (page == 1) {
                page = 0;
            }else{
                page = (parseInt(page)-1) * parseInt(pagesize);
            }
        }
        let sessionSQL ="";
        let sql ="";
        if(status == SESSION_STATUS.ENDED){
            if(businessType == SESSION_BUSINESS_TYPE.PATIENT){//区分居民,有未读消息的置顶排列
                //找出已经结束的咨询
                sql = "SELECT SESSION_ID FROM " + DB_TABLES.Participants + " W WHERE W.PARTICIPANT_ID = ?  GROUP BY W.SESSION_ID";
                //找出角色讨论组中为旁听且未结束的咨询
                let sql1 = ("SELECT SESSION_ID FROM " + DB_TABLES.Participants + " W WHERE W.PARTICIPANT_ID = ? AND PARTICIPANT_ROLE ="+PARTICIPANT_ROLES.REGULAR+" GROUP BY W.SESSION_ID")
                sessionSQL =  "SELECT S.* FROM " + DB_TABLES.Sessions + " s, " + DB_TABLES.Participants + " P " +
                    " WHERE ((S.ID IN(" + sql + ") AND S.BUSINESS_TYPE = ? AND S.STATUS = 1) OR (S.ID IN(" + sql1 + ") AND S.BUSINESS_TYPE = ? AND S.STATUS = 0)) " +
                    // " and s.id = p.session_id and p.participant_id = ? ORDER BY (p.last_fetch_time - s.last_message_time+1)>0,s.create_date desc limit "+page+","+pagesize;
                    " AND S.ID = P.SESSION_ID AND P.PARTICIPANT_ID = ? ORDER BY S.LAST_MESSAGE_TIME DESC LIMIT "+page+","+pagesize;
                ImDb.execQuery({
                    "sql": sessionSQL,
                    "args": [userId, businessType,userId,businessType,userId],
                    "handler": handler || function (err, res) {
                        if(err) log.error(err);
                    }
                });
            }else{
                //找出已经结束的咨询
                sql = "SELECT SESSION_ID FROM " + DB_TABLES.Participants + " W WHERE W.PARTICIPANT_ID = ?  GROUP BY W.SESSION_ID";
                //找出角色讨论组中为旁听且未结束的咨询
                let sql1 = ("SELECT SESSION_ID FROM " + DB_TABLES.Participants + " W WHERE W.PARTICIPANT_ID = ? AND PARTICIPANT_ROLE ="+PARTICIPANT_ROLES.REGULAR+" GROUP BY W.SESSION_ID")
                sessionSQL =  "SELECT * FROM "
                    + DB_TABLES.Sessions + " S WHERE (S.ID IN(" + sql + ") AND S.BUSINESS_TYPE = ? AND S.STATUS = 1) OR (S.ID IN(" + sql1 + ") AND S.BUSINESS_TYPE = ? AND S.STATUS = 0) LIMIT "+page+","+pagesize;
                log.info("findAllByTypeAndStatus: sql " + sessionSQL);
                log.info("findAllByTypeAndStatus: args " + [userId, businessType,userId,businessType]);
                ImDb.execQuery({
                    "sql": sessionSQL,
                    "args": [userId, businessType,userId,businessType],
                    "handler": handler || function (err, res) {
                        if(err) log.error(err);
                    }
                });
            }
        }else{
            sql = "SELECT SESSION_ID FROM " + DB_TABLES.Participants + " W WHERE W.PARTICIPANT_ID = ? AND PARTICIPANT_ROLE ="+PARTICIPANT_ROLES.HOST+" GROUP BY W.SESSION_ID";
            sessionSQL =  "SELECT * FROM "
                + DB_TABLES.Sessions + " S WHERE S.ID IN(" + sql + ") AND S.BUSINESS_TYPE = ? AND S.STATUS = ? LIMIT "+page+","+pagesize;
            log.info("findAllByTypeAndStatus: sql : "+sessionSQL);
            log.info("findAllByTypeAndStatus: args : "+[userId, businessType,status]);
            ImDb.execQuery({
                "sql": sessionSQL,
                "args": [userId, businessType,status],
                "handler": handler || function (err, res) {
                    if(err) log.error(err);
                }
            });
        }
    }
    static findAllByType(userId, businessType,page,pagesize, handler) {
        if (page > 0) {
            if (page == 1) {
                page = 0;
            }else{
                page = (parseInt(page)-1) * parseInt(pagesize);
            }
        }
        // MDT 不执行 businessType 的过滤查询 20191028
        if(businessType){
            let sessionSQL ="";
            let sql ="";
            //sql = "select session_id from " + DB_TABLES.Participants + " w where w.participant_id = ? and participant_role ="+PARTICIPANT_ROLES.HOST+" group by w.session_id";
            //中山医院无法查询到所有会话记录,暂时取消participant_role的判断条件 20190619
            sql = "SELECT SESSION_ID FROM " + DB_TABLES.Participants + " W WHERE W.PARTICIPANT_ID = ? GROUP BY W.SESSION_ID";
            sessionSQL =  "SELECT * FROM "
                + DB_TABLES.Sessions + " S WHERE S.ID IN(" + sql + ") AND S.BUSINESS_TYPE = ? AND S.TYPE!=0 LIMIT "+page+","+pagesize;
            ImDb.execQuery({
                "sql": sessionSQL,
                "args": [userId, businessType],
                "handler": handler || function (err, res) {
                    if(err) log.error(err);
                }
            });
        }else{
            let sessionSQL ="";
            let sql ="";
            //sql = "select session_id from " + DB_TABLES.Participants + " w where w.participant_id = ? and participant_role ="+PARTICIPANT_ROLES.HOST+" group by w.session_id";
            //中山医院无法查询到所有会话记录,暂时取消participant_role的判断条件 20190619
            sql = "SELECT SESSION_ID FROM " + DB_TABLES.Participants + " W WHERE W.PARTICIPANT_ID = ? GROUP BY W.SESSION_ID";
            sessionSQL =  "SELECT * FROM "
                + DB_TABLES.Sessions + " S WHERE S.ID IN(" + sql + ") AND S.TYPE!=0 LIMIT "+page+","+pagesize;
            ImDb.execQuery({
                "sql": sessionSQL,
                "args": [userId],
                "handler": handler || function (err, res) {
                    if(err) log.error(err);
                }
            });
        }
    }
    /**
     * 按时间跨度查询会话。
     *
     * TODO: 暂时屏蔽与患者相关的会话,包括MUC与患者名医咨询
     *
     * @param userId
     * @param dateSpan
     * @param handler
     */
    static findAllByTimestampAndType(userId, dateSpan, handler) {
        let sql = "SELECT DISTINCT S.ID, CASE WHEN TYPE = 2 THEN D.NAME ELSE S.NAME END 'NAME',S.LAST_CONTENT_TYPE, S.TYPE, S.CREATE_DATE, S.BUSINESS_TYPE " +
        "FROM SESSIONS S, PARTICIPANTS P " +
        "LEFT JOIN DOCTORS D ON P.PARTICIPANT_ID = D.ID " +
        "WHERE S.ID = P.SESSION_ID AND S.LAST_SENDER_ID <> 'system' " +
        "AND UNIX_TIMESTAMP(S.LAST_MESSAGE_TIME) > UNIX_TIMESTAMP(NOW()) - ? " +
        "AND P.PARTICIPANT_ID <> ? AND S.TYPE <> 1 AND S.BUSINESS_TYPE = 1 " +
        "AND S.ID IN (SELECT S.ID FROM SESSIONS S, PARTICIPANTS P WHERE S.ID = P.SESSION_ID AND P.PARTICIPANT_ID = ?) " +
         "ORDER BY S.LAST_MESSAGE_TIME DESC";
        ImDb.execQuery({
            sql: sql,
            args: [dateSpan * 3600 * 24, userId, userId],
            handler: handler || function (err, res) {
                if(err) log.error(err);
            }
        });
    }
    /**
     * 获取用户置顶会话
     *
     * @param userId
     * @param handler
     */
    static findStickySessions(userId, handler) {
        let sql = "SELECT SESSION_ID FROM " + DB_TABLES.Participants + " W WHERE W.PARTICIPANT_ID = ? GROUP BY W.SESSION_ID";
        let sessionSQL = "SELECT S.ID,S.NAME,S.TYPE,S.CREATE_DATE FROM " + DB_TABLES.Sessions + " S," + DB_TABLES.StickySessions + " SS  WHERE S.ID = SS.SESSION_ID S.ID IN(" + sql + ")";
        ImDb.execQuery({
            "sql": sessionSQL,
            "args": [userId],
            "handler": handler || function (err, res) {
                if(err) log.error(err);
            }
        });
    }
    /**
     * 保存session。若会话重复创建,则更新会话名称。
     *
     * @param sessionId
     * @param name
     * @param type
     * @param createDate
     * @param businessType
     * @param handler
     */
    static saveSession(sessionId, name, type, createDate, businessType, handler) {
        let sql = "INSERT INTO " + DB_TABLES.Sessions + " (ID, NAME, TYPE, CREATE_DATE,BUSINESS_TYPE) VALUES (?,?,?,?,?) " +
            "ON DUPLICATE KEY UPDATE NAME = ?,TYPE = ?";
        ImDb.execQuery({
            "sql": sql,
            "args": [sessionId, name, type, createDate, businessType, name,type],
            "handler": handler || function (err, res) {
                if(err) log.error(err);
            }
        });
    }
    /**
     * 更新会话的最终状态。
     *
     * @param lastSenderId
     * @param lastSenderName
     * @param lastMessageTime
     * @param lastContent
     * @param lastContentType
     * @param sessionId
     * @param handler
     */
    static updateSessionLastStatus(lastSenderId, lastSenderName, lastMessageTime, lastContent, lastContentType, sessionId, handler) {
        let sql = "UPDATE " + DB_TABLES.Sessions + " SET LAST_SENDER_ID=?,LAST_SENDER_NAME=?,LAST_MESSAGE_TIME=?,LAST_CONTENT=?,LAST_CONTENT_TYPE=? WHERE ID = ?";
        ImDb.execQuery({
            "sql": sql,
            "args": [lastSenderId, lastSenderName, lastMessageTime, lastContent, lastContentType, sessionId],
            "handler": handler || function (err, res) {
                if(err) log.error(err);
            }
        });
    }
    /**
     * 保存置顶会话。
     *
     * @param sessionId
     * @param user
     * @param score
     */
    static saveStickySession(sessionId, user, score) {
        let sql = "INSERT INTO " + DB_TABLES.StickySessions + " (USER_ID,SESSION_ID,SCORE) VALUES (?,?,?) ";
        ImDb.execQuery({
            "sql": sql,
            "args": [user, sessionId, score],
            "handler": function (err, res) {
                if (err) {
                    log.error("sql:" + sql + "data:sessionId:" + sessionId + ",user:" + user + ",score:" + score);
                }
            }
        });
    }
    /**
     * 取消会话置顶。
     *
     * @param sessionId
     * @param userId
     */
    static unStickySession(sessionId, userId) {
        let sql = "DELETE FROM " + DB_TABLES.StickySessions + " WHERE USER_ID=? AND SESSION_ID=? ";
        ImDb.execQuery({
            "sql": sql,
            "args": [userId, sessionId],
            "handler": function (err, res) {
                if (err) {
                    log.error("sql:" + sql + "data:sessionId:" + sessionId + ",user:" + userId);
                }
            }
        });
    }
    static updateSessionStatus(sessionId,status,handler){
        let sql = "UPDATE " + DB_TABLES.Sessions + " SET STATUS=? WHERE ID = ?";
        ImDb.execQuery({
            "sql": sql,
            "args": [status, sessionId],
            "handler": handler || function (err, res) {
                if(err) log.error(err);
            }
        });
    }
    static updateSessionName(sessionId,name,handler){
        let sql = "UPDATE " + DB_TABLES.Sessions + " SET NAME=? WHERE ID = ?";
        ImDb.execQuery({
            "sql": sql,
            "args": [name, sessionId],
            "handler": handler || function (err, res) {
                if(err) log.error(err);
            }
        });
    }
}
module.exports = SessionRepo;

+ 5 - 7
src/server/resources/config/config.prod.js

@ -1,13 +1,11 @@
"use strict";
let imDbConfig = {
    host: '10.10.10.16',
    user: 'HLWYY',
    port:1521,
    password: 'Xmykzxhlwyy963',
    database: 'rac',
    connectionLimit: '100',
    charset : 'utf8mb4'
    _enableStats: true,
    user: "HLWYY",
    password: 'Xmykzxhlwyy963',  // mypw contains the hr schema password
    connectString: "10.10.10.16:1521/rac",
    poolAlias: "im"
};
// Redis

+ 0 - 71
src/server/util/db.util.js

@ -1,71 +0,0 @@
/**
 * 数据库工具,使用数据库连接池获取连接,执行查询,之后将连接返回连接池。
 */
"use strict";
let configFile = require('../include/commons').CONFIG_FILE;
let config = require('../resources/config/' + configFile);
let log = require('./log');
let crypto = require('crypto');
class DbUtil {
    constructor() {
    }
    static execQuery(pool, options) {
        if (config.showSQL) log.info(options.sql);
        pool.getConnection(function (err, connection) {
            let sql = options['sql'];
            let args = options['args'];
            let handler = options['handler'];
            if (err) {
                return handler(err, null);
            }
            // 执行查询
            if (args) {
                connection.query(sql, args, function (err, results) {
                    if (err) {
                        log.error("Execute SQL failed, arguments: " + args + ", sql: " + sql);
                        return handler(err, results);
                    }
                    handler(null, results);
                });
            } else {
                connection.query(sql, function (err, results) {
                    if (err) {
                        log.error("Execute SQL failed: " + sql);
                        return handler(err, results);
                    }
                    handler(null, results);
                });
            }
            // 返回连接池
            connection.release(function (err) {
                if (err) {
                    log.error('Database - release connection failed, ' + err);
                }
            });
        });
    }
    /**
     * 为字符串数组生成一个Hash值,为保证唯一性,生成前先对数组进行排序。
     *
     * @param stringArray
     */
    static stringArrayHash(stringArray) {
        let sortedArr = stringArray.sort();
        return crypto.createHash("sha1").update(sortedArr.join(",")).digest('hex');
    }
}
module.exports = DbUtil;