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/api/main/dash/controller/MainDashController.java b/pav-server/src/main/java/com/palnet/biz/api/main/dash/controller/MainDashController.java index 4ce48fd0..a811e73f 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/main/dash/controller/MainDashController.java +++ b/pav-server/src/main/java/com/palnet/biz/api/main/dash/controller/MainDashController.java @@ -4,7 +4,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; -import com.palnet.biz.api.main.dash.model.MainCurrentStcsModel; +import com.palnet.biz.api.main.dash.model.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; @@ -18,9 +18,6 @@ import org.springframework.web.bind.annotation.RestController; import com.palnet.biz.api.comn.response.BasicResponse; import com.palnet.biz.api.comn.response.ErrorResponse; import com.palnet.biz.api.comn.response.SuccessResponse; -import com.palnet.biz.api.main.dash.model.MainDashFlightListModel; -import com.palnet.biz.api.main.dash.model.MainDashListModel; -import com.palnet.biz.api.main.dash.model.MainDashStcsModel; import com.palnet.biz.api.main.dash.service.MainDashService; import com.palnet.comn.code.RSErrorCode; @@ -343,8 +340,7 @@ public class MainDashController { @ApiOperation(value = "일일 비정상상황 통계") @Tag(name = "메인화면 컨트롤러", description = "메인화면 관련 API") @ApiImplicitParams({ - @ApiImplicitParam(name = "date",value = "날짜", dataTypeClass = String.class), - @ApiImplicitParam(name = "type",value = "날짜형식", dataTypeClass = String.class) + @ApiImplicitParam(name = "groupId",value = "그룹아이디", dataTypeClass = String.class) }) public ResponseEntity currentFlightWarn(@RequestParam(required = false) String groupId){ @@ -365,8 +361,7 @@ public class MainDashController { @ApiOperation(value = "일일 비행계획 통계") @Tag(name = "메인화면 컨트롤러", description = "메인화면 관련 API") @ApiImplicitParams({ - @ApiImplicitParam(name = "date",value = "날짜", dataTypeClass = String.class), - @ApiImplicitParam(name = "type",value = "날짜형식", dataTypeClass = String.class) + @ApiImplicitParam(name = "groupId",value = "그룹아이디", dataTypeClass = String.class) }) public ResponseEntity currentFlightPlan(@RequestParam(required = false) String groupId){ @@ -384,4 +379,19 @@ public class MainDashController { return ResponseEntity.ok().body(new SuccessResponse>(result)); } + + + @GetMapping("/stcs/dailyflight") + @ApiOperation(value = "일일 비행횟수 현황") + @Tag(name = "메인화면 컨트롤러",description = "메인화면 관련 API") + public ResponseEntity getDailyFlightNumOfStcs(){ + List result = null; + try { + result = service.dailyFlightNumOfStcs(); + }catch (Exception e){ + log.error("IGNORE : {} ", e); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(new ErrorResponse("Server Error", "-1")); + } + return ResponseEntity.ok().body(new SuccessResponse>(result)); + } } diff --git a/pav-server/src/main/java/com/palnet/biz/api/main/dash/model/MainDashFlightNumStcsModel.java b/pav-server/src/main/java/com/palnet/biz/api/main/dash/model/MainDashFlightNumStcsModel.java new file mode 100644 index 00000000..29cf8009 --- /dev/null +++ b/pav-server/src/main/java/com/palnet/biz/api/main/dash/model/MainDashFlightNumStcsModel.java @@ -0,0 +1,35 @@ +package com.palnet.biz.api.main.dash.model; + +import io.swagger.annotations.ApiParam; +import lombok.Data; + +/** + * packageName : com.palnet.biz.api.main.dash.model + * fileName : MainDashFlightNumStcsModel + * author : hagjoon + * date : 2023-11-13 + * description : + * =========================================================== + * DATE AUTHOR NOTE + * ----------------------------------------------------------- + * 2023-11-13 hagjoon 최초 생성 + */ +@Data +public class MainDashFlightNumStcsModel { + + @ApiParam(value = "구분",example = "전일(어제), 금일(오늘), 명일(내일)") + private String dateType = ""; + + @ApiParam(value = "계획",example = "전일(어제), 금일(오늘), 명일(내일) 비행계획서 목록") + private long flightPlan = 0; + + @ApiParam(value = "비행 완료",example = "전일(어제), 금일(오늘), 명일(내일) 비행완료 목록") + private long completeFlight = 0; + + @ApiParam(value = "미 비행",example = "전일(어제), 금일(오늘), 명일(내일) 미 비행 목록") + private long notFlight = 0; + + @ApiParam(value = "비고",example = "전일(어제), 금일(오늘), 명일(내일) 비고") + private double note = 0; + +} diff --git a/pav-server/src/main/java/com/palnet/biz/api/main/dash/service/MainDashService.java b/pav-server/src/main/java/com/palnet/biz/api/main/dash/service/MainDashService.java index 9e40facc..60c956a9 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/main/dash/service/MainDashService.java +++ b/pav-server/src/main/java/com/palnet/biz/api/main/dash/service/MainDashService.java @@ -1,14 +1,17 @@ package com.palnet.biz.api.main.dash.service; +import java.time.Instant; +import java.time.temporal.ChronoUnit; import java.util.*; import java.util.stream.Collectors; import com.palnet.biz.api.acnt.jwt.model.JwtGroupModel; import com.palnet.biz.api.acnt.jwt.utils.JwtTokenUtil; import com.palnet.biz.api.bas.group.model.BasGroupModel; -import com.palnet.biz.api.main.dash.model.MainCurrentStcsModel; +import com.palnet.biz.api.main.dash.model.*; import com.palnet.biz.api.main.statistics.service.MainStatisticsService; import com.palnet.biz.jpa.entity.FltPlanBas; +import com.palnet.biz.jpa.repository.flt.FltPlanBasRepository; import com.palnet.biz.jpa.repository.pty.*; import com.querydsl.core.Tuple; @@ -20,9 +23,6 @@ import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import com.palnet.biz.api.main.dash.model.MainDashFlightListModel; -import com.palnet.biz.api.main.dash.model.MainDashListModel; -import com.palnet.biz.api.main.dash.model.MainDashStcsModel; import com.palnet.biz.jpa.entity.CtrCntrlWarnLog; import com.palnet.biz.jpa.entity.type.WarnType; import com.palnet.biz.jpa.repository.ctr.CtrCntrlQueryRepository; @@ -56,6 +56,9 @@ public class MainDashService { @Autowired private FltPlanArcrftRepository fltPlanArcrftRepository; + + @Autowired + private FltPlanBasRepository fltPlanBasRepository; @Autowired private JwtTokenUtil token; @@ -369,4 +372,58 @@ public class MainDashService { return result; } + + public List dailyFlightNumOfStcs(){ + // 1. 전일 , 금일, 명일(내일) + Instant yesterdayStart = Instant.now().minus(1, ChronoUnit.DAYS).truncatedTo(ChronoUnit.DAYS); + Instant yesterdayEnd = Instant.now().truncatedTo(ChronoUnit.DAYS).minus(1, ChronoUnit.SECONDS); + Instant todayStart = Instant.now().truncatedTo(ChronoUnit.DAYS); + Instant todayEnd = Instant.now().plus(1, ChronoUnit.DAYS).minus(1, ChronoUnit.SECONDS); + Instant tomorrowStart = Instant.now().plus(1, ChronoUnit.DAYS).truncatedTo(ChronoUnit.DAYS); + Instant tomorrowEnd = Instant.now().plus(2, ChronoUnit.DAYS).minus(1, ChronoUnit.SECONDS); + + // 2. 비행계획서 승인 항목 : 비행계획서 제출기준(승인된 건수로봐도 동일) + long yesterdayCount = fltPlanBasRepository.countByAprvlYnAndAprvlDtBetween("Y", yesterdayStart, yesterdayEnd); + long todayCount = fltPlanBasRepository.countByAprvlYnAndAprvlDtBetween("Y", todayStart, todayEnd); + long tomorrowCount = fltPlanBasRepository.countByAprvlYnAndAprvlDtBetween("Y", tomorrowStart, tomorrowEnd); + + // 3. 비행 완료 항목 : 실제 비행이 완료된 건수 + long yesterdayCompleteCount = query.completeFlight(yesterdayStart,yesterdayEnd).size(); + long todayCompleteCount = query.completeFlight(todayStart,todayEnd).size(); + long tomorrowCompleteCount = query.completeFlight(tomorrowStart,tomorrowEnd).size(); + + // 4. 미 비행 항목 : 비행계획서는 제출했으나,실제 비행안한 건수 + long yesterdayNotFlight = query.notFlight(yesterdayStart,yesterdayEnd).size(); + long todayNotFlight = query.notFlight(todayStart, todayEnd).size(); + long tomorrowNotFlight = query.notFlight(tomorrowStart,tomorrowEnd).size(); + + // 5. 비고 : 비행 완료 건수를 기준으로 상승 또는 하락폭 적용 + // ex) 오늘 기준 오늘은 어제의 비행 완료 건수를 비교해서 적용 + // 전일(어제)은 2일전 비행 완료 건수를 비교해서 적용 + // 명일(내일)은 오늘 비행 완료 건수를 비교해서 적용 + long yesterdayNote = yesterdayCompleteCount - query.completeFlight(yesterdayStart.minus(1, ChronoUnit.DAYS), yesterdayEnd.minus(1, ChronoUnit.DAYS)).size(); + double yesterdayNotePercent = yesterdayCompleteCount != 0 ? ((double) yesterdayNote / yesterdayCompleteCount) * 100.0 : 0.0; + double todayNotePercent = yesterdayCompleteCount != 0 ? ((double)(todayCompleteCount - yesterdayCompleteCount) / yesterdayCompleteCount) * 100.0 : 0.0; + double tomorrowNotePercent = todayCompleteCount != 0 ? ((double) (tomorrowCompleteCount - todayCompleteCount) / todayCompleteCount) * 100.0 : 0.0; + + + + List result = new ArrayList<>(); + result.add(createModel("yesterday", yesterdayCount,yesterdayCompleteCount,yesterdayNotFlight,yesterdayNotePercent)); + result.add(createModel("today", todayCount,todayCompleteCount,todayNotFlight,todayNotePercent)); + result.add(createModel("tomorrow", tomorrowCount,tomorrowCompleteCount,tomorrowNotFlight,tomorrowNotePercent)); + + return result; + } + + private MainDashFlightNumStcsModel createModel(String dateType, long flightPlanCount, long completeCount, long notFlight, double note) { + MainDashFlightNumStcsModel model = new MainDashFlightNumStcsModel(); + model.setDateType(dateType); + model.setFlightPlan(flightPlanCount); + model.setCompleteFlight(completeCount); + model.setNotFlight(notFlight); + model.setNote(note); + return model; + } + } diff --git a/pav-server/src/main/java/com/palnet/biz/jpa/repository/ctr/CtrCntrlQueryRepository.java b/pav-server/src/main/java/com/palnet/biz/jpa/repository/ctr/CtrCntrlQueryRepository.java index 43f1ddb3..a4e854e7 100644 --- a/pav-server/src/main/java/com/palnet/biz/jpa/repository/ctr/CtrCntrlQueryRepository.java +++ b/pav-server/src/main/java/com/palnet/biz/jpa/repository/ctr/CtrCntrlQueryRepository.java @@ -9,6 +9,8 @@ import java.util.Calendar; import java.util.Date; import java.util.List; +import com.palnet.biz.api.main.dash.model.MainDashFlightNumStcsModel; +import com.querydsl.core.Tuple; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.annotation.Cacheable; @@ -2572,7 +2574,60 @@ public List listCntrlHstry(String id){ } - + public List completeFlight(Instant start, Instant end) { + // Tuple 여러 값을 담을 수 있는 클래스, 여러 필드를 한꺼번에 반환해야 할 때 유용하다. + QFltPlanCtrCntrlRel fpccr = QFltPlanCtrCntrlRel.fltPlanCtrCntrlRel; + QFltPlanBas fpb = QFltPlanBas.fltPlanBas; + QCtrCntrlBas ccb = QCtrCntrlBas.ctrCntrlBas; + + return query + .select( + fpb.planSno, + fpb.aprvlYn, + fpb.aprvlDt, + ccb.cntrlId, + ccb.statusCd, + ccb.cntrlStDt, + ccb.cntrlEndDt + ) + .from(fpb) + .leftJoin(fpccr).on(fpb.planSno.eq(fpccr.planSno)) + .leftJoin(ccb).on(fpccr.cntrlId.eq(ccb.cntrlId)) + .where( + fpb.aprvlYn.eq("Y"), + fpccr.planSno.isNotNull(), + ccb.statusCd.eq("99"), + ccb.cntrlEndDt.between(start,end) + ) + .fetch(); + + } + + public List notFlight(Instant start, Instant end){ + QCtrCntrlBas ccb = QCtrCntrlBas.ctrCntrlBas; + QFltPlanCtrCntrlRel fpccr = QFltPlanCtrCntrlRel.fltPlanCtrCntrlRel; + QFltPlanBas fpb = QFltPlanBas.fltPlanBas; + + return query + .select( + fpb.planSno, + fpb.aprvlYn, + fpb.aprvlDt, + ccb.cntrlId, + fpccr.cntrlId, + fpccr.planSno + ) + .from(fpb) + .leftJoin(fpccr).on(fpb.planSno.eq(fpccr.planSno)) + .leftJoin(ccb).on(fpccr.cntrlId.eq(ccb.cntrlId)) + .where( + fpb.aprvlYn.eq("Y"), + fpccr.planSno.isNull(), + ccb.cntrlEndDt.between(start, end), + fpb.aprvlDt.between(start, end) + ) + .fetch(); + } } diff --git a/pav-server/src/main/java/com/palnet/biz/jpa/repository/ctr/CtrCntrlWarnLogQueryRepository.java b/pav-server/src/main/java/com/palnet/biz/jpa/repository/ctr/CtrCntrlWarnLogQueryRepository.java index 4825bda1..2cd4d36e 100644 --- a/pav-server/src/main/java/com/palnet/biz/jpa/repository/ctr/CtrCntrlWarnLogQueryRepository.java +++ b/pav-server/src/main/java/com/palnet/biz/jpa/repository/ctr/CtrCntrlWarnLogQueryRepository.java @@ -317,7 +317,7 @@ public class CtrCntrlWarnLogQueryRepository { private BooleanBuilder getCurrentBooleanBuilder(String groupId, boolean authCheck, String cate, QFltPlanBas qFltPlanBas, QCtrCntrlWarnLog qCtrCntrlWarnLog){ BooleanBuilder builder = new BooleanBuilder(); - builder.and(qFltPlanBas.groupId.eq(groupId)); + if(groupId != null && !(groupId.equals("")))builder.and(qFltPlanBas.groupId.eq(groupId)); if(authCheck) builder.and(qFltPlanBas.cstmrSno.eq(jwtTokenUtil.getCstmrSnoByToken())); String dateFormat = "%Y-%m-%d"; diff --git a/pav-server/src/main/java/com/palnet/biz/jpa/repository/flt/FltPlanBasRepository.java b/pav-server/src/main/java/com/palnet/biz/jpa/repository/flt/FltPlanBasRepository.java index 94b07a4d..5d91b400 100644 --- a/pav-server/src/main/java/com/palnet/biz/jpa/repository/flt/FltPlanBasRepository.java +++ b/pav-server/src/main/java/com/palnet/biz/jpa/repository/flt/FltPlanBasRepository.java @@ -53,5 +53,8 @@ public interface FltPlanBasRepository extends JpaRepository "and f.aprvlYn = 'Y' ") List findBasList(@Param("planSno") int planSno); + @Query("SELECT f FROM FltPlanBas f WHERE f.aprvlYn = 'Y' AND f.aprvlDt IS NOT NULL AND f.aprvlDt >= :startDate AND f.aprvlDt < :endDate") + List findApprovedFlightPlansByApprovalDate(Instant startDate, Instant endDate); + long countByAprvlYnAndAprvlDtBetween(String aprvlYn, Instant startDate, Instant endDate); } 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 c36f8063..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(); @@ -1888,9 +1850,9 @@ public class FltPlanQueryRepository { private BooleanBuilder getCurrentBooleanBuilder(String groupId, boolean authCheck, String cate, QFltPlanBas qFltPlanBas){ BooleanBuilder builder = new BooleanBuilder(); - builder.and(qFltPlanBas.groupId.eq(groupId)); + 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