From 96fde678d5ef8b043fb357dac5af6a6f1d65e13f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?dhji=28=EC=A7=80=EB=8C=80=ED=95=9C=29?= Date: Wed, 29 Nov 2023 15:27:41 +0900 Subject: [PATCH] =?UTF-8?q?TS=20-=20=EB=B6=88=EB=B2=95=EB=93=9C=EB=A1=A0?= =?UTF-8?q?=201~2=EC=B4=88=20=EB=A7=88=EB=8B=A4=20=EC=A0=84=EC=86=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- document/dron_test/pav-warning.js | 2 +- .../cntrl/service/SocketReceiverService.java | 30 +++++-- .../palnet/biz/config/WebSecurityConfig.java | 2 + .../controller/UtmSampleTestController.java | 24 ++++++ .../palnet/comn/collection/GPCollection.java | 43 +++++++++- .../java/com/palnet/comn/model/GPModel.java | 4 +- .../java/com/palnet/comn/model/UtmModel.java | 38 +++++++++ .../server/service/TaskServerService.java | 83 +++++++++++++++++++ 8 files changed, 213 insertions(+), 13 deletions(-) create mode 100644 pav-server/src/main/java/com/palnet/biz/sample/controller/UtmSampleTestController.java create mode 100644 pav-socket/src/main/java/com/palnet/comn/model/UtmModel.java diff --git a/document/dron_test/pav-warning.js b/document/dron_test/pav-warning.js index 70b422b..b3337f2 100644 --- a/document/dron_test/pav-warning.js +++ b/document/dron_test/pav-warning.js @@ -48,7 +48,7 @@ const getCoords = coords => { }; const getClient = () => { - const dronName = prefix + '010'; + const dronName = prefix + '095'; const client = {}; client.dronName = dronName; diff --git a/pav-server/src/main/java/com/palnet/biz/api/ctr/cntrl/service/SocketReceiverService.java b/pav-server/src/main/java/com/palnet/biz/api/ctr/cntrl/service/SocketReceiverService.java index 7857961..f157a02 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/ctr/cntrl/service/SocketReceiverService.java +++ b/pav-server/src/main/java/com/palnet/biz/api/ctr/cntrl/service/SocketReceiverService.java @@ -62,27 +62,41 @@ public class SocketReceiverService { ComIdntfBas idntfBas = idntBasRepository.findById(model.getObjectId()).orElse(null); // 1-1. 식별 번호의 모델 정보 조회 - ComArcrftBas arcrftBas = arcrftBasRepository.findById(idntfBas.getArcrftSno()).orElse(null); + // PAV-KAC에서는 기초데이터가 필수가 아니여서 idntBas가 null일 수 있음. + ComArcrftBas arcrftBas = null; + if (idntfBas != null && idntfBas.getArcrftSno() > 0) { + arcrftBas = arcrftBasRepository.findById(idntfBas.getArcrftSno()).orElse(null); + } + + if(ctrCntrlBas != null) { + if (ctrCntrlBas.getCntrlId() != null && !ctrCntrlBas.getCntrlId().isEmpty()) + fltPlanCtrCntrlRel.setCntrlId(ctrCntrlBas.getCntrlId()); + if (ctrCntrlBas.getIdntfNum() != null && !ctrCntrlBas.getIdntfNum().isEmpty()) + fltPlanCtrCntrlRel.setIdntfNum(ctrCntrlBas.getIdntfNum()); + } - if (idntfBas != null && arcrftBas != null) { - fltPlanCtrCntrlRel.setCntrlId(ctrCntrlBas.getCntrlId()); - fltPlanCtrCntrlRel.setIdntfNum(ctrCntrlBas.getIdntfNum()); + if (idntfBas != null && idntfBas.getCstmrSno() != null) { fltPlanCtrCntrlRel.setIdntfCstmrSno(idntfBas.getCstmrSno()); + } + + if (arcrftBas != null && arcrftBas.getGroupId() != null && !arcrftBas.getGroupId().isEmpty()){ fltPlanCtrCntrlRel.setGroupId(arcrftBas.getGroupId()); } // 2. 해당 되는 비행계획서 정보 저장. - List planArcrft = - fltPlanQueryRepository.findByFlightPlanArcrft(ctrCntrlBas.getIdntfNum(), dbModel.getServerRcvDt()); + List planArcrft = null; + if (ctrCntrlBas != null && ctrCntrlBas.getCntrlId() != null && !ctrCntrlBas.getCntrlId().isEmpty()){ + planArcrft = fltPlanQueryRepository.findByFlightPlanArcrft(ctrCntrlBas.getIdntfNum(), dbModel.getServerRcvDt()); + } - if (!planArcrft.isEmpty()) { + if (planArcrft != null && !planArcrft.isEmpty()) { for (FltPlanBas plan : planArcrft) { fltPlanCtrCntrlRel.setPlanSno(plan.getPlanSno()); } } // 3. mapping 정보 주입. - if (!fltPlanCtrCntrlRel.getCntrlId().isEmpty()) { + if (fltPlanCtrCntrlRel.getCntrlId() != null && !fltPlanCtrCntrlRel.getCntrlId().isEmpty() && fltPlanCtrCntrlRel.getPlanSno() != null) { ctrCntrlRelRepository.save(fltPlanCtrCntrlRel); } } diff --git a/pav-server/src/main/java/com/palnet/biz/config/WebSecurityConfig.java b/pav-server/src/main/java/com/palnet/biz/config/WebSecurityConfig.java index 19067c9..21a2007 100644 --- a/pav-server/src/main/java/com/palnet/biz/config/WebSecurityConfig.java +++ b/pav-server/src/main/java/com/palnet/biz/config/WebSecurityConfig.java @@ -41,6 +41,8 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter { "/api/server/**", "/api/comn/file/download", "/api/comn/file/download/**", + // TEST + "/api/v1/utm", /* swagger v2 */ "/v2/api-docs", "/swagger-resources", diff --git a/pav-server/src/main/java/com/palnet/biz/sample/controller/UtmSampleTestController.java b/pav-server/src/main/java/com/palnet/biz/sample/controller/UtmSampleTestController.java new file mode 100644 index 0000000..d53e373 --- /dev/null +++ b/pav-server/src/main/java/com/palnet/biz/sample/controller/UtmSampleTestController.java @@ -0,0 +1,24 @@ +package com.palnet.biz.sample.controller; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.ServletRequest; + +@Slf4j +@RestController +public class UtmSampleTestController { + + @PostMapping("/api/v1/utm") + public ResponseEntity utmReciverTest(@RequestBody String body, ServletRequest request) { + log.info("===================================================="); + log.info("===================================================="); + log.info("====>> /api/v1/utm sample test : {}", body); + log.info("===================================================="); + log.info("===================================================="); + return ResponseEntity.ok().build(); + } +} diff --git a/pav-socket/src/main/java/com/palnet/comn/collection/GPCollection.java b/pav-socket/src/main/java/com/palnet/comn/collection/GPCollection.java index 57d209b..c7d4abf 100644 --- a/pav-socket/src/main/java/com/palnet/comn/collection/GPCollection.java +++ b/pav-socket/src/main/java/com/palnet/comn/collection/GPCollection.java @@ -32,7 +32,7 @@ public class GPCollection { } public static Map> getAll() { - if (gpMap.keySet().size() < 1) { + if (gpMap.keySet().isEmpty()) { return null; } return gpMap; @@ -74,7 +74,7 @@ public class GPCollection { public static Map> sendAll() { log.info("sendAll start - GPMap size : {}", gpMap.size()); - if(gpMap.keySet().size() < 1) { + if(gpMap.keySet().isEmpty()) { return null; } Map> map = gpMap; @@ -83,13 +83,50 @@ public class GPCollection { return map; } + public static List sendAllUtm() { + log.info("sendAllUtm start - GPMap size : {}", gpMap.size()); + if(gpMap.keySet().isEmpty()) { + return null; + } + List list = new ArrayList<>(); + for (String key : gpMap.keySet()) { + List temp = gpMap.get(key); + if (temp == null || temp.isEmpty()) { + continue; + } + GPModel model = temp.get(temp.size() - 1); + if(!model.isSendUtm()){ + list.add(model); + } + } + log.info("sendAllUtm end - GPMap size : {}", gpMap.size()); + return list; + } + + public static void sendAllUtmSuccess(List successGPModel) { + if(successGPModel == null || successGPModel.isEmpty()) return; + for (GPModel model : successGPModel) { + if (model == null || model.getObjectId() == null || model.getObjectId().isEmpty()) { + continue; + } + List list = gpMap.get(model.getObjectId()); + if (list == null) return; + list.stream().filter(gpModel -> { + if(gpModel == null || gpModel.getRegDt() == null) return false; + return gpModel.getRegDt().equals(model.getRegDt()); + }).findFirst().ifPresent(gpModel -> { + gpModel.setSendUtm(true); + }); + } + } + // 1분마다 데이터 삭제 @Scheduled(fixedDelay = 1000 * 60) public void removeSchedule() { log.info("removeSchedule start - GPMap size : {}", gpMap.size()); for (String key : gpMap.keySet()) { List list = gpMap.get(key); - if (list == null || list.size() == 0) { + if (list == null || list.isEmpty()) { continue; } GPModel model = list.get(list.size() - 1); diff --git a/pav-socket/src/main/java/com/palnet/comn/model/GPModel.java b/pav-socket/src/main/java/com/palnet/comn/model/GPModel.java index 933695f..a7e0178 100644 --- a/pav-socket/src/main/java/com/palnet/comn/model/GPModel.java +++ b/pav-socket/src/main/java/com/palnet/comn/model/GPModel.java @@ -72,5 +72,7 @@ public class GPModel { // 큐가 Socket서버에 도착한 시간 private Instant regDt; - + // 큐가 Socket서버에 도착한 시간 + private boolean sendUtm; // 불법드론 전송 여부 + } diff --git a/pav-socket/src/main/java/com/palnet/comn/model/UtmModel.java b/pav-socket/src/main/java/com/palnet/comn/model/UtmModel.java new file mode 100644 index 0000000..0ae4f96 --- /dev/null +++ b/pav-socket/src/main/java/com/palnet/comn/model/UtmModel.java @@ -0,0 +1,38 @@ +package com.palnet.comn.model; + +import com.fasterxml.jackson.annotation.JsonAlias; +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class UtmModel { + @JsonProperty("GPSime") + private String GPSime; // 시간 yyyyMMddHHmmss + @JsonProperty("dronInfo") + private List dronInfo; + + @Data + @NoArgsConstructor + @AllArgsConstructor + @Builder + public static class DronInfo { + @JsonProperty("Id") + private String id; + @JsonProperty("Latitude") + private String latitude; + @JsonProperty("Longitude") + private String longitude; + @JsonProperty("Height") + private String height; + } + + +} diff --git a/pav-socket/src/main/java/com/palnet/server/task/server/service/TaskServerService.java b/pav-socket/src/main/java/com/palnet/server/task/server/service/TaskServerService.java index 5ae683c..3c3f598 100644 --- a/pav-socket/src/main/java/com/palnet/server/task/server/service/TaskServerService.java +++ b/pav-socket/src/main/java/com/palnet/server/task/server/service/TaskServerService.java @@ -2,6 +2,7 @@ package com.palnet.server.task.server.service; import com.palnet.comn.collection.GPCollection; import com.palnet.comn.model.GPModel; +import com.palnet.comn.model.UtmModel; import com.palnet.comn.utils.JsonUtils; import io.netty.channel.ChannelOption; import lombok.RequiredArgsConstructor; @@ -19,9 +20,14 @@ import java.net.URISyntaxException; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; +import java.time.Instant; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.time.format.DateTimeFormatter; import java.util.List; import java.util.Map; import java.util.concurrent.CompletableFuture; +import java.util.stream.Collectors; /** * packageName : com.palnet.server.task.wb.service @@ -129,4 +135,81 @@ public class TaskServerService { .bodyToMono(Void.class).subscribe(); } + @Scheduled(fixedDelay = 1000 * 2) + public void sendDataAllUtm() { + List modelList = GPCollection.sendAllUtm(); + if (modelList == null) { + return; + } + + // 가공 + List dronInfoList = modelList.stream().map(model -> { + UtmModel.DronInfo dronInfo = UtmModel.DronInfo.builder() + .id(model.getObjectId()) + .latitude(model.getLat().toString()) + .longitude(model.getLng().toString()) + .height(model.getElev().toString()) + .build(); + return dronInfo; + }).collect(Collectors.toList()); + + if(dronInfoList.isEmpty()) return; + + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss") + .withZone(ZoneId.of("Asia/Seoul")); + String dateStr = formatter.format(Instant.now()); + + UtmModel utmModel = UtmModel.builder() + .GPSime(dateStr) + .dronInfo(dronInfoList) + .build(); + + // 임시 하드코딩 + final String UTM_HOST = "http://localhost:8080"; + final String UTM_REALTIME_URI = "/api/v1/utm"; + + WebClient client = WebClient.builder() + .baseUrl(UTM_HOST) + .defaultHeader("Content-Type", "application/json") + .build(); + + client.post() + .uri(UTM_REALTIME_URI) + .body(Mono.just(utmModel), UtmModel.class) + .retrieve() + .bodyToMono(Void.class).subscribe(); + + // 전송 완료시 true 처리 + GPCollection.sendAllUtmSuccess(modelList); + + } + + public static void main(String[] args) { + + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss") + .withZone(ZoneId.of("Asia/Seoul")); + String dateStr = formatter.format(Instant.now()); + + Double lat = 37.123456; + Double lon = 127.123456; + Double elev = 100.0; + + UtmModel.DronInfo dronInfo = UtmModel.DronInfo.builder() + .id("objectId") + .latitude(lat.toString()) + .longitude(lon.toString()) + .height(elev.toString()) + .build(); + + List dronInfoList = List.of(dronInfo); + + UtmModel utmModel = UtmModel.builder() + .GPSime(dateStr) + .dronInfo(dronInfoList) + .build(); + + String json = JsonUtils.toJson(utmModel); + System.out.println(json); + } + }