forked from CITKParus/P8-ExchangeService
Compare commits
No commits in common. "45d149dd2308007673e8284e0123448968a2f38f" and "113ccca2b8c4204e00593fad1916cd2955951340" have entirely different histories.
45d149dd23
...
113ccca2b8
@ -12,7 +12,7 @@ let common = {
|
|||||||
//Версия сервера приложений
|
//Версия сервера приложений
|
||||||
sVersion: "8.5.6.1",
|
sVersion: "8.5.6.1",
|
||||||
//Релиз сервера приложений
|
//Релиз сервера приложений
|
||||||
sRelease: "2025.04.29",
|
sRelease: "2025.02.04",
|
||||||
//Таймаут останова сервера (мс)
|
//Таймаут останова сервера (мс)
|
||||||
nTerminateTimeout: 60000,
|
nTerminateTimeout: 60000,
|
||||||
//Контролировать версию Системы
|
//Контролировать версию Системы
|
||||||
|
@ -360,8 +360,8 @@ const appProcess = async prms => {
|
|||||||
default:
|
default:
|
||||||
//Установим флаг возврата полного ответа (и тела и заголовков)
|
//Установим флаг возврата полного ответа (и тела и заголовков)
|
||||||
options.resolveWithFullResponse = true;
|
options.resolveWithFullResponse = true;
|
||||||
//Установим таймаут подключения (если задан в настройках функции и ещё не задан в параметрах сообщения)
|
//Установим таймаут подключения
|
||||||
if (prms.function.nTimeoutConn && !options.timeout) options.timeout = prms.function.nTimeoutConn;
|
options.timeout = prms.function.nTimeoutConn ? prms.function.nTimeoutConn : null;
|
||||||
//Отправляем запрос
|
//Отправляем запрос
|
||||||
serverResp = prms.function.nTimeoutAsynch
|
serverResp = prms.function.nTimeoutAsynch
|
||||||
? await wrapPromiseTimeout(prms.function.nTimeoutAsynch, rqp(options))
|
? await wrapPromiseTimeout(prms.function.nTimeoutAsynch, rqp(options))
|
||||||
|
@ -19,7 +19,6 @@ const { SDDAUTH_API_CLIENT_ID, SDEPARTMENT_NAME, SDEPARTMENT_ID } = require("./d
|
|||||||
// Список тегов которые должны содержать массив
|
// Список тегов которые должны содержать массив
|
||||||
const tag = [
|
const tag = [
|
||||||
"DocumentAttachments",
|
"DocumentAttachments",
|
||||||
"Metadata",
|
|
||||||
"Signatures",
|
"Signatures",
|
||||||
"CorrectionRequests",
|
"CorrectionRequests",
|
||||||
"Receipts",
|
"Receipts",
|
||||||
@ -56,13 +55,13 @@ const buildOrganizationsByInnKppURL = srvRoot => {
|
|||||||
//Обернуть содержимое тега в массив
|
//Обернуть содержимое тега в массив
|
||||||
const toArray = (obj, tags) => {
|
const toArray = (obj, tags) => {
|
||||||
for (const prop in obj) {
|
for (const prop in obj) {
|
||||||
let value = obj[prop];
|
const value = obj[prop];
|
||||||
if (typeof value === "object") {
|
|
||||||
obj[prop] = toArray(value, tag);
|
|
||||||
}
|
|
||||||
if (tags.indexOf(prop) != -1 && !_.isArray(obj[prop])) {
|
if (tags.indexOf(prop) != -1 && !_.isArray(obj[prop])) {
|
||||||
obj[prop] = JSON.parse("[" + JSON.stringify(value) + "]");
|
obj[prop] = JSON.parse("[" + JSON.stringify(value) + "]");
|
||||||
}
|
}
|
||||||
|
if (typeof value === "object") {
|
||||||
|
toArray(value, tag);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return obj;
|
return obj;
|
||||||
};
|
};
|
||||||
@ -134,31 +133,31 @@ const buildHeaders = (sAPIClientId, sToken = null) => ({
|
|||||||
});
|
});
|
||||||
|
|
||||||
//Отбор организций
|
//Отбор организций
|
||||||
const getOrganizations = organizations => {
|
const GetOrganizations = Organizations => {
|
||||||
//Параметры отбора
|
//Параметры отбора
|
||||||
let isRoaming = false;
|
let isRoaming = false;
|
||||||
let isActive = true;
|
let isActive = true;
|
||||||
//Итоговая выборка
|
//Итоговая выборка
|
||||||
let organization = { Organizations: [] };
|
let Organization = { Organizations: [] };
|
||||||
//Найдем активную организацию не в роуминге
|
//Найдем активную организацию не в роуминге
|
||||||
organization.Organizations[0] = organizations.Organizations.find(org => (org.IsRoaming === isRoaming) && (org.IsActive === isActive));
|
Organization.Organizations[0] = Organizations.Organizations.find(Org => (Org.IsRoaming === isRoaming) && (Org.IsActive === isActive));
|
||||||
//Если не удалось получить организацию не в роуминге
|
//Если не удалось получить организацию не в роуминге
|
||||||
if (!organization.Organizations[0]) {
|
if (!Organization.Organizations[0]) {
|
||||||
//Если нет организации не в роуминге и найдено более одной организации
|
//Если нет организации не в роуминге и найдено более одной организации
|
||||||
if (organizations.Organizations.length > 1) {
|
if (Organizations.Organizations.length > 1) {
|
||||||
throw Error(`Найдено несколько организаций в роуминге.`);
|
throw Error(`Найдено несколько организаций в роуминге.`);
|
||||||
} else {
|
} else {
|
||||||
//Вернем единственную найденую организацию
|
//Вернем единственную найденую организацию
|
||||||
return organizations[0];
|
return Organizations[0];
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
//Вернем найденую организацию
|
//Вернем найденую организацию
|
||||||
return organization;
|
return Organization;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
//Получение организации по ИНН/КПП контрагента
|
//Получение организации по ИНН/КПП контрагента
|
||||||
const getOrganization = async (sSrvRoot, headers, nInn, nKpp) => {
|
const GetOrganization = async (sSrvRoot, headers, nInn, nKpp) => {
|
||||||
//Параметры запроса
|
//Параметры запроса
|
||||||
let rqpOptions;
|
let rqpOptions;
|
||||||
let serverResp;
|
let serverResp;
|
||||||
@ -178,11 +177,11 @@ const getOrganization = async (sSrvRoot, headers, nInn, nKpp) => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
//Получение ящика организации по ИНН/КПП контрагента
|
//Получение ящика организации по ИНН/КПП контрагента
|
||||||
const getOrganizationBoxId = async (sSrvRoot, headers, nInn, nKpp) => {
|
const GetOrganizationBoxId = async (sSrvRoot, headers, nInn, nKpp) => {
|
||||||
//Параметры запроса
|
//Параметры запроса
|
||||||
let rqpOptions;
|
let rqpOptions;
|
||||||
let serverResp;
|
let serverResp;
|
||||||
let organization = {};
|
let Organization = {};
|
||||||
//Формируем запрос для получения BoxId по ИНН/КПП
|
//Формируем запрос для получения BoxId по ИНН/КПП
|
||||||
rqpOptions = {
|
rqpOptions = {
|
||||||
uri: buildOrganizationsByInnKppURL(sSrvRoot),
|
uri: buildOrganizationsByInnKppURL(sSrvRoot),
|
||||||
@ -198,13 +197,13 @@ const getOrganizationBoxId = async (sSrvRoot, headers, nInn, nKpp) => {
|
|||||||
serverResp = await rqp(rqpOptions);
|
serverResp = await rqp(rqpOptions);
|
||||||
try {
|
try {
|
||||||
//Получим организацию не в роуминге (или единственную организацию в роуминге)
|
//Получим организацию не в роуминге (или единственную организацию в роуминге)
|
||||||
serverResp = getOrganizations(serverResp);
|
serverResp = GetOrganizations(serverResp);
|
||||||
if (!serverResp?.Organizations[0]) {
|
if (!serverResp?.Organizations[0]) {
|
||||||
throw Error(`Не удалось получить ящик получателя для контрагента с ИНН: ${nInn} и КПП: ${nKpp}`);
|
throw Error(`Не удалось получить ящик получателя для контрагента с ИНН: ${nInn} и КПП: ${nKpp}`);
|
||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
//Получим головную организацию по ИНН/КПП
|
//Получим головную организацию по ИНН/КПП
|
||||||
serverResp = await getOrganization(sSrvRoot, headers, nInn, nKpp);
|
serverResp = await GetOrganization(sSrvRoot, headers, nInn, nKpp);
|
||||||
};
|
};
|
||||||
//Проверим соответствие КПП организации
|
//Проверим соответствие КПП организации
|
||||||
if ((serverResp?.Organizations[0]?.Kpp != nKpp) && (serverResp?.Organizations[0])) {
|
if ((serverResp?.Organizations[0]?.Kpp != nKpp) && (serverResp?.Organizations[0])) {
|
||||||
@ -213,7 +212,7 @@ const getOrganizationBoxId = async (sSrvRoot, headers, nInn, nKpp) => {
|
|||||||
//Если найден подходящий департамент - запомним идентификатор и выходим из цикла
|
//Если найден подходящий департамент - запомним идентификатор и выходим из цикла
|
||||||
if (serverResp.Organizations[0].Departments[i]?.Kpp == nKpp) {
|
if (serverResp.Organizations[0].Departments[i]?.Kpp == nKpp) {
|
||||||
//Сохраняем полученный ответ
|
//Сохраняем полученный ответ
|
||||||
organization.DepartmentId = serverResp.Organizations[0].Departments[i].DepartmentId;
|
Organization.DepartmentId = serverResp.Organizations[0].Departments[i].DepartmentId;
|
||||||
break;
|
break;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
@ -223,12 +222,12 @@ const getOrganizationBoxId = async (sSrvRoot, headers, nInn, nKpp) => {
|
|||||||
throw new Error(`Не удалось получить ящик получателя для контрагента с ИНН: ${nInn} и КПП: ${nKpp}`);
|
throw new Error(`Не удалось получить ящик получателя для контрагента с ИНН: ${nInn} и КПП: ${nKpp}`);
|
||||||
}
|
}
|
||||||
//Не удалось получить департаментом с соответствующим КПП
|
//Не удалось получить департаментом с соответствующим КПП
|
||||||
if ((serverResp?.Organizations[0]?.Kpp != nKpp) && (!organization?.DepartmentId)) {
|
if ((serverResp?.Organizations[0]?.Kpp != nKpp) && (!Organization?.DepartmentId)) {
|
||||||
throw new Error(`Не удалось получить ящик получателя для контрагента с ИНН: ${nInn} и КПП: ${nKpp}, у головной организации отсутствует подразделение с КПП: ${nKpp}`);
|
throw new Error(`Не удалось получить ящик получателя для контрагента с ИНН: ${nInn} и КПП: ${nKpp}, у головной организации отсутствует подразделение с КПП: ${nKpp}`);
|
||||||
}
|
}
|
||||||
//Сохраняем полученный ответ
|
//Сохраняем полученный ответ
|
||||||
organization.BoxId = serverResp.Organizations[0].Boxes[0].BoxId;
|
Organization.BoxId = serverResp.Organizations[0].Boxes[0].BoxId;
|
||||||
return organization;
|
return Organization;
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
throw Error(`Ошибка при получении ящика получателя: ${e.message}`);
|
throw Error(`Ошибка при получении ящика получателя: ${e.message}`);
|
||||||
};
|
};
|
||||||
@ -299,7 +298,7 @@ const beforeMessagePost = async prms => {
|
|||||||
};
|
};
|
||||||
//Переменные для запросов
|
//Переменные для запросов
|
||||||
let serverResp;
|
let serverResp;
|
||||||
let organization;
|
let Organization;
|
||||||
try {
|
try {
|
||||||
//Выполним запрос
|
//Выполним запрос
|
||||||
serverResp = await rqp(rqpOptions);
|
serverResp = await rqp(rqpOptions);
|
||||||
@ -320,11 +319,11 @@ const beforeMessagePost = async prms => {
|
|||||||
throw Error(`Ошибка при получении ящика текущей организации: ${e.message}`);
|
throw Error(`Ошибка при получении ящика текущей организации: ${e.message}`);
|
||||||
}
|
}
|
||||||
//Получим ящик получателя
|
//Получим ящик получателя
|
||||||
organization = await getOrganizationBoxId(prms.service.sSrvRoot, buildHeaders(sAPIClientId, sToken), prms.options.inn_cs, prms.options.kpp_cs);
|
Organization = await GetOrganizationBoxId(prms.service.sSrvRoot, buildHeaders(sAPIClientId, sToken), prms.options.inn_cs, prms.options.kpp_cs);
|
||||||
obj.ToBoxId = organization.BoxId;
|
obj.ToBoxId = Organization.BoxId;
|
||||||
//Если не заполнен идентификатор подразделения и при получении ящика удалось его подобрать
|
//Если не заполнен идентификатор подразделения и при получении ящика удалось его подобрать
|
||||||
if ((!obj.ToDepartmentId) && (organization.DepartmentId)) {
|
if ((!obj.ToDepartmentId) && (Organization.DepartmentId)) {
|
||||||
obj.ToDepartmentId = organization.DepartmentId;
|
obj.ToDepartmentId = Organization.DepartmentId;
|
||||||
};
|
};
|
||||||
//Если пришел ответ
|
//Если пришел ответ
|
||||||
if (prms.queue.blResp && serverResp.statusCode == 200) {
|
if (prms.queue.blResp && serverResp.statusCode == 200) {
|
||||||
@ -584,7 +583,6 @@ const afterEvent = async prms => {
|
|||||||
boxIds.boxIds[i].Kpp = serverResp?.Organization?.Kpp;
|
boxIds.boxIds[i].Kpp = serverResp?.Organization?.Kpp;
|
||||||
boxIds.boxIds[i].FullName = serverResp?.Organization?.FullName;
|
boxIds.boxIds[i].FullName = serverResp?.Organization?.FullName;
|
||||||
boxIds.boxIds[i].ShortName = serverResp?.Organization?.ShortName;
|
boxIds.boxIds[i].ShortName = serverResp?.Organization?.ShortName;
|
||||||
boxIds.boxIds[i].FnsParticipantId = serverResp?.Organization?.FnsParticipantId;
|
|
||||||
} else {
|
} else {
|
||||||
//Не удалось получить информацию о контрагенте по ящику организации
|
//Не удалось получить информацию о контрагенте по ящику организации
|
||||||
throw new Error(`Не удалось получить информацию о контрагенте по ящику организации ${boxIds.boxIds[i].boxId}`);
|
throw new Error(`Не удалось получить информацию о контрагенте по ящику организации ${boxIds.boxIds[i].boxId}`);
|
||||||
@ -603,7 +601,6 @@ const afterEvent = async prms => {
|
|||||||
resp.Events[i].Message.FromKpp = box.Kpp;
|
resp.Events[i].Message.FromKpp = box.Kpp;
|
||||||
resp.Events[i].Message.FromFullName = box.FullName;
|
resp.Events[i].Message.FromFullName = box.FullName;
|
||||||
resp.Events[i].Message.FromShortName = box.ShortName;
|
resp.Events[i].Message.FromShortName = box.ShortName;
|
||||||
resp.Events[i].Message.FromFnsParticipantId = box.FnsParticipantId;
|
|
||||||
}
|
}
|
||||||
//Если надо добавить информацию по ящику-получателю
|
//Если надо добавить информацию по ящику-получателю
|
||||||
box = boxIds.boxIds.find(box => box.boxId === resp.Events[i]?.Message.ToBoxId);
|
box = boxIds.boxIds.find(box => box.boxId === resp.Events[i]?.Message.ToBoxId);
|
||||||
@ -612,7 +609,6 @@ const afterEvent = async prms => {
|
|||||||
resp.Events[i].Message.ToKpp = box.Kpp;
|
resp.Events[i].Message.ToKpp = box.Kpp;
|
||||||
resp.Events[i].Message.ToFullName = box.FullName;
|
resp.Events[i].Message.ToFullName = box.FullName;
|
||||||
resp.Events[i].Message.ToShortName = box.ShortName;
|
resp.Events[i].Message.ToShortName = box.ShortName;
|
||||||
resp.Events[i].Message.ToFnsParticipantId = box.FnsParticipantId;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -821,14 +817,14 @@ const beforeDepartmentIdGet = async prms => {
|
|||||||
//Обработчик "После" отправки запроса на получение списка подразделений контрагента к сервису "ДИАДОК"
|
//Обработчик "После" отправки запроса на получение списка подразделений контрагента к сервису "ДИАДОК"
|
||||||
const afterDepartmentIdGet = async prms => {
|
const afterDepartmentIdGet = async prms => {
|
||||||
let resu = null;
|
let resu = null;
|
||||||
let organization = {};
|
let Organization = {};
|
||||||
//Действие выполнено успешно
|
//Действие выполнено успешно
|
||||||
if (prms.optionsResp.statusCode == 200) {
|
if (prms.optionsResp.statusCode == 200) {
|
||||||
try {
|
try {
|
||||||
try {
|
try {
|
||||||
//Получим организацию не в роуминге (или единственную организацию в роуминге)
|
//Получим организацию не в роуминге (или единственную организацию в роуминге)
|
||||||
organization = getOrganizations(JSON.parse(prms.queue.blResp.toString()));
|
Organization = GetOrganizations(JSON.parse(prms.queue.blResp.toString()));
|
||||||
if (!organization) {
|
if (!Organization) {
|
||||||
throw Error(`Не удалось получить ящик для контрагента с ИНН: ${prms.options.nINN} и КПП: ${prms.options.nKPP}`);
|
throw Error(`Не удалось получить ящик для контрагента с ИНН: ${prms.options.nINN} и КПП: ${prms.options.nKPP}`);
|
||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
@ -837,10 +833,10 @@ const afterDepartmentIdGet = async prms => {
|
|||||||
//Считаем токен доступа из контекста сервиса
|
//Считаем токен доступа из контекста сервиса
|
||||||
let sToken = prms.service.sCtx;
|
let sToken = prms.service.sCtx;
|
||||||
//Получим головную организацию по ИНН/КПП
|
//Получим головную организацию по ИНН/КПП
|
||||||
organization = await getOrganization(prms.service.sSrvRoot, buildHeaders(sAPIClientId, sToken), prms.options.nINN, prms.options.nKPP);
|
Organization = await GetOrganization(prms.service.sSrvRoot, buildHeaders(sAPIClientId, sToken), prms.options.nINN, prms.options.nKPP);
|
||||||
};
|
};
|
||||||
//Преобразуем JSON ответ сервиса "ДИАДОК" в XML, понятный "Парус 8"
|
//Преобразуем JSON ответ сервиса "ДИАДОК" в XML, понятный "Парус 8"
|
||||||
resu = toXML({ root: organization });
|
resu = toXML({ root: Organization });
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
throw new Error(`Неожиданный ответ сервера ЭДО "ДИАДОК". Ошибка интерпретации: ${e.message}`);
|
throw new Error(`Неожиданный ответ сервера ЭДО "ДИАДОК". Ошибка интерпретации: ${e.message}`);
|
||||||
}
|
}
|
||||||
|
@ -9,6 +9,7 @@
|
|||||||
|
|
||||||
const { ServerError } = require("./../core/server_errors"); //Типовая ошибка
|
const { ServerError } = require("./../core/server_errors"); //Типовая ошибка
|
||||||
const { SERR_APP_SERVER_BEFORE, SERR_DB_SERVER } = require("./../core/constants"); //Общесистемные константы
|
const { SERR_APP_SERVER_BEFORE, SERR_DB_SERVER } = require("./../core/constants"); //Общесистемные константы
|
||||||
|
const oracledb = require("oracledb"); //Работа с СУБД Oracle
|
||||||
|
|
||||||
//------------
|
//------------
|
||||||
// Тело модуля
|
// Тело модуля
|
||||||
@ -20,37 +21,52 @@ const before = async prms => {
|
|||||||
if (prms.options.qs && prms.options.qs.STOKEN && prms.options.qs.NPREVIEW && prms.options.qs.NACTUAL_CHECK) {
|
if (prms.options.qs && prms.options.qs.STOKEN && prms.options.qs.NPREVIEW && prms.options.qs.NACTUAL_CHECK) {
|
||||||
//И есть подключение к БД
|
//И есть подключение к БД
|
||||||
if (prms.dbConn.bConnected) {
|
if (prms.dbConn.bConnected) {
|
||||||
let olappExtractData = await prms.dbConn.executeStored({
|
let pooledConnection;
|
||||||
sName: "PKG_EXS_EXT_OLAPP_RUN.EXTRACT",
|
try {
|
||||||
inPrms: {
|
//Считаем курсор с данными публикации
|
||||||
|
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,
|
STOKEN: prms.options.qs.STOKEN,
|
||||||
NPREVIEW: prms.options.qs.NPREVIEW,
|
NPREVIEW: prms.options.qs.NPREVIEW,
|
||||||
NACTUAL_CHECK: prms.options.qs.NACTUAL_CHECK
|
NACTUAL_CHECK: prms.options.qs.NACTUAL_CHECK,
|
||||||
|
RCDATA: { type: oracledb.CURSOR, dir: oracledb.BIND_OUT }
|
||||||
},
|
},
|
||||||
outPrms: {
|
{ outFormat: oracledb.OBJECT }
|
||||||
RCDATA: prms.dbConn.connector.DT_CURSOR
|
);
|
||||||
}
|
|
||||||
});
|
|
||||||
//Установим заголовок ответа и начнём выдачу данных
|
//Установим заголовок ответа и начнём выдачу данных
|
||||||
prms.res.set({
|
prms.res.set({
|
||||||
"content-type": "application/json;charset=utf-8"
|
"content-type": "application/json;charset=utf-8"
|
||||||
});
|
});
|
||||||
prms.res.write("[");
|
prms.res.write("[");
|
||||||
if (olappExtractData)
|
//Обходим курсор и выдаём порционно ответ
|
||||||
if (olappExtractData.RCDATA) {
|
const rs = res.outBinds.RCDATA;
|
||||||
let cnt = 1;
|
let cnt = 1;
|
||||||
olappExtractData.RCDATA.map(row => {
|
let row;
|
||||||
|
while ((row = await rs.getRow())) {
|
||||||
prms.res.write(Buffer.from(`${cnt > 1 ? "," : ""}${JSON.stringify(row)}`));
|
prms.res.write(Buffer.from(`${cnt > 1 ? "," : ""}${JSON.stringify(row)}`));
|
||||||
cnt++;
|
cnt++;
|
||||||
});
|
|
||||||
}
|
}
|
||||||
//Завершаем передачу
|
//Завершаем передачу
|
||||||
prms.res.write("]");
|
prms.res.write("]");
|
||||||
prms.res.end();
|
prms.res.end();
|
||||||
|
await rs.close();
|
||||||
//Дальше обрабатывать не надо
|
//Дальше обрабатывать не надо
|
||||||
return {
|
return {
|
||||||
bStopPropagation: true
|
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 {
|
} else {
|
||||||
throw new ServerError(SERR_DB_SERVER, "Нет подключения к БД");
|
throw new ServerError(SERR_DB_SERVER, "Нет подключения к БД");
|
||||||
}
|
}
|
||||||
|
@ -10,6 +10,7 @@
|
|||||||
const xml2js = require("xml2js"); //Конвертация XML в JSON и JSON в XML
|
const xml2js = require("xml2js"); //Конвертация XML в JSON и JSON в XML
|
||||||
const cfg = require("./../config"); //Настройки сервера приложений
|
const cfg = require("./../config"); //Настройки сервера приложений
|
||||||
const { makeErrorText, sendMail } = require("./../core/utils"); //Вспомогательные функции
|
const { makeErrorText, sendMail } = require("./../core/utils"); //Вспомогательные функции
|
||||||
|
const oracledb = require("oracledb"); //Работа с СУБД Oracle
|
||||||
|
|
||||||
//---------------------
|
//---------------------
|
||||||
// Глобальные константы
|
// Глобальные константы
|
||||||
@ -23,37 +24,84 @@ const NSTATUS_DONE = 3;
|
|||||||
// Тело модуля
|
// Тело модуля
|
||||||
//------------
|
//------------
|
||||||
|
|
||||||
|
//Чтение данных из курсора
|
||||||
|
const readCursorData = cursor => {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
let queryStream = cursor.toQueryStream();
|
||||||
|
let rows = [];
|
||||||
|
queryStream.on("data", row => {
|
||||||
|
rows.push(row);
|
||||||
|
});
|
||||||
|
queryStream.on("error", err => {
|
||||||
|
reject(new Error(err.message));
|
||||||
|
});
|
||||||
|
queryStream.on("close", () => {
|
||||||
|
resolve(rows);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
//Установка статуса отправки
|
//Установка статуса отправки
|
||||||
const setSendMsg = async prms => {
|
const setSendMsg = async prms => {
|
||||||
await prms.dbConn.executeStored({
|
let pooledConnection;
|
||||||
connection: prms.dbConn.connection,
|
try {
|
||||||
sName: "PKG_EXS_EXT_MAIL.EXSEXTMAIL_SET_STATUS",
|
pooledConnection = await prms.connection.getConnection();
|
||||||
inPrms: {
|
await pooledConnection.execute(
|
||||||
NRN: prms.nRn,
|
"begin PKG_EXS_EXT_MAIL.EXSEXTMAIL_SET_STATUS(NRN => :NRN, SERR_TEXT => :SERR_TEXT, NSTATUS => :NSTATUS); end;",
|
||||||
SERR_TEXT: prms.sErrMsg,
|
{ NRN: prms.nRn, SERR_TEXT: prms.sErrMsg, NSTATUS: prms.nStatus },
|
||||||
NSTATUS: prms.nStatus
|
{ autoCommit: true }
|
||||||
|
);
|
||||||
|
} catch (e) {
|
||||||
|
throw new Error(e.message);
|
||||||
|
} finally {
|
||||||
|
if (pooledConnection) {
|
||||||
|
try {
|
||||||
|
await pooledConnection.close();
|
||||||
|
} catch (e) {
|
||||||
|
throw new Error(e.message);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
|
||||||
};
|
};
|
||||||
|
|
||||||
//Считывание записей прикладываемых документов
|
//Считывание записей прикладываемых документов
|
||||||
const getMailAttach = async prms => {
|
const getMailAttach = async prms => {
|
||||||
let attachData = await prms.dbConn.executeStored({
|
let pooledConnection;
|
||||||
connection: prms.dbConn.connection,
|
try {
|
||||||
sName: "PKG_EXS_EXT_MAIL.GET_ATTACH",
|
pooledConnection = await prms.connection.getConnection();
|
||||||
inPrms: { NIDENT: prms.nIdent },
|
let res = await pooledConnection.execute(
|
||||||
outPrms: { RCDOCUMENTS: prms.dbConn.connector.DT_CURSOR }
|
"begin PKG_EXS_EXT_MAIL.GET_ATTACH(NIDENT => :NIDENT, RCDOCUMENTS => :RCDOCUMENTS); end;",
|
||||||
});
|
{
|
||||||
|
NIDENT: prms.nIdent,
|
||||||
|
RCDOCUMENTS: { type: oracledb.CURSOR, dir: oracledb.BIND_OUT }
|
||||||
|
},
|
||||||
|
{ outFormat: oracledb.OBJECT, autoCommit: true }
|
||||||
|
);
|
||||||
|
let rows = await readCursorData(res.outBinds.RCDOCUMENTS);
|
||||||
let rowsRes = [];
|
let rowsRes = [];
|
||||||
if (attachData)
|
//Если результат запроса не пустой
|
||||||
if (attachData.RCDOCUMENTS)
|
if (rows.length !== 0) {
|
||||||
attachData.RCDOCUMENTS.map(data => {
|
//Переводим BLOB в BUFFER и формируем формат аттача
|
||||||
|
for (let i = 0; i < rows.length; i++) {
|
||||||
|
let rowContent = await rows[i].BDATA.getData();
|
||||||
rowsRes.push({
|
rowsRes.push({
|
||||||
filename: data.filename,
|
filename: rows[i].FILENAME,
|
||||||
content: data.bdata
|
content: rowContent
|
||||||
});
|
|
||||||
});
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
return rowsRes;
|
return rowsRes;
|
||||||
|
} catch (e) {
|
||||||
|
throw new Error(e.message);
|
||||||
|
} finally {
|
||||||
|
if (pooledConnection) {
|
||||||
|
try {
|
||||||
|
await pooledConnection.close();
|
||||||
|
} catch (e) {
|
||||||
|
throw new Error(e.message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
//Разбор XML
|
//Разбор XML
|
||||||
@ -77,7 +125,7 @@ const before = async prms => {
|
|||||||
parseRes = await parseXML(prms.queue.blMsg.toString());
|
parseRes = await parseXML(prms.queue.blMsg.toString());
|
||||||
//Если есть присоединенные файлы - добавляем их
|
//Если есть присоединенные файлы - добавляем их
|
||||||
if (parseRes.mail.ident) {
|
if (parseRes.mail.ident) {
|
||||||
parseRes.mail.attachments = await getMailAttach({ dbConn: prms.dbConn, nIdent: parseRes.mail.ident });
|
parseRes.mail.attachments = await getMailAttach({ connection: prms.dbConn.connection, nIdent: parseRes.mail.ident });
|
||||||
}
|
}
|
||||||
//Если указан текст в обычном формате
|
//Если указан текст в обычном формате
|
||||||
if (parseRes.mail.text) {
|
if (parseRes.mail.text) {
|
||||||
@ -110,7 +158,7 @@ const before = async prms => {
|
|||||||
//Если имеется рег. номер записи очереди отправки E-mail - обновляем информацию о текущем сообщении
|
//Если имеется рег. номер записи очереди отправки E-mail - обновляем информацию о текущем сообщении
|
||||||
if (parseRes.mail.nExsextmailId) {
|
if (parseRes.mail.nExsextmailId) {
|
||||||
await setSendMsg({
|
await setSendMsg({
|
||||||
dbConn: prms.dbConn,
|
connection: prms.dbConn.connection,
|
||||||
nRn: parseRes.mail.nExsextmailId,
|
nRn: parseRes.mail.nExsextmailId,
|
||||||
sErrMsg: "",
|
sErrMsg: "",
|
||||||
nStatus: NSTATUS_DONE
|
nStatus: NSTATUS_DONE
|
||||||
@ -122,7 +170,7 @@ const before = async prms => {
|
|||||||
//Если имеется рег. номер записи очереди отправки E-mail - обновляем информацию о текущем сообщении
|
//Если имеется рег. номер записи очереди отправки E-mail - обновляем информацию о текущем сообщении
|
||||||
if (parseRes.mail.nExsextmailId) {
|
if (parseRes.mail.nExsextmailId) {
|
||||||
await setSendMsg({
|
await setSendMsg({
|
||||||
dbConn: prms.dbConn,
|
connection: prms.dbConn.connection,
|
||||||
nRn: parseRes.mail.nExsextmailId,
|
nRn: parseRes.mail.nExsextmailId,
|
||||||
sErrMsg: res,
|
sErrMsg: res,
|
||||||
nStatus: NSTATUS_ERR
|
nStatus: NSTATUS_ERR
|
||||||
|
Loading…
x
Reference in New Issue
Block a user