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 94a3860..f7d2989 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 @@ -29,14 +29,14 @@ import lombok.extern.log4j.Log4j2; @RestController @RequiredArgsConstructor @RequestMapping(value = "/api/main/statistics", produces = {MediaType.APPLICATION_JSON_VALUE}) -@Tag(name = "메인화면 컨트롤러", description = "메인화면 관련 API") +@Tag(name = "통계 컨트롤러", description = "통계 관련 API") public class MainStatisticsController { private final MainStatisticsService service; @GetMapping("/flight-static") @ApiOperation(value = "비행통계 상단 데이터[DB전체 통계데이터]") - @Tag(name = "메인화면 컨트롤러", description = "메인화면 관련 API") + @Tag(name = "통계 컨트롤러", description = "통계 관련 API") public ResponseEntity fltStcsStatic(){ List result = null; @@ -56,7 +56,7 @@ public class MainStatisticsController { @GetMapping("/flight/{type}") @ApiOperation(value = "비행통계 cate = ['TIME', 'DISTANCE','FLT_COUNT'], type=['year','month','day','one-day']") - @Tag(name = "메인화면 컨트롤러", description = "메인화면 관련 API") + @Tag(name = "통계 컨트롤러", description = "통계 관련 API") @ApiImplicitParams({ @ApiImplicitParam(name = "date",value = "날짜[2023]", dataTypeClass = String.class), @ApiImplicitParam(name = "cate",value = "비행시간,거리,횟수[TIME]", dataTypeClass = String.class), @@ -93,7 +93,7 @@ public class MainStatisticsController { @GetMapping("/warn-static") @ApiOperation(value = "비정상 상황 상단 데이터[DB전체 통계데이터]") - @Tag(name = "메인화면 컨트롤러", description = "메인화면 관련 API") + @Tag(name = "통계 컨트롤러", description = "통계 관련 API") public ResponseEntity warnStcsStatic(){ List result = null; @@ -113,7 +113,7 @@ public class MainStatisticsController { @GetMapping("/warn/{type}") @ApiOperation(value = "비정상상황 cate = ['PLAN' ,'ALTITUDE', 'CRASH'], type=['year','month','day','one-day']") - @Tag(name = "메인화면 컨트롤러", description = "메인화면 관련 API") + @Tag(name = "통계 컨트롤러", description = "통계 관련 API") @ApiImplicitParams({ @ApiImplicitParam(name = "date",value = "날짜[2023]", dataTypeClass = String.class), @ApiImplicitParam(name = "cate",value = "비행시간,거리,횟수[TIME]", dataTypeClass = String.class), diff --git a/pav-server/src/main/java/com/palnet/biz/api/main/statistics/model/FlightStaticStcsModel.java b/pav-server/src/main/java/com/palnet/biz/api/main/statistics/model/FlightStaticStcsModel.java index be92337..80a4819 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/main/statistics/model/FlightStaticStcsModel.java +++ b/pav-server/src/main/java/com/palnet/biz/api/main/statistics/model/FlightStaticStcsModel.java @@ -9,4 +9,11 @@ public class FlightStaticStcsModel { private Object value; + private Object year; + + private Object month; + + private Object day; + + } 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 336ebe5..1c1624f 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 @@ -2,13 +2,14 @@ package com.palnet.biz.jpa.repository.ctr; 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; import java.util.List; -import javax.persistence.criteria.Expression; - import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.annotation.Cacheable; @@ -28,8 +29,8 @@ import com.palnet.biz.api.ctr.cntrl.model.CtrCntrlDtlModel; import com.palnet.biz.api.ctr.cntrl.model.CtrCntrlEndModel; import com.palnet.biz.api.ctr.cntrl.model.CtrCntrlGroupArcrftModel; import com.palnet.biz.api.ctr.cntrl.model.CtrCntrlGroupModel; -import com.palnet.biz.api.main.statistics.model.FlightStaticStcsModel; import com.palnet.biz.api.main.dash.model.MainDashStcsModel; +import com.palnet.biz.api.main.statistics.model.FlightStaticStcsModel; import com.palnet.biz.jpa.entity.ComArcrftBas; import com.palnet.biz.jpa.entity.ComIdntfBas; import com.palnet.biz.jpa.entity.CtrCntrlHstry; @@ -57,7 +58,6 @@ import com.querydsl.core.types.dsl.Expressions; import com.querydsl.core.types.dsl.StringTemplate; import com.querydsl.jpa.JPAExpressions; import com.querydsl.jpa.impl.JPAQueryFactory; -import com.querydsl.sql.SQLExpressions; import lombok.RequiredArgsConstructor; import lombok.extern.log4j.Log4j2; @@ -1859,10 +1859,22 @@ public List listCntrlHstry(String id){ if(queryResult.size() > 0){ result = queryResult.get(0); + + String idntfNum = result.getName(); + + result.setDay(getFltTimeDay(idntfNum)); + result.setYear(getFltTimeYear(idntfNum)); + result.setMonth(getFltTimeMonth(idntfNum)); + + log.warn("a => {}", result); + } else { FlightStaticStcsModel node = new FlightStaticStcsModel(); - node.setName("-"); - node.setValue("noData"); + node.setName("-"); + node.setYear("noData"); + node.setMonth("noData"); + node.setDay("noData"); + result = node; } @@ -1870,6 +1882,74 @@ public List listCntrlHstry(String id){ return result; } + private String 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 + .select( + Projections.bean(String.class, + Expressions.stringTemplate( + "CONCAT(SEC_TO_TIME(SUM(TIME_TO_SEC(TIMEDIFF({0}, {1})))))", + qCtrCntrlBas.cntrlEndDt, + qCtrCntrlBas.cntrlStDt + ) // 결과 객체의 프로퍼티 이름을 지정 + ) + ) + .from(qCtrCntrlBas) + .where(builder) + .fetchOne(); + } + + private String getFltTimeMonth(String idntfNum){ + QCtrCntrlBas qCtrCntrlBas = QCtrCntrlBas.ctrCntrlBas; + + BooleanBuilder builder = new BooleanBuilder(); + builder.and(qCtrCntrlBas.idntfNum.eq(idntfNum)); + 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 + ) // 결과 객체의 프로퍼티 이름을 지정 + ) + ) + .from(qCtrCntrlBas) + .where(builder) + .fetchOne(); + } + + private String getFltTimeYear(String idntfNum){ + QCtrCntrlBas qCtrCntrlBas = QCtrCntrlBas.ctrCntrlBas; + + BooleanBuilder builder = new BooleanBuilder(); + builder.and(qCtrCntrlBas.idntfNum.eq(idntfNum)); + 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, + Expressions.stringTemplate( + "CONCAT(SEC_TO_TIME(SUM(TIME_TO_SEC(TIMEDIFF({0}, {1})))))", + qCtrCntrlBas.cntrlEndDt, + qCtrCntrlBas.cntrlStDt + ) // 결과 객체의 프로퍼티 이름을 지정 + ) + ) + .from(qCtrCntrlBas) + .where(builder) + .fetchOne(); + } + /** * 가장 많이 이동한 기체 * @return @@ -1896,10 +1976,18 @@ public List listCntrlHstry(String id){ if(queryResult.size() > 0){ result = queryResult.get(0); + + String idntfNum = result.getName(); + + result.setYear(getFltDistanceYear(idntfNum)); + result.setMonth(getFltDistanceMonth(idntfNum)); + result.setDay(getFltDistanceDay(idntfNum)); } else { FlightStaticStcsModel node = new FlightStaticStcsModel(); - node.setName("-"); - node.setValue("noData"); + node.setName("-"); + node.setYear("noData"); + node.setMonth("noData"); + node.setDay("noData"); result = node; } @@ -1907,6 +1995,62 @@ public List listCntrlHstry(String id){ return result; } + private String getFltDistanceDay(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 + .select( + Projections.bean(String.class, + qCtrCntrlBas.ttlDstnc.sum() // 결과 객체의 프로퍼티 이름을 지정 + ) + ) + .from(qCtrCntrlBas) + .where(builder) + .fetchOne(); + } + + private String getFltDistanceMonth(String idntfNum){ + QCtrCntrlBas qCtrCntrlBas = QCtrCntrlBas.ctrCntrlBas; + + BooleanBuilder builder = new BooleanBuilder(); + builder.and(qCtrCntrlBas.idntfNum.eq(idntfNum)); + 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, + qCtrCntrlBas.ttlDstnc.sum() // 결과 객체의 프로퍼티 이름을 지정 + ) + ) + .from(qCtrCntrlBas) + .where(builder) + .fetchOne(); + } + + private String getFltDistanceYear(String idntfNum){ + QCtrCntrlBas qCtrCntrlBas = QCtrCntrlBas.ctrCntrlBas; + + BooleanBuilder builder = new BooleanBuilder(); + builder.and(qCtrCntrlBas.idntfNum.eq(idntfNum)); + 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, + qCtrCntrlBas.ttlDstnc.sum() // 결과 객체의 프로퍼티 이름을 지정 + ) + ) + .from(qCtrCntrlBas) + .where(builder) + .fetchOne(); + } + /** * 가장 많이 비행한 기체 * @return @@ -1931,10 +2075,18 @@ public List listCntrlHstry(String id){ if(queryResult.size() > 0){ result = queryResult.get(0); + + String idntfNum = result.getName(); + + result.setYear(getFltCountYear(idntfNum)); + result.setMonth(getFltCountMonth(idntfNum)); + result.setDay(getFltCountDay(idntfNum)); } else { FlightStaticStcsModel node = new FlightStaticStcsModel(); - node.setName("-"); - node.setValue("noData"); + node.setName("-"); + node.setYear("noData"); + node.setMonth("noData"); + node.setDay("noData"); result = node; } @@ -1942,6 +2094,64 @@ public List listCntrlHstry(String id){ return result; } + private String getFltCountDay(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 + .select( + Projections.bean(String.class, + qCtrCntrlBas.cntrlId.count() // 결과 객체의 프로퍼티 이름을 지정 + ) + ) + .from(qCtrCntrlBas) + .where(builder) + .fetchOne(); + } + + private String getFltCountMonth(String idntfNum){ + QCtrCntrlBas qCtrCntrlBas = QCtrCntrlBas.ctrCntrlBas; + + BooleanBuilder builder = new BooleanBuilder(); + builder.and(qCtrCntrlBas.idntfNum.eq(idntfNum)); + 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, + qCtrCntrlBas.cntrlId.count() // 결과 객체의 프로퍼티 이름을 지정 + ) + ) + .from(qCtrCntrlBas) + .where(builder) + .fetchOne(); + } + + private String getFltCountYear(String idntfNum){ + QCtrCntrlBas qCtrCntrlBas = QCtrCntrlBas.ctrCntrlBas; + + BooleanBuilder builder = new BooleanBuilder(); + builder.and(qCtrCntrlBas.idntfNum.eq(idntfNum)); + 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, + qCtrCntrlBas.cntrlId.count() // 결과 객체의 프로퍼티 이름을 지정 + ) + ) + .from(qCtrCntrlBas) + .where(builder) + .fetchOne(); + } + + + /** * 비행통계 카테고리 시간