From d72c877ac9f31e01c3fee6861868b9df96d451b9 Mon Sep 17 00:00:00 2001 From: Mikhail Chechnev Date: Sun, 24 Jan 2021 16:56:11 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=20=D0=BC=D0=BE=D0=B4=D1=83=D0=BB=D1=8C=20=D1=80=D0=B0?= =?UTF-8?q?=D0=B7=D1=81=D1=88=D0=B8=D1=80=D0=B5=D0=BD=D0=B8=D1=8F=20"?= =?UTF-8?q?=D0=9F=D1=83=D0=B1=D0=BB=D0=B8=D0=BA=D0=B0=D1=86=D0=B8=D1=8F=20?= =?UTF-8?q?=D0=B0=D0=BD=D0=B0=D0=BB=D0=B8=D1=82=D0=B8=D1=87=D0=B5=D1=81?= =?UTF-8?q?=D0=BA=D0=B8=D1=85=20=D0=B4=D0=B0=D0=BD=D0=BD=D1=8B=D1=85"=20(o?= =?UTF-8?q?lapp.js)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- modules/olapp.js | 86 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 modules/olapp.js diff --git a/modules/olapp.js b/modules/olapp.js new file mode 100644 index 0000000..bb9d431 --- /dev/null +++ b/modules/olapp.js @@ -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;