diff --git a/WebContent/jsp/onl/transaction/tracking/trackingMan.jsp b/WebContent/jsp/onl/transaction/tracking/trackingMan.jsp
index a9d0880..b25f31b 100644
--- a/WebContent/jsp/onl/transaction/tracking/trackingMan.jsp
+++ b/WebContent/jsp/onl/transaction/tracking/trackingMan.jsp
@@ -260,6 +260,59 @@
}
+ // 처리결과: ERRYN='Y'면 에러, 업무(BIZ) 오류코드(ERRCODE_BIZ)면 오류, 나머지는 성공
+ // 단, SEQ(LOGPRCSSSERNO) 100/200은 아직 처리 완료 전 단계라 에러/오류가 아니면(=성공이면) 표시하지 않는다
+ function computePrcsResult(errYn, eaiErrCd, logPrcssSerno) {
+ var isBizErr = eaiErrCd != null && bizErrCodeSet.has(String(eaiErrCd).trim());
+
+ // ERRYN은 EAIERRCTNT(에러내용)만 보고 Y/N을 매기므로 업무(BIZ) 오류도 Y가 된다.
+ // isBizErr을 먼저 봐야 업무오류가 "에러"로 잘못 표시되지 않는다.
+ if (isBizErr) {
+ return "오류";
+ } else if (errYn == "Y") {
+ return "실패";
+ } else if (logPrcssSerno == "100" || logPrcssSerno == "200") {
+ return "";
+ } else {
+ return "성공";
+ }
+ }
+
+ // 같은 거래(EAISVCSERNO)의 400(응답)이 에러/오류면 300(요청)의 "성공" 표시를 지운다.
+ // jqGrid의 getCell/setCell은 formatter 결과가 아니라 원본 데이터를 읽고 쓰는데, PRCS_RESULT_TMP는
+ // 서버 데이터에 없는 가상 컬럼이라 그 방식으로는 행 간 보정이 반영되지 않는다(직접 확인됨).
+ // 그래서 grid가 원본 JSON을 받는 시점(beforeProcessing)에 각 행에 PRCS_RESULT_TMP 값을 미리 계산해
+ // 박아두고, formatter는 그 값을 그대로 꺼내 쓰기만 한다.
+ function applyPrcsResult(rows) {
+ var byEaiSvcSerno = {};
+ rows.forEach(function (row) {
+ var key = row.EAISVCSERNO;
+ (byEaiSvcSerno[key] = byEaiSvcSerno[key] || []).push(row);
+ });
+
+ rows.forEach(function (row) {
+ var result = computePrcsResult(row.ERRYN, row.EAIERRCD, row.LOGPRCSSSERNO);
+
+ if (row.LOGPRCSSSERNO == "300" && result == "성공") {
+ var siblings = byEaiSvcSerno[row.EAISVCSERNO] || [];
+ var has400Error = siblings.some(function (sib) {
+ if (sib.LOGPRCSSSERNO != "400") return false;
+ var sibResult = computePrcsResult(sib.ERRYN, sib.EAIERRCD, "400");
+ return sibResult == "실패" || sibResult == "오류";
+ });
+ if (has400Error) {
+ result = "";
+ }
+ }
+
+ row.PRCS_RESULT_TMP = result;
+ });
+ }
+
+ function prcsResultFormatter(cellvalue, options, rowObject) {
+ return rowObject.PRCS_RESULT_TMP || "";
+ }
+
$(document).ready(function () {
console.log(roleString);
@@ -306,7 +359,8 @@
'<%=localeMessage.getString("tracking.telgmrecvtrancd")%>',
'<%= localeMessage.getString("eaiMessage.eaiSvcName")%>',
'<%= localeMessage.getString("eaiMessage.eaiSvcDesc")%>',
- '<%=localeMessage.getString("tracking.eaibzwkdstcd")%>',
+ '업무명',
+ '처리결과',
'<%=localeMessage.getString("tracking.extBizName")%>',
'<%=localeMessage.getString("tracking.ifDisKeyVal")%>',
'APP 명',
@@ -330,14 +384,15 @@
{name: 'ERRYN', hidden: true},
{name: 'TRACKASISKEY1CTNT', hidden: true},
{name: 'TRACKASISKEY2CTNT', hidden: true},
-
- {name: 'EAISVCSERNO_TMP', align: 'left', width: '220', formatter: trimFormatter},
+
+ {name: 'EAISVCSERNO_TMP', align: 'left', width: '120', formatter: trimFormatter},
{name: 'KEYMGTMSGCTNT', align: 'left', width: '300'},
{name: 'LOGPRCSSSERNO_TMP', align: 'center', width: '40'},
{name: 'TELGMRECVTRANCD', align: 'left', width: '135', hidden: true},
{name: 'EAISVCNAME', align: 'left', width: '160'},
{name: 'EAISVCDESC', align: 'left', width: '280'},
{name: 'EAIBZWKDSTCD_TMP', align: 'center', width: '50'},
+ {name: 'PRCS_RESULT_TMP', align: 'center', width: '60', formatter: prcsResultFormatter},
{name: 'EXTBIZCD', align: 'center', width: '50', hidden: isApiGw},
{name: 'REFKEY', align: 'left', width: '280', hidden: isApiGw},
{name: 'CLIENTNAME', align: 'left', width: '120', hidden: !isApiGw},
@@ -356,6 +411,9 @@
jsonReader: {
repeatitems: false
},
+ beforeProcessing: function (data) {
+ applyPrcsResult(data.rows || []);
+ },
rowNum: 10000,
height: '520',
viewrecords: true,
@@ -394,21 +452,18 @@
var uniqueCount = calculateUniqueLogCount("#grid");
updateLogCountDisplay(uniqueCount, displayedLogs, totalLogs);
- //에러 행 색상 표시
+ //에러 행 색상 표시 (업무(BIZ) 오류는 배경색을 칠하지 않는다)
var rows = $(this).getDataIDs();
for (var i = 0; i < rows.length; i++) {
var errYn = $("#grid").getCell(rows[i], 'ERRYN');
var eaiErrCd = $("#grid").getCell(rows[i], 'EAIERRCD');
var isBizErr = eaiErrCd != null && bizErrCodeSet.has(String(eaiErrCd).trim());
- if (isBizErr) {
- // 업무(BIZ) 오류코드(ERRCODE_BIZ) - 하늘색 배경
- $("#" + rows[i]).find("td").css("background-color", "#BEEDFF");
- } else if (errYn == "Y") {
+ if (errYn == "Y" && !isBizErr) {
$("#" + rows[i]).find("td").css("background-color", "#FFCC99");
}
}
-
+
$("#grid").tuiTableRowSpan("7");
//1000건이상 alert
@@ -627,8 +682,9 @@
<%=localeMessage.getString("tracking.logtype")%> |
-
+
+
|
diff --git a/src/main/java/com/eactive/eai/rms/data/entity/onl/logger/EAILogRepositoryImpl.java b/src/main/java/com/eactive/eai/rms/data/entity/onl/logger/EAILogRepositoryImpl.java
index 78e103c..0fd1688 100644
--- a/src/main/java/com/eactive/eai/rms/data/entity/onl/logger/EAILogRepositoryImpl.java
+++ b/src/main/java/com/eactive/eai/rms/data/entity/onl/logger/EAILogRepositoryImpl.java
@@ -194,7 +194,11 @@ public class EAILogRepositoryImpl implements EAILogRepository {
// query.where(qeaiLog.eaierrcd.trim().isNotEmpty());
// }
- if (StringUtils.equalsIgnoreCase(eaiLogSearch.getSearchErrorYn(), "Y")) {
+ // Y: 에러로그(시스템 에러, ERRCODE_BIZ 제외) / B: 오류로그(업무오류, ERRCODE_BIZ만)
+ boolean searchErrLog = StringUtils.equalsIgnoreCase(eaiLogSearch.getSearchErrorYn(), "Y");
+ boolean searchBizErrLog = StringUtils.equalsIgnoreCase(eaiLogSearch.getSearchErrorYn(), "B");
+
+ if (searchErrLog || searchBizErrLog) {
// 에러 로그가 있는 eaisevrinstncname을 찾는 서브쿼리
// entityPathBase를 사용하여 동적 테이블에 대한 서브쿼리 생성
JPAQuery errorInstancesSubQuery = new JPAQueryFactory(em)
@@ -206,12 +210,17 @@ public class EAILogRepositoryImpl implements EAILogRepository {
qeaiLog.eaierrcd.trim().isNotEmpty()
);
- // ERRCODE_BIZ(업무 오류) 코드는 시스템 에러가 아니므로 "에러로그" 검색 대상에서 제외
List bizErrCodes = codeService.findByIdCodegroup(ERRCODE_BIZ_GROUP).stream()
.map(code -> code.getId().getCode())
.collect(Collectors.toList());
- if (!bizErrCodes.isEmpty()) {
+ if (searchBizErrLog) {
+ // 오류로그: 업무오류(ERRCODE_BIZ) 코드만
+ errorInstancesSubQuery.where(bizErrCodes.isEmpty()
+ ? qeaiLog.eaierrcd.isNull().and(qeaiLog.eaierrcd.isNotNull()) // 등록된 업무오류 코드가 없으면 결과 없음
+ : qeaiLog.eaierrcd.in(bizErrCodes));
+ } else if (!bizErrCodes.isEmpty()) {
+ // 에러로그: ERRCODE_BIZ(업무 오류) 코드는 시스템 에러가 아니므로 제외
errorInstancesSubQuery.where(qeaiLog.eaierrcd.notIn(bizErrCodes));
}
diff --git a/src/main/java/com/eactive/eai/rms/onl/transaction/tracking/DbTrackingService.java b/src/main/java/com/eactive/eai/rms/onl/transaction/tracking/DbTrackingService.java
index c5d5399..7d338cc 100644
--- a/src/main/java/com/eactive/eai/rms/onl/transaction/tracking/DbTrackingService.java
+++ b/src/main/java/com/eactive/eai/rms/onl/transaction/tracking/DbTrackingService.java
@@ -7,6 +7,7 @@ import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
@@ -399,8 +400,13 @@ public class DbTrackingService extends BaseService {
public List