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 55af27ba..cf4bde4b 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.*; +import com.palnet.biz.api.main.dash.model.MainCurrentStcsModel; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; @@ -18,9 +18,11 @@ 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; -import com.querydsl.core.Tuple; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; @@ -49,7 +51,7 @@ public class MainDashController { @ApiImplicitParam(name = "yyyymm",value = "날짜", dataTypeClass = String.class) public ResponseEntity stcsDay(String yyyymm) { List result = null; - + // log.debug(yyyymm); //입력값 검증 @@ -338,6 +340,12 @@ public class MainDashController { } @GetMapping("/current/flight-warn") + @ApiOperation(value = "일일 비정상상황 통계") + @Tag(name = "메인화면 컨트롤러", description = "메인화면 관련 API") + @ApiImplicitParams({ + @ApiImplicitParam(name = "date",value = "날짜", dataTypeClass = String.class), + @ApiImplicitParam(name = "type",value = "날짜형식", dataTypeClass = String.class) + }) public ResponseEntity currentFlightWarn(@RequestParam(required = false) String groupId){ List result = new ArrayList<>(); @@ -351,20 +359,29 @@ public class MainDashController { } return ResponseEntity.ok().body(new SuccessResponse>(result)); - } + } + + @GetMapping("/current/flight-plan") + @ApiOperation(value = "일일 비행계획 통계") + @Tag(name = "메인화면 컨트롤러", description = "메인화면 관련 API") + @ApiImplicitParams({ + @ApiImplicitParam(name = "date",value = "날짜", dataTypeClass = String.class), + @ApiImplicitParam(name = "type",value = "날짜형식", dataTypeClass = String.class) + }) + public ResponseEntity currentFlightPlan(@RequestParam(required = false) String groupId){ - @GetMapping("/stcs/dailyflight") - @ApiOperation(value = "일일 비행횟수 현황") - @Tag(name = "메인화면 컨트롤러",description = "메인화면 관련 API") - public ResponseEntity getDailyFlightNumOfStcs(){ - List result = null; + log.warn("groupId => {}", groupId); + List result = new ArrayList<>(); try { - result = service.dailyFlightNumOfStcs(); - }catch (Exception e){ - log.error("IGNORE : {} ", e); - return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(new ErrorResponse("Server Error", "-1")); + result = service.currentFlightPlan(groupId); + } 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)); + + + + return ResponseEntity.ok().body(new SuccessResponse>(result)); } - } 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 4223d7a4..51fb56a5 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,23 +1,18 @@ package com.palnet.biz.api.main.dash.service; -import java.time.Instant; -import java.time.temporal.ChronoUnit; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +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.MainDashFlightNumStcsModel; +import com.palnet.biz.api.main.dash.model.MainCurrentStcsModel; +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; +import com.querydsl.core.BooleanBuilder; import lombok.extern.slf4j.Slf4j; import org.slf4j.Logger; @@ -25,13 +20,10 @@ import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import com.palnet.biz.api.main.dash.model.MainCurrentStcsModel; 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.statistics.service.MainStatisticsService; import com.palnet.biz.jpa.entity.CtrCntrlWarnLog; -import com.palnet.biz.jpa.entity.FltPlanBas; import com.palnet.biz.jpa.entity.type.WarnType; import com.palnet.biz.jpa.repository.ctr.CtrCntrlQueryRepository; import com.palnet.biz.jpa.repository.ctr.CtrCntrlWarnLogQueryRepository; @@ -41,9 +33,7 @@ import com.palnet.biz.jpa.repository.flt.FltPlanQueryRepository; @Service @Slf4j public class MainDashService { - @Autowired - private FltPlanBasRepository fltPlanBasRepository; - + private Logger logger = LoggerFactory.getLogger(getClass()); @Autowired @@ -59,17 +49,16 @@ public class MainDashService { private CtrCntrlWarnLogQueryRepository ctrCntrlWarnLogQueryRepository; @Autowired - private CtrCntrlQueryRepository query; + private CtrCntrlQueryRepository query; @Autowired - private FltPlanArcrftRepository fltPlanArcrftRepository; - - @Autowired - private JwtTokenUtil token; + private MainStatisticsService mainStatisticsService; @Autowired - private MainStatisticsService mainStatisticsService; + private FltPlanArcrftRepository fltPlanArcrftRepository; + @Autowired + private JwtTokenUtil token; /** * 일별 비행횟수 통계 @@ -293,58 +282,53 @@ 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)); + + + public List currentFlightPlan(String groupId){ + final int sumCount = 2; // 2번은 합계 + + boolean authCheck = mainStatisticsService.authCheck(groupId); + + String[] dateCate = {"-2", "-1", "0", "1"}; // 2일전, 전일, 금일, 명일 + + List result = new ArrayList<>(); + + for(String cate : dateCate){ + List fltPlanBas = fltPlanQueryRepository.currentFlightStcs(groupId, authCheck, cate); + + int count = fltPlanBas.size(); + int aprvnCount = (int)fltPlanBas.stream().filter(value -> value.getAprvlYn().equals("Y")).count(); + + List stcsValues = Arrays.asList(count, aprvnCount, aprvnCount); + + MainCurrentStcsModel node = new MainCurrentStcsModel(); + node.setStcsValues(stcsValues); + + result.add(node); + } + + for(int i = 0; i < result.size(); i++){ + + if(i == 0) continue;; + + int prevSum = result.get(i-1).getStcsValues().get(sumCount); // 전날 합계 [기준] + int sum = result.get(i).getStcsValues().get(sumCount); // 합계 + + double percent = 0; + + if(prevSum != 0){ + percent = ((sum - prevSum) / (double) prevSum) * 100; + } + + result.get(i).setPercent(percent); + } + + result.remove(0); 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; - } + public List currentFlightWarn(String groupId){ 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 9e6b32d1..6ff1309a 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 @@ -11,6 +11,9 @@ 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; @@ -1824,8 +1827,8 @@ public class FltPlanQueryRepository { 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())); if(groupId != null && !(groupId.equals(""))) builder.and(qFltPlanBas.groupId.eq(groupId)); - if(authCheck) builder.and(qFltPlanBas.cstmrSno.eq(jwtTokenUtil.getCstmrSnoByToken())); List result = query .select( @@ -1854,6 +1857,78 @@ public class FltPlanQueryRepository { return result; } + + /** + * 일일 비행데이터 + * @param groupId + * @param authCheck + * @param cate + * @return + */ + public List currentFlightStcs(String groupId, boolean authCheck, String cate){ + QFltPlanBas qFltPlanBas = QFltPlanBas.fltPlanBas; + + BooleanBuilder builder = getCurrentBooleanBuilder(groupId, authCheck, cate, qFltPlanBas); + + List stcsValues = query + .select( + Projections.bean( + FltPlanBas.class, + qFltPlanBas.planSno, + qFltPlanBas.aprvlYn + ) + ) + .from(qFltPlanBas) + .where(builder) + .fetch(); + + return stcsValues; + } + + private BooleanBuilder getCurrentBooleanBuilder(String groupId, boolean authCheck, String cate, QFltPlanBas qFltPlanBas){ + + BooleanBuilder builder = new BooleanBuilder(); + builder.and(qFltPlanBas.groupId.eq(groupId)); + if(authCheck) builder.and(qFltPlanBas.cstmrSno.eq(jwtTokenUtil.getCstmrSnoByToken())); + + BooleanExpression dateExpression = null; + switch (cate){ + case "-2" : + dateExpression = + Expressions.stringTemplate("DATE_FORMAT({0}, {1})", qFltPlanBas.createDt, "%Y-%m-%d") + .eq(LocalDate.now().minusDays(2).toString()); + + builder.and(dateExpression); + + break; + case "-1": + dateExpression = + Expressions.stringTemplate("DATE_FORMAT({0}, {1})", qFltPlanBas.createDt, "%Y-%m-%d") + .eq(LocalDate.now().minusDays(1).toString()); + + builder.and(dateExpression); + break; + + case "0": + dateExpression = + Expressions.stringTemplate("DATE_FORMAT({0}, {1})", qFltPlanBas.createDt, "%Y-%m-%d") + .eq(LocalDate.now().toString()); + builder.and(dateExpression); + break; + + case "1": + dateExpression = + Expressions.stringTemplate("DATE_FORMAT({0}, {1})", qFltPlanBas.createDt, "%Y-%m-%d") + .eq(LocalDate.now().plusDays(1).toString()); + + builder.and(dateExpression); + break; + } + + return builder; + } + + public List getFlightDronList(String orderBy, String groupId){