Browse Source

Merge branch 'develop' into feature/coordinate/comptent-authority

pull/16/head
지대한 9 months ago
parent
commit
3820c8ea7e
  1. 13
      document/dron_test/pav-utils.js
  2. 10
      document/dron_test/pav-warning.js
  3. 146
      pav-server/src/main/java/com/palnet/biz/api/acnt/crtfyhp/controller/AcntCrtfyhpController.java
  4. 112
      pav-server/src/main/java/com/palnet/biz/api/acnt/crtfyhp/service/AcntCrtfyhpService.java
  5. 114
      pav-server/src/main/java/com/palnet/biz/api/acnt/cstmr/controller/AcntCstmrController.java
  6. 106
      pav-server/src/main/java/com/palnet/biz/api/acnt/cstmr/service/AcntCstmrService.java
  7. 58
      pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/controller/JwtAuthenticationController.java
  8. 33
      pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/service/JwtService.java
  9. 4
      pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/utils/JwtTokenUtil.java
  10. 8
      pav-server/src/main/java/com/palnet/biz/api/acnt/terms/controller/AcntTermsController.java
  11. 5
      pav-server/src/main/java/com/palnet/biz/api/acnt/terms/service/AcntTermsService.java
  12. 52
      pav-server/src/main/java/com/palnet/biz/api/anls/hstry/controller/AnlsHstryController.java
  13. 49
      pav-server/src/main/java/com/palnet/biz/api/anls/hstry/service/AnlsHstryService.java
  14. 54
      pav-server/src/main/java/com/palnet/biz/api/anls/smlt/controller/AnlsSmltController.java
  15. 20
      pav-server/src/main/java/com/palnet/biz/api/anls/smlt/service/AnlsSmltService.java
  16. 136
      pav-server/src/main/java/com/palnet/biz/api/bas/dron/controller/BasDronController.java
  17. 36
      pav-server/src/main/java/com/palnet/biz/api/bas/dron/service/BasDronService.java
  18. 268
      pav-server/src/main/java/com/palnet/biz/api/bas/flight/controller/BasFlightController.java
  19. 15
      pav-server/src/main/java/com/palnet/biz/api/bas/flight/model/BasFlightCoordModel.java
  20. 103
      pav-server/src/main/java/com/palnet/biz/api/bas/flight/service/BasFlightService.java
  21. 129
      pav-server/src/main/java/com/palnet/biz/api/bas/group/controller/BasGroupController.java
  22. 31
      pav-server/src/main/java/com/palnet/biz/api/bas/group/service/BasGroupService.java
  23. 36
      pav-server/src/main/java/com/palnet/biz/api/bas/laanc/service/BasLaancService.java
  24. 119
      pav-server/src/main/java/com/palnet/biz/api/cns/faq/controller/CnsFaqController.java
  25. 26
      pav-server/src/main/java/com/palnet/biz/api/cns/faq/service/CnsFaqService.java
  26. 159
      pav-server/src/main/java/com/palnet/biz/api/cns/qna/controller/CnsQnaController.java
  27. 33
      pav-server/src/main/java/com/palnet/biz/api/cns/qna/service/CnsQnaService.java
  28. 66
      pav-server/src/main/java/com/palnet/biz/api/comn/elev/controller/ComnElevController.java
  29. 20
      pav-server/src/main/java/com/palnet/biz/api/comn/elev/service/ComnElevService.java
  30. 26
      pav-server/src/main/java/com/palnet/biz/api/comn/file/controller/ComnFileController.java
  31. 25
      pav-server/src/main/java/com/palnet/biz/api/comn/file/service/ComnFileService.java
  32. 14
      pav-server/src/main/java/com/palnet/biz/api/comn/sms/service/ComnSmsService.java
  33. 67
      pav-server/src/main/java/com/palnet/biz/api/comn/sunriseset/controller/ComnSunrisesetController.java
  34. 15
      pav-server/src/main/java/com/palnet/biz/api/comn/sunriseset/service/ComnSunrisesetService.java
  35. 111
      pav-server/src/main/java/com/palnet/biz/api/ctr/cntrl/controller/CtrCntrlController.java
  36. 4
      pav-server/src/main/java/com/palnet/biz/api/ctr/cntrl/controller/PingController.java
  37. 27
      pav-server/src/main/java/com/palnet/biz/api/ctr/cntrl/controller/SocketReceiverController.java
  38. 36
      pav-server/src/main/java/com/palnet/biz/api/ctr/cntrl/service/CtrCntrlService.java
  39. 10
      pav-server/src/main/java/com/palnet/biz/api/ctr/cntrl/service/SocketReceiverService.java
  40. 56
      pav-server/src/main/java/com/palnet/biz/api/external/controller/ExternalLaancController.java
  41. 1
      pav-server/src/main/java/com/palnet/biz/api/external/service/TsService.java
  42. 240
      pav-server/src/main/java/com/palnet/biz/api/main/dash/controller/MainDashController.java
  43. 91
      pav-server/src/main/java/com/palnet/biz/api/main/dash/service/MainDashService.java
  44. 91
      pav-server/src/main/java/com/palnet/biz/api/main/statistics/controller/MainStatisticsController.java
  45. 8
      pav-server/src/main/java/com/palnet/biz/api/main/statistics/service/MainStatisticsService.java
  46. 1
      pav-server/src/main/java/com/palnet/biz/config/WebSecurityConfig.java
  47. 56
      pav-server/src/main/java/com/palnet/biz/jpa/repository/cns/CnsFaqQueryRepository.java
  48. 85
      pav-server/src/main/java/com/palnet/biz/jpa/repository/cns/CnsQnaQueryRepository.java
  49. 81
      pav-server/src/main/java/com/palnet/biz/jpa/repository/com/ComRiseSetQueryRepository.java
  50. 796
      pav-server/src/main/java/com/palnet/biz/jpa/repository/ctr/CtrCntrlQueryRepository.java
  51. 177
      pav-server/src/main/java/com/palnet/biz/jpa/repository/ctr/CtrCntrlWarnLogQueryRepository.java
  52. 759
      pav-server/src/main/java/com/palnet/biz/jpa/repository/flt/FltPlanQueryRepository.java
  53. 24
      pav-server/src/main/java/com/palnet/biz/jpa/repository/pty/PtyCrtfyhpBasQueryRepository.java
  54. 177
      pav-server/src/main/java/com/palnet/biz/jpa/repository/pty/PtyCstmrQueryRepository.java
  55. 139
      pav-server/src/main/java/com/palnet/biz/jpa/repository/pty/PtyDronQueryRepository.java
  56. 164
      pav-server/src/main/java/com/palnet/biz/jpa/repository/pty/PtyGroupQueryRepository.java
  57. 28
      pav-server/src/main/java/com/palnet/biz/jpa/repository/pty/PtyTermsQueryRepository.java
  58. 8
      pav-server/src/main/java/com/palnet/biz/scheduler/ctr/service/CtrTrnsLctnService.java
  59. 4
      pav-server/src/main/java/com/palnet/comn/code/ErrorCode.java
  60. 15
      pav-server/src/main/java/com/palnet/comn/storage/controller/StorageController.java
  61. 20
      pav-server/src/main/java/com/palnet/comn/storage/service/StorageService.java
  62. 6
      pav-server/src/main/java/com/palnet/comn/utils/DigitalElevationModelUtils.java
  63. 4
      pav-server/src/main/resources/application-database.yml
  64. 3
      pav-server/src/main/resources/application.yml
  65. 2
      pav-server/src/main/resources/config/log/logback-spring.xml
  66. 3
      pav-socket/src/main/java/com/palnet/comn/model/UtmModel.java
  67. 6
      pav-socket/src/main/resources/application.yml
  68. 4
      pav-websocket/src/main/java/com/palnet/server/controller/SocketReceiverController.java
  69. 1
      pav-websocket/src/main/resources/application.yml

