From f68773d7181278826523882dd961e742eaea8507 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?dhji=28=EC=A7=80=EB=8C=80=ED=95=9C=29?= Date: Wed, 15 Nov 2023 17:09:59 +0900 Subject: [PATCH] =?UTF-8?q?=EB=B9=84=ED=96=89=EA=B5=AC=EC=97=AD=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../model/BasFlightPlanArcrftModel.java | 3 + .../flight/model/BasFlightPlanAreaModel.java | 27 ++ .../bas/flight/model/BasFlightPlanModel.java | 3 + .../cntrl/controller/CtrCntrlController.java | 4 +- .../ctr/cntrl/service/CtrCntrlService.java | 41 ++ .../flt/FltPlanQueryRepository.java | 433 ++++++++++++------ 6 files changed, 359 insertions(+), 152 deletions(-) diff --git a/pav-server/src/main/java/com/palnet/biz/api/bas/flight/model/BasFlightPlanArcrftModel.java b/pav-server/src/main/java/com/palnet/biz/api/bas/flight/model/BasFlightPlanArcrftModel.java index 449083d0..b4406254 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/bas/flight/model/BasFlightPlanArcrftModel.java +++ b/pav-server/src/main/java/com/palnet/biz/api/bas/flight/model/BasFlightPlanArcrftModel.java @@ -15,6 +15,7 @@ public class BasFlightPlanArcrftModel { private String groupNm; private String prdctNum; private String arcrftTypeCd; + private String arcrftTypeNm; private String arcrftModelNm; private String prdctCmpnNm; @JsonSerialize(using = InstantDateStrSerializer.class) @@ -23,6 +24,8 @@ public class BasFlightPlanArcrftModel { private double arcrftWdth; private double arcrftHght; private double arcrftWght; + private String arcrftWghtCd; + private String arcrftWghtNm; private String wghtTypeCd; private String imageUrl; private double takeoffWght; diff --git a/pav-server/src/main/java/com/palnet/biz/api/bas/flight/model/BasFlightPlanAreaModel.java b/pav-server/src/main/java/com/palnet/biz/api/bas/flight/model/BasFlightPlanAreaModel.java index 5b0fbc17..4824a4a3 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/bas/flight/model/BasFlightPlanAreaModel.java +++ b/pav-server/src/main/java/com/palnet/biz/api/bas/flight/model/BasFlightPlanAreaModel.java @@ -1,16 +1,24 @@ package com.palnet.biz.api.bas.flight.model; +import com.palnet.biz.jpa.entity.type.FltMethod; +import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Data; +import lombok.NoArgsConstructor; import java.time.Instant; import java.util.List; @Data +@NoArgsConstructor +@AllArgsConstructor +@Builder public class BasFlightPlanAreaModel { private Integer planAreaSno; private Integer planSno; private String areaType; private String fltMethod; + private String fltMethodNm; private String fltAreaAddr; private Integer bufferZone; private String fltElev; @@ -23,4 +31,23 @@ public class BasFlightPlanAreaModel { private List bufferCoordList; // kac 추가 필드 private String fltMothoeRm; + +// public BasFlightPlanAreaModel(Integer planAreaSno, Integer planSno, String areaType, FltMethod fltMethod, String fltAreaAddr, Integer bufferZone, String fltElev, String createUserId, Instant createDt, String updateUserId, Instant updateDt, String docState, List coordList, List bufferCoordList, String fltMothoeRm) { +// this.planAreaSno = planAreaSno; +// this.planSno = planSno; +// this.areaType = areaType; +// this.fltMethod = fltMethod.getCode(); +// this.fltMethodNm = fltMethod.getValue(); +// this.fltAreaAddr = fltAreaAddr; +// this.bufferZone = bufferZone; +// this.fltElev = fltElev; +// this.createUserId = createUserId; +// this.createDt = createDt; +// this.updateUserId = updateUserId; +// this.updateDt = updateDt; +// this.docState = docState; +// this.coordList = coordList; +// this.bufferCoordList = bufferCoordList; +// this.fltMothoeRm = fltMothoeRm; +// } } diff --git a/pav-server/src/main/java/com/palnet/biz/api/bas/flight/model/BasFlightPlanModel.java b/pav-server/src/main/java/com/palnet/biz/api/bas/flight/model/BasFlightPlanModel.java index 2b3b2776..b51d81f4 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/bas/flight/model/BasFlightPlanModel.java +++ b/pav-server/src/main/java/com/palnet/biz/api/bas/flight/model/BasFlightPlanModel.java @@ -21,6 +21,9 @@ public class BasFlightPlanModel { private Instant schFltStDt; private Instant schFltEndDt; private String fltPurpose; + private String fltPurposeNm; + private String fltType; + private String fltTypeNm; private String aprvlYn; private String delYn; private String createUserId; diff --git a/pav-server/src/main/java/com/palnet/biz/api/ctr/cntrl/controller/CtrCntrlController.java b/pav-server/src/main/java/com/palnet/biz/api/ctr/cntrl/controller/CtrCntrlController.java index c4fdfbfe..ca85162c 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/ctr/cntrl/controller/CtrCntrlController.java +++ b/pav-server/src/main/java/com/palnet/biz/api/ctr/cntrl/controller/CtrCntrlController.java @@ -155,12 +155,12 @@ public class CtrCntrlController { @GetMapping("/flight_plan/{idntfNum}") @ApiOperation(value = "TODO 비행 관제 사용자 비행 계획서 정보") @Tag(name = "드론 관제 시스템", description = "드론 관제 관련 API") - @ApiImplicitParam(name = "idtfNum",value = "식별번호", dataTypeClass = String.class) + @ApiImplicitParam(name = "idtfNum",value = "식별번호", dataTypeClass = String.class, paramType = "query") public ResponseEntity findFlightPlan(@PathVariable("idntfNum") String idntfNum) { List list; try { - list = service.getFlightPlan(idntfNum); + list = service.getFlightPlanForKac(idntfNum); } catch (Exception e) { log.error("IGNORE : {}", e); return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) diff --git a/pav-server/src/main/java/com/palnet/biz/api/ctr/cntrl/service/CtrCntrlService.java b/pav-server/src/main/java/com/palnet/biz/api/ctr/cntrl/service/CtrCntrlService.java index 1cd32f3e..8c083579 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/ctr/cntrl/service/CtrCntrlService.java +++ b/pav-server/src/main/java/com/palnet/biz/api/ctr/cntrl/service/CtrCntrlService.java @@ -70,6 +70,7 @@ public class CtrCntrlService { private final FltPlanAreaCoordRepository planCoordRepository; private final AreaUtils areaUtils; private final ControlGpsDataContext shareContext; + private final FltPlanQueryRepository fltPlanQueryRepository; @@ -363,6 +364,46 @@ public class CtrCntrlService { return rs; } + /** + * 식별 번호에 해당되는 비행구역 조회 + * KAC에서는 기초데이터를 먼저 입력하는 것이 아닌 비행계획서만 작성하므로 생략되는 로직이 있음 + * 따라서 별도로 구성함 + * @param idntfNum + * @return + */ + public List getFlightPlanForKac(String idntfNum) { + List rs = fltPlanQueryRepository.getPlanByIdntfNum(idntfNum); + + // Line일 경우 버퍼 생성 + if(rs != null && !rs.isEmpty()){ + rs.forEach(r -> { + List areaList = r.getAreaList(); + if(areaList != null && !areaList.isEmpty()){ + areaList.forEach(a -> { + List coordList = a.getCoordList(); + if(coordList != null && !coordList.isEmpty()){ + // Buffer 영역 생성 저장 + if ("LINE".equals(a.getAreaType())) { + List convertCoordinates = areaUtils.convertCoordinates(coordList); + List transCoordList = areaUtils.transform(convertCoordinates, "EPSG:4326", "EPSG:5181"); + + List bufferList = areaUtils.buffer(transCoordList, a.getBufferZone()); + List transBufferList = areaUtils.transform(bufferList, "EPSG:5181", "EPSG:4326"); // buffer 영역 좌표계 변환 + + List bufferCoordList = areaUtils.convertModel(transBufferList); + + a.setBufferCoordList(bufferCoordList); + } + } + }); + } + }); + } + + + return rs; + } + /** * TODO 비행 관제 비정상 상황 판별 * diff --git a/pav-server/src/main/java/com/palnet/biz/jpa/repository/flt/FltPlanQueryRepository.java b/pav-server/src/main/java/com/palnet/biz/jpa/repository/flt/FltPlanQueryRepository.java index bb96b935..3251fa26 100644 --- a/pav-server/src/main/java/com/palnet/biz/jpa/repository/flt/FltPlanQueryRepository.java +++ b/pav-server/src/main/java/com/palnet/biz/jpa/repository/flt/FltPlanQueryRepository.java @@ -1,58 +1,13 @@ package com.palnet.biz.jpa.repository.flt; -import java.time.Duration; -import java.time.Instant; -import java.time.LocalDate; -import java.time.ZoneId; -import java.time.ZoneOffset; -import java.time.temporal.ChronoUnit; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Optional; - -import com.palnet.biz.api.main.dash.model.MainCurrentStcsModel; -import com.querydsl.core.types.dsl.*; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.cache.annotation.Cacheable; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.PageImpl; -import org.springframework.data.domain.Pageable; -import org.springframework.stereotype.Repository; -import org.springframework.util.StringUtils; - import com.palnet.biz.api.acnt.jwt.utils.JwtTokenUtil; -import com.palnet.biz.api.bas.flight.model.BasFlightPlanArcrftModel; -import com.palnet.biz.api.bas.flight.model.BasFlightPlanAreaCoordRq; -import com.palnet.biz.api.bas.flight.model.BasFlightPlanAreaModel; -import com.palnet.biz.api.bas.flight.model.BasFlightPlanListRq; -import com.palnet.biz.api.bas.flight.model.BasFlightPlanModel; -import com.palnet.biz.api.bas.flight.model.BasFlightPlanPilotModel; -import com.palnet.biz.api.bas.flight.model.BasFlightScheduleRs; +import com.palnet.biz.api.bas.flight.model.*; import com.palnet.biz.api.main.dash.model.MainDashFlightListModel; import com.palnet.biz.api.main.dash.model.MainDashStcsModel; import com.palnet.biz.api.main.statistics.model.FlightStcsValueModel; -import com.palnet.biz.jpa.entity.FltPlanBas; -import com.palnet.biz.jpa.entity.QComArcrftBas; -import com.palnet.biz.jpa.entity.QComFileBas; -import com.palnet.biz.jpa.entity.QComIdntfBas; -import com.palnet.biz.jpa.entity.QCtrCntrlBas; -import com.palnet.biz.jpa.entity.QCtrCntrlHstryArea; -import com.palnet.biz.jpa.entity.QFltPlanArcrft; -import com.palnet.biz.jpa.entity.QFltPlanArea; -import com.palnet.biz.jpa.entity.QFltPlanAreaCoord; -import com.palnet.biz.jpa.entity.QFltPlanBas; -import com.palnet.biz.jpa.entity.QFltPlanCtrCntrlRel; -import com.palnet.biz.jpa.entity.QFltPlanPilot; -import com.palnet.biz.jpa.entity.QPtyCstmrDtl; -import com.palnet.biz.jpa.entity.QPtyCstmrGroup; -import com.palnet.biz.jpa.entity.QPtyGroupBas; -import com.palnet.biz.jpa.model.LaancAprvSearchDto; -import com.palnet.biz.jpa.model.LaancPlanArcrftDto; -import com.palnet.biz.jpa.model.LaancPlanAreaDto; -import com.palnet.biz.jpa.model.LaancPlanDto; -import com.palnet.biz.jpa.model.LaancPlanPilotDto; -import com.palnet.biz.jpa.model.LaancPlanareaCoordDto; +import com.palnet.biz.jpa.entity.*; +import com.palnet.biz.jpa.entity.type.*; +import com.palnet.biz.jpa.model.*; import com.palnet.comn.utils.DateUtils; import com.palnet.comn.utils.InstantUtils; import com.querydsl.core.BooleanBuilder; @@ -62,17 +17,23 @@ import com.querydsl.core.types.ConstantImpl; import com.querydsl.core.types.Expression; import com.querydsl.core.types.ExpressionUtils; import com.querydsl.core.types.Projections; -import com.querydsl.core.types.dsl.CaseBuilder; -import com.querydsl.core.types.dsl.ComparableExpressionBase; -import com.querydsl.core.types.dsl.DateTemplate; -import com.querydsl.core.types.dsl.Expressions; -import com.querydsl.core.types.dsl.StringTemplate; +import com.querydsl.core.types.dsl.*; import com.querydsl.jpa.JPAExpressions; import com.querydsl.jpa.impl.JPAQuery; import com.querydsl.jpa.impl.JPAQueryFactory; - import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Repository; +import org.springframework.util.StringUtils; + +import java.time.*; +import java.time.temporal.ChronoUnit; +import java.util.*; +import java.util.stream.Collectors; @Slf4j @Repository @@ -81,7 +42,7 @@ public class FltPlanQueryRepository { private final JPAQueryFactory query; - + private final JwtTokenUtil jwtTokenUtil; @@ -115,6 +76,7 @@ public class FltPlanQueryRepository { } builder.and(bas.delYn.ne("Y")); + List r = query .from(bas) .leftJoin(area) @@ -1207,10 +1169,10 @@ public class FltPlanQueryRepository { List queryResult = query .select( Projections.bean(FlightStcsValueModel.class, - qFltPlanCtrCntrlRel.idntfNum.as("name") // 결과 객체의 프로퍼티 이름을 지정 + qFltPlanCtrCntrlRel.idntfNum.as("name") // 결과 객체의 프로퍼티 이름을 지정 ) ) - .from(qFltPlanCtrCntrlRel) + .from(qFltPlanCtrCntrlRel) .leftJoin(qFltPlanBas) .on(qFltPlanCtrCntrlRel.planSno.eq(qFltPlanBas.planSno)) .where(builder) @@ -1218,7 +1180,7 @@ public class FltPlanQueryRepository { .orderBy(qFltPlanCtrCntrlRel.planSno.countDistinct().desc()) .limit(1) .fetch(); - + if(queryResult.size() > 0){ result = queryResult.get(0); if(result.getName().equals("")) result.setName(" "); @@ -1249,7 +1211,7 @@ public class FltPlanQueryRepository { QFltPlanBas qFltPlanBas = QFltPlanBas.fltPlanBas; BooleanBuilder builder = new BooleanBuilder(); - builder.and(qFltPlanCtrCntrlRel.idntfNum.eq(idntfNum)); + builder.and(qFltPlanCtrCntrlRel.idntfNum.eq(idntfNum)); builder.and(qFltPlanBas.createDt.eq(LocalDate.now().atStartOfDay().atZone(ZoneId.of("Asia/Seoul")).toInstant())); builder.and(qFltPlanCtrCntrlRel.planSno.isNotNull()); if(groupId != null && !(groupId.equals(""))) builder.and(qFltPlanBas.groupId.eq(groupId)); @@ -1311,7 +1273,7 @@ public class FltPlanQueryRepository { .where(builder) .fetchOne(); } - + /** * 비행계획에 많이 기용된 기체 데이터, top 1 @@ -1319,11 +1281,11 @@ public class FltPlanQueryRepository { */ public FlightStcsValueModel getFltPlanStaticStcs(boolean authCheck, String groupId){ FlightStcsValueModel result = new FlightStcsValueModel(); - + QFltPlanArcrft qFltPlanArcrft = QFltPlanArcrft.fltPlanArcrft; QFltPlanBas qFltPlanBas = QFltPlanBas.fltPlanBas; - BooleanBuilder builder = new BooleanBuilder(); + BooleanBuilder builder = new BooleanBuilder(); if(groupId != null && !(groupId.equals(""))) builder.and(qFltPlanBas.groupId.eq(groupId)); if(authCheck) builder.and(qFltPlanBas.cstmrSno.eq(jwtTokenUtil.getCstmrSnoByToken())); @@ -1340,7 +1302,7 @@ public class FltPlanQueryRepository { .orderBy(qFltPlanArcrft.planSno.count().desc()) .limit(1) .fetch(); - + log.warn("que => {}", queryResult); if(queryResult.size() > 0){ @@ -1367,11 +1329,11 @@ public class FltPlanQueryRepository { } private Long getFltPlanDay(String idntfNum, boolean authCheck, String groupId){ - QFltPlanArcrft bas = QFltPlanArcrft.fltPlanArcrft; - QFltPlanBas qFltPlanBas = QFltPlanBas.fltPlanBas; + QFltPlanArcrft bas = QFltPlanArcrft.fltPlanArcrft; + QFltPlanBas qFltPlanBas = QFltPlanBas.fltPlanBas; BooleanBuilder builder = new BooleanBuilder(); - builder.and(bas.idntfNum.eq(idntfNum.trim())); + builder.and(bas.idntfNum.eq(idntfNum.trim())); builder.and(bas.createDt.eq(LocalDate.now().atStartOfDay().atZone(ZoneId.of("Asia/Seoul")).toInstant())); if(groupId != null && !(groupId.equals(""))) builder.and(qFltPlanBas.groupId.eq(groupId)); if(authCheck) builder.and(qFltPlanBas.cstmrSno.eq(jwtTokenUtil.getCstmrSnoByToken())); @@ -1380,7 +1342,7 @@ public class FltPlanQueryRepository { .select( bas.planSno.count() // 결과 객체의 프로퍼티 이름을 지정 ) - .from(bas) + .from(bas) .leftJoin(qFltPlanBas) .on(qFltPlanBas.planSno.eq(bas.planSno)) .where(builder) @@ -1388,11 +1350,11 @@ public class FltPlanQueryRepository { } private Long getFltPlanMonth(String idntfNum, boolean authCheck, String groupId){ - QFltPlanArcrft bas = QFltPlanArcrft.fltPlanArcrft; + QFltPlanArcrft bas = QFltPlanArcrft.fltPlanArcrft; QFltPlanBas qFltPlanBas = QFltPlanBas.fltPlanBas; BooleanBuilder builder = new BooleanBuilder(); - builder.and(bas.idntfNum.eq(idntfNum.trim())); + builder.and(bas.idntfNum.eq(idntfNum.trim())); builder.and(bas.createDt.goe(LocalDate.now().minusMonths(1).atStartOfDay().atZone(ZoneId.of("Asia/Seoul")).toInstant())); builder.and(bas.createDt.loe(LocalDate.now().atStartOfDay().atZone(ZoneId.of("Asia/Seoul")).toInstant())); if(groupId != null && !(groupId.equals(""))) builder.and(qFltPlanBas.groupId.eq(groupId)); @@ -1402,9 +1364,9 @@ public class FltPlanQueryRepository { .select( bas.planSno.count() // 결과 객체의 프로퍼티 이름을 지정 ) - .from(bas) + .from(bas) .leftJoin(qFltPlanBas) - .on(qFltPlanBas.planSno.eq(bas.planSno)) + .on(qFltPlanBas.planSno.eq(bas.planSno)) .where(builder) .fetchOne(); } @@ -1414,7 +1376,7 @@ public class FltPlanQueryRepository { QFltPlanBas qFltPlanBas = QFltPlanBas.fltPlanBas; BooleanBuilder builder = new BooleanBuilder(); - builder.and(bas.idntfNum.eq(idntfNum.trim())); + builder.and(bas.idntfNum.eq(idntfNum.trim())); builder.and(bas.createDt.goe(LocalDate.now().minusYears(1).atStartOfDay().atZone(ZoneId.of("Asia/Seoul")).toInstant())); builder.and(bas.createDt.loe(LocalDate.now().atStartOfDay().atZone(ZoneId.of("Asia/Seoul")).toInstant())); if(groupId != null && !(groupId.equals(""))) builder.and(qFltPlanBas.groupId.eq(groupId)); @@ -1430,9 +1392,9 @@ public class FltPlanQueryRepository { .where(builder) .fetchOne(); } - - + + /** * 비행승인 많은 기체 데이터, top 1 @@ -1441,14 +1403,14 @@ public class FltPlanQueryRepository { public FlightStcsValueModel getFltPlanAprvnStaticStcs(boolean authCheck, String groupId){ FlightStcsValueModel result = new FlightStcsValueModel(); - QFltPlanArcrft qFltPlanArcrft = QFltPlanArcrft.fltPlanArcrft; + QFltPlanArcrft qFltPlanArcrft = QFltPlanArcrft.fltPlanArcrft; QFltPlanBas qFltPlanBas = QFltPlanBas.fltPlanBas; BooleanBuilder builder = new BooleanBuilder(); builder.and(qFltPlanBas.aprvlYn.eq("Y")); if(groupId != null && !(groupId.equals(""))) builder.and(qFltPlanBas.groupId.eq(groupId)); if(authCheck) builder.and(qFltPlanBas.cstmrSno.eq(jwtTokenUtil.getCstmrSnoByToken())); - + List queryResult = query .select( @@ -1456,7 +1418,7 @@ public class FltPlanQueryRepository { qFltPlanArcrft.idntfNum.as("name") // 결과 객체의 프로퍼티 이름을 지정 ) ) - .from(qFltPlanArcrft) + .from(qFltPlanArcrft) .leftJoin(qFltPlanBas) .on(qFltPlanArcrft.planSno.eq(qFltPlanBas.planSno)) .where(builder) @@ -1464,7 +1426,7 @@ public class FltPlanQueryRepository { .orderBy(qFltPlanArcrft.planSno.count().desc()) .limit(1) .fetch(); - + if(queryResult.size() > 0){ result = queryResult.get(0); if(result.getName().equals("")) result.setName(" "); @@ -1488,13 +1450,13 @@ public class FltPlanQueryRepository { } private Long getFltPlanAprvnDay(String idntfNum, boolean authCheck, String groupId){ - QFltPlanArcrft qFltPlanArcrft = QFltPlanArcrft.fltPlanArcrft; + QFltPlanArcrft qFltPlanArcrft = QFltPlanArcrft.fltPlanArcrft; QFltPlanBas qFltPlanBas = QFltPlanBas.fltPlanBas; BooleanBuilder builder = new BooleanBuilder(); - builder.and(qFltPlanArcrft.idntfNum.eq(idntfNum)); - builder.and(qFltPlanBas.aprvlYn.eq("Y")); - builder.and(qFltPlanBas.createDt.eq(LocalDate.now().atStartOfDay().atZone(ZoneId.of("Asia/Seoul")).toInstant())); + builder.and(qFltPlanArcrft.idntfNum.eq(idntfNum)); + builder.and(qFltPlanBas.aprvlYn.eq("Y")); + builder.and(qFltPlanBas.createDt.eq(LocalDate.now().atStartOfDay().atZone(ZoneId.of("Asia/Seoul")).toInstant())); if(groupId != null && !(groupId.equals(""))) builder.and(qFltPlanBas.groupId.eq(groupId)); if(authCheck) builder.and(qFltPlanBas.cstmrSno.eq(jwtTokenUtil.getCstmrSnoByToken())); @@ -1502,7 +1464,7 @@ public class FltPlanQueryRepository { .select( qFltPlanArcrft.planSno.count() // 결과 객체의 프로퍼티 이름을 지정 ) - .from(qFltPlanArcrft) + .from(qFltPlanArcrft) .leftJoin(qFltPlanBas) .on(qFltPlanArcrft.planSno.eq(qFltPlanBas.planSno)) .where(builder) @@ -1510,23 +1472,23 @@ public class FltPlanQueryRepository { } private Long getFltPlanAprvnMonth(String idntfNum, boolean authCheck, String groupId){ - - QFltPlanArcrft qFltPlanArcrft = QFltPlanArcrft.fltPlanArcrft; + + QFltPlanArcrft qFltPlanArcrft = QFltPlanArcrft.fltPlanArcrft; QFltPlanBas qFltPlanBas = QFltPlanBas.fltPlanBas; BooleanBuilder builder = new BooleanBuilder(); - builder.and(qFltPlanArcrft.idntfNum.eq(idntfNum)); - builder.and(qFltPlanBas.aprvlYn.eq("Y")); + builder.and(qFltPlanArcrft.idntfNum.eq(idntfNum)); + builder.and(qFltPlanBas.aprvlYn.eq("Y")); builder.and(qFltPlanBas.createDt.goe(LocalDate.now().minusMonths(1).atStartOfDay().atZone(ZoneId.of("Asia/Seoul")).toInstant())); builder.and(qFltPlanBas.createDt.loe(LocalDate.now().atStartOfDay().atZone(ZoneId.of("Asia/Seoul")).toInstant())); if(groupId != null && !(groupId.equals(""))) builder.and(qFltPlanBas.groupId.eq(groupId)); if(authCheck) builder.and(qFltPlanBas.cstmrSno.eq(jwtTokenUtil.getCstmrSnoByToken())); return query - .select( + .select( qFltPlanArcrft.planSno.count() // 결과 객체의 프로퍼티 이름을 지정 ) - .from(qFltPlanArcrft) + .from(qFltPlanArcrft) .leftJoin(qFltPlanBas) .on(qFltPlanArcrft.planSno.eq(qFltPlanBas.planSno)) .where(builder) @@ -1534,28 +1496,28 @@ public class FltPlanQueryRepository { } private Long getFltPlanAprvnYear(String idntfNum, boolean authCheck, String groupId){ - QFltPlanArcrft qFltPlanArcrft = QFltPlanArcrft.fltPlanArcrft; + QFltPlanArcrft qFltPlanArcrft = QFltPlanArcrft.fltPlanArcrft; QFltPlanBas qFltPlanBas = QFltPlanBas.fltPlanBas; BooleanBuilder builder = new BooleanBuilder(); - builder.and(qFltPlanArcrft.idntfNum.eq(idntfNum)); - builder.and(qFltPlanBas.aprvlYn.eq("Y")); + builder.and(qFltPlanArcrft.idntfNum.eq(idntfNum)); + builder.and(qFltPlanBas.aprvlYn.eq("Y")); builder.and(qFltPlanBas.createDt.goe(LocalDate.now().minusYears(1).atStartOfDay().atZone(ZoneId.of("Asia/Seoul")).toInstant())); builder.and(qFltPlanBas.createDt.loe(LocalDate.now().atStartOfDay().atZone(ZoneId.of("Asia/Seoul")).toInstant())); if(groupId != null && !(groupId.equals(""))) builder.and(qFltPlanBas.groupId.eq(groupId)); if(authCheck) builder.and(qFltPlanBas.cstmrSno.eq(jwtTokenUtil.getCstmrSnoByToken())); - + return query .select( qFltPlanArcrft.planSno.count() // 결과 객체의 프로퍼티 이름을 지정 ) - .from(qFltPlanArcrft) + .from(qFltPlanArcrft) .leftJoin(qFltPlanBas) .on(qFltPlanArcrft.planSno.eq(qFltPlanBas.planSno)) .where(builder) .fetchOne(); } - + /** * 비행실적 통계 카테고리 비행실적 * @param date @@ -1564,21 +1526,21 @@ public class FltPlanQueryRepository { */ public List fltResultStcs(String date, String groupId, boolean authCheck, String[] formatParam){ // QCtrCntrlBas bas = QCtrCntrlBas.ctrCntrlBas; - + QFltPlanBas qFltPlanBas = QFltPlanBas.fltPlanBas; QFltPlanCtrCntrlRel qFltPlanCtrCntrlRel = QFltPlanCtrCntrlRel.fltPlanCtrCntrlRel; - + StringTemplate formattedDate = Expressions.stringTemplate( "DATE_FORMAT({0}, {1})" , qFltPlanBas.createDt , ConstantImpl.create(formatParam[0])); - + StringTemplate formattedDate2 = Expressions.stringTemplate( "DATE_FORMAT({0}, {1})" , qFltPlanBas.createDt , ConstantImpl.create(formatParam[1])); - BooleanBuilder builder = new BooleanBuilder(); + BooleanBuilder builder = new BooleanBuilder(); if(date != null && date.length() > 0) builder.and(formattedDate.eq(date)); if(groupId != null && !(groupId.equals(""))) builder.and(qFltPlanBas.groupId.eq(groupId)); if(authCheck) builder.and(qFltPlanBas.cstmrSno.eq(jwtTokenUtil.getCstmrSnoByToken())); @@ -1586,7 +1548,7 @@ public class FltPlanQueryRepository { List result = query .select( Projections.bean( - FlightStcsValueModel.class , + FlightStcsValueModel.class , formattedDate2.as("name"), qFltPlanCtrCntrlRel.planSno.countDistinct().as("value") ) @@ -1595,8 +1557,8 @@ public class FltPlanQueryRepository { .leftJoin(qFltPlanBas) .on(qFltPlanBas.planSno.eq(qFltPlanCtrCntrlRel.planSno)) .where(builder) - .groupBy(formattedDate2) - .fetch(); + .groupBy(formattedDate2) + .fetch(); if(result.size() <= 0){ FlightStcsValueModel node = new FlightStcsValueModel(); @@ -1608,7 +1570,7 @@ public class FltPlanQueryRepository { } return result; - } + } /** * 비행계획서 통계 카테고리 비행계획서 @@ -1616,20 +1578,20 @@ public class FltPlanQueryRepository { * @param formatParam * @return */ - public List fltPlanStcs(String date, String groupId, boolean authCheck, String[] formatParam){ + public List fltPlanStcs(String date, String groupId, boolean authCheck, String[] formatParam){ QFltPlanBas qFltPlanBas = QFltPlanBas.fltPlanBas; - + StringTemplate formattedDate = Expressions.stringTemplate( "DATE_FORMAT({0}, {1})" , qFltPlanBas.createDt , ConstantImpl.create(formatParam[0])); - + StringTemplate formattedDate2 = Expressions.stringTemplate( "DATE_FORMAT({0}, {1})" , qFltPlanBas.createDt , ConstantImpl.create(formatParam[1])); - BooleanBuilder builder = new BooleanBuilder(); + BooleanBuilder builder = new BooleanBuilder(); if(date != null && date.length() > 0) builder.and(formattedDate.eq(date)); if(groupId != null && !(groupId.equals(""))) builder.and(qFltPlanBas.groupId.eq(groupId)); if(authCheck) builder.and(qFltPlanBas.cstmrSno.eq(jwtTokenUtil.getCstmrSnoByToken())); @@ -1637,15 +1599,15 @@ public class FltPlanQueryRepository { List result = query .select( Projections.bean( - FlightStcsValueModel.class , + FlightStcsValueModel.class , formattedDate2.as("name"), qFltPlanBas.planSno.count().as("value") ) ) - .from(qFltPlanBas) + .from(qFltPlanBas) .where(builder) - .groupBy(formattedDate2) - .fetch(); + .groupBy(formattedDate2) + .fetch(); if(result.size() <= 0){ FlightStcsValueModel node = new FlightStcsValueModel(); @@ -1657,7 +1619,7 @@ public class FltPlanQueryRepository { } return result; - } + } /** * 비행승인 통계 카테고리 비행승인 @@ -1667,14 +1629,14 @@ public class FltPlanQueryRepository { */ public List fltPlanAprvnStcs(String date, String groupId, boolean authCheck, String[] formatParam){ // QCtrCntrlBas bas = QCtrCntrlBas.ctrCntrlBas; - - QFltPlanBas qFltPlanBas = QFltPlanBas.fltPlanBas; - + + QFltPlanBas qFltPlanBas = QFltPlanBas.fltPlanBas; + StringTemplate formattedDate = Expressions.stringTemplate( "DATE_FORMAT({0}, {1})" , qFltPlanBas.createDt , ConstantImpl.create(formatParam[0])); - + StringTemplate formattedDate2 = Expressions.stringTemplate( "DATE_FORMAT({0}, {1})" , qFltPlanBas.createDt @@ -1689,15 +1651,15 @@ public class FltPlanQueryRepository { List result = query .select( Projections.bean( - FlightStcsValueModel.class , + FlightStcsValueModel.class , formattedDate2.as("name"), qFltPlanBas.planSno.count().as("value") ) ) - .from(qFltPlanBas) + .from(qFltPlanBas) .where(builder) - .groupBy(formattedDate2) - .fetch(); + .groupBy(formattedDate2) + .fetch(); if(result.size() <= 0){ FlightStcsValueModel node = new FlightStcsValueModel(); @@ -1709,7 +1671,7 @@ public class FltPlanQueryRepository { } return result; - } + } /** @@ -1727,7 +1689,7 @@ public class FltPlanQueryRepository { , qFltPlanBas.createDt , ConstantImpl.create(formatParam[0])); - BooleanBuilder builder = new BooleanBuilder(); + BooleanBuilder builder = new BooleanBuilder(); if(date != null && date.length() > 0) builder.and(formattedDate.eq(date)); if(groupId != null && !(groupId.equals(""))) builder.and(qFltPlanBas.groupId.eq(groupId)); if(authCheck) builder.and(qFltPlanBas.cstmrSno.eq(jwtTokenUtil.getCstmrSnoByToken())); @@ -1735,7 +1697,7 @@ public class FltPlanQueryRepository { List result = query .select( Projections.bean(FlightStcsValueModel.class, - qFltPlanCtrCntrlRel.idntfNum.as("name") // 결과 객체의 프로퍼티 이름을 지정 + qFltPlanCtrCntrlRel.idntfNum.as("name") // 결과 객체의 프로퍼티 이름을 지정 ) ) .from(qFltPlanCtrCntrlRel) @@ -1746,7 +1708,7 @@ public class FltPlanQueryRepository { .orderBy(qFltPlanCtrCntrlRel.planSno.countDistinct().desc()) .limit(5) .fetch(); - + if(result.size() <= 0){ FlightStcsValueModel node = new FlightStcsValueModel(); @@ -1775,7 +1737,7 @@ public class FltPlanQueryRepository { , qFltPlanArcrft.createDt , ConstantImpl.create(formatParam[0])); - BooleanBuilder builder = new BooleanBuilder(); + BooleanBuilder builder = new BooleanBuilder(); if(date != null && date.length() > 0) builder.and(formattedDate.eq(date)); if(groupId != null && !(groupId.equals(""))) builder.and(qFltPlanBas.groupId.eq(groupId)); if(authCheck) builder.and(qFltPlanBas.cstmrSno.eq(jwtTokenUtil.getCstmrSnoByToken())); @@ -1787,15 +1749,15 @@ public class FltPlanQueryRepository { qFltPlanArcrft.planSno.countDistinct().as("value") ) ) - .from(qFltPlanArcrft) + .from(qFltPlanArcrft) .leftJoin(qFltPlanBas) .on(qFltPlanBas.planSno.eq(qFltPlanArcrft.planSno)) .where(builder) - .groupBy(qFltPlanArcrft.idntfNum) + .groupBy(qFltPlanArcrft.idntfNum) .orderBy(qFltPlanArcrft.planSno.countDistinct().desc()) .limit(5) .fetch(); - + if(result.size() <= 0){ FlightStcsValueModel node = new FlightStcsValueModel(); @@ -1816,15 +1778,15 @@ public class FltPlanQueryRepository { */ public List fltTopPlanAprvnStcs(String date, String groupId, boolean authCheck, String[] formatParam){ - QFltPlanArcrft qFltPlanArcrft = QFltPlanArcrft.fltPlanArcrft; + QFltPlanArcrft qFltPlanArcrft = QFltPlanArcrft.fltPlanArcrft; QFltPlanBas qFltPlanBas = QFltPlanBas.fltPlanBas; - StringTemplate formattedDate = Expressions.stringTemplate( + StringTemplate formattedDate = Expressions.stringTemplate( "DATE_FORMAT({0}, {1})" , qFltPlanBas.createDt , ConstantImpl.create(formatParam[0])); - BooleanBuilder builder = new BooleanBuilder(); + BooleanBuilder builder = new BooleanBuilder(); if(date != null && date.length() > 0) builder.and(formattedDate.eq(date)); builder.and(qFltPlanBas.aprvlYn.eq("Y")); if(authCheck) builder.and(qFltPlanBas.cstmrSno.eq(jwtTokenUtil.getCstmrSnoByToken())); @@ -1837,15 +1799,15 @@ public class FltPlanQueryRepository { qFltPlanArcrft.planSno.countDistinct().as("value") ) ) - .from(qFltPlanArcrft) - .leftJoin(qFltPlanBas) + .from(qFltPlanArcrft) + .leftJoin(qFltPlanBas) .on(qFltPlanArcrft.planSno.eq(qFltPlanBas.planSno)) - .where(builder) - .groupBy(qFltPlanArcrft.idntfNum) + .where(builder) + .groupBy(qFltPlanArcrft.idntfNum) .orderBy(qFltPlanArcrft.planSno.countDistinct().desc()) .limit(5) .fetch(); - + if(result.size() <= 0){ FlightStcsValueModel node = new FlightStcsValueModel(); @@ -1890,7 +1852,7 @@ public class FltPlanQueryRepository { BooleanBuilder builder = new BooleanBuilder(); if(groupId != null && !(groupId.equals("")))builder.and(qFltPlanBas.groupId.eq(groupId)); if(authCheck) builder.and(qFltPlanBas.cstmrSno.eq(jwtTokenUtil.getCstmrSnoByToken())); - + BooleanExpression dateExpression = null; switch (cate){ case "-2" : @@ -1929,9 +1891,9 @@ public class FltPlanQueryRepository { } - + public List getFlightDronList(String cptAuth, String serviceType){ - + QComIdntfBas cib = QComIdntfBas.comIdntfBas; QFltPlanArcrft fpa = QFltPlanArcrft.fltPlanArcrft; QFltPlanBas fpb = QFltPlanBas.fltPlanBas; @@ -1942,9 +1904,9 @@ public class FltPlanQueryRepository { Expression groupOrder = new CaseBuilder() .when(pgb.groupNm.eq(cptAuth)).then(0) .otherwise(1); - - BooleanBuilder builder = new BooleanBuilder(); - + + BooleanBuilder builder = new BooleanBuilder(); + if(!serviceType.equals("all")) { builder.and(fpb.serviceType.contains(serviceType)); } @@ -1953,7 +1915,7 @@ public class FltPlanQueryRepository { builder.and(pgb.groupNm.eq("cptAuth")); } Instant now = Instant.now(); - + Instant todayStart = LocalDate.now().atStartOfDay().toInstant(ZoneOffset.UTC); Instant todayEnd = LocalDate.now().plusDays(1).atStartOfDay().toInstant(ZoneOffset.UTC); @@ -1998,9 +1960,9 @@ public class FltPlanQueryRepository { return result; } - + public Map getFlightDronStcs(String cptAuth){ - + QComIdntfBas cib = QComIdntfBas.comIdntfBas; QFltPlanArcrft fpa = QFltPlanArcrft.fltPlanArcrft; QFltPlanBas fpb = QFltPlanBas.fltPlanBas; @@ -2008,13 +1970,13 @@ public class FltPlanQueryRepository { QFltPlanCtrCntrlRel fpccr = QFltPlanCtrCntrlRel.fltPlanCtrCntrlRel; QCtrCntrlBas ccb = QCtrCntrlBas.ctrCntrlBas; - BooleanBuilder builder = new BooleanBuilder(); - + BooleanBuilder builder = new BooleanBuilder(); + if(!cptAuth.equals("KAC")) { builder.and(pgb.groupNm.eq("cptAuth")); } Instant now = Instant.now(); - + Instant todayStart = LocalDate.now().atStartOfDay().toInstant(ZoneOffset.UTC); Instant todayEnd = LocalDate.now().plusDays(1).atStartOfDay().toInstant(ZoneOffset.UTC); @@ -2057,7 +2019,178 @@ public class FltPlanQueryRepository { result.put(status, count); } - + return result; } + + + // 기체번호로 비행계획서 조회 + public List getPlanByIdntfNum(String idntfNum) { + QFltPlanBas bas = QFltPlanBas.fltPlanBas; + QFltPlanArcrft arcrft = QFltPlanArcrft.fltPlanArcrft; + QFltPlanArea area = QFltPlanArea.fltPlanArea; + QFltPlanAreaCoord coord = QFltPlanAreaCoord.fltPlanAreaCoord; + + Instant fltNowDt = Instant.now(); + + List rs = query.from(bas) + .leftJoin(arcrft) + .on(bas.planSno.eq(arcrft.planSno)) + .leftJoin(area) + .on(area.planSno.eq(area.planSno)) + .where( + arcrft.idntfNum.eq(idntfNum) + .and(bas.aprvlYn.eq("Y")) + .and(bas.schFltStDt.before(fltNowDt)) + .and(bas.schFltEndDt.after(fltNowDt)) + ) + .orderBy(bas.createDt.desc()) + .transform( + GroupBy.groupBy(bas.planSno) + .list(Projections.bean( + BasFlightPlanModel.class, + bas.planSno, + bas.groupId, + bas.cstmrSno, + bas.memberName, + bas.fltType.stringValue().as("fltType"), + bas.email, + bas.hpno, + bas.clncd, + bas.addr, + bas.addrDtlCn, + bas.zip, + bas.schFltStDt, + bas.schFltEndDt, + bas.fltPurpose.stringValue().as("fltPurpose"), + bas.aprvlYn, + bas.delYn, + bas.fileGroupNo, + bas.createUserId, + bas.createDt, + bas.updateUserId, + bas.updateDt, + bas.corpRegYn, + bas.serviceType, + GroupBy.list(Projections.bean( + BasFlightPlanAreaModel.class, + area.planAreaSno, + area.planSno, + area.areaType, + area.fltMethod.stringValue().as("fltMethod"), + area.bufferZone, + area.fltElev, + area.createUserId, + area.createDt, + area.updateUserId, + area.updateDt, + area.fltMothoeRm + ).skipNulls()).as("areaList"), + GroupBy.list(Projections.bean( + BasFlightPlanArcrftModel.class, + arcrft.planArcrftSno, + arcrft.planSno, + arcrft.arcrftSno, + arcrft.idntfNum, + arcrft.groupNm, + arcrft.prdctNum, + arcrft.arcrftTypeCd.stringValue().as("arcrftTypeCd"), + arcrft.arcrftModelNm, + arcrft.prdctCmpnNm, + arcrft.prdctDate, + arcrft.arcrftLngth, + arcrft.arcrftWdth, + arcrft.arcrftHght, + arcrft.arcrftWght, + arcrft.arcrftWghtCd.stringValue().as("arcrftWghtCd"), + arcrft.wghtTypeCd, + arcrft.imageUrl, + arcrft.takeoffWght, + arcrft.useYn, + arcrft.cameraYn, + arcrft.insrncYn, + arcrft.ownerNm, + arcrft.createUserId, + arcrft.createDt, + arcrft.updateUserId, + arcrft.updateDt, + arcrft.acrftInsuranceYn, + arcrft.insuranceExperiod, + arcrft.corporationNm + ).skipNulls()).as("arcrftList") + ).skipNulls()) + ); + + if (rs != null && !rs.isEmpty()) { + + // enum cd -> nm + for (BasFlightPlanModel p : rs) { + if (p == null) continue; + FltType fltType = FltType.fromCode(p.getFltType()); + if (fltType != null) p.setFltTypeNm(fltType.getValue()); + FltPurpose fltPurpose = FltPurpose.fromCode(p.getFltPurpose()); + if (fltPurpose != null) p.setFltPurposeNm(fltPurpose.getValue()); + + if (p.getAreaList() != null && !p.getAreaList().isEmpty()) { + for (BasFlightPlanAreaModel a : p.getAreaList()) { + if (a == null) continue; + FltMethod fltMethod = FltMethod.fromCode(a.getFltMethod()); + if (fltMethod != null) a.setFltMethodNm(fltMethod.getValue()); + } + } + if (p.getArcrftList() != null && !p.getArcrftList().isEmpty()) { + for (BasFlightPlanArcrftModel c : p.getArcrftList()) { + if (c == null) continue; + ArcrftTypeCd arcrftTypeCd = ArcrftTypeCd.fromCode(c.getArcrftTypeCd()); + if (arcrftTypeCd != null) c.setArcrftTypeNm(arcrftTypeCd.getValue()); + ArcrftWghtCd arcrftWghtCd = ArcrftWghtCd.fromCode(c.getArcrftWghtCd()); + if (arcrftWghtCd != null) c.setArcrftWghtNm(arcrftWghtCd.getValue()); + } + } + } + + + + List areaSnoList = rs.stream() + .filter(p -> p != null && p.getAreaList() != null && !p.getAreaList().isEmpty()) + .map(p -> { + List areaList = p.getAreaList(); + return areaList.stream().map(BasFlightPlanAreaModel::getPlanAreaSno).collect(Collectors.toList()); + }).flatMap(Collection::stream).collect(Collectors.toList()); + + List coordEntities = query.select( + Projections.bean( + BasFlightPlanAreaCoordModel.class, + coord.planAreaCoordSno, + coord.planAreaSno, + coord.lat, + coord.lon, + coord.createUserId, + coord.createDt + ) + ) + .from(coord) + .where(coord.planAreaSno.in(areaSnoList)) + .orderBy(coord.planAreaSno.asc(), coord.planAreaCoordSno.asc()) + .fetch(); + + + Map> coordMap = coordEntities.stream().collect(Collectors.groupingBy(BasFlightPlanAreaCoordModel::getPlanAreaSno)); + if (!areaSnoList.isEmpty()) { + rs.forEach(r -> { + List areaList = r.getAreaList(); + areaList.forEach(a -> { + List coordList = coordMap.get(a.getPlanAreaSno()); + if (coordList != null && !coordList.isEmpty()) { + a.setCoordList(coordList); + } + }); + }); + } + } + + return rs; + } + + } \ No newline at end of file