|
|
|
@ -1,24 +1,30 @@
|
|
|
|
|
package com.palnet.biz.api.bas.flight.service; |
|
|
|
|
|
|
|
|
|
import java.io.BufferedReader; |
|
|
|
|
import java.io.IOException; |
|
|
|
|
import java.io.InputStream; |
|
|
|
|
import java.io.InputStreamReader; |
|
|
|
|
import java.net.HttpURLConnection; |
|
|
|
|
import java.net.MalformedURLException; |
|
|
|
|
import java.net.URL; |
|
|
|
|
import java.net.URLEncoder; |
|
|
|
|
import java.util.ArrayList; |
|
|
|
|
import java.util.List; |
|
|
|
|
import java.util.Map; |
|
|
|
|
import java.util.stream.Collectors; |
|
|
|
|
|
|
|
|
|
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.*; |
|
|
|
|
import com.palnet.biz.api.bas.group.model.BasGroupJoinModel; |
|
|
|
|
import com.palnet.biz.api.comn.model.ComnPagingRs; |
|
|
|
|
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.repository.flt.*; |
|
|
|
|
import com.palnet.biz.jpa.repository.pty.PtyGroupQueryRepository; |
|
|
|
|
import com.palnet.biz.scheduler.ctr.model.CtrTrnsLctnModel; |
|
|
|
|
import com.palnet.biz.scheduler.ctr.service.CtrTrnsLctnService; |
|
|
|
|
import com.palnet.comn.utils.AirspaceUtils; |
|
|
|
|
import com.palnet.comn.utils.AreaUtils; |
|
|
|
|
import com.palnet.comn.utils.EncryptUtils; |
|
|
|
|
import lombok.RequiredArgsConstructor; |
|
|
|
|
import lombok.extern.log4j.Log4j2; |
|
|
|
|
import lombok.extern.slf4j.Slf4j; |
|
|
|
|
import org.apache.commons.lang3.StringUtils; |
|
|
|
|
import org.json.simple.JSONObject; |
|
|
|
|
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; |
|
|
|
@ -26,40 +32,27 @@ import org.springframework.data.domain.Pageable;
|
|
|
|
|
import org.springframework.stereotype.Service; |
|
|
|
|
import org.springframework.transaction.annotation.Transactional; |
|
|
|
|
|
|
|
|
|
import com.palnet.biz.api.acnt.jwt.model.JwtGroupModel; |
|
|
|
|
import com.palnet.biz.api.acnt.jwt.utils.JwtTokenUtil; |
|
|
|
|
import com.palnet.biz.api.bas.group.model.BasGroupJoinModel; |
|
|
|
|
import com.palnet.biz.api.comn.model.ComnPagingRs; |
|
|
|
|
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.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.flt.FltPlanQueryRepository; |
|
|
|
|
import com.palnet.biz.jpa.repository.pty.PtyGroupQueryRepository; |
|
|
|
|
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.AreaUtils; |
|
|
|
|
import com.palnet.comn.utils.EncryptUtils; |
|
|
|
|
|
|
|
|
|
import lombok.extern.log4j.Log4j2; |
|
|
|
|
import java.io.BufferedReader; |
|
|
|
|
import java.io.IOException; |
|
|
|
|
import java.io.InputStream; |
|
|
|
|
import java.io.InputStreamReader; |
|
|
|
|
import java.net.HttpURLConnection; |
|
|
|
|
import java.net.MalformedURLException; |
|
|
|
|
import java.net.URL; |
|
|
|
|
import java.net.URLEncoder; |
|
|
|
|
import java.util.ArrayList; |
|
|
|
|
import java.util.List; |
|
|
|
|
import java.util.Map; |
|
|
|
|
import java.util.stream.Collectors; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Log4j2 |
|
|
|
|
@Slf4j |
|
|
|
|
@RequiredArgsConstructor |
|
|
|
|
@Service |
|
|
|
|
@Transactional(readOnly = true) |
|
|
|
|
public class BasFlightService { |
|
|
|
|
|
|
|
|
|
@Autowired |
|
|
|
|
private CtrTrnsLctnService ctrTrnsLctnService; |
|
|
|
|
|
|
|
|
|
private final CtrTrnsLctnService ctrTrnsLctnService; |
|
|
|
|
private final FltPlanBasRepository fltPlanBasRepository; |
|
|
|
|
private final FltPlanArcrftRepository fltPlanArcrftRepository; |
|
|
|
|
private final FltPlanAreaRepository fltPlanAreaRepository; |
|
|
|
@ -67,28 +60,10 @@ public class BasFlightService {
|
|
|
|
|
private final FltPlanPilotRepository fltPlanPilotRepository; |
|
|
|
|
private final FltPlanQueryRepository fltPlanQueryRepository; |
|
|
|
|
private final PtyGroupQueryRepository ptyPlanQueryRepository; |
|
|
|
|
private final TsService tsService; |
|
|
|
|
private final JwtTokenUtil jwtTokenUtil; |
|
|
|
|
private final AreaUtils areaUtils; |
|
|
|
|
|
|
|
|
|
public BasFlightService(FltPlanBasRepository fltPlanBasRepository, |
|
|
|
|
FltPlanArcrftRepository fltPlanArcrftRepository, |
|
|
|
|
FltPlanAreaRepository fltPlanAreaRepository, |
|
|
|
|
FltPlanAreaCoordRepository fltPlanAreaCoordRepository, |
|
|
|
|
FltPlanPilotRepository fltPlanPilotRepository, |
|
|
|
|
FltPlanQueryRepository fltPlanQueryRepository, |
|
|
|
|
PtyGroupQueryRepository ptyPlanQueryRepository, |
|
|
|
|
JwtTokenUtil jwtTokenUtil, |
|
|
|
|
AreaUtils areaUtils) { |
|
|
|
|
this.fltPlanBasRepository = fltPlanBasRepository; |
|
|
|
|
this.fltPlanArcrftRepository = fltPlanArcrftRepository; |
|
|
|
|
this.fltPlanAreaRepository = fltPlanAreaRepository; |
|
|
|
|
this.fltPlanAreaCoordRepository = fltPlanAreaCoordRepository; |
|
|
|
|
this.fltPlanPilotRepository = fltPlanPilotRepository; |
|
|
|
|
this.fltPlanQueryRepository = fltPlanQueryRepository; |
|
|
|
|
this.ptyPlanQueryRepository = ptyPlanQueryRepository; |
|
|
|
|
this.jwtTokenUtil = jwtTokenUtil; |
|
|
|
|
this.areaUtils = areaUtils; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// 비행계획서 조회
|
|
|
|
|
public ComnPagingRs<BasFlightPlanModel> listPlan(BasFlightPlanListRq rq) { |
|
|
|
@ -181,6 +156,7 @@ public class BasFlightService {
|
|
|
|
|
.planAreaDuplicatdYn("N") |
|
|
|
|
.build(); |
|
|
|
|
boolean isEqualsFltElev = false; |
|
|
|
|
|
|
|
|
|
List<BasFlightPlanAreaModel> rqAreaList = rq.getAreaList(); |
|
|
|
|
String rqFltElev = rqAreaList.get(0).getFltElev(); |
|
|
|
|
|
|
|
|
@ -293,6 +269,35 @@ public class BasFlightService {
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// 공역 중복 확인
|
|
|
|
|
for (BasFlightPlanAreaModel rqArea : rq.getAreaList()) { |
|
|
|
|
List<Coordinate> rqCoord = new ArrayList<>(); |
|
|
|
|
List<Coordinate> rqCoordBufferList = new ArrayList<>(); |
|
|
|
|
|
|
|
|
|
//rq로 들어온 좌표로 버퍼좌표 생성
|
|
|
|
|
for (BasFlightPlanAreaCoordModel coord : rqArea.getCoordList()) { |
|
|
|
|
Coordinate coords = new Coordinate(coord.getLon(), coord.getLat()); |
|
|
|
|
rqCoord.add(coords); |
|
|
|
|
} |
|
|
|
|
if ("LINE".equals(rqArea.getAreaType())) { |
|
|
|
|
List<Coordinate> trans = areaUtils.transform(rqCoord, "EPSG:4326", "EPSG:5181"); |
|
|
|
|
List<Coordinate> bufferList = areaUtils.buffer(trans, rqArea.getBufferZone()); |
|
|
|
|
rqCoordBufferList = areaUtils.transform(bufferList, "EPSG:5181", "EPSG:4326"); |
|
|
|
|
} else if ("POLYGON".equals(rqArea.getAreaType())) { |
|
|
|
|
rqCoordBufferList.addAll(rqCoord); |
|
|
|
|
} else if ("CIRCLE".equals(rqArea.getAreaType())) { |
|
|
|
|
rqCoordBufferList = areaUtils.createCircle(rqCoord.get(0), rqArea.getBufferZone()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
AirspaceUtils airspaceUtils = AirspaceUtils.getInstance(); |
|
|
|
|
Geometry rqGeometry = airspaceUtils.createGeometryByCoordinate(rqCoordBufferList); |
|
|
|
|
Integer fltElev = Integer.valueOf(rqArea.getFltElev()); |
|
|
|
|
if(fltElev == null) fltElev = 0; |
|
|
|
|
AirspaceUtils.FeatureInfo featureInfo = new AirspaceUtils.FeatureInfo(null, null, 0, fltElev, rqGeometry); |
|
|
|
|
boolean duplicatedAirspace = airspaceUtils.isDuplicatedAirspace(featureInfo); |
|
|
|
|
rs.setAirspaceDuplicatedYn(duplicatedAirspace ? "Y" : "N"); |
|
|
|
|
} |
|
|
|
|
return rs; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -302,12 +307,22 @@ public class BasFlightService {
|
|
|
|
|
|
|
|
|
|
// 비행계획서 유효성 검사.
|
|
|
|
|
BasFlightPlanLaancRs rs = this.planValid(rq); |
|
|
|
|
// TODO 공역 중복 확인
|
|
|
|
|
rs.setAirspaceDuplicatedYn("N"); |
|
|
|
|
|
|
|
|
|
// TODO 조종사 자격 및 기체보험 확인
|
|
|
|
|
rs.setPilotQlfcYn("Y"); |
|
|
|
|
rs.setAcrftInsuranceYn("Y"); |
|
|
|
|
PilotValidRq pilotValidRq = PilotValidRq.builder() |
|
|
|
|
.pilotci("조종사CI") |
|
|
|
|
.declarationnum("기체신고번호") |
|
|
|
|
.build(); |
|
|
|
|
PilotValidRs pilotValidRs = tsService.callPilotValid(pilotValidRq); |
|
|
|
|
if(pilotValidRs == null){ |
|
|
|
|
rs.setPilotQlfcYn("N"); |
|
|
|
|
rs.setAcrftInsuranceYn("N"); |
|
|
|
|
} else { |
|
|
|
|
rs.setPilotQlfcYn(pilotValidRs.getPilotcredentialyn()); |
|
|
|
|
rs.setAcrftInsuranceYn(pilotValidRs.getArcrftinsuranceyn()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// TODO LAANC가 검증된것들만 DB저장 - LAANC가 미승인이라도 저장해야하는지 확인 필요
|
|
|
|
|
if(!rs.isValid()) return rs; |
|
|
|
|
|
|
|
|
|
// 비행계획서
|
|
|
|
@ -317,6 +332,10 @@ public class BasFlightService {
|
|
|
|
|
basEntity.setAprvlYn("N"); |
|
|
|
|
basEntity.setCreateUserId(userId); |
|
|
|
|
basEntity.setUpdateUserId(userId); |
|
|
|
|
// 사업자 유무 - TS 데이터
|
|
|
|
|
basEntity.setCorpRegYn(pilotValidRs.getCorpregyn()); // 사업자유무
|
|
|
|
|
basEntity.setServiceType("PAV-KAC"); |
|
|
|
|
|
|
|
|
|
FltPlanBas rBasEntity = fltPlanBasRepository.save(basEntity); |
|
|
|
|
Integer planSno = rBasEntity.getPlanSno(); |
|
|
|
|
// 비행구역
|
|
|
|
@ -327,6 +346,7 @@ public class BasFlightService {
|
|
|
|
|
areaEntity.setPlanSno(planSno); |
|
|
|
|
areaEntity.setCreateUserId(userId); |
|
|
|
|
areaEntity.setUpdateUserId(userId); |
|
|
|
|
|
|
|
|
|
FltPlanArea rAreaEntity = fltPlanAreaRepository.save(areaEntity); |
|
|
|
|
Integer planAreaSno = rAreaEntity.getPlanAreaSno(); |
|
|
|
|
List<BasFlightPlanAreaCoordModel> coordModelList = areaModel.getCoordList(); |
|
|
|
@ -362,6 +382,10 @@ public class BasFlightService {
|
|
|
|
|
arcrftEntity.setPlanSno(planSno); |
|
|
|
|
arcrftEntity.setCreateUserId(userId); |
|
|
|
|
arcrftEntity.setUpdateUserId(userId); |
|
|
|
|
// 추가 필드
|
|
|
|
|
arcrftEntity.setAcrftInsuranceYn(pilotValidRs.getArcrftinsuranceyn()); // 보험여부
|
|
|
|
|
// arcrftEntity.setInsuranceExperiod(null); // 보헌 유효기간
|
|
|
|
|
// arcrftEntity.setCorporationNm(null); // 법인명
|
|
|
|
|
fltPlanArcrftRepository.save(arcrftEntity); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
@ -372,15 +396,24 @@ public class BasFlightService {
|
|
|
|
|
@Transactional |
|
|
|
|
public BasFlightPlanLaancRs updatePlan(BasFlightPlanModel rq) { |
|
|
|
|
|
|
|
|
|
// 비행계획서 유효성 검사.
|
|
|
|
|
// 비행계획서 유효성 검사.
|
|
|
|
|
BasFlightPlanLaancRs rs = this.planValid(rq); |
|
|
|
|
// TODO 공역 중복 확인
|
|
|
|
|
rs.setAirspaceDuplicatedYn("N"); |
|
|
|
|
|
|
|
|
|
// TODO 조종사 자격 및 기체보험 확인
|
|
|
|
|
rs.setPilotQlfcYn("Y"); |
|
|
|
|
rs.setAcrftInsuranceYn("Y"); |
|
|
|
|
PilotValidRq pilotValidRq = PilotValidRq.builder() |
|
|
|
|
.pilotci("조종사CI") |
|
|
|
|
.declarationnum("기체신고번호") |
|
|
|
|
.build(); |
|
|
|
|
PilotValidRs pilotValidRs = tsService.callPilotValid(pilotValidRq); |
|
|
|
|
if(pilotValidRs == null){ |
|
|
|
|
rs.setPilotQlfcYn("N"); |
|
|
|
|
rs.setAcrftInsuranceYn("N"); |
|
|
|
|
} else { |
|
|
|
|
rs.setPilotQlfcYn(pilotValidRs.getPilotcredentialyn()); |
|
|
|
|
rs.setAcrftInsuranceYn(pilotValidRs.getArcrftinsuranceyn()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// LAANC가 검증된것들만 DB저장
|
|
|
|
|
if(!rs.isValid()) return rs; |
|
|
|
|
|
|
|
|
|
if (rq != null && rq.getPlanSno() != null) { |
|
|
|
@ -390,6 +423,10 @@ public class BasFlightService {
|
|
|
|
|
FltPlanBas planEntity = fltPlanBasRepository.findById(planSno).orElseThrow(); |
|
|
|
|
BasFlightMapper.mapper.updateEntityByModel(planEntity, rq); |
|
|
|
|
planEntity.setUpdateUserId(userId); |
|
|
|
|
|
|
|
|
|
// 사업자 유무 - TS 데이터
|
|
|
|
|
planEntity.setCorpRegYn(pilotValidRs.getCorpregyn()); // 사업자유무
|
|
|
|
|
// planEntity.setServiceType("PAV-KAC");
|
|
|
|
|
fltPlanBasRepository.save(planEntity); |
|
|
|
|
|
|
|
|
|
// 비행구역
|
|
|
|
@ -406,6 +443,7 @@ public class BasFlightService {
|
|
|
|
|
BasFlightMapper.mapper.updateEntityByModel(areaEntity, areaModel); |
|
|
|
|
} |
|
|
|
|
areaEntity.setUpdateUserId(userId); |
|
|
|
|
|
|
|
|
|
fltPlanAreaRepository.save(areaEntity); |
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -487,6 +525,8 @@ public class BasFlightService {
|
|
|
|
|
} else { |
|
|
|
|
BasFlightMapper.mapper.updateEntityByModel(arcrftEntity, arcrftModel); |
|
|
|
|
} |
|
|
|
|
// 추가 필드
|
|
|
|
|
arcrftEntity.setAcrftInsuranceYn(pilotValidRs.getArcrftinsuranceyn()); // 보험여부
|
|
|
|
|
fltPlanArcrftRepository.save(arcrftEntity); |
|
|
|
|
} |
|
|
|
|
List<FltPlanArcrft> deleteArcrftEntity = arcrftEntityList.stream().filter(fltPlanArcrft -> { |
|
|
|
|