Browse Source

드론관제 최적화(임시)

Test
박재우 2 years ago
parent
commit
1d98836bea
  1. 21
      src/main/java/com/palnet/biz/api/ctr/cntrl/model/CtrCntrlSocketContainsRq.java
  2. 12
      src/main/java/com/palnet/biz/api/ctr/cntrl/model/CtrCntrlSocketDataModel.java
  3. 143
      src/main/java/com/palnet/biz/api/ctr/cntrl/service/CtrCntrlService.java
  4. 12
      src/main/java/com/palnet/biz/jpa/repository/flt/FltPlanAreaCoordRepository.java
  5. 13
      src/main/java/com/palnet/biz/jpa/repository/flt/FltPlanAreaRepository.java
  6. 1
      src/main/java/com/palnet/biz/jpa/repository/flt/FltPlanBasRepository.java
  7. 13
      src/main/java/com/palnet/biz/jpa/repository/flt/FltPlanCtrCntrlRelRepository.java
  8. 1
      src/main/java/com/palnet/biz/message/consumer/MessageConsumer.java
  9. 2
      src/main/resources/application-database.yml
  10. 2
      src/main/resources/application.yml

21
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<FltPlanAreaCoord> coordList;
}

12
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;
}

143
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<BasFlightPlanModel> 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<BasFlightPlanModel> flightPlan = new ArrayList<>();
// if (control != null) {
// flightPlan = this.getFlightPlan(control.getIdntfNum());
// }
int planSno = relRepository.getPlanSno(control.getIdntfNum());
FltPlanArea planAreaData = planAreaRepository.getPlanData(planSno);
List<FltPlanAreaCoord> 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<Coordinate> 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<Coordinate> transPlanArea = areaUtils.transform(planArea, "EPSG:4326", "EPSG:5181");
List<Coordinate> planBuffer = areaUtils.buffer(transPlanArea, rq.getBufferZone());
List<Coordinate> 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<Coordinate> 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;
}
/**

12
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<FltPlanAreaCoord, Integer> {
@ -16,4 +16,8 @@ public interface FltPlanAreaCoordRepository extends JpaRepository<FltPlanAreaCoo
@Query("Select lat, lon from FltPlanAreaCoord ")
Coordinate[] findCoord();
@Query("Select f from FltPlanAreaCoord f " +
"where planAreaSno = :planAreaSno " )
List<FltPlanAreaCoord> getCoordinate(@Param ("planAreaSno") int planAreaSno);
}

13
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<FltPlanArea, Integer> {
List<FltPlanArea> 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);
}

1
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;

13
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<FltPlanCtrCntrlRel, String> {
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<FltPlanCtrCntrlRel, String> {
@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);
}

1
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로 수신 확인 신호를 자동으로 전송

2
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

2
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

Loading…
Cancel
Save