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 40339a9..7b2c8a1 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 @@ -3,10 +3,6 @@ package com.palnet.biz.api.main.dash.controller; import java.util.List; import java.util.Map; -import io.swagger.annotations.ApiImplicitParam; -import io.swagger.annotations.ApiImplicitParams; -import io.swagger.annotations.ApiOperation; -import io.swagger.v3.oas.annotations.tags.Tag; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; @@ -21,11 +17,16 @@ 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.FlightStaticStcsModel; +import com.palnet.biz.api.main.dash.model.FlightStcsModel; 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 io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; +import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; import lombok.extern.log4j.Log4j2; @@ -322,10 +323,17 @@ public class MainDashController { } @GetMapping("/stcs/flight/{type}") - public ResponseEntity statistics(@RequestParam String cate, @RequestParam String date, @PathVariable String type){ + @ApiOperation(value = "비행통계 cate = ['TIME', 'DISTANCE','FLT_COUNT'], type=['year','month','day','one-day']") + @Tag(name = "메인화면 컨트롤러", description = "메인화면 관련 API") + @ApiImplicitParams({ + @ApiImplicitParam(name = "date",value = "날짜[2023]", dataTypeClass = String.class), + @ApiImplicitParam(name = "cate",value = "비행시간,거리,횟수[TIME]", dataTypeClass = String.class), + @ApiImplicitParam(name = "type",value = "날짜형식[month]", dataTypeClass = String.class) + }) + public ResponseEntity statistics(@RequestParam String cate, String date, @PathVariable String type){ log.warn("cate => {}, date => {}, type => {}", cate, date, type); - List result = null; + FlightStcsModel result = new FlightStcsModel(); try { String[] formatParam = null; @@ -333,8 +341,11 @@ public class MainDashController { if(date == null) date = ""; formatParam = service.paramCheck(date,type); + List graphData = service.fltStatics(cate, date, formatParam); + List topData = service.fltTopStatics(cate, date, formatParam); - + result.setGraphData(graphData); + result.setTopData(topData); log.warn("result => {}", result); } catch (Exception e) { @@ -343,7 +354,7 @@ public class MainDashController { .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/model/FlightStcsModel.java b/pav-server/src/main/java/com/palnet/biz/api/main/dash/model/FlightStcsModel.java new file mode 100644 index 0000000..1f5de81 --- /dev/null +++ b/pav-server/src/main/java/com/palnet/biz/api/main/dash/model/FlightStcsModel.java @@ -0,0 +1,14 @@ +package com.palnet.biz.api.main.dash.model; + +import java.util.List; + +import lombok.Data; + +@Data +public class FlightStcsModel { + + private List graphData; + + private List topData; + +} 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 f0939fc..ad87d60 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 @@ -247,9 +247,45 @@ public class MainDashService { * @param formatParam * @return */ - public List statics(String date, String[] formatParam){ + public List fltStatics(String cate, String date, String[] formatParam){ + + List resultList = null; - List resultList = query.fltTimeStcs(date, formatParam); + switch (cate) { + case "TIME": + resultList = query.fltTimeStcs(date, formatParam); + + break; + case "DISTANCE": + resultList = query.fltDistanceStcs(date, formatParam); + + break; + case "FLT_COUNT": + resultList = query.fltCountStcs(date, formatParam); + + break; + } + + return resultList; + } + + public List fltTopStatics(String cate, String date, String[] formatParam){ + List resultList = null; + + switch (cate) { + case "TIME": + resultList = query.fltTopTimeStcs(date, formatParam); + + break; + case "DISTANCE": + resultList = query.fltTopDistanceStcs(date, formatParam); + + break; + case "FLT_COUNT": + resultList = query.fltTopCountStcs(date, formatParam); + + break; + } return resultList; } 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 35f2220..6bc95b5 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 @@ -1974,4 +1974,237 @@ public List listCntrlHstry(String id){ return result; } + + /** + * 비행통계 카테고리 거리 + * @param date + * @param formatParam + * @return + */ + public List fltDistanceStcs(String date, String[] formatParam){ + + QCtrCntrlBas bas = QCtrCntrlBas.ctrCntrlBas; + + StringTemplate formattedDate = Expressions.stringTemplate( + "DATE_FORMAT({0}, {1})" + , bas.createDt + , ConstantImpl.create(formatParam[0])); + + StringTemplate formattedDate2 = Expressions.stringTemplate( + "DATE_FORMAT({0}, {1})" + , bas.createDt + , ConstantImpl.create(formatParam[1])); + + BooleanBuilder builder = new BooleanBuilder(); + if(date != null && date.length() > 0) builder.and(formattedDate.eq(date)); + + List result = query + .select( + Projections.bean( + FlightStaticStcsModel.class , + formattedDate2.as("name"), + bas.ttlDstnc.sum().as("value") + ) + ) + .from(bas) + .where(builder) + .groupBy(formattedDate2) + .fetch(); + + if(result.size() <= 0){ + FlightStaticStcsModel node = new FlightStaticStcsModel(); + + node.setName(null); + node.setValue("NoData"); + + result.add(node); + } + + return result; + } + + /** + * 비행통계 카테고리 비행횟수 + * @param date + * @param formatParam + * @return + */ + public List fltCountStcs(String date, String[] formatParam){ + + QCtrCntrlBas bas = QCtrCntrlBas.ctrCntrlBas; + + StringTemplate formattedDate = Expressions.stringTemplate( + "DATE_FORMAT({0}, {1})" + , bas.createDt + , ConstantImpl.create(formatParam[0])); + + StringTemplate formattedDate2 = Expressions.stringTemplate( + "DATE_FORMAT({0}, {1})" + , bas.createDt + , ConstantImpl.create(formatParam[1])); + + BooleanBuilder builder = new BooleanBuilder(); + if(date != null && date.length() > 0) builder.and(formattedDate.eq(date)); + + List result = query + .select( + Projections.bean( + FlightStaticStcsModel.class , + formattedDate2.as("name"), + bas.cntrlId.count().as("value") + ) + ) + .from(bas) + .where(builder) + .groupBy(formattedDate2) + .fetch(); + + if(result.size() <= 0){ + FlightStaticStcsModel node = new FlightStaticStcsModel(); + + node.setName(null); + node.setValue("NoData"); + + result.add(node); + } + + return result; + } + + /** + * 비행 시간, 날짜데이터에 맞춘 TOP5 + * @param date + * @param formatParam + * @return + */ + public List fltTopTimeStcs(String date, String[] formatParam){ + QCtrCntrlBas bas = QCtrCntrlBas.ctrCntrlBas; + + StringTemplate formattedDate = Expressions.stringTemplate( + "DATE_FORMAT({0}, {1})" + , bas.createDt + , ConstantImpl.create(formatParam[0])); + + BooleanBuilder builder = new BooleanBuilder(); + if(date != null && date.length() > 0) builder.and(formattedDate.eq(date)); + + List result = query + .select( + Projections.bean(FlightStaticStcsModel.class, + bas.idntfNum.as("name"), // 결과 객체의 프로퍼티 이름을 지정 + Expressions.stringTemplate( + "CONCAT(SEC_TO_TIME(SUM(TIME_TO_SEC(TIMEDIFF({0}, {1})))))", + bas.cntrlEndDt, + bas.cntrlStDt + ).as("value") // 결과 객체의 프로퍼티 이름을 지정 + ) + ) + .from(bas) + .where(builder) + .groupBy(bas.idntfNum) + .orderBy(Expressions.stringTemplate( + "SEC_TO_TIME(SUM(TIME_TO_SEC(TIMEDIFF({0}, {1}))))", + bas.cntrlEndDt, + bas.cntrlStDt + ).desc()) + .limit(5) + .fetch(); + + if(result.size() <= 0){ + FlightStaticStcsModel node = new FlightStaticStcsModel(); + + node.setName(null); + node.setValue("NoData"); + + result.add(node); + } + + return result; + } + + /** + * 비행 거리, 날짜데이터에 맞춘 TOP5 + * @param date + * @param formatParam + * @return + */ + public List fltTopDistanceStcs(String date, String[] formatParam){ + QCtrCntrlBas bas = QCtrCntrlBas.ctrCntrlBas; + + StringTemplate formattedDate = Expressions.stringTemplate( + "DATE_FORMAT({0}, {1})" + , bas.createDt + , ConstantImpl.create(formatParam[0])); + + BooleanBuilder builder = new BooleanBuilder(); + if(date != null && date.length() > 0) builder.and(formattedDate.eq(date)); + + List result = query + .select( + Projections.bean(FlightStaticStcsModel.class, + bas.idntfNum.as("name"), // 결과 객체의 프로퍼티 이름을 지정 + bas.ttlDstnc.sum().as("value") + ) + ) + .from(bas) + .where(builder) + .groupBy(bas.idntfNum) + .orderBy(bas.ttlDstnc.sum().desc()) + .limit(5) + .fetch(); + + if(result.size() <= 0){ + FlightStaticStcsModel node = new FlightStaticStcsModel(); + + node.setName(null); + node.setValue("NoData"); + + result.add(node); + } + + return result; + } + + /** + * 비행 횟수, 날짜데이터에 맞춘 TOP5 + * @param date + * @param formatParam + * @return + */ + public List fltTopCountStcs(String date, String[] formatParam){ + QCtrCntrlBas bas = QCtrCntrlBas.ctrCntrlBas; + + StringTemplate formattedDate = Expressions.stringTemplate( + "DATE_FORMAT({0}, {1})" + , bas.createDt + , ConstantImpl.create(formatParam[0])); + + BooleanBuilder builder = new BooleanBuilder(); + if(date != null && date.length() > 0) builder.and(formattedDate.eq(date)); + + List result = query + .select( + Projections.bean(FlightStaticStcsModel.class, + bas.idntfNum.as("name"), // 결과 객체의 프로퍼티 이름을 지정 + bas.cntrlId.count().as("value") + ) + ) + .from(bas) + .where(builder) + .groupBy(bas.idntfNum) + .orderBy(bas.cntrlId.count().desc()) + .limit(5) + .fetch(); + + if(result.size() <= 0){ + FlightStaticStcsModel node = new FlightStaticStcsModel(); + + node.setName(null); + node.setValue("NoData"); + + result.add(node); + } + + return result; + } }