diff --git a/pav-server/src/main/java/com/palnet/biz/api/bas/flight/service/BasFlightService.java b/pav-server/src/main/java/com/palnet/biz/api/bas/flight/service/BasFlightService.java index ee89363..208d471 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/bas/flight/service/BasFlightService.java +++ b/pav-server/src/main/java/com/palnet/biz/api/bas/flight/service/BasFlightService.java @@ -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 listPlan(BasFlightPlanListRq rq) { @@ -181,6 +156,7 @@ public class BasFlightService { .planAreaDuplicatdYn("N") .build(); boolean isEqualsFltElev = false; + List rqAreaList = rq.getAreaList(); String rqFltElev = rqAreaList.get(0).getFltElev(); @@ -293,6 +269,35 @@ public class BasFlightService { } } + + // 공역 중복 확인 + for (BasFlightPlanAreaModel rqArea : rq.getAreaList()) { + List rqCoord = new ArrayList<>(); + List 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 trans = areaUtils.transform(rqCoord, "EPSG:4326", "EPSG:5181"); + List 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 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 deleteArcrftEntity = arcrftEntityList.stream().filter(fltPlanArcrft -> { diff --git a/pav-server/src/main/java/com/palnet/biz/api/external/model/PilotValidRq.java b/pav-server/src/main/java/com/palnet/biz/api/external/model/PilotValidRq.java new file mode 100644 index 0000000..82eacae --- /dev/null +++ b/pav-server/src/main/java/com/palnet/biz/api/external/model/PilotValidRq.java @@ -0,0 +1,26 @@ +package com.palnet.biz.api.external.model; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * packageName : com.palnet.biz.api.external.model + * fileName : PilotValidRq + * author : dhji + * date : 2023-09-21(021) + * description : + * =========================================================== + * DATE AUTHOR NOTE + * ----------------------------------------------------------- + * 2023-09-21(021) dhji 최초 생성 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class PilotValidRq { + private String pilotci; // 조종사 ci - 본인인증 + private String declarationnum; // 기체신고번호 +} diff --git a/pav-server/src/main/java/com/palnet/biz/api/external/model/PilotValidRs.java b/pav-server/src/main/java/com/palnet/biz/api/external/model/PilotValidRs.java new file mode 100644 index 0000000..80411e0 --- /dev/null +++ b/pav-server/src/main/java/com/palnet/biz/api/external/model/PilotValidRs.java @@ -0,0 +1,30 @@ +package com.palnet.biz.api.external.model; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * packageName : com.palnet.biz.api.external.model + * fileName : PilotValidRq + * author : dhji + * date : 2023-09-21(021) + * description : + * =========================================================== + * DATE AUTHOR NOTE + * ----------------------------------------------------------- + * 2023-09-21(021) dhji 최초 생성 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class PilotValidRs { + private String rspCode; // 결과코드 + private String rspMessage; // 결과메시지 + private String pilotcredentialyn; // 조종사자격증명여부 + private String arcrftinsuranceyn; // 기체보험가입여부 + private String arcrftdeclaration; // 기체신고여부 + private String corpregyn; // 사업자유무 +} diff --git a/pav-server/src/main/java/com/palnet/biz/api/external/service/TsService.java b/pav-server/src/main/java/com/palnet/biz/api/external/service/TsService.java new file mode 100644 index 0000000..3264ca3 --- /dev/null +++ b/pav-server/src/main/java/com/palnet/biz/api/external/service/TsService.java @@ -0,0 +1,41 @@ +package com.palnet.biz.api.external.service; + +import com.palnet.biz.api.external.model.PilotValidRq; +import com.palnet.biz.api.external.model.PilotValidRs; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +/** + * packageName : com.palnet.biz.api.external.service + * fileName : TsService + * author : dhji + * date : 2023-09-21(021) + * description : + * =========================================================== + * DATE AUTHOR NOTE + * ----------------------------------------------------------- + * 2023-09-21(021) dhji 최초 생성 + */ +@Slf4j +@RequiredArgsConstructor +@Service +public class TsService { + + public PilotValidRs callPilotValid(PilotValidRq rq) { +// if(rq.getPilotci() == null || rq.getDeclarationnum() == null) { +// return null; +// } + // TODO: call pilot valid api + + // RS 임시코드 - 추후 조건에 따른 TRUE/FALSE 처리 필요 + PilotValidRs pilotValidRs = new PilotValidRs(); + pilotValidRs.setRspCode("200"); + pilotValidRs.setRspMessage("success"); + pilotValidRs.setPilotcredentialyn("Y"); + pilotValidRs.setArcrftinsuranceyn("Y"); + pilotValidRs.setArcrftdeclaration("Y"); + pilotValidRs.setCorpregyn("Y"); + return pilotValidRs; + } +} diff --git a/pav-server/src/main/java/com/palnet/comn/code/ErrorCode.java b/pav-server/src/main/java/com/palnet/comn/code/ErrorCode.java index 5b88bd5..15c37e3 100644 --- a/pav-server/src/main/java/com/palnet/comn/code/ErrorCode.java +++ b/pav-server/src/main/java/com/palnet/comn/code/ErrorCode.java @@ -10,8 +10,9 @@ public enum ErrorCode { DATA_NO("DT003", "데이터 미존재"), DB_ERROR("DB001" , "디비 처리중 오류"), PLAN_DATA_DUPLICATE("FT500", "이미 등록된 비행계획서의 비행구역과 비행시간이 일치합니다.\n비행시간 또는 비행구역을 수정하여 주십시오."), - ARCRFT_DATA_DUPLICATE("FT500", "해당 기체는 다른 비행계획서에서 이미 등록된 기체입니다.\n비행시간 또는 기체 정보를 확인하여 주십시오."); - + ARCRFT_DATA_DUPLICATE("FT500", "해당 기체는 다른 비행계획서에서 이미 등록된 기체입니다.\n비행시간 또는 기체 정보를 확인하여 주십시오."), + EXTERNAL_API_ERROR("EA500", "외부서버 호출에 실패하였습니다."); + private final String code;