Browse Source

Laanc 검증 추가

pull/10/head
lkd9125(이경도) 11 months ago
parent
commit
b21670ed3f
  1. 4
      pav-server/src/main/java/com/palnet/biz/api/bas/laanc/controller/BasLaancController.java
  2. 128
      pav-server/src/main/java/com/palnet/biz/api/bas/laanc/service/BasLaancService.java
  3. 2
      pav-server/src/main/java/com/palnet/comn/utils/InstantUtils.java

4
pav-server/src/main/java/com/palnet/biz/api/bas/laanc/controller/BasLaancController.java

@ -48,6 +48,8 @@ public class BasLaancController {
@ApiOperation(value = "LAANC 검증") @ApiOperation(value = "LAANC 검증")
@Tag(name = "LAANC", description = "LAANC 관련 API") @Tag(name = "LAANC", description = "LAANC 관련 API")
public ResponseEntity<? extends BasicResponse> validationLaanc(@RequestBody BasLaancPlanRq rq) { public ResponseEntity<? extends BasicResponse> validationLaanc(@RequestBody BasLaancPlanRq rq) {
log.warn("안뇽");
BasLaancValidatedRs rs = null; BasLaancValidatedRs rs = null;
try { try {
log.debug(">>> rq : {}", rq); log.debug(">>> rq : {}", rq);
@ -67,6 +69,8 @@ public class BasLaancController {
.body(new ErrorResponse("Server Error", "-1")); .body(new ErrorResponse("Server Error", "-1"));
} }
log.warn("new SuccessResponse<>(rs) -? {}", new SuccessResponse<>(rs));
return ResponseEntity.ok().body(new SuccessResponse<>(rs)); return ResponseEntity.ok().body(new SuccessResponse<>(rs));
} }

128
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; 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);
}
} }

2
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 최초 생성 * 2023-09-14(014) dhji 최초 생성
*/ */
public class InstantUtils { 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_DATETIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
private static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd"; private static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd";

Loading…
Cancel
Save