/* Сервис интеграции ПП Парус 8 с WEB API Дополнительный модуль: Интеграция с Фреймворка оценки и прогнозирования состояния оборудования */ //------------------------------ // Подключение внешних библиотек //------------------------------ const xml2js = require("xml2js"); //Конвертация XML в JSON и JSON в XML const _ = require("lodash"); //Работа с коллекциями и объектами //--------------------- // Глобальные константы //--------------------- // Список тегов которые должны содержать массив const tag = [ "ftp_filepath", "data_config" ]; //------------ // Тело модуля //------------ //Обернуть содержимое тега в массив const toArray = (obj, tags) => { for (const prop in obj) { const value = obj[prop]; if (tags.indexOf(prop) != -1 && !_.isArray(obj[prop])) { obj[prop] = JSON.parse("[" + JSON.stringify(value) + "]"); } if (typeof value === "object") { toArray(value, tag); } } return obj; }; //Конвертация в XML const toXML = obj => { const builder = new xml2js.Builder(); return builder.buildObject(obj); }; //Конвертация в JSON const parseXML = xmlDoc => { return new Promise((resolve, reject) => { xml2js.parseString(xmlDoc, { explicitArray: false, mergeAttrs: true }, (err, result) => { if (err) reject(err); else resolve(result); }); }); }; //Конвертация в JSON const toJSON = async obj => { let result = await parseXML(obj); result = result.root; toArray(result, tag); return result; }; //Обработчик "До" отправки запроса к сервису "СБИС" const beforeDocParse = async prms => { try { //Конвертируем XML из "Парус 8" в понятный "СБИСу" JSON let obj = await toJSON(prms.queue.blMsg.toString()); //Собираем и отдаём общий результат работы return { options: { simple: false, }, blMsg: Buffer.from(JSON.stringify(obj)) }; } catch (e) { throw Error(e); } }; //Обработчик "После" запроса к сервису "СБИС" const afterDocParseResp = async prms => { //Преобразуем JSON ответ сервиса "СБИС" в XML, понятный "Парус 8" let resu = null; if (prms.queue.blResp) { try { resu = toXML(JSON.parse(prms.queue.blResp.toString())); } catch (e) { throw new Error(`Неожиданный ответ сервера. Ошибка интерпретации: ${e.message}`); } } else { throw new Error('Сервер не вернул ответ'); } //Возврат результата return { blResp: Buffer.from(resu) }; }; //Обработчик "После" запроса к сервису const beforeDocParseMsg = async prms => { //Преобразуем JSON ответ сервиса в XML, понятный "Парус 8" let resu = null; if (prms.queue.blMsg) { try { resu = toXML(JSON.parse(prms.queue.blMsg.toString())); } catch (e) { throw new Error(`Неожиданный ответ сервера. Ошибка интерпретации: ${e.message}`); } } else { throw new Error('Сервер не вернул ответ'); } //Возврат результата return { blMsg: Buffer.from(resu) }; }; exports.beforeDocParse = beforeDocParse; exports.afterDocParseResp = afterDocParseResp; exports.beforeDocParseMsg = beforeDocParseMsg;