From eadb60f9bda04b55072b990b9a94485359c8c1ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?dhji=28=EC=A7=80=EB=8C=80=ED=95=9C=29?= Date: Sat, 22 Jun 2024 23:36:51 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=EB=93=9C=EB=A1=A0=EC=9B=90=EC=8A=A4?= =?UTF-8?q?=ED=86=B1=20=EC=8B=A0=EC=B2=AD=EB=AA=A9=EB=A1=9D=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20-=20=EC=88=98=EC=A0=95=20=EA=B0=80=EB=8A=A5=20?= =?UTF-8?q?=ED=95=AD=EB=AA=A9=20:=20=EB=B0=98=EA=B2=BD,=20=EA=B3=A0?= =?UTF-8?q?=EB=8F=84,=20=EC=84=B8=EB=B6=80=EC=82=AC=ED=95=AD,=20=EA=B8=B4?= =?UTF-8?q?=EA=B8=89=EA=B5=AC=EC=A1=B0=EA=B8=B0=EA=B4=80,=20=EB=B9=84?= =?UTF-8?q?=EA=B3=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- http/server/server.http | 13 +++ .../bas/dos/controller/BasDosController.java | 22 +++++- .../biz/api/bas/dos/model/UpdatePlanRq.java | 27 +++++++ .../api/bas/dos/service/BasDosService.java | 79 +++++++++++++++++-- .../external/service/DronOneStopService.java | 2 +- .../dos/DosFltPlanAreaRepository.java | 5 +- 6 files changed, 137 insertions(+), 11 deletions(-) create mode 100644 pav-server/src/main/java/com/palnet/biz/api/bas/dos/model/UpdatePlanRq.java diff --git a/http/server/server.http b/http/server/server.http index b1417eac..d2ccf69b 100644 --- a/http/server/server.http +++ b/http/server/server.http @@ -51,6 +51,19 @@ Authorization: {{accessToken}} GET {{appHost}}/api/bas/dos/plan?searchStDt=2024-06-14&searchEndDt=2024-06-14 Authorization: {{accessToken}} +### dos(드론원스톱) 목록 수정 +PUT {{appHost}}/api/bas/dos/plan +Content-Type: application/json +Authorization: {{accessToken}} + +[{ + "planAreaSno": 43, + "bufferZone": 10.0, + "fltElev": 80.0, + "dtl": "수정상세", + "era": "수정응급실", + "rm": "수정ㅂㅣ고" +}] ### dos(드론원스톱) api 연동 테스트 POST {{appHost}}/api/external/dos/plan/laanc diff --git a/pav-server/src/main/java/com/palnet/biz/api/bas/dos/controller/BasDosController.java b/pav-server/src/main/java/com/palnet/biz/api/bas/dos/controller/BasDosController.java index e39bfdc5..73719380 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/bas/dos/controller/BasDosController.java +++ b/pav-server/src/main/java/com/palnet/biz/api/bas/dos/controller/BasDosController.java @@ -2,14 +2,15 @@ package com.palnet.biz.api.bas.dos.controller; import com.palnet.biz.api.bas.dos.model.BasDosPlanRq; import com.palnet.biz.api.bas.dos.model.BasDosPlanRs; +import com.palnet.biz.api.bas.dos.model.UpdatePlanRq; import com.palnet.biz.api.bas.dos.service.BasDosService; +import com.palnet.comn.code.ErrorCode; +import com.palnet.comn.exception.CustomException; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import java.util.List; @@ -35,4 +36,19 @@ public class BasDosController { return ResponseEntity.ok(rs); } + /** + * 비행계획 수정 + * + * @param rq + * @return + */ + @PutMapping("/plan") + public ResponseEntity updateDosPlan(@RequestBody List rq) { + if(rq == null || rq.isEmpty()) { + throw new CustomException(ErrorCode.NON_VALID_PARAMETER); + } + basDosService.updatePlan(rq); + return ResponseEntity.ok().build(); + } + } diff --git a/pav-server/src/main/java/com/palnet/biz/api/bas/dos/model/UpdatePlanRq.java b/pav-server/src/main/java/com/palnet/biz/api/bas/dos/model/UpdatePlanRq.java new file mode 100644 index 00000000..7fb0aa87 --- /dev/null +++ b/pav-server/src/main/java/com/palnet/biz/api/bas/dos/model/UpdatePlanRq.java @@ -0,0 +1,27 @@ +package com.palnet.biz.api.bas.dos.model; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class UpdatePlanRq { + // 비행계획일련번호 +// private Long planSno; + // 비행구역일련번호 + private Long planAreaSno; + // 버퍼존(반경) + private Double bufferZone; + // 고도 + private Double fltElev; + // 세부사항 + private String dtl; + // 긴급구조기관 + private String era; + // 비고 + private String rm; +} diff --git a/pav-server/src/main/java/com/palnet/biz/api/bas/dos/service/BasDosService.java b/pav-server/src/main/java/com/palnet/biz/api/bas/dos/service/BasDosService.java index c5f30ae6..fa0b34cd 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/bas/dos/service/BasDosService.java +++ b/pav-server/src/main/java/com/palnet/biz/api/bas/dos/service/BasDosService.java @@ -3,6 +3,9 @@ package com.palnet.biz.api.bas.dos.service; import com.palnet.biz.api.bas.dos.model.BasDosPlanAreaRs; import com.palnet.biz.api.bas.dos.model.BasDosPlanRq; import com.palnet.biz.api.bas.dos.model.BasDosPlanRs; +import com.palnet.biz.api.bas.dos.model.UpdatePlanRq; +import com.palnet.biz.api.external.model.DosApprovalResult; +import com.palnet.biz.api.external.service.DronOneStopService; import com.palnet.biz.jpa.entity.DosFltPlanArea; import com.palnet.biz.jpa.entity.DosFltPlanBas; import com.palnet.biz.jpa.entity.DosFltPlanResult; @@ -19,9 +22,12 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.StringUtils; +import java.time.Instant; import java.time.LocalDate; -import java.time.Month; -import java.util.*; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Optional; import java.util.stream.Collectors; @Slf4j @@ -33,6 +39,7 @@ public class BasDosService { private final DosFltPlanAreaRepository dosFltPlanAreaRepository; private final DosFltPlanResultRepository dosFltPlanResultRepository; private final DosFltPlanQueryRepository dosFltPlanQueryRepository; + private final DronOneStopService dronOneStopService; private final AreaUtils areaUtils; /** @@ -73,13 +80,13 @@ public class BasDosService { String[] purposeTexts = {"레저비행", "사진/영상촬영"}; if (StringUtils.hasText(purpose)) { boolean isEtc = true; - for(String compareStr: purposeTexts){ - if(purpose.contains(compareStr)){ + for (String compareStr : purposeTexts) { + if (purpose.contains(compareStr)) { isEtc = false; break; } } - if(isEtc) { + if (isEtc) { purpose = "기타"; } @@ -196,6 +203,68 @@ public class BasDosService { return rs; } + /** + * 비행계획 수정 + * + * @param rq + */ + public void updatePlan(List rq) { + for (UpdatePlanRq planRq : rq) { + if (planRq.getPlanAreaSno() == null) { + log.info("planAreaSno is empty."); + continue; + } + + Optional optional = dosFltPlanAreaRepository.findById(planRq.getPlanAreaSno()); + if (optional.isPresent()) { + DosFltPlanArea area = optional.get(); + + if (planRq.getFltElev() != null) area.setFltElev(planRq.getFltElev()); + if (planRq.getBufferZone() != null) area.setBufferZone(planRq.getBufferZone()); + if (StringUtils.hasText(planRq.getDtl())) area.setDtl(planRq.getDtl()); + if (StringUtils.hasText(planRq.getEra())) area.setEra(planRq.getEra()); + if (StringUtils.hasText(planRq.getRm())) area.setRm(planRq.getRm()); + + area = dosFltPlanAreaRepository.save(area); + + // 재검증 + if (planRq.getFltElev() != null || planRq.getBufferZone() != null) { + Optional optionalResult = dosFltPlanResultRepository.findById(area.getPlanAreaSno()); + DosFltPlanResult dosFltPlanResult = null; + if(optionalResult.isPresent()) { + dosFltPlanResult = optionalResult.get(); + } + // Circle만 체크 + Double bufferZone = area.getBufferZone(); + Double fltElev = area.getFltElev() != null ? area.getFltElev() : 0; + + // 좌표 추출 - 중심 좌표 + Coordinate centerPoint = new Coordinate(area.getLon(), area.getLat()); + + DosApprovalResult approvalResult = dronOneStopService.getApprovalResult(bufferZone, fltElev, centerPoint); + + // 재검증 수정 + if(dosFltPlanResult != null){ + dosFltPlanResult.setApprovalCd(approvalResult.getApprovalCd().getCode()); + dosFltPlanResult.setFltElevMax(approvalResult.getFltElevMax()); + } else { + dosFltPlanResult = DosFltPlanResult.builder() + .planAreaSno(area.getPlanAreaSno()) + .planSno(area.getPlanSno()) + .approvalCd(approvalResult.getApprovalCd().getCode()) + .fltElevMax(approvalResult.getFltElevMax()) + .updateDt(Instant.now()) + .createDt(Instant.now()) + .build(); + } + dosFltPlanResultRepository.save(dosFltPlanResult); + } + } else { + log.warn("update data is not found : {}", planRq); + } + } + } + /** * Buffer 좌표 추출 * 비행구역의 데이터를 이용하여 주변의 좌표를 추출한다. 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 b6842da3..a8c001db 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 @@ -158,7 +158,7 @@ public class DronOneStopService { return rs; } - protected DosApprovalResult getApprovalResult(Double bufferZone, Double fltElev, Coordinate centerPoint) { + public DosApprovalResult getApprovalResult(Double bufferZone, Double fltElev, Coordinate centerPoint) { DosApprovalResult result = new DosApprovalResult(); // Circle만 체크 // 좌표 추출 - 중심 좌표 diff --git a/pav-server/src/main/java/com/palnet/biz/jpa/repository/dos/DosFltPlanAreaRepository.java b/pav-server/src/main/java/com/palnet/biz/jpa/repository/dos/DosFltPlanAreaRepository.java index 588f0a84..854699a5 100644 --- a/pav-server/src/main/java/com/palnet/biz/jpa/repository/dos/DosFltPlanAreaRepository.java +++ b/pav-server/src/main/java/com/palnet/biz/jpa/repository/dos/DosFltPlanAreaRepository.java @@ -4,12 +4,13 @@ import com.palnet.biz.jpa.entity.DosFltPlanArea; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; -import java.util.Collection; import java.util.List; @Repository public interface DosFltPlanAreaRepository extends JpaRepository { List findByPlanSnoOrderByPlanAreaSnoAsc(Long planSno); - List findByPlanSnoInOrderByZoneNoAsc(Collection planSnoList); + List findByPlanSnoInOrderByZoneNoAsc(List planSnoList); + + List findByPlanAreaSnoIn(List planAreaSnoList); }