Compare commits

...

12 Commits

Author SHA1 Message Date
leehagjoon(이학준) fcf21b9510 Merge branch 'develop' into feature/main/dailyflight 10 months ago
lkd9125(이경도) 077cc56319 스웨거 어노테이션 추가 10 months ago
지대한 ab6c2442d8 Merge pull request 'feature/current/flight-plan' (#13) from feature/current/flight-plan into develop 10 months ago
lkd9125(이경도) 14b2dab58a 임포트문 추가 10 months ago
lkd9125(이경도) cbc8f3f502 Merge commit '86e2daeb494da96aed6171d406b65a894fa605d5' into feature/current/flight-plan 10 months ago
lkd9125(이경도) a65fc6be8c Merge commit '254771dc4278d3145de39d1017ef1c72a892b60b' into feature/current/flight-plan 10 months ago
lkd9125(이경도) 8bd4de84b2 Merge commit 'c4a9683ee0d84b023e21722962fcdffe224fd926' into feature/current/flight-plan 10 months ago
lkd9125(이경도) a30bd26ccd 합계 => 승인된 비행계획서 건수로 변경 10 months ago
lkd9125(이경도) 29053dd347 Merge commit '076b2922faff4b572200793c54565aa3ddcb842e' into feature/current/flight-plan 10 months ago
lkd9125(이경도) a03ff7a516 메소드명 변경 10 months ago
lkd9125(이경도) 67c911d94c Merge commit '5d6e3ff6780c7e47b5e113b1180a899692087e12' into feature/current/flight-plan 10 months ago
lkd9125(이경도) f709d99133 메인화면 일일비행 추가 10 months ago
  1. 37
      pav-server/src/main/java/com/palnet/biz/api/main/dash/controller/MainDashController.java
  2. 116
      pav-server/src/main/java/com/palnet/biz/api/main/dash/service/MainDashService.java
  3. 77
      pav-server/src/main/java/com/palnet/biz/jpa/repository/flt/FltPlanQueryRepository.java

37
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.List;
import java.util.Map; 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.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType; 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.BasicResponse;
import com.palnet.biz.api.comn.response.ErrorResponse; import com.palnet.biz.api.comn.response.ErrorResponse;
import com.palnet.biz.api.comn.response.SuccessResponse; 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.biz.api.main.dash.service.MainDashService;
import com.palnet.comn.code.RSErrorCode; import com.palnet.comn.code.RSErrorCode;
import com.querydsl.core.Tuple;
import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiImplicitParams;
@ -338,6 +340,12 @@ public class MainDashController {
} }
@GetMapping("/current/flight-warn") @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<? extends BasicResponse> currentFlightWarn(@RequestParam(required = false) String groupId){ public ResponseEntity<? extends BasicResponse> currentFlightWarn(@RequestParam(required = false) String groupId){
List<MainCurrentStcsModel> result = new ArrayList<>(); List<MainCurrentStcsModel> result = new ArrayList<>();
@ -353,18 +361,27 @@ public class MainDashController {
return ResponseEntity.ok().body(new SuccessResponse<List<MainCurrentStcsModel>>(result)); return ResponseEntity.ok().body(new SuccessResponse<List<MainCurrentStcsModel>>(result));
} }
@GetMapping("/stcs/dailyflight") @GetMapping("/current/flight-plan")
@ApiOperation(value = "일일 비행횟수 현황") @ApiOperation(value = "일일 비행계획 통계")
@Tag(name = "메인화면 컨트롤러", description = "메인화면 관련 API") @Tag(name = "메인화면 컨트롤러", description = "메인화면 관련 API")
public ResponseEntity<? extends BasicResponse> getDailyFlightNumOfStcs(){ @ApiImplicitParams({
List<MainDashFlightNumStcsModel> result = null; @ApiImplicitParam(name = "date",value = "날짜", dataTypeClass = String.class),
@ApiImplicitParam(name = "type",value = "날짜형식", dataTypeClass = String.class)
})
public ResponseEntity<? extends BasicResponse> currentFlightPlan(@RequestParam(required = false) String groupId){
log.warn("groupId => {}", groupId);
List<MainCurrentStcsModel> result = new ArrayList<>();
try { try {
result = service.dailyFlightNumOfStcs(); result = service.currentFlightPlan(groupId);
} catch (Exception e){ } catch (Exception e){
log.error("IGNORE : {}", e); log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(new ErrorResponse("Server Error", "-1")); return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
} .body(new ErrorResponse("Server Error", "-1"));
return ResponseEntity.ok().body(new SuccessResponse<List<MainDashFlightNumStcsModel>>(result));
} }
return ResponseEntity.ok().body(new SuccessResponse<List<MainCurrentStcsModel>>(result));
}
} }

