Browse Source

居民外层消息推送

huangwenjie 5 years ago
parent
commit
7af74da997

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

@ -0,0 +1,88 @@
/**
 * 客户端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;

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

@ -0,0 +1,40 @@
/**
 * 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;

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

@ -0,0 +1,56 @@
/**
 * 消息提醒设置
 * Created by ysj on 2017/12/4.
 */
"use strict";
let log = require('../../util/log');
let ImDb = require('../oracle/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;

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

@ -0,0 +1,181 @@
/**
 * 消息库。
 */
"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/oracle/session.repo');
let ImDb = require('../oracle/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;

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

@ -0,0 +1,320 @@
/**
 * 搜索功能。
 */
"use strict";
let ImDb = require('../oracle/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;

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

@ -0,0 +1,64 @@
/**
 * 微信用户库,即患者数据库。
 *
 * 目前,患者真实数据存在于家庭医生平台数据库,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;

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

@ -0,0 +1,160 @@
/**
 * P2P消息库。
 */
"use strict";
var ImDb = require("../oracle/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;

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

@ -0,0 +1,248 @@
'use strict';
let ImDb = require('../oracle/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 " +
            "FROM SESSIONS S, TOPICS T, PARTICIPANTS P  " +
            " 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;

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

@ -0,0 +1,433 @@
/**
 * 会话库。
 */
"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 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;

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

@ -0,0 +1,51 @@
/**
 * Created by ysj on 2017/12/4.
 */
"use strict";
let log = require('../../util/log');
let ImDb = require('../oracle/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;

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

@ -0,0 +1,18 @@
"use strict";
var log = require('../../util/log');
var ImDb = require("../oracle/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;

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

@ -0,0 +1,481 @@
/**
 * 搜索功能。
 */
"use strict";
let ImDb = require('../oracle/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+" D,"+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+" D,"+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;

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

@ -0,0 +1,65 @@
/**
 * 微信AccessToken库。
 *
 * author:lyr
 * since: 2016/11/25.
 */
"use strict";
let log = require('../../util/log');
let ImDb = require('../oracle/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;