|
|
|
@@ -10,9 +10,6 @@ import javax.persistence.EntityManager;
|
|
|
|
|
import javax.persistence.PersistenceContext;
|
|
|
|
|
import javax.persistence.Query;
|
|
|
|
|
|
|
|
|
|
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;
|
|
|
|
|
|
|
|
|
@@ -33,23 +30,6 @@ public class ApiUseStatsService
|
|
|
|
|
@PersistenceContext
|
|
|
|
|
private EntityManager entityManager;
|
|
|
|
|
|
|
|
|
|
@SuppressWarnings("unchecked")
|
|
|
|
|
public Page<ApiStatsUI> selectList(ApiStatsSearch search, Pageable pageable) {
|
|
|
|
|
Query dataQuery = getDataQuery(search);
|
|
|
|
|
dataQuery.setFirstResult((int) pageable.getOffset());
|
|
|
|
|
dataQuery.setMaxResults(pageable.getPageSize());
|
|
|
|
|
|
|
|
|
|
List<Object[]> rows = dataQuery.getResultList();
|
|
|
|
|
List<ApiStatsUI> results = rows.stream()
|
|
|
|
|
.map(this::toVO)
|
|
|
|
|
.collect(Collectors.toList());
|
|
|
|
|
|
|
|
|
|
long records = rows.size() > 0 ? StringUtils.toLong(rows.get(0)[0]) : 0;
|
|
|
|
|
|
|
|
|
|
return new PageImpl<>(results, pageable, records);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@SuppressWarnings("unchecked")
|
|
|
|
|
public List<ApiStatsUI> selectList(ApiStatsSearch search) {
|
|
|
|
|
Query dataQuery = getDataQuery(search);
|
|
|
|
@@ -59,15 +39,65 @@ public class ApiUseStatsService
|
|
|
|
|
.collect(Collectors.toList());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 하단 합계(Total)행 조회 (grid footer 용, 그룹핑 없이 전체 집계)
|
|
|
|
|
*/
|
|
|
|
|
@SuppressWarnings("unchecked")
|
|
|
|
|
public ApiStatsUI selectTotal(ApiStatsSearch search) {
|
|
|
|
|
Query totalQuery = getTotalQuery(search);
|
|
|
|
|
List<Object[]> rows = totalQuery.getResultList();
|
|
|
|
|
return rows.isEmpty() ? null : toVO(rows.get(0));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private Query getDataQuery(ApiStatsSearch search) {
|
|
|
|
|
|
|
|
|
|
StringBuilder where = buildNativeWhere(search);
|
|
|
|
|
|
|
|
|
|
String dataSql = "";
|
|
|
|
|
if ("ORG".equals(search.getSearchType())) {
|
|
|
|
|
dataSql = "SELECT COUNT(*) OVER () AS RECORDS "
|
|
|
|
|
+ ", NVL(B.ORGNAME, D.ORG_NAME) AS ORGNAME"
|
|
|
|
|
+ ", SUM(A.TOTAL_CNT)"
|
|
|
|
|
dataSql = "SELECT NVL(B.ORGNAME, D.ORG_NAME) AS ORGNAME";
|
|
|
|
|
dataSql += getCommonQuery(search);
|
|
|
|
|
dataSql += " GROUP BY NVL(B.ORGNAME, D.ORG_NAME)";
|
|
|
|
|
dataSql += " ORDER BY ORGNAME";
|
|
|
|
|
}
|
|
|
|
|
else if ("API".equals(search.getSearchType())) {
|
|
|
|
|
dataSql = "SELECT A.API_NAME ";
|
|
|
|
|
dataSql += getCommonQuery(search);
|
|
|
|
|
dataSql += " GROUP BY A.API_NAME";
|
|
|
|
|
dataSql += " ORDER BY API_NAME";
|
|
|
|
|
}
|
|
|
|
|
else if ("DATE".equals(search.getSearchType())) {
|
|
|
|
|
dataSql = "SELECT TO_CHAR(STAT_TIME,'YYYY-MM-DD') AS STAT_TIME ";
|
|
|
|
|
dataSql += getCommonQuery(search);
|
|
|
|
|
dataSql += " GROUP BY TO_CHAR(STAT_TIME,'YYYY-MM-DD')";
|
|
|
|
|
dataSql += " ORDER BY STAT_TIME";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Query dataQuery = entityManager.createNativeQuery(dataSql);
|
|
|
|
|
bindParams(dataQuery, search);
|
|
|
|
|
return dataQuery;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private Query getTotalQuery(ApiStatsSearch search) {
|
|
|
|
|
StringBuilder where = buildNativeWhere(search);
|
|
|
|
|
|
|
|
|
|
String totalSql;
|
|
|
|
|
totalSql = "SELECT '합계' AS ORGNAME ";
|
|
|
|
|
totalSql += getCommonQuery(search);
|
|
|
|
|
|
|
|
|
|
Query totalQuery = entityManager.createNativeQuery(totalSql);
|
|
|
|
|
bindParams(totalQuery, search);
|
|
|
|
|
return totalQuery;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private String getCommonQuery(ApiStatsSearch search) {
|
|
|
|
|
|
|
|
|
|
String dataSql = ", SUM(A.TOTAL_CNT)"
|
|
|
|
|
+ ", SUM(A.SUCCESS_CNT)"
|
|
|
|
|
+ ", CASE WHEN SUM(A.TOTAL_CNT) > 0 THEN SUM(A.SUCCESS_CNT) * 100 / SUM(A.TOTAL_CNT) ELSE NULL END"
|
|
|
|
|
+ ", CASE WHEN SUM(A.TOTAL_CNT) > 0 THEN (SUM(A.TOTAL_CNT) - SUM(A.SUCCESS_CNT)) * 100 / SUM(A.TOTAL_CNT) ELSE NULL END"
|
|
|
|
@@ -87,7 +117,7 @@ public class ApiUseStatsService
|
|
|
|
|
+ " , A.SYSTEM_ERR_CNT"
|
|
|
|
|
+ " , A.MIN_RESP_TIME"
|
|
|
|
|
+ " , A.MAX_RESP_TIME"
|
|
|
|
|
+ " , CASE WHEN API_NAME LIKE '%1' THEN SUBSTR(INBOUND_ADAPTER,2,3) ELSE SUBSTR(OUTBOUND_ADAPTER,2,3) END AS ORG_CODE"
|
|
|
|
|
+ " , CASE WHEN API_NAME LIKE '%1' THEN SUBSTR(OUTBOUND_ADAPTER,2,3) ELSE SUBSTR(INBOUND_ADAPTER,2,3) END AS ORG_CODE"
|
|
|
|
|
+ " FROM API_STATS_DAY A "
|
|
|
|
|
+ " WHERE A.STAT_TIME >= :searchStartDate "
|
|
|
|
|
+ " AND A.STAT_TIME <= :searchEndDate ";
|
|
|
|
@@ -105,80 +135,40 @@ public class ApiUseStatsService
|
|
|
|
|
if (StringUtils.isNotBlank(search.getSearchOrgName())) {
|
|
|
|
|
dataSql += " AND UPPER(NVL(B.ORGNAME, D.ORG_NAME)) LIKE :searchOrgName ";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
dataSql += " GROUP BY NVL(B.ORGNAME, D.ORG_NAME)"
|
|
|
|
|
+ " ORDER BY ORGNAME";
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
else if ("API".equals(search.getSearchType())) {
|
|
|
|
|
dataSql = "SELECT COUNT(*) OVER () AS RECORDS "
|
|
|
|
|
+ ", A.API_NAME"
|
|
|
|
|
+ ", SUM(A.TOTAL_CNT)"
|
|
|
|
|
+ ", SUM(A.SUCCESS_CNT)"
|
|
|
|
|
+ ", CASE WHEN SUM(A.TOTAL_CNT) > 0 THEN SUM(A.SUCCESS_CNT) * 100 / SUM(A.TOTAL_CNT) ELSE NULL END"
|
|
|
|
|
+ ", CASE WHEN SUM(A.TOTAL_CNT) > 0 THEN (SUM(A.TOTAL_CNT) - SUM(A.SUCCESS_CNT)) * 100 / SUM(A.TOTAL_CNT) ELSE NULL END"
|
|
|
|
|
+ ", SUM(A.TIMEOUT_CNT)"
|
|
|
|
|
+ ", SUM(A.SYSTEM_ERR_CNT)"
|
|
|
|
|
+ ", CASE WHEN SUM(A.TOTAL_CNT) > 0 THEN TRUNC(SUM(A.TOTAL_CNT * A.AVG_RESP_TIME) / SUM(A.TOTAL_CNT)) ELSE NULL END"
|
|
|
|
|
+ ", MIN(A.MIN_RESP_TIME)"
|
|
|
|
|
+ ", MAX(A.MAX_RESP_TIME)"
|
|
|
|
|
+ " FROM API_STATS_DAY A "
|
|
|
|
|
+ " LEFT OUTER JOIN TSEAIAU01 B ON A.CLIENT_ID = B.CLIENTID"
|
|
|
|
|
+ where
|
|
|
|
|
+ " GROUP BY A.API_NAME"
|
|
|
|
|
+ " ORDER BY API_NAME";
|
|
|
|
|
}
|
|
|
|
|
else if ("DATE".equals(search.getSearchType())) {
|
|
|
|
|
dataSql = "SELECT COUNT(*) OVER () AS RECORDS "
|
|
|
|
|
+ ", TO_CHAR(STAT_TIME,'YYYY-MM-DD') AS STAT_TIME "
|
|
|
|
|
+ ", SUM(A.TOTAL_CNT)"
|
|
|
|
|
+ ", SUM(A.SUCCESS_CNT)"
|
|
|
|
|
+ ", CASE WHEN SUM(A.TOTAL_CNT) > 0 THEN SUM(A.SUCCESS_CNT) * 100 / SUM(A.TOTAL_CNT) ELSE NULL END"
|
|
|
|
|
+ ", CASE WHEN SUM(A.TOTAL_CNT) > 0 THEN (SUM(A.TOTAL_CNT) - SUM(A.SUCCESS_CNT)) * 100 / SUM(A.TOTAL_CNT) ELSE NULL END"
|
|
|
|
|
+ ", SUM(A.TIMEOUT_CNT)"
|
|
|
|
|
+ ", SUM(A.SYSTEM_ERR_CNT)"
|
|
|
|
|
+ ", CASE WHEN SUM(A.TOTAL_CNT) > 0 THEN TRUNC(SUM(A.TOTAL_CNT * A.AVG_RESP_TIME) / SUM(A.TOTAL_CNT)) ELSE NULL END"
|
|
|
|
|
+ ", MIN(A.MIN_RESP_TIME)"
|
|
|
|
|
+ ", MAX(A.MAX_RESP_TIME)"
|
|
|
|
|
+ " FROM API_STATS_DAY A "
|
|
|
|
|
+ " LEFT OUTER JOIN TSEAIAU01 B ON A.CLIENT_ID = B.CLIENTID"
|
|
|
|
|
+ where
|
|
|
|
|
+ " GROUP BY TO_CHAR(STAT_TIME,'YYYY-MM-DD')"
|
|
|
|
|
+ " ORDER BY STAT_TIME";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Query dataQuery = entityManager.createNativeQuery(dataSql);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
dataQuery.setParameter("searchStartDate", search.getParsedStartDate());
|
|
|
|
|
dataQuery.setParameter("searchEndDate", search.getParsedEndDate());
|
|
|
|
|
|
|
|
|
|
return dataSql;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private void bindParams(Query query, ApiStatsSearch search) {
|
|
|
|
|
query.setParameter("searchStartDate", search.getParsedStartDate());
|
|
|
|
|
query.setParameter("searchEndDate", search.getParsedEndDate());
|
|
|
|
|
|
|
|
|
|
if (StringUtils.isNotBlank(search.getSearchApiName())) {
|
|
|
|
|
dataQuery.setParameter("searchApiName", "%" + search.getSearchApiName().toUpperCase() + "%");
|
|
|
|
|
query.setParameter("searchApiName", "%" + search.getSearchApiName().toUpperCase() + "%");
|
|
|
|
|
}
|
|
|
|
|
if (StringUtils.isNotBlank(search.getSearchOrgName())) {
|
|
|
|
|
dataQuery.setParameter("searchOrgName", "%" + search.getSearchOrgName().toUpperCase() + "%");
|
|
|
|
|
query.setParameter("searchOrgName", "%" + search.getSearchOrgName().toUpperCase() + "%");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return dataQuery;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Native Query 결과를 ApiStatsUI로 변환
|
|
|
|
|
*/
|
|
|
|
|
private ApiStatsUI toVO(Object[] row) {
|
|
|
|
|
ApiStatsUI vo = new ApiStatsUI();
|
|
|
|
|
vo.setOrgName(StringUtils.toString(row[1]));
|
|
|
|
|
vo.setTotalCnt(StringUtils.toLong(row[2]));
|
|
|
|
|
vo.setSuccessCnt(StringUtils.toLong(row[3]));
|
|
|
|
|
vo.setSuccessRate(StringUtils.toDecimal(row[4]).setScale(2, RoundingMode.HALF_UP));
|
|
|
|
|
vo.setFailRate(StringUtils.toDecimal(row[5]).setScale(2, RoundingMode.HALF_UP));
|
|
|
|
|
vo.setTimeoutCnt(StringUtils.toLong(row[6]));
|
|
|
|
|
vo.setSystemErrCnt(StringUtils.toLong(row[7]));
|
|
|
|
|
vo.setAvgRespTime(StringUtils.toDecimal(row[8]));
|
|
|
|
|
vo.setMinRespTime(StringUtils.toDecimal(row[9]));
|
|
|
|
|
vo.setMaxRespTime(StringUtils.toDecimal(row[10]));
|
|
|
|
|
vo.setOrgName(StringUtils.toString(row[0]));
|
|
|
|
|
vo.setTotalCnt(StringUtils.toLong(row[1]));
|
|
|
|
|
vo.setSuccessCnt(StringUtils.toLong(row[2]));
|
|
|
|
|
vo.setSuccessRate(StringUtils.toDecimal(row[3]).setScale(2, RoundingMode.HALF_UP));
|
|
|
|
|
vo.setFailRate(StringUtils.toDecimal(row[4]).setScale(2, RoundingMode.HALF_UP));
|
|
|
|
|
vo.setTimeoutCnt(StringUtils.toLong(row[5]));
|
|
|
|
|
vo.setSystemErrCnt(StringUtils.toLong(row[6]));
|
|
|
|
|
vo.setAvgRespTime(StringUtils.toDecimal(row[7]));
|
|
|
|
|
vo.setMinRespTime(StringUtils.toDecimal(row[8]));
|
|
|
|
|
vo.setMaxRespTime(StringUtils.toDecimal(row[9]));
|
|
|
|
|
return vo;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|