diff --git a/document/dron_test/pav-utils.js b/document/dron_test/pav-utils.js index 0e858c24..8112bef8 100644 --- a/document/dron_test/pav-utils.js +++ b/document/dron_test/pav-utils.js @@ -74,9 +74,10 @@ function calculateHeading(x1, y1, x2, y2) { var dx = x2 - x1; var dy = y2 - y1; var heading = (Math.atan2(dy, dx) * 180) / Math.PI; - if (heading < 0) { - heading += 360; - } + + // Ensure heading is within the range [0, 360) + heading = (heading + 360) % 360; + return heading; } @@ -91,9 +92,9 @@ const dumyData = { lon: 126.6146, elevType: 'M', elev: 125.4, - speedType: 'KM', - speed: 145.8, - heading: 227.94, + speedType: 'm/s', + speed: 40.5, + heading: 0, terminalRcvDt: '20210629173145', betteryLevel: 91, betteryVoltage: 50, diff --git a/document/dron_test/pav-warning.js b/document/dron_test/pav-warning.js index 70b422bc..cb76da75 100644 --- a/document/dron_test/pav-warning.js +++ b/document/dron_test/pav-warning.js @@ -10,11 +10,11 @@ const port = 8082; const prefix = 'PALUTM-'; const pathSampleCoord = [ - [37.523771, 126.720982], - [37.524841, 126.723106], - [37.524337, 126.72333], - [37.524841, 126.723106], - [37.523771, 126.720982] + [37.571954, 126.775258], + [37.566375, 126.781266], + [37.562361, 126.783584], + [37.558143, 126.785987], + [37.553039, 126.788819] ]; // const pathSampleCoord = [ // [42.5515, 126.655], @@ -48,7 +48,7 @@ const getCoords = coords => { }; const getClient = () => { - const dronName = prefix + '010'; + const dronName = prefix + '095'; const client = {}; client.dronName = dronName; diff --git a/pav-server/build.gradle b/pav-server/build.gradle index 92faf42e..d7ca5fbc 100644 --- a/pav-server/build.gradle +++ b/pav-server/build.gradle @@ -46,6 +46,9 @@ dependencies { developmentOnly 'org.springframework.boot:spring-boot-devtools' implementation 'org.springframework.boot:spring-boot-starter-webflux' +// implementation 'io.springfox:springfox-boot-starter:3.0.0' + implementation 'org.springdoc:springdoc-openapi-ui:1.6.15' + // thymeleaf implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' @@ -86,7 +89,6 @@ dependencies { implementation 'org.apache.commons:commons-io:1.3.2' implementation 'commons-httpclient:commons-httpclient:3.1' implementation 'com.googlecode.json-simple:json-simple:1.1.1' - implementation 'io.springfox:springfox-boot-starter:3.0.0' implementation 'org.json:json:20220320' implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jsr353:2.15.2' @@ -101,7 +103,9 @@ dependencies { implementation 'org.geotools:gt-geotiff:29.2' implementation 'org.geotools:gt-epsg-hsql:29.2' - + // QR Code + implementation 'com.google.zxing:core:3.5.2' + implementation 'com.google.zxing:javase:3.5.2' testCompileOnly 'org.projectlombok:lombok:1.18.28' testAnnotationProcessor 'org.projectlombok:lombok:1.18.28' diff --git a/pav-server/src/main/java/com/palnet/biz/api/acnt/crtfyhp/controller/AcntCrtfyhpController.java b/pav-server/src/main/java/com/palnet/biz/api/acnt/crtfyhp/controller/AcntCrtfyhpController.java index 357a796c..0a1509d8 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/acnt/crtfyhp/controller/AcntCrtfyhpController.java +++ b/pav-server/src/main/java/com/palnet/biz/api/acnt/crtfyhp/controller/AcntCrtfyhpController.java @@ -3,22 +3,13 @@ package com.palnet.biz.api.acnt.crtfyhp.controller; import java.util.HashMap; import java.util.Map; -import io.swagger.annotations.ApiImplicitParam; -import io.swagger.annotations.ApiImplicitParams; -import io.swagger.annotations.ApiOperation; -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.Parameters; -import io.swagger.v3.oas.annotations.tags.Tag; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import com.palnet.biz.api.acnt.crtfyhp.model.AcntCrtfyhpRsModel; import com.palnet.biz.api.acnt.crtfyhp.service.AcntCrtfyhpService; import com.palnet.biz.api.comn.response.BasicResponse; import com.palnet.biz.api.comn.response.ErrorResponse; @@ -27,88 +18,106 @@ import com.palnet.biz.jpa.repository.pty.PtyCstmrQueryRepository; import com.palnet.comn.code.RSErrorCode; import com.palnet.comn.utils.EncryptUtils; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.enums.ParameterIn; +import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; -@Log4j2 +@Slf4j @RestController @RequiredArgsConstructor @RequestMapping(value = "/api/acnt/crtfyhp", produces = {MediaType.APPLICATION_JSON_VALUE}) @Tag(name = "휴대폰 인증 관리", description = "회원 휴대폰 인증 관련 API") public class AcntCrtfyhpController { - @Autowired private final AcntCrtfyhpService service; + private final PtyCstmrQueryRepository ptyCstmrQueryRepository; - @Autowired - private PtyCstmrQueryRepository ptyCstmrQueryRepository; - - + /** + * 인증번호를 발송하는 기능, + * hpno 값은 휴대폰번호입니다. 이 번호에 인증번호를 발송합니다. + * @param hpno + * @return + */ @GetMapping(value = "/register/send") - @Tag(name = "휴대폰 인증 관리", description = "회원 휴대폰 인증 관련 API") - @ApiImplicitParam(name = "hnpo",value = "휴대폰번호", dataTypeClass = String.class) - public ResponseEntity send(String hpno) { + @Operation(summary = "휴대폰 인증번호 전송", description = "입력한 휴대폰번호로 회원정보에 동일한 휴대폰 번호가 있는지 확인하고, 없다면 인증번호를 전송하는 API 입니다.") + public ResponseEntity send(@Parameter(name="hpno", description = "회원 핸드폰번호", in = ParameterIn.QUERY, example = "01012345678") String hpno) { - Map resultMap = new HashMap(); + Map resultMap = new HashMap(); // 결과 반환을 위한 객체선언 try { - if(hpno == null) { - return ResponseEntity.status(HttpStatus.OK) + if(hpno == null) { // hpno[휴대폰번호] 가 없을시 서버에서 파라미터가 없다는 "의도적인" 에러 반환 + return ResponseEntity.status(HttpStatus.OK) // "의도적인" 에러 반환코드 .body(new ErrorResponse(RSErrorCode.ER_PARAM)); } //회원정보에 동일한 휴대폰 번호가 있는지 확인 , 암호화 해서 검색 String encHpno = EncryptUtils.encrypt(hpno); + // 휴대폰 번호가 종복이면 isHpno가 True boolean isHpno = ptyCstmrQueryRepository.findCstmrByHpno(encHpno); - - if(isHpno) { - resultMap.put("result" , false); + + if(isHpno) { // 휴대폰 번호 중복인 경우 + resultMap.put("result" , false); // 성공하지 못함을 의미 resultMap.put("code" , -1); // 동일한 휴대폰 번호 존재 - - - }else { - boolean result = service.registerSend(hpno); - resultMap.put("result" , result); + }else { // 휴대폰 번호 중복이 아닌경우 + boolean result = service.registerSend(hpno); // 해당 휴대폰번호로 문자 메세지 발송 + resultMap.put("result" , result); // 메세지 발송이 성공일 경우 true } } 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")); } + // 문제없을 시 결과값을 최종적으로 리턴해줌 return ResponseEntity.ok().body(new SuccessResponse(resultMap)); } + /** + * 인증메세지를 받은 사용자가 인증번호를 입력하여 인증처리하는 기능입니다. + * @param hpno + * @param crtfyNo + * @return + */ @GetMapping(value = "/register/confirm") - @Tag(name = "휴대폰 인증 관리", description = "회원 휴대폰 인증 관련 API") - @ApiImplicitParams({ - @ApiImplicitParam(name = "hpno",value = "휴대폰번호", dataTypeClass = String.class), - @ApiImplicitParam(name = "crtfyNo",value = "인증일련번호", dataTypeClass = String.class) - }) - public ResponseEntity confirm(String hpno , String crtfyNo) { + @Operation(summary = "휴대폰 인증번호 검증", description = "입력한 핸드폰번호로 받은 인증번호를 입력해 검증하는 API 입니다.") + public ResponseEntity confirm(@Parameter(name="hpno", description = "회원 핸드폰번호", in = ParameterIn.QUERY, example = "01012345678") String hpno , + @Parameter(name="crtfyNo", description = "회원 핸드폰번호", in = ParameterIn.QUERY, example = "123456") String crtfyNo) { - Map resultMap = new HashMap(); + Map resultMap = new HashMap(); // 결과 반환을 위한 객체선언 - if(hpno == null || crtfyNo == null) { - return ResponseEntity.status(HttpStatus.OK) + if(hpno == null || crtfyNo == null) { // hpno[휴대폰번호], crtfyNo[인증번호] 값이 없을 시 서버에서 파라미터가 없다는 "의도적인" 에러 반환 + return ResponseEntity.status(HttpStatus.OK)// "의도적인" 에러 반환코드 .body(new ErrorResponse(RSErrorCode.ER_PARAM)); } - - try { - - boolean result = service.registerConfirm(hpno, crtfyNo); - resultMap.put("result" , result); - - - + try { + + boolean result = service.registerConfirm(hpno, crtfyNo); // 휴대폰번호로 전송된 인증번호가 맞는지 확인하는 코드 + resultMap.put("result" , result); // 인증성공하면 true } 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")); @@ -118,24 +127,25 @@ public class AcntCrtfyhpController { } - //아이디 찾기 시 인증번호 발송 로직 + /** + * 아이디 찾기 시 인증번호 발송 로직 + * @param memberName + * @param hpno + * @return + */ @GetMapping(value = "/find/sendForId") - @ApiOperation(value = "아이디 찾기 시 인증번호 발송") - @Tag(name = "휴대폰 인증 관리", description = "회원 휴대폰 인증 관련 API") - @ApiImplicitParams({ - @ApiImplicitParam(name = "memberName", value = "회원 이름", dataTypeClass = String.class), - @ApiImplicitParam(name = "hpno", value = "휴대폰 번호", dataTypeClass = String.class) - }) - public ResponseEntity sendForId(String memberName, String hpno) { - Map resultMap = new HashMap(); + @Operation(summary = "ID 찾기 시 사용되는 인증번호 발송 로직", description = "ID찾기 시 입력한 핸드폰번호로 인증번호를 발송하는 API 입니다.") + public ResponseEntity sendForId(@Parameter(name="memberName", description = "회원 이름", in = ParameterIn.QUERY, example = "팔네트웍스") String memberName, + @Parameter(name="hpno", description = "회원 핸드폰번호", in = ParameterIn.QUERY, example = "01012345678") String hpno) { + Map resultMap = new HashMap(); // 결과 반환을 위한 객체선언 - if(memberName == null || hpno == null) { - return ResponseEntity.status(HttpStatus.OK) + if(memberName == null || hpno == null) { // hpno[휴대폰번호]와 memberName[회원이름]이 없을시 서버에서 파라미터가 없다는 "의도적인" 에러 반환 + return ResponseEntity.status(HttpStatus.OK) // "의도적인" 에러 반환코드 .body(new ErrorResponse(RSErrorCode.ER_PARAM)); } try { - boolean result = service.certifNum(memberName, hpno); + boolean result = service.certifNum(memberName, hpno); // resultMap.put("result" , result); if(!result) { resultMap.put("code", -1); //일치하는 회원 없음 @@ -143,6 +153,13 @@ public class AcntCrtfyhpController { resultMap.put("code", 0); //일치하는 회원 존재 } } 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")); @@ -150,19 +167,20 @@ public class AcntCrtfyhpController { return ResponseEntity.ok().body(new SuccessResponse(resultMap)); } - //아이디 찾기 + /** + * 아이디 찾기 + * @param memberName + * @param hpno + * @return + */ @GetMapping(value = "/find/findUserId") - @ApiOperation(value = "회원 아이디 찾기") - @Tag(name = "휴대폰 인증 관리", description = "회원 휴대폰 인증 관련 API") - @ApiImplicitParams({ - @ApiImplicitParam(name = "memberName",value = "회원이름", dataTypeClass = String.class), - @ApiImplicitParam(name = "hpno",value = "휴대폰번호", dataTypeClass = String.class) - }) - public ResponseEntity findUserId(String memberName, String hpno) { - Map resultMap = new HashMap(); + @Operation(summary = "ID 찾기", description = "멤버의 이름과 핸드폰번호를 입력받아 회원가입 당시에 입력한 ID를 찾아주는 API 입니다.") + public ResponseEntity findUserId(@Parameter(name="memberName", description = "회원 이름", in = ParameterIn.QUERY, example = "팔네트웍스") String memberName, + @Parameter(name="hpno", description = "회원 핸드폰번호", in = ParameterIn.QUERY, example = "01012345678") String hpno) { + Map resultMap = new HashMap(); // 결과 반환을 위한 객체선언 - if(memberName == null || hpno == null) { - return ResponseEntity.status(HttpStatus.OK) + if(memberName == null || hpno == null) { // hpno[휴대폰번호]와 memberName[회원이름]이 없을시 서버에서 파라미터가 없다는 "의도적인" 에러 반환 + return ResponseEntity.status(HttpStatus.OK) // "의도적인" 에러 반환코드 .body(new ErrorResponse(RSErrorCode.ER_PARAM)); } @@ -184,24 +202,25 @@ public class AcntCrtfyhpController { return ResponseEntity.ok().body( new SuccessResponse(resultMap)); } - //비밀번호 찾기 시 인증번호 발송 로직 + /** + * 비밀번호 찾기 시 인증번호 발송 로직 + * @param userId + * @param hpno + * @return + */ @GetMapping(value = "/find/sendForPw") - @ApiOperation(value = "비밀번호 찾기 시 인증번호 발송") - @Tag(name = "휴대폰 인증 관리", description = "회원 휴대폰 인증 관련 API") - @ApiImplicitParams({ - @ApiImplicitParam(name = "userId",value = "사용자ID", dataTypeClass = String.class), - @ApiImplicitParam(name = "hpno",value = "휴대폰번호", dataTypeClass = String.class) - }) - public ResponseEntity sendForPw(String userId, String hpno) { + @Operation(summary = "비밀번호 찾기 시 인증번호 발송", description = "비밀번호 찾기 시도 시 멤버의 ID과 핸드폰번호를 입력받아 인증번호를 발송하는 API 입니다.") + public ResponseEntity sendForPw(@Parameter(name="userId", description = "회원 아이디", in = ParameterIn.QUERY, example = "palnet") String userId, + @Parameter(name="hpno", description = "회원 핸드폰번호", in = ParameterIn.QUERY, example = "01012345678") String hpno) { Map resultMap = new HashMap(); - if(userId == null || hpno == null) { - return ResponseEntity.status(HttpStatus.OK) + if(userId == null || hpno == null) { // userId[회원아이디]와 memberName[회원이름]이 없을시 서버에서 파라미터가 없다는 "의도적인" 에러 반환 + return ResponseEntity.status(HttpStatus.OK) // "의도적인" 에러 반환코드 .body(new ErrorResponse(RSErrorCode.ER_PARAM)); } try { - boolean result = service.certifPw(userId, hpno); + boolean result = service.certifPw(userId, hpno); // 회원 ID와 휴대폰번호로 인증메세지 보내는 기능 resultMap.put("result", result); if(!result) { resultMap.put("code", -1); //일치하는 회원 없음 @@ -209,6 +228,13 @@ public class AcntCrtfyhpController { resultMap.put("code", 0); //일치하는 회원 존재 } } 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")); @@ -217,25 +243,28 @@ public class AcntCrtfyhpController { return ResponseEntity.ok().body( new SuccessResponse(resultMap)); } - + /** + * 비밀번호 찾기 및 업데이트 + * @param userId + * @param hpno + * @param newPw + * @return + * @throws Exception + */ @GetMapping(value = "/find/updatePw") - @ApiOperation(value = "비밀번호 찾기 및 업데이트") - @Tag(name = "휴대폰 인증 관리", description = "회원 휴대폰 인증 관련 API") - @ApiImplicitParams({ - @ApiImplicitParam(name = "userID",value = "사용자ID", dataTypeClass = String.class), - @ApiImplicitParam(name = "hpno",value = "휴대폰번호", dataTypeClass = String.class), - @ApiImplicitParam(name = "newPw",value = "새로운 비밀번호", dataTypeClass = String.class) - }) - public ResponseEntity updatePw(String userId, String hpno, String newPw) throws Exception { + @Operation(summary = "새로운 비밀번호로 업데이트", description = "비밀번호 찾기 -> 인증번호 검증이 성공했을 경우, userId와 hpno가 일치하는 회원정보를 새로운 비밀번호로 업데이트 하는 API 입니다.") + public ResponseEntity updatePw(@Parameter(name="userId", description = "회원 아이디", in = ParameterIn.QUERY, example = "palnet") String userId, + @Parameter(name="hpno", description = "회원 핸드폰번호", in = ParameterIn.QUERY, example = "01012345678") String hpno, + @Parameter(name="hpno", description = "회원 핸드폰번호", in = ParameterIn.QUERY, example = "newPassword1234") String newPw) throws Exception { Map resultMap = new HashMap(); - if(hpno == null || newPw == null) { - return ResponseEntity.status(HttpStatus.OK) + if(hpno == null || newPw == null) { // hpno[휴대폰번호]와 newPw[새로운 비밀번호]가 없을시 서버에서 파라미터가 없다는 "의도적인" 에러 반환 + return ResponseEntity.status(HttpStatus.OK) // "의도적인" 에러 반환코드 .body(new ErrorResponse(RSErrorCode.ER_PARAM)); } - try { - boolean result = service.updatePw(userId, hpno, newPw); + try { + boolean result = service.updatePw(userId, hpno, newPw); // 사용자가 입력한 새로운 암호로 업데이트 resultMap.put("result", result); if(!result) { resultMap.put("code", -1); @@ -243,6 +272,13 @@ public class AcntCrtfyhpController { resultMap.put("code", 0); } } 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/acnt/crtfyhp/service/AcntCrtfyhpService.java b/pav-server/src/main/java/com/palnet/biz/api/acnt/crtfyhp/service/AcntCrtfyhpService.java index 4eab49b9..79d77b5d 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/acnt/crtfyhp/service/AcntCrtfyhpService.java +++ b/pav-server/src/main/java/com/palnet/biz/api/acnt/crtfyhp/service/AcntCrtfyhpService.java @@ -19,6 +19,7 @@ import com.palnet.biz.jpa.repository.pty.PtyCstmrBasRepository; import com.palnet.biz.jpa.repository.pty.PtyCstmrQueryRepository; import com.palnet.biz.jpa.repository.pty.SuredataRepository; import com.palnet.comn.utils.EncryptUtils; +import com.palnet.comn.utils.InstantUtils; @Service public class AcntCrtfyhpService { @@ -105,9 +106,16 @@ public class AcntCrtfyhpService { // // return true; // } + + /** + * hpno에 있는 번호로 인증번호 메세지 발송하는 기능 + * @param hpno + * @return + * @throws Exception + */ public boolean registerSend(String hpno) throws Exception{ - //인증번호 만들기 ( 6자리) + //인증번호 만들기 (6자리) String certifyNo = numberGen(6, 2); //메시지 만들기 @@ -125,13 +133,25 @@ public class AcntCrtfyhpService { ptyEntity.setCrtfyhpYn("N"); ptyCrtfyhpBasRepository.save(ptyEntity); - logger.info("certifyNo :: " + certifyNo); + logger.info("certifyNo :: {}", certifyNo); // 로그로 인증번호 값을 찍어줌 + // 현재시간 값을 구해옴 예시 => nowStr = "20231206135600" + String nowStr = InstantUtils.toDatetimeStringByFormat(Instant.now(), "yyyyMMddHHmmss"); //발송 테이블 입력 SuredataEntity entity = new SuredataEntity(); + entity.setIntime(nowStr); entity.setCallphone(hpno); entity.setMsg(msg); + + + /** + * Message 기본값들 applcation-local[dev,prod등].properties 파일에서 확인할 수 있음 + * local,dev,prod는 서버가 돌아가는 환경 옵션입니다. + * local - 개발자 개인 컴퓨터 환경 + * dev - 상용서버 배포전 테스트할 서버 환경[테스트서버] + * prod - 상용화 환경 + */ entity.setSubject(SUBJECT_CETIFY); entity.setCallname(CALLNAME_CERTIFY); entity.setUsercode(USER_CODE); @@ -143,9 +163,11 @@ public class AcntCrtfyhpService { entity.setKind(KIND); - SuredataEntity result = sureDataRepository.save(entity); - - if(result == null) { + SuredataEntity result = sureDataRepository.save(entity); // 데이터 베이스에 저장[Data Insert] + + // Save했을시 성공하지 못하면 result는 null됨 + // 그래서 null경우 성공하지 못한다고 판단 + if(result == null) { return false; } @@ -153,14 +175,33 @@ public class AcntCrtfyhpService { } + /** + * 휴대폰 번호에 전송된 인증번호가 맞는지 확인하는 기능 + * @param hpno + * @param crtfyNo + * @return + * @throws Exception + */ public boolean registerConfirm(String hpno , String crtfyNo ) throws Exception{ hpno = EncryptUtils.encrypt(hpno); //암호화 해서 검색 - List entity = query.confirmSms(hpno , crtfyNo); + List entity = query.confirmSms(hpno , crtfyNo); // 데이터 베이스에서 휴대폰 번호와 인증번호 맞는지 체크 - return entity.size() == 0 ? false : true; + /** + * entity.size() 값은 인증성공하면 1이상 인증이 실패하면 0입니다. + * 그래서, [0]이면 false [인증실패] + * [1]이면 true [인증성공] + */ + return entity.size() == 0 ? false : true; } - + + /** + * len의 크기만큼 난수 생성, + * dupCd가 [1]이면 [중복허용], [2]면 [중복불가] + * @param len + * @param dupCd + * @return + */ public static String numberGen(int len, int dupCd){ Random rand = new Random(); String numStr = ""; //난수가 저장될 변수 @@ -184,46 +225,78 @@ public class AcntCrtfyhpService { } return numStr; } - + + /** + * 휴대폰 번호와 회원이름으로 회원 휴대폰에 인증번호 발송하는 기능 + * @param memberName + * @param hpno + * @return + * @throws Exception + */ public boolean certifNum(String memberName, String hpno) throws Exception{ // String name = EncryptUtils.encrypt(memberName); String phone = EncryptUtils.encrypt(hpno); boolean certifNum = cstmrQuery.certifNum(memberName , phone); - if(certifNum) { - registerSend(hpno); + + if(certifNum) { // 회원정보가 있어 true면 인증문자 발송 + registerSend(hpno); // hpno번호에 있는 번호로 문자발송 } return certifNum; } + /** + * 휴대폰 번호와 회원 명으로 회원 ID 찾는 기능 + * @param memberName + * @param hpno + * @return + * @throws Exception + */ public String findUserId(String memberName, String hpno) throws Exception{ // String name = EncryptUtils.encrypt(memberName); - String phone = EncryptUtils.encrypt(hpno); - String resultFindId = cstmrQuery.findUserId(memberName,phone); + String phone = EncryptUtils.encrypt(hpno); // 번호 암호화 + String resultFindId = cstmrQuery.findUserId(memberName,phone); // 휴대폰번호[hpno]와 회원명[memberName]으로 ID찾기 return resultFindId; } - + + /** + * 회원 ID와 휴대폰번호로 인증메세지 보내는 기능 + * @param userId + * @param hpno + * @return + * @throws Exception + */ public boolean certifPw(String userId, String hpno) throws Exception{ - String phone = EncryptUtils.encrypt(hpno); + String phone = EncryptUtils.encrypt(hpno); // 번호 암호화 PtyCstmrBas certifNum = cstmrQuery.findUserPw(userId , phone); boolean result = false; - if(certifNum != null) { + + //certifNum이 값이 있을경우 메세지 전송, 값이 있다는것은 데이터베이스에 ID와 휴대폰번호[hpno]가 일치한다는 것 + if(certifNum != null) { registerSend(hpno); result = true; } return result; } + /** + * 사용자가 입력한 새로운 암호로 변경[수정]하는 기능 + * @param userId + * @param hpno + * @param newPw + * @return + * @throws Exception + */ public boolean updatePw(String userId, String hpno, String newPw) throws Exception{ - String phone = EncryptUtils.encrypt(hpno); - PtyCstmrBas certifNum = cstmrQuery.findUserPw(userId , phone); + String phone = EncryptUtils.encrypt(hpno); // 휴대폰번호 암호화 + PtyCstmrBas certifNum = cstmrQuery.findUserPw(userId , phone); // 회원 아이디와 휴대폰번호로 데이터베이스에서 조회 boolean result = false; - if(certifNum != null) { + if(certifNum != null) { //certifNum이 값이 있을경우 메세지 전송, 값이 있다는것은 데이터베이스에 ID와 휴대폰번호[hpno]가 일치한다는 것 String encryptPw = EncryptUtils.sha256Encrypt(newPw); certifNum.setUserPswd(encryptPw); certifNum.setPswdUpdtDt(Instant.now()); - ptyCstmrBasRepository.save(certifNum); + ptyCstmrBasRepository.save(certifNum); // 바뀐 암호로 변경[수정] 하는 코드 result = true; } return result; diff --git a/pav-server/src/main/java/com/palnet/biz/api/acnt/cstmr/controller/AcntCstmrController.java b/pav-server/src/main/java/com/palnet/biz/api/acnt/cstmr/controller/AcntCstmrController.java index d75a6529..43e08bef 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/acnt/cstmr/controller/AcntCstmrController.java +++ b/pav-server/src/main/java/com/palnet/biz/api/acnt/cstmr/controller/AcntCstmrController.java @@ -1,6 +1,26 @@ package com.palnet.biz.api.acnt.cstmr.controller; -import com.palnet.biz.api.acnt.cstmr.model.*; +import java.time.ZoneId; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.palnet.biz.api.acnt.cstmr.model.AcntCstmrEmModel; +import com.palnet.biz.api.acnt.cstmr.model.AcntCstmrPwModel; +import com.palnet.biz.api.acnt.cstmr.model.AcntCstmrRqModel; +import com.palnet.biz.api.acnt.cstmr.model.AcntCstmrRsModel; +import com.palnet.biz.api.acnt.cstmr.model.AnctCstmerRlModel; import com.palnet.biz.api.acnt.cstmr.service.AcntCstmrService; import com.palnet.biz.api.comn.response.BasicResponse; import com.palnet.biz.api.comn.response.ErrorResponse; @@ -8,22 +28,15 @@ import com.palnet.biz.api.comn.response.SuccessResponse; import com.palnet.biz.jpa.entity.PtyCstmrBas; import com.palnet.biz.jpa.entity.PtyCstmrDtl; import com.palnet.comn.exception.CustomException; -import io.swagger.annotations.ApiImplicitParam; -import io.swagger.annotations.ApiOperation; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.enums.ParameterIn; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; -import lombok.extern.log4j.Log4j2; -import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; - -import java.time.ZoneId; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import lombok.extern.slf4j.Slf4j; -@Log4j2 +@Slf4j @RestController @RequiredArgsConstructor @RequestMapping(value = "/api/acnt/cstmr", produces = {MediaType.APPLICATION_JSON_VALUE}) @@ -32,9 +45,13 @@ public class AcntCstmrController { private final AcntCstmrService service; + /** + * 회원가입 기능, AcntCstmrRqModel에 사용자가 입력한 회원 정보가 들어있음 + * @param rq + * @return + */ @PostMapping(value = "/register") - @ApiOperation(value = "회원 가입") - @Tag(name = "회원관리", description = "회원 관련 API") + @Operation(summary = "회원가입", description = "회원가입 API 입니다.") public ResponseEntity register(@RequestBody AcntCstmrRqModel rq) { AcntCstmrRsModel result; @@ -44,11 +61,18 @@ public class AcntCstmrController { // result = service.list(rq); log.debug(">>> bd : {}", rq.getBrthdyDate()); log.debug(">>> bd : {}", rq.getBrthdyDate().atZone(ZoneId.of("Asia/Seoul")).toLocalDateTime()); - log.debug(">>> td : {}", rq.getTestDt()); - log.debug(">>> td : {}", rq.getTestDt().atZone(ZoneId.of("Asia/Seoul")).toLocalDateTime()); - result = service.register(rq); + // log.debug(">>> td : {}", rq.getTestDt()); + // log.debug(">>> td : {}", rq.getTestDt().atZone(ZoneId.of("Asia/Seoul")).toLocalDateTime()); + result = service.register(rq); // 회원정보를 데이터베이스에 추가[INSERT]함. } 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")); @@ -57,18 +81,29 @@ public class AcntCstmrController { return ResponseEntity.ok().body(new SuccessResponse(result)); } + /** + * 회원 조회하는 기능, cstmrSno는 회원 고유번호 입니다. + * 고유번호로 회원의 정보를 조회합니다. + * @param cstmrSno + * @return + */ @GetMapping(value = "/profile/{cstmrSno}") - @ApiOperation(value = "회원 정보") - @Tag(name = "회원관리", description = "회원 관련 API") - @ApiImplicitParam(name = "cstmrSno",value = "고객일련번호", dataTypeClass = Integer.class) - public ResponseEntity mypage(@PathVariable Integer cstmrSno){ + @Operation(summary = "회원 정보 조회", description = "회원 고유 넘버로 회원 정보를 조회합니다. cstmrSno 예시 : 1, 2, 3 ....") + public ResponseEntity mypage(@Parameter(name="cstmrSno", description = "회원번호", in = ParameterIn.PATH, example = "3") @PathVariable Integer cstmrSno){ List result = null; try { - result = service.list(cstmrSno); + result = service.list(cstmrSno); // 회원고유번호[cstmrSno]로 회원정보를 조회 함. } catch (Exception e) { + /** + * try{ + ... + } + * try 영역 안 코드들중 문제가 생기면 오는 곳. + * log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌 + */ return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) .body(new ErrorResponse("Server Error", "-1")); @@ -78,22 +113,42 @@ public class AcntCstmrController { return ResponseEntity.ok().body(new SuccessResponse(result)); } + /** + * 회원 계정 암호 변경하는 기능, + * AcntCstmrPwModel애 회원이 입력한 기존암호, 변경할 암호값이 있습니다. + * @param rq + * @return + */ @PostMapping(value = "/profile/pswdupdate") - @ApiOperation(value = "회원 패스워드 변경") - @Tag(name = "회원관리", description = "회원 관련 API") + @Operation(summary = "회원 패스워드 변경", description = "회원의 비밀번호를 변경합니다.") public ResponseEntity passwordupdate(@RequestBody AcntCstmrPwModel rq){ Map resultMap = new HashMap(); try { - PtyCstmrBas result = service.updatepas(rq); + PtyCstmrBas result = service.updatepas(rq); // 입력받은 값으로 회원계정 암호변경. resultMap.put("result", result); } catch (CustomException e) { + /** + * try{ + ... + } + * try 영역 안 코드들중 문제가 생기면 오는 곳. + * CustomException은 개발자가 "의도적으로" 낸 예외처리, + * log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌 + */ log.error("IGNOE : {}", e); resultMap.put("result", false); resultMap.put("errorCode", e.getErrorCode()); resultMap.put("errorMessage", e.getMessage()); return ResponseEntity.ok().body(new SuccessResponse(resultMap)); } catch (Exception e) { + /** + * try{ + ... + } + * try 영역 안 코드들중 문제가 생기면 오는 곳. + * log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌 + */ log.error("IGONE : {}", e); return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(new ErrorResponse("Server Error", "-1")); } @@ -101,22 +156,42 @@ public class AcntCstmrController { return ResponseEntity.ok().body(new SuccessResponse<>(resultMap)); } + /** + * 회원 기존 패스워드 확인, + * userPswd 값에 있는 회원 암호가 맞는지 확인합니다. + * @param userPswdMap + * @return + */ @PostMapping(value = "/profile/pwcheck") - @ApiOperation(value = "회원 기존 패스워드 확인") - @Tag(name = "회원관리", description = "회원 관련 API") - public ResponseEntity extendpsw(@RequestBody Map userPswdMap){ + @Operation(summary = "기존 회원의 패스워드 확인", description = " jwt토큰에 등록된 유저정보와 패스워드가 일치하는지 확인합니다. 입력 예시 -> userPswd : test1234 ") + public ResponseEntity extendpsw(@Parameter(name="userPswd", description = "유저 비밀번호", in = ParameterIn.QUERY, example = "test1234") String userPswd){ Map resultMap = new HashMap(); try { - boolean result = service.extendpsw(userPswdMap.get("userPswd")); + boolean result = service.extendpsw(userPswd); // 기존 암호가 맞는지 확인하는 기능. resultMap.put("result", result); } catch (CustomException e) { + /** + * try{ + ... + } + * try 영역 안 코드들중 문제가 생기면 오는 곳. + * CustomException은 개발자가 "의도적으로" 낸 예외처리, + * log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌 + */ log.error("IGNOE : {}", e); resultMap.put("result", false); resultMap.put("errorCode", e.getErrorCode()); resultMap.put("errorMessage", e.getMessage()); return ResponseEntity.ok().body(new SuccessResponse(resultMap)); } catch (Exception e) { + /** + * try{ + ... + } + * try 영역 안 코드들중 문제가 생기면 오는 곳. + * log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌 + */ log.error("IGONE : {}", e); return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(new ErrorResponse("Server Error", "-1")); } @@ -124,17 +199,30 @@ public class AcntCstmrController { return ResponseEntity.ok().body(new SuccessResponse<>(resultMap)); } + /** + * 회원정보 수정하는 기능, + * AcntCstmrEmModel에 회원이 입력한 수정할 정보들로 수정합니다. + * @param rq + * @return + */ @PutMapping(value = "/profile/update") - @ApiOperation(value = "회원 정보 변경 (이메일,핸드폰)") - @Tag(name = "회원관리", description = "회원 관련 API") + @Operation(summary = "회원정보 수정", description = "토큰을 발급한 ID의 회원정보(이메일, 휴대폰번호)를 업데이트 하는 API 입니다.") public ResponseEntity updateEmail(@RequestBody AcntCstmrEmModel rq){ Map resultMap = new HashMap(); try { - PtyCstmrDtl result = service.updateEmail(rq); + PtyCstmrDtl result = service.updateEmail(rq); // 이메일과 휴대폰번호를 업데이트 하는 기능 resultMap.put("result", result); } catch (CustomException e) { + /** + * try{ + ... + } + * try 영역 안 코드들중 문제가 생기면 오는 곳. + * CustomException은 개발자가 "의도적으로" 낸 예외처리, + * log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌 + */ log.error("IGNOE : {}", e); resultMap.put("result", false); resultMap.put("errorCode", e.getErrorCode()); @@ -142,6 +230,13 @@ public class AcntCstmrController { return ResponseEntity.ok().body(new SuccessResponse(resultMap)); } catch (Exception e) { + /** + * try{ + ... + } + * try 영역 안 코드들중 문제가 생기면 오는 곳. + * log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌 + */ log.error("IGONE : {}", e); return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(new ErrorResponse("Server Error", "-1")); @@ -149,19 +244,31 @@ public class AcntCstmrController { return ResponseEntity.ok().body(new SuccessResponse<>(resultMap)); } + /** + * 회원 탈퇴 처리하는 기능, + * 회원고유[cstmrSno] 값으로 회원탈퇴처리함. + * @param cstmrSno + * @return + */ @PostMapping(value = "/profile/delete/{cstmrSno}") - @ApiOperation(value = "회원 탈퇴") - @Tag(name = "회원관리", description = "회원 관련 API") - @ApiImplicitParam(name = "cstmrSno",value = "고객일련번호", dataTypeClass = Integer.class) - public ResponseEntity userDelete(@PathVariable Integer cstmrSno){ + @Operation(summary = "회원 탈퇴", description = "cstmrSno를 받아 회원탈퇴 처리하는 API 입니다.") + public ResponseEntity userDelete(@Parameter(name="cstmrSno", description = "회원 일련번호", in = ParameterIn.PATH, example = "27")@PathVariable Integer cstmrSno){ Map resultMap = new HashMap(); try { - boolean result = service.userDelete(cstmrSno); + boolean result = service.userDelete(cstmrSno); // 회원고유[cstmrSno] 값으로 회원탈퇴처리함. resultMap.put("result", result); } catch (CustomException e) { + /** + * try{ + ... + } + * try 영역 안 코드들중 문제가 생기면 오는 곳. + * CustomException은 개발자가 "의도적으로" 낸 예외처리, + * log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌 + */ log.error("IGNOE : {}", e); resultMap.put("result", false); resultMap.put("errorCode", e.getErrorCode()); diff --git a/pav-server/src/main/java/com/palnet/biz/api/acnt/cstmr/model/AcntCstmrEmModel.java b/pav-server/src/main/java/com/palnet/biz/api/acnt/cstmr/model/AcntCstmrEmModel.java index e433794f..d562fbbb 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/acnt/cstmr/model/AcntCstmrEmModel.java +++ b/pav-server/src/main/java/com/palnet/biz/api/acnt/cstmr/model/AcntCstmrEmModel.java @@ -1,20 +1,26 @@ package com.palnet.biz.api.acnt.cstmr.model; -import lombok.Data; - import java.time.Instant; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + @Data public class AcntCstmrEmModel { + @Schema(description = "유저 이메일" , example = "updateEmail@test.co.kr") private String email; + @Schema(description = "업데이트 일자", example = "2023-12-12", implementation = String.class) private Instant updateDt; + @Schema(hidden = true) private String updateUserId; + @Schema(hidden = true) private int cstmrSno; + @Schema(description = "업데이트할 핸드폰 번호", example = "01023457777") private String hpno; diff --git a/pav-server/src/main/java/com/palnet/biz/api/acnt/cstmr/model/AcntCstmrPwModel.java b/pav-server/src/main/java/com/palnet/biz/api/acnt/cstmr/model/AcntCstmrPwModel.java index 6d7de776..16f5f22c 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/acnt/cstmr/model/AcntCstmrPwModel.java +++ b/pav-server/src/main/java/com/palnet/biz/api/acnt/cstmr/model/AcntCstmrPwModel.java @@ -1,17 +1,22 @@ package com.palnet.biz.api.acnt.cstmr.model; -import lombok.Data; - import java.time.Instant; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + @Data public class AcntCstmrPwModel { + @Schema(hidden = true) private Instant pswdupdtDt; + @Schema(description = "유저의 기존 비밀번호", example = "test1234") private String userPswd; + @Schema(description = "유저의 새로운 비밀번호", example = "test12345") private String newPswd; + @Schema(description = "유저의 새로운 비밀번호(확인)", example = "test12345") private String newPswdConfirm; } diff --git a/pav-server/src/main/java/com/palnet/biz/api/acnt/cstmr/model/AcntCstmrRqModel.java b/pav-server/src/main/java/com/palnet/biz/api/acnt/cstmr/model/AcntCstmrRqModel.java index 3c978bc2..5e18d0e3 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/acnt/cstmr/model/AcntCstmrRqModel.java +++ b/pav-server/src/main/java/com/palnet/biz/api/acnt/cstmr/model/AcntCstmrRqModel.java @@ -1,53 +1,74 @@ package com.palnet.biz.api.acnt.cstmr.model; +import java.time.Instant; + import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.palnet.biz.config.convert.InstantDateStrSerializer; -import lombok.Data; -import java.time.Instant; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; @Data public class AcntCstmrRqModel{ + @Schema(description = "고객구분코드" , example = "MEMBER") private String cstrmDivCd; + @Schema(description = "고객상태코드" , example = "A") private String cstrmStatusCd; + @Schema(description = "유저 아이디(중복인 경우 숫자 변경)" , example = "tester01") private String userId; + @Schema(description = "유저 권한" , example = "USER") private String authId; + @Schema(description = "사이트 코드" , example = "DRON") private String siteCode; + @Schema(hidden = true) private String memberDivCd; + @Schema(description = "유저 비밀번호" , example = "test1234") private String userPswd; + @Schema(hidden = true) private String ipinDi; + @Schema(hidden = true) private String ipinCi; + @Schema(description = "가입인증 수단 코드" , example = "HP_CRTFD") private String joinCrtfyCd; - + + @Schema(description = "국가코드" , example = "KOR") private String cntryCd; + @Schema(description = "성별코드" , example = "M") private String genderCd; + @Schema(description = "멤버 이름" , example = "TESTER") private String memberName; @JsonSerialize(using = InstantDateStrSerializer.class) + @Schema(description = "생년월일", example = "1997-05-05", implementation = String.class) private Instant brthdyDate; + @Schema(hidden = true) private Instant testDt; + @Schema(description = "이메일" , example = "tester@test.co.kr") private String email; + @Schema(description = "멤버 이름" , example = "01012345678") private String hpno; + @Schema(description = "국가 코드" , example = "+82") private String clncd; private AnctCstmrTermsModel[] terms; + @Schema(hidden = true) private String trmnlId; diff --git a/pav-server/src/main/java/com/palnet/biz/api/acnt/cstmr/model/AnctCstmerRlModel.java b/pav-server/src/main/java/com/palnet/biz/api/acnt/cstmr/model/AnctCstmerRlModel.java index 89f36506..b1819789 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/acnt/cstmr/model/AnctCstmerRlModel.java +++ b/pav-server/src/main/java/com/palnet/biz/api/acnt/cstmr/model/AnctCstmerRlModel.java @@ -1,5 +1,6 @@ package com.palnet.biz.api.acnt.cstmr.model; +import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.palnet.biz.config.convert.InstantDateStrSerializer; import lombok.Data; @@ -28,6 +29,7 @@ public class AnctCstmerRlModel { private String updateuserId; + @JsonInclude(JsonInclude.Include.ALWAYS) private String cptAuthCode; } diff --git a/pav-server/src/main/java/com/palnet/biz/api/acnt/cstmr/model/AnctCstmrPswdModel.java b/pav-server/src/main/java/com/palnet/biz/api/acnt/cstmr/model/AnctCstmrPswdModel.java new file mode 100644 index 00000000..5a501665 --- /dev/null +++ b/pav-server/src/main/java/com/palnet/biz/api/acnt/cstmr/model/AnctCstmrPswdModel.java @@ -0,0 +1,9 @@ +package com.palnet.biz.api.acnt.cstmr.model; + +import lombok.Data; + +@Data +public class AnctCstmrPswdModel { + + private String userPswd; +} diff --git a/pav-server/src/main/java/com/palnet/biz/api/acnt/cstmr/model/AnctCstmrTermsModel.java b/pav-server/src/main/java/com/palnet/biz/api/acnt/cstmr/model/AnctCstmrTermsModel.java index a9d3aec7..1a3cef1a 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/acnt/cstmr/model/AnctCstmrTermsModel.java +++ b/pav-server/src/main/java/com/palnet/biz/api/acnt/cstmr/model/AnctCstmrTermsModel.java @@ -1,9 +1,12 @@ package com.palnet.biz.api.acnt.cstmr.model; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; @Data public class AnctCstmrTermsModel { + @Schema(description = "약관 일련번호", example = "1") private int termsSno; + @Schema(description = "동의여부", example = "Y") private String agreeYn; } diff --git a/pav-server/src/main/java/com/palnet/biz/api/acnt/cstmr/service/AcntCstmrService.java b/pav-server/src/main/java/com/palnet/biz/api/acnt/cstmr/service/AcntCstmrService.java index 0e86b920..4dbfb279 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/acnt/cstmr/service/AcntCstmrService.java +++ b/pav-server/src/main/java/com/palnet/biz/api/acnt/cstmr/service/AcntCstmrService.java @@ -5,15 +5,14 @@ import java.util.List; import javax.persistence.EntityManagerFactory; -import com.palnet.biz.api.acnt.cstmr.model.AcntCstmrEmModel; -import com.palnet.biz.api.acnt.cstmr.model.AcntCstmrPwModel; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import com.palnet.biz.api.acnt.cstmr.model.AcntCstmrEmModel; +import com.palnet.biz.api.acnt.cstmr.model.AcntCstmrPwModel; import com.palnet.biz.api.acnt.cstmr.model.AcntCstmrRqModel; import com.palnet.biz.api.acnt.cstmr.model.AcntCstmrRsModel; import com.palnet.biz.api.acnt.cstmr.model.AnctCstmerRlModel; @@ -33,7 +32,6 @@ import com.palnet.biz.jpa.repository.pty.PtyGroupBasRepository; import com.palnet.biz.jpa.repository.pty.PtyTermsAgreeTxnRepository; import com.palnet.comn.code.ErrorCode; import com.palnet.comn.exception.CustomException; -import com.palnet.comn.utils.DateUtils; import com.palnet.comn.utils.EncryptUtils; import com.palnet.comn.utils.HttpUtils; @@ -74,7 +72,7 @@ public class AcntCstmrService { /** * - * + * AcntCstmrRqModel에 담겨있는 회원정보를 데이터베이스에 추가하는 기능 * @param rq * @return */ @@ -89,7 +87,7 @@ public class AcntCstmrService { //사전 체크. 동일한 ID 존재 여부 확인 isUserIdFind = query.findCstmrByUserId(rq.getUserId()); - if(isUserIdFind) { + if(isUserIdFind) { // 중복되면 에러코드 반환 rs.setErrCode(-1); return rs; } @@ -119,21 +117,27 @@ public class AcntCstmrService { } } - //성공 파람 담기 + //성공 데이터 담기 if(basEntity != null) { rs.setErrCode(1); rs.setLoginId(basEntity.getUserId()); - } + } }catch(Exception e) { log.error("IGNORE : {}", e); rs.setErrCode(-2); return rs; } - + return rs; } + /** + * AcntCstmrRqModel에 담겨있는 회원정보를 데이터베이스에 추가[INSERT]하는 기능. + * @param rq + * @return + * @throws Exception + */ public PtyCstmrBas savePtyCstmrBas(AcntCstmrRqModel rq) throws Exception{ @@ -153,7 +157,19 @@ public class AcntCstmrService { } + /** + * AcntCstmrRqModel에 담겨있는 상세정보를 데이터베이스에 추가[INSERT]함. + * @param rq + * @param basEntity + * @return + * @throws Exception + */ public PtyCstmrDtl savePtyCstmrDtl(AcntCstmrRqModel rq , PtyCstmrBas basEntity) throws Exception{ + + if(rq.getCntryCd() == null || rq.getCntryCd().equals("")){ + rq.setCntryCd("KOR"); + } + PtyCstmrDtl dtlEntity = new PtyCstmrDtl(); dtlEntity.setCstmrSno(basEntity.getCstmrSno()); dtlEntity.setIpinCi(rq.getIpinCi()); @@ -189,20 +205,30 @@ public class AcntCstmrService { return ptyTermsAgreeTxnRepository.save(agreeEntity); } - + + /** + * 회원 고유번호[cstmrSno]로 회원정보를 조회하는 기능. + * @param cstmrSno + * @return + */ public List list(int cstmrSno) { - List resultList = query.list(cstmrSno); + List resultList = query.list(cstmrSno); // 회원고유번호[cstmrSno]로 회원정보를 조회 함. for(AnctCstmerRlModel model : resultList) { - model.setEmail(EncryptUtils.decrypt(model.getEmail())); - model.setHpno(EncryptUtils.decrypt(model.getHpno())); + model.setEmail(EncryptUtils.decrypt(model.getEmail())); // 이메일은 회원추가할 때 암호화하기에 다시 복호화를 함 + model.setHpno(EncryptUtils.decrypt(model.getHpno())); // 휴대폰 번호는 회원추가할 때 암호화하기에 다시 복호화를 함 } return resultList; } + /** + * 회원에게 입력받은 암호로 변경하는 기능 + * @param rq + * @return + */ public PtyCstmrBas updatepas(AcntCstmrPwModel rq) { // 1. 토큰 유저 정보 불러오기 Integer userId = jwtTokenUtil.getCstmrSnoByToken(); @@ -228,6 +254,11 @@ public class AcntCstmrService { return updateUserEntity; } + /** + * 기존 암호가 맞는지 확인하는 기능. + * @param userPswd + * @return + */ public boolean extendpsw(String userPswd){ boolean result = false; // 1. 토큰 유저 정보 불러오기 @@ -258,57 +289,88 @@ public class AcntCstmrService { return result; } + /** + * 이메일과 휴대폰번호를 업데이트 하는 기능. + * @param rq + * @return + */ public PtyCstmrDtl updateEmail(AcntCstmrEmModel rq) { - Integer cstmrSno = jwtTokenUtil.getCstmrSnoByToken(); - String userId = jwtTokenUtil.getUserIdByToken(); - String newEmail = EncryptUtils.encrypt(rq.getEmail()); - String newHpno = EncryptUtils.encrypt(rq.getHpno()); + Integer cstmrSno = jwtTokenUtil.getCstmrSnoByToken(); // 회원 인가할 정보에 있는 회원 고유번호 + String userId = jwtTokenUtil.getUserIdByToken(); // 회원 인가할 정보에 있는 회원 아이디 + String newEmail = EncryptUtils.encrypt(rq.getEmail()); // 바뀔 이메일 암호화 + String newHpno = EncryptUtils.encrypt(rq.getHpno()); // 바뀔 휴대폰번호 암호화 + // 회원 고유번호로 회원정보를 데이터베이스에서 가져옴 PtyCstmrDtl userEntity = ptyCstmrDtlRepository.findById(cstmrSno).orElse(null); - + + // 바뀔 내용 넣어줌 userEntity.setEmail(newEmail); userEntity.setUpdateDt(Instant.now() ); userEntity.setUpdateUserId(userId); userEntity.setHpno(newHpno); - + + // 바뀔 내용을 데이터베이스에 수정함 PtyCstmrDtl updateEmailEntity = ptyCstmrDtlRepository.save(userEntity); return updateEmailEntity; } + /** + * 회원고유[cstmrSno] 값으로 회원탈퇴처리 하는 기능. + * @param cstmrSno + * @return + */ public boolean userDelete(int cstmrSno) { - List groupInfo = jwtTokenUtil.getGroupAuthByToken(); - for(JwtGroupModel group : groupInfo) { -// if(group.getGroupAuthCd().equals("CREATER")) { - if(group.getGroupAuthCd().equals("MASTER")) { - PtyGroupBas groupEntity = ptyGroupBasRepository.findByGroupId(group.getGroupId()); - if(!(groupEntity == null)) { - groupEntity.setUseYn("N"); - ptyGroupBasRepository.save(groupEntity); - } - List cstmrEntity = ptyCstmrGroupRepository.changeGroupJoinYn(group.getGroupId()); - if(!(cstmrEntity == null)) { - for(PtyCstmrGroup cstmr : cstmrEntity) { - cstmr.setJoinYn("N"); - ptyCstmrGroupRepository.save(cstmr); + List groupInfo = jwtTokenUtil.getGroupAuthByToken(); // 회원의 속한 그룹을 조회 + + if(groupInfo != null) { + for(JwtGroupModel group : groupInfo) { + // if(group.getGroupAuthCd().equals("CREATER")) { + + // 회원의 그룹 권한이 MASTER 일 경우 + if(group.getGroupAuthCd().equals("MASTER")) { + PtyGroupBas groupEntity = ptyGroupBasRepository.findByGroupId(group.getGroupId()); + + // 그룹이 있을경우 그룹의 사용여부 "N" 값으로 저장 + if(!(groupEntity == null)) { + groupEntity.setUseYn("N"); + ptyGroupBasRepository.save(groupEntity); + } + + List cstmrEntity = ptyCstmrGroupRepository.changeGroupJoinYn(group.getGroupId()); + + // cstmrEntity 값이 있을 경우 참여여부 "N" 값으로 저장 + if(!(cstmrEntity == null)) { + for(PtyCstmrGroup cstmr : cstmrEntity) { + cstmr.setJoinYn("N"); + ptyCstmrGroupRepository.save(cstmr); + } } } - } - List AprvlEntity = ptyCstmrGroupRepository.changeGroupAprvlYn(cstmrSno); - if(!(AprvlEntity == null)) { - for(PtyCstmrGroup Aprvl : AprvlEntity) { - Aprvl.setAprvlYn("N"); - Aprvl.setAprvlDt(null); - ptyCstmrGroupRepository.save(Aprvl); + + // 회원 고유번호로 데이터베이스에서 그룹참여정보 가져옴 + List AprvlEntity = ptyCstmrGroupRepository.changeGroupAprvlYn(cstmrSno); + + // AprvlEntity[그룹참여 정보가] 있을경우 + if(!(AprvlEntity == null)) { + // 그룹 승인여부를 "N"값으로 저장 + for(PtyCstmrGroup Aprvl : AprvlEntity) { + Aprvl.setAprvlYn("N"); + Aprvl.setAprvlDt(null); + ptyCstmrGroupRepository.save(Aprvl); + } + + // 그룹 참여여부를 "N"값으로 저장 + PtyCstmrGroup cstmrEntity = ptyCstmrGroupRepository.findGroupId(group.getGroupId(), cstmrSno); + if(!(cstmrEntity == null)) { + cstmrEntity.setJoinYn("N"); + ptyCstmrGroupRepository.save(cstmrEntity); + } } - PtyCstmrGroup cstmrEntity = ptyCstmrGroupRepository.findGroupId(group.getGroupId(), cstmrSno); - if(!(cstmrEntity == null)) { - cstmrEntity.setJoinYn("N"); - ptyCstmrGroupRepository.save(cstmrEntity); } } - } + // 데이터베이스에 있는 회원 정보를 탈퇴처리 후 저장함 PtyCstmrBas userEntity = ptyCstmrBasRepository.findByUserGroupId(cstmrSno); userEntity.setCstmrStatusCd("W"); userEntity.setCstmrStatusCngDt(Instant.now() ); diff --git a/pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/controller/JwtAuthenticationController.java b/pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/controller/JwtAuthenticationController.java index 0cb758b0..41756bb2 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/controller/JwtAuthenticationController.java +++ b/pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/controller/JwtAuthenticationController.java @@ -1,5 +1,18 @@ package com.palnet.biz.api.acnt.jwt.controller; +import java.util.Map; + +import io.swagger.v3.oas.annotations.media.Schema; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + import com.palnet.biz.api.acnt.jwt.model.JwtProfileRsModel; import com.palnet.biz.api.acnt.jwt.model.JwtRqModel; import com.palnet.biz.api.acnt.jwt.model.JwtRsModel; @@ -11,50 +24,48 @@ import com.palnet.biz.api.comn.response.ErrorResponse; import com.palnet.biz.api.comn.response.SuccessResponse; import com.palnet.biz.jpa.entity.PtyCstmrBas; import com.palnet.comn.code.RSErrorCode; -import io.swagger.annotations.ApiImplicitParam; -import io.swagger.annotations.ApiOperation; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.enums.ParameterIn; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; -import lombok.extern.log4j.Log4j2; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; - -import java.util.Map; +import lombok.extern.slf4j.Slf4j; +@Slf4j @RestController @RequiredArgsConstructor -@Log4j2 @RequestMapping(value = "/api/acnt/jwt", produces = {MediaType.APPLICATION_JSON_VALUE}) @Tag(name = "JWT 토큰 이용", description = "JWT 토큰 관련 API") public class JwtAuthenticationController { - @Autowired - private JwtTokenUtil jwtTokenUtil; - - @Autowired - private JwtUserDetailsService userDetailsService; - - - @Autowired - private JwtService service; - + private final JwtTokenUtil jwtTokenUtil; + private final JwtUserDetailsService userDetailsService; + private final JwtService service; + + /** + * 로그인 기능, + * JwtRqModel에 입력받은 회원아이디, 입력받은 회원 비밀번호로 인증처리를 함. + * @param authenticationRequest + * @return + * @throws Exception + */ @PostMapping(value = "/login") - @ApiOperation(value = "로그인") - @Tag(name = "JWT 토큰 이용", description = "JWT 토큰 관련 API") + @Operation(summary = "로그인", description = "ID와 PASSWORD를 입력받아 로그인 처리하는 API 입니다.") public ResponseEntity createAuthenticationToken(@RequestBody JwtRqModel authenticationRequest) throws Exception { + + // 로그인 프로세스 + Map resultMap = service.loginProcess(authenticationRequest); - Map resultMap = service.loginProcess(authenticationRequest); - - int loginError = (int) resultMap.get("loginError"); + int loginError = (int) resultMap.get("loginError"); + // loginError 은 1이 정상, - 값은 모두 로그인 실패임 if(loginError < 0) { String errorMessage = (String) resultMap.get("errorMessage"); + + // 로그인 실패시 로그인 실패한 사유를 반환함 return ResponseEntity.status(HttpStatus.OK) - .body(new ErrorResponse(errorMessage, loginError + "")); // 계정 사용하지 못함 }else { @@ -65,54 +76,78 @@ public class JwtAuthenticationController { } + /** + * 로그인 한 회원 정보, + * 회원고유번호[cstmrSno]로 조회를 함. + * @param cstmrSno + * @return + * @throws Exception + */ @GetMapping(value = "/profile/{cstmrSno}") - @ApiOperation(value = "로그인한 회원의 정보") - @Tag(name = "JWT 토큰 이용", description = "JWT 토큰 관련 API") - @ApiImplicitParam(name = "cstmrSno",value = "고객일련번호", dataTypeClass = Integer.class) - public ResponseEntity proflie(@PathVariable Integer cstmrSno) throws Exception{ + @Operation(summary = "로그인한 회원의 정보", description = "로그인 된 유저의 정보를 가져오는 API 입니다.") + public ResponseEntity proflie( + @Parameter(name="cstmrSno", description = "회원번호", in = ParameterIn.PATH, example = "3")@PathVariable Integer cstmrSno) throws Exception{ - JwtProfileRsModel result = service.profile(cstmrSno); + JwtProfileRsModel result = service.profile(cstmrSno); // 회원고유번호로 회원정보를 가져오는 기능. if(result == null) { + // 반환받은 회원정보가 없을시 "의도적인" 예외코드를 반환해줌 return ResponseEntity.status(HttpStatus.OK) .body(new ErrorResponse(RSErrorCode.DATA_NOTFOUNT)); } return ResponseEntity.ok().body(new SuccessResponse(result)); } - + /** + * 회원의 인가정보 유효기간 종료시, + * 다시 인가정보[토큰]를 받는 기능 + * @param body + * @return + * @throws Exception + */ @PostMapping(value = "/refresh") - @Tag(name = "JWT 토큰 이용", description = "JWT 토큰 관련 API") -// public ResponseEntity refresh(@RequestParam("cstmrSno") int cstmrSno , @RequestParam("refreshToken") String refreshToken) throws Exception{ - public ResponseEntity refresh(@RequestBody Map body) throws Exception{ - - - //입력값 검증 + @Operation(summary = "JWT 재인가토큰 발급", description = "JWT 토큰을 재발급하는 API 입니다.
{
\"cstmrSno\" : 2,
\"refreshToken\" : \"palnet을 제외한 token 전체를 입력\"
}
위의 예시와 같이 값을 입력하시면 됩니다. cstmrSno는 토큰의 ID와 매핑되는 값이어야 합니다.") + public ResponseEntity refresh( + @RequestBody + @Schema(example = "{\n" + + "\"cstmrSno\" : 2,\n" + + "\"refreshToken\" : \"palnet을 제외한 token 전체를 입력\"\n" + + "}") + Map body + ) throws Exception { + + // 회원고유번호[cstmrSno], 회원고유번호[cstmrSno]가 Integer타입인지, 인가정보를 다시받을 토큰값 [refreshToken] 입력값에 대한 검증처리 if(body.get("cstmrSno") == null || body.get("refreshToken") == null || !(body.get("cstmrSno") instanceof Integer)) { + // 검증이 되지 않으면 "의도적인" 예외코드를 반환해줌 return ResponseEntity.status(HttpStatus.OK) .body(new ErrorResponse(RSErrorCode.ER_PARAM)); } - + int cstmrSno = (int)body.get("cstmrSno"); String refreshToken = (String)body.get("refreshToken"); - - - JwtRsModel result = service.findRefreshtoken(cstmrSno, refreshToken); -// JwtRsModel result = null; + // 재 인가토큰 발급 + JwtRsModel result = service.findRefreshtoken(cstmrSno, refreshToken); + // JwtRsModel result = null; if(result ==null) { + // 토큰발행 실패 시 "의도적인" 예외코드를 반환해줌 return ResponseEntity.status(HttpStatus.OK) .body(new ErrorResponse(RSErrorCode.DATA_NOTFOUNT)); } - return ResponseEntity.ok().body(new SuccessResponse(result)); + return ResponseEntity.ok().body(new SuccessResponse<>(result)); } + /** + * 로그아웃 기능. + * @param cstmrSno + * @return + * @throws Exception + */ @GetMapping(value = "/logout/{cstmrSno}") - @ApiOperation(value = "로그아웃 한 회원의 정보") - @Tag(name = "JWT 토큰 이용", description = "JWT 토큰 관련 API") - @ApiImplicitParam(name = "cstmrSno",value = "고객일련번호", dataTypeClass = Integer.class) - public ResponseEntity logout(@PathVariable Integer cstmrSno) throws Exception{ + @Operation(summary = "회원 로그아웃", description = "회원을 로그아웃 시키는 API 입니다.") + public ResponseEntity logout( + @Parameter(name="cstmrSno", description = "회원번호", in = ParameterIn.PATH, example = "3")@PathVariable Integer cstmrSno) throws Exception{ // if(cstmrSno == null || !(body.get("cstmrSno") instanceof Integer)) { // return ResponseEntity.status(HttpStatus.OK) @@ -120,10 +155,11 @@ public class JwtAuthenticationController { // } // int cstmrSno = (int)body.get("cstmrSno"); - + // 로그아웃 할 프로세스 PtyCstmrBas bas = service.logoutProcess(cstmrSno); if(bas == null) { + // 로그아웃 프로세스 실패 시 "의도적인" 예외코드를 반환해줌 return ResponseEntity.status(HttpStatus.OK) .body(new ErrorResponse(RSErrorCode.DATA_NOTFOUNT)); } diff --git a/pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/model/JwtProfileRsModel.java b/pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/model/JwtProfileRsModel.java index cf902cef..7f393f66 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/model/JwtProfileRsModel.java +++ b/pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/model/JwtProfileRsModel.java @@ -1,5 +1,6 @@ package com.palnet.biz.api.acnt.jwt.model; +import com.fasterxml.jackson.annotation.JsonInclude; import lombok.Data; @Data @@ -15,5 +16,8 @@ public class JwtProfileRsModel { private String memberName; private String trmnlId; + + @JsonInclude(JsonInclude.Include.ALWAYS) + private String cptAuthCode; } diff --git a/pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/model/JwtRqModel.java b/pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/model/JwtRqModel.java index 50a448f9..1c87cd33 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/model/JwtRqModel.java +++ b/pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/model/JwtRqModel.java @@ -6,6 +6,8 @@ import lombok.NoArgsConstructor; import java.io.Serializable; +import io.swagger.v3.oas.annotations.media.Schema; + @NoArgsConstructor @AllArgsConstructor @@ -14,6 +16,9 @@ public class JwtRqModel implements Serializable { private static final long serialVersionUID = 5926468583005150707L; + @Schema(description = "로그인 ID" , example = "loginSample01") private String userId; + + @Schema(description = "FAQ 카테고리" , example = "sample1234") private String userPswd; } diff --git a/pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/service/JwtService.java b/pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/service/JwtService.java index 8289528c..eb005f97 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/service/JwtService.java +++ b/pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/service/JwtService.java @@ -39,8 +39,7 @@ public class JwtService { private final JwtTokenUtil jwtTokenUtil; /** - * 로그인 처리 - * + * 로그인 처리하는 기능. * @param rq * @return */ @@ -78,8 +77,8 @@ public class JwtService { } } - - if (loginError < 0) { + //loginError 값이 - 인경우 에러 메세지와 함꼐 반환 + if (loginError < 0) { String errorMessage = ""; if (loginError == -100) { @@ -103,11 +102,13 @@ public class JwtService { return resultMap; - } else { + } else { //loginError 값이 + 값이라면 로긍니 성공 - String accessToken = jwtTokenUtil.generateToken(userDetails); + // 인증이후 인가할 정보 만듬. + String accessToken = jwtTokenUtil.generateToken(userDetails); String refreshToken = jwtTokenUtil.generateRefreshToken(userDetails); + // 반환할 객체 설정. JwtRsModel result = new JwtRsModel(); result.setAccessToken(accessToken); result.setRefreshToken(refreshToken); @@ -139,9 +140,18 @@ public class JwtService { } + /** + * 로그아웃 하는 기능. + * @param cstmrSno + * @return + * @throws Exception + */ public PtyCstmrBas logoutProcess(int cstmrSno) throws Exception { + // 회원의 정보를 받아옴 Optional optional = ptyCstmrBasRepository.findById(cstmrSno); + + // 회원의 인가정보를 만료시킴 if (optional.isPresent()) { PtyCstmrBas entity = optional.get(); entity.setRfrshToken(""); @@ -175,7 +185,7 @@ public class JwtService { } /** - * refresh Token 저장 처리 + * refresh Token 저장 처리 기능 * * @param cstmrSno * @param refreshToken @@ -197,8 +207,7 @@ public class JwtService { } /** - * 프로필 조회 - * + * 회원의 프로필을 조회하는 기능. * @param cstmrSno * @return * @throws Exception @@ -211,8 +220,7 @@ public class JwtService { } /** - * token 만료시 refresh 토큰으로 재검색 - * + * token 만료시 refresh 토큰으로 재검색 하는 기능. * @param cstmrSno * @param refreshToken * @return @@ -231,7 +239,8 @@ public class JwtService { Claims claims = jwtTokenUtil.getAllClaimsFromToken(refreshToken); Integer cstmrSnoByRefreshToken = claims.get("cstmrSno", Integer.class); if(cstmrSnoByRefreshToken != cstmrSno) return null; - + + // 인가 토큰 발행할수 있게 필요한 회원 정보들을 데이터베이스에서 조회함. JwtUserModel userDetails = query.findByIdForrefreshToken(cstmrSno); String createAccessToken = jwtTokenUtil.generateToken(userDetails); diff --git a/pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/utils/JwtTokenUtil.java b/pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/utils/JwtTokenUtil.java index 86e1ef84..f097fd52 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/utils/JwtTokenUtil.java +++ b/pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/utils/JwtTokenUtil.java @@ -5,7 +5,7 @@ import com.palnet.biz.api.acnt.jwt.model.JwtUserModel; import io.jsonwebtoken.Claims; import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.stereotype.Component; @@ -17,8 +17,8 @@ import java.io.Serializable; import java.util.*; import java.util.function.Function; +@Slf4j @Component -@Log4j2 public class JwtTokenUtil implements Serializable { private static final long serialVersionUID = -2550185165626007488L; @@ -146,6 +146,10 @@ public class JwtTokenUtil implements Serializable { return cstmrSno; } + /** + * 회원 인가정보로 그룹 + * @return + */ public List getGroupAuthByToken() { HttpServletRequest rq = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); String token = rq.getHeader("Authorization"); diff --git a/pav-server/src/main/java/com/palnet/biz/api/acnt/terms/controller/AcntTermsController.java b/pav-server/src/main/java/com/palnet/biz/api/acnt/terms/controller/AcntTermsController.java index f8654a95..53c9df45 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/acnt/terms/controller/AcntTermsController.java +++ b/pav-server/src/main/java/com/palnet/biz/api/acnt/terms/controller/AcntTermsController.java @@ -6,7 +6,7 @@ import com.palnet.biz.api.acnt.terms.service.AcntTermsService; import com.palnet.biz.api.comn.response.BasicResponse; import com.palnet.biz.api.comn.response.ErrorResponse; import com.palnet.biz.api.comn.response.SuccessResponse; -import io.swagger.annotations.ApiOperation; +import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; import lombok.extern.log4j.Log4j2; @@ -28,16 +28,21 @@ public class AcntTermsController { private final AcntTermsService service; + /** + * 약관정보 들을 가져오는 기능, + * AcntTermsRqModel에 입력받은 약관타입에 따른 약관항목을 반환함. + * @param rq + * @return + */ + @Operation(summary = "약관 조회", description = "약관 정보를 조회하는 API 입니다.") @GetMapping(value = "/list") - @Tag(name = "약관 기본", description = "약관 관련 API") - @ApiOperation(value = "약관 기본 정보") public ResponseEntity list(AcntTermsRqModel rq) { List result = null; log.debug("RQ>>>>>>>>" , rq.toString()); try { - result = service.list(rq); + result = service.list(rq); // 입력받은 값에 따른 약관항목을 반환하는 기능. } catch (Exception e) { diff --git a/pav-server/src/main/java/com/palnet/biz/api/acnt/terms/model/AcntTermsRqModel.java b/pav-server/src/main/java/com/palnet/biz/api/acnt/terms/model/AcntTermsRqModel.java index a578ad46..6324a20a 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/acnt/terms/model/AcntTermsRqModel.java +++ b/pav-server/src/main/java/com/palnet/biz/api/acnt/terms/model/AcntTermsRqModel.java @@ -1,5 +1,6 @@ package com.palnet.biz.api.acnt.terms.model; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -10,7 +11,13 @@ import lombok.NoArgsConstructor; @NoArgsConstructor @AllArgsConstructor public class AcntTermsRqModel { + + @Schema(description = "사이트 코드" , example = "SANDBOX") private String siteCd; + + @Schema(description = "약관 카테고리 코드" , example = "SITE_JOIN") private String termsCtgryCd; + + @Schema(description = "언어 코드" , example = "KOR") private String langDivCd; } diff --git a/pav-server/src/main/java/com/palnet/biz/api/acnt/terms/service/AcntTermsService.java b/pav-server/src/main/java/com/palnet/biz/api/acnt/terms/service/AcntTermsService.java index ddef5f36..0341ee48 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/acnt/terms/service/AcntTermsService.java +++ b/pav-server/src/main/java/com/palnet/biz/api/acnt/terms/service/AcntTermsService.java @@ -16,6 +16,11 @@ public class AcntTermsService { private final PtyTermsQueryRepository query; + /** + * 입력받은 값에 따른 약관항목을 반환하는 기능. + * @param rq + * @return + */ public List list(AcntTermsRqModel rq) { return query.list(rq); } 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..07e743bb 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 @@ -9,11 +9,13 @@ import com.palnet.biz.api.comn.response.BasicResponse; import com.palnet.biz.api.comn.response.ErrorResponse; import com.palnet.biz.api.comn.response.SuccessResponse; import com.palnet.comn.code.RSErrorCode; -import io.swagger.annotations.ApiImplicitParam; -import io.swagger.annotations.ApiOperation; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.enums.ParameterIn; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; @@ -24,7 +26,7 @@ import org.springframework.web.bind.annotation.RestController; import java.util.List; -@Log4j2 +@Slf4j @RestController @RequiredArgsConstructor @RequestMapping(value = "/api/anls/hstry", produces = {MediaType.APPLICATION_JSON_VALUE}) @@ -33,23 +35,36 @@ public class AnlsHstryController { private final AnlsHstryService service; + /** + * 비행현황 목록 리스트 조회하는 기능, + * AnlsHstryGroupModel에 따른 리스트를 조회함. + * @param rq + * @return + */ @GetMapping(value = "/list") - @ApiOperation(value = "비행 현황 목록 출력") - @Tag(name = "비행 이력 현황", description = "비행 이력 현황 관련 API") + @Operation(summary = "비행 현황 목록 출력", description = "비행 현황 목록을 출력하는 API 입니다.") public ResponseEntity list(AnlsHstryGroupModel rq) { 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,17 +74,30 @@ public class AnlsHstryController { } + /** + * 비행현황의 상세정보를 조회함, + * 비행ID[CNTRL_ID]로 조회함 + * @param id + * @return + */ @GetMapping(value = "/detail/{id}") - @ApiOperation(value = "비행 현황 상세") - @Tag(name = "비행 이력 현황", description = "비행 이력 현황 관련 API") - @ApiImplicitParam(name = "id",value = "관제ID", dataTypeClass = String.class) - public ResponseEntity detail(@PathVariable String id) { + @Operation(summary = "비행 현황 상세 정보 출력", description = "비행 현황 상세 정보를 출력하는 API 입니다.") + public ResponseEntity detail( + @Parameter(name="id", description = "개체 비행 ID", in = ParameterIn.PATH, example = "061fbd9d-25c5-4801-bb11-2307a8eb8d8f") @PathVariable String id) { + 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 +108,31 @@ 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) { +// @ApiOperation(value = "비행 이력 데이터") +// @Tag(name = "비행 이력 현황", description = "비행 이력 현황 관련 API") +// @ApiImplicitParam(name = "id",value = "관제ID", dataTypeClass = String.class) + @Operation(summary = "비행 현황 이력 출력", description = "비행 현황의 이력을 출력하는 API 입니다.") + public ResponseEntity log( + @Parameter(name="id", description = "개체 비행 ID", in = ParameterIn.PATH, example = "061fbd9d-25c5-4801-bb11-2307a8eb8d8f") @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/model/AnlsHstryGroupModel.java b/pav-server/src/main/java/com/palnet/biz/api/anls/hstry/model/AnlsHstryGroupModel.java index c4540037..bb00ab67 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/anls/hstry/model/AnlsHstryGroupModel.java +++ b/pav-server/src/main/java/com/palnet/biz/api/anls/hstry/model/AnlsHstryGroupModel.java @@ -1,6 +1,8 @@ package com.palnet.biz.api.anls.hstry.model; import com.palnet.biz.api.comn.model.ComnPagingModel; + +import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; @@ -8,14 +10,19 @@ import lombok.EqualsAndHashCode; @EqualsAndHashCode(callSuper=false) public class AnlsHstryGroupModel extends ComnPagingModel { + @Schema(description = "검색 시작날짜" , example = "2023-11-01", implementation = String.class) private String stDate; + @Schema(description = "검색 종료날짜" , example = "2023-11-30", implementation = String.class) private String endDate; + @Schema(hidden = true) private String search1; + @Schema(hidden = true) private String searchType1; + @Schema(description = "그룹 아이디", example = "C807F9") private String groupId; } diff --git a/pav-server/src/main/java/com/palnet/biz/api/anls/hstry/model/AnlsHstryRqModel.java b/pav-server/src/main/java/com/palnet/biz/api/anls/hstry/model/AnlsHstryRqModel.java index 5d37e0cd..7a63c08a 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/anls/hstry/model/AnlsHstryRqModel.java +++ b/pav-server/src/main/java/com/palnet/biz/api/anls/hstry/model/AnlsHstryRqModel.java @@ -2,11 +2,14 @@ package com.palnet.biz.api.anls.hstry.model; import com.palnet.biz.api.comn.model.ComnRqModel; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; @Data @EqualsAndHashCode(callSuper=false) -public class AnlsHstryRqModel extends ComnRqModel{ +public class AnlsHstryRqModel extends ComnRqModel { + + @Schema(description = "개체 비행 ID" , example = "061fbd9d-25c5-4801-bb11-2307a8eb8d8f") private String cntrlId; } 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..a217a600 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 @@ -5,6 +5,8 @@ import java.util.List; import java.util.Optional; import com.palnet.biz.api.comn.model.ComnPagingRs; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.BeanUtils; @@ -35,50 +37,42 @@ import com.palnet.biz.jpa.repository.pty.PtyCstmrGroupRepository; import com.palnet.comn.code.ErrorCode; import com.palnet.comn.exception.CustomException; +@Slf4j +@RequiredArgsConstructor @Service public class AnlsHstryService { - - private Logger logger = LoggerFactory.getLogger(getClass()); - - @Autowired - private CtrCntrlBasRepository ctrCntrlBasRepository; - - @Autowired - private PtyCstmrGroupRepository ptyCstmrGroupRepository; - - @Autowired - private ComArcrftBasRepository comArcrftBasRepository; - - @Autowired - private ComIdntBasRepository comIdntBasRepository; - - @Autowired - private CtrCntrlHstryAreaRepository ctrCntrlHstryAreaRepository; - - @Autowired - private FltPlanBasRepository fltPlanBasRepository; - - @Autowired - private FltPlanPilotRepository fltPlanPilotRepository; - - @Autowired - private CtrCntrlQueryRepository query; - - @Autowired - private JwtTokenUtil jwtTokenUtil; - //비행이력현황 list + private final CtrCntrlBasRepository ctrCntrlBasRepository; + private final PtyCstmrGroupRepository ptyCstmrGroupRepository; + private final ComArcrftBasRepository comArcrftBasRepository; + private final ComIdntBasRepository comIdntBasRepository; + private final CtrCntrlHstryAreaRepository ctrCntrlHstryAreaRepository; + private final FltPlanBasRepository fltPlanBasRepository; + private final FltPlanPilotRepository fltPlanPilotRepository; + private final CtrCntrlQueryRepository query; + private final JwtTokenUtil jwtTokenUtil; + + /** + * 비행현황 목록 조회하는 기능. + * @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 +80,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 +126,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 +154,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/api/anls/smlt/controller/AnlsSmltController.java b/pav-server/src/main/java/com/palnet/biz/api/anls/smlt/controller/AnlsSmltController.java index fd74a684..51b19f45 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 @@ -1,20 +1,5 @@ package com.palnet.biz.api.anls.smlt.controller; -import java.util.List; - -import io.swagger.annotations.ApiImplicitParam; -import io.swagger.annotations.ApiImplicitParams; -import io.swagger.annotations.ApiOperation; -import io.swagger.v3.oas.annotations.tags.Tag; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - import com.palnet.biz.api.anls.hstry.model.AnlsHstryDetailModel; import com.palnet.biz.api.anls.hstry.model.AnlsHstryModel; import com.palnet.biz.api.anls.hstry.model.AnlsHstryRqModel; @@ -28,8 +13,22 @@ import com.palnet.biz.api.comn.response.SuccessResponse; import com.palnet.comn.code.RSErrorCode; import com.palnet.comn.utils.JsonUtils; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.enums.ParameterIn; +import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; import lombok.extern.log4j.Log4j2; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; @Log4j2 @RestController @@ -42,30 +41,38 @@ public class AnlsSmltController { private final AnlsSmltService service; /** - * 비행 현황 목록 + * 비행현황 목록 리스트 조회하는 기능, + * AnlsHstryRqModel 따른 리스트를 조회함. * @param rq * @return */ @GetMapping(value = "/list") - @ApiOperation(value = "비행 현황 목록") - @Tag(name = "비행 시뮬레이션", description = "비행 이력 시뮬레이션 관련 API") + @Operation(summary = "비행 시뮬레이션 - 비행 현황 목록", description = "비행 시뮬레이션에서 비행 현황 목록을 조회하는 API 입니다.") public ResponseEntity list(AnlsHstryRqModel rq) { ComnPagingRs result = null; 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,22 +84,29 @@ public class AnlsSmltController { /** - * 비행 이력 데이터 조회 + * 비행 이력 데이터 조회하는 기능,061fbd9d-25c5-4801-bb11-2307a8eb8d8f + * 비행ID[CNTRL_ID]로 조회함 * @param rq * @return */ @GetMapping(value = "/hist/{id}") - @ApiOperation(value = "비행 이력 데이터 조회") - @Tag(name = "비행 시뮬레이션", description = "비행 이력 시뮬레이션 관련 API") - @ApiImplicitParam(name = "id",value = "관제ID", dataTypeClass = String.class) - public ResponseEntity histList(@PathVariable String id) { + @Operation(summary = "비행 시뮬레이션 - 비행 이력 데이터 조회", description = "비행 시뮬레이션에서 비행 이력 데이터를 조회하는 API 입니다.") + public ResponseEntity histList( + @Parameter(name="id", description = "개체 비행 ID", in = ParameterIn.PATH, example = "061fbd9d-25c5-4801-bb11-2307a8eb8d8f") @PathVariable String id) { List result = null; 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,23 +118,30 @@ public class AnlsSmltController { /** - * 통계 데이터 조회 + * 통계 데이터 조회, + * 비행ID[CNTRL_ID]로 조회함 * @param rq * @return */ @GetMapping(value = "/stcs/{id}") - @ApiOperation(value = "통계 데이터 조회") - @Tag(name = "비행 시뮬레이션", description = "비행 이력 시뮬레이션 관련 API") - @ApiImplicitParam(name = "id",value = "관제ID", dataTypeClass = String.class) - public ResponseEntity stcsList(@PathVariable String id) { + @Operation(summary = "비행 시뮬레이션 - 비행 이력 통계 데이터 조회", description = "비행 시뮬레이션에서 비행 이력 통계 데이터를 조회하는 API 입니다.") + public ResponseEntity stcsList( + @Parameter(name="id", description = "개체 비행 ID", in = ParameterIn.PATH, example = "061fbd9d-25c5-4801-bb11-2307a8eb8d8f") @PathVariable String id) { + List result = null; 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,21 +152,31 @@ public class AnlsSmltController { } /** - * 비행 상세정보 조회 + * 비행 상세정보 조회, + * 비행ID[CNTRL_ID]로 조회함 * @param id * @return */ @GetMapping(value = "/detail/{id}") - @ApiOperation(value = "비행 상세정보 조회") - @Tag(name = "비행 시뮬레이션", description = "비행 이력 시뮬레이션 관련 API") - @ApiImplicitParam(name = "id",value = "관제ID", dataTypeClass = String.class) - public ResponseEntity detail(@PathVariable String id) { +// @ApiOperation(value = "비행 상세정보 조회") +// @Tag(name = "비행 시뮬레이션", description = "비행 이력 시뮬레이션 관련 API") +// @ApiImplicitParam(name = "id",value = "관제ID", dataTypeClass = String.class) + @Operation(summary = "비행 시뮬레이션 - 비행 상세 정보 조회", description = "비행 시뮬레이션에서 비행 상세 정보 데이터를 조회하는 API 입니다.") + public ResponseEntity detail( + @Parameter(name="id", description = "개체 비행 ID", in = ParameterIn.PATH, example = "061fbd9d-25c5-4801-bb11-2307a8eb8d8f")@PathVariable String id) { 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/api/bas/dron/controller/BasDronController.java b/pav-server/src/main/java/com/palnet/biz/api/bas/dron/controller/BasDronController.java index 0e066315..25fcbcde 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/bas/dron/controller/BasDronController.java +++ b/pav-server/src/main/java/com/palnet/biz/api/bas/dron/controller/BasDronController.java @@ -1,9 +1,6 @@ package com.palnet.biz.api.bas.dron.controller; -import com.palnet.biz.api.bas.dron.model.BasDronModel; -import com.palnet.biz.api.bas.dron.model.BasDronRqModel; -import com.palnet.biz.api.bas.dron.model.BasIdntfModel; -import com.palnet.biz.api.bas.dron.model.BasIdntfRqModel; +import com.palnet.biz.api.bas.dron.model.*; import com.palnet.biz.api.bas.dron.service.BasDronService; import com.palnet.biz.api.comn.model.ComnPagingRs; import com.palnet.biz.api.comn.response.BasicResponse; @@ -11,11 +8,13 @@ import com.palnet.biz.api.comn.response.ErrorResponse; import com.palnet.biz.api.comn.response.SuccessResponse; import com.palnet.comn.code.RSErrorCode; import com.palnet.comn.exception.CustomException; -import io.swagger.annotations.ApiImplicitParam; -import io.swagger.annotations.ApiOperation; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.enums.ParameterIn; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; @@ -39,60 +38,74 @@ public class BasDronController { /** - * 목록 조회 + * 드론 목록 조회기능, + * BasDronRqModel에 조회할 조건 값들이 들어있음 * @param rq * @return */ @GetMapping(value = "/list") - @ApiOperation(value = "드론 목록 조회") - @Tag(name = "드론 컨트롤러", description = "드론 관련 API") + @Operation(summary = "드론목록 조회", description = "검색조건에 맞춰 드론목록을 조회합니다.") public ResponseEntity list(BasDronRqModel rq) { ComnPagingRs result = null; - //입력값 검증 + // 그룹아이디[groupId] 입력값 검증 if(StringUtils.isEmpty(rq.getGroupId())) { - 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")); } return ResponseEntity.ok().body(new SuccessResponse<>(result)); - } /** - * 식별정보 조회 + * 식별정보 조회하는 기능, + * 기체 일련번호[arcrftSno]로 조회함. * @param rq * @return */ @GetMapping(value = "/idntf/list/{id}") - @ApiOperation(value = "식별정보 조회") - @Tag(name = "드론 컨트롤러", description = "드론 관련 API") - @ApiImplicitParam(name = "id",value = "기체일련번호", dataTypeClass = Integer.class) - public ResponseEntity mylist(@PathVariable Integer id) { + @Operation(summary = "드론정보 조회", description = "드론[기체]일련번호로 식별장치를 조회합니다.") + public ResponseEntity mylist(@Parameter(name="id", description = "기체일련번호", in = ParameterIn.PATH, example = "6") @PathVariable Integer id) { List result = null; - //입력값 검증 + // 기체일련번호확인[id] 입력값 검증처리 if(StringUtils.isEmpty(id)) { - return ResponseEntity.status(HttpStatus.OK) + // 검증통과하지 못할 시 서버에서 "의도적인" 에러 반환 + return ResponseEntity.status(HttpStatus.OK) // "의도적인" 에러 반환코드 .body(new ErrorResponse(RSErrorCode.ER_PARAM)); } try { - result = service.listIdntf(id); + result = service.listIdntf(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,28 +117,35 @@ public class BasDronController { /** - * 상세 조회 + * 드론 상세 조회, + * 기체일련번호[arcrftSno]로 드론 상세조회하는 기능. * @param id * @return */ @GetMapping(value = "/detail/{id}") - @ApiOperation(value = "드론 상세 조회") - @Tag(name = "드론 컨트롤러", description = "드론 관련 API") - @ApiImplicitParam(name = "id",value = "기체일련번호", dataTypeClass = Integer.class) - public ResponseEntity detail(@PathVariable Integer id) { + @Operation(summary = "드론정보 상세조회", description = "기체일련번호로 드론상세 조회합니다.") + public ResponseEntity detail(@Parameter(name="id", description = "기체일련번호", in = ParameterIn.PATH, example = "1") @PathVariable Integer id) { BasDronModel result = null; try { - //입력값 검증 + // 기체일련번호확인[id] 입력값 검증처리 if(StringUtils.isEmpty(id)) { - return ResponseEntity.status(HttpStatus.OK) - .body(new ErrorResponse(RSErrorCode.ER_PARAM)); + // 검증통과하지 못할 시 서버에서 "의도적인" 에러 반환 + return ResponseEntity.status(HttpStatus.OK) // "의도적인" 에러 반환코드 + .body(new ErrorResponse(RSErrorCode.ER_PARAM)); } - result = service.detail(id); + result = service.detail(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")); @@ -137,26 +157,48 @@ public class BasDronController { /** - * 생성 + * 드론정보 생성하는 기능, + * BasDronModel 모델에 드론 입력정보로 드론정보 생성함. * @return */ @PostMapping(value = "/create") - @ApiOperation(value = "드론정보 생성") - @Tag(name = "드론 컨트롤러", description = "드론 관련 API") - public ResponseEntity create(@RequestBody BasDronModel rq) { + @Operation(summary = "드론정보 추가", description = "드론[기체] 정보를 추가합니다, 예시를 바꿔 추가할 수 있습니다.") +// @ApiOperation(value = "드론정보 생성") +// @Tag(name = "드론 컨트롤러", description = "드론 관련 API") + public ResponseEntity create(@RequestBody BasDronInsertModel rq) { Map resultMap = new HashMap(); - + + BasDronModel basDronModel = new BasDronModel(); + BeanUtils.copyProperties(rq, basDronModel); + + log.warn("basDronModel => {}", basDronModel); + try { - boolean result = service.create(rq); - + boolean result = service.create(basDronModel); // 드론 정보 생성하는 기능. + resultMap.put("result", result); }catch(CustomException e2) { + /** + * try{ + ... + } + * try 영역 안 코드들중 문제가 생기면 오는 곳. + * CustomException은 개발자가 "의도적으로" 낸 예외처리, + * log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌 + */ log.error("IGNORE : {}", e2); resultMap.put("result", false); resultMap.put("errorCode", e2.getErrorCode()); return ResponseEntity.ok().body(new SuccessResponse(resultMap)); }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")); @@ -167,28 +209,43 @@ public class BasDronController { } /** - * 생성 + * 식별장치 생성하는 기능, + * BasIdntfRqModel 모델에 입력받은 식별장치정보 생성함/ * @return */ @PostMapping(value = "/idntf/create") - @ApiOperation(value = "식별장치 생성") - @Tag(name = "드론 컨트롤러", description = "드론 관련 API") + @Operation(summary = "드론식별장치정보 추가", description = "드론의 식별장치정보를 추가합니다, 예시를 바꿔 추가할 수 있습니다.") public ResponseEntity createIdntf(@RequestBody BasIdntfRqModel rq) { Map resultMap = new HashMap(); try { // boolean result = service.create(rq); - boolean result = service.createIdntf(rq); + boolean result = service.createIdntf(rq); // 식밸장치 생성하는 기능. resultMap.put("result", result); }catch(CustomException e2) { + /** + * try{ + ... + } + * try 영역 안 코드들중 문제가 생기면 오는 곳. + * CustomException은 개발자가 "의도적으로" 낸 예외처리, + * log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌 + */ log.error("IGNORE : {}", e2); resultMap.put("result", false); resultMap.put("errorCode", e2.getErrorCode()); return ResponseEntity.ok().body(new SuccessResponse(resultMap)); } 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")); @@ -199,27 +256,45 @@ public class BasDronController { } /** - * 수정 + * 드론 정보 수정하는 기능, + * BasDronModel에 입력받은 수정할 정보를 데이터베이스에 수정함. * @return */ @PutMapping(value = "/update") - @ApiOperation(value = "드론정보 수정") - @Tag(name = "드론 컨트롤러", description = "드론 관련 API") - public ResponseEntity update(@RequestBody BasDronModel rq) { + @Operation(summary = "드론정보 수정", description = "드론[기체] 정보를 수정합니다, 예시를 바꿔 추가할 수 있습니다.") + public ResponseEntity update(@RequestBody BasDronUpdateModel rq) { Map resultMap = new HashMap(); - + + BasDronModel basDronModel = new BasDronModel(); + BeanUtils.copyProperties(rq, basDronModel); + try { - boolean result = service.update(rq); - + boolean result = service.update(basDronModel); // 드론정보 수정하는 기능. + resultMap.put("result", result); } catch(CustomException e2) { + /** + * try{ + ... + } + * try 영역 안 코드들중 문제가 생기면 오는 곳. + * CustomException은 개발자가 "의도적으로" 낸 예외처리, + * log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌 + */ log.error("IGNORE : {}", e2); resultMap.put("result", false); resultMap.put("errorCode", e2.getErrorCode()); return ResponseEntity.ok().body(new SuccessResponse(resultMap)); }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")); @@ -230,15 +305,14 @@ public class BasDronController { } /** - * 삭제 + * 드론정보 삭제하는 기능, + * 기체일련번호[arcrftSno]로 삭제함 * @param id * @return */ @DeleteMapping(value = "/delete/{id}") - @ApiOperation(value = "드론정보 삭제") - @Tag(name = "드론 컨트롤러", description = "드론 관련 API") - @ApiImplicitParam(name = "id",value = "기체일련번호", dataTypeClass = Integer.class) - public ResponseEntity delete(@PathVariable Integer id) { + @Operation(summary = "드론정보 삭제", description = "드론[기체] 정보를 삭제합니다. [예제값은 이미 삭제되어있을 수도 있으니 드론기체를 추가해서 삭제 테스트 진행해주세요.]") + public ResponseEntity delete(@Parameter(name="id", description = "기체일련번호", in = ParameterIn.PATH, example = "6") @PathVariable Integer id) { Map resultMap = new HashMap(); try { @@ -269,25 +343,30 @@ public class BasDronController { * @return */ @DeleteMapping(value = "/idntf/delete/{id}") - @ApiOperation(value = "식별장치 삭제") - @Tag(name = "드론 컨트롤러", description = "드론 관련 API") - @ApiImplicitParam(name = "id",value = "식별번호", dataTypeClass = String.class) - public ResponseEntity deleteIdntf(@PathVariable String id) { + @Operation(summary = "드론식별장치 삭제", description = "드론[기체]식별장치 정보를 삭제합니다. [예제값은 이미 삭제되어있을 수도 있으니 식별장치를 추가해서 삭제 테스트 진행해주세요.]") + public ResponseEntity deleteIdntf(@Parameter(name="id", description = "기체식별장치 일련번호", in = ParameterIn.PATH, example = "PA0003")@PathVariable String id) { Map resultMap = new HashMap(); try { - - //입력값 검증 + // 기체일련번호확인[id] 입력값 검증처리 if(StringUtils.isEmpty(id)) { - return ResponseEntity.status(HttpStatus.OK) - .body(new ErrorResponse(RSErrorCode.ER_PARAM)); - } - - boolean result = service.deleteIdntf(id); + // 검증통과하지 못할 시 서버에서 "의도적인" 에러 반환 + return ResponseEntity.status(HttpStatus.OK) // "의도적인" 에러 반환코드 + .body(new ErrorResponse(RSErrorCode.ER_PARAM)); + } + + boolean result = service.deleteIdntf(id); // 드론정보 삭제하는 기능. resultMap.put("result", result); } 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/bas/dron/model/BasDronInsertModel.java b/pav-server/src/main/java/com/palnet/biz/api/bas/dron/model/BasDronInsertModel.java new file mode 100644 index 00000000..32f8ce3d --- /dev/null +++ b/pav-server/src/main/java/com/palnet/biz/api/bas/dron/model/BasDronInsertModel.java @@ -0,0 +1,46 @@ +package com.palnet.biz.api.bas.dron.model; + +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.media.Schema.RequiredMode; +import lombok.Data; + +@Data +public class BasDronInsertModel { + + @Schema(description = "그룹명", example = "KAC") + private String groupNm; + + @Schema(description = "그룹아이디", example = "C807F9") + private String groupId; + + @Schema(description = "제작번호", example = "PAV_KAC") + private String prdctNum; + + @Schema(description = "기체모델명", example = "PAV_001") + private String arcrftModelNm; + + @Schema(description = "기체종류코드 [01: 무인비행기, 02: 무인헬리콥터, 03: 멀티콥터, 04: 비행선]", example = "01") + private String arcrftTypeCd; + + @Schema(description = "중량구분코드[-250G, 250G+2KG-, 2KG+7KG-, 25KG+]", example = "2KG+7KG-") + private String wghtTypeCd; + + @Schema(description = "카메라 탑재 여부", example = "N") + private String cameraYn; + + @Schema(description = "보험가입여부", example = "Y") + private String insrncYn; + + @Schema(description = "제작자", example = "팔네트웍스") + private String prdctCmpnNm; + + @Schema(description = "이미지 URL [업로드하는 이미지]", example = "PAV_KAC") + private String imageUrl; + + @Schema(description = "등록사용자", example = "palnet") + private String createUserId; + + @Schema(description = "수정한 사용자", example = "palnet") + private String updateUserId; + +} diff --git a/pav-server/src/main/java/com/palnet/biz/api/bas/dron/model/BasDronModel.java b/pav-server/src/main/java/com/palnet/biz/api/bas/dron/model/BasDronModel.java index 7a7df0aa..5910c1b3 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/bas/dron/model/BasDronModel.java +++ b/pav-server/src/main/java/com/palnet/biz/api/bas/dron/model/BasDronModel.java @@ -2,6 +2,9 @@ package com.palnet.biz.api.bas.dron.model; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.palnet.biz.config.convert.InstantDateStrSerializer; + +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.media.Schema.RequiredMode; import lombok.Data; import java.time.Instant; @@ -26,7 +29,7 @@ public class BasDronModel { private double arcrftWdth; private double arcrftWght; - + private String cameraYn; private Instant createDt; diff --git a/pav-server/src/main/java/com/palnet/biz/api/bas/dron/model/BasDronRqModel.java b/pav-server/src/main/java/com/palnet/biz/api/bas/dron/model/BasDronRqModel.java index 5d3c2892..a64297ae 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/bas/dron/model/BasDronRqModel.java +++ b/pav-server/src/main/java/com/palnet/biz/api/bas/dron/model/BasDronRqModel.java @@ -2,6 +2,8 @@ package com.palnet.biz.api.bas.dron.model; import com.palnet.biz.api.comn.model.ComnPagingModel; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.media.Schema.RequiredMode; import lombok.Data; import lombok.EqualsAndHashCode; @@ -9,15 +11,18 @@ import lombok.EqualsAndHashCode; @EqualsAndHashCode(callSuper=false) public class BasDronRqModel extends ComnPagingModel { + @Schema(description = "그룹아이디" , example = "C807F9", requiredMode = RequiredMode.REQUIRED) private String groupId; + @Schema(description = "기체모델명" , example = "PAV_001", requiredMode = RequiredMode.NOT_REQUIRED) private String arcrftModelNm; + @Schema(description = "기체종류코드" , example = "01", requiredMode = RequiredMode.NOT_REQUIRED) private String arcrftTypeCd; + @Schema(description = "기체식별번호" , example = "PA0001", hidden = true) private String idntfNum; - private String ownerNm; - - + @Schema(description = "소유자 명" , example = "팔네트웍스", hidden = true) + private String ownerNm; } diff --git a/pav-server/src/main/java/com/palnet/biz/api/bas/dron/model/BasDronUpdateModel.java b/pav-server/src/main/java/com/palnet/biz/api/bas/dron/model/BasDronUpdateModel.java new file mode 100644 index 00000000..0cde6ac2 --- /dev/null +++ b/pav-server/src/main/java/com/palnet/biz/api/bas/dron/model/BasDronUpdateModel.java @@ -0,0 +1,45 @@ +package com.palnet.biz.api.bas.dron.model; + +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.media.Schema.RequiredMode; +import lombok.Data; + +@Data +public class BasDronUpdateModel { + + @Schema(description = "그룹명", example = "KAC", implementation = String.class) + private String groupNm; + + @Schema(description = "그룹아이디", example = "C807F9", implementation = String.class) + private String groupId; + + @Schema(description = "제작번호", example = "PAV_KAC", implementation = String.class) + private String prdctNum; + + @Schema(description = "기체모델명", example = "PAV_001", implementation = String.class) + private String arcrftModelNm; + + @Schema(description = "기체종류코드 [01: 무인비행기, 02: 무인헬리콥터, 03: 멀티콥터, 04: 비행선]", example = "01", implementation = String.class) + private String arcrftTypeCd; + + @Schema(description = "중량구분코드[-250G, 250G+2KG-, 2KG+7KG-, 25KG+]", example = "2KG+7KG-") + private String wghtTypeCd; + + @Schema(description = "카메라 탑재 여부", example = "N", implementation = String.class) + private String cameraYn; + + @Schema(description = "보험가입여부", example = "Y", implementation = String.class) + private String insrncYn; + + @Schema(description = "제작자", example = "팔네트웍스", implementation = String.class) + private String prdctCmpnNm; + + @Schema(description = "이미지 URL [업로드하는 이미지]", example = "PAV_KAC", implementation = String.class) + private String imageUrl; + + @Schema(description = "기체일련번호", example = "6", requiredMode = RequiredMode.REQUIRED, implementation = Integer.class) + private Integer arcrftSno; + + @Schema(description = "수정한 사용자", example = "palnet", implementation = String.class) + private String updateUserId; +} diff --git a/pav-server/src/main/java/com/palnet/biz/api/bas/dron/model/BasIdntfModel.java b/pav-server/src/main/java/com/palnet/biz/api/bas/dron/model/BasIdntfModel.java index fa542f32..fa279a2f 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/bas/dron/model/BasIdntfModel.java +++ b/pav-server/src/main/java/com/palnet/biz/api/bas/dron/model/BasIdntfModel.java @@ -4,28 +4,43 @@ import lombok.Data; import java.time.Instant; +import io.swagger.v3.oas.annotations.media.Schema; + @Data public class BasIdntfModel { - //식별 번호 정보 + //식별 번호 정보 + @Schema(hidden = true) private String id; + + @Schema(description = "식별장치 고유명", example = "PA0003") private String idntfNum; + + @Schema(hidden = true) private String isSave; + @Schema(hidden = true) private int arcrftSno; + @Schema(description = "식별장치종류코드", example = "DRON") private String idntfTypeCd; + @Schema(description = "소유자명", example = "팔네트웍스") private String ownerNm; + @Schema(description = "소유자 휴대폰번호", example = "01044322231") private String hpno; + @Schema(hidden = true) private Instant updateDt; - + + @Schema(hidden = true) private Instant createDt; - + + @Schema(hidden = true) private int cstmrSno; + @Schema(hidden = true) private String groupId; } diff --git a/pav-server/src/main/java/com/palnet/biz/api/bas/dron/model/BasIdntfRqModel.java b/pav-server/src/main/java/com/palnet/biz/api/bas/dron/model/BasIdntfRqModel.java index 9d2cffab..0cd9a4b5 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/bas/dron/model/BasIdntfRqModel.java +++ b/pav-server/src/main/java/com/palnet/biz/api/bas/dron/model/BasIdntfRqModel.java @@ -1,14 +1,18 @@ package com.palnet.biz.api.bas.dron.model; +import java.util.ArrayList; import java.util.List; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; @Data public class BasIdntfRqModel { + @Schema(description = "기체 식별정보들", implementation = BasIdntfModel.class) private List data; + @Schema(description = "기체일련번호", example = "6") private int arcrftSno; } diff --git a/pav-server/src/main/java/com/palnet/biz/api/bas/dron/service/BasDronService.java b/pav-server/src/main/java/com/palnet/biz/api/bas/dron/service/BasDronService.java index b2f81aef..5be94c80 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/bas/dron/service/BasDronService.java +++ b/pav-server/src/main/java/com/palnet/biz/api/bas/dron/service/BasDronService.java @@ -48,7 +48,7 @@ public class BasDronService { private JwtTokenUtil jwtTokenUtil; /** - * 드론 목록 + * 드론 목록을 조회하는 기능 * @param rq * @return */ @@ -56,10 +56,13 @@ public class BasDronService { ComnPagingRs response = new ComnPagingRs<>(); + // 페이징 처리를 위한 객체 Pageable pageable = PageRequest.of(rq.getPage()-1, rq.getRecord()); + // 데이터 베이스에서 검색조건에 맞는 값으로 드론목록 조회함. PageImpl result = query.list(rq, pageable); - + + // 데이터 베이스에서 전체 리스트 값이 몇인지 조회. long total = query.listCount(rq); long totalPage = total % rq.getRecord() > 0 ? (total/rq.getRecord()) + 1 : total/rq.getRecord(); @@ -92,7 +95,7 @@ public class BasDronService { } /** - * 상세 조회 + * 드론 상세 조회하는 기능. * @param arcrftSno * @return * @throws Exception @@ -110,7 +113,7 @@ public class BasDronService { } /** - * 생성 + * 드론 정보 생성하는 기능. * @param * @return * @throws Exception @@ -168,7 +171,7 @@ public class BasDronService { } /** - * 식밸장치 생성 + * 식밸장치 생성하는 기능. * @param * @return * @throws Exception @@ -206,6 +209,11 @@ public class BasDronService { } + /** + * 드론정보 삭제하는 기능. + * @param idntfNum + * @return + */ public boolean deleteIdntf(String idntfNum) { Optional optional = comIdntBasRepository.findById(idntfNum); @@ -218,7 +226,13 @@ public class BasDronService { return true; } - + + /** + * 입력받은 드론정보 데이터베이스에 생성함. + * @param model + * @return + * @throws Exception + */ public ComArcrftBas insertComArcrftBas(BasDronModel model) throws Exception{ @@ -261,7 +275,7 @@ public class BasDronService { /** - * 수정 + * 드론정보 수정하는 기능. * @param * @return * @throws Exception @@ -319,7 +333,13 @@ public class BasDronService { return true; } - + + /** + * 입력받은 드론 수정정보로 데이터베이스에 수정함. + * @param model + * @return + * @throws Exception + */ public ComArcrftBas updateComArcrftBas(BasDronModel model) throws Exception{ diff --git a/pav-server/src/main/java/com/palnet/biz/api/bas/flight/controller/BasFlightController.java b/pav-server/src/main/java/com/palnet/biz/api/bas/flight/controller/BasFlightController.java index 5f0d0d17..789b5d8e 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/bas/flight/controller/BasFlightController.java +++ b/pav-server/src/main/java/com/palnet/biz/api/bas/flight/controller/BasFlightController.java @@ -1,51 +1,6 @@ package com.palnet.biz.api.bas.flight.controller; -import java.io.BufferedReader; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.UnsupportedEncodingException; -import java.net.URLEncoder; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.json.simple.JSONArray; -import org.json.simple.JSONObject; -import org.json.simple.parser.JSONParser; -import org.json.simple.parser.ParseException; -import org.locationtech.jts.geom.Coordinate; -import org.locationtech.jts.geom.GeometryFactory; -import org.locationtech.jts.geom.MultiPoint; -import org.locationtech.jts.geom.Point; -import org.locationtech.jts.geom.Polygon; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.core.env.Environment; -import org.springframework.core.io.ClassPathResource; -import org.springframework.core.io.Resource; -import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; - -import com.palnet.biz.api.bas.flight.model.BasFlightAprovRq; -import com.palnet.biz.api.bas.flight.model.BasFlightPlanArcrftModel; -import com.palnet.biz.api.bas.flight.model.BasFlightPlanAreaModel; -import com.palnet.biz.api.bas.flight.model.BasFlightPlanListRq; -import com.palnet.biz.api.bas.flight.model.BasFlightPlanModel; -import com.palnet.biz.api.bas.flight.model.BasFlightPlanPilotModel; -import com.palnet.biz.api.bas.flight.model.BasFlightScheduleRs; -import com.palnet.biz.api.bas.flight.model.BasFlightWeatherModel; +import com.palnet.biz.api.bas.flight.model.*; import com.palnet.biz.api.bas.flight.service.BasFlightService; import com.palnet.biz.api.comn.file.service.ComnFileService; import com.palnet.biz.api.comn.model.ComnPagingRs; @@ -55,20 +10,33 @@ import com.palnet.biz.api.comn.response.SuccessResponse; import com.palnet.biz.scheduler.ctr.service.CtrTrnsLctnService; import com.palnet.comn.exception.CustomException; import com.palnet.comn.utils.AreaUtils; -import com.palnet.comn.utils.FlightUtils; import com.palnet.comn.utils.PdfUtils; - -import io.swagger.annotations.ApiImplicitParam; -import io.swagger.annotations.ApiOperation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.json.simple.JSONObject; +import org.json.simple.parser.JSONParser; +import org.json.simple.parser.ParseException; +import org.locationtech.jts.geom.Coordinate; +import org.springframework.core.env.Environment; +import org.springframework.core.io.ClassPathResource; +import org.springframework.core.io.Resource; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.io.*; +import java.net.URLEncoder; +import java.util.HashMap; +import java.util.List; +import java.util.Map; @Slf4j +@Tag(name = "비행계획서", description = "비행계획서 관련 API") @RequiredArgsConstructor @RestController @RequestMapping(value = "/api/bas/flight", produces = {MediaType.APPLICATION_JSON_VALUE}) -@Tag(name = "비행계획서", description = "비행계획서 관련 API") public class BasFlightController { private final BasFlightService basFlightService; @@ -78,9 +46,15 @@ public class BasFlightController { private final ComnFileService comnFileService; private final PdfUtils pdfUtils; + /** + * 공역데이터 내려주는 기능. + * @return + * @throws IOException + * @throws ParseException + */ @GetMapping("/area") - @Tag(name = "비행계획서", description = "비행계획서 관련 API") public ResponseEntity findAirSpace() throws IOException, ParseException { + // 1. file read Resource resource = new ClassPathResource("air/airgeo.json"); InputStream jsonInputStream = resource.getInputStream(); @@ -102,16 +76,28 @@ public class BasFlightController { return ResponseEntity.ok().body(airArea); } - // 비행계획서 조회 + /** + * 비행계획서 조회하는 기능, + * BasFlightPlanListRq 모델에 조건값에 따라 조회함. + * @param rq + * @return + */ @GetMapping(value = "/plan/list") - @ApiOperation(value = "비행계획서 조회") - @Tag(name = "비행계획서", description = "비행계획서 관련 API") +// @ApiOperation(value = "비행계획서 조회") +// @Tag(name = "비행계획서", description = "비행계획서 관련 API") public ResponseEntity findPlanList(BasFlightPlanListRq rq) { ComnPagingRs result = null; log.debug(">>> rq : {}", rq); try { - result = basFlightService.listPlan(rq); + result = basFlightService.listPlan(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")); @@ -120,16 +106,28 @@ public class BasFlightController { return ResponseEntity.ok().body(new SuccessResponse<>(result)); } - // 비행계획서 상세 조회 + /** + * 비행계획서 상세 조회기능, + * 비행계획서 번호[planSno]로 상세조회 + * @param planSno + * @return + */ @GetMapping(value = "/plan/detail/{planSno}") - @ApiOperation(value = "비행계획서 상세 조회") - @Tag(name = "비행계획서", description = "비행계획서 관련 API") - @ApiImplicitParam(name = "planSno", value = "비행계획서일련번호", dataTypeClass = Integer.class) +// @ApiOperation(value = "비행계획서 상세 조회") +// @Tag(name = "비행계획서", description = "비행계획서 관련 API") +// @ApiImplicitParam(name = "planSno", value = "비행계획서일련번호", dataTypeClass = Integer.class) public ResponseEntity detailPlan(@PathVariable("planSno") Integer planSno) { BasFlightPlanModel result = null; try { - result = basFlightService.detailPlan(planSno); + result = basFlightService.detailPlan(planSno); // 비행계획서 고유번호[planSno]로 상세 조회하는 기능. } 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,25 +136,46 @@ public class BasFlightController { return ResponseEntity.ok().body(new SuccessResponse<>(result)); } - // 비행계획서 등록 + /** + * 비행계획서 등록하는 기능, + * BasFlightPlanModel모델에 입력받은값으로 등록함. + * @param rq + * @return + */ @PostMapping(value = "/plan/create") - @ApiOperation(value = "비행계획서 등록") - @Tag(name = "비행계획서", description = "비행계획서 관련 API") +// @ApiOperation(value = "비행계획서 등록") +// @Tag(name = "비행계획서", description = "비행계획서 관련 API") public ResponseEntity createPlan(@RequestBody BasFlightPlanModel rq) { Map resultMap = new HashMap(); + try { log.error(">>> rq : {}", rq); - boolean result = basFlightService.createPlan(rq); + boolean result = basFlightService.createPlan(rq); // 입력받은 값으로 비행계획서 등록하는 기능. resultMap.put("result", result); log.info(">>> resultMap : " , resultMap); } catch (CustomException e) { + /** + * try{ + ... + } + * try 영역 안 코드들중 문제가 생기면 오는 곳. + * CustomException은 개발자가 "의도적으로" 낸 예외처리, + * log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌 + */ log.error("IGNORE : {}", e); resultMap.put("result", false); resultMap.put("errorCode", e.getErrorCode()); resultMap.put("errorMessage", e.getMessage()); return ResponseEntity.ok().body(new SuccessResponse(resultMap)); } 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")); @@ -165,23 +184,43 @@ public class BasFlightController { return ResponseEntity.ok().body(new SuccessResponse<>(resultMap)); } - // 비행계획서 수정 + /** + * 비행계획서 수정하는 기능, + * BasFlightPlanModel 모델에 입력받은 값으로 수정함 + * @param rq + * @return + */ @PutMapping(value = "/plan/update") - @ApiOperation(value = "비행계획서 수정") - @Tag(name = "비행계획서", description = "비행계획서 관련 API") +// @ApiOperation(value = "비행계획서 수정") +// @Tag(name = "비행계획서", description = "비행계획서 관련 API") public ResponseEntity updatePlan(@RequestBody BasFlightPlanModel rq) { Map resultMap = new HashMap(); try { - boolean result = basFlightService.updatePlan(rq); + boolean result = basFlightService.updatePlan(rq); // 입력받은 값으로 비행계획서 수정하는 기능. resultMap.put("result", result); } catch (CustomException e) { + /** + * try{ + ... + } + * try 영역 안 코드들중 문제가 생기면 오는 곳. + * CustomException은 개발자가 "의도적으로" 낸 예외처리, + * log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌 + */ log.error("IGNORE : {}", e); resultMap.put("result", false); resultMap.put("errorCode", e.getErrorCode()); resultMap.put("errorMessage", e.getMessage()); return ResponseEntity.ok().body(new SuccessResponse(resultMap)); } 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")); @@ -190,23 +229,43 @@ public class BasFlightController { return ResponseEntity.ok().body(new SuccessResponse<>(resultMap)); } - // 비행계획서 삭제 + /** + * 비행계획서 삭제하는 기능, + * 비행계획서 고유번호[planSno]로 삭제함. + * @param planSno + * @return + */ @DeleteMapping(value = "/plan/delete/{planSno}") - @ApiOperation(value = "비행계획서 삭제") - @Tag(name = "비행계획서", description = "비행계획서 관련 API") - @ApiImplicitParam(name = "planSno", value = "비행계획서일련번호", dataTypeClass = Integer.class) +// @ApiOperation(value = "비행계획서 삭제") +// @Tag(name = "비행계획서", description = "비행계획서 관련 API") +// @ApiImplicitParam(name = "planSno", value = "비행계획서일련번호", dataTypeClass = Integer.class) public ResponseEntity deletePlan(@PathVariable("planSno") Integer planSno) { Map resultMap = new HashMap(); try { - boolean result = basFlightService.deletePlan(planSno); + boolean result = basFlightService.deletePlan(planSno); // 비행계획서 고유번호[planSno]로 비행계획서 삭제하는 기능. resultMap.put("result", result); } catch (CustomException e) { + /** + * try{ + ... + } + * try 영역 안 코드들중 문제가 생기면 오는 곳. + * CustomException은 개발자가 "의도적으로" 낸 예외처리, + * log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌 + */ log.error("IGNORE : {}", e); resultMap.put("result", false); resultMap.put("errorCode", e.getErrorCode()); return ResponseEntity.ok().body(new SuccessResponse(resultMap)); } 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")); @@ -215,17 +274,29 @@ public class BasFlightController { return ResponseEntity.ok().body(new SuccessResponse<>(resultMap)); } - // 그룹 조종사 조회 + /** + * 그룹 조종사 조회하는 기능 + * 그룹아이디[groupId]로 조회함. + * @param groupId + * @return + */ @GetMapping(value = "/plan/pilot/{groupId}") - @ApiOperation(value = "그룹의 조종사 조회") - @Tag(name = "비행계획서", description = "비행계획서 관련 API") - @ApiImplicitParam(name = "groupId", value = "그룹ID", dataTypeClass = String.class) +// @ApiOperation(value = "그룹의 조종사 조회") +// @Tag(name = "비행계획서", description = "비행계획서 관련 API") +// @ApiImplicitParam(name = "groupId", value = "그룹ID", dataTypeClass = String.class) public ResponseEntity findPilot(@PathVariable("groupId") String groupId) { List result = null; try { - result = basFlightService.listPilotByGroup(groupId); + result = basFlightService.listPilotByGroup(groupId); // 그룹아이디[groupId]로 그룹 조종사 조회하는 기능. } 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")); @@ -235,16 +306,28 @@ public class BasFlightController { } - // 그룹 기체 조회 + /** + * 그룹 기체 조회하는 기능, + * 그룹아이디[groupId]로 조회함. + * @param groupId + * @return + */ @GetMapping(value = "/plan/arcrft/{groupId}") - @ApiOperation(value = "그룹의 기체 조회") - @Tag(name = "비행계획서", description = "비행계획서 관련 API") - @ApiImplicitParam(name = "groupId", value = "그룹ID", dataTypeClass = String.class) +// @ApiOperation(value = "그룹의 기체 조회") +// @Tag(name = "비행계획서", description = "비행계획서 관련 API") +// @ApiImplicitParam(name = "groupId", value = "그룹ID", dataTypeClass = String.class) public ResponseEntity findArcrft(@PathVariable("groupId") String groupId) { List result = null; try { - result = basFlightService.listArcrftByGroup(groupId); + result = basFlightService.listArcrftByGroup(groupId); // 그룹아이디[groupId]로 그룹 기체 조회하는 기능. } 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")); @@ -254,15 +337,26 @@ public class BasFlightController { } - // 비행 구역 버퍼 존 생성 + /** + * 비행 구역 버퍼 존 생성하는 기능 + * @param rq + * @return + */ @PostMapping("/plan/area/buffer") - @ApiOperation(value = "비행 구역 버퍼 존 생성") - @Tag(name = "비행계획서", description = "비행계획서 관련 API") +// @ApiOperation(value = "비행 구역 버퍼 존 생성") +// @Tag(name = "비행계획서", description = "비행계획서 관련 API") public ResponseEntity findBuffer(@RequestBody List rq) { List rs = null; try { - rs = basFlightService.getBuffer(rq); + rs = basFlightService.getBuffer(rq); // 비행 구역 buffer zone 생성하는 기능. } 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")); @@ -271,15 +365,27 @@ public class BasFlightController { return ResponseEntity.ok().body(new SuccessResponse<>(rs)); } + /** + * 비행계획서 날씨 확인하는 기능. + * @param rq + * @return + */ @GetMapping("/plan/api/weather") - @ApiOperation(value = "비행계획서 날씨") - @Tag(name = "비행계획서", description = "비행계획서 관련 API") +// @ApiOperation(value = "비행계획서 날씨") +// @Tag(name = "비행계획서", description = "비행계획서 관련 API") public ResponseEntity restApiGetWeather(BasFlightWeatherModel rq) { JSONObject jsonObject = null; try { - jsonObject = basFlightService.getWeather(rq); + jsonObject = basFlightService.getWeather(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")); @@ -289,15 +395,27 @@ public class BasFlightController { return ResponseEntity.ok().body(new SuccessResponse<>(jsonObject)); } - // 비행계획서 리스트(승인) + /** + * 비행계획서 리스트(승인)를 조회하는 기능, + * 입력받은 값으로 승인관련된 비행계획서 리스트를 조회함. + * @param rq + * @return + */ @GetMapping(value = "/aprv/list") - @ApiOperation(value = "비행계획서 리스트(승인)") - @Tag(name = "비행계획서", description = "비행계획서 관련 API") +// @ApiOperation(value = "비행계획서 리스트(승인)") +// @Tag(name = "비행계획서", description = "비행계획서 관련 API") public ResponseEntity findAprvList(BasFlightPlanListRq rq) { ComnPagingRs result = null; try { - result = basFlightService.aprvList(rq); + result = basFlightService.aprvList(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")); @@ -306,22 +424,42 @@ public class BasFlightController { return ResponseEntity.ok().body(new SuccessResponse<>(result)); } - // 비행계획서 승인/미승인 + /** + * 비행계획서 승인/미승인 하는 기능, + * BasFlightAprovRq에 있는 값을 토대로 승인/미승인 함. + * @param rq + * @return + */ @PutMapping(value = "/aprv/proc") - @ApiOperation(value = "비행 계획서 승인/미승인") - @Tag(name = "비행계획서", description = "비행계획서 관련 API") +// @ApiOperation(value = "비행 계획서 승인/미승인") +// @Tag(name = "비행계획서", description = "비행계획서 관련 API") public ResponseEntity updateAprvProc(@RequestBody BasFlightAprovRq rq) { Map resultMap = new HashMap(); try { - int result = basFlightService.aprovePlan(rq); + int result = basFlightService.aprovePlan(rq); // 비행계획서 승인/미승인하는 기능. resultMap.put("result", result); } catch (CustomException e) { + /** + * try{ + ... + } + * try 영역 안 코드들중 문제가 생기면 오는 곳. + * CustomException은 개발자가 "의도적으로" 낸 예외처리, + * log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌 + */ log.error("IGNORE : {}", e); resultMap.put("result", false); resultMap.put("errorCode", e.getErrorCode()); return ResponseEntity.ok().body(new SuccessResponse(resultMap)); } 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")); @@ -331,15 +469,27 @@ public class BasFlightController { } + /** + * 비행경로 체크하는 기능. + * @param rq + * @return + */ @PostMapping("/airspace/contains") - @Tag(name = "비행계획서", description = "비행계획서 관련 API") +// @Tag(name = "비행계획서", description = "비행계획서 관련 API") public ResponseEntity checkAirspaceContains(@RequestBody List rq) { Map resultMap = new HashMap(); try { - boolean result = basFlightService.checkAirspaceContains(rq); + boolean result = basFlightService.checkAirspaceContains(rq); // 비행경로 체크하는 기능. resultMap.put("result", result); } 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")); @@ -349,15 +499,21 @@ public class BasFlightController { } - //지역 검색 + /** + * 지역 검색하는 기능. + * @param query + * @return + * @throws ParseException + */ @GetMapping("/plan/area/search") - @ApiOperation(value = "지역 검색") - @Tag(name = "비행계획서", description = "비행계획서 관련 API") +// @ApiOperation(value = "지역 검색") +// @Tag(name = "비행계획서", description = "비행계획서 관련 API") public ResponseEntity searchArea(String query) throws ParseException { String text = null; try { text = URLEncoder.encode(query, "UTF-8"); } catch (UnsupportedEncodingException e) { + // UTF-8 포맷팅으로 인코딩 실패시 에러 던짐 throw new RuntimeException("검색어 인코딩 실패", e); } @@ -373,16 +529,29 @@ public class BasFlightController { return ResponseEntity.ok().body(new SuccessResponse<>(obj)); } + /** + * 비행계획서 스케줄 검색하는 기능, + * 검색일[searchDate] 조건으로 조회함. + * @param searchDate + * @return + */ @GetMapping("/schedule") - @Tag(name = "비행계획서", description = "비행계획서 관련 API") +// @Tag(name = "비행계획서", description = "비행계획서 관련 API") public ResponseEntity findSchedule(@RequestParam("searchDate") String searchDate) { List response; try { - response = basFlightService.findSchecdule(searchDate); + response = basFlightService.findSchecdule(searchDate); // 검색날짜 조건으로 비행스케줄 조회하는 기능. } 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")); @@ -391,10 +560,15 @@ public class BasFlightController { return ResponseEntity.ok().body(new SuccessResponse(response)); } -// @PostMapping("/coord") -// public JSONObject coordTest(@RequestBody Coordinate coordinate) throws IOException, ParseException { -// -// return FlightUtils.getCoordinateGis(coordinate); -// -// } + @PostMapping("/adex/buffer") + public List adexBuffer(@RequestBody BasFlightCoordModel model) { + + List transCoordList = utils.transform(model.getCoordinates(), "EPSG:4326", "EPSG:5181"); + + List bufferList = utils.buffer(transCoordList, model.getBuffer()); // buffer 영역 생성 + + List transBufferList = utils.transform(bufferList, "EPSG:5181", "EPSG:4326"); // buffer 영역 좌표계 변환 + + return transBufferList; + } } \ No newline at end of file diff --git a/pav-server/src/main/java/com/palnet/biz/api/bas/flight/model/BasFlightCoordModel.java b/pav-server/src/main/java/com/palnet/biz/api/bas/flight/model/BasFlightCoordModel.java new file mode 100644 index 00000000..7079caaa --- /dev/null +++ b/pav-server/src/main/java/com/palnet/biz/api/bas/flight/model/BasFlightCoordModel.java @@ -0,0 +1,15 @@ +package com.palnet.biz.api.bas.flight.model; + +import java.util.List; + +import org.locationtech.jts.geom.Coordinate; + +import lombok.Data; + +@Data +public class BasFlightCoordModel { + + private List coordinates; + + private Double buffer; +} diff --git a/pav-server/src/main/java/com/palnet/biz/api/bas/flight/model/BasFlightPlanAreaModel.java b/pav-server/src/main/java/com/palnet/biz/api/bas/flight/model/BasFlightPlanAreaModel.java index 4824a4a3..0dd4652c 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/bas/flight/model/BasFlightPlanAreaModel.java +++ b/pav-server/src/main/java/com/palnet/biz/api/bas/flight/model/BasFlightPlanAreaModel.java @@ -1,6 +1,5 @@ package com.palnet.biz.api.bas.flight.model; -import com.palnet.biz.jpa.entity.type.FltMethod; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -32,22 +31,5 @@ public class BasFlightPlanAreaModel { // kac 추가 필드 private String fltMothoeRm; -// public BasFlightPlanAreaModel(Integer planAreaSno, Integer planSno, String areaType, FltMethod fltMethod, String fltAreaAddr, Integer bufferZone, String fltElev, String createUserId, Instant createDt, String updateUserId, Instant updateDt, String docState, List coordList, List bufferCoordList, String fltMothoeRm) { -// this.planAreaSno = planAreaSno; -// this.planSno = planSno; -// this.areaType = areaType; -// this.fltMethod = fltMethod.getCode(); -// this.fltMethodNm = fltMethod.getValue(); -// this.fltAreaAddr = fltAreaAddr; -// this.bufferZone = bufferZone; -// this.fltElev = fltElev; -// this.createUserId = createUserId; -// this.createDt = createDt; -// this.updateUserId = updateUserId; -// this.updateDt = updateDt; -// this.docState = docState; -// this.coordList = coordList; -// this.bufferCoordList = bufferCoordList; -// this.fltMothoeRm = fltMothoeRm; -// } + } diff --git a/pav-server/src/main/java/com/palnet/biz/api/bas/flight/service/BasFlightService.java b/pav-server/src/main/java/com/palnet/biz/api/bas/flight/service/BasFlightService.java index 7fb263a2..3ffa1ac1 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/bas/flight/service/BasFlightService.java +++ b/pav-server/src/main/java/com/palnet/biz/api/bas/flight/service/BasFlightService.java @@ -73,7 +73,11 @@ public class BasFlightService { private final AreaUtils areaUtils; - // 비행계획서 조회 + /** + * 비행계획서 조회하는 기능 + * @param rq + * @return + */ public ComnPagingRs listPlan(BasFlightPlanListRq rq) { List groupList = ptyPlanQueryRepository.joinList(rq.getCstmrSno()); String userAccount = null; @@ -97,8 +101,11 @@ public class BasFlightService { } else { masterAccount = "NORMAL"; } + + // 데이터베이스에서 조건에 따라 비행계획서를 조회함. PageImpl result = fltPlanQueryRepository.listPlan(rq, masterAccount, pageable); + // 데이터베이스에서 조건에 따라 비행계획서를 조회하고 그 사이즈를 가져옴. long total = fltPlanQueryRepository.listPlanCount(rq, masterAccount); long totalPage = total % rq.getRecord() > 0 ? (total / rq.getRecord()) + 1 : total / rq.getRecord(); @@ -111,7 +118,11 @@ public class BasFlightService { return response; } - // 비행계획서 상세 조회 + /** + * 비행계획서 고유번호[planSno]로 상세 조회하는 기능. + * @param planSno + * @return + */ public BasFlightPlanModel detailPlan(Integer planSno) { BasFlightPlanModel rs = new BasFlightPlanModel(); // 비행계획서 @@ -155,6 +166,10 @@ public class BasFlightService { return rs; } + /** + * 비행계획서 유효하는지 확인하는 기능. + * @param rq + */ public void planValid(BasFlightPlanModel rq) { boolean isEqualsFltElev = false; @@ -269,7 +284,11 @@ public class BasFlightService { } } - // 비행계획서 등록 + /** + * 입력받은 값으로 비행계획서 등록하는 기능. + * @param rq + * @return + */ @Transactional public boolean createPlan(BasFlightPlanModel rq) { @@ -335,7 +354,11 @@ public class BasFlightService { return true; } - // 비행계획서 수정 + /** + * 입력받은 값으로 비행계획서 수정하는 기능. + * @param rq + * @return + */ @Transactional public boolean updatePlan(BasFlightPlanModel rq) { @@ -461,7 +484,11 @@ public class BasFlightService { return true; } - // 비행계획서 삭제 + /** + * 비행계획서 고유번호[planSno]로 비행계획서 삭제하는 기능. + * @param planSno + * @return + */ @Transactional public boolean deletePlan(Integer planSno) { FltPlanBas planEntity = fltPlanBasRepository.findById(planSno).orElseThrow(); @@ -471,7 +498,11 @@ public class BasFlightService { } - // 그룹 조종사 조회 + /** + * 그룹아이디[groupId]로 그룹 조종사 조회하는 기능. + * @param groupId + * @return + */ public List listPilotByGroup(String groupId) { List pilotList = fltPlanQueryRepository.listPilot(groupId); @@ -493,7 +524,11 @@ public class BasFlightService { return pilotList; } - // 그룹 기체 조회 + /** + * 그룹아이디[groupId]로 그룹 기체 조회하는 기능. + * @param groupId + * @return + */ public List listArcrftByGroup(String groupId) { List arcrftModels = fltPlanQueryRepository.listArcrft(groupId); @@ -502,7 +537,11 @@ public class BasFlightService { return arcrftModels; } - // 비행 구역 buffer zone + /** + * 비행 구역 buffer zone 생성하는 기능. + * @param rq + * @return + */ public List getBuffer(List rq) { for (BasFlightPlanAreaModel area : rq) { @@ -523,7 +562,11 @@ public class BasFlightService { return rq; } - // 비행계획서 리스트(승인) + /** + * 비행계획서 리스트(승인)를 조회하는 기능. + * @param rq + * @return + */ public ComnPagingRs aprvList(BasFlightPlanListRq rq) { String appAuth = jwtTokenUtil.getUserAuthByToken(); @@ -544,6 +587,8 @@ public class BasFlightService { } } } + + // 유저의 권한을 확인하는 로직 if (appAuth.equals("SUPER") || appAuth.equals("ADMIN")) { masterAccount = "ADMIN"; } else if (userAccount.equals("MASTER") || userAccount.equals("LEADER")) { @@ -551,9 +596,9 @@ public class BasFlightService { } else { masterAccount = "NORMAL"; } - PageImpl result = fltPlanQueryRepository.aprvList(rq, masterAccount, pageable); + PageImpl result = fltPlanQueryRepository.aprvList(rq, masterAccount, pageable); // 승인관련된 비행계획서를 조회하는 기능. - long total = fltPlanQueryRepository.aprvCount(rq, masterAccount); + long total = fltPlanQueryRepository.aprvCount(rq, masterAccount); // 승인관련된 비행계획서의 갯수를 조회하는 기능. long totalPage = total % rq.getRecord() > 0 ? (total / rq.getRecord()) + 1 : total / rq.getRecord(); @@ -565,13 +610,22 @@ public class BasFlightService { return response; } - // 비행계획서 승인/미승인 + /** + * 비행계획서 승인/미승인하는 기능. + * @param rq + * @return + */ @Transactional public int aprovePlan(BasFlightAprovRq rq) { int cnt = fltPlanBasRepository.updateAprvlYnByPlanSnoIn(rq.getPlanSnoList(), rq.getAprvlYn()); return cnt; } + /** + * 비행경로 체크하는 기능. + * @param rq + * @return + */ public boolean checkAirspaceContains(List rq) { boolean result = false; @@ -599,7 +653,12 @@ public class BasFlightService { } - //지역 검색 + /** + * 지역 검색하는 기능 + * @param apiUrl + * @param requestHeaders + * @return + */ public String searchArea(String apiUrl, Map requestHeaders) { HttpURLConnection con = connect(apiUrl); try { @@ -649,6 +708,11 @@ public class BasFlightService { } } + /** + * 검색날짜 조건으로 비행스케줄 조회하는 기능. + * @param searchDate + * @return + */ public List findSchecdule(String searchDate) { List schedule = fltPlanQueryRepository.findSchedule(searchDate); @@ -656,8 +720,17 @@ public class BasFlightService { return schedule; } + /** + * 지역과 날씨에 대한 정보를 얻는 기능. + * @param rq + * @return + * @throws IOException + * @throws ParseException + */ public JSONObject getWeather(BasFlightWeatherModel rq) throws IOException, ParseException { - StringBuilder urlBuilder = new StringBuilder(weatherUrl); + + + StringBuilder urlBuilder = new StringBuilder(weatherUrl); // weather.api.url[application.yml 파일] 에 있는 URL로 날씨 관련 요청을 보냄 urlBuilder.append("?" + URLEncoder.encode("serviceKey", "UTF-8") + weatherKey); urlBuilder.append("&" + URLEncoder.encode("pageNo", "UTF-8") + "=" + URLEncoder.encode(rq.getPageNo(), "UTF-8")); urlBuilder.append("&" + URLEncoder.encode("numOfRows", "UTF-8") + "=" + URLEncoder.encode(rq.getNumOfRows(), "UTF-8")); /*한 페이지 결과 수*/ @@ -684,7 +757,7 @@ public class BasFlightService { sb.append(line); } - CtrTrnsLctnModel weatherResult = ctrTrnsLctnService.convertLatlonToAddress(rq.getNx2(), rq.getNy2()); + CtrTrnsLctnModel weatherResult = ctrTrnsLctnService.convertLatlonToAddress(rq.getNx2(), rq.getNy2()); // 위치에 맞는 값에 대한 주소로 변환하는 기능. log.info("weatherResult >>>> : {}", weatherResult); diff --git a/pav-server/src/main/java/com/palnet/biz/api/bas/group/controller/BasGroupAprvController.java b/pav-server/src/main/java/com/palnet/biz/api/bas/group/controller/BasGroupAprvController.java index 1848c94d..5d713068 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/bas/group/controller/BasGroupAprvController.java +++ b/pav-server/src/main/java/com/palnet/biz/api/bas/group/controller/BasGroupAprvController.java @@ -1,22 +1,8 @@ package com.palnet.biz.api.bas.group.controller; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; -import org.springframework.util.StringUtils; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - import com.palnet.biz.api.bas.group.model.BasGroupAprvModel; import com.palnet.biz.api.bas.group.model.BasGroupAprvRqModel; +import com.palnet.biz.api.bas.group.model.BasGroupAprvlUpdateRQ; import com.palnet.biz.api.bas.group.service.BasGroupAprvService; import com.palnet.biz.api.comn.model.ComnPagingRs; import com.palnet.biz.api.comn.response.BasicResponse; @@ -24,16 +10,27 @@ import com.palnet.biz.api.comn.response.ErrorResponse; import com.palnet.biz.api.comn.response.SuccessResponse; import com.palnet.comn.code.RSErrorCode; -import io.swagger.annotations.ApiOperation; +import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; -@Log4j2 +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.util.StringUtils; +import org.springframework.web.bind.annotation.*; + +import java.util.HashMap; +import java.util.Map; + +@Slf4j @RestController @RequiredArgsConstructor @RequestMapping(value = "/api/bas/group/aprv", produces = {MediaType.APPLICATION_JSON_VALUE}) -@Tag(name = "그룹 승인 컨트롤러", description = "그룹 가입 승인 관련 API") +@Tag(name = "그룹 승인", description = "그룹 가입 승인 관련 API") public class BasGroupAprvController { @Autowired @@ -45,8 +42,7 @@ public class BasGroupAprvController { * @return */ @GetMapping(value = "/list") - @ApiOperation(value = "승인요청 조회") - @Tag(name = "그룹 승인 컨트롤러", description = "그룹 가입 승인 관련 API") + @Operation(summary = "승인요청 조회", description = "그룹내에 그룹회원들의 승인항목들을 조회합니다.") public ResponseEntity list(BasGroupAprvRqModel rq) { ComnPagingRs result = null; // log.debug(">>>>" + rq.toString()); @@ -76,18 +72,25 @@ public class BasGroupAprvController { * @return */ @PutMapping(value = "/update") - @ApiOperation(value = "승인처리 / 승인취소 처리") - @Tag(name = "그룹 승인 컨트롤러", description = "그룹 가입 승인 관련 API") - public ResponseEntity update(@RequestBody BasGroupAprvModel rq) { + @Operation(summary = "승인처리", description = "그룹내에 그룹회원들의 승인처리를 진행합니다. [승인/미승인 처리]") +// @ApiOperation(value = "승인처리 / 승인취소 처리") +// @Tag(name = "그룹 승인 컨트롤러", description = "그룹 가입 승인 관련 API") + public ResponseEntity update(@RequestBody BasGroupAprvlUpdateRQ rq) { Map resultMap = new HashMap(); + BasGroupAprvModel model = new BasGroupAprvModel(); + BeanUtils.copyProperties(rq, model); + + log.warn("model => {}", model); + + if(StringUtils.isEmpty(rq.getCstmrGroupSno())) { return ResponseEntity.status(HttpStatus.OK) .body(new ErrorResponse(RSErrorCode.ER_PARAM)); } try { - boolean result = service.update(rq); + boolean result = service.update(model); resultMap.put("result", result); diff --git a/pav-server/src/main/java/com/palnet/biz/api/bas/group/controller/BasGroupController.java b/pav-server/src/main/java/com/palnet/biz/api/bas/group/controller/BasGroupController.java index 076ffb31..8b0462fe 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/bas/group/controller/BasGroupController.java +++ b/pav-server/src/main/java/com/palnet/biz/api/bas/group/controller/BasGroupController.java @@ -1,61 +1,62 @@ package com.palnet.biz.api.bas.group.controller; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import io.swagger.annotations.ApiImplicitParam; -import io.swagger.annotations.ApiOperation; -import io.swagger.v3.oas.annotations.tags.Tag; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; -import org.springframework.util.StringUtils; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import com.palnet.biz.api.bas.group.model.BasGroupJoinModel; -import com.palnet.biz.api.bas.group.model.BasGroupModel; -import com.palnet.biz.api.bas.group.model.BasGroupRqModel; +import com.palnet.biz.api.bas.group.model.*; import com.palnet.biz.api.bas.group.service.BasGroupService; import com.palnet.biz.api.comn.response.BasicResponse; import com.palnet.biz.api.comn.response.ErrorResponse; import com.palnet.biz.api.comn.response.SuccessResponse; import com.palnet.comn.code.RSErrorCode; import com.palnet.comn.exception.CustomException; - +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.enums.ParameterIn; +import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; import lombok.extern.log4j.Log4j2; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.util.StringUtils; +import org.springframework.web.bind.annotation.*; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; @Log4j2 @RestController @RequiredArgsConstructor @RequestMapping(value = "/api/bas/group", produces = {MediaType.APPLICATION_JSON_VALUE}) -@Tag(name = "그룹 컨트롤러", description = "그룹 관련 API") +@Tag(name = "그룹", description = "그룹 관련 API") public class BasGroupController { @Autowired private final BasGroupService service; + /** + * 그룹코드 생성 + * @return + */ @GetMapping(value = "/createid") - @ApiOperation(value = "그룹코드 생성") - @Tag(name = "그룹 컨트롤러", description = "그룹 관련 API") + @Operation(summary = "그룹코드 생성", description = "그룹코드를 랜덤으로 생성하는 기능입니다.") public ResponseEntity createid() { Map resultMap = new HashMap(); try { - String result = service.createid(); + String result = service.createid(); // 그룹코드를 생성하는 기능 resultMap.put("result", result); } 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")); @@ -66,30 +67,37 @@ public class BasGroupController { } /** - * 나의 그룹 목록 조회 + * 내가 만든 그룹 목록조회하는 기능. + * 고객고유번호[cstmrSno]로 내가 만든 그룹을 조회함. * @param rq * @return */ @GetMapping(value = "/mylist") - @ApiOperation(value = "나의 그룹 목록 조회") - @Tag(name = "그룹 컨트롤러", description = "그룹 관련 API") - @ApiImplicitParam(name = "cstmrSno",value = "고객일련번호", dataTypeClass = Integer.class) - public ResponseEntity mylist(Integer cstmrSno) { + @Operation(summary = "내가 생성한 그룹조회", description = "내가 생성한 그룹을 조회하는 기능입니다.") + public ResponseEntity mylist(@Parameter(name="cstmrSno", description = "회원일련번호", in = ParameterIn.QUERY, example = "2") Integer cstmrSno) { List result = null; - log.debug("Param : " + cstmrSno); - - //입력값 검증 + log.debug("Param : {}", cstmrSno); + + // 고객고유번호[cstmrSno]값 입력값 검증처리 if(StringUtils.isEmpty(cstmrSno)) { - return ResponseEntity.status(HttpStatus.OK) + // 검증통과하지 못할 시 서버에서 "의도적인" 에러 반환 + return ResponseEntity.status(HttpStatus.OK) // "의도적인" 에러 반환코드 .body(new ErrorResponse(RSErrorCode.ER_PARAM)); } try { - result = service.mylist(cstmrSno); + result = service.mylist(cstmrSno); // 나의 그룹 목록조회하는 기능. } 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")); @@ -100,29 +108,36 @@ public class BasGroupController { } /** - * 나의 그룹 - 참여 그룹 목록 조회 + * 나의 그룹 - 참여 그룹 목록 조회하는 기능, + * 고객고유번호[cstmrSno]로 나의 그룹을 조회함. * @param rq * @return */ @GetMapping(value = "/joinlist") - @ApiOperation(value = "나의 그룹 - 참여 그룹 목록 조회") - @Tag(name = "그룹 컨트롤러", description = "그룹 관련 API") - @ApiImplicitParam(name = "cstmrSno",value = "고객일련번호", dataTypeClass = Integer.class) - public ResponseEntity joinList(Integer cstmrSno) { + @Operation(summary = "내가 참여한 그룹조회", description = "내가 참여한 그룹을 조회하는 기능입니다.") + public ResponseEntity joinList(@Parameter(name="cstmrSno", description = "회원일련번호", in = ParameterIn.QUERY, example = "2") Integer cstmrSno) { List result = null; - //입력값 검증 + // 고객고유번호[cstmrSno]값 입력값 검증처리 if(StringUtils.isEmpty(cstmrSno)) { - return ResponseEntity.status(HttpStatus.OK) + // 검증통과하지 못할 시 서버에서 "의도적인" 에러 반환 + return ResponseEntity.status(HttpStatus.OK) // "의도적인" 에러 반환코드 .body(new ErrorResponse(RSErrorCode.ER_PARAM)); } try { - result = service.joinList(cstmrSno); + result = service.joinList(cstmrSno); // 나의 그룹 - 참여 그룹 목록을 조회하는 기능. } 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")); @@ -133,29 +148,35 @@ public class BasGroupController { } /** - * 그룹 목록 조회 + * 그룹 목록 조회하는 기능 * @param rq * @return */ @GetMapping(value = "/grouplist") - @ApiOperation(value = "그룹 목록 조회") - @Tag(name = "그룹 컨트롤러", description = "그룹 관련 API") - @ApiImplicitParam(name = "cstmrSno",value = "고객일련번호", dataTypeClass = Integer.class) - public ResponseEntity grouplist(Integer cstmrSno) { + @Operation(summary = "그룹조회", description = "나와 관련된 모든 그룹을 조회하는 기능입니다.") + public ResponseEntity grouplist(@Parameter(name="cstmrSno", description = "회원일련번호", in = ParameterIn.QUERY, example = "2") Integer cstmrSno) { List result = null; - //입력값 검증 + // 고객고유번호[cstmrSno]값 입력값 검증처리 if(StringUtils.isEmpty(cstmrSno)) { - return ResponseEntity.status(HttpStatus.OK) + // 검증통과하지 못할 시 서버에서 "의도적인" 에러 반환 + return ResponseEntity.status(HttpStatus.OK) // "의도적인" 에러 반환코드 .body(new ErrorResponse(RSErrorCode.ER_PARAM)); } try { - result = service.groupList(cstmrSno); + result = service.groupList(cstmrSno); // 그룹 목록조회하는 기능 } 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")); @@ -166,21 +187,28 @@ public class BasGroupController { } /** - * 전체 그룹 목록 조회 + * 전체 그룹 목록 조회하는 기능, + * BasGroupRqModel 모델 값에 따라 조회하는 기능. * @param rq * @return */ @GetMapping(value = "/list") - @ApiOperation(value = "전체 그룹 목록 조회") - @Tag(name = "그룹 컨트롤러", description = "그룹 관련 API") + @Operation(summary = "전체그룹 검색 조회", description = "검색조건에 맞춰 모든 그룹을 조회하는 기능입니다.") public ResponseEntity list(BasGroupRqModel rq) { List result = null; 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")); @@ -191,21 +219,27 @@ public class BasGroupController { } /** - * 그룹 상세 조회 + * 그룹 상세 조회하는 기능, + * 그룹아이디[groupId]로 조회함. * @param id * @return */ @GetMapping(value = "/detail/{id}") - @ApiOperation(value = "그룹 상세 조회") - @Tag(name = "그룹 컨트롤러", description = "그룹 관련 API") - @ApiImplicitParam(name = "id",value = "그룹ID", dataTypeClass = String.class) - public ResponseEntity detail(@PathVariable String id) { + @Operation(summary = "그룹 상세조회", description = "그룹코드로 그룹에 대해 상세히 조회합니다.") + public ResponseEntity detail(@Parameter(name="id", description = "그룹코드", in = ParameterIn.PATH, example = "C807F9") @PathVariable String id) { BasGroupModel result = null; try { - result = service.detail(id); + result = service.detail(id); // 그룹아이디[groupId]로 상세 조회하는 기능 } 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")); @@ -217,22 +251,33 @@ public class BasGroupController { /** - * 그룹 생성 + * 그룹 생성하는 기능, + * BasGroupModel 모델에 입력받은 값으로 그룹 생성. * @return * @throws Exception */ @PostMapping(value = "/create") - @ApiOperation(value = "그룹 생성") - @Tag(name = "그룹 컨트롤러", description = "그룹 관련 API") - public ResponseEntity create(@RequestBody BasGroupModel rq) throws Exception { + @Operation(summary = "그룹 생성", description = "그룹을 생성합니다.") + public ResponseEntity create(@RequestBody BasGroupInsertRQ rq) throws Exception { Map resultMap = new HashMap(); + BasGroupModel model = new BasGroupModel(); + BeanUtils.copyProperties(rq, model); + try { - boolean result = service.create(rq); - + boolean result = service.create(model); // 그룹 생성하는 기능 + resultMap.put("result", result); } catch (CustomException e) { + /** + * try{ + ... + } + * try 영역 안 코드들중 문제가 생기면 오는 곳. + * CustomException은 개발자가 "의도적으로" 낸 예외처리, + * log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌 + */ log.error("IGNORE : {}", e); resultMap.put("result", false); resultMap.put("errorCode", e.getErrorCode()); @@ -244,19 +289,22 @@ public class BasGroupController { } /** - * 그룹 수정 + * 그룹 수정하는 기능, + * BasGroupModel 모델에 입력받은 값으로 그룹 수정. * @return * @throws Exception */ @PutMapping(value = "/update") - @ApiOperation(value = "그룹 수정") - @Tag(name = "그룹 컨트롤러", description = "그룹 관련 API") - public ResponseEntity update(@RequestBody BasGroupModel rq) throws Exception { + @Operation(summary = "그룹 수정", description = "그룹의 내용을 수정합니다.") + public ResponseEntity update(@RequestBody BasGroupUpdateRQ rq) throws Exception { Map resultMap = new HashMap(); - + + BasGroupModel model = new BasGroupModel(); + BeanUtils.copyProperties(rq, model); + try { - boolean result = service.update(rq); - + boolean result = service.update(model); // 그룹 수정하는 기능 + resultMap.put("result", result); // } catch (Exception e) { @@ -266,6 +314,14 @@ public class BasGroupController { // // } } catch (CustomException e) { + /** + * try{ + ... + } + * try 영역 안 코드들중 문제가 생기면 오는 곳. + * CustomException은 개발자가 "의도적으로" 낸 예외처리, + * log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌 + */ log.error("IGNORE : {}", e); resultMap.put("result", false); resultMap.put("errorCode", e.getErrorCode()); @@ -277,23 +333,32 @@ public class BasGroupController { } /** - * 그룹 삭제 + * 그룹 삭제하는 기능, + * 그룹아이디[groupId]로 삭제함. * @param id * @return */ @DeleteMapping(value = "/delete/{id}") - @ApiOperation(value = "그룹 삭제") - @Tag(name = "그룹 컨트롤러", description = "그룹 관련 API") - @ApiImplicitParam(name = "id",value = "그룹ID", dataTypeClass = String.class) - public ResponseEntity delete(@PathVariable String id) { + @Operation(summary = "그룹 삭제", description = "그룹의 내용을 삭제합니다.") +// @ApiOperation(value = "그룹 삭제") +// @Tag(name = "그룹 컨트롤러", description = "그룹 관련 API") +// @ApiImplicitParam(name = "id",value = "그룹ID", dataTypeClass = String.class) + public ResponseEntity delete(@Parameter(name="id", description = "그룹코드", in = ParameterIn.PATH, example = "HDU123") @PathVariable String id) { Map resultMap = new HashMap(); try { - boolean result = service.delete(id); + boolean result = service.delete(id); // 그룹아이디[groupId]로 삭제하는 기능 resultMap.put("result", result); } 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/bas/group/controller/BasGroupJoinController.java b/pav-server/src/main/java/com/palnet/biz/api/bas/group/controller/BasGroupJoinController.java index 102db384..1816d1ad 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/bas/group/controller/BasGroupJoinController.java +++ b/pav-server/src/main/java/com/palnet/biz/api/bas/group/controller/BasGroupJoinController.java @@ -1,39 +1,37 @@ package com.palnet.biz.api.bas.group.controller; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import io.swagger.annotations.ApiOperation; -import io.swagger.v3.oas.annotations.tags.Tag; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; -import org.springframework.util.StringUtils; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - +import com.palnet.biz.api.bas.group.model.BasGroupJoinInsertRQ; import com.palnet.biz.api.bas.group.model.BasGroupJoinModel; import com.palnet.biz.api.bas.group.model.BasGroupJoinRqModel; +import com.palnet.biz.api.bas.group.model.BasGroupJoinUpdateRQ; import com.palnet.biz.api.bas.group.service.BasGroupJoinService; import com.palnet.biz.api.comn.response.BasicResponse; import com.palnet.biz.api.comn.response.ErrorResponse; import com.palnet.biz.api.comn.response.SuccessResponse; import com.palnet.comn.code.RSErrorCode; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; -@Log4j2 +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.util.StringUtils; +import org.springframework.web.bind.annotation.*; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Slf4j @RestController @RequiredArgsConstructor @RequestMapping(value = "/api/bas/group/join", produces = {MediaType.APPLICATION_JSON_VALUE}) -@Tag(name = "그룹 참여 컨트롤러", description = "그룹 참여 관련 API") +@Tag(name = "그룹 참여", description = "그룹 참여 관련 API") public class BasGroupJoinController { @Autowired @@ -41,8 +39,7 @@ public class BasGroupJoinController { @GetMapping(value = "/list") - @ApiOperation(value = "참여한 그룹 목록 조회") - @Tag(name = "그룹 참여 컨트롤러", description = "그룹 참여 관련 API") + @Operation(summary = "내가 가입할 그룹목록 조회", description = "조건에 맞춰 참여할 그룹목록을 조회할 수 있습니다.") public ResponseEntity list(BasGroupJoinRqModel rq) { List result = null; @@ -67,13 +64,16 @@ public class BasGroupJoinController { @PostMapping(value = "/create") - @ApiOperation(value = "그룹 가입 요청") - @Tag(name = "그룹 참여 컨트롤러", description = "그룹 참여 관련 API") - public ResponseEntity create(@RequestBody BasGroupJoinModel rq) { + @Operation(summary = "그룹 가입요청", description = "다른 그룹에 가입요청을 할 수 있습니다. [예제값은 이미 가입요청 되어있을 수도 있으니 다른 값으로 가입요청해주세요.]") + public ResponseEntity create(@RequestBody BasGroupJoinInsertRQ rq) { Map resultMap = new HashMap(); - + + BasGroupJoinModel model = new BasGroupJoinModel(); + BeanUtils.copyProperties(rq, model); + + try { - boolean result = service.create(rq); + boolean result = service.create(model); resultMap.put("result", result); @@ -88,10 +88,14 @@ public class BasGroupJoinController { } @PutMapping(value = "/update") - @ApiOperation(value = "그룹 가입 승인/미승인") - @Tag(name = "그룹 참여 컨트롤러", description = "그룹 참여 관련 API") - public ResponseEntity update(@RequestBody BasGroupJoinModel rq) { + @Operation(summary = "가입한 그룹 상태값 변경", description = "가입한 그룹에서 상태값을 변경할 수 있습니다. [Y : 가입 , N : 탈퇴 ]") +// @ApiOperation(value = "그룹 가입 승인/미승인") +// @Tag(name = "그룹 참여 컨트롤러", description = "그룹 참여 관련 API") + public ResponseEntity update(@RequestBody BasGroupJoinUpdateRQ rq) { Map resultMap = new HashMap(); + + BasGroupJoinModel model = new BasGroupJoinModel(); + BeanUtils.copyProperties(rq, model); if(StringUtils.isEmpty(rq.getCstmrGroupSno())) { return ResponseEntity.status(HttpStatus.OK) @@ -99,7 +103,7 @@ public class BasGroupJoinController { } try { - boolean result = service.update(rq); + boolean result = service.update(model); resultMap.put("result", result); diff --git a/pav-server/src/main/java/com/palnet/biz/api/bas/group/controller/BasGroupUserController.java b/pav-server/src/main/java/com/palnet/biz/api/bas/group/controller/BasGroupUserController.java index 998fdffa..3f206152 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/bas/group/controller/BasGroupUserController.java +++ b/pav-server/src/main/java/com/palnet/biz/api/bas/group/controller/BasGroupUserController.java @@ -1,22 +1,8 @@ package com.palnet.biz.api.bas.group.controller; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; -import org.springframework.util.StringUtils; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - import com.palnet.biz.api.bas.group.model.BasGroupUserListModel; import com.palnet.biz.api.bas.group.model.BasGroupUserModel; +import com.palnet.biz.api.bas.group.model.BasGroupUserUpdateRQ; import com.palnet.biz.api.bas.group.service.BasGroupUserService; import com.palnet.biz.api.comn.model.ComnPagingRs; import com.palnet.biz.api.comn.response.BasicResponse; @@ -25,25 +11,34 @@ import com.palnet.biz.api.comn.response.SuccessResponse; import com.palnet.comn.code.RSErrorCode; import com.palnet.comn.exception.CustomException; -import io.swagger.annotations.ApiOperation; +import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; -@Log4j2 +import org.springframework.beans.BeanUtils; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.util.StringUtils; +import org.springframework.web.bind.annotation.*; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Slf4j @RestController @RequiredArgsConstructor @RequestMapping(value = "/api/bas/group/user", produces = {MediaType.APPLICATION_JSON_VALUE}) -@Tag(name = "그룹 사용자 컨트롤러", description = "그룹 사용자 관련 API") +@Tag(name = "그룹 사용자", description = "그룹 사용자 관련 API") public class BasGroupUserController { - @Autowired private final BasGroupUserService service; - - + @GetMapping(value = "/list") - @ApiOperation(value = "그룹 사용자 조회") - @Tag(name = "그룹 사용자 컨트롤러", description = "그룹 사용자 관련 API") + @Operation(summary = "그룹 참여자 조회", description = "검색조건에 맞춰 그룹 참여자를 조회합니다.") public ResponseEntity list(BasGroupUserListModel rq) { ComnPagingRs result = null; @@ -68,13 +63,15 @@ public class BasGroupUserController { @PutMapping(value = "/update") - @ApiOperation(value = "그룹 사용자 권한 수정") - @Tag(name = "그룹 사용자 컨트롤러", description = "그룹 사용자 관련 API") - public ResponseEntity update(@RequestBody BasGroupUserModel rq) { + @Operation(summary = "그룹 참여자 권한 수정", description = "그룹 참여자 권한을 수정합니다.") + public ResponseEntity update(@RequestBody BasGroupUserUpdateRQ rq) { Map resultMap = new HashMap(); + BasGroupUserModel model = new BasGroupUserModel(); + BeanUtils.copyProperties(rq, model); + try { - boolean result = service.update(rq); + boolean result = service.update(model); resultMap.put("result", result); @@ -89,13 +86,17 @@ public class BasGroupUserController { } @PutMapping(value = "/delegate") - @ApiOperation(value = "MASTER 권한 위임") - @Tag(name = "그룹 사용자 컨트롤러", description = "그룹 사용자 관련 API") - public ResponseEntity delegate(@RequestBody List rq) { + @Operation(summary = "MASTER 권한 위임", description = "Master 권한을 위임합니다.") +// @ApiOperation(value = "MASTER 권한 위임") +// @Tag(name = "그룹 사용자 컨트롤러", description = "그룹 사용자 관련 API") + public ResponseEntity delegate(@RequestBody List rq) { Map resultMap = new HashMap(); - + + List model = new ArrayList<>(); + BeanUtils.copyProperties(rq, model); + try { - boolean result = service.delegate(rq); + boolean result = service.delegate(model); resultMap.put("result", result); } catch (CustomException e) { return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) diff --git a/pav-server/src/main/java/com/palnet/biz/api/bas/group/model/BasGroupAprvRqModel.java b/pav-server/src/main/java/com/palnet/biz/api/bas/group/model/BasGroupAprvRqModel.java index da8212d5..4e19bb39 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/bas/group/model/BasGroupAprvRqModel.java +++ b/pav-server/src/main/java/com/palnet/biz/api/bas/group/model/BasGroupAprvRqModel.java @@ -2,6 +2,7 @@ package com.palnet.biz.api.bas.group.model; import com.palnet.biz.api.comn.model.ComnRqModel; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; @@ -9,14 +10,19 @@ import lombok.EqualsAndHashCode; @EqualsAndHashCode(callSuper=false) public class BasGroupAprvRqModel extends ComnRqModel { + @Schema(description = "그룹명" , example = "KAC" , implementation = String.class) private String groupNm; + @Schema(description = "회원이름[그룹내 회원명으로 검색해야합니다.]" , example = "한국공항공사" , implementation = String.class) private String memberName; + @Schema(description = "승인여부" , example = "Y" , implementation = String.class) private String aprvYn; + @Schema(description = "회원일련번호" , example = "2" , implementation = Integer.class) private Integer cstmrSno; + @Schema(description = "그룹코드" , example = "C807F9" , implementation = String.class) private String groupId; } diff --git a/pav-server/src/main/java/com/palnet/biz/api/bas/group/model/BasGroupAprvlUpdateRQ.java b/pav-server/src/main/java/com/palnet/biz/api/bas/group/model/BasGroupAprvlUpdateRQ.java new file mode 100644 index 00000000..87d2b8c5 --- /dev/null +++ b/pav-server/src/main/java/com/palnet/biz/api/bas/group/model/BasGroupAprvlUpdateRQ.java @@ -0,0 +1,24 @@ +package com.palnet.biz.api.bas.group.model; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +public class BasGroupAprvlUpdateRQ { + + @Schema(description = "고객과 그룹 매핑한 일련번호" , example = "5" , implementation = String.class) + private Integer cstmrGroupSno; + + @Schema(description = "현재 승인상태 여부[테스트시 해당유저가 승인되어있으면 Y 값으로 넣어주세요.]" , example = "Y" , implementation = String.class) + private String aprvlYn; + + @Schema(description = "그룹내 권한코드" , example = "NORMAL" , implementation = String.class) + private String groupAuthCd; + + @Schema(description = "승인자" , example = "palnet" , implementation = String.class) + private String aprvlUserId; + + @Schema(description = "터미널ID" , example = "" , implementation = String.class) + private String trmnlId; + +} diff --git a/pav-server/src/main/java/com/palnet/biz/api/bas/group/model/BasGroupInsertRQ.java b/pav-server/src/main/java/com/palnet/biz/api/bas/group/model/BasGroupInsertRQ.java new file mode 100644 index 00000000..6cb63910 --- /dev/null +++ b/pav-server/src/main/java/com/palnet/biz/api/bas/group/model/BasGroupInsertRQ.java @@ -0,0 +1,21 @@ +package com.palnet.biz.api.bas.group.model; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +public class BasGroupInsertRQ { + + @Schema(description = "그룹아이디[그룹생성시 랜덤으로 받는 아이디, 중복되면 생성이 되지 않음]", example = "HDU123", implementation = String.class) + private String groupId; + + @Schema(description = "그룹명[중복되면 생성이 되지 않음]", example = "PAL_KAC_GROUP", implementation = String.class) + private String groupNm; + + @Schema(description = "그룹구분코드", example = "02", implementation = String.class) + private String groupTypeCd; + + @Schema(description = "회원고유번호", example = "2", implementation = String.class) + private int cstmrSno; + +} diff --git a/pav-server/src/main/java/com/palnet/biz/api/bas/group/model/BasGroupJoinInsertRQ.java b/pav-server/src/main/java/com/palnet/biz/api/bas/group/model/BasGroupJoinInsertRQ.java new file mode 100644 index 00000000..66110e9f --- /dev/null +++ b/pav-server/src/main/java/com/palnet/biz/api/bas/group/model/BasGroupJoinInsertRQ.java @@ -0,0 +1,17 @@ +package com.palnet.biz.api.bas.group.model; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +public class BasGroupJoinInsertRQ { + + @Schema(description = "그룹코드", example = "HDU123", implementation = String.class) + private String groupId; + + @Schema(description = "회원일련번호", example = "2", implementation = Integer.class) + private Integer cstmrSno; + + @Schema(description = "그룹 내 권한코드", example = "", implementation = String.class) + private String groupAuthCd; +} diff --git a/pav-server/src/main/java/com/palnet/biz/api/bas/group/model/BasGroupJoinRqModel.java b/pav-server/src/main/java/com/palnet/biz/api/bas/group/model/BasGroupJoinRqModel.java index 866fa7ca..614788c8 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/bas/group/model/BasGroupJoinRqModel.java +++ b/pav-server/src/main/java/com/palnet/biz/api/bas/group/model/BasGroupJoinRqModel.java @@ -2,6 +2,7 @@ package com.palnet.biz.api.bas.group.model; import com.palnet.biz.api.comn.model.ComnRqModel; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; @@ -9,10 +10,13 @@ import lombok.EqualsAndHashCode; @EqualsAndHashCode(callSuper=false) public class BasGroupJoinRqModel extends ComnRqModel{ + @Schema(description = "그룹명", example = "PAL_KAC", implementation = String.class) private String groupNm; + @Schema(description = "그룹코드", example = "HDU123", implementation = String.class) private String groupId; + @Schema(description = "회원일련번호", example = "2", implementation = Integer.class) private Integer cstmrSno; } diff --git a/pav-server/src/main/java/com/palnet/biz/api/bas/group/model/BasGroupJoinUpdateRQ.java b/pav-server/src/main/java/com/palnet/biz/api/bas/group/model/BasGroupJoinUpdateRQ.java new file mode 100644 index 00000000..23306373 --- /dev/null +++ b/pav-server/src/main/java/com/palnet/biz/api/bas/group/model/BasGroupJoinUpdateRQ.java @@ -0,0 +1,14 @@ +package com.palnet.biz.api.bas.group.model; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +public class BasGroupJoinUpdateRQ { + + @Schema(description = "회원 그룹 매핑 일련번호", example = "14", implementation = String.class) + private Integer cstmrGroupSno; + + @Schema(description = "그룹내 참여여부 상태값", example = "N", implementation = String.class) + private String joinYn; +} diff --git a/pav-server/src/main/java/com/palnet/biz/api/bas/group/model/BasGroupRqModel.java b/pav-server/src/main/java/com/palnet/biz/api/bas/group/model/BasGroupRqModel.java index 11b35e4b..a503c6ed 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/bas/group/model/BasGroupRqModel.java +++ b/pav-server/src/main/java/com/palnet/biz/api/bas/group/model/BasGroupRqModel.java @@ -2,6 +2,7 @@ package com.palnet.biz.api.bas.group.model; import com.palnet.biz.api.comn.model.ComnRqModel; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; @@ -9,8 +10,10 @@ import lombok.EqualsAndHashCode; @EqualsAndHashCode(callSuper=false) public class BasGroupRqModel extends ComnRqModel{ + @Schema(description = "그룹명", example = "KAC", implementation = String.class) private String groupNm; + @Schema(description = "그룹아이디", example = "C807F9", implementation = String.class) private String groupId; } diff --git a/pav-server/src/main/java/com/palnet/biz/api/bas/group/model/BasGroupUpdateRQ.java b/pav-server/src/main/java/com/palnet/biz/api/bas/group/model/BasGroupUpdateRQ.java new file mode 100644 index 00000000..b63389b4 --- /dev/null +++ b/pav-server/src/main/java/com/palnet/biz/api/bas/group/model/BasGroupUpdateRQ.java @@ -0,0 +1,19 @@ +package com.palnet.biz.api.bas.group.model; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +public class BasGroupUpdateRQ { + + @Schema(description = "그룹아이디[그룹생성시 랜덤으로 받는 아이디, 중복되면 생성이 되지 않음]", example = "HDU123", implementation = String.class) + private String groupId; + + @Schema(description = "그룹명[중복되면 생성이 되지 않음]", example = "PAL_KAC_GROUP", implementation = String.class) + private String groupNm; + + + @Schema(description = "그룹구분코드", example = "02", implementation = String.class) + private String groupTypeCd; + +} diff --git a/pav-server/src/main/java/com/palnet/biz/api/bas/group/model/BasGroupUserListModel.java b/pav-server/src/main/java/com/palnet/biz/api/bas/group/model/BasGroupUserListModel.java index 27474a42..439763b3 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/bas/group/model/BasGroupUserListModel.java +++ b/pav-server/src/main/java/com/palnet/biz/api/bas/group/model/BasGroupUserListModel.java @@ -2,6 +2,7 @@ package com.palnet.biz.api.bas.group.model; import com.palnet.biz.api.comn.model.ComnPagingModel; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; @@ -9,9 +10,12 @@ import lombok.EqualsAndHashCode; @EqualsAndHashCode(callSuper=false) public class BasGroupUserListModel extends ComnPagingModel{ + @Schema(description = "그룹에 참여한 회원 명", example = "팔네트웍스", implementation = String.class) private String memberName; + @Schema(description = "그룹아이디", example = "C807F9", implementation = String.class) private String groupId; - - private int cstmrSno; + + @Schema(description = "회원고유번호", example = "2", implementation = String.class) + private Integer cstmrSno; } diff --git a/pav-server/src/main/java/com/palnet/biz/api/bas/group/model/BasGroupUserUpdateRQ.java b/pav-server/src/main/java/com/palnet/biz/api/bas/group/model/BasGroupUserUpdateRQ.java new file mode 100644 index 00000000..9943e3d8 --- /dev/null +++ b/pav-server/src/main/java/com/palnet/biz/api/bas/group/model/BasGroupUserUpdateRQ.java @@ -0,0 +1,17 @@ +package com.palnet.biz.api.bas.group.model; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +public class BasGroupUserUpdateRQ { + + @Schema(description = "회원 그룹 매핑 일련번호", example = "13", implementation = String.class) + private Integer cstmrGroupSno; + + @Schema(description = "그룹 참여 여부", example = "Y", implementation = String.class) + private String joinYn; + + @Schema(description = "그룹 내 권한코드", example = "LEADER", implementation = String.class) + private String groupAuthCd; +} diff --git a/pav-server/src/main/java/com/palnet/biz/api/bas/group/service/BasGroupService.java b/pav-server/src/main/java/com/palnet/biz/api/bas/group/service/BasGroupService.java index 011ff78d..c01c9022 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/bas/group/service/BasGroupService.java +++ b/pav-server/src/main/java/com/palnet/biz/api/bas/group/service/BasGroupService.java @@ -42,7 +42,10 @@ public class BasGroupService { @Autowired private JwtTokenUtil jwtTokenUtil; - + /** + * 그룹코드를 생성하는 기능. + * @return + */ public String createid() { String groupId = ""; @@ -59,20 +62,19 @@ public class BasGroupService { } /** - * 나의 그룹 목록 + * 내가 만든 그룹 목록조회하는 기능. * @param cstmrSno * @return */ - public List mylist(int cstmrSno){ - + public List mylist(int cstmrSno){ - List resultList = query.mylist(cstmrSno); + List resultList = query.mylist(cstmrSno); // 데이터베이스에서 cstmrSno에 맞춰 내가 만든 그룹을 조회하는 기능. return resultList; } /** - * 그룹 목록 + * 그룹 목록조회하는 기능. * @param cstmrSno * @return */ @@ -81,7 +83,7 @@ public class BasGroupService { String appAuth = jwtTokenUtil.getUserAuthByToken(); List resultList = new ArrayList<>(); if("SUPER".equals(appAuth)||"ADMIN".equals(appAuth)) { - resultList = query.groupAdminList(cstmrSno); + resultList = query.groupAdminList(cstmrSno); // Super, Admin권한으로 그룹을 조회하는 SQL 기능. } else { resultList = query.groupUserList(cstmrSno); } @@ -90,7 +92,7 @@ public class BasGroupService { } /** - * 나의 그룹 - 참여 그룹 목록 + * 나의 그룹 - 참여 그룹 목록을 조회하는 기능. * @param cstmrSno * @return */ @@ -102,20 +104,20 @@ public class BasGroupService { } /** - * 전체 그룹 목록 + * 전체 그룹 목록하는 기능. * @param rq * @return */ public List list(BasGroupRqModel rq){ - List resultList = query.list(rq); + List resultList = query.list(rq); // 전체 그룹을 조회하는 SQL기능 return resultList; } /** - * 그룹 상세 조회 + * 그룹아이디[groupId]로 상세 조회하는 기능. * @param groupId * @return * @throws Exception @@ -134,13 +136,12 @@ public class BasGroupService { BeanUtils.copyProperties(entity , model); - return model; } /** - * 그룹 생성 + * 그룹 생성하는 기능. * @param rq * @return * @throws Exception @@ -188,7 +189,7 @@ public class BasGroupService { } /** - * 그룹 수정 + * 그룹 수정하는 기능. * @param rq * @return * @throws Exception @@ -222,7 +223,7 @@ public class BasGroupService { } /** - * 그룹 삭제 + * 그룹아이디[groupId]로 삭제하는 기능. * @param groupId * @return * @throws Exception diff --git a/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/controller/BasLaancAprvController.java b/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/controller/BasLaancAprvController.java index acffb389..d8517d6a 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/controller/BasLaancAprvController.java +++ b/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/controller/BasLaancAprvController.java @@ -3,11 +3,19 @@ package com.palnet.biz.api.bas.laanc.controller; import com.palnet.biz.api.bas.laanc.model.BasLaancAprvListRq; import com.palnet.biz.api.bas.laanc.model.BasLaancAprvRs; import com.palnet.biz.api.bas.laanc.service.BasLaancAprvService; +import com.palnet.biz.api.cns.qna.model.QnaBasModel; import com.palnet.biz.api.comn.response.BasicResponse; import com.palnet.biz.api.comn.response.ErrorResponse; import com.palnet.biz.api.comn.response.SuccessResponse; import com.palnet.comn.exception.CustomException; -import io.swagger.annotations.ApiOperation; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Parameters; +import io.swagger.v3.oas.annotations.media.ArraySchema; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -46,12 +54,13 @@ public class BasLaancAprvController { /** * laanc 승인 목록 + * * @param rq * @param pageable * @return */ - @ApiOperation(value = "LAANC 승인 목록") - @Tag(name = "LAANC 승인", description = "LAANC 승인 관련 API") + @Deprecated + @Operation(summary = "LAANC 승인 목록", description = "LAANC 승인 목록") @GetMapping("/list") public ResponseEntity getLaancAprvList(BasLaancAprvListRq rq, Pageable pageable) { Page rs = null; @@ -73,14 +82,26 @@ public class BasLaancAprvController { } - if(pageable == null) { + if (pageable == null) { return ResponseEntity.ok().body(new SuccessResponse<>(rs.getContent())); } return ResponseEntity.ok().body(new SuccessResponse<>(rs)); } - @ApiOperation(value = "LAANC 승인 목록") - @Tag(name = "LAANC 승인", description = "LAANC 승인 관련 API") + /** + * laanc 승인 목록 + * + * @param rq + * @return + */ + @Operation(summary = "LAANC 승인 목록", description = "LAANC 승인 목록") + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "성공", + content = { + @Content(mediaType = "application/json", + schema = @Schema(implementation = SuccessResponse.class)) + }) + }) @GetMapping("/list2") public ResponseEntity getLaancAprvList2(BasLaancAprvListRq rq) { List rs = null; @@ -107,11 +128,19 @@ public class BasLaancAprvController { /** * laanc 승인 상세 + * * @param planSno * @return */ - @ApiOperation(value = "LAANC 승인 상세 조회") - @Tag(name = "LAANC 승인", description = "LAANC 승인 관련 API") + @Operation(summary = "LAANC 승인 상세 조회", description = "LAANC 승인 상세 조회") + @Parameter(name = "planSno", description = "LAANC 승인 번호", required = true, example = "200") + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "성공", + content = { + @Content(mediaType = "application/json", + schema = @Schema(implementation = SuccessResponse.class)) + }) + }) @GetMapping("/detail/{planSno}") public ResponseEntity getLaancAprvDetail(@PathVariable("planSno") String planSno) { BasLaancAprvRs rs = null; diff --git a/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/controller/BasLaancController.java b/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/controller/BasLaancController.java index 779b556e..fc83472e 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/controller/BasLaancController.java +++ b/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/controller/BasLaancController.java @@ -5,18 +5,19 @@ import com.palnet.biz.api.bas.laanc.service.BasLaancService; import com.palnet.biz.api.comn.response.BasicResponse; import com.palnet.biz.api.comn.response.ErrorResponse; import com.palnet.biz.api.comn.response.SuccessResponse; +import com.palnet.biz.api.external.model.PilotValidRs; import com.palnet.comn.exception.CustomException; -import io.swagger.annotations.ApiOperation; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.enums.ParameterIn; +import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import java.util.HashMap; import java.util.List; @@ -42,10 +43,18 @@ public class BasLaancController { private final BasLaancService basLaancService; - // LAANC 검증 + /** + * LAANC 검증 + * 로직(스텝) 변경으로 인하여 사용하지 않음. + * 해당 로직은 등록시 사용되는 service에서 사용함. + * + * @param rq + * @return + */ + @Deprecated + @Operation(summary = "LAANC 검증", description = "LAANC 검증", hidden = true) + @ApiResponse(responseCode = "200", description = "성공") @PostMapping(value = "/plan/valid") - @ApiOperation(value = "LAANC 검증") - @Tag(name = "LAANC", description = "LAANC 관련 API") public ResponseEntity validationLaanc(@RequestBody BasLaancPlanRq rq) { BasLaancValidatedRs rs = null; @@ -71,10 +80,15 @@ public class BasLaancController { return ResponseEntity.ok().body(new SuccessResponse<>(rs)); } - // 비행계획서 등록, 약관 등록, 공문 생성 + /** + * LAANC 신청(비행계획서 등록, 약관 등록, 공문 생성) + * + * @param rq + * @return + */ + @Operation(summary = "LAANC 신청", description = "LAANC 신청(비행계획서 등록, 약관 등록, 공문 생성)") + @ApiResponse(responseCode = "200", description = "성공") @PostMapping(value = "/plan/create") - @ApiOperation(value = "비행계획서 등록") - @Tag(name = "LAANC", description = "LAANC 관련 API") public ResponseEntity createPlan(@RequestBody BasLaancPlanRq rq) { BasLaancLastRs rs = null; try { @@ -95,11 +109,17 @@ public class BasLaancController { return ResponseEntity.ok().body(new SuccessResponse<>(rs)); } - // 허용고도 조회 + /** + * 허용고도 조회 + * + * @param rq + * @return + */ + @Operation(summary = "비행구역 허용고도 조회", description = "좌표에 해당하는 허용고도 조회") + @ApiResponse(responseCode = "200", description = "성공") @PostMapping(value = "/valid/elev") - @ApiOperation(value = "비행구역 허용고도 조회") - @Tag(name = "LAANC", description = "LAANC 관련 API") - public ResponseEntity getAllowableElevation(@RequestBody List rq) { + public ResponseEntity getAllowableElevation(@RequestBody List rq + ) { List rs = null; try { rs = basLaancService.getAllowableElevation(rq); @@ -120,10 +140,16 @@ public class BasLaancController { } - // TS 연동 + /** + * TS 연동 - 자겨정보 조회 + * + * @param idntfNumList + * @return + */ + @Deprecated + @Operation(summary = "TS 연동 - 비행자격 조회", description = "비행자격 조회(조종사 자격증명, 기체보험 여부)") + @ApiResponse(responseCode = "200", description = "성공") @PostMapping(value = "/valid/ts/pilot") - @ApiOperation(value = "TS 연동 - 비행자격 조회(조종사 자격증명, 기체보험 여부)") - @Tag(name = "LAANC", description = "LAANC 관련 API") public ResponseEntity getTsValid(@RequestBody List idntfNumList) { BasLaancTsRs rs = null; try { @@ -134,7 +160,7 @@ public class BasLaancController { resultMap.put("result", false); resultMap.put("errorCode", e.getErrorCode()); resultMap.put("errorMessage", e.getMessage()); - return ResponseEntity.ok().body(new SuccessResponse(resultMap)); + return ResponseEntity.ok().body(new SuccessResponse<>(resultMap)); } catch (Exception e) { log.error("IGNORE : ", e); return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) @@ -144,11 +170,16 @@ public class BasLaancController { return ResponseEntity.ok().body(new SuccessResponse<>(rs)); } - // 허용고도 조회 + /** + * 공역(금지구역) 포함 여부 + * + * @param rq + * @return + */ + @Operation(summary = "공역(금지구역) 포함 여부", description = "공역(금지구역) 포함 여부") + @ApiResponse(responseCode = "200", description = "성공") @PostMapping(value = "/valid/duplicated/airspace") - @ApiOperation(value = "공역(금지구역) 포함 여부") - @Tag(name = "LAANC", description = "LAANC 관련 API") - public ResponseEntity getDuplicatedAirspace(@RequestBody List rq) { + public ResponseEntity getDuplicatedAirspace(@RequestBody List rq) { List rs = null; try { rs = basLaancService.getDuplicatedAirspace(rq); @@ -158,7 +189,7 @@ public class BasLaancController { resultMap.put("result", false); resultMap.put("errorCode", e.getErrorCode()); resultMap.put("errorMessage", e.getMessage()); - return ResponseEntity.ok().body(new SuccessResponse(resultMap)); + return ResponseEntity.ok().body(new SuccessResponse<>(resultMap)); } catch (Exception e) { log.error("IGNORE : ", e); return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) @@ -168,4 +199,67 @@ public class BasLaancController { return ResponseEntity.ok().body(new SuccessResponse<>(rs)); } + /** + * TS QR 코드 생성 + * + * @param rq + * @return + */ + @Operation(summary = "TS QR 코드 생성", description = "조종사 자격증명 및 기체 보험 여부 등 조회하기 위한 QR 코드 생성") + @ApiResponse(responseCode = "200", description = "성공") + @GetMapping(value = "/ts/qr") + public ResponseEntity getQrCode(BasLaancQrcodeRq rq) { + BasLaancQrcodeRs rs = null; + try { + rs = basLaancService.createQrcode(rq); + } catch (CustomException e) { + Map resultMap = new HashMap<>(); + log.error("IGNORE : ", e); + resultMap.put("result", false); + resultMap.put("errorCode", e.getErrorCode()); + resultMap.put("errorMessage", e.getMessage()); + return ResponseEntity.ok().body(new SuccessResponse<>(resultMap)); + } catch (Exception e) { + log.error("IGNORE : ", e); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body(new ErrorResponse("Server Error", "-1")); + + } + return new ResponseEntity<>(new SuccessResponse<>(rs), HttpStatus.OK); + } + + /** + * TS QR 코드 확인 + * + * @param confirmKey + * @return + */ + @Operation(summary = "TS QR 코드 확인", description = "조종사 자격증명 및 기체 보험 여부 등 데이터를 받고 검증된 데이터인지 확인") + @ApiResponse(responseCode = "200", description = "성공") + @Parameter(name = "confirmKey", description = "QR 코드 확인 키", required = true, in = ParameterIn.PATH, example = "251dd7ec-ec94-4b23-b8ff-bd7b53489448") + @GetMapping(value = "/ts/qr/{confirmKey}") + public ResponseEntity checkRqcodeRs(@PathVariable("confirmKey") String confirmKey) { + PilotValidRs rs = null; + try { + rs = basLaancService.checkQrcode(confirmKey); + } catch (CustomException e) { + Map resultMap = new HashMap<>(); + log.error("IGNORE : ", e); + resultMap.put("result", false); + resultMap.put("errorCode", e.getErrorCode()); + resultMap.put("errorMessage", e.getMessage()); + if (e.getParamArray() != null) { + resultMap.put("params", e.getParamArray()); + } + return ResponseEntity.ok().body(new SuccessResponse<>(resultMap)); + } catch (Exception e) { + log.error("IGNORE : ", e); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body(new ErrorResponse("Server Error", "-1")); + + } + return new ResponseEntity<>(new SuccessResponse<>(rs), HttpStatus.OK); + } + + } diff --git a/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancAprvListRq.java b/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancAprvListRq.java index cd65f5b3..686794d2 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancAprvListRq.java +++ b/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancAprvListRq.java @@ -2,7 +2,7 @@ package com.palnet.biz.api.bas.laanc.model; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.palnet.biz.config.convert.InstantDateStrSerializer; -import io.swagger.annotations.ApiParam; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -27,18 +27,22 @@ import java.time.Instant; @AllArgsConstructor public class BasLaancAprvListRq { - @ApiParam(name = "작성자 이름", example = "팔") + @Schema(description = "작성자 이름", example = "팔") private String memberName; - @ApiParam(name = "신청(등록)시작일자", example = "2023-12-12") + + @Schema(description = "신청(등록)시작일자", example = "2023-12-12", implementation = String.class) @JsonSerialize(using = InstantDateStrSerializer.class) private Instant createStDate; - @ApiParam(name = "신청(등록)종료일자", example = "2023-12-12") + + @Schema(description = "신청(등록)종료일자", example = "2023-12-12", implementation = String.class) @JsonSerialize(using = InstantDateStrSerializer.class) private Instant createEndDate; - @ApiParam(name = "비행시작일자", example = "2023-12-12") + + @Schema(description = "비행시작일자", example = "2023-12-12", implementation = String.class) @JsonSerialize(using = InstantDateStrSerializer.class) private Instant schFltStDate; - @ApiParam(name = "비행종료일자", example = "2023-12-12") + + @Schema(description = "비행종료일자", example = "2023-12-12", implementation = String.class) @JsonSerialize(using = InstantDateStrSerializer.class) private Instant schFltEndDate; diff --git a/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancAprvRs.java b/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancAprvRs.java index cdca995b..14015e8e 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancAprvRs.java +++ b/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancAprvRs.java @@ -1,14 +1,8 @@ package com.palnet.biz.api.bas.laanc.model; -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.palnet.biz.api.comn.file.model.ComnFileModel; -import com.palnet.biz.jpa.entity.type.ArcrftTypeCd; import com.palnet.biz.jpa.entity.type.ArcrftWghtCd; import com.palnet.biz.jpa.entity.type.FltPurpose; import com.palnet.biz.jpa.entity.type.FltType; -import io.swagger.annotations.ApiParam; -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.media.Schema; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -35,59 +29,59 @@ import java.util.stream.Collectors; @NoArgsConstructor @AllArgsConstructor public class BasLaancAprvRs { - @ApiParam(name = "비행계획서 일려번호") + //비행계획서 일려번호 private Integer planSno; - @ApiParam(name = "그룹 아이디", hidden = true) + //그룹 아이디 private String groupId; - @ApiParam(name = "작성자 일련번호") + //작성자 일련번호 private Integer cstmrSno; - @ApiParam(name = "작성자 이름") + //작성자 이름 private String memberName; - @ApiParam(name = "작성자 이메일") + //작성자 이메일 private String email; - @ApiParam(name = "작성자 연락처") + //작성자 연락처 private String hpno; - @ApiParam(name = "작성자 국가번호(연락처)", hidden = true) + //작성자 국가번호(연락처) private String clncd; - @ApiParam(name = "작성자 주소", hidden = true) + //작성자 주소 private String addr; - @ApiParam(name = "작성자 상세주소", hidden = true) + //작성자 상세주소 private String addrDtlCn; - @ApiParam(name = "작성자 우편번호", hidden = true) + //작성자 우편번호 private String zip; - @ApiParam(name = "비행시작일시") + //비행시작일시 private Instant schFltStDt; - @ApiParam(name = "비행종료일시") + //비행종료일시 private Instant schFltEndDt; - @ApiParam(name = "비행목적") + //비행목적 private FltPurpose fltPurpose; - @ApiParam(name = "상업/비사업 구분") + //상업/비사업 구분 private FltType fltType; - @ApiParam(name = "상업/비사업 구분 코드") + //상업/비사업 구분 코드 private String fltTypeNm; - @ApiParam(name = "승인여부") + //승인여부 private String aprvlYn; - @ApiParam(name = "승인일자") + //승인일자 private Instant aprvlDt; -// @ApiParam(name = "삭제여부") -// private String delYn; - @ApiParam(name = "등록자ID") + //삭제여부 + // private String delYn; + //등록자ID private String createUserId; - @ApiParam(name = "등록일시") + //등록일시 private Instant createDt; - @ApiParam(name = "수정자ID") + //수정자ID private String updateUserId; - @ApiParam(name = "수정일시") + //수정일시 private Instant updateDt; - @ApiParam(name = "서비스유형") + //서비스유형 private String serviceType; - @ApiParam(name = "기업여부") + //기업여부 private String corpRegYn; - @ApiParam(name = "공문URL") + //공문URL private String pdfUrl; // 하나의 필드로 묶어서 처리 - @ApiParam(name = "기체 무게") + //기체 무게 public String getArcrftWght() { if (arcrftList == null || arcrftList.isEmpty()) return null; List arcrftWghtCdList = arcrftList.stream().map(BasLaancArcrftModel::getArcrftWghtCd).distinct().filter(Objects::nonNull).collect(Collectors.toList()); @@ -95,7 +89,7 @@ public class BasLaancAprvRs { return ArcrftWghtType; } - @ApiParam(name = "고도") + //고도 public String getElev() { if (areaList == null || areaList.isEmpty()) return null; List elevList = areaList.stream().map(BasLaancAreaModel::getFltElev).distinct().filter(Objects::nonNull).collect(Collectors.toList()); @@ -103,7 +97,7 @@ public class BasLaancAprvRs { return elev; } -// @ApiParam(name = "조종사 성명") +//조종사 성명 // public String getPilotName() { // if (pilotList == null || pilotList.isEmpty()) return null; // List pilotNameList = pilotList.stream().map(BasLaancPilotModel::getMemberName).distinct().filter(Objects::nonNull).collect(Collectors.toList()); diff --git a/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancArcrftModel.java b/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancArcrftModel.java index 6cd865f1..39036b25 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancArcrftModel.java +++ b/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancArcrftModel.java @@ -4,44 +4,106 @@ import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.palnet.biz.config.convert.InstantDateStrSerializer; import com.palnet.biz.jpa.entity.type.ArcrftTypeCd; import com.palnet.biz.jpa.entity.type.ArcrftWghtCd; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import java.time.Instant; @Data public class BasLaancArcrftModel { + @Schema(description = "계획서 기체 일련번호", example = "1", hidden = true) private Integer planArcrftSno; + + @Schema(description = "비행계획서 일련번호", example = "1", hidden = true) private Integer planSno; + + @Schema(description = "기체 일련번호", example = "1", hidden = true) private Integer arcrftSno; + + @Schema(description = "식별번호(기체번호)", example = "PA0001") private String idntfNum; + + @Schema(description = "그룹명", example = "한국공항공사", hidden = true) private String groupNm; + + @Schema(description = "제작번호", example = "123101-13", hidden = true) private String prdctNum; + + @Schema(description = "기체종류코드", example = "01", hidden = true) private ArcrftTypeCd arcrftTypeCd; + + @Schema(description = "기체모델명", example = "M-01", hidden = true) private String arcrftModelNm; + + @Schema(description = "제작자", example = "DJI", hidden = true) private String prdctCmpnNm; + + @Schema(description = "제작일자", example = "2022-01-01", hidden = true) @JsonSerialize(using = InstantDateStrSerializer.class) private Instant prdctDate; + + @Schema(description = "기체길이", example = "1.0", hidden = true) private double arcrftLngth; + + @Schema(description = "길체폭", example = "1.1", hidden = true) private double arcrftWdth; + + @Schema(description = "기체높이", example = "1.0", hidden = true) private double arcrftHght; + + @Schema(description = "기체중량", example = "1.5", hidden = true) private double arcrftWght; + + @Schema(description = "중량구분코드", hidden = true) private String wghtTypeCd; + + @Schema(description = "이미지URL", example = "http://www.imageurl.co.kr/image/url", hidden = true) private String imageUrl; + + @Schema(description = "최대이륙중량", example = "10", hidden = true) private double takeoffWght; + + @Schema(description = "사용여부", hidden = true) private String useYn; + + @Schema(description = "카메라탑재여부", example = "N") private String cameraYn; + + @Schema(description = "보험가입여부", example = "Y") private String insrncYn; + + @Schema(description = "소유자명(법인명)", example = "팔네트웍스") private String ownerNm; + + @Schema(description = "생성자ID", hidden = true) private String createUserId; + + @Schema(description = "생성일시", hidden = true) private Instant createDt; + + @Schema(description = "수정자ID", hidden = true) private String updateUserId; + + @Schema(description = "수정일시", hidden = true) private Instant updateDt; + + @Schema(hidden = true) private String docState = "R"; + + @Schema(description = "식별장치종류코드", example = "DRON", hidden = true) private String idntfTypeCd; + // kac 추가 필드 + @Schema(description = "기체보험유무", example = "Y") private String acrftInsuranceYn; + + @Schema(description = "보험유효기간", hidden = true) @JsonSerialize(using = InstantDateStrSerializer.class) private Instant insuranceExperiod; + + @Schema(description = "법인명", hidden = true) private String corporationNm; + + @Schema(description = "자체중량코드", example = "10") private ArcrftWghtCd arcrftWghtCd; // 기체 무게 코드 ---- } diff --git a/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancAreaByAirspaceModel.java b/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancAreaByAirspaceModel.java new file mode 100644 index 00000000..8e7f7e7d --- /dev/null +++ b/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancAreaByAirspaceModel.java @@ -0,0 +1,22 @@ +package com.palnet.biz.api.bas.laanc.model; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.List; + +@Data +public class BasLaancAreaByAirspaceModel { + + @Schema(description = "구역종류", example = "CIRCLE") + private String areaType; + + @Schema(description = "버퍼존", example = "100") + private Integer bufferZone; + + @Schema(description = "고도", example = "110") + private String fltElev; + + private List coordList; + +} diff --git a/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancAreaByElevModel.java b/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancAreaByElevModel.java new file mode 100644 index 00000000..76908fc4 --- /dev/null +++ b/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancAreaByElevModel.java @@ -0,0 +1,20 @@ +package com.palnet.biz.api.bas.laanc.model; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.List; + +@Data +public class BasLaancAreaByElevModel { + + @Schema(description = "구역종류", example = "CIRCLE") + private String areaType; + + @Schema(description = "버퍼존", example = "100") + private Integer bufferZone; + + private List coordList; + + +} diff --git a/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancAreaCoordByAirspaceModel.java b/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancAreaCoordByAirspaceModel.java new file mode 100644 index 00000000..d479fc73 --- /dev/null +++ b/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancAreaCoordByAirspaceModel.java @@ -0,0 +1,16 @@ +package com.palnet.biz.api.bas.laanc.model; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +public class BasLaancAreaCoordByAirspaceModel { + + @Schema(description = "위도", example = "127.33") + private double lat; + + @Schema(description = "경도", example = "37.99") + private double lon; + + +} diff --git a/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancAreaCoordByElevModel.java b/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancAreaCoordByElevModel.java new file mode 100644 index 00000000..43b28cd6 --- /dev/null +++ b/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancAreaCoordByElevModel.java @@ -0,0 +1,16 @@ +package com.palnet.biz.api.bas.laanc.model; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +public class BasLaancAreaCoordByElevModel { + + @Schema(description = "위도", example = "127.33") + private double lat; + + @Schema(description = "경도", example = "37.99") + private double lon; + + +} diff --git a/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancAreaCoordModel.java b/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancAreaCoordModel.java index 8bccb75b..89c572f6 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancAreaCoordModel.java +++ b/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancAreaCoordModel.java @@ -1,16 +1,30 @@ package com.palnet.biz.api.bas.laanc.model; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import java.time.Instant; @Data public class BasLaancAreaCoordModel { + @Schema(description = "비행구역좌표 일련번호", example = "1") private Integer planAreaCoordSno; + + @Schema(description = "비행계획비행구역 일련번호", example = "1") private Integer planAreaSno; + + @Schema(description = "위도", example = "127.33") private double lat; + + @Schema(description = "경도", example = "37.99") private double lon; + + @Schema(description = "생성자ID", hidden = true) private String createUserId; + + @Schema(description = "생성일시", hidden = true) private Instant createDt; + + @Schema(hidden = true) private String docState = "R"; } diff --git a/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancAreaModel.java b/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancAreaModel.java index 26a80e65..45ffbc95 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancAreaModel.java +++ b/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancAreaModel.java @@ -1,6 +1,7 @@ package com.palnet.biz.api.bas.laanc.model; import com.palnet.biz.jpa.entity.type.FltMethod; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import java.time.Instant; @@ -8,20 +9,49 @@ import java.util.List; @Data public class BasLaancAreaModel { + + @Schema(description = "비행구역 일련번호", example = "1", hidden = true) private Integer planAreaSno; + + @Schema(description = "비행계획서 일련번호", example = "1", hidden = true) private Integer planSno; + + @Schema(description = "구역종류", example = "CIRCLE") private String areaType; + + @Schema(description = "비행방식", example = "01") private FltMethod fltMethod; + + @Schema(description = "비행구역주소", example = "인천광역시 부평구 청천2동") private String fltAreaAddr; + + @Schema(description = "버퍼존", example = "100") private Integer bufferZone; + + @Schema(description = "고도", example = "110") private String fltElev; + + @Schema(description = "생성자ID", hidden = true) private String createUserId; + + @Schema(description = "생성일시", hidden = true) private Instant createDt; + + @Schema(description = "수정자ID", hidden = true) private String updateUserId; - private Instant updateDt; + + @Schema(description = "수정일시", hidden = true) + private Instant updateDt; + private String docState = "R"; + private List coordList; + + @Schema(hidden = true) private List bufferCoordList; + // kac 추가 필드 + @Schema(description = "비행방식(기타)") private String fltMothoeRm; + } diff --git a/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancDuplicatedAirspaceRs.java b/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancDuplicatedAirspaceRs.java index d9d6ce01..44f20c99 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancDuplicatedAirspaceRs.java +++ b/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancDuplicatedAirspaceRs.java @@ -22,5 +22,5 @@ import lombok.NoArgsConstructor; @Builder public class BasLaancDuplicatedAirspaceRs { private boolean isDuplicated; - private BasLaancAreaModel rq; + private BasLaancAreaByAirspaceModel rq; } diff --git a/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancPlanRq.java b/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancPlanRq.java index 311d5dd1..ee1ce92b 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancPlanRq.java +++ b/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancPlanRq.java @@ -1,9 +1,12 @@ package com.palnet.biz.api.bas.laanc.model; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.palnet.biz.api.acnt.cstmr.model.AnctCstmrTermsModel; import com.palnet.biz.api.external.model.PilotValidRs; +import com.palnet.biz.config.convert.InstantDatetimeStrSerializer; import com.palnet.biz.jpa.entity.type.FltPurpose; import com.palnet.biz.jpa.entity.type.FltType; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import java.time.Instant; @@ -11,18 +14,37 @@ import java.util.List; @Data public class BasLaancPlanRq { + + @Schema(description = "비행계획서 일련번호", example = "1", hidden = true) private Integer planSno; - private Integer cstmrSno; + @Schema(description = "사용자 일련번호", example = "1", hidden = true) + private Integer cstmrSno; + + @Schema(description = "이름", example = "조종사") private String memberName; + + @Schema(description = "비행유형", example = "COMMERCIAL") private FltType fltType; // 비행유형 - 상업/비상업 ---- + + @Schema(description = "비행시작일시", example = "2024-02-12 09:00:00", implementation = String.class) + @JsonSerialize(using = InstantDatetimeStrSerializer.class) private Instant schFltStDt; // 시작일시 + + @Schema(description = "비행종료일시", example = "2024-02-12 10:00:00", implementation = String.class) + @JsonSerialize(using = InstantDatetimeStrSerializer.class) private Instant schFltEndDt; // 종료일시 + + @Schema(description = "비행목적", example = "17") private FltPurpose fltPurpose; // 비행목적 ----- + @Schema(description = "서비스구분", example = "KAC") private String serviceType; // 고정 + @Schema(hidden = true) private String docState = "R"; + + private List areaList; // private List pilotList; private List arcrftList; diff --git a/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancQrcodeRq.java b/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancQrcodeRq.java new file mode 100644 index 00000000..19ae8e8e --- /dev/null +++ b/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancQrcodeRq.java @@ -0,0 +1,16 @@ +package com.palnet.biz.api.bas.laanc.model; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class BasLaancQrcodeRq { + @Schema(description = "기체신고번호", example = "C1CM0231251") + private String idntfNum; // 기체신고번호 +} diff --git a/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancQrcodeRs.java b/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancQrcodeRs.java new file mode 100644 index 00000000..acc191a9 --- /dev/null +++ b/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancQrcodeRs.java @@ -0,0 +1,15 @@ +package com.palnet.biz.api.bas.laanc.model; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class BasLaancQrcodeRs { + private byte[] qrcode; // qr코드 + private String confirmKey; // 인증번호 +} diff --git a/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancTsRq.java b/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancTsRq.java index e5368add..90a2747e 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancTsRq.java +++ b/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancTsRq.java @@ -1,7 +1,5 @@ package com.palnet.biz.api.bas.laanc.model; -import io.swagger.annotations.ApiParam; -import io.swagger.v3.oas.annotations.media.Schema; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -25,6 +23,6 @@ import java.util.List; @AllArgsConstructor @Builder public class BasLaancTsRq { - @ApiParam(name = "기체신고번호", collectionFormat = ",") +// @ApiParam(name = "기체신고번호", collectionFormat = ",") private List IdntfNumList; } diff --git a/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancValidatedRs.java b/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancValidatedRs.java index fd6fd28b..6f3b0bd5 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancValidatedRs.java +++ b/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancValidatedRs.java @@ -1,14 +1,10 @@ package com.palnet.biz.api.bas.laanc.model; -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.palnet.biz.api.external.model.PilotValidRs; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; -import java.util.List; - /** * packageName : com.palnet.biz.api.bas.laanc.model * fileName : BasLaancValidatedRs @@ -26,66 +22,39 @@ import java.util.List; @AllArgsConstructor public class BasLaancValidatedRs { +// // TS 연동 +// private String corpRegYn; // 사업자 여부 +// private List pilotValidRsList; // 자격여부 - private boolean isPilotQlfc; // 자격여부 - private boolean isArcrftInsurance; // 항공기보험여부 - + // 비행유형 여부 + private boolean isCommercial; // 사업자 - true, 비사업자 - false + // 관제권 private boolean isEvaluatedTargetArea; // 평가대상지역여부 - 공역과 겹칠때만 true - private boolean isFlightArea; // 비행가능여부 - 비행가능 true - + // 고도 + private boolean isElev; // 고도여부 - 관제권내 설정고도 이하, 권제권밖 150m 이하 true + // 기체중량 private boolean isArcrftWeight; // 항공기중량여부 - 25kg 이하 true + // 비행방식 + private boolean isFltMethod; // 비행방식 - 군집비행 false, 그외 true + // 비행시간 + private boolean isSpacialFlight; // 특별비행여부 - true (야간비행) + // 자격여부 + private boolean isPilotQlfc; // 자격여부 + // 기체보험여부 + private boolean isArcrftInsurance; // 기체보험여부 - private boolean isElev; // 고도여부 - 150m 이하 true - - private boolean isReport; // 신고 대상 - 비상업적이고 기체중량 2kg미만일 경우 - false / 그외 true - - // 추가.... - private boolean isCommercial; // 비행유형 사업자 - true / 비사업자 - false - private boolean isSpacialFlight; // 특별비행여부 - true - - // TS 연동 -// private String corpRegYn; // 사업자 여부 - private List pilotValidRsList; // 자격여부 - - // 활용안함. -// private boolean isArcrftDuplicated; // 기체 중복여부 -// private boolean isPlanAreaDuplicatd; // 비행계획서비행구역 중복여부 - + // 최종여부 public boolean isValid() { - if (isReport) { - return isPilotQlfc - && isArcrftInsurance -// && !isArcrftDuplicated // 기체 중복여부 -// && !isPlanAreaDuplicatd // 비행구역 중복여부 - && isFlightArea // 비행가능여부 - && isCheckingLance(); - } - return isFlightArea -// && !isPlanAreaDuplicatd -// && !isArcrftDuplicated - && isCheckingLance(); + return !isNonAprove() && !isNonAproveFlight(); } - - public boolean isFlight() { - return !isCheckingLance() || isValid(); + // 미승인 + public boolean isNonAprove() { + return isFltMethod && !isSpacialFlight && isElev && isPilotQlfc && isArcrftInsurance; } - - // LAANC 승인 대상 여부 - @JsonIgnore - public boolean isCheckingLance() { - return isEvaluatedTargetArea // 관제구역여부 - /* - 관제권 외 고도 150m초과에 대해서 승인 대상이나 담당자와의 협의가 필요하여 미승인 처리함 - || !isElev // 150m 초과 - - */ - || !isArcrftWeight; // 25kg 초과 + // 비행가능여부(미승인-날수있음) + public boolean isNonAproveFlight() { + return !isCommercial && !isEvaluatedTargetArea && isElev && isArcrftWeight; } - // 특별승인 대상 여부 - @JsonIgnore - public boolean isTargetSpacialFlight() { - return false; - } - } diff --git a/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/service/BasLaancAprvService.java b/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/service/BasLaancAprvService.java index aa9e1650..27ac832b 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/service/BasLaancAprvService.java +++ b/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/service/BasLaancAprvService.java @@ -46,18 +46,32 @@ public class BasLaancAprvService { * @param pageable * @return */ + @Deprecated public Page getLaancAprvList(BasLaancAprvListRq rq, Pageable pageable) { LaancAprvSearchDto searchDto = BasLaancAprvMapper.MAPPER.toDto(rq); Page result = fltPlanQueryRepository.findAllAprvListBySearch(searchDto, pageable); - Page rs = PageUtils.convert(result, BasLaancAprvMapper.MAPPER.toRsList(result.getContent())); - return rs; + return PageUtils.convert(result, BasLaancAprvMapper.MAPPER.toRsList(result.getContent())); } + /** + * laanc 승인 목록 + * + * @param rq + * @return + */ public List getLaancAprvList2(BasLaancAprvListRq rq) { LaancAprvSearchDto searchDto = BasLaancAprvMapper.MAPPER.toDto(rq); + + // 검색조건에 해당하는 비행계획서 조회 List result = fltPlanQueryRepository.findAllAprvListBySearch2(searchDto); + + // 비행계획서에 해당하는 파일의 그룹NO 추출 - PDF URL을 가져오기 위함 List fileGroupNoList = result.stream().map(LaancPlanDto::getFileGroupNo).filter(Objects::nonNull).collect(Collectors.toList()); + + // 파일 정보 조회 List fileListByGroupNoList = comnFileService.getFileListByGroupNoList(fileGroupNoList); + + // 파일 정보(PDF)를 비행계획서에 추가 result.forEach(dto -> { if (dto.getFileGroupNo() != null) { fileListByGroupNoList.stream() @@ -66,9 +80,8 @@ public class BasLaancAprvService { .ifPresent(file -> dto.setPdfUrl(file.getDownloadUrl())); } }); - List rs = BasLaancAprvMapper.MAPPER.toRsList(result); - return rs; + return BasLaancAprvMapper.MAPPER.toRsList(result); } /** @@ -79,13 +92,16 @@ public class BasLaancAprvService { */ public BasLaancAprvRs getLaancAprvDetail(String planSno) { if (planSno == null) throw new CustomException(ErrorCode.NON_VALID_PARAMETER); + LaancPlanDto result = fltPlanQueryRepository.findAprvById(Integer.parseInt(planSno)); + + // PDF URL 추출 if (result != null && result.getFileGroupNo() != null) { ComnFileModel comnFileModel = comnFileService.getOfficialDocumentFileListByGroupNo(result.getFileGroupNo()); if (comnFileModel != null) result.setPdfUrl(comnFileModel.getDownloadUrl()); } - BasLaancAprvRs rs = BasLaancAprvMapper.MAPPER.toRs(result); - return rs; + + return BasLaancAprvMapper.MAPPER.toRs(result); } } diff --git a/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/service/BasLaancService.java b/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/service/BasLaancService.java index 27be6c83..3f9563a3 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/service/BasLaancService.java +++ b/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/service/BasLaancService.java @@ -1,47 +1,28 @@ package com.palnet.biz.api.bas.laanc.service; -import java.time.Instant; -import java.time.LocalDateTime; -import java.time.LocalTime; -import java.time.ZoneId; -import java.time.format.DateTimeFormatter; -import java.util.ArrayList; -import java.util.List; -import java.util.stream.Collectors; - -import com.palnet.biz.api.bas.laanc.model.*; -import org.locationtech.jts.geom.Coordinate; -import org.locationtech.jts.geom.Geometry; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.util.StringUtils; - +import com.google.zxing.WriterException; import com.palnet.biz.api.acnt.cstmr.model.AnctCstmrModel; import com.palnet.biz.api.acnt.cstmr.model.AnctCstmrTermsModel; import com.palnet.biz.api.acnt.jwt.utils.JwtTokenUtil; +import com.palnet.biz.api.bas.laanc.model.*; import com.palnet.biz.api.comn.file.model.LaancPdfModel; import com.palnet.biz.api.comn.file.service.ComnFileService; import com.palnet.biz.api.comn.sms.model.ComnSmsLaancAprovModel; import com.palnet.biz.api.comn.sms.service.ComnSmsService; +import com.palnet.biz.api.comn.sunriseset.model.ComnSunrisesetCoordRq; +import com.palnet.biz.api.comn.sunriseset.model.ComnSunrisesetRs; import com.palnet.biz.api.external.model.PilotValidRq; import com.palnet.biz.api.external.model.PilotValidRs; +import com.palnet.biz.api.external.model.TsPlanRq; +import com.palnet.biz.api.external.model.TsQrcodeRq; import com.palnet.biz.api.external.service.TsService; -import com.palnet.biz.jpa.entity.ComFileBas; -import com.palnet.biz.jpa.entity.FltPlanArcrft; -import com.palnet.biz.jpa.entity.FltPlanArea; -import com.palnet.biz.jpa.entity.FltPlanAreaCoord; -import com.palnet.biz.jpa.entity.FltPlanBas; -import com.palnet.biz.jpa.entity.FltPlanPilot; -import com.palnet.biz.jpa.entity.PtyGroupBas; -import com.palnet.biz.jpa.entity.PtyTermsAgreeTxn; +import com.palnet.biz.jpa.entity.*; import com.palnet.biz.jpa.entity.type.ArcrftWghtCd; +import com.palnet.biz.jpa.entity.type.FltMethod; import com.palnet.biz.jpa.entity.type.FltType; +import com.palnet.biz.jpa.repository.com.ComConfirmBasRepository; import com.palnet.biz.jpa.repository.com.ComRiseSetQueryRepository; -import com.palnet.biz.jpa.repository.flt.FltPlanArcrftRepository; -import com.palnet.biz.jpa.repository.flt.FltPlanAreaCoordRepository; -import com.palnet.biz.jpa.repository.flt.FltPlanAreaRepository; -import com.palnet.biz.jpa.repository.flt.FltPlanBasRepository; -import com.palnet.biz.jpa.repository.flt.FltPlanPilotRepository; +import com.palnet.biz.jpa.repository.flt.*; import com.palnet.biz.jpa.repository.pty.PtyCstmrQueryRepository; import com.palnet.biz.jpa.repository.pty.PtyGroupBasRepository; import com.palnet.biz.jpa.repository.pty.PtyTermsAgreeTxnRepository; @@ -49,13 +30,27 @@ import com.palnet.biz.scheduler.ctr.model.CtrTrnsLctnModel; import com.palnet.biz.scheduler.ctr.service.CtrTrnsLctnService; import com.palnet.comn.code.ErrorCode; import com.palnet.comn.exception.CustomException; -import com.palnet.comn.utils.AirspaceUtils; -import com.palnet.comn.utils.AreaUtils; -import com.palnet.comn.utils.HttpUtils; -import com.palnet.comn.utils.InstantUtils; - +import com.palnet.comn.utils.*; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.locationtech.jts.geom.Coordinate; +import org.locationtech.jts.geom.Geometry; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.StringUtils; +import org.springframework.web.util.UriComponents; +import org.springframework.web.util.UriComponentsBuilder; + +import java.io.IOException; +import java.time.Instant; +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.time.ZoneId; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.*; +import java.util.stream.Collectors; /** * packageName : com.palnet.biz.api.bas.laanc.service @@ -87,76 +82,98 @@ public class BasLaancService { private final ComnSmsService comnSmsService; private final JwtTokenUtil jwtTokenUtil; private final AreaUtils areaUtils; + private final ComRiseSetQueryRepository comRiseSetQueryRepository; + private final ComConfirmBasRepository comConfirmBasRepository; - // LAANC 검증 - public BasLaancValidatedRs validationLaanc(BasLaancPlanRq rq) { - if (!this.laancParamValid(rq)) throw new CustomException(ErrorCode.NON_VALID_PARAMETER); - - BasLaancValidatedRs rs = new BasLaancValidatedRs(); - - // 조종사 자격 확인 - 무게가 2kg 초과이거나 상업적일 경우에만 진행 - // 상업 여부 - 상업(true) - boolean isCommercial = FltType.COMMERCIAL == rq.getFltType(); - rs.setCommercial(isCommercial); + @Value("${app.host}") + private String APP_HOST; - // 2kg 초과 기체신고번호 - List idntfNumList = rq.getArcrftList().stream().filter(arcrft -> arcrft.getArcrftWghtCd() != ArcrftWghtCd.W250G_LOE && arcrft.getArcrftWghtCd() != ArcrftWghtCd.W250G_W2KG).map(BasLaancArcrftModel::getIdntfNum).collect(Collectors.toList()); + @Value("${external.ts.return.uri}") + private String TS_RETURN_URI; - // 신고 여부 - 비상업적이고 기체중량 2kg이하일 경우 - false, 상업적이거나 기체중량 2kg초과일 경우 - true - boolean isReport = !idntfNumList.isEmpty() || isCommercial; - rs.setReport(isReport); + /** + * LAANC 검증 + * + * @param rq + * @return + */ + public BasLaancValidatedRs validationLaanc(BasLaancPlanRq rq) { + if (!this.laancParamValid(rq)) throw new CustomException(ErrorCode.NON_VALID_PARAMETER); - // 고도 150m 이하 - true - boolean isElev = rq.getAreaList().stream().anyMatch(area -> area.getFltElev() != null && Integer.parseInt(area.getFltElev()) <= 150); - rs.setElev(isElev); + BasLaancValidatedRs rs = new BasLaancValidatedRs(); - // 기체중량 25kg 이하 - boolean isArcrftWeight = rq.getArcrftList().stream().anyMatch(arcrft -> arcrft.getArcrftWghtCd() != ArcrftWghtCd.W25KG_GO && arcrft.getArcrftWghtCd() != ArcrftWghtCd.W25KG_GO_TEST); - rs.setArcrftWeight(isArcrftWeight); - // TODO start - 조종사 자격 및 기체보험 확인 - if (isReport) { - List pilotValidRqList = idntfNumList.stream().map(idntfNum -> { + // TS 자격 판별 - 조종사 자격증명, 기체 보험 + List idntfNumList = rq.getArcrftList().stream().filter(arcrft -> arcrft.getIdntfNum() != null && !arcrft.getIdntfNum().isBlank()).map(BasLaancArcrftModel::getIdntfNum).collect(Collectors.toList()); + Integer cstmrSno = jwtTokenUtil.getCstmrSnoByToken(); + AnctCstmrModel cstmrInfo = ptyCstmrQueryRepository.findByCstmrSno(cstmrSno); + String userCi = cstmrInfo.getIpinCi(); + List pilotValidRqList = new ArrayList<>(); + if (!idntfNumList.isEmpty()) { + pilotValidRqList = idntfNumList.stream().map(idntfNum -> { // TODO 기체보험 확인, 조종사 자격 확인 return PilotValidRq.builder() - .pilotci("조종사CI") + .pilotci(userCi) .declarationnum(idntfNum) .build(); }).collect(Collectors.toList()); + } else { + pilotValidRqList.add(PilotValidRq.builder() + .pilotci(userCi) + .build()); + } - List pilotValidRsList = tsService.getAccountValidate(pilotValidRqList); - if (pilotValidRsList.isEmpty()) { - rs.setPilotQlfc(false); - rs.setArcrftInsurance(false); - } else { - rs.setPilotValidRsList(pilotValidRsList); - rs.setPilotQlfc(pilotValidRsList.stream().allMatch(pilotValidRs -> "Y".equals(pilotValidRs.getPilotcredentialyn()))); - rs.setArcrftInsurance(pilotValidRsList.stream().allMatch(pilotValidRs -> "Y".equals(pilotValidRs.getArcrftinsuranceyn()))); - } + List pilotValidRsList = tsService.getAccountValidate(pilotValidRqList); + if (pilotValidRsList.isEmpty()) { + rs.setPilotQlfc(false); + rs.setArcrftInsurance(false); + } else { + rs.setPilotQlfc(pilotValidRsList.stream().allMatch(pilotValidRs -> "Y".equals(pilotValidRs.getPilotcredentialyn()))); + rs.setArcrftInsurance(pilotValidRsList.stream().allMatch(pilotValidRs -> "Y".equals(pilotValidRs.getArcrftinsuranceyn()))); } - // TODO end - 조종사 자격 및 기체보험 확인 + // 비행유형 판별 - 상업 - true + boolean isCommercial = FltType.COMMERCIAL == rq.getFltType(); + rs.setCommercial(isCommercial); + + // 관제권 여부 판별 + BasLaancValidatedRs validationPlanDbRs = this.validationPlanAirspace(rq); + boolean isEvaluatedTargetArea = validationPlanDbRs.isEvaluatedTargetArea(); + rs.setEvaluatedTargetArea(isEvaluatedTargetArea); + // 고도여부 - 관제권내 설정고도 이하, 권제권밖 150m 이하 true + if (isEvaluatedTargetArea) { + // 관제권 내부 - 설정고도 이하 + rs.setElev(validationPlanDbRs.isElev()); + } else { + // 관제권 외부 - 150m 이하 + boolean isElev = rq.getAreaList().stream().allMatch(area -> area.getFltElev() != null && Integer.parseInt(area.getFltElev()) <= 150); + rs.setElev(isElev); + } - /* 비행구역 및 기체 중복여부 확인 안하기로 함. - // 비행구역 중복여부, 기체 중복여부 - BasLaancValidatedRs validationPlanAirspaceRs = this.validationPlanAreaAndArcrft(rq); - rs.setPlanAreaDuplicatd(validationPlanAirspaceRs.isPlanAreaDuplicatd()); - rs.setArcrftDuplicated(validationPlanAirspaceRs.isArcrftDuplicated()); - */ + // 기체중량 판별 - 25kg 이하 true + boolean isArcrftWeight = rq.getArcrftList().stream().allMatch(arcrft -> arcrft.getArcrftWghtCd() != ArcrftWghtCd.W25KG_GO && arcrft.getArcrftWghtCd() != ArcrftWghtCd.W25KG_GO_TEST); + rs.setArcrftWeight(isArcrftWeight); + // 특별비행여부 판별 - 야간/주간 - 야간 true + boolean isSpcialFlight = this.validationPlanSpecialFlight(rq); + rs.setSpacialFlight(isSpcialFlight); - // 판단구역 - 공역과 겹칠 경우, 비행가능여부 - BasLaancValidatedRs validationPlanDbRs = this.validationPlanAirspace(rq); - rs.setEvaluatedTargetArea(validationPlanDbRs.isEvaluatedTargetArea()); - rs.setFlightArea(validationPlanDbRs.isFlightArea()); + // 비행방식 - 군집비행 false, 그외 true + boolean isFltMethod = rq.getAreaList().stream().allMatch(area -> FltMethod.CLUSTER_FLIGHT != area.getFltMethod()); + rs.setFltMethod(isFltMethod); return rs; } - // 비행계획서 등록, 약관 등록, 공문 생성 + /** + * 비행계획서 등록, 약관 등록, 공문 생성 + * + * @param rq + * @return + */ @Transactional public BasLaancLastRs createFlightPlan(BasLaancPlanRq rq) { // if (rq == null || rq.getValidatedRs() == null) throw new CustomException(ErrorCode.NON_VALID_PARAMETER); @@ -180,6 +197,7 @@ public class BasLaancService { // 비행계획서 String userId = jwtTokenUtil.getUserIdByToken(); Integer cstmrSno = jwtTokenUtil.getCstmrSnoByToken(); + // 개인정보 가져오기 - 비행계획서 작성자 정보, 조종사 정보 AnctCstmrModel cstmrInfo = ptyCstmrQueryRepository.findByCstmrSno(cstmrSno); FltPlanBas fltPlanBas = BasLaancMapper.MAPPER.modelToPlanEntity(cstmrInfo); @@ -208,10 +226,11 @@ public class BasLaancService { corpRegYn = isCorpReg ? "Y" : "N"; } fltPlanBas.setCorpRegYn(corpRegYn); // 사업자유무 - fltPlanBas.setServiceType("PAV-KAC"); + fltPlanBas.setServiceType("F0002"); FltPlanBas rBasEntity = fltPlanBasRepository.save(fltPlanBas); Integer planSno = rBasEntity.getPlanSno(); + // 비행구역 List basLaancAreaModelList = rq.getAreaList(); if (basLaancAreaModelList != null && !basLaancAreaModelList.isEmpty()) { @@ -369,113 +388,19 @@ public class BasLaancService { return rs; } - // LAANC 검증 - /* - private BasLaancValidatedRs validationPlanAreaAndArcrft(BasLaancPlanRq rq) { - - // 초기화 - BasLaancValidatedRs rs = BasLaancValidatedRs.builder() - .isPlanAreaDuplicatd(false) // 비행구역 중복여부 - .isArcrftDuplicated(false) // 기체 중복여부 - .build(); - - - // 비행계획서 - List fltPlanBasList = fltPlanBasRepository.findBySchFltStDtLessThanEqualAndSchFltEndDtGreaterThanEqualAndAprvlYnAndDelYn(rq.getSchFltEndDt(), rq.getSchFltStDt(), "Y", "N"); - if (fltPlanBasList != null && !fltPlanBasList.isEmpty()) { - - if (rq.getPlanSno() != null) { - // 동일한 비행계획서는 검증에서 제외 처리 - fltPlanBasList = fltPlanBasList.stream().filter(fltPlanBas -> !rq.getPlanSno().equals(fltPlanBas.getPlanSno())).collect(Collectors.toList()); - } - - // 비행계획서 planSno 모음 - List planSnoList = fltPlanBasList.stream().map(FltPlanBas::getPlanSno).collect(Collectors.toList()); - - // 지역 -// List fltPlanAreaList = fltPlanAreaRepository.findByPlanSnoIn(planSnoList); - - for (FltPlanBas fltPlanBas : fltPlanBasList) { - // 1. 구역조회 - List fltPlanAreaList = fltPlanAreaRepository.findByPlanSnoOrderByPlanAreaSnoAsc(fltPlanBas.getPlanSno()); - - // 2. 좌표 조회 -> 영역 포함 여부 확인 - for (FltPlanArea fltPlanArea : fltPlanAreaList) { - String effectiveFltElev = fltPlanArea.getFltElev(); - List fltPlanAreaCoordList = fltPlanAreaCoordRepository.findByPlanAreaSnoOrderByPlanAreaCoordSnoAsc(fltPlanArea.getPlanAreaSno()); - if (fltPlanAreaCoordList == null || fltPlanAreaCoordList.isEmpty()) continue; - - // 2-1 영역 좌표 - List effectiveCoordList = fltPlanAreaCoordList.stream().map(fltPlanAreaCoord -> new Coordinate(fltPlanAreaCoord.getLon(), fltPlanAreaCoord.getLat())).collect(Collectors.toList()); - List effectiveCoordBufferList = new ArrayList<>(); - // Query에서 조회한 좌표로 버퍼좌표 생성 - if ("LINE".equals(fltPlanArea.getAreaType())) { - List trans = areaUtils.transform(effectiveCoordList, "EPSG:4326", "EPSG:5181"); - List bufferList = areaUtils.buffer(trans, fltPlanArea.getBufferZone()); - effectiveCoordBufferList = areaUtils.transform(bufferList, "EPSG:5181", "EPSG:4326"); - } - if ("POLYGON".equals(fltPlanArea.getAreaType())) { - effectiveCoordBufferList.addAll(effectiveCoordList); - } - if ("CIRCLE".equals(fltPlanArea.getAreaType())) { - effectiveCoordBufferList = areaUtils.createCircle(effectiveCoordList.get(0), fltPlanArea.getBufferZone()); - } - - for (BasLaancAreaModel basLaancAreaModel : rq.getAreaList()) { - String targetFltElev = basLaancAreaModel.getFltElev(); - // TODO 추후 특정 고도 범위 확인 - boolean isEqualsFltElev = effectiveFltElev.equals(targetFltElev); - // rq로 들어온 좌표로 버퍼좌표 생성 - List targetCoords = basLaancAreaModel.getCoordList().stream().map(coord -> new Coordinate(coord.getLon(), coord.getLat())).collect(Collectors.toList()); - List targetBufferCoords = new ArrayList<>(); - if ("LINE".equals(basLaancAreaModel.getAreaType())) { - List trans = areaUtils.transform(targetCoords, "EPSG:4326", "EPSG:5181"); - List bufferList = areaUtils.buffer(trans, fltPlanArea.getBufferZone()); - targetBufferCoords = areaUtils.transform(bufferList, "EPSG:5181", "EPSG:4326"); - } else if ("POLYGON".equals(basLaancAreaModel.getAreaType())) { - targetBufferCoords.addAll(targetCoords); - } else if ("CIRCLE".equals(basLaancAreaModel.getAreaType())) { - targetBufferCoords = areaUtils.createCircle(targetCoords.get(0), fltPlanArea.getBufferZone()); - } - - // 검증 - Geometry targetGeometry = areaUtils.coordinateToGeometry(targetBufferCoords); - Geometry effectiveGeometry = areaUtils.coordinateToGeometry(effectiveCoordBufferList); - if (targetGeometry.intersects(effectiveGeometry) && isEqualsFltElev) { - rs.setPlanAreaDuplicatd(true); - } - } - } - } - - // 기체 중복 여부 확인 - List arcrftList = rq.getArcrftList(); - if (arcrftList != null && !arcrftList.isEmpty()) { - List fltPlanArcrftList = fltPlanArcrftRepository.findByPlanSnoIn(planSnoList); - if (fltPlanArcrftList != null && !fltPlanArcrftList.isEmpty()) { - boolean isDuplicatedArcrft = arcrftList.stream().anyMatch(arcrft -> - fltPlanArcrftList.stream().anyMatch(fltPlanArcrft -> - arcrft.getIdntfNum().equals(fltPlanArcrft.getIdntfNum()) - ) - ); - if (isDuplicatedArcrft) { - rs.setArcrftDuplicated(true); - } - } - } - - } - return rs; - } + /** + * 비행신청 - 공역관련 검증 + * + * @param rq + * @return */ - private BasLaancValidatedRs validationPlanAirspace(BasLaancPlanRq rq) { // 초기화 BasLaancValidatedRs rs = BasLaancValidatedRs.builder() .isEvaluatedTargetArea(false) // 판단구역 - 공역과 겹칠 경우 - .isFlightArea(false) // 비행가능여부 + .isElev(false) // 비행가능여부 .build(); // 공역 중복 확인 @@ -507,27 +432,18 @@ public class BasLaancService { boolean duplicatedAirspace = airspaceUtils.isDuplicatedAirspace(featureInfo); rs.setEvaluatedTargetArea(duplicatedAirspace); - // 비행 가능 지역 판단 -// if (duplicatedAirspace) { -// boolean validLaancAirspace = airspaceUtils.isValidLaancAirspace(featureInfo); -// rs.setFlightAreaYn(validLaancAirspace ? "Y" : "N"); -// } else { -// rs.setFlightAreaYn("N"); -// } - // 비행 가능 지역 판단 boolean validLaancAirspace = airspaceUtils.isValidLaancAirspace(featureInfo); - rs.setFlightArea(validLaancAirspace); + rs.setElev(validLaancAirspace); } return rs; } /** - * 야간 특별비행 유무 확인 + * 비행계획서 검증 - 시작, 종료 일자 * 1. 비행시작 일자 금일 ~ 90일 이내 * 2. 비행 종료일자 금일 ~ 6개월까지 -- validtion 통과후 일몰 - * 3. 일몰, 일출 시간[해떠있는 시간] 체크 * * @param rq * @return @@ -551,23 +467,34 @@ public class BasLaancService { // 시간 파라미터가 맞지 않을경우 if (!(isSchFltStDtValid && isSchFltEndDtValid)) return false; -// String[] stringStDt = InstantUtils.toDatetimeString(rq.getSchFltStDt()).split(" "); -// String[] stringEndDt = InstantUtils.toDatetimeString(rq.getSchFltEndDt()).split(" "); -// -// ComnSunrisesetCoordRq comnSunrisesetCoordRq = new ComnSunrisesetCoordRq(stringStDt[0].replace("-", ""), stringEndDt[0].replace("-", ""), null, null); -// -// ComnSunrisesetRs comnSunrisesetRs = comRiseSetQueryRepository.findBySearchCoordDateTransform(comnSunrisesetCoordRq); -// -// LocalTime sunUp = this.convertStringToTime(comnSunrisesetRs.getCivilm(), "HHmmss"); -// LocalTime sunDown = this.convertStringToTime(comnSunrisesetRs.getCivile(), "HHmmss"); -// -// LocalTime stringStTm = this.convertStringToTime(stringStDt[1].replace(":", ""), "HHmmss"); -// LocalTime stringEndTm = this.convertStringToTime(stringEndDt[1].replace(":", ""), "HHmmss"); -// -// boolean stTmValid = this.isBetweenSunriseAndSunset(sunUp, sunDown, stringStTm); -// boolean endTmValid = this.isBetweenSunriseAndSunset(sunUp, sunDown, stringEndTm); - -// if (!stTmValid || !endTmValid) return false; + return true; + } + + /** + * 비행계획서 검증 - 특별 비행 + * @param rq + * @return + */ + private boolean validationPlanSpecialFlight(BasLaancPlanRq rq) { + + String[] stringStDt = InstantUtils.toDatetimeString(rq.getSchFltStDt()).split(" "); + String[] stringEndDt = InstantUtils.toDatetimeString(rq.getSchFltEndDt()).split(" "); + + ComnSunrisesetCoordRq comnSunrisesetCoordRq = new ComnSunrisesetCoordRq(stringStDt[0].replace("-", ""), stringEndDt[0].replace("-", ""), null, null); + + ComnSunrisesetRs comnSunrisesetRs = comRiseSetQueryRepository.findBySearchCoordDateTransform(comnSunrisesetCoordRq); + + LocalTime sunUp = this.convertStringToTime(comnSunrisesetRs.getCivilm(), "HHmmss"); + LocalTime sunDown = this.convertStringToTime(comnSunrisesetRs.getCivile(), "HHmmss"); + + LocalTime stringStTm = this.convertStringToTime(stringStDt[1].replace(":", ""), "HHmmss"); + LocalTime stringEndTm = this.convertStringToTime(stringEndDt[1].replace(":", ""), "HHmmss"); + + boolean stTmValid = this.isBetweenSunriseAndSunset(sunUp, sunDown, stringStTm); + boolean endTmValid = this.isBetweenSunriseAndSunset(sunUp, sunDown, stringEndTm); + + if (!stTmValid || !endTmValid) return false; + return true; } @@ -596,18 +523,23 @@ public class BasLaancService { timeToCheck.isBefore(sunset); } - // 허용고도 조회 - public List getAllowableElevation(List rq) { + /** + * 허용고도 조회 + * + * @param rq + * @return + */ + public List getAllowableElevation(List rq) { AirspaceUtils airspaceUtils = AirspaceUtils.getInstance(); List allowElevationList = new ArrayList<>(); - for (BasLaancAreaModel area : rq) { + for (BasLaancAreaByElevModel area : rq) { //rq로 들어온 좌표로 버퍼좌표 생성 List targetCoord = new ArrayList<>(); List targetCoordBufferList = new ArrayList<>(); - for (BasLaancAreaCoordModel basLaancAreaCoordModel : area.getCoordList()) { - Coordinate coords = new Coordinate(basLaancAreaCoordModel.getLon(), basLaancAreaCoordModel.getLat()); + for (BasLaancAreaCoordByElevModel coord : area.getCoordList()) { + Coordinate coords = new Coordinate(coord.getLon(), coord.getLat()); targetCoord.add(coords); } @@ -631,7 +563,13 @@ public class BasLaancService { return allowElevationList; } - // TS 연동 + /** + * TS 연동 - 장격증명 API + * + * @param idntfNumList + * @return + */ + @Deprecated public BasLaancTsRs getTsValid(List idntfNumList) { Integer cstmrSno = jwtTokenUtil.getCstmrSnoByToken(); AnctCstmrModel cstmrInfo = ptyCstmrQueryRepository.findByCstmrSno(cstmrSno); @@ -651,17 +589,22 @@ public class BasLaancService { .build(); } - // 관제권 포함 여부 - public List getDuplicatedAirspace(List rq) { + /** + * 구역좌표 - 관제권 포함 여부 + * + * @param rq + * @return + */ + public List getDuplicatedAirspace(List rq) { AirspaceUtils airspaceUtils = AirspaceUtils.getInstance(); List rs = new ArrayList<>(); - for (BasLaancAreaModel area : rq) { + for (BasLaancAreaByAirspaceModel area : rq) { //rq로 들어온 좌표로 버퍼좌표 생성 List targetCoord = new ArrayList<>(); List targetCoordBufferList = new ArrayList<>(); - for (BasLaancAreaCoordModel basLaancAreaCoordModel : area.getCoordList()) { + for (BasLaancAreaCoordByAirspaceModel basLaancAreaCoordModel : area.getCoordList()) { Coordinate coords = new Coordinate(basLaancAreaCoordModel.getLon(), basLaancAreaCoordModel.getLat()); targetCoord.add(coords); } @@ -689,4 +632,146 @@ public class BasLaancService { return rs; } + + /** + * QR code 생성 - 자격증명을 위한 + * QR code 생성(PAV-KAC)* > qr code 스캔(사용자) > 자격정보 전송(TS) > return url 자격정보 받음(PAV-KAC) > 확인(자격정보 확인) + * + * @param rq + * @return + */ + public BasLaancQrcodeRs createQrcode(BasLaancQrcodeRq rq) { + + Integer cstmrSno = jwtTokenUtil.getCstmrSnoByToken(); + String userId = jwtTokenUtil.getUserIdByToken(); + AnctCstmrModel cstmrInfo = ptyCstmrQueryRepository.findByCstmrSno(cstmrSno); + String userCi = cstmrInfo.getIpinCi(); + + + String idntfNum = null; + if (rq != null && rq.getIdntfNum() != null && !rq.getIdntfNum().isEmpty()) { + idntfNum = rq.getIdntfNum(); + } + + String confirmKey = UUID.randomUUID().toString(); + String params = null; + byte[] qr = null; + try { + TsQrcodeRq tsRq = TsQrcodeRq.builder() + .rtnUrl(APP_HOST + TS_RETURN_URI) + .reqId(confirmKey) + .submittype(idntfNum) + .applyUser(userCi) + .build(); + +// params = JsonUtils.toJson(tsRq); +/* + + tsdronewallet://kotsa.or.kr + ? type=5 + & rtnUrl= http://121.190.193.50:6081/api/external/laanc/vc/callback + & reqId=0b42b0af-3875-4a21-b57b-bb93ffcb3cfc + & submittype=C1CM0231251 + & applyUser=dzT9zrm1JJRbrT1oRsUbvXYDfbAtXG5QOZjbIVHPaklSZ2PTw8ojYdJyeTrdQdtKIGFM5Z7xfrN/Crm6iGRLkA== + */ + + params = UriComponentsBuilder + .fromUriString("tsdronewallet://kotsa.or.kr") + .queryParam("type", tsRq.getType()) + .queryParam("rtnUrl", tsRq.getRtnUrl()) + .queryParam("reqId", tsRq.getReqId()) + .queryParam("submittype", tsRq.getSubmittype()) + .queryParam("applyUser", tsRq.getApplyUser()) + .build() + .toUriString(); + + qr = tsService.createQrcode(params); + } catch (WriterException | IOException e) { + log.error("ERROR: ", e); + throw new CustomException(ErrorCode.FAIL, "QR코드 생성 실패"); + } + + // db 저장 - confirmKey(uuid) + ComConfirmBas comConfirmBas = ComConfirmBas.builder() + .confirmKey(confirmKey) + .status("GENERATED") + .targetType("TS_QRCODE") + .rqData(params) + .createUserId(userId) + .updateUserId(userId) + .build(); + + comConfirmBasRepository.save(comConfirmBas); + + log.info(">>> confirmKey [GENERATED] ", confirmKey); + return BasLaancQrcodeRs.builder() + .qrcode(qr) + .confirmKey(confirmKey) + .build(); + + } + + /** + * QR code 확인 + * QR code 촬영후 return url로 데이터 받은 이후 확인 프로세스 + * QR code 생성(PAV-KAC) > qr code 스캔(사용자) > 자격정보 전송(TS) > return url 자격정보 받음(PAV-KAC) > 확인(자격정보 확인)* + * + * @param confirmKey + * @return + */ + public PilotValidRs checkQrcode(String confirmKey) { + log.info(">>> confirmKey : {}", confirmKey); + String userIdByToken = jwtTokenUtil.getUserIdByToken(); + ComConfirmBas entity = comConfirmBasRepository.findFirstByConfirmKeyOrderByCreateDtDesc(confirmKey); + if(entity == null) throw new CustomException(ErrorCode.DATA_NOTFIND, "QR코드 조회 실패"); + if (!"RECEIVED".equals(entity.getStatus())){ + Map errorParam = new HashMap<>(); + errorParam.put("status", entity.getStatus()); + throw new CustomException(ErrorCode.DATA_NOTFIND, errorParam); + } + + // TODO 일자 검증 - 3분 초과 + Instant createDt = entity.getCreateDt().plus(3, ChronoUnit.MINUTES); + boolean flag = !createDt.isBefore(Instant.now()); + if (!flag) { + entity.setStatus("EXPIRED"); + entity.setUpdateUserId(userIdByToken); + comConfirmBasRepository.save(entity); + comConfirmBasRepository.flush(); + throw new CustomException(ErrorCode.QR_EXPIRED, "QR 기간 만료"); + } + + PilotValidRs rs = null; + String rsData = entity.getRsData(); + if(rsData != null && !rsData.isEmpty()){ + rs = JsonUtils.fromJson(rsData, PilotValidRs.class); + } + + return rs; + } + + /** + * TS 비행계획서 + * 드론원스탑에서 받은 데이터 받기 + * + * @param tsPlanRq + */ + public void createPlanDos(TsPlanRq tsPlanRq) { + // convert + BasLaancPlanRq rq = tsPlanRq.toBasLaancPlanRq(); + + + // 기존 로직대로 수행 + BasLaancValidatedRs basLaancValidatedRs = this.validationLaanc(rq); + if (!basLaancValidatedRs.isValid()) { + log.info("ts dron one stop validation fail : {}", basLaancValidatedRs); + return; + } + + try { + BasLaancLastRs flightPlan = this.createFlightPlan(rq); + } catch (Exception e) { + log.error("ts dron one stop create flight plan fail", e); + } + } } diff --git a/pav-server/src/main/java/com/palnet/biz/api/cns/faq/controller/CnsFaqController.java b/pav-server/src/main/java/com/palnet/biz/api/cns/faq/controller/CnsFaqController.java index 5ff5e8ef..3f597de5 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/cns/faq/controller/CnsFaqController.java +++ b/pav-server/src/main/java/com/palnet/biz/api/cns/faq/controller/CnsFaqController.java @@ -1,44 +1,68 @@ package com.palnet.biz.api.cns.faq.controller; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import com.palnet.biz.api.bas.laanc.model.BasLaancAprvRs; +import com.palnet.biz.api.cns.faq.model.FaqListModel; +import com.palnet.biz.api.cns.faq.model.FaqListRQModel; +import com.palnet.biz.api.cns.faq.model.FaqListRSModel; +import com.palnet.biz.api.cns.faq.model.FaqUpdateModel; +import com.palnet.biz.api.cns.faq.service.CnsFaqService; +import com.palnet.biz.api.comn.response.BasicResponse; import com.palnet.biz.api.comn.response.ErrorResponse; +import com.palnet.biz.api.comn.response.SuccessResponse; import com.palnet.comn.exception.CustomException; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.enums.ParameterIn; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.tags.Tag; -import org.springframework.data.domain.Page; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; -import com.palnet.biz.api.cns.faq.model.FaqListRQModel; -import com.palnet.biz.api.cns.faq.model.FaqListModel; -import com.palnet.biz.api.cns.faq.service.CnsFaqService; -import com.palnet.biz.api.comn.response.BasicResponse; -import com.palnet.biz.api.comn.response.SuccessResponse; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; +import java.util.HashMap; +import java.util.List; +import java.util.Map; @RestController @Slf4j -@Tag(name = "FAQ API", description = "FAQ 관련 API") @RequiredArgsConstructor @RequestMapping(value = "/api/bas/cns/faq") +@Tag(name = "FAQ", description = "FAQ 관련 API") public class CnsFaqController { private final CnsFaqService service; - /*FAQ 목록 조회*/ - @Tag(name = "FAQ API", description = "FAQ 관련 API") + /** + * FAQ 목록 조회하는 기능, + * FaqListRQModel 값에 있는 조건값으로 조회함. + * @param model + * @return + */ @GetMapping + @Operation(summary = "FAQ 조회", description = "FAQ를 조회하는 API 입니다.") + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "성공", + content = { + @io.swagger.v3.oas.annotations.media.Content(mediaType = "application/json", + array = @io.swagger.v3.oas.annotations.media.ArraySchema( + schema = @io.swagger.v3.oas.annotations.media.Schema(implementation = FaqListModel.class))) + }) + }) public ResponseEntity getFaqList(FaqListRQModel model) { - List result = null; + List result = null; try { - result = service.getFaqList(model); + result = service.getFaqList(model); // FaQ 항목들 조회하는 기능 } catch (CustomException e) { + /** + * try{ + ... + } + * try 영역 안 코드들중 문제가 생기면 오는 곳. + * CustomException은 개발자가 "의도적으로" 낸 예외처리, + * log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌 + */ Map resultMap = new HashMap<>(); log.error("IGNORE : ", e); resultMap.put("result", false); @@ -46,6 +70,13 @@ public class CnsFaqController { resultMap.put("errorMessage", e.getMessage()); return ResponseEntity.ok().body(new SuccessResponse<>(resultMap)); } 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")); @@ -54,14 +85,36 @@ public class CnsFaqController { return ResponseEntity.ok().body(new SuccessResponse<>(result)); } - /*FAQ 상세 조회*/ - @Tag(name = "FAQ API", description = "FAQ 관련 API") + /** + * FAQ 상세 조회하는 기능, + * 일련번호[sno]로 조회함. + * @param sno + * @return + */ @GetMapping("/{sno}") - public ResponseEntity getFaqDetail(@PathVariable("sno") int sno) { - FaqListModel result = null; + @Operation(summary = "FAQ 상세 조회", description = "특정 FAQ만 조회하는 API 입니다. sno 값 : 1, 2, 등 ....") + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "성공", + content = { + @io.swagger.v3.oas.annotations.media.Content(mediaType = "application/json", + array = @io.swagger.v3.oas.annotations.media.ArraySchema( + schema = @io.swagger.v3.oas.annotations.media.Schema(implementation = FaqListModel.class))) + }) + }) + public ResponseEntity getFaqDetail( + @Parameter(name="sno", description = "FAQ 시리얼 넘버", in = ParameterIn.PATH, example = "17")@PathVariable int sno) { + FaqListRSModel result = null; try { - result = service.getFaqDetail(sno); + result = service.getFaqDetail(sno); // 일련번호[sno]로 상세정보를 조회하는 기능 } catch (CustomException e) { + /** + * try{ + ... + } + * try 영역 안 코드들중 문제가 생기면 오는 곳. + * CustomException은 개발자가 "의도적으로" 낸 예외처리, + * log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌 + */ Map resultMap = new HashMap<>(); log.error("IGNORE : ", e); resultMap.put("result", false); @@ -69,6 +122,13 @@ public class CnsFaqController { resultMap.put("errorMessage", e.getMessage()); return ResponseEntity.ok().body(new SuccessResponse<>(resultMap)); } 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,14 +137,35 @@ public class CnsFaqController { return ResponseEntity.ok().body(new SuccessResponse<>(result)); } - /*FAQ 작성*/ - @Tag(name = "FAQ API", description = "FAQ 관련 API") + /** + * FAQ 작성하는 기능, + * FaqListModel모델에 있는 값으로 작성하는 기능. + * @param model + * @return + */ @PostMapping + @Operation(summary = "FAQ 작성", description = "FAQ를 작성하는 API 입니다.") + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "성공", + content = { + @io.swagger.v3.oas.annotations.media.Content(mediaType = "application/json", + array = @io.swagger.v3.oas.annotations.media.ArraySchema( + schema = @io.swagger.v3.oas.annotations.media.Schema(implementation = SuccessResponse.class))) + }) + }) public ResponseEntity insertFaq(@RequestBody FaqListModel model) { boolean result = false; try { - result = service.insertFaq(model); + result = service.insertFaq(model); // FaQ 추가하는 기능 } catch (CustomException e) { + /** + * try{ + ... + } + * try 영역 안 코드들중 문제가 생기면 오는 곳. + * CustomException은 개발자가 "의도적으로" 낸 예외처리, + * log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌 + */ Map resultMap = new HashMap<>(); log.error("IGNORE : ", e); resultMap.put("result", false); @@ -92,6 +173,13 @@ public class CnsFaqController { resultMap.put("errorMessage", e.getMessage()); return ResponseEntity.ok().body(new SuccessResponse<>(resultMap)); } 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")); @@ -102,14 +190,35 @@ public class CnsFaqController { } - /*FAQ 업데이트*/ - @Tag(name = "FAQ API", description = "FAQ 관련 API") + /** + * FAQ 업데이트 기능, + * FaqListModel 모델에 있는 값으로 업데이트함. + * @param model + * @return + */ @PutMapping - public ResponseEntity updateFaq(@RequestBody FaqListModel model) { + @Operation(summary = "FAQ 수정", description = "FAQ를 수정하는 API 입니다.") + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "성공", + content = { + @io.swagger.v3.oas.annotations.media.Content(mediaType = "application/json", + array = @io.swagger.v3.oas.annotations.media.ArraySchema( + schema = @io.swagger.v3.oas.annotations.media.Schema(implementation = SuccessResponse.class))) + }) + }) + public ResponseEntity updateFaq(@RequestBody FaqUpdateModel model) { boolean result = false; try { - result = service.updateFaq(model); + result = service.updateFaq(model); // FaQ 수정하는 기능 } catch (CustomException e) { + /** + * try{ + ... + } + * try 영역 안 코드들중 문제가 생기면 오는 곳. + * CustomException은 개발자가 "의도적으로" 낸 예외처리, + * log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌 + */ Map resultMap = new HashMap<>(); log.error("IGNORE : ", e); resultMap.put("result", false); @@ -117,6 +226,13 @@ public class CnsFaqController { resultMap.put("errorMessage", e.getMessage()); return ResponseEntity.ok().body(new SuccessResponse<>(resultMap)); } 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")); @@ -126,14 +242,26 @@ public class CnsFaqController { } - /*FAQ 논리 삭제*/ - @Tag(name = "FAQ API", description = "FAQ 관련 API") + /** + * FAQ 삭제하는 기능, + * 일련번호[sno]로 삭제하는 기능. + * @param sno + * @return + */ @DeleteMapping("/{sno}") + @Operation(summary = "FAQ 삭제", description = "특정 FAQ를 논리 삭제하는 API 입니다. sno 예시 : 1, 2, 등 ...") public ResponseEntity deleteFaq(@PathVariable("sno") int sno) { // TODO 성공/실패 상태값 전송 try { - service.deleteFaq(sno); + service.deleteFaq(sno); // 일련번호[sno]로 삭제하는 기능 } catch (CustomException e) { + /** + * try{ + ... + } + * try 영역 안 코드들중 문제가 생기면 오는 곳. + * log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌 + */ Map resultMap = new HashMap<>(); log.error("IGNORE : ", e); resultMap.put("result", false); @@ -141,6 +269,13 @@ public class CnsFaqController { resultMap.put("errorMessage", e.getMessage()); return ResponseEntity.ok().body(new SuccessResponse<>(resultMap)); } 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/cns/faq/model/FaqListModel.java b/pav-server/src/main/java/com/palnet/biz/api/cns/faq/model/FaqListModel.java index d4782c00..9151236d 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/cns/faq/model/FaqListModel.java +++ b/pav-server/src/main/java/com/palnet/biz/api/cns/faq/model/FaqListModel.java @@ -2,31 +2,43 @@ package com.palnet.biz.api.cns.faq.model; import java.time.Instant; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; @Data public class FaqListModel { + @Schema(hidden = true) private int faqSno; + @Schema(description = "FAQ 분류" , example = "장치신고") private String category; + @Schema(description = "작성할 글의 제목" , example = "제목 샘플") private String title; + @Schema(description = "작성할 글의 내용" , example = "내용 샘플") private String content; + @Schema(hidden = true) private int viewCnt; + @Schema(description = "표출 여부" , example = "Y") private String expsrYn; -// private String delYn; + @Schema(hidden = true) + private String delYn; + @Schema(hidden = true) private String createUserId; - + + @Schema(description = "생성일자", example = "2023-12-12", implementation = String.class) private Instant createDt; + @Schema(hidden = true) private String updateUserId; + @Schema(description = "업데이트 일자", example = "2023-12-12", implementation = String.class) private Instant updateDt; } \ No newline at end of file diff --git a/pav-server/src/main/java/com/palnet/biz/api/cns/faq/model/FaqListRQModel.java b/pav-server/src/main/java/com/palnet/biz/api/cns/faq/model/FaqListRQModel.java index 1be952de..e16d8270 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/cns/faq/model/FaqListRQModel.java +++ b/pav-server/src/main/java/com/palnet/biz/api/cns/faq/model/FaqListRQModel.java @@ -1,12 +1,15 @@ package com.palnet.biz.api.cns.faq.model; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; @Data public class FaqListRQModel { + @Schema(description = "FAQ 카테고리" , example = "비행승인") private String category; + @Schema(description = "해당 단어가 포함된 제목 검색" , example = "비행") private String word; } \ No newline at end of file diff --git a/pav-server/src/main/java/com/palnet/biz/api/cns/faq/model/FaqListRSModel.java b/pav-server/src/main/java/com/palnet/biz/api/cns/faq/model/FaqListRSModel.java new file mode 100644 index 00000000..5aedfb26 --- /dev/null +++ b/pav-server/src/main/java/com/palnet/biz/api/cns/faq/model/FaqListRSModel.java @@ -0,0 +1,32 @@ +package com.palnet.biz.api.cns.faq.model; + +import java.time.Instant; + +import lombok.Data; + +@Data +public class FaqListRSModel { + + private int faqSno; + + private String category; + + private String title; + + private String content; + + private int viewCnt; + + private String expsrYn; + + private String delYn; + + private String createUserId; + + private Instant createDt; + + private String updateUserId; + + private Instant updateDt; + +} diff --git a/pav-server/src/main/java/com/palnet/biz/api/cns/faq/model/FaqUpdateModel.java b/pav-server/src/main/java/com/palnet/biz/api/cns/faq/model/FaqUpdateModel.java new file mode 100644 index 00000000..c35b4e03 --- /dev/null +++ b/pav-server/src/main/java/com/palnet/biz/api/cns/faq/model/FaqUpdateModel.java @@ -0,0 +1,46 @@ +package com.palnet.biz.api.cns.faq.model; + +import java.time.Instant; + +import com.fasterxml.jackson.annotation.JsonIgnore; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +public class FaqUpdateModel { + + @Schema(description = "수정할 글의 번호" , example = "17") + private int faqSno; + + @Schema(description = "FAQ 분류" , example = "장치신고") + private String category; + + @Schema(description = "수정할 글의 제목" , example = "제목 수정 샘플") + private String title; + + @Schema(description = "수정할 글의 내용" , example = "내용 수정 샘플") + private String content; + + @Schema(hidden = true) + private int viewCnt; + + @Schema(description = "표출 여부" , example = "Y") + private String expsrYn; + + @Schema(hidden = true) + private String delYn; + + @Schema(hidden = true) + private String createUserId; + + @Schema(hidden = true) + private Instant createDt; + + @Schema(description = "수정한 사람" , example = "palnet") + private String updateUserId; + + @Schema(description = "업데이트 일자") + private Instant updateDt; + +} diff --git a/pav-server/src/main/java/com/palnet/biz/api/cns/faq/service/CnsFaqService.java b/pav-server/src/main/java/com/palnet/biz/api/cns/faq/service/CnsFaqService.java index 5c0e8d17..e3750a99 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/cns/faq/service/CnsFaqService.java +++ b/pav-server/src/main/java/com/palnet/biz/api/cns/faq/service/CnsFaqService.java @@ -3,6 +3,8 @@ package com.palnet.biz.api.cns.faq.service; import com.palnet.biz.api.acnt.jwt.utils.JwtTokenUtil; import com.palnet.biz.api.cns.faq.model.FaqListModel; import com.palnet.biz.api.cns.faq.model.FaqListRQModel; +import com.palnet.biz.api.cns.faq.model.FaqListRSModel; +import com.palnet.biz.api.cns.faq.model.FaqUpdateModel; import com.palnet.biz.jpa.entity.CnsFaqBas; import com.palnet.biz.jpa.repository.cns.CnsFaqBasRepository; import com.palnet.biz.jpa.repository.cns.CnsFaqQueryRepository; @@ -25,23 +27,38 @@ public class CnsFaqService { private final CnsFaqBasRepository cnsFaqBasRepository; private final JwtTokenUtil jwtTokenUtil; - public List getFaqList(FaqListRQModel model){ - - List result = query.getFaqList(model.getCategory(), model.getWord()); + /** + * FaQ 항목들 조회하는 기능. + * @param model + * @return + */ + public List getFaqList(FaqListRQModel model){ + + List result = query.getFaqList(model.getCategory(), model.getWord()); if(result == null) result = new ArrayList<>(); return result; } - - public FaqListModel getFaqDetail(int sno){ + + /** + * 일련번호[sno]로 상세정보를 조회하는 기능. + * @param sno + * @return + */ + public FaqListRSModel getFaqDetail(int sno){ cnsFaqBasRepository.updateViewCnt(sno); - FaqListModel result = query.getFaqDetail(sno); + FaqListRSModel result = query.getFaqDetail(sno); if(result == null) throw new CustomException(ErrorCode.DATA_NO); return result; } + /** + * FaQ 추가하는 기능. + * @param model + * @return + */ @Transactional public boolean insertFaq(FaqListModel model){ String userId = jwtTokenUtil.getUserIdByToken(); @@ -69,8 +86,13 @@ public class CnsFaqService { } } + /** + * FaQ 수정하는 기능. + * @param model + * @return + */ @Transactional - public boolean updateFaq(FaqListModel model) { + public boolean updateFaq(FaqUpdateModel model) { String userId = jwtTokenUtil.getUserIdByToken(); CnsFaqBas prevData = cnsFaqBasRepository.findById(model.getFaqSno()).orElseThrow(() -> new CustomException(ErrorCode.DATA_NO)); @@ -92,6 +114,10 @@ public class CnsFaqService { } } + /** + * 일련번호[sno]로 삭제하는 기능. + * @param sno + */ public void deleteFaq(int sno) { // TODO 반환값이 실행한 갯수인지 확인 필요 diff --git a/pav-server/src/main/java/com/palnet/biz/api/cns/qna/controller/CnsQnaController.java b/pav-server/src/main/java/com/palnet/biz/api/cns/qna/controller/CnsQnaController.java index ad159a14..4673b787 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/cns/qna/controller/CnsQnaController.java +++ b/pav-server/src/main/java/com/palnet/biz/api/cns/qna/controller/CnsQnaController.java @@ -1,30 +1,48 @@ package com.palnet.biz.api.cns.qna.controller; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + import com.palnet.biz.api.acnt.jwt.utils.JwtTokenUtil; -import com.palnet.biz.api.cns.qna.model.*; +import com.palnet.biz.api.cns.qna.model.QnaBasModel; +import com.palnet.biz.api.cns.qna.model.QnaDetailRSModel; +import com.palnet.biz.api.cns.qna.model.QnaInsertAnserRQModel; +import com.palnet.biz.api.cns.qna.model.QnaInsertRQModel; +import com.palnet.biz.api.cns.qna.model.QnaListAdminRQ; +import com.palnet.biz.api.cns.qna.model.QnaSelectListRQ; import com.palnet.biz.api.cns.qna.service.CnsQnaService; import com.palnet.biz.api.comn.response.BasicResponse; import com.palnet.biz.api.comn.response.ErrorResponse; import com.palnet.biz.api.comn.response.SuccessResponse; import com.palnet.comn.code.RSErrorCode; import com.palnet.comn.exception.CustomException; -import io.swagger.annotations.ApiOperation; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.enums.ParameterIn; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -@RestController @Slf4j -@Tag(name = "QNA", description = "QNA 관련 API") @RequiredArgsConstructor +@RestController +@Tag(name = "QNA", description = "QNA 관련 API") @RequestMapping("/api/cns/qna") public class CnsQnaController { @@ -32,14 +50,35 @@ public class CnsQnaController { private final JwtTokenUtil jwtTokenUtil; + /** + * QnA 등록하는 기능, + * QnaInsertRQModel 모델에 요청값으로 QnA를 등록하는 기능. + * @param rq + * @return + */ @PostMapping(consumes = "multipart/form-data") - @Tag(name = "QNA", description = "QNA 관련 API") - @ApiOperation(value = "QnA 등록 - 사용자") + @Operation(summary = "QNA 등록 (사용자)", description = "사용자 권한으로 QNA를 등록하는 API 입니다.") + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "성공", + content = { + @io.swagger.v3.oas.annotations.media.Content(mediaType = "application/json", + array = @io.swagger.v3.oas.annotations.media.ArraySchema( + schema = @io.swagger.v3.oas.annotations.media.Schema(implementation = boolean.class))) + }) + }) public ResponseEntity insertQna(QnaInsertRQModel rq) { boolean result = false; try { - result = cnsQnaService.insertQna(rq); + result = cnsQnaService.insertQna(rq); // Qna 추가 하는기능 } catch (CustomException e) { + /** + * try{ + ... + } + * try 영역 안 코드들중 문제가 생기면 오는 곳. + * CustomException은 개발자가 "의도적으로" 낸 예외처리, + * log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌 + */ Map resultMap = new HashMap<>(); log.error("IGNORE : ", e); resultMap.put("result", false); @@ -47,6 +86,13 @@ public class CnsQnaController { resultMap.put("errorMessage", e.getMessage()); return ResponseEntity.ok().body(new SuccessResponse<>(resultMap)); } 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")); @@ -55,15 +101,36 @@ public class CnsQnaController { return ResponseEntity.ok().body(new SuccessResponse<>(result)); } + /** + * QnA리스트 조회하는 기능[관리자], + * QnaListAdminRQ 조건값에 따라 조회함. + * @param rq + * @return + */ @GetMapping - @Tag(name = "QNA", description = "QNA 관련 API") - @ApiOperation(value = "QnA 리스트 조회-관리자") + @Operation(summary = "QNA 리스트 조회 (관리자)", description = "QNA 리스트를 관리자 권한으로 조회하는 API 입니다.") + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "성공", + content = { + @io.swagger.v3.oas.annotations.media.Content(mediaType = "application/json", + array = @io.swagger.v3.oas.annotations.media.ArraySchema( + schema = @io.swagger.v3.oas.annotations.media.Schema(implementation = QnaBasModel.class))) + }) + }) public ResponseEntity selectQna(QnaListAdminRQ rq) { List result = new ArrayList<>(); try { - result = cnsQnaService.selectQnaList(rq); + result = cnsQnaService.selectQnaList(rq); // Qna리스트 조회하는 기능 } catch (CustomException e) { + /** + * try{ + ... + } + * try 영역 안 코드들중 문제가 생기면 오는 곳. + * CustomException은 개발자가 "의도적으로" 낸 예외처리, + * log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌 + */ Map resultMap = new HashMap<>(); log.error("IGNORE : ", e); resultMap.put("result", false); @@ -71,6 +138,13 @@ public class CnsQnaController { resultMap.put("errorMessage", e.getMessage()); return ResponseEntity.ok().body(new SuccessResponse<>(resultMap)); } 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,15 +154,36 @@ public class CnsQnaController { } + /** + * QnA리스트 조회하는 기능[관리자], + * QnaSelectListRQ 값에 따라서 조회함. + * @param rq + * @return + */ @GetMapping("/user") - @Tag(name = "QNA", description = "QNA 관련 API") - @ApiOperation(value = "QnA 리스트 조회-사용자") + @Operation(summary = "QNA 리스트 조회 (사용자)", description = "QNA 리스트를 사용자 권한으로 조회하는 API 입니다.") + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "성공", + content = { + @io.swagger.v3.oas.annotations.media.Content(mediaType = "application/json", + array = @io.swagger.v3.oas.annotations.media.ArraySchema( + schema = @io.swagger.v3.oas.annotations.media.Schema(implementation = QnaBasModel.class))) + }) + }) public ResponseEntity selectQnaForUser(QnaSelectListRQ rq) { List result = new ArrayList<>(); try { result = cnsQnaService.selectQnaForUser(rq); } catch (CustomException e) { + /** + * try{ + ... + } + * try 영역 안 코드들중 문제가 생기면 오는 곳. + * CustomException은 개발자가 "의도적으로" 낸 예외처리, + * log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌 + */ Map resultMap = new HashMap<>(); log.error("IGNORE : ", e); resultMap.put("result", false); @@ -96,6 +191,13 @@ public class CnsQnaController { resultMap.put("errorMessage", e.getMessage()); return ResponseEntity.ok().body(new SuccessResponse<>(resultMap)); } 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,14 +207,27 @@ public class CnsQnaController { } + /** + * QnA 상세보기 기능, + * QnA일련번호[qnaSno]값으로 조회함. + * @param qnaSno + * @return + */ @GetMapping("/{qnaSno}") - @Tag(name = "QNA", description = "QNA 관련 API") - @ApiOperation(value = "QnA 상세보기") - public ResponseEntity detailQna(@PathVariable int qnaSno) { + @Operation(summary = "QNA 리스트 상세 조회", description = "QNA 리스트를 상세하게 조회하는 API 입니다.") + public ResponseEntity detailQna(@Parameter(name="qnaSno", description = "QnA일련번호", in = ParameterIn.PATH, example = "295") @PathVariable int qnaSno) { QnaDetailRSModel result = null; try { - result = cnsQnaService.getQnaDetail(qnaSno); + result = cnsQnaService.getQnaDetail(qnaSno); // Qna 상세불러오기 기능 } catch (CustomException e) { + /** + * try{ + ... + } + * try 영역 안 코드들중 문제가 생기면 오는 곳. + * CustomException은 개발자가 "의도적으로" 낸 예외처리, + * log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌 + */ Map resultMap = new HashMap<>(); log.error("IGNORE : ", e); resultMap.put("result", false); @@ -120,6 +235,13 @@ public class CnsQnaController { resultMap.put("errorMessage", e.getMessage()); return ResponseEntity.ok().body(new SuccessResponse<>(resultMap)); } 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")); @@ -128,14 +250,35 @@ public class CnsQnaController { return ResponseEntity.ok().body(new SuccessResponse<>(result)); } + /** + * QnA수정 하는 기능[사용자], + * QnaInsertRQModel 모델에 입력받은 사항들을 수정함. + * @param rq + * @return + */ @PutMapping(consumes = "multipart/form-data") - @Tag(name = "QNA", description = "QNA 관련 API") - @ApiOperation(value = "QnA 수정 - 사용자") + @Operation(summary = "QNA 수정 (사용자)", description = "QNA를 사용자 권한으로 수정하는 API 입니다.") + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "성공", + content = { + @io.swagger.v3.oas.annotations.media.Content(mediaType = "application/json", + array = @io.swagger.v3.oas.annotations.media.ArraySchema( + schema = @io.swagger.v3.oas.annotations.media.Schema(implementation = boolean.class))) + }) + }) public ResponseEntity updateQna(QnaInsertRQModel rq) { boolean result = false; try { - result = cnsQnaService.updateQna(rq); + result = cnsQnaService.updateQna(rq); // Qna 업데이트하는 기능 } catch (CustomException e) { + /** + * try{ + ... + } + * try 영역 안 코드들중 문제가 생기면 오는 곳. + * CustomException은 개발자가 "의도적으로" 낸 예외처리, + * log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌 + */ Map resultMap = new HashMap<>(); log.error("IGNORE : ", e); resultMap.put("result", false); @@ -143,6 +286,13 @@ public class CnsQnaController { resultMap.put("errorMessage", e.getMessage()); return ResponseEntity.ok().body(new SuccessResponse<>(resultMap)); } 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")); @@ -152,15 +302,28 @@ public class CnsQnaController { } + /** + * QnA삭제하는 기능, + * QnA일련번호[qnaSno]로 삭제함. + * @param qnaSno + * @return + */ @DeleteMapping("/{qnaSno}") - @Tag(name = "QNA", description = "QNA 관련 API") - @ApiOperation(value = "QnA 삭제하기") - public ResponseEntity deleteQna(@PathVariable int qnaSno) { + @Operation(summary = "QNA 삭제", description = "QNA를 삭제하는 API 입니다.") + public ResponseEntity deleteQna(@Parameter(name="qnaSno", description = "QnA일련번호", in = ParameterIn.PATH, example = "17") @PathVariable int qnaSno) { // TODO 관리자만 삭제 가능 여부인지 확인 필요 boolean result = false; try { - result = cnsQnaService.deleteQna(qnaSno); + result = cnsQnaService.deleteQna(qnaSno); // Qna 삭제하기, file들도 모두 논리삭제하는 기능. } catch (CustomException e) { + /** + * try{ + ... + } + * try 영역 안 코드들중 문제가 생기면 오는 곳. + * CustomException은 개발자가 "의도적으로" 낸 예외처리, + * log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌 + */ Map resultMap = new HashMap<>(); log.error("IGNORE : ", e); resultMap.put("result", false); @@ -168,6 +331,13 @@ public class CnsQnaController { resultMap.put("errorMessage", e.getMessage()); return ResponseEntity.ok().body(new SuccessResponse<>(resultMap)); } 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")); @@ -176,9 +346,22 @@ public class CnsQnaController { return ResponseEntity.ok().body(new SuccessResponse<>(result)); } + /** + * QnA 답변등록하는 기능[관리자], + * QnaInsertAnserRQModel에 입력받은 값으로 답변을 등록함. + * @param rq + * @return + */ @PutMapping("/answer") - @Tag(name = "QNA", description = "QNA 관련 API") - @ApiOperation(value = "QnA 답변 등록 - 관리자") + @Operation(summary = "QNA 답변 등록(관리자)", description = "QNA에 대한 답변을 관리자 권한으로 등록하는 API 입니다.") + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "성공", + content = { + @io.swagger.v3.oas.annotations.media.Content(mediaType = "application/json", + array = @io.swagger.v3.oas.annotations.media.ArraySchema( + schema = @io.swagger.v3.oas.annotations.media.Schema(implementation = boolean.class))) + }) + }) public ResponseEntity insertAnswer(@RequestBody QnaInsertAnserRQModel rq) { // TODO 추후 auth -> role 체크로 변경 boolean result = false; @@ -188,8 +371,16 @@ public class CnsQnaController { return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body(new ErrorResponse(RSErrorCode.AUTH_ERROR)); } - result = cnsQnaService.insertAnswer(rq); + result = cnsQnaService.insertAnswer(rq); // 답변추가하는 기능. } catch (CustomException e) { + /** + * try{ + ... + } + * try 영역 안 코드들중 문제가 생기면 오는 곳. + * CustomException은 개발자가 "의도적으로" 낸 예외처리, + * log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌 + */ Map resultMap = new HashMap<>(); log.error("IGNORE : ", e); resultMap.put("result", false); @@ -197,6 +388,13 @@ public class CnsQnaController { resultMap.put("errorMessage", e.getMessage()); return ResponseEntity.ok().body(new SuccessResponse<>(resultMap)); } 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")); @@ -205,4 +403,4 @@ public class CnsQnaController { return ResponseEntity.ok().body(new SuccessResponse<>(result)); } -} +} \ No newline at end of file diff --git a/pav-server/src/main/java/com/palnet/biz/api/cns/qna/model/QnaInsertAnserRQModel.java b/pav-server/src/main/java/com/palnet/biz/api/cns/qna/model/QnaInsertAnserRQModel.java index d7440d65..fd1deafa 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/cns/qna/model/QnaInsertAnserRQModel.java +++ b/pav-server/src/main/java/com/palnet/biz/api/cns/qna/model/QnaInsertAnserRQModel.java @@ -1,17 +1,21 @@ package com.palnet.biz.api.cns.qna.model; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; @Data public class QnaInsertAnserRQModel { + @Schema(description = "답변을 달 qna 번호" , example = "16") private Integer qnaSno; // private Integer targetSno; // 상위 Qna 번호 + @Schema(description = "답변 내용" , example = "답변 샘플입니다.") private String anserContent; // private String anserUserNm; // private Instant anserProcDt; + @Schema(description = "답변 상태" , example = "Y") private String anserStatus; } diff --git a/pav-server/src/main/java/com/palnet/biz/api/cns/qna/model/QnaListAdminRQ.java b/pav-server/src/main/java/com/palnet/biz/api/cns/qna/model/QnaListAdminRQ.java index 30c4dd2d..9d286bf9 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/cns/qna/model/QnaListAdminRQ.java +++ b/pav-server/src/main/java/com/palnet/biz/api/cns/qna/model/QnaListAdminRQ.java @@ -1,15 +1,19 @@ package com.palnet.biz.api.cns.qna.model; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; @Data public class QnaListAdminRQ { // 문의유형 + @Schema(description = "검색 타입" , example = "불만") private String category; // 답변상태 + @Schema(description = "답변 여부" , example = "Y") private String anserStatus; // 작성자 + @Schema(description = "작성자" , example = "팔네트웍스") private String createUserNm; } diff --git a/pav-server/src/main/java/com/palnet/biz/api/cns/qna/model/QnaSelectListRQ.java b/pav-server/src/main/java/com/palnet/biz/api/cns/qna/model/QnaSelectListRQ.java index dd267b7b..ca42ef7c 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/cns/qna/model/QnaSelectListRQ.java +++ b/pav-server/src/main/java/com/palnet/biz/api/cns/qna/model/QnaSelectListRQ.java @@ -1,12 +1,18 @@ package com.palnet.biz.api.cns.qna.model; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; @Data public class QnaSelectListRQ { + @Schema(description = "검색 타입" , example = "TITLE") private String searchType; - private String word; + + @Schema(description = "검색어" , example = "드론") + private String word; + + @Schema(description = "카테고리" , example = "문의") private String category; -} +} \ No newline at end of file diff --git a/pav-server/src/main/java/com/palnet/biz/api/cns/qna/service/CnsQnaService.java b/pav-server/src/main/java/com/palnet/biz/api/cns/qna/service/CnsQnaService.java index f3f719ec..c6f9d3f9 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/cns/qna/service/CnsQnaService.java +++ b/pav-server/src/main/java/com/palnet/biz/api/cns/qna/service/CnsQnaService.java @@ -41,11 +41,11 @@ public class CnsQnaService { private final JwtTokenUtil jwtTokenUtil; /** - * Qna 삭제하기, file들도 모두 논리삭제함. - * + * Qna 삭제하기, file들도 모두 논리삭제하는 기능. * @param qnaSno * @return */ + // @Transactional는 데이터베이스의 정합성을 위해 사용합니다, 추가 수정 삭제 등에서 사용합니다, 이 기능에서는 삭제컬럼은 수정했기 때문에 사용했습니다. @Transactional public boolean deleteQna(int qnaSno) { @@ -62,11 +62,11 @@ public class CnsQnaService { } /** - * Qna 업데이트하기 - * + * Qna 업데이트하는 기능. * @param rq * @return */ + // @Transactional는 데이터베이스의 정합성을 위해 사용합니다, 추가 수정 삭제 등에서 사용합니다, 이 기능에서는 수정하기 때문에 사용합니다. @Transactional public boolean updateQna(QnaInsertRQModel rq) { @@ -77,7 +77,7 @@ public class CnsQnaService { List prevFileSnoList = new ArrayList<>(); List currentFileSnoList = new ArrayList<>(); if (entity.getFileGroupNo() != null) { - List prevFileInfos = comnFileService.getNormalFileListByGroupNo(entity.getFileGroupNo()); + List prevFileInfos = comnFileService.getNormalFileListByGroupNo(entity.getFileGroupNo()); // 파일그룹번호[fileGroupNo]에 해당하는 파일등 모두 가져오는 기능. prevFileSnoList = prevFileInfos.stream().map(ComnFileModel::getFileSno).collect(Collectors.toList()); } if (rq.getFileInfos() != null) { @@ -112,20 +112,22 @@ public class CnsQnaService { } /** - * Qna 상세불러오기 - * + * Qna 상세불러오기 기능. * @param qnaSno * @return */ - @Transactional // 조회수 증가하기떄문 + // @Transactional는 데이터베이스의 정합성을 위해 사용합니다, 추가 수정 삭제 등에서 사용합니다, 이 기능에서는 조회수 증가하기 떄문에 사용했습니다. + @Transactional public QnaDetailRSModel getQnaDetail(int qnaSno) { cnsQnaBasRepository.pulsViewCount(qnaSno); CnsQnaBas entity = cnsQnaBasRepository.findFirstByQnaSnoAndTargetSnoAndDelYnAndExpsrYn(qnaSno, 0, "N", "Y"); + if(entity == null) throw new CustomException(ErrorCode.DATA_NO); + List files = null; if (entity.getFileGroupNo() != null && entity.getFileGroupNo() != 0) - files = comnFileService.getNormalFileListByGroupNo(entity.getFileGroupNo()); + files = comnFileService.getNormalFileListByGroupNo(entity.getFileGroupNo()); // 파일그룹번호[fileGroupNo]에 해당하는 파일등 모두 가져오는 기능. QnaDetailRSModel model = CnsQnaMapper.MAPPER.toModel(entity); PtyCstmrBas user = ptyCstmrBasRepository.findByUserId(entity.getCreateUserId()).orElse(null); @@ -141,7 +143,7 @@ public class CnsQnaService { } /** - * Qna리스트 조회 + * Qna리스트 조회하는 기능[관리자]. * * @param rq * @return @@ -150,14 +152,18 @@ public class CnsQnaService { return cnsQnaQueryRepository.getQnaList(rq); } + /** + * Qna리스트 조회하는 기능[유저] + * @param rq + * @return + */ public List selectQnaForUser(QnaSelectListRQ rq) { String userId = jwtTokenUtil.getUserIdByToken(); return cnsQnaQueryRepository.getQnaListForUser(rq, userId); } /** - * QnaInsert - * + * Qna 추가 하는기능. * @param rq * @return */ @@ -188,6 +194,11 @@ public class CnsQnaService { } + /** + * 답변추가하는 기능. + * @param rq + * @return + */ public boolean insertAnswer(QnaInsertAnserRQModel rq) { CnsQnaBas entity = cnsQnaBasRepository.findByQnaSnoAndDelYnAndExpsrYn(rq.getQnaSno(), "N", "Y"); if (entity == null) throw new CustomException(ErrorCode.DATA_NOTFIND); diff --git a/pav-server/src/main/java/com/palnet/biz/api/comn/coordinate/controller/ComnCoordinateController.java b/pav-server/src/main/java/com/palnet/biz/api/comn/coordinate/controller/ComnCoordinateController.java new file mode 100644 index 00000000..4d16e68d --- /dev/null +++ b/pav-server/src/main/java/com/palnet/biz/api/comn/coordinate/controller/ComnCoordinateController.java @@ -0,0 +1,64 @@ +package com.palnet.biz.api.comn.coordinate.controller; + +import java.util.HashMap; +import java.util.Map; + +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.palnet.biz.api.comn.coordinate.model.CompotentAuthorityRQ; +import com.palnet.biz.api.comn.coordinate.model.CompotentAuthorityRS; +import com.palnet.biz.api.comn.coordinate.service.ComnCoordinateService; +import com.palnet.biz.api.comn.response.BasicResponse; +import com.palnet.biz.api.comn.response.ErrorResponse; +import com.palnet.biz.api.comn.response.SuccessResponse; +import com.palnet.comn.exception.CustomException; + +import io.swagger.annotations.ApiOperation; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/api/comn/coordinate") +@Slf4j +@Tag(name = "공통 API", description = "공통 API") +public class ComnCoordinateController { + + private final ComnCoordinateService comnCoordinateService; + + /** + * 좌표로 관할기관 가져오기 + * @param rq + * @return + */ + @GetMapping("/comptent-authority") + @ApiOperation(value = "좌표로 관할 기관청 가져오기") + @Tag(name = "공통 API", description = "공통 API") + public ResponseEntity getCompetentAuthority(CompotentAuthorityRQ rq){ + + CompotentAuthorityRS result = new CompotentAuthorityRS(); + + try { + result = comnCoordinateService.getCompetentAuthority(rq); + } catch (CustomException e) { + Map resultMap = new HashMap<>(); + log.error("IGNORE : ", e); + resultMap.put("result", false); + resultMap.put("errorCode", e.getErrorCode()); + resultMap.put("errorMessage", e.getMessage()); + return ResponseEntity.ok().body(new SuccessResponse<>(resultMap)); + } catch (Exception e) { + log.error("IGNORE : ", e); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body(new ErrorResponse("Server Error", "-1")); + + } + + return ResponseEntity.ok().body(new SuccessResponse<>(result)); + } +} diff --git a/pav-server/src/main/java/com/palnet/biz/api/comn/coordinate/model/CompotentAuthorityRQ.java b/pav-server/src/main/java/com/palnet/biz/api/comn/coordinate/model/CompotentAuthorityRQ.java new file mode 100644 index 00000000..b76efeae --- /dev/null +++ b/pav-server/src/main/java/com/palnet/biz/api/comn/coordinate/model/CompotentAuthorityRQ.java @@ -0,0 +1,12 @@ +package com.palnet.biz.api.comn.coordinate.model; + +import lombok.Data; + +@Data +public class CompotentAuthorityRQ { + + private Double lat; + + private Double lon; + +} diff --git a/pav-server/src/main/java/com/palnet/biz/api/comn/coordinate/model/CompotentAuthorityRS.java b/pav-server/src/main/java/com/palnet/biz/api/comn/coordinate/model/CompotentAuthorityRS.java new file mode 100644 index 00000000..94450e78 --- /dev/null +++ b/pav-server/src/main/java/com/palnet/biz/api/comn/coordinate/model/CompotentAuthorityRS.java @@ -0,0 +1,14 @@ +package com.palnet.biz.api.comn.coordinate.model; + +import java.util.List; + +import com.palnet.biz.jpa.entity.FltCptAuthBas; + +import lombok.Data; + +@Data +public class CompotentAuthorityRS { + + private List fltCptpAuthBasList; + +} diff --git a/pav-server/src/main/java/com/palnet/biz/api/comn/coordinate/service/ComnCoordinateService.java b/pav-server/src/main/java/com/palnet/biz/api/comn/coordinate/service/ComnCoordinateService.java new file mode 100644 index 00000000..39ccdcab --- /dev/null +++ b/pav-server/src/main/java/com/palnet/biz/api/comn/coordinate/service/ComnCoordinateService.java @@ -0,0 +1,105 @@ +package com.palnet.biz.api.comn.coordinate.service; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import org.json.simple.JSONObject; +import org.json.simple.parser.ParseException; +import org.locationtech.jts.geom.Coordinate; +import org.springframework.stereotype.Service; + +import com.palnet.biz.api.comn.coordinate.model.CompotentAuthorityRQ; +import com.palnet.biz.api.comn.coordinate.model.CompotentAuthorityRS; +import com.palnet.biz.jpa.entity.FltCptAuthBas; +import com.palnet.biz.jpa.repository.flt.FltCptAuthAdminDistrictBasQueryRepository; +import com.palnet.comn.utils.FlightUtils; + +import lombok.RequiredArgsConstructor; + +@Service +@RequiredArgsConstructor +public class ComnCoordinateService { + + private final FltCptAuthAdminDistrictBasQueryRepository ffFltCptAuthAdminDistrictBasQueryRepository; + + + public CompotentAuthorityRS getCompetentAuthority(CompotentAuthorityRQ rq){ + + Coordinate coord = new Coordinate(rq.getLon(), rq.getLat()); + + JSONObject code = new JSONObject(); + try { + code = FlightUtils.getPlace(coord, false); + } catch (ParseException e) { + e.printStackTrace(); + } catch (IOException e){ + e.printStackTrace(); + } catch (Exception e){ + e.printStackTrace(); + } + + String[] scope = {"ctprvn", "sig", "emd", "li"}; + final String cd = (String) code.get("CD"); + + Set fltCptAuthBas = new HashSet(); + + for(int i = 0; i < scope.length; i++){ + String cdParam = this.codeParsing(cd, scope[i]); + List authList = ffFltCptAuthAdminDistrictBasQueryRepository.geFltCptAuthBas(cdParam); + + fltCptAuthBas.addAll(new HashSet(authList)); + } + + CompotentAuthorityRS result = new CompotentAuthorityRS(); + result.setFltCptpAuthBasList(new ArrayList<>(fltCptAuthBas)); + + return result; + } + + private String codeParsing(String cd, String scope){ + switch (scope) { + case "ctprvn": + + if(cd.length() < 2) break; + + cd = cd.substring(0, 2); + break; + case "sig": + + if(cd.length() < 5) break; + + cd = cd.substring(0, 5); + break; + case "emd": + + if(cd.length() < 8) break; + + cd = cd.substring(0, 8); + break; + case "li": + + if(cd.length() < 10) break; + + cd = cd.substring(0, 10); + break; + } + + int length = cd.length(); + int maxLength = 10; + + int difference = maxLength - length; + + StringBuilder sb = new StringBuilder(); + sb.append(cd); + + for(int i = 0; i < difference; i++){ + sb.append("0"); + } + + return sb.toString(); + } + +} diff --git a/pav-server/src/main/java/com/palnet/biz/api/comn/elev/controller/ComnElevController.java b/pav-server/src/main/java/com/palnet/biz/api/comn/elev/controller/ComnElevController.java index 765c57df..8f7a1f48 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/comn/elev/controller/ComnElevController.java +++ b/pav-server/src/main/java/com/palnet/biz/api/comn/elev/controller/ComnElevController.java @@ -8,7 +8,8 @@ import com.palnet.biz.api.comn.response.BasicResponse; import com.palnet.biz.api.comn.response.ErrorResponse; import com.palnet.biz.api.comn.response.SuccessResponse; import com.palnet.comn.exception.CustomException; -import io.swagger.annotations.ApiOperation; + +import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -32,16 +33,28 @@ public class ComnElevController { private final ComnElevService comnElevService; + /** + * + * @param rq + * @return + */ @PostMapping(value = "/ground") - @ApiOperation(value = "지표면 고도 가져오기") - @Tag(name = "공통 API", description = "공통 API") + @Operation(summary = "특정 좌표의 고도 가져오기", description = "특정 좌표의 해수면고도(MSL)를 입력하면 지표면고도(AGL)로 변환해 주는 API 입니다.") public ResponseEntity getGroundElev(@RequestBody List rq) { List rs = null; try { log.debug(">>> rq : {}", rq); - rs = comnElevService.getGroundElev(rq); + rs = comnElevService.getGroundElev(rq); // 지표면 고도 가져오는 기능 } catch (CustomException e) { + /** + * try{ + ... + } + * try 영역 안 코드들중 문제가 생기면 오는 곳. + * CustomException은 개발자가 "의도적으로" 낸 예외처리, + * log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌 + */ Map resultMap = new HashMap<>(); log.error("IGNORE : ", e); resultMap.put("result", false); @@ -49,6 +62,13 @@ public class ComnElevController { resultMap.put("errorMessage", e.getMessage()); return ResponseEntity.ok().body(new SuccessResponse<>(resultMap)); } 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")); @@ -57,16 +77,28 @@ public class ComnElevController { return ResponseEntity.ok().body(new SuccessResponse<>(rs)); } + /** + * MSL[해발고도]를 AGL[지표면고도]로 변환하는 기능. + * @param rq + * @return + */ @PostMapping(value = "/to/agl") - @ApiOperation(value = "msl을 agl로 변환") - @Tag(name = "공통 API", description = "공통 API") + @Operation(summary = "해수면고도 -> 지표면고도 변환", description = "특정 좌표의 해수면고도(MSL)를 지표면고도(AGL)로 변환해 주는 API 입니다.") public ResponseEntity convertMslToAgl(@RequestBody List rq) { List rs = null; try { log.debug(">>> rq : {}", rq); - rs = comnElevService.convertMslToAgl(rq); + rs = comnElevService.convertMslToAgl(rq); // msl 기준 고도 > agl 기준 고도 변환하는 기능 } catch (CustomException e) { + /** + * try{ + ... + } + * try 영역 안 코드들중 문제가 생기면 오는 곳. + * CustomException은 개발자가 "의도적으로" 낸 예외처리, + * log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌 + */ Map resultMap = new HashMap<>(); log.error("IGNORE : ", e); resultMap.put("result", false); @@ -74,6 +106,13 @@ public class ComnElevController { resultMap.put("errorMessage", e.getMessage()); return ResponseEntity.ok().body(new SuccessResponse<>(resultMap)); } 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")); @@ -82,16 +121,28 @@ public class ComnElevController { return ResponseEntity.ok().body(new SuccessResponse<>(rs)); } + /** + * AGL[지표면고도]를 MSL[해발고도]로 변환하는 기능. + * @param rq + * @return + */ @PostMapping(value = "/to/msl") - @ApiOperation(value = "agl을 msl로 변환") - @Tag(name = "공통 API", description = "공통 API") + @Operation(summary = "지표면고도 -> 해수면고도 변환", description = "특정 좌표의 지표면고도(AGL)를 해수면고도(MSL)로 변환해 주는 API 입니다.") public ResponseEntity convertAglToMsl(@RequestBody List rq) { List rs = null; try { log.debug(">>> rq : {}", rq); - rs = comnElevService.convertAglToMsl(rq); + rs = comnElevService.convertAglToMsl(rq); // agl 기준 고도 > msl 기준 고도 변환하는 기능 } catch (CustomException e) { + /** + * try{ + ... + } + * try 영역 안 코드들중 문제가 생기면 오는 곳. + * CustomException은 개발자가 "의도적으로" 낸 예외처리, + * log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌 + */ Map resultMap = new HashMap<>(); log.error("IGNORE : ", e); resultMap.put("result", false); @@ -99,6 +150,13 @@ public class ComnElevController { resultMap.put("errorMessage", e.getMessage()); return ResponseEntity.ok().body(new SuccessResponse<>(resultMap)); } 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/comn/elev/model/ComnElevRq.java b/pav-server/src/main/java/com/palnet/biz/api/comn/elev/model/ComnElevRq.java index 3340ccdb..9552f618 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/comn/elev/model/ComnElevRq.java +++ b/pav-server/src/main/java/com/palnet/biz/api/comn/elev/model/ComnElevRq.java @@ -1,5 +1,6 @@ package com.palnet.biz.api.comn.elev.model; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -10,7 +11,13 @@ import lombok.NoArgsConstructor; @AllArgsConstructor @Builder public class ComnElevRq { + + @Schema(description = "위도" , example = "37.520930", implementation = Double.class) private Double lat; + + @Schema(description = "경도" , example = "126.605684", implementation = Double.class) private Double lon; + + @Schema(description = "고도" , example = "100.0", implementation = Double.class) private Double elev; } diff --git a/pav-server/src/main/java/com/palnet/biz/api/comn/elev/model/ComnGroundElevRq.java b/pav-server/src/main/java/com/palnet/biz/api/comn/elev/model/ComnGroundElevRq.java index 0124064b..2800ef52 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/comn/elev/model/ComnGroundElevRq.java +++ b/pav-server/src/main/java/com/palnet/biz/api/comn/elev/model/ComnGroundElevRq.java @@ -1,5 +1,6 @@ package com.palnet.biz.api.comn.elev.model; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -10,6 +11,10 @@ import lombok.NoArgsConstructor; @AllArgsConstructor @Builder public class ComnGroundElevRq { + + @Schema(description = "위도" , example = "37.520930", implementation = Double.class) private Double lat; + + @Schema(description = "경도" , example = "126.605684", implementation = Double.class) private Double lon; } diff --git a/pav-server/src/main/java/com/palnet/biz/api/comn/elev/service/ComnElevService.java b/pav-server/src/main/java/com/palnet/biz/api/comn/elev/service/ComnElevService.java index 697bd31f..6b03ab22 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/comn/elev/service/ComnElevService.java +++ b/pav-server/src/main/java/com/palnet/biz/api/comn/elev/service/ComnElevService.java @@ -17,12 +17,16 @@ import java.util.stream.Collectors; @Service public class ComnElevService { - // 지표면 고도 가져오기 + /** + * 지표면 고도 가져오는 기능. + * @param rq + * @return + */ public List getGroundElev(List rq) { DigitalElevationModelUtils demUtils = DigitalElevationModelUtils.getInstance(); List rs = rq.stream().map(elev -> { Coordinate coord = new Coordinate(elev.getLon(), elev.getLat()); - Double groundElevation = demUtils.getGroundElevation(coord); + Double groundElevation = demUtils.getGroundElevation(coord); // 좌표로 고도값을 구하는 기능.[좌표계는 EPSG:4326으로 해야합니다] return ComnElevRs.builder() .elevType("ground") .lat(elev.getLat()) @@ -33,7 +37,11 @@ public class ComnElevService { return rs; } - // msl 기준 고도 > agl 기준 고도 변환 + /** + * msl 기준 고도 > agl 기준 고도 변환하는 기능. + * @param rq + * @return + */ public List convertMslToAgl(List rq) { DigitalElevationModelUtils demUtils = DigitalElevationModelUtils.getInstance(); List rs = rq.stream().map(elev -> { @@ -52,7 +60,11 @@ public class ComnElevService { return rs; } - // agl 기준 고도 > msl 기준 고도 변환 + /** + * agl 기준 고도 > msl 기준 고도 변환하는 기능. + * @param rq + * @return + */ public List convertAglToMsl(List rq) { DigitalElevationModelUtils demUtils = DigitalElevationModelUtils.getInstance(); List rs = rq.stream().map(elev -> { diff --git a/pav-server/src/main/java/com/palnet/biz/api/comn/file/controller/ComnFileController.java b/pav-server/src/main/java/com/palnet/biz/api/comn/file/controller/ComnFileController.java index 5bc204f5..9f9e827d 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/comn/file/controller/ComnFileController.java +++ b/pav-server/src/main/java/com/palnet/biz/api/comn/file/controller/ComnFileController.java @@ -1,6 +1,11 @@ package com.palnet.biz.api.comn.file.controller; import com.palnet.biz.api.comn.file.service.ComnFileService; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.enums.ParameterIn; +import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.GetMapping; @@ -23,25 +28,53 @@ import org.springframework.web.bind.annotation.RestController; @RequiredArgsConstructor @RequestMapping("/api/comn/file") @RestController +@Tag(name ="파일", description = "파일 관련 API") + public class ComnFileController { private final ComnFileService comnFileService; + /** + * 사용 안함[@Deprecated] + * 파일일련번호[fileSno]로 파일 다운로드 하는 기능. + * QueryParam 방식으로 parameter를 받음. + * @param fileSno + */ @Deprecated @GetMapping("/download") - public void downloadPDF(int fileSno) { + @Operation(summary = "파일다운로드[사용하지 않음]", description = "미사용") + public void downloadPDF(@Parameter(name="fileSno", description = "파일일련번호", in = ParameterIn.QUERY, example = "117") int fileSno) { try { - comnFileService.fileDownload(fileSno); + comnFileService.fileDownload(fileSno); // 파일 일련번호[fileSno]로 파일 다운로드하는 기능 } catch (Exception e) { + /** + * try{ + ... + } + * try 영역 안 코드들중 문제가 생기면 오는 곳. + * log.error 로그로 원인 파악함 + */ log.error("ERROR: ", e); } } + /** + * 파일일련번호[fileSno]로 파일 다운로드 하는 기능. + * @param fileSno + */ @GetMapping("/download/{fileSno}") - public void download(@PathVariable("fileSno") int fileSno) { + @Operation(summary = "파일다운로드", description = "파일 일련번호로 파일을 다운로드 합니다.") + public void download(@Parameter(name="fileSno", description = "파일일련번호", in = ParameterIn.PATH, example = "117") @PathVariable("fileSno") int fileSno) { try { comnFileService.fileDownload(fileSno); } catch (Exception e) { + /** + * try{ + ... + } + * try 영역 안 코드들중 문제가 생기면 오는 곳. + * log.error 로그로 원인 파악함 + */ log.error("ERROR: ", e); } } diff --git a/pav-server/src/main/java/com/palnet/biz/api/comn/file/service/ComnFileService.java b/pav-server/src/main/java/com/palnet/biz/api/comn/file/service/ComnFileService.java index ba77dbaf..301c102c 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/comn/file/service/ComnFileService.java +++ b/pav-server/src/main/java/com/palnet/biz/api/comn/file/service/ComnFileService.java @@ -146,20 +146,19 @@ public class ComnFileService { } /** - * 파일 다운로드 - * + * 파일 일련번호[fileSno]로 파일 다운로드하는 기능. * @param fileSno */ public void fileDownload(int fileSno) { - - ComFileBas comFileBas = comFileBasRepository.findById(fileSno).orElse(null); + + ComFileBas comFileBas = comFileBasRepository.findById(fileSno).orElse(null); // 파일정보를 데이터베이스에서 조회함. if (comFileBas == null) throw new CustomException(ErrorCode.DATA_NOTFIND); InputStream inputStream = null; OutputStream outputStream = null; try { - File pdfFile = new File(comFileBas.getFilePath() + comFileBas.getFileSaveNm()); + File pdfFile = new File(comFileBas.getFilePath() + comFileBas.getFileSaveNm()); // 파일경로에 맞춰 파일데이터를 PC에서 가져옴 inputStream = new FileInputStream(pdfFile); String fileOriName = comFileBas.getFileOriNm(); @@ -176,7 +175,8 @@ public class ComnFileService { byte[] buffer = new byte[1024]; //1KB 설정 int length; - while ((length = inputStream.read(buffer)) != -1) { + // 요청한 사용자에게 파일데이터 전송 + while ((length = inputStream.read(buffer)) != -1) { outputStream.write(buffer); } @@ -185,6 +185,7 @@ public class ComnFileService { } catch (IOException e) { e.printStackTrace(); } finally { + // INPUT, OUTPUT의 열어놨던 스트림들을 최종적으로 모두 닫음 try { if (outputStream != null) { Objects.requireNonNull(outputStream).flush(); @@ -351,6 +352,13 @@ public class ComnFileService { return true; } + + /** + * 파일일련번호 배열로 삭제처리 진행함. + * @param fileSnoList + * @return + */ + // @Transactional는 데이터베이스의 정합성을 위해 사용합니다, 추가 수정 삭제 등에서 사용합니다, 이 기능에서는 삭제컬럼은 수정했기 때문에 사용했습니다. @Transactional public boolean deleteFiles(List fileSnoList){ @@ -389,6 +397,11 @@ public class ComnFileService { return true; } + /** + * 파일그룹번호[fileGroupNo]에 해당하는 파일등 모두 가져오는 기능. + * @param fileGroupNo + * @return + */ public List getNormalFileListByGroupNo(Integer fileGroupNo) { List files = comFileBasRepository.findByFileGroupNoAndDelYn(fileGroupNo, "N"); List result = new ArrayList<>(); diff --git a/pav-server/src/main/java/com/palnet/biz/api/comn/model/ComnPagingModel.java b/pav-server/src/main/java/com/palnet/biz/api/comn/model/ComnPagingModel.java index d90ba5e8..cbcf8ba7 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/comn/model/ComnPagingModel.java +++ b/pav-server/src/main/java/com/palnet/biz/api/comn/model/ComnPagingModel.java @@ -1,13 +1,21 @@ package com.palnet.biz.api.comn.model; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; @Data public class ComnPagingModel { + @Schema(description = "데이터 표출 수" , example = "10") private int record = 10; // 데이터 표출 수 + + @Schema(description = "현재 페이지" , example = "1") private int page = 0; // 현재 페이지 + + @Schema(description = "시작위치" , example = "0") private int stIdx = 0; // 시작 위치 + + @Schema(description = "끝 위치" , example = "0") private int endIdx = 0; // 끝 위치 } diff --git a/pav-server/src/main/java/com/palnet/biz/api/comn/model/ComnRqModel.java b/pav-server/src/main/java/com/palnet/biz/api/comn/model/ComnRqModel.java index 8fa5074f..2de7926c 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/comn/model/ComnRqModel.java +++ b/pav-server/src/main/java/com/palnet/biz/api/comn/model/ComnRqModel.java @@ -1,17 +1,23 @@ package com.palnet.biz.api.comn.model; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; @Data @EqualsAndHashCode(callSuper=false) public class ComnRqModel extends ComnPagingModel { + + @Schema(description = "검색 시작 날짜" , example = "2023-11-01" , implementation = String.class) private String stDate; + @Schema(description = "검색 종료 날짜" , example = "2023-11-30" , implementation = String.class) private String endDate; + @Schema(hidden = true) private String search1; + @Schema(hidden = true) private String searchType1; } diff --git a/pav-server/src/main/java/com/palnet/biz/api/comn/response/SuccessResponse.java b/pav-server/src/main/java/com/palnet/biz/api/comn/response/SuccessResponse.java index d68740d5..89961afd 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/comn/response/SuccessResponse.java +++ b/pav-server/src/main/java/com/palnet/biz/api/comn/response/SuccessResponse.java @@ -1,15 +1,20 @@ package com.palnet.biz.api.comn.response; -import java.util.List; - +import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; +import java.util.List; + + @Data @EqualsAndHashCode(callSuper=false) public class SuccessResponse extends BasicResponse { - + + @Schema(description = "응답 데이터 건수") private int count; + + @Schema(description = "응답 데이터") private T data; public SuccessResponse(T data) { diff --git a/pav-server/src/main/java/com/palnet/biz/api/comn/sms/service/ComnSmsService.java b/pav-server/src/main/java/com/palnet/biz/api/comn/sms/service/ComnSmsService.java index 198f635d..a149ec51 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/comn/sms/service/ComnSmsService.java +++ b/pav-server/src/main/java/com/palnet/biz/api/comn/sms/service/ComnSmsService.java @@ -33,6 +33,10 @@ public class ComnSmsService { private final SuredataRepository suredataRepository; + /** + * 비행승인시 SMS를 보내는 기능. + * @param model + */ public void sendLaancAprovSms(ComnSmsLaancAprovModel model) { log.info("sendSms : {}", model); ClassPathResource resource = new ClassPathResource("templates/sms/SmsLaancAprov.txt"); @@ -78,6 +82,12 @@ public class ComnSmsService { suredataRepository.save(entity); } + /** + * 내부적으로 사용할 메소드, 메세지 템플릿과, 객체의 파라미터를 매핑함. + * @param templateStr + * @param model + * @return + */ private String getMessage(String templateStr, ComnSmsLaancAprovModel model) { String message = templateStr; message = message.replace("${pilotName}", model.getPilotName()); @@ -89,6 +99,10 @@ public class ComnSmsService { return message; } + /** + * 데이터베이스에 추가할 메세지 발송이력 데이터를 셋팅함. + * @return + */ public SuredataEntity getInitialEntity() { String nowStr = InstantUtils.toDatetimeStringByFormat(Instant.now(), "yyyyMMddHHmmss"); SuredataEntity entity = new SuredataEntity(); diff --git a/pav-server/src/main/java/com/palnet/biz/api/comn/sunriseset/controller/ComnSunrisesetController.java b/pav-server/src/main/java/com/palnet/biz/api/comn/sunriseset/controller/ComnSunrisesetController.java index cd893a27..1d20c9a4 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/comn/sunriseset/controller/ComnSunrisesetController.java +++ b/pav-server/src/main/java/com/palnet/biz/api/comn/sunriseset/controller/ComnSunrisesetController.java @@ -8,9 +8,7 @@ import com.palnet.biz.api.comn.sunriseset.model.ComnSunrisesetRq; import com.palnet.biz.api.comn.sunriseset.model.ComnSunrisesetRs; import com.palnet.biz.api.comn.sunriseset.service.ComnSunrisesetService; import com.palnet.comn.exception.CustomException; -import io.swagger.annotations.ApiImplicitParam; -import io.swagger.annotations.ApiImplicitParams; -import io.swagger.annotations.ApiOperation; +import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -19,7 +17,6 @@ import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import springfox.documentation.annotations.ApiIgnore; import java.util.HashMap; import java.util.List; @@ -45,17 +42,30 @@ public class ComnSunrisesetController { private final ComnSunrisesetService comnSunrisesetService; - @ApiOperation(value = "일출/일몰 조회", notes = "기간내 모든 일출/일몰조회") - @Tag(name = "공통 API", description = "공통 API") + /** + * 일출/일몰 시간대를 조회하는 기능, + * ComnSunrisesetRq에 있는 검색 시작일, 끝일의 조건에 맞춰 조회함. + * @param rq + * @return + */ @GetMapping("/list") + @Operation(summary = "일출/일몰 조회", description = "기간 내 모든 일출과 일몰시간을 조회하는 API 입니다.") public ResponseEntity getSunRiseSetList(ComnSunrisesetRq rq) { List rs = null; try { log.debug(">>> rq : {}", rq); - rs = comnSunrisesetService.getSunRiseSetList(rq); + rs = comnSunrisesetService.getSunRiseSetList(rq); // 검색조건의 맞춰 일몰,일출 시간을 조회하는 기능 // log.debug(">>> rs : {}", rs); } catch (CustomException e) { + /** + * try{ + ... + } + * try 영역 안 코드들중 문제가 생기면 오는 곳. + * CustomException은 개발자가 "의도적으로" 낸 예외처리, + * log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌 + */ Map resultMap = new HashMap(); log.error("IGNORE : ", e); resultMap.put("result", false); @@ -63,6 +73,13 @@ public class ComnSunrisesetController { resultMap.put("errorMessage", e.getMessage()); return ResponseEntity.ok().body(new SuccessResponse(resultMap)); } 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")); @@ -71,18 +88,30 @@ public class ComnSunrisesetController { return ResponseEntity.ok().body(new SuccessResponse<>(rs)); } - - @ApiOperation(value = "일출/일몰 조회(좌표)", notes = "기간내 근접한 지역의 일출/일몰 조회") - @Tag(name = "공통 API", description = "공통 API") + /** + * 근접한 지역의 일출/일몰 조회, + * ComnSunrisesetCoordRq 모델에 있는 시작,끝날짜 조건에 맞춰 가장 근접한 지역의 일출/일몰 조회. + * @param rq + * @return + */ @GetMapping("/coord") + @Operation(summary = "일출/일몰 조회(좌표)", description = "기간 내 좌표와 근접한 지역의 일출과 일몰시간을 1건 조회하는 API 입니다.") public ResponseEntity getSunRiseSetByCoordAndDate(ComnSunrisesetCoordRq rq) { ComnSunrisesetRs rs = null; try { log.debug(">>> rq : {}", rq); - rs = comnSunrisesetService.getSunRiseSetByCoordAndDate(rq); + rs = comnSunrisesetService.getSunRiseSetByCoordAndDate(rq); // 기간내 근접한 지역의 일출/일몰 조회하는 기능 // log.debug(">>> rs : {}", rs); } catch (CustomException e) { + /** + * try{ + ... + } + * try 영역 안 코드들중 문제가 생기면 오는 곳. + * CustomException은 개발자가 "의도적으로" 낸 예외처리, + * log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌 + */ Map resultMap = new HashMap(); log.error("IGNORE : ", e); resultMap.put("result", false); @@ -90,6 +119,13 @@ public class ComnSunrisesetController { resultMap.put("errorMessage", e.getMessage()); return ResponseEntity.ok().body(new SuccessResponse(resultMap)); } 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")); @@ -98,14 +134,14 @@ public class ComnSunrisesetController { return ResponseEntity.ok().body(new SuccessResponse<>(rs)); } - @ApiOperation(value = "일출/일몰 조회(좌표-6개월치)", notes = "근접한 지역의 현재~6개월치의 일출/일몰 데이터 조회") - @Tag(name = "공통 API", description = "공통 API") - @ApiImplicitParams(value = { - @ApiImplicitParam(name = "lat", value = "위도", required = true, dataType = "double", paramType = "query", example = "37.5665", defaultValue = "37.5665"), - @ApiImplicitParam(name = "lon", value = "경도", required = true, dataType = "double", paramType = "query", example = "126.9780", defaultValue = "126.9780"), - }) + /** + * 근접한 지역의 현재~6개월치의 일출/일몰 데이터 조회하는 기능 + * @param rq + * @return + */ @GetMapping("/coord/list") - public ResponseEntity getSunRiseSetByCoord(@ApiIgnore ComnSunrisesetCoordRq rq) { + @Operation(summary = "일출/일몰 조회(좌표 - 6개월치)", description = "기간 내 근접 지역에서 현재부터 6개월치 일출과 일몰시간을 조회하는 API 입니다.") + public ResponseEntity getSunRiseSetByCoord(ComnSunrisesetCoordRq rq) { List rs = null; try { log.debug(">>> rq : {}", rq); @@ -113,6 +149,14 @@ public class ComnSunrisesetController { // log.debug(">>> rs : {}", rs); } catch (CustomException e) { + /** + * try{ + ... + } + * try 영역 안 코드들중 문제가 생기면 오는 곳. + * CustomException은 개발자가 "의도적으로" 낸 예외처리, + * log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌 + */ Map resultMap = new HashMap(); log.error("IGNORE : ", e); resultMap.put("result", false); @@ -120,6 +164,13 @@ public class ComnSunrisesetController { resultMap.put("errorMessage", e.getMessage()); return ResponseEntity.ok().body(new SuccessResponse(resultMap)); } 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/comn/sunriseset/model/ComnSunrisesetCoordRq.java b/pav-server/src/main/java/com/palnet/biz/api/comn/sunriseset/model/ComnSunrisesetCoordRq.java index 8c86f331..47ede96e 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/comn/sunriseset/model/ComnSunrisesetCoordRq.java +++ b/pav-server/src/main/java/com/palnet/biz/api/comn/sunriseset/model/ComnSunrisesetCoordRq.java @@ -1,7 +1,8 @@ package com.palnet.biz.api.comn.sunriseset.model; import com.fasterxml.jackson.annotation.JsonIgnore; -import io.swagger.annotations.ApiParam; + +import io.swagger.v3.oas.annotations.media.Schema; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -23,13 +24,17 @@ import lombok.NoArgsConstructor; @AllArgsConstructor @Builder public class ComnSunrisesetCoordRq { - @ApiParam(value = "시작일자", defaultValue = "20231101", example = "20231101", required = true) + + @Schema(description = "시작일자", example = "20231101") private String locStDate; - @ApiParam(value = "종료일자", defaultValue = "20231231", example = "20231231", required = true) + + @Schema(description = "종료일자", example = "20231231") private String locEndDate; - @ApiParam(value = "위도", defaultValue = "37.4717452", example = "37.11", required = true) + + @Schema(description = "위도", example = "37.520987") private Double lat; - @ApiParam(value = "경도", defaultValue = "126.7081059", example = "127.11", required = true) + + @Schema(description = "경도", example = "126.610646") private Double lon; @JsonIgnore diff --git a/pav-server/src/main/java/com/palnet/biz/api/comn/sunriseset/model/ComnSunrisesetRq.java b/pav-server/src/main/java/com/palnet/biz/api/comn/sunriseset/model/ComnSunrisesetRq.java index 628be7f9..183ca9c4 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/comn/sunriseset/model/ComnSunrisesetRq.java +++ b/pav-server/src/main/java/com/palnet/biz/api/comn/sunriseset/model/ComnSunrisesetRq.java @@ -1,6 +1,6 @@ package com.palnet.biz.api.comn.sunriseset.model; -import io.swagger.annotations.ApiParam; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -22,10 +22,14 @@ import lombok.NoArgsConstructor; @AllArgsConstructor @Builder public class ComnSunrisesetRq { - @ApiParam(name = "시작일자", example = "20231101") + + @Schema(description = "시작일자", example = "20231101", implementation = String.class) private String locStDate; - @ApiParam(name = "종료일자", example = "20231231") + + @Schema(description = "종료일자", example = "20231231", implementation = String.class) private String locEndDate; - @ApiParam(name = "지역", example = "김포") + + @Schema(description = "지역", example = "김포") private String location; + } diff --git a/pav-server/src/main/java/com/palnet/biz/api/comn/sunriseset/model/ComnSunrisesetRs.java b/pav-server/src/main/java/com/palnet/biz/api/comn/sunriseset/model/ComnSunrisesetRs.java index 9746d1f5..8ff71d77 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/comn/sunriseset/model/ComnSunrisesetRs.java +++ b/pav-server/src/main/java/com/palnet/biz/api/comn/sunriseset/model/ComnSunrisesetRs.java @@ -1,14 +1,10 @@ package com.palnet.biz.api.comn.sunriseset.model; -import io.swagger.annotations.ApiParam; -import io.swagger.v3.oas.annotations.Parameter; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; -import javax.persistence.Column; - /** * packageName : com.palnet.biz.api.comn.sunriseset.model * fileName : ComnSunrisesetRs @@ -25,16 +21,16 @@ import javax.persistence.Column; @AllArgsConstructor @Builder public class ComnSunrisesetRs { - @ApiParam(name = "일자", example = "20231212") +// @ApiParam(name = "일자", example = "20231212") private String locDate; - @ApiParam(name = "지역", example = "김포") +// @ApiParam(name = "지역", example = "김포") private String location; - @ApiParam(name = "일출", example = "071000") +// @ApiParam(name = "일출", example = "071000") private String sunrise; // 일출 - @ApiParam(name = "일몰", example = "183000") +// @ApiParam(name = "일몰", example = "183000") private String sunset; // 일몰 - @ApiParam(name = "시민박명(아침)", example = "071000") +// @ApiParam(name = "시민박명(아침)", example = "071000") private String civilm; // 시민박명(아침) - @ApiParam(name = "시민박명(저녁)", example = "183000") +// @ApiParam(name = "시민박명(저녁)", example = "183000") private String civile; // 시민박명(저녁) } diff --git a/pav-server/src/main/java/com/palnet/biz/api/comn/sunriseset/service/ComnSunrisesetService.java b/pav-server/src/main/java/com/palnet/biz/api/comn/sunriseset/service/ComnSunrisesetService.java index 851c3707..7538e893 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/comn/sunriseset/service/ComnSunrisesetService.java +++ b/pav-server/src/main/java/com/palnet/biz/api/comn/sunriseset/service/ComnSunrisesetService.java @@ -31,16 +31,31 @@ public class ComnSunrisesetService { private final ComRiseSetQueryRepository comRiseSetQueryRepository; + /** + * 검색조건의 맞춰 일몰,일출 시간을 조회하는 기능. + * @param rq + * @return + */ public List getSunRiseSetList(ComnSunrisesetRq rq) { return comRiseSetQueryRepository.findAllBySearchTransform(rq); } + /** + * 기간내 근접한 지역의 일출/일몰 조회하는 기능. + * @param rq + * @return + */ public ComnSunrisesetRs getSunRiseSetByCoordAndDate(ComnSunrisesetCoordRq rq) { if(rq == null || !rq.hasAllData()) throw new CustomException(ErrorCode.NON_VALID_PARAMETER); return comRiseSetQueryRepository.findBySearchCoordDateTransform(rq); } + /** + * 근접한 지역의 현재~6개월치의 일출/일몰 데이터 조회하는 기능 + * @param rq + * @return + */ public List getSunRiseSetByCoord(ComnSunrisesetCoordRq rq) { if(rq == null || !rq.hasCoord()) throw new CustomException(ErrorCode.NON_VALID_PARAMETER); return comRiseSetQueryRepository.findAllBySearchCoordTransform(rq); diff --git a/pav-server/src/main/java/com/palnet/biz/api/ctr/cntrl/controller/CtrCntrlController.java b/pav-server/src/main/java/com/palnet/biz/api/ctr/cntrl/controller/CtrCntrlController.java index ca85162c..18fbf800 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/ctr/cntrl/controller/CtrCntrlController.java +++ b/pav-server/src/main/java/com/palnet/biz/api/ctr/cntrl/controller/CtrCntrlController.java @@ -7,10 +7,11 @@ import com.palnet.biz.api.comn.response.SuccessResponse; import com.palnet.biz.api.ctr.cntrl.model.*; import com.palnet.biz.api.ctr.cntrl.service.CtrCntrlService; import com.palnet.comn.model.GPHistoryModel; -import io.swagger.annotations.ApiImplicitParam; -import io.swagger.annotations.ApiOperation; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.enums.ParameterIn; import io.swagger.v3.oas.annotations.tags.Tag; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.json.simple.JSONObject; import org.json.simple.parser.ParseException; import org.springframework.http.HttpStatus; @@ -23,7 +24,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -@Log4j2 +@Slf4j @RestController @RequestMapping(value = "/api/ctr/cntrl", produces = {MediaType.APPLICATION_JSON_VALUE}) @Tag(name = "드론 관제 시스템", description = "드론 관제 관련 API") @@ -36,22 +37,30 @@ public class CtrCntrlController { } /** - * TODO 드론 관제 이력 목록 (Socket 분리 전) + * TODO 드론 관제 이력 목록 (Socket 분리 전) 조회하는 기능. * * @param id - 관제 ID * @return */ @GetMapping(value = "/history/{id}") - @ApiOperation(value = "TODO 드론 관제 이력 목록 (Socket 분리 전)") - @Tag(name = "드론 관제 시스템", description = "드론 관제 관련 API") - @ApiImplicitParam(name = "id",value = "관제ID", dataTypeClass = String.class) + @Deprecated +// @ApiOperation(value = "TODO 드론 관제 이력 목록 (Socket 분리 전)") +// @Tag(name = "드론 관제 시스템", description = "드론 관제 관련 API") +// @ApiImplicitParam(name = "id",value = "관제ID", dataTypeClass = String.class) public ResponseEntity historyList(@PathVariable String id) { List result = null; try { - result = service.getListHistory(id); + result = service.getListHistory(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")); @@ -61,22 +70,28 @@ public class CtrCntrlController { } /** - * TODO 드론 관제 상세 정보 - * + * TODO 드론 관제 상세 정보 조회 기능, + * 관제ID[controlId]로 조회하여 확인함 * @param id - 관제 ID * @return */ @GetMapping(value = "/detail/{id}") - @ApiOperation(value = "TODO 드론 관제 상세 정보") - @Tag(name = "드론 관제 시스템", description = "드론 관제 관련 API") - @ApiImplicitParam(name = "id",value = "관제ID", dataTypeClass = String.class) - public ResponseEntity detail(@PathVariable String id) { + @Operation(summary = "드론 관제 상세 정보 조회", description = "드론 관제 상세 정보를 조회하는 API 입니다.") + public ResponseEntity detail( + @Parameter(name="id", description = "개체 비행 ID", in = ParameterIn.PATH, example = "06b6314e-7143-4bdf-a427-1f2b1a834633")@PathVariable String id) { CtrCntrlDtlModel result = null; try { - result = service.getDetail(id); + result = service.getDetail(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")); @@ -92,15 +107,21 @@ public class CtrCntrlController { * @return */ @GetMapping(value = "/history/list/{id}") - @ApiOperation(value = "TODO 드론 관제 '실시간' 이력 목록") - @Tag(name = "드론 관제 시스템", description = "드론 관제 관련 API") - @ApiImplicitParam(name = "id",value = "관제ID", dataTypeClass = String.class) - public ResponseEntity history(@PathVariable String id) { + @Operation(summary = "드론 관제 이력 정보 조회", description = "드론 관제 이력 정보를 조회하는 API 입니다.") + public ResponseEntity history( + @Parameter(name="id", description = "개체 비행 ID", in = ParameterIn.PATH, example = "06b6314e-7143-4bdf-a427-1f2b1a834633")@PathVariable String id) { List history; try { - history = service.getHistory(id); + history = service.getHistory(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")); @@ -108,14 +129,28 @@ public class CtrCntrlController { return ResponseEntity.ok().body(new SuccessResponse<>(history)); } + /** + * 드론관제 날씨를 조회하는 기능, + * CtrCntrlWeatherModel값에 따라 조회함 + * @param rq + * @return + * @throws IOException + * @throws ParseException + */ @GetMapping("/api/weather") - @ApiOperation(value = "드론 관제 날씨") - @Tag(name = "드론 관제 시스템", description = "드론 관제 관련 API") + @Operation(summary = "드론 관제 날씨 조회", description = "드론 관제 - 비행 지역의 날씨를 조회하는 API 입니다.") public ResponseEntity restApiGetWeather(CtrCntrlWeatherModel rq) throws IOException, ParseException { JSONObject jsonObject = null; try { - jsonObject = service.getWeather(rq); + jsonObject = service.getWeather(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")); @@ -129,15 +164,20 @@ public class CtrCntrlController { * @return */ @GetMapping("/group") - @ApiOperation(value = "TODO 비행 관제 사용자 권한 정보") - @Tag(name = "드론 관제 시스템", description = "드론 관제 관련 API") - @ApiImplicitParam(name = "cstmrSno",value = "고객일련번호", dataTypeClass = Integer.class) - public ResponseEntity findGroupAuthInfo(int cstmrSno) { + @Operation(summary = "드론 관제 사용자 권한 정보", description = "드론 관제 - 토큰에 등록된 사용자가 관리 가능한 드론 기체의 식별번호를 조회하는 API 입니다.") + public ResponseEntity findGroupAuthInfo() { List list; try { - list = service.getGroupAuthInfo(); + list = service.getGroupAuthInfo(); // 그룹의 기체 정보 조회하는 기능 } 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")); @@ -153,15 +193,22 @@ public class CtrCntrlController { * @return */ @GetMapping("/flight_plan/{idntfNum}") - @ApiOperation(value = "TODO 비행 관제 사용자 비행 계획서 정보") - @Tag(name = "드론 관제 시스템", description = "드론 관제 관련 API") - @ApiImplicitParam(name = "idtfNum",value = "식별번호", dataTypeClass = String.class, paramType = "query") - public ResponseEntity findFlightPlan(@PathVariable("idntfNum") String idntfNum) { + @Operation(summary = "드론 관제 사용자 비행계획서 정보", description = "사용자의 비행계획서 정보를 조회하는 API 입니다. 해당 식별번호가 포함된 laanc 신청서가 승인되어 있어야 하며, 비행일자가 오늘을 포함하고 있는 건만 조회합니다.\n" + + "따라서 count가 0인 경우가 존재할 수 있습니다.") + public ResponseEntity findFlightPlan( + @Parameter(name="idntfNum", description = "개체 식별번호", in = ParameterIn.PATH, example = "PA0001")@PathVariable String idntfNum) { List list; try { list = service.getFlightPlanForKac(idntfNum); } 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")); @@ -177,15 +224,21 @@ public class CtrCntrlController { * @return */ @GetMapping(value = "/warn/detail/{id}") - @ApiOperation(value = "TODO 드론 운행 시작 후 알람 목록") - @Tag(name = "드론 관제 시스템", description = "드론 관제 관련 API") - @ApiImplicitParam(name = "id",value = "관제ID", dataTypeClass = String.class) - public ResponseEntity warnDetail(@PathVariable String id){ + @Operation(summary = "드론 운행 시작 후 비정상 알람 목록", description = "드론 관제 - 드론 비행 중 비정상 상황이 표출된 로그를 조회하는 API 입니다.") + public ResponseEntity warnDetail( + @Parameter(name="id", description = "개체 비행 ID", in = ParameterIn.PATH, example = "061fbd9d-25c5-4801-bb11-2307a8eb8d8f")@PathVariable String id){ List warnLog; try { warnLog = service.getWarnLog(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")); @@ -200,8 +253,9 @@ public class CtrCntrlController { * @return */ @PostMapping(value = "/arcrft/warn/list") - @ApiOperation(value = "TODO 기체 별 최신 비정상 로그 및 비정상 로그 전체 개수") - @Tag(name = "드론 관제 시스템", description = "드론 관제 관련 API") +// @ApiOperation(value = "TODO 기체 별 최신 비정상 로그 및 비정상 로그 전체 개수") +// @Tag(name = "드론 관제 시스템", description = "드론 관제 관련 API") + @Operation(summary = "기체 별 최신 비정상 로그 및 전체 개수", description = "비행 중 laanc 비행계획서의 비행계획경로 정보와 실제로 들어온 드론 데이터를 비교해 비정상 여부를 판단합니다. 이 API는 실제로 laanc 승인 이후 비행계획일자 내에서 경로를 벗어난 경우만 체크할 수 있기 때문에 결과값이 없을 수 있습니다.") public ResponseEntity arcrftWarnList(@RequestBody CtrCntrlArcrftWarnRqModel rq){ // public ResponseEntity arcrftWarnList(@RequestParam("id") String id){ List arcrftWarnList; @@ -210,6 +264,13 @@ public class CtrCntrlController { try { arcrftWarnList = service.getArcrftWarnList(rq.getCntrlId()); } 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")); @@ -224,14 +285,22 @@ public class CtrCntrlController { * @return */ @PostMapping("/contains") - @ApiOperation(value = "TODO 비행 관제 구역 비정상 상황 체크") - @Tag(name = "드론 관제 시스템", description = "드론 관제 관련 API") +// @ApiOperation(value = "TODO 비행 관제 구역 비정상 상황 체크") +// @Tag(name = "드론 관제 시스템", description = "드론 관제 관련 API") + @Operation(summary = "드론 비행 시 비정상 상황 체크", description = "드론 관제 - 드론 비행 중 실시간으로 비정상 상황이 발생했는지 여부를 조회하는 API 입니다.") public ResponseEntity checkPlanContains(@RequestBody CtrCntrlPlanContainsRq rq) { CtrCntrlPlanContainsRs rs; try { rs = service.checkPlanContains(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")); @@ -247,13 +316,22 @@ public class CtrCntrlController { * @return */ @GetMapping("/id/{id}") - @ApiOperation(value = "TODO 실시간 Control ID 발급") - @Tag(name = "드론 관제 시스템", description = "드론 관제 관련 API") - public ResponseEntity getId(@PathVariable String id) { +// @ApiOperation(value = "TODO 실시간 Control ID 발급") +// @Tag(name = "드론 관제 시스템", description = "드론 관제 관련 API") + @Operation(summary = "기체 비행 ID 발급", description = "기체 비행 ID를 발급하는 API 입니다.") + public ResponseEntity getId( + @Parameter(name="id", description = "개체 비행 ID", in = ParameterIn.PATH, example = "example")@PathVariable String id) { Map result; try { result = service.getId(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")); @@ -270,15 +348,24 @@ public class CtrCntrlController { * @return */ @GetMapping("/warn/{id}/{lat}/{lon}") - @ApiOperation(value = "TODO 비행 관제 기체의 비정상 상황 확인") - @Tag(name = "드론 관제 시스템", description = "드론 관제 관련 API") - public ResponseEntity checkWarring(@PathVariable String id, - @PathVariable Double lat, - @PathVariable Double lon) { +// @ApiOperation(value = "TODO 비행 관제 기체의 비정상 상황 확인") +// @Tag(name = "드론 관제 시스템", description = "드론 관제 관련 API") + @Operation(summary = "기체의 비정상 상황 확인", description = "좌표와 기체 비행 ID를 사용해 기체의 비정상 상황을 확인하는 API 입니다.") + public ResponseEntity checkWarring( + @Parameter(name="id", description = "개체 비행 ID", in = ParameterIn.PATH, example = "061fbd9d-25c5-4801-bb11-2307a8eb8d8f")@PathVariable String id, + @Parameter(name="lat", description = "위도", in = ParameterIn.PATH, example = "37.12")@PathVariable Double lat, + @Parameter(name="lon", description = "경도", in = ParameterIn.PATH, example = "127.12")@PathVariable Double lon) { Map result; try { result = service.checkWarring(id, lat, lon); } 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")); @@ -293,13 +380,22 @@ public class CtrCntrlController { * @return */ @GetMapping("/complete/{cntrlId}") - @ApiOperation(value = "TODO 비행 완료된 기체의 정보 확인") - @Tag(name = "드론 관제 시스템", description = "드론 관제 관련 API") - public ResponseEntity flightCompleteInfo(@PathVariable String cntrlId) { +// @ApiOperation(value = "TODO 비행 완료된 기체의 정보 확인") +// @Tag(name = "드론 관제 시스템", description = "드론 관제 관련 API") + @Operation(summary = "비행 완료된 기체의 정보 확인", description = "비행 완료된 기체의 정보를 확인하는 API 입니다.") + public ResponseEntity flightCompleteInfo( + @Parameter(name="cntrlId", description = "개체 비행 ID", in = ParameterIn.PATH, example = "078c2e77-d8ef-4900-b44a-f401f3aef72c")@PathVariable String cntrlId) { CtrCntrlArcrftComplModel result = new CtrCntrlArcrftComplModel(); try { result = service.getComplete(cntrlId); } 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/ctr/cntrl/controller/PingController.java b/pav-server/src/main/java/com/palnet/biz/api/ctr/cntrl/controller/PingController.java index ed25e2f1..43f919c6 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/ctr/cntrl/controller/PingController.java +++ b/pav-server/src/main/java/com/palnet/biz/api/ctr/cntrl/controller/PingController.java @@ -6,6 +6,10 @@ import org.springframework.web.bind.annotation.RestController; @RestController public class PingController { + /** + * 서버가 살아있는지 확인하는 API + * @return + */ @GetMapping("/ping") public String ping(){ return "SUCCESS"; diff --git a/pav-server/src/main/java/com/palnet/biz/api/ctr/cntrl/controller/SocketReceiverController.java b/pav-server/src/main/java/com/palnet/biz/api/ctr/cntrl/controller/SocketReceiverController.java index 21d9e3f5..58da754f 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/ctr/cntrl/controller/SocketReceiverController.java +++ b/pav-server/src/main/java/com/palnet/biz/api/ctr/cntrl/controller/SocketReceiverController.java @@ -2,6 +2,8 @@ package com.palnet.biz.api.ctr.cntrl.controller; import com.palnet.biz.api.ctr.cntrl.service.SocketReceiverService; import com.palnet.comn.model.GPModel; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.http.ResponseEntity; @@ -28,30 +30,55 @@ import java.util.concurrent.Callable; @Slf4j @RequiredArgsConstructor @RestController +@Tag(name = "SOCKET" , description = "소켓 관련 API") @RequestMapping("/api/server") public class SocketReceiverController { private final SocketReceiverService socketReceiverService; + + /** + * 소켓에서 날아오는 데이터를 데이터베이스에 저장시키는 기능, + * GPModel 모델에 오는값을 저장시킴. + * @param model + * @return + */ + @Deprecated @PostMapping("/receiver") + @Operation(summary = "소켓 데이터 수신", description = "소켓 데이터를 수신하는 API 입니다.") public ResponseEntity receiver(@RequestBody GPModel model) { - System.out.println("socket message : " + model); + log.info("socket message : {}", model); // 소켓에서 날아오는 데이터를 데이터베이스에 저장시키는 기능 socketReceiverService.insert(model); return ResponseEntity.ok().build(); } + /** + * 비동기방식으로 소켓에서 날아오는 데이터를 데이터베이스에 저장시키는 기능, + * GPModel 모델에 오는값을 저장시킴. + * @param model + * @return + */ + @Deprecated @PostMapping("/receiver/async") + @Operation(summary = "소켓 데이터 수신(멀티 스레드)", description = "여러개의 스레드로 소켓 데이터를 수신하는 API 입니다.") public Callable asyncReceiver(@RequestBody GPModel model) { return () -> { - log.info("websocket message : {}", model); + log.info("socket async message : {}", model); socketReceiverService.insert(model); return "OK"; }; } + /** + * 소켓에서 날아오는 데이터를 데이터베이스에 저장시키는 기능, + * 한번에 많은 관제아이디를 저장시키기 위해 사용하는 기능. + * @param models + * @return + */ @PostMapping("/receiver/all") + @Operation(summary = "소켓 데이터 수신(리스트)", description = "여러개의 소켓 데이터를 모아 한번에 수신하는 API 입니다.
additionalProp 자리에는 관제아이디[objectId]가 들어갑니다.
배열 객체 안 objectId 값을 가져와 넣어주시면 됩니다.") public ResponseEntity receiver(@RequestBody Map> models) { -// System.out.println("socket message : " + models); - socketReceiverService.insertAll(models); + log.info("socket all message : {}", models); + socketReceiverService.insertAll(models); // 한번에 많은 데이터를 데이터베이스에 저장하는 기능 return ResponseEntity.ok().build(); } } diff --git a/pav-server/src/main/java/com/palnet/biz/api/ctr/cntrl/model/CtrCntrlArcrftWarnRqModel.java b/pav-server/src/main/java/com/palnet/biz/api/ctr/cntrl/model/CtrCntrlArcrftWarnRqModel.java index fe2d5b74..9f57b503 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/ctr/cntrl/model/CtrCntrlArcrftWarnRqModel.java +++ b/pav-server/src/main/java/com/palnet/biz/api/ctr/cntrl/model/CtrCntrlArcrftWarnRqModel.java @@ -1,8 +1,10 @@ package com.palnet.biz.api.ctr.cntrl.model; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; @Data public class CtrCntrlArcrftWarnRqModel { + @Schema(description = "기체 비행 ID" , example = "078c2e77-d8ef-4900-b44a-f401f3aef72c") private String cntrlId; } diff --git a/pav-server/src/main/java/com/palnet/biz/api/ctr/cntrl/model/CtrCntrlPlanContainsRq.java b/pav-server/src/main/java/com/palnet/biz/api/ctr/cntrl/model/CtrCntrlPlanContainsRq.java index 19462de9..3fd52d73 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/ctr/cntrl/model/CtrCntrlPlanContainsRq.java +++ b/pav-server/src/main/java/com/palnet/biz/api/ctr/cntrl/model/CtrCntrlPlanContainsRq.java @@ -1,11 +1,10 @@ package com.palnet.biz.api.ctr.cntrl.model; -import com.palnet.biz.api.bas.flight.model.BasFlightPlanAreaCoordModel; +import java.util.List; + import com.palnet.biz.api.bas.flight.model.BasFlightPlanModel; -import lombok.Data; -import java.util.Date; -import java.util.List; +import lombok.Data; @Data public class CtrCntrlPlanContainsRq { diff --git a/pav-server/src/main/java/com/palnet/biz/api/ctr/cntrl/model/CtrCntrlWeatherModel.java b/pav-server/src/main/java/com/palnet/biz/api/ctr/cntrl/model/CtrCntrlWeatherModel.java index 43c7cbd7..641b4984 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/ctr/cntrl/model/CtrCntrlWeatherModel.java +++ b/pav-server/src/main/java/com/palnet/biz/api/ctr/cntrl/model/CtrCntrlWeatherModel.java @@ -1,21 +1,46 @@ package com.palnet.biz.api.ctr.cntrl.model; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; @Data public class CtrCntrlWeatherModel { + + @Schema(description = "위도" , example = "37.558522" , implementation = Double.class) private double nx; + + @Schema(description = "경도" , example = "126.793722" , implementation = Double.class) private double ny; - private String Snx; - private String Sny; + +// private String Snx; + +// private String Sny; + + @Schema(hidden = true) private Integer hstryAreaSno; + + @Schema(hidden = true) private String area1; - private String area2; + + @Schema(hidden = true) + private String area2; + + @Schema(hidden = true) private String area3; + + @Schema(hidden = true) private String zipCd; + + @Schema(hidden = true) private String landNm; + + @Schema(hidden = true) private String landNum; + + @Schema(hidden = true) private String areaType; + + @Schema(hidden = true) private String areaNm; } diff --git a/pav-server/src/main/java/com/palnet/biz/api/ctr/cntrl/service/CtrCntrlService.java b/pav-server/src/main/java/com/palnet/biz/api/ctr/cntrl/service/CtrCntrlService.java index 66225e66..5cff95e6 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/ctr/cntrl/service/CtrCntrlService.java +++ b/pav-server/src/main/java/com/palnet/biz/api/ctr/cntrl/service/CtrCntrlService.java @@ -21,7 +21,6 @@ import com.palnet.biz.scheduler.ctr.service.CtrTrnsLctnService; import com.palnet.comn.model.GPHistoryModel; import com.palnet.comn.utils.AreaUtils; import com.palnet.comn.utils.DateUtils; -import com.palnet.comn.utils.EncryptUtils; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; @@ -73,6 +72,12 @@ public class CtrCntrlService { private final FltPlanQueryRepository fltPlanQueryRepository; + /** + * 관제이력을 조회하는 기능. + * 현재는 사용하지 않음. + * @param objectId + * @return + */ public List getListHistory(String objectId) { List filterList = new ArrayList(); @@ -92,7 +97,7 @@ public class CtrCntrlService { } /** - * TODO 관제 상세 조회 + * TODO 관제 상세 조회하는 기능. * * @param controlId * @return @@ -107,16 +112,17 @@ public class CtrCntrlService { List areaList = query.detailArea(controlId); String stAreaNm = ""; - if (result.getHpno() != null && !result.getHpno().isEmpty()) { - try { - String decHpno = EncryptUtils.decrypt(result.getHpno()); - if (decHpno != null && !decHpno.isEmpty()) { - result.setHpno(decHpno); - } - } catch (Exception e) { - log.error("ERROR: ", e); - } - } + // TODO :: FLT_PLAN_PILOT 테이블에는 휴대폰번호가 암호화 되어있지 않음으로 주석처리 + // if (result.getHpno() != null && !result.getHpno().isEmpty()) { + // try { + // String decHpno = EncryptUtils.decrypt(result.getHpno()); // 휴대폰번호 복호화. + // if (decHpno != null && !decHpno.isEmpty()) { + // result.setHpno(decHpno); + // } + // } catch (Exception e) { + // log.error("ERROR: ", e); + // } + // } for (CtrCntrlHstryArea data : areaList) { if (data.getActnType().equals("01")) { @@ -223,7 +229,7 @@ public class CtrCntrlService { CtrCntrlArcrftWarnModel model = new CtrCntrlArcrftWarnModel(); String idntfNum = cntrlBasRepository.getIdntfNum(cntrlId); //이미 Socket에서 payload의 trim에 따라 cntrlBas에 식별번호가 PA로 시작하는 데이터가 insert 되어 있음. 이 데이터 중 매개변수로 들어온 id와 일치하는 cntrlBas의 식별번호를 가져옴 - CtrCntrlHstry hisControl = query.getWarnHstryList(cntrlId); // repo method 이름을 왜 이렇게 지었는지는 모르겠으나.. cntrlBas에 insert될 때 같이 insert되는 cntrlHstry 데이터 중 가장 마지막에 찍힌 hstry 로그를 가져옴 + CtrCntrlHstry hisControl = query.getWarnHstryList(cntrlId); // cntrlBas에 insert될 때 같이 insert되는 cntrlHstry 데이터 중 가장 마지막에 찍힌 hstry 로그를 가져옴 int planSno = relRepository.getPlanSno(idntfNum).orElse(0); // cntrlBas insert될때 같이 insert된 mapping 테이블에서 식별번호로 planSno 가져옴 if (query.checkPlanSno(planSno) < 1) continue; @@ -609,6 +615,13 @@ public class CtrCntrlService { return result; } + /** + * 날씨 조회하는 기능. + * @param rq + * @return + * @throws IOException + * @throws ParseException + */ public JSONObject getWeather(CtrCntrlWeatherModel rq) throws IOException, ParseException { StringBuilder urlBuilder = new StringBuilder(weatherUrl); diff --git a/pav-server/src/main/java/com/palnet/biz/api/ctr/cntrl/service/SocketReceiverService.java b/pav-server/src/main/java/com/palnet/biz/api/ctr/cntrl/service/SocketReceiverService.java index 78579613..2bf21e3d 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/ctr/cntrl/service/SocketReceiverService.java +++ b/pav-server/src/main/java/com/palnet/biz/api/ctr/cntrl/service/SocketReceiverService.java @@ -42,6 +42,11 @@ public class SocketReceiverService { private final FltPlanQueryRepository fltPlanQueryRepository; private final FltPlanCtrCntrlRelRepository ctrCntrlRelRepository; + /** + * 소켓에서 날아오는 데이터를 데이터베이스에 저장시키는 기능. + * @Transactional 데이터베이스에 저장, 삭제, 수정일 경우 데이터베이스의 정합을 위해 사용함. + * @param model + */ @Transactional public void insert(GPModel model) { GPDatabaseModel dbModel = new GPDatabaseModel(); @@ -62,27 +67,41 @@ public class SocketReceiverService { ComIdntfBas idntfBas = idntBasRepository.findById(model.getObjectId()).orElse(null); // 1-1. 식별 번호의 모델 정보 조회 - ComArcrftBas arcrftBas = arcrftBasRepository.findById(idntfBas.getArcrftSno()).orElse(null); + // PAV-KAC에서는 기초데이터가 필수가 아니여서 idntBas가 null일 수 있음. + ComArcrftBas arcrftBas = null; + if (idntfBas != null && idntfBas.getArcrftSno() > 0) { + arcrftBas = arcrftBasRepository.findById(idntfBas.getArcrftSno()).orElse(null); + } + + if(ctrCntrlBas != null) { + if (ctrCntrlBas.getCntrlId() != null && !ctrCntrlBas.getCntrlId().isEmpty()) + fltPlanCtrCntrlRel.setCntrlId(ctrCntrlBas.getCntrlId()); + if (ctrCntrlBas.getIdntfNum() != null && !ctrCntrlBas.getIdntfNum().isEmpty()) + fltPlanCtrCntrlRel.setIdntfNum(ctrCntrlBas.getIdntfNum()); + } - if (idntfBas != null && arcrftBas != null) { - fltPlanCtrCntrlRel.setCntrlId(ctrCntrlBas.getCntrlId()); - fltPlanCtrCntrlRel.setIdntfNum(ctrCntrlBas.getIdntfNum()); + if (idntfBas != null && idntfBas.getCstmrSno() != null) { fltPlanCtrCntrlRel.setIdntfCstmrSno(idntfBas.getCstmrSno()); + } + + if (arcrftBas != null && arcrftBas.getGroupId() != null && !arcrftBas.getGroupId().isEmpty()){ fltPlanCtrCntrlRel.setGroupId(arcrftBas.getGroupId()); } // 2. 해당 되는 비행계획서 정보 저장. - List planArcrft = - fltPlanQueryRepository.findByFlightPlanArcrft(ctrCntrlBas.getIdntfNum(), dbModel.getServerRcvDt()); + List planArcrft = null; + if (ctrCntrlBas != null && ctrCntrlBas.getCntrlId() != null && !ctrCntrlBas.getCntrlId().isEmpty()){ + planArcrft = fltPlanQueryRepository.findByFlightPlanArcrft(ctrCntrlBas.getIdntfNum(), dbModel.getServerRcvDt()); + } - if (!planArcrft.isEmpty()) { + if (planArcrft != null && !planArcrft.isEmpty()) { for (FltPlanBas plan : planArcrft) { fltPlanCtrCntrlRel.setPlanSno(plan.getPlanSno()); } } // 3. mapping 정보 주입. - if (!fltPlanCtrCntrlRel.getCntrlId().isEmpty()) { + if (fltPlanCtrCntrlRel.getCntrlId() != null && !fltPlanCtrCntrlRel.getCntrlId().isEmpty() && fltPlanCtrCntrlRel.getPlanSno() != null) { ctrCntrlRelRepository.save(fltPlanCtrCntrlRel); } } @@ -97,6 +116,11 @@ public class SocketReceiverService { } + /** + * 한번에 많은 데이터를 데이터베이스에 저장하는 기능. + * @Transactional 데이터베이스에 저장, 삭제, 수정일 경우 데이터베이스의 정합을 위해 사용함. + * @param models + */ @Transactional public void insertAll(Map> models) { // TODO 일괄 처리 필요 diff --git a/pav-server/src/main/java/com/palnet/biz/api/external/controller/ExternalLaancController.java b/pav-server/src/main/java/com/palnet/biz/api/external/controller/ExternalLaancController.java new file mode 100644 index 00000000..fa42f3cc --- /dev/null +++ b/pav-server/src/main/java/com/palnet/biz/api/external/controller/ExternalLaancController.java @@ -0,0 +1,144 @@ +package com.palnet.biz.api.external.controller; + +import com.palnet.biz.api.bas.laanc.service.BasLaancService; +import com.palnet.biz.api.external.model.TsPlanRq; +import com.palnet.biz.api.external.model.TsQrcodeRs; +import com.palnet.biz.api.external.service.TsService; +import com.palnet.comn.code.ErrorCode; +import com.palnet.comn.exception.CustomException; +import com.palnet.comn.utils.JsonUtils; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Parameters; +import io.swagger.v3.oas.annotations.enums.ParameterIn; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.HashMap; +import java.util.Map; + +@Slf4j +@Tag(name = "외부 연동 API", description = "외부 연동 API") +@RequiredArgsConstructor +@RequestMapping("/api/external/laanc") +@RestController +public class ExternalLaancController { + + private final TsService tsService; + private final BasLaancService basLaancService; + + /* + error code + 200 - 정상적으로 수신되었습니다. + 300 - 메시지 규격이 다릅니다. - Json 포멧이 틀린 경우 + 301 - 필수 항목이 누락되었습니다. - 필수 항목이 누락된 경우 + 302 - 메시지 타입이 맞지 않습니다. - 메시지내 파라미터의 타입이 잘못된 경우 + 500 - 서버 연결이 되지 않습니다. - call측 network exception 처리 + 501 - 네트워크 연결이 지연 됩니다. - call측 network exception 처리 + 600 - 인증키가 유효하지 않습니다. + 700 - 기타 오류 - 기 정의된 내용이 아닌 기타 오류인 경우 + */ + + // TS로 부터 비행 신청 정보 - endpoint + @Operation(summary = "TS로 부터 비행 신청 정보", description = "TS로 부터 비행 신청 정보") + @PostMapping("/plan/dos") + public ResponseEntity createTsFltPlan( + @Parameter(schema = @Schema(implementation = TsPlanRq.class)) + @RequestBody String body + ) { + log.info(">>>> /plan/ost body: {}", body); + TsPlanRq tsPlanRq; + try { + tsPlanRq = JsonUtils.fromJson(body, TsPlanRq.class); + } catch (Exception e) { + ErrorCode errorCode = ErrorCode.TS_PARAM; + Map error = new HashMap<>(); + error.put("rspCode", "300"); + error.put("rspMessage", errorCode.message()); + return ResponseEntity.status(300).body(error); + } + + + try { + basLaancService.createPlanDos(tsPlanRq); + } catch (CustomException e) { + log.error("IGNORE: ", e); + + ErrorCode errorCode = ErrorCode.fromCode(e.getErrorCode()); + if (errorCode == null) errorCode = ErrorCode.TS_ETC; + + String tsErrorCode = errorCode.code().replaceAll("TS", ""); + + Map error = new HashMap<>(); + error.put("rspCode", tsErrorCode); + error.put("rspMessage", errorCode.message()); + + return ResponseEntity.status(Integer.parseInt(tsErrorCode)).body(error); + } catch (Exception e) { + log.error("IGNORE: ", e); + Map error = new HashMap<>(); + error.put("rspCode", ErrorCode.TS_ETC.code()); + error.put("rspMessage", ErrorCode.TS_ETC.message()); + return ResponseEntity.status(700).body(error); + } + + Map successRs = new HashMap<>(); + successRs.put("rspCode", ErrorCode.TS_SUCCESS.code().replaceAll("TS", "")); + successRs.put("rspMessage", ErrorCode.TS_SUCCESS.message()); + return ResponseEntity.ok().body(successRs); + } + + // TS VC 유효성 검토 callback url - endpoint + @PostMapping("/vc/callback") + public ResponseEntity vcCallback( + @Parameter(schema = @Schema(implementation = TsQrcodeRs.class)) + @RequestBody String body + ) { + log.info(">>>> vc/callback body: {}", body); + TsQrcodeRs rs; + try { + rs = JsonUtils.fromJson(body, TsQrcodeRs.class); + } catch (Exception e) { + ErrorCode errorCode = ErrorCode.TS_PARAM; + Map error = new HashMap<>(); + error.put("rspCode", "300"); + error.put("rspMessage", errorCode.message()); + return ResponseEntity.status(300).body(error); + } + + try { + tsService.vcCallback(rs); + } catch (CustomException e) { + log.error("IGNORE: ", e); + + ErrorCode errorCode = ErrorCode.fromCode(e.getErrorCode()); + if (errorCode == null) errorCode = ErrorCode.TS_ETC; + + String tsErrorCode = errorCode.code().replaceAll("TS", ""); + + Map error = new HashMap<>(); + error.put("rspCode", tsErrorCode); + error.put("rspMessage", errorCode.message()); + + return ResponseEntity.status(Integer.parseInt(tsErrorCode)).body(error); + } catch (Exception e) { + log.error("IGNORE: ", e); + Map error = new HashMap<>(); + error.put("rspCode", ErrorCode.TS_ETC.code().replaceAll("TS", "")); + error.put("rspMessage", ErrorCode.TS_ETC.message()); + return ResponseEntity.status(700).body(error); + } + Map successRs = new HashMap<>(); + successRs.put("rspCode", ErrorCode.TS_SUCCESS.code().replaceAll("TS", "")); + successRs.put("rspMessage", ErrorCode.TS_SUCCESS.message()); + return ResponseEntity.ok().body(successRs); + } + +} diff --git a/pav-server/src/main/java/com/palnet/biz/api/external/model/PilotValidRq.java b/pav-server/src/main/java/com/palnet/biz/api/external/model/PilotValidRq.java index 82eacaef..a854d0d7 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/external/model/PilotValidRq.java +++ b/pav-server/src/main/java/com/palnet/biz/api/external/model/PilotValidRq.java @@ -1,5 +1,6 @@ package com.palnet.biz.api.external.model; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -21,6 +22,8 @@ import lombok.NoArgsConstructor; @NoArgsConstructor @AllArgsConstructor public class PilotValidRq { - private String pilotci; // 조종사 ci - 본인인증 - private String declarationnum; // 기체신고번호 + @Schema(description = "조종사 ci - 본인인증", example = "dzT9zrm1JJRbrT1oRsUbvXYDfbAtXG5QOZjbIVHPaklSZ2PTw8ojYdJyeTrdQdtKIGFM5Z7xfrN/Crm6iGRLkA==") + private String pilotci; + @Schema(description = "기체신고번호", example = "C1CM0231251") + private String declarationnum; } diff --git a/pav-server/src/main/java/com/palnet/biz/api/external/model/PilotValidRs.java b/pav-server/src/main/java/com/palnet/biz/api/external/model/PilotValidRs.java index 092a5b82..1b8a3883 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/external/model/PilotValidRs.java +++ b/pav-server/src/main/java/com/palnet/biz/api/external/model/PilotValidRs.java @@ -1,5 +1,6 @@ package com.palnet.biz.api.external.model; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -21,11 +22,18 @@ import lombok.NoArgsConstructor; @NoArgsConstructor @AllArgsConstructor public class PilotValidRs { - private String rspCode; // 결과코드 - private String rspMessage; // 결과메시지 - private String pilotcredentialyn; // 조종사자격증명여부 - private String arcrftinsuranceyn; // 기체보험가입여부 - private String arcrftdeclaration; // 기체신고여부 - private String corpregyn; // 사업자유무 + @Schema(description = "결과코드", example = "200") + private String rspCode; + @Schema(description = "결과메시지", example = "SUCCESS") + private String rspMessage; + @Schema(description = "조종사자격증명여부", example = "Y") + private String pilotcredentialyn; + @Schema(description = "기체보험가입여부", example = "Y") + private String arcrftinsuranceyn; + @Schema(description = "기체신고여부", example = "Y") + private String arcrftdeclaration; + @Schema(description = "사업자유무", example = "Y") + private String corpregyn; + private PilotValidRq rq; } diff --git a/pav-server/src/main/java/com/palnet/biz/api/external/model/TsPlanRq.java b/pav-server/src/main/java/com/palnet/biz/api/external/model/TsPlanRq.java new file mode 100644 index 00000000..a1e9d120 --- /dev/null +++ b/pav-server/src/main/java/com/palnet/biz/api/external/model/TsPlanRq.java @@ -0,0 +1,150 @@ +package com.palnet.biz.api.external.model; + +import com.palnet.biz.api.bas.laanc.model.BasLaancPlanRq; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class TsPlanRq { + + private List flightapprovalInfo; + private List arcrftInfo; + private List businessinfo; + private List flightInfo; + + @Data + @NoArgsConstructor + @AllArgsConstructor + @Builder + public static class TsFlightapprovalInfo { + + private List operatorinfo; + + @Data + @NoArgsConstructor + @AllArgsConstructor + @Builder + public static class Operatorinfo { + @Schema(description = "조종자성명", example = "홍길동") + private String pilotname; + @Schema(description = "조종자격번호", example = "91-123456") + private String pilotcredentialno; + } + } + + @Data + @NoArgsConstructor + @AllArgsConstructor + @Builder + public static class TsArcrftInfo { + @Schema(description = "기체종류", example = "13") + private String arcrfttype; + @Schema(description = "신고번호", example = "12345678912") + private String declarationnum; + @Schema(description = "기체 모델명", example = "dJI Mavic 3 Pro") + private String arcrftmodelnm; + @Schema(description = "제작자", example = "dji") + private String prdctcmpnnm; + @Schema(description = "제작번호", example = "2C458790348REF") + private String prdctnum; + @Schema(description = "기체 사이즈(단위:mm)", example = "207x100x91(length x width x height)") + private String arcrftlwh; + /* + 7 : 250g 이하 + 8 : 250g 초과 ~ 2kg 이하 + 9 : 2kg 초과 ~ 7kg 이하 + 10 : 7kg 초과 ~ 25kg 이하 + 11 : 25kg 초과 + 12 : 25kg 초과(시험비행) + */ + @Schema(description = "최대이륙중량 [7,8,9,10,11,12]", example = "7") + private String arcrftwght; + @Schema(description = "소유자명", example = "홍길동") + private String ownernm; + @Schema(description = "법인명", example = "팔네트웍스") + private String corporationnm; + @Schema(description = "보험가입여부", example = "Y") + private String insrncyn; + @Schema(description = "기체보험유무", example = "Y") + private String arcrftinsuranceyn; + @Schema(description = "보험 유효기간[yyyyMMdd]", example = "20240101") + private String insuranceexperiod; + } + + @Data + @NoArgsConstructor + @AllArgsConstructor + @Builder + public static class TsBusinessinfo { + @Schema(description = "사업자유무", example = "Y") + private String corpregyn; + } + + @Data + @NoArgsConstructor + @AllArgsConstructor + @Builder + public static class TsFlightInfo { + @Schema(description = "비행구역수", example = "1") + private String fltareacnt; + /* + 01 : 시계비행 + 02 : 자동비행 + 03 : 선회비행 + 04 : 계기비행 + 05 : 격자비행 + 06 : 수직이착륙비행 + 07 : 가시권비행 + 08 : 수동조종비행 + 09 : 제자리비행 + 10 : 군집비행 + 00 : 직접입력 + */ + @Schema(description = "비행방식[00~10]", example = "02") + private String fltmethod; + @Schema(description = "비행방식(직접입력):fltmethod=00일경우", example = "") + private String udfltmethod; + @Schema(description = "비행시작일시[yyyyMMddHHmm]", example = "202308150000") + private String pltstdt; + @Schema(description = "비행종료일시[yyyyMMddHHmm]", example = "202308160000") + private String pltenddt; + @Schema(description = "비행목적", example = "06") + private String pltpurpose; + private List areaInfo; + + @Data + @NoArgsConstructor + @AllArgsConstructor + @Builder + public static class TsAreaInfo { + @Schema(description = "주소", example = "강원특별자치도 원주시 귀래면 주포리 산 7") + private String addr; + @Schema(description = "좌표", example = "37° 10′ 09″ N 127° 52′ 28″ E") + private String coord; + @Schema(description = "고도[--M:--FT]", example = "100M:328FT") + private String elev; + @Schema(description = "반경[단위:m]", example = "100") + private String radius; + } + } + + + + // Laanc RQ로 변형 + public BasLaancPlanRq toBasLaancPlanRq() { + BasLaancPlanRq rq = new BasLaancPlanRq(); + + + + + return rq; + } +} diff --git a/pav-server/src/main/java/com/palnet/biz/api/external/model/TsQrcodeRq.java b/pav-server/src/main/java/com/palnet/biz/api/external/model/TsQrcodeRq.java new file mode 100644 index 00000000..bc1f47a7 --- /dev/null +++ b/pav-server/src/main/java/com/palnet/biz/api/external/model/TsQrcodeRq.java @@ -0,0 +1,28 @@ +package com.palnet.biz.api.external.model; + +import lombok.Builder; +import lombok.Data; + +@Data +public class TsQrcodeRq { + private String type; // 5 (한국공항공사) - 고정 + private String rtnUrl; // 리턴 url - 고정 + private String reqId; // 추적 코드 + private String submittype; // 기체신고번호 + private String applyUser; // 사용자 인증 코드 ci + + public TsQrcodeRq() { + this.type = "5"; + this.rtnUrl = ""; + } + + @Builder + public TsQrcodeRq(String rtnUrl, String reqId, String submittype, String applyUser) { + this.type = "5"; + this.rtnUrl = rtnUrl; + this.reqId = reqId; + this.submittype = submittype; + this.applyUser = applyUser; + } + +} diff --git a/pav-server/src/main/java/com/palnet/biz/api/external/model/TsQrcodeRs.java b/pav-server/src/main/java/com/palnet/biz/api/external/model/TsQrcodeRs.java new file mode 100644 index 00000000..b2dcfc67 --- /dev/null +++ b/pav-server/src/main/java/com/palnet/biz/api/external/model/TsQrcodeRs.java @@ -0,0 +1,52 @@ +package com.palnet.biz.api.external.model; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * packageName : com.palnet.biz.api.external.model + * fileName : PilotValidRq + * author : dhji + * date : 2023-09-21(021) + * description : + * =========================================================== + * DATE AUTHOR NOTE + * ----------------------------------------------------------- + * 2023-09-21(021) dhji 최초 생성 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class TsQrcodeRs { + // 결과코드 + @Schema(description = "결과코드", example = "200") + private String rspCode; + + // 결과메시지 + @Schema(description = "결과메시지", example = "정상적으로 수신되었습니다.") + private String rspMessage; + + // 요청ID + @Schema(description = "요청ID", example = "6f1e469c-3819-4427-b047-08a2d361f9dd") + private String rqID; + + // 조종사자격증명여부 + @Schema(description = "조종사자격증명여부", example = "Y") + private String pilotcredentialyn; + + // 기체보험가입여부 + @Schema(description = "기체보험가입여부", example = "Y") + private String arcrftinsuranceyn; + + // 기체신고여부 + @Schema(description = "기체신고여부", example = "Y") + private String arcrftdeclaration; + + // 사업자유무 + @Schema(description = "사업자유무", example = "Y") + private String corpregyn; +} diff --git a/pav-server/src/main/java/com/palnet/biz/api/external/service/TsService.java b/pav-server/src/main/java/com/palnet/biz/api/external/service/TsService.java index 59bc8337..e705fc97 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/external/service/TsService.java +++ b/pav-server/src/main/java/com/palnet/biz/api/external/service/TsService.java @@ -1,7 +1,22 @@ package com.palnet.biz.api.external.service; +import com.google.zxing.BarcodeFormat; +import com.google.zxing.WriterException; +import com.google.zxing.client.j2se.MatrixToImageConfig; +import com.google.zxing.client.j2se.MatrixToImageWriter; +import com.google.zxing.common.BitMatrix; +import com.google.zxing.qrcode.QRCodeWriter; +import com.palnet.biz.api.bas.laanc.model.BasLaancLastRs; +import com.palnet.biz.api.bas.laanc.model.BasLaancPlanRq; +import com.palnet.biz.api.bas.laanc.model.BasLaancValidatedRs; +import com.palnet.biz.api.bas.laanc.service.BasLaancService; import com.palnet.biz.api.external.model.PilotValidRq; import com.palnet.biz.api.external.model.PilotValidRs; +import com.palnet.biz.api.external.model.TsPlanRq; +import com.palnet.biz.api.external.model.TsQrcodeRs; +import com.palnet.biz.jpa.entity.ComConfirmBas; +import com.palnet.biz.jpa.repository.com.ComConfirmBasRepository; +import com.palnet.comn.utils.JsonUtils; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; @@ -15,6 +30,10 @@ import org.springframework.web.util.DefaultUriBuilderFactory; import org.springframework.web.util.UriComponentsBuilder; import org.springframework.web.util.UriUtils; +import javax.imageio.ImageIO; +import java.awt.image.BufferedImage; +import java.io.ByteArrayOutputStream; +import java.io.IOException; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.List; @@ -39,7 +58,10 @@ public class TsService { private String TS_HOST; private final String ACCOUNT_VALIDATE_URI = "/api/account/getValidate"; + private final ComConfirmBasRepository comConfirmBasRepository; + + // 이전 TS 연동 public List getAccountValidate(List rqList) { List rsList = new ArrayList<>(); @@ -58,6 +80,7 @@ public class TsService { } + // 이전 TS 연동 public PilotValidRs callAccountValidate(PilotValidRq rq) { String pilotciEnc = UriUtils.encode(rq.getPilotci(), StandardCharsets.UTF_8); @@ -87,7 +110,7 @@ public class TsService { log.error("TS API 호출 중 오류가 발생하였습니다. {}", e.getMessage()); String erroCode = "500"; String errorMessage = "TS API error"; - if(e instanceof WebClientResponseException){ + if (e instanceof WebClientResponseException) { WebClientResponseException wcre = (WebClientResponseException) e; erroCode = String.valueOf(wcre.getRawStatusCode()); errorMessage = wcre.getStatusText(); @@ -110,4 +133,43 @@ public class TsService { return rs; } + // QR 코드 생성 + public byte[] createQrcode(String params) throws WriterException, IOException { + // 바코드 색상 값 +// int qrcodeColor = 0xFF2e4e96; + int qrcodeColor = 0xFF000000; + // 배경 색상 값 + int backgroundColor = 0xFFFFFFFF; + + QRCodeWriter qrCodeWriter = new QRCodeWriter(); + // 300x300 + BitMatrix bitMatrix = qrCodeWriter.encode(params, BarcodeFormat.QR_CODE, 300, 300); + + MatrixToImageConfig matrixToImageConfig = new MatrixToImageConfig(qrcodeColor, backgroundColor); + BufferedImage bufferedImage = MatrixToImageWriter.toBufferedImage(bitMatrix, matrixToImageConfig); + // ImageIO를 사용한 바코드 파일쓰기 +// boolean png = ImageIO.write(bufferedImage, "png", new File("stoneQR2.png")); + + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + ImageIO.write(bufferedImage, "png", outputStream); + return outputStream.toByteArray(); + + } + + // QR return url + public void vcCallback(TsQrcodeRs rs) { + String rspCode = rs.getRspCode(); + log.info(">>> confirmKey [RECEIVED/FAILED]: {}", rs.getRqID()); + ComConfirmBas entity = comConfirmBasRepository.findFirstByConfirmKey(rs.getRqID()); + if (entity != null) { + String rsJsonStr = JsonUtils.toJson(rs); + entity.setRsData(rsJsonStr); + entity.setStatus(("200".equals(rspCode)) ? "RECEIVED" : "FAILED"); + comConfirmBasRepository.save(entity); + } + } + + + + } 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 7ba61679..22d997ac 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 @@ -1,396 +1,636 @@ package com.palnet.biz.api.main.dash.controller; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import com.palnet.biz.api.main.dash.model.*; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; - import com.palnet.biz.api.comn.response.BasicResponse; import com.palnet.biz.api.comn.response.ErrorResponse; import com.palnet.biz.api.comn.response.SuccessResponse; +import com.palnet.biz.api.main.dash.model.*; import com.palnet.biz.api.main.dash.service.MainDashService; import com.palnet.comn.code.RSErrorCode; - -import io.swagger.annotations.ApiImplicitParam; -import io.swagger.annotations.ApiImplicitParams; -import io.swagger.annotations.ApiOperation; +import com.palnet.comn.exception.CustomException; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Parameters; +import io.swagger.v3.oas.annotations.enums.ParameterIn; +import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; -@Log4j2 +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Slf4j +@Tag(name = "메인화면 컨트롤러", description = "메인화면 관련 API") @RestController @RequiredArgsConstructor @RequestMapping(value = "/api/main/dash", produces = {MediaType.APPLICATION_JSON_VALUE}) -@Tag(name = "메인화면 컨트롤러", description = "메인화면 관련 API") public class MainDashController { - - @Autowired - private final MainDashService service; - - /** - * @param rq - * @return - */ - @GetMapping(value = "/stcs/day") - @ApiOperation(value = "일 별 비행건수 통계") - @Tag(name = "메인화면 컨트롤러", description = "메인화면 관련 API") - @ApiImplicitParam(name = "yyyymm",value = "날짜", dataTypeClass = String.class) - public ResponseEntity stcsDay(String yyyymm) { - List result = null; -// log.debug(yyyymm); - - //입력값 검증 - if(yyyymm == null || !(yyyymm.length() == 7) ) { - return ResponseEntity.status(HttpStatus.OK) - .body(new ErrorResponse(RSErrorCode.ER_PARAM)); - } - + private final MainDashService service; + + /** + * 일 별 비행횟수 통계를 조회하는 기능. + * + * @param yyyymm + * @return + */ + @Operation(summary = "일 별 비행횟수 통계", description = "일 별 비행횟수 통계") + @Parameter(name = "yyyymm", description = "날짜", in = ParameterIn.QUERY, example = "2023-12") + @ApiResponse(responseCode = "200", description = "OK") + @GetMapping(value = "/stcs/day") + public ResponseEntity stcsDay(String yyyymm) { + List result = null; + + // yyyymm 값이 있는지, 글자 갯수가 7개인지 입력값 검증 + if (yyyymm == null || !(yyyymm.length() == 7)) { + // 검증통과하지 못할 시 서버에서 "의도적인" 에러 반환 + return ResponseEntity.status(HttpStatus.OK) // "의도적인" 에러 반환코드 + .body(new ErrorResponse(RSErrorCode.ER_PARAM)); + } + try { - - result = service.mainDashStcsDay(yyyymm); - + + result = service.mainDashStcsDay(yyyymm); // 일별 비행건수 통계하는 기능 + } catch (CustomException e) { + Map resultMap = new HashMap<>(); + log.error("IGNORE : ", e); + resultMap.put("result", false); + resultMap.put("errorCode", e.getErrorCode()); + resultMap.put("errorMessage", e.getMessage()); + return ResponseEntity.ok().body(new SuccessResponse<>(resultMap)); } catch (Exception e) { - log.error("IGNORE : {}", e); - return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) - .body(new ErrorResponse("Server Error", "-1")); + /** + * try{ + ... + } + * try 영역 안 코드들중 문제가 생기면 오는 곳. + * log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌 + */ + log.error("IGNORE : {}", e); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body(new ErrorResponse("Server Error", "-1")); + + } + return ResponseEntity.ok().body(new SuccessResponse(result)); + + } + + + /** + * TOP5 지역 별 비행횟수 통계를 조회하는 기능 + * + * @param yyyymm + * @return + */ + @Operation(summary = "TOP5 지역 별 비행횟수 통계", description = "TOP5 지역 별 비행횟수 통계") + @Parameter(name = "yyyymm", description = "날짜", in = ParameterIn.QUERY, example = "2023-12") + @ApiResponse(responseCode = "200", description = "성공") + @GetMapping(value = "/stcs/area") + public ResponseEntity stcsArea(String yyyymm) { + List result = null; + + // yyyymm 값이 있는지, 글자 갯수가 7개인지 입력값 검증 + if(yyyymm == null || !(yyyymm.length() == 7) ) { + // 검증통과하지 못할 시 서버에서 "의도적인" 에러 반환 + return ResponseEntity.status(HttpStatus.OK) // "의도적인" 에러 반환코드 + .body(new ErrorResponse(RSErrorCode.ER_PARAM)); + } - } - return ResponseEntity.ok().body(new SuccessResponse(result)); - - } - - - /** - * @param rq - * @return - */ - @GetMapping(value = "/stcs/area") - @ApiOperation(value = "TOP5 지역 별 비행횟수 통계") - @Tag(name = "메인화면 컨트롤러", description = "메인화면 관련 API") - @ApiImplicitParam(name = "yyyymm",value = "날짜", dataTypeClass = String.class) - public ResponseEntity stcsArea(String yyyymm) { - List result = null; - -// log.debug(yyyymm); - - if(yyyymm == null || !(yyyymm.length() == 7) ) { - return ResponseEntity.status(HttpStatus.OK) - .body(new ErrorResponse(RSErrorCode.ER_PARAM)); - } - try { - result = service.mainDashStcsArea(yyyymm); - - + result = service.mainDashStcsArea(yyyymm); // Top5 지역별 비행횟수 통계기능 + + } catch (CustomException e) { + Map resultMap = new HashMap<>(); + log.error("IGNORE : ", e); + resultMap.put("result", false); + resultMap.put("errorCode", e.getErrorCode()); + resultMap.put("errorMessage", e.getMessage()); + return ResponseEntity.ok().body(new SuccessResponse<>(resultMap)); } catch (Exception e) { - log.error("IGNORE : {}", e); - return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) - .body(new ErrorResponse("Server Error", "-1")); + /** + * try{ + ... + } + * try 영역 안 코드들중 문제가 생기면 오는 곳. + * log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌 + */ + log.error("IGNORE : {}", e); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body(new ErrorResponse("Server Error", "-1")); + + } + return ResponseEntity.ok().body(new SuccessResponse(result)); + + } + + /** + * 본인이 생성한 그룹 정보죄하는 기능. + * + * @param cstmrSno + * @return + */ + @Operation(summary = "본인이 생성한 그룹 정보", description = "본인이 생성한 그룹 정보") + @Parameter(name = "cstmrSno", description = "고객일련번호", in = ParameterIn.QUERY, example = "1") + @ApiResponse(responseCode = "200", description = "성공") + @GetMapping(value = "/group/list") + public ResponseEntity groupList(Integer cstmrSno) { + List result = null; + + // 회원고유번호[cstmrSno] 입력값 검증처리 + if(cstmrSno == null) { + // 검증통과하지 못할 시 서버에서 "의도적인" 에러 반환 + return ResponseEntity.status(HttpStatus.OK) // "의도적인" 에러 반환코드 + .body(new ErrorResponse(RSErrorCode.ER_PARAM)); + } - } - return ResponseEntity.ok().body(new SuccessResponse(result)); - - } - - /** - * @param rq - * @return - */ - @GetMapping(value = "/group/list") - @ApiOperation(value = "본인이 생성한 그룹 정보") - @Tag(name = "메인화면 컨트롤러", description = "메인화면 관련 API") - @ApiImplicitParam(name = "cstmrSno",value = "고객일련번호", dataTypeClass = Integer.class) - public ResponseEntity groupList(Integer cstmrSno) { - List result = null; - - //입력값 검증 - if(cstmrSno == null) { - return ResponseEntity.status(HttpStatus.OK) - .body(new ErrorResponse(RSErrorCode.ER_PARAM)); - } - try { - result = service.mainDashGroupList(cstmrSno); - + result = service.mainDashGroupList(cstmrSno); // TOP3 가입 그룹 리스트 조회하는 기능 + } catch (CustomException e) { + Map resultMap = new HashMap<>(); + log.error("IGNORE : ", e); + resultMap.put("result", false); + resultMap.put("errorCode", e.getErrorCode()); + resultMap.put("errorMessage", e.getMessage()); + return ResponseEntity.ok().body(new SuccessResponse<>(resultMap)); } catch (Exception e) { - log.error("IGNORE : {}", e); - return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) - .body(new ErrorResponse("Server Error", "-1")); + /** + * try{ + ... + } + * try 영역 안 코드들중 문제가 생기면 오는 곳. + * log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌 + */ + log.error("IGNORE : {}", e); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body(new ErrorResponse("Server Error", "-1")); + + } + return ResponseEntity.ok().body(new SuccessResponse(result)); + + } + + + /** + * 기체 정보 리스트 조회하는 기능, + * 회원 고유번호[cstmrSno]로 조회함. + * + * @param cstmrSno + * @return + */ + @Operation(summary = "기체 정보 리스트", description = "기체 정보 리스트") + @Parameter(name = "cstmrSno", description = "고객일련번호", in = ParameterIn.QUERY, example = "1") + @ApiResponse(responseCode = "200", description = "성공") + @GetMapping(value = "/arcrft/list") + public ResponseEntity arcrftList(Integer cstmrSno) { + List result = null; + + // 회원고유번호[cstmrSno] 입력값 검증처리 + if(cstmrSno == null) { + // 검증통과하지 못할 시 서버에서 "의도적인" 에러 반환 + return ResponseEntity.status(HttpStatus.OK) // "의도적인" 에러 반환코드 + .body(new ErrorResponse(RSErrorCode.ER_PARAM)); + } - } - return ResponseEntity.ok().body(new SuccessResponse(result)); - - } - - - @GetMapping(value = "/arcrft/list") - @ApiOperation(value = "기체 정보 리스트") - @Tag(name = "메인화면 컨트롤러", description = "메인화면 관련 API") - @ApiImplicitParam(name = "cstmrSno",value = "고객일련번호", dataTypeClass = Integer.class) - public ResponseEntity arcrftList(Integer cstmrSno) { - List result = null; - - //입력값 검증 - if(cstmrSno == null) { - return ResponseEntity.status(HttpStatus.OK) - .body(new ErrorResponse(RSErrorCode.ER_PARAM)); - } - try { - result = service.mainDashDronList(cstmrSno); - + result = service.mainDashDronList(cstmrSno); // Top3 기체 정보 리스트 조회하는 기능 + } catch (CustomException e) { + Map resultMap = new HashMap<>(); + log.error("IGNORE : ", e); + resultMap.put("result", false); + resultMap.put("errorCode", e.getErrorCode()); + resultMap.put("errorMessage", e.getMessage()); + return ResponseEntity.ok().body(new SuccessResponse<>(resultMap)); } catch (Exception e) { - log.error("IGNORE : {}", e); - return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) - .body(new ErrorResponse("Server Error", "-1")); - - } - return ResponseEntity.ok().body(new SuccessResponse(result)); - - } - - - @GetMapping(value = "/stcs/flight/date/{type}") - @ApiOperation(value = "김포공항, 비행실적 통계") - @Tag(name = "메인화면 컨트롤러", description = "메인화면 관련 API") - @ApiImplicitParams({ - @ApiImplicitParam(name = "date",value = "날짜", dataTypeClass = String.class), - @ApiImplicitParam(name = "type",value = "날짜형식", dataTypeClass = String.class) - }) - @Deprecated - public ResponseEntity flightStatistics(String date, @PathVariable String type){ - - String[] formatParam = null; + /** + * try{ + ... + } + * try 영역 안 코드들중 문제가 생기면 오는 곳. + * log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌 + */ + log.error("IGNORE : {}", e); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body(new ErrorResponse("Server Error", "-1")); + + } + return ResponseEntity.ok().body(new SuccessResponse(result)); + + } + + + /** + * 비행실적 통계하는 기능. + * + * @param date + * @param type + * @return + */ + @Deprecated + @Operation(summary = "김포공항, 비행실적 통계", description = "김포공항, 비행실적 통계") + @Parameters({ + @Parameter(name = "type", description = "날짜형식", in = ParameterIn.PATH, example = "month"), + @Parameter(name = "date", description = "날짜", in = ParameterIn.QUERY, example = "2023") + }) + @GetMapping(value = "/stcs/flight/date/{type}") + public ResponseEntity flightStatistics(String date, @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.mainKacDashStcsDay(date,formatParam); - } catch (Exception e) { - - log.error("IGNORE : {}", e); - return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) - .body(new ErrorResponse("Server Error", "-1")); - } - - return ResponseEntity.ok().body(new SuccessResponse>(result)); - } - - @GetMapping("/stcs/plan-allow/date/{type}") - @ApiOperation(value = "김포공항, 비행승인 통계") - @Tag(name = "메인화면 컨트롤러", description = "메인화면 관련 API") - @ApiImplicitParams({ - @ApiImplicitParam(name = "date",value = "날짜", dataTypeClass = String.class), - @ApiImplicitParam(name = "type",value = "날짜형식", dataTypeClass = String.class) - }) - @Deprecated - public ResponseEntity planAllowStatistics(String date ,@PathVariable String type){ - - String[] formatParam = null; + try { + result = service.mainKacDashStcsDay(date, formatParam); // 날짜별 비행실적 통계기능 + } catch (CustomException e) { + Map resultMap = new HashMap<>(); + log.error("IGNORE : ", e); + resultMap.put("result", false); + resultMap.put("errorCode", e.getErrorCode()); + resultMap.put("errorMessage", e.getMessage()); + return ResponseEntity.ok().body(new SuccessResponse<>(resultMap)); + } 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")); + } + + return ResponseEntity.ok().body(new SuccessResponse>(result)); + } + + /** + * 김포공항, 비행승인 통계 + * + * @param date + * @param type + * @return + */ + @Deprecated + @Operation(summary = "김포공항, 비행승인 통계", description = "김포공항, 비행승인 통계") + @Parameters({ + @Parameter(name = "type", description = "날짜형식", in = ParameterIn.PATH, example = "month"), + @Parameter(name = "date", description = "날짜", in = ParameterIn.QUERY, example = "2023") + }) + @ApiResponse(responseCode = "200", description = "성공") + @GetMapping("/stcs/plan-allow/date/{type}") + public ResponseEntity planAllowStatistics(String date, @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; + List result = null; - try { - result = service.mainStcsPlanAllow(date,formatParam); - } catch (Exception e) { - - log.error("IGNORE : {}", e); - return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) - .body(new ErrorResponse("Server Error", "-1")); - } - - return ResponseEntity.ok().body(new SuccessResponse>(result)); - } - - @GetMapping("/stcs/drone-flight/date/{type}") - @ApiOperation(value = "김포공항, 드론별 비행 통계") - @Tag(name = "메인화면 컨트롤러", description = "메인화면 관련 API") - @ApiImplicitParams({ - @ApiImplicitParam(name = "date",value = "날짜", dataTypeClass = String.class), - @ApiImplicitParam(name = "type",value = "날짜형식", dataTypeClass = String.class), - @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); - - String[] formatParam = null; + try { + result = service.mainStcsPlanAllow(date, formatParam); // 김포공항, 비행승인 통계 기능 + } catch (CustomException e) { + Map resultMap = new HashMap<>(); + log.error("IGNORE : ", e); + resultMap.put("result", false); + resultMap.put("errorCode", e.getErrorCode()); + resultMap.put("errorMessage", e.getMessage()); + return ResponseEntity.ok().body(new SuccessResponse<>(resultMap)); + } 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")); + } + + return ResponseEntity.ok().body(new SuccessResponse>(result)); + } + + /** + * 드론별 비행 통계조회하는 기능. + * + * @param date + * @param idntfNum + * @param type + * @return + */ + @Deprecated + @Operation(summary = "김포공항, 드론별 비행 통계", description = "김포공항, 드론별 비행 통계") + @Parameters({ + @Parameter(name = "type", description = "날짜형식", in = ParameterIn.PATH, example = "month"), + @Parameter(name = "date", description = "날짜", in = ParameterIn.QUERY, example = "2023"), + @Parameter(name = "idntfNum", description = "드론식별번호", in = ParameterIn.QUERY, example = "PA001") + }) + @ApiResponse(responseCode = "200", description = "성공") + @GetMapping("/stcs/drone-flight/date/{type}") + public ResponseEntity droneFlightStatistics(String date, @RequestParam(required = true) String idntfNum, @PathVariable String type) { + log.info("idntfNum -> {}", idntfNum); + + 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); - } catch (Exception e) { + List result = null; - log.error("IGNORE : {}", e); - return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) - .body(new ErrorResponse("Server Error", "-1")); - } - - return ResponseEntity.ok().body(new SuccessResponse>(result)); - } - - @GetMapping("/stcs/warning-flight/date/{type}") - @ApiOperation(value = "김포공항, 비정상상황 비행 통계") - @Tag(name = "메인화면 컨트롤러", description = "메인화면 관련 API") - @ApiImplicitParams({ - @ApiImplicitParam(name = "date",value = "날짜", dataTypeClass = String.class), - @ApiImplicitParam(name = "type",value = "날짜형식", dataTypeClass = String.class) - }) - @Deprecated - public ResponseEntity warningFlightStatistics(String date, @PathVariable String type){ - - String[] formatParam = null; + try { + result = service.mainStcsDroneFlight(date, idntfNum, formatParam); // 드론별 비행실적 통계 기능. + } catch (CustomException e) { + Map resultMap = new HashMap<>(); + log.error("IGNORE : ", e); + resultMap.put("result", false); + resultMap.put("errorCode", e.getErrorCode()); + resultMap.put("errorMessage", e.getMessage()); + return ResponseEntity.ok().body(new SuccessResponse<>(resultMap)); + } 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")); + } + + return ResponseEntity.ok().body(new SuccessResponse>(result)); + } + + /** + * 비정상상황 비행 통계조회하는 기능. + * + * @param date + * @param type + * @return + */ + @Deprecated + @Operation(summary = "김포공항, 비정상상황 비행 통계", description = "김포공항, 비정상상황 비행 통계") + @Parameters({ + @Parameter(name = "type", description = "날짜형식", in = ParameterIn.PATH, example = "month"), + @Parameter(name = "date", description = "날짜", in = ParameterIn.QUERY, example = "2023") + }) + @ApiResponse(responseCode = "200", description = "성공") + @GetMapping("/stcs/warning-flight/date/{type}") + public ResponseEntity warningFlightStatistics(String date, @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)); - } - - List result = null; - - try { - result = service.mainStcsWarningFlight(date,formatParam); - } catch (Exception e) { - - log.error("IGNORE : {}", e); - return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) - .body(new ErrorResponse("Server Error", "-1")); - } - - return ResponseEntity.ok().body(new SuccessResponse>(result)); - } - - @GetMapping(value = "/stcs/dron-flight") - @ApiOperation(value = "드론 비행 현황") - @Tag(name = "메인화면 컨트롤러", description = "메인화면 관련 API") - public ResponseEntity dronFlightStcs(){ - - Map result = null; - - try { - result = service.mainDashDronFlightStcs(); - }catch (Exception e) { - log.error("IGNORE : {}", e); - return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) - .body(new ErrorResponse("Server Error", "-1")); - } - - return ResponseEntity.ok().body(new SuccessResponse< Map>(result)); - } - - @GetMapping(value = "/dron-flight/list") - @ApiOperation(value = "드론 별 비행운항 목록") - @Tag(name = "메인화면 컨트롤러", description = "메인화면 관련 API") - public ResponseEntity dronFlightList(@RequestParam String serviceType){ - - List result = null; - - try { - result = service.mainDashDronFlightList(serviceType); - }catch (Exception e) { - log.error("IGNORE : {}", e); - return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) - .body(new ErrorResponse("Server Error", "-1")); - } - - return ResponseEntity.ok().body(new SuccessResponse>(result)); - } - - @GetMapping("/current/flight-warn") - @ApiOperation(value = "일일 비정상상황 통계") - @Tag(name = "메인화면 컨트롤러", description = "메인화면 관련 API") - @ApiImplicitParams({ - @ApiImplicitParam(name = "groupId",value = "그룹아이디", dataTypeClass = String.class) - }) - public ResponseEntity currentFlightWarn(@RequestParam(required = false) String groupId){ - - List result = new ArrayList<>(); - - try { - result = service.currentFlightWarn(groupId); - }catch (Exception e) { - log.error("IGNORE : {}", e); - return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) - .body(new ErrorResponse("Server Error", "-1")); - } - - return ResponseEntity.ok().body(new SuccessResponse>(result)); - } - - @GetMapping("/current/flight-plan") - @ApiOperation(value = "일일 비행계획 통계") - @Tag(name = "메인화면 컨트롤러", description = "메인화면 관련 API") - @ApiImplicitParams({ - @ApiImplicitParam(name = "groupId",value = "그룹아이디", dataTypeClass = String.class) - }) - public ResponseEntity currentFlightPlan(@RequestParam(required = false) String groupId){ - - List result = new ArrayList<>(); - try { - result = service.currentFlightPlan(groupId); - } catch (Exception e){ - log.error("IGNORE : {}", e); - return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) - .body(new ErrorResponse("Server Error", "-1")); + // 검증통과하지 못할 시 서버에서 "의도적인" 에러 반환 + return ResponseEntity.status(HttpStatus.OK) // "의도적인" 에러 반환코드 + .body(new ErrorResponse(RSErrorCode.ER_PARAM)); } + List result = null; + try { + result = service.mainStcsWarningFlight(date, formatParam); // 비정상상황 통계구하는 기능. + } catch (CustomException e) { + Map resultMap = new HashMap<>(); + log.error("IGNORE : ", e); + resultMap.put("result", false); + resultMap.put("errorCode", e.getErrorCode()); + resultMap.put("errorMessage", e.getMessage()); + return ResponseEntity.ok().body(new SuccessResponse<>(resultMap)); + } 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")); + } + + return ResponseEntity.ok().body(new SuccessResponse>(result)); + } + + /** + * 드론 비행 현황 통계 기능. + * + * @return + */ + @Operation(summary = "드론 비행 현황", description = "드론 비행 현황") + @ApiResponse(responseCode = "200", description = "성공") + @GetMapping(value = "/stcs/dron-flight") + public ResponseEntity dronFlightStcs() { + + Map result = null; - return ResponseEntity.ok().body(new SuccessResponse>(result)); - } + try { + result = service.mainDashDronFlightStcs(); // 드론 비행 현황기능 + } catch (CustomException e) { + Map resultMap = new HashMap<>(); + log.error("IGNORE : ", e); + resultMap.put("result", false); + resultMap.put("errorCode", e.getErrorCode()); + resultMap.put("errorMessage", e.getMessage()); + return ResponseEntity.ok().body(new SuccessResponse<>(resultMap)); + } 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")); + } + + return ResponseEntity.ok().body(new SuccessResponse>(result)); + } + + /** + * 드론 별 비행운항 목록 조회하는 기능. + * + * @param serviceType + * @return + */ + @Operation(summary = "드론 별 비행운항 목록", description = "드론 별 비행운항 목록") + @Parameter(name = "serviceType", description = "서비스 타입(관할기관코드)", in = ParameterIn.QUERY, example = "F0002") + @ApiResponse(responseCode = "200", description = "성공") + @GetMapping(value = "/dron-flight/list") + public ResponseEntity dronFlightList(@RequestParam String serviceType) { + + List result = null; + try { + result = service.mainDashDronFlightList(serviceType); // 드론 별 비행운항 목록 조회하는 기능 + } catch (CustomException e) { + Map resultMap = new HashMap<>(); + log.error("IGNORE : ", e); + resultMap.put("result", false); + resultMap.put("errorCode", e.getErrorCode()); + resultMap.put("errorMessage", e.getMessage()); + return ResponseEntity.ok().body(new SuccessResponse<>(resultMap)); + } 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")); + } + + return ResponseEntity.ok().body(new SuccessResponse>(result)); + } + + /** + * 일일 비정상상황에 대한 통계 기능. + * + * @param serviceType + * @return + */ + @Operation(summary = "일일 비정상상황 통계", description = "일일 비정상상황 통계") + @Parameter(name = "serviceType", description = "서비스 타입(관할기관코드)", in = ParameterIn.QUERY, example = "F0002") + @ApiResponse(responseCode = "200", description = "성공") + @GetMapping("/current/flight-warn") + public ResponseEntity currentFlightWarn(@RequestParam(required = false) String serviceType) { + + List result = new ArrayList<>(); - @GetMapping("/stcs/dailyflight") - @ApiOperation(value = "일일 비행횟수 현황") - @Tag(name = "메인화면 컨트롤러",description = "메인화면 관련 API") - public ResponseEntity getDailyFlightNumOfStcs(){ - List result = null; - try { - result = service.dailyFlightNumOfStcs(); - }catch (Exception e){ - log.error("IGNORE : {} ", e); - return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(new ErrorResponse("Server Error", "-1")); - } - return ResponseEntity.ok().body(new SuccessResponse>(result)); - } + try { + result = service.currentFlightWarn(serviceType); // 일일비정상상황에 대한 통계 기능을 조회하는 기능 + } catch (CustomException e) { + Map resultMap = new HashMap<>(); + log.error("IGNORE : ", e); + resultMap.put("result", false); + resultMap.put("errorCode", e.getErrorCode()); + resultMap.put("errorMessage", e.getMessage()); + return ResponseEntity.ok().body(new SuccessResponse<>(resultMap)); + } 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")); + } + + return ResponseEntity.ok().body(new SuccessResponse>(result)); + } + + /** + * 일일 비행계획에 대한 통계 기능. + * + * @param serviceType + * @return + */ + @Operation(summary = "일일 비행계획 통계", description = "일일 비행계획 통계") + @Parameter(name = "serviceType", description = "서비스 타입(관할기관코드)", in = ParameterIn.QUERY, example = "F0002") + @ApiResponse(responseCode = "200", description = "성공") + @GetMapping("/current/flight-plan") + public ResponseEntity currentFlightPlan(@RequestParam(required = false) String serviceType) { + + List result = new ArrayList<>(); + try { + result = service.currentFlightPlan(serviceType); + } catch (CustomException e) { + Map resultMap = new HashMap<>(); + log.error("IGNORE : ", e); + resultMap.put("result", false); + resultMap.put("errorCode", e.getErrorCode()); + resultMap.put("errorMessage", e.getMessage()); + return ResponseEntity.ok().body(new SuccessResponse<>(resultMap)); + } 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")); + } + + + return ResponseEntity.ok().body(new SuccessResponse>(result)); + } + + + /** + * 일일 비행건수 현황 통계기능. + * + * @return + */ + @Operation(summary = "일일 비행건수 현황", description = "일일 비행건수 현황") + @ApiResponse(responseCode = "200", description = "성공") + @GetMapping("/stcs/dailyflight") + public ResponseEntity getDailyFlightNumOfStcs() { + List result = null; + try { + result = service.dailyFlightNumOfStcs(); // 일일 비행건수 현황 통계기능 + } catch (CustomException e) { + Map resultMap = new HashMap<>(); + log.error("IGNORE : ", e); + resultMap.put("result", false); + resultMap.put("errorCode", e.getErrorCode()); + resultMap.put("errorMessage", e.getMessage()); + return ResponseEntity.ok().body(new SuccessResponse<>(resultMap)); + } 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")); + } + return ResponseEntity.ok().body(new SuccessResponse>(result)); + } } diff --git a/pav-server/src/main/java/com/palnet/biz/api/main/dash/model/MainDashFlightNumStcsModel.java b/pav-server/src/main/java/com/palnet/biz/api/main/dash/model/MainDashFlightNumStcsModel.java index d191d5dc..73f49e81 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/main/dash/model/MainDashFlightNumStcsModel.java +++ b/pav-server/src/main/java/com/palnet/biz/api/main/dash/model/MainDashFlightNumStcsModel.java @@ -1,6 +1,5 @@ package com.palnet.biz.api.main.dash.model; -import io.swagger.annotations.ApiParam; import lombok.Data; /** @@ -17,19 +16,19 @@ import lombok.Data; @Data public class MainDashFlightNumStcsModel { - @ApiParam(value = "구분",example = "전일(어제), 금일(오늘), 명일(내일)") +// @ApiParam(value = "구분",example = "전일(어제), 금일(오늘), 명일(내일)") private String dateType = ""; - @ApiParam(value = "계획",example = "전일(어제), 금일(오늘), 명일(내일) 비행계획서 목록") +// @ApiParam(value = "계획",example = "전일(어제), 금일(오늘), 명일(내일) 비행계획서 목록") private int flightPlan = 0; - @ApiParam(value = "비행 완료",example = "전일(어제), 금일(오늘), 명일(내일) 비행완료 목록") +// @ApiParam(value = "비행 완료",example = "전일(어제), 금일(오늘), 명일(내일) 비행완료 목록") private int completeFlight = 0; - @ApiParam(value = "미 비행",example = "전일(어제), 금일(오늘), 명일(내일) 미 비행 목록") +// @ApiParam(value = "미 비행",example = "전일(어제), 금일(오늘), 명일(내일) 미 비행 목록") private int notFlight = 0; - @ApiParam(value = "비고",example = "전일(어제), 금일(오늘), 명일(내일) 비고") +// @ApiParam(value = "비고",example = "전일(어제), 금일(오늘), 명일(내일) 비고") private double note = 0; } diff --git a/pav-server/src/main/java/com/palnet/biz/api/main/dash/model/MainDashPlanNumStcsModel.java b/pav-server/src/main/java/com/palnet/biz/api/main/dash/model/MainDashPlanNumStcsModel.java index c5b4e8e6..72ea15f3 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/main/dash/model/MainDashPlanNumStcsModel.java +++ b/pav-server/src/main/java/com/palnet/biz/api/main/dash/model/MainDashPlanNumStcsModel.java @@ -1,24 +1,23 @@ package com.palnet.biz.api.main.dash.model; -import io.swagger.annotations.ApiParam; import lombok.Data; @Data public class MainDashPlanNumStcsModel { - @ApiParam(value = "구분",example = "전일(어제), 금일(오늘), 명일(내일)") +// @ApiParam(value = "구분",example = "전일(어제), 금일(오늘), 명일(내일)") private String dateType = ""; - @ApiParam(value = "제출",example = "전일(어제), 금일(오늘), 명일(내일) 비행계획서 목록") +// @ApiParam(value = "제출",example = "전일(어제), 금일(오늘), 명일(내일) 비행계획서 목록") private int plan = 0; - @ApiParam(value = "승인",example = "전일(어제), 금일(오늘), 명일(내일) 비행승인 목록") +// @ApiParam(value = "승인",example = "전일(어제), 금일(오늘), 명일(내일) 비행승인 목록") private int aprvn = 0; - @ApiParam(value = "합계",example = "전일(어제), 금일(오늘), 명일(내일) 합계") +// @ApiParam(value = "합계",example = "전일(어제), 금일(오늘), 명일(내일) 합계") private int count = 0; - @ApiParam(value = "비고",example = "전일(어제), 금일(오늘), 명일(내일) 비고") +// @ApiParam(value = "비고",example = "전일(어제), 금일(오늘), 명일(내일) 비고") private double note = 0; } diff --git a/pav-server/src/main/java/com/palnet/biz/api/main/dash/model/MainDashWarnNumStcsModel.java b/pav-server/src/main/java/com/palnet/biz/api/main/dash/model/MainDashWarnNumStcsModel.java index 491831fd..772c1a84 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/main/dash/model/MainDashWarnNumStcsModel.java +++ b/pav-server/src/main/java/com/palnet/biz/api/main/dash/model/MainDashWarnNumStcsModel.java @@ -1,25 +1,24 @@ package com.palnet.biz.api.main.dash.model; -import io.swagger.annotations.ApiParam; import lombok.Data; @Data public class MainDashWarnNumStcsModel { - @ApiParam(value = "구분",example = "전일(어제), 금일(오늘), 명일(내일)") +// @ApiParam(value = "구분",example = "전일(어제), 금일(오늘), 명일(내일)") private String dateType = ""; - @ApiParam(value = "경로이탈",example = "전일(어제), 금일(오늘), 명일(내일) 경로이탈") +// @ApiParam(value = "경로이탈",example = "전일(어제), 금일(오늘), 명일(내일) 경로이탈") private int plan = 0; - @ApiParam(value = "고도이탈",example = "전일(어제), 금일(오늘), 명일(내일) 고도이탈") +// @ApiParam(value = "고도이탈",example = "전일(어제), 금일(오늘), 명일(내일) 고도이탈") private int altitude = 0; - @ApiParam(value = "충돌",example = "전일(어제), 금일(오늘), 명일(내일) 충돌") +// @ApiParam(value = "충돌",example = "전일(어제), 금일(오늘), 명일(내일) 충돌") private int crash = 0; - @ApiParam(value = "합계",example = "전일(어제), 금일(오늘), 명일(내일) 합계") +// @ApiParam(value = "합계",example = "전일(어제), 금일(오늘), 명일(내일) 합계") private int count = 0; - @ApiParam(value = "비고",example = "전일(어제), 금일(오늘), 명일(내일) 비고") +// @ApiParam(value = "비고",example = "전일(어제), 금일(오늘), 명일(내일) 비고") private double note = 0; } 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 53d5ca9c..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 @@ -1,97 +1,97 @@ package com.palnet.biz.api.main.dash.service; -import java.time.Instant; -import java.time.temporal.ChronoUnit; -import java.util.*; -import java.util.stream.Collectors; - -import com.palnet.biz.api.acnt.jwt.model.JwtGroupModel; import com.palnet.biz.api.acnt.jwt.utils.JwtTokenUtil; import com.palnet.biz.api.bas.group.model.BasGroupModel; import com.palnet.biz.api.main.dash.model.*; import com.palnet.biz.api.main.statistics.service.MainStatisticsService; +import com.palnet.biz.jpa.entity.CtrCntrlWarnLog; import com.palnet.biz.jpa.entity.FltPlanBas; +import com.palnet.biz.jpa.entity.type.WarnType; +import com.palnet.biz.jpa.repository.ctr.CtrCntrlQueryRepository; +import com.palnet.biz.jpa.repository.ctr.CtrCntrlWarnLogQueryRepository; +import com.palnet.biz.jpa.repository.flt.FltPlanArcrftRepository; import com.palnet.biz.jpa.repository.flt.FltPlanBasRepository; -import com.palnet.biz.jpa.repository.pty.*; +import com.palnet.biz.jpa.repository.flt.FltPlanQueryRepository; +import com.palnet.biz.jpa.repository.pty.PtyDronQueryRepository; +import com.palnet.biz.jpa.repository.pty.PtyGroupQueryRepository; import com.palnet.comn.code.ErrorCode; import com.palnet.comn.exception.CustomException; -import com.querydsl.core.Tuple; - -import com.querydsl.core.BooleanBuilder; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import com.palnet.biz.jpa.entity.CtrCntrlWarnLog; -import com.palnet.biz.jpa.entity.type.WarnType; -import com.palnet.biz.jpa.repository.ctr.CtrCntrlQueryRepository; -import com.palnet.biz.jpa.repository.ctr.CtrCntrlWarnLogQueryRepository; -import com.palnet.biz.jpa.repository.flt.FltPlanArcrftRepository; -import com.palnet.biz.jpa.repository.flt.FltPlanQueryRepository; +import java.time.Instant; +import java.time.ZoneId; +import java.time.temporal.ChronoUnit; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; -@Service @Slf4j +@Service +@RequiredArgsConstructor public class MainDashService { private Logger logger = LoggerFactory.getLogger(getClass()); - @Autowired - private PtyDronQueryRepository ptyDronQueryRepository; - - @Autowired - private PtyGroupQueryRepository ptyGroupQueryRepository; - - @Autowired - private FltPlanQueryRepository fltPlanQueryRepository; - - @Autowired - private CtrCntrlWarnLogQueryRepository ctrCntrlWarnLogQueryRepository; - - @Autowired - private CtrCntrlQueryRepository query; - - @Autowired - private MainStatisticsService mainStatisticsService; - - @Autowired - private FltPlanArcrftRepository fltPlanArcrftRepository; - - @Autowired - private FltPlanBasRepository fltPlanBasRepository; - - @Autowired - private JwtTokenUtil token; + private final PtyDronQueryRepository ptyDronQueryRepository; + private final PtyGroupQueryRepository ptyGroupQueryRepository; + private final FltPlanQueryRepository fltPlanQueryRepository; + private final CtrCntrlWarnLogQueryRepository ctrCntrlWarnLogQueryRepository; + private final CtrCntrlQueryRepository query; + private final MainStatisticsService mainStatisticsService; + private final FltPlanArcrftRepository fltPlanArcrftRepository; + private final FltPlanBasRepository fltPlanBasRepository; + private final JwtTokenUtil token; /** - * 일별 비행횟수 통계 + * 일별 비행건수 통계하는 기능. * @param rq * @return */ public List mainDashStcsDay(String yyyymm){ - - List resultList = query.mainDashStcsDay(yyyymm); + + // SUPER 권한일 경우와 KAC의 기관코드일 경우 전체적으로 모니터링 가능해야한다. 그외는 자신의 기관에 해당하는 데이터 볼 수 있어야 한다. + String serviceType = ""; + String userAuthByToken = token.getUserAuthByToken(); + String cptAuthCodeByToken = token.getCptAuthCodeByToken(); + if(!"SUPER".equals(userAuthByToken) && !"KAC".equals(cptAuthCodeByToken)){ + serviceType = cptAuthCodeByToken; + } + + List resultList = query.mainDashStcsDay(yyyymm, serviceType); return resultList; } /** - * Top5 지역별 비행횟수 통계 + * Top5 지역별 비행횟수 통계기능. * @param rq * @return */ public List mainDashStcsArea(String yyyymm){ - - List resultList = query.mainDashStcsArea(yyyymm); - - + + // SUPER 권한일 경우와 KAC의 기관코드일 경우 전체적으로 모니터링 가능해야한다. 그외는 자신의 기관에 해당하는 데이터 볼 수 있어야 한다. + String serviceType = ""; + String userAuthByToken = token.getUserAuthByToken(); + String cptAuthCodeByToken = token.getCptAuthCodeByToken(); + if(!"SUPER".equals(userAuthByToken) && !"KAC".equals(cptAuthCodeByToken)){ + serviceType = cptAuthCodeByToken; + } + + List resultList = query.mainDashStcsArea(yyyymm, serviceType); + return resultList; } /** - * TOP3 가입 그룹 리스트 표출 + * TOP3 가입 그룹 리스트 조회하는 기능. + * @param cstmrSno + * @return */ public List mainDashGroupList(int cstmrSno){ @@ -108,14 +108,14 @@ public class MainDashService { } resultList = resultList.stream().sorted((o2, o1) -> o1.get("createDt").toString().compareTo(o2.get("createDt").toString())).collect(Collectors.toList()); - + return resultList; - + } /** - * Top3 기체 정보 리스트 표출 + * Top3 기체 정보 리스트 조회하는 기능. */ public List mainDashDronList(int cstmrSno){ List resultList = ptyDronQueryRepository.dronTop3(cstmrSno); @@ -124,8 +124,9 @@ public class MainDashService { /** - * 김포공항, 날짜별 통계 - * @param yyyymm + * 김포공함, 날짜별 비행실적 통계 + * @param date + * @param formatParam * @return */ public List mainKacDashStcsDay(String date, String[] formatParam){ @@ -135,40 +136,59 @@ 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; - } - - public Map mainDashDronFlightStcs() throws Exception{ - + /** + * 드론 별 비행운항 목록 조회하는 기능. + * @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) { + 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 = ""; + +// cptAuth = "KAC"; // 임시 테스트용으로 KAC 권한 부여 + +// if(cptAuth == null) { +// +// log.error("cptAuth가 부여되지 않은 계정입니다"); +// throw new Exception(); +// +// } + + // SUPER 권한일 경우와 KAC의 기관코드일 경우 전체적으로 모니터링 가능해야한다. 그외는 자신의 기관에 해당하는 데이터 볼 수 있어야 한다. + String userAuthByToken = token.getUserAuthByToken(); + String cptAuthCodeByToken = token.getCptAuthCodeByToken(); + if(!"SUPER".equals(userAuthByToken) && !"KAC".equals(cptAuthCodeByToken)){ + cptAuth = cptAuthCodeByToken; + } + + Map resultList = new HashMap<>(); resultList = fltPlanQueryRepository.getFlightDronStcs(cptAuth); @@ -176,7 +196,7 @@ public class MainDashService { return resultList; } /** - * 김포공항, 비행승인 통계 + * 김포공항, 비행승인 통계 기능. * @param yyyymm * @return */ @@ -282,18 +302,28 @@ public class MainDashService { return result; } + /** + * 일일 비행계획에 관련된 내용 통계조회하는 기능. + * @param serviceType + * @return + */ + public List currentFlightPlan(String serviceType){ +// boolean authCheck = mainStatisticsService.authCheck(groupId); - public List currentFlightPlan(String groupId){ - - boolean authCheck = mainStatisticsService.authCheck(groupId); + // SUPER 권한일 경우와 KAC의 기관코드일 경우 전체적으로 모니터링 가능해야한다. 그외는 자신의 기관에 해당하는 데이터 볼 수 있어야 한다. + String userAuthByToken = token.getUserAuthByToken(); + String cptAuthCodeByToken = token.getCptAuthCodeByToken(); + if(!"SUPER".equals(userAuthByToken) && !"KAC".equals(cptAuthCodeByToken)){ + serviceType = cptAuthCodeByToken; + } String[] dateCate = {"beforeYesterday", "yesterday", "today", "tomorrow"}; // 2일전, 전일, 금일, 명일 List result = new ArrayList<>(); for(String cate : dateCate){ - List fltPlanBas = fltPlanQueryRepository.currentFlightStcs(groupId, authCheck, cate); + List fltPlanBas = fltPlanQueryRepository.currentFlightStcs(serviceType, cate); int plan = fltPlanBas.size(); int aprvnCount = (int)fltPlanBas.stream().filter(value -> value.getAprvlYn().equals("Y")).count(); @@ -307,6 +337,7 @@ public class MainDashService { result.add(node); } + // 전날과 오늘 합계에 대한 감가율을 구함 for(int i = 0; i < result.size(); i++){ if(i == 0) continue;; @@ -328,21 +359,29 @@ public class MainDashService { return result; } - - - - public List currentFlightWarn(String groupId){ - boolean authCheck = mainStatisticsService.authCheck(groupId); - + /** + * 일일비정상상황에 대한 통계 기능을 조회하는 기능. + * @param serviceType + * @return + */ + public List currentFlightWarn(String serviceType){ +// boolean authCheck = mainStatisticsService.authCheck(groupId); + + // SUPER 권한일 경우와 KAC의 기관코드일 경우 전체적으로 모니터링 가능해야한다. 그외는 자신의 기관에 해당하는 데이터 볼 수 있어야 한다. + String userAuthByToken = token.getUserAuthByToken(); + String cptAuthCodeByToken = token.getCptAuthCodeByToken(); + if(!"SUPER".equals(userAuthByToken) && !"KAC".equals(cptAuthCodeByToken)){ + serviceType = cptAuthCodeByToken; + } String[] dateCate = {"beforeYesterday", "yesterday", "today", "tomorrow"}; // 2일전, 전일, 금일, 명일 List result = new ArrayList<>(); for(String cate : dateCate){ - List cntrlWarnLogs = ctrCntrlWarnLogQueryRepository.currentStcs(groupId, authCheck, cate); + 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(); @@ -358,6 +397,7 @@ public class MainDashService { result.add(node); } + // 전날과 오늘 합계에 대한 감가율을 구함 for(int i = 0; i < result.size(); i++){ if(i == 0) continue;; @@ -379,48 +419,79 @@ public class MainDashService { return result; } - public List dailyFlightNumOfStcs(){ - // 1. 전일 , 금일, 명일(내일) - Instant yesterdayStart = Instant.now().minus(1, ChronoUnit.DAYS).truncatedTo(ChronoUnit.DAYS); - Instant yesterdayEnd = Instant.now().truncatedTo(ChronoUnit.DAYS).minus(1, ChronoUnit.SECONDS); - Instant todayStart = Instant.now().truncatedTo(ChronoUnit.DAYS); - Instant todayEnd = Instant.now().plus(1, ChronoUnit.DAYS).minus(1, ChronoUnit.SECONDS); - Instant tomorrowStart = Instant.now().plus(1, ChronoUnit.DAYS).truncatedTo(ChronoUnit.DAYS); - Instant tomorrowEnd = Instant.now().plus(2, ChronoUnit.DAYS).minus(1, ChronoUnit.SECONDS); - - // 2. 비행계획서 승인 항목 : 비행계획서 제출기준(승인된 건수로봐도 동일) - int yesterdayCount = fltPlanBasRepository.countByAprvlYnAndAprvlDtBetween("Y", yesterdayStart, yesterdayEnd); - int todayCount = fltPlanBasRepository.countByAprvlYnAndAprvlDtBetween("Y", todayStart, todayEnd); - int tomorrowCount = fltPlanBasRepository.countByAprvlYnAndAprvlDtBetween("Y", tomorrowStart, tomorrowEnd); - - // 3. 비행 완료 항목 : 실제 비행이 완료된 건수 - int yesterdayCompleteCount = query.completeFlight(yesterdayStart,yesterdayEnd).size(); - int todayCompleteCount = query.completeFlight(todayStart,todayEnd).size(); - int tomorrowCompleteCount = query.completeFlight(tomorrowStart,tomorrowEnd).size(); - - // 4. 미 비행 항목 : 비행계획서는 제출했으나,실제 비행안한 건수 - int yesterdayNotFlight = query.notFlight(yesterdayStart,yesterdayEnd).size(); - int todayNotFlight = query.notFlight(todayStart, todayEnd).size(); - int tomorrowNotFlight = query.notFlight(tomorrowStart,tomorrowEnd).size(); - - // 5. 비고 : 비행 완료 건수를 기준으로 상승 또는 하락폭 적용 - // ex) 오늘 기준 오늘은 어제의 비행 완료 건수를 비교해서 적용 - // 전일(어제)은 2일전 비행 완료 건수를 비교해서 적용 - // 명일(내일)은 오늘 비행 완료 건수를 비교해서 적용 - int yesterdayNote = yesterdayCompleteCount - query.completeFlight(yesterdayStart.minus(1, ChronoUnit.DAYS), yesterdayEnd.minus(1, ChronoUnit.DAYS)).size(); - double yesterdayNotePercent = yesterdayCompleteCount != 0 ? ((double) yesterdayNote / yesterdayCompleteCount) * 100.0 : 0.0; - double todayNotePercent = yesterdayCompleteCount != 0 ? ((double)(todayCompleteCount - yesterdayCompleteCount) / yesterdayCompleteCount) * 100.0 : 0.0; - double tomorrowNotePercent = todayCompleteCount != 0 ? ((double) (tomorrowCompleteCount - todayCompleteCount) / todayCompleteCount) * 100.0 : 0.0; - - - - List result = new ArrayList<>(); - result.add(createModel("yesterday", yesterdayCount,yesterdayCompleteCount,yesterdayNotFlight,yesterdayNotePercent)); - result.add(createModel("today", todayCount,todayCompleteCount,todayNotFlight,todayNotePercent)); - result.add(createModel("tomorrow", tomorrowCount,tomorrowCompleteCount,tomorrowNotFlight,tomorrowNotePercent)); - - return result; - } + /** + * 일일 비행건수 현황 통계기능. + * @return + */ + public List dailyFlightNumOfStcs() { + + // SUPER 권한일 경우와 KAC의 기관코드일 경우 전체적으로 모니터링 가능해야한다. 그외는 자신의 기관에 해당하는 데이터 볼 수 있어야 한다. + String userAuthByToken = token.getUserAuthByToken(); + String cptAuthCodeByToken = token.getCptAuthCodeByToken(); + String serviceType = ""; + if (!"SUPER".equals(userAuthByToken) && !"KAC".equals(cptAuthCodeByToken)) { + serviceType = cptAuthCodeByToken; + } + + // 1. 전일 , 금일, 명일(내일) +// ZoneId zoneId = ZoneId.systemDefault(); + ZoneId zoneId = ZoneId.of("Asia/Seoul"); + Instant yesterdayStart = Instant.now().atZone(zoneId).minusDays(1).truncatedTo(ChronoUnit.DAYS).toInstant(); + Instant yesterdayEnd = Instant.now().atZone(zoneId).truncatedTo(ChronoUnit.DAYS).toInstant(); + Instant todayStart = Instant.now().atZone(zoneId).truncatedTo(ChronoUnit.DAYS).toInstant(); + Instant todayEnd = Instant.now().atZone(zoneId).plusDays(1).truncatedTo(ChronoUnit.DAYS).toInstant(); + Instant tomorrowStart = Instant.now().atZone(zoneId).plusDays(1).truncatedTo(ChronoUnit.DAYS).toInstant(); + Instant tomorrowEnd = Instant.now().atZone(zoneId).plusDays(2).truncatedTo(ChronoUnit.DAYS).toInstant(); + + // 2. 비행계획서 승인 항목 : 비행계획서 제출기준(승인된 건수로봐도 동일) + int yesterdayCount = 0; + int todayCount = 0; + int tomorrowCount = 0; + if (serviceType != null && !serviceType.isEmpty()) { + yesterdayCount = fltPlanBasRepository.countByAprvlYnAndSchFltStDtLessThanAndSchFltEndDtGreaterThanEqualAndServiceType("Y", yesterdayEnd, yesterdayStart, serviceType); + todayCount = fltPlanBasRepository.countByAprvlYnAndSchFltStDtLessThanAndSchFltEndDtGreaterThanEqualAndServiceType("Y", todayEnd, todayStart, serviceType); + tomorrowCount = fltPlanBasRepository.countByAprvlYnAndSchFltStDtLessThanAndSchFltEndDtGreaterThanEqualAndServiceType("Y", tomorrowEnd, tomorrowStart, serviceType); + } else { + yesterdayCount = fltPlanBasRepository.countByAprvlYnAndSchFltStDtLessThanAndSchFltEndDtGreaterThanEqual("Y", yesterdayEnd, yesterdayStart); + todayCount = fltPlanBasRepository.countByAprvlYnAndSchFltStDtLessThanAndSchFltEndDtGreaterThanEqual("Y", todayEnd, todayStart); + tomorrowCount = fltPlanBasRepository.countByAprvlYnAndSchFltStDtLessThanAndSchFltEndDtGreaterThanEqual("Y", tomorrowEnd, tomorrowStart); + } +// int yesterdayCount = serviceType != null && !serviceType.isEmpty() +// ? fltPlanBasRepository.countByAprvlYnAndAprvlDtBetweenAndServiceType("Y", yesterdayStart, yesterdayEnd, serviceType); +// : fltPlanBasRepository.countByAprvlYnAndAprvlDtBetween("Y", yesterdayStart, yesterdayEnd) +// int todayCount = serviceType != null && !serviceType.isEmpty() +// ? fltPlanBasRepository.countByAprvlYnAndAprvlDtBetweenAndServiceType("Y", todayStart, todayEnd, serviceType); +// : fltPlanBasRepository.countByAprvlYnAndAprvlDtBetween("Y", todayStart, todayEnd) +// int tomorrowCount = serviceType != null && !serviceType.isEmpty() +// ? fltPlanBasRepository.countByAprvlYnAndAprvlDtBetweenAndServiceType("Y", tomorrowStart, tomorrowEnd, serviceType); +// : fltPlanBasRepository.countByAprvlYnAndAprvlDtBetween("Y", tomorrowStart, tomorrowEnd) + + // 3. 비행 완료 항목 : 실제 비행이 완료된 건수 + int yesterdayCompleteCount = query.completeFlight(yesterdayStart, yesterdayEnd, serviceType).size(); + int todayCompleteCount = query.completeFlight(todayStart, todayEnd, serviceType).size(); + int tomorrowCompleteCount = query.completeFlight(tomorrowStart, tomorrowEnd, serviceType).size(); + + // 4. 미 비행 항목 : 비행계획서는 제출했으나,실제 비행안한 건수 + int yesterdayNotFlight = query.notFlight(yesterdayStart, yesterdayEnd, serviceType).size(); + int todayNotFlight = query.notFlight(todayStart, todayEnd, serviceType).size(); + int tomorrowNotFlight = query.notFlight(tomorrowStart, tomorrowEnd, serviceType).size(); + + // 5. 비고 : 비행 완료 건수를 기준으로 상승 또는 하락폭 적용 + // ex) 오늘 기준 오늘은 어제의 비행 완료 건수를 비교해서 적용 + // 전일(어제)은 2일전 비행 완료 건수를 비교해서 적용 + // 명일(내일)은 오늘 비행 완료 건수를 비교해서 적용 + int yesterdayNote = yesterdayCompleteCount - query.completeFlight(yesterdayStart.minus(1, ChronoUnit.DAYS), yesterdayEnd.minus(1, ChronoUnit.DAYS), serviceType).size(); + double yesterdayNotePercent = yesterdayCompleteCount != 0 ? ((double) yesterdayNote / yesterdayCompleteCount) * 100.0 : 0.0; + double todayNotePercent = yesterdayCompleteCount != 0 ? ((double) (todayCompleteCount - yesterdayCompleteCount) / yesterdayCompleteCount) * 100.0 : 0.0; + double tomorrowNotePercent = todayCompleteCount != 0 ? ((double) (tomorrowCompleteCount - todayCompleteCount) / todayCompleteCount) * 100.0 : 0.0; + + List result = new ArrayList<>(); + result.add(createModel("yesterday", yesterdayCount, yesterdayCompleteCount, yesterdayNotFlight, yesterdayNotePercent)); + result.add(createModel("today", todayCount, todayCompleteCount, todayNotFlight, todayNotePercent)); + result.add(createModel("tomorrow", tomorrowCount, tomorrowCompleteCount, tomorrowNotFlight, tomorrowNotePercent)); + + return result; + } private MainDashFlightNumStcsModel createModel(String dateType, int flightPlanCount, int completeCount, int notFlight, double note) { MainDashFlightNumStcsModel model = new MainDashFlightNumStcsModel(); 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 89ef0912..6bb4b8d4 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 @@ -1,7 +1,17 @@ package com.palnet.biz.api.main.statistics.controller; -import java.util.List; - +import com.palnet.biz.api.comn.response.BasicResponse; +import com.palnet.biz.api.comn.response.ErrorResponse; +import com.palnet.biz.api.comn.response.SuccessResponse; +import com.palnet.biz.api.main.statistics.model.*; +import com.palnet.biz.api.main.statistics.service.MainStatisticsService; +import com.palnet.comn.exception.CustomException; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; @@ -10,182 +20,296 @@ import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import com.palnet.biz.api.comn.response.BasicResponse; -import com.palnet.biz.api.comn.response.ErrorResponse; -import com.palnet.biz.api.comn.response.SuccessResponse; -import com.palnet.biz.api.main.statistics.model.FlightStcsValueModel; -import com.palnet.biz.api.main.statistics.model.FlightStcsModel; -import com.palnet.biz.api.main.statistics.model.FlightStcsRQ; -import com.palnet.biz.api.main.statistics.service.MainStatisticsService; - -import io.swagger.annotations.ApiImplicitParam; -import io.swagger.annotations.ApiImplicitParams; -import io.swagger.annotations.ApiOperation; -import io.swagger.v3.oas.annotations.tags.Tag; -import lombok.RequiredArgsConstructor; -import lombok.extern.log4j.Log4j2; +import java.util.HashMap; +import java.util.List; +import java.util.Map; -@Log4j2 +@Slf4j +@Tag(name = "통계 컨트롤러", description = "통계 관련 API") @RestController @RequiredArgsConstructor @RequestMapping(value = "/api/main/statistics", produces = {MediaType.APPLICATION_JSON_VALUE}) -@Tag(name = "통계 컨트롤러", description = "통계 관련 API") public class MainStatisticsController { private final MainStatisticsService service; + /** + * 비행통계 상단데이터 통계 조회기능. + * + * @param serviceType + * @return + */ + @Operation(summary = "비행 통계(총 비행시간, 총 비행거리, 총 비행횟수)", description = "비행 통계(총 비행시간, 총 비행거리, 총 비행횟수) - 상단 통계") + @ApiResponse(responseCode = "200", description = "OK") + @Parameter(name = "serviceType", description = "서비스 타입(관할기관코드)", example = "F0002") @GetMapping("/flight-static") - @ApiOperation(value = "비행통계 상단 데이터[DB전체 통계데이터]") - @Tag(name = "통계 컨트롤러", description = "통계 관련 API") - public ResponseEntity fltStcsStatic(String serviceType){ - - List result = null; - - try { - result = service.getFlightStaticStcs(serviceType); - } catch (Exception e) { - log.error("IGNORE : {}", e); - return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) - .body(new ErrorResponse("Server Error", "-1")); - } - - return ResponseEntity.ok().body(new SuccessResponse>(result)); - } - - @GetMapping("/flight/{type}") - @ApiOperation(value = "비행통계 cate = ['TIME', 'DISTANCE','FLT_COUNT'], type=['year','month','day','one-day']") - @Tag(name = "통계 컨트롤러", description = "통계 관련 API") - @ApiImplicitParams({ - @ApiImplicitParam(name = "date",value = "날짜[2023]", dataTypeClass = String.class), - @ApiImplicitParam(name = "cate",value = "비행시간,거리,횟수[TIME]", dataTypeClass = String.class), - @ApiImplicitParam(name = "type",value = "날짜형식[month]", dataTypeClass = String.class) - }) - public ResponseEntity 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); - - List graphData = service.fltStatics(rq, formatParam); - List topData = service.fltTopStatics(rq, formatParam); - - result.setGraphData(graphData); - result.setTopData(topData); - } catch (Exception e) { - log.error("IGNORE : {}", e); - return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) - .body(new ErrorResponse("Server Error", "-1")); - } - - return ResponseEntity.ok().body(new SuccessResponse(result)); - } - - - - @GetMapping("/warn-static") - @ApiOperation(value = "비정상 상황 상단 데이터[DB전체 통계데이터]") - @Tag(name = "통계 컨트롤러", description = "통계 관련 API") - public ResponseEntity warnStcsStatic(String serviceType){ - - List result = null; - - try { - result = service.getWarnStaticStcs(serviceType); - } catch (Exception e) { - log.error("IGNORE : {}", e); - return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) - .body(new ErrorResponse("Server Error", "-1")); - } - - return ResponseEntity.ok().body(new SuccessResponse>(result)); - } - - @GetMapping("/warn/{type}") - @ApiOperation(value = "비정상상황 cate = ['PLAN' ,'ALTITUDE', 'CRASH'], type=['year','month','day','one-day']") - @Tag(name = "통계 컨트롤러", description = "통계 관련 API") - @ApiImplicitParams({ - @ApiImplicitParam(name = "date",value = "날짜[2023]", dataTypeClass = String.class), - @ApiImplicitParam(name = "cate",value = "비행시간,거리,횟수[TIME]", dataTypeClass = String.class), - @ApiImplicitParam(name = "type",value = "날짜형식[month]", dataTypeClass = String.class) - }) - public ResponseEntity warnStcs(FlightStcsRQ rq, @PathVariable String type){ - - FlightStcsModel result = new FlightStcsModel(); - - try { - String[] formatParam = null; + public ResponseEntity fltStcsStatic(String serviceType) { + + List result = null; + + try { + result = service.getFlightStaticStcs(serviceType); // 비행관련 고정 통계, 항상 DB 전체값에서 통계조회 하는기능. + } catch (CustomException e) { + Map resultMap = new HashMap<>(); + log.error("IGNORE : ", e); + resultMap.put("result", false); + resultMap.put("errorCode", e.getErrorCode()); + resultMap.put("errorMessage", e.getMessage()); + return ResponseEntity.ok().body(new SuccessResponse<>(resultMap)); + } 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")); + } + + return ResponseEntity.ok().body(new SuccessResponse<>(result)); + } + + /** + * 날짜별, 타입별 비행통계 조회 기능. + * @param rq + * @param type + * @return + */ + @Operation(summary = "비행통계(비행시간, 비행시간 TOP5)", description = "비행통계(비행시간, 비행시간 TOP5)
" + + " cate = 'TIME'(시간), 'DISTANCE'(거리), 'FLT_COUNT'(횟수)
" + + " type=['year','month','day','one-day']
" + + " **type=year => date=, type=month => date=2023, type=day => date=2023-10, type=one-day => date=2023-10-01**") + @ApiResponse(responseCode = "200", description = "OK") + @GetMapping("/flight/{type}") + public ResponseEntity fltStcs( + FlightStcsByFlightRQ rq, + @Parameter(description = "년/월/일 구분값 - ['year','month','day','one-day']", example = "month") + @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); - - List graphData = service.warnStatics(rq, formatParam); - List topData = service.warnTopStatics(rq, formatParam); - - result.setGraphData(graphData); - result.setTopData(topData); - } catch (Exception e) { - log.error("IGNORE : {}", e); - return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) - .body(new ErrorResponse("Server Error", "-1")); - } - - return ResponseEntity.ok().body(new SuccessResponse(result)); - } + formatParam = service.paramCheck(rq.getDate(),type); // 파라미터 체크 - @GetMapping("/flight/result-static") - @ApiOperation(value = "비행실적 상단데이터 통계 [DB전체 통계데이터]") - @Tag(name = "통계 컨트롤러", description = "통계 관련 API") - public ResponseEntity fltResultStcs(String serviceType){ - - List result = null; - - try { - result = service.getFltResultStaticStcs(serviceType); - } catch (Exception e) { - log.error("IGNORE : {}", e); - return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) - .body(new ErrorResponse("Server Error", "-1")); - } - - return ResponseEntity.ok().body(new SuccessResponse>(result)); - } - - @GetMapping("/flight/result/{type}") - @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), - @ApiImplicitParam(name = "cate",value = "비행실적,비행계획서,비행계획승인[FLT_PLAN_APRVN]", dataTypeClass = String.class), - @ApiImplicitParam(name = "type",value = "날짜형식[month]", dataTypeClass = String.class) - }) - public ResponseEntity fltResultStcs(FlightStcsRQ rq, @PathVariable String type){ - - FlightStcsModel result = new FlightStcsModel(); - - try { - String[] formatParam = null; - - if(rq.getDate() == null) rq.setDate(""); - formatParam = service.paramCheck(rq.getDate(),type); - - List graphData = service.getFltResultStcs(rq, formatParam); - List topData = service.getFltTopResultStcs(rq, formatParam); + List graphData = service.fltStatics(rq, formatParam); // 비행통계 기능 + List topData = service.fltTopStatics(rq, formatParam); // 비행통계 카테고리 별 Top 5 데이터 조회하기 기능 result.setGraphData(graphData); result.setTopData(topData); + } catch (CustomException e) { + Map resultMap = new HashMap<>(); + log.error("IGNORE : ", e); + resultMap.put("result", false); + resultMap.put("errorCode", e.getErrorCode()); + resultMap.put("errorMessage", e.getMessage()); + return ResponseEntity.ok().body(new SuccessResponse<>(resultMap)); } 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")); } - return ResponseEntity.ok().body(new SuccessResponse(result)); - } - + return ResponseEntity.ok().body(new SuccessResponse<>(result)); + } + + /** + * 비정상 상황 상단 데이터 조회기능. + * @param serviceType + * @return + */ + @Operation(summary = "비정상 상황 통계(비행경로이탈,비정상고도,충돌위험)", description = "비정상 상황 통계(비행경로이탈,비정상고도,충돌위험) - 상단 통계") + @Parameter(name = "serviceType", description = "서비스 타입(관할기관코드)", example = "F0002") + @ApiResponse(responseCode = "200", description = "OK") + @GetMapping("/warn-static") + public ResponseEntity warnStcsStatic(String serviceType) { + + List result = null; + + try { + result = service.getWarnStaticStcs(serviceType); + } catch (CustomException e) { + Map resultMap = new HashMap<>(); + log.error("IGNORE : ", e); + resultMap.put("result", false); + resultMap.put("errorCode", e.getErrorCode()); + resultMap.put("errorMessage", e.getMessage()); + return ResponseEntity.ok().body(new SuccessResponse<>(resultMap)); + } 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")); + } + + return ResponseEntity.ok().body(new SuccessResponse<>(result)); + } + + /** + * 날짜별, 카테고리별 비정상 상황에 대한 통계 조회 기능 + * @param rq + * @param type + * @return + */ + @Operation(summary = "비정상상황 통계(비행시간, 비행시간 TOP5)", description = "비정상상황 통계(비행경로이탈 통계, 비행경로이탈 TOP5)
" + + " cate = 'PLAN'(비행경로이탈), 'ALTITUDE'(비정상고도), 'CRASH'(충돌위험)
" + + " type=['year','month','day','one-day']
" + + " **type=year => date=, type=month => date=2023, type=day => date=2023-10, type=one-day => date=2023-10-01**") + @ApiResponse(responseCode = "200", description = "OK") + @GetMapping("/warn/{type}") + public ResponseEntity warnStcs( + FlightStcsByWarnRQ rq, + @Parameter(description = "년/월/일 구분값 - ['year','month','day','one-day']", example = "month") + @PathVariable String type + ) { + + FlightStcsModel result = new FlightStcsModel(); + + try { + String[] formatParam = null; + + if (rq.getDate() == null) rq.setDate(""); + formatParam = service.paramCheck(rq.getDate(), type); + + List graphData = service.warnStatics(rq, formatParam); + List topData = service.warnTopStatics(rq, formatParam); + + result.setGraphData(graphData); + result.setTopData(topData); + } catch (CustomException e) { + Map resultMap = new HashMap<>(); + log.error("IGNORE : ", e); + resultMap.put("result", false); + resultMap.put("errorCode", e.getErrorCode()); + resultMap.put("errorMessage", e.getMessage()); + return ResponseEntity.ok().body(new SuccessResponse<>(resultMap)); + } 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")); + } + + return ResponseEntity.ok().body(new SuccessResponse<>(result)); + } + + /** + * 비행실적 상단데이터 통계 기능. + * @param serviceType + * @return + */ + @Operation(summary = "비행 실적 통계(비행실적,비행계획,비행승인)", description = "비행 실적 통계(비행실적,비행계획,비행승인) - 상단 통계") + @Parameter(name = "serviceType", description = "서비스 타입(관할기관코드)", example = "F0002") + @ApiResponse(responseCode = "200", description = "OK") + @GetMapping("/flight/result-static") + public ResponseEntity fltResultStcs(String serviceType) { + + List result = null; + + try { + result = service.getFltResultStaticStcs(serviceType); + } catch (CustomException e) { + Map resultMap = new HashMap<>(); + log.error("IGNORE : ", e); + resultMap.put("result", false); + resultMap.put("errorCode", e.getErrorCode()); + resultMap.put("errorMessage", e.getMessage()); + return ResponseEntity.ok().body(new SuccessResponse<>(resultMap)); + } 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")); + } + + return ResponseEntity.ok().body(new SuccessResponse<>(result)); + } + + /** + * 날짜별, 카테고리별 비행실적 통계 + * @param rq + * @param type + * @return + */ + @Operation(summary = "비행 실적 통계(비행 실적 통계, 비행 실적 TOP5)", description = "비행 실적 통계(비행 실적 통계, 비행 실적 TOP5)
" + + " cate = 'FLT_RESULT'(실적), 'FLT_PLAN'(계획),'FLT_PLAN_APRVN'(승인)
" + + " type=['year','month','day','one-day']
" + + " **type=year => date=, type=month => date=2023, type=day => date=2023-10, type=one-day => date=2023-10-01**") + @ApiResponse(responseCode = "200", description = "OK") + @GetMapping("/flight/result/{type}") + public ResponseEntity fltResultStcs( + FlightStcsByResultRQ rq, + @Parameter(description = "년/월/일 구분값 - ['year','month','day','one-day']", example = "month") + @PathVariable String type + ) { + + FlightStcsModel result = new FlightStcsModel(); + + try { + String[] formatParam = null; + + if (rq.getDate() == null) rq.setDate(""); + formatParam = service.paramCheck(rq.getDate(), type); + + List graphData = service.getFltResultStcs(rq, formatParam); + List topData = service.getFltTopResultStcs(rq, formatParam); + + result.setGraphData(graphData); + result.setTopData(topData); + } catch (CustomException e) { + Map resultMap = new HashMap<>(); + log.error("IGNORE : ", e); + resultMap.put("result", false); + resultMap.put("errorCode", e.getErrorCode()); + resultMap.put("errorMessage", e.getMessage()); + return ResponseEntity.ok().body(new SuccessResponse<>(resultMap)); + } 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")); + } + + return ResponseEntity.ok().body(new SuccessResponse<>(result)); + } + } diff --git a/pav-server/src/main/java/com/palnet/biz/api/main/statistics/model/FlightStcsByFlightRQ.java b/pav-server/src/main/java/com/palnet/biz/api/main/statistics/model/FlightStcsByFlightRQ.java new file mode 100644 index 00000000..5b4b325f --- /dev/null +++ b/pav-server/src/main/java/com/palnet/biz/api/main/statistics/model/FlightStcsByFlightRQ.java @@ -0,0 +1,18 @@ +package com.palnet.biz.api.main.statistics.model; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +public class FlightStcsByFlightRQ { + + @Schema(description = "카테고리 (시간,거리,횟수) - ['TIME', 'DISTANCE','FLT_COUNT']", example = "TIME") + private String cate; + + @Schema(description = "서비스 타입(관할기관코드)", example = "F0002") + private String serviceType; + + @Schema(description = "일자(type에 따른 포멧 변경 > year : -, month : yyyy, day : yyyy-MM, one-day : yyyy-MM-dd", example = "2023") + private String date; + +} diff --git a/pav-server/src/main/java/com/palnet/biz/api/main/statistics/model/FlightStcsByResultRQ.java b/pav-server/src/main/java/com/palnet/biz/api/main/statistics/model/FlightStcsByResultRQ.java new file mode 100644 index 00000000..091279d2 --- /dev/null +++ b/pav-server/src/main/java/com/palnet/biz/api/main/statistics/model/FlightStcsByResultRQ.java @@ -0,0 +1,18 @@ +package com.palnet.biz.api.main.statistics.model; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +public class FlightStcsByResultRQ { + + @Schema(description = "카테고리 (실적,계획,승인) - ['FLT_RESULT', 'FLT_PLAN','FLT_PLAN_APRVN']", example = "FLT_RESULT") + private String cate; + + @Schema(description = "서비스 타입(관할기관코드)", example = "F0002") + private String serviceType; + + @Schema(description = "일자(type에 따른 포멧 변경 > year : -, month : yyyy, day : yyyy-MM, one-day : yyyy-MM-dd", example = "2023") + private String date; + +} diff --git a/pav-server/src/main/java/com/palnet/biz/api/main/statistics/model/FlightStcsByWarnRQ.java b/pav-server/src/main/java/com/palnet/biz/api/main/statistics/model/FlightStcsByWarnRQ.java new file mode 100644 index 00000000..32919794 --- /dev/null +++ b/pav-server/src/main/java/com/palnet/biz/api/main/statistics/model/FlightStcsByWarnRQ.java @@ -0,0 +1,18 @@ +package com.palnet.biz.api.main.statistics.model; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +public class FlightStcsByWarnRQ { + + @Schema(description = "카테고리 (비행경로이탈,비정상고도,충돌위험) - ['PLAN', 'ALTITUDE','CRASH']", example = "PLAN") + private String cate; + + @Schema(description = "서비스 타입(관할기관코드)", example = "F0002") + private String serviceType; + + @Schema(description = "일자(type에 따른 포멧 변경 > year : -, month : yyyy, day : yyyy-MM, one-day : yyyy-MM-dd", example = "2023") + private String date; + +} diff --git a/pav-server/src/main/java/com/palnet/biz/api/main/statistics/model/FlightStcsRQ.java b/pav-server/src/main/java/com/palnet/biz/api/main/statistics/model/FlightStcsRQ.java deleted file mode 100644 index af468955..00000000 --- a/pav-server/src/main/java/com/palnet/biz/api/main/statistics/model/FlightStcsRQ.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.palnet.biz.api.main.statistics.model; - -import lombok.Data; - -@Data -public class FlightStcsRQ { - - private String cate; - - private String serviceType; - - private String date; - -} 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 256a32a0..2be0559e 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 @@ -1,18 +1,11 @@ package com.palnet.biz.api.main.statistics.service; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -import org.springframework.data.domain.PageImpl; -import org.springframework.data.domain.PageRequest; -import org.springframework.data.domain.Pageable; -import org.springframework.stereotype.Service; - import com.palnet.biz.api.acnt.jwt.utils.JwtTokenUtil; import com.palnet.biz.api.bas.group.model.BasGroupUserListModel; import com.palnet.biz.api.bas.group.model.BasGroupUserModel; -import com.palnet.biz.api.main.statistics.model.FlightStcsRQ; +import com.palnet.biz.api.main.statistics.model.FlightStcsByFlightRQ; +import com.palnet.biz.api.main.statistics.model.FlightStcsByResultRQ; +import com.palnet.biz.api.main.statistics.model.FlightStcsByWarnRQ; import com.palnet.biz.api.main.statistics.model.FlightStcsValueModel; import com.palnet.biz.jpa.repository.ctr.CtrCntrlQueryRepository; import com.palnet.biz.jpa.repository.ctr.CtrCntrlWarnLogQueryRepository; @@ -20,9 +13,16 @@ import com.palnet.biz.jpa.repository.flt.FltPlanQueryRepository; import com.palnet.biz.jpa.repository.pty.PtyGroupQueryRepository; import com.palnet.comn.code.ErrorCode; import com.palnet.comn.exception.CustomException; - import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; @Slf4j @Service @@ -140,13 +140,21 @@ public class MainStatisticsService { /** - * 비행관련 고정 통계, 항상 DB 전체값에서 통계진행할것임 + * 비행관련 고정 통계, 항상 DB 전체값에서 통계조회 하는기능. * @return */ public List getFlightStaticStcs(String serviceType){ // 권한이 유저권한이 user면 true, user가 아닐 경우 false; - boolean authCheck = jwtTokenUtil.getUserAuthByToken().equals("USER"); + boolean authCheck = "USER".equals(jwtTokenUtil.getUserAuthByToken()); + + // SUPER 권한일 경우와 KAC의 기관코드일 경우 전체적으로 모니터링 가능해야한다. 그외는 자신의 기관에 해당하는 데이터 볼 수 있어야 한다. + String userAuthByToken = jwtTokenUtil.getUserAuthByToken(); + String cptAuthCodeByToken = jwtTokenUtil.getCptAuthCodeByToken(); + if(!"SUPER".equals(userAuthByToken) && !"KAC".equals(cptAuthCodeByToken)){ + serviceType = cptAuthCodeByToken; + authCheck = false; + } FlightStcsValueModel time = cntrlQueryRepository.getFlightTimeStcs(authCheck, serviceType); FlightStcsValueModel distance = cntrlQueryRepository.getFlightDistanceStcs(authCheck, serviceType); @@ -159,29 +167,38 @@ public class MainStatisticsService { /** * 비행통계 - * @param idntfNum - * @param date + * + * @param rq * @param formatParam * @return */ - public List fltStatics(FlightStcsRQ rq, String[] formatParam){ + public List fltStatics(FlightStcsByFlightRQ rq, String[] formatParam){ // 권한이 유저권한이 user면 true, user가 아닐 경우 false; - boolean authCheck = jwtTokenUtil.getUserAuthByToken().equals("USER"); + boolean authCheck = jwtTokenUtil.getUserAuthByToken().equals("USER"); + + // SUPER 권한일 경우와 KAC의 기관코드일 경우 전체적으로 모니터링 가능해야한다. 그외는 자신의 기관에 해당하는 데이터 볼 수 있어야 한다. + String serviceType = rq.getServiceType(); + String userAuthByToken = jwtTokenUtil.getUserAuthByToken(); + String cptAuthCodeByToken = jwtTokenUtil.getCptAuthCodeByToken(); + if(!"SUPER".equals(userAuthByToken) && !"KAC".equals(cptAuthCodeByToken)){ + serviceType = cptAuthCodeByToken; + authCheck = false; + } List resultList = new ArrayList<>(); switch (rq.getCate()) { case "TIME": - resultList = cntrlQueryRepository.fltTimeStcs(rq.getDate(), rq.getServiceType(), authCheck, formatParam); + resultList = cntrlQueryRepository.fltTimeStcs(rq.getDate(), serviceType, authCheck, formatParam); break; case "DISTANCE": - resultList = cntrlQueryRepository.fltDistanceStcs(rq.getDate(), rq.getServiceType(), authCheck, formatParam); + resultList = cntrlQueryRepository.fltDistanceStcs(rq.getDate(), serviceType, authCheck, formatParam); break; case "FLT_COUNT": - resultList = cntrlQueryRepository.fltCountStcs(rq.getDate(), rq.getServiceType(), authCheck, formatParam); + resultList = cntrlQueryRepository.fltCountStcs(rq.getDate(), serviceType, authCheck, formatParam); break; default : @@ -198,29 +215,38 @@ public class MainStatisticsService { /** * 비행통계 카테고리 별 Top 5 데이터 가져오기 - * @param cate - * @param date + * + * @param rq * @param formatParam * @return */ - public List fltTopStatics(FlightStcsRQ rq, String[] formatParam){ + public List fltTopStatics(FlightStcsByFlightRQ rq, String[] formatParam){ // 권한이 유저권한이 user면 true, user가 아닐 경우 false; - boolean authCheck = jwtTokenUtil.getUserAuthByToken().equals("USER"); + boolean authCheck = jwtTokenUtil.getUserAuthByToken().equals("USER"); + + // SUPER 권한일 경우와 KAC의 기관코드일 경우 전체적으로 모니터링 가능해야한다. 그외는 자신의 기관에 해당하는 데이터 볼 수 있어야 한다. + String serviceType = rq.getServiceType(); + String userAuthByToken = jwtTokenUtil.getUserAuthByToken(); + String cptAuthCodeByToken = jwtTokenUtil.getCptAuthCodeByToken(); + if(!"SUPER".equals(userAuthByToken) && !"KAC".equals(cptAuthCodeByToken)){ + serviceType = cptAuthCodeByToken; + authCheck = false; + } List resultList = new ArrayList<>(); switch (rq.getCate()) { case "TIME": - resultList = cntrlQueryRepository.fltTopTimeStcs(rq.getDate(), rq.getServiceType(), authCheck, formatParam); + resultList = cntrlQueryRepository.fltTopTimeStcs(rq.getDate(), serviceType, authCheck, formatParam); break; case "DISTANCE": - resultList = cntrlQueryRepository.fltTopDistanceStcs(rq.getDate(), rq.getServiceType(), authCheck, formatParam); + resultList = cntrlQueryRepository.fltTopDistanceStcs(rq.getDate(), serviceType, authCheck, formatParam); break; case "FLT_COUNT": - resultList = cntrlQueryRepository.fltTopCountStcs(rq.getDate(), rq.getServiceType(), authCheck, formatParam); + resultList = cntrlQueryRepository.fltTopCountStcs(rq.getDate(), serviceType, authCheck, formatParam); break; default : @@ -236,13 +262,23 @@ public class MainStatisticsService { } /** - * 비행관련 고정 통계, 항상 DB 전체값에서 통계진행할것임 + * 비행관련 고정 통계, 항상 DB 전체값에서 통계진행할것임 + * + * @param serviceType * @return */ public List getWarnStaticStcs(String serviceType){ // 권한이 유저권한이 user면 true, user가 아닐 경우 false; - boolean authCheck = jwtTokenUtil.getUserAuthByToken().equals("USER"); + boolean authCheck = jwtTokenUtil.getUserAuthByToken().equals("USER"); + + // SUPER 권한일 경우와 KAC의 기관코드일 경우 전체적으로 모니터링 가능해야한다. 그외는 자신의 기관에 해당하는 데이터 볼 수 있어야 한다. + String userAuthByToken = jwtTokenUtil.getUserAuthByToken(); + String cptAuthCodeByToken = jwtTokenUtil.getCptAuthCodeByToken(); + if(!"SUPER".equals(userAuthByToken) && !"KAC".equals(cptAuthCodeByToken)){ + serviceType = cptAuthCodeByToken; + authCheck = false; + } // TODO:: 비행경로이탈, 고도이탈, 충돌위험 임시코드 String[] cate = {"PLAN" ,"ALTITUDE", "CRASH"}; @@ -264,17 +300,26 @@ public class MainStatisticsService { /** * 비정상상황 그래프 데이터 - * @param cate - * @param date + * + * @param rq * @param formatParam * @return */ - public List warnStatics(FlightStcsRQ rq, String[] formatParam){ + public List warnStatics(FlightStcsByWarnRQ rq, String[] formatParam){ // 권한이 유저권한이 user면 true, user가 아닐 경우 false; - boolean authCheck = jwtTokenUtil.getUserAuthByToken().equals("USER"); + boolean authCheck = jwtTokenUtil.getUserAuthByToken().equals("USER"); + + // SUPER 권한일 경우와 KAC의 기관코드일 경우 전체적으로 모니터링 가능해야한다. 그외는 자신의 기관에 해당하는 데이터 볼 수 있어야 한다. + String serviceType = rq.getServiceType(); + String userAuthByToken = jwtTokenUtil.getUserAuthByToken(); + String cptAuthCodeByToken = jwtTokenUtil.getCptAuthCodeByToken(); + if(!"SUPER".equals(userAuthByToken) && !"KAC".equals(cptAuthCodeByToken)){ + serviceType = cptAuthCodeByToken; + authCheck = false; + } - List resultList = ctrCntrlWarnLogQueryRepository.warnStcs(rq.getCate(), rq.getDate(), rq.getServiceType(), authCheck, formatParam); + List resultList = ctrCntrlWarnLogQueryRepository.warnStcs(rq.getCate(), rq.getDate(), serviceType, authCheck, formatParam); for(FlightStcsValueModel node : resultList){ if(node.getName() == null || node.getName().equals("")) node.setName(" "); @@ -285,29 +330,48 @@ public class MainStatisticsService { /** * 비정상상황 카테고리별 Top5 데이터 - * @param cate - * @param date + * + * @param rq * @param formatParam * @return */ - public List warnTopStatics(FlightStcsRQ rq, String[] formatParam){ + public List warnTopStatics(FlightStcsByWarnRQ rq, String[] formatParam){ // 권한이 유저권한이 user면 true, user가 아닐 경우 false; - boolean authCheck = jwtTokenUtil.getUserAuthByToken().equals("USER"); + boolean authCheck = jwtTokenUtil.getUserAuthByToken().equals("USER"); + + // SUPER 권한일 경우와 KAC의 기관코드일 경우 전체적으로 모니터링 가능해야한다. 그외는 자신의 기관에 해당하는 데이터 볼 수 있어야 한다. + String serviceType = rq.getServiceType(); + String userAuthByToken = jwtTokenUtil.getUserAuthByToken(); + String cptAuthCodeByToken = jwtTokenUtil.getCptAuthCodeByToken(); + if(!"SUPER".equals(userAuthByToken) && !"KAC".equals(cptAuthCodeByToken)){ + serviceType = cptAuthCodeByToken; + authCheck = false; + } - List resultList = ctrCntrlWarnLogQueryRepository.warnTopStcs(rq.getCate(), rq.getDate(), rq.getServiceType(), authCheck, formatParam); + List resultList = ctrCntrlWarnLogQueryRepository.warnTopStcs(rq.getCate(), rq.getDate(), serviceType, authCheck, formatParam); return resultList; } /** * 비행실적, 비행계획서 기용, 비행승인이 많이 된 기체 데이터, 상단 고정 데이터 + * + * @param serviceType * @return */ public List getFltResultStaticStcs(String serviceType){ // 권한이 유저권한이 user면 true, user가 아닐 경우 false; - boolean authCheck = jwtTokenUtil.getUserAuthByToken().equals("USER"); + boolean authCheck = jwtTokenUtil.getUserAuthByToken().equals("USER"); + + // SUPER 권한일 경우와 KAC의 기관코드일 경우 전체적으로 모니터링 가능해야한다. 그외는 자신의 기관에 해당하는 데이터 볼 수 있어야 한다. + String userAuthByToken = jwtTokenUtil.getUserAuthByToken(); + String cptAuthCodeByToken = jwtTokenUtil.getCptAuthCodeByToken(); + if(!"SUPER".equals(userAuthByToken) && !"KAC".equals(cptAuthCodeByToken)){ + serviceType = cptAuthCodeByToken; + authCheck = false; + } FlightStcsValueModel fltResult = fltPlanQueryRepository.getFltResultStaticStcs(authCheck, serviceType); FlightStcsValueModel fltPlan = fltPlanQueryRepository.getFltPlanStaticStcs(authCheck, serviceType); @@ -320,28 +384,39 @@ public class MainStatisticsService { /** * 비행실적 날짜데이터 + * * @param rq * @param formatParam * @return */ - public List getFltResultStcs(FlightStcsRQ rq, String[] formatParam){ + public List getFltResultStcs(FlightStcsByResultRQ rq, String[] formatParam){ List resultList = null; // 권한이 유저권한이 user면 true, user가 아닐 경우 false; - boolean authCheck = jwtTokenUtil.getUserAuthByToken().equals("USER"); - + boolean authCheck = jwtTokenUtil.getUserAuthByToken().equals("USER"); + + + // SUPER 권한일 경우와 KAC의 기관코드일 경우 전체적으로 모니터링 가능해야한다. 그외는 자신의 기관에 해당하는 데이터 볼 수 있어야 한다. + String serviceType = rq.getServiceType(); + String userAuthByToken = jwtTokenUtil.getUserAuthByToken(); + String cptAuthCodeByToken = jwtTokenUtil.getCptAuthCodeByToken(); + if(!"SUPER".equals(userAuthByToken) && !"KAC".equals(cptAuthCodeByToken)){ + serviceType = cptAuthCodeByToken; + authCheck = false; + } + switch (rq.getCate()) { case "FLT_RESULT": - resultList = fltPlanQueryRepository.fltResultStcs(rq.getDate(), rq.getServiceType(), authCheck, formatParam); + resultList = fltPlanQueryRepository.fltResultStcs(rq.getDate(), serviceType, authCheck, formatParam); break; case "FLT_PLAN": - resultList = fltPlanQueryRepository.fltPlanStcs(rq.getDate(), rq.getServiceType(), authCheck, formatParam); + resultList = fltPlanQueryRepository.fltPlanStcs(rq.getDate(), serviceType, authCheck, formatParam); break; case "FLT_PLAN_APRVN": - resultList = fltPlanQueryRepository.fltPlanAprvnStcs(rq.getDate(), rq.getServiceType(), authCheck, formatParam); + resultList = fltPlanQueryRepository.fltPlanAprvnStcs(rq.getDate(), serviceType, authCheck, formatParam); break; default : @@ -356,24 +431,39 @@ public class MainStatisticsService { return resultList; } - public List getFltTopResultStcs(FlightStcsRQ rq, String[] formatParam){ + /** + * 비행실적 TOP 5 기체정보 조회하는 기능. + * @param rq + * @param formatParam + * @return + */ + public List getFltTopResultStcs(FlightStcsByResultRQ rq, String[] formatParam){ List resultList = null; // 권한이 유저권한이 user면 true, user가 아닐 경우 false; - boolean authCheck = jwtTokenUtil.getUserAuthByToken().equals("USER"); + boolean authCheck = jwtTokenUtil.getUserAuthByToken().equals("USER"); + + // SUPER 권한일 경우와 KAC의 기관코드일 경우 전체적으로 모니터링 가능해야한다. 그외는 자신의 기관에 해당하는 데이터 볼 수 있어야 한다. + String serviceType = rq.getServiceType(); + String userAuthByToken = jwtTokenUtil.getUserAuthByToken(); + String cptAuthCodeByToken = jwtTokenUtil.getCptAuthCodeByToken(); + if(!"SUPER".equals(userAuthByToken) && !"KAC".equals(cptAuthCodeByToken)){ + serviceType = cptAuthCodeByToken; + authCheck = false; + } switch (rq.getCate()) { case "FLT_RESULT": - resultList = fltPlanQueryRepository.fltTopResultStcs(rq.getDate(), rq.getServiceType(), authCheck, formatParam); + resultList = fltPlanQueryRepository.fltTopResultStcs(rq.getDate(), serviceType, authCheck, formatParam); break; case "FLT_PLAN": - resultList = fltPlanQueryRepository.fltTopPlanStcs(rq.getDate(), rq.getServiceType(), authCheck, formatParam); + resultList = fltPlanQueryRepository.fltTopPlanStcs(rq.getDate(), serviceType, authCheck, formatParam); break; case "FLT_PLAN_APRVN": - resultList = fltPlanQueryRepository.fltTopPlanAprvnStcs(rq.getDate(), rq.getServiceType(), authCheck, formatParam); + resultList = fltPlanQueryRepository.fltTopPlanAprvnStcs(rq.getDate(), serviceType, authCheck, formatParam); break; default : diff --git a/pav-server/src/main/java/com/palnet/biz/config/JsonConfig.java b/pav-server/src/main/java/com/palnet/biz/config/JsonConfig.java index 4d1faefd..e580359e 100644 --- a/pav-server/src/main/java/com/palnet/biz/config/JsonConfig.java +++ b/pav-server/src/main/java/com/palnet/biz/config/JsonConfig.java @@ -9,7 +9,6 @@ import com.fasterxml.jackson.datatype.jsr310.deser.LocalTimeDeserializer; import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer; import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; import com.fasterxml.jackson.datatype.jsr310.ser.LocalTimeSerializer; -import com.palnet.biz.config.convert.InstantDateStrSerializer; import com.palnet.biz.config.convert.InstantDatetimeStrSerializer; import com.palnet.biz.config.convert.InstantStringDeserializer; import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer; @@ -55,6 +54,7 @@ public class JsonConfig { builder.featuresToDisable(DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE); builder.featuresToDisable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); builder.featuresToDisable(DeserializationFeature.FAIL_ON_IGNORED_PROPERTIES); + }; } diff --git a/pav-server/src/main/java/com/palnet/biz/config/SwaggerConfig.java b/pav-server/src/main/java/com/palnet/biz/config/SwaggerConfig.java index 70111f2e..a5dd0fa9 100644 --- a/pav-server/src/main/java/com/palnet/biz/config/SwaggerConfig.java +++ b/pav-server/src/main/java/com/palnet/biz/config/SwaggerConfig.java @@ -1,74 +1,94 @@ package com.palnet.biz.config; -import com.palnet.biz.api.comn.model.SwaggerPageable; -import io.swagger.v3.oas.models.parameters.Parameter; +import io.swagger.v3.oas.models.Components; +import io.swagger.v3.oas.models.OpenAPI; +import io.swagger.v3.oas.models.info.Info; +import io.swagger.v3.oas.models.security.SecurityRequirement; +import io.swagger.v3.oas.models.security.SecurityScheme; +import lombok.extern.slf4j.Slf4j; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.data.domain.Pageable; -import springfox.documentation.builders.ApiInfoBuilder; -import springfox.documentation.builders.PathSelectors; -import springfox.documentation.builders.RequestHandlerSelectors; -import springfox.documentation.service.ApiInfo; -import springfox.documentation.service.ApiKey; -import springfox.documentation.service.AuthorizationScope; -import springfox.documentation.service.SecurityReference; -import springfox.documentation.spi.DocumentationType; -import springfox.documentation.spi.service.contexts.SecurityContext; -import springfox.documentation.spring.web.plugins.Docket; -import springfox.documentation.swagger2.annotations.EnableSwagger2; -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.util.Arrays; -import java.util.Date; import java.util.List; +@Slf4j @Configuration -//@EnableSwagger2 public class SwaggerConfig { +// @Bean +// public Docket api() { +// return new Docket(DocumentationType.OAS_30) // open api spec 3.0 +// .apiInfo(new ApiInfoBuilder().version("1.0").title("PAV").build()) +// .forCodeGeneration(true).securitySchemes(Arrays.asList(apiKey())) +// .select() +// .apis(RequestHandlerSelectors.any()) +// .paths(PathSelectors.any()) +// .build() +// .apiInfo(apiInfo()) +// .directModelSubstitute(Date.class, String.class) +// .directModelSubstitute(LocalDate.class, String.class) +// .directModelSubstitute(LocalDateTime.class, String.class) +// .directModelSubstitute(Pageable.class, SwaggerPageable.class) +// .securityContexts(Arrays.asList(securityContext())) +// .securitySchemes(Arrays.asList(apiKey())); +// } +// +// +// private ApiInfo apiInfo() { +// return new ApiInfoBuilder() +// .title("PAV API") +// .description("----") +// .version("1.0") +// .build(); +// } +// +// //ApiKey 정의 +// private ApiKey apiKey() { +// return new ApiKey("Authorization", "Authorization", "header"); +// } +// +// //JWT SecurityContext 구성 +// private SecurityContext securityContext() { +// return SecurityContext.builder().securityReferences(defaultAuth()).build(); +// } +// +// private List defaultAuth() { +// AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEveryThing"); +// AuthorizationScope[] authorizationScopes = new AuthorizationScope[1]; +// authorizationScopes[0] = authorizationScope; +// return Arrays.asList(new SecurityReference("Authorization", authorizationScopes)); +// } + + private static final String BEARER_TOKEN_PREFIX = "palnet"; @Bean - public Docket api() { - return new Docket(DocumentationType.OAS_30) // open api spec 3.0 - .apiInfo(new ApiInfoBuilder().version("1.0").title("PAV").build()) - .forCodeGeneration(true).securitySchemes(Arrays.asList(apiKey())) - .select() - .apis(RequestHandlerSelectors.any()) - .paths(PathSelectors.any()) - .build() - .apiInfo(apiInfo()) - .directModelSubstitute(Date.class, String.class) - .directModelSubstitute(LocalDate.class, String.class) - .directModelSubstitute(LocalDateTime.class, String.class) - .directModelSubstitute(Pageable.class, SwaggerPageable.class) - .securityContexts(Arrays.asList(securityContext())) - .securitySchemes(Arrays.asList(apiKey())); - } + // 운영 환경에는 Swagger를 비활성화하기 위해 추가했습니다. +// @Profile("!Prod") + public OpenAPI openAPI() { + final String securitySchemeName = "BearerAuth"; + SecurityRequirement securityRequirement = new SecurityRequirement().addList(securitySchemeName, List.of("read", "write")); - private ApiInfo apiInfo() { - return new ApiInfoBuilder() - .title("PAV API") - .description("----") - .version("1.0") - .build(); - } + Components components = new Components() + .addSecuritySchemes(securitySchemeName, new SecurityScheme() + .type(SecurityScheme.Type.APIKEY) + .in(SecurityScheme.In.HEADER) + .name("Authorization") + .description("prefix add 'palnet ' + token") + ); - //ApiKey 정의 - private ApiKey apiKey() { - return new ApiKey("Authorization", "Authorization", "header"); - } + // Swagger UI 접속 후, 딱 한 번만 accessToken을 입력해주면 모든 API에 토큰 인증 작업이 적용됩니다. + return new OpenAPI() + .addSecurityItem(securityRequirement) + .components(components) + .info(new Info() + .title("PAV API") + .version("1.0") + .description("PAV API") + ); - //JWT SecurityContext 구성 - private SecurityContext securityContext() { - return SecurityContext.builder().securityReferences(defaultAuth()).build(); } - private List defaultAuth() { - AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEveryThing"); - AuthorizationScope[] authorizationScopes = new AuthorizationScope[1]; - authorizationScopes[0] = authorizationScope; - return Arrays.asList(new SecurityReference("Authorization", authorizationScopes)); - } + } + diff --git a/pav-server/src/main/java/com/palnet/biz/config/WebMvcConfig.java b/pav-server/src/main/java/com/palnet/biz/config/WebMvcConfig.java index e47826fd..3f845c8f 100644 --- a/pav-server/src/main/java/com/palnet/biz/config/WebMvcConfig.java +++ b/pav-server/src/main/java/com/palnet/biz/config/WebMvcConfig.java @@ -1,7 +1,6 @@ package com.palnet.biz.config; -import java.time.format.DateTimeFormatter; - +import com.palnet.biz.config.convert.CodeToFltPurposeBinding; import com.palnet.biz.config.convert.StringToInstantBinding; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -13,6 +12,8 @@ import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import org.springframework.web.servlet.resource.ResourceUrlEncodingFilter; +import java.time.format.DateTimeFormatter; + @Configuration public class WebMvcConfig implements WebMvcConfigurer{ @@ -93,6 +94,7 @@ public class WebMvcConfig implements WebMvcConfigurer{ registrar.registerFormatters(registry); registry.addConverter(new StringToInstantBinding()); + registry.addConverter(new CodeToFltPurposeBinding()); /* ISO 타입. registrar.setUseIsoFormat(true); diff --git a/pav-server/src/main/java/com/palnet/biz/config/WebSecurityConfig.java b/pav-server/src/main/java/com/palnet/biz/config/WebSecurityConfig.java index 19067c97..18795bf3 100644 --- a/pav-server/src/main/java/com/palnet/biz/config/WebSecurityConfig.java +++ b/pav-server/src/main/java/com/palnet/biz/config/WebSecurityConfig.java @@ -1,6 +1,7 @@ package com.palnet.biz.config; +import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -21,18 +22,14 @@ import com.palnet.biz.api.acnt.jwt.filter.JwtAuthenticationEntryPoint; import com.palnet.biz.api.acnt.jwt.filter.JwtRequestFilter; @Configuration +@RequiredArgsConstructor @EnableWebSecurity @EnableGlobalMethodSecurity(prePostEnabled = true) public class WebSecurityConfig extends WebSecurityConfigurerAdapter { - @Autowired - private JwtAuthenticationEntryPoint jwtAuthenticationEntryPoint; - - @Autowired - private UserDetailsService jwtUserDetailsService; - - @Autowired - private JwtRequestFilter jwtRequestFilter; + private final JwtAuthenticationEntryPoint jwtAuthenticationEntryPoint; + private final UserDetailsService jwtUserDetailsService; + private final JwtRequestFilter jwtRequestFilter; private final String[] PERMITTED_URL = { @@ -41,17 +38,27 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter { "/api/server/**", "/api/comn/file/download", "/api/comn/file/download/**", + "/api/external/laanc/**", + // TEST + "/api/v1/utm", /* swagger v2 */ "/v2/api-docs", "/swagger-resources", "/swagger-resources/**", "/configuration/ui", "/configuration/security", - "/swagger-ui.html", +// "/swagger-ui.html", "/webjars/**", /* swagger v3 */ "/v3/api-docs/**", - "/swagger-ui/**" +// "/swagger-ui/**", + /* swagger spring doc */ + "/api-docs", + "/api-docs/**", + "/swagger-ui-custom.html", + "/v3/api-docs/**", + "/swagger-ui/**", + "/swagger-ui.html" }; @Autowired diff --git a/pav-server/src/main/java/com/palnet/biz/config/convert/CodeToFltPurposeBinding.java b/pav-server/src/main/java/com/palnet/biz/config/convert/CodeToFltPurposeBinding.java new file mode 100644 index 00000000..3bca7ba3 --- /dev/null +++ b/pav-server/src/main/java/com/palnet/biz/config/convert/CodeToFltPurposeBinding.java @@ -0,0 +1,15 @@ +package com.palnet.biz.config.convert; + +import com.palnet.biz.jpa.entity.type.FltPurpose; +import lombok.extern.slf4j.Slf4j; +import org.springframework.core.convert.converter.Converter; + +@Slf4j +public class CodeToFltPurposeBinding implements Converter { + + @Override + public FltPurpose convert(String code) { + return FltPurpose.fromCode(code); + } + +} diff --git a/pav-server/src/main/java/com/palnet/biz/config/convert/InstantDatetimeStrDeserializer.java b/pav-server/src/main/java/com/palnet/biz/config/convert/InstantDatetimeStrDeserializer.java index 02da125f..b648896d 100644 --- a/pav-server/src/main/java/com/palnet/biz/config/convert/InstantDatetimeStrDeserializer.java +++ b/pav-server/src/main/java/com/palnet/biz/config/convert/InstantDatetimeStrDeserializer.java @@ -1,19 +1,15 @@ package com.palnet.biz.config.convert; -import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.DeserializationContext; import com.fasterxml.jackson.databind.JsonDeserializer; -import com.fasterxml.jackson.databind.JsonSerializer; -import com.fasterxml.jackson.databind.SerializerProvider; import lombok.extern.slf4j.Slf4j; import java.io.IOException; import java.time.Instant; import java.time.LocalDateTime; import java.time.ZoneId; -import java.time.ZoneOffset; import java.time.format.DateTimeFormatter; /** diff --git a/pav-server/src/main/java/com/palnet/biz/config/convert/InstantStringDeserializer.java b/pav-server/src/main/java/com/palnet/biz/config/convert/InstantStringDeserializer.java index c42560a9..e47e3d58 100644 --- a/pav-server/src/main/java/com/palnet/biz/config/convert/InstantStringDeserializer.java +++ b/pav-server/src/main/java/com/palnet/biz/config/convert/InstantStringDeserializer.java @@ -4,6 +4,7 @@ import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.DeserializationContext; import com.fasterxml.jackson.databind.JsonDeserializer; +import com.palnet.comn.utils.InstantUtils; import lombok.extern.slf4j.Slf4j; import java.io.IOException; @@ -45,6 +46,14 @@ public class InstantStringDeserializer extends JsonDeserializer { LocalDate localDate = LocalDate.parse(dateString, formatter); return localDate.atStartOfDay(ZoneId.of(ZONE)).toInstant(); } else { + + boolean doubleCheck = isValidDouble(dateString); + + if(doubleCheck){ + + return InstantUtils.fromDatetimeDouble(Double.parseDouble(dateString)); + } + return Instant.parse(dateString); } } catch (Exception e) { @@ -66,5 +75,20 @@ public class InstantStringDeserializer extends JsonDeserializer { } } + public boolean isValidDouble(String dateString){ + + boolean result = false; + + try{ + Double.parseDouble(dateString); + + result = true; + }catch (NumberFormatException e){ + result = false; + } + + return result; + } + } diff --git a/pav-server/src/main/java/com/palnet/biz/jpa/entity/CnsFaqBas.java b/pav-server/src/main/java/com/palnet/biz/jpa/entity/CnsFaqBas.java index 1419be44..ae9ca8a9 100644 --- a/pav-server/src/main/java/com/palnet/biz/jpa/entity/CnsFaqBas.java +++ b/pav-server/src/main/java/com/palnet/biz/jpa/entity/CnsFaqBas.java @@ -17,39 +17,50 @@ public class CnsFaqBas implements Serializable { private static final long serialVersionUID = 1L; + // FAQ일련번호 @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name="FAQ_SNO") private int faqSno; + // 카테고리 @Column(name="CATEGORY") private String category; + // 제목 @Column(name="TITLE") private String title; + // 내용 @Column(name="CONTENT") private String content; + // 조회수 @Column(name="VIEW_CNT") private int viewCnt = 0; + // 표출여부 @Column(name="EXPSR_YN") private String expsrYn = "N"; + // 삭제여부 @Column(name="DEL_YN") private String delYn = "N"; - @Column(name="CREATE_USER_ID") + // 등록사용자ID + @Column(name="CREATE_USER_ID", updatable = false) private String createUserId; + // 등록일시 @CreationTimestamp @Column(name="CREATE_DT", columnDefinition = "TIMESTAMP", updatable = false) private Instant createDt; + // 수정사용자ID @Column(name="UPDATE_USER_ID") private String updateUserId; + // 수정일시 @UpdateTimestamp @Column(name="UPDATE_DT", columnDefinition = "TIMESTAMP") private Instant updateDt; diff --git a/pav-server/src/main/java/com/palnet/biz/jpa/entity/CnsQnaBas.java b/pav-server/src/main/java/com/palnet/biz/jpa/entity/CnsQnaBas.java index 8b7743e7..bf458afa 100644 --- a/pav-server/src/main/java/com/palnet/biz/jpa/entity/CnsQnaBas.java +++ b/pav-server/src/main/java/com/palnet/biz/jpa/entity/CnsQnaBas.java @@ -16,61 +16,78 @@ public class CnsQnaBas implements Serializable { private static final long serialVersionUID = 1L; + // QNA일련번호 @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "QNA_SNO") private int qnaSno; - // 안쓸거 같음 + // 상위QNA일련번호 @Column(name = "TARGET_SNO") private int targetSno; + // 카테고리 @Column(name = "CATEGORY") private String category; + // 제목 @Column(name = "TITLE") private String title; + // 내용 @Column(name = "CONTENT") private String content; + // 연락처 @Column(name = "CONTACT") private String contact; + // 답변내용 @Column(name = "ANSER_CONTENT") private String anserContent; + // 답변자 @Column(name = "ANSER_USER_NM") private String anserUserNm; + // 답변처리일시 @Column(name = "ANSER_PROC_DT", columnDefinition = "TIMESTAMP") private Instant anserProcDt; + // 답변상태 @Column(name = "ANSER_STATUS") private String anserStatus; + // 파일그룹번호 @Column(name = "FILE_GROUP_NO") private Integer fileGroupNo; + // 표출여부 @Column(name = "EXPSR_YN") private String expsrYn = "N"; + // 삭제여부 @Column(name = "DEL_YN") private String delYn = "N"; + // 조회수 @Column(name = "VIEW_CNT") private int viewCnt = 0; + // 등록사용자ID @Column(name = "CREATE_USER_ID", updatable = false) private String createUserId; + // 등록일시 @CreationTimestamp @Column(name = "CREATE_DT", columnDefinition = "TIMESTAMP", updatable = false) private Instant createDt; + // 수정사용자ID @Column(name = "UPDATE_USER_ID") private String updateUserId; + // 수정일시 @UpdateTimestamp @Column(name = "UPDATE_DT", columnDefinition = "TIMESTAMP") private Instant updateDt; diff --git a/pav-server/src/main/java/com/palnet/biz/jpa/entity/ComAdmDistrictBas.java b/pav-server/src/main/java/com/palnet/biz/jpa/entity/ComAdmDistrictBas.java index 8eb2b74e..a96ba8f5 100644 --- a/pav-server/src/main/java/com/palnet/biz/jpa/entity/ComAdmDistrictBas.java +++ b/pav-server/src/main/java/com/palnet/biz/jpa/entity/ComAdmDistrictBas.java @@ -29,21 +29,35 @@ import javax.persistence.Table; @Table(name = "COM_ADM_DISTRICT_BAS") public class ComAdmDistrictBas { + // 행정코드 @Id @Column(name = "ADM_CD") private String admCd; + // 행정구역명 @Column(name = "ADM_SECT_NM") private String admSectNm; + // 최하위행정구역명 @Column(name = "LOWEST_ADM_SECT_NM") private String lowestAdmSectNm; + // 레벨 + @Column(name = "LEVEL") + private String level; + // 상위행정코드 + @Column(name = "UP_ADM_CD") + private String upAdmCd; + // 삭제일자 @Column(name = "DEL_YMD") private String delYmd; + // 변경전행정구역구분 @Column(name = "CHG_BEF_ADM_SECT_GBN") private String chgBefAdmSectGbn; + // 생성일자 @Column(name = "CRE_YMD") private String creYmd; + // 변경전행정구역코드 @Column(name = "CHG_BEF_ADM_SECT_CD") private String chgBefAdmSectCd; + // 원천시군구코드 @Column(name = "COL_ADM_SECT_CD") private String colAdmSectCd; diff --git a/pav-server/src/main/java/com/palnet/biz/jpa/entity/ComArcrftBas.java b/pav-server/src/main/java/com/palnet/biz/jpa/entity/ComArcrftBas.java index 309964b1..1c4fb7eb 100644 --- a/pav-server/src/main/java/com/palnet/biz/jpa/entity/ComArcrftBas.java +++ b/pav-server/src/main/java/com/palnet/biz/jpa/entity/ComArcrftBas.java @@ -18,73 +18,90 @@ import java.time.Instant; public class ComArcrftBas implements Serializable { private static final long serialVersionUID = 1L; + // 기체일련번호 @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name="ARCRFT_SNO") private int arcrftSno; - + + // 그룹ID @Column(name="GROUP_ID") private String groupId; - - @Column(name="ARCRFT_HGHT") - private double arcrftHght; - @Column(name="ARCRFT_LNGTH") - private double arcrftLngth; + // 제작번호 + @Column(name="PRDCT_NUM") + private String prdctNum; + // 기체종류코드 + @Column(name="ARCRFT_TYPE_CD") + private String arcrftTypeCd; + + // 기체모델명 @Column(name="ARCRFT_MODEL_NM") private String arcrftModelNm; - @Column(name="ARCRFT_TYPE_CD") - private String arcrftTypeCd; + // 제작자 + @Column(name="PRDCT_CMPN_NM") + private String prdctCmpnNm; + + // 제작일자 + @Column(name="PRDCT_DATE", columnDefinition = "TIMESTAMP") + private Instant prdctDate; + + // 기체길이 + @Column(name="ARCRFT_LNGTH") + private double arcrftLngth; + // 기체폭 @Column(name="ARCRFT_WDTH") private double arcrftWdth; + // 기체높이 + @Column(name="ARCRFT_HGHT") + private double arcrftHght; + + // 자체중량 @Column(name="ARCRFT_WGHT") private double arcrftWght; + // 중량구분코드 + @Column(name="WGHT_TYPE_CD") + private String wghtTypeCd; + + // 이미지URL + @Column(name="IMAGE_URL") + private String imageUrl; + + // 최대이륙중량 + @Column(name="TAKEOFF_WGHT") + private double takeoffWght; + + // 사용여부 + @Column(name="USE_YN") + private String useYn; + + // 카메라탑재여부 @Column(name="CAMERA_YN") private String cameraYn; -// @Temporal(TemporalType.TIMESTAMP) + // 보험가입여부 + @Column(name="INSRNC_YN") + private String insrncYn; + + // 등록일자 @Column(name="CREATE_DT", columnDefinition = "TIMESTAMP") private Instant createDt; + // 등록사용자ID @Column(name="CREATE_USER_ID") private String createUserId; - @Column(name="INSRNC_YN") - private String insrncYn; - - @Column(name="PRDCT_CMPN_NM") - private String prdctCmpnNm; - -// @Temporal(TemporalType.TIMESTAMP) - @Column(name="PRDCT_DATE", columnDefinition = "TIMESTAMP") - private Instant prdctDate; - - @Column(name="PRDCT_NUM") - private String prdctNum; - - @Column(name="TAKEOFF_WGHT") - private double takeoffWght; - - @Column(name="USE_YN") - private String useYn; - -// @Temporal(TemporalType.TIMESTAMP) + // 수정일자 @Column(name="UPDATE_DT", columnDefinition = "TIMESTAMP") private Instant updateDt; + // 수정사용자ID @Column(name="UPDATE_USER_ID") private String updateUserId; - - @Column(name="IMAGE_URL") - private String imageUrl; - - @Column(name="WGHT_TYPE_CD") - private String wghtTypeCd; - } \ No newline at end of file diff --git a/pav-server/src/main/java/com/palnet/biz/jpa/entity/ComAuthBas.java b/pav-server/src/main/java/com/palnet/biz/jpa/entity/ComAuthBas.java index 56dbec81..5b9fd8d3 100644 --- a/pav-server/src/main/java/com/palnet/biz/jpa/entity/ComAuthBas.java +++ b/pav-server/src/main/java/com/palnet/biz/jpa/entity/ComAuthBas.java @@ -19,35 +19,41 @@ import javax.persistence.*; public class ComAuthBas implements Serializable { private static final long serialVersionUID = 1L; + // 권한ID @Id @Column(name="AUTH_ID") private String authId; + // 사이트코드 + @Column(name="SITE_CD") + private String siteCd; + + // 권한명 @Column(name="AUTH_NM") private String authNm; -// @Temporal(TemporalType.TIMESTAMP) - @Column(name="CREATE_DT", columnDefinition = "TIMESTAMP") - private Instant createDt; - - @Column(name="CREATE_USER_ID") - private String createUserId; + // 사용여부 + @Column(name="USE_YN") + private String useYn; + // 비고 @Lob @Column(name="RM") private String rm; - @Column(name="SITE_CD") - private String siteCd; + // 생성사용자ID + @Column(name="CREATE_USER_ID") + private String createUserId; -// @Temporal(TemporalType.TIMESTAMP) + // 생성일시 + @Column(name="CREATE_DT", columnDefinition = "TIMESTAMP") + private Instant createDt; + // 수정일시 @Column(name="UPDATE_DT", columnDefinition = "TIMESTAMP") private Instant updateDt; + // 수정사용자ID @Column(name="UPDATE_USER_ID") private String updateUserId; - @Column(name="USE_YN") - private String useYn; - } \ No newline at end of file diff --git a/pav-server/src/main/java/com/palnet/biz/jpa/entity/ComCdBas.java b/pav-server/src/main/java/com/palnet/biz/jpa/entity/ComCdBas.java index e9ade5a2..ee1dcad5 100644 --- a/pav-server/src/main/java/com/palnet/biz/jpa/entity/ComCdBas.java +++ b/pav-server/src/main/java/com/palnet/biz/jpa/entity/ComCdBas.java @@ -18,33 +18,40 @@ import java.time.Instant; public class ComCdBas implements Serializable { private static final long serialVersionUID = 1L; + // 코드ID, 그룹코드 @EmbeddedId private ComCdBasPK id; + // 상위코드 + @Column(name="UPPER_CD") + private String upperCd; + + // 정렬순서 + @Column(name="SORT_ORDR") + private byte sortOrdr; + + // 추가정보값 @Column(name="ADD_INFO_VALUE") private String addInfoValue; -// @Temporal(TemporalType.TIMESTAMP) - @Column(name="CREATE_DT", columnDefinition = "TIMESTAMP") - private Instant createDt; + // 사용여부 + @Column(name="USE_YN") + private String useYn; + // 생성사용자ID @Column(name="CREATE_USER_ID") private String createUserId; - @Column(name="SORT_ORDR") - private byte sortOrdr; - -// @Temporal(TemporalType.TIMESTAMP) - @Column(name="UPDTE_DT", columnDefinition = "TIMESTAMP") - private Instant updteDt; + // 생성일시 + @Column(name="CREATE_DT", columnDefinition = "TIMESTAMP") + private Instant createDt; + // 수정사용자ID @Column(name="UPDTE_USER_ID") private String updteUserId; - @Column(name="UPPER_CD") - private String upperCd; - - @Column(name="USE_YN") - private String useYn; + // 수정일시 + @Column(name="UPDTE_DT", columnDefinition = "TIMESTAMP") + private Instant updteDt; } \ No newline at end of file diff --git a/pav-server/src/main/java/com/palnet/biz/jpa/entity/ComCdBasPK.java b/pav-server/src/main/java/com/palnet/biz/jpa/entity/ComCdBasPK.java index 59120448..52bdeee1 100644 --- a/pav-server/src/main/java/com/palnet/biz/jpa/entity/ComCdBasPK.java +++ b/pav-server/src/main/java/com/palnet/biz/jpa/entity/ComCdBasPK.java @@ -9,12 +9,13 @@ import javax.persistence.*; */ @Embeddable public class ComCdBasPK implements Serializable { - //default serial version id, required for serializable classes. private static final long serialVersionUID = 1L; + // 코드ID @Column(name="CD_ID") private String cdId; + // 그룹코드 @Column(name="GROUP_CD") private String groupCd; diff --git a/pav-server/src/main/java/com/palnet/biz/jpa/entity/ComCdGroupBas.java b/pav-server/src/main/java/com/palnet/biz/jpa/entity/ComCdGroupBas.java index fb00bbc2..0bfcf1e5 100644 --- a/pav-server/src/main/java/com/palnet/biz/jpa/entity/ComCdGroupBas.java +++ b/pav-server/src/main/java/com/palnet/biz/jpa/entity/ComCdGroupBas.java @@ -18,31 +18,38 @@ import java.time.Instant; public class ComCdGroupBas implements Serializable { private static final long serialVersionUID = 1L; + // 그룹코드 @Id @Column(name="GROUP_CD") private String groupCd; - @Column(name="CREATE_DT", columnDefinition = "TIMESTAMP") - private Instant createDt; - - @Column(name="CREATE_USER_ID") - private String createUserId; + // 사이트코드 + @Column(name="SITE_CD") + private String siteCd; + // 그룹코드명 @Column(name="GROUP_CD_NM") private String groupCdNm; + // 비고 @Lob @Column(name="RM") private String rm; - @Column(name="SITE_CD") - private String siteCd; - + // 생성사용자ID + @Column(name="CREATE_USER_ID") + private String createUserId; - @Column(name="UPDTE_DT", columnDefinition = "TIMESTAMP") - private Instant updteDt; + // 생성일시 + @Column(name="CREATE_DT", columnDefinition = "TIMESTAMP") + private Instant createDt; + // 수정사용자ID @Column(name="UPDTE_USER_ID") private String updteUserId; + // 수정일시 + @Column(name="UPDTE_DT", columnDefinition = "TIMESTAMP") + private Instant updteDt; + } \ No newline at end of file diff --git a/pav-server/src/main/java/com/palnet/biz/jpa/entity/ComCdLangCtg.java b/pav-server/src/main/java/com/palnet/biz/jpa/entity/ComCdLangCtg.java index 6baa0352..f04228b9 100644 --- a/pav-server/src/main/java/com/palnet/biz/jpa/entity/ComCdLangCtg.java +++ b/pav-server/src/main/java/com/palnet/biz/jpa/entity/ComCdLangCtg.java @@ -18,28 +18,33 @@ import javax.persistence.*; public class ComCdLangCtg implements Serializable { private static final long serialVersionUID = 1L; + // 코드ID, 그룹코드, 언어구분코드 @EmbeddedId private ComCdLangCtgPK id; + // 코드명 @Column(name="CD_NM") private String cdNm; -// @Temporal(TemporalType.TIMESTAMP) - @Column(name="CREATE_DT", columnDefinition = "TIMESTAMP") - private Instant createDt; - - @Column(name="CREATE_USER_ID") - private String createUserId; - + // 비고 @Lob @Column(name="RM") private String rm; -// @Temporal(TemporalType.TIMESTAMP) - @Column(name="UPDTE_DT", columnDefinition = "TIMESTAMP") - private Instant updteDt; + // 생성사용자ID + @Column(name="CREATE_USER_ID") + private String createUserId; + + // 생성일시 + @Column(name="CREATE_DT", columnDefinition = "TIMESTAMP") + private Instant createDt; + // 수정사용자ID @Column(name="UPDTE_USER_ID") private String updteUserId; + // 수정일시 + @Column(name="UPDTE_DT", columnDefinition = "TIMESTAMP") + private Instant updteDt; + } \ No newline at end of file diff --git a/pav-server/src/main/java/com/palnet/biz/jpa/entity/ComCdLangCtgPK.java b/pav-server/src/main/java/com/palnet/biz/jpa/entity/ComCdLangCtgPK.java index b49be52c..7a72ea6b 100644 --- a/pav-server/src/main/java/com/palnet/biz/jpa/entity/ComCdLangCtgPK.java +++ b/pav-server/src/main/java/com/palnet/biz/jpa/entity/ComCdLangCtgPK.java @@ -12,12 +12,15 @@ public class ComCdLangCtgPK implements Serializable { //default serial version id, required for serializable classes. private static final long serialVersionUID = 1L; + // 코드ID @Column(name="CD_ID") private String cdId; + // 그룹코드 @Column(name="GROUP_CD") private String groupCd; + // 언어구분코드 @Column(name="LANG_DIV_CD") private String langDivCd; diff --git a/pav-server/src/main/java/com/palnet/biz/jpa/entity/ComConfirmBas.java b/pav-server/src/main/java/com/palnet/biz/jpa/entity/ComConfirmBas.java new file mode 100644 index 00000000..d7d31a1f --- /dev/null +++ b/pav-server/src/main/java/com/palnet/biz/jpa/entity/ComConfirmBas.java @@ -0,0 +1,69 @@ +package com.palnet.biz.jpa.entity; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.hibernate.annotations.CreationTimestamp; +import org.hibernate.annotations.UpdateTimestamp; + +import javax.persistence.*; +import java.time.Instant; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Entity +@Table(name = "COM_CONFIRM_BAS") +public class ComConfirmBas { + + // 확인일련번호 + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "CONFIRM_SNO") + private Integer confirmSno; + + // 확인키 + @Column(name = "CONFIRM_KEY") + private String confirmKey; + + // 상태 + @Column(name = "STATUS") + private String status; // GENERATED, RECEIVED, CHECKED, FAILED, EXPIRED + + // 대상구분 + @Column(name = "TARGET_TYPE") + private String targetType; + + // RQ 데이터 + @Column(name = "RQ_DATA") + private String rqData; + + // RS 데이터 + @Column(name = "RS_DATA") + private String rsData; + + // 비고 + @Column(name = "RM") + private String rm; + + // 생성사용자ID + @Column(name = "CREATE_USER_ID") + private String createUserId; + + // 생성일시 + @CreationTimestamp + @Column(name = "CREATE_DT", columnDefinition = "TIMESTAMP", updatable = false) + private Instant createDt; + + // 수정사용자ID + @Column(name = "UPDATE_USER_ID") + private String updateUserId; + + // 수정일시 + @UpdateTimestamp + @Column(name = "UPDATE_DT", columnDefinition = "TIMESTAMP") + private Instant updateDt; + +} diff --git a/pav-server/src/main/java/com/palnet/biz/jpa/entity/ComFileBas.java b/pav-server/src/main/java/com/palnet/biz/jpa/entity/ComFileBas.java index f4aff75f..28823f0b 100644 --- a/pav-server/src/main/java/com/palnet/biz/jpa/entity/ComFileBas.java +++ b/pav-server/src/main/java/com/palnet/biz/jpa/entity/ComFileBas.java @@ -18,43 +18,53 @@ import java.time.Instant; public class ComFileBas implements Serializable { private static final long serialVersionUID = 1L; + // 파일일련번호 @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name="FILE_SNO") private int fileSno; + // 파일그룹번호 @Column(name="FILE_GROUP_NO") private int fileGroupNo; + // 저장된파일명 @Column(name="FILE_SAVE_NM") private String fileSaveNm; + // 실제파일명 @Column(name="FILE_ORI_NM") private String fileOriNm; + // 파일저장경로 @Column(name = "FILE_PATH") private String filePath; - + + // 파일확장명 @Column(name="FILE_EXT") private String fileExt; - -// @Temporal(TemporalType.TIMESTAMP) + + // 파일크기 @Column(name="FILE_SIZE") private String fileSize; -// @Temporal(TemporalType.TIMESTAMP) + // 삭제여부 @Column(name="DEL_YN", columnDefinition = "TIMESTAMP") private String delYn = "N"; + // 삭제사용자ID @Column(name="DEL_USER_ID") private String delUserId; + // 삭제일시 @Column(name="DEL_DT") private Instant delDt; + // 생성사용자ID @Column(name="CREATE_USER_ID") private String createUserId; + // 생성일시 @Column(name="CREATE_DT" , columnDefinition = "TIMESTAMP") private Instant createDt; diff --git a/pav-server/src/main/java/com/palnet/biz/jpa/entity/ComIdntfBas.java b/pav-server/src/main/java/com/palnet/biz/jpa/entity/ComIdntfBas.java index e4dff08f..df635fb3 100644 --- a/pav-server/src/main/java/com/palnet/biz/jpa/entity/ComIdntfBas.java +++ b/pav-server/src/main/java/com/palnet/biz/jpa/entity/ComIdntfBas.java @@ -18,30 +18,36 @@ import java.time.Instant; public class ComIdntfBas implements Serializable { private static final long serialVersionUID = 1L; + // 식별번호 @Id @Column(name="IDNTF_NUM") private String idntfNum; + // 기체일련번호 @Column(name="ARCRFT_SNO") private int arcrftSno; + // 식별장치종류코드 @Column(name="IDNTF_TYPE_CD") private String idntfTypeCd; + // 소유자명 @Column(name="OWNER_NM") private String ownerNm; + // 고객일련번호(소유자) @Column(name = "CSTMR_SNO") private Integer cstmrSno; - + + // 휴대폰번호 @Column(name="HPNO") private String hpno; - -// @Temporal(TemporalType.TIMESTAMP) + + // 등록일자 @Column(name="CREATE_DT", columnDefinition = "TIMESTAMP") private Instant createDt; -// @Temporal(TemporalType.TIMESTAMP) + // 수정일자 @Column(name="UPDATE_DT", columnDefinition = "TIMESTAMP") private Instant updateDt; diff --git a/pav-server/src/main/java/com/palnet/biz/jpa/entity/ComRiseSetBas.java b/pav-server/src/main/java/com/palnet/biz/jpa/entity/ComRiseSetBas.java index c511101f..9af89d85 100644 --- a/pav-server/src/main/java/com/palnet/biz/jpa/entity/ComRiseSetBas.java +++ b/pav-server/src/main/java/com/palnet/biz/jpa/entity/ComRiseSetBas.java @@ -3,9 +3,11 @@ package com.palnet.biz.jpa.entity; import lombok.Data; import org.hibernate.annotations.CreationTimestamp; import org.hibernate.annotations.UpdateTimestamp; -import org.springframework.data.annotation.CreatedDate; -import javax.persistence.*; +import javax.persistence.Column; +import javax.persistence.EmbeddedId; +import javax.persistence.Entity; +import javax.persistence.Table; import java.time.Instant; /** @@ -24,40 +26,74 @@ import java.time.Instant; @Table(name = "COM_RISE_SET_BAS") public class ComRiseSetBas { + // 날짜, 지역 @EmbeddedId private ComRiseSetBasPK id; + + // 경도 @Column(name = "LON") private Double lon; + + // 위도 @Column(name = "LAT") private Double lat; + + // 일출 @Column(name = "SUNRISE") private String sunrise; + + // 일증 @Column(name = "SUNTRANSIT") private String suntransit; + + // 일몰 @Column(name = "SUNSET") private String sunset; + + // 월출 @Column(name = "MOONRISE") private String moonrise; + + // 월중 @Column(name = "MOONTRANSIT") private String moontransit; + + // 월몰 @Column(name = "MOONSET") private String moonset; + + // 시민박명(아침) @Column(name = "CIVILM") private String civilm; + + // 시민박명(저녁) @Column(name = "CIVILE") private String civile; + + // 황해박명(아침) @Column(name = "NAUTM") private String nautm; + + // 황해박명(저녁) @Column(name = "NAUTE") private String naute; + + // 천문박명(아침) @Column(name = "ASTM") private String astm; + + // 춘문박명(저녁) @Column(name = "ASTE") private String aste; + + // 수정일시 @UpdateTimestamp @Column(name = "UPDATE_DT", columnDefinition = "TIMESTAMP") private Instant updateDt; + + // 등록일시 @CreationTimestamp @Column(name = "CREATE_DT", columnDefinition = "TIMESTAMP", updatable = false) private Instant createDt; + } diff --git a/pav-server/src/main/java/com/palnet/biz/jpa/entity/ComRiseSetBasPK.java b/pav-server/src/main/java/com/palnet/biz/jpa/entity/ComRiseSetBasPK.java index 2ce55b34..b2b2d004 100644 --- a/pav-server/src/main/java/com/palnet/biz/jpa/entity/ComRiseSetBasPK.java +++ b/pav-server/src/main/java/com/palnet/biz/jpa/entity/ComRiseSetBasPK.java @@ -23,8 +23,12 @@ public class ComRiseSetBasPK implements Serializable { private static final long serialVersionUID = -2002741457154908827L; + // 날짜 @Column(name="LOC_DATE") private String locDate; + + // 지역 @Column(name="LOCATION") private String location; + } diff --git a/pav-server/src/main/java/com/palnet/biz/jpa/entity/ComSiteBas.java b/pav-server/src/main/java/com/palnet/biz/jpa/entity/ComSiteBas.java index 9b17bbc2..2f7a9716 100644 --- a/pav-server/src/main/java/com/palnet/biz/jpa/entity/ComSiteBas.java +++ b/pav-server/src/main/java/com/palnet/biz/jpa/entity/ComSiteBas.java @@ -17,37 +17,45 @@ import javax.persistence.*; @Table(name="COM_SITE_BAS") @NamedQuery(name="ComSiteBas.findAll", query="SELECT c FROM ComSiteBas c") public class ComSiteBas implements Serializable { + private static final long serialVersionUID = 1L; + // 사이트코드 @Id @Column(name="SITE_CD") private String siteCd; -// @Temporal(TemporalType.TIMESTAMP) - @Column(name="CREATE_DT", columnDefinition = "TIMESTAMP") - private Instant createDt; + // 사이트경로 + @Column(name="SITE_URL") + private String siteUrl; - @Column(name="CREATE_USER_ID") - private String createUserId; + // 사이트명 + @Column(name="SITE_NM") + private String siteNm; + // 사이트설명 @Lob @Column(name="SITE_DESC") private String siteDesc; - @Column(name="SITE_NM") - private String siteNm; + // 사용여부 + @Column(name="USE_YN") + private String useYn; - @Column(name="SITE_URL") - private String siteUrl; + // 등록일자 + @Column(name="CREATE_DT", columnDefinition = "TIMESTAMP") + private Instant createDt; -// @Temporal(TemporalType.TIMESTAMP) + // 등록사용자 + @Column(name="CREATE_USER_ID") + private String createUserId; + + // 수정일자 @Column(name="UPDATE_DT", columnDefinition = "TIMESTAMP") private Instant updateDt; + // 수정사용자 @Column(name="UPDATE_USER_ID") private String updateUserId; - @Column(name="USE_YN") - private String useYn; - } \ No newline at end of file diff --git a/pav-server/src/main/java/com/palnet/biz/jpa/entity/ComTrmnlBas.java b/pav-server/src/main/java/com/palnet/biz/jpa/entity/ComTrmnlBas.java index 2d16b605..d58c54ea 100644 --- a/pav-server/src/main/java/com/palnet/biz/jpa/entity/ComTrmnlBas.java +++ b/pav-server/src/main/java/com/palnet/biz/jpa/entity/ComTrmnlBas.java @@ -18,34 +18,40 @@ import javax.persistence.*; public class ComTrmnlBas implements Serializable { private static final long serialVersionUID = 1L; + // 터미널ID @Id @Column(name="TRMNL_ID") private String trmnlId; + // 터미널명 + @Column(name="TRMNL_NM") + private String trmnlNm; + + // 인증KEY @Column(name="AUTH_KEY") private String authKey; -// @Temporal(TemporalType.TIMESTAMP) + // 터미널설명 + @Column(name="DESC_SN") + private String descSn; + + // 사용여부 + @Column(name="USE_YN") + private String useYn; + // 등록일시 @Column(name="CREATE_DT", columnDefinition = "TIMESTAMP") private Instant createDt; + // 등록사용자ID @Column(name="CREATE_USER_ID") private String createUserId; - @Column(name="DESC_SN") - private String descSn; - - @Column(name="TRMNL_NM") - private String trmnlNm; - -// @Temporal(TemporalType.TIMESTAMP) + // 수정일시 @Column(name="UPDATE_DT", columnDefinition = "TIMESTAMP") private Instant updateDt; + // 수정사용자ID @Column(name="UPDATE_USER_ID") private String updateUserId; - @Column(name="USE_YN") - private String useYn; - } \ No newline at end of file diff --git a/pav-server/src/main/java/com/palnet/biz/jpa/entity/CtrCntrlBas.java b/pav-server/src/main/java/com/palnet/biz/jpa/entity/CtrCntrlBas.java index 860959c4..e24ca004 100644 --- a/pav-server/src/main/java/com/palnet/biz/jpa/entity/CtrCntrlBas.java +++ b/pav-server/src/main/java/com/palnet/biz/jpa/entity/CtrCntrlBas.java @@ -18,69 +18,81 @@ import java.time.Instant; public class CtrCntrlBas implements Serializable { private static final long serialVersionUID = 1L; + // 관제ID @Id @Column(name="CNTRL_ID") private String cntrlId; - - @Column(name="AVRG_SPEED") - private Double avrgSpeed = 0.0; - - @Column(name="AVRG_SPEED_TYPE") - private String avrgSpeedType; - @Column(name="BTTR_CNSMPTN") - private Double bttrCnsmptn = 0.0; + // 식별번호 + @Column(name="IDNTF_NUM") + private String idntfNum; -// @Temporal(TemporalType.TIMESTAMP) - @Column(name="CNTRL_END_DT", columnDefinition = "TIMESTAMP") - private Instant cntrlEndDt; + // 상태코드 + @Column(name="STATUS_CD") + private String statusCd; -// @Temporal(TemporalType.TIMESTAMP) - @Column(name="CNTRL_ST_DT", columnDefinition = "TIMESTAMP") - private Instant cntrlStDt; + // 처리상태여부 + @Column(name="PROC_STATUS_YN") + private String procStatusYn; -// @Temporal(TemporalType.TIMESTAMP) - @Column(name="CREATE_DT", columnDefinition = "TIMESTAMP") - private Instant createDt; + // 물체타입코드 + @Column(name="OBJECT_TYPE_CD") + private String objectTypeCd; - @Column(name="END_TYPE_CD") - private String endTypeCd; + // 비행시작일시 + @Column(name="FLGHT_ST_DT", columnDefinition = "TIMESTAMP") + private Instant flghtStDt; -// @Temporal(TemporalType.TIMESTAMP) + // 비행종료일시 @Column(name="FLGHT_END_DT", columnDefinition = "TIMESTAMP") private Instant flghtEndDt; -// @Temporal(TemporalType.TIMESTAMP) - @Column(name="FLGHT_ST_DT", columnDefinition = "TIMESTAMP") - private Instant flghtStDt; + // 관제시작일시 + @Column(name="CNTRL_ST_DT", columnDefinition = "TIMESTAMP") + private Instant cntrlStDt; - @Column(name="IDNTF_NUM") - private String idntfNum; + // 관제종료일시 + @Column(name="CNTRL_END_DT", columnDefinition = "TIMESTAMP") + private Instant cntrlEndDt; - @Column(name="OBJECT_TYPE_CD") - private String objectTypeCd; + // 총비행시간 + @Column(name="TTL_TIME") + private Double ttlTime = 0.0; - @Column(name="STATUS_CD") - private String statusCd; - - @Column(name="PROC_STATUS_YN") - private String procStatusYn; + // 총비행시간단위 + @Column(name="TTL_TIME_TYPE") + private String ttlTimeType; + // 총비행거리 @Column(name="TTL_DSTNC") private Double ttlDstnc = 0.0; + // 총비행거리단위 @Column(name="TTL_DSTNC_TYPE") private String ttlDstncType; - @Column(name="TTL_TIME") - private Double ttlTime = 0.0; + // 평균속도 + @Column(name="AVRG_SPEED") + private Double avrgSpeed = 0.0; - @Column(name="TTL_TIME_TYPE") - private String ttlTimeType; + // 평균속도단위 + @Column(name="AVRG_SPEED_TYPE") + private String avrgSpeedType; + + // 배터리소모량 + @Column(name="BTTR_CNSMPTN") + private Double bttrCnsmptn = 0.0; + + // 종료타입코드 + @Column(name="END_TYPE_CD") + private String endTypeCd; + + // 생성일시 + @Column(name="CREATE_DT", columnDefinition = "TIMESTAMP") + private Instant createDt; -// @Temporal(TemporalType.TIMESTAMP) + // 수정일시 @Column(name="UPDATE_DT", columnDefinition = "TIMESTAMP") private Instant updateDt; - } \ No newline at end of file diff --git a/pav-server/src/main/java/com/palnet/biz/jpa/entity/CtrCntrlHstry.java b/pav-server/src/main/java/com/palnet/biz/jpa/entity/CtrCntrlHstry.java index 436119b2..851dd61b 100644 --- a/pav-server/src/main/java/com/palnet/biz/jpa/entity/CtrCntrlHstry.java +++ b/pav-server/src/main/java/com/palnet/biz/jpa/entity/CtrCntrlHstry.java @@ -18,73 +18,98 @@ import java.time.Instant; public class CtrCntrlHstry implements Serializable { private static final long serialVersionUID = 1L; + // 이력일련번호 @Id @GeneratedValue(strategy=GenerationType.IDENTITY) @Column(name="HSTRY_SNO") private int hstrySno; - @Column(name="BTTR_LVL") - private Double bttrLvl; - - @Column(name="BTTR_VLTG") - private Double bttrVltg; - + // 관제ID @Column(name="CNTRL_ID") private String cntrlId; - @Column(name="ELEV") - private Double elev; + // 터미널ID + @Column(name="TRMNL_ID") + private String trmnlId; - @Column(name="ELEV_TYPE") - private String elevType; + // 메시지코드 + @Column(name="MSSG_TYPE_CD") + private String mssgTypeCd; - @Column(name="HEADING") - private Double heading; + // 상태코드 + @Column(name="STATUS_CD") + private String statusCd; + // 위도 @Column(name="LAT") private Double lat; + // 경도 @Column(name="LON") private Double lon; - @Column(name="MSSG_TYPE_CD") - private String mssgTypeCd; + // 속도 + @Column(name="SPEED") + private Double speed; + // 속도단위 + @Column(name="SPEED_TYPE") + private String speedType; + + // 방향 + @Column(name="HEADING") + private Double heading; + + // 고도단위 + @Column(name="ELEV_TYPE") + private String elevType; + + // 고도 + @Column(name="ELEV") + private Double elev; + + // 이동거리 @Column(name="MV_DSTNC") private Double mvDstnc; + // 이동거리단위 @Column(name="MV_DSTNC_TYPE") private String mvDstncType; - @Column(name="SPEED") - private Double speed; - - @Column(name="SPEED_TYPE") - private String speedType; - -// @Temporal(TemporalType.TIMESTAMP) - @Column(name="SRVR_RCV_DT", columnDefinition = "TIMESTAMP") - private Instant srvrRcvDt; + // 배터리잔량 + @Column(name="BTTR_LVL") + private Double bttrLvl; - @Column(name="STATUS_CD") - private String statusCd; - - @Column(name="TRMNL_ID") - private String trmnlId; + // 배터리전압 + @Column(name="BTTR_VLTG") + private Double bttrVltg; -// @Temporal(TemporalType.TIMESTAMP) + // 단말기수신시간 @Column(name="TRMNL_RCV_DT", columnDefinition = "TIMESTAMP") private Instant trmnlRcvDt; + // 서버수신시간 + @Column(name="SRVR_RCV_DT", columnDefinition = "TIMESTAMP") + private Instant srvrRcvDt; + // 환경센서 필드 + // 일산화탄소 @Column(name="SENSOR_CO") private Double sensorCo; + + // 아황산가스 @Column(name="SENSOR_SO2") private Double sensorSo2; + + // 이산화질소 @Column(name="SENSOR_NO2") private Double sensorNo2; + + // 오존 @Column(name="SENSOR_O3") private Double sensorO3; + + // 미세먼지 @Column(name="SENSOR_DUST") private Double sensorDust; diff --git a/pav-server/src/main/java/com/palnet/biz/jpa/entity/CtrCntrlHstryArea.java b/pav-server/src/main/java/com/palnet/biz/jpa/entity/CtrCntrlHstryArea.java index 2ce80333..2e5ff300 100644 --- a/pav-server/src/main/java/com/palnet/biz/jpa/entity/CtrCntrlHstryArea.java +++ b/pav-server/src/main/java/com/palnet/biz/jpa/entity/CtrCntrlHstryArea.java @@ -18,60 +18,74 @@ import java.time.Instant; public class CtrCntrlHstryArea implements Serializable { private static final long serialVersionUID = 1L; + // 이력지역일련번호 @Id @GeneratedValue(strategy=GenerationType.IDENTITY) @Column(name="HSTRY_AREA_SNO") private int hstryAreaSno; + // 관제ID + @Column(name="CNTRL_ID") + private String cntrlId; + + // 행동구분 @Column(name="ACTN_TYPE") private String actnType; - @Column(name="AREA_NM") - private String areaNm; + // 처리여부 + @Column(name="PRCS_YN") + private String prcsYn; - @Column(name="AREA_TYPE") - private String areaType; + // 이력일련번호 + @Column(name="HSTRY_SNO") + private int hstrySno; + // 위도 + @Column(name="LAT") + private double lat; + + // 경도 + @Column(name="LON") + private double lon; + + // 시도명 @Column(name="AREA1") private String area1; + // 시군구명 @Column(name="AREA2") private String area2; + // 읍면동명 @Column(name="AREA3") private String area3; - @Column(name="CNTRL_ID") - private String cntrlId; - -// @Temporal(TemporalType.TIMESTAMP) - @Column(name="CREATE_DT", columnDefinition = "TIMESTAMP") - private Instant createDt; - - @Column(name="HSTRY_SNO") - private int hstrySno; + // 우편번호 + @Column(name="ZIP_CD") + private String zipCd; + // 도로명 @Column(name="LAND_NM") private String landNm; + // 도로번호 @Column(name="LAND_NUM") private String landNum; - @Column(name="LAT") - private double lat; + // 지역타입 + @Column(name="AREA_TYPE") + private String areaType; - @Column(name="LON") - private double lon; + // 지역명 + @Column(name="AREA_NM") + private String areaNm; - @Column(name="PRCS_YN") - private String prcsYn; + // 등록일시 + @Column(name="CREATE_DT", columnDefinition = "TIMESTAMP") + private Instant createDt; -// @Temporal(TemporalType.TIMESTAMP) + // 수정일시 @Column(name="UPDATE_DT", columnDefinition = "TIMESTAMP") private Instant updateDt; - @Column(name="ZIP_CD") - private String zipCd; - - } \ No newline at end of file diff --git a/pav-server/src/main/java/com/palnet/biz/jpa/entity/CtrCntrlWarnLog.java b/pav-server/src/main/java/com/palnet/biz/jpa/entity/CtrCntrlWarnLog.java index d48d6bf1..105a27bd 100644 --- a/pav-server/src/main/java/com/palnet/biz/jpa/entity/CtrCntrlWarnLog.java +++ b/pav-server/src/main/java/com/palnet/biz/jpa/entity/CtrCntrlWarnLog.java @@ -10,35 +10,45 @@ import java.time.Instant; @Table(name = "CTR_CNTRL_WARN_LOG") public class CtrCntrlWarnLog { + // 로그일련번호 @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "WARN_LOG_SNO") private Integer warnLogSno; + // 관제ID @Column(name = "CNTRL_ID") private String cntrlId; + // 상황종류 @Column(name = "WARN_TYPE") private String warnType; + // 식별번호 @Column(name = "IDNTF_NUM") private String idntfNum; + // 발생시간 @Column(name = "OCCUR_DT") private Instant occurDt; + // 위도 @Column(name = "LAT") private double lat; + // 경도 @Column(name = "LON") private double lon; + // 고도 @Column(name = "ELEV") private double elev; + // 등록일자 @Column(name = "CREATE_DT") private Instant createDt; + // 등록사용자ID @Column(name = "CREATE_USER_ID") private String createUserId; diff --git a/pav-server/src/main/java/com/palnet/biz/jpa/entity/FltCptAuthAdmDistrictRel.java b/pav-server/src/main/java/com/palnet/biz/jpa/entity/FltCptAuthAdmDistrictRel.java index 08b0d17f..c029ca33 100644 --- a/pav-server/src/main/java/com/palnet/biz/jpa/entity/FltCptAuthAdmDistrictRel.java +++ b/pav-server/src/main/java/com/palnet/biz/jpa/entity/FltCptAuthAdmDistrictRel.java @@ -21,12 +21,15 @@ import java.time.Instant; @Table(name = "FLT_CPT_AUTH_ADM_DISTRICT_REL") public class FltCptAuthAdmDistrictRel { + // 관할기관코드, 행정코드, 구분 @EmbeddedId private FltCptAuthAdmDistrictRelPk id; + // 수정일시 @Column(name = "UPDATE_DT", columnDefinition = "TIMESTAMP") private Instant UPDATE_DT; + // 생성일시 @Column(name = "CREATE_DT", columnDefinition = "TIMESTAMP", updatable = false) private Instant CREATE_DT; diff --git a/pav-server/src/main/java/com/palnet/biz/jpa/entity/FltCptAuthAdmDistrictRelPk.java b/pav-server/src/main/java/com/palnet/biz/jpa/entity/FltCptAuthAdmDistrictRelPk.java index f9c7c433..f5bf4330 100644 --- a/pav-server/src/main/java/com/palnet/biz/jpa/entity/FltCptAuthAdmDistrictRelPk.java +++ b/pav-server/src/main/java/com/palnet/biz/jpa/entity/FltCptAuthAdmDistrictRelPk.java @@ -23,10 +23,15 @@ public class FltCptAuthAdmDistrictRelPk implements Serializable { private static final long serialVersionUID = 5865393291038405261L; + // 관할기관코드 @Column(name = "CPT_AUTH_CODE") private String CPT_AUTH_CODE; + + // 행정코드 @Column(name = "ADM_CD") private String ADM_CD; + + // 구분 @Column(name = "TYPE") private String type; diff --git a/pav-server/src/main/java/com/palnet/biz/jpa/entity/FltCptAuthBas.java b/pav-server/src/main/java/com/palnet/biz/jpa/entity/FltCptAuthBas.java index 4df4db43..b82464c5 100644 --- a/pav-server/src/main/java/com/palnet/biz/jpa/entity/FltCptAuthBas.java +++ b/pav-server/src/main/java/com/palnet/biz/jpa/entity/FltCptAuthBas.java @@ -23,19 +23,34 @@ import java.time.Instant; @Data @Table(name = "FLT_CPT_AUTH_BAS") public class FltCptAuthBas { + + // 관할기관코드 @Id @Column(name = "CPT_AUTH_CODE") private String cptAuthCode; + + // 관할기관명 @Column(name = "CPT_AUTH_NM") private String cptAuthNm; + + // 관할기관연락처 @Column(name = "CPT_AUTH_TP") private String cptAuthTp; + + // 관할기관FAX @Column(name = "CPT_AUTH_FAX") private String cptAuthFax; + + // 비고 @Column(name = "RM") private String rm; + + // 수정일자 @Column(name = "UPDATE_DT", columnDefinition = "TIMESTAMP") private Instant updateDt; + + // 생성일자 @Column(name = "CREATE_DT", columnDefinition = "TIMESTAMP", updatable = false) private Instant createDt; + } diff --git a/pav-server/src/main/java/com/palnet/biz/jpa/entity/FltPlanArcrft.java b/pav-server/src/main/java/com/palnet/biz/jpa/entity/FltPlanArcrft.java index d581de3b..891dcd9e 100644 --- a/pav-server/src/main/java/com/palnet/biz/jpa/entity/FltPlanArcrft.java +++ b/pav-server/src/main/java/com/palnet/biz/jpa/entity/FltPlanArcrft.java @@ -16,102 +16,126 @@ import java.time.Instant; @Entity public class FltPlanArcrft { + // 비행계획기체정보일련번호 @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name="PLAN_ARCRFT_SNO") private Integer planArcrftSno; + // 비행계획서일련번호 @Column(name="PLAN_SNO") private Integer planSno; + // 기체일련번호 @Column(name="ARCRFT_SNO") private Integer arcrftSno; + // 식별번호 @Column(name="IDNTF_NUM") private String idntfNum; + // 그룹명 @Column(name="GROUP_NM") private String groupNm; + // 제작번호 @Column(name="PRDCT_NUM") private String prdctNum; + // 기체종류코드 @Convert(converter = ArcrftTypeCdConverter.class) @Column(name="ARCRFT_TYPE_CD") private ArcrftTypeCd arcrftTypeCd; + // 기체모델명 @Column(name="ARCRFT_MODEL_NM") private String arcrftModelNm; + // 제작자 @Column(name="PRDCT_CMPN_NM") private String prdctCmpnNm; + // 제작일자 @Column(name="PRDCT_DATE") private Instant prdctDate; + // 기체길이 @Column(name="ARCRFT_LNGTH") private double arcrftLngth; + // 기체폭 @Column(name="ARCRFT_WDTH") private double arcrftWdth; + // 기체높이 @Column(name="ARCRFT_HGHT") private double arcrftHght; + // 자체중량 @Column(name="ARCRFT_WGHT") private double arcrftWght; + // 자체중량코드 @Convert(converter = ArcrftWghtCdConverter.class) @Column(name="ARCRFT_WGHT_CD") private ArcrftWghtCd arcrftWghtCd; + // 중량구분코드 @Column(name="WGHT_TYPE_CD") private String wghtTypeCd; + // 이미지URL @Column(name="IMAGE_URL") private String imageUrl; + // 최대이륙중량 @Column(name="TAKEOFF_WGHT") private double takeoffWght; + // 사용여부 @Column(name="USE_YN") private String useYn; + // 카메라탑재여부 @Column(name="CAMERA_YN") private String cameraYn; + // 소유자명 + @Column(name="OWNER_NM") + private String ownerNm; + + // 보험가입여부 @Column(name="INSRNC_YN") private String insrncYn; - @Column(name="OWNER_NM") - private String ownerNm; + // 기체보험유무 + @Column(name="ACRFT_INSURANCE_YN") + private String acrftInsuranceYn; + + // 보험유효기간 + @Column(name="INSURANCE_EXPERIOD", columnDefinition = "TIMESTAMP") + private Instant insuranceExperiod; + + // 법인명 + @Column(name="CORPORATION_NM") + private String corporationNm; + // 생성사용자ID @Column(name="CREATE_USER_ID") private String createUserId; + // 생성일시 @CreationTimestamp -// @Temporal(TemporalType.TIMESTAMP) @Column(name="CREATE_DT", columnDefinition = "TIMESTAMP") private Instant createDt; + // 수정사용자ID @Column(name="UPDATE_USER_ID") private String updateUserId; + // 수정일시 @UpdateTimestamp -// @Temporal(TemporalType.TIMESTAMP) @Column(name="UPDATE_DT", columnDefinition = "TIMESTAMP") private Instant updateDt; - // pav-kac 추가 필드 - @Column(name="ACRFT_INSURANCE_YN") - private String acrftInsuranceYn; - - @Column(name="INSURANCE_EXPERIOD", columnDefinition = "TIMESTAMP") - private Instant insuranceExperiod; - - @Column(name="CORPORATION_NM") - private String corporationNm; - - - } diff --git a/pav-server/src/main/java/com/palnet/biz/jpa/entity/FltPlanArea.java b/pav-server/src/main/java/com/palnet/biz/jpa/entity/FltPlanArea.java index a4e2e8ef..fd49b9ab 100644 --- a/pav-server/src/main/java/com/palnet/biz/jpa/entity/FltPlanArea.java +++ b/pav-server/src/main/java/com/palnet/biz/jpa/entity/FltPlanArea.java @@ -14,49 +14,57 @@ import java.time.Instant; @Entity public class FltPlanArea { + // 비행계획비행구역일련번호 @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name="PLAN_AREA_SNO") private Integer planAreaSno; + // 비행계획서일련번호 @Column(name="PLAN_SNO") private Integer planSno; + // 구역종류 @Column(name = "AREA_TYPE") private String areaType; + // 비행방식 @Convert(converter = FltMethodConverter.class) @Column(name = "FLT_METHOD") private FltMethod fltMethod; + // 비행방식비고 + @Column(name="FLT_MOTHOE_RM") + private String fltMothoeRm; + + // 비행구역주소 @Column(name = "FLT_AREA_ADDR") private String fltAreaAddr; + // 버퍼존 @Column(name = "BUFFER_ZONE") private Integer bufferZone; + // 비행고도 @Column(name = "FLT_ELEV") private String fltElev; + // 생성사용자ID @Column(name = "CREATE_USER_ID") private String createUserId; + // 생성일시 @CreationTimestamp -// @Temporal(TemporalType.TIMESTAMP) @Column(name = "CREATE_DT", columnDefinition = "TIMESTAMP") private Instant createDt; + // 수정사용자ID @Column(name = "UPDATE_USER_ID") private String updateUserId; + // 수정일시 @UpdateTimestamp -// @Temporal(TemporalType.TIMESTAMP) @Column(name = "UPDATE_DT", columnDefinition = "TIMESTAMP") private Instant updateDt; - // pav-kac 추가 필드 - @Column(name="FLT_MOTHOE_RM") - private String fltMothoeRm; - - } diff --git a/pav-server/src/main/java/com/palnet/biz/jpa/entity/FltPlanAreaCoord.java b/pav-server/src/main/java/com/palnet/biz/jpa/entity/FltPlanAreaCoord.java index 49aff0f7..3fe17278 100644 --- a/pav-server/src/main/java/com/palnet/biz/jpa/entity/FltPlanAreaCoord.java +++ b/pav-server/src/main/java/com/palnet/biz/jpa/entity/FltPlanAreaCoord.java @@ -11,26 +11,31 @@ import java.time.Instant; @Entity public class FltPlanAreaCoord { + // 비행계획비행구역좌표일련번호 @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name="PLAN_AREA_COORD_SNO") private Integer planAreaCoordSno; + // 비행계획비행구역일련번호 @Column(name = "PLAN_AREA_SNO") private Integer planAreaSno; - + // 위도 @Column(name = "LON") private double lon; + // 경도 @Column(name = "LAT") private double lat; + // 생성사용자ID @Column(name = "CREATE_USER_ID") private String createUserId; + // 생성일시 @CreationTimestamp -// @Temporal(TemporalType.TIMESTAMP) @Column(name = "CREATE_DT", columnDefinition = "TIMESTAMP") private Instant createDt; + } diff --git a/pav-server/src/main/java/com/palnet/biz/jpa/entity/FltPlanBas.java b/pav-server/src/main/java/com/palnet/biz/jpa/entity/FltPlanBas.java index ac8e564f..75190a29 100644 --- a/pav-server/src/main/java/com/palnet/biz/jpa/entity/FltPlanBas.java +++ b/pav-server/src/main/java/com/palnet/biz/jpa/entity/FltPlanBas.java @@ -16,86 +16,109 @@ import java.time.Instant; @Entity public class FltPlanBas { + // 비행계획서일련번호 @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "PLAN_SNO") private Integer planSno; + // 그룹ID @Column(name = "GROUP_ID") private String groupId; + // 고객일련번호 @Column(name = "CSTMR_SNO") private Integer cstmrSno; + // 서비스구분 + @Column(name = "SERVICE_TYPE") + private String serviceType; + + // 회원이름 @Column(name = "MEMBER_NAME") private String memberName; + // 이메일 @Column(name = "EMAIL") private String email; + // 휴대폰번호 @Column(name = "HPNO") private String hpno; + // 국가전화번호 @Column(name = "CLNCD") private String clncd; + // 주소 @Column(name = "ADDR") private String addr; + // 주소상세내용 @Column(name = "ADDR_DTL_CN") private String addrDtlCn; + // 우편번호 @Column(name = "zip") private String zip; + // 예정비행시작시간 @Column(name = "SCH_FLT_ST_DT") private Instant schFltStDt; + // 예정비행종료시간 @Column(name = "SCH_FLT_END_DT") private Instant schFltEndDt; + // 비행목적 @Convert(converter = FltPurposeConverter.class) @Column(name = "FLT_PURPOSE") private FltPurpose fltPurpose; + // 비행유형 @Convert(converter = FltTypeConverter.class) @Column(name = "FLT_TYPE") private FltType fltType; + // 사업자여부 + @Column(name = "CORP_REG_YN") + private String corpRegYn; + + // 승인여부 @Column(name = "APRVL_YN") private String aprvlYn; + // 승인일시 @Column(name = "APRVL_DT") private Instant aprvlDt; + // 삭제여부 @Column(name = "DEL_YN") private String delYn; + // 파일그룹번호 @Column(name = "FILE_GROUP_NO") private Integer fileGroupNo; + // 생성사용자ID @Column(name = "CREATE_USER_ID") private String createUserId; - + // 생성일시 @CreationTimestamp -// @Temporal(TemporalType.TIMESTAMP) @Column(name = "CREATE_DT", columnDefinition = "TIMESTAMP") private Instant createDt; + // 수정사용자ID @Column(name = "UPDATE_USER_ID") private String updateUserId; + // 수정일시 @UpdateTimestamp -// @Temporal(TemporalType.TIMESTAMP) @Column(name = "UPDATE_DT", columnDefinition = "TIMESTAMP") private Instant updateDt; - // pav-kac 추가 필드 - @Column(name = "SERVICE_TYPE") - private String serviceType; - @Column(name = "CORP_REG_YN") - private String corpRegYn; + } diff --git a/pav-server/src/main/java/com/palnet/biz/jpa/entity/FltPlanCtrCntrlRel.java b/pav-server/src/main/java/com/palnet/biz/jpa/entity/FltPlanCtrCntrlRel.java index 7726fcb8..b9033b63 100644 --- a/pav-server/src/main/java/com/palnet/biz/jpa/entity/FltPlanCtrCntrlRel.java +++ b/pav-server/src/main/java/com/palnet/biz/jpa/entity/FltPlanCtrCntrlRel.java @@ -12,19 +12,24 @@ import javax.persistence.Table; @Table(name = "FLT_PLAN_CTR_CNTRL_REL") public class FltPlanCtrCntrlRel { + // 관제ID @Column(name = "CNTRL_ID") @Id private String cntrlId; - @Column(name = "IDNTF_NUM") - private String idntfNum; - + // 비행계획서일련번호 @Column(name = "PLAN_SNO") private Integer planSno; + // 식별번호 + @Column(name = "IDNTF_NUM") + private String idntfNum; + + // 그룹ID @Column(name = "GROUP_ID") private String groupId; + // 기체소유자일련번호 @Column(name = "IDNTF_CSTMR_SNO") private Integer idntfCstmrSno; diff --git a/pav-server/src/main/java/com/palnet/biz/jpa/entity/FltPlanPilot.java b/pav-server/src/main/java/com/palnet/biz/jpa/entity/FltPlanPilot.java index dc31c6a1..48608211 100644 --- a/pav-server/src/main/java/com/palnet/biz/jpa/entity/FltPlanPilot.java +++ b/pav-server/src/main/java/com/palnet/biz/jpa/entity/FltPlanPilot.java @@ -12,60 +12,75 @@ import java.time.Instant; @Entity public class FltPlanPilot { + // 비행계획조종사일련번호 @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "PLAN_PILOT_SNO") private Integer planPilotSno; + // 비행계획서일련번호 @Column(name = "PLAN_SNO") private Integer planSno; + // 고객일련번호 @Column(name = "CSTMR_SNO") private Integer cstmrSno; + // 그룹명 @Column(name = "GROUP_NM") private String groupNm; + // 회원이름 @Column(name = "MEMBER_NAME") private String memberName; + // 이메일 @Column(name = "EMAIL") private String email; + // 휴대폰번호 @Column(name = "HPNO") private String hpno; + // 국가전화번호 @Column(name = "CLNCD") private String clncd; + // 주소 @Column(name = "ADDR") private String addr; + // 주소상세내용 @Column(name = "ADDR_DTL_CN") private String addrDtlCn; + // 우편번호 @Column(name = "zip") private String zip; + // 자격번호 @Column(name = "QLFC_NO") private String qlfcNo; + // 경력 @Column(name = "CARRER") private String carrer; + // 생성사용자ID @Column(name = "CREATE_USER_ID") private String createUserId; + // 생성일시 @CreationTimestamp -// @Temporal(TemporalType.TIMESTAMP) @Column(name = "CREATE_DT", columnDefinition = "TIMESTAMP") private Instant createDt; + // 수정사용자ID @Column(name = "UPDATE_USER_ID") private String updateUserId; + // 수정일시 @UpdateTimestamp -// @Temporal(TemporalType.TIMESTAMP) @Column(name = "UPDATE_DT", columnDefinition = "TIMESTAMP") private Instant updateDt; diff --git a/pav-server/src/main/java/com/palnet/biz/jpa/entity/PtyCrtfyhpBas.java b/pav-server/src/main/java/com/palnet/biz/jpa/entity/PtyCrtfyhpBas.java index a48476ca..547afc47 100644 --- a/pav-server/src/main/java/com/palnet/biz/jpa/entity/PtyCrtfyhpBas.java +++ b/pav-server/src/main/java/com/palnet/biz/jpa/entity/PtyCrtfyhpBas.java @@ -19,24 +19,27 @@ import java.time.Instant; public class PtyCrtfyhpBas implements Serializable { private static final long serialVersionUID = 1L; + // 인증일련번호 @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name="CRTFYHP_SNO") private int crtfyhpSno; - @CreationTimestamp - @Column(name="CREATE_DT") - private Instant createDt; + // 휴대폰번호 + @Column(name="HPNO") + private String hpno; + // 인증번호 @Column(name="CRTFYHP_NO") private String crtfyhpNo; + // 인증여부 @Column(name="CRTFYHP_YN") private String crtfyhpYn; - @Column(name="HPNO") - private String hpno; - - + // 등록일자 + @CreationTimestamp + @Column(name="CREATE_DT") + private Instant createDt; } \ No newline at end of file diff --git a/pav-server/src/main/java/com/palnet/biz/jpa/entity/PtyCstmrBas.java b/pav-server/src/main/java/com/palnet/biz/jpa/entity/PtyCstmrBas.java index de62aa77..bedab7f6 100644 --- a/pav-server/src/main/java/com/palnet/biz/jpa/entity/PtyCstmrBas.java +++ b/pav-server/src/main/java/com/palnet/biz/jpa/entity/PtyCstmrBas.java @@ -20,53 +20,66 @@ import java.util.Date; public class PtyCstmrBas implements Serializable { private static final long serialVersionUID = 1L; + // 고객일련번호 @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name="CSTMR_SNO") private Integer cstmrSno; + // 권한ID @Column(name="AUTH_ID") private String authId; + // 고객구분코드 @Column(name="CSTMR_DIV_CD") private String cstmrDivCd; + // 고객상태코드 @Column(name="CSTMR_STATUS_CD") private String cstmrStatusCd; + // 고객상태변경일시 @Column(name="CSTMR_STATUS_CNG_DT", columnDefinition = "TIMESTAMP") private Instant cstmrStatusCngDt; + // 관할기관코드 @Column(name="CPT_AUTH_CODE") private String cptAuthCode; + // 사용자ID + @Column(name="USER_ID") + private String userId; + + // 가입일시 @Column(name="JOIN_DT", columnDefinition = "TIMESTAMP") private Instant joinDt; + // 가입IP주소 @Column(name="JOIN_IP") private String joinIp; - @Column(name="MEMBER_DIV_CD") - private String memberDivCd; - -// @Temporal(TemporalType.TIMESTAMP) - @Column(name="PSWD_UPDT_DT", columnDefinition = "TIMESTAMP") - private Instant pswdUpdtDt; - + // 사이트코드 @Column(name="SITE_CODE") private String siteCode; - @Column(name="USER_ID") - private String userId; + // 회원구분코드 + @Column(name="MEMBER_DIV_CD") + private String memberDivCd; + // 사용자비밀번호 @Column(name="USER_PSWD") private String userPswd; - + + // 비밀번호수정일시 + @Column(name="PSWD_UPDT_DT", columnDefinition = "TIMESTAMP") + private Instant pswdUpdtDt; + + // 재활용토큰 @Column(name="RFRSH_TOKEN") private String rfrshToken; + // 터미널ID @Column(name="TRMNL_ID") private String trmnlId; - } \ No newline at end of file diff --git a/pav-server/src/main/java/com/palnet/biz/jpa/entity/PtyCstmrConectHist.java b/pav-server/src/main/java/com/palnet/biz/jpa/entity/PtyCstmrConectHist.java index 27231c8e..50f463ab 100644 --- a/pav-server/src/main/java/com/palnet/biz/jpa/entity/PtyCstmrConectHist.java +++ b/pav-server/src/main/java/com/palnet/biz/jpa/entity/PtyCstmrConectHist.java @@ -18,25 +18,29 @@ import javax.persistence.*; public class PtyCstmrConectHist implements Serializable { private static final long serialVersionUID = 1L; + // 고객접속이력일련번호 @Id @Column(name="CSTMR_CONECT_HIST_SNO") private int cstmrConectHistSno; -// @Temporal(TemporalType.TIMESTAMP) - @Column(name="CONECT_DT", columnDefinition = "TIMESTAMP") - private Instant conectDt; + // 고객일련번호 + @Column(name="CSTMR_SNO") + private int cstmrSno; + // 접속성공여부 + @Column(name="CONECT_SUCES_YN") + private String conectSucesYn; + + // 접속오류코드 @Column(name="CONECT_ERROR_CD") private String conectErrorCd; + // 접속일시 + @Column(name="CONECT_DT", columnDefinition = "TIMESTAMP") + private Instant conectDt; + + // 접속IP주소 @Column(name="CONECT_IP") private String conectIp; - @Column(name="CONECT_SUCES_YN") - private String conectSucesYn; - - @Column(name="CSTMR_SNO") - private int cstmrSno; - - } \ No newline at end of file diff --git a/pav-server/src/main/java/com/palnet/biz/jpa/entity/PtyCstmrDtl.java b/pav-server/src/main/java/com/palnet/biz/jpa/entity/PtyCstmrDtl.java index e9b262ef..a8fae0dd 100644 --- a/pav-server/src/main/java/com/palnet/biz/jpa/entity/PtyCstmrDtl.java +++ b/pav-server/src/main/java/com/palnet/biz/jpa/entity/PtyCstmrDtl.java @@ -18,56 +18,70 @@ import java.time.Instant; public class PtyCstmrDtl implements Serializable { private static final long serialVersionUID = 1L; + // 고객일련번호 @Id @Column(name="CSTMR_SNO") private int cstmrSno; - @Column(name="ADDR") - private String addr; - - @Column(name="ADDR_DTL_CN") - private String addrDtlCn; + // 아이핀DI + @Column(name="IPIN_DI") + private String ipinDi; -// @Temporal(TemporalType.TIMESTAMP) - @Column(name="BRTHDY_DATE", columnDefinition = "TIMESTAMP") - private Instant brthdyDate; + // 아이핀CI + @Column(name="IPIN_CI") + private String ipinCi; - @Column(name="CLNCD") - private String clncd; + // 가입인증수단코드 + @Column(name="JOIN_CRTFY_CD") + private String joinCrtfyCd; + // 국가코드 @Column(name="CNTRY_CD") private String cntryCd; - @Column(name="EMAIL") - private String email; - + // 성별코드 @Column(name="GENDER_CD") private String genderCd; + // 회원이름 + @Column(name="MEMBER_NAME") + private String memberName; + + // 생일일자 + @Column(name="BRTHDY_DATE", columnDefinition = "TIMESTAMP") + private Instant brthdyDate; + + // 이메일 + @Column(name="EMAIL") + private String email; + + // 휴대폰번호 @Column(name="HPNO") private String hpno; - @Column(name="IPIN_CI") - private String ipinCi; + // 국가전화번호 + @Column(name="CLNCD") + private String clncd; - @Column(name="IPIN_DI") - private String ipinDi; + // 주소 + @Column(name="ADDR") + private String addr; - @Column(name="JOIN_CRTFY_CD") - private String joinCrtfyCd; + // 주소상세내용 + @Column(name="ADDR_DTL_CN") + private String addrDtlCn; - @Column(name="MEMBER_NAME") - private String memberName; + // 우편번호 + @Column(name="ZIP") + private String zip; -// @Temporal(TemporalType.TIMESTAMP) + // 수정일시 @Column(name="UPDATE_DT", columnDefinition = "TIMESTAMP") private Instant updateDt; + // 수정사용자ID @Column(name="UPDATE_USER_ID") private String updateUserId; - @Column(name="ZIP") - private String zip; - } \ No newline at end of file diff --git a/pav-server/src/main/java/com/palnet/biz/jpa/entity/PtyCstmrGroup.java b/pav-server/src/main/java/com/palnet/biz/jpa/entity/PtyCstmrGroup.java index b9f7e07e..00fdccd9 100644 --- a/pav-server/src/main/java/com/palnet/biz/jpa/entity/PtyCstmrGroup.java +++ b/pav-server/src/main/java/com/palnet/biz/jpa/entity/PtyCstmrGroup.java @@ -18,40 +18,48 @@ import java.time.Instant; public class PtyCstmrGroup implements Serializable { private static final long serialVersionUID = 1L; + // 고객그룹일련번호 @Id @Column(name="CSTMR_GROUP_SNO") private int cstmrGroupSno; -// @Temporal(TemporalType.TIMESTAMP) - @Column(name="APRVL_DT", columnDefinition = "TIMESTAMP") - private Instant aprvlDt; - - @Column(name="APRVL_USER_ID") - private String aprvlUserId; - - @Column(name="APRVL_YN") - private String aprvlYn; - + // 고객일련번호 @Column(name="CSTMR_SNO") private int cstmrSno; + // 그룹ID + @Column(name="GROUP_ID") + private String groupId; + + // 그룹참여권한코드 @Column(name="GROUP_AUTH_CD") private String groupAuthCd; - @Column(name="GROUP_ID") - private String groupId; + // 승인여부 + @Column(name="APRVL_YN") + private String aprvlYn; -// @Temporal(TemporalType.TIMESTAMP) - @Column(name="JOIN_DT", columnDefinition = "TIMESTAMP") - private Instant joinDt; + // 승인사용자 + @Column(name="APRVL_USER_ID") + private String aprvlUserId; + // 승인일자 + @Column(name="APRVL_DT", columnDefinition = "TIMESTAMP") + private Instant aprvlDt; + + // 참여여부 @Column(name="JOIN_YN") private String joinYn; -// @Temporal(TemporalType.TIMESTAMP) + // 참여일시 + @Column(name="JOIN_DT", columnDefinition = "TIMESTAMP") + private Instant joinDt; + + // 탈퇴일시 @Column(name="WTHDRW_DT", columnDefinition = "TIMESTAMP") private Instant wthdrwDt; + // 터미널ID @Column(name="TRMNL_ID") private String trmnlId; diff --git a/pav-server/src/main/java/com/palnet/biz/jpa/entity/PtyGroupBas.java b/pav-server/src/main/java/com/palnet/biz/jpa/entity/PtyGroupBas.java index c50c59a4..928a6135 100644 --- a/pav-server/src/main/java/com/palnet/biz/jpa/entity/PtyGroupBas.java +++ b/pav-server/src/main/java/com/palnet/biz/jpa/entity/PtyGroupBas.java @@ -16,29 +16,37 @@ import java.time.Instant; @Table(name="PTY_GROUP_BAS") @NamedQuery(name="PtyGroupBas.findAll", query="SELECT p FROM PtyGroupBas p") public class PtyGroupBas implements Serializable { + private static final long serialVersionUID = 1L; + + // 그룹ID @Id @Column(name="GROUP_ID") private String groupId; -// @Temporal(TemporalType.TIMESTAMP) - @Column(name="CREATE_DT", columnDefinition = "TIMESTAMP") - private Instant createDt; - + // 그룹명 @Column(name="GROUP_NM") private String groupNm; + // 그룹구분코드 @Column(name="GROUP_TYPE_CD") private String groupTypeCd; -// @Temporal(TemporalType.TIMESTAMP) - @Column(name="UPDATE_DT", columnDefinition = "TIMESTAMP") - private Instant updateDt; + // 터미널ID + @Column(name="TRMNL_ID") + private String trmnlId; + // 사용여부 @Column(name="USE_YN") private String useYn; - @Column(name="TRMNL_ID") - private String trmnlId; + // 등록일시 + @Column(name="CREATE_DT", columnDefinition = "TIMESTAMP") + private Instant createDt; + + // 수정일시 + @Column(name="UPDATE_DT", columnDefinition = "TIMESTAMP") + private Instant updateDt; + } \ No newline at end of file diff --git a/pav-server/src/main/java/com/palnet/biz/jpa/entity/PtySnsLoginRel.java b/pav-server/src/main/java/com/palnet/biz/jpa/entity/PtySnsLoginRel.java index 268f780d..f5036cf4 100644 --- a/pav-server/src/main/java/com/palnet/biz/jpa/entity/PtySnsLoginRel.java +++ b/pav-server/src/main/java/com/palnet/biz/jpa/entity/PtySnsLoginRel.java @@ -16,34 +16,40 @@ import java.time.Instant; @Table(name="PTY_SNS_LOGIN_REL") @NamedQuery(name="PtySnsLoginRel.findAll", query="SELECT p FROM PtySnsLoginRel p") public class PtySnsLoginRel implements Serializable { + private static final long serialVersionUID = 1L; + // SNS로그인일련번호 @Id @Column(name="SNS_LOGIN_SNO") private int snsLoginSno; + // 고객일련번호 @Column(name="CSTMR_SNO") private int cstmrSno; -// @Temporal(TemporalType.TIMESTAMP) - @Column(name="LINK_DT", columnDefinition = "TIMESTAMP") - private Instant linkDt; + // SNS식별자ID + @Column(name="SNS_IDNTFR_ID") + private String snsIdntfrId; - @Column(name="LINK_IP") - private String linkIp; + // SNS코드 + @Column(name="SNS_CD") + private String snsCd; + // 연결여부 @Column(name="LINK_YN") private String linkYn; - @Column(name="SNS_CD") - private String snsCd; - - @Column(name="SNS_IDNTFR_ID") - private String snsIdntfrId; + // 연결일시 + @Column(name="LINK_DT", columnDefinition = "TIMESTAMP") + private Instant linkDt; -// @Temporal(TemporalType.TIMESTAMP) + // 탈퇴일시 @Column(name="WTHDR_DT", columnDefinition = "TIMESTAMP") private Instant wthdrDt; + // 연결IP주소 + @Column(name="LINK_IP") + private String linkIp; } \ No newline at end of file diff --git a/pav-server/src/main/java/com/palnet/biz/jpa/entity/PtyTermsAgreeTxn.java b/pav-server/src/main/java/com/palnet/biz/jpa/entity/PtyTermsAgreeTxn.java index b6c5fc2d..95192fae 100644 --- a/pav-server/src/main/java/com/palnet/biz/jpa/entity/PtyTermsAgreeTxn.java +++ b/pav-server/src/main/java/com/palnet/biz/jpa/entity/PtyTermsAgreeTxn.java @@ -23,31 +23,37 @@ import java.time.Instant; public class PtyTermsAgreeTxn implements Serializable { private static final long serialVersionUID = 1L; + // 동의일련번호 @Id @Column(name = "AGREE_SNO") @GeneratedValue(strategy = GenerationType.IDENTITY) private int agreeSno; - // @Temporal(TemporalType.TIMESTAMP) - @Column(name = "AGREE_DT", columnDefinition = "TIMESTAMP") - private Instant agreeDt; + // 약관일련번호 + @Column(name = "TERMS_SNO") + private int termsSno; + + // 고객일련번호 + @Column(name = "CSTMR_SNO") + private int cstmrSno; + // 동의여부 @Column(name = "AGREE_YN") private String agreeYn; - @Column(name = "CSTMR_SNO") - private int cstmrSno; + // 동의일시 + @Column(name = "AGREE_DT", columnDefinition = "TIMESTAMP") + private Instant agreeDt; + // 처리IP주소 @Column(name = "PROC_IP") private String procIp; - @Column(name = "TERMS_SNO") - private int termsSno; - - // @Temporal(TemporalType.TIMESTAMP) + // 수정일시 @Column(name = "UPDATE_DT", columnDefinition = "TIMESTAMP") private Instant updateDt; + // 수정사용자ID @Column(name = "UPDATE_USER_ID") private String updateUserId; diff --git a/pav-server/src/main/java/com/palnet/biz/jpa/entity/PtyTermsBas.java b/pav-server/src/main/java/com/palnet/biz/jpa/entity/PtyTermsBas.java index 1abe7726..fd644a0e 100644 --- a/pav-server/src/main/java/com/palnet/biz/jpa/entity/PtyTermsBas.java +++ b/pav-server/src/main/java/com/palnet/biz/jpa/entity/PtyTermsBas.java @@ -16,37 +16,44 @@ import java.time.Instant; @Table(name="PTY_TERMS_BAS") @NamedQuery(name="PtyTermsBas.findAll", query="SELECT p FROM PtyTermsBas p") public class PtyTermsBas implements Serializable { + private static final long serialVersionUID = 1L; + // 약관일련번호 @Id @Column(name="TERMS_SNO") private int termsSno; - - @Column(name="CREATE_DT", columnDefinition = "TIMESTAMP") - private Instant createDt; - - @Column(name="CREATE_USER_ID") - private String createUserId; - - - @Column(name="ESTBSH_DATE", columnDefinition = "TIMESTAMP") - private Instant estbshDate; - + // 최종내역여부 @Column(name="LAST_TXN_YN") private String lastTxnYn; + // 사이트코드 @Column(name="SITE_CD") private String siteCd; + // 제정일자 + @Column(name="ESTBSH_DATE", columnDefinition = "TIMESTAMP") + private Instant estbshDate; + + // 약관카테고리코드 @Column(name="TERMS_CTGRY_CD") private String termsCtgryCd; + // 생성사용자ID + @Column(name="CREATE_USER_ID") + private String createUserId; - @Column(name="UPDATE_DT", columnDefinition = "TIMESTAMP") - private Instant updateDt; + // 생성일시 + @Column(name="CREATE_DT", columnDefinition = "TIMESTAMP") + private Instant createDt; + // 수정사용자ID @Column(name="UPDATE_USER_ID") private String updateUserId; + // 수정일시 + @Column(name="UPDATE_DT", columnDefinition = "TIMESTAMP") + private Instant updateDt; + } \ No newline at end of file diff --git a/pav-server/src/main/java/com/palnet/biz/jpa/entity/PtyTermsDtl.java b/pav-server/src/main/java/com/palnet/biz/jpa/entity/PtyTermsDtl.java index fe6a1142..947c8826 100644 --- a/pav-server/src/main/java/com/palnet/biz/jpa/entity/PtyTermsDtl.java +++ b/pav-server/src/main/java/com/palnet/biz/jpa/entity/PtyTermsDtl.java @@ -18,29 +18,43 @@ import java.time.Instant; public class PtyTermsDtl implements Serializable { private static final long serialVersionUID = 1L; + // 약관일련번호, 언어구분코드 @EmbeddedId private PtyTermsDtlPK id; -// @Temporal(TemporalType.TIMESTAMP) - @Column(name="CREATE_DT", columnDefinition = "TIMESTAMP") - private Instant createDt; - - @Column(name="CREATE_USER_ID") - private String createUserId; + // 약관제목명 + @Column(name="TERMS_TITLE_NM") + private String termsTitleNm; + // 약관내용 @Lob - @Column(name="RM") - private String rm; + @Column(name="TERMS_CN") + private String termsCn; + // 간략내용 @Lob @Column(name="SIMPLE_CN") private String simpleCn; + // 비고 @Lob - @Column(name="TERMS_CN") - private String termsCn; + @Column(name="RM") + private String rm; + + // 생성사용자ID + @Column(name="CREATE_USER_ID") + private String createUserId; + + // 생성일시 + @Column(name="CREATE_DT", columnDefinition = "TIMESTAMP") + private Instant createDt; + + + + + + + - @Column(name="TERMS_TITLE_NM") - private String termsTitleNm; } \ No newline at end of file diff --git a/pav-server/src/main/java/com/palnet/biz/jpa/entity/PtyTermsDtlPK.java b/pav-server/src/main/java/com/palnet/biz/jpa/entity/PtyTermsDtlPK.java index b0f81e2e..a70b1cbf 100644 --- a/pav-server/src/main/java/com/palnet/biz/jpa/entity/PtyTermsDtlPK.java +++ b/pav-server/src/main/java/com/palnet/biz/jpa/entity/PtyTermsDtlPK.java @@ -12,9 +12,11 @@ public class PtyTermsDtlPK implements Serializable { //default serial version id, required for serializable classes. private static final long serialVersionUID = 1L; + // 약관일련번호 @Column(name="TERMS_SNO") private int termsSno; + // 언어구분코드 @Column(name="LANG_DIV_CD") private String langDivCd; diff --git a/pav-server/src/main/java/com/palnet/biz/jpa/repository/cns/CnsFaqQueryRepository.java b/pav-server/src/main/java/com/palnet/biz/jpa/repository/cns/CnsFaqQueryRepository.java index ead1ace9..1c9fe6b9 100644 --- a/pav-server/src/main/java/com/palnet/biz/jpa/repository/cns/CnsFaqQueryRepository.java +++ b/pav-server/src/main/java/com/palnet/biz/jpa/repository/cns/CnsFaqQueryRepository.java @@ -1,6 +1,6 @@ package com.palnet.biz.jpa.repository.cns; -import com.palnet.biz.api.cns.faq.model.FaqListModel; +import com.palnet.biz.api.cns.faq.model.FaqListRSModel; import com.palnet.biz.jpa.entity.QCnsFaqBas; import com.querydsl.core.BooleanBuilder; import com.querydsl.core.types.Projections; @@ -17,8 +17,13 @@ import java.util.List; public class CnsFaqQueryRepository { private final JPAQueryFactory query; - - public List getFaqList(String category, String word) { + /** + * 조건값으로 FaQ리스트를 조회하는 SQL기능. + * @param category + * @param word + * @return + */ + public List getFaqList(String category, String word) { QCnsFaqBas bas = QCnsFaqBas.cnsFaqBas; @@ -34,9 +39,33 @@ public class CnsFaqQueryRepository { builder.and(bas.title.contains(word)); } - List r = query + /** + * 삭제여부[delYn]값이 'N' 조건, + * 표출여부[expsrYn]값이 'Y' 조건, + * 카테고리값[category]값 조건, + * 제목[title] 값이 word와의 조건 값으로 조회하는 SQL 입니다. + * + * SELECT + * CFB.FAQ_SNO , + * CFB.CATEGORY , + * CFB.TITLE , + * CFB.CONTENT , + * CFB.VIEW_CNT , + * CFB.EXPSR_YN , + * CFB.CREATE_USER_ID , + * CFB.CREATE_DT , + * CFB.UPDATE_USER_ID , + * CFB.UPDATE_DT + * FROM CNS_FAQ_BAS CFB + * WHERE CFB.DEL_YN = 'N' + * AND CFB.EXPSR_YN = 'Y' + * AND CFB.CATEGORY = #{category} + * AND CFB.TITLE = #{word} + * ORDER BY CFB.CREATE_DT DESC + */ + List r = query .select(Projections.bean( - FaqListModel.class, + FaqListRSModel.class, bas.faqSno, bas.category, bas.title, @@ -57,7 +86,12 @@ public class CnsFaqQueryRepository { return r; } - public FaqListModel getFaqDetail(int sno) { + /** + * 일련번호[sno]로 상세정보를 조회하는 SQL 기능. + * @param sno + * @return + */ + public FaqListRSModel getFaqDetail(int sno) { QCnsFaqBas bas = QCnsFaqBas.cnsFaqBas; @@ -66,9 +100,30 @@ public class CnsFaqQueryRepository { builder.and(bas.expsrYn.eq("Y")); builder.and(bas.delYn.eq("N")); - FaqListModel r = query + /** + * 일련번호[faqSno] 조건, + * 표출여부[expsrYn]가 'Y' 인지 조건, + * 삭제여부[delYn]가 'N' 인지 조건으로 조회하는 SQL 입니다. + * + * SELECT + * CFB.FAQ_SNO , + * CFB.CATEGORY , + * CFB.TITLE , + * CFB.CONTENT , + * CFB.VIEW_CNT , + * CFB.EXPSR_YN , + * CFB.CREATE_USER_ID , + * CFB.CREATE_DT , + * CFB.UPDATE_USER_ID , + * CFB.UPDATE_DT + * FROM CNS_FAQ_BAS CFB + * WHERE CFB.FAQ_SNO = #{sno} + * AND CFB.EXPSR_YN = 'Y' + * AND CFB.DEL_YN = 'N' + */ + FaqListRSModel r = query .select(Projections.bean( - FaqListModel.class, + FaqListRSModel.class, bas.faqSno, bas.category, bas.title, @@ -88,7 +143,7 @@ public class CnsFaqQueryRepository { return r; } - public void updateFaq(FaqListModel model) { + public void updateFaq(FaqListRSModel model) { QCnsFaqBas bas = QCnsFaqBas.cnsFaqBas; BooleanBuilder builder = new BooleanBuilder(); diff --git a/pav-server/src/main/java/com/palnet/biz/jpa/repository/cns/CnsQnaQueryRepository.java b/pav-server/src/main/java/com/palnet/biz/jpa/repository/cns/CnsQnaQueryRepository.java index 85b89057..3e4a1bab 100644 --- a/pav-server/src/main/java/com/palnet/biz/jpa/repository/cns/CnsQnaQueryRepository.java +++ b/pav-server/src/main/java/com/palnet/biz/jpa/repository/cns/CnsQnaQueryRepository.java @@ -25,8 +25,7 @@ public class CnsQnaQueryRepository { private final JPAQueryFactory query; /** - * 카테고리와 글로 게시글 검색, 만약 조건 없으면 전체검색 - * + * 카테고리와 글로 게시글 검색, 만약 조건 없으면 전체검색 하는 SQL기능. * @param rq * @return */ @@ -58,6 +57,43 @@ public class CnsQnaQueryRepository { } } + /** + * 삭제여부[delYn]값이 'N' 조건인지, + * 표출여부[expsrYn]값이 'Y' 조건인지, + * 카테고리[category]값 조건, + * 작성자[memberName]값 조건, + * 답변여부[anserStatus]값 조건으로 조회하는 SQL 입니다. + * + * SELECT + * CQB.QNA_SNO , + * CQB.CATEGORY , + * CQB.TITLE , + * CQB.CONTENT , + * CQB.CONTACT , + * CQB.FILE_GROUP_NO , + * CQB.ANSER_STATUS , + * CQB.ANSER_CONTENT , + * CQB.ANSER_PROC_DT , + * CQB.ANSER_USER_NM , + * CQB.VIEW_CNT , + * CQB.EXPSR_YN , + * CQB.DEL_YN , + * CQB.CREATE_USER_ID , + * CQB.CREATE_DT , + * CQB.UPDATE_USER_ID , + * CQB.UPDATE_DT , + * PCD.MEMBER_NAME AS 'createUserNm' + * FROM CNS_QNA_BAS CQB + * LEFT OUTER JOIN PTY_CSTMR_BAS PCB + * ON CQB.CREATE_USER_ID = PCB.USER_ID + * LEFT OUTER JOIN PTY_CSTMR_DTL PCD + * ON PCB.CSTMR_SNO = PCD.CSTMR_SNO + * WHERE CQB.DEL_YN = 'N' + * AND CQB.EXPSR_YN = 'Y' + * AND CQB.CATEGORY = #{category} + * AND PCD.MEMBER_NAME = #{createUserNm} + * AND CQB.ANSER_STATUS = #{anserStatus} + */ List r = query .select(Projections.bean( QnaBasModel.class, @@ -90,6 +126,12 @@ public class CnsQnaQueryRepository { return r; } + /** + * 유저아이디[userId]에 따라 QnA리스트를 조회하는 SQL 기능. + * @param rq + * @param userId + * @return + */ public List getQnaListForUser(QnaSelectListRQ rq, String userId) { QCnsQnaBas bas = QCnsQnaBas.cnsQnaBas; QPtyCstmrBas cBas = QPtyCstmrBas.ptyCstmrBas; @@ -113,6 +155,45 @@ public class CnsQnaQueryRepository { } } + /** + * 삭제여부[delYn]값이 'N' 조건인지, + * 표출여부[expsrYn]값이 'Y' 조건인지, + * 작성자[createUserId]값 조건, + * 카테고리[createUserId] 값 조건, + * 제목[title]값 조건, + * 내용[content]값 조건으로 조회하는 SQL 입니다. + * + * SELECT + * CQB.QNA_SNO , + * CQB.CATEGORY , + * CQB.TITLE , + * CQB.CONTENT , + * CQB.CONTACT , + * CQB.FILE_GROUP_NO , + * CQB.ANSER_STATUS , + * CQB.ANSER_CONTENT , + * CQB.ANSER_PROC_DT , + * CQB.ANSER_USER_NM , + * CQB.VIEW_CNT , + * CQB.EXPSR_YN , + * CQB.DEL_YN , + * CQB.CREATE_USER_ID , + * CQB.CREATE_DT , + * CQB.UPDATE_USER_ID , + * CQB.UPDATE_DT , + * PCD.MEMBER_NAME AS 'createUserNm' + * FROM CNS_QNA_BAS CQB + * LEFT OUTER JOIN PTY_CSTMR_BAS PCB + * ON CQB.CREATE_USER_ID = PCB.USER_ID + * LEFT OUTER JOIN PTY_CSTMR_DTL PCD + * ON PCB.CSTMR_SNO = PCD.CSTMR_SNO + * WHERE CQB.DEL_YN = 'N' + * AND CQB.EXPSR_YN = 'Y' + * AND CQB.CREATE_USER_ID = #{userId} + * AND CQB.CATEGORY = #{category} + * AND CQB.TITLE LIKE CONCAT('%', #{word}, '%') + * AND CQB.CONTENT LIKE CONCAT('%', #{word}, '%') + */ List r = query .select(Projections.bean( QnaBasModel.class, diff --git a/pav-server/src/main/java/com/palnet/biz/jpa/repository/com/ComConfirmBasRepository.java b/pav-server/src/main/java/com/palnet/biz/jpa/repository/com/ComConfirmBasRepository.java new file mode 100644 index 00000000..105d0d6d --- /dev/null +++ b/pav-server/src/main/java/com/palnet/biz/jpa/repository/com/ComConfirmBasRepository.java @@ -0,0 +1,13 @@ +package com.palnet.biz.jpa.repository.com; + +import com.palnet.biz.jpa.entity.ComConfirmBas; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface ComConfirmBasRepository extends JpaRepository { + + ComConfirmBas findFirstByConfirmKey(String confirmKey); + + ComConfirmBas findFirstByConfirmKeyOrderByCreateDtDesc(String confirmKey); +} diff --git a/pav-server/src/main/java/com/palnet/biz/jpa/repository/com/ComRiseSetQueryRepository.java b/pav-server/src/main/java/com/palnet/biz/jpa/repository/com/ComRiseSetQueryRepository.java index 0ea03f85..c46e9541 100644 --- a/pav-server/src/main/java/com/palnet/biz/jpa/repository/com/ComRiseSetQueryRepository.java +++ b/pav-server/src/main/java/com/palnet/biz/jpa/repository/com/ComRiseSetQueryRepository.java @@ -60,6 +60,11 @@ public class ComRiseSetQueryRepository { } + /** + * 검색조건의 맞춰 일몰,일출 시간을 조회하는 SQL 기능. + * @param rq + * @return + */ public List findAllBySearchTransform(ComnSunrisesetRq rq) { QComRiseSetBas bas = QComRiseSetBas.comRiseSetBas; @@ -76,6 +81,23 @@ public class ComRiseSetQueryRepository { } } + /** + * 시작일자[locStDate] 조건, + * 종료일자[locEndDate] 조건, + * 지역[location] 조건에 맞춰 조회하는 SQL 입니다. + * + * SELECT + * CRSB.LOC_DATE , + * CRSB.LOCATION , + * CRSB.SUNRISE , + * CRSB.SUNSET , + * CRSB.CIVILM , + * CRSB.CIVILE + * FROM COM_RISE_SET_BAS CRSB + * WHERE CRSB.LOC_DATE >= #{locStDate} + * AND CRSB.LOC_DATE <= #{locEndDate} + * AND CRSB.LOCATION = #{location} + */ List results = query .select(Projections.bean( ComnSunrisesetRs.class, @@ -95,12 +117,33 @@ public class ComRiseSetQueryRepository { } + /** + * 기간내 근접한 지역의 일출/일몰 조회하는 SQL 기능. + * @param rq + * @return + */ public ComnSunrisesetRs findBySearchCoordDateTransform(ComnSunrisesetCoordRq rq) { QComRiseSetBas bas = QComRiseSetBas.comRiseSetBas; BooleanBuilder builder = new BooleanBuilder(); builder.and(bas.id.locDate.goe(rq.getLocStDate())); builder.and(bas.id.locDate.loe(rq.getLocEndDate())); + /** + * 검색 시작일[locStDate] 조건, + * 검색 끝일[locEndDate] 조건, + * 위도[lat] 조건, + * 경도[lon] 조건으로 데이터베이스에서 조회하는 SQL 입니다. + * + * SELECT + * MAX(CRSB.SUNRISE) AS 'sunrise', + * MIN(CRSB.SUNSET) AS 'sunset', + * MAX(CRSB.CIVILM) AS 'civilm', + * MIN(CRSB.CIVILE) AS 'civile' + * FROM COM_RISE_SET_BAS CRSB + * WHERE CRSB.LOC_DATE >= #{locStDate} + * AND CRSB.LOC_DATE <= #{locEndDate} + * ORDER BY ST_Distance_Sphere(POINT(#{lon}, #{lat}), POINT(#{CRSB.LON}, #{CRSB.LAT})) + */ return query .select(Projections.bean( ComnSunrisesetRs.class, @@ -126,6 +169,11 @@ public class ComRiseSetQueryRepository { .fetchFirst(); } + /** + * 근접한 지역의 현재~6개월치의 일출/일몰 데이터 조회하는 SQL 기능. + * @param rq + * @return + */ public List findAllBySearchCoordTransform(ComnSunrisesetCoordRq rq) { QComRiseSetBas bas = QComRiseSetBas.comRiseSetBas; @@ -137,6 +185,20 @@ public class ComRiseSetQueryRepository { builder.and(bas.id.locDate.goe(stDateStr)); builder.and(bas.id.locDate.loe(endDateStr)); + /** + * 검색 시작일[locStDate] 조건, + * 검색 끝일[locEndDate] 조건, + * 위도[lat] 조건, + * 경도[lon] 조건으로 데이터베이스에서 조회하는 SQL 입니다. + * + * SELECT + * CRSB.LOCATION + * FROM COM_RISE_SET_BAS CRSB + * WHERE CRSB.LOC_DATE >= #{locStDate} + * AND CRSB.LOC_DATE <= #{locEndDate} + * GROUP BY CRSB.LOCATION + * ORDER BY ST_Distance_Sphere(POINT(#{lon}, #{lat}), POINT(#{CRSB.LON}, #{CRSB.LAT})) ASC + */ String location = query.select(bas.id.location) .from(bas) .where(builder) @@ -154,6 +216,25 @@ public class ComRiseSetQueryRepository { .fetchFirst(); builder.and(bas.id.location.eq(location)); + + /** + * 검색 시작일[locStDate] 조건, + * 검색 끝일[locEndDate] 조건, + * 지역[location] 조건으로 조회하는 SQL 입니다. + * + * SELECT + * CRSB.LOC_DATE , + * CRSB.LOCATION , + * CRSB.SUNRISE , + * CRSB.SUNSET , + * CRSB.CIVILM , + * CRSB.CIVILE + * FROM COM_RISE_SET_BAS CRSB + * WHERE CRSB.LOC_DATE >= #{locStDate} + * AND CRSB.LOC_DATE <= #{locEndDate} + * AND CRSB.LOCATION = #{location} + * ORDER BY CRSB.LOC_DATE ASC + */ List rs = query.select(Projections.bean( ComnSunrisesetRs.class, bas.id.locDate, 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 7e481edd..9274fe55 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 @@ -9,7 +9,6 @@ import java.util.Calendar; import java.util.Date; import java.util.List; -import com.palnet.biz.api.main.dash.model.MainDashFlightNumStcsModel; import com.palnet.biz.jpa.entity.*; import com.querydsl.core.Tuple; import org.apache.commons.lang3.StringUtils; @@ -51,20 +50,20 @@ import lombok.extern.log4j.Log4j2; @Repository @RequiredArgsConstructor public class CtrCntrlQueryRepository{ - - + + private final JPAQueryFactory query; - + @Autowired private JwtTokenUtil jwtTokenUtil; - + /** * 비행 현황 데이터 조회 * @param rq * @return */ public PageImpl listCntrlBas(AnlsHstryRqModel rq, Pageable pageable){ - + QCtrCntrlBas qCntrlBasEntity = QCtrCntrlBas.ctrCntrlBas; QCtrCntrlHstryArea qCntrlHstryAreaEntity = QCtrCntrlHstryArea.ctrCntrlHstryArea; QFltPlanCtrCntrlRel qFltPlanCtrCntrlRel = QFltPlanCtrCntrlRel.fltPlanCtrCntrlRel; @@ -75,21 +74,23 @@ public class CtrCntrlQueryRepository{ // end.add(Calendar.DATE, 1); // Date endDate = end.getTime(); + + BooleanBuilder builder = new BooleanBuilder(); builder.and(qCntrlBasEntity.statusCd.eq("99")); - builder.and(qCntrlBasEntity.cntrlStDt.after(InstantUtils.fromDatetimeString(rq.getStDate()))); + builder.and(qCntrlBasEntity.cntrlStDt.after(InstantUtils.fromDateString(rq.getStDate()))); builder.and(qCntrlBasEntity.cntrlEndDt.before(InstantUtils.fromDateString(rq.getEndDate()).plus(Duration.ofHours(1)))); builder.and(qCntrlBasEntity.statusCd.eq("99")); builder.and(qFltPlanBas.aprvlYn.eq("Y")); - + if(!StringUtils.isEmpty(rq.getSearch1())) { builder.and(qCntrlBasEntity.idntfNum.like("%" + rq.getSearch1() + "%")); } - + ArrayList result = new ArrayList(); - - List queryList = query.select(Projections.bean(AnlsHstryModel.class , + + List queryList = query.select(Projections.bean(AnlsHstryModel.class , qCntrlBasEntity.cntrlId, qCntrlBasEntity.idntfNum, qCntrlBasEntity.statusCd, @@ -117,8 +118,8 @@ public class CtrCntrlQueryRepository{ qCntrlHstryAreaEntity.landNm, qCntrlHstryAreaEntity.landNum, qCntrlHstryAreaEntity.zipCd - - + + )) .from(qCntrlBasEntity) .leftJoin(qCntrlHstryAreaEntity) @@ -133,26 +134,26 @@ public class CtrCntrlQueryRepository{ .offset(pageable.getOffset()) .limit(5) .fetch(); - + for(AnlsHstryModel model: queryList) { String addr = ""; - + if(!StringUtils.isEmpty(model.getArea1())) { addr = addr + " " + model.getArea1(); } - + if(!StringUtils.isEmpty(model.getArea2())) { addr = addr + " " + model.getArea2(); } - + if(!StringUtils.isEmpty(model.getArea3())) { addr = addr + " " + model.getArea3(); } - + if(!StringUtils.isEmpty(model.getLandNm())) { addr = addr + " " + model.getLandNm(); } - + if(!StringUtils.isEmpty(model.getLandNum())) { addr = addr + " " + model.getLandNum(); } @@ -160,21 +161,21 @@ public class CtrCntrlQueryRepository{ result.add(model); } - - + + return new PageImpl<>(result, pageable, result.size()); } - + public List cntrlBasAuthList(AnlsHstryRqModel rq, String groupId){ - + QCtrCntrlBas qCntrlBasEntity = QCtrCntrlBas.ctrCntrlBas; QCtrCntrlHstryArea qCntrlHstryAreaEntity = QCtrCntrlHstryArea.ctrCntrlHstryArea; QFltPlanCtrCntrlRel qFltPlanCtrCntrlRelEntity = QFltPlanCtrCntrlRel.fltPlanCtrCntrlRel; - + BooleanBuilder builder = new BooleanBuilder(); - + builder.and(qCntrlBasEntity.statusCd.eq("99")); - Calendar end = Calendar.getInstance(); + Calendar end = Calendar.getInstance(); end.setTime(Date.from(DateUtils.stringToDate(rq.getEndDate()))); end.add(Calendar.DATE, 1); Date endDate = end.getTime(); @@ -184,10 +185,10 @@ public class CtrCntrlQueryRepository{ if(!StringUtils.isEmpty(rq.getSearch1())) { builder.and(qCntrlBasEntity.idntfNum.like("%" + rq.getSearch1() + "%")); } - + ArrayList result = new ArrayList(); - - List queryList = query.select(Projections.bean(AnlsHstryModel.class , + + List queryList = query.select(Projections.bean(AnlsHstryModel.class , qCntrlBasEntity.cntrlId, qCntrlBasEntity.idntfNum, qCntrlBasEntity.statusCd, @@ -215,8 +216,8 @@ public class CtrCntrlQueryRepository{ qCntrlHstryAreaEntity.landNm, qCntrlHstryAreaEntity.landNum, qCntrlHstryAreaEntity.zipCd - - + + )) .from(qCntrlBasEntity) .leftJoin(qCntrlHstryAreaEntity) @@ -227,26 +228,26 @@ public class CtrCntrlQueryRepository{ .where(builder) .orderBy(qCntrlBasEntity.cntrlStDt.asc()) .fetch(); - + for(AnlsHstryModel model: queryList) { String addr = ""; - + if(!StringUtils.isEmpty(model.getArea1())) { addr = addr + " " + model.getArea1(); } - + if(!StringUtils.isEmpty(model.getArea2())) { addr = addr + " " + model.getArea2(); } - + if(!StringUtils.isEmpty(model.getArea3())) { addr = addr + " " + model.getArea3(); } - + if(!StringUtils.isEmpty(model.getLandNm())) { addr = addr + " " + model.getLandNm(); } - + if(!StringUtils.isEmpty(model.getLandNum())) { addr = addr + " " + model.getLandNum(); } @@ -254,59 +255,134 @@ public class CtrCntrlQueryRepository{ result.add(model); } - - + + 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, List basResult, List pilotResult){ - + QCtrCntrlBas qCntrlBasEntity = QCtrCntrlBas.ctrCntrlBas; QCtrCntrlHstryArea qCntrlHstryAreaEntity = QCtrCntrlHstryArea.ctrCntrlHstryArea; QFltPlanCtrCntrlRel qFltPlanCtrCntrlRelEntity = QFltPlanCtrCntrlRel.fltPlanCtrCntrlRel; QFltPlanBas qFltPlanBasEntity = QFltPlanBas.fltPlanBas; - + BooleanBuilder builder = new BooleanBuilder(); BooleanBuilder idntfBuilder = new BooleanBuilder(); BooleanBuilder basBuilder = new BooleanBuilder(); BooleanBuilder pilotBuilder = new BooleanBuilder(); - - Calendar end = Calendar.getInstance(); + + Calendar end = Calendar.getInstance(); 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<>(); - - List queryList = query.select(Projections.bean(AnlsHstryModel.class , + + /** + * 위 조건들과 부합한 데이터베이스 내용을 조회하는 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, qCntrlBasEntity.statusCd, @@ -334,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) @@ -355,26 +429,26 @@ public class CtrCntrlQueryRepository{ .offset(pageable.getOffset()) .limit(pageable.getPageSize()) .fetch(); - + for(AnlsHstryModel model: queryList) { String addr = ""; - + if(!StringUtils.isEmpty(model.getArea1())) { addr = addr + " " + model.getArea1(); } - + if(!StringUtils.isEmpty(model.getArea2())) { addr = addr + " " + model.getArea2(); } - + if(!StringUtils.isEmpty(model.getArea3())) { addr = addr + " " + model.getArea3(); } - + if(!StringUtils.isEmpty(model.getLandNm())) { addr = addr + " " + model.getLandNm(); } - + if(!StringUtils.isEmpty(model.getLandNum())) { addr = addr + " " + model.getLandNum(); } @@ -382,65 +456,141 @@ public class CtrCntrlQueryRepository{ result.add(model); } - - + + return new PageImpl<>(result, pageable, result.size()); } - public PageImpl cntrlBasNormalSmltList(AnlsHstryRqModel rq, - Pageable pageable, + + /** + * 비행 시뮬레이션할 데이터를 조건에 맞춰 데이터베이스에서 조회하는 SQL 기능. + * @param rq + * @param pageable + * @param adminAuth + * @param idntfList + * @param basResult + * @param pilotResult + * @return + */ + public PageImpl cntrlBasNormalSmltList(AnlsHstryRqModel rq, + Pageable pageable, List adminAuth, - List idntfList, - List basResult, + List idntfList, + List basResult, List pilotResult){ - + QCtrCntrlBas qCntrlBasEntity = QCtrCntrlBas.ctrCntrlBas; QCtrCntrlHstryArea qCntrlHstryAreaEntity = QCtrCntrlHstryArea.ctrCntrlHstryArea; QFltPlanCtrCntrlRel qFltPlanCtrCntrlRelEntity = QFltPlanCtrCntrlRel.fltPlanCtrCntrlRel; QFltPlanBas qFltPlanBasEntity = QFltPlanBas.fltPlanBas; - + BooleanBuilder builder = new BooleanBuilder(); BooleanBuilder adminBuilder = new BooleanBuilder(); BooleanBuilder idntfBuilder = new BooleanBuilder(); BooleanBuilder basBuilder = new BooleanBuilder(); BooleanBuilder pilotBuilder = new BooleanBuilder(); - - Calendar end = Calendar.getInstance(); + + Calendar end = Calendar.getInstance(); 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<>(); - - List queryList = query.select(Projections.bean(AnlsHstryModel.class , + + /** + * 위 조건들과 부합한 데이터베이스 내용을 조회하는 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, qCntrlBasEntity.statusCd, @@ -468,8 +618,8 @@ public class CtrCntrlQueryRepository{ qCntrlHstryAreaEntity.landNm, qCntrlHstryAreaEntity.landNum, qCntrlHstryAreaEntity.zipCd - - + + )) .from(qCntrlBasEntity) .leftJoin(qCntrlHstryAreaEntity) @@ -490,26 +640,26 @@ public class CtrCntrlQueryRepository{ .limit(pageable.getPageSize()) .fetch(); - + for(AnlsHstryModel model: queryList) { String addr = ""; - + if(!StringUtils.isEmpty(model.getArea1())) { addr = addr + " " + model.getArea1(); } - + if(!StringUtils.isEmpty(model.getArea2())) { addr = addr + " " + model.getArea2(); } - + if(!StringUtils.isEmpty(model.getArea3())) { addr = addr + " " + model.getArea3(); } - + if(!StringUtils.isEmpty(model.getLandNm())) { addr = addr + " " + model.getLandNm(); } - + if(!StringUtils.isEmpty(model.getLandNum())) { addr = addr + " " + model.getLandNum(); } @@ -517,33 +667,34 @@ public class CtrCntrlQueryRepository{ result.add(model); } - - + + return new PageImpl<>(result, pageable, result.size()); } + public List cntrlBasNormalList(AnlsHstryRqModel rq, String idntfNum){ - + QCtrCntrlBas qCntrlBasEntity = QCtrCntrlBas.ctrCntrlBas; QCtrCntrlHstryArea qCntrlHstryAreaEntity = QCtrCntrlHstryArea.ctrCntrlHstryArea; - + BooleanBuilder builder = new BooleanBuilder(); - Calendar end = Calendar.getInstance(); + Calendar end = Calendar.getInstance(); end.setTime(Date.from(DateUtils.stringToDate(rq.getEndDate()))); end.add(Calendar.DATE, 1); Date endDate = end.getTime(); builder.and(qCntrlBasEntity.cntrlStDt.after(DateUtils.stringToDate(rq.getStDate()))); builder.and(qCntrlBasEntity.cntrlEndDt.before(endDate.toInstant())); - + builder.and(qCntrlBasEntity.statusCd.eq("99")); builder.and(qCntrlBasEntity.idntfNum.eq(idntfNum)); if(!StringUtils.isEmpty(rq.getSearch1())) { builder.and(qCntrlBasEntity.idntfNum.like("%" + rq.getSearch1() + "%")); } - + ArrayList result = new ArrayList(); - - List queryList = query.select(Projections.bean(AnlsHstryModel.class , + + List queryList = query.select(Projections.bean(AnlsHstryModel.class , qCntrlBasEntity.cntrlId, qCntrlBasEntity.idntfNum, qCntrlBasEntity.statusCd, @@ -571,8 +722,8 @@ public class CtrCntrlQueryRepository{ qCntrlHstryAreaEntity.landNm, qCntrlHstryAreaEntity.landNum, qCntrlHstryAreaEntity.zipCd - - + + )) .from(qCntrlBasEntity) .leftJoin(qCntrlHstryAreaEntity) @@ -581,26 +732,26 @@ public class CtrCntrlQueryRepository{ .where(builder) .orderBy(qCntrlBasEntity.cntrlStDt.asc()) .fetch(); - + for(AnlsHstryModel model: queryList) { String addr = ""; - + if(!StringUtils.isEmpty(model.getArea1())) { addr = addr + " " + model.getArea1(); } - + if(!StringUtils.isEmpty(model.getArea2())) { addr = addr + " " + model.getArea2(); } - + if(!StringUtils.isEmpty(model.getArea3())) { addr = addr + " " + model.getArea3(); } - + if(!StringUtils.isEmpty(model.getLandNm())) { addr = addr + " " + model.getLandNm(); } - + if(!StringUtils.isEmpty(model.getLandNum())) { addr = addr + " " + model.getLandNum(); } @@ -608,60 +759,104 @@ public class CtrCntrlQueryRepository{ result.add(model); } - - + + return result; } + /** + * 조건들에 부합하는 비행 현황 목록 데이터의 갯수를 조회하는 SQL 기능. + * @param rq + * @param idntfList + * @param basResult + * @param pilotResult + * @return + */ public long cntrlBasNormalHstryCount(AnlsHstryGroupModel rq, - List idntfList, - List basResult, + List idntfList, + List basResult, List pilotResult){ - + QCtrCntrlBas qCntrlBasEntity = QCtrCntrlBas.ctrCntrlBas; QCtrCntrlHstryArea qCntrlHstryAreaEntity = QCtrCntrlHstryArea.ctrCntrlHstryArea; QFltPlanCtrCntrlRel qFltPlanCtrCntrlRelEntity = QFltPlanCtrCntrlRel.fltPlanCtrCntrlRel; QFltPlanBas qFltPlanBasEntity = QFltPlanBas.fltPlanBas; - + BooleanBuilder builder = new BooleanBuilder(); BooleanBuilder idntfBuilder = new BooleanBuilder(); BooleanBuilder basBuilder = new BooleanBuilder(); BooleanBuilder pilotBuilder = new BooleanBuilder(); - - Calendar end = Calendar.getInstance(); + + Calendar end = Calendar.getInstance(); 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(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() + "%")); } - - - - long result = query.select(Projections.bean(AnlsHstryModel.class , + + + /** + * 위 조건들과 부합한 데이터베이스 내용의 갯수를 조회하는 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, qCntrlBasEntity.statusCd, @@ -689,8 +884,8 @@ public class CtrCntrlQueryRepository{ qCntrlHstryAreaEntity.landNm, qCntrlHstryAreaEntity.landNum, qCntrlHstryAreaEntity.zipCd - - + + )) .from(qCntrlBasEntity) .leftJoin(qCntrlHstryAreaEntity) @@ -708,24 +903,24 @@ public class CtrCntrlQueryRepository{ .orderBy(qCntrlBasEntity.cntrlStDt.asc()) .groupBy(qFltPlanBasEntity.planSno) .fetchCount(); - + return result; } - + public long cntrlBasNormalSmltCount(AnlsHstryRqModel rq, List adminAuth, List idntfList, List basResult, List pilotResult){ - + QCtrCntrlBas qCntrlBasEntity = QCtrCntrlBas.ctrCntrlBas; QCtrCntrlHstryArea qCntrlHstryAreaEntity = QCtrCntrlHstryArea.ctrCntrlHstryArea; QFltPlanCtrCntrlRel qFltPlanCtrCntrlRelEntity = QFltPlanCtrCntrlRel.fltPlanCtrCntrlRel; QFltPlanBas qFltPlanBasEntity = QFltPlanBas.fltPlanBas; - + BooleanBuilder builder = new BooleanBuilder(); BooleanBuilder adminBuilder = new BooleanBuilder(); BooleanBuilder idntfBuilder = new BooleanBuilder(); BooleanBuilder basBuilder = new BooleanBuilder(); BooleanBuilder pilotBuilder = new BooleanBuilder(); - - Calendar end = Calendar.getInstance(); + + Calendar end = Calendar.getInstance(); end.setTime(Date.from(DateUtils.stringToDate(rq.getEndDate()))); end.add(Calendar.DATE, 1); Date endDate = end.getTime(); @@ -733,7 +928,7 @@ public class CtrCntrlQueryRepository{ builder.and(qCntrlBasEntity.cntrlEndDt.before(endDate.toInstant())); builder.and(qFltPlanBasEntity.aprvlYn.eq("Y")); builder.and(qCntrlBasEntity.statusCd.eq("99")); - + if(adminAuth.size()>0) { for(JwtGroupModel list : adminAuth) { adminBuilder.or(qFltPlanCtrCntrlRelEntity.groupId.eq(list.getGroupId())); @@ -754,14 +949,14 @@ public class CtrCntrlQueryRepository{ pilotBuilder.or(qFltPlanCtrCntrlRelEntity.planSno.eq(list.getPlanSno())); } } - + if(!StringUtils.isEmpty(rq.getSearch1())) { builder.and(qCntrlBasEntity.idntfNum.like("%" + rq.getSearch1() + "%")); } - - - - long result = query.select(Projections.bean(AnlsHstryModel.class , + + + + long result = query.select(Projections.bean(AnlsHstryModel.class , qCntrlBasEntity.cntrlId, qCntrlBasEntity.idntfNum, qCntrlBasEntity.statusCd, @@ -789,8 +984,8 @@ public class CtrCntrlQueryRepository{ qCntrlHstryAreaEntity.landNm, qCntrlHstryAreaEntity.landNum, qCntrlHstryAreaEntity.zipCd - - + + )) .from(qCntrlBasEntity) .leftJoin(qCntrlHstryAreaEntity) @@ -807,34 +1002,34 @@ public class CtrCntrlQueryRepository{ .or(pilotBuilder))) .orderBy(qCntrlBasEntity.cntrlStDt.asc()) .fetchCount(); - + return result; } public List cntrlBasNormalPlanList(AnlsHstryRqModel rq, int planSno){ - + QCtrCntrlBas qCntrlBasEntity = QCtrCntrlBas.ctrCntrlBas; QCtrCntrlHstryArea qCntrlHstryAreaEntity = QCtrCntrlHstryArea.ctrCntrlHstryArea; QFltPlanCtrCntrlRel qFltPlanCtrCntrlRelEntity = QFltPlanCtrCntrlRel.fltPlanCtrCntrlRel; - + BooleanBuilder builder = new BooleanBuilder(); - - Calendar end = Calendar.getInstance(); + + Calendar end = Calendar.getInstance(); end.setTime(Date.from(DateUtils.stringToDate(rq.getEndDate()))); end.add(Calendar.DATE, 1); Date endDate = end.getTime(); builder.and(qCntrlBasEntity.cntrlStDt.after(DateUtils.stringToDate(rq.getStDate()))); builder.and(qCntrlBasEntity.cntrlEndDt.before(endDate.toInstant())); - + builder.and(qFltPlanCtrCntrlRelEntity.planSno.eq(planSno)); builder.and(qCntrlBasEntity.statusCd.eq("99")); if(!StringUtils.isEmpty(rq.getSearch1())) { builder.and(qCntrlBasEntity.idntfNum.like("%" + rq.getSearch1() + "%")); } - + ArrayList result = new ArrayList(); - - List queryList = query.select(Projections.bean(AnlsHstryModel.class , + + List queryList = query.select(Projections.bean(AnlsHstryModel.class , qCntrlBasEntity.cntrlId, qCntrlBasEntity.idntfNum, qCntrlBasEntity.statusCd, @@ -862,8 +1057,8 @@ public class CtrCntrlQueryRepository{ qCntrlHstryAreaEntity.landNm, qCntrlHstryAreaEntity.landNum, qCntrlHstryAreaEntity.zipCd - - + + )) .from(qCntrlBasEntity) .leftJoin(qCntrlHstryAreaEntity) @@ -874,35 +1069,35 @@ public class CtrCntrlQueryRepository{ .where(builder) .orderBy(qCntrlBasEntity.cntrlStDt.asc()) .fetch(); - + for(AnlsHstryModel model: queryList) { String addr = ""; - + if(!StringUtils.isEmpty(model.getArea1())) { addr = addr + " " + model.getArea1(); } - + if(!StringUtils.isEmpty(model.getArea2())) { addr = addr + " " + model.getArea2(); } - + if(!StringUtils.isEmpty(model.getArea3())) { addr = addr + " " + model.getArea3(); } - + if(!StringUtils.isEmpty(model.getLandNm())) { addr = addr + " " + model.getLandNm(); } - + if(!StringUtils.isEmpty(model.getLandNum())) { addr = addr + " " + model.getLandNum(); } model.setStArea(addr); result.add(model); } - - - + + + return result; } @@ -912,9 +1107,9 @@ public class CtrCntrlQueryRepository{ QCtrCntrlHstryArea qCntrlHstryAreaEntity = QCtrCntrlHstryArea.ctrCntrlHstryArea; QFltPlanCtrCntrlRel qFltPlanCtrCntrlRelEntity = QFltPlanCtrCntrlRel.fltPlanCtrCntrlRel; QFltPlanBas qFltPlanBasEntity = QFltPlanBas.fltPlanBas; - + BooleanBuilder builder = new BooleanBuilder(); - + Calendar end = Calendar.getInstance(); end.setTime(Date.from(DateUtils.stringToDate(rq.getEndDate()))); end.add(Calendar.DATE, 1); @@ -924,7 +1119,7 @@ public class CtrCntrlQueryRepository{ builder.and(qCntrlBasEntity.cntrlEndDt.loe(endDate.toInstant())); builder.and(qFltPlanBasEntity.aprvlYn.eq("Y")); builder.and(qCntrlBasEntity.statusCd.eq("99")); - + if(!StringUtils.isEmpty(rq.getSearch1())) { builder.and(qCntrlBasEntity.idntfNum.like("%" + rq.getSearch1() + "%")); } @@ -954,7 +1149,7 @@ public class CtrCntrlQueryRepository{ QCtrCntrlHstryArea qCntrlHstryAreaEntity = QCtrCntrlHstryArea.ctrCntrlHstryArea; QFltPlanCtrCntrlRel qFltPlanCtrCntrlRelEntity = QFltPlanCtrCntrlRel.fltPlanCtrCntrlRel; QFltPlanBas qFltPlanBasEntity = QFltPlanBas.fltPlanBas; - + BooleanBuilder builder = new BooleanBuilder(); Calendar end = Calendar.getInstance(); @@ -966,11 +1161,11 @@ public class CtrCntrlQueryRepository{ builder.and(qCntrlBasEntity.cntrlEndDt.loe(endDate.toInstant())); builder.and(qFltPlanBasEntity.aprvlYn.eq("Y")); builder.and(qCntrlBasEntity.statusCd.eq("99")); - + if(!StringUtils.isEmpty(rq.getSearch1())) { builder.and(qCntrlBasEntity.idntfNum.like("%" + rq.getSearch1() + "%")); } - + List queryList = query.select( Projections.bean(AnlsHstryModel.class , qCntrlBasEntity.cntrlId, @@ -996,53 +1191,81 @@ public class CtrCntrlQueryRepository{ .offset(pageable.getOffset()) .limit(pageable.getPageSize()) .fetch(); - - + + List result = new ArrayList<>(); - + for(AnlsHstryModel model: queryList) { String addr = ""; - + if(!StringUtils.isEmpty(model.getArea1())) { addr = addr + " " + model.getArea1(); } - + if(!StringUtils.isEmpty(model.getArea2())) { addr = addr + " " + model.getArea2(); } - + if(!StringUtils.isEmpty(model.getArea3())) { addr = addr + " " + model.getArea3(); } - + if(!StringUtils.isEmpty(model.getLandNm())) { addr = addr + " " + model.getLandNm(); } - + if(!StringUtils.isEmpty(model.getLandNum())) { addr = addr + " " + model.getLandNum(); } model.setStArea(addr); result.add(model); } - + return new PageImpl<>(result, pageable, result.size()); } /** - * 비행 이력 데이터 조회 + * 비행 이력 데이터 조회하는 SQL. * @param id * @return */ public List listCntrlHstryPage(String id){ - + QCtrCntrlBas qCntrlBasEntity = QCtrCntrlBas.ctrCntrlBas; QCtrCntrlHstry qCtrCntrHstry = QCtrCntrlHstry.ctrCntrlHstry; - + BooleanBuilder builder = new BooleanBuilder(); builder.and(qCtrCntrHstry.cntrlId.eq(id)); - - List result = query.select(Projections.bean(AnlsHstryDetailModel.class , + + /** + * 비행번호[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 , qCtrCntrHstry.trmnlId , @@ -1052,14 +1275,14 @@ public class CtrCntrlQueryRepository{ qCtrCntrHstry.lon , qCtrCntrHstry.speed , qCtrCntrHstry.speedType , - qCtrCntrHstry.heading , - qCtrCntrHstry.elev , - qCtrCntrHstry.elevType , - qCtrCntrHstry.mvDstnc , - qCtrCntrHstry.mvDstncType , + qCtrCntrHstry.heading , + qCtrCntrHstry.elev , + qCtrCntrHstry.elevType , + qCtrCntrHstry.mvDstnc , + qCtrCntrHstry.mvDstncType , qCtrCntrHstry.bttrLvl, qCtrCntrHstry.bttrVltg, - qCtrCntrHstry.trmnlRcvDt , + qCtrCntrHstry.trmnlRcvDt , qCtrCntrHstry.srvrRcvDt, qCntrlBasEntity.idntfNum )) @@ -1069,18 +1292,52 @@ public class CtrCntrlQueryRepository{ .where(builder) .orderBy(qCtrCntrHstry.srvrRcvDt.asc()) .fetch(); - + 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; - + BooleanBuilder builder = new BooleanBuilder(); builder.and(qCtrCntrHstry.cntrlId.eq(id)); - - List result = query.select(Projections.bean(AnlsHstryDetailModel.class , + + /** + * 비행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 , qCtrCntrHstry.trmnlId , @@ -1090,14 +1347,14 @@ public List listCntrlHstry(String id){ qCtrCntrHstry.lon , qCtrCntrHstry.speed , qCtrCntrHstry.speedType , - qCtrCntrHstry.heading , - qCtrCntrHstry.elev , - qCtrCntrHstry.elevType , - qCtrCntrHstry.mvDstnc , - qCtrCntrHstry.mvDstncType , + qCtrCntrHstry.heading , + qCtrCntrHstry.elev , + qCtrCntrHstry.elevType , + qCtrCntrHstry.mvDstnc , + qCtrCntrHstry.mvDstncType , qCtrCntrHstry.bttrLvl, qCtrCntrHstry.bttrVltg, - qCtrCntrHstry.trmnlRcvDt , + qCtrCntrHstry.trmnlRcvDt , qCtrCntrHstry.srvrRcvDt, qCntrlBasEntity.idntfNum )) @@ -1107,18 +1364,19 @@ public List listCntrlHstry(String id){ .where(builder) .orderBy(qCtrCntrHstry.srvrRcvDt.asc()) .fetch(); - + return result; } + public long listCntrlHstryCount(String id){ - + QCtrCntrlBas qCntrlBasEntity = QCtrCntrlBas.ctrCntrlBas; QCtrCntrlHstry qCtrCntrHstry = QCtrCntrlHstry.ctrCntrlHstry; - + BooleanBuilder builder = new BooleanBuilder(); builder.and(qCtrCntrHstry.cntrlId.eq(id)); - - List resultList = query.select(Projections.bean(AnlsHstryDetailModel.class , + + List resultList = query.select(Projections.bean(AnlsHstryDetailModel.class , qCtrCntrHstry.cntrlId , qCtrCntrHstry.hstrySno , qCtrCntrHstry.trmnlId , @@ -1128,14 +1386,14 @@ public List listCntrlHstry(String id){ qCtrCntrHstry.lon , qCtrCntrHstry.speed , qCtrCntrHstry.speedType , - qCtrCntrHstry.heading , - qCtrCntrHstry.elev , - qCtrCntrHstry.elevType , - qCtrCntrHstry.mvDstnc , - qCtrCntrHstry.mvDstncType , + qCtrCntrHstry.heading , + qCtrCntrHstry.elev , + qCtrCntrHstry.elevType , + qCtrCntrHstry.mvDstnc , + qCtrCntrHstry.mvDstncType , qCtrCntrHstry.bttrLvl, qCtrCntrHstry.bttrVltg, - qCtrCntrHstry.trmnlRcvDt , + qCtrCntrHstry.trmnlRcvDt , qCtrCntrHstry.srvrRcvDt, qCntrlBasEntity.idntfNum )) @@ -1151,31 +1409,31 @@ public List listCntrlHstry(String id){ } return cnt; } - + public List listCntrlHstryArea() { QCtrCntrlHstryArea qCtrCntrHstryArea = QCtrCntrlHstryArea.ctrCntrlHstryArea; - + BooleanBuilder builder = new BooleanBuilder(); builder.and(qCtrCntrHstryArea.prcsYn.eq("N")); - - List list = + + List list = query.select(qCtrCntrHstryArea) .from(qCtrCntrHstryArea) .where(builder) .orderBy(qCtrCntrHstryArea.createDt.desc()) .fetch(); - + return list; - + } - + public CtrCntrlHstry getWarnHstryList(String cntrlId) { QCtrCntrlHstry qCtrCntrHstry = QCtrCntrlHstry.ctrCntrlHstry; - + BooleanBuilder builder = new BooleanBuilder(); builder.and(qCtrCntrHstry.cntrlId.eq(cntrlId)); - - CtrCntrlHstry result = + + CtrCntrlHstry result = query.select(Projections.bean(CtrCntrlHstry.class, qCtrCntrHstry.lat, qCtrCntrHstry.lon, @@ -1186,18 +1444,18 @@ public List listCntrlHstry(String id){ .where(builder) .orderBy(qCtrCntrHstry.srvrRcvDt.desc()) .fetchFirst(); - + return result; - + } - + public FltPlanArea getPlanData(int planSno) { QFltPlanArea qFltPlanArea = QFltPlanArea.fltPlanArea; - + BooleanBuilder builder = new BooleanBuilder(); builder.and(qFltPlanArea.planSno.eq(planSno)); - - FltPlanArea result = + + FltPlanArea result = query.select(Projections.bean(FltPlanArea.class, qFltPlanArea.planAreaSno, qFltPlanArea.areaType, @@ -1207,13 +1465,13 @@ public List listCntrlHstry(String id){ .where(builder) .limit(1) .fetchFirst(); - + return result; } - + public long checkPlanSno(int planSno) { QFltPlanBas qFltPlanBas = QFltPlanBas.fltPlanBas; - + BooleanBuilder builder = new BooleanBuilder(); Calendar end = Calendar.getInstance(); Date now = DateUtils.nowDate(); @@ -1223,18 +1481,18 @@ public List listCntrlHstry(String id){ builder.and(qFltPlanBas.schFltEndDt.goe(Instant.now())); builder.and(qFltPlanBas.planSno.eq(planSno)); - - long result = + + long result = query.select(Projections.bean(FltPlanBas.class, qFltPlanBas.planSno )) .from(qFltPlanBas) .where(builder) .fetchCount(); - + return result; } - + /** * 상세보기 조회 * 관제마스터 , 드론 , 드론운영자 정보 조회 @@ -1245,8 +1503,8 @@ public List listCntrlHstry(String id){ QComIdntfBas own = QComIdntfBas.comIdntfBas; QFltPlanCtrCntrlRel rel = QFltPlanCtrCntrlRel.fltPlanCtrCntrlRel; QFltPlanBas fBas = QFltPlanBas.fltPlanBas; - - CtrCntrlDtlModel result = query.select(Projections.bean(CtrCntrlDtlModel.class , + + CtrCntrlDtlModel result = query.select(Projections.bean(CtrCntrlDtlModel.class , ctr.cntrlId , ctr.cntrlStDt , ctr.cntrlEndDt , @@ -1256,10 +1514,10 @@ public List listCntrlHstry(String id){ cBas.arcrftModelNm , cBas.prdctCmpnNm , cBas.wghtTypeCd , - cBas.imageUrl , - cBas.cameraYn , - cBas.insrncYn , - own.ownerNm , + cBas.imageUrl , + cBas.cameraYn , + cBas.insrncYn , + own.ownerNm , own.hpno , fBas.corpRegYn , fBas.aprvlDt , @@ -1275,14 +1533,14 @@ public List listCntrlHstry(String id){ .leftJoin(fBas) .on(rel.planSno.eq(fBas.planSno)) .where(ctr.cntrlId.eq(controlId)) - + .where(cBas.useYn.eq("Y")) // .where(ctr.objectId.ne("none")) .fetchFirst(); - - + + if(result == null) return new CtrCntrlDtlModel(); - + // if(!StringUtils.isEmpty(result.getOwnerNm())) { // result.setOwnerNm(EncryptUtils.decrypt(result.getOwnerNm())); // } @@ -1293,10 +1551,15 @@ public List listCntrlHstry(String id){ // result.setTelno(EncryptUtils.decrypt(result.getTelno())); // } return result; - + } // TODO 임시 수정 + /** + * 관제사항 상세보는 SQL기능. + * @param controlId + * @return + */ public CtrCntrlDtlModel detailCntrlForKac(String controlId) { QCtrCntrlBas ctr = QCtrCntrlBas.ctrCntrlBas; // QComArcrftBas cBas = QComArcrftBas.comArcrftBas; @@ -1306,6 +1569,40 @@ public List listCntrlHstry(String id){ QFltPlanCtrCntrlRel rel = QFltPlanCtrCntrlRel.fltPlanCtrCntrlRel; QFltPlanBas fBas = QFltPlanBas.fltPlanBas; + /** + * 관제ID[controlId]값 조건으로 조회하는 SQL입니다. + * + * SELECT + * CCB.CNTRL_ID , + * CCB.CNTRL_ST_DT , + * CCB.CNTRL_END_DT , + * FPA.ARCRFT_SNO , + * FPA.PRDCT_NUM , + * FPA.ARCRFT_TYPE_CD , + * FPA.ARCRFT_MODEL_NM , + * FPA.PRDCT_CMPN_NM , + * FPA.WGHT_TYPE_CD , + * FPA.IMAGE_URL , + * FPA.CAMERA_YN , + * FPA.INSRNC_YN , + * FPA.OWNER_NM , + * FPP.HPNO , + * FPB.CORP_REG_YN , + * FPB.APRVL_DT , + * FPB.APRVL_YN + * 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 + * LEFT OUTER JOIN FLT_PLAN_ARCRFT FPA + * ON FPB.PLAN_SNO = FPA.PLAN_SNO + * AND CCB.IDNTF_NUM = FPA.IDNTF_NUM + * LEFT OUTER JOIN FLT_PLAN_PILOT FPP + * ON FPB.PLAN_SNO = FPP.PLAN_SNO + * WHERE CCB.CNTRL_ID = #{cntrlId} + * ORDER BY CCB.CREATE_DT DESC + */ CtrCntrlDtlModel result = query.select(Projections.bean(CtrCntrlDtlModel.class, ctr.cntrlId, ctr.cntrlStDt, @@ -1353,47 +1650,47 @@ public List listCntrlHstry(String id){ return result; } - + /** * 상세보기 조회 * 지역정보 조회 */ public List detailArea(String controlId) { QCtrCntrlHstryArea area = QCtrCntrlHstryArea.ctrCntrlHstryArea; - + List result = query.select(area) .from(area) .where(area.cntrlId.eq(controlId)) - + .fetch(); - + return result; - + } - - + + /** * 드론 정보 조회 - * + * */ public ComArcrftBas findComArcrftBasByPrdtNum(String prdtNum) { QComArcrftBas bas = QComArcrftBas.comArcrftBas; ComArcrftBas result = query.select(bas).from(bas).where(bas.prdctNum.eq(prdtNum)).where(bas.useYn.eq("Y")).fetchFirst(); - + return result; - + } - + /** * 종료 처리 되지 않은 데이터 종료처리 대상 조회 * 기준 - STAUS = 01 , 최종 수신 시간이 30분 초과 한 경우 */ - + public List endList(){ QCtrCntrlBas bas = QCtrCntrlBas.ctrCntrlBas; QCtrCntrlHstry hst = QCtrCntrlHstry.ctrCntrlHstry; - - List result = query.select(Projections.bean(CtrCntrlEndModel.class , + + List result = query.select(Projections.bean(CtrCntrlEndModel.class , hst.cntrlId, hst.srvrRcvDt.max().as("srvrRcvDt") )) @@ -1406,14 +1703,14 @@ public List listCntrlHstry(String id){ )) .groupBy(hst.cntrlId) .fetch(); - + return result; - + } - - - - + + + + /** * 후처리 대상자 선정을 위한 조회 쿼리 */ @@ -1428,27 +1725,55 @@ public List listCntrlHstry(String id){ .limit(100) // 100건만 추출 .fetch(); 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; - - AnlsSmltDetailModel result = query.select(Projections.bean(AnlsSmltDetailModel.class , + + /** + * 비행관제번호[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 , - bas.flghtStDt , + bas.flghtStDt , bas.flghtEndDt , bas.cntrlStDt , - bas.cntrlEndDt , + bas.cntrlEndDt , bas.ttlTime , bas.ttlTimeType , bas.ttlDstnc , @@ -1456,7 +1781,7 @@ public List listCntrlHstry(String id){ bas.avrgSpeed , bas.avrgSpeedType , bas.bttrCnsmptn , - air.arcrftTypeCd , + air.arcrftTypeCd , air.prdctNum , air.arcrftModelNm , air.imageUrl @@ -1469,37 +1794,52 @@ public List listCntrlHstry(String id){ .on(air.useYn.eq("Y")) .where(bas.cntrlId.eq(cntrlId)) .fetchFirst(); - + return result; - - + + } - - - /*** - * 시뮬레이션 통계 + + + /** + * 비행관제 ID[CNTRL_ID]로 시뮬레이션 통계내는 SQL 기능. */ - public List anlsSmltStcs(String cntrlId){ - + QCtrCntrlHstry hstry = QCtrCntrlHstry.ctrCntrlHstry; - + StringTemplate formattedDate = Expressions.stringTemplate( "DATE_FORMAT({0}, {1})" , hstry.srvrRcvDt , ConstantImpl.create("%Y-%m-%d")); - - + + StringTemplate formattedTime = Expressions.stringTemplate( "DATE_FORMAT({0}, {1})" , hstry.srvrRcvDt , ConstantImpl.create("%H:%i")); - - - List result = query.select(Projections.bean(AnlsSmltStcsModel.class , + + + /** + * 비행관제 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"), - + hstry.speed.avg().as("avrgSpeed"), hstry.speedType.max().as("speedType"), hstry.elev.avg().as("avrgElev"), @@ -1508,85 +1848,160 @@ public List listCntrlHstry(String id){ hstry.mvDstncType.max().as("mvDstncType"), hstry.bttrLvl.max().as("maxBttrLvl"), hstry.bttrLvl.min().as("minBttrLvl") - + )) .from(hstry) .where(hstry.cntrlId.eq(cntrlId)) .groupBy(formattedDate , formattedTime) .fetch(); - + return result; } - - /*** - * 대시보드 통계(지역별) + + /** + * Top5 지역별 비행횟수 통계하는 SQL 기능. + * @param yyyymm + * @param serviceType + * @return */ - - public List mainDashStcsArea(String yyyymm){ + public List mainDashStcsArea(String yyyymm, String serviceType){ + QCtrCntrlBas bas = QCtrCntrlBas.ctrCntrlBas; QCtrCntrlHstryArea area = QCtrCntrlHstryArea.ctrCntrlHstryArea; - + QFltPlanBas fBas = QFltPlanBas.fltPlanBas; + QFltPlanCtrCntrlRel rel = QFltPlanCtrCntrlRel.fltPlanCtrCntrlRel; + StringTemplate formattedDate = Expressions.stringTemplate( "DATE_FORMAT({0}, {1})" , bas.cntrlStDt , ConstantImpl.create("%Y-%m")); - - List result = query.select(Projections.bean(MainDashStcsModel.class , - area.area1.as("typeCd"), - area.count().as("count") + BooleanBuilder builder = new BooleanBuilder(); + builder.and(area.area1.isNotNull()); + 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") )) .from(bas) .leftJoin(area) - .on(bas.cntrlId.eq(area.cntrlId)) - .on(area.actnType.eq("99")) - .where(area.area1.isNotNull()) - .where(formattedDate.eq(yyyymm)) + .on(bas.cntrlId.eq(area.cntrlId).and(area.actnType.eq("99"))) + .leftJoin(rel).on(bas.cntrlId.eq(rel.cntrlId)) + .leftJoin(fBas).on(rel.planSno.eq(fBas.planSno)) + .where(builder) .groupBy(area.area1) .orderBy(area.count().desc()) .limit(5) .fetch(); - + return result; - - + + } - - /*** - * 대시보드 통계(일자별) + + /** + * 대시보드 통계(일자별)하는 SQL 기능 + * @param yyyymm + * @param serviceType + * @return */ - - public List mainDashStcsDay(String yyyymm){ + public List mainDashStcsDay(String yyyymm, String serviceType){ QCtrCntrlBas bas = QCtrCntrlBas.ctrCntrlBas; - + QFltPlanBas fBas = QFltPlanBas.fltPlanBas; + QFltPlanCtrCntrlRel rel = QFltPlanCtrCntrlRel.fltPlanCtrCntrlRel; + StringTemplate formattedDate = Expressions.stringTemplate( "DATE_FORMAT({0}, {1})" , bas.cntrlStDt , ConstantImpl.create("%Y-%m")); - + StringTemplate formattedDate2 = Expressions.stringTemplate( "DATE_FORMAT({0}, {1})" , bas.cntrlStDt , ConstantImpl.create("%d")); - - List result = query.select(Projections.bean(MainDashStcsModel.class , + + BooleanBuilder builder = new BooleanBuilder(); + builder.and(bas.statusCd.eq("99")); + builder.and(formattedDate.eq(yyyymm)); + if(!serviceType.isEmpty()){ + 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") )) .from(bas) - .where(bas.statusCd.eq("99")) - .where(formattedDate.eq(yyyymm)) + .leftJoin(rel).on(bas.cntrlId.eq(rel.cntrlId)) + .leftJoin(fBas).on(rel.planSno.eq(fBas.planSno)) + .where(builder) .groupBy(formattedDate2) .fetch(); return result; } + /** + * 관제이력을 조회하는 SQL 입니다.. + * @param controlId + * @return + */ public List getDroneHistory(String controlId) { QCtrCntrlBas bas = QCtrCntrlBas.ctrCntrlBas; QCtrCntrlHstry hst = QCtrCntrlHstry.ctrCntrlHstry; + /** + * 비행관제번호[CNTRL_ID]로 시뮬레이션 상세정보 조회하는 SQL 입니다. + * + * SELECT + * CCB.IDNTF_NUM AS 'objectId', + * CCH.LAT AS 'lat', + * CCH.LON AS 'lon' + * 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 list = query.select(Projections.bean(GPHistoryModel.class, bas.idntfNum.as("objectId"), hst.lat.as("lat"), @@ -1600,16 +2015,21 @@ public List listCntrlHstry(String id){ return list; } - + + /** + * 그룹의 기체 정보 조회하는 SQL 입니다. + * @Cacheable은 RQ값이 같을 시 이전 구해놨던 데이터를 바로 발송하는 어노테이션입니다, 자주 쓰는 항목에 사용합니다. + * @return + */ @Cacheable(value = "group-auth") public List findByGroupInfo() { QPtyCstmrGroup pcg = QPtyCstmrGroup.ptyCstmrGroup; QPtyGroupBas pgb = QPtyGroupBas.ptyGroupBas; - String authId = jwtTokenUtil.getUserAuthByToken(); + String authId = jwtTokenUtil.getUserAuthByToken(); Integer cstmrSno = jwtTokenUtil.getCstmrSnoByToken(); List groupAuth = jwtTokenUtil.getGroupAuthByToken(); - + BooleanBuilder builder = new BooleanBuilder(); builder.and(pgb.useYn.eq("Y")); if("ADMIN".equals(authId) || "SUPER".equals(authId)) { @@ -1619,7 +2039,22 @@ public List listCntrlHstry(String id){ builder.and(pcg.aprvlYn.eq("Y")); builder.and(pcg.cstmrSno.eq(cstmrSno)); } - + + /** + * 권한에 따라 조회하는 SQL입니다. + * + * SELECT + * PGB.GROUP_ID AS 'groupId', + * PGB.GROUP_NM AS 'groupNm', + * PCG.GROUP_AUTH_CD AS 'groupAuthCd' + * 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.GROUP_AUTH_CD = 'MASTER' -- 권한이 ADMIN 혹은 SUPER일 경우 + * AND PCG.APRVL_YN = 'Y' -- 권한이 USER일 경우 + * AND PCG.CSTMR_SNO = #{cstmrSno} -- 권한이 USER일 경우 + */ List model = query.select(Projections.bean(CtrCntrlGroupModel.class, pgb.groupId.as("groupId"), pgb.groupNm.as("groupNm"), @@ -1630,9 +2065,8 @@ public List listCntrlHstry(String id){ .on(pcg.groupId.eq(pgb.groupId)) .groupBy(pgb.groupId) .where(builder) - .fetch(); - - + .fetch(); + for(CtrCntrlGroupModel list : model) { if(groupAuth != null) { for(JwtGroupModel lists : groupAuth) { @@ -1647,7 +2081,7 @@ public List listCntrlHstry(String id){ } return model; // - + // BooleanBuilder builder = new BooleanBuilder(); // builder.and(pcg.aprvlYn.eq("Y")); // @@ -1680,8 +2114,10 @@ public List listCntrlHstry(String id){ int cstmrSno = jwtTokenUtil.getCstmrSnoByToken(); String groupAuth = null; List groupAuthList = jwtTokenUtil.getGroupAuthByToken(); + BooleanBuilder builder = new BooleanBuilder(); - builder.and(arcrftBas.groupId.eq(groupId)); + builder.and(arcrftBas.groupId.eq(groupId)); + if("USER".equals(appAuth) || "ROLE_USER".equals(appAuth)) { for(JwtGroupModel list : groupAuthList) { if(list.getGroupId().equals(groupId)) { @@ -1689,10 +2125,10 @@ public List listCntrlHstry(String id){ } } if("NORMAL".equals(groupAuth)){ // 그룹권한이 노말인 경우 - builder.and(idntfBas.cstmrSno.eq(cstmrSno)); + builder.and(idntfBas.cstmrSno.eq(cstmrSno)); } } - + List arcrftList = query.select(Projections.bean(CtrCntrlGroupArcrftModel.class, // arcrftBas.arcrftSno, // arcrftBas.groupId, @@ -1714,11 +2150,11 @@ public List listCntrlHstry(String id){ idntfBas.idntfNum.like("PA%")) .where(builder) .fetch(); - + return arcrftList; //------------------------------------------- - + // List arcrftList = query.select(Projections.bean(CtrCntrlGroupArcrftModel.class, // arcrftBas.arcrftSno, // arcrftBas.groupId, @@ -1746,18 +2182,18 @@ public List listCntrlHstry(String id){ } /** - * 김포공항, 비행실적 통계 API + * 김포공항, 비행실적 통계조회하는 SQL 기능 입니다. * @param yyyymm * @return - */ + */ public List mainStcsFlight(String date, String idntfNum, String[] formatParam){ QCtrCntrlBas bas = QCtrCntrlBas.ctrCntrlBas; - + StringTemplate formattedDate = Expressions.stringTemplate( "DATE_FORMAT({0}, {1})" , bas.cntrlStDt , ConstantImpl.create(formatParam[0])); - + StringTemplate formattedDate2 = Expressions.stringTemplate( "DATE_FORMAT({0}, {1})" , bas.cntrlStDt @@ -1772,18 +2208,32 @@ public List listCntrlHstry(String id){ 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( - MainDashStcsModel.class , + MainDashStcsModel.class , formattedDate2.as("typeCd"), bas.count().as("count") ) ) .from(bas) .where(builder) - .groupBy(formattedDate2) - .fetch(); + .groupBy(formattedDate2) + .fetch(); if(result.size() <= 0){ @@ -1806,32 +2256,42 @@ public List listCntrlHstry(String id){ public List mainStcsWarningFlight(String date, String[] formatParam){ // QCtrCntrlBas bas = QCtrCntrlBas.ctrCntrlBas; QCtrCntrlWarnLog bas = QCtrCntrlWarnLog.ctrCntrlWarnLog; - + StringTemplate formattedDate = Expressions.stringTemplate( "DATE_FORMAT({0}, {1})" , bas.createDt , ConstantImpl.create(formatParam[0])); - + StringTemplate formattedDate2 = Expressions.stringTemplate( "DATE_FORMAT({0}, {1})" , bas.createDt , ConstantImpl.create(formatParam[1])); - BooleanBuilder builder = new BooleanBuilder(); - if(date != null && date.length() > 0) builder.and(formattedDate.eq(date)); + 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( - MainDashStcsModel.class , + MainDashStcsModel.class , formattedDate2.as("typeCd"), bas.cntrlId.countDistinct().as("count") ) ) .from(bas) .where(builder) - .groupBy(formattedDate2) - .fetch(); + .groupBy(formattedDate2) + .fetch(); if(result.size() <= 0){ MainDashStcsModel node = new MainDashStcsModel(); @@ -1843,24 +2303,47 @@ public List listCntrlHstry(String id){ return result; } - + + /** + * 비행완료된 관제이력 조회하는 SQL 기능. + * @param cntrlId + * @return + */ public List getCompleteInfo(String cntrlId){ - + QCtrCntrlBas qCntrlBasEntity = QCtrCntrlBas.ctrCntrlBas; QCtrCntrlHstry qCtrCntrHstry = QCtrCntrlHstry.ctrCntrlHstry; - + BooleanBuilder builder = new BooleanBuilder(); builder.and(qCtrCntrHstry.cntrlId.eq(cntrlId)); builder.and(qCntrlBasEntity.statusCd.eq("99")); - - List result = query.select(Projections.bean(CtrCntrlHstry.class , + + /** + * 비행번호[CNTRL_ID] 로 이력현황을 조회하는 SQL입니다. + * + * SELECT + * CCH.LAT , + * CCH.LON , + * CCH.SPEED , + * CCH.SPEED_TYPE , + * CCH.ELEV , + * CCH.ELEV_TYPE , + * CCH.MV_DSTNC , + * CCH.MV_DSTNC_TYPE + * FROM CTR_CNTRL_BAS CCB + * LEFT OUTER JOIN CTR_CNTRL_HSTRY CCH + * ON CCB.CNTRL_ID = CCH.CNTRL_ID + * WHERE CCH.CNTRL_ID = #{cntrlId} + * AND CCB.STATUS_CD = '99' + */ + List result = query.select(Projections.bean(CtrCntrlHstry.class , qCtrCntrHstry.lat, qCtrCntrHstry.lon , qCtrCntrHstry.speed , qCtrCntrHstry.speedType , - qCtrCntrHstry.elev , - qCtrCntrHstry.elevType , - qCtrCntrHstry.mvDstnc , + qCtrCntrHstry.elev , + qCtrCntrHstry.elevType , + qCtrCntrHstry.mvDstnc , qCtrCntrHstry.mvDstncType )) .from(qCtrCntrHstry) @@ -1869,7 +2352,7 @@ public List listCntrlHstry(String id){ .where(builder) .orderBy(qCtrCntrHstry.srvrRcvDt.asc()) .fetch(); - + return result; } @@ -1887,11 +2370,28 @@ public List listCntrlHstry(String id){ BooleanBuilder builder = new BooleanBuilder(); 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, - qCtrCntrlBas.idntfNum.as("name") // 결과 객체의 프로퍼티 이름을 지정 + qCtrCntrlBas.idntfNum.as("name") // 결과 객체의 프로퍼티 이름을 지정 ) ) .from(qCtrCntrlBas) @@ -1908,7 +2408,7 @@ public List listCntrlHstry(String id){ ).desc()) .limit(1) .fetch(); - + if(queryResult.size() > 0){ result = queryResult.get(0); @@ -1929,7 +2429,7 @@ public List listCntrlHstry(String id){ } else { FlightStcsValueModel node = new FlightStcsValueModel(); - node.setName("-"); + node.setName("-"); node.setYear("noData"); node.setMonth("noData"); node.setDay("noData"); @@ -1939,8 +2439,15 @@ public List listCntrlHstry(String id){ } 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; @@ -1955,13 +2462,30 @@ public List listCntrlHstry(String id){ 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( "CONCAT(SEC_TO_TIME(SUM(TIME_TO_SEC(TIMEDIFF({0}, {1})))))", qCtrCntrlBas.cntrlEndDt, qCtrCntrlBas.cntrlStDt - ) // 결과 객체의 프로퍼티 이름을 지정 + ) // 결과 객체의 프로퍼티 이름을 지정 ) .from(qCtrCntrlBas) .leftJoin(qFltPlanCtrCntrlRel) @@ -1972,25 +2496,51 @@ public List listCntrlHstry(String id){ .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; + QFltPlanBas qFltPlanBas = QFltPlanBas.fltPlanBas; + BooleanBuilder builder = new BooleanBuilder(); - builder.and(qCtrCntrlBas.idntfNum.eq(idntfNum)); + builder.and(qCtrCntrlBas.idntfNum.eq(idntfNum)); builder.and(qCtrCntrlBas.createDt.goe(LocalDate.now().minusMonths(1).atStartOfDay().atZone(ZoneId.of("Asia/Seoul")).toInstant())); builder.and(qCtrCntrlBas.createDt.loe(LocalDate.now().atStartOfDay().atZone(ZoneId.of("Asia/Seoul")).toInstant())); 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( + .select( Expressions.stringTemplate( "CONCAT(SEC_TO_TIME(SUM(TIME_TO_SEC(TIMEDIFF({0}, {1})))))", qCtrCntrlBas.cntrlEndDt, qCtrCntrlBas.cntrlStDt - ) // 결과 객체의 프로퍼티 이름을 지정 + ) // 결과 객체의 프로퍼티 이름을 지정 ) .from(qCtrCntrlBas) .leftJoin(qFltPlanCtrCntrlRel) @@ -2001,20 +2551,45 @@ public List listCntrlHstry(String id){ .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; QFltPlanBas qFltPlanBas = QFltPlanBas.fltPlanBas; BooleanBuilder builder = new BooleanBuilder(); - builder.and(qCtrCntrlBas.idntfNum.eq(idntfNum)); + builder.and(qCtrCntrlBas.idntfNum.eq(idntfNum)); builder.and(qCtrCntrlBas.createDt.goe(LocalDate.now().minusYears(1).atStartOfDay().atZone(ZoneId.of("Asia/Seoul")).toInstant())); builder.and(qCtrCntrlBas.createDt.loe(LocalDate.now().atStartOfDay().atZone(ZoneId.of("Asia/Seoul")).toInstant())); 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( + .select( Expressions.stringTemplate( "CONCAT(SEC_TO_TIME(SUM(TIME_TO_SEC(TIMEDIFF({0}, {1})))))", qCtrCntrlBas.cntrlEndDt, @@ -2045,11 +2620,11 @@ public List listCntrlHstry(String id){ if(serviceType != null && !(serviceType.equals(""))) builder.and(qFltPlanBas.serviceType.eq(serviceType)); if(authCheck) builder.and(qFltPlanBas.cstmrSno.eq(jwtTokenUtil.getCstmrSnoByToken())); - + List queryResult = query .select( Projections.bean(FlightStcsValueModel.class, - qCtrCntrlBas.idntfNum.as("name") // 결과 객체의 프로퍼티 이름을 지정 + qCtrCntrlBas.idntfNum.as("name") // 결과 객체의 프로퍼티 이름을 지정 ) ) .from(qCtrCntrlBas) @@ -2061,7 +2636,7 @@ public List listCntrlHstry(String id){ .groupBy(qCtrCntrlBas.idntfNum) .orderBy(qCtrCntrlBas.ttlDstnc.sum().desc()) .limit(1) - .fetch(); + .fetch(); if(queryResult.size() > 0){ result = queryResult.get(0); @@ -2071,7 +2646,7 @@ public List listCntrlHstry(String id){ Double year = getFltDistanceYear(idntfNum, authCheck, serviceType); Double month = getFltDistanceMonth(idntfNum, authCheck, serviceType); Double day =getFltDistanceDay(idntfNum, authCheck, serviceType); - + year = year == null ? 0.0 : year; month = month == null ? 0.0 : month; day = day == null ? 0.0 : day; @@ -2082,13 +2657,13 @@ public List listCntrlHstry(String id){ result.setDay(day); } else { FlightStcsValueModel node = new FlightStcsValueModel(); - node.setName("-"); + node.setName("-"); node.setYear("noData"); node.setMonth("noData"); node.setDay("noData"); result = node; - } + } return result; } @@ -2108,8 +2683,8 @@ public List listCntrlHstry(String id){ .eq(LocalDate.now().toString())); return query - .select( - qCtrCntrlBas.ttlDstnc.sum() // 결과 객체의 프로퍼티 이름을 지정 + .select( + qCtrCntrlBas.ttlDstnc.sum() // 결과 객체의 프로퍼티 이름을 지정 ) .from(qCtrCntrlBas) .leftJoin(qFltPlanCtrCntrlRel) @@ -2126,14 +2701,14 @@ public List listCntrlHstry(String id){ QFltPlanBas qFltPlanBas = QFltPlanBas.fltPlanBas; BooleanBuilder builder = new BooleanBuilder(); - builder.and(qCtrCntrlBas.idntfNum.eq(idntfNum)); + builder.and(qCtrCntrlBas.idntfNum.eq(idntfNum)); builder.and(qCtrCntrlBas.createDt.goe(LocalDate.now().minusMonths(1).atStartOfDay().atZone(ZoneId.of("Asia/Seoul")).toInstant())); builder.and(qCtrCntrlBas.createDt.loe(LocalDate.now().atStartOfDay().atZone(ZoneId.of("Asia/Seoul")).toInstant())); if(serviceType != null && !(serviceType.equals(""))) builder.and(qFltPlanBas.serviceType.eq(serviceType)); if(authCheck) builder.and(qFltPlanBas.cstmrSno.eq(jwtTokenUtil.getCstmrSnoByToken())); return query - .select( + .select( qCtrCntrlBas.ttlDstnc.sum() // 결과 객체의 프로퍼티 이름을 지정 ) @@ -2152,15 +2727,15 @@ public List listCntrlHstry(String id){ QFltPlanBas qFltPlanBas = QFltPlanBas.fltPlanBas; BooleanBuilder builder = new BooleanBuilder(); - builder.and(qCtrCntrlBas.idntfNum.eq(idntfNum)); + builder.and(qCtrCntrlBas.idntfNum.eq(idntfNum)); builder.and(qCtrCntrlBas.createDt.goe(LocalDate.now().minusYears(1).atStartOfDay().atZone(ZoneId.of("Asia/Seoul")).toInstant())); builder.and(qCtrCntrlBas.createDt.loe(LocalDate.now().atStartOfDay().atZone(ZoneId.of("Asia/Seoul")).toInstant())); if(serviceType != null && !(serviceType.equals(""))) builder.and(qFltPlanBas.serviceType.eq(serviceType)); if(authCheck) builder.and(qFltPlanBas.cstmrSno.eq(jwtTokenUtil.getCstmrSnoByToken())); return query - .select( - qCtrCntrlBas.ttlDstnc.sum() // 결과 객체의 프로퍼티 이름을 지정 + .select( + qCtrCntrlBas.ttlDstnc.sum() // 결과 객체의 프로퍼티 이름을 지정 ) .from(qCtrCntrlBas) .leftJoin(qFltPlanCtrCntrlRel) @@ -2185,7 +2760,7 @@ public List listCntrlHstry(String id){ BooleanBuilder builder = new BooleanBuilder(); if(serviceType != null && !(serviceType.equals(""))) builder.and(qFltPlanBas.serviceType.eq(serviceType)); if(authCheck) builder.and(qFltPlanBas.cstmrSno.eq(jwtTokenUtil.getCstmrSnoByToken())); - + List queryResult = query .select( Projections.bean(FlightStcsValueModel.class, @@ -2203,7 +2778,7 @@ public List listCntrlHstry(String id){ .orderBy(qCtrCntrlBas.cntrlId.count().desc()) .limit(1) .fetch(); - + if(queryResult.size() > 0){ result = queryResult.get(0); @@ -2214,7 +2789,7 @@ public List listCntrlHstry(String id){ result.setDay(getFltCountDay(idntfNum, authCheck, serviceType)); } else { FlightStcsValueModel node = new FlightStcsValueModel(); - node.setName("-"); + node.setName("-"); node.setYear("noData"); node.setMonth("noData"); node.setDay("noData"); @@ -2236,13 +2811,13 @@ public List listCntrlHstry(String id){ builder.and(qCtrCntrlBas.idntfNum.eq(idntfNum)); builder.and(Expressions.stringTemplate("DATE_FORMAT({0}, {1})", qCtrCntrlBas.createDt, dateFormat) .eq(LocalDate.now().toString())); - + if(serviceType != null && !(serviceType.equals(""))) builder.and(qFltPlanBas.serviceType.eq(serviceType)); if(authCheck) builder.and(qFltPlanBas.cstmrSno.eq(jwtTokenUtil.getCstmrSnoByToken())); return query - .select( - qCtrCntrlBas.cntrlId.count() // 결과 객체의 프로퍼티 이름을 지정 + .select( + qCtrCntrlBas.cntrlId.count() // 결과 객체의 프로퍼티 이름을 지정 ) .from(qCtrCntrlBas) .leftJoin(qFltPlanCtrCntrlRel) @@ -2259,14 +2834,14 @@ public List listCntrlHstry(String id){ QFltPlanBas qFltPlanBas = QFltPlanBas.fltPlanBas; BooleanBuilder builder = new BooleanBuilder(); - builder.and(qCtrCntrlBas.idntfNum.eq(idntfNum)); + builder.and(qCtrCntrlBas.idntfNum.eq(idntfNum)); builder.and(qCtrCntrlBas.createDt.goe(LocalDate.now().minusMonths(1).atStartOfDay().atZone(ZoneId.of("Asia/Seoul")).toInstant())); builder.and(qCtrCntrlBas.createDt.loe(LocalDate.now().atStartOfDay().atZone(ZoneId.of("Asia/Seoul")).toInstant())); if(serviceType != null && !(serviceType.equals(""))) builder.and(qFltPlanBas.serviceType.eq(serviceType)); if(authCheck) builder.and(qFltPlanBas.cstmrSno.eq(jwtTokenUtil.getCstmrSnoByToken())); return query - .select( + .select( qCtrCntrlBas.cntrlId.count() // 결과 객체의 프로퍼티 이름을 지정 ) .from(qCtrCntrlBas) @@ -2284,15 +2859,15 @@ public List listCntrlHstry(String id){ QFltPlanBas qFltPlanBas = QFltPlanBas.fltPlanBas; BooleanBuilder builder = new BooleanBuilder(); - builder.and(qCtrCntrlBas.idntfNum.eq(idntfNum)); + builder.and(qCtrCntrlBas.idntfNum.eq(idntfNum)); builder.and(qCtrCntrlBas.createDt.goe(LocalDate.now().minusYears(1).atStartOfDay().atZone(ZoneId.of("Asia/Seoul")).toInstant())); builder.and(qCtrCntrlBas.createDt.loe(LocalDate.now().atStartOfDay().atZone(ZoneId.of("Asia/Seoul")).toInstant())); if(serviceType != null && !(serviceType.equals(""))) builder.and(qFltPlanBas.serviceType.eq(serviceType)); if(authCheck) builder.and(qFltPlanBas.cstmrSno.eq(jwtTokenUtil.getCstmrSnoByToken())); return query - .select( - qCtrCntrlBas.cntrlId.count() // 결과 객체의 프로퍼티 이름을 지정 + .select( + qCtrCntrlBas.cntrlId.count() // 결과 객체의 프로퍼티 이름을 지정 ) .from(qCtrCntrlBas) .leftJoin(qFltPlanCtrCntrlRel) @@ -2312,31 +2887,49 @@ public List listCntrlHstry(String id){ * @param formatParam * @return */ - public List fltTimeStcs(String date, String serviceType, boolean authCheck, String[] formatParam){ + public List fltTimeStcs(String date, String serviceType, boolean authCheck, String[] formatParam){ QCtrCntrlBas qCtrCntrlBas = QCtrCntrlBas.ctrCntrlBas; QFltPlanCtrCntrlRel qFltPlanCtrCntrlRel = QFltPlanCtrCntrlRel.fltPlanCtrCntrlRel; QFltPlanBas qFltPlanBas = QFltPlanBas.fltPlanBas; - + StringTemplate formattedDate = Expressions.stringTemplate( "DATE_FORMAT({0}, {1})" , qCtrCntrlBas.createDt , ConstantImpl.create(formatParam[0])); - + StringTemplate formattedDate2 = Expressions.stringTemplate( "DATE_FORMAT({0}, {1})" , qCtrCntrlBas.createDt , ConstantImpl.create(formatParam[1])); - BooleanBuilder builder = new BooleanBuilder(); - if(date != null && date.length() > 0) builder.and(formattedDate.eq(date)); + BooleanBuilder builder = new BooleanBuilder(); + if(date != null && date.length() > 0) builder.and(formattedDate.eq(date)); 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( - FlightStcsValueModel.class , + FlightStcsValueModel.class , formattedDate2.as("name"), Expressions.stringTemplate( "CONCAT(SEC_TO_TIME(SUM(TIME_TO_SEC(TIMEDIFF({0}, {1})))))", @@ -2351,8 +2944,8 @@ public List listCntrlHstry(String id){ .leftJoin(qFltPlanBas) .on(qFltPlanCtrCntrlRel.planSno.eq(qFltPlanBas.planSno)) .where(builder) - .groupBy(formattedDate2) - .fetch(); + .groupBy(formattedDate2) + .fetch(); if(result.size() <= 0){ FlightStcsValueModel node = new FlightStcsValueModel(); @@ -2377,26 +2970,44 @@ public List listCntrlHstry(String id){ QCtrCntrlBas qCtrCntrlBas = QCtrCntrlBas.ctrCntrlBas; QFltPlanCtrCntrlRel qFltPlanCtrCntrlRel = QFltPlanCtrCntrlRel.fltPlanCtrCntrlRel; QFltPlanBas qFltPlanBas = QFltPlanBas.fltPlanBas; - + StringTemplate formattedDate = Expressions.stringTemplate( "DATE_FORMAT({0}, {1})" , qCtrCntrlBas.createDt , ConstantImpl.create(formatParam[0])); - + StringTemplate formattedDate2 = Expressions.stringTemplate( "DATE_FORMAT({0}, {1})" , qCtrCntrlBas.createDt , ConstantImpl.create(formatParam[1])); - BooleanBuilder builder = new BooleanBuilder(); + BooleanBuilder builder = new BooleanBuilder(); if(date != null && date.length() > 0) builder.and(formattedDate.eq(date)); 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( - FlightStcsValueModel.class , + FlightStcsValueModel.class , formattedDate2.as("name"), qCtrCntrlBas.ttlDstnc.sum().as("value") ) @@ -2407,9 +3018,9 @@ public List listCntrlHstry(String id){ .leftJoin(qFltPlanBas) .on(qFltPlanCtrCntrlRel.planSno.eq(qFltPlanBas.planSno)) .where(builder) - .groupBy(formattedDate2) + .groupBy(formattedDate2) .fetch(); - + if(result.size() <= 0){ FlightStcsValueModel node = new FlightStcsValueModel(); @@ -2433,26 +3044,44 @@ public List listCntrlHstry(String id){ QCtrCntrlBas qCtrCntrlBas = QCtrCntrlBas.ctrCntrlBas; QFltPlanCtrCntrlRel qFltPlanCtrCntrlRel = QFltPlanCtrCntrlRel.fltPlanCtrCntrlRel; QFltPlanBas qFltPlanBas = QFltPlanBas.fltPlanBas; - + StringTemplate formattedDate = Expressions.stringTemplate( "DATE_FORMAT({0}, {1})" , qCtrCntrlBas.createDt , ConstantImpl.create(formatParam[0])); - + StringTemplate formattedDate2 = Expressions.stringTemplate( "DATE_FORMAT({0}, {1})" , qCtrCntrlBas.createDt , ConstantImpl.create(formatParam[1])); - BooleanBuilder builder = new BooleanBuilder(); + BooleanBuilder builder = new BooleanBuilder(); if(date != null && date.length() > 0) builder.and(formattedDate.eq(date)); 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( - FlightStcsValueModel.class , + FlightStcsValueModel.class , formattedDate2.as("name"), qCtrCntrlBas.cntrlId.count().as("value") ) @@ -2463,9 +3092,9 @@ public List listCntrlHstry(String id){ .leftJoin(qFltPlanBas) .on(qFltPlanCtrCntrlRel.planSno.eq(qFltPlanBas.planSno)) .where(builder) - .groupBy(formattedDate2) + .groupBy(formattedDate2) .fetch(); - + if(result.size() <= 0){ FlightStcsValueModel node = new FlightStcsValueModel(); @@ -2489,17 +3118,36 @@ public List listCntrlHstry(String id){ QCtrCntrlBas qCtrCntrlBas = QCtrCntrlBas.ctrCntrlBas; QFltPlanCtrCntrlRel qFltPlanCtrCntrlRel = QFltPlanCtrCntrlRel.fltPlanCtrCntrlRel; QFltPlanBas qFltPlanBas = QFltPlanBas.fltPlanBas; - + StringTemplate formattedDate = Expressions.stringTemplate( "DATE_FORMAT({0}, {1})" , qCtrCntrlBas.createDt , ConstantImpl.create(formatParam[0])); - BooleanBuilder builder = new BooleanBuilder(); + BooleanBuilder builder = new BooleanBuilder(); if(date != null && date.length() > 0) builder.and(formattedDate.eq(date)); 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, @@ -2525,7 +3173,7 @@ public List listCntrlHstry(String id){ ).desc()) .limit(5) .fetch(); - + if(result.size() <= 0){ FlightStcsValueModel node = new FlightStcsValueModel(); @@ -2544,8 +3192,8 @@ public List listCntrlHstry(String id){ * @param formatParam * @return */ - public List fltTopDistanceStcs(String date, String serviceType, boolean authCheck, String[] formatParam){ - + public List fltTopDistanceStcs(String date, String serviceType, boolean authCheck, String[] formatParam){ + QCtrCntrlBas qCtrCntrlBas = QCtrCntrlBas.ctrCntrlBas; QFltPlanCtrCntrlRel qFltPlanCtrCntrlRel = QFltPlanCtrCntrlRel.fltPlanCtrCntrlRel; QFltPlanBas qFltPlanBas = QFltPlanBas.fltPlanBas; @@ -2555,12 +3203,30 @@ public List listCntrlHstry(String id){ , qCtrCntrlBas.createDt , ConstantImpl.create(formatParam[0])); - BooleanBuilder builder = new BooleanBuilder(); + BooleanBuilder builder = new BooleanBuilder(); if(date != null && date.length() > 0) builder.and(formattedDate.eq(date)); 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, @@ -2578,7 +3244,7 @@ public List listCntrlHstry(String id){ .orderBy(qCtrCntrlBas.ttlDstnc.sum().desc()) .limit(5) .fetch(); - + if(result.size() <= 0){ FlightStcsValueModel node = new FlightStcsValueModel(); @@ -2608,11 +3274,30 @@ public List listCntrlHstry(String id){ , qCtrCntrlBas.createDt , ConstantImpl.create(formatParam[0])); - BooleanBuilder builder = new BooleanBuilder(); + BooleanBuilder builder = new BooleanBuilder(); if(date != null && date.length() > 0) builder.and(formattedDate.eq(date)); 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, @@ -2630,7 +3315,7 @@ public List listCntrlHstry(String id){ .orderBy(qCtrCntrlBas.cntrlId.count().desc()) .limit(5) .fetch(); - + if(result.size() <= 0){ FlightStcsValueModel node = new FlightStcsValueModel(); @@ -2642,42 +3327,125 @@ public List listCntrlHstry(String id){ return result; } - - - public List completeFlight(Instant start, Instant end) { - // Tuple 여러 값을 담을 수 있는 클래스, 여러 필드를 한꺼번에 반환해야 할 때 유용하다. - QFltPlanCtrCntrlRel fpccr = QFltPlanCtrCntrlRel.fltPlanCtrCntrlRel; - QFltPlanBas fpb = QFltPlanBas.fltPlanBas; - QCtrCntrlBas ccb = QCtrCntrlBas.ctrCntrlBas; - return query - .select( - fpb.planSno, - fpb.aprvlYn, - fpb.aprvlDt, - ccb.cntrlId, - ccb.statusCd, - ccb.cntrlStDt, - ccb.cntrlEndDt - ) - .from(fpb) - .leftJoin(fpccr).on(fpb.planSno.eq(fpccr.planSno)) - .leftJoin(ccb).on(fpccr.cntrlId.eq(ccb.cntrlId)) - .where( - fpb.aprvlYn.eq("Y"), - fpccr.planSno.isNotNull(), - ccb.statusCd.eq("99"), - ccb.cntrlEndDt.between(start,end) - ) - .fetch(); + /** + * 시작일, 끝일 조건으로 비행관련 통계데이터를 조회하는 SQL 기능. + * @param start + * @param end + * @param serviceType + * @return + */ + public List completeFlight(Instant start, Instant end, String serviceType) { + // Tuple 여러 값을 담을 수 있는 클래스, 여러 필드를 한꺼번에 반환해야 할 때 유용하다. + QFltPlanCtrCntrlRel fpccr = QFltPlanCtrCntrlRel.fltPlanCtrCntrlRel; + QFltPlanBas fpb = QFltPlanBas.fltPlanBas; + QCtrCntrlBas ccb = QCtrCntrlBas.ctrCntrlBas; + + BooleanBuilder builder = new BooleanBuilder(); + builder.and(fpb.aprvlYn.eq("Y")); + builder.and(fpccr.planSno.isNotNull()); + builder.and(ccb.statusCd.eq("99")); +// builder.and(ccb.cntrlEndDt.between(start, end)); + builder.and(fpb.schFltStDt.lt(end)); + 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, + fpb.aprvlYn, + fpb.aprvlDt, + ccb.cntrlId, + ccb.statusCd, + ccb.cntrlStDt, + ccb.cntrlEndDt + ) + .from(fpb) + .leftJoin(fpccr).on(fpb.planSno.eq(fpccr.planSno)) + .leftJoin(ccb).on(fpccr.cntrlId.eq(ccb.cntrlId)) + .where(builder) + .groupBy(fpccr.planSno) + .fetch(); + + } - } + /** + * 미 비행건수 조회하는 SQL 기능. + * @param start + * @param end + * @param serviceType + * @return + */ + public List notFlight(Instant start, Instant end, String serviceType) { - public List notFlight(Instant start, Instant end){ QCtrCntrlBas ccb = QCtrCntrlBas.ctrCntrlBas; QFltPlanCtrCntrlRel fpccr = QFltPlanCtrCntrlRel.fltPlanCtrCntrlRel; QFltPlanBas fpb = QFltPlanBas.fltPlanBas; + BooleanBuilder builder = new BooleanBuilder(); + builder.and(fpb.aprvlYn.eq("Y")); + builder.and(fpccr.planSno.isNull()); + builder.and(ccb.statusCd.isNull()); + builder.and(ccb.cntrlId.isNull()); +// builder.and(fpb.aprvlDt.between(start, end)); + builder.and(fpb.schFltStDt.lt(end)); + 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, @@ -2690,15 +3458,9 @@ public List listCntrlHstry(String id){ .from(fpb) .leftJoin(fpccr).on(fpb.planSno.eq(fpccr.planSno)) .leftJoin(ccb).on(fpccr.cntrlId.eq(ccb.cntrlId)) - .where( - fpb.aprvlYn.eq("Y"), - fpccr.planSno.isNull(), - ccb.statusCd.isNull(), - ccb.cntrlId.isNull(), - fpb.aprvlDt.between(start, end) - ) + .where(builder) .fetch(); } - + } 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 fd568cae..86e20602 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, @@ -284,13 +430,33 @@ public class CtrCntrlWarnLogQueryRepository { return result; } - public List currentStcs(String groupId, boolean authCheck, String cate){ + /** + * 카테고리[cate]별 일일비정상황황에 대한 통계값을 구하는 SQL 기능. + * @param groupId + * @param cate + * @return + */ + public List currentStcs(String groupId, String cate){ QFltPlanBas qFltPlanBas = QFltPlanBas.fltPlanBas; QFltPlanCtrCntrlRel qFltPlanCtrCntrlRel = QFltPlanCtrCntrlRel.fltPlanCtrCntrlRel; QCtrCntrlWarnLog qCtrCntrlWarnLog = QCtrCntrlWarnLog.ctrCntrlWarnLog; - BooleanBuilder builder = getCurrentBooleanBuilder(groupId, authCheck, cate, qFltPlanBas, qCtrCntrlWarnLog); - + 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,11 +476,20 @@ public class CtrCntrlWarnLogQueryRepository { return stcsValues; } - private BooleanBuilder getCurrentBooleanBuilder(String groupId, boolean authCheck, String cate, QFltPlanBas qFltPlanBas, QCtrCntrlWarnLog qCtrCntrlWarnLog){ + /** + * 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(); - if(groupId != null && !(groupId.equals("")))builder.and(qFltPlanBas.groupId.eq(groupId)); - if(authCheck) builder.and(qFltPlanBas.cstmrSno.eq(jwtTokenUtil.getCstmrSnoByToken())); + if(serviceType != null && !serviceType.isEmpty())builder.and(qFltPlanBas.serviceType.eq(serviceType)); +// if(authCheck) builder.and(qFltPlanBas.cstmrSno.eq(jwtTokenUtil.getCstmrSnoByToken())); String dateFormat = "%Y-%m-%d"; BooleanExpression dateExpression = null; diff --git a/pav-server/src/main/java/com/palnet/biz/jpa/repository/flt/FltCptAuthAdminDistrictBasQueryRepository.java b/pav-server/src/main/java/com/palnet/biz/jpa/repository/flt/FltCptAuthAdminDistrictBasQueryRepository.java new file mode 100644 index 00000000..0a6bb64c --- /dev/null +++ b/pav-server/src/main/java/com/palnet/biz/jpa/repository/flt/FltCptAuthAdminDistrictBasQueryRepository.java @@ -0,0 +1,42 @@ +package com.palnet.biz.jpa.repository.flt; + +import java.util.List; + +import org.springframework.stereotype.Repository; + +import com.palnet.biz.jpa.entity.FltCptAuthBas; +import com.palnet.biz.jpa.entity.QFltCptAuthAdmDistrictRel; +import com.palnet.biz.jpa.entity.QFltCptAuthBas; +import com.querydsl.core.BooleanBuilder; +import com.querydsl.jpa.impl.JPAQueryFactory; + +import lombok.RequiredArgsConstructor; + +@Repository +@RequiredArgsConstructor +public class FltCptAuthAdminDistrictBasQueryRepository { + + private final JPAQueryFactory query; + + public List geFltCptAuthBas(String cd){ + + QFltCptAuthAdmDistrictRel qFltCptAuthAdmDistrictRel = QFltCptAuthAdmDistrictRel.fltCptAuthAdmDistrictRel; + QFltCptAuthBas qFltCptAuthBas = QFltCptAuthBas.fltCptAuthBas; + + BooleanBuilder builder = new BooleanBuilder(); + builder.and(qFltCptAuthAdmDistrictRel.id.ADM_CD.like(cd+"%")); + + List result = query + .selectDistinct( + qFltCptAuthBas + ) + .from(qFltCptAuthAdmDistrictRel) + .leftJoin(qFltCptAuthBas) + .on(qFltCptAuthAdmDistrictRel.id.CPT_AUTH_CODE.eq(qFltCptAuthBas.cptAuthCode)) + .where(builder) + .fetch(); + + + return result; + } +} diff --git a/pav-server/src/main/java/com/palnet/biz/jpa/repository/flt/FltPlanBasRepository.java b/pav-server/src/main/java/com/palnet/biz/jpa/repository/flt/FltPlanBasRepository.java index 90cfc1d4..dfb9198d 100644 --- a/pav-server/src/main/java/com/palnet/biz/jpa/repository/flt/FltPlanBasRepository.java +++ b/pav-server/src/main/java/com/palnet/biz/jpa/repository/flt/FltPlanBasRepository.java @@ -19,11 +19,12 @@ public interface FltPlanBasRepository extends JpaRepository List findBySchFltStDtLessThanEqualAndSchFltEndDtGreaterThanEqualAndAprvlYnAndDelYn(Instant schFltEndDt, Instant schFltStDt, String aprvlYn, String delYn); - @Query("select f from FltPlanBas f " + + @Query(value = "select f from FltPlanBas f " + "where ((SCH_FLT_ST_DT <= :schFltStDt and SCH_FLT_END_DT >= :schFltEndDt)" + "or (SCH_FLT_ST_DT >= :schFltStDt and (SCH_FLT_ST_DT <= :schFltEndDt and SCH_FLT_END_DT >= :schFltEndDt ))" + "or ((SCH_FLT_ST_DT <= :schFltStDt and SCH_FLT_END_DT >= :schFltStDt) and SCH_FLT_END_DT <= :schFltEndDt)" - + "or (SCH_FLT_ST_DT >= :schFltStDt and SCH_FLT_END_DT <= :schFltEndDt)) and DEL_YN='N'") + + "or (SCH_FLT_ST_DT >= :schFltStDt and SCH_FLT_END_DT <= :schFltEndDt)) and DEL_YN='N'" + , nativeQuery = true) List findByStartEndDate(@Param("schFltStDt") Date schFltStDt, @Param("schFltEndDt") Date schFltEndDt); @@ -57,4 +58,9 @@ public interface FltPlanBasRepository extends JpaRepository List findApprovedFlightPlansByApprovalDate(Instant startDate, Instant endDate); int countByAprvlYnAndAprvlDtBetween(String aprvlYn, Instant startDate, Instant endDate); + + int countByAprvlYnAndAprvlDtBetweenAndServiceType(String aprvlYn, Instant startDate, Instant endDate, String serviceType); + + int countByAprvlYnAndSchFltStDtLessThanAndSchFltEndDtGreaterThanEqualAndServiceType(String aprvlYn, Instant targetEndDate, Instant targetStDate, String serviceType); + int countByAprvlYnAndSchFltStDtLessThanAndSchFltEndDtGreaterThanEqual(String aprvlYn, Instant targetEndDate, Instant targetStDate); } 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 4d1e14d9..3db1db28 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 @@ -46,7 +46,13 @@ public class FltPlanQueryRepository { private final JwtTokenUtil jwtTokenUtil; - // 비행계획서 목록 + /** + * 비행계획서 목록 조회하는 SQL 기능. + * @param rq + * @param masterAccount + * @param pageable + * @return + */ // TODO 현재 모두 조회 - 권한에 따른 조회 필요 public PageImpl listPlan(BasFlightPlanListRq rq, String masterAccount, Pageable pageable) { QFltPlanBas bas = QFltPlanBas.fltPlanBas; @@ -77,6 +83,53 @@ public class FltPlanQueryRepository { builder.and(bas.delYn.ne("Y")); + /** + * 승인값[aprvlYn] 조건인지, + * 권한이 유저일 경우 유저번호[cstmrNo] 조건인지, + * 삭제된 값[delYn] 조건인지, + * 그룹[groupId] 조건인지 확인하여 조회하는 SQL입니다. + * + * SELECT + * FPB.PLAN_SNO , + * FPB.GROUP_ID , + * FPB.CSTMR_SNO , + * FPB.MEMBER_NAME , + * FPB.EMAIL , + * FPB.HPNO , + * FPB.CLNCD , + * FPB.ADDR , + * FPB.ADDR_DTL_CN , + * FPB.ZIP , + * FPB.SCH_FLT_ST_DT , + * FPB.SCH_FLT_END_DT , + * FPB.FLT_PURPOSE , + * FPB.APRVL_YN , + * FPB.DEL_YN , + * FPB.CREATE_USER_ID , + * FPB.CREATE_DT , + * FPB.UPDATE_USER_ID , + * FPB.UPDATE_DT , + * FPB.CORP_REG_YN , + * FPB.SERVICE_TYPE , + * FPA.PLAN_AREA_SNO , + * FPA.PLAN_SNO , + * FPA.AREA_TYPE , + * FPA.FLT_METHOD , + * FPA.BUFFER_ZONE , + * FPA.FLT_ELEV , + * FPA.CREATE_USER_ID , + * FPA.CREATE_DT , + * FPA.UPDATE_USER_ID , + * FPA.UPDATE_DT + * FROM FLT_PLAN_BAS FPB + * LEFT OUTER JOIN FLT_PLAN_AREA FPA + * ON FPB.PLAN_SNO = FPA.PLAN_SNO + * WHERE FPB.GROUP_ID = #{groupId} + * AND FPB.CSTMR_SNO = #{cstmrSno} -- 유저권한[masterAccount]값이 'NORMAL'일경우, cstmrSno값이 있을 경우 + * AND FPB.APRVL_YN = #{aprvlYn} + * AND FPB.DEL_YN != 'Y' + * LIMIT #{pageSize} OFFSET #{offset} + */ List r = query .from(bas) .leftJoin(area) @@ -160,6 +213,23 @@ public class FltPlanQueryRepository { } builder.and(bas.delYn.ne("Y")); + /** + * 승인값[aprvlYn] 조건인지, + * 권한이 유저일 경우 유저번호[cstmrNo] 조건인지, + * 삭제된 값[delYn] 조건인지, + * 그룹[groupId] 조건인지 확인하여 조회하는 SQL입니다. + * + * SELECT + * COUNT(*) + * FROM FLT_PLAN_BAS FPB + * LEFT OUTER JOIN FLT_PLAN_AREA FPA + * ON FPB.PLAN_SNO = FPA.PLAN_SNO + * WHERE FPB.GROUP_ID = #{groupId} + * AND FPB.CSTMR_SNO = #{cstmrSno} -- 유저권한[masterAccount]값이 'NORMAL'일경우, cstmrSno값이 있을 경우 + * AND FPB.APRVL_YN = #{aprvlYn} + * AND FPB.DEL_YN != 'Y' + * LIMIT #{pageSize} OFFSET #{offset} + */ List r = query .from(bas) .leftJoin(area) @@ -346,7 +416,11 @@ public class FltPlanQueryRepository { return list; } - // 조종사 조회 + /** + * 그룹아이디[groupId]로 조종사 조회하는 SQL기능. + * @param groupId + * @return + */ public List listPilot(String groupId) { // QPtyCstmrBas bas = QPtyCstmrBas.ptyCstmrBas; QPtyCstmrDtl dtl = QPtyCstmrDtl.ptyCstmrDtl; @@ -356,6 +430,26 @@ public class FltPlanQueryRepository { BooleanBuilder builder = new BooleanBuilder(); builder.and(group.groupId.eq(groupId)); + /** + * 그룹 아이디[groupId]로 그룹에 있는 조종사 정보를 조회하는 SQL입니다. + * + * SELECT + * PGB.GROUP_NM , + * PCD.CSTMR_SNO , + * PCD.MEMBER_NAME , + * PCD.EMAIL , + * PCD.HPNO , + * PCD.CLNCD , + * PCD.ADDR , + * PCD.ADDR_DTL_CN , + * PCD.ZIP + * FROM PTY_CSTMR_DTL PCD + * LEFT OUTER JOIN PTY_CSTMR_GROUP PCG + * ON PCD.CSTMR_SNO = PCG.CSTMR_SNO + * LEFT OUTER JOIN PTY_GROUP_BAS PGB + * ON PCG.GROUP_ID = PGB.GROUP_ID + * WHERE PCG.GROUP_ID = #{groupId} + */ List r = query .select(Projections.bean( BasFlightPlanPilotModel.class, @@ -378,8 +472,12 @@ public class FltPlanQueryRepository { .fetch(); return r; } - - // 기체 조회 + + /** + * 그룹아이디[groupId]로 기체 조회하는 SQL기능. + * @param groupId + * @return + */ public List listArcrft(String groupId) { QComArcrftBas arcrft = QComArcrftBas.comArcrftBas; QPtyGroupBas group = QPtyGroupBas.ptyGroupBas; @@ -388,6 +486,32 @@ public class FltPlanQueryRepository { BooleanBuilder builder = new BooleanBuilder(); builder.and(group.groupId.eq(groupId)).and(idntf.idntfNum.isNotNull()); + /** + * 그룹아이디[groupId] 조건으로 기체정보를 조회하는 SQL입니다. + * + * SELECT + * CAB.ARCRFT_SNO , + * CAB.ARCRFT_MODEL_NM , + * CAB.ARCRFT_TYPE_CD , + * CAB.PRDCT_NUM , + * CAB.PRDCT_CMPN_NM , + * CAB.PRDCT_DATE , + * CAB.USE_YN , + * CAB.CREATE_USER_ID , + * PGB.GROUP_ID , + * PGB.GROUP_NM , + * PGB.GROUP_TYPE_CD , + * CIB.OWNER_NM , + * CIB.HPNO , + * CIB.IDNTF_TYPE_CD + * FROM COM_ARCRFT_BAS CAB + * LEFT OUTER JOIN PTY_GROUP_BAS PGB + * ON CAB.GROUP_ID = PGB.GROUP_ID + * LEFT OUTER JOIN COM_IDNTF_BAS CIB + * ON CAB.ARCRFT_SNO = CIB.ARCRFT_SNO + * WHERE PGB.GROUP_ID = #{groupId} + * AND CIB.IDNTF_NUM IS NOT NULL + */ List models = query.select(Projections.bean( BasFlightPlanArcrftModel.class, arcrft.arcrftSno, @@ -417,11 +541,23 @@ public class FltPlanQueryRepository { return models; } + /** + * 승인관련된 비행계획서를 조회하는 SQL기능 입니다. + * @param rq + * @param masterAccount + * @param pageable + * @return + */ public PageImpl aprvList(BasFlightPlanListRq rq, String masterAccount, Pageable pageable) { QFltPlanBas bas = QFltPlanBas.fltPlanBas; QFltPlanArea area = QFltPlanArea.fltPlanArea; BooleanBuilder builder = new BooleanBuilder(); // if (userAccount.equals("CREATER") || userAccount.equals("ADMIN")) { + + /* + 권한이 SUPER, ADMIN일시 그룹 전체 조회, + 권한이 USER 일시 자기 항목만 조회 + */ if (masterAccount != null) { if (masterAccount.equals("SPUER") || masterAccount.equals("ADMIN")) { builder.and(bas.groupId.in(rq.getGroupId())); @@ -438,6 +574,53 @@ public class FltPlanQueryRepository { } builder.and(bas.delYn.ne("Y")); + /** + * 승인값[aprvlYn] 조건인지, + * 권한이 유저일 경우 유저번호[cstmrNo] 조건인지, + * 삭제된 값[delYn] 조건인지, + * 그룹[groupId] 조건인지 확인하여 조회하는 SQL입니다. + * + * SELECT + * FPB.PLAN_SNO , + * FPB.GROUP_ID , + * FPB.CSTMR_SNO , + * FPB.MEMBER_NAME , + * FPB.EMAIL , + * FPB.HPNO , + * FPB.CLNCD , + * FPB.ADDR , + * FPB.ADDR_DTL_CN , + * FPB.ZIP , + * FPB.SCH_FLT_ST_DT , + * FPB.SCH_FLT_END_DT , + * FPB.FLT_PURPOSE , + * FPB.APRVL_YN , + * FPB.DEL_YN , + * FPB.CREATE_USER_ID , + * FPB.CREATE_DT , + * FPB.UPDATE_USER_ID , + * FPB.UPDATE_DT , + * FPB.CORP_REG_YN , + * FPB.SERVICE_TYPE , + * FPA.PLAN_AREA_SNO , + * FPA.PLAN_SNO , + * FPA.AREA_TYPE , + * FPA.FLT_METHOD , + * FPA.BUFFER_ZONE , + * FPA.FLT_ELEV , + * FPA.CREATE_USER_ID , + * FPA.CREATE_DT , + * FPA.UPDATE_USER_ID , + * FPA.UPDATE_DT + * FROM FLT_PLAN_BAS FPB + * LEFT OUTER JOIN FLT_PLAN_AREA FPA + * ON FPB.PLAN_SNO = FPA.PLAN_SNO + * WHERE FPB.GROUP_ID = #{groupId} + * AND FPB.CSTMR_SNO = #{cstmrSno} -- 유저권한[masterAccount]값이 'NORMAL'일경우, cstmrSno값이 있을 경우 + * AND FPB.APRVL_YN = #{aprvlYn} + * AND FPB.DEL_YN != 'Y' + * LIMIT #{pageSize} OFFSET #{offset} + */ List r = query .from(bas) .leftJoin(area) @@ -487,6 +670,12 @@ public class FltPlanQueryRepository { return new PageImpl<>(r, pageable, r.size()); } + /** + * 승인관련된 비행계획서의 갯수를 조회하는 SQL 기능. + * @param rq + * @param masterAccount + * @return + */ public long aprvCount(BasFlightPlanListRq rq, String masterAccount) { QFltPlanBas bas = QFltPlanBas.fltPlanBas; QFltPlanArea area = QFltPlanArea.fltPlanArea; @@ -509,6 +698,23 @@ public class FltPlanQueryRepository { } builder.and(bas.delYn.ne("Y")); + /** + * 승인값[aprvlYn] 조건인지, + * 권한이 유저일 경우 유저번호[cstmrNo] 조건인지, + * 삭제된 값[delYn] 조건인지, + * 그룹[groupId] 조건인지 확인하여 조회하는 SQL입니다. + * + * SELECT + * COUNT(*) + * FROM FLT_PLAN_BAS FPB + * LEFT OUTER JOIN FLT_PLAN_AREA FPA + * ON FPB.PLAN_SNO = FPA.PLAN_SNO + * WHERE FPB.GROUP_ID = #{groupId} + * AND FPB.CSTMR_SNO = #{cstmrSno} -- 유저권한[masterAccount]값이 'NORMAL'일경우, cstmrSno값이 있을 경우 + * AND FPB.APRVL_YN = #{aprvlYn} + * AND FPB.DEL_YN != 'Y' + * LIMIT #{pageSize} OFFSET #{offset} + */ List list = query .from(bas) .leftJoin(area) @@ -560,6 +766,12 @@ public class FltPlanQueryRepository { return cnt; } + /** + * 검색시간[searchDate] 조건으로 비행스케줄을 조회하는 SQL 기능. + * @Cacheable 해당 어노테이션으로 RQ깂 변동 없을시 이전 데이터 주는기능. + * @param searchDate + * @return + */ @Cacheable(value = "schedule") public List findSchedule(String searchDate) { QFltPlanBas fltPlanBas = QFltPlanBas.fltPlanBas; @@ -570,16 +782,66 @@ public class FltPlanQueryRepository { BooleanBuilder builder = new BooleanBuilder(); - DateTemplate flightStartDate = Expressions.dateTemplate( - Instant.class, "DATE({0})", fltPlanBas.schFltStDt); + Instant searchDateParam = InstantUtils.fromDateString(searchDate); + + // DateTemplate flightStartDate = Expressions.dateTemplate( + // Instant.class, "DATE({0})", fltPlanBas.schFltStDt); - DateTemplate flightEndDate = Expressions.dateTemplate( - Instant.class, "DATE({0})", fltPlanBas.schFltEndDt); + // DateTemplate flightEndDate = Expressions.dateTemplate( + // Instant.class, "DATE({0})", fltPlanBas.schFltEndDt); - builder.and(flightStartDate.loe(DateUtils.stringToDate(searchDate))) - .and(flightEndDate.goe(DateUtils.stringToDate(searchDate))) + builder.and(fltPlanBas.schFltStDt.loe(searchDateParam)) + .and(fltPlanBas.schFltEndDt.goe(searchDateParam)) .and(fltPlanBas.aprvlYn.eq("Y")); + /** + * 검색시간[searchDate] 조건으로 비행스케줄을 조회하는 SQL입니다. + * + * SELECT + * FPB.GROUP_ID , + * ( + * SELECT + * PGB.GROUP_NM + * FROM PTY_GROUP_BAS PGB + * WHERE PGB.GROUP_ID = FPB.GROUP_ID + * ) AS 'groupNm', + * FPA.OWNER_NM , + * FPA.IDNTF_NUM , + * ( + * SELECT + * CONCAT('', CCHA.AREA2, '', CCHA.AREA3, '', CCHA.LAND_NM, '', CCHA.LAND_NUM) + * FROM CTR_CNTRL_HSTRY_AREA CCHA + * WHERE CCHA.CNTRL_ID = CCB.CNTRL_ID + * AND CCHA.ACTN_TYPE = '01' + * ) AS 'startAddress' , + * ( + * SELECT + * CONCAT('', CCHA.AREA2, '', CCHA.AREA3, '', CCHA.LAND_NM, '', CCHA.LAND_NUM) + * FROM CTR_CNTRL_HSTRY_AREA CCHA + * WHERE CCHA.CNTRL_ID = CCB.CNTRL_ID + * AND CCHA.ACTN_TYPE = '99' + * ) AS 'endAddress' , + * FPB.SCH_FLT_ST_DT , + * FPB.SCH_FLT_END_DT , + * CCB.CNTRL_ID , + * CCB.CNTRL_ST_DT , + * CCB.CNTRL_END_DT , + * CASE + * WHEN CCB.STATUS_CD = '01' THEN 'F' + * WHEN CCB.STATUS_CD = '00' THEN 'S' + * ELSE 'B' + * END AS 'statusCd' + * FROM FLT_PLAN_BAS FPB + * LEFT OUTER JOIN FLT_PLAN_ARCRFT FPA + * ON FPB.PLAN_SNO = FPA.PLAN_SNO + * LEFT OUTER JOIN CTR_CNTRL_BAS CCB + * ON FPA.IDNTF_NUM = CCB.IDNTF_NUM + * AND CCB.CNTRL_ST_DT >= FPB.SCH_FLT_ST_DT + * AND CCB.CNTRL_ST_DT <= FPB.SCH_FLT_END_DT + * WHERE FPB.SCH_FLT_ST_DT <= #{searchDate} + * AND FPB.SCH_FLT_END_DT >= #{searchDate} + * AND FPB.APRVL_YN = 'Y' + */ List querys = query.select( Projections.bean( BasFlightScheduleRs.class, @@ -687,8 +949,7 @@ public class FltPlanQueryRepository { } /** - * 김포공항, 비행승인 통계 API - * + * 김포공항, 비행승인 통계구하는 SQL 기능. * @param date * @return */ @@ -710,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( @@ -735,7 +1008,13 @@ public class FltPlanQueryRepository { return result; } - // laanc 승인 목록 + /** + * laanc 승인 목록 + * + * @param search + * @param pageable + * @return + */ public Page findAllAprvListBySearch(LaancAprvSearchDto search, Pageable pageable) { QFltPlanBas bas = QFltPlanBas.fltPlanBas; @@ -878,12 +1157,17 @@ public class FltPlanQueryRepository { } + /** + * laanc 승인 목록 + * + * @param search + * @return + */ public List findAllAprvListBySearch2(LaancAprvSearchDto search) { QFltPlanBas bas = QFltPlanBas.fltPlanBas; QFltPlanArea area = QFltPlanArea.fltPlanArea; QFltPlanArcrft arcrft = QFltPlanArcrft.fltPlanArcrft; - QComFileBas fileBas = QComFileBas.comFileBas; // serach BooleanBuilder builder = new BooleanBuilder(); @@ -1003,7 +1287,12 @@ public class FltPlanQueryRepository { return list; } - // laanc 승인 상세 + /** + * laanc 승인 상세 + * + * @param planSno + * @return + */ public LaancPlanDto findAprvById(Integer planSno) { QFltPlanBas bas = QFltPlanBas.fltPlanBas; QFltPlanArea area = QFltPlanArea.fltPlanArea; @@ -1184,6 +1473,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, @@ -1222,7 +1529,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; @@ -1238,6 +1551,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() // 결과 객체의 프로퍼티 이름을 지정 @@ -1249,6 +1580,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; @@ -1261,6 +1599,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() // 결과 객체의 프로퍼티 이름을 지정 @@ -1272,6 +1629,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; @@ -1284,6 +1648,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() // 결과 객체의 프로퍼티 이름을 지정 @@ -1310,6 +1693,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, @@ -1317,6 +1715,7 @@ public class FltPlanQueryRepository { ) ) .from(qFltPlanArcrft) + .where(builder) .leftJoin(qFltPlanBas) .on(qFltPlanArcrft.planSno.eq(qFltPlanBas.planSno)) .groupBy(qFltPlanArcrft.idntfNum) @@ -1347,6 +1746,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; @@ -1360,6 +1766,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() // 결과 객체의 프로퍼티 이름을 지정 @@ -1371,6 +1792,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; @@ -1382,6 +1810,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() // 결과 객체의 프로퍼티 이름을 지정 @@ -1393,6 +1836,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; @@ -1404,6 +1854,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() @@ -1422,7 +1887,7 @@ public class FltPlanQueryRepository { * 비행승인 많은 기체 데이터, top 1 * @return */ - public FlightStcsValueModel getFltPlanAprvnStaticStcs(boolean authCheck, String groupId){ + public FlightStcsValueModel getFltPlanAprvnStaticStcs(boolean authCheck, String serviceType){ FlightStcsValueModel result = new FlightStcsValueModel(); QFltPlanArcrft qFltPlanArcrft = QFltPlanArcrft.fltPlanArcrft; @@ -1430,10 +1895,25 @@ public class FltPlanQueryRepository { BooleanBuilder builder = new BooleanBuilder(); builder.and(qFltPlanBas.aprvlYn.eq("Y")); - if(groupId != null && !(groupId.equals(""))) builder.and(qFltPlanBas.groupId.eq(groupId)); + 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, @@ -1454,9 +1934,9 @@ public class FltPlanQueryRepository { if(result.getName().equals("")) result.setName(" "); String idntfNum = result.getName(); - result.setYear(getFltPlanAprvnYear(idntfNum, authCheck, groupId)); - result.setMonth(getFltPlanAprvnMonth(idntfNum, authCheck, groupId)); - result.setDay(getFltPlanAprvnDay(idntfNum, authCheck, groupId)); + result.setYear(getFltPlanAprvnYear(idntfNum, authCheck, serviceType)); + result.setMonth(getFltPlanAprvnMonth(idntfNum, authCheck, serviceType)); + result.setDay(getFltPlanAprvnDay(idntfNum, authCheck, serviceType)); } else { FlightStcsValueModel node = new FlightStcsValueModel(); @@ -1471,20 +1951,44 @@ public class FltPlanQueryRepository { return result; } - private Long getFltPlanAprvnDay(String idntfNum, boolean authCheck, String groupId){ + /** + * 비행승인 많은 기체 데이터, 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; String dateFormat = "%Y-%m-%d"; BooleanBuilder builder = new BooleanBuilder(); - if(groupId != null && !(groupId.equals(""))) builder.and(qFltPlanBas.groupId.eq(groupId)); + if(serviceType != null && !(serviceType.equals(""))) builder.and(qFltPlanBas.serviceType.eq(serviceType)); if(authCheck) builder.and(qFltPlanBas.cstmrSno.eq(jwtTokenUtil.getCstmrSnoByToken())); builder.and(qFltPlanArcrft.idntfNum.eq(idntfNum)); builder.and(qFltPlanBas.aprvlYn.eq("Y")); 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() // 결과 객체의 프로퍼티 이름을 지정 @@ -1496,7 +2000,14 @@ public class FltPlanQueryRepository { .fetchOne(); } - private Long getFltPlanAprvnMonth(String idntfNum, boolean authCheck, String groupId){ + /** + * 비행승인 많은 기체 데이터, top 1 [월] + * @param idntfNum + * @param authCheck + * @param serviceType + * @return + */ + private Long getFltPlanAprvnMonth(String idntfNum, boolean authCheck, String serviceType){ QFltPlanArcrft qFltPlanArcrft = QFltPlanArcrft.fltPlanArcrft; QFltPlanBas qFltPlanBas = QFltPlanBas.fltPlanBas; @@ -1506,9 +2017,27 @@ public class FltPlanQueryRepository { builder.and(qFltPlanBas.aprvlYn.eq("Y")); builder.and(qFltPlanBas.createDt.goe(LocalDate.now().minusMonths(1).atStartOfDay().atZone(ZoneId.of("Asia/Seoul")).toInstant())); builder.and(qFltPlanBas.createDt.loe(LocalDate.now().atStartOfDay().atZone(ZoneId.of("Asia/Seoul")).toInstant())); - if(groupId != null && !(groupId.equals(""))) builder.and(qFltPlanBas.groupId.eq(groupId)); + 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() // 결과 객체의 프로퍼티 이름을 지정 @@ -1520,7 +2049,14 @@ public class FltPlanQueryRepository { .fetchOne(); } - private Long getFltPlanAprvnYear(String idntfNum, boolean authCheck, String groupId){ + /** + * 비행승인 많은 기체 데이터, 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; @@ -1529,9 +2065,27 @@ public class FltPlanQueryRepository { builder.and(qFltPlanBas.aprvlYn.eq("Y")); builder.and(qFltPlanBas.createDt.goe(LocalDate.now().minusYears(1).atStartOfDay().atZone(ZoneId.of("Asia/Seoul")).toInstant())); builder.and(qFltPlanBas.createDt.loe(LocalDate.now().atStartOfDay().atZone(ZoneId.of("Asia/Seoul")).toInstant())); - if(groupId != null && !(groupId.equals(""))) builder.and(qFltPlanBas.groupId.eq(groupId)); + 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() // 결과 객체의 프로퍼티 이름을 지정 @@ -1570,6 +2124,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( @@ -1621,6 +2191,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( @@ -1673,6 +2257,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( @@ -1719,6 +2319,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, @@ -1768,6 +2386,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, @@ -1818,6 +2454,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, @@ -1848,16 +2504,27 @@ public class FltPlanQueryRepository { /** * 일일 비행데이터 - * @param groupId + * @param serviceType * @param authCheck * @param cate * @return */ - public List currentFlightStcs(String groupId, boolean authCheck, String cate){ + public List currentFlightStcs(String serviceType, String cate){ QFltPlanBas qFltPlanBas = QFltPlanBas.fltPlanBas; - BooleanBuilder builder = getCurrentBooleanBuilder(groupId, authCheck, cate, qFltPlanBas); - + 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( @@ -1873,11 +2540,18 @@ public class FltPlanQueryRepository { return stcsValues; } - private BooleanBuilder getCurrentBooleanBuilder(String groupId, boolean authCheck, String cate, QFltPlanBas qFltPlanBas){ + /** + * 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(); - if(groupId != null && !(groupId.equals("")))builder.and(qFltPlanBas.groupId.eq(groupId)); - if(authCheck) builder.and(qFltPlanBas.cstmrSno.eq(jwtTokenUtil.getCstmrSnoByToken())); + if (serviceType != null && !serviceType.isEmpty()) builder.and(qFltPlanBas.serviceType.eq(serviceType)); BooleanExpression dateExpression = null; @@ -1917,8 +2591,12 @@ public class FltPlanQueryRepository { return builder; } - - + /** + * 드론 별 비행운항 목록 조회하는 SQL 기능. + * @param cptAuth + * @param serviceType + * @return + */ public List getFlightDronList(String cptAuth, String serviceType){ QComIdntfBas cib = QComIdntfBas.comIdntfBas; @@ -1954,7 +2632,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, @@ -1986,20 +2703,24 @@ public class FltPlanQueryRepository { return result; } + /** + * 드론 비행 현황을 조회하는 SQL 기능. + * @param cptAuth + * @return + */ public Map getFlightDronStcs(String cptAuth){ QComIdntfBas cib = QComIdntfBas.comIdntfBas; QFltPlanArcrft fpa = QFltPlanArcrft.fltPlanArcrft; QFltPlanBas fpb = QFltPlanBas.fltPlanBas; - QPtyGroupBas pgb = QPtyGroupBas.ptyGroupBas; +// QPtyGroupBas pgb = QPtyGroupBas.ptyGroupBas; QFltPlanCtrCntrlRel fpccr = QFltPlanCtrCntrlRel.fltPlanCtrCntrlRel; QCtrCntrlBas ccb = QCtrCntrlBas.ctrCntrlBas; BooleanBuilder builder = new BooleanBuilder(); - if(!cptAuth.equals("KAC")) { - builder.and(pgb.groupNm.eq("cptAuth")); - } + if(!cptAuth.isEmpty()) builder.and(fpb.serviceType.eq(cptAuth)); + Instant now = Instant.now(); ZoneId databaseTimeZone = ZoneId.of("Asia/Seoul"); @@ -2014,6 +2735,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() @@ -2025,7 +2778,7 @@ public class FltPlanQueryRepository { ) .from(fpa) .leftJoin(fpb).on(fpb.planSno.eq(fpa.planSno)) - .leftJoin(pgb).on(pgb.groupId.eq(fpb.groupId)) +// .leftJoin(pgb).on(pgb.groupId.eq(fpb.groupId)) .leftJoin(cib).on(cib.idntfNum.eq(fpa.idntfNum)) .leftJoin(fpccr).on(fpccr.planSno.eq(fpb.planSno)) .leftJoin(ccb).on(ccb.cntrlId.eq(fpccr.cntrlId)) diff --git a/pav-server/src/main/java/com/palnet/biz/jpa/repository/pty/PtyCrtfyhpBasQueryRepository.java b/pav-server/src/main/java/com/palnet/biz/jpa/repository/pty/PtyCrtfyhpBasQueryRepository.java index 87631ba3..962b865d 100644 --- a/pav-server/src/main/java/com/palnet/biz/jpa/repository/pty/PtyCrtfyhpBasQueryRepository.java +++ b/pav-server/src/main/java/com/palnet/biz/jpa/repository/pty/PtyCrtfyhpBasQueryRepository.java @@ -6,7 +6,6 @@ import com.palnet.biz.jpa.entity.QPtyCrtfyhpBas; import com.querydsl.core.BooleanBuilder; import com.querydsl.jpa.impl.JPAQueryFactory; import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Repository; import java.time.Instant; @@ -14,26 +13,43 @@ import java.time.temporal.ChronoUnit; import java.util.List; -@Slf4j @Repository @RequiredArgsConstructor public class PtyCrtfyhpBasQueryRepository { private final JPAQueryFactory query; + /** + * 휴대폰에 전송된 인증코드가 맞는지 확인하는 SQL기능 + * @param hpno + * @param crtfyNo + * @return + */ public List confirmSms(String hpno, String crtfyNo) { QPtyCrtfyhpBas qEntity = QPtyCrtfyhpBas.ptyCrtfyhpBas; Instant now = Instant.now(); Instant prevTime = Instant.now().minus(5, ChronoUnit.MINUTES); + BooleanBuilder builder = new BooleanBuilder(); builder.and(qEntity.crtfyhpNo.eq(crtfyNo)); - + builder.and(qEntity.crtfyhpYn.eq("N")); builder.and(qEntity.createDt.goe(prevTime)); builder.and(qEntity.createDt.loe(now)); + /** + * 휴대폰 번호와 인증번호가 맞는지 확인하는 SQL 입니다. + * + * SELECT + * * + * FROM PTY_CRTFYHP_BAS PCB + * WHERE PCB.CRTFYHP_NO = #{crtfyNo} -- 인증번호 + * AND PCB.CRTFYHP_YN = 'N' + * AND PCB.CREATE_DT = DATE_SUB(NOW(), INTERVAL 5 MINUTE) + * AND PCB.CREATE_DT = NOW() + */ List entity = query.select(qEntity).from(qEntity) .where(builder) @@ -43,5 +59,5 @@ public class PtyCrtfyhpBasQueryRepository { return entity; } - + } diff --git a/pav-server/src/main/java/com/palnet/biz/jpa/repository/pty/PtyCstmrQueryRepository.java b/pav-server/src/main/java/com/palnet/biz/jpa/repository/pty/PtyCstmrQueryRepository.java index c3014cba..8522ded7 100644 --- a/pav-server/src/main/java/com/palnet/biz/jpa/repository/pty/PtyCstmrQueryRepository.java +++ b/pav-server/src/main/java/com/palnet/biz/jpa/repository/pty/PtyCstmrQueryRepository.java @@ -26,6 +26,13 @@ public class PtyCstmrQueryRepository { private final JPAQueryFactory query; + /** + * 입력받은 회원 아이디가 데이터베이스에 있는지 조회하는 SQL기능. + * ID가 있으면 중복되는 것, true 반환 + * ID가 없으면 중복되지 않는 것, false 반환 + * @param userId + * @return + */ public boolean findCstmrByUserId(String userId) { boolean result = false; @@ -38,6 +45,15 @@ public class PtyCstmrQueryRepository { builder.and(basEntity.cstmrStatusCd.eq("A")); //활성화 상태 builder.and(basEntity.userId.eq(userId)); + /** + * 회원 아이디[USER_ID], + * 회원활성화 여부[CSTMR_STATUS_CD] 값이 조건에 맞으면 회원정보를 가져오는 SQL입니다. + * SELECT + * * + * FROM PTY_CSTMR_BAS PCB + * WHERE PCB.CSTMR_STATUS_CD = 'A' + * AND PCB.USER_ID = #{id} + */ PtyCstmrBas entity = query.select(basEntity) .from(basEntity) .where(builder) @@ -49,24 +65,49 @@ public class PtyCstmrQueryRepository { return result; } + /** + * 회원 이름과 휴대폰번호로 데이터 베이스에서 회원정보 찾는 SQL 기능 + * @param name + * @param hpno + * @return + */ public boolean certifNum(String name, String hpno) { - QPtyCstmrDtl dtl = QPtyCstmrDtl.ptyCstmrDtl; + QPtyCstmrDtl dtl = QPtyCstmrDtl.ptyCstmrDtl; // PTY_CSTMR_DTL - 고객 상세 테이블 + // 데이터베이스 조건 문을 주는 코드 BooleanBuilder builder = new BooleanBuilder(); - builder.and(dtl.hpno.eq(hpno)); - builder.and(dtl.memberName.eq(name)); - + builder.and(dtl.hpno.eq(hpno)); // 휴대폰 번호가 맞는지 조건추가 + builder.and(dtl.memberName.eq(name)); // 회원이름이 맞는지 조건추가 + + /** + * 휴대폰 번호와 이름으로 데이터베이스에서 회원정보를 가져오는 SQL 입니다. + * + * SELECT + * * + * FROM PTY_CSTMR_DTL PCD + * WHERE PCD.HPNO = #{hpno} + * AND PCD.MEMBER_NAME = #{name} + */ PtyCstmrDtl entity = query.select(dtl) .from(dtl) .where(builder) .fetchFirst(); + boolean result = false; + if (entity != null) { result = true; } return result; } - + + + /** + * 회원명과 암호화된 휴대폰 번호로 ID찾는 SQL 기능 + * @param name + * @param hpno + * @return + */ public String findUserId(String name, String hpno) { QPtyCstmrBas bas = QPtyCstmrBas.ptyCstmrBas; QPtyCstmrDtl dtl = QPtyCstmrDtl.ptyCstmrDtl; @@ -75,6 +116,20 @@ public class PtyCstmrQueryRepository { builder.and(bas.cstmrStatusCd.eq("A")); builder.and(dtl.hpno.eq(hpno)); builder.and(dtl.memberName.eq(name)); + + /** + * 회원상태 활성화 여부[CSTMR_STATUS_CD], + * 휴대폰 번호 [HPNO], + * 회원 이름 [MEMBER_NAME] 으로 회원정보를 찾는 SQL 입니다. + * SELECT + * * + * FROM PTY_CSTMR_BAS PCB + * LEFT OUTER JOIN PTY_CSTMR_DTL PCD + * ON PCB.CSTMR_SNO = PCD.CSTMR_SNO + * WHERE PCB.CSTMR_STATUS_CD = 'A' + * AND PCD.HPNO = #{hpno} + * AND PCD.MEMBER_NAME = #{name} + */ PtyCstmrBas entity = query.select(bas) .from(bas) .leftJoin(dtl) @@ -86,6 +141,12 @@ public class PtyCstmrQueryRepository { return userId; } + /** + * 회원 ID와 휴대폰번호[hpno]가 일치한지 확인하는 SQL기능 + * @param id + * @param hpno + * @return + */ public PtyCstmrBas findUserPw(String id, String hpno) { QPtyCstmrBas bas = QPtyCstmrBas.ptyCstmrBas; QPtyCstmrDtl dtl = QPtyCstmrDtl.ptyCstmrDtl; @@ -94,6 +155,20 @@ public class PtyCstmrQueryRepository { builder.and(bas.cstmrStatusCd.eq("A")); builder.and(dtl.hpno.eq(hpno)); builder.and(bas.userId.eq(id)); + + /** + * 회원 아이디[USER_ID], + * 회원활성화 여부[CSTMR_STATUS_CD], + * 휴대폰번호 [HPNO] 값이 조건에 맞으면 회원 정보를 가져오는 SQL입니다. + * SELECT + * * + * FROM PTY_CSTMR_BAS PCB + * LEFT OUTER JOIN PTY_CSTMR_DTL PCD + * ON PCB.CSTMR_SNO = PCD.CSTMR_SNO + * WHERE PCB.CSTMR_STATUS_CD = 'A' + * AND PCD.HPNO = #{hpno} + * AND PCB.USER_ID = #{id} + */ PtyCstmrBas entity = query.select(bas) .from(bas) .leftJoin(dtl) @@ -104,29 +179,52 @@ public class PtyCstmrQueryRepository { return entity; } + /** + * 데이터베이스 안에 같은 휴대폰 번호가 있는지 확인 + * result가 true 일시 동일한 번호가 존재함 + * @param hpno + * @return + */ public boolean findCstmrByHpno(String hpno) { - boolean result = false; + boolean result = false; // 반환할 값 선언 [default false를 의미함] - QPtyCstmrBas basEntity = QPtyCstmrBas.ptyCstmrBas; - QPtyCstmrDtl dtlEntity = QPtyCstmrDtl.ptyCstmrDtl; + QPtyCstmrBas basEntity = QPtyCstmrBas.ptyCstmrBas; + QPtyCstmrDtl dtlEntity = QPtyCstmrDtl.ptyCstmrDtl; + // 데이터베이스 조건 문을 주는 코드 BooleanBuilder builder = new BooleanBuilder(); - builder.and(basEntity.cstmrStatusCd.eq("A")); //활성화 상태 - builder.and(dtlEntity.hpno.eq(hpno)); - + builder.and(basEntity.cstmrStatusCd.eq("A")); + builder.and(dtlEntity.hpno.eq(hpno)); + + + /** + * 휴대폰 번호가 데이터베이스 안에 있는지 확인하는 SQL 입니다. + * SELECT + * * + * FROM PTY_CSTMR_BAS PCB + * LEFT OUTER JOIN PTY_CSTMR_DTL PCD + * ON PCB.CSTMR_SNO = PCD.CSTMR_SNO + * WHERE PCB.CSTMR_STATUS_CD = 'A' + * AND PCD.HPNO = #{hpno} + */ PtyCstmrBas entity = query.select(basEntity) .from(basEntity) .leftJoin(dtlEntity) - .on(basEntity.cstmrSno.eq(dtlEntity.cstmrSno)) + .on(basEntity.cstmrSno.eq(dtlEntity.cstmrSno)) .where(builder) .fetchFirst(); if (entity != null) { result = true; } return result; - } + /** + * 회원 아이디와 휴대폰 번호가 일치하는지 확인 + * + * @param userId + * @return + */ public JwtUserModel findUserPassword(String userId) { QPtyCstmrBas bas = QPtyCstmrBas.ptyCstmrBas; QPtyCstmrDtl dtl = QPtyCstmrDtl.ptyCstmrDtl; @@ -165,6 +263,7 @@ public class PtyCstmrQueryRepository { model.setCstmrSno(entity.getCstmrSno()); model.setCstmrStatusCd(entity.getCstmrStatusCd()); model.setUserPswd(entity.getUserPswd()); + model.setCptAuthCode(entity.getCptAuthCode()); if (pcgEntityList != null && !pcgEntityList.isEmpty()) { List groupModelList = new ArrayList<>(); for (PtyCstmrGroup pcgEntity : pcgEntityList) { @@ -186,6 +285,11 @@ public class PtyCstmrQueryRepository { } + /** + * cstmrSno 값으로 회원정보를 조회하는 SQL 기능. + * @param cstmrSno + * @return + */ public JwtProfileRsModel findUserProfile(int cstmrSno) { QPtyCstmrBas basEntity = QPtyCstmrBas.ptyCstmrBas; QPtyCstmrDtl dtlEntity = QPtyCstmrDtl.ptyCstmrDtl; @@ -194,12 +298,29 @@ public class PtyCstmrQueryRepository { builder.and(basEntity.cstmrSno.eq(cstmrSno)); + /** + * 회원 고유번호[cstmrSno]로 회원의 기본 프로필정보를 데이터베이스에서 조회하는 SQL입니다. + * SELECT + * PCB.CSTMR_SNO, + * PCB.USER_ID , + * PCB.AUTH_ID , + * PCB.TRMNL_ID , + * PCB.SITE_CODE , + * PCB.USER_ID , + * PCB.CPT_AUTH_CODE , + * PCD.MEMBER_NAME + * FROM PTY_CSTMR_BAS PCB + * LEFT OUTER JOIN PTY_CSTMR_DTL PCD + * ON PCB.CSTMR_SNO = PCD.CSTMR_SNO + * WHERE PCB.CSTMR_SNO = #{cstmrSno} + */ JwtProfileRsModel model = query.select(Projections.bean(JwtProfileRsModel.class, basEntity.cstmrSno, basEntity.userId, basEntity.authId, basEntity.trmnlId, basEntity.siteCode, + basEntity.cptAuthCode, dtlEntity.memberName )) .from(basEntity) @@ -212,6 +333,13 @@ public class PtyCstmrQueryRepository { } + /** + * refreshToken으로 회원정보를 조회 + * + * @param cstmrSno + * @param refreshToken + * @return + */ public JwtUserModel findRefreshtoken(int cstmrSno, String refreshToken) { QPtyCstmrBas basEntity = QPtyCstmrBas.ptyCstmrBas; BooleanBuilder builder = new BooleanBuilder(); @@ -239,11 +367,24 @@ public class PtyCstmrQueryRepository { } + /** + * cstmrSno로 기본 회원정보 받아오는 SQL과 + * 회원의 인가정보를 조회하여 받는 기능. + * @param cstmrSno + * @return + */ public JwtUserModel findByIdForrefreshToken(int cstmrSno) { QPtyCstmrBas basEntity = QPtyCstmrBas.ptyCstmrBas; BooleanBuilder builder = new BooleanBuilder(); builder.and(basEntity.cstmrSno.eq(cstmrSno)); + /** + * 회원 고유번호[cstmrSno]로 기본 회원정보 받아오는 SQL 기능입니다. + * SELECT + * * + * FROM PTY_CSTMR_BAS PCB + * WHERE PCB.CSTMR_SNO = #{cstmrSno} + */ PtyCstmrBas entity = query.select(basEntity) .from(basEntity) .where(builder) @@ -262,11 +403,35 @@ public class PtyCstmrQueryRepository { } else { return null; } - } + } + + /** + * 회원 고유번호로 데이터베이스에서 회원정보를 조회하는 SQL 기능. + * + * @param cstmrSno + * @return + */ public List list(int cstmrSno) { QPtyCstmrBas bas = QPtyCstmrBas.ptyCstmrBas; QPtyCstmrDtl dtl = QPtyCstmrDtl.ptyCstmrDtl; + /** + * 회원 고유번호로 데이터베이스에서 회원정보를 조회하는 SQL 입니다. + * SELECT + * PCD.MEMBER_NAME , + * PCD.BRTHDY_DATE , + * PCD.GENDER_CD , + * PCD.CNTRY_CD , + * PCD.EMAIL , + * PCD.HPNO , + * PCD.UPDATE_DT , + * PCB.CPT_AUTH_CODE , + * PCB.USER_ID + * FROM PTY_CSTMR_BAS PCB + * LEFT OUTER JOIN PTY_CSTMR_DTL PCD + * ON PCB.CSTMR_SNO = PCD.CSTMR_SNO + * WHERE PCB.CSTMR_SNO = #{cstmrSno} + */ List list = query .select(Projections.bean( AnctCstmerRlModel.class, @@ -277,6 +442,7 @@ public class PtyCstmrQueryRepository { dtl.email, dtl.hpno, dtl.updateDt, + bas.cptAuthCode, bas.userId )) .from(bas) @@ -288,6 +454,12 @@ public class PtyCstmrQueryRepository { return list; } + /** + * 회원 정보 조회 + * + * @param cstmrSno + * @return + */ public AnctCstmrModel findByCstmrSno(int cstmrSno) { QPtyCstmrBas bas = QPtyCstmrBas.ptyCstmrBas; QPtyCstmrDtl dtl = QPtyCstmrDtl.ptyCstmrDtl; @@ -334,6 +506,12 @@ public class PtyCstmrQueryRepository { } + /** + * 패스워드 조회 + * + * @param userId + * @return + */ public AcntCstmrRqModel findpassword(String userId) { QPtyCstmrBas basEntity = QPtyCstmrBas.ptyCstmrBas; 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 2e38fdee..a60f9887 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 @@ -31,7 +31,7 @@ public class PtyDronQueryRepository{ private final JPAQueryFactory query; /** - * 목록 조회 + * 드론 목록 조회하는 SQL기능. * @param rq * @return */ @@ -55,8 +55,39 @@ public class PtyDronQueryRepository{ builder.and(bas.arcrftTypeCd.eq(rq.getArcrftTypeCd())); } - builder.and(bas.useYn.eq("Y")); + builder.and(bas.useYn.eq("Y")); // 사용여부값 + /** + * 기체이름 값[arcrftModelNm] 조건인지, + * 그룹아이디 값 [groupId] 조건인지, + * 기체타입 값 [arcrftTypeCd] 조건인지, + * 사용여부 값 [useYn] 이 "Y" 인지 조건으로 데이터베이스에서 조회하는 SQL입니다. + * SELECT + * CAB.GROUP_ID , + * CAB.ARCRFT_SNO , + * CAB.ARCRFT_HGHT , + * CAB.ARCRFT_LNGTH , + * CAB.ARCRFT_MODEL_NM , + * CAB.ARCRFT_TYPE_CD , + * CAB.ARCRFT_WDTH , + * CAB.ARCRFT_WGHT , + * CAB.CAMERA_YN , + * CAB.CREATE_DT , + * CAB.CREATE_USER_ID , + * CAB.INSRNC_YN , + * CAB.PRDCT_CMPN_NM , + * CAB.PRDCT_DATE , + * CAB.PRDCT_NUM , + * CAB.TAKEOFF_WGHT , + * CAB.UPDATE_DT , + * CAB.UPDATE_USER_ID , + * CAB.WGHT_TYPE_CD + * FROM COM_ARCRFT_BAS CAB + * WHERE CAB.USE_YN = 'Y' + * AND CAB.ARCRFT_MODEL_NM = #{arcrftModelNm} -- 조건에 있을경우 + * AND CAB.GROUP_ID = #{groupId} -- 조건에 있을경우 + * AND CAB.ARCRFT_TYPE_CD = #{arcrftTypeCd} -- 조건에 있을경우 + */ List result = query.select(Projections.bean(BasDronModel.class , bas.groupId, @@ -97,7 +128,13 @@ public class PtyDronQueryRepository{ return new PageImpl<>(result, pageable, result.size()); } - public long listCount(BasDronRqModel rq){ + + /** + * 검색조건에 맞춘 드론목록의 사이즈가 몇인지 조회하는 SQL기능 + * @param rq + * @return + */ + public long listCount(BasDronRqModel rq){ QComArcrftBas bas = QComArcrftBas.comArcrftBas; QComIdntfBas idnt = QComIdntfBas.comIdntfBas; @@ -119,6 +156,19 @@ public class PtyDronQueryRepository{ builder.and(bas.useYn.eq("Y")); + /** + * 기체이름 값[arcrftModelNm] 조건인지, + * 그룹아이디 값 [groupId] 조건인지, + * 기체타입 값 [arcrftTypeCd] 조건인지, + * 사용여부 값 [useYn] 이 "Y" 인지 조건으로 데이터베이스에서 조회하는 SQL입니다. + * SELECT + * count(*) + * FROM COM_ARCRFT_BAS CAB + * WHERE CAB.USE_YN = 'Y' + * AND CAB.ARCRFT_MODEL_NM = #{arcrftModelNm} -- 조건에 있을경우 + * AND CAB.GROUP_ID = #{groupId} -- 조건에 있을경우 + * AND CAB.ARCRFT_TYPE_CD = #{arcrftTypeCd} -- 조건에 있을경우 + */ List result = query.select(Projections.bean(BasDronModel.class , bas.groupId, @@ -161,7 +211,7 @@ public class PtyDronQueryRepository{ return cnt; } /** - * 식별번호 조회 + * 식별번호 조회하는 SQL기능. * @param arcrftSno * @return */ @@ -174,7 +224,25 @@ public class PtyDronQueryRepository{ BooleanBuilder builder = new BooleanBuilder(); builder.and(idnt.arcrftSno.eq(arcrftSno)); - + /** + * 기체일련번호[arcrftSno] 조건으로 조회하는 SQL기능입니다. + * + * SELECT + * CIB.ARCRFT_SNO , + * CIB.IDNTF_NUM , + * CIB.IDNTF_TYPE_CD , + * CIB.CREATE_DT , + * CIB.UPDATE_DT , + * CIB.OWNER_NM , + * CIB.HPNO , + * CIB.CSTMR_SNO , + * CAB.GROUP_ID + * FROM COM_IDNTF_BAS CIB + * LEFT OUTER JOIN COM_ARCRFT_BAS CAB + * ON CIB.ARCRFT_SNO = CAB.ARCRFT_SNO + * WHERE CIB.ARCRFT_SNO = #{arcrftSno} + * ORDER BY CIB.CREATE_DT ASC + */ List result = query.select(Projections.bean(BasIdntfModel.class , @@ -200,7 +268,7 @@ public class PtyDronQueryRepository{ /** - * 상세 조회 + * 드론 상세 조회하는 SQL기능. * @param arcrftSno * @return */ @@ -208,6 +276,33 @@ public class PtyDronQueryRepository{ QComArcrftBas bas = QComArcrftBas.comArcrftBas; + /** + * 기체일련번호[arcrftSno] 조건으로 드론 상세조회하는 SQL입니다. + * + * SELECT + * CAB.GROUP_ID , + * CAB.ARCRFT_SNO , + * CAB.ARCRFT_HGHT , + * CAB.ARCRFT_LNGTH , + * CAB.ARCRFT_MODEL_NM , + * CAB.ARCRFT_TYPE_CD , + * CAB.ARCRFT_WDTH , + * CAB.ARCRFT_WGHT , + * CAB.CAMERA_YN , + * CAB.CREATE_DT , + * CAB.CREATE_USER_ID , + * CAB.INSRNC_YN , + * CAB.PRDCT_CMPN_NM , + * CAB.PRDCT_DATE , + * CAB.PRDCT_NUM , + * CAB.TAKEOFF_WGHT , + * CAB.UPDATE_DT , + * CAB.UPDATE_USER_ID , + * CAB.WGHT_TYPE_CD , + * CAB.IMAGE_URL + * FROM COM_ARCRFT_BAS CAB + * WHERE CAB.ARCRFT_SNO = #{arcrftSno} + */ BasDronModel result = query.select(Projections.bean(BasDronModel.class , bas.groupId, @@ -275,7 +370,12 @@ public class PtyDronQueryRepository{ public boolean isNotPrdctNum(String prdctNum , int arcrftSno) { QComArcrftBas bas = QComArcrftBas.comArcrftBas; - long count = query.select(bas.prdctNum).from(bas).where(bas.useYn.eq("Y")).where(bas.prdctNum.eq(prdctNum).and(bas.arcrftSno.ne(arcrftSno))).fetchCount(); + long count = query. + select(bas.prdctNum) + .from(bas) + .where(bas.useYn.eq("Y")) + .where(bas.prdctNum.eq(prdctNum) + .and(bas.arcrftSno.ne(arcrftSno))).fetchCount(); if(count == 0) { return true; @@ -305,14 +405,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 82e1000d..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 @@ -49,6 +49,11 @@ public class PtyGroupQueryRepository{ @Autowired private JwtTokenUtil jwtTokenUtil; + /** + * 전체 그룹을 조회하는 SQL기능. + * @param rq + * @return + */ public List list(BasGroupRqModel rq){ QPtyGroupBas bas = QPtyGroupBas.ptyGroupBas; @@ -63,6 +68,23 @@ public class PtyGroupQueryRepository{ builder.and(bas.groupNm.like(rq.getGroupNm())); } + /** + * 사용여부[useYn] 조건, + * 그룹아이디[groupId] 조건, + * 그룹이름[groupNm] 조건으로 조회하는 SQL입니다. + * + * SELECT + * PGB.GROUP_ID , + * PGB.GROUP_NM , + * PGB.GROUP_TYPE_CD , + * PGB.UPDATE_DT , + * PGB.CREATE_DT + * FROM PTY_GROUP_BAS PGB + * WHERE PGB.USE_YN = 'Y' + * AND PGB.GROUP_ID = #{groupId} -- 입력받았으면 조건 추가 + * AND PGB.GROUP_NM LIKE #{groupNm} -- 입력받았으면 조건 추가 + * ORDER BY PGB.CREATE_DT DESC + */ List result = query.select(Projections.bean(BasGroupModel.class , bas.groupId, @@ -75,12 +97,11 @@ public class PtyGroupQueryRepository{ .orderBy(bas.createDt.desc()) .fetch(); - return result; - + return result; } /** - * 내가 생성한 그룹 목록 + * 내가 생성한 그룹 목록을 조회하는 SQL 기능. * @param cstmrSno * @return */ @@ -97,6 +118,24 @@ public class PtyGroupQueryRepository{ builder.and(dtl.groupAuthCd.eq("MASTER")); + /** + * 고객고유번호[cstmrSno]값 조건, + * 그룹내애 권한[groupAuthCd]값 조건 , + * 사용여부 [useYn]값 조건으로 조회하는 SQL 입니다. + * + * SELECT + * PGB.GROUP_ID , + * PGB.GROUP_NM , + * PGB.GROUP_TYPE_CD , + * PGB.UPDATE_DT , + * 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, @@ -116,7 +155,7 @@ public class PtyGroupQueryRepository{ } /** - * 그룹 목록 + * Super, Admin권한으로 그룹을 조회하는 SQL 기능. * @param cstmrSno * @return */ @@ -127,7 +166,25 @@ public class PtyGroupQueryRepository{ BooleanBuilder builder = new BooleanBuilder(); builder.and(bas.useYn.eq("Y")); builder.and(group.groupAuthCd.eq("MASTER")); - + + /** + * 사용여부[useYn] 조건, + * 그룹권한[groupAuthCd] 조건 으로 조회하는 SQL입니다. + * + * SELECT + * PGB.GROUP_ID , + * PGB.GROUP_NM , + * PCG.GROUP_AUTH_CD , + * PGB.CREATE_DT , + * PCG.CSTMR_GROUP_SNO + * 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.GROUP_AUTH_CD = 'MASTER' + * GROUP BY PGB.GROUP_ID + * ORDER BY PGB.CREATE_DT DESC, PGB.GROUP_ID ASC + */ List result = query.select(Projections.bean(BasGroupJoinModel.class , bas.groupId, bas.groupNm, @@ -147,7 +204,24 @@ public class PtyGroupQueryRepository{ BooleanBuilder builder2 = new BooleanBuilder(); builder2.and(bas.useYn.eq("Y")); builder2.and(group.cstmrGroupSno.isNotNull()); - + + /** + * 사용여부[useYn] 조건, + * 그룹권한[groupAuthCd]이 NULL이 아닌 조건으로 조회하는 SQL입니다. + * + * SELECT + * PGB.GROUP_ID , + * PGB.GROUP_NM , + * PCG.CSTMR_GROUP_SNO , + * PCG.CSTMR_SNO , + * PCG.GROUP_AUTH_CD + * FROM PTY_GROUP_BAS PGB + * LEFT OUTER JOIN PTY_CSTMR_GROUP PCG + * ON PGB.GROUP_ID = PCG.GROUP_ID + * ON PCG.CSTMR_SNO = #{cstmrSno} + * WHERE PGB.USE_YN = 'Y' + * AND PCG.GROUP_AUTH_CD IS NOT NULL + */ List my = query.select(Projections.bean(BasGroupUserModel.class , bas.groupId, bas.groupNm, @@ -175,6 +249,11 @@ public class PtyGroupQueryRepository{ return result; } + /** + * User 권한으로 그룹을 조회하는 SQL 기능. + * @param cstmrSno + * @return + */ public List groupUserList(int cstmrSno){ QPtyGroupBas bas = QPtyGroupBas.ptyGroupBas; QPtyCstmrGroup group = QPtyCstmrGroup.ptyCstmrGroup; @@ -184,7 +263,26 @@ public class PtyGroupQueryRepository{ builder.and(group.joinYn.eq("Y")); builder.and(group.cstmrSno.eq(cstmrSno)); - + + /** + * 사용여부[useYn] 조건, + * 참여여부[joinYn] 조건, + * 유저고유번호[cstmrSno] 조건으로 조회하는 SQL입니다. + * + * SELECT + * PGB.GROUP_ID , + * PGB.GROUP_NM , + * PGB.CREATE_DT , + * PCG.CSTMR_GROUP_SNO + * 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.JOIN_YN = 'Y' + * AND PCG.CSTMR_SNO = #{cstmrSno} + * GROUP BY PGB.GROUP_ID + * ORDER BY PGB.CREATE_DT DESC, PGB.GROUP_NM ASC + */ List result = query.select(Projections.bean(BasGroupJoinModel.class , bas.groupId, bas.groupNm, @@ -203,7 +301,7 @@ public class PtyGroupQueryRepository{ } /** - * 나의 그룹 - 참여 그룹 목록 + * 나의 그룹 - 참여 그룹 목록을 조회하는 SQL기능. * @param cstmrSno * @return */ @@ -216,6 +314,31 @@ public class PtyGroupQueryRepository{ builder.and(dtl.joinYn.eq("Y")); builder.and(dtl.cstmrSno.eq(cstmrSno)); + /** + * 고객고유번호[cstmrSno] 조건, + * 참여여부[joinYn] 조건, + * 사용여부[useYn] 조건으로 참여그룹을 조회하는 SQL입니다. + * + * SELECT + * PGB.GROUP_ID , + * PGB.GROUP_NM , + * PGB.GROUP_TYPE_CD , + * PGB.TRMNL_ID , + * PCG.CSTMR_SNO , + * PCG.CSTMR_GROUP_SNO , + * PGB.UPDATE_DT , + * PGB.CREATE_DT , + * PCG.APRVL_YN , + * PCG.JOIN_DT , + * PCG.APRVL_DT , + * PCG.GROUP_AUTH_CD + * 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.JOIN_YN = 'Y' + * AND PCG.CSTMR_SNO = #{cstmrSno} + */ List result = query.select(Projections.bean(BasGroupJoinModel.class , bas.groupId, @@ -665,6 +788,12 @@ public class PtyGroupQueryRepository{ } return cnt; } + + /** + * 최근 가입된 순으로 3개 그룹 조회하는 SQL 기능. + * @param cstmrSno + * @return + */ public List groupTop3(int cstmrSno){ QPtyGroupBas bas = QPtyGroupBas.ptyGroupBas; @@ -674,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, diff --git a/pav-server/src/main/java/com/palnet/biz/jpa/repository/pty/PtyTermsQueryRepository.java b/pav-server/src/main/java/com/palnet/biz/jpa/repository/pty/PtyTermsQueryRepository.java index bece9904..7c270d09 100644 --- a/pav-server/src/main/java/com/palnet/biz/jpa/repository/pty/PtyTermsQueryRepository.java +++ b/pav-server/src/main/java/com/palnet/biz/jpa/repository/pty/PtyTermsQueryRepository.java @@ -23,6 +23,11 @@ public class PtyTermsQueryRepository { private final JPAQueryFactory query; + /** + * 입력받은 값에 따라 약관항목을 데이터베이스에서 가져오는 SQL 기능. + * @param rq + * @return + */ public List list(AcntTermsRqModel rq) { QPtyTermsBas basEntity = QPtyTermsBas.ptyTermsBas; @@ -34,7 +39,28 @@ public class PtyTermsQueryRepository { builder.and(basEntity.siteCd.eq(rq.getSiteCd())); builder.and(basEntity.termsCtgryCd.eq(rq.getTermsCtgryCd())); - + /** + * 최종내역여부[LAST_TXN_YN] 조건, + * 사이트코드[SITE_CD] 조건, + * 약관카테고리[TERMS_CRGRY_CD] 조건이 맞는 약관항목을 데이터베이스에서 조회하는 SQL 입니다. + * SELECT + * PTB.TERMS_SNO , + * PTB.SITE_CD , + * PTB.ESTBSH_DATE , + * PTB.TERMS_CTGRY_CD , + * PTD.LANG_DIV_CD , + * PTD.TERMS_TITLE_NM , + * PTD.TERMS_CN , + * PTD.SIMPLE_CN + * FROM PTY_TERMS_BAS PTB + * LEFT OUTER JOIN PTY_TERMS_DTL PTD + * ON PTB.TERMS_SNO = PTD.TERMS_SNO + * AND PTD.LANG_DIV_CD = #{langDivCd} + * WHERE PTB.LAST_TXN_YN = 'Y' + * AND PTB.SITE_CD = #{siteCd} + * AND PTB.TERMS_CTGRY_CD = #{termsCtgryCd} + * ORDER BY PTB.UPDATE_DT DESC + */ List queryList = query.select(Projections.bean(AcntTermsRsModel.class, basEntity.termsSno, basEntity.siteCd, diff --git a/pav-server/src/main/java/com/palnet/biz/sample/controller/UtmSampleTestController.java b/pav-server/src/main/java/com/palnet/biz/sample/controller/UtmSampleTestController.java new file mode 100644 index 00000000..d53e3738 --- /dev/null +++ b/pav-server/src/main/java/com/palnet/biz/sample/controller/UtmSampleTestController.java @@ -0,0 +1,24 @@ +package com.palnet.biz.sample.controller; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.ServletRequest; + +@Slf4j +@RestController +public class UtmSampleTestController { + + @PostMapping("/api/v1/utm") + public ResponseEntity utmReciverTest(@RequestBody String body, ServletRequest request) { + log.info("===================================================="); + log.info("===================================================="); + log.info("====>> /api/v1/utm sample test : {}", body); + log.info("===================================================="); + log.info("===================================================="); + return ResponseEntity.ok().build(); + } +} diff --git a/pav-server/src/main/java/com/palnet/biz/scheduler/ctr/service/CtrTrnsLctnService.java b/pav-server/src/main/java/com/palnet/biz/scheduler/ctr/service/CtrTrnsLctnService.java index edb96907..f472ba89 100644 --- a/pav-server/src/main/java/com/palnet/biz/scheduler/ctr/service/CtrTrnsLctnService.java +++ b/pav-server/src/main/java/com/palnet/biz/scheduler/ctr/service/CtrTrnsLctnService.java @@ -34,7 +34,13 @@ public class CtrTrnsLctnService { private String NAVER_API_KEY; private Logger logger = LoggerFactory.getLogger(getClass()); - + + /** + * 위치에 맞는 값에 대한 주소로 변환하는 기능. + * @param lat + * @param lon + * @return + */ public CtrTrnsLctnModel convertLatlonToAddress(double lat , double lon) { HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory(); factory.setConnectTimeout(5000); //타임아웃 설정 5초 diff --git a/pav-server/src/main/java/com/palnet/comn/code/ErrorCode.java b/pav-server/src/main/java/com/palnet/comn/code/ErrorCode.java index 2531247b..62d0c65d 100644 --- a/pav-server/src/main/java/com/palnet/comn/code/ErrorCode.java +++ b/pav-server/src/main/java/com/palnet/comn/code/ErrorCode.java @@ -1,36 +1,61 @@ package com.palnet.comn.code; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.palnet.biz.jpa.entity.type.FltType; + public enum ErrorCode { - SUCCESS("1", "성공"), - FAIL("-1" , "실패"), - NON_VALID_PARAMETER("VP001", "파라미터가 유효하지 않습니다."), - INTERNAL_SERVER_ERROR("ER500", "내부 시스템 오류"), - NOT_REGIST_ERROR_CODE("ER501", "등록되지 않은 오류 코드"), - DATA_NOTFIND("DT001","데이터 를 찾을수 없습니다."), - DATA_DUPLICATE("DT002","중복 데이터가 존재합니다."), - DATA_NO("DT003", "데이터 미존재"), - DB_ERROR("DB001" , "디비 처리중 오류"), - PLAN_DATA_DUPLICATE("FT500", "이미 등록된 비행계획서의 비행구역과 비행시간이 일치합니다.\n비행시간 또는 비행구역을 수정하여 주십시오."), - ARCRFT_DATA_DUPLICATE("FT501", "해당 기체는 다른 비행계획서에서 이미 등록된 기체입니다.\n비행시간 또는 기체 정보를 확인하여 주십시오."), - PLAN_LAANC_NOT_VALID("FT502", "LAANC를 통과하지 못한 비행계획서입니다."), - EXTERNAL_API_ERROR("EA500", "외부서버 호출에 실패하였습니다."); - - - - private final String code; - - private final String message; - - private ErrorCode(String code, String message) { - this.code = code; - this.message = message; - } - - public String code() { - return code; - } - - public String message() { - return message; - } + SUCCESS("1", "성공"), + FAIL("-1", "실패"), + NON_VALID_PARAMETER("VP001", "파라미터가 유효하지 않습니다."), + INTERNAL_SERVER_ERROR("ER500", "내부 시스템 오류"), + NOT_REGIST_ERROR_CODE("ER501", "등록되지 않은 오류 코드"), + DATA_NOTFIND("DT001", "데이터 를 찾을수 없습니다."), + DATA_DUPLICATE("DT002", "중복 데이터가 존재합니다."), + DATA_NOT_CHANGE("DT003", "아직 갱신되지 않았습니다."), + DATA_NO("DT003", "데이터 미존재"), + DB_ERROR("DB001", "디비 처리중 오류"), + PLAN_DATA_DUPLICATE("FT500", "이미 등록된 비행계획서의 비행구역과 비행시간이 일치합니다.\n비행시간 또는 비행구역을 수정하여 주십시오."), + ARCRFT_DATA_DUPLICATE("FT501", "해당 기체는 다른 비행계획서에서 이미 등록된 기체입니다.\n비행시간 또는 기체 정보를 확인하여 주십시오."), + PLAN_LAANC_NOT_VALID("FT502", "LAANC를 통과하지 못한 비행계획서입니다."), + EXTERNAL_API_ERROR("EA500", "외부서버 호출에 실패하였습니다."), + AUTH_NAUTHORIZED("AU001", "권한이 없습니다."), + + // TS 연동 ERROR CODE + TS_SUCCESS("TS200", "정상적으로 수신되었습니다."), + TS_PARAM("TS300", "메시지 규격이 다릅니다."), // Json 포멧이 틀린 경우 + TS_PARAM_REQUIRED("TS301", "필수 항목이 누락되었습니다."), // 필수 항목이 누락된 경우 + TS_TYPE("TS302", "메시지 타입이 맞지 않습니다."), // 메시지내 파라미터의 타입이 잘못된 경우 + TS_SERVER_ERROR("TS500", "서버 연결이 되지 않습니다."), // call측 network exception 처리 + TS_NT_LAZY("TS501", "네트워크 연결이 지연 됩니다."), // call측 network exception 처리 + TS_AUTH_KEY("TS600", "인증키가 유효하지 않습니다."), + TS_ETC("TS700", "기타 오류"), // 기 정의된 내용이 아닌 기타 오류인 경우 + + // QR 관련 ERROR CODE + QR_EXPIRED("QR001", "QR코드 유효기간이 만료되었습니다"); + private final String code; + + private final String message; + + private ErrorCode(String code, String message) { + this.code = code; + this.message = message; + } + + public String code() { + return code; + } + + public String message() { + return message; + } + + @JsonCreator + public static ErrorCode fromCode(String code) { + for (ErrorCode errorCode : ErrorCode.values()) { + if (errorCode.code().equals(code)) { + return errorCode; + } + } + return null; + } } diff --git a/pav-server/src/main/java/com/palnet/comn/model/GPModel.java b/pav-server/src/main/java/com/palnet/comn/model/GPModel.java index 68da238f..7784da1f 100644 --- a/pav-server/src/main/java/com/palnet/comn/model/GPModel.java +++ b/pav-server/src/main/java/com/palnet/comn/model/GPModel.java @@ -3,72 +3,110 @@ package com.palnet.comn.model; import java.time.Instant; import java.util.List; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; @Data public class GPModel { + @Schema(description = "데이터 타입[01 : 최초 들어온 데이터 , 02: 관제ID가 조회되지 않은 경우, 99 : 종료 시킬 데이터]" , example = "02") private String typeCd; // 01 : 최초 들어온 데이터 , 99 : 종료 시킬 데이터 + @Schema(description = "메세지 설정방식" , example = "LTEM") private String messageType; + @Schema(description = "터미널ID[채널고유코드]" , example = "SANDBOX-001") private String terminalId; + @Schema(description = "이동거리" , example = "100") private Double moveDistance = 0.0; + @Schema(description = "이동단위" , example = "M") private String moveDistanceType; + @Schema(description = "관제아이디" , example = "0bfef5f3-4289-42c0-990d-40415203eeef") private String controlId; // 처음 위치 데이터가 들어 왔을때 생성 함 + @Schema(description = "기체타입" , example = "DRON") private String objectType; + @Schema(description = "기체식별번호" , example = "PALUTM-001") private String objectId; + @Schema(description = "위도" , example = "37.571954") private Double lat = 0.0; + @Schema(description = "경도" , example = "126.775258") private Double lng = 0.0; + @Schema(description = "고도단위" , example = "M") private String elevType; + @Schema(description = "고도값" , example = "100.0") private Double elev = 0.0; - + + @Schema(description = "속도단위" , example = "m/s") private String speedType; - + + @Schema(description = "속도값" , example = "30") private Double speed = 0.0; + @Schema(description = "배터리 잔량" , example = "91.0") private Double betteryLevel = 0.0; + @Schema(description = "배터리 전압" , example = "50.0") private Double betteryVoltage = 0.0; + @Schema(description = "드론상태코드" , example = "TAKEOFF") private String dronStatus; + @Schema(description = "방향" , example = "227.94") private Double heading = 0.0; + @Schema(description = "단말기 수신 시간" , example = "20210629173145") private String terminalRcvDt; + @Schema(description = "서버 수신 시간" , example = "20210629173245") private String serverRcvDt; + @Schema(description = "관제 시작시간" , example = "20210629173345") private String controlStartDt; + @Schema(description = "관제 종료시간" , example = "20210629173445") private String controlEndDt; - + + @Schema(hidden = true) private String areaTrnsYn; // 환경센서 필드 + @Schema(hidden = true) private Double sensorCo = 0.0; + + @Schema(hidden = true) private Double sensorSo2 = 0.0; + + @Schema(hidden = true) private Double sensorNo2 = 0.0; + + @Schema(hidden = true) private Double sensorO3 = 0.0; + + @Schema(hidden = true) private Double sensorDust = 0.0; //최근 5건만 저장 + @Schema(hidden = true) private List recentPositionHistory; // 전체 히스토리 저장 + @Schema(hidden = true) private List postionHistory; // 비정상 상황 식별 코드 + @Schema(hidden = true) private boolean controlWarnCd; + + @Schema(hidden = true) private Instant regDt; } diff --git a/pav-server/src/main/java/com/palnet/comn/storage/controller/StorageController.java b/pav-server/src/main/java/com/palnet/comn/storage/controller/StorageController.java index 23934d5f..494bab7a 100644 --- a/pav-server/src/main/java/com/palnet/comn/storage/controller/StorageController.java +++ b/pav-server/src/main/java/com/palnet/comn/storage/controller/StorageController.java @@ -1,33 +1,51 @@ package com.palnet.comn.storage.controller; +import com.palnet.comn.storage.service.StorageService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.enums.ParameterIn; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.tags.Tag; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.io.ByteArrayResource; import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; -import com.palnet.comn.storage.service.StorageService; - @RestController @RequestMapping("/api/file") +@Tag(name = "Storage", description = "파일데이터 관련 API") public class StorageController { @Autowired private StorageService service; - @PostMapping("/upload") - public ResponseEntity uploadFile(@RequestParam(value = "file") MultipartFile file) { + /** + * 파일 업로드 기능 + * @param file + * @return + */ + @PostMapping(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) + @Operation(summary = "파일업로드") + public ResponseEntity uploadFile( + @Parameter( + description = "multipart/form-data 형식의 파일데이터를 input으로 받습니다. 이때 key 값은 file 입니다.", + content = @Content(mediaType = MediaType.MULTIPART_FORM_DATA_VALUE) + )@RequestParam(value = "file") MultipartFile file + ) { return new ResponseEntity<>(service.uploadFile(file), HttpStatus.OK); } + /** + * 파일 다운로드 기능. + * @param fileName + * @return + */ @GetMapping("/download/{fileName}") + @Operation(summary = "파일다운로드") + @Parameter(name="fileName", description = "파일 명", in = ParameterIn.PATH, example = "파일명") public ResponseEntity downloadFile(@PathVariable String fileName) { byte[] data = service.downloadFile(fileName); ByteArrayResource resource = new ByteArrayResource(data); @@ -39,7 +57,14 @@ public class StorageController { .body(resource); } + /** + * 파일 삭제 기능. + * @param fileName + * @return + */ @DeleteMapping("/delete/{fileName}") + @Operation(summary = "파일삭제") + @Parameter(name="fileName", description = "파일 명", in = ParameterIn.PATH, example = "파일명") public ResponseEntity deleteFile(@PathVariable String fileName) { return new ResponseEntity<>(service.deleteFile(fileName), HttpStatus.OK); } diff --git a/pav-server/src/main/java/com/palnet/comn/storage/service/StorageService.java b/pav-server/src/main/java/com/palnet/comn/storage/service/StorageService.java index a364365d..cfe92eac 100644 --- a/pav-server/src/main/java/com/palnet/comn/storage/service/StorageService.java +++ b/pav-server/src/main/java/com/palnet/comn/storage/service/StorageService.java @@ -25,6 +25,11 @@ public class StorageService { @Autowired private AmazonS3 s3Client; + /** + * 파일 업로드 기능. + * @param file + * @return + */ public String uploadFile(MultipartFile file) { File fileObj = convertMultiPartFileToFile(file); String fileName = System.currentTimeMillis() + "_" + file.getOriginalFilename(); @@ -34,6 +39,11 @@ public class StorageService { } + /** + * 파일 다운로드 기능. 아마존 S3에 있는 데이터 다운로드해주는 기능. + * @param fileName + * @return + */ public byte[] downloadFile(String fileName) { S3Object s3Object = s3Client.getObject(bucketName, fileName); S3ObjectInputStream inputStream = s3Object.getObjectContent(); @@ -47,12 +57,22 @@ public class StorageService { } + /** + * 아마존 S3에 있는 데이터 삭제하는 기능. + * @param fileName + * @return + */ public String deleteFile(String fileName) { s3Client.deleteObject(bucketName, fileName); return fileName + " removed ..."; } + /** + * MultipartFile로 받은 객체를 File 객체로 변환 + * @param file + * @return + */ private File convertMultiPartFileToFile(MultipartFile file) { File convertedFile = new File(file.getOriginalFilename()); try (FileOutputStream fos = new FileOutputStream(convertedFile)) { diff --git a/pav-server/src/main/java/com/palnet/comn/utils/AirspaceUtils.java b/pav-server/src/main/java/com/palnet/comn/utils/AirspaceUtils.java index 06b7d540..66dbe156 100644 --- a/pav-server/src/main/java/com/palnet/comn/utils/AirspaceUtils.java +++ b/pav-server/src/main/java/com/palnet/comn/utils/AirspaceUtils.java @@ -100,7 +100,7 @@ public class AirspaceUtils { for (FeatureInfo featureInfo : this.airspaces) { Geometry airspaceGeometry = featureInfo.getGeometry(); int airspaceHighElev = featureInfo.getHighElev() != null ? featureInfo.getHighElev() : 0; - // 임시로 0~최대고도 기준으로 검증 + // 0~최대고도 기준으로 검증 if (airspaceHighElev == 0 || airspaceHighElev < targetHighElev) { if (airspaceGeometry.intersects(targetGeometry)) { return false; diff --git a/pav-server/src/main/java/com/palnet/comn/utils/DigitalElevationModelUtils.java b/pav-server/src/main/java/com/palnet/comn/utils/DigitalElevationModelUtils.java index 4f816a25..a2d5e496 100644 --- a/pav-server/src/main/java/com/palnet/comn/utils/DigitalElevationModelUtils.java +++ b/pav-server/src/main/java/com/palnet/comn/utils/DigitalElevationModelUtils.java @@ -86,6 +86,12 @@ public class DigitalElevationModelUtils { this.dems = demList; } + /** + * 좌표로 고도값을 구하는 기능. + * 좌표계는 EPSG:4326으로 해야합니다. + * @param coord + * @return + */ public Double getGroundElevation(Coordinate coord) { if (this.dems == null || dems.isEmpty()) return null; diff --git a/pav-server/src/main/java/com/palnet/comn/utils/InstantUtils.java b/pav-server/src/main/java/com/palnet/comn/utils/InstantUtils.java index 43b3e22b..beac60f9 100644 --- a/pav-server/src/main/java/com/palnet/comn/utils/InstantUtils.java +++ b/pav-server/src/main/java/com/palnet/comn/utils/InstantUtils.java @@ -94,6 +94,11 @@ public class InstantUtils { return localDate.atStartOfDay(ZoneId.of(zone)).toInstant(); } + public static Instant fromDatetimeDouble (double dateDouble){ + + return Instant.ofEpochSecond((long) dateDouble, (long) ((dateDouble % 1) * 1_000_000_000)); + } + // string validate format public static boolean isValidFormat(String dateString, String format) { SimpleDateFormat dateFormat = new SimpleDateFormat(format); diff --git a/pav-server/src/main/resources/application-database.yml b/pav-server/src/main/resources/application-database.yml index 5bbec65b..82c28b67 100644 --- a/pav-server/src/main/resources/application-database.yml +++ b/pav-server/src/main/resources/application-database.yml @@ -41,8 +41,8 @@ spring: datasource: control: driver-class-name: net.sf.log4jdbc.sql.jdbcapi.DriverSpy - jdbc-url: jdbc:log4jdbc:mysql://palnet.cexpliz30rwl.ap-northeast-2.rds.amazonaws.com:3306/PAV?characterEncoding=UTF-8&autoReconnect=true&useSSL=false - username: pav + jdbc-url: jdbc:log4jdbc:mysql://192.168.100.102:3306/PAV_KAC?characterEncoding=UTF-8&autoReconnect=true&useSSL=false + username: pav-kac password: palnet!234 minimumidle: 10 maximumpoolsize: 20 diff --git a/pav-server/src/main/resources/application-swagger.yml b/pav-server/src/main/resources/application-swagger.yml new file mode 100644 index 00000000..607df844 --- /dev/null +++ b/pav-server/src/main/resources/application-swagger.yml @@ -0,0 +1,37 @@ +springdoc: + # 해당 패턴에 매칭되는 controller만 swagger-ui에 노출한다. + paths-to-match: + - /api/** + paths-to-exclude: + - /api/v1/utm + - /api/bas/flight/** + - /api/ctr/cntrl/contains + - /api/file/** + swagger-ui: + # 각 API의 그룹 표시 순서 + # path, query, body, response 순으로 출력 + groups-order: DESC + + # 태그 정렬 순서. + # alpha: 알파벳 순 정렬 + # method: OpenAPI specification file에 원하는 태그 정렬 방식 직접 기재 + tags-sorter: alpha + + # 컨트롤러 정렬 순서. + # method는 delete - get - patch - post - put 순으로 정렬된다. + # alpha를 사용해 알파벳 순으로 정렬할 수 있다. + operations-sorter: method + + # Spring Actuator의 endpoint까지 보여줄 것인지? + show-actuator: false + + # request media type 의 기본 값 + default-consumes-media-type: application/json + + # response media type 의 기본 값 + default-produces-media-type: application/json + + # Swagger UI에서 기본적으로 펼쳐져 보이는 경로의 수 + doc-expansion : none + + diff --git a/pav-server/src/main/resources/application.properties b/pav-server/src/main/resources/application.properties index 0c10bc98..3750696c 100644 --- a/pav-server/src/main/resources/application.properties +++ b/pav-server/src/main/resources/application.properties @@ -17,6 +17,7 @@ external.sunriseset.key=b/Stm6AMT3EwXc5kOvwnjK/PB57Ay1WzkIGVx5WaMt0MyRt3TEPgcJ/u ### TS ### external.ts.url=http://121.137.95.45:8170 +external.ts.return.uri=/api/external/laanc/vc/callback ### Token key ###### spring.jwt.secret=jwtsecretkey diff --git a/pav-server/src/main/resources/application.yml b/pav-server/src/main/resources/application.yml index 12896de1..ca13db4e 100644 --- a/pav-server/src/main/resources/application.yml +++ b/pav-server/src/main/resources/application.yml @@ -2,6 +2,7 @@ spring: profiles: include: - database + - swagger jackson: time-zone: Asia/Seoul @@ -70,6 +71,10 @@ url: file: files/ coord: C:\\Users\\Jaewoo\\Downloads\\pal\\pav\\kac\\coordinate\\CoordinateFolder\\ +app: + host: http://localhost:8080 +# host: http://211.253.11.189:8080 + --- spring: @@ -120,6 +125,10 @@ url: file: /data/server/files/ coord: /data/coord/coordinateFolder/ +app: + host: http://211.253.11.189:8080 + + --- spring: @@ -179,3 +188,7 @@ url: file: /data/server/files/ coord: /data/coord/coordinateFolder/ + +app: +# host: http://211.253.11.189:8080 + host: http://121.190.193.50:6081 diff --git a/pav-server/src/main/resources/config/log/logback-spring.xml b/pav-server/src/main/resources/config/log/logback-spring.xml index 3d4023dd..698ea9e9 100644 --- a/pav-server/src/main/resources/config/log/logback-spring.xml +++ b/pav-server/src/main/resources/config/log/logback-spring.xml @@ -12,7 +12,7 @@ - + diff --git a/pav-server/src/test/java/com/palnet/exec/SecurityTest.java b/pav-server/src/test/java/com/palnet/exec/SecurityTest.java new file mode 100644 index 00000000..ad97b8c0 --- /dev/null +++ b/pav-server/src/test/java/com/palnet/exec/SecurityTest.java @@ -0,0 +1,78 @@ +package com.palnet.exec; + +import com.palnet.comn.utils.EncryptUtils; +import lombok.extern.slf4j.Slf4j; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.ActiveProfiles; + +import java.util.Arrays; +import java.util.List; + +@Slf4j +@ActiveProfiles("local") +@SpringBootTest +public class SecurityTest { + + @Test + void decrypt() { + // 3//025nCkpUAjOL+QNYfcDt0zQeDO3heTwJaw13ESJY= + // EK6ER4jyTJlMMah+7twdpBtGEkpFe/eJX3IGMNzTOgU= + // EK6ER4jyTJlMMah+7twdpBtGEkpFe/eJX3IGMNzTOgU= + // C3loAju2SFafvZpLJA3lAA== + // UAaPWTjOlEowarUltzfB0F29+Nn0OhMxF/NvtAGrScU= + // 3//025nCkpUAjOL+QNYfcDt0zQeDO3heTwJaw13ESJY= + // 2Hd4dyUTNJksomwxxVRMwg== + // TxlVyrPwJD2mM2evYk8aOw== + // BA8GqKuRt069yc1oP1QmJA== + // BA8GqKuRt069yc1oP1QmJA== + // BwPdEPwwP6IGUmf+lGBFFA== + // CeGY0lMsDLnu/1qHY0SnfQ== + + List strList = Arrays.asList( + "zopFv8IWLcrAuDbonqqBKix+g3z8BlDoZ4Vs4ksbStA=", + "Zl+WpxSpYHKm5pR/LvpSlg==", + "3//025nCkpUAjOL+QNYfcDt0zQeDO3heTwJaw13ESJY=", + "EK6ER4jyTJlMMah+7twdpBtGEkpFe/eJX3IGMNzTOgU=", + "EK6ER4jyTJlMMah+7twdpBtGEkpFe/eJX3IGMNzTOgU=", + "C3loAju2SFafvZpLJA3lAA==", + "UAaPWTjOlEowarUltzfB0F29+Nn0OhMxF/NvtAGrScU=", + "3//025nCkpUAjOL+QNYfcDt0zQeDO3heTwJaw13ESJY=", + "2Hd4dyUTNJksomwxxVRMwg==", + "TxlVyrPwJD2mM2evYk8aOw==", + "BA8GqKuRt069yc1oP1QmJA==", + "BA8GqKuRt069yc1oP1QmJA==", + "BwPdEPwwP6IGUmf+lGBFFA==", + "CeGY0lMsDLnu/1qHY0SnfQ==" + ); + strList.forEach(str -> { + String decrypStr = EncryptUtils.decrypt(str); + log.info("decrypStr: {}", decrypStr); + }); + } + + @Test + void encrypt() { + List strList = Arrays.asList( + "01072288459", + "dhji@palnet.co.kr" + ); + + strList.forEach(str -> { + String encrypStr = EncryptUtils.encrypt(str); + log.info("encrypStr: {}", encrypStr); + }); + } + + @Test + void password() { + String pw = "palnet!234"; + String sha = EncryptUtils.sha256Encrypt(pw); + log.info(sha); + } + + @Test + void matchPassword() { +// String pw + } +} diff --git a/pav-socket/src/main/java/com/palnet/comn/collection/GPCollection.java b/pav-socket/src/main/java/com/palnet/comn/collection/GPCollection.java index 57d209b9..c7d4abf6 100644 --- a/pav-socket/src/main/java/com/palnet/comn/collection/GPCollection.java +++ b/pav-socket/src/main/java/com/palnet/comn/collection/GPCollection.java @@ -32,7 +32,7 @@ public class GPCollection { } public static Map> getAll() { - if (gpMap.keySet().size() < 1) { + if (gpMap.keySet().isEmpty()) { return null; } return gpMap; @@ -74,7 +74,7 @@ public class GPCollection { public static Map> sendAll() { log.info("sendAll start - GPMap size : {}", gpMap.size()); - if(gpMap.keySet().size() < 1) { + if(gpMap.keySet().isEmpty()) { return null; } Map> map = gpMap; @@ -83,13 +83,50 @@ public class GPCollection { return map; } + public static List sendAllUtm() { + log.info("sendAllUtm start - GPMap size : {}", gpMap.size()); + if(gpMap.keySet().isEmpty()) { + return null; + } + List list = new ArrayList<>(); + for (String key : gpMap.keySet()) { + List temp = gpMap.get(key); + if (temp == null || temp.isEmpty()) { + continue; + } + GPModel model = temp.get(temp.size() - 1); + if(!model.isSendUtm()){ + list.add(model); + } + } + log.info("sendAllUtm end - GPMap size : {}", gpMap.size()); + return list; + } + + public static void sendAllUtmSuccess(List successGPModel) { + if(successGPModel == null || successGPModel.isEmpty()) return; + for (GPModel model : successGPModel) { + if (model == null || model.getObjectId() == null || model.getObjectId().isEmpty()) { + continue; + } + List list = gpMap.get(model.getObjectId()); + if (list == null) return; + list.stream().filter(gpModel -> { + if(gpModel == null || gpModel.getRegDt() == null) return false; + return gpModel.getRegDt().equals(model.getRegDt()); + }).findFirst().ifPresent(gpModel -> { + gpModel.setSendUtm(true); + }); + } + } + // 1분마다 데이터 삭제 @Scheduled(fixedDelay = 1000 * 60) public void removeSchedule() { log.info("removeSchedule start - GPMap size : {}", gpMap.size()); for (String key : gpMap.keySet()) { List list = gpMap.get(key); - if (list == null || list.size() == 0) { + if (list == null || list.isEmpty()) { continue; } GPModel model = list.get(list.size() - 1); diff --git a/pav-socket/src/main/java/com/palnet/comn/model/GPModel.java b/pav-socket/src/main/java/com/palnet/comn/model/GPModel.java index 933695f7..a7e0178c 100644 --- a/pav-socket/src/main/java/com/palnet/comn/model/GPModel.java +++ b/pav-socket/src/main/java/com/palnet/comn/model/GPModel.java @@ -72,5 +72,7 @@ public class GPModel { // 큐가 Socket서버에 도착한 시간 private Instant regDt; - + // 큐가 Socket서버에 도착한 시간 + private boolean sendUtm; // 불법드론 전송 여부 + } diff --git a/pav-socket/src/main/java/com/palnet/comn/model/UtmModel.java b/pav-socket/src/main/java/com/palnet/comn/model/UtmModel.java new file mode 100644 index 00000000..0e9ad505 --- /dev/null +++ b/pav-socket/src/main/java/com/palnet/comn/model/UtmModel.java @@ -0,0 +1,37 @@ +package com.palnet.comn.model; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class UtmModel { + @JsonProperty("GPSime") + private String GPSime; // 시간 yyyyMMddHHmmss + @JsonProperty("droneInfo") + private List dronInfo; + + @Data + @NoArgsConstructor + @AllArgsConstructor + @Builder + public static class DronInfo { + @JsonProperty("Id") + private String id; + @JsonProperty("Latitude") + private String latitude; + @JsonProperty("Longitude") + private String longitude; + @JsonProperty("Height") + private String height; + } + + +} diff --git a/pav-socket/src/main/java/com/palnet/server/task/server/service/TaskServerService.java b/pav-socket/src/main/java/com/palnet/server/task/server/service/TaskServerService.java index 5ae683c2..9fff0093 100644 --- a/pav-socket/src/main/java/com/palnet/server/task/server/service/TaskServerService.java +++ b/pav-socket/src/main/java/com/palnet/server/task/server/service/TaskServerService.java @@ -2,6 +2,7 @@ package com.palnet.server.task.server.service; import com.palnet.comn.collection.GPCollection; import com.palnet.comn.model.GPModel; +import com.palnet.comn.model.UtmModel; import com.palnet.comn.utils.JsonUtils; import io.netty.channel.ChannelOption; import lombok.RequiredArgsConstructor; @@ -19,9 +20,14 @@ import java.net.URISyntaxException; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; +import java.time.Instant; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.time.format.DateTimeFormatter; import java.util.List; import java.util.Map; import java.util.concurrent.CompletableFuture; +import java.util.stream.Collectors; /** * packageName : com.palnet.server.task.wb.service @@ -129,4 +135,81 @@ public class TaskServerService { .bodyToMono(Void.class).subscribe(); } + @Scheduled(fixedDelay = 1000 * 2) + public void sendDataAllUtm() { + List modelList = GPCollection.sendAllUtm(); + if (modelList == null) { + return; + } + + // 가공 + List dronInfoList = modelList.stream().map(model -> { + UtmModel.DronInfo dronInfo = UtmModel.DronInfo.builder() + .id(model.getObjectId()) + .latitude(model.getLat().toString()) + .longitude(model.getLng().toString()) + .height(model.getElev().toString()) + .build(); + return dronInfo; + }).collect(Collectors.toList()); + + if(dronInfoList.isEmpty()) return; + + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss") + .withZone(ZoneId.of("Asia/Seoul")); + String dateStr = formatter.format(Instant.now()); + + UtmModel utmModel = UtmModel.builder() + .GPSime(dateStr) + .dronInfo(dronInfoList) + .build(); + + // 임시 하드코딩 + final String UTM_HOST = "http://192.168.0.133:9000"; + final String UTM_REALTIME_URI = "/api/v1/utm"; + + WebClient client = WebClient.builder() + .baseUrl(UTM_HOST) + .defaultHeader("Content-Type", "application/json") + .build(); + + client.post() + .uri(UTM_REALTIME_URI) + .body(Mono.just(utmModel), UtmModel.class) + .retrieve() + .bodyToMono(Void.class).subscribe(); + + // 전송 완료시 true 처리 + GPCollection.sendAllUtmSuccess(modelList); + + } + + public static void main(String[] args) { + + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss") + .withZone(ZoneId.of("Asia/Seoul")); + String dateStr = formatter.format(Instant.now()); + + Double lat = 37.123456; + Double lon = 127.123456; + Double elev = 100.0; + + UtmModel.DronInfo dronInfo = UtmModel.DronInfo.builder() + .id("objectId") + .latitude(lat.toString()) + .longitude(lon.toString()) + .height(elev.toString()) + .build(); + + List dronInfoList = List.of(dronInfo); + + UtmModel utmModel = UtmModel.builder() + .GPSime(dateStr) + .dronInfo(dronInfoList) + .build(); + + String json = JsonUtils.toJson(utmModel); + System.out.println(json); + } + } diff --git a/pav-socket/src/main/resources/application.yml b/pav-socket/src/main/resources/application.yml index 1def7c8f..08dbe473 100644 --- a/pav-socket/src/main/resources/application.yml +++ b/pav-socket/src/main/resources/application.yml @@ -86,12 +86,14 @@ logging: console: '%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n' file: '%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n' file: - name: /data/logs/data.log + name: /data/logs/socket/data.log level: com.palnet: info app: host: http://127.0.0.1:8080 +# host: http://121.190.193.50:8080 web-socket: - host: http://127.0.0.1:8081 + host: http://127.0.0.1:8181 +# host: http://121.190.193.50:8181 diff --git a/pav-websocket/src/main/java/com/palnet/server/controller/SocketReceiverController.java b/pav-websocket/src/main/java/com/palnet/server/controller/SocketReceiverController.java index befdae3a..af22a5e3 100644 --- a/pav-websocket/src/main/java/com/palnet/server/controller/SocketReceiverController.java +++ b/pav-websocket/src/main/java/com/palnet/server/controller/SocketReceiverController.java @@ -36,7 +36,7 @@ public class SocketReceiverController { @PostMapping("/receiver") public ResponseEntity receiver(@RequestBody GPModel model) { - log.info("websocket message : {}", model); + log.info("websocket message receiver : {}", model); // GPModel model = null; // try { // model = objectMapper.readValue(message, GPModel.class); @@ -56,7 +56,7 @@ public class SocketReceiverController { @PostMapping("/receiver/async") public Callable asyncReceiver(@RequestBody GPModel model) { return () -> { - log.info("websocket message : {}", model); + log.info("websocket message receiver async: {}", model); CtrCntrlModel history = service.modelConvert(model); // DRON의 대한 식별정보만 이력 관리 historyShareContext.putHistory(model.getObjectId(), history); diff --git a/pav-websocket/src/main/resources/application.yml b/pav-websocket/src/main/resources/application.yml index e34808a2..b73a87ec 100644 --- a/pav-websocket/src/main/resources/application.yml +++ b/pav-websocket/src/main/resources/application.yml @@ -70,3 +70,4 @@ logging: app: host: http://127.0.0.1:8080/ +# host: http://121.190.193.50:8080/