|
|
|
@ -10,6 +10,7 @@ import java.util.ArrayList;
|
|
|
|
|
import java.util.List; |
|
|
|
|
import java.util.stream.Collectors; |
|
|
|
|
|
|
|
|
|
import com.palnet.biz.api.bas.laanc.model.*; |
|
|
|
|
import org.locationtech.jts.geom.Coordinate; |
|
|
|
|
import org.locationtech.jts.geom.Geometry; |
|
|
|
|
import org.springframework.stereotype.Service; |
|
|
|
@ -19,12 +20,6 @@ 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.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; |
|
|
|
@ -102,17 +97,30 @@ public class BasLaancService {
|
|
|
|
|
// LAANC 검증
|
|
|
|
|
public BasLaancValidatedRs validationLaanc(BasLaancPlanRq rq) { |
|
|
|
|
if (!this.laancParamValid(rq)) throw new CustomException(ErrorCode.NON_VALID_PARAMETER); |
|
|
|
|
|
|
|
|
|
BasLaancValidatedRs rs = new BasLaancValidatedRs(); |
|
|
|
|
|
|
|
|
|
// 조종사 자격 확인 - 무게가 2kg 초과이거나 상업적일 경우에만 진행
|
|
|
|
|
// 상업 여부 - 상업(true)
|
|
|
|
|
boolean isCommercial = FltType.COMMERCIAL == rq.getFltType(); |
|
|
|
|
rs.setCommercial(isCommercial); |
|
|
|
|
|
|
|
|
|
// 2kg 초과 기체신고번호
|
|
|
|
|
List<String> idntfNumList = rq.getArcrftList().stream().filter(arcrft -> arcrft.getArcrftWghtCd() != ArcrftWghtCd.W250G_LOE && arcrft.getArcrftWghtCd() != ArcrftWghtCd.W250G_W2KG).map(BasLaancArcrftModel::getIdntfNum).collect(Collectors.toList()); |
|
|
|
|
// 신고 여부 - 무게가 2kg 초과이거나 상업적일 경우 - true
|
|
|
|
|
|
|
|
|
|
// 신고 여부 - 비상업적이고 기체중량 2kg이하일 경우 - false, 상업적이거나 기체중량 2kg초과일 경우 - true
|
|
|
|
|
boolean isReport = !idntfNumList.isEmpty() || isCommercial; |
|
|
|
|
rs.setReport(isReport); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 고도 150m 이하 - true
|
|
|
|
|
boolean isElev = rq.getAreaList().stream().anyMatch(area -> area.getFltElev() != null && Integer.parseInt(area.getFltElev()) <= 150); |
|
|
|
|
rs.setElev(isElev); |
|
|
|
|
|
|
|
|
|
// 기체중량 25kg 이하
|
|
|
|
|
boolean isArcrftWeight = rq.getArcrftList().stream().anyMatch(arcrft -> arcrft.getArcrftWghtCd() != ArcrftWghtCd.W25KG_GO && arcrft.getArcrftWghtCd() != ArcrftWghtCd.W25KG_GO_TEST); |
|
|
|
|
rs.setArcrftWeight(isArcrftWeight); |
|
|
|
|
|
|
|
|
|
// TODO start - 조종사 자격 및 기체보험 확인
|
|
|
|
|
if (isReport) { |
|
|
|
|
List<PilotValidRq> pilotValidRqList = idntfNumList.stream().map(idntfNum -> { |
|
|
|
@ -136,12 +144,6 @@ public class BasLaancService {
|
|
|
|
|
// TODO end - 조종사 자격 및 기체보험 확인
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 고도 150m 이하 - true
|
|
|
|
|
boolean isElev = rq.getAreaList().stream().anyMatch(area -> area.getFltElev() != null && Integer.parseInt(area.getFltElev()) <= 150); |
|
|
|
|
rs.setElev(isElev); |
|
|
|
|
// 기체중량 25kg 이하
|
|
|
|
|
boolean isArcrftWeight = rq.getArcrftList().stream().anyMatch(arcrft -> arcrft.getArcrftWghtCd() != ArcrftWghtCd.W25KG_GO && arcrft.getArcrftWghtCd() != ArcrftWghtCd.W25KG_GO_TEST); |
|
|
|
|
rs.setArcrftWeight(isArcrftWeight); |
|
|
|
|
|
|
|
|
|
/* 비행구역 및 기체 중복여부 확인 안하기로 함. |
|
|
|
|
// 비행구역 중복여부, 기체 중복여부
|
|
|
|
@ -163,10 +165,10 @@ public class BasLaancService {
|
|
|
|
|
// 비행계획서 등록, 약관 등록, 공문 생성
|
|
|
|
|
@Transactional |
|
|
|
|
public BasLaancLastRs createFlightPlan(BasLaancPlanRq rq) { |
|
|
|
|
if (rq == null || rq.getValidatedRs() == null) throw new CustomException(ErrorCode.NON_VALID_PARAMETER); |
|
|
|
|
// if (rq == null || rq.getValidatedRs() == null) throw new CustomException(ErrorCode.NON_VALID_PARAMETER);
|
|
|
|
|
if (!this.laancParamValid(rq)) throw new CustomException(ErrorCode.NON_VALID_PARAMETER); |
|
|
|
|
|
|
|
|
|
BasLaancValidatedRs basLaancValidatedRs = rq.getValidatedRs(); |
|
|
|
|
// BasLaancValidatedRs basLaancValidatedRs = rq.getValidatedRs();
|
|
|
|
|
|
|
|
|
|
// BasLaancValidatedRs validatedAirspaceRs = this.validationPlanAirspace(rq);
|
|
|
|
|
|
|
|
|
@ -178,7 +180,7 @@ public class BasLaancService {
|
|
|
|
|
|
|
|
|
|
// BasLaancMapper.MAPPER.merge(basLaancValidatedRs, validatedRs);
|
|
|
|
|
// LAANC가 검증된것들만 DB저장
|
|
|
|
|
if (!basLaancValidatedRs.isValid()) throw new CustomException(ErrorCode.PLAN_LAANC_NOT_VALID); |
|
|
|
|
// if (!basLaancValidatedRs.isValid()) throw new CustomException(ErrorCode.PLAN_LAANC_NOT_VALID);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 비행계획서
|
|
|
|
@ -206,7 +208,12 @@ public class BasLaancService {
|
|
|
|
|
} |
|
|
|
|
fltPlanBas.setGroupId(groupId); |
|
|
|
|
// 사업자 유무 - TS 데이터
|
|
|
|
|
fltPlanBas.setCorpRegYn(rq.getValidatedRs().getCorpRegYn()); // 사업자유무
|
|
|
|
|
String corpRegYn = "N"; |
|
|
|
|
if (rq.getPilotValidRsList() != null && !rq.getPilotValidRsList().isEmpty()) { |
|
|
|
|
boolean isCorpReg = rq.getPilotValidRsList().stream().anyMatch(pilotValidRs -> "Y".equals(pilotValidRs.getCorpregyn())); |
|
|
|
|
corpRegYn = isCorpReg ? "Y" : "N"; |
|
|
|
|
} |
|
|
|
|
fltPlanBas.setCorpRegYn(corpRegYn); // 사업자유무
|
|
|
|
|
fltPlanBas.setServiceType("PAV-KAC"); |
|
|
|
|
|
|
|
|
|
FltPlanBas rBasEntity = fltPlanBasRepository.save(fltPlanBas); |
|
|
|
@ -240,8 +247,8 @@ public class BasLaancService {
|
|
|
|
|
Integer planAreaSno = rAreaEntity.getPlanAreaSno(); |
|
|
|
|
List<BasLaancAreaCoordModel> laancAreaModelCoordList = laancAreaModel.getCoordList(); |
|
|
|
|
if (laancAreaModelCoordList != null && !laancAreaModelCoordList.isEmpty()) { |
|
|
|
|
laancAreaModelCoordList.get(0).getLat(); |
|
|
|
|
laancAreaModelCoordList.get(0).getLon(); |
|
|
|
|
// double lat = laancAreaModelCoordList.get(0).getLat();
|
|
|
|
|
// double lon = laancAreaModelCoordList.get(0).getLon();
|
|
|
|
|
for (BasLaancAreaCoordModel basLaancAreaCoordModel : laancAreaModelCoordList) { |
|
|
|
|
FltPlanAreaCoord coordEntity = BasLaancMapper.MAPPER.modelToPlanEntity(basLaancAreaCoordModel); |
|
|
|
|
coordEntity.setPlanAreaSno(planAreaSno); |
|
|
|
@ -269,8 +276,17 @@ public class BasLaancService {
|
|
|
|
|
arcrftEntity.setPlanSno(planSno); |
|
|
|
|
arcrftEntity.setCreateUserId(userId); |
|
|
|
|
arcrftEntity.setUpdateUserId(userId); |
|
|
|
|
|
|
|
|
|
String arcrftInsuranceYn = "N"; |
|
|
|
|
// 추가 필드
|
|
|
|
|
arcrftEntity.setAcrftInsuranceYn(rq.getValidatedRs().isArcrftInsurance() ? "Y" : "N"); // 보험여부
|
|
|
|
|
if (rq.getPilotValidRsList() != null && !rq.getPilotValidRsList().isEmpty() && basLaancArcrftModel.getIdntfNum() != null) { |
|
|
|
|
PilotValidRs pilotValidRs = rq.getPilotValidRsList().stream().filter(pilotValid -> pilotValid.getRq().getDeclarationnum().equals(arcrftEntity.getIdntfNum())).findFirst().orElse(null); |
|
|
|
|
if (pilotValidRs != null) { |
|
|
|
|
String arcrftinsuranceyn = pilotValidRs.getArcrftinsuranceyn(); |
|
|
|
|
arcrftInsuranceYn = "Y".equals(arcrftinsuranceyn) ? "Y" : "N"; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
arcrftEntity.setAcrftInsuranceYn(arcrftInsuranceYn); // 보험여부
|
|
|
|
|
// arcrftEntity.setInsuranceExperiod(null); // 보헌 유효기간
|
|
|
|
|
// arcrftEntity.setCorporationNm(null); // 법인명
|
|
|
|
|
fltPlanArcrftRepository.save(arcrftEntity); |
|
|
|
@ -458,7 +474,6 @@ public class BasLaancService {
|
|
|
|
|
|
|
|
|
|
return rs; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
|
|
private BasLaancValidatedRs validationPlanAirspace(BasLaancPlanRq rq) { |
|
|
|
@ -586,4 +601,60 @@ public class BasLaancService {
|
|
|
|
|
timeToCheck.isBefore(sunset); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// 허용고도 조회
|
|
|
|
|
public List<Integer> getAllowableElevation(List<BasLaancAreaModel> rq) { |
|
|
|
|
AirspaceUtils airspaceUtils = AirspaceUtils.getInstance(); |
|
|
|
|
List<Integer> allowElevationList = new ArrayList<>(); |
|
|
|
|
for (BasLaancAreaModel area : rq) { |
|
|
|
|
|
|
|
|
|
//rq로 들어온 좌표로 버퍼좌표 생성
|
|
|
|
|
List<Coordinate> targetCoord = new ArrayList<>(); |
|
|
|
|
List<Coordinate> targetCoordBufferList = new ArrayList<>(); |
|
|
|
|
|
|
|
|
|
for (BasLaancAreaCoordModel basLaancAreaCoordModel : area.getCoordList()) { |
|
|
|
|
Coordinate coords = new Coordinate(basLaancAreaCoordModel.getLon(), basLaancAreaCoordModel.getLat()); |
|
|
|
|
targetCoord.add(coords); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if ("LINE".equals(area.getAreaType())) { |
|
|
|
|
List<Coordinate> trans = areaUtils.transform(targetCoord, "EPSG:4326", "EPSG:5181"); |
|
|
|
|
List<Coordinate> bufferList = areaUtils.buffer(trans, area.getBufferZone()); |
|
|
|
|
targetCoordBufferList = areaUtils.transform(bufferList, "EPSG:5181", "EPSG:4326"); |
|
|
|
|
} else if ("POLYGON".equals(area.getAreaType())) { |
|
|
|
|
targetCoordBufferList.addAll(targetCoord); |
|
|
|
|
} else if ("CIRCLE".equals(area.getAreaType())) { |
|
|
|
|
targetCoordBufferList = areaUtils.createCircle(targetCoord.get(0), area.getBufferZone()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
Geometry targetGeometry = airspaceUtils.createGeometryByCoordinate(targetCoordBufferList); |
|
|
|
|
// Integer fltElev = area.getFltElev() != null ? Integer.parseInt(area.getFltElev()) : 0;
|
|
|
|
|
// AirspaceUtils.FeatureInfo featureInfo = new AirspaceUtils.FeatureInfo(null, null, 0, fltElev, rqGeometry);
|
|
|
|
|
Integer allowElevation = airspaceUtils.getAllowElevation(targetGeometry); |
|
|
|
|
allowElevationList.add(allowElevation); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return allowElevationList; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public BasLaancTsRs getTsValid(List<String> idntfNumList) { |
|
|
|
|
// List<String> idntfNumList = rq.getIdntfNumList();
|
|
|
|
|
Integer cstmrSno = jwtTokenUtil.getCstmrSnoByToken(); |
|
|
|
|
AnctCstmrModel cstmrInfo = ptyCstmrQueryRepository.findByCstmrSno(cstmrSno); |
|
|
|
|
String userCi = cstmrInfo.getIpinCi(); |
|
|
|
|
List<PilotValidRq> pilotValidRqList = idntfNumList.stream().map(declarationnum -> { |
|
|
|
|
// TODO 기체보험 확인, 조종사 자격 확인
|
|
|
|
|
return PilotValidRq.builder() |
|
|
|
|
.pilotci(userCi) |
|
|
|
|
.declarationnum(declarationnum) |
|
|
|
|
.build(); |
|
|
|
|
}).collect(Collectors.toList()); |
|
|
|
|
|
|
|
|
|
List<PilotValidRs> pilotValidRsList = tsService.callPilotValid(pilotValidRqList); |
|
|
|
|
boolean isValid = pilotValidRsList.stream().noneMatch(pilotValidRs -> !"Y".equals(pilotValidRs.getPilotcredentialyn()) || !"Y".equals(pilotValidRs.getArcrftinsuranceyn())); |
|
|
|
|
BasLaancTsRs rs = BasLaancTsRs.builder() |
|
|
|
|
.isValid(isValid) |
|
|
|
|
.pilotValidRsList(pilotValidRsList) |
|
|
|
|
.build(); |
|
|
|
|
return rs; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|