Browse Source

release 1.0.0

master v1.0.0
지대한 9 months ago
parent
commit
4de577d0d6
  1. 13
      document/dron_test/pav-utils.js
  2. 12
      document/dron_test/pav-warning.js
  3. 8
      pav-server/build.gradle
  4. 218
      pav-server/src/main/java/com/palnet/biz/api/acnt/crtfyhp/controller/AcntCrtfyhpController.java
  5. 99
      pav-server/src/main/java/com/palnet/biz/api/acnt/crtfyhp/service/AcntCrtfyhpService.java
  6. 185
      pav-server/src/main/java/com/palnet/biz/api/acnt/cstmr/controller/AcntCstmrController.java
  7. 10
      pav-server/src/main/java/com/palnet/biz/api/acnt/cstmr/model/AcntCstmrEmModel.java
  8. 9
      pav-server/src/main/java/com/palnet/biz/api/acnt/cstmr/model/AcntCstmrPwModel.java
  9. 25
      pav-server/src/main/java/com/palnet/biz/api/acnt/cstmr/model/AcntCstmrRqModel.java
  10. 2
      pav-server/src/main/java/com/palnet/biz/api/acnt/cstmr/model/AnctCstmerRlModel.java
  11. 9
      pav-server/src/main/java/com/palnet/biz/api/acnt/cstmr/model/AnctCstmrPswdModel.java
  12. 3
      pav-server/src/main/java/com/palnet/biz/api/acnt/cstmr/model/AnctCstmrTermsModel.java
  13. 94
      pav-server/src/main/java/com/palnet/biz/api/acnt/cstmr/service/AcntCstmrService.java
  14. 126
      pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/controller/JwtAuthenticationController.java
  15. 4
      pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/model/JwtProfileRsModel.java
  16. 5
      pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/model/JwtRqModel.java
  17. 27
      pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/service/JwtService.java
  18. 8
      pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/utils/JwtTokenUtil.java
  19. 13
      pav-server/src/main/java/com/palnet/biz/api/acnt/terms/controller/AcntTermsController.java
  20. 7
      pav-server/src/main/java/com/palnet/biz/api/acnt/terms/model/AcntTermsRqModel.java
  21. 5
      pav-server/src/main/java/com/palnet/biz/api/acnt/terms/service/AcntTermsService.java
  22. 83
      pav-server/src/main/java/com/palnet/biz/api/anls/hstry/controller/AnlsHstryController.java
  23. 7
      pav-server/src/main/java/com/palnet/biz/api/anls/hstry/model/AnlsHstryGroupModel.java
  24. 5
      pav-server/src/main/java/com/palnet/biz/api/anls/hstry/model/AnlsHstryRqModel.java
  25. 84
      pav-server/src/main/java/com/palnet/biz/api/anls/hstry/service/AnlsHstryService.java
  26. 111
      pav-server/src/main/java/com/palnet/biz/api/anls/smlt/controller/AnlsSmltController.java
  27. 18
      pav-server/src/main/java/com/palnet/biz/api/anls/smlt/service/AnlsSmltService.java
  28. 191
      pav-server/src/main/java/com/palnet/biz/api/bas/dron/controller/BasDronController.java
  29. 46
      pav-server/src/main/java/com/palnet/biz/api/bas/dron/model/BasDronInsertModel.java
  30. 3
      pav-server/src/main/java/com/palnet/biz/api/bas/dron/model/BasDronModel.java
  31. 9
      pav-server/src/main/java/com/palnet/biz/api/bas/dron/model/BasDronRqModel.java
  32. 45
      pav-server/src/main/java/com/palnet/biz/api/bas/dron/model/BasDronUpdateModel.java
  33. 15
      pav-server/src/main/java/com/palnet/biz/api/bas/dron/model/BasIdntfModel.java
  34. 4
      pav-server/src/main/java/com/palnet/biz/api/bas/dron/model/BasIdntfRqModel.java
  35. 30
      pav-server/src/main/java/com/palnet/biz/api/bas/dron/service/BasDronService.java
  36. 398
      pav-server/src/main/java/com/palnet/biz/api/bas/flight/controller/BasFlightController.java
  37. 15
      pav-server/src/main/java/com/palnet/biz/api/bas/flight/model/BasFlightCoordModel.java
  38. 20
      pav-server/src/main/java/com/palnet/biz/api/bas/flight/model/BasFlightPlanAreaModel.java
  39. 103
      pav-server/src/main/java/com/palnet/biz/api/bas/flight/service/BasFlightService.java
  40. 53
      pav-server/src/main/java/com/palnet/biz/api/bas/group/controller/BasGroupAprvController.java
  41. 225
      pav-server/src/main/java/com/palnet/biz/api/bas/group/controller/BasGroupController.java
  42. 66
      pav-server/src/main/java/com/palnet/biz/api/bas/group/controller/BasGroupJoinController.java
  43. 63
      pav-server/src/main/java/com/palnet/biz/api/bas/group/controller/BasGroupUserController.java
  44. 6
      pav-server/src/main/java/com/palnet/biz/api/bas/group/model/BasGroupAprvRqModel.java
  45. 24
      pav-server/src/main/java/com/palnet/biz/api/bas/group/model/BasGroupAprvlUpdateRQ.java
  46. 21
      pav-server/src/main/java/com/palnet/biz/api/bas/group/model/BasGroupInsertRQ.java
  47. 17
      pav-server/src/main/java/com/palnet/biz/api/bas/group/model/BasGroupJoinInsertRQ.java
  48. 4
      pav-server/src/main/java/com/palnet/biz/api/bas/group/model/BasGroupJoinRqModel.java
  49. 14
      pav-server/src/main/java/com/palnet/biz/api/bas/group/model/BasGroupJoinUpdateRQ.java
  50. 3
      pav-server/src/main/java/com/palnet/biz/api/bas/group/model/BasGroupRqModel.java
  51. 19
      pav-server/src/main/java/com/palnet/biz/api/bas/group/model/BasGroupUpdateRQ.java
  52. 6
      pav-server/src/main/java/com/palnet/biz/api/bas/group/model/BasGroupUserListModel.java
  53. 17
      pav-server/src/main/java/com/palnet/biz/api/bas/group/model/BasGroupUserUpdateRQ.java
  54. 29
      pav-server/src/main/java/com/palnet/biz/api/bas/group/service/BasGroupService.java
  55. 45
      pav-server/src/main/java/com/palnet/biz/api/bas/laanc/controller/BasLaancAprvController.java
  56. 142
      pav-server/src/main/java/com/palnet/biz/api/bas/laanc/controller/BasLaancController.java
  57. 16
      pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancAprvListRq.java
  58. 64
      pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancAprvRs.java
  59. 62
      pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancArcrftModel.java
  60. 22
      pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancAreaByAirspaceModel.java
  61. 20
      pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancAreaByElevModel.java
  62. 16
      pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancAreaCoordByAirspaceModel.java
  63. 16
      pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancAreaCoordByElevModel.java
  64. 14
      pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancAreaCoordModel.java
  65. 30
      pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancAreaModel.java
  66. 2
      pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancDuplicatedAirspaceRs.java
  67. 22
      pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancPlanRq.java
  68. 16
      pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancQrcodeRq.java
  69. 15
      pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancQrcodeRs.java
  70. 4
      pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancTsRq.java
  71. 81
      pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancValidatedRs.java
  72. 28
      pav-server/src/main/java/com/palnet/biz/api/bas/laanc/service/BasLaancAprvService.java
  73. 509
      pav-server/src/main/java/com/palnet/biz/api/bas/laanc/service/BasLaancService.java
  74. 203
      pav-server/src/main/java/com/palnet/biz/api/cns/faq/controller/CnsFaqController.java
  75. 14
      pav-server/src/main/java/com/palnet/biz/api/cns/faq/model/FaqListModel.java
  76. 3
      pav-server/src/main/java/com/palnet/biz/api/cns/faq/model/FaqListRQModel.java
  77. 32
      pav-server/src/main/java/com/palnet/biz/api/cns/faq/model/FaqListRSModel.java
  78. 46
      pav-server/src/main/java/com/palnet/biz/api/cns/faq/model/FaqUpdateModel.java
  79. 36
      pav-server/src/main/java/com/palnet/biz/api/cns/faq/service/CnsFaqService.java
  80. 266
      pav-server/src/main/java/com/palnet/biz/api/cns/qna/controller/CnsQnaController.java
  81. 4
      pav-server/src/main/java/com/palnet/biz/api/cns/qna/model/QnaInsertAnserRQModel.java
  82. 4
      pav-server/src/main/java/com/palnet/biz/api/cns/qna/model/QnaListAdminRQ.java
  83. 6
      pav-server/src/main/java/com/palnet/biz/api/cns/qna/model/QnaSelectListRQ.java
  84. 35
      pav-server/src/main/java/com/palnet/biz/api/cns/qna/service/CnsQnaService.java
  85. 64
      pav-server/src/main/java/com/palnet/biz/api/comn/coordinate/controller/ComnCoordinateController.java
  86. 12
      pav-server/src/main/java/com/palnet/biz/api/comn/coordinate/model/CompotentAuthorityRQ.java
  87. 14
      pav-server/src/main/java/com/palnet/biz/api/comn/coordinate/model/CompotentAuthorityRS.java
  88. 105
      pav-server/src/main/java/com/palnet/biz/api/comn/coordinate/service/ComnCoordinateService.java
  89. 78
      pav-server/src/main/java/com/palnet/biz/api/comn/elev/controller/ComnElevController.java
  90. 7
      pav-server/src/main/java/com/palnet/biz/api/comn/elev/model/ComnElevRq.java
  91. 5
      pav-server/src/main/java/com/palnet/biz/api/comn/elev/model/ComnGroundElevRq.java
  92. 20
      pav-server/src/main/java/com/palnet/biz/api/comn/elev/service/ComnElevService.java
  93. 39
      pav-server/src/main/java/com/palnet/biz/api/comn/file/controller/ComnFileController.java
  94. 21
      pav-server/src/main/java/com/palnet/biz/api/comn/file/service/ComnFileService.java
  95. 8
      pav-server/src/main/java/com/palnet/biz/api/comn/model/ComnPagingModel.java
  96. 6
      pav-server/src/main/java/com/palnet/biz/api/comn/model/ComnRqModel.java
  97. 9
      pav-server/src/main/java/com/palnet/biz/api/comn/response/SuccessResponse.java
  98. 14
      pav-server/src/main/java/com/palnet/biz/api/comn/sms/service/ComnSmsService.java
  99. 87
      pav-server/src/main/java/com/palnet/biz/api/comn/sunriseset/controller/ComnSunrisesetController.java
  100. 15
      pav-server/src/main/java/com/palnet/biz/api/comn/sunriseset/model/ComnSunrisesetCoordRq.java
  101. Some files were not shown because too many files have changed in this diff Show More

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,

12
document/dron_test/pav-warning.js