13
document/dron_test/pav-utils.js

@ -74,9 +74,10 @@ function calculateHeading(x1, y1, x2, y2) {
var dx = x2 - x1;
var dy = y2 - y1;
var heading = (Math.atan2(dy, dx) * 180) / Math.PI;
if (heading < 0) {
heading += 360;
}
// Ensure heading is within the range [0, 360)
heading = (heading + 360) % 360;
return heading;
}
@ -91,9 +92,9 @@ const dumyData = {
lon: 126.6146,
elevType: 'M',
elev: 125.4,
speedType: 'KM',
speed: 145.8,
heading: 227.94,
speedType: 'm/s',
speed: 40.5,
heading: 0,
terminalRcvDt: '20210629173145',
betteryLevel: 91,
betteryVoltage: 50,

10
document/dron_test/pav-warning.js

@ -10,11 +10,11 @@ const port = 8082;
const prefix = 'PALUTM-';
const pathSampleCoord = [
[37.523771, 126.720982],
[37.524841, 126.723106],
[37.524337, 126.72333],
[37.524841, 126.723106],
[37.523771, 126.720982]
[37.571954, 126.775258],
[37.566375, 126.781266],
[37.562361, 126.783584],
[37.558143, 126.785987],
[37.553039, 126.788819]
];
// const pathSampleCoord = [
// [42.5515, 126.655],

146
pav-server/src/main/java/com/palnet/biz/api/acnt/crtfyhp/controller/AcntCrtfyhpController.java

@ -43,47 +43,65 @@ 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)
public ResponseEntity<? extends BasicResponse> send(String hpno) {
Map<String , Object> resultMap = new HashMap<String,Object>();
Map<String , Object> resultMap = new HashMap<String,Object>(); // 결과 반환을 위한 객체선언
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<Map>(resultMap));
}
/**
* 인증메세지를 받은 사용자가 인증번호를 입력하여 인증처리하는 기능입니다.
* @param hpno
* @param crtfyNo
* @return
*/
@GetMapping(value = "/register/confirm")
@Tag(name = "휴대폰 인증 관리", description = "회원 휴대폰 인증 관련 API")
@ApiImplicitParams({
@ -93,22 +111,25 @@ public class AcntCrtfyhpController {
public ResponseEntity<? extends BasicResponse> confirm(String hpno , String crtfyNo) {
Map<String , Boolean> resultMap = new HashMap<String,Boolean>();
Map<String , Boolean> resultMap = new HashMap<String,Boolean>(); // 결과 반환을 위한 객체선언
if(hpno == null || crtfyNo == null) {
return ResponseEntity.status(HttpStatus.OK)
if(hpno == null || crtfyNo == null) { // hpno[휴대폰번호], crtfyNo[인증번호] 값이 없을 시 서버에서 파라미터가 없다는 "의도적인" 에러 반환
return ResponseEntity.status(HttpStatus.OK)// "의도적인" 에러 반환코드
.body(new ErrorResponse(RSErrorCode.ER_PARAM));
}
try {
boolean result = service.registerConfirm(hpno, crtfyNo);
resultMap.put("result" , result);
try {
boolean result = service.registerConfirm(hpno, crtfyNo); // 휴대폰번호로 전송된 인증번호가 맞는지 확인하는 코드
resultMap.put("result" , result); // 인증성공하면 true
} catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
@ -118,7 +139,12 @@ public class AcntCrtfyhpController {
}
//아이디 찾기 시 인증번호 발송 로직
/**
* 아이디 찾기 인증번호 발송 로직
* @param memberName
* @param hpno
* @return
*/
@GetMapping(value = "/find/sendForId")
@ApiOperation(value = "아이디 찾기 시 인증번호 발송")
@Tag(name = "휴대폰 인증 관리", description = "회원 휴대폰 인증 관련 API")
@ -127,15 +153,15 @@ public class AcntCrtfyhpController {
@ApiImplicitParam(name = "hpno", value = "휴대폰 번호", dataTypeClass = String.class)
})
public ResponseEntity<? extends BasicResponse> sendForId(String memberName, String hpno) {
Map<String, Object> resultMap = new HashMap<String, Object>();
Map<String, Object> resultMap = new HashMap<String, Object>(); // 결과 반환을 위한 객체선언
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 +169,13 @@ public class AcntCrtfyhpController {
resultMap.put("code", 0); //일치하는 회원 존재
}
} catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
@ -150,7 +183,12 @@ public class AcntCrtfyhpController {
return ResponseEntity.ok().body(new SuccessResponse<Map>(resultMap));
}
//아이디 찾기
/**
* 아이디 찾기
* @param memberName
* @param hpno
* @return
*/
@GetMapping(value = "/find/findUserId")
@ApiOperation(value = "회원 아이디 찾기")
@Tag(name = "휴대폰 인증 관리", description = "회원 휴대폰 인증 관련 API")
@ -159,10 +197,10 @@ public class AcntCrtfyhpController {
@ApiImplicitParam(name = "hpno",value = "휴대폰번호", dataTypeClass = String.class)
})
public ResponseEntity<? extends BasicResponse> findUserId(String memberName, String hpno) {
Map<String, Object> resultMap = new HashMap<String, Object>();
Map<String, Object> resultMap = new HashMap<String, Object>(); // 결과 반환을 위한 객체선언
if(memberName == null || hpno == null) {
return ResponseEntity.status(HttpStatus.OK)
if(memberName == null || hpno == null) { // hpno[휴대폰번호]와 memberName[회원이름]이 없을시 서버에서 파라미터가 없다는 "의도적인" 에러 반환
return ResponseEntity.status(HttpStatus.OK) // "의도적인" 에러 반환코드
.body(new ErrorResponse(RSErrorCode.ER_PARAM));
}
@ -184,7 +222,12 @@ public class AcntCrtfyhpController {
return ResponseEntity.ok().body( new SuccessResponse<Map>(resultMap));
}
//비밀번호 찾기 시 인증번호 발송 로직
/**
* 비밀번호 찾기 인증번호 발송 로직
* @param userId
* @param hpno
* @return
*/
@GetMapping(value = "/find/sendForPw")
@ApiOperation(value = "비밀번호 찾기 시 인증번호 발송")
@Tag(name = "휴대폰 인증 관리", description = "회원 휴대폰 인증 관련 API")
@ -195,13 +238,13 @@ public class AcntCrtfyhpController {
public ResponseEntity<? extends BasicResponse> sendForPw(String userId, String hpno) {
Map<String, Object> resultMap = new HashMap<String, Object>();
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 +252,13 @@ public class AcntCrtfyhpController {
resultMap.put("code", 0); //일치하는 회원 존재
}
} catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
@ -217,7 +267,14 @@ public class AcntCrtfyhpController {
return ResponseEntity.ok().body( new SuccessResponse<Map>(resultMap));
}
/**
* 비밀번호 찾기 업데이트
* @param userId
* @param hpno
* @param newPw
* @return
* @throws Exception
*/
@GetMapping(value = "/find/updatePw")
@ApiOperation(value = "비밀번호 찾기 및 업데이트")
@Tag(name = "휴대폰 인증 관리", description = "회원 휴대폰 인증 관련 API")
@ -229,13 +286,13 @@ public class AcntCrtfyhpController {
public ResponseEntity<? extends BasicResponse> updatePw(String userId, String hpno, String newPw) throws Exception {
Map<String, Object> resultMap = new HashMap<String, Object>();
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 +300,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"));

112
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<PtyCrtfyhpBas> entity = query.confirmSms(hpno , crtfyNo);
List<PtyCrtfyhpBas> 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;

114
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<AcntCstmrRsModel>(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<List>(result));
}
/**
* 회원 계정 암호 변경하는 기능,
* AcntCstmrPwModel애 회원이 입력한 기존암호, 변경할 암호값이 있습니다.
* @param rq
* @return
*/
@PostMapping(value = "/profile/pswdupdate")
@ApiOperation(value = "회원 패스워드 변경")
@Tag(name = "회원관리", description = "회원 관련 API")
public ResponseEntity<? extends BasicResponse> passwordupdate(@RequestBody AcntCstmrPwModel rq){
Map<String, Object> resultMap = new HashMap<String, Object>();
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<Map>(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<? extends BasicResponse> extendpsw(@RequestBody Map<String,String> userPswdMap){
Map<String, Object> resultMap = new HashMap<String, Object>();
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<Map>(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<String, Object> resultMap = new HashMap<String, Object>();
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<Map>(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<String, Object> resultMap = new HashMap<String, Object>();
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());

106
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<AnctCstmerRlModel> list(int cstmrSno) {
List<AnctCstmerRlModel> resultList = query.list(cstmrSno);
List<AnctCstmerRlModel> 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<JwtGroupModel> groupInfo = jwtTokenUtil.getGroupAuthByToken();
List<JwtGroupModel> 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<PtyCstmrGroup> cstmrEntity = ptyCstmrGroupRepository.changeGroupJoinYn(group.getGroupId());
List<PtyCstmrGroup> 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<PtyCstmrGroup> 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() );

58
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<? extends BasicResponse> createAuthenticationToken(@RequestBody JwtRqModel authenticationRequest) throws Exception {
// 로그인 프로세스
Map<String , Object> resultMap = service.loginProcess(authenticationRequest);
Map<String , Object> 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<? extends BasicResponse> 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<JwtProfileRsModel>(result));
}
/**
* 회원의 인가정보 유효기간 종료시,
* 다시 인가정보[토큰] 받는 기능
* @param body
* @return
* @throws Exception
*/
@PostMapping(value = "/refresh")
@Tag(name = "JWT 토큰 이용", description = "JWT 토큰 관련 API")
// public ResponseEntity<? extends BasicResponse> refresh(@RequestParam("cstmrSno") int cstmrSno , @RequestParam("refreshToken") String refreshToken) throws Exception{
public ResponseEntity<? extends BasicResponse> 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<JwtRsModel>(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));
}

33
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<PtyCstmrBas> 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);

4
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<JwtGroupModel> getGroupAuthByToken() {
HttpServletRequest rq = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
String token = rq.getHeader("Authorization");

8
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) {

5
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<AcntTermsRsModel> list(AcntTermsRqModel rq) {
return query.list(rq);
}

52
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<AnlsHstryModel> rs = null;
ComnPagingRs<AnlsHstryModel> 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<? extends BasicResponse> log(@PathVariable String id) {
List<AnlsHstryDetailModel> 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"));

49
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<AnlsHstryModel> list(AnlsHstryGroupModel rq){
// 조회에 필요한 기본값 선언
Integer cstmrSno = jwtTokenUtil.getCstmrSnoByToken();
List<JwtGroupModel> groupAuthList = jwtTokenUtil.getGroupAuthByToken();
List<JwtGroupModel> adminAuth = new ArrayList<>();
String groupAuth = null;
String appAuth = jwtTokenUtil.getUserAuthByToken();
// 페이징 처리를 위한 객체 선언
PageImpl<AnlsHstryModel>resultList;
ComnPagingRs<AnlsHstryModel> 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<ComIdntfBas> idntfList = comIdntBasRepository.findIdntfNumber(cstmrSno);
List<FltPlanBas> basResult = fltPlanBasRepository.findByPlanSno(cstmrSno);
List<FltPlanPilot> pilotList = fltPlanPilotRepository.findByPlanSno(cstmrSno);
List<ComIdntfBas> idntfList = comIdntBasRepository.findIdntfNumber(cstmrSno); // 회원 고유번호와 맞는 기체 고유번호 조회
List<FltPlanBas> basResult = fltPlanBasRepository.findByPlanSno(cstmrSno); // 회원 고유번호와 맞는 비행계획서 조회
List<FltPlanPilot> pilotList = fltPlanPilotRepository.findByPlanSno(cstmrSno); // 회원 고유번호와 맞는 조종사 조회
List<FltPlanBas> 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<CtrCntrlBas> optional = ctrCntrlBasRepository.findById(cntrlId);
Optional<CtrCntrlBas> 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<AnlsHstryDetailModel> hstryList(@PathVariable String id) {
List<AnlsHstryDetailModel> result = query.listCntrlHstryPage(id);

54
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"));

20
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<AnlsHstryDetailModel> histList(String id){
// 비행ID[CNTRL_ID]로 비행이력을 데이터베이스에서 조회함.
List<AnlsHstryDetailModel> resultList = query.listCntrlHstry(id);
//정렬 순서 뒤집기 처리
@ -138,14 +140,13 @@ public class AnlsSmltService {
/**
* 통계 데이터 조회
* 통계 데이터 조회하는 기능
* @param rq
* @return
*/
public List<AnlsSmltStcsModel> stcsList(String id){
List<AnlsSmltStcsModel> result = query.anlsSmltStcs(id);
List<AnlsSmltStcsModel> 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<CtrCntrlBas> optional = ctrCntrlBasRepository.findById(cntrlId);
//

136
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<? extends BasicResponse> list(BasDronRqModel rq) {
ComnPagingRs<BasDronModel> 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<? extends BasicResponse> mylist(@PathVariable Integer id) {
List<BasIdntfModel> 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<String , Object> resultMap = new HashMap<String,Object>();
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<Map>(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<Map>(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<String , Object> resultMap = new HashMap<String,Object>();
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<Map>(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"));

36
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<BasDronModel> response = new ComnPagingRs<>();
// 페이징 처리를 위한 객체
Pageable pageable = PageRequest.of(rq.getPage()-1, rq.getRecord());
// 데이터 베이스에서 검색조건에 맞는 값으로 드론목록 조회함.
PageImpl<BasDronModel> 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<ComIdntfBas> 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{

268
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;
@ -78,9 +79,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<Object> findAirSpace() throws IOException, ParseException {
// 1. file read
Resource resource = new ClassPathResource("air/airgeo.json");
InputStream jsonInputStream = resource.getInputStream();
@ -102,7 +110,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 +123,15 @@ public class BasFlightController {
ComnPagingRs<BasFlightPlanModel> 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 +140,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 +153,15 @@ public class BasFlightController {
public ResponseEntity<? extends BasicResponse> 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 +170,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<? extends BasicResponse> createPlan(@RequestBody BasFlightPlanModel rq) {
Map<String, Object> resultMap = new HashMap<String, Object>();
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<Map>(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 +218,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<? extends BasicResponse> updatePlan(@RequestBody BasFlightPlanModel rq) {
Map<String, Object> resultMap = new HashMap<String, Object>();
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<Map>(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 +263,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 +276,30 @@ public class BasFlightController {
public ResponseEntity<? extends BasicResponse> deletePlan(@PathVariable("planSno") Integer planSno) {
Map<String, Object> resultMap = new HashMap<String, Object>();
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<Map>(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 +308,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 +321,16 @@ public class BasFlightController {
public ResponseEntity<? extends BasicResponse> findPilot(@PathVariable("groupId") String groupId) {
List<BasFlightPlanPilotModel> 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 +340,12 @@ public class BasFlightController {
}
// 그룹 기체 조회
/**
* 그룹 기체 조회하는 기능,
* 그룹아이디[groupId] 조회함.
* @param groupId
* @return
*/
@GetMapping(value = "/plan/arcrft/{groupId}")
@ApiOperation(value = "그룹의 기체 조회")
@Tag(name = "비행계획서", description = "비행계획서 관련 API")
@ -243,8 +353,15 @@ public class BasFlightController {
public ResponseEntity<? extends BasicResponse> findArcrft(@PathVariable("groupId") String groupId) {
List<BasFlightPlanArcrftModel> 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 +371,26 @@ public class BasFlightController {
}
// 비행 구역 버퍼 존 생성
/**
* 비행 구역 버퍼 생성하는 기능
* @param rq
* @return
*/
@PostMapping("/plan/area/buffer")
@ApiOperation(value = "비행 구역 버퍼 존 생성")
@Tag(name = "비행계획서", description = "비행계획서 관련 API")
public ResponseEntity<? extends BasicResponse> findBuffer(@RequestBody List<BasFlightPlanAreaModel> rq) {
List<BasFlightPlanAreaModel> 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 +399,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 +411,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 +429,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<? extends BasicResponse> findAprvList(BasFlightPlanListRq rq) {
ComnPagingRs<BasFlightPlanModel> 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 +458,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<? extends BasicResponse> updateAprvProc(@RequestBody BasFlightAprovRq rq) {
Map<String, Object> resultMap = new HashMap<String, Object>();
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<Map>(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 +503,27 @@ public class BasFlightController {
}
/**
* 비행경로 체크하는 기능.
* @param rq
* @return
*/
@PostMapping("/airspace/contains")
@Tag(name = "비행계획서", description = "비행계획서 관련 API")
public ResponseEntity<? extends BasicResponse> checkAirspaceContains(@RequestBody List<BasFlightPlanAreaModel> rq) {
Map<String, Object> resultMap = new HashMap<String, Object>();
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 +533,12 @@ public class BasFlightController {
}
//지역 검색
/**
* 지역 검색하는 기능.
* @param query
* @return
* @throws ParseException
*/
@GetMapping("/plan/area/search")
@ApiOperation(value = "지역 검색")
@Tag(name = "비행계획서", description = "비행계획서 관련 API")
@ -358,6 +547,7 @@ public class BasFlightController {
try {
text = URLEncoder.encode(query, "UTF-8");
} catch (UnsupportedEncodingException e) {
// UTF-8 포맷팅으로 인코딩 실패시 에러 던짐
throw new RuntimeException("검색어 인코딩 실패", e);
}
@ -373,6 +563,12 @@ public class BasFlightController {
return ResponseEntity.ok().body(new SuccessResponse<>(obj));
}
/**
* 비행계획서 스케줄 검색하는 기능,
* 검색일[searchDate] 조건으로 조회함.
* @param searchDate
* @return
*/
@GetMapping("/schedule")
@Tag(name = "비행계획서", description = "비행계획서 관련 API")
public ResponseEntity<? extends BasicResponse> findSchedule(@RequestParam("searchDate") String searchDate) {
@ -380,9 +576,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"));
@ -391,10 +594,15 @@ public class BasFlightController {
return ResponseEntity.ok().body(new SuccessResponse<List>(response));
}
// @PostMapping("/coord")
// public JSONObject coordTest(@RequestBody Coordinate coordinate) throws IOException, ParseException {
//
// return FlightUtils.getCoordinateGis(coordinate);
//
// }
@PostMapping("/adex/buffer")
public List<Coordinate> adexBuffer(@RequestBody BasFlightCoordModel model) {
List<Coordinate> transCoordList = utils.transform(model.getCoordinates(), "EPSG:4326", "EPSG:5181");
List<Coordinate> bufferList = utils.buffer(transCoordList, model.getBuffer()); // buffer 영역 생성
List<Coordinate> transBufferList = utils.transform(bufferList, "EPSG:5181", "EPSG:4326"); // buffer 영역 좌표계 변환
return transBufferList;
}
}

15
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<Coordinate> coordinates;
private Double buffer;
}

103
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<BasFlightPlanModel> listPlan(BasFlightPlanListRq rq) {
List<BasGroupJoinModel> groupList = ptyPlanQueryRepository.joinList(rq.getCstmrSno());
String userAccount = null;
@ -97,8 +101,11 @@ public class BasFlightService {
} else {
masterAccount = "NORMAL";
}
// 데이터베이스에서 조건에 따라 비행계획서를 조회함.
PageImpl<BasFlightPlanModel> 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<BasFlightPlanPilotModel> listPilotByGroup(String groupId) {
List<BasFlightPlanPilotModel> pilotList = fltPlanQueryRepository.listPilot(groupId);
@ -493,7 +524,11 @@ public class BasFlightService {
return pilotList;
}
// 그룹 기체 조회
/**
* 그룹아이디[groupId] 그룹 기체 조회하는 기능.
* @param groupId
* @return
*/
public List<BasFlightPlanArcrftModel> listArcrftByGroup(String groupId) {
List<BasFlightPlanArcrftModel> arcrftModels = fltPlanQueryRepository.listArcrft(groupId);
@ -502,7 +537,11 @@ public class BasFlightService {
return arcrftModels;
}
// 비행 구역 buffer zone
/**
* 비행 구역 buffer zone 생성하는 기능.
* @param rq
* @return
*/
public List<BasFlightPlanAreaModel> getBuffer(List<BasFlightPlanAreaModel> rq) {
for (BasFlightPlanAreaModel area : rq) {
@ -523,7 +562,11 @@ public class BasFlightService {
return rq;
}
// 비행계획서 리스트(승인)
/**
* 비행계획서 리스트(승인) 조회하는 기능.
* @param rq
* @return
*/
public ComnPagingRs<BasFlightPlanModel> 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<BasFlightPlanModel> result = fltPlanQueryRepository.aprvList(rq, masterAccount, pageable);
PageImpl<BasFlightPlanModel> 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<BasFlightPlanAreaModel> rq) {
boolean result = false;
@ -599,7 +653,12 @@ public class BasFlightService {
}
//지역 검색
/**
* 지역 검색하는 기능
* @param apiUrl
* @param requestHeaders
* @return
*/
public String searchArea(String apiUrl, Map<String, String> requestHeaders) {
HttpURLConnection con = connect(apiUrl);
try {
@ -649,6 +708,11 @@ public class BasFlightService {
}
}
/**
* 검색날짜 조건으로 비행스케줄 조회하는 기능.
* @param searchDate
* @return
*/
public List<BasFlightScheduleRs> findSchecdule(String searchDate) {
List<BasFlightScheduleRs> 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);

129
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<String , Object> resultMap = new HashMap<String,Object>();
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<? extends BasicResponse> mylist(Integer cstmrSno) {
List<BasGroupModel> 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<BasGroupJoinModel> 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<BasGroupJoinModel> 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<BasGroupModel> 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<String , Object> resultMap = new HashMap<String,Object>();
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<String , Object> resultMap = new HashMap<String,Object>();
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<String , Object> resultMap = new HashMap<String,Object>();
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"));

31
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<BasGroupModel> mylist(int cstmrSno){
public List<BasGroupModel> mylist(int cstmrSno){
List<BasGroupModel> resultList = query.mylist(cstmrSno);
List<BasGroupModel> resultList = query.mylist(cstmrSno); // 데이터베이스에서 cstmrSno에 맞춰 내가 만든 그룹을 조회하는 기능.
return resultList;
}
/**
* 그룹 목록
* 그룹 목록조회하는 기능.
* @param cstmrSno
* @return
*/
@ -81,7 +83,7 @@ public class BasGroupService {
String appAuth = jwtTokenUtil.getUserAuthByToken();
List<BasGroupJoinModel> 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<BasGroupModel> list(BasGroupRqModel rq){
List<BasGroupModel> resultList = query.list(rq);
List<BasGroupModel> 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

36
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,13 +669,14 @@ public class BasLaancService {
.confirmKey(confirmKey)
.status("GENERATED")
.targetType("TS_QRCODE")
.rqData(jsonParams)
.rqData(params)
.createUserId(userId)
.updateUserId(userId)
.build();
comConfirmBasRepository.save(comConfirmBas);
log.info(">>> confirmKey [GENERATED] ", confirmKey);
return BasLaancQrcodeRs.builder()
.qrcode(qr)
.confirmKey(confirmKey)
@ -664,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코드 조회 실패");
@ -676,13 +698,13 @@ 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);
comConfirmBasRepository.save(entity);
comConfirmBasRepository.flush();
throw new CustomException(ErrorCode.FAIL, "QR 기간 만료");
throw new CustomException(ErrorCode.QR_EXPIRED, "QR 기간 만료");
}
PilotValidRs rs = null;

119
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<? extends BasicResponse> getFaqList(FaqListRQModel model) {
List<FaqListModel> result = null;
try {
result = service.getFaqList(model);
result = service.getFaqList(model); // FaQ 항목들 조회하는 기능
} catch (CustomException e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* CustomException은 개발자가 "의도적으로" 예외처리,
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
Map<String, Object> 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<? extends BasicResponse> 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<String, Object> 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<? extends BasicResponse> 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<String, Object> 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<? extends BasicResponse> 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<String, Object> 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<? extends BasicResponse> deleteFaq(@PathVariable("sno") int sno) {
// TODO 성공/실패 상태값 전송
try {
service.deleteFaq(sno);
service.deleteFaq(sno); // 일련번호[sno]로 삭제하는 기능
} catch (CustomException e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
Map<String, Object> 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"));

26
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<FaqListModel> getFaqList(FaqListRQModel model){
List<FaqListModel> 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 반환값이 실행한 갯수인지 확인 필요

159
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<? extends BasicResponse> 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<String, Object> 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<QnaBasModel> result = new ArrayList<>();
try {
result = cnsQnaService.selectQnaList(rq);
result = cnsQnaService.selectQnaList(rq); // Qna리스트 조회하는 기능
} catch (CustomException e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* CustomException은 개발자가 "의도적으로" 예외처리,
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
Map<String, Object> 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<String, Object> 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<? extends BasicResponse> 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<String, Object> 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<? extends BasicResponse> 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<String, Object> 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<String, Object> 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<String, Object> 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"));

33
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<Integer> prevFileSnoList = new ArrayList<>();
List<Integer> currentFileSnoList = new ArrayList<>();
if (entity.getFileGroupNo() != null) {
List<ComnFileModel> prevFileInfos = comnFileService.getNormalFileListByGroupNo(entity.getFileGroupNo());
List<ComnFileModel> 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<ComnFileModel> 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<QnaBasModel> 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);

66
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<ComnElevRs> 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<String, Object> 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<ComnElevRs> 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<String, Object> 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<ComnElevRs> 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<String, Object> 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"));

20
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<ComnElevRs> getGroundElev(List<ComnGroundElevRq> rq) {
DigitalElevationModelUtils demUtils = DigitalElevationModelUtils.getInstance();
List<ComnElevRs> 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<ComnElevRs> convertMslToAgl(List<ComnElevRq> rq) {
DigitalElevationModelUtils demUtils = DigitalElevationModelUtils.getInstance();
List<ComnElevRs> rs = rq.stream().map(elev -> {
@ -52,7 +60,11 @@ public class ComnElevService {
return rs;
}
// agl 기준 고도 > msl 기준 고도 변환
/**
* agl 기준 고도 > msl 기준 고도 변환하는 기능.
* @param rq
* @return
*/
public List<ComnElevRs> convertAglToMsl(List<ComnElevRq> rq) {
DigitalElevationModelUtils demUtils = DigitalElevationModelUtils.getInstance();
List<ComnElevRs> rs = rq.stream().map(elev -> {

26
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);
}
}

25
pav-server/src/main/java/com/palnet/biz/api/comn/file/service/ComnFileService.java

@ -146,20 +146,19 @@ public class ComnFileService {
}
/**
* 파일 다운로드
*
* 파일 일련번호[fileSno] 파일 다운로드하는 기능.
* @param fileSno
*/
public void fileDownload(int fileSno) {
ComFileBas comFileBas = comFileBasRepository.findById(fileSno).orElse(null);
ComFileBas comFileBas = comFileBasRepository.findById(fileSno).orElse(null); // 파일정보를 데이터베이스에서 조회함.
if (comFileBas == null) throw new CustomException(ErrorCode.DATA_NOTFIND);
InputStream inputStream = null;
OutputStream outputStream = null;
try {
File pdfFile = new File(comFileBas.getFilePath() + comFileBas.getFileSaveNm());
File pdfFile = new File(comFileBas.getFilePath() + comFileBas.getFileSaveNm()); // 파일경로에 맞춰 파일데이터를 PC에서 가져옴
inputStream = new FileInputStream(pdfFile);
String fileOriName = comFileBas.getFileOriNm();
@ -176,7 +175,8 @@ public class ComnFileService {
byte[] buffer = new byte[1024]; //1KB 설정
int length;
while ((length = inputStream.read(buffer)) != -1) {
// 요청한 사용자에게 파일데이터 전송
while ((length = inputStream.read(buffer)) != -1) {
outputStream.write(buffer);
}
@ -185,6 +185,7 @@ public class ComnFileService {
} catch (IOException e) {
e.printStackTrace();
} finally {
// INPUT, OUTPUT의 열어놨던 스트림들을 최종적으로 모두 닫음
try {
if (outputStream != null) {
Objects.requireNonNull(outputStream).flush();
@ -351,6 +352,13 @@ public class ComnFileService {
return true;
}
/**
* 파일일련번호 배열로 삭제처리 진행함.
* @param fileSnoList
* @return
*/
// @Transactional는 데이터베이스의 정합성을 위해 사용합니다, 추가 수정 삭제 등에서 사용합니다, 이 기능에서는 삭제컬럼은 수정했기 때문에 사용했습니다.
@Transactional
public boolean deleteFiles(List<Integer> fileSnoList){
@ -389,6 +397,11 @@ public class ComnFileService {
return true;
}
/**
* 파일그룹번호[fileGroupNo] 해당하는 파일등 모두 가져오는 기능.
* @param fileGroupNo
* @return
*/
public List<ComnFileModel> getNormalFileListByGroupNo(Integer fileGroupNo) {
List<ComFileBas> files = comFileBasRepository.findByFileGroupNoAndDelYn(fileGroupNo, "N");
List<ComnFileModel> result = new ArrayList<>();

14
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();

67
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<ComnSunrisesetRs> 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<String, Object> resultMap = new HashMap<String, Object>();
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<Map>(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<String, Object> resultMap = new HashMap<String, Object>();
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<Map>(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<String, Object> resultMap = new HashMap<String, Object>();
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<Map>(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"));

15
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<ComnSunrisesetRs> 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<ComnSunrisesetRs> getSunRiseSetByCoord(ComnSunrisesetCoordRq rq) {
if(rq == null || !rq.hasCoord()) throw new CustomException(ErrorCode.NON_VALID_PARAMETER);
return comRiseSetQueryRepository.findAllBySearchCoordTransform(rq);

111
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;
@ -36,7 +37,7 @@ public class CtrCntrlController {
}
/**
* TODO 드론 관제 이력 목록 (Socket 분리 )
* TODO 드론 관제 이력 목록 (Socket 분리 ) 조회하는 기능.
*
* @param id - 관제 ID
* @return
@ -49,9 +50,16 @@ public class CtrCntrlController {
List<GPHistoryModel> 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 +69,8 @@ public class CtrCntrlController {
}
/**
* TODO 드론 관제 상세 정보
*
* TODO 드론 관제 상세 정보 조회 기능,
* 관제ID[controlId] 조회하여 확인함
* @param id - 관제 ID
* @return
*/
@ -74,9 +82,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 +114,15 @@ public class CtrCntrlController {
List<GPHistoryModel> 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 +130,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<? extends BasicResponse> 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,12 +173,19 @@ public class CtrCntrlController {
List<CtrCntrlGroupArcrftModel> 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"));
}
}
return ResponseEntity.ok().body(new SuccessResponse<List>(list));
}
@ -162,6 +206,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 +237,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 +268,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 +297,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 +326,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 +358,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 +386,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"));

4
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";

27
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<String> asyncReceiver(@RequestBody GPModel model) {
return () -> {
@ -48,10 +61,16 @@ public class SocketReceiverController {
};
}
/**
* 소켓에서 날아오는 데이터를 데이터베이스에 저장시키는 기능,
* 한번에 많은 관제아이디를 저장시키기 위해 사용하는 기능.
* @param models
* @return
*/
@PostMapping("/receiver/all")
public ResponseEntity<?> receiver(@RequestBody Map<String, List<GPModel>> models) {
// System.out.println("socket message : " + models);
socketReceiverService.insertAll(models);
socketReceiverService.insertAll(models); // 한번에 많은 데이터를 데이터베이스에 저장하는 기능
return ResponseEntity.ok().build();
}
}

36
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<GPHistoryModel> getListHistory(String objectId) {
List<GPHistoryModel> filterList = new ArrayList<GPHistoryModel>();
@ -92,7 +98,7 @@ public class CtrCntrlService {
}
/**
* TODO 관제 상세 조회
* TODO 관제 상세 조회하는 기능.
*
* @param controlId
* @return
@ -107,16 +113,17 @@ public class CtrCntrlService {
List<CtrCntrlHstryArea> 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")) {
@ -609,6 +616,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);

10
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<String, List<GPModel>> models) {
// TODO 일괄 처리 필요

56
pav-server/src/main/java/com/palnet/biz/api/external/controller/ExternalLaancController.java vendored

@ -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<String, String> error = new HashMap<>();
error.put("rspCode", "300");
@ -75,22 +75,56 @@ public class ExternalLaancController {
Map<String, String> 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<String, String> 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<String, String> 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<String, String> 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<String, String> 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<String, String> successRs = new HashMap<>();
successRs.put("rspCode", ErrorCode.TS_SUCCESS.code().replaceAll("TS", ""));
successRs.put("rspMessage", ErrorCode.TS_SUCCESS.message());
return ResponseEntity.ok().body(successRs);
}
}

1
pav-server/src/main/java/com/palnet/biz/api/external/service/TsService.java vendored

@ -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);

240
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<? extends BasicResponse> stcsArea(String yyyymm) {
List<MainDashStcsModel> 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<? extends BasicResponse> groupList(Integer cstmrSno) {
List<Map> 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<? extends BasicResponse> arcrftList(Integer cstmrSno) {
List<MainDashListModel> 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<MainDashStcsModel> 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<List<MainDashStcsModel>>(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<MainDashStcsModel> 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<List<MainDashStcsModel>>(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<? extends BasicResponse> droneFlightStatistics(String date, @RequestParam(required = true) String idntfNum, @PathVariable String type){
log.info("idntfNum -> {}", idntfNum);
public ResponseEntity<? extends BasicResponse> 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<MainDashStcsModel> 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<List<MainDashStcsModel>>(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<MainDashStcsModel> 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<List<MainDashStcsModel>>(result));
}
/**
* 드론 비행 현황 통계 기능.
* @return
*/
@GetMapping(value = "/stcs/dron-flight")
@ApiOperation(value = "드론 비행 현황")
@Tag(name = "메인화면 컨트롤러", description = "메인화면 관련 API")
@ -306,8 +407,15 @@ public class MainDashController {
Map<String, String> 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<String, String>>(result));
}
/**
* 드론 비행운항 목록 조회하는 기능.
* @param serviceType
* @return
*/
@GetMapping(value = "/dron-flight/list")
@ApiOperation(value = "드론 별 비행운항 목록")
@Tag(name = "메인화면 컨트롤러", description = "메인화면 관련 API")
@ -324,8 +437,15 @@ public class MainDashController {
List<MainDashFlightListModel> 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<List<MainDashFlightListModel>>(result));
}
/**
* 일일 비정상상황에 대한 통계 기능.
* @param serviceType
* @return
*/
@GetMapping("/current/flight-warn")
@ApiOperation(value = "일일 비정상상황 통계")
@Tag(name = "메인화면 컨트롤러", description = "메인화면 관련 API")
@ -345,8 +470,15 @@ public class MainDashController {
List<MainDashWarnNumStcsModel> 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<List<MainDashWarnNumStcsModel>>(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<List<MainDashPlanNumStcsModel>>(result));
}
/**
* 일일 비행건수 현황 통계기능.
* @return
*/
@GetMapping("/stcs/dailyflight")
@ApiOperation(value = "일일 비행건수 현황")
@Tag(name = "메인화면 컨트롤러",description = "메인화면 관련 API")
public ResponseEntity<? extends BasicResponse> getDailyFlightNumOfStcs(){
List<MainDashFlightNumStcsModel> 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"));
}

91
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<Map> mainDashGroupList(int cstmrSno){
@ -113,7 +115,7 @@ public class MainDashService {
/**
* Top3 기체 정보 리스트 표출
* Top3 기체 정보 리스트 조회하는 기능.
*/
public List<MainDashListModel> mainDashDronList(int cstmrSno){
List<MainDashListModel> resultList = ptyDronQueryRepository.dronTop3(cstmrSno);
@ -122,8 +124,9 @@ public class MainDashService {
/**
* 김포공항, 날짜별 통계
* @param yyyymm
* 김포공함, 날짜별 비행실적 통계
* @param date
* @param formatParam
* @return
*/
public List<MainDashStcsModel> mainKacDashStcsDay(String date, String[] formatParam){
@ -133,27 +136,38 @@ public class MainDashService {
return resultList;
}
public List<MainDashFlightListModel> mainDashDronFlightList(String serviceType) throws Exception{
String cptAuth = token.getCptAuthCodeByToken();
List<MainDashFlightListModel> resultList = new ArrayList<MainDashFlightListModel>();
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<MainDashFlightListModel> mainDashDronFlightList(String serviceType) throws Exception{
String cptAuth = token.getCptAuthCodeByToken();
List<MainDashFlightListModel> resultList = new ArrayList<MainDashFlightListModel>();
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<String, String> 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<MainDashPlanNumStcsModel> 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<MainDashWarnNumStcsModel> currentFlightWarn(String serviceType){
// boolean authCheck = mainStatisticsService.authCheck(groupId);
@ -361,7 +381,7 @@ public class MainDashService {
for(String cate : dateCate){
List<CtrCntrlWarnLog> 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<MainDashFlightNumStcsModel> dailyFlightNumOfStcs() {
// SUPER 권한일 경우와 KAC의 기관코드일 경우 전체적으로 모니터링 가능해야한다. 그외는 자신의 기관에 해당하는 데이터 볼 수 있어야 한다.

91
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<FlightStcsValueModel> 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<List<FlightStcsValueModel>>(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<? extends BasicResponse> 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<FlightStcsValueModel> graphData = service.fltStatics(rq, formatParam);
List<FlightStcsValueModel> topData = service.fltTopStatics(rq, formatParam);
List<FlightStcsValueModel> graphData = service.fltStatics(rq, formatParam); // 비행통계 기능
List<FlightStcsValueModel> 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<FlightStcsModel>(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<List<FlightStcsValueModel>>(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<FlightStcsModel>(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<List<FlightStcsValueModel>>(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"));

8
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<FlightStcsValueModel> getFlightStaticStcs(String serviceType){
@ -426,6 +426,12 @@ public class MainStatisticsService {
return resultList;
}
/**
* 비행실적 TOP 5 기체정보 조회하는 기능.
* @param rq
* @param formatParam
* @return
*/
public List<FlightStcsValueModel> getFltTopResultStcs(FlightStcsRQ rq, String[] formatParam){
List<FlightStcsValueModel> resultList = null;

1
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 */

56
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<FaqListModel> 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<FaqListModel> 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,

85
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<QnaBasModel> 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<QnaBasModel> 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<QnaBasModel> r = query
.select(Projections.bean(
QnaBasModel.class,

81
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<ComnSunrisesetRs> 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<ComnSunrisesetRs> 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<ComnSunrisesetRs> 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<ComnSunrisesetRs> rs = query.select(Projections.bean(
ComnSunrisesetRs.class,
bas.id.locDate,

796
pav-server/src/main/java/com/palnet/biz/jpa/repository/ctr/CtrCntrlQueryRepository.java

File diff suppressed because it is too large Load Diff

177
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<FlightStcsValueModel> 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<FlightStcsValueModel> 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<FlightStcsValueModel> result = query
.select(
Projections.bean(FlightStcsValueModel.class,
@ -284,6 +430,12 @@ public class CtrCntrlWarnLogQueryRepository {
return result;
}
/**
* 카테고리[cate] 일일비정상황황에 대한 통계값을 구하는 SQL 기능.
* @param groupId
* @param cate
* @return
*/
public List<CtrCntrlWarnLog> currentStcs(String groupId, String cate){
QFltPlanBas qFltPlanBas = QFltPlanBas.fltPlanBas;
QFltPlanCtrCntrlRel qFltPlanCtrCntrlRel = QFltPlanCtrCntrlRel.fltPlanCtrCntrlRel;
@ -291,6 +443,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<CtrCntrlWarnLog> stcsValues = query
.select(
Projections.bean(
@ -310,6 +476,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();

759
pav-server/src/main/java/com/palnet/biz/jpa/repository/flt/FltPlanQueryRepository.java

File diff suppressed because it is too large Load Diff

24
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<PtyCrtfyhpBas> 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<PtyCrtfyhpBas> entity =
query.select(qEntity).from(qEntity)
.where(builder)
@ -43,5 +59,5 @@ public class PtyCrtfyhpBasQueryRepository {
return entity;
}
}

177
pav-server/src/main/java/com/palnet/biz/jpa/repository/pty/PtyCstmrQueryRepository.java

@ -26,6 +26,13 @@ public class PtyCstmrQueryRepository {
private final JPAQueryFactory query;
/**
* 입력받은 회원 아이디가 데이터베이스에 있는지 조회하는 SQL기능.
* ID가 있으면 중복되는 , true 반환
* ID가 없으면 중복되지 않는 , false 반환
* @param userId
* @return
*/
public boolean findCstmrByUserId(String userId) {
boolean result = false;
@ -38,6 +45,15 @@ public class PtyCstmrQueryRepository {
builder.and(basEntity.cstmrStatusCd.eq("A")); //활성화 상태
builder.and(basEntity.userId.eq(userId));
/**
* 회원 아이디[USER_ID],
* 회원활성화 여부[CSTMR_STATUS_CD] 값이 조건에 맞으면 회원정보를 가져오는 SQL입니다.
* SELECT
* *
* FROM PTY_CSTMR_BAS PCB
* WHERE PCB.CSTMR_STATUS_CD = 'A'
* AND PCB.USER_ID = #{id}
*/
PtyCstmrBas entity = query.select(basEntity)
.from(basEntity)
.where(builder)
@ -49,24 +65,49 @@ public class PtyCstmrQueryRepository {
return result;
}
/**
* 회원 이름과 휴대폰번호로 데이터 베이스에서 회원정보 찾는 SQL 기능
* @param name
* @param hpno
* @return
*/
public boolean certifNum(String name, String hpno) {
QPtyCstmrDtl dtl = QPtyCstmrDtl.ptyCstmrDtl;
QPtyCstmrDtl dtl = QPtyCstmrDtl.ptyCstmrDtl; // PTY_CSTMR_DTL - 고객 상세 테이블
// 데이터베이스 조건 문을 주는 코드
BooleanBuilder builder = new BooleanBuilder();
builder.and(dtl.hpno.eq(hpno));
builder.and(dtl.memberName.eq(name));
builder.and(dtl.hpno.eq(hpno)); // 휴대폰 번호가 맞는지 조건추가
builder.and(dtl.memberName.eq(name)); // 회원이름이 맞는지 조건추가
/**
* 휴대폰 번호와 이름으로 데이터베이스에서 회원정보를 가져오는 SQL 입니다.
*
* SELECT
* *
* FROM PTY_CSTMR_DTL PCD
* WHERE PCD.HPNO = #{hpno}
* AND PCD.MEMBER_NAME = #{name}
*/
PtyCstmrDtl entity = query.select(dtl)
.from(dtl)
.where(builder)
.fetchFirst();
boolean result = false;
if (entity != null) {
result = true;
}
return result;
}
/**
* 회원명과 암호화된 휴대폰 번호로 ID찾는 SQL 기능
* @param name
* @param hpno
* @return
*/
public String findUserId(String name, String hpno) {
QPtyCstmrBas bas = QPtyCstmrBas.ptyCstmrBas;
QPtyCstmrDtl dtl = QPtyCstmrDtl.ptyCstmrDtl;
@ -75,6 +116,20 @@ public class PtyCstmrQueryRepository {
builder.and(bas.cstmrStatusCd.eq("A"));
builder.and(dtl.hpno.eq(hpno));
builder.and(dtl.memberName.eq(name));
/**
* 회원상태 활성화 여부[CSTMR_STATUS_CD],
* 휴대폰 번호 [HPNO],
* 회원 이름 [MEMBER_NAME] 으로 회원정보를 찾는 SQL 입니다.
* SELECT
* *
* FROM PTY_CSTMR_BAS PCB
* LEFT OUTER JOIN PTY_CSTMR_DTL PCD
* ON PCB.CSTMR_SNO = PCD.CSTMR_SNO
* WHERE PCB.CSTMR_STATUS_CD = 'A'
* AND PCD.HPNO = #{hpno}
* AND PCD.MEMBER_NAME = #{name}
*/
PtyCstmrBas entity = query.select(bas)
.from(bas)
.leftJoin(dtl)
@ -86,6 +141,12 @@ public class PtyCstmrQueryRepository {
return userId;
}
/**
* 회원 ID와 휴대폰번호[hpno] 일치한지 확인하는 SQL기능
* @param id
* @param hpno
* @return
*/
public PtyCstmrBas findUserPw(String id, String hpno) {
QPtyCstmrBas bas = QPtyCstmrBas.ptyCstmrBas;
QPtyCstmrDtl dtl = QPtyCstmrDtl.ptyCstmrDtl;
@ -94,6 +155,20 @@ public class PtyCstmrQueryRepository {
builder.and(bas.cstmrStatusCd.eq("A"));
builder.and(dtl.hpno.eq(hpno));
builder.and(bas.userId.eq(id));
/**
* 회원 아이디[USER_ID],
* 회원활성화 여부[CSTMR_STATUS_CD],
* 휴대폰번호 [HPNO] 값이 조건에 맞으면 회원 정보를 가져오는 SQL입니다.
* SELECT
* *
* FROM PTY_CSTMR_BAS PCB
* LEFT OUTER JOIN PTY_CSTMR_DTL PCD
* ON PCB.CSTMR_SNO = PCD.CSTMR_SNO
* WHERE PCB.CSTMR_STATUS_CD = 'A'
* AND PCD.HPNO = #{hpno}
* AND PCB.USER_ID = #{id}
*/
PtyCstmrBas entity = query.select(bas)
.from(bas)
.leftJoin(dtl)
@ -104,27 +179,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) {
@ -187,6 +279,11 @@ public class PtyCstmrQueryRepository {
}
/**
* cstmrSno 값으로 회원정보를 조회하는 SQL 기능.
* @param cstmrSno
* @return
*/
public JwtProfileRsModel findUserProfile(int cstmrSno) {
QPtyCstmrBas basEntity = QPtyCstmrBas.ptyCstmrBas;
QPtyCstmrDtl dtlEntity = QPtyCstmrDtl.ptyCstmrDtl;
@ -195,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,
@ -241,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)
@ -264,11 +390,34 @@ public class PtyCstmrQueryRepository {
} else {
return null;
}
}
}
/**
* 회원 고유번호로 데이터베이스에서 회원정보를 조회하는 SQL 기능.
* @param cstmrSno
* @return
*/
public List<AnctCstmerRlModel> 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<AnctCstmerRlModel> list = query
.select(Projections.bean(
AnctCstmerRlModel.class,

139
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<BasDronModel> 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<BasDronModel> 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<BasIdntfModel> 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,
@ -305,14 +400,38 @@ public class PtyDronQueryRepository{
}
/***
* 메인 대시보드 기체 정보 3건 표출
*/
/**
* 최근 등록한 기체 정보 3건 조회하는 SQL 기능.
* @param cstmrSno
* @return
*/
public List<MainDashListModel> 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<MainDashListModel> result =
query.select(Projections.bean(MainDashListModel.class ,
bas.arcrftModelNm,

164
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<BasGroupModel> 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<BasGroupModel> 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<BasGroupModel> 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<BasGroupJoinModel> 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<BasGroupUserModel> 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<BasGroupJoinModel> 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<BasGroupJoinModel> 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<BasGroupJoinModel> result =
query.select(Projections.bean(BasGroupJoinModel.class ,
bas.groupId,
@ -665,6 +788,12 @@ public class PtyGroupQueryRepository{
}
return cnt;
}
/**
* 최근 가입된 순으로 3개 그룹 조회하는 SQL 기능.
* @param cstmrSno
* @return
*/
public List<BasGroupModel> groupTop3(int cstmrSno){
QPtyGroupBas bas = QPtyGroupBas.ptyGroupBas;
@ -674,7 +803,24 @@ public class PtyGroupQueryRepository{
builder.and(bas.useYn.eq("Y"));
builder.and(dtl.cstmrSno.eq(cstmrSno));
builder.and(dtl.groupAuthCd.eq("MASTER"));
/**
* 사용여부[useYn] 'Y' 인지,
* 회원고유번호[cstmrSno] 조건인지,
* 그룹권한코드[groupAuthCd] 'MASTER' 인지 조회하는 SQL 입니다.
*
* SELECT
* PGB.GROUP_ID ,
* PGB.GROUP_NM ,
* PGB.GROUP_TYPE_CD ,
* PGB.CREATE_DT
* FROM PTY_GROUP_BAS PGB
* LEFT OUTER JOIN PTY_CSTMR_GROUP PCG
* ON PGB.GROUP_ID = PCG.GROUP_ID
* WHERE PGB.USE_YN = 'Y'
* AND PCG.CSTMR_SNO = #{cstmrSno}
* AND PCG.GROUP_AUTH_CD = 'MASTER'
*/
List<BasGroupModel> result =
query.select(Projections.bean(BasGroupModel.class ,
bas.groupId,

28
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<AcntTermsRsModel> 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<AcntTermsRsModel> queryList = query.select(Projections.bean(AcntTermsRsModel.class,
basEntity.termsSno,
basEntity.siteCd,

8
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초

4
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;

15
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<String> uploadFile(@RequestParam(value = "file") MultipartFile file) {
return new ResponseEntity<>(service.uploadFile(file), HttpStatus.OK);
}
/**
* 파일 다운로드 기능.
* @param fileName
* @return
*/
@GetMapping("/download/{fileName}")
public ResponseEntity<ByteArrayResource> 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<String> deleteFile(@PathVariable String fileName) {
return new ResponseEntity<>(service.deleteFile(fileName), HttpStatus.OK);

20
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)) {

6
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;

4
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

3
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

2
pav-server/src/main/resources/config/log/logback-spring.xml

@ -12,7 +12,7 @@
<property name="LOG_DIR" value="/data/logs/server" />
</springProfile>
<springProfile name="prod">
<property name="LOG_DIR" value="/data/logs/server01/" />
<property name="LOG_DIR" value="/data/logs/server/" />
</springProfile>
<springProfile name="prod2">

3
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;
@ -16,7 +15,7 @@ import java.util.List;
public class UtmModel {
@JsonProperty("GPSime")
private String GPSime; // 시간 yyyyMMddHHmmss
@JsonProperty("dronInfo")
@JsonProperty("droneInfo")
private List<DronInfo> dronInfo;
@Data

6
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

4
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<String> 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);

1
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/

Loading…
Cancel
Save