Добавлен модуль разсширения "Публикация аналитических данных" (olapp.js)

This commit is contained in:
Mikhail Chechnev 2021-01-24 16:56:11 +03:00
parent b31411f610
commit d72c877ac9

86
modules/olapp.js Normal file
View File

@ -0,0 +1,86 @@
/*
Сервис интеграции ПП Парус 8 с WEB API
Дополнительный модуль: Публикация многомерных отчетов (OLAPP)
*/
//------------------------------
// Подключение внешних библиотек
//------------------------------
const { ServerError } = require("./../core/server_errors"); //Типовая ошибка
const { SERR_APP_SERVER_BEFORE, SERR_DB_SERVER } = require("./../core/constants"); //Общесистемные константы
const oracledb = require("oracledb"); //Работа с СУБД Oracle
//---------------------
// Глобальные константы
//---------------------
//------------
// Тело модуля
//------------
//Обработчик "До" для полученного сообщения
const before = async prms => {
//Если передан идентификатор публикации
if (prms.options.qs && prms.options.qs.STOKEN && prms.options.qs.NPREVIEW && prms.options.qs.NACTUAL_CHECK) {
//И есть подключение к БД
if (prms.dbConn.bConnected) {
let pooledConnection;
try {
//Считаем курсор с данными публикации
pooledConnection = await prms.dbConn.connection.getConnection();
let res = await pooledConnection.execute(
"BEGIN PKG_EXS_EXT_OLAPP_RUN.EXTRACT(STOKEN => :STOKEN, NPREVIEW => :NPREVIEW, NACTUAL_CHECK => :NACTUAL_CHECK, RCDATA => :RCDATA); END;",
{
STOKEN: prms.options.qs.STOKEN,
NPREVIEW: prms.options.qs.NPREVIEW,
NACTUAL_CHECK: prms.options.qs.NACTUAL_CHECK,
RCDATA: { type: oracledb.CURSOR, dir: oracledb.BIND_OUT }
},
{ outFormat: oracledb.OBJECT }
);
//Установим заголовок ответа и начнём выдачу данных
prms.res.set({
"content-type": "application/json;charset=utf-8"
});
prms.res.write("[");
//Обходим курсор и выдаём порционно ответ
const rs = res.outBinds.RCDATA;
let cnt = 1;
let row;
while ((row = await rs.getRow())) {
prms.res.write(Buffer(`${cnt > 1 ? "," : ""}${JSON.stringify(row)}`));
cnt++;
}
//Завершаем передачу
prms.res.write("]");
prms.res.end();
await rs.close();
//Дальше обрабатывать не надо
return {
bStopPropagation: true
};
} catch (e) {
throw new ServerError(SERR_DB_SERVER, e.message);
} finally {
if (pooledConnection) {
try {
await pooledConnection.close();
} catch (e) {
throw new ServerError(SERR_DB_SERVER, e.message);
}
}
}
} else {
throw new ServerError(SERR_DB_SERVER, "Нет подключения к БД");
}
} else {
throw new ServerError(SERR_APP_SERVER_BEFORE, "Запрос к серверу сформирован не корректно");
}
};
//-----------------
// Интерфейс модуля
//-----------------
exports.before = before;