From a415ca94fe3021db73bdcbb37d693eccbb09f10d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?lkd9125=28=EC=9D=B4=EA=B2=BD=EB=8F=84=29?= Date: Fri, 10 Nov 2023 18:16:08 +0900 Subject: [PATCH] =?UTF-8?q?=EB=B9=84=EC=A0=95=EC=83=81=EC=83=81=ED=99=A9?= =?UTF-8?q?=20=EB=A1=9C=EA=B7=B8=20queryRepository=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/MainStatisticsService.java | 29 ++- .../ctr/CtrCntrlQueryRepository.java | 206 +--------------- .../ctr/CtrCntrlWarnLogQueryRepository.java | 232 ++++++++++++++++++ 3 files changed, 249 insertions(+), 218 deletions(-) create mode 100644 pav-server/src/main/java/com/palnet/biz/jpa/repository/ctr/CtrCntrlWarnLogQueryRepository.java diff --git a/pav-server/src/main/java/com/palnet/biz/api/main/statistics/service/MainStatisticsService.java b/pav-server/src/main/java/com/palnet/biz/api/main/statistics/service/MainStatisticsService.java index 1e38ea7..800ba94 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/main/statistics/service/MainStatisticsService.java +++ b/pav-server/src/main/java/com/palnet/biz/api/main/statistics/service/MainStatisticsService.java @@ -8,6 +8,7 @@ import org.springframework.stereotype.Service; import com.palnet.biz.api.main.statistics.model.FlightStaticStcsModel; import com.palnet.biz.jpa.repository.ctr.CtrCntrlQueryRepository; +import com.palnet.biz.jpa.repository.ctr.CtrCntrlWarnLogQueryRepository; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -18,7 +19,9 @@ import lombok.extern.slf4j.Slf4j; public class MainStatisticsService { - private final CtrCntrlQueryRepository query; + private final CtrCntrlQueryRepository cntrlQueryRepository; + + private final CtrCntrlWarnLogQueryRepository ctrCntrlWarnLogQueryRepository; /** * 파라미터 체크 @@ -93,9 +96,9 @@ public class MainStatisticsService { */ public List getFlightStaticStcs(){ - FlightStaticStcsModel time = query.getFlightTimeStcs(); - FlightStaticStcsModel distance = query.getFlightDistanceStcs(); - FlightStaticStcsModel fltCount = query.getFlightCountStcs(); + FlightStaticStcsModel time = cntrlQueryRepository.getFlightTimeStcs(); + FlightStaticStcsModel distance = cntrlQueryRepository.getFlightDistanceStcs(); + FlightStaticStcsModel fltCount = cntrlQueryRepository.getFlightCountStcs(); List result = Arrays.asList(time, distance, fltCount); @@ -115,15 +118,15 @@ public class MainStatisticsService { switch (cate) { case "TIME": - resultList = query.fltTimeStcs(date, formatParam); + resultList = cntrlQueryRepository.fltTimeStcs(date, formatParam); break; case "DISTANCE": - resultList = query.fltDistanceStcs(date, formatParam); + resultList = cntrlQueryRepository.fltDistanceStcs(date, formatParam); break; case "FLT_COUNT": - resultList = query.fltCountStcs(date, formatParam); + resultList = cntrlQueryRepository.fltCountStcs(date, formatParam); break; } @@ -143,15 +146,15 @@ public class MainStatisticsService { switch (cate) { case "TIME": - resultList = query.fltTopTimeStcs(date, formatParam); + resultList = cntrlQueryRepository.fltTopTimeStcs(date, formatParam); break; case "DISTANCE": - resultList = query.fltTopDistanceStcs(date, formatParam); + resultList = cntrlQueryRepository.fltTopDistanceStcs(date, formatParam); break; case "FLT_COUNT": - resultList = query.fltTopCountStcs(date, formatParam); + resultList = cntrlQueryRepository.fltTopCountStcs(date, formatParam); break; } @@ -172,7 +175,7 @@ public class MainStatisticsService { List result = new ArrayList<>(); for(int i = 0; i < cate.length; i ++){ - FlightStaticStcsModel node = query.getWarnStaticStcs(cate[i]); + FlightStaticStcsModel node = ctrCntrlWarnLogQueryRepository.getWarnStaticStcs(cate[i]); result.add(node); } @@ -188,7 +191,7 @@ public class MainStatisticsService { */ public List warnStatics(String cate, String date, String[] formatParam){ - List resultList = query.warnStcs(cate, date, formatParam); + List resultList = ctrCntrlWarnLogQueryRepository.warnStcs(cate, date, formatParam); return resultList; } @@ -202,7 +205,7 @@ public class MainStatisticsService { */ public List warnTopStatics(String cate, String date, String[] formatParam){ - List resultList = query.warnTopStcs(cate, date, formatParam); + List resultList = ctrCntrlWarnLogQueryRepository.warnTopStcs(cate, date, formatParam); return resultList; } diff --git a/pav-server/src/main/java/com/palnet/biz/jpa/repository/ctr/CtrCntrlQueryRepository.java b/pav-server/src/main/java/com/palnet/biz/jpa/repository/ctr/CtrCntrlQueryRepository.java index 2ed78ab..d254087 100644 --- a/pav-server/src/main/java/com/palnet/biz/jpa/repository/ctr/CtrCntrlQueryRepository.java +++ b/pav-server/src/main/java/com/palnet/biz/jpa/repository/ctr/CtrCntrlQueryRepository.java @@ -4,7 +4,6 @@ import java.time.Duration; import java.time.Instant; import java.time.LocalDate; import java.time.ZoneId; -import java.time.ZoneOffset; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; @@ -2438,210 +2437,7 @@ public List listCntrlHstry(String id){ return result; } - /** - * 비정상상황 고정 데이터, 카테고리별 집계[PLAN, ALTITUDE, CRASH] - * @return - */ - public FlightStaticStcsModel getWarnStaticStcs(String cate){ - FlightStaticStcsModel result = new FlightStaticStcsModel(); - - QCtrCntrlWarnLog bas = QCtrCntrlWarnLog.ctrCntrlWarnLog; - - BooleanBuilder builder = new BooleanBuilder(); - builder.and(bas.warnType.eq(cate)); - - List queryResult = query - .select( - Projections.bean(FlightStaticStcsModel.class, - bas.idntfNum.as("name"), // 결과 객체의 프로퍼티 이름을 지정 - bas.cntrlId.countDistinct().as("value") // 결과 객체의 프로퍼티 이름을 지정 - ) - ) - .from(bas) - .where(builder) - .groupBy(bas.idntfNum) - .orderBy(bas.cntrlId.countDistinct().desc()) - .limit(1) - .fetch(); - - if(queryResult.size() > 0){ - result = queryResult.get(0); - - String idntfNum = result.getName(); - - result.setYear(getWarnYear(idntfNum, cate)); - result.setMonth(getWarnMonth(idntfNum, cate)); - result.setDay(getWarnDay(idntfNum, cate)); - - - } else { - FlightStaticStcsModel node = new FlightStaticStcsModel(); - node.setName("-"); - node.setValue("noData"); - - result = node; - } - - return result; - } - - - private String getWarnDay(String idntfNum, String cate){ - QCtrCntrlWarnLog bas = QCtrCntrlWarnLog.ctrCntrlWarnLog; - - BooleanBuilder builder = new BooleanBuilder(); - builder.and(bas.idntfNum.eq(idntfNum)); - builder.and(bas.createDt.eq(LocalDate.now().atStartOfDay().atZone(ZoneId.of("Asia/Seoul")).toInstant())); - builder.and(bas.warnType.eq(cate)); - - return query - .select( - Projections.bean(String.class, - bas.cntrlId.countDistinct() // 결과 객체의 프로퍼티 이름을 지정 - ) - ) - .from(bas) - .where(builder) - .fetchOne(); - } - - private String getWarnMonth(String idntfNum, String cate){ - QCtrCntrlWarnLog bas = QCtrCntrlWarnLog.ctrCntrlWarnLog; - - BooleanBuilder builder = new BooleanBuilder(); - builder.and(bas.idntfNum.eq(idntfNum)); - builder.and(bas.warnType.eq(cate)); - builder.and(bas.createDt.goe(LocalDate.now().minusMonths(1).atStartOfDay().atZone(ZoneId.of("Asia/Seoul")).toInstant())); - builder.and(bas.createDt.loe(LocalDate.now().atStartOfDay().atZone(ZoneId.of("Asia/Seoul")).toInstant())); - - return query - .select( - Projections.bean(String.class, - bas.cntrlId.countDistinct() // 결과 객체의 프로퍼티 이름을 지정 - ) - ) - .from(bas) - .where(builder) - .fetchOne(); - } - - private String getWarnYear(String idntfNum, String cate){ - QCtrCntrlWarnLog bas = QCtrCntrlWarnLog.ctrCntrlWarnLog; - - BooleanBuilder builder = new BooleanBuilder(); - builder.and(bas.idntfNum.eq(idntfNum)); - builder.and(bas.warnType.eq(cate)); - builder.and(bas.createDt.goe(LocalDate.now().minusYears(1).atStartOfDay().atZone(ZoneId.of("Asia/Seoul")).toInstant())); - builder.and(bas.createDt.loe(LocalDate.now().atStartOfDay().atZone(ZoneId.of("Asia/Seoul")).toInstant())); - - return query - .select( - Projections.bean(String.class, - bas.cntrlId.countDistinct() // 결과 객체의 프로퍼티 이름을 지정 - ) - ) - .from(bas) - .where(builder) - .fetchOne(); - } - - - - /** - * 비정상상황 카테고리 경로이탈 - * @param date - * @param formatParam - * @return - */ - public List warnStcs(String cate, String date, String[] formatParam){ - // QCtrCntrlBas bas = QCtrCntrlBas.ctrCntrlBas; - QCtrCntrlWarnLog bas = QCtrCntrlWarnLog.ctrCntrlWarnLog; - - StringTemplate formattedDate = Expressions.stringTemplate( - "DATE_FORMAT({0}, {1})" - , bas.createDt - , ConstantImpl.create(formatParam[0])); - - StringTemplate formattedDate2 = Expressions.stringTemplate( - "DATE_FORMAT({0}, {1})" - , bas.createDt - , ConstantImpl.create(formatParam[1])); - - BooleanBuilder builder = new BooleanBuilder(); - builder.and(bas.warnType.eq(cate)); - if(date != null && date.length() > 0) builder.and(formattedDate.eq(date)); - - List result = query - .select( - Projections.bean( - FlightStaticStcsModel.class , - formattedDate2.as("name"), - bas.cntrlId.countDistinct().as("value") - ) - ) - .from(bas) - .where(builder) - .groupBy(formattedDate2) - .fetch(); - - if(result.size() <= 0){ - FlightStaticStcsModel node = new FlightStaticStcsModel(); - - node.setName("-"); - node.setValue("NoData"); - - result.add(node); - } - - return result; - } - - /** - * 비정상상황 카테고리 기체별 Top5 통계 - * @param cate - * @param date - * @param formatParam - * @return - */ - public List warnTopStcs(String cate, String date, String[] formatParam){ - - QCtrCntrlWarnLog bas = QCtrCntrlWarnLog.ctrCntrlWarnLog; - - StringTemplate formattedDate = Expressions.stringTemplate( - "DATE_FORMAT({0}, {1})" - , bas.createDt - , ConstantImpl.create(formatParam[0])); - - BooleanBuilder builder = new BooleanBuilder(); - builder.and(bas.warnType.eq(cate)); - if(date != null && date.length() > 0) builder.and(formattedDate.eq(date)); - - List result = query - .select( - Projections.bean(FlightStaticStcsModel.class, - bas.idntfNum.as("name"), // 결과 객체의 프로퍼티 이름을 지정 - bas.cntrlId.countDistinct().as("value") // 결과 객체의 프로퍼티 이름을 지정 - ) - ) - .from(bas) - .where(builder) - .groupBy(bas.idntfNum) - .orderBy(bas.cntrlId.countDistinct().desc()) - .limit(5) - .fetch(); - - if(result.size() <= 0){ - FlightStaticStcsModel node = new FlightStaticStcsModel(); - - node.setName("-"); - node.setValue("NoData"); - - result.add(node); - } - - return result; - - } + } diff --git a/pav-server/src/main/java/com/palnet/biz/jpa/repository/ctr/CtrCntrlWarnLogQueryRepository.java b/pav-server/src/main/java/com/palnet/biz/jpa/repository/ctr/CtrCntrlWarnLogQueryRepository.java new file mode 100644 index 0000000..9ce0126 --- /dev/null +++ b/pav-server/src/main/java/com/palnet/biz/jpa/repository/ctr/CtrCntrlWarnLogQueryRepository.java @@ -0,0 +1,232 @@ +package com.palnet.biz.jpa.repository.ctr; + +import java.time.LocalDate; +import java.time.ZoneId; +import java.util.List; + +import org.springframework.stereotype.Repository; + +import com.palnet.biz.api.main.statistics.model.FlightStaticStcsModel; +import com.palnet.biz.jpa.entity.QCtrCntrlWarnLog; +import com.querydsl.core.BooleanBuilder; +import com.querydsl.core.types.ConstantImpl; +import com.querydsl.core.types.Projections; +import com.querydsl.core.types.dsl.Expressions; +import com.querydsl.core.types.dsl.StringTemplate; +import com.querydsl.jpa.impl.JPAQueryFactory; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@Repository +@RequiredArgsConstructor +public class CtrCntrlWarnLogQueryRepository { + + private final JPAQueryFactory query; + + + /** + * 비정상상황 고정 데이터, 카테고리별 집계[PLAN, ALTITUDE, CRASH] + * @return + */ + public FlightStaticStcsModel getWarnStaticStcs(String cate){ + FlightStaticStcsModel result = new FlightStaticStcsModel(); + + QCtrCntrlWarnLog bas = QCtrCntrlWarnLog.ctrCntrlWarnLog; + + BooleanBuilder builder = new BooleanBuilder(); + builder.and(bas.warnType.eq(cate)); + + List queryResult = query + .select( + Projections.bean(FlightStaticStcsModel.class, + bas.idntfNum.as("name"), // 결과 객체의 프로퍼티 이름을 지정 + bas.cntrlId.countDistinct().as("value") // 결과 객체의 프로퍼티 이름을 지정 + ) + ) + .from(bas) + .where(builder) + .groupBy(bas.idntfNum) + .orderBy(bas.cntrlId.countDistinct().desc()) + .limit(1) + .fetch(); + + if(queryResult.size() > 0){ + result = queryResult.get(0); + + String idntfNum = result.getName(); + + result.setYear(getWarnYear(idntfNum, cate)); + result.setMonth(getWarnMonth(idntfNum, cate)); + result.setDay(getWarnDay(idntfNum, cate)); + + + } else { + FlightStaticStcsModel node = new FlightStaticStcsModel(); + node.setName("-"); + node.setValue("noData"); + + result = node; + } + + return result; + } + + + private String getWarnDay(String idntfNum, String cate){ + QCtrCntrlWarnLog bas = QCtrCntrlWarnLog.ctrCntrlWarnLog; + + BooleanBuilder builder = new BooleanBuilder(); + builder.and(bas.idntfNum.eq(idntfNum)); + builder.and(bas.createDt.eq(LocalDate.now().atStartOfDay().atZone(ZoneId.of("Asia/Seoul")).toInstant())); + builder.and(bas.warnType.eq(cate)); + + return query + .select( + Projections.bean(String.class, + bas.cntrlId.countDistinct() // 결과 객체의 프로퍼티 이름을 지정 + ) + ) + .from(bas) + .where(builder) + .fetchOne(); + } + + private String getWarnMonth(String idntfNum, String cate){ + QCtrCntrlWarnLog bas = QCtrCntrlWarnLog.ctrCntrlWarnLog; + + BooleanBuilder builder = new BooleanBuilder(); + builder.and(bas.idntfNum.eq(idntfNum)); + builder.and(bas.warnType.eq(cate)); + builder.and(bas.createDt.goe(LocalDate.now().minusMonths(1).atStartOfDay().atZone(ZoneId.of("Asia/Seoul")).toInstant())); + builder.and(bas.createDt.loe(LocalDate.now().atStartOfDay().atZone(ZoneId.of("Asia/Seoul")).toInstant())); + + return query + .select( + Projections.bean(String.class, + bas.cntrlId.countDistinct() // 결과 객체의 프로퍼티 이름을 지정 + ) + ) + .from(bas) + .where(builder) + .fetchOne(); + } + + private String getWarnYear(String idntfNum, String cate){ + QCtrCntrlWarnLog bas = QCtrCntrlWarnLog.ctrCntrlWarnLog; + + BooleanBuilder builder = new BooleanBuilder(); + builder.and(bas.idntfNum.eq(idntfNum)); + builder.and(bas.warnType.eq(cate)); + builder.and(bas.createDt.goe(LocalDate.now().minusYears(1).atStartOfDay().atZone(ZoneId.of("Asia/Seoul")).toInstant())); + builder.and(bas.createDt.loe(LocalDate.now().atStartOfDay().atZone(ZoneId.of("Asia/Seoul")).toInstant())); + + return query + .select( + Projections.bean(String.class, + bas.cntrlId.countDistinct() // 결과 객체의 프로퍼티 이름을 지정 + ) + ) + .from(bas) + .where(builder) + .fetchOne(); + } + + + + /** + * 비정상상황 카테고리 경로이탈 + * @param date + * @param formatParam + * @return + */ + public List warnStcs(String cate, String date, String[] formatParam){ + // QCtrCntrlBas bas = QCtrCntrlBas.ctrCntrlBas; + QCtrCntrlWarnLog bas = QCtrCntrlWarnLog.ctrCntrlWarnLog; + + StringTemplate formattedDate = Expressions.stringTemplate( + "DATE_FORMAT({0}, {1})" + , bas.createDt + , ConstantImpl.create(formatParam[0])); + + StringTemplate formattedDate2 = Expressions.stringTemplate( + "DATE_FORMAT({0}, {1})" + , bas.createDt + , ConstantImpl.create(formatParam[1])); + + BooleanBuilder builder = new BooleanBuilder(); + builder.and(bas.warnType.eq(cate)); + if(date != null && date.length() > 0) builder.and(formattedDate.eq(date)); + + List result = query + .select( + Projections.bean( + FlightStaticStcsModel.class , + formattedDate2.as("name"), + bas.cntrlId.countDistinct().as("value") + ) + ) + .from(bas) + .where(builder) + .groupBy(formattedDate2) + .fetch(); + + if(result.size() <= 0){ + FlightStaticStcsModel node = new FlightStaticStcsModel(); + + node.setName("-"); + node.setValue("NoData"); + + result.add(node); + } + + return result; + } + + /** + * 비정상상황 카테고리 기체별 Top5 통계 + * @param cate + * @param date + * @param formatParam + * @return + */ + public List warnTopStcs(String cate, String date, String[] formatParam){ + + QCtrCntrlWarnLog bas = QCtrCntrlWarnLog.ctrCntrlWarnLog; + + StringTemplate formattedDate = Expressions.stringTemplate( + "DATE_FORMAT({0}, {1})" + , bas.createDt + , ConstantImpl.create(formatParam[0])); + + BooleanBuilder builder = new BooleanBuilder(); + builder.and(bas.warnType.eq(cate)); + if(date != null && date.length() > 0) builder.and(formattedDate.eq(date)); + + List result = query + .select( + Projections.bean(FlightStaticStcsModel.class, + bas.idntfNum.as("name"), // 결과 객체의 프로퍼티 이름을 지정 + bas.cntrlId.countDistinct().as("value") // 결과 객체의 프로퍼티 이름을 지정 + ) + ) + .from(bas) + .where(builder) + .groupBy(bas.idntfNum) + .orderBy(bas.cntrlId.countDistinct().desc()) + .limit(5) + .fetch(); + + if(result.size() <= 0){ + FlightStaticStcsModel node = new FlightStaticStcsModel(); + + node.setName("-"); + node.setValue("NoData"); + + result.add(node); + } + + return result; + } +}