From eca8d40c9416240cf26b3cf4d589e21182cfb2f8 Mon Sep 17 00:00:00 2001 From: Mikhail Chechnev Date: Fri, 13 Oct 2023 23:58:45 +0300 Subject: [PATCH] =?UTF-8?q?WEB=20APP:=20=D0=BF=D0=BE=D0=B4=D0=B4=D0=B5?= =?UTF-8?q?=D1=80=D0=B6=D0=BA=D0=B0=20=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7=D0=BE?= =?UTF-8?q?=D0=B2=D0=B0=D1=82=D0=B5=D0=BB=D1=8C=D1=81=D0=BA=D0=B8=D1=85=20?= =?UTF-8?q?=D0=BE=D0=B1=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D1=87=D0=B8=D0=BA?= =?UTF-8?q?=D0=BE=D0=B2=20=D0=B4=D0=BB=D1=8F=20=D0=B7=D0=BD=D0=B0=D1=87?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B9=20=D1=82=D0=B5=D0=B3=D0=BE=D0=B2=20?= =?UTF-8?q?=D0=B8=20=D0=B0=D1=82=D1=80=D0=B8=D0=B1=D1=83=D1=82=D0=BE=D0=B2?= =?UTF-8?q?=20=D0=BF=D1=80=D0=B8=20=D0=BF=D0=B0=D1=80=D1=81=D0=B8=D0=BD?= =?UTF-8?q?=D0=B3=D0=B5=20=D1=81=D0=B5=D1=80=D0=B2=D0=B5=D1=80=D0=BD=D0=BE?= =?UTF-8?q?=D0=B3=D0=BE=20XML,=20=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=82?= =?UTF-8?q?=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20=D0=B4=D0=B0?= =?UTF-8?q?=D1=82=D1=8B=20=D0=B2=20JSON?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/context/backend.js | 14 +++++++++++++- app/core/client.js | 33 ++++++++++++++++++++++++++------- app/core/utils.js | 5 ++++- 3 files changed, 43 insertions(+), 9 deletions(-) diff --git a/app/context/backend.js b/app/context/backend.js index ceda04e..d6192a7 100644 --- a/app/context/backend.js +++ b/app/context/backend.js @@ -55,6 +55,9 @@ export const BackEndContext = ({ client, children }) => { stored, args, respArg, + isArray, + tagValueProcessor, + attributeValueProcessor, loader = true, loaderMessage = "", throwError = true, @@ -64,7 +67,16 @@ export const BackEndContext = ({ client, children }) => { } = {}) => { try { if (loader !== false) showLoader(loaderMessage); - let result = await client.executeStored({ stored, args, respArg, throwError, spreadOutArguments }); + let result = await client.executeStored({ + stored, + args, + respArg, + isArray, + tagValueProcessor, + attributeValueProcessor, + throwError, + spreadOutArguments + }); if (fullResponse === true || isRespErr(result)) return result; else return result.XPAYLOAD; } catch (e) { diff --git a/app/core/client.js b/app/core/client.js index adae619..5d1d924 100644 --- a/app/core/client.js +++ b/app/core/client.js @@ -38,7 +38,11 @@ const XML_ALWAYS_ARRAY_PATHS = [ "XRESPOND.XPAYLOAD.XOUT_ARGUMENTS", "XRESPOND.XPAYLOAD.XROWS", "XRESPOND.XPAYLOAD.XCOLUMNS_DEF", - "XRESPOND.XPAYLOAD.XCOLUMNS_DEF.values" + "XRESPOND.XPAYLOAD.XCOLUMNS_DEF.values", + "XRESPOND.XPAYLOAD.XGANTT_DEF.taskAttributes", + "XRESPOND.XPAYLOAD.XGANTT_DEF.taskColors", + "XRESPOND.XPAYLOAD.XGANTT_TASKS", + "XRESPOND.XPAYLOAD.XGANTT_TASKS.dependencies" ]; //Типовой постфикс тега для массива (при переводе XML -> JSON) @@ -60,7 +64,7 @@ const getServerDataType = value => { const makeRespErr = ({ message }) => ({ SSTATUS: RESP_STATUS_ERR, SMESSAGE: message }); //Разбор XML -const parseXML = (xmlDoc, isArray, transformTagName) => { +const parseXML = (xmlDoc, isArray, transformTagName, tagValueProcessor, attributeValueProcessor) => { return new Promise((resolve, reject) => { try { let opts = { @@ -71,6 +75,8 @@ const parseXML = (xmlDoc, isArray, transformTagName) => { }; if (isArray) opts.isArray = isArray; if (transformTagName) opts.transformTagName = transformTagName; + if (tagValueProcessor) opts.tagValueProcessor = tagValueProcessor; + if (attributeValueProcessor) opts.attributeValueProcessor = attributeValueProcessor; const parser = new XMLParser(opts); resolve(parser.parse(xmlDoc)); } catch (e) { @@ -101,7 +107,7 @@ const getRespErrMessage = resp => (isRespErr(resp) && resp.SMESSAGE ? resp.SMESS const getRespPayload = resp => (resp && resp.XPAYLOAD ? resp.XPAYLOAD : null); //Исполнение действия на сервере -const executeAction = async ({ serverURL, action, payload = {}, isArray, transformTagName } = {}) => { +const executeAction = async ({ serverURL, action, payload = {}, isArray, transformTagName, tagValueProcessor, attributeValueProcessor } = {}) => { console.log(`EXECUTING ${action ? action : ""} ON ${serverURL} WITH PAYLOAD:`); console.log(payload ? payload : "NO PAYLOAD"); let response = null; @@ -130,7 +136,7 @@ const executeAction = async ({ serverURL, action, payload = {}, isArray, transfo let responseText = await response.text(); //console.log("SERVER RESPONSE TEXT:"); //console.log(responseText); - responseJSON = await parseXML(responseText, isArray, transformTagName); + responseJSON = await parseXML(responseText, isArray, transformTagName, tagValueProcessor, attributeValueProcessor); } catch (e) { //Что-то пошло не так при парсинге throw new Error(ERR_UNEXPECTED); @@ -151,14 +157,24 @@ const executeAction = async ({ serverURL, action, payload = {}, isArray, transfo }; //Запуск хранимой процедуры -const executeStored = async ({ stored, args, respArg, throwError = true, spreadOutArguments = false } = {}) => { +const executeStored = async ({ + stored, + args, + respArg, + isArray, + tagValueProcessor, + attributeValueProcessor, + throwError = true, + spreadOutArguments = false +} = {}) => { let res = null; try { let serverArgs = []; if (args) for (const arg in args) { let typedArg = false; - if (Object.hasOwn(args[arg], "VALUE") && Object.hasOwn(args[arg], "SDATA_TYPE") && args[arg]?.SDATA_TYPE) typedArg = true; + if (args[arg] && Object.hasOwn(args[arg], "VALUE") && Object.hasOwn(args[arg], "SDATA_TYPE") && args[arg]?.SDATA_TYPE) + typedArg = true; const dataType = typedArg ? args[arg].SDATA_TYPE : getServerDataType(args[arg]); let value = typedArg ? args[arg].VALUE : args[arg]; if (dataType === SERV_DATA_TYPE_DATE) value = dayjs(value).format("YYYY-MM-DDTHH:mm:ss"); @@ -168,7 +184,10 @@ const executeStored = async ({ stored, args, respArg, throwError = true, spreadO serverURL: `${config.SYSTEM.SERVER}${!config.SYSTEM.SERVER.endsWith("/") ? "/" : ""}Process`, action: SRV_FN_CODE_EXEC_STORED, payload: { SSTORED: stored, XARGUMENTS: serverArgs, SRESP_ARG: respArg }, - isArray: (name, jPath) => XML_ALWAYS_ARRAY_PATHS.indexOf(jPath) !== -1 || jPath.endsWith(XML_ALWAYS_ARRAY_POSTFIX) + isArray: (name, jPath) => + XML_ALWAYS_ARRAY_PATHS.indexOf(jPath) !== -1 || jPath.endsWith(XML_ALWAYS_ARRAY_POSTFIX) || (isArray ? isArray(name, jPath) : false), + tagValueProcessor, + attributeValueProcessor }); if (spreadOutArguments === true && Array.isArray(res?.XPAYLOAD?.XOUT_ARGUMENTS)) { let spreadArgs = {}; diff --git a/app/core/utils.js b/app/core/utils.js index a93545a..3ebd3d4 100644 --- a/app/core/utils.js +++ b/app/core/utils.js @@ -59,6 +59,9 @@ const object2Base64XML = (obj, builderOptions) => { //Форматирование даты в формат РФ const formatDateRF = value => (value ? dayjs(value).format("DD.MM.YYYY") : null); +//Форматирование даты в формат JSON (только дата, без времени) +const formatDateJSONDateOnly = value => (value ? dayjs(value).format("YYYY-MM-DD") : null); + //Форматирование числа в "Денежном" формате РФ const formatNumberRFCurrency = value => (hasValue(value) ? new Intl.NumberFormat("ru-RU", { minimumFractionDigits: 2 }).format(value) : null); @@ -72,4 +75,4 @@ const genGUID = () => //Интерфейс модуля //---------------- -export { hasValue, getDisplaySize, deepCopyObject, object2Base64XML, formatDateRF, formatNumberRFCurrency, genGUID }; +export { hasValue, getDisplaySize, deepCopyObject, object2Base64XML, formatDateRF, formatDateJSONDateOnly, formatNumberRFCurrency, genGUID };