@ -10,11 +10,11 @@ const port = 8082;
const prefix = 'PALUTM-';
const pathSampleCoord = [
[37.523771, 126.720982],
[37.524841, 126.723106],
[37.524337, 126.72333],
[37.524841, 126.723106],
[37.523771, 126.720982]
[37.571954, 126.775258],
[37.566375, 126.781266],
[37.562361, 126.783584],
[37.558143, 126.785987],
[37.553039, 126.788819]
];
// const pathSampleCoord = [
// [42.5515, 126.655],
@ -48,7 +48,7 @@ const getCoords = coords => {
};
const getClient = () => {
const dronName = prefix + '010';
const dronName = prefix + '095';
const client = {};
client.dronName = dronName;

8
pav-server/build.gradle

@ -46,6 +46,9 @@ dependencies {
developmentOnly 'org.springframework.boot:spring-boot-devtools'
implementation 'org.springframework.boot:spring-boot-starter-webflux'
// implementation 'io.springfox:springfox-boot-starter:3.0.0'
implementation 'org.springdoc:springdoc-openapi-ui:1.6.15'
// thymeleaf
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
@ -86,7 +89,6 @@ dependencies {
implementation 'org.apache.commons:commons-io:1.3.2'
implementation 'commons-httpclient:commons-httpclient:3.1'
implementation 'com.googlecode.json-simple:json-simple:1.1.1'
implementation 'io.springfox:springfox-boot-starter:3.0.0'
implementation 'org.json:json:20220320'
implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jsr353:2.15.2'
@ -101,7 +103,9 @@ dependencies {
implementation 'org.geotools:gt-geotiff:29.2'
implementation 'org.geotools:gt-epsg-hsql:29.2'
// QR Code
implementation 'com.google.zxing:core:3.5.2'
implementation 'com.google.zxing:javase:3.5.2'
testCompileOnly 'org.projectlombok:lombok:1.18.28'
testAnnotationProcessor 'org.projectlombok:lombok:1.18.28'

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

@ -3,22 +3,13 @@ package com.palnet.biz.api.acnt.crtfyhp.controller;
import java.util.HashMap;
import java.util.Map;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Parameters;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.palnet.biz.api.acnt.crtfyhp.model.AcntCrtfyhpRsModel;
import com.palnet.biz.api.acnt.crtfyhp.service.AcntCrtfyhpService;
import com.palnet.biz.api.comn.response.BasicResponse;
import com.palnet.biz.api.comn.response.ErrorResponse;
@ -27,88 +18,106 @@ import com.palnet.biz.jpa.repository.pty.PtyCstmrQueryRepository;
import com.palnet.comn.code.RSErrorCode;
import com.palnet.comn.utils.EncryptUtils;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.enums.ParameterIn;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j2;
import lombok.extern.slf4j.Slf4j;
@Log4j2
@Slf4j
@RestController
@RequiredArgsConstructor
@RequestMapping(value = "/api/acnt/crtfyhp", produces = {MediaType.APPLICATION_JSON_VALUE})
@Tag(name = "휴대폰 인증 관리", description = "회원 휴대폰 인증 관련 API")
public class AcntCrtfyhpController {
@Autowired
private final AcntCrtfyhpService service;
@Autowired
private PtyCstmrQueryRepository ptyCstmrQueryRepository;
private final 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) {
@Operation(summary = "휴대폰 인증번호 전송", description = "입력한 휴대폰번호로 회원정보에 동일한 휴대폰 번호가 있는지 확인하고, 없다면 인증번호를 전송하는 API 입니다.")
public ResponseEntity<? extends BasicResponse> send(@Parameter(name="hpno", description = "회원 핸드폰번호", in = ParameterIn.QUERY, example = "01012345678") 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({
@ApiImplicitParam(name = "hpno",value = "휴대폰번호", dataTypeClass = String.class),
@ApiImplicitParam(name = "crtfyNo",value = "인증일련번호", dataTypeClass = String.class)
})
public ResponseEntity<? extends BasicResponse> confirm(String hpno , String crtfyNo) {
@Operation(summary = "휴대폰 인증번호 검증", description = "입력한 핸드폰번호로 받은 인증번호를 입력해 검증하는 API 입니다.")
public ResponseEntity<? extends BasicResponse> confirm(@Parameter(name="hpno", description = "회원 핸드폰번호", in = ParameterIn.QUERY, example = "01012345678") String hpno ,
@Parameter(name="crtfyNo", description = "회원 핸드폰번호", in = ParameterIn.QUERY, example = "123456") 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);
boolean result = service.registerConfirm(hpno, crtfyNo); // 휴대폰번호로 전송된 인증번호가 맞는지 확인하는 코드
resultMap.put("result" , result); // 인증성공하면 true
} catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
@ -118,24 +127,25 @@ public class AcntCrtfyhpController {
}
//아이디 찾기 시 인증번호 발송 로직
/**
* 아이디 찾기 인증번호 발송 로직
* @param memberName
* @param hpno
* @return
*/
@GetMapping(value = "/find/sendForId")
@ApiOperation(value = "아이디 찾기 시 인증번호 발송")
@Tag(name = "휴대폰 인증 관리", description = "회원 휴대폰 인증 관련 API")
@ApiImplicitParams({
@ApiImplicitParam(name = "memberName", value = "회원 이름", dataTypeClass = String.class),
@ApiImplicitParam(name = "hpno", value = "휴대폰 번호", dataTypeClass = String.class)
})
public ResponseEntity<? extends BasicResponse> sendForId(String memberName, String hpno) {
Map<String, Object> resultMap = new HashMap<String, Object>();
@Operation(summary = "ID 찾기 시 사용되는 인증번호 발송 로직", description = "ID찾기 시 입력한 핸드폰번호로 인증번호를 발송하는 API 입니다.")
public ResponseEntity<? extends BasicResponse> sendForId(@Parameter(name="memberName", description = "회원 이름", in = ParameterIn.QUERY, example = "팔네트웍스") String memberName,
@Parameter(name="hpno", description = "회원 핸드폰번호", in = ParameterIn.QUERY, example = "01012345678") String hpno) {
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 +153,13 @@ public class AcntCrtfyhpController {
resultMap.put("code", 0); //일치하는 회원 존재
}
} catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
@ -150,19 +167,20 @@ public class AcntCrtfyhpController {
return ResponseEntity.ok().body(new SuccessResponse<Map>(resultMap));
}
//아이디 찾기
/**
* 아이디 찾기
* @param memberName
* @param hpno
* @return
*/
@GetMapping(value = "/find/findUserId")
@ApiOperation(value = "회원 아이디 찾기")
@Tag(name = "휴대폰 인증 관리", description = "회원 휴대폰 인증 관련 API")
@ApiImplicitParams({
@ApiImplicitParam(name = "memberName",value = "회원이름", dataTypeClass = String.class),
@ApiImplicitParam(name = "hpno",value = "휴대폰번호", dataTypeClass = String.class)
})
public ResponseEntity<? extends BasicResponse> findUserId(String memberName, String hpno) {
Map<String, Object> resultMap = new HashMap<String, Object>();
@Operation(summary = "ID 찾기", description = "멤버의 이름과 핸드폰번호를 입력받아 회원가입 당시에 입력한 ID를 찾아주는 API 입니다.")
public ResponseEntity<? extends BasicResponse> findUserId(@Parameter(name="memberName", description = "회원 이름", in = ParameterIn.QUERY, example = "팔네트웍스") String memberName,
@Parameter(name="hpno", description = "회원 핸드폰번호", in = ParameterIn.QUERY, example = "01012345678") String hpno) {
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,24 +202,25 @@ 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")
@ApiImplicitParams({
@ApiImplicitParam(name = "userId",value = "사용자ID", dataTypeClass = String.class),
@ApiImplicitParam(name = "hpno",value = "휴대폰번호", dataTypeClass = String.class)
})
public ResponseEntity<? extends BasicResponse> sendForPw(String userId, String hpno) {
@Operation(summary = "비밀번호 찾기 시 인증번호 발송", description = "비밀번호 찾기 시도 시 멤버의 ID과 핸드폰번호를 입력받아 인증번호를 발송하는 API 입니다.")
public ResponseEntity<? extends BasicResponse> sendForPw(@Parameter(name="userId", description = "회원 아이디", in = ParameterIn.QUERY, example = "palnet") String userId,
@Parameter(name="hpno", description = "회원 핸드폰번호", in = ParameterIn.QUERY, example = "01012345678") 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 +228,13 @@ public class AcntCrtfyhpController {
resultMap.put("code", 0); //일치하는 회원 존재
}
} catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
@ -217,25 +243,28 @@ public class AcntCrtfyhpController {
return ResponseEntity.ok().body( new SuccessResponse<Map>(resultMap));
}
/**
* 비밀번호 찾기 업데이트
* @param userId
* @param hpno
* @param newPw
* @return
* @throws Exception
*/
@GetMapping(value = "/find/updatePw")
@ApiOperation(value = "비밀번호 찾기 및 업데이트")
@Tag(name = "휴대폰 인증 관리", description = "회원 휴대폰 인증 관련 API")
@ApiImplicitParams({
@ApiImplicitParam(name = "userID",value = "사용자ID", dataTypeClass = String.class),
@ApiImplicitParam(name = "hpno",value = "휴대폰번호", dataTypeClass = String.class),
@ApiImplicitParam(name = "newPw",value = "새로운 비밀번호", dataTypeClass = String.class)
})
public ResponseEntity<? extends BasicResponse> updatePw(String userId, String hpno, String newPw) throws Exception {
@Operation(summary = "새로운 비밀번호로 업데이트", description = "비밀번호 찾기 -> 인증번호 검증이 성공했을 경우, userId와 hpno가 일치하는 회원정보를 새로운 비밀번호로 업데이트 하는 API 입니다.")
public ResponseEntity<? extends BasicResponse> updatePw(@Parameter(name="userId", description = "회원 아이디", in = ParameterIn.QUERY, example = "palnet") String userId,
@Parameter(name="hpno", description = "회원 핸드폰번호", in = ParameterIn.QUERY, example = "01012345678") String hpno,
@Parameter(name="hpno", description = "회원 핸드폰번호", in = ParameterIn.QUERY, example = "newPassword1234") String newPw) throws Exception {
Map<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);
boolean result = service.updatePw(userId, hpno, newPw); // 사용자가 입력한 새로운 암호로 업데이트
resultMap.put("result", result);
if(!result) {
resultMap.put("code", -1);
@ -243,6 +272,13 @@ public class AcntCrtfyhpController {
resultMap.put("code", 0);
}
} catch(Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));

99
pav-server/src/main/java/com/palnet/biz/api/acnt/crtfyhp/service/AcntCrtfyhpService.java

@ -19,6 +19,7 @@ import com.palnet.biz.jpa.repository.pty.PtyCstmrBasRepository;
import com.palnet.biz.jpa.repository.pty.PtyCstmrQueryRepository;
import com.palnet.biz.jpa.repository.pty.SuredataRepository;
import com.palnet.comn.utils.EncryptUtils;
import com.palnet.comn.utils.InstantUtils;
@Service
public class AcntCrtfyhpService {
@ -105,9 +106,16 @@ public class AcntCrtfyhpService {
//
// return true;
// }
/**
* hpno에 있는 번호로 인증번호 메세지 발송하는 기능
* @param hpno
* @return
* @throws Exception
*/
public boolean registerSend(String hpno) throws Exception{
//인증번호 만들기 ( 6자리)
//인증번호 만들기 (6자리)
String certifyNo = numberGen(6, 2);
//메시지 만들기
@ -125,13 +133,25 @@ public class AcntCrtfyhpService {
ptyEntity.setCrtfyhpYn("N");
ptyCrtfyhpBasRepository.save(ptyEntity);
logger.info("certifyNo :: " + certifyNo);
logger.info("certifyNo :: {}", certifyNo); // 로그로 인증번호 값을 찍어줌
// 현재시간 값을 구해옴 예시 => nowStr = "20231206135600"
String nowStr = InstantUtils.toDatetimeStringByFormat(Instant.now(), "yyyyMMddHHmmss");
//발송 테이블 입력
SuredataEntity entity = new SuredataEntity();
entity.setIntime(nowStr);
entity.setCallphone(hpno);
entity.setMsg(msg);
/**
* Message 기본값들 applcation-local[dev,prod등].properties 파일에서 확인할 있음
* local,dev,prod는 서버가 돌아가는 환경 옵션입니다.
* local - 개발자 개인 컴퓨터 환경
* dev - 상용서버 배포전 테스트할 서버 환경[테스트서버]
* prod - 상용화 환경
*/
entity.setSubject(SUBJECT_CETIFY);
entity.setCallname(CALLNAME_CERTIFY);
entity.setUsercode(USER_CODE);
@ -143,8 +163,10 @@ public class AcntCrtfyhpService {
entity.setKind(KIND);
SuredataEntity result = sureDataRepository.save(entity);
SuredataEntity result = sureDataRepository.save(entity); // 데이터 베이스에 저장[Data Insert]
// Save했을시 성공하지 못하면 result는 null됨
// 그래서 null경우 성공하지 못한다고 판단
if(result == null) {
return false;
}
@ -153,14 +175,33 @@ public class AcntCrtfyhpService {
}
/**
* 휴대폰 번호에 전송된 인증번호가 맞는지 확인하는 기능
* @param hpno
* @param crtfyNo
* @return
* @throws Exception
*/
public boolean registerConfirm(String hpno , String crtfyNo ) throws Exception{
hpno = EncryptUtils.encrypt(hpno); //암호화 해서 검색
List<PtyCrtfyhpBas> entity = query.confirmSms(hpno , crtfyNo);
List<PtyCrtfyhpBas> entity = query.confirmSms(hpno , crtfyNo); // 데이터 베이스에서 휴대폰 번호와 인증번호 맞는지 체크
/**
* 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 = ""; //난수가 저장될 변수
@ -185,29 +226,53 @@ 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;
//certifNum이 값이 있을경우 메세지 전송, 값이 있다는것은 데이터베이스에 ID와 휴대폰번호[hpno]가 일치한다는 것
if(certifNum != null) {
registerSend(hpno);
result = true;
@ -215,15 +280,23 @@ public class AcntCrtfyhpService {
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;

185
pav-server/src/main/java/com/palnet/biz/api/acnt/cstmr/controller/AcntCstmrController.java

@ -1,6 +1,26 @@
package com.palnet.biz.api.acnt.cstmr.controller;
import com.palnet.biz.api.acnt.cstmr.model.*;
import java.time.ZoneId;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.palnet.biz.api.acnt.cstmr.model.AcntCstmrEmModel;
import com.palnet.biz.api.acnt.cstmr.model.AcntCstmrPwModel;
import com.palnet.biz.api.acnt.cstmr.model.AcntCstmrRqModel;
import com.palnet.biz.api.acnt.cstmr.model.AcntCstmrRsModel;
import com.palnet.biz.api.acnt.cstmr.model.AnctCstmerRlModel;
import com.palnet.biz.api.acnt.cstmr.service.AcntCstmrService;
import com.palnet.biz.api.comn.response.BasicResponse;
import com.palnet.biz.api.comn.response.ErrorResponse;
@ -8,22 +28,15 @@ import com.palnet.biz.api.comn.response.SuccessResponse;
import com.palnet.biz.jpa.entity.PtyCstmrBas;
import com.palnet.biz.jpa.entity.PtyCstmrDtl;
import com.palnet.comn.exception.CustomException;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.enums.ParameterIn;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j2;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.time.ZoneId;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import lombok.extern.slf4j.Slf4j;
@Log4j2
@Slf4j
@RestController
@RequiredArgsConstructor
@RequestMapping(value = "/api/acnt/cstmr", produces = {MediaType.APPLICATION_JSON_VALUE})
@ -32,9 +45,13 @@ public class AcntCstmrController {
private final AcntCstmrService service;
/**
* 회원가입 기능, AcntCstmrRqModel에 사용자가 입력한 회원 정보가 들어있음
* @param rq
* @return
*/
@PostMapping(value = "/register")
@ApiOperation(value = "회원 가입")
@Tag(name = "회원관리", description = "회원 관련 API")
@Operation(summary = "회원가입", description = "회원가입 API 입니다.")
public ResponseEntity<? extends BasicResponse> register(@RequestBody AcntCstmrRqModel rq) {
AcntCstmrRsModel result;
@ -44,11 +61,18 @@ public class AcntCstmrController {
// result = service.list(rq);
log.debug(">>> bd : {}", rq.getBrthdyDate());
log.debug(">>> bd : {}", rq.getBrthdyDate().atZone(ZoneId.of("Asia/Seoul")).toLocalDateTime());
log.debug(">>> td : {}", rq.getTestDt());
log.debug(">>> td : {}", rq.getTestDt().atZone(ZoneId.of("Asia/Seoul")).toLocalDateTime());
result = service.register(rq);
// log.debug(">>> td : {}", rq.getTestDt());
// log.debug(">>> td : {}", rq.getTestDt().atZone(ZoneId.of("Asia/Seoul")).toLocalDateTime());
result = service.register(rq); // 회원정보를 데이터베이스에 추가[INSERT]함.
} catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
@ -57,18 +81,29 @@ public class AcntCstmrController {
return ResponseEntity.ok().body(new SuccessResponse<AcntCstmrRsModel>(result));
}
/**
* 회원 조회하는 기능, cstmrSno는 회원 고유번호 입니다.
* 고유번호로 회원의 정보를 조회합니다.
* @param cstmrSno
* @return
*/
@GetMapping(value = "/profile/{cstmrSno}")
@ApiOperation(value = "회원 정보")
@Tag(name = "회원관리", description = "회원 관련 API")
@ApiImplicitParam(name = "cstmrSno",value = "고객일련번호", dataTypeClass = Integer.class)
public ResponseEntity<? extends BasicResponse> mypage(@PathVariable Integer cstmrSno){
@Operation(summary = "회원 정보 조회", description = "회원 고유 넘버로 회원 정보를 조회합니다. cstmrSno 예시 : 1, 2, 3 ....")
public ResponseEntity<? extends BasicResponse> mypage(@Parameter(name="cstmrSno", description = "회원번호", in = ParameterIn.PATH, example = "3") @PathVariable Integer cstmrSno){
List<AnctCstmerRlModel> result = null;
try {
result = service.list(cstmrSno);
result = service.list(cstmrSno); // 회원고유번호[cstmrSno]로 회원정보를 조회 함.
} catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
@ -78,22 +113,42 @@ public class AcntCstmrController {
return ResponseEntity.ok().body(new SuccessResponse<List>(result));
}
/**
* 회원 계정 암호 변경하는 기능,
* AcntCstmrPwModel애 회원이 입력한 기존암호, 변경할 암호값이 있습니다.
* @param rq
* @return
*/
@PostMapping(value = "/profile/pswdupdate")
@ApiOperation(value = "회원 패스워드 변경")
@Tag(name = "회원관리", description = "회원 관련 API")
@Operation(summary = "회원 패스워드 변경", description = "회원의 비밀번호를 변경합니다.")
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 +156,42 @@ public class AcntCstmrController {
return ResponseEntity.ok().body(new SuccessResponse<>(resultMap));
}
/**
* 회원 기존 패스워드 확인,
* userPswd 값에 있는 회원 암호가 맞는지 확인합니다.
* @param userPswdMap
* @return
*/
@PostMapping(value = "/profile/pwcheck")
@ApiOperation(value = "회원 기존 패스워드 확인")
@Tag(name = "회원관리", description = "회원 관련 API")
public ResponseEntity<? extends BasicResponse> extendpsw(@RequestBody Map<String,String> userPswdMap){
@Operation(summary = "기존 회원의 패스워드 확인", description = " jwt토큰에 등록된 유저정보와 패스워드가 일치하는지 확인합니다. 입력 예시 -> userPswd : test1234 ")
public ResponseEntity<? extends BasicResponse> extendpsw(@Parameter(name="userPswd", description = "유저 비밀번호", in = ParameterIn.QUERY, example = "test1234") String userPswd){
Map<String, Object> resultMap = new HashMap<String, Object>();
try {
boolean result = service.extendpsw(userPswdMap.get("userPswd"));
boolean result = service.extendpsw(userPswd); // 기존 암호가 맞는지 확인하는 기능.
resultMap.put("result", result);
} catch (CustomException e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* CustomException은 개발자가 "의도적으로" 예외처리,
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNOE : {}", e);
resultMap.put("result", false);
resultMap.put("errorCode", e.getErrorCode());
resultMap.put("errorMessage", e.getMessage());
return ResponseEntity.ok().body(new SuccessResponse<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,17 +199,30 @@ public class AcntCstmrController {
return ResponseEntity.ok().body(new SuccessResponse<>(resultMap));
}
/**
* 회원정보 수정하는 기능,
* AcntCstmrEmModel에 회원이 입력한 수정할 정보들로 수정합니다.
* @param rq
* @return
*/
@PutMapping(value = "/profile/update")
@ApiOperation(value = "회원 정보 변경 (이메일,핸드폰)")
@Tag(name = "회원관리", description = "회원 관련 API")
@Operation(summary = "회원정보 수정", description = "토큰을 발급한 ID의 회원정보(이메일, 휴대폰번호)를 업데이트 하는 API 입니다.")
public ResponseEntity<? extends BasicResponse> updateEmail(@RequestBody AcntCstmrEmModel rq){
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 +230,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,19 +244,31 @@ public class AcntCstmrController {
return ResponseEntity.ok().body(new SuccessResponse<>(resultMap));
}
/**
* 회원 탈퇴 처리하는 기능,
* 회원고유[cstmrSno] 값으로 회원탈퇴처리함.
* @param cstmrSno
* @return
*/
@PostMapping(value = "/profile/delete/{cstmrSno}")
@ApiOperation(value = "회원 탈퇴")
@Tag(name = "회원관리", description = "회원 관련 API")
@ApiImplicitParam(name = "cstmrSno",value = "고객일련번호", dataTypeClass = Integer.class)
public ResponseEntity<? extends BasicResponse> userDelete(@PathVariable Integer cstmrSno){
@Operation(summary = "회원 탈퇴", description = "cstmrSno를 받아 회원탈퇴 처리하는 API 입니다.")
public ResponseEntity<? extends BasicResponse> userDelete(@Parameter(name="cstmrSno", description = "회원 일련번호", in = ParameterIn.PATH, example = "27")@PathVariable Integer cstmrSno){
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());

10
pav-server/src/main/java/com/palnet/biz/api/acnt/cstmr/model/AcntCstmrEmModel.java

@ -1,20 +1,26 @@
package com.palnet.biz.api.acnt.cstmr.model;
import lombok.Data;
import java.time.Instant;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
public class AcntCstmrEmModel {
@Schema(description = "유저 이메일" , example = "updateEmail@test.co.kr")
private String email;
@Schema(description = "업데이트 일자", example = "2023-12-12", implementation = String.class)
private Instant updateDt;
@Schema(hidden = true)
private String updateUserId;
@Schema(hidden = true)
private int cstmrSno;
@Schema(description = "업데이트할 핸드폰 번호", example = "01023457777")
private String hpno;

9
pav-server/src/main/java/com/palnet/biz/api/acnt/cstmr/model/AcntCstmrPwModel.java

@ -1,17 +1,22 @@
package com.palnet.biz.api.acnt.cstmr.model;
import lombok.Data;
import java.time.Instant;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
public class AcntCstmrPwModel {
@Schema(hidden = true)
private Instant pswdupdtDt;
@Schema(description = "유저의 기존 비밀번호", example = "test1234")
private String userPswd;
@Schema(description = "유저의 새로운 비밀번호", example = "test12345")
private String newPswd;
@Schema(description = "유저의 새로운 비밀번호(확인)", example = "test12345")
private String newPswdConfirm;
}

25
pav-server/src/main/java/com/palnet/biz/api/acnt/cstmr/model/AcntCstmrRqModel.java

@ -1,53 +1,74 @@
package com.palnet.biz.api.acnt.cstmr.model;
import java.time.Instant;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.palnet.biz.config.convert.InstantDateStrSerializer;
import lombok.Data;
import java.time.Instant;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
public class AcntCstmrRqModel{
@Schema(description = "고객구분코드" , example = "MEMBER")
private String cstrmDivCd;
@Schema(description = "고객상태코드" , example = "A")
private String cstrmStatusCd;
@Schema(description = "유저 아이디(중복인 경우 숫자 변경)" , example = "tester01")
private String userId;
@Schema(description = "유저 권한" , example = "USER")
private String authId;
@Schema(description = "사이트 코드" , example = "DRON")
private String siteCode;
@Schema(hidden = true)
private String memberDivCd;
@Schema(description = "유저 비밀번호" , example = "test1234")
private String userPswd;
@Schema(hidden = true)
private String ipinDi;
@Schema(hidden = true)
private String ipinCi;
@Schema(description = "가입인증 수단 코드" , example = "HP_CRTFD")
private String joinCrtfyCd;
@Schema(description = "국가코드" , example = "KOR")
private String cntryCd;
@Schema(description = "성별코드" , example = "M")
private String genderCd;
@Schema(description = "멤버 이름" , example = "TESTER")
private String memberName;
@JsonSerialize(using = InstantDateStrSerializer.class)
@Schema(description = "생년월일", example = "1997-05-05", implementation = String.class)
private Instant brthdyDate;
@Schema(hidden = true)
private Instant testDt;
@Schema(description = "이메일" , example = "tester@test.co.kr")
private String email;
@Schema(description = "멤버 이름" , example = "01012345678")
private String hpno;
@Schema(description = "국가 코드" , example = "+82")
private String clncd;
private AnctCstmrTermsModel[] terms;
@Schema(hidden = true)
private String trmnlId;

2
pav-server/src/main/java/com/palnet/biz/api/acnt/cstmr/model/AnctCstmerRlModel.java

@ -1,5 +1,6 @@
package com.palnet.biz.api.acnt.cstmr.model;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.palnet.biz.config.convert.InstantDateStrSerializer;
import lombok.Data;
@ -28,6 +29,7 @@ public class AnctCstmerRlModel {
private String updateuserId;
@JsonInclude(JsonInclude.Include.ALWAYS)
private String cptAuthCode;
}

9
pav-server/src/main/java/com/palnet/biz/api/acnt/cstmr/model/AnctCstmrPswdModel.java

@ -0,0 +1,9 @@
package com.palnet.biz.api.acnt.cstmr.model;
import lombok.Data;
@Data
public class AnctCstmrPswdModel {
private String userPswd;
}

3
pav-server/src/main/java/com/palnet/biz/api/acnt/cstmr/model/AnctCstmrTermsModel.java

@ -1,9 +1,12 @@
package com.palnet.biz.api.acnt.cstmr.model;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
public class AnctCstmrTermsModel {
@Schema(description = "약관 일련번호", example = "1")
private int termsSno;
@Schema(description = "동의여부", example = "Y")
private String agreeYn;
}

94
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,7 +157,19 @@ public class AcntCstmrService {
}
/**
* AcntCstmrRqModel에 담겨있는 상세정보를 데이터베이스에 추가[INSERT].
* @param rq
* @param basEntity
* @return
* @throws Exception
*/
public PtyCstmrDtl savePtyCstmrDtl(AcntCstmrRqModel rq , PtyCstmrBas basEntity) throws Exception{
if(rq.getCntryCd() == null || rq.getCntryCd().equals("")){
rq.setCntryCd("KOR");
}
PtyCstmrDtl dtlEntity = new PtyCstmrDtl();
dtlEntity.setCstmrSno(basEntity.getCstmrSno());
dtlEntity.setIpinCi(rq.getIpinCi());
@ -190,19 +206,29 @@ public class AcntCstmrService {
}
/**
* 회원 고유번호[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();
@ -228,6 +254,11 @@ public class AcntCstmrService {
return updateUserEntity;
}
/**
* 기존 암호가 맞는지 확인하는 기능.
* @param userPswd
* @return
*/
public boolean extendpsw(String userPswd){
boolean result = false;
// 1. 토큰 유저 정보 불러오기
@ -258,36 +289,58 @@ 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(); // 회원의 속한 그룹을 조회
if(groupInfo != null) {
for(JwtGroupModel group : groupInfo) {
// if(group.getGroupAuthCd().equals("CREATER")) {
// if(group.getGroupAuthCd().equals("CREATER")) {
// 회원의 그룹 권한이 MASTER 일 경우
if(group.getGroupAuthCd().equals("MASTER")) {
PtyGroupBas groupEntity = ptyGroupBasRepository.findByGroupId(group.getGroupId());
// 그룹이 있을경우 그룹의 사용여부 "N" 값으로 저장
if(!(groupEntity == null)) {
groupEntity.setUseYn("N");
ptyGroupBasRepository.save(groupEntity);
}
List<PtyCstmrGroup> cstmrEntity = ptyCstmrGroupRepository.changeGroupJoinYn(group.getGroupId());
// cstmrEntity 값이 있을 경우 참여여부 "N" 값으로 저장
if(!(cstmrEntity == null)) {
for(PtyCstmrGroup cstmr : cstmrEntity) {
cstmr.setJoinYn("N");
@ -295,13 +348,20 @@ 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);
}
// 그룹 참여여부를 "N"값으로 저장
PtyCstmrGroup cstmrEntity = ptyCstmrGroupRepository.findGroupId(group.getGroupId(), cstmrSno);
if(!(cstmrEntity == null)) {
cstmrEntity.setJoinYn("N");
@ -309,6 +369,8 @@ public class AcntCstmrService {
}
}
}
}
// 데이터베이스에 있는 회원 정보를 탈퇴처리 후 저장함
PtyCstmrBas userEntity = ptyCstmrBasRepository.findByUserGroupId(cstmrSno);
userEntity.setCstmrStatusCd("W");
userEntity.setCstmrStatusCngDt(Instant.now() );

126
pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/controller/JwtAuthenticationController.java

@ -1,5 +1,18 @@
package com.palnet.biz.api.acnt.jwt.controller;
import java.util.Map;
import io.swagger.v3.oas.annotations.media.Schema;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.palnet.biz.api.acnt.jwt.model.JwtProfileRsModel;
import com.palnet.biz.api.acnt.jwt.model.JwtRqModel;
import com.palnet.biz.api.acnt.jwt.model.JwtRsModel;
@ -11,50 +24,48 @@ import com.palnet.biz.api.comn.response.ErrorResponse;
import com.palnet.biz.api.comn.response.SuccessResponse;
import com.palnet.biz.jpa.entity.PtyCstmrBas;
import com.palnet.comn.code.RSErrorCode;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.enums.ParameterIn;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.Map;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@RestController
@RequiredArgsConstructor
@Log4j2
@RequestMapping(value = "/api/acnt/jwt", produces = {MediaType.APPLICATION_JSON_VALUE})
@Tag(name = "JWT 토큰 이용", description = "JWT 토큰 관련 API")
public class JwtAuthenticationController {
@Autowired
private JwtTokenUtil jwtTokenUtil;
@Autowired
private JwtUserDetailsService userDetailsService;
@Autowired
private JwtService service;
private final JwtTokenUtil jwtTokenUtil;
private final JwtUserDetailsService userDetailsService;
private final JwtService service;
/**
* 로그인 기능,
* JwtRqModel에 입력받은 회원아이디, 입력받은 회원 비밀번호로 인증처리를 .
* @param authenticationRequest
* @return
* @throws Exception
*/
@PostMapping(value = "/login")
@ApiOperation(value = "로그인")
@Tag(name = "JWT 토큰 이용", description = "JWT 토큰 관련 API")
@Operation(summary = "로그인", description = "ID와 PASSWORD를 입력받아 로그인 처리하는 API 입니다.")
public ResponseEntity<? extends BasicResponse> createAuthenticationToken(@RequestBody JwtRqModel authenticationRequest) throws Exception {
// 로그인 프로세스
Map<String , Object> resultMap = service.loginProcess(authenticationRequest);
int loginError = (int) resultMap.get("loginError");
// loginError 은 1이 정상, - 값은 모두 로그인 실패임
if(loginError < 0) {
String errorMessage = (String) resultMap.get("errorMessage");
return ResponseEntity.status(HttpStatus.OK)
// 로그인 실패시 로그인 실패한 사유를 반환함
return ResponseEntity.status(HttpStatus.OK)
.body(new ErrorResponse(errorMessage, loginError + "")); // 계정 사용하지 못함
}else {
@ -65,30 +76,49 @@ 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{
@Operation(summary = "로그인한 회원의 정보", description = "로그인 된 유저의 정보를 가져오는 API 입니다.")
public ResponseEntity<? extends BasicResponse> proflie(
@Parameter(name="cstmrSno", description = "회원번호", in = ParameterIn.PATH, example = "3")@PathVariable Integer cstmrSno) throws Exception{
JwtProfileRsModel result = service.profile(cstmrSno);
JwtProfileRsModel result = service.profile(cstmrSno); // 회원고유번호로 회원정보를 가져오는 기능.
if(result == null) {
// 반환받은 회원정보가 없을시 "의도적인" 예외코드를 반환해줌
return ResponseEntity.status(HttpStatus.OK)
.body(new ErrorResponse(RSErrorCode.DATA_NOTFOUNT));
}
return ResponseEntity.ok().body(new SuccessResponse<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{
//입력값 검증
@Operation(summary = "JWT 재인가토큰 발급", description = "JWT 토큰을 재발급하는 API 입니다. <br> { <br> \"cstmrSno\" : 2, <br> \"refreshToken\" : \"palnet을 제외한 token 전체를 입력\" <br> } <br> 위의 예시와 같이 값을 입력하시면 됩니다. cstmrSno는 토큰의 ID와 매핑되는 값이어야 합니다.")
public ResponseEntity<? extends BasicResponse> refresh(
@RequestBody
@Schema(example = "{\n" +
"\"cstmrSno\" : 2,\n" +
"\"refreshToken\" : \"palnet을 제외한 token 전체를 입력\"\n" +
"}")
Map body
) throws Exception {
// 회원고유번호[cstmrSno], 회원고유번호[cstmrSno]가 Integer타입인지, 인가정보를 다시받을 토큰값 [refreshToken] 입력값에 대한 검증처리
if(body.get("cstmrSno") == null || body.get("refreshToken") == null || !(body.get("cstmrSno") instanceof Integer)) {
// 검증이 되지 않으면 "의도적인" 예외코드를 반환해줌
return ResponseEntity.status(HttpStatus.OK)
.body(new ErrorResponse(RSErrorCode.ER_PARAM));
}
@ -96,23 +126,28 @@ public class JwtAuthenticationController {
int cstmrSno = (int)body.get("cstmrSno");
String refreshToken = (String)body.get("refreshToken");
// 재 인가토큰 발급
JwtRsModel result = service.findRefreshtoken(cstmrSno, refreshToken);
// JwtRsModel result = null;
// 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));
return ResponseEntity.ok().body(new SuccessResponse<>(result));
}
/**
* 로그아웃 기능.
* @param cstmrSno
* @return
* @throws Exception
*/
@GetMapping(value = "/logout/{cstmrSno}")
@ApiOperation(value = "로그아웃 한 회원의 정보")
@Tag(name = "JWT 토큰 이용", description = "JWT 토큰 관련 API")
@ApiImplicitParam(name = "cstmrSno",value = "고객일련번호", dataTypeClass = Integer.class)
public ResponseEntity<? extends BasicResponse> logout(@PathVariable Integer cstmrSno) throws Exception{
@Operation(summary = "회원 로그아웃", description = "회원을 로그아웃 시키는 API 입니다.")
public ResponseEntity<? extends BasicResponse> logout(
@Parameter(name="cstmrSno", description = "회원번호", in = ParameterIn.PATH, example = "3")@PathVariable Integer cstmrSno) throws Exception{
// if(cstmrSno == null || !(body.get("cstmrSno") instanceof Integer)) {
// return ResponseEntity.status(HttpStatus.OK)
@ -120,10 +155,11 @@ public class JwtAuthenticationController {
// }
// int cstmrSno = (int)body.get("cstmrSno");
// 로그아웃 할 프로세스
PtyCstmrBas bas = service.logoutProcess(cstmrSno);
if(bas == null) {
// 로그아웃 프로세스 실패 시 "의도적인" 예외코드를 반환해줌
return ResponseEntity.status(HttpStatus.OK)
.body(new ErrorResponse(RSErrorCode.DATA_NOTFOUNT));
}

4
pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/model/JwtProfileRsModel.java

@ -1,5 +1,6 @@
package com.palnet.biz.api.acnt.jwt.model;
import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.Data;
@Data
@ -16,4 +17,7 @@ public class JwtProfileRsModel {
private String trmnlId;
@JsonInclude(JsonInclude.Include.ALWAYS)
private String cptAuthCode;
}

5
pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/model/JwtRqModel.java

@ -6,6 +6,8 @@ import lombok.NoArgsConstructor;
import java.io.Serializable;
import io.swagger.v3.oas.annotations.media.Schema;
@NoArgsConstructor
@AllArgsConstructor
@ -14,6 +16,9 @@ public class JwtRqModel implements Serializable {
private static final long serialVersionUID = 5926468583005150707L;
@Schema(description = "로그인 ID" , example = "loginSample01")
private String userId;
@Schema(description = "FAQ 카테고리" , example = "sample1234")
private String userPswd;
}

27
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,7 +77,7 @@ public class JwtService {
}
}
//loginError 값이 - 인경우 에러 메세지와 함꼐 반환
if (loginError < 0) {
String errorMessage = "";
@ -103,11 +102,13 @@ public class JwtService {
return resultMap;
} else {
} else { //loginError 값이 + 값이라면 로긍니 성공
// 인증이후 인가할 정보 만듬.
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
@ -232,6 +240,7 @@ public class JwtService {
Integer cstmrSnoByRefreshToken = claims.get("cstmrSno", Integer.class);
if(cstmrSnoByRefreshToken != cstmrSno) return null;
// 인가 토큰 발행할수 있게 필요한 회원 정보들을 데이터베이스에서 조회함.
JwtUserModel userDetails = query.findByIdForrefreshToken(cstmrSno);
String createAccessToken = jwtTokenUtil.generateToken(userDetails);

8
pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/utils/JwtTokenUtil.java

@ -5,7 +5,7 @@ import com.palnet.biz.api.acnt.jwt.model.JwtUserModel;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import lombok.extern.log4j.Log4j2;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.stereotype.Component;
@ -17,8 +17,8 @@ import java.io.Serializable;
import java.util.*;
import java.util.function.Function;
@Slf4j
@Component
@Log4j2
public class JwtTokenUtil implements Serializable {
private static final long serialVersionUID = -2550185165626007488L;
@ -146,6 +146,10 @@ public class JwtTokenUtil implements Serializable {
return cstmrSno;
}
/**
* 회원 인가정보로 그룹
* @return
*/
public List<JwtGroupModel> getGroupAuthByToken() {
HttpServletRequest rq = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
String token = rq.getHeader("Authorization");

13
pav-server/src/main/java/com/palnet/biz/api/acnt/terms/controller/AcntTermsController.java

@ -6,7 +6,7 @@ import com.palnet.biz.api.acnt.terms.service.AcntTermsService;
import com.palnet.biz.api.comn.response.BasicResponse;
import com.palnet.biz.api.comn.response.ErrorResponse;
import com.palnet.biz.api.comn.response.SuccessResponse;
import io.swagger.annotations.ApiOperation;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j2;
@ -28,16 +28,21 @@ public class AcntTermsController {
private final AcntTermsService service;
/**
* 약관정보 들을 가져오는 기능,
* AcntTermsRqModel에 입력받은 약관타입에 따른 약관항목을 반환함.
* @param rq
* @return
*/
@Operation(summary = "약관 조회", description = "약관 정보를 조회하는 API 입니다.")
@GetMapping(value = "/list")
@Tag(name = "약관 기본", description = "약관 관련 API")
@ApiOperation(value = "약관 기본 정보")
public ResponseEntity<? extends BasicResponse> list(AcntTermsRqModel rq) {
List<AcntTermsRsModel> result = null;
log.debug("RQ>>>>>>>>" , rq.toString());
try {
result = service.list(rq);
result = service.list(rq); // 입력받은 값에 따른 약관항목을 반환하는 기능.
} catch (Exception e) {

7
pav-server/src/main/java/com/palnet/biz/api/acnt/terms/model/AcntTermsRqModel.java

@ -1,5 +1,6 @@
package com.palnet.biz.api.acnt.terms.model;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
@ -10,7 +11,13 @@ import lombok.NoArgsConstructor;
@NoArgsConstructor
@AllArgsConstructor
public class AcntTermsRqModel {
@Schema(description = "사이트 코드" , example = "SANDBOX")
private String siteCd;
@Schema(description = "약관 카테고리 코드" , example = "SITE_JOIN")
private String termsCtgryCd;
@Schema(description = "언어 코드" , example = "KOR")
private String langDivCd;
}

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

83
pav-server/src/main/java/com/palnet/biz/api/anls/hstry/controller/AnlsHstryController.java

@ -9,11 +9,13 @@ import com.palnet.biz.api.comn.response.BasicResponse;
import com.palnet.biz.api.comn.response.ErrorResponse;
import com.palnet.biz.api.comn.response.SuccessResponse;
import com.palnet.comn.code.RSErrorCode;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.enums.ParameterIn;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j2;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
@ -24,7 +26,7 @@ import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@Log4j2
@Slf4j
@RestController
@RequiredArgsConstructor
@RequestMapping(value = "/api/anls/hstry", produces = {MediaType.APPLICATION_JSON_VALUE})
@ -33,23 +35,36 @@ public class AnlsHstryController {
private final AnlsHstryService service;
/**
* 비행현황 목록 리스트 조회하는 기능,
* AnlsHstryGroupModel에 따른 리스트를 조회함.
* @param rq
* @return
*/
@GetMapping(value = "/list")
@ApiOperation(value = "비행 현황 목록 출력")
@Tag(name = "비행 이력 현황", description = "비행 이력 현황 관련 API")
@Operation(summary = "비행 현황 목록 출력", description = "비행 현황 목록을 출력하는 API 입니다.")
public ResponseEntity<? extends BasicResponse> list(AnlsHstryGroupModel rq) {
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,17 +74,30 @@ public class AnlsHstryController {
}
/**
* 비행현황의 상세정보를 조회함,
* 비행ID[CNTRL_ID] 조회함
* @param id
* @return
*/
@GetMapping(value = "/detail/{id}")
@ApiOperation(value = "비행 현황 상세")
@Tag(name = "비행 이력 현황", description = "비행 이력 현황 관련 API")
@ApiImplicitParam(name = "id",value = "관제ID", dataTypeClass = String.class)
public ResponseEntity<? extends BasicResponse> detail(@PathVariable String id) {
@Operation(summary = "비행 현황 상세 정보 출력", description = "비행 현황 상세 정보를 출력하는 API 입니다.")
public ResponseEntity<? extends BasicResponse> detail(
@Parameter(name="id", description = "개체 비행 ID", in = ParameterIn.PATH, example = "061fbd9d-25c5-4801-bb11-2307a8eb8d8f") @PathVariable String id) {
AnlsHstryModel result = null;
try {
result = service.detail(id);
result = service.detail(id); // 비행ID[CNTRL_ID]로 비행 상세정보를 조회하는 기능.
} catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
@ -80,16 +108,31 @@ public class AnlsHstryController {
}
/**
* 비행이력을 조회함,
* 비행ID[CNTRL_ID] 조회함
* @param id
* @return
*/
@GetMapping(value = "/log/{id}")
@ApiOperation(value = "비행 이력 데이터")
@Tag(name = "비행 이력 현황", description = "비행 이력 현황 관련 API")
@ApiImplicitParam(name = "id",value = "관제ID", dataTypeClass = String.class)
public ResponseEntity<? extends BasicResponse> log(@PathVariable String id) {
// @ApiOperation(value = "비행 이력 데이터")
// @Tag(name = "비행 이력 현황", description = "비행 이력 현황 관련 API")
// @ApiImplicitParam(name = "id",value = "관제ID", dataTypeClass = String.class)
@Operation(summary = "비행 현황 이력 출력", description = "비행 현황의 이력을 출력하는 API 입니다.")
public ResponseEntity<? extends BasicResponse> log(
@Parameter(name="id", description = "개체 비행 ID", in = ParameterIn.PATH, example = "061fbd9d-25c5-4801-bb11-2307a8eb8d8f") @PathVariable String id) {
List<AnlsHstryDetailModel> result = null;
try {
result = service.hstryList(id);
try {
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"));

7
pav-server/src/main/java/com/palnet/biz/api/anls/hstry/model/AnlsHstryGroupModel.java

@ -1,6 +1,8 @@
package com.palnet.biz.api.anls.hstry.model;
import com.palnet.biz.api.comn.model.ComnPagingModel;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
@ -8,14 +10,19 @@ import lombok.EqualsAndHashCode;
@EqualsAndHashCode(callSuper=false)
public class AnlsHstryGroupModel extends ComnPagingModel {
@Schema(description = "검색 시작날짜" , example = "2023-11-01", implementation = String.class)
private String stDate;
@Schema(description = "검색 종료날짜" , example = "2023-11-30", implementation = String.class)
private String endDate;
@Schema(hidden = true)
private String search1;
@Schema(hidden = true)
private String searchType1;
@Schema(description = "그룹 아이디", example = "C807F9")
private String groupId;
}

5
pav-server/src/main/java/com/palnet/biz/api/anls/hstry/model/AnlsHstryRqModel.java

@ -2,11 +2,14 @@ package com.palnet.biz.api.anls.hstry.model;
import com.palnet.biz.api.comn.model.ComnRqModel;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
@Data
@EqualsAndHashCode(callSuper=false)
public class AnlsHstryRqModel extends ComnRqModel{
public class AnlsHstryRqModel extends ComnRqModel {
@Schema(description = "개체 비행 ID" , example = "061fbd9d-25c5-4801-bb11-2307a8eb8d8f")
private String cntrlId;
}

84
pav-server/src/main/java/com/palnet/biz/api/anls/hstry/service/AnlsHstryService.java

@ -5,6 +5,8 @@ import java.util.List;
import java.util.Optional;
import com.palnet.biz.api.comn.model.ComnPagingRs;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
@ -35,50 +37,42 @@ import com.palnet.biz.jpa.repository.pty.PtyCstmrGroupRepository;
import com.palnet.comn.code.ErrorCode;
import com.palnet.comn.exception.CustomException;
@Slf4j
@RequiredArgsConstructor
@Service
public class AnlsHstryService {
private Logger logger = LoggerFactory.getLogger(getClass());
@Autowired
private CtrCntrlBasRepository ctrCntrlBasRepository;
@Autowired
private PtyCstmrGroupRepository ptyCstmrGroupRepository;
@Autowired
private ComArcrftBasRepository comArcrftBasRepository;
@Autowired
private ComIdntBasRepository comIdntBasRepository;
@Autowired
private CtrCntrlHstryAreaRepository ctrCntrlHstryAreaRepository;
@Autowired
private FltPlanBasRepository fltPlanBasRepository;
@Autowired
private FltPlanPilotRepository fltPlanPilotRepository;
@Autowired
private CtrCntrlQueryRepository query;
@Autowired
private JwtTokenUtil jwtTokenUtil;
//비행이력현황 list
private final CtrCntrlBasRepository ctrCntrlBasRepository;
private final PtyCstmrGroupRepository ptyCstmrGroupRepository;
private final ComArcrftBasRepository comArcrftBasRepository;
private final ComIdntBasRepository comIdntBasRepository;
private final CtrCntrlHstryAreaRepository ctrCntrlHstryAreaRepository;
private final FltPlanBasRepository fltPlanBasRepository;
private final FltPlanPilotRepository fltPlanPilotRepository;
private final CtrCntrlQueryRepository query;
private final JwtTokenUtil jwtTokenUtil;
/**
* 비행현황 목록 조회하는 기능.
* @param rq
* @return
*/
public ComnPagingRs<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 +80,30 @@ public class AnlsHstryService {
}
}
}
// 그룹에서의 권한이 NORMAL인 경우
if("NORMAL".equals(groupAuth)) {
for (JwtGroupModel list : groupAuthList) {
if("MASTER".equals(list.getGroupAuthCd()) || "LEADER".equals(list.getGroupAuthCd())) {
adminAuth.add(list);
}
}
List<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();
@ -126,18 +127,26 @@ 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 +154,11 @@ public class AnlsHstryService {
}
/**
* 비행이력을 비행ID[CNTRL_ID] 조회하는 기능.
* @param id
* @return
*/
public List<AnlsHstryDetailModel> hstryList(@PathVariable String id) {
List<AnlsHstryDetailModel> result = query.listCntrlHstryPage(id);

111
pav-server/src/main/java/com/palnet/biz/api/anls/smlt/controller/AnlsSmltController.java

@ -1,20 +1,5 @@
package com.palnet.biz.api.anls.smlt.controller;
import java.util.List;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.palnet.biz.api.anls.hstry.model.AnlsHstryDetailModel;
import com.palnet.biz.api.anls.hstry.model.AnlsHstryModel;
import com.palnet.biz.api.anls.hstry.model.AnlsHstryRqModel;
@ -28,8 +13,22 @@ import com.palnet.biz.api.comn.response.SuccessResponse;
import com.palnet.comn.code.RSErrorCode;
import com.palnet.comn.utils.JsonUtils;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.enums.ParameterIn;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@Log4j2
@RestController
@ -42,30 +41,38 @@ public class AnlsSmltController {
private final AnlsSmltService service;
/**
* 비행 현황 목록
* 비행현황 목록 리스트 조회하는 기능,
* AnlsHstryRqModel 따른 리스트를 조회함.
* @param rq
* @return
*/
@GetMapping(value = "/list")
@ApiOperation(value = "비행 현황 목록")
@Tag(name = "비행 시뮬레이션", description = "비행 이력 시뮬레이션 관련 API")
@Operation(summary = "비행 시뮬레이션 - 비행 현황 목록", description = "비행 시뮬레이션에서 비행 현황 목록을 조회하는 API 입니다.")
public ResponseEntity<? extends BasicResponse> list(AnlsHstryRqModel rq) {
ComnPagingRs<AnlsHstryModel> result = null;
log.debug("JSON>>>>>>>>" , JsonUtils.toJson(rq));
log.debug("Param" + rq.getStDate() + "::" + rq.getEndDate());
//입력값 검증
// 검색 시작일 날짜[stDate], 검색 끝일 날짜 날짜값[endDate], 날짜값이 10자리인지 확인[정해진 포맷팅인지 확인하는 것] 입력값 검증처리
if(rq.getStDate() == null || !(rq.getStDate().length() == 10) || rq.getEndDate() ==null || !(rq.getEndDate().length() == 10) ) {
return ResponseEntity.status(HttpStatus.OK)
// 검증통과하지 못할 시 서버에서 "의도적인" 에러 반환
return ResponseEntity.status(HttpStatus.OK) // "의도적인" 에러 반환코드
.body(new ErrorResponse(RSErrorCode.ER_PARAM));
}
try {
result = service.list(rq);
result = service.list(rq); // 비행현황 목록 조회하는 기능.
} catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
@ -77,22 +84,29 @@ public class AnlsSmltController {
/**
* 비행 이력 데이터 조회
* 비행 이력 데이터 조회하는 기능,061fbd9d-25c5-4801-bb11-2307a8eb8d8f
* 비행ID[CNTRL_ID] 조회함
* @param rq
* @return
*/
@GetMapping(value = "/hist/{id}")
@ApiOperation(value = "비행 이력 데이터 조회")
@Tag(name = "비행 시뮬레이션", description = "비행 이력 시뮬레이션 관련 API")
@ApiImplicitParam(name = "id",value = "관제ID", dataTypeClass = String.class)
public ResponseEntity<? extends BasicResponse> histList(@PathVariable String id) {
@Operation(summary = "비행 시뮬레이션 - 비행 이력 데이터 조회", description = "비행 시뮬레이션에서 비행 이력 데이터를 조회하는 API 입니다.")
public ResponseEntity<? extends BasicResponse> histList(
@Parameter(name="id", description = "개체 비행 ID", in = ParameterIn.PATH, example = "061fbd9d-25c5-4801-bb11-2307a8eb8d8f") @PathVariable String id) {
List<AnlsHstryDetailModel> result = null;
try {
// result = service.list(rq);
result = service.histList(id);
result = service.histList(id); // 비행ID[CNTRL_ID]로 비행이력을 조회하는 기능.
} catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
@ -104,23 +118,30 @@ public class AnlsSmltController {
/**
* 통계 데이터 조회
* 통계 데이터 조회,
* 비행ID[CNTRL_ID] 조회함
* @param rq
* @return
*/
@GetMapping(value = "/stcs/{id}")
@ApiOperation(value = "통계 데이터 조회")
@Tag(name = "비행 시뮬레이션", description = "비행 이력 시뮬레이션 관련 API")
@ApiImplicitParam(name = "id",value = "관제ID", dataTypeClass = String.class)
public ResponseEntity<? extends BasicResponse> stcsList(@PathVariable String id) {
@Operation(summary = "비행 시뮬레이션 - 비행 이력 통계 데이터 조회", description = "비행 시뮬레이션에서 비행 이력 통계 데이터 조회하는 API 입니다.")
public ResponseEntity<? extends BasicResponse> stcsList(
@Parameter(name="id", description = "개체 비행 ID", in = ParameterIn.PATH, example = "061fbd9d-25c5-4801-bb11-2307a8eb8d8f") @PathVariable String id) {
List<AnlsSmltStcsModel> result = null;
try {
result = service.stcsList(id);
result = service.stcsList(id); // 통계 데이터 조회하는 기능
} catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
@ -131,21 +152,31 @@ public class AnlsSmltController {
}
/**
* 비행 상세정보 조회
* 비행 상세정보 조회,
* 비행ID[CNTRL_ID] 조회함
* @param id
* @return
*/
@GetMapping(value = "/detail/{id}")
@ApiOperation(value = "비행 상세정보 조회")
@Tag(name = "비행 시뮬레이션", description = "비행 이력 시뮬레이션 관련 API")
@ApiImplicitParam(name = "id",value = "관제ID", dataTypeClass = String.class)
public ResponseEntity<? extends BasicResponse> detail(@PathVariable String id) {
// @ApiOperation(value = "비행 상세정보 조회")
// @Tag(name = "비행 시뮬레이션", description = "비행 이력 시뮬레이션 관련 API")
// @ApiImplicitParam(name = "id",value = "관제ID", dataTypeClass = String.class)
@Operation(summary = "비행 시뮬레이션 - 비행 상세 정보 조회", description = "비행 시뮬레이션에서 비행 상세 정보 데이터를 조회하는 API 입니다.")
public ResponseEntity<? extends BasicResponse> detail(
@Parameter(name="id", description = "개체 비행 ID", in = ParameterIn.PATH, example = "061fbd9d-25c5-4801-bb11-2307a8eb8d8f")@PathVariable String id) {
AnlsSmltDetailModel result = null;
try {
result = service.detail(id);
result = service.detail(id); // 비행ID[CNTRL_ID]로 비행상세정보 조회함
} catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));

18
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);
//

191
pav-server/src/main/java/com/palnet/biz/api/bas/dron/controller/BasDronController.java

@ -1,9 +1,6 @@
package com.palnet.biz.api.bas.dron.controller;
import com.palnet.biz.api.bas.dron.model.BasDronModel;
import com.palnet.biz.api.bas.dron.model.BasDronRqModel;
import com.palnet.biz.api.bas.dron.model.BasIdntfModel;
import com.palnet.biz.api.bas.dron.model.BasIdntfRqModel;
import com.palnet.biz.api.bas.dron.model.*;
import com.palnet.biz.api.bas.dron.service.BasDronService;
import com.palnet.biz.api.comn.model.ComnPagingRs;
import com.palnet.biz.api.comn.response.BasicResponse;
@ -11,11 +8,13 @@ import com.palnet.biz.api.comn.response.ErrorResponse;
import com.palnet.biz.api.comn.response.SuccessResponse;
import com.palnet.comn.code.RSErrorCode;
import com.palnet.comn.exception.CustomException;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.enums.ParameterIn;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
@ -39,60 +38,74 @@ public class BasDronController {
/**
* 목록 조회
* 드론 목록 조회기능,
* BasDronRqModel에 조회할 조건 값들이 들어있음
* @param rq
* @return
*/
@GetMapping(value = "/list")
@ApiOperation(value = "드론 목록 조회")
@Tag(name = "드론 컨트롤러", description = "드론 관련 API")
@Operation(summary = "드론목록 조회", description = "검색조건에 맞춰 드론목록을 조회합니다.")
public ResponseEntity<? 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"));
}
return ResponseEntity.ok().body(new SuccessResponse<>(result));
}
/**
* 식별정보 조회
* 식별정보 조회하는 기능,
* 기체 일련번호[arcrftSno] 조회함.
* @param rq
* @return
*/
@GetMapping(value = "/idntf/list/{id}")
@ApiOperation(value = "식별정보 조회")
@Tag(name = "드론 컨트롤러", description = "드론 관련 API")
@ApiImplicitParam(name = "id",value = "기체일련번호", dataTypeClass = Integer.class)
public ResponseEntity<? extends BasicResponse> mylist(@PathVariable Integer id) {
@Operation(summary = "드론정보 조회", description = "드론[기체]일련번호로 식별장치를 조회합니다.")
public ResponseEntity<? extends BasicResponse> mylist(@Parameter(name="id", description = "기체일련번호", in = ParameterIn.PATH, example = "6") @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,28 +117,35 @@ public class BasDronController {
/**
* 상세 조회
* 드론 상세 조회,
* 기체일련번호[arcrftSno] 드론 상세조회하는 기능.
* @param id
* @return
*/
@GetMapping(value = "/detail/{id}")
@ApiOperation(value = "드론 상세 조회")
@Tag(name = "드론 컨트롤러", description = "드론 관련 API")
@ApiImplicitParam(name = "id",value = "기체일련번호", dataTypeClass = Integer.class)
public ResponseEntity<? extends BasicResponse> detail(@PathVariable Integer id) {
@Operation(summary = "드론정보 상세조회", description = "기체일련번호로 드론상세 조회합니다.")
public ResponseEntity<? extends BasicResponse> detail(@Parameter(name="id", description = "기체일련번호", in = ParameterIn.PATH, example = "1") @PathVariable Integer id) {
BasDronModel result = null;
try {
//입력값 검증
// 기체일련번호확인[id] 입력값 검증처리
if(StringUtils.isEmpty(id)) {
return ResponseEntity.status(HttpStatus.OK)
// 검증통과하지 못할 시 서버에서 "의도적인" 에러 반환
return ResponseEntity.status(HttpStatus.OK) // "의도적인" 에러 반환코드
.body(new ErrorResponse(RSErrorCode.ER_PARAM));
}
result = service.detail(id);
result = service.detail(id); // 드론 상세 조회하는 기능.
} catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
@ -137,26 +157,48 @@ public class BasDronController {
/**
* 생성
* 드론정보 생성하는 기능,
* BasDronModel 모델에 드론 입력정보로 드론정보 생성함.
* @return
*/
@PostMapping(value = "/create")
@ApiOperation(value = "드론정보 생성")
@Tag(name = "드론 컨트롤러", description = "드론 관련 API")
public ResponseEntity<? extends BasicResponse> create(@RequestBody BasDronModel rq) {
@Operation(summary = "드론정보 추가", description = "드론[기체] 정보를 추가합니다, 예시를 바꿔 추가할 수 있습니다.")
// @ApiOperation(value = "드론정보 생성")
// @Tag(name = "드론 컨트롤러", description = "드론 관련 API")
public ResponseEntity<? extends BasicResponse> create(@RequestBody BasDronInsertModel rq) {
Map<String , Object> resultMap = new HashMap<String,Object>();
BasDronModel basDronModel = new BasDronModel();
BeanUtils.copyProperties(rq, basDronModel);
log.warn("basDronModel => {}", basDronModel);
try {
boolean result = service.create(rq);
boolean result = service.create(basDronModel); // 드론 정보 생성하는 기능.
resultMap.put("result", result);
}catch(CustomException e2) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* CustomException은 개발자가 "의도적으로" 예외처리,
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : {}", e2);
resultMap.put("result", false);
resultMap.put("errorCode", e2.getErrorCode());
return ResponseEntity.ok().body(new SuccessResponse<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,28 +209,43 @@ public class BasDronController {
}
/**
* 생성
* 식별장치 생성하는 기능,
* BasIdntfRqModel 모델에 입력받은 식별장치정보 생성함/
* @return
*/
@PostMapping(value = "/idntf/create")
@ApiOperation(value = "식별장치 생성")
@Tag(name = "드론 컨트롤러", description = "드론 관련 API")
@Operation(summary = "드론식별장치정보 추가", description = "드론의 식별장치정보를 추가합니다, 예시를 바꿔 추가할 수 있습니다.")
public ResponseEntity<? extends BasicResponse> createIdntf(@RequestBody BasIdntfRqModel rq) {
Map<String , Object> resultMap = new HashMap<String,Object>();
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,27 +256,45 @@ public class BasDronController {
}
/**
* 수정
* 드론 정보 수정하는 기능,
* BasDronModel에 입력받은 수정할 정보를 데이터베이스에 수정함.
* @return
*/
@PutMapping(value = "/update")
@ApiOperation(value = "드론정보 수정")
@Tag(name = "드론 컨트롤러", description = "드론 관련 API")
public ResponseEntity<? extends BasicResponse> update(@RequestBody BasDronModel rq) {
@Operation(summary = "드론정보 수정", description = "드론[기체] 정보를 수정합니다, 예시를 바꿔 추가할 수 있습니다.")
public ResponseEntity<? extends BasicResponse> update(@RequestBody BasDronUpdateModel rq) {
Map<String , Object> resultMap = new HashMap<String,Object>();
BasDronModel basDronModel = new BasDronModel();
BeanUtils.copyProperties(rq, basDronModel);
try {
boolean result = service.update(rq);
boolean result = service.update(basDronModel); // 드론정보 수정하는 기능.
resultMap.put("result", result);
}
catch(CustomException e2) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* CustomException은 개발자가 "의도적으로" 예외처리,
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : {}", e2);
resultMap.put("result", false);
resultMap.put("errorCode", e2.getErrorCode());
return ResponseEntity.ok().body(new SuccessResponse<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,15 +305,14 @@ public class BasDronController {
}
/**
* 삭제
* 드론정보 삭제하는 기능,
* 기체일련번호[arcrftSno] 삭제함
* @param id
* @return
*/
@DeleteMapping(value = "/delete/{id}")
@ApiOperation(value = "드론정보 삭제")
@Tag(name = "드론 컨트롤러", description = "드론 관련 API")
@ApiImplicitParam(name = "id",value = "기체일련번호", dataTypeClass = Integer.class)
public ResponseEntity<? extends BasicResponse> delete(@PathVariable Integer id) {
@Operation(summary = "드론정보 삭제", description = "드론[기체] 정보를 삭제합니다. [예제값은 이미 삭제되어있을 수도 있으니 드론기체를 추가해서 삭제 테스트 진행해주세요.]")
public ResponseEntity<? extends BasicResponse> delete(@Parameter(name="id", description = "기체일련번호", in = ParameterIn.PATH, example = "6") @PathVariable Integer id) {
Map<String , Object> resultMap = new HashMap<String,Object>();
try {
@ -269,25 +343,30 @@ public class BasDronController {
* @return
*/
@DeleteMapping(value = "/idntf/delete/{id}")
@ApiOperation(value = "식별장치 삭제")
@Tag(name = "드론 컨트롤러", description = "드론 관련 API")
@ApiImplicitParam(name = "id",value = "식별번호", dataTypeClass = String.class)
public ResponseEntity<? extends BasicResponse> deleteIdntf(@PathVariable String id) {
@Operation(summary = "드론식별장치 삭제", description = "드론[기체]식별장치 정보를 삭제합니다. [예제값은 이미 삭제되어있을 수도 있으니 식별장치를 추가해서 삭제 테스트 진행해주세요.]")
public ResponseEntity<? extends BasicResponse> deleteIdntf(@Parameter(name="id", description = "기체식별장치 일련번호", in = ParameterIn.PATH, example = "PA0003")@PathVariable String id) {
Map<String , Object> resultMap = new HashMap<String,Object>();
try {
//입력값 검증
// 기체일련번호확인[id] 입력값 검증처리
if(StringUtils.isEmpty(id)) {
return ResponseEntity.status(HttpStatus.OK)
// 검증통과하지 못할 시 서버에서 "의도적인" 에러 반환
return ResponseEntity.status(HttpStatus.OK) // "의도적인" 에러 반환코드
.body(new ErrorResponse(RSErrorCode.ER_PARAM));
}
boolean result = service.deleteIdntf(id);
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"));

46
pav-server/src/main/java/com/palnet/biz/api/bas/dron/model/BasDronInsertModel.java

@ -0,0 +1,46 @@
package com.palnet.biz.api.bas.dron.model;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.media.Schema.RequiredMode;
import lombok.Data;
@Data
public class BasDronInsertModel {
@Schema(description = "그룹명", example = "KAC")
private String groupNm;
@Schema(description = "그룹아이디", example = "C807F9")
private String groupId;
@Schema(description = "제작번호", example = "PAV_KAC")
private String prdctNum;
@Schema(description = "기체모델명", example = "PAV_001")
private String arcrftModelNm;
@Schema(description = "기체종류코드 [01: 무인비행기, 02: 무인헬리콥터, 03: 멀티콥터, 04: 비행선]", example = "01")
private String arcrftTypeCd;
@Schema(description = "중량구분코드[-250G, 250G+2KG-, 2KG+7KG-, 25KG+]", example = "2KG+7KG-")
private String wghtTypeCd;
@Schema(description = "카메라 탑재 여부", example = "N")
private String cameraYn;
@Schema(description = "보험가입여부", example = "Y")
private String insrncYn;
@Schema(description = "제작자", example = "팔네트웍스")
private String prdctCmpnNm;
@Schema(description = "이미지 URL [업로드하는 이미지]", example = "PAV_KAC")
private String imageUrl;
@Schema(description = "등록사용자", example = "palnet")
private String createUserId;
@Schema(description = "수정한 사용자", example = "palnet")
private String updateUserId;
}

3
pav-server/src/main/java/com/palnet/biz/api/bas/dron/model/BasDronModel.java

@ -2,6 +2,9 @@ package com.palnet.biz.api.bas.dron.model;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.palnet.biz.config.convert.InstantDateStrSerializer;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.media.Schema.RequiredMode;
import lombok.Data;
import java.time.Instant;

9
pav-server/src/main/java/com/palnet/biz/api/bas/dron/model/BasDronRqModel.java

@ -2,6 +2,8 @@ package com.palnet.biz.api.bas.dron.model;
import com.palnet.biz.api.comn.model.ComnPagingModel;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.media.Schema.RequiredMode;
import lombok.Data;
import lombok.EqualsAndHashCode;
@ -9,15 +11,18 @@ import lombok.EqualsAndHashCode;
@EqualsAndHashCode(callSuper=false)
public class BasDronRqModel extends ComnPagingModel {
@Schema(description = "그룹아이디" , example = "C807F9", requiredMode = RequiredMode.REQUIRED)
private String groupId;
@Schema(description = "기체모델명" , example = "PAV_001", requiredMode = RequiredMode.NOT_REQUIRED)
private String arcrftModelNm;
@Schema(description = "기체종류코드" , example = "01", requiredMode = RequiredMode.NOT_REQUIRED)
private String arcrftTypeCd;
@Schema(description = "기체식별번호" , example = "PA0001", hidden = true)
private String idntfNum;
@Schema(description = "소유자 명" , example = "팔네트웍스", hidden = true)
private String ownerNm;
}

45
pav-server/src/main/java/com/palnet/biz/api/bas/dron/model/BasDronUpdateModel.java

@ -0,0 +1,45 @@
package com.palnet.biz.api.bas.dron.model;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.media.Schema.RequiredMode;
import lombok.Data;
@Data
public class BasDronUpdateModel {
@Schema(description = "그룹명", example = "KAC", implementation = String.class)
private String groupNm;
@Schema(description = "그룹아이디", example = "C807F9", implementation = String.class)
private String groupId;
@Schema(description = "제작번호", example = "PAV_KAC", implementation = String.class)
private String prdctNum;
@Schema(description = "기체모델명", example = "PAV_001", implementation = String.class)
private String arcrftModelNm;
@Schema(description = "기체종류코드 [01: 무인비행기, 02: 무인헬리콥터, 03: 멀티콥터, 04: 비행선]", example = "01", implementation = String.class)
private String arcrftTypeCd;
@Schema(description = "중량구분코드[-250G, 250G+2KG-, 2KG+7KG-, 25KG+]", example = "2KG+7KG-")
private String wghtTypeCd;
@Schema(description = "카메라 탑재 여부", example = "N", implementation = String.class)
private String cameraYn;
@Schema(description = "보험가입여부", example = "Y", implementation = String.class)
private String insrncYn;
@Schema(description = "제작자", example = "팔네트웍스", implementation = String.class)
private String prdctCmpnNm;
@Schema(description = "이미지 URL [업로드하는 이미지]", example = "PAV_KAC", implementation = String.class)
private String imageUrl;
@Schema(description = "기체일련번호", example = "6", requiredMode = RequiredMode.REQUIRED, implementation = Integer.class)
private Integer arcrftSno;
@Schema(description = "수정한 사용자", example = "palnet", implementation = String.class)
private String updateUserId;
}

15
pav-server/src/main/java/com/palnet/biz/api/bas/dron/model/BasIdntfModel.java

@ -4,28 +4,43 @@ import lombok.Data;
import java.time.Instant;
import io.swagger.v3.oas.annotations.media.Schema;
@Data
public class BasIdntfModel {
//식별 번호 정보
@Schema(hidden = true)
private String id;
@Schema(description = "식별장치 고유명", example = "PA0003")
private String idntfNum;
@Schema(hidden = true)
private String isSave;
@Schema(hidden = true)
private int arcrftSno;
@Schema(description = "식별장치종류코드", example = "DRON")
private String idntfTypeCd;
@Schema(description = "소유자명", example = "팔네트웍스")
private String ownerNm;
@Schema(description = "소유자 휴대폰번호", example = "01044322231")
private String hpno;
@Schema(hidden = true)
private Instant updateDt;
@Schema(hidden = true)
private Instant createDt;
@Schema(hidden = true)
private int cstmrSno;
@Schema(hidden = true)
private String groupId;
}

4
pav-server/src/main/java/com/palnet/biz/api/bas/dron/model/BasIdntfRqModel.java

@ -1,14 +1,18 @@
package com.palnet.biz.api.bas.dron.model;
import java.util.ArrayList;
import java.util.List;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
public class BasIdntfRqModel {
@Schema(description = "기체 식별정보들", implementation = BasIdntfModel.class)
private List<BasIdntfModel> data;
@Schema(description = "기체일련번호", example = "6")
private int arcrftSno;
}

30
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);
@ -219,6 +227,12 @@ public class BasDronService {
}
/**
* 입력받은 드론정보 데이터베이스에 생성함.
* @param model
* @return
* @throws Exception
*/
public ComArcrftBas insertComArcrftBas(BasDronModel model) throws Exception{
@ -261,7 +275,7 @@ public class BasDronService {
/**
* 수정
* 드론정보 수정하는 기능.
* @param
* @return
* @throws Exception
@ -320,6 +334,12 @@ public class BasDronService {
}
/**
* 입력받은 드론 수정정보로 데이터베이스에 수정함.
* @param model
* @return
* @throws Exception
*/
public ComArcrftBas updateComArcrftBas(BasDronModel model) throws Exception{

398
pav-server/src/main/java/com/palnet/biz/api/bas/flight/controller/BasFlightController.java

@ -1,51 +1,6 @@
package com.palnet.biz.api.bas.flight.controller;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;
import org.locationtech.jts.geom.Coordinate;
import org.locationtech.jts.geom.GeometryFactory;
import org.locationtech.jts.geom.MultiPoint;
import org.locationtech.jts.geom.Point;
import org.locationtech.jts.geom.Polygon;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.env.Environment;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import com.palnet.biz.api.bas.flight.model.BasFlightAprovRq;
import com.palnet.biz.api.bas.flight.model.BasFlightPlanArcrftModel;
import com.palnet.biz.api.bas.flight.model.BasFlightPlanAreaModel;
import com.palnet.biz.api.bas.flight.model.BasFlightPlanListRq;
import com.palnet.biz.api.bas.flight.model.BasFlightPlanModel;
import com.palnet.biz.api.bas.flight.model.BasFlightPlanPilotModel;
import com.palnet.biz.api.bas.flight.model.BasFlightScheduleRs;
import com.palnet.biz.api.bas.flight.model.BasFlightWeatherModel;
import com.palnet.biz.api.bas.flight.model.*;
import com.palnet.biz.api.bas.flight.service.BasFlightService;
import com.palnet.biz.api.comn.file.service.ComnFileService;
import com.palnet.biz.api.comn.model.ComnPagingRs;
@ -55,20 +10,33 @@ import com.palnet.biz.api.comn.response.SuccessResponse;
import com.palnet.biz.scheduler.ctr.service.CtrTrnsLctnService;
import com.palnet.comn.exception.CustomException;
import com.palnet.comn.utils.AreaUtils;
import com.palnet.comn.utils.FlightUtils;
import com.palnet.comn.utils.PdfUtils;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;
import org.locationtech.jts.geom.Coordinate;
import org.springframework.core.env.Environment;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.io.*;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Slf4j
@Tag(name = "비행계획서", description = "비행계획서 관련 API")
@RequiredArgsConstructor
@RestController
@RequestMapping(value = "/api/bas/flight", produces = {MediaType.APPLICATION_JSON_VALUE})
@Tag(name = "비행계획서", description = "비행계획서 관련 API")
public class BasFlightController {
private final BasFlightService basFlightService;
@ -78,9 +46,15 @@ public class BasFlightController {
private final ComnFileService comnFileService;
private final PdfUtils pdfUtils;
/**
* 공역데이터 내려주는 기능.
* @return
* @throws IOException
* @throws ParseException
*/
@GetMapping("/area")
@Tag(name = "비행계획서", description = "비행계획서 관련 API")
public ResponseEntity<Object> findAirSpace() throws IOException, ParseException {
// 1. file read
Resource resource = new ClassPathResource("air/airgeo.json");
InputStream jsonInputStream = resource.getInputStream();
@ -102,16 +76,28 @@ public class BasFlightController {
return ResponseEntity.ok().body(airArea);
}
// 비행계획서 조회
/**
* 비행계획서 조회하는 기능,
* BasFlightPlanListRq 모델에 조건값에 따라 조회함.
* @param rq
* @return
*/
@GetMapping(value = "/plan/list")
@ApiOperation(value = "비행계획서 조회")
@Tag(name = "비행계획서", description = "비행계획서 관련 API")
// @ApiOperation(value = "비행계획서 조회")
// @Tag(name = "비행계획서", description = "비행계획서 관련 API")
public ResponseEntity<? extends BasicResponse> findPlanList(BasFlightPlanListRq rq) {
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,16 +106,28 @@ public class BasFlightController {
return ResponseEntity.ok().body(new SuccessResponse<>(result));
}
// 비행계획서 상세 조회
/**
* 비행계획서 상세 조회기능,
* 비행계획서 번호[planSno] 상세조회
* @param planSno
* @return
*/
@GetMapping(value = "/plan/detail/{planSno}")
@ApiOperation(value = "비행계획서 상세 조회")
@Tag(name = "비행계획서", description = "비행계획서 관련 API")
@ApiImplicitParam(name = "planSno", value = "비행계획서일련번호", dataTypeClass = Integer.class)
// @ApiOperation(value = "비행계획서 상세 조회")
// @Tag(name = "비행계획서", description = "비행계획서 관련 API")
// @ApiImplicitParam(name = "planSno", value = "비행계획서일련번호", dataTypeClass = Integer.class)
public ResponseEntity<? 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 +136,46 @@ public class BasFlightController {
return ResponseEntity.ok().body(new SuccessResponse<>(result));
}
// 비행계획서 등록
/**
* 비행계획서 등록하는 기능,
* BasFlightPlanModel모델에 입력받은값으로 등록함.
* @param rq
* @return
*/
@PostMapping(value = "/plan/create")
@ApiOperation(value = "비행계획서 등록")
@Tag(name = "비행계획서", description = "비행계획서 관련 API")
// @ApiOperation(value = "비행계획서 등록")
// @Tag(name = "비행계획서", description = "비행계획서 관련 API")
public ResponseEntity<? 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 +184,43 @@ public class BasFlightController {
return ResponseEntity.ok().body(new SuccessResponse<>(resultMap));
}
// 비행계획서 수정
/**
* 비행계획서 수정하는 기능,
* BasFlightPlanModel 모델에 입력받은 값으로 수정함
* @param rq
* @return
*/
@PutMapping(value = "/plan/update")
@ApiOperation(value = "비행계획서 수정")
@Tag(name = "비행계획서", description = "비행계획서 관련 API")
// @ApiOperation(value = "비행계획서 수정")
// @Tag(name = "비행계획서", description = "비행계획서 관련 API")
public ResponseEntity<? 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,23 +229,43 @@ public class BasFlightController {
return ResponseEntity.ok().body(new SuccessResponse<>(resultMap));
}
// 비행계획서 삭제
/**
* 비행계획서 삭제하는 기능,
* 비행계획서 고유번호[planSno] 삭제함.
* @param planSno
* @return
*/
@DeleteMapping(value = "/plan/delete/{planSno}")
@ApiOperation(value = "비행계획서 삭제")
@Tag(name = "비행계획서", description = "비행계획서 관련 API")
@ApiImplicitParam(name = "planSno", value = "비행계획서일련번호", dataTypeClass = Integer.class)
// @ApiOperation(value = "비행계획서 삭제")
// @Tag(name = "비행계획서", description = "비행계획서 관련 API")
// @ApiImplicitParam(name = "planSno", value = "비행계획서일련번호", dataTypeClass = Integer.class)
public ResponseEntity<? 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,17 +274,29 @@ public class BasFlightController {
return ResponseEntity.ok().body(new SuccessResponse<>(resultMap));
}
// 그룹 조종사 조회
/**
* 그룹 조종사 조회하는 기능
* 그룹아이디[groupId] 조회함.
* @param groupId
* @return
*/
@GetMapping(value = "/plan/pilot/{groupId}")
@ApiOperation(value = "그룹의 조종사 조회")
@Tag(name = "비행계획서", description = "비행계획서 관련 API")
@ApiImplicitParam(name = "groupId", value = "그룹ID", dataTypeClass = String.class)
// @ApiOperation(value = "그룹의 조종사 조회")
// @Tag(name = "비행계획서", description = "비행계획서 관련 API")
// @ApiImplicitParam(name = "groupId", value = "그룹ID", dataTypeClass = String.class)
public ResponseEntity<? 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,16 +306,28 @@ public class BasFlightController {
}
// 그룹 기체 조회
/**
* 그룹 기체 조회하는 기능,
* 그룹아이디[groupId] 조회함.
* @param groupId
* @return
*/
@GetMapping(value = "/plan/arcrft/{groupId}")
@ApiOperation(value = "그룹의 기체 조회")
@Tag(name = "비행계획서", description = "비행계획서 관련 API")
@ApiImplicitParam(name = "groupId", value = "그룹ID", dataTypeClass = String.class)
// @ApiOperation(value = "그룹의 기체 조회")
// @Tag(name = "비행계획서", description = "비행계획서 관련 API")
// @ApiImplicitParam(name = "groupId", value = "그룹ID", dataTypeClass = String.class)
public ResponseEntity<? 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 +337,26 @@ public class BasFlightController {
}
// 비행 구역 버퍼 존 생성
/**
* 비행 구역 버퍼 생성하는 기능
* @param rq
* @return
*/
@PostMapping("/plan/area/buffer")
@ApiOperation(value = "비행 구역 버퍼 존 생성")
@Tag(name = "비행계획서", description = "비행계획서 관련 API")
// @ApiOperation(value = "비행 구역 버퍼 존 생성")
// @Tag(name = "비행계획서", description = "비행계획서 관련 API")
public ResponseEntity<? 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,15 +365,27 @@ public class BasFlightController {
return ResponseEntity.ok().body(new SuccessResponse<>(rs));
}
/**
* 비행계획서 날씨 확인하는 기능.
* @param rq
* @return
*/
@GetMapping("/plan/api/weather")
@ApiOperation(value = "비행계획서 날씨")
@Tag(name = "비행계획서", description = "비행계획서 관련 API")
// @ApiOperation(value = "비행계획서 날씨")
// @Tag(name = "비행계획서", description = "비행계획서 관련 API")
public ResponseEntity<? extends BasicResponse> restApiGetWeather(BasFlightWeatherModel rq) {
JSONObject jsonObject = null;
try {
jsonObject = basFlightService.getWeather(rq);
jsonObject = basFlightService.getWeather(rq); // 지역과 날씨에 대한 정보를 얻는 기능.
} catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
@ -289,15 +395,27 @@ public class BasFlightController {
return ResponseEntity.ok().body(new SuccessResponse<>(jsonObject));
}
// 비행계획서 리스트(승인)
/**
* 비행계획서 리스트(승인) 조회하는 기능,
* 입력받은 값으로 승인관련된 비행계획서 리스트를 조회함.
* @param rq
* @return
*/
@GetMapping(value = "/aprv/list")
@ApiOperation(value = "비행계획서 리스트(승인)")
@Tag(name = "비행계획서", description = "비행계획서 관련 API")
// @ApiOperation(value = "비행계획서 리스트(승인)")
// @Tag(name = "비행계획서", description = "비행계획서 관련 API")
public ResponseEntity<? 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 +424,42 @@ public class BasFlightController {
return ResponseEntity.ok().body(new SuccessResponse<>(result));
}
// 비행계획서 승인/미승인
/**
* 비행계획서 승인/미승인 하는 기능,
* BasFlightAprovRq에 있는 값을 토대로 승인/미승인 .
* @param rq
* @return
*/
@PutMapping(value = "/aprv/proc")
@ApiOperation(value = "비행 계획서 승인/미승인")
@Tag(name = "비행계획서", description = "비행계획서 관련 API")
// @ApiOperation(value = "비행 계획서 승인/미승인")
// @Tag(name = "비행계획서", description = "비행계획서 관련 API")
public ResponseEntity<? 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 +469,27 @@ public class BasFlightController {
}
/**
* 비행경로 체크하는 기능.
* @param rq
* @return
*/
@PostMapping("/airspace/contains")
@Tag(name = "비행계획서", description = "비행계획서 관련 API")
// @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,15 +499,21 @@ public class BasFlightController {
}
//지역 검색
/**
* 지역 검색하는 기능.
* @param query
* @return
* @throws ParseException
*/
@GetMapping("/plan/area/search")
@ApiOperation(value = "지역 검색")
@Tag(name = "비행계획서", description = "비행계획서 관련 API")
// @ApiOperation(value = "지역 검색")
// @Tag(name = "비행계획서", description = "비행계획서 관련 API")
public ResponseEntity<? extends BasicResponse> searchArea(String query) throws ParseException {
String text = null;
try {
text = URLEncoder.encode(query, "UTF-8");
} catch (UnsupportedEncodingException e) {
// UTF-8 포맷팅으로 인코딩 실패시 에러 던짐
throw new RuntimeException("검색어 인코딩 실패", e);
}
@ -373,16 +529,29 @@ public class BasFlightController {
return ResponseEntity.ok().body(new SuccessResponse<>(obj));
}
/**
* 비행계획서 스케줄 검색하는 기능,
* 검색일[searchDate] 조건으로 조회함.
* @param searchDate
* @return
*/
@GetMapping("/schedule")
@Tag(name = "비행계획서", description = "비행계획서 관련 API")
// @Tag(name = "비행계획서", description = "비행계획서 관련 API")
public ResponseEntity<? extends BasicResponse> findSchedule(@RequestParam("searchDate") String searchDate) {
List<BasFlightScheduleRs> response;
try {
response = basFlightService.findSchecdule(searchDate);
response = basFlightService.findSchecdule(searchDate); // 검색날짜 조건으로 비행스케줄 조회하는 기능.
} catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
@ -391,10 +560,15 @@ public class BasFlightController {
return ResponseEntity.ok().body(new SuccessResponse<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;
}

20
pav-server/src/main/java/com/palnet/biz/api/bas/flight/model/BasFlightPlanAreaModel.java

@ -1,6 +1,5 @@
package com.palnet.biz.api.bas.flight.model;
import com.palnet.biz.jpa.entity.type.FltMethod;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
@ -32,22 +31,5 @@ public class BasFlightPlanAreaModel {
// kac 추가 필드
private String fltMothoeRm;
// public BasFlightPlanAreaModel(Integer planAreaSno, Integer planSno, String areaType, FltMethod fltMethod, String fltAreaAddr, Integer bufferZone, String fltElev, String createUserId, Instant createDt, String updateUserId, Instant updateDt, String docState, List<BasFlightPlanAreaCoordModel> coordList, List<BasFlightPlanAreaCoordModel> bufferCoordList, String fltMothoeRm) {
// this.planAreaSno = planAreaSno;
// this.planSno = planSno;
// this.areaType = areaType;
// this.fltMethod = fltMethod.getCode();
// this.fltMethodNm = fltMethod.getValue();
// this.fltAreaAddr = fltAreaAddr;
// this.bufferZone = bufferZone;
// this.fltElev = fltElev;
// this.createUserId = createUserId;
// this.createDt = createDt;
// this.updateUserId = updateUserId;
// this.updateDt = updateDt;
// this.docState = docState;
// this.coordList = coordList;
// this.bufferCoordList = bufferCoordList;
// this.fltMothoeRm = fltMothoeRm;
// }
}

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

53
pav-server/src/main/java/com/palnet/biz/api/bas/group/controller/BasGroupAprvController.java

@ -1,22 +1,8 @@
package com.palnet.biz.api.bas.group.controller;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.palnet.biz.api.bas.group.model.BasGroupAprvModel;
import com.palnet.biz.api.bas.group.model.BasGroupAprvRqModel;
import com.palnet.biz.api.bas.group.model.BasGroupAprvlUpdateRQ;
import com.palnet.biz.api.bas.group.service.BasGroupAprvService;
import com.palnet.biz.api.comn.model.ComnPagingRs;
import com.palnet.biz.api.comn.response.BasicResponse;
@ -24,16 +10,27 @@ import com.palnet.biz.api.comn.response.ErrorResponse;
import com.palnet.biz.api.comn.response.SuccessResponse;
import com.palnet.comn.code.RSErrorCode;
import io.swagger.annotations.ApiOperation;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j2;
import lombok.extern.slf4j.Slf4j;
@Log4j2
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import java.util.HashMap;
import java.util.Map;
@Slf4j
@RestController
@RequiredArgsConstructor
@RequestMapping(value = "/api/bas/group/aprv", produces = {MediaType.APPLICATION_JSON_VALUE})
@Tag(name = "그룹 승인 컨트롤러", description = "그룹 가입 승인 관련 API")
@Tag(name = "그룹 승인", description = "그룹 가입 승인 관련 API")
public class BasGroupAprvController {
@Autowired
@ -45,8 +42,7 @@ public class BasGroupAprvController {
* @return
*/
@GetMapping(value = "/list")
@ApiOperation(value = "승인요청 조회")
@Tag(name = "그룹 승인 컨트롤러", description = "그룹 가입 승인 관련 API")
@Operation(summary = "승인요청 조회", description = "그룹내에 그룹회원들의 승인항목들을 조회합니다.")
public ResponseEntity<? extends BasicResponse> list(BasGroupAprvRqModel rq) {
ComnPagingRs<BasGroupAprvModel> result = null;
// log.debug(">>>>" + rq.toString());
@ -76,18 +72,25 @@ public class BasGroupAprvController {
* @return
*/
@PutMapping(value = "/update")
@ApiOperation(value = "승인처리 / 승인취소 처리")
@Tag(name = "그룹 승인 컨트롤러", description = "그룹 가입 승인 관련 API")
public ResponseEntity<? extends BasicResponse> update(@RequestBody BasGroupAprvModel rq) {
@Operation(summary = "승인처리", description = "그룹내에 그룹회원들의 승인처리를 진행합니다. [승인/미승인 처리]")
// @ApiOperation(value = "승인처리 / 승인취소 처리")
// @Tag(name = "그룹 승인 컨트롤러", description = "그룹 가입 승인 관련 API")
public ResponseEntity<? extends BasicResponse> update(@RequestBody BasGroupAprvlUpdateRQ rq) {
Map<String , Object> resultMap = new HashMap<String,Object>();
BasGroupAprvModel model = new BasGroupAprvModel();
BeanUtils.copyProperties(rq, model);
log.warn("model => {}", model);
if(StringUtils.isEmpty(rq.getCstmrGroupSno())) {
return ResponseEntity.status(HttpStatus.OK)
.body(new ErrorResponse(RSErrorCode.ER_PARAM));
}
try {
boolean result = service.update(rq);
boolean result = service.update(model);
resultMap.put("result", result);

225
pav-server/src/main/java/com/palnet/biz/api/bas/group/controller/BasGroupController.java

@ -1,61 +1,62 @@
package com.palnet.biz.api.bas.group.controller;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.palnet.biz.api.bas.group.model.BasGroupJoinModel;
import com.palnet.biz.api.bas.group.model.BasGroupModel;
import com.palnet.biz.api.bas.group.model.BasGroupRqModel;
import com.palnet.biz.api.bas.group.model.*;
import com.palnet.biz.api.bas.group.service.BasGroupService;
import com.palnet.biz.api.comn.response.BasicResponse;
import com.palnet.biz.api.comn.response.ErrorResponse;
import com.palnet.biz.api.comn.response.SuccessResponse;
import com.palnet.comn.code.RSErrorCode;
import com.palnet.comn.exception.CustomException;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.enums.ParameterIn;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Log4j2
@RestController
@RequiredArgsConstructor
@RequestMapping(value = "/api/bas/group", produces = {MediaType.APPLICATION_JSON_VALUE})
@Tag(name = "그룹 컨트롤러", description = "그룹 관련 API")
@Tag(name = "그룹", description = "그룹 관련 API")
public class BasGroupController {
@Autowired
private final BasGroupService service;
/**
* 그룹코드 생성
* @return
*/
@GetMapping(value = "/createid")
@ApiOperation(value = "그룹코드 생성")
@Tag(name = "그룹 컨트롤러", description = "그룹 관련 API")
@Operation(summary = "그룹코드 생성", description = "그룹코드를 랜덤으로 생성하는 기능입니다.")
public ResponseEntity<? extends BasicResponse> createid() {
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,30 +67,37 @@ public class BasGroupController {
}
/**
* 나의 그룹 목록 조회
* 내가 만든 그룹 목록조회하는 기능.
* 고객고유번호[cstmrSno] 내가 만든 그룹을 조회함.
* @param rq
* @return
*/
@GetMapping(value = "/mylist")
@ApiOperation(value = "나의 그룹 목록 조회")
@Tag(name = "그룹 컨트롤러", description = "그룹 관련 API")
@ApiImplicitParam(name = "cstmrSno",value = "고객일련번호", dataTypeClass = Integer.class)
public ResponseEntity<? extends BasicResponse> mylist(Integer cstmrSno) {
@Operation(summary = "내가 생성한 그룹조회", description = "내가 생성한 그룹을 조회하는 기능입니다.")
public ResponseEntity<? extends BasicResponse> mylist(@Parameter(name="cstmrSno", description = "회원일련번호", in = ParameterIn.QUERY, example = "2") 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,29 +108,36 @@ public class BasGroupController {
}
/**
* 나의 그룹 - 참여 그룹 목록 조회
* 나의 그룹 - 참여 그룹 목록 조회하는 기능,
* 고객고유번호[cstmrSno] 나의 그룹을 조회함.
* @param rq
* @return
*/
@GetMapping(value = "/joinlist")
@ApiOperation(value = "나의 그룹 - 참여 그룹 목록 조회")
@Tag(name = "그룹 컨트롤러", description = "그룹 관련 API")
@ApiImplicitParam(name = "cstmrSno",value = "고객일련번호", dataTypeClass = Integer.class)
public ResponseEntity<? extends BasicResponse> joinList(Integer cstmrSno) {
@Operation(summary = "내가 참여한 그룹조회", description = "내가 참여한 그룹을 조회하는 기능입니다.")
public ResponseEntity<? extends BasicResponse> joinList(@Parameter(name="cstmrSno", description = "회원일련번호", in = ParameterIn.QUERY, example = "2") Integer cstmrSno) {
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,29 +148,35 @@ public class BasGroupController {
}
/**
* 그룹 목록 조회
* 그룹 목록 조회하는 기능
* @param rq
* @return
*/
@GetMapping(value = "/grouplist")
@ApiOperation(value = "그룹 목록 조회")
@Tag(name = "그룹 컨트롤러", description = "그룹 관련 API")
@ApiImplicitParam(name = "cstmrSno",value = "고객일련번호", dataTypeClass = Integer.class)
public ResponseEntity<? extends BasicResponse> grouplist(Integer cstmrSno) {
@Operation(summary = "그룹조회", description = "나와 관련된 모든 그룹을 조회하는 기능입니다.")
public ResponseEntity<? extends BasicResponse> grouplist(@Parameter(name="cstmrSno", description = "회원일련번호", in = ParameterIn.QUERY, example = "2") Integer cstmrSno) {
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,21 +187,28 @@ public class BasGroupController {
}
/**
* 전체 그룹 목록 조회
* 전체 그룹 목록 조회하는 기능,
* BasGroupRqModel 모델 값에 따라 조회하는 기능.
* @param rq
* @return
*/
@GetMapping(value = "/list")
@ApiOperation(value = "전체 그룹 목록 조회")
@Tag(name = "그룹 컨트롤러", description = "그룹 관련 API")
@Operation(summary = "전체그룹 검색 조회", description = "검색조건에 맞춰 모든 그룹을 조회하는 기능입니다.")
public ResponseEntity<? extends BasicResponse> list(BasGroupRqModel rq) {
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,21 +219,27 @@ public class BasGroupController {
}
/**
* 그룹 상세 조회
* 그룹 상세 조회하는 기능,
* 그룹아이디[groupId] 조회함.
* @param id
* @return
*/
@GetMapping(value = "/detail/{id}")
@ApiOperation(value = "그룹 상세 조회")
@Tag(name = "그룹 컨트롤러", description = "그룹 관련 API")
@ApiImplicitParam(name = "id",value = "그룹ID", dataTypeClass = String.class)
public ResponseEntity<? extends BasicResponse> detail(@PathVariable String id) {
@Operation(summary = "그룹 상세조회", description = "그룹코드로 그룹에 대해 상세히 조회합니다.")
public ResponseEntity<? extends BasicResponse> detail(@Parameter(name="id", description = "그룹코드", in = ParameterIn.PATH, example = "C807F9") @PathVariable String id) {
BasGroupModel result = null;
try {
result = service.detail(id);
result = service.detail(id); // 그룹아이디[groupId]로 상세 조회하는 기능
} catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
@ -217,22 +251,33 @@ public class BasGroupController {
/**
* 그룹 생성
* 그룹 생성하는 기능,
* BasGroupModel 모델에 입력받은 값으로 그룹 생성.
* @return
* @throws Exception
*/
@PostMapping(value = "/create")
@ApiOperation(value = "그룹 생성")
@Tag(name = "그룹 컨트롤러", description = "그룹 관련 API")
public ResponseEntity<? extends BasicResponse> create(@RequestBody BasGroupModel rq) throws Exception {
@Operation(summary = "그룹 생성", description = "그룹을 생성합니다.")
public ResponseEntity<? extends BasicResponse> create(@RequestBody BasGroupInsertRQ rq) throws Exception {
Map<String , Object> resultMap = new HashMap<String,Object>();
BasGroupModel model = new BasGroupModel();
BeanUtils.copyProperties(rq, model);
try {
boolean result = service.create(rq);
boolean result = service.create(model); // 그룹 생성하는 기능
resultMap.put("result", result);
} catch (CustomException e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* CustomException은 개발자가 "의도적으로" 예외처리,
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : {}", e);
resultMap.put("result", false);
resultMap.put("errorCode", e.getErrorCode());
@ -244,18 +289,21 @@ public class BasGroupController {
}
/**
* 그룹 수정
* 그룹 수정하는 기능,
* BasGroupModel 모델에 입력받은 값으로 그룹 수정.
* @return
* @throws Exception
*/
@PutMapping(value = "/update")
@ApiOperation(value = "그룹 수정")
@Tag(name = "그룹 컨트롤러", description = "그룹 관련 API")
public ResponseEntity<? extends BasicResponse> update(@RequestBody BasGroupModel rq) throws Exception {
@Operation(summary = "그룹 수정", description = "그룹의 내용을 수정합니다.")
public ResponseEntity<? extends BasicResponse> update(@RequestBody BasGroupUpdateRQ rq) throws Exception {
Map<String , Object> resultMap = new HashMap<String,Object>();
BasGroupModel model = new BasGroupModel();
BeanUtils.copyProperties(rq, model);
try {
boolean result = service.update(rq);
boolean result = service.update(model); // 그룹 수정하는 기능
resultMap.put("result", result);
@ -266,6 +314,14 @@ public class BasGroupController {
//
// }
} catch (CustomException e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* CustomException은 개발자가 "의도적으로" 예외처리,
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : {}", e);
resultMap.put("result", false);
resultMap.put("errorCode", e.getErrorCode());
@ -277,23 +333,32 @@ public class BasGroupController {
}
/**
* 그룹 삭제
* 그룹 삭제하는 기능,
* 그룹아이디[groupId] 삭제함.
* @param id
* @return
*/
@DeleteMapping(value = "/delete/{id}")
@ApiOperation(value = "그룹 삭제")
@Tag(name = "그룹 컨트롤러", description = "그룹 관련 API")
@ApiImplicitParam(name = "id",value = "그룹ID", dataTypeClass = String.class)
public ResponseEntity<? extends BasicResponse> delete(@PathVariable String id) {
@Operation(summary = "그룹 삭제", description = "그룹의 내용을 삭제합니다.")
// @ApiOperation(value = "그룹 삭제")
// @Tag(name = "그룹 컨트롤러", description = "그룹 관련 API")
// @ApiImplicitParam(name = "id",value = "그룹ID", dataTypeClass = String.class)
public ResponseEntity<? extends BasicResponse> delete(@Parameter(name="id", description = "그룹코드", in = ParameterIn.PATH, example = "HDU123") @PathVariable String id) {
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"));

66
pav-server/src/main/java/com/palnet/biz/api/bas/group/controller/BasGroupJoinController.java

@ -1,39 +1,37 @@
package com.palnet.biz.api.bas.group.controller;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import io.swagger.annotations.ApiOperation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.palnet.biz.api.bas.group.model.BasGroupJoinInsertRQ;
import com.palnet.biz.api.bas.group.model.BasGroupJoinModel;
import com.palnet.biz.api.bas.group.model.BasGroupJoinRqModel;
import com.palnet.biz.api.bas.group.model.BasGroupJoinUpdateRQ;
import com.palnet.biz.api.bas.group.service.BasGroupJoinService;
import com.palnet.biz.api.comn.response.BasicResponse;
import com.palnet.biz.api.comn.response.ErrorResponse;
import com.palnet.biz.api.comn.response.SuccessResponse;
import com.palnet.comn.code.RSErrorCode;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j2;
import lombok.extern.slf4j.Slf4j;
@Log4j2
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Slf4j
@RestController
@RequiredArgsConstructor
@RequestMapping(value = "/api/bas/group/join", produces = {MediaType.APPLICATION_JSON_VALUE})
@Tag(name = "그룹 참여 컨트롤러", description = "그룹 참여 관련 API")
@Tag(name = "그룹 참여", description = "그룹 참여 관련 API")
public class BasGroupJoinController {
@Autowired
@ -41,8 +39,7 @@ public class BasGroupJoinController {
@GetMapping(value = "/list")
@ApiOperation(value = "참여한 그룹 목록 조회")
@Tag(name = "그룹 참여 컨트롤러", description = "그룹 참여 관련 API")
@Operation(summary = "내가 가입할 그룹목록 조회", description = "조건에 맞춰 참여할 그룹목록을 조회할 수 있습니다.")
public ResponseEntity<? extends BasicResponse> list(BasGroupJoinRqModel rq) {
List<BasGroupJoinModel> result = null;
@ -67,13 +64,16 @@ public class BasGroupJoinController {
@PostMapping(value = "/create")
@ApiOperation(value = "그룹 가입 요청")
@Tag(name = "그룹 참여 컨트롤러", description = "그룹 참여 관련 API")
public ResponseEntity<? extends BasicResponse> create(@RequestBody BasGroupJoinModel rq) {
@Operation(summary = "그룹 가입요청", description = "다른 그룹에 가입요청을 할 수 있습니다. [예제값은 이미 가입요청 되어있을 수도 있으니 다른 값으로 가입요청해주세요.]")
public ResponseEntity<? extends BasicResponse> create(@RequestBody BasGroupJoinInsertRQ rq) {
Map<String , Object> resultMap = new HashMap<String,Object>();
BasGroupJoinModel model = new BasGroupJoinModel();
BeanUtils.copyProperties(rq, model);
try {
boolean result = service.create(rq);
boolean result = service.create(model);
resultMap.put("result", result);
@ -88,18 +88,22 @@ public class BasGroupJoinController {
}
@PutMapping(value = "/update")
@ApiOperation(value = "그룹 가입 승인/미승인")
@Tag(name = "그룹 참여 컨트롤러", description = "그룹 참여 관련 API")
public ResponseEntity<? extends BasicResponse> update(@RequestBody BasGroupJoinModel rq) {
@Operation(summary = "가입한 그룹 상태값 변경", description = "가입한 그룹에서 상태값을 변경할 수 있습니다. [Y : 가입 , N : 탈퇴 ]")
// @ApiOperation(value = "그룹 가입 승인/미승인")
// @Tag(name = "그룹 참여 컨트롤러", description = "그룹 참여 관련 API")
public ResponseEntity<? extends BasicResponse> update(@RequestBody BasGroupJoinUpdateRQ rq) {
Map<String , Object> resultMap = new HashMap<String,Object>();
BasGroupJoinModel model = new BasGroupJoinModel();
BeanUtils.copyProperties(rq, model);
if(StringUtils.isEmpty(rq.getCstmrGroupSno())) {
return ResponseEntity.status(HttpStatus.OK)
.body(new ErrorResponse(RSErrorCode.ER_PARAM));
}
try {
boolean result = service.update(rq);
boolean result = service.update(model);
resultMap.put("result", result);

63
pav-server/src/main/java/com/palnet/biz/api/bas/group/controller/BasGroupUserController.java

@ -1,22 +1,8 @@
package com.palnet.biz.api.bas.group.controller;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.palnet.biz.api.bas.group.model.BasGroupUserListModel;
import com.palnet.biz.api.bas.group.model.BasGroupUserModel;
import com.palnet.biz.api.bas.group.model.BasGroupUserUpdateRQ;
import com.palnet.biz.api.bas.group.service.BasGroupUserService;
import com.palnet.biz.api.comn.model.ComnPagingRs;
import com.palnet.biz.api.comn.response.BasicResponse;
@ -25,25 +11,34 @@ import com.palnet.biz.api.comn.response.SuccessResponse;
import com.palnet.comn.code.RSErrorCode;
import com.palnet.comn.exception.CustomException;
import io.swagger.annotations.ApiOperation;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j2;
import lombok.extern.slf4j.Slf4j;
@Log4j2
import org.springframework.beans.BeanUtils;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Slf4j
@RestController
@RequiredArgsConstructor
@RequestMapping(value = "/api/bas/group/user", produces = {MediaType.APPLICATION_JSON_VALUE})
@Tag(name = "그룹 사용자 컨트롤러", description = "그룹 사용자 관련 API")
@Tag(name = "그룹 사용자", description = "그룹 사용자 관련 API")
public class BasGroupUserController {
@Autowired
private final BasGroupUserService service;
@GetMapping(value = "/list")
@ApiOperation(value = "그룹 사용자 조회")
@Tag(name = "그룹 사용자 컨트롤러", description = "그룹 사용자 관련 API")
@Operation(summary = "그룹 참여자 조회", description = "검색조건에 맞춰 그룹 참여자를 조회합니다.")
public ResponseEntity<? extends BasicResponse> list(BasGroupUserListModel rq) {
ComnPagingRs<BasGroupUserModel> result = null;
@ -68,13 +63,15 @@ public class BasGroupUserController {
@PutMapping(value = "/update")
@ApiOperation(value = "그룹 사용자 권한 수정")
@Tag(name = "그룹 사용자 컨트롤러", description = "그룹 사용자 관련 API")
public ResponseEntity<? extends BasicResponse> update(@RequestBody BasGroupUserModel rq) {
@Operation(summary = "그룹 참여자 권한 수정", description = "그룹 참여자 권한을 수정합니다.")
public ResponseEntity<? extends BasicResponse> update(@RequestBody BasGroupUserUpdateRQ rq) {
Map<String , Object> resultMap = new HashMap<String,Object>();
BasGroupUserModel model = new BasGroupUserModel();
BeanUtils.copyProperties(rq, model);
try {
boolean result = service.update(rq);
boolean result = service.update(model);
resultMap.put("result", result);
@ -89,13 +86,17 @@ public class BasGroupUserController {
}
@PutMapping(value = "/delegate")
@ApiOperation(value = "MASTER 권한 위임")
@Tag(name = "그룹 사용자 컨트롤러", description = "그룹 사용자 관련 API")
public ResponseEntity<? extends BasicResponse> delegate(@RequestBody List<BasGroupUserModel> rq) {
@Operation(summary = "MASTER 권한 위임", description = "Master 권한을 위임합니다.")
// @ApiOperation(value = "MASTER 권한 위임")
// @Tag(name = "그룹 사용자 컨트롤러", description = "그룹 사용자 관련 API")
public ResponseEntity<? extends BasicResponse> delegate(@RequestBody List<BasGroupUserUpdateRQ> rq) {
Map<String, Object> resultMap = new HashMap<String, Object>();
List<BasGroupUserModel> model = new ArrayList<>();
BeanUtils.copyProperties(rq, model);
try {
boolean result = service.delegate(rq);
boolean result = service.delegate(model);
resultMap.put("result", result);
} catch (CustomException e) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)

6
pav-server/src/main/java/com/palnet/biz/api/bas/group/model/BasGroupAprvRqModel.java

@ -2,6 +2,7 @@ package com.palnet.biz.api.bas.group.model;
import com.palnet.biz.api.comn.model.ComnRqModel;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
@ -9,14 +10,19 @@ import lombok.EqualsAndHashCode;
@EqualsAndHashCode(callSuper=false)
public class BasGroupAprvRqModel extends ComnRqModel {
@Schema(description = "그룹명" , example = "KAC" , implementation = String.class)
private String groupNm;
@Schema(description = "회원이름[그룹내 회원명으로 검색해야합니다.]" , example = "한국공항공사" , implementation = String.class)
private String memberName;
@Schema(description = "승인여부" , example = "Y" , implementation = String.class)
private String aprvYn;
@Schema(description = "회원일련번호" , example = "2" , implementation = Integer.class)
private Integer cstmrSno;
@Schema(description = "그룹코드" , example = "C807F9" , implementation = String.class)
private String groupId;
}

24
pav-server/src/main/java/com/palnet/biz/api/bas/group/model/BasGroupAprvlUpdateRQ.java

@ -0,0 +1,24 @@
package com.palnet.biz.api.bas.group.model;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
public class BasGroupAprvlUpdateRQ {
@Schema(description = "고객과 그룹 매핑한 일련번호" , example = "5" , implementation = String.class)
private Integer cstmrGroupSno;
@Schema(description = "현재 승인상태 여부[테스트시 해당유저가 승인되어있으면 Y 값으로 넣어주세요.]" , example = "Y" , implementation = String.class)
private String aprvlYn;
@Schema(description = "그룹내 권한코드" , example = "NORMAL" , implementation = String.class)
private String groupAuthCd;
@Schema(description = "승인자" , example = "palnet" , implementation = String.class)
private String aprvlUserId;
@Schema(description = "터미널ID" , example = "" , implementation = String.class)
private String trmnlId;
}

21
pav-server/src/main/java/com/palnet/biz/api/bas/group/model/BasGroupInsertRQ.java

@ -0,0 +1,21 @@
package com.palnet.biz.api.bas.group.model;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
public class BasGroupInsertRQ {
@Schema(description = "그룹아이디[그룹생성시 랜덤으로 받는 아이디, 중복되면 생성이 되지 않음]", example = "HDU123", implementation = String.class)
private String groupId;
@Schema(description = "그룹명[중복되면 생성이 되지 않음]", example = "PAL_KAC_GROUP", implementation = String.class)
private String groupNm;
@Schema(description = "그룹구분코드", example = "02", implementation = String.class)
private String groupTypeCd;
@Schema(description = "회원고유번호", example = "2", implementation = String.class)
private int cstmrSno;
}

17
pav-server/src/main/java/com/palnet/biz/api/bas/group/model/BasGroupJoinInsertRQ.java

@ -0,0 +1,17 @@
package com.palnet.biz.api.bas.group.model;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
public class BasGroupJoinInsertRQ {
@Schema(description = "그룹코드", example = "HDU123", implementation = String.class)
private String groupId;
@Schema(description = "회원일련번호", example = "2", implementation = Integer.class)
private Integer cstmrSno;
@Schema(description = "그룹 내 권한코드", example = "", implementation = String.class)
private String groupAuthCd;
}

4
pav-server/src/main/java/com/palnet/biz/api/bas/group/model/BasGroupJoinRqModel.java

@ -2,6 +2,7 @@ package com.palnet.biz.api.bas.group.model;
import com.palnet.biz.api.comn.model.ComnRqModel;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
@ -9,10 +10,13 @@ import lombok.EqualsAndHashCode;
@EqualsAndHashCode(callSuper=false)
public class BasGroupJoinRqModel extends ComnRqModel{
@Schema(description = "그룹명", example = "PAL_KAC", implementation = String.class)
private String groupNm;
@Schema(description = "그룹코드", example = "HDU123", implementation = String.class)
private String groupId;
@Schema(description = "회원일련번호", example = "2", implementation = Integer.class)
private Integer cstmrSno;
}

14
pav-server/src/main/java/com/palnet/biz/api/bas/group/model/BasGroupJoinUpdateRQ.java

@ -0,0 +1,14 @@
package com.palnet.biz.api.bas.group.model;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
public class BasGroupJoinUpdateRQ {
@Schema(description = "회원 그룹 매핑 일련번호", example = "14", implementation = String.class)
private Integer cstmrGroupSno;
@Schema(description = "그룹내 참여여부 상태값", example = "N", implementation = String.class)
private String joinYn;
}

3
pav-server/src/main/java/com/palnet/biz/api/bas/group/model/BasGroupRqModel.java

@ -2,6 +2,7 @@ package com.palnet.biz.api.bas.group.model;
import com.palnet.biz.api.comn.model.ComnRqModel;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
@ -9,8 +10,10 @@ import lombok.EqualsAndHashCode;
@EqualsAndHashCode(callSuper=false)
public class BasGroupRqModel extends ComnRqModel{
@Schema(description = "그룹명", example = "KAC", implementation = String.class)
private String groupNm;
@Schema(description = "그룹아이디", example = "C807F9", implementation = String.class)
private String groupId;
}

19
pav-server/src/main/java/com/palnet/biz/api/bas/group/model/BasGroupUpdateRQ.java

@ -0,0 +1,19 @@
package com.palnet.biz.api.bas.group.model;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
public class BasGroupUpdateRQ {
@Schema(description = "그룹아이디[그룹생성시 랜덤으로 받는 아이디, 중복되면 생성이 되지 않음]", example = "HDU123", implementation = String.class)
private String groupId;
@Schema(description = "그룹명[중복되면 생성이 되지 않음]", example = "PAL_KAC_GROUP", implementation = String.class)
private String groupNm;
@Schema(description = "그룹구분코드", example = "02", implementation = String.class)
private String groupTypeCd;
}

6
pav-server/src/main/java/com/palnet/biz/api/bas/group/model/BasGroupUserListModel.java

@ -2,6 +2,7 @@ package com.palnet.biz.api.bas.group.model;
import com.palnet.biz.api.comn.model.ComnPagingModel;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
@ -9,9 +10,12 @@ import lombok.EqualsAndHashCode;
@EqualsAndHashCode(callSuper=false)
public class BasGroupUserListModel extends ComnPagingModel{
@Schema(description = "그룹에 참여한 회원 명", example = "팔네트웍스", implementation = String.class)
private String memberName;
@Schema(description = "그룹아이디", example = "C807F9", implementation = String.class)
private String groupId;
private int cstmrSno;
@Schema(description = "회원고유번호", example = "2", implementation = String.class)
private Integer cstmrSno;
}

17
pav-server/src/main/java/com/palnet/biz/api/bas/group/model/BasGroupUserUpdateRQ.java

@ -0,0 +1,17 @@
package com.palnet.biz.api.bas.group.model;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
public class BasGroupUserUpdateRQ {
@Schema(description = "회원 그룹 매핑 일련번호", example = "13", implementation = String.class)
private Integer cstmrGroupSno;
@Schema(description = "그룹 참여 여부", example = "Y", implementation = String.class)
private String joinYn;
@Schema(description = "그룹 내 권한코드", example = "LEADER", implementation = String.class)
private String groupAuthCd;
}

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

45
pav-server/src/main/java/com/palnet/biz/api/bas/laanc/controller/BasLaancAprvController.java

@ -3,11 +3,19 @@ package com.palnet.biz.api.bas.laanc.controller;
import com.palnet.biz.api.bas.laanc.model.BasLaancAprvListRq;
import com.palnet.biz.api.bas.laanc.model.BasLaancAprvRs;
import com.palnet.biz.api.bas.laanc.service.BasLaancAprvService;
import com.palnet.biz.api.cns.qna.model.QnaBasModel;
import com.palnet.biz.api.comn.response.BasicResponse;
import com.palnet.biz.api.comn.response.ErrorResponse;
import com.palnet.biz.api.comn.response.SuccessResponse;
import com.palnet.comn.exception.CustomException;
import io.swagger.annotations.ApiOperation;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Parameters;
import io.swagger.v3.oas.annotations.media.ArraySchema;
import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.responses.ApiResponses;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@ -46,12 +54,13 @@ public class BasLaancAprvController {
/**
* laanc 승인 목록
*
* @param rq
* @param pageable
* @return
*/
@ApiOperation(value = "LAANC 승인 목록")
@Tag(name = "LAANC 승인", description = "LAANC 승인 관련 API")
@Deprecated
@Operation(summary = "LAANC 승인 목록", description = "LAANC 승인 목록")
@GetMapping("/list")
public ResponseEntity<? extends BasicResponse> getLaancAprvList(BasLaancAprvListRq rq, Pageable pageable) {
Page<BasLaancAprvRs> rs = null;
@ -73,14 +82,26 @@ public class BasLaancAprvController {
}
if(pageable == null) {
if (pageable == null) {
return ResponseEntity.ok().body(new SuccessResponse<>(rs.getContent()));
}
return ResponseEntity.ok().body(new SuccessResponse<>(rs));
}
@ApiOperation(value = "LAANC 승인 목록")
@Tag(name = "LAANC 승인", description = "LAANC 승인 관련 API")
/**
* laanc 승인 목록
*
* @param rq
* @return
*/
@Operation(summary = "LAANC 승인 목록", description = "LAANC 승인 목록")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "성공",
content = {
@Content(mediaType = "application/json",
schema = @Schema(implementation = SuccessResponse.class))
})
})
@GetMapping("/list2")
public ResponseEntity<? extends BasicResponse> getLaancAprvList2(BasLaancAprvListRq rq) {
List<BasLaancAprvRs> rs = null;
@ -107,11 +128,19 @@ public class BasLaancAprvController {
/**
* laanc 승인 상세
*
* @param planSno
* @return
*/
@ApiOperation(value = "LAANC 승인 상세 조회")
@Tag(name = "LAANC 승인", description = "LAANC 승인 관련 API")
@Operation(summary = "LAANC 승인 상세 조회", description = "LAANC 승인 상세 조회")
@Parameter(name = "planSno", description = "LAANC 승인 번호", required = true, example = "200")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "성공",
content = {
@Content(mediaType = "application/json",
schema = @Schema(implementation = SuccessResponse.class))
})
})
@GetMapping("/detail/{planSno}")
public ResponseEntity<? extends BasicResponse> getLaancAprvDetail(@PathVariable("planSno") String planSno) {
BasLaancAprvRs rs = null;

142
pav-server/src/main/java/com/palnet/biz/api/bas/laanc/controller/BasLaancController.java

@ -5,18 +5,19 @@ import com.palnet.biz.api.bas.laanc.service.BasLaancService;
import com.palnet.biz.api.comn.response.BasicResponse;
import com.palnet.biz.api.comn.response.ErrorResponse;
import com.palnet.biz.api.comn.response.SuccessResponse;
import com.palnet.biz.api.external.model.PilotValidRs;
import com.palnet.comn.exception.CustomException;
import io.swagger.annotations.ApiOperation;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.enums.ParameterIn;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
import java.util.HashMap;
import java.util.List;
@ -42,10 +43,18 @@ public class BasLaancController {
private final BasLaancService basLaancService;
// LAANC 검증
/**
* LAANC 검증
* 로직(스텝) 변경으로 인하여 사용하지 않음.
* 해당 로직은 등록시 사용되는 service에서 사용함.
*
* @param rq
* @return
*/
@Deprecated
@Operation(summary = "LAANC 검증", description = "LAANC 검증", hidden = true)
@ApiResponse(responseCode = "200", description = "성공")
@PostMapping(value = "/plan/valid")
@ApiOperation(value = "LAANC 검증")
@Tag(name = "LAANC", description = "LAANC 관련 API")
public ResponseEntity<? extends BasicResponse> validationLaanc(@RequestBody BasLaancPlanRq rq) {
BasLaancValidatedRs rs = null;
@ -71,10 +80,15 @@ public class BasLaancController {
return ResponseEntity.ok().body(new SuccessResponse<>(rs));
}
// 비행계획서 등록, 약관 등록, 공문 생성
/**
* LAANC 신청(비행계획서 등록, 약관 등록, 공문 생성)
*
* @param rq
* @return
*/
@Operation(summary = "LAANC 신청", description = "LAANC 신청(비행계획서 등록, 약관 등록, 공문 생성)")
@ApiResponse(responseCode = "200", description = "성공")
@PostMapping(value = "/plan/create")
@ApiOperation(value = "비행계획서 등록")
@Tag(name = "LAANC", description = "LAANC 관련 API")
public ResponseEntity<? extends BasicResponse> createPlan(@RequestBody BasLaancPlanRq rq) {
BasLaancLastRs rs = null;
try {
@ -95,11 +109,17 @@ public class BasLaancController {
return ResponseEntity.ok().body(new SuccessResponse<>(rs));
}
// 허용고도 조회
/**
* 허용고도 조회
*
* @param rq
* @return
*/
@Operation(summary = "비행구역 허용고도 조회", description = "좌표에 해당하는 허용고도 조회")
@ApiResponse(responseCode = "200", description = "성공")
@PostMapping(value = "/valid/elev")
@ApiOperation(value = "비행구역 허용고도 조회")
@Tag(name = "LAANC", description = "LAANC 관련 API")
public ResponseEntity<? extends BasicResponse> getAllowableElevation(@RequestBody List<BasLaancAreaModel> rq) {
public ResponseEntity<? extends BasicResponse> getAllowableElevation(@RequestBody List<BasLaancAreaByElevModel> rq
) {
List<Integer> rs = null;
try {
rs = basLaancService.getAllowableElevation(rq);
@ -120,10 +140,16 @@ public class BasLaancController {
}
// TS 연동
/**
* TS 연동 - 자겨정보 조회
*
* @param idntfNumList
* @return
*/
@Deprecated
@Operation(summary = "TS 연동 - 비행자격 조회", description = "비행자격 조회(조종사 자격증명, 기체보험 여부)")
@ApiResponse(responseCode = "200", description = "성공")
@PostMapping(value = "/valid/ts/pilot")
@ApiOperation(value = "TS 연동 - 비행자격 조회(조종사 자격증명, 기체보험 여부)")
@Tag(name = "LAANC", description = "LAANC 관련 API")
public ResponseEntity<? extends BasicResponse> getTsValid(@RequestBody List<String> idntfNumList) {
BasLaancTsRs rs = null;
try {
@ -134,7 +160,7 @@ public class BasLaancController {
resultMap.put("result", false);
resultMap.put("errorCode", e.getErrorCode());
resultMap.put("errorMessage", e.getMessage());
return ResponseEntity.ok().body(new SuccessResponse<Map>(resultMap));
return ResponseEntity.ok().body(new SuccessResponse<>(resultMap));
} catch (Exception e) {
log.error("IGNORE : ", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
@ -144,11 +170,16 @@ public class BasLaancController {
return ResponseEntity.ok().body(new SuccessResponse<>(rs));
}
// 허용고도 조회
/**
* 공역(금지구역) 포함 여부
*
* @param rq
* @return
*/
@Operation(summary = "공역(금지구역) 포함 여부", description = "공역(금지구역) 포함 여부")
@ApiResponse(responseCode = "200", description = "성공")
@PostMapping(value = "/valid/duplicated/airspace")
@ApiOperation(value = "공역(금지구역) 포함 여부")
@Tag(name = "LAANC", description = "LAANC 관련 API")
public ResponseEntity<? extends BasicResponse> getDuplicatedAirspace(@RequestBody List<BasLaancAreaModel> rq) {
public ResponseEntity<? extends BasicResponse> getDuplicatedAirspace(@RequestBody List<BasLaancAreaByAirspaceModel> rq) {
List<BasLaancDuplicatedAirspaceRs> rs = null;
try {
rs = basLaancService.getDuplicatedAirspace(rq);
@ -158,7 +189,7 @@ public class BasLaancController {
resultMap.put("result", false);
resultMap.put("errorCode", e.getErrorCode());
resultMap.put("errorMessage", e.getMessage());
return ResponseEntity.ok().body(new SuccessResponse<Map>(resultMap));
return ResponseEntity.ok().body(new SuccessResponse<>(resultMap));
} catch (Exception e) {
log.error("IGNORE : ", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
@ -168,4 +199,67 @@ public class BasLaancController {
return ResponseEntity.ok().body(new SuccessResponse<>(rs));
}
/**
* TS QR 코드 생성
*
* @param rq
* @return
*/
@Operation(summary = "TS QR 코드 생성", description = "조종사 자격증명 및 기체 보험 여부 등 조회하기 위한 QR 코드 생성")
@ApiResponse(responseCode = "200", description = "성공")
@GetMapping(value = "/ts/qr")
public ResponseEntity<? extends BasicResponse> getQrCode(BasLaancQrcodeRq rq) {
BasLaancQrcodeRs rs = null;
try {
rs = basLaancService.createQrcode(rq);
} catch (CustomException e) {
Map<String, Object> resultMap = new HashMap<>();
log.error("IGNORE : ", e);
resultMap.put("result", false);
resultMap.put("errorCode", e.getErrorCode());
resultMap.put("errorMessage", e.getMessage());
return ResponseEntity.ok().body(new SuccessResponse<>(resultMap));
} catch (Exception e) {
log.error("IGNORE : ", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
}
return new ResponseEntity<>(new SuccessResponse<>(rs), HttpStatus.OK);
}
/**
* TS QR 코드 확인
*
* @param confirmKey
* @return
*/
@Operation(summary = "TS QR 코드 확인", description = "조종사 자격증명 및 기체 보험 여부 등 데이터를 받고 검증된 데이터인지 확인")
@ApiResponse(responseCode = "200", description = "성공")
@Parameter(name = "confirmKey", description = "QR 코드 확인 키", required = true, in = ParameterIn.PATH, example = "251dd7ec-ec94-4b23-b8ff-bd7b53489448")
@GetMapping(value = "/ts/qr/{confirmKey}")
public ResponseEntity<? extends BasicResponse> checkRqcodeRs(@PathVariable("confirmKey") String confirmKey) {
PilotValidRs rs = null;
try {
rs = basLaancService.checkQrcode(confirmKey);
} catch (CustomException e) {
Map<String, Object> resultMap = new HashMap<>();
log.error("IGNORE : ", e);
resultMap.put("result", false);
resultMap.put("errorCode", e.getErrorCode());
resultMap.put("errorMessage", e.getMessage());
if (e.getParamArray() != null) {
resultMap.put("params", e.getParamArray());
}
return ResponseEntity.ok().body(new SuccessResponse<>(resultMap));
} catch (Exception e) {
log.error("IGNORE : ", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
}
return new ResponseEntity<>(new SuccessResponse<>(rs), HttpStatus.OK);
}
}

16
pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancAprvListRq.java

@ -2,7 +2,7 @@ package com.palnet.biz.api.bas.laanc.model;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.palnet.biz.config.convert.InstantDateStrSerializer;
import io.swagger.annotations.ApiParam;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
@ -27,18 +27,22 @@ import java.time.Instant;
@AllArgsConstructor
public class BasLaancAprvListRq {
@ApiParam(name = "작성자 이름", example = "팔")
@Schema(description = "작성자 이름", example = "팔")
private String memberName;
@ApiParam(name = "신청(등록)시작일자", example = "2023-12-12")
@Schema(description = "신청(등록)시작일자", example = "2023-12-12", implementation = String.class)
@JsonSerialize(using = InstantDateStrSerializer.class)
private Instant createStDate;
@ApiParam(name = "신청(등록)종료일자", example = "2023-12-12")
@Schema(description = "신청(등록)종료일자", example = "2023-12-12", implementation = String.class)
@JsonSerialize(using = InstantDateStrSerializer.class)
private Instant createEndDate;
@ApiParam(name = "비행시작일자", example = "2023-12-12")
@Schema(description = "비행시작일자", example = "2023-12-12", implementation = String.class)
@JsonSerialize(using = InstantDateStrSerializer.class)
private Instant schFltStDate;
@ApiParam(name = "비행종료일자", example = "2023-12-12")
@Schema(description = "비행종료일자", example = "2023-12-12", implementation = String.class)
@JsonSerialize(using = InstantDateStrSerializer.class)
private Instant schFltEndDate;

64
pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancAprvRs.java

@ -1,14 +1,8 @@
package com.palnet.biz.api.bas.laanc.model;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.palnet.biz.api.comn.file.model.ComnFileModel;
import com.palnet.biz.jpa.entity.type.ArcrftTypeCd;
import com.palnet.biz.jpa.entity.type.ArcrftWghtCd;
import com.palnet.biz.jpa.entity.type.FltPurpose;
import com.palnet.biz.jpa.entity.type.FltType;
import io.swagger.annotations.ApiParam;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
@ -35,59 +29,59 @@ import java.util.stream.Collectors;
@NoArgsConstructor
@AllArgsConstructor
public class BasLaancAprvRs {
@ApiParam(name = "비행계획서 일려번호")
//비행계획서 일려번호
private Integer planSno;
@ApiParam(name = "그룹 아이디", hidden = true)
//그룹 아이디
private String groupId;
@ApiParam(name = "작성자 일련번호")
//작성자 일련번호
private Integer cstmrSno;
@ApiParam(name = "작성자 이름")
//작성자 이름
private String memberName;
@ApiParam(name = "작성자 이메일")
//작성자 이메일
private String email;
@ApiParam(name = "작성자 연락처")
//작성자 연락처
private String hpno;
@ApiParam(name = "작성자 국가번호(연락처)", hidden = true)
//작성자 국가번호(연락처)
private String clncd;
@ApiParam(name = "작성자 주소", hidden = true)
//작성자 주소
private String addr;
@ApiParam(name = "작성자 상세주소", hidden = true)
//작성자 상세주소
private String addrDtlCn;
@ApiParam(name = "작성자 우편번호", hidden = true)
//작성자 우편번호
private String zip;
@ApiParam(name = "비행시작일시")
//비행시작일시
private Instant schFltStDt;
@ApiParam(name = "비행종료일시")
//비행종료일시
private Instant schFltEndDt;
@ApiParam(name = "비행목적")
//비행목적
private FltPurpose fltPurpose;
@ApiParam(name = "상업/비사업 구분")
//상업/비사업 구분
private FltType fltType;
@ApiParam(name = "상업/비사업 구분 코드")
//상업/비사업 구분 코드
private String fltTypeNm;
@ApiParam(name = "승인여부")
//승인여부
private String aprvlYn;
@ApiParam(name = "승인일자")
//승인일자
private Instant aprvlDt;
// @ApiParam(name = "삭제여부")
// private String delYn;
@ApiParam(name = "등록자ID")
//삭제여부
// private String delYn;
//등록자ID
private String createUserId;
@ApiParam(name = "등록일시")
//등록일시
private Instant createDt;
@ApiParam(name = "수정자ID")
//수정자ID
private String updateUserId;
@ApiParam(name = "수정일시")
//수정일시
private Instant updateDt;
@ApiParam(name = "서비스유형")
//서비스유형
private String serviceType;
@ApiParam(name = "기업여부")
//기업여부
private String corpRegYn;
@ApiParam(name = "공문URL")
//공문URL
private String pdfUrl;
// 하나의 필드로 묶어서 처리
@ApiParam(name = "기체 무게")
//기체 무게
public String getArcrftWght() {
if (arcrftList == null || arcrftList.isEmpty()) return null;
List<ArcrftWghtCd> arcrftWghtCdList = arcrftList.stream().map(BasLaancArcrftModel::getArcrftWghtCd).distinct().filter(Objects::nonNull).collect(Collectors.toList());
@ -95,7 +89,7 @@ public class BasLaancAprvRs {
return ArcrftWghtType;
}
@ApiParam(name = "고도")
//고도
public String getElev() {
if (areaList == null || areaList.isEmpty()) return null;
List<String> elevList = areaList.stream().map(BasLaancAreaModel::getFltElev).distinct().filter(Objects::nonNull).collect(Collectors.toList());
@ -103,7 +97,7 @@ public class BasLaancAprvRs {
return elev;
}
// @ApiParam(name = "조종사 성명")
//조종사 성명
// public String getPilotName() {
// if (pilotList == null || pilotList.isEmpty()) return null;
// List<String> pilotNameList = pilotList.stream().map(BasLaancPilotModel::getMemberName).distinct().filter(Objects::nonNull).collect(Collectors.toList());

62
pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancArcrftModel.java

@ -4,44 +4,106 @@ import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.palnet.biz.config.convert.InstantDateStrSerializer;
import com.palnet.biz.jpa.entity.type.ArcrftTypeCd;
import com.palnet.biz.jpa.entity.type.ArcrftWghtCd;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.time.Instant;
@Data
public class BasLaancArcrftModel {
@Schema(description = "계획서 기체 일련번호", example = "1", hidden = true)
private Integer planArcrftSno;
@Schema(description = "비행계획서 일련번호", example = "1", hidden = true)
private Integer planSno;
@Schema(description = "기체 일련번호", example = "1", hidden = true)
private Integer arcrftSno;
@Schema(description = "식별번호(기체번호)", example = "PA0001")
private String idntfNum;
@Schema(description = "그룹명", example = "한국공항공사", hidden = true)
private String groupNm;
@Schema(description = "제작번호", example = "123101-13", hidden = true)
private String prdctNum;
@Schema(description = "기체종류코드", example = "01", hidden = true)
private ArcrftTypeCd arcrftTypeCd;
@Schema(description = "기체모델명", example = "M-01", hidden = true)
private String arcrftModelNm;
@Schema(description = "제작자", example = "DJI", hidden = true)
private String prdctCmpnNm;
@Schema(description = "제작일자", example = "2022-01-01", hidden = true)
@JsonSerialize(using = InstantDateStrSerializer.class)
private Instant prdctDate;
@Schema(description = "기체길이", example = "1.0", hidden = true)
private double arcrftLngth;
@Schema(description = "길체폭", example = "1.1", hidden = true)
private double arcrftWdth;
@Schema(description = "기체높이", example = "1.0", hidden = true)
private double arcrftHght;
@Schema(description = "기체중량", example = "1.5", hidden = true)
private double arcrftWght;
@Schema(description = "중량구분코드", hidden = true)
private String wghtTypeCd;
@Schema(description = "이미지URL", example = "http://www.imageurl.co.kr/image/url", hidden = true)
private String imageUrl;
@Schema(description = "최대이륙중량", example = "10", hidden = true)
private double takeoffWght;
@Schema(description = "사용여부", hidden = true)
private String useYn;
@Schema(description = "카메라탑재여부", example = "N")
private String cameraYn;
@Schema(description = "보험가입여부", example = "Y")
private String insrncYn;
@Schema(description = "소유자명(법인명)", example = "팔네트웍스")
private String ownerNm;
@Schema(description = "생성자ID", hidden = true)
private String createUserId;
@Schema(description = "생성일시", hidden = true)
private Instant createDt;
@Schema(description = "수정자ID", hidden = true)
private String updateUserId;
@Schema(description = "수정일시", hidden = true)
private Instant updateDt;
@Schema(hidden = true)
private String docState = "R";
@Schema(description = "식별장치종류코드", example = "DRON", hidden = true)
private String idntfTypeCd;
// kac 추가 필드
@Schema(description = "기체보험유무", example = "Y")
private String acrftInsuranceYn;
@Schema(description = "보험유효기간", hidden = true)
@JsonSerialize(using = InstantDateStrSerializer.class)
private Instant insuranceExperiod;
@Schema(description = "법인명", hidden = true)
private String corporationNm;
@Schema(description = "자체중량코드", example = "10")
private ArcrftWghtCd arcrftWghtCd; // 기체 무게 코드 ----
}

22
pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancAreaByAirspaceModel.java

@ -0,0 +1,22 @@
package com.palnet.biz.api.bas.laanc.model;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.util.List;
@Data
public class BasLaancAreaByAirspaceModel {
@Schema(description = "구역종류", example = "CIRCLE")
private String areaType;
@Schema(description = "버퍼존", example = "100")
private Integer bufferZone;
@Schema(description = "고도", example = "110")
private String fltElev;
private List<BasLaancAreaCoordByAirspaceModel> coordList;
}

20
pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancAreaByElevModel.java

@ -0,0 +1,20 @@
package com.palnet.biz.api.bas.laanc.model;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.util.List;
@Data
public class BasLaancAreaByElevModel {
@Schema(description = "구역종류", example = "CIRCLE")
private String areaType;
@Schema(description = "버퍼존", example = "100")
private Integer bufferZone;
private List<BasLaancAreaCoordByElevModel> coordList;
}

16
pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancAreaCoordByAirspaceModel.java

@ -0,0 +1,16 @@
package com.palnet.biz.api.bas.laanc.model;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
public class BasLaancAreaCoordByAirspaceModel {
@Schema(description = "위도", example = "127.33")
private double lat;
@Schema(description = "경도", example = "37.99")
private double lon;
}

16
pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancAreaCoordByElevModel.java

@ -0,0 +1,16 @@
package com.palnet.biz.api.bas.laanc.model;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
public class BasLaancAreaCoordByElevModel {
@Schema(description = "위도", example = "127.33")
private double lat;
@Schema(description = "경도", example = "37.99")
private double lon;
}

14
pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancAreaCoordModel.java

@ -1,16 +1,30 @@
package com.palnet.biz.api.bas.laanc.model;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.time.Instant;
@Data
public class BasLaancAreaCoordModel {
@Schema(description = "비행구역좌표 일련번호", example = "1")
private Integer planAreaCoordSno;
@Schema(description = "비행계획비행구역 일련번호", example = "1")
private Integer planAreaSno;
@Schema(description = "위도", example = "127.33")
private double lat;
@Schema(description = "경도", example = "37.99")
private double lon;
@Schema(description = "생성자ID", hidden = true)
private String createUserId;
@Schema(description = "생성일시", hidden = true)
private Instant createDt;
@Schema(hidden = true)
private String docState = "R";
}

30
pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancAreaModel.java

@ -1,6 +1,7 @@
package com.palnet.biz.api.bas.laanc.model;
import com.palnet.biz.jpa.entity.type.FltMethod;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.time.Instant;
@ -8,20 +9,49 @@ import java.util.List;
@Data
public class BasLaancAreaModel {
@Schema(description = "비행구역 일련번호", example = "1", hidden = true)
private Integer planAreaSno;
@Schema(description = "비행계획서 일련번호", example = "1", hidden = true)
private Integer planSno;
@Schema(description = "구역종류", example = "CIRCLE")
private String areaType;
@Schema(description = "비행방식", example = "01")
private FltMethod fltMethod;
@Schema(description = "비행구역주소", example = "인천광역시 부평구 청천2동")
private String fltAreaAddr;
@Schema(description = "버퍼존", example = "100")
private Integer bufferZone;
@Schema(description = "고도", example = "110")
private String fltElev;
@Schema(description = "생성자ID", hidden = true)
private String createUserId;
@Schema(description = "생성일시", hidden = true)
private Instant createDt;
@Schema(description = "수정자ID", hidden = true)
private String updateUserId;
@Schema(description = "수정일시", hidden = true)
private Instant updateDt;
private String docState = "R";
private List<BasLaancAreaCoordModel> coordList;
@Schema(hidden = true)
private List<BasLaancAreaCoordModel> bufferCoordList;
// kac 추가 필드
@Schema(description = "비행방식(기타)")
private String fltMothoeRm;
}

2
pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancDuplicatedAirspaceRs.java

@ -22,5 +22,5 @@ import lombok.NoArgsConstructor;
@Builder
public class BasLaancDuplicatedAirspaceRs {
private boolean isDuplicated;
private BasLaancAreaModel rq;
private BasLaancAreaByAirspaceModel rq;
}

22
pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancPlanRq.java

@ -1,9 +1,12 @@
package com.palnet.biz.api.bas.laanc.model;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.palnet.biz.api.acnt.cstmr.model.AnctCstmrTermsModel;
import com.palnet.biz.api.external.model.PilotValidRs;
import com.palnet.biz.config.convert.InstantDatetimeStrSerializer;
import com.palnet.biz.jpa.entity.type.FltPurpose;
import com.palnet.biz.jpa.entity.type.FltType;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.time.Instant;
@ -11,18 +14,37 @@ import java.util.List;
@Data
public class BasLaancPlanRq {
@Schema(description = "비행계획서 일련번호", example = "1", hidden = true)
private Integer planSno;
@Schema(description = "사용자 일련번호", example = "1", hidden = true)
private Integer cstmrSno;
@Schema(description = "이름", example = "조종사")
private String memberName;
@Schema(description = "비행유형", example = "COMMERCIAL")
private FltType fltType; // 비행유형 - 상업/비상업 ----
@Schema(description = "비행시작일시", example = "2024-02-12 09:00:00", implementation = String.class)
@JsonSerialize(using = InstantDatetimeStrSerializer.class)
private Instant schFltStDt; // 시작일시
@Schema(description = "비행종료일시", example = "2024-02-12 10:00:00", implementation = String.class)
@JsonSerialize(using = InstantDatetimeStrSerializer.class)
private Instant schFltEndDt; // 종료일시
@Schema(description = "비행목적", example = "17")
private FltPurpose fltPurpose; // 비행목적 -----
@Schema(description = "서비스구분", example = "KAC")
private String serviceType; // 고정
@Schema(hidden = true)
private String docState = "R";
private List<BasLaancAreaModel> areaList;
// private List<BasFlightPlanPilotModel> pilotList;
private List<BasLaancArcrftModel> arcrftList;

16
pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancQrcodeRq.java

@ -0,0 +1,16 @@
package com.palnet.biz.api.bas.laanc.model;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class BasLaancQrcodeRq {
@Schema(description = "기체신고번호", example = "C1CM0231251")
private String idntfNum; // 기체신고번호
}

15
pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancQrcodeRs.java

@ -0,0 +1,15 @@
package com.palnet.biz.api.bas.laanc.model;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class BasLaancQrcodeRs {
private byte[] qrcode; // qr코드
private String confirmKey; // 인증번호
}

4
pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancTsRq.java

@ -1,7 +1,5 @@
package com.palnet.biz.api.bas.laanc.model;
import io.swagger.annotations.ApiParam;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
@ -25,6 +23,6 @@ import java.util.List;
@AllArgsConstructor
@Builder
public class BasLaancTsRq {
@ApiParam(name = "기체신고번호", collectionFormat = ",")
// @ApiParam(name = "기체신고번호", collectionFormat = ",")
private List<String> IdntfNumList;
}

81
pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancValidatedRs.java

@ -1,14 +1,10 @@
package com.palnet.biz.api.bas.laanc.model;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.palnet.biz.api.external.model.PilotValidRs;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* packageName : com.palnet.biz.api.bas.laanc.model
* fileName : BasLaancValidatedRs
@ -26,66 +22,39 @@ import java.util.List;
@AllArgsConstructor
public class BasLaancValidatedRs {
// // TS 연동
// private String corpRegYn; // 사업자 여부
// private List<PilotValidRs> pilotValidRsList; // 자격여부
private boolean isPilotQlfc; // 자격여부
private boolean isArcrftInsurance; // 항공기보험여부
// 비행유형 여부
private boolean isCommercial; // 사업자 - true, 비사업자 - false
// 관제권
private boolean isEvaluatedTargetArea; // 평가대상지역여부 - 공역과 겹칠때만 true
private boolean isFlightArea; // 비행가능여부 - 비행가능 true
// 고도
private boolean isElev; // 고도여부 - 관제권내 설정고도 이하, 권제권밖 150m 이하 true
// 기체중량
private boolean isArcrftWeight; // 항공기중량여부 - 25kg 이하 true
// 비행방식
private boolean isFltMethod; // 비행방식 - 군집비행 false, 그외 true
// 비행시간
private boolean isSpacialFlight; // 특별비행여부 - true (야간비행)
// 자격여부
private boolean isPilotQlfc; // 자격여부
// 기체보험여부
private boolean isArcrftInsurance; // 기체보험여부
private boolean isElev; // 고도여부 - 150m 이하 true
private boolean isReport; // 신고 대상 - 비상업적이고 기체중량 2kg미만일 경우 - false / 그외 true
// 추가....
private boolean isCommercial; // 비행유형 사업자 - true / 비사업자 - false
private boolean isSpacialFlight; // 특별비행여부 - true
// TS 연동
// private String corpRegYn; // 사업자 여부
private List<PilotValidRs> pilotValidRsList; // 자격여부
// 활용안함.
// private boolean isArcrftDuplicated; // 기체 중복여부
// private boolean isPlanAreaDuplicatd; // 비행계획서비행구역 중복여부
// 최종여부
public boolean isValid() {
if (isReport) {
return isPilotQlfc
&& isArcrftInsurance
// && !isArcrftDuplicated // 기체 중복여부
// && !isPlanAreaDuplicatd // 비행구역 중복여부
&& isFlightArea // 비행가능여부
&& isCheckingLance();
return !isNonAprove() && !isNonAproveFlight();
}
return isFlightArea
// && !isPlanAreaDuplicatd
// && !isArcrftDuplicated
&& isCheckingLance();
// 미승인
public boolean isNonAprove() {
return isFltMethod && !isSpacialFlight && isElev && isPilotQlfc && isArcrftInsurance;
}
public boolean isFlight() {
return !isCheckingLance() || isValid();
// 비행가능여부(미승인-날수있음)
public boolean isNonAproveFlight() {
return !isCommercial && !isEvaluatedTargetArea && isElev && isArcrftWeight;
}
// LAANC 승인 대상 여부
@JsonIgnore
public boolean isCheckingLance() {
return isEvaluatedTargetArea // 관제구역여부
/*
관제권 고도 150m초과에 대해서 승인 대상이나 담당자와의 협의가 필요하여 미승인 처리함
|| !isElev // 150m 초과 -
*/
|| !isArcrftWeight; // 25kg 초과
}
// 특별승인 대상 여부
@JsonIgnore
public boolean isTargetSpacialFlight() {
return false;
}
}

28
pav-server/src/main/java/com/palnet/biz/api/bas/laanc/service/BasLaancAprvService.java

@ -46,18 +46,32 @@ public class BasLaancAprvService {
* @param pageable
* @return
*/
@Deprecated
public Page<BasLaancAprvRs> getLaancAprvList(BasLaancAprvListRq rq, Pageable pageable) {
LaancAprvSearchDto searchDto = BasLaancAprvMapper.MAPPER.toDto(rq);
Page<LaancPlanDto> result = fltPlanQueryRepository.findAllAprvListBySearch(searchDto, pageable);
Page<BasLaancAprvRs> rs = PageUtils.convert(result, BasLaancAprvMapper.MAPPER.toRsList(result.getContent()));
return rs;
return PageUtils.convert(result, BasLaancAprvMapper.MAPPER.toRsList(result.getContent()));
}
/**
* laanc 승인 목록
*
* @param rq
* @return
*/
public List<BasLaancAprvRs> getLaancAprvList2(BasLaancAprvListRq rq) {
LaancAprvSearchDto searchDto = BasLaancAprvMapper.MAPPER.toDto(rq);
// 검색조건에 해당하는 비행계획서 조회
List<LaancPlanDto> result = fltPlanQueryRepository.findAllAprvListBySearch2(searchDto);
// 비행계획서에 해당하는 파일의 그룹NO 추출 - PDF URL을 가져오기 위함
List<Integer> fileGroupNoList = result.stream().map(LaancPlanDto::getFileGroupNo).filter(Objects::nonNull).collect(Collectors.toList());
// 파일 정보 조회
List<ComnFileModel> fileListByGroupNoList = comnFileService.getFileListByGroupNoList(fileGroupNoList);
// 파일 정보(PDF)를 비행계획서에 추가
result.forEach(dto -> {
if (dto.getFileGroupNo() != null) {
fileListByGroupNoList.stream()
@ -66,9 +80,8 @@ public class BasLaancAprvService {
.ifPresent(file -> dto.setPdfUrl(file.getDownloadUrl()));
}
});
List<BasLaancAprvRs> rs = BasLaancAprvMapper.MAPPER.toRsList(result);
return rs;
return BasLaancAprvMapper.MAPPER.toRsList(result);
}
/**
@ -79,13 +92,16 @@ public class BasLaancAprvService {
*/
public BasLaancAprvRs getLaancAprvDetail(String planSno) {
if (planSno == null) throw new CustomException(ErrorCode.NON_VALID_PARAMETER);
LaancPlanDto result = fltPlanQueryRepository.findAprvById(Integer.parseInt(planSno));
// PDF URL 추출
if (result != null && result.getFileGroupNo() != null) {
ComnFileModel comnFileModel = comnFileService.getOfficialDocumentFileListByGroupNo(result.getFileGroupNo());
if (comnFileModel != null) result.setPdfUrl(comnFileModel.getDownloadUrl());
}
BasLaancAprvRs rs = BasLaancAprvMapper.MAPPER.toRs(result);
return rs;
return BasLaancAprvMapper.MAPPER.toRs(result);
}
}

509
pav-server/src/main/java/com/palnet/biz/api/bas/laanc/service/BasLaancService.java

@ -1,47 +1,28 @@
package com.palnet.biz.api.bas.laanc.service;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import com.palnet.biz.api.bas.laanc.model.*;
import org.locationtech.jts.geom.Coordinate;
import org.locationtech.jts.geom.Geometry;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;
import com.google.zxing.WriterException;
import com.palnet.biz.api.acnt.cstmr.model.AnctCstmrModel;
import com.palnet.biz.api.acnt.cstmr.model.AnctCstmrTermsModel;
import com.palnet.biz.api.acnt.jwt.utils.JwtTokenUtil;
import com.palnet.biz.api.bas.laanc.model.*;
import com.palnet.biz.api.comn.file.model.LaancPdfModel;
import com.palnet.biz.api.comn.file.service.ComnFileService;
import com.palnet.biz.api.comn.sms.model.ComnSmsLaancAprovModel;
import com.palnet.biz.api.comn.sms.service.ComnSmsService;
import com.palnet.biz.api.comn.sunriseset.model.ComnSunrisesetCoordRq;
import com.palnet.biz.api.comn.sunriseset.model.ComnSunrisesetRs;
import com.palnet.biz.api.external.model.PilotValidRq;
import com.palnet.biz.api.external.model.PilotValidRs;
import com.palnet.biz.api.external.model.TsPlanRq;
import com.palnet.biz.api.external.model.TsQrcodeRq;
import com.palnet.biz.api.external.service.TsService;
import com.palnet.biz.jpa.entity.ComFileBas;
import com.palnet.biz.jpa.entity.FltPlanArcrft;
import com.palnet.biz.jpa.entity.FltPlanArea;
import com.palnet.biz.jpa.entity.FltPlanAreaCoord;
import com.palnet.biz.jpa.entity.FltPlanBas;
import com.palnet.biz.jpa.entity.FltPlanPilot;
import com.palnet.biz.jpa.entity.PtyGroupBas;
import com.palnet.biz.jpa.entity.PtyTermsAgreeTxn;
import com.palnet.biz.jpa.entity.*;
import com.palnet.biz.jpa.entity.type.ArcrftWghtCd;
import com.palnet.biz.jpa.entity.type.FltMethod;
import com.palnet.biz.jpa.entity.type.FltType;
import com.palnet.biz.jpa.repository.com.ComConfirmBasRepository;
import com.palnet.biz.jpa.repository.com.ComRiseSetQueryRepository;
import com.palnet.biz.jpa.repository.flt.FltPlanArcrftRepository;
import com.palnet.biz.jpa.repository.flt.FltPlanAreaCoordRepository;
import com.palnet.biz.jpa.repository.flt.FltPlanAreaRepository;
import com.palnet.biz.jpa.repository.flt.FltPlanBasRepository;
import com.palnet.biz.jpa.repository.flt.FltPlanPilotRepository;
import com.palnet.biz.jpa.repository.flt.*;
import com.palnet.biz.jpa.repository.pty.PtyCstmrQueryRepository;
import com.palnet.biz.jpa.repository.pty.PtyGroupBasRepository;
import com.palnet.biz.jpa.repository.pty.PtyTermsAgreeTxnRepository;
@ -49,13 +30,27 @@ import com.palnet.biz.scheduler.ctr.model.CtrTrnsLctnModel;
import com.palnet.biz.scheduler.ctr.service.CtrTrnsLctnService;
import com.palnet.comn.code.ErrorCode;
import com.palnet.comn.exception.CustomException;
import com.palnet.comn.utils.AirspaceUtils;
import com.palnet.comn.utils.AreaUtils;
import com.palnet.comn.utils.HttpUtils;
import com.palnet.comn.utils.InstantUtils;
import com.palnet.comn.utils.*;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.locationtech.jts.geom.Coordinate;
import org.locationtech.jts.geom.Geometry;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;
import org.springframework.web.util.UriComponents;
import org.springframework.web.util.UriComponentsBuilder;
import java.io.IOException;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.util.*;
import java.util.stream.Collectors;
/**
* packageName : com.palnet.biz.api.bas.laanc.service
@ -87,76 +82,98 @@ public class BasLaancService {
private final ComnSmsService comnSmsService;
private final JwtTokenUtil jwtTokenUtil;
private final AreaUtils areaUtils;
private final ComRiseSetQueryRepository comRiseSetQueryRepository;
private final ComConfirmBasRepository comConfirmBasRepository;
// LAANC 검증
public BasLaancValidatedRs validationLaanc(BasLaancPlanRq rq) {
if (!this.laancParamValid(rq)) throw new CustomException(ErrorCode.NON_VALID_PARAMETER);
@Value("${app.host}")
private String APP_HOST;
BasLaancValidatedRs rs = new BasLaancValidatedRs();
@Value("${external.ts.return.uri}")
private String TS_RETURN_URI;
// 조종사 자격 확인 - 무게가 2kg 초과이거나 상업적일 경우에만 진행
// 상업 여부 - 상업(true)
boolean isCommercial = FltType.COMMERCIAL == rq.getFltType();
rs.setCommercial(isCommercial);
// 2kg 초과 기체신고번호
List<String> idntfNumList = rq.getArcrftList().stream().filter(arcrft -> arcrft.getArcrftWghtCd() != ArcrftWghtCd.W250G_LOE && arcrft.getArcrftWghtCd() != ArcrftWghtCd.W250G_W2KG).map(BasLaancArcrftModel::getIdntfNum).collect(Collectors.toList());
// 신고 여부 - 비상업적이고 기체중량 2kg이하일 경우 - false, 상업적이거나 기체중량 2kg초과일 경우 - true
boolean isReport = !idntfNumList.isEmpty() || isCommercial;
rs.setReport(isReport);
/**
* LAANC 검증
*
* @param rq
* @return
*/
public BasLaancValidatedRs validationLaanc(BasLaancPlanRq rq) {
if (!this.laancParamValid(rq)) throw new CustomException(ErrorCode.NON_VALID_PARAMETER);
// 고도 150m 이하 - true
boolean isElev = rq.getAreaList().stream().anyMatch(area -> area.getFltElev() != null && Integer.parseInt(area.getFltElev()) <= 150);
rs.setElev(isElev);
BasLaancValidatedRs rs = new BasLaancValidatedRs();
// 기체중량 25kg 이하
boolean isArcrftWeight = rq.getArcrftList().stream().anyMatch(arcrft -> arcrft.getArcrftWghtCd() != ArcrftWghtCd.W25KG_GO && arcrft.getArcrftWghtCd() != ArcrftWghtCd.W25KG_GO_TEST);
rs.setArcrftWeight(isArcrftWeight);
// TODO start - 조종사 자격 및 기체보험 확인
if (isReport) {
List<PilotValidRq> pilotValidRqList = idntfNumList.stream().map(idntfNum -> {
// TS 자격 판별 - 조종사 자격증명, 기체 보험
List<String> idntfNumList = rq.getArcrftList().stream().filter(arcrft -> arcrft.getIdntfNum() != null && !arcrft.getIdntfNum().isBlank()).map(BasLaancArcrftModel::getIdntfNum).collect(Collectors.toList());
Integer cstmrSno = jwtTokenUtil.getCstmrSnoByToken();
AnctCstmrModel cstmrInfo = ptyCstmrQueryRepository.findByCstmrSno(cstmrSno);
String userCi = cstmrInfo.getIpinCi();
List<PilotValidRq> pilotValidRqList = new ArrayList<>();
if (!idntfNumList.isEmpty()) {
pilotValidRqList = idntfNumList.stream().map(idntfNum -> {
// TODO 기체보험 확인, 조종사 자격 확인
return PilotValidRq.builder()
.pilotci("조종사CI")
.pilotci(userCi)
.declarationnum(idntfNum)
.build();
}).collect(Collectors.toList());
} else {
pilotValidRqList.add(PilotValidRq.builder()
.pilotci(userCi)
.build());
}
List<PilotValidRs> pilotValidRsList = tsService.getAccountValidate(pilotValidRqList);
if (pilotValidRsList.isEmpty()) {
rs.setPilotQlfc(false);
rs.setArcrftInsurance(false);
} else {
rs.setPilotValidRsList(pilotValidRsList);
rs.setPilotQlfc(pilotValidRsList.stream().allMatch(pilotValidRs -> "Y".equals(pilotValidRs.getPilotcredentialyn())));
rs.setArcrftInsurance(pilotValidRsList.stream().allMatch(pilotValidRs -> "Y".equals(pilotValidRs.getArcrftinsuranceyn())));
}
}
// TODO end - 조종사 자격 및 기체보험 확인
// 비행유형 판별 - 상업 - true
boolean isCommercial = FltType.COMMERCIAL == rq.getFltType();
rs.setCommercial(isCommercial);
// 관제권 여부 판별
BasLaancValidatedRs validationPlanDbRs = this.validationPlanAirspace(rq);
boolean isEvaluatedTargetArea = validationPlanDbRs.isEvaluatedTargetArea();
rs.setEvaluatedTargetArea(isEvaluatedTargetArea);
/* 비행구역 기체 중복여부 확인 안하기로 .
// 비행구역 중복여부, 기체 중복여부
BasLaancValidatedRs validationPlanAirspaceRs = this.validationPlanAreaAndArcrft(rq);
rs.setPlanAreaDuplicatd(validationPlanAirspaceRs.isPlanAreaDuplicatd());
rs.setArcrftDuplicated(validationPlanAirspaceRs.isArcrftDuplicated());
*/
// 고도여부 - 관제권내 설정고도 이하, 권제권밖 150m 이하 true
if (isEvaluatedTargetArea) {
// 관제권 내부 - 설정고도 이하
rs.setElev(validationPlanDbRs.isElev());
} else {
// 관제권 외부 - 150m 이하
boolean isElev = rq.getAreaList().stream().allMatch(area -> area.getFltElev() != null && Integer.parseInt(area.getFltElev()) <= 150);
rs.setElev(isElev);
}
// 기체중량 판별 - 25kg 이하 true
boolean isArcrftWeight = rq.getArcrftList().stream().allMatch(arcrft -> arcrft.getArcrftWghtCd() != ArcrftWghtCd.W25KG_GO && arcrft.getArcrftWghtCd() != ArcrftWghtCd.W25KG_GO_TEST);
rs.setArcrftWeight(isArcrftWeight);
// 판단구역 - 공역과 겹칠 경우, 비행가능여부
BasLaancValidatedRs validationPlanDbRs = this.validationPlanAirspace(rq);
rs.setEvaluatedTargetArea(validationPlanDbRs.isEvaluatedTargetArea());
rs.setFlightArea(validationPlanDbRs.isFlightArea());
// 특별비행여부 판별 - 야간/주간 - 야간 true
boolean isSpcialFlight = this.validationPlanSpecialFlight(rq);
rs.setSpacialFlight(isSpcialFlight);
// 비행방식 - 군집비행 false, 그외 true
boolean isFltMethod = rq.getAreaList().stream().allMatch(area -> FltMethod.CLUSTER_FLIGHT != area.getFltMethod());
rs.setFltMethod(isFltMethod);
return rs;
}
// 비행계획서 등록, 약관 등록, 공문 생성
/**
* 비행계획서 등록, 약관 등록, 공문 생성
*
* @param rq
* @return
*/
@Transactional
public BasLaancLastRs createFlightPlan(BasLaancPlanRq rq) {
// if (rq == null || rq.getValidatedRs() == null) throw new CustomException(ErrorCode.NON_VALID_PARAMETER);
@ -180,6 +197,7 @@ public class BasLaancService {
// 비행계획서
String userId = jwtTokenUtil.getUserIdByToken();
Integer cstmrSno = jwtTokenUtil.getCstmrSnoByToken();
// 개인정보 가져오기 - 비행계획서 작성자 정보, 조종사 정보
AnctCstmrModel cstmrInfo = ptyCstmrQueryRepository.findByCstmrSno(cstmrSno);
FltPlanBas fltPlanBas = BasLaancMapper.MAPPER.modelToPlanEntity(cstmrInfo);
@ -208,10 +226,11 @@ public class BasLaancService {
corpRegYn = isCorpReg ? "Y" : "N";
}
fltPlanBas.setCorpRegYn(corpRegYn); // 사업자유무
fltPlanBas.setServiceType("PAV-KAC");
fltPlanBas.setServiceType("F0002");
FltPlanBas rBasEntity = fltPlanBasRepository.save(fltPlanBas);
Integer planSno = rBasEntity.getPlanSno();
// 비행구역
List<BasLaancAreaModel> basLaancAreaModelList = rq.getAreaList();
if (basLaancAreaModelList != null && !basLaancAreaModelList.isEmpty()) {
@ -369,113 +388,19 @@ public class BasLaancService {
return rs;
}
// LAANC 검증
/*
private BasLaancValidatedRs validationPlanAreaAndArcrft(BasLaancPlanRq rq) {
// 초기화
BasLaancValidatedRs rs = BasLaancValidatedRs.builder()
.isPlanAreaDuplicatd(false) // 비행구역 중복여부
.isArcrftDuplicated(false) // 기체 중복여부
.build();
// 비행계획서
List<FltPlanBas> fltPlanBasList = fltPlanBasRepository.findBySchFltStDtLessThanEqualAndSchFltEndDtGreaterThanEqualAndAprvlYnAndDelYn(rq.getSchFltEndDt(), rq.getSchFltStDt(), "Y", "N");
if (fltPlanBasList != null && !fltPlanBasList.isEmpty()) {
if (rq.getPlanSno() != null) {
// 동일한 비행계획서는 검증에서 제외 처리
fltPlanBasList = fltPlanBasList.stream().filter(fltPlanBas -> !rq.getPlanSno().equals(fltPlanBas.getPlanSno())).collect(Collectors.toList());
}
// 비행계획서 planSno 모음
List<Integer> planSnoList = fltPlanBasList.stream().map(FltPlanBas::getPlanSno).collect(Collectors.toList());
// 지역
// List<FltPlanArea> fltPlanAreaList = fltPlanAreaRepository.findByPlanSnoIn(planSnoList);
for (FltPlanBas fltPlanBas : fltPlanBasList) {
// 1. 구역조회
List<FltPlanArea> fltPlanAreaList = fltPlanAreaRepository.findByPlanSnoOrderByPlanAreaSnoAsc(fltPlanBas.getPlanSno());
// 2. 좌표 조회 -> 영역 포함 여부 확인
for (FltPlanArea fltPlanArea : fltPlanAreaList) {
String effectiveFltElev = fltPlanArea.getFltElev();
List<FltPlanAreaCoord> fltPlanAreaCoordList = fltPlanAreaCoordRepository.findByPlanAreaSnoOrderByPlanAreaCoordSnoAsc(fltPlanArea.getPlanAreaSno());
if (fltPlanAreaCoordList == null || fltPlanAreaCoordList.isEmpty()) continue;
// 2-1 영역 좌표
List<Coordinate> effectiveCoordList = fltPlanAreaCoordList.stream().map(fltPlanAreaCoord -> new Coordinate(fltPlanAreaCoord.getLon(), fltPlanAreaCoord.getLat())).collect(Collectors.toList());
List<Coordinate> effectiveCoordBufferList = new ArrayList<>();
// Query에서 조회한 좌표로 버퍼좌표 생성
if ("LINE".equals(fltPlanArea.getAreaType())) {
List<Coordinate> trans = areaUtils.transform(effectiveCoordList, "EPSG:4326", "EPSG:5181");
List<Coordinate> bufferList = areaUtils.buffer(trans, fltPlanArea.getBufferZone());
effectiveCoordBufferList = areaUtils.transform(bufferList, "EPSG:5181", "EPSG:4326");
}
if ("POLYGON".equals(fltPlanArea.getAreaType())) {
effectiveCoordBufferList.addAll(effectiveCoordList);
}
if ("CIRCLE".equals(fltPlanArea.getAreaType())) {
effectiveCoordBufferList = areaUtils.createCircle(effectiveCoordList.get(0), fltPlanArea.getBufferZone());
}
for (BasLaancAreaModel basLaancAreaModel : rq.getAreaList()) {
String targetFltElev = basLaancAreaModel.getFltElev();
// TODO 추후 특정 고도 범위 확인
boolean isEqualsFltElev = effectiveFltElev.equals(targetFltElev);
// rq로 들어온 좌표로 버퍼좌표 생성
List<Coordinate> targetCoords = basLaancAreaModel.getCoordList().stream().map(coord -> new Coordinate(coord.getLon(), coord.getLat())).collect(Collectors.toList());
List<Coordinate> targetBufferCoords = new ArrayList<>();
if ("LINE".equals(basLaancAreaModel.getAreaType())) {
List<Coordinate> trans = areaUtils.transform(targetCoords, "EPSG:4326", "EPSG:5181");
List<Coordinate> bufferList = areaUtils.buffer(trans, fltPlanArea.getBufferZone());
targetBufferCoords = areaUtils.transform(bufferList, "EPSG:5181", "EPSG:4326");
} else if ("POLYGON".equals(basLaancAreaModel.getAreaType())) {
targetBufferCoords.addAll(targetCoords);
} else if ("CIRCLE".equals(basLaancAreaModel.getAreaType())) {
targetBufferCoords = areaUtils.createCircle(targetCoords.get(0), fltPlanArea.getBufferZone());
}
// 검증
Geometry targetGeometry = areaUtils.coordinateToGeometry(targetBufferCoords);
Geometry effectiveGeometry = areaUtils.coordinateToGeometry(effectiveCoordBufferList);
if (targetGeometry.intersects(effectiveGeometry) && isEqualsFltElev) {
rs.setPlanAreaDuplicatd(true);
}
}
}
}
// 기체 중복 여부 확인
List<BasLaancArcrftModel> arcrftList = rq.getArcrftList();
if (arcrftList != null && !arcrftList.isEmpty()) {
List<FltPlanArcrft> fltPlanArcrftList = fltPlanArcrftRepository.findByPlanSnoIn(planSnoList);
if (fltPlanArcrftList != null && !fltPlanArcrftList.isEmpty()) {
boolean isDuplicatedArcrft = arcrftList.stream().anyMatch(arcrft ->
fltPlanArcrftList.stream().anyMatch(fltPlanArcrft ->
arcrft.getIdntfNum().equals(fltPlanArcrft.getIdntfNum())
)
);
if (isDuplicatedArcrft) {
rs.setArcrftDuplicated(true);
}
}
}
}
return rs;
}
/**
* 비행신청 - 공역관련 검증
*
* @param rq
* @return
*/
private BasLaancValidatedRs validationPlanAirspace(BasLaancPlanRq rq) {
// 초기화
BasLaancValidatedRs rs = BasLaancValidatedRs.builder()
.isEvaluatedTargetArea(false) // 판단구역 - 공역과 겹칠 경우
.isFlightArea(false) // 비행가능여부
.isElev(false) // 비행가능여부
.build();
// 공역 중복 확인
@ -507,27 +432,18 @@ public class BasLaancService {
boolean duplicatedAirspace = airspaceUtils.isDuplicatedAirspace(featureInfo);
rs.setEvaluatedTargetArea(duplicatedAirspace);
// 비행 가능 지역 판단
// if (duplicatedAirspace) {
// boolean validLaancAirspace = airspaceUtils.isValidLaancAirspace(featureInfo);
// rs.setFlightAreaYn(validLaancAirspace ? "Y" : "N");
// } else {
// rs.setFlightAreaYn("N");
// }
// 비행 가능 지역 판단
boolean validLaancAirspace = airspaceUtils.isValidLaancAirspace(featureInfo);
rs.setFlightArea(validLaancAirspace);
rs.setElev(validLaancAirspace);
}
return rs;
}
/**
* 야간 특별비행 유무 확인
* 비행계획서 검증 - 시작, 종료 일자
* 1. 비행시작 일자 금일 ~ 90일 이내
* 2. 비행 종료일자 금일 ~ 6개월까지 -- validtion 통과후 일몰
* 3. 일몰, 일출 시간[해떠있는 시간] 체크
*
* @param rq
* @return
@ -551,23 +467,34 @@ public class BasLaancService {
// 시간 파라미터가 맞지 않을경우
if (!(isSchFltStDtValid && isSchFltEndDtValid)) return false;
// String[] stringStDt = InstantUtils.toDatetimeString(rq.getSchFltStDt()).split(" ");
// String[] stringEndDt = InstantUtils.toDatetimeString(rq.getSchFltEndDt()).split(" ");
//
// ComnSunrisesetCoordRq comnSunrisesetCoordRq = new ComnSunrisesetCoordRq(stringStDt[0].replace("-", ""), stringEndDt[0].replace("-", ""), null, null);
//
// ComnSunrisesetRs comnSunrisesetRs = comRiseSetQueryRepository.findBySearchCoordDateTransform(comnSunrisesetCoordRq);
//
// LocalTime sunUp = this.convertStringToTime(comnSunrisesetRs.getCivilm(), "HHmmss");
// LocalTime sunDown = this.convertStringToTime(comnSunrisesetRs.getCivile(), "HHmmss");
//
// LocalTime stringStTm = this.convertStringToTime(stringStDt[1].replace(":", ""), "HHmmss");
// LocalTime stringEndTm = this.convertStringToTime(stringEndDt[1].replace(":", ""), "HHmmss");
//
// boolean stTmValid = this.isBetweenSunriseAndSunset(sunUp, sunDown, stringStTm);
// boolean endTmValid = this.isBetweenSunriseAndSunset(sunUp, sunDown, stringEndTm);
// if (!stTmValid || !endTmValid) return false;
return true;
}
/**
* 비행계획서 검증 - 특별 비행
* @param rq
* @return
*/
private boolean validationPlanSpecialFlight(BasLaancPlanRq rq) {
String[] stringStDt = InstantUtils.toDatetimeString(rq.getSchFltStDt()).split(" ");
String[] stringEndDt = InstantUtils.toDatetimeString(rq.getSchFltEndDt()).split(" ");
ComnSunrisesetCoordRq comnSunrisesetCoordRq = new ComnSunrisesetCoordRq(stringStDt[0].replace("-", ""), stringEndDt[0].replace("-", ""), null, null);
ComnSunrisesetRs comnSunrisesetRs = comRiseSetQueryRepository.findBySearchCoordDateTransform(comnSunrisesetCoordRq);
LocalTime sunUp = this.convertStringToTime(comnSunrisesetRs.getCivilm(), "HHmmss");
LocalTime sunDown = this.convertStringToTime(comnSunrisesetRs.getCivile(), "HHmmss");
LocalTime stringStTm = this.convertStringToTime(stringStDt[1].replace(":", ""), "HHmmss");
LocalTime stringEndTm = this.convertStringToTime(stringEndDt[1].replace(":", ""), "HHmmss");
boolean stTmValid = this.isBetweenSunriseAndSunset(sunUp, sunDown, stringStTm);
boolean endTmValid = this.isBetweenSunriseAndSunset(sunUp, sunDown, stringEndTm);
if (!stTmValid || !endTmValid) return false;
return true;
}
@ -596,18 +523,23 @@ public class BasLaancService {
timeToCheck.isBefore(sunset);
}
// 허용고도 조회
public List<Integer> getAllowableElevation(List<BasLaancAreaModel> rq) {
/**
* 허용고도 조회
*
* @param rq
* @return
*/
public List<Integer> getAllowableElevation(List<BasLaancAreaByElevModel> rq) {
AirspaceUtils airspaceUtils = AirspaceUtils.getInstance();
List<Integer> allowElevationList = new ArrayList<>();
for (BasLaancAreaModel area : rq) {
for (BasLaancAreaByElevModel area : rq) {
//rq로 들어온 좌표로 버퍼좌표 생성
List<Coordinate> targetCoord = new ArrayList<>();
List<Coordinate> targetCoordBufferList = new ArrayList<>();
for (BasLaancAreaCoordModel basLaancAreaCoordModel : area.getCoordList()) {
Coordinate coords = new Coordinate(basLaancAreaCoordModel.getLon(), basLaancAreaCoordModel.getLat());
for (BasLaancAreaCoordByElevModel coord : area.getCoordList()) {
Coordinate coords = new Coordinate(coord.getLon(), coord.getLat());
targetCoord.add(coords);
}
@ -631,7 +563,13 @@ public class BasLaancService {
return allowElevationList;
}
// TS 연동
/**
* TS 연동 - 장격증명 API
*
* @param idntfNumList
* @return
*/
@Deprecated
public BasLaancTsRs getTsValid(List<String> idntfNumList) {
Integer cstmrSno = jwtTokenUtil.getCstmrSnoByToken();
AnctCstmrModel cstmrInfo = ptyCstmrQueryRepository.findByCstmrSno(cstmrSno);
@ -651,17 +589,22 @@ public class BasLaancService {
.build();
}
// 관제권 포함 여부
public List<BasLaancDuplicatedAirspaceRs> getDuplicatedAirspace(List<BasLaancAreaModel> rq) {
/**
* 구역좌표 - 관제권 포함 여부
*
* @param rq
* @return
*/
public List<BasLaancDuplicatedAirspaceRs> getDuplicatedAirspace(List<BasLaancAreaByAirspaceModel> rq) {
AirspaceUtils airspaceUtils = AirspaceUtils.getInstance();
List<BasLaancDuplicatedAirspaceRs> rs = new ArrayList<>();
for (BasLaancAreaModel area : rq) {
for (BasLaancAreaByAirspaceModel area : rq) {
//rq로 들어온 좌표로 버퍼좌표 생성
List<Coordinate> targetCoord = new ArrayList<>();
List<Coordinate> targetCoordBufferList = new ArrayList<>();
for (BasLaancAreaCoordModel basLaancAreaCoordModel : area.getCoordList()) {
for (BasLaancAreaCoordByAirspaceModel basLaancAreaCoordModel : area.getCoordList()) {
Coordinate coords = new Coordinate(basLaancAreaCoordModel.getLon(), basLaancAreaCoordModel.getLat());
targetCoord.add(coords);
}
@ -689,4 +632,146 @@ public class BasLaancService {
return rs;
}
/**
* QR code 생성 - 자격증명을 위한
* QR code 생성(PAV-KAC)* > qr code 스캔(사용자) > 자격정보 전송(TS) > return url 자격정보 받음(PAV-KAC) > 확인(자격정보 확인)
*
* @param rq
* @return
*/
public BasLaancQrcodeRs createQrcode(BasLaancQrcodeRq rq) {
Integer cstmrSno = jwtTokenUtil.getCstmrSnoByToken();
String userId = jwtTokenUtil.getUserIdByToken();
AnctCstmrModel cstmrInfo = ptyCstmrQueryRepository.findByCstmrSno(cstmrSno);
String userCi = cstmrInfo.getIpinCi();
String idntfNum = null;
if (rq != null && rq.getIdntfNum() != null && !rq.getIdntfNum().isEmpty()) {
idntfNum = rq.getIdntfNum();
}
String confirmKey = UUID.randomUUID().toString();
String params = null;
byte[] qr = null;
try {
TsQrcodeRq tsRq = TsQrcodeRq.builder()
.rtnUrl(APP_HOST + TS_RETURN_URI)
.reqId(confirmKey)
.submittype(idntfNum)
.applyUser(userCi)
.build();
// params = JsonUtils.toJson(tsRq);
/*
tsdronewallet://kotsa.or.kr
? type=5
& rtnUrl= http://121.190.193.50:6081/api/external/laanc/vc/callback
& reqId=0b42b0af-3875-4a21-b57b-bb93ffcb3cfc
& submittype=C1CM0231251
& applyUser=dzT9zrm1JJRbrT1oRsUbvXYDfbAtXG5QOZjbIVHPaklSZ2PTw8ojYdJyeTrdQdtKIGFM5Z7xfrN/Crm6iGRLkA==
*/
params = UriComponentsBuilder
.fromUriString("tsdronewallet://kotsa.or.kr")
.queryParam("type", tsRq.getType())
.queryParam("rtnUrl", tsRq.getRtnUrl())
.queryParam("reqId", tsRq.getReqId())
.queryParam("submittype", tsRq.getSubmittype())
.queryParam("applyUser", tsRq.getApplyUser())
.build()
.toUriString();
qr = tsService.createQrcode(params);
} catch (WriterException | IOException e) {
log.error("ERROR: ", e);
throw new CustomException(ErrorCode.FAIL, "QR코드 생성 실패");
}
// db 저장 - confirmKey(uuid)
ComConfirmBas comConfirmBas = ComConfirmBas.builder()
.confirmKey(confirmKey)
.status("GENERATED")
.targetType("TS_QRCODE")
.rqData(params)
.createUserId(userId)
.updateUserId(userId)
.build();
comConfirmBasRepository.save(comConfirmBas);
log.info(">>> confirmKey [GENERATED] ", confirmKey);
return BasLaancQrcodeRs.builder()
.qrcode(qr)
.confirmKey(confirmKey)
.build();
}
/**
* QR code 확인
* QR code 촬영후 return url로 데이터 받은 이후 확인 프로세스
* QR code 생성(PAV-KAC) > qr code 스캔(사용자) > 자격정보 전송(TS) > return url 자격정보 받음(PAV-KAC) > 확인(자격정보 확인)*
*
* @param confirmKey
* @return
*/
public PilotValidRs checkQrcode(String confirmKey) {
log.info(">>> confirmKey : {}", confirmKey);
String userIdByToken = jwtTokenUtil.getUserIdByToken();
ComConfirmBas entity = comConfirmBasRepository.findFirstByConfirmKeyOrderByCreateDtDesc(confirmKey);
if(entity == null) throw new CustomException(ErrorCode.DATA_NOTFIND, "QR코드 조회 실패");
if (!"RECEIVED".equals(entity.getStatus())){
Map<String, String> errorParam = new HashMap<>();
errorParam.put("status", entity.getStatus());
throw new CustomException(ErrorCode.DATA_NOTFIND, errorParam);
}
// TODO 일자 검증 - 3분 초과
Instant createDt = entity.getCreateDt().plus(3, ChronoUnit.MINUTES);
boolean flag = !createDt.isBefore(Instant.now());
if (!flag) {
entity.setStatus("EXPIRED");
entity.setUpdateUserId(userIdByToken);
comConfirmBasRepository.save(entity);
comConfirmBasRepository.flush();
throw new CustomException(ErrorCode.QR_EXPIRED, "QR 기간 만료");
}
PilotValidRs rs = null;
String rsData = entity.getRsData();
if(rsData != null && !rsData.isEmpty()){
rs = JsonUtils.fromJson(rsData, PilotValidRs.class);
}
return rs;
}
/**
* TS 비행계획서
* 드론원스탑에서 받은 데이터 받기
*
* @param tsPlanRq
*/
public void createPlanDos(TsPlanRq tsPlanRq) {
// convert
BasLaancPlanRq rq = tsPlanRq.toBasLaancPlanRq();
// 기존 로직대로 수행
BasLaancValidatedRs basLaancValidatedRs = this.validationLaanc(rq);
if (!basLaancValidatedRs.isValid()) {
log.info("ts dron one stop validation fail : {}", basLaancValidatedRs);
return;
}
try {
BasLaancLastRs flightPlan = this.createFlightPlan(rq);
} catch (Exception e) {
log.error("ts dron one stop create flight plan fail", e);
}
}
}

203
pav-server/src/main/java/com/palnet/biz/api/cns/faq/controller/CnsFaqController.java

@ -1,44 +1,68 @@
package com.palnet.biz.api.cns.faq.controller;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.palnet.biz.api.bas.laanc.model.BasLaancAprvRs;
import com.palnet.biz.api.cns.faq.model.FaqListModel;
import com.palnet.biz.api.cns.faq.model.FaqListRQModel;
import com.palnet.biz.api.cns.faq.model.FaqListRSModel;
import com.palnet.biz.api.cns.faq.model.FaqUpdateModel;
import com.palnet.biz.api.cns.faq.service.CnsFaqService;
import com.palnet.biz.api.comn.response.BasicResponse;
import com.palnet.biz.api.comn.response.ErrorResponse;
import com.palnet.biz.api.comn.response.SuccessResponse;
import com.palnet.comn.exception.CustomException;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.enums.ParameterIn;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.responses.ApiResponses;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.data.domain.Page;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import com.palnet.biz.api.cns.faq.model.FaqListRQModel;
import com.palnet.biz.api.cns.faq.model.FaqListModel;
import com.palnet.biz.api.cns.faq.service.CnsFaqService;
import com.palnet.biz.api.comn.response.BasicResponse;
import com.palnet.biz.api.comn.response.SuccessResponse;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@RestController
@Slf4j
@Tag(name = "FAQ API", description = "FAQ 관련 API")
@RequiredArgsConstructor
@RequestMapping(value = "/api/bas/cns/faq")
@Tag(name = "FAQ", description = "FAQ 관련 API")
public class CnsFaqController {
private final CnsFaqService service;
/*FAQ 목록 조회*/
@Tag(name = "FAQ API", description = "FAQ 관련 API")
/**
* FAQ 목록 조회하는 기능,
* FaqListRQModel 값에 있는 조건값으로 조회함.
* @param model
* @return
*/
@GetMapping
@Operation(summary = "FAQ 조회", description = "FAQ를 조회하는 API 입니다.")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "성공",
content = {
@io.swagger.v3.oas.annotations.media.Content(mediaType = "application/json",
array = @io.swagger.v3.oas.annotations.media.ArraySchema(
schema = @io.swagger.v3.oas.annotations.media.Schema(implementation = FaqListModel.class)))
})
})
public ResponseEntity<? extends BasicResponse> getFaqList(FaqListRQModel model) {
List<FaqListModel> result = null;
List<FaqListRSModel> 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 +70,13 @@ public class CnsFaqController {
resultMap.put("errorMessage", e.getMessage());
return ResponseEntity.ok().body(new SuccessResponse<>(resultMap));
} catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : ", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
@ -54,14 +85,36 @@ public class CnsFaqController {
return ResponseEntity.ok().body(new SuccessResponse<>(result));
}
/*FAQ 상세 조회*/
@Tag(name = "FAQ API", description = "FAQ 관련 API")
/**
* FAQ 상세 조회하는 기능,
* 일련번호[sno] 조회함.
* @param sno
* @return
*/
@GetMapping("/{sno}")
public ResponseEntity<? extends BasicResponse> getFaqDetail(@PathVariable("sno") int sno) {
FaqListModel result = null;
@Operation(summary = "FAQ 상세 조회", description = "특정 FAQ만 조회하는 API 입니다. sno 값 : 1, 2, 등 ....")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "성공",
content = {
@io.swagger.v3.oas.annotations.media.Content(mediaType = "application/json",
array = @io.swagger.v3.oas.annotations.media.ArraySchema(
schema = @io.swagger.v3.oas.annotations.media.Schema(implementation = FaqListModel.class)))
})
})
public ResponseEntity<? extends BasicResponse> getFaqDetail(
@Parameter(name="sno", description = "FAQ 시리얼 넘버", in = ParameterIn.PATH, example = "17")@PathVariable int sno) {
FaqListRSModel result = null;
try {
result = service.getFaqDetail(sno);
result = service.getFaqDetail(sno); // 일련번호[sno]로 상세정보를 조회하는 기능
} catch (CustomException e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* CustomException은 개발자가 "의도적으로" 예외처리,
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
Map<String, Object> resultMap = new HashMap<>();
log.error("IGNORE : ", e);
resultMap.put("result", false);
@ -69,6 +122,13 @@ public class CnsFaqController {
resultMap.put("errorMessage", e.getMessage());
return ResponseEntity.ok().body(new SuccessResponse<>(resultMap));
} catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : ", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
@ -77,14 +137,35 @@ public class CnsFaqController {
return ResponseEntity.ok().body(new SuccessResponse<>(result));
}
/*FAQ 작성*/
@Tag(name = "FAQ API", description = "FAQ 관련 API")
/**
* FAQ 작성하는 기능,
* FaqListModel모델에 있는 값으로 작성하는 기능.
* @param model
* @return
*/
@PostMapping
@Operation(summary = "FAQ 작성", description = "FAQ를 작성하는 API 입니다.")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "성공",
content = {
@io.swagger.v3.oas.annotations.media.Content(mediaType = "application/json",
array = @io.swagger.v3.oas.annotations.media.ArraySchema(
schema = @io.swagger.v3.oas.annotations.media.Schema(implementation = SuccessResponse.class)))
})
})
public ResponseEntity<? 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 +173,13 @@ public class CnsFaqController {
resultMap.put("errorMessage", e.getMessage());
return ResponseEntity.ok().body(new SuccessResponse<>(resultMap));
} catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : ", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
@ -102,14 +190,35 @@ public class CnsFaqController {
}
/*FAQ 업데이트*/
@Tag(name = "FAQ API", description = "FAQ 관련 API")
/**
* FAQ 업데이트 기능,
* FaqListModel 모델에 있는 값으로 업데이트함.
* @param model
* @return
*/
@PutMapping
public ResponseEntity<? extends BasicResponse> updateFaq(@RequestBody FaqListModel model) {
@Operation(summary = "FAQ 수정", description = "FAQ를 수정하는 API 입니다.")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "성공",
content = {
@io.swagger.v3.oas.annotations.media.Content(mediaType = "application/json",
array = @io.swagger.v3.oas.annotations.media.ArraySchema(
schema = @io.swagger.v3.oas.annotations.media.Schema(implementation = SuccessResponse.class)))
})
})
public ResponseEntity<? extends BasicResponse> updateFaq(@RequestBody FaqUpdateModel model) {
boolean result = false;
try {
result = service.updateFaq(model);
result = service.updateFaq(model); // FaQ 수정하는 기능
} catch (CustomException e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* CustomException은 개발자가 "의도적으로" 예외처리,
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
Map<String, Object> resultMap = new HashMap<>();
log.error("IGNORE : ", e);
resultMap.put("result", false);
@ -117,6 +226,13 @@ public class CnsFaqController {
resultMap.put("errorMessage", e.getMessage());
return ResponseEntity.ok().body(new SuccessResponse<>(resultMap));
} catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : ", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
@ -126,14 +242,26 @@ public class CnsFaqController {
}
/*FAQ 논리 삭제*/
@Tag(name = "FAQ API", description = "FAQ 관련 API")
/**
* FAQ 삭제하는 기능,
* 일련번호[sno] 삭제하는 기능.
* @param sno
* @return
*/
@DeleteMapping("/{sno}")
@Operation(summary = "FAQ 삭제", description = "특정 FAQ를 논리 삭제하는 API 입니다. sno 예시 : 1, 2, 등 ...")
public ResponseEntity<? 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 +269,13 @@ public class CnsFaqController {
resultMap.put("errorMessage", e.getMessage());
return ResponseEntity.ok().body(new SuccessResponse<>(resultMap));
} catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : ", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));

14
pav-server/src/main/java/com/palnet/biz/api/cns/faq/model/FaqListModel.java

@ -2,31 +2,43 @@ package com.palnet.biz.api.cns.faq.model;
import java.time.Instant;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
public class FaqListModel {
@Schema(hidden = true)
private int faqSno;
@Schema(description = "FAQ 분류" , example = "장치신고")
private String category;
@Schema(description = "작성할 글의 제목" , example = "제목 샘플")
private String title;
@Schema(description = "작성할 글의 내용" , example = "내용 샘플")
private String content;
@Schema(hidden = true)
private int viewCnt;
@Schema(description = "표출 여부" , example = "Y")
private String expsrYn;
// private String delYn;
@Schema(hidden = true)
private String delYn;
@Schema(hidden = true)
private String createUserId;
@Schema(description = "생성일자", example = "2023-12-12", implementation = String.class)
private Instant createDt;
@Schema(hidden = true)
private String updateUserId;
@Schema(description = "업데이트 일자", example = "2023-12-12", implementation = String.class)
private Instant updateDt;
}

3
pav-server/src/main/java/com/palnet/biz/api/cns/faq/model/FaqListRQModel.java

@ -1,12 +1,15 @@
package com.palnet.biz.api.cns.faq.model;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
public class FaqListRQModel {
@Schema(description = "FAQ 카테고리" , example = "비행승인")
private String category;
@Schema(description = "해당 단어가 포함된 제목 검색" , example = "비행")
private String word;
}

32
pav-server/src/main/java/com/palnet/biz/api/cns/faq/model/FaqListRSModel.java

@ -0,0 +1,32 @@
package com.palnet.biz.api.cns.faq.model;
import java.time.Instant;
import lombok.Data;
@Data
public class FaqListRSModel {
private int faqSno;
private String category;
private String title;
private String content;
private int viewCnt;
private String expsrYn;
private String delYn;
private String createUserId;
private Instant createDt;
private String updateUserId;
private Instant updateDt;
}

46
pav-server/src/main/java/com/palnet/biz/api/cns/faq/model/FaqUpdateModel.java

@ -0,0 +1,46 @@
package com.palnet.biz.api.cns.faq.model;
import java.time.Instant;
import com.fasterxml.jackson.annotation.JsonIgnore;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
public class FaqUpdateModel {
@Schema(description = "수정할 글의 번호" , example = "17")
private int faqSno;
@Schema(description = "FAQ 분류" , example = "장치신고")
private String category;
@Schema(description = "수정할 글의 제목" , example = "제목 수정 샘플")
private String title;
@Schema(description = "수정할 글의 내용" , example = "내용 수정 샘플")
private String content;
@Schema(hidden = true)
private int viewCnt;
@Schema(description = "표출 여부" , example = "Y")
private String expsrYn;
@Schema(hidden = true)
private String delYn;
@Schema(hidden = true)
private String createUserId;
@Schema(hidden = true)
private Instant createDt;
@Schema(description = "수정한 사람" , example = "palnet")
private String updateUserId;
@Schema(description = "업데이트 일자")
private Instant updateDt;
}

36
pav-server/src/main/java/com/palnet/biz/api/cns/faq/service/CnsFaqService.java

@ -3,6 +3,8 @@ package com.palnet.biz.api.cns.faq.service;
import com.palnet.biz.api.acnt.jwt.utils.JwtTokenUtil;
import com.palnet.biz.api.cns.faq.model.FaqListModel;
import com.palnet.biz.api.cns.faq.model.FaqListRQModel;
import com.palnet.biz.api.cns.faq.model.FaqListRSModel;
import com.palnet.biz.api.cns.faq.model.FaqUpdateModel;
import com.palnet.biz.jpa.entity.CnsFaqBas;
import com.palnet.biz.jpa.repository.cns.CnsFaqBasRepository;
import com.palnet.biz.jpa.repository.cns.CnsFaqQueryRepository;
@ -25,9 +27,14 @@ public class CnsFaqService {
private final CnsFaqBasRepository cnsFaqBasRepository;
private final JwtTokenUtil jwtTokenUtil;
public List<FaqListModel> getFaqList(FaqListRQModel model){
/**
* FaQ 항목들 조회하는 기능.
* @param model
* @return
*/
public List<FaqListRSModel> getFaqList(FaqListRQModel model){
List<FaqListModel> result = query.getFaqList(model.getCategory(), model.getWord());
List<FaqListRSModel> result = query.getFaqList(model.getCategory(), model.getWord());
if(result == null) result = new ArrayList<>();
@ -35,13 +42,23 @@ public class CnsFaqService {
}
public FaqListModel getFaqDetail(int sno){
/**
* 일련번호[sno] 상세정보를 조회하는 기능.
* @param sno
* @return
*/
public FaqListRSModel getFaqDetail(int sno){
cnsFaqBasRepository.updateViewCnt(sno);
FaqListModel result = query.getFaqDetail(sno);
FaqListRSModel result = query.getFaqDetail(sno);
if(result == null) throw new CustomException(ErrorCode.DATA_NO);
return result;
}
/**
* FaQ 추가하는 기능.
* @param model
* @return
*/
@Transactional
public boolean insertFaq(FaqListModel model){
String userId = jwtTokenUtil.getUserIdByToken();
@ -69,8 +86,13 @@ public class CnsFaqService {
}
}
/**
* FaQ 수정하는 기능.
* @param model
* @return
*/
@Transactional
public boolean updateFaq(FaqListModel model) {
public boolean updateFaq(FaqUpdateModel model) {
String userId = jwtTokenUtil.getUserIdByToken();
CnsFaqBas prevData = cnsFaqBasRepository.findById(model.getFaqSno()).orElseThrow(() -> new CustomException(ErrorCode.DATA_NO));
@ -92,6 +114,10 @@ public class CnsFaqService {
}
}
/**
* 일련번호[sno] 삭제하는 기능.
* @param sno
*/
public void deleteFaq(int sno) {
// TODO 반환값이 실행한 갯수인지 확인 필요

266
pav-server/src/main/java/com/palnet/biz/api/cns/qna/controller/CnsQnaController.java

@ -1,30 +1,48 @@
package com.palnet.biz.api.cns.qna.controller;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.palnet.biz.api.acnt.jwt.utils.JwtTokenUtil;
import com.palnet.biz.api.cns.qna.model.*;
import com.palnet.biz.api.cns.qna.model.QnaBasModel;
import com.palnet.biz.api.cns.qna.model.QnaDetailRSModel;
import com.palnet.biz.api.cns.qna.model.QnaInsertAnserRQModel;
import com.palnet.biz.api.cns.qna.model.QnaInsertRQModel;
import com.palnet.biz.api.cns.qna.model.QnaListAdminRQ;
import com.palnet.biz.api.cns.qna.model.QnaSelectListRQ;
import com.palnet.biz.api.cns.qna.service.CnsQnaService;
import com.palnet.biz.api.comn.response.BasicResponse;
import com.palnet.biz.api.comn.response.ErrorResponse;
import com.palnet.biz.api.comn.response.SuccessResponse;
import com.palnet.comn.code.RSErrorCode;
import com.palnet.comn.exception.CustomException;
import io.swagger.annotations.ApiOperation;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.enums.ParameterIn;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.responses.ApiResponses;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@RestController
@Slf4j
@Tag(name = "QNA", description = "QNA 관련 API")
@RequiredArgsConstructor
@RestController
@Tag(name = "QNA", description = "QNA 관련 API")
@RequestMapping("/api/cns/qna")
public class CnsQnaController {
@ -32,14 +50,35 @@ public class CnsQnaController {
private final JwtTokenUtil jwtTokenUtil;
/**
* QnA 등록하는 기능,
* QnaInsertRQModel 모델에 요청값으로 QnA를 등록하는 기능.
* @param rq
* @return
*/
@PostMapping(consumes = "multipart/form-data")
@Tag(name = "QNA", description = "QNA 관련 API")
@ApiOperation(value = "QnA 등록 - 사용자")
@Operation(summary = "QNA 등록 (사용자)", description = "사용자 권한으로 QNA를 등록하는 API 입니다.")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "성공",
content = {
@io.swagger.v3.oas.annotations.media.Content(mediaType = "application/json",
array = @io.swagger.v3.oas.annotations.media.ArraySchema(
schema = @io.swagger.v3.oas.annotations.media.Schema(implementation = boolean.class)))
})
})
public ResponseEntity<? 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 +86,13 @@ public class CnsQnaController {
resultMap.put("errorMessage", e.getMessage());
return ResponseEntity.ok().body(new SuccessResponse<>(resultMap));
} catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : ", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
@ -55,15 +101,36 @@ public class CnsQnaController {
return ResponseEntity.ok().body(new SuccessResponse<>(result));
}
/**
* QnA리스트 조회하는 기능[관리자],
* QnaListAdminRQ 조건값에 따라 조회함.
* @param rq
* @return
*/
@GetMapping
@Tag(name = "QNA", description = "QNA 관련 API")
@ApiOperation(value = "QnA 리스트 조회-관리자")
@Operation(summary = "QNA 리스트 조회 (관리자)", description = "QNA 리스트를 관리자 권한으로 조회하는 API 입니다.")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "성공",
content = {
@io.swagger.v3.oas.annotations.media.Content(mediaType = "application/json",
array = @io.swagger.v3.oas.annotations.media.ArraySchema(
schema = @io.swagger.v3.oas.annotations.media.Schema(implementation = QnaBasModel.class)))
})
})
public ResponseEntity<? extends BasicResponse> selectQna(QnaListAdminRQ rq) {
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 +138,13 @@ public class CnsQnaController {
resultMap.put("errorMessage", e.getMessage());
return ResponseEntity.ok().body(new SuccessResponse<>(resultMap));
} catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : ", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
@ -80,15 +154,36 @@ public class CnsQnaController {
}
/**
* QnA리스트 조회하는 기능[관리자],
* QnaSelectListRQ 값에 따라서 조회함.
* @param rq
* @return
*/
@GetMapping("/user")
@Tag(name = "QNA", description = "QNA 관련 API")
@ApiOperation(value = "QnA 리스트 조회-사용자")
@Operation(summary = "QNA 리스트 조회 (사용자)", description = "QNA 리스트를 사용자 권한으로 조회하는 API 입니다.")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "성공",
content = {
@io.swagger.v3.oas.annotations.media.Content(mediaType = "application/json",
array = @io.swagger.v3.oas.annotations.media.ArraySchema(
schema = @io.swagger.v3.oas.annotations.media.Schema(implementation = QnaBasModel.class)))
})
})
public ResponseEntity<? extends BasicResponse> selectQnaForUser(QnaSelectListRQ rq) {
List<QnaBasModel> result = new ArrayList<>();
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 +191,13 @@ public class CnsQnaController {
resultMap.put("errorMessage", e.getMessage());
return ResponseEntity.ok().body(new SuccessResponse<>(resultMap));
} catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : ", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
@ -105,14 +207,27 @@ public class CnsQnaController {
}
/**
* QnA 상세보기 기능,
* QnA일련번호[qnaSno]값으로 조회함.
* @param qnaSno
* @return
*/
@GetMapping("/{qnaSno}")
@Tag(name = "QNA", description = "QNA 관련 API")
@ApiOperation(value = "QnA 상세보기")
public ResponseEntity<? extends BasicResponse> detailQna(@PathVariable int qnaSno) {
@Operation(summary = "QNA 리스트 상세 조회", description = "QNA 리스트를 상세하게 조회하는 API 입니다.")
public ResponseEntity<? extends BasicResponse> detailQna(@Parameter(name="qnaSno", description = "QnA일련번호", in = ParameterIn.PATH, example = "295") @PathVariable int qnaSno) {
QnaDetailRSModel result = null;
try {
result = cnsQnaService.getQnaDetail(qnaSno);
result = cnsQnaService.getQnaDetail(qnaSno); // Qna 상세불러오기 기능
} catch (CustomException e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* CustomException은 개발자가 "의도적으로" 예외처리,
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
Map<String, Object> resultMap = new HashMap<>();
log.error("IGNORE : ", e);
resultMap.put("result", false);
@ -120,6 +235,13 @@ public class CnsQnaController {
resultMap.put("errorMessage", e.getMessage());
return ResponseEntity.ok().body(new SuccessResponse<>(resultMap));
} catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : ", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
@ -128,14 +250,35 @@ public class CnsQnaController {
return ResponseEntity.ok().body(new SuccessResponse<>(result));
}
/**
* QnA수정 하는 기능[사용자],
* QnaInsertRQModel 모델에 입력받은 사항들을 수정함.
* @param rq
* @return
*/
@PutMapping(consumes = "multipart/form-data")
@Tag(name = "QNA", description = "QNA 관련 API")
@ApiOperation(value = "QnA 수정 - 사용자")
@Operation(summary = "QNA 수정 (사용자)", description = "QNA를 사용자 권한으로 수정하는 API 입니다.")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "성공",
content = {
@io.swagger.v3.oas.annotations.media.Content(mediaType = "application/json",
array = @io.swagger.v3.oas.annotations.media.ArraySchema(
schema = @io.swagger.v3.oas.annotations.media.Schema(implementation = boolean.class)))
})
})
public ResponseEntity<? 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 +286,13 @@ public class CnsQnaController {
resultMap.put("errorMessage", e.getMessage());
return ResponseEntity.ok().body(new SuccessResponse<>(resultMap));
} catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : ", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
@ -152,15 +302,28 @@ public class CnsQnaController {
}
/**
* QnA삭제하는 기능,
* QnA일련번호[qnaSno] 삭제함.
* @param qnaSno
* @return
*/
@DeleteMapping("/{qnaSno}")
@Tag(name = "QNA", description = "QNA 관련 API")
@ApiOperation(value = "QnA 삭제하기")
public ResponseEntity<? extends BasicResponse> deleteQna(@PathVariable int qnaSno) {
@Operation(summary = "QNA 삭제", description = "QNA를 삭제하는 API 입니다.")
public ResponseEntity<? extends BasicResponse> deleteQna(@Parameter(name="qnaSno", description = "QnA일련번호", in = ParameterIn.PATH, example = "17") @PathVariable int qnaSno) {
// TODO 관리자만 삭제 가능 여부인지 확인 필요
boolean result = false;
try {
result = cnsQnaService.deleteQna(qnaSno);
result = cnsQnaService.deleteQna(qnaSno); // Qna 삭제하기, file들도 모두 논리삭제하는 기능.
} catch (CustomException e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* CustomException은 개발자가 "의도적으로" 예외처리,
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
Map<String, Object> resultMap = new HashMap<>();
log.error("IGNORE : ", e);
resultMap.put("result", false);
@ -168,6 +331,13 @@ public class CnsQnaController {
resultMap.put("errorMessage", e.getMessage());
return ResponseEntity.ok().body(new SuccessResponse<>(resultMap));
} catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : ", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
@ -176,9 +346,22 @@ public class CnsQnaController {
return ResponseEntity.ok().body(new SuccessResponse<>(result));
}
/**
* QnA 답변등록하는 기능[관리자],
* QnaInsertAnserRQModel에 입력받은 값으로 답변을 등록함.
* @param rq
* @return
*/
@PutMapping("/answer")
@Tag(name = "QNA", description = "QNA 관련 API")
@ApiOperation(value = "QnA 답변 등록 - 관리자")
@Operation(summary = "QNA 답변 등록(관리자)", description = "QNA에 대한 답변을 관리자 권한으로 등록하는 API 입니다.")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "성공",
content = {
@io.swagger.v3.oas.annotations.media.Content(mediaType = "application/json",
array = @io.swagger.v3.oas.annotations.media.ArraySchema(
schema = @io.swagger.v3.oas.annotations.media.Schema(implementation = boolean.class)))
})
})
public ResponseEntity<? extends BasicResponse> insertAnswer(@RequestBody QnaInsertAnserRQModel rq) {
// TODO 추후 auth -> role 체크로 변경
boolean result = false;
@ -188,8 +371,16 @@ public class CnsQnaController {
return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body(new ErrorResponse(RSErrorCode.AUTH_ERROR));
}
result = cnsQnaService.insertAnswer(rq);
result = cnsQnaService.insertAnswer(rq); // 답변추가하는 기능.
} catch (CustomException e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* CustomException은 개발자가 "의도적으로" 예외처리,
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
Map<String, Object> resultMap = new HashMap<>();
log.error("IGNORE : ", e);
resultMap.put("result", false);
@ -197,6 +388,13 @@ public class CnsQnaController {
resultMap.put("errorMessage", e.getMessage());
return ResponseEntity.ok().body(new SuccessResponse<>(resultMap));
} catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : ", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));

4
pav-server/src/main/java/com/palnet/biz/api/cns/qna/model/QnaInsertAnserRQModel.java

@ -1,17 +1,21 @@
package com.palnet.biz.api.cns.qna.model;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
public class QnaInsertAnserRQModel {
@Schema(description = "답변을 달 qna 번호" , example = "16")
private Integer qnaSno;
// private Integer targetSno; // 상위 Qna 번호
@Schema(description = "답변 내용" , example = "답변 샘플입니다.")
private String anserContent;
// private String anserUserNm;
// private Instant anserProcDt;
@Schema(description = "답변 상태" , example = "Y")
private String anserStatus;
}

4
pav-server/src/main/java/com/palnet/biz/api/cns/qna/model/QnaListAdminRQ.java

@ -1,15 +1,19 @@
package com.palnet.biz.api.cns.qna.model;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
public class QnaListAdminRQ {
// 문의유형
@Schema(description = "검색 타입" , example = "불만")
private String category;
// 답변상태
@Schema(description = "답변 여부" , example = "Y")
private String anserStatus;
// 작성자
@Schema(description = "작성자" , example = "팔네트웍스")
private String createUserNm;
}

6
pav-server/src/main/java/com/palnet/biz/api/cns/qna/model/QnaSelectListRQ.java

@ -1,12 +1,18 @@
package com.palnet.biz.api.cns.qna.model;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
public class QnaSelectListRQ {
@Schema(description = "검색 타입" , example = "TITLE")
private String searchType;
@Schema(description = "검색어" , example = "드론")
private String word;
@Schema(description = "카테고리" , example = "문의")
private String category;
}

35
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,20 +112,22 @@ public class CnsQnaService {
}
/**
* Qna 상세불러오기
*
* Qna 상세불러오기 기능.
* @param qnaSno
* @return
*/
@Transactional // 조회수 증가하기떄문
// @Transactional는 데이터베이스의 정합성을 위해 사용합니다, 추가 수정 삭제 등에서 사용합니다, 이 기능에서는 조회수 증가하기 떄문에 사용했습니다.
@Transactional
public QnaDetailRSModel getQnaDetail(int qnaSno) {
cnsQnaBasRepository.pulsViewCount(qnaSno);
CnsQnaBas entity = cnsQnaBasRepository.findFirstByQnaSnoAndTargetSnoAndDelYnAndExpsrYn(qnaSno, 0, "N", "Y");
if(entity == null) throw new CustomException(ErrorCode.DATA_NO);
List<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 +143,7 @@ public class CnsQnaService {
}
/**
* Qna리스트 조회
* Qna리스트 조회하는 기능[관리자].
*
* @param rq
* @return
@ -150,14 +152,18 @@ public class CnsQnaService {
return cnsQnaQueryRepository.getQnaList(rq);
}
/**
* Qna리스트 조회하는 기능[유저]
* @param rq
* @return
*/
public List<QnaBasModel> selectQnaForUser(QnaSelectListRQ rq) {
String userId = jwtTokenUtil.getUserIdByToken();
return cnsQnaQueryRepository.getQnaListForUser(rq, userId);
}
/**
* QnaInsert
*
* Qna 추가 하는기능.
* @param rq
* @return
*/
@ -188,6 +194,11 @@ public class CnsQnaService {
}
/**
* 답변추가하는 기능.
* @param rq
* @return
*/
public boolean insertAnswer(QnaInsertAnserRQModel rq) {
CnsQnaBas entity = cnsQnaBasRepository.findByQnaSnoAndDelYnAndExpsrYn(rq.getQnaSno(), "N", "Y");
if (entity == null) throw new CustomException(ErrorCode.DATA_NOTFIND);

64
pav-server/src/main/java/com/palnet/biz/api/comn/coordinate/controller/ComnCoordinateController.java

@ -0,0 +1,64 @@
package com.palnet.biz.api.comn.coordinate.controller;
import java.util.HashMap;
import java.util.Map;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.palnet.biz.api.comn.coordinate.model.CompotentAuthorityRQ;
import com.palnet.biz.api.comn.coordinate.model.CompotentAuthorityRS;
import com.palnet.biz.api.comn.coordinate.service.ComnCoordinateService;
import com.palnet.biz.api.comn.response.BasicResponse;
import com.palnet.biz.api.comn.response.ErrorResponse;
import com.palnet.biz.api.comn.response.SuccessResponse;
import com.palnet.comn.exception.CustomException;
import io.swagger.annotations.ApiOperation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@RestController
@RequiredArgsConstructor
@RequestMapping("/api/comn/coordinate")
@Slf4j
@Tag(name = "공통 API", description = "공통 API")
public class ComnCoordinateController {
private final ComnCoordinateService comnCoordinateService;
/**
* 좌표로 관할기관 가져오기
* @param rq
* @return
*/
@GetMapping("/comptent-authority")
@ApiOperation(value = "좌표로 관할 기관청 가져오기")
@Tag(name = "공통 API", description = "공통 API")
public ResponseEntity<? extends BasicResponse> getCompetentAuthority(CompotentAuthorityRQ rq){
CompotentAuthorityRS result = new CompotentAuthorityRS();
try {
result = comnCoordinateService.getCompetentAuthority(rq);
} catch (CustomException e) {
Map<String, Object> resultMap = new HashMap<>();
log.error("IGNORE : ", e);
resultMap.put("result", false);
resultMap.put("errorCode", e.getErrorCode());
resultMap.put("errorMessage", e.getMessage());
return ResponseEntity.ok().body(new SuccessResponse<>(resultMap));
} catch (Exception e) {
log.error("IGNORE : ", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
}
return ResponseEntity.ok().body(new SuccessResponse<>(result));
}
}

12
pav-server/src/main/java/com/palnet/biz/api/comn/coordinate/model/CompotentAuthorityRQ.java

@ -0,0 +1,12 @@
package com.palnet.biz.api.comn.coordinate.model;
import lombok.Data;
@Data
public class CompotentAuthorityRQ {
private Double lat;
private Double lon;
}

14
pav-server/src/main/java/com/palnet/biz/api/comn/coordinate/model/CompotentAuthorityRS.java

@ -0,0 +1,14 @@
package com.palnet.biz.api.comn.coordinate.model;
import java.util.List;
import com.palnet.biz.jpa.entity.FltCptAuthBas;
import lombok.Data;
@Data
public class CompotentAuthorityRS {
private List<FltCptAuthBas> fltCptpAuthBasList;
}

105
pav-server/src/main/java/com/palnet/biz/api/comn/coordinate/service/ComnCoordinateService.java

@ -0,0 +1,105 @@
package com.palnet.biz.api.comn.coordinate.service;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.json.simple.JSONObject;
import org.json.simple.parser.ParseException;
import org.locationtech.jts.geom.Coordinate;
import org.springframework.stereotype.Service;
import com.palnet.biz.api.comn.coordinate.model.CompotentAuthorityRQ;
import com.palnet.biz.api.comn.coordinate.model.CompotentAuthorityRS;
import com.palnet.biz.jpa.entity.FltCptAuthBas;
import com.palnet.biz.jpa.repository.flt.FltCptAuthAdminDistrictBasQueryRepository;
import com.palnet.comn.utils.FlightUtils;
import lombok.RequiredArgsConstructor;
@Service
@RequiredArgsConstructor
public class ComnCoordinateService {
private final FltCptAuthAdminDistrictBasQueryRepository ffFltCptAuthAdminDistrictBasQueryRepository;
public CompotentAuthorityRS getCompetentAuthority(CompotentAuthorityRQ rq){
Coordinate coord = new Coordinate(rq.getLon(), rq.getLat());
JSONObject code = new JSONObject();
try {
code = FlightUtils.getPlace(coord, false);
} catch (ParseException e) {
e.printStackTrace();
} catch (IOException e){
e.printStackTrace();
} catch (Exception e){
e.printStackTrace();
}
String[] scope = {"ctprvn", "sig", "emd", "li"};
final String cd = (String) code.get("CD");
Set<FltCptAuthBas> fltCptAuthBas = new HashSet<FltCptAuthBas>();
for(int i = 0; i < scope.length; i++){
String cdParam = this.codeParsing(cd, scope[i]);
List<FltCptAuthBas> authList = ffFltCptAuthAdminDistrictBasQueryRepository.geFltCptAuthBas(cdParam);
fltCptAuthBas.addAll(new HashSet<FltCptAuthBas>(authList));
}
CompotentAuthorityRS result = new CompotentAuthorityRS();
result.setFltCptpAuthBasList(new ArrayList<>(fltCptAuthBas));
return result;
}
private String codeParsing(String cd, String scope){
switch (scope) {
case "ctprvn":
if(cd.length() < 2) break;
cd = cd.substring(0, 2);
break;
case "sig":
if(cd.length() < 5) break;
cd = cd.substring(0, 5);
break;
case "emd":
if(cd.length() < 8) break;
cd = cd.substring(0, 8);
break;
case "li":
if(cd.length() < 10) break;
cd = cd.substring(0, 10);
break;
}
int length = cd.length();
int maxLength = 10;
int difference = maxLength - length;
StringBuilder sb = new StringBuilder();
sb.append(cd);
for(int i = 0; i < difference; i++){
sb.append("0");
}
return sb.toString();
}
}

78
pav-server/src/main/java/com/palnet/biz/api/comn/elev/controller/ComnElevController.java

@ -8,7 +8,8 @@ import com.palnet.biz.api.comn.response.BasicResponse;
import com.palnet.biz.api.comn.response.ErrorResponse;
import com.palnet.biz.api.comn.response.SuccessResponse;
import com.palnet.comn.exception.CustomException;
import io.swagger.annotations.ApiOperation;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@ -32,16 +33,28 @@ public class ComnElevController {
private final ComnElevService comnElevService;
/**
*
* @param rq
* @return
*/
@PostMapping(value = "/ground")
@ApiOperation(value = "지표면 고도 가져오기")
@Tag(name = "공통 API", description = "공통 API")
@Operation(summary = "특정 좌표의 고도 가져오기", description = "특정 좌표의 해수면고도(MSL)를 입력하면 지표면고도(AGL)로 변환해 주는 API 입니다.")
public ResponseEntity<? extends BasicResponse> getGroundElev(@RequestBody List<ComnGroundElevRq> rq) {
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,16 +77,28 @@ public class ComnElevController {
return ResponseEntity.ok().body(new SuccessResponse<>(rs));
}
/**
* MSL[해발고도] AGL[지표면고도] 변환하는 기능.
* @param rq
* @return
*/
@PostMapping(value = "/to/agl")
@ApiOperation(value = "msl을 agl로 변환")
@Tag(name = "공통 API", description = "공통 API")
@Operation(summary = "해수면고도 -> 지표면고도 변환", description = "특정 좌표의 해수면고도(MSL)를 지표면고도(AGL)로 변환해 주는 API 입니다.")
public ResponseEntity<? extends BasicResponse> convertMslToAgl(@RequestBody List<ComnElevRq> rq) {
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 +106,13 @@ public class ComnElevController {
resultMap.put("errorMessage", e.getMessage());
return ResponseEntity.ok().body(new SuccessResponse<>(resultMap));
} catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : ", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
@ -82,16 +121,28 @@ public class ComnElevController {
return ResponseEntity.ok().body(new SuccessResponse<>(rs));
}
/**
* AGL[지표면고도] MSL[해발고도] 변환하는 기능.
* @param rq
* @return
*/
@PostMapping(value = "/to/msl")
@ApiOperation(value = "agl을 msl로 변환")
@Tag(name = "공통 API", description = "공통 API")
@Operation(summary = "지표면고도 -> 해수면고도 변환", description = "특정 좌표의 지표면고도(AGL)를 해수면고도(MSL)로 변환해 주는 API 입니다.")
public ResponseEntity<? extends BasicResponse> convertAglToMsl(@RequestBody List<ComnElevRq> rq) {
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 +150,13 @@ public class ComnElevController {
resultMap.put("errorMessage", e.getMessage());
return ResponseEntity.ok().body(new SuccessResponse<>(resultMap));
} catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : ", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));

7
pav-server/src/main/java/com/palnet/biz/api/comn/elev/model/ComnElevRq.java

@ -1,5 +1,6 @@
package com.palnet.biz.api.comn.elev.model;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
@ -10,7 +11,13 @@ import lombok.NoArgsConstructor;
@AllArgsConstructor
@Builder
public class ComnElevRq {
@Schema(description = "위도" , example = "37.520930", implementation = Double.class)
private Double lat;
@Schema(description = "경도" , example = "126.605684", implementation = Double.class)
private Double lon;
@Schema(description = "고도" , example = "100.0", implementation = Double.class)
private Double elev;
}

5
pav-server/src/main/java/com/palnet/biz/api/comn/elev/model/ComnGroundElevRq.java

@ -1,5 +1,6 @@
package com.palnet.biz.api.comn.elev.model;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
@ -10,6 +11,10 @@ import lombok.NoArgsConstructor;
@AllArgsConstructor
@Builder
public class ComnGroundElevRq {
@Schema(description = "위도" , example = "37.520930", implementation = Double.class)
private Double lat;
@Schema(description = "경도" , example = "126.605684", implementation = Double.class)
private Double lon;
}

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

39
pav-server/src/main/java/com/palnet/biz/api/comn/file/controller/ComnFileController.java

@ -1,6 +1,11 @@
package com.palnet.biz.api.comn.file.controller;
import com.palnet.biz.api.comn.file.service.ComnFileService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.enums.ParameterIn;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
@ -23,25 +28,53 @@ import org.springframework.web.bind.annotation.RestController;
@RequiredArgsConstructor
@RequestMapping("/api/comn/file")
@RestController
@Tag(name ="파일", description = "파일 관련 API")
public class ComnFileController {
private final ComnFileService comnFileService;
/**
* 사용 안함[@Deprecated]
* 파일일련번호[fileSno] 파일 다운로드 하는 기능.
* QueryParam 방식으로 parameter를 받음.
* @param fileSno
*/
@Deprecated
@GetMapping("/download")
public void downloadPDF(int fileSno) {
@Operation(summary = "파일다운로드[사용하지 않음]", description = "미사용")
public void downloadPDF(@Parameter(name="fileSno", description = "파일일련번호", in = ParameterIn.QUERY, example = "117") int fileSno) {
try {
comnFileService.fileDownload(fileSno);
comnFileService.fileDownload(fileSno); // 파일 일련번호[fileSno]로 파일 다운로드하는 기능
} catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악함
*/
log.error("ERROR: ", e);
}
}
/**
* 파일일련번호[fileSno] 파일 다운로드 하는 기능.
* @param fileSno
*/
@GetMapping("/download/{fileSno}")
public void download(@PathVariable("fileSno") int fileSno) {
@Operation(summary = "파일다운로드", description = "파일 일련번호로 파일을 다운로드 합니다.")
public void download(@Parameter(name="fileSno", description = "파일일련번호", in = ParameterIn.PATH, example = "117") @PathVariable("fileSno") int fileSno) {
try {
comnFileService.fileDownload(fileSno);
} catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악함
*/
log.error("ERROR: ", e);
}
}

21
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,6 +175,7 @@ public class ComnFileService {
byte[] buffer = new byte[1024]; //1KB 설정
int length;
// 요청한 사용자에게 파일데이터 전송
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<>();

8
pav-server/src/main/java/com/palnet/biz/api/comn/model/ComnPagingModel.java

@ -1,13 +1,21 @@
package com.palnet.biz.api.comn.model;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
public class ComnPagingModel {
@Schema(description = "데이터 표출 수" , example = "10")
private int record = 10; // 데이터 표출 수
@Schema(description = "현재 페이지" , example = "1")
private int page = 0; // 현재 페이지
@Schema(description = "시작위치" , example = "0")
private int stIdx = 0; // 시작 위치
@Schema(description = "끝 위치" , example = "0")
private int endIdx = 0; // 끝 위치
}

6
pav-server/src/main/java/com/palnet/biz/api/comn/model/ComnRqModel.java

@ -1,17 +1,23 @@
package com.palnet.biz.api.comn.model;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
@Data
@EqualsAndHashCode(callSuper=false)
public class ComnRqModel extends ComnPagingModel {
@Schema(description = "검색 시작 날짜" , example = "2023-11-01" , implementation = String.class)
private String stDate;
@Schema(description = "검색 종료 날짜" , example = "2023-11-30" , implementation = String.class)
private String endDate;
@Schema(hidden = true)
private String search1;
@Schema(hidden = true)
private String searchType1;
}

9
pav-server/src/main/java/com/palnet/biz/api/comn/response/SuccessResponse.java

@ -1,15 +1,20 @@
package com.palnet.biz.api.comn.response;
import java.util.List;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.List;
@Data
@EqualsAndHashCode(callSuper=false)
public class SuccessResponse<T> extends BasicResponse {
@Schema(description = "응답 데이터 건수")
private int count;
@Schema(description = "응답 데이터")
private T data;
public SuccessResponse(T data) {

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

87
pav-server/src/main/java/com/palnet/biz/api/comn/sunriseset/controller/ComnSunrisesetController.java

@ -8,9 +8,7 @@ import com.palnet.biz.api.comn.sunriseset.model.ComnSunrisesetRq;
import com.palnet.biz.api.comn.sunriseset.model.ComnSunrisesetRs;
import com.palnet.biz.api.comn.sunriseset.service.ComnSunrisesetService;
import com.palnet.comn.exception.CustomException;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@ -19,7 +17,6 @@ import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import springfox.documentation.annotations.ApiIgnore;
import java.util.HashMap;
import java.util.List;
@ -45,17 +42,30 @@ public class ComnSunrisesetController {
private final ComnSunrisesetService comnSunrisesetService;
@ApiOperation(value = "일출/일몰 조회", notes = "기간내 모든 일출/일몰조회")
@Tag(name = "공통 API", description = "공통 API")
/**
* 일출/일몰 시간대를 조회하는 기능,
* ComnSunrisesetRq에 있는 검색 시작일, 끝일의 조건에 맞춰 조회함.
* @param rq
* @return
*/
@GetMapping("/list")
@Operation(summary = "일출/일몰 조회", description = "기간 내 모든 일출과 일몰시간을 조회하는 API 입니다.")
public ResponseEntity<? extends BasicResponse> getSunRiseSetList(ComnSunrisesetRq rq) {
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 +73,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,18 +88,30 @@ public class ComnSunrisesetController {
return ResponseEntity.ok().body(new SuccessResponse<>(rs));
}
@ApiOperation(value = "일출/일몰 조회(좌표)", notes = "기간내 근접한 지역의 일출/일몰 조회")
@Tag(name = "공통 API", description = "공통 API")
/**
* 근접한 지역의 일출/일몰 조회,
* ComnSunrisesetCoordRq 모델에 있는 시작,끝날짜 조건에 맞춰 가장 근접한 지역의 일출/일몰 조회.
* @param rq
* @return
*/
@GetMapping("/coord")
@Operation(summary = "일출/일몰 조회(좌표)", description = "기간 내 좌표와 근접한 지역의 일출과 일몰시간을 1건 조회하는 API 입니다.")
public ResponseEntity<? extends BasicResponse> getSunRiseSetByCoordAndDate(ComnSunrisesetCoordRq rq) {
ComnSunrisesetRs rs = null;
try {
log.debug(">>> rq : {}", rq);
rs = comnSunrisesetService.getSunRiseSetByCoordAndDate(rq);
rs = comnSunrisesetService.getSunRiseSetByCoordAndDate(rq); // 기간내 근접한 지역의 일출/일몰 조회하는 기능
// log.debug(">>> rs : {}", rs);
} catch (CustomException e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* CustomException은 개발자가 "의도적으로" 예외처리,
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
Map<String, Object> resultMap = new HashMap<String, Object>();
log.error("IGNORE : ", e);
resultMap.put("result", false);
@ -90,6 +119,13 @@ public class ComnSunrisesetController {
resultMap.put("errorMessage", e.getMessage());
return ResponseEntity.ok().body(new SuccessResponse<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,14 +134,14 @@ public class ComnSunrisesetController {
return ResponseEntity.ok().body(new SuccessResponse<>(rs));
}
@ApiOperation(value = "일출/일몰 조회(좌표-6개월치)", notes = "근접한 지역의 현재~6개월치의 일출/일몰 데이터 조회")
@Tag(name = "공통 API", description = "공통 API")
@ApiImplicitParams(value = {
@ApiImplicitParam(name = "lat", value = "위도", required = true, dataType = "double", paramType = "query", example = "37.5665", defaultValue = "37.5665"),
@ApiImplicitParam(name = "lon", value = "경도", required = true, dataType = "double", paramType = "query", example = "126.9780", defaultValue = "126.9780"),
})
/**
* 근접한 지역의 현재~6개월치의 일출/일몰 데이터 조회하는 기능
* @param rq
* @return
*/
@GetMapping("/coord/list")
public ResponseEntity<? extends BasicResponse> getSunRiseSetByCoord(@ApiIgnore ComnSunrisesetCoordRq rq) {
@Operation(summary = "일출/일몰 조회(좌표 - 6개월치)", description = "기간 내 근접 지역에서 현재부터 6개월치 일출과 일몰시간을 조회하는 API 입니다.")
public ResponseEntity<? extends BasicResponse> getSunRiseSetByCoord(ComnSunrisesetCoordRq rq) {
List<ComnSunrisesetRs> rs = null;
try {
log.debug(">>> rq : {}", rq);
@ -113,6 +149,14 @@ public class ComnSunrisesetController {
// log.debug(">>> rs : {}", rs);
} catch (CustomException e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* CustomException은 개발자가 "의도적으로" 예외처리,
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
Map<String, Object> resultMap = new HashMap<String, Object>();
log.error("IGNORE : ", e);
resultMap.put("result", false);
@ -120,6 +164,13 @@ public class ComnSunrisesetController {
resultMap.put("errorMessage", e.getMessage());
return ResponseEntity.ok().body(new SuccessResponse<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/model/ComnSunrisesetCoordRq.java

@ -1,7 +1,8 @@
package com.palnet.biz.api.comn.sunriseset.model;
import com.fasterxml.jackson.annotation.JsonIgnore;
import io.swagger.annotations.ApiParam;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
@ -23,13 +24,17 @@ import lombok.NoArgsConstructor;
@AllArgsConstructor
@Builder
public class ComnSunrisesetCoordRq {
@ApiParam(value = "시작일자", defaultValue = "20231101", example = "20231101", required = true)
@Schema(description = "시작일자", example = "20231101")
private String locStDate;
@ApiParam(value = "종료일자", defaultValue = "20231231", example = "20231231", required = true)
@Schema(description = "종료일자", example = "20231231")
private String locEndDate;
@ApiParam(value = "위도", defaultValue = "37.4717452", example = "37.11", required = true)
@Schema(description = "위도", example = "37.520987")
private Double lat;
@ApiParam(value = "경도", defaultValue = "126.7081059", example = "127.11", required = true)
@Schema(description = "경도", example = "126.610646")
private Double lon;
@JsonIgnore

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save