116
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; package com.palnet.biz.api.main.dash.service;
import java.time.Instant; import java.util.*;
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.stream.Collectors; import java.util.stream.Collectors;
import com.palnet.biz.api.acnt.jwt.model.JwtGroupModel; import com.palnet.biz.api.acnt.jwt.model.JwtGroupModel;
import com.palnet.biz.api.acnt.jwt.utils.JwtTokenUtil; import com.palnet.biz.api.acnt.jwt.utils.JwtTokenUtil;
import com.palnet.biz.api.bas.group.model.BasGroupModel; 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.entity.FltPlanBas;
import com.palnet.biz.jpa.repository.flt.FltPlanBasRepository;
import com.palnet.biz.jpa.repository.pty.*; import com.palnet.biz.jpa.repository.pty.*;
import com.querydsl.core.Tuple; import com.querydsl.core.Tuple;
import com.querydsl.core.BooleanBuilder;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger; import org.slf4j.Logger;
@ -25,13 +20,10 @@ import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; 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.MainDashFlightListModel;
import com.palnet.biz.api.main.dash.model.MainDashListModel; 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.model.MainDashStcsModel;
import com.palnet.biz.api.main.statistics.service.MainStatisticsService;
import com.palnet.biz.jpa.entity.CtrCntrlWarnLog; 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.entity.type.WarnType;
import com.palnet.biz.jpa.repository.ctr.CtrCntrlQueryRepository; import com.palnet.biz.jpa.repository.ctr.CtrCntrlQueryRepository;
import com.palnet.biz.jpa.repository.ctr.CtrCntrlWarnLogQueryRepository; import com.palnet.biz.jpa.repository.ctr.CtrCntrlWarnLogQueryRepository;
@ -41,8 +33,6 @@ import com.palnet.biz.jpa.repository.flt.FltPlanQueryRepository;
@Service @Service
@Slf4j @Slf4j
public class MainDashService { public class MainDashService {
@Autowired
private FltPlanBasRepository fltPlanBasRepository;
private Logger logger = LoggerFactory.getLogger(getClass()); private Logger logger = LoggerFactory.getLogger(getClass());
@ -62,14 +52,13 @@ public class MainDashService {
private CtrCntrlQueryRepository query; private CtrCntrlQueryRepository query;
@Autowired @Autowired
private FltPlanArcrftRepository fltPlanArcrftRepository; private MainStatisticsService mainStatisticsService;
@Autowired @Autowired
private JwtTokenUtil token; private FltPlanArcrftRepository fltPlanArcrftRepository;
@Autowired @Autowired
private MainStatisticsService mainStatisticsService; private JwtTokenUtil token;
/** /**
* 일별 비행횟수 통계 * 일별 비행횟수 통계
@ -293,60 +282,55 @@ public class MainDashService {
return result; return result;
} }
public List<MainDashFlightNumStcsModel> 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<MainDashFlightNumStcsModel> 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;
public List<MainCurrentStcsModel> currentFlightPlan(String groupId){
final int sumCount = 2; // 2번은 합계
boolean authCheck = mainStatisticsService.authCheck(groupId);
String[] dateCate = {"-2", "-1", "0", "1"}; // 2일전, 전일, 금일, 명일
List<MainCurrentStcsModel> result = new ArrayList<>();
for(String cate : dateCate){
List<FltPlanBas> fltPlanBas = fltPlanQueryRepository.currentFlightStcs(groupId, authCheck, cate);
int count = fltPlanBas.size();
int aprvnCount = (int)fltPlanBas.stream().filter(value -> value.getAprvlYn().equals("Y")).count();
List<Integer> stcsValues = Arrays.asList(count, aprvnCount, aprvnCount);
MainCurrentStcsModel node = new MainCurrentStcsModel();
node.setStcsValues(stcsValues);
result.add(node);
} }
private MainDashFlightNumStcsModel createModel(String dateType, long flightPlanCount, long completeCount, long notFlight, double note) { for(int i = 0; i < result.size(); i++){
MainDashFlightNumStcsModel model = new MainDashFlightNumStcsModel();
model.setDateType(dateType); if(i == 0) continue;;
model.setFlightPlan(flightPlanCount);
model.setCompleteFlight(completeCount); int prevSum = result.get(i-1).getStcsValues().get(sumCount); // 전날 합계 [기준]
model.setNotFlight(notFlight); int sum = result.get(i).getStcsValues().get(sumCount); // 합계
model.setNote(note);
return model; double percent = 0;
if(prevSum != 0){
percent = ((sum - prevSum) / (double) prevSum) * 100;
}
result.get(i).setPercent(percent);
}
result.remove(0);
return result;
} }
public List<MainCurrentStcsModel> currentFlightWarn(String groupId){ public List<MainCurrentStcsModel> currentFlightWarn(String groupId){
final int sumCount = 3; // 3번은 합계 final int sumCount = 3; // 3번은 합계

77
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.Map;
import java.util.Optional; 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.cache.annotation.Cacheable;
import org.springframework.data.domain.Page; import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl; import org.springframework.data.domain.PageImpl;
@ -1824,8 +1827,8 @@ public class FltPlanQueryRepository {
BooleanBuilder builder = new BooleanBuilder(); BooleanBuilder builder = new BooleanBuilder();
if(date != null && date.length() > 0) builder.and(formattedDate.eq(date)); if(date != null && date.length() > 0) builder.and(formattedDate.eq(date));
builder.and(qFltPlanBas.aprvlYn.eq("Y")); 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())); if(authCheck) builder.and(qFltPlanBas.cstmrSno.eq(jwtTokenUtil.getCstmrSnoByToken()));
if(groupId != null && !(groupId.equals(""))) builder.and(qFltPlanBas.groupId.eq(groupId));
List<FlightStcsValueModel> result = query List<FlightStcsValueModel> result = query
.select( .select(
@ -1855,6 +1858,78 @@ public class FltPlanQueryRepository {
return result; return result;
} }
/**
* 일일 비행데이터
* @param groupId
* @param authCheck
* @param cate
* @return
*/
public List<FltPlanBas> currentFlightStcs(String groupId, boolean authCheck, String cate){
QFltPlanBas qFltPlanBas = QFltPlanBas.fltPlanBas;
BooleanBuilder builder = getCurrentBooleanBuilder(groupId, authCheck, cate, qFltPlanBas);
List<FltPlanBas> 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<MainDashFlightListModel> getFlightDronList(String orderBy, String groupId){ public List<MainDashFlightListModel> getFlightDronList(String orderBy, String groupId){
QComIdntfBas cib = QComIdntfBas.comIdntfBas; QComIdntfBas cib = QComIdntfBas.comIdntfBas;

Loading…
Cancel
Save