feature/laanc/sun-vaildation #10

Merged
dhji merged 7 commits from feature/laanc/sun-vaildation into develop 11 months ago
  1. 3
      pav-server/src/main/java/com/palnet/biz/api/bas/laanc/controller/BasLaancController.java
  2. 4
      pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancValidatedRs.java
  3. 126
      pav-server/src/main/java/com/palnet/biz/api/bas/laanc/service/BasLaancService.java
  4. 2
      pav-server/src/main/java/com/palnet/comn/utils/InstantUtils.java

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

@ -48,6 +48,7 @@ public class BasLaancController {
@ApiOperation(value = "LAANC 검증")
@Tag(name = "LAANC", description = "LAANC 관련 API")
public ResponseEntity<? extends BasicResponse> validationLaanc(@RequestBody BasLaancPlanRq rq) {
BasLaancValidatedRs rs = null;
try {
log.debug(">>> rq : {}", rq);
@ -67,6 +68,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));
}

4
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; // 특별승인 여부 - 특별승인인 경우가 아니면 - true
private String corpRegYn; // 사업자 여부
private List<PilotValidRs> pilotValidRsList; // 자격여부
@ -51,11 +53,13 @@ public class BasLaancValidatedRs {
// && !isArcrftDuplicated // 기체 중복여부
// && !isPlanAreaDuplicatd // 비행구역 중복여부
&& isFlightArea // 비행가능여부
&& isNotSpecial
&& isCheckingLance();
}
return isCheckingLance()
// && !isPlanAreaDuplicatd
// && !isArcrftDuplicated
&& isNotSpecial
&& isFlightArea;
}

126
pav-server/src/main/java/com/palnet/biz/api/bas/laanc/service/BasLaancService.java

@ -1,20 +1,55 @@
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.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 +61,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 +89,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;
@ -128,6 +155,8 @@ public class BasLaancService {
BasLaancValidatedRs validationPlanDbRs = this.validationPlanAirspace(rq);
rs.setEvaluatedTargetArea(validationPlanDbRs.isEvaluatedTargetArea());
rs.setFlightArea(validationPlanDbRs.isFlightArea());
rs.setNotSpecial(this.laancParamValid(rq));
return rs;
}
@ -482,4 +511,75 @@ public class BasLaancService {
return rs;
}
/**
* 야간 특별비행 유무 확인
* 1. 비행시작 일자 금일 ~ 90일 이내
* 2. 비행 종료일자 금일 ~ 6개월까지 -- validtion 통과후 일몰
* 3. 일몰, 일출 시간[해떠있는 시간] 체크
* @param rq
* @return
*/
private boolean laancParamValid(BasLaancPlanRq rq){
// 시작날짜보다 종료날짜가 뒤에있으면 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();
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.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.findBySearchCoordDateTransform(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 최초 생성
*/
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";

Loading…
Cancel
Save