From b61a771f3a65e1c1cd93f4c1f85267c11a4be4d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=B0=95=EC=9E=AC=EC=9A=B0?= <박재우@DESKTOP-EF7ECBO> Date: Mon, 29 Aug 2022 19:19:21 +0900 Subject: [PATCH] =?UTF-8?q?=EB=B9=84=ED=96=89=EA=B3=84=ED=9A=8D=EC=84=9C?= =?UTF-8?q?=20=EC=9C=A0=ED=9A=A8=EC=84=B1=EA=B2=80=EC=82=AC=20(=20?= =?UTF-8?q?=ED=95=84=ED=84=B0=EC=97=90=20=EC=A1=B0=ED=9A=8C=EB=90=9C=20?= =?UTF-8?q?=EB=8D=B0=EC=9D=B4=ED=84=B0=EA=B0=80=20=EB=91=90=EA=B0=9C=20?= =?UTF-8?q?=EC=9D=B4=EC=83=81=EC=9D=BC=20=EC=8B=9C=20=EC=9E=91=EB=8F=99?= =?UTF-8?q?=ED=95=98=EC=A7=80=20=EC=95=8A=EB=8A=94=20=EC=98=A4=EB=A5=98=20?= =?UTF-8?q?=EC=9E=88=EC=9D=8C.)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../model/BasFlightPlanAreaCoordRq.java | 3 +- .../bas/flight/service/BasFlightService.java | 79 +++++++++--- .../flt/FltPlanQueryRepository.java | 116 +++++++++--------- 3 files changed, 123 insertions(+), 75 deletions(-) diff --git a/src/main/java/com/palnet/biz/api/bas/flight/model/BasFlightPlanAreaCoordRq.java b/src/main/java/com/palnet/biz/api/bas/flight/model/BasFlightPlanAreaCoordRq.java index e84567c..fd7b931 100644 --- a/src/main/java/com/palnet/biz/api/bas/flight/model/BasFlightPlanAreaCoordRq.java +++ b/src/main/java/com/palnet/biz/api/bas/flight/model/BasFlightPlanAreaCoordRq.java @@ -8,8 +8,7 @@ import lombok.Data; public class BasFlightPlanAreaCoordRq { private Integer planAreaSno; private Integer bufferZone; - private double lat; - private double lon; private String areaType; + private String idntfNum; private Integer cnt; } diff --git a/src/main/java/com/palnet/biz/api/bas/flight/service/BasFlightService.java b/src/main/java/com/palnet/biz/api/bas/flight/service/BasFlightService.java index e12588d..066eb8b 100644 --- a/src/main/java/com/palnet/biz/api/bas/flight/service/BasFlightService.java +++ b/src/main/java/com/palnet/biz/api/bas/flight/service/BasFlightService.java @@ -113,7 +113,8 @@ public class BasFlightService { public void planValid(BasFlightPlanModel rq) { List effectivePlanList = fltPlanQueryRepository.CoordCheck(rq); - + List effectivePlanCount = fltPlanQueryRepository.CoordCount(rq); + int accuCnt = 0; if(effectivePlanList != null && !effectivePlanList.isEmpty()) { for(BasFlightPlanModel plan : effectivePlanList) { // 1. 구역 조회 @@ -121,30 +122,70 @@ public class BasFlightService { // 2. 좌표 조회 -> 영역 포함 여부 확인 for(FltPlanArea area : areaList) { - List coordList = fltPlanAreaCoordRepository.findByPlanAreaSnoOrderByPlanAreaCoordSnoAsc(area.getPlanAreaSno()); + List coordLists = fltPlanAreaCoordRepository.findByPlanAreaSnoOrderByPlanAreaCoordSnoAsc(area.getPlanAreaSno()); - if(coordList != null && !coordList.isEmpty()) { - List coordListMapping = BasFlightMapper.mapper.entityToModelCoordList(coordList); + if(coordLists != null && !coordLists.isEmpty()) { + List coordListMapping = BasFlightMapper.mapper.entityToModelCoordList(coordLists); // 2-1 영역 좌표 -> jts model로 mapping List effectiveCoordList = areaUtils.convertCoordinates(coordListMapping); - + List coordList = new ArrayList<>(); + List bufferCoordList = new ArrayList<>(); + List effectiveCntCoordList = new ArrayList<>(); // 유효한 비행구역 검증하기. for(BasFlightPlanAreaModel rqArea : rq.getAreaList()) { - boolean checking = false; - if("LINE".equals(rqArea.getAreaType()) || "POLYGON".equals(rqArea.getAreaType())) { - - for(BasFlightPlanAreaCoordModel coord : rqArea.getCoordList()) { - Coordinate targetCoord = new Coordinate(coord.getLon(), coord.getLat()); - checking = areaUtils.contains(effectiveCoordList, targetCoord); + boolean checkContains = false; + boolean checkOverlaps = false; + for(BasFlightPlanAreaCoordModel coord : rqArea.getCoordList()) { + Coordinate coords = new Coordinate(coord.getLon(), coord.getLat()); + coordList.add(coords); + } + if("LINE".equals(rqArea.getAreaType())) { + List transCoordList = areaUtils.transform(coordList, "EPSG:4326", "EPSG:5181"); + List bufferList = areaUtils.buffer(transCoordList, rqArea.getBufferZone()); // buffer 영역 생성 + bufferCoordList = areaUtils.transform(bufferList, "EPSG:5181", "EPSG:4326"); // buffer 영역 좌표계 변환 + bufferCoordList.add(bufferCoordList.get(0)); + } + if("POLYGON".equals(rqArea.getAreaType())) { + for(Coordinate coord : coordList) { + Coordinate targetCoord = new Coordinate(coord.x, coord.y); + bufferCoordList.add(targetCoord); } } - if("CIRCLE".equals(rqArea.getAreaType())) { - checking = areaUtils.overlaps(areaUtils.convertCoordinates(rqArea.getCoordList()), effectiveCoordList); + bufferCoordList = areaUtils.createCircle(coordList.get(0), rqArea.getBufferZone()); } - - if(checking) { + bufferCoordList.add(bufferCoordList.get(0)); + for(int i = 0; i < areaList.size(); i++) { + System.out.println(areaList.size() + "," + coordLists.size()); + List effectiveBufferCoordList = new ArrayList<>(); + for(int j = 0 ; j < coordLists.size(); j++) { + Double lon = effectiveCoordList.get(accuCnt).getX(); + Double lat = effectiveCoordList.get(accuCnt).getY(); + Coordinate coord = new Coordinate(lon , lat); + effectiveCntCoordList.add(coord); + accuCnt++; + } + if("LINE".equals(effectivePlanCount.get(i).getAreaType())){ + List transCoordList = areaUtils.transform(effectiveCntCoordList, "EPSG:4326", "EPSG:5181"); + List bufferList = areaUtils.buffer(transCoordList, effectivePlanCount.get(i).getBufferZone()); // buffer 영역 생성 + effectiveCntCoordList = areaUtils.transform(bufferList, "EPSG:5181", "EPSG:4326"); // buffer 영역 좌표계 변환 + effectiveBufferCoordList.addAll(effectiveCntCoordList); + } + if("POLYGON".equals(effectivePlanCount.get(i).getAreaType())) { + effectiveBufferCoordList.addAll(effectiveCntCoordList); + effectiveBufferCoordList.add(effectiveBufferCoordList.get(0)); + } + if("CIRCLE".equals(effectivePlanCount.get(i).getAreaType())) { + effectiveBufferCoordList = areaUtils.createCircle(effectiveCntCoordList.get(0), effectivePlanCount.get(i).getBufferZone()); + } + for(Coordinate coord : effectiveBufferCoordList) { + checkContains = areaUtils.contains(bufferCoordList, coord); + } + effectiveBufferCoordList.add(effectiveBufferCoordList.get(0)); + checkOverlaps = FlightUtils.overlaps((bufferCoordList.toArray(new Coordinate[]{})),(effectiveBufferCoordList.toArray(new Coordinate[]{}))); + } + if(checkContains || checkOverlaps) { throw new CustomException(ErrorCode.PLAN_DATA_DUPLICATE); } } @@ -152,7 +193,13 @@ public class BasFlightService { } // 3. 중복 기체 확인 - + for(BasFlightPlanAreaCoordRq idntfNum : effectivePlanCount) { + for(BasFlightPlanArcrftModel rqArcrft : rq.getArcrftList()) { + if(rqArcrft.getIdntfNum().equals(idntfNum.getIdntfNum())) { + throw new CustomException(ErrorCode.ARCRFT_DATA_DUPLICATE); + } + } + } } } } diff --git a/src/main/java/com/palnet/biz/jpa/repository/flt/FltPlanQueryRepository.java b/src/main/java/com/palnet/biz/jpa/repository/flt/FltPlanQueryRepository.java index 0f16477..2e157db 100644 --- a/src/main/java/com/palnet/biz/jpa/repository/flt/FltPlanQueryRepository.java +++ b/src/main/java/com/palnet/biz/jpa/repository/flt/FltPlanQueryRepository.java @@ -102,12 +102,12 @@ public class FltPlanQueryRepository { } //동일 기체 등록시 비행시간 중복여부 조회 public List arcrftCheck(BasFlightPlanModel rq, String idntfNum){ - QFltPlanArcrft arcrft = QFltPlanArcrft.fltPlanArcrft; - QFltPlanBas bas = QFltPlanBas.fltPlanBas; - - List list = query + QFltPlanArcrft arcrft = QFltPlanArcrft.fltPlanArcrft; + QFltPlanBas bas = QFltPlanBas.fltPlanBas; + + List list = query .select(Projections.bean( - BasFlightPlanModel.class, + BasFlightPlanModel.class, bas.schFltStDt, bas.schFltEndDt, bas.delYn @@ -116,28 +116,27 @@ public class FltPlanQueryRepository { .leftJoin(arcrft) .on(bas.planSno.eq(arcrft.planSno)) .where(arcrft.idntfNum.eq(idntfNum) - .and(((bas.schFltStDt.loe(rq.getSchFltStDt())) - .and(bas.schFltEndDt.goe(rq.getSchFltEndDt()))) - .or((bas.schFltStDt.goe(rq.getSchFltStDt())) - .and((bas.schFltStDt.loe(rq.getSchFltEndDt())) - .and(bas.schFltEndDt.goe(rq.getSchFltEndDt())))) - .or(((bas.schFltStDt.loe(rq.getSchFltStDt())) - .and(bas.schFltEndDt.goe(rq.getSchFltStDt()))) - .and(bas.schFltEndDt.loe(rq.getSchFltEndDt()))) - .or((bas.schFltStDt.goe(rq.getSchFltStDt())) - .and(bas.schFltEndDt.loe(rq.getSchFltEndDt())))) - .and(bas.delYn.eq("N"))) + .and(((bas.schFltStDt.loe(rq.getSchFltStDt())) + .and(bas.schFltEndDt.goe(rq.getSchFltEndDt()))) + .or((bas.schFltStDt.goe(rq.getSchFltStDt())) + .and((bas.schFltStDt.loe(rq.getSchFltEndDt())) + .and(bas.schFltEndDt.goe(rq.getSchFltEndDt())))) + .or(((bas.schFltStDt.loe(rq.getSchFltStDt())) + .and(bas.schFltEndDt.goe(rq.getSchFltStDt()))) + .and(bas.schFltEndDt.loe(rq.getSchFltEndDt()))) + .or((bas.schFltStDt.goe(rq.getSchFltStDt())) + .and(bas.schFltEndDt.loe(rq.getSchFltEndDt())))) + .and(bas.delYn.eq("N"))) .fetch(); - return list; - + return list; + } // 비행계획구역 설정시 같은 시간대에 구역이 중복되는지 조회 public List CoordCheck(BasFlightPlanModel rq){ - QFltPlanArea area = QFltPlanArea.fltPlanArea; - QFltPlanAreaCoord coord = QFltPlanAreaCoord.fltPlanAreaCoord; - QFltPlanBas bas = QFltPlanBas.fltPlanBas; - - List list = query + QFltPlanArea area = QFltPlanArea.fltPlanArea; + QFltPlanAreaCoord coord = QFltPlanAreaCoord.fltPlanAreaCoord; + QFltPlanBas bas = QFltPlanBas.fltPlanBas; + List list = query .select(Projections.bean( BasFlightPlanModel.class, bas.planSno, @@ -159,58 +158,61 @@ public class FltPlanQueryRepository { bas.createDt, bas.updateUserId, bas.updateDt + )) .from(bas) .where((((bas.schFltStDt.loe(rq.getSchFltStDt())) - .and(bas.schFltEndDt.goe(rq.getSchFltEndDt()))) - .or((bas.schFltStDt.goe(rq.getSchFltStDt())) - .and((bas.schFltStDt.loe(rq.getSchFltEndDt())) - .and(bas.schFltEndDt.goe(rq.getSchFltEndDt())))) - .or(((bas.schFltStDt.loe(rq.getSchFltStDt())) - .and(bas.schFltEndDt.goe(rq.getSchFltStDt()))) - .and(bas.schFltEndDt.loe(rq.getSchFltEndDt()))) - .or((bas.schFltStDt.goe(rq.getSchFltStDt())) - .and(bas.schFltEndDt.loe(rq.getSchFltEndDt())))) - .and(bas.delYn.eq("N"))) + .and(bas.schFltEndDt.goe(rq.getSchFltEndDt()))) + .or((bas.schFltStDt.goe(rq.getSchFltStDt())) + .and((bas.schFltStDt.loe(rq.getSchFltEndDt())) + .and(bas.schFltEndDt.goe(rq.getSchFltEndDt())))) + .or(((bas.schFltStDt.loe(rq.getSchFltStDt())) + .and(bas.schFltEndDt.goe(rq.getSchFltStDt()))) + .and(bas.schFltEndDt.loe(rq.getSchFltEndDt()))) + .or((bas.schFltStDt.goe(rq.getSchFltStDt())) + .and(bas.schFltEndDt.loe(rq.getSchFltEndDt())))) + .and(bas.delYn.eq("N"))) .fetch(); - return list; + return list; } //CoordCheck에 들어갈 count public List CoordCount(BasFlightPlanModel rq){ - QFltPlanArea area = QFltPlanArea.fltPlanArea; - QFltPlanAreaCoord coord = QFltPlanAreaCoord.fltPlanAreaCoord; - QFltPlanBas bas = QFltPlanBas.fltPlanBas; - - List list = query + QFltPlanArea area = QFltPlanArea.fltPlanArea; + QFltPlanAreaCoord coord = QFltPlanAreaCoord.fltPlanAreaCoord; + QFltPlanBas bas = QFltPlanBas.fltPlanBas; + QFltPlanArcrft arcrft = QFltPlanArcrft.fltPlanArcrft; + List list = query .select(Projections.bean( - BasFlightPlanAreaCoordRq.class, - coord.lon, - coord.lat, + BasFlightPlanAreaCoordRq.class, area.bufferZone, area.areaType, - area.planAreaSno.count().intValue().as("cnt") + area.planAreaSno.count().intValue().as("cnt"), + arcrft.idntfNum )) .from(bas) .leftJoin(area) .on(bas.planSno.eq(area.planSno)) + .leftJoin(arcrft) + .on(area.planSno.eq(arcrft.planSno)) .leftJoin(coord) .on(area.planAreaSno.eq(coord.planAreaSno)) + .where((((bas.schFltStDt.loe(rq.getSchFltStDt())) - .and(bas.schFltEndDt.goe(rq.getSchFltEndDt()))) - .or((bas.schFltStDt.goe(rq.getSchFltStDt())) - .and((bas.schFltStDt.loe(rq.getSchFltEndDt())) - .and(bas.schFltEndDt.goe(rq.getSchFltEndDt())))) - .or(((bas.schFltStDt.loe(rq.getSchFltStDt())) - .and(bas.schFltEndDt.goe(rq.getSchFltStDt()))) - .and(bas.schFltEndDt.loe(rq.getSchFltEndDt()))) - .or((bas.schFltStDt.goe(rq.getSchFltStDt())) - .and(bas.schFltEndDt.loe(rq.getSchFltEndDt())))) - .and(bas.delYn.eq("N")) - .and(((coord.lon.goe(0.1)) - .and(coord.lat.goe(0.1))))) + .and(bas.schFltEndDt.goe(rq.getSchFltEndDt()))) + .or((bas.schFltStDt.goe(rq.getSchFltStDt())) + .and((bas.schFltStDt.loe(rq.getSchFltEndDt())) + .and(bas.schFltEndDt.goe(rq.getSchFltEndDt())))) + .or(((bas.schFltStDt.loe(rq.getSchFltStDt())) + .and(bas.schFltEndDt.goe(rq.getSchFltStDt()))) + .and(bas.schFltEndDt.loe(rq.getSchFltEndDt()))) + .or((bas.schFltStDt.goe(rq.getSchFltStDt())) + .and(bas.schFltEndDt.loe(rq.getSchFltEndDt())))) + .and(bas.delYn.eq("N")) + .and(((coord.lon.goe(0.1)) + .and(coord.lat.goe(0.1))))) .groupBy(area.planAreaSno) .fetch(); - return list; + return list; } // 조종사 조회 public List listPilot(String groupId) { @@ -348,4 +350,4 @@ public class FltPlanQueryRepository { return r; } -} +} \ No newline at end of file