فهرست منبع

Merge branch 'im-internet-hospital-oracle' of huangwenjie/im.doctor into im-internet-hospital-oracle

huangwenjie 5 سال پیش
والد
کامیت
482f317e90

+ 9 - 9
src/server/repository/oracle/db/im.db.js

@ -3,19 +3,19 @@
 * huangwenjie
 */
"use strict";
var configFile = require('../../../include/commons').CONFIG_FILE;
var config =  require('../../../resources/config/' + configFile);
let configFile = require('../../../include/commons').CONFIG_FILE;
let config =  require('../../../resources/config/' + configFile);
var oracledb = require('oracledb')
var dbUtil = require('../../../util/db.util');
// let oracledb = require('oracledb')
let dbUtil = require('../../../util/db.util');
oracledb.poolMax = 100;
oracledb.poolMin = 1;
oracledb.poolPingInterval = 20;
oracledb.poolTimeout = 0;
// oracledb.poolMax = 100;
// oracledb.poolMin = 1;
// oracledb.poolPingInterval = 20;
// oracledb.poolTimeout = 0;
// 初始化连接池
var pool = oracledb.createPool(config.imDbConfig);
// let pool = oracledb.createPool(config.imDbConfig);
class ImDb {
    constructor() {

+ 43 - 44
src/server/repository/oracle/db/server2.js

@ -59,7 +59,7 @@ var initPool = async function () {
        } catch (err) {
            pool["im"] = false;
            console.error(err.message);
            throw new Error('连接池"im"创建失败!");
            throw new Error('连接池"im"创建失败');
        }
    // }
}
@ -94,46 +94,45 @@ var executeSql = async function (dataSource, sql) {
    }
};
(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();
        }
    })
}
// (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();
//         }
//     })
// }

+ 30 - 12
src/server/repository/oracle/session.repo.js

