diff --git a/pav-server/src/main/java/com/palnet/biz/api/anls/hstry/controller/AnlsHstryController.java b/pav-server/src/main/java/com/palnet/biz/api/anls/hstry/controller/AnlsHstryController.java index ab2edf8a..c3ac27b8 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/anls/hstry/controller/AnlsHstryController.java +++ b/pav-server/src/main/java/com/palnet/biz/api/anls/hstry/controller/AnlsHstryController.java @@ -33,6 +33,12 @@ public class AnlsHstryController { private final AnlsHstryService service; + /** + * 비행현황 목록 리스트 조회하는 기능, + * AnlsHstryGroupModel에 따른 리스트를 조회함. + * @param rq + * @return + */ @GetMapping(value = "/list") @ApiOperation(value = "비행 현황 목록 출력") @Tag(name = "비행 이력 현황", description = "비행 이력 현황 관련 API") @@ -40,16 +46,24 @@ public class AnlsHstryController { List rs = null; ComnPagingRs response; - //입력값 검증 + // 검색 시작일 날짜[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 { - response = service.list(rq); + response = 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")); @@ -59,6 +73,12 @@ public class AnlsHstryController { } + /** + * 비행현황의 상세정보를 조회함, + * 비행ID[CNTRL_ID]로 조회함 + * @param id + * @return + */ @GetMapping(value = "/detail/{id}") @ApiOperation(value = "비행 현황 상세") @Tag(name = "비행 이력 현황", description = "비행 이력 현황 관련 API") @@ -67,9 +87,16 @@ public class AnlsHstryController { AnlsHstryModel 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")); @@ -80,16 +107,29 @@ public class AnlsHstryController { } + /** + * 비행이력을 조회함, + * 비행ID[CNTRL_ID]로 조회함 + * @param id + * @return + */ @GetMapping(value = "/log/{id}") @ApiOperation(value = "비행 이력 데이터") @Tag(name = "비행 이력 현황", description = "비행 이력 현황 관련 API") @ApiImplicitParam(name = "id",value = "관제ID", dataTypeClass = String.class) public ResponseEntity log(@PathVariable String id) { List result = null; + try { - result = service.hstryList(id); - + result = service.hstryList(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/hstry/service/AnlsHstryService.java b/pav-server/src/main/java/com/palnet/biz/api/anls/hstry/service/AnlsHstryService.java index e8441835..75159b10 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/anls/hstry/service/AnlsHstryService.java +++ b/pav-server/src/main/java/com/palnet/biz/api/anls/hstry/service/AnlsHstryService.java @@ -67,18 +67,27 @@ public class AnlsHstryService { @Autowired private JwtTokenUtil jwtTokenUtil; - //비행이력현황 list + /** + * 비행현황 목록 조회하는 기능. + * @param rq + * @return + */ public ComnPagingRs list(AnlsHstryGroupModel rq){ + + // 조회에 필요한 기본값 선언 Integer cstmrSno = jwtTokenUtil.getCstmrSnoByToken(); List groupAuthList = jwtTokenUtil.getGroupAuthByToken(); List adminAuth = new ArrayList<>(); String groupAuth = null; String appAuth = jwtTokenUtil.getUserAuthByToken(); + + // 페이징 처리를 위한 객체 선언 PageImplresultList; ComnPagingRs response = new ComnPagingRs<>(); Pageable pageable = PageRequest.of(rq.getPage()-1, rq.getRecord()); + // 유저의 권한은 확인함 if("USER".equals(appAuth) || "ROLE_USER".equals(appAuth)) { for(JwtGroupModel list : groupAuthList) { if(list.getGroupId().equals(rq.getGroupId())) { @@ -86,23 +95,30 @@ public class AnlsHstryService { } } } + + // 그룹에서의 권한이 NORMAL인 경우 if("NORMAL".equals(groupAuth)) { + for (JwtGroupModel list : groupAuthList) { if("MASTER".equals(list.getGroupAuthCd()) || "LEADER".equals(list.getGroupAuthCd())) { adminAuth.add(list); } } - List idntfList = comIdntBasRepository.findIdntfNumber(cstmrSno); - List basResult = fltPlanBasRepository.findByPlanSno(cstmrSno); - List pilotList = fltPlanPilotRepository.findByPlanSno(cstmrSno); + + List idntfList = comIdntBasRepository.findIdntfNumber(cstmrSno); // 회원 고유번호와 맞는 기체 고유번호 조회 + List basResult = fltPlanBasRepository.findByPlanSno(cstmrSno); // 회원 고유번호와 맞는 비행계획서 조회 + List pilotList = fltPlanPilotRepository.findByPlanSno(cstmrSno); // 회원 고유번호와 맞는 조종사 조회 List pilotResult = new ArrayList<>(); - + for(FltPlanPilot list : pilotList) { - pilotResult = fltPlanBasRepository.findBasList(list.getPlanSno()); + pilotResult = fltPlanBasRepository.findBasList(list.getPlanSno()); // 조종사번호와 맞는 비행계획서 조회 } + + // 위 조건들에 부합하는 데이터를 조회함 resultList = query.cntrlBasNormalHstryList(rq, pageable, idntfList, basResult, pilotResult); - + + // 위 조건들에 부합하여 조회한 데이터의 갯수를 조회함 long total = query.cntrlBasNormalHstryCount(rq, idntfList, basResult, pilotResult); long totalPage = total % rq.getRecord() > 0 ? total/rq.getRecord() + 1 : total/rq.getRecord(); @@ -125,19 +141,27 @@ public class AnlsHstryService { return response; } - + + /** + * 비행ID[CNTRL_ID]로 비행 상세정보를 조회하는 기능. + * @param cntrlId + * @return + * @throws Exception + */ public AnlsHstryModel detail(String cntrlId) throws Exception{ AnlsHstryModel model = new AnlsHstryModel(); - Optional optional = ctrCntrlBasRepository.findById(cntrlId); + Optional optional = ctrCntrlBasRepository.findById(cntrlId); // if (!optional.isPresent()) { + // 데이터베이스에 조회하려는 데이터가 없을시 서버에서 파라미터가 없다는 "의도적인" 에러 반환 throw new CustomException(ErrorCode.DATA_NOTFIND); } CtrCntrlBas entity = optional.get(); - + + // Entity에 담겨있는 값을 반환 model로 복제함 BeanUtils.copyProperties(entity , model); @@ -145,6 +169,11 @@ public class AnlsHstryService { } + /** + * 비행이력을 비행ID[CNTRL_ID] 조회하는 기능. + * @param id + * @return + */ public List hstryList(@PathVariable String id) { List result = query.listCntrlHstryPage(id); 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 a0625e8b..16d0b920 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 @@ -259,6 +259,17 @@ public class CtrCntrlQueryRepository{ return result; } + + /** + * 조건들에 부합하는 비행 현황 목록을 조회하는 SQL 기능. + * @param rq AnlsHstryGroupModel 객체로 조회 조건을 전달 + * @param pageable 페이징 정보 + * @param idntfList 기체 식별 기본 정보 리스트 + * @param basResult 비행 계획 기본 정보 리스트 + * @param pilotResult 파일럿 비행 계획 기본 정보 리스트 + * @return 페이징된 AnlsHstryModel 목록 + * @return + */ public PageImpl cntrlBasNormalHstryList(AnlsHstryGroupModel rq, Pageable pageable, List idntfList, @@ -279,34 +290,98 @@ public class CtrCntrlQueryRepository{ end.setTime(Date.from(DateUtils.stringToDate(rq.getEndDate()))); end.add(Calendar.DATE, 1); Date endDate = end.getTime(); - + + /** + * 조건1. 그룹아이디가 맞는지, + * 조건2. 검색시작일 이후 + * 조건3. 검색끝일 전 + * 조건4. status가 99[비행중]인지 + * 조건5. 승인이 된건인지 + */ builder.and(qFltPlanCtrCntrlRelEntity.groupId.eq(rq.getGroupId())); builder.and(qCntrlBasEntity.cntrlStDt.after(DateUtils.stringToDate(rq.getStDate()))); builder.and(qCntrlBasEntity.cntrlEndDt.before(endDate.toInstant())); builder.and(qCntrlBasEntity.statusCd.eq("99")); builder.and(qFltPlanBasEntity.aprvlYn.eq("Y")); + // 회원 고유번호와 맞는 기체고유번호 조건추가 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, @@ -335,17 +410,15 @@ public class CtrCntrlQueryRepository{ qCntrlHstryAreaEntity.landNm, qCntrlHstryAreaEntity.landNum, qCntrlHstryAreaEntity.zipCd - - )) .from(qCntrlBasEntity) .leftJoin(qCntrlHstryAreaEntity) - .on(qCntrlBasEntity.cntrlId.eq(qCntrlHstryAreaEntity.cntrlId)) - .on(qCntrlHstryAreaEntity.actnType.eq("01")) + .on(qCntrlBasEntity.cntrlId.eq(qCntrlHstryAreaEntity.cntrlId)) + .on(qCntrlHstryAreaEntity.actnType.eq("01")) .leftJoin(qFltPlanCtrCntrlRelEntity) - .on(qCntrlBasEntity.cntrlId.eq(qFltPlanCtrCntrlRelEntity.cntrlId)) + .on(qCntrlBasEntity.cntrlId.eq(qFltPlanCtrCntrlRelEntity.cntrlId)) .leftJoin(qFltPlanBasEntity) - .on(qFltPlanCtrCntrlRelEntity.planSno.eq(qFltPlanBasEntity.planSno)) + .on(qFltPlanCtrCntrlRelEntity.planSno.eq(qFltPlanBasEntity.planSno)) .where((builder) .and( (idntfBuilder) @@ -387,6 +460,7 @@ public class CtrCntrlQueryRepository{ return new PageImpl<>(result, pageable, result.size()); } + public PageImpl cntrlBasNormalSmltList(AnlsHstryRqModel rq, Pageable pageable, List adminAuth, @@ -522,6 +596,7 @@ public class CtrCntrlQueryRepository{ return new PageImpl<>(result, pageable, result.size()); } + public List cntrlBasNormalList(AnlsHstryRqModel rq, String idntfNum){ QCtrCntrlBas qCntrlBasEntity = QCtrCntrlBas.ctrCntrlBas; @@ -614,6 +689,14 @@ public class CtrCntrlQueryRepository{ return result; } + /** + * 조건들에 부합하는 비행 현황 목록 데이터의 갯수를 조회하는 SQL 기능. + * @param rq + * @param idntfList + * @param basResult + * @param pilotResult + * @return + */ public long cntrlBasNormalHstryCount(AnlsHstryGroupModel rq, List idntfList, List basResult, @@ -634,34 +717,70 @@ public class CtrCntrlQueryRepository{ end.add(Calendar.DATE, 1); Date endDate = end.getTime(); + /** + * 조건1. 그룹아이디가 맞는지, + * 조건2. 검색시작일 이후 + * 조건3. 검색끝일 전 + * 조건4. status가 99[비행중]인지 + * 조건5. 승인이 된건인지 + */ builder.and(qFltPlanCtrCntrlRelEntity.groupId.eq(rq.getGroupId())); 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")); + // 회원 고유번호와 맞는 기체고유번호 조건추가 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() + "%")); } - + /** + * 위 조건들과 부합한 데이터베이스 내용의 갯수를 조회하는 SQL입니다. + * SELECT + * 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 = '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연산을 붙혀 조건이 늘어남 + * ) + */ long result = query.select(Projections.bean(AnlsHstryModel.class , qCntrlBasEntity.cntrlId, qCntrlBasEntity.idntfNum, @@ -1031,7 +1150,7 @@ public class CtrCntrlQueryRepository{ } /** - * 비행 이력 데이터 조회 + * 비행 이력 데이터 조회하는 SQL. * @param id * @return */ @@ -1043,6 +1162,33 @@ public class CtrCntrlQueryRepository{ BooleanBuilder builder = new BooleanBuilder(); builder.and(qCtrCntrHstry.cntrlId.eq(id)); + /** + * 비행번호[CNTRL_ID] 로 이력현황을 조회하는 SQL입니다. + * 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} + */ List result = query.select(Projections.bean(AnlsHstryDetailModel.class , qCtrCntrHstry.cntrlId , qCtrCntrHstry.hstrySno ,