From 9b7f837cf5092c01049ff39d3e4eb39f2a26aeaa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?lkd9125=28=EC=9D=B4=EA=B2=BD=EB=8F=84=29?= Date: Tue, 12 Dec 2023 15:52:10 +0900 Subject: [PATCH] =?UTF-8?q?main/statistics=20=ED=8C=A8=ED=82=A4=EC=A7=80?= =?UTF-8?q?=20=EC=A3=BC=EC=84=9D=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/MainStatisticsController.java | 91 ++++- .../service/MainStatisticsService.java | 8 +- .../ctr/CtrCntrlQueryRepository.java | 204 +++++++++- .../ctr/CtrCntrlWarnLogQueryRepository.java | 148 ++++++- .../flt/FltPlanQueryRepository.java | 371 +++++++++++++++++- 5 files changed, 807 insertions(+), 15 deletions(-) diff --git a/pav-server/src/main/java/com/palnet/biz/api/main/statistics/controller/MainStatisticsController.java b/pav-server/src/main/java/com/palnet/biz/api/main/statistics/controller/MainStatisticsController.java index 89ef091..9e09c1f 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/main/statistics/controller/MainStatisticsController.java +++ b/pav-server/src/main/java/com/palnet/biz/api/main/statistics/controller/MainStatisticsController.java @@ -34,6 +34,11 @@ public class MainStatisticsController { private final MainStatisticsService service; + /** + * 비행통계 상단데이터 통계 조회기능. + * @param serviceType + * @return + */ @GetMapping("/flight-static") @ApiOperation(value = "비행통계 상단 데이터[DB전체 통계데이터]") @Tag(name = "통계 컨트롤러", description = "통계 관련 API") @@ -42,8 +47,15 @@ public class MainStatisticsController { List result = null; try { - result = service.getFlightStaticStcs(serviceType); + result = service.getFlightStaticStcs(serviceType); // 비행관련 고정 통계, 항상 DB 전체값에서 통계조회 하는기능. } catch (Exception e) { + /** + * try{ + ... + } + * try 영역 안 코드들중 문제가 생기면 오는 곳. + * log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌 + */ log.error("IGNORE : {}", e); return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) .body(new ErrorResponse("Server Error", "-1")); @@ -52,6 +64,12 @@ public class MainStatisticsController { return ResponseEntity.ok().body(new SuccessResponse>(result)); } + /** + * 날짜별, 타입별 비행통계 조회 기능. + * @param rq + * @param type + * @return + */ @GetMapping("/flight/{type}") @ApiOperation(value = "비행통계 cate = ['TIME', 'DISTANCE','FLT_COUNT'], type=['year','month','day','one-day']") @Tag(name = "통계 컨트롤러", description = "통계 관련 API") @@ -62,22 +80,27 @@ public class MainStatisticsController { }) public ResponseEntity fltStcs(FlightStcsRQ rq, @PathVariable String type){ - log.warn("type => {}", type); - FlightStcsModel result = new FlightStcsModel(); try { String[] formatParam = null; if(rq.getDate() == null) rq.setDate(""); - formatParam = service.paramCheck(rq.getDate(),type); + formatParam = service.paramCheck(rq.getDate(),type); // 파라미터 체크 - List graphData = service.fltStatics(rq, formatParam); - List topData = service.fltTopStatics(rq, formatParam); + List graphData = service.fltStatics(rq, formatParam); // 비행통계 기능 + List topData = service.fltTopStatics(rq, formatParam); // 비행통계 카테고리 별 Top 5 데이터 조회하기 기능 result.setGraphData(graphData); result.setTopData(topData); } catch (Exception e) { + /** + * try{ + ... + } + * try 영역 안 코드들중 문제가 생기면 오는 곳. + * log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌 + */ log.error("IGNORE : {}", e); return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) .body(new ErrorResponse("Server Error", "-1")); @@ -86,8 +109,11 @@ public class MainStatisticsController { return ResponseEntity.ok().body(new SuccessResponse(result)); } - - + /** + * 비정상 상황 상단 데이터 조회기능. + * @param serviceType + * @return + */ @GetMapping("/warn-static") @ApiOperation(value = "비정상 상황 상단 데이터[DB전체 통계데이터]") @Tag(name = "통계 컨트롤러", description = "통계 관련 API") @@ -98,6 +124,13 @@ public class MainStatisticsController { try { result = service.getWarnStaticStcs(serviceType); } catch (Exception e) { + /** + * try{ + ... + } + * try 영역 안 코드들중 문제가 생기면 오는 곳. + * log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌 + */ log.error("IGNORE : {}", e); return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) .body(new ErrorResponse("Server Error", "-1")); @@ -105,7 +138,13 @@ public class MainStatisticsController { return ResponseEntity.ok().body(new SuccessResponse>(result)); } - + + /** + * 날짜별, 카테고리별 비정상 상황에 대한 통계 조회 기능 + * @param rq + * @param type + * @return + */ @GetMapping("/warn/{type}") @ApiOperation(value = "비정상상황 cate = ['PLAN' ,'ALTITUDE', 'CRASH'], type=['year','month','day','one-day']") @Tag(name = "통계 컨트롤러", description = "통계 관련 API") @@ -130,6 +169,13 @@ public class MainStatisticsController { result.setGraphData(graphData); result.setTopData(topData); } catch (Exception e) { + /** + * try{ + ... + } + * try 영역 안 코드들중 문제가 생기면 오는 곳. + * log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌 + */ log.error("IGNORE : {}", e); return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) .body(new ErrorResponse("Server Error", "-1")); @@ -138,6 +184,11 @@ public class MainStatisticsController { return ResponseEntity.ok().body(new SuccessResponse(result)); } + /** + * 비행실적 상단데이터 통계 기능. + * @param serviceType + * @return + */ @GetMapping("/flight/result-static") @ApiOperation(value = "비행실적 상단데이터 통계 [DB전체 통계데이터]") @Tag(name = "통계 컨트롤러", description = "통계 관련 API") @@ -148,6 +199,13 @@ public class MainStatisticsController { try { result = service.getFltResultStaticStcs(serviceType); } catch (Exception e) { + /** + * try{ + ... + } + * try 영역 안 코드들중 문제가 생기면 오는 곳. + * log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌 + */ log.error("IGNORE : {}", e); return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) .body(new ErrorResponse("Server Error", "-1")); @@ -156,8 +214,14 @@ public class MainStatisticsController { return ResponseEntity.ok().body(new SuccessResponse>(result)); } + /** + * 날짜별, 카테고리별 비행실적 통계 + * @param rq + * @param type + * @return + */ @GetMapping("/flight/result/{type}") - @ApiOperation(value = "비정상상황 cate = ['FLT_RESULT' ,'FLT_PLAN', 'FLT_PLAN_APRVN'], type=['year','month','day','one-day']") + @ApiOperation(value = "비행실적 cate = ['FLT_RESULT' ,'FLT_PLAN', 'FLT_PLAN_APRVN'], type=['year','month','day','one-day']") @Tag(name = "통계 컨트롤러", description = "통계 관련 API") @ApiImplicitParams({ @ApiImplicitParam(name = "date",value = "날짜[2023]", dataTypeClass = String.class), @@ -180,6 +244,13 @@ public class MainStatisticsController { result.setGraphData(graphData); result.setTopData(topData); } catch (Exception e) { + /** + * try{ + ... + } + * try 영역 안 코드들중 문제가 생기면 오는 곳. + * log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌 + */ log.error("IGNORE : {}", e); return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) .body(new ErrorResponse("Server Error", "-1")); diff --git a/pav-server/src/main/java/com/palnet/biz/api/main/statistics/service/MainStatisticsService.java b/pav-server/src/main/java/com/palnet/biz/api/main/statistics/service/MainStatisticsService.java index 2b10c43..1271e18 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/main/statistics/service/MainStatisticsService.java +++ b/pav-server/src/main/java/com/palnet/biz/api/main/statistics/service/MainStatisticsService.java @@ -140,7 +140,7 @@ public class MainStatisticsService { /** - * 비행관련 고정 통계, 항상 DB 전체값에서 통계진행할것임 + * 비행관련 고정 통계, 항상 DB 전체값에서 통계조회 하는기능. * @return */ public List getFlightStaticStcs(String serviceType){ @@ -426,6 +426,12 @@ public class MainStatisticsService { return resultList; } + /** + * 비행실적 TOP 5 기체정보 조회하는 기능. + * @param rq + * @param formatParam + * @return + */ public List getFltTopResultStcs(FlightStcsRQ rq, String[] formatParam){ List resultList = null; 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 ba82f5f..b14b0a6 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 @@ -2370,6 +2370,23 @@ public class CtrCntrlQueryRepository{ if(serviceType != null && !(serviceType.equals(""))) builder.and(qFltPlanBas.serviceType.eq(serviceType)); if(authCheck) builder.and(qFltPlanBas.cstmrSno.eq(jwtTokenUtil.getCstmrSnoByToken())); + /** + * 각 항별[serviceType] 조건인지, + * 권한에 따른 회원통계값[cstmrSno] 조건인지 확인하여 조회하는 SQL 입니다. + * + * SELECT + * CCB.IDNTF_NUM AS 'name' + * FROM CTR_CNTRL_BAS CCB + * LEFT OUTER JOIN FLT_PLAN_CTR_CNTRL_REL FPCCR + * ON FPCCR.CNTRL_ID = CCB.CNTRL_ID + * LEFT OUTER JOIN FLT_PLAN_BAS FPB + * ON FPCCR.PLAN_SNO = FPB.PLAN_SNO + * WHERE FPB.SERVICE_TYPE = #{servicType} + * AND FPB.CSTMR_SNO = #{cstmrSno} -- 권한이 유저인경우 + * GROUP BY CCB.IDNTF_NUM + * ORDER BY SEC_TO_TIME(SUM(TIME_TO_SEC(TIMEDIFF(CCB.CNTRL_END_DT , CCB.CNTRL_ST_DT)))) DESC + * LIMIT 1 + */ List queryResult = query .select( Projections.bean(FlightStcsValueModel.class, @@ -2423,6 +2440,13 @@ public class CtrCntrlQueryRepository{ return result; } + /** + * 가장 많은 비행시간을 가진 기체, 비행시간 SELECT[일알] + * @param idntfNum + * @param authCheck + * @param serviceType + * @return + */ private String getFltTimeDay(String idntfNum, boolean authCheck, String serviceType){ QCtrCntrlBas qCtrCntrlBas = QCtrCntrlBas.ctrCntrlBas; QFltPlanCtrCntrlRel qFltPlanCtrCntrlRel = QFltPlanCtrCntrlRel.fltPlanCtrCntrlRel; @@ -2437,6 +2461,23 @@ public class CtrCntrlQueryRepository{ builder.and(Expressions.stringTemplate("DATE_FORMAT({0}, {1})", qCtrCntrlBas.createDt, dateFormat) .eq(LocalDate.now().toString())); + /** + * 각 항별[serviceType] 조건인지, + * 권한에 따른 회원통계값[cstmrSno] 조건인지, + * 기체식별번호[idntfNum] 조건인지, + * 생성일시[createDt]값이 오늘인지 조건인지 확인하여 조회하는 SQL 입니다. + * + * SELECT + * CONCAT(SEC_TO_TIME(SUM(TIME_TO_SEC(TIMEDIFF(CCB.CNTRL_END_DT , CCB.CNTRL_ST_DT))))) + * FROM CTR_CNTRL_BAS CCB + * LEFT OUTER JOIN FLT_PLAN_CTR_CNTRL_REL FPCCR + * ON FPCCR.CNTRL_ID = CCB.CNTRL_ID + * LEFT OUTER JOIN FLT_PLAN_BAS FPB + * ON FPCCR.PLAN_SNO = FPB.PLAN_SNO + * WHERE FPB.SERVICE_TYPE = #{serviceType} + * AND FPB.CSTMR_SNO = #{cstmrSno} -- 권한이 유저인경우 + * AND DATE_FORMAT(CCB.CREATE_DT, #{dateForamt}) = ㅜㅒㅈ + */ return String.valueOf(query .select( Expressions.stringTemplate( @@ -2454,11 +2495,19 @@ public class CtrCntrlQueryRepository{ .fetchOne()); } + /** + * 가장 많은 비행시간을 가진 기체, 비행시간 SELECT[월] + * @param idntfNum + * @param authCheck + * @param serviceType + * @return + */ private String getFltTimeMonth(String idntfNum, boolean authCheck, String serviceType){ QCtrCntrlBas qCtrCntrlBas = QCtrCntrlBas.ctrCntrlBas; QFltPlanCtrCntrlRel qFltPlanCtrCntrlRel = QFltPlanCtrCntrlRel.fltPlanCtrCntrlRel; QFltPlanBas qFltPlanBas = QFltPlanBas.fltPlanBas; + BooleanBuilder builder = new BooleanBuilder(); builder.and(qCtrCntrlBas.idntfNum.eq(idntfNum)); builder.and(qCtrCntrlBas.createDt.goe(LocalDate.now().minusMonths(1).atStartOfDay().atZone(ZoneId.of("Asia/Seoul")).toInstant())); @@ -2466,6 +2515,24 @@ public class CtrCntrlQueryRepository{ if(serviceType != null && !(serviceType.equals(""))) builder.and(qFltPlanBas.serviceType.eq(serviceType)); if(authCheck) builder.and(qFltPlanBas.cstmrSno.eq(jwtTokenUtil.getCstmrSnoByToken())); + /** + * 각 항별[serviceType] 조건인지, + * 권한에 따른 회원통계값[cstmrSno] 조건인지, + * 기체식별번호[idntfNum] 조건인지, + * 생성일시[createDt]값이 오늘인지 조건인지 확인하여 조회하는 SQL 입니다. + * + * SELECT + * CONCAT(SEC_TO_TIME(SUM(TIME_TO_SEC(TIMEDIFF(CCB.CNTRL_END_DT , CCB.CNTRL_ST_DT))))) + * FROM CTR_CNTRL_BAS CCB + * LEFT OUTER JOIN FLT_PLAN_CTR_CNTRL_REL FPCCR + * ON FPCCR.CNTRL_ID = CCB.CNTRL_ID + * LEFT OUTER JOIN FLT_PLAN_BAS FPB + * ON FPCCR.PLAN_SNO = FPB.PLAN_SNO + * WHERE FPB.SERVICE_TYPE = #{serviceType} + * AND FPB.CSTMR_SNO = #{cstmrSno} -- 권한이 유저인경우 + * AND CCB.CREATE_DT >= '한달전 오늘' + * AND CCB.CREATE_DT <= '오늘' + */ return String.valueOf(query .select( Expressions.stringTemplate( @@ -2483,6 +2550,13 @@ public class CtrCntrlQueryRepository{ .fetchOne()); } + /** + * 가장 많은 비행시간을 가진 기체, 비행시간 SELECT[년] + * @param idntfNum + * @param authCheck + * @param serviceType + * @return + */ private String getFltTimeYear(String idntfNum, boolean authCheck, String serviceType){ QCtrCntrlBas qCtrCntrlBas = QCtrCntrlBas.ctrCntrlBas; QFltPlanCtrCntrlRel qFltPlanCtrCntrlRel = QFltPlanCtrCntrlRel.fltPlanCtrCntrlRel; @@ -2495,6 +2569,24 @@ public class CtrCntrlQueryRepository{ if(serviceType != null && !(serviceType.equals(""))) builder.and(qFltPlanBas.serviceType.eq(serviceType)); if(authCheck) builder.and(qFltPlanBas.cstmrSno.eq(jwtTokenUtil.getCstmrSnoByToken())); + /** + * 각 항별[serviceType] 조건인지, + * 권한에 따른 회원통계값[cstmrSno] 조건인지, + * 기체식별번호[idntfNum] 조건인지, + * 생성일시[createDt]값이 오늘인지 조건인지 확인하여 조회하는 SQL 입니다. + * + * SELECT + * CONCAT(SEC_TO_TIME(SUM(TIME_TO_SEC(TIMEDIFF(CCB.CNTRL_END_DT , CCB.CNTRL_ST_DT))))) + * FROM CTR_CNTRL_BAS CCB + * LEFT OUTER JOIN FLT_PLAN_CTR_CNTRL_REL FPCCR + * ON FPCCR.CNTRL_ID = CCB.CNTRL_ID + * LEFT OUTER JOIN FLT_PLAN_BAS FPB + * ON FPCCR.PLAN_SNO = FPB.PLAN_SNO + * WHERE FPB.SERVICE_TYPE = #{serviceType} + * AND FPB.CSTMR_SNO = #{cstmrSno} -- 권한이 유저인경우 + * AND CCB.CREATE_DT >= '일년전 오늘' + * AND CCB.CREATE_DT <= '오늘' + */ return String.valueOf(query .select( Expressions.stringTemplate( @@ -2815,6 +2907,24 @@ public class CtrCntrlQueryRepository{ if(serviceType != null && !(serviceType.equals(""))) builder.and(qFltPlanBas.serviceType.eq(serviceType)); if(authCheck) builder.and(qFltPlanBas.cstmrSno.eq(jwtTokenUtil.getCstmrSnoByToken())); + /** + * 관제생성일시[createDt] 조건, + * 각항별 타입[serviceType] 조건, + * 회원고유번호[cstmrSno]조건과 맞는지 확인하여 조회하는 SQL 입니다. + * + * SELECT + * DATE_FORMAT(CCB.CREATE_DT, #{formatParam[1}}) AS 'name', + * CONCAT(SEC_TO_TIME(SUM(TIME_TO_SEC(TIMEDIFF(CCB.CNTRL_END_DT, CCB.CNTRL_ST_DT))))) AS 'value' + * FROM CTR_CNTRL_BAS CCB + * LEFT OUTER JOIN FLT_PLAN_CTR_CNTRL_REL FPCCR + * ON CCB.CNTRL_ID = FPCCR.CNTRL_ID + * LEFT OUTER JOIN FLT_PLAN_BAS FPB + * ON FPCCR.PLAN_SNO = FPB.PLAN_SNO + * WHERE FPB.SERVICE_TYPE = #{serviceType} + * AND DATE_FORMAT(CCB.CREATE_DT, #{formatParam[0}) = #{date} + * AND FPB.CSTMR_SNO = #{cstmrSno} -- 권한이 유저인경우 + * GROUP BY DATE_FORMAT(CCB.CREATE_DT, #{formatParam[1}}) + */ List result = query .select( Projections.bean( @@ -2875,6 +2985,24 @@ public class CtrCntrlQueryRepository{ if(serviceType != null && !(serviceType.equals(""))) builder.and(qFltPlanBas.serviceType.eq(serviceType)); if(authCheck) builder.and(qFltPlanBas.cstmrSno.eq(jwtTokenUtil.getCstmrSnoByToken())); + /** + * 관제생성일시[createDt] 조건, + * 각항별 타입[serviceType] 조건, + * 회원고유번호[cstmrSno]조건과 맞는지 확인하여 조회하는 SQL 입니다. + * + * SELECT + * DATE_FORMAT(CCB.CREATE_DT, #{formatParam[1}}) AS 'name', + * SUM(CCB.TTL_DSTNC) AS 'value' + * FROM CTR_CNTRL_BAS CCB + * LEFT OUTER JOIN FLT_PLAN_CTR_CNTRL_REL FPCCR + * ON CCB.CNTRL_ID = FPCCR.CNTRL_ID + * LEFT OUTER JOIN FLT_PLAN_BAS FPB + * ON FPCCR.PLAN_SNO = FPB.PLAN_SNO + * WHERE FPB.SERVICE_TYPE = #{serviceType} + * AND DATE_FORMAT(CCB.CREATE_DT, #{formatParam[0}) = #{date} + * AND FPB.CSTMR_SNO = #{cstmrSno} -- 권한이 유저인경우 + * GROUP BY DATE_FORMAT(CCB.CREATE_DT, #{formatParam[1}}) + */ List result = query .select( Projections.bean( @@ -2931,6 +3059,24 @@ public class CtrCntrlQueryRepository{ if(serviceType != null && !(serviceType.equals(""))) builder.and(qFltPlanBas.serviceType.eq(serviceType)); if(authCheck) builder.and(qFltPlanBas.cstmrSno.eq(jwtTokenUtil.getCstmrSnoByToken())); + /** + * 관제생성일시[createDt] 조건, + * 각항별 타입[serviceType] 조건, + * 회원고유번호[cstmrSno]조건과 맞는지 확인하여 조회하는 SQL 입니다. + * + * SELECT + * DATE_FORMAT(CCB.CREATE_DT, #{formatParam[1}}) AS 'name', + * COUNT(CCB.CNTRL_ID) AS 'value' + * FROM CTR_CNTRL_BAS CCB + * LEFT OUTER JOIN FLT_PLAN_CTR_CNTRL_REL FPCCR + * ON CCB.CNTRL_ID = FPCCR.CNTRL_ID + * LEFT OUTER JOIN FLT_PLAN_BAS FPB + * ON FPCCR.PLAN_SNO = FPB.PLAN_SNO + * WHERE FPB.SERVICE_TYPE = #{serviceType} + * AND DATE_FORMAT(CCB.CREATE_DT, #{formatParam[0}) = #{date} + * AND FPB.CSTMR_SNO = #{cstmrSno} -- 권한이 유저인경우 + * GROUP BY DATE_FORMAT(CCB.CREATE_DT, #{formatParam[1}}) + */ List result = query .select( Projections.bean( @@ -2982,6 +3128,25 @@ public class CtrCntrlQueryRepository{ if(serviceType != null && !(serviceType.equals(""))) builder.and(qFltPlanBas.serviceType.eq(serviceType)); if(authCheck) builder.and(qFltPlanBas.cstmrSno.eq(jwtTokenUtil.getCstmrSnoByToken())); + /** + * 관제생성일시[createDt] 조건, + * 각항별 타입[serviceType] 조건, + * 회원고유번호[cstmrSno]조건과 맞는지 확인하여 조회하는 SQL 입니다. + * + * SELECT + * DATE_FORMAT(CCB.CREATE_DT, #{formatParam[1}}) AS 'name', + * CONCAT(SEC_TO_TIME(SUM(TIME_TO_SEC(TIMEDIFF(CCB.CNTRL_END_DT, CCB.CNTRL_ST_DT))))) AS 'value' + * FROM CTR_CNTRL_BAS CCB + * LEFT OUTER JOIN FLT_PLAN_CTR_CNTRL_REL FPCCR + * ON CCB.CNTRL_ID = FPCCR.CNTRL_ID + * LEFT OUTER JOIN FLT_PLAN_BAS FPB + * ON FPCCR.PLAN_SNO = FPB.PLAN_SNO + * WHERE FPB.SERVICE_TYPE = #{serviceType} + * AND DATE_FORMAT(CCB.CREATE_DT, #{formatParam[0}) = #{date} + * AND FPB.CSTMR_SNO = #{cstmrSno} -- 권한이 유저인경우 + * GROUP BY CCB.IDNTF_NUM + * ORDER BY CONCAT(SEC_TO_TIME(SUM(TIME_TO_SEC(TIMEDIFF(CCB.CNTRL_END_DT, CCB.CNTRL_ST_DT))))) DESC + */ List result = query .select( Projections.bean(FlightStcsValueModel.class, @@ -3042,7 +3207,25 @@ public class CtrCntrlQueryRepository{ if(serviceType != null && !(serviceType.equals(""))) builder.and(qFltPlanBas.serviceType.eq(serviceType)); if(authCheck) builder.and(qFltPlanBas.cstmrSno.eq(jwtTokenUtil.getCstmrSnoByToken())); - + /** + * 관제생성일시[createDt] 조건, + * 각항별 타입[serviceType] 조건, + * 회원고유번호[cstmrSno]조건과 맞는지 확인하여 조회하는 SQL 입니다. + * + * SELECT + * DATE_FORMAT(CCB.CREATE_DT, #{formatParam[1}}) AS 'name', + * SUM(CCB.TTL_DSTNC) AS 'value' + * FROM CTR_CNTRL_BAS CCB + * LEFT OUTER JOIN FLT_PLAN_CTR_CNTRL_REL FPCCR + * ON CCB.CNTRL_ID = FPCCR.CNTRL_ID + * LEFT OUTER JOIN FLT_PLAN_BAS FPB + * ON FPCCR.PLAN_SNO = FPB.PLAN_SNO + * WHERE FPB.SERVICE_TYPE = #{serviceType} + * AND DATE_FORMAT(CCB.CREATE_DT, #{formatParam[0}) = #{date} + * AND FPB.CSTMR_SNO = #{cstmrSno} -- 권한이 유저인경우 + * GROUP BY CCB.IDNTF_NUM + * ORDER BY SUM(CCB.TTL_DSTNC) DESC + */ List result = query .select( Projections.bean(FlightStcsValueModel.class, @@ -3095,6 +3278,25 @@ public class CtrCntrlQueryRepository{ if(serviceType != null && !(serviceType.equals(""))) builder.and(qFltPlanBas.serviceType.eq(serviceType)); if(authCheck) builder.and(qFltPlanBas.cstmrSno.eq(jwtTokenUtil.getCstmrSnoByToken())); + /** + * 관제생성일시[createDt] 조건, + * 각항별 타입[serviceType] 조건, + * 회원고유번호[cstmrSno]조건과 맞는지 확인하여 조회하는 SQL 입니다. + * + * SELECT + * DATE_FORMAT(CCB.CREATE_DT, #{formatParam[1}}) AS 'name', + * COUNT(CCB.CNTRL_ID) AS 'value' + * FROM CTR_CNTRL_BAS CCB + * LEFT OUTER JOIN FLT_PLAN_CTR_CNTRL_REL FPCCR + * ON CCB.CNTRL_ID = FPCCR.CNTRL_ID + * LEFT OUTER JOIN FLT_PLAN_BAS FPB + * ON FPCCR.PLAN_SNO = FPB.PLAN_SNO + * WHERE FPB.SERVICE_TYPE = #{serviceType} + * AND DATE_FORMAT(CCB.CREATE_DT, #{formatParam[0}) = #{date} + * AND FPB.CSTMR_SNO = #{cstmrSno} -- 권한이 유저인경우 + * GROUP BY CCB.IDNTF_NUM + * ORDER BY COUNT(CCB.CNTRL_ID) DESC + */ List result = query .select( Projections.bean(FlightStcsValueModel.class, 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 8e4468e..86e2060 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 @@ -50,6 +50,25 @@ public class CtrCntrlWarnLogQueryRepository { if(serviceType != null && !(serviceType.equals(""))) builder.and(qFltPlanBas.serviceType.eq(serviceType)); if(authCheck) builder.and(qFltPlanBas.cstmrSno.eq(jwtTokenUtil.getCstmrSnoByToken())); + /** + * 위험타입[warnType] 조건인지, + * 각항별 타입[serviceType] 조건, + * 회원고유번호[cstmrSno]조건과 맞는지 확인하여 조회하는 SQL 입니다. + * + * SELECT + * CCWL.IDNTF_NUM + * FROM CTR_CNTRL_WARN_LOG CCWL + * LEFT OUTER JOIN FLT_PLAN_CTR_CNTRL_REL FPCCR + * ON CCWL.CNTRL_ID = FPCCR.CNTRL_ID + * LEFT OUTER JOIN FLT_PLAN_BAS FPB + * ON FPCCR.PLAN_SNO = FPB.PLAN_SNO + * WHERE CCWL.WARN_TYPE = #{cate} + * AND FPB.SERVICE_TYPE = #{serviceType} + * AND FPB.CSTMR_SNO = #{cstmrSno} -- 권한이 유저인경우 + * GROUP CCWL.IDNTF_NUM + * ORDER BY COUNT(DISTINCT CCWL.CNTRL_ID) DESC + * LIMIT 1 + */ List queryResult = query .select( Projections.bean(FlightStcsValueModel.class, @@ -90,7 +109,14 @@ public class CtrCntrlWarnLogQueryRepository { return result; } - + /** + * 비정상상황 고정 데이터, 카테고리별 집계[PLAN, ALTITUDE, CRASH] [일일] + * @param idntfNum + * @param cate + * @param authCheck + * @param serviceType + * @return + */ private Long getWarnDay(String idntfNum, String cate, boolean authCheck, String serviceType){ QCtrCntrlWarnLog bas = QCtrCntrlWarnLog.ctrCntrlWarnLog; QFltPlanCtrCntrlRel qFltPlanCtrCntrlRel = QFltPlanCtrCntrlRel.fltPlanCtrCntrlRel; @@ -106,6 +132,26 @@ public class CtrCntrlWarnLogQueryRepository { builder.and(Expressions.stringTemplate("DATE_FORMAT({0}, {1})", bas.createDt, dateFormat) .eq(LocalDate.now().toString())); + /** + * 관제생성일시[createDt] 조건, + * 각항별 타입[serviceType] 조건, + * 회원고유번호[cstmrSno]조건, + * 객체식별번호[idntfNum] 조건, + * 위험타입[warnType] 조건인지 파악하여 조회하는 SQL 입니다. + * + * SELECT + * COUNT(DISTINCT CCWL.CNTRL_ID) + * FROM CTR_CNTRL_WARN_LOG CCWL + * LEFT OUTER JOIN FLT_PLAN_CTR_CNTRL_REL FPCCR + * ON CCWL.CNTRL_ID = FPCCR.CNTRL_ID + * LEFT OUTER JOIN FLT_PLAN_BAS FPB + * ON FPCCR.PLAN_SNO = FPB.PLAN_SNO + * WHERE FPB.SERVICE_TYPE = #{servicType} + * AND FPB.CSTMR_SNO = #{cstmrSno} -- 권한이 유저인경우 + * AND CCWL.IDNTF_NUM = #{idntfNum} + * AND CCWL.WARN_TYPE = #{warnType} + * AND DATE_FORMAT(CCB.CREATE_DT, #{dateForamt}) = NOW() + */ return query .select( bas.cntrlId.countDistinct() // 결과 객체의 프로퍼티 이름을 지정 @@ -119,6 +165,14 @@ public class CtrCntrlWarnLogQueryRepository { .fetchOne(); } + /** + * 비정상상황 고정 데이터, 카테고리별 집계[PLAN, ALTITUDE, CRASH] [월] + * @param idntfNum + * @param cate + * @param authCheck + * @param serviceType + * @return + */ private Long getWarnMonth(String idntfNum, String cate, boolean authCheck, String serviceType){ QCtrCntrlWarnLog bas = QCtrCntrlWarnLog.ctrCntrlWarnLog; QFltPlanCtrCntrlRel qFltPlanCtrCntrlRel = QFltPlanCtrCntrlRel.fltPlanCtrCntrlRel; @@ -132,6 +186,27 @@ public class CtrCntrlWarnLogQueryRepository { if(serviceType != null && !(serviceType.equals(""))) builder.and(qFltPlanBas.serviceType.eq(serviceType)); if(authCheck) builder.and(qFltPlanBas.cstmrSno.eq(jwtTokenUtil.getCstmrSnoByToken())); + /** + * 관제생성일시[createDt] 조건, + * 각항별 타입[serviceType] 조건, + * 회원고유번호[cstmrSno]조건, + * 객체식별번호[idntfNum] 조건, + * 위험타입[warnType] 조건인지 파악하여 조회하는 SQL 입니다. + * + * SELECT + * COUNT(DISTINCT CCWL.CNTRL_ID) + * FROM CTR_CNTRL_WARN_LOG CCWL + * LEFT OUTER JOIN FLT_PLAN_CTR_CNTRL_REL FPCCR + * ON CCWL.CNTRL_ID = FPCCR.CNTRL_ID + * LEFT OUTER JOIN FLT_PLAN_BAS FPB + * ON FPCCR.PLAN_SNO = FPB.PLAN_SNO + * WHERE FPB.SERVICE_TYPE = #{servicType} + * AND FPB.CSTMR_SNO = #{cstmrSno} -- 권한이 유저인경우 + * AND CCWL.IDNTF_NUM = #{idntfNum} + * AND CCWL.WARN_TYPE = #{warnType} + * AND CCWL.CREATE_DT >= '한달전 오늘' + * AND CCWL.CREATE_DT <= '오늘' + */ return query .select( bas.cntrlId.countDistinct() // 결과 객체의 프로퍼티 이름을 지정 @@ -145,6 +220,14 @@ public class CtrCntrlWarnLogQueryRepository { .fetchOne(); } + /** + * 비정상상황 고정 데이터, 카테고리별 집계[PLAN, ALTITUDE, CRASH] [년] + * @param idntfNum + * @param cate + * @param authCheck + * @param serviceType + * @return + */ private Long getWarnYear(String idntfNum, String cate, boolean authCheck, String serviceType){ QCtrCntrlWarnLog bas = QCtrCntrlWarnLog.ctrCntrlWarnLog; QFltPlanCtrCntrlRel qFltPlanCtrCntrlRel = QFltPlanCtrCntrlRel.fltPlanCtrCntrlRel; @@ -158,6 +241,27 @@ public class CtrCntrlWarnLogQueryRepository { if(serviceType != null && !(serviceType.equals(""))) builder.and(qFltPlanBas.serviceType.eq(serviceType)); if(authCheck) builder.and(qFltPlanBas.cstmrSno.eq(jwtTokenUtil.getCstmrSnoByToken())); + /** + * 관제생성일시[createDt] 조건, + * 각항별 타입[serviceType] 조건, + * 회원고유번호[cstmrSno]조건, + * 객체식별번호[idntfNum] 조건, + * 위험타입[warnType] 조건인지 파악하여 조회하는 SQL 입니다. + * + * SELECT + * COUNT(DISTINCT CCWL.CNTRL_ID) + * FROM CTR_CNTRL_WARN_LOG CCWL + * LEFT OUTER JOIN FLT_PLAN_CTR_CNTRL_REL FPCCR + * ON CCWL.CNTRL_ID = FPCCR.CNTRL_ID + * LEFT OUTER JOIN FLT_PLAN_BAS FPB + * ON FPCCR.PLAN_SNO = FPB.PLAN_SNO + * WHERE FPB.SERVICE_TYPE = #{servicType} + * AND FPB.CSTMR_SNO = #{cstmrSno} -- 권한이 유저인경우 + * AND CCWL.IDNTF_NUM = #{idntfNum} + * AND CCWL.WARN_TYPE = #{warnType} + * AND CCWL.CREATE_DT >= '일년전 오늘' + * AND CCWL.CREATE_DT <= '오늘' + */ return query .select( bas.cntrlId.countDistinct() // 결과 객체의 프로퍼티 이름을 지정 @@ -201,6 +305,26 @@ public class CtrCntrlWarnLogQueryRepository { if(serviceType != null && !(serviceType.equals(""))) builder.and(qFltPlanBas.serviceType.eq(serviceType)); if(authCheck) builder.and(qFltPlanBas.cstmrSno.eq(jwtTokenUtil.getCstmrSnoByToken())); + /** + * 관제생성일시[createDt] 조건, + * 각항별 타입[serviceType] 조건, + * 회원고유번호[cstmrSno]조건, + * 위험상황 타입[warnType] 조건인지 확인하여 조회하는 SQL 입니다. + * + * SELECT + * DATE_FORMAT(CCWL.CREATE_DT, #{formatParam[1}) AS 'name', + * COUNT(DISTINCT CCWL.CNTRL_ID) AS 'count' + * FROM CTR_CNTRL_WARN_LOG CCWL + * LEFT OUTER JOIN FLT_PLAN_CTR_CNTRL_REL FPCCR + * ON CCWL.CNTRL_ID = FPCCR.CNTRL_ID + * LEFT OUTER JOIN FLT_PLAN_BAS FPB + * ON FPCCR.PLAN_SNO = FPB.PLAN_SNO + * WHERE FPB.SERVICE_TYPE = #{servicType} + * AND CCWL.WARN_TYPE = #{warnType} + * AND FPB.CSTMR_SNO = #{cstmrSno} -- 권한이 유저인경우 + * AND DATE_FORMAT(CCWL.CREATE_DT, #{formatParam[0}) + * GROUP BY DATE_FORMAT(CCWL.CREATE_DT, #{formatParam[1}) + */ List result = query .select( Projections.bean( @@ -254,6 +378,28 @@ public class CtrCntrlWarnLogQueryRepository { if(serviceType != null && !(serviceType.equals(""))) builder.and(qFltPlanBas.serviceType.eq(serviceType)); if(authCheck) builder.and(qFltPlanBas.cstmrSno.eq(jwtTokenUtil.getCstmrSnoByToken())); + /** + * 관제생성일시[createDt] 조건, + * 각항별 타입[serviceType] 조건, + * 회원고유번호[cstmrSno]조건, + * 위험상황 타입[warnType] 조건인지 확인하여 조회하는 SQL 입니다. + * + * SELECT + * CCWL.IDNTF_NUM AS 'name', + * COUNT(DISTINCT CCWL.CNTRL_ID) AS 'value' + * FROM CTR_CNTRL_WARN_LOG CCWL + * LEFT OUTER JOIN FLT_PLAN_CTR_CNTRL_REL FPCCR + * ON CCWL.CNTRL_ID = FPCCR.CNTRL_ID + * LEFT OUTER JOIN FLT_PLAN_BAS FPB + * ON FPCCR.PLAN_SNO = FPB.PLAN_SNO + * WHERE FPB.SERVICE_TYPE = #{servicType} + * AND CCWL.WARN_TYPE = #{warnType} + * AND FPB.CSTMR_SNO = #{cstmrSno} -- 권한이 유저인경우 + * AND DATE_FORMAT(CCWL.CREATE_DT, #{formatParam[0}) + * GROUP BY CCWL.IDNTF_NUM + * ORDER BY COUNT(DISTINCT CCWL.CNTRL_ID) DESC + * LIMIT 5 + */ List result = query .select( Projections.bean(FlightStcsValueModel.class, 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 da58100..e8d76ff 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 @@ -1457,6 +1457,24 @@ public class FltPlanQueryRepository { if(serviceType != null && !(serviceType.equals(""))) builder.and(qFltPlanBas.serviceType.eq(serviceType)); if(authCheck) builder.and(qFltPlanBas.cstmrSno.eq(jwtTokenUtil.getCstmrSnoByToken())); + /** + * 비행계획서 고유번호[planSno]가 있는지, + * 각항별 타입[serviceType] 조건, + * 회원고유번호[cstmrSno]조건인지 확인하여 조회하는 SQL 기능입니다. + * + * SELECT + * FPCCR.IDNTF_NUM AS 'name', + * COUNT(DISTINCT FPCCR.PLAN_SNO) AS count + * FROM FLT_PLAN_CTR_CNTRL_REL FPCCR + * LEFT OUTER JOIN FLT_PLAN_BAS FPB + * ON FPCCR.PLAN_SNO = FPB.PLAN_SNO + * WHERE FPCCR.PLAN_SNO IS NOT NULL + * AND FPB.SERVICE_TYPE = #{serviceType} + * AND FPB.CSTMR_SNO = #{cstmrSno} -- 권한이 유저인경우 + * GROUP BY FPCCR.IDNTF_NUM + * ORDER BY count DESC + * LIMIT 1; + */ List queryResult = query .select( Projections.bean(FlightStcsValueModel.class, @@ -1495,7 +1513,13 @@ public class FltPlanQueryRepository { return result; } - + /** + * 비행실적 데이터, top 1 [일일] + * @param idntfNum + * @param authCheck + * @param serviceType + * @return + */ private Long getFltResultDay(String idntfNum, boolean authCheck, String serviceType){ QFltPlanCtrCntrlRel qFltPlanCtrCntrlRel = QFltPlanCtrCntrlRel.fltPlanCtrCntrlRel; @@ -1511,6 +1535,24 @@ public class FltPlanQueryRepository { builder.and(Expressions.stringTemplate("DATE_FORMAT({0}, {1})", qFltPlanBas.createDt, dateFormat) .eq(LocalDate.now().toString())); + /** + * 비행계획서 고유번호[planSno]가 있는지, + * 각항별 타입[serviceType] 조건, + * 기체 식별번호[idntfNum] 조건, + * 비행계획서 생성일시[createDt] 조건, + * 회원고유번호[cstmrSno]조건인지 확인하여 조회하는 SQL 기능입니다. + * + * SELECT + * COUNT(DISTINCT FPCCR.PLAN_SNO) AS count + * FROM FLT_PLAN_CTR_CNTRL_REL FPCCR + * LEFT OUTER JOIN FLT_PLAN_BAS FPB + * ON FPCCR.PLAN_SNO = FPB.PLAN_SNO + * WHERE FPCCR.PLAN_SNO IS NOT NULL + * AND FPB.SERVICE_TYPE = #{serviceType} + * AND FPB.CSTMR_SNO = #{cstmrSno} -- 권한이 유저인경우 + * AND FPCCR.IDNTF_NUM = #{idntfNum} + * AND DATE_FORMAT(CCB.CREATE_DT, #{dateForamt}) = NOW() + */ return query .select( qFltPlanCtrCntrlRel.planSno.countDistinct() // 결과 객체의 프로퍼티 이름을 지정 @@ -1522,6 +1564,13 @@ public class FltPlanQueryRepository { .fetchOne(); } + /** + * 비행실적 데이터, top 1 [월] + * @param idntfNum + * @param authCheck + * @param serviceType + * @return + */ private Long getFltResultMonth(String idntfNum, boolean authCheck, String serviceType){ QFltPlanCtrCntrlRel qFltPlanCtrCntrlRel = QFltPlanCtrCntrlRel.fltPlanCtrCntrlRel; QFltPlanBas qFltPlanBas = QFltPlanBas.fltPlanBas; @@ -1534,6 +1583,25 @@ public class FltPlanQueryRepository { if(serviceType != null && !(serviceType.equals(""))) builder.and(qFltPlanBas.serviceType.eq(serviceType)); if(authCheck) builder.and(qFltPlanBas.cstmrSno.eq(jwtTokenUtil.getCstmrSnoByToken())); + /** + * 비행계획서 고유번호[planSno]가 있는지, + * 각항별 타입[serviceType] 조건, + * 기체 식별번호[idntfNum] 조건, + * 비행계획서 생성일시[createDt] 조건, + * 회원고유번호[cstmrSno]조건인지 확인하여 조회하는 SQL 기능입니다. + * + * SELECT + * COUNT(DISTINCT FPCCR.PLAN_SNO) AS count + * FROM FLT_PLAN_CTR_CNTRL_REL FPCCR + * LEFT OUTER JOIN FLT_PLAN_BAS FPB + * ON FPCCR.PLAN_SNO = FPB.PLAN_SNO + * WHERE FPCCR.PLAN_SNO IS NOT NULL + * AND FPB.SERVICE_TYPE = #{serviceType} + * AND FPB.CSTMR_SNO = #{cstmrSno} -- 권한이 유저인경우 + * AND FPCCR.IDNTF_NUM = #{idntfNum} + * AND FPB.CREATE_DT >= '한달전 오늘' + * AND FPB.CREATE_DT <= '오늘' + */ return query .select( qFltPlanCtrCntrlRel.planSno.countDistinct() // 결과 객체의 프로퍼티 이름을 지정 @@ -1545,6 +1613,13 @@ public class FltPlanQueryRepository { .fetchOne(); } + /** + * 비행실적 데이터, top 1 [년] + * @param idntfNum + * @param authCheck + * @param serviceType + * @return + */ private Long getFltResultYear(String idntfNum, boolean authCheck, String serviceType){ QFltPlanCtrCntrlRel qFltPlanCtrCntrlRel = QFltPlanCtrCntrlRel.fltPlanCtrCntrlRel; QFltPlanBas qFltPlanBas = QFltPlanBas.fltPlanBas; @@ -1557,6 +1632,25 @@ public class FltPlanQueryRepository { if(serviceType != null && !(serviceType.equals(""))) builder.and(qFltPlanBas.serviceType.eq(serviceType)); if(authCheck) builder.and(qFltPlanBas.cstmrSno.eq(jwtTokenUtil.getCstmrSnoByToken())); + /** + * 비행계획서 고유번호[planSno]가 있는지, + * 각항별 타입[serviceType] 조건, + * 기체 식별번호[idntfNum] 조건, + * 비행계획서 생성일시[createDt] 조건, + * 회원고유번호[cstmrSno]조건인지 확인하여 조회하는 SQL 기능입니다. + * + * SELECT + * COUNT(DISTINCT FPCCR.PLAN_SNO) AS count + * FROM FLT_PLAN_CTR_CNTRL_REL FPCCR + * LEFT OUTER JOIN FLT_PLAN_BAS FPB + * ON FPCCR.PLAN_SNO = FPB.PLAN_SNO + * WHERE FPCCR.PLAN_SNO IS NOT NULL + * AND FPB.SERVICE_TYPE = #{serviceType} + * AND FPB.CSTMR_SNO = #{cstmrSno} -- 권한이 유저인경우 + * AND FPCCR.IDNTF_NUM = #{idntfNum} + * AND FPB.CREATE_DT >= '일년전 오늘' + * AND FPB.CREATE_DT <= '오늘' + */ return query .select( qFltPlanCtrCntrlRel.planSno.countDistinct() // 결과 객체의 프로퍼티 이름을 지정 @@ -1583,6 +1677,21 @@ public class FltPlanQueryRepository { if(serviceType != null && !(serviceType.equals(""))) builder.and(qFltPlanBas.serviceType.eq(serviceType)); if(authCheck) builder.and(qFltPlanBas.cstmrSno.eq(jwtTokenUtil.getCstmrSnoByToken())); + /** + * 각항별 타입[serviceType] 조건, + * 회원고유번호[cstmrSno]조건인지 확인하여 조회하는 SQL 입니다. + * + * SELECT + * FPA.IDNTF_NUM + * FROM FLT_PLAN_ARCRFT FPA + * LEFT OUTER JOIN FLT_PLAN_BAS FPB + * ON FPB.PLAN_SNO = FPA.PLAN_SNO + * WHERE FPB.SERVICE_TYPE = #{serviceType} + * AND FPB.CSTMR_SNO = #{cstmrSno} -- 권한이 유저인경우 + * GROUP BY FPA.IDNTF_NUM + * ORDER BY COUNT(FPA.PLAN_SNO) DESC + * LIMIT 1 + */ List queryResult = query .select( Projections.bean(FlightStcsValueModel.class, @@ -1590,6 +1699,7 @@ public class FltPlanQueryRepository { ) ) .from(qFltPlanArcrft) + .where(builder) .leftJoin(qFltPlanBas) .on(qFltPlanArcrft.planSno.eq(qFltPlanBas.planSno)) .groupBy(qFltPlanArcrft.idntfNum) @@ -1620,6 +1730,13 @@ public class FltPlanQueryRepository { return result; } + /** + * 비행계획에 많이 기용된 기체 데이터, top 1[일일] + * @param idntfNum + * @param authCheck + * @param serviceType + * @return + */ private Long getFltPlanDay(String idntfNum, boolean authCheck, String serviceType){ QFltPlanArcrft bas = QFltPlanArcrft.fltPlanArcrft; QFltPlanBas qFltPlanBas = QFltPlanBas.fltPlanBas; @@ -1633,6 +1750,21 @@ public class FltPlanQueryRepository { builder.and(Expressions.stringTemplate("DATE_FORMAT({0}, {1})", bas.createDt, dateFormat) .eq(LocalDate.now().toString())); + /** + * 생성일시[createDt] 조건, + * 각항별 타입[serviceType] 조건, + * 회원고유번호[cstmrSno]조건인지 확인하여 조회하는 SQL 입니다. + * + * SELECT + * COUNT(FPA.PLAN_SNO) + * FROM FLT_PLAN_ARCRFT FPA + * LEFT OUTER JOIN FLT_PLAN_BAS FPB + * ON FPB.PLAN_SNO = FPA.PLAN_SNO + * WHERE FPB.SERVICE_TYPE = #{serviceType} + * AND FPB.CSTMR_SNO = #{cstmrSno} -- 권한이 유저인경우 + * AND FPA.IDNTF_NUM = #{idntfNum} + * AND DATE_FORMAT(FPA.CREATE_DT, #{dateForamt}) = NOW() + */ return query .select( bas.planSno.count() // 결과 객체의 프로퍼티 이름을 지정 @@ -1644,6 +1776,13 @@ public class FltPlanQueryRepository { .fetchOne(); } + /** + * 비행계획에 많이 기용된 기체 데이터, top 1[월] + * @param idntfNum + * @param authCheck + * @param serviceType + * @return + */ private Long getFltPlanMonth(String idntfNum, boolean authCheck, String serviceType){ QFltPlanArcrft bas = QFltPlanArcrft.fltPlanArcrft; QFltPlanBas qFltPlanBas = QFltPlanBas.fltPlanBas; @@ -1655,6 +1794,21 @@ public class FltPlanQueryRepository { if(serviceType != null && !(serviceType.equals(""))) builder.and(qFltPlanBas.serviceType.eq(serviceType)); if(authCheck) builder.and(qFltPlanBas.cstmrSno.eq(jwtTokenUtil.getCstmrSnoByToken())); + /** + * 생성일시[createDt] 조건, + * 각항별 타입[serviceType] 조건, + * 회원고유번호[cstmrSno]조건인지 확인하여 조회하는 SQL 입니다. + * + * SELECT + * COUNT(FPA.PLAN_SNO) + * FROM FLT_PLAN_ARCRFT FPA + * LEFT OUTER JOIN FLT_PLAN_BAS FPB + * ON FPB.PLAN_SNO = FPA.PLAN_SNO + * WHERE FPB.SERVICE_TYPE = #{serviceType} + * AND FPB.CSTMR_SNO = #{cstmrSno} -- 권한이 유저인경우 + * AND FPA.CREATE_DT >= '한달전 오늘' + * AND FPA.CREATE_DT <= '오늘' + */ return query .select( bas.planSno.count() // 결과 객체의 프로퍼티 이름을 지정 @@ -1666,6 +1820,13 @@ public class FltPlanQueryRepository { .fetchOne(); } + /** + * 비행계획에 많이 기용된 기체 데이터, top 1[년] + * @param idntfNum + * @param authCheck + * @param serviceType + * @return + */ private Long getFltPlanYear(String idntfNum, boolean authCheck, String serviceType){ QFltPlanArcrft bas = QFltPlanArcrft.fltPlanArcrft; QFltPlanBas qFltPlanBas = QFltPlanBas.fltPlanBas; @@ -1677,6 +1838,21 @@ public class FltPlanQueryRepository { if(serviceType != null && !(serviceType.equals(""))) builder.and(qFltPlanBas.serviceType.eq(serviceType)); if(authCheck) builder.and(qFltPlanBas.cstmrSno.eq(jwtTokenUtil.getCstmrSnoByToken())); + /** + * 생성일시[createDt] 조건, + * 각항별 타입[serviceType] 조건, + * 회원고유번호[cstmrSno]조건인지 확인하여 조회하는 SQL 입니다. + * + * SELECT + * COUNT(FPA.PLAN_SNO) + * FROM FLT_PLAN_ARCRFT FPA + * LEFT OUTER JOIN FLT_PLAN_BAS FPB + * ON FPB.PLAN_SNO = FPA.PLAN_SNO + * WHERE FPB.SERVICE_TYPE = #{serviceType} + * AND FPB.CSTMR_SNO = #{cstmrSno} -- 권한이 유저인경우 + * AND FPA.CREATE_DT >= '일년전 오늘' + * AND FPA.CREATE_DT <= '오늘' + */ return query .select( bas.planSno.count() @@ -1706,7 +1882,22 @@ public class FltPlanQueryRepository { if(serviceType != null && !(serviceType.equals(""))) builder.and(qFltPlanBas.serviceType.eq(serviceType)); if(authCheck) builder.and(qFltPlanBas.cstmrSno.eq(jwtTokenUtil.getCstmrSnoByToken())); - + /** + * 각항별 타입[serviceType] 조건, + * 회원고유번호[cstmrSno]조건, + * 승인여부[aprvlYn] 값이 'Y' 데이터를 조회하는 SQL 입니다. + * + * SELECT + * FPA.IDNTF_NUM + * FROM FLT_PLAN_ARCRFT FPA + * LEFT OUTER JOIN FLT_PLAN_BAS FPB + * ON FPB.PLAN_SNO = FPB.PLAN_SNO + * WHERE FPB.SERVICE_TYPE = #{serviceType} + * AND FPB.CSTMR_SNO = #{cstmrSno} -- 권한이 유저인경우 + * AND FPB.APRVL_YN = 'Y' + * GROUP BY FPA.IDNTF_NUM + * ORDER BY COUNT(FPA.PLAN_SNO) DESC + */ List queryResult = query .select( Projections.bean(FlightStcsValueModel.class, @@ -1744,6 +1935,13 @@ public class FltPlanQueryRepository { return result; } + /** + * 비행승인 많은 기체 데이터, top 1 [일일] + * @param idntfNum + * @param authCheck + * @param serviceType + * @return + */ private Long getFltPlanAprvnDay(String idntfNum, boolean authCheck, String serviceType){ QFltPlanArcrft qFltPlanArcrft = QFltPlanArcrft.fltPlanArcrft; QFltPlanBas qFltPlanBas = QFltPlanBas.fltPlanBas; @@ -1758,6 +1956,23 @@ public class FltPlanQueryRepository { builder.and(Expressions.stringTemplate("DATE_FORMAT({0}, {1})", qFltPlanBas.createDt, dateFormat) .eq(LocalDate.now().toString())); + /** + * 각항별 타입[serviceType] 조건, + * 회원고유번호[cstmrSno]조건, + * 승인여부[aprvlYn] 값이 'Y' 인지, + * 비행계획서 생성일시[createDt] 값 조건이지 확인하여 조회하는 SQL 입니다. + * + * SELECT + * COUNT(FPA.PLAN_SNO ) + * FROM FLT_PLAN_ARCRFT FPA + * LEFT OUTER JOIN FLT_PLAN_BAS FPB + * ON FPB.PLAN_SNO = FPB.PLAN_SNO + * WHERE FPB.SERVICE_TYPE = #{serviceType} + * AND FPB.CSTMR_SNO = #{cstmrSno} -- 권한이 유저인경우 + * AND FPB.APRVL_YN = 'Y' + * AND FPA.IDNTF_NUM = #{idntfNum} + * AND DATE_FORMAT(FPB.CREATE_DT, #{dateForamt}) = NOW () + */ return query .select( qFltPlanArcrft.planSno.count() // 결과 객체의 프로퍼티 이름을 지정 @@ -1769,6 +1984,13 @@ public class FltPlanQueryRepository { .fetchOne(); } + /** + * 비행승인 많은 기체 데이터, top 1 [월] + * @param idntfNum + * @param authCheck + * @param serviceType + * @return + */ private Long getFltPlanAprvnMonth(String idntfNum, boolean authCheck, String serviceType){ QFltPlanArcrft qFltPlanArcrft = QFltPlanArcrft.fltPlanArcrft; @@ -1782,6 +2004,24 @@ public class FltPlanQueryRepository { if(serviceType != null && !(serviceType.equals(""))) builder.and(qFltPlanBas.serviceType.eq(serviceType)); if(authCheck) builder.and(qFltPlanBas.cstmrSno.eq(jwtTokenUtil.getCstmrSnoByToken())); + /** + * 각항별 타입[serviceType] 조건, + * 회원고유번호[cstmrSno]조건, + * 승인여부[aprvlYn] 값이 'Y' 인지, + * 비행계획서 생성일시[createDt] 값 조건이지 확인하여 조회하는 SQL 입니다. + * + * SELECT + * COUNT(FPA.PLAN_SNO ) + * FROM FLT_PLAN_ARCRFT FPA + * LEFT OUTER JOIN FLT_PLAN_BAS FPB + * ON FPB.PLAN_SNO = FPB.PLAN_SNO + * WHERE FPB.SERVICE_TYPE = #{serviceType} + * AND FPB.CSTMR_SNO = #{cstmrSno} -- 권한이 유저인경우 + * AND FPB.APRVL_YN = 'Y' + * AND FPA.IDNTF_NUM = #{idntfNum} + * AND FPB.CREATE_DT >= '한달전 오늘' + * AND FPB.CREATE_DT <= '오늘' + */ return query .select( qFltPlanArcrft.planSno.count() // 결과 객체의 프로퍼티 이름을 지정 @@ -1793,6 +2033,13 @@ public class FltPlanQueryRepository { .fetchOne(); } + /** + * 비행승인 많은 기체 데이터, top 1 [년] + * @param idntfNum + * @param authCheck + * @param serviceType + * @return + */ private Long getFltPlanAprvnYear(String idntfNum, boolean authCheck, String serviceType){ QFltPlanArcrft qFltPlanArcrft = QFltPlanArcrft.fltPlanArcrft; QFltPlanBas qFltPlanBas = QFltPlanBas.fltPlanBas; @@ -1805,6 +2052,24 @@ public class FltPlanQueryRepository { if(serviceType != null && !(serviceType.equals(""))) builder.and(qFltPlanBas.serviceType.eq(serviceType)); if(authCheck) builder.and(qFltPlanBas.cstmrSno.eq(jwtTokenUtil.getCstmrSnoByToken())); + /** + * 각항별 타입[serviceType] 조건, + * 회원고유번호[cstmrSno]조건, + * 승인여부[aprvlYn] 값이 'Y' 인지, + * 비행계획서 생성일시[createDt] 값 조건이지 확인하여 조회하는 SQL 입니다. + * + * SELECT + * COUNT(FPA.PLAN_SNO ) + * FROM FLT_PLAN_ARCRFT FPA + * LEFT OUTER JOIN FLT_PLAN_BAS FPB + * ON FPB.PLAN_SNO = FPB.PLAN_SNO + * WHERE FPB.SERVICE_TYPE = #{serviceType} + * AND FPB.CSTMR_SNO = #{cstmrSno} -- 권한이 유저인경우 + * AND FPB.APRVL_YN = 'Y' + * AND FPA.IDNTF_NUM = #{idntfNum} + * AND FPB.CREATE_DT >= '일년전 오늘' + * AND FPB.CREATE_DT <= '오늘' + */ return query .select( qFltPlanArcrft.planSno.count() // 결과 객체의 프로퍼티 이름을 지정 @@ -1843,6 +2108,22 @@ public class FltPlanQueryRepository { if(serviceType != null && !(serviceType.equals(""))) builder.and(qFltPlanBas.serviceType.eq(serviceType)); if(authCheck) builder.and(qFltPlanBas.cstmrSno.eq(jwtTokenUtil.getCstmrSnoByToken())); + /** + * 비행계획서 생성일시[createDt] 조건, + * 각항별 타입[serviceType] 조건, + * 회원고유번호[cstmrSno]조건과 맞는지 확인하여 조회하는 SQL 입니다. + * + * SELECT + * DATE_FORMAT(FPB.CREATE_DT, #{formatParam[1}) AS 'name', + * COUNT(DISTINCT FPCCR.PLAN_SNO) AS 'value' + * FROM FLT_PLAN_CTR_CNTRL_REL FPCCR + * LEFT OUTER JOIN FLT_PLAN_BAS FPB + * ON FPCCR.PLAN_SNO = FPB.PLAN_SNO + * WHERE DATE_FORMAT(CCWL.CREATE_DT, #{formatParam[0}) + * AND FPB.SERVICE_TYPE = #{serviceType} + * AND FPB.CSTMR_SNO = #{cstmrSno} -- 권한이 유저인경우 + * GROUP BY DATE_FORMAT(FPB.CREATE_DT, #{formatParam[1}) + */ List result = query .select( Projections.bean( @@ -1894,6 +2175,20 @@ public class FltPlanQueryRepository { if(serviceType != null && !(serviceType.equals(""))) builder.and(qFltPlanBas.serviceType.eq(serviceType)); if(authCheck) builder.and(qFltPlanBas.cstmrSno.eq(jwtTokenUtil.getCstmrSnoByToken())); + /** + * 비행계획서 생성일시[createDt] 조건, + * 각항별 타입[serviceType] 조건, + * 회원고유번호[cstmrSno]조건과 맞는지 확인하여 조회하는 SQL 입니다. + * + * SELECT + * DATE_FORMAT(FPB.CREATE_DT, #{formatParam[1}) AS 'name', + * COUNT(FPB.PLAN_SNO) AS 'value' + * FROM FLT_PLAN_BAS FPB + * WHERE DATE_FORMAT(CCWL.CREATE_DT, #{formatParam[0}) + * AND FPB.SERVICE_TYPE = #{serviceType} + * AND FPB.CSTMR_SNO = #{cstmrSno} -- 권한이 유저인경우 + * GROUP BY DATE_FORMAT(FPB.CREATE_DT, #{formatParam[1}) + */ List result = query .select( Projections.bean( @@ -1946,6 +2241,22 @@ public class FltPlanQueryRepository { if(serviceType != null && !(serviceType.equals(""))) builder.and(qFltPlanBas.serviceType.eq(serviceType)); if(authCheck) builder.and(qFltPlanBas.cstmrSno.eq(jwtTokenUtil.getCstmrSnoByToken())); + /** + * 승인여부가 'Y'인지, + * 비행계획서 생성일시[createDt] 조건, + * 각항별 타입[serviceType] 조건, + * 회원고유번호[cstmrSno]조건과 맞는지 확인하여 조회하는 SQL 입니다. + * + * SELECT + * DATE_FORMAT(FPB.CREATE_DT, #{formatParam[1}) AS 'name', + * COUNT(FPB.PLAN_SNO) AS 'value' + * FROM FLT_PLAN_BAS FPB + * WHERE DATE_FORMAT(CCWL.CREATE_DT, #{formatParam[0}) + * AND FPB.APRVL_YN = 'Y' + * AND FPB.SERVICE_TYPE = #{serviceType} + * AND FPB.CSTMR_SNO = #{cstmrSno} -- 권한이 유저인경우 + * GROUP BY DATE_FORMAT(FPB.CREATE_DT, #{formatParam[1}) + */ List result = query .select( Projections.bean( @@ -1992,6 +2303,24 @@ public class FltPlanQueryRepository { if(serviceType != null && !(serviceType.equals(""))) builder.and(qFltPlanBas.serviceType.eq(serviceType)); if(authCheck) builder.and(qFltPlanBas.cstmrSno.eq(jwtTokenUtil.getCstmrSnoByToken())); + /** + * 비행계획서 생성일시[createDt] 조건, + * 각항별 타입[serviceType] 조건, + * 회원고유번호[cstmrSno]조건과 맞는지 확인하여 조회하는 SQL 입니다. + * + * SELECT + * FPCCR.IDNTF_NUM AS 'name', + * COUNT(DISTINCT FPCCR.PLAN_SNO) AS 'value' + * FROM FLT_PLAN_CTR_CNTRL_REL FPCCR + * LEFT OUTER JOIN FLT_PLAN_BAS FPB + * ON FPCCR.PLAN_SNO = FPB.PLAN_SNO + * WHERE DATE_FORMAT(CCWL.CREATE_DT, #{formatParam[0}) + * AND FPB.SERVICE_TYPE = #{serviceType} + * AND FPB.CSTMR_SNO = #{cstmrSno} -- 권한이 유저인경우 + * GROUP BY FPCCR.IDNTF_NUM + * ORDER BY COUNT(DISTINCT FPCCR.PLAN_SNO) DESC + * LIMIT 5 + */ List result = query .select( Projections.bean(FlightStcsValueModel.class, @@ -2041,6 +2370,24 @@ public class FltPlanQueryRepository { if(serviceType != null && !(serviceType.equals(""))) builder.and(qFltPlanBas.serviceType.eq(serviceType)); if(authCheck) builder.and(qFltPlanBas.cstmrSno.eq(jwtTokenUtil.getCstmrSnoByToken())); + /** + * 비행계획서 생성일시[createDt] 조건, + * 각항별 타입[serviceType] 조건, + * 회원고유번호[cstmrSno]조건과 맞는지 확인하여 조회하는 SQL 입니다. + * + * SELECT + * FPA.IDNTF_NUM AS 'name', + * COUNT(DISTINCT FPA.PLAN_SNO) AS 'value' + * FROM FLT_PLAN_BAS FPB + * LEFT OUTER JOIN FLT_PLAN_ARCRFT FPA + * ON FPA.PLAN_SNO = FPB.PLAN_SNO + * WHERE DATE_FORMAT(CCWL.CREATE_DT, #{formatParam[0}) + * AND FPB.SERVICE_TYPE = #{serviceType} + * AND FPB.CSTMR_SNO = #{cstmrSno} -- 권한이 유저인경우 + * GROUP BY FPA.IDNTF_NUM + * ORDER BY COUNT(DISTINCT FPA.PLAN_SNO) DESC + * LIMIT 5 + */ List result = query .select( Projections.bean(FlightStcsValueModel.class, @@ -2091,6 +2438,26 @@ public class FltPlanQueryRepository { if(authCheck) builder.and(qFltPlanBas.cstmrSno.eq(jwtTokenUtil.getCstmrSnoByToken())); if(serviceType != null && !(serviceType.equals(""))) builder.and(qFltPlanBas.serviceType.eq(serviceType)); + /** + * 비행계획서 생성일시[createDt] 조건, + * 승인여부[aprvlYn] 조건, + * 각항별 타입[serviceType] 조건, + * 회원고유번호[cstmrSno]조건과 맞는지 확인하여 조회하는 SQL 입니다. + * + * SELECT + * FPA.IDNTF_NUM AS 'name', + * COUNT(DISTINCT FPA.PLAN_SNO) AS 'value' + * FROM FLT_PLAN_BAS FPB + * LEFT OUTER JOIN FLT_PLAN_ARCRFT FPA + * ON FPA.PLAN_SNO = FPB.PLAN_SNO + * WHERE DATE_FORMAT(CCWL.CREATE_DT, #{formatParam[0}) + * AND FPB.SERVICE_TYPE = #{serviceType} + * AND FPB.CSTMR_SNO = #{cstmrSno} -- 권한이 유저인경우 + * AND FPB.APRVL_YN = 'Y' + * GROUP BY FPA.IDNTF_NUM + * ORDER BY COUNT(DISTINCT FPA.PLAN_SNO) DESC + * LIMIT 5 + */ List result = query .select( Projections.bean(FlightStcsValueModel.class,