diff --git a/pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/model/JwtRqModel.java b/pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/model/JwtRqModel.java index 7c40b46a..50a448f9 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/model/JwtRqModel.java +++ b/pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/model/JwtRqModel.java @@ -1,11 +1,10 @@ package com.palnet.biz.api.acnt.jwt.model; -import java.io.Serializable; import lombok.AllArgsConstructor; import lombok.Data; -import lombok.Getter; import lombok.NoArgsConstructor; -import lombok.Setter; + +import java.io.Serializable; @NoArgsConstructor diff --git a/pav-server/src/main/java/com/palnet/biz/api/bas/flight/controller/BasFlightController.java b/pav-server/src/main/java/com/palnet/biz/api/bas/flight/controller/BasFlightController.java index 1aeb5d13..bb18c759 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/bas/flight/controller/BasFlightController.java +++ b/pav-server/src/main/java/com/palnet/biz/api/bas/flight/controller/BasFlightController.java @@ -10,6 +10,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import com.palnet.biz.api.bas.flight.model.*; import org.json.simple.JSONObject; import org.json.simple.parser.JSONParser; import org.json.simple.parser.ParseException; @@ -24,15 +25,6 @@ import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import com.palnet.biz.api.bas.flight.dto.LanncPdfVO; - -import com.palnet.biz.api.bas.flight.model.BasFlightAprovRq; -import com.palnet.biz.api.bas.flight.model.BasFlightPlanArcrftModel; -import com.palnet.biz.api.bas.flight.model.BasFlightPlanAreaModel; -import com.palnet.biz.api.bas.flight.model.BasFlightPlanListRq; -import com.palnet.biz.api.bas.flight.model.BasFlightPlanModel; -import com.palnet.biz.api.bas.flight.model.BasFlightPlanPilotModel; -import com.palnet.biz.api.bas.flight.model.BasFlightScheduleRs; -import com.palnet.biz.api.bas.flight.model.BasFlightWeatherModel; import com.palnet.biz.api.bas.flight.service.BasFlightService; import com.palnet.biz.api.comn.model.ComnPagingRs; import com.palnet.biz.api.comn.response.BasicResponse; @@ -99,7 +91,7 @@ public class BasFlightController { @ApiOperation(value = "비행계획서 조회") @Tag(name = "비행계획서", description = "비행계획서 관련 API") public ResponseEntity findPlanList(BasFlightPlanListRq rq) { - ComnPagingRs result = null; + ComnPagingRs result = null; log.debug(">>> rq : {}", rq); try { result = basFlightService.listPlan(rq); @@ -116,7 +108,7 @@ public class BasFlightController { @GetMapping(value = "/plan/detail/{planSno}") @ApiOperation(value = "비행계획서 상세 조회") @Tag(name = "비행계획서", description = "비행계획서 관련 API") - @ApiImplicitParam(name = "planSno",value = "비행계획서일련번호", dataTypeClass = Integer.class) + @ApiImplicitParam(name = "planSno", value = "비행계획서일련번호", dataTypeClass = Integer.class) public ResponseEntity detailPlan(@PathVariable("planSno") Integer planSno) { BasFlightPlanModel result = null; try { @@ -135,14 +127,14 @@ public class BasFlightController { @ApiOperation(value = "비행계획서 등록") @Tag(name = "비행계획서", description = "비행계획서 관련 API") public ResponseEntity createPlan(@RequestBody BasFlightPlanModel rq) { - Map resultMap = new HashMap(); + BasFlightPlanLaancRs rs = null; try { - log.error(">>> rq : {}", rq); - boolean result = basFlightService.createPlan(rq); - resultMap.put("result", result); - log.info(">>> resultMap : " , resultMap); + log.debug(">>> rq : {}", rq); + rs = basFlightService.createPlan(rq); + log.debug(">>> rs : {}", rs); } catch (CustomException e) { + Map resultMap = new HashMap(); log.error("IGNORE : {}", e); resultMap.put("result", false); resultMap.put("errorCode", e.getErrorCode()); @@ -154,7 +146,7 @@ public class BasFlightController { .body(new ErrorResponse("Server Error", "-1")); } - return ResponseEntity.ok().body(new SuccessResponse<>(resultMap)); + return ResponseEntity.ok().body(new SuccessResponse<>(rs)); } // 비행계획서 수정 @@ -162,12 +154,12 @@ public class BasFlightController { @ApiOperation(value = "비행계획서 수정") @Tag(name = "비행계획서", description = "비행계획서 관련 API") public ResponseEntity updatePlan(@RequestBody BasFlightPlanModel rq) { - Map resultMap = new HashMap(); + BasFlightPlanLaancRs rs = null; try { - boolean result = basFlightService.updatePlan(rq); - resultMap.put("result", result); + rs = basFlightService.updatePlan(rq); } catch (CustomException e) { + Map resultMap = new HashMap(); log.error("IGNORE : {}", e); resultMap.put("result", false); resultMap.put("errorCode", e.getErrorCode()); @@ -179,14 +171,14 @@ public class BasFlightController { .body(new ErrorResponse("Server Error", "-1")); } - return ResponseEntity.ok().body(new SuccessResponse<>(resultMap)); + return ResponseEntity.ok().body(new SuccessResponse<>(rs)); } // 비행계획서 삭제 @DeleteMapping(value = "/plan/delete/{planSno}") @ApiOperation(value = "비행계획서 삭제") @Tag(name = "비행계획서", description = "비행계획서 관련 API") - @ApiImplicitParam(name = "planSno",value = "비행계획서일련번호", dataTypeClass = Integer.class) + @ApiImplicitParam(name = "planSno", value = "비행계획서일련번호", dataTypeClass = Integer.class) public ResponseEntity deletePlan(@PathVariable("planSno") Integer planSno) { Map resultMap = new HashMap(); try { @@ -211,7 +203,7 @@ public class BasFlightController { @GetMapping(value = "/plan/pilot/{groupId}") @ApiOperation(value = "그룹의 조종사 조회") @Tag(name = "비행계획서", description = "비행계획서 관련 API") - @ApiImplicitParam(name = "groupId",value = "그룹ID", dataTypeClass = String.class) + @ApiImplicitParam(name = "groupId", value = "그룹ID", dataTypeClass = String.class) public ResponseEntity findPilot(@PathVariable("groupId") String groupId) { List result = null; try { @@ -226,11 +218,12 @@ public class BasFlightController { return ResponseEntity.ok().body(new SuccessResponse<>(result)); } + // 그룹 기체 조회 @GetMapping(value = "/plan/arcrft/{groupId}") @ApiOperation(value = "그룹의 기체 조회") @Tag(name = "비행계획서", description = "비행계획서 관련 API") - @ApiImplicitParam(name = "groupId",value = "그룹ID", dataTypeClass = String.class) + @ApiImplicitParam(name = "groupId", value = "그룹ID", dataTypeClass = String.class) public ResponseEntity findArcrft(@PathVariable("groupId") String groupId) { List result = null; try { @@ -265,26 +258,27 @@ public class BasFlightController { @GetMapping("/plan/api/weather") @ApiOperation(value = "비행계획서 날씨") @Tag(name = "비행계획서", description = "비행계획서 관련 API") - public ResponseEntity restApiGetWeather(BasFlightWeatherModel rq){ - JSONObject jsonObject = null; - - try { - jsonObject = basFlightService.getWeather(rq); - } catch (Exception e) { - log.error("IGNORE : {}", e); - return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) - .body(new ErrorResponse("Server Error", "-1")); - } + public ResponseEntity restApiGetWeather(BasFlightWeatherModel rq) { + JSONObject jsonObject = null; + + try { + jsonObject = basFlightService.getWeather(rq); + } catch (Exception e) { + log.error("IGNORE : {}", e); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body(new ErrorResponse("Server Error", "-1")); + } return ResponseEntity.ok().body(new SuccessResponse<>(jsonObject)); } + // 비행계획서 리스트(승인) @GetMapping(value = "/aprv/list") @ApiOperation(value = "비행계획서 리스트(승인)") @Tag(name = "비행계획서", description = "비행계획서 관련 API") public ResponseEntity findAprvList(BasFlightPlanListRq rq) { - ComnPagingRs result = null; + ComnPagingRs result = null; try { result = basFlightService.aprvList(rq); } catch (Exception e) { @@ -295,6 +289,7 @@ public class BasFlightController { } return ResponseEntity.ok().body(new SuccessResponse<>(result)); } + // 비행계획서 승인/미승인 @PutMapping(value = "/aprv/proc") @ApiOperation(value = "비행 계획서 승인/미승인") @@ -337,30 +332,30 @@ public class BasFlightController { return ResponseEntity.ok().body(new SuccessResponse<>(resultMap)); } - + //지역 검색 @GetMapping("/plan/area/search") @ApiOperation(value = "지역 검색") @Tag(name = "비행계획서", description = "비행계획서 관련 API") public ResponseEntity searchArea(String query) throws ParseException { - String text = null; - try { - text = URLEncoder.encode(query, "UTF-8"); - } catch (UnsupportedEncodingException e) { - throw new RuntimeException("검색어 인코딩 실패", e); - } - - String apiURL = env.getProperty("api.naver.search-url") + "?query=" + text + "&display=5"; - Map requestHeaders = new HashMap<>(); - requestHeaders.put("X-Naver-Client-Id", env.getProperty("api.naver.client-id")); - requestHeaders.put("X-Naver-Client-Secret", env.getProperty("api.naver.client-secret-key")); - String responseBody = basFlightService.searchArea(apiURL, requestHeaders); - - JSONParser parser = new JSONParser(); - Object obj = parser.parse(responseBody); - - return ResponseEntity.ok().body(new SuccessResponse<>(obj)); - } + String text = null; + try { + text = URLEncoder.encode(query, "UTF-8"); + } catch (UnsupportedEncodingException e) { + throw new RuntimeException("검색어 인코딩 실패", e); + } + + String apiURL = env.getProperty("api.naver.search-url") + "?query=" + text + "&display=5"; + Map requestHeaders = new HashMap<>(); + requestHeaders.put("X-Naver-Client-Id", env.getProperty("api.naver.client-id")); + requestHeaders.put("X-Naver-Client-Secret", env.getProperty("api.naver.client-secret-key")); + String responseBody = basFlightService.searchArea(apiURL, requestHeaders); + + JSONParser parser = new JSONParser(); + Object obj = parser.parse(responseBody); + + return ResponseEntity.ok().body(new SuccessResponse<>(obj)); + } @GetMapping("/schedule") @Tag(name = "비행계획서", description = "비행계획서 관련 API") @@ -384,14 +379,14 @@ public class BasFlightController { @GetMapping("/test") public void createCircleTest(@RequestParam double getX, @RequestParam double getY, @RequestParam double buffer) { - - Coordinate circleCoord = new Coordinate(getY, getX); - List coordList = utils.createCircle(circleCoord, buffer); - for(Coordinate a : coordList) { - System.out.println("["+a.getX() + ", " + a.getY()+"],"); - } - } + Coordinate circleCoord = new Coordinate(getY, getX); + + List coordList = utils.createCircle(circleCoord, buffer); + for (Coordinate a : coordList) { + System.out.println("[" + a.getX() + ", " + a.getY() + "],"); + } + } @PostMapping("/lance-pdf/create") @Tag(name = "비행계획서", description = "비행계획서 관련 API") diff --git a/pav-server/src/main/java/com/palnet/biz/api/bas/flight/model/BasFlightPlanAreaCoordModel.java b/pav-server/src/main/java/com/palnet/biz/api/bas/flight/model/BasFlightPlanAreaCoordModel.java index 9ded3b75..042d7973 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/bas/flight/model/BasFlightPlanAreaCoordModel.java +++ b/pav-server/src/main/java/com/palnet/biz/api/bas/flight/model/BasFlightPlanAreaCoordModel.java @@ -3,7 +3,6 @@ package com.palnet.biz.api.bas.flight.model; import lombok.Data; import java.time.Instant; -import java.util.Date; @Data public class BasFlightPlanAreaCoordModel { diff --git a/pav-server/src/main/java/com/palnet/biz/api/bas/flight/model/BasFlightPlanAreaCoordQueryList.java b/pav-server/src/main/java/com/palnet/biz/api/bas/flight/model/BasFlightPlanAreaCoordQueryList.java index 1ff24985..0ec4b872 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/bas/flight/model/BasFlightPlanAreaCoordQueryList.java +++ b/pav-server/src/main/java/com/palnet/biz/api/bas/flight/model/BasFlightPlanAreaCoordQueryList.java @@ -1,10 +1,9 @@ package com.palnet.biz.api.bas.flight.model; -import java.util.List; - +import lombok.Data; import org.locationtech.jts.geom.Coordinate; -import lombok.Data; +import java.util.List; @Data public class BasFlightPlanAreaCoordQueryList { diff --git a/pav-server/src/main/java/com/palnet/biz/api/bas/flight/model/BasFlightPlanAreaCoordRq.java b/pav-server/src/main/java/com/palnet/biz/api/bas/flight/model/BasFlightPlanAreaCoordRq.java index fd7b9312..b92ba3dd 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/bas/flight/model/BasFlightPlanAreaCoordRq.java +++ b/pav-server/src/main/java/com/palnet/biz/api/bas/flight/model/BasFlightPlanAreaCoordRq.java @@ -1,7 +1,5 @@ package com.palnet.biz.api.bas.flight.model; -import java.util.Date; - import lombok.Data; @Data diff --git a/pav-server/src/main/java/com/palnet/biz/api/bas/flight/model/BasFlightPlanLaancRs.java b/pav-server/src/main/java/com/palnet/biz/api/bas/flight/model/BasFlightPlanLaancRs.java new file mode 100644 index 00000000..747205ea --- /dev/null +++ b/pav-server/src/main/java/com/palnet/biz/api/bas/flight/model/BasFlightPlanLaancRs.java @@ -0,0 +1,37 @@ +package com.palnet.biz.api.bas.flight.model; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * packageName : com.palnet.biz.api.bas.flight.model + * fileName : BasFlightPlanErrorRS + * author : dhji + * date : 2023-09-19(019) + * description : + * =========================================================== + * DATE AUTHOR NOTE + * ----------------------------------------------------------- + * 2023-09-19(019) dhji 최초 생성 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class BasFlightPlanLaancRs { + private String pilotQlfcYn; // 자격여부 + private String acrftInsuranceYn; // 항공기보험여부 + private String acrftDuplicatedYn; // 기체 중복여부 + private String planAreaDuplicatdYn; // 비행계획서비행구역 중복여부 + private String airspaceDuplicatedYn; // 공역 중복여부 + + public boolean isValid() { + return "Y".equals(pilotQlfcYn) + && "Y".equals(acrftInsuranceYn) + && "N".equals(acrftDuplicatedYn) + && "N".equals(planAreaDuplicatdYn) + && "N".equals(airspaceDuplicatedYn); + } +} diff --git a/pav-server/src/main/java/com/palnet/biz/api/bas/flight/model/BasFlightScheduleRs.java b/pav-server/src/main/java/com/palnet/biz/api/bas/flight/model/BasFlightScheduleRs.java index 2d47f0da..2de595d0 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/bas/flight/model/BasFlightScheduleRs.java +++ b/pav-server/src/main/java/com/palnet/biz/api/bas/flight/model/BasFlightScheduleRs.java @@ -3,7 +3,6 @@ package com.palnet.biz.api.bas.flight.model; import lombok.Data; import java.time.Instant; -import java.util.Date; @Data public class BasFlightScheduleRs { diff --git a/pav-server/src/main/java/com/palnet/biz/api/bas/flight/service/BasFlightService.java b/pav-server/src/main/java/com/palnet/biz/api/bas/flight/service/BasFlightService.java index 0b7d980f..ee893631 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/bas/flight/service/BasFlightService.java +++ b/pav-server/src/main/java/com/palnet/biz/api/bas/flight/service/BasFlightService.java @@ -13,6 +13,7 @@ import java.util.List; import java.util.Map; import java.util.stream.Collectors; +import com.palnet.biz.api.bas.flight.model.*; import org.apache.commons.lang3.StringUtils; import org.json.simple.JSONObject; import org.json.simple.parser.JSONParser; @@ -27,16 +28,6 @@ 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.BasFlightAprovRq; -import com.palnet.biz.api.bas.flight.model.BasFlightPlanArcrftModel; -import com.palnet.biz.api.bas.flight.model.BasFlightPlanAreaCoordModel; -import com.palnet.biz.api.bas.flight.model.BasFlightPlanAreaCoordRq; -import com.palnet.biz.api.bas.flight.model.BasFlightPlanAreaModel; -import com.palnet.biz.api.bas.flight.model.BasFlightPlanListRq; -import com.palnet.biz.api.bas.flight.model.BasFlightPlanModel; -import com.palnet.biz.api.bas.flight.model.BasFlightPlanPilotModel; -import com.palnet.biz.api.bas.flight.model.BasFlightScheduleRs; -import com.palnet.biz.api.bas.flight.model.BasFlightWeatherModel; import com.palnet.biz.api.bas.group.model.BasGroupJoinModel; import com.palnet.biz.api.comn.model.ComnPagingRs; import com.palnet.biz.jpa.entity.FltPlanArcrft; @@ -181,7 +172,14 @@ public class BasFlightService { return rs; } - public void planValid(BasFlightPlanModel rq) { + public BasFlightPlanLaancRs planValid(BasFlightPlanModel rq) { + BasFlightPlanLaancRs rs = BasFlightPlanLaancRs.builder() + .pilotQlfcYn("N") + .acrftInsuranceYn("N") + .airspaceDuplicatedYn("N") + .acrftDuplicatedYn("N") + .planAreaDuplicatdYn("N") + .build(); boolean isEqualsFltElev = false; List rqAreaList = rq.getAreaList(); String rqFltElev = rqAreaList.get(0).getFltElev(); @@ -197,10 +195,12 @@ public class BasFlightService { } List effectivePlanCount = fltPlanQueryRepository.CoordCount(rq); for (BasFlightPlanModel i : effectivePlanList) { - if (rq.getPlanSno().equals(i.getPlanSno())) return; + // TODO 의미? + if (rq.getPlanSno().equals(i.getPlanSno())) return rs; + } if (effectivePlanList != null && !effectivePlanList.isEmpty()) { - for (BasFlightPlanModel plan : effectivePlanList) { + plan: for (BasFlightPlanModel plan : effectivePlanList) { // 1. 구역 조회 List areaList = fltPlanAreaRepository.findByPlanSnoOrderByPlanAreaSnoAsc(plan.getPlanSno()); @@ -251,23 +251,29 @@ public class BasFlightService { } else if ("CIRCLE".equals(rqArea.getAreaType())) { rqCoordBufferList = areaUtils.createCircle(rqCoord.get(0), rqArea.getBufferZone()); } - //검증 + //검증 - 비행계획서 비행구역 중복확인 overlapCheck = areaUtils.overlaps(rqCoordBufferList, effectiveCoordBufferList); overlapCheck2 = areaUtils.overlaps(effectiveCoordBufferList, rqCoordBufferList); if ((overlapCheck || overlapCheck2) && isEqualsFltElev) { - throw new CustomException(ErrorCode.PLAN_DATA_DUPLICATE); +// throw new CustomException(ErrorCode.PLAN_DATA_DUPLICATE); + rs.setPlanAreaDuplicatdYn("Y"); + break plan; } for (Coordinate coord : effectiveCoordBufferList) { containCheck = areaUtils.contains(rqCoordBufferList, coord); if (containCheck && isEqualsFltElev) { - throw new CustomException(ErrorCode.PLAN_DATA_DUPLICATE); +// throw new CustomException(ErrorCode.PLAN_DATA_DUPLICATE); + rs.setPlanAreaDuplicatdYn("Y"); + break plan; } } for (Coordinate coord : rqCoordBufferList) { containCheck2 = areaUtils.contains(effectiveCoordBufferList, coord); if (containCheck2 && isEqualsFltElev) { - throw new CustomException(ErrorCode.PLAN_DATA_DUPLICATE); +// throw new CustomException(ErrorCode.PLAN_DATA_DUPLICATE); + rs.setPlanAreaDuplicatdYn("Y"); + break plan; } } } @@ -275,24 +281,34 @@ public class BasFlightService { } // 3. 중복 기체 확인 - for (BasFlightPlanAreaCoordRq idntfNum : effectivePlanCount) { + acrft: for (BasFlightPlanAreaCoordRq idntfNum : effectivePlanCount) { for (BasFlightPlanArcrftModel rqArcrft : rq.getArcrftList()) { if (rqArcrft.getIdntfNum().equals(idntfNum.getIdntfNum())) { - throw new CustomException(ErrorCode.ARCRFT_DATA_DUPLICATE); +// throw new CustomException(ErrorCode.ARCRFT_DATA_DUPLICATE); + rs.setAcrftDuplicatedYn("Y"); + break acrft; } } } } } + return rs; } // 비행계획서 등록 @Transactional - public boolean createPlan(BasFlightPlanModel rq) { + public BasFlightPlanLaancRs createPlan(BasFlightPlanModel rq) { // 비행계획서 유효성 검사. - this.planValid(rq); + BasFlightPlanLaancRs rs = this.planValid(rq); + // TODO 공역 중복 확인 + rs.setAirspaceDuplicatedYn("N"); + // TODO 조종사 자격 및 기체보험 확인 + rs.setPilotQlfcYn("Y"); + rs.setAcrftInsuranceYn("Y"); + + if(!rs.isValid()) return rs; // 비행계획서 String userId = jwtTokenUtil.getUserIdByToken(); @@ -349,15 +365,23 @@ public class BasFlightService { fltPlanArcrftRepository.save(arcrftEntity); } } - return true; + return rs; } // 비행계획서 수정 @Transactional - public boolean updatePlan(BasFlightPlanModel rq) { + public BasFlightPlanLaancRs updatePlan(BasFlightPlanModel rq) { // 비행계획서 유효성 검사. - this.planValid(rq); + // 비행계획서 유효성 검사. + BasFlightPlanLaancRs rs = this.planValid(rq); + // TODO 공역 중복 확인 + rs.setAirspaceDuplicatedYn("N"); + // TODO 조종사 자격 및 기체보험 확인 + rs.setPilotQlfcYn("Y"); + rs.setAcrftInsuranceYn("Y"); + + if(!rs.isValid()) return rs; if (rq != null && rq.getPlanSno() != null) { String userId = jwtTokenUtil.getUserIdByToken(); @@ -475,7 +499,7 @@ public class BasFlightService { fltPlanArcrftRepository.deleteAll(deleteArcrftEntity); } } - return true; + return rs; } // 비행계획서 삭제 diff --git a/pav-server/src/main/java/com/palnet/biz/api/ctr/cntrl/controller/CtrCntrlController.java b/pav-server/src/main/java/com/palnet/biz/api/ctr/cntrl/controller/CtrCntrlController.java index 1f971991..ac60e093 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/ctr/cntrl/controller/CtrCntrlController.java +++ b/pav-server/src/main/java/com/palnet/biz/api/ctr/cntrl/controller/CtrCntrlController.java @@ -296,4 +296,25 @@ public class CtrCntrlController { } return ResponseEntity.ok().body(new SuccessResponse(result)); } + + /** + * TODO 비행 관제 기체의 비정상 상황 확인 + * + * @param cntrlId + * @return + */ + @GetMapping("/complete/{cntrlId}") + @ApiOperation(value = "TODO 비행 완료된 기체의 정보 확인") + @Tag(name = "드론 관제 시스템", description = "드론 관제 관련 API") + public ResponseEntity flightCompleteInfo(@PathVariable String cntrlId) { + CtrCntrlArcrftComplModel result = new CtrCntrlArcrftComplModel(); + try { + result = service.getComplete(cntrlId); + } catch (Exception e) { + log.error("IGNORE : {}", e); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body(new ErrorResponse("Server Error", "-1")); + } + return ResponseEntity.ok().body(new SuccessResponse(result)); + } } \ No newline at end of file diff --git a/pav-server/src/main/java/com/palnet/biz/api/ctr/cntrl/model/CtrCntrlArcrftComplModel.java b/pav-server/src/main/java/com/palnet/biz/api/ctr/cntrl/model/CtrCntrlArcrftComplModel.java new file mode 100644 index 00000000..3f006dfd --- /dev/null +++ b/pav-server/src/main/java/com/palnet/biz/api/ctr/cntrl/model/CtrCntrlArcrftComplModel.java @@ -0,0 +1,20 @@ +package com.palnet.biz.api.ctr.cntrl.model; + +import lombok.Data; + +/** + * TODO 비행 종료된 기체의 정보 + * + */ + +@Data +public class CtrCntrlArcrftComplModel { + + private Double mvDistance; // 총 비행 거리 + + private String mvTime; // 총 비행 시간 + + private Double elevAvg; // 평균 고도 + + private Double speedAvg; // 평균 속도 +} diff --git a/pav-server/src/main/java/com/palnet/biz/api/ctr/cntrl/service/CtrCntrlService.java b/pav-server/src/main/java/com/palnet/biz/api/ctr/cntrl/service/CtrCntrlService.java index 5afa4e93..b0690ecb 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/ctr/cntrl/service/CtrCntrlService.java +++ b/pav-server/src/main/java/com/palnet/biz/api/ctr/cntrl/service/CtrCntrlService.java @@ -7,16 +7,17 @@ import java.net.HttpURLConnection; import java.net.URL; import java.net.URLEncoder; import java.text.SimpleDateFormat; +import java.time.Duration; import java.time.Instant; +import java.time.LocalDate; import java.time.LocalTime; +import java.time.Period; +import java.time.ZoneId; import java.util.ArrayList; -import java.util.Arrays; import java.util.Calendar; -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 org.apache.commons.lang3.StringUtils; @@ -25,7 +26,6 @@ import org.json.simple.parser.JSONParser; import org.json.simple.parser.ParseException; import org.locationtech.jts.geom.Coordinate; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -36,6 +36,7 @@ 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.CtrCntrlArcrftComplModel; 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; @@ -43,7 +44,6 @@ 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; @@ -68,7 +68,6 @@ 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.CtrSchedulerService; import com.palnet.biz.scheduler.ctr.service.CtrTrnsLctnService; import com.palnet.comn.model.GPHistoryModel; import com.palnet.comn.utils.AreaUtils; @@ -820,4 +819,88 @@ public class CtrCntrlService { returnCoord.setY(ny); return returnCoord; } + + /** + * TODO 비행 종료 데이터 상세 조회 + * + * @param controlId + * @return + */ + public CtrCntrlArcrftComplModel getComplete(String controlId) { + + CtrCntrlArcrftComplModel result = new CtrCntrlArcrftComplModel(); + List completeInfo = query.getCompleteInfo(controlId); + + Double mvDistanceAll = 0.0; + Duration duration = null; + + if(completeInfo.size() > 2) { + + + Instant start = completeInfo.get(0).getSrvrRcvDt(); + Instant end = completeInfo.get(completeInfo.size()-1).getSrvrRcvDt(); + + if(start != null && end != null) { + LocalDate startDate = start.atZone(ZoneId.of("Asia/Seoul")).toLocalDate(); + LocalDate endDate = end.atZone(ZoneId.of("Asia/Seoul")).toLocalDate(); + + duration = Duration.between(startDate, endDate); + } + + for (int from = 0, to = 1; from { return Instant.parse(dateString); } } catch (Exception e) { - log.error("ERROR : ", e); + log.error("instant parse error : {} => param: {}", e.getMessage(), p.getValueAsString()); return null; } } diff --git a/pav-server/src/main/java/com/palnet/biz/jpa/repository/ctr/CtrCntrlQueryRepository.java b/pav-server/src/main/java/com/palnet/biz/jpa/repository/ctr/CtrCntrlQueryRepository.java index 23acb068..e23ffb13 100644 --- a/pav-server/src/main/java/com/palnet/biz/jpa/repository/ctr/CtrCntrlQueryRepository.java +++ b/pav-server/src/main/java/com/palnet/biz/jpa/repository/ctr/CtrCntrlQueryRepository.java @@ -1717,4 +1717,33 @@ public List listCntrlHstry(String id){ return result; } + + public List getCompleteInfo(String cntrlId){ + + QCtrCntrlBas qCntrlBasEntity = QCtrCntrlBas.ctrCntrlBas; + QCtrCntrlHstry qCtrCntrHstry = QCtrCntrlHstry.ctrCntrlHstry; + + BooleanBuilder builder = new BooleanBuilder(); + builder.and(qCtrCntrHstry.cntrlId.eq(cntrlId)); + builder.and(qCntrlBasEntity.statusCd.eq("99")); + + List result = query.select(Projections.bean(CtrCntrlHstry.class , + qCtrCntrHstry.lat, + qCtrCntrHstry.lon , + qCtrCntrHstry.speed , + qCtrCntrHstry.speedType , + qCtrCntrHstry.elev , + qCtrCntrHstry.elevType , + qCtrCntrHstry.mvDstnc , + qCtrCntrHstry.mvDstncType + )) + .from(qCtrCntrHstry) + .leftJoin(qCntrlBasEntity) + .on(qCntrlBasEntity.cntrlId.eq(qCtrCntrHstry.cntrlId)) + .where(builder) + .orderBy(qCtrCntrHstry.srvrRcvDt.asc()) + .fetch(); + + return result; + } } diff --git a/pav-server/src/main/java/com/palnet/biz/jpa/repository/flt/FltPlanQueryRepository.java b/pav-server/src/main/java/com/palnet/biz/jpa/repository/flt/FltPlanQueryRepository.java index 6e279304..dcc31f3f 100644 --- a/pav-server/src/main/java/com/palnet/biz/jpa/repository/flt/FltPlanQueryRepository.java +++ b/pav-server/src/main/java/com/palnet/biz/jpa/repository/flt/FltPlanQueryRepository.java @@ -669,7 +669,7 @@ public class FltPlanQueryRepository { /** * 김포공항, 비행승인 통계 API - * @param yyyymm + * @param date * @return */ public List mainKacStcsPlanAllow(String date, String[] formatParam){ diff --git a/pav-socket/build.gradle b/pav-socket/build.gradle index 3b08317d..6ea45562 100644 --- a/pav-socket/build.gradle +++ b/pav-socket/build.gradle @@ -20,7 +20,7 @@ jar { } dependencies { - implementation project(':pav-common') +// implementation project(':pav-common') implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-starter-actuator' diff --git a/pav-websocket/build.gradle b/pav-websocket/build.gradle index 5cd9e046..8783894a 100644 --- a/pav-websocket/build.gradle +++ b/pav-websocket/build.gradle @@ -20,7 +20,7 @@ jar { } dependencies { - implementation project(':pav-common') +// implementation project(':pav-common') implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'io.netty:netty-all:4.1.63.Final' diff --git a/settings.gradle b/settings.gradle index d85a34dc..6a394419 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,6 +1,6 @@ rootProject.name = 'pav-be-kac' -include 'pav-common' +//include 'pav-common' include 'pav-socket' include 'pav-websocket' include 'pav-server'