diff --git a/pav-server/src/main/java/com/palnet/biz/api/anls/smlt/controller/AnlsSmltController.java b/pav-server/src/main/java/com/palnet/biz/api/anls/smlt/controller/AnlsSmltController.java index fd74a684..1e48f6ba 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/anls/smlt/controller/AnlsSmltController.java +++ b/pav-server/src/main/java/com/palnet/biz/api/anls/smlt/controller/AnlsSmltController.java @@ -42,7 +42,8 @@ public class AnlsSmltController { private final AnlsSmltService service; /** - * 비행 현황 목록 + * 비행현황 목록 리스트 조회하는 기능, + * AnlsHstryRqModel 따른 리스트를 조회함. * @param rq * @return */ @@ -55,17 +56,25 @@ public class AnlsSmltController { log.debug("JSON>>>>>>>>" , JsonUtils.toJson(rq)); log.debug("Param" + rq.getStDate() + "::" + rq.getEndDate()); - //입력값 검증 + // 검색 시작일 날짜[stDate], 검색 끝일 날짜 날짜값[endDate], 날짜값이 10자리인지 확인[정해진 포맷팅인지 확인하는 것] 입력값 검증처리 if(rq.getStDate() == null || !(rq.getStDate().length() == 10) || rq.getEndDate() ==null || !(rq.getEndDate().length() == 10) ) { - return ResponseEntity.status(HttpStatus.OK) + // 검증통과하지 못할 시 서버에서 "의도적인" 에러 반환 + return ResponseEntity.status(HttpStatus.OK) // "의도적인" 에러 반환코드 .body(new ErrorResponse(RSErrorCode.ER_PARAM)); } try { - result = service.list(rq); + result = service.list(rq); // 비행현황 목록 조회하는 기능. } 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")); @@ -77,7 +86,8 @@ public class AnlsSmltController { /** - * 비행 이력 데이터 조회 + * 비행 이력 데이터 조회하는 기능, + * 비행ID[CNTRL_ID]로 조회함 * @param rq * @return */ @@ -90,9 +100,16 @@ public class AnlsSmltController { try { // result = service.list(rq); - result = service.histList(id); + result = service.histList(id); // 비행ID[CNTRL_ID]로 비행이력을 조회하는 기능. } 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")); @@ -104,7 +121,8 @@ public class AnlsSmltController { /** - * 통계 데이터 조회 + * 통계 데이터 조회, + * 비행ID[CNTRL_ID]로 조회함 * @param rq * @return */ @@ -117,10 +135,16 @@ public class AnlsSmltController { try { - result = service.stcsList(id); - + result = service.stcsList(id); // 통계 데이터 조회하는 기능 } 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")); @@ -131,7 +155,8 @@ public class AnlsSmltController { } /** - * 비행 상세정보 조회 + * 비행 상세정보 조회, + * 비행ID[CNTRL_ID]로 조회함 * @param id * @return */ @@ -143,9 +168,16 @@ public class AnlsSmltController { AnlsSmltDetailModel result = null; try { - result = service.detail(id); + result = service.detail(id); // 비행ID[CNTRL_ID]로 비행상세정보 조회함 } 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/anls/smlt/service/AnlsSmltService.java b/pav-server/src/main/java/com/palnet/biz/api/anls/smlt/service/AnlsSmltService.java index ce8950e7..031b9fa3 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/anls/smlt/service/AnlsSmltService.java +++ b/pav-server/src/main/java/com/palnet/biz/api/anls/smlt/service/AnlsSmltService.java @@ -61,7 +61,7 @@ public class AnlsSmltService { /** - * 비행 현황 목록 + * 비행현황 목록 조회하는 기능. * @param rq * @return */ @@ -106,6 +106,7 @@ public class AnlsSmltService { for(FltPlanPilot list : pilotList) { pilotResult = fltPlanBasRepository.findBasList(list.getPlanSno()); } + result = query.cntrlBasNormalSmltList(rq, pageable, adminAuth, idntfList, basResult, pilotResult); // App 권한은 user이지만 group 권한이 LEADER / MASTER인 그룹이 있는 경우 해당 비행 이력 목록 표출 // group 권한이 Normal인 경우 본인이 작성한 비행계획서의 이력 / 본인이 조종사인 기체 이력/ 본인이 등록한 기체 이력 표출 @@ -122,12 +123,13 @@ public class AnlsSmltService { } /** - * - * @param rq비행 이력 데이터 조회 + * 비행ID[CNTRL_ID]로 비행이력을 조회하는 기능. + * @param rq * @return */ public List histList(String id){ + // 비행ID[CNTRL_ID]로 비행이력을 데이터베이스에서 조회함. List resultList = query.listCntrlHstry(id); //정렬 순서 뒤집기 처리 @@ -138,14 +140,13 @@ public class AnlsSmltService { /** - * 통계 데이터 조회 + * 통계 데이터 조회하는 기능 * @param rq * @return */ public List stcsList(String id){ - - List result = query.anlsSmltStcs(id); - + + List result = query.anlsSmltStcs(id); // 비행관제 ID[CNTRL_ID]로 데이터베이스에서 시뮬레이션 통계데이터를 조회함. //통계 데이터 가공 처리 //소수점 자리 1자리로 컷트 @@ -162,7 +163,8 @@ public class AnlsSmltService { /** - * 비행 상세정보 조회 + * 비행 상세정보 조회, + * 비행ID[CNTRL_ID]로 조회함 * @param cntrlId * @return * @throws Exception @@ -172,7 +174,7 @@ public class AnlsSmltService { AnlsSmltDetailModel result = new AnlsSmltDetailModel(); - result = query.anlsSmltDetail(cntrlId); + result = query.anlsSmltDetail(cntrlId); // 비행ID[CNTRL_ID]로 데이터베이스에서 비행상세 정보 조회함 // Optional optional = ctrCntrlBasRepository.findById(cntrlId); // 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 16d0b920..21357e37 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 @@ -461,6 +461,16 @@ public class CtrCntrlQueryRepository{ return new PageImpl<>(result, pageable, result.size()); } + /** + * 비행 시뮬레이션할 데이터를 조건에 맞춰 데이터베이스에서 조회하는 SQL 기능. + * @param rq + * @param pageable + * @param adminAuth + * @param idntfList + * @param basResult + * @param pilotResult + * @return + */ public PageImpl cntrlBasNormalSmltList(AnlsHstryRqModel rq, Pageable pageable, List adminAuth, @@ -483,38 +493,103 @@ public class CtrCntrlQueryRepository{ end.setTime(Date.from(DateUtils.stringToDate(rq.getEndDate()))); end.add(Calendar.DATE, 1); Date endDate = end.getTime(); + + /** + * 조건1. 검색시작일 후 + * 조건2. 검색끝일 전 + * 조건3. 승인값이 "Y"인지 + * 조건4. status가 값이 99인지 + */ builder.and(qCntrlBasEntity.cntrlStDt.after(DateUtils.stringToDate(rq.getStDate()))); builder.and(qCntrlBasEntity.cntrlEndDt.before(endDate.toInstant())); builder.and(qFltPlanBasEntity.aprvlYn.eq("Y")); builder.and(qCntrlBasEntity.statusCd.eq("99")); + // adminAuth값이 있을 시[유저 권한은 USER지만 그룹내 권한이 ADMIN, MASTER 일경우 그룹전체 값 확인 가능 함.] if(adminAuth.size()>0) { for(JwtGroupModel list : adminAuth) { adminBuilder.or(qFltPlanCtrCntrlRelEntity.groupId.eq(list.getGroupId())); } } + + // 회원 고유번호와 맞는 기체고유번호 조건추가 if(idntfList.size()>0) { for(ComIdntfBas list : idntfList) { idntfBuilder.or(qCntrlBasEntity.idntfNum.eq(list.getIdntfNum())); } } + + // 회원 고유번호와 맞는 비행계획서 고유번호 조건 추가 if(basResult.size()>0) { for(FltPlanBas list : basResult) { basBuilder.or(qFltPlanCtrCntrlRelEntity.planSno.eq(list.getPlanSno())); } } + + // 회원 고유번호와 맞는 파일럿번호로 조회한 비행계획서 번호 조건 추가 if(pilotResult.size()>0) { for(FltPlanBas list : pilotResult) { pilotBuilder.or(qFltPlanCtrCntrlRelEntity.planSno.eq(list.getPlanSno())); } } + // 입력받은 검색 키워드 조건추가 if(!StringUtils.isEmpty(rq.getSearch1())) { builder.and(qCntrlBasEntity.idntfNum.like("%" + rq.getSearch1() + "%")); } List result = new ArrayList<>(); + /** + * 위 조건들과 부합한 데이터베이스 내용을 조회하는 SQL입니다. + * SELECT + * CCB.CNTRL_ID , + * CCB.IDNTF_NUM , + * CCB.STATUS_CD , + * CCB.OBJECT_TYPE_CD , + * CCB.FLGHT_ST_DT , + * CCB.FLGHT_END_DT , + * CCB.CNTRL_ST_DT , + * CCB.CNTRL_END_DT , + * CCB.TTL_TIME , + * CCB.TTL_TIME_TYPE , + * CCB.TTL_DSTNC , + * CCB.TTL_DSTNC_TYPE , + * CCB.AVRG_SPEED , + * CCB.AVRG_SPEED_TYPE , + * CCB.BTTR_CNSMPTN , + * CCB.END_TYPE_CD , + * CCB.CREATE_DT , + * CCB.UPDATE_DT , + * CCHA.ACTN_TYPE , + * CCHA.AREA1 , + * CCHA.AREA2 , + * CCHA.AREA3 , + * CCHA.AREA_NM , + * CCHA.AREA_TYPE , + * CCHA.LAND_NM , + * CCHA.LAND_NUM , + * CCHA.ZIP_CD + * FROM CTR_CNTRL_BAS CCB + * LEFT OUTER JOIN CTR_CNTRL_HSTRY_AREA CCHA + * ON CCB.CNTRL_ID = CCHA.CNTRL_ID + * AND CCHA.ACTN_TYPE = '01' + * 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 FPCCR.GROUP_ID = #{groupId} + * AND CCB.CNTRL_ST_DT > #{stDate} + * AND CCB.CNTRL_END_DT < #{endDate} + * AND CCB.STATUS_CD = '99' + * AND FPB.APRVL_YN = 'Y' + * AND CCB.IDNTF_NUM LIKE CONCAT('%', #{search1}, '%'); + * AND( + * CCB.IDNTF_NUM = #{idntfNum} -- #{idntfNum}값이 여러개 일 경우 OR연산을 붙혀 조건이 늘어남 + * OR FPCCR.PLAN_SNO = #{planSno} -- #{planSno}값이 여러개 일 경우 OR연산을 붙혀 조건이 늘어남 + * OR FPCCR.PLAN_SNO = #{planSno} -- #{planSno}값이 여러개 일 경우 OR연산을 붙혀 조건이 늘어남 + * ) + */ List queryList = query.select(Projections.bean(AnlsHstryModel.class , qCntrlBasEntity.cntrlId, qCntrlBasEntity.idntfNum, @@ -721,7 +796,7 @@ public class CtrCntrlQueryRepository{ * 조건1. 그룹아이디가 맞는지, * 조건2. 검색시작일 이후 * 조건3. 검색끝일 전 - * 조건4. status가 99[비행중]인지 + * 조건4. status가 값이 "99" 인지 * 조건5. 승인이 된건인지 */ builder.and(qFltPlanCtrCntrlRelEntity.groupId.eq(rq.getGroupId())); @@ -1219,7 +1294,13 @@ public class CtrCntrlQueryRepository{ return result; } -public List listCntrlHstry(String id){ + + /** + * 비행ID[CNTRL_ID]로 비행이력을 조회하는 SQL 기능. + * @param id + * @return + */ + public List listCntrlHstry(String id){ QCtrCntrlBas qCntrlBasEntity = QCtrCntrlBas.ctrCntrlBas; QCtrCntrlHstry qCtrCntrHstry = QCtrCntrlHstry.ctrCntrlHstry; @@ -1227,6 +1308,34 @@ public List listCntrlHstry(String id){ BooleanBuilder builder = new BooleanBuilder(); builder.and(qCtrCntrHstry.cntrlId.eq(id)); + /** + * 비행ID[CNTRL_ID]로 + * SELECT + * CCH.CNTRL_ID , + * CCH.HSTRY_SNO , + * CCH.TRMNL_ID , + * CCH.MSSG_TYPE_CD , + * CCH.STATUS_CD , + * CCH.LAT , + * CCH.LON , + * CCH.SPEED , + * CCH.SPEED_TYPE , + * CCH.HEADING , + * CCH.ELEV , + * CCH.ELEV_TYPE , + * CCH.MV_DSTNC , + * CCH.MV_DSTNC_TYPE , + * CCH.BTTR_LVL , + * CCH.BTTR_VLTG , + * CCH.TRMNL_RCV_DT , + * CCH.SRVR_RCV_DT , + * CCB.IDNTF_NUM + * FROM CTR_CNTRL_BAS CCB + * LEFT OUTER JOIN CTR_CNTRL_HSTRY CCH + * ON CCB.CNTRL_ID = CCH.CNTRL_ID + * WHERE CCB.CNTRL_ID = #{cntrlId} + * ORDER BY CCH.SRVR_RCV_DT ASC + */ List result = query.select(Projections.bean(AnlsHstryDetailModel.class , qCtrCntrHstry.cntrlId , qCtrCntrHstry.hstrySno , @@ -1257,6 +1366,7 @@ public List listCntrlHstry(String id){ return result; } + public long listCntrlHstryCount(String id){ QCtrCntrlBas qCntrlBasEntity = QCtrCntrlBas.ctrCntrlBas; @@ -1577,18 +1687,46 @@ public List listCntrlHstry(String id){ return result; } - - - /*** - * 시뮬레이션 상세정보 조회 쿼리 - * + + /** + * 비행관제번호[CNTRL_ID]로 시뮬레이션 상세정보 조회하는 SQL 기능. + * @param cntrlId + * @return */ - public AnlsSmltDetailModel anlsSmltDetail(String cntrlId){ QCtrCntrlBas bas = QCtrCntrlBas.ctrCntrlBas; QComArcrftBas air = QComArcrftBas.comArcrftBas; QComIdntfBas idntf = QComIdntfBas.comIdntfBas; + /** + * 비행관제번호[CNTRL_ID]로 시뮬레이션 상세정보 조회하는 SQL 입니다. + * + * SELECT + * CCB.CNTRL_ID , + * CCB.IDNTF_NUM , + * CCB.FLGHT_ST_DT , + * CCB.FLGHT_END_DT , + * CCB.CNTRL_ST_DT , + * CCB.CNTRL_END_DT , + * CCB.TTL_TIME , + * CCB.TTL_TIME_TYPE , + * CCB.TTL_DSTNC , + * CCB.TTL_DSTNC_TYPE , + * CCB.AVRG_SPEED , + * CCB.AVRG_SPEED_TYPE , + * CCB.BTTR_CNSMPTN , + * CAB.ARCRFT_TYPE_CD , + * CAB.PRDCT_NUM , + * CAB.ARCRFT_MODEL_NM , + * CAB.IMAGE_URL + * FROM CTR_CNTRL_BAS CCB + * LEFT OUTER JOIN COM_IDNTF_BAS CIB + * ON CCB.IDNTF_NUM = CIB.IDNTF_NUM + * LEFT OUTER JOIN COM_ARCRFT_BAS CAB + * ON CIB.ARCRFT_SNO = CAB.ARCRFT_SNO + * AND CAB.USE_YN = 'Y' + * WHERE CCB.CNTRL_ID = #{cntrlId} + */ AnlsSmltDetailModel result = query.select(Projections.bean(AnlsSmltDetailModel.class , bas.cntrlId , bas.idntfNum , @@ -1623,10 +1761,9 @@ public List listCntrlHstry(String id){ } - /*** - * 시뮬레이션 통계 + /** + * 비행관제 ID[CNTRL_ID]로 시뮬레이션 통계내는 SQL 기능. */ - public List anlsSmltStcs(String cntrlId){ QCtrCntrlHstry hstry = QCtrCntrlHstry.ctrCntrlHstry; @@ -1643,6 +1780,22 @@ public List listCntrlHstry(String id){ , ConstantImpl.create("%H:%i")); + /** + * 비행관제 ID[CNTRL_ID]로 통계를 내는 SQL입니다. + * SELECT + * DATE_FORMAT(CCH.SRVR_RCV_DT, '%H:%i') AS 'timecd', + * DATE_FORMAT(CCH.SRVR_RCV_DT, '%Y-%m-%d') AS 'dateCd', + * AVG(CCH.SPEED) AS 'avrgSpeed', + * MAX(CCH.SPEED_TYPE) AS 'speedType', + * AVG(CCH.ELEV) AS 'avrgElev', + * MAX(CCH.ELEV_TYPE) AS 'elevType', + * AVG(CCH.MV_DSTNC) AS 'avrgMvDstnc' , + * MAX(CCH.MV_DSTNC_TYPE) AS 'mvDstncType', + * MAX(CCH.BTTR_LVL) AS 'maxBttrLvl', + * MIN(CCH.BTTR_LVL) AS 'minBttrLvl' + * FROM CTR_CNTRL_HSTRY CCH + * WHERE CCH.CNTRL_ID = #{cntrlId} + */ List result = query.select(Projections.bean(AnlsSmltStcsModel.class , formattedTime.as("timeCd"), formattedDate.as("dateCd"),