From 63b665c9e863dc94176cbea43af1641e47935eab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?lkd9125=28=EC=9D=B4=EA=B2=BD=EB=8F=84=29?= Date: Mon, 26 Feb 2024 16:59:21 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20PlanController=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=BD=94=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../flt/laanc/FlightLaancControllerTest.java | 35 ++- .../flt/plan/FlightPlanControllerTest.java | 255 ++++++++++++++++++ .../ctr/service/CtrCntrlDomainService.java | 8 + .../kac/data/flt/model/FltPlanArea.java | 2 +- .../flight/laanc/model/FltPlanPilotDTO.java | 23 ++ .../model/create/BasLaancAreaCoordModel.java | 13 + .../laanc/service/FlightLaancService.java | 54 +++- .../v1/flight/plan/model/CtrCntrlBasDTO.java | 55 ++++ .../plan/service/FlightPlanService.java | 12 +- 9 files changed, 438 insertions(+), 19 deletions(-) create mode 100644 app/kac-app/src/test/java/kr/co/palnet/kac/flt/plan/FlightPlanControllerTest.java create mode 100644 web/api-flight/src/main/java/kr/co/palnet/kac/api/v1/flight/plan/model/CtrCntrlBasDTO.java diff --git a/app/kac-app/src/test/java/kr/co/palnet/kac/flt/laanc/FlightLaancControllerTest.java b/app/kac-app/src/test/java/kr/co/palnet/kac/flt/laanc/FlightLaancControllerTest.java index c9aeff4..a6a510e 100644 --- a/app/kac-app/src/test/java/kr/co/palnet/kac/flt/laanc/FlightLaancControllerTest.java +++ b/app/kac-app/src/test/java/kr/co/palnet/kac/flt/laanc/FlightLaancControllerTest.java @@ -13,9 +13,6 @@ import org.springframework.http.MediaType; import org.springframework.restdocs.headers.HeaderDocumentation; import org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders; import org.springframework.restdocs.payload.JsonFieldType; -import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; -import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.security.core.userdetails.UserDetails; import org.springframework.transaction.annotation.Transactional; import java.util.UUID; @@ -104,9 +101,18 @@ public class FlightLaancControllerTest extends BaseTest { fieldWithPath("areaList[].updateUserId").type(JsonFieldType.STRING).description("수정자ID"), fieldWithPath("areaList[].updateDt").type(JsonFieldType.STRING).description("수정일시"), fieldWithPath("areaList[].docState").type(JsonFieldType.STRING).description("코드"), - fieldWithPath("areaList[].coordList").type(JsonFieldType.ARRAY).description("비행구역 좌표리스트").optional(), fieldWithPath("areaList[].bufferCoordList").type(JsonFieldType.ARRAY).description("비행 버퍼 좌표리스트").optional(), fieldWithPath("areaList[].fltMothoeRm").type(JsonFieldType.STRING).description("비행방식(기타)"), + fieldWithPath("areaList[].coordList").type(JsonFieldType.ARRAY).description("비행구역 좌표리스트").optional(), + + fieldWithPath("areaList[].coordList[].planAreaCoordSno").type(JsonFieldType.NUMBER).description("비행구역좌표 일련번호"), + fieldWithPath("areaList[].coordList[].planAreaSno").type(JsonFieldType.NUMBER).description("비행계획비행구역 일련번호"), + fieldWithPath("areaList[].coordList[].lat").type(JsonFieldType.NUMBER).description("위도"), + fieldWithPath("areaList[].coordList[].lon").type(JsonFieldType.NUMBER).description("경"), + fieldWithPath("areaList[].coordList[].createUserId").type(JsonFieldType.STRING).description("생성자ID"), + fieldWithPath("areaList[].coordList[].createDt").type(JsonFieldType.STRING).description("생성일시"), + fieldWithPath("areaList[].coordList[].docState").type(JsonFieldType.STRING).description("코드"), + fieldWithPath("arcrftList").type(JsonFieldType.ARRAY).description("비행기체 리스트"), fieldWithPath("arcrftList[].planArcrftSno").type(JsonFieldType.NUMBER).description("계획서 기체 일련번호"), @@ -141,7 +147,26 @@ public class FlightLaancControllerTest extends BaseTest { fieldWithPath("arcrftList[].corporationNm").type(JsonFieldType.STRING).description("법인명").optional(), fieldWithPath("arcrftList[].arcrftWghtCd").type(JsonFieldType.STRING).description("자체중량코드"), - fieldWithPath("pilotList").type(JsonFieldType.ARRAY).description("공문URL").optional(), + fieldWithPath("pilotList").type(JsonFieldType.ARRAY).description("조종자 정보 리스트").optional(), + fieldWithPath("pilotList[].planPilotSno").type(JsonFieldType.NUMBER).description("조종자 일련번호"), + fieldWithPath("pilotList[].planSno").type(JsonFieldType.NUMBER).description("비행계획서일련번호"), + fieldWithPath("pilotList[].cstmrSno").type(JsonFieldType.NUMBER).description("고객일련번호"), + fieldWithPath("pilotList[].groupNm").type(JsonFieldType.STRING).description("그룹명"), + fieldWithPath("pilotList[].memberName").type(JsonFieldType.STRING).description("회원이름"), + fieldWithPath("pilotList[].email").type(JsonFieldType.STRING).description("이메일"), + fieldWithPath("pilotList[].hpno").type(JsonFieldType.STRING).description("휴대폰번"), + fieldWithPath("pilotList[].clncd").type(JsonFieldType.STRING).description("국가전화번호"), + fieldWithPath("pilotList[].addr").type(JsonFieldType.STRING).description("주소").optional(), + fieldWithPath("pilotList[].addrDtlCn").type(JsonFieldType.STRING).description("주소 상세내용").optional(), + fieldWithPath("pilotList[].zip").type(JsonFieldType.STRING).description("우편번호").optional(), + fieldWithPath("pilotList[].qlfcNo").type(JsonFieldType.STRING).description("자격번호").optional(), + fieldWithPath("pilotList[].carrer").type(JsonFieldType.STRING).description("경력").optional(), + fieldWithPath("pilotList[].createUserId").type(JsonFieldType.STRING).description("생성자ID"), + fieldWithPath("pilotList[].createDt").type(JsonFieldType.STRING).description("생성일시"), + fieldWithPath("pilotList[].updateUserId").type(JsonFieldType.STRING).description("수정자ID"), + fieldWithPath("pilotList[].updateDt").type(JsonFieldType.STRING).description("수정일시"), + + fieldWithPath("arcrftWght").type(JsonFieldType.STRING).description("기체 중량설명"), fieldWithPath("elev").type(JsonFieldType.STRING).description("비행고도") ) diff --git a/app/kac-app/src/test/java/kr/co/palnet/kac/flt/plan/FlightPlanControllerTest.java b/app/kac-app/src/test/java/kr/co/palnet/kac/flt/plan/FlightPlanControllerTest.java new file mode 100644 index 0000000..329113f --- /dev/null +++ b/app/kac-app/src/test/java/kr/co/palnet/kac/flt/plan/FlightPlanControllerTest.java @@ -0,0 +1,255 @@ +package kr.co.palnet.kac.flt.plan; + +import kr.co.palnet.kac.BaseTest; +import kr.co.palnet.kac.api.v1.flight.laanc.model.FltPlanBasDTO; +import kr.co.palnet.kac.api.v1.flight.laanc.model.create.CreateLaancPlanRQ; +import kr.co.palnet.kac.api.v1.flight.laanc.service.FlightLaancService; +import kr.co.palnet.kac.api.v1.flight.plan.model.CtrCntrlBasDTO; +import kr.co.palnet.kac.api.v1.flight.plan.service.FlightPlanService; +import kr.co.palnet.kac.util.ObjectMapperUtils; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.MediaType; +import org.springframework.restdocs.headers.HeaderDocumentation; +import org.springframework.restdocs.payload.JsonFieldType; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDate; +import java.time.LocalDateTime; + +import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document; +import static org.springframework.restdocs.operation.preprocess.Preprocessors.preprocessResponse; +import static org.springframework.restdocs.operation.preprocess.Preprocessors.prettyPrint; +import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath; +import static org.springframework.restdocs.payload.PayloadDocumentation.responseFields; +import static org.springframework.restdocs.request.RequestDocumentation.*; +import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +import static org.springframework.restdocs.payload.PayloadDocumentation.*; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; + +public class FlightPlanControllerTest extends BaseTest { + + @Autowired + private FlightLaancService flightLaancService; + + @Autowired + private FlightPlanService flightPlanService; + + private final String BASE_URL = "/v1/flight/plan"; + + private final String GRANT_TYPE = "Bearer"; + + @DisplayName("비행 운항 스케줄 조회") + @Test + @Transactional + public void getPlanSchedule() throws Exception{ + String token = this.getUserToken(); + + LocalDate searchDate = LocalDate.now().plusDays(2); + + this.testCreateData(searchDate); + + this.mockMvc.perform( + get(this.BASE_URL + "/schedule") + .param("searchDate", searchDate.toString()) + .accept(MediaType.APPLICATION_JSON_VALUE) + .header("Authorization", GRANT_TYPE + " " + token) + ) + .andDo(print()) + .andDo( + document( + "flight/plan/schedule", + preprocessResponse(prettyPrint()), + HeaderDocumentation.requestHeaders( + HeaderDocumentation.headerWithName("Authorization").description("Access토큰 [로그인 발급]") + ), + queryParameters( + parameterWithName("searchDate").description("검색일자") + ), + responseFields( + fieldWithPath("[].groupId").type(JsonFieldType.STRING).description("그룹아이디").optional(), + fieldWithPath("[].groupNm").type(JsonFieldType.STRING).description("그룹 명").optional(), + fieldWithPath("[].ownerNm").type(JsonFieldType.STRING).description("기체 소유자 이름").optional(), + fieldWithPath("[].idntfNum").type(JsonFieldType.STRING).description("기체 식별번호"), + fieldWithPath("[].startAddress").type(JsonFieldType.STRING).description("비행시작 주소").optional(), + fieldWithPath("[].endAddress").type(JsonFieldType.STRING).description("비행종료 주소").optional(), + fieldWithPath("[].schFltStDt").type(JsonFieldType.STRING).description("비행계획서 시작일").optional(), + fieldWithPath("[].schFltEndDt").type(JsonFieldType.STRING).description("비행계획서 종료일").optional(), + fieldWithPath("[].cntrlId").type(JsonFieldType.STRING).description("관제ID"), + fieldWithPath("[].cntrlStDt").type(JsonFieldType.STRING).description("비행 시작시간"), + fieldWithPath("[].cntrlEndDt").type(JsonFieldType.STRING).description("비행 종료시간"), + fieldWithPath("[].statusCd").type(JsonFieldType.STRING).description("스테이터스").optional() + ) + ) + ) + .andExpect(status().isOk()); + + } + + @DisplayName("비행 계획서 작성 - 버퍼존 생성") + @Test + @Transactional + public void createBuffer() throws Exception{ + String token = this.getUserToken(); + + String jsonRQ = """ + [ + { + "planAreaSno": 0, + "planSno": 0, + "areaType": "LINE", + "fltMethod": "", + "fltMothoeRm": "", + "bufferZone": 100, + "fltElev": 0, + "createUserId": "", + "createDt": "", + "updateUserId": "", + "updateDt": "", + "coordList": [ + { + "planAreaCoordSno": 0, + "planAreaSno": 0, + "lat": 37.53540376761919, + "lon": 126.70505084176824, + "createUserId": "", + "createDt": "" + }, + { + "planAreaCoordSno": 0, + "planAreaSno": 0, + "lat": 37.53254793498979, + "lon": 126.71167265598018, + "createUserId": "", + "createDt": "" + } + ] + } + ] + """; + + this.mockMvc.perform( + post(this.BASE_URL + "/area/buffer") + .contentType(MediaType.APPLICATION_JSON_VALUE) + .content(jsonRQ) + .accept(MediaType.APPLICATION_JSON_VALUE) + .header("Authorization", GRANT_TYPE + " " + token) + ) + .andDo(print()) + .andDo( + document( + "flight/plan/area/buffer", + preprocessResponse(prettyPrint()), + HeaderDocumentation.requestHeaders( + HeaderDocumentation.headerWithName("Authorization").description("Access토큰 [로그인 발급]") + ), + requestFields( + fieldWithPath("[].planAreaSno").type(JsonFieldType.NUMBER).description("비행구역 일련번호").optional(), + fieldWithPath("[].planSno").type(JsonFieldType.NUMBER).description("비행계획서 일련번호").optional(), + fieldWithPath("[].areaType").type(JsonFieldType.STRING).description("비행구역 생성타입"), + fieldWithPath("[].fltMethod").type(JsonFieldType.STRING).description("비행방식").optional(), + fieldWithPath("[].fltMothoeRm").type(JsonFieldType.STRING).description("비행방식(기타)").optional(), + fieldWithPath("[].bufferZone").type(JsonFieldType.NUMBER).description("버퍼존"), + fieldWithPath("[].fltElev").type(JsonFieldType.NUMBER).description("비행고도").optional(), + fieldWithPath("[].createUserId").type(JsonFieldType.STRING).description("생성자ID").optional(), + fieldWithPath("[].createDt").type(JsonFieldType.STRING).description("생성일시").optional(), + fieldWithPath("[].updateUserId").type(JsonFieldType.STRING).description("수정자ID").optional(), + fieldWithPath("[].updateDt").type(JsonFieldType.STRING).description("수정일시").optional(), + + fieldWithPath("[].coordList").type(JsonFieldType.ARRAY).description("좌표리스트"), + fieldWithPath("[].coordList[].planAreaCoordSno").type(JsonFieldType.NUMBER).description("비행구역좌표 일련번호").optional(), + fieldWithPath("[].coordList[].planAreaSno").type(JsonFieldType.NUMBER).description("비행계획비행구역 일련번호").optional(), + fieldWithPath("[].coordList[].lat").type(JsonFieldType.NUMBER).description("위도 [ ex -> 37.53540376761919 ] "), + fieldWithPath("[].coordList[].lon").type(JsonFieldType.NUMBER).description("경도 [ ex -> 126.70505084176824 ]"), + fieldWithPath("[].coordList[].createUserId").type(JsonFieldType.STRING).description("생성자ID").optional(), + fieldWithPath("[].coordList[].createDt").type(JsonFieldType.STRING).description("생성일시").optional() + ), + responseFields( + fieldWithPath("[].planAreaSno").type(JsonFieldType.NUMBER).description("비행구역 일련번호").optional(), + fieldWithPath("[].planSno").type(JsonFieldType.NUMBER).description("비행계획서 일련번호").optional(), + fieldWithPath("[].areaType").type(JsonFieldType.STRING).description("비행구역 생성타입"), + fieldWithPath("[].fltMethod").type(JsonFieldType.STRING).description("비행방식").optional(), + fieldWithPath("[].fltAreaAddr").type(JsonFieldType.STRING).description("비행지역주소").optional(), + fieldWithPath("[].fltMothoeRm").type(JsonFieldType.STRING).description("비행방식(기타)").optional(), + fieldWithPath("[].bufferZone").type(JsonFieldType.NUMBER).description("버퍼존"), + fieldWithPath("[].fltElev").type(JsonFieldType.STRING).description("비행고도").optional(), + fieldWithPath("[].createUserId").type(JsonFieldType.STRING).description("생성자ID").optional(), + fieldWithPath("[].createDt").type(JsonFieldType.STRING).description("생성일시").optional(), + fieldWithPath("[].updateUserId").type(JsonFieldType.STRING).description("수정자ID").optional(), + fieldWithPath("[].updateDt").type(JsonFieldType.STRING).description("수정일시").optional(), + fieldWithPath("[].docState").type(JsonFieldType.STRING).description("코드").optional(), + + fieldWithPath("[].bufferCoordList").type(JsonFieldType.ARRAY).description("좌표리스트"), + fieldWithPath("[].bufferCoordList[].planAreaCoordSno").type(JsonFieldType.NUMBER).description("비행구역좌표 일련번호").optional(), + fieldWithPath("[].bufferCoordList[].planAreaSno").type(JsonFieldType.NUMBER).description("비행계획비행구역 일련번호").optional(), + fieldWithPath("[].bufferCoordList[].lat").type(JsonFieldType.NUMBER).description("위도 [ ex -> 37.53540376761919 ] "), + fieldWithPath("[].bufferCoordList[].lon").type(JsonFieldType.NUMBER).description("경도 [ ex -> 126.70505084176824 ]"), + fieldWithPath("[].bufferCoordList[].createUserId").type(JsonFieldType.STRING).description("생성자ID").optional(), + fieldWithPath("[].bufferCoordList[].createDt").type(JsonFieldType.STRING).description("생성자ID").optional(), + fieldWithPath("[].bufferCoordList[].docState").type(JsonFieldType.STRING).description("코드").optional(), + + fieldWithPath("[].coordList").type(JsonFieldType.ARRAY).description("좌표리스트"), + fieldWithPath("[].coordList[].planAreaCoordSno").type(JsonFieldType.NUMBER).description("비행구역좌표 일련번호").optional(), + fieldWithPath("[].coordList[].planAreaSno").type(JsonFieldType.NUMBER).description("비행계획비행구역 일련번호").optional(), + fieldWithPath("[].coordList[].lat").type(JsonFieldType.NUMBER).description("위도 [ ex -> 37.53540376761919 ] "), + fieldWithPath("[].coordList[].lon").type(JsonFieldType.NUMBER).description("경도 [ ex -> 126.70505084176824 ]"), + fieldWithPath("[].coordList[].createUserId").type(JsonFieldType.STRING).description("생성자ID").optional(), + fieldWithPath("[].coordList[].createDt").type(JsonFieldType.STRING).description("생성자ID").optional(), + fieldWithPath("[].coordList[].docState").type(JsonFieldType.STRING).description("코드").optional() + ) + ) + ) + .andExpect(status().isOk()); + } + + + private FltPlanBasDTO testCreateData(LocalDate searchData){ + + LocalDateTime plusOneDay = LocalDateTime.now().plusDays(1); + LocalDateTime plusThreeDay = LocalDateTime.now().plusDays(3); + + String jsonRQ = "{\"cstmrSno\": 3,\"fltType\": \"COMMERCIAL\",\"schFltStDt\": \"%s\",\"schFltEndDt\": \"%s\",\"fltPurpose\": \"06\",\"serviceType\": \"KAC\",\"areaList\" : [{\"areaType\": \"LINE\",\"fltMethod\": \"02\",\"fltMothoeRm\": \"\",\"bufferZone\": \"100\",\"fltElev\": \"100\",\"coordList\": [{\"lat\": 37.51625845252909,\"lon\": 126.72340194011286},{\"lat\": 37.512215014051776,\"lon\": 126.72058946300956},{\"lat\": 37.51123897883966,\"lon\": 126.72463239884405}]}],\"arcrftList\" : [{\"idntfNum\": \"PA0001\",\"groupNm\": \"\",\"prdctNum\": \"\",\"arcrftTypeCd\": \"11\",\"arcrftModelNm\": \"\",\"prdctCmpnNm\": \"\",\"prdctDate\": \"\",\"arcrftLngth\": 0,\"arcrftWghtCd\": \"8\",\"arcrftHght\": 0,\"arcrftWght\": 0,\"wghtTypeCd\": \"\",\"imageUrl\": \"\",\"takeoffWght\": 0,\"useYn\": \"\",\"cameraYn\": \"\",\"insrncYn\": \"\",\"ownerNm\": \"\"}],\"terms\": []}" + .trim() + .formatted(plusOneDay.toString(), plusThreeDay.toString()); + + CreateLaancPlanRQ rq; + + FltPlanBasDTO result = new FltPlanBasDTO(); + try{ + rq = ObjectMapperUtils.getObjectMapper().readValue(jsonRQ, CreateLaancPlanRQ.class); + flightLaancService.createPlan(rq); + result = flightLaancService.testDescPlanSno(); + + LocalDateTime ctEndDt = searchData.atStartOfDay().plusHours(2); + LocalDateTime ctStDt = searchData.atStartOfDay(); + + CtrCntrlBasDTO ctrCntrlBasDTO = new CtrCntrlBasDTO(); + ctrCntrlBasDTO.setAvrgSpeed(0.0); + ctrCntrlBasDTO.setBttrCnsmptn(null); + ctrCntrlBasDTO.setTtlDstnc(33.30811254417446); + ctrCntrlBasDTO.setTtlTime(0.0); + ctrCntrlBasDTO.setCntrlEndDt(ctEndDt); + ctrCntrlBasDTO.setCntrlStDt(ctStDt); + ctrCntrlBasDTO.setCreateDt(LocalDateTime.now()); + ctrCntrlBasDTO.setFlghtEndDt(null); + ctrCntrlBasDTO.setFlghtStDt(null); + ctrCntrlBasDTO.setUpdateDt(LocalDateTime.now()); + ctrCntrlBasDTO.setEndTypeCd("01"); + ctrCntrlBasDTO.setObjectTypeCd("DRON"); + ctrCntrlBasDTO.setStatusCd("99"); + ctrCntrlBasDTO.setTtlDstncType("M"); + ctrCntrlBasDTO.setTtlTimeType(null); + ctrCntrlBasDTO.setIdntfNum("PA0001"); + ctrCntrlBasDTO.setCntrlId("00121354-7c41-4637-8283-c34c508625ac"); + ctrCntrlBasDTO.setProcStatusYn("N"); + + flightPlanService.testCreateCtrCntrlBas(ctrCntrlBasDTO); + } catch (Exception e){ + e.printStackTrace(); + } + + return result; + } +} diff --git a/data/ctr/src/main/java/kr/co/palnet/kac/data/ctr/service/CtrCntrlDomainService.java b/data/ctr/src/main/java/kr/co/palnet/kac/data/ctr/service/CtrCntrlDomainService.java index acc8b7d..bc236c0 100644 --- a/data/ctr/src/main/java/kr/co/palnet/kac/data/ctr/service/CtrCntrlDomainService.java +++ b/data/ctr/src/main/java/kr/co/palnet/kac/data/ctr/service/CtrCntrlDomainService.java @@ -1,7 +1,9 @@ package kr.co.palnet.kac.data.ctr.service; +import kr.co.palnet.kac.data.ctr.model.CtrCntrlBas; import kr.co.palnet.kac.data.ctr.model.join.CntrlJoinHstryAreaModel; import kr.co.palnet.kac.data.ctr.repository.CtrCntrlBasQueryRepository; +import kr.co.palnet.kac.data.ctr.repository.CtrCntrlBasRepository; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -15,12 +17,18 @@ import java.util.Optional; @RequiredArgsConstructor public class CtrCntrlDomainService { + private final CtrCntrlBasRepository ctrCntrlBasRepository; + private final CtrCntrlBasQueryRepository ctrCntrlBasQueryRepository; public Optional> findCntrlJoinHstryAreaByIdntfNumAndSearchDate(String idntfNum, LocalDateTime schFltStDt, LocalDateTime schFltEndDt){ return ctrCntrlBasQueryRepository.findByIdntfNumAndSearchDate(idntfNum, schFltStDt, schFltEndDt); } + public CtrCntrlBas saveCtrCntrlBas(CtrCntrlBas entity){ + return ctrCntrlBasRepository.save(entity); + } + 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 670b10d..9dc8fb0 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 @@ -82,7 +82,7 @@ public class FltPlanArea { @ManyToOne(fetch = FetchType.LAZY) private FltPlanBas fltPlanBas; - @OneToMany(mappedBy = "fltPlanArea", fetch = FetchType.LAZY) + @OneToMany(mappedBy = "fltPlanArea", fetch = FetchType.LAZY, cascade = CascadeType.ALL) private List fltPlanAreaCoordList; } 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 index 3cea6d6..5907e4b 100644 --- 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 @@ -39,6 +39,29 @@ public class FltPlanPilotDTO { return dto; } + public static FltPlanPilotDTO toDto(FltPlanPilot entity){ + FltPlanPilotDTO dto = new FltPlanPilotDTO(); + dto.setPlanPilotSno(entity.getPlanPilotSno()); + dto.setPlanSno(entity.getPlanSno()); + dto.setCstmrSno(entity.getCstmrSno()); + dto.setGroupNm(entity.getGroupNm()); + dto.setMemberName(entity.getMemberName()); + dto.setEmail(entity.getEmail()); + dto.setHpno(entity.getHpno()); + dto.setClncd(entity.getClncd()); + dto.setAddr(entity.getAddr()); + dto.setAddrDtlCn(entity.getAddrDtlCn()); + dto.setZip(entity.getZip()); + dto.setQlfcNo(entity.getQlfcNo()); + dto.setCarrer(entity.getCarrer()); + dto.setCreateUserId(entity.getCreateUserId()); + dto.setCreateDt(entity.getCreateDt()); + dto.setUpdateUserId(entity.getUpdateUserId()); + dto.setUpdateDt(entity.getUpdateDt()); + + return dto; + } + public static FltPlanPilot toEntity(FltPlanPilotDTO dto){ return FltPlanPilot.builder() .planPilotSno(dto.getPlanPilotSno()) diff --git a/web/api-flight/src/main/java/kr/co/palnet/kac/api/v1/flight/laanc/model/create/BasLaancAreaCoordModel.java b/web/api-flight/src/main/java/kr/co/palnet/kac/api/v1/flight/laanc/model/create/BasLaancAreaCoordModel.java index ecf6409..a69d373 100644 --- a/web/api-flight/src/main/java/kr/co/palnet/kac/api/v1/flight/laanc/model/create/BasLaancAreaCoordModel.java +++ b/web/api-flight/src/main/java/kr/co/palnet/kac/api/v1/flight/laanc/model/create/BasLaancAreaCoordModel.java @@ -1,6 +1,7 @@ package kr.co.palnet.kac.api.v1.flight.laanc.model.create; import io.swagger.v3.oas.annotations.media.Schema; +import kr.co.palnet.kac.data.flt.model.FltPlanAreaCoord; import lombok.Data; import java.time.LocalDateTime; @@ -28,4 +29,16 @@ public class BasLaancAreaCoordModel { @Schema(hidden = true) private String docState = "R"; + + public static BasLaancAreaCoordModel toModel(FltPlanAreaCoord entity){ + BasLaancAreaCoordModel model = new BasLaancAreaCoordModel(); + model.setPlanAreaCoordSno(entity.getPlanAreaCoordSno()); + model.setPlanAreaSno(entity.getPlanAreaSno()); + model.setLat(entity.getLat()); + model.setLon(entity.getLon()); + model.setCreateUserId(entity.getCreateUserId()); + model.setCreateDt(entity.getCreateDt()); + + return model; + } } 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 0762e30..73c5122 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 @@ -18,7 +18,7 @@ import kr.co.palnet.kac.api.v1.flight.laanc.model.valid.*; import kr.co.palnet.kac.data.com.domain.ComConfirmBas; import kr.co.palnet.kac.data.com.domain.ComFileBas; import kr.co.palnet.kac.data.com.service.ComConfirmDomainService; -import kr.co.palnet.kac.data.flt.model.FltPlanArcrft; +import kr.co.palnet.kac.data.flt.model.*; import kr.co.palnet.kac.data.other.service.OtherDomainService; import kr.co.palnet.kac.api.external.model.ComnSmsLaancAprovModel; import kr.co.palnet.kac.api.external.model.CtrTrnsLctnModel; @@ -27,8 +27,6 @@ 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.com.service.ComFileDomainService; -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; @@ -119,7 +117,9 @@ public class FlightLaancService { String groupId = ""; String groupNm = ""; - Optional> kacData = ptyGroupDomainService.findPtyGroupBasByGroupNm(rq.getServiceType()); +// Optional> kacData = ptyGroupDomainService.findPtyGroupBasByGroupNm(rq.getServiceType()); + // TODO :: 현재 모듈에서는 KAC 그룹이 생성되는 코드가 없기에 "" 값만 들어갈 예정임 + Optional> kacData = ptyGroupDomainService.findPtyGroupBasByGroupNm("KAC"); if (kacData.isPresent() && !kacData.get().isEmpty()) { List kac = kacData.get(); @@ -144,6 +144,9 @@ public class FlightLaancService { List basLaancAreaModelList = rq.getAreaList(); if (basLaancAreaModelList != null && !basLaancAreaModelList.isEmpty()) { + + List fltPlanAreaList = new ArrayList<>(); + for (BasLaancAreaModel laancAreaModel : basLaancAreaModelList) { // 주소 가져오기 try { @@ -171,16 +174,26 @@ public class FlightLaancService { if (laancAreaModelCoordList != null && !laancAreaModelCoordList.isEmpty()) { // double lat = laancAreaModelCoordList.get(0).getLat(); // double lon = laancAreaModelCoordList.get(0).getLon(); + + List fltPlanAreaCoordList = new ArrayList<>(); + for (BasLaancAreaCoordModel basLaancAreaCoordModel : laancAreaModelCoordList) { FltPlanAreaCoordDTO coordEntityDto = FltPlanAreaCoordDTO.toDto(basLaancAreaCoordModel); coordEntityDto.setPlanAreaSno(planAreaSno); coordEntityDto.setCreateUserId(userId); - fltPlanDomainService.saveFltPlanAreaCoord(FltPlanAreaCoordDTO.toEntity(coordEntityDto)); + FltPlanAreaCoord fltPlanAreaCoord = FltPlanAreaCoordDTO.toEntity(coordEntityDto); + fltPlanAreaCoordList.add(fltPlanAreaCoord); } + + fltPlanArea.setFltPlanAreaCoordList(fltPlanAreaCoordList); } + + fltPlanAreaList.add(fltPlanArea); } + + fltPlanBas.setFltPlanAreaList(fltPlanAreaList); } // 조종사 - 사용자 정보로 저장 @@ -596,23 +609,38 @@ public class FlightLaancService { result.setEmail(EncryptUtil.decrypt(result.getEmail())); result.setFltTypeNm(result.getFltType().getValue()); - Optional> fltPlanAreaListData = fltPlanDomainService.findFltPlanAreaByPlanSno(planSno); - Optional> fltPlanArcrftListData = fltPlanDomainService.findFltPlanArcrftByPlanSno(planSno); + List fltPlanAreaList = fltPlanBas.getFltPlanAreaList(); + List fltPlanArcrftList = fltPlanBas.getFltPlanArcrftList(); + List fltPlanPilotList = fltPlanBas.getFltPlanPilotList(); + + if(fltPlanAreaList != null && !fltPlanAreaList.isEmpty()){ + + List areaList = new ArrayList<>(); - if(fltPlanAreaListData.isPresent()){ - List fltPlanAreaList = fltPlanAreaListData.get(); - List areaList = fltPlanAreaList.stream().map(BasLaancAreaModel::toModel).toList(); + for(FltPlanArea fltPlanArea : fltPlanAreaList){ + List fltPlanAreaCoordList = fltPlanArea.getFltPlanAreaCoordList().stream().map(BasLaancAreaCoordModel::toModel).toList(); + + BasLaancAreaModel node = BasLaancAreaModel.toModel(fltPlanArea); + node.setCoordList(fltPlanAreaCoordList); + + areaList.add(node); + } result.setAreaList(areaList); } - if(fltPlanArcrftListData.isPresent()){ - List fltPlanArcrftList = fltPlanArcrftListData.get(); + if(fltPlanArcrftList != null && !fltPlanArcrftList.isEmpty()){ List arcrftList = fltPlanArcrftList.stream().map(BasLaancArcrftModel::toModel).toList(); result.setArcrftList(arcrftList); } + if(fltPlanPilotList != null && !fltPlanPilotList.isEmpty()){ + List fltPlanPilotDTOList = fltPlanPilotList.stream().map(FltPlanPilotDTO::toDto).toList(); + + result.setPilotList(fltPlanPilotDTOList); + } + Optional comFileBasData = comFileDomainService.findFirstByFileGroupNoAndDelYnOrderByCreateDtDesc(fltPlanBas.getFileGroupNo()); // PDF URL 추출 @@ -648,4 +676,6 @@ public class FlightLaancService { public FltPlanBasDTO testDescPlanSno(){ return FltPlanBasDTO.toFltPlanBasDto(fltPlanDomainService.findByOrderByPlanSnoDesc()); } + + } diff --git a/web/api-flight/src/main/java/kr/co/palnet/kac/api/v1/flight/plan/model/CtrCntrlBasDTO.java b/web/api-flight/src/main/java/kr/co/palnet/kac/api/v1/flight/plan/model/CtrCntrlBasDTO.java new file mode 100644 index 0000000..8eb10ce --- /dev/null +++ b/web/api-flight/src/main/java/kr/co/palnet/kac/api/v1/flight/plan/model/CtrCntrlBasDTO.java @@ -0,0 +1,55 @@ +package kr.co.palnet.kac.api.v1.flight.plan.model; + +import kr.co.palnet.kac.data.ctr.model.CtrCntrlBas; +import lombok.Data; + +import java.time.LocalDateTime; + +@Data +public class CtrCntrlBasDTO { + + + private String cntrlId; // 관제ID + private String idntfNum; // 식별번호 + private String statusCd; // 상태코드 + private String procStatusYn; // 처리상태여부 + private String objectTypeCd; // 물체타입코드 + private LocalDateTime flghtStDt; // 비행시작일시 + private LocalDateTime flghtEndDt; // 비행종료일시 + private LocalDateTime cntrlStDt; // 관제시작일시 + private LocalDateTime cntrlEndDt; // 관제종료일시 + private Double ttlTime; // 총비행시간 + private String ttlTimeType; // 총비행시간단위 + private Double ttlDstnc; // 총비행거리 + private String ttlDstncType; // 총비행거리단위 + private Double avrgSpeed; // 평균속도 + private String avrgSpeedType; // 평균속도단위 + private Double bttrCnsmptn; // 배터리소모량 + private String endTypeCd; // 종료타입코드 + private LocalDateTime createDt; // 생성일시 + private LocalDateTime updateDt; // 수정일시 + + public CtrCntrlBas toEntity(){ + return CtrCntrlBas.builder() + .cntrlId(this.cntrlId) + .idntfNum(this.idntfNum) + .statusCd(this.statusCd) + .procStatusYn(this.procStatusYn) + .objectTypeCd(this.objectTypeCd) + .flghtStDt(this.flghtStDt) + .flghtEndDt(this.flghtEndDt) + .cntrlStDt(this.cntrlStDt) + .cntrlEndDt(this.cntrlEndDt) + .ttlTime(this.ttlTime) + .ttlTimeType(this.ttlTimeType) + .ttlDstnc(this.ttlDstnc) + .ttlDstncType(this.ttlDstncType) + .avrgSpeed(this.avrgSpeed) + .avrgSpeedType(this.avrgSpeedType) + .bttrCnsmptn(this.bttrCnsmptn) + .endTypeCd(this.endTypeCd) + .createDt(this.createDt) + .updateDt(this.updateDt) + .build(); + } +} 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 index 2d5f026..c99a145 100644 --- 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 @@ -2,9 +2,11 @@ package kr.co.palnet.kac.api.v1.flight.plan.service; import kr.co.palnet.kac.api.util.AreaUtils; import kr.co.palnet.kac.api.util.model.FlightPlanAreaCoordModel; +import kr.co.palnet.kac.api.v1.flight.plan.model.CtrCntrlBasDTO; import kr.co.palnet.kac.api.v1.flight.plan.model.buffer.BufferAreaCoordModel; import kr.co.palnet.kac.api.v1.flight.plan.model.buffer.CreateBufferModel; import kr.co.palnet.kac.api.v1.flight.plan.model.schedule.SearchPlanScheduleRS; +import kr.co.palnet.kac.data.ctr.model.CtrCntrlBas; import kr.co.palnet.kac.data.ctr.model.join.CntrlJoinHstryAreaModel; import kr.co.palnet.kac.data.ctr.service.CtrCntrlDomainService; import kr.co.palnet.kac.data.flt.model.join.FltPlanBasJoinAreaModel; @@ -87,7 +89,11 @@ public class FlightPlanService { node.setOwnerNm(model.getOwnerNm()); node.setIdntfNum(model.getIdntfNum()); node.setGroupId(model.getGroupId()); - node.setGroupNm(ptyGroupBas.getGroupNm()); + node.setSchFltStDt(model.getSchFltStDt()); + node.setSchFltEndDt(model.getSchFltEndDt()); +// node.setGroupId(ptyGroupBas.getGroupNm()); + // TODO :: FLT모듈 추가시에는 그룹을 추가하는 코드가 없어 ""으로 대체 추후 그룹 추가시 주석은 풀고 아래코드는 삭제할것임 + node.setGroupNm(ptyGroupBas == null ? "" : ptyGroupBas.getGroupNm()); result.add(node); @@ -96,4 +102,8 @@ public class FlightPlanService { return result; } + + public void testCreateCtrCntrlBas(CtrCntrlBasDTO createData){ + CtrCntrlBas ctrCntrlBas = ctrCntrlDomainService.saveCtrCntrlBas(createData.toEntity()); + } }