From 3dd6c8d707357060db233d3c3b21a9b95d5826b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?dhji=28=EC=A7=80=EB=8C=80=ED=95=9C=29?= Date: Tue, 5 Dec 2023 10:24:44 +0900 Subject: [PATCH 01/32] =?UTF-8?q?=EC=84=9C=EB=B2=84=EC=9D=B4=EC=A0=84?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EC=9D=B8=ED=95=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- document/dron_test/pav-warning.js | 7 +++++-- pav-server/src/main/resources/application-database.yml | 4 ++-- pav-server/src/main/resources/application.yml | 3 ++- .../src/main/resources/config/log/logback-spring.xml | 2 +- .../src/main/java/com/palnet/comn/model/UtmModel.java | 1 - pav-socket/src/main/resources/application.yml | 6 ++++-- .../palnet/server/controller/SocketReceiverController.java | 4 ++-- pav-websocket/src/main/resources/application.yml | 1 + 8 files changed, 17 insertions(+), 11 deletions(-) diff --git a/document/dron_test/pav-warning.js b/document/dron_test/pav-warning.js index b3337f28..9207b9e4 100644 --- a/document/dron_test/pav-warning.js +++ b/document/dron_test/pav-warning.js @@ -2,9 +2,12 @@ const { getConnection, writeData } = require('./pav-client'); const { getCoordsFormBetweenCoord, dumyData } = require('./pav-utils'); // const host = '192.168.0.30'; -const host = 'localhost'; +// const host = 'localhost'; +// const host = '192.168.100.101'; +const host = '121.190.193.50'; // const host = '211.253.11.189'; -const port = 8082; +// const port = 8082; +const port = 6083; // 기본정보 const prefix = 'PALUTM-'; 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.yml b/pav-server/src/main/resources/application.yml index a7b707c5..4104734d 100644 --- a/pav-server/src/main/resources/application.yml +++ b/pav-server/src/main/resources/application.yml @@ -189,4 +189,5 @@ url: app: - host: http://211.253.11.189:8080 +# 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-socket/src/main/java/com/palnet/comn/model/UtmModel.java b/pav-socket/src/main/java/com/palnet/comn/model/UtmModel.java index 0ae4f96f..275f6a9c 100644 --- a/pav-socket/src/main/java/com/palnet/comn/model/UtmModel.java +++ b/pav-socket/src/main/java/com/palnet/comn/model/UtmModel.java @@ -1,6 +1,5 @@ package com.palnet.comn.model; -import com.fasterxml.jackson.annotation.JsonAlias; import com.fasterxml.jackson.annotation.JsonProperty; import lombok.AllArgsConstructor; import lombok.Builder; 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/ From 8bdfad57bd0e2db42d9a0c2642637bb2a97aa155 Mon Sep 17 00:00:00 2001 From: 'kyw546' <'kyw546@gmail.com'> Date: Tue, 5 Dec 2023 10:29:48 +0900 Subject: [PATCH 02/32] =?UTF-8?q?=EB=B6=88=EB=B2=95=EB=93=9C=EB=A1=A0=20?= =?UTF-8?q?=EC=97=B0=EA=B3=84=EB=A5=BC=20=EC=9C=84=ED=95=9C=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- document/dron_test/pav-warning.js | 17 +++++++---------- .../java/com/palnet/comn/model/UtmModel.java | 2 +- 2 files changed, 8 insertions(+), 11 deletions(-) diff --git a/document/dron_test/pav-warning.js b/document/dron_test/pav-warning.js index 9207b9e4..cb76da75 100644 --- a/document/dron_test/pav-warning.js +++ b/document/dron_test/pav-warning.js @@ -2,22 +2,19 @@ const { getConnection, writeData } = require('./pav-client'); const { getCoordsFormBetweenCoord, dumyData } = require('./pav-utils'); // const host = '192.168.0.30'; -// const host = 'localhost'; -// const host = '192.168.100.101'; -const host = '121.190.193.50'; +const host = 'localhost'; // const host = '211.253.11.189'; -// const port = 8082; -const port = 6083; +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], 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 index 275f6a9c..0e9ad505 100644 --- a/pav-socket/src/main/java/com/palnet/comn/model/UtmModel.java +++ b/pav-socket/src/main/java/com/palnet/comn/model/UtmModel.java @@ -15,7 +15,7 @@ import java.util.List; public class UtmModel { @JsonProperty("GPSime") private String GPSime; // 시간 yyyyMMddHHmmss - @JsonProperty("dronInfo") + @JsonProperty("droneInfo") private List dronInfo; @Data From 0eac2f6c40919b35532cb0598e284e9accfc8572 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?dhji=28=EC=A7=80=EB=8C=80=ED=95=9C=29?= Date: Wed, 6 Dec 2023 15:12:25 +0900 Subject: [PATCH 03/32] =?UTF-8?q?=EC=99=B8=EB=B6=80=20=ED=98=B8=EC=B6=9C?= =?UTF-8?q?=20security=20=EC=A0=9C=EC=99=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/palnet/biz/config/WebSecurityConfig.java | 1 + 1 file changed, 1 insertion(+) 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 21a20078..e632f62d 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 @@ -41,6 +41,7 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter { "/api/server/**", "/api/comn/file/download", "/api/comn/file/download/**", + "/api/external/laanc/**", // TEST "/api/v1/utm", /* swagger v2 */ From 29f63b91c25c734b0ae7a95fe09224c6bcc7c51d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?dhji=28=EC=A7=80=EB=8C=80=ED=95=9C=29?= Date: Wed, 6 Dec 2023 15:39:01 +0900 Subject: [PATCH 04/32] =?UTF-8?q?TS=20=EC=97=B0=EB=8F=99=20=EC=84=B1?= =?UTF-8?q?=EA=B3=B5=EC=8B=9C=20param=20=EC=A0=84=EC=86=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ExternalLaancController.java | 56 +++++++++++++++---- 1 file changed, 45 insertions(+), 11 deletions(-) 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 index 78f5d18a..934ccf66 100644 --- 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 @@ -46,7 +46,7 @@ public class ExternalLaancController { TsPlanRq tsPlanRq; try { tsPlanRq = JsonUtils.fromJson(body, TsPlanRq.class); - } catch (Exception e){ + } catch (Exception e) { ErrorCode errorCode = ErrorCode.TS_PARAM; Map error = new HashMap<>(); error.put("rspCode", "300"); @@ -75,22 +75,56 @@ public class ExternalLaancController { Map error = new HashMap<>(); error.put("rspCode", ErrorCode.TS_ETC.code()); error.put("rspMessage", ErrorCode.TS_ETC.message()); - return ResponseEntity.status(300).body(error); + return ResponseEntity.status(700).body(error); } - return ResponseEntity.ok().build(); + + 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(@RequestBody TsQrcodeRs rs) { - log.info(">>>> vc/callback body: {}", rs); - tsService.vcCallback(rs); - return ResponseEntity.ok().build(); - } + public ResponseEntity vcCallback(@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); - public static void main(String[] args) { - ErrorCode errorCode = ErrorCode.fromCode("TS200"); - System.out.println(errorCode); + 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); } } From 6e4fa96498aea823c6cb2986ae8abcb68e434c1b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?lkd9125=28=EC=9D=B4=EA=B2=BD=EB=8F=84=29?= Date: Thu, 7 Dec 2023 10:47:02 +0900 Subject: [PATCH 05/32] =?UTF-8?q?crtfyhp=20=ED=8C=A8=ED=82=A4=EC=A7=80=20?= =?UTF-8?q?=EC=A3=BC=EC=84=9D=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/AcntCrtfyhpController.java | 103 ++++++++++------ .../crtfyhp/service/AcntCrtfyhpService.java | 112 ++++++++++++++---- .../pty/PtyCrtfyhpBasQueryRepository.java | 24 +++- .../pty/PtyCstmrQueryRepository.java | 102 ++++++++++++++-- 4 files changed, 267 insertions(+), 74 deletions(-) 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..efc4fd33 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 @@ -49,36 +49,43 @@ public class AcntCrtfyhpController { @ApiImplicitParam(name = "hnpo",value = "휴대폰번호", dataTypeClass = String.class) public ResponseEntity send(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)); } @@ -93,22 +100,25 @@ public class AcntCrtfyhpController { public ResponseEntity confirm(String hpno , 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")); @@ -127,15 +137,15 @@ public class AcntCrtfyhpController { @ApiImplicitParam(name = "hpno", value = "휴대폰 번호", dataTypeClass = String.class) }) public ResponseEntity sendForId(String memberName, String hpno) { - Map resultMap = new HashMap(); + 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")); @@ -159,10 +176,10 @@ public class AcntCrtfyhpController { @ApiImplicitParam(name = "hpno",value = "휴대폰번호", dataTypeClass = String.class) }) public ResponseEntity findUserId(String memberName, String hpno) { - Map resultMap = new HashMap(); + 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)); } @@ -195,13 +212,13 @@ public class AcntCrtfyhpController { public ResponseEntity sendForPw(String userId, 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 +226,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")); @@ -229,13 +253,13 @@ public class AcntCrtfyhpController { public ResponseEntity updatePw(String userId, String hpno, 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 +267,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 dea69c94..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 @@ -106,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); //메시지 만들기 @@ -126,15 +133,25 @@ public class AcntCrtfyhpService { ptyEntity.setCrtfyhpYn("N"); ptyCrtfyhpBasRepository.save(ptyEntity); - logger.info("certifyNo :: " + certifyNo); + logger.info("certifyNo :: {}", certifyNo); // 로그로 인증번호 값을 찍어줌 - String nowStr = InstantUtils.toDatetimeStringByFormat(Instant.now(), "yyyyMMddHHmmss"); + // 현재시간 값을 구해옴 예시 => 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); @@ -146,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; } @@ -156,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 = ""; //난수가 저장될 변수 @@ -187,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/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 eeff29fe..2a6ae1fa 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 @@ -49,24 +49,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 +100,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 +125,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 +139,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,27 +163,44 @@ 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; - } public JwtUserModel findUserPassword(String userId) { From e71de75916f4df29a53a0bd8690f097fce00f75b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?lkd9125=28=EC=9D=B4=EA=B2=BD=EB=8F=84=29?= Date: Thu, 7 Dec 2023 11:21:18 +0900 Subject: [PATCH 06/32] =?UTF-8?q?cstmr=20=ED=8C=A8=ED=82=A4=EC=A7=80=20?= =?UTF-8?q?=EC=A3=BC=EC=84=9D=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/AcntCrtfyhpController.java | 43 ++++++- .../cstmr/controller/AcntCstmrController.java | 114 +++++++++++++++++- .../acnt/cstmr/service/AcntCstmrService.java | 106 ++++++++++++---- .../biz/api/acnt/jwt/utils/JwtTokenUtil.java | 4 + .../pty/PtyCstmrQueryRepository.java | 41 ++++++- 5 files changed, 271 insertions(+), 37 deletions(-) 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 efc4fd33..e39c72dd 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 @@ -43,7 +43,12 @@ public class AcntCrtfyhpController { @Autowired private PtyCstmrQueryRepository ptyCstmrQueryRepository; - + /** + * 인증번호를 발송하는 기능, + * hpno 값은 휴대폰번호입니다. 이 번호에 인증번호를 발송합니다. + * @param hpno + * @return + */ @GetMapping(value = "/register/send") @Tag(name = "휴대폰 인증 관리", description = "회원 휴대폰 인증 관련 API") @ApiImplicitParam(name = "hnpo",value = "휴대폰번호", dataTypeClass = String.class) @@ -91,6 +96,12 @@ public class AcntCrtfyhpController { + /** + * 인증메세지를 받은 사용자가 인증번호를 입력하여 인증처리하는 기능입니다. + * @param hpno + * @param crtfyNo + * @return + */ @GetMapping(value = "/register/confirm") @Tag(name = "휴대폰 인증 관리", description = "회원 휴대폰 인증 관련 API") @ApiImplicitParams({ @@ -128,7 +139,12 @@ public class AcntCrtfyhpController { } - //아이디 찾기 시 인증번호 발송 로직 + /** + * 아이디 찾기 시 인증번호 발송 로직 + * @param memberName + * @param hpno + * @return + */ @GetMapping(value = "/find/sendForId") @ApiOperation(value = "아이디 찾기 시 인증번호 발송") @Tag(name = "휴대폰 인증 관리", description = "회원 휴대폰 인증 관련 API") @@ -167,7 +183,12 @@ 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") @@ -201,7 +222,12 @@ 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") @@ -241,7 +267,14 @@ 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") 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 5e230937..5f41bdcf 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 @@ -32,6 +32,11 @@ public class AcntCstmrController { private final AcntCstmrService service; + /** + * 회원가입 기능, AcntCstmrRqModel에 사용자가 입력한 회원 정보가 들어있음 + * @param rq + * @return + */ @PostMapping(value = "/register") @ApiOperation(value = "회원 가입") @Tag(name = "회원관리", description = "회원 관련 API") @@ -46,9 +51,16 @@ public class AcntCstmrController { 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); + 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,6 +69,12 @@ public class AcntCstmrController { return ResponseEntity.ok().body(new SuccessResponse(result)); } + /** + * 회원 조회하는 기능, cstmrSno는 회원 고유번호 입니다. + * 고유번호로 회원의 정보를 조회합니다. + * @param cstmrSno + * @return + */ @GetMapping(value = "/profile/{cstmrSno}") @ApiOperation(value = "회원 정보") @Tag(name = "회원관리", description = "회원 관련 API") @@ -66,9 +84,16 @@ public class AcntCstmrController { 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 +103,43 @@ public class AcntCstmrController { return ResponseEntity.ok().body(new SuccessResponse(result)); } + /** + * 회원 계정 암호 변경하는 기능, + * AcntCstmrPwModel애 회원이 입력한 기존암호, 변경할 암호값이 있습니다. + * @param rq + * @return + */ @PostMapping(value = "/profile/pswdupdate") @ApiOperation(value = "회원 패스워드 변경") @Tag(name = "회원관리", description = "회원 관련 API") 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 +147,43 @@ 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){ Map resultMap = new HashMap(); try { - boolean result = service.extendpsw(userPswdMap.get("userPswd")); + boolean result = service.extendpsw(userPswdMap.get("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,6 +191,12 @@ public class AcntCstmrController { return ResponseEntity.ok().body(new SuccessResponse<>(resultMap)); } + /** + * 회원정보 수정하는 기능, + * AcntCstmrEmModel에 회원이 입력한 수정할 정보들로 수정합니다. + * @param rq + * @return + */ @PutMapping(value = "/profile/update") @ApiOperation(value = "회원 정보 변경 (이메일,핸드폰)") @Tag(name = "회원관리", description = "회원 관련 API") @@ -131,10 +204,18 @@ public class AcntCstmrController { 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 +223,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,6 +237,12 @@ 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") @@ -157,11 +251,19 @@ public class AcntCstmrController { 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/service/AcntCstmrService.java b/pav-server/src/main/java/com/palnet/biz/api/acnt/cstmr/service/AcntCstmrService.java index af53d350..b07964b1 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,7 +117,7 @@ public class AcntCstmrService { } } - //성공 파람 담기 + //성공 데이터 담기 if(basEntity != null) { rs.setErrCode(1); rs.setLoginId(basEntity.getUserId()); @@ -134,6 +132,12 @@ public class AcntCstmrService { return rs; } + /** + * AcntCstmrRqModel에 담겨있는 회원정보를 데이터베이스에 추가[INSERT]하는 기능. + * @param rq + * @return + * @throws Exception + */ public PtyCstmrBas savePtyCstmrBas(AcntCstmrRqModel rq) throws Exception{ @@ -153,6 +157,13 @@ 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("")){ @@ -194,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(); @@ -233,6 +254,11 @@ public class AcntCstmrService { return updateUserEntity; } + /** + * 기존 암호가 맞는지 확인하는 기능. + * @param userPswd + * @return + */ public boolean extendpsw(String userPswd){ boolean result = false; // 1. 토큰 유저 정보 불러오기 @@ -263,36 +289,57 @@ 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(); + List groupInfo = jwtTokenUtil.getGroupAuthByToken(); // 회원의 속한 그룹을 조회 + for(JwtGroupModel group : groupInfo) { // if(group.getGroupAuthCd().equals("CREATER")) { + + // 회원의 그룹 권한이 MASTER 일 경우 if(group.getGroupAuthCd().equals("MASTER")) { - PtyGroupBas groupEntity = ptyGroupBasRepository.findByGroupId(group.getGroupId()); + PtyGroupBas groupEntity = ptyGroupBasRepository.findByGroupId(group.getGroupId()); + + // 그룹이 있을경우 그룹의 사용여부 "N" 값으로 저장 if(!(groupEntity == null)) { groupEntity.setUseYn("N"); ptyGroupBasRepository.save(groupEntity); } - List cstmrEntity = ptyCstmrGroupRepository.changeGroupJoinYn(group.getGroupId()); + + List cstmrEntity = ptyCstmrGroupRepository.changeGroupJoinYn(group.getGroupId()); + + // cstmrEntity 값이 있을 경우 참여여부 "N" 값으로 저장 if(!(cstmrEntity == null)) { for(PtyCstmrGroup cstmr : cstmrEntity) { cstmr.setJoinYn("N"); @@ -300,20 +347,29 @@ public class AcntCstmrService { } } } + + // 회원 고유번호로 데이터베이스에서 그룹참여정보 가져옴 List AprvlEntity = ptyCstmrGroupRepository.changeGroupAprvlYn(cstmrSno); + + // AprvlEntity[그룹참여 정보가] 있을경우 if(!(AprvlEntity == null)) { + // 그룹 승인여부를 "N"값으로 저장 for(PtyCstmrGroup Aprvl : AprvlEntity) { Aprvl.setAprvlYn("N"); Aprvl.setAprvlDt(null); ptyCstmrGroupRepository.save(Aprvl); } - PtyCstmrGroup cstmrEntity = ptyCstmrGroupRepository.findGroupId(group.getGroupId(), cstmrSno); - if(!(cstmrEntity == null)) { - cstmrEntity.setJoinYn("N"); - ptyCstmrGroupRepository.save(cstmrEntity); + + // 그룹 참여여부를 "N"값으로 저장 + 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/utils/JwtTokenUtil.java b/pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/utils/JwtTokenUtil.java index 86e1ef84..c10635b3 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 @@ -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/jpa/repository/pty/PtyCstmrQueryRepository.java b/pav-server/src/main/java/com/palnet/biz/jpa/repository/pty/PtyCstmrQueryRepository.java index 2a6ae1fa..92cac8e0 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) @@ -340,11 +356,34 @@ 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, From a255674a66e8086a7056852bcf573aa2f4a404a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?lkd9125=28=EC=9D=B4=EA=B2=BD=EB=8F=84=29?= Date: Thu, 7 Dec 2023 11:41:05 +0900 Subject: [PATCH 07/32] =?UTF-8?q?jwt=ED=8C=A8=ED=82=A4=EC=A7=80=20?= =?UTF-8?q?=EC=B6=94=EC=84=9D=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../JwtAuthenticationController.java | 58 ++++++++++++++----- .../biz/api/acnt/jwt/service/JwtService.java | 33 +++++++---- .../pty/PtyCstmrQueryRepository.java | 34 +++++++++++ 3 files changed, 100 insertions(+), 25 deletions(-) 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..45de1880 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 @@ -41,20 +41,30 @@ public class JwtAuthenticationController { @Autowired private JwtService service; + /** + * 로그인 기능, + * JwtRqModel에 입력받은 회원아이디, 입력받은 회원 비밀번호로 인증처리를 함. + * @param authenticationRequest + * @return + * @throws Exception + */ @PostMapping(value = "/login") @ApiOperation(value = "로그인") @Tag(name = "JWT 토큰 이용", description = "JWT 토큰 관련 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,49 +75,70 @@ 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{ - 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{ - //입력값 검증 + // 회원고유번호[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 = 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)); } + /** + * 로그아웃 기능. + * @param cstmrSno + * @return + * @throws Exception + */ @GetMapping(value = "/logout/{cstmrSno}") @ApiOperation(value = "로그아웃 한 회원의 정보") @Tag(name = "JWT 토큰 이용", description = "JWT 토큰 관련 API") @@ -120,10 +151,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/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/jpa/repository/pty/PtyCstmrQueryRepository.java b/pav-server/src/main/java/com/palnet/biz/jpa/repository/pty/PtyCstmrQueryRepository.java index 92cac8e0..d9b89460 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 @@ -279,6 +279,11 @@ public class PtyCstmrQueryRepository { } + /** + * cstmrSno 값으로 회원정보를 조회하는 SQL 기능. + * @param cstmrSno + * @return + */ public JwtProfileRsModel findUserProfile(int cstmrSno) { QPtyCstmrBas basEntity = QPtyCstmrBas.ptyCstmrBas; QPtyCstmrDtl dtlEntity = QPtyCstmrDtl.ptyCstmrDtl; @@ -287,6 +292,22 @@ 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, @@ -333,11 +354,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) From 211ce9ae82ffe749e0692fafc349b34cde7e7770 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?lkd9125=28=EC=9D=B4=EA=B2=BD=EB=8F=84=29?= Date: Thu, 7 Dec 2023 11:48:32 +0900 Subject: [PATCH 08/32] =?UTF-8?q?terms=ED=8C=A8=ED=82=A4=EC=A7=80=20?= =?UTF-8?q?=EC=A3=BC=EC=84=9D=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../terms/controller/AcntTermsController.java | 8 +++++- .../acnt/terms/service/AcntTermsService.java | 5 ++++ .../pty/PtyTermsQueryRepository.java | 28 ++++++++++++++++++- 3 files changed, 39 insertions(+), 2 deletions(-) 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..c5cb7247 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 @@ -28,6 +28,12 @@ public class AcntTermsController { private final AcntTermsService service; + /** + * 약관정보 들을 가져오는 기능, + * AcntTermsRqModel에 입력받은 약관타입에 따른 약관항목을 반환함. + * @param rq + * @return + */ @GetMapping(value = "/list") @Tag(name = "약관 기본", description = "약관 관련 API") @ApiOperation(value = "약관 기본 정보") @@ -37,7 +43,7 @@ public class AcntTermsController { 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/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/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, From d66b221762bc42076c2324b31976cf074272869c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?lkd9125=28=EC=9D=B4=EA=B2=BD=EB=8F=84=29?= Date: Thu, 7 Dec 2023 14:45:25 +0900 Subject: [PATCH 09/32] =?UTF-8?q?anls/hstry=20=ED=8C=A8=ED=82=A4=EC=A7=80?= =?UTF-8?q?=20=EC=A3=BC=EC=84=9D=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hstry/controller/AnlsHstryController.java | 52 +++++- .../anls/hstry/service/AnlsHstryService.java | 49 ++++-- .../ctr/CtrCntrlQueryRepository.java | 164 +++++++++++++++++- 3 files changed, 240 insertions(+), 25 deletions(-) diff --git a/pav-server/src/main/java/com/palnet/biz/api/anls/hstry/controller/AnlsHstryController.java b/pav-server/src/main/java/com/palnet/biz/api/anls/hstry/controller/AnlsHstryController.java index ab2edf8a..c3ac27b8 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/anls/hstry/controller/AnlsHstryController.java +++ b/pav-server/src/main/java/com/palnet/biz/api/anls/hstry/controller/AnlsHstryController.java @@ -33,6 +33,12 @@ public class AnlsHstryController { private final AnlsHstryService service; + /** + * 비행현황 목록 리스트 조회하는 기능, + * AnlsHstryGroupModel에 따른 리스트를 조회함. + * @param rq + * @return + */ @GetMapping(value = "/list") @ApiOperation(value = "비행 현황 목록 출력") @Tag(name = "비행 이력 현황", description = "비행 이력 현황 관련 API") @@ -40,16 +46,24 @@ public class AnlsHstryController { List rs = null; ComnPagingRs response; - //입력값 검증 + // 검색 시작일 날짜[stDate], 검색 끝일 날짜 날짜값[endDate], 날짜값이 10자리인지 확인[정해진 포맷팅인지 확인하는 것] 입력값 검증처리 if(rq.getStDate() == null || !(rq.getStDate().length() == 10) || rq.getEndDate() ==null || !(rq.getEndDate().length() == 10) ) { - return ResponseEntity.status(HttpStatus.OK) + // 검증통과하지 못할 시 서버에서 "의도적인" 에러 반환 + return ResponseEntity.status(HttpStatus.OK) // "의도적인" 에러 반환코드 .body(new ErrorResponse(RSErrorCode.ER_PARAM)); } try { - response = service.list(rq); + response = service.list(rq); // 비행현황 목록 조회하는 기능. } catch (Exception e) { + /** + * try{ + ... + } + * try 영역 안 코드들중 문제가 생기면 오는 곳. + * log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌 + */ log.error("IGNORE : {}", e); return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) .body(new ErrorResponse("Server Error", "-1")); @@ -59,6 +73,12 @@ public class AnlsHstryController { } + /** + * 비행현황의 상세정보를 조회함, + * 비행ID[CNTRL_ID]로 조회함 + * @param id + * @return + */ @GetMapping(value = "/detail/{id}") @ApiOperation(value = "비행 현황 상세") @Tag(name = "비행 이력 현황", description = "비행 이력 현황 관련 API") @@ -67,9 +87,16 @@ public class AnlsHstryController { AnlsHstryModel result = null; try { - result = service.detail(id); + result = service.detail(id); // 비행ID[CNTRL_ID]로 비행 상세정보를 조회하는 기능. } catch (Exception e) { + /** + * try{ + ... + } + * try 영역 안 코드들중 문제가 생기면 오는 곳. + * log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌 + */ log.error("IGNORE : {}", e); return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) .body(new ErrorResponse("Server Error", "-1")); @@ -80,16 +107,29 @@ public class AnlsHstryController { } + /** + * 비행이력을 조회함, + * 비행ID[CNTRL_ID]로 조회함 + * @param id + * @return + */ @GetMapping(value = "/log/{id}") @ApiOperation(value = "비행 이력 데이터") @Tag(name = "비행 이력 현황", description = "비행 이력 현황 관련 API") @ApiImplicitParam(name = "id",value = "관제ID", dataTypeClass = String.class) public ResponseEntity log(@PathVariable String id) { List result = null; + try { - result = service.hstryList(id); - + result = service.hstryList(id); // 비행이력을 비행ID[CNTRL_ID] 조회하는 기능. } catch (Exception e) { + /** + * try{ + ... + } + * try 영역 안 코드들중 문제가 생기면 오는 곳. + * log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌 + */ log.error("IGNORE : {}", e); return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) .body(new ErrorResponse("Server Error", "-1")); diff --git a/pav-server/src/main/java/com/palnet/biz/api/anls/hstry/service/AnlsHstryService.java b/pav-server/src/main/java/com/palnet/biz/api/anls/hstry/service/AnlsHstryService.java index e8441835..75159b10 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/anls/hstry/service/AnlsHstryService.java +++ b/pav-server/src/main/java/com/palnet/biz/api/anls/hstry/service/AnlsHstryService.java @@ -67,18 +67,27 @@ public class AnlsHstryService { @Autowired private JwtTokenUtil jwtTokenUtil; - //비행이력현황 list + /** + * 비행현황 목록 조회하는 기능. + * @param rq + * @return + */ public ComnPagingRs list(AnlsHstryGroupModel rq){ + + // 조회에 필요한 기본값 선언 Integer cstmrSno = jwtTokenUtil.getCstmrSnoByToken(); List groupAuthList = jwtTokenUtil.getGroupAuthByToken(); List adminAuth = new ArrayList<>(); String groupAuth = null; String appAuth = jwtTokenUtil.getUserAuthByToken(); + + // 페이징 처리를 위한 객체 선언 PageImplresultList; ComnPagingRs response = new ComnPagingRs<>(); Pageable pageable = PageRequest.of(rq.getPage()-1, rq.getRecord()); + // 유저의 권한은 확인함 if("USER".equals(appAuth) || "ROLE_USER".equals(appAuth)) { for(JwtGroupModel list : groupAuthList) { if(list.getGroupId().equals(rq.getGroupId())) { @@ -86,23 +95,30 @@ public class AnlsHstryService { } } } + + // 그룹에서의 권한이 NORMAL인 경우 if("NORMAL".equals(groupAuth)) { + for (JwtGroupModel list : groupAuthList) { if("MASTER".equals(list.getGroupAuthCd()) || "LEADER".equals(list.getGroupAuthCd())) { adminAuth.add(list); } } - List idntfList = comIdntBasRepository.findIdntfNumber(cstmrSno); - List basResult = fltPlanBasRepository.findByPlanSno(cstmrSno); - List pilotList = fltPlanPilotRepository.findByPlanSno(cstmrSno); + + List idntfList = comIdntBasRepository.findIdntfNumber(cstmrSno); // 회원 고유번호와 맞는 기체 고유번호 조회 + List basResult = fltPlanBasRepository.findByPlanSno(cstmrSno); // 회원 고유번호와 맞는 비행계획서 조회 + List pilotList = fltPlanPilotRepository.findByPlanSno(cstmrSno); // 회원 고유번호와 맞는 조종사 조회 List pilotResult = new ArrayList<>(); - + for(FltPlanPilot list : pilotList) { - pilotResult = fltPlanBasRepository.findBasList(list.getPlanSno()); + pilotResult = fltPlanBasRepository.findBasList(list.getPlanSno()); // 조종사번호와 맞는 비행계획서 조회 } + + // 위 조건들에 부합하는 데이터를 조회함 resultList = query.cntrlBasNormalHstryList(rq, pageable, idntfList, basResult, pilotResult); - + + // 위 조건들에 부합하여 조회한 데이터의 갯수를 조회함 long total = query.cntrlBasNormalHstryCount(rq, idntfList, basResult, pilotResult); long totalPage = total % rq.getRecord() > 0 ? total/rq.getRecord() + 1 : total/rq.getRecord(); @@ -125,19 +141,27 @@ public class AnlsHstryService { return response; } - + + /** + * 비행ID[CNTRL_ID]로 비행 상세정보를 조회하는 기능. + * @param cntrlId + * @return + * @throws Exception + */ public AnlsHstryModel detail(String cntrlId) throws Exception{ AnlsHstryModel model = new AnlsHstryModel(); - Optional optional = ctrCntrlBasRepository.findById(cntrlId); + Optional optional = ctrCntrlBasRepository.findById(cntrlId); // if (!optional.isPresent()) { + // 데이터베이스에 조회하려는 데이터가 없을시 서버에서 파라미터가 없다는 "의도적인" 에러 반환 throw new CustomException(ErrorCode.DATA_NOTFIND); } CtrCntrlBas entity = optional.get(); - + + // Entity에 담겨있는 값을 반환 model로 복제함 BeanUtils.copyProperties(entity , model); @@ -145,6 +169,11 @@ public class AnlsHstryService { } + /** + * 비행이력을 비행ID[CNTRL_ID] 조회하는 기능. + * @param id + * @return + */ public List hstryList(@PathVariable String id) { List result = query.listCntrlHstryPage(id); diff --git a/pav-server/src/main/java/com/palnet/biz/jpa/repository/ctr/CtrCntrlQueryRepository.java b/pav-server/src/main/java/com/palnet/biz/jpa/repository/ctr/CtrCntrlQueryRepository.java index a0625e8b..16d0b920 100644 --- a/pav-server/src/main/java/com/palnet/biz/jpa/repository/ctr/CtrCntrlQueryRepository.java +++ b/pav-server/src/main/java/com/palnet/biz/jpa/repository/ctr/CtrCntrlQueryRepository.java @@ -259,6 +259,17 @@ public class CtrCntrlQueryRepository{ return result; } + + /** + * 조건들에 부합하는 비행 현황 목록을 조회하는 SQL 기능. + * @param rq AnlsHstryGroupModel 객체로 조회 조건을 전달 + * @param pageable 페이징 정보 + * @param idntfList 기체 식별 기본 정보 리스트 + * @param basResult 비행 계획 기본 정보 리스트 + * @param pilotResult 파일럿 비행 계획 기본 정보 리스트 + * @return 페이징된 AnlsHstryModel 목록 + * @return + */ public PageImpl cntrlBasNormalHstryList(AnlsHstryGroupModel rq, Pageable pageable, List idntfList, @@ -279,34 +290,98 @@ public class CtrCntrlQueryRepository{ end.setTime(Date.from(DateUtils.stringToDate(rq.getEndDate()))); end.add(Calendar.DATE, 1); Date endDate = end.getTime(); - + + /** + * 조건1. 그룹아이디가 맞는지, + * 조건2. 검색시작일 이후 + * 조건3. 검색끝일 전 + * 조건4. status가 99[비행중]인지 + * 조건5. 승인이 된건인지 + */ builder.and(qFltPlanCtrCntrlRelEntity.groupId.eq(rq.getGroupId())); builder.and(qCntrlBasEntity.cntrlStDt.after(DateUtils.stringToDate(rq.getStDate()))); builder.and(qCntrlBasEntity.cntrlEndDt.before(endDate.toInstant())); builder.and(qCntrlBasEntity.statusCd.eq("99")); builder.and(qFltPlanBasEntity.aprvlYn.eq("Y")); + // 회원 고유번호와 맞는 기체고유번호 조건추가 if(idntfList.size()>0) { for(ComIdntfBas list : idntfList) { idntfBuilder.or(qCntrlBasEntity.idntfNum.eq(list.getIdntfNum())); } } + + // 회원 고유번호와 맞는 비행계획서 고유번호 조건 추가 if(basResult.size()>0) { for(FltPlanBas list : basResult) { basBuilder.or(qFltPlanCtrCntrlRelEntity.planSno.eq(list.getPlanSno())); } } + + // 회원 고유번호와 맞는 파일럿번호로 조회한 비행계획서 번호 조건 추가 if(pilotResult.size()>0) { for(FltPlanBas list : pilotResult) { pilotBuilder.or(qFltPlanCtrCntrlRelEntity.planSno.eq(list.getPlanSno())); } } + + // 입력받은 검색 키워드 조건추가 if(!StringUtils.isEmpty(rq.getSearch1())) { builder.and(qCntrlBasEntity.idntfNum.like("%" + rq.getSearch1() + "%")); } List result = new ArrayList<>(); + /** + * 위 조건들과 부합한 데이터베이스 내용을 조회하는 SQL입니다. + * SELECT + * CCB.CNTRL_ID , + * CCB.IDNTF_NUM , + * CCB.STATUS_CD , + * CCB.OBJECT_TYPE_CD , + * CCB.FLGHT_ST_DT , + * CCB.FLGHT_END_DT , + * CCB.CNTRL_ST_DT , + * CCB.CNTRL_END_DT , + * CCB.TTL_TIME , + * CCB.TTL_TIME_TYPE , + * CCB.TTL_DSTNC , + * CCB.TTL_DSTNC_TYPE , + * CCB.AVRG_SPEED , + * CCB.AVRG_SPEED_TYPE , + * CCB.BTTR_CNSMPTN , + * CCB.END_TYPE_CD , + * CCB.CREATE_DT , + * CCB.UPDATE_DT , + * CCHA.ACTN_TYPE , + * CCHA.AREA1 , + * CCHA.AREA2 , + * CCHA.AREA3 , + * CCHA.AREA_NM , + * CCHA.AREA_TYPE , + * CCHA.LAND_NM , + * CCHA.LAND_NUM , + * CCHA.ZIP_CD + * FROM CTR_CNTRL_BAS CCB + * LEFT OUTER JOIN CTR_CNTRL_HSTRY_AREA CCHA + * ON CCB.CNTRL_ID = CCHA.CNTRL_ID + * AND CCHA.ACTN_TYPE = '01' + * LEFT OUTER JOIN FLT_PLAN_CTR_CNTRL_REL FPCCR + * ON CCB.CNTRL_ID = FPCCR.CNTRL_ID + * LEFT OUTER JOIN FLT_PLAN_BAS FPB + * ON FPCCR.PLAN_SNO = FPB.PLAN_SNO + * WHERE FPCCR.GROUP_ID = #{groupId} + * AND CCB.CNTRL_ST_DT > #{stDate} + * AND CCB.CNTRL_END_DT < #{endDate} + * AND CCB.STATUS_CD = '99' + * AND FPB.APRVL_YN = 'Y' + * AND CCB.IDNTF_NUM LIKE CONCAT('%', #{search1}, '%'); + * AND( + * CCB.IDNTF_NUM = #{idntfNum} -- #{idntfNum}값이 여러개 일 경우 OR연산을 붙혀 조건이 늘어남 + * OR FPCCR.PLAN_SNO = #{planSno} -- #{planSno}값이 여러개 일 경우 OR연산을 붙혀 조건이 늘어남 + * OR FPCCR.PLAN_SNO = #{planSno} -- #{planSno}값이 여러개 일 경우 OR연산을 붙혀 조건이 늘어남 + * ) + */ List queryList = query.select(Projections.bean(AnlsHstryModel.class , qCntrlBasEntity.cntrlId, qCntrlBasEntity.idntfNum, @@ -335,17 +410,15 @@ public class CtrCntrlQueryRepository{ qCntrlHstryAreaEntity.landNm, qCntrlHstryAreaEntity.landNum, qCntrlHstryAreaEntity.zipCd - - )) .from(qCntrlBasEntity) .leftJoin(qCntrlHstryAreaEntity) - .on(qCntrlBasEntity.cntrlId.eq(qCntrlHstryAreaEntity.cntrlId)) - .on(qCntrlHstryAreaEntity.actnType.eq("01")) + .on(qCntrlBasEntity.cntrlId.eq(qCntrlHstryAreaEntity.cntrlId)) + .on(qCntrlHstryAreaEntity.actnType.eq("01")) .leftJoin(qFltPlanCtrCntrlRelEntity) - .on(qCntrlBasEntity.cntrlId.eq(qFltPlanCtrCntrlRelEntity.cntrlId)) + .on(qCntrlBasEntity.cntrlId.eq(qFltPlanCtrCntrlRelEntity.cntrlId)) .leftJoin(qFltPlanBasEntity) - .on(qFltPlanCtrCntrlRelEntity.planSno.eq(qFltPlanBasEntity.planSno)) + .on(qFltPlanCtrCntrlRelEntity.planSno.eq(qFltPlanBasEntity.planSno)) .where((builder) .and( (idntfBuilder) @@ -387,6 +460,7 @@ public class CtrCntrlQueryRepository{ return new PageImpl<>(result, pageable, result.size()); } + public PageImpl cntrlBasNormalSmltList(AnlsHstryRqModel rq, Pageable pageable, List adminAuth, @@ -522,6 +596,7 @@ public class CtrCntrlQueryRepository{ return new PageImpl<>(result, pageable, result.size()); } + public List cntrlBasNormalList(AnlsHstryRqModel rq, String idntfNum){ QCtrCntrlBas qCntrlBasEntity = QCtrCntrlBas.ctrCntrlBas; @@ -614,6 +689,14 @@ public class CtrCntrlQueryRepository{ return result; } + /** + * 조건들에 부합하는 비행 현황 목록 데이터의 갯수를 조회하는 SQL 기능. + * @param rq + * @param idntfList + * @param basResult + * @param pilotResult + * @return + */ public long cntrlBasNormalHstryCount(AnlsHstryGroupModel rq, List idntfList, List basResult, @@ -634,34 +717,70 @@ public class CtrCntrlQueryRepository{ end.add(Calendar.DATE, 1); Date endDate = end.getTime(); + /** + * 조건1. 그룹아이디가 맞는지, + * 조건2. 검색시작일 이후 + * 조건3. 검색끝일 전 + * 조건4. status가 99[비행중]인지 + * 조건5. 승인이 된건인지 + */ builder.and(qFltPlanCtrCntrlRelEntity.groupId.eq(rq.getGroupId())); builder.and(qCntrlBasEntity.cntrlStDt.after(DateUtils.stringToDate(rq.getStDate()))); builder.and(qCntrlBasEntity.cntrlEndDt.before(endDate.toInstant())); builder.and(qFltPlanBasEntity.aprvlYn.eq("Y")); builder.and(qCntrlBasEntity.statusCd.eq("99")); + // 회원 고유번호와 맞는 기체고유번호 조건추가 if(idntfList.size()>0) { for(ComIdntfBas list : idntfList) { idntfBuilder.or(qCntrlBasEntity.idntfNum.eq(list.getIdntfNum())); } } + + // 회원 고유번호와 맞는 비행계획서 고유번호 조건 추가 if(basResult.size()>0) { for(FltPlanBas list : basResult) { basBuilder.or(qFltPlanCtrCntrlRelEntity.planSno.eq(list.getPlanSno())); } } + + // 회원 고유번호와 맞는 파일럿번호로 조회한 비행계획서 번호 조건 추가 if(pilotResult.size()>0) { for(FltPlanBas list : pilotResult) { pilotBuilder.or(qFltPlanCtrCntrlRelEntity.planSno.eq(list.getPlanSno())); } } + // 입력받은 검색 키워드 조건추가 if(!StringUtils.isEmpty(rq.getSearch1())) { builder.and(qCntrlBasEntity.idntfNum.like("%" + rq.getSearch1() + "%")); } - + /** + * 위 조건들과 부합한 데이터베이스 내용의 갯수를 조회하는 SQL입니다. + * SELECT + * COUNT(*) + * FROM CTR_CNTRL_BAS CCB + * LEFT OUTER JOIN CTR_CNTRL_HSTRY_AREA CCHA + * ON CCB.CNTRL_ID = CCHA.CNTRL_ID + * AND CCHA.ACTN_TYPE = '01' + * LEFT OUTER JOIN FLT_PLAN_CTR_CNTRL_REL FPCCR + * ON CCB.CNTRL_ID = FPCCR.CNTRL_ID + * LEFT OUTER JOIN FLT_PLAN_BAS FPB + * ON FPCCR.PLAN_SNO = FPB.PLAN_SNO + * WHERE FPCCR.GROUP_ID = #{groupId} + * AND CCB.CNTRL_ST_DT > #{stDate} + * AND CCB.CNTRL_END_DT < #{endDate} + * AND CCB.STATUS_CD = '99' + * AND FPB.APRVL_YN = 'Y' + * AND CCB.IDNTF_NUM LIKE CONCAT('%', #{search1}, '%'); + * AND( + * CCB.IDNTF_NUM = #{idntfNum} -- #{idntfNum}값이 여러개 일 경우 OR연산을 붙혀 조건이 늘어남 + * OR FPCCR.PLAN_SNO = #{planSno} -- #{planSno}값이 여러개 일 경우 OR연산을 붙혀 조건이 늘어남 + * OR FPCCR.PLAN_SNO = #{planSno} -- #{planSno}값이 여러개 일 경우 OR연산을 붙혀 조건이 늘어남 + * ) + */ long result = query.select(Projections.bean(AnlsHstryModel.class , qCntrlBasEntity.cntrlId, qCntrlBasEntity.idntfNum, @@ -1031,7 +1150,7 @@ public class CtrCntrlQueryRepository{ } /** - * 비행 이력 데이터 조회 + * 비행 이력 데이터 조회하는 SQL. * @param id * @return */ @@ -1043,6 +1162,33 @@ public class CtrCntrlQueryRepository{ BooleanBuilder builder = new BooleanBuilder(); builder.and(qCtrCntrHstry.cntrlId.eq(id)); + /** + * 비행번호[CNTRL_ID] 로 이력현황을 조회하는 SQL입니다. + * SELECT + * CCH.CNTRL_ID , + * CCH.HSTRY_SNO , + * CCH.TRMNL_ID , + * CCH.MSSG_TYPE_CD , + * CCH.STATUS_CD , + * CCH.LAT , + * CCH.LON , + * CCH.SPEED , + * CCH.SPEED_TYPE , + * CCH.HEADING , + * CCH.ELEV , + * CCH.ELEV_TYPE , + * CCH.MV_DSTNC , + * CCH.MV_DSTNC_TYPE , + * CCH.BTTR_LVL , + * CCH.BTTR_VLTG , + * CCH.TRMNL_RCV_DT , + * CCH.SRVR_RCV_DT , + * CCB.IDNTF_NUM + * FROM CTR_CNTRL_BAS CCB + * LEFT OUTER JOIN CTR_CNTRL_HSTRY CCH + * ON CCB.CNTRL_ID = CCH.CNTRL_ID + * WHERE CCB.CNTRL_ID = #{cntrlId} + */ List result = query.select(Projections.bean(AnlsHstryDetailModel.class , qCtrCntrHstry.cntrlId , qCtrCntrHstry.hstrySno , From 606dd2dad8834b39b4e3e2435a1d716d47fd8460 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?lkd9125=28=EC=9D=B4=EA=B2=BD=EB=8F=84=29?= Date: Thu, 7 Dec 2023 15:14:31 +0900 Subject: [PATCH 10/32] =?UTF-8?q?anls/smlt=20=ED=8C=A8=ED=82=A4=EC=A7=80?= =?UTF-8?q?=20=EC=A3=BC=EC=84=9D=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../smlt/controller/AnlsSmltController.java | 54 ++++-- .../anls/smlt/service/AnlsSmltService.java | 20 +- .../ctr/CtrCntrlQueryRepository.java | 175 ++++++++++++++++-- 3 files changed, 218 insertions(+), 31 deletions(-) diff --git a/pav-server/src/main/java/com/palnet/biz/api/anls/smlt/controller/AnlsSmltController.java b/pav-server/src/main/java/com/palnet/biz/api/anls/smlt/controller/AnlsSmltController.java index fd74a684..1e48f6ba 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/anls/smlt/controller/AnlsSmltController.java +++ b/pav-server/src/main/java/com/palnet/biz/api/anls/smlt/controller/AnlsSmltController.java @@ -42,7 +42,8 @@ public class AnlsSmltController { private final AnlsSmltService service; /** - * 비행 현황 목록 + * 비행현황 목록 리스트 조회하는 기능, + * AnlsHstryRqModel 따른 리스트를 조회함. * @param rq * @return */ @@ -55,17 +56,25 @@ public class AnlsSmltController { log.debug("JSON>>>>>>>>" , JsonUtils.toJson(rq)); log.debug("Param" + rq.getStDate() + "::" + rq.getEndDate()); - //입력값 검증 + // 검색 시작일 날짜[stDate], 검색 끝일 날짜 날짜값[endDate], 날짜값이 10자리인지 확인[정해진 포맷팅인지 확인하는 것] 입력값 검증처리 if(rq.getStDate() == null || !(rq.getStDate().length() == 10) || rq.getEndDate() ==null || !(rq.getEndDate().length() == 10) ) { - return ResponseEntity.status(HttpStatus.OK) + // 검증통과하지 못할 시 서버에서 "의도적인" 에러 반환 + return ResponseEntity.status(HttpStatus.OK) // "의도적인" 에러 반환코드 .body(new ErrorResponse(RSErrorCode.ER_PARAM)); } try { - result = service.list(rq); + result = service.list(rq); // 비행현황 목록 조회하는 기능. } catch (Exception e) { + /** + * try{ + ... + } + * try 영역 안 코드들중 문제가 생기면 오는 곳. + * log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌 + */ log.error("IGNORE : {}", e); return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) .body(new ErrorResponse("Server Error", "-1")); @@ -77,7 +86,8 @@ public class AnlsSmltController { /** - * 비행 이력 데이터 조회 + * 비행 이력 데이터 조회하는 기능, + * 비행ID[CNTRL_ID]로 조회함 * @param rq * @return */ @@ -90,9 +100,16 @@ public class AnlsSmltController { try { // result = service.list(rq); - result = service.histList(id); + result = service.histList(id); // 비행ID[CNTRL_ID]로 비행이력을 조회하는 기능. } catch (Exception e) { + /** + * try{ + ... + } + * try 영역 안 코드들중 문제가 생기면 오는 곳. + * log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌 + */ log.error("IGNORE : {}", e); return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) .body(new ErrorResponse("Server Error", "-1")); @@ -104,7 +121,8 @@ public class AnlsSmltController { /** - * 통계 데이터 조회 + * 통계 데이터 조회, + * 비행ID[CNTRL_ID]로 조회함 * @param rq * @return */ @@ -117,10 +135,16 @@ public class AnlsSmltController { try { - result = service.stcsList(id); - + result = service.stcsList(id); // 통계 데이터 조회하는 기능 } catch (Exception e) { + /** + * try{ + ... + } + * try 영역 안 코드들중 문제가 생기면 오는 곳. + * log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌 + */ log.error("IGNORE : {}", e); return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) .body(new ErrorResponse("Server Error", "-1")); @@ -131,7 +155,8 @@ public class AnlsSmltController { } /** - * 비행 상세정보 조회 + * 비행 상세정보 조회, + * 비행ID[CNTRL_ID]로 조회함 * @param id * @return */ @@ -143,9 +168,16 @@ public class AnlsSmltController { AnlsSmltDetailModel result = null; try { - result = service.detail(id); + result = service.detail(id); // 비행ID[CNTRL_ID]로 비행상세정보 조회함 } catch (Exception e) { + /** + * try{ + ... + } + * try 영역 안 코드들중 문제가 생기면 오는 곳. + * log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌 + */ log.error("IGNORE : {}", e); return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) .body(new ErrorResponse("Server Error", "-1")); diff --git a/pav-server/src/main/java/com/palnet/biz/api/anls/smlt/service/AnlsSmltService.java b/pav-server/src/main/java/com/palnet/biz/api/anls/smlt/service/AnlsSmltService.java index ce8950e7..031b9fa3 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/anls/smlt/service/AnlsSmltService.java +++ b/pav-server/src/main/java/com/palnet/biz/api/anls/smlt/service/AnlsSmltService.java @@ -61,7 +61,7 @@ public class AnlsSmltService { /** - * 비행 현황 목록 + * 비행현황 목록 조회하는 기능. * @param rq * @return */ @@ -106,6 +106,7 @@ public class AnlsSmltService { for(FltPlanPilot list : pilotList) { pilotResult = fltPlanBasRepository.findBasList(list.getPlanSno()); } + result = query.cntrlBasNormalSmltList(rq, pageable, adminAuth, idntfList, basResult, pilotResult); // App 권한은 user이지만 group 권한이 LEADER / MASTER인 그룹이 있는 경우 해당 비행 이력 목록 표출 // group 권한이 Normal인 경우 본인이 작성한 비행계획서의 이력 / 본인이 조종사인 기체 이력/ 본인이 등록한 기체 이력 표출 @@ -122,12 +123,13 @@ public class AnlsSmltService { } /** - * - * @param rq비행 이력 데이터 조회 + * 비행ID[CNTRL_ID]로 비행이력을 조회하는 기능. + * @param rq * @return */ public List histList(String id){ + // 비행ID[CNTRL_ID]로 비행이력을 데이터베이스에서 조회함. List resultList = query.listCntrlHstry(id); //정렬 순서 뒤집기 처리 @@ -138,14 +140,13 @@ public class AnlsSmltService { /** - * 통계 데이터 조회 + * 통계 데이터 조회하는 기능 * @param rq * @return */ public List stcsList(String id){ - - List result = query.anlsSmltStcs(id); - + + List result = query.anlsSmltStcs(id); // 비행관제 ID[CNTRL_ID]로 데이터베이스에서 시뮬레이션 통계데이터를 조회함. //통계 데이터 가공 처리 //소수점 자리 1자리로 컷트 @@ -162,7 +163,8 @@ public class AnlsSmltService { /** - * 비행 상세정보 조회 + * 비행 상세정보 조회, + * 비행ID[CNTRL_ID]로 조회함 * @param cntrlId * @return * @throws Exception @@ -172,7 +174,7 @@ public class AnlsSmltService { AnlsSmltDetailModel result = new AnlsSmltDetailModel(); - result = query.anlsSmltDetail(cntrlId); + result = query.anlsSmltDetail(cntrlId); // 비행ID[CNTRL_ID]로 데이터베이스에서 비행상세 정보 조회함 // Optional optional = ctrCntrlBasRepository.findById(cntrlId); // diff --git a/pav-server/src/main/java/com/palnet/biz/jpa/repository/ctr/CtrCntrlQueryRepository.java b/pav-server/src/main/java/com/palnet/biz/jpa/repository/ctr/CtrCntrlQueryRepository.java index 16d0b920..21357e37 100644 --- a/pav-server/src/main/java/com/palnet/biz/jpa/repository/ctr/CtrCntrlQueryRepository.java +++ b/pav-server/src/main/java/com/palnet/biz/jpa/repository/ctr/CtrCntrlQueryRepository.java @@ -461,6 +461,16 @@ public class CtrCntrlQueryRepository{ return new PageImpl<>(result, pageable, result.size()); } + /** + * 비행 시뮬레이션할 데이터를 조건에 맞춰 데이터베이스에서 조회하는 SQL 기능. + * @param rq + * @param pageable + * @param adminAuth + * @param idntfList + * @param basResult + * @param pilotResult + * @return + */ public PageImpl cntrlBasNormalSmltList(AnlsHstryRqModel rq, Pageable pageable, List adminAuth, @@ -483,38 +493,103 @@ public class CtrCntrlQueryRepository{ end.setTime(Date.from(DateUtils.stringToDate(rq.getEndDate()))); end.add(Calendar.DATE, 1); Date endDate = end.getTime(); + + /** + * 조건1. 검색시작일 후 + * 조건2. 검색끝일 전 + * 조건3. 승인값이 "Y"인지 + * 조건4. status가 값이 99인지 + */ builder.and(qCntrlBasEntity.cntrlStDt.after(DateUtils.stringToDate(rq.getStDate()))); builder.and(qCntrlBasEntity.cntrlEndDt.before(endDate.toInstant())); builder.and(qFltPlanBasEntity.aprvlYn.eq("Y")); builder.and(qCntrlBasEntity.statusCd.eq("99")); + // adminAuth값이 있을 시[유저 권한은 USER지만 그룹내 권한이 ADMIN, MASTER 일경우 그룹전체 값 확인 가능 함.] if(adminAuth.size()>0) { for(JwtGroupModel list : adminAuth) { adminBuilder.or(qFltPlanCtrCntrlRelEntity.groupId.eq(list.getGroupId())); } } + + // 회원 고유번호와 맞는 기체고유번호 조건추가 if(idntfList.size()>0) { for(ComIdntfBas list : idntfList) { idntfBuilder.or(qCntrlBasEntity.idntfNum.eq(list.getIdntfNum())); } } + + // 회원 고유번호와 맞는 비행계획서 고유번호 조건 추가 if(basResult.size()>0) { for(FltPlanBas list : basResult) { basBuilder.or(qFltPlanCtrCntrlRelEntity.planSno.eq(list.getPlanSno())); } } + + // 회원 고유번호와 맞는 파일럿번호로 조회한 비행계획서 번호 조건 추가 if(pilotResult.size()>0) { for(FltPlanBas list : pilotResult) { pilotBuilder.or(qFltPlanCtrCntrlRelEntity.planSno.eq(list.getPlanSno())); } } + // 입력받은 검색 키워드 조건추가 if(!StringUtils.isEmpty(rq.getSearch1())) { builder.and(qCntrlBasEntity.idntfNum.like("%" + rq.getSearch1() + "%")); } List result = new ArrayList<>(); + /** + * 위 조건들과 부합한 데이터베이스 내용을 조회하는 SQL입니다. + * SELECT + * CCB.CNTRL_ID , + * CCB.IDNTF_NUM , + * CCB.STATUS_CD , + * CCB.OBJECT_TYPE_CD , + * CCB.FLGHT_ST_DT , + * CCB.FLGHT_END_DT , + * CCB.CNTRL_ST_DT , + * CCB.CNTRL_END_DT , + * CCB.TTL_TIME , + * CCB.TTL_TIME_TYPE , + * CCB.TTL_DSTNC , + * CCB.TTL_DSTNC_TYPE , + * CCB.AVRG_SPEED , + * CCB.AVRG_SPEED_TYPE , + * CCB.BTTR_CNSMPTN , + * CCB.END_TYPE_CD , + * CCB.CREATE_DT , + * CCB.UPDATE_DT , + * CCHA.ACTN_TYPE , + * CCHA.AREA1 , + * CCHA.AREA2 , + * CCHA.AREA3 , + * CCHA.AREA_NM , + * CCHA.AREA_TYPE , + * CCHA.LAND_NM , + * CCHA.LAND_NUM , + * CCHA.ZIP_CD + * FROM CTR_CNTRL_BAS CCB + * LEFT OUTER JOIN CTR_CNTRL_HSTRY_AREA CCHA + * ON CCB.CNTRL_ID = CCHA.CNTRL_ID + * AND CCHA.ACTN_TYPE = '01' + * LEFT OUTER JOIN FLT_PLAN_CTR_CNTRL_REL FPCCR + * ON CCB.CNTRL_ID = FPCCR.CNTRL_ID + * LEFT OUTER JOIN FLT_PLAN_BAS FPB + * ON FPCCR.PLAN_SNO = FPB.PLAN_SNO + * WHERE FPCCR.GROUP_ID = #{groupId} + * AND CCB.CNTRL_ST_DT > #{stDate} + * AND CCB.CNTRL_END_DT < #{endDate} + * AND CCB.STATUS_CD = '99' + * AND FPB.APRVL_YN = 'Y' + * AND CCB.IDNTF_NUM LIKE CONCAT('%', #{search1}, '%'); + * AND( + * CCB.IDNTF_NUM = #{idntfNum} -- #{idntfNum}값이 여러개 일 경우 OR연산을 붙혀 조건이 늘어남 + * OR FPCCR.PLAN_SNO = #{planSno} -- #{planSno}값이 여러개 일 경우 OR연산을 붙혀 조건이 늘어남 + * OR FPCCR.PLAN_SNO = #{planSno} -- #{planSno}값이 여러개 일 경우 OR연산을 붙혀 조건이 늘어남 + * ) + */ List queryList = query.select(Projections.bean(AnlsHstryModel.class , qCntrlBasEntity.cntrlId, qCntrlBasEntity.idntfNum, @@ -721,7 +796,7 @@ public class CtrCntrlQueryRepository{ * 조건1. 그룹아이디가 맞는지, * 조건2. 검색시작일 이후 * 조건3. 검색끝일 전 - * 조건4. status가 99[비행중]인지 + * 조건4. status가 값이 "99" 인지 * 조건5. 승인이 된건인지 */ builder.and(qFltPlanCtrCntrlRelEntity.groupId.eq(rq.getGroupId())); @@ -1219,7 +1294,13 @@ public class CtrCntrlQueryRepository{ return result; } -public List listCntrlHstry(String id){ + + /** + * 비행ID[CNTRL_ID]로 비행이력을 조회하는 SQL 기능. + * @param id + * @return + */ + public List listCntrlHstry(String id){ QCtrCntrlBas qCntrlBasEntity = QCtrCntrlBas.ctrCntrlBas; QCtrCntrlHstry qCtrCntrHstry = QCtrCntrlHstry.ctrCntrlHstry; @@ -1227,6 +1308,34 @@ public List listCntrlHstry(String id){ BooleanBuilder builder = new BooleanBuilder(); builder.and(qCtrCntrHstry.cntrlId.eq(id)); + /** + * 비행ID[CNTRL_ID]로 + * SELECT + * CCH.CNTRL_ID , + * CCH.HSTRY_SNO , + * CCH.TRMNL_ID , + * CCH.MSSG_TYPE_CD , + * CCH.STATUS_CD , + * CCH.LAT , + * CCH.LON , + * CCH.SPEED , + * CCH.SPEED_TYPE , + * CCH.HEADING , + * CCH.ELEV , + * CCH.ELEV_TYPE , + * CCH.MV_DSTNC , + * CCH.MV_DSTNC_TYPE , + * CCH.BTTR_LVL , + * CCH.BTTR_VLTG , + * CCH.TRMNL_RCV_DT , + * CCH.SRVR_RCV_DT , + * CCB.IDNTF_NUM + * FROM CTR_CNTRL_BAS CCB + * LEFT OUTER JOIN CTR_CNTRL_HSTRY CCH + * ON CCB.CNTRL_ID = CCH.CNTRL_ID + * WHERE CCB.CNTRL_ID = #{cntrlId} + * ORDER BY CCH.SRVR_RCV_DT ASC + */ List result = query.select(Projections.bean(AnlsHstryDetailModel.class , qCtrCntrHstry.cntrlId , qCtrCntrHstry.hstrySno , @@ -1257,6 +1366,7 @@ public List listCntrlHstry(String id){ return result; } + public long listCntrlHstryCount(String id){ QCtrCntrlBas qCntrlBasEntity = QCtrCntrlBas.ctrCntrlBas; @@ -1577,18 +1687,46 @@ public List listCntrlHstry(String id){ return result; } - - - /*** - * 시뮬레이션 상세정보 조회 쿼리 - * + + /** + * 비행관제번호[CNTRL_ID]로 시뮬레이션 상세정보 조회하는 SQL 기능. + * @param cntrlId + * @return */ - public AnlsSmltDetailModel anlsSmltDetail(String cntrlId){ QCtrCntrlBas bas = QCtrCntrlBas.ctrCntrlBas; QComArcrftBas air = QComArcrftBas.comArcrftBas; QComIdntfBas idntf = QComIdntfBas.comIdntfBas; + /** + * 비행관제번호[CNTRL_ID]로 시뮬레이션 상세정보 조회하는 SQL 입니다. + * + * SELECT + * CCB.CNTRL_ID , + * CCB.IDNTF_NUM , + * CCB.FLGHT_ST_DT , + * CCB.FLGHT_END_DT , + * CCB.CNTRL_ST_DT , + * CCB.CNTRL_END_DT , + * CCB.TTL_TIME , + * CCB.TTL_TIME_TYPE , + * CCB.TTL_DSTNC , + * CCB.TTL_DSTNC_TYPE , + * CCB.AVRG_SPEED , + * CCB.AVRG_SPEED_TYPE , + * CCB.BTTR_CNSMPTN , + * CAB.ARCRFT_TYPE_CD , + * CAB.PRDCT_NUM , + * CAB.ARCRFT_MODEL_NM , + * CAB.IMAGE_URL + * FROM CTR_CNTRL_BAS CCB + * LEFT OUTER JOIN COM_IDNTF_BAS CIB + * ON CCB.IDNTF_NUM = CIB.IDNTF_NUM + * LEFT OUTER JOIN COM_ARCRFT_BAS CAB + * ON CIB.ARCRFT_SNO = CAB.ARCRFT_SNO + * AND CAB.USE_YN = 'Y' + * WHERE CCB.CNTRL_ID = #{cntrlId} + */ AnlsSmltDetailModel result = query.select(Projections.bean(AnlsSmltDetailModel.class , bas.cntrlId , bas.idntfNum , @@ -1623,10 +1761,9 @@ public List listCntrlHstry(String id){ } - /*** - * 시뮬레이션 통계 + /** + * 비행관제 ID[CNTRL_ID]로 시뮬레이션 통계내는 SQL 기능. */ - public List anlsSmltStcs(String cntrlId){ QCtrCntrlHstry hstry = QCtrCntrlHstry.ctrCntrlHstry; @@ -1643,6 +1780,22 @@ public List listCntrlHstry(String id){ , ConstantImpl.create("%H:%i")); + /** + * 비행관제 ID[CNTRL_ID]로 통계를 내는 SQL입니다. + * SELECT + * DATE_FORMAT(CCH.SRVR_RCV_DT, '%H:%i') AS 'timecd', + * DATE_FORMAT(CCH.SRVR_RCV_DT, '%Y-%m-%d') AS 'dateCd', + * AVG(CCH.SPEED) AS 'avrgSpeed', + * MAX(CCH.SPEED_TYPE) AS 'speedType', + * AVG(CCH.ELEV) AS 'avrgElev', + * MAX(CCH.ELEV_TYPE) AS 'elevType', + * AVG(CCH.MV_DSTNC) AS 'avrgMvDstnc' , + * MAX(CCH.MV_DSTNC_TYPE) AS 'mvDstncType', + * MAX(CCH.BTTR_LVL) AS 'maxBttrLvl', + * MIN(CCH.BTTR_LVL) AS 'minBttrLvl' + * FROM CTR_CNTRL_HSTRY CCH + * WHERE CCH.CNTRL_ID = #{cntrlId} + */ List result = query.select(Projections.bean(AnlsSmltStcsModel.class , formattedTime.as("timeCd"), formattedDate.as("dateCd"), From 4b0ddb5e2b245c8def9596da8089488575a04afd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?dhji=28=EC=A7=80=EB=8C=80=ED=95=9C=29?= Date: Mon, 11 Dec 2023 14:31:20 +0900 Subject: [PATCH 11/32] =?UTF-8?q?qr=20rq=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bas/laanc/service/BasLaancService.java | 29 ++++++++++++++++--- 1 file changed, 25 insertions(+), 4 deletions(-) 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 ef87f80c..798aaae1 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 @@ -39,6 +39,8 @@ 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; @@ -625,7 +627,7 @@ public class BasLaancService { } String confirmKey = UUID.randomUUID().toString(); - String jsonParams = null; + String params = null; byte[] qr = null; try { TsQrcodeRq tsRq = TsQrcodeRq.builder() @@ -635,9 +637,28 @@ public class BasLaancService { .applyUser(userCi) .build(); - jsonParams = JsonUtils.toJson(tsRq); +// params = JsonUtils.toJson(tsRq); +/* - qr = tsService.createQrcode(jsonParams); + 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코드 생성 실패"); @@ -648,7 +669,7 @@ public class BasLaancService { .confirmKey(confirmKey) .status("GENERATED") .targetType("TS_QRCODE") - .rqData(jsonParams) + .rqData(params) .createUserId(userId) .updateUserId(userId) .build(); From 91e5d2a3103acf008b9d8af8d22282e0883f00da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?lkd9125=28=EC=9D=B4=EA=B2=BD=EB=8F=84=29?= Date: Mon, 11 Dec 2023 15:05:13 +0900 Subject: [PATCH 12/32] =?UTF-8?q?bas/dron=20=ED=8C=A8=ED=82=A4=EC=A7=80=20?= =?UTF-8?q?=EC=A3=BC=EC=84=9D=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dron/controller/BasDronController.java | 136 ++++++++++++++---- .../api/bas/dron/service/BasDronService.java | 36 +++-- .../pty/PtyDronQueryRepository.java | 107 +++++++++++++- 3 files changed, 239 insertions(+), 40 deletions(-) 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..ae4d2ad7 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 @@ -39,7 +39,8 @@ public class BasDronController { /** - * 목록 조회 + * 드론 목록 조회기능, + * BasDronRqModel에 조회할 조건 값들이 들어있음 * @param rq * @return */ @@ -49,17 +50,25 @@ public class BasDronController { 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")); @@ -71,7 +80,8 @@ public class BasDronController { /** - * 식별정보 조회 + * 식별정보 조회하는 기능, + * 기체 일련번호[arcrftSno]로 조회함. * @param rq * @return */ @@ -82,17 +92,25 @@ public class BasDronController { public ResponseEntity mylist(@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,7 +122,8 @@ public class BasDronController { /** - * 상세 조회 + * 드론 상세 조회, + * 기체일련번호[arcrftSno]로 드론 상세조회하는 기능. * @param id * @return */ @@ -116,16 +135,24 @@ public class BasDronController { 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,7 +164,8 @@ public class BasDronController { /** - * 생성 + * 드론정보 생성하는 기능, + * BasDronModel 모델에 드론 입력정보로 드론정보 생성함. * @return */ @PostMapping(value = "/create") @@ -147,16 +175,31 @@ public class BasDronController { Map resultMap = new HashMap(); try { - boolean result = service.create(rq); + boolean result = service.create(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")); @@ -167,7 +210,8 @@ public class BasDronController { } /** - * 생성 + * 식별장치 생성하는 기능, + * BasIdntfRqModel 모델에 입력받은 식별장치정보 생성함/ * @return */ @PostMapping(value = "/idntf/create") @@ -178,17 +222,32 @@ public class BasDronController { 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,7 +258,8 @@ public class BasDronController { } /** - * 수정 + * 드론 정보 수정하는 기능, + * BasDronModel에 입력받은 수정할 정보를 데이터베이스에 수정함. * @return */ @PutMapping(value = "/update") @@ -209,17 +269,32 @@ public class BasDronController { Map resultMap = new HashMap(); try { - boolean result = service.update(rq); + boolean result = service.update(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")); @@ -230,7 +305,8 @@ public class BasDronController { } /** - * 삭제 + * 드론정보 삭제하는 기능, + * 기체일련번호[arcrftSno]로 삭제함 * @param id * @return */ @@ -277,17 +353,25 @@ public class BasDronController { 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/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/jpa/repository/pty/PtyDronQueryRepository.java b/pav-server/src/main/java/com/palnet/biz/jpa/repository/pty/PtyDronQueryRepository.java index 2e38fdee..de494b49 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, From e8d0ef331975faec921d1a35bfeadceb9a781df6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?lkd9125=28=EC=9D=B4=EA=B2=BD=EB=8F=84=29?= Date: Mon, 11 Dec 2023 17:04:35 +0900 Subject: [PATCH 13/32] =?UTF-8?q?bas/flight=20=ED=8C=A8=ED=82=A4=EC=A7=80?= =?UTF-8?q?=20=EC=A3=BC=EC=84=9D=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/BasFlightController.java | 250 ++++++++++++++-- .../bas/flight/service/BasFlightService.java | 103 ++++++- .../flt/FltPlanQueryRepository.java | 268 +++++++++++++++++- .../ctr/service/CtrTrnsLctnService.java | 8 +- 4 files changed, 585 insertions(+), 44 deletions(-) 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..5eb80a94 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 @@ -78,9 +78,16 @@ 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,7 +109,12 @@ public class BasFlightController { return ResponseEntity.ok().body(airArea); } - // 비행계획서 조회 + /** + * 비행계획서 조회하는 기능, + * BasFlightPlanListRq 모델에 조건값에 따라 조회함. + * @param rq + * @return + */ @GetMapping(value = "/plan/list") @ApiOperation(value = "비행계획서 조회") @Tag(name = "비행계획서", description = "비행계획서 관련 API") @@ -110,8 +122,15 @@ public class BasFlightController { 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,7 +139,12 @@ 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") @@ -128,8 +152,15 @@ public class BasFlightController { 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 +169,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") 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 +217,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") 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,7 +262,12 @@ 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") @@ -198,15 +275,30 @@ public class BasFlightController { 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,7 +307,12 @@ 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") @@ -223,9 +320,16 @@ public class BasFlightController { 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,7 +339,12 @@ public class BasFlightController { } - // 그룹 기체 조회 + /** + * 그룹 기체 조회하는 기능, + * 그룹아이디[groupId]로 조회함. + * @param groupId + * @return + */ @GetMapping(value = "/plan/arcrft/{groupId}") @ApiOperation(value = "그룹의 기체 조회") @Tag(name = "비행계획서", description = "비행계획서 관련 API") @@ -243,8 +352,15 @@ public class BasFlightController { 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 +370,26 @@ public class BasFlightController { } - // 비행 구역 버퍼 존 생성 + /** + * 비행 구역 버퍼 존 생성하는 기능 + * @param rq + * @return + */ @PostMapping("/plan/area/buffer") @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,6 +398,11 @@ public class BasFlightController { return ResponseEntity.ok().body(new SuccessResponse<>(rs)); } + /** + * 비행계획서 날씨 확인하는 기능. + * @param rq + * @return + */ @GetMapping("/plan/api/weather") @ApiOperation(value = "비행계획서 날씨") @Tag(name = "비행계획서", description = "비행계획서 관련 API") @@ -278,8 +410,15 @@ public class BasFlightController { 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 +428,27 @@ public class BasFlightController { return ResponseEntity.ok().body(new SuccessResponse<>(jsonObject)); } - // 비행계획서 리스트(승인) + /** + * 비행계획서 리스트(승인)를 조회하는 기능, + * 입력받은 값으로 승인관련된 비행계획서 리스트를 조회함. + * @param rq + * @return + */ @GetMapping(value = "/aprv/list") @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 +457,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") 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 +502,27 @@ public class BasFlightController { } + /** + * 비행경로 체크하는 기능. + * @param rq + * @return + */ @PostMapping("/airspace/contains") @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,7 +532,12 @@ public class BasFlightController { } - //지역 검색 + /** + * 지역 검색하는 기능. + * @param query + * @return + * @throws ParseException + */ @GetMapping("/plan/area/search") @ApiOperation(value = "지역 검색") @Tag(name = "비행계획서", description = "비행계획서 관련 API") @@ -358,6 +546,7 @@ public class BasFlightController { try { text = URLEncoder.encode(query, "UTF-8"); } catch (UnsupportedEncodingException e) { + // UTF-8 포맷팅으로 인코딩 실패시 에러 던짐 throw new RuntimeException("검색어 인코딩 실패", e); } @@ -373,6 +562,12 @@ public class BasFlightController { return ResponseEntity.ok().body(new SuccessResponse<>(obj)); } + /** + * 비행계획서 스케줄 검색하는 기능, + * 검색일[searchDate] 조건으로 조회함. + * @param searchDate + * @return + */ @GetMapping("/schedule") @Tag(name = "비행계획서", description = "비행계획서 관련 API") public ResponseEntity findSchedule(@RequestParam("searchDate") String searchDate) { @@ -380,9 +575,16 @@ public class BasFlightController { 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")); 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/jpa/repository/flt/FltPlanQueryRepository.java b/pav-server/src/main/java/com/palnet/biz/jpa/repository/flt/FltPlanQueryRepository.java index d5aa708c..a4a7a741 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; @@ -582,6 +794,54 @@ public class FltPlanQueryRepository { .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, 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초 From 2ed4aa5e47e339693cad10ffbf1dfacc33bc1a52 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?dhji=28=EC=A7=80=EB=8C=80=ED=95=9C=29?= Date: Mon, 11 Dec 2023 17:17:01 +0900 Subject: [PATCH 14/32] =?UTF-8?q?3=EB=B6=84=20=EC=9D=B4=EB=82=B4=20?= =?UTF-8?q?=EA=B2=80=EC=A6=9D=20=EB=B2=84=EA=B7=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/palnet/biz/api/bas/laanc/service/BasLaancService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 798aaae1..866d64b1 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 @@ -697,7 +697,7 @@ public class BasLaancService { // TODO 일자 검증 - 3분 초과 Instant createDt = entity.getCreateDt().plus(3, ChronoUnit.MINUTES); - boolean flag = !createDt.isAfter(Instant.now()); + boolean flag = !createDt.isBefore(Instant.now()); if (!flag) { entity.setStatus("EXPIRED"); entity.setUpdateUserId(userIdByToken); From ec12f0ba58c1c4b811403c8627157ec1c4114808 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?dhji=28=EC=A7=80=EB=8C=80=ED=95=9C=29?= Date: Mon, 11 Dec 2023 17:33:10 +0900 Subject: [PATCH 15/32] qr log --- .../com/palnet/biz/api/bas/laanc/service/BasLaancService.java | 3 ++- .../java/com/palnet/biz/api/external/service/TsService.java | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) 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 866d64b1..b871ccd0 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 @@ -676,6 +676,7 @@ public class BasLaancService { comConfirmBasRepository.save(comConfirmBas); + log.info(">>> confirmKey [GENERATED] ", confirmKey); return BasLaancQrcodeRs.builder() .qrcode(qr) .confirmKey(confirmKey) @@ -685,7 +686,7 @@ public class BasLaancService { // QR code 확인 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코드 조회 실패"); 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 0caeb110..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 @@ -159,6 +159,7 @@ public class TsService { // 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); From fab634f7b852323e196f44c6c171f76c520b2322 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=B0=95=EC=9E=AC=EC=9A=B0?= <박재우@host.docker.internal> Date: Mon, 11 Dec 2023 17:43:56 +0900 Subject: [PATCH 16/32] =?UTF-8?q?QR=EC=BD=94=EB=93=9C=20=EB=A7=8C=EB=A3=8C?= =?UTF-8?q?=EC=8B=9C=20=EC=BD=94=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/palnet/biz/api/bas/laanc/service/BasLaancService.java | 2 +- pav-server/src/main/java/com/palnet/comn/code/ErrorCode.java | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) 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 b871ccd0..791bfe23 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 @@ -704,7 +704,7 @@ public class BasLaancService { entity.setUpdateUserId(userIdByToken); comConfirmBasRepository.save(entity); comConfirmBasRepository.flush(); - throw new CustomException(ErrorCode.FAIL, "QR 기간 만료"); + throw new CustomException(ErrorCode.QR_EXPIRED, "QR 기간 만료"); } PilotValidRs rs = null; 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 59115320..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 @@ -28,8 +28,10 @@ public enum ErrorCode { TS_SERVER_ERROR("TS500", "서버 연결이 되지 않습니다."), // call측 network exception 처리 TS_NT_LAZY("TS501", "네트워크 연결이 지연 됩니다."), // call측 network exception 처리 TS_AUTH_KEY("TS600", "인증키가 유효하지 않습니다."), - TS_ETC("TS700", "기타 오류"); // 기 정의된 내용이 아닌 기타 오류인 경우 + TS_ETC("TS700", "기타 오류"), // 기 정의된 내용이 아닌 기타 오류인 경우 + // QR 관련 ERROR CODE + QR_EXPIRED("QR001", "QR코드 유효기간이 만료되었습니다"); private final String code; private final String message; From e240392b2516fc178cd25c2f85bf138ddef33c91 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?lkd9125=28=EC=9D=B4=EA=B2=BD=EB=8F=84=29?= Date: Mon, 11 Dec 2023 17:51:02 +0900 Subject: [PATCH 17/32] =?UTF-8?q?bas/group=20=ED=8C=A8=ED=82=A4=EC=A7=80?= =?UTF-8?q?=20=EC=A3=BC=EC=84=9D=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../group/controller/BasGroupController.java | 129 ++++++++++++---- .../bas/group/service/BasGroupService.java | 31 ++-- .../pty/PtyGroupQueryRepository.java | 139 +++++++++++++++++- 3 files changed, 251 insertions(+), 48 deletions(-) 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..18b7907e 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 @@ -44,6 +44,10 @@ public class BasGroupController { @Autowired private final BasGroupService service; + /** + * 그룹코드 생성 + * @return + */ @GetMapping(value = "/createid") @ApiOperation(value = "그룹코드 생성") @Tag(name = "그룹 컨트롤러", description = "그룹 관련 API") @@ -51,11 +55,18 @@ public class BasGroupController { 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,7 +77,8 @@ public class BasGroupController { } /** - * 나의 그룹 목록 조회 + * 내가 만든 그룹 목록조회하는 기능. + * 고객고유번호[cstmrSno]로 내가 만든 그룹을 조회함. * @param rq * @return */ @@ -77,19 +89,27 @@ public class BasGroupController { public ResponseEntity mylist(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,7 +120,8 @@ public class BasGroupController { } /** - * 나의 그룹 - 참여 그룹 목록 조회 + * 나의 그룹 - 참여 그룹 목록 조회하는 기능, + * 고객고유번호[cstmrSno]로 나의 그룹을 조회함. * @param rq * @return */ @@ -112,17 +133,25 @@ public class BasGroupController { 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,7 +162,7 @@ public class BasGroupController { } /** - * 그룹 목록 조회 + * 그룹 목록 조회하는 기능 * @param rq * @return */ @@ -145,17 +174,25 @@ public class BasGroupController { 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,7 +203,8 @@ public class BasGroupController { } /** - * 전체 그룹 목록 조회 + * 전체 그룹 목록 조회하는 기능, + * BasGroupRqModel 모델 값에 따라 조회하는 기능. * @param rq * @return */ @@ -177,10 +215,17 @@ public class BasGroupController { 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,7 +236,8 @@ public class BasGroupController { } /** - * 그룹 상세 조회 + * 그룹 상세 조회하는 기능, + * 그룹아이디[groupId]로 조회함. * @param id * @return */ @@ -203,9 +249,16 @@ public class BasGroupController { 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,7 +270,8 @@ public class BasGroupController { /** - * 그룹 생성 + * 그룹 생성하는 기능, + * BasGroupModel 모델에 입력받은 값으로 그룹 생성. * @return * @throws Exception */ @@ -228,11 +282,19 @@ public class BasGroupController { Map resultMap = new HashMap(); try { - boolean result = service.create(rq); + boolean result = service.create(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()); @@ -244,7 +306,8 @@ public class BasGroupController { } /** - * 그룹 수정 + * 그룹 수정하는 기능, + * BasGroupModel 모델에 입력받은 값으로 그룹 수정. * @return * @throws Exception */ @@ -255,7 +318,7 @@ public class BasGroupController { Map resultMap = new HashMap(); try { - boolean result = service.update(rq); + boolean result = service.update(rq); // 그룹 수정하는 기능 resultMap.put("result", result); @@ -266,6 +329,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,7 +348,8 @@ public class BasGroupController { } /** - * 그룹 삭제 + * 그룹 삭제하는 기능, + * 그룹아이디[groupId]로 삭제함. * @param id * @return */ @@ -289,11 +361,18 @@ public class BasGroupController { 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/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/jpa/repository/pty/PtyGroupQueryRepository.java b/pav-server/src/main/java/com/palnet/biz/jpa/repository/pty/PtyGroupQueryRepository.java index 82e1000d..07a5c721 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, From 0c44929d81f72a7e73d61f5dd2b034d405f6bb64 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?lkd9125=28=EC=9D=B4=EA=B2=BD=EB=8F=84=29?= Date: Mon, 11 Dec 2023 18:04:37 +0900 Subject: [PATCH 18/32] =?UTF-8?q?cns/faq=20=ED=8C=A8=ED=82=A4=EC=A7=80=20?= =?UTF-8?q?=EC=A3=BC=EC=84=9D=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cns/faq/controller/CnsFaqController.java | 119 ++++++++++++++++-- .../api/cns/faq/service/CnsFaqService.java | 26 +++- .../repository/cns/CnsFaqQueryRepository.java | 56 +++++++++ 3 files changed, 190 insertions(+), 11 deletions(-) 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..e209e336 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 @@ -31,14 +31,27 @@ public class CnsFaqController { private final CnsFaqService service; - /*FAQ 목록 조회*/ + /** + * FAQ 목록 조회하는 기능, + * FaqListRQModel 값에 있는 조건값으로 조회함. + * @param model + * @return + */ @Tag(name = "FAQ API", description = "FAQ 관련 API") @GetMapping public ResponseEntity getFaqList(FaqListRQModel model) { 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 +59,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 +74,27 @@ public class CnsFaqController { return ResponseEntity.ok().body(new SuccessResponse<>(result)); } - /*FAQ 상세 조회*/ + /** + * FAQ 상세 조회하는 기능, + * 일련번호[sno]로 조회함. + * @param sno + * @return + */ @Tag(name = "FAQ API", description = "FAQ 관련 API") @GetMapping("/{sno}") public ResponseEntity getFaqDetail(@PathVariable("sno") int sno) { FaqListModel 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 +102,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 +117,27 @@ public class CnsFaqController { return ResponseEntity.ok().body(new SuccessResponse<>(result)); } - /*FAQ 작성*/ + /** + * FAQ 작성하는 기능, + * FaqListModel모델에 있는 값으로 작성하는 기능. + * @param model + * @return + */ @Tag(name = "FAQ API", description = "FAQ 관련 API") @PostMapping 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 +145,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 +162,27 @@ public class CnsFaqController { } - /*FAQ 업데이트*/ + /** + * FAQ 업데이트 기능, + * FaqListModel 모델에 있는 값으로 업데이트함. + * @param model + * @return + */ @Tag(name = "FAQ API", description = "FAQ 관련 API") @PutMapping public ResponseEntity updateFaq(@RequestBody FaqListModel 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 +190,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 +206,26 @@ public class CnsFaqController { } - /*FAQ 논리 삭제*/ + /** + * FAQ 삭제하는 기능, + * 일련번호[sno]로 삭제하는 기능. + * @param sno + * @return + */ @Tag(name = "FAQ API", description = "FAQ 관련 API") @DeleteMapping("/{sno}") 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 +233,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/service/CnsFaqService.java b/pav-server/src/main/java/com/palnet/biz/api/cns/faq/service/CnsFaqService.java index 5c0e8d17..493ef774 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 @@ -25,6 +25,11 @@ public class CnsFaqService { private final CnsFaqBasRepository cnsFaqBasRepository; private final JwtTokenUtil jwtTokenUtil; + /** + * FaQ 항목들 조회하는 기능. + * @param model + * @return + */ public List getFaqList(FaqListRQModel model){ List result = query.getFaqList(model.getCategory(), model.getWord()); @@ -34,7 +39,12 @@ public class CnsFaqService { return result; } - + + /** + * 일련번호[sno]로 상세정보를 조회하는 기능. + * @param sno + * @return + */ public FaqListModel getFaqDetail(int sno){ cnsFaqBasRepository.updateViewCnt(sno); FaqListModel result = query.getFaqDetail(sno); @@ -42,6 +52,11 @@ public class CnsFaqService { return result; } + /** + * FaQ 추가하는 기능. + * @param model + * @return + */ @Transactional public boolean insertFaq(FaqListModel model){ String userId = jwtTokenUtil.getUserIdByToken(); @@ -69,6 +84,11 @@ public class CnsFaqService { } } + /** + * FaQ 수정하는 기능. + * @param model + * @return + */ @Transactional public boolean updateFaq(FaqListModel model) { String userId = jwtTokenUtil.getUserIdByToken(); @@ -92,6 +112,10 @@ public class CnsFaqService { } } + /** + * 일련번호[sno]로 삭제하는 기능. + * @param sno + */ public void deleteFaq(int sno) { // TODO 반환값이 실행한 갯수인지 확인 필요 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..1fa9fe91 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 @@ -18,6 +18,12 @@ public class CnsFaqQueryRepository { private final JPAQueryFactory query; + /** + * 조건값으로 FaQ리스트를 조회하는 SQL기능. + * @param category + * @param word + * @return + */ public List getFaqList(String category, String word) { QCnsFaqBas bas = QCnsFaqBas.cnsFaqBas; @@ -34,6 +40,30 @@ public class CnsFaqQueryRepository { builder.and(bas.title.contains(word)); } + /** + * 삭제여부[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, @@ -57,6 +87,11 @@ public class CnsFaqQueryRepository { return r; } + /** + * 일련번호[sno]로 상세정보를 조회하는 SQL 기능. + * @param sno + * @return + */ public FaqListModel getFaqDetail(int sno) { QCnsFaqBas bas = QCnsFaqBas.cnsFaqBas; @@ -66,6 +101,27 @@ public class CnsFaqQueryRepository { builder.and(bas.expsrYn.eq("Y")); builder.and(bas.delYn.eq("N")); + /** + * 일련번호[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' + */ FaqListModel r = query .select(Projections.bean( FaqListModel.class, From 5e024d4af11ee53458e222a1cc3f569ab3105a1f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?lkd9125=28=EC=9D=B4=EA=B2=BD=EB=8F=84=29?= Date: Tue, 12 Dec 2023 10:13:05 +0900 Subject: [PATCH 19/32] =?UTF-8?q?cns/qna=20=ED=8C=A8=ED=82=A4=EC=A7=80=20?= =?UTF-8?q?=EC=A3=BC=EC=84=9D=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cns/qna/controller/CnsQnaController.java | 159 +++++++++++++++++- .../api/cns/qna/service/CnsQnaService.java | 33 ++-- .../comn/file/service/ComnFileService.java | 12 ++ .../repository/cns/CnsQnaQueryRepository.java | 85 +++++++++- 4 files changed, 269 insertions(+), 20 deletions(-) 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..430de96e 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 @@ -32,14 +32,28 @@ 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 등록 - 사용자") 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 +61,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,6 +76,12 @@ 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 리스트 조회-관리자") @@ -62,8 +89,16 @@ public class CnsQnaController { 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 +106,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,6 +122,12 @@ public class CnsQnaController { } + /** + * QnA리스트 조회하는 기능[관리자], + * QnaSelectListRQ 값에 따라서 조회함. + * @param rq + * @return + */ @GetMapping("/user") @Tag(name = "QNA", description = "QNA 관련 API") @ApiOperation(value = "QnA 리스트 조회-사용자") @@ -89,6 +137,14 @@ public class CnsQnaController { 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 +152,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 +168,28 @@ 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) { 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 +197,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 +212,28 @@ 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 수정 - 사용자") 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 +241,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,6 +257,12 @@ public class CnsQnaController { } + /** + * QnA삭제하는 기능, + * QnA일련번호[qnaSno]로 삭제함. + * @param qnaSno + * @return + */ @DeleteMapping("/{qnaSno}") @Tag(name = "QNA", description = "QNA 관련 API") @ApiOperation(value = "QnA 삭제하기") @@ -159,8 +270,16 @@ public class CnsQnaController { // 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 +287,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,6 +302,12 @@ 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 답변 등록 - 관리자") @@ -188,8 +320,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 +337,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")); 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..45f9cceb 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,12 +112,12 @@ public class CnsQnaService { } /** - * Qna 상세불러오기 - * + * Qna 상세불러오기 기능. * @param qnaSno * @return */ - @Transactional // 조회수 증가하기떄문 + // @Transactional는 데이터베이스의 정합성을 위해 사용합니다, 추가 수정 삭제 등에서 사용합니다, 이 기능에서는 조회수 증가하기 떄문에 사용했습니다. + @Transactional public QnaDetailRSModel getQnaDetail(int qnaSno) { cnsQnaBasRepository.pulsViewCount(qnaSno); @@ -125,7 +125,7 @@ public class CnsQnaService { CnsQnaBas entity = cnsQnaBasRepository.findFirstByQnaSnoAndTargetSnoAndDelYnAndExpsrYn(qnaSno, 0, "N", "Y"); 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 +141,7 @@ public class CnsQnaService { } /** - * Qna리스트 조회 + * Qna리스트 조회하는 기능[관리자]. * * @param rq * @return @@ -150,14 +150,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 +192,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/file/service/ComnFileService.java b/pav-server/src/main/java/com/palnet/biz/api/comn/file/service/ComnFileService.java index ba77dbaf..17df0035 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 @@ -351,6 +351,13 @@ public class ComnFileService { return true; } + + /** + * 파일일련번호 배열로 삭제처리 진행함. + * @param fileSnoList + * @return + */ + // @Transactional는 데이터베이스의 정합성을 위해 사용합니다, 추가 수정 삭제 등에서 사용합니다, 이 기능에서는 삭제컬럼은 수정했기 때문에 사용했습니다. @Transactional public boolean deleteFiles(List fileSnoList){ @@ -389,6 +396,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/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, From f64debca81ac31c0d61d672e8c8966081d2de47a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?lkd9125=28=EC=9D=B4=EA=B2=BD=EB=8F=84=29?= Date: Tue, 12 Dec 2023 10:18:30 +0900 Subject: [PATCH 20/32] =?UTF-8?q?comn/elev=20=ED=8C=A8=ED=82=A4=EC=A7=80?= =?UTF-8?q?=20=EC=A3=BC=EC=84=9D=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../elev/controller/ComnElevController.java | 66 ++++++++++++++++++- .../comn/elev/service/ComnElevService.java | 20 ++++-- .../utils/DigitalElevationModelUtils.java | 6 ++ 3 files changed, 85 insertions(+), 7 deletions(-) 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..1e2ceb85 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 @@ -32,6 +32,11 @@ public class ComnElevController { private final ComnElevService comnElevService; + /** + * + * @param rq + * @return + */ @PostMapping(value = "/ground") @ApiOperation(value = "지표면 고도 가져오기") @Tag(name = "공통 API", description = "공통 API") @@ -39,9 +44,17 @@ public class ComnElevController { 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,6 +77,11 @@ 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") @@ -64,9 +89,17 @@ public class ComnElevController { 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 +107,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,6 +122,11 @@ 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") @@ -89,9 +134,17 @@ public class ComnElevController { 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 +152,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/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/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; From 84f14719c62d915289fe4ad2733cc6f262437533 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?lkd9125=28=EC=9D=B4=EA=B2=BD=EB=8F=84=29?= Date: Tue, 12 Dec 2023 10:22:20 +0900 Subject: [PATCH 21/32] =?UTF-8?q?conm/file=20=ED=8C=A8=ED=82=A4=EC=A7=80?= =?UTF-8?q?=20=EC=A3=BC=EC=84=9D=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../file/controller/ComnFileController.java | 26 ++++++++++++++++++- .../comn/file/service/ComnFileService.java | 13 +++++----- 2 files changed, 32 insertions(+), 7 deletions(-) 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..751babd4 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 @@ -27,21 +27,45 @@ public class ComnFileController { private final ComnFileService comnFileService; + /** + * 사용 안함[@Deprecated] + * 파일일련번호[fileSno]로 파일 다운로드 하는 기능. + * QueryParam 방식으로 parameter를 받음. + * @param fileSno + */ @Deprecated @GetMapping("/download") public void downloadPDF(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) { 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 17df0035..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(); From 427665aff1c09b280461ec7527137730f4e0580a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?lkd9125=28=EC=9D=B4=EA=B2=BD=EB=8F=84=29?= Date: Tue, 12 Dec 2023 10:51:29 +0900 Subject: [PATCH 22/32] =?UTF-8?q?comn/sunriseset=20=ED=8C=A8=ED=82=A4?= =?UTF-8?q?=EC=A7=80=20=EC=A3=BC=EC=84=9D=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ComnSunrisesetController.java | 67 ++++++++++++++- .../service/ComnSunrisesetService.java | 15 ++++ .../com/ComRiseSetQueryRepository.java | 81 +++++++++++++++++++ 3 files changed, 160 insertions(+), 3 deletions(-) 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..b18accfd 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 @@ -45,6 +45,12 @@ public class ComnSunrisesetController { private final ComnSunrisesetService comnSunrisesetService; + /** + * 일출/일몰 시간대를 조회하는 기능, + * ComnSunrisesetRq에 있는 검색 시작일, 끝일의 조건에 맞춰 조회함. + * @param rq + * @return + */ @ApiOperation(value = "일출/일몰 조회", notes = "기간내 모든 일출/일몰조회") @Tag(name = "공통 API", description = "공통 API") @GetMapping("/list") @@ -52,10 +58,18 @@ public class ComnSunrisesetController { 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 +77,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,7 +92,12 @@ public class ComnSunrisesetController { return ResponseEntity.ok().body(new SuccessResponse<>(rs)); } - + /** + * 근접한 지역의 일출/일몰 조회, + * ComnSunrisesetCoordRq 모델에 있는 시작,끝날짜 조건에 맞춰 가장 근접한 지역의 일출/일몰 조회. + * @param rq + * @return + */ @ApiOperation(value = "일출/일몰 조회(좌표)", notes = "기간내 근접한 지역의 일출/일몰 조회") @Tag(name = "공통 API", description = "공통 API") @GetMapping("/coord") @@ -79,10 +105,18 @@ public class ComnSunrisesetController { 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 +124,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,6 +139,11 @@ public class ComnSunrisesetController { return ResponseEntity.ok().body(new SuccessResponse<>(rs)); } + /** + * 근접한 지역의 현재~6개월치의 일출/일몰 데이터 조회하는 기능 + * @param rq + * @return + */ @ApiOperation(value = "일출/일몰 조회(좌표-6개월치)", notes = "근접한 지역의 현재~6개월치의 일출/일몰 데이터 조회") @Tag(name = "공통 API", description = "공통 API") @ApiImplicitParams(value = { @@ -113,6 +159,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 +174,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/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/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, From 44251b04c7fb57a182b2c10392e8b72ea5238134 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?lkd9125=28=EC=9D=B4=EA=B2=BD=EB=8F=84=29?= Date: Tue, 12 Dec 2023 10:54:28 +0900 Subject: [PATCH 23/32] conm/sms --- .../biz/api/comn/sms/service/ComnSmsService.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) 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(); From d4a65abd1425825d244f26865fe1e2a6fd260692 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?lkd9125=28=EC=9D=B4=EA=B2=BD=EB=8F=84=29?= Date: Tue, 12 Dec 2023 11:22:34 +0900 Subject: [PATCH 24/32] =?UTF-8?q?ctr/cntrl=20=ED=8C=A8=ED=82=A4=EC=A7=80?= =?UTF-8?q?=20=EC=A3=BC=EC=84=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cntrl/controller/CtrCntrlController.java | 108 ++++++++++++++++-- .../ctr/cntrl/controller/PingController.java | 4 + .../controller/SocketReceiverController.java | 27 ++++- .../ctr/cntrl/service/CtrCntrlService.java | 17 ++- .../cntrl/service/SocketReceiverService.java | 10 ++ .../ctr/CtrCntrlQueryRepository.java | 100 ++++++++++++++++ 6 files changed, 252 insertions(+), 14 deletions(-) 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..9d6c538f 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 @@ -36,7 +36,7 @@ public class CtrCntrlController { } /** - * TODO 드론 관제 이력 목록 (Socket 분리 전) + * TODO 드론 관제 이력 목록 (Socket 분리 전) 조회하는 기능. * * @param id - 관제 ID * @return @@ -49,9 +49,16 @@ public class CtrCntrlController { 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,8 +68,8 @@ public class CtrCntrlController { } /** - * TODO 드론 관제 상세 정보 - * + * TODO 드론 관제 상세 정보 조회 기능, + * 관제ID[controlId]로 조회하여 확인함 * @param id - 관제 ID * @return */ @@ -74,9 +81,16 @@ public class CtrCntrlController { 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")); @@ -99,8 +113,15 @@ public class CtrCntrlController { 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,29 @@ 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") 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")); @@ -136,8 +172,15 @@ public class CtrCntrlController { 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")); @@ -162,6 +205,13 @@ public class CtrCntrlController { 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")); @@ -186,6 +236,13 @@ public class CtrCntrlController { 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")); @@ -210,6 +267,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")); @@ -232,6 +296,13 @@ public class CtrCntrlController { 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")); @@ -254,6 +325,13 @@ public class CtrCntrlController { 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")); @@ -279,6 +357,13 @@ public class CtrCntrlController { 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")); @@ -300,6 +385,13 @@ public class CtrCntrlController { 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..b88db876 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 @@ -32,13 +32,26 @@ import java.util.concurrent.Callable; public class SocketReceiverController { private final SocketReceiverService socketReceiverService; + + /** + * 소켓에서 날아오는 데이터를 데이터베이스에 저장시키는 기능, + * GPModel 모델에 오는값을 저장시킴. + * @param model + * @return + */ @PostMapping("/receiver") - public ResponseEntity receiver(@RequestBody GPModel model) { - System.out.println("socket message : " + model); - socketReceiverService.insert(model); + public ResponseEntity receiver(@RequestBody GPModel model) { + log.info("socket message : {}", model); + socketReceiverService.insert(model); // 소켓에서 날아오는 데이터를 데이터베이스에 저장시키는 기능 return ResponseEntity.ok().build(); } + /** + * 비동기방식으로 소켓에서 날아오는 데이터를 데이터베이스에 저장시키는 기능, + * GPModel 모델에 오는값을 저장시킴. + * @param model + * @return + */ @PostMapping("/receiver/async") public Callable asyncReceiver(@RequestBody GPModel model) { return () -> { @@ -48,10 +61,16 @@ public class SocketReceiverController { }; } + /** + * 소켓에서 날아오는 데이터를 데이터베이스에 저장시키는 기능, + * 한번에 많은 관제아이디를 저장시키기 위해 사용하는 기능. + * @param models + * @return + */ @PostMapping("/receiver/all") public ResponseEntity receiver(@RequestBody Map> models) { // System.out.println("socket message : " + models); - socketReceiverService.insertAll(models); + socketReceiverService.insertAll(models); // 한번에 많은 데이터를 데이터베이스에 저장하는 기능 return ResponseEntity.ok().build(); } } 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..23b41879 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 @@ -73,6 +73,12 @@ public class CtrCntrlService { private final FltPlanQueryRepository fltPlanQueryRepository; + /** + * 관제이력을 조회하는 기능. + * 현재는 사용하지 않음. + * @param objectId + * @return + */ public List getListHistory(String objectId) { List filterList = new ArrayList(); @@ -92,7 +98,7 @@ public class CtrCntrlService { } /** - * TODO 관제 상세 조회 + * TODO 관제 상세 조회하는 기능. * * @param controlId * @return @@ -109,7 +115,7 @@ public class CtrCntrlService { if (result.getHpno() != null && !result.getHpno().isEmpty()) { try { - String decHpno = EncryptUtils.decrypt(result.getHpno()); + String decHpno = EncryptUtils.decrypt(result.getHpno()); // 휴대폰번호 복호화. if (decHpno != null && !decHpno.isEmpty()) { result.setHpno(decHpno); } @@ -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 f157a02e..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(); @@ -111,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/jpa/repository/ctr/CtrCntrlQueryRepository.java b/pav-server/src/main/java/com/palnet/biz/jpa/repository/ctr/CtrCntrlQueryRepository.java index 21357e37..ed4ef481 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 @@ -1239,6 +1239,7 @@ public class CtrCntrlQueryRepository{ /** * 비행번호[CNTRL_ID] 로 이력현황을 조회하는 SQL입니다. + * * SELECT * CCH.CNTRL_ID , * CCH.HSTRY_SNO , @@ -1554,6 +1555,11 @@ public class CtrCntrlQueryRepository{ } // TODO 임시 수정 + /** + * 관제사항 상세보는 SQL기능. + * @param controlId + * @return + */ public CtrCntrlDtlModel detailCntrlForKac(String controlId) { QCtrCntrlBas ctr = QCtrCntrlBas.ctrCntrlBas; // QComArcrftBas cBas = QComArcrftBas.comArcrftBas; @@ -1563,6 +1569,40 @@ public class CtrCntrlQueryRepository{ 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, @@ -1899,11 +1939,28 @@ public class CtrCntrlQueryRepository{ 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"), @@ -1918,6 +1975,11 @@ public class CtrCntrlQueryRepository{ } + /** + * 그룹의 기체 정보 조회하는 SQL 입니다. + * @Cacheable은 RQ값이 같을 시 이전 구해놨던 데이터를 바로 발송하는 어노테이션입니다, 자주 쓰는 항목에 사용합니다. + * @return + */ @Cacheable(value = "group-auth") public List findByGroupInfo() { QPtyCstmrGroup pcg = QPtyCstmrGroup.ptyCstmrGroup; @@ -1937,6 +1999,21 @@ public class CtrCntrlQueryRepository{ 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"), @@ -2161,6 +2238,11 @@ public class CtrCntrlQueryRepository{ return result; } + /** + * 비행완료된 관제이력 조회하는 SQL 기능. + * @param cntrlId + * @return + */ public List getCompleteInfo(String cntrlId){ QCtrCntrlBas qCntrlBasEntity = QCtrCntrlBas.ctrCntrlBas; @@ -2170,6 +2252,24 @@ public class CtrCntrlQueryRepository{ builder.and(qCtrCntrHstry.cntrlId.eq(cntrlId)); builder.and(qCntrlBasEntity.statusCd.eq("99")); + /** + * 비행번호[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 , From 10f236bceca02ad678f7e431b27c276863a04eda Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?lkd9125=28=EC=9D=B4=EA=B2=BD=EB=8F=84=29?= Date: Tue, 12 Dec 2023 14:32:45 +0900 Subject: [PATCH 25/32] =?UTF-8?q?main/dash=20=ED=8C=A8=ED=82=A4=EC=A7=80?= =?UTF-8?q?=20=EC=A3=BC=EC=84=9D=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dash/controller/MainDashController.java | 240 ++++++++++++++---- .../main/dash/service/MainDashService.java | 91 ++++--- .../ctr/CtrCntrlQueryRepository.java | 148 ++++++++++- .../ctr/CtrCntrlWarnLogQueryRepository.java | 29 +++ .../flt/FltPlanQueryRepository.java | 120 ++++++++- .../pty/PtyDronQueryRepository.java | 32 ++- .../pty/PtyGroupQueryRepository.java | 25 +- 7 files changed, 591 insertions(+), 94 deletions(-) diff --git a/pav-server/src/main/java/com/palnet/biz/api/main/dash/controller/MainDashController.java b/pav-server/src/main/java/com/palnet/biz/api/main/dash/controller/MainDashController.java index d257a759..129b4ce9 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/main/dash/controller/MainDashController.java +++ b/pav-server/src/main/java/com/palnet/biz/api/main/dash/controller/MainDashController.java @@ -39,7 +39,8 @@ public class MainDashController { private final MainDashService service; /** - * @param rq + * 일 별 비행횟수 통계를 조회하는 기능. + * @param yyyymm * @return */ @GetMapping(value = "/stcs/day") @@ -51,17 +52,25 @@ public class MainDashController { // log.debug(yyyymm); - //입력값 검증 + // yyyymm 값이 있는지, 글자 갯수가 7개인지 입력값 검증 if(yyyymm == null || !(yyyymm.length() == 7) ) { - return ResponseEntity.status(HttpStatus.OK) + // 검증통과하지 못할 시 서버에서 "의도적인" 에러 반환 + return ResponseEntity.status(HttpStatus.OK) // "의도적인" 에러 반환코드 .body(new ErrorResponse(RSErrorCode.ER_PARAM)); } try { - result = service.mainDashStcsDay(yyyymm); + result = service.mainDashStcsDay(yyyymm); // 일별 비행건수 통계하는 기능 } catch (Exception e) { + /** + * try{ + ... + } + * try 영역 안 코드들중 문제가 생기면 오는 곳. + * log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌 + */ log.error("IGNORE : {}", e); return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) .body(new ErrorResponse("Server Error", "-1")); @@ -73,7 +82,9 @@ public class MainDashController { /** - * @param rq + * TOP5 지역 별 비행횟수 통계를 조회하는 기능 + * 일자[yyyymm]별 검색 + * @param yyyymm * @return */ @GetMapping(value = "/stcs/area") @@ -83,16 +94,25 @@ public class MainDashController { public ResponseEntity stcsArea(String yyyymm) { List result = null; + // yyyymm 값이 있는지, 글자 갯수가 7개인지 입력값 검증 if(yyyymm == null || !(yyyymm.length() == 7) ) { - return ResponseEntity.status(HttpStatus.OK) + // 검증통과하지 못할 시 서버에서 "의도적인" 에러 반환 + return ResponseEntity.status(HttpStatus.OK) // "의도적인" 에러 반환코드 .body(new ErrorResponse(RSErrorCode.ER_PARAM)); } try { - result = service.mainDashStcsArea(yyyymm); + result = service.mainDashStcsArea(yyyymm); // Top5 지역별 비행횟수 통계기능 } catch (Exception e) { + /** + * try{ + ... + } + * try 영역 안 코드들중 문제가 생기면 오는 곳. + * log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌 + */ log.error("IGNORE : {}", e); return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) .body(new ErrorResponse("Server Error", "-1")); @@ -103,7 +123,8 @@ public class MainDashController { } /** - * @param rq + * 본인이 생성한 그룹 정보죄하는 기능. + * @param cstmrSno * @return */ @GetMapping(value = "/group/list") @@ -113,16 +134,24 @@ public class MainDashController { public ResponseEntity groupList(Integer cstmrSno) { List result = null; - //입력값 검증 + // 회원고유번호[cstmrSno] 입력값 검증처리 if(cstmrSno == null) { - return ResponseEntity.status(HttpStatus.OK) + // 검증통과하지 못할 시 서버에서 "의도적인" 에러 반환 + return ResponseEntity.status(HttpStatus.OK) // "의도적인" 에러 반환코드 .body(new ErrorResponse(RSErrorCode.ER_PARAM)); } try { - result = service.mainDashGroupList(cstmrSno); + result = service.mainDashGroupList(cstmrSno); // TOP3 가입 그룹 리스트 조회하는 기능 } catch (Exception e) { + /** + * try{ + ... + } + * try 영역 안 코드들중 문제가 생기면 오는 곳. + * log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌 + */ log.error("IGNORE : {}", e); return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) .body(new ErrorResponse("Server Error", "-1")); @@ -132,7 +161,12 @@ public class MainDashController { } - + /** + * 기체 정보 리스트 조회하는 기능, + * 회원 고유번호[cstmrSno]로 조회함. + * @param cstmrSno + * @return + */ @GetMapping(value = "/arcrft/list") @ApiOperation(value = "기체 정보 리스트") @Tag(name = "메인화면 컨트롤러", description = "메인화면 관련 API") @@ -140,16 +174,24 @@ public class MainDashController { public ResponseEntity arcrftList(Integer cstmrSno) { List result = null; - //입력값 검증 + // 회원고유번호[cstmrSno] 입력값 검증처리 if(cstmrSno == null) { - return ResponseEntity.status(HttpStatus.OK) + // 검증통과하지 못할 시 서버에서 "의도적인" 에러 반환 + return ResponseEntity.status(HttpStatus.OK) // "의도적인" 에러 반환코드 .body(new ErrorResponse(RSErrorCode.ER_PARAM)); } try { - result = service.mainDashDronList(cstmrSno); + result = service.mainDashDronList(cstmrSno); // Top3 기체 정보 리스트 조회하는 기능 } catch (Exception e) { + /** + * try{ + ... + } + * try 영역 안 코드들중 문제가 생기면 오는 곳. + * log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌 + */ log.error("IGNORE : {}", e); return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) .body(new ErrorResponse("Server Error", "-1")); @@ -159,7 +201,13 @@ public class MainDashController { } - + /** + * 비행실적 통계하는 기능. + * @param date + * @param type + * @Deprecated 현재 사용하지 않음 + * @return + */ @GetMapping(value = "/stcs/flight/date/{type}") @ApiOperation(value = "김포공항, 비행실적 통계") @Tag(name = "메인화면 컨트롤러", description = "메인화면 관련 API") @@ -174,18 +222,25 @@ public class MainDashController { try { if(date == null) date = ""; - formatParam = service.paramCheck(date, type); + formatParam = service.paramCheck(date, type); // 파라미터 체크 } catch (NumberFormatException e) { - return ResponseEntity.status(HttpStatus.OK) - .body(new ErrorResponse(RSErrorCode.ER_PARAM)); + // 검증통과하지 못할 시 서버에서 "의도적인" 에러 반환 + return ResponseEntity.status(HttpStatus.OK) // "의도적인" 에러 반환코드 + .body(new ErrorResponse(RSErrorCode.ER_PARAM)); } List result = null; try { - result = service.mainKacDashStcsDay(date,formatParam); + result = service.mainKacDashStcsDay(date,formatParam); // 날짜별 비행실적 통계기능 } catch (Exception e) { - + /** + * try{ + ... + } + * try 영역 안 코드들중 문제가 생기면 오는 곳. + * log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌 + */ log.error("IGNORE : {}", e); return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) .body(new ErrorResponse("Server Error", "-1")); @@ -194,6 +249,13 @@ public class MainDashController { return ResponseEntity.ok().body(new SuccessResponse>(result)); } + /** + * 김포공항, 비행승인 통계 + * @param date + * @param type + * @Deprecated 현재 사용하지 않음 + * @return + */ @GetMapping("/stcs/plan-allow/date/{type}") @ApiOperation(value = "김포공항, 비행승인 통계") @Tag(name = "메인화면 컨트롤러", description = "메인화면 관련 API") @@ -208,18 +270,25 @@ public class MainDashController { try { if(date == null) date = ""; - formatParam = service.paramCheck(date,type); + formatParam = service.paramCheck(date, type); // 파라미터 체크 } catch (NumberFormatException e) { - return ResponseEntity.status(HttpStatus.OK) - .body(new ErrorResponse(RSErrorCode.ER_PARAM)); + // 검증통과하지 못할 시 서버에서 "의도적인" 에러 반환 + return ResponseEntity.status(HttpStatus.OK) // "의도적인" 에러 반환코드 + .body(new ErrorResponse(RSErrorCode.ER_PARAM)); } List result = null; try { - result = service.mainStcsPlanAllow(date,formatParam); + result = service.mainStcsPlanAllow(date,formatParam); // 김포공항, 비행승인 통계 기능 } catch (Exception e) { - + /** + * try{ + ... + } + * try 영역 안 코드들중 문제가 생기면 오는 곳. + * log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌 + */ log.error("IGNORE : {}", e); return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) .body(new ErrorResponse("Server Error", "-1")); @@ -228,6 +297,14 @@ public class MainDashController { return ResponseEntity.ok().body(new SuccessResponse>(result)); } + /** + * 드론별 비행 통계조회하는 기능. + * @param date + * @param idntfNum + * @param type + * @Deprecated 현재 사용하지 않음 + * @return + */ @GetMapping("/stcs/drone-flight/date/{type}") @ApiOperation(value = "김포공항, 드론별 비행 통계") @Tag(name = "메인화면 컨트롤러", description = "메인화면 관련 API") @@ -237,25 +314,31 @@ public class MainDashController { @ApiImplicitParam(name = "idntfNum",value = "드론식별번호", dataTypeClass = String.class), }) @Deprecated - public ResponseEntity droneFlightStatistics(String date, @RequestParam(required = true) String idntfNum, @PathVariable String type){ - log.info("idntfNum -> {}", idntfNum); + public ResponseEntity droneFlightStatistics(String date, @RequestParam(required = true) String idntfNum, @PathVariable String type){ String[] formatParam = null; try { if(date == null) date = ""; - formatParam = service.paramCheck(date,type); + formatParam = service.paramCheck(date, type); // 파라미터 체크 } catch (NumberFormatException e) { - return ResponseEntity.status(HttpStatus.OK) - .body(new ErrorResponse(RSErrorCode.ER_PARAM)); + // 검증통과하지 못할 시 서버에서 "의도적인" 에러 반환 + return ResponseEntity.status(HttpStatus.OK) // "의도적인" 에러 반환코드 + .body(new ErrorResponse(RSErrorCode.ER_PARAM)); } List result = null; try { - result = service.mainStcsDroneFlight(date,idntfNum,formatParam); + result = service.mainStcsDroneFlight(date,idntfNum,formatParam); // 드론별 비행실적 통계 기능. } catch (Exception e) { - + /** + * try{ + ... + } + * try 영역 안 코드들중 문제가 생기면 오는 곳. + * log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌 + */ log.error("IGNORE : {}", e); return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) .body(new ErrorResponse("Server Error", "-1")); @@ -264,6 +347,13 @@ public class MainDashController { return ResponseEntity.ok().body(new SuccessResponse>(result)); } + /** + * 비정상상황 비행 통계조회하는 기능. + * @param date + * @param type + * @Deprecated 현재 사용하지 않음 + * @return + */ @GetMapping("/stcs/warning-flight/date/{type}") @ApiOperation(value = "김포공항, 비정상상황 비행 통계") @Tag(name = "메인화면 컨트롤러", description = "메인화면 관련 API") @@ -278,18 +368,25 @@ public class MainDashController { try { if(date == null) date = ""; - formatParam = service.paramCheck(date,type); + formatParam = service.paramCheck(date, type); // 파라미터 체크 } catch (NumberFormatException e) { - return ResponseEntity.status(HttpStatus.OK) - .body(new ErrorResponse(RSErrorCode.ER_PARAM)); + // 검증통과하지 못할 시 서버에서 "의도적인" 에러 반환 + return ResponseEntity.status(HttpStatus.OK) // "의도적인" 에러 반환코드 + .body(new ErrorResponse(RSErrorCode.ER_PARAM)); } List result = null; try { - result = service.mainStcsWarningFlight(date,formatParam); + result = service.mainStcsWarningFlight(date,formatParam); // 비정상상황 통계구하는 기능. } catch (Exception e) { - + /** + * try{ + ... + } + * try 영역 안 코드들중 문제가 생기면 오는 곳. + * log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌 + */ log.error("IGNORE : {}", e); return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) .body(new ErrorResponse("Server Error", "-1")); @@ -298,6 +395,10 @@ public class MainDashController { return ResponseEntity.ok().body(new SuccessResponse>(result)); } + /** + * 드론 비행 현황 통계 기능. + * @return + */ @GetMapping(value = "/stcs/dron-flight") @ApiOperation(value = "드론 비행 현황") @Tag(name = "메인화면 컨트롤러", description = "메인화면 관련 API") @@ -306,8 +407,15 @@ public class MainDashController { Map result = null; try { - result = service.mainDashDronFlightStcs(); + result = service.mainDashDronFlightStcs(); // 드론 비행 현황기능 }catch (Exception e) { + /** + * try{ + ... + } + * try 영역 안 코드들중 문제가 생기면 오는 곳. + * log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌 + */ log.error("IGNORE : {}", e); return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) .body(new ErrorResponse("Server Error", "-1")); @@ -316,6 +424,11 @@ public class MainDashController { return ResponseEntity.ok().body(new SuccessResponse< Map>(result)); } + /** + * 드론 별 비행운항 목록 조회하는 기능. + * @param serviceType + * @return + */ @GetMapping(value = "/dron-flight/list") @ApiOperation(value = "드론 별 비행운항 목록") @Tag(name = "메인화면 컨트롤러", description = "메인화면 관련 API") @@ -324,8 +437,15 @@ public class MainDashController { List result = null; try { - result = service.mainDashDronFlightList(serviceType); + result = service.mainDashDronFlightList(serviceType); // 드론 별 비행운항 목록 조회하는 기능 }catch (Exception e) { + /** + * try{ + ... + } + * try 영역 안 코드들중 문제가 생기면 오는 곳. + * log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌 + */ log.error("IGNORE : {}", e); return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) .body(new ErrorResponse("Server Error", "-1")); @@ -334,6 +454,11 @@ public class MainDashController { return ResponseEntity.ok().body(new SuccessResponse>(result)); } + /** + * 일일 비정상상황에 대한 통계 기능. + * @param serviceType + * @return + */ @GetMapping("/current/flight-warn") @ApiOperation(value = "일일 비정상상황 통계") @Tag(name = "메인화면 컨트롤러", description = "메인화면 관련 API") @@ -345,8 +470,15 @@ public class MainDashController { List result = new ArrayList<>(); try { - result = service.currentFlightWarn(serviceType); + result = service.currentFlightWarn(serviceType); // 일일비정상상황에 대한 통계 기능을 조회하는 기능 }catch (Exception e) { + /** + * try{ + ... + } + * try 영역 안 코드들중 문제가 생기면 오는 곳. + * log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌 + */ log.error("IGNORE : {}", e); return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) .body(new ErrorResponse("Server Error", "-1")); @@ -355,6 +487,11 @@ public class MainDashController { return ResponseEntity.ok().body(new SuccessResponse>(result)); } + /** + * 일일 비행계획에 대한 통계 기능. + * @param serviceType + * @return + */ @GetMapping("/current/flight-plan") @ApiOperation(value = "일일 비행계획 통계") @Tag(name = "메인화면 컨트롤러", description = "메인화면 관련 API") @@ -367,6 +504,13 @@ public class MainDashController { try { result = service.currentFlightPlan(serviceType); } catch (Exception e){ + /** + * try{ + ... + } + * try 영역 안 코드들중 문제가 생기면 오는 곳. + * log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌 + */ log.error("IGNORE : {}", e); return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) .body(new ErrorResponse("Server Error", "-1")); @@ -377,15 +521,25 @@ public class MainDashController { return ResponseEntity.ok().body(new SuccessResponse>(result)); } - + /** + * 일일 비행건수 현황 통계기능. + * @return + */ @GetMapping("/stcs/dailyflight") @ApiOperation(value = "일일 비행건수 현황") @Tag(name = "메인화면 컨트롤러",description = "메인화면 관련 API") public ResponseEntity getDailyFlightNumOfStcs(){ List result = null; try { - result = service.dailyFlightNumOfStcs(); + result = service.dailyFlightNumOfStcs(); // 일일 비행건수 현황 통계기능 }catch (Exception e){ + /** + * try{ + ... + } + * try 영역 안 코드들중 문제가 생기면 오는 곳. + * log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌 + */ log.error("IGNORE : {} ", e); return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(new ErrorResponse("Server Error", "-1")); } diff --git a/pav-server/src/main/java/com/palnet/biz/api/main/dash/service/MainDashService.java b/pav-server/src/main/java/com/palnet/biz/api/main/dash/service/MainDashService.java index a56cd475..309edfd8 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/main/dash/service/MainDashService.java +++ b/pav-server/src/main/java/com/palnet/biz/api/main/dash/service/MainDashService.java @@ -49,7 +49,7 @@ public class MainDashService { private final JwtTokenUtil token; /** - * 일별 비행건수 통계 + * 일별 비행건수 통계하는 기능. * @param rq * @return */ @@ -69,7 +69,7 @@ public class MainDashService { } /** - * Top5 지역별 비행횟수 통계 + * Top5 지역별 비행횟수 통계기능. * @param rq * @return */ @@ -89,7 +89,9 @@ public class MainDashService { } /** - * TOP3 가입 그룹 리스트 표출 + * TOP3 가입 그룹 리스트 조회하는 기능. + * @param cstmrSno + * @return */ public List mainDashGroupList(int cstmrSno){ @@ -113,7 +115,7 @@ public class MainDashService { /** - * Top3 기체 정보 리스트 표출 + * Top3 기체 정보 리스트 조회하는 기능. */ public List mainDashDronList(int cstmrSno){ List resultList = ptyDronQueryRepository.dronTop3(cstmrSno); @@ -122,8 +124,9 @@ public class MainDashService { /** - * 김포공항, 날짜별 통계 - * @param yyyymm + * 김포공함, 날짜별 비행실적 통계 + * @param date + * @param formatParam * @return */ public List mainKacDashStcsDay(String date, String[] formatParam){ @@ -133,27 +136,38 @@ public class MainDashService { return resultList; } - public List mainDashDronFlightList(String serviceType) throws Exception{ - - String cptAuth = token.getCptAuthCodeByToken(); - - List resultList = new ArrayList(); - - cptAuth = "KAC"; // 임시 테스트용으로 KAC 권한 부여 - - if(cptAuth != null) { - - resultList = fltPlanQueryRepository.getFlightDronList(cptAuth, serviceType); - - }else { - - log.error("cptAuth가 부여되지 않은 계정입니다"); - throw new Exception(); - } - - return resultList; - } + /** + * 드론 별 비행운항 목록 조회하는 기능. + * @param serviceType + * @return + * @throws Exception + */ + public List mainDashDronFlightList(String serviceType) throws Exception{ + + String cptAuth = token.getCptAuthCodeByToken(); + + List resultList = new ArrayList(); + + cptAuth = "KAC"; // 임시 테스트용으로 KAC 권한 부여 + + if(cptAuth != null) { + + resultList = fltPlanQueryRepository.getFlightDronList(cptAuth, serviceType); + + }else { + + log.error("cptAuth가 부여되지 않은 계정입니다"); + throw new Exception(); + } + + return resultList; + } + /** + * 드론 비행 현황기능. + * @return + * @throws Exception + */ public Map mainDashDronFlightStcs() throws Exception{ String cptAuth = ""; @@ -182,7 +196,7 @@ public class MainDashService { return resultList; } /** - * 김포공항, 비행승인 통계 + * 김포공항, 비행승인 통계 기능. * @param yyyymm * @return */ @@ -288,8 +302,11 @@ public class MainDashService { return result; } - - + /** + * 일일 비행계획에 관련된 내용 통계조회하는 기능. + * @param serviceType + * @return + */ public List currentFlightPlan(String serviceType){ // boolean authCheck = mainStatisticsService.authCheck(groupId); @@ -320,6 +337,7 @@ public class MainDashService { result.add(node); } + // 전날과 오늘 합계에 대한 감가율을 구함 for(int i = 0; i < result.size(); i++){ if(i == 0) continue;; @@ -341,9 +359,11 @@ public class MainDashService { return result; } - - - + /** + * 일일비정상상황에 대한 통계 기능을 조회하는 기능. + * @param serviceType + * @return + */ public List currentFlightWarn(String serviceType){ // boolean authCheck = mainStatisticsService.authCheck(groupId); @@ -361,7 +381,7 @@ public class MainDashService { for(String cate : dateCate){ List cntrlWarnLogs = ctrCntrlWarnLogQueryRepository.currentStcs(serviceType, cate); - int count = cntrlWarnLogs.size(); // + int count = cntrlWarnLogs.size(); // 총 갯수 int plan = (int)cntrlWarnLogs.stream().filter(value -> value.getWarnType().equals(WarnType.PLAN.getValue())).count(); int altitude = (int)cntrlWarnLogs.stream().filter(value -> value.getWarnType().equals(WarnType.ALTITUDE.getValue())).count(); @@ -377,6 +397,7 @@ public class MainDashService { result.add(node); } + // 전날과 오늘 합계에 대한 감가율을 구함 for(int i = 0; i < result.size(); i++){ if(i == 0) continue;; @@ -398,6 +419,10 @@ public class MainDashService { return result; } + /** + * 일일 비행건수 현황 통계기능. + * @return + */ public List dailyFlightNumOfStcs() { // SUPER 권한일 경우와 KAC의 기관코드일 경우 전체적으로 모니터링 가능해야한다. 그외는 자신의 기관에 해당하는 데이터 볼 수 있어야 한다. diff --git a/pav-server/src/main/java/com/palnet/biz/jpa/repository/ctr/CtrCntrlQueryRepository.java b/pav-server/src/main/java/com/palnet/biz/jpa/repository/ctr/CtrCntrlQueryRepository.java index ed4ef481..ba82f5f9 100644 --- a/pav-server/src/main/java/com/palnet/biz/jpa/repository/ctr/CtrCntrlQueryRepository.java +++ b/pav-server/src/main/java/com/palnet/biz/jpa/repository/ctr/CtrCntrlQueryRepository.java @@ -1858,10 +1858,12 @@ public class CtrCntrlQueryRepository{ return result; } - /*** - * 대시보드 통계(지역별) + /** + * Top5 지역별 비행횟수 통계하는 SQL 기능. + * @param yyyymm + * @param serviceType + * @return */ - public List mainDashStcsArea(String yyyymm, String serviceType){ QCtrCntrlBas bas = QCtrCntrlBas.ctrCntrlBas; @@ -1879,6 +1881,26 @@ public class CtrCntrlQueryRepository{ builder.and(formattedDate.eq(yyyymm)); if(!serviceType.isEmpty()) builder.and(fBas.serviceType.eq(serviceType)); + /** + * 일자[cntrlStDt] 조건, + * 각 항별[serviceType] 조건, + * 지역1[area1]이 비워져 있으면 안되는 조건으로 조회하는 SQL 입니다. + * + * SELECT + * CCHA.ARE1 AS 'typeCd', + * COUNT(CCHA.*) AS 'count' + * FROM CTR_CNTRL_BAS CCB + * LEFT OUTER JOIN CTR_CNTRL_HSTRY_AREA CCHA + * ON CCB.CNTRL_ID = CCHA.CNTRL_ID + * AND CCHA.ACTN_TYPE = '99' + * LEFT OUTER JOIN FLT_PLAN_CTR_CNTRL_REL FPCCR + * ON CCB.CNTRL_ID = FPCCR.CNTRL_ID + * LEFT OUTER JOIN FLT_PLAN_BAS FPB + * ON FPCCR.PLAN_SNO = FPB.PLAN_SNO + * WHERE CCHA.AREA1 IS NOT NULL + * AND DATE_FORMAT(CCB.CNTRL_ST_DT , '%Y-%m') = #{yyyymm} + * AND FPB.SERVICE_TYPE = #{serviceType} + */ List result = query.select(Projections.bean(MainDashStcsModel.class, area.area1.as("typeCd"), area.count().as("count") @@ -1899,10 +1921,12 @@ public class CtrCntrlQueryRepository{ } - /*** - * 대시보드 통계(일자별) + /** + * 대시보드 통계(일자별)하는 SQL 기능 + * @param yyyymm + * @param serviceType + * @return */ - public List mainDashStcsDay(String yyyymm, String serviceType){ QCtrCntrlBas bas = QCtrCntrlBas.ctrCntrlBas; QFltPlanBas fBas = QFltPlanBas.fltPlanBas; @@ -1926,6 +1950,23 @@ public class CtrCntrlQueryRepository{ builder.and(fBas.serviceType.eq(serviceType)); } + /** + * 일자[cntrlStDt] 조건, + * 각 항별 코드[serviceType]조건, + * 활성화코드[statusCd]가 '99' 조건인지 확인하여 조회하는 SQL 입니다. + * + * SELECT + * DATE_FORMAT(FPB.CREATE_DT , '%d') as 'typeCd', + * COUNT(*) as 'count' + * FROM CTR_CNTRL_BAS CCB + * LEFT OUTER JOIN FLT_PLAN_CTR_CNTRL_REL FPCCR + * ON CCB.CNTRL_ID = FPCCR.CNTRL_ID + * LEFT OUTER JOIN FLT_PLAN_BAS FPB + * ON FPCCR.PLAN_SNO = FPB.PLAN_SNO + * WHERE DATE_FORMAT(FPB.CREATE_DT , '%Y-%m') = #{yyyymm} + * AND CCB.STATUS_CD = '99' + * AND FPB.SERVICE_TYPE = #{serviceType} + */ List result = query.select(Projections.bean(MainDashStcsModel.class , formattedDate2.as("typeCd"), bas.count().as("count") @@ -2140,7 +2181,7 @@ public class CtrCntrlQueryRepository{ } /** - * 김포공항, 비행실적 통계 API + * 김포공항, 비행실적 통계조회하는 SQL 기능 입니다. * @param yyyymm * @return */ @@ -2166,6 +2207,20 @@ public class CtrCntrlQueryRepository{ if(date != null && date.length() > 0) builder.and(formattedDate.eq(date)); if(idntfNum != null) builder.and(bas.idntfNum.eq(idntfNum)); + /** + * 활성화 코드[statusCd]가 '99' 인지, + * 날짜[date]값 조건인지, + * 기체식별번호[idntfNum]값 조건인지 확인하여 데이터베이스에서 조회하는 SQL 입니다. + * + * SELECT + * DATE_FORMAT(CCB.CNTRL_ST_DT, #{format[1]}) AS 'typeCd' + * COUNT(CCB.*) AS 'count' + * FROM CTR_CNTRL_BAS CCB + * WHERE CCB.STATUS_CD = '99' + * AND CCB.IDNTF_NUM = #{idntfNum} + * AND DATE_FORMAT(CCB.CNTRL_ST_DT, #{format[1]}) = #{date} + * GROUP BY DATE_FORMAT(CCB.CNTRL_ST_DT, #{format[1]}) + */ List result = query .select( Projections.bean( @@ -2214,6 +2269,16 @@ public class CtrCntrlQueryRepository{ BooleanBuilder builder = new BooleanBuilder(); if(date != null && date.length() > 0) builder.and(formattedDate.eq(date)); + /** + * 날짜[date] 조건인지 확인하여 조회하는 SQL 입니다. + * + * SELECT + * DATE_FORMAT(CCWL.CREATE_DT, #{format[1]}) AS 'typeCd' + * COUNT(FPB.*) AS 'count' + * FROM CTR_CNTRL_WARN_LOG CCWL + * WHERE DATE_FORMAT(CCWL.CREATE_DT, #{format[1]}) = #{date} + * GROUP BY DATE_FORMAT(CCWL.CREATE_DT, #{format[1]}) + */ List result = query .select( Projections.bean( @@ -3060,7 +3125,13 @@ public class CtrCntrlQueryRepository{ return result; } - + /** + * 시작일, 끝일 조건으로 비행관련 통계데이터를 조회하는 SQL 기능. + * @param start + * @param end + * @param serviceType + * @return + */ public List completeFlight(Instant start, Instant end, String serviceType) { // Tuple 여러 값을 담을 수 있는 클래스, 여러 필드를 한꺼번에 반환해야 할 때 유용하다. QFltPlanCtrCntrlRel fpccr = QFltPlanCtrCntrlRel.fltPlanCtrCntrlRel; @@ -3076,6 +3147,32 @@ public class CtrCntrlQueryRepository{ builder.and(fpb.schFltEndDt.goe(start)); if (serviceType != null && !serviceType.isEmpty()) builder.and(fpb.serviceType.eq(serviceType)); + /** + * 승인여부[aprvlYn]가 'Y'인지, + * 비행계획서 일련번호[planSno]가 없는행이 아닌지, + * 상태코드[statusCd]가 '99' 인지, + * 시작일[schFltStDt]과 끝일[schFltEndDt] 사이인지, + * 각항별[serviceType] 조건인지 확인하여 조회하는 SQL 입니다. + * + * SELECT + * FPB.PLAN_SNO , + * FPB.APRVL_YN , + * FPB.APRVL_DT , + * CCB.CNTRL_ID , + * CCB.STATUS_CD , + * CCB.CNTRL_ST_DT , + * CCB.CNTRL_END_DT + * FROM FLT_PLAN_BAS FPB + * LEFT OUTER JOIN FLT_PLAN_CTR_CNTRL_REL FPCCR + * ON FPCCR.PLAN_SNO = FPB.PLAN_SNO + * LEFT OUTER JOIN CTR_CNTRL_BAS CCB + * ON FPCCR.CNTRL_ID = CCB.CNTRL_ID + * WHERE FPB.APRVL_YN = 'Y' + * AND FPCCR.PLAN_SNO IS NOT NULL + * AND CCB.STATUS_CD = '99' + * AND FPB.SCH_FLT_ST_DT < #{end} + * AND FPB.SCH_FLT_END_DT >= #{start} + */ return query .select( fpb.planSno, @@ -3095,6 +3192,13 @@ public class CtrCntrlQueryRepository{ } + /** + * 미 비행건수 조회하는 SQL 기능. + * @param start + * @param end + * @param serviceType + * @return + */ public List notFlight(Instant start, Instant end, String serviceType) { QCtrCntrlBas ccb = QCtrCntrlBas.ctrCntrlBas; @@ -3111,6 +3215,34 @@ public class CtrCntrlQueryRepository{ builder.and(fpb.schFltEndDt.goe(start)); if (serviceType != null && !serviceType.isEmpty()) builder.and(fpb.serviceType.eq(serviceType)); + /** + * 승인여부[aprvlYn]가 'Y'인지, + * 비행계획서 일련번호[planSno] 있는지, + * 상태값코드[statusCd]가 있는지, + * 관제ID[cntrlId]가 있는지, + * 시작일[schFltStDt]과 끝일[schFltEndDt] 사이인지, + * 각 항별[serviceType]코드 조건인지 확인하여 조회하는 SQL 입니다. + * + * SELECT + * FPB.PLAN_SNO , + * FPB.APRVL_YN , + * FPB.APRVL_DT , + * CCB.CNTRL_ID , + * FPCCR.CNTRL_ID , + * FPCCR.PLAN_SNO + * FROM FLT_PLAN_BAS FPB + * LEFT OUTER JOIN FLT_PLAN_CTR_CNTRL_REL FPCCR + * ON FPB.PLAN_SNO = FPCCR.PLAN_SNO + * LEFT OUTER JOIN CTR_CNTRL_BAS CCB + * ON CCB.CNTRL_ID = FPCCR.CNTRL_ID + * WHERE FPB.APRVL_YN = 'Y' + * AND FPCCR.PLAN_SNO IS NOT NULL + * AND CCB.STATUS_CD IS NOT NULL + * AND CCB.CNTRL_ID IS NOT NULL + * AND FPB.SCH_FLT_ST_DT < #{end} + * AND FPB.SCH_FLT_END_DT >= #{start} + * AND FPB.SERVICE_TYPE = #{serviceType} + */ return query .select( fpb.planSno, diff --git a/pav-server/src/main/java/com/palnet/biz/jpa/repository/ctr/CtrCntrlWarnLogQueryRepository.java b/pav-server/src/main/java/com/palnet/biz/jpa/repository/ctr/CtrCntrlWarnLogQueryRepository.java index 35aa2d83..8e4468eb 100644 --- a/pav-server/src/main/java/com/palnet/biz/jpa/repository/ctr/CtrCntrlWarnLogQueryRepository.java +++ b/pav-server/src/main/java/com/palnet/biz/jpa/repository/ctr/CtrCntrlWarnLogQueryRepository.java @@ -284,6 +284,12 @@ public class CtrCntrlWarnLogQueryRepository { return result; } + /** + * 카테고리[cate]별 일일비정상황황에 대한 통계값을 구하는 SQL 기능. + * @param groupId + * @param cate + * @return + */ public List currentStcs(String groupId, String cate){ QFltPlanBas qFltPlanBas = QFltPlanBas.fltPlanBas; QFltPlanCtrCntrlRel qFltPlanCtrCntrlRel = QFltPlanCtrCntrlRel.fltPlanCtrCntrlRel; @@ -291,6 +297,20 @@ public class CtrCntrlWarnLogQueryRepository { BooleanBuilder builder = getCurrentBooleanBuilder(groupId, cate, qFltPlanBas, qCtrCntrlWarnLog); + /** + * 각 항별[serviceType] 조건인지, + * 날짜별[2일전, 1일전, 금일, 명일] 조건인지 확인하여 조회하는 SQL 입니다. + * + * SELECT + * CCWL.WARN_TYPE + * FROM CTR_CNTRL_WARN_LOG CCWL + * LEFT OUTER JOIN FLT_PLAN_CTR_CNTRL_REL FPCCR + * ON CCWL.CNTRL_ID = CCWL.CNTRL_ID + * LEFT OUTER JOIN FLT_PLAN_BAS FPB + * ON FPCCR.PLAN_SNO = FPB.PLAN_SNO + * WHERE FPB.SERVICE_TYPE = #{serviceType} + * AND DATE_FORMAT(CCWL.CREATE_DT, #{dateFormat}) = #{cate} + */ List stcsValues = query .select( Projections.bean( @@ -310,6 +330,15 @@ public class CtrCntrlWarnLogQueryRepository { return stcsValues; } + /** + * 2일전[beforeYesterday], 1일전[yesterday], 금일[today], 명일[tomorrow] + * 에 맞춰 WHERE절 연산값이 달라짐. + * @param serviceType + * @param cate + * @param qFltPlanBas + * @param qCtrCntrlWarnLog + * @return + */ private BooleanBuilder getCurrentBooleanBuilder(String serviceType, String cate, QFltPlanBas qFltPlanBas, QCtrCntrlWarnLog qCtrCntrlWarnLog){ BooleanBuilder builder = new BooleanBuilder(); diff --git a/pav-server/src/main/java/com/palnet/biz/jpa/repository/flt/FltPlanQueryRepository.java b/pav-server/src/main/java/com/palnet/biz/jpa/repository/flt/FltPlanQueryRepository.java index a4a7a741..da58100d 100644 --- a/pav-server/src/main/java/com/palnet/biz/jpa/repository/flt/FltPlanQueryRepository.java +++ b/pav-server/src/main/java/com/palnet/biz/jpa/repository/flt/FltPlanQueryRepository.java @@ -949,8 +949,7 @@ public class FltPlanQueryRepository { } /** - * 김포공항, 비행승인 통계 API - * + * 김포공항, 비행승인 통계구하는 SQL 기능. * @param date * @return */ @@ -972,6 +971,18 @@ public class FltPlanQueryRepository { builder.and(bas.aprvlYn.eq("Y")); if (date != null && date.length() > 0) builder.and(formattedDate.eq(date)); + /** + * 날짜[date] 조건 , + * 승인여부[aprvlYn] 조건으로 조회하는 SQL 입니다. + * + * SELECT + * DATE_FORMAT(FPB.APRVL_DT, #{format[1]}) AS 'typeCd' + * COUNT(FPB.*) AS 'count' + * FROM FLT_PLAN_BAS FPB + * WHERE FPB.APRVL_YN = 'Y' + * AND DATE_FORMAT(FPB.APRVL_DT, #{format[1]}) = #{date} + * GROUP BY DATE_FORMAT(FPB.APRVL_DT, #{format[1]}) + */ List result = query .select( Projections.bean( @@ -2120,6 +2131,17 @@ public class FltPlanQueryRepository { BooleanBuilder builder = getCurrentBooleanBuilder(serviceType, cate, qFltPlanBas); + /** + * 각 항별[serviceType] 조건인지, + * 날짜별[2일전, 1일전, 금일, 명일] 조건인지 확인하여 조회하는 SQL 입니다. + * + * SELECT + * FPB.PLAN_SNO , + * FPB.APRVL_YN + * FROM FLT_PLAN_BAS FPB + * WHERE FPB.SERVICE_TYPE = #{serviceType} + * AND DATE_FORMAT(CCWL.CREATE_DT, #{dateFormat}) = #{cate} + */ List stcsValues = query .select( Projections.bean( @@ -2135,6 +2157,14 @@ public class FltPlanQueryRepository { return stcsValues; } + /** + * 2일전[beforeYesterday], 1일전[yesterday], 금일[today], 명일[tomorrow] + * 에 맞춰 WHERE절 연산값이 달라짐. + * @param serviceType + * @param cate + * @param qFltPlanBas + * @return + */ private BooleanBuilder getCurrentBooleanBuilder(String serviceType, String cate, QFltPlanBas qFltPlanBas){ BooleanBuilder builder = new BooleanBuilder(); @@ -2178,8 +2208,12 @@ public class FltPlanQueryRepository { return builder; } - - + /** + * 드론 별 비행운항 목록 조회하는 SQL 기능. + * @param cptAuth + * @param serviceType + * @return + */ public List getFlightDronList(String cptAuth, String serviceType){ QComIdntfBas cib = QComIdntfBas.comIdntfBas; @@ -2215,7 +2249,46 @@ public class FltPlanQueryRepository { .or(fpb.createDt.between(startOfToday, startOfTomorrow)) ) .and(fpb.planSno.isNotNull()); - + + /** + * 각 항별[serviceType] 조건인지, + * 비행계획서 고유번호[planSno]가 비워져 있지는 않은지, + * 관제 생성시간[createDt]이 startOfToday와 startOfTomorrow 사이에 있는지, + * 비행계획서 생성시간이 startOfToday와 startOfTomorrow 사이에 있는지 + * 확인하여 데이터베이스에서 조회하는 SQL 입니다. + * + * SELECT + * PGB.GROUP_NM , + * FPB.MEMBER_NAME , + * FPA.IDNTF_NUM , + * CCB.CNTRL_ST_DT , + * CCB.CNTRL_END_DT , + * CONCAT(SEC_TO_TIME(TIME_TO_SEC(TIMEDIFF(CCB.CNTRL_END_DT ,CCB.CNTRL_ST_DT)))) AS 'totalFlightTime', + * CASE + * WHEN CCB.STATUS_CD = '01' THEN '비행 중' + * WHEN CCB.STATUS_CD = '99' THEN '비행 완료' + * WHEN FPB.PLAN_SNO IS NOT NULL THEN '비행 대기 중' + * ELSE '비행 없음' + * END AS 'status' + * FROM FLT_PLAN_ARCRFT FPA + * LEFT OUTER JOIN FLT_PLAN_BAS FPB + * ON FPA.PLAN_SNO = FPB.PLAN_SNO + * LEFT OUTER JOIN PTY_GROUP_BAS PGB + * ON FPB.GROUP_ID = PGB.GROUP_ID + * LEFT OUTER JOIN COM_IDNTF_BAS CIB + * ON FPA.IDNTF_NUM = CIB.IDNTF_NUM + * LEFT OUTER JOIN FLT_PLAN_CTR_CNTRL_REL FPCCR + * ON FPB.PLAN_SNO = FPCCR.PLAN_SNO + * LEFT OUTER JOIN CTR_CNTRL_BAS CCB + * ON FPCCR.CNTRL_ID = CCB.CNTRL_ID + * WHERE FPB.SERVICE_TYPE = #{serviceType} + * AND PGB.GROUP_NM = #{cptAuth} + * AND FPB.PLAN_SNO IS NOT NULL + * AND ( + * (CCB.CREATE_DT BETWEEN #{startOfToday}, #{startOfTomorrow}) + * OR (FPB.CREATE_DT BETWEEN #{startOfToday}, #{startOfTomorrow}) + * ) + */ List result = query .select(Projections.bean(MainDashFlightListModel.class, pgb.groupNm, @@ -2247,6 +2320,11 @@ public class FltPlanQueryRepository { return result; } + /** + * 드론 비행 현황을 조회하는 SQL 기능. + * @param cptAuth + * @return + */ public Map getFlightDronStcs(String cptAuth){ QComIdntfBas cib = QComIdntfBas.comIdntfBas; @@ -2274,6 +2352,38 @@ public class FltPlanQueryRepository { ) .and(fpb.planSno.isNotNull()); + /** + * 각 항별[serviceType] 조건인지, + * 비행계획서 고유번호[planSno]가 비워져 있지는 않은지, + * 관제 생성시간[createDt]이 startOfToday와 startOfTomorrow 사이에 있는지, + * 비행계획서 생성시간이 startOfToday와 startOfTomorrow 사이에 있는지 + * 확인하여 데이터베이스에서 조회하는 SQL 입니다. + * + * SELECT + * CASE + * WHEN CCB.STATUS_CD = '01' THEN 'inFlight' + * WHEN CCB.STATUS_CD = '99' THEN 'flightComplete' + * WHEN FPB.PLAN_SNO IS NOT NULL THEN 'flightWaiting' + * ELSE '비행 없음' + * END AS 'status', + * COUNT(FPB.*) AS 'count' + * FROM FLT_PLAN_ARCRFT FPA + * LEFT OUTER JOIN FLT_PLAN_BAS FPB + * ON FPB.PLAN_SNO = FPA.PLAN_SNO + * LEFT OUTER JOIN COM_IDNTF_BAS CIB + * ON CIB.IDNTF_NUM = FPA.IDNTF_NUM + * LEFT OUTER JOIN FLT_PLAN_CTR_CNTRL_REL FPCCR + * ON FPCCR.PLAN_SNO = FPB.PLAN_SNO + * LEFT OUTER JOIN CTR_CNTRL_BAS CCB + * ON FPCCR.CNTRL_ID = CCB.CNTRL_ID + * WHERE FPB.SERVICE_TYPE = #{serviceType} + * AND FPB.PLAN_SNO IS NOT NULL + * AND ( + * (CCB.CREATE_DT BETWEEN #{startOfToday}, #{startOfTomorrow}) + * OR (FPB.CREATE_DT BETWEEN #{startOfToday}, #{startOfTomorrow}) + * ) + * GROUP BY CCB.STATUS_CD + */ List res = query .select( new CaseBuilder() diff --git a/pav-server/src/main/java/com/palnet/biz/jpa/repository/pty/PtyDronQueryRepository.java b/pav-server/src/main/java/com/palnet/biz/jpa/repository/pty/PtyDronQueryRepository.java index de494b49..20d0403d 100644 --- a/pav-server/src/main/java/com/palnet/biz/jpa/repository/pty/PtyDronQueryRepository.java +++ b/pav-server/src/main/java/com/palnet/biz/jpa/repository/pty/PtyDronQueryRepository.java @@ -400,14 +400,38 @@ public class PtyDronQueryRepository{ } - /*** - * 메인 대시보드 기체 정보 3건 표출 - */ + /** + * 최근 등록한 기체 정보 3건 조회하는 SQL 기능. + * @param cstmrSno + * @return + */ public List dronTop3(int cstmrSno){ QComArcrftBas bas = QComArcrftBas.comArcrftBas; QPtyGroupBas gBas = QPtyGroupBas.ptyGroupBas; QPtyCstmrGroup group = QPtyCstmrGroup.ptyCstmrGroup; - + + /** + * 사용여부[useYn]가 'Y'인지, + * 회원고유번호[cstmrSno] 조건인지 확인하여 조회하는 SQL 입니다. + * + * SELECT + * CAB.ARCRFT_MODEL_NM , + * CAB.PRDCT_NUM , + * CAB.CREATE_DT , + * PGB.GROUP_NM + * FROM PTY_CSTMR_GROUP PCG + * LEFT OUTER JOIN COM_ARCRFT_BAS CAB + * ON PCG.GROUP_ID = CAB.GROUP_ID + * AND PCG.JOIN_YN = 'Y' + * AND PCG.APRVL_YN = 'Y' + * AND CAB.USE_YN = 'Y' + * LEFT OUTER JOIN PTY_GROUP_BAS PGB + * ON PCG.GROUP_ID = PGB.GROUP_ID + * WHERE CAB.USE_YN = 'Y' + * AND PCG.CSTMR_SNO = #{cstmrSno} + * ORDER BY CAB.CREATE_DT DESC + * LIMIT 3 + */ List result = query.select(Projections.bean(MainDashListModel.class , bas.arcrftModelNm, diff --git a/pav-server/src/main/java/com/palnet/biz/jpa/repository/pty/PtyGroupQueryRepository.java b/pav-server/src/main/java/com/palnet/biz/jpa/repository/pty/PtyGroupQueryRepository.java index 07a5c721..d7b7d5ff 100644 --- a/pav-server/src/main/java/com/palnet/biz/jpa/repository/pty/PtyGroupQueryRepository.java +++ b/pav-server/src/main/java/com/palnet/biz/jpa/repository/pty/PtyGroupQueryRepository.java @@ -788,6 +788,12 @@ public class PtyGroupQueryRepository{ } return cnt; } + + /** + * 최근 가입된 순으로 3개 그룹 조회하는 SQL 기능. + * @param cstmrSno + * @return + */ public List groupTop3(int cstmrSno){ QPtyGroupBas bas = QPtyGroupBas.ptyGroupBas; @@ -797,7 +803,24 @@ public class PtyGroupQueryRepository{ builder.and(bas.useYn.eq("Y")); builder.and(dtl.cstmrSno.eq(cstmrSno)); builder.and(dtl.groupAuthCd.eq("MASTER")); - + + /** + * 사용여부[useYn]가 'Y' 인지, + * 회원고유번호[cstmrSno] 조건인지, + * 그룹권한코드[groupAuthCd]가 'MASTER' 인지 조회하는 SQL 입니다. + * + * SELECT + * PGB.GROUP_ID , + * PGB.GROUP_NM , + * PGB.GROUP_TYPE_CD , + * PGB.CREATE_DT + * FROM PTY_GROUP_BAS PGB + * LEFT OUTER JOIN PTY_CSTMR_GROUP PCG + * ON PGB.GROUP_ID = PCG.GROUP_ID + * WHERE PGB.USE_YN = 'Y' + * AND PCG.CSTMR_SNO = #{cstmrSno} + * AND PCG.GROUP_AUTH_CD = 'MASTER' + */ List result = query.select(Projections.bean(BasGroupModel.class , bas.groupId, From 9b7f837cf5092c01049ff39d3e4eb39f2a26aeaa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?lkd9125=28=EC=9D=B4=EA=B2=BD=EB=8F=84=29?= Date: Tue, 12 Dec 2023 15:52:10 +0900 Subject: [PATCH 26/32] =?UTF-8?q?main/statistics=20=ED=8C=A8=ED=82=A4?= =?UTF-8?q?=EC=A7=80=20=EC=A3=BC=EC=84=9D=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/MainStatisticsController.java | 91 ++++- .../service/MainStatisticsService.java | 8 +- .../ctr/CtrCntrlQueryRepository.java | 204 +++++++++- .../ctr/CtrCntrlWarnLogQueryRepository.java | 148 ++++++- .../flt/FltPlanQueryRepository.java | 371 +++++++++++++++++- 5 files changed, 807 insertions(+), 15 deletions(-) diff --git a/pav-server/src/main/java/com/palnet/biz/api/main/statistics/controller/MainStatisticsController.java b/pav-server/src/main/java/com/palnet/biz/api/main/statistics/controller/MainStatisticsController.java index 89ef0912..9e09c1f1 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/main/statistics/controller/MainStatisticsController.java +++ b/pav-server/src/main/java/com/palnet/biz/api/main/statistics/controller/MainStatisticsController.java @@ -34,6 +34,11 @@ public class MainStatisticsController { private final MainStatisticsService service; + /** + * 비행통계 상단데이터 통계 조회기능. + * @param serviceType + * @return + */ @GetMapping("/flight-static") @ApiOperation(value = "비행통계 상단 데이터[DB전체 통계데이터]") @Tag(name = "통계 컨트롤러", description = "통계 관련 API") @@ -42,8 +47,15 @@ public class MainStatisticsController { List result = null; try { - result = service.getFlightStaticStcs(serviceType); + result = service.getFlightStaticStcs(serviceType); // 비행관련 고정 통계, 항상 DB 전체값에서 통계조회 하는기능. } catch (Exception e) { + /** + * try{ + ... + } + * try 영역 안 코드들중 문제가 생기면 오는 곳. + * log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌 + */ log.error("IGNORE : {}", e); return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) .body(new ErrorResponse("Server Error", "-1")); @@ -52,6 +64,12 @@ public class MainStatisticsController { return ResponseEntity.ok().body(new SuccessResponse>(result)); } + /** + * 날짜별, 타입별 비행통계 조회 기능. + * @param rq + * @param type + * @return + */ @GetMapping("/flight/{type}") @ApiOperation(value = "비행통계 cate = ['TIME', 'DISTANCE','FLT_COUNT'], type=['year','month','day','one-day']") @Tag(name = "통계 컨트롤러", description = "통계 관련 API") @@ -62,22 +80,27 @@ public class MainStatisticsController { }) public ResponseEntity fltStcs(FlightStcsRQ rq, @PathVariable String type){ - log.warn("type => {}", type); - FlightStcsModel result = new FlightStcsModel(); try { String[] formatParam = null; if(rq.getDate() == null) rq.setDate(""); - formatParam = service.paramCheck(rq.getDate(),type); + formatParam = service.paramCheck(rq.getDate(),type); // 파라미터 체크 - List graphData = service.fltStatics(rq, formatParam); - List topData = service.fltTopStatics(rq, formatParam); + List graphData = service.fltStatics(rq, formatParam); // 비행통계 기능 + List topData = service.fltTopStatics(rq, formatParam); // 비행통계 카테고리 별 Top 5 데이터 조회하기 기능 result.setGraphData(graphData); result.setTopData(topData); } catch (Exception e) { + /** + * try{ + ... + } + * try 영역 안 코드들중 문제가 생기면 오는 곳. + * log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌 + */ log.error("IGNORE : {}", e); return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) .body(new ErrorResponse("Server Error", "-1")); @@ -86,8 +109,11 @@ public class MainStatisticsController { return ResponseEntity.ok().body(new SuccessResponse(result)); } - - + /** + * 비정상 상황 상단 데이터 조회기능. + * @param serviceType + * @return + */ @GetMapping("/warn-static") @ApiOperation(value = "비정상 상황 상단 데이터[DB전체 통계데이터]") @Tag(name = "통계 컨트롤러", description = "통계 관련 API") @@ -98,6 +124,13 @@ public class MainStatisticsController { try { result = service.getWarnStaticStcs(serviceType); } catch (Exception e) { + /** + * try{ + ... + } + * try 영역 안 코드들중 문제가 생기면 오는 곳. + * log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌 + */ log.error("IGNORE : {}", e); return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) .body(new ErrorResponse("Server Error", "-1")); @@ -105,7 +138,13 @@ public class MainStatisticsController { return ResponseEntity.ok().body(new SuccessResponse>(result)); } - + + /** + * 날짜별, 카테고리별 비정상 상황에 대한 통계 조회 기능 + * @param rq + * @param type + * @return + */ @GetMapping("/warn/{type}") @ApiOperation(value = "비정상상황 cate = ['PLAN' ,'ALTITUDE', 'CRASH'], type=['year','month','day','one-day']") @Tag(name = "통계 컨트롤러", description = "통계 관련 API") @@ -130,6 +169,13 @@ public class MainStatisticsController { result.setGraphData(graphData); result.setTopData(topData); } catch (Exception e) { + /** + * try{ + ... + } + * try 영역 안 코드들중 문제가 생기면 오는 곳. + * log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌 + */ log.error("IGNORE : {}", e); return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) .body(new ErrorResponse("Server Error", "-1")); @@ -138,6 +184,11 @@ public class MainStatisticsController { return ResponseEntity.ok().body(new SuccessResponse(result)); } + /** + * 비행실적 상단데이터 통계 기능. + * @param serviceType + * @return + */ @GetMapping("/flight/result-static") @ApiOperation(value = "비행실적 상단데이터 통계 [DB전체 통계데이터]") @Tag(name = "통계 컨트롤러", description = "통계 관련 API") @@ -148,6 +199,13 @@ public class MainStatisticsController { try { result = service.getFltResultStaticStcs(serviceType); } catch (Exception e) { + /** + * try{ + ... + } + * try 영역 안 코드들중 문제가 생기면 오는 곳. + * log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌 + */ log.error("IGNORE : {}", e); return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) .body(new ErrorResponse("Server Error", "-1")); @@ -156,8 +214,14 @@ public class MainStatisticsController { return ResponseEntity.ok().body(new SuccessResponse>(result)); } + /** + * 날짜별, 카테고리별 비행실적 통계 + * @param rq + * @param type + * @return + */ @GetMapping("/flight/result/{type}") - @ApiOperation(value = "비정상상황 cate = ['FLT_RESULT' ,'FLT_PLAN', 'FLT_PLAN_APRVN'], type=['year','month','day','one-day']") + @ApiOperation(value = "비행실적 cate = ['FLT_RESULT' ,'FLT_PLAN', 'FLT_PLAN_APRVN'], type=['year','month','day','one-day']") @Tag(name = "통계 컨트롤러", description = "통계 관련 API") @ApiImplicitParams({ @ApiImplicitParam(name = "date",value = "날짜[2023]", dataTypeClass = String.class), @@ -180,6 +244,13 @@ public class MainStatisticsController { result.setGraphData(graphData); result.setTopData(topData); } catch (Exception e) { + /** + * try{ + ... + } + * try 영역 안 코드들중 문제가 생기면 오는 곳. + * log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌 + */ log.error("IGNORE : {}", e); return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) .body(new ErrorResponse("Server Error", "-1")); diff --git a/pav-server/src/main/java/com/palnet/biz/api/main/statistics/service/MainStatisticsService.java b/pav-server/src/main/java/com/palnet/biz/api/main/statistics/service/MainStatisticsService.java index 2b10c43c..1271e181 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/main/statistics/service/MainStatisticsService.java +++ b/pav-server/src/main/java/com/palnet/biz/api/main/statistics/service/MainStatisticsService.java @@ -140,7 +140,7 @@ public class MainStatisticsService { /** - * 비행관련 고정 통계, 항상 DB 전체값에서 통계진행할것임 + * 비행관련 고정 통계, 항상 DB 전체값에서 통계조회 하는기능. * @return */ public List getFlightStaticStcs(String serviceType){ @@ -426,6 +426,12 @@ public class MainStatisticsService { return resultList; } + /** + * 비행실적 TOP 5 기체정보 조회하는 기능. + * @param rq + * @param formatParam + * @return + */ public List getFltTopResultStcs(FlightStcsRQ rq, String[] formatParam){ List resultList = null; diff --git a/pav-server/src/main/java/com/palnet/biz/jpa/repository/ctr/CtrCntrlQueryRepository.java b/pav-server/src/main/java/com/palnet/biz/jpa/repository/ctr/CtrCntrlQueryRepository.java index ba82f5f9..b14b0a65 100644 --- a/pav-server/src/main/java/com/palnet/biz/jpa/repository/ctr/CtrCntrlQueryRepository.java +++ b/pav-server/src/main/java/com/palnet/biz/jpa/repository/ctr/CtrCntrlQueryRepository.java @@ -2370,6 +2370,23 @@ public class CtrCntrlQueryRepository{ if(serviceType != null && !(serviceType.equals(""))) builder.and(qFltPlanBas.serviceType.eq(serviceType)); if(authCheck) builder.and(qFltPlanBas.cstmrSno.eq(jwtTokenUtil.getCstmrSnoByToken())); + /** + * 각 항별[serviceType] 조건인지, + * 권한에 따른 회원통계값[cstmrSno] 조건인지 확인하여 조회하는 SQL 입니다. + * + * SELECT + * CCB.IDNTF_NUM AS 'name' + * FROM CTR_CNTRL_BAS CCB + * LEFT OUTER JOIN FLT_PLAN_CTR_CNTRL_REL FPCCR + * ON FPCCR.CNTRL_ID = CCB.CNTRL_ID + * LEFT OUTER JOIN FLT_PLAN_BAS FPB + * ON FPCCR.PLAN_SNO = FPB.PLAN_SNO + * WHERE FPB.SERVICE_TYPE = #{servicType} + * AND FPB.CSTMR_SNO = #{cstmrSno} -- 권한이 유저인경우 + * GROUP BY CCB.IDNTF_NUM + * ORDER BY SEC_TO_TIME(SUM(TIME_TO_SEC(TIMEDIFF(CCB.CNTRL_END_DT , CCB.CNTRL_ST_DT)))) DESC + * LIMIT 1 + */ List queryResult = query .select( Projections.bean(FlightStcsValueModel.class, @@ -2423,6 +2440,13 @@ public class CtrCntrlQueryRepository{ return result; } + /** + * 가장 많은 비행시간을 가진 기체, 비행시간 SELECT[일알] + * @param idntfNum + * @param authCheck + * @param serviceType + * @return + */ private String getFltTimeDay(String idntfNum, boolean authCheck, String serviceType){ QCtrCntrlBas qCtrCntrlBas = QCtrCntrlBas.ctrCntrlBas; QFltPlanCtrCntrlRel qFltPlanCtrCntrlRel = QFltPlanCtrCntrlRel.fltPlanCtrCntrlRel; @@ -2437,6 +2461,23 @@ public class CtrCntrlQueryRepository{ builder.and(Expressions.stringTemplate("DATE_FORMAT({0}, {1})", qCtrCntrlBas.createDt, dateFormat) .eq(LocalDate.now().toString())); + /** + * 각 항별[serviceType] 조건인지, + * 권한에 따른 회원통계값[cstmrSno] 조건인지, + * 기체식별번호[idntfNum] 조건인지, + * 생성일시[createDt]값이 오늘인지 조건인지 확인하여 조회하는 SQL 입니다. + * + * SELECT + * CONCAT(SEC_TO_TIME(SUM(TIME_TO_SEC(TIMEDIFF(CCB.CNTRL_END_DT , CCB.CNTRL_ST_DT))))) + * FROM CTR_CNTRL_BAS CCB + * LEFT OUTER JOIN FLT_PLAN_CTR_CNTRL_REL FPCCR + * ON FPCCR.CNTRL_ID = CCB.CNTRL_ID + * LEFT OUTER JOIN FLT_PLAN_BAS FPB + * ON FPCCR.PLAN_SNO = FPB.PLAN_SNO + * WHERE FPB.SERVICE_TYPE = #{serviceType} + * AND FPB.CSTMR_SNO = #{cstmrSno} -- 권한이 유저인경우 + * AND DATE_FORMAT(CCB.CREATE_DT, #{dateForamt}) = ㅜㅒㅈ + */ return String.valueOf(query .select( Expressions.stringTemplate( @@ -2454,11 +2495,19 @@ public class CtrCntrlQueryRepository{ .fetchOne()); } + /** + * 가장 많은 비행시간을 가진 기체, 비행시간 SELECT[월] + * @param idntfNum + * @param authCheck + * @param serviceType + * @return + */ private String getFltTimeMonth(String idntfNum, boolean authCheck, String serviceType){ QCtrCntrlBas qCtrCntrlBas = QCtrCntrlBas.ctrCntrlBas; QFltPlanCtrCntrlRel qFltPlanCtrCntrlRel = QFltPlanCtrCntrlRel.fltPlanCtrCntrlRel; QFltPlanBas qFltPlanBas = QFltPlanBas.fltPlanBas; + BooleanBuilder builder = new BooleanBuilder(); builder.and(qCtrCntrlBas.idntfNum.eq(idntfNum)); builder.and(qCtrCntrlBas.createDt.goe(LocalDate.now().minusMonths(1).atStartOfDay().atZone(ZoneId.of("Asia/Seoul")).toInstant())); @@ -2466,6 +2515,24 @@ public class CtrCntrlQueryRepository{ if(serviceType != null && !(serviceType.equals(""))) builder.and(qFltPlanBas.serviceType.eq(serviceType)); if(authCheck) builder.and(qFltPlanBas.cstmrSno.eq(jwtTokenUtil.getCstmrSnoByToken())); + /** + * 각 항별[serviceType] 조건인지, + * 권한에 따른 회원통계값[cstmrSno] 조건인지, + * 기체식별번호[idntfNum] 조건인지, + * 생성일시[createDt]값이 오늘인지 조건인지 확인하여 조회하는 SQL 입니다. + * + * SELECT + * CONCAT(SEC_TO_TIME(SUM(TIME_TO_SEC(TIMEDIFF(CCB.CNTRL_END_DT , CCB.CNTRL_ST_DT))))) + * FROM CTR_CNTRL_BAS CCB + * LEFT OUTER JOIN FLT_PLAN_CTR_CNTRL_REL FPCCR + * ON FPCCR.CNTRL_ID = CCB.CNTRL_ID + * LEFT OUTER JOIN FLT_PLAN_BAS FPB + * ON FPCCR.PLAN_SNO = FPB.PLAN_SNO + * WHERE FPB.SERVICE_TYPE = #{serviceType} + * AND FPB.CSTMR_SNO = #{cstmrSno} -- 권한이 유저인경우 + * AND CCB.CREATE_DT >= '한달전 오늘' + * AND CCB.CREATE_DT <= '오늘' + */ return String.valueOf(query .select( Expressions.stringTemplate( @@ -2483,6 +2550,13 @@ public class CtrCntrlQueryRepository{ .fetchOne()); } + /** + * 가장 많은 비행시간을 가진 기체, 비행시간 SELECT[년] + * @param idntfNum + * @param authCheck + * @param serviceType + * @return + */ private String getFltTimeYear(String idntfNum, boolean authCheck, String serviceType){ QCtrCntrlBas qCtrCntrlBas = QCtrCntrlBas.ctrCntrlBas; QFltPlanCtrCntrlRel qFltPlanCtrCntrlRel = QFltPlanCtrCntrlRel.fltPlanCtrCntrlRel; @@ -2495,6 +2569,24 @@ public class CtrCntrlQueryRepository{ if(serviceType != null && !(serviceType.equals(""))) builder.and(qFltPlanBas.serviceType.eq(serviceType)); if(authCheck) builder.and(qFltPlanBas.cstmrSno.eq(jwtTokenUtil.getCstmrSnoByToken())); + /** + * 각 항별[serviceType] 조건인지, + * 권한에 따른 회원통계값[cstmrSno] 조건인지, + * 기체식별번호[idntfNum] 조건인지, + * 생성일시[createDt]값이 오늘인지 조건인지 확인하여 조회하는 SQL 입니다. + * + * SELECT + * CONCAT(SEC_TO_TIME(SUM(TIME_TO_SEC(TIMEDIFF(CCB.CNTRL_END_DT , CCB.CNTRL_ST_DT))))) + * FROM CTR_CNTRL_BAS CCB + * LEFT OUTER JOIN FLT_PLAN_CTR_CNTRL_REL FPCCR + * ON FPCCR.CNTRL_ID = CCB.CNTRL_ID + * LEFT OUTER JOIN FLT_PLAN_BAS FPB + * ON FPCCR.PLAN_SNO = FPB.PLAN_SNO + * WHERE FPB.SERVICE_TYPE = #{serviceType} + * AND FPB.CSTMR_SNO = #{cstmrSno} -- 권한이 유저인경우 + * AND CCB.CREATE_DT >= '일년전 오늘' + * AND CCB.CREATE_DT <= '오늘' + */ return String.valueOf(query .select( Expressions.stringTemplate( @@ -2815,6 +2907,24 @@ public class CtrCntrlQueryRepository{ if(serviceType != null && !(serviceType.equals(""))) builder.and(qFltPlanBas.serviceType.eq(serviceType)); if(authCheck) builder.and(qFltPlanBas.cstmrSno.eq(jwtTokenUtil.getCstmrSnoByToken())); + /** + * 관제생성일시[createDt] 조건, + * 각항별 타입[serviceType] 조건, + * 회원고유번호[cstmrSno]조건과 맞는지 확인하여 조회하는 SQL 입니다. + * + * SELECT + * DATE_FORMAT(CCB.CREATE_DT, #{formatParam[1}}) AS 'name', + * CONCAT(SEC_TO_TIME(SUM(TIME_TO_SEC(TIMEDIFF(CCB.CNTRL_END_DT, CCB.CNTRL_ST_DT))))) AS 'value' + * FROM CTR_CNTRL_BAS CCB + * LEFT OUTER JOIN FLT_PLAN_CTR_CNTRL_REL FPCCR + * ON CCB.CNTRL_ID = FPCCR.CNTRL_ID + * LEFT OUTER JOIN FLT_PLAN_BAS FPB + * ON FPCCR.PLAN_SNO = FPB.PLAN_SNO + * WHERE FPB.SERVICE_TYPE = #{serviceType} + * AND DATE_FORMAT(CCB.CREATE_DT, #{formatParam[0}) = #{date} + * AND FPB.CSTMR_SNO = #{cstmrSno} -- 권한이 유저인경우 + * GROUP BY DATE_FORMAT(CCB.CREATE_DT, #{formatParam[1}}) + */ List result = query .select( Projections.bean( @@ -2875,6 +2985,24 @@ public class CtrCntrlQueryRepository{ if(serviceType != null && !(serviceType.equals(""))) builder.and(qFltPlanBas.serviceType.eq(serviceType)); if(authCheck) builder.and(qFltPlanBas.cstmrSno.eq(jwtTokenUtil.getCstmrSnoByToken())); + /** + * 관제생성일시[createDt] 조건, + * 각항별 타입[serviceType] 조건, + * 회원고유번호[cstmrSno]조건과 맞는지 확인하여 조회하는 SQL 입니다. + * + * SELECT + * DATE_FORMAT(CCB.CREATE_DT, #{formatParam[1}}) AS 'name', + * SUM(CCB.TTL_DSTNC) AS 'value' + * FROM CTR_CNTRL_BAS CCB + * LEFT OUTER JOIN FLT_PLAN_CTR_CNTRL_REL FPCCR + * ON CCB.CNTRL_ID = FPCCR.CNTRL_ID + * LEFT OUTER JOIN FLT_PLAN_BAS FPB + * ON FPCCR.PLAN_SNO = FPB.PLAN_SNO + * WHERE FPB.SERVICE_TYPE = #{serviceType} + * AND DATE_FORMAT(CCB.CREATE_DT, #{formatParam[0}) = #{date} + * AND FPB.CSTMR_SNO = #{cstmrSno} -- 권한이 유저인경우 + * GROUP BY DATE_FORMAT(CCB.CREATE_DT, #{formatParam[1}}) + */ List result = query .select( Projections.bean( @@ -2931,6 +3059,24 @@ public class CtrCntrlQueryRepository{ if(serviceType != null && !(serviceType.equals(""))) builder.and(qFltPlanBas.serviceType.eq(serviceType)); if(authCheck) builder.and(qFltPlanBas.cstmrSno.eq(jwtTokenUtil.getCstmrSnoByToken())); + /** + * 관제생성일시[createDt] 조건, + * 각항별 타입[serviceType] 조건, + * 회원고유번호[cstmrSno]조건과 맞는지 확인하여 조회하는 SQL 입니다. + * + * SELECT + * DATE_FORMAT(CCB.CREATE_DT, #{formatParam[1}}) AS 'name', + * COUNT(CCB.CNTRL_ID) AS 'value' + * FROM CTR_CNTRL_BAS CCB + * LEFT OUTER JOIN FLT_PLAN_CTR_CNTRL_REL FPCCR + * ON CCB.CNTRL_ID = FPCCR.CNTRL_ID + * LEFT OUTER JOIN FLT_PLAN_BAS FPB + * ON FPCCR.PLAN_SNO = FPB.PLAN_SNO + * WHERE FPB.SERVICE_TYPE = #{serviceType} + * AND DATE_FORMAT(CCB.CREATE_DT, #{formatParam[0}) = #{date} + * AND FPB.CSTMR_SNO = #{cstmrSno} -- 권한이 유저인경우 + * GROUP BY DATE_FORMAT(CCB.CREATE_DT, #{formatParam[1}}) + */ List result = query .select( Projections.bean( @@ -2982,6 +3128,25 @@ public class CtrCntrlQueryRepository{ if(serviceType != null && !(serviceType.equals(""))) builder.and(qFltPlanBas.serviceType.eq(serviceType)); if(authCheck) builder.and(qFltPlanBas.cstmrSno.eq(jwtTokenUtil.getCstmrSnoByToken())); + /** + * 관제생성일시[createDt] 조건, + * 각항별 타입[serviceType] 조건, + * 회원고유번호[cstmrSno]조건과 맞는지 확인하여 조회하는 SQL 입니다. + * + * SELECT + * DATE_FORMAT(CCB.CREATE_DT, #{formatParam[1}}) AS 'name', + * CONCAT(SEC_TO_TIME(SUM(TIME_TO_SEC(TIMEDIFF(CCB.CNTRL_END_DT, CCB.CNTRL_ST_DT))))) AS 'value' + * FROM CTR_CNTRL_BAS CCB + * LEFT OUTER JOIN FLT_PLAN_CTR_CNTRL_REL FPCCR + * ON CCB.CNTRL_ID = FPCCR.CNTRL_ID + * LEFT OUTER JOIN FLT_PLAN_BAS FPB + * ON FPCCR.PLAN_SNO = FPB.PLAN_SNO + * WHERE FPB.SERVICE_TYPE = #{serviceType} + * AND DATE_FORMAT(CCB.CREATE_DT, #{formatParam[0}) = #{date} + * AND FPB.CSTMR_SNO = #{cstmrSno} -- 권한이 유저인경우 + * GROUP BY CCB.IDNTF_NUM + * ORDER BY CONCAT(SEC_TO_TIME(SUM(TIME_TO_SEC(TIMEDIFF(CCB.CNTRL_END_DT, CCB.CNTRL_ST_DT))))) DESC + */ List result = query .select( Projections.bean(FlightStcsValueModel.class, @@ -3042,7 +3207,25 @@ public class CtrCntrlQueryRepository{ if(serviceType != null && !(serviceType.equals(""))) builder.and(qFltPlanBas.serviceType.eq(serviceType)); if(authCheck) builder.and(qFltPlanBas.cstmrSno.eq(jwtTokenUtil.getCstmrSnoByToken())); - + /** + * 관제생성일시[createDt] 조건, + * 각항별 타입[serviceType] 조건, + * 회원고유번호[cstmrSno]조건과 맞는지 확인하여 조회하는 SQL 입니다. + * + * SELECT + * DATE_FORMAT(CCB.CREATE_DT, #{formatParam[1}}) AS 'name', + * SUM(CCB.TTL_DSTNC) AS 'value' + * FROM CTR_CNTRL_BAS CCB + * LEFT OUTER JOIN FLT_PLAN_CTR_CNTRL_REL FPCCR + * ON CCB.CNTRL_ID = FPCCR.CNTRL_ID + * LEFT OUTER JOIN FLT_PLAN_BAS FPB + * ON FPCCR.PLAN_SNO = FPB.PLAN_SNO + * WHERE FPB.SERVICE_TYPE = #{serviceType} + * AND DATE_FORMAT(CCB.CREATE_DT, #{formatParam[0}) = #{date} + * AND FPB.CSTMR_SNO = #{cstmrSno} -- 권한이 유저인경우 + * GROUP BY CCB.IDNTF_NUM + * ORDER BY SUM(CCB.TTL_DSTNC) DESC + */ List result = query .select( Projections.bean(FlightStcsValueModel.class, @@ -3095,6 +3278,25 @@ public class CtrCntrlQueryRepository{ if(serviceType != null && !(serviceType.equals(""))) builder.and(qFltPlanBas.serviceType.eq(serviceType)); if(authCheck) builder.and(qFltPlanBas.cstmrSno.eq(jwtTokenUtil.getCstmrSnoByToken())); + /** + * 관제생성일시[createDt] 조건, + * 각항별 타입[serviceType] 조건, + * 회원고유번호[cstmrSno]조건과 맞는지 확인하여 조회하는 SQL 입니다. + * + * SELECT + * DATE_FORMAT(CCB.CREATE_DT, #{formatParam[1}}) AS 'name', + * COUNT(CCB.CNTRL_ID) AS 'value' + * FROM CTR_CNTRL_BAS CCB + * LEFT OUTER JOIN FLT_PLAN_CTR_CNTRL_REL FPCCR + * ON CCB.CNTRL_ID = FPCCR.CNTRL_ID + * LEFT OUTER JOIN FLT_PLAN_BAS FPB + * ON FPCCR.PLAN_SNO = FPB.PLAN_SNO + * WHERE FPB.SERVICE_TYPE = #{serviceType} + * AND DATE_FORMAT(CCB.CREATE_DT, #{formatParam[0}) = #{date} + * AND FPB.CSTMR_SNO = #{cstmrSno} -- 권한이 유저인경우 + * GROUP BY CCB.IDNTF_NUM + * ORDER BY COUNT(CCB.CNTRL_ID) DESC + */ List result = query .select( Projections.bean(FlightStcsValueModel.class, diff --git a/pav-server/src/main/java/com/palnet/biz/jpa/repository/ctr/CtrCntrlWarnLogQueryRepository.java b/pav-server/src/main/java/com/palnet/biz/jpa/repository/ctr/CtrCntrlWarnLogQueryRepository.java index 8e4468eb..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, 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 da58100d..e8d76ffe 100644 --- a/pav-server/src/main/java/com/palnet/biz/jpa/repository/flt/FltPlanQueryRepository.java +++ b/pav-server/src/main/java/com/palnet/biz/jpa/repository/flt/FltPlanQueryRepository.java @@ -1457,6 +1457,24 @@ public class FltPlanQueryRepository { if(serviceType != null && !(serviceType.equals(""))) builder.and(qFltPlanBas.serviceType.eq(serviceType)); if(authCheck) builder.and(qFltPlanBas.cstmrSno.eq(jwtTokenUtil.getCstmrSnoByToken())); + /** + * 비행계획서 고유번호[planSno]가 있는지, + * 각항별 타입[serviceType] 조건, + * 회원고유번호[cstmrSno]조건인지 확인하여 조회하는 SQL 기능입니다. + * + * SELECT + * FPCCR.IDNTF_NUM AS 'name', + * COUNT(DISTINCT FPCCR.PLAN_SNO) AS count + * FROM FLT_PLAN_CTR_CNTRL_REL FPCCR + * LEFT OUTER JOIN FLT_PLAN_BAS FPB + * ON FPCCR.PLAN_SNO = FPB.PLAN_SNO + * WHERE FPCCR.PLAN_SNO IS NOT NULL + * AND FPB.SERVICE_TYPE = #{serviceType} + * AND FPB.CSTMR_SNO = #{cstmrSno} -- 권한이 유저인경우 + * GROUP BY FPCCR.IDNTF_NUM + * ORDER BY count DESC + * LIMIT 1; + */ List queryResult = query .select( Projections.bean(FlightStcsValueModel.class, @@ -1495,7 +1513,13 @@ public class FltPlanQueryRepository { return result; } - + /** + * 비행실적 데이터, top 1 [일일] + * @param idntfNum + * @param authCheck + * @param serviceType + * @return + */ private Long getFltResultDay(String idntfNum, boolean authCheck, String serviceType){ QFltPlanCtrCntrlRel qFltPlanCtrCntrlRel = QFltPlanCtrCntrlRel.fltPlanCtrCntrlRel; @@ -1511,6 +1535,24 @@ public class FltPlanQueryRepository { builder.and(Expressions.stringTemplate("DATE_FORMAT({0}, {1})", qFltPlanBas.createDt, dateFormat) .eq(LocalDate.now().toString())); + /** + * 비행계획서 고유번호[planSno]가 있는지, + * 각항별 타입[serviceType] 조건, + * 기체 식별번호[idntfNum] 조건, + * 비행계획서 생성일시[createDt] 조건, + * 회원고유번호[cstmrSno]조건인지 확인하여 조회하는 SQL 기능입니다. + * + * SELECT + * COUNT(DISTINCT FPCCR.PLAN_SNO) AS count + * FROM FLT_PLAN_CTR_CNTRL_REL FPCCR + * LEFT OUTER JOIN FLT_PLAN_BAS FPB + * ON FPCCR.PLAN_SNO = FPB.PLAN_SNO + * WHERE FPCCR.PLAN_SNO IS NOT NULL + * AND FPB.SERVICE_TYPE = #{serviceType} + * AND FPB.CSTMR_SNO = #{cstmrSno} -- 권한이 유저인경우 + * AND FPCCR.IDNTF_NUM = #{idntfNum} + * AND DATE_FORMAT(CCB.CREATE_DT, #{dateForamt}) = NOW() + */ return query .select( qFltPlanCtrCntrlRel.planSno.countDistinct() // 결과 객체의 프로퍼티 이름을 지정 @@ -1522,6 +1564,13 @@ public class FltPlanQueryRepository { .fetchOne(); } + /** + * 비행실적 데이터, top 1 [월] + * @param idntfNum + * @param authCheck + * @param serviceType + * @return + */ private Long getFltResultMonth(String idntfNum, boolean authCheck, String serviceType){ QFltPlanCtrCntrlRel qFltPlanCtrCntrlRel = QFltPlanCtrCntrlRel.fltPlanCtrCntrlRel; QFltPlanBas qFltPlanBas = QFltPlanBas.fltPlanBas; @@ -1534,6 +1583,25 @@ public class FltPlanQueryRepository { if(serviceType != null && !(serviceType.equals(""))) builder.and(qFltPlanBas.serviceType.eq(serviceType)); if(authCheck) builder.and(qFltPlanBas.cstmrSno.eq(jwtTokenUtil.getCstmrSnoByToken())); + /** + * 비행계획서 고유번호[planSno]가 있는지, + * 각항별 타입[serviceType] 조건, + * 기체 식별번호[idntfNum] 조건, + * 비행계획서 생성일시[createDt] 조건, + * 회원고유번호[cstmrSno]조건인지 확인하여 조회하는 SQL 기능입니다. + * + * SELECT + * COUNT(DISTINCT FPCCR.PLAN_SNO) AS count + * FROM FLT_PLAN_CTR_CNTRL_REL FPCCR + * LEFT OUTER JOIN FLT_PLAN_BAS FPB + * ON FPCCR.PLAN_SNO = FPB.PLAN_SNO + * WHERE FPCCR.PLAN_SNO IS NOT NULL + * AND FPB.SERVICE_TYPE = #{serviceType} + * AND FPB.CSTMR_SNO = #{cstmrSno} -- 권한이 유저인경우 + * AND FPCCR.IDNTF_NUM = #{idntfNum} + * AND FPB.CREATE_DT >= '한달전 오늘' + * AND FPB.CREATE_DT <= '오늘' + */ return query .select( qFltPlanCtrCntrlRel.planSno.countDistinct() // 결과 객체의 프로퍼티 이름을 지정 @@ -1545,6 +1613,13 @@ public class FltPlanQueryRepository { .fetchOne(); } + /** + * 비행실적 데이터, top 1 [년] + * @param idntfNum + * @param authCheck + * @param serviceType + * @return + */ private Long getFltResultYear(String idntfNum, boolean authCheck, String serviceType){ QFltPlanCtrCntrlRel qFltPlanCtrCntrlRel = QFltPlanCtrCntrlRel.fltPlanCtrCntrlRel; QFltPlanBas qFltPlanBas = QFltPlanBas.fltPlanBas; @@ -1557,6 +1632,25 @@ public class FltPlanQueryRepository { if(serviceType != null && !(serviceType.equals(""))) builder.and(qFltPlanBas.serviceType.eq(serviceType)); if(authCheck) builder.and(qFltPlanBas.cstmrSno.eq(jwtTokenUtil.getCstmrSnoByToken())); + /** + * 비행계획서 고유번호[planSno]가 있는지, + * 각항별 타입[serviceType] 조건, + * 기체 식별번호[idntfNum] 조건, + * 비행계획서 생성일시[createDt] 조건, + * 회원고유번호[cstmrSno]조건인지 확인하여 조회하는 SQL 기능입니다. + * + * SELECT + * COUNT(DISTINCT FPCCR.PLAN_SNO) AS count + * FROM FLT_PLAN_CTR_CNTRL_REL FPCCR + * LEFT OUTER JOIN FLT_PLAN_BAS FPB + * ON FPCCR.PLAN_SNO = FPB.PLAN_SNO + * WHERE FPCCR.PLAN_SNO IS NOT NULL + * AND FPB.SERVICE_TYPE = #{serviceType} + * AND FPB.CSTMR_SNO = #{cstmrSno} -- 권한이 유저인경우 + * AND FPCCR.IDNTF_NUM = #{idntfNum} + * AND FPB.CREATE_DT >= '일년전 오늘' + * AND FPB.CREATE_DT <= '오늘' + */ return query .select( qFltPlanCtrCntrlRel.planSno.countDistinct() // 결과 객체의 프로퍼티 이름을 지정 @@ -1583,6 +1677,21 @@ public class FltPlanQueryRepository { if(serviceType != null && !(serviceType.equals(""))) builder.and(qFltPlanBas.serviceType.eq(serviceType)); if(authCheck) builder.and(qFltPlanBas.cstmrSno.eq(jwtTokenUtil.getCstmrSnoByToken())); + /** + * 각항별 타입[serviceType] 조건, + * 회원고유번호[cstmrSno]조건인지 확인하여 조회하는 SQL 입니다. + * + * SELECT + * FPA.IDNTF_NUM + * FROM FLT_PLAN_ARCRFT FPA + * LEFT OUTER JOIN FLT_PLAN_BAS FPB + * ON FPB.PLAN_SNO = FPA.PLAN_SNO + * WHERE FPB.SERVICE_TYPE = #{serviceType} + * AND FPB.CSTMR_SNO = #{cstmrSno} -- 권한이 유저인경우 + * GROUP BY FPA.IDNTF_NUM + * ORDER BY COUNT(FPA.PLAN_SNO) DESC + * LIMIT 1 + */ List queryResult = query .select( Projections.bean(FlightStcsValueModel.class, @@ -1590,6 +1699,7 @@ public class FltPlanQueryRepository { ) ) .from(qFltPlanArcrft) + .where(builder) .leftJoin(qFltPlanBas) .on(qFltPlanArcrft.planSno.eq(qFltPlanBas.planSno)) .groupBy(qFltPlanArcrft.idntfNum) @@ -1620,6 +1730,13 @@ public class FltPlanQueryRepository { return result; } + /** + * 비행계획에 많이 기용된 기체 데이터, top 1[일일] + * @param idntfNum + * @param authCheck + * @param serviceType + * @return + */ private Long getFltPlanDay(String idntfNum, boolean authCheck, String serviceType){ QFltPlanArcrft bas = QFltPlanArcrft.fltPlanArcrft; QFltPlanBas qFltPlanBas = QFltPlanBas.fltPlanBas; @@ -1633,6 +1750,21 @@ public class FltPlanQueryRepository { builder.and(Expressions.stringTemplate("DATE_FORMAT({0}, {1})", bas.createDt, dateFormat) .eq(LocalDate.now().toString())); + /** + * 생성일시[createDt] 조건, + * 각항별 타입[serviceType] 조건, + * 회원고유번호[cstmrSno]조건인지 확인하여 조회하는 SQL 입니다. + * + * SELECT + * COUNT(FPA.PLAN_SNO) + * FROM FLT_PLAN_ARCRFT FPA + * LEFT OUTER JOIN FLT_PLAN_BAS FPB + * ON FPB.PLAN_SNO = FPA.PLAN_SNO + * WHERE FPB.SERVICE_TYPE = #{serviceType} + * AND FPB.CSTMR_SNO = #{cstmrSno} -- 권한이 유저인경우 + * AND FPA.IDNTF_NUM = #{idntfNum} + * AND DATE_FORMAT(FPA.CREATE_DT, #{dateForamt}) = NOW() + */ return query .select( bas.planSno.count() // 결과 객체의 프로퍼티 이름을 지정 @@ -1644,6 +1776,13 @@ public class FltPlanQueryRepository { .fetchOne(); } + /** + * 비행계획에 많이 기용된 기체 데이터, top 1[월] + * @param idntfNum + * @param authCheck + * @param serviceType + * @return + */ private Long getFltPlanMonth(String idntfNum, boolean authCheck, String serviceType){ QFltPlanArcrft bas = QFltPlanArcrft.fltPlanArcrft; QFltPlanBas qFltPlanBas = QFltPlanBas.fltPlanBas; @@ -1655,6 +1794,21 @@ public class FltPlanQueryRepository { if(serviceType != null && !(serviceType.equals(""))) builder.and(qFltPlanBas.serviceType.eq(serviceType)); if(authCheck) builder.and(qFltPlanBas.cstmrSno.eq(jwtTokenUtil.getCstmrSnoByToken())); + /** + * 생성일시[createDt] 조건, + * 각항별 타입[serviceType] 조건, + * 회원고유번호[cstmrSno]조건인지 확인하여 조회하는 SQL 입니다. + * + * SELECT + * COUNT(FPA.PLAN_SNO) + * FROM FLT_PLAN_ARCRFT FPA + * LEFT OUTER JOIN FLT_PLAN_BAS FPB + * ON FPB.PLAN_SNO = FPA.PLAN_SNO + * WHERE FPB.SERVICE_TYPE = #{serviceType} + * AND FPB.CSTMR_SNO = #{cstmrSno} -- 권한이 유저인경우 + * AND FPA.CREATE_DT >= '한달전 오늘' + * AND FPA.CREATE_DT <= '오늘' + */ return query .select( bas.planSno.count() // 결과 객체의 프로퍼티 이름을 지정 @@ -1666,6 +1820,13 @@ public class FltPlanQueryRepository { .fetchOne(); } + /** + * 비행계획에 많이 기용된 기체 데이터, top 1[년] + * @param idntfNum + * @param authCheck + * @param serviceType + * @return + */ private Long getFltPlanYear(String idntfNum, boolean authCheck, String serviceType){ QFltPlanArcrft bas = QFltPlanArcrft.fltPlanArcrft; QFltPlanBas qFltPlanBas = QFltPlanBas.fltPlanBas; @@ -1677,6 +1838,21 @@ public class FltPlanQueryRepository { if(serviceType != null && !(serviceType.equals(""))) builder.and(qFltPlanBas.serviceType.eq(serviceType)); if(authCheck) builder.and(qFltPlanBas.cstmrSno.eq(jwtTokenUtil.getCstmrSnoByToken())); + /** + * 생성일시[createDt] 조건, + * 각항별 타입[serviceType] 조건, + * 회원고유번호[cstmrSno]조건인지 확인하여 조회하는 SQL 입니다. + * + * SELECT + * COUNT(FPA.PLAN_SNO) + * FROM FLT_PLAN_ARCRFT FPA + * LEFT OUTER JOIN FLT_PLAN_BAS FPB + * ON FPB.PLAN_SNO = FPA.PLAN_SNO + * WHERE FPB.SERVICE_TYPE = #{serviceType} + * AND FPB.CSTMR_SNO = #{cstmrSno} -- 권한이 유저인경우 + * AND FPA.CREATE_DT >= '일년전 오늘' + * AND FPA.CREATE_DT <= '오늘' + */ return query .select( bas.planSno.count() @@ -1706,7 +1882,22 @@ public class FltPlanQueryRepository { if(serviceType != null && !(serviceType.equals(""))) builder.and(qFltPlanBas.serviceType.eq(serviceType)); if(authCheck) builder.and(qFltPlanBas.cstmrSno.eq(jwtTokenUtil.getCstmrSnoByToken())); - + /** + * 각항별 타입[serviceType] 조건, + * 회원고유번호[cstmrSno]조건, + * 승인여부[aprvlYn] 값이 'Y' 데이터를 조회하는 SQL 입니다. + * + * SELECT + * FPA.IDNTF_NUM + * FROM FLT_PLAN_ARCRFT FPA + * LEFT OUTER JOIN FLT_PLAN_BAS FPB + * ON FPB.PLAN_SNO = FPB.PLAN_SNO + * WHERE FPB.SERVICE_TYPE = #{serviceType} + * AND FPB.CSTMR_SNO = #{cstmrSno} -- 권한이 유저인경우 + * AND FPB.APRVL_YN = 'Y' + * GROUP BY FPA.IDNTF_NUM + * ORDER BY COUNT(FPA.PLAN_SNO) DESC + */ List queryResult = query .select( Projections.bean(FlightStcsValueModel.class, @@ -1744,6 +1935,13 @@ public class FltPlanQueryRepository { return result; } + /** + * 비행승인 많은 기체 데이터, top 1 [일일] + * @param idntfNum + * @param authCheck + * @param serviceType + * @return + */ private Long getFltPlanAprvnDay(String idntfNum, boolean authCheck, String serviceType){ QFltPlanArcrft qFltPlanArcrft = QFltPlanArcrft.fltPlanArcrft; QFltPlanBas qFltPlanBas = QFltPlanBas.fltPlanBas; @@ -1758,6 +1956,23 @@ public class FltPlanQueryRepository { builder.and(Expressions.stringTemplate("DATE_FORMAT({0}, {1})", qFltPlanBas.createDt, dateFormat) .eq(LocalDate.now().toString())); + /** + * 각항별 타입[serviceType] 조건, + * 회원고유번호[cstmrSno]조건, + * 승인여부[aprvlYn] 값이 'Y' 인지, + * 비행계획서 생성일시[createDt] 값 조건이지 확인하여 조회하는 SQL 입니다. + * + * SELECT + * COUNT(FPA.PLAN_SNO ) + * FROM FLT_PLAN_ARCRFT FPA + * LEFT OUTER JOIN FLT_PLAN_BAS FPB + * ON FPB.PLAN_SNO = FPB.PLAN_SNO + * WHERE FPB.SERVICE_TYPE = #{serviceType} + * AND FPB.CSTMR_SNO = #{cstmrSno} -- 권한이 유저인경우 + * AND FPB.APRVL_YN = 'Y' + * AND FPA.IDNTF_NUM = #{idntfNum} + * AND DATE_FORMAT(FPB.CREATE_DT, #{dateForamt}) = NOW () + */ return query .select( qFltPlanArcrft.planSno.count() // 결과 객체의 프로퍼티 이름을 지정 @@ -1769,6 +1984,13 @@ public class FltPlanQueryRepository { .fetchOne(); } + /** + * 비행승인 많은 기체 데이터, top 1 [월] + * @param idntfNum + * @param authCheck + * @param serviceType + * @return + */ private Long getFltPlanAprvnMonth(String idntfNum, boolean authCheck, String serviceType){ QFltPlanArcrft qFltPlanArcrft = QFltPlanArcrft.fltPlanArcrft; @@ -1782,6 +2004,24 @@ public class FltPlanQueryRepository { if(serviceType != null && !(serviceType.equals(""))) builder.and(qFltPlanBas.serviceType.eq(serviceType)); if(authCheck) builder.and(qFltPlanBas.cstmrSno.eq(jwtTokenUtil.getCstmrSnoByToken())); + /** + * 각항별 타입[serviceType] 조건, + * 회원고유번호[cstmrSno]조건, + * 승인여부[aprvlYn] 값이 'Y' 인지, + * 비행계획서 생성일시[createDt] 값 조건이지 확인하여 조회하는 SQL 입니다. + * + * SELECT + * COUNT(FPA.PLAN_SNO ) + * FROM FLT_PLAN_ARCRFT FPA + * LEFT OUTER JOIN FLT_PLAN_BAS FPB + * ON FPB.PLAN_SNO = FPB.PLAN_SNO + * WHERE FPB.SERVICE_TYPE = #{serviceType} + * AND FPB.CSTMR_SNO = #{cstmrSno} -- 권한이 유저인경우 + * AND FPB.APRVL_YN = 'Y' + * AND FPA.IDNTF_NUM = #{idntfNum} + * AND FPB.CREATE_DT >= '한달전 오늘' + * AND FPB.CREATE_DT <= '오늘' + */ return query .select( qFltPlanArcrft.planSno.count() // 결과 객체의 프로퍼티 이름을 지정 @@ -1793,6 +2033,13 @@ public class FltPlanQueryRepository { .fetchOne(); } + /** + * 비행승인 많은 기체 데이터, top 1 [년] + * @param idntfNum + * @param authCheck + * @param serviceType + * @return + */ private Long getFltPlanAprvnYear(String idntfNum, boolean authCheck, String serviceType){ QFltPlanArcrft qFltPlanArcrft = QFltPlanArcrft.fltPlanArcrft; QFltPlanBas qFltPlanBas = QFltPlanBas.fltPlanBas; @@ -1805,6 +2052,24 @@ public class FltPlanQueryRepository { if(serviceType != null && !(serviceType.equals(""))) builder.and(qFltPlanBas.serviceType.eq(serviceType)); if(authCheck) builder.and(qFltPlanBas.cstmrSno.eq(jwtTokenUtil.getCstmrSnoByToken())); + /** + * 각항별 타입[serviceType] 조건, + * 회원고유번호[cstmrSno]조건, + * 승인여부[aprvlYn] 값이 'Y' 인지, + * 비행계획서 생성일시[createDt] 값 조건이지 확인하여 조회하는 SQL 입니다. + * + * SELECT + * COUNT(FPA.PLAN_SNO ) + * FROM FLT_PLAN_ARCRFT FPA + * LEFT OUTER JOIN FLT_PLAN_BAS FPB + * ON FPB.PLAN_SNO = FPB.PLAN_SNO + * WHERE FPB.SERVICE_TYPE = #{serviceType} + * AND FPB.CSTMR_SNO = #{cstmrSno} -- 권한이 유저인경우 + * AND FPB.APRVL_YN = 'Y' + * AND FPA.IDNTF_NUM = #{idntfNum} + * AND FPB.CREATE_DT >= '일년전 오늘' + * AND FPB.CREATE_DT <= '오늘' + */ return query .select( qFltPlanArcrft.planSno.count() // 결과 객체의 프로퍼티 이름을 지정 @@ -1843,6 +2108,22 @@ public class FltPlanQueryRepository { if(serviceType != null && !(serviceType.equals(""))) builder.and(qFltPlanBas.serviceType.eq(serviceType)); if(authCheck) builder.and(qFltPlanBas.cstmrSno.eq(jwtTokenUtil.getCstmrSnoByToken())); + /** + * 비행계획서 생성일시[createDt] 조건, + * 각항별 타입[serviceType] 조건, + * 회원고유번호[cstmrSno]조건과 맞는지 확인하여 조회하는 SQL 입니다. + * + * SELECT + * DATE_FORMAT(FPB.CREATE_DT, #{formatParam[1}) AS 'name', + * COUNT(DISTINCT FPCCR.PLAN_SNO) AS 'value' + * FROM FLT_PLAN_CTR_CNTRL_REL FPCCR + * LEFT OUTER JOIN FLT_PLAN_BAS FPB + * ON FPCCR.PLAN_SNO = FPB.PLAN_SNO + * WHERE DATE_FORMAT(CCWL.CREATE_DT, #{formatParam[0}) + * AND FPB.SERVICE_TYPE = #{serviceType} + * AND FPB.CSTMR_SNO = #{cstmrSno} -- 권한이 유저인경우 + * GROUP BY DATE_FORMAT(FPB.CREATE_DT, #{formatParam[1}) + */ List result = query .select( Projections.bean( @@ -1894,6 +2175,20 @@ public class FltPlanQueryRepository { if(serviceType != null && !(serviceType.equals(""))) builder.and(qFltPlanBas.serviceType.eq(serviceType)); if(authCheck) builder.and(qFltPlanBas.cstmrSno.eq(jwtTokenUtil.getCstmrSnoByToken())); + /** + * 비행계획서 생성일시[createDt] 조건, + * 각항별 타입[serviceType] 조건, + * 회원고유번호[cstmrSno]조건과 맞는지 확인하여 조회하는 SQL 입니다. + * + * SELECT + * DATE_FORMAT(FPB.CREATE_DT, #{formatParam[1}) AS 'name', + * COUNT(FPB.PLAN_SNO) AS 'value' + * FROM FLT_PLAN_BAS FPB + * WHERE DATE_FORMAT(CCWL.CREATE_DT, #{formatParam[0}) + * AND FPB.SERVICE_TYPE = #{serviceType} + * AND FPB.CSTMR_SNO = #{cstmrSno} -- 권한이 유저인경우 + * GROUP BY DATE_FORMAT(FPB.CREATE_DT, #{formatParam[1}) + */ List result = query .select( Projections.bean( @@ -1946,6 +2241,22 @@ public class FltPlanQueryRepository { if(serviceType != null && !(serviceType.equals(""))) builder.and(qFltPlanBas.serviceType.eq(serviceType)); if(authCheck) builder.and(qFltPlanBas.cstmrSno.eq(jwtTokenUtil.getCstmrSnoByToken())); + /** + * 승인여부가 'Y'인지, + * 비행계획서 생성일시[createDt] 조건, + * 각항별 타입[serviceType] 조건, + * 회원고유번호[cstmrSno]조건과 맞는지 확인하여 조회하는 SQL 입니다. + * + * SELECT + * DATE_FORMAT(FPB.CREATE_DT, #{formatParam[1}) AS 'name', + * COUNT(FPB.PLAN_SNO) AS 'value' + * FROM FLT_PLAN_BAS FPB + * WHERE DATE_FORMAT(CCWL.CREATE_DT, #{formatParam[0}) + * AND FPB.APRVL_YN = 'Y' + * AND FPB.SERVICE_TYPE = #{serviceType} + * AND FPB.CSTMR_SNO = #{cstmrSno} -- 권한이 유저인경우 + * GROUP BY DATE_FORMAT(FPB.CREATE_DT, #{formatParam[1}) + */ List result = query .select( Projections.bean( @@ -1992,6 +2303,24 @@ public class FltPlanQueryRepository { if(serviceType != null && !(serviceType.equals(""))) builder.and(qFltPlanBas.serviceType.eq(serviceType)); if(authCheck) builder.and(qFltPlanBas.cstmrSno.eq(jwtTokenUtil.getCstmrSnoByToken())); + /** + * 비행계획서 생성일시[createDt] 조건, + * 각항별 타입[serviceType] 조건, + * 회원고유번호[cstmrSno]조건과 맞는지 확인하여 조회하는 SQL 입니다. + * + * SELECT + * FPCCR.IDNTF_NUM AS 'name', + * COUNT(DISTINCT FPCCR.PLAN_SNO) AS 'value' + * FROM FLT_PLAN_CTR_CNTRL_REL FPCCR + * LEFT OUTER JOIN FLT_PLAN_BAS FPB + * ON FPCCR.PLAN_SNO = FPB.PLAN_SNO + * WHERE DATE_FORMAT(CCWL.CREATE_DT, #{formatParam[0}) + * AND FPB.SERVICE_TYPE = #{serviceType} + * AND FPB.CSTMR_SNO = #{cstmrSno} -- 권한이 유저인경우 + * GROUP BY FPCCR.IDNTF_NUM + * ORDER BY COUNT(DISTINCT FPCCR.PLAN_SNO) DESC + * LIMIT 5 + */ List result = query .select( Projections.bean(FlightStcsValueModel.class, @@ -2041,6 +2370,24 @@ public class FltPlanQueryRepository { if(serviceType != null && !(serviceType.equals(""))) builder.and(qFltPlanBas.serviceType.eq(serviceType)); if(authCheck) builder.and(qFltPlanBas.cstmrSno.eq(jwtTokenUtil.getCstmrSnoByToken())); + /** + * 비행계획서 생성일시[createDt] 조건, + * 각항별 타입[serviceType] 조건, + * 회원고유번호[cstmrSno]조건과 맞는지 확인하여 조회하는 SQL 입니다. + * + * SELECT + * FPA.IDNTF_NUM AS 'name', + * COUNT(DISTINCT FPA.PLAN_SNO) AS 'value' + * FROM FLT_PLAN_BAS FPB + * LEFT OUTER JOIN FLT_PLAN_ARCRFT FPA + * ON FPA.PLAN_SNO = FPB.PLAN_SNO + * WHERE DATE_FORMAT(CCWL.CREATE_DT, #{formatParam[0}) + * AND FPB.SERVICE_TYPE = #{serviceType} + * AND FPB.CSTMR_SNO = #{cstmrSno} -- 권한이 유저인경우 + * GROUP BY FPA.IDNTF_NUM + * ORDER BY COUNT(DISTINCT FPA.PLAN_SNO) DESC + * LIMIT 5 + */ List result = query .select( Projections.bean(FlightStcsValueModel.class, @@ -2091,6 +2438,26 @@ public class FltPlanQueryRepository { if(authCheck) builder.and(qFltPlanBas.cstmrSno.eq(jwtTokenUtil.getCstmrSnoByToken())); if(serviceType != null && !(serviceType.equals(""))) builder.and(qFltPlanBas.serviceType.eq(serviceType)); + /** + * 비행계획서 생성일시[createDt] 조건, + * 승인여부[aprvlYn] 조건, + * 각항별 타입[serviceType] 조건, + * 회원고유번호[cstmrSno]조건과 맞는지 확인하여 조회하는 SQL 입니다. + * + * SELECT + * FPA.IDNTF_NUM AS 'name', + * COUNT(DISTINCT FPA.PLAN_SNO) AS 'value' + * FROM FLT_PLAN_BAS FPB + * LEFT OUTER JOIN FLT_PLAN_ARCRFT FPA + * ON FPA.PLAN_SNO = FPB.PLAN_SNO + * WHERE DATE_FORMAT(CCWL.CREATE_DT, #{formatParam[0}) + * AND FPB.SERVICE_TYPE = #{serviceType} + * AND FPB.CSTMR_SNO = #{cstmrSno} -- 권한이 유저인경우 + * AND FPB.APRVL_YN = 'Y' + * GROUP BY FPA.IDNTF_NUM + * ORDER BY COUNT(DISTINCT FPA.PLAN_SNO) DESC + * LIMIT 5 + */ List result = query .select( Projections.bean(FlightStcsValueModel.class, From e12943d79dfa71539a3bbc59fe912fda0a17cc83 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?lkd9125=28=EC=9D=B4=EA=B2=BD=EB=8F=84=29?= Date: Tue, 12 Dec 2023 17:05:37 +0900 Subject: [PATCH 27/32] =?UTF-8?q?storage=20=EC=A3=BC=EC=84=9D=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../storage/controller/StorageController.java | 15 ++++++++++++++ .../comn/storage/service/StorageService.java | 20 +++++++++++++++++++ 2 files changed, 35 insertions(+) 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..2a7ce449 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 @@ -22,11 +22,21 @@ public class StorageController { @Autowired private StorageService service; + /** + * 파일 업로드 기능 + * @param file + * @return + */ @PostMapping("/upload") public ResponseEntity uploadFile(@RequestParam(value = "file") MultipartFile file) { return new ResponseEntity<>(service.uploadFile(file), HttpStatus.OK); } + /** + * 파일 다운로드 기능. + * @param fileName + * @return + */ @GetMapping("/download/{fileName}") public ResponseEntity downloadFile(@PathVariable String fileName) { byte[] data = service.downloadFile(fileName); @@ -39,6 +49,11 @@ public class StorageController { .body(resource); } + /** + * 파일 삭제 기능. + * @param fileName + * @return + */ @DeleteMapping("/delete/{fileName}") 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)) { From 3fdfeb3f6876e3fc1647a64e330ab5cceeaa9690 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?qkr7828=28=EB=B0=95=EC=9E=AC=EC=9A=B0=29?= Date: Wed, 13 Dec 2023 17:33:19 +0900 Subject: [PATCH 28/32] =?UTF-8?q?pav-utils=20=EB=8B=A8=EC=9C=84=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- document/dron_test/pav-utils.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/document/dron_test/pav-utils.js b/document/dron_test/pav-utils.js index 0e858c24..9b3f1d9d 100644 --- a/document/dron_test/pav-utils.js +++ b/document/dron_test/pav-utils.js @@ -91,8 +91,8 @@ const dumyData = { lon: 126.6146, elevType: 'M', elev: 125.4, - speedType: 'KM', - speed: 145.8, + speedType: 'm/s', + speed: 40.5, heading: 227.94, terminalRcvDt: '20210629173145', betteryLevel: 91, From be5bd19f2a62b02fa8e2b108640ae88bd51ea2f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?qkr7828=28=EB=B0=95=EC=9E=AC=EC=9A=B0=29?= Date: Thu, 14 Dec 2023 15:14:56 +0900 Subject: [PATCH 29/32] . --- .../flight/controller/BasFlightController.java | 18 ++++++++++++------ .../bas/flight/model/BasFlightCoordModel.java | 15 +++++++++++++++ 2 files changed, 27 insertions(+), 6 deletions(-) create mode 100644 pav-server/src/main/java/com/palnet/biz/api/bas/flight/model/BasFlightCoordModel.java 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 5eb80a94..c834a747 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 @@ -39,6 +39,7 @@ 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.BasFlightCoordModel; 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; @@ -593,10 +594,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; +} From 87ca73cb1d6fa7a95952ae44064345ae5807d2f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?qkr7828=28=EB=B0=95=EC=9E=AC=EC=9A=B0=29?= Date: Thu, 14 Dec 2023 17:42:51 +0900 Subject: [PATCH 30/32] =?UTF-8?q?=ED=97=A4=EB=94=A9=EA=B0=81=20360?= =?UTF-8?q?=EB=8F=84=20=EC=B4=88=EA=B3=BC=ED=95=98=EB=8A=94=20=EC=98=A4?= =?UTF-8?q?=EB=A5=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- document/dron_test/pav-utils.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/document/dron_test/pav-utils.js b/document/dron_test/pav-utils.js index 9b3f1d9d..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; } @@ -93,7 +94,7 @@ const dumyData = { elev: 125.4, speedType: 'm/s', speed: 40.5, - heading: 227.94, + heading: 0, terminalRcvDt: '20210629173145', betteryLevel: 91, betteryVoltage: 50, From 95cac94b68f6849d9314d75b2b6b63e2b97a9cb8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?lkd9125=28=EC=9D=B4=EA=B2=BD=EB=8F=84=29?= Date: Fri, 15 Dec 2023 15:34:54 +0900 Subject: [PATCH 31/32] =?UTF-8?q?=EB=A1=9C=EA=B7=B8=ED=99=95=EC=9D=B8?= =?UTF-8?q?=EC=9A=A9=EC=9E=84=EC=8B=9C=20=EC=BB=A4=EB=B0=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cntrl/controller/CtrCntrlController.java | 8 ++++++++ .../ctr/CtrCntrlQueryRepository.java | 18 ++++++++++++++++++ 2 files changed, 26 insertions(+) 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 9d6c538f..976d743c 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 @@ -13,6 +13,7 @@ import io.swagger.v3.oas.annotations.tags.Tag; import lombok.extern.log4j.Log4j2; import org.json.simple.JSONObject; import org.json.simple.parser.ParseException; +import org.springframework.beans.factory.annotation.Value; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; @@ -29,6 +30,9 @@ import java.util.Map; @Tag(name = "드론 관제 시스템", description = "드론 관제 관련 API") public class CtrCntrlController { + @Value("${spring.profiles.active}") + private String activeProfile; + private final CtrCntrlService service; public CtrCntrlController(CtrCntrlService service) { @@ -171,6 +175,8 @@ public class CtrCntrlController { public ResponseEntity findGroupAuthInfo(int cstmrSno) { List list; + log.info("===================================================================================="); + log.info("activeProfile => {}", activeProfile); try { list = service.getGroupAuthInfo(); // 그룹의 기체 정보 조회하는 기능 } catch (Exception e) { @@ -186,6 +192,8 @@ public class CtrCntrlController { .body(new ErrorResponse("Server Error", "-1")); } + log.info("===================================================================================="); + return ResponseEntity.ok().body(new SuccessResponse(list)); } 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 b14b0a65..42800308 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 @@ -2030,6 +2030,10 @@ public class CtrCntrlQueryRepository{ Integer cstmrSno = jwtTokenUtil.getCstmrSnoByToken(); List groupAuth = jwtTokenUtil.getGroupAuthByToken(); + log.info("User CstmrSno => {}", cstmrSno); + log.info("User Auth => {}", authId); + log.info("User GroupAuth => {}", groupAuth); + BooleanBuilder builder = new BooleanBuilder(); builder.and(pgb.useYn.eq("Y")); if("ADMIN".equals(authId) || "SUPER".equals(authId)) { @@ -2067,6 +2071,11 @@ public class CtrCntrlQueryRepository{ .where(builder) .fetch(); + log.info("Control Query Result=> {}", model); + + + log.info("===================================================================================="); + for(CtrCntrlGroupModel list : model) { if(groupAuth != null) { @@ -2115,8 +2124,14 @@ public class CtrCntrlQueryRepository{ int cstmrSno = jwtTokenUtil.getCstmrSnoByToken(); String groupAuth = null; List groupAuthList = jwtTokenUtil.getGroupAuthByToken(); + BooleanBuilder builder = new BooleanBuilder(); builder.and(arcrftBas.groupId.eq(groupId)); + + log.info("groupId => {}", groupId); + log.info("User CstmrSno => {}", cstmrSno); + log.info("User Auth => {}", appAuth); + if("USER".equals(appAuth) || "ROLE_USER".equals(appAuth)) { for(JwtGroupModel list : groupAuthList) { if(list.getGroupId().equals(groupId)) { @@ -2150,6 +2165,9 @@ public class CtrCntrlQueryRepository{ .where(builder) .fetch(); + + log.info("Arcrft Query Result => {}", arcrftList); + return arcrftList; //------------------------------------------- From ad71102ecc9bf518d299b1d353e15482d126d2a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?lkd9125=28=EC=9D=B4=EA=B2=BD=EB=8F=84=29?= Date: Fri, 15 Dec 2023 15:46:12 +0900 Subject: [PATCH 32/32] =?UTF-8?q?=EB=A1=9C=EA=B7=B8=20=EC=82=AD=EC=A0=9C?= =?UTF-8?q?=20=EB=B0=8F=20=EB=B3=B5=ED=98=B8=ED=99=94=20=EC=BD=94=EB=93=9C?= =?UTF-8?q?=20=EC=A3=BC=EC=84=9D=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cntrl/controller/CtrCntrlController.java | 9 +------- .../ctr/cntrl/service/CtrCntrlService.java | 21 ++++++++++--------- .../ctr/CtrCntrlQueryRepository.java | 21 ++----------------- 3 files changed, 14 insertions(+), 37 deletions(-) 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 976d743c..91036fc5 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 @@ -30,9 +30,6 @@ import java.util.Map; @Tag(name = "드론 관제 시스템", description = "드론 관제 관련 API") public class CtrCntrlController { - @Value("${spring.profiles.active}") - private String activeProfile; - private final CtrCntrlService service; public CtrCntrlController(CtrCntrlService service) { @@ -175,8 +172,6 @@ public class CtrCntrlController { public ResponseEntity findGroupAuthInfo(int cstmrSno) { List list; - log.info("===================================================================================="); - log.info("activeProfile => {}", activeProfile); try { list = service.getGroupAuthInfo(); // 그룹의 기체 정보 조회하는 기능 } catch (Exception e) { @@ -190,9 +185,7 @@ public class CtrCntrlController { log.error("IGNORE : {}", e); return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) .body(new ErrorResponse("Server Error", "-1")); - } - - log.info("===================================================================================="); + } return ResponseEntity.ok().body(new SuccessResponse(list)); } 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 23b41879..a3342573 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 @@ -113,16 +113,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")) { 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 42800308..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 @@ -2030,10 +2030,6 @@ public class CtrCntrlQueryRepository{ Integer cstmrSno = jwtTokenUtil.getCstmrSnoByToken(); List groupAuth = jwtTokenUtil.getGroupAuthByToken(); - log.info("User CstmrSno => {}", cstmrSno); - log.info("User Auth => {}", authId); - log.info("User GroupAuth => {}", groupAuth); - BooleanBuilder builder = new BooleanBuilder(); builder.and(pgb.useYn.eq("Y")); if("ADMIN".equals(authId) || "SUPER".equals(authId)) { @@ -2069,13 +2065,7 @@ public class CtrCntrlQueryRepository{ .on(pcg.groupId.eq(pgb.groupId)) .groupBy(pgb.groupId) .where(builder) - .fetch(); - - log.info("Control Query Result=> {}", model); - - - log.info("===================================================================================="); - + .fetch(); for(CtrCntrlGroupModel list : model) { if(groupAuth != null) { @@ -2126,11 +2116,7 @@ public class CtrCntrlQueryRepository{ List groupAuthList = jwtTokenUtil.getGroupAuthByToken(); BooleanBuilder builder = new BooleanBuilder(); - builder.and(arcrftBas.groupId.eq(groupId)); - - log.info("groupId => {}", groupId); - log.info("User CstmrSno => {}", cstmrSno); - log.info("User Auth => {}", appAuth); + builder.and(arcrftBas.groupId.eq(groupId)); if("USER".equals(appAuth) || "ROLE_USER".equals(appAuth)) { for(JwtGroupModel list : groupAuthList) { @@ -2165,9 +2151,6 @@ public class CtrCntrlQueryRepository{ .where(builder) .fetch(); - - log.info("Arcrft Query Result => {}", arcrftList); - return arcrftList; //-------------------------------------------