diff --git a/pav-server/src/main/java/com/palnet/biz/api/bas/dos/model/BasDosPlanRq.java b/pav-server/src/main/java/com/palnet/biz/api/bas/dos/model/BasDosPlanRq.java index 4f2a582b..1ef5c2d1 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/bas/dos/model/BasDosPlanRq.java +++ b/pav-server/src/main/java/com/palnet/biz/api/bas/dos/model/BasDosPlanRq.java @@ -14,4 +14,6 @@ import java.time.LocalDate; public class BasDosPlanRq { private LocalDate searchStDt; private LocalDate searchEndDt; + private String applyNo; + private String approvalCd; } diff --git a/pav-server/src/main/java/com/palnet/biz/api/bas/dos/service/BasDosService.java b/pav-server/src/main/java/com/palnet/biz/api/bas/dos/service/BasDosService.java index 09b376a1..0a165118 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/bas/dos/service/BasDosService.java +++ b/pav-server/src/main/java/com/palnet/biz/api/bas/dos/service/BasDosService.java @@ -7,7 +7,7 @@ import com.palnet.biz.jpa.entity.DosFltPlanArea; import com.palnet.biz.jpa.entity.DosFltPlanBas; import com.palnet.biz.jpa.entity.DosFltPlanResult; import com.palnet.biz.jpa.repository.dos.DosFltPlanAreaRepository; -import com.palnet.biz.jpa.repository.dos.DosFltPlanBasRepository; +import com.palnet.biz.jpa.repository.dos.DosFltPlanQueryRepository; import com.palnet.biz.jpa.repository.dos.DosFltPlanResultRepository; import com.palnet.comn.utils.AreaUtils; import lombok.RequiredArgsConstructor; @@ -19,6 +19,7 @@ import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.stream.Collectors; @Slf4j @@ -27,24 +28,24 @@ import java.util.stream.Collectors; @Service public class BasDosService { - private final DosFltPlanBasRepository dosFltPlanBasRepository; private final DosFltPlanAreaRepository dosFltPlanAreaRepository; private final DosFltPlanResultRepository dosFltPlanResultRepository; + private final DosFltPlanQueryRepository dosFltPlanQueryRepository; private final AreaUtils areaUtils; /** * 드론원스톱 비행계획 조회 * 비행계획서 및 버퍼 좌표(비행구역데이터로 추출) * - * @param rq - * @return + * @param rq: BasDosPlanRq + * @return List */ @Transactional(readOnly = true) public List getDosPlan(BasDosPlanRq rq) { - List planBasList = dosFltPlanBasRepository.findBySchFltStDtLessThanEqualAndSchFltEndDtGreaterThanEqualOrderByApplyDtAscCreateDtAsc(rq.getSearchEndDt(), rq.getSearchStDt()); + List planBasList = dosFltPlanQueryRepository.findPlanByBasSearch(rq); - if(planBasList.isEmpty()) { + if (planBasList.isEmpty()) { return new ArrayList<>(); } @@ -54,29 +55,45 @@ public class BasDosService { List areaList = dosFltPlanAreaRepository.findByPlanSnoInOrderByZoneNoAsc(planSnoList); List resultList = dosFltPlanResultRepository.findByPlanSnoIn(planSnoList); - List rs = planBasList.stream().map(bas -> { + List rs = new ArrayList<>(); + for (DosFltPlanBas bas : planBasList) { Long planSno = bas.getPlanSno(); - - List areaRsList = areaList.stream() - .filter(area -> area.getPlanSno().equals(planSno)) - .map(area -> { - DosFltPlanResult dosFltPlanResult = resultList.stream().filter(result -> result.getPlanAreaSno().equals(area.getPlanAreaSno())).findFirst().get(); - return BasDosPlanAreaRs.builder() - .planAreaSno(area.getPlanAreaSno()) - .planSno(area.getPlanSno()) - .zoneNo(area.getZoneNo()) - .bufferZone(area.getBufferZone()) - .fltElev(area.getFltElev()) - .lat(area.getLat()) - .lon(area.getLon()) - .approvalCd(dosFltPlanResult.getApprovalCd()) - .bufferCoordList(getBufferCoords(area)) - .build(); - }).collect(Collectors.toList()); - - - return BasDosPlanRs.builder() + List areaRsList = new ArrayList<>(); + + for (DosFltPlanArea area : areaList) { + if (area.getPlanSno().equals(planSno)) { + Optional first = resultList.stream().filter(result -> result.getPlanAreaSno().equals(area.getPlanAreaSno())).findFirst(); + String approvalCd = ""; + if(first.isPresent()){ + DosFltPlanResult dosFltPlanResult = first.get(); + approvalCd = dosFltPlanResult.getApprovalCd(); + } + + if (rq.getApprovalCd() != null && !rq.getApprovalCd().equals(approvalCd)) { + continue; + } + + BasDosPlanAreaRs areaRs = BasDosPlanAreaRs.builder() + .planAreaSno(area.getPlanAreaSno()) + .planSno(area.getPlanSno()) + .zoneNo(area.getZoneNo()) + .bufferZone(area.getBufferZone()) + .fltElev(area.getFltElev()) + .lat(area.getLat()) + .lon(area.getLon()) + .approvalCd(approvalCd) + .bufferCoordList(getBufferCoords(area)) + .build(); + areaRsList.add(areaRs); + } + } + + if (areaRsList.isEmpty()) { + continue; + } + + BasDosPlanRs basRs = BasDosPlanRs.builder() .planSno(bas.getPlanSno()) .applyNo(bas.getApplyNo()) .applyDt(bas.getApplyDt()) @@ -87,7 +104,8 @@ public class BasDosService { .createDt(bas.getCreateDt()) .areaList(areaRsList) .build(); - }).collect(Collectors.toList()); + rs.add(basRs); + } return rs; } @@ -95,8 +113,8 @@ public class BasDosService { * Buffer 좌표 추출 * 비행구역의 데이터를 이용하여 주변의 좌표를 추출한다. * - * @param area - * @return + * @param area: DosFltPlanArea + * @return List> */ private List> getBufferCoords(DosFltPlanArea area) { // Circle만 체크 diff --git a/pav-server/src/main/java/com/palnet/biz/api/external/service/DronOneStopService.java b/pav-server/src/main/java/com/palnet/biz/api/external/service/DronOneStopService.java index bb9b79ca..12ab17ef 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/external/service/DronOneStopService.java +++ b/pav-server/src/main/java/com/palnet/biz/api/external/service/DronOneStopService.java @@ -13,7 +13,6 @@ 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.JsonUtils; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.locationtech.jts.geom.Coordinate; @@ -92,7 +91,7 @@ public class DronOneStopService { validFltAplyChkList.put(fltaply.getAplyno(), validZoneList); }); - // TODO: Laanc 검증(고도 중점) + // Laanc 검증(고도 중점) for (String key : validFltAplyChkList.keySet()) { List> validZoneList = validFltAplyChkList.get(key); validZoneList.forEach(saveZone -> { @@ -103,20 +102,6 @@ public class DronOneStopService { // 좌표 추출 - 중심 좌표 Coordinate centerPoint = new Coordinate((Double) saveZone.get("lon"), (Double) saveZone.get("lat")); - // Buffer 추출 - 테두리 좌표 - List coordBuffers = areaUtils.createCircle(centerPoint, bufferZone); - - AirspaceUtils airspaceUtils = AirspaceUtils.getInstance(); - Geometry rqGeometry = airspaceUtils.createGeometryByCoordinate(coordBuffers); - - AirspaceUtils.FeatureInfo featureInfo = new AirspaceUtils.FeatureInfo(null, null, 0.0, fltElev, rqGeometry); - - - /* - - 김포공항 관제지역 외 - O: 허용 관제권이 아닌 지역(미대상 지역) - - 김포공항 관제지역 승인 - P: 관제권내 허용고도 - - 김포공항 관제지역 미승인 - F: 관제권내 제한고도 - */ ApprovalCd approvalCd = getApprovalCd(bufferZone, fltElev, centerPoint); saveZone.put("approvalCd", approvalCd.getCode()); }); diff --git a/pav-server/src/main/java/com/palnet/biz/jpa/repository/dos/DosFltPlanQueryRepository.java b/pav-server/src/main/java/com/palnet/biz/jpa/repository/dos/DosFltPlanQueryRepository.java new file mode 100644 index 00000000..7980954f --- /dev/null +++ b/pav-server/src/main/java/com/palnet/biz/jpa/repository/dos/DosFltPlanQueryRepository.java @@ -0,0 +1,39 @@ +package com.palnet.biz.jpa.repository.dos; + +import com.palnet.biz.api.bas.dos.model.BasDosPlanRq; +import com.palnet.biz.jpa.entity.DosFltPlanBas; +import com.palnet.biz.jpa.entity.QDosFltPlanBas; +import com.querydsl.core.BooleanBuilder; +import com.querydsl.jpa.impl.JPAQueryFactory; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Slf4j +@RequiredArgsConstructor +@Repository +public class DosFltPlanQueryRepository { + + private final JPAQueryFactory query; + + public List findPlanByBasSearch(BasDosPlanRq rq) { + QDosFltPlanBas bas = QDosFltPlanBas.dosFltPlanBas; + + BooleanBuilder builder = new BooleanBuilder(); + if(rq.getSearchEndDt() != null) { + builder.and(bas.schFltStDt.loe(rq.getSearchEndDt())); + } + if(rq.getSearchStDt() != null) { + builder.and(bas.schFltEndDt.goe(rq.getSearchStDt())); + } + if(rq.getApplyNo() != null) { + builder.and(bas.applyNo.eq(rq.getApplyNo())); + } + + return query.selectFrom(bas) + .where(builder) + .fetch(); + } +}