From 1d98836bea19945cb187182374894a15a783ba1e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=B0=95=EC=9E=AC=EC=9A=B0?= <박재우@DESKTOP-EF7ECBO> Date: Thu, 2 Feb 2023 17:15:16 +0900 Subject: [PATCH] =?UTF-8?q?=EB=93=9C=EB=A1=A0=EA=B4=80=EC=A0=9C=20?= =?UTF-8?q?=EC=B5=9C=EC=A0=81=ED=99=94(=EC=9E=84=EC=8B=9C)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cntrl/model/CtrCntrlSocketContainsRq.java | 21 +++ .../cntrl/model/CtrCntrlSocketDataModel.java | 12 ++ .../ctr/cntrl/service/CtrCntrlService.java | 143 ++++++++++++++---- .../flt/FltPlanAreaCoordRepository.java | 12 +- .../repository/flt/FltPlanAreaRepository.java | 13 +- .../repository/flt/FltPlanBasRepository.java | 1 + .../flt/FltPlanCtrCntrlRelRepository.java | 13 +- .../biz/message/consumer/MessageConsumer.java | 1 + src/main/resources/application-database.yml | 2 +- src/main/resources/application.yml | 2 +- 10 files changed, 177 insertions(+), 43 deletions(-) create mode 100644 src/main/java/com/palnet/biz/api/ctr/cntrl/model/CtrCntrlSocketContainsRq.java create mode 100644 src/main/java/com/palnet/biz/api/ctr/cntrl/model/CtrCntrlSocketDataModel.java diff --git a/src/main/java/com/palnet/biz/api/ctr/cntrl/model/CtrCntrlSocketContainsRq.java b/src/main/java/com/palnet/biz/api/ctr/cntrl/model/CtrCntrlSocketContainsRq.java new file mode 100644 index 0000000..e8915e5 --- /dev/null +++ b/src/main/java/com/palnet/biz/api/ctr/cntrl/model/CtrCntrlSocketContainsRq.java @@ -0,0 +1,21 @@ +package com.palnet.biz.api.ctr.cntrl.model; + +import java.util.List; + +import com.palnet.biz.jpa.entity.FltPlanAreaCoord; + +import lombok.Data; + +@Data +public class CtrCntrlSocketContainsRq { + + private String idntfNum; // 드론 식별번호. + private double lat; // 드론 위도 좌표 + private double lon; // 드론 경도 좌표 + + private String areaType; // FlightPlanArea 비행타입 + private int bufferZone; // FlightPlanArea bufferZone + + private List coordList; + +} diff --git a/src/main/java/com/palnet/biz/api/ctr/cntrl/model/CtrCntrlSocketDataModel.java b/src/main/java/com/palnet/biz/api/ctr/cntrl/model/CtrCntrlSocketDataModel.java new file mode 100644 index 0000000..c6a1d6e --- /dev/null +++ b/src/main/java/com/palnet/biz/api/ctr/cntrl/model/CtrCntrlSocketDataModel.java @@ -0,0 +1,12 @@ +package com.palnet.biz.api.ctr.cntrl.model; + +import lombok.Data; + +@Data +public class CtrCntrlSocketDataModel { + + private int planSno; + private String areaType; + private int bufferZone; + +} diff --git a/src/main/java/com/palnet/biz/api/ctr/cntrl/service/CtrCntrlService.java b/src/main/java/com/palnet/biz/api/ctr/cntrl/service/CtrCntrlService.java index 94f081c..3d547ad 100644 --- a/src/main/java/com/palnet/biz/api/ctr/cntrl/service/CtrCntrlService.java +++ b/src/main/java/com/palnet/biz/api/ctr/cntrl/service/CtrCntrlService.java @@ -1,6 +1,5 @@ package com.palnet.biz.api.ctr.cntrl.service; -import java.awt.Toolkit; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; @@ -15,11 +14,9 @@ import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.UUID; -import com.palnet.biz.api.ctr.cntrl.model.*; -import com.palnet.biz.scheduler.ctr.model.CtrTrnsLctnModel; -import com.palnet.biz.scheduler.ctr.service.CtrTrnsLctnService; import org.apache.commons.lang3.StringUtils; import org.json.simple.JSONObject; import org.json.simple.parser.JSONParser; @@ -29,13 +26,22 @@ import org.springframework.beans.factory.annotation.Autowired; 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.flight.model.BasFlightPlanAreaCoordModel; import com.palnet.biz.api.bas.flight.model.BasFlightPlanAreaModel; import com.palnet.biz.api.bas.flight.model.BasFlightPlanModel; import com.palnet.biz.api.bas.flight.service.BasFlightMapper; import com.palnet.biz.api.comn.model.ControlGpsDataContext; +import com.palnet.biz.api.ctr.cntrl.model.CtrCntrlArcrftWarnModel; +import com.palnet.biz.api.ctr.cntrl.model.CtrCntrlDtlModel; +import com.palnet.biz.api.ctr.cntrl.model.CtrCntrlGroupArcrftModel; +import com.palnet.biz.api.ctr.cntrl.model.CtrCntrlGroupModel; +import com.palnet.biz.api.ctr.cntrl.model.CtrCntrlPlanContainsRq; +import com.palnet.biz.api.ctr.cntrl.model.CtrCntrlPlanContainsRs; +import com.palnet.biz.api.ctr.cntrl.model.CtrCntrlSocketContainsRq; +import com.palnet.biz.api.ctr.cntrl.model.CtrCntrlSocketDataModel; +import com.palnet.biz.api.ctr.cntrl.model.CtrCntrlWarnLogModel; +import com.palnet.biz.api.ctr.cntrl.model.CtrCntrlWeatherModel; import com.palnet.biz.jpa.entity.ComArcrftBas; import com.palnet.biz.jpa.entity.ComIdntfBas; import com.palnet.biz.jpa.entity.CtrCntrlBas; @@ -56,6 +62,9 @@ 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.FltPlanCtrCntrlRelRepository; +import com.palnet.biz.scheduler.ctr.model.CtrTrnsLctnModel; +import com.palnet.biz.scheduler.ctr.service.CtrTrnsLctnService; import com.palnet.comn.model.GPHistoryModel; import com.palnet.comn.utils.AreaUtils; import com.palnet.comn.utils.DateUtils; @@ -71,6 +80,9 @@ public class CtrCntrlService { private JwtTokenUtil jwtTokenUtil; @Autowired private CtrTrnsLctnService ctrTrnsLctnService; + @Autowired + private FltPlanCtrCntrlRelRepository relRepository; + private final CtrCntrlQueryRepository query; private final CtrCntrlBasRepository cntrlBasRepository; private final CtrCntrlHstryRepository cntrlHstryRepository; @@ -254,32 +266,41 @@ public class CtrCntrlService { CtrCntrlBas control = cntrlBasRepository.findById(cntrlId).orElse(null); CtrCntrlHstry hisControl = cntrlHstryRepository.findFirstByCntrlIdOrderBySrvrRcvDtDesc(cntrlId).orElse(null); - List flightPlan = new ArrayList<>(); - if (hisControl != null && control != null) { - flightPlan = this.getFlightPlan(control.getIdntfNum()); - } else { - flightPlan = this.getFlightPlan(hisControl.getTrmnlId()); - } - if (flightPlan != null && !flightPlan.isEmpty()) { - CtrCntrlPlanContainsRq containsRq = new CtrCntrlPlanContainsRq(); +// List flightPlan = new ArrayList<>(); +// if (control != null) { +// flightPlan = this.getFlightPlan(control.getIdntfNum()); +// } + int planSno = relRepository.getPlanSno(control.getIdntfNum()); + FltPlanArea planAreaData = planAreaRepository.getPlanData(planSno); + + List coordList = planCoordRepository.getCoordinate(planAreaData.getPlanAreaSno()); + + CtrCntrlSocketContainsRq containsRq = new CtrCntrlSocketContainsRq(); + if (control != null) { containsRq.setIdntfNum(control.getIdntfNum()); + } + + if (planAreaData != null) { containsRq.setLat(hisControl.getLat()); - containsRq.setLon(hisControl.getLon()); - containsRq.setPlanList(flightPlan); - - CtrCntrlPlanContainsRs ctrCntrlPlanContainsRs = this.checkPlanContains(containsRq); - model.setControlWarnCd(ctrCntrlPlanContainsRs.isWarning()); + containsRq.setLon(hisControl.getLon()); + } + + if (hisControl != null) { + containsRq.setAreaType(planAreaData.getAreaType()); + containsRq.setBufferZone(planAreaData.getBufferZone()); + } + + if (coordList != null) { + containsRq.setCoordList(coordList); } + + CtrCntrlPlanContainsRs ctrCntrlPlanContainsRs = this.checkSocketContains(containsRq); + model.setControlWarnCd(ctrCntrlPlanContainsRs.isWarning()); if (model.isControlWarnCd()) { CtrCntrlWarnLog log = new CtrCntrlWarnLog(); - if(control != null) { - log.setCntrlId(control.getCntrlId()); - log.setIdntfNum(control.getIdntfNum()); - } else { - log.setCntrlId(hisControl.getCntrlId()); - log.setIdntfNum(hisControl.getTrmnlId()); - } + log.setCntrlId(control.getCntrlId()); + log.setIdntfNum(control.getIdntfNum()); log.setOccurDt(hisControl.getSrvrRcvDt()); log.setLat(hisControl.getLat()); log.setLon(hisControl.getLon()); @@ -297,17 +318,9 @@ public class CtrCntrlService { model.setCreateDt(warnLog.getCreateDt()); model.setCreateUserId(warnLog.getCreateUserId()); } - if(control != null) { model.setCntrlId(control.getCntrlId()); model.setIdntfNum(control.getIdntfNum()); model.setWarnCount(warnCount); - - result.add(model); - return result; - } - model.setCntrlId(hisControl.getCntrlId()); - model.setIdntfNum(hisControl.getTrmnlId()); - model.setWarnCount(warnCount); result.add(model); } @@ -457,6 +470,70 @@ public class CtrCntrlService { return rs; } + + /** + * TODO 임시)warnList 최적화 + * + * @param rq + * @return + */ + public CtrCntrlPlanContainsRs checkSocketContains(CtrCntrlSocketContainsRq rq) { + CtrCntrlPlanContainsRs rs = new CtrCntrlPlanContainsRs(); + + int countSuccess = 0; + + if (rq.getIdntfNum() != null) { + List planArea = new ArrayList<>(); + + for(FltPlanAreaCoord coord : rq.getCoordList()) { + Coordinate coordinate = new Coordinate(coord.getLon(), coord.getLat()); + + planArea.add(coordinate); + } + // 드론 위치 + Coordinate targetCoord = new Coordinate(rq.getLon(), rq.getLat()); + + /** + * 1. 비행 구역에 벗어나면 모든 경우의 수는 비정상 상황으로 판단 + * 2. 비정상 상황 TYPE(비행구역, 공역)에 따라 구분 (미적용) + */ + boolean areaContains = true; +// boolean airspaceContains = false; + switch(rq.getAreaType()) { + case "LINE" : + List transPlanArea = areaUtils.transform(planArea, "EPSG:4326", "EPSG:5181"); + List planBuffer = areaUtils.buffer(transPlanArea, rq.getBufferZone()); + List transPlanBuffer = areaUtils.transform(planBuffer, "EPSG:5181", "EPSG:4326"); + + areaContains = areaUtils.contains(transPlanBuffer, targetCoord); +// log.info("LINE CONTAINS : {}", areaContains); + break; + + case "POLYGON" : + planArea.add(planArea.get(0)); + areaContains = areaUtils.contains(planArea, targetCoord); + break; + + case "CIRCLE" : + List circle = areaUtils.createCircle(planArea.get(0), rq.getBufferZone()); + areaContains = areaUtils.contains(circle, targetCoord); + break; + } + + if (areaContains) countSuccess++; + } + + // 1개라도 + if (countSuccess > 0) { + rs.setWarning(false); + } else { + rs.setWarning(true); + } + + rs.setIdntfNum(rq.getIdntfNum()); + + return rs; + } /** diff --git a/src/main/java/com/palnet/biz/jpa/repository/flt/FltPlanAreaCoordRepository.java b/src/main/java/com/palnet/biz/jpa/repository/flt/FltPlanAreaCoordRepository.java index a78abad..5b8ef43 100644 --- a/src/main/java/com/palnet/biz/jpa/repository/flt/FltPlanAreaCoordRepository.java +++ b/src/main/java/com/palnet/biz/jpa/repository/flt/FltPlanAreaCoordRepository.java @@ -1,14 +1,14 @@ package com.palnet.biz.jpa.repository.flt; -import com.palnet.biz.jpa.entity.FltPlanAreaCoord; -import com.palnet.biz.jpa.entity.FltPlanBas; +import java.util.List; import org.locationtech.jts.geom.Coordinate; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; -import java.util.List; -import java.util.Optional; +import com.palnet.biz.api.bas.flight.model.BasFlightPlanAreaCoordModel; +import com.palnet.biz.jpa.entity.FltPlanAreaCoord; public interface FltPlanAreaCoordRepository extends JpaRepository { @@ -16,4 +16,8 @@ public interface FltPlanAreaCoordRepository extends JpaRepository getCoordinate(@Param ("planAreaSno") int planAreaSno); } diff --git a/src/main/java/com/palnet/biz/jpa/repository/flt/FltPlanAreaRepository.java b/src/main/java/com/palnet/biz/jpa/repository/flt/FltPlanAreaRepository.java index 990306f..ad8f5c6 100644 --- a/src/main/java/com/palnet/biz/jpa/repository/flt/FltPlanAreaRepository.java +++ b/src/main/java/com/palnet/biz/jpa/repository/flt/FltPlanAreaRepository.java @@ -3,11 +3,22 @@ package com.palnet.biz.jpa.repository.flt; import com.palnet.biz.jpa.entity.FltPlanArea; import com.palnet.biz.jpa.entity.FltPlanBas; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import java.util.List; import java.util.Optional; public interface FltPlanAreaRepository extends JpaRepository { List findByPlanSnoOrderByPlanAreaSnoAsc(Integer planSno); - + + @Query(value = " select PLAN_AREA_SNO from FLT_PLAN_AREA " + + " where PLAN_SNO = :planSno " + + " order by PLAN_AREA_SNO desc limit 1 ", nativeQuery = true) + int getPlanAreaSno(@Param("planSno") int planSno); + + @Query(value = "select f from FltPlanArea f " + + "where f.planSno = :planSno ") + FltPlanArea getPlanData(@Param("planSno") int planSno); } diff --git a/src/main/java/com/palnet/biz/jpa/repository/flt/FltPlanBasRepository.java b/src/main/java/com/palnet/biz/jpa/repository/flt/FltPlanBasRepository.java index 3601f22..5ad7619 100644 --- a/src/main/java/com/palnet/biz/jpa/repository/flt/FltPlanBasRepository.java +++ b/src/main/java/com/palnet/biz/jpa/repository/flt/FltPlanBasRepository.java @@ -1,6 +1,7 @@ package com.palnet.biz.jpa.repository.flt; +import com.palnet.biz.api.ctr.cntrl.model.CtrCntrlSocketDataModel; import com.palnet.biz.jpa.entity.FltPlanBas; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Modifying; diff --git a/src/main/java/com/palnet/biz/jpa/repository/flt/FltPlanCtrCntrlRelRepository.java b/src/main/java/com/palnet/biz/jpa/repository/flt/FltPlanCtrCntrlRelRepository.java index 26b0bde..460ff04 100644 --- a/src/main/java/com/palnet/biz/jpa/repository/flt/FltPlanCtrCntrlRelRepository.java +++ b/src/main/java/com/palnet/biz/jpa/repository/flt/FltPlanCtrCntrlRelRepository.java @@ -1,9 +1,16 @@ package com.palnet.biz.jpa.repository.flt; -import com.palnet.biz.jpa.entity.FltPlanCtrCntrlRel; -import org.springframework.data.jpa.repository.JpaRepository; -public interface FltPlanCtrCntrlRelRepository extends JpaRepository { +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; +import com.palnet.biz.jpa.entity.FltPlanCtrCntrlRel; +public interface FltPlanCtrCntrlRelRepository extends JpaRepository { + + @Query(value = " select PLAN_SNO from FLT_PLAN_CTR_CNTRL_REL" + + " where IDNTF_NUM = :idntfNum " + + " order by PLAN_SNO desc limit 1 ", nativeQuery = true ) + int getPlanSno(@Param("idntfNum") String idntfNum); } diff --git a/src/main/java/com/palnet/biz/message/consumer/MessageConsumer.java b/src/main/java/com/palnet/biz/message/consumer/MessageConsumer.java index 9285534..aac4734 100644 --- a/src/main/java/com/palnet/biz/message/consumer/MessageConsumer.java +++ b/src/main/java/com/palnet/biz/message/consumer/MessageConsumer.java @@ -36,6 +36,7 @@ public class MessageConsumer { /* channel.queueDeclare(message, true, false, false, null); rabbitMQ 서버 강제 종료 등 Queue가 유실되는 것을 방지하기 위해 disk에 Queue를 적재 ( Queue 영속성 ) -> 이 옵션 설정시 Queue의 유실은 방지할 수 있으나 Consumer Ack의 응답률이 절반으로 떨어지게 되고 , Unacked -> Ready로 되돌아가는 Queue가 생김 */ +// channel.basicConsume(message, true, null); channel.basicAck(tag, true); // channel 유지를 위해 Consumer -> Producer로 수신 확인 신호를 자동으로 전송 diff --git a/src/main/resources/application-database.yml b/src/main/resources/application-database.yml index 37d60c1..e11d419 100644 --- a/src/main/resources/application-database.yml +++ b/src/main/resources/application-database.yml @@ -5,7 +5,7 @@ spring: datasource: control: driver-class-name: net.sf.log4jdbc.sql.jdbcapi.DriverSpy - jdbc-url: jdbc:log4jdbc:mysql://13.125.97.21:3306/PAV?characterEncoding=UTF-8&autoReconnect=true&useSSL=false + jdbc-url: jdbc:log4jdbc:mysql://palnet.cexpliz30rwl.ap-northeast-2.rds.amazonaws.com:3306/PAV?characterEncoding=UTF-8&autoReconnect=true&useSSL=false username: pav password: palnet!234 # minimumidle: 5 diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index f2f4636..2f57b5a 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -50,7 +50,7 @@ spring: # show_sql: true # format_sql: true rabbitmq: - host: 192.168.0.26 + host: 192.168.0.42 port: 5672 username: palnet password: palnet!234