From 04506e100c45f533e0bcba8ec9b67270ddd7aa7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?lkd9125=28=EC=9D=B4=EA=B2=BD=EB=8F=84=29?= Date: Wed, 21 Feb 2024 10:07:02 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20Flt=EB=AA=A8=EB=93=88=20-=20laanc?= =?UTF-8?q?=EC=BD=94=EB=93=9C=201=EC=B0=A8=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../test/java/kr/co/palnet/kac/BaseTest.java | 5 - .../kac/data/flt/model/FltPlanArea.java | 6 +- .../kac/data/flt/model/FltPlanAreaCoord.java | 4 +- .../palnet/kac/data/flt/model/FltPlanBas.java | 13 +- .../kac/data/flt/model/FltPlanPilot.java | 6 +- .../flt/service/FltPlanDomainService.java | 48 ++++++ .../pty/repository/PtyGroupBasRepository.java | 4 + .../pty/service/PtyGroupDomainService.java | 4 + web/api-flight/build.gradle | 17 ++ .../controller/FlightLaancController.java | 29 ++++ .../laanc/model/AnctCstmrTermsModel.java | 7 + .../laanc/model/BasLaancArcrftModel.java | 107 ++++++++++++ .../laanc/model/BasLaancAreaCoordModel.java | 34 ++++ .../flight/laanc/model/BasLaancAreaModel.java | 56 +++++++ .../api/v1/flight/laanc/model/CstmrModel.java | 73 +++++++++ .../laanc/model/FltPlanAreaCoordDTO.java | 42 +++++ .../v1/flight/laanc/model/FltPlanAreaDTO.java | 58 +++++++ .../v1/flight/laanc/model/FltPlanBasDTO.java | 88 ++++++++++ .../flight/laanc/model/FltPlanPilotDTO.java | 72 +++++++++ .../laanc/model/constant/ArcrftTypeCd.java | 31 ++++ .../laanc/model/constant/ArcrftWghtCd.java | 34 ++++ .../laanc/model/constant/FltMethod.java | 38 +++++ .../laanc/model/constant/FltPurpose.java | 44 +++++ .../flight/laanc/model/constant/FltType.java | 30 ++++ .../laanc/model/create/CreatePlanRQ.java | 56 +++++++ .../laanc/model/create/CtrTrnsLctnModel.java | 16 ++ .../laanc/model/pliotvalid/PilotValidRq.java | 18 +++ .../laanc/model/pliotvalid/PilotValidRs.java | 29 ++++ .../laanc/service/FlightLaancService.java | 152 ++++++++++++++++++ .../plan/controller/FlightPlanController.java | 19 +++ .../plan/service/FlightPlanService.java | 11 ++ .../kac/external/CtrTrnsLctnService.java | 133 +++++++++++++++ .../kac/config/security/util/JwtUtil.java | 2 +- 33 files changed, 1266 insertions(+), 20 deletions(-) create mode 100644 data/flt/src/main/java/kr/co/palnet/kac/data/flt/service/FltPlanDomainService.java create mode 100644 web/api-flight/build.gradle create mode 100644 web/api-flight/src/main/java/kr/co/palnet/kac/api/v1/flight/laanc/controller/FlightLaancController.java create mode 100644 web/api-flight/src/main/java/kr/co/palnet/kac/api/v1/flight/laanc/model/AnctCstmrTermsModel.java create mode 100644 web/api-flight/src/main/java/kr/co/palnet/kac/api/v1/flight/laanc/model/BasLaancArcrftModel.java create mode 100644 web/api-flight/src/main/java/kr/co/palnet/kac/api/v1/flight/laanc/model/BasLaancAreaCoordModel.java create mode 100644 web/api-flight/src/main/java/kr/co/palnet/kac/api/v1/flight/laanc/model/BasLaancAreaModel.java create mode 100644 web/api-flight/src/main/java/kr/co/palnet/kac/api/v1/flight/laanc/model/CstmrModel.java create mode 100644 web/api-flight/src/main/java/kr/co/palnet/kac/api/v1/flight/laanc/model/FltPlanAreaCoordDTO.java create mode 100644 web/api-flight/src/main/java/kr/co/palnet/kac/api/v1/flight/laanc/model/FltPlanAreaDTO.java create mode 100644 web/api-flight/src/main/java/kr/co/palnet/kac/api/v1/flight/laanc/model/FltPlanBasDTO.java create mode 100644 web/api-flight/src/main/java/kr/co/palnet/kac/api/v1/flight/laanc/model/FltPlanPilotDTO.java create mode 100644 web/api-flight/src/main/java/kr/co/palnet/kac/api/v1/flight/laanc/model/constant/ArcrftTypeCd.java create mode 100644 web/api-flight/src/main/java/kr/co/palnet/kac/api/v1/flight/laanc/model/constant/ArcrftWghtCd.java create mode 100644 web/api-flight/src/main/java/kr/co/palnet/kac/api/v1/flight/laanc/model/constant/FltMethod.java create mode 100644 web/api-flight/src/main/java/kr/co/palnet/kac/api/v1/flight/laanc/model/constant/FltPurpose.java create mode 100644 web/api-flight/src/main/java/kr/co/palnet/kac/api/v1/flight/laanc/model/constant/FltType.java create mode 100644 web/api-flight/src/main/java/kr/co/palnet/kac/api/v1/flight/laanc/model/create/CreatePlanRQ.java create mode 100644 web/api-flight/src/main/java/kr/co/palnet/kac/api/v1/flight/laanc/model/create/CtrTrnsLctnModel.java create mode 100644 web/api-flight/src/main/java/kr/co/palnet/kac/api/v1/flight/laanc/model/pliotvalid/PilotValidRq.java create mode 100644 web/api-flight/src/main/java/kr/co/palnet/kac/api/v1/flight/laanc/model/pliotvalid/PilotValidRs.java create mode 100644 web/api-flight/src/main/java/kr/co/palnet/kac/api/v1/flight/laanc/service/FlightLaancService.java create mode 100644 web/api-flight/src/main/java/kr/co/palnet/kac/api/v1/flight/plan/controller/FlightPlanController.java create mode 100644 web/api-flight/src/main/java/kr/co/palnet/kac/api/v1/flight/plan/service/FlightPlanService.java create mode 100644 web/api-flight/src/main/java/kr/co/palnet/kac/external/CtrTrnsLctnService.java diff --git a/app/kac-app/src/test/java/kr/co/palnet/kac/BaseTest.java b/app/kac-app/src/test/java/kr/co/palnet/kac/BaseTest.java index b96ab51..5f0d518 100644 --- a/app/kac-app/src/test/java/kr/co/palnet/kac/BaseTest.java +++ b/app/kac-app/src/test/java/kr/co/palnet/kac/BaseTest.java @@ -1,15 +1,12 @@ package kr.co.palnet.kac; -import com.fasterxml.jackson.databind.ObjectMapper; import jakarta.servlet.ServletException; -import kr.co.palnet.kac.api.v1.user.account.model.detail.SearchUserRS; import kr.co.palnet.kac.api.v1.user.account.model.register.FormRegisterRQ; import kr.co.palnet.kac.api.v1.user.account.service.UserAccountService; import kr.co.palnet.kac.app.KacAppApplication; import kr.co.palnet.kac.config.security.model.BaseUserDetails; import kr.co.palnet.kac.config.security.service.BaseUserDetailsService; import kr.co.palnet.kac.config.security.util.JwtUtil; -import kr.co.palnet.kac.util.ObjectMapperUtils; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; @@ -19,7 +16,6 @@ import org.springframework.restdocs.RestDocumentationContextProvider; import org.springframework.restdocs.RestDocumentationExtension; import org.springframework.restdocs.mockmvc.MockMvcRestDocumentation; import org.springframework.security.config.BeanIds; -import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.setup.MockMvcBuilders; import org.springframework.web.context.WebApplicationContext; @@ -27,7 +23,6 @@ import org.springframework.web.filter.CharacterEncodingFilter; import org.springframework.web.filter.DelegatingFilterProxy; import java.time.LocalDate; -import java.time.LocalDateTime; import static org.springframework.restdocs.operation.preprocess.Preprocessors.modifyUris; import static org.springframework.restdocs.operation.preprocess.Preprocessors.prettyPrint; diff --git a/data/flt/src/main/java/kr/co/palnet/kac/data/flt/model/FltPlanArea.java b/data/flt/src/main/java/kr/co/palnet/kac/data/flt/model/FltPlanArea.java index 852c102..670b10d 100644 --- a/data/flt/src/main/java/kr/co/palnet/kac/data/flt/model/FltPlanArea.java +++ b/data/flt/src/main/java/kr/co/palnet/kac/data/flt/model/FltPlanArea.java @@ -5,7 +5,7 @@ import lombok.*; import org.hibernate.annotations.CreationTimestamp; import org.hibernate.annotations.UpdateTimestamp; -import java.time.Instant; +import java.time.LocalDateTime; import java.util.List; @Data @@ -64,7 +64,7 @@ public class FltPlanArea { // 생성일시 @CreationTimestamp @Column(name = "CREATE_DT", columnDefinition = "datetime", updatable = false, nullable = false) - private Instant createDt; + private LocalDateTime createDt; // 수정사용자ID @Column(name = "UPDATE_USER_ID", length = 30, nullable = false) @@ -73,7 +73,7 @@ public class FltPlanArea { // 수정일시 @UpdateTimestamp @Column(name = "UPDATE_DT", columnDefinition = "datetime", nullable = false) - private Instant updateDt; + private LocalDateTime updateDt; @JoinColumn( name = "PLAN_SNO", insertable = false, updatable = false, diff --git a/data/flt/src/main/java/kr/co/palnet/kac/data/flt/model/FltPlanAreaCoord.java b/data/flt/src/main/java/kr/co/palnet/kac/data/flt/model/FltPlanAreaCoord.java index 7f48ebb..adb1db8 100644 --- a/data/flt/src/main/java/kr/co/palnet/kac/data/flt/model/FltPlanAreaCoord.java +++ b/data/flt/src/main/java/kr/co/palnet/kac/data/flt/model/FltPlanAreaCoord.java @@ -4,7 +4,7 @@ import jakarta.persistence.*; import lombok.*; import org.hibernate.annotations.CreationTimestamp; -import java.time.Instant; +import java.time.LocalDateTime; @Data @NoArgsConstructor @@ -46,7 +46,7 @@ public class FltPlanAreaCoord { // 생성일시 @CreationTimestamp @Column(name = "CREATE_DT", columnDefinition = "datetime", updatable = false, nullable = false) - private Instant createDt; + private LocalDateTime createDt; @JoinColumn( name = "PLAN_AREA_SNO", insertable = false, updatable = false, diff --git a/data/flt/src/main/java/kr/co/palnet/kac/data/flt/model/FltPlanBas.java b/data/flt/src/main/java/kr/co/palnet/kac/data/flt/model/FltPlanBas.java index 1837583..e35f8a4 100644 --- a/data/flt/src/main/java/kr/co/palnet/kac/data/flt/model/FltPlanBas.java +++ b/data/flt/src/main/java/kr/co/palnet/kac/data/flt/model/FltPlanBas.java @@ -3,7 +3,8 @@ package kr.co.palnet.kac.data.flt.model; import jakarta.persistence.*; import lombok.*; -import java.time.Instant; +import java.time.LocalDateTime; +import java.time.LocalDateTime; import java.util.List; @Data @@ -69,11 +70,11 @@ public class FltPlanBas { // 예정비행시작시간 @Column(name = "SCH_FLT_ST_DT", columnDefinition = "datetime(6)", nullable = false) - private Instant schFltStDt; + private LocalDateTime schFltStDt; // 예정비행종료시간 @Column(name = "SCH_FLT_END_DT", columnDefinition = "datetime(6)", nullable = false) - private Instant schFltEndDt; + private LocalDateTime schFltEndDt; // 비행목적 @Column(name = "FLT_PURPOSE", length = 200, nullable = false) @@ -93,7 +94,7 @@ public class FltPlanBas { // 승인일시 @Column(name = "APRVL_DT", columnDefinition = "datetime") - private Instant aprvlDt; + private LocalDateTime aprvlDt; // 삭제여부 @Column(name = "DEL_YN", columnDefinition = "char(1) default 'N'", nullable = false) @@ -109,7 +110,7 @@ public class FltPlanBas { // 생성일시 @Column(name = "CREATE_DT", columnDefinition = "datetime", updatable = false, nullable = false) - private Instant createDt; + private LocalDateTime createDt; // 수정사용자ID @Column(name = "UPDATE_USER_ID", length = 30, nullable = false) @@ -117,7 +118,7 @@ public class FltPlanBas { // 수정일시 @Column(name = "UPDATE_DT", columnDefinition = "datetime", nullable = false) - private Instant updateDt; + private LocalDateTime updateDt; @OneToMany(mappedBy = "fltPlanBas", fetch = FetchType.LAZY) private List fltPlanAreaList; diff --git a/data/flt/src/main/java/kr/co/palnet/kac/data/flt/model/FltPlanPilot.java b/data/flt/src/main/java/kr/co/palnet/kac/data/flt/model/FltPlanPilot.java index 21f174f..8618a10 100644 --- a/data/flt/src/main/java/kr/co/palnet/kac/data/flt/model/FltPlanPilot.java +++ b/data/flt/src/main/java/kr/co/palnet/kac/data/flt/model/FltPlanPilot.java @@ -5,7 +5,7 @@ import lombok.*; import org.hibernate.annotations.CreationTimestamp; import org.hibernate.annotations.UpdateTimestamp; -import java.time.Instant; +import java.time.LocalDateTime; @Data @NoArgsConstructor @@ -83,7 +83,7 @@ public class FltPlanPilot { // 생성일시 @CreationTimestamp @Column(name = "CREATE_DT", columnDefinition = "datetime", updatable = false, nullable = false) - private Instant createDt; + private LocalDateTime createDt; // 수정사용자ID @Column(name = "UPDATE_USER_ID", length = 30, nullable = false) @@ -92,7 +92,7 @@ public class FltPlanPilot { // 수정일시 @UpdateTimestamp @Column(name = "UPDATE_DT", columnDefinition = "datetime", nullable = false) - private Instant updateDt; + private LocalDateTime updateDt; @JoinColumn( name = "PLAN_SNO", insertable = false, updatable = false, 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 new file mode 100644 index 0000000..a6e120b --- /dev/null +++ b/data/flt/src/main/java/kr/co/palnet/kac/data/flt/service/FltPlanDomainService.java @@ -0,0 +1,48 @@ +package kr.co.palnet.kac.data.flt.service; + +import kr.co.palnet.kac.data.flt.model.FltPlanArea; +import kr.co.palnet.kac.data.flt.model.FltPlanAreaCoord; +import kr.co.palnet.kac.data.flt.model.FltPlanBas; +import kr.co.palnet.kac.data.flt.model.FltPlanPilot; +import kr.co.palnet.kac.data.flt.repository.FltPlanAreaCoordRepository; +import kr.co.palnet.kac.data.flt.repository.FltPlanAreaRepository; +import kr.co.palnet.kac.data.flt.repository.FltPlanBasRepository; +import kr.co.palnet.kac.data.flt.repository.FltPlanPilotRepository; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +@Slf4j +@RequiredArgsConstructor +@Service +public class FltPlanDomainService { + + private final FltPlanBasRepository fltPlanBasRepository; + + private final FltPlanAreaRepository fltPlanAreaRepository; + + private final FltPlanAreaCoordRepository fltPlanAreaCoordRepository; + + private final FltPlanPilotRepository fltPlanPilotRepository; + + + public FltPlanBas saveFltPlanBas(FltPlanBas entity){ + return fltPlanBasRepository.save(entity); + } + + public FltPlanArea saveFltPlanArea(FltPlanArea entity){ + return fltPlanAreaRepository.save(entity); + } + + public FltPlanAreaCoord saveFltPlanAreaCoord(FltPlanAreaCoord entity){ + return fltPlanAreaCoordRepository.save(entity); + } + + public FltPlanPilot saveFltPlanPilot(FltPlanPilot entity){ + return fltPlanPilotRepository.save(entity); + } + + + + +} diff --git a/data/pty/src/main/java/kr/co/palnet/kac/data/pty/repository/PtyGroupBasRepository.java b/data/pty/src/main/java/kr/co/palnet/kac/data/pty/repository/PtyGroupBasRepository.java index d21ed3f..4b5a46c 100644 --- a/data/pty/src/main/java/kr/co/palnet/kac/data/pty/repository/PtyGroupBasRepository.java +++ b/data/pty/src/main/java/kr/co/palnet/kac/data/pty/repository/PtyGroupBasRepository.java @@ -4,7 +4,11 @@ import kr.co.palnet.kac.data.pty.model.PtyGroupBas; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; +import java.util.List; +import java.util.Optional; + @Repository public interface PtyGroupBasRepository extends JpaRepository { + public Optional> findByGroupNm(String groupNm); } diff --git a/data/pty/src/main/java/kr/co/palnet/kac/data/pty/service/PtyGroupDomainService.java b/data/pty/src/main/java/kr/co/palnet/kac/data/pty/service/PtyGroupDomainService.java index 6beada4..05ee846 100644 --- a/data/pty/src/main/java/kr/co/palnet/kac/data/pty/service/PtyGroupDomainService.java +++ b/data/pty/src/main/java/kr/co/palnet/kac/data/pty/service/PtyGroupDomainService.java @@ -28,6 +28,10 @@ public class PtyGroupDomainService { return ptyCstmrGroupRepository.findByGroupId(groupId); } + public Optional> findByGroupNm(String groupNm){ + return ptyGroupBasRepository.findByGroupNm(groupNm); + } + public Optional> findByCstmrSno(Long cstmrSno){ return ptyCstmrGroupRepository.findByCstmrSno(cstmrSno); } diff --git a/web/api-flight/build.gradle b/web/api-flight/build.gradle new file mode 100644 index 0000000..78f6131 --- /dev/null +++ b/web/api-flight/build.gradle @@ -0,0 +1,17 @@ + + +dependencies { + implementation "$boot:spring-boot-starter-web" + implementation "$boot:spring-boot-starter-data-jpa" + + compileOnly 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.2.0' + implementation project(":common:core") + implementation project(":common:util") + implementation project(":data:flt") + implementation project(":data:ctr") + implementation project(":data:com") + implementation project(":data:pty") + compileOnly project(":web:security") + +} + 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 new file mode 100644 index 0000000..93056c7 --- /dev/null +++ b/web/api-flight/src/main/java/kr/co/palnet/kac/api/v1/flight/laanc/controller/FlightLaancController.java @@ -0,0 +1,29 @@ +package kr.co.palnet.kac.api.v1.flight.laanc.controller; + +import kr.co.palnet.kac.api.v1.flight.laanc.model.create.CreatePlanRQ; +import kr.co.palnet.kac.api.v1.flight.laanc.service.FlightLaancService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@Slf4j +@RequestMapping("/v1/flight/laanc") +@RequiredArgsConstructor +public class FlightLaancController { + + private final FlightLaancService flightLaancService; + + @PostMapping("/plan/create") + public ResponseEntity createPlan(@RequestBody CreatePlanRQ rq) { + + flightLaancService.createPlan(rq); + + return ResponseEntity.status(HttpStatus.CREATED).body(null); + } +} diff --git a/web/api-flight/src/main/java/kr/co/palnet/kac/api/v1/flight/laanc/model/AnctCstmrTermsModel.java b/web/api-flight/src/main/java/kr/co/palnet/kac/api/v1/flight/laanc/model/AnctCstmrTermsModel.java new file mode 100644 index 0000000..a22d4b0 --- /dev/null +++ b/web/api-flight/src/main/java/kr/co/palnet/kac/api/v1/flight/laanc/model/AnctCstmrTermsModel.java @@ -0,0 +1,7 @@ +package kr.co.palnet.kac.api.v1.flight.laanc.model; + +import lombok.Data; + +@Data +public class AnctCstmrTermsModel { +} diff --git a/web/api-flight/src/main/java/kr/co/palnet/kac/api/v1/flight/laanc/model/BasLaancArcrftModel.java b/web/api-flight/src/main/java/kr/co/palnet/kac/api/v1/flight/laanc/model/BasLaancArcrftModel.java new file mode 100644 index 0000000..1b8e1c6 --- /dev/null +++ b/web/api-flight/src/main/java/kr/co/palnet/kac/api/v1/flight/laanc/model/BasLaancArcrftModel.java @@ -0,0 +1,107 @@ +package kr.co.palnet.kac.api.v1.flight.laanc.model; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import io.swagger.v3.oas.annotations.media.Schema; +import kr.co.palnet.kac.api.v1.flight.laanc.model.constant.ArcrftTypeCd; +import kr.co.palnet.kac.api.v1.flight.laanc.model.constant.ArcrftWghtCd; +import lombok.Data; + +import java.time.LocalDateTime; + +@Data +public class BasLaancArcrftModel { + + @Schema(description = "계획서 기체 일련번호", example = "1", hidden = true) + private Integer planArcrftSno; + + @Schema(description = "비행계획서 일련번호", example = "1", hidden = true) + private Integer planSno; + + @Schema(description = "기체 일련번호", example = "1", hidden = true) + private Integer arcrftSno; + + @Schema(description = "식별번호(기체번호)", example = "PA0001") + private String idntfNum; + + @Schema(description = "그룹명", example = "한국공항공사", hidden = true) + private String groupNm; + + @Schema(description = "제작번호", example = "123101-13", hidden = true) + private String prdctNum; + + @Schema(description = "기체종류코드", example = "01", hidden = true) + private ArcrftTypeCd arcrftTypeCd; + + @Schema(description = "기체모델명", example = "M-01", hidden = true) + private String arcrftModelNm; + + @Schema(description = "제작자", example = "DJI", hidden = true) + private String prdctCmpnNm; + + @Schema(description = "제작일자", example = "2022-01-01", hidden = true) + private LocalDateTime prdctDate; + + @Schema(description = "기체길이", example = "1.0", hidden = true) + private double arcrftLngth; + + @Schema(description = "길체폭", example = "1.1", hidden = true) + private double arcrftWdth; + + @Schema(description = "기체높이", example = "1.0", hidden = true) + private double arcrftHght; + + @Schema(description = "기체중량", example = "1.5", hidden = true) + private double arcrftWght; + + @Schema(description = "중량구분코드", hidden = true) + private String wghtTypeCd; + + @Schema(description = "이미지URL", example = "http://www.imageurl.co.kr/image/url", hidden = true) + private String imageUrl; + + @Schema(description = "최대이륙중량", example = "10", hidden = true) + private double takeoffWght; + + @Schema(description = "사용여부", hidden = true) + private String useYn; + + @Schema(description = "카메라탑재여부", example = "N") + private String cameraYn; + + @Schema(description = "보험가입여부", example = "Y") + private String insrncYn; + + @Schema(description = "소유자명(법인명)", example = "팔네트웍스") + private String ownerNm; + + @Schema(description = "생성자ID", hidden = true) + private String createUserId; + + @Schema(description = "생성일시", hidden = true) + private LocalDateTime createDt; + + @Schema(description = "수정자ID", hidden = true) + private String updateUserId; + + @Schema(description = "수정일시", hidden = true) + private LocalDateTime updateDt; + + @Schema(hidden = true) + private String docState = "R"; + + @Schema(description = "식별장치종류코드", example = "DRON", hidden = true) + private String idntfTypeCd; + + // kac 추가 필드 + @Schema(description = "기체보험유무", example = "Y") + private String acrftInsuranceYn; + + @Schema(description = "보험유효기간", hidden = true) + private LocalDateTime insuranceExperiod; + + @Schema(description = "법인명", hidden = true) + private String corporationNm; + + @Schema(description = "자체중량코드", example = "10") + private ArcrftWghtCd arcrftWghtCd; // 기체 무게 코드 ---- +} diff --git a/web/api-flight/src/main/java/kr/co/palnet/kac/api/v1/flight/laanc/model/BasLaancAreaCoordModel.java b/web/api-flight/src/main/java/kr/co/palnet/kac/api/v1/flight/laanc/model/BasLaancAreaCoordModel.java new file mode 100644 index 0000000..ffbe71c --- /dev/null +++ b/web/api-flight/src/main/java/kr/co/palnet/kac/api/v1/flight/laanc/model/BasLaancAreaCoordModel.java @@ -0,0 +1,34 @@ +package kr.co.palnet.kac.api.v1.flight.laanc.model; + +import io.swagger.v3.oas.annotations.media.Schema; +import kr.co.palnet.kac.api.v1.flight.laanc.model.constant.FltMethod; +import lombok.Data; + +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import java.util.List; + +@Data +public class BasLaancAreaCoordModel { + + @Schema(description = "비행구역좌표 일련번호", example = "1") + private Long planAreaCoordSno; + + @Schema(description = "비행계획비행구역 일련번호", example = "1") + private Long planAreaSno; + + @Schema(description = "위도", example = "127.33") + private double lat; + + @Schema(description = "경도", example = "37.99") + private double lon; + + @Schema(description = "생성자ID", hidden = true) + private String createUserId; + + @Schema(description = "생성일시", hidden = true) + private LocalDateTime createDt; + + @Schema(hidden = true) + private String docState = "R"; +} diff --git a/web/api-flight/src/main/java/kr/co/palnet/kac/api/v1/flight/laanc/model/BasLaancAreaModel.java b/web/api-flight/src/main/java/kr/co/palnet/kac/api/v1/flight/laanc/model/BasLaancAreaModel.java new file mode 100644 index 0000000..9a0caf0 --- /dev/null +++ b/web/api-flight/src/main/java/kr/co/palnet/kac/api/v1/flight/laanc/model/BasLaancAreaModel.java @@ -0,0 +1,56 @@ +package kr.co.palnet.kac.api.v1.flight.laanc.model; + +import io.swagger.v3.oas.annotations.media.Schema; +import kr.co.palnet.kac.api.v1.flight.laanc.model.constant.FltMethod; +import lombok.Data; + +import java.time.LocalDateTime; +import java.util.List; + +@Data +public class BasLaancAreaModel { + + @Schema(description = "비행구역 일련번호", example = "1", hidden = true) + private Long planAreaSno; + + @Schema(description = "비행계획서 일련번호", example = "1", hidden = true) + private Long planSno; + + @Schema(description = "구역종류", example = "CIRCLE") + private String areaType; + + @Schema(description = "비행방식", example = "01") + private FltMethod fltMethod; + + @Schema(description = "비행구역주소", example = "인천광역시 부평구 청천2동") + private String fltAreaAddr; + + @Schema(description = "버퍼존", example = "100") + private Integer bufferZone; + + @Schema(description = "고도", example = "110") + private String fltElev; + + @Schema(description = "생성자ID", hidden = true) + private String createUserId; + + @Schema(description = "생성일시", hidden = true) + private LocalDateTime createDt; + + @Schema(description = "수정자ID", hidden = true) + private String updateUserId; + + @Schema(description = "수정일시", hidden = true) + private LocalDateTime updateDt; + + private String docState = "R"; + + private List coordList; + + @Schema(hidden = true) + private List bufferCoordList; + + // kac 추가 필드 + @Schema(description = "비행방식(기타)") + private String fltMothoeRm; +} diff --git a/web/api-flight/src/main/java/kr/co/palnet/kac/api/v1/flight/laanc/model/CstmrModel.java b/web/api-flight/src/main/java/kr/co/palnet/kac/api/v1/flight/laanc/model/CstmrModel.java new file mode 100644 index 0000000..24aa935 --- /dev/null +++ b/web/api-flight/src/main/java/kr/co/palnet/kac/api/v1/flight/laanc/model/CstmrModel.java @@ -0,0 +1,73 @@ +package kr.co.palnet.kac.api.v1.flight.laanc.model; + +import kr.co.palnet.kac.data.pty.model.PtyCstmrBas; +import kr.co.palnet.kac.data.pty.model.PtyCstmrDtl; +import lombok.Data; + +import java.time.LocalDate; +import java.time.LocalDateTime; + +@Data +public class CstmrModel { + + private Long cstmrSno; + private String authId; + private String cstmrDivCd; + private String cstmrStatusCd; + private LocalDateTime cstmrStatusCngDt; + private LocalDateTime joinDt; + private String joinIp; + private String memberDivCd; + private LocalDateTime pswdUpdtDt; + private String siteCode; + private String userId; + private String rfrshToken; + private String trmnlId; + private String addr; + private String addrDtlCn; + private LocalDate 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 LocalDateTime updateDt; + private String updateUserId; + private String zip; + + public static CstmrModel toModel(PtyCstmrBas userEntity, PtyCstmrDtl userDeatilEntity){ + CstmrModel model = new CstmrModel(); + model.setCstmrSno(userEntity.getCstmrSno()); + model.setAuthId(userEntity.getAuthId()); + model.setCstmrDivCd(userEntity.getCstmrDivCd()); + model.setCstmrStatusCd(userEntity.getCstmrStatusCd()); + model.setJoinDt(userEntity.getJoinDt()); + model.setJoinIp(userEntity.getJoinIp()); + model.setMemberDivCd(userEntity.getMemberDivCd()); + model.setPswdUpdtDt(userEntity.getPswdUpdtDt()); + model.setSiteCode(userEntity.getSiteCode()); + model.setTrmnlId(userEntity.getTrmnlId()); + model.setAddr(userDeatilEntity.getAddr()); + model.setAddrDtlCn(userDeatilEntity.getAddrDtlCn()); + model.setBrthdyDate(userDeatilEntity.getBrthdyDate()); + model.setClncd(userDeatilEntity.getClncd()); + model.setEmail(userDeatilEntity.getEmail()); + model.setGenderCd(userDeatilEntity.getGenderCd()); + model.setHpno(userDeatilEntity.getHpno()); + model.setIpinCi(userDeatilEntity.getIpinCi()); + model.setIpinDi(userDeatilEntity.getIpinDi()); + model.setJoinCrtfyCd(userDeatilEntity.getJoinCrtfyCd()); + model.setMemberName(userDeatilEntity.getMemberName()); + model.setUpdateDt(userDeatilEntity.getUpdateDt()); + model.setUpdateUserId(userDeatilEntity.getUpdateUserId()); + model.setZip(userDeatilEntity.getZip()); + + return model; + } + + +} diff --git a/web/api-flight/src/main/java/kr/co/palnet/kac/api/v1/flight/laanc/model/FltPlanAreaCoordDTO.java b/web/api-flight/src/main/java/kr/co/palnet/kac/api/v1/flight/laanc/model/FltPlanAreaCoordDTO.java new file mode 100644 index 0000000..e9265da --- /dev/null +++ b/web/api-flight/src/main/java/kr/co/palnet/kac/api/v1/flight/laanc/model/FltPlanAreaCoordDTO.java @@ -0,0 +1,42 @@ +package kr.co.palnet.kac.api.v1.flight.laanc.model; + +import kr.co.palnet.kac.data.flt.model.FltPlanAreaCoord; +import lombok.Data; + +import java.time.LocalDateTime; + +@Data +public class FltPlanAreaCoordDTO { + + private Long planAreaCoordSno; + private Long planAreaSno; // 비행계획비행구역일련번호 + private Double lon; // 위도 + private Double lat; // 경도 + private String createUserId; // 생성사용자ID + private LocalDateTime createDt; // 생성일시 + + public static FltPlanAreaCoordDTO toDto(BasLaancAreaCoordModel model){ + FltPlanAreaCoordDTO dto = new FltPlanAreaCoordDTO(); + dto.setPlanAreaCoordSno(model.getPlanAreaCoordSno()); + dto.setPlanAreaSno(model.getPlanAreaSno()); + dto.setLon(model.getLon()); + dto.setLat(model.getLat()); + dto.setCreateUserId(model.getCreateUserId()); + dto.setCreateDt(model.getCreateDt()); + + return dto; + } + + public static FltPlanAreaCoord toEntity(FltPlanAreaCoordDTO dto){ + + return FltPlanAreaCoord.builder() + .planAreaCoordSno(dto.getPlanAreaCoordSno()) + .planAreaSno(dto.getPlanAreaSno()) + .lon(dto.getLon()) + .lat(dto.getLat()) + .createUserId(dto.getCreateUserId()) + .createDt(dto.getCreateDt()) + .build(); + } + +} diff --git a/web/api-flight/src/main/java/kr/co/palnet/kac/api/v1/flight/laanc/model/FltPlanAreaDTO.java b/web/api-flight/src/main/java/kr/co/palnet/kac/api/v1/flight/laanc/model/FltPlanAreaDTO.java new file mode 100644 index 0000000..d01e9cf --- /dev/null +++ b/web/api-flight/src/main/java/kr/co/palnet/kac/api/v1/flight/laanc/model/FltPlanAreaDTO.java @@ -0,0 +1,58 @@ +package kr.co.palnet.kac.api.v1.flight.laanc.model; + +import kr.co.palnet.kac.api.v1.flight.laanc.model.constant.FltMethod; +import kr.co.palnet.kac.data.flt.model.FltPlanArea; +import lombok.Data; + +import java.time.LocalDateTime; + +@Data +public class FltPlanAreaDTO { + + private Long planAreaSno; + private Long planSno; // 비행계획서일련번호 + private String areaType; // 구역종류 + private FltMethod fltMethod; // 비행방식 + private String fltMothoeRm; // 비행방식비고 + private String fltAreaAddr; // 비행구역주소 + private Integer bufferZone; // 버퍼존 + private String fltElev; // 비행고도 + private String createUserId; // 생성사용자ID + private LocalDateTime createDt; // 생성일시 + private String updateUserId; // 수정사용자ID + private LocalDateTime updateDt; // 수정일시 + + public static FltPlanAreaDTO toDto(BasLaancAreaModel model){ + FltPlanAreaDTO dto = new FltPlanAreaDTO(); + dto.setPlanAreaSno(model.getPlanAreaSno()); + dto.setPlanSno(model.getPlanSno()); + dto.setAreaType(model.getAreaType()); + dto.setFltMethod(model.getFltMethod()); + dto.setFltMothoeRm(model.getFltMothoeRm()); + dto.setBufferZone(model.getBufferZone()); + dto.setFltElev(model.getFltElev()); + dto.setCreateUserId(model.getCreateUserId()); + dto.setCreateDt(model.getCreateDt()); + dto.setUpdateUserId(model.getUpdateUserId()); + dto.setUpdateDt(model.getUpdateDt()); + + return dto; + } + + public static FltPlanArea toEntity(FltPlanAreaDTO dto){ + return FltPlanArea.builder() + .planAreaSno(dto.getPlanAreaSno()) + .planSno(dto.getPlanSno()) + .areaType(dto.getAreaType()) + .fltMethod(dto.getFltMethod().getCode()) + .fltMothoeRm(dto.getFltMothoeRm()) + .fltAreaAddr(dto.getFltAreaAddr()) + .bufferZone(dto.getBufferZone()) + .fltElev(dto.getFltElev()) + .createUserId(dto.getCreateUserId()) + .createDt(dto.getCreateDt()) + .updateUserId(dto.getUpdateUserId()) + .updateDt(dto.getUpdateDt()) + .build(); + } +} diff --git a/web/api-flight/src/main/java/kr/co/palnet/kac/api/v1/flight/laanc/model/FltPlanBasDTO.java b/web/api-flight/src/main/java/kr/co/palnet/kac/api/v1/flight/laanc/model/FltPlanBasDTO.java new file mode 100644 index 0000000..a7f8d5d --- /dev/null +++ b/web/api-flight/src/main/java/kr/co/palnet/kac/api/v1/flight/laanc/model/FltPlanBasDTO.java @@ -0,0 +1,88 @@ +package kr.co.palnet.kac.api.v1.flight.laanc.model; + +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.CreatePlanRQ; +import kr.co.palnet.kac.data.flt.model.FltPlanBas; +import lombok.Data; + +import java.time.LocalDateTime; + +@Data +public class FltPlanBasDTO { + + private Integer planSno; + private String groupId; // 그룹ID + private Long cstmrSno; // 고객일련번호 + private String serviceType; // 서비스구분 + 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 corpRegYn; // 사업자여부 + private String aprvlYn; // 승인여부 + private LocalDateTime aprvlDt; // 승인일시 + private String delYn; // 삭제여부 + private Long fileGroupNo; // 파일그룹번호 + private String createUserId; // 생성사용자ID + private LocalDateTime createDt; // 생성일시 + private String updateUserId; // 수정사용자ID + private LocalDateTime updateDt; // 수정일시 + + + public static FltPlanBasDTO toFltPlanBasDto(CstmrModel model, CreatePlanRQ rq){ + FltPlanBasDTO dto = new FltPlanBasDTO(); + dto.setCstmrSno(model.getCstmrSno()); + dto.setMemberName(model.getMemberName()); + dto.setEmail(model.getEmail()); + dto.setHpno(model.getHpno()); + dto.setClncd(model.getClncd()); + dto.setAddr(model.getAddr()); + dto.setAddrDtlCn(model.getAddrDtlCn()); + dto.setZip(model.getZip()); + dto.setSchFltStDt(rq.getSchFltStDt()); + dto.setSchFltEndDt(rq.getSchFltEndDt()); + dto.setFltPurpose(rq.getFltPurpose()); + dto.setFltType(rq.getFltType()); + + return dto; + } + + public static FltPlanBas toFltPlanEntity(FltPlanBasDTO dto){ + return FltPlanBas.builder() + .planSno(dto.getCstmrSno()) + .groupId(dto.getGroupId()) + .cstmrSno(dto.getCstmrSno()) + .serviceType(dto.getServiceType()) + .memberName(dto.getMemberName()) + .email(dto.getEmail()) + .hpno(dto.getHpno()) + .clncd(dto.getClncd()) + .addr(dto.getAddr()) + .addrDtlCn(dto.getAddrDtlCn()) + .zip(dto.getZip()) + .schFltStDt(dto.getSchFltStDt()) + .schFltEndDt(dto.getSchFltEndDt()) + .fltPurpose(dto.getFltPurpose().getCode()) + .fltType(dto.getFltType().getCode()) + .corpRegYn(dto.getCorpRegYn()) + .aprvlYn(dto.getAprvlYn()) + .aprvlDt(dto.getAprvlDt()) + .delYn(dto.getDelYn()) + .fileGroupNo(dto.getFileGroupNo()) + .createUserId(dto.getCreateUserId()) + .createDt(dto.getCreateDt()) + .updateUserId(dto.getUpdateUserId()) + .updateDt(dto.getUpdateDt()) + .build(); + } + + +} diff --git a/web/api-flight/src/main/java/kr/co/palnet/kac/api/v1/flight/laanc/model/FltPlanPilotDTO.java b/web/api-flight/src/main/java/kr/co/palnet/kac/api/v1/flight/laanc/model/FltPlanPilotDTO.java new file mode 100644 index 0000000..f222055 --- /dev/null +++ b/web/api-flight/src/main/java/kr/co/palnet/kac/api/v1/flight/laanc/model/FltPlanPilotDTO.java @@ -0,0 +1,72 @@ +package kr.co.palnet.kac.api.v1.flight.laanc.model; + +import jakarta.persistence.Column; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import kr.co.palnet.kac.data.flt.model.FltPlanPilot; +import lombok.Data; +import org.hibernate.annotations.CreationTimestamp; +import org.hibernate.annotations.UpdateTimestamp; + +import java.time.LocalDateTime; + +@Data +public class FltPlanPilotDTO { + + private Long planPilotSno; + private Long planSno; // 비행계획서일련번호 + private Long 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; // 생성사용자ID + private LocalDateTime createDt; // 생성일시 + private String updateUserId; // 수정사용자ID + private LocalDateTime updateDt; // 수정일시 + + public static FltPlanPilotDTO toDto(CstmrModel model){ + FltPlanPilotDTO dto = new FltPlanPilotDTO(); + dto.setCstmrSno(model.getCstmrSno()); + dto.setMemberName(model.getMemberName()); + dto.setEmail(model.getEmail()); + dto.setHpno(model.getHpno()); + dto.setClncd(model.getClncd()); + dto.setAddr(model.getAddr()); + dto.setAddrDtlCn(model.getAddrDtlCn()); + dto.setZip(model.getZip()); + + + return dto; + } + + public static FltPlanPilot toEntity(FltPlanPilotDTO dto){ + return FltPlanPilot.builder() + .planPilotSno(dto.getPlanPilotSno()) + .planSno(dto.getPlanSno()) + .cstmrSno(dto.getCstmrSno()) + .groupNm(dto.getGroupNm()) + .memberName(dto.getMemberName()) + .email(dto.getEmail()) + .hpno(dto.getHpno()) + .clncd(dto.getClncd()) + .addr(dto.getAddr()) + .addrDtlCn(dto.getAddrDtlCn()) + .zip(dto.getZip()) + .qlfcNo(dto.getQlfcNo()) + .carrer(dto.getCarrer()) + .createUserId(dto.getCreateUserId()) + .createDt(dto.getCreateDt()) + .updateUserId(dto.getUpdateUserId()) + .updateDt(dto.getUpdateDt()) + .build(); + } + +} diff --git a/web/api-flight/src/main/java/kr/co/palnet/kac/api/v1/flight/laanc/model/constant/ArcrftTypeCd.java b/web/api-flight/src/main/java/kr/co/palnet/kac/api/v1/flight/laanc/model/constant/ArcrftTypeCd.java new file mode 100644 index 0000000..8a9506e --- /dev/null +++ b/web/api-flight/src/main/java/kr/co/palnet/kac/api/v1/flight/laanc/model/constant/ArcrftTypeCd.java @@ -0,0 +1,31 @@ +package kr.co.palnet.kac.api.v1.flight.laanc.model.constant; + +import com.fasterxml.jackson.annotation.JsonCreator; +import lombok.Getter; + +@Getter +public enum ArcrftTypeCd { + + UNMANNED_AIRCRAFT("11", "무인비행기"), + UNMANNED_HELICOPTER("12", "무인헬리콤터"), + UNMANNED_MULTICOPTER("13", "무인멀티콥터"), + UNMANNED_AIRSHIP("21", "무인비행선"); + + private final String code; + private final String value; + + ArcrftTypeCd(String code, String value) { + this.code = code; + this.value = value; + } + + @JsonCreator + public static ArcrftTypeCd fromCode(String code) { + for (ArcrftTypeCd arcrftTypeCd : ArcrftTypeCd.values()) { + if (arcrftTypeCd.getCode().equals(code)) { + return arcrftTypeCd; + } + } + return null; + } +} diff --git a/web/api-flight/src/main/java/kr/co/palnet/kac/api/v1/flight/laanc/model/constant/ArcrftWghtCd.java b/web/api-flight/src/main/java/kr/co/palnet/kac/api/v1/flight/laanc/model/constant/ArcrftWghtCd.java new file mode 100644 index 0000000..35fc5ab --- /dev/null +++ b/web/api-flight/src/main/java/kr/co/palnet/kac/api/v1/flight/laanc/model/constant/ArcrftWghtCd.java @@ -0,0 +1,34 @@ +package kr.co.palnet.kac.api.v1.flight.laanc.model.constant; + +import com.fasterxml.jackson.annotation.JsonCreator; +import lombok.Getter; + +@Getter +public enum ArcrftWghtCd { + + W250G_LOE("7", "최대이륙중량 250g 이하"), + W250G_W2KG("8", "최대이륙중량 250g 초과 ~ 2kg 이하"), + W2KG_W7KG("9", "최대이륙중량 2kg 초과 ~ 7kg 이하"), + W7KG_W25KG("10", "최대이륙중량 7kg 초과 ~ 25kg 이하"), + W25KG_GO("11", "최대이륙중량 25kg 초과"), + W25KG_GO_TEST("12", "최대이륙중량 25kg 초과 (시험비행)"), + ; + + private final String code; + private final String value; + + ArcrftWghtCd(String code, String value) { + this.code = code; + this.value = value; + } + + @JsonCreator + public static ArcrftWghtCd fromCode(String code) { + for (ArcrftWghtCd arcrftWghtCd : ArcrftWghtCd.values()) { + if (arcrftWghtCd.getCode().equals(code)) { + return arcrftWghtCd; + } + } + return null; + } +} diff --git a/web/api-flight/src/main/java/kr/co/palnet/kac/api/v1/flight/laanc/model/constant/FltMethod.java b/web/api-flight/src/main/java/kr/co/palnet/kac/api/v1/flight/laanc/model/constant/FltMethod.java new file mode 100644 index 0000000..7d2c6c4 --- /dev/null +++ b/web/api-flight/src/main/java/kr/co/palnet/kac/api/v1/flight/laanc/model/constant/FltMethod.java @@ -0,0 +1,38 @@ +package kr.co.palnet.kac.api.v1.flight.laanc.model.constant; + +import com.fasterxml.jackson.annotation.JsonCreator; +import lombok.Getter; + +@Getter +public enum FltMethod { + + CLOCK_FLIGHT("01", "시계비행"), + AUTOMATIC_FLIGHT("02", "자동비행"), + CIRCLING_FLIGHT("03", "선회비행"), + INSTRUMENTAL_FLIGHT("04", "계기비행"), + GRID_FLIGHT("05", "격자비행"), + VERTICAL_TAKEOFF_AND_LANDING_FLIGHT("06", "수직이착륙비행"), + VISIBLE_FLIGHT("07", "가시권비행"), + HAND_OPERATED_FLIGHT("08", "수동조종비행"), + FLIGHT_IN_PLACE("09", "제자리비행"), + CLUSTER_FLIGHT("10", "군집비행"), + DIRECT_INPUT("11", "직접입력"); + + private final String code; + private final String value; + + FltMethod(String code, String value) { + this.code = code; + this.value = value; + } + + @JsonCreator + public static FltMethod fromCode(String code) { + for (FltMethod fltMethod : FltMethod.values()) { + if (fltMethod.getCode().equals(code)) { + return fltMethod; + } + } + return null; + } +} diff --git a/web/api-flight/src/main/java/kr/co/palnet/kac/api/v1/flight/laanc/model/constant/FltPurpose.java b/web/api-flight/src/main/java/kr/co/palnet/kac/api/v1/flight/laanc/model/constant/FltPurpose.java new file mode 100644 index 0000000..f587749 --- /dev/null +++ b/web/api-flight/src/main/java/kr/co/palnet/kac/api/v1/flight/laanc/model/constant/FltPurpose.java @@ -0,0 +1,44 @@ +package kr.co.palnet.kac.api.v1.flight.laanc.model.constant; + +import com.fasterxml.jackson.annotation.JsonCreator; +import lombok.Getter; + +@Getter +public enum FltPurpose { + + AIR_CONTROL("01","항공방제"), + TRAFFIC_MANAGEMENT("02","교통관리"), + LEISURE_FLIGHT("03","레저비행"), + TEST_FLIGHT("04","시험비행"), + AIR_ADVERTISING("05", "공중광고"), + EDUCATION_FLIGHT("06","교육비행"), + FLIGHT_DEMONSTRATION("07","비행시연"), + PESTICIDE_SPRAY("08","농약살포"), + FOREST_OBSERVATION("09","산림관측"), + TRANSPORTATION("10","수송"), + PHOTOGRAPHY_VIDEO_SHOOTING("11","사진/영상촬영"), + SEARCH_AND_RESCUE("12","수색구조"), + FLIGHT_TRAINING("13","비행훈련"), + FLIGHT_EDUCATION("14","비행교육"), + PILOT_FLIGHT("15","계도비행"), + AIR_SURVEYING("16","항공측량"), + FLIGHT_TEST("17","비행실기시험"); + + private final String code; + private final String value; + + FltPurpose(String code, String value) { + this.code = code; + this.value = value; + } + + @JsonCreator + public static FltPurpose fromCode(String code) { + for (FltPurpose fltPurpose : FltPurpose.values()) { + if (fltPurpose.getCode().equals(code)) { + return fltPurpose; + } + } + return null; + } +} diff --git a/web/api-flight/src/main/java/kr/co/palnet/kac/api/v1/flight/laanc/model/constant/FltType.java b/web/api-flight/src/main/java/kr/co/palnet/kac/api/v1/flight/laanc/model/constant/FltType.java new file mode 100644 index 0000000..bdcdf61 --- /dev/null +++ b/web/api-flight/src/main/java/kr/co/palnet/kac/api/v1/flight/laanc/model/constant/FltType.java @@ -0,0 +1,30 @@ +package kr.co.palnet.kac.api.v1.flight.laanc.model.constant; + +import com.fasterxml.jackson.annotation.JsonCreator; +import lombok.Getter; + +@Getter +public enum FltType { + + COMMERCIAL("COMMERCIAL", "상업용"), + NON_COMMERCIAL("NON_COMMERCIAL", "비상업용"); + + private final String code; + private final String value; + + + FltType(String code, String value) { + this.code = code; + this.value = value; + } + + @JsonCreator + public static FltType fromCode(String code) { + for (FltType fltType : FltType.values()) { + if (fltType.getCode().equals(code)) { + return fltType; + } + } + return null; + } +} diff --git a/web/api-flight/src/main/java/kr/co/palnet/kac/api/v1/flight/laanc/model/create/CreatePlanRQ.java b/web/api-flight/src/main/java/kr/co/palnet/kac/api/v1/flight/laanc/model/create/CreatePlanRQ.java new file mode 100644 index 0000000..96fb7b0 --- /dev/null +++ b/web/api-flight/src/main/java/kr/co/palnet/kac/api/v1/flight/laanc/model/create/CreatePlanRQ.java @@ -0,0 +1,56 @@ +package kr.co.palnet.kac.api.v1.flight.laanc.model.create; + +import io.swagger.v3.oas.annotations.media.Schema; +import kr.co.palnet.kac.api.v1.flight.laanc.model.AnctCstmrTermsModel; +import kr.co.palnet.kac.api.v1.flight.laanc.model.BasLaancArcrftModel; +import kr.co.palnet.kac.api.v1.flight.laanc.model.BasLaancAreaModel; +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.pliotvalid.PilotValidRs; +import lombok.Data; + +import java.time.LocalDateTime; +import java.util.List; + +@Data +public class CreatePlanRQ { + + @Schema(description = "비행계획서 일련번호", example = "1", hidden = true) + private Integer planSno; + + @Schema(description = "사용자 일련번호", example = "1", hidden = true) + private Integer cstmrSno; + + @Schema(description = "이름", example = "조종사") + private String memberName; + + @Schema(description = "비행유형", example = "COMMERCIAL") + private FltType fltType; // 비행유형 - 상업/비상업 ---- + + @Schema(description = "비행시작일시", example = "2024-02-12 09:00:00", implementation = String.class) + private LocalDateTime schFltStDt; // 시작일시 + + @Schema(description = "비행종료일시", example = "2024-02-12 10:00:00", implementation = String.class) + private LocalDateTime schFltEndDt; // 종료일시 + + @Schema(description = "비행목적", example = "17") + private FltPurpose fltPurpose; // 비행목적 ----- + + @Schema(description = "서비스구분", example = "KAC") + private String serviceType; // 고정 + + @Schema(hidden = true) + private String docState = "R"; + + + private List areaList; + // private List pilotList; + private List arcrftList; + + // 약관동의 + private List terms; + // laanc 정보 +// private BasLaancValidatedRs validatedRs; + + private List pilotValidRsList; // 자격여부 +} diff --git a/web/api-flight/src/main/java/kr/co/palnet/kac/api/v1/flight/laanc/model/create/CtrTrnsLctnModel.java b/web/api-flight/src/main/java/kr/co/palnet/kac/api/v1/flight/laanc/model/create/CtrTrnsLctnModel.java new file mode 100644 index 0000000..2a17ce0 --- /dev/null +++ b/web/api-flight/src/main/java/kr/co/palnet/kac/api/v1/flight/laanc/model/create/CtrTrnsLctnModel.java @@ -0,0 +1,16 @@ +package kr.co.palnet.kac.api.v1.flight.laanc.model.create; + +import lombok.Data; + +@Data +public class CtrTrnsLctnModel { + private Long hstryAreaSno; + private String area1; + private String area2; + private String area3; + private String zipCd; + private String landNm; + private String landNum; + private String areaType; + private String areaNm; +} diff --git a/web/api-flight/src/main/java/kr/co/palnet/kac/api/v1/flight/laanc/model/pliotvalid/PilotValidRq.java b/web/api-flight/src/main/java/kr/co/palnet/kac/api/v1/flight/laanc/model/pliotvalid/PilotValidRq.java new file mode 100644 index 0000000..f7d4b00 --- /dev/null +++ b/web/api-flight/src/main/java/kr/co/palnet/kac/api/v1/flight/laanc/model/pliotvalid/PilotValidRq.java @@ -0,0 +1,18 @@ +package kr.co.palnet.kac.api.v1.flight.laanc.model.pliotvalid; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class PilotValidRq { + @Schema(description = "조종사 ci - 본인인증", example = "dzT9zrm1JJRbrT1oRsUbvXYDfbAtXG5QOZjbIVHPaklSZ2PTw8ojYdJyeTrdQdtKIGFM5Z7xfrN/Crm6iGRLkA==") + private String pilotci; + @Schema(description = "기체신고번호", example = "C1CM0231251") + private String declarationnum; +} diff --git a/web/api-flight/src/main/java/kr/co/palnet/kac/api/v1/flight/laanc/model/pliotvalid/PilotValidRs.java b/web/api-flight/src/main/java/kr/co/palnet/kac/api/v1/flight/laanc/model/pliotvalid/PilotValidRs.java new file mode 100644 index 0000000..e6ff104 --- /dev/null +++ b/web/api-flight/src/main/java/kr/co/palnet/kac/api/v1/flight/laanc/model/pliotvalid/PilotValidRs.java @@ -0,0 +1,29 @@ +package kr.co.palnet.kac.api.v1.flight.laanc.model.pliotvalid; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class PilotValidRs { + + @Schema(description = "결과코드", example = "200") + private String rspCode; + @Schema(description = "결과메시지", example = "SUCCESS") + private String rspMessage; + @Schema(description = "조종사자격증명여부", example = "Y") + private String pilotcredentialyn; + @Schema(description = "기체보험가입여부", example = "Y") + private String arcrftinsuranceyn; + @Schema(description = "기체신고여부", example = "Y") + private String arcrftdeclaration; + @Schema(description = "사업자유무", example = "Y") + private String corpregyn; + + private PilotValidRq rq; +} 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 new file mode 100644 index 0000000..7b6e859 --- /dev/null +++ b/web/api-flight/src/main/java/kr/co/palnet/kac/api/v1/flight/laanc/service/FlightLaancService.java @@ -0,0 +1,152 @@ +package kr.co.palnet.kac.api.v1.flight.laanc.service; + +import kr.co.palnet.kac.api.v1.flight.laanc.model.CstmrModel; +import kr.co.palnet.kac.api.v1.flight.laanc.model.*; +import kr.co.palnet.kac.api.v1.flight.laanc.model.create.CreatePlanRQ; +import kr.co.palnet.kac.api.v1.flight.laanc.model.create.CtrTrnsLctnModel; +import kr.co.palnet.kac.config.security.util.SessionHelper; +import kr.co.palnet.kac.core.exception.BaseErrorCode; +import kr.co.palnet.kac.core.exception.BaseException; +import kr.co.palnet.kac.data.flt.model.FltPlanArea; +import kr.co.palnet.kac.data.flt.model.FltPlanBas; +import kr.co.palnet.kac.data.flt.service.FltPlanDomainService; +import kr.co.palnet.kac.data.pty.model.PtyCstmrBas; +import kr.co.palnet.kac.data.pty.model.PtyCstmrDtl; +import kr.co.palnet.kac.data.pty.model.PtyGroupBas; +import kr.co.palnet.kac.data.pty.service.PtyCstmrDomainService; +import kr.co.palnet.kac.data.pty.service.PtyGroupDomainService; +import kr.co.palnet.kac.external.CtrTrnsLctnService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDateTime; +import java.util.List; +import java.util.Optional; + +@Service +@Slf4j +@RequiredArgsConstructor +public class FlightLaancService { + + private final PtyCstmrDomainService ptyCstmrDomainService; + + private final PtyGroupDomainService ptyGroupDomainService; + + private final FltPlanDomainService fltPlanDomainService; + + private final CtrTrnsLctnService ctrTrnsLctnService; + + @Transactional + public void createPlan(CreatePlanRQ rq) { + + Long cstmrnSno = SessionHelper.getCstmrSno(); + String userId = SessionHelper.getUserId(); + + // 비행계획서 INSERT + Optional userEntityData = ptyCstmrDomainService.findPtyCstmrBasById(cstmrnSno); + Optional userDetailEntityData = ptyCstmrDomainService.findPtyCstmrDtlById(cstmrnSno); + + if(userEntityData.isEmpty() || userDetailEntityData.isEmpty()) throw new BaseException(BaseErrorCode.DATA_EMPTY); + + CstmrModel cstmrInfo = CstmrModel.toModel(userEntityData.get(), userDetailEntityData.get()); + FltPlanBasDTO fltPlanBasDto = FltPlanBasDTO.toFltPlanBasDto(cstmrInfo, rq); + + fltPlanBasDto.setDelYn("N"); + fltPlanBasDto.setAprvlYn("Y"); + fltPlanBasDto.setAprvlDt(LocalDateTime.now()); + fltPlanBasDto.setCreateUserId(userId); + fltPlanBasDto.setUpdateUserId(userId); + + // KAC 그룹 ID - LAANC에서는 KAC 그룹으로만 보여주도록 함. + String groupId = ""; + String groupNm = ""; + + Optional> kacData = ptyGroupDomainService.findByGroupNm("KAC"); + + if (kacData.isPresent()) { + List kac = kacData.get(); + groupId = kac.get(0).getGroupId(); + groupNm = kac.get(0).getGroupNm(); + } + + fltPlanBasDto.setGroupId(groupId); + + String corpRegYn = "N"; + if (rq.getPilotValidRsList() != null && !rq.getPilotValidRsList().isEmpty()) { + boolean isCorpReg = rq.getPilotValidRsList().stream().anyMatch(pilotValidRs -> "Y".equals(pilotValidRs.getCorpregyn())); + corpRegYn = isCorpReg ? "Y" : "N"; + } + fltPlanBasDto.setCorpRegYn(corpRegYn); // 사업자유무 + fltPlanBasDto.setServiceType("F0002"); + + FltPlanBas fltPlanBas = fltPlanDomainService.saveFltPlanBas(FltPlanBasDTO.toFltPlanEntity(fltPlanBasDto)); + Long planSno = fltPlanBas.getPlanSno(); + + // 비행구역 INSERT + List basLaancAreaModelList = rq.getAreaList(); + + if (basLaancAreaModelList != null && !basLaancAreaModelList.isEmpty()) { + for (BasLaancAreaModel laancAreaModel : basLaancAreaModelList) { + // 주소 가져오기 + try { + double firstLat = laancAreaModel.getCoordList().get(0).getLat(); + double firstLon = laancAreaModel.getCoordList().get(0).getLon(); + CtrTrnsLctnModel ctrTrnsLctnModel = ctrTrnsLctnService.convertLatlonToAddress(firstLat, firstLon); + String address = ctrTrnsLctnModel.getArea1() + " " + + ctrTrnsLctnModel.getArea2() + " " + + ctrTrnsLctnModel.getLandNm() + " " + + ctrTrnsLctnModel.getLandNum(); + laancAreaModel.setFltAreaAddr(address); + } catch (Exception e) { + log.error("get first coords to address fail. : ", e); + } + + FltPlanAreaDTO fltPlanAreaDto = FltPlanAreaDTO.toDto(laancAreaModel); + fltPlanAreaDto.setPlanSno(planSno); + fltPlanAreaDto.setCreateUserId(userId); + fltPlanAreaDto.setUpdateUserId(userId); + + FltPlanArea fltPlanArea = fltPlanDomainService.saveFltPlanArea(FltPlanAreaDTO.toEntity(fltPlanAreaDto)); + + Long planAreaSno = fltPlanArea.getPlanAreaSno(); + List laancAreaModelCoordList = laancAreaModel.getCoordList(); + if (laancAreaModelCoordList != null && !laancAreaModelCoordList.isEmpty()) { +// double lat = laancAreaModelCoordList.get(0).getLat(); +// double lon = laancAreaModelCoordList.get(0).getLon(); + for (BasLaancAreaCoordModel basLaancAreaCoordModel : laancAreaModelCoordList) { + + FltPlanAreaCoordDTO coordEntityDto = FltPlanAreaCoordDTO.toDto(basLaancAreaCoordModel); + coordEntityDto.setPlanAreaSno(planAreaSno); + coordEntityDto.setCreateUserId(userId); + + fltPlanDomainService.saveFltPlanAreaCoord(FltPlanAreaCoordDTO.toEntity(coordEntityDto)); + } + } + } + } + + // 조종사 - 사용자 정보로 저장 + FltPlanPilotDTO planPilotDto = FltPlanPilotDTO.toDto(cstmrInfo); + planPilotDto.setPlanSno(planSno); + planPilotDto.setGroupNm(groupNm); + planPilotDto.setCreateUserId(userId); + planPilotDto.setCreateDt(LocalDateTime.now()); + planPilotDto.setUpdateUserId(userId); + planPilotDto.setUpdateDt(LocalDateTime.now()); + + fltPlanDomainService.saveFltPlanPilot(FltPlanPilotDTO.toEntity(planPilotDto)); + + // 기체정보 INSERT + List basLaancArcrftModelList = rq.getArcrftList(); + + if (basLaancArcrftModelList != null && !basLaancArcrftModelList.isEmpty()) { + for (BasLaancArcrftModel basLaancArcrftModel : basLaancArcrftModelList) { + + } + } + + } + +} diff --git a/web/api-flight/src/main/java/kr/co/palnet/kac/api/v1/flight/plan/controller/FlightPlanController.java b/web/api-flight/src/main/java/kr/co/palnet/kac/api/v1/flight/plan/controller/FlightPlanController.java new file mode 100644 index 0000000..2a6deb0 --- /dev/null +++ b/web/api-flight/src/main/java/kr/co/palnet/kac/api/v1/flight/plan/controller/FlightPlanController.java @@ -0,0 +1,19 @@ +package kr.co.palnet.kac.api.v1.flight.plan.controller; + +import kr.co.palnet.kac.api.v1.flight.plan.service.FlightPlanService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@Slf4j +@RequestMapping("/v1/flight/plan") +@RequiredArgsConstructor +public class FlightPlanController { + + private final FlightPlanService flightPlanService; + + + +} diff --git a/web/api-flight/src/main/java/kr/co/palnet/kac/api/v1/flight/plan/service/FlightPlanService.java b/web/api-flight/src/main/java/kr/co/palnet/kac/api/v1/flight/plan/service/FlightPlanService.java new file mode 100644 index 0000000..74dba90 --- /dev/null +++ b/web/api-flight/src/main/java/kr/co/palnet/kac/api/v1/flight/plan/service/FlightPlanService.java @@ -0,0 +1,11 @@ +package kr.co.palnet.kac.api.v1.flight.plan.service; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +@Service +@Slf4j +@RequiredArgsConstructor +public class FlightPlanService { +} diff --git a/web/api-flight/src/main/java/kr/co/palnet/kac/external/CtrTrnsLctnService.java b/web/api-flight/src/main/java/kr/co/palnet/kac/external/CtrTrnsLctnService.java new file mode 100644 index 0000000..01bb9ac --- /dev/null +++ b/web/api-flight/src/main/java/kr/co/palnet/kac/external/CtrTrnsLctnService.java @@ -0,0 +1,133 @@ +package kr.co.palnet.kac.external; + +import kr.co.palnet.kac.api.v1.flight.laanc.model.create.CtrTrnsLctnModel; +import kr.co.palnet.kac.core.exception.BaseErrorCode; +import kr.co.palnet.kac.util.ObjectMapperUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.*; +import org.springframework.http.HttpStatus; +import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; +import org.springframework.stereotype.Service; +import org.springframework.web.client.RestTemplate; +import org.springframework.web.util.UriComponents; +import org.springframework.web.util.UriComponentsBuilder; + +import java.util.List; +import java.util.Map; + +@Service +public class CtrTrnsLctnService { + @Value("${naver.api.url}") + private String NAVER_API_URL; + + @Value("${naver.api.id}") + private String NAVER_API_ID; + + @Value("${naver.api.key}") + private String NAVER_API_KEY; + + private Logger logger = LoggerFactory.getLogger(getClass()); + + /** + * 위치에 맞는 값에 대한 주소로 변환하는 기능. + * @param lat + * @param lon + * @return + */ + public CtrTrnsLctnModel convertLatlonToAddress(double lat , double lon) { + HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory(); + factory.setConnectTimeout(5000); //타임아웃 설정 5초 + factory.setConnectionRequestTimeout(5000);//타임아웃 설정 5초 + RestTemplate restTemplate = new RestTemplate(factory); + + HttpHeaders header = new HttpHeaders(); + header.add("X-NCP-APIGW-API-KEY-ID", NAVER_API_ID); + header.add("X-NCP-APIGW-API-KEY", NAVER_API_KEY); + HttpEntity entity = new HttpEntity<>(header); + + UriComponents uri = UriComponentsBuilder.fromHttpUrl(NAVER_API_URL) + .queryParam("request", "coordsToaddr") + .queryParam("coords", lon + "," + lat) + .queryParam("sourcecrs", "epsg:4326") + .queryParam("output", "json") +// .queryParam("orders", "roadaddr") + .queryParam("orders", "addr,roadaddr") + .build(); + + ResponseEntity resultMap = restTemplate.exchange(uri.toString(), HttpMethod.GET, entity, Map.class); + + HttpStatusCode rsStatus = resultMap.getStatusCode(); + if(rsStatus != HttpStatus.OK){ + logger.debug("response error occurs."); + return null; + } + + Map body = resultMap.getBody(); + Map apiStatus = (Map)body.get("status"); + + try { + logger.debug(ObjectMapperUtils.getObjectMapper().writeValueAsString(body)); + } catch (Exception e){ + logger.error("",e); + } + + String name = (String)apiStatus.get("name"); + if(!"ok".equals(name)){ + if(apiStatus != null){ + logger.debug("get aera api response error occurs. : {}/{}", name, apiStatus.get("message")); + }else{ + logger.debug("get aera api response error occurs."); + } +// logger.debug("{}\t/{}\t/{}\t/{}\t/{}", dto.getUserSno(), dto.getLctSno(), dto.getLat(), dto.getLon(), dto.getCreatDt()); + logger.debug(BaseErrorCode.FAILED.message()); + return null; +// throw new CustomException(ErrorCode.FAIL); + } + + CtrTrnsLctnModel model = new CtrTrnsLctnModel(); + + List results = (List)body.get("results"); + + // 리스트에서 도로명 타입의 검색결과가 있는지 확인 + // 있을 경우 해당 인덱스로 area 주소 반환 + int typeIndex = -1; + for(Object result : results){ + typeIndex++; + if("roadaddr".equals(((Map) result).get("name"))) break; + } + if(typeIndex < 0) { + logger.debug(BaseErrorCode.DATA_EMPTY.message()); + return null; + } + Map result = (Map)results.get(typeIndex); + result.forEach((resultKey, resultValue) -> { +// log.debug(">>> resultKey / resultValue : {} / {}",resultKey, resultValue); + if("region".equals(resultKey)){ + model.setArea1(((Map)((Map)resultValue).get("area1")).get("name").toString()); + model.setArea2(((Map)((Map)resultValue).get("area2")).get("name").toString()); + model.setArea3(((Map)((Map)resultValue).get("area3")).get("name").toString()); + } + if("land".equals(resultKey)){ + String landNum = ((Map)resultValue).get("number1").toString(); + if(!"".equals(((Map)resultValue).get("number2").toString())){ + landNum += "-" + ((Map)resultValue).get("number2").toString(); + } + model.setLandNum(landNum); + if(((Map)resultValue).containsKey("name")){ + model.setLandNm(((Map)resultValue).get("name").toString()); + }else{ + model.setLandNm(""); + } + model.setZipCd(((Map)((Map)resultValue).get("addition1")).get("value").toString()); + model.setAreaType(((Map)((Map)resultValue).get("addition0")).get("type").toString()); + model.setAreaNm(((Map)((Map)resultValue).get("addition0")).get("value").toString()); + } + }); + + return model; + + } + +} diff --git a/web/security/src/main/java/kr/co/palnet/kac/config/security/util/JwtUtil.java b/web/security/src/main/java/kr/co/palnet/kac/config/security/util/JwtUtil.java index ef5f1a8..f67a136 100644 --- a/web/security/src/main/java/kr/co/palnet/kac/config/security/util/JwtUtil.java +++ b/web/security/src/main/java/kr/co/palnet/kac/config/security/util/JwtUtil.java @@ -15,7 +15,7 @@ public class JwtUtil { // TODO key는 properties에서 가져올수 있도록 처리 private static final Algorithm ALGORITHM = Algorithm.HMAC512("pal-networks"); // 1시간 - private static final long AUTH_TIME = 60 * 60; + private static final long AUTH_TIME = 60 * 600; // 7일 private static final long REFRESH_TIME = 60 * 60 * 24 * 7;