|
|
|
@ -1,5 +1,6 @@
|
|
|
|
|
package com.palnet.biz.api.bas.flight.service; |
|
|
|
|
|
|
|
|
|
import com.palnet.biz.api.acnt.cstmr.model.AnctCstmrTermsModel; |
|
|
|
|
import com.palnet.biz.api.acnt.jwt.model.JwtGroupModel; |
|
|
|
|
import com.palnet.biz.api.acnt.jwt.utils.JwtTokenUtil; |
|
|
|
|
import com.palnet.biz.api.bas.flight.model.*; |
|
|
|
@ -11,13 +12,16 @@ import com.palnet.biz.api.external.service.TsService;
|
|
|
|
|
import com.palnet.biz.jpa.entity.*; |
|
|
|
|
import com.palnet.biz.jpa.repository.flt.*; |
|
|
|
|
import com.palnet.biz.jpa.repository.pty.PtyGroupQueryRepository; |
|
|
|
|
import com.palnet.biz.jpa.repository.pty.PtyTermsAgreeTxnRepository; |
|
|
|
|
import com.palnet.biz.scheduler.ctr.model.CtrTrnsLctnModel; |
|
|
|
|
import com.palnet.biz.scheduler.ctr.service.CtrTrnsLctnService; |
|
|
|
|
import com.palnet.comn.code.ErrorCode; |
|
|
|
|
import com.palnet.comn.exception.CustomException; |
|
|
|
|
import com.palnet.comn.utils.AirspaceUtils; |
|
|
|
|
import com.palnet.comn.utils.AreaUtils; |
|
|
|
|
import com.palnet.comn.utils.EncryptUtils; |
|
|
|
|
import com.palnet.comn.utils.HttpUtils; |
|
|
|
|
import lombok.RequiredArgsConstructor; |
|
|
|
|
import lombok.extern.log4j.Log4j2; |
|
|
|
|
import lombok.extern.slf4j.Slf4j; |
|
|
|
|
import org.apache.commons.lang3.StringUtils; |
|
|
|
|
import org.json.simple.JSONObject; |
|
|
|
@ -25,7 +29,6 @@ import org.json.simple.parser.JSONParser;
|
|
|
|
|
import org.json.simple.parser.ParseException; |
|
|
|
|
import org.locationtech.jts.geom.Coordinate; |
|
|
|
|
import org.locationtech.jts.geom.Geometry; |
|
|
|
|
import org.springframework.beans.factory.annotation.Autowired; |
|
|
|
|
import org.springframework.data.domain.PageImpl; |
|
|
|
|
import org.springframework.data.domain.PageRequest; |
|
|
|
|
import org.springframework.data.domain.Pageable; |
|
|
|
@ -40,6 +43,7 @@ import java.net.HttpURLConnection;
|
|
|
|
|
import java.net.MalformedURLException; |
|
|
|
|
import java.net.URL; |
|
|
|
|
import java.net.URLEncoder; |
|
|
|
|
import java.time.Instant; |
|
|
|
|
import java.util.ArrayList; |
|
|
|
|
import java.util.List; |
|
|
|
|
import java.util.Map; |
|
|
|
@ -60,6 +64,7 @@ public class BasFlightService {
|
|
|
|
|
private final FltPlanPilotRepository fltPlanPilotRepository; |
|
|
|
|
private final FltPlanQueryRepository fltPlanQueryRepository; |
|
|
|
|
private final PtyGroupQueryRepository ptyPlanQueryRepository; |
|
|
|
|
private final PtyTermsAgreeTxnRepository ptyTermsAgreeTxnRepository; |
|
|
|
|
private final TsService tsService; |
|
|
|
|
private final JwtTokenUtil jwtTokenUtil; |
|
|
|
|
private final AreaUtils areaUtils; |
|
|
|
@ -148,6 +153,7 @@ public class BasFlightService {
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public BasFlightPlanLaancRs planValid(BasFlightPlanModel rq) { |
|
|
|
|
|
|
|
|
|
BasFlightPlanLaancRs rs = BasFlightPlanLaancRs.builder() |
|
|
|
|
.pilotQlfcYn("N") |
|
|
|
|
.acrftInsuranceYn("N") |
|
|
|
@ -177,7 +183,8 @@ public class BasFlightService {
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
if (effectivePlanList != null && !effectivePlanList.isEmpty()) { |
|
|
|
|
plan: for (BasFlightPlanModel plan : effectivePlanList) { |
|
|
|
|
plan: |
|
|
|
|
for (BasFlightPlanModel plan : effectivePlanList) { |
|
|
|
|
// 1. 구역 조회
|
|
|
|
|
List<FltPlanArea> areaList = fltPlanAreaRepository.findByPlanSnoOrderByPlanAreaSnoAsc(plan.getPlanSno()); |
|
|
|
|
|
|
|
|
@ -258,7 +265,8 @@ public class BasFlightService {
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// 3. 중복 기체 확인
|
|
|
|
|
acrft: for (BasFlightPlanAreaCoordRq idntfNum : effectivePlanCount) { |
|
|
|
|
acrft: |
|
|
|
|
for (BasFlightPlanAreaCoordRq idntfNum : effectivePlanCount) { |
|
|
|
|
for (BasFlightPlanArcrftModel rqArcrft : rq.getArcrftList()) { |
|
|
|
|
if (rqArcrft.getIdntfNum().equals(idntfNum.getIdntfNum())) { |
|
|
|
|
// throw new CustomException(ErrorCode.ARCRFT_DATA_DUPLICATE);
|
|
|
|
@ -294,15 +302,15 @@ public class BasFlightService {
|
|
|
|
|
AirspaceUtils airspaceUtils = AirspaceUtils.getInstance(); |
|
|
|
|
Geometry rqGeometry = airspaceUtils.createGeometryByCoordinate(rqCoordBufferList); |
|
|
|
|
Integer fltElev = Integer.valueOf(rqArea.getFltElev()); |
|
|
|
|
if(fltElev == null) fltElev = 0; |
|
|
|
|
if (fltElev == null) fltElev = 0; |
|
|
|
|
AirspaceUtils.FeatureInfo featureInfo = new AirspaceUtils.FeatureInfo(null, null, 0, fltElev, rqGeometry); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 평가 가능 지역 판단
|
|
|
|
|
boolean duplicatedAirspace = airspaceUtils.isDuplicatedAirspace(featureInfo); |
|
|
|
|
rs.setEvaluatedTargetAreaYn(duplicatedAirspace ? "Y" : "N"); |
|
|
|
|
|
|
|
|
|
// 비행 가능 지역 판단
|
|
|
|
|
if(duplicatedAirspace){ |
|
|
|
|
if (duplicatedAirspace) { |
|
|
|
|
boolean validLaancAirspace = airspaceUtils.isValidLaancAirspace(featureInfo); |
|
|
|
|
rs.setFlightAreaYn(validLaancAirspace ? "Y" : "N"); |
|
|
|
|
} else { |
|
|
|
@ -313,10 +321,8 @@ public class BasFlightService {
|
|
|
|
|
return rs; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// 비행계획서 등록
|
|
|
|
|
@Transactional |
|
|
|
|
public BasFlightPlanLaancRs createPlan(BasFlightPlanModel rq) { |
|
|
|
|
|
|
|
|
|
// 비행계획서 검증(LAANC)
|
|
|
|
|
public BasFlightPlanLaancRs validPlan(BasFlightPlanModel rq) { |
|
|
|
|
// 비행계획서 유효성 검사.
|
|
|
|
|
BasFlightPlanLaancRs rs = this.planValid(rq); |
|
|
|
|
|
|
|
|
@ -325,17 +331,30 @@ public class BasFlightService {
|
|
|
|
|
.pilotci("조종사CI") |
|
|
|
|
.declarationnum("기체신고번호") |
|
|
|
|
.build(); |
|
|
|
|
|
|
|
|
|
PilotValidRs pilotValidRs = tsService.callPilotValid(pilotValidRq); |
|
|
|
|
if(pilotValidRs == null){ |
|
|
|
|
if (pilotValidRs == null) { |
|
|
|
|
rs.setPilotQlfcYn("N"); |
|
|
|
|
rs.setAcrftInsuranceYn("N"); |
|
|
|
|
rs.setCorpRegYn("N"); |
|
|
|
|
} else { |
|
|
|
|
rs.setPilotQlfcYn(pilotValidRs.getPilotcredentialyn()); |
|
|
|
|
rs.setAcrftInsuranceYn(pilotValidRs.getArcrftinsuranceyn()); |
|
|
|
|
rs.setCorpRegYn(pilotValidRs.getCorpregyn()); |
|
|
|
|
} |
|
|
|
|
return rs; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// 비행계획서 등록
|
|
|
|
|
@Transactional |
|
|
|
|
public BasFlightPlanCreateRs createPlan(BasFlightPlanModel rq) { |
|
|
|
|
|
|
|
|
|
// 비행계획서 유효성 검사.
|
|
|
|
|
BasFlightPlanLaancRs basFlightPlanLaancRs = this.planValid(rq); |
|
|
|
|
|
|
|
|
|
// LAANC가 검증된것들만 DB저장
|
|
|
|
|
if (!basFlightPlanLaancRs.isValidAirspace()) new CustomException(ErrorCode.PLAN_DATA_DUPLICATE); |
|
|
|
|
|
|
|
|
|
// TODO LAANC가 검증된것들만 DB저장 - LAANC가 미승인이라도 저장해야하는지 확인 필요
|
|
|
|
|
if(!rs.isValid()) return rs; |
|
|
|
|
|
|
|
|
|
// 비행계획서
|
|
|
|
|
String userId = jwtTokenUtil.getUserIdByToken(); |
|
|
|
@ -345,7 +364,7 @@ public class BasFlightService {
|
|
|
|
|
basEntity.setCreateUserId(userId); |
|
|
|
|
basEntity.setUpdateUserId(userId); |
|
|
|
|
// 사업자 유무 - TS 데이터
|
|
|
|
|
basEntity.setCorpRegYn(pilotValidRs.getCorpregyn()); // 사업자유무
|
|
|
|
|
basEntity.setCorpRegYn(rq.getValidLance().getCorpRegYn()); // 사업자유무
|
|
|
|
|
basEntity.setServiceType("PAV-KAC"); |
|
|
|
|
|
|
|
|
|
FltPlanBas rBasEntity = fltPlanBasRepository.save(basEntity); |
|
|
|
@ -395,12 +414,32 @@ public class BasFlightService {
|
|
|
|
|
arcrftEntity.setCreateUserId(userId); |
|
|
|
|
arcrftEntity.setUpdateUserId(userId); |
|
|
|
|
// 추가 필드
|
|
|
|
|
arcrftEntity.setAcrftInsuranceYn(pilotValidRs.getArcrftinsuranceyn()); // 보험여부
|
|
|
|
|
arcrftEntity.setAcrftInsuranceYn(rq.getValidLance().getAcrftInsuranceYn()); // 보험여부
|
|
|
|
|
// arcrftEntity.setInsuranceExperiod(null); // 보헌 유효기간
|
|
|
|
|
// arcrftEntity.setCorporationNm(null); // 법인명
|
|
|
|
|
fltPlanArcrftRepository.save(arcrftEntity); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
// 약관 저장
|
|
|
|
|
if (rq.getTerms() != null && !rq.getTerms().isEmpty()) { |
|
|
|
|
for (AnctCstmrTermsModel agree : rq.getTerms()) { |
|
|
|
|
PtyTermsAgreeTxn agreeEntity = new PtyTermsAgreeTxn(); |
|
|
|
|
agreeEntity.setCstmrSno(basEntity.getCstmrSno()); |
|
|
|
|
agreeEntity.setProcIp(HttpUtils.getRequestIp()); |
|
|
|
|
agreeEntity.setTermsSno(agree.getTermsSno()); |
|
|
|
|
agreeEntity.setUpdateDt(Instant.now()); |
|
|
|
|
agreeEntity.setUpdateUserId(userId); |
|
|
|
|
agreeEntity.setAgreeYn(agree.getAgreeYn()); |
|
|
|
|
if (agree.getAgreeYn().equals("Y")) { |
|
|
|
|
agreeEntity.setAgreeDt(Instant.now()); |
|
|
|
|
} |
|
|
|
|
ptyTermsAgreeTxnRepository.save(agreeEntity); |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
throw new CustomException(ErrorCode.FAIL, "약관등록 실패"); |
|
|
|
|
} |
|
|
|
|
// TODO PDF 생성 후 URL 가져오기
|
|
|
|
|
BasFlightPlanCreateRs rs = new BasFlightPlanCreateRs(); |
|
|
|
|
return rs; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -417,7 +456,7 @@ public class BasFlightService {
|
|
|
|
|
.declarationnum("기체신고번호") |
|
|
|
|
.build(); |
|
|
|
|
PilotValidRs pilotValidRs = tsService.callPilotValid(pilotValidRq); |
|
|
|
|
if(pilotValidRs == null){ |
|
|
|
|
if (pilotValidRs == null) { |
|
|
|
|
rs.setPilotQlfcYn("N"); |
|
|
|
|
rs.setAcrftInsuranceYn("N"); |
|
|
|
|
} else { |
|
|
|
@ -426,7 +465,7 @@ public class BasFlightService {
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// LAANC가 검증된것들만 DB저장
|
|
|
|
|
if(!rs.isValid()) return rs; |
|
|
|
|
if (!rs.isValid()) return rs; |
|
|
|
|
|
|
|
|
|
if (rq != null && rq.getPlanSno() != null) { |
|
|
|
|
String userId = jwtTokenUtil.getUserIdByToken(); |
|
|
|
@ -799,4 +838,5 @@ public class BasFlightService {
|
|
|
|
|
|
|
|
|
|
return jsonObject; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|