|
|
@ -1,20 +1,56 @@ |
|
|
|
package com.palnet.biz.api.bas.laanc.service; |
|
|
|
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.AnctCstmrModel; |
|
|
|
import com.palnet.biz.api.acnt.cstmr.model.AnctCstmrTermsModel; |
|
|
|
import com.palnet.biz.api.acnt.cstmr.model.AnctCstmrTermsModel; |
|
|
|
import com.palnet.biz.api.acnt.jwt.utils.JwtTokenUtil; |
|
|
|
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.model.LaancPdfModel; |
|
|
|
import com.palnet.biz.api.comn.file.service.ComnFileService; |
|
|
|
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.model.ComnSmsLaancAprovModel; |
|
|
|
import com.palnet.biz.api.comn.sms.service.ComnSmsService; |
|
|
|
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.PilotValidRq; |
|
|
|
import com.palnet.biz.api.external.model.PilotValidRs; |
|
|
|
import com.palnet.biz.api.external.model.PilotValidRs; |
|
|
|
import com.palnet.biz.api.external.service.TsService; |
|
|
|
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.ArcrftWghtCd; |
|
|
|
import com.palnet.biz.jpa.entity.type.FltType; |
|
|
|
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.PtyCstmrQueryRepository; |
|
|
|
import com.palnet.biz.jpa.repository.pty.PtyGroupBasRepository; |
|
|
|
import com.palnet.biz.jpa.repository.pty.PtyGroupBasRepository; |
|
|
|
import com.palnet.biz.jpa.repository.pty.PtyTermsAgreeTxnRepository; |
|
|
|
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.AreaUtils; |
|
|
|
import com.palnet.comn.utils.HttpUtils; |
|
|
|
import com.palnet.comn.utils.HttpUtils; |
|
|
|
import com.palnet.comn.utils.InstantUtils; |
|
|
|
import com.palnet.comn.utils.InstantUtils; |
|
|
|
|
|
|
|
|
|
|
|
import lombok.RequiredArgsConstructor; |
|
|
|
import lombok.RequiredArgsConstructor; |
|
|
|
import lombok.extern.slf4j.Slf4j; |
|
|
|
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 |
|
|
|
* packageName : com.palnet.biz.api.bas.laanc.service |
|
|
@ -63,6 +90,7 @@ public class BasLaancService { |
|
|
|
private final FltPlanPilotRepository fltPlanPilotRepository; |
|
|
|
private final FltPlanPilotRepository fltPlanPilotRepository; |
|
|
|
private final PtyCstmrQueryRepository ptyCstmrQueryRepository; |
|
|
|
private final PtyCstmrQueryRepository ptyCstmrQueryRepository; |
|
|
|
private final PtyTermsAgreeTxnRepository ptyTermsAgreeTxnRepository; |
|
|
|
private final PtyTermsAgreeTxnRepository ptyTermsAgreeTxnRepository; |
|
|
|
|
|
|
|
private final ComRiseSetQueryRepository comRiseSetQueryRepository; |
|
|
|
private final TsService tsService; |
|
|
|
private final TsService tsService; |
|
|
|
private final CtrTrnsLctnService ctrTrnsLctnService; |
|
|
|
private final CtrTrnsLctnService ctrTrnsLctnService; |
|
|
|
private final ComnFileService comnFileService; |
|
|
|
private final ComnFileService comnFileService; |
|
|
@ -75,6 +103,8 @@ public class BasLaancService { |
|
|
|
// LAANC 검증
|
|
|
|
// 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(); |
|
|
|
BasLaancValidatedRs rs = new BasLaancValidatedRs(); |
|
|
|
|
|
|
|
|
|
|
|
// 조종사 자격 확인 - 무게가 2kg 초과이거나 상업적일 경우에만 진행
|
|
|
|
// 조종사 자격 확인 - 무게가 2kg 초과이거나 상업적일 경우에만 진행
|
|
|
@ -482,4 +512,76 @@ public class BasLaancService { |
|
|
|
return rs; |
|
|
|
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); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|