From b21670ed3f4ddb438fd951508e84ddc9dc5a28cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?lkd9125=28=EC=9D=B4=EA=B2=BD=EB=8F=84=29?= Date: Tue, 17 Oct 2023 13:54:02 +0900 Subject: [PATCH 1/5] =?UTF-8?q?Laanc=20=EA=B2=80=EC=A6=9D=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../laanc/controller/BasLaancController.java | 4 + .../bas/laanc/service/BasLaancService.java | 132 ++++++++++++++++-- .../com/palnet/comn/utils/InstantUtils.java | 2 +- 3 files changed, 122 insertions(+), 16 deletions(-) diff --git a/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/controller/BasLaancController.java b/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/controller/BasLaancController.java index 4294f0e..c9e1261 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/controller/BasLaancController.java +++ b/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/controller/BasLaancController.java @@ -48,6 +48,8 @@ public class BasLaancController { @ApiOperation(value = "LAANC 검증") @Tag(name = "LAANC", description = "LAANC 관련 API") public ResponseEntity validationLaanc(@RequestBody BasLaancPlanRq rq) { + log.warn("안뇽"); + BasLaancValidatedRs rs = null; try { log.debug(">>> rq : {}", rq); @@ -67,6 +69,8 @@ public class BasLaancController { .body(new ErrorResponse("Server Error", "-1")); } + log.warn("new SuccessResponse<>(rs) -? {}", new SuccessResponse<>(rs)); + return ResponseEntity.ok().body(new SuccessResponse<>(rs)); } diff --git a/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/service/BasLaancService.java b/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/service/BasLaancService.java index fe029a3..2ffc04e 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/service/BasLaancService.java +++ b/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/service/BasLaancService.java @@ -1,20 +1,56 @@ package com.palnet.biz.api.bas.laanc.service; +import java.time.Instant; +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.time.ZoneId; +import java.time.ZonedDateTime; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +import org.locationtech.jts.geom.Coordinate; +import org.locationtech.jts.geom.Geometry; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.StringUtils; + import com.palnet.biz.api.acnt.cstmr.model.AnctCstmrModel; import com.palnet.biz.api.acnt.cstmr.model.AnctCstmrTermsModel; import com.palnet.biz.api.acnt.jwt.utils.JwtTokenUtil; -import com.palnet.biz.api.bas.laanc.model.*; +import com.palnet.biz.api.bas.laanc.model.BasLaancArcrftModel; +import com.palnet.biz.api.bas.laanc.model.BasLaancAreaCoordModel; +import com.palnet.biz.api.bas.laanc.model.BasLaancAreaModel; +import com.palnet.biz.api.bas.laanc.model.BasLaancLastRs; +import com.palnet.biz.api.bas.laanc.model.BasLaancPlanRq; +import com.palnet.biz.api.bas.laanc.model.BasLaancValidatedRs; import com.palnet.biz.api.comn.file.model.LaancPdfModel; import com.palnet.biz.api.comn.file.service.ComnFileService; import com.palnet.biz.api.comn.sms.model.ComnSmsLaancAprovModel; import com.palnet.biz.api.comn.sms.service.ComnSmsService; +import com.palnet.biz.api.comn.sunriseset.model.ComnSunrisesetCoordRq; +import com.palnet.biz.api.comn.sunriseset.model.ComnSunrisesetRs; import com.palnet.biz.api.external.model.PilotValidRq; import com.palnet.biz.api.external.model.PilotValidRs; import com.palnet.biz.api.external.service.TsService; -import com.palnet.biz.jpa.entity.*; +import com.palnet.biz.jpa.entity.ComFileBas; +import com.palnet.biz.jpa.entity.FltPlanArcrft; +import com.palnet.biz.jpa.entity.FltPlanArea; +import com.palnet.biz.jpa.entity.FltPlanAreaCoord; +import com.palnet.biz.jpa.entity.FltPlanBas; +import com.palnet.biz.jpa.entity.FltPlanPilot; +import com.palnet.biz.jpa.entity.PtyGroupBas; +import com.palnet.biz.jpa.entity.PtyTermsAgreeTxn; import com.palnet.biz.jpa.entity.type.ArcrftWghtCd; import com.palnet.biz.jpa.entity.type.FltType; -import com.palnet.biz.jpa.repository.flt.*; +import com.palnet.biz.jpa.repository.com.ComRiseSetQueryRepository; +import com.palnet.biz.jpa.repository.flt.FltPlanArcrftRepository; +import com.palnet.biz.jpa.repository.flt.FltPlanAreaCoordRepository; +import com.palnet.biz.jpa.repository.flt.FltPlanAreaRepository; +import com.palnet.biz.jpa.repository.flt.FltPlanBasRepository; +import com.palnet.biz.jpa.repository.flt.FltPlanPilotRepository; import com.palnet.biz.jpa.repository.pty.PtyCstmrQueryRepository; import com.palnet.biz.jpa.repository.pty.PtyGroupBasRepository; import com.palnet.biz.jpa.repository.pty.PtyTermsAgreeTxnRepository; @@ -26,18 +62,9 @@ import com.palnet.comn.utils.AirspaceUtils; import com.palnet.comn.utils.AreaUtils; import com.palnet.comn.utils.HttpUtils; import com.palnet.comn.utils.InstantUtils; + import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.locationtech.jts.geom.Coordinate; -import org.locationtech.jts.geom.Geometry; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.util.StringUtils; - -import java.time.Instant; -import java.util.ArrayList; -import java.util.List; -import java.util.stream.Collectors; /** * packageName : com.palnet.biz.api.bas.laanc.service @@ -63,6 +90,7 @@ public class BasLaancService { private final FltPlanPilotRepository fltPlanPilotRepository; private final PtyCstmrQueryRepository ptyCstmrQueryRepository; private final PtyTermsAgreeTxnRepository ptyTermsAgreeTxnRepository; + private final ComRiseSetQueryRepository comRiseSetQueryRepository; private final TsService tsService; private final CtrTrnsLctnService ctrTrnsLctnService; private final ComnFileService comnFileService; @@ -73,7 +101,9 @@ public class BasLaancService { private final String FILE_DOWNLOAD_URL = "/api/comn/file/download"; // LAANC 검증 - public BasLaancValidatedRs validationLaanc(BasLaancPlanRq rq) { + public BasLaancValidatedRs validationLaanc(BasLaancPlanRq rq) { + + if(this.laancParamValid(rq)) throw new CustomException(ErrorCode.NON_VALID_PARAMETER); BasLaancValidatedRs rs = new BasLaancValidatedRs(); @@ -130,7 +160,7 @@ public class BasLaancService { rs.setFlightArea(validationPlanDbRs.isFlightArea()); return rs; - } + } // 비행계획서 등록, 약관 등록, 공문 생성 @Transactional @@ -482,4 +512,76 @@ public class BasLaancService { return rs; } + /** + * 야간 특별비행 유무 확인 + * 1. 비행시작 일자 금일 ~ 90일 이내 + * 2. 비행 종료일자 금일 ~ 6개월까지 -- validtion 통과후 일몰 + * 3. 일몰, 일출 시간[해떠있는 시간] 체크 + * @param rq + * @return + */ + private boolean laancParamValid(BasLaancPlanRq rq){ + + if(rq == null) return false; + + // TODO :: Instant는 ChronoUnit.MONTHS 지원을 해주지 않아 LocalDateTime으로 계산을 진행했습니다. + LocalDateTime today = Instant.now().atZone(ZoneId.of(InstantUtils.DEFAULT_ZONE)).toLocalDateTime(); + + LocalDateTime stDt = rq.getSchFltStDt().atZone(ZoneId.of(InstantUtils.DEFAULT_ZONE)).toLocalDateTime(); + LocalDateTime endDt = rq.getSchFltEndDt().atZone(ZoneId.of(InstantUtils.DEFAULT_ZONE)).toLocalDateTime(); + + // schFltStDt가 금일부터 90일 이내에 있는지 확인 + boolean isSchFltStDtValid = stDt.isAfter(today) && + stDt.isBefore(today.plus(90, ChronoUnit.DAYS)); + + // schFltEndDt가 SchFltStDt보다 뒤에 있고, 금일부터 6개월 이내에 있는지 확인 + boolean isSchFltEndDtValid = endDt.isAfter(stDt) && + endDt.isBefore(today.plus(6, ChronoUnit.MONTHS)); + + // 시간 파라미터가 맞지 않을경우 + if(!(isSchFltStDtValid && isSchFltEndDtValid)) return false; + + String[] stringStDt = InstantUtils.toDatetimeString(rq.getSchFltStDt()).split(" "); + String[] stringEndDt = InstantUtils.toDatetimeString(rq.getSchFltEndDt()).split(" "); + + ComnSunrisesetCoordRq comnSunrisesetCoordRq = new ComnSunrisesetCoordRq(stringStDt[0].replace("-", ""), stringEndDt[0].replace("-", ""), null, null); + + // 일출, 일몰 시간 구하기 + ComnSunrisesetRs comnSunrisesetRs = comRiseSetQueryRepository.findBySearchCoordTransform(comnSunrisesetCoordRq); + + LocalTime sunUp = this.convertStringToTime(comnSunrisesetRs.getSunrise(), "HHmmss"); + LocalTime sunDown = this.convertStringToTime(comnSunrisesetRs.getSunset(), "HHmmss"); + + LocalTime stringStTm = this.convertStringToTime(stringStDt[1].replace(":", ""), "HHmmss"); + LocalTime stringEndTm = this.convertStringToTime(stringEndDt[1].replace(":", ""), "HHmmss"); + + boolean stTmValid = this.isBetweenSunriseAndSunset(sunUp, sunDown, stringStTm); + boolean endTmValid = this.isBetweenSunriseAndSunset(sunUp, sunDown, stringEndTm); + + return stTmValid && endTmValid; + } + + /** + * String to LocalTime - Instant는 시간정보만 담을 수 없음.. + * @param time + * @param format + * @return + */ + private LocalTime convertStringToTime(String time, String format){ + DateTimeFormatter formatter = DateTimeFormatter.ofPattern(format); + return LocalTime.parse(time, formatter); + } + + /** + * 일출, 일몰 시간 아래에 있는지 확인 + * @param sunrise + * @param sunset + * @param timeToCheck + * @return + */ + private boolean isBetweenSunriseAndSunset(LocalTime sunrise, LocalTime sunset, LocalTime timeToCheck) { + return (timeToCheck.isAfter(sunrise) || timeToCheck.equals(sunrise)) && + timeToCheck.isBefore(sunset); + } + } diff --git a/pav-server/src/main/java/com/palnet/comn/utils/InstantUtils.java b/pav-server/src/main/java/com/palnet/comn/utils/InstantUtils.java index 43b3e22..834b750 100644 --- a/pav-server/src/main/java/com/palnet/comn/utils/InstantUtils.java +++ b/pav-server/src/main/java/com/palnet/comn/utils/InstantUtils.java @@ -17,7 +17,7 @@ import java.time.format.DateTimeFormatter; * 2023-09-14(014) dhji 최초 생성 */ public class InstantUtils { - private static final String DEFAULT_ZONE = "Asia/Seoul"; + public static final String DEFAULT_ZONE = "Asia/Seoul"; private static final String DEFAULT_DATETIME_FORMAT = "yyyy-MM-dd HH:mm:ss"; private static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd"; From d1df3b400d9a510d22d01cd058136988a47a4719 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?lkd9125=28=EC=9D=B4=EA=B2=BD=EB=8F=84=29?= Date: Tue, 17 Oct 2023 14:00:03 +0900 Subject: [PATCH 2/5] =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../palnet/biz/api/bas/laanc/service/BasLaancService.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/service/BasLaancService.java b/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/service/BasLaancService.java index 2ffc04e..40e5513 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/service/BasLaancService.java +++ b/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/service/BasLaancService.java @@ -103,7 +103,8 @@ public class BasLaancService { // LAANC 검증 public BasLaancValidatedRs validationLaanc(BasLaancPlanRq rq) { - if(this.laancParamValid(rq)) throw new CustomException(ErrorCode.NON_VALID_PARAMETER); + // False면 파라미터에 문제있음, true면 통과 + if(!(this.laancParamValid(rq))) throw new CustomException(ErrorCode.NON_VALID_PARAMETER); BasLaancValidatedRs rs = new BasLaancValidatedRs(); @@ -546,8 +547,7 @@ public class BasLaancService { ComnSunrisesetCoordRq comnSunrisesetCoordRq = new ComnSunrisesetCoordRq(stringStDt[0].replace("-", ""), stringEndDt[0].replace("-", ""), null, null); - // 일출, 일몰 시간 구하기 - ComnSunrisesetRs comnSunrisesetRs = comRiseSetQueryRepository.findBySearchCoordTransform(comnSunrisesetCoordRq); + ComnSunrisesetRs comnSunrisesetRs = comRiseSetQueryRepository.findBySearchCoordDateTransform(comnSunrisesetCoordRq); LocalTime sunUp = this.convertStringToTime(comnSunrisesetRs.getSunrise(), "HHmmss"); LocalTime sunDown = this.convertStringToTime(comnSunrisesetRs.getSunset(), "HHmmss"); From d4760093ab2b7373ab5a52e1867697105372d01a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?lkd9125=28=EC=9D=B4=EA=B2=BD=EB=8F=84=29?= Date: Tue, 17 Oct 2023 14:15:36 +0900 Subject: [PATCH 3/5] =?UTF-8?q?Laanc=20=EA=B2=80=EC=A6=9D=20RS=ED=8C=8C?= =?UTF-8?q?=EB=9D=BC=EB=AF=B8=ED=84=B0=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../biz/api/bas/laanc/model/BasLaancValidatedRs.java | 4 ++++ .../biz/api/bas/laanc/service/BasLaancService.java | 11 +++++------ 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancValidatedRs.java b/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancValidatedRs.java index 50be0f1..055afbf 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancValidatedRs.java +++ b/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancValidatedRs.java @@ -37,6 +37,8 @@ public class BasLaancValidatedRs { private boolean isReport; // 신고 대상 - 상업적이면서 기체중량2kg 이상일경우 - true + private boolean isNotSpecial; // 특별승인 여부 + private String corpRegYn; // 사업자 여부 private List pilotValidRsList; // 자격여부 @@ -51,11 +53,13 @@ public class BasLaancValidatedRs { // && !isArcrftDuplicated // 기체 중복여부 // && !isPlanAreaDuplicatd // 비행구역 중복여부 && isFlightArea // 비행가능여부 + && isNotSpecial && isCheckingLance(); } return isCheckingLance() // && !isPlanAreaDuplicatd // && !isArcrftDuplicated + && isNotSpecial && isFlightArea; } diff --git a/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/service/BasLaancService.java b/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/service/BasLaancService.java index 40e5513..33b5c91 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/service/BasLaancService.java +++ b/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/service/BasLaancService.java @@ -103,9 +103,6 @@ public class BasLaancService { // LAANC 검증 public BasLaancValidatedRs validationLaanc(BasLaancPlanRq rq) { - // False면 파라미터에 문제있음, true면 통과 - if(!(this.laancParamValid(rq))) throw new CustomException(ErrorCode.NON_VALID_PARAMETER); - BasLaancValidatedRs rs = new BasLaancValidatedRs(); // 조종사 자격 확인 - 무게가 2kg 초과이거나 상업적일 경우에만 진행 @@ -159,6 +156,8 @@ public class BasLaancService { BasLaancValidatedRs validationPlanDbRs = this.validationPlanAirspace(rq); rs.setEvaluatedTargetArea(validationPlanDbRs.isEvaluatedTargetArea()); rs.setFlightArea(validationPlanDbRs.isFlightArea()); + rs.setNotSpecial(this.laancParamValid(rq)); + return rs; } @@ -523,7 +522,8 @@ public class BasLaancService { */ private boolean laancParamValid(BasLaancPlanRq rq){ - if(rq == null) return false; + // 시작날짜보다 종료날짜가 뒤에있으면 Exception발생 + if(!(rq.getSchFltEndDt().isAfter(rq.getSchFltStDt()))) throw new CustomException(ErrorCode.NON_VALID_PARAMETER); // TODO :: Instant는 ChronoUnit.MONTHS 지원을 해주지 않아 LocalDateTime으로 계산을 진행했습니다. LocalDateTime today = Instant.now().atZone(ZoneId.of(InstantUtils.DEFAULT_ZONE)).toLocalDateTime(); @@ -536,8 +536,7 @@ public class BasLaancService { stDt.isBefore(today.plus(90, ChronoUnit.DAYS)); // schFltEndDt가 SchFltStDt보다 뒤에 있고, 금일부터 6개월 이내에 있는지 확인 - boolean isSchFltEndDtValid = endDt.isAfter(stDt) && - endDt.isBefore(today.plus(6, ChronoUnit.MONTHS)); + boolean isSchFltEndDtValid = endDt.isBefore(today.plus(6, ChronoUnit.MONTHS)); // 시간 파라미터가 맞지 않을경우 if(!(isSchFltStDtValid && isSchFltEndDtValid)) return false; From 06e097f8816e98d207c249b55ef37d43f09c8389 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?lkd9125=28=EC=9D=B4=EA=B2=BD=EB=8F=84=29?= Date: Tue, 17 Oct 2023 14:16:25 +0900 Subject: [PATCH 4/5] =?UTF-8?q?=EC=A3=BC=EC=84=9D=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/palnet/biz/api/bas/laanc/model/BasLaancValidatedRs.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancValidatedRs.java b/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancValidatedRs.java index 055afbf..fe2e3e1 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancValidatedRs.java +++ b/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancValidatedRs.java @@ -37,7 +37,7 @@ public class BasLaancValidatedRs { private boolean isReport; // 신고 대상 - 상업적이면서 기체중량2kg 이상일경우 - true - private boolean isNotSpecial; // 특별승인 여부 + private boolean isNotSpecial; // 특별승인 여부 - 특별승인인 경우가 아니면 - true private String corpRegYn; // 사업자 여부 private List pilotValidRsList; // 자격여부 From 42f6538ae3073d67af5b4b6dac1056698becd726 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?lkd9125=28=EC=9D=B4=EA=B2=BD=EB=8F=84=29?= Date: Tue, 17 Oct 2023 14:17:49 +0900 Subject: [PATCH 5/5] =?UTF-8?q?=EC=B2=B4=ED=81=AC=EC=9A=A9=20=EB=A1=9C?= =?UTF-8?q?=EA=B7=B8=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../palnet/biz/api/bas/laanc/controller/BasLaancController.java | 1 - .../com/palnet/biz/api/bas/laanc/service/BasLaancService.java | 1 - 2 files changed, 2 deletions(-) diff --git a/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/controller/BasLaancController.java b/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/controller/BasLaancController.java index c9e1261..988701d 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/controller/BasLaancController.java +++ b/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/controller/BasLaancController.java @@ -48,7 +48,6 @@ public class BasLaancController { @ApiOperation(value = "LAANC 검증") @Tag(name = "LAANC", description = "LAANC 관련 API") public ResponseEntity validationLaanc(@RequestBody BasLaancPlanRq rq) { - log.warn("안뇽"); BasLaancValidatedRs rs = null; try { diff --git a/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/service/BasLaancService.java b/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/service/BasLaancService.java index 33b5c91..e3f4fe8 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/service/BasLaancService.java +++ b/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/service/BasLaancService.java @@ -4,7 +4,6 @@ import java.time.Instant; import java.time.LocalDateTime; import java.time.LocalTime; import java.time.ZoneId; -import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; import java.time.temporal.ChronoUnit; import java.util.ArrayList;