diff --git a/data/com/src/main/java/kr/co/palnet/kac/data/com/repository/ComFileBasRepository.java b/data/com/src/main/java/kr/co/palnet/kac/data/com/repository/ComFileBasRepository.java index 78645d4..23c8b6b 100644 --- a/data/com/src/main/java/kr/co/palnet/kac/data/com/repository/ComFileBasRepository.java +++ b/data/com/src/main/java/kr/co/palnet/kac/data/com/repository/ComFileBasRepository.java @@ -12,4 +12,6 @@ public interface ComFileBasRepository extends JpaRepository { Optional> findByFileGroupNoInAndDelYnOrderByCreateDtDesc(List fileGroupNos, String delYn); + Optional findFirstByFileGroupNoAndDelYnOrderByCreateDtDesc(Long fileGroupNo, String delYn); + } diff --git a/data/com/src/main/java/kr/co/palnet/kac/data/com/service/ComFileDomainService.java b/data/com/src/main/java/kr/co/palnet/kac/data/com/service/ComFileDomainService.java index f605a40..7a81165 100644 --- a/data/com/src/main/java/kr/co/palnet/kac/data/com/service/ComFileDomainService.java +++ b/data/com/src/main/java/kr/co/palnet/kac/data/com/service/ComFileDomainService.java @@ -35,4 +35,8 @@ public class ComFileDomainService { public Optional> findByFileGroupNoInAndDelYnOrderByCreateDtDesc(List fileGroupNos, String delYn){ return comFileBasRepository.findByFileGroupNoInAndDelYnOrderByCreateDtDesc(fileGroupNos, delYn); } + + public Optional findFirstByFileGroupNoAndDelYnOrderByCreateDtDesc(Long fileGroupNo){ + return comFileBasRepository.findFirstByFileGroupNoAndDelYnOrderByCreateDtDesc(fileGroupNo, "N"); + } } diff --git a/data/flt/src/main/java/kr/co/palnet/kac/data/flt/repository/FltPlanBasRepository.java b/data/flt/src/main/java/kr/co/palnet/kac/data/flt/repository/FltPlanBasRepository.java index c467230..ec56473 100644 --- a/data/flt/src/main/java/kr/co/palnet/kac/data/flt/repository/FltPlanBasRepository.java +++ b/data/flt/src/main/java/kr/co/palnet/kac/data/flt/repository/FltPlanBasRepository.java @@ -3,6 +3,6 @@ package kr.co.palnet.kac.data.flt.repository; import kr.co.palnet.kac.data.flt.model.FltPlanBas; import org.springframework.data.jpa.repository.JpaRepository; -public interface FltPlanBasRepository extends JpaRepository { +public interface FltPlanBasRepository extends JpaRepository { } diff --git a/data/flt/src/main/java/kr/co/palnet/kac/data/flt/service/FltPlanDomainService.java b/data/flt/src/main/java/kr/co/palnet/kac/data/flt/service/FltPlanDomainService.java index e0b6359..1a27165 100644 --- a/data/flt/src/main/java/kr/co/palnet/kac/data/flt/service/FltPlanDomainService.java +++ b/data/flt/src/main/java/kr/co/palnet/kac/data/flt/service/FltPlanDomainService.java @@ -32,6 +32,10 @@ public class FltPlanDomainService { return fltPlanQueryRepository.findAllBySearch(memberName, createStDate, createEndDate); } + public Optional findById(Long planSno){ + return fltPlanBasRepository.findById(planSno); + } + public FltPlanBas saveFltPlanBas(FltPlanBas entity){ return fltPlanBasRepository.save(entity); } diff --git a/web/api-flight/src/main/java/kr/co/palnet/kac/api/v1/flight/laanc/controller/FlightLaancController.java b/web/api-flight/src/main/java/kr/co/palnet/kac/api/v1/flight/laanc/controller/FlightLaancController.java index 69dcd4f..76b38a8 100644 --- a/web/api-flight/src/main/java/kr/co/palnet/kac/api/v1/flight/laanc/controller/FlightLaancController.java +++ b/web/api-flight/src/main/java/kr/co/palnet/kac/api/v1/flight/laanc/controller/FlightLaancController.java @@ -1,9 +1,11 @@ package kr.co.palnet.kac.api.v1.flight.laanc.controller; import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; import kr.co.palnet.kac.api.v1.flight.laanc.model.create.CreateLaancPlanRQ; import kr.co.palnet.kac.api.v1.flight.laanc.model.create.CreateLaancPlanRS; +import kr.co.palnet.kac.api.v1.flight.laanc.model.detail.SearchLaancAprvDetailRS; import kr.co.palnet.kac.api.v1.flight.laanc.model.pliotvalid.PilotValidRs; import kr.co.palnet.kac.api.v1.flight.laanc.model.search.SearchLaancAprvRQ; import kr.co.palnet.kac.api.v1.flight.laanc.model.search.SearchLaancAprvRS; @@ -41,7 +43,7 @@ public class FlightLaancController { } @PostMapping("/ts/qr") - @Operation(summary = "TS QR 코드 생성", description = "조종사 자격증명 및 기체 보험 여부 등 조회하기 위한 QR 코드 생성") + @Operation(summary = "TS QR 코드 생성", description = "조종사 자격증명 및 기체 보험 여부 등 조회하기 위한 QR 코드 생성합니다.") public ResponseEntity createQRcode(LaancTsQRcodeRQ rq){ LaancTsQRcodeRS result = flightLaancService.createQRcode(rq); @@ -50,7 +52,7 @@ public class FlightLaancController { } @GetMapping("/ts/qr/{confirmKey}") - @Operation(summary = "TS QR 코드 확인", description = "조종사 자격증명 및 기체 보험 여부 등 데이터를 받고 검증된 데이터인지 확인") + @Operation(summary = "TS QR 코드 확인", description = "조종사 자격증명 및 기체 보험 여부 등 데이터를 받고 검증된 데이터인지 확인합니다.") public ResponseEntity checkQrcode(@PathVariable("confirmKey") String confirmKey) { PilotValidRs result = flightLaancService.checkQrcode(confirmKey); @@ -68,7 +70,7 @@ public class FlightLaancController { } @PostMapping("/valid/elev") - @Operation(summary = "비행구역 허용고도 조회", description = "좌표에 해당하는 허용고도 조회") + @Operation(summary = "비행구역 허용고도 조회", description = "좌표에 해당하는 허용고도를 조회합니다.") public ResponseEntity getAllowableElevation(@RequestBody List rq){ LaancAllowableElevationRS result = flightLaancService.getAllowableElevation(rq); @@ -77,7 +79,7 @@ public class FlightLaancController { } @GetMapping("/list") - @Operation(summary = "LAANC 승인 목록", description = "LAANC 승인 목록") + @Operation(summary = "LAANC 승인 목록", description = "LAANC 승인 목록을 조회합니다.") public ResponseEntity> getLaancAprvList(SearchLaancAprvRQ rq){ List result = flightLaancService.getLaancAprvList(rq); @@ -85,6 +87,16 @@ public class FlightLaancController { return ResponseEntity.ok().body(result); } + @GetMapping("/detail/{planSno}") + @Operation(summary = "LAANC 승인 상세 조회", description = "LAANC 승인 상세 조회합니다.") + @Parameter(name = "planSno", description = "LAANC 승인된 비행계획서 번호", required = true, example = "1") + public ResponseEntity getLaancAprvDetail(@PathVariable("planSno") Long planSno){ + + SearchLaancAprvDetailRS result = flightLaancService.getLaancAprvDetail(planSno); + + return ResponseEntity.ok().body(result); + } + diff --git a/web/api-flight/src/main/java/kr/co/palnet/kac/api/v1/flight/laanc/model/detail/SearchLaancAprvDetailRS.java b/web/api-flight/src/main/java/kr/co/palnet/kac/api/v1/flight/laanc/model/detail/SearchLaancAprvDetailRS.java new file mode 100644 index 0000000..4aa4944 --- /dev/null +++ b/web/api-flight/src/main/java/kr/co/palnet/kac/api/v1/flight/laanc/model/detail/SearchLaancAprvDetailRS.java @@ -0,0 +1,138 @@ +package kr.co.palnet.kac.api.v1.flight.laanc.model.detail; + +import kr.co.palnet.kac.api.v1.flight.laanc.model.FltPlanPilotDTO; +import kr.co.palnet.kac.api.v1.flight.laanc.model.constant.ArcrftWghtCd; +import kr.co.palnet.kac.api.v1.flight.laanc.model.constant.FltPurpose; +import kr.co.palnet.kac.api.v1.flight.laanc.model.constant.FltType; +import kr.co.palnet.kac.api.v1.flight.laanc.model.create.BasLaancArcrftModel; +import kr.co.palnet.kac.api.v1.flight.laanc.model.create.BasLaancAreaModel; +import kr.co.palnet.kac.api.v1.flight.laanc.model.search.SearchLaancAprvRS; +import kr.co.palnet.kac.data.flt.model.FltPlanBas; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class SearchLaancAprvDetailRS { + //비행계획서 일려번호 + private Long planSno; + //그룹 아이디 + private String groupId; + //작성자 일련번호 + private Long cstmrSno; + //작성자 이름 + private String memberName; + //작성자 이메일 + private String email; + //작성자 연락처 + private String hpno; + //작성자 국가번호(연락처) + private String clncd; + //작성자 주소 + private String addr; + //작성자 상세주소 + private String addrDtlCn; + //작성자 우편번호 + private String zip; + //비행시작일시 + private LocalDateTime schFltStDt; + //비행종료일시 + private LocalDateTime schFltEndDt; + //비행목적 + private FltPurpose fltPurpose; + //상업/비사업 구분 + private FltType fltType; + //상업/비사업 구분 코드 + private String fltTypeNm; + //승인여부 + private String aprvlYn; + //승인일자 + private LocalDateTime aprvlDt; + //삭제여부 + // private String delYn; + // 파일그룹번호 + private Long fileGroupNo; + //등록자ID + private String createUserId; + //등록일시 + private LocalDateTime createDt; + //수정자ID + private String updateUserId; + //수정일시 + private LocalDateTime updateDt; + //서비스유형 + private String serviceType; + //기업여부 + private String corpRegYn; + //공문URL + private String pdfUrl; + + + private List areaList; + private List arcrftList; + private List pilotList; + + public static SearchLaancAprvDetailRS toModel(FltPlanBas entity){ + SearchLaancAprvDetailRS model = new SearchLaancAprvDetailRS(); + model.setPlanSno(entity.getPlanSno()); + model.setGroupId(entity.getGroupId()); + model.setCstmrSno(entity.getCstmrSno()); + model.setServiceType(entity.getServiceType()); + model.setMemberName(entity.getMemberName()); + model.setEmail(entity.getEmail()); + model.setHpno(entity.getHpno()); + model.setClncd(entity.getClncd()); + model.setAddr(entity.getAddr()); + model.setAddrDtlCn(entity.getAddrDtlCn()); + model.setZip(entity.getZip()); + model.setSchFltStDt(entity.getSchFltStDt()); + model.setSchFltEndDt(entity.getSchFltEndDt()); + model.setFltPurpose(FltPurpose.fromCode(entity.getFltPurpose())); + model.setFltType(FltType.fromCode(entity.getFltType())); + model.setCorpRegYn(entity.getCorpRegYn()); + model.setAprvlYn(entity.getAprvlYn()); + model.setAprvlDt(entity.getAprvlDt()); + model.setFileGroupNo(entity.getFileGroupNo()); + model.setCreateUserId(entity.getCreateUserId()); + model.setCreateDt(entity.getCreateDt()); + model.setUpdateUserId(entity.getUpdateUserId()); + model.setUpdateDt(entity.getUpdateDt()); + + return model; + } + + + // 하나의 필드로 묶어서 처리 + //기체 무게 + public String getArcrftWght() { + if (arcrftList == null || arcrftList.isEmpty()) return null; + List arcrftWghtCdList = arcrftList.stream().map(BasLaancArcrftModel::getArcrftWghtCd).distinct().filter(Objects::nonNull).collect(Collectors.toList()); + String ArcrftWghtType = arcrftWghtCdList.stream().map(ArcrftWghtCd::getValue).collect(Collectors.joining(",")); + return ArcrftWghtType; + } + + //고도 + public String getElev() { + if (areaList == null || areaList.isEmpty()) return null; + List elevList = areaList.stream().map(BasLaancAreaModel::getFltElev).distinct().filter(Objects::nonNull).collect(Collectors.toList()); + String elev = String.join(",", elevList); + return elev; + } + +//조종사 성명 +// public String getPilotName() { +// if (pilotList == null || pilotList.isEmpty()) return null; +// List pilotNameList = pilotList.stream().map(BasLaancPilotModel::getMemberName).distinct().filter(Objects::nonNull).collect(Collectors.toList()); +// String pilotName = String.join(",", pilotNameList); +// return pilotName; +// } +} diff --git a/web/api-flight/src/main/java/kr/co/palnet/kac/api/v1/flight/laanc/service/FlightLaancService.java b/web/api-flight/src/main/java/kr/co/palnet/kac/api/v1/flight/laanc/service/FlightLaancService.java index a9ea4b6..124fa89 100644 --- a/web/api-flight/src/main/java/kr/co/palnet/kac/api/v1/flight/laanc/service/FlightLaancService.java +++ b/web/api-flight/src/main/java/kr/co/palnet/kac/api/v1/flight/laanc/service/FlightLaancService.java @@ -5,10 +5,10 @@ import kr.co.palnet.kac.api.external.model.TsQRcodeRQ; import kr.co.palnet.kac.api.external.service.CtrTrnsLctnService; import kr.co.palnet.kac.api.external.service.TsService; import kr.co.palnet.kac.api.util.*; -import kr.co.palnet.kac.api.v1.flight.laanc.model.constant.FltType; import kr.co.palnet.kac.api.v1.flight.laanc.model.create.CstmrModel; import kr.co.palnet.kac.api.v1.flight.laanc.model.*; import kr.co.palnet.kac.api.v1.flight.laanc.model.create.*; +import kr.co.palnet.kac.api.v1.flight.laanc.model.detail.SearchLaancAprvDetailRS; import kr.co.palnet.kac.api.v1.flight.laanc.model.search.FileModel; import kr.co.palnet.kac.api.v1.flight.laanc.model.search.SearchLaancAprvRQ; import kr.co.palnet.kac.api.v1.flight.laanc.model.search.SearchLaancAprvRS; @@ -575,4 +575,48 @@ public class FlightLaancService { return result; } + + public SearchLaancAprvDetailRS getLaancAprvDetail(Long planSno) { + + Optional fltPlanBasData = fltPlanDomainService.findById(planSno); + + if(fltPlanBasData.isPresent()){ + FltPlanBas fltPlanBas = fltPlanBasData.get(); + + SearchLaancAprvDetailRS result = SearchLaancAprvDetailRS.toModel(fltPlanBas); + result.setHpno(EncryptUtil.decrypt(result.getHpno())); + result.setEmail(EncryptUtil.decrypt(result.getEmail())); + result.setFltTypeNm(result.getFltType().getValue()); + + Optional> fltPlanAreaListData = fltPlanDomainService.findFltPlanAreaByPlanSno(planSno); + Optional> fltPlanArcrftListData = fltPlanDomainService.findFltPlanArcrftByPlanSno(planSno); + + if(fltPlanAreaListData.isPresent()){ + List fltPlanAreaList = fltPlanAreaListData.get(); + List areaList = fltPlanAreaList.stream().map(BasLaancAreaModel::toModel).toList(); + + result.setAreaList(areaList); + } + + if(fltPlanArcrftListData.isPresent()){ + List fltPlanArcrftList = fltPlanArcrftListData.get(); + List arcrftList = fltPlanArcrftList.stream().map(BasLaancArcrftModel::toModel).toList(); + + result.setArcrftList(arcrftList); + } + + Optional comFileBasData = comFileDomainService.findFirstByFileGroupNoAndDelYnOrderByCreateDtDesc(fltPlanBas.getFileGroupNo()); + + // PDF URL 추출 + if (comFileBasData.isPresent()) { + ComFileBas comFileBas = comFileBasData.get(); + + result.setPdfUrl(fileUtils.getDownloadUrl(comFileBas.getFileSno())); + } + + return result; + } else { + throw new BaseException(BaseErrorCode.WEB_PARAM_INVALID); + }가 + } }