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 ba592dfc..f5298de5 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 @@ -23,10 +23,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.time.Instant; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; @Slf4j @@ -358,7 +355,11 @@ public class DronOneStopService { return distance; } + // CPT_CD - 관리부서 & 관제권 부서 + // INNER_CPT_CD - 관제권 부서 public DosCptAuthResult getCptAuth(Coordinate centerCoordinate, Double radius) { + + Set cptCodeSet = new HashSet<>(); List targetCoordinate = areaUtils.createCircle(centerCoordinate, radius); List rq = targetCoordinate.stream().map(coordinate -> CompotentAuthorityRQ.builder() .lat(coordinate.y) @@ -367,10 +368,9 @@ public class DronOneStopService { List competentAuthority = comnCoordinateService.getCompetentAuthority(rq); DosCptAuthResult result = new DosCptAuthResult(); if (competentAuthority != null && !competentAuthority.isEmpty()) { - List cptCode = competentAuthority.stream().map(CompotentAuthorityItemRS::getCptAuthCode).distinct().collect(Collectors.toList()); - result.setCptCode(cptCode); + cptCodeSet = competentAuthority.stream().map(CompotentAuthorityItemRS::getCptAuthCode).collect(Collectors.toSet()); } - // TODO 관제권 체크 후 결과 반환 + // 관제권 airspaces Map airspaceParamMap = Map.of( AirspaceUtils.AirspaceType.C_CONTROL_GIMPO, "F0002", // 김포항공관리사무소(안전운항과) @@ -378,7 +378,8 @@ public class DronOneStopService { // AirspaceUtils.AirspaceType.C_CONTROL_JEJU, "F0008", // 제주지방항공청(안전운항과) ); - List controlCptCode = new ArrayList<>(); + + Set controlCptCodeSet = new HashSet<>(); AirspaceUtils airspaceUtils = AirspaceUtils.getInstance(); Geometry targetGeometry = airspaceUtils.createGeometryByCoordinate(targetCoordinate); for (AirspaceUtils.AirspaceType airspaceType : airspaceParamMap.keySet()) { @@ -389,13 +390,18 @@ public class DronOneStopService { String innerCptCode = airspaceParamMap.get(airspaceType); for (AirspaceUtils.FeatureInfo airspace : airspaces) { if (airspace.getGeometry().intersects(targetGeometry)) { - controlCptCode.add(innerCptCode); + controlCptCodeSet.add(innerCptCode); + cptCodeSet.add(innerCptCode); break; } } } - if (!controlCptCode.isEmpty()) { - result.setControlCptCode(controlCptCode); + if (!controlCptCodeSet.isEmpty()) { + result.setControlCptCode(new ArrayList<>(controlCptCodeSet)); + } + + if (!cptCodeSet.isEmpty()) { + result.setCptCode(new ArrayList<>(cptCodeSet)); } return result; diff --git a/pav-server/src/main/java/com/palnet/comn/utils/CoordUtils.java b/pav-server/src/main/java/com/palnet/comn/utils/CoordUtils.java index e2c60c3f..bb729555 100644 --- a/pav-server/src/main/java/com/palnet/comn/utils/CoordUtils.java +++ b/pav-server/src/main/java/com/palnet/comn/utils/CoordUtils.java @@ -614,7 +614,7 @@ public class CoordUtils { for (JSONObject properties : firstIntersectList) { List subPropertiesList = getSubPropertiesByFile(properties, target); - if(!subPropertiesList.isEmpty()) { + if (!subPropertiesList.isEmpty()) { result.addAll(subPropertiesList); } } @@ -660,7 +660,7 @@ public class CoordUtils { for (JSONObject subProperties : result) { List subSubPropertiesList = getSubPropertiesByFile(subProperties, target); - if(!subSubPropertiesList.isEmpty()) { + if (!subSubPropertiesList.isEmpty()) { result.addAll(subSubPropertiesList); } } @@ -696,15 +696,34 @@ public class CoordUtils { Polygon polygon = geometryFactory.createPolygon(polygonPaths.toArray(new Coordinate[]{})); if (!polygon.isEmpty()) { polygons.add(polygon); +// if(!polygon.isValid()){ +// log.info(">>>>>>>>>>>>>>>>> is not valid polygon"); +// } } } - MultiPolygon multiPolygon = null; + + Geometry multiPolygon = null; if (!polygons.isEmpty()) { multiPolygon = geometryFactory.createMultiPolygon(polygons.toArray(new Polygon[]{})); } if (multiPolygon != null) { + if (!multiPolygon.isValid()) { +// log.debug("===================================="); +// log.debug("multiPolygon is not valid"); +// log.debug("properties: {}", properties); +// int numGeometries = multiPolygon.getNumGeometries(); +// for (int i = 0; i < numGeometries; i++) { +// Geometry geometryN = multiPolygon.getGeometryN(i); +// if (!geometryN.isValid()) { +// log.debug("geometryN is not valid :: {} // {}", i, geometryN); +// } +// } +// log.debug("===================================="); + multiPolygon = multiPolygon.buffer(0); + + } boolean isIntersects = multiPolygon.intersects(target); if (isIntersects) { intersectRs.add(properties); diff --git a/pav-server/src/test/java/com/palnet/biz/api/external/service/DronOneStopServiceTest.java b/pav-server/src/test/java/com/palnet/biz/api/external/service/DronOneStopServiceTest.java index c2e4af61..74ade0e7 100644 --- a/pav-server/src/test/java/com/palnet/biz/api/external/service/DronOneStopServiceTest.java +++ b/pav-server/src/test/java/com/palnet/biz/api/external/service/DronOneStopServiceTest.java @@ -11,10 +11,18 @@ import org.junit.jupiter.api.Test; import org.locationtech.jts.geom.Coordinate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; +import org.springframework.test.annotation.Rollback; import org.springframework.test.context.ActiveProfiles; +import org.springframework.transaction.annotation.Transactional; import java.time.Instant; +import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.stream.Collectors; @ActiveProfiles("local") @@ -129,14 +137,73 @@ class DronOneStopServiceTest { } // CPT 코드 업데이트 - 전체 + @Transactional + @Rollback(false) @Test void updateAllCptCode() { - List all = dosFltPlanAreaRepository.findAll(); + int chunk = 100; + long count = dosFltPlanAreaRepository.count(); + + List> errorList = new ArrayList<>(); + for (int i = 0; i < count / chunk + 1; i++) { + Pageable pageable = PageRequest.of(i, chunk); + List all = dosFltPlanAreaRepository.findAll(pageable).getContent(); + all.forEach(area -> { + try { + DosCptAuthResult result = dronOneStopService.getCptAuth(new Coordinate(area.getLon(), area.getLat()), area.getBufferZone()); + area.setCptCd(result.getCptCode()); + area.setInnerCptCd(result.getControlCptCode()); + log.debug("area sno: {}", area.getPlanAreaSno()); + } catch (Exception e) { + log.error("error: {}", e.getMessage()); + Map param = new HashMap<>(); + param.put("planSno", area.getPlanSno()); + param.put("planAreaSno", area.getPlanAreaSno()); + param.put("error", e.getMessage()); + errorList.add(param); + } + + }); + List dosFltPlanAreaList = dosFltPlanAreaRepository.saveAllAndFlush(all); + log.info("update count: {}", dosFltPlanAreaList.size()); + + } + log.info("error : {}", errorList); + } + + @Transactional + @Rollback(false) + @Test + void updateRecentCptCode() { + List> errorList = new ArrayList<>(); + Pageable pageable = PageRequest.of(0, 40, Sort.by(Sort.Order.desc("planAreaSno"))); + List all = dosFltPlanAreaRepository.findAll(pageable).getContent(); all.forEach(area -> { - DosCptAuthResult result = dronOneStopService.getCptAuth(new Coordinate(area.getLon(), area.getLat()), area.getBufferZone()); - result.setCptCode(result.getCptCode()); - result.setControlCptCode(result.getControlCptCode()); + try { + DosCptAuthResult result = dronOneStopService.getCptAuth(new Coordinate(area.getLon(), area.getLat()), area.getBufferZone()); + area.setCptCd(result.getCptCode()); + area.setInnerCptCd(result.getControlCptCode()); + log.debug("area sno: {}", area.getPlanAreaSno()); + } catch (Exception e) { + log.error("error: {}", e.getMessage()); + Map param = new HashMap<>(); + param.put("planSno", area.getPlanSno()); + param.put("planAreaSno", area.getPlanAreaSno()); + param.put("error", e.getMessage()); + errorList.add(param); + } + }); - dosFltPlanAreaRepository.saveAll(all); + List dosFltPlanAreaList = dosFltPlanAreaRepository.saveAllAndFlush(all); + log.info("update count: {}", dosFltPlanAreaList.size()); + log.info("error : {}", errorList); + } + + + @Test + void updateAllCptCodeErrorTest() { + DosFltPlanArea area = dosFltPlanAreaRepository.findById(11014L).orElseThrow(); + DosCptAuthResult result = dronOneStopService.getCptAuth(new Coordinate(area.getLon(), area.getLat()), area.getBufferZone()); + log.info(result.toString()); } } \ No newline at end of file