diff --git a/pav-server/src/main/java/com/palnet/biz/api/main/statistics/controller/MainStatisticsController.java b/pav-server/src/main/java/com/palnet/biz/api/main/statistics/controller/MainStatisticsController.java index f7d2989..c987cae 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/main/statistics/controller/MainStatisticsController.java +++ b/pav-server/src/main/java/com/palnet/biz/api/main/statistics/controller/MainStatisticsController.java @@ -145,4 +145,27 @@ public class MainStatisticsController { return ResponseEntity.ok().body(new SuccessResponse(result)); } + + @GetMapping("/flight/result-static") + @ApiOperation(value = "비행실적 상단데이터 통계 [DB전체 통계데이터]") + @Tag(name = "통계 컨트롤러", description = "통계 관련 API") + public ResponseEntity fltResultStcs(){ + + List result = null; + + try { + result = service.getFltResultStaticStcs(); + + log.warn("result => {}", result); + } catch (Exception e) { + log.error("IGNORE : {}", e); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body(new ErrorResponse("Server Error", "-1")); + } + + return ResponseEntity.ok().body(new SuccessResponse>(result)); + } + + + } 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 800ba94..d99c853 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 @@ -7,8 +7,10 @@ import java.util.List; import org.springframework.stereotype.Service; import com.palnet.biz.api.main.statistics.model.FlightStaticStcsModel; +import com.palnet.biz.jpa.entity.type.WarnType; import com.palnet.biz.jpa.repository.ctr.CtrCntrlQueryRepository; import com.palnet.biz.jpa.repository.ctr.CtrCntrlWarnLogQueryRepository; +import com.palnet.biz.jpa.repository.flt.FltPlanQueryRepository; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -23,6 +25,8 @@ public class MainStatisticsService { private final CtrCntrlWarnLogQueryRepository ctrCntrlWarnLogQueryRepository; + private final FltPlanQueryRepository fltPlanQueryRepository; + /** * 파라미터 체크 * 1. 연단위 검색 -> Parameter Null일 경우 @@ -209,4 +213,19 @@ public class MainStatisticsService { return resultList; } + + /** + * 비행실적, 비행계획서 기용, 비행승인이 많이 된 기체 데이터, 상단 고정 데이터 + * @return + */ + public List getFltResultStaticStcs(){ + + FlightStaticStcsModel fltResult = fltPlanQueryRepository.getFltResultStaticStcs(); + FlightStaticStcsModel fltPlan = fltPlanQueryRepository.getFltPlanStaticStcs(); + FlightStaticStcsModel fltPlanAprvn = fltPlanQueryRepository.getFltPlanAprvnStaticStcs(); + + List result = Arrays.asList(fltResult,fltPlan, fltPlanAprvn); + + return result; + } } 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 d254087..5769201 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 @@ -1881,29 +1881,27 @@ public List listCntrlHstry(String id){ return result; } - private String getFltTimeDay(String idntfNum){ + private Long getFltTimeDay(String idntfNum){ QCtrCntrlBas qCtrCntrlBas = QCtrCntrlBas.ctrCntrlBas; BooleanBuilder builder = new BooleanBuilder(); builder.and(qCtrCntrlBas.idntfNum.eq(idntfNum)); builder.and(qCtrCntrlBas.createDt.eq(LocalDate.now().atStartOfDay().atZone(ZoneId.of("Asia/Seoul")).toInstant())); - return query + return Long.parseLong(query .select( - Projections.bean(String.class, - Expressions.stringTemplate( - "CONCAT(SEC_TO_TIME(SUM(TIME_TO_SEC(TIMEDIFF({0}, {1})))))", - qCtrCntrlBas.cntrlEndDt, - qCtrCntrlBas.cntrlStDt - ) // 결과 객체의 프로퍼티 이름을 지정 - ) + Expressions.stringTemplate( + "CONCAT(SEC_TO_TIME(SUM(TIME_TO_SEC(TIMEDIFF({0}, {1})))))", + qCtrCntrlBas.cntrlEndDt, + qCtrCntrlBas.cntrlStDt + ) // 결과 객체의 프로퍼티 이름을 지정 ) .from(qCtrCntrlBas) .where(builder) - .fetchOne(); + .fetchOne()); } - private String getFltTimeMonth(String idntfNum){ + private Long getFltTimeMonth(String idntfNum){ QCtrCntrlBas qCtrCntrlBas = QCtrCntrlBas.ctrCntrlBas; BooleanBuilder builder = new BooleanBuilder(); @@ -1911,22 +1909,20 @@ public List listCntrlHstry(String id){ builder.and(qCtrCntrlBas.createDt.goe(LocalDate.now().minusMonths(1).atStartOfDay().atZone(ZoneId.of("Asia/Seoul")).toInstant())); builder.and(qCtrCntrlBas.createDt.loe(LocalDate.now().atStartOfDay().atZone(ZoneId.of("Asia/Seoul")).toInstant())); - return query - .select( - Projections.bean(String.class, - Expressions.stringTemplate( - "CONCAT(SEC_TO_TIME(SUM(TIME_TO_SEC(TIMEDIFF({0}, {1})))))", - qCtrCntrlBas.cntrlEndDt, - qCtrCntrlBas.cntrlStDt - ) // 결과 객체의 프로퍼티 이름을 지정 - ) + return Long.parseLong(query + .select( + Expressions.stringTemplate( + "CONCAT(SEC_TO_TIME(SUM(TIME_TO_SEC(TIMEDIFF({0}, {1})))))", + qCtrCntrlBas.cntrlEndDt, + qCtrCntrlBas.cntrlStDt + ) // 결과 객체의 프로퍼티 이름을 지정 ) .from(qCtrCntrlBas) .where(builder) - .fetchOne(); + .fetchOne()); } - private String getFltTimeYear(String idntfNum){ + private Long getFltTimeYear(String idntfNum){ QCtrCntrlBas qCtrCntrlBas = QCtrCntrlBas.ctrCntrlBas; BooleanBuilder builder = new BooleanBuilder(); @@ -1934,19 +1930,17 @@ public List listCntrlHstry(String id){ builder.and(qCtrCntrlBas.createDt.goe(LocalDate.now().minusYears(1).atStartOfDay().atZone(ZoneId.of("Asia/Seoul")).toInstant())); builder.and(qCtrCntrlBas.createDt.loe(LocalDate.now().atStartOfDay().atZone(ZoneId.of("Asia/Seoul")).toInstant())); - return query - .select( - Projections.bean(String.class, + return Long.parseLong(query + .select( Expressions.stringTemplate( "CONCAT(SEC_TO_TIME(SUM(TIME_TO_SEC(TIMEDIFF({0}, {1})))))", qCtrCntrlBas.cntrlEndDt, qCtrCntrlBas.cntrlStDt ) // 결과 객체의 프로퍼티 이름을 지정 - ) ) .from(qCtrCntrlBas) .where(builder) - .fetchOne(); + .fetchOne()); } /** @@ -1994,7 +1988,7 @@ public List listCntrlHstry(String id){ return result; } - private String getFltDistanceDay(String idntfNum){ + private Double getFltDistanceDay(String idntfNum){ QCtrCntrlBas qCtrCntrlBas = QCtrCntrlBas.ctrCntrlBas; BooleanBuilder builder = new BooleanBuilder(); @@ -2002,17 +1996,15 @@ public List listCntrlHstry(String id){ builder.and(qCtrCntrlBas.createDt.eq(LocalDate.now().atStartOfDay().atZone(ZoneId.of("Asia/Seoul")).toInstant())); return query - .select( - Projections.bean(String.class, - qCtrCntrlBas.ttlDstnc.sum() // 결과 객체의 프로퍼티 이름을 지정 - ) + .select( + qCtrCntrlBas.ttlDstnc.sum() // 결과 객체의 프로퍼티 이름을 지정 ) .from(qCtrCntrlBas) .where(builder) .fetchOne(); } - private String getFltDistanceMonth(String idntfNum){ + private Double getFltDistanceMonth(String idntfNum){ QCtrCntrlBas qCtrCntrlBas = QCtrCntrlBas.ctrCntrlBas; BooleanBuilder builder = new BooleanBuilder(); @@ -2021,17 +2013,16 @@ public List listCntrlHstry(String id){ builder.and(qCtrCntrlBas.createDt.loe(LocalDate.now().atStartOfDay().atZone(ZoneId.of("Asia/Seoul")).toInstant())); return query - .select( - Projections.bean(String.class, - qCtrCntrlBas.ttlDstnc.sum() // 결과 객체의 프로퍼티 이름을 지정 - ) + .select( + qCtrCntrlBas.ttlDstnc.sum() // 결과 객체의 프로퍼티 이름을 지정 + ) .from(qCtrCntrlBas) .where(builder) .fetchOne(); } - private String getFltDistanceYear(String idntfNum){ + private Double getFltDistanceYear(String idntfNum){ QCtrCntrlBas qCtrCntrlBas = QCtrCntrlBas.ctrCntrlBas; BooleanBuilder builder = new BooleanBuilder(); @@ -2040,10 +2031,8 @@ public List listCntrlHstry(String id){ builder.and(qCtrCntrlBas.createDt.loe(LocalDate.now().atStartOfDay().atZone(ZoneId.of("Asia/Seoul")).toInstant())); return query - .select( - Projections.bean(String.class, - qCtrCntrlBas.ttlDstnc.sum() // 결과 객체의 프로퍼티 이름을 지정 - ) + .select( + qCtrCntrlBas.ttlDstnc.sum() // 결과 객체의 프로퍼티 이름을 지정 ) .from(qCtrCntrlBas) .where(builder) @@ -2093,7 +2082,7 @@ public List listCntrlHstry(String id){ return result; } - private String getFltCountDay(String idntfNum){ + private Long getFltCountDay(String idntfNum){ QCtrCntrlBas qCtrCntrlBas = QCtrCntrlBas.ctrCntrlBas; BooleanBuilder builder = new BooleanBuilder(); @@ -2101,17 +2090,15 @@ public List listCntrlHstry(String id){ builder.and(qCtrCntrlBas.createDt.eq(LocalDate.now().atStartOfDay().atZone(ZoneId.of("Asia/Seoul")).toInstant())); return query - .select( - Projections.bean(String.class, - qCtrCntrlBas.cntrlId.count() // 결과 객체의 프로퍼티 이름을 지정 - ) + .select( + qCtrCntrlBas.cntrlId.count() // 결과 객체의 프로퍼티 이름을 지정 ) .from(qCtrCntrlBas) .where(builder) .fetchOne(); } - private String getFltCountMonth(String idntfNum){ + private Long getFltCountMonth(String idntfNum){ QCtrCntrlBas qCtrCntrlBas = QCtrCntrlBas.ctrCntrlBas; BooleanBuilder builder = new BooleanBuilder(); @@ -2120,17 +2107,15 @@ public List listCntrlHstry(String id){ builder.and(qCtrCntrlBas.createDt.loe(LocalDate.now().atStartOfDay().atZone(ZoneId.of("Asia/Seoul")).toInstant())); return query - .select( - Projections.bean(String.class, - qCtrCntrlBas.cntrlId.count() // 결과 객체의 프로퍼티 이름을 지정 - ) + .select( + qCtrCntrlBas.cntrlId.count() // 결과 객체의 프로퍼티 이름을 지정 ) .from(qCtrCntrlBas) .where(builder) .fetchOne(); } - private String getFltCountYear(String idntfNum){ + private Long getFltCountYear(String idntfNum){ QCtrCntrlBas qCtrCntrlBas = QCtrCntrlBas.ctrCntrlBas; BooleanBuilder builder = new BooleanBuilder(); @@ -2139,10 +2124,8 @@ public List listCntrlHstry(String id){ builder.and(qCtrCntrlBas.createDt.loe(LocalDate.now().atStartOfDay().atZone(ZoneId.of("Asia/Seoul")).toInstant())); return query - .select( - Projections.bean(String.class, - qCtrCntrlBas.cntrlId.count() // 결과 객체의 프로퍼티 이름을 지정 - ) + .select( + qCtrCntrlBas.cntrlId.count() // 결과 객체의 프로퍼티 이름을 지정 ) .from(qCtrCntrlBas) .where(builder) @@ -2436,6 +2419,7 @@ public List listCntrlHstry(String id){ 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 index 9ce0126..72a1609 100644 --- 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 @@ -64,8 +64,10 @@ public class CtrCntrlWarnLogQueryRepository { } else { FlightStaticStcsModel node = new FlightStaticStcsModel(); - node.setName("-"); - node.setValue("noData"); + node.setName("-"); + node.setYear("noData"); + node.setMonth("noData"); + node.setDay("noData"); result = node; } diff --git a/pav-server/src/main/java/com/palnet/biz/jpa/repository/flt/FltPlanQueryRepository.java b/pav-server/src/main/java/com/palnet/biz/jpa/repository/flt/FltPlanQueryRepository.java index 5c8d631..8fe0e85 100644 --- a/pav-server/src/main/java/com/palnet/biz/jpa/repository/flt/FltPlanQueryRepository.java +++ b/pav-server/src/main/java/com/palnet/biz/jpa/repository/flt/FltPlanQueryRepository.java @@ -1,10 +1,50 @@ package com.palnet.biz.jpa.repository.flt; -import com.palnet.biz.api.bas.flight.model.*; +import java.time.Duration; +import java.time.Instant; +import java.time.LocalDate; +import java.time.ZoneId; +import java.util.List; +import java.util.Optional; + +import org.springframework.cache.annotation.Cacheable; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Repository; +import org.springframework.util.StringUtils; + +import com.palnet.biz.api.bas.flight.model.BasFlightPlanArcrftModel; +import com.palnet.biz.api.bas.flight.model.BasFlightPlanAreaCoordRq; +import com.palnet.biz.api.bas.flight.model.BasFlightPlanAreaModel; +import com.palnet.biz.api.bas.flight.model.BasFlightPlanListRq; +import com.palnet.biz.api.bas.flight.model.BasFlightPlanModel; +import com.palnet.biz.api.bas.flight.model.BasFlightPlanPilotModel; +import com.palnet.biz.api.bas.flight.model.BasFlightScheduleRs; import com.palnet.biz.api.comn.file.service.ComnFileService; import com.palnet.biz.api.main.dash.model.MainDashStcsModel; -import com.palnet.biz.jpa.entity.*; -import com.palnet.biz.jpa.model.*; +import com.palnet.biz.api.main.statistics.model.FlightStaticStcsModel; +import com.palnet.biz.jpa.entity.FltPlanBas; +import com.palnet.biz.jpa.entity.QComArcrftBas; +import com.palnet.biz.jpa.entity.QComFileBas; +import com.palnet.biz.jpa.entity.QComIdntfBas; +import com.palnet.biz.jpa.entity.QCtrCntrlBas; +import com.palnet.biz.jpa.entity.QCtrCntrlHstryArea; +import com.palnet.biz.jpa.entity.QFltPlanArcrft; +import com.palnet.biz.jpa.entity.QFltPlanArea; +import com.palnet.biz.jpa.entity.QFltPlanAreaCoord; +import com.palnet.biz.jpa.entity.QFltPlanBas; +import com.palnet.biz.jpa.entity.QFltPlanCtrCntrlRel; +import com.palnet.biz.jpa.entity.QFltPlanPilot; +import com.palnet.biz.jpa.entity.QPtyCstmrDtl; +import com.palnet.biz.jpa.entity.QPtyCstmrGroup; +import com.palnet.biz.jpa.entity.QPtyGroupBas; +import com.palnet.biz.jpa.model.LaancAprvSearchDto; +import com.palnet.biz.jpa.model.LaancPlanArcrftDto; +import com.palnet.biz.jpa.model.LaancPlanAreaDto; +import com.palnet.biz.jpa.model.LaancPlanDto; +import com.palnet.biz.jpa.model.LaancPlanPilotDto; +import com.palnet.biz.jpa.model.LaancPlanareaCoordDto; import com.palnet.comn.utils.DateUtils; import com.palnet.comn.utils.InstantUtils; import com.querydsl.core.BooleanBuilder; @@ -19,19 +59,9 @@ import com.querydsl.core.types.dsl.StringTemplate; import com.querydsl.jpa.JPAExpressions; import com.querydsl.jpa.impl.JPAQuery; import com.querydsl.jpa.impl.JPAQueryFactory; + import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.cache.annotation.Cacheable; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.PageImpl; -import org.springframework.data.domain.Pageable; -import org.springframework.stereotype.Repository; -import org.springframework.util.StringUtils; - -import java.time.Duration; -import java.time.Instant; -import java.util.List; -import java.util.Optional; @Slf4j @Repository @@ -1147,4 +1177,331 @@ public class FltPlanQueryRepository { return result; } + /** + * 비행실적 데이터, top 1 + * @return + */ + public FlightStaticStcsModel getFltResultStaticStcs(){ + FlightStaticStcsModel result = new FlightStaticStcsModel(); + + QFltPlanCtrCntrlRel bas = QFltPlanCtrCntrlRel.fltPlanCtrCntrlRel; + + BooleanBuilder builder = new BooleanBuilder(); + builder.and(bas.planSno.isNotNull()); + + List queryResult = query + .select( + Projections.bean(FlightStaticStcsModel.class, + bas.idntfNum.as("name") // 결과 객체의 프로퍼티 이름을 지정 + ) + ) + .from(bas) + .where(builder) + .groupBy(bas.idntfNum) + .orderBy(bas.planSno.countDistinct().desc()) + .limit(1) + .fetch(); + + if(queryResult.size() > 0){ + result = queryResult.get(0); + if(result.getName().equals("")) result.setName(" "); + + String idntfNum = result.getName(); + + result.setYear(getFltResultYear(idntfNum)); + result.setMonth(getFltResultMonth(idntfNum)); + result.setDay(getFltResultDay(idntfNum)); + } else { + FlightStaticStcsModel node = new FlightStaticStcsModel(); + + node.setName("-"); + node.setYear("NoData"); + node.setMonth("NoData"); + node.setDay("NoData"); + + return node; + } + + return result; + } + + + private Long getFltResultDay(String idntfNum){ + QFltPlanCtrCntrlRel qFltPlanCtrCntrlRel = QFltPlanCtrCntrlRel.fltPlanCtrCntrlRel; + QFltPlanBas qFltPlanBas = QFltPlanBas.fltPlanBas; + + BooleanBuilder builder = new BooleanBuilder(); + builder.and(qFltPlanCtrCntrlRel.idntfNum.eq(idntfNum)); + builder.and(qFltPlanBas.createDt.eq(LocalDate.now().atStartOfDay().atZone(ZoneId.of("Asia/Seoul")).toInstant())); + builder.and(qFltPlanCtrCntrlRel.planSno.isNotNull()); + + return query + .select( + qFltPlanCtrCntrlRel.planSno.countDistinct() // 결과 객체의 프로퍼티 이름을 지정 + ) + .from(qFltPlanCtrCntrlRel) + .leftJoin(qFltPlanBas) + .on(qFltPlanCtrCntrlRel.planSno.eq(qFltPlanBas.planSno)) + .where(builder) + .fetchOne(); + } + + private Long getFltResultMonth(String idntfNum){ + QFltPlanCtrCntrlRel qFltPlanCtrCntrlRel = QFltPlanCtrCntrlRel.fltPlanCtrCntrlRel; + QFltPlanBas qFltPlanBas = QFltPlanBas.fltPlanBas; + + BooleanBuilder builder = new BooleanBuilder(); + builder.and(qFltPlanCtrCntrlRel.idntfNum.eq(idntfNum)); + builder.and(qFltPlanCtrCntrlRel.planSno.isNotNull()); + builder.and(qFltPlanBas.createDt.goe(LocalDate.now().minusMonths(1).atStartOfDay().atZone(ZoneId.of("Asia/Seoul")).toInstant())); + builder.and(qFltPlanBas.createDt.loe(LocalDate.now().atStartOfDay().atZone(ZoneId.of("Asia/Seoul")).toInstant())); + + return query + .select( + qFltPlanCtrCntrlRel.planSno.countDistinct() // 결과 객체의 프로퍼티 이름을 지정 + ) + .from(qFltPlanCtrCntrlRel) + .leftJoin(qFltPlanBas) + .on(qFltPlanCtrCntrlRel.planSno.eq(qFltPlanBas.planSno)) + .where(builder) + .fetchOne(); + } + + private Long getFltResultYear(String idntfNum){ + QFltPlanCtrCntrlRel qFltPlanCtrCntrlRel = QFltPlanCtrCntrlRel.fltPlanCtrCntrlRel; + QFltPlanBas qFltPlanBas = QFltPlanBas.fltPlanBas; + + BooleanBuilder builder = new BooleanBuilder(); + builder.and(qFltPlanCtrCntrlRel.idntfNum.eq(idntfNum)); + builder.and(qFltPlanCtrCntrlRel.planSno.isNotNull()); + builder.and(qFltPlanBas.createDt.goe(LocalDate.now().minusYears(1).atStartOfDay().atZone(ZoneId.of("Asia/Seoul")).toInstant())); + builder.and(qFltPlanBas.createDt.loe(LocalDate.now().atStartOfDay().atZone(ZoneId.of("Asia/Seoul")).toInstant())); + + return query + .select( + qFltPlanCtrCntrlRel.planSno.countDistinct() // 결과 객체의 프로퍼티 이름을 지정 + ) + .from(qFltPlanCtrCntrlRel) + .leftJoin(qFltPlanBas) + .on(qFltPlanCtrCntrlRel.planSno.eq(qFltPlanBas.planSno)) + .where(builder) + .fetchOne(); + } + + + /** + * 비행계획에 많이 기용된 기체 데이터, top 1 + * @return + */ + public FlightStaticStcsModel getFltPlanStaticStcs(){ + FlightStaticStcsModel result = new FlightStaticStcsModel(); + + QFltPlanArcrft bas = QFltPlanArcrft.fltPlanArcrft; + + List queryResult = query + .select( + Projections.bean(FlightStaticStcsModel.class, + bas.idntfNum.as("name") // 결과 객체의 프로퍼티 이름을 지정 + ) + ) + .from(bas) + .groupBy(bas.idntfNum) + .orderBy(bas.planSno.count().desc()) + .limit(1) + .fetch(); + + if(queryResult.size() > 0){ + result = queryResult.get(0); + if(result.getName().equals("")) result.setName(" "); + + String idntfNum = result.getName(); + + result.setYear(getFltPlanYear(idntfNum)); + result.setMonth(getFltPlanMonth(idntfNum)); + result.setDay(getFltPlanDay(idntfNum)); + } else { + FlightStaticStcsModel node = new FlightStaticStcsModel(); + + node.setName("-"); + node.setYear("NoData"); + node.setMonth("NoData"); + node.setDay("NoData"); + + return node; + } + + return result; + } + + private Long getFltPlanDay(String idntfNum){ + QFltPlanArcrft bas = QFltPlanArcrft.fltPlanArcrft; + + BooleanBuilder builder = new BooleanBuilder(); + builder.and(bas.idntfNum.eq(idntfNum.trim())); + builder.and(bas.createDt.eq(LocalDate.now().atStartOfDay().atZone(ZoneId.of("Asia/Seoul")).toInstant())); + + return query + .select( + bas.planSno.count() // 결과 객체의 프로퍼티 이름을 지정 + ) + .from(bas) + .where(builder) + .fetchOne(); + } + + private Long getFltPlanMonth(String idntfNum){ + QFltPlanArcrft bas = QFltPlanArcrft.fltPlanArcrft; + + BooleanBuilder builder = new BooleanBuilder(); + builder.and(bas.idntfNum.eq(idntfNum.trim())); + 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( + bas.planSno.count() // 결과 객체의 프로퍼티 이름을 지정 + ) + .from(bas) + .where(builder) + .fetchOne(); + } + + private Long getFltPlanYear(String idntfNum){ + QFltPlanArcrft bas = QFltPlanArcrft.fltPlanArcrft; + + BooleanBuilder builder = new BooleanBuilder(); + builder.and(bas.idntfNum.eq(idntfNum.trim())); + 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( + bas.planSno.count() + ) + .from(bas) + .where(builder) + .fetchOne(); + } + + + + + /** + * 비행실적 많은 기체 데이터, top 1 + * @return + */ + public FlightStaticStcsModel getFltPlanAprvnStaticStcs(){ + FlightStaticStcsModel result = new FlightStaticStcsModel(); + + QFltPlanArcrft qFltPlanArcrft = QFltPlanArcrft.fltPlanArcrft; + QFltPlanBas qFltPlanBas = QFltPlanBas.fltPlanBas; + + BooleanBuilder builder = new BooleanBuilder(); + builder.and(qFltPlanBas.aprvlYn.eq("Y")); + + + List queryResult = query + .select( + Projections.bean(FlightStaticStcsModel.class, + qFltPlanArcrft.idntfNum.as("name"), // 결과 객체의 프로퍼티 이름을 지정 + qFltPlanArcrft.planSno.count().as("value") // 결과 객체의 프로퍼티 이름을 지정 + ) + ) + .from(qFltPlanArcrft) + .leftJoin(qFltPlanBas) + .on(qFltPlanArcrft.planSno.eq(qFltPlanBas.planSno)) + .where(builder) + .groupBy(qFltPlanArcrft.idntfNum) + .orderBy(qFltPlanArcrft.planSno.count().desc()) + .limit(1) + .fetch(); + + if(queryResult.size() > 0){ + result = queryResult.get(0); + if(result.getName().equals("")) result.setName(" "); + String idntfNum = result.getName(); + + result.setYear(getFltPlanAprvnYear(idntfNum)); + result.setMonth(getFltPlanAprvnMonth(idntfNum)); + result.setDay(getFltPlanAprvnDay(idntfNum)); + } else { + FlightStaticStcsModel node = new FlightStaticStcsModel(); + + node.setName("-"); + node.setYear("NoData"); + node.setMonth("NoData"); + node.setDay("NoData"); + + return node; + } + + return result; + } + + private Long getFltPlanAprvnDay(String idntfNum){ + QFltPlanArcrft qFltPlanArcrft = QFltPlanArcrft.fltPlanArcrft; + QFltPlanBas qFltPlanBas = QFltPlanBas.fltPlanBas; + + BooleanBuilder builder = new BooleanBuilder(); + builder.and(qFltPlanArcrft.idntfNum.eq(idntfNum)); + builder.and(qFltPlanBas.aprvlYn.eq("Y")); + builder.and(qFltPlanBas.createDt.eq(LocalDate.now().atStartOfDay().atZone(ZoneId.of("Asia/Seoul")).toInstant())); + + return query + .select( + qFltPlanArcrft.planSno.count() // 결과 객체의 프로퍼티 이름을 지정 + ) + .from(qFltPlanArcrft) + .leftJoin(qFltPlanBas) + .on(qFltPlanArcrft.planSno.eq(qFltPlanBas.planSno)) + .where(builder) + .fetchOne(); + } + + private Long getFltPlanAprvnMonth(String idntfNum){ + + QFltPlanArcrft qFltPlanArcrft = QFltPlanArcrft.fltPlanArcrft; + QFltPlanBas qFltPlanBas = QFltPlanBas.fltPlanBas; + + BooleanBuilder builder = new BooleanBuilder(); + builder.and(qFltPlanArcrft.idntfNum.eq(idntfNum)); + builder.and(qFltPlanBas.aprvlYn.eq("Y")); + builder.and(qFltPlanBas.createDt.goe(LocalDate.now().minusMonths(1).atStartOfDay().atZone(ZoneId.of("Asia/Seoul")).toInstant())); + builder.and(qFltPlanBas.createDt.loe(LocalDate.now().atStartOfDay().atZone(ZoneId.of("Asia/Seoul")).toInstant())); + + return query + .select( + qFltPlanArcrft.planSno.count() // 결과 객체의 프로퍼티 이름을 지정 + ) + .from(qFltPlanArcrft) + .leftJoin(qFltPlanBas) + .on(qFltPlanArcrft.planSno.eq(qFltPlanBas.planSno)) + .where(builder) + .fetchOne(); + } + + private Long getFltPlanAprvnYear(String idntfNum){ + QFltPlanArcrft qFltPlanArcrft = QFltPlanArcrft.fltPlanArcrft; + QFltPlanBas qFltPlanBas = QFltPlanBas.fltPlanBas; + + BooleanBuilder builder = new BooleanBuilder(); + builder.and(qFltPlanArcrft.idntfNum.eq(idntfNum)); + builder.and(qFltPlanBas.aprvlYn.eq("Y")); + builder.and(qFltPlanBas.createDt.goe(LocalDate.now().minusYears(1).atStartOfDay().atZone(ZoneId.of("Asia/Seoul")).toInstant())); + builder.and(qFltPlanBas.createDt.loe(LocalDate.now().atStartOfDay().atZone(ZoneId.of("Asia/Seoul")).toInstant())); + + return query + .select( + qFltPlanArcrft.planSno.count() // 결과 객체의 프로퍼티 이름을 지정 + ) + .from(qFltPlanArcrft) + .leftJoin(qFltPlanBas) + .on(qFltPlanArcrft.planSno.eq(qFltPlanBas.planSno)) + .where(builder) + .fetchOne(); + } + + + + } \ No newline at end of file