From 10f236bceca02ad678f7e431b27c276863a04eda 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 14:32:45 +0900 Subject: [PATCH] =?UTF-8?q?main/dash=20=ED=8C=A8=ED=82=A4=EC=A7=80=20?= =?UTF-8?q?=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 --- .../dash/controller/MainDashController.java | 240 ++++++++++++++---- .../main/dash/service/MainDashService.java | 91 ++++--- .../ctr/CtrCntrlQueryRepository.java | 148 ++++++++++- .../ctr/CtrCntrlWarnLogQueryRepository.java | 29 +++ .../flt/FltPlanQueryRepository.java | 120 ++++++++- .../pty/PtyDronQueryRepository.java | 32 ++- .../pty/PtyGroupQueryRepository.java | 25 +- 7 files changed, 591 insertions(+), 94 deletions(-) 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 d257a759..129b4ce9 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 @@ -39,7 +39,8 @@ public class MainDashController { private final MainDashService service; /** - * @param rq + * 일 별 비행횟수 통계를 조회하는 기능. + * @param yyyymm * @return */ @GetMapping(value = "/stcs/day") @@ -51,17 +52,25 @@ public class MainDashController { // log.debug(yyyymm); - //입력값 검증 + // yyyymm 값이 있는지, 글자 갯수가 7개인지 입력값 검증 if(yyyymm == null || !(yyyymm.length() == 7) ) { - return ResponseEntity.status(HttpStatus.OK) + // 검증통과하지 못할 시 서버에서 "의도적인" 에러 반환 + return ResponseEntity.status(HttpStatus.OK) // "의도적인" 에러 반환코드 .body(new ErrorResponse(RSErrorCode.ER_PARAM)); } try { - result = service.mainDashStcsDay(yyyymm); + result = service.mainDashStcsDay(yyyymm); // 일별 비행건수 통계하는 기능 } 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")); @@ -73,7 +82,9 @@ public class MainDashController { /** - * @param rq + * TOP5 지역 별 비행횟수 통계를 조회하는 기능 + * 일자[yyyymm]별 검색 + * @param yyyymm * @return */ @GetMapping(value = "/stcs/area") @@ -83,16 +94,25 @@ public class MainDashController { public ResponseEntity stcsArea(String yyyymm) { List result = null; + // yyyymm 값이 있는지, 글자 갯수가 7개인지 입력값 검증 if(yyyymm == null || !(yyyymm.length() == 7) ) { - return ResponseEntity.status(HttpStatus.OK) + // 검증통과하지 못할 시 서버에서 "의도적인" 에러 반환 + return ResponseEntity.status(HttpStatus.OK) // "의도적인" 에러 반환코드 .body(new ErrorResponse(RSErrorCode.ER_PARAM)); } try { - result = service.mainDashStcsArea(yyyymm); + result = service.mainDashStcsArea(yyyymm); // Top5 지역별 비행횟수 통계기능 } 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")); @@ -103,7 +123,8 @@ public class MainDashController { } /** - * @param rq + * 본인이 생성한 그룹 정보죄하는 기능. + * @param cstmrSno * @return */ @GetMapping(value = "/group/list") @@ -113,16 +134,24 @@ public class MainDashController { public ResponseEntity groupList(Integer cstmrSno) { List result = null; - //입력값 검증 + // 회원고유번호[cstmrSno] 입력값 검증처리 if(cstmrSno == null) { - return ResponseEntity.status(HttpStatus.OK) + // 검증통과하지 못할 시 서버에서 "의도적인" 에러 반환 + return ResponseEntity.status(HttpStatus.OK) // "의도적인" 에러 반환코드 .body(new ErrorResponse(RSErrorCode.ER_PARAM)); } try { - result = service.mainDashGroupList(cstmrSno); + result = service.mainDashGroupList(cstmrSno); // TOP3 가입 그룹 리스트 조회하는 기능 } 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")); @@ -132,7 +161,12 @@ public class MainDashController { } - + /** + * 기체 정보 리스트 조회하는 기능, + * 회원 고유번호[cstmrSno]로 조회함. + * @param cstmrSno + * @return + */ @GetMapping(value = "/arcrft/list") @ApiOperation(value = "기체 정보 리스트") @Tag(name = "메인화면 컨트롤러", description = "메인화면 관련 API") @@ -140,16 +174,24 @@ public class MainDashController { public ResponseEntity arcrftList(Integer cstmrSno) { List result = null; - //입력값 검증 + // 회원고유번호[cstmrSno] 입력값 검증처리 if(cstmrSno == null) { - return ResponseEntity.status(HttpStatus.OK) + // 검증통과하지 못할 시 서버에서 "의도적인" 에러 반환 + return ResponseEntity.status(HttpStatus.OK) // "의도적인" 에러 반환코드 .body(new ErrorResponse(RSErrorCode.ER_PARAM)); } try { - result = service.mainDashDronList(cstmrSno); + result = service.mainDashDronList(cstmrSno); // Top3 기체 정보 리스트 조회하는 기능 } 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")); @@ -159,7 +201,13 @@ public class MainDashController { } - + /** + * 비행실적 통계하는 기능. + * @param date + * @param type + * @Deprecated 현재 사용하지 않음 + * @return + */ @GetMapping(value = "/stcs/flight/date/{type}") @ApiOperation(value = "김포공항, 비행실적 통계") @Tag(name = "메인화면 컨트롤러", description = "메인화면 관련 API") @@ -174,18 +222,25 @@ public class MainDashController { try { if(date == null) date = ""; - formatParam = service.paramCheck(date, type); + formatParam = service.paramCheck(date, type); // 파라미터 체크 } catch (NumberFormatException e) { - return ResponseEntity.status(HttpStatus.OK) - .body(new ErrorResponse(RSErrorCode.ER_PARAM)); + // 검증통과하지 못할 시 서버에서 "의도적인" 에러 반환 + return ResponseEntity.status(HttpStatus.OK) // "의도적인" 에러 반환코드 + .body(new ErrorResponse(RSErrorCode.ER_PARAM)); } List result = null; try { - result = service.mainKacDashStcsDay(date,formatParam); + result = service.mainKacDashStcsDay(date,formatParam); // 날짜별 비행실적 통계기능 } 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")); @@ -194,6 +249,13 @@ public class MainDashController { return ResponseEntity.ok().body(new SuccessResponse>(result)); } + /** + * 김포공항, 비행승인 통계 + * @param date + * @param type + * @Deprecated 현재 사용하지 않음 + * @return + */ @GetMapping("/stcs/plan-allow/date/{type}") @ApiOperation(value = "김포공항, 비행승인 통계") @Tag(name = "메인화면 컨트롤러", description = "메인화면 관련 API") @@ -208,18 +270,25 @@ public class MainDashController { try { if(date == null) date = ""; - formatParam = service.paramCheck(date,type); + formatParam = service.paramCheck(date, type); // 파라미터 체크 } catch (NumberFormatException e) { - return ResponseEntity.status(HttpStatus.OK) - .body(new ErrorResponse(RSErrorCode.ER_PARAM)); + // 검증통과하지 못할 시 서버에서 "의도적인" 에러 반환 + return ResponseEntity.status(HttpStatus.OK) // "의도적인" 에러 반환코드 + .body(new ErrorResponse(RSErrorCode.ER_PARAM)); } List result = null; try { - result = service.mainStcsPlanAllow(date,formatParam); + result = service.mainStcsPlanAllow(date,formatParam); // 김포공항, 비행승인 통계 기능 } 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")); @@ -228,6 +297,14 @@ public class MainDashController { return ResponseEntity.ok().body(new SuccessResponse>(result)); } + /** + * 드론별 비행 통계조회하는 기능. + * @param date + * @param idntfNum + * @param type + * @Deprecated 현재 사용하지 않음 + * @return + */ @GetMapping("/stcs/drone-flight/date/{type}") @ApiOperation(value = "김포공항, 드론별 비행 통계") @Tag(name = "메인화면 컨트롤러", description = "메인화면 관련 API") @@ -237,25 +314,31 @@ public class MainDashController { @ApiImplicitParam(name = "idntfNum",value = "드론식별번호", dataTypeClass = String.class), }) @Deprecated - public ResponseEntity droneFlightStatistics(String date, @RequestParam(required = true) String idntfNum, @PathVariable String type){ - log.info("idntfNum -> {}", idntfNum); + public ResponseEntity droneFlightStatistics(String date, @RequestParam(required = true) String idntfNum, @PathVariable String type){ String[] formatParam = null; try { if(date == null) date = ""; - formatParam = service.paramCheck(date,type); + formatParam = service.paramCheck(date, type); // 파라미터 체크 } catch (NumberFormatException e) { - return ResponseEntity.status(HttpStatus.OK) - .body(new ErrorResponse(RSErrorCode.ER_PARAM)); + // 검증통과하지 못할 시 서버에서 "의도적인" 에러 반환 + return ResponseEntity.status(HttpStatus.OK) // "의도적인" 에러 반환코드 + .body(new ErrorResponse(RSErrorCode.ER_PARAM)); } List result = null; try { - result = service.mainStcsDroneFlight(date,idntfNum,formatParam); + result = service.mainStcsDroneFlight(date,idntfNum,formatParam); // 드론별 비행실적 통계 기능. } 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")); @@ -264,6 +347,13 @@ public class MainDashController { return ResponseEntity.ok().body(new SuccessResponse>(result)); } + /** + * 비정상상황 비행 통계조회하는 기능. + * @param date + * @param type + * @Deprecated 현재 사용하지 않음 + * @return + */ @GetMapping("/stcs/warning-flight/date/{type}") @ApiOperation(value = "김포공항, 비정상상황 비행 통계") @Tag(name = "메인화면 컨트롤러", description = "메인화면 관련 API") @@ -278,18 +368,25 @@ public class MainDashController { try { if(date == null) date = ""; - formatParam = service.paramCheck(date,type); + formatParam = service.paramCheck(date, type); // 파라미터 체크 } catch (NumberFormatException e) { - return ResponseEntity.status(HttpStatus.OK) - .body(new ErrorResponse(RSErrorCode.ER_PARAM)); + // 검증통과하지 못할 시 서버에서 "의도적인" 에러 반환 + return ResponseEntity.status(HttpStatus.OK) // "의도적인" 에러 반환코드 + .body(new ErrorResponse(RSErrorCode.ER_PARAM)); } List result = null; try { - result = service.mainStcsWarningFlight(date,formatParam); + result = service.mainStcsWarningFlight(date,formatParam); // 비정상상황 통계구하는 기능. } 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")); @@ -298,6 +395,10 @@ public class MainDashController { return ResponseEntity.ok().body(new SuccessResponse>(result)); } + /** + * 드론 비행 현황 통계 기능. + * @return + */ @GetMapping(value = "/stcs/dron-flight") @ApiOperation(value = "드론 비행 현황") @Tag(name = "메인화면 컨트롤러", description = "메인화면 관련 API") @@ -306,8 +407,15 @@ public class MainDashController { Map result = null; try { - result = service.mainDashDronFlightStcs(); + result = service.mainDashDronFlightStcs(); // 드론 비행 현황기능 }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")); @@ -316,6 +424,11 @@ public class MainDashController { return ResponseEntity.ok().body(new SuccessResponse< Map>(result)); } + /** + * 드론 별 비행운항 목록 조회하는 기능. + * @param serviceType + * @return + */ @GetMapping(value = "/dron-flight/list") @ApiOperation(value = "드론 별 비행운항 목록") @Tag(name = "메인화면 컨트롤러", description = "메인화면 관련 API") @@ -324,8 +437,15 @@ public class MainDashController { List result = null; try { - result = service.mainDashDronFlightList(serviceType); + result = service.mainDashDronFlightList(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")); @@ -334,6 +454,11 @@ public class MainDashController { return ResponseEntity.ok().body(new SuccessResponse>(result)); } + /** + * 일일 비정상상황에 대한 통계 기능. + * @param serviceType + * @return + */ @GetMapping("/current/flight-warn") @ApiOperation(value = "일일 비정상상황 통계") @Tag(name = "메인화면 컨트롤러", description = "메인화면 관련 API") @@ -345,8 +470,15 @@ public class MainDashController { List result = new ArrayList<>(); try { - result = service.currentFlightWarn(serviceType); + result = service.currentFlightWarn(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")); @@ -355,6 +487,11 @@ public class MainDashController { return ResponseEntity.ok().body(new SuccessResponse>(result)); } + /** + * 일일 비행계획에 대한 통계 기능. + * @param serviceType + * @return + */ @GetMapping("/current/flight-plan") @ApiOperation(value = "일일 비행계획 통계") @Tag(name = "메인화면 컨트롤러", description = "메인화면 관련 API") @@ -367,6 +504,13 @@ public class MainDashController { try { result = service.currentFlightPlan(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")); @@ -377,15 +521,25 @@ public class MainDashController { return ResponseEntity.ok().body(new SuccessResponse>(result)); } - + /** + * 일일 비행건수 현황 통계기능. + * @return + */ @GetMapping("/stcs/dailyflight") @ApiOperation(value = "일일 비행건수 현황") @Tag(name = "메인화면 컨트롤러",description = "메인화면 관련 API") public ResponseEntity getDailyFlightNumOfStcs(){ List result = null; try { - result = service.dailyFlightNumOfStcs(); + result = service.dailyFlightNumOfStcs(); // 일일 비행건수 현황 통계기능 }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/dash/service/MainDashService.java b/pav-server/src/main/java/com/palnet/biz/api/main/dash/service/MainDashService.java index a56cd475..309edfd8 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 @@ -49,7 +49,7 @@ public class MainDashService { private final JwtTokenUtil token; /** - * 일별 비행건수 통계 + * 일별 비행건수 통계하는 기능. * @param rq * @return */ @@ -69,7 +69,7 @@ public class MainDashService { } /** - * Top5 지역별 비행횟수 통계 + * Top5 지역별 비행횟수 통계기능. * @param rq * @return */ @@ -89,7 +89,9 @@ public class MainDashService { } /** - * TOP3 가입 그룹 리스트 표출 + * TOP3 가입 그룹 리스트 조회하는 기능. + * @param cstmrSno + * @return */ public List mainDashGroupList(int cstmrSno){ @@ -113,7 +115,7 @@ public class MainDashService { /** - * Top3 기체 정보 리스트 표출 + * Top3 기체 정보 리스트 조회하는 기능. */ public List mainDashDronList(int cstmrSno){ List resultList = ptyDronQueryRepository.dronTop3(cstmrSno); @@ -122,8 +124,9 @@ public class MainDashService { /** - * 김포공항, 날짜별 통계 - * @param yyyymm + * 김포공함, 날짜별 비행실적 통계 + * @param date + * @param formatParam * @return */ public List mainKacDashStcsDay(String date, String[] formatParam){ @@ -133,27 +136,38 @@ public class MainDashService { return resultList; } - public List mainDashDronFlightList(String serviceType) throws Exception{ - - String cptAuth = token.getCptAuthCodeByToken(); - - List resultList = new ArrayList(); - - cptAuth = "KAC"; // 임시 테스트용으로 KAC 권한 부여 - - if(cptAuth != null) { - - resultList = fltPlanQueryRepository.getFlightDronList(cptAuth, serviceType); - - }else { - - log.error("cptAuth가 부여되지 않은 계정입니다"); - throw new Exception(); - } - - return resultList; - } + /** + * 드론 별 비행운항 목록 조회하는 기능. + * @param serviceType + * @return + * @throws Exception + */ + public List mainDashDronFlightList(String serviceType) throws Exception{ + + String cptAuth = token.getCptAuthCodeByToken(); + + List resultList = new ArrayList(); + + cptAuth = "KAC"; // 임시 테스트용으로 KAC 권한 부여 + + if(cptAuth != null) { + + resultList = fltPlanQueryRepository.getFlightDronList(cptAuth, serviceType); + + }else { + + log.error("cptAuth가 부여되지 않은 계정입니다"); + throw new Exception(); + } + + return resultList; + } + /** + * 드론 비행 현황기능. + * @return + * @throws Exception + */ public Map mainDashDronFlightStcs() throws Exception{ String cptAuth = ""; @@ -182,7 +196,7 @@ public class MainDashService { return resultList; } /** - * 김포공항, 비행승인 통계 + * 김포공항, 비행승인 통계 기능. * @param yyyymm * @return */ @@ -288,8 +302,11 @@ public class MainDashService { return result; } - - + /** + * 일일 비행계획에 관련된 내용 통계조회하는 기능. + * @param serviceType + * @return + */ public List currentFlightPlan(String serviceType){ // boolean authCheck = mainStatisticsService.authCheck(groupId); @@ -320,6 +337,7 @@ public class MainDashService { result.add(node); } + // 전날과 오늘 합계에 대한 감가율을 구함 for(int i = 0; i < result.size(); i++){ if(i == 0) continue;; @@ -341,9 +359,11 @@ public class MainDashService { return result; } - - - + /** + * 일일비정상상황에 대한 통계 기능을 조회하는 기능. + * @param serviceType + * @return + */ public List currentFlightWarn(String serviceType){ // boolean authCheck = mainStatisticsService.authCheck(groupId); @@ -361,7 +381,7 @@ public class MainDashService { for(String cate : dateCate){ List cntrlWarnLogs = ctrCntrlWarnLogQueryRepository.currentStcs(serviceType, cate); - int count = cntrlWarnLogs.size(); // + int count = cntrlWarnLogs.size(); // 총 갯수 int plan = (int)cntrlWarnLogs.stream().filter(value -> value.getWarnType().equals(WarnType.PLAN.getValue())).count(); int altitude = (int)cntrlWarnLogs.stream().filter(value -> value.getWarnType().equals(WarnType.ALTITUDE.getValue())).count(); @@ -377,6 +397,7 @@ public class MainDashService { result.add(node); } + // 전날과 오늘 합계에 대한 감가율을 구함 for(int i = 0; i < result.size(); i++){ if(i == 0) continue;; @@ -398,6 +419,10 @@ public class MainDashService { return result; } + /** + * 일일 비행건수 현황 통계기능. + * @return + */ public List dailyFlightNumOfStcs() { // SUPER 권한일 경우와 KAC의 기관코드일 경우 전체적으로 모니터링 가능해야한다. 그외는 자신의 기관에 해당하는 데이터 볼 수 있어야 한다. 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 ed4ef481..ba82f5f9 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 @@ -1858,10 +1858,12 @@ public class CtrCntrlQueryRepository{ return result; } - /*** - * 대시보드 통계(지역별) + /** + * Top5 지역별 비행횟수 통계하는 SQL 기능. + * @param yyyymm + * @param serviceType + * @return */ - public List mainDashStcsArea(String yyyymm, String serviceType){ QCtrCntrlBas bas = QCtrCntrlBas.ctrCntrlBas; @@ -1879,6 +1881,26 @@ public class CtrCntrlQueryRepository{ builder.and(formattedDate.eq(yyyymm)); if(!serviceType.isEmpty()) builder.and(fBas.serviceType.eq(serviceType)); + /** + * 일자[cntrlStDt] 조건, + * 각 항별[serviceType] 조건, + * 지역1[area1]이 비워져 있으면 안되는 조건으로 조회하는 SQL 입니다. + * + * SELECT + * CCHA.ARE1 AS 'typeCd', + * COUNT(CCHA.*) AS 'count' + * FROM CTR_CNTRL_BAS CCB + * LEFT OUTER JOIN CTR_CNTRL_HSTRY_AREA CCHA + * ON CCB.CNTRL_ID = CCHA.CNTRL_ID + * AND CCHA.ACTN_TYPE = '99' + * 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 CCHA.AREA1 IS NOT NULL + * AND DATE_FORMAT(CCB.CNTRL_ST_DT , '%Y-%m') = #{yyyymm} + * AND FPB.SERVICE_TYPE = #{serviceType} + */ List result = query.select(Projections.bean(MainDashStcsModel.class, area.area1.as("typeCd"), area.count().as("count") @@ -1899,10 +1921,12 @@ public class CtrCntrlQueryRepository{ } - /*** - * 대시보드 통계(일자별) + /** + * 대시보드 통계(일자별)하는 SQL 기능 + * @param yyyymm + * @param serviceType + * @return */ - public List mainDashStcsDay(String yyyymm, String serviceType){ QCtrCntrlBas bas = QCtrCntrlBas.ctrCntrlBas; QFltPlanBas fBas = QFltPlanBas.fltPlanBas; @@ -1926,6 +1950,23 @@ public class CtrCntrlQueryRepository{ builder.and(fBas.serviceType.eq(serviceType)); } + /** + * 일자[cntrlStDt] 조건, + * 각 항별 코드[serviceType]조건, + * 활성화코드[statusCd]가 '99' 조건인지 확인하여 조회하는 SQL 입니다. + * + * SELECT + * DATE_FORMAT(FPB.CREATE_DT , '%d') as 'typeCd', + * COUNT(*) as 'count' + * 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 DATE_FORMAT(FPB.CREATE_DT , '%Y-%m') = #{yyyymm} + * AND CCB.STATUS_CD = '99' + * AND FPB.SERVICE_TYPE = #{serviceType} + */ List result = query.select(Projections.bean(MainDashStcsModel.class , formattedDate2.as("typeCd"), bas.count().as("count") @@ -2140,7 +2181,7 @@ public class CtrCntrlQueryRepository{ } /** - * 김포공항, 비행실적 통계 API + * 김포공항, 비행실적 통계조회하는 SQL 기능 입니다. * @param yyyymm * @return */ @@ -2166,6 +2207,20 @@ public class CtrCntrlQueryRepository{ if(date != null && date.length() > 0) builder.and(formattedDate.eq(date)); if(idntfNum != null) builder.and(bas.idntfNum.eq(idntfNum)); + /** + * 활성화 코드[statusCd]가 '99' 인지, + * 날짜[date]값 조건인지, + * 기체식별번호[idntfNum]값 조건인지 확인하여 데이터베이스에서 조회하는 SQL 입니다. + * + * SELECT + * DATE_FORMAT(CCB.CNTRL_ST_DT, #{format[1]}) AS 'typeCd' + * COUNT(CCB.*) AS 'count' + * FROM CTR_CNTRL_BAS CCB + * WHERE CCB.STATUS_CD = '99' + * AND CCB.IDNTF_NUM = #{idntfNum} + * AND DATE_FORMAT(CCB.CNTRL_ST_DT, #{format[1]}) = #{date} + * GROUP BY DATE_FORMAT(CCB.CNTRL_ST_DT, #{format[1]}) + */ List result = query .select( Projections.bean( @@ -2214,6 +2269,16 @@ public class CtrCntrlQueryRepository{ BooleanBuilder builder = new BooleanBuilder(); if(date != null && date.length() > 0) builder.and(formattedDate.eq(date)); + /** + * 날짜[date] 조건인지 확인하여 조회하는 SQL 입니다. + * + * SELECT + * DATE_FORMAT(CCWL.CREATE_DT, #{format[1]}) AS 'typeCd' + * COUNT(FPB.*) AS 'count' + * FROM CTR_CNTRL_WARN_LOG CCWL + * WHERE DATE_FORMAT(CCWL.CREATE_DT, #{format[1]}) = #{date} + * GROUP BY DATE_FORMAT(CCWL.CREATE_DT, #{format[1]}) + */ List result = query .select( Projections.bean( @@ -3060,7 +3125,13 @@ public class CtrCntrlQueryRepository{ return result; } - + /** + * 시작일, 끝일 조건으로 비행관련 통계데이터를 조회하는 SQL 기능. + * @param start + * @param end + * @param serviceType + * @return + */ public List completeFlight(Instant start, Instant end, String serviceType) { // Tuple 여러 값을 담을 수 있는 클래스, 여러 필드를 한꺼번에 반환해야 할 때 유용하다. QFltPlanCtrCntrlRel fpccr = QFltPlanCtrCntrlRel.fltPlanCtrCntrlRel; @@ -3076,6 +3147,32 @@ public class CtrCntrlQueryRepository{ builder.and(fpb.schFltEndDt.goe(start)); if (serviceType != null && !serviceType.isEmpty()) builder.and(fpb.serviceType.eq(serviceType)); + /** + * 승인여부[aprvlYn]가 'Y'인지, + * 비행계획서 일련번호[planSno]가 없는행이 아닌지, + * 상태코드[statusCd]가 '99' 인지, + * 시작일[schFltStDt]과 끝일[schFltEndDt] 사이인지, + * 각항별[serviceType] 조건인지 확인하여 조회하는 SQL 입니다. + * + * SELECT + * FPB.PLAN_SNO , + * FPB.APRVL_YN , + * FPB.APRVL_DT , + * CCB.CNTRL_ID , + * CCB.STATUS_CD , + * CCB.CNTRL_ST_DT , + * CCB.CNTRL_END_DT + * FROM FLT_PLAN_BAS FPB + * LEFT OUTER JOIN FLT_PLAN_CTR_CNTRL_REL FPCCR + * ON FPCCR.PLAN_SNO = FPB.PLAN_SNO + * LEFT OUTER JOIN CTR_CNTRL_BAS CCB + * ON FPCCR.CNTRL_ID = CCB.CNTRL_ID + * WHERE FPB.APRVL_YN = 'Y' + * AND FPCCR.PLAN_SNO IS NOT NULL + * AND CCB.STATUS_CD = '99' + * AND FPB.SCH_FLT_ST_DT < #{end} + * AND FPB.SCH_FLT_END_DT >= #{start} + */ return query .select( fpb.planSno, @@ -3095,6 +3192,13 @@ public class CtrCntrlQueryRepository{ } + /** + * 미 비행건수 조회하는 SQL 기능. + * @param start + * @param end + * @param serviceType + * @return + */ public List notFlight(Instant start, Instant end, String serviceType) { QCtrCntrlBas ccb = QCtrCntrlBas.ctrCntrlBas; @@ -3111,6 +3215,34 @@ public class CtrCntrlQueryRepository{ builder.and(fpb.schFltEndDt.goe(start)); if (serviceType != null && !serviceType.isEmpty()) builder.and(fpb.serviceType.eq(serviceType)); + /** + * 승인여부[aprvlYn]가 'Y'인지, + * 비행계획서 일련번호[planSno] 있는지, + * 상태값코드[statusCd]가 있는지, + * 관제ID[cntrlId]가 있는지, + * 시작일[schFltStDt]과 끝일[schFltEndDt] 사이인지, + * 각 항별[serviceType]코드 조건인지 확인하여 조회하는 SQL 입니다. + * + * SELECT + * FPB.PLAN_SNO , + * FPB.APRVL_YN , + * FPB.APRVL_DT , + * CCB.CNTRL_ID , + * FPCCR.CNTRL_ID , + * FPCCR.PLAN_SNO + * FROM FLT_PLAN_BAS FPB + * LEFT OUTER JOIN FLT_PLAN_CTR_CNTRL_REL FPCCR + * ON FPB.PLAN_SNO = FPCCR.PLAN_SNO + * LEFT OUTER JOIN CTR_CNTRL_BAS CCB + * ON CCB.CNTRL_ID = FPCCR.CNTRL_ID + * WHERE FPB.APRVL_YN = 'Y' + * AND FPCCR.PLAN_SNO IS NOT NULL + * AND CCB.STATUS_CD IS NOT NULL + * AND CCB.CNTRL_ID IS NOT NULL + * AND FPB.SCH_FLT_ST_DT < #{end} + * AND FPB.SCH_FLT_END_DT >= #{start} + * AND FPB.SERVICE_TYPE = #{serviceType} + */ return query .select( fpb.planSno, 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 35aa2d83..8e4468eb 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 @@ -284,6 +284,12 @@ public class CtrCntrlWarnLogQueryRepository { return result; } + /** + * 카테고리[cate]별 일일비정상황황에 대한 통계값을 구하는 SQL 기능. + * @param groupId + * @param cate + * @return + */ public List currentStcs(String groupId, String cate){ QFltPlanBas qFltPlanBas = QFltPlanBas.fltPlanBas; QFltPlanCtrCntrlRel qFltPlanCtrCntrlRel = QFltPlanCtrCntrlRel.fltPlanCtrCntrlRel; @@ -291,6 +297,20 @@ public class CtrCntrlWarnLogQueryRepository { BooleanBuilder builder = getCurrentBooleanBuilder(groupId, cate, qFltPlanBas, qCtrCntrlWarnLog); + /** + * 각 항별[serviceType] 조건인지, + * 날짜별[2일전, 1일전, 금일, 명일] 조건인지 확인하여 조회하는 SQL 입니다. + * + * SELECT + * CCWL.WARN_TYPE + * FROM CTR_CNTRL_WARN_LOG CCWL + * LEFT OUTER JOIN FLT_PLAN_CTR_CNTRL_REL FPCCR + * ON CCWL.CNTRL_ID = CCWL.CNTRL_ID + * LEFT OUTER JOIN FLT_PLAN_BAS FPB + * ON FPCCR.PLAN_SNO = FPB.PLAN_SNO + * WHERE FPB.SERVICE_TYPE = #{serviceType} + * AND DATE_FORMAT(CCWL.CREATE_DT, #{dateFormat}) = #{cate} + */ List stcsValues = query .select( Projections.bean( @@ -310,6 +330,15 @@ public class CtrCntrlWarnLogQueryRepository { return stcsValues; } + /** + * 2일전[beforeYesterday], 1일전[yesterday], 금일[today], 명일[tomorrow] + * 에 맞춰 WHERE절 연산값이 달라짐. + * @param serviceType + * @param cate + * @param qFltPlanBas + * @param qCtrCntrlWarnLog + * @return + */ private BooleanBuilder getCurrentBooleanBuilder(String serviceType, String cate, QFltPlanBas qFltPlanBas, QCtrCntrlWarnLog qCtrCntrlWarnLog){ BooleanBuilder builder = new BooleanBuilder(); 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 a4a7a741..da58100d 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 @@ -949,8 +949,7 @@ public class FltPlanQueryRepository { } /** - * 김포공항, 비행승인 통계 API - * + * 김포공항, 비행승인 통계구하는 SQL 기능. * @param date * @return */ @@ -972,6 +971,18 @@ public class FltPlanQueryRepository { builder.and(bas.aprvlYn.eq("Y")); if (date != null && date.length() > 0) builder.and(formattedDate.eq(date)); + /** + * 날짜[date] 조건 , + * 승인여부[aprvlYn] 조건으로 조회하는 SQL 입니다. + * + * SELECT + * DATE_FORMAT(FPB.APRVL_DT, #{format[1]}) AS 'typeCd' + * COUNT(FPB.*) AS 'count' + * FROM FLT_PLAN_BAS FPB + * WHERE FPB.APRVL_YN = 'Y' + * AND DATE_FORMAT(FPB.APRVL_DT, #{format[1]}) = #{date} + * GROUP BY DATE_FORMAT(FPB.APRVL_DT, #{format[1]}) + */ List result = query .select( Projections.bean( @@ -2120,6 +2131,17 @@ public class FltPlanQueryRepository { BooleanBuilder builder = getCurrentBooleanBuilder(serviceType, cate, qFltPlanBas); + /** + * 각 항별[serviceType] 조건인지, + * 날짜별[2일전, 1일전, 금일, 명일] 조건인지 확인하여 조회하는 SQL 입니다. + * + * SELECT + * FPB.PLAN_SNO , + * FPB.APRVL_YN + * FROM FLT_PLAN_BAS FPB + * WHERE FPB.SERVICE_TYPE = #{serviceType} + * AND DATE_FORMAT(CCWL.CREATE_DT, #{dateFormat}) = #{cate} + */ List stcsValues = query .select( Projections.bean( @@ -2135,6 +2157,14 @@ public class FltPlanQueryRepository { return stcsValues; } + /** + * 2일전[beforeYesterday], 1일전[yesterday], 금일[today], 명일[tomorrow] + * 에 맞춰 WHERE절 연산값이 달라짐. + * @param serviceType + * @param cate + * @param qFltPlanBas + * @return + */ private BooleanBuilder getCurrentBooleanBuilder(String serviceType, String cate, QFltPlanBas qFltPlanBas){ BooleanBuilder builder = new BooleanBuilder(); @@ -2178,8 +2208,12 @@ public class FltPlanQueryRepository { return builder; } - - + /** + * 드론 별 비행운항 목록 조회하는 SQL 기능. + * @param cptAuth + * @param serviceType + * @return + */ public List getFlightDronList(String cptAuth, String serviceType){ QComIdntfBas cib = QComIdntfBas.comIdntfBas; @@ -2215,7 +2249,46 @@ public class FltPlanQueryRepository { .or(fpb.createDt.between(startOfToday, startOfTomorrow)) ) .and(fpb.planSno.isNotNull()); - + + /** + * 각 항별[serviceType] 조건인지, + * 비행계획서 고유번호[planSno]가 비워져 있지는 않은지, + * 관제 생성시간[createDt]이 startOfToday와 startOfTomorrow 사이에 있는지, + * 비행계획서 생성시간이 startOfToday와 startOfTomorrow 사이에 있는지 + * 확인하여 데이터베이스에서 조회하는 SQL 입니다. + * + * SELECT + * PGB.GROUP_NM , + * FPB.MEMBER_NAME , + * FPA.IDNTF_NUM , + * CCB.CNTRL_ST_DT , + * CCB.CNTRL_END_DT , + * CONCAT(SEC_TO_TIME(TIME_TO_SEC(TIMEDIFF(CCB.CNTRL_END_DT ,CCB.CNTRL_ST_DT)))) AS 'totalFlightTime', + * CASE + * WHEN CCB.STATUS_CD = '01' THEN '비행 중' + * WHEN CCB.STATUS_CD = '99' THEN '비행 완료' + * WHEN FPB.PLAN_SNO IS NOT NULL THEN '비행 대기 중' + * ELSE '비행 없음' + * END AS 'status' + * FROM FLT_PLAN_ARCRFT FPA + * LEFT OUTER JOIN FLT_PLAN_BAS FPB + * ON FPA.PLAN_SNO = FPB.PLAN_SNO + * LEFT OUTER JOIN PTY_GROUP_BAS PGB + * ON FPB.GROUP_ID = PGB.GROUP_ID + * LEFT OUTER JOIN COM_IDNTF_BAS CIB + * ON FPA.IDNTF_NUM = CIB.IDNTF_NUM + * LEFT OUTER JOIN FLT_PLAN_CTR_CNTRL_REL FPCCR + * ON FPB.PLAN_SNO = FPCCR.PLAN_SNO + * LEFT OUTER JOIN CTR_CNTRL_BAS CCB + * ON FPCCR.CNTRL_ID = CCB.CNTRL_ID + * WHERE FPB.SERVICE_TYPE = #{serviceType} + * AND PGB.GROUP_NM = #{cptAuth} + * AND FPB.PLAN_SNO IS NOT NULL + * AND ( + * (CCB.CREATE_DT BETWEEN #{startOfToday}, #{startOfTomorrow}) + * OR (FPB.CREATE_DT BETWEEN #{startOfToday}, #{startOfTomorrow}) + * ) + */ List result = query .select(Projections.bean(MainDashFlightListModel.class, pgb.groupNm, @@ -2247,6 +2320,11 @@ public class FltPlanQueryRepository { return result; } + /** + * 드론 비행 현황을 조회하는 SQL 기능. + * @param cptAuth + * @return + */ public Map getFlightDronStcs(String cptAuth){ QComIdntfBas cib = QComIdntfBas.comIdntfBas; @@ -2274,6 +2352,38 @@ public class FltPlanQueryRepository { ) .and(fpb.planSno.isNotNull()); + /** + * 각 항별[serviceType] 조건인지, + * 비행계획서 고유번호[planSno]가 비워져 있지는 않은지, + * 관제 생성시간[createDt]이 startOfToday와 startOfTomorrow 사이에 있는지, + * 비행계획서 생성시간이 startOfToday와 startOfTomorrow 사이에 있는지 + * 확인하여 데이터베이스에서 조회하는 SQL 입니다. + * + * SELECT + * CASE + * WHEN CCB.STATUS_CD = '01' THEN 'inFlight' + * WHEN CCB.STATUS_CD = '99' THEN 'flightComplete' + * WHEN FPB.PLAN_SNO IS NOT NULL THEN 'flightWaiting' + * ELSE '비행 없음' + * END AS 'status', + * COUNT(FPB.*) AS 'count' + * FROM FLT_PLAN_ARCRFT FPA + * LEFT OUTER JOIN FLT_PLAN_BAS FPB + * ON FPB.PLAN_SNO = FPA.PLAN_SNO + * LEFT OUTER JOIN COM_IDNTF_BAS CIB + * ON CIB.IDNTF_NUM = FPA.IDNTF_NUM + * LEFT OUTER JOIN FLT_PLAN_CTR_CNTRL_REL FPCCR + * ON FPCCR.PLAN_SNO = FPB.PLAN_SNO + * LEFT OUTER JOIN CTR_CNTRL_BAS CCB + * ON FPCCR.CNTRL_ID = CCB.CNTRL_ID + * WHERE FPB.SERVICE_TYPE = #{serviceType} + * AND FPB.PLAN_SNO IS NOT NULL + * AND ( + * (CCB.CREATE_DT BETWEEN #{startOfToday}, #{startOfTomorrow}) + * OR (FPB.CREATE_DT BETWEEN #{startOfToday}, #{startOfTomorrow}) + * ) + * GROUP BY CCB.STATUS_CD + */ List res = query .select( new CaseBuilder() diff --git a/pav-server/src/main/java/com/palnet/biz/jpa/repository/pty/PtyDronQueryRepository.java b/pav-server/src/main/java/com/palnet/biz/jpa/repository/pty/PtyDronQueryRepository.java index de494b49..20d0403d 100644 --- a/pav-server/src/main/java/com/palnet/biz/jpa/repository/pty/PtyDronQueryRepository.java +++ b/pav-server/src/main/java/com/palnet/biz/jpa/repository/pty/PtyDronQueryRepository.java @@ -400,14 +400,38 @@ public class PtyDronQueryRepository{ } - /*** - * 메인 대시보드 기체 정보 3건 표출 - */ + /** + * 최근 등록한 기체 정보 3건 조회하는 SQL 기능. + * @param cstmrSno + * @return + */ public List dronTop3(int cstmrSno){ QComArcrftBas bas = QComArcrftBas.comArcrftBas; QPtyGroupBas gBas = QPtyGroupBas.ptyGroupBas; QPtyCstmrGroup group = QPtyCstmrGroup.ptyCstmrGroup; - + + /** + * 사용여부[useYn]가 'Y'인지, + * 회원고유번호[cstmrSno] 조건인지 확인하여 조회하는 SQL 입니다. + * + * SELECT + * CAB.ARCRFT_MODEL_NM , + * CAB.PRDCT_NUM , + * CAB.CREATE_DT , + * PGB.GROUP_NM + * FROM PTY_CSTMR_GROUP PCG + * LEFT OUTER JOIN COM_ARCRFT_BAS CAB + * ON PCG.GROUP_ID = CAB.GROUP_ID + * AND PCG.JOIN_YN = 'Y' + * AND PCG.APRVL_YN = 'Y' + * AND CAB.USE_YN = 'Y' + * LEFT OUTER JOIN PTY_GROUP_BAS PGB + * ON PCG.GROUP_ID = PGB.GROUP_ID + * WHERE CAB.USE_YN = 'Y' + * AND PCG.CSTMR_SNO = #{cstmrSno} + * ORDER BY CAB.CREATE_DT DESC + * LIMIT 3 + */ List result = query.select(Projections.bean(MainDashListModel.class , bas.arcrftModelNm, diff --git a/pav-server/src/main/java/com/palnet/biz/jpa/repository/pty/PtyGroupQueryRepository.java b/pav-server/src/main/java/com/palnet/biz/jpa/repository/pty/PtyGroupQueryRepository.java index 07a5c721..d7b7d5ff 100644 --- a/pav-server/src/main/java/com/palnet/biz/jpa/repository/pty/PtyGroupQueryRepository.java +++ b/pav-server/src/main/java/com/palnet/biz/jpa/repository/pty/PtyGroupQueryRepository.java @@ -788,6 +788,12 @@ public class PtyGroupQueryRepository{ } return cnt; } + + /** + * 최근 가입된 순으로 3개 그룹 조회하는 SQL 기능. + * @param cstmrSno + * @return + */ public List groupTop3(int cstmrSno){ QPtyGroupBas bas = QPtyGroupBas.ptyGroupBas; @@ -797,7 +803,24 @@ public class PtyGroupQueryRepository{ builder.and(bas.useYn.eq("Y")); builder.and(dtl.cstmrSno.eq(cstmrSno)); builder.and(dtl.groupAuthCd.eq("MASTER")); - + + /** + * 사용여부[useYn]가 'Y' 인지, + * 회원고유번호[cstmrSno] 조건인지, + * 그룹권한코드[groupAuthCd]가 'MASTER' 인지 조회하는 SQL 입니다. + * + * SELECT + * PGB.GROUP_ID , + * PGB.GROUP_NM , + * PGB.GROUP_TYPE_CD , + * PGB.CREATE_DT + * FROM PTY_GROUP_BAS PGB + * LEFT OUTER JOIN PTY_CSTMR_GROUP PCG + * ON PGB.GROUP_ID = PCG.GROUP_ID + * WHERE PGB.USE_YN = 'Y' + * AND PCG.CSTMR_SNO = #{cstmrSno} + * AND PCG.GROUP_AUTH_CD = 'MASTER' + */ List result = query.select(Projections.bean(BasGroupModel.class , bas.groupId,