업무오류는 오류건수 집계에서 제외 & 로그조회에서 하늘색 배경색 표시
eapim-admin CI / build (push) Has been cancelled

This commit is contained in:
eastargh
2026-08-26 13:49:12 +09:00
parent 9df39e74bd
commit e69e1a1031
5 changed files with 52 additions and 13 deletions
@@ -24,6 +24,7 @@
var roleString = "<%=SessionManager.getRoleIdString(request)%>"; var roleString = "<%=SessionManager.getRoleIdString(request)%>";
let totalLogs = 0; let totalLogs = 0;
let displayedLogs = 0; let displayedLogs = 0;
var bizErrCodeSet = new Set(); // ERRCODE_BIZ(업무 오류) 코드 목록 - 그리드 배경색 구분용
function adminChk() { function adminChk() {
var arrRoleID = roleString.split(','); var arrRoleID = roleString.split(',');
@@ -106,6 +107,8 @@
new makeOptions("CODE", "NAME").setObj($("select[name=searchExtBizCd]")).setNoValueInclude(true).setNoValue("", "전체").setData(json.extBizList).setFormat(codeName3OptionFormat).rendering(); new makeOptions("CODE", "NAME").setObj($("select[name=searchExtBizCd]")).setNoValueInclude(true).setNoValue("", "전체").setData(json.extBizList).setFormat(codeName3OptionFormat).rendering();
new makeOptions("CODE", "NAME").setObj($("select[name=searchLogPrcssSerno]")).setNoValueInclude(true).setNoValue("", "전체").setData(json.logPrcssSernoList).rendering(); new makeOptions("CODE", "NAME").setObj($("select[name=searchLogPrcssSerno]")).setNoValueInclude(true).setNoValue("", "전체").setData(json.logPrcssSernoList).rendering();
bizErrCodeSet = new Set((json.bizErrCodeList || []).map(function (c) { return c.CODE; }));
setSearchable("searchEaiBzwkDstcd"); // 콤보에 searchable 설정 setSearchable("searchEaiBzwkDstcd"); // 콤보에 searchable 설정
setSearchable("searchExtBizCd"); setSearchable("searchExtBizCd");
@@ -311,7 +314,8 @@
'<%=localeMessage.getString("tracking.companyitcontactname")%>', '<%=localeMessage.getString("tracking.companyitcontactname")%>',
'<%=localeMessage.getString("tracking.companyitcontacttelno")%>', '<%=localeMessage.getString("tracking.companyitcontacttelno")%>',
'<%=localeMessage.getString("tracking.itcontactpointperson1")%>', '<%=localeMessage.getString("tracking.itcontactpointperson1")%>',
'<%=localeMessage.getString("tracking.bzwkcontactperson")%>' '<%=localeMessage.getString("tracking.bzwkcontactperson")%>',
'EAIERRCD'
], ],
colModel: [ colModel: [
{name: 'EAISVCSERNO', hidden: true}, {name: 'EAISVCSERNO', hidden: true},
@@ -341,7 +345,8 @@
{name: 'COMPANYITCONTACTNAME', align: 'left', width: '110', hidden: true}, {name: 'COMPANYITCONTACTNAME', align: 'left', width: '110', hidden: true},
{name: 'COMPANYITCONTACTTELNO', align: 'left', width: '120', hidden: true}, {name: 'COMPANYITCONTACTTELNO', align: 'left', width: '120', hidden: true},
{name: 'ITCONTACTPOINTPERSON1', align: 'left', width: '120', hidden: true}, {name: 'ITCONTACTPOINTPERSON1', align: 'left', width: '120', hidden: true},
{name: 'BZWKCONTACTPERSON', align: 'left', width: '120', hidden: true} {name: 'BZWKCONTACTPERSON', align: 'left', width: '120', hidden: true},
{name: 'EAIERRCD', hidden: true}
], ],
jsonReader: { jsonReader: {
repeatitems: false repeatitems: false
@@ -378,7 +383,7 @@
}, },
loadComplete: function (d) { loadComplete: function (d) {
$("#grid").tuiTableRowSpan("7");
// 거래 건수 표시 // 거래 건수 표시
var uniqueCount = calculateUniqueLogCount("#grid"); var uniqueCount = calculateUniqueLogCount("#grid");
@@ -387,11 +392,19 @@
//에러 행 색상 표시 //에러 행 색상 표시
var rows = $(this).getDataIDs(); var rows = $(this).getDataIDs();
for (var i = 0; i < rows.length; i++) { for (var i = 0; i < rows.length; i++) {
var val = $("#grid").getCell(rows[i], 'ERRYN'); var errYn = $("#grid").getCell(rows[i], 'ERRYN');
if (val == "Y") { 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") {
$("#" + rows[i]).find("td").css("background-color", "#FFCC99"); $("#" + rows[i]).find("td").css("background-color", "#FFCC99");
} }
} }
$("#grid").tuiTableRowSpan("7");
//1000건이상 alert //1000건이상 alert
if (d.records == 1000) { if (d.records == 1000) {
@@ -19,7 +19,8 @@ public class EAILogDto {
public EAILogDto(EAILogId eaiLogId, String trackasiskey1ctnt, String trackasiskey2ctnt, String keymgtmsgctnt, public EAILogDto(EAILogId eaiLogId, String trackasiskey1ctnt, String trackasiskey2ctnt, String keymgtmsgctnt,
String eaisvcname, String extbizcd, String refkey, String clientname, String eaisvcname, String extbizcd, String refkey, String clientname,
String orgname, String msgprcssyms, String companycode, String eaierrctnt, String eaiSvcDesc) { String orgname, String msgprcssyms, String companycode, String eaierrctnt,
String eaierrcd, String eaiSvcDesc) {
this.eaiLog = new EAILog(); this.eaiLog = new EAILog();
this.eaiLog.setId(eaiLogId); this.eaiLog.setId(eaiLogId);
this.eaiLog.setTrackasiskey1ctnt(trackasiskey1ctnt); this.eaiLog.setTrackasiskey1ctnt(trackasiskey1ctnt);
@@ -33,6 +34,7 @@ public class EAILogDto {
this.eaiLog.setMsgprcssyms(msgprcssyms); this.eaiLog.setMsgprcssyms(msgprcssyms);
this.eaiLog.setCompanycode(companycode); this.eaiLog.setCompanycode(companycode);
this.eaiLog.setEaierrctnt(eaierrctnt); this.eaiLog.setEaierrctnt(eaierrctnt);
this.eaiLog.setEaierrcd(eaierrcd);
this.eaiSvcDesc = eaiSvcDesc; this.eaiSvcDesc = eaiSvcDesc;
} }
} }
@@ -5,6 +5,7 @@ import com.eactive.eai.data.entity.onl.logger.EAILogId;
import com.eactive.eai.data.entity.onl.logger.QEAILog; import com.eactive.eai.data.entity.onl.logger.QEAILog;
import com.eactive.eai.data.entity.onl.message.QEAIMessageEntity; import com.eactive.eai.data.entity.onl.message.QEAIMessageEntity;
import com.eactive.eai.rms.data.entity.onl.bzwkdstcd.QUserBusiness; import com.eactive.eai.rms.data.entity.onl.bzwkdstcd.QUserBusiness;
import com.eactive.eai.rms.data.entity.onl.code.CodeService;
import com.querydsl.core.Tuple; import com.querydsl.core.Tuple;
import com.querydsl.core.types.Projections; import com.querydsl.core.types.Projections;
import com.querydsl.core.types.dsl.BooleanExpression; import com.querydsl.core.types.dsl.BooleanExpression;
@@ -12,6 +13,7 @@ import com.querydsl.core.types.dsl.EntityPathBase;
import com.querydsl.jpa.impl.JPAQuery; import com.querydsl.jpa.impl.JPAQuery;
import com.querydsl.jpa.impl.JPAQueryFactory; import com.querydsl.jpa.impl.JPAQueryFactory;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page; import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl; import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Pageable;
@@ -27,8 +29,15 @@ import java.util.stream.Collectors;
@Repository @Repository
public class EAILogRepositoryImpl implements EAILogRepository { public class EAILogRepositoryImpl implements EAILogRepository {
// 업무(BIZ) 오류코드 그룹 - 해당 코드는 시스템 에러가 아닌 정상적인 업무 거부 응답이므로
// "에러로그" 검색 조건에서는 제외한다.
private static final String ERRCODE_BIZ_GROUP = "ERRCODE_BIZ";
private EntityManager em; private EntityManager em;
@Autowired
private CodeService codeService;
@PersistenceContext @PersistenceContext
public void setEm(EntityManager em) { public void setEm(EntityManager em) {
this.em = em; this.em = em;
@@ -57,7 +66,7 @@ public class EAILogRepositoryImpl implements EAILogRepository {
qeaiLog.id, qeaiLog.trackasiskey1ctnt, qeaiLog.trackasiskey2ctnt, qeaiLog.keymgtmsgctnt, qeaiLog.id, qeaiLog.trackasiskey1ctnt, qeaiLog.trackasiskey2ctnt, qeaiLog.keymgtmsgctnt,
qeaiLog.eaisvcname, qeaiLog.extbizcd, qeaiLog.refkey, qeaiLog.clientname, qeaiLog.eaisvcname, qeaiLog.extbizcd, qeaiLog.refkey, qeaiLog.clientname,
qeaiLog.orgname, qeaiLog.msgprcssyms, qeaiLog.companycode, qeaiLog.eaierrctnt, qeaiLog.orgname, qeaiLog.msgprcssyms, qeaiLog.companycode, qeaiLog.eaierrctnt,
qeaiMessageEntity.eaisvcdesc)) qeaiLog.eaierrcd, qeaiMessageEntity.eaisvcdesc))
.from(entityPathBase) .from(entityPathBase)
.leftJoin(qeaiMessageEntity) .leftJoin(qeaiMessageEntity)
.on(qeaiLog.eaisvcname.eq(qeaiMessageEntity.eaisvcname)) .on(qeaiLog.eaisvcname.eq(qeaiMessageEntity.eaisvcname))
@@ -195,8 +204,18 @@ public class EAILogRepositoryImpl implements EAILogRepository {
.between(eaiLogSearch.getSearchStartTime(), eaiLogSearch.getSearchEndTime())) .between(eaiLogSearch.getSearchStartTime(), eaiLogSearch.getSearchEndTime()))
.where( .where(
qeaiLog.eaierrcd.trim().isNotEmpty() qeaiLog.eaierrcd.trim().isNotEmpty()
) );
.distinct();
// ERRCODE_BIZ(업무 오류) 코드는 시스템 에러가 아니므로 "에러로그" 검색 대상에서 제외
List<String> bizErrCodes = codeService.findByIdCodegroup(ERRCODE_BIZ_GROUP).stream()
.map(code -> code.getId().getCode())
.collect(Collectors.toList());
if (!bizErrCodes.isEmpty()) {
errorInstancesSubQuery.where(qeaiLog.eaierrcd.notIn(bizErrCodes));
}
errorInstancesSubQuery.distinct();
// 찾은 eaisevrinstncname에 해당하는 모든 로그 조회 // 찾은 eaisevrinstncname에 해당하는 모든 로그 조회
query.where(qeaiLog.id.eaisvcserno.in(errorInstancesSubQuery)); query.where(qeaiLog.id.eaisvcserno.in(errorInstancesSubQuery));
@@ -126,9 +126,9 @@ public class ApiStatsHourlyAggregationJob implements Job {
" , API_NAME, GW_INSTANCE_ID, BIZ_DIV_CODE, NVL(A.CLIENT_ID, 'NONE')" + " , API_NAME, GW_INSTANCE_ID, BIZ_DIV_CODE, NVL(A.CLIENT_ID, 'NONE')" +
" , INBOUND_ADAPTER, OUTBOUND_ADAPTER" + " , INBOUND_ADAPTER, OUTBOUND_ADAPTER" +
" , COUNT(EAISVCSERNO)" + " , COUNT(EAISVCSERNO)" +
" , SUM(CASE WHEN A.ERROR_CODE IS NULL AND E400 IS NOT NULL THEN 1 ELSE 0 END)" + " , SUM(CASE WHEN (A.ERROR_CODE IS NULL OR C.CODE IS NOT NULL) AND E400 IS NOT NULL THEN 1 ELSE 0 END)" +
" , SUM(CASE WHEN B.CODE IS NOT NULL THEN 1 ELSE 0 END)" + " , SUM(CASE WHEN B.CODE IS NOT NULL THEN 1 ELSE 0 END)" +
" , SUM(CASE WHEN (A.E400 IS NULL OR A.ERROR_CODE IS NOT NULL) AND B.CODE IS NULL THEN 1 ELSE 0 END)" + " , SUM(CASE WHEN (A.E400 IS NULL OR A.ERROR_CODE IS NOT NULL) AND B.CODE IS NULL AND C.CODE IS NULL THEN 1 ELSE 0 END)" +
" , 0, 0, 0, 0" + " , 0, 0, 0, 0" +
" , TRUNC(AVG(RESP_TIME)), MIN(RESP_TIME), MAX(RESP_TIME), 0, 0" + " , TRUNC(AVG(RESP_TIME)), MIN(RESP_TIME), MAX(RESP_TIME), 0, 0" +
" FROM (" + " FROM (" +
@@ -145,10 +145,11 @@ public class ApiStatsHourlyAggregationJob implements Job {
" ) AS RESP_TIME" + " ) AS RESP_TIME" +
" , MAX(CASE WHEN LOGPRCSSSERNO = '400' THEN LOGPRCSSSERNO ELSE '' END) AS E400" + " , MAX(CASE WHEN LOGPRCSSSERNO = '400' THEN LOGPRCSSSERNO ELSE '' END) AS E400" +
" , MAX(EAIERRCD) AS ERROR_CODE" + " , MAX(EAIERRCD) AS ERROR_CODE" +
" FROM " + logTableName + " FROM " + logTableName + " A " +
" WHERE MSGDPSTYMS >= :rangeStart AND MSGDPSTYMS < :rangeEnd" + " WHERE MSGDPSTYMS >= :rangeStart AND MSGDPSTYMS < :rangeEnd" +
" GROUP BY EAISVCSERNO" + " GROUP BY EAISVCSERNO" +
" ) A LEFT OUTER JOIN TSEAICM20 B ON A.ERROR_CODE = B.CODE AND B.CODEGROUP = 'ERRCODE_TIMEOUT' AND B.USEYN = 'Y' " + " ) A LEFT OUTER JOIN TSEAICM20 B ON A.ERROR_CODE = B.CODE AND B.CODEGROUP = 'ERRCODE_TIMEOUT' AND B.USEYN = 'Y' " +
" LEFT OUTER JOIN TSEAICM20 C ON A.ERROR_CODE = C.CODE AND C.CODEGROUP = 'ERRCODE_BIZ' AND C.USEYN = 'Y' " +
" GROUP BY SUBSTR(DT,1,10), API_NAME, GW_INSTANCE_ID, BIZ_DIV_CODE, NVL(A.CLIENT_ID, 'NONE')" + " GROUP BY SUBSTR(DT,1,10), API_NAME, GW_INSTANCE_ID, BIZ_DIV_CODE, NVL(A.CLIENT_ID, 'NONE')" +
" , INBOUND_ADAPTER, OUTBOUND_ADAPTER"; " , INBOUND_ADAPTER, OUTBOUND_ADAPTER";
@@ -426,10 +426,14 @@ public class DbTrackingService extends BaseService {
List<ComboVo> listLogPrcssSerno = comboService List<ComboVo> listLogPrcssSerno = comboService
.getFromCode("LOGPRCSSSERNO_TYPE"); .getFromCode("LOGPRCSSSERNO_TYPE");
// 업무(BIZ) 오류코드 목록 - 그리드에서 별도 배경색으로 표시하기 위함
List<ComboVo> bizErrCodeList = comboService.getFromCode("ERRCODE_BIZ");
Map<String, List<ComboVo>> map = new HashMap<>(); Map<String, List<ComboVo>> map = new HashMap<>();
map.put("eaiBizList", bizList); map.put("eaiBizList", bizList);
map.put("extBizList", extBizList); map.put("extBizList", extBizList);
map.put("logPrcssSernoList", listLogPrcssSerno); map.put("logPrcssSernoList", listLogPrcssSerno);
map.put("bizErrCodeList", bizErrCodeList);
return map; return map;
} }