From a527959cf25a8d7f56091bf76e4886f91affc2fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?hagjoon=28=EC=9D=B4=ED=95=99=EC=A4=80=29?= Date: Tue, 14 Nov 2023 17:58:45 +0900 Subject: [PATCH 1/8] =?UTF-8?q?[=EB=A9=94=EC=9D=B8]=20=EC=9D=BC=EC=9D=BC?= =?UTF-8?q?=20=EB=B9=84=ED=96=89=ED=9A=9F=EC=88=98=20=ED=98=84=ED=99=A9=20?= =?UTF-8?q?:=20=EB=B9=84=ED=96=89=EA=B3=84=ED=9A=8D=EC=84=9C=20=EC=8A=B9?= =?UTF-8?q?=EC=9D=B8=20=ED=95=AD=EB=AA=A9=20=EC=9E=91=EC=97=85=EC=A4=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dash/controller/MainDashController.java | 16 +++++++- .../model/MainDashFlightNumStcsModel.java | 35 ++++++++++++++++ .../main/dash/service/MainDashService.java | 40 ++++++++++++++++++- .../repository/flt/FltPlanBasRepository.java | 3 ++ 4 files changed, 91 insertions(+), 3 deletions(-) create mode 100644 pav-server/src/main/java/com/palnet/biz/api/main/dash/model/MainDashFlightNumStcsModel.java diff --git a/pav-server/src/main/java/com/palnet/biz/api/main/dash/controller/MainDashController.java b/pav-server/src/main/java/com/palnet/biz/api/main/dash/controller/MainDashController.java index f139250c..712e6995 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/main/dash/controller/MainDashController.java +++ b/pav-server/src/main/java/com/palnet/biz/api/main/dash/controller/MainDashController.java @@ -3,6 +3,7 @@ package com.palnet.biz.api.main.dash.controller; import java.util.List; import java.util.Map; +import com.palnet.biz.api.main.dash.model.MainDashFlightNumStcsModel; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; @@ -162,7 +163,7 @@ public class MainDashController { } - + @GetMapping(value = "/stcs/flight/date/{type}") @ApiOperation(value = "김포공항, 비행실적 통계") @Tag(name = "메인화면 컨트롤러", description = "메인화면 관련 API") @@ -319,6 +320,19 @@ public class MainDashController { return ResponseEntity.ok().body(new SuccessResponse>(result)); } + @GetMapping("/stcs/dailyflight") + @ApiOperation(value = "일일 비행횟수 현황") + @Tag(name = "메인화면 컨트롤러",description = "메인화면 관련 API") + public ResponseEntity getDailyFlightNumOfStcs(){ + List result = null; + try { + result = service.dailyFlightNumOfStcs(); + }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/dash/model/MainDashFlightNumStcsModel.java b/pav-server/src/main/java/com/palnet/biz/api/main/dash/model/MainDashFlightNumStcsModel.java new file mode 100644 index 00000000..c93bc60d --- /dev/null +++ b/pav-server/src/main/java/com/palnet/biz/api/main/dash/model/MainDashFlightNumStcsModel.java @@ -0,0 +1,35 @@ +package com.palnet.biz.api.main.dash.model; + +import io.swagger.annotations.ApiParam; +import lombok.Data; + +/** + * packageName : com.palnet.biz.api.main.dash.model + * fileName : MainDashFlightNumStcsModel + * author : hagjoon + * date : 2023-11-13 + * description : + * =========================================================== + * DATE AUTHOR NOTE + * ----------------------------------------------------------- + * 2023-11-13 hagjoon 최초 생성 + */ +@Data +public class MainDashFlightNumStcsModel { + + @ApiParam(value = "구분",example = "전일(어제), 금일(오늘), 명일(내일)") + private String dateType = ""; + + @ApiParam(value = "계획",example = "전일(어제), 금일(오늘), 명일(내일) 비행계획서 목록") + private long flightPlan = 0; + + @ApiParam(value = "비행 완료",example = "전일(어제), 금일(오늘), 명일(내일) 비행완료 목록") + private long completeFlight = 0; + + @ApiParam(value = "미 비행",example = "전일(어제), 금일(오늘), 명일(내일) 미 비행 목록") + private long notFlight = 0; + + @ApiParam(value = "비고",example = "전일(어제), 금일(오늘), 명일(내일) 비고") + private int note = 0; + +} diff --git a/pav-server/src/main/java/com/palnet/biz/api/main/dash/service/MainDashService.java b/pav-server/src/main/java/com/palnet/biz/api/main/dash/service/MainDashService.java index 9f0f8238..ac0caa5b 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/main/dash/service/MainDashService.java +++ b/pav-server/src/main/java/com/palnet/biz/api/main/dash/service/MainDashService.java @@ -1,5 +1,7 @@ package com.palnet.biz.api.main.dash.service; +import java.time.Instant; +import java.time.temporal.ChronoUnit; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -9,6 +11,9 @@ import java.util.stream.Collectors; import com.palnet.biz.api.acnt.jwt.model.JwtGroupModel; import com.palnet.biz.api.acnt.jwt.utils.JwtTokenUtil; import com.palnet.biz.api.bas.group.model.BasGroupModel; +import com.palnet.biz.api.main.dash.model.MainDashFlightNumStcsModel; +import com.palnet.biz.jpa.entity.FltPlanBas; +import com.palnet.biz.jpa.repository.flt.FltPlanBasRepository; import com.palnet.biz.jpa.repository.pty.*; import lombok.extern.slf4j.Slf4j; @@ -28,7 +33,9 @@ import com.palnet.biz.jpa.repository.flt.FltPlanQueryRepository; @Service @Slf4j public class MainDashService { - + @Autowired + private FltPlanBasRepository fltPlanBasRepository; + private Logger logger = LoggerFactory.getLogger(getClass()); @Autowired @@ -250,6 +257,35 @@ public class MainDashService { } return result; - } + } + + public List dailyFlightNumOfStcs(){ + // 1. 전일 , 금일, 명일(내일) + Instant yesterday = Instant.now().minus(1, ChronoUnit.DAYS); + Instant today = Instant.now(); + Instant tomorrow = Instant.now().plus(1, ChronoUnit.DAYS); + + long yesterdayCount = fltPlanBasRepository.countByAprvlYnAndAprvlDtBetween("Y", yesterday, today); + log.info("yesterdayCount : {}", yesterdayCount); + long todayCount = fltPlanBasRepository.countByAprvlYnAndAprvlDtBetween("Y", today, today.plus(1, ChronoUnit.DAYS)); + log.info("todayCount : {}", todayCount); + long tomorrowCount = fltPlanBasRepository.countByAprvlYnAndAprvlDtBetween("Y", tomorrow, tomorrow.plus(1, ChronoUnit.DAYS)); + log.info("tomorrowCount : {} ", tomorrowCount); + + // 카운트와 함께 MainDashFlightNumStcsModel 인스턴스 생성 + List result = new ArrayList<>(); + result.add(createModel("yesterday", yesterdayCount)); + result.add(createModel("today", todayCount)); + result.add(createModel("tomorrow", tomorrowCount)); + + return result; + } + + private MainDashFlightNumStcsModel createModel(String dateType, long flightPlanCount) { + MainDashFlightNumStcsModel model = new MainDashFlightNumStcsModel(); + model.setDateType(dateType); + model.setFlightPlan(flightPlanCount); + return model; + } } diff --git a/pav-server/src/main/java/com/palnet/biz/jpa/repository/flt/FltPlanBasRepository.java b/pav-server/src/main/java/com/palnet/biz/jpa/repository/flt/FltPlanBasRepository.java index 94b07a4d..5d91b400 100644 --- a/pav-server/src/main/java/com/palnet/biz/jpa/repository/flt/FltPlanBasRepository.java +++ b/pav-server/src/main/java/com/palnet/biz/jpa/repository/flt/FltPlanBasRepository.java @@ -53,5 +53,8 @@ public interface FltPlanBasRepository extends JpaRepository "and f.aprvlYn = 'Y' ") List findBasList(@Param("planSno") int planSno); + @Query("SELECT f FROM FltPlanBas f WHERE f.aprvlYn = 'Y' AND f.aprvlDt IS NOT NULL AND f.aprvlDt >= :startDate AND f.aprvlDt < :endDate") + List findApprovedFlightPlansByApprovalDate(Instant startDate, Instant endDate); + long countByAprvlYnAndAprvlDtBetween(String aprvlYn, Instant startDate, Instant endDate); } From f06c7fca310d5c5429f23bcdf0f076117ead1370 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?hagjoon=28=EC=9D=B4=ED=95=99=EC=A4=80=29?= Date: Tue, 14 Nov 2023 18:23:11 +0900 Subject: [PATCH 2/8] =?UTF-8?q?[=EB=A9=94=EC=9D=B8]=20=EC=9D=BC=EC=9D=BC?= =?UTF-8?q?=20=EB=B9=84=ED=96=89=ED=9A=9F=EC=88=98=20=ED=98=84=ED=99=A9=20?= =?UTF-8?q?:=20=EB=B9=84=ED=96=89=EA=B3=84=ED=9A=8D=EC=84=9C=20=EC=8A=B9?= =?UTF-8?q?=EC=9D=B8=20=ED=95=AD=EB=AA=A9=20=ED=91=9C=EC=B6=9C=20=EC=99=84?= =?UTF-8?q?=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/dash/service/MainDashService.java | 25 +++++++++++-------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/pav-server/src/main/java/com/palnet/biz/api/main/dash/service/MainDashService.java b/pav-server/src/main/java/com/palnet/biz/api/main/dash/service/MainDashService.java index ac0caa5b..ce9f3709 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/main/dash/service/MainDashService.java +++ b/pav-server/src/main/java/com/palnet/biz/api/main/dash/service/MainDashService.java @@ -261,16 +261,21 @@ public class MainDashService { public List dailyFlightNumOfStcs(){ // 1. 전일 , 금일, 명일(내일) - Instant yesterday = Instant.now().minus(1, ChronoUnit.DAYS); - Instant today = Instant.now(); - Instant tomorrow = Instant.now().plus(1, ChronoUnit.DAYS); - - long yesterdayCount = fltPlanBasRepository.countByAprvlYnAndAprvlDtBetween("Y", yesterday, today); - log.info("yesterdayCount : {}", yesterdayCount); - long todayCount = fltPlanBasRepository.countByAprvlYnAndAprvlDtBetween("Y", today, today.plus(1, ChronoUnit.DAYS)); - log.info("todayCount : {}", todayCount); - long tomorrowCount = fltPlanBasRepository.countByAprvlYnAndAprvlDtBetween("Y", tomorrow, tomorrow.plus(1, ChronoUnit.DAYS)); - log.info("tomorrowCount : {} ", tomorrowCount); + Instant yesterdayStart = Instant.now().minus(1, ChronoUnit.DAYS).truncatedTo(ChronoUnit.DAYS); + Instant yesterdayEnd = Instant.now().truncatedTo(ChronoUnit.DAYS).minus(1, ChronoUnit.SECONDS); + Instant todayStart = Instant.now().truncatedTo(ChronoUnit.DAYS); + Instant todayEnd = Instant.now().plus(1, ChronoUnit.DAYS).minus(1, ChronoUnit.SECONDS); + Instant tomorrowStart = Instant.now().plus(1, ChronoUnit.DAYS).truncatedTo(ChronoUnit.DAYS); + Instant tomorrowEnd = Instant.now().plus(2, ChronoUnit.DAYS).minus(1, ChronoUnit.SECONDS); + + long yesterdayCount = fltPlanBasRepository.countByAprvlYnAndAprvlDtBetween("Y", yesterdayStart, yesterdayEnd); + log.info("yesterdayCount: {}", yesterdayCount); + + long todayCount = fltPlanBasRepository.countByAprvlYnAndAprvlDtBetween("Y", todayStart, todayEnd); + log.info("todayCount: {}", todayCount); + + long tomorrowCount = fltPlanBasRepository.countByAprvlYnAndAprvlDtBetween("Y", tomorrowStart, tomorrowEnd); + log.info("tomorrowCount: {}", tomorrowCount); // 카운트와 함께 MainDashFlightNumStcsModel 인스턴스 생성 List result = new ArrayList<>(); From 2aa5f8450592a80f28dec642a83c74cf1e3db761 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?leehagjoon=28=EC=9D=B4=ED=95=99=EC=A4=80=29?= Date: Wed, 15 Nov 2023 15:00:47 +0900 Subject: [PATCH 3/8] =?UTF-8?q?[=EB=A9=94=EC=9D=B8]=20=EC=9D=BC=EC=9D=BC?= =?UTF-8?q?=20=EB=B9=84=ED=96=89=ED=9A=9F=EC=88=98=20=ED=98=84=ED=99=A9=20?= =?UTF-8?q?-=20=EB=B9=84=ED=96=89=EC=99=84=EB=A3=8C,=20=EB=AF=B8=20?= =?UTF-8?q?=EB=B9=84=ED=96=89,=20=EB=B9=84=EA=B3=A0=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../model/MainDashFlightNumStcsModel.java | 2 +- .../main/dash/service/MainDashService.java | 45 ++++++++++++--- .../ctr/CtrCntrlQueryRepository.java | 57 ++++++++++++++++++- 3 files changed, 95 insertions(+), 9 deletions(-) diff --git a/pav-server/src/main/java/com/palnet/biz/api/main/dash/model/MainDashFlightNumStcsModel.java b/pav-server/src/main/java/com/palnet/biz/api/main/dash/model/MainDashFlightNumStcsModel.java index c93bc60d..29cf8009 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/main/dash/model/MainDashFlightNumStcsModel.java +++ b/pav-server/src/main/java/com/palnet/biz/api/main/dash/model/MainDashFlightNumStcsModel.java @@ -30,6 +30,6 @@ public class MainDashFlightNumStcsModel { private long notFlight = 0; @ApiParam(value = "비고",example = "전일(어제), 금일(오늘), 명일(내일) 비고") - private int note = 0; + private double note = 0; } diff --git a/pav-server/src/main/java/com/palnet/biz/api/main/dash/service/MainDashService.java b/pav-server/src/main/java/com/palnet/biz/api/main/dash/service/MainDashService.java index ce9f3709..02ea506a 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/main/dash/service/MainDashService.java +++ b/pav-server/src/main/java/com/palnet/biz/api/main/dash/service/MainDashService.java @@ -268,28 +268,59 @@ public class MainDashService { Instant tomorrowStart = Instant.now().plus(1, ChronoUnit.DAYS).truncatedTo(ChronoUnit.DAYS); Instant tomorrowEnd = Instant.now().plus(2, ChronoUnit.DAYS).minus(1, ChronoUnit.SECONDS); + // 2. 비행계획서 승인 항목 : 비행계획서 제출기준(승인된 건수로봐도 동일) long yesterdayCount = fltPlanBasRepository.countByAprvlYnAndAprvlDtBetween("Y", yesterdayStart, yesterdayEnd); log.info("yesterdayCount: {}", yesterdayCount); - long todayCount = fltPlanBasRepository.countByAprvlYnAndAprvlDtBetween("Y", todayStart, todayEnd); log.info("todayCount: {}", todayCount); - long tomorrowCount = fltPlanBasRepository.countByAprvlYnAndAprvlDtBetween("Y", tomorrowStart, tomorrowEnd); log.info("tomorrowCount: {}", tomorrowCount); - // 카운트와 함께 MainDashFlightNumStcsModel 인스턴스 생성 + // 3. 비행 완료 항목 : 실제 비행이 완료된 건수 + long yesterdayCompleteCount = query.completeFlight(yesterdayStart,yesterdayEnd).size(); + log.info("yesterdayCompleteCount: {}", yesterdayCompleteCount); + long todayCompleteCount = query.completeFlight(todayStart,todayEnd).size(); + log.info("todayCompleteCount: {}", todayCompleteCount); + long tomorrowCompleteCount = query.completeFlight(tomorrowStart,tomorrowEnd).size(); + log.info("tomorrowCompleteCount: {}", tomorrowCompleteCount); + + // 4. 미 비행 항목 : 비행계획서는 제출했으나,실제 비행안한 건수 + long yesterdayNotFlight = query.notFlight(yesterdayStart,yesterdayEnd).size(); + log.info("yesterdayNotFlight : {} ", yesterdayNotFlight); + long todayNotFlight = query.notFlight(todayStart, todayEnd).size(); + log.info("todayNotFlight : {} ", todayNotFlight); + long tomorrowNotFlight = query.notFlight(tomorrowStart,tomorrowEnd).size(); + log.info("tomorrowNotFlight : {} ", tomorrowNotFlight); + + // 5. 비고 : 비행 완료 건수를 기준으로 상승 또는 하락폭 적용 + // ex) 오늘 기준 오늘은 어제의 비행 완료 건수를 비교해서 적용 + // 전일(어제)은 2일전 비행 완료 건수를 비교해서 적용 + // 명일(내일)은 오늘 비행 완료 건수를 비교해서 적용 + long yesterdayNote = yesterdayCompleteCount - query.completeFlight(yesterdayStart.minus(1, ChronoUnit.DAYS), yesterdayEnd.minus(1, ChronoUnit.DAYS)).size(); + double yesterdayNotePercent = yesterdayCompleteCount != 0 ? ((double) yesterdayNote / yesterdayCompleteCount) * 100.0 : 0.0; + log.info("yesterdayNotePercent: {} ", yesterdayNotePercent); + double todayNotePercent = yesterdayCompleteCount != 0 ? ((double)(todayCompleteCount - yesterdayCompleteCount) / yesterdayCompleteCount) * 100.0 : 0.0; + log.info("todayNotePercent: {} ", todayNotePercent); + double tomorrowNotePercent = todayCompleteCount != 0 ? ((double) (tomorrowCompleteCount - todayCompleteCount) / todayCompleteCount) * 100.0 : 0.0; + log.info("tomorrowNotePercent: {} ", tomorrowNotePercent); + + + List result = new ArrayList<>(); - result.add(createModel("yesterday", yesterdayCount)); - result.add(createModel("today", todayCount)); - result.add(createModel("tomorrow", tomorrowCount)); + result.add(createModel("yesterday", yesterdayCount,yesterdayCompleteCount,yesterdayNotFlight,yesterdayNotePercent)); + result.add(createModel("today", todayCount,todayCompleteCount,todayNotFlight,todayNotePercent)); + result.add(createModel("tomorrow", tomorrowCount,tomorrowCompleteCount,tomorrowNotFlight,tomorrowNotePercent)); return result; } - private MainDashFlightNumStcsModel createModel(String dateType, long flightPlanCount) { + private MainDashFlightNumStcsModel createModel(String dateType, long flightPlanCount, long completeCount, long notFlight, double note) { MainDashFlightNumStcsModel model = new MainDashFlightNumStcsModel(); model.setDateType(dateType); model.setFlightPlan(flightPlanCount); + model.setCompleteFlight(completeCount); + model.setNotFlight(notFlight); + model.setNote(note); return model; } 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 9e6491e1..3097bc6f 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 @@ -9,6 +9,8 @@ import java.util.Calendar; import java.util.Date; import java.util.List; +import com.palnet.biz.api.main.dash.model.MainDashFlightNumStcsModel; +import com.querydsl.core.Tuple; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.annotation.Cacheable; @@ -2570,7 +2572,60 @@ public List listCntrlHstry(String id){ } - + public List completeFlight(Instant start, Instant end) { + // Tuple 여러 값을 담을 수 있는 클래스, 여러 필드를 한꺼번에 반환해야 할 때 유용하다. + QFltPlanCtrCntrlRel fpccr = QFltPlanCtrCntrlRel.fltPlanCtrCntrlRel; + QFltPlanBas fpb = QFltPlanBas.fltPlanBas; + QCtrCntrlBas ccb = QCtrCntrlBas.ctrCntrlBas; + + return query + .select( + fpb.planSno, + fpb.aprvlYn, + fpb.aprvlDt, + ccb.cntrlId, + ccb.statusCd, + ccb.cntrlStDt, + ccb.cntrlEndDt + ) + .from(fpb) + .leftJoin(fpccr).on(fpb.planSno.eq(fpccr.planSno)) + .leftJoin(ccb).on(fpccr.cntrlId.eq(ccb.cntrlId)) + .where( + fpb.aprvlYn.eq("Y"), + fpccr.planSno.isNotNull(), + ccb.statusCd.eq("99"), + ccb.cntrlEndDt.between(start,end) + ) + .fetch(); + + } + + public List notFlight(Instant start, Instant end){ + QCtrCntrlBas ccb = QCtrCntrlBas.ctrCntrlBas; + QFltPlanCtrCntrlRel fpccr = QFltPlanCtrCntrlRel.fltPlanCtrCntrlRel; + QFltPlanBas fpb = QFltPlanBas.fltPlanBas; + + return query + .select( + fpb.planSno, + fpb.aprvlYn, + fpb.aprvlDt, + ccb.cntrlId, + fpccr.cntrlId, + fpccr.planSno + ) + .from(fpb) + .leftJoin(fpccr).on(fpb.planSno.eq(fpccr.planSno)) + .leftJoin(ccb).on(fpccr.cntrlId.eq(ccb.cntrlId)) + .where( + fpb.aprvlYn.eq("Y"), + fpccr.planSno.isNull(), + ccb.cntrlEndDt.between(start, end), + fpb.aprvlDt.between(start, end) + ) + .fetch(); + } } From 3d0209c0cbf4647e0cbbe042a71d8bc4c94a3f37 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?leehagjoon=28=EC=9D=B4=ED=95=99=EC=A4=80=29?= Date: Wed, 15 Nov 2023 15:03:07 +0900 Subject: [PATCH 4/8] =?UTF-8?q?=EC=B6=A9=EB=8F=8C=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dash/controller/MainDashController.java | 21 ++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/pav-server/src/main/java/com/palnet/biz/api/main/dash/controller/MainDashController.java b/pav-server/src/main/java/com/palnet/biz/api/main/dash/controller/MainDashController.java index 1e4a1346..55af27ba 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/main/dash/controller/MainDashController.java +++ b/pav-server/src/main/java/com/palnet/biz/api/main/dash/controller/MainDashController.java @@ -4,6 +4,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; +import com.palnet.biz.api.main.dash.model.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; @@ -17,10 +18,6 @@ import org.springframework.web.bind.annotation.RestController; import com.palnet.biz.api.comn.response.BasicResponse; import com.palnet.biz.api.comn.response.ErrorResponse; import com.palnet.biz.api.comn.response.SuccessResponse; -import com.palnet.biz.api.main.dash.model.MainCurrentStcsModel; -import com.palnet.biz.api.main.dash.model.MainDashFlightListModel; -import com.palnet.biz.api.main.dash.model.MainDashListModel; -import com.palnet.biz.api.main.dash.model.MainDashStcsModel; import com.palnet.biz.api.main.dash.service.MainDashService; import com.palnet.comn.code.RSErrorCode; import com.querydsl.core.Tuple; @@ -354,6 +351,20 @@ public class MainDashController { } return ResponseEntity.ok().body(new SuccessResponse>(result)); - } + } + + @GetMapping("/stcs/dailyflight") + @ApiOperation(value = "일일 비행횟수 현황") + @Tag(name = "메인화면 컨트롤러",description = "메인화면 관련 API") + public ResponseEntity getDailyFlightNumOfStcs(){ + List result = null; + try { + result = service.dailyFlightNumOfStcs(); + }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)); + } } From d72ceca0d8004179c4f15b675fac474baa5eaa09 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?leehagjoon=28=EC=9D=B4=ED=95=99=EC=A4=80=29?= Date: Wed, 15 Nov 2023 15:04:43 +0900 Subject: [PATCH 5/8] =?UTF-8?q?=EB=A1=9C=EA=B7=B8=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../biz/api/main/dash/service/MainDashService.java | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/pav-server/src/main/java/com/palnet/biz/api/main/dash/service/MainDashService.java b/pav-server/src/main/java/com/palnet/biz/api/main/dash/service/MainDashService.java index 8c597f2e..4223d7a4 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/main/dash/service/MainDashService.java +++ b/pav-server/src/main/java/com/palnet/biz/api/main/dash/service/MainDashService.java @@ -304,27 +304,18 @@ public class MainDashService { // 2. 비행계획서 승인 항목 : 비행계획서 제출기준(승인된 건수로봐도 동일) long yesterdayCount = fltPlanBasRepository.countByAprvlYnAndAprvlDtBetween("Y", yesterdayStart, yesterdayEnd); - log.info("yesterdayCount: {}", yesterdayCount); long todayCount = fltPlanBasRepository.countByAprvlYnAndAprvlDtBetween("Y", todayStart, todayEnd); - log.info("todayCount: {}", todayCount); long tomorrowCount = fltPlanBasRepository.countByAprvlYnAndAprvlDtBetween("Y", tomorrowStart, tomorrowEnd); - log.info("tomorrowCount: {}", tomorrowCount); // 3. 비행 완료 항목 : 실제 비행이 완료된 건수 long yesterdayCompleteCount = query.completeFlight(yesterdayStart,yesterdayEnd).size(); - log.info("yesterdayCompleteCount: {}", yesterdayCompleteCount); long todayCompleteCount = query.completeFlight(todayStart,todayEnd).size(); - log.info("todayCompleteCount: {}", todayCompleteCount); long tomorrowCompleteCount = query.completeFlight(tomorrowStart,tomorrowEnd).size(); - log.info("tomorrowCompleteCount: {}", tomorrowCompleteCount); // 4. 미 비행 항목 : 비행계획서는 제출했으나,실제 비행안한 건수 long yesterdayNotFlight = query.notFlight(yesterdayStart,yesterdayEnd).size(); - log.info("yesterdayNotFlight : {} ", yesterdayNotFlight); long todayNotFlight = query.notFlight(todayStart, todayEnd).size(); - log.info("todayNotFlight : {} ", todayNotFlight); long tomorrowNotFlight = query.notFlight(tomorrowStart,tomorrowEnd).size(); - log.info("tomorrowNotFlight : {} ", tomorrowNotFlight); // 5. 비고 : 비행 완료 건수를 기준으로 상승 또는 하락폭 적용 // ex) 오늘 기준 오늘은 어제의 비행 완료 건수를 비교해서 적용 @@ -332,11 +323,8 @@ public class MainDashService { // 명일(내일)은 오늘 비행 완료 건수를 비교해서 적용 long yesterdayNote = yesterdayCompleteCount - query.completeFlight(yesterdayStart.minus(1, ChronoUnit.DAYS), yesterdayEnd.minus(1, ChronoUnit.DAYS)).size(); double yesterdayNotePercent = yesterdayCompleteCount != 0 ? ((double) yesterdayNote / yesterdayCompleteCount) * 100.0 : 0.0; - log.info("yesterdayNotePercent: {} ", yesterdayNotePercent); double todayNotePercent = yesterdayCompleteCount != 0 ? ((double)(todayCompleteCount - yesterdayCompleteCount) / yesterdayCompleteCount) * 100.0 : 0.0; - log.info("todayNotePercent: {} ", todayNotePercent); double tomorrowNotePercent = todayCompleteCount != 0 ? ((double) (tomorrowCompleteCount - todayCompleteCount) / todayCompleteCount) * 100.0 : 0.0; - log.info("tomorrowNotePercent: {} ", tomorrowNotePercent); From efb8e810f3690cb946c375bd797526c0b722deb2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?leehagjoon=28=EC=9D=B4=ED=95=99=EC=A4=80=29?= Date: Wed, 15 Nov 2023 15:38:37 +0900 Subject: [PATCH 6/8] =?UTF-8?q?=EC=B6=A9=EB=8F=8C=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dash/controller/MainDashController.java | 20 ++++-- .../main/dash/service/MainDashService.java | 65 +++++++++++++++++-- 2 files changed, 77 insertions(+), 8 deletions(-) diff --git a/pav-server/src/main/java/com/palnet/biz/api/main/dash/controller/MainDashController.java b/pav-server/src/main/java/com/palnet/biz/api/main/dash/controller/MainDashController.java index cf4bde4b..a590825f 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/main/dash/controller/MainDashController.java +++ b/pav-server/src/main/java/com/palnet/biz/api/main/dash/controller/MainDashController.java @@ -4,7 +4,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; -import com.palnet.biz.api.main.dash.model.MainCurrentStcsModel; +import com.palnet.biz.api.main.dash.model.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; @@ -18,9 +18,6 @@ import org.springframework.web.bind.annotation.RestController; import com.palnet.biz.api.comn.response.BasicResponse; import com.palnet.biz.api.comn.response.ErrorResponse; import com.palnet.biz.api.comn.response.SuccessResponse; -import com.palnet.biz.api.main.dash.model.MainDashFlightListModel; -import com.palnet.biz.api.main.dash.model.MainDashListModel; -import com.palnet.biz.api.main.dash.model.MainDashStcsModel; import com.palnet.biz.api.main.dash.service.MainDashService; import com.palnet.comn.code.RSErrorCode; @@ -384,4 +381,19 @@ public class MainDashController { return ResponseEntity.ok().body(new SuccessResponse>(result)); } + + + @GetMapping("/stcs/dailyflight") + @ApiOperation(value = "일일 비행횟수 현황") + @Tag(name = "메인화면 컨트롤러",description = "메인화면 관련 API") + public ResponseEntity getDailyFlightNumOfStcs(){ + List result = null; + try { + result = service.dailyFlightNumOfStcs(); + }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/dash/service/MainDashService.java b/pav-server/src/main/java/com/palnet/biz/api/main/dash/service/MainDashService.java index 51fb56a5..93159598 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/main/dash/service/MainDashService.java +++ b/pav-server/src/main/java/com/palnet/biz/api/main/dash/service/MainDashService.java @@ -1,14 +1,17 @@ package com.palnet.biz.api.main.dash.service; +import java.time.Instant; +import java.time.temporal.ChronoUnit; import java.util.*; import java.util.stream.Collectors; import com.palnet.biz.api.acnt.jwt.model.JwtGroupModel; import com.palnet.biz.api.acnt.jwt.utils.JwtTokenUtil; import com.palnet.biz.api.bas.group.model.BasGroupModel; -import com.palnet.biz.api.main.dash.model.MainCurrentStcsModel; +import com.palnet.biz.api.main.dash.model.*; import com.palnet.biz.api.main.statistics.service.MainStatisticsService; import com.palnet.biz.jpa.entity.FltPlanBas; +import com.palnet.biz.jpa.repository.flt.FltPlanBasRepository; import com.palnet.biz.jpa.repository.pty.*; import com.querydsl.core.Tuple; @@ -20,9 +23,6 @@ import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import com.palnet.biz.api.main.dash.model.MainDashFlightListModel; -import com.palnet.biz.api.main.dash.model.MainDashListModel; -import com.palnet.biz.api.main.dash.model.MainDashStcsModel; import com.palnet.biz.jpa.entity.CtrCntrlWarnLog; import com.palnet.biz.jpa.entity.type.WarnType; import com.palnet.biz.jpa.repository.ctr.CtrCntrlQueryRepository; @@ -56,6 +56,9 @@ public class MainDashService { @Autowired private FltPlanArcrftRepository fltPlanArcrftRepository; + + @Autowired + private FltPlanBasRepository fltPlanBasRepository; @Autowired private JwtTokenUtil token; @@ -378,4 +381,58 @@ public class MainDashService { return result; } + + public List dailyFlightNumOfStcs(){ + // 1. 전일 , 금일, 명일(내일) + Instant yesterdayStart = Instant.now().minus(1, ChronoUnit.DAYS).truncatedTo(ChronoUnit.DAYS); + Instant yesterdayEnd = Instant.now().truncatedTo(ChronoUnit.DAYS).minus(1, ChronoUnit.SECONDS); + Instant todayStart = Instant.now().truncatedTo(ChronoUnit.DAYS); + Instant todayEnd = Instant.now().plus(1, ChronoUnit.DAYS).minus(1, ChronoUnit.SECONDS); + Instant tomorrowStart = Instant.now().plus(1, ChronoUnit.DAYS).truncatedTo(ChronoUnit.DAYS); + Instant tomorrowEnd = Instant.now().plus(2, ChronoUnit.DAYS).minus(1, ChronoUnit.SECONDS); + + // 2. 비행계획서 승인 항목 : 비행계획서 제출기준(승인된 건수로봐도 동일) + long yesterdayCount = fltPlanBasRepository.countByAprvlYnAndAprvlDtBetween("Y", yesterdayStart, yesterdayEnd); + long todayCount = fltPlanBasRepository.countByAprvlYnAndAprvlDtBetween("Y", todayStart, todayEnd); + long tomorrowCount = fltPlanBasRepository.countByAprvlYnAndAprvlDtBetween("Y", tomorrowStart, tomorrowEnd); + + // 3. 비행 완료 항목 : 실제 비행이 완료된 건수 + long yesterdayCompleteCount = query.completeFlight(yesterdayStart,yesterdayEnd).size(); + long todayCompleteCount = query.completeFlight(todayStart,todayEnd).size(); + long tomorrowCompleteCount = query.completeFlight(tomorrowStart,tomorrowEnd).size(); + + // 4. 미 비행 항목 : 비행계획서는 제출했으나,실제 비행안한 건수 + long yesterdayNotFlight = query.notFlight(yesterdayStart,yesterdayEnd).size(); + long todayNotFlight = query.notFlight(todayStart, todayEnd).size(); + long tomorrowNotFlight = query.notFlight(tomorrowStart,tomorrowEnd).size(); + + // 5. 비고 : 비행 완료 건수를 기준으로 상승 또는 하락폭 적용 + // ex) 오늘 기준 오늘은 어제의 비행 완료 건수를 비교해서 적용 + // 전일(어제)은 2일전 비행 완료 건수를 비교해서 적용 + // 명일(내일)은 오늘 비행 완료 건수를 비교해서 적용 + long yesterdayNote = yesterdayCompleteCount - query.completeFlight(yesterdayStart.minus(1, ChronoUnit.DAYS), yesterdayEnd.minus(1, ChronoUnit.DAYS)).size(); + double yesterdayNotePercent = yesterdayCompleteCount != 0 ? ((double) yesterdayNote / yesterdayCompleteCount) * 100.0 : 0.0; + double todayNotePercent = yesterdayCompleteCount != 0 ? ((double)(todayCompleteCount - yesterdayCompleteCount) / yesterdayCompleteCount) * 100.0 : 0.0; + double tomorrowNotePercent = todayCompleteCount != 0 ? ((double) (tomorrowCompleteCount - todayCompleteCount) / todayCompleteCount) * 100.0 : 0.0; + + + + List result = new ArrayList<>(); + result.add(createModel("yesterday", yesterdayCount,yesterdayCompleteCount,yesterdayNotFlight,yesterdayNotePercent)); + result.add(createModel("today", todayCount,todayCompleteCount,todayNotFlight,todayNotePercent)); + result.add(createModel("tomorrow", tomorrowCount,tomorrowCompleteCount,tomorrowNotFlight,tomorrowNotePercent)); + + return result; + } + + private MainDashFlightNumStcsModel createModel(String dateType, long flightPlanCount, long completeCount, long notFlight, double note) { + MainDashFlightNumStcsModel model = new MainDashFlightNumStcsModel(); + model.setDateType(dateType); + model.setFlightPlan(flightPlanCount); + model.setCompleteFlight(completeCount); + model.setNotFlight(notFlight); + model.setNote(note); + return model; + } + } From f68773d7181278826523882dd961e742eaea8507 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?dhji=28=EC=A7=80=EB=8C=80=ED=95=9C=29?= Date: Wed, 15 Nov 2023 17:09:59 +0900 Subject: [PATCH 7/8] =?UTF-8?q?=EB=B9=84=ED=96=89=EA=B5=AC=EC=97=AD?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../model/BasFlightPlanArcrftModel.java | 3 + .../flight/model/BasFlightPlanAreaModel.java | 27 ++ .../bas/flight/model/BasFlightPlanModel.java | 3 + .../cntrl/controller/CtrCntrlController.java | 4 +- .../ctr/cntrl/service/CtrCntrlService.java | 41 ++ .../flt/FltPlanQueryRepository.java | 433 ++++++++++++------ 6 files changed, 359 insertions(+), 152 deletions(-) diff --git a/pav-server/src/main/java/com/palnet/biz/api/bas/flight/model/BasFlightPlanArcrftModel.java b/pav-server/src/main/java/com/palnet/biz/api/bas/flight/model/BasFlightPlanArcrftModel.java index 449083d0..b4406254 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/bas/flight/model/BasFlightPlanArcrftModel.java +++ b/pav-server/src/main/java/com/palnet/biz/api/bas/flight/model/BasFlightPlanArcrftModel.java @@ -15,6 +15,7 @@ public class BasFlightPlanArcrftModel { private String groupNm; private String prdctNum; private String arcrftTypeCd; + private String arcrftTypeNm; private String arcrftModelNm; private String prdctCmpnNm; @JsonSerialize(using = InstantDateStrSerializer.class) @@ -23,6 +24,8 @@ public class BasFlightPlanArcrftModel { private double arcrftWdth; private double arcrftHght; private double arcrftWght; + private String arcrftWghtCd; + private String arcrftWghtNm; private String wghtTypeCd; private String imageUrl; private double takeoffWght; diff --git a/pav-server/src/main/java/com/palnet/biz/api/bas/flight/model/BasFlightPlanAreaModel.java b/pav-server/src/main/java/com/palnet/biz/api/bas/flight/model/BasFlightPlanAreaModel.java index 5b0fbc17..4824a4a3 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/bas/flight/model/BasFlightPlanAreaModel.java +++ b/pav-server/src/main/java/com/palnet/biz/api/bas/flight/model/BasFlightPlanAreaModel.java @@ -1,16 +1,24 @@ package com.palnet.biz.api.bas.flight.model; +import com.palnet.biz.jpa.entity.type.FltMethod; +import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Data; +import lombok.NoArgsConstructor; import java.time.Instant; import java.util.List; @Data +@NoArgsConstructor +@AllArgsConstructor +@Builder public class BasFlightPlanAreaModel { private Integer planAreaSno; private Integer planSno; private String areaType; private String fltMethod; + private String fltMethodNm; private String fltAreaAddr; private Integer bufferZone; private String fltElev; @@ -23,4 +31,23 @@ public class BasFlightPlanAreaModel { private List bufferCoordList; // kac 추가 필드 private String fltMothoeRm; + +// public BasFlightPlanAreaModel(Integer planAreaSno, Integer planSno, String areaType, FltMethod fltMethod, String fltAreaAddr, Integer bufferZone, String fltElev, String createUserId, Instant createDt, String updateUserId, Instant updateDt, String docState, List coordList, List bufferCoordList, String fltMothoeRm) { +// this.planAreaSno = planAreaSno; +// this.planSno = planSno; +// this.areaType = areaType; +// this.fltMethod = fltMethod.getCode(); +// this.fltMethodNm = fltMethod.getValue(); +// this.fltAreaAddr = fltAreaAddr; +// this.bufferZone = bufferZone; +// this.fltElev = fltElev; +// this.createUserId = createUserId; +// this.createDt = createDt; +// this.updateUserId = updateUserId; +// this.updateDt = updateDt; +// this.docState = docState; +// this.coordList = coordList; +// this.bufferCoordList = bufferCoordList; +// this.fltMothoeRm = fltMothoeRm; +// } } diff --git a/pav-server/src/main/java/com/palnet/biz/api/bas/flight/model/BasFlightPlanModel.java b/pav-server/src/main/java/com/palnet/biz/api/bas/flight/model/BasFlightPlanModel.java index 2b3b2776..b51d81f4 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/bas/flight/model/BasFlightPlanModel.java +++ b/pav-server/src/main/java/com/palnet/biz/api/bas/flight/model/BasFlightPlanModel.java @@ -21,6 +21,9 @@ public class BasFlightPlanModel { private Instant schFltStDt; private Instant schFltEndDt; private String fltPurpose; + private String fltPurposeNm; + private String fltType; + private String fltTypeNm; private String aprvlYn; private String delYn; private String createUserId; diff --git a/pav-server/src/main/java/com/palnet/biz/api/ctr/cntrl/controller/CtrCntrlController.java b/pav-server/src/main/java/com/palnet/biz/api/ctr/cntrl/controller/CtrCntrlController.java index c4fdfbfe..ca85162c 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/ctr/cntrl/controller/CtrCntrlController.java +++ b/pav-server/src/main/java/com/palnet/biz/api/ctr/cntrl/controller/CtrCntrlController.java @@ -155,12 +155,12 @@ public class CtrCntrlController { @GetMapping("/flight_plan/{idntfNum}") @ApiOperation(value = "TODO 비행 관제 사용자 비행 계획서 정보") @Tag(name = "드론 관제 시스템", description = "드론 관제 관련 API") - @ApiImplicitParam(name = "idtfNum",value = "식별번호", dataTypeClass = String.class) + @ApiImplicitParam(name = "idtfNum",value = "식별번호", dataTypeClass = String.class, paramType = "query") public ResponseEntity findFlightPlan(@PathVariable("idntfNum") String idntfNum) { List list; try { - list = service.getFlightPlan(idntfNum); + list = service.getFlightPlanForKac(idntfNum); } catch (Exception e) { log.error("IGNORE : {}", e); return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) diff --git a/pav-server/src/main/java/com/palnet/biz/api/ctr/cntrl/service/CtrCntrlService.java b/pav-server/src/main/java/com/palnet/biz/api/ctr/cntrl/service/CtrCntrlService.java index 1cd32f3e..8c083579 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/ctr/cntrl/service/CtrCntrlService.java +++ b/pav-server/src/main/java/com/palnet/biz/api/ctr/cntrl/service/CtrCntrlService.java @@ -70,6 +70,7 @@ public class CtrCntrlService { private final FltPlanAreaCoordRepository planCoordRepository; private final AreaUtils areaUtils; private final ControlGpsDataContext shareContext; + private final FltPlanQueryRepository fltPlanQueryRepository; @@ -363,6 +364,46 @@ public class CtrCntrlService { return rs; } + /** + * 식별 번호에 해당되는 비행구역 조회 + * KAC에서는 기초데이터를 먼저 입력하는 것이 아닌 비행계획서만 작성하므로 생략되는 로직이 있음 + * 따라서 별도로 구성함 + * @param idntfNum + * @return + */ + public List getFlightPlanForKac(String idntfNum) { + List rs = fltPlanQueryRepository.getPlanByIdntfNum(idntfNum); + + // Line일 경우 버퍼 생성 + if(rs != null && !rs.isEmpty()){ + rs.forEach(r -> { + List areaList = r.getAreaList(); + if(areaList != null && !areaList.isEmpty()){ + areaList.forEach(a -> { + List coordList = a.getCoordList(); + if(coordList != null && !coordList.isEmpty()){ + // Buffer 영역 생성 저장 + if ("LINE".equals(a.getAreaType())) { + List convertCoordinates = areaUtils.convertCoordinates(coordList); + List transCoordList = areaUtils.transform(convertCoordinates, "EPSG:4326", "EPSG:5181"); + + List bufferList = areaUtils.buffer(transCoordList, a.getBufferZone()); + List transBufferList = areaUtils.transform(bufferList, "EPSG:5181", "EPSG:4326"); // buffer 영역 좌표계 변환 + + List bufferCoordList = areaUtils.convertModel(transBufferList); + + a.setBufferCoordList(bufferCoordList); + } + } + }); + } + }); + } + + + return rs; + } + /** * TODO 비행 관제 비정상 상황 판별 * 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 bb96b935..3251fa26 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,58 +1,13 @@ package com.palnet.biz.jpa.repository.flt; -import java.time.Duration; -import java.time.Instant; -import java.time.LocalDate; -import java.time.ZoneId; -import java.time.ZoneOffset; -import java.time.temporal.ChronoUnit; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Optional; - -import com.palnet.biz.api.main.dash.model.MainCurrentStcsModel; -import com.querydsl.core.types.dsl.*; -import org.springframework.beans.factory.annotation.Autowired; -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.acnt.jwt.utils.JwtTokenUtil; -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.bas.flight.model.*; import com.palnet.biz.api.main.dash.model.MainDashFlightListModel; import com.palnet.biz.api.main.dash.model.MainDashStcsModel; import com.palnet.biz.api.main.statistics.model.FlightStcsValueModel; -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.biz.jpa.entity.*; +import com.palnet.biz.jpa.entity.type.*; +import com.palnet.biz.jpa.model.*; import com.palnet.comn.utils.DateUtils; import com.palnet.comn.utils.InstantUtils; import com.querydsl.core.BooleanBuilder; @@ -62,17 +17,23 @@ import com.querydsl.core.types.ConstantImpl; import com.querydsl.core.types.Expression; import com.querydsl.core.types.ExpressionUtils; import com.querydsl.core.types.Projections; -import com.querydsl.core.types.dsl.CaseBuilder; -import com.querydsl.core.types.dsl.ComparableExpressionBase; -import com.querydsl.core.types.dsl.DateTemplate; -import com.querydsl.core.types.dsl.Expressions; -import com.querydsl.core.types.dsl.StringTemplate; +import com.querydsl.core.types.dsl.*; 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.*; +import java.time.temporal.ChronoUnit; +import java.util.*; +import java.util.stream.Collectors; @Slf4j @Repository @@ -81,7 +42,7 @@ public class FltPlanQueryRepository { private final JPAQueryFactory query; - + private final JwtTokenUtil jwtTokenUtil; @@ -115,6 +76,7 @@ public class FltPlanQueryRepository { } builder.and(bas.delYn.ne("Y")); + List r = query .from(bas) .leftJoin(area) @@ -1207,10 +1169,10 @@ public class FltPlanQueryRepository { List queryResult = query .select( Projections.bean(FlightStcsValueModel.class, - qFltPlanCtrCntrlRel.idntfNum.as("name") // 결과 객체의 프로퍼티 이름을 지정 + qFltPlanCtrCntrlRel.idntfNum.as("name") // 결과 객체의 프로퍼티 이름을 지정 ) ) - .from(qFltPlanCtrCntrlRel) + .from(qFltPlanCtrCntrlRel) .leftJoin(qFltPlanBas) .on(qFltPlanCtrCntrlRel.planSno.eq(qFltPlanBas.planSno)) .where(builder) @@ -1218,7 +1180,7 @@ public class FltPlanQueryRepository { .orderBy(qFltPlanCtrCntrlRel.planSno.countDistinct().desc()) .limit(1) .fetch(); - + if(queryResult.size() > 0){ result = queryResult.get(0); if(result.getName().equals("")) result.setName(" "); @@ -1249,7 +1211,7 @@ public class FltPlanQueryRepository { QFltPlanBas qFltPlanBas = QFltPlanBas.fltPlanBas; BooleanBuilder builder = new BooleanBuilder(); - builder.and(qFltPlanCtrCntrlRel.idntfNum.eq(idntfNum)); + 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()); if(groupId != null && !(groupId.equals(""))) builder.and(qFltPlanBas.groupId.eq(groupId)); @@ -1311,7 +1273,7 @@ public class FltPlanQueryRepository { .where(builder) .fetchOne(); } - + /** * 비행계획에 많이 기용된 기체 데이터, top 1 @@ -1319,11 +1281,11 @@ public class FltPlanQueryRepository { */ public FlightStcsValueModel getFltPlanStaticStcs(boolean authCheck, String groupId){ FlightStcsValueModel result = new FlightStcsValueModel(); - + QFltPlanArcrft qFltPlanArcrft = QFltPlanArcrft.fltPlanArcrft; QFltPlanBas qFltPlanBas = QFltPlanBas.fltPlanBas; - BooleanBuilder builder = new BooleanBuilder(); + BooleanBuilder builder = new BooleanBuilder(); if(groupId != null && !(groupId.equals(""))) builder.and(qFltPlanBas.groupId.eq(groupId)); if(authCheck) builder.and(qFltPlanBas.cstmrSno.eq(jwtTokenUtil.getCstmrSnoByToken())); @@ -1340,7 +1302,7 @@ public class FltPlanQueryRepository { .orderBy(qFltPlanArcrft.planSno.count().desc()) .limit(1) .fetch(); - + log.warn("que => {}", queryResult); if(queryResult.size() > 0){ @@ -1367,11 +1329,11 @@ public class FltPlanQueryRepository { } private Long getFltPlanDay(String idntfNum, boolean authCheck, String groupId){ - QFltPlanArcrft bas = QFltPlanArcrft.fltPlanArcrft; - QFltPlanBas qFltPlanBas = QFltPlanBas.fltPlanBas; + QFltPlanArcrft bas = QFltPlanArcrft.fltPlanArcrft; + QFltPlanBas qFltPlanBas = QFltPlanBas.fltPlanBas; BooleanBuilder builder = new BooleanBuilder(); - builder.and(bas.idntfNum.eq(idntfNum.trim())); + builder.and(bas.idntfNum.eq(idntfNum.trim())); builder.and(bas.createDt.eq(LocalDate.now().atStartOfDay().atZone(ZoneId.of("Asia/Seoul")).toInstant())); if(groupId != null && !(groupId.equals(""))) builder.and(qFltPlanBas.groupId.eq(groupId)); if(authCheck) builder.and(qFltPlanBas.cstmrSno.eq(jwtTokenUtil.getCstmrSnoByToken())); @@ -1380,7 +1342,7 @@ public class FltPlanQueryRepository { .select( bas.planSno.count() // 결과 객체의 프로퍼티 이름을 지정 ) - .from(bas) + .from(bas) .leftJoin(qFltPlanBas) .on(qFltPlanBas.planSno.eq(bas.planSno)) .where(builder) @@ -1388,11 +1350,11 @@ public class FltPlanQueryRepository { } private Long getFltPlanMonth(String idntfNum, boolean authCheck, String groupId){ - QFltPlanArcrft bas = QFltPlanArcrft.fltPlanArcrft; + QFltPlanArcrft bas = QFltPlanArcrft.fltPlanArcrft; QFltPlanBas qFltPlanBas = QFltPlanBas.fltPlanBas; BooleanBuilder builder = new BooleanBuilder(); - builder.and(bas.idntfNum.eq(idntfNum.trim())); + 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())); if(groupId != null && !(groupId.equals(""))) builder.and(qFltPlanBas.groupId.eq(groupId)); @@ -1402,9 +1364,9 @@ public class FltPlanQueryRepository { .select( bas.planSno.count() // 결과 객체의 프로퍼티 이름을 지정 ) - .from(bas) + .from(bas) .leftJoin(qFltPlanBas) - .on(qFltPlanBas.planSno.eq(bas.planSno)) + .on(qFltPlanBas.planSno.eq(bas.planSno)) .where(builder) .fetchOne(); } @@ -1414,7 +1376,7 @@ public class FltPlanQueryRepository { QFltPlanBas qFltPlanBas = QFltPlanBas.fltPlanBas; BooleanBuilder builder = new BooleanBuilder(); - builder.and(bas.idntfNum.eq(idntfNum.trim())); + 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())); if(groupId != null && !(groupId.equals(""))) builder.and(qFltPlanBas.groupId.eq(groupId)); @@ -1430,9 +1392,9 @@ public class FltPlanQueryRepository { .where(builder) .fetchOne(); } - - + + /** * 비행승인 많은 기체 데이터, top 1 @@ -1441,14 +1403,14 @@ public class FltPlanQueryRepository { public FlightStcsValueModel getFltPlanAprvnStaticStcs(boolean authCheck, String groupId){ FlightStcsValueModel result = new FlightStcsValueModel(); - QFltPlanArcrft qFltPlanArcrft = QFltPlanArcrft.fltPlanArcrft; + QFltPlanArcrft qFltPlanArcrft = QFltPlanArcrft.fltPlanArcrft; QFltPlanBas qFltPlanBas = QFltPlanBas.fltPlanBas; BooleanBuilder builder = new BooleanBuilder(); builder.and(qFltPlanBas.aprvlYn.eq("Y")); if(groupId != null && !(groupId.equals(""))) builder.and(qFltPlanBas.groupId.eq(groupId)); if(authCheck) builder.and(qFltPlanBas.cstmrSno.eq(jwtTokenUtil.getCstmrSnoByToken())); - + List queryResult = query .select( @@ -1456,7 +1418,7 @@ public class FltPlanQueryRepository { qFltPlanArcrft.idntfNum.as("name") // 결과 객체의 프로퍼티 이름을 지정 ) ) - .from(qFltPlanArcrft) + .from(qFltPlanArcrft) .leftJoin(qFltPlanBas) .on(qFltPlanArcrft.planSno.eq(qFltPlanBas.planSno)) .where(builder) @@ -1464,7 +1426,7 @@ public class FltPlanQueryRepository { .orderBy(qFltPlanArcrft.planSno.count().desc()) .limit(1) .fetch(); - + if(queryResult.size() > 0){ result = queryResult.get(0); if(result.getName().equals("")) result.setName(" "); @@ -1488,13 +1450,13 @@ public class FltPlanQueryRepository { } private Long getFltPlanAprvnDay(String idntfNum, boolean authCheck, String groupId){ - QFltPlanArcrft qFltPlanArcrft = QFltPlanArcrft.fltPlanArcrft; + 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())); + 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())); if(groupId != null && !(groupId.equals(""))) builder.and(qFltPlanBas.groupId.eq(groupId)); if(authCheck) builder.and(qFltPlanBas.cstmrSno.eq(jwtTokenUtil.getCstmrSnoByToken())); @@ -1502,7 +1464,7 @@ public class FltPlanQueryRepository { .select( qFltPlanArcrft.planSno.count() // 결과 객체의 프로퍼티 이름을 지정 ) - .from(qFltPlanArcrft) + .from(qFltPlanArcrft) .leftJoin(qFltPlanBas) .on(qFltPlanArcrft.planSno.eq(qFltPlanBas.planSno)) .where(builder) @@ -1510,23 +1472,23 @@ public class FltPlanQueryRepository { } private Long getFltPlanAprvnMonth(String idntfNum, boolean authCheck, String groupId){ - - QFltPlanArcrft qFltPlanArcrft = QFltPlanArcrft.fltPlanArcrft; + + 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(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())); if(groupId != null && !(groupId.equals(""))) builder.and(qFltPlanBas.groupId.eq(groupId)); if(authCheck) builder.and(qFltPlanBas.cstmrSno.eq(jwtTokenUtil.getCstmrSnoByToken())); return query - .select( + .select( qFltPlanArcrft.planSno.count() // 결과 객체의 프로퍼티 이름을 지정 ) - .from(qFltPlanArcrft) + .from(qFltPlanArcrft) .leftJoin(qFltPlanBas) .on(qFltPlanArcrft.planSno.eq(qFltPlanBas.planSno)) .where(builder) @@ -1534,28 +1496,28 @@ public class FltPlanQueryRepository { } private Long getFltPlanAprvnYear(String idntfNum, boolean authCheck, String groupId){ - QFltPlanArcrft qFltPlanArcrft = QFltPlanArcrft.fltPlanArcrft; + 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(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())); if(groupId != null && !(groupId.equals(""))) builder.and(qFltPlanBas.groupId.eq(groupId)); if(authCheck) builder.and(qFltPlanBas.cstmrSno.eq(jwtTokenUtil.getCstmrSnoByToken())); - + return query .select( qFltPlanArcrft.planSno.count() // 결과 객체의 프로퍼티 이름을 지정 ) - .from(qFltPlanArcrft) + .from(qFltPlanArcrft) .leftJoin(qFltPlanBas) .on(qFltPlanArcrft.planSno.eq(qFltPlanBas.planSno)) .where(builder) .fetchOne(); } - + /** * 비행실적 통계 카테고리 비행실적 * @param date @@ -1564,21 +1526,21 @@ public class FltPlanQueryRepository { */ public List fltResultStcs(String date, String groupId, boolean authCheck, String[] formatParam){ // QCtrCntrlBas bas = QCtrCntrlBas.ctrCntrlBas; - + QFltPlanBas qFltPlanBas = QFltPlanBas.fltPlanBas; QFltPlanCtrCntrlRel qFltPlanCtrCntrlRel = QFltPlanCtrCntrlRel.fltPlanCtrCntrlRel; - + StringTemplate formattedDate = Expressions.stringTemplate( "DATE_FORMAT({0}, {1})" , qFltPlanBas.createDt , ConstantImpl.create(formatParam[0])); - + StringTemplate formattedDate2 = Expressions.stringTemplate( "DATE_FORMAT({0}, {1})" , qFltPlanBas.createDt , ConstantImpl.create(formatParam[1])); - BooleanBuilder builder = new BooleanBuilder(); + BooleanBuilder builder = new BooleanBuilder(); if(date != null && date.length() > 0) builder.and(formattedDate.eq(date)); if(groupId != null && !(groupId.equals(""))) builder.and(qFltPlanBas.groupId.eq(groupId)); if(authCheck) builder.and(qFltPlanBas.cstmrSno.eq(jwtTokenUtil.getCstmrSnoByToken())); @@ -1586,7 +1548,7 @@ public class FltPlanQueryRepository { List result = query .select( Projections.bean( - FlightStcsValueModel.class , + FlightStcsValueModel.class , formattedDate2.as("name"), qFltPlanCtrCntrlRel.planSno.countDistinct().as("value") ) @@ -1595,8 +1557,8 @@ public class FltPlanQueryRepository { .leftJoin(qFltPlanBas) .on(qFltPlanBas.planSno.eq(qFltPlanCtrCntrlRel.planSno)) .where(builder) - .groupBy(formattedDate2) - .fetch(); + .groupBy(formattedDate2) + .fetch(); if(result.size() <= 0){ FlightStcsValueModel node = new FlightStcsValueModel(); @@ -1608,7 +1570,7 @@ public class FltPlanQueryRepository { } return result; - } + } /** * 비행계획서 통계 카테고리 비행계획서 @@ -1616,20 +1578,20 @@ public class FltPlanQueryRepository { * @param formatParam * @return */ - public List fltPlanStcs(String date, String groupId, boolean authCheck, String[] formatParam){ + public List fltPlanStcs(String date, String groupId, boolean authCheck, String[] formatParam){ QFltPlanBas qFltPlanBas = QFltPlanBas.fltPlanBas; - + StringTemplate formattedDate = Expressions.stringTemplate( "DATE_FORMAT({0}, {1})" , qFltPlanBas.createDt , ConstantImpl.create(formatParam[0])); - + StringTemplate formattedDate2 = Expressions.stringTemplate( "DATE_FORMAT({0}, {1})" , qFltPlanBas.createDt , ConstantImpl.create(formatParam[1])); - BooleanBuilder builder = new BooleanBuilder(); + BooleanBuilder builder = new BooleanBuilder(); if(date != null && date.length() > 0) builder.and(formattedDate.eq(date)); if(groupId != null && !(groupId.equals(""))) builder.and(qFltPlanBas.groupId.eq(groupId)); if(authCheck) builder.and(qFltPlanBas.cstmrSno.eq(jwtTokenUtil.getCstmrSnoByToken())); @@ -1637,15 +1599,15 @@ public class FltPlanQueryRepository { List result = query .select( Projections.bean( - FlightStcsValueModel.class , + FlightStcsValueModel.class , formattedDate2.as("name"), qFltPlanBas.planSno.count().as("value") ) ) - .from(qFltPlanBas) + .from(qFltPlanBas) .where(builder) - .groupBy(formattedDate2) - .fetch(); + .groupBy(formattedDate2) + .fetch(); if(result.size() <= 0){ FlightStcsValueModel node = new FlightStcsValueModel(); @@ -1657,7 +1619,7 @@ public class FltPlanQueryRepository { } return result; - } + } /** * 비행승인 통계 카테고리 비행승인 @@ -1667,14 +1629,14 @@ public class FltPlanQueryRepository { */ public List fltPlanAprvnStcs(String date, String groupId, boolean authCheck, String[] formatParam){ // QCtrCntrlBas bas = QCtrCntrlBas.ctrCntrlBas; - - QFltPlanBas qFltPlanBas = QFltPlanBas.fltPlanBas; - + + QFltPlanBas qFltPlanBas = QFltPlanBas.fltPlanBas; + StringTemplate formattedDate = Expressions.stringTemplate( "DATE_FORMAT({0}, {1})" , qFltPlanBas.createDt , ConstantImpl.create(formatParam[0])); - + StringTemplate formattedDate2 = Expressions.stringTemplate( "DATE_FORMAT({0}, {1})" , qFltPlanBas.createDt @@ -1689,15 +1651,15 @@ public class FltPlanQueryRepository { List result = query .select( Projections.bean( - FlightStcsValueModel.class , + FlightStcsValueModel.class , formattedDate2.as("name"), qFltPlanBas.planSno.count().as("value") ) ) - .from(qFltPlanBas) + .from(qFltPlanBas) .where(builder) - .groupBy(formattedDate2) - .fetch(); + .groupBy(formattedDate2) + .fetch(); if(result.size() <= 0){ FlightStcsValueModel node = new FlightStcsValueModel(); @@ -1709,7 +1671,7 @@ public class FltPlanQueryRepository { } return result; - } + } /** @@ -1727,7 +1689,7 @@ public class FltPlanQueryRepository { , qFltPlanBas.createDt , ConstantImpl.create(formatParam[0])); - BooleanBuilder builder = new BooleanBuilder(); + BooleanBuilder builder = new BooleanBuilder(); if(date != null && date.length() > 0) builder.and(formattedDate.eq(date)); if(groupId != null && !(groupId.equals(""))) builder.and(qFltPlanBas.groupId.eq(groupId)); if(authCheck) builder.and(qFltPlanBas.cstmrSno.eq(jwtTokenUtil.getCstmrSnoByToken())); @@ -1735,7 +1697,7 @@ public class FltPlanQueryRepository { List result = query .select( Projections.bean(FlightStcsValueModel.class, - qFltPlanCtrCntrlRel.idntfNum.as("name") // 결과 객체의 프로퍼티 이름을 지정 + qFltPlanCtrCntrlRel.idntfNum.as("name") // 결과 객체의 프로퍼티 이름을 지정 ) ) .from(qFltPlanCtrCntrlRel) @@ -1746,7 +1708,7 @@ public class FltPlanQueryRepository { .orderBy(qFltPlanCtrCntrlRel.planSno.countDistinct().desc()) .limit(5) .fetch(); - + if(result.size() <= 0){ FlightStcsValueModel node = new FlightStcsValueModel(); @@ -1775,7 +1737,7 @@ public class FltPlanQueryRepository { , qFltPlanArcrft.createDt , ConstantImpl.create(formatParam[0])); - BooleanBuilder builder = new BooleanBuilder(); + BooleanBuilder builder = new BooleanBuilder(); if(date != null && date.length() > 0) builder.and(formattedDate.eq(date)); if(groupId != null && !(groupId.equals(""))) builder.and(qFltPlanBas.groupId.eq(groupId)); if(authCheck) builder.and(qFltPlanBas.cstmrSno.eq(jwtTokenUtil.getCstmrSnoByToken())); @@ -1787,15 +1749,15 @@ public class FltPlanQueryRepository { qFltPlanArcrft.planSno.countDistinct().as("value") ) ) - .from(qFltPlanArcrft) + .from(qFltPlanArcrft) .leftJoin(qFltPlanBas) .on(qFltPlanBas.planSno.eq(qFltPlanArcrft.planSno)) .where(builder) - .groupBy(qFltPlanArcrft.idntfNum) + .groupBy(qFltPlanArcrft.idntfNum) .orderBy(qFltPlanArcrft.planSno.countDistinct().desc()) .limit(5) .fetch(); - + if(result.size() <= 0){ FlightStcsValueModel node = new FlightStcsValueModel(); @@ -1816,15 +1778,15 @@ public class FltPlanQueryRepository { */ public List fltTopPlanAprvnStcs(String date, String groupId, boolean authCheck, String[] formatParam){ - QFltPlanArcrft qFltPlanArcrft = QFltPlanArcrft.fltPlanArcrft; + QFltPlanArcrft qFltPlanArcrft = QFltPlanArcrft.fltPlanArcrft; QFltPlanBas qFltPlanBas = QFltPlanBas.fltPlanBas; - StringTemplate formattedDate = Expressions.stringTemplate( + StringTemplate formattedDate = Expressions.stringTemplate( "DATE_FORMAT({0}, {1})" , qFltPlanBas.createDt , ConstantImpl.create(formatParam[0])); - BooleanBuilder builder = new BooleanBuilder(); + BooleanBuilder builder = new BooleanBuilder(); if(date != null && date.length() > 0) builder.and(formattedDate.eq(date)); builder.and(qFltPlanBas.aprvlYn.eq("Y")); if(authCheck) builder.and(qFltPlanBas.cstmrSno.eq(jwtTokenUtil.getCstmrSnoByToken())); @@ -1837,15 +1799,15 @@ public class FltPlanQueryRepository { qFltPlanArcrft.planSno.countDistinct().as("value") ) ) - .from(qFltPlanArcrft) - .leftJoin(qFltPlanBas) + .from(qFltPlanArcrft) + .leftJoin(qFltPlanBas) .on(qFltPlanArcrft.planSno.eq(qFltPlanBas.planSno)) - .where(builder) - .groupBy(qFltPlanArcrft.idntfNum) + .where(builder) + .groupBy(qFltPlanArcrft.idntfNum) .orderBy(qFltPlanArcrft.planSno.countDistinct().desc()) .limit(5) .fetch(); - + if(result.size() <= 0){ FlightStcsValueModel node = new FlightStcsValueModel(); @@ -1890,7 +1852,7 @@ public class FltPlanQueryRepository { BooleanBuilder builder = new BooleanBuilder(); if(groupId != null && !(groupId.equals("")))builder.and(qFltPlanBas.groupId.eq(groupId)); if(authCheck) builder.and(qFltPlanBas.cstmrSno.eq(jwtTokenUtil.getCstmrSnoByToken())); - + BooleanExpression dateExpression = null; switch (cate){ case "-2" : @@ -1929,9 +1891,9 @@ public class FltPlanQueryRepository { } - + public List getFlightDronList(String cptAuth, String serviceType){ - + QComIdntfBas cib = QComIdntfBas.comIdntfBas; QFltPlanArcrft fpa = QFltPlanArcrft.fltPlanArcrft; QFltPlanBas fpb = QFltPlanBas.fltPlanBas; @@ -1942,9 +1904,9 @@ public class FltPlanQueryRepository { Expression groupOrder = new CaseBuilder() .when(pgb.groupNm.eq(cptAuth)).then(0) .otherwise(1); - - BooleanBuilder builder = new BooleanBuilder(); - + + BooleanBuilder builder = new BooleanBuilder(); + if(!serviceType.equals("all")) { builder.and(fpb.serviceType.contains(serviceType)); } @@ -1953,7 +1915,7 @@ public class FltPlanQueryRepository { builder.and(pgb.groupNm.eq("cptAuth")); } Instant now = Instant.now(); - + Instant todayStart = LocalDate.now().atStartOfDay().toInstant(ZoneOffset.UTC); Instant todayEnd = LocalDate.now().plusDays(1).atStartOfDay().toInstant(ZoneOffset.UTC); @@ -1998,9 +1960,9 @@ public class FltPlanQueryRepository { return result; } - + public Map getFlightDronStcs(String cptAuth){ - + QComIdntfBas cib = QComIdntfBas.comIdntfBas; QFltPlanArcrft fpa = QFltPlanArcrft.fltPlanArcrft; QFltPlanBas fpb = QFltPlanBas.fltPlanBas; @@ -2008,13 +1970,13 @@ public class FltPlanQueryRepository { QFltPlanCtrCntrlRel fpccr = QFltPlanCtrCntrlRel.fltPlanCtrCntrlRel; QCtrCntrlBas ccb = QCtrCntrlBas.ctrCntrlBas; - BooleanBuilder builder = new BooleanBuilder(); - + BooleanBuilder builder = new BooleanBuilder(); + if(!cptAuth.equals("KAC")) { builder.and(pgb.groupNm.eq("cptAuth")); } Instant now = Instant.now(); - + Instant todayStart = LocalDate.now().atStartOfDay().toInstant(ZoneOffset.UTC); Instant todayEnd = LocalDate.now().plusDays(1).atStartOfDay().toInstant(ZoneOffset.UTC); @@ -2057,7 +2019,178 @@ public class FltPlanQueryRepository { result.put(status, count); } - + return result; } + + + // 기체번호로 비행계획서 조회 + public List getPlanByIdntfNum(String idntfNum) { + QFltPlanBas bas = QFltPlanBas.fltPlanBas; + QFltPlanArcrft arcrft = QFltPlanArcrft.fltPlanArcrft; + QFltPlanArea area = QFltPlanArea.fltPlanArea; + QFltPlanAreaCoord coord = QFltPlanAreaCoord.fltPlanAreaCoord; + + Instant fltNowDt = Instant.now(); + + List rs = query.from(bas) + .leftJoin(arcrft) + .on(bas.planSno.eq(arcrft.planSno)) + .leftJoin(area) + .on(area.planSno.eq(area.planSno)) + .where( + arcrft.idntfNum.eq(idntfNum) + .and(bas.aprvlYn.eq("Y")) + .and(bas.schFltStDt.before(fltNowDt)) + .and(bas.schFltEndDt.after(fltNowDt)) + ) + .orderBy(bas.createDt.desc()) + .transform( + GroupBy.groupBy(bas.planSno) + .list(Projections.bean( + BasFlightPlanModel.class, + bas.planSno, + bas.groupId, + bas.cstmrSno, + bas.memberName, + bas.fltType.stringValue().as("fltType"), + bas.email, + bas.hpno, + bas.clncd, + bas.addr, + bas.addrDtlCn, + bas.zip, + bas.schFltStDt, + bas.schFltEndDt, + bas.fltPurpose.stringValue().as("fltPurpose"), + bas.aprvlYn, + bas.delYn, + bas.fileGroupNo, + bas.createUserId, + bas.createDt, + bas.updateUserId, + bas.updateDt, + bas.corpRegYn, + bas.serviceType, + GroupBy.list(Projections.bean( + BasFlightPlanAreaModel.class, + area.planAreaSno, + area.planSno, + area.areaType, + area.fltMethod.stringValue().as("fltMethod"), + area.bufferZone, + area.fltElev, + area.createUserId, + area.createDt, + area.updateUserId, + area.updateDt, + area.fltMothoeRm + ).skipNulls()).as("areaList"), + GroupBy.list(Projections.bean( + BasFlightPlanArcrftModel.class, + arcrft.planArcrftSno, + arcrft.planSno, + arcrft.arcrftSno, + arcrft.idntfNum, + arcrft.groupNm, + arcrft.prdctNum, + arcrft.arcrftTypeCd.stringValue().as("arcrftTypeCd"), + arcrft.arcrftModelNm, + arcrft.prdctCmpnNm, + arcrft.prdctDate, + arcrft.arcrftLngth, + arcrft.arcrftWdth, + arcrft.arcrftHght, + arcrft.arcrftWght, + arcrft.arcrftWghtCd.stringValue().as("arcrftWghtCd"), + arcrft.wghtTypeCd, + arcrft.imageUrl, + arcrft.takeoffWght, + arcrft.useYn, + arcrft.cameraYn, + arcrft.insrncYn, + arcrft.ownerNm, + arcrft.createUserId, + arcrft.createDt, + arcrft.updateUserId, + arcrft.updateDt, + arcrft.acrftInsuranceYn, + arcrft.insuranceExperiod, + arcrft.corporationNm + ).skipNulls()).as("arcrftList") + ).skipNulls()) + ); + + if (rs != null && !rs.isEmpty()) { + + // enum cd -> nm + for (BasFlightPlanModel p : rs) { + if (p == null) continue; + FltType fltType = FltType.fromCode(p.getFltType()); + if (fltType != null) p.setFltTypeNm(fltType.getValue()); + FltPurpose fltPurpose = FltPurpose.fromCode(p.getFltPurpose()); + if (fltPurpose != null) p.setFltPurposeNm(fltPurpose.getValue()); + + if (p.getAreaList() != null && !p.getAreaList().isEmpty()) { + for (BasFlightPlanAreaModel a : p.getAreaList()) { + if (a == null) continue; + FltMethod fltMethod = FltMethod.fromCode(a.getFltMethod()); + if (fltMethod != null) a.setFltMethodNm(fltMethod.getValue()); + } + } + if (p.getArcrftList() != null && !p.getArcrftList().isEmpty()) { + for (BasFlightPlanArcrftModel c : p.getArcrftList()) { + if (c == null) continue; + ArcrftTypeCd arcrftTypeCd = ArcrftTypeCd.fromCode(c.getArcrftTypeCd()); + if (arcrftTypeCd != null) c.setArcrftTypeNm(arcrftTypeCd.getValue()); + ArcrftWghtCd arcrftWghtCd = ArcrftWghtCd.fromCode(c.getArcrftWghtCd()); + if (arcrftWghtCd != null) c.setArcrftWghtNm(arcrftWghtCd.getValue()); + } + } + } + + + + List areaSnoList = rs.stream() + .filter(p -> p != null && p.getAreaList() != null && !p.getAreaList().isEmpty()) + .map(p -> { + List areaList = p.getAreaList(); + return areaList.stream().map(BasFlightPlanAreaModel::getPlanAreaSno).collect(Collectors.toList()); + }).flatMap(Collection::stream).collect(Collectors.toList()); + + List coordEntities = query.select( + Projections.bean( + BasFlightPlanAreaCoordModel.class, + coord.planAreaCoordSno, + coord.planAreaSno, + coord.lat, + coord.lon, + coord.createUserId, + coord.createDt + ) + ) + .from(coord) + .where(coord.planAreaSno.in(areaSnoList)) + .orderBy(coord.planAreaSno.asc(), coord.planAreaCoordSno.asc()) + .fetch(); + + + Map> coordMap = coordEntities.stream().collect(Collectors.groupingBy(BasFlightPlanAreaCoordModel::getPlanAreaSno)); + if (!areaSnoList.isEmpty()) { + rs.forEach(r -> { + List areaList = r.getAreaList(); + areaList.forEach(a -> { + List coordList = coordMap.get(a.getPlanAreaSno()); + if (coordList != null && !coordList.isEmpty()) { + a.setCoordList(coordList); + } + }); + }); + } + } + + return rs; + } + + } \ No newline at end of file From 8fb8d4f430d0b2e4b7ec8657c205c4b697a54c8c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=B0=95=EC=9E=AC=EC=9A=B0?= <박재우@host.docker.internal> Date: Wed, 15 Nov 2023 17:20:00 +0900 Subject: [PATCH 8/8] rollback --- .../src/main/java/com/palnet/server/command/SocketCommand.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pav-socket/src/main/java/com/palnet/server/command/SocketCommand.java b/pav-socket/src/main/java/com/palnet/server/command/SocketCommand.java index f98a76b8..e3375b18 100644 --- a/pav-socket/src/main/java/com/palnet/server/command/SocketCommand.java +++ b/pav-socket/src/main/java/com/palnet/server/command/SocketCommand.java @@ -167,7 +167,7 @@ public class SocketCommand { if (model.getObjectId().indexOf("PA") > -1) { // messageProducer.sendControlHistoryMessage(model); try { - taskServerService.sendData(model); +// taskServerService.sendData(model); // taskWbService.sendDataWebClient(model); } catch (Exception e) { logger.error("ERROR : {}\n{}", e.getMessage(), e.getStackTrace());