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 index c93bc60d..29cf8009 100644 --- 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 @@ -30,6 +30,6 @@ public class MainDashFlightNumStcsModel { private long notFlight = 0; @ApiParam(value = "비고",example = "전일(어제), 금일(오늘), 명일(내일) 비고") - private int note = 0; + 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 ce9f3709..02ea506a 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 @@ -268,28 +268,59 @@ public class MainDashService { 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); log.info("yesterdayCount: {}", yesterdayCount); - long todayCount = fltPlanBasRepository.countByAprvlYnAndAprvlDtBetween("Y", todayStart, todayEnd); log.info("todayCount: {}", todayCount); - long tomorrowCount = fltPlanBasRepository.countByAprvlYnAndAprvlDtBetween("Y", tomorrowStart, tomorrowEnd); log.info("tomorrowCount: {}", tomorrowCount); - // 카운트와 함께 MainDashFlightNumStcsModel 인스턴스 생성 + // 3. 비행 완료 항목 : 실제 비행이 완료된 건수 + long yesterdayCompleteCount = query.completeFlight(yesterdayStart,yesterdayEnd).size(); + log.info("yesterdayCompleteCount: {}", yesterdayCompleteCount); + long todayCompleteCount = query.completeFlight(todayStart,todayEnd).size(); + log.info("todayCompleteCount: {}", todayCompleteCount); + long tomorrowCompleteCount = query.completeFlight(tomorrowStart,tomorrowEnd).size(); + log.info("tomorrowCompleteCount: {}", tomorrowCompleteCount); + + // 4. 미 비행 항목 : 비행계획서는 제출했으나,실제 비행안한 건수 + long yesterdayNotFlight = query.notFlight(yesterdayStart,yesterdayEnd).size(); + log.info("yesterdayNotFlight : {} ", yesterdayNotFlight); + long todayNotFlight = query.notFlight(todayStart, todayEnd).size(); + log.info("todayNotFlight : {} ", todayNotFlight); + long tomorrowNotFlight = query.notFlight(tomorrowStart,tomorrowEnd).size(); + log.info("tomorrowNotFlight : {} ", tomorrowNotFlight); + + // 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; + log.info("yesterdayNotePercent: {} ", yesterdayNotePercent); + double todayNotePercent = yesterdayCompleteCount != 0 ? ((double)(todayCompleteCount - yesterdayCompleteCount) / yesterdayCompleteCount) * 100.0 : 0.0; + log.info("todayNotePercent: {} ", todayNotePercent); + double tomorrowNotePercent = todayCompleteCount != 0 ? ((double) (tomorrowCompleteCount - todayCompleteCount) / todayCompleteCount) * 100.0 : 0.0; + log.info("tomorrowNotePercent: {} ", tomorrowNotePercent); + + + List result = new ArrayList<>(); - result.add(createModel("yesterday", yesterdayCount)); - result.add(createModel("today", todayCount)); - result.add(createModel("tomorrow", tomorrowCount)); + 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) { + 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 9e6491e1..3097bc6f 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; @@ -2570,7 +2572,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(); + } }