@ -6,6 +6,9 @@
let ImDb = require('../oracle/db/im.db');
let log = require('../../util/log.js');
//oracle工具类
let oracledbUtil = require('../../util/oracledb.util');
const DB_TABLES = require('../../include/commons').DB_TABLES;
const PARTICIPANT_ROLES = require('../../include/commons').PARTICIPANT_ROLES;
const SESSION_STATUS = require('../../include/commons').SESSION_STATUS;
@ -38,17 +41,26 @@ class SessionRepo {
     * @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 sql = "SELECT SESSION_ID FROM " + DB_TABLES.Participants + " W WHERE W.PARTICIPANT_ID = '"+userId+"' 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,
        oracledbUtil.query({
            "sql": sql,
            "args": [userId],
            "handler": handler || function (err, res) {
                if(err) log.error(err);
            }
        });
        //
        // ImDb.execQuery({
        //     "sql": sessionSQL,
        //     "args": [userId],
        //     "handler": handler || function (err, res) {
        //         if(err) log.error(err);
        //     }
        // });
    }
    /**
@ -150,24 +162,30 @@ class SessionRepo {
            }
        }
        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 "
        let sqlTemp = "SELECT SESSION_ID FROM " + DB_TABLES.Participants + " W WHERE W.PARTICIPANT_ID IN('"+userId+"') GROUP BY W.SESSION_ID";
        let sessionSQL = "SELECT rownum r, 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
        let sql = "SELECT * FROM ( "+sessionSQL+" AND rownum<="+pagesize+" ORDER BY S.LAST_MESSAGE_TIME DESC ) WHERE r>="+page
        log.info(sessionSQL)
        ImDb.execQuery({
        oracledbUtil.query({
            "sql": sql,
            "args": [userId],
            "handler": handler || function (err, res) {
                if(err) log.error(err);
            }
        });
        // ImDb.execQuery({
        //     "sql": sql,
        //     "args": [userId],
        //     "handler": handler || function (err, res) {
        //         if(err) log.error(err);
        //     }
        // });
    }
    static findAllByTypeAndStatus(userId, businessType,status,page,pagesize, handler) {
@ -183,13 +201,13 @@ class SessionRepo {
        if(status == SESSION_STATUS.ENDED){
            if(businessType == SESSION_BUSINESS_TYPE.PATIENT){//区分居民,有未读消息的置顶排列
                //找出已经结束的咨询
                sql = "SELECT SESSION_ID FROM " + DB_TABLES.Participants + " W WHERE W.PARTICIPANT_ID = '"+userId+"'  GROUP BY W.SESSION_ID";
                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 = '"+userId+"' AND PARTICIPANT_ROLE ="+PARTICIPANT_ROLES.REGULAR+" 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 rownum r, S.* FROM " + DB_TABLES.Sessions + " s, " + DB_TABLES.Participants + " P " +
                    " WHERE ((S.ID IN(" + sql + ") AND S.BUSINESS_TYPE = "+businessType+" AND S.STATUS = 1) OR (S.ID IN(" + sql1 + ") AND S.BUSINESS_TYPE = "+businessType+" AND S.STATUS = 0)) " +
                    " 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 = '"+userId+"' ";
                    " AND S.ID = P.SESSION_ID AND P.PARTICIPANT_ID = ? ";
                sessionSQL = "SELECT*FROM ( " + sessionSQL +" AND rownum<="+pagesize+" ORDER BY S.LAST_MESSAGE_TIME DESC ) WHERE r>="+page;
                ImDb.execQuery({

+ 12 - 6
src/server/util/db.util.js

@ -8,7 +8,7 @@ let config = require('../resources/config/' + configFile);
let log = require('./log');
let crypto = require('crypto');
var oracledb = require("oracledb");
let oracledb = require("oracledb");
class DbUtil {
    constructor() {
@ -17,7 +17,9 @@ class DbUtil {
    static execQuery(poolName, options) {
        if (config.showSQL) log.info(options.sql);
        var pool_name = oracledb.getPool(poolName);
        let pool = oracledb.createPool(config.imDbConfig);
        let pool_name = oracledb.getPool(poolName);
        // try {
        //     var connection = pool_name.getConnection();
@ -39,7 +41,7 @@ class DbUtil {
            // 执行查询
            if (args) {
                connection.execute(sql,function (err, results) {
                connection.execute(sql,args,function (err, results) {
                    if (err) {
                        log.error(err.message)
                        log.error("Execute SQL failed, arguments: " + args + ", sql: " + sql);
@ -52,6 +54,7 @@ class DbUtil {
            } else {
                connection.execute(sql, function (err, results) {
                    if (err) {
                        log.error(err.message)
                        log.error("Execute SQL failed: " + sql);
                        return handler(err, results);
@ -62,10 +65,13 @@ class DbUtil {
            }
            // 返回连接池
            connection.release(function (err) {
                if (err) {
                    log.error('Database - release connection failed, ' + err);
            connection.close(function(err){
                if(err)
                {
                    console.error("close db connection failed:" + err.message);
                }
                return;
            });
        });
    }

+ 66 - 0
src/server/util/oracledb.util.js

@ -0,0 +1,66 @@
let configFile = require('../include/commons').CONFIG_FILE;
let config = require('../resources/config/' + configFile);
let oracledb = require('oracledb');
let log = require('../util/log.js');
let query = function(options,callback){
    oracledb.getConnection(
        {
            user: config.imDbConfig.user,
            password: config.imDbConfig.password,  // mypw contains the hr schema password
            connectString: config.imDbConfig.connectString
            // poolAlias: "im"
        },
        function (err, connection)
        {
            let sql = options['sql'];
            let args = options['args'];
            let handler = options['handler'];
            log.info(options.sql)
            log.info(options.args)
            if (err)
            {
                console.error(err.message);
                return handler(err, null);
            }/*else{
                console.log("连接成功");
            }*/
            connection.execute(sql, [], function (err, result)
            {
                if (err) {
                    log.error(err.message)
                    log.error("Execute SQL failed: sql" + sql);
                    log.error("Execute SQL failed: args" + args);
                    doRelease(connection);
                    return handler(err, result);
                }
                handler(null, result);
                //
                // //console.log(result.metaData);
                // callback(result.rows.map((v)=>
                // {
                //     return result.metaData.reduce((p, key, i)=>
                //     {
                //         p[key.name] = v[i];
                //         return p;
                //     }, {})
                // }));
                doRelease(connection);
            });
        }
    );
}
function doRelease(connection) {
    connection.close(
        function(err) {
            if (err)
                console.error(err.message);
        });
}
exports.query = query;