ЦИТК-916 - Рассылка E-Mail - поддержка PG

This commit is contained in:
Mikhail Chechnev 2025-04-05 14:01:17 +03:00
parent ca64cbd6b4
commit e6d6971391

View File

@ -10,7 +10,6 @@
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
//--------------------- //---------------------
// Глобальные константы // Глобальные константы
@ -24,84 +23,37 @@ 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 => {
let pooledConnection; await prms.dbConn.executeStored({
try { connection: prms.dbConn.connection,
pooledConnection = await prms.connection.getConnection(); sName: "PKG_EXS_EXT_MAIL.EXSEXTMAIL_SET_STATUS",
await pooledConnection.execute( inPrms: {
"begin PKG_EXS_EXT_MAIL.EXSEXTMAIL_SET_STATUS(NRN => :NRN, SERR_TEXT => :SERR_TEXT, NSTATUS => :NSTATUS); end;", NRN: prms.nRn,
{ NRN: prms.nRn, SERR_TEXT: prms.sErrMsg, NSTATUS: prms.nStatus }, SERR_TEXT: prms.sErrMsg,
{ autoCommit: true } NSTATUS: prms.nStatus
);
} 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 pooledConnection; let attachData = await prms.dbConn.executeStored({
try { connection: prms.dbConn.connection,
pooledConnection = await prms.connection.getConnection(); sName: "PKG_EXS_EXT_MAIL.GET_ATTACH",
let res = await pooledConnection.execute( inPrms: { NIDENT: prms.nIdent },
"begin PKG_EXS_EXT_MAIL.GET_ATTACH(NIDENT => :NIDENT, RCDOCUMENTS => :RCDOCUMENTS); end;", outPrms: { RCDOCUMENTS: prms.dbConn.connector.DT_CURSOR }
{ });
NIDENT: prms.nIdent, let rowsRes = [];
RCDOCUMENTS: { type: oracledb.CURSOR, dir: oracledb.BIND_OUT } if (attachData)
}, if (attachData.RCDOCUMENTS)
{ outFormat: oracledb.OBJECT, autoCommit: true } attachData.RCDOCUMENTS.map(data => {
);
let rows = await readCursorData(res.outBinds.RCDOCUMENTS);
let rowsRes = [];
//Если результат запроса не пустой
if (rows.length !== 0) {
//Переводим BLOB в BUFFER и формируем формат аттача
for (let i = 0; i < rows.length; i++) {
let rowContent = await rows[i].BDATA.getData();
rowsRes.push({ rowsRes.push({
filename: rows[i].FILENAME, filename: data.FILENAME ? data.FILENAME : data.filename,
content: rowContent content: data.BDATA ? data.BDATA : data.bdata
}); });
} });
} 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
@ -125,7 +77,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({ connection: prms.dbConn.connection, nIdent: parseRes.mail.ident }); parseRes.mail.attachments = await getMailAttach({ dbConn: prms.dbConn, nIdent: parseRes.mail.ident });
} }
//Если указан текст в обычном формате //Если указан текст в обычном формате
if (parseRes.mail.text) { if (parseRes.mail.text) {
@ -158,7 +110,7 @@ const before = async prms => {
//Если имеется рег. номер записи очереди отправки E-mail - обновляем информацию о текущем сообщении //Если имеется рег. номер записи очереди отправки E-mail - обновляем информацию о текущем сообщении
if (parseRes.mail.nExsextmailId) { if (parseRes.mail.nExsextmailId) {
await setSendMsg({ await setSendMsg({
connection: prms.dbConn.connection, dbConn: prms.dbConn,
nRn: parseRes.mail.nExsextmailId, nRn: parseRes.mail.nExsextmailId,
sErrMsg: "", sErrMsg: "",
nStatus: NSTATUS_DONE nStatus: NSTATUS_DONE
@ -170,7 +122,7 @@ const before = async prms => {
//Если имеется рег. номер записи очереди отправки E-mail - обновляем информацию о текущем сообщении //Если имеется рег. номер записи очереди отправки E-mail - обновляем информацию о текущем сообщении
if (parseRes.mail.nExsextmailId) { if (parseRes.mail.nExsextmailId) {
await setSendMsg({ await setSendMsg({
connection: prms.dbConn.connection, dbConn: prms.dbConn,
nRn: parseRes.mail.nExsextmailId, nRn: parseRes.mail.nExsextmailId,
sErrMsg: res, sErrMsg: res,
nStatus: NSTATUS_ERR nStatus: NSTATUS_ERR