From 583e77a9db97788119833d72c818d716707c5c63 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, 27 Sep 2023 11:07:17 +0900 Subject: [PATCH] =?UTF-8?q?laanc=20=EA=B2=80=EC=A6=9D=201=EC=B0=A8?= =?UTF-8?q?=EC=95=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../laanc/controller/BasLaancController.java | 8 +- .../bas/laanc/model/BasLaancValidatedRs.java | 54 +++++---- .../api/bas/laanc/service/BasLaancMapper.java | 8 +- .../bas/laanc/service/BasLaancService.java | 106 ++++++++++-------- .../biz/api/external/model/PilotValidRs.java | 1 + .../biz/api/external/service/TsService.java | 30 +++-- 6 files changed, 116 insertions(+), 91 deletions(-) diff --git a/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/controller/BasLaancController.java b/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/controller/BasLaancController.java index b188bf1d..4294f0e3 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/controller/BasLaancController.java +++ b/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/controller/BasLaancController.java @@ -56,13 +56,13 @@ public class BasLaancController { } catch (CustomException e) { Map resultMap = new HashMap(); - log.error("IGNORE : {}", e); + log.error("IGNORE : ", e); resultMap.put("result", false); resultMap.put("errorCode", e.getErrorCode()); resultMap.put("errorMessage", e.getMessage()); return ResponseEntity.ok().body(new SuccessResponse(resultMap)); } catch (Exception e) { - log.error("IGNORE : {}", e); + log.error("IGNORE : ", e); return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) .body(new ErrorResponse("Server Error", "-1")); @@ -80,13 +80,13 @@ public class BasLaancController { rs = basLaancService.createFlightPlan(rq); } catch (CustomException e) { Map resultMap = new HashMap(); - log.error("IGNORE : {}", e); + log.error("IGNORE : ", e); resultMap.put("result", false); resultMap.put("errorCode", e.getErrorCode()); resultMap.put("errorMessage", e.getMessage()); return ResponseEntity.ok().body(new SuccessResponse(resultMap)); } catch (Exception e) { - log.error("IGNORE : {}", e); + log.error("IGNORE : ", e); return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) .body(new ErrorResponse("Server Error", "-1")); diff --git a/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancValidatedRs.java b/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancValidatedRs.java index b6a2cabc..f24a1dfd 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancValidatedRs.java +++ b/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancValidatedRs.java @@ -1,11 +1,13 @@ package com.palnet.biz.api.bas.laanc.model; -import com.fasterxml.jackson.annotation.JsonIgnore; +import com.palnet.biz.api.external.model.PilotValidRs; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import java.util.List; + /** * packageName : com.palnet.biz.api.bas.flight.model * fileName : BasFlightPlanErrorRS @@ -23,32 +25,38 @@ import lombok.NoArgsConstructor; @AllArgsConstructor public class BasLaancValidatedRs { - private String pilotQlfcYn; // 자격여부 - private String arcrftInsuranceYn; // 항공기보험여부 - private String arcrftDuplicatedYn; // 기체 중복여부 - private String planAreaDuplicatdYn; // 비행계획서비행구역 중복여부 - private String evaluatedTargetAreaYn; // 평가대상지역여부 - 공역과 겹칠때만 - private String flightAreaYn; // 비행가능여부 - 비행가능 "Y" + private boolean isPilotQlfc; // 자격여부 + private boolean isArcrftInsurance; // 항공기보험여부 + + private boolean isArcrftDuplicated; // 기체 중복여부 + private boolean isPlanAreaDuplicatd; // 비행계획서비행구역 중복여부 + private boolean isEvaluatedTargetArea; // 평가대상지역여부 - 공역과 겹칠때만 true + private boolean isFlightArea; // 비행가능여부 - 비행가능 true + private boolean isArcrftWeight; // 항공기중량여부 - 25kg 이하 true + private boolean isElev; // 고도여부 - 150m 이하 true + + private boolean isReport; // 신고 대상 - 상업적이면서 기체중량2kg 이상일경우 - true - private String commercialYn; // 상업적/비상업적 구분 - 비상업 "N" - private String arcrftWeightYn; // 항공기중량여부 - 25kg 이하 "Y" - private String elevYn; // 고도여부 - 150m 이하 "Y" private String corpRegYn; // 사업자 여부 + private List pilotValidRsList; // 자격여부 public boolean isValid() { - return "Y".equals(pilotQlfcYn) - && "Y".equals(arcrftInsuranceYn) - && "N".equals(arcrftDuplicatedYn) - && "N".equals(planAreaDuplicatdYn) - && "Y".equals(evaluatedTargetAreaYn) - && "Y".equals(flightAreaYn); + if (isReport) { + return isPilotQlfc + && isArcrftInsurance + && !isArcrftDuplicated // 기체 중복여부 + && !isPlanAreaDuplicatd // 비행구역 중복여부 + && isEvaluatedTargetArea // 관제구역여부 + && isFlightArea // 비행가능여부 + && isElev // 150m 이하 + && isArcrftWeight; // 25kg 이하 + } + return !isArcrftDuplicated + && !isPlanAreaDuplicatd + && isEvaluatedTargetArea + && isFlightArea + && isElev // 150m 이하 + && isArcrftWeight; // 25kg 이하 } - @JsonIgnore - public boolean isValidAirspace() { - return "N".equals(arcrftDuplicatedYn) - && "N".equals(planAreaDuplicatdYn) - && "Y".equals(evaluatedTargetAreaYn) - && "Y".equals(flightAreaYn); - } } diff --git a/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/service/BasLaancMapper.java b/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/service/BasLaancMapper.java index 7b41fc95..468a0a28 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/service/BasLaancMapper.java +++ b/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/service/BasLaancMapper.java @@ -1,10 +1,7 @@ package com.palnet.biz.api.bas.laanc.service; import com.palnet.biz.api.acnt.cstmr.model.AnctCstmrModel; -import com.palnet.biz.api.bas.laanc.model.BasLaancArcrftModel; -import com.palnet.biz.api.bas.laanc.model.BasLaancAreaCoordModel; -import com.palnet.biz.api.bas.laanc.model.BasLaancAreaModel; -import com.palnet.biz.api.bas.laanc.model.BasLaancPlanRq; +import com.palnet.biz.api.bas.laanc.model.*; import com.palnet.biz.jpa.entity.*; import org.mapstruct.*; import org.mapstruct.factory.Mappers; @@ -24,7 +21,8 @@ import org.mapstruct.factory.Mappers; public interface BasLaancMapper { BasLaancMapper MAPPER = Mappers.getMapper(BasLaancMapper.class); - void mergeToEntity(@MappingTarget FltPlanBas rq1, FltPlanBas rq2); + void merge(@MappingTarget FltPlanBas rq1, FltPlanBas rq2); + void merge(@MappingTarget BasLaancValidatedRs rq1, BasLaancValidatedRs rq2); @Mapping(source = "updateUserId", target = "updateUserId", ignore = true) @Mapping(source = "updateDt", target = "updateDt", ignore = true) diff --git a/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/service/BasLaancService.java b/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/service/BasLaancService.java index d8d7adaf..f0cf3c0f 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/service/BasLaancService.java +++ b/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/service/BasLaancService.java @@ -10,6 +10,8 @@ import com.palnet.biz.api.external.model.PilotValidRq; import com.palnet.biz.api.external.model.PilotValidRs; import com.palnet.biz.api.external.service.TsService; import com.palnet.biz.jpa.entity.*; +import com.palnet.biz.jpa.entity.type.ArcrftWghtCd; +import com.palnet.biz.jpa.entity.type.FltType; import com.palnet.biz.jpa.repository.flt.*; import com.palnet.biz.jpa.repository.pty.PtyCstmrQueryRepository; import com.palnet.biz.jpa.repository.pty.PtyGroupBasRepository; @@ -66,54 +68,64 @@ public class BasLaancService { // LAANC 검증 public BasLaancValidatedRs validationLaanc(BasLaancPlanRq rq) { - BasLaancValidatedRs basLaancValidatedRs = new BasLaancValidatedRs(); - - basLaancValidatedRs.setCommercialYn("COMMERCIAL".equals(rq.getFltType()) ? "Y" : "N"); -// basLaancValidatedRs.set - ; - // TODO 조종사 자격 및 기체보험 확인 - PilotValidRq pilotValidRq = PilotValidRq.builder() - .pilotci("조종사CI") - .declarationnum("기체신고번호") - .build(); - - PilotValidRs pilotValidRs = tsService.callPilotValid(pilotValidRq); - if (pilotValidRs == null) { - basLaancValidatedRs.setPilotQlfcYn("N"); - basLaancValidatedRs.setArcrftInsuranceYn("N"); - } else { - basLaancValidatedRs.setPilotQlfcYn(pilotValidRs.getPilotcredentialyn()); - basLaancValidatedRs.setArcrftInsuranceYn(pilotValidRs.getArcrftinsuranceyn()); + BasLaancValidatedRs rs = new BasLaancValidatedRs(); + + // 조종사 자격 확인 - 무게가 2kg 초과이거나 상업적일 경우에만 진행 + // 상업 여부 - 상업(true) + boolean isCommercial = FltType.COMMERCIAL == rq.getFltType(); + // 2kg 초과 기체신고번호 + List idntfNumList = rq.getArcrftList().stream().filter(arcrft -> arcrft.getArcrftWghtCd() != ArcrftWghtCd.W250G_LOE && arcrft.getArcrftWghtCd() != ArcrftWghtCd.W250G_W2KG).map(BasLaancArcrftModel::getIdntfNum).collect(Collectors.toList()); + // 신고 여부 - 무게가 2kg 초과이거나 상업적일 경우 - true + boolean isReport = !idntfNumList.isEmpty() || isCommercial; + rs.setReport(isReport); + + // TODO start - 조종사 자격 및 기체보험 확인 + if (isReport) { + List pilotValidRqList = idntfNumList.stream().map(idntfNum -> { + // TODO 기체보험 확인, 조종사 자격 확인 + return PilotValidRq.builder() + .pilotci("조종사CI") + .declarationnum(idntfNum) + .build(); + }).collect(Collectors.toList()); + + List pilotValidRsList = tsService.callPilotValid(pilotValidRqList); + if (pilotValidRsList.isEmpty()) { + rs.setPilotQlfc(false); + rs.setArcrftInsurance(false); + } else { + rs.setPilotValidRsList(pilotValidRsList); + rs.setPilotQlfc(pilotValidRsList.stream().allMatch(pilotValidRs -> "Y".equals(pilotValidRs.getPilotcredentialyn()))); + rs.setArcrftInsurance(pilotValidRsList.stream().allMatch(pilotValidRs -> "Y".equals(pilotValidRs.getArcrftinsuranceyn()))); + } } + // TODO end - 조종사 자격 및 기체보험 확인 -// BasLaancValidatedRs basLaancValidatedRs = this.validationPlanAreaAndArcrftAndAirspace(rq); + // 고도 150m 이하 - true + boolean isElev = rq.getAreaList().stream().anyMatch(area -> area.getFltElev() != null && Integer.parseInt(area.getFltElev()) <= 150); + rs.setElev(isElev); + // 기체중량 25kg 이하 + boolean isArcrftWeight = rq.getArcrftList().stream().anyMatch(arcrft -> arcrft.getArcrftWghtCd() != ArcrftWghtCd.W25KG_GO && arcrft.getArcrftWghtCd() != ArcrftWghtCd.W25KG_GO_TEST); + rs.setArcrftWeight(isArcrftWeight); -// // TODO 조종사 자격 및 기체보험 확인 -// PilotValidRq pilotValidRq = PilotValidRq.builder() -// .pilotci("조종사CI") -// .declarationnum("기체신고번호") -// .build(); -// -// PilotValidRs pilotValidRs = tsService.callPilotValid(pilotValidRq); -// if (pilotValidRs == null) { -// basLaancValidatedRs.setPilotQlfcYn("N"); -// basLaancValidatedRs.setArcrftInsuranceYn("N"); -// } else { -// basLaancValidatedRs.setPilotQlfcYn(pilotValidRs.getPilotcredentialyn()); -// basLaancValidatedRs.setArcrftInsuranceYn(pilotValidRs.getArcrftinsuranceyn()); -// } + // 비행구역 중복여부, 기체 중복여부, 판단구역 - 공역과 겹칠 경우, 비행가능여부 + BasLaancValidatedRs validationPlanRs = this.validationPlanAreaAndArcrftAndAirspace(rq); + BasLaancMapper.MAPPER.merge(rs, validationPlanRs); - return basLaancValidatedRs; + return rs; } // 비행계획서 등록, 약관 등록, 공문 생성 @Transactional public BasLaancLastRs createFlightPlan(BasLaancPlanRq rq) { - BasLaancValidatedRs basLaancValidatedRs = this.validationPlanAreaAndArcrftAndAirspace(rq); + BasLaancValidatedRs basLaancValidatedRs = rq.getValidatedRs(); + + BasLaancValidatedRs validatedRs = this.validationPlanAreaAndArcrftAndAirspace(rq); + BasLaancMapper.MAPPER.merge(basLaancValidatedRs, validatedRs); // LAANC가 검증된것들만 DB저장 - if (!basLaancValidatedRs.isValid()) new CustomException(ErrorCode.PLAN_DATA_DUPLICATE); + if (!basLaancValidatedRs.isValid()) throw new CustomException(ErrorCode.PLAN_DATA_DUPLICATE); // 비행계획서 @@ -124,7 +136,7 @@ public class BasLaancService { FltPlanBas fltPlanBas = BasLaancMapper.MAPPER.modelToPlanEntity(cstmrInfo); FltPlanBas rqFltPlanBas = BasLaancMapper.MAPPER.modelToPlanEntity(rq); - BasLaancMapper.MAPPER.mergeToEntity(fltPlanBas, rqFltPlanBas); + BasLaancMapper.MAPPER.merge(fltPlanBas, rqFltPlanBas); fltPlanBas.setDelYn("N"); fltPlanBas.setAprvlYn("Y"); fltPlanBas.setAprvlDt(Instant.now()); @@ -187,7 +199,7 @@ public class BasLaancService { arcrftEntity.setCreateUserId(userId); arcrftEntity.setUpdateUserId(userId); // 추가 필드 - arcrftEntity.setAcrftInsuranceYn(rq.getValidatedRs().getArcrftInsuranceYn()); // 보험여부 + arcrftEntity.setAcrftInsuranceYn(rq.getValidatedRs().isArcrftInsurance() ? "Y" : "N"); // 보험여부 // arcrftEntity.setInsuranceExperiod(null); // 보헌 유효기간 // arcrftEntity.setCorporationNm(null); // 법인명 fltPlanArcrftRepository.save(arcrftEntity); @@ -232,12 +244,10 @@ public class BasLaancService { // 초기화 BasLaancValidatedRs rs = BasLaancValidatedRs.builder() - .pilotQlfcYn("N") - .arcrftInsuranceYn("N") - .arcrftDuplicatedYn("N") - .planAreaDuplicatdYn("N") - .evaluatedTargetAreaYn("N") - .flightAreaYn("N") + .isPlanAreaDuplicatd(false) // 비행구역 중복여부 + .isArcrftDuplicated(false) // 기체 중복여부 + .isEvaluatedTargetArea(false) // 판단구역 - 공역과 겹칠 경우 + .isFlightArea(false) // 비행가능여부 .build(); @@ -303,7 +313,7 @@ public class BasLaancService { Geometry targetGeometry = areaUtils.coordinateToGeometry(targetBufferCoords); Geometry effectiveGeometry = areaUtils.coordinateToGeometry(effectiveCoordBufferList); if (targetGeometry.intersects(effectiveGeometry) && isEqualsFltElev) { - rs.setPlanAreaDuplicatdYn("Y"); + rs.setPlanAreaDuplicatd(true); } } } @@ -320,7 +330,7 @@ public class BasLaancService { ) ); if (isDuplicatedArcrft) { - rs.setArcrftDuplicatedYn("Y"); + rs.setArcrftDuplicated(true); } } } @@ -354,7 +364,7 @@ public class BasLaancService { // 평가 가능 지역 판단 boolean duplicatedAirspace = airspaceUtils.isDuplicatedAirspace(featureInfo); - rs.setEvaluatedTargetAreaYn(duplicatedAirspace ? "Y" : "N"); + rs.setEvaluatedTargetArea(duplicatedAirspace); // 비행 가능 지역 판단 // if (duplicatedAirspace) { @@ -366,7 +376,7 @@ public class BasLaancService { // 비행 가능 지역 판단 boolean validLaancAirspace = airspaceUtils.isValidLaancAirspace(featureInfo); - rs.setFlightAreaYn(validLaancAirspace ? "Y" : "N"); + rs.setFlightArea(validLaancAirspace); } return rs; diff --git a/pav-server/src/main/java/com/palnet/biz/api/external/model/PilotValidRs.java b/pav-server/src/main/java/com/palnet/biz/api/external/model/PilotValidRs.java index 80411e0e..092a5b82 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/external/model/PilotValidRs.java +++ b/pav-server/src/main/java/com/palnet/biz/api/external/model/PilotValidRs.java @@ -27,4 +27,5 @@ public class PilotValidRs { private String arcrftinsuranceyn; // 기체보험가입여부 private String arcrftdeclaration; // 기체신고여부 private String corpregyn; // 사업자유무 + private PilotValidRq rq; } diff --git a/pav-server/src/main/java/com/palnet/biz/api/external/service/TsService.java b/pav-server/src/main/java/com/palnet/biz/api/external/service/TsService.java index 3264ca3d..56f12f43 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/external/service/TsService.java +++ b/pav-server/src/main/java/com/palnet/biz/api/external/service/TsService.java @@ -6,6 +6,9 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import java.util.ArrayList; +import java.util.List; + /** * packageName : com.palnet.biz.api.external.service * fileName : TsService @@ -22,20 +25,25 @@ import org.springframework.stereotype.Service; @Service public class TsService { - public PilotValidRs callPilotValid(PilotValidRq rq) { + public List callPilotValid(List rqList) { // if(rq.getPilotci() == null || rq.getDeclarationnum() == null) { // return null; // } // TODO: call pilot valid api - + // RS 임시코드 - 추후 조건에 따른 TRUE/FALSE 처리 필요 - PilotValidRs pilotValidRs = new PilotValidRs(); - pilotValidRs.setRspCode("200"); - pilotValidRs.setRspMessage("success"); - pilotValidRs.setPilotcredentialyn("Y"); - pilotValidRs.setArcrftinsuranceyn("Y"); - pilotValidRs.setArcrftdeclaration("Y"); - pilotValidRs.setCorpregyn("Y"); - return pilotValidRs; - } + List rsList = new ArrayList<>(); + for (PilotValidRq rq : rqList) { + PilotValidRs pilotValidRs = new PilotValidRs(); + pilotValidRs.setRspCode("200"); + pilotValidRs.setRspMessage("success"); + pilotValidRs.setPilotcredentialyn("Y"); + pilotValidRs.setArcrftinsuranceyn("Y"); + pilotValidRs.setArcrftdeclaration("Y"); + pilotValidRs.setCorpregyn("Y"); + pilotValidRs.setRq(rq); + rsList.add(pilotValidRs); + } + return rsList; +} }