From d4739e2bc14b5f2323393e2dd2428582c9b86346 Mon Sep 17 00:00:00 2001 From: daekuk1 Date: Wed, 28 Jan 2026 16:59:42 +0900 Subject: [PATCH 1/3] =?UTF-8?q?API=EB=AA=85=EB=B3=84=20=EC=9A=94=EC=95=BD?= =?UTF-8?q?=20=ED=86=B5=EA=B3=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jsp/onl/kjb/statistics/apiStatsDayMan.jsp | 97 +++++++++- .../onl/kjb/statistics/apiStatsHourMan.jsp | 95 +++++++++- .../onl/kjb/statistics/apiStatsMinuteMan.jsp | 99 ++++++++-- .../onl/kjb/statistics/apiStatsMonthMan.jsp | 97 +++++++++- .../onl/kjb/statistics/apiStatsYearMan.jsp | 97 +++++++++- .../kjb/statistics/ApiStatsDayService.java | 112 ++++++++++++ .../kjb/statistics/ApiStatsHourService.java | 172 +++++++++++++++++ .../kjb/statistics/ApiStatsMinuteService.java | 173 ++++++++++++++++++ .../kjb/statistics/ApiStatsMonthService.java | 112 ++++++++++++ .../kjb/statistics/ApiStatsYearService.java | 112 ++++++++++++ .../kjb/statistics/ApiStatsDayController.java | 51 ++++++ .../statistics/ApiStatsHourController.java | 51 ++++++ .../statistics/ApiStatsMinuteController.java | 51 ++++++ .../statistics/ApiStatsMonthController.java | 51 ++++++ .../statistics/ApiStatsYearController.java | 51 ++++++ .../job/DailyToMonthlyAggregationJob.java | 22 ++- .../job/HourlyToDailyAggregationJob.java | 22 ++- .../job/MonthlyToYearlyAggregationJob.java | 22 ++- 18 files changed, 1431 insertions(+), 56 deletions(-) diff --git a/WebContent/jsp/onl/kjb/statistics/apiStatsDayMan.jsp b/WebContent/jsp/onl/kjb/statistics/apiStatsDayMan.jsp index fafa922..0e5c270 100644 --- a/WebContent/jsp/onl/kjb/statistics/apiStatsDayMan.jsp +++ b/WebContent/jsp/onl/kjb/statistics/apiStatsDayMan.jsp @@ -391,18 +391,28 @@ postData.searchEndDateTime = searchEndDate; } + var summaryPostData = getSearchForJqgrid("cmd", "LIST_SUMMARY"); + if (searchStartDate) { + summaryPostData.searchStartDateTime = searchStartDate; + } + if (searchEndDate) { + summaryPostData.searchEndDateTime = searchEndDate; + } + + $("#gridSummary").setGridParam({ url: url, postData: summaryPostData, page: 1 }).trigger("reloadGrid"); $("#grid").setGridParam({ url: url, postData: postData, page: 1 }).trigger("reloadGrid"); fetchChartData(); } - function exportToExcel() { - console.log('[Excel Export] Starting...'); + function exportToExcel(isSummary) { + var cmdType = isSummary ? 'EXCEL_EXPORT_SUMMARY' : 'EXCEL_EXPORT'; + console.log('[Excel Export] Starting... (type: ' + cmdType + ')'); var searchStartDate = $("input[name=searchStartDateTime]").val().replace(/-/g, ""); var searchEndDate = $("input[name=searchEndDateTime]").val().replace(/-/g, ""); var postData = { - cmd: 'EXCEL_EXPORT', + cmd: cmdType, searchApiName: $("input[name=searchApiName]").val(), searchGwInstanceId: $("input[name=searchGwInstanceId]").val(), searchBizDivCode: $("input[name=searchBizDivCode]").val(), @@ -517,6 +527,50 @@ xhr.send(formData.join('&')); } + function listSummary() { + var gridPostData = getSearchForJqgrid("cmd", "LIST_SUMMARY"); + $('#gridSummary').jqGrid({ + datatype: "json", + mtype: 'POST', + postData: gridPostData, + colNames: [ + 'API명', + '총건수', '성공', 'Timeout', '시스템오류', '업무오류', + 'Seq900 Timeout', 'Seq900 시스템오류', 'Seq900 업무오류', + '평균응답(ms)', '최소응답(ms)', '최대응답(ms)' + ], + colModel: [ + { name: 'apiName', align: 'left', width: '250', sortable: false }, + { name: 'totalCnt', align: 'right', width: '80', formatter: numberFormatter, sortable: false }, + { name: 'successCnt', align: 'right', width: '80', formatter: numberFormatter, sortable: false }, + { name: 'timeoutCnt', align: 'right', width: '80', formatter: numberFormatter, sortable: false }, + { name: 'systemErrCnt', align: 'right', width: '80', formatter: numberFormatter, sortable: false }, + { name: 'bizErrCnt', align: 'right', width: '80', formatter: numberFormatter, sortable: false }, + { name: 'seq900TimeoutCnt', align: 'right', width: '100', formatter: numberFormatter, sortable: false }, + { name: 'seq900SystemErrCnt', align: 'right', width: '120', formatter: numberFormatter, sortable: false }, + { name: 'seq900BizErrCnt', align: 'right', width: '100', formatter: numberFormatter, sortable: false }, + { name: 'avgRespTime', align: 'right', width: '90', formatter: decimalFormatter, sortable: false }, + { name: 'minRespTime', align: 'right', width: '90', formatter: decimalFormatter, sortable: false }, + { name: 'maxRespTime', align: 'right', width: '90', formatter: decimalFormatter, sortable: false } + ], + jsonReader: { repeatitems: false }, + pager: $('#pagerSummary'), + page: '${param.page}', + rowNum: '${rmsDefaultRowNum}', + autoheight: true, + height: 'auto', + autowidth: true, + viewrecords: true, + rowList: eval('[${rmsDefaultRowList}]'), + loadComplete: function(d) { + var colModel = $(this).getGridParam("colModel"); + for (var i = 0; i < colModel.length; i++) { + $(this).setColProp(colModel[i].name, { sortable: false }); + } + } + }); + } + function list() { var gridPostData = getSearchForJqgrid("cmd", "LIST"); $('#grid').jqGrid({ @@ -603,17 +657,23 @@ } initCharts(); + listSummary(); list(); search(); fetchChartData(); + resizeJqGridWidth('gridSummary', 'content_middle', '1200'); resizeJqGridWidth('grid', 'content_middle', '1200'); $("#btn_search").click(function() { search(); }); + $("#btn_excel_export_summary").click(function() { + exportToExcel(true); + }); + $("#btn_excel_export").click(function() { - exportToExcel(); + exportToExcel(false); }); $("input[name^=search]").keydown(function(key) { @@ -646,9 +706,6 @@ -
API 일별 통계
@@ -704,8 +761,30 @@
-
-
+ + +
+
+
API명별 요약 통계
+ +
+
+
+
+ + +
+
+
상세 통계
+ +
+
+
+
diff --git a/WebContent/jsp/onl/kjb/statistics/apiStatsHourMan.jsp b/WebContent/jsp/onl/kjb/statistics/apiStatsHourMan.jsp index 0fabaf4..ac85e11 100644 --- a/WebContent/jsp/onl/kjb/statistics/apiStatsHourMan.jsp +++ b/WebContent/jsp/onl/kjb/statistics/apiStatsHourMan.jsp @@ -403,15 +403,23 @@ postData.searchEndDateTime = searchDate + "23"; } + var summaryPostData = getSearchForJqgrid("cmd", "LIST_SUMMARY"); + if (searchDate) { + summaryPostData.searchStartDateTime = searchDate + "00"; + summaryPostData.searchEndDateTime = searchDate + "23"; + } + + $("#gridSummary").setGridParam({ url: url, postData: summaryPostData, page: 1 }).trigger("reloadGrid"); $("#grid").setGridParam({ url: url, postData: postData, page: 1 }).trigger("reloadGrid"); fetchChartData(); } - function exportToExcel() { - console.log('[Excel Export] Starting...'); + function exportToExcel(isSummary) { + var cmdType = isSummary ? 'EXCEL_EXPORT_SUMMARY' : 'EXCEL_EXPORT'; + console.log('[Excel Export] Starting... (type: ' + cmdType + ')'); var postData = { - cmd: 'EXCEL_EXPORT', + cmd: cmdType, searchApiName: $("input[name=searchApiName]").val(), searchGwInstanceId: $("input[name=searchGwInstanceId]").val(), searchBizDivCode: $("input[name=searchBizDivCode]").val(), @@ -525,6 +533,50 @@ xhr.send(formData.join('&')); } + function listSummary() { + var gridPostData = getSearchForJqgrid("cmd", "LIST_SUMMARY"); + $('#gridSummary').jqGrid({ + datatype: "json", + mtype: 'POST', + postData: gridPostData, + colNames: [ + 'API명', + '총건수', '성공', 'Timeout', '시스템오류', '업무오류', + 'Seq900 Timeout', 'Seq900 시스템오류', 'Seq900 업무오류', + '평균응답(ms)', '최소응답(ms)', '최대응답(ms)' + ], + colModel: [ + { name: 'apiName', align: 'left', width: '250', sortable: false }, + { name: 'totalCnt', align: 'right', width: '80', formatter: numberFormatter, sortable: false }, + { name: 'successCnt', align: 'right', width: '80', formatter: numberFormatter, sortable: false }, + { name: 'timeoutCnt', align: 'right', width: '80', formatter: numberFormatter, sortable: false }, + { name: 'systemErrCnt', align: 'right', width: '80', formatter: numberFormatter, sortable: false }, + { name: 'bizErrCnt', align: 'right', width: '80', formatter: numberFormatter, sortable: false }, + { name: 'seq900TimeoutCnt', align: 'right', width: '100', formatter: numberFormatter, sortable: false }, + { name: 'seq900SystemErrCnt', align: 'right', width: '120', formatter: numberFormatter, sortable: false }, + { name: 'seq900BizErrCnt', align: 'right', width: '100', formatter: numberFormatter, sortable: false }, + { name: 'avgRespTime', align: 'right', width: '90', formatter: decimalFormatter, sortable: false }, + { name: 'minRespTime', align: 'right', width: '90', formatter: decimalFormatter, sortable: false }, + { name: 'maxRespTime', align: 'right', width: '90', formatter: decimalFormatter, sortable: false } + ], + jsonReader: { repeatitems: false }, + pager: $('#pagerSummary'), + page: '${param.page}', + rowNum: '${rmsDefaultRowNum}', + autoheight: true, + height: 'auto', + autowidth: true, + viewrecords: true, + rowList: eval('[${rmsDefaultRowList}]'), + loadComplete: function(d) { + var colModel = $(this).getGridParam("colModel"); + for (var i = 0; i < colModel.length; i++) { + $(this).setColProp(colModel[i].name, { sortable: false }); + } + } + }); + } + function list() { var gridPostData = getSearchForJqgrid("cmd", "LIST"); $('#grid').jqGrid({ @@ -589,17 +641,23 @@ } initCharts(); + listSummary(); list(); search(); fetchChartData(); + resizeJqGridWidth('gridSummary', 'content_middle', '1200'); resizeJqGridWidth('grid', 'content_middle', '1200'); $("#btn_search").click(function() { search(); }); + $("#btn_excel_export_summary").click(function() { + exportToExcel(true); + }); + $("#btn_excel_export").click(function() { - exportToExcel(); + exportToExcel(false); }); $("input[name^=search]").keydown(function(key) { @@ -632,9 +690,6 @@ -
API 시간별 통계
@@ -688,8 +743,30 @@
-
-
+ + +
+
+
API명별 요약 통계
+ +
+
+
+
+ + +
+
+
상세 통계
+ +
+
+
+
diff --git a/WebContent/jsp/onl/kjb/statistics/apiStatsMinuteMan.jsp b/WebContent/jsp/onl/kjb/statistics/apiStatsMinuteMan.jsp index b94b52b..3220afb 100644 --- a/WebContent/jsp/onl/kjb/statistics/apiStatsMinuteMan.jsp +++ b/WebContent/jsp/onl/kjb/statistics/apiStatsMinuteMan.jsp @@ -411,15 +411,23 @@ postData.searchEndDateTime = range.end; } + var summaryPostData = getSearchForJqgrid("cmd", "LIST_SUMMARY"); + if (range) { + summaryPostData.searchStartDateTime = range.start; + summaryPostData.searchEndDateTime = range.end; + } + + $("#gridSummary").setGridParam({ url: url, postData: summaryPostData, page: 1 }).trigger("reloadGrid"); $("#grid").setGridParam({ url: url, postData: postData, page: 1 }).trigger("reloadGrid"); fetchChartData(range); } - function exportToExcel() { - console.log('[Excel Export] Starting...'); + function exportToExcel(isSummary) { + var cmdType = isSummary ? 'EXCEL_EXPORT_SUMMARY' : 'EXCEL_EXPORT'; + console.log('[Excel Export] Starting... (type: ' + cmdType + ')'); var postData = { - cmd: 'EXCEL_EXPORT', + cmd: cmdType, searchApiName: $("input[name=searchApiName]").val(), searchGwInstanceId: $("input[name=searchGwInstanceId]").val(), searchBizDivCode: $("input[name=searchBizDivCode]").val(), @@ -536,7 +544,51 @@ xhr.send(formData.join('&')); } - function list() { + function listSummary() { + var gridPostData = getSearchForJqgrid("cmd", "LIST_SUMMARY"); + $('#gridSummary').jqGrid({ + datatype: "json", + mtype: 'POST', + postData: gridPostData, + colNames: [ + 'API명', + '총건수', '성공', 'Timeout', '시스템오류', '업무오류', + 'Seq900 Timeout', 'Seq900 시스템오류', 'Seq900 업무오류', + '평균응답(ms)', '최소응답(ms)', '최대응답(ms)' + ], + colModel: [ + { name: 'apiName', align: 'left', width: '250', sortable: false }, + { name: 'totalCnt', align: 'right', width: '80', formatter: numberFormatter, sortable: false }, + { name: 'successCnt', align: 'right', width: '80', formatter: numberFormatter, sortable: false }, + { name: 'timeoutCnt', align: 'right', width: '80', formatter: numberFormatter, sortable: false }, + { name: 'systemErrCnt', align: 'right', width: '80', formatter: numberFormatter, sortable: false }, + { name: 'bizErrCnt', align: 'right', width: '80', formatter: numberFormatter, sortable: false }, + { name: 'seq900TimeoutCnt', align: 'right', width: '100', formatter: numberFormatter, sortable: false }, + { name: 'seq900SystemErrCnt', align: 'right', width: '120', formatter: numberFormatter, sortable: false }, + { name: 'seq900BizErrCnt', align: 'right', width: '100', formatter: numberFormatter, sortable: false }, + { name: 'avgRespTime', align: 'right', width: '90', formatter: decimalFormatter, sortable: false }, + { name: 'minRespTime', align: 'right', width: '90', formatter: decimalFormatter, sortable: false }, + { name: 'maxRespTime', align: 'right', width: '90', formatter: decimalFormatter, sortable: false } + ], + jsonReader: { repeatitems: false }, + pager: $('#pagerSummary'), + page: '${param.page}', + rowNum: '${rmsDefaultRowNum}', + autoheight: true, + height: 'auto', + autowidth: true, + viewrecords: true, + rowList: eval('[${rmsDefaultRowList}]'), + loadComplete: function(d) { + var colModel = $(this).getGridParam("colModel"); + for (var i = 0; i < colModel.length; i++) { + $(this).setColProp(colModel[i].name, { sortable: false }); + } + } + }); + } + + function listDetail() { var gridPostData = getSearchForJqgrid("cmd", "LIST"); $('#grid').jqGrid({ datatype: "json", @@ -626,17 +678,23 @@ } initCharts(); - list(); + listSummary(); + listDetail(); search(); fetchChartData(validateAndAdjustDateRange()); + resizeJqGridWidth('gridSummary', 'content_middle', '1200'); resizeJqGridWidth('grid', 'content_middle', '1200'); $("#btn_search").click(function() { search(); }); + $("#btn_excel_export_summary").click(function() { + exportToExcel(true); + }); + $("#btn_excel_export").click(function() { - exportToExcel(); + exportToExcel(false); }); $("input[name^=search]").keydown(function(key) { @@ -674,9 +732,6 @@ -
API 분단위 통계
@@ -734,8 +789,30 @@
-
-
+ + +
+
+
API명별 요약 통계
+ +
+
+
+
+ + +
+
+
상세 통계
+ +
+
+
+
diff --git a/WebContent/jsp/onl/kjb/statistics/apiStatsMonthMan.jsp b/WebContent/jsp/onl/kjb/statistics/apiStatsMonthMan.jsp index 7c837fc..8282166 100644 --- a/WebContent/jsp/onl/kjb/statistics/apiStatsMonthMan.jsp +++ b/WebContent/jsp/onl/kjb/statistics/apiStatsMonthMan.jsp @@ -395,18 +395,28 @@ postData.searchEndDateTime = searchEndDate; } + var summaryPostData = getSearchForJqgrid("cmd", "LIST_SUMMARY"); + if (searchStartDate) { + summaryPostData.searchStartDateTime = searchStartDate; + } + if (searchEndDate) { + summaryPostData.searchEndDateTime = searchEndDate; + } + + $("#gridSummary").setGridParam({ url: url, postData: summaryPostData, page: 1 }).trigger("reloadGrid"); $("#grid").setGridParam({ url: url, postData: postData, page: 1 }).trigger("reloadGrid"); fetchChartData(); } - function exportToExcel() { - console.log('[Excel Export] Starting...'); + function exportToExcel(isSummary) { + var cmdType = isSummary ? 'EXCEL_EXPORT_SUMMARY' : 'EXCEL_EXPORT'; + console.log('[Excel Export] Starting... (type: ' + cmdType + ')'); var searchStartDate = $("input[name=searchStartDateTime]").val().replace(/-/g, ""); var searchEndDate = $("input[name=searchEndDateTime]").val().replace(/-/g, ""); var postData = { - cmd: 'EXCEL_EXPORT', + cmd: cmdType, searchApiName: $("input[name=searchApiName]").val(), searchGwInstanceId: $("input[name=searchGwInstanceId]").val(), searchBizDivCode: $("input[name=searchBizDivCode]").val(), @@ -521,6 +531,50 @@ xhr.send(formData.join('&')); } + function listSummary() { + var gridPostData = getSearchForJqgrid("cmd", "LIST_SUMMARY"); + $('#gridSummary').jqGrid({ + datatype: "json", + mtype: 'POST', + postData: gridPostData, + colNames: [ + 'API명', + '총건수', '성공', 'Timeout', '시스템오류', '업무오류', + 'Seq900 Timeout', 'Seq900 시스템오류', 'Seq900 업무오류', + '평균응답(ms)', '최소응답(ms)', '최대응답(ms)' + ], + colModel: [ + { name: 'apiName', align: 'left', width: '250', sortable: false }, + { name: 'totalCnt', align: 'right', width: '80', formatter: numberFormatter, sortable: false }, + { name: 'successCnt', align: 'right', width: '80', formatter: numberFormatter, sortable: false }, + { name: 'timeoutCnt', align: 'right', width: '80', formatter: numberFormatter, sortable: false }, + { name: 'systemErrCnt', align: 'right', width: '80', formatter: numberFormatter, sortable: false }, + { name: 'bizErrCnt', align: 'right', width: '80', formatter: numberFormatter, sortable: false }, + { name: 'seq900TimeoutCnt', align: 'right', width: '100', formatter: numberFormatter, sortable: false }, + { name: 'seq900SystemErrCnt', align: 'right', width: '120', formatter: numberFormatter, sortable: false }, + { name: 'seq900BizErrCnt', align: 'right', width: '100', formatter: numberFormatter, sortable: false }, + { name: 'avgRespTime', align: 'right', width: '90', formatter: decimalFormatter, sortable: false }, + { name: 'minRespTime', align: 'right', width: '90', formatter: decimalFormatter, sortable: false }, + { name: 'maxRespTime', align: 'right', width: '90', formatter: decimalFormatter, sortable: false } + ], + jsonReader: { repeatitems: false }, + pager: $('#pagerSummary'), + page: '${param.page}', + rowNum: '${rmsDefaultRowNum}', + autoheight: true, + height: 'auto', + autowidth: true, + viewrecords: true, + rowList: eval('[${rmsDefaultRowList}]'), + loadComplete: function(d) { + var colModel = $(this).getGridParam("colModel"); + for (var i = 0; i < colModel.length; i++) { + $(this).setColProp(colModel[i].name, { sortable: false }); + } + } + }); + } + function list() { var gridPostData = getSearchForJqgrid("cmd", "LIST"); $('#grid').jqGrid({ @@ -593,17 +647,23 @@ } initCharts(); + listSummary(); list(); search(); fetchChartData(); + resizeJqGridWidth('gridSummary', 'content_middle', '1200'); resizeJqGridWidth('grid', 'content_middle', '1200'); $("#btn_search").click(function() { search(); }); + $("#btn_excel_export_summary").click(function() { + exportToExcel(true); + }); + $("#btn_excel_export").click(function() { - exportToExcel(); + exportToExcel(false); }); $("input[name^=search]").keydown(function(key) { @@ -636,9 +696,6 @@ -
API 월별 통계
@@ -694,8 +751,30 @@
-
-
+ + +
+
+
API명별 요약 통계
+ +
+
+
+
+ + +
+
+
상세 통계
+ +
+
+
+
diff --git a/WebContent/jsp/onl/kjb/statistics/apiStatsYearMan.jsp b/WebContent/jsp/onl/kjb/statistics/apiStatsYearMan.jsp index 7e01a46..64e8f2f 100644 --- a/WebContent/jsp/onl/kjb/statistics/apiStatsYearMan.jsp +++ b/WebContent/jsp/onl/kjb/statistics/apiStatsYearMan.jsp @@ -369,18 +369,28 @@ postData.searchEndDateTime = searchEndDate; } + var summaryPostData = getSearchForJqgrid("cmd", "LIST_SUMMARY"); + if (searchStartDate) { + summaryPostData.searchStartDateTime = searchStartDate; + } + if (searchEndDate) { + summaryPostData.searchEndDateTime = searchEndDate; + } + + $("#gridSummary").setGridParam({ url: url, postData: summaryPostData, page: 1 }).trigger("reloadGrid"); $("#grid").setGridParam({ url: url, postData: postData, page: 1 }).trigger("reloadGrid"); fetchChartData(); } - function exportToExcel() { - console.log('[Excel Export] Starting...'); + function exportToExcel(isSummary) { + var cmdType = isSummary ? 'EXCEL_EXPORT_SUMMARY' : 'EXCEL_EXPORT'; + console.log('[Excel Export] Starting... (type: ' + cmdType + ')'); var searchStartDate = $("input[name=searchStartDateTime]").val().replace(/-/g, ""); var searchEndDate = $("input[name=searchEndDateTime]").val().replace(/-/g, ""); var postData = { - cmd: 'EXCEL_EXPORT', + cmd: cmdType, searchApiName: $("input[name=searchApiName]").val(), searchGwInstanceId: $("input[name=searchGwInstanceId]").val(), searchBizDivCode: $("input[name=searchBizDivCode]").val(), @@ -495,6 +505,50 @@ xhr.send(formData.join('&')); } + function listSummary() { + var gridPostData = getSearchForJqgrid("cmd", "LIST_SUMMARY"); + $('#gridSummary').jqGrid({ + datatype: "json", + mtype: 'POST', + postData: gridPostData, + colNames: [ + 'API명', + '총건수', '성공', 'Timeout', '시스템오류', '업무오류', + 'Seq900 Timeout', 'Seq900 시스템오류', 'Seq900 업무오류', + '평균응답(ms)', '최소응답(ms)', '최대응답(ms)' + ], + colModel: [ + { name: 'apiName', align: 'left', width: '250', sortable: false }, + { name: 'totalCnt', align: 'right', width: '80', formatter: numberFormatter, sortable: false }, + { name: 'successCnt', align: 'right', width: '80', formatter: numberFormatter, sortable: false }, + { name: 'timeoutCnt', align: 'right', width: '80', formatter: numberFormatter, sortable: false }, + { name: 'systemErrCnt', align: 'right', width: '80', formatter: numberFormatter, sortable: false }, + { name: 'bizErrCnt', align: 'right', width: '80', formatter: numberFormatter, sortable: false }, + { name: 'seq900TimeoutCnt', align: 'right', width: '100', formatter: numberFormatter, sortable: false }, + { name: 'seq900SystemErrCnt', align: 'right', width: '120', formatter: numberFormatter, sortable: false }, + { name: 'seq900BizErrCnt', align: 'right', width: '100', formatter: numberFormatter, sortable: false }, + { name: 'avgRespTime', align: 'right', width: '90', formatter: decimalFormatter, sortable: false }, + { name: 'minRespTime', align: 'right', width: '90', formatter: decimalFormatter, sortable: false }, + { name: 'maxRespTime', align: 'right', width: '90', formatter: decimalFormatter, sortable: false } + ], + jsonReader: { repeatitems: false }, + pager: $('#pagerSummary'), + page: '${param.page}', + rowNum: '${rmsDefaultRowNum}', + autoheight: true, + height: 'auto', + autowidth: true, + viewrecords: true, + rowList: eval('[${rmsDefaultRowList}]'), + loadComplete: function(d) { + var colModel = $(this).getGridParam("colModel"); + for (var i = 0; i < colModel.length; i++) { + $(this).setColProp(colModel[i].name, { sortable: false }); + } + } + }); + } + function list() { var gridPostData = getSearchForJqgrid("cmd", "LIST"); $('#grid').jqGrid({ @@ -562,17 +616,23 @@ } initCharts(); + listSummary(); list(); search(); fetchChartData(); + resizeJqGridWidth('gridSummary', 'content_middle', '1200'); resizeJqGridWidth('grid', 'content_middle', '1200'); $("#btn_search").click(function() { search(); }); + $("#btn_excel_export_summary").click(function() { + exportToExcel(true); + }); + $("#btn_excel_export").click(function() { - exportToExcel(); + exportToExcel(false); }); $("input[name^=search]").keydown(function(key) { @@ -605,9 +665,6 @@ -
API 연간 통계
@@ -662,8 +719,30 @@
-
-
+ + +
+
+
API명별 요약 통계
+ +
+
+
+
+ + +
+
+
상세 통계
+ +
+
+
+
diff --git a/src/main/java/com/eactive/eai/rms/data/entity/onl/kjb/statistics/ApiStatsDayService.java b/src/main/java/com/eactive/eai/rms/data/entity/onl/kjb/statistics/ApiStatsDayService.java index 251b1b4..ad7fc2e 100644 --- a/src/main/java/com/eactive/eai/rms/data/entity/onl/kjb/statistics/ApiStatsDayService.java +++ b/src/main/java/com/eactive/eai/rms/data/entity/onl/kjb/statistics/ApiStatsDayService.java @@ -1,11 +1,14 @@ package com.eactive.eai.rms.data.entity.onl.kjb.statistics; +import java.math.BigDecimal; +import java.math.RoundingMode; import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.util.List; import org.apache.commons.lang3.StringUtils; import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageImpl; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -13,8 +16,10 @@ import org.springframework.transaction.annotation.Transactional; import com.eactive.eai.data.jpa.AbstractDataService; import com.eactive.ext.kjb.statistics.ui.ApiStatsChartUI; import com.eactive.ext.kjb.statistics.ui.ApiStatsSearch; +import com.eactive.ext.kjb.statistics.ui.ApiStatsUI; import com.querydsl.core.BooleanBuilder; import com.querydsl.core.types.Projections; +import com.querydsl.core.types.dsl.Expressions; @Service @Transactional @@ -87,6 +92,113 @@ public class ApiStatsDayService .fetch(); } + /** + * API명별 요약 통계 조회 (GROUP BY apiName) + */ + public Page selectSummaryList(ApiStatsSearch search, Pageable pageable) { + QApiStatsDay q = QApiStatsDay.apiStatsDay; + BooleanBuilder builder = buildSearchConditions(q, search); + + // 전체 건수 조회 + Long total = getJPAQueryFactory() + .select(q.apiName.countDistinct()) + .from(q) + .where(builder) + .fetchOne(); + + // 페이징 적용하여 조회 + List results = getJPAQueryFactory() + .select(Projections.fields(ApiStatsUI.class, + q.apiName, + q.totalCnt.sum().as("totalCnt"), + q.successCnt.sum().as("successCnt"), + q.timeoutCnt.sum().as("timeoutCnt"), + q.systemErrCnt.sum().as("systemErrCnt"), + q.bizErrCnt.sum().as("bizErrCnt"), + q.seq900TimeoutCnt.sum().as("seq900TimeoutCnt"), + q.seq900SystemErrCnt.sum().as("seq900SystemErrCnt"), + q.seq900BizErrCnt.sum().as("seq900BizErrCnt"), + q.minRespTime.min().castToNum(BigDecimal.class).as("minRespTime"), + q.maxRespTime.max().castToNum(BigDecimal.class).as("maxRespTime"), + // 가중 평균: SUM(avg * successCnt) / SUM(successCnt) + Expressions.cases() + .when(q.successCnt.sum().gt(0)) + .then(q.avgRespTime.multiply(q.successCnt).sum() + .divide(q.successCnt.sum()).castToNum(BigDecimal.class)) + .otherwise((BigDecimal) null) + .as("avgRespTime"))) + .from(q) + .where(builder) + .groupBy(q.apiName) + .orderBy(q.apiName.asc()) + .offset(pageable.getOffset()) + .limit(pageable.getPageSize()) + .fetch(); + + // 소수점 3자리로 반올림 + results.forEach(ui -> { + if (ui.getAvgRespTime() != null) { + ui.setAvgRespTime(ui.getAvgRespTime().setScale(3, RoundingMode.HALF_UP)); + } + if (ui.getMinRespTime() != null) { + ui.setMinRespTime(ui.getMinRespTime().setScale(3, RoundingMode.HALF_UP)); + } + if (ui.getMaxRespTime() != null) { + ui.setMaxRespTime(ui.getMaxRespTime().setScale(3, RoundingMode.HALF_UP)); + } + }); + + return new PageImpl<>(results, pageable, total != null ? total.longValue() : 0); + } + + /** + * API명별 요약 통계 전체 조회 (Excel용) + */ + public List selectSummaryListForExcel(ApiStatsSearch search) { + QApiStatsDay q = QApiStatsDay.apiStatsDay; + BooleanBuilder builder = buildSearchConditions(q, search); + + List results = getJPAQueryFactory() + .select(Projections.fields(ApiStatsUI.class, + q.apiName, + q.totalCnt.sum().as("totalCnt"), + q.successCnt.sum().as("successCnt"), + q.timeoutCnt.sum().as("timeoutCnt"), + q.systemErrCnt.sum().as("systemErrCnt"), + q.bizErrCnt.sum().as("bizErrCnt"), + q.seq900TimeoutCnt.sum().as("seq900TimeoutCnt"), + q.seq900SystemErrCnt.sum().as("seq900SystemErrCnt"), + q.seq900BizErrCnt.sum().as("seq900BizErrCnt"), + q.minRespTime.min().castToNum(BigDecimal.class).as("minRespTime"), + q.maxRespTime.max().castToNum(BigDecimal.class).as("maxRespTime"), + Expressions.cases() + .when(q.successCnt.sum().gt(0)) + .then(q.avgRespTime.multiply(q.successCnt).sum() + .divide(q.successCnt.sum()).castToNum(BigDecimal.class)) + .otherwise((BigDecimal) null) + .as("avgRespTime"))) + .from(q) + .where(builder) + .groupBy(q.apiName) + .orderBy(q.apiName.asc()) + .fetch(); + + // 소수점 3자리로 반올림 + results.forEach(ui -> { + if (ui.getAvgRespTime() != null) { + ui.setAvgRespTime(ui.getAvgRespTime().setScale(3, RoundingMode.HALF_UP)); + } + if (ui.getMinRespTime() != null) { + ui.setMinRespTime(ui.getMinRespTime().setScale(3, RoundingMode.HALF_UP)); + } + if (ui.getMaxRespTime() != null) { + ui.setMaxRespTime(ui.getMaxRespTime().setScale(3, RoundingMode.HALF_UP)); + } + }); + + return results; + } + private BooleanBuilder buildSearchConditions(QApiStatsDay q, ApiStatsSearch search) { BooleanBuilder builder = new BooleanBuilder(); diff --git a/src/main/java/com/eactive/eai/rms/data/entity/onl/kjb/statistics/ApiStatsHourService.java b/src/main/java/com/eactive/eai/rms/data/entity/onl/kjb/statistics/ApiStatsHourService.java index 74816c8..91524a7 100644 --- a/src/main/java/com/eactive/eai/rms/data/entity/onl/kjb/statistics/ApiStatsHourService.java +++ b/src/main/java/com/eactive/eai/rms/data/entity/onl/kjb/statistics/ApiStatsHourService.java @@ -1,11 +1,14 @@ package com.eactive.eai.rms.data.entity.onl.kjb.statistics; +import java.math.BigDecimal; +import java.math.RoundingMode; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.List; import org.apache.commons.lang3.StringUtils; import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageImpl; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -13,8 +16,10 @@ import org.springframework.transaction.annotation.Transactional; import com.eactive.eai.data.jpa.AbstractDataService; import com.eactive.ext.kjb.statistics.ui.ApiStatsChartUI; import com.eactive.ext.kjb.statistics.ui.ApiStatsSearch; +import com.eactive.ext.kjb.statistics.ui.ApiStatsUI; import com.querydsl.core.BooleanBuilder; import com.querydsl.core.types.Projections; +import com.querydsl.core.types.dsl.Expressions; @Service @Transactional @@ -148,6 +153,173 @@ public class ApiStatsHourService .fetch(); } + /** + * API명별 요약 통계 조회 (GROUP BY apiName) + */ + public Page selectSummaryList(ApiStatsSearch search, Pageable pageable) { + QApiStatsHour q = QApiStatsHour.apiStatsHour; + BooleanBuilder builder = new BooleanBuilder(); + + calculateDateRange(search); + if (search.getParsedStartDateTime() != null) { + builder.and(q.statTime.goe(search.getParsedStartDateTime())); + builder.and(q.statTime.loe(search.getParsedEndDateTime())); + } + + if (StringUtils.isNotBlank(search.getSearchApiName())) { + builder.and(q.apiName.containsIgnoreCase(search.getSearchApiName())); + } + + if (StringUtils.isNotBlank(search.getSearchGwInstanceId())) { + builder.and(q.gwInstanceId.containsIgnoreCase(search.getSearchGwInstanceId())); + } + + if (StringUtils.isNotBlank(search.getSearchBizDivCode())) { + builder.and(q.bizDivCode.containsIgnoreCase(search.getSearchBizDivCode())); + } + + if (StringUtils.isNotBlank(search.getSearchClientId())) { + builder.and(q.clientId.containsIgnoreCase(search.getSearchClientId())); + } + + if (StringUtils.isNotBlank(search.getSearchInboundAdapter())) { + builder.and(q.inboundAdapter.containsIgnoreCase(search.getSearchInboundAdapter())); + } + + if (StringUtils.isNotBlank(search.getSearchOutboundAdapter())) { + builder.and(q.outboundAdapter.containsIgnoreCase(search.getSearchOutboundAdapter())); + } + + // 전체 건수 조회 + Long total = getJPAQueryFactory() + .select(q.apiName.countDistinct()) + .from(q) + .where(builder) + .fetchOne(); + + // 페이징 적용하여 조회 + List results = getJPAQueryFactory() + .select(Projections.fields(ApiStatsUI.class, + q.apiName, + q.totalCnt.sum().as("totalCnt"), + q.successCnt.sum().as("successCnt"), + q.timeoutCnt.sum().as("timeoutCnt"), + q.systemErrCnt.sum().as("systemErrCnt"), + q.bizErrCnt.sum().as("bizErrCnt"), + q.seq900TimeoutCnt.sum().as("seq900TimeoutCnt"), + q.seq900SystemErrCnt.sum().as("seq900SystemErrCnt"), + q.seq900BizErrCnt.sum().as("seq900BizErrCnt"), + q.minRespTime.min().castToNum(BigDecimal.class).as("minRespTime"), + q.maxRespTime.max().castToNum(BigDecimal.class).as("maxRespTime"), + // 가중 평균: SUM(avg * successCnt) / SUM(successCnt) + Expressions.cases() + .when(q.successCnt.sum().gt(0)) + .then(q.avgRespTime.multiply(q.successCnt).sum() + .divide(q.successCnt.sum()).castToNum(BigDecimal.class)) + .otherwise((BigDecimal) null) + .as("avgRespTime"))) + .from(q) + .where(builder) + .groupBy(q.apiName) + .orderBy(q.apiName.asc()) + .offset(pageable.getOffset()) + .limit(pageable.getPageSize()) + .fetch(); + + // 소수점 3자리로 반올림 + results.forEach(ui -> { + if (ui.getAvgRespTime() != null) { + ui.setAvgRespTime(ui.getAvgRespTime().setScale(3, RoundingMode.HALF_UP)); + } + if (ui.getMinRespTime() != null) { + ui.setMinRespTime(ui.getMinRespTime().setScale(3, RoundingMode.HALF_UP)); + } + if (ui.getMaxRespTime() != null) { + ui.setMaxRespTime(ui.getMaxRespTime().setScale(3, RoundingMode.HALF_UP)); + } + }); + + return new PageImpl<>(results, pageable, total != null ? total.longValue() : 0); + } + + /** + * API명별 요약 통계 전체 조회 (Excel용) + */ + public List selectSummaryListForExcel(ApiStatsSearch search) { + QApiStatsHour q = QApiStatsHour.apiStatsHour; + BooleanBuilder builder = new BooleanBuilder(); + + calculateDateRange(search); + if (search.getParsedStartDateTime() != null) { + builder.and(q.statTime.goe(search.getParsedStartDateTime())); + builder.and(q.statTime.loe(search.getParsedEndDateTime())); + } + + if (StringUtils.isNotBlank(search.getSearchApiName())) { + builder.and(q.apiName.containsIgnoreCase(search.getSearchApiName())); + } + + if (StringUtils.isNotBlank(search.getSearchGwInstanceId())) { + builder.and(q.gwInstanceId.containsIgnoreCase(search.getSearchGwInstanceId())); + } + + if (StringUtils.isNotBlank(search.getSearchBizDivCode())) { + builder.and(q.bizDivCode.containsIgnoreCase(search.getSearchBizDivCode())); + } + + if (StringUtils.isNotBlank(search.getSearchClientId())) { + builder.and(q.clientId.containsIgnoreCase(search.getSearchClientId())); + } + + if (StringUtils.isNotBlank(search.getSearchInboundAdapter())) { + builder.and(q.inboundAdapter.containsIgnoreCase(search.getSearchInboundAdapter())); + } + + if (StringUtils.isNotBlank(search.getSearchOutboundAdapter())) { + builder.and(q.outboundAdapter.containsIgnoreCase(search.getSearchOutboundAdapter())); + } + + List results = getJPAQueryFactory() + .select(Projections.fields(ApiStatsUI.class, + q.apiName, + q.totalCnt.sum().as("totalCnt"), + q.successCnt.sum().as("successCnt"), + q.timeoutCnt.sum().as("timeoutCnt"), + q.systemErrCnt.sum().as("systemErrCnt"), + q.bizErrCnt.sum().as("bizErrCnt"), + q.seq900TimeoutCnt.sum().as("seq900TimeoutCnt"), + q.seq900SystemErrCnt.sum().as("seq900SystemErrCnt"), + q.seq900BizErrCnt.sum().as("seq900BizErrCnt"), + q.minRespTime.min().castToNum(BigDecimal.class).as("minRespTime"), + q.maxRespTime.max().castToNum(BigDecimal.class).as("maxRespTime"), + Expressions.cases() + .when(q.successCnt.sum().gt(0)) + .then(q.avgRespTime.multiply(q.successCnt).sum() + .divide(q.successCnt.sum()).castToNum(BigDecimal.class)) + .otherwise((BigDecimal) null) + .as("avgRespTime"))) + .from(q) + .where(builder) + .groupBy(q.apiName) + .orderBy(q.apiName.asc()) + .fetch(); + + // 소수점 3자리로 반올림 + results.forEach(ui -> { + if (ui.getAvgRespTime() != null) { + ui.setAvgRespTime(ui.getAvgRespTime().setScale(3, RoundingMode.HALF_UP)); + } + if (ui.getMinRespTime() != null) { + ui.setMinRespTime(ui.getMinRespTime().setScale(3, RoundingMode.HALF_UP)); + } + if (ui.getMaxRespTime() != null) { + ui.setMaxRespTime(ui.getMaxRespTime().setScale(3, RoundingMode.HALF_UP)); + } + }); + + return results; + } + /** * 조회 기간 계산 (최대 24시간 제한) */ diff --git a/src/main/java/com/eactive/eai/rms/data/entity/onl/kjb/statistics/ApiStatsMinuteService.java b/src/main/java/com/eactive/eai/rms/data/entity/onl/kjb/statistics/ApiStatsMinuteService.java index 9a35b35..7466422 100644 --- a/src/main/java/com/eactive/eai/rms/data/entity/onl/kjb/statistics/ApiStatsMinuteService.java +++ b/src/main/java/com/eactive/eai/rms/data/entity/onl/kjb/statistics/ApiStatsMinuteService.java @@ -1,11 +1,15 @@ package com.eactive.eai.rms.data.entity.onl.kjb.statistics; +import java.math.BigDecimal; +import java.math.RoundingMode; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.List; +import java.util.stream.Collectors; import org.apache.commons.lang3.StringUtils; import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageImpl; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -13,8 +17,10 @@ import org.springframework.transaction.annotation.Transactional; import com.eactive.eai.data.jpa.AbstractDataService; import com.eactive.ext.kjb.statistics.ui.ApiStatsChartUI; import com.eactive.ext.kjb.statistics.ui.ApiStatsSearch; +import com.eactive.ext.kjb.statistics.ui.ApiStatsUI; import com.querydsl.core.BooleanBuilder; import com.querydsl.core.types.Projections; +import com.querydsl.core.types.dsl.Expressions; @Service @Transactional @@ -150,6 +156,173 @@ public class ApiStatsMinuteService .fetch(); } + /** + * API명별 요약 통계 조회 (GROUP BY apiName) + */ + public Page selectSummaryList(ApiStatsSearch search, Pageable pageable) { + QApiStatsMinute q = QApiStatsMinute.apiStatsMinute; + BooleanBuilder builder = new BooleanBuilder(); + + calculateDateRange(search); + if (search.getParsedStartDateTime() != null) { + builder.and(q.statTime.goe(search.getParsedStartDateTime())); + builder.and(q.statTime.loe(search.getParsedEndDateTime())); + } + + if (StringUtils.isNotBlank(search.getSearchApiName())) { + builder.and(q.apiName.containsIgnoreCase(search.getSearchApiName())); + } + + if (StringUtils.isNotBlank(search.getSearchGwInstanceId())) { + builder.and(q.gwInstanceId.containsIgnoreCase(search.getSearchGwInstanceId())); + } + + if (StringUtils.isNotBlank(search.getSearchBizDivCode())) { + builder.and(q.bizDivCode.containsIgnoreCase(search.getSearchBizDivCode())); + } + + if (StringUtils.isNotBlank(search.getSearchClientId())) { + builder.and(q.clientId.containsIgnoreCase(search.getSearchClientId())); + } + + if (StringUtils.isNotBlank(search.getSearchInboundAdapter())) { + builder.and(q.inboundAdapter.containsIgnoreCase(search.getSearchInboundAdapter())); + } + + if (StringUtils.isNotBlank(search.getSearchOutboundAdapter())) { + builder.and(q.outboundAdapter.containsIgnoreCase(search.getSearchOutboundAdapter())); + } + + // 전체 건수 조회 + Long total = getJPAQueryFactory() + .select(q.apiName.countDistinct()) + .from(q) + .where(builder) + .fetchOne(); + + // 페이징 적용하여 조회 + List results = getJPAQueryFactory() + .select(Projections.fields(ApiStatsUI.class, + q.apiName, + q.totalCnt.sum().as("totalCnt"), + q.successCnt.sum().as("successCnt"), + q.timeoutCnt.sum().as("timeoutCnt"), + q.systemErrCnt.sum().as("systemErrCnt"), + q.bizErrCnt.sum().as("bizErrCnt"), + q.seq900TimeoutCnt.sum().as("seq900TimeoutCnt"), + q.seq900SystemErrCnt.sum().as("seq900SystemErrCnt"), + q.seq900BizErrCnt.sum().as("seq900BizErrCnt"), + q.minRespTime.min().castToNum(BigDecimal.class).as("minRespTime"), + q.maxRespTime.max().castToNum(BigDecimal.class).as("maxRespTime"), + // 가중 평균: SUM(avg * successCnt) / SUM(successCnt) + Expressions.cases() + .when(q.successCnt.sum().gt(0)) + .then(q.avgRespTime.multiply(q.successCnt).sum() + .divide(q.successCnt.sum()).castToNum(BigDecimal.class)) + .otherwise((BigDecimal) null) + .as("avgRespTime"))) + .from(q) + .where(builder) + .groupBy(q.apiName) + .orderBy(q.apiName.asc()) + .offset(pageable.getOffset()) + .limit(pageable.getPageSize()) + .fetch(); + + // 소수점 3자리로 반올림 + results.forEach(ui -> { + if (ui.getAvgRespTime() != null) { + ui.setAvgRespTime(ui.getAvgRespTime().setScale(3, RoundingMode.HALF_UP)); + } + if (ui.getMinRespTime() != null) { + ui.setMinRespTime(ui.getMinRespTime().setScale(3, RoundingMode.HALF_UP)); + } + if (ui.getMaxRespTime() != null) { + ui.setMaxRespTime(ui.getMaxRespTime().setScale(3, RoundingMode.HALF_UP)); + } + }); + + return new PageImpl<>(results, pageable, total != null ? total.longValue() : 0); + } + + /** + * API명별 요약 통계 전체 조회 (Excel용) + */ + public List selectSummaryListForExcel(ApiStatsSearch search) { + QApiStatsMinute q = QApiStatsMinute.apiStatsMinute; + BooleanBuilder builder = new BooleanBuilder(); + + calculateDateRange(search); + if (search.getParsedStartDateTime() != null) { + builder.and(q.statTime.goe(search.getParsedStartDateTime())); + builder.and(q.statTime.loe(search.getParsedEndDateTime())); + } + + if (StringUtils.isNotBlank(search.getSearchApiName())) { + builder.and(q.apiName.containsIgnoreCase(search.getSearchApiName())); + } + + if (StringUtils.isNotBlank(search.getSearchGwInstanceId())) { + builder.and(q.gwInstanceId.containsIgnoreCase(search.getSearchGwInstanceId())); + } + + if (StringUtils.isNotBlank(search.getSearchBizDivCode())) { + builder.and(q.bizDivCode.containsIgnoreCase(search.getSearchBizDivCode())); + } + + if (StringUtils.isNotBlank(search.getSearchClientId())) { + builder.and(q.clientId.containsIgnoreCase(search.getSearchClientId())); + } + + if (StringUtils.isNotBlank(search.getSearchInboundAdapter())) { + builder.and(q.inboundAdapter.containsIgnoreCase(search.getSearchInboundAdapter())); + } + + if (StringUtils.isNotBlank(search.getSearchOutboundAdapter())) { + builder.and(q.outboundAdapter.containsIgnoreCase(search.getSearchOutboundAdapter())); + } + + List results = getJPAQueryFactory() + .select(Projections.fields(ApiStatsUI.class, + q.apiName, + q.totalCnt.sum().as("totalCnt"), + q.successCnt.sum().as("successCnt"), + q.timeoutCnt.sum().as("timeoutCnt"), + q.systemErrCnt.sum().as("systemErrCnt"), + q.bizErrCnt.sum().as("bizErrCnt"), + q.seq900TimeoutCnt.sum().as("seq900TimeoutCnt"), + q.seq900SystemErrCnt.sum().as("seq900SystemErrCnt"), + q.seq900BizErrCnt.sum().as("seq900BizErrCnt"), + q.minRespTime.min().castToNum(BigDecimal.class).as("minRespTime"), + q.maxRespTime.max().castToNum(BigDecimal.class).as("maxRespTime"), + Expressions.cases() + .when(q.successCnt.sum().gt(0)) + .then(q.avgRespTime.multiply(q.successCnt).sum() + .divide(q.successCnt.sum()).castToNum(BigDecimal.class)) + .otherwise((BigDecimal) null) + .as("avgRespTime"))) + .from(q) + .where(builder) + .groupBy(q.apiName) + .orderBy(q.apiName.asc()) + .fetch(); + + // 소수점 3자리로 반올림 + results.forEach(ui -> { + if (ui.getAvgRespTime() != null) { + ui.setAvgRespTime(ui.getAvgRespTime().setScale(3, RoundingMode.HALF_UP)); + } + if (ui.getMinRespTime() != null) { + ui.setMinRespTime(ui.getMinRespTime().setScale(3, RoundingMode.HALF_UP)); + } + if (ui.getMaxRespTime() != null) { + ui.setMaxRespTime(ui.getMaxRespTime().setScale(3, RoundingMode.HALF_UP)); + } + }); + + return results; + } + /** * 조회 기간 계산 (최대 1시간 제한) */ diff --git a/src/main/java/com/eactive/eai/rms/data/entity/onl/kjb/statistics/ApiStatsMonthService.java b/src/main/java/com/eactive/eai/rms/data/entity/onl/kjb/statistics/ApiStatsMonthService.java index 928ce4a..4545eca 100644 --- a/src/main/java/com/eactive/eai/rms/data/entity/onl/kjb/statistics/ApiStatsMonthService.java +++ b/src/main/java/com/eactive/eai/rms/data/entity/onl/kjb/statistics/ApiStatsMonthService.java @@ -1,11 +1,14 @@ package com.eactive.eai.rms.data.entity.onl.kjb.statistics; +import java.math.BigDecimal; +import java.math.RoundingMode; import java.time.YearMonth; import java.time.format.DateTimeFormatter; import java.util.List; import org.apache.commons.lang3.StringUtils; import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageImpl; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -13,8 +16,10 @@ import org.springframework.transaction.annotation.Transactional; import com.eactive.eai.data.jpa.AbstractDataService; import com.eactive.ext.kjb.statistics.ui.ApiStatsChartUI; import com.eactive.ext.kjb.statistics.ui.ApiStatsSearch; +import com.eactive.ext.kjb.statistics.ui.ApiStatsUI; import com.querydsl.core.BooleanBuilder; import com.querydsl.core.types.Projections; +import com.querydsl.core.types.dsl.Expressions; @Service @Transactional @@ -87,6 +92,113 @@ public class ApiStatsMonthService .fetch(); } + /** + * API명별 요약 통계 조회 (GROUP BY apiName) + */ + public Page selectSummaryList(ApiStatsSearch search, Pageable pageable) { + QApiStatsMonth q = QApiStatsMonth.apiStatsMonth; + BooleanBuilder builder = buildSearchConditions(q, search); + + // 전체 건수 조회 + Long total = getJPAQueryFactory() + .select(q.apiName.countDistinct()) + .from(q) + .where(builder) + .fetchOne(); + + // 페이징 적용하여 조회 + List results = getJPAQueryFactory() + .select(Projections.fields(ApiStatsUI.class, + q.apiName, + q.totalCnt.sum().as("totalCnt"), + q.successCnt.sum().as("successCnt"), + q.timeoutCnt.sum().as("timeoutCnt"), + q.systemErrCnt.sum().as("systemErrCnt"), + q.bizErrCnt.sum().as("bizErrCnt"), + q.seq900TimeoutCnt.sum().as("seq900TimeoutCnt"), + q.seq900SystemErrCnt.sum().as("seq900SystemErrCnt"), + q.seq900BizErrCnt.sum().as("seq900BizErrCnt"), + q.minRespTime.min().castToNum(BigDecimal.class).as("minRespTime"), + q.maxRespTime.max().castToNum(BigDecimal.class).as("maxRespTime"), + // 가중 평균: SUM(avg * successCnt) / SUM(successCnt) + Expressions.cases() + .when(q.successCnt.sum().gt(0)) + .then(q.avgRespTime.multiply(q.successCnt).sum() + .divide(q.successCnt.sum()).castToNum(BigDecimal.class)) + .otherwise((BigDecimal) null) + .as("avgRespTime"))) + .from(q) + .where(builder) + .groupBy(q.apiName) + .orderBy(q.apiName.asc()) + .offset(pageable.getOffset()) + .limit(pageable.getPageSize()) + .fetch(); + + // 소수점 3자리로 반올림 + results.forEach(ui -> { + if (ui.getAvgRespTime() != null) { + ui.setAvgRespTime(ui.getAvgRespTime().setScale(3, RoundingMode.HALF_UP)); + } + if (ui.getMinRespTime() != null) { + ui.setMinRespTime(ui.getMinRespTime().setScale(3, RoundingMode.HALF_UP)); + } + if (ui.getMaxRespTime() != null) { + ui.setMaxRespTime(ui.getMaxRespTime().setScale(3, RoundingMode.HALF_UP)); + } + }); + + return new PageImpl<>(results, pageable, total != null ? total.longValue() : 0); + } + + /** + * API명별 요약 통계 전체 조회 (Excel용) + */ + public List selectSummaryListForExcel(ApiStatsSearch search) { + QApiStatsMonth q = QApiStatsMonth.apiStatsMonth; + BooleanBuilder builder = buildSearchConditions(q, search); + + List results = getJPAQueryFactory() + .select(Projections.fields(ApiStatsUI.class, + q.apiName, + q.totalCnt.sum().as("totalCnt"), + q.successCnt.sum().as("successCnt"), + q.timeoutCnt.sum().as("timeoutCnt"), + q.systemErrCnt.sum().as("systemErrCnt"), + q.bizErrCnt.sum().as("bizErrCnt"), + q.seq900TimeoutCnt.sum().as("seq900TimeoutCnt"), + q.seq900SystemErrCnt.sum().as("seq900SystemErrCnt"), + q.seq900BizErrCnt.sum().as("seq900BizErrCnt"), + q.minRespTime.min().castToNum(BigDecimal.class).as("minRespTime"), + q.maxRespTime.max().castToNum(BigDecimal.class).as("maxRespTime"), + Expressions.cases() + .when(q.successCnt.sum().gt(0)) + .then(q.avgRespTime.multiply(q.successCnt).sum() + .divide(q.successCnt.sum()).castToNum(BigDecimal.class)) + .otherwise((BigDecimal) null) + .as("avgRespTime"))) + .from(q) + .where(builder) + .groupBy(q.apiName) + .orderBy(q.apiName.asc()) + .fetch(); + + // 소수점 3자리로 반올림 + results.forEach(ui -> { + if (ui.getAvgRespTime() != null) { + ui.setAvgRespTime(ui.getAvgRespTime().setScale(3, RoundingMode.HALF_UP)); + } + if (ui.getMinRespTime() != null) { + ui.setMinRespTime(ui.getMinRespTime().setScale(3, RoundingMode.HALF_UP)); + } + if (ui.getMaxRespTime() != null) { + ui.setMaxRespTime(ui.getMaxRespTime().setScale(3, RoundingMode.HALF_UP)); + } + }); + + return results; + } + private BooleanBuilder buildSearchConditions(QApiStatsMonth q, ApiStatsSearch search) { BooleanBuilder builder = new BooleanBuilder(); diff --git a/src/main/java/com/eactive/eai/rms/data/entity/onl/kjb/statistics/ApiStatsYearService.java b/src/main/java/com/eactive/eai/rms/data/entity/onl/kjb/statistics/ApiStatsYearService.java index 64145eb..65842b0 100644 --- a/src/main/java/com/eactive/eai/rms/data/entity/onl/kjb/statistics/ApiStatsYearService.java +++ b/src/main/java/com/eactive/eai/rms/data/entity/onl/kjb/statistics/ApiStatsYearService.java @@ -1,10 +1,13 @@ package com.eactive.eai.rms.data.entity.onl.kjb.statistics; +import java.math.BigDecimal; +import java.math.RoundingMode; import java.time.Year; import java.util.List; import org.apache.commons.lang3.StringUtils; import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageImpl; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -12,8 +15,10 @@ import org.springframework.transaction.annotation.Transactional; import com.eactive.eai.data.jpa.AbstractDataService; import com.eactive.ext.kjb.statistics.ui.ApiStatsChartUI; import com.eactive.ext.kjb.statistics.ui.ApiStatsSearch; +import com.eactive.ext.kjb.statistics.ui.ApiStatsUI; import com.querydsl.core.BooleanBuilder; import com.querydsl.core.types.Projections; +import com.querydsl.core.types.dsl.Expressions; @Service @Transactional @@ -84,6 +89,113 @@ public class ApiStatsYearService .fetch(); } + /** + * API명별 요약 통계 조회 (GROUP BY apiName) + */ + public Page selectSummaryList(ApiStatsSearch search, Pageable pageable) { + QApiStatsYear q = QApiStatsYear.apiStatsYear; + BooleanBuilder builder = buildSearchConditions(q, search); + + // 전체 건수 조회 + Long total = getJPAQueryFactory() + .select(q.apiName.countDistinct()) + .from(q) + .where(builder) + .fetchOne(); + + // 페이징 적용하여 조회 + List results = getJPAQueryFactory() + .select(Projections.fields(ApiStatsUI.class, + q.apiName, + q.totalCnt.sum().as("totalCnt"), + q.successCnt.sum().as("successCnt"), + q.timeoutCnt.sum().as("timeoutCnt"), + q.systemErrCnt.sum().as("systemErrCnt"), + q.bizErrCnt.sum().as("bizErrCnt"), + q.seq900TimeoutCnt.sum().as("seq900TimeoutCnt"), + q.seq900SystemErrCnt.sum().as("seq900SystemErrCnt"), + q.seq900BizErrCnt.sum().as("seq900BizErrCnt"), + q.minRespTime.min().castToNum(BigDecimal.class).as("minRespTime"), + q.maxRespTime.max().castToNum(BigDecimal.class).as("maxRespTime"), + // 가중 평균: SUM(avg * successCnt) / SUM(successCnt) + Expressions.cases() + .when(q.successCnt.sum().gt(0)) + .then(q.avgRespTime.multiply(q.successCnt).sum() + .divide(q.successCnt.sum()).castToNum(BigDecimal.class)) + .otherwise((BigDecimal) null) + .as("avgRespTime"))) + .from(q) + .where(builder) + .groupBy(q.apiName) + .orderBy(q.apiName.asc()) + .offset(pageable.getOffset()) + .limit(pageable.getPageSize()) + .fetch(); + + // 소수점 3자리로 반올림 + results.forEach(ui -> { + if (ui.getAvgRespTime() != null) { + ui.setAvgRespTime(ui.getAvgRespTime().setScale(3, RoundingMode.HALF_UP)); + } + if (ui.getMinRespTime() != null) { + ui.setMinRespTime(ui.getMinRespTime().setScale(3, RoundingMode.HALF_UP)); + } + if (ui.getMaxRespTime() != null) { + ui.setMaxRespTime(ui.getMaxRespTime().setScale(3, RoundingMode.HALF_UP)); + } + }); + + return new PageImpl<>(results, pageable, total != null ? total.longValue() : 0); + } + + /** + * API명별 요약 통계 전체 조회 (Excel용) + */ + public List selectSummaryListForExcel(ApiStatsSearch search) { + QApiStatsYear q = QApiStatsYear.apiStatsYear; + BooleanBuilder builder = buildSearchConditions(q, search); + + List results = getJPAQueryFactory() + .select(Projections.fields(ApiStatsUI.class, + q.apiName, + q.totalCnt.sum().as("totalCnt"), + q.successCnt.sum().as("successCnt"), + q.timeoutCnt.sum().as("timeoutCnt"), + q.systemErrCnt.sum().as("systemErrCnt"), + q.bizErrCnt.sum().as("bizErrCnt"), + q.seq900TimeoutCnt.sum().as("seq900TimeoutCnt"), + q.seq900SystemErrCnt.sum().as("seq900SystemErrCnt"), + q.seq900BizErrCnt.sum().as("seq900BizErrCnt"), + q.minRespTime.min().castToNum(BigDecimal.class).as("minRespTime"), + q.maxRespTime.max().castToNum(BigDecimal.class).as("maxRespTime"), + Expressions.cases() + .when(q.successCnt.sum().gt(0)) + .then(q.avgRespTime.multiply(q.successCnt).sum() + .divide(q.successCnt.sum()).castToNum(BigDecimal.class)) + .otherwise((BigDecimal) null) + .as("avgRespTime"))) + .from(q) + .where(builder) + .groupBy(q.apiName) + .orderBy(q.apiName.asc()) + .fetch(); + + // 소수점 3자리로 반올림 + results.forEach(ui -> { + if (ui.getAvgRespTime() != null) { + ui.setAvgRespTime(ui.getAvgRespTime().setScale(3, RoundingMode.HALF_UP)); + } + if (ui.getMinRespTime() != null) { + ui.setMinRespTime(ui.getMinRespTime().setScale(3, RoundingMode.HALF_UP)); + } + if (ui.getMaxRespTime() != null) { + ui.setMaxRespTime(ui.getMaxRespTime().setScale(3, RoundingMode.HALF_UP)); + } + }); + + return results; + } + private BooleanBuilder buildSearchConditions(QApiStatsYear q, ApiStatsSearch search) { BooleanBuilder builder = new BooleanBuilder(); diff --git a/src/main/java/com/eactive/ext/kjb/statistics/ApiStatsDayController.java b/src/main/java/com/eactive/ext/kjb/statistics/ApiStatsDayController.java index 3221419..01bba22 100644 --- a/src/main/java/com/eactive/ext/kjb/statistics/ApiStatsDayController.java +++ b/src/main/java/com/eactive/ext/kjb/statistics/ApiStatsDayController.java @@ -63,6 +63,12 @@ public class ApiStatsDayController { return ResponseEntity.ok(chartData); } + @PostMapping(value = "/onl/kjb/statistics/apiStatsDayMan.json", params = "cmd=LIST_SUMMARY") + public ResponseEntity> selectSummaryList(ApiStatsSearch search, Pageable pageable) { + Page page = service.selectSummaryList(search, pageable); + return ResponseEntity.ok(new GridResponse<>(page)); + } + @PostMapping(value = "/onl/kjb/statistics/apiStatsDayMan.json", params = "cmd=EXCEL_EXPORT") public void exportToExcel(ApiStatsSearch search, HttpServletResponse response) throws IOException { log.info("Excel export started - search: {}", search); @@ -106,10 +112,55 @@ public class ApiStatsDayController { } } + @PostMapping(value = "/onl/kjb/statistics/apiStatsDayMan.json", params = "cmd=EXCEL_EXPORT_SUMMARY") + public void exportSummaryToExcel(ApiStatsSearch search, HttpServletResponse response) throws IOException { + log.info("Excel export (summary) started - search: {}", search); + + try { + List dataList = service.selectSummaryListForExcel(search); + log.info("Summary data retrieved - count: {}", dataList.size()); + + if (dataList.isEmpty()) { + log.warn("No data found for export"); + response.setStatus(HttpServletResponse.SC_NO_CONTENT); + response.setContentType("application/json; charset=UTF-8"); + response.getWriter().write("{\"message\":\"조회된 데이터가 없습니다.\"}"); + response.getWriter().flush(); + return; + } + + String fileName = generateSummaryFileName(search); + log.info("Generating Excel file: {}", fileName); + + excelExportService.exportApiStats(dataList, fileName, response); + log.info("Excel export (summary) completed successfully"); + + } catch (Exception e) { + log.error("Excel export (summary) failed - error: {}", e.getMessage(), e); + + if (!response.isCommitted()) { + response.reset(); + response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); + response.setContentType("application/json; charset=UTF-8"); + response.getWriter().write("{\"message\":\"Excel 파일 생성 중 오류가 발생했습니다: " + e.getMessage() + "\"}"); + response.getWriter().flush(); + } else { + log.error("Cannot send error response - response already committed"); + } + } + } + private String generateFileName(ApiStatsSearch search) { String timeRange = StringUtils.isNotBlank(search.getSearchStartDateTime()) ? search.getSearchStartDateTime() : LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd")); return "API일별통계_" + timeRange + ".xlsx"; } + + private String generateSummaryFileName(ApiStatsSearch search) { + String timeRange = StringUtils.isNotBlank(search.getSearchStartDateTime()) + ? search.getSearchStartDateTime() + : LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd")); + return "API일별통계_요약_" + timeRange + ".xlsx"; + } } diff --git a/src/main/java/com/eactive/ext/kjb/statistics/ApiStatsHourController.java b/src/main/java/com/eactive/ext/kjb/statistics/ApiStatsHourController.java index 1869eba..20b2a9b 100644 --- a/src/main/java/com/eactive/ext/kjb/statistics/ApiStatsHourController.java +++ b/src/main/java/com/eactive/ext/kjb/statistics/ApiStatsHourController.java @@ -63,6 +63,12 @@ public class ApiStatsHourController { return ResponseEntity.ok(chartData); } + @PostMapping(value = "/onl/kjb/statistics/apiStatsHourMan.json", params = "cmd=LIST_SUMMARY") + public ResponseEntity> selectSummaryList(ApiStatsSearch search, Pageable pageable) { + Page page = service.selectSummaryList(search, pageable); + return ResponseEntity.ok(new GridResponse<>(page)); + } + @PostMapping(value = "/onl/kjb/statistics/apiStatsHourMan.json", params = "cmd=EXCEL_EXPORT") public void exportToExcel(ApiStatsSearch search, HttpServletResponse response) throws IOException { log.info("Excel export started - search: {}", search); @@ -106,10 +112,55 @@ public class ApiStatsHourController { } } + @PostMapping(value = "/onl/kjb/statistics/apiStatsHourMan.json", params = "cmd=EXCEL_EXPORT_SUMMARY") + public void exportSummaryToExcel(ApiStatsSearch search, HttpServletResponse response) throws IOException { + log.info("Excel export (summary) started - search: {}", search); + + try { + List dataList = service.selectSummaryListForExcel(search); + log.info("Summary data retrieved - count: {}", dataList.size()); + + if (dataList.isEmpty()) { + log.warn("No data found for export"); + response.setStatus(HttpServletResponse.SC_NO_CONTENT); + response.setContentType("application/json; charset=UTF-8"); + response.getWriter().write("{\"message\":\"조회된 데이터가 없습니다.\"}"); + response.getWriter().flush(); + return; + } + + String fileName = generateSummaryFileName(search); + log.info("Generating Excel file: {}", fileName); + + excelExportService.exportApiStats(dataList, fileName, response); + log.info("Excel export (summary) completed successfully"); + + } catch (Exception e) { + log.error("Excel export (summary) failed - error: {}", e.getMessage(), e); + + if (!response.isCommitted()) { + response.reset(); + response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); + response.setContentType("application/json; charset=UTF-8"); + response.getWriter().write("{\"message\":\"Excel 파일 생성 중 오류가 발생했습니다: " + e.getMessage() + "\"}"); + response.getWriter().flush(); + } else { + log.error("Cannot send error response - response already committed"); + } + } + } + private String generateFileName(ApiStatsSearch search) { String timeRange = StringUtils.isNotBlank(search.getSearchStartDateTime()) ? search.getSearchStartDateTime() : LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHH")); return "API시간별통계_" + timeRange + ".xlsx"; } + + private String generateSummaryFileName(ApiStatsSearch search) { + String timeRange = StringUtils.isNotBlank(search.getSearchStartDateTime()) + ? search.getSearchStartDateTime() + : LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHH")); + return "API시간별통계_요약_" + timeRange + ".xlsx"; + } } diff --git a/src/main/java/com/eactive/ext/kjb/statistics/ApiStatsMinuteController.java b/src/main/java/com/eactive/ext/kjb/statistics/ApiStatsMinuteController.java index baf46a5..a153172 100644 --- a/src/main/java/com/eactive/ext/kjb/statistics/ApiStatsMinuteController.java +++ b/src/main/java/com/eactive/ext/kjb/statistics/ApiStatsMinuteController.java @@ -63,6 +63,12 @@ public class ApiStatsMinuteController { return ResponseEntity.ok(chartData); } + @PostMapping(value = "/onl/kjb/statistics/apiStatsMinuteMan.json", params = "cmd=LIST_SUMMARY") + public ResponseEntity> selectSummaryList(ApiStatsSearch search, Pageable pageable) { + Page page = service.selectSummaryList(search, pageable); + return ResponseEntity.ok(new GridResponse<>(page)); + } + @PostMapping(value = "/onl/kjb/statistics/apiStatsMinuteMan.json", params = "cmd=EXCEL_EXPORT") public void exportToExcel(ApiStatsSearch search, HttpServletResponse response) throws IOException { log.info("Excel export started - search: {}", search); @@ -106,10 +112,55 @@ public class ApiStatsMinuteController { } } + @PostMapping(value = "/onl/kjb/statistics/apiStatsMinuteMan.json", params = "cmd=EXCEL_EXPORT_SUMMARY") + public void exportSummaryToExcel(ApiStatsSearch search, HttpServletResponse response) throws IOException { + log.info("Excel export (summary) started - search: {}", search); + + try { + List dataList = service.selectSummaryListForExcel(search); + log.info("Summary data retrieved - count: {}", dataList.size()); + + if (dataList.isEmpty()) { + log.warn("No data found for export"); + response.setStatus(HttpServletResponse.SC_NO_CONTENT); + response.setContentType("application/json; charset=UTF-8"); + response.getWriter().write("{\"message\":\"조회된 데이터가 없습니다.\"}"); + response.getWriter().flush(); + return; + } + + String fileName = generateSummaryFileName(search); + log.info("Generating Excel file: {}", fileName); + + excelExportService.exportApiStats(dataList, fileName, response); + log.info("Excel export (summary) completed successfully"); + + } catch (Exception e) { + log.error("Excel export (summary) failed - error: {}", e.getMessage(), e); + + if (!response.isCommitted()) { + response.reset(); + response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); + response.setContentType("application/json; charset=UTF-8"); + response.getWriter().write("{\"message\":\"Excel 파일 생성 중 오류가 발생했습니다: " + e.getMessage() + "\"}"); + response.getWriter().flush(); + } else { + log.error("Cannot send error response - response already committed"); + } + } + } + private String generateFileName(ApiStatsSearch search) { String timeRange = StringUtils.isNotBlank(search.getSearchStartDateTime()) ? search.getSearchStartDateTime() : LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmm")); return "API분단위통계_" + timeRange + ".xlsx"; } + + private String generateSummaryFileName(ApiStatsSearch search) { + String timeRange = StringUtils.isNotBlank(search.getSearchStartDateTime()) + ? search.getSearchStartDateTime() + : LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmm")); + return "API분단위통계_요약_" + timeRange + ".xlsx"; + } } diff --git a/src/main/java/com/eactive/ext/kjb/statistics/ApiStatsMonthController.java b/src/main/java/com/eactive/ext/kjb/statistics/ApiStatsMonthController.java index 55e474e..5f18d85 100644 --- a/src/main/java/com/eactive/ext/kjb/statistics/ApiStatsMonthController.java +++ b/src/main/java/com/eactive/ext/kjb/statistics/ApiStatsMonthController.java @@ -63,6 +63,12 @@ public class ApiStatsMonthController { return ResponseEntity.ok(chartData); } + @PostMapping(value = "/onl/kjb/statistics/apiStatsMonthMan.json", params = "cmd=LIST_SUMMARY") + public ResponseEntity> selectSummaryList(ApiStatsSearch search, Pageable pageable) { + Page page = service.selectSummaryList(search, pageable); + return ResponseEntity.ok(new GridResponse<>(page)); + } + @PostMapping(value = "/onl/kjb/statistics/apiStatsMonthMan.json", params = "cmd=EXCEL_EXPORT") public void exportToExcel(ApiStatsSearch search, HttpServletResponse response) throws IOException { log.info("Excel export started - search: {}", search); @@ -106,10 +112,55 @@ public class ApiStatsMonthController { } } + @PostMapping(value = "/onl/kjb/statistics/apiStatsMonthMan.json", params = "cmd=EXCEL_EXPORT_SUMMARY") + public void exportSummaryToExcel(ApiStatsSearch search, HttpServletResponse response) throws IOException { + log.info("Excel export (summary) started - search: {}", search); + + try { + List dataList = service.selectSummaryListForExcel(search); + log.info("Summary data retrieved - count: {}", dataList.size()); + + if (dataList.isEmpty()) { + log.warn("No data found for export"); + response.setStatus(HttpServletResponse.SC_NO_CONTENT); + response.setContentType("application/json; charset=UTF-8"); + response.getWriter().write("{\"message\":\"조회된 데이터가 없습니다.\"}"); + response.getWriter().flush(); + return; + } + + String fileName = generateSummaryFileName(search); + log.info("Generating Excel file: {}", fileName); + + excelExportService.exportApiStats(dataList, fileName, response); + log.info("Excel export (summary) completed successfully"); + + } catch (Exception e) { + log.error("Excel export (summary) failed - error: {}", e.getMessage(), e); + + if (!response.isCommitted()) { + response.reset(); + response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); + response.setContentType("application/json; charset=UTF-8"); + response.getWriter().write("{\"message\":\"Excel 파일 생성 중 오류가 발생했습니다: " + e.getMessage() + "\"}"); + response.getWriter().flush(); + } else { + log.error("Cannot send error response - response already committed"); + } + } + } + private String generateFileName(ApiStatsSearch search) { String timeRange = StringUtils.isNotBlank(search.getSearchStartDateTime()) ? search.getSearchStartDateTime() : YearMonth.now().format(DateTimeFormatter.ofPattern("yyyyMM")); return "API월별통계_" + timeRange + ".xlsx"; } + + private String generateSummaryFileName(ApiStatsSearch search) { + String timeRange = StringUtils.isNotBlank(search.getSearchStartDateTime()) + ? search.getSearchStartDateTime() + : YearMonth.now().format(DateTimeFormatter.ofPattern("yyyyMM")); + return "API월별통계_요약_" + timeRange + ".xlsx"; + } } diff --git a/src/main/java/com/eactive/ext/kjb/statistics/ApiStatsYearController.java b/src/main/java/com/eactive/ext/kjb/statistics/ApiStatsYearController.java index c2e587a..8b2fb2a 100644 --- a/src/main/java/com/eactive/ext/kjb/statistics/ApiStatsYearController.java +++ b/src/main/java/com/eactive/ext/kjb/statistics/ApiStatsYearController.java @@ -62,6 +62,12 @@ public class ApiStatsYearController { return ResponseEntity.ok(chartData); } + @PostMapping(value = "/onl/kjb/statistics/apiStatsYearMan.json", params = "cmd=LIST_SUMMARY") + public ResponseEntity> selectSummaryList(ApiStatsSearch search, Pageable pageable) { + Page page = service.selectSummaryList(search, pageable); + return ResponseEntity.ok(new GridResponse<>(page)); + } + @PostMapping(value = "/onl/kjb/statistics/apiStatsYearMan.json", params = "cmd=EXCEL_EXPORT") public void exportToExcel(ApiStatsSearch search, HttpServletResponse response) throws IOException { log.info("Excel export started - search: {}", search); @@ -105,10 +111,55 @@ public class ApiStatsYearController { } } + @PostMapping(value = "/onl/kjb/statistics/apiStatsYearMan.json", params = "cmd=EXCEL_EXPORT_SUMMARY") + public void exportSummaryToExcel(ApiStatsSearch search, HttpServletResponse response) throws IOException { + log.info("Excel export (summary) started - search: {}", search); + + try { + List dataList = service.selectSummaryListForExcel(search); + log.info("Summary data retrieved - count: {}", dataList.size()); + + if (dataList.isEmpty()) { + log.warn("No data found for export"); + response.setStatus(HttpServletResponse.SC_NO_CONTENT); + response.setContentType("application/json; charset=UTF-8"); + response.getWriter().write("{\"message\":\"조회된 데이터가 없습니다.\"}"); + response.getWriter().flush(); + return; + } + + String fileName = generateSummaryFileName(search); + log.info("Generating Excel file: {}", fileName); + + excelExportService.exportApiStats(dataList, fileName, response); + log.info("Excel export (summary) completed successfully"); + + } catch (Exception e) { + log.error("Excel export (summary) failed - error: {}", e.getMessage(), e); + + if (!response.isCommitted()) { + response.reset(); + response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); + response.setContentType("application/json; charset=UTF-8"); + response.getWriter().write("{\"message\":\"Excel 파일 생성 중 오류가 발생했습니다: " + e.getMessage() + "\"}"); + response.getWriter().flush(); + } else { + log.error("Cannot send error response - response already committed"); + } + } + } + private String generateFileName(ApiStatsSearch search) { String timeRange = StringUtils.isNotBlank(search.getSearchStartDateTime()) ? search.getSearchStartDateTime() : String.valueOf(Year.now().getValue()); return "API연간통계_" + timeRange + ".xlsx"; } + + private String generateSummaryFileName(ApiStatsSearch search) { + String timeRange = StringUtils.isNotBlank(search.getSearchStartDateTime()) + ? search.getSearchStartDateTime() + : String.valueOf(Year.now().getValue()); + return "API연간통계_요약_" + timeRange + ".xlsx"; + } } diff --git a/src/main/java/com/eactive/ext/kjb/statistics/job/DailyToMonthlyAggregationJob.java b/src/main/java/com/eactive/ext/kjb/statistics/job/DailyToMonthlyAggregationJob.java index 4f5e8f1..149b554 100644 --- a/src/main/java/com/eactive/ext/kjb/statistics/job/DailyToMonthlyAggregationJob.java +++ b/src/main/java/com/eactive/ext/kjb/statistics/job/DailyToMonthlyAggregationJob.java @@ -25,6 +25,7 @@ import com.eactive.eai.rms.data.entity.onl.kjb.statistics.ApiStatsDayService; import com.eactive.eai.rms.data.entity.onl.kjb.statistics.QApiStatsDay; import com.eactive.eai.rms.data.entity.onl.kjb.statistics.QApiStatsMonth; import com.querydsl.core.types.Projections; +import com.querydsl.core.types.dsl.Expressions; import com.querydsl.jpa.impl.JPAQueryFactory; /** @@ -129,11 +130,26 @@ public class DailyToMonthlyAggregationJob implements Job { qd.seq900TimeoutCnt.sum().as("seq900TimeoutCnt"), qd.seq900SystemErrCnt.sum().as("seq900SystemErrCnt"), qd.seq900BizErrCnt.sum().as("seq900BizErrCnt"), - qd.avgRespTime.avg().castToNum(BigDecimal.class).as("avgRespTime"), + Expressions.cases() + .when(qd.successCnt.sum().gt(0)) + .then(qd.avgRespTime.multiply(qd.successCnt).sum() + .divide(qd.successCnt.sum()).castToNum(BigDecimal.class)) + .otherwise((BigDecimal) null) + .as("avgRespTime"), qd.minRespTime.min().castToNum(BigDecimal.class).as("minRespTime"), qd.maxRespTime.max().castToNum(BigDecimal.class).as("maxRespTime"), - qd.p50RespTime.avg().castToNum(BigDecimal.class).as("p50RespTime"), - qd.p95RespTime.avg().castToNum(BigDecimal.class).as("p95RespTime"))) + Expressions.cases() + .when(qd.successCnt.sum().gt(0)) + .then(qd.p50RespTime.multiply(qd.successCnt).sum() + .divide(qd.successCnt.sum()).castToNum(BigDecimal.class)) + .otherwise((BigDecimal) null) + .as("p50RespTime"), + Expressions.cases() + .when(qd.successCnt.sum().gt(0)) + .then(qd.p95RespTime.multiply(qd.successCnt).sum() + .divide(qd.successCnt.sum()).castToNum(BigDecimal.class)) + .otherwise((BigDecimal) null) + .as("p95RespTime"))) .from(qd) .where(qd.statTime.goe(startDate) .and(qd.statTime.loe(endDate))) diff --git a/src/main/java/com/eactive/ext/kjb/statistics/job/HourlyToDailyAggregationJob.java b/src/main/java/com/eactive/ext/kjb/statistics/job/HourlyToDailyAggregationJob.java index 2495d2d..feb20ee 100644 --- a/src/main/java/com/eactive/ext/kjb/statistics/job/HourlyToDailyAggregationJob.java +++ b/src/main/java/com/eactive/ext/kjb/statistics/job/HourlyToDailyAggregationJob.java @@ -24,6 +24,7 @@ import com.eactive.eai.rms.data.entity.onl.kjb.statistics.ApiStatsHourService; import com.eactive.eai.rms.data.entity.onl.kjb.statistics.QApiStatsDay; import com.eactive.eai.rms.data.entity.onl.kjb.statistics.QApiStatsHour; import com.querydsl.core.types.Projections; +import com.querydsl.core.types.dsl.Expressions; import com.querydsl.jpa.impl.JPAQueryFactory; /** @@ -125,11 +126,26 @@ public class HourlyToDailyAggregationJob implements Job { qh.seq900TimeoutCnt.sum().as("seq900TimeoutCnt"), qh.seq900SystemErrCnt.sum().as("seq900SystemErrCnt"), qh.seq900BizErrCnt.sum().as("seq900BizErrCnt"), - qh.avgRespTime.avg().castToNum(BigDecimal.class).as("avgRespTime"), + Expressions.cases() + .when(qh.successCnt.sum().gt(0)) + .then(qh.avgRespTime.multiply(qh.successCnt).sum() + .divide(qh.successCnt.sum()).castToNum(BigDecimal.class)) + .otherwise((BigDecimal) null) + .as("avgRespTime"), qh.minRespTime.min().castToNum(BigDecimal.class).as("minRespTime"), qh.maxRespTime.max().castToNum(BigDecimal.class).as("maxRespTime"), - qh.p50RespTime.avg().castToNum(BigDecimal.class).as("p50RespTime"), - qh.p95RespTime.avg().castToNum(BigDecimal.class).as("p95RespTime"))) + Expressions.cases() + .when(qh.successCnt.sum().gt(0)) + .then(qh.p50RespTime.multiply(qh.successCnt).sum() + .divide(qh.successCnt.sum()).castToNum(BigDecimal.class)) + .otherwise((BigDecimal) null) + .as("p50RespTime"), + Expressions.cases() + .when(qh.successCnt.sum().gt(0)) + .then(qh.p95RespTime.multiply(qh.successCnt).sum() + .divide(qh.successCnt.sum()).castToNum(BigDecimal.class)) + .otherwise((BigDecimal) null) + .as("p95RespTime"))) .from(qh) .where(qh.statTime.goe(startDateTime) .and(qh.statTime.loe(endDateTime))) diff --git a/src/main/java/com/eactive/ext/kjb/statistics/job/MonthlyToYearlyAggregationJob.java b/src/main/java/com/eactive/ext/kjb/statistics/job/MonthlyToYearlyAggregationJob.java index 0e4f932..b0450ee 100644 --- a/src/main/java/com/eactive/ext/kjb/statistics/job/MonthlyToYearlyAggregationJob.java +++ b/src/main/java/com/eactive/ext/kjb/statistics/job/MonthlyToYearlyAggregationJob.java @@ -23,6 +23,7 @@ import com.eactive.eai.rms.data.entity.onl.kjb.statistics.ApiStatsMonthService; import com.eactive.eai.rms.data.entity.onl.kjb.statistics.QApiStatsMonth; import com.eactive.eai.rms.data.entity.onl.kjb.statistics.QApiStatsYear; import com.querydsl.core.types.Projections; +import com.querydsl.core.types.dsl.Expressions; import com.querydsl.jpa.impl.JPAQueryFactory; /** @@ -127,11 +128,26 @@ public class MonthlyToYearlyAggregationJob implements Job { qm.seq900TimeoutCnt.sum().as("seq900TimeoutCnt"), qm.seq900SystemErrCnt.sum().as("seq900SystemErrCnt"), qm.seq900BizErrCnt.sum().as("seq900BizErrCnt"), - qm.avgRespTime.avg().castToNum(BigDecimal.class).as("avgRespTime"), + Expressions.cases() + .when(qm.successCnt.sum().gt(0)) + .then(qm.avgRespTime.multiply(qm.successCnt).sum() + .divide(qm.successCnt.sum()).castToNum(BigDecimal.class)) + .otherwise((BigDecimal) null) + .as("avgRespTime"), qm.minRespTime.min().castToNum(BigDecimal.class).as("minRespTime"), qm.maxRespTime.max().castToNum(BigDecimal.class).as("maxRespTime"), - qm.p50RespTime.avg().castToNum(BigDecimal.class).as("p50RespTime"), - qm.p95RespTime.avg().castToNum(BigDecimal.class).as("p95RespTime"))) + Expressions.cases() + .when(qm.successCnt.sum().gt(0)) + .then(qm.p50RespTime.multiply(qm.successCnt).sum() + .divide(qm.successCnt.sum()).castToNum(BigDecimal.class)) + .otherwise((BigDecimal) null) + .as("p50RespTime"), + Expressions.cases() + .when(qm.successCnt.sum().gt(0)) + .then(qm.p95RespTime.multiply(qm.successCnt).sum() + .divide(qm.successCnt.sum()).castToNum(BigDecimal.class)) + .otherwise((BigDecimal) null) + .as("p95RespTime"))) .from(qm) .where(qm.statTime.goe(startMonth) .and(qm.statTime.loe(endMonth))) From 9a387358d3e71321c79e036bd6c6f241eb24ae6b Mon Sep 17 00:00:00 2001 From: daekuk1 Date: Mon, 2 Feb 2026 13:47:21 +0900 Subject: [PATCH 2/3] =?UTF-8?q?=ED=98=95=EC=83=81=20=ED=98=B8=EC=B6=9C=20?= =?UTF-8?q?=ED=94=84=EB=A1=9C=EC=84=B8=EC=8A=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../rms/onl/loader/controller/형상 호출.txt | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 src/main/java/com/eactive/eai/rms/onl/loader/controller/형상 호출.txt diff --git a/src/main/java/com/eactive/eai/rms/onl/loader/controller/형상 호출.txt b/src/main/java/com/eactive/eai/rms/onl/loader/controller/형상 호출.txt new file mode 100644 index 0000000..1577f61 --- /dev/null +++ b/src/main/java/com/eactive/eai/rms/onl/loader/controller/형상 호출.txt @@ -0,0 +1,24 @@ +1. 다운로드 +호출 URL : http://localhost:28080/monitoring//loader.do?cmd=interface&control=downloadfull&serviceType=APIGW&interfaceId=AGWBB00000002S1 +Parameters : + cmd=interface + control=downloadfull + serviceType=APIGW + interfaceId=AGWBB00000002S1 + +다운로드 디렉터리 위치 + 모니터링 프로퍼티 키명 : iomap.download.path + +다운로드 파일 명 : 인터페이스명 + .json + +2. 업로드 +호출 URL : http://localhost:28080/monitoring//loader.do?cmd=interface&control=uploadfull&serviceType=APIGW&filePath=AGWBB00000002S1.json +Parameters : +cmd=interface +control=uploadfull +serviceType=APIGW +filePath=AGWBB00000002S1.json + +업로드 디렉터리 위치 + 모니터링 프로퍼티 키명 : iomap.upload.path + From 86ed2fd02344d6e87303255b3b31f9d077062bed Mon Sep 17 00:00:00 2001 From: daekuk1 Date: Mon, 2 Feb 2026 13:48:50 +0900 Subject: [PATCH 3/3] iim layout sync --- .../oracle/sqlMapConfigOfOnl.xml | 6 + .../onl/layout/LayoutItemEMSRepository.java | 13 + .../rms/onl/manage/rule/layout/LayoutDao.java | 142 +++- .../rule/layoutsync/KJBInterfaceDao.java | 25 + .../rule/layoutsync/KJBInterfaceService.java | 24 + .../manage/rule/layoutsync/KJBLayoutDao.java | 22 + .../rule/layoutsync/KJBTransformService.java | 291 +++++++ .../manage/rule/layoutsync/Layout-oracle.xml | 458 +++++++++++ .../rms/onl/manage/rule/layoutsync/Layout.xml | 160 ++++ .../rule/layoutsync/LayoutSyncController.java | 744 ++++++++++++++++-- .../rule/layoutsync/LayoutSyncService.java | 13 +- .../rms/onl/transaction/Interface-oracle.xml | 9 +- .../eai/rms/onl/transaction/Layout-oracle.xml | 458 +++++++++++ .../eai/rms/onl/transaction/Layout.xml | 160 ++++ .../layoutsync/LayoutSyncControllerTest.java | 59 ++ 15 files changed, 2483 insertions(+), 101 deletions(-) create mode 100644 src/main/java/com/eactive/eai/rms/onl/manage/rule/layoutsync/KJBInterfaceDao.java create mode 100644 src/main/java/com/eactive/eai/rms/onl/manage/rule/layoutsync/KJBInterfaceService.java create mode 100644 src/main/java/com/eactive/eai/rms/onl/manage/rule/layoutsync/KJBLayoutDao.java create mode 100644 src/main/java/com/eactive/eai/rms/onl/manage/rule/layoutsync/KJBTransformService.java create mode 100644 src/main/java/com/eactive/eai/rms/onl/manage/rule/layoutsync/Layout-oracle.xml create mode 100644 src/main/java/com/eactive/eai/rms/onl/manage/rule/layoutsync/Layout.xml create mode 100644 src/main/resources/com/eactive/eai/rms/onl/transaction/Layout-oracle.xml create mode 100644 src/main/resources/com/eactive/eai/rms/onl/transaction/Layout.xml create mode 100644 src/test/java/com/eactive/eai/rms/onl/manage/rule/layoutsync/LayoutSyncControllerTest.java diff --git a/WebContent/WEB-INF/sqlmap-config/oracle/sqlMapConfigOfOnl.xml b/WebContent/WEB-INF/sqlmap-config/oracle/sqlMapConfigOfOnl.xml index 44e1f9b..1dfc728 100644 --- a/WebContent/WEB-INF/sqlmap-config/oracle/sqlMapConfigOfOnl.xml +++ b/WebContent/WEB-INF/sqlmap-config/oracle/sqlMapConfigOfOnl.xml @@ -87,6 +87,12 @@ resource="com/eactive/eai/rms/onl/statistics/backup/MonthlyBackup-oracle.xml" /> + + + + diff --git a/src/main/java/com/eactive/eai/rms/data/entity/onl/layout/LayoutItemEMSRepository.java b/src/main/java/com/eactive/eai/rms/data/entity/onl/layout/LayoutItemEMSRepository.java index 31b2ed5..522be90 100644 --- a/src/main/java/com/eactive/eai/rms/data/entity/onl/layout/LayoutItemEMSRepository.java +++ b/src/main/java/com/eactive/eai/rms/data/entity/onl/layout/LayoutItemEMSRepository.java @@ -1,9 +1,22 @@ package com.eactive.eai.rms.data.entity.onl.layout; +import java.util.List; + +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; + import com.eactive.eai.data.entity.onl.transformer.layout.LayoutItemEntity; import com.eactive.eai.data.entity.onl.transformer.layout.LayoutItemEntityId; import com.eactive.eai.data.jpa.BaseRepository; public interface LayoutItemEMSRepository extends BaseRepository { + @Modifying + @Query("DELETE FROM LayoutItemEntity l WHERE l.id.loutname = :loutname") + int deleteByLoutname(@Param("loutname") String loutname); + + List findByIdLoutname(String loutname); + + List findByIdLoutnameOrderByIdLoutitemserno(String loutname); } diff --git a/src/main/java/com/eactive/eai/rms/onl/manage/rule/layout/LayoutDao.java b/src/main/java/com/eactive/eai/rms/onl/manage/rule/layout/LayoutDao.java index 9caeb71..5bf2b1f 100644 --- a/src/main/java/com/eactive/eai/rms/onl/manage/rule/layout/LayoutDao.java +++ b/src/main/java/com/eactive/eai/rms/onl/manage/rule/layout/LayoutDao.java @@ -1,12 +1,23 @@ package com.eactive.eai.rms.onl.manage.rule.layout; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; import java.util.HashMap; import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; import org.apache.log4j.Logger; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository; +import com.eactive.eai.data.entity.onl.transformer.layout.LayoutEntity; +import com.eactive.eai.data.entity.onl.transformer.layout.LayoutItemEntity; +import com.eactive.eai.data.entity.onl.transformer.layout.LayoutItemEntityId; import com.eactive.eai.rms.common.base.SqlMapClientTemplateDao; +import com.eactive.eai.rms.data.entity.onl.bzwkdstcd.UserBusinessService; +import com.eactive.eai.rms.data.entity.onl.layout.LayoutItemEMSRepository; +import com.eactive.eai.rms.data.entity.onl.layout.LayoutService; import com.eactive.eai.rms.onl.manage.rule.layoutsync.LayoutSyncVo; @Repository("layoutDao") @@ -14,37 +25,137 @@ import com.eactive.eai.rms.onl.manage.rule.layoutsync.LayoutSyncVo; public class LayoutDao extends SqlMapClientTemplateDao { private static final Logger logger = Logger.getLogger(LayoutDao.class); + private static final DateTimeFormatter DATETIME_FORMATTER = DateTimeFormatter.ofPattern("yyyyMMddHHmmss"); + + @Autowired + private LayoutService layoutService; + + @Autowired + private LayoutItemEMSRepository layoutItemRepository; + + @Autowired + private UserBusinessService userBusinessService; public int selectListCount(HashMap param) throws Exception { - return (Integer) template.queryForObject("Layout.selectListCount", param); + List currentUserBusiness = userBusinessService.getCurrentUserBusinessCodes(); + long count = layoutService.getJPAQueryFactory() + .selectFrom(com.eactive.eai.data.entity.onl.transformer.layout.QLayoutEntity.layoutEntity) + .where(com.eactive.eai.data.entity.onl.transformer.layout.QLayoutEntity.layoutEntity.eaibzwkdstcd.in(currentUserBusiness)) + .fetchCount(); + return (int) count; } public HashMap selectDetail(HashMap param) throws Exception { - return (HashMap) template.queryForObject("Layout.selectDetail", param); + String loutName = (String) param.get("loutName"); + Optional optionalEntity = layoutService.findById(loutName); + + if (!optionalEntity.isPresent()) { + return null; + } + + LayoutEntity entity = optionalEntity.get(); + HashMap result = new HashMap<>(); + result.put("LOUTNAME", entity.getLoutname()); + result.put("LOUTPTRNNAME", entity.getLoutptrnname()); + result.put("LOUTDESC", entity.getLoutdesc()); + result.put("LASTAMNDHMS", entity.getLastamndhms() != null ? entity.getLastamndhms().format(DATETIME_FORMATTER) : null); + result.put("EAIBZWKDSTCD", entity.getEaibzwkdstcd()); + result.put("UAPPLNAME", entity.getUapplname()); + result.put("SYSINTFACNAME", entity.getSysintfacname()); + + return result; } public void insert(HashMap paramMap) throws Exception { - this.template.insert("Layout.insert", paramMap); + LayoutEntity entity = new LayoutEntity(); + entity.setLoutname((String) paramMap.get("loutName")); + entity.setLoutptrnname((String) paramMap.get("loutPtrnName")); + entity.setLoutdesc((String) paramMap.get("loutDesc")); + entity.setEaibzwkdstcd((String) paramMap.get("eaiBzwkDstcd")); + entity.setUapplname((String) paramMap.get("uapplName")); + entity.setSysintfacname((String) paramMap.get("sysIntfacName")); + + layoutService.save(entity); } public void update(HashMap paramMap) throws Exception { - this.template.update("Layout.update", paramMap); + String loutName = (String) paramMap.get("loutName"); + Optional optionalEntity = layoutService.findById(loutName); + + if (!optionalEntity.isPresent()) { + throw new Exception("Layout not found: " + loutName); + } + + LayoutEntity entity = optionalEntity.get(); + entity.setLoutptrnname((String) paramMap.get("loutPtrnName")); + entity.setLoutdesc((String) paramMap.get("loutDesc")); + entity.setEaibzwkdstcd((String) paramMap.get("eaiBzwkDstcd")); + entity.setUapplname((String) paramMap.get("uapplName")); + entity.setSysintfacname((String) paramMap.get("sysIntfacName")); + + layoutService.save(entity); } public void delete(HashMap paramMap) throws Exception { - this.template.delete("Layout.delete", paramMap); + String loutName = (String) paramMap.get("loutName"); + layoutService.deleteById(loutName); } public int insertItem(HashMap param) { - return this.template.update("Layout.insertItem", param); + LayoutItemEntity entity = new LayoutItemEntity(); + + // Composite Key 설정 + LayoutItemEntityId id = new LayoutItemEntityId(); + id.setLoutname((String) param.get("loutName")); + id.setLoutitemname((String) param.get("loutItemName")); + id.setLoutitemserno((Integer) param.get("loutItemSerno")); + entity.setId(id); + + // 필드 설정 + entity.setLoutitemidname((Integer) param.get("loutItemIDName")); + entity.setParntloutitemidname((Integer) param.get("parntLoutItemIDName")); + entity.setLoutitemdesc((String) param.get("loutItemDesc")); + entity.setLoutitemnodeptrnidname((Integer) param.get("loutItemNodePtrnIDName")); + entity.setLoutitemptrnidname((Integer) param.get("loutItemPtrnIDName")); + entity.setLoutitempathname((String) param.get("loutItemPathName")); + entity.setLoutitemlencnt((Integer) param.get("loutItemLenCnt")); + entity.setLoutitemrefinfo((String) param.get("loutItemRefInfo")); + entity.setLoutitemrefinfo2((String) param.get("loutItemRefInfo2")); + entity.setLoutitemoccurptrndstcd((String) param.get("loutItemOccurPtrnDstcd")); + entity.setLoutitemmaxoccurnoitm((Integer) param.get("loutItemMaxOccurNoitm")); + entity.setLoutitemminoccurnoitm((Integer) param.get("loutItemMinOccurNoitm")); + entity.setLoutitembascval((String) param.get("loutItemBascVal")); + entity.setLoutitemmskyn((String) param.get("loutItemMskYn")); + entity.setLoutitemmasklength((Integer) param.get("loutItemMaskLength")); + entity.setLoutdptcnt((Integer) param.get("lyoutDptCnt")); + entity.setDecptlencnt((Integer) param.get("decptLenCnt")); + entity.setLoutitemrefptrnidname((String) param.get("lyoutItemRefPtrnIDName")); + + layoutItemRepository.save(entity); + return 1; } public int deleteItemAll(HashMap param) { - return this.template.update("Layout.deleteItemAll", param); + String loutName = (String) param.get("loutName"); + return layoutItemRepository.deleteByLoutname(loutName); } public List> selectListAll(HashMap param) { - return this.template.queryForList("Layout.selectListAll", param); + List currentUserBusiness = userBusinessService.getCurrentUserBusinessCodes(); + + List entities = layoutService.getJPAQueryFactory() + .selectFrom(com.eactive.eai.data.entity.onl.transformer.layout.QLayoutEntity.layoutEntity) + .where(com.eactive.eai.data.entity.onl.transformer.layout.QLayoutEntity.layoutEntity.eaibzwkdstcd.in(currentUserBusiness)) + .orderBy(com.eactive.eai.data.entity.onl.transformer.layout.QLayoutEntity.layoutEntity.loutname.asc()) + .fetch(); + + return entities.stream().map(entity -> { + HashMap map = new HashMap<>(); + map.put("LOUTNAME", entity.getLoutname()); + map.put("LOUTDESC", entity.getLoutdesc()); + map.put("LOUTPTRNNAME", entity.getLoutptrnname()); + return map; + }).collect(Collectors.toList()); } public List getLayoutXMLList(HashMap param) { @@ -78,6 +189,19 @@ public class LayoutDao extends SqlMapClientTemplateDao { } public List selectLayout(HashMap params) { - return template.queryForList("Layout.selectLayout", params); + // params에서 검색 조건 추출 + List entities = layoutService.findAll(); + + return entities.stream().map(entity -> { + HashMap map = new HashMap<>(); + map.put("LOUTNAME", entity.getLoutname()); + map.put("LOUTPTRNNAME", entity.getLoutptrnname()); + map.put("LOUTDESC", entity.getLoutdesc()); + map.put("LASTAMNDHMS", entity.getLastamndhms() != null ? entity.getLastamndhms().format(DATETIME_FORMATTER) : null); + map.put("EAIBZWKDSTCD", entity.getEaibzwkdstcd()); + map.put("UAPPLNAME", entity.getUapplname()); + map.put("SYSINTFACNAME", entity.getSysintfacname()); + return map; + }).collect(Collectors.toList()); } } diff --git a/src/main/java/com/eactive/eai/rms/onl/manage/rule/layoutsync/KJBInterfaceDao.java b/src/main/java/com/eactive/eai/rms/onl/manage/rule/layoutsync/KJBInterfaceDao.java new file mode 100644 index 0000000..fd5a1ee --- /dev/null +++ b/src/main/java/com/eactive/eai/rms/onl/manage/rule/layoutsync/KJBInterfaceDao.java @@ -0,0 +1,25 @@ +package com.eactive.eai.rms.onl.manage.rule.layoutsync; + +import java.util.HashMap; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Repository; + +import com.eactive.eai.rms.common.base.SqlMapClientTemplateDao; +import com.eactive.eai.rms.onl.transaction.extnl.InterfaceDao; + +@Repository +class KJBInterfaceDao extends SqlMapClientTemplateDao { + + private static final Logger logger = LoggerFactory.getLogger(InterfaceDao.class); + + public void lazyInsertToIF01(HashMap paramMap) throws Exception { + this.template.insert("Interface.insertToIF01", paramMap); + } + + public HashMap selectDetail(HashMap paramMap) throws Exception { + return (HashMap) template.queryForObject("Interface.selectDetail", paramMap); + } + +} \ No newline at end of file diff --git a/src/main/java/com/eactive/eai/rms/onl/manage/rule/layoutsync/KJBInterfaceService.java b/src/main/java/com/eactive/eai/rms/onl/manage/rule/layoutsync/KJBInterfaceService.java new file mode 100644 index 0000000..c3e3c80 --- /dev/null +++ b/src/main/java/com/eactive/eai/rms/onl/manage/rule/layoutsync/KJBInterfaceService.java @@ -0,0 +1,24 @@ +package com.eactive.eai.rms.onl.manage.rule.layoutsync; + +import java.util.HashMap; + +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import lombok.RequiredArgsConstructor; + +@Service +@Transactional +@RequiredArgsConstructor +class KJBInterfaceService { + + private final KJBInterfaceDao dao; + + public void lazyInsertToIF01(HashMap param) throws Exception { + HashMap detail = dao.selectDetail(param); + if (detail == null) { + dao.lazyInsertToIF01(param); + } + } + +} diff --git a/src/main/java/com/eactive/eai/rms/onl/manage/rule/layoutsync/KJBLayoutDao.java b/src/main/java/com/eactive/eai/rms/onl/manage/rule/layoutsync/KJBLayoutDao.java new file mode 100644 index 0000000..73b2241 --- /dev/null +++ b/src/main/java/com/eactive/eai/rms/onl/manage/rule/layoutsync/KJBLayoutDao.java @@ -0,0 +1,22 @@ +package com.eactive.eai.rms.onl.manage.rule.layoutsync; + +import java.util.HashMap; +import java.util.List; + +import org.springframework.stereotype.Repository; + +import com.eactive.eai.rms.common.base.SqlMapClientTemplateDao; +import com.eactive.eai.rms.data.entity.onl.layout.LayoutService; + +import lombok.RequiredArgsConstructor; + +@Repository +@RequiredArgsConstructor +class KJBLayoutDao extends SqlMapClientTemplateDao { + + private final LayoutService layoutService; + + public List selectItemPathList(HashMap param) throws Exception { + return template.queryForList("Layout.selectItemPathList", param); + } +} diff --git a/src/main/java/com/eactive/eai/rms/onl/manage/rule/layoutsync/KJBTransformService.java b/src/main/java/com/eactive/eai/rms/onl/manage/rule/layoutsync/KJBTransformService.java new file mode 100644 index 0000000..b1df91d --- /dev/null +++ b/src/main/java/com/eactive/eai/rms/onl/manage/rule/layoutsync/KJBTransformService.java @@ -0,0 +1,291 @@ +package com.eactive.eai.rms.onl.manage.rule.layoutsync; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +import org.json.simple.JSONArray; +import org.json.simple.JSONObject; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import com.eactive.eai.rms.onl.manage.rule.transform.TransformDao; +import com.eactive.eai.rms.onl.manage.rule.transform.TransformManService; +import com.eactive.eai.rms.onl.manage.serviceinfo.eaimsg.EaiMsgDao; + +import lombok.RequiredArgsConstructor; + +@Service +@Transactional +@RequiredArgsConstructor +class KJBTransformService { + + private static final Logger logger = LoggerFactory.getLogger(KJBTransformService.class); + + private final TransformDao transformDao; + private final KJBLayoutDao layoutDao; + + // 참고메시지 id 를 얻기 위함. + private final EaiMsgDao eaiMessageDAO; + + TransformManService transformManService; + + public String transactionLayoutToTransform(JSONObject json, String interfaceLayoutName, String serviceLayoutName) + throws Exception { + /* + * 인터페이스가 있는 지 확인 후 없으면 전문레이아웃변환매핑을 신규로 입력 한다. 있을 경우 추후 프로세스에 의해 정보가 업데이트 된다. + */ + + JSONObject message = (JSONObject) json.get("Message"); + JSONObject header = (JSONObject) message.get("Header"); + JSONObject body = (JSONObject) message.get("Body"); + + String interfaceCode = (String) body.get("interfaceCode"); + + String srcLayoutName = null; + String tgtLayoutName = null; + + JSONObject srcLayout = null; + JSONObject tgtLayout = null; + + JSONArray layoutArray = (JSONArray) body.get("Layout"); + + // interfaceCode에 해당하는 Layout 검색 + JSONObject interfaceLayout = (JSONObject) layoutArray.stream() + .filter(j -> interfaceLayoutName.equals(((JSONObject) j).get("id"))).findFirst().get(); + JSONObject serviceLayout = (JSONObject) layoutArray.stream() + .filter(j -> serviceLayoutName.equals(((JSONObject) j).get("id"))).findFirst().get(); + + String cnvsnDesc = (String) body.get("interfaceDesc"); + + String interfaceIdSuffix = null; + String cnvsnType = null; + + if ("I".equals(interfaceLayout.get("ioType")) || ((String) interfaceLayout.get("id")).endsWith("S1")) { + cnvsnType = "REQ"; + } else { + cnvsnType = "RES"; + } + + if ("EAI".equals(interfaceLayout.get("usesystem"))) { + // EAI + if (interfaceCode.startsWith("EA"))// 비동기 + { + interfaceIdSuffix = "REQ".equals(cnvsnType) ? "S1" : "R1"; + } else// 동기 + { + interfaceIdSuffix = "REQ".equals(cnvsnType) ? "S1" : "S1"; + } + + } else if ("FEP".equals(interfaceLayout.get("usesystem"))) { + // FEP + // 당타발 + if (interfaceCode.startsWith("F1")) { + // 타발 + interfaceIdSuffix = "REQ".equals(cnvsnType) ? "S1" : "R2"; + } else if (interfaceCode.startsWith("F2")) { + // 당발 + interfaceIdSuffix = "REQ".equals(cnvsnType) ? "S2" : "R1"; + } + } + + String cnvsnName = String.format("TRANSFORM_%s_%s%s_%s", body.get("bzSystemCode"), interfaceCode, + interfaceIdSuffix, cnvsnType); + + if ("FEP".equals(interfaceLayout.get("usesystem")) || "REQ".equals(cnvsnType)) { + srcLayoutName = interfaceLayoutName; + srcLayout = interfaceLayout; + + tgtLayoutName = serviceLayoutName; + tgtLayout = serviceLayout; + } else { + srcLayoutName = serviceLayoutName; + srcLayout = serviceLayout; + + tgtLayoutName = interfaceLayoutName; + tgtLayout = interfaceLayout; + } + + HashMap params = new HashMap<>(); + params.put("cnvsnName", cnvsnName); + + Map fransformDetail = transformDao.selectDetail(params); + + if (fransformDetail == null) { + insert(interfaceCode, cnvsnName, cnvsnDesc, cnvsnType); + } + + HashMap param = new HashMap(); + param.put("loutName", srcLayoutName); + List> srcDataArray = layoutDao.selectItemPathList(param); + param.put("loutName", tgtLayoutName); + List> tgtDataArray = layoutDao.selectItemPathList(param); + + HashMap[] list = new HashMap[srcDataArray.size()]; + + for (int i = 0; i < srcDataArray.size(); i++) { + String s = (String) ((HashMap) srcDataArray.get(i)).get("PATH"); + String t = (String) ((HashMap) tgtDataArray.get(i)).get("PATH"); + + HashMap m = new HashMap(); + + m.put("CNVSNCMDNAME", s); + m.put("CNVSNRSULTITEMPATHNAME", t); + m.put("CNVSNITEMBASCVAL", ""); + m.put("CNVSNITEMSERNO", i + 1); + + list[i] = m; + } + + transaction(cnvsnName, interfaceCode, cnvsnDesc, srcLayoutName, tgtLayoutName, list, "false", cnvsnType); + + return cnvsnName; + + } + + public void insert(String eaiSvcName, String cnvsnName, String cnvsnDesc, String cnvsnType) { + + HashMap paramMap = new HashMap(); + paramMap.put("eaiSvcName", eaiSvcName); + paramMap.put("cnvsnName", cnvsnName); + paramMap.put("cnvsnType", cnvsnType); + paramMap.put("cnvsnDesc", cnvsnDesc); + paramMap.put("chngEonot", "1");// 0.미사용 1.사용 + // 1.EAI Message에 셋팅 + updateTransfromEaiSvcName(paramMap); + // 2.EAI + transformDao.insert(paramMap); + + } + + public void transaction(String cnvsnName, String eaiSvcName, String cnvsnDesc, String srcLayoutName, + String tgtLayoutName, HashMap[] list, String chkForce, String cnvsnType) throws Exception { + + if (chkForce != null && "true".equals(chkForce)) { + HashMap paramMap = new HashMap(); + paramMap.put("cnvsnName", cnvsnName); + paramMap.put("eaiSvcName", eaiSvcName); + paramMap.put("cnvsnType", cnvsnType); + paramMap.put("chngEonot", "1");// 0.미사용 1.사용 + updateTransfromEaiSvcName(paramMap); + } + + HashMap paramMap = new HashMap(); + // 1.변환 테이블 update + paramMap.put("cnvsnName", cnvsnName); + paramMap.put("cnvsnDesc", cnvsnDesc); + transformDao.updateTransform(paramMap); + // 2.변환 소스/결과 테이블 update + paramMap = new HashMap(); + paramMap.put("cnvsnName", cnvsnName); + transformDao.deleteTransformSourceResult(paramMap); + + // 2-1.SRC 등록 + paramMap.put("loutName", srcLayoutName); + paramMap.put("sourcRsultDstcd", "SRC_LAYOUT"); + transformDao.insertTransformSourceResult(paramMap); + + // 2-2.TGT 등록 + paramMap.put("loutName", tgtLayoutName); + paramMap.put("sourcRsultDstcd", "TGT_LAYOUT"); + transformDao.insertTransformSourceResult(paramMap); + + // 3.변환항목 테이블 update + // ----------------------------------------------------------------------------- + // 임시코드 : 복합거래시 소스레이아웃을 추가로 등록되도록 임시 수정 (2018.06.26) + // ----------------------------------------------------------------------------- + String layoutName = null; + HashMap layoutParamMap = new HashMap(); + layoutParamMap.put("cnvsnName", cnvsnName); + layoutParamMap.put("sourcRsultDstcd", "SRC_LAYOUT"); + + HashMap layoutMap = new HashMap(); + // ----------------------------------------------------------------------------- + + paramMap = new HashMap(); + paramMap.put("cnvsnName", cnvsnName); + transformDao.deleteTransformItem(paramMap); + for (int i = 0; i < list.length; i++) { + paramMap.put("cnvsnCmdName", list[i].get("CNVSNCMDNAME")); + paramMap.put("cnvsnRsultItemPathName", list[i].get("CNVSNRSULTITEMPATHNAME")); + paramMap.put("cnvsnItemBascVal", Objects.toString(list[i].get("CNVSNITEMBASCVAL"), "")); + paramMap.put("cnvsnItemSerno", list[i].get("CNVSNITEMSERNO")); + + transformDao.insertTransformItem(paramMap); + // ----------------------------------------------------------------------------- + // 임시코드 : 복합거래시 소스레이아웃을 추가로 등록되도록 임시 수정 (2018.06.26) + // ----------------------------------------------------------------------------- + logger.debug(">>> Check SRC_LAYOUT layoutName = " + layoutName); + + layoutName = extractLayoutName((String) list[i].get("CNVSNCMDNAME")); + if (layoutName == null || srcLayoutName.equals(layoutName) || layoutMap.get(layoutName) != null) { + // Do nothing + } else { + logger.debug(">>> Added SRC_LAYOUT layoutName = " + layoutName); + layoutParamMap.put("loutName", layoutName); + transformDao.insertTransformSourceResult(layoutParamMap); + layoutMap.put(layoutName, layoutName); + } + // ----------------------------------------------------------------------------- + } + + } + + public void updateTransfromEaiSvcName(HashMap paramMap) { + // String cnvsnType = null; + HashMap map = new HashMap(); + String eaiSvcName = (String) paramMap.get("eaiSvcName"); + map.put("eaiSvcName", eaiSvcName); + map.put("svcPrcssNo", "1"); + + try { + HashMap ifc = eaiMessageDAO.selectDetailSvc(map); + + if ("ASYN".equals((String) ifc.get("PSVINTFACDSTICNAME"))) { + if (!"ERR".equals((String) paramMap.get("cnvsnType"))) { + // cnvsnType = "REQ"; + /** + * 20200521. SYNC-ASYN 처리 추가 + */ + HashMap ifmsg = eaiMessageDAO.selectDetail(map); + String inboundSyncAsync = (String) ifmsg.get("SVCMOTIVUSEDSTCD"); + if ("SYNC".equals(inboundSyncAsync) == false) { + paramMap.put("cnvsnType", "REQ"); + } + } + } + } catch (Exception e) { + logger.error(e.toString(), e); + } + + transformDao.updateTransfromEaiSvcName(paramMap); + } + + private String extractLayoutName(String path) { + String layoutName = null; + int sPos = 0; + int ePos = 0; + if (path == null || path.length() == 0) + return null; + + sPos = path.lastIndexOf("("); + if (sPos < 0) { + sPos = 0; + } else if (sPos > 0) { + sPos = sPos + 1; + } + + ePos = path.indexOf("."); + if (ePos < 0) + sPos = 0; + + if (ePos > 0 && ePos > sPos) { + layoutName = path.substring(sPos, ePos); + layoutName = layoutName.trim(); + } + return layoutName; + } +} diff --git a/src/main/java/com/eactive/eai/rms/onl/manage/rule/layoutsync/Layout-oracle.xml b/src/main/java/com/eactive/eai/rms/onl/manage/rule/layoutsync/Layout-oracle.xml new file mode 100644 index 0000000..3dd8f7a --- /dev/null +++ b/src/main/java/com/eactive/eai/rms/onl/manage/rule/layoutsync/Layout-oracle.xml @@ -0,0 +1,458 @@ + + + + + + + SELECT FA.*, FB.BZWKDSTICNAME + FROM ( + SELECT ROWNO, LOUTNAME , LOUTPTRNNAME , LOUTDESC , + LOUTPTRNDESC , LASTAMNDHMS , EAIBZWKDSTCD , + UAPPLNAME , SYSINTFACNAME + FROM ( + SELECT ROWNUM AS ROWNO, + LOUTNAME, LOUTPTRNNAME, LOUTDESC , + LOUTPTRNDESC , LASTAMNDHMS , EAIBZWKDSTCD , + UAPPLNAME , SYSINTFACNAME + FROM ( + SELECT A.LOUTNAME, A.LOUTPTRNNAME, A.LOUTDESC, B.LOUTPTRNDESC, + A.LASTAMNDHMS , A.EAIBZWKDSTCD , A.UAPPLNAME , A.SYSINTFACNAME + FROM $schemaId$.TSEAITR07 A, $schemaId$.TSEAITR06 B + WHERE A.LOUTPTRNNAME = B.LOUTPTRNNAME + AND A.EAIBZWKDSTCD IN (select EAIBZWKDSTCD from $schemaId$.TSEAIRM06 where userId =#loginId#) + + A.LOUTNAME LIKE UPPER('%'||#searchLoutName#||'%') + + + + A.EAIBZWKDSTCD LIKE UPPER('%'||#searchEaiBzwkDstcd#||'%') + + + + A.LOUTDESC LIKE UPPER('%'||#searchLoutDesc#||'%') + + + ) TMP1 + ) TMP2 WHERE ROWNO BETWEEN #startNum# AND #endNum# + ) FA LEFT OUTER JOIN $schemaId$.TSEAICM01 FB + ON FA.EAIBZWKDSTCD = FB.EAIBZWKDSTCD + ORDER BY 1 + + + + + SELECT COUNT(*) + FROM $schemaId$.TSEAITR07 + WHERE EAIBZWKDSTCD IN (select EAIBZWKDSTCD from $schemaId$.TSEAIRM06 where userId =#loginId#) + + LOUTNAME LIKE UPPER('%'||#searchLoutName#||'%') + + + + EAIBZWKDSTCD LIKE UPPER('%'||#searchEaiBzwkDstcd#||'%') + + + + LOUTDESC LIKE UPPER('%'||#searchLoutDesc#||'%') + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select 0 AS "level" + , LoutItemIDName "id" + , ParntLoutItemIDName "parent" + , 'true' AS "expanded" + , CASE LoutItemNodePtrnIDName WHEN 2203 THEN 'true' ELSE 'false' END "isLeaf" + , LoutItemName LOUTITEMPATH + , LOUTNAME AS LOUTNAME + , LOUTITEMIDNAME AS LOUTITEMIDNAME + , LOUTITEMNAME AS LOUTITEMNAME + , LOUTITEMDESC AS LOUTITEMDESC + , LOUTITEMSERNO AS LOUTITEMSERNO + , LOUTITEMLENCNT AS LOUTITEMLENCNT + , DECPTLENCNT AS DECPTLENCNT + , LOUTITEMNODEPTRNIDNAME AS LOUTITEMNODEPTRNIDNAME + , LOUTITEMPTRNIDNAME AS LOUTITEMPTRNIDNAME + , (CASE LoutItemNodePtrnIDName + WHEN 2201 THEN 'MESSAGE' + WHEN 2202 THEN 'GROUP' + WHEN 2203 THEN 'FIELD' + WHEN 2204 THEN 'ATTR' + ELSE 'UNKNOWN' END) LOUTITEMNODEPTRNIDDESC + , (CASE LoutItemPtrnIDName + WHEN 2100 THEN 'UNKNOWN' + WHEN 2101 THEN 'STRING' + WHEN 2102 THEN 'INT' + WHEN 2103 THEN 'LONG' + WHEN 2104 THEN 'SHORT' + WHEN 2105 THEN 'DOUBLE' + WHEN 2106 THEN 'FLOAT' + WHEN 2107 THEN 'CHAR' + WHEN 2108 THEN 'BYTE' + WHEN 2109 THEN 'DATE' + WHEN 2110 THEN 'TIME' + WHEN 2111 THEN 'TIMESTAMP' + WHEN 2112 THEN 'NUMBER' + WHEN 2113 THEN 'BYTEARRAY' + WHEN 2114 THEN 'NUMERIC' + WHEN 2115 THEN 'PACKDECIMAL' + WHEN 2116 THEN 'OBJECT' + WHEN 2117 THEN 'BOOLEAN' + WHEN 2118 THEN 'BIGDECIMAL' + ELSE 'UNKNOWN' END + )LOUTITEMPTRNIDDESC + , PARNTLOUTITEMIDNAME AS PARNTLOUTITEMIDNAME + , LOUTITEMOCCURPTRNDSTCD AS LOUTITEMOCCURPTRNDSTCD + , LOUTITEMMINOCCURNOITM AS LOUTITEMMINOCCURNOITM + , LOUTITEMMAXOCCURNOITM AS LOUTITEMMAXOCCURNOITM + , LOUTITEMREFINFO2 AS LOUTITEMREFINFO2 + from ( + select * + from $schemaId$.TSEAITR08 + where LoutName = #loutName# + ) T + order by LoutItemSerno + + + + + UPDATE $schemaId$.TSEAITR07 + SET LASTAMNDHMS = to_char(sysdate,'yyyymmddhh24miss') + WHERE LOUTNAME = #loutName# + + + + + SELECT + LOUTNAME LOUTNAME, + LOUTITEMNAME LOUTITEMNAME, + LOUTITEMIDNAME LOUTITEMIDNAME, + PARNTLOUTITEMIDNAME PARNTLOUTITEMIDNAME, + LOUTITEMDESC LOUTITEMDESC, + LOUTITEMNODEPTRNIDNAME LOUTITEMNODEPTRNIDNAME, + LOUTITEMPTRNIDNAME LOUTITEMPTRNIDNAME, + LOUTITEMPATHNAME LOUTITEMPATHNAME, + LOUTITEMLENCNT LOUTITEMLENCNT, + LOUTITEMREFINFO LOUTITEMREFINFO, + LOUTITEMREFINFO2 LOUTITEMREFINFO2, + LOUTITEMSERNO LOUTITEMSERNO, + LOUTITEMOCCURPTRNDSTCD LOUTITEMOCCURPTRNDSTCD, + LOUTITEMMAXOCCURNOITM LOUTITEMMAXOCCURNOITM, + LOUTITEMMINOCCURNOITM LOUTITEMMINOCCURNOITM, + LOUTITEMBASCVAL LOUTITEMBASCVAL, + LOUTITEMMSKYN LOUTITEMMSKYN, + COALESCE(LOUTITEMMASKLENGTH,0) LOUTITEMMASKLENGTH, + LYOUTDPTCNT LYOUTDPTCNT, + DECPTLENCNT DECPTLENCNT, + LYOUTITEMREFPTRNIDNAME LYOUTITEMREFPTRNIDNAME + FROM $schemaId$.TSEAITR08 + WHERE LOUTNAME=#loutName# + AND LOUTITEMNAME =#loutItemName# + AND LOUTITEMSERNO=#loutItemSerno# + ORDER BY LOUTITEMIDNAME, LOUTITEMOCCURPTRNDSTCD DESC + + + + + SELECT + CASE WHEN PARNTLOUTITEMIDNAME = '0' THEN 'FORMAT' + ELSE CASE WHEN LOUTITEMPTRNIDNAME = '2100' THEN 'GRID' + WHEN LOUTITEMPTRNIDNAME = '2113' THEN ( CASE WHEN (SELECT LOUTITEMPTRNIDNAME + FROM $schemaId$.TSEAITR08 L + WHERE L.LOUTNAME = O.LOUTNAME + AND L.LOUTITEMIDNAME = O.PARNTLOUTITEMIDNAME + AND L.LOUTITEMPTRNIDNAME = '2100' + AND (L.LOUTITEMMAXOCCURNOITM = -1 OR L.LOUTITEMMAXOCCURNOITM > 1) + ) = '2100' THEN 'COLUMN' ELSE 'FLD' END ) + END AS FIELDTYPE + , LOUTITEMNAME AS ID + , LOUTITEMDESC AS DESC + ,CASE WHEN LYOUTITEMREFPTRNIDNAME = 'STRING' THEN 'CHAR' + LYOUTITEMREFPTRNIDNAME = 'BYTEARRAY' THEN 'CHAR' + LYOUTITEMREFPTRNIDNAME = 'INTEGER' THEN 'DECIMAL' + LYOUTITEMREFPTRNIDNAME = 'BIGDECIMAL' THEN 'NUMERIC' + ELSE 'CHAR' + END AS TYPE + , LOUTITEMLENCNT AS LEN + , DECPTLENCNT AS SCALE + , (CASE WHEN LOUTITEMPTRNIDNAME = '2100' AND PARNTLOUTITEMIDNAME !=0 AND TRIM(LOUTITEMREFINFO2) IS NOT NULL THEN LOUTITEMREFINFO2 + WHEN LOUTITEMPTRNIDNAME = '2100' AND PARNTLOUTITEMIDNAME !=0 AND TRIM(LOUTITEMREFINFO2) IS NULL THEN TO_CHAR(LOUTITEMMAXOCCURNOITM) + ELSE ' ' END) AS COUNT + FROM ( + SELECT * + FROM $schemaId$.TSEAITR08 + WHERE LOUTNAME = #LoutName# + ) O + WHERE (LOUTITEMPTRNIDNAME = '2100' AND (LOUTITEMMAXOCCURNOITM = -1 OR LOUTITEMMAXOCCURNOITM > 1) ) OR (LOUTITEMPTRNIDNAME = '2113' ) OR (PARNTLOUTITEMIDNAME = 0) + CONNECT BY PRIOR LOUTITEMIDNAME = PARNTLOUTITEMIDNAME + START WITH PARNTLOUTITEMIDNAME = '0' + + + + + SELECT ID "id", + LOUTDESC "desc", '$schemaId$' "usesystem", + TARGETSYSTEM "targetsystem", TRIM(PSVSYSBZWKDSTCD) "group", IOTYPE "ioType", + HEADER_TXID "servicecode", A.EAISVCNAME "interfacecode" + FROM ( + SELECT LOUTNAME ID, CASE WHEN SOURCRSULTDSTCD = 'SRC_LAYOUT' THEN 'I' ELSE 'O' END IOTYPE + ,CASE WHEN PSVINTFACDSTICNAME = 'SYNC' AND SOURCRSULTDSTCD = 'SRC_LAYOUT' THEN '기동' + WHEN PSVINTFACDSTICNAME = 'SYNC' AND SOURCRSULTDSTCD = 'TGT_LAYOUT' THEN '수동' + WHEN EAISVCNAME LIKE '%1' AND SOURCRSULTDSTCD = 'TGT_LAYOUT' THEN 'CBS' + WHEN EAISVCNAME LIKE '%2' AND SOURCRSULTDSTCD = 'SRC_LAYOUT' THEN 'CBS' + ELSE '대외' END TARGETSYSTEM + ,EAISVCNAME, PSVSYSBZWKDSTCD + FROM $schemaId$.TSEAITR02 A JOIN $schemaId$.TSEAIHE02 B ON A.CNVSNNAME = B.CHNGMSGIDNAME + WHERE B.EAISVCNAME = #eaiSvcName# UNION + SELECT LOUTNAME ID, CASE WHEN SOURCRSULTDSTCD = 'SRC_LAYOUT' THEN 'I' ELSE 'O' END IOTYPE + ,CASE WHEN PSVINTFACDSTICNAME = 'SYNC' AND SOURCRSULTDSTCD = 'SRC_LAYOUT' THEN '수동' + WHEN PSVINTFACDSTICNAME = 'SYNC' AND SOURCRSULTDSTCD = 'TGT_LAYOUT' THEN '기동' + WHEN EAISVCNAME LIKE '%1' AND SOURCRSULTDSTCD = 'TGT_LAYOUT' THEN 'CBS' + WHEN EAISVCNAME LIKE '%2' AND SOURCRSULTDSTCD = 'SRC_LAYOUT' THEN 'CBS' + ELSE '대외' END TARGETSYSTEM + ,EAISVCNAME, PSVSYSBZWKDSTCD + FROM $schemaId$.TSEAITR02 A JOIN $schemaId$.TSEAIHE02 B ON A.CNVSNNAME = B.BASCRSPNSCHNGMSGIDNAME + WHERE B.EAISVCNAME = #eaiSvcName# UNION + SELECT LOUTNAME ID, CASE WHEN SOURCRSULTDSTCD = 'SRC_LAYOUT' THEN 'IE' ELSE 'OE' END IOTYPE + ,CASE WHEN PSVINTFACDSTICNAME = 'SYNC' AND SOURCRSULTDSTCD = 'SRC_LAYOUT' THEN '수동' + WHEN PSVINTFACDSTICNAME = 'SYNC' AND SOURCRSULTDSTCD = 'TGT_LAYOUT' THEN '기동' + WHEN EAISVCNAME LIKE '%1' AND SOURCRSULTDSTCD = 'TGT_LAYOUT' THEN 'CBS' + WHEN EAISVCNAME LIKE '%2' AND SOURCRSULTDSTCD = 'SRC_LAYOUT' THEN 'CBS' + ELSE '대외' END TARGETSYSTEM + ,EAISVCNAME, PSVSYSBZWKDSTCD + FROM $schemaId$.TSEAITR02 A JOIN $schemaId$.TSEAIHE02 B ON A.CNVSNNAME = B.ERRRSPNSCHNGMSGIDNAME + WHERE B.EAISVCNAME = #eaiSvcName# UNION + SELECT REFMSGIDNAME ID, CASE WHEN REFMSGIDNO = 1 THEN 'I' ELSE 'O' END IOTYPE + ,CASE WHEN PSVINTFACDSTICNAME = 'SYNC' AND REFMSGIDNO = 1 THEN '기동' + WHEN PSVINTFACDSTICNAME = 'SYNC' AND REFMSGIDNO = 2 THEN '수동' + WHEN PSVINTFACDSTICNAME = 'SYNC' AND REFMSGIDNO = 3 THEN '수동' + WHEN REFMSGIDNAME LIKE '%CBS' THEN 'CBS' + ELSE '대외' END TARGETSYSTEM + ,A.EAISVCNAME, PSVSYSBZWKDSTCD FROM $schemaId$.TSEAIMS02 A JOIN $schemaId$.TSEAIHE02 B ON A.EAISVCNAME = B.EAISVCNAME + WHERE B.EAISVCNAME = #eaiSvcName# + ) A + LEFT OUTER JOIN ( SELECT EAISVCNAME + , max(decode(COLUMNNAME,'HEADER_TXID',COLUMNVALUE,'')) HEADER_TXID + FROM $schemaId$.TSEAIHS04 hs04 , $schemaId$.tseaihs05 hs05 + where hs04.BZWKSVCKEYNAME =hs05.BZWKSVCKEYNAME + group by hs04.BZWKSVCKEYNAME,EAISVCNAME + ) HS04 ON A.EAISVCNAME = HS04.EAISVCNAME + LEFT OUTER JOIN $schemaId$.TSEAITR07 TR07 ON TR07.LOUTNAME = A.ID + ORDER BY 1 + + + + + SELECT SUBSTR(SYS_CONNECT_BY_PATH(LOUTITEMNAME, '.'),2) PATH + FROM ( + SELECT decode(LYOUTITEMREFPTRNIDNAME, NULL, decode(LOUTITEMIDNAME, 1000, LOUTITEMNAME, LOUTITEMNAME||'[*]'), LOUTITEMNAME) LOUTITEMNAME, LOUTITEMIDNAME, LYOUTDPTCNT, nvl(LYOUTITEMREFPTRNIDNAME,'Group') LYOUTITEMREFPTRNIDNAME, PARNTLOUTITEMIDNAME PARENT + FROM tseaitr08 a + WHERE loutname = #loutName# + ORDER BY LOUTITEMIDNAME + ) + WHERE LYOUTITEMREFPTRNIDNAME != 'Group' + START WITH LOUTITEMIDNAME = 1000 CONNECT BY PRIOR LOUTITEMIDNAME = PARENT + + + + + SELECT FA.*, FB.BZWKDSTICNAME + FROM ( + SELECT ROWNO, LOUTNAME , LOUTPTRNNAME , LOUTDESC , + LOUTPTRNDESC , LASTAMNDHMS , EAIBZWKDSTCD , + UAPPLNAME , SYSINTFACNAME + FROM ( + SELECT ROWNUM AS ROWNO, + LOUTNAME, LOUTPTRNNAME, LOUTDESC , + LOUTPTRNDESC , LASTAMNDHMS , EAIBZWKDSTCD , + UAPPLNAME , SYSINTFACNAME + FROM ( + SELECT A.LOUTNAME, A.LOUTPTRNNAME, A.LOUTDESC, B.LOUTPTRNDESC, + A.LASTAMNDHMS , A.EAIBZWKDSTCD , A.UAPPLNAME , A.SYSINTFACNAME + FROM $schemaId$.TSEAITR07 A, $schemaId$.TSEAITR06 B + WHERE A.LOUTPTRNNAME = B.LOUTPTRNNAME + + UPPER(A.LOUTNAME) LIKE UPPER('%'||#searchLoutName#||'%') + + + + UPPER(A.EAIBZWKDSTCD) LIKE UPPER('%'||#searchEaiBzwkDstcd#||'%') + + + + UPPER(A.LOUTDESC) LIKE UPPER('%'||#searchLoutDesc#||'%') + + + ) TMP1 + ) TMP2 WHERE ROWNO BETWEEN #startNum# AND #endNum# + ) FA LEFT OUTER JOIN $schemaId$.TSEAICM01 FB + ON FA.EAIBZWKDSTCD = FB.EAIBZWKDSTCD + ORDER BY 1 + + + + + SELECT COUNT(*) + FROM $schemaId$.TSEAITR07 + + + UPPER(LOUTNAME) LIKE UPPER('%'||#searchLoutName#||'%') + + + + UPPER(EAIBZWKDSTCD) LIKE UPPER('%'||#searchEaiBzwkDstcd#||'%') + + + + UPPER(LOUTDESC) LIKE UPPER('%'||#searchLoutDesc#||'%') + + + + + + INSERT INTO $schemaId$.TSEAITR09 + ( LOGPRCSSSERNO, EXECUTEDATE ,EXECUTECLASS,EXECUTEMETHOD,EXECUTEUSER,SENDXMLCMNT,SENDAMNDHMS ) + VALUES + ( #logPrcssSerno#, TO_CHAR(CURRENT_DATE,'YYYYMMDD') ,#executeClass#,#executeMethod#,#executeUser#,#sendXmlCmnt#, + TO_CHAR(CURRENT_TIMESTAMP,'YYYYMMDDHH24MISSFF2') ) + + + + UPDATE $schemaId$.TSEAITR09 + SET RECVAMNDHMS=TO_CHAR(CURRENT_TIMESTAMP,'YYYYMMDDHH24MISSFF2'), + RECVRSLT=#recvRslt#, + RECVFAILCMNT=#recvFailCmnt# + WHERE LOGPRCSSSERNO = #logPrcssSerno# + + + + DELETE FROM $schemaId$.TSEAITR08 + WHERE LOUTNAME=#loutName# + AND LOUTITEMNAME =#loutItemName# + AND LOUTITEMSERNO=#loutItemSerno# + + + + + + INSERT INTO $schemaId$.TSEAITR08 ( + LOUTNAME, LOUTITEMNAME, LOUTITEMIDNAME, PARNTLOUTITEMIDNAME, LOUTITEMDESC, LOUTITEMNODEPTRNIDNAME, + LOUTITEMPTRNIDNAME, LOUTITEMPATHNAME, LOUTITEMLENCNT, LOUTITEMREFINFO, LOUTITEMREFINFO2, + LOUTITEMSERNO, LOUTITEMOCCURPTRNDSTCD, LOUTITEMMAXOCCURNOITM, LOUTITEMMINOCCURNOITM, + LOUTITEMBASCVAL, LOUTITEMMSKYN, LOUTITEMMASKLENGTH, LYOUTDPTCNT, DECPTLENCNT, LYOUTITEMREFPTRNIDNAME + ) VALUES ( + #loutName#, #loutItemName#, #loutItemIDName#, #parntLoutItemIDName#, #loutItemDesc#, #loutItemNodePtrnIDName#, + #loutItemPtrnIDName#, #loutItemPathName#, #loutItemLenCnt#, #loutItemRefInfo#, #loutItemRefInfo2#, + #loutItemSerno#, #loutItemOccurPtrnDstcd#, #loutItemMaxOccurNoitm#, #loutItemMinOccurNoitm#, + #loutItemBascVal#, #loutItemMskYn#, #loutItemMaskLength#, #lyoutDptCnt#, #decptLenCnt#, #lyoutItemRefPtrnIDName# + ) + + + + + UPDATE $schemaId$.TSEAITR08 + SET + LOUTNAME = #loutName#, + LOUTITEMNAME = #loutItemName#, + LOUTITEMIDNAME = #loutItemIDName#, + PARNTLOUTITEMIDNAME = #parntLoutItemIDName#, + LOUTITEMDESC = #loutItemDesc#, + LOUTITEMNODEPTRNIDNAME = #loutItemNodePtrnIDName#, + LOUTITEMPTRNIDNAME = #loutItemPtrnIDName#, + LOUTITEMPATHNAME = #loutItemPathName#, + LOUTITEMLENCNT = #loutItemLenCnt#, + LOUTITEMREFINFO = #loutItemRefInfo#, + LOUTITEMREFINFO2 = #loutItemRefInfo2#, + LOUTITEMSERNO = #loutItemSerno#, + LOUTITEMOCCURPTRNDSTCD = #loutItemOccurPtrnDstcd#, + LOUTITEMMAXOCCURNOITM = #loutItemMaxOccurNoitm#, + LOUTITEMMINOCCURNOITM = #loutItemMinOccurNoitm#, + LOUTITEMBASCVAL = #loutItemBascVal#, + LOUTITEMMSKYN = #loutItemMskYn#, + LOUTITEMMASKLENGTH = #loutItemMaskLength#, + LYOUTDPTCNT = #lyoutDptCnt#, + DECPTLENCNT = #decptLenCnt#, + LYOUTITEMREFPTRNIDNAME = #lyoutItemRefPtrnIDName# + WHERE LOUTNAME = #loutName# + AND LOUTITEMNAME =#loutItemName# + AND LOUTITEMSERNO =#loutItemSerno# + + + + INSERT INTO $schemaId$.TSEAITR08 ( LOUTNAME, LOUTITEMNAME, LOUTITEMSERNO, LOUTITEMIDNAME, PARNTLOUTITEMIDNAME, + LOUTITEMDESC, LOUTITEMNODEPTRNIDNAME, LOUTITEMPTRNIDNAME, LOUTITEMPATHNAME, LOUTITEMLENCNT, + LOUTITEMREFINFO, LOUTITEMREFINFO2, LOUTITEMOCCURPTRNDSTCD, LOUTITEMMAXOCCURNOITM, LOUTITEMMINOCCURNOITM, + LOUTITEMBASCVAL, LOUTITEMMSKYN, LYOUTDPTCNT, DECPTLENCNT, LYOUTITEMREFPTRNIDNAME ) + VALUES ( #loutName#, #loutItemName#, #loutItemSerno#, #loutItemIDName#, #parntLoutItemIDName#, + #loutItemDesc#, #loutItemNodePtrnIDName#, #loutItemPtrnIDName#, #loutItemPathName#, #loutItemLenCnt#, + #loutItemRefInfo#, #loutItemRefInfo2#, #loutItemOccurPtrnDstcd#, #loutItemMaxOccurNoitm#, #loutItemMinOccurNoitm#, + #loutItemBascVal#, #loutItemMskYn#, #lyoutDptCnt#, #decptLenCnt#, #lyoutItemRefPtrnIDName# ) + + + + + INSERT INTO $schemaId$.TSEAITR10 + ( LOGPRCSSSEQNO, SEQNO, SERVICENAME ,COMMAND,LOUTNAME,RECVDATA,RECVAMNDHMS,PRCSSRSLT, PRCSSRSLTCMNT ) + VALUES + ( #logPrcssSeqno#, #seqno#, #serviceName# ,#command#,#loutName#,#recvData#,#recvAmndHMS#,#prcssRslt#, #prcssRsltCmnt# ) + + diff --git a/src/main/java/com/eactive/eai/rms/onl/manage/rule/layoutsync/Layout.xml b/src/main/java/com/eactive/eai/rms/onl/manage/rule/layoutsync/Layout.xml new file mode 100644 index 0000000..de6d0c7 --- /dev/null +++ b/src/main/java/com/eactive/eai/rms/onl/manage/rule/layoutsync/Layout.xml @@ -0,0 +1,160 @@ + + + + + + + SELECT + LOUTNAME AS "LOUTNAME" , + LOUTPTRNNAME AS "LOUTPTRNNAME" , + LOUTDESC AS "LOUTDESC" , + LASTAMNDHMS AS "LASTAMNDHMS" , + EAIBZWKDSTCD AS "EAIBZWKDSTCD" , + UAPPLNAME AS "UAPPLNAME" , + SYSINTFACNAME AS "SYSINTFACNAME" + FROM $schemaId$.TSEAITR07 + WHERE LOUTNAME = #loutName# + + + + + DELETE FROM $schemaId$.TSEAITR07 + WHERE LOUTNAME = #loutName# + + + + + INSERT INTO $schemaId$.TSEAITR07 ( + LOUTNAME, LOUTDESC, LOUTPTRNNAME , LASTAMNDHMS , EAIBZWKDSTCD , UAPPLNAME , SYSINTFACNAME, CREATEBY, UPDATEBY + ) VALUES (#loutName#, #loutDesc#, #loutPtrnName#, #lastAmndHMS# , #eaiBzwkDstcd# , #uapplName# , #sysIntfacName#, #createBy#, #updateBy# ) + + + + + UPDATE $schemaId$.TSEAITR07 + SET LOUTDESC = #loutDesc#, + LOUTPTRNNAME= #loutPtrnName#, + LASTAMNDHMS = #lastAmndHMS#, + EAIBZWKDSTCD = #eaiBzwkDstcd#, + UAPPLNAME = #uapplName#, + SYSINTFACNAME = #sysIntfacName# , + UPDATEBY = #updateBy# + WHERE LOUTNAME = #loutName# + + + + + SELECT + L.LOUTNAME AS "LOUTNAME", + L.LOUTDESC AS "LOUTDESC", + L.LOUTPTRNNAME AS "LOUTPTRNNAME" + FROM $schemaId$.TSEAITR07 L + WHERE L.EAIBZWKDSTCD IN (select EAIBZWKDSTCD from $schemaId$.TSEAIRM06 WHERE USERID = #loginId#) + ORDER BY L.LOUTNAME + + + + + DELETE FROM $schemaId$.TSEAITR08 + WHERE LOUTNAME=#loutName# + + + + UPDATE $schemaId$.TSEAITR08 + SET LOUTITEMDESC = #loutDesc# + WHERE LOUTNAME = #loutName# + AND LOUTITEMNAME = #loutName# + AND LOUTITEMSERNO = 0 + + + + SELECT LOUTPTRNNAME AS "LOUTPTRNNAME", + LOUTPTRNDESC AS "LOUTPTRNDESC" + FROM $schemaId$.TSEAITR06 + ORDER BY LOUTPTRNDESC + + + + SELECT SV.EAISVCNAME AS "EAISVCNAME" , SV.EAISVCDESC AS "EAISVCDESC" , + TR.CNVSNNAME AS "CNVSNNAME" , TR.CNVSNDESC AS "CNVSNDESC" , TR.SOURCRSULTDSTCD AS "SOURCRSULTDSTCD" + FROM + ( SELECT T1.CNVSNNAME , T1.CNVSNDESC , + T2.LOUTNAME , T2.SOURCRSULTDSTCD + FROM $schemaId$.TSEAITR01 T1, $schemaId$.TSEAITR02 T2 + WHERE T1.CNVSNNAME = T2.CNVSNNAME + AND T2.LOUTNAME = #loutName# + ) TR, + ( + SELECT DISTINCT EAISVCNAME, EAISVCDESC, SVCPRCSSNO, CHNGMSGIDNAME FROM ( + SELECT A.EAISVCNAME, A.EAISVCDESC, B.SVCPRCSSNO, B.CHNGMSGIDNAME FROM $schemaId$.TSEAIHE01 A, $schemaId$.TSEAIHE02 B WHERE A.EAISVCNAME = B.EAISVCNAME + UNION ALL + SELECT A.EAISVCNAME, A.EAISVCDESC, B.SVCPRCSSNO, B.BASCRSPNSCHNGMSGIDNAME CHNGMSGIDNAME FROM $schemaId$.TSEAIHE01 A, $schemaId$.TSEAIHE02 B WHERE A.EAISVCNAME = B.EAISVCNAME + UNION ALL + SELECT A.EAISVCNAME, A.EAISVCDESC, B.SVCPRCSSNO, B.ERRRSPNSCHNGMSGIDNAME CHNGMSGIDNAME FROM $schemaId$.TSEAIHE01 A, $schemaId$.TSEAIHE02 B WHERE A.EAISVCNAME = B.EAISVCNAME + ) TMP + ) SV + WHERE TR.CNVSNNAME = SV.CHNGMSGIDNAME + + + + SELECT EAIBZWKDSTCD "EAIBzwkDstcd", COUNT(LOUTNAME) "Cnt" + FROM $schemaId$.TSEAITR07 + GROUP BY EAIBZWKDSTCD + + + + + SELECT + LOUTNAME AS "LOUTNAME" , + LOUTPTRNNAME AS "LOUTPTRNNAME" , + LOUTDESC AS "LOUTDESC" , + LASTAMNDHMS AS "LASTAMNDHMS" , + EAIBZWKDSTCD AS "EAIBZWKDSTCD" , + UAPPLNAME AS "UAPPLNAME" , + SYSINTFACNAME AS "SYSINTFACNAME" + FROM $schemaId$.TSEAITR07 + WHERE LOUTNAME = #loutName# + + + + DELETE FROM $schemaId$.TSEAITR07 + WHERE LOUTNAME = #loutName# + + + + INSERT INTO $schemaId$.TSEAITR07 ( LOUTNAME, LOUTPTRNNAME, LOUTDESC, LASTAMNDHMS, EAIBZWKDSTCD, UAPPLNAME, SYSINTFACNAME ) + VALUES ( #loutName#, #loutPtrnName#, #loutDesc#, #lastAmndHMS#, #eaiBzwkDstcd#, #uapplName#, #sysIntfacName# ) + + + + SELECT + LOUTNAME AS "LOUTNAME" , + LOUTITEMNAME AS "LOUTITEMNAME" , + LOUTITEMSERNO AS "LOUTITEMSERNO" , + LOUTITEMIDNAME AS "LOUTITEMIDNAME" , + PARNTLOUTITEMIDNAME AS "PARNTLOUTITEMIDNAME" , + LOUTITEMDESC AS "LOUTITEMDESC" , + LOUTITEMNODEPTRNIDNAME AS "LOUTITEMNODEPTRNIDNAME" , + LOUTITEMPTRNIDNAME AS "LOUTITEMPTRNIDNAME" , + LOUTITEMPATHNAME AS "LOUTITEMPATHNAME" , + LOUTITEMLENCNT AS "LOUTITEMLENCNT" , + LOUTITEMREFINFO AS "LOUTITEMREFINFO" , + LOUTITEMREFINFO2 AS "LOUTITEMREFINFO2" , + LOUTITEMOCCURPTRNDSTCD AS "LOUTITEMOCCURPTRNDSTCD" , + LOUTITEMMAXOCCURNOITM AS "LOUTITEMMAXOCCURNOITM" , + LOUTITEMMINOCCURNOITM AS "LOUTITEMMINOCCURNOITM" , + LOUTITEMBASCVAL AS "LOUTITEMBASCVAL" , + LOUTITEMMSKYN AS "LOUTITEMMSKYN" , + LYOUTDPTCNT AS "LYOUTDPTCNT" , + DECPTLENCNT AS "DECPTLENCNT" , + LYOUTITEMREFPTRNIDNAME AS "LYOUTITEMREFPTRNIDNAME" + FROM $schemaId$.TSEAITR08 + WHERE LOUTNAME = #loutName# + + + + DELETE FROM $schemaId$.TSEAITR08 + WHERE LOUTNAME = #loutName# + + + diff --git a/src/main/java/com/eactive/eai/rms/onl/manage/rule/layoutsync/LayoutSyncController.java b/src/main/java/com/eactive/eai/rms/onl/manage/rule/layoutsync/LayoutSyncController.java index fc28118..5728e7f 100644 --- a/src/main/java/com/eactive/eai/rms/onl/manage/rule/layoutsync/LayoutSyncController.java +++ b/src/main/java/com/eactive/eai/rms/onl/manage/rule/layoutsync/LayoutSyncController.java @@ -2,9 +2,10 @@ package com.eactive.eai.rms.onl.manage.rule.layoutsync; import java.io.ByteArrayInputStream; import java.io.File; -import java.io.InputStream; +import java.io.InputStreamReader; import java.io.Reader; import java.io.StringReader; +import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.HashMap; @@ -21,10 +22,14 @@ import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; -import org.apache.log4j.Logger; import org.jdom.Document; import org.jdom.Element; import org.jdom.input.SAXBuilder; +import org.json.simple.JSONArray; +import org.json.simple.JSONObject; +import org.json.simple.JSONValue; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Controller; @@ -50,18 +55,28 @@ import com.eactive.eai.rms.onl.common.util.DateUtil; import com.eactive.eai.transformer.layout.Item; import com.eactive.eai.transformer.layout.Types; + @Controller @RequestMapping("/layoutSync.do") public class LayoutSyncController extends OnlBaseAnnotationController implements InterceptorSkipController { - private static final Logger logger = Logger.getLogger(LayoutSyncController.class); + private static final Logger logger = LoggerFactory.getLogger(LayoutSyncController.class); @Autowired @Qualifier("layoutSyncService") private LayoutSyncService service; @Autowired + @Qualifier("monitoringContext") private MonitoringContext monitoringContext; + + @Autowired + private KJBTransformService transformService; + + @Autowired + private KJBInterfaceService interfaceService; + + /** * xml 형식으로 전달 된 레이아웃을 LayoutVo로 전환 * @@ -92,8 +107,6 @@ public class LayoutSyncController extends OnlBaseAnnotationController implements node = Item.NODE_GROUP; } else if("GRID".equals(el.getName().toUpperCase())) { node = Item.NODE_GROUP; - } else if("ATTR".equals(el.getName().toUpperCase())) { - node = Item.NODE_ATTR; } else { node = Item.NODE_FIELD; } @@ -101,20 +114,19 @@ public class LayoutSyncController extends OnlBaseAnnotationController implements item.put("loutItemNodePtrnIDName",node); int loutType = Types.TYPE_UNKNOWN; - if( el.getAttributeValue("type") == null || "".equals(el.getAttributeValue("type"))) { - } else if( "GRID".equals(el.getName().toUpperCase()) || "GROUP".equals(el.getName().toUpperCase()) ) { - } else if( msgType.equals("XML") ) { + if( el.getAttributeValue("type") == null || "".equals(el.getAttributeValue("type"))) { + } else if( "GRID".equals(el.getName().toUpperCase()) || "GROUP".equals(el.getName().toUpperCase()) ) { + } else if( msgType.equals("XML") || msgType.equals("JSON") ) { loutType = "VARCHAR".startsWith(el.getAttributeValue("type").toUpperCase()) ? Types.TYPE_STRING : Types.TYPE_INT; // TYPE_LONG, TYPE_SHORT, TYPE_DOUBLE, TYPE_FLOAT - //loutType = Types.TYPE_STRING; } else { loutType = Types.TYPE_BYTEARRAY; } - item.put("loutItemPtrnIDName",loutType); - item.put("loutItemLenCnt","".equals(el.getAttributeValue("len")) ? 0 : Integer.parseInt(el.getAttributeValue("len"))); - item.put("loutItemRefInfo2",el.getAttributeValue("count")); // - + item.put("loutItemPtrnIDName", loutType); + item.put("loutItemLenCnt", + "".equals(el.getAttributeValue("len")) ? 0 : Integer.parseInt(el.getAttributeValue("len"))); + item.put("loutItemRefInfo2", el.getAttributeValue("count")); // MIN, MAX 설정 // 통합인터페이스는 * , 숫자만 보냄 ( 가변은 * 고정은 숫자 ) @@ -158,7 +170,10 @@ public class LayoutSyncController extends OnlBaseAnnotationController implements item.put("loutItemMinOccurNoitm",min); // 레이아웃항목최소발생건수 item.put("loutItemBascVal",el.getAttributeValue("default")); // 레이아웃항목기본값 - item.put("loutItemMskYn",el.getAttributeValue("mask")); // [Y/N/ ] + item.put("louItemMskYn",el.getAttributeValue("mask")); // [Y/N/ ] + item.put("louItemMskCode",el.getAttributeValue("mask2")); + //item.put("loutItemMskTarget",el.getAttributeValue("maskTarget")); // [LOG/DATA ] + if( "Y".equals(item.get("loutItemMskYn")) ) item.put("loutItemMaskLength",Integer.parseInt(el.getAttributeValue("maskLength"))); item.put("lyoutDptCnt",Integer.parseInt(el.getAttributeValue("depth")) + 1 ); // 통합인터페이스 전달되는 Depth + 1을 해야 함 item.put("decptLenCnt","".equals(el.getAttributeValue("scale")) ? 0 : Integer.parseInt(el.getAttributeValue("scale"))); // 소수점길이 META에서 "" 이면 "" 으로 표현함 @@ -166,7 +181,7 @@ public class LayoutSyncController extends OnlBaseAnnotationController implements String dataType = ""; - if( el.getAttributeValue("type") == null || "".equals(el.getAttributeValue("type"))) { + if( el.getAttributeValue("type") == null || "".equals(el.getAttributeValue("type"))) { } else if( "VARCHAR".startsWith(el.getAttributeValue("type").toUpperCase()) ) { // Varchar, Number dataType = "String"; } else if( "NUMBER".startsWith(el.getAttributeValue("type").toUpperCase()) ) { // Varchar, Number @@ -183,6 +198,194 @@ public class LayoutSyncController extends OnlBaseAnnotationController implements return list; } + // JJB 수정사항 shkim 2020-05-13 JSON 타입 추가 + /** + * json 형식으로 전달 된 레이아웃을 LayoutVo로 전환 + * + * @param e + * @param msgType + * @param loutName + * @return + * @throws Exception + */ + private List> setLayoutItemsJSN(JSONArray items, String msgType, String loutName, String parentNo) throws Exception { + List> list = new ArrayList>(); + + for(Object i : items) { + // Layout Item Format (TR08) + HashMap item = new HashMap(); + + String type = (String) ((JSONObject) i).keySet().iterator().next(); + + JSONObject _i = (JSONObject) ((JSONObject) i).get(type); + + item.put("loutName",loutName); + item.put("loutItemName",_i.get("id")); + item.put("loutItemSerno", Integer.parseInt((String) _i.get("no")) ); + item.put("loutItemIDName",Integer.parseInt((String) _i.get("no")) + 1000); + String no = parentNo; + item.put("parntLoutItemIDName",Integer.parseInt( no == null ? "0":no ) + 1000 ); + item.put("loutItemDesc",_i.get("desc")); + type = type.toUpperCase(); + int node = 0; + if( "GROUP".equals(type) ) { + node = Item.NODE_GROUP; + } else if("GRID".equals(type)) { + node = Item.NODE_GROUP; + } else { + node = Item.NODE_FIELD; + } + + item.put("loutItemNodePtrnIDName",node); + + int loutType = Types.TYPE_UNKNOWN; + if( _i.get("type") == null || "".equals(_i.get("type"))) + { + } else if( "GRID".equals(type) || "GROUP".equals(type) ) + { + } else if( msgType.equals("XML") ) + { + loutType = "VARCHAR".startsWith(((String) _i.get("type")).toUpperCase()) ? Types.TYPE_STRING : Types.TYPE_INT; // TYPE_LONG, TYPE_SHORT, TYPE_DOUBLE, TYPE_FLOAT + + //loutType = Types.TYPE_STRING; + } + else if ( msgType.equals("JSON") ) + { + String type2 = ((String) _i.get("type")).toUpperCase(); + + switch(type2) + { + case "VARCHAR": + loutType = Types.TYPE_STRING; + break; + // JJB 수정사항 shkim 2020-08-19 숫자형 실수부 처리 문제로 BigDecimal로 처리 + case "NUMBER": +// loutType = Types.TYPE_INT; +// break; + case "BIGDECIMAL": + loutType = Types.TYPE_BIGDECIMAL; + break; + } + //loutType = type2.equals("VARCHAR") ? Types.TYPE_STRING : Types.TYPE_INT; // TYPE_LONG, TYPE_SHORT, TYPE_DOUBLE, TYPE_FLOAT + + }else if ( msgType.equals("FML32") ) + { + String fmlType = ((String) _i.get("id")).toUpperCase().replaceAll("[\\d]", ""); + + switch(fmlType) + { + case "LONG": + loutType = Types.TYPE_LONG; + break; + case "SHORT": + loutType = Types.TYPE_SHORT; + break; + case "DOUBLE": + loutType = Types.TYPE_DOUBLE; + break; + default: + loutType = Types.TYPE_STRING; + break; + + } + item.put("loutItemPathName", _i.get("id")); + } + else { + loutType = Types.TYPE_BYTEARRAY; + } + + + + item.put("loutItemPtrnIDName",loutType); + item.put("loutItemLenCnt","".equals(_i.get("len")) ? 0 : Integer.parseInt((String) _i.get("len"))); + + + + // MIN, MAX 설정 + // 통합인터페이스는 * , 숫자만 보냄 ( 가변은 * 고정은 숫자 ) + String occurNoitm = (String) _i.get("maxCnt"); + + + int max = 0; + int min = 0; + if( String.valueOf(Item.OCC_MULTI_OR_NONE).equals(occurNoitm) ) { // * + max = -1; + item.put("loutItemRefInfo2",_i.get("count")); + } else if ( String.valueOf(Item.OCC_ONCE_OR_NONE).equals(occurNoitm) ) { // ? + max = 1; + } else if ( String.valueOf(Item.OCC_MULTI_OR_ONCE).equals(occurNoitm) ) { // + + min = 1; + max = -1; + } else if ( "".equals(occurNoitm) ) { // "" + min = 1; + max = 1; + } else if ( occurNoitm.matches("[0-9]+") ) { // "" + min = Integer.parseInt(occurNoitm); + max = Integer.parseInt(occurNoitm); + } + + // 반복횟수 참조정보가 없는데 MIN, MAX 값이 설정되지 않은 경우 오류 + if( max == 0 && min == 0 ) { + if("GRID".equals(type) ) { + if ( !StringUtils.isEmpty((String) _i.get("count")) ) { + } else { + throw new Exception("반복횟수 참조정보 오류"); + } + } else { + min = 1; + max = 1; + } + } + + if( "0".equals(occurNoitm) ) { + occurNoitm = ""; + } + + item.put("loutItemOccurPtrnDstcd",occurNoitm); // 레이아웃항목발생유형구분코드 + item.put("loutItemMaxOccurNoitm",max); // 레이아웃항목최대발생건수 + item.put("loutItemMinOccurNoitm",min); // 레이아웃항목최소발생건수 + + item.put("loutItemBascVal",_i.get("default")); // 레이아웃항목기본값 + if( _i.get("mask") != null && _i.get("mask").equals("Y")) + { + item.put("loutItemMskYn", "Y"); + item.put("loutItemMskCode", _i.get("mask2")); + } + else + { + item.put("loutItemMskYn",_i.get("mask")); // [Y/N/ ] + } + + if( "Y".equals(item.get("loutItemMskYn")) ) item.put("loutItemMaskLength",Integer.parseInt((String) _i.get("maskLength"))); + item.put("lyoutDptCnt",Integer.parseInt((String) _i.get("depth")) + 1 ); // 통합인터페이스 전달되는 Depth + 1을 해야 함 + item.put("decptLenCnt","".equals(_i.get("scale")) ? 0 : Integer.parseInt((String) _i.get("scale"))); // 소수점길이 META에서 "" 이면 "" 으로 표현함 + item.put("loutItemMskTarget", _i.get("maskTarget")); + + + String dataType = ""; + if( _i.get("type") == null || "".equals(_i.get("type"))) { + } else if( "VARCHAR".startsWith(((String) _i.get("type")).toUpperCase()) ) { // Varchar, Number + dataType = "String"; + } else if( "NUMBER".startsWith(((String) _i.get("type")).toUpperCase()) ) { // Varchar, Number + // JJB 수정사항 shkim 2020-08-19 숫자형 실수부 처리 문제로 BigDecimal로 처리 + dataType = "BigDecimal"; +// dataType = "Integer"; + } else if( "BIGDECIMAL".startsWith(((String) _i.get("type")).toUpperCase()) ) { // Varchar, Number + dataType = "BigDecimal"; + } + + item.put("lyoutItemRefPtrnIDName",dataType); // 데이터타입 + + list.add(item); + + if( _i.containsKey("item") && _i.entrySet().size() > 0 ) { + list.addAll(setLayoutItemsJSN((JSONArray) _i.get("item"), msgType, loutName, (String) _i.get("no"))); + } + } // end FOR + + return list; + } + /** * 통합인터페이스 시스템(iim)에서 전문 레이아웃에 대한 INSERT, DELETE 요청 * * @@ -194,7 +397,7 @@ public class LayoutSyncController extends OnlBaseAnnotationController implements */ @RequestMapping(params = "cmd=Message") public View parseMessage(HttpServletRequest request, HttpServletResponse response, String schema) throws Exception { - UserAccessLogger.log(request, "Layout", "L", "cmd=Message"); + UserAccessLogger.log(request, "레이아웃", "L", "cmd=Message"); Document rDoc = null; Element results = null; String resultS = null; @@ -204,35 +407,23 @@ public class LayoutSyncController extends OnlBaseAnnotationController implements String recvTime = DateUtil.getDateTime("yyyyMMddHHmmssSS").substring(0, 16); // 초기화 - if (schema != null) { - DataSourceContextHolder.setDataSourceType(DataSourceTypeManager.getDataSourceType(schema)); - } else { - logger.error(">>> DataSourceTypeManager.getDataSourceType(schema) error. schema is null"); - return null; - } - try { + DataSourceContextHolder.setDataSourceType(DataSourceTypeManager.getDataSourceType(schema)); + try { SAXBuilder builder = new SAXBuilder(); // 응답 전문 - InputStream resStream = request.getSession().getServletContext().getResourceAsStream("/WEB-INF/layout-messagesync-res.xml"); - if (resStream == null) { - throw new Exception("layout-messagesync-res.xml 파일을 찾을 수 없습니다."); - } - try { - rDoc = builder.build(resStream); - results = rDoc.getRootElement(); - } finally { - resStream.close(); - } - - // 요청 전문 - sis = request.getInputStream(); - Document doc = builder.build(sis); - - // log 기록 + File res = new File( request.getSession().getServletContext().getRealPath("/WEB-INF/") + "/layout-messagesync-res.xml" ); +// ServletContext context = request.getSession().getServletContext(); +// InputStream res = context.getResourceAsStream("layout-messagesync-res.xml"); + rDoc = builder.build(res); + results = rDoc.getRootElement(); + + + // 요청 전문 - InputStream을 먼저 byte[]로 읽음 + sis = request.getInputStream(); byte[] arg = new byte[request.getContentLength()]; - int resultSet =0; + int resultSet = 0; int total = 0; try { resultSet = sis.readLine(arg, 0, arg.length); @@ -240,12 +431,20 @@ public class LayoutSyncController extends OnlBaseAnnotationController implements total += resultSet; resultSet = sis.readLine(arg, total, 1024); } - - param.put("recvData", new String(arg)); + + param.put("recvData", new String(arg, "UTF-8")); } catch(Exception e) { logger.error("MessageSync.err - don't read the XML File - " + new String(arg), e); param.put("recvData", ""); } + + // byte[]로부터 XML 파싱 (BOM 제거) + String xmlContent = new String(arg, "UTF-8").trim(); + // BOM 제거 (UTF-8 BOM: EF BB BF) + if (xmlContent.startsWith("\uFEFF")) { + xmlContent = xmlContent.substring(1); + } + Document doc = builder.build(new ByteArrayInputStream(xmlContent.getBytes("UTF-8"))); param.put("logPrcssSeqno", UUIDGenerator.getUUID()); // xml 1.1 @@ -263,7 +462,7 @@ public class LayoutSyncController extends OnlBaseAnnotationController implements param.put("recvAmndHMS", recvTime); logger.info(layoutName + " command - [" + command +"]"); - //HashMap returnMap = new HashMap(); + HashMap returnMap = new HashMap(); if( command.equals("delete") ) { HashMap vo = new HashMap(); vo.put("loutName",layoutName); @@ -276,15 +475,19 @@ public class LayoutSyncController extends OnlBaseAnnotationController implements service.addLayoutSyncLog(param); + + } else { // LoutName 검증 // 인터페이스 이름 20자리 이하 - // EAI _CBSS _CBSR _CBSE _UAIR - // FEP _CBS _ORG - String fattern = "[A-Z0-9]{3}_[A-Z0-9]{3}[A-Z0-9]*_[A-Z0-9]{3,4}"; - if(!layoutName.matches(fattern)) { - throw new BizException("잘못된 전문레이아웃명 입니다.\n명명규칙을 확인하세요.\n[A-Z0-9]{3}_[A-Z0-9]{3}[A-Z0-9]*_[A-Z0-9]{3,4}"); - } + // EAI _CORS _CORR _CORE _UAIR + // FEP _COR _ORG + String fattern = "[A-Za-z0-9]*"; + + //레이아웃 필터링으로 미동작 주석처 +// if(!layoutName.matches(fattern)) { +// throw new BizException("잘못된 전문레이아웃명 입니다.\n명명규칙을 확인하세요.\n"+fattern); +// } String layout = body.getChild("data").getText(); logger.info(layoutName + " recv Data - [" + layout + "]"); @@ -297,7 +500,16 @@ public class LayoutSyncController extends OnlBaseAnnotationController implements Element format = doc2.getRootElement(); String msgType = format.getAttributeValue("msgType"); - if( "ASCII".equals(format.getAttributeValue("msgType")) ) { + String useSystem = format.getAttributeValue("usesystem"); + + // useSystem "EAI", "FEP" 만 배포 받는다. + if (!"EAI".equalsIgnoreCase(useSystem) && !"FEP".equalsIgnoreCase(useSystem)) { + String errorMessage = "사용 시스템(" + useSystem + ")인 전문레이아웃은 EAI, FEP로 배포 안됨."; + logger.error(errorMessage); + throw new Exception(errorMessage); + } + + if( "ASCII".equals(format.getAttributeValue("msgType")) ) { msgType = "BYTES"; } else if( "VASCII".equals(format.getAttributeValue("msgType")) ) { msgType = "VBYTES"; @@ -365,8 +577,8 @@ public class LayoutSyncController extends OnlBaseAnnotationController implements resultS = StringUtils.toXMLString(rDoc, true); } catch( Exception e ) { - logger.error(e); - logger.error(e.getStackTrace()[0]); + logger.error("",e); + logger.error("",e.getStackTrace()[0]); try { if( results != null ) { results.getChild("Result").setText("False"); @@ -383,22 +595,16 @@ public class LayoutSyncController extends OnlBaseAnnotationController implements param.put("PrcssRsltCmnt", StringUtils.cuttings(CommonUtil.getArrayString(e.getStackTrace(), "\n"), 4000)[0]); service.addLayoutSyncLog(param); } catch(Exception ee) { - //ee.printStackTrace(); - logger.error("error",e); + ee.printStackTrace(); } } ServletOutputStream sos = null; try { sos = response.getOutputStream(); - if(resultS != null) { - sos.write(resultS.getBytes()); - } - + sos.write(resultS.getBytes()); } catch( Exception e ) { - //e.printStackTrace(); - //취약점코드 수정 2019.08.22 SW - logger.error(e.getMessage()); + e.printStackTrace(); } finally { if( sis != null ) sis.close(); if( sos != null ) sos.close(); @@ -406,6 +612,382 @@ public class LayoutSyncController extends OnlBaseAnnotationController implements return null; } + // JJB 수정사항 shkim 2020-05-13 JSON 타입 추가 + /** + * 통합인터페이스 시스템(iim)에서 전문 레이아웃에 대한 INSERT, DELETE 요청 + * * + * @param request + * @param response + * @param schema + * @return + * @throws Exception + */ + @RequestMapping(params = "cmd=MessageJSON") + public View parseMessageJSN(HttpServletRequest request, HttpServletResponse response, String schema) throws Exception { + UserAccessLogger.log(request, "레이아웃", "L", "cmd=MessageJSON"); + + ServletInputStream sis = null; + + JSONObject results = new JSONObject(); + JSONObject resultS = new JSONObject(); + resultS.put("Results", results); + + + HashMap param = new HashMap(); + String recvTime = DateUtil.getDateTime("yyyyMMddHHmmssSS").substring(0, 16); + + // 초기화 + DataSourceContextHolder.setDataSourceType(DataSourceTypeManager.getDataSourceType(schema)); + try { +// // 요청 전문 + sis = request.getInputStream(); + + JSONObject json = (JSONObject) JSONValue.parse(new InputStreamReader(sis)); + + // JJB 향후제거 shkim 2020-05-13 연계 테스트 체크 + logger.error("\n\n MMI SYNC Request : " + json.toString()); + + // log 기록 + byte[] arg = new byte[request.getContentLength()]; + int resultSet =0; + int total = 0; + try { + resultSet = sis.readLine(arg, 0, arg.length); + while(resultSet != -1) { + total += resultSet; + resultSet = sis.readLine(arg, total, 1024); + } + + param.put("recvData", new String(arg)); + } catch(Exception e) { + logger.error("MessageSync.err - don't read the JSON File - " + new String(arg), e); + param.put("recvData", ""); + } + + syncLayout(param, recvTime, json); +// results.getChild("Result").setText("S".equals(param.get("prcssRslt"))?"True":"False"); +// results.getChild("ResultMessage").setText("S".equals(param.get("prcssRslt"))?"성공":param.get("prcssRsltCmnt")); + +// resultS = StringUtils.toXMLString(rDoc, true); + + results.put("Result", "S".equals(param.get("prcssRslt"))?"True":"False"); + results.put("ResultMessage", "S".equals(param.get("prcssRslt"))?"성공":param.get("prcssRsltCmnt")); + + + } catch( Exception e ) { + logger.error("", e); + try { + if( results != null ) { +// results.getChild("Result").setText("False"); +// results.getChild("ResultMessage").setText( e.getMessage() ); + +// resultS = StringUtils.toXMLString(rDoc, true); + results.put("Result", "False"); + results.put("ResultMessage", e.getMessage() ); + + } + if( param.get("logPrcssSeqno") == null ) { + param.put("logPrcssSeqno", UUIDGenerator.getUUID()); + param.put("ServiceName", "MessageSync"); + param.put("RecvAmndHMS", recvTime); + } + param.put("PrcssRslt", "F"); + param.put("PrcssRsltCmnt", StringUtils.cuttings(CommonUtil.getArrayString(e.getStackTrace(), "\n"), 4000)[0]); + service.addLayoutSyncLog(param); + } catch(Exception ee) { + ee.printStackTrace(); + } + } + + ServletOutputStream sos = null; + try { + sos = response.getOutputStream(); + sos.write(resultS.toString().getBytes()); + } catch( Exception e ) { + e.printStackTrace(); + } finally { + if( sis != null ) sis.close(); + if( sos != null ) sos.close(); + } + return null; + } + + private void syncLayout(HashMap param, String recvTime, JSONObject json) + throws Exception, BizException, ParseException { + JSONObject header = (JSONObject) ((JSONObject) json.get("Message")).get("Header"); + JSONObject body = (JSONObject) ((JSONObject) json.get("Message")).get("Body"); + + String serviceName = (String) header.get("ServiceName"); + String command = (String) header.get("Command"); + + String interfaceId = (String) body.get("interfaceCode"); + Object layoutObject = body.get("Layout"); + + param.put("serviceName", serviceName); + param.put("command", command); + param.put("recvAmndHMS", recvTime); + + + + JSONArray layoutArray = null; + if (layoutObject instanceof JSONArray) { + insertInterface(interfaceId,body); + layoutArray = (JSONArray) layoutObject; + for (int i = 0; i < layoutArray.size(); i++) { + syncLayout(param, body, command, (JSONObject) layoutArray.get(i)); + } + } else { + syncLayout(param, body, command, (JSONObject) layoutObject); + } + + + // 전문 변환 매핑이 필요한 지 확인 한 후 매핑 한다. + if (body.get("interfaceLayout") != null && body.get("serviceLayout") != null && layoutArray != null + && layoutArray.size() % 2 == 0) { + + String[] serviceLayoutList = ((String)body.get("serviceLayout")).split(","); + String[] interfaceLayoutList = ((String)body.get("interfaceLayout")).split(","); + + if ( "E".equals(interfaceId.substring(0,1)) ) // EAI일때 + { + for( String serviceLayout : serviceLayoutList) + { + for(String interfaceLayout : interfaceLayoutList ) + { + if ( interfaceLayout.endsWith(serviceLayout) ) + { + String cnvsnName = transformService.transactionLayoutToTransform(json,interfaceLayout, serviceLayout); + CommonCommand refreshCommand = new CommonCommand("com.eactive.eai.agent.transformer.ReloadTransformCommand",cnvsnName); + //변환매핑 reload처리후, result 받아서 예외처리 안한 이유. 앞단에서 레이아웃 동기화 command 날리면서 온라인이동 통신 성공해야 여기 까이 오기때문에, 굳이 추가하지않음. + agentUtilService.broadcast(refreshCommand); + logger.debug(">>> reload cnvsName = " +cnvsnName); + } + } + } + } + else //FEP일때 + { + for( String srcLayout : interfaceLayoutList) + { + for( String targetLayout : serviceLayoutList ) + { + String cnvsnName = transformService.transactionLayoutToTransform(json,srcLayout, targetLayout); + CommonCommand refreshCommand = new CommonCommand("com.eactive.eai.agent.transformer.ReloadTransformCommand",cnvsnName); + //변환매핑 reload처리후, result 받아서 예외처리 안한 이유. 앞단에서 레이아웃 동기화 command 날리면서 온라인이동 통신 성공해야 여기 까이 오기때문에, 굳이 추가하지않음. + agentUtilService.broadcast(refreshCommand); + logger.debug(">>> reload cnvsName = " +cnvsnName); + } + } + } + + + } + + + + } + + private void insertInterface(String interfaceId, JSONObject body) throws Exception + { + if ( interfaceId.startsWith("E") ) + { + insertInterfaceForEAI(interfaceId, body); + } + else + { + insertInterfaceForFEP(interfaceId, body); + } + + } + + private void insertInterfaceForEAI(String interfaceId, JSONObject body) throws Exception + { + HashMap param = new HashMap(); + + + String bizCode = (String) body.get("bzSystemCode"); + String interfaceDesc = (String) body.get("interfaceDesc"); + String tuxedoxaYn = (String) body.get("tuxedoXaYN"); + String tuxedosvcId = (String) body.get("serviceCode"); + param.put("eaiSvcName", interfaceId+"S1"); + param.put("eaiBzwkDstCd", bizCode); + param.put("interfaceId", interfaceId); + param.put("interfaceDesc", interfaceDesc); + param.put("io", "I"); + param.put("splizdmndDstCd","S"); + param.put("inExtnlDstCd","1"); + param.put("tuxedoxaYn", tuxedoxaYn); + + if( "INF".equals(interfaceId.substring(5, 8)) ) + { + param.put("tuxedosvcId", tuxedosvcId); + } + + if( "S".equals(interfaceId.substring(1, 2)) ) //sync일경우 + { + param.put("layoutMappingName",interfaceId+"_I,"+interfaceId.substring(5, interfaceId.length())+"_O"); + param.put("svcMotivuseDstCd","SYNC"); + } + else + { + param.put("layoutMappingName",interfaceId+"_I"); + param.put("svcMotivuseDstCd","ASYN"); + } + + interfaceService.lazyInsertToIF01(param); + + } + + private void insertInterfaceForFEP(String interfaceId, JSONObject body) throws Exception + { + HashMap param = new HashMap(); + + String bizCode = (String) body.get("bzSystemCode"); + String interfaceDesc = (String) body.get("interfaceDesc"); + String tuxedoxaYn = (String) body.get("tuxedoXaYN"); + String tuxedosvcId = (String) body.get("serviceCode"); + + String io = "1".equals(interfaceId.substring(1, 2)) ? "I" : "O"; + String splizdmndDstCd = interfaceId.substring(interfaceId.length()-1); + String inExtnlDstCd = ""; + + if ( "IS:OR".contains(io+splizdmndDstCd) ) + { + inExtnlDstCd = "1"; + param.put("bzwksvckeyName",interfaceId.substring(5, interfaceId.length()-1)); + } + else + { + inExtnlDstCd = "2"; + } + + param.put("eaiSvcName", interfaceId+splizdmndDstCd+inExtnlDstCd); + param.put("eaiBzwkDstCd", bizCode); + param.put("interfaceId", interfaceId); + param.put("interfaceDesc", interfaceDesc); + param.put("io", io); + param.put("splizdmndDstCd",splizdmndDstCd); + param.put("inExtnlDstCd",inExtnlDstCd); + param.put("svcMotivuseDstCd","ASYN"); + param.put("tuxedoxaYn", tuxedoxaYn); + + + param.put("layoutMappingName",interfaceId+"1"); + + interfaceService.lazyInsertToIF01(param); + } + + private void syncLayout(HashMap param, JSONObject body, String command, JSONObject layout) + throws Exception, BizException, ParseException { + + String layoutName = (String) layout.get("id"); + String useSystem = (String) layout.get("usesystem"); + + param.put("logPrcssSeqno", UUIDGenerator.getUUID()); + param.put("loutName", layoutName); + + logger.info(layoutName + " command - [" + command +"]"); + if( command.equals("delete") ) { + HashMap vo = new HashMap(); + vo.put("loutName",layoutName); + + service.deleteLayout(vo); + + CommonCommand commonCommand = new CommonCommand("com.eactive.eai.agent.transformer.RemoveLayoutCommand",vo.get("loutName")); + HashMap result = AgentParserUtils.parse(commonCommand, agentUtilService,"prcssRslt","prcssRsltCmnt"); + param.putAll(result); + + service.addLayoutSyncLog(param); + } else { + // LoutName 검증 + // 인터페이스 이름 20자리 이하 + // EAI _CORS _CORR _CORE _UAIR + // FEP _COR _ORG + String fattern = ""; + switch(useSystem) + { + case "FEP": + fattern = "[A-Za-z0-9]*[12E]{1}"; + break; + case "EAI": + case "FWK": + fattern = "[A-Za-z0-9]*_[IOE]{1}"; + break; + } + + if(!layoutName.matches(fattern)) { + throw new BizException("잘못된 전문레이아웃명 입니다.\n명명규칙을 확인하세요.\n"+fattern); + } + + logger.info(layoutName + " recv Data - [" + layout + "]"); + param.put("recvData", layout.toString()); + + HashMap vo = new HashMap(); + + String msgType = (String) layout.get("msgType"); + if( "ASCII".equals(msgType) ) { + msgType = "FEP".equals(useSystem) ? "BYTES" : "PBYTES"; + } else if( "VASCII".equals(msgType) ) { + msgType = "VBYTES"; + } + + + // Layout Format (TR07) + vo.put("loutName",layoutName); + vo.put("loutPtrnName",msgType); // ASCII, EBCDIC, XML + vo.put("loutDesc",layout.get("desc")); + + String date = (String) layout.get("date"); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + vo.put("lastAmndHMS",new SimpleDateFormat("yyyyMMddHHmmssSS").format(sdf.parse(date))); + + vo.put("eaiBzwkDstcd",layout.get("group")); + + if( !"".equals(layout.get("createBy"))) { + vo.put("createBy",layout.get("createBy")); + } + + if( !"".equals(layout.get("updateBy"))) { + vo.put("updateBy",layout.get("updateBy")); + } + + + // Layout Item Format (TR08) + List> list = new ArrayList>(); + HashMap tr08 = new HashMap(); + tr08.put("loutName",layoutName); + tr08.put("loutItemName",layoutName); + tr08.put("loutItemSerno",0); + tr08.put("loutItemIDName",1000); + tr08.put("parntLoutItemIDName",0); + tr08.put("loutItemDesc",layout.get("desc")); + tr08.put("loutItemNodePtrnIDName",Item.NODE_MESSAGE); + tr08.put("loutItemPtrnIDName",Types.TYPE_UNKNOWN); + tr08.put("loutItemPathName",""); // + tr08.put("loutItemLenCnt",0); + tr08.put("loutItemRefInfo",""); // GROUP NAME + tr08.put("loutItemRefInfo2",""); // + tr08.put("loutItemOccurPtrnDstcd",""); // 레이아웃항목발생유형구분코드 + tr08.put("loutItemMaxOccurNoitm",0); // 레이아웃항목최대발생건수 + tr08.put("loutItemMinOccurNoitm",0); // 레이아웃항목최소발생건수 + tr08.put("loutItemBascVal",""); // 레이아웃항목기본값 + tr08.put("loutItemMskYn"," "); // + tr08.put("lyoutDptCnt",1); + tr08.put("decptLenCnt",0); // 소수점길이 + tr08.put("lyoutItemRefPtrnIdName",""); // 데이터타입 + + list.add(tr08); + list.addAll(setLayoutItemsJSN((JSONArray) layout.get("data"), msgType, layoutName, null)); + + service.insertLayout(vo, list); //FIXME : 스키마 변경 룰 적용해야 함 + + CommonCommand commonCommand = new CommonCommand("com.eactive.eai.agent.transformer.ReloadLayoutCommand",vo.get("loutName")); + HashMap result = AgentParserUtils.parse(commonCommand, agentUtilService,"prcssRslt","prcssRsltCmnt"); + param.putAll(result); + service.addLayoutSyncLog(param); + } + } + /** * [통합인터페이스]에 레이아웃 정보 송신 * * schemaId에 따라 별도로 저장 됨 @@ -420,11 +1002,11 @@ public class LayoutSyncController extends OnlBaseAnnotationController implements @RequestMapping(params = "cmd=M_LAYOUT") public String migrationLayout(HttpServletRequest request, HttpServletResponse response, ModelMap model, String schema) throws Exception { - UserAccessLogger.log(request, "Layout", "M", "cmd=SYNC"); + UserAccessLogger.log(request, "레이아웃", "M", "cmd=SYNC"); -// if( !DataSourceTypeManager.EAI.equals(schema) && !DataSourceTypeManager.FEP.equals(schema) ) { + if( !DataSourceTypeManager.EAI.equals(schema) && !DataSourceTypeManager.FEP.equals(schema) ) { schema = DataSourceContextHolder.getDataSourceType().getName(); -// } + } // 1. 파라메터 셋팅 String migration = monitoringContext.getStringProperty("iim.layout.migration" ,""); @@ -437,7 +1019,7 @@ public class LayoutSyncController extends OnlBaseAnnotationController implements param.put("userId", SessionManager.getUserId(request)); param.put("schemaId", schema); param.put("filePath", StringUtils.defaultString(props[0], request.getSession().getServletContext().getRealPath("/WEB-INF/"))); - param.put("encoding", StringUtils.defaultString(props[1],"utf-8")); + param.put("encoding", StringUtils.defaultString(props[1],"EUC-KR")); param.put("indent", StringUtils.defaultString(props[2],"yes")); param.put("path", request.getSession().getServletContext().getRealPath("/WEB-INF/")); @@ -457,12 +1039,9 @@ public class LayoutSyncController extends OnlBaseAnnotationController implements File mkf = new File(param.get("filePath") + "/" + param.get("schemaId")); if( mkf.exists() ) { File[] fList = mkf.listFiles(); - if(fList != null){ - for( int i=0; i< fList.length; i++) { - fList[i].delete(); - } + for( int i=0; i< fList.length; i++) { + fList[i].delete(); } - mkf.delete(); } mkf.mkdir(); @@ -481,7 +1060,7 @@ public class LayoutSyncController extends OnlBaseAnnotationController implements + "/" + layout.get("LOUTNAME") + ".xml"; // 파일 저장 - //File newFile = new File(newName); + File newFile = new File(newName); TransformerFactory factory = TransformerFactory.newInstance(); Transformer transformer = factory.newTransformer(); @@ -497,8 +1076,7 @@ public class LayoutSyncController extends OnlBaseAnnotationController implements succCnt++; } } catch(Exception e) { - //e.printStackTrace(); - logger.error("migrationLayout error",e); + e.printStackTrace(); } return null; @@ -508,11 +1086,11 @@ public class LayoutSyncController extends OnlBaseAnnotationController implements @RequestMapping(params = "cmd=M_LAYOUT_MAPPING") public String migrationLayoutMapping(HttpServletRequest request, HttpServletResponse response, ModelMap model, String schema) throws Exception { - UserAccessLogger.log(request, "Layout", "M", "cmd=SYNC"); + UserAccessLogger.log(request, "레이아웃", "M", "cmd=SYNC"); -// if( !DataSourceTypeManager.EAI.equals(schema) && !DataSourceTypeManager.FEP.equals(schema) ) { + if( !DataSourceTypeManager.EAI.equals(schema) && !DataSourceTypeManager.FEP.equals(schema) ) { schema = DataSourceContextHolder.getDataSourceType().getName(); -// } + } // 1. 파라메터 셋팅 String migration = monitoringContext.getStringProperty("iim.layout.migration" ,""); @@ -525,7 +1103,7 @@ public class LayoutSyncController extends OnlBaseAnnotationController implements param.put("userId", SessionManager.getUserId(request)); param.put("schemaId", schema); param.put("filePath", StringUtils.defaultString(props[0], request.getSession().getServletContext().getRealPath("/WEB-INF/"))); - param.put("encoding", StringUtils.defaultString(props[1],"utf-8")); + param.put("encoding", StringUtils.defaultString(props[1],"EUC-KR")); param.put("indent", StringUtils.defaultString(props[2],"yes")); param.put("path", request.getSession().getServletContext().getRealPath("/WEB-INF/")); @@ -545,12 +1123,9 @@ public class LayoutSyncController extends OnlBaseAnnotationController implements File mkf = new File(param.get("filePath") + "/mapping_" + param.get("schemaId")); if( mkf.exists() ) { File[] fList = mkf.listFiles(); - if(fList != null){ - for( int i=0; i< fList.length; i++) { - fList[i].delete(); - } + for( int i=0; i< fList.length; i++) { + fList[i].delete(); } - mkf.delete(); } mkf.mkdir(); @@ -567,7 +1142,7 @@ public class LayoutSyncController extends OnlBaseAnnotationController implements // 파일 저장 if( xmlQuery.indexOf("Layout") != -1) { - //File newFile = new File(newName); + File newFile = new File(newName); TransformerFactory factory = TransformerFactory.newInstance(); Transformer transformer = factory.newTransformer(); @@ -584,8 +1159,7 @@ public class LayoutSyncController extends OnlBaseAnnotationController implements } } } catch(Exception e) { - //e.printStackTrace(); - logger.error("migrationLayoutMapping error",e); + e.printStackTrace(); } return null ; } diff --git a/src/main/java/com/eactive/eai/rms/onl/manage/rule/layoutsync/LayoutSyncService.java b/src/main/java/com/eactive/eai/rms/onl/manage/rule/layoutsync/LayoutSyncService.java index 77971f8..010e075 100644 --- a/src/main/java/com/eactive/eai/rms/onl/manage/rule/layoutsync/LayoutSyncService.java +++ b/src/main/java/com/eactive/eai/rms/onl/manage/rule/layoutsync/LayoutSyncService.java @@ -14,6 +14,7 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; +import java.util.Objects; import org.apache.commons.httpclient.util.DateUtil; import org.jdom.Document; @@ -27,6 +28,7 @@ import org.springframework.stereotype.Service; import com.eactive.eai.rms.common.base.OnlBaseService; import com.eactive.eai.rms.common.datasource.DataSourceContextHolder; import com.eactive.eai.rms.common.util.StringUtils; +import com.eactive.eai.rms.data.entity.onl.layout.LayoutService; import com.eactive.eai.rms.onl.manage.rule.layout.LayoutDao; import com.eactive.eai.rms.onl.manage.serviceinfo.eaimsg.EaiMsgDao; @@ -38,6 +40,9 @@ public class LayoutSyncService extends OnlBaseService { @Autowired private EaiMsgDao eaiMsgDao; + + @Autowired + private LayoutService layoutService; public List> getAllEAIMessages(HashMap param) throws Exception { return eaiMsgDao.selectListAll(param); @@ -50,10 +55,7 @@ public class LayoutSyncService extends OnlBaseService { public void insertLayout(HashMap vo, List> items) throws Exception { - - dao.deleteItemAll(vo); - dao.delete(vo); - + deleteLayout(vo); dao.insert(vo); for(HashMap item : items) { @@ -74,8 +76,7 @@ public class LayoutSyncService extends OnlBaseService { public void deleteLayout(HashMap vo) throws Exception { - dao.deleteItemAll(vo); - dao.delete(vo); + layoutService.findById(Objects.toString(vo.get("loutName"))).ifPresent(layoutService::delete); } public List> getAllLayouts() throws Exception { diff --git a/src/main/resources/com/eactive/eai/rms/onl/transaction/Interface-oracle.xml b/src/main/resources/com/eactive/eai/rms/onl/transaction/Interface-oracle.xml index 56c119e..52f097b 100644 --- a/src/main/resources/com/eactive/eai/rms/onl/transaction/Interface-oracle.xml +++ b/src/main/resources/com/eactive/eai/rms/onl/transaction/Interface-oracle.xml @@ -314,6 +314,13 @@ ) WHERE ROWNO BETWEEN #startNum# AND #endNum# - + + + + INSERT INTO $schemaId$.TSEAIIF01 + (EAISVCNAME, EAIBZWKDSTCD, EAITRANNAME, EAISVCDESC, IO, SPLIZDMNDDSTCD, STNDTELGMWTINEXTNLDSTCD, SVCMOTIVUSEDSTCD, BZWKSVCKEYNAME, LAYOUTMAPPINGNAME CREATEBY, UPDATEBY) + VALUES + (#eaiSvcName#, #eaiBzwkDstCd#, #interfaceId#, #interfaceDesc#, #io#, #splizdmndDstCd#, #inExtnlDstCd#, #svcMotivuseDstCd#, #bzwksvckeyName#, #layoutMappingName#, #loginId#, #loginId# ) + \ No newline at end of file diff --git a/src/main/resources/com/eactive/eai/rms/onl/transaction/Layout-oracle.xml b/src/main/resources/com/eactive/eai/rms/onl/transaction/Layout-oracle.xml new file mode 100644 index 0000000..3dd8f7a --- /dev/null +++ b/src/main/resources/com/eactive/eai/rms/onl/transaction/Layout-oracle.xml @@ -0,0 +1,458 @@ + + + + + + + SELECT FA.*, FB.BZWKDSTICNAME + FROM ( + SELECT ROWNO, LOUTNAME , LOUTPTRNNAME , LOUTDESC , + LOUTPTRNDESC , LASTAMNDHMS , EAIBZWKDSTCD , + UAPPLNAME , SYSINTFACNAME + FROM ( + SELECT ROWNUM AS ROWNO, + LOUTNAME, LOUTPTRNNAME, LOUTDESC , + LOUTPTRNDESC , LASTAMNDHMS , EAIBZWKDSTCD , + UAPPLNAME , SYSINTFACNAME + FROM ( + SELECT A.LOUTNAME, A.LOUTPTRNNAME, A.LOUTDESC, B.LOUTPTRNDESC, + A.LASTAMNDHMS , A.EAIBZWKDSTCD , A.UAPPLNAME , A.SYSINTFACNAME + FROM $schemaId$.TSEAITR07 A, $schemaId$.TSEAITR06 B + WHERE A.LOUTPTRNNAME = B.LOUTPTRNNAME + AND A.EAIBZWKDSTCD IN (select EAIBZWKDSTCD from $schemaId$.TSEAIRM06 where userId =#loginId#) + + A.LOUTNAME LIKE UPPER('%'||#searchLoutName#||'%') + + + + A.EAIBZWKDSTCD LIKE UPPER('%'||#searchEaiBzwkDstcd#||'%') + + + + A.LOUTDESC LIKE UPPER('%'||#searchLoutDesc#||'%') + + + ) TMP1 + ) TMP2 WHERE ROWNO BETWEEN #startNum# AND #endNum# + ) FA LEFT OUTER JOIN $schemaId$.TSEAICM01 FB + ON FA.EAIBZWKDSTCD = FB.EAIBZWKDSTCD + ORDER BY 1 + + + + + SELECT COUNT(*) + FROM $schemaId$.TSEAITR07 + WHERE EAIBZWKDSTCD IN (select EAIBZWKDSTCD from $schemaId$.TSEAIRM06 where userId =#loginId#) + + LOUTNAME LIKE UPPER('%'||#searchLoutName#||'%') + + + + EAIBZWKDSTCD LIKE UPPER('%'||#searchEaiBzwkDstcd#||'%') + + + + LOUTDESC LIKE UPPER('%'||#searchLoutDesc#||'%') + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select 0 AS "level" + , LoutItemIDName "id" + , ParntLoutItemIDName "parent" + , 'true' AS "expanded" + , CASE LoutItemNodePtrnIDName WHEN 2203 THEN 'true' ELSE 'false' END "isLeaf" + , LoutItemName LOUTITEMPATH + , LOUTNAME AS LOUTNAME + , LOUTITEMIDNAME AS LOUTITEMIDNAME + , LOUTITEMNAME AS LOUTITEMNAME + , LOUTITEMDESC AS LOUTITEMDESC + , LOUTITEMSERNO AS LOUTITEMSERNO + , LOUTITEMLENCNT AS LOUTITEMLENCNT + , DECPTLENCNT AS DECPTLENCNT + , LOUTITEMNODEPTRNIDNAME AS LOUTITEMNODEPTRNIDNAME + , LOUTITEMPTRNIDNAME AS LOUTITEMPTRNIDNAME + , (CASE LoutItemNodePtrnIDName + WHEN 2201 THEN 'MESSAGE' + WHEN 2202 THEN 'GROUP' + WHEN 2203 THEN 'FIELD' + WHEN 2204 THEN 'ATTR' + ELSE 'UNKNOWN' END) LOUTITEMNODEPTRNIDDESC + , (CASE LoutItemPtrnIDName + WHEN 2100 THEN 'UNKNOWN' + WHEN 2101 THEN 'STRING' + WHEN 2102 THEN 'INT' + WHEN 2103 THEN 'LONG' + WHEN 2104 THEN 'SHORT' + WHEN 2105 THEN 'DOUBLE' + WHEN 2106 THEN 'FLOAT' + WHEN 2107 THEN 'CHAR' + WHEN 2108 THEN 'BYTE' + WHEN 2109 THEN 'DATE' + WHEN 2110 THEN 'TIME' + WHEN 2111 THEN 'TIMESTAMP' + WHEN 2112 THEN 'NUMBER' + WHEN 2113 THEN 'BYTEARRAY' + WHEN 2114 THEN 'NUMERIC' + WHEN 2115 THEN 'PACKDECIMAL' + WHEN 2116 THEN 'OBJECT' + WHEN 2117 THEN 'BOOLEAN' + WHEN 2118 THEN 'BIGDECIMAL' + ELSE 'UNKNOWN' END + )LOUTITEMPTRNIDDESC + , PARNTLOUTITEMIDNAME AS PARNTLOUTITEMIDNAME + , LOUTITEMOCCURPTRNDSTCD AS LOUTITEMOCCURPTRNDSTCD + , LOUTITEMMINOCCURNOITM AS LOUTITEMMINOCCURNOITM + , LOUTITEMMAXOCCURNOITM AS LOUTITEMMAXOCCURNOITM + , LOUTITEMREFINFO2 AS LOUTITEMREFINFO2 + from ( + select * + from $schemaId$.TSEAITR08 + where LoutName = #loutName# + ) T + order by LoutItemSerno + + + + + UPDATE $schemaId$.TSEAITR07 + SET LASTAMNDHMS = to_char(sysdate,'yyyymmddhh24miss') + WHERE LOUTNAME = #loutName# + + + + + SELECT + LOUTNAME LOUTNAME, + LOUTITEMNAME LOUTITEMNAME, + LOUTITEMIDNAME LOUTITEMIDNAME, + PARNTLOUTITEMIDNAME PARNTLOUTITEMIDNAME, + LOUTITEMDESC LOUTITEMDESC, + LOUTITEMNODEPTRNIDNAME LOUTITEMNODEPTRNIDNAME, + LOUTITEMPTRNIDNAME LOUTITEMPTRNIDNAME, + LOUTITEMPATHNAME LOUTITEMPATHNAME, + LOUTITEMLENCNT LOUTITEMLENCNT, + LOUTITEMREFINFO LOUTITEMREFINFO, + LOUTITEMREFINFO2 LOUTITEMREFINFO2, + LOUTITEMSERNO LOUTITEMSERNO, + LOUTITEMOCCURPTRNDSTCD LOUTITEMOCCURPTRNDSTCD, + LOUTITEMMAXOCCURNOITM LOUTITEMMAXOCCURNOITM, + LOUTITEMMINOCCURNOITM LOUTITEMMINOCCURNOITM, + LOUTITEMBASCVAL LOUTITEMBASCVAL, + LOUTITEMMSKYN LOUTITEMMSKYN, + COALESCE(LOUTITEMMASKLENGTH,0) LOUTITEMMASKLENGTH, + LYOUTDPTCNT LYOUTDPTCNT, + DECPTLENCNT DECPTLENCNT, + LYOUTITEMREFPTRNIDNAME LYOUTITEMREFPTRNIDNAME + FROM $schemaId$.TSEAITR08 + WHERE LOUTNAME=#loutName# + AND LOUTITEMNAME =#loutItemName# + AND LOUTITEMSERNO=#loutItemSerno# + ORDER BY LOUTITEMIDNAME, LOUTITEMOCCURPTRNDSTCD DESC + + + + + SELECT + CASE WHEN PARNTLOUTITEMIDNAME = '0' THEN 'FORMAT' + ELSE CASE WHEN LOUTITEMPTRNIDNAME = '2100' THEN 'GRID' + WHEN LOUTITEMPTRNIDNAME = '2113' THEN ( CASE WHEN (SELECT LOUTITEMPTRNIDNAME + FROM $schemaId$.TSEAITR08 L + WHERE L.LOUTNAME = O.LOUTNAME + AND L.LOUTITEMIDNAME = O.PARNTLOUTITEMIDNAME + AND L.LOUTITEMPTRNIDNAME = '2100' + AND (L.LOUTITEMMAXOCCURNOITM = -1 OR L.LOUTITEMMAXOCCURNOITM > 1) + ) = '2100' THEN 'COLUMN' ELSE 'FLD' END ) + END AS FIELDTYPE + , LOUTITEMNAME AS ID + , LOUTITEMDESC AS DESC + ,CASE WHEN LYOUTITEMREFPTRNIDNAME = 'STRING' THEN 'CHAR' + LYOUTITEMREFPTRNIDNAME = 'BYTEARRAY' THEN 'CHAR' + LYOUTITEMREFPTRNIDNAME = 'INTEGER' THEN 'DECIMAL' + LYOUTITEMREFPTRNIDNAME = 'BIGDECIMAL' THEN 'NUMERIC' + ELSE 'CHAR' + END AS TYPE + , LOUTITEMLENCNT AS LEN + , DECPTLENCNT AS SCALE + , (CASE WHEN LOUTITEMPTRNIDNAME = '2100' AND PARNTLOUTITEMIDNAME !=0 AND TRIM(LOUTITEMREFINFO2) IS NOT NULL THEN LOUTITEMREFINFO2 + WHEN LOUTITEMPTRNIDNAME = '2100' AND PARNTLOUTITEMIDNAME !=0 AND TRIM(LOUTITEMREFINFO2) IS NULL THEN TO_CHAR(LOUTITEMMAXOCCURNOITM) + ELSE ' ' END) AS COUNT + FROM ( + SELECT * + FROM $schemaId$.TSEAITR08 + WHERE LOUTNAME = #LoutName# + ) O + WHERE (LOUTITEMPTRNIDNAME = '2100' AND (LOUTITEMMAXOCCURNOITM = -1 OR LOUTITEMMAXOCCURNOITM > 1) ) OR (LOUTITEMPTRNIDNAME = '2113' ) OR (PARNTLOUTITEMIDNAME = 0) + CONNECT BY PRIOR LOUTITEMIDNAME = PARNTLOUTITEMIDNAME + START WITH PARNTLOUTITEMIDNAME = '0' + + + + + SELECT ID "id", + LOUTDESC "desc", '$schemaId$' "usesystem", + TARGETSYSTEM "targetsystem", TRIM(PSVSYSBZWKDSTCD) "group", IOTYPE "ioType", + HEADER_TXID "servicecode", A.EAISVCNAME "interfacecode" + FROM ( + SELECT LOUTNAME ID, CASE WHEN SOURCRSULTDSTCD = 'SRC_LAYOUT' THEN 'I' ELSE 'O' END IOTYPE + ,CASE WHEN PSVINTFACDSTICNAME = 'SYNC' AND SOURCRSULTDSTCD = 'SRC_LAYOUT' THEN '기동' + WHEN PSVINTFACDSTICNAME = 'SYNC' AND SOURCRSULTDSTCD = 'TGT_LAYOUT' THEN '수동' + WHEN EAISVCNAME LIKE '%1' AND SOURCRSULTDSTCD = 'TGT_LAYOUT' THEN 'CBS' + WHEN EAISVCNAME LIKE '%2' AND SOURCRSULTDSTCD = 'SRC_LAYOUT' THEN 'CBS' + ELSE '대외' END TARGETSYSTEM + ,EAISVCNAME, PSVSYSBZWKDSTCD + FROM $schemaId$.TSEAITR02 A JOIN $schemaId$.TSEAIHE02 B ON A.CNVSNNAME = B.CHNGMSGIDNAME + WHERE B.EAISVCNAME = #eaiSvcName# UNION + SELECT LOUTNAME ID, CASE WHEN SOURCRSULTDSTCD = 'SRC_LAYOUT' THEN 'I' ELSE 'O' END IOTYPE + ,CASE WHEN PSVINTFACDSTICNAME = 'SYNC' AND SOURCRSULTDSTCD = 'SRC_LAYOUT' THEN '수동' + WHEN PSVINTFACDSTICNAME = 'SYNC' AND SOURCRSULTDSTCD = 'TGT_LAYOUT' THEN '기동' + WHEN EAISVCNAME LIKE '%1' AND SOURCRSULTDSTCD = 'TGT_LAYOUT' THEN 'CBS' + WHEN EAISVCNAME LIKE '%2' AND SOURCRSULTDSTCD = 'SRC_LAYOUT' THEN 'CBS' + ELSE '대외' END TARGETSYSTEM + ,EAISVCNAME, PSVSYSBZWKDSTCD + FROM $schemaId$.TSEAITR02 A JOIN $schemaId$.TSEAIHE02 B ON A.CNVSNNAME = B.BASCRSPNSCHNGMSGIDNAME + WHERE B.EAISVCNAME = #eaiSvcName# UNION + SELECT LOUTNAME ID, CASE WHEN SOURCRSULTDSTCD = 'SRC_LAYOUT' THEN 'IE' ELSE 'OE' END IOTYPE + ,CASE WHEN PSVINTFACDSTICNAME = 'SYNC' AND SOURCRSULTDSTCD = 'SRC_LAYOUT' THEN '수동' + WHEN PSVINTFACDSTICNAME = 'SYNC' AND SOURCRSULTDSTCD = 'TGT_LAYOUT' THEN '기동' + WHEN EAISVCNAME LIKE '%1' AND SOURCRSULTDSTCD = 'TGT_LAYOUT' THEN 'CBS' + WHEN EAISVCNAME LIKE '%2' AND SOURCRSULTDSTCD = 'SRC_LAYOUT' THEN 'CBS' + ELSE '대외' END TARGETSYSTEM + ,EAISVCNAME, PSVSYSBZWKDSTCD + FROM $schemaId$.TSEAITR02 A JOIN $schemaId$.TSEAIHE02 B ON A.CNVSNNAME = B.ERRRSPNSCHNGMSGIDNAME + WHERE B.EAISVCNAME = #eaiSvcName# UNION + SELECT REFMSGIDNAME ID, CASE WHEN REFMSGIDNO = 1 THEN 'I' ELSE 'O' END IOTYPE + ,CASE WHEN PSVINTFACDSTICNAME = 'SYNC' AND REFMSGIDNO = 1 THEN '기동' + WHEN PSVINTFACDSTICNAME = 'SYNC' AND REFMSGIDNO = 2 THEN '수동' + WHEN PSVINTFACDSTICNAME = 'SYNC' AND REFMSGIDNO = 3 THEN '수동' + WHEN REFMSGIDNAME LIKE '%CBS' THEN 'CBS' + ELSE '대외' END TARGETSYSTEM + ,A.EAISVCNAME, PSVSYSBZWKDSTCD FROM $schemaId$.TSEAIMS02 A JOIN $schemaId$.TSEAIHE02 B ON A.EAISVCNAME = B.EAISVCNAME + WHERE B.EAISVCNAME = #eaiSvcName# + ) A + LEFT OUTER JOIN ( SELECT EAISVCNAME + , max(decode(COLUMNNAME,'HEADER_TXID',COLUMNVALUE,'')) HEADER_TXID + FROM $schemaId$.TSEAIHS04 hs04 , $schemaId$.tseaihs05 hs05 + where hs04.BZWKSVCKEYNAME =hs05.BZWKSVCKEYNAME + group by hs04.BZWKSVCKEYNAME,EAISVCNAME + ) HS04 ON A.EAISVCNAME = HS04.EAISVCNAME + LEFT OUTER JOIN $schemaId$.TSEAITR07 TR07 ON TR07.LOUTNAME = A.ID + ORDER BY 1 + + + + + SELECT SUBSTR(SYS_CONNECT_BY_PATH(LOUTITEMNAME, '.'),2) PATH + FROM ( + SELECT decode(LYOUTITEMREFPTRNIDNAME, NULL, decode(LOUTITEMIDNAME, 1000, LOUTITEMNAME, LOUTITEMNAME||'[*]'), LOUTITEMNAME) LOUTITEMNAME, LOUTITEMIDNAME, LYOUTDPTCNT, nvl(LYOUTITEMREFPTRNIDNAME,'Group') LYOUTITEMREFPTRNIDNAME, PARNTLOUTITEMIDNAME PARENT + FROM tseaitr08 a + WHERE loutname = #loutName# + ORDER BY LOUTITEMIDNAME + ) + WHERE LYOUTITEMREFPTRNIDNAME != 'Group' + START WITH LOUTITEMIDNAME = 1000 CONNECT BY PRIOR LOUTITEMIDNAME = PARENT + + + + + SELECT FA.*, FB.BZWKDSTICNAME + FROM ( + SELECT ROWNO, LOUTNAME , LOUTPTRNNAME , LOUTDESC , + LOUTPTRNDESC , LASTAMNDHMS , EAIBZWKDSTCD , + UAPPLNAME , SYSINTFACNAME + FROM ( + SELECT ROWNUM AS ROWNO, + LOUTNAME, LOUTPTRNNAME, LOUTDESC , + LOUTPTRNDESC , LASTAMNDHMS , EAIBZWKDSTCD , + UAPPLNAME , SYSINTFACNAME + FROM ( + SELECT A.LOUTNAME, A.LOUTPTRNNAME, A.LOUTDESC, B.LOUTPTRNDESC, + A.LASTAMNDHMS , A.EAIBZWKDSTCD , A.UAPPLNAME , A.SYSINTFACNAME + FROM $schemaId$.TSEAITR07 A, $schemaId$.TSEAITR06 B + WHERE A.LOUTPTRNNAME = B.LOUTPTRNNAME + + UPPER(A.LOUTNAME) LIKE UPPER('%'||#searchLoutName#||'%') + + + + UPPER(A.EAIBZWKDSTCD) LIKE UPPER('%'||#searchEaiBzwkDstcd#||'%') + + + + UPPER(A.LOUTDESC) LIKE UPPER('%'||#searchLoutDesc#||'%') + + + ) TMP1 + ) TMP2 WHERE ROWNO BETWEEN #startNum# AND #endNum# + ) FA LEFT OUTER JOIN $schemaId$.TSEAICM01 FB + ON FA.EAIBZWKDSTCD = FB.EAIBZWKDSTCD + ORDER BY 1 + + + + + SELECT COUNT(*) + FROM $schemaId$.TSEAITR07 + + + UPPER(LOUTNAME) LIKE UPPER('%'||#searchLoutName#||'%') + + + + UPPER(EAIBZWKDSTCD) LIKE UPPER('%'||#searchEaiBzwkDstcd#||'%') + + + + UPPER(LOUTDESC) LIKE UPPER('%'||#searchLoutDesc#||'%') + + + + + + INSERT INTO $schemaId$.TSEAITR09 + ( LOGPRCSSSERNO, EXECUTEDATE ,EXECUTECLASS,EXECUTEMETHOD,EXECUTEUSER,SENDXMLCMNT,SENDAMNDHMS ) + VALUES + ( #logPrcssSerno#, TO_CHAR(CURRENT_DATE,'YYYYMMDD') ,#executeClass#,#executeMethod#,#executeUser#,#sendXmlCmnt#, + TO_CHAR(CURRENT_TIMESTAMP,'YYYYMMDDHH24MISSFF2') ) + + + + UPDATE $schemaId$.TSEAITR09 + SET RECVAMNDHMS=TO_CHAR(CURRENT_TIMESTAMP,'YYYYMMDDHH24MISSFF2'), + RECVRSLT=#recvRslt#, + RECVFAILCMNT=#recvFailCmnt# + WHERE LOGPRCSSSERNO = #logPrcssSerno# + + + + DELETE FROM $schemaId$.TSEAITR08 + WHERE LOUTNAME=#loutName# + AND LOUTITEMNAME =#loutItemName# + AND LOUTITEMSERNO=#loutItemSerno# + + + + + + INSERT INTO $schemaId$.TSEAITR08 ( + LOUTNAME, LOUTITEMNAME, LOUTITEMIDNAME, PARNTLOUTITEMIDNAME, LOUTITEMDESC, LOUTITEMNODEPTRNIDNAME, + LOUTITEMPTRNIDNAME, LOUTITEMPATHNAME, LOUTITEMLENCNT, LOUTITEMREFINFO, LOUTITEMREFINFO2, + LOUTITEMSERNO, LOUTITEMOCCURPTRNDSTCD, LOUTITEMMAXOCCURNOITM, LOUTITEMMINOCCURNOITM, + LOUTITEMBASCVAL, LOUTITEMMSKYN, LOUTITEMMASKLENGTH, LYOUTDPTCNT, DECPTLENCNT, LYOUTITEMREFPTRNIDNAME + ) VALUES ( + #loutName#, #loutItemName#, #loutItemIDName#, #parntLoutItemIDName#, #loutItemDesc#, #loutItemNodePtrnIDName#, + #loutItemPtrnIDName#, #loutItemPathName#, #loutItemLenCnt#, #loutItemRefInfo#, #loutItemRefInfo2#, + #loutItemSerno#, #loutItemOccurPtrnDstcd#, #loutItemMaxOccurNoitm#, #loutItemMinOccurNoitm#, + #loutItemBascVal#, #loutItemMskYn#, #loutItemMaskLength#, #lyoutDptCnt#, #decptLenCnt#, #lyoutItemRefPtrnIDName# + ) + + + + + UPDATE $schemaId$.TSEAITR08 + SET + LOUTNAME = #loutName#, + LOUTITEMNAME = #loutItemName#, + LOUTITEMIDNAME = #loutItemIDName#, + PARNTLOUTITEMIDNAME = #parntLoutItemIDName#, + LOUTITEMDESC = #loutItemDesc#, + LOUTITEMNODEPTRNIDNAME = #loutItemNodePtrnIDName#, + LOUTITEMPTRNIDNAME = #loutItemPtrnIDName#, + LOUTITEMPATHNAME = #loutItemPathName#, + LOUTITEMLENCNT = #loutItemLenCnt#, + LOUTITEMREFINFO = #loutItemRefInfo#, + LOUTITEMREFINFO2 = #loutItemRefInfo2#, + LOUTITEMSERNO = #loutItemSerno#, + LOUTITEMOCCURPTRNDSTCD = #loutItemOccurPtrnDstcd#, + LOUTITEMMAXOCCURNOITM = #loutItemMaxOccurNoitm#, + LOUTITEMMINOCCURNOITM = #loutItemMinOccurNoitm#, + LOUTITEMBASCVAL = #loutItemBascVal#, + LOUTITEMMSKYN = #loutItemMskYn#, + LOUTITEMMASKLENGTH = #loutItemMaskLength#, + LYOUTDPTCNT = #lyoutDptCnt#, + DECPTLENCNT = #decptLenCnt#, + LYOUTITEMREFPTRNIDNAME = #lyoutItemRefPtrnIDName# + WHERE LOUTNAME = #loutName# + AND LOUTITEMNAME =#loutItemName# + AND LOUTITEMSERNO =#loutItemSerno# + + + + INSERT INTO $schemaId$.TSEAITR08 ( LOUTNAME, LOUTITEMNAME, LOUTITEMSERNO, LOUTITEMIDNAME, PARNTLOUTITEMIDNAME, + LOUTITEMDESC, LOUTITEMNODEPTRNIDNAME, LOUTITEMPTRNIDNAME, LOUTITEMPATHNAME, LOUTITEMLENCNT, + LOUTITEMREFINFO, LOUTITEMREFINFO2, LOUTITEMOCCURPTRNDSTCD, LOUTITEMMAXOCCURNOITM, LOUTITEMMINOCCURNOITM, + LOUTITEMBASCVAL, LOUTITEMMSKYN, LYOUTDPTCNT, DECPTLENCNT, LYOUTITEMREFPTRNIDNAME ) + VALUES ( #loutName#, #loutItemName#, #loutItemSerno#, #loutItemIDName#, #parntLoutItemIDName#, + #loutItemDesc#, #loutItemNodePtrnIDName#, #loutItemPtrnIDName#, #loutItemPathName#, #loutItemLenCnt#, + #loutItemRefInfo#, #loutItemRefInfo2#, #loutItemOccurPtrnDstcd#, #loutItemMaxOccurNoitm#, #loutItemMinOccurNoitm#, + #loutItemBascVal#, #loutItemMskYn#, #lyoutDptCnt#, #decptLenCnt#, #lyoutItemRefPtrnIDName# ) + + + + + INSERT INTO $schemaId$.TSEAITR10 + ( LOGPRCSSSEQNO, SEQNO, SERVICENAME ,COMMAND,LOUTNAME,RECVDATA,RECVAMNDHMS,PRCSSRSLT, PRCSSRSLTCMNT ) + VALUES + ( #logPrcssSeqno#, #seqno#, #serviceName# ,#command#,#loutName#,#recvData#,#recvAmndHMS#,#prcssRslt#, #prcssRsltCmnt# ) + + diff --git a/src/main/resources/com/eactive/eai/rms/onl/transaction/Layout.xml b/src/main/resources/com/eactive/eai/rms/onl/transaction/Layout.xml new file mode 100644 index 0000000..de6d0c7 --- /dev/null +++ b/src/main/resources/com/eactive/eai/rms/onl/transaction/Layout.xml @@ -0,0 +1,160 @@ + + + + + + + SELECT + LOUTNAME AS "LOUTNAME" , + LOUTPTRNNAME AS "LOUTPTRNNAME" , + LOUTDESC AS "LOUTDESC" , + LASTAMNDHMS AS "LASTAMNDHMS" , + EAIBZWKDSTCD AS "EAIBZWKDSTCD" , + UAPPLNAME AS "UAPPLNAME" , + SYSINTFACNAME AS "SYSINTFACNAME" + FROM $schemaId$.TSEAITR07 + WHERE LOUTNAME = #loutName# + + + + + DELETE FROM $schemaId$.TSEAITR07 + WHERE LOUTNAME = #loutName# + + + + + INSERT INTO $schemaId$.TSEAITR07 ( + LOUTNAME, LOUTDESC, LOUTPTRNNAME , LASTAMNDHMS , EAIBZWKDSTCD , UAPPLNAME , SYSINTFACNAME, CREATEBY, UPDATEBY + ) VALUES (#loutName#, #loutDesc#, #loutPtrnName#, #lastAmndHMS# , #eaiBzwkDstcd# , #uapplName# , #sysIntfacName#, #createBy#, #updateBy# ) + + + + + UPDATE $schemaId$.TSEAITR07 + SET LOUTDESC = #loutDesc#, + LOUTPTRNNAME= #loutPtrnName#, + LASTAMNDHMS = #lastAmndHMS#, + EAIBZWKDSTCD = #eaiBzwkDstcd#, + UAPPLNAME = #uapplName#, + SYSINTFACNAME = #sysIntfacName# , + UPDATEBY = #updateBy# + WHERE LOUTNAME = #loutName# + + + + + SELECT + L.LOUTNAME AS "LOUTNAME", + L.LOUTDESC AS "LOUTDESC", + L.LOUTPTRNNAME AS "LOUTPTRNNAME" + FROM $schemaId$.TSEAITR07 L + WHERE L.EAIBZWKDSTCD IN (select EAIBZWKDSTCD from $schemaId$.TSEAIRM06 WHERE USERID = #loginId#) + ORDER BY L.LOUTNAME + + + + + DELETE FROM $schemaId$.TSEAITR08 + WHERE LOUTNAME=#loutName# + + + + UPDATE $schemaId$.TSEAITR08 + SET LOUTITEMDESC = #loutDesc# + WHERE LOUTNAME = #loutName# + AND LOUTITEMNAME = #loutName# + AND LOUTITEMSERNO = 0 + + + + SELECT LOUTPTRNNAME AS "LOUTPTRNNAME", + LOUTPTRNDESC AS "LOUTPTRNDESC" + FROM $schemaId$.TSEAITR06 + ORDER BY LOUTPTRNDESC + + + + SELECT SV.EAISVCNAME AS "EAISVCNAME" , SV.EAISVCDESC AS "EAISVCDESC" , + TR.CNVSNNAME AS "CNVSNNAME" , TR.CNVSNDESC AS "CNVSNDESC" , TR.SOURCRSULTDSTCD AS "SOURCRSULTDSTCD" + FROM + ( SELECT T1.CNVSNNAME , T1.CNVSNDESC , + T2.LOUTNAME , T2.SOURCRSULTDSTCD + FROM $schemaId$.TSEAITR01 T1, $schemaId$.TSEAITR02 T2 + WHERE T1.CNVSNNAME = T2.CNVSNNAME + AND T2.LOUTNAME = #loutName# + ) TR, + ( + SELECT DISTINCT EAISVCNAME, EAISVCDESC, SVCPRCSSNO, CHNGMSGIDNAME FROM ( + SELECT A.EAISVCNAME, A.EAISVCDESC, B.SVCPRCSSNO, B.CHNGMSGIDNAME FROM $schemaId$.TSEAIHE01 A, $schemaId$.TSEAIHE02 B WHERE A.EAISVCNAME = B.EAISVCNAME + UNION ALL + SELECT A.EAISVCNAME, A.EAISVCDESC, B.SVCPRCSSNO, B.BASCRSPNSCHNGMSGIDNAME CHNGMSGIDNAME FROM $schemaId$.TSEAIHE01 A, $schemaId$.TSEAIHE02 B WHERE A.EAISVCNAME = B.EAISVCNAME + UNION ALL + SELECT A.EAISVCNAME, A.EAISVCDESC, B.SVCPRCSSNO, B.ERRRSPNSCHNGMSGIDNAME CHNGMSGIDNAME FROM $schemaId$.TSEAIHE01 A, $schemaId$.TSEAIHE02 B WHERE A.EAISVCNAME = B.EAISVCNAME + ) TMP + ) SV + WHERE TR.CNVSNNAME = SV.CHNGMSGIDNAME + + + + SELECT EAIBZWKDSTCD "EAIBzwkDstcd", COUNT(LOUTNAME) "Cnt" + FROM $schemaId$.TSEAITR07 + GROUP BY EAIBZWKDSTCD + + + + + SELECT + LOUTNAME AS "LOUTNAME" , + LOUTPTRNNAME AS "LOUTPTRNNAME" , + LOUTDESC AS "LOUTDESC" , + LASTAMNDHMS AS "LASTAMNDHMS" , + EAIBZWKDSTCD AS "EAIBZWKDSTCD" , + UAPPLNAME AS "UAPPLNAME" , + SYSINTFACNAME AS "SYSINTFACNAME" + FROM $schemaId$.TSEAITR07 + WHERE LOUTNAME = #loutName# + + + + DELETE FROM $schemaId$.TSEAITR07 + WHERE LOUTNAME = #loutName# + + + + INSERT INTO $schemaId$.TSEAITR07 ( LOUTNAME, LOUTPTRNNAME, LOUTDESC, LASTAMNDHMS, EAIBZWKDSTCD, UAPPLNAME, SYSINTFACNAME ) + VALUES ( #loutName#, #loutPtrnName#, #loutDesc#, #lastAmndHMS#, #eaiBzwkDstcd#, #uapplName#, #sysIntfacName# ) + + + + SELECT + LOUTNAME AS "LOUTNAME" , + LOUTITEMNAME AS "LOUTITEMNAME" , + LOUTITEMSERNO AS "LOUTITEMSERNO" , + LOUTITEMIDNAME AS "LOUTITEMIDNAME" , + PARNTLOUTITEMIDNAME AS "PARNTLOUTITEMIDNAME" , + LOUTITEMDESC AS "LOUTITEMDESC" , + LOUTITEMNODEPTRNIDNAME AS "LOUTITEMNODEPTRNIDNAME" , + LOUTITEMPTRNIDNAME AS "LOUTITEMPTRNIDNAME" , + LOUTITEMPATHNAME AS "LOUTITEMPATHNAME" , + LOUTITEMLENCNT AS "LOUTITEMLENCNT" , + LOUTITEMREFINFO AS "LOUTITEMREFINFO" , + LOUTITEMREFINFO2 AS "LOUTITEMREFINFO2" , + LOUTITEMOCCURPTRNDSTCD AS "LOUTITEMOCCURPTRNDSTCD" , + LOUTITEMMAXOCCURNOITM AS "LOUTITEMMAXOCCURNOITM" , + LOUTITEMMINOCCURNOITM AS "LOUTITEMMINOCCURNOITM" , + LOUTITEMBASCVAL AS "LOUTITEMBASCVAL" , + LOUTITEMMSKYN AS "LOUTITEMMSKYN" , + LYOUTDPTCNT AS "LYOUTDPTCNT" , + DECPTLENCNT AS "DECPTLENCNT" , + LYOUTITEMREFPTRNIDNAME AS "LYOUTITEMREFPTRNIDNAME" + FROM $schemaId$.TSEAITR08 + WHERE LOUTNAME = #loutName# + + + + DELETE FROM $schemaId$.TSEAITR08 + WHERE LOUTNAME = #loutName# + + + diff --git a/src/test/java/com/eactive/eai/rms/onl/manage/rule/layoutsync/LayoutSyncControllerTest.java b/src/test/java/com/eactive/eai/rms/onl/manage/rule/layoutsync/LayoutSyncControllerTest.java new file mode 100644 index 0000000..2b7ab07 --- /dev/null +++ b/src/test/java/com/eactive/eai/rms/onl/manage/rule/layoutsync/LayoutSyncControllerTest.java @@ -0,0 +1,59 @@ +package com.eactive.eai.rms.onl.manage.rule.layoutsync; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.web.client.RestTemplate; + +import static org.junit.jupiter.api.Assertions.*; + +/** + * LayoutSyncController 통합 테스트 실제 localhost:28080으로 HTTP 요청을 보냅니다. + */ +class LayoutSyncControllerTest { + + private static final String BASE_URL = "http://localhost:28080/monitoring/layoutSync.do"; + private RestTemplate restTemplate; + + @BeforeEach + void setUp() { + restTemplate = new RestTemplate(); + } + + @Test + void testParseMessage() { + String layoutId = "URP_DRA00357321URP_CBSS"; + String requestXml = "
MessageSyncinsert
" + + layoutId + "" + + "" + + "]]>" + + "
"; + + // ===================================== + + String url = BASE_URL + "?cmd=Message&schema=APIGW"; + + // HTTP 헤더 설정 + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_XML); + + // 요청 생성 + HttpEntity request = new HttpEntity<>(requestXml, headers); + + // POST 요청 전송 + ResponseEntity response = restTemplate.exchange(url, HttpMethod.POST, request, String.class); + + // 응답 출력 + System.out.println("=== Status Code: " + response.getStatusCodeValue()); + System.out.println("=== Response Body ==="); + System.out.println(response.getBody()); + + // 기본 검증 + assertNotNull(response); + assertEquals(200, response.getStatusCodeValue()); + } +}