From d578d5d297d819c15ee053c2d6a425e03d0bd760 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?dhji=28=EC=A7=80=EB=8C=80=ED=95=9C=29?= Date: Fri, 22 Sep 2023 17:57:16 +0900 Subject: [PATCH] =?UTF-8?q?laanc=20=EC=83=88=EB=A1=9C=EC=9A=B4=20=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80=EC=97=90=20=EB=94=B0=EB=A5=B8=20api=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pav-server/build.gradle | 6 +- .../acnt/cstmr/model/AcntCstmrEmModel.java | 5 +- .../acnt/cstmr/model/AcntCstmrPwModel.java | 5 +- .../api/acnt/cstmr/model/AnctCstmrModel.java | 54 ++ .../acnt/cstmr/service/AcntCstmrService.java | 1 - .../bas/flight/service/BasFlightService.java | 12 +- .../laanc/controller/BasLaancController.java | 103 ++++ .../bas/laanc/model/BasLaancArcrftModel.java | 44 ++ .../laanc/model/BasLaancAreaCoordModel.java | 16 + .../bas/laanc/model/BasLaancAreaModel.java | 25 + .../model/BasLaancLastRs.java} | 5 +- .../bas/laanc/model/BasLaancPilotModel.java | 27 + .../api/bas/laanc/model/BasLaancPlanRq.java | 30 + .../model/BasLaancValidatedRs.java} | 5 +- .../api/bas/laanc/service/BasLaancMapper.java | 43 ++ .../bas/laanc/service/BasLaancService.java | 328 +++++++++++ .../flt/FltPlanArcrftRepository.java | 5 +- .../repository/flt/FltPlanAreaRepository.java | 2 + .../repository/flt/FltPlanBasRepository.java | 34 +- .../pty/PtyCstmrQueryRepository.java | 552 ++++++++++-------- .../com/palnet/comn/utils/AirspaceUtils.java | 5 + .../java/com/palnet/comn/utils/AreaUtils.java | 8 + 22 files changed, 1021 insertions(+), 294 deletions(-) create mode 100644 pav-server/src/main/java/com/palnet/biz/api/acnt/cstmr/model/AnctCstmrModel.java create mode 100644 pav-server/src/main/java/com/palnet/biz/api/bas/laanc/controller/BasLaancController.java create mode 100644 pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancArcrftModel.java create mode 100644 pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancAreaCoordModel.java create mode 100644 pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancAreaModel.java rename pav-server/src/main/java/com/palnet/biz/api/bas/{flight/model/BasFlightPlanCreateRs.java => laanc/model/BasLaancLastRs.java} (81%) create mode 100644 pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancPilotModel.java create mode 100644 pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancPlanRq.java rename pav-server/src/main/java/com/palnet/biz/api/bas/{flight/model/BasFlightPlanLaancRs.java => laanc/model/BasLaancValidatedRs.java} (95%) create mode 100644 pav-server/src/main/java/com/palnet/biz/api/bas/laanc/service/BasLaancMapper.java create mode 100644 pav-server/src/main/java/com/palnet/biz/api/bas/laanc/service/BasLaancService.java diff --git a/pav-server/build.gradle b/pav-server/build.gradle index 2f3f76be..25d04446 100644 --- a/pav-server/build.gradle +++ b/pav-server/build.gradle @@ -63,11 +63,11 @@ dependencies { implementation 'org.springframework.cloud:spring-cloud-aws-autoconfigure:2.0.1.RELEASE' // lombok, mapstruct - implementation 'org.mapstruct:mapstruct:1.5.5.Final' - implementation 'org.projectlombok:lombok:1.18.28' + compileOnly 'org.projectlombok:lombok:1.18.28' + annotationProcessor 'org.projectlombok:lombok:1.18.28' + implementation 'org.mapstruct:mapstruct:1.5.5.Final' annotationProcessor 'org.mapstruct:mapstruct-processor:1.5.5.Final' - annotationProcessor 'org.projectlombok:lombok:1.18.28' annotationProcessor 'org.projectlombok:lombok-mapstruct-binding:0.2.0' // querydsl - jpa diff --git a/pav-server/src/main/java/com/palnet/biz/api/acnt/cstmr/model/AcntCstmrEmModel.java b/pav-server/src/main/java/com/palnet/biz/api/acnt/cstmr/model/AcntCstmrEmModel.java index 4b550195..e433794f 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/acnt/cstmr/model/AcntCstmrEmModel.java +++ b/pav-server/src/main/java/com/palnet/biz/api/acnt/cstmr/model/AcntCstmrEmModel.java @@ -1,10 +1,9 @@ package com.palnet.biz.api.acnt.cstmr.model; -import java.time.Instant; -import java.util.Date; - import lombok.Data; +import java.time.Instant; + @Data public class AcntCstmrEmModel { diff --git a/pav-server/src/main/java/com/palnet/biz/api/acnt/cstmr/model/AcntCstmrPwModel.java b/pav-server/src/main/java/com/palnet/biz/api/acnt/cstmr/model/AcntCstmrPwModel.java index b9c22720..6d7de776 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/acnt/cstmr/model/AcntCstmrPwModel.java +++ b/pav-server/src/main/java/com/palnet/biz/api/acnt/cstmr/model/AcntCstmrPwModel.java @@ -1,10 +1,9 @@ package com.palnet.biz.api.acnt.cstmr.model; -import java.time.Instant; -import java.util.Date; - import lombok.Data; +import java.time.Instant; + @Data public class AcntCstmrPwModel { diff --git a/pav-server/src/main/java/com/palnet/biz/api/acnt/cstmr/model/AnctCstmrModel.java b/pav-server/src/main/java/com/palnet/biz/api/acnt/cstmr/model/AnctCstmrModel.java new file mode 100644 index 00000000..60b2b009 --- /dev/null +++ b/pav-server/src/main/java/com/palnet/biz/api/acnt/cstmr/model/AnctCstmrModel.java @@ -0,0 +1,54 @@ +package com.palnet.biz.api.acnt.cstmr.model; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.time.Instant; + +/** + * packageName : com.palnet.biz.api.acnt.cstmr.model + * fileName : AnctCstmrModel + * author : dhji + * date : 2023-09-22(022) + * description : + * =========================================================== + * DATE AUTHOR NOTE + * ----------------------------------------------------------- + * 2023-09-22(022) dhji 최초 생성 + */ +@NoArgsConstructor +@AllArgsConstructor +@Builder +@Data +public class AnctCstmrModel { + private Integer cstmrSno; + private String authId; + private String cstmrDivCd; + private String cstmrStatusCd; + private Instant cstmrStatusCngDt; + private Instant joinDt; + private String joinIp; + private String memberDivCd; + private Instant pswdUpdtDt; + private String siteCode; + private String userId; + private String rfrshToken; + private String trmnlId; + private String addr; + private String addrDtlCn; + private Instant brthdyDate; + private String clncd; + private String cntryCd; + private String email; + private String genderCd; + private String hpno; + private String ipinCi; + private String ipinDi; + private String joinCrtfyCd; + private String memberName; + private Instant updateDt; + private String updateUserId; + private String zip; +} diff --git a/pav-server/src/main/java/com/palnet/biz/api/acnt/cstmr/service/AcntCstmrService.java b/pav-server/src/main/java/com/palnet/biz/api/acnt/cstmr/service/AcntCstmrService.java index e32f5b0e..0e86b920 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/acnt/cstmr/service/AcntCstmrService.java +++ b/pav-server/src/main/java/com/palnet/biz/api/acnt/cstmr/service/AcntCstmrService.java @@ -196,7 +196,6 @@ public class AcntCstmrService { for(AnctCstmerRlModel model : resultList) { model.setEmail(EncryptUtils.decrypt(model.getEmail())); -// model.setMemberName(EncryptUtils.decrypt(model.getMemberName())); model.setHpno(EncryptUtils.decrypt(model.getHpno())); } 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 8d0bdff1..06a21587 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 @@ -1,13 +1,10 @@ package com.palnet.biz.api.bas.flight.service; -import com.palnet.biz.api.acnt.cstmr.model.AnctCstmrTermsModel; 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.*; import com.palnet.biz.api.bas.group.model.BasGroupJoinModel; import com.palnet.biz.api.comn.model.ComnPagingRs; -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.repository.flt.*; @@ -17,10 +14,8 @@ import com.palnet.biz.scheduler.ctr.model.CtrTrnsLctnModel; import com.palnet.biz.scheduler.ctr.service.CtrTrnsLctnService; import com.palnet.comn.code.ErrorCode; import com.palnet.comn.exception.CustomException; -import com.palnet.comn.utils.AirspaceUtils; import com.palnet.comn.utils.AreaUtils; import com.palnet.comn.utils.EncryptUtils; -import com.palnet.comn.utils.HttpUtils; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; @@ -28,7 +23,6 @@ import org.json.simple.JSONObject; import org.json.simple.parser.JSONParser; import org.json.simple.parser.ParseException; import org.locationtech.jts.geom.Coordinate; -import org.locationtech.jts.geom.Geometry; import org.springframework.data.domain.PageImpl; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; @@ -43,7 +37,6 @@ import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.net.URLEncoder; -import java.time.Instant; import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -167,13 +160,18 @@ public class BasFlightService { for (BasFlightPlanModel plan : effectivePlanList) { effectivePlanArea.addAll(plan.getAreaList()); } + + // TODO - 확인필요 - 특정 area에서만 고도가 같고 다른 area에서 고도가 다를 경우에 이슈가 생길수 있다 판단됨 for (BasFlightPlanAreaModel area : effectivePlanArea) { if (rqFltElev.equals(area.getFltElev())) isEqualsFltElev = true; } List effectivePlanCount = fltPlanQueryRepository.CoordCount(rq); + + // TODO - 확인필요 - 동일한 비행계획서는 체크되면 안되지만 다른 비행계획서는 판단해야기 때문에 return을 하면 안되는 것으로 보임 for (BasFlightPlanModel i : effectivePlanList) { if (rq.getPlanSno().equals(i.getPlanSno())) return; } + if (effectivePlanList != null && !effectivePlanList.isEmpty()) { plan: for (BasFlightPlanModel plan : effectivePlanList) { 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 new file mode 100644 index 00000000..86e51ca5 --- /dev/null +++ b/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/controller/BasLaancController.java @@ -0,0 +1,103 @@ +package com.palnet.biz.api.bas.laanc.controller; + +import com.palnet.biz.api.bas.flight.template.service.TemplateService; +import com.palnet.biz.api.bas.laanc.model.BasLaancPlanRq; +import com.palnet.biz.api.bas.laanc.model.BasLaancLastRs; +import com.palnet.biz.api.bas.laanc.model.BasLaancValidatedRs; +import com.palnet.biz.api.bas.laanc.service.BasLaancService; +import com.palnet.biz.api.comn.response.BasicResponse; +import com.palnet.biz.api.comn.response.ErrorResponse; +import com.palnet.biz.api.comn.response.SuccessResponse; +import com.palnet.comn.exception.CustomException; +import io.swagger.annotations.ApiOperation; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.HashMap; +import java.util.Map; + +/** + * packageName : com.palnet.biz.api.bas.laanc.controller + * fileName : BasLaancController + * author : dhji + * date : 2023-09-22(022) + * description : + * =========================================================== + * DATE AUTHOR NOTE + * ----------------------------------------------------------- + * 2023-09-22(022) dhji 최초 생성 + */ +@Slf4j +@Tag(name = "LAANC", description = "LAANC 관련 API") +@RequiredArgsConstructor +@RequestMapping(value = "/api/bas/laanc", produces = {MediaType.APPLICATION_JSON_VALUE}) +@RestController +public class BasLaancController { + + private final BasLaancService basLaancService; + private final TemplateService templateService; + + // LAANC 검증 + @PostMapping(value = "/plan/valid") + @ApiOperation(value = "LAANC 검증") + @Tag(name = "LAANC 검증", description = "LAANC 관련 API") + public ResponseEntity validationLaanc(BasLaancPlanRq rq) { + BasLaancValidatedRs rs = null; + try { + log.debug(">>> rq : {}", rq); + rs = basLaancService.validationLaanc(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()); + resultMap.put("errorMessage", e.getMessage()); + return ResponseEntity.ok().body(new SuccessResponse(resultMap)); + } 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<>(rs)); + } + + // 비행계획서 등록, 약관 등록, 공문 생성 + @PostMapping(value = "/plan/create") + @ApiOperation(value = "비행계획서 등록") + @Tag(name = "비행계획서", description = "비행계획서 관련 API") + public ResponseEntity createPlan(@RequestBody BasLaancPlanRq rq) { + BasLaancLastRs rs = null; + try { + rs = basLaancService.createFlightPlan(rq); + } catch (CustomException e) { + Map resultMap = new HashMap(); + 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); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body(new ErrorResponse("Server Error", "-1")); + + } + return ResponseEntity.ok().body(new SuccessResponse<>(rs)); + } + + @GetMapping("/laanc-pdf/download") + @Tag(name = "비행계획서", description = "비행계획서 관련 API") + @ApiOperation(value = "Laanc 공문 다운로드") + public void downloadPDF(int fileSno) { + + templateService.fileDownload(fileSno); + } +} diff --git a/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancArcrftModel.java b/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancArcrftModel.java new file mode 100644 index 00000000..8ef957d8 --- /dev/null +++ b/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancArcrftModel.java @@ -0,0 +1,44 @@ +package com.palnet.biz.api.bas.laanc.model; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.palnet.biz.config.convert.InstantDateStrSerializer; +import lombok.Data; + +import java.time.Instant; + +@Data +public class BasLaancArcrftModel { + private Integer planArcrftSno; + private Integer planSno; + private Integer arcrftSno; + private String idntfNum; + private String groupNm; + private String prdctNum; + private String arcrftTypeCd; + private String arcrftModelNm; + private String prdctCmpnNm; + @JsonSerialize(using = InstantDateStrSerializer.class) + private Instant prdctDate; + private double arcrftLngth; + private double arcrftWdth; + private double arcrftHght; + private double arcrftWght; + private String wghtTypeCd; + private String imageUrl; + private double takeoffWght; + private String useYn; + private String cameraYn; + private String insrncYn; + private String ownerNm; + private String createUserId; + private Instant createDt; + private String updateUserId; + private Instant updateDt; + private String docState = "R"; + private String idntfTypeCd; + // kac 추가 필드 + private String acrftInsuranceYn; + @JsonSerialize(using = InstantDateStrSerializer.class) + private Instant insuranceExperiod; + private String corporationNm; +} diff --git a/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancAreaCoordModel.java b/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancAreaCoordModel.java new file mode 100644 index 00000000..8bccb75b --- /dev/null +++ b/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancAreaCoordModel.java @@ -0,0 +1,16 @@ +package com.palnet.biz.api.bas.laanc.model; + +import lombok.Data; + +import java.time.Instant; + +@Data +public class BasLaancAreaCoordModel { + private Integer planAreaCoordSno; + private Integer planAreaSno; + private double lat; + private double lon; + private String createUserId; + private Instant createDt; + private String docState = "R"; +} diff --git a/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancAreaModel.java b/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancAreaModel.java new file mode 100644 index 00000000..c1522b79 --- /dev/null +++ b/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancAreaModel.java @@ -0,0 +1,25 @@ +package com.palnet.biz.api.bas.laanc.model; + +import lombok.Data; + +import java.time.Instant; +import java.util.List; + +@Data +public class BasLaancAreaModel { + private Integer planAreaSno; + private Integer planSno; + private String areaType; + private String fltMethod; + private Integer bufferZone; + private String fltElev; + private String createUserId; + private Instant createDt; + private String updateUserId; + private Instant updateDt; + private String docState = "R"; + private List coordList; + private List bufferCoordList; + // kac 추가 필드 + private String fltMothoeRm; +} diff --git a/pav-server/src/main/java/com/palnet/biz/api/bas/flight/model/BasFlightPlanCreateRs.java b/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancLastRs.java similarity index 81% rename from pav-server/src/main/java/com/palnet/biz/api/bas/flight/model/BasFlightPlanCreateRs.java rename to pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancLastRs.java index 7387a623..60c3c0b9 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/bas/flight/model/BasFlightPlanCreateRs.java +++ b/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancLastRs.java @@ -1,6 +1,5 @@ -package com.palnet.biz.api.bas.flight.model; +package com.palnet.biz.api.bas.laanc.model; -import com.fasterxml.jackson.annotation.JsonIgnore; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -21,6 +20,6 @@ import lombok.NoArgsConstructor; @Builder @NoArgsConstructor @AllArgsConstructor -public class BasFlightPlanCreateRs { +public class BasLaancLastRs { private String pdfUrl; } diff --git a/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancPilotModel.java b/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancPilotModel.java new file mode 100644 index 00000000..662cc330 --- /dev/null +++ b/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancPilotModel.java @@ -0,0 +1,27 @@ +package com.palnet.biz.api.bas.laanc.model; + +import lombok.Data; + +import java.time.Instant; + +@Data +public class BasLaancPilotModel { + private Integer planPilotSno; + private Integer planSno; + private Integer cstmrSno; + private String groupNm; + private String memberName; + private String email; + private String hpno; + private String clncd; + private String addr; + private String addrDtlCn; + private String zip; + private String qlfcNo; + private String carrer; + private String createUserId; + private Instant createDt; + private String updateUserId; + private Instant updateDt; + private String docState = "R"; +} diff --git a/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancPlanRq.java b/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancPlanRq.java new file mode 100644 index 00000000..6f45e252 --- /dev/null +++ b/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancPlanRq.java @@ -0,0 +1,30 @@ +package com.palnet.biz.api.bas.laanc.model; + +import com.palnet.biz.api.acnt.cstmr.model.AnctCstmrTermsModel; +import lombok.Data; + +import java.time.Instant; +import java.util.List; + +@Data +public class BasLaancPlanRq { + private Integer planSno; + private Integer cstmrSno; + private String memberName; + private Instant schFltStDt; + private Instant schFltEndDt; + private String fltPurpose; + + private String corpRegYn; + private String serviceType; + + private String docState = "R"; + private List areaList; + // private List pilotList; + private List arcrftList; + + // laanc 정보 + private BasLaancValidatedRs validatedRs; + // 약관동의 + private List terms; +} 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/laanc/model/BasLaancValidatedRs.java similarity index 95% rename from pav-server/src/main/java/com/palnet/biz/api/bas/flight/model/BasFlightPlanLaancRs.java rename to pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancValidatedRs.java index 79c8605c..9a35f42b 100644 --- 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/laanc/model/BasLaancValidatedRs.java @@ -1,4 +1,4 @@ -package com.palnet.biz.api.bas.flight.model; +package com.palnet.biz.api.bas.laanc.model; import com.fasterxml.jackson.annotation.JsonIgnore; import lombok.AllArgsConstructor; @@ -21,7 +21,8 @@ import lombok.NoArgsConstructor; @Builder @NoArgsConstructor @AllArgsConstructor -public class BasFlightPlanLaancRs { +public class BasLaancValidatedRs { + private String pilotQlfcYn; // 자격여부 private String acrftInsuranceYn; // 항공기보험여부 private String acrftDuplicatedYn; // 기체 중복여부 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 new file mode 100644 index 00000000..cc741423 --- /dev/null +++ b/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/service/BasLaancMapper.java @@ -0,0 +1,43 @@ +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.jpa.entity.*; +import org.mapstruct.Mapper; +import org.mapstruct.MappingTarget; +import org.mapstruct.ReportingPolicy; +import org.mapstruct.factory.Mappers; + +/** + * packageName : com.palnet.biz.api.bas.laanc.service + * fileName : BasLaancMapper + * author : dhji + * date : 2023-09-22(022) + * description : + * =========================================================== + * DATE AUTHOR NOTE + * ----------------------------------------------------------- + * 2023-09-22(022) dhji 최초 생성 + */ +@Mapper(unmappedSourcePolicy = ReportingPolicy.IGNORE, unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface BasLaancMapper { + BasLaancMapper MAPPER = Mappers.getMapper(BasLaancMapper.class); + + FltPlanBas mergeToEntity(@MappingTarget FltPlanBas rq1, FltPlanBas rq2); + + FltPlanBas modelToPlanEntity(AnctCstmrModel rq); + + FltPlanBas modelToPlanEntity(BasLaancPlanRq rq); + + FltPlanArea modelToPlanEntity(BasLaancAreaModel rq); + + FltPlanAreaCoord modelToPlanEntity(BasLaancAreaCoordModel rq); + + FltPlanArcrft modelToPlanEntity(BasLaancArcrftModel rq); + + FltPlanPilot modelToPilotEntity(AnctCstmrModel rq); + +} 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 new file mode 100644 index 00000000..f47d1cd4 --- /dev/null +++ b/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/service/BasLaancService.java @@ -0,0 +1,328 @@ +package com.palnet.biz.api.bas.laanc.service; + +import com.palnet.biz.api.acnt.cstmr.model.AnctCstmrModel; +import com.palnet.biz.api.acnt.cstmr.model.AnctCstmrTermsModel; +import com.palnet.biz.api.acnt.jwt.utils.JwtTokenUtil; +import com.palnet.biz.api.bas.laanc.model.*; +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.repository.flt.*; +import com.palnet.biz.jpa.repository.pty.PtyCstmrQueryRepository; +import com.palnet.biz.jpa.repository.pty.PtyGroupQueryRepository; +import com.palnet.biz.jpa.repository.pty.PtyTermsAgreeTxnRepository; +import com.palnet.biz.scheduler.ctr.service.CtrTrnsLctnService; +import com.palnet.comn.code.ErrorCode; +import com.palnet.comn.exception.CustomException; +import com.palnet.comn.utils.AirspaceUtils; +import com.palnet.comn.utils.AreaUtils; +import com.palnet.comn.utils.HttpUtils; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.locationtech.jts.geom.Coordinate; +import org.locationtech.jts.geom.Geometry; +import org.springframework.stereotype.Service; + +import java.time.Instant; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +/** + * packageName : com.palnet.biz.api.bas.laanc.service + * fileName : BasLaancService + * author : dhji + * date : 2023-09-22(022) + * description : + * =========================================================== + * DATE AUTHOR NOTE + * ----------------------------------------------------------- + * 2023-09-22(022) dhji 최초 생성 + */ +@Slf4j +@RequiredArgsConstructor +@Service +public class BasLaancService { + + + private final CtrTrnsLctnService ctrTrnsLctnService; + private final FltPlanBasRepository fltPlanBasRepository; + private final FltPlanArcrftRepository fltPlanArcrftRepository; + private final FltPlanAreaRepository fltPlanAreaRepository; + private final FltPlanAreaCoordRepository fltPlanAreaCoordRepository; + private final FltPlanPilotRepository fltPlanPilotRepository; + private final FltPlanQueryRepository fltPlanQueryRepository; + private final PtyGroupQueryRepository ptyPlanQueryRepository; + private final PtyCstmrQueryRepository ptyCstmrQueryRepository; + private final PtyTermsAgreeTxnRepository ptyTermsAgreeTxnRepository; + private final TsService tsService; + private final JwtTokenUtil jwtTokenUtil; + private final AreaUtils areaUtils; + + + // LAANC 검증 + public BasLaancValidatedRs validationLaanc(BasLaancPlanRq rq) { + BasLaancValidatedRs basLaancValidatedRs = this.validationAreaAndArcrft(rq); + + + // TODO 조종사 자격 및 기체보험 확인 + PilotValidRq pilotValidRq = PilotValidRq.builder() + .pilotci("조종사CI") + .declarationnum("기체신고번호") + .build(); + + PilotValidRs pilotValidRs = tsService.callPilotValid(pilotValidRq); + if (pilotValidRs == null) { + basLaancValidatedRs.setPilotQlfcYn("N"); + basLaancValidatedRs.setAcrftInsuranceYn("N"); + basLaancValidatedRs.setCorpRegYn("N"); + } else { + basLaancValidatedRs.setPilotQlfcYn(pilotValidRs.getPilotcredentialyn()); + basLaancValidatedRs.setAcrftInsuranceYn(pilotValidRs.getArcrftinsuranceyn()); + basLaancValidatedRs.setCorpRegYn(pilotValidRs.getCorpregyn()); + } + + return basLaancValidatedRs; + + } + + // 비행계획서 등록, 약관 등록, 공문 생성 + public BasLaancLastRs createFlightPlan(BasLaancPlanRq rq) { + BasLaancValidatedRs basLaancValidatedRs = this.validationAreaAndArcrft(rq); + // LAANC가 검증된것들만 DB저장 + if (!basLaancValidatedRs.isValidAirspace()) new CustomException(ErrorCode.PLAN_DATA_DUPLICATE); + + + // 비행계획서 - // TODO 작성자 정보 불러와서 넣기 + String userId = jwtTokenUtil.getUserIdByToken(); + Integer cstmrSno = jwtTokenUtil.getCstmrSnoByToken(); + // 개인정보 가져오기 - 비행계획서 작성자 정보, 조종사 정보 + AnctCstmrModel cstmrInfo = ptyCstmrQueryRepository.findByCstmrSno(cstmrSno); + FltPlanBas cstmrFltPlanBas = BasLaancMapper.MAPPER.modelToPlanEntity(cstmrInfo); + FltPlanBas rqFltPlanBas = BasLaancMapper.MAPPER.modelToPlanEntity(rq); + + FltPlanBas fltPlanBas = BasLaancMapper.MAPPER.mergeToEntity(rqFltPlanBas, cstmrFltPlanBas); + fltPlanBas.setDelYn("N"); + fltPlanBas.setAprvlYn("N"); + fltPlanBas.setCreateUserId(userId); + fltPlanBas.setUpdateUserId(userId); + // 사업자 유무 - TS 데이터 + fltPlanBas.setCorpRegYn(rq.getValidatedRs().getCorpRegYn()); // 사업자유무 + fltPlanBas.setServiceType("PAV-KAC"); + + FltPlanBas rBasEntity = fltPlanBasRepository.save(fltPlanBas); + Integer planSno = rBasEntity.getPlanSno(); + // 비행구역 + List basLaancAreaModelList = rq.getAreaList(); + if (basLaancAreaModelList != null && !basLaancAreaModelList.isEmpty()) { + for (BasLaancAreaModel laancAreaModel : basLaancAreaModelList) { + FltPlanArea areaEntity = BasLaancMapper.MAPPER.modelToPlanEntity(laancAreaModel); + areaEntity.setPlanSno(planSno); + areaEntity.setCreateUserId(userId); + areaEntity.setUpdateUserId(userId); + + FltPlanArea rAreaEntity = fltPlanAreaRepository.save(areaEntity); + Integer planAreaSno = rAreaEntity.getPlanAreaSno(); + List laancAreaModelCoordList = laancAreaModel.getCoordList(); + if (laancAreaModelCoordList != null && !laancAreaModelCoordList.isEmpty()) { + for (BasLaancAreaCoordModel basLaancAreaCoordModel : laancAreaModelCoordList) { + FltPlanAreaCoord coordEntity = BasLaancMapper.MAPPER.modelToPlanEntity(basLaancAreaCoordModel); + coordEntity.setPlanAreaSno(planAreaSno); + coordEntity.setCreateUserId(userId); + fltPlanAreaCoordRepository.save(coordEntity); + } + } + } + } + + // 조종사 - 사용자 정보로 저장 + FltPlanPilot pilotEntity = BasLaancMapper.MAPPER.modelToPilotEntity(cstmrInfo); + pilotEntity.setPlanSno(planSno); + pilotEntity.setCreateUserId(userId); + pilotEntity.setUpdateUserId(userId); + fltPlanPilotRepository.save(pilotEntity); + + + // 기체 + List basLaancArcrftModelList = rq.getArcrftList(); + if (basLaancArcrftModelList != null && !basLaancArcrftModelList.isEmpty()) { + for (BasLaancArcrftModel basLaancArcrftModel : basLaancArcrftModelList) { + FltPlanArcrft arcrftEntity = BasLaancMapper.MAPPER.modelToPlanEntity(basLaancArcrftModel); + arcrftEntity.setPlanSno(planSno); + arcrftEntity.setCreateUserId(userId); + arcrftEntity.setUpdateUserId(userId); + // 추가 필드 + arcrftEntity.setAcrftInsuranceYn(rq.getValidatedRs().getAcrftInsuranceYn()); // 보험여부 +// arcrftEntity.setInsuranceExperiod(null); // 보헌 유효기간 +// arcrftEntity.setCorporationNm(null); // 법인명 + fltPlanArcrftRepository.save(arcrftEntity); + } + } + // 약관 저장 + if (rq.getTerms() != null && !rq.getTerms().isEmpty()) { + for (AnctCstmrTermsModel agree : rq.getTerms()) { + PtyTermsAgreeTxn agreeEntity = new PtyTermsAgreeTxn(); + agreeEntity.setCstmrSno(fltPlanBas.getCstmrSno()); + agreeEntity.setProcIp(HttpUtils.getRequestIp()); + agreeEntity.setTermsSno(agree.getTermsSno()); + agreeEntity.setUpdateDt(Instant.now()); + agreeEntity.setUpdateUserId(userId); + agreeEntity.setAgreeYn(agree.getAgreeYn()); + if (agree.getAgreeYn().equals("Y")) { + agreeEntity.setAgreeDt(Instant.now()); + } + ptyTermsAgreeTxnRepository.save(agreeEntity); + } + } else { + throw new CustomException(ErrorCode.FAIL, "약관등록 실패"); + } + // TODO PDF 생성 후 URL 가져오기 + BasLaancLastRs rs = BasLaancLastRs.builder() + .pdfUrl("....") + .build(); + return rs; + } + + // LAANC 검증 및 기체 중복 확인 + private BasLaancValidatedRs validationAreaAndArcrft(BasLaancPlanRq rq) { + + // 초기화 + BasLaancValidatedRs rs = BasLaancValidatedRs.builder() + .pilotQlfcYn("N") + .acrftInsuranceYn("N") + .acrftDuplicatedYn("N") + .planAreaDuplicatdYn("N") + .evaluatedTargetAreaYn("N") + .flightAreaYn("N") + .build(); + + + // 비행계획서 + List fltPlanBasList = fltPlanBasRepository.findBySchFltStDtGreaterThanEqualAndSchFltEndDtLessThanEqualAndDelYn(rq.getSchFltEndDt(), rq.getSchFltStDt(), "N"); + if (fltPlanBasList != null && !fltPlanBasList.isEmpty()) { + + if (rq.getPlanSno() != null) { + // 동일한 비행계획서는 검증에서 제외 처리 + fltPlanBasList = fltPlanBasList.stream().filter(fltPlanBas -> !rq.getPlanSno().equals(fltPlanBas.getPlanSno())).collect(Collectors.toList()); + } + + // 비행계획서 planSno 모음 + List planSnoList = fltPlanBasList.stream().map(FltPlanBas::getPlanSno).collect(Collectors.toList()); + + // 지역 +// List fltPlanAreaList = fltPlanAreaRepository.findByPlanSnoIn(planSnoList); + + for (FltPlanBas fltPlanBas : fltPlanBasList) { + // 1. 구역조회 + List fltPlanAreaList = fltPlanAreaRepository.findByPlanSnoOrderByPlanAreaSnoAsc(fltPlanBas.getPlanSno()); + + // 2. 좌표 조회 -> 영역 포함 여부 확인 + for (FltPlanArea fltPlanArea : fltPlanAreaList) { + String effectiveFltElev = fltPlanArea.getFltElev(); + List fltPlanAreaCoordList = fltPlanAreaCoordRepository.findByPlanAreaSnoOrderByPlanAreaCoordSnoAsc(fltPlanArea.getPlanAreaSno()); + if (fltPlanAreaCoordList == null || fltPlanAreaCoordList.isEmpty()) continue; + + // 2-1 영역 좌표 + List effectiveCoordList = fltPlanAreaCoordList.stream().map(fltPlanAreaCoord -> new Coordinate(fltPlanAreaCoord.getLon(), fltPlanAreaCoord.getLat())).collect(Collectors.toList()); + List effectiveCoordBufferList = new ArrayList<>(); + // Query에서 조회한 좌표로 버퍼좌표 생성 + if ("LINE".equals(fltPlanArea.getAreaType())) { + List trans = areaUtils.transform(effectiveCoordList, "EPSG:4326", "EPSG:5181"); + List bufferList = areaUtils.buffer(trans, fltPlanArea.getBufferZone()); + effectiveCoordBufferList = areaUtils.transform(bufferList, "EPSG:5181", "EPSG:4326"); + } + if ("POLYGON".equals(fltPlanArea.getAreaType())) { + effectiveCoordBufferList.addAll(effectiveCoordList); + } + if ("CIRCLE".equals(fltPlanArea.getAreaType())) { + effectiveCoordBufferList = areaUtils.createCircle(effectiveCoordList.get(0), fltPlanArea.getBufferZone()); + } + + for (BasLaancAreaModel basLaancAreaModel : rq.getAreaList()) { + String targetFltElev = basLaancAreaModel.getFltElev(); + // TODO 추후 특정 고도 범위 확인 + boolean isEqualsFltElev = effectiveFltElev.equals(targetFltElev); + //rq로 들어온 좌표로 버퍼좌표 생성 + List targetCoords = basLaancAreaModel.getCoordList().stream().map(coord -> new Coordinate(coord.getLon(), coord.getLat())).collect(Collectors.toList()); + List targetBufferCoords = new ArrayList<>(); + if ("LINE".equals(basLaancAreaModel.getAreaType())) { + List trans = areaUtils.transform(targetCoords, "EPSG:4326", "EPSG:5181"); + List bufferList = areaUtils.buffer(trans, fltPlanArea.getBufferZone()); + targetBufferCoords = areaUtils.transform(bufferList, "EPSG:5181", "EPSG:4326"); + } else if ("POLYGON".equals(basLaancAreaModel.getAreaType())) { + targetBufferCoords.addAll(targetCoords); + } else if ("CIRCLE".equals(basLaancAreaModel.getAreaType())) { + targetBufferCoords = areaUtils.createCircle(targetCoords.get(0), fltPlanArea.getBufferZone()); + } + + // 검증 + Geometry targetGeometry = areaUtils.coordinateToGeometry(targetBufferCoords); + Geometry effectiveGeometry = areaUtils.coordinateToGeometry(effectiveCoordBufferList); + if (targetGeometry.intersects(effectiveGeometry) && isEqualsFltElev) { + rs.setPlanAreaDuplicatdYn("Y"); + } + } + } + } + + // 기체 중복 여부 확인 + List arcrftList = rq.getArcrftList(); + if (arcrftList != null && !arcrftList.isEmpty()) { + List fltPlanArcrftList = fltPlanArcrftRepository.findByPlanSnoIn(planSnoList); + if (fltPlanArcrftList != null && !fltPlanArcrftList.isEmpty()) { + boolean isDuplicatedArcrft = arcrftList.stream().anyMatch(arcrft -> + fltPlanArcrftList.stream().anyMatch(fltPlanArcrft -> + arcrft.getIdntfNum().equals(fltPlanArcrft.getIdntfNum()) + ) + ); + if (isDuplicatedArcrft) { + rs.setAcrftDuplicatedYn("Y"); + } + } + } + + } + + // 공역 중복 확인 + for (BasLaancAreaModel basLaancAreaModel : rq.getAreaList()) { + List rqCoord = new ArrayList<>(); + List rqCoordBufferList = new ArrayList<>(); + + //rq로 들어온 좌표로 버퍼좌표 생성 + for (BasLaancAreaCoordModel basLaancAreaCoordModel : basLaancAreaModel.getCoordList()) { + Coordinate coords = new Coordinate(basLaancAreaCoordModel.getLon(), basLaancAreaCoordModel.getLat()); + rqCoord.add(coords); + } + if ("LINE".equals(basLaancAreaModel.getAreaType())) { + List trans = areaUtils.transform(rqCoord, "EPSG:4326", "EPSG:5181"); + List bufferList = areaUtils.buffer(trans, basLaancAreaModel.getBufferZone()); + rqCoordBufferList = areaUtils.transform(bufferList, "EPSG:5181", "EPSG:4326"); + } else if ("POLYGON".equals(basLaancAreaModel.getAreaType())) { + rqCoordBufferList.addAll(rqCoord); + } else if ("CIRCLE".equals(basLaancAreaModel.getAreaType())) { + rqCoordBufferList = areaUtils.createCircle(rqCoord.get(0), basLaancAreaModel.getBufferZone()); + } + + AirspaceUtils airspaceUtils = AirspaceUtils.getInstance(); + Geometry rqGeometry = airspaceUtils.createGeometryByCoordinate(rqCoordBufferList); + Integer fltElev = basLaancAreaModel.getFltElev() != null ? Integer.valueOf(basLaancAreaModel.getFltElev()) : 0; + AirspaceUtils.FeatureInfo featureInfo = new AirspaceUtils.FeatureInfo(null, null, 0, fltElev, rqGeometry); + + // 평가 가능 지역 판단 + boolean duplicatedAirspace = airspaceUtils.isDuplicatedAirspace(featureInfo); + rs.setEvaluatedTargetAreaYn(duplicatedAirspace ? "Y" : "N"); + + // 비행 가능 지역 판단 + if (duplicatedAirspace) { + boolean validLaancAirspace = airspaceUtils.isValidLaancAirspace(featureInfo); + rs.setFlightAreaYn(validLaancAirspace ? "Y" : "N"); + } else { + rs.setFlightAreaYn("N"); + } + + } + return rs; + } + +} diff --git a/pav-server/src/main/java/com/palnet/biz/jpa/repository/flt/FltPlanArcrftRepository.java b/pav-server/src/main/java/com/palnet/biz/jpa/repository/flt/FltPlanArcrftRepository.java index fafab018..b4a1eeda 100644 --- a/pav-server/src/main/java/com/palnet/biz/jpa/repository/flt/FltPlanArcrftRepository.java +++ b/pav-server/src/main/java/com/palnet/biz/jpa/repository/flt/FltPlanArcrftRepository.java @@ -1,15 +1,14 @@ package com.palnet.biz.jpa.repository.flt; import com.palnet.biz.jpa.entity.FltPlanArcrft; -import com.palnet.biz.jpa.entity.FltPlanBas; - import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; +import java.util.Collection; import java.util.List; -import java.util.Optional; public interface FltPlanArcrftRepository extends JpaRepository { + List findByPlanSnoIn(Collection planSnos); List findByPlanSnoOrderByPlanArcrftSnoAsc(Integer planSno); @Query("select f from FltPlanArcrft f " + diff --git a/pav-server/src/main/java/com/palnet/biz/jpa/repository/flt/FltPlanAreaRepository.java b/pav-server/src/main/java/com/palnet/biz/jpa/repository/flt/FltPlanAreaRepository.java index d4d3b79f..98cb7304 100644 --- a/pav-server/src/main/java/com/palnet/biz/jpa/repository/flt/FltPlanAreaRepository.java +++ b/pav-server/src/main/java/com/palnet/biz/jpa/repository/flt/FltPlanAreaRepository.java @@ -5,9 +5,11 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; +import java.util.Collection; import java.util.List; public interface FltPlanAreaRepository extends JpaRepository { + List findByPlanSnoIn(Collection planSnos); List findByPlanSnoOrderByPlanAreaSnoAsc(Integer planSno); @Query(value = " select PLAN_AREA_SNO from FLT_PLAN_AREA " diff --git a/pav-server/src/main/java/com/palnet/biz/jpa/repository/flt/FltPlanBasRepository.java b/pav-server/src/main/java/com/palnet/biz/jpa/repository/flt/FltPlanBasRepository.java index 98258f3f..6fd29de4 100644 --- a/pav-server/src/main/java/com/palnet/biz/jpa/repository/flt/FltPlanBasRepository.java +++ b/pav-server/src/main/java/com/palnet/biz/jpa/repository/flt/FltPlanBasRepository.java @@ -14,13 +14,16 @@ import java.util.List; import java.util.Optional; public interface FltPlanBasRepository extends JpaRepository { - @Query("select f from FltPlanBas f " + - "where ((SCH_FLT_ST_DT <= :schFltStDt and SCH_FLT_END_DT >= :schFltEndDt)" - + "or (SCH_FLT_ST_DT >= :schFltStDt and (SCH_FLT_ST_DT <= :schFltEndDt and SCH_FLT_END_DT >= :schFltEndDt ))" - + "or ((SCH_FLT_ST_DT <= :schFltStDt and SCH_FLT_END_DT >= :schFltStDt) and SCH_FLT_END_DT <= :schFltEndDt)" - + "or (SCH_FLT_ST_DT >= :schFltStDt and SCH_FLT_END_DT <= :schFltEndDt)) and DEL_YN='N'") - List findByStartEndDate(@Param("schFltStDt") Date schFltStDt,@Param("schFltEndDt") Date schFltEndDt); - + + List findBySchFltStDtGreaterThanEqualAndSchFltEndDtLessThanEqualAndDelYn(Instant schFltStDt, Instant schFltEndDt, String delYn); + + @Query("select f from FltPlanBas f " + + "where ((SCH_FLT_ST_DT <= :schFltStDt and SCH_FLT_END_DT >= :schFltEndDt)" + + "or (SCH_FLT_ST_DT >= :schFltStDt and (SCH_FLT_ST_DT <= :schFltEndDt and SCH_FLT_END_DT >= :schFltEndDt ))" + + "or ((SCH_FLT_ST_DT <= :schFltStDt and SCH_FLT_END_DT >= :schFltStDt) and SCH_FLT_END_DT <= :schFltEndDt)" + + "or (SCH_FLT_ST_DT >= :schFltStDt and SCH_FLT_END_DT <= :schFltEndDt)) and DEL_YN='N'") + List findByStartEndDate(@Param("schFltStDt") Date schFltStDt, @Param("schFltEndDt") Date schFltEndDt); + @Query("select f from FltPlanBas f " + "where f.planSno = :planSno " + @@ -28,8 +31,8 @@ public interface FltPlanBasRepository extends JpaRepository "and f.schFltStDt <= :fltNowDt " + "and :fltNowDt <= f.schFltEndDt") Optional findByGroupFlightPlan(@Param("planSno") Integer planSno, - @Param("aprvlYn") String aprvlYn, - @Param("fltNowDt") Instant fltNowDt); + @Param("aprvlYn") String aprvlYn, + @Param("fltNowDt") Instant fltNowDt); @Transactional @Modifying @@ -40,11 +43,12 @@ public interface FltPlanBasRepository extends JpaRepository @Query("Select f from FltPlanBas f " + "where f.cstmrSno = :cstmrSno " + - "and f.aprvlYn = 'Y' " ) - List findByPlanSno(@Param("cstmrSno")int cstmrSno); - + "and f.aprvlYn = 'Y' ") + List findByPlanSno(@Param("cstmrSno") int cstmrSno); + @Query("Select f from FltPlanBas f " + - "where f.planSno = :planSno " + - "and f.aprvlYn = 'Y' " ) - List findBasList(@Param("planSno")int planSno); + "where f.planSno = :planSno " + + "and f.aprvlYn = 'Y' ") + List findBasList(@Param("planSno") int planSno); + } diff --git a/pav-server/src/main/java/com/palnet/biz/jpa/repository/pty/PtyCstmrQueryRepository.java b/pav-server/src/main/java/com/palnet/biz/jpa/repository/pty/PtyCstmrQueryRepository.java index 9f3e1bd3..0db20259 100644 --- a/pav-server/src/main/java/com/palnet/biz/jpa/repository/pty/PtyCstmrQueryRepository.java +++ b/pav-server/src/main/java/com/palnet/biz/jpa/repository/pty/PtyCstmrQueryRepository.java @@ -2,6 +2,7 @@ package com.palnet.biz.jpa.repository.pty; import com.palnet.biz.api.acnt.cstmr.model.AcntCstmrRqModel; import com.palnet.biz.api.acnt.cstmr.model.AnctCstmerRlModel; +import com.palnet.biz.api.acnt.cstmr.model.AnctCstmrModel; import com.palnet.biz.api.acnt.jwt.model.JwtGroupModel; import com.palnet.biz.api.acnt.jwt.model.JwtProfileRsModel; import com.palnet.biz.api.acnt.jwt.model.JwtUserModel; @@ -19,260 +20,303 @@ import java.util.List; @Log4j2 @Repository @RequiredArgsConstructor -public class PtyCstmrQueryRepository{ - - - private final JPAQueryFactory query; - - public boolean findCstmrByUserId(String userId){ - - boolean result = false; - - QPtyCstmrBas basEntity = QPtyCstmrBas.ptyCstmrBas; - - - BooleanBuilder builder = new BooleanBuilder(); - - builder.and(basEntity.cstmrStatusCd.eq("A")); //활성화 상태 - builder.and(basEntity.userId.eq(userId)); - - PtyCstmrBas entity = query.select(basEntity) - .from(basEntity) - .where(builder) - .fetchFirst(); - if(entity != null) { - result = true; - } - - return result; - } - public boolean certifNum(String name , String hpno) { - QPtyCstmrDtl dtl = QPtyCstmrDtl.ptyCstmrDtl; - - BooleanBuilder builder = new BooleanBuilder(); - builder.and(dtl.hpno.eq(hpno)); - builder.and(dtl.memberName.eq(name)); - - PtyCstmrDtl entity = query.select(dtl) - .from(dtl) - .where(builder) - .fetchFirst(); - boolean result = false; - if(entity != null) { - result = true; - } - return result; - } - - public String findUserId(String name , String hpno) { - QPtyCstmrBas bas = QPtyCstmrBas.ptyCstmrBas; - QPtyCstmrDtl dtl = QPtyCstmrDtl.ptyCstmrDtl; - - BooleanBuilder builder = new BooleanBuilder(); - builder.and(bas.cstmrStatusCd.eq("A")); - builder.and(dtl.hpno.eq(hpno)); - builder.and(dtl.memberName.eq(name)); - PtyCstmrBas entity = query.select(bas) - .from(bas) - .leftJoin(dtl) - .on(bas.cstmrSno.eq(dtl.cstmrSno)) - .where(builder) - .fetchFirst(); - - String userId = entity.getUserId(); - return userId; - } - public PtyCstmrBas findUserPw(String id , String hpno) { - QPtyCstmrBas bas = QPtyCstmrBas.ptyCstmrBas; - QPtyCstmrDtl dtl = QPtyCstmrDtl.ptyCstmrDtl; - - BooleanBuilder builder = new BooleanBuilder(); - builder.and(bas.cstmrStatusCd.eq("A")); - builder.and(dtl.hpno.eq(hpno)); - builder.and(bas.userId.eq(id)); - PtyCstmrBas entity = query.select(bas) - .from(bas) - .leftJoin(dtl) - .on(bas.cstmrSno.eq(dtl.cstmrSno)) - .where(builder) - .fetchFirst(); - - return entity; - } - - public boolean findCstmrByHpno(String hpno) { - boolean result = false; - - QPtyCstmrBas basEntity = QPtyCstmrBas.ptyCstmrBas; - QPtyCstmrDtl dtlEntity = QPtyCstmrDtl.ptyCstmrDtl; - - BooleanBuilder builder = new BooleanBuilder(); - builder.and(basEntity.cstmrStatusCd.eq("A")); //활성화 상태 - builder.and(dtlEntity.hpno.eq(hpno)); - - PtyCstmrBas entity = query.select(basEntity) - .from(basEntity) - .leftJoin(dtlEntity) - .on(basEntity.cstmrSno.eq(dtlEntity.cstmrSno)) - .where(builder) - .fetchFirst(); - if(entity != null) { - result = true; - } - return result; - - } - - public JwtUserModel findUserPassword(String userId) { - QPtyCstmrBas basEntity = QPtyCstmrBas.ptyCstmrBas; - QPtyCstmrGroup groupEntity = QPtyCstmrGroup.ptyCstmrGroup; - - BooleanBuilder builder = new BooleanBuilder(); - builder.and(basEntity.userId.eq(userId)); - - PtyCstmrBas entity = query.select(basEntity) - .from(basEntity) - .where(builder) - .fetchFirst(); - - List pcgEntityList = null; - if(entity != null){ - BooleanBuilder groupBuilder = new BooleanBuilder(); - groupBuilder.and(groupEntity.cstmrSno.eq(entity.getCstmrSno()) - .and(groupEntity.joinYn.eq("Y"))); - - pcgEntityList = query.select(groupEntity) - .from(groupEntity) - .where(groupBuilder) - .fetch(); - } - - - if(entity != null) { - JwtUserModel model = new JwtUserModel(); - model.setAuth(entity.getAuthId()); - model.setUserId(entity.getUserId()); - model.setCstmrSno(entity.getCstmrSno()); - model.setCstmrStatusCd(entity.getCstmrStatusCd()); - model.setUserPswd(entity.getUserPswd()); - if(pcgEntityList != null && !pcgEntityList.isEmpty()){ - List groupModelList = new ArrayList<>(); - for(PtyCstmrGroup pcgEntity : pcgEntityList){ - JwtGroupModel groupModel = new JwtGroupModel(); - groupModel.setGroupId(pcgEntity.getGroupId()); - groupModel.setGroupAuthCd(pcgEntity.getGroupAuthCd()); - groupModelList.add(groupModel); - } - model.setGroup(groupModelList); - } - - return model; - - }else { - return null; - } - - - } - - public JwtProfileRsModel findUserProfile(int cstmrSno) { - QPtyCstmrBas basEntity = QPtyCstmrBas.ptyCstmrBas; - QPtyCstmrDtl dtlEntity = QPtyCstmrDtl.ptyCstmrDtl; - - BooleanBuilder builder = new BooleanBuilder(); - builder.and(basEntity.cstmrSno.eq(cstmrSno)); - - - JwtProfileRsModel model = query.select(Projections.bean(JwtProfileRsModel.class , - basEntity.cstmrSno, - basEntity.userId, - basEntity.authId, - basEntity.trmnlId, - basEntity.siteCode, - dtlEntity.memberName - )) - .from(basEntity) - .leftJoin(dtlEntity) - .on(basEntity.cstmrSno.eq(dtlEntity.cstmrSno)) - .where(builder) - .fetchFirst(); - - return model; - - } - - public JwtUserModel findRefreshtoken(int cstmrSno , String refreshToken) { - QPtyCstmrBas basEntity = QPtyCstmrBas.ptyCstmrBas; - BooleanBuilder builder = new BooleanBuilder(); - builder.and(basEntity.cstmrSno.eq(cstmrSno)); - builder.and(basEntity.rfrshToken.eq(refreshToken)); - - PtyCstmrBas entity = query.select(basEntity) - .from(basEntity) - .where(builder) - .fetchFirst(); - if(entity != null) { - JwtUserModel model = new JwtUserModel(); - model.setAuth(entity.getAuthId()); - model.setUserId(entity.getUserId()); - model.setCstmrSno(entity.getCstmrSno()); - model.setCstmrStatusCd(entity.getCstmrStatusCd()); - model.setUserPswd(entity.getUserPswd()); - - return model; - - }else { - return null; - } - } - - public List list(int cstmrSno) { - QPtyCstmrBas bas = QPtyCstmrBas.ptyCstmrBas; - QPtyCstmrDtl dtl = QPtyCstmrDtl.ptyCstmrDtl; - - List list = query - .select(Projections.bean( - AnctCstmerRlModel.class, - dtl.memberName, - dtl.brthdyDate, - dtl.genderCd, - dtl.cntryCd, - dtl.email, - dtl.hpno, - dtl.updateDt, - bas.userId - )) - .from(bas) - .leftJoin(dtl) - .on(bas.cstmrSno.eq(dtl.cstmrSno)) - .where(bas.cstmrSno.eq(cstmrSno)) - .fetch(); - - return list; - } - - - - public AcntCstmrRqModel findpassword(String userId) { - QPtyCstmrBas basEntity = QPtyCstmrBas.ptyCstmrBas; - - BooleanBuilder builder = new BooleanBuilder(); - builder.and(basEntity.userId.eq(userId)); - - PtyCstmrBas entity = query.select(basEntity) - .from(basEntity) - .where(builder) - .fetchFirst(); - - if(entity != null) { - JwtUserModel model = new JwtUserModel(); - model.setCstmrSno(entity.getCstmrSno()); - model.setUserPswd(entity.getUserPswd()); - } - - return null; - } - +public class PtyCstmrQueryRepository { + + + private final JPAQueryFactory query; + + public boolean findCstmrByUserId(String userId) { + + boolean result = false; + + QPtyCstmrBas basEntity = QPtyCstmrBas.ptyCstmrBas; + + + BooleanBuilder builder = new BooleanBuilder(); + + builder.and(basEntity.cstmrStatusCd.eq("A")); //활성화 상태 + builder.and(basEntity.userId.eq(userId)); + + PtyCstmrBas entity = query.select(basEntity) + .from(basEntity) + .where(builder) + .fetchFirst(); + if (entity != null) { + result = true; + } + + return result; + } + + public boolean certifNum(String name, String hpno) { + QPtyCstmrDtl dtl = QPtyCstmrDtl.ptyCstmrDtl; + + BooleanBuilder builder = new BooleanBuilder(); + builder.and(dtl.hpno.eq(hpno)); + builder.and(dtl.memberName.eq(name)); + + PtyCstmrDtl entity = query.select(dtl) + .from(dtl) + .where(builder) + .fetchFirst(); + boolean result = false; + if (entity != null) { + result = true; + } + return result; + } + + public String findUserId(String name, String hpno) { + QPtyCstmrBas bas = QPtyCstmrBas.ptyCstmrBas; + QPtyCstmrDtl dtl = QPtyCstmrDtl.ptyCstmrDtl; + + BooleanBuilder builder = new BooleanBuilder(); + builder.and(bas.cstmrStatusCd.eq("A")); + builder.and(dtl.hpno.eq(hpno)); + builder.and(dtl.memberName.eq(name)); + PtyCstmrBas entity = query.select(bas) + .from(bas) + .leftJoin(dtl) + .on(bas.cstmrSno.eq(dtl.cstmrSno)) + .where(builder) + .fetchFirst(); + + String userId = entity.getUserId(); + return userId; + } + + public PtyCstmrBas findUserPw(String id, String hpno) { + QPtyCstmrBas bas = QPtyCstmrBas.ptyCstmrBas; + QPtyCstmrDtl dtl = QPtyCstmrDtl.ptyCstmrDtl; + + BooleanBuilder builder = new BooleanBuilder(); + builder.and(bas.cstmrStatusCd.eq("A")); + builder.and(dtl.hpno.eq(hpno)); + builder.and(bas.userId.eq(id)); + PtyCstmrBas entity = query.select(bas) + .from(bas) + .leftJoin(dtl) + .on(bas.cstmrSno.eq(dtl.cstmrSno)) + .where(builder) + .fetchFirst(); + + return entity; + } + + public boolean findCstmrByHpno(String hpno) { + boolean result = false; + + QPtyCstmrBas basEntity = QPtyCstmrBas.ptyCstmrBas; + QPtyCstmrDtl dtlEntity = QPtyCstmrDtl.ptyCstmrDtl; + + BooleanBuilder builder = new BooleanBuilder(); + builder.and(basEntity.cstmrStatusCd.eq("A")); //활성화 상태 + builder.and(dtlEntity.hpno.eq(hpno)); + + PtyCstmrBas entity = query.select(basEntity) + .from(basEntity) + .leftJoin(dtlEntity) + .on(basEntity.cstmrSno.eq(dtlEntity.cstmrSno)) + .where(builder) + .fetchFirst(); + if (entity != null) { + result = true; + } + return result; + + } + + public JwtUserModel findUserPassword(String userId) { + QPtyCstmrBas basEntity = QPtyCstmrBas.ptyCstmrBas; + QPtyCstmrGroup groupEntity = QPtyCstmrGroup.ptyCstmrGroup; + + BooleanBuilder builder = new BooleanBuilder(); + builder.and(basEntity.userId.eq(userId)); + + PtyCstmrBas entity = query.select(basEntity) + .from(basEntity) + .where(builder) + .fetchFirst(); + + List pcgEntityList = null; + if (entity != null) { + BooleanBuilder groupBuilder = new BooleanBuilder(); + groupBuilder.and(groupEntity.cstmrSno.eq(entity.getCstmrSno()) + .and(groupEntity.joinYn.eq("Y"))); + + pcgEntityList = query.select(groupEntity) + .from(groupEntity) + .where(groupBuilder) + .fetch(); + } + + + if (entity != null) { + JwtUserModel model = new JwtUserModel(); + model.setAuth(entity.getAuthId()); + model.setUserId(entity.getUserId()); + model.setCstmrSno(entity.getCstmrSno()); + model.setCstmrStatusCd(entity.getCstmrStatusCd()); + model.setUserPswd(entity.getUserPswd()); + if (pcgEntityList != null && !pcgEntityList.isEmpty()) { + List groupModelList = new ArrayList<>(); + for (PtyCstmrGroup pcgEntity : pcgEntityList) { + JwtGroupModel groupModel = new JwtGroupModel(); + groupModel.setGroupId(pcgEntity.getGroupId()); + groupModel.setGroupAuthCd(pcgEntity.getGroupAuthCd()); + groupModelList.add(groupModel); + } + model.setGroup(groupModelList); + } + + return model; + + } else { + return null; + } + + + } + + public JwtProfileRsModel findUserProfile(int cstmrSno) { + QPtyCstmrBas basEntity = QPtyCstmrBas.ptyCstmrBas; + QPtyCstmrDtl dtlEntity = QPtyCstmrDtl.ptyCstmrDtl; + + BooleanBuilder builder = new BooleanBuilder(); + builder.and(basEntity.cstmrSno.eq(cstmrSno)); + + + JwtProfileRsModel model = query.select(Projections.bean(JwtProfileRsModel.class, + basEntity.cstmrSno, + basEntity.userId, + basEntity.authId, + basEntity.trmnlId, + basEntity.siteCode, + dtlEntity.memberName + )) + .from(basEntity) + .leftJoin(dtlEntity) + .on(basEntity.cstmrSno.eq(dtlEntity.cstmrSno)) + .where(builder) + .fetchFirst(); + + return model; + + } + + public JwtUserModel findRefreshtoken(int cstmrSno, String refreshToken) { + QPtyCstmrBas basEntity = QPtyCstmrBas.ptyCstmrBas; + BooleanBuilder builder = new BooleanBuilder(); + builder.and(basEntity.cstmrSno.eq(cstmrSno)); + builder.and(basEntity.rfrshToken.eq(refreshToken)); + + PtyCstmrBas entity = query.select(basEntity) + .from(basEntity) + .where(builder) + .fetchFirst(); + if (entity != null) { + JwtUserModel model = new JwtUserModel(); + model.setAuth(entity.getAuthId()); + model.setUserId(entity.getUserId()); + model.setCstmrSno(entity.getCstmrSno()); + model.setCstmrStatusCd(entity.getCstmrStatusCd()); + model.setUserPswd(entity.getUserPswd()); + + return model; + + } else { + return null; + } + } + + public List list(int cstmrSno) { + QPtyCstmrBas bas = QPtyCstmrBas.ptyCstmrBas; + QPtyCstmrDtl dtl = QPtyCstmrDtl.ptyCstmrDtl; + + List list = query + .select(Projections.bean( + AnctCstmerRlModel.class, + dtl.memberName, + dtl.brthdyDate, + dtl.genderCd, + dtl.cntryCd, + dtl.email, + dtl.hpno, + dtl.updateDt, + bas.userId + )) + .from(bas) + .leftJoin(dtl) + .on(bas.cstmrSno.eq(dtl.cstmrSno)) + .where(bas.cstmrSno.eq(cstmrSno)) + .fetch(); + + return list; + } + + public AnctCstmrModel findByCstmrSno(int cstmrSno) { + QPtyCstmrBas bas = QPtyCstmrBas.ptyCstmrBas; + QPtyCstmrDtl dtl = QPtyCstmrDtl.ptyCstmrDtl; + + AnctCstmrModel anctCstmrModel = query + .select(Projections.bean( + AnctCstmrModel.class, + bas.cstmrSno, + bas.authId, + bas.cstmrDivCd, + bas.cstmrStatusCd, + bas.cstmrStatusCngDt, + bas.joinDt, + bas.joinIp, + bas.memberDivCd, + bas.pswdUpdtDt, + bas.siteCode, + bas.trmnlId, + dtl.addr, + dtl.addrDtlCn, + dtl.brthdyDate, + dtl.clncd, + dtl.email, + dtl.genderCd, + dtl.hpno, + dtl.ipinCi, + dtl.ipinDi, + dtl.joinCrtfyCd, + dtl.memberName, + dtl.updateDt, + dtl.updateUserId, + dtl.zip + )) + .from(bas) + .leftJoin(dtl) + .on(bas.cstmrSno.eq(dtl.cstmrSno)) + .where(bas.cstmrSno.eq(cstmrSno)) + .fetchFirst(); + + return anctCstmrModel; + } + + + public AcntCstmrRqModel findpassword(String userId) { + QPtyCstmrBas basEntity = QPtyCstmrBas.ptyCstmrBas; + + BooleanBuilder builder = new BooleanBuilder(); + builder.and(basEntity.userId.eq(userId)); + + PtyCstmrBas entity = query.select(basEntity) + .from(basEntity) + .where(builder) + .fetchFirst(); + + if (entity != null) { + JwtUserModel model = new JwtUserModel(); + model.setCstmrSno(entity.getCstmrSno()); + model.setUserPswd(entity.getUserPswd()); + } + + return null; + } + } diff --git a/pav-server/src/main/java/com/palnet/comn/utils/AirspaceUtils.java b/pav-server/src/main/java/com/palnet/comn/utils/AirspaceUtils.java index 6a37fb9e..e453e2fc 100644 --- a/pav-server/src/main/java/com/palnet/comn/utils/AirspaceUtils.java +++ b/pav-server/src/main/java/com/palnet/comn/utils/AirspaceUtils.java @@ -126,6 +126,11 @@ public class AirspaceUtils { public Geometry createGeometryByCoordinate(List target, String type) { Geometry geometry = null; if ("Polygon".equals(type)) { + if (target == null || target.isEmpty()) return null; + log.info(">>> {}", target.get(0) != target.get(target.size() - 1)); + if (target.get(0) != target.get(target.size() - 1)) { + target.add(target.get(0)); + } geometry = this.geometryFactory.createPolygon(target.toArray(new Coordinate[0])); } else if ("LineString".equals(type)) { geometry = this.geometryFactory.createLineString(target.toArray(new Coordinate[0])); diff --git a/pav-server/src/main/java/com/palnet/comn/utils/AreaUtils.java b/pav-server/src/main/java/com/palnet/comn/utils/AreaUtils.java index 7ec53915..8024b434 100644 --- a/pav-server/src/main/java/com/palnet/comn/utils/AreaUtils.java +++ b/pav-server/src/main/java/com/palnet/comn/utils/AreaUtils.java @@ -332,4 +332,12 @@ public class AreaUtils { } } } + public Geometry coordinateToGeometry(List target) { + if (target == null || target.isEmpty()) return null; + log.info(">>> {}", target.get(0) != target.get(target.size() - 1)); + if (target.get(0) != target.get(target.size() - 1)) { + target.add(target.get(0)); + } + return geometryFactory.createPolygon(target.toArray(new Coordinate[]{})); + } }