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. 224
      pav-server/src/main/java/com/palnet/biz/api/acnt/crtfyhp/controller/AcntCrtfyhpController.java
  5. 113
      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. 27
      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. 152
      pav-server/src/main/java/com/palnet/biz/api/acnt/cstmr/service/AcntCstmrService.java
  14. 136
      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. 33
      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. 92
      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. 20
      pav-server/src/main/java/com/palnet/biz/api/anls/smlt/service/AnlsSmltService.java
  28. 207
      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. 5
      pav-server/src/main/java/com/palnet/biz/api/bas/dron/model/BasDronModel.java
  31. 11
      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. 21
      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. 36
      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. 233
      pav-server/src/main/java/com/palnet/biz/api/bas/group/controller/BasGroupController.java
  42. 68
      pav-server/src/main/java/com/palnet/biz/api/bas/group/controller/BasGroupJoinController.java
  43. 67
      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. 8
      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. 31
      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. 32
      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. 24
      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. 523
      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. 16
      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. 40
      pav-server/src/main/java/com/palnet/biz/api/cns/faq/service/CnsFaqService.java
  80. 268
      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. 10
      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. 25
      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. 11
      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 dx = x2 - x1;
var dy = y2 - y1; var dy = y2 - y1;
var heading = (Math.atan2(dy, dx) * 180) / Math.PI; 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; return heading;
} }
@ -91,9 +92,9 @@ const dumyData = {
lon: 126.6146, lon: 126.6146,
elevType: 'M', elevType: 'M',
elev: 125.4, elev: 125.4,
speedType: 'KM', speedType: 'm/s',
speed: 145.8, speed: 40.5,
heading: 227.94, heading: 0,
terminalRcvDt: '20210629173145', terminalRcvDt: '20210629173145',
betteryLevel: 91, betteryLevel: 91,
betteryVoltage: 50, betteryVoltage: 50,

12
document/dron_test/pav-warning.js

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

8
pav-server/build.gradle

@ -46,6 +46,9 @@ dependencies {
developmentOnly 'org.springframework.boot:spring-boot-devtools' developmentOnly 'org.springframework.boot:spring-boot-devtools'
implementation 'org.springframework.boot:spring-boot-starter-webflux' 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 // thymeleaf
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
@ -86,7 +89,6 @@ dependencies {
implementation 'org.apache.commons:commons-io:1.3.2' implementation 'org.apache.commons:commons-io:1.3.2'
implementation 'commons-httpclient:commons-httpclient:3.1' implementation 'commons-httpclient:commons-httpclient:3.1'
implementation 'com.googlecode.json-simple:json-simple:1.1.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 'org.json:json:20220320'
implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jsr353:2.15.2' 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-geotiff:29.2'
implementation 'org.geotools:gt-epsg-hsql: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' testCompileOnly 'org.projectlombok:lombok:1.18.28'
testAnnotationProcessor 'org.projectlombok:lombok:1.18.28' testAnnotationProcessor 'org.projectlombok:lombok:1.18.28'

224
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.HashMap;
import java.util.Map; 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.HttpStatus;
import org.springframework.http.MediaType; import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping; 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.RequestMapping;
import org.springframework.web.bind.annotation.RestController; 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.acnt.crtfyhp.service.AcntCrtfyhpService;
import com.palnet.biz.api.comn.response.BasicResponse; import com.palnet.biz.api.comn.response.BasicResponse;
import com.palnet.biz.api.comn.response.ErrorResponse; 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.code.RSErrorCode;
import com.palnet.comn.utils.EncryptUtils; 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.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j2; import lombok.extern.slf4j.Slf4j;
@Log4j2 @Slf4j
@RestController @RestController
@RequiredArgsConstructor @RequiredArgsConstructor
@RequestMapping(value = "/api/acnt/crtfyhp", produces = {MediaType.APPLICATION_JSON_VALUE}) @RequestMapping(value = "/api/acnt/crtfyhp", produces = {MediaType.APPLICATION_JSON_VALUE})
@Tag(name = "휴대폰 인증 관리", description = "회원 휴대폰 인증 관련 API") @Tag(name = "휴대폰 인증 관리", description = "회원 휴대폰 인증 관련 API")
public class AcntCrtfyhpController { public class AcntCrtfyhpController {
@Autowired
private final AcntCrtfyhpService service; private final AcntCrtfyhpService service;
private final PtyCstmrQueryRepository ptyCstmrQueryRepository;
@Autowired /**
private PtyCstmrQueryRepository ptyCstmrQueryRepository; * 인증번호를 발송하는 기능,
* hpno 값은 휴대폰번호입니다. 번호에 인증번호를 발송합니다.
* @param hpno
* @return
*/
@GetMapping(value = "/register/send") @GetMapping(value = "/register/send")
@Tag(name = "휴대폰 인증 관리", description = "회원 휴대폰 인증 관련 API") @Operation(summary = "휴대폰 인증번호 전송", description = "입력한 휴대폰번호로 회원정보에 동일한 휴대폰 번호가 있는지 확인하고, 없다면 인증번호를 전송하는 API 입니다.")
@ApiImplicitParam(name = "hnpo",value = "휴대폰번호", dataTypeClass = String.class) public ResponseEntity<? extends BasicResponse> send(@Parameter(name="hpno", description = "회원 핸드폰번호", in = ParameterIn.QUERY, example = "01012345678") String hpno) {
public ResponseEntity<? extends BasicResponse> send(String hpno) {
Map<String , Object> resultMap = new HashMap<String,Object>(); Map<String , Object> resultMap = new HashMap<String,Object>(); // 결과 반환을 위한 객체선언
try { try {
if(hpno == null) { if(hpno == null) { // hpno[휴대폰번호] 가 없을시 서버에서 파라미터가 없다는 "의도적인" 에러 반환
return ResponseEntity.status(HttpStatus.OK) return ResponseEntity.status(HttpStatus.OK) // "의도적인" 에러 반환코드
.body(new ErrorResponse(RSErrorCode.ER_PARAM)); .body(new ErrorResponse(RSErrorCode.ER_PARAM));
} }
//회원정보에 동일한 휴대폰 번호가 있는지 확인 , 암호화 해서 검색 //회원정보에 동일한 휴대폰 번호가 있는지 확인 , 암호화 해서 검색
String encHpno = EncryptUtils.encrypt(hpno); String encHpno = EncryptUtils.encrypt(hpno);
// 휴대폰 번호가 종복이면 isHpno가 True
boolean isHpno = ptyCstmrQueryRepository.findCstmrByHpno(encHpno); boolean isHpno = ptyCstmrQueryRepository.findCstmrByHpno(encHpno);
if(isHpno) { if(isHpno) { // 휴대폰 번호 중복인 경우
resultMap.put("result" , false); resultMap.put("result" , false); // 성공하지 못함을 의미
resultMap.put("code" , -1); // 동일한 휴대폰 번호 존재 resultMap.put("code" , -1); // 동일한 휴대폰 번호 존재
}else { // 휴대폰 번호 중복이 아닌경우
boolean result = service.registerSend(hpno); // 해당 휴대폰번호로 문자 메세지 발송
}else { resultMap.put("result" , result); // 메세지 발송이 성공일 경우 true
boolean result = service.registerSend(hpno);
resultMap.put("result" , result);
} }
} catch (Exception e) { } catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : {}", e); log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1")); .body(new ErrorResponse("Server Error", "-1"));
} }
// 문제없을 시 결과값을 최종적으로 리턴해줌
return ResponseEntity.ok().body(new SuccessResponse<Map>(resultMap)); return ResponseEntity.ok().body(new SuccessResponse<Map>(resultMap));
} }
/**
* 인증메세지를 받은 사용자가 인증번호를 입력하여 인증처리하는 기능입니다.
* @param hpno
* @param crtfyNo
* @return
*/
@GetMapping(value = "/register/confirm") @GetMapping(value = "/register/confirm")
@Tag(name = "휴대폰 인증 관리", description = "회원 휴대폰 인증 관련 API") @Operation(summary = "휴대폰 인증번호 검증", description = "입력한 핸드폰번호로 받은 인증번호를 입력해 검증하는 API 입니다.")
@ApiImplicitParams({ public ResponseEntity<? extends BasicResponse> confirm(@Parameter(name="hpno", description = "회원 핸드폰번호", in = ParameterIn.QUERY, example = "01012345678") String hpno ,
@ApiImplicitParam(name = "hpno",value = "휴대폰번호", dataTypeClass = String.class), @Parameter(name="crtfyNo", description = "회원 핸드폰번호", in = ParameterIn.QUERY, example = "123456") String crtfyNo) {
@ApiImplicitParam(name = "crtfyNo",value = "인증일련번호", dataTypeClass = String.class)
})
public ResponseEntity<? extends BasicResponse> confirm(String hpno , String crtfyNo) {
Map<String , Boolean> resultMap = new HashMap<String,Boolean>(); Map<String , Boolean> resultMap = new HashMap<String,Boolean>(); // 결과 반환을 위한 객체선언
if(hpno == null || crtfyNo == null) { if(hpno == null || crtfyNo == null) { // hpno[휴대폰번호], crtfyNo[인증번호] 값이 없을 시 서버에서 파라미터가 없다는 "의도적인" 에러 반환
return ResponseEntity.status(HttpStatus.OK) return ResponseEntity.status(HttpStatus.OK)// "의도적인" 에러 반환코드
.body(new ErrorResponse(RSErrorCode.ER_PARAM)); .body(new ErrorResponse(RSErrorCode.ER_PARAM));
} }
try {
try {
boolean result = service.registerConfirm(hpno, crtfyNo); // 휴대폰번호로 전송된 인증번호가 맞는지 확인하는 코드
boolean result = service.registerConfirm(hpno, crtfyNo); resultMap.put("result" , result); // 인증성공하면 true
resultMap.put("result" , result);
} catch (Exception e) { } catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : {}", e); log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1")); .body(new ErrorResponse("Server Error", "-1"));
@ -118,24 +127,25 @@ public class AcntCrtfyhpController {
} }
//아이디 찾기 시 인증번호 발송 로직 /**
* 아이디 찾기 인증번호 발송 로직
* @param memberName
* @param hpno
* @return
*/
@GetMapping(value = "/find/sendForId") @GetMapping(value = "/find/sendForId")
@ApiOperation(value = "아이디 찾기 시 인증번호 발송") @Operation(summary = "ID 찾기 시 사용되는 인증번호 발송 로직", description = "ID찾기 시 입력한 핸드폰번호로 인증번호를 발송하는 API 입니다.")
@Tag(name = "휴대폰 인증 관리", description = "회원 휴대폰 인증 관련 API") public ResponseEntity<? extends BasicResponse> sendForId(@Parameter(name="memberName", description = "회원 이름", in = ParameterIn.QUERY, example = "팔네트웍스") String memberName,
@ApiImplicitParams({ @Parameter(name="hpno", description = "회원 핸드폰번호", in = ParameterIn.QUERY, example = "01012345678") String hpno) {
@ApiImplicitParam(name = "memberName", value = "회원 이름", dataTypeClass = String.class), Map<String, Object> resultMap = new HashMap<String, Object>(); // 결과 반환을 위한 객체선언
@ApiImplicitParam(name = "hpno", value = "휴대폰 번호", dataTypeClass = String.class)
})
public ResponseEntity<? extends BasicResponse> sendForId(String memberName, String hpno) {
Map<String, Object> resultMap = new HashMap<String, Object>();
if(memberName == null || hpno == null) { if(memberName == null || hpno == null) { // hpno[휴대폰번호]와 memberName[회원이름]이 없을시 서버에서 파라미터가 없다는 "의도적인" 에러 반환
return ResponseEntity.status(HttpStatus.OK) return ResponseEntity.status(HttpStatus.OK) // "의도적인" 에러 반환코드
.body(new ErrorResponse(RSErrorCode.ER_PARAM)); .body(new ErrorResponse(RSErrorCode.ER_PARAM));
} }
try { try {
boolean result = service.certifNum(memberName, hpno); boolean result = service.certifNum(memberName, hpno); //
resultMap.put("result" , result); resultMap.put("result" , result);
if(!result) { if(!result) {
resultMap.put("code", -1); //일치하는 회원 없음 resultMap.put("code", -1); //일치하는 회원 없음
@ -143,6 +153,13 @@ public class AcntCrtfyhpController {
resultMap.put("code", 0); //일치하는 회원 존재 resultMap.put("code", 0); //일치하는 회원 존재
} }
} catch (Exception e) { } catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : {}", e); log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1")); .body(new ErrorResponse("Server Error", "-1"));
@ -150,19 +167,20 @@ public class AcntCrtfyhpController {
return ResponseEntity.ok().body(new SuccessResponse<Map>(resultMap)); return ResponseEntity.ok().body(new SuccessResponse<Map>(resultMap));
} }
//아이디 찾기 /**
* 아이디 찾기
* @param memberName
* @param hpno
* @return
*/
@GetMapping(value = "/find/findUserId") @GetMapping(value = "/find/findUserId")
@ApiOperation(value = "회원 아이디 찾기") @Operation(summary = "ID 찾기", description = "멤버의 이름과 핸드폰번호를 입력받아 회원가입 당시에 입력한 ID를 찾아주는 API 입니다.")
@Tag(name = "휴대폰 인증 관리", description = "회원 휴대폰 인증 관련 API") public ResponseEntity<? extends BasicResponse> findUserId(@Parameter(name="memberName", description = "회원 이름", in = ParameterIn.QUERY, example = "팔네트웍스") String memberName,
@ApiImplicitParams({ @Parameter(name="hpno", description = "회원 핸드폰번호", in = ParameterIn.QUERY, example = "01012345678") String hpno) {
@ApiImplicitParam(name = "memberName",value = "회원이름", dataTypeClass = String.class), Map<String, Object> resultMap = new HashMap<String, Object>(); // 결과 반환을 위한 객체선언
@ApiImplicitParam(name = "hpno",value = "휴대폰번호", dataTypeClass = String.class)
})
public ResponseEntity<? extends BasicResponse> findUserId(String memberName, String hpno) {
Map<String, Object> resultMap = new HashMap<String, Object>();
if(memberName == null || hpno == null) { if(memberName == null || hpno == null) { // hpno[휴대폰번호]와 memberName[회원이름]이 없을시 서버에서 파라미터가 없다는 "의도적인" 에러 반환
return ResponseEntity.status(HttpStatus.OK) return ResponseEntity.status(HttpStatus.OK) // "의도적인" 에러 반환코드
.body(new ErrorResponse(RSErrorCode.ER_PARAM)); .body(new ErrorResponse(RSErrorCode.ER_PARAM));
} }
@ -184,24 +202,25 @@ public class AcntCrtfyhpController {
return ResponseEntity.ok().body( new SuccessResponse<Map>(resultMap)); return ResponseEntity.ok().body( new SuccessResponse<Map>(resultMap));
} }
//비밀번호 찾기 시 인증번호 발송 로직 /**
* 비밀번호 찾기 인증번호 발송 로직
* @param userId
* @param hpno
* @return
*/
@GetMapping(value = "/find/sendForPw") @GetMapping(value = "/find/sendForPw")
@ApiOperation(value = "비밀번호 찾기 시 인증번호 발송") @Operation(summary = "비밀번호 찾기 시 인증번호 발송", description = "비밀번호 찾기 시도 시 멤버의 ID과 핸드폰번호를 입력받아 인증번호를 발송하는 API 입니다.")
@Tag(name = "휴대폰 인증 관리", description = "회원 휴대폰 인증 관련 API") public ResponseEntity<? extends BasicResponse> sendForPw(@Parameter(name="userId", description = "회원 아이디", in = ParameterIn.QUERY, example = "palnet") String userId,
@ApiImplicitParams({ @Parameter(name="hpno", description = "회원 핸드폰번호", in = ParameterIn.QUERY, example = "01012345678") String hpno) {
@ApiImplicitParam(name = "userId",value = "사용자ID", dataTypeClass = String.class),
@ApiImplicitParam(name = "hpno",value = "휴대폰번호", dataTypeClass = String.class)
})
public ResponseEntity<? extends BasicResponse> sendForPw(String userId, String hpno) {
Map<String, Object> resultMap = new HashMap<String, Object>(); Map<String, Object> resultMap = new HashMap<String, Object>();
if(userId == null || hpno == null) { if(userId == null || hpno == null) { // userId[회원아이디]와 memberName[회원이름]이 없을시 서버에서 파라미터가 없다는 "의도적인" 에러 반환
return ResponseEntity.status(HttpStatus.OK) return ResponseEntity.status(HttpStatus.OK) // "의도적인" 에러 반환코드
.body(new ErrorResponse(RSErrorCode.ER_PARAM)); .body(new ErrorResponse(RSErrorCode.ER_PARAM));
} }
try { try {
boolean result = service.certifPw(userId, hpno); boolean result = service.certifPw(userId, hpno); // 회원 ID와 휴대폰번호로 인증메세지 보내는 기능
resultMap.put("result", result); resultMap.put("result", result);
if(!result) { if(!result) {
resultMap.put("code", -1); //일치하는 회원 없음 resultMap.put("code", -1); //일치하는 회원 없음
@ -209,6 +228,13 @@ public class AcntCrtfyhpController {
resultMap.put("code", 0); //일치하는 회원 존재 resultMap.put("code", 0); //일치하는 회원 존재
} }
} catch (Exception e) { } catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : {}", e); log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1")); .body(new ErrorResponse("Server Error", "-1"));
@ -217,25 +243,28 @@ public class AcntCrtfyhpController {
return ResponseEntity.ok().body( new SuccessResponse<Map>(resultMap)); return ResponseEntity.ok().body( new SuccessResponse<Map>(resultMap));
} }
/**
* 비밀번호 찾기 업데이트
* @param userId
* @param hpno
* @param newPw
* @return
* @throws Exception
*/
@GetMapping(value = "/find/updatePw") @GetMapping(value = "/find/updatePw")
@ApiOperation(value = "비밀번호 찾기 및 업데이트") @Operation(summary = "새로운 비밀번호로 업데이트", description = "비밀번호 찾기 -> 인증번호 검증이 성공했을 경우, userId와 hpno가 일치하는 회원정보를 새로운 비밀번호로 업데이트 하는 API 입니다.")
@Tag(name = "휴대폰 인증 관리", description = "회원 휴대폰 인증 관련 API") public ResponseEntity<? extends BasicResponse> updatePw(@Parameter(name="userId", description = "회원 아이디", in = ParameterIn.QUERY, example = "palnet") String userId,
@ApiImplicitParams({ @Parameter(name="hpno", description = "회원 핸드폰번호", in = ParameterIn.QUERY, example = "01012345678") String hpno,
@ApiImplicitParam(name = "userID",value = "사용자ID", dataTypeClass = String.class), @Parameter(name="hpno", description = "회원 핸드폰번호", in = ParameterIn.QUERY, example = "newPassword1234") String newPw) throws Exception {
@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 {
Map<String, Object> resultMap = new HashMap<String, Object>(); Map<String, Object> resultMap = new HashMap<String, Object>();
if(hpno == null || newPw == null) { if(hpno == null || newPw == null) { // hpno[휴대폰번호]와 newPw[새로운 비밀번호]가 없을시 서버에서 파라미터가 없다는 "의도적인" 에러 반환
return ResponseEntity.status(HttpStatus.OK) return ResponseEntity.status(HttpStatus.OK) // "의도적인" 에러 반환코드
.body(new ErrorResponse(RSErrorCode.ER_PARAM)); .body(new ErrorResponse(RSErrorCode.ER_PARAM));
} }
try { try {
boolean result = service.updatePw(userId, hpno, newPw); boolean result = service.updatePw(userId, hpno, newPw); // 사용자가 입력한 새로운 암호로 업데이트
resultMap.put("result", result); resultMap.put("result", result);
if(!result) { if(!result) {
resultMap.put("code", -1); resultMap.put("code", -1);
@ -243,6 +272,13 @@ public class AcntCrtfyhpController {
resultMap.put("code", 0); resultMap.put("code", 0);
} }
} catch(Exception e) { } catch(Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : {}", e); log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1")); .body(new ErrorResponse("Server Error", "-1"));

113
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.PtyCstmrQueryRepository;
import com.palnet.biz.jpa.repository.pty.SuredataRepository; import com.palnet.biz.jpa.repository.pty.SuredataRepository;
import com.palnet.comn.utils.EncryptUtils; import com.palnet.comn.utils.EncryptUtils;
import com.palnet.comn.utils.InstantUtils;
@Service @Service
public class AcntCrtfyhpService { public class AcntCrtfyhpService {
@ -105,9 +106,16 @@ public class AcntCrtfyhpService {
// //
// return true; // return true;
// } // }
/**
* hpno에 있는 번호로 인증번호 메세지 발송하는 기능
* @param hpno
* @return
* @throws Exception
*/
public boolean registerSend(String hpno) throws Exception{ public boolean registerSend(String hpno) throws Exception{
//인증번호 만들기 ( 6자리) //인증번호 만들기 (6자리)
String certifyNo = numberGen(6, 2); String certifyNo = numberGen(6, 2);
//메시지 만들기 //메시지 만들기
@ -125,13 +133,25 @@ public class AcntCrtfyhpService {
ptyEntity.setCrtfyhpYn("N"); ptyEntity.setCrtfyhpYn("N");
ptyCrtfyhpBasRepository.save(ptyEntity); ptyCrtfyhpBasRepository.save(ptyEntity);
logger.info("certifyNo :: " + certifyNo); logger.info("certifyNo :: {}", certifyNo); // 로그로 인증번호 값을 찍어줌
// 현재시간 값을 구해옴 예시 => nowStr = "20231206135600"
String nowStr = InstantUtils.toDatetimeStringByFormat(Instant.now(), "yyyyMMddHHmmss");
//발송 테이블 입력 //발송 테이블 입력
SuredataEntity entity = new SuredataEntity(); SuredataEntity entity = new SuredataEntity();
entity.setIntime(nowStr);
entity.setCallphone(hpno); entity.setCallphone(hpno);
entity.setMsg(msg); entity.setMsg(msg);
/**
* Message 기본값들 applcation-local[dev,prod등].properties 파일에서 확인할 있음
* local,dev,prod는 서버가 돌아가는 환경 옵션입니다.
* local - 개발자 개인 컴퓨터 환경
* dev - 상용서버 배포전 테스트할 서버 환경[테스트서버]
* prod - 상용화 환경
*/
entity.setSubject(SUBJECT_CETIFY); entity.setSubject(SUBJECT_CETIFY);
entity.setCallname(CALLNAME_CERTIFY); entity.setCallname(CALLNAME_CERTIFY);
entity.setUsercode(USER_CODE); entity.setUsercode(USER_CODE);
@ -143,9 +163,11 @@ public class AcntCrtfyhpService {
entity.setKind(KIND); entity.setKind(KIND);
SuredataEntity result = sureDataRepository.save(entity); SuredataEntity result = sureDataRepository.save(entity); // 데이터 베이스에 저장[Data Insert]
if(result == null) { // Save했을시 성공하지 못하면 result는 null됨
// 그래서 null경우 성공하지 못한다고 판단
if(result == null) {
return false; 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{ public boolean registerConfirm(String hpno , String crtfyNo ) throws Exception{
hpno = EncryptUtils.encrypt(hpno); //암호화 해서 검색 hpno = EncryptUtils.encrypt(hpno); //암호화 해서 검색
List<PtyCrtfyhpBas> entity = query.confirmSms(hpno , crtfyNo); List<PtyCrtfyhpBas> entity = query.confirmSms(hpno , crtfyNo); // 데이터 베이스에서 휴대폰 번호와 인증번호 맞는지 체크
return entity.size() == 0 ? false : true; /**
* entity.size() 값은 인증성공하면 1이상 인증이 실패하면 0입니다.
* 그래서, [0]이면 false [인증실패]
* [1]이면 true [인증성공]
*/
return entity.size() == 0 ? false : true;
} }
/**
* len의 크기만큼 난수 생성,
* dupCd가 [1]이면 [중복허용], [2] [중복불가]
* @param len
* @param dupCd
* @return
*/
public static String numberGen(int len, int dupCd){ public static String numberGen(int len, int dupCd){
Random rand = new Random(); Random rand = new Random();
String numStr = ""; //난수가 저장될 변수 String numStr = ""; //난수가 저장될 변수
@ -184,46 +225,78 @@ public class AcntCrtfyhpService {
} }
return numStr; return numStr;
} }
/**
* 휴대폰 번호와 회원이름으로 회원 휴대폰에 인증번호 발송하는 기능
* @param memberName
* @param hpno
* @return
* @throws Exception
*/
public boolean certifNum(String memberName, String hpno) throws Exception{ public boolean certifNum(String memberName, String hpno) throws Exception{
// String name = EncryptUtils.encrypt(memberName); // String name = EncryptUtils.encrypt(memberName);
String phone = EncryptUtils.encrypt(hpno); String phone = EncryptUtils.encrypt(hpno);
boolean certifNum = cstmrQuery.certifNum(memberName , phone); boolean certifNum = cstmrQuery.certifNum(memberName , phone);
if(certifNum) {
registerSend(hpno); if(certifNum) { // 회원정보가 있어 true면 인증문자 발송
registerSend(hpno); // hpno번호에 있는 번호로 문자발송
} }
return certifNum; return certifNum;
} }
/**
* 휴대폰 번호와 회원 명으로 회원 ID 찾는 기능
* @param memberName
* @param hpno
* @return
* @throws Exception
*/
public String findUserId(String memberName, String hpno) throws Exception{ public String findUserId(String memberName, String hpno) throws Exception{
// String name = EncryptUtils.encrypt(memberName); // String name = EncryptUtils.encrypt(memberName);
String phone = EncryptUtils.encrypt(hpno); String phone = EncryptUtils.encrypt(hpno); // 번호 암호화
String resultFindId = cstmrQuery.findUserId(memberName,phone); String resultFindId = cstmrQuery.findUserId(memberName,phone); // 휴대폰번호[hpno]와 회원명[memberName]으로 ID찾기
return resultFindId; return resultFindId;
} }
/**
* 회원 ID와 휴대폰번호로 인증메세지 보내는 기능
* @param userId
* @param hpno
* @return
* @throws Exception
*/
public boolean certifPw(String userId, String hpno) 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); PtyCstmrBas certifNum = cstmrQuery.findUserPw(userId , phone);
boolean result = false; boolean result = false;
if(certifNum != null) {
//certifNum이 값이 있을경우 메세지 전송, 값이 있다는것은 데이터베이스에 ID와 휴대폰번호[hpno]가 일치한다는 것
if(certifNum != null) {
registerSend(hpno); registerSend(hpno);
result = true; result = true;
} }
return result; return result;
} }
/**
* 사용자가 입력한 새로운 암호로 변경[수정]하는 기능
* @param userId
* @param hpno
* @param newPw
* @return
* @throws Exception
*/
public boolean updatePw(String userId, String hpno, String newPw) throws Exception{ public boolean updatePw(String userId, String hpno, String newPw) throws Exception{
String phone = EncryptUtils.encrypt(hpno); String phone = EncryptUtils.encrypt(hpno); // 휴대폰번호 암호화
PtyCstmrBas certifNum = cstmrQuery.findUserPw(userId , phone); PtyCstmrBas certifNum = cstmrQuery.findUserPw(userId , phone); // 회원 아이디와 휴대폰번호로 데이터베이스에서 조회
boolean result = false; boolean result = false;
if(certifNum != null) { if(certifNum != null) { //certifNum이 값이 있을경우 메세지 전송, 값이 있다는것은 데이터베이스에 ID와 휴대폰번호[hpno]가 일치한다는 것
String encryptPw = EncryptUtils.sha256Encrypt(newPw); String encryptPw = EncryptUtils.sha256Encrypt(newPw);
certifNum.setUserPswd(encryptPw); certifNum.setUserPswd(encryptPw);
certifNum.setPswdUpdtDt(Instant.now()); certifNum.setPswdUpdtDt(Instant.now());
ptyCstmrBasRepository.save(certifNum); ptyCstmrBasRepository.save(certifNum); // 바뀐 암호로 변경[수정] 하는 코드
result = true; result = true;
} }
return result; 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; 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.acnt.cstmr.service.AcntCstmrService;
import com.palnet.biz.api.comn.response.BasicResponse; import com.palnet.biz.api.comn.response.BasicResponse;
import com.palnet.biz.api.comn.response.ErrorResponse; 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.PtyCstmrBas;
import com.palnet.biz.jpa.entity.PtyCstmrDtl; import com.palnet.biz.jpa.entity.PtyCstmrDtl;
import com.palnet.comn.exception.CustomException; 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 io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j2; import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.time.ZoneId;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Log4j2 @Slf4j
@RestController @RestController
@RequiredArgsConstructor @RequiredArgsConstructor
@RequestMapping(value = "/api/acnt/cstmr", produces = {MediaType.APPLICATION_JSON_VALUE}) @RequestMapping(value = "/api/acnt/cstmr", produces = {MediaType.APPLICATION_JSON_VALUE})
@ -32,9 +45,13 @@ public class AcntCstmrController {
private final AcntCstmrService service; private final AcntCstmrService service;
/**
* 회원가입 기능, AcntCstmrRqModel에 사용자가 입력한 회원 정보가 들어있음
* @param rq
* @return
*/
@PostMapping(value = "/register") @PostMapping(value = "/register")
@ApiOperation(value = "회원 가입") @Operation(summary = "회원가입", description = "회원가입 API 입니다.")
@Tag(name = "회원관리", description = "회원 관련 API")
public ResponseEntity<? extends BasicResponse> register(@RequestBody AcntCstmrRqModel rq) { public ResponseEntity<? extends BasicResponse> register(@RequestBody AcntCstmrRqModel rq) {
AcntCstmrRsModel result; AcntCstmrRsModel result;
@ -44,11 +61,18 @@ public class AcntCstmrController {
// result = service.list(rq); // result = service.list(rq);
log.debug(">>> bd : {}", rq.getBrthdyDate()); log.debug(">>> bd : {}", rq.getBrthdyDate());
log.debug(">>> bd : {}", rq.getBrthdyDate().atZone(ZoneId.of("Asia/Seoul")).toLocalDateTime()); log.debug(">>> bd : {}", rq.getBrthdyDate().atZone(ZoneId.of("Asia/Seoul")).toLocalDateTime());
log.debug(">>> td : {}", rq.getTestDt()); // log.debug(">>> td : {}", rq.getTestDt());
log.debug(">>> td : {}", rq.getTestDt().atZone(ZoneId.of("Asia/Seoul")).toLocalDateTime()); // log.debug(">>> td : {}", rq.getTestDt().atZone(ZoneId.of("Asia/Seoul")).toLocalDateTime());
result = service.register(rq); result = service.register(rq); // 회원정보를 데이터베이스에 추가[INSERT]함.
} catch (Exception e) { } catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : {}", e); log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1")); .body(new ErrorResponse("Server Error", "-1"));
@ -57,18 +81,29 @@ public class AcntCstmrController {
return ResponseEntity.ok().body(new SuccessResponse<AcntCstmrRsModel>(result)); return ResponseEntity.ok().body(new SuccessResponse<AcntCstmrRsModel>(result));
} }
/**
* 회원 조회하는 기능, cstmrSno는 회원 고유번호 입니다.
* 고유번호로 회원의 정보를 조회합니다.
* @param cstmrSno
* @return
*/
@GetMapping(value = "/profile/{cstmrSno}") @GetMapping(value = "/profile/{cstmrSno}")
@ApiOperation(value = "회원 정보") @Operation(summary = "회원 정보 조회", description = "회원 고유 넘버로 회원 정보를 조회합니다. cstmrSno 예시 : 1, 2, 3 ....")
@Tag(name = "회원관리", description = "회원 관련 API") public ResponseEntity<? extends BasicResponse> mypage(@Parameter(name="cstmrSno", description = "회원번호", in = ParameterIn.PATH, example = "3") @PathVariable Integer cstmrSno){
@ApiImplicitParam(name = "cstmrSno",value = "고객일련번호", dataTypeClass = Integer.class)
public ResponseEntity<? extends BasicResponse> mypage(@PathVariable Integer cstmrSno){
List<AnctCstmerRlModel> result = null; List<AnctCstmerRlModel> result = null;
try { try {
result = service.list(cstmrSno); result = service.list(cstmrSno); // 회원고유번호[cstmrSno]로 회원정보를 조회 함.
} catch (Exception e) { } catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1")); .body(new ErrorResponse("Server Error", "-1"));
@ -78,22 +113,42 @@ public class AcntCstmrController {
return ResponseEntity.ok().body(new SuccessResponse<List>(result)); return ResponseEntity.ok().body(new SuccessResponse<List>(result));
} }
/**
* 회원 계정 암호 변경하는 기능,
* AcntCstmrPwModel애 회원이 입력한 기존암호, 변경할 암호값이 있습니다.
* @param rq
* @return
*/
@PostMapping(value = "/profile/pswdupdate") @PostMapping(value = "/profile/pswdupdate")
@ApiOperation(value = "회원 패스워드 변경") @Operation(summary = "회원 패스워드 변경", description = "회원의 비밀번호를 변경합니다.")
@Tag(name = "회원관리", description = "회원 관련 API")
public ResponseEntity<? extends BasicResponse> passwordupdate(@RequestBody AcntCstmrPwModel rq){ public ResponseEntity<? extends BasicResponse> passwordupdate(@RequestBody AcntCstmrPwModel rq){
Map<String, Object> resultMap = new HashMap<String, Object>(); Map<String, Object> resultMap = new HashMap<String, Object>();
try { try {
PtyCstmrBas result = service.updatepas(rq); PtyCstmrBas result = service.updatepas(rq); // 입력받은 값으로 회원계정 암호변경.
resultMap.put("result", result); resultMap.put("result", result);
} catch (CustomException e) { } catch (CustomException e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* CustomException은 개발자가 "의도적으로" 예외처리,
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNOE : {}", e); log.error("IGNOE : {}", e);
resultMap.put("result", false); resultMap.put("result", false);
resultMap.put("errorCode", e.getErrorCode()); resultMap.put("errorCode", e.getErrorCode());
resultMap.put("errorMessage", e.getMessage()); resultMap.put("errorMessage", e.getMessage());
return ResponseEntity.ok().body(new SuccessResponse<Map>(resultMap)); return ResponseEntity.ok().body(new SuccessResponse<Map>(resultMap));
} catch (Exception e) { } catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGONE : {}", e); log.error("IGONE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(new ErrorResponse("Server Error", "-1")); 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)); return ResponseEntity.ok().body(new SuccessResponse<>(resultMap));
} }
/**
* 회원 기존 패스워드 확인,
* userPswd 값에 있는 회원 암호가 맞는지 확인합니다.
* @param userPswdMap
* @return
*/
@PostMapping(value = "/profile/pwcheck") @PostMapping(value = "/profile/pwcheck")
@ApiOperation(value = "회원 기존 패스워드 확인") @Operation(summary = "기존 회원의 패스워드 확인", description = " jwt토큰에 등록된 유저정보와 패스워드가 일치하는지 확인합니다. 입력 예시 -> userPswd : test1234 ")
@Tag(name = "회원관리", description = "회원 관련 API") public ResponseEntity<? extends BasicResponse> extendpsw(@Parameter(name="userPswd", description = "유저 비밀번호", in = ParameterIn.QUERY, example = "test1234") String userPswd){
public ResponseEntity<? extends BasicResponse> extendpsw(@RequestBody Map<String,String> userPswdMap){
Map<String, Object> resultMap = new HashMap<String, Object>(); Map<String, Object> resultMap = new HashMap<String, Object>();
try { try {
boolean result = service.extendpsw(userPswdMap.get("userPswd")); boolean result = service.extendpsw(userPswd); // 기존 암호가 맞는지 확인하는 기능.
resultMap.put("result", result); resultMap.put("result", result);
} catch (CustomException e) { } catch (CustomException e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* CustomException은 개발자가 "의도적으로" 예외처리,
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNOE : {}", e); log.error("IGNOE : {}", e);
resultMap.put("result", false); resultMap.put("result", false);
resultMap.put("errorCode", e.getErrorCode()); resultMap.put("errorCode", e.getErrorCode());
resultMap.put("errorMessage", e.getMessage()); resultMap.put("errorMessage", e.getMessage());
return ResponseEntity.ok().body(new SuccessResponse<Map>(resultMap)); return ResponseEntity.ok().body(new SuccessResponse<Map>(resultMap));
} catch (Exception e) { } catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGONE : {}", e); log.error("IGONE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(new ErrorResponse("Server Error", "-1")); 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)); return ResponseEntity.ok().body(new SuccessResponse<>(resultMap));
} }
/**
* 회원정보 수정하는 기능,
* AcntCstmrEmModel에 회원이 입력한 수정할 정보들로 수정합니다.
* @param rq
* @return
*/
@PutMapping(value = "/profile/update") @PutMapping(value = "/profile/update")
@ApiOperation(value = "회원 정보 변경 (이메일,핸드폰)") @Operation(summary = "회원정보 수정", description = "토큰을 발급한 ID의 회원정보(이메일, 휴대폰번호)를 업데이트 하는 API 입니다.")
@Tag(name = "회원관리", description = "회원 관련 API")
public ResponseEntity<? extends BasicResponse> updateEmail(@RequestBody AcntCstmrEmModel rq){ public ResponseEntity<? extends BasicResponse> updateEmail(@RequestBody AcntCstmrEmModel rq){
Map<String, Object> resultMap = new HashMap<String, Object>(); Map<String, Object> resultMap = new HashMap<String, Object>();
try { try {
PtyCstmrDtl result = service.updateEmail(rq); PtyCstmrDtl result = service.updateEmail(rq); // 이메일과 휴대폰번호를 업데이트 하는 기능
resultMap.put("result", result); resultMap.put("result", result);
} catch (CustomException e) { } catch (CustomException e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* CustomException은 개발자가 "의도적으로" 예외처리,
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNOE : {}", e); log.error("IGNOE : {}", e);
resultMap.put("result", false); resultMap.put("result", false);
resultMap.put("errorCode", e.getErrorCode()); resultMap.put("errorCode", e.getErrorCode());
@ -142,6 +230,13 @@ public class AcntCstmrController {
return ResponseEntity.ok().body(new SuccessResponse<Map>(resultMap)); return ResponseEntity.ok().body(new SuccessResponse<Map>(resultMap));
} catch (Exception e) { } catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGONE : {}", e); log.error("IGONE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(new ErrorResponse("Server Error", "-1")); 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)); return ResponseEntity.ok().body(new SuccessResponse<>(resultMap));
} }
/**
* 회원 탈퇴 처리하는 기능,
* 회원고유[cstmrSno] 값으로 회원탈퇴처리함.
* @param cstmrSno
* @return
*/
@PostMapping(value = "/profile/delete/{cstmrSno}") @PostMapping(value = "/profile/delete/{cstmrSno}")
@ApiOperation(value = "회원 탈퇴") @Operation(summary = "회원 탈퇴", description = "cstmrSno를 받아 회원탈퇴 처리하는 API 입니다.")
@Tag(name = "회원관리", description = "회원 관련 API") public ResponseEntity<? extends BasicResponse> userDelete(@Parameter(name="cstmrSno", description = "회원 일련번호", in = ParameterIn.PATH, example = "27")@PathVariable Integer cstmrSno){
@ApiImplicitParam(name = "cstmrSno",value = "고객일련번호", dataTypeClass = Integer.class)
public ResponseEntity<? extends BasicResponse> userDelete(@PathVariable Integer cstmrSno){
Map<String, Object> resultMap = new HashMap<String, Object>(); Map<String, Object> resultMap = new HashMap<String, Object>();
try { try {
boolean result = service.userDelete(cstmrSno); boolean result = service.userDelete(cstmrSno); // 회원고유[cstmrSno] 값으로 회원탈퇴처리함.
resultMap.put("result", result); resultMap.put("result", result);
} catch (CustomException e) { } catch (CustomException e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* CustomException은 개발자가 "의도적으로" 예외처리,
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNOE : {}", e); log.error("IGNOE : {}", e);
resultMap.put("result", false); resultMap.put("result", false);
resultMap.put("errorCode", e.getErrorCode()); 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; package com.palnet.biz.api.acnt.cstmr.model;
import lombok.Data;
import java.time.Instant; import java.time.Instant;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data @Data
public class AcntCstmrEmModel { public class AcntCstmrEmModel {
@Schema(description = "유저 이메일" , example = "updateEmail@test.co.kr")
private String email; private String email;
@Schema(description = "업데이트 일자", example = "2023-12-12", implementation = String.class)
private Instant updateDt; private Instant updateDt;
@Schema(hidden = true)
private String updateUserId; private String updateUserId;
@Schema(hidden = true)
private int cstmrSno; private int cstmrSno;
@Schema(description = "업데이트할 핸드폰 번호", example = "01023457777")
private String hpno; 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; package com.palnet.biz.api.acnt.cstmr.model;
import lombok.Data;
import java.time.Instant; import java.time.Instant;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data @Data
public class AcntCstmrPwModel { public class AcntCstmrPwModel {
@Schema(hidden = true)
private Instant pswdupdtDt; private Instant pswdupdtDt;
@Schema(description = "유저의 기존 비밀번호", example = "test1234")
private String userPswd; private String userPswd;
@Schema(description = "유저의 새로운 비밀번호", example = "test12345")
private String newPswd; private String newPswd;
@Schema(description = "유저의 새로운 비밀번호(확인)", example = "test12345")
private String newPswdConfirm; private String newPswdConfirm;
} }

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

152
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 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.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; 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.AcntCstmrRqModel;
import com.palnet.biz.api.acnt.cstmr.model.AcntCstmrRsModel; 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.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.biz.jpa.repository.pty.PtyTermsAgreeTxnRepository;
import com.palnet.comn.code.ErrorCode; import com.palnet.comn.code.ErrorCode;
import com.palnet.comn.exception.CustomException; import com.palnet.comn.exception.CustomException;
import com.palnet.comn.utils.DateUtils;
import com.palnet.comn.utils.EncryptUtils; import com.palnet.comn.utils.EncryptUtils;
import com.palnet.comn.utils.HttpUtils; import com.palnet.comn.utils.HttpUtils;
@ -74,7 +72,7 @@ public class AcntCstmrService {
/** /**
* *
* * AcntCstmrRqModel에 담겨있는 회원정보를 데이터베이스에 추가하는 기능
* @param rq * @param rq
* @return * @return
*/ */
@ -89,7 +87,7 @@ public class AcntCstmrService {
//사전 체크. 동일한 ID 존재 여부 확인 //사전 체크. 동일한 ID 존재 여부 확인
isUserIdFind = query.findCstmrByUserId(rq.getUserId()); isUserIdFind = query.findCstmrByUserId(rq.getUserId());
if(isUserIdFind) { if(isUserIdFind) { // 중복되면 에러코드 반환
rs.setErrCode(-1); rs.setErrCode(-1);
return rs; return rs;
} }
@ -119,21 +117,27 @@ public class AcntCstmrService {
} }
} }
//성공 파람 담기 //성공 데이터 담기
if(basEntity != null) { if(basEntity != null) {
rs.setErrCode(1); rs.setErrCode(1);
rs.setLoginId(basEntity.getUserId()); rs.setLoginId(basEntity.getUserId());
} }
}catch(Exception e) { }catch(Exception e) {
log.error("IGNORE : {}", e); log.error("IGNORE : {}", e);
rs.setErrCode(-2); rs.setErrCode(-2);
return rs; return rs;
} }
return rs; return rs;
} }
/**
* AcntCstmrRqModel에 담겨있는 회원정보를 데이터베이스에 추가[INSERT]하는 기능.
* @param rq
* @return
* @throws Exception
*/
public PtyCstmrBas savePtyCstmrBas(AcntCstmrRqModel rq) 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{ public PtyCstmrDtl savePtyCstmrDtl(AcntCstmrRqModel rq , PtyCstmrBas basEntity) throws Exception{
if(rq.getCntryCd() == null || rq.getCntryCd().equals("")){
rq.setCntryCd("KOR");
}
PtyCstmrDtl dtlEntity = new PtyCstmrDtl(); PtyCstmrDtl dtlEntity = new PtyCstmrDtl();
dtlEntity.setCstmrSno(basEntity.getCstmrSno()); dtlEntity.setCstmrSno(basEntity.getCstmrSno());
dtlEntity.setIpinCi(rq.getIpinCi()); dtlEntity.setIpinCi(rq.getIpinCi());
@ -189,20 +205,30 @@ public class AcntCstmrService {
return ptyTermsAgreeTxnRepository.save(agreeEntity); return ptyTermsAgreeTxnRepository.save(agreeEntity);
} }
/**
* 회원 고유번호[cstmrSno] 회원정보를 조회하는 기능.
* @param cstmrSno
* @return
*/
public List<AnctCstmerRlModel> list(int cstmrSno) { public List<AnctCstmerRlModel> list(int cstmrSno) {
List<AnctCstmerRlModel> resultList = query.list(cstmrSno); List<AnctCstmerRlModel> resultList = query.list(cstmrSno); // 회원고유번호[cstmrSno]로 회원정보를 조회 함.
for(AnctCstmerRlModel model : resultList) { for(AnctCstmerRlModel model : resultList) {
model.setEmail(EncryptUtils.decrypt(model.getEmail())); model.setEmail(EncryptUtils.decrypt(model.getEmail())); // 이메일은 회원추가할 때 암호화하기에 다시 복호화를 함
model.setHpno(EncryptUtils.decrypt(model.getHpno())); model.setHpno(EncryptUtils.decrypt(model.getHpno())); // 휴대폰 번호는 회원추가할 때 암호화하기에 다시 복호화를 함
} }
return resultList; return resultList;
} }
/**
* 회원에게 입력받은 암호로 변경하는 기능
* @param rq
* @return
*/
public PtyCstmrBas updatepas(AcntCstmrPwModel rq) { public PtyCstmrBas updatepas(AcntCstmrPwModel rq) {
// 1. 토큰 유저 정보 불러오기 // 1. 토큰 유저 정보 불러오기
Integer userId = jwtTokenUtil.getCstmrSnoByToken(); Integer userId = jwtTokenUtil.getCstmrSnoByToken();
@ -228,6 +254,11 @@ public class AcntCstmrService {
return updateUserEntity; return updateUserEntity;
} }
/**
* 기존 암호가 맞는지 확인하는 기능.
* @param userPswd
* @return
*/
public boolean extendpsw(String userPswd){ public boolean extendpsw(String userPswd){
boolean result = false; boolean result = false;
// 1. 토큰 유저 정보 불러오기 // 1. 토큰 유저 정보 불러오기
@ -258,57 +289,88 @@ public class AcntCstmrService {
return result; return result;
} }
/**
* 이메일과 휴대폰번호를 업데이트 하는 기능.
* @param rq
* @return
*/
public PtyCstmrDtl updateEmail(AcntCstmrEmModel rq) { public PtyCstmrDtl updateEmail(AcntCstmrEmModel rq) {
Integer cstmrSno = jwtTokenUtil.getCstmrSnoByToken(); Integer cstmrSno = jwtTokenUtil.getCstmrSnoByToken(); // 회원 인가할 정보에 있는 회원 고유번호
String userId = jwtTokenUtil.getUserIdByToken(); String userId = jwtTokenUtil.getUserIdByToken(); // 회원 인가할 정보에 있는 회원 아이디
String newEmail = EncryptUtils.encrypt(rq.getEmail()); String newEmail = EncryptUtils.encrypt(rq.getEmail()); // 바뀔 이메일 암호화
String newHpno = EncryptUtils.encrypt(rq.getHpno()); String newHpno = EncryptUtils.encrypt(rq.getHpno()); // 바뀔 휴대폰번호 암호화
// 회원 고유번호로 회원정보를 데이터베이스에서 가져옴
PtyCstmrDtl userEntity = ptyCstmrDtlRepository.findById(cstmrSno).orElse(null); PtyCstmrDtl userEntity = ptyCstmrDtlRepository.findById(cstmrSno).orElse(null);
// 바뀔 내용 넣어줌
userEntity.setEmail(newEmail); userEntity.setEmail(newEmail);
userEntity.setUpdateDt(Instant.now() ); userEntity.setUpdateDt(Instant.now() );
userEntity.setUpdateUserId(userId); userEntity.setUpdateUserId(userId);
userEntity.setHpno(newHpno); userEntity.setHpno(newHpno);
// 바뀔 내용을 데이터베이스에 수정함
PtyCstmrDtl updateEmailEntity = ptyCstmrDtlRepository.save(userEntity); PtyCstmrDtl updateEmailEntity = ptyCstmrDtlRepository.save(userEntity);
return updateEmailEntity; return updateEmailEntity;
} }
/**
* 회원고유[cstmrSno] 값으로 회원탈퇴처리 하는 기능.
* @param cstmrSno
* @return
*/
public boolean userDelete(int cstmrSno) { public boolean userDelete(int cstmrSno) {
List<JwtGroupModel> groupInfo = jwtTokenUtil.getGroupAuthByToken(); List<JwtGroupModel> groupInfo = jwtTokenUtil.getGroupAuthByToken(); // 회원의 속한 그룹을 조회
for(JwtGroupModel group : groupInfo) {
// if(group.getGroupAuthCd().equals("CREATER")) { if(groupInfo != null) {
if(group.getGroupAuthCd().equals("MASTER")) { for(JwtGroupModel group : groupInfo) {
PtyGroupBas groupEntity = ptyGroupBasRepository.findByGroupId(group.getGroupId()); // if(group.getGroupAuthCd().equals("CREATER")) {
if(!(groupEntity == null)) {
groupEntity.setUseYn("N"); // 회원의 그룹 권한이 MASTER 일 경우
ptyGroupBasRepository.save(groupEntity); if(group.getGroupAuthCd().equals("MASTER")) {
} PtyGroupBas groupEntity = ptyGroupBasRepository.findByGroupId(group.getGroupId());
List<PtyCstmrGroup> cstmrEntity = ptyCstmrGroupRepository.changeGroupJoinYn(group.getGroupId());
if(!(cstmrEntity == null)) { // 그룹이 있을경우 그룹의 사용여부 "N" 값으로 저장
for(PtyCstmrGroup cstmr : cstmrEntity) { if(!(groupEntity == null)) {
cstmr.setJoinYn("N"); groupEntity.setUseYn("N");
ptyCstmrGroupRepository.save(cstmr); ptyGroupBasRepository.save(groupEntity);
}
List<PtyCstmrGroup> cstmrEntity = ptyCstmrGroupRepository.changeGroupJoinYn(group.getGroupId());
// cstmrEntity 값이 있을 경우 참여여부 "N" 값으로 저장
if(!(cstmrEntity == null)) {
for(PtyCstmrGroup cstmr : cstmrEntity) {
cstmr.setJoinYn("N");
ptyCstmrGroupRepository.save(cstmr);
}
} }
} }
}
List<PtyCstmrGroup> AprvlEntity = ptyCstmrGroupRepository.changeGroupAprvlYn(cstmrSno); // 회원 고유번호로 데이터베이스에서 그룹참여정보 가져옴
if(!(AprvlEntity == null)) { List<PtyCstmrGroup> AprvlEntity = ptyCstmrGroupRepository.changeGroupAprvlYn(cstmrSno);
for(PtyCstmrGroup Aprvl : AprvlEntity) {
Aprvl.setAprvlYn("N"); // AprvlEntity[그룹참여 정보가] 있을경우
Aprvl.setAprvlDt(null); if(!(AprvlEntity == null)) {
ptyCstmrGroupRepository.save(Aprvl); // 그룹 승인여부를 "N"값으로 저장
for(PtyCstmrGroup Aprvl : AprvlEntity) {
Aprvl.setAprvlYn("N");
Aprvl.setAprvlDt(null);
ptyCstmrGroupRepository.save(Aprvl);
}
// 그룹 참여여부를 "N"값으로 저장
PtyCstmrGroup cstmrEntity = ptyCstmrGroupRepository.findGroupId(group.getGroupId(), cstmrSno);
if(!(cstmrEntity == null)) {
cstmrEntity.setJoinYn("N");
ptyCstmrGroupRepository.save(cstmrEntity);
}
} }
PtyCstmrGroup cstmrEntity = ptyCstmrGroupRepository.findGroupId(group.getGroupId(), cstmrSno);
if(!(cstmrEntity == null)) {
cstmrEntity.setJoinYn("N");
ptyCstmrGroupRepository.save(cstmrEntity);
} }
} }
} // 데이터베이스에 있는 회원 정보를 탈퇴처리 후 저장함
PtyCstmrBas userEntity = ptyCstmrBasRepository.findByUserGroupId(cstmrSno); PtyCstmrBas userEntity = ptyCstmrBasRepository.findByUserGroupId(cstmrSno);
userEntity.setCstmrStatusCd("W"); userEntity.setCstmrStatusCd("W");
userEntity.setCstmrStatusCngDt(Instant.now() ); userEntity.setCstmrStatusCngDt(Instant.now() );

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

33
pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/service/JwtService.java

@ -39,8 +39,7 @@ public class JwtService {
private final JwtTokenUtil jwtTokenUtil; private final JwtTokenUtil jwtTokenUtil;
/** /**
* 로그인 처리 * 로그인 처리하는 기능.
*
* @param rq * @param rq
* @return * @return
*/ */
@ -78,8 +77,8 @@ public class JwtService {
} }
} }
//loginError 값이 - 인경우 에러 메세지와 함꼐 반환
if (loginError < 0) { if (loginError < 0) {
String errorMessage = ""; String errorMessage = "";
if (loginError == -100) { if (loginError == -100) {
@ -103,11 +102,13 @@ public class JwtService {
return resultMap; return resultMap;
} else { } else { //loginError 값이 + 값이라면 로긍니 성공
String accessToken = jwtTokenUtil.generateToken(userDetails); // 인증이후 인가할 정보 만듬.
String accessToken = jwtTokenUtil.generateToken(userDetails);
String refreshToken = jwtTokenUtil.generateRefreshToken(userDetails); String refreshToken = jwtTokenUtil.generateRefreshToken(userDetails);
// 반환할 객체 설정.
JwtRsModel result = new JwtRsModel(); JwtRsModel result = new JwtRsModel();
result.setAccessToken(accessToken); result.setAccessToken(accessToken);
result.setRefreshToken(refreshToken); result.setRefreshToken(refreshToken);
@ -139,9 +140,18 @@ public class JwtService {
} }
/**
* 로그아웃 하는 기능.
* @param cstmrSno
* @return
* @throws Exception
*/
public PtyCstmrBas logoutProcess(int cstmrSno) throws Exception { public PtyCstmrBas logoutProcess(int cstmrSno) throws Exception {
// 회원의 정보를 받아옴
Optional<PtyCstmrBas> optional = ptyCstmrBasRepository.findById(cstmrSno); Optional<PtyCstmrBas> optional = ptyCstmrBasRepository.findById(cstmrSno);
// 회원의 인가정보를 만료시킴
if (optional.isPresent()) { if (optional.isPresent()) {
PtyCstmrBas entity = optional.get(); PtyCstmrBas entity = optional.get();
entity.setRfrshToken(""); entity.setRfrshToken("");
@ -175,7 +185,7 @@ public class JwtService {
} }
/** /**
* refresh Token 저장 처리 * refresh Token 저장 처리 기능
* *
* @param cstmrSno * @param cstmrSno
* @param refreshToken * @param refreshToken
@ -197,8 +207,7 @@ public class JwtService {
} }
/** /**
* 프로필 조회 * 회원의 프로필을 조회하는 기능.
*
* @param cstmrSno * @param cstmrSno
* @return * @return
* @throws Exception * @throws Exception
@ -211,8 +220,7 @@ public class JwtService {
} }
/** /**
* token 만료시 refresh 토큰으로 재검색 * token 만료시 refresh 토큰으로 재검색 하는 기능.
*
* @param cstmrSno * @param cstmrSno
* @param refreshToken * @param refreshToken
* @return * @return
@ -231,7 +239,8 @@ public class JwtService {
Claims claims = jwtTokenUtil.getAllClaimsFromToken(refreshToken); Claims claims = jwtTokenUtil.getAllClaimsFromToken(refreshToken);
Integer cstmrSnoByRefreshToken = claims.get("cstmrSno", Integer.class); Integer cstmrSnoByRefreshToken = claims.get("cstmrSno", Integer.class);
if(cstmrSnoByRefreshToken != cstmrSno) return null; if(cstmrSnoByRefreshToken != cstmrSno) return null;
// 인가 토큰 발행할수 있게 필요한 회원 정보들을 데이터베이스에서 조회함.
JwtUserModel userDetails = query.findByIdForrefreshToken(cstmrSno); JwtUserModel userDetails = query.findByIdForrefreshToken(cstmrSno);
String createAccessToken = jwtTokenUtil.generateToken(userDetails); 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.Claims;
import io.jsonwebtoken.Jwts; import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm; import io.jsonwebtoken.SignatureAlgorithm;
import lombok.extern.log4j.Log4j2; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@ -17,8 +17,8 @@ import java.io.Serializable;
import java.util.*; import java.util.*;
import java.util.function.Function; import java.util.function.Function;
@Slf4j
@Component @Component
@Log4j2
public class JwtTokenUtil implements Serializable { public class JwtTokenUtil implements Serializable {
private static final long serialVersionUID = -2550185165626007488L; private static final long serialVersionUID = -2550185165626007488L;
@ -146,6 +146,10 @@ public class JwtTokenUtil implements Serializable {
return cstmrSno; return cstmrSno;
} }
/**
* 회원 인가정보로 그룹
* @return
*/
public List<JwtGroupModel> getGroupAuthByToken() { public List<JwtGroupModel> getGroupAuthByToken() {
HttpServletRequest rq = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); HttpServletRequest rq = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
String token = rq.getHeader("Authorization"); 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.BasicResponse;
import com.palnet.biz.api.comn.response.ErrorResponse; import com.palnet.biz.api.comn.response.ErrorResponse;
import com.palnet.biz.api.comn.response.SuccessResponse; 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 io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j2; import lombok.extern.log4j.Log4j2;
@ -28,16 +28,21 @@ public class AcntTermsController {
private final AcntTermsService service; private final AcntTermsService service;
/**
* 약관정보 들을 가져오는 기능,
* AcntTermsRqModel에 입력받은 약관타입에 따른 약관항목을 반환함.
* @param rq
* @return
*/
@Operation(summary = "약관 조회", description = "약관 정보를 조회하는 API 입니다.")
@GetMapping(value = "/list") @GetMapping(value = "/list")
@Tag(name = "약관 기본", description = "약관 관련 API")
@ApiOperation(value = "약관 기본 정보")
public ResponseEntity<? extends BasicResponse> list(AcntTermsRqModel rq) { public ResponseEntity<? extends BasicResponse> list(AcntTermsRqModel rq) {
List<AcntTermsRsModel> result = null; List<AcntTermsRsModel> result = null;
log.debug("RQ>>>>>>>>" , rq.toString()); log.debug("RQ>>>>>>>>" , rq.toString());
try { try {
result = service.list(rq); result = service.list(rq); // 입력받은 값에 따른 약관항목을 반환하는 기능.
} catch (Exception e) { } 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; package com.palnet.biz.api.acnt.terms.model;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Builder; import lombok.Builder;
import lombok.Data; import lombok.Data;
@ -10,7 +11,13 @@ import lombok.NoArgsConstructor;
@NoArgsConstructor @NoArgsConstructor
@AllArgsConstructor @AllArgsConstructor
public class AcntTermsRqModel { public class AcntTermsRqModel {
@Schema(description = "사이트 코드" , example = "SANDBOX")
private String siteCd; private String siteCd;
@Schema(description = "약관 카테고리 코드" , example = "SITE_JOIN")
private String termsCtgryCd; private String termsCtgryCd;
@Schema(description = "언어 코드" , example = "KOR")
private String langDivCd; 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; private final PtyTermsQueryRepository query;
/**
* 입력받은 값에 따른 약관항목을 반환하는 기능.
* @param rq
* @return
*/
public List<AcntTermsRsModel> list(AcntTermsRqModel rq) { public List<AcntTermsRsModel> list(AcntTermsRqModel rq) {
return query.list(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.ErrorResponse;
import com.palnet.biz.api.comn.response.SuccessResponse; import com.palnet.biz.api.comn.response.SuccessResponse;
import com.palnet.comn.code.RSErrorCode; 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 io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j2; import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType; import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
@ -24,7 +26,7 @@ import org.springframework.web.bind.annotation.RestController;
import java.util.List; import java.util.List;
@Log4j2 @Slf4j
@RestController @RestController
@RequiredArgsConstructor @RequiredArgsConstructor
@RequestMapping(value = "/api/anls/hstry", produces = {MediaType.APPLICATION_JSON_VALUE}) @RequestMapping(value = "/api/anls/hstry", produces = {MediaType.APPLICATION_JSON_VALUE})
@ -33,23 +35,36 @@ public class AnlsHstryController {
private final AnlsHstryService service; private final AnlsHstryService service;
/**
* 비행현황 목록 리스트 조회하는 기능,
* AnlsHstryGroupModel에 따른 리스트를 조회함.
* @param rq
* @return
*/
@GetMapping(value = "/list") @GetMapping(value = "/list")
@ApiOperation(value = "비행 현황 목록 출력") @Operation(summary = "비행 현황 목록 출력", description = "비행 현황 목록을 출력하는 API 입니다.")
@Tag(name = "비행 이력 현황", description = "비행 이력 현황 관련 API")
public ResponseEntity<? extends BasicResponse> list(AnlsHstryGroupModel rq) { public ResponseEntity<? extends BasicResponse> list(AnlsHstryGroupModel rq) {
List<AnlsHstryModel> rs = null; List<AnlsHstryModel> rs = null;
ComnPagingRs<AnlsHstryModel> response; ComnPagingRs<AnlsHstryModel> response;
//입력값 검증 // 검색 시작일 날짜[stDate], 검색 끝일 날짜 날짜값[endDate], 날짜값이 10자리인지 확인[정해진 포맷팅인지 확인하는 것] 입력값 검증처리
if(rq.getStDate() == null || !(rq.getStDate().length() == 10) || rq.getEndDate() ==null || !(rq.getEndDate().length() == 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)); .body(new ErrorResponse(RSErrorCode.ER_PARAM));
} }
try { try {
response = service.list(rq); response = service.list(rq); // 비행현황 목록 조회하는 기능.
} catch (Exception e) { } catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : {}", e); log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1")); .body(new ErrorResponse("Server Error", "-1"));
@ -59,17 +74,30 @@ public class AnlsHstryController {
} }
/**
* 비행현황의 상세정보를 조회함,
* 비행ID[CNTRL_ID] 조회함
* @param id
* @return
*/
@GetMapping(value = "/detail/{id}") @GetMapping(value = "/detail/{id}")
@ApiOperation(value = "비행 현황 상세") @Operation(summary = "비행 현황 상세 정보 출력", description = "비행 현황 상세 정보를 출력하는 API 입니다.")
@Tag(name = "비행 이력 현황", description = "비행 이력 현황 관련 API") public ResponseEntity<? extends BasicResponse> detail(
@ApiImplicitParam(name = "id",value = "관제ID", dataTypeClass = String.class) @Parameter(name="id", description = "개체 비행 ID", in = ParameterIn.PATH, example = "061fbd9d-25c5-4801-bb11-2307a8eb8d8f") @PathVariable String id) {
public ResponseEntity<? extends BasicResponse> detail(@PathVariable String id) {
AnlsHstryModel result = null; AnlsHstryModel result = null;
try { try {
result = service.detail(id); result = service.detail(id); // 비행ID[CNTRL_ID]로 비행 상세정보를 조회하는 기능.
} catch (Exception e) { } catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : {}", e); log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1")); .body(new ErrorResponse("Server Error", "-1"));
@ -80,16 +108,31 @@ public class AnlsHstryController {
} }
/**
* 비행이력을 조회함,
* 비행ID[CNTRL_ID] 조회함
* @param id
* @return
*/
@GetMapping(value = "/log/{id}") @GetMapping(value = "/log/{id}")
@ApiOperation(value = "비행 이력 데이터") // @ApiOperation(value = "비행 이력 데이터")
@Tag(name = "비행 이력 현황", description = "비행 이력 현황 관련 API") // @Tag(name = "비행 이력 현황", description = "비행 이력 현황 관련 API")
@ApiImplicitParam(name = "id",value = "관제ID", dataTypeClass = String.class) // @ApiImplicitParam(name = "id",value = "관제ID", dataTypeClass = String.class)
public ResponseEntity<? extends BasicResponse> log(@PathVariable String id) { @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; List<AnlsHstryDetailModel> result = null;
try { try {
result = service.hstryList(id); result = service.hstryList(id); // 비행이력을 비행ID[CNTRL_ID] 조회하는 기능.
} catch (Exception e) { } catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : {}", e); log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1")); .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; package com.palnet.biz.api.anls.hstry.model;
import com.palnet.biz.api.comn.model.ComnPagingModel; import com.palnet.biz.api.comn.model.ComnPagingModel;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
@ -8,14 +10,19 @@ import lombok.EqualsAndHashCode;
@EqualsAndHashCode(callSuper=false) @EqualsAndHashCode(callSuper=false)
public class AnlsHstryGroupModel extends ComnPagingModel { public class AnlsHstryGroupModel extends ComnPagingModel {
@Schema(description = "검색 시작날짜" , example = "2023-11-01", implementation = String.class)
private String stDate; private String stDate;
@Schema(description = "검색 종료날짜" , example = "2023-11-30", implementation = String.class)
private String endDate; private String endDate;
@Schema(hidden = true)
private String search1; private String search1;
@Schema(hidden = true)
private String searchType1; private String searchType1;
@Schema(description = "그룹 아이디", example = "C807F9")
private String groupId; 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 com.palnet.biz.api.comn.model.ComnRqModel;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
@Data @Data
@EqualsAndHashCode(callSuper=false) @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; private String cntrlId;
} }

92
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 java.util.Optional;
import com.palnet.biz.api.comn.model.ComnPagingRs; import com.palnet.biz.api.comn.model.ComnPagingRs;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils; 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.code.ErrorCode;
import com.palnet.comn.exception.CustomException; import com.palnet.comn.exception.CustomException;
@Slf4j
@RequiredArgsConstructor
@Service @Service
public class AnlsHstryService { 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){ public ComnPagingRs<AnlsHstryModel> list(AnlsHstryGroupModel rq){
// 조회에 필요한 기본값 선언
Integer cstmrSno = jwtTokenUtil.getCstmrSnoByToken(); Integer cstmrSno = jwtTokenUtil.getCstmrSnoByToken();
List<JwtGroupModel> groupAuthList = jwtTokenUtil.getGroupAuthByToken(); List<JwtGroupModel> groupAuthList = jwtTokenUtil.getGroupAuthByToken();
List<JwtGroupModel> adminAuth = new ArrayList<>(); List<JwtGroupModel> adminAuth = new ArrayList<>();
String groupAuth = null; String groupAuth = null;
String appAuth = jwtTokenUtil.getUserAuthByToken(); String appAuth = jwtTokenUtil.getUserAuthByToken();
// 페이징 처리를 위한 객체 선언
PageImpl<AnlsHstryModel>resultList; PageImpl<AnlsHstryModel>resultList;
ComnPagingRs<AnlsHstryModel> response = new ComnPagingRs<>(); ComnPagingRs<AnlsHstryModel> response = new ComnPagingRs<>();
Pageable pageable = PageRequest.of(rq.getPage()-1, rq.getRecord()); Pageable pageable = PageRequest.of(rq.getPage()-1, rq.getRecord());
// 유저의 권한은 확인함
if("USER".equals(appAuth) || "ROLE_USER".equals(appAuth)) { if("USER".equals(appAuth) || "ROLE_USER".equals(appAuth)) {
for(JwtGroupModel list : groupAuthList) { for(JwtGroupModel list : groupAuthList) {
if(list.getGroupId().equals(rq.getGroupId())) { if(list.getGroupId().equals(rq.getGroupId())) {
@ -86,23 +80,30 @@ public class AnlsHstryService {
} }
} }
} }
// 그룹에서의 권한이 NORMAL인 경우
if("NORMAL".equals(groupAuth)) { if("NORMAL".equals(groupAuth)) {
for (JwtGroupModel list : groupAuthList) { for (JwtGroupModel list : groupAuthList) {
if("MASTER".equals(list.getGroupAuthCd()) || "LEADER".equals(list.getGroupAuthCd())) { if("MASTER".equals(list.getGroupAuthCd()) || "LEADER".equals(list.getGroupAuthCd())) {
adminAuth.add(list); adminAuth.add(list);
} }
} }
List<ComIdntfBas> idntfList = comIdntBasRepository.findIdntfNumber(cstmrSno);
List<FltPlanBas> basResult = fltPlanBasRepository.findByPlanSno(cstmrSno); List<ComIdntfBas> idntfList = comIdntBasRepository.findIdntfNumber(cstmrSno); // 회원 고유번호와 맞는 기체 고유번호 조회
List<FltPlanPilot> pilotList = fltPlanPilotRepository.findByPlanSno(cstmrSno); List<FltPlanBas> basResult = fltPlanBasRepository.findByPlanSno(cstmrSno); // 회원 고유번호와 맞는 비행계획서 조회
List<FltPlanPilot> pilotList = fltPlanPilotRepository.findByPlanSno(cstmrSno); // 회원 고유번호와 맞는 조종사 조회
List<FltPlanBas> pilotResult = new ArrayList<>(); List<FltPlanBas> pilotResult = new ArrayList<>();
for(FltPlanPilot list : pilotList) { for(FltPlanPilot list : pilotList) {
pilotResult = fltPlanBasRepository.findBasList(list.getPlanSno()); pilotResult = fltPlanBasRepository.findBasList(list.getPlanSno()); // 조종사번호와 맞는 비행계획서 조회
} }
// 위 조건들에 부합하는 데이터를 조회함
resultList = query.cntrlBasNormalHstryList(rq, pageable, idntfList, basResult, pilotResult); resultList = query.cntrlBasNormalHstryList(rq, pageable, idntfList, basResult, pilotResult);
// 위 조건들에 부합하여 조회한 데이터의 갯수를 조회함
long total = query.cntrlBasNormalHstryCount(rq, idntfList, basResult, pilotResult); long total = query.cntrlBasNormalHstryCount(rq, idntfList, basResult, pilotResult);
long totalPage = total % rq.getRecord() > 0 ? total/rq.getRecord() + 1 : total/rq.getRecord(); long totalPage = total % rq.getRecord() > 0 ? total/rq.getRecord() + 1 : total/rq.getRecord();
@ -125,19 +126,27 @@ public class AnlsHstryService {
return response; return response;
} }
/**
* 비행ID[CNTRL_ID] 비행 상세정보를 조회하는 기능.
* @param cntrlId
* @return
* @throws Exception
*/
public AnlsHstryModel detail(String cntrlId) throws Exception{ public AnlsHstryModel detail(String cntrlId) throws Exception{
AnlsHstryModel model = new AnlsHstryModel(); AnlsHstryModel model = new AnlsHstryModel();
Optional<CtrCntrlBas> optional = ctrCntrlBasRepository.findById(cntrlId); Optional<CtrCntrlBas> optional = ctrCntrlBasRepository.findById(cntrlId); //
if (!optional.isPresent()) { if (!optional.isPresent()) {
// 데이터베이스에 조회하려는 데이터가 없을시 서버에서 파라미터가 없다는 "의도적인" 에러 반환
throw new CustomException(ErrorCode.DATA_NOTFIND); throw new CustomException(ErrorCode.DATA_NOTFIND);
} }
CtrCntrlBas entity = optional.get(); CtrCntrlBas entity = optional.get();
// Entity에 담겨있는 값을 반환 model로 복제함
BeanUtils.copyProperties(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) { public List<AnlsHstryDetailModel> hstryList(@PathVariable String id) {
List<AnlsHstryDetailModel> result = query.listCntrlHstryPage(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; 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.AnlsHstryDetailModel;
import com.palnet.biz.api.anls.hstry.model.AnlsHstryModel; import com.palnet.biz.api.anls.hstry.model.AnlsHstryModel;
import com.palnet.biz.api.anls.hstry.model.AnlsHstryRqModel; 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.code.RSErrorCode;
import com.palnet.comn.utils.JsonUtils; 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.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j2; 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 @Log4j2
@RestController @RestController
@ -42,30 +41,38 @@ public class AnlsSmltController {
private final AnlsSmltService service; private final AnlsSmltService service;
/** /**
* 비행 현황 목록 * 비행현황 목록 리스트 조회하는 기능,
* AnlsHstryRqModel 따른 리스트를 조회함.
* @param rq * @param rq
* @return * @return
*/ */
@GetMapping(value = "/list") @GetMapping(value = "/list")
@ApiOperation(value = "비행 현황 목록") @Operation(summary = "비행 시뮬레이션 - 비행 현황 목록", description = "비행 시뮬레이션에서 비행 현황 목록을 조회하는 API 입니다.")
@Tag(name = "비행 시뮬레이션", description = "비행 이력 시뮬레이션 관련 API")
public ResponseEntity<? extends BasicResponse> list(AnlsHstryRqModel rq) { public ResponseEntity<? extends BasicResponse> list(AnlsHstryRqModel rq) {
ComnPagingRs<AnlsHstryModel> result = null; ComnPagingRs<AnlsHstryModel> result = null;
log.debug("JSON>>>>>>>>" , JsonUtils.toJson(rq)); log.debug("JSON>>>>>>>>" , JsonUtils.toJson(rq));
log.debug("Param" + rq.getStDate() + "::" + rq.getEndDate()); 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) ) { 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)); .body(new ErrorResponse(RSErrorCode.ER_PARAM));
} }
try { try {
result = service.list(rq); result = service.list(rq); // 비행현황 목록 조회하는 기능.
} catch (Exception e) { } catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : {}", e); log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1")); .body(new ErrorResponse("Server Error", "-1"));
@ -77,22 +84,29 @@ public class AnlsSmltController {
/** /**
* 비행 이력 데이터 조회 * 비행 이력 데이터 조회하는 기능,061fbd9d-25c5-4801-bb11-2307a8eb8d8f
* 비행ID[CNTRL_ID] 조회함
* @param rq * @param rq
* @return * @return
*/ */
@GetMapping(value = "/hist/{id}") @GetMapping(value = "/hist/{id}")
@ApiOperation(value = "비행 이력 데이터 조회") @Operation(summary = "비행 시뮬레이션 - 비행 이력 데이터 조회", description = "비행 시뮬레이션에서 비행 이력 데이터를 조회하는 API 입니다.")
@Tag(name = "비행 시뮬레이션", description = "비행 이력 시뮬레이션 관련 API") public ResponseEntity<? extends BasicResponse> histList(
@ApiImplicitParam(name = "id",value = "관제ID", dataTypeClass = String.class) @Parameter(name="id", description = "개체 비행 ID", in = ParameterIn.PATH, example = "061fbd9d-25c5-4801-bb11-2307a8eb8d8f") @PathVariable String id) {
public ResponseEntity<? extends BasicResponse> histList(@PathVariable String id) {
List<AnlsHstryDetailModel> result = null; List<AnlsHstryDetailModel> result = null;
try { try {
// result = service.list(rq); // result = service.list(rq);
result = service.histList(id); result = service.histList(id); // 비행ID[CNTRL_ID]로 비행이력을 조회하는 기능.
} catch (Exception e) { } catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : {}", e); log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1")); .body(new ErrorResponse("Server Error", "-1"));
@ -104,23 +118,30 @@ public class AnlsSmltController {
/** /**
* 통계 데이터 조회 * 통계 데이터 조회,
* 비행ID[CNTRL_ID] 조회함
* @param rq * @param rq
* @return * @return
*/ */
@GetMapping(value = "/stcs/{id}") @GetMapping(value = "/stcs/{id}")
@ApiOperation(value = "통계 데이터 조회") @Operation(summary = "비행 시뮬레이션 - 비행 이력 통계 데이터 조회", description = "비행 시뮬레이션에서 비행 이력 통계 데이터 조회하는 API 입니다.")
@Tag(name = "비행 시뮬레이션", description = "비행 이력 시뮬레이션 관련 API") public ResponseEntity<? extends BasicResponse> stcsList(
@ApiImplicitParam(name = "id",value = "관제ID", dataTypeClass = String.class) @Parameter(name="id", description = "개체 비행 ID", in = ParameterIn.PATH, example = "061fbd9d-25c5-4801-bb11-2307a8eb8d8f") @PathVariable String id) {
public ResponseEntity<? extends BasicResponse> stcsList(@PathVariable String id) {
List<AnlsSmltStcsModel> result = null; List<AnlsSmltStcsModel> result = null;
try { try {
result = service.stcsList(id); result = service.stcsList(id); // 통계 데이터 조회하는 기능
} catch (Exception e) { } catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : {}", e); log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1")); .body(new ErrorResponse("Server Error", "-1"));
@ -131,21 +152,31 @@ public class AnlsSmltController {
} }
/** /**
* 비행 상세정보 조회 * 비행 상세정보 조회,
* 비행ID[CNTRL_ID] 조회함
* @param id * @param id
* @return * @return
*/ */
@GetMapping(value = "/detail/{id}") @GetMapping(value = "/detail/{id}")
@ApiOperation(value = "비행 상세정보 조회") // @ApiOperation(value = "비행 상세정보 조회")
@Tag(name = "비행 시뮬레이션", description = "비행 이력 시뮬레이션 관련 API") // @Tag(name = "비행 시뮬레이션", description = "비행 이력 시뮬레이션 관련 API")
@ApiImplicitParam(name = "id",value = "관제ID", dataTypeClass = String.class) // @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) {
AnlsSmltDetailModel result = null; AnlsSmltDetailModel result = null;
try { try {
result = service.detail(id); result = service.detail(id); // 비행ID[CNTRL_ID]로 비행상세정보 조회함
} catch (Exception e) { } catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : {}", e); log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1")); .body(new ErrorResponse("Server Error", "-1"));

20
pav-server/src/main/java/com/palnet/biz/api/anls/smlt/service/AnlsSmltService.java

@ -61,7 +61,7 @@ public class AnlsSmltService {
/** /**
* 비행 현황 목록 * 비행현황 목록 조회하는 기능.
* @param rq * @param rq
* @return * @return
*/ */
@ -106,6 +106,7 @@ public class AnlsSmltService {
for(FltPlanPilot list : pilotList) { for(FltPlanPilot list : pilotList) {
pilotResult = fltPlanBasRepository.findBasList(list.getPlanSno()); pilotResult = fltPlanBasRepository.findBasList(list.getPlanSno());
} }
result = query.cntrlBasNormalSmltList(rq, pageable, adminAuth, idntfList, basResult, pilotResult); // App 권한은 user이지만 group 권한이 LEADER / MASTER인 그룹이 있는 경우 해당 비행 이력 목록 표출 result = query.cntrlBasNormalSmltList(rq, pageable, adminAuth, idntfList, basResult, pilotResult); // App 권한은 user이지만 group 권한이 LEADER / MASTER인 그룹이 있는 경우 해당 비행 이력 목록 표출
// group 권한이 Normal인 경우 본인이 작성한 비행계획서의 이력 / 본인이 조종사인 기체 이력/ 본인이 등록한 기체 이력 표출 // group 권한이 Normal인 경우 본인이 작성한 비행계획서의 이력 / 본인이 조종사인 기체 이력/ 본인이 등록한 기체 이력 표출
@ -122,12 +123,13 @@ public class AnlsSmltService {
} }
/** /**
* * 비행ID[CNTRL_ID] 비행이력을 조회하는 기능.
* @param rq비행 이력 데이터 조회 * @param rq
* @return * @return
*/ */
public List<AnlsHstryDetailModel> histList(String id){ public List<AnlsHstryDetailModel> histList(String id){
// 비행ID[CNTRL_ID]로 비행이력을 데이터베이스에서 조회함.
List<AnlsHstryDetailModel> resultList = query.listCntrlHstry(id); List<AnlsHstryDetailModel> resultList = query.listCntrlHstry(id);
//정렬 순서 뒤집기 처리 //정렬 순서 뒤집기 처리
@ -138,14 +140,13 @@ public class AnlsSmltService {
/** /**
* 통계 데이터 조회 * 통계 데이터 조회하는 기능
* @param rq * @param rq
* @return * @return
*/ */
public List<AnlsSmltStcsModel> stcsList(String id){ public List<AnlsSmltStcsModel> stcsList(String id){
List<AnlsSmltStcsModel> result = query.anlsSmltStcs(id); List<AnlsSmltStcsModel> result = query.anlsSmltStcs(id); // 비행관제 ID[CNTRL_ID]로 데이터베이스에서 시뮬레이션 통계데이터를 조회함.
//통계 데이터 가공 처리 //통계 데이터 가공 처리
//소수점 자리 1자리로 컷트 //소수점 자리 1자리로 컷트
@ -162,7 +163,8 @@ public class AnlsSmltService {
/** /**
* 비행 상세정보 조회 * 비행 상세정보 조회,
* 비행ID[CNTRL_ID] 조회함
* @param cntrlId * @param cntrlId
* @return * @return
* @throws Exception * @throws Exception
@ -172,7 +174,7 @@ public class AnlsSmltService {
AnlsSmltDetailModel result = new AnlsSmltDetailModel(); AnlsSmltDetailModel result = new AnlsSmltDetailModel();
result = query.anlsSmltDetail(cntrlId); result = query.anlsSmltDetail(cntrlId); // 비행ID[CNTRL_ID]로 데이터베이스에서 비행상세 정보 조회함
// Optional<CtrCntrlBas> optional = ctrCntrlBasRepository.findById(cntrlId); // Optional<CtrCntrlBas> optional = ctrCntrlBasRepository.findById(cntrlId);
// //

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

5
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.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.palnet.biz.config.convert.InstantDateStrSerializer; 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 lombok.Data;
import java.time.Instant; import java.time.Instant;
@ -26,7 +29,7 @@ public class BasDronModel {
private double arcrftWdth; private double arcrftWdth;
private double arcrftWght; private double arcrftWght;
private String cameraYn; private String cameraYn;
private Instant createDt; private Instant createDt;

11
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 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.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
@ -9,15 +11,18 @@ import lombok.EqualsAndHashCode;
@EqualsAndHashCode(callSuper=false) @EqualsAndHashCode(callSuper=false)
public class BasDronRqModel extends ComnPagingModel { public class BasDronRqModel extends ComnPagingModel {
@Schema(description = "그룹아이디" , example = "C807F9", requiredMode = RequiredMode.REQUIRED)
private String groupId; private String groupId;
@Schema(description = "기체모델명" , example = "PAV_001", requiredMode = RequiredMode.NOT_REQUIRED)
private String arcrftModelNm; private String arcrftModelNm;
@Schema(description = "기체종류코드" , example = "01", requiredMode = RequiredMode.NOT_REQUIRED)
private String arcrftTypeCd; private String arcrftTypeCd;
@Schema(description = "기체식별번호" , example = "PA0001", hidden = true)
private String idntfNum; private String idntfNum;
private String ownerNm; @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;
}

21
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 java.time.Instant;
import io.swagger.v3.oas.annotations.media.Schema;
@Data @Data
public class BasIdntfModel { public class BasIdntfModel {
//식별 번호 정보 //식별 번호 정보
@Schema(hidden = true)
private String id; private String id;
@Schema(description = "식별장치 고유명", example = "PA0003")
private String idntfNum; private String idntfNum;
@Schema(hidden = true)
private String isSave; private String isSave;
@Schema(hidden = true)
private int arcrftSno; private int arcrftSno;
@Schema(description = "식별장치종류코드", example = "DRON")
private String idntfTypeCd; private String idntfTypeCd;
@Schema(description = "소유자명", example = "팔네트웍스")
private String ownerNm; private String ownerNm;
@Schema(description = "소유자 휴대폰번호", example = "01044322231")
private String hpno; private String hpno;
@Schema(hidden = true)
private Instant updateDt; private Instant updateDt;
@Schema(hidden = true)
private Instant createDt; private Instant createDt;
@Schema(hidden = true)
private int cstmrSno; private int cstmrSno;
@Schema(hidden = true)
private String groupId; 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; package com.palnet.biz.api.bas.dron.model;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;
@Data @Data
public class BasIdntfRqModel { public class BasIdntfRqModel {
@Schema(description = "기체 식별정보들", implementation = BasIdntfModel.class)
private List<BasIdntfModel> data; private List<BasIdntfModel> data;
@Schema(description = "기체일련번호", example = "6")
private int arcrftSno; private int arcrftSno;
} }

36
pav-server/src/main/java/com/palnet/biz/api/bas/dron/service/BasDronService.java

@ -48,7 +48,7 @@ public class BasDronService {
private JwtTokenUtil jwtTokenUtil; private JwtTokenUtil jwtTokenUtil;
/** /**
* 드론 목록 * 드론 목록 조회하는 기능
* @param rq * @param rq
* @return * @return
*/ */
@ -56,10 +56,13 @@ public class BasDronService {
ComnPagingRs<BasDronModel> response = new ComnPagingRs<>(); ComnPagingRs<BasDronModel> response = new ComnPagingRs<>();
// 페이징 처리를 위한 객체
Pageable pageable = PageRequest.of(rq.getPage()-1, rq.getRecord()); Pageable pageable = PageRequest.of(rq.getPage()-1, rq.getRecord());
// 데이터 베이스에서 검색조건에 맞는 값으로 드론목록 조회함.
PageImpl<BasDronModel> result = query.list(rq, pageable); PageImpl<BasDronModel> result = query.list(rq, pageable);
// 데이터 베이스에서 전체 리스트 값이 몇인지 조회.
long total = query.listCount(rq); long total = query.listCount(rq);
long totalPage = total % rq.getRecord() > 0 ? (total/rq.getRecord()) + 1 : total/rq.getRecord(); long totalPage = total % rq.getRecord() > 0 ? (total/rq.getRecord()) + 1 : total/rq.getRecord();
@ -92,7 +95,7 @@ public class BasDronService {
} }
/** /**
* 상세 조회 * 드론 상세 조회하는 기능.
* @param arcrftSno * @param arcrftSno
* @return * @return
* @throws Exception * @throws Exception
@ -110,7 +113,7 @@ public class BasDronService {
} }
/** /**
* 생성 * 드론 정보 생성하는 기능.
* @param * @param
* @return * @return
* @throws Exception * @throws Exception
@ -168,7 +171,7 @@ public class BasDronService {
} }
/** /**
* 식밸장치 생성 * 식밸장치 생성하는 기능.
* @param * @param
* @return * @return
* @throws Exception * @throws Exception
@ -206,6 +209,11 @@ public class BasDronService {
} }
/**
* 드론정보 삭제하는 기능.
* @param idntfNum
* @return
*/
public boolean deleteIdntf(String idntfNum) { public boolean deleteIdntf(String idntfNum) {
Optional<ComIdntfBas> optional = comIdntBasRepository.findById(idntfNum); Optional<ComIdntfBas> optional = comIdntBasRepository.findById(idntfNum);
@ -218,7 +226,13 @@ public class BasDronService {
return true; return true;
} }
/**
* 입력받은 드론정보 데이터베이스에 생성함.
* @param model
* @return
* @throws Exception
*/
public ComArcrftBas insertComArcrftBas(BasDronModel model) throws Exception{ public ComArcrftBas insertComArcrftBas(BasDronModel model) throws Exception{
@ -261,7 +275,7 @@ public class BasDronService {
/** /**
* 수정 * 드론정보 수정하는 기능.
* @param * @param
* @return * @return
* @throws Exception * @throws Exception
@ -319,7 +333,13 @@ public class BasDronService {
return true; return true;
} }
/**
* 입력받은 드론 수정정보로 데이터베이스에 수정함.
* @param model
* @return
* @throws Exception
*/
public ComArcrftBas updateComArcrftBas(BasDronModel model) 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; package com.palnet.biz.api.bas.flight.controller;
import java.io.BufferedReader; import com.palnet.biz.api.bas.flight.model.*;
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.service.BasFlightService; import com.palnet.biz.api.bas.flight.service.BasFlightService;
import com.palnet.biz.api.comn.file.service.ComnFileService; import com.palnet.biz.api.comn.file.service.ComnFileService;
import com.palnet.biz.api.comn.model.ComnPagingRs; 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.biz.scheduler.ctr.service.CtrTrnsLctnService;
import com.palnet.comn.exception.CustomException; import com.palnet.comn.exception.CustomException;
import com.palnet.comn.utils.AreaUtils; import com.palnet.comn.utils.AreaUtils;
import com.palnet.comn.utils.FlightUtils;
import com.palnet.comn.utils.PdfUtils; 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 io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; 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 @Slf4j
@Tag(name = "비행계획서", description = "비행계획서 관련 API")
@RequiredArgsConstructor @RequiredArgsConstructor
@RestController @RestController
@RequestMapping(value = "/api/bas/flight", produces = {MediaType.APPLICATION_JSON_VALUE}) @RequestMapping(value = "/api/bas/flight", produces = {MediaType.APPLICATION_JSON_VALUE})
@Tag(name = "비행계획서", description = "비행계획서 관련 API")
public class BasFlightController { public class BasFlightController {
private final BasFlightService basFlightService; private final BasFlightService basFlightService;
@ -78,9 +46,15 @@ public class BasFlightController {
private final ComnFileService comnFileService; private final ComnFileService comnFileService;
private final PdfUtils pdfUtils; private final PdfUtils pdfUtils;
/**
* 공역데이터 내려주는 기능.
* @return
* @throws IOException
* @throws ParseException
*/
@GetMapping("/area") @GetMapping("/area")
@Tag(name = "비행계획서", description = "비행계획서 관련 API")
public ResponseEntity<Object> findAirSpace() throws IOException, ParseException { public ResponseEntity<Object> findAirSpace() throws IOException, ParseException {
// 1. file read // 1. file read
Resource resource = new ClassPathResource("air/airgeo.json"); Resource resource = new ClassPathResource("air/airgeo.json");
InputStream jsonInputStream = resource.getInputStream(); InputStream jsonInputStream = resource.getInputStream();
@ -102,16 +76,28 @@ public class BasFlightController {
return ResponseEntity.ok().body(airArea); return ResponseEntity.ok().body(airArea);
} }
// 비행계획서 조회 /**
* 비행계획서 조회하는 기능,
* BasFlightPlanListRq 모델에 조건값에 따라 조회함.
* @param rq
* @return
*/
@GetMapping(value = "/plan/list") @GetMapping(value = "/plan/list")
@ApiOperation(value = "비행계획서 조회") // @ApiOperation(value = "비행계획서 조회")
@Tag(name = "비행계획서", description = "비행계획서 관련 API") // @Tag(name = "비행계획서", description = "비행계획서 관련 API")
public ResponseEntity<? extends BasicResponse> findPlanList(BasFlightPlanListRq rq) { public ResponseEntity<? extends BasicResponse> findPlanList(BasFlightPlanListRq rq) {
ComnPagingRs<BasFlightPlanModel> result = null; ComnPagingRs<BasFlightPlanModel> result = null;
log.debug(">>> rq : {}", rq); log.debug(">>> rq : {}", rq);
try { try {
result = basFlightService.listPlan(rq); result = basFlightService.listPlan(rq); // 비행계획서 조회하는 기능
} catch (Exception e) { } catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : {}", e); log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1")); .body(new ErrorResponse("Server Error", "-1"));
@ -120,16 +106,28 @@ public class BasFlightController {
return ResponseEntity.ok().body(new SuccessResponse<>(result)); return ResponseEntity.ok().body(new SuccessResponse<>(result));
} }
// 비행계획서 상세 조회 /**
* 비행계획서 상세 조회기능,
* 비행계획서 번호[planSno] 상세조회
* @param planSno
* @return
*/
@GetMapping(value = "/plan/detail/{planSno}") @GetMapping(value = "/plan/detail/{planSno}")
@ApiOperation(value = "비행계획서 상세 조회") // @ApiOperation(value = "비행계획서 상세 조회")
@Tag(name = "비행계획서", description = "비행계획서 관련 API") // @Tag(name = "비행계획서", description = "비행계획서 관련 API")
@ApiImplicitParam(name = "planSno", value = "비행계획서일련번호", dataTypeClass = Integer.class) // @ApiImplicitParam(name = "planSno", value = "비행계획서일련번호", dataTypeClass = Integer.class)
public ResponseEntity<? extends BasicResponse> detailPlan(@PathVariable("planSno") Integer planSno) { public ResponseEntity<? extends BasicResponse> detailPlan(@PathVariable("planSno") Integer planSno) {
BasFlightPlanModel result = null; BasFlightPlanModel result = null;
try { try {
result = basFlightService.detailPlan(planSno); result = basFlightService.detailPlan(planSno); // 비행계획서 고유번호[planSno]로 상세 조회하는 기능.
} catch (Exception e) { } catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : {}", e); log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1")); .body(new ErrorResponse("Server Error", "-1"));
@ -138,25 +136,46 @@ public class BasFlightController {
return ResponseEntity.ok().body(new SuccessResponse<>(result)); return ResponseEntity.ok().body(new SuccessResponse<>(result));
} }
// 비행계획서 등록 /**
* 비행계획서 등록하는 기능,
* BasFlightPlanModel모델에 입력받은값으로 등록함.
* @param rq
* @return
*/
@PostMapping(value = "/plan/create") @PostMapping(value = "/plan/create")
@ApiOperation(value = "비행계획서 등록") // @ApiOperation(value = "비행계획서 등록")
@Tag(name = "비행계획서", description = "비행계획서 관련 API") // @Tag(name = "비행계획서", description = "비행계획서 관련 API")
public ResponseEntity<? extends BasicResponse> createPlan(@RequestBody BasFlightPlanModel rq) { public ResponseEntity<? extends BasicResponse> createPlan(@RequestBody BasFlightPlanModel rq) {
Map<String, Object> resultMap = new HashMap<String, Object>(); Map<String, Object> resultMap = new HashMap<String, Object>();
try { try {
log.error(">>> rq : {}", rq); log.error(">>> rq : {}", rq);
boolean result = basFlightService.createPlan(rq); boolean result = basFlightService.createPlan(rq); // 입력받은 값으로 비행계획서 등록하는 기능.
resultMap.put("result", result); resultMap.put("result", result);
log.info(">>> resultMap : " , resultMap); log.info(">>> resultMap : " , resultMap);
} catch (CustomException e) { } catch (CustomException e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* CustomException은 개발자가 "의도적으로" 예외처리,
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : {}", e); log.error("IGNORE : {}", e);
resultMap.put("result", false); resultMap.put("result", false);
resultMap.put("errorCode", e.getErrorCode()); resultMap.put("errorCode", e.getErrorCode());
resultMap.put("errorMessage", e.getMessage()); resultMap.put("errorMessage", e.getMessage());
return ResponseEntity.ok().body(new SuccessResponse<Map>(resultMap)); return ResponseEntity.ok().body(new SuccessResponse<Map>(resultMap));
} catch (Exception e) { } catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : {}", e); log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1")); .body(new ErrorResponse("Server Error", "-1"));
@ -165,23 +184,43 @@ public class BasFlightController {
return ResponseEntity.ok().body(new SuccessResponse<>(resultMap)); return ResponseEntity.ok().body(new SuccessResponse<>(resultMap));
} }
// 비행계획서 수정 /**
* 비행계획서 수정하는 기능,
* BasFlightPlanModel 모델에 입력받은 값으로 수정함
* @param rq
* @return
*/
@PutMapping(value = "/plan/update") @PutMapping(value = "/plan/update")
@ApiOperation(value = "비행계획서 수정") // @ApiOperation(value = "비행계획서 수정")
@Tag(name = "비행계획서", description = "비행계획서 관련 API") // @Tag(name = "비행계획서", description = "비행계획서 관련 API")
public ResponseEntity<? extends BasicResponse> updatePlan(@RequestBody BasFlightPlanModel rq) { public ResponseEntity<? extends BasicResponse> updatePlan(@RequestBody BasFlightPlanModel rq) {
Map<String, Object> resultMap = new HashMap<String, Object>(); Map<String, Object> resultMap = new HashMap<String, Object>();
try { try {
boolean result = basFlightService.updatePlan(rq); boolean result = basFlightService.updatePlan(rq); // 입력받은 값으로 비행계획서 수정하는 기능.
resultMap.put("result", result); resultMap.put("result", result);
} catch (CustomException e) { } catch (CustomException e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* CustomException은 개발자가 "의도적으로" 예외처리,
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : {}", e); log.error("IGNORE : {}", e);
resultMap.put("result", false); resultMap.put("result", false);
resultMap.put("errorCode", e.getErrorCode()); resultMap.put("errorCode", e.getErrorCode());
resultMap.put("errorMessage", e.getMessage()); resultMap.put("errorMessage", e.getMessage());
return ResponseEntity.ok().body(new SuccessResponse<Map>(resultMap)); return ResponseEntity.ok().body(new SuccessResponse<Map>(resultMap));
} catch (Exception e) { } catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : {}", e); log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1")); .body(new ErrorResponse("Server Error", "-1"));
@ -190,23 +229,43 @@ public class BasFlightController {
return ResponseEntity.ok().body(new SuccessResponse<>(resultMap)); return ResponseEntity.ok().body(new SuccessResponse<>(resultMap));
} }
// 비행계획서 삭제 /**
* 비행계획서 삭제하는 기능,
* 비행계획서 고유번호[planSno] 삭제함.
* @param planSno
* @return
*/
@DeleteMapping(value = "/plan/delete/{planSno}") @DeleteMapping(value = "/plan/delete/{planSno}")
@ApiOperation(value = "비행계획서 삭제") // @ApiOperation(value = "비행계획서 삭제")
@Tag(name = "비행계획서", description = "비행계획서 관련 API") // @Tag(name = "비행계획서", description = "비행계획서 관련 API")
@ApiImplicitParam(name = "planSno", value = "비행계획서일련번호", dataTypeClass = Integer.class) // @ApiImplicitParam(name = "planSno", value = "비행계획서일련번호", dataTypeClass = Integer.class)
public ResponseEntity<? extends BasicResponse> deletePlan(@PathVariable("planSno") Integer planSno) { public ResponseEntity<? extends BasicResponse> deletePlan(@PathVariable("planSno") Integer planSno) {
Map<String, Object> resultMap = new HashMap<String, Object>(); Map<String, Object> resultMap = new HashMap<String, Object>();
try { try {
boolean result = basFlightService.deletePlan(planSno); boolean result = basFlightService.deletePlan(planSno); // 비행계획서 고유번호[planSno]로 비행계획서 삭제하는 기능.
resultMap.put("result", result); resultMap.put("result", result);
} catch (CustomException e) { } catch (CustomException e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* CustomException은 개발자가 "의도적으로" 예외처리,
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : {}", e); log.error("IGNORE : {}", e);
resultMap.put("result", false); resultMap.put("result", false);
resultMap.put("errorCode", e.getErrorCode()); resultMap.put("errorCode", e.getErrorCode());
return ResponseEntity.ok().body(new SuccessResponse<Map>(resultMap)); return ResponseEntity.ok().body(new SuccessResponse<Map>(resultMap));
} catch (Exception e) { } catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : {}", e); log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1")); .body(new ErrorResponse("Server Error", "-1"));
@ -215,17 +274,29 @@ public class BasFlightController {
return ResponseEntity.ok().body(new SuccessResponse<>(resultMap)); return ResponseEntity.ok().body(new SuccessResponse<>(resultMap));
} }
// 그룹 조종사 조회 /**
* 그룹 조종사 조회하는 기능
* 그룹아이디[groupId] 조회함.
* @param groupId
* @return
*/
@GetMapping(value = "/plan/pilot/{groupId}") @GetMapping(value = "/plan/pilot/{groupId}")
@ApiOperation(value = "그룹의 조종사 조회") // @ApiOperation(value = "그룹의 조종사 조회")
@Tag(name = "비행계획서", description = "비행계획서 관련 API") // @Tag(name = "비행계획서", description = "비행계획서 관련 API")
@ApiImplicitParam(name = "groupId", value = "그룹ID", dataTypeClass = String.class) // @ApiImplicitParam(name = "groupId", value = "그룹ID", dataTypeClass = String.class)
public ResponseEntity<? extends BasicResponse> findPilot(@PathVariable("groupId") String groupId) { public ResponseEntity<? extends BasicResponse> findPilot(@PathVariable("groupId") String groupId) {
List<BasFlightPlanPilotModel> result = null; List<BasFlightPlanPilotModel> result = null;
try { try {
result = basFlightService.listPilotByGroup(groupId); result = basFlightService.listPilotByGroup(groupId); // 그룹아이디[groupId]로 그룹 조종사 조회하는 기능.
} catch (Exception e) { } catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : {}", e); log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1")); .body(new ErrorResponse("Server Error", "-1"));
@ -235,16 +306,28 @@ public class BasFlightController {
} }
// 그룹 기체 조회 /**
* 그룹 기체 조회하는 기능,
* 그룹아이디[groupId] 조회함.
* @param groupId
* @return
*/
@GetMapping(value = "/plan/arcrft/{groupId}") @GetMapping(value = "/plan/arcrft/{groupId}")
@ApiOperation(value = "그룹의 기체 조회") // @ApiOperation(value = "그룹의 기체 조회")
@Tag(name = "비행계획서", description = "비행계획서 관련 API") // @Tag(name = "비행계획서", description = "비행계획서 관련 API")
@ApiImplicitParam(name = "groupId", value = "그룹ID", dataTypeClass = String.class) // @ApiImplicitParam(name = "groupId", value = "그룹ID", dataTypeClass = String.class)
public ResponseEntity<? extends BasicResponse> findArcrft(@PathVariable("groupId") String groupId) { public ResponseEntity<? extends BasicResponse> findArcrft(@PathVariable("groupId") String groupId) {
List<BasFlightPlanArcrftModel> result = null; List<BasFlightPlanArcrftModel> result = null;
try { try {
result = basFlightService.listArcrftByGroup(groupId); result = basFlightService.listArcrftByGroup(groupId); // 그룹아이디[groupId]로 그룹 기체 조회하는 기능.
} catch (Exception e) { } catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : {}", e); log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1")); .body(new ErrorResponse("Server Error", "-1"));
@ -254,15 +337,26 @@ public class BasFlightController {
} }
// 비행 구역 버퍼 존 생성 /**
* 비행 구역 버퍼 생성하는 기능
* @param rq
* @return
*/
@PostMapping("/plan/area/buffer") @PostMapping("/plan/area/buffer")
@ApiOperation(value = "비행 구역 버퍼 존 생성") // @ApiOperation(value = "비행 구역 버퍼 존 생성")
@Tag(name = "비행계획서", description = "비행계획서 관련 API") // @Tag(name = "비행계획서", description = "비행계획서 관련 API")
public ResponseEntity<? extends BasicResponse> findBuffer(@RequestBody List<BasFlightPlanAreaModel> rq) { public ResponseEntity<? extends BasicResponse> findBuffer(@RequestBody List<BasFlightPlanAreaModel> rq) {
List<BasFlightPlanAreaModel> rs = null; List<BasFlightPlanAreaModel> rs = null;
try { try {
rs = basFlightService.getBuffer(rq); rs = basFlightService.getBuffer(rq); // 비행 구역 buffer zone 생성하는 기능.
} catch (Exception e) { } catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : {}", e); log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1")); .body(new ErrorResponse("Server Error", "-1"));
@ -271,15 +365,27 @@ public class BasFlightController {
return ResponseEntity.ok().body(new SuccessResponse<>(rs)); return ResponseEntity.ok().body(new SuccessResponse<>(rs));
} }
/**
* 비행계획서 날씨 확인하는 기능.
* @param rq
* @return
*/
@GetMapping("/plan/api/weather") @GetMapping("/plan/api/weather")
@ApiOperation(value = "비행계획서 날씨") // @ApiOperation(value = "비행계획서 날씨")
@Tag(name = "비행계획서", description = "비행계획서 관련 API") // @Tag(name = "비행계획서", description = "비행계획서 관련 API")
public ResponseEntity<? extends BasicResponse> restApiGetWeather(BasFlightWeatherModel rq) { public ResponseEntity<? extends BasicResponse> restApiGetWeather(BasFlightWeatherModel rq) {
JSONObject jsonObject = null; JSONObject jsonObject = null;
try { try {
jsonObject = basFlightService.getWeather(rq); jsonObject = basFlightService.getWeather(rq); // 지역과 날씨에 대한 정보를 얻는 기능.
} catch (Exception e) { } catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : {}", e); log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1")); .body(new ErrorResponse("Server Error", "-1"));
@ -289,15 +395,27 @@ public class BasFlightController {
return ResponseEntity.ok().body(new SuccessResponse<>(jsonObject)); return ResponseEntity.ok().body(new SuccessResponse<>(jsonObject));
} }
// 비행계획서 리스트(승인) /**
* 비행계획서 리스트(승인) 조회하는 기능,
* 입력받은 값으로 승인관련된 비행계획서 리스트를 조회함.
* @param rq
* @return
*/
@GetMapping(value = "/aprv/list") @GetMapping(value = "/aprv/list")
@ApiOperation(value = "비행계획서 리스트(승인)") // @ApiOperation(value = "비행계획서 리스트(승인)")
@Tag(name = "비행계획서", description = "비행계획서 관련 API") // @Tag(name = "비행계획서", description = "비행계획서 관련 API")
public ResponseEntity<? extends BasicResponse> findAprvList(BasFlightPlanListRq rq) { public ResponseEntity<? extends BasicResponse> findAprvList(BasFlightPlanListRq rq) {
ComnPagingRs<BasFlightPlanModel> result = null; ComnPagingRs<BasFlightPlanModel> result = null;
try { try {
result = basFlightService.aprvList(rq); result = basFlightService.aprvList(rq); // 비행계획서 리스트(승인)를 조회하는 기능
} catch (Exception e) { } catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : {}", e); log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1")); .body(new ErrorResponse("Server Error", "-1"));
@ -306,22 +424,42 @@ public class BasFlightController {
return ResponseEntity.ok().body(new SuccessResponse<>(result)); return ResponseEntity.ok().body(new SuccessResponse<>(result));
} }
// 비행계획서 승인/미승인 /**
* 비행계획서 승인/미승인 하는 기능,
* BasFlightAprovRq에 있는 값을 토대로 승인/미승인 .
* @param rq
* @return
*/
@PutMapping(value = "/aprv/proc") @PutMapping(value = "/aprv/proc")
@ApiOperation(value = "비행 계획서 승인/미승인") // @ApiOperation(value = "비행 계획서 승인/미승인")
@Tag(name = "비행계획서", description = "비행계획서 관련 API") // @Tag(name = "비행계획서", description = "비행계획서 관련 API")
public ResponseEntity<? extends BasicResponse> updateAprvProc(@RequestBody BasFlightAprovRq rq) { public ResponseEntity<? extends BasicResponse> updateAprvProc(@RequestBody BasFlightAprovRq rq) {
Map<String, Object> resultMap = new HashMap<String, Object>(); Map<String, Object> resultMap = new HashMap<String, Object>();
try { try {
int result = basFlightService.aprovePlan(rq); int result = basFlightService.aprovePlan(rq); // 비행계획서 승인/미승인하는 기능.
resultMap.put("result", result); resultMap.put("result", result);
} catch (CustomException e) { } catch (CustomException e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* CustomException은 개발자가 "의도적으로" 예외처리,
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : {}", e); log.error("IGNORE : {}", e);
resultMap.put("result", false); resultMap.put("result", false);
resultMap.put("errorCode", e.getErrorCode()); resultMap.put("errorCode", e.getErrorCode());
return ResponseEntity.ok().body(new SuccessResponse<Map>(resultMap)); return ResponseEntity.ok().body(new SuccessResponse<Map>(resultMap));
} catch (Exception e) { } catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : {}", e); log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1")); .body(new ErrorResponse("Server Error", "-1"));
@ -331,15 +469,27 @@ public class BasFlightController {
} }
/**
* 비행경로 체크하는 기능.
* @param rq
* @return
*/
@PostMapping("/airspace/contains") @PostMapping("/airspace/contains")
@Tag(name = "비행계획서", description = "비행계획서 관련 API") // @Tag(name = "비행계획서", description = "비행계획서 관련 API")
public ResponseEntity<? extends BasicResponse> checkAirspaceContains(@RequestBody List<BasFlightPlanAreaModel> rq) { public ResponseEntity<? extends BasicResponse> checkAirspaceContains(@RequestBody List<BasFlightPlanAreaModel> rq) {
Map<String, Object> resultMap = new HashMap<String, Object>(); Map<String, Object> resultMap = new HashMap<String, Object>();
try { try {
boolean result = basFlightService.checkAirspaceContains(rq); boolean result = basFlightService.checkAirspaceContains(rq); // 비행경로 체크하는 기능.
resultMap.put("result", result); resultMap.put("result", result);
} catch (Exception e) { } catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : {}", e); log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1")); .body(new ErrorResponse("Server Error", "-1"));
@ -349,15 +499,21 @@ public class BasFlightController {
} }
//지역 검색 /**
* 지역 검색하는 기능.
* @param query
* @return
* @throws ParseException
*/
@GetMapping("/plan/area/search") @GetMapping("/plan/area/search")
@ApiOperation(value = "지역 검색") // @ApiOperation(value = "지역 검색")
@Tag(name = "비행계획서", description = "비행계획서 관련 API") // @Tag(name = "비행계획서", description = "비행계획서 관련 API")
public ResponseEntity<? extends BasicResponse> searchArea(String query) throws ParseException { public ResponseEntity<? extends BasicResponse> searchArea(String query) throws ParseException {
String text = null; String text = null;
try { try {
text = URLEncoder.encode(query, "UTF-8"); text = URLEncoder.encode(query, "UTF-8");
} catch (UnsupportedEncodingException e) { } catch (UnsupportedEncodingException e) {
// UTF-8 포맷팅으로 인코딩 실패시 에러 던짐
throw new RuntimeException("검색어 인코딩 실패", e); throw new RuntimeException("검색어 인코딩 실패", e);
} }
@ -373,16 +529,29 @@ public class BasFlightController {
return ResponseEntity.ok().body(new SuccessResponse<>(obj)); return ResponseEntity.ok().body(new SuccessResponse<>(obj));
} }
/**
* 비행계획서 스케줄 검색하는 기능,
* 검색일[searchDate] 조건으로 조회함.
* @param searchDate
* @return
*/
@GetMapping("/schedule") @GetMapping("/schedule")
@Tag(name = "비행계획서", description = "비행계획서 관련 API") // @Tag(name = "비행계획서", description = "비행계획서 관련 API")
public ResponseEntity<? extends BasicResponse> findSchedule(@RequestParam("searchDate") String searchDate) { public ResponseEntity<? extends BasicResponse> findSchedule(@RequestParam("searchDate") String searchDate) {
List<BasFlightScheduleRs> response; List<BasFlightScheduleRs> response;
try { try {
response = basFlightService.findSchecdule(searchDate); response = basFlightService.findSchecdule(searchDate); // 검색날짜 조건으로 비행스케줄 조회하는 기능.
} catch (Exception e) { } catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : {}", e); log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1")); .body(new ErrorResponse("Server Error", "-1"));
@ -391,10 +560,15 @@ public class BasFlightController {
return ResponseEntity.ok().body(new SuccessResponse<List>(response)); return ResponseEntity.ok().body(new SuccessResponse<List>(response));
} }
// @PostMapping("/coord") @PostMapping("/adex/buffer")
// public JSONObject coordTest(@RequestBody Coordinate coordinate) throws IOException, ParseException { public List<Coordinate> adexBuffer(@RequestBody BasFlightCoordModel model) {
//
// return FlightUtils.getCoordinateGis(coordinate); 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; package com.palnet.biz.api.bas.flight.model;
import com.palnet.biz.jpa.entity.type.FltMethod;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Builder; import lombok.Builder;
import lombok.Data; import lombok.Data;
@ -32,22 +31,5 @@ public class BasFlightPlanAreaModel {
// kac 추가 필드 // kac 추가 필드
private String fltMothoeRm; 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; private final AreaUtils areaUtils;
// 비행계획서 조회 /**
* 비행계획서 조회하는 기능
* @param rq
* @return
*/
public ComnPagingRs<BasFlightPlanModel> listPlan(BasFlightPlanListRq rq) { public ComnPagingRs<BasFlightPlanModel> listPlan(BasFlightPlanListRq rq) {
List<BasGroupJoinModel> groupList = ptyPlanQueryRepository.joinList(rq.getCstmrSno()); List<BasGroupJoinModel> groupList = ptyPlanQueryRepository.joinList(rq.getCstmrSno());
String userAccount = null; String userAccount = null;
@ -97,8 +101,11 @@ public class BasFlightService {
} else { } else {
masterAccount = "NORMAL"; masterAccount = "NORMAL";
} }
// 데이터베이스에서 조건에 따라 비행계획서를 조회함.
PageImpl<BasFlightPlanModel> result = fltPlanQueryRepository.listPlan(rq, masterAccount, pageable); PageImpl<BasFlightPlanModel> result = fltPlanQueryRepository.listPlan(rq, masterAccount, pageable);
// 데이터베이스에서 조건에 따라 비행계획서를 조회하고 그 사이즈를 가져옴.
long total = fltPlanQueryRepository.listPlanCount(rq, masterAccount); long total = fltPlanQueryRepository.listPlanCount(rq, masterAccount);
long totalPage = total % rq.getRecord() > 0 ? (total / rq.getRecord()) + 1 : total / rq.getRecord(); long totalPage = total % rq.getRecord() > 0 ? (total / rq.getRecord()) + 1 : total / rq.getRecord();
@ -111,7 +118,11 @@ public class BasFlightService {
return response; return response;
} }
// 비행계획서 상세 조회 /**
* 비행계획서 고유번호[planSno] 상세 조회하는 기능.
* @param planSno
* @return
*/
public BasFlightPlanModel detailPlan(Integer planSno) { public BasFlightPlanModel detailPlan(Integer planSno) {
BasFlightPlanModel rs = new BasFlightPlanModel(); BasFlightPlanModel rs = new BasFlightPlanModel();
// 비행계획서 // 비행계획서
@ -155,6 +166,10 @@ public class BasFlightService {
return rs; return rs;
} }
/**
* 비행계획서 유효하는지 확인하는 기능.
* @param rq
*/
public void planValid(BasFlightPlanModel rq) { public void planValid(BasFlightPlanModel rq) {
boolean isEqualsFltElev = false; boolean isEqualsFltElev = false;
@ -269,7 +284,11 @@ public class BasFlightService {
} }
} }
// 비행계획서 등록 /**
* 입력받은 값으로 비행계획서 등록하는 기능.
* @param rq
* @return
*/
@Transactional @Transactional
public boolean createPlan(BasFlightPlanModel rq) { public boolean createPlan(BasFlightPlanModel rq) {
@ -335,7 +354,11 @@ public class BasFlightService {
return true; return true;
} }
// 비행계획서 수정 /**
* 입력받은 값으로 비행계획서 수정하는 기능.
* @param rq
* @return
*/
@Transactional @Transactional
public boolean updatePlan(BasFlightPlanModel rq) { public boolean updatePlan(BasFlightPlanModel rq) {
@ -461,7 +484,11 @@ public class BasFlightService {
return true; return true;
} }
// 비행계획서 삭제 /**
* 비행계획서 고유번호[planSno] 비행계획서 삭제하는 기능.
* @param planSno
* @return
*/
@Transactional @Transactional
public boolean deletePlan(Integer planSno) { public boolean deletePlan(Integer planSno) {
FltPlanBas planEntity = fltPlanBasRepository.findById(planSno).orElseThrow(); FltPlanBas planEntity = fltPlanBasRepository.findById(planSno).orElseThrow();
@ -471,7 +498,11 @@ public class BasFlightService {
} }
// 그룹 조종사 조회 /**
* 그룹아이디[groupId] 그룹 조종사 조회하는 기능.
* @param groupId
* @return
*/
public List<BasFlightPlanPilotModel> listPilotByGroup(String groupId) { public List<BasFlightPlanPilotModel> listPilotByGroup(String groupId) {
List<BasFlightPlanPilotModel> pilotList = fltPlanQueryRepository.listPilot(groupId); List<BasFlightPlanPilotModel> pilotList = fltPlanQueryRepository.listPilot(groupId);
@ -493,7 +524,11 @@ public class BasFlightService {
return pilotList; return pilotList;
} }
// 그룹 기체 조회 /**
* 그룹아이디[groupId] 그룹 기체 조회하는 기능.
* @param groupId
* @return
*/
public List<BasFlightPlanArcrftModel> listArcrftByGroup(String groupId) { public List<BasFlightPlanArcrftModel> listArcrftByGroup(String groupId) {
List<BasFlightPlanArcrftModel> arcrftModels = fltPlanQueryRepository.listArcrft(groupId); List<BasFlightPlanArcrftModel> arcrftModels = fltPlanQueryRepository.listArcrft(groupId);
@ -502,7 +537,11 @@ public class BasFlightService {
return arcrftModels; return arcrftModels;
} }
// 비행 구역 buffer zone /**
* 비행 구역 buffer zone 생성하는 기능.
* @param rq
* @return
*/
public List<BasFlightPlanAreaModel> getBuffer(List<BasFlightPlanAreaModel> rq) { public List<BasFlightPlanAreaModel> getBuffer(List<BasFlightPlanAreaModel> rq) {
for (BasFlightPlanAreaModel area : rq) { for (BasFlightPlanAreaModel area : rq) {
@ -523,7 +562,11 @@ public class BasFlightService {
return rq; return rq;
} }
// 비행계획서 리스트(승인) /**
* 비행계획서 리스트(승인) 조회하는 기능.
* @param rq
* @return
*/
public ComnPagingRs<BasFlightPlanModel> aprvList(BasFlightPlanListRq rq) { public ComnPagingRs<BasFlightPlanModel> aprvList(BasFlightPlanListRq rq) {
String appAuth = jwtTokenUtil.getUserAuthByToken(); String appAuth = jwtTokenUtil.getUserAuthByToken();
@ -544,6 +587,8 @@ public class BasFlightService {
} }
} }
} }
// 유저의 권한을 확인하는 로직
if (appAuth.equals("SUPER") || appAuth.equals("ADMIN")) { if (appAuth.equals("SUPER") || appAuth.equals("ADMIN")) {
masterAccount = "ADMIN"; masterAccount = "ADMIN";
} else if (userAccount.equals("MASTER") || userAccount.equals("LEADER")) { } else if (userAccount.equals("MASTER") || userAccount.equals("LEADER")) {
@ -551,9 +596,9 @@ public class BasFlightService {
} else { } else {
masterAccount = "NORMAL"; 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(); long totalPage = total % rq.getRecord() > 0 ? (total / rq.getRecord()) + 1 : total / rq.getRecord();
@ -565,13 +610,22 @@ public class BasFlightService {
return response; return response;
} }
// 비행계획서 승인/미승인 /**
* 비행계획서 승인/미승인하는 기능.
* @param rq
* @return
*/
@Transactional @Transactional
public int aprovePlan(BasFlightAprovRq rq) { public int aprovePlan(BasFlightAprovRq rq) {
int cnt = fltPlanBasRepository.updateAprvlYnByPlanSnoIn(rq.getPlanSnoList(), rq.getAprvlYn()); int cnt = fltPlanBasRepository.updateAprvlYnByPlanSnoIn(rq.getPlanSnoList(), rq.getAprvlYn());
return cnt; return cnt;
} }
/**
* 비행경로 체크하는 기능.
* @param rq
* @return
*/
public boolean checkAirspaceContains(List<BasFlightPlanAreaModel> rq) { public boolean checkAirspaceContains(List<BasFlightPlanAreaModel> rq) {
boolean result = false; boolean result = false;
@ -599,7 +653,12 @@ public class BasFlightService {
} }
//지역 검색 /**
* 지역 검색하는 기능
* @param apiUrl
* @param requestHeaders
* @return
*/
public String searchArea(String apiUrl, Map<String, String> requestHeaders) { public String searchArea(String apiUrl, Map<String, String> requestHeaders) {
HttpURLConnection con = connect(apiUrl); HttpURLConnection con = connect(apiUrl);
try { try {
@ -649,6 +708,11 @@ public class BasFlightService {
} }
} }
/**
* 검색날짜 조건으로 비행스케줄 조회하는 기능.
* @param searchDate
* @return
*/
public List<BasFlightScheduleRs> findSchecdule(String searchDate) { public List<BasFlightScheduleRs> findSchecdule(String searchDate) {
List<BasFlightScheduleRs> schedule = fltPlanQueryRepository.findSchedule(searchDate); List<BasFlightScheduleRs> schedule = fltPlanQueryRepository.findSchedule(searchDate);
@ -656,8 +720,17 @@ public class BasFlightService {
return schedule; return schedule;
} }
/**
* 지역과 날씨에 대한 정보를 얻는 기능.
* @param rq
* @return
* @throws IOException
* @throws ParseException
*/
public JSONObject getWeather(BasFlightWeatherModel rq) throws IOException, 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("serviceKey", "UTF-8") + weatherKey);
urlBuilder.append("&" + URLEncoder.encode("pageNo", "UTF-8") + "=" + URLEncoder.encode(rq.getPageNo(), "UTF-8")); 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")); /*한 페이지 결과 수*/ urlBuilder.append("&" + URLEncoder.encode("numOfRows", "UTF-8") + "=" + URLEncoder.encode(rq.getNumOfRows(), "UTF-8")); /*한 페이지 결과 수*/
@ -684,7 +757,7 @@ public class BasFlightService {
sb.append(line); sb.append(line);
} }
CtrTrnsLctnModel weatherResult = ctrTrnsLctnService.convertLatlonToAddress(rq.getNx2(), rq.getNy2()); CtrTrnsLctnModel weatherResult = ctrTrnsLctnService.convertLatlonToAddress(rq.getNx2(), rq.getNy2()); // 위치에 맞는 값에 대한 주소로 변환하는 기능.
log.info("weatherResult >>>> : {}", weatherResult); 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; 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.BasGroupAprvModel;
import com.palnet.biz.api.bas.group.model.BasGroupAprvRqModel; 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.bas.group.service.BasGroupAprvService;
import com.palnet.biz.api.comn.model.ComnPagingRs; import com.palnet.biz.api.comn.model.ComnPagingRs;
import com.palnet.biz.api.comn.response.BasicResponse; 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.biz.api.comn.response.SuccessResponse;
import com.palnet.comn.code.RSErrorCode; 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 io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor; 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 @RestController
@RequiredArgsConstructor @RequiredArgsConstructor
@RequestMapping(value = "/api/bas/group/aprv", produces = {MediaType.APPLICATION_JSON_VALUE}) @RequestMapping(value = "/api/bas/group/aprv", produces = {MediaType.APPLICATION_JSON_VALUE})
@Tag(name = "그룹 승인 컨트롤러", description = "그룹 가입 승인 관련 API") @Tag(name = "그룹 승인", description = "그룹 가입 승인 관련 API")
public class BasGroupAprvController { public class BasGroupAprvController {
@Autowired @Autowired
@ -45,8 +42,7 @@ public class BasGroupAprvController {
* @return * @return
*/ */
@GetMapping(value = "/list") @GetMapping(value = "/list")
@ApiOperation(value = "승인요청 조회") @Operation(summary = "승인요청 조회", description = "그룹내에 그룹회원들의 승인항목들을 조회합니다.")
@Tag(name = "그룹 승인 컨트롤러", description = "그룹 가입 승인 관련 API")
public ResponseEntity<? extends BasicResponse> list(BasGroupAprvRqModel rq) { public ResponseEntity<? extends BasicResponse> list(BasGroupAprvRqModel rq) {
ComnPagingRs<BasGroupAprvModel> result = null; ComnPagingRs<BasGroupAprvModel> result = null;
// log.debug(">>>>" + rq.toString()); // log.debug(">>>>" + rq.toString());
@ -76,18 +72,25 @@ public class BasGroupAprvController {
* @return * @return
*/ */
@PutMapping(value = "/update") @PutMapping(value = "/update")
@ApiOperation(value = "승인처리 / 승인취소 처리") @Operation(summary = "승인처리", description = "그룹내에 그룹회원들의 승인처리를 진행합니다. [승인/미승인 처리]")
@Tag(name = "그룹 승인 컨트롤러", description = "그룹 가입 승인 관련 API") // @ApiOperation(value = "승인처리 / 승인취소 처리")
public ResponseEntity<? extends BasicResponse> update(@RequestBody BasGroupAprvModel rq) { // @Tag(name = "그룹 승인 컨트롤러", description = "그룹 가입 승인 관련 API")
public ResponseEntity<? extends BasicResponse> update(@RequestBody BasGroupAprvlUpdateRQ rq) {
Map<String , Object> resultMap = new HashMap<String,Object>(); 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())) { if(StringUtils.isEmpty(rq.getCstmrGroupSno())) {
return ResponseEntity.status(HttpStatus.OK) return ResponseEntity.status(HttpStatus.OK)
.body(new ErrorResponse(RSErrorCode.ER_PARAM)); .body(new ErrorResponse(RSErrorCode.ER_PARAM));
} }
try { try {
boolean result = service.update(rq); boolean result = service.update(model);
resultMap.put("result", result); resultMap.put("result", result);

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

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

67
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; 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.BasGroupUserListModel;
import com.palnet.biz.api.bas.group.model.BasGroupUserModel; 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.bas.group.service.BasGroupUserService;
import com.palnet.biz.api.comn.model.ComnPagingRs; import com.palnet.biz.api.comn.model.ComnPagingRs;
import com.palnet.biz.api.comn.response.BasicResponse; 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.code.RSErrorCode;
import com.palnet.comn.exception.CustomException; 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 io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor; 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 @RestController
@RequiredArgsConstructor @RequiredArgsConstructor
@RequestMapping(value = "/api/bas/group/user", produces = {MediaType.APPLICATION_JSON_VALUE}) @RequestMapping(value = "/api/bas/group/user", produces = {MediaType.APPLICATION_JSON_VALUE})
@Tag(name = "그룹 사용자 컨트롤러", description = "그룹 사용자 관련 API") @Tag(name = "그룹 사용자", description = "그룹 사용자 관련 API")
public class BasGroupUserController { public class BasGroupUserController {
@Autowired
private final BasGroupUserService service; private final BasGroupUserService service;
@GetMapping(value = "/list") @GetMapping(value = "/list")
@ApiOperation(value = "그룹 사용자 조회") @Operation(summary = "그룹 참여자 조회", description = "검색조건에 맞춰 그룹 참여자를 조회합니다.")
@Tag(name = "그룹 사용자 컨트롤러", description = "그룹 사용자 관련 API")
public ResponseEntity<? extends BasicResponse> list(BasGroupUserListModel rq) { public ResponseEntity<? extends BasicResponse> list(BasGroupUserListModel rq) {
ComnPagingRs<BasGroupUserModel> result = null; ComnPagingRs<BasGroupUserModel> result = null;
@ -68,13 +63,15 @@ public class BasGroupUserController {
@PutMapping(value = "/update") @PutMapping(value = "/update")
@ApiOperation(value = "그룹 사용자 권한 수정") @Operation(summary = "그룹 참여자 권한 수정", description = "그룹 참여자 권한을 수정합니다.")
@Tag(name = "그룹 사용자 컨트롤러", description = "그룹 사용자 관련 API") public ResponseEntity<? extends BasicResponse> update(@RequestBody BasGroupUserUpdateRQ rq) {
public ResponseEntity<? extends BasicResponse> update(@RequestBody BasGroupUserModel rq) {
Map<String , Object> resultMap = new HashMap<String,Object>(); Map<String , Object> resultMap = new HashMap<String,Object>();
BasGroupUserModel model = new BasGroupUserModel();
BeanUtils.copyProperties(rq, model);
try { try {
boolean result = service.update(rq); boolean result = service.update(model);
resultMap.put("result", result); resultMap.put("result", result);
@ -89,13 +86,17 @@ public class BasGroupUserController {
} }
@PutMapping(value = "/delegate") @PutMapping(value = "/delegate")
@ApiOperation(value = "MASTER 권한 위임") @Operation(summary = "MASTER 권한 위임", description = "Master 권한을 위임합니다.")
@Tag(name = "그룹 사용자 컨트롤러", description = "그룹 사용자 관련 API") // @ApiOperation(value = "MASTER 권한 위임")
public ResponseEntity<? extends BasicResponse> delegate(@RequestBody List<BasGroupUserModel> rq) { // @Tag(name = "그룹 사용자 컨트롤러", description = "그룹 사용자 관련 API")
public ResponseEntity<? extends BasicResponse> delegate(@RequestBody List<BasGroupUserUpdateRQ> rq) {
Map<String, Object> resultMap = new HashMap<String, Object>(); Map<String, Object> resultMap = new HashMap<String, Object>();
List<BasGroupUserModel> model = new ArrayList<>();
BeanUtils.copyProperties(rq, model);
try { try {
boolean result = service.delegate(rq); boolean result = service.delegate(model);
resultMap.put("result", result); resultMap.put("result", result);
} catch (CustomException e) { } catch (CustomException e) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) 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 com.palnet.biz.api.comn.model.ComnRqModel;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
@ -9,14 +10,19 @@ import lombok.EqualsAndHashCode;
@EqualsAndHashCode(callSuper=false) @EqualsAndHashCode(callSuper=false)
public class BasGroupAprvRqModel extends ComnRqModel { public class BasGroupAprvRqModel extends ComnRqModel {
@Schema(description = "그룹명" , example = "KAC" , implementation = String.class)
private String groupNm; private String groupNm;
@Schema(description = "회원이름[그룹내 회원명으로 검색해야합니다.]" , example = "한국공항공사" , implementation = String.class)
private String memberName; private String memberName;
@Schema(description = "승인여부" , example = "Y" , implementation = String.class)
private String aprvYn; private String aprvYn;
@Schema(description = "회원일련번호" , example = "2" , implementation = Integer.class)
private Integer cstmrSno; private Integer cstmrSno;
@Schema(description = "그룹코드" , example = "C807F9" , implementation = String.class)
private String groupId; 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 com.palnet.biz.api.comn.model.ComnRqModel;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
@ -9,10 +10,13 @@ import lombok.EqualsAndHashCode;
@EqualsAndHashCode(callSuper=false) @EqualsAndHashCode(callSuper=false)
public class BasGroupJoinRqModel extends ComnRqModel{ public class BasGroupJoinRqModel extends ComnRqModel{
@Schema(description = "그룹명", example = "PAL_KAC", implementation = String.class)
private String groupNm; private String groupNm;
@Schema(description = "그룹코드", example = "HDU123", implementation = String.class)
private String groupId; private String groupId;
@Schema(description = "회원일련번호", example = "2", implementation = Integer.class)
private Integer cstmrSno; 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 com.palnet.biz.api.comn.model.ComnRqModel;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
@ -9,8 +10,10 @@ import lombok.EqualsAndHashCode;
@EqualsAndHashCode(callSuper=false) @EqualsAndHashCode(callSuper=false)
public class BasGroupRqModel extends ComnRqModel{ public class BasGroupRqModel extends ComnRqModel{
@Schema(description = "그룹명", example = "KAC", implementation = String.class)
private String groupNm; private String groupNm;
@Schema(description = "그룹아이디", example = "C807F9", implementation = String.class)
private String groupId; 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;
}

8
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 com.palnet.biz.api.comn.model.ComnPagingModel;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
@ -9,9 +10,12 @@ import lombok.EqualsAndHashCode;
@EqualsAndHashCode(callSuper=false) @EqualsAndHashCode(callSuper=false)
public class BasGroupUserListModel extends ComnPagingModel{ public class BasGroupUserListModel extends ComnPagingModel{
@Schema(description = "그룹에 참여한 회원 명", example = "팔네트웍스", implementation = String.class)
private String memberName; private String memberName;
@Schema(description = "그룹아이디", example = "C807F9", implementation = String.class)
private String groupId; 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;
}

31
pav-server/src/main/java/com/palnet/biz/api/bas/group/service/BasGroupService.java

@ -42,7 +42,10 @@ public class BasGroupService {
@Autowired @Autowired
private JwtTokenUtil jwtTokenUtil; private JwtTokenUtil jwtTokenUtil;
/**
* 그룹코드를 생성하는 기능.
* @return
*/
public String createid() { public String createid() {
String groupId = ""; String groupId = "";
@ -59,20 +62,19 @@ public class BasGroupService {
} }
/** /**
* 나의 그룹 목록 * 내가 만든 그룹 목록조회하는 기능.
* @param cstmrSno * @param cstmrSno
* @return * @return
*/ */
public List<BasGroupModel> mylist(int cstmrSno){ public List<BasGroupModel> mylist(int cstmrSno){
List<BasGroupModel> resultList = query.mylist(cstmrSno); List<BasGroupModel> resultList = query.mylist(cstmrSno); // 데이터베이스에서 cstmrSno에 맞춰 내가 만든 그룹을 조회하는 기능.
return resultList; return resultList;
} }
/** /**
* 그룹 목록 * 그룹 목록조회하는 기능.
* @param cstmrSno * @param cstmrSno
* @return * @return
*/ */
@ -81,7 +83,7 @@ public class BasGroupService {
String appAuth = jwtTokenUtil.getUserAuthByToken(); String appAuth = jwtTokenUtil.getUserAuthByToken();
List<BasGroupJoinModel> resultList = new ArrayList<>(); List<BasGroupJoinModel> resultList = new ArrayList<>();
if("SUPER".equals(appAuth)||"ADMIN".equals(appAuth)) { if("SUPER".equals(appAuth)||"ADMIN".equals(appAuth)) {
resultList = query.groupAdminList(cstmrSno); resultList = query.groupAdminList(cstmrSno); // Super, Admin권한으로 그룹을 조회하는 SQL 기능.
} else { } else {
resultList = query.groupUserList(cstmrSno); resultList = query.groupUserList(cstmrSno);
} }
@ -90,7 +92,7 @@ public class BasGroupService {
} }
/** /**
* 나의 그룹 - 참여 그룹 목록 * 나의 그룹 - 참여 그룹 목록 조회하는 기능.
* @param cstmrSno * @param cstmrSno
* @return * @return
*/ */
@ -102,20 +104,20 @@ public class BasGroupService {
} }
/** /**
* 전체 그룹 목록 * 전체 그룹 목록하는 기능.
* @param rq * @param rq
* @return * @return
*/ */
public List<BasGroupModel> list(BasGroupRqModel rq){ public List<BasGroupModel> list(BasGroupRqModel rq){
List<BasGroupModel> resultList = query.list(rq); List<BasGroupModel> resultList = query.list(rq); // 전체 그룹을 조회하는 SQL기능
return resultList; return resultList;
} }
/** /**
* 그룹 상세 조회 * 그룹아이디[groupId] 상세 조회하는 기능.
* @param groupId * @param groupId
* @return * @return
* @throws Exception * @throws Exception
@ -134,13 +136,12 @@ public class BasGroupService {
BeanUtils.copyProperties(entity , model); BeanUtils.copyProperties(entity , model);
return model; return model;
} }
/** /**
* 그룹 생성 * 그룹 생성하는 기능.
* @param rq * @param rq
* @return * @return
* @throws Exception * @throws Exception
@ -188,7 +189,7 @@ public class BasGroupService {
} }
/** /**
* 그룹 수정 * 그룹 수정하는 기능.
* @param rq * @param rq
* @return * @return
* @throws Exception * @throws Exception
@ -222,7 +223,7 @@ public class BasGroupService {
} }
/** /**
* 그룹 삭제 * 그룹아이디[groupId] 삭제하는 기능.
* @param groupId * @param groupId
* @return * @return
* @throws Exception * @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.BasLaancAprvListRq;
import com.palnet.biz.api.bas.laanc.model.BasLaancAprvRs; import com.palnet.biz.api.bas.laanc.model.BasLaancAprvRs;
import com.palnet.biz.api.bas.laanc.service.BasLaancAprvService; 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.BasicResponse;
import com.palnet.biz.api.comn.response.ErrorResponse; import com.palnet.biz.api.comn.response.ErrorResponse;
import com.palnet.biz.api.comn.response.SuccessResponse; import com.palnet.biz.api.comn.response.SuccessResponse;
import com.palnet.comn.exception.CustomException; 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 io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@ -46,12 +54,13 @@ public class BasLaancAprvController {
/** /**
* laanc 승인 목록 * laanc 승인 목록
*
* @param rq * @param rq
* @param pageable * @param pageable
* @return * @return
*/ */
@ApiOperation(value = "LAANC 승인 목록") @Deprecated
@Tag(name = "LAANC 승인", description = "LAANC 승인 관련 API") @Operation(summary = "LAANC 승인 목록", description = "LAANC 승인 목록")
@GetMapping("/list") @GetMapping("/list")
public ResponseEntity<? extends BasicResponse> getLaancAprvList(BasLaancAprvListRq rq, Pageable pageable) { public ResponseEntity<? extends BasicResponse> getLaancAprvList(BasLaancAprvListRq rq, Pageable pageable) {
Page<BasLaancAprvRs> rs = null; 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.getContent()));
} }
return ResponseEntity.ok().body(new SuccessResponse<>(rs)); 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") @GetMapping("/list2")
public ResponseEntity<? extends BasicResponse> getLaancAprvList2(BasLaancAprvListRq rq) { public ResponseEntity<? extends BasicResponse> getLaancAprvList2(BasLaancAprvListRq rq) {
List<BasLaancAprvRs> rs = null; List<BasLaancAprvRs> rs = null;
@ -107,11 +128,19 @@ public class BasLaancAprvController {
/** /**
* laanc 승인 상세 * laanc 승인 상세
*
* @param planSno * @param planSno
* @return * @return
*/ */
@ApiOperation(value = "LAANC 승인 상세 조회") @Operation(summary = "LAANC 승인 상세 조회", description = "LAANC 승인 상세 조회")
@Tag(name = "LAANC 승인", description = "LAANC 승인 관련 API") @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}") @GetMapping("/detail/{planSno}")
public ResponseEntity<? extends BasicResponse> getLaancAprvDetail(@PathVariable("planSno") String planSno) { public ResponseEntity<? extends BasicResponse> getLaancAprvDetail(@PathVariable("planSno") String planSno) {
BasLaancAprvRs rs = null; 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.BasicResponse;
import com.palnet.biz.api.comn.response.ErrorResponse; import com.palnet.biz.api.comn.response.ErrorResponse;
import com.palnet.biz.api.comn.response.SuccessResponse; import com.palnet.biz.api.comn.response.SuccessResponse;
import com.palnet.biz.api.external.model.PilotValidRs;
import com.palnet.comn.exception.CustomException; 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 io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType; import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
@ -42,10 +43,18 @@ public class BasLaancController {
private final BasLaancService basLaancService; 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") @PostMapping(value = "/plan/valid")
@ApiOperation(value = "LAANC 검증")
@Tag(name = "LAANC", description = "LAANC 관련 API")
public ResponseEntity<? extends BasicResponse> validationLaanc(@RequestBody BasLaancPlanRq rq) { public ResponseEntity<? extends BasicResponse> validationLaanc(@RequestBody BasLaancPlanRq rq) {
BasLaancValidatedRs rs = null; BasLaancValidatedRs rs = null;
@ -71,10 +80,15 @@ public class BasLaancController {
return ResponseEntity.ok().body(new SuccessResponse<>(rs)); return ResponseEntity.ok().body(new SuccessResponse<>(rs));
} }
// 비행계획서 등록, 약관 등록, 공문 생성 /**
* LAANC 신청(비행계획서 등록, 약관 등록, 공문 생성)
*
* @param rq
* @return
*/
@Operation(summary = "LAANC 신청", description = "LAANC 신청(비행계획서 등록, 약관 등록, 공문 생성)")
@ApiResponse(responseCode = "200", description = "성공")
@PostMapping(value = "/plan/create") @PostMapping(value = "/plan/create")
@ApiOperation(value = "비행계획서 등록")
@Tag(name = "LAANC", description = "LAANC 관련 API")
public ResponseEntity<? extends BasicResponse> createPlan(@RequestBody BasLaancPlanRq rq) { public ResponseEntity<? extends BasicResponse> createPlan(@RequestBody BasLaancPlanRq rq) {
BasLaancLastRs rs = null; BasLaancLastRs rs = null;
try { try {
@ -95,11 +109,17 @@ public class BasLaancController {
return ResponseEntity.ok().body(new SuccessResponse<>(rs)); return ResponseEntity.ok().body(new SuccessResponse<>(rs));
} }
// 허용고도 조회 /**
* 허용고도 조회
*
* @param rq
* @return
*/
@Operation(summary = "비행구역 허용고도 조회", description = "좌표에 해당하는 허용고도 조회")
@ApiResponse(responseCode = "200", description = "성공")
@PostMapping(value = "/valid/elev") @PostMapping(value = "/valid/elev")
@ApiOperation(value = "비행구역 허용고도 조회") public ResponseEntity<? extends BasicResponse> getAllowableElevation(@RequestBody List<BasLaancAreaByElevModel> rq
@Tag(name = "LAANC", description = "LAANC 관련 API") ) {
public ResponseEntity<? extends BasicResponse> getAllowableElevation(@RequestBody List<BasLaancAreaModel> rq) {
List<Integer> rs = null; List<Integer> rs = null;
try { try {
rs = basLaancService.getAllowableElevation(rq); 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") @PostMapping(value = "/valid/ts/pilot")
@ApiOperation(value = "TS 연동 - 비행자격 조회(조종사 자격증명, 기체보험 여부)")
@Tag(name = "LAANC", description = "LAANC 관련 API")
public ResponseEntity<? extends BasicResponse> getTsValid(@RequestBody List<String> idntfNumList) { public ResponseEntity<? extends BasicResponse> getTsValid(@RequestBody List<String> idntfNumList) {
BasLaancTsRs rs = null; BasLaancTsRs rs = null;
try { try {
@ -134,7 +160,7 @@ public class BasLaancController {
resultMap.put("result", false); resultMap.put("result", false);
resultMap.put("errorCode", e.getErrorCode()); resultMap.put("errorCode", e.getErrorCode());
resultMap.put("errorMessage", e.getMessage()); resultMap.put("errorMessage", e.getMessage());
return ResponseEntity.ok().body(new SuccessResponse<Map>(resultMap)); return ResponseEntity.ok().body(new SuccessResponse<>(resultMap));
} catch (Exception e) { } catch (Exception e) {
log.error("IGNORE : ", e); log.error("IGNORE : ", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
@ -144,11 +170,16 @@ public class BasLaancController {
return ResponseEntity.ok().body(new SuccessResponse<>(rs)); return ResponseEntity.ok().body(new SuccessResponse<>(rs));
} }
// 허용고도 조회 /**
* 공역(금지구역) 포함 여부
*
* @param rq
* @return
*/
@Operation(summary = "공역(금지구역) 포함 여부", description = "공역(금지구역) 포함 여부")
@ApiResponse(responseCode = "200", description = "성공")
@PostMapping(value = "/valid/duplicated/airspace") @PostMapping(value = "/valid/duplicated/airspace")
@ApiOperation(value = "공역(금지구역) 포함 여부") public ResponseEntity<? extends BasicResponse> getDuplicatedAirspace(@RequestBody List<BasLaancAreaByAirspaceModel> rq) {
@Tag(name = "LAANC", description = "LAANC 관련 API")
public ResponseEntity<? extends BasicResponse> getDuplicatedAirspace(@RequestBody List<BasLaancAreaModel> rq) {
List<BasLaancDuplicatedAirspaceRs> rs = null; List<BasLaancDuplicatedAirspaceRs> rs = null;
try { try {
rs = basLaancService.getDuplicatedAirspace(rq); rs = basLaancService.getDuplicatedAirspace(rq);
@ -158,7 +189,7 @@ public class BasLaancController {
resultMap.put("result", false); resultMap.put("result", false);
resultMap.put("errorCode", e.getErrorCode()); resultMap.put("errorCode", e.getErrorCode());
resultMap.put("errorMessage", e.getMessage()); resultMap.put("errorMessage", e.getMessage());
return ResponseEntity.ok().body(new SuccessResponse<Map>(resultMap)); return ResponseEntity.ok().body(new SuccessResponse<>(resultMap));
} catch (Exception e) { } catch (Exception e) {
log.error("IGNORE : ", e); log.error("IGNORE : ", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
@ -168,4 +199,67 @@ public class BasLaancController {
return ResponseEntity.ok().body(new SuccessResponse<>(rs)); 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.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.palnet.biz.config.convert.InstantDateStrSerializer; 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.AllArgsConstructor;
import lombok.Builder; import lombok.Builder;
import lombok.Data; import lombok.Data;
@ -27,18 +27,22 @@ import java.time.Instant;
@AllArgsConstructor @AllArgsConstructor
public class BasLaancAprvListRq { public class BasLaancAprvListRq {
@ApiParam(name = "작성자 이름", example = "팔") @Schema(description = "작성자 이름", example = "팔")
private String memberName; private String memberName;
@ApiParam(name = "신청(등록)시작일자", example = "2023-12-12")
@Schema(description = "신청(등록)시작일자", example = "2023-12-12", implementation = String.class)
@JsonSerialize(using = InstantDateStrSerializer.class) @JsonSerialize(using = InstantDateStrSerializer.class)
private Instant createStDate; private Instant createStDate;
@ApiParam(name = "신청(등록)종료일자", example = "2023-12-12")
@Schema(description = "신청(등록)종료일자", example = "2023-12-12", implementation = String.class)
@JsonSerialize(using = InstantDateStrSerializer.class) @JsonSerialize(using = InstantDateStrSerializer.class)
private Instant createEndDate; private Instant createEndDate;
@ApiParam(name = "비행시작일자", example = "2023-12-12")
@Schema(description = "비행시작일자", example = "2023-12-12", implementation = String.class)
@JsonSerialize(using = InstantDateStrSerializer.class) @JsonSerialize(using = InstantDateStrSerializer.class)
private Instant schFltStDate; private Instant schFltStDate;
@ApiParam(name = "비행종료일자", example = "2023-12-12")
@Schema(description = "비행종료일자", example = "2023-12-12", implementation = String.class)
@JsonSerialize(using = InstantDateStrSerializer.class) @JsonSerialize(using = InstantDateStrSerializer.class)
private Instant schFltEndDate; 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; 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.ArcrftWghtCd;
import com.palnet.biz.jpa.entity.type.FltPurpose; import com.palnet.biz.jpa.entity.type.FltPurpose;
import com.palnet.biz.jpa.entity.type.FltType; 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.AllArgsConstructor;
import lombok.Builder; import lombok.Builder;
import lombok.Data; import lombok.Data;
@ -35,59 +29,59 @@ import java.util.stream.Collectors;
@NoArgsConstructor @NoArgsConstructor
@AllArgsConstructor @AllArgsConstructor
public class BasLaancAprvRs { public class BasLaancAprvRs {
@ApiParam(name = "비행계획서 일려번호") //비행계획서 일려번호
private Integer planSno; private Integer planSno;
@ApiParam(name = "그룹 아이디", hidden = true) //그룹 아이디
private String groupId; private String groupId;
@ApiParam(name = "작성자 일련번호") //작성자 일련번호
private Integer cstmrSno; private Integer cstmrSno;
@ApiParam(name = "작성자 이름") //작성자 이름
private String memberName; private String memberName;
@ApiParam(name = "작성자 이메일") //작성자 이메일
private String email; private String email;
@ApiParam(name = "작성자 연락처") //작성자 연락처
private String hpno; private String hpno;
@ApiParam(name = "작성자 국가번호(연락처)", hidden = true) //작성자 국가번호(연락처)
private String clncd; private String clncd;
@ApiParam(name = "작성자 주소", hidden = true) //작성자 주소
private String addr; private String addr;
@ApiParam(name = "작성자 상세주소", hidden = true) //작성자 상세주소
private String addrDtlCn; private String addrDtlCn;
@ApiParam(name = "작성자 우편번호", hidden = true) //작성자 우편번호
private String zip; private String zip;
@ApiParam(name = "비행시작일시") //비행시작일시
private Instant schFltStDt; private Instant schFltStDt;
@ApiParam(name = "비행종료일시") //비행종료일시
private Instant schFltEndDt; private Instant schFltEndDt;
@ApiParam(name = "비행목적") //비행목적
private FltPurpose fltPurpose; private FltPurpose fltPurpose;
@ApiParam(name = "상업/비사업 구분") //상업/비사업 구분
private FltType fltType; private FltType fltType;
@ApiParam(name = "상업/비사업 구분 코드") //상업/비사업 구분 코드
private String fltTypeNm; private String fltTypeNm;
@ApiParam(name = "승인여부") //승인여부
private String aprvlYn; private String aprvlYn;
@ApiParam(name = "승인일자") //승인일자
private Instant aprvlDt; private Instant aprvlDt;
// @ApiParam(name = "삭제여부") //삭제여부
// private String delYn; // private String delYn;
@ApiParam(name = "등록자ID") //등록자ID
private String createUserId; private String createUserId;
@ApiParam(name = "등록일시") //등록일시
private Instant createDt; private Instant createDt;
@ApiParam(name = "수정자ID") //수정자ID
private String updateUserId; private String updateUserId;
@ApiParam(name = "수정일시") //수정일시
private Instant updateDt; private Instant updateDt;
@ApiParam(name = "서비스유형") //서비스유형
private String serviceType; private String serviceType;
@ApiParam(name = "기업여부") //기업여부
private String corpRegYn; private String corpRegYn;
@ApiParam(name = "공문URL") //공문URL
private String pdfUrl; private String pdfUrl;
// 하나의 필드로 묶어서 처리 // 하나의 필드로 묶어서 처리
@ApiParam(name = "기체 무게") //기체 무게
public String getArcrftWght() { public String getArcrftWght() {
if (arcrftList == null || arcrftList.isEmpty()) return null; if (arcrftList == null || arcrftList.isEmpty()) return null;
List<ArcrftWghtCd> arcrftWghtCdList = arcrftList.stream().map(BasLaancArcrftModel::getArcrftWghtCd).distinct().filter(Objects::nonNull).collect(Collectors.toList()); List<ArcrftWghtCd> arcrftWghtCdList = arcrftList.stream().map(BasLaancArcrftModel::getArcrftWghtCd).distinct().filter(Objects::nonNull).collect(Collectors.toList());
@ -95,7 +89,7 @@ public class BasLaancAprvRs {
return ArcrftWghtType; return ArcrftWghtType;
} }
@ApiParam(name = "고도") //고도
public String getElev() { public String getElev() {
if (areaList == null || areaList.isEmpty()) return null; if (areaList == null || areaList.isEmpty()) return null;
List<String> elevList = areaList.stream().map(BasLaancAreaModel::getFltElev).distinct().filter(Objects::nonNull).collect(Collectors.toList()); List<String> elevList = areaList.stream().map(BasLaancAreaModel::getFltElev).distinct().filter(Objects::nonNull).collect(Collectors.toList());
@ -103,7 +97,7 @@ public class BasLaancAprvRs {
return elev; return elev;
} }
// @ApiParam(name = "조종사 성명") //조종사 성명
// public String getPilotName() { // public String getPilotName() {
// if (pilotList == null || pilotList.isEmpty()) return null; // if (pilotList == null || pilotList.isEmpty()) return null;
// List<String> pilotNameList = pilotList.stream().map(BasLaancPilotModel::getMemberName).distinct().filter(Objects::nonNull).collect(Collectors.toList()); // 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.config.convert.InstantDateStrSerializer;
import com.palnet.biz.jpa.entity.type.ArcrftTypeCd; import com.palnet.biz.jpa.entity.type.ArcrftTypeCd;
import com.palnet.biz.jpa.entity.type.ArcrftWghtCd; import com.palnet.biz.jpa.entity.type.ArcrftWghtCd;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;
import java.time.Instant; import java.time.Instant;
@Data @Data
public class BasLaancArcrftModel { public class BasLaancArcrftModel {
@Schema(description = "계획서 기체 일련번호", example = "1", hidden = true)
private Integer planArcrftSno; private Integer planArcrftSno;
@Schema(description = "비행계획서 일련번호", example = "1", hidden = true)
private Integer planSno; private Integer planSno;
@Schema(description = "기체 일련번호", example = "1", hidden = true)
private Integer arcrftSno; private Integer arcrftSno;
@Schema(description = "식별번호(기체번호)", example = "PA0001")
private String idntfNum; private String idntfNum;
@Schema(description = "그룹명", example = "한국공항공사", hidden = true)
private String groupNm; private String groupNm;
@Schema(description = "제작번호", example = "123101-13", hidden = true)
private String prdctNum; private String prdctNum;
@Schema(description = "기체종류코드", example = "01", hidden = true)
private ArcrftTypeCd arcrftTypeCd; private ArcrftTypeCd arcrftTypeCd;
@Schema(description = "기체모델명", example = "M-01", hidden = true)
private String arcrftModelNm; private String arcrftModelNm;
@Schema(description = "제작자", example = "DJI", hidden = true)
private String prdctCmpnNm; private String prdctCmpnNm;
@Schema(description = "제작일자", example = "2022-01-01", hidden = true)
@JsonSerialize(using = InstantDateStrSerializer.class) @JsonSerialize(using = InstantDateStrSerializer.class)
private Instant prdctDate; private Instant prdctDate;
@Schema(description = "기체길이", example = "1.0", hidden = true)
private double arcrftLngth; private double arcrftLngth;
@Schema(description = "길체폭", example = "1.1", hidden = true)
private double arcrftWdth; private double arcrftWdth;
@Schema(description = "기체높이", example = "1.0", hidden = true)
private double arcrftHght; private double arcrftHght;
@Schema(description = "기체중량", example = "1.5", hidden = true)
private double arcrftWght; private double arcrftWght;
@Schema(description = "중량구분코드", hidden = true)
private String wghtTypeCd; private String wghtTypeCd;
@Schema(description = "이미지URL", example = "http://www.imageurl.co.kr/image/url", hidden = true)
private String imageUrl; private String imageUrl;
@Schema(description = "최대이륙중량", example = "10", hidden = true)
private double takeoffWght; private double takeoffWght;
@Schema(description = "사용여부", hidden = true)
private String useYn; private String useYn;
@Schema(description = "카메라탑재여부", example = "N")
private String cameraYn; private String cameraYn;
@Schema(description = "보험가입여부", example = "Y")
private String insrncYn; private String insrncYn;
@Schema(description = "소유자명(법인명)", example = "팔네트웍스")
private String ownerNm; private String ownerNm;
@Schema(description = "생성자ID", hidden = true)
private String createUserId; private String createUserId;
@Schema(description = "생성일시", hidden = true)
private Instant createDt; private Instant createDt;
@Schema(description = "수정자ID", hidden = true)
private String updateUserId; private String updateUserId;
@Schema(description = "수정일시", hidden = true)
private Instant updateDt; private Instant updateDt;
@Schema(hidden = true)
private String docState = "R"; private String docState = "R";
@Schema(description = "식별장치종류코드", example = "DRON", hidden = true)
private String idntfTypeCd; private String idntfTypeCd;
// kac 추가 필드 // kac 추가 필드
@Schema(description = "기체보험유무", example = "Y")
private String acrftInsuranceYn; private String acrftInsuranceYn;
@Schema(description = "보험유효기간", hidden = true)
@JsonSerialize(using = InstantDateStrSerializer.class) @JsonSerialize(using = InstantDateStrSerializer.class)
private Instant insuranceExperiod; private Instant insuranceExperiod;
@Schema(description = "법인명", hidden = true)
private String corporationNm; private String corporationNm;
@Schema(description = "자체중량코드", example = "10")
private ArcrftWghtCd arcrftWghtCd; // 기체 무게 코드 ---- 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; package com.palnet.biz.api.bas.laanc.model;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;
import java.time.Instant; import java.time.Instant;
@Data @Data
public class BasLaancAreaCoordModel { public class BasLaancAreaCoordModel {
@Schema(description = "비행구역좌표 일련번호", example = "1")
private Integer planAreaCoordSno; private Integer planAreaCoordSno;
@Schema(description = "비행계획비행구역 일련번호", example = "1")
private Integer planAreaSno; private Integer planAreaSno;
@Schema(description = "위도", example = "127.33")
private double lat; private double lat;
@Schema(description = "경도", example = "37.99")
private double lon; private double lon;
@Schema(description = "생성자ID", hidden = true)
private String createUserId; private String createUserId;
@Schema(description = "생성일시", hidden = true)
private Instant createDt; private Instant createDt;
@Schema(hidden = true)
private String docState = "R"; private String docState = "R";
} }

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

24
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; 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.acnt.cstmr.model.AnctCstmrTermsModel;
import com.palnet.biz.api.external.model.PilotValidRs; 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.FltPurpose;
import com.palnet.biz.jpa.entity.type.FltType; import com.palnet.biz.jpa.entity.type.FltType;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;
import java.time.Instant; import java.time.Instant;
@ -11,18 +14,37 @@ import java.util.List;
@Data @Data
public class BasLaancPlanRq { public class BasLaancPlanRq {
@Schema(description = "비행계획서 일련번호", example = "1", hidden = true)
private Integer planSno; private Integer planSno;
private Integer cstmrSno;
@Schema(description = "사용자 일련번호", example = "1", hidden = true)
private Integer cstmrSno;
@Schema(description = "이름", example = "조종사")
private String memberName; private String memberName;
@Schema(description = "비행유형", example = "COMMERCIAL")
private FltType fltType; // 비행유형 - 상업/비상업 ---- private FltType fltType; // 비행유형 - 상업/비상업 ----
@Schema(description = "비행시작일시", example = "2024-02-12 09:00:00", implementation = String.class)
@JsonSerialize(using = InstantDatetimeStrSerializer.class)
private Instant schFltStDt; // 시작일시 private Instant schFltStDt; // 시작일시
@Schema(description = "비행종료일시", example = "2024-02-12 10:00:00", implementation = String.class)
@JsonSerialize(using = InstantDatetimeStrSerializer.class)
private Instant schFltEndDt; // 종료일시 private Instant schFltEndDt; // 종료일시
@Schema(description = "비행목적", example = "17")
private FltPurpose fltPurpose; // 비행목적 ----- private FltPurpose fltPurpose; // 비행목적 -----
@Schema(description = "서비스구분", example = "KAC")
private String serviceType; // 고정 private String serviceType; // 고정
@Schema(hidden = true)
private String docState = "R"; private String docState = "R";
private List<BasLaancAreaModel> areaList; private List<BasLaancAreaModel> areaList;
// private List<BasFlightPlanPilotModel> pilotList; // private List<BasFlightPlanPilotModel> pilotList;
private List<BasLaancArcrftModel> arcrftList; 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; 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.AllArgsConstructor;
import lombok.Builder; import lombok.Builder;
import lombok.Data; import lombok.Data;
@ -25,6 +23,6 @@ import java.util.List;
@AllArgsConstructor @AllArgsConstructor
@Builder @Builder
public class BasLaancTsRq { public class BasLaancTsRq {
@ApiParam(name = "기체신고번호", collectionFormat = ",") // @ApiParam(name = "기체신고번호", collectionFormat = ",")
private List<String> IdntfNumList; 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; 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.AllArgsConstructor;
import lombok.Builder; import lombok.Builder;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import java.util.List;
/** /**
* packageName : com.palnet.biz.api.bas.laanc.model * packageName : com.palnet.biz.api.bas.laanc.model
* fileName : BasLaancValidatedRs * fileName : BasLaancValidatedRs
@ -26,66 +22,39 @@ import java.util.List;
@AllArgsConstructor @AllArgsConstructor
public class BasLaancValidatedRs { 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 isEvaluatedTargetArea; // 평가대상지역여부 - 공역과 겹칠때만 true
private boolean isFlightArea; // 비행가능여부 - 비행가능 true // 고도
private boolean isElev; // 고도여부 - 관제권내 설정고도 이하, 권제권밖 150m 이하 true
// 기체중량
private boolean isArcrftWeight; // 항공기중량여부 - 25kg 이하 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() { public boolean isValid() {
if (isReport) { return !isNonAprove() && !isNonAproveFlight();
return isPilotQlfc
&& isArcrftInsurance
// && !isArcrftDuplicated // 기체 중복여부
// && !isPlanAreaDuplicatd // 비행구역 중복여부
&& isFlightArea // 비행가능여부
&& isCheckingLance();
}
return isFlightArea
// && !isPlanAreaDuplicatd
// && !isArcrftDuplicated
&& isCheckingLance();
} }
// 미승인
public boolean isFlight() { public boolean isNonAprove() {
return !isCheckingLance() || isValid(); return isFltMethod && !isSpacialFlight && isElev && isPilotQlfc && isArcrftInsurance;
} }
// 비행가능여부(미승인-날수있음)
// LAANC 승인 대상 여부 public boolean isNonAproveFlight() {
@JsonIgnore return !isCommercial && !isEvaluatedTargetArea && isElev && isArcrftWeight;
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 * @param pageable
* @return * @return
*/ */
@Deprecated
public Page<BasLaancAprvRs> getLaancAprvList(BasLaancAprvListRq rq, Pageable pageable) { public Page<BasLaancAprvRs> getLaancAprvList(BasLaancAprvListRq rq, Pageable pageable) {
LaancAprvSearchDto searchDto = BasLaancAprvMapper.MAPPER.toDto(rq); LaancAprvSearchDto searchDto = BasLaancAprvMapper.MAPPER.toDto(rq);
Page<LaancPlanDto> result = fltPlanQueryRepository.findAllAprvListBySearch(searchDto, pageable); Page<LaancPlanDto> result = fltPlanQueryRepository.findAllAprvListBySearch(searchDto, pageable);
Page<BasLaancAprvRs> rs = PageUtils.convert(result, BasLaancAprvMapper.MAPPER.toRsList(result.getContent())); return PageUtils.convert(result, BasLaancAprvMapper.MAPPER.toRsList(result.getContent()));
return rs;
} }
/**
* laanc 승인 목록
*
* @param rq
* @return
*/
public List<BasLaancAprvRs> getLaancAprvList2(BasLaancAprvListRq rq) { public List<BasLaancAprvRs> getLaancAprvList2(BasLaancAprvListRq rq) {
LaancAprvSearchDto searchDto = BasLaancAprvMapper.MAPPER.toDto(rq); LaancAprvSearchDto searchDto = BasLaancAprvMapper.MAPPER.toDto(rq);
// 검색조건에 해당하는 비행계획서 조회
List<LaancPlanDto> result = fltPlanQueryRepository.findAllAprvListBySearch2(searchDto); List<LaancPlanDto> result = fltPlanQueryRepository.findAllAprvListBySearch2(searchDto);
// 비행계획서에 해당하는 파일의 그룹NO 추출 - PDF URL을 가져오기 위함
List<Integer> fileGroupNoList = result.stream().map(LaancPlanDto::getFileGroupNo).filter(Objects::nonNull).collect(Collectors.toList()); List<Integer> fileGroupNoList = result.stream().map(LaancPlanDto::getFileGroupNo).filter(Objects::nonNull).collect(Collectors.toList());
// 파일 정보 조회
List<ComnFileModel> fileListByGroupNoList = comnFileService.getFileListByGroupNoList(fileGroupNoList); List<ComnFileModel> fileListByGroupNoList = comnFileService.getFileListByGroupNoList(fileGroupNoList);
// 파일 정보(PDF)를 비행계획서에 추가
result.forEach(dto -> { result.forEach(dto -> {
if (dto.getFileGroupNo() != null) { if (dto.getFileGroupNo() != null) {
fileListByGroupNoList.stream() fileListByGroupNoList.stream()
@ -66,9 +80,8 @@ public class BasLaancAprvService {
.ifPresent(file -> dto.setPdfUrl(file.getDownloadUrl())); .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) { public BasLaancAprvRs getLaancAprvDetail(String planSno) {
if (planSno == null) throw new CustomException(ErrorCode.NON_VALID_PARAMETER); if (planSno == null) throw new CustomException(ErrorCode.NON_VALID_PARAMETER);
LaancPlanDto result = fltPlanQueryRepository.findAprvById(Integer.parseInt(planSno)); LaancPlanDto result = fltPlanQueryRepository.findAprvById(Integer.parseInt(planSno));
// PDF URL 추출
if (result != null && result.getFileGroupNo() != null) { if (result != null && result.getFileGroupNo() != null) {
ComnFileModel comnFileModel = comnFileService.getOfficialDocumentFileListByGroupNo(result.getFileGroupNo()); ComnFileModel comnFileModel = comnFileService.getOfficialDocumentFileListByGroupNo(result.getFileGroupNo());
if (comnFileModel != null) result.setPdfUrl(comnFileModel.getDownloadUrl()); if (comnFileModel != null) result.setPdfUrl(comnFileModel.getDownloadUrl());
} }
BasLaancAprvRs rs = BasLaancAprvMapper.MAPPER.toRs(result);
return rs; return BasLaancAprvMapper.MAPPER.toRs(result);
} }
} }

523
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; package com.palnet.biz.api.bas.laanc.service;
import java.time.Instant; import com.google.zxing.WriterException;
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.palnet.biz.api.acnt.cstmr.model.AnctCstmrModel; import com.palnet.biz.api.acnt.cstmr.model.AnctCstmrModel;
import com.palnet.biz.api.acnt.cstmr.model.AnctCstmrTermsModel; import com.palnet.biz.api.acnt.cstmr.model.AnctCstmrTermsModel;
import com.palnet.biz.api.acnt.jwt.utils.JwtTokenUtil; 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.model.LaancPdfModel;
import com.palnet.biz.api.comn.file.service.ComnFileService; 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.model.ComnSmsLaancAprovModel;
import com.palnet.biz.api.comn.sms.service.ComnSmsService; 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.PilotValidRq;
import com.palnet.biz.api.external.model.PilotValidRs; 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.api.external.service.TsService;
import com.palnet.biz.jpa.entity.ComFileBas; import com.palnet.biz.jpa.entity.*;
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.type.ArcrftWghtCd; 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.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.com.ComRiseSetQueryRepository;
import com.palnet.biz.jpa.repository.flt.FltPlanArcrftRepository; import com.palnet.biz.jpa.repository.flt.*;
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.pty.PtyCstmrQueryRepository; import com.palnet.biz.jpa.repository.pty.PtyCstmrQueryRepository;
import com.palnet.biz.jpa.repository.pty.PtyGroupBasRepository; import com.palnet.biz.jpa.repository.pty.PtyGroupBasRepository;
import com.palnet.biz.jpa.repository.pty.PtyTermsAgreeTxnRepository; 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.biz.scheduler.ctr.service.CtrTrnsLctnService;
import com.palnet.comn.code.ErrorCode; import com.palnet.comn.code.ErrorCode;
import com.palnet.comn.exception.CustomException; import com.palnet.comn.exception.CustomException;
import com.palnet.comn.utils.AirspaceUtils; import com.palnet.comn.utils.*;
import com.palnet.comn.utils.AreaUtils;
import com.palnet.comn.utils.HttpUtils;
import com.palnet.comn.utils.InstantUtils;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; 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 * packageName : com.palnet.biz.api.bas.laanc.service
@ -87,76 +82,98 @@ public class BasLaancService {
private final ComnSmsService comnSmsService; private final ComnSmsService comnSmsService;
private final JwtTokenUtil jwtTokenUtil; private final JwtTokenUtil jwtTokenUtil;
private final AreaUtils areaUtils; private final AreaUtils areaUtils;
private final ComRiseSetQueryRepository comRiseSetQueryRepository;
private final ComConfirmBasRepository comConfirmBasRepository;
// LAANC 검증 @Value("${app.host}")
public BasLaancValidatedRs validationLaanc(BasLaancPlanRq rq) { private String APP_HOST;
if (!this.laancParamValid(rq)) throw new CustomException(ErrorCode.NON_VALID_PARAMETER);
BasLaancValidatedRs rs = new BasLaancValidatedRs();
// 조종사 자격 확인 - 무게가 2kg 초과이거나 상업적일 경우에만 진행
// 상업 여부 - 상업(true)
boolean isCommercial = FltType.COMMERCIAL == rq.getFltType();
rs.setCommercial(isCommercial);
// 2kg 초과 기체신고번호 @Value("${external.ts.return.uri}")
List<String> idntfNumList = rq.getArcrftList().stream().filter(arcrft -> arcrft.getArcrftWghtCd() != ArcrftWghtCd.W250G_LOE && arcrft.getArcrftWghtCd() != ArcrftWghtCd.W250G_W2KG).map(BasLaancArcrftModel::getIdntfNum).collect(Collectors.toList()); private String TS_RETURN_URI;
// 신고 여부 - 비상업적이고 기체중량 2kg이하일 경우 - false, 상업적이거나 기체중량 2kg초과일 경우 - true
boolean isReport = !idntfNumList.isEmpty() || isCommercial;
rs.setReport(isReport);
/**
* LAANC 검증
*
* @param rq
* @return
*/
public BasLaancValidatedRs validationLaanc(BasLaancPlanRq rq) {
if (!this.laancParamValid(rq)) throw new CustomException(ErrorCode.NON_VALID_PARAMETER);
// 고도 150m 이하 - true BasLaancValidatedRs rs = new BasLaancValidatedRs();
boolean isElev = rq.getAreaList().stream().anyMatch(area -> area.getFltElev() != null && Integer.parseInt(area.getFltElev()) <= 150);
rs.setElev(isElev);
// 기체중량 25kg 이하
boolean isArcrftWeight = rq.getArcrftList().stream().anyMatch(arcrft -> arcrft.getArcrftWghtCd() != ArcrftWghtCd.W25KG_GO && arcrft.getArcrftWghtCd() != ArcrftWghtCd.W25KG_GO_TEST);
rs.setArcrftWeight(isArcrftWeight);
// TODO start - 조종사 자격 및 기체보험 확인 // TS 자격 판별 - 조종사 자격증명, 기체 보험
if (isReport) { List<String> idntfNumList = rq.getArcrftList().stream().filter(arcrft -> arcrft.getIdntfNum() != null && !arcrft.getIdntfNum().isBlank()).map(BasLaancArcrftModel::getIdntfNum).collect(Collectors.toList());
List<PilotValidRq> pilotValidRqList = idntfNumList.stream().map(idntfNum -> { 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 기체보험 확인, 조종사 자격 확인 // TODO 기체보험 확인, 조종사 자격 확인
return PilotValidRq.builder() return PilotValidRq.builder()
.pilotci("조종사CI") .pilotci(userCi)
.declarationnum(idntfNum) .declarationnum(idntfNum)
.build(); .build();
}).collect(Collectors.toList()); }).collect(Collectors.toList());
} else {
pilotValidRqList.add(PilotValidRq.builder()
.pilotci(userCi)
.build());
}
List<PilotValidRs> pilotValidRsList = tsService.getAccountValidate(pilotValidRqList); List<PilotValidRs> pilotValidRsList = tsService.getAccountValidate(pilotValidRqList);
if (pilotValidRsList.isEmpty()) { if (pilotValidRsList.isEmpty()) {
rs.setPilotQlfc(false); rs.setPilotQlfc(false);
rs.setArcrftInsurance(false); rs.setArcrftInsurance(false);
} else { } else {
rs.setPilotValidRsList(pilotValidRsList); rs.setPilotQlfc(pilotValidRsList.stream().allMatch(pilotValidRs -> "Y".equals(pilotValidRs.getPilotcredentialyn())));
rs.setPilotQlfc(pilotValidRsList.stream().allMatch(pilotValidRs -> "Y".equals(pilotValidRs.getPilotcredentialyn()))); rs.setArcrftInsurance(pilotValidRsList.stream().allMatch(pilotValidRs -> "Y".equals(pilotValidRs.getArcrftinsuranceyn())));
rs.setArcrftInsurance(pilotValidRsList.stream().allMatch(pilotValidRs -> "Y".equals(pilotValidRs.getArcrftinsuranceyn())));
}
} }
// TODO end - 조종사 자격 및 기체보험 확인
// 비행유형 판별 - 상업 - true
boolean isCommercial = FltType.COMMERCIAL == rq.getFltType();
rs.setCommercial(isCommercial);
// 관제권 여부 판별
BasLaancValidatedRs validationPlanDbRs = this.validationPlanAirspace(rq);
boolean isEvaluatedTargetArea = validationPlanDbRs.isEvaluatedTargetArea();
rs.setEvaluatedTargetArea(isEvaluatedTargetArea);
// 고도여부 - 관제권내 설정고도 이하, 권제권밖 150m 이하 true
if (isEvaluatedTargetArea) {
// 관제권 내부 - 설정고도 이하
rs.setElev(validationPlanDbRs.isElev());
} else {
// 관제권 외부 - 150m 이하
boolean isElev = rq.getAreaList().stream().allMatch(area -> area.getFltElev() != null && Integer.parseInt(area.getFltElev()) <= 150);
rs.setElev(isElev);
}
/* 비행구역 기체 중복여부 확인 안하기로 . // 기체중량 판별 - 25kg 이하 true
// 비행구역 중복여부, 기체 중복여부 boolean isArcrftWeight = rq.getArcrftList().stream().allMatch(arcrft -> arcrft.getArcrftWghtCd() != ArcrftWghtCd.W25KG_GO && arcrft.getArcrftWghtCd() != ArcrftWghtCd.W25KG_GO_TEST);
BasLaancValidatedRs validationPlanAirspaceRs = this.validationPlanAreaAndArcrft(rq); rs.setArcrftWeight(isArcrftWeight);
rs.setPlanAreaDuplicatd(validationPlanAirspaceRs.isPlanAreaDuplicatd());
rs.setArcrftDuplicated(validationPlanAirspaceRs.isArcrftDuplicated());
*/
// 특별비행여부 판별 - 야간/주간 - 야간 true
boolean isSpcialFlight = this.validationPlanSpecialFlight(rq);
rs.setSpacialFlight(isSpcialFlight);
// 판단구역 - 공역과 겹칠 경우, 비행가능여부 // 비행방식 - 군집비행 false, 그외 true
BasLaancValidatedRs validationPlanDbRs = this.validationPlanAirspace(rq); boolean isFltMethod = rq.getAreaList().stream().allMatch(area -> FltMethod.CLUSTER_FLIGHT != area.getFltMethod());
rs.setEvaluatedTargetArea(validationPlanDbRs.isEvaluatedTargetArea()); rs.setFltMethod(isFltMethod);
rs.setFlightArea(validationPlanDbRs.isFlightArea());
return rs; return rs;
} }
// 비행계획서 등록, 약관 등록, 공문 생성 /**
* 비행계획서 등록, 약관 등록, 공문 생성
*
* @param rq
* @return
*/
@Transactional @Transactional
public BasLaancLastRs createFlightPlan(BasLaancPlanRq rq) { public BasLaancLastRs createFlightPlan(BasLaancPlanRq rq) {
// if (rq == null || rq.getValidatedRs() == null) throw new CustomException(ErrorCode.NON_VALID_PARAMETER); // if (rq == null || rq.getValidatedRs() == null) throw new CustomException(ErrorCode.NON_VALID_PARAMETER);
@ -180,6 +197,7 @@ public class BasLaancService {
// 비행계획서 // 비행계획서
String userId = jwtTokenUtil.getUserIdByToken(); String userId = jwtTokenUtil.getUserIdByToken();
Integer cstmrSno = jwtTokenUtil.getCstmrSnoByToken(); Integer cstmrSno = jwtTokenUtil.getCstmrSnoByToken();
// 개인정보 가져오기 - 비행계획서 작성자 정보, 조종사 정보 // 개인정보 가져오기 - 비행계획서 작성자 정보, 조종사 정보
AnctCstmrModel cstmrInfo = ptyCstmrQueryRepository.findByCstmrSno(cstmrSno); AnctCstmrModel cstmrInfo = ptyCstmrQueryRepository.findByCstmrSno(cstmrSno);
FltPlanBas fltPlanBas = BasLaancMapper.MAPPER.modelToPlanEntity(cstmrInfo); FltPlanBas fltPlanBas = BasLaancMapper.MAPPER.modelToPlanEntity(cstmrInfo);
@ -208,10 +226,11 @@ public class BasLaancService {
corpRegYn = isCorpReg ? "Y" : "N"; corpRegYn = isCorpReg ? "Y" : "N";
} }
fltPlanBas.setCorpRegYn(corpRegYn); // 사업자유무 fltPlanBas.setCorpRegYn(corpRegYn); // 사업자유무
fltPlanBas.setServiceType("PAV-KAC"); fltPlanBas.setServiceType("F0002");
FltPlanBas rBasEntity = fltPlanBasRepository.save(fltPlanBas); FltPlanBas rBasEntity = fltPlanBasRepository.save(fltPlanBas);
Integer planSno = rBasEntity.getPlanSno(); Integer planSno = rBasEntity.getPlanSno();
// 비행구역 // 비행구역
List<BasLaancAreaModel> basLaancAreaModelList = rq.getAreaList(); List<BasLaancAreaModel> basLaancAreaModelList = rq.getAreaList();
if (basLaancAreaModelList != null && !basLaancAreaModelList.isEmpty()) { if (basLaancAreaModelList != null && !basLaancAreaModelList.isEmpty()) {
@ -369,113 +388,19 @@ public class BasLaancService {
return rs; 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) { private BasLaancValidatedRs validationPlanAirspace(BasLaancPlanRq rq) {
// 초기화 // 초기화
BasLaancValidatedRs rs = BasLaancValidatedRs.builder() BasLaancValidatedRs rs = BasLaancValidatedRs.builder()
.isEvaluatedTargetArea(false) // 판단구역 - 공역과 겹칠 경우 .isEvaluatedTargetArea(false) // 판단구역 - 공역과 겹칠 경우
.isFlightArea(false) // 비행가능여부 .isElev(false) // 비행가능여부
.build(); .build();
// 공역 중복 확인 // 공역 중복 확인
@ -507,27 +432,18 @@ public class BasLaancService {
boolean duplicatedAirspace = airspaceUtils.isDuplicatedAirspace(featureInfo); boolean duplicatedAirspace = airspaceUtils.isDuplicatedAirspace(featureInfo);
rs.setEvaluatedTargetArea(duplicatedAirspace); rs.setEvaluatedTargetArea(duplicatedAirspace);
// 비행 가능 지역 판단
// if (duplicatedAirspace) {
// boolean validLaancAirspace = airspaceUtils.isValidLaancAirspace(featureInfo);
// rs.setFlightAreaYn(validLaancAirspace ? "Y" : "N");
// } else {
// rs.setFlightAreaYn("N");
// }
// 비행 가능 지역 판단 // 비행 가능 지역 판단
boolean validLaancAirspace = airspaceUtils.isValidLaancAirspace(featureInfo); boolean validLaancAirspace = airspaceUtils.isValidLaancAirspace(featureInfo);
rs.setFlightArea(validLaancAirspace); rs.setElev(validLaancAirspace);
} }
return rs; return rs;
} }
/** /**
* 야간 특별비행 유무 확인 * 비행계획서 검증 - 시작, 종료 일자
* 1. 비행시작 일자 금일 ~ 90일 이내 * 1. 비행시작 일자 금일 ~ 90일 이내
* 2. 비행 종료일자 금일 ~ 6개월까지 -- validtion 통과후 일몰 * 2. 비행 종료일자 금일 ~ 6개월까지 -- validtion 통과후 일몰
* 3. 일몰, 일출 시간[해떠있는 시간] 체크
* *
* @param rq * @param rq
* @return * @return
@ -551,23 +467,34 @@ public class BasLaancService {
// 시간 파라미터가 맞지 않을경우 // 시간 파라미터가 맞지 않을경우
if (!(isSchFltStDtValid && isSchFltEndDtValid)) return false; if (!(isSchFltStDtValid && isSchFltEndDtValid)) return false;
// String[] stringStDt = InstantUtils.toDatetimeString(rq.getSchFltStDt()).split(" "); return true;
// String[] stringEndDt = InstantUtils.toDatetimeString(rq.getSchFltEndDt()).split(" "); }
//
// ComnSunrisesetCoordRq comnSunrisesetCoordRq = new ComnSunrisesetCoordRq(stringStDt[0].replace("-", ""), stringEndDt[0].replace("-", ""), null, null); /**
// * 비행계획서 검증 - 특별 비행
// ComnSunrisesetRs comnSunrisesetRs = comRiseSetQueryRepository.findBySearchCoordDateTransform(comnSunrisesetCoordRq); * @param rq
// * @return
// LocalTime sunUp = this.convertStringToTime(comnSunrisesetRs.getCivilm(), "HHmmss"); */
// LocalTime sunDown = this.convertStringToTime(comnSunrisesetRs.getCivile(), "HHmmss"); private boolean validationPlanSpecialFlight(BasLaancPlanRq rq) {
//
// LocalTime stringStTm = this.convertStringToTime(stringStDt[1].replace(":", ""), "HHmmss"); String[] stringStDt = InstantUtils.toDatetimeString(rq.getSchFltStDt()).split(" ");
// LocalTime stringEndTm = this.convertStringToTime(stringEndDt[1].replace(":", ""), "HHmmss"); String[] stringEndDt = InstantUtils.toDatetimeString(rq.getSchFltEndDt()).split(" ");
//
// boolean stTmValid = this.isBetweenSunriseAndSunset(sunUp, sunDown, stringStTm); ComnSunrisesetCoordRq comnSunrisesetCoordRq = new ComnSunrisesetCoordRq(stringStDt[0].replace("-", ""), stringEndDt[0].replace("-", ""), null, null);
// boolean endTmValid = this.isBetweenSunriseAndSunset(sunUp, sunDown, stringEndTm);
ComnSunrisesetRs comnSunrisesetRs = comRiseSetQueryRepository.findBySearchCoordDateTransform(comnSunrisesetCoordRq);
// if (!stTmValid || !endTmValid) return false;
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; return true;
} }
@ -596,18 +523,23 @@ public class BasLaancService {
timeToCheck.isBefore(sunset); timeToCheck.isBefore(sunset);
} }
// 허용고도 조회 /**
public List<Integer> getAllowableElevation(List<BasLaancAreaModel> rq) { * 허용고도 조회
*
* @param rq
* @return
*/
public List<Integer> getAllowableElevation(List<BasLaancAreaByElevModel> rq) {
AirspaceUtils airspaceUtils = AirspaceUtils.getInstance(); AirspaceUtils airspaceUtils = AirspaceUtils.getInstance();
List<Integer> allowElevationList = new ArrayList<>(); List<Integer> allowElevationList = new ArrayList<>();
for (BasLaancAreaModel area : rq) { for (BasLaancAreaByElevModel area : rq) {
//rq로 들어온 좌표로 버퍼좌표 생성 //rq로 들어온 좌표로 버퍼좌표 생성
List<Coordinate> targetCoord = new ArrayList<>(); List<Coordinate> targetCoord = new ArrayList<>();
List<Coordinate> targetCoordBufferList = new ArrayList<>(); List<Coordinate> targetCoordBufferList = new ArrayList<>();
for (BasLaancAreaCoordModel basLaancAreaCoordModel : area.getCoordList()) { for (BasLaancAreaCoordByElevModel coord : area.getCoordList()) {
Coordinate coords = new Coordinate(basLaancAreaCoordModel.getLon(), basLaancAreaCoordModel.getLat()); Coordinate coords = new Coordinate(coord.getLon(), coord.getLat());
targetCoord.add(coords); targetCoord.add(coords);
} }
@ -631,7 +563,13 @@ public class BasLaancService {
return allowElevationList; return allowElevationList;
} }
// TS 연동 /**
* TS 연동 - 장격증명 API
*
* @param idntfNumList
* @return
*/
@Deprecated
public BasLaancTsRs getTsValid(List<String> idntfNumList) { public BasLaancTsRs getTsValid(List<String> idntfNumList) {
Integer cstmrSno = jwtTokenUtil.getCstmrSnoByToken(); Integer cstmrSno = jwtTokenUtil.getCstmrSnoByToken();
AnctCstmrModel cstmrInfo = ptyCstmrQueryRepository.findByCstmrSno(cstmrSno); AnctCstmrModel cstmrInfo = ptyCstmrQueryRepository.findByCstmrSno(cstmrSno);
@ -651,17 +589,22 @@ public class BasLaancService {
.build(); .build();
} }
// 관제권 포함 여부 /**
public List<BasLaancDuplicatedAirspaceRs> getDuplicatedAirspace(List<BasLaancAreaModel> rq) { * 구역좌표 - 관제권 포함 여부
*
* @param rq
* @return
*/
public List<BasLaancDuplicatedAirspaceRs> getDuplicatedAirspace(List<BasLaancAreaByAirspaceModel> rq) {
AirspaceUtils airspaceUtils = AirspaceUtils.getInstance(); AirspaceUtils airspaceUtils = AirspaceUtils.getInstance();
List<BasLaancDuplicatedAirspaceRs> rs = new ArrayList<>(); List<BasLaancDuplicatedAirspaceRs> rs = new ArrayList<>();
for (BasLaancAreaModel area : rq) { for (BasLaancAreaByAirspaceModel area : rq) {
//rq로 들어온 좌표로 버퍼좌표 생성 //rq로 들어온 좌표로 버퍼좌표 생성
List<Coordinate> targetCoord = new ArrayList<>(); List<Coordinate> targetCoord = new ArrayList<>();
List<Coordinate> targetCoordBufferList = 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()); Coordinate coords = new Coordinate(basLaancAreaCoordModel.getLon(), basLaancAreaCoordModel.getLat());
targetCoord.add(coords); targetCoord.add(coords);
} }
@ -689,4 +632,146 @@ public class BasLaancService {
return rs; 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; package com.palnet.biz.api.cns.faq.controller;
import java.util.HashMap; import com.palnet.biz.api.cns.faq.model.FaqListModel;
import java.util.List; import com.palnet.biz.api.cns.faq.model.FaqListRQModel;
import java.util.Map; import com.palnet.biz.api.cns.faq.model.FaqListRSModel;
import com.palnet.biz.api.cns.faq.model.FaqUpdateModel;
import com.palnet.biz.api.bas.laanc.model.BasLaancAprvRs; 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.ErrorResponse;
import com.palnet.biz.api.comn.response.SuccessResponse;
import com.palnet.comn.exception.CustomException; 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 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.HttpStatus;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import com.palnet.biz.api.cns.faq.model.FaqListRQModel; import java.util.HashMap;
import com.palnet.biz.api.cns.faq.model.FaqListModel; import java.util.List;
import com.palnet.biz.api.cns.faq.service.CnsFaqService; import java.util.Map;
import com.palnet.biz.api.comn.response.BasicResponse;
import com.palnet.biz.api.comn.response.SuccessResponse;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@RestController @RestController
@Slf4j @Slf4j
@Tag(name = "FAQ API", description = "FAQ 관련 API")
@RequiredArgsConstructor @RequiredArgsConstructor
@RequestMapping(value = "/api/bas/cns/faq") @RequestMapping(value = "/api/bas/cns/faq")
@Tag(name = "FAQ", description = "FAQ 관련 API")
public class CnsFaqController { public class CnsFaqController {
private final CnsFaqService service; private final CnsFaqService service;
/*FAQ 목록 조회*/ /**
@Tag(name = "FAQ API", description = "FAQ 관련 API") * FAQ 목록 조회하는 기능,
* FaqListRQModel 값에 있는 조건값으로 조회함.
* @param model
* @return
*/
@GetMapping @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) { public ResponseEntity<? extends BasicResponse> getFaqList(FaqListRQModel model) {
List<FaqListModel> result = null; List<FaqListRSModel> result = null;
try { try {
result = service.getFaqList(model); result = service.getFaqList(model); // FaQ 항목들 조회하는 기능
} catch (CustomException e) { } catch (CustomException e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* CustomException은 개발자가 "의도적으로" 예외처리,
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
Map<String, Object> resultMap = new HashMap<>(); Map<String, Object> resultMap = new HashMap<>();
log.error("IGNORE : ", e); log.error("IGNORE : ", e);
resultMap.put("result", false); resultMap.put("result", false);
@ -46,6 +70,13 @@ public class CnsFaqController {
resultMap.put("errorMessage", e.getMessage()); resultMap.put("errorMessage", e.getMessage());
return ResponseEntity.ok().body(new SuccessResponse<>(resultMap)); return ResponseEntity.ok().body(new SuccessResponse<>(resultMap));
} catch (Exception e) { } catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : ", e); log.error("IGNORE : ", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1")); .body(new ErrorResponse("Server Error", "-1"));
@ -54,14 +85,36 @@ public class CnsFaqController {
return ResponseEntity.ok().body(new SuccessResponse<>(result)); return ResponseEntity.ok().body(new SuccessResponse<>(result));
} }
/*FAQ 상세 조회*/ /**
@Tag(name = "FAQ API", description = "FAQ 관련 API") * FAQ 상세 조회하는 기능,
* 일련번호[sno] 조회함.
* @param sno
* @return
*/
@GetMapping("/{sno}") @GetMapping("/{sno}")
public ResponseEntity<? extends BasicResponse> getFaqDetail(@PathVariable("sno") int sno) { @Operation(summary = "FAQ 상세 조회", description = "특정 FAQ만 조회하는 API 입니다. sno 값 : 1, 2, 등 ....")
FaqListModel result = null; @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 { try {
result = service.getFaqDetail(sno); result = service.getFaqDetail(sno); // 일련번호[sno]로 상세정보를 조회하는 기능
} catch (CustomException e) { } catch (CustomException e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* CustomException은 개발자가 "의도적으로" 예외처리,
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
Map<String, Object> resultMap = new HashMap<>(); Map<String, Object> resultMap = new HashMap<>();
log.error("IGNORE : ", e); log.error("IGNORE : ", e);
resultMap.put("result", false); resultMap.put("result", false);
@ -69,6 +122,13 @@ public class CnsFaqController {
resultMap.put("errorMessage", e.getMessage()); resultMap.put("errorMessage", e.getMessage());
return ResponseEntity.ok().body(new SuccessResponse<>(resultMap)); return ResponseEntity.ok().body(new SuccessResponse<>(resultMap));
} catch (Exception e) { } catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : ", e); log.error("IGNORE : ", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1")); .body(new ErrorResponse("Server Error", "-1"));
@ -77,14 +137,35 @@ public class CnsFaqController {
return ResponseEntity.ok().body(new SuccessResponse<>(result)); return ResponseEntity.ok().body(new SuccessResponse<>(result));
} }
/*FAQ 작성*/ /**
@Tag(name = "FAQ API", description = "FAQ 관련 API") * FAQ 작성하는 기능,
* FaqListModel모델에 있는 값으로 작성하는 기능.
* @param model
* @return
*/
@PostMapping @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) { public ResponseEntity<? extends BasicResponse> insertFaq(@RequestBody FaqListModel model) {
boolean result = false; boolean result = false;
try { try {
result = service.insertFaq(model); result = service.insertFaq(model); // FaQ 추가하는 기능
} catch (CustomException e) { } catch (CustomException e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* CustomException은 개발자가 "의도적으로" 예외처리,
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
Map<String, Object> resultMap = new HashMap<>(); Map<String, Object> resultMap = new HashMap<>();
log.error("IGNORE : ", e); log.error("IGNORE : ", e);
resultMap.put("result", false); resultMap.put("result", false);
@ -92,6 +173,13 @@ public class CnsFaqController {
resultMap.put("errorMessage", e.getMessage()); resultMap.put("errorMessage", e.getMessage());
return ResponseEntity.ok().body(new SuccessResponse<>(resultMap)); return ResponseEntity.ok().body(new SuccessResponse<>(resultMap));
} catch (Exception e) { } catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : ", e); log.error("IGNORE : ", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1")); .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 @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; boolean result = false;
try { try {
result = service.updateFaq(model); result = service.updateFaq(model); // FaQ 수정하는 기능
} catch (CustomException e) { } catch (CustomException e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* CustomException은 개발자가 "의도적으로" 예외처리,
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
Map<String, Object> resultMap = new HashMap<>(); Map<String, Object> resultMap = new HashMap<>();
log.error("IGNORE : ", e); log.error("IGNORE : ", e);
resultMap.put("result", false); resultMap.put("result", false);
@ -117,6 +226,13 @@ public class CnsFaqController {
resultMap.put("errorMessage", e.getMessage()); resultMap.put("errorMessage", e.getMessage());
return ResponseEntity.ok().body(new SuccessResponse<>(resultMap)); return ResponseEntity.ok().body(new SuccessResponse<>(resultMap));
} catch (Exception e) { } catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : ", e); log.error("IGNORE : ", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1")); .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}") @DeleteMapping("/{sno}")
@Operation(summary = "FAQ 삭제", description = "특정 FAQ를 논리 삭제하는 API 입니다. sno 예시 : 1, 2, 등 ...")
public ResponseEntity<? extends BasicResponse> deleteFaq(@PathVariable("sno") int sno) { public ResponseEntity<? extends BasicResponse> deleteFaq(@PathVariable("sno") int sno) {
// TODO 성공/실패 상태값 전송 // TODO 성공/실패 상태값 전송
try { try {
service.deleteFaq(sno); service.deleteFaq(sno); // 일련번호[sno]로 삭제하는 기능
} catch (CustomException e) { } catch (CustomException e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
Map<String, Object> resultMap = new HashMap<>(); Map<String, Object> resultMap = new HashMap<>();
log.error("IGNORE : ", e); log.error("IGNORE : ", e);
resultMap.put("result", false); resultMap.put("result", false);
@ -141,6 +269,13 @@ public class CnsFaqController {
resultMap.put("errorMessage", e.getMessage()); resultMap.put("errorMessage", e.getMessage());
return ResponseEntity.ok().body(new SuccessResponse<>(resultMap)); return ResponseEntity.ok().body(new SuccessResponse<>(resultMap));
} catch (Exception e) { } catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : ", e); log.error("IGNORE : ", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1")); .body(new ErrorResponse("Server Error", "-1"));

16
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 java.time.Instant;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;
@Data @Data
public class FaqListModel { public class FaqListModel {
@Schema(hidden = true)
private int faqSno; private int faqSno;
@Schema(description = "FAQ 분류" , example = "장치신고")
private String category; private String category;
@Schema(description = "작성할 글의 제목" , example = "제목 샘플")
private String title; private String title;
@Schema(description = "작성할 글의 내용" , example = "내용 샘플")
private String content; private String content;
@Schema(hidden = true)
private int viewCnt; private int viewCnt;
@Schema(description = "표출 여부" , example = "Y")
private String expsrYn; private String expsrYn;
// private String delYn; @Schema(hidden = true)
private String delYn;
@Schema(hidden = true)
private String createUserId; private String createUserId;
@Schema(description = "생성일자", example = "2023-12-12", implementation = String.class)
private Instant createDt; private Instant createDt;
@Schema(hidden = true)
private String updateUserId; private String updateUserId;
@Schema(description = "업데이트 일자", example = "2023-12-12", implementation = String.class)
private Instant updateDt; 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; package com.palnet.biz.api.cns.faq.model;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;
@Data @Data
public class FaqListRQModel { public class FaqListRQModel {
@Schema(description = "FAQ 카테고리" , example = "비행승인")
private String category; private String category;
@Schema(description = "해당 단어가 포함된 제목 검색" , example = "비행")
private String word; 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;
}

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

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

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; package com.palnet.biz.api.cns.qna.model;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;
@Data @Data
public class QnaInsertAnserRQModel { public class QnaInsertAnserRQModel {
@Schema(description = "답변을 달 qna 번호" , example = "16")
private Integer qnaSno; private Integer qnaSno;
// private Integer targetSno; // 상위 Qna 번호 // private Integer targetSno; // 상위 Qna 번호
@Schema(description = "답변 내용" , example = "답변 샘플입니다.")
private String anserContent; private String anserContent;
// private String anserUserNm; // private String anserUserNm;
// private Instant anserProcDt; // private Instant anserProcDt;
@Schema(description = "답변 상태" , example = "Y")
private String anserStatus; 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; package com.palnet.biz.api.cns.qna.model;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;
@Data @Data
public class QnaListAdminRQ { public class QnaListAdminRQ {
// 문의유형 // 문의유형
@Schema(description = "검색 타입" , example = "불만")
private String category; private String category;
// 답변상태 // 답변상태
@Schema(description = "답변 여부" , example = "Y")
private String anserStatus; private String anserStatus;
// 작성자 // 작성자
@Schema(description = "작성자" , example = "팔네트웍스")
private String createUserNm; private String createUserNm;
} }

10
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; package com.palnet.biz.api.cns.qna.model;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;
@Data @Data
public class QnaSelectListRQ { public class QnaSelectListRQ {
@Schema(description = "검색 타입" , example = "TITLE")
private String searchType; private String searchType;
private String word;
@Schema(description = "검색어" , example = "드론")
private String word;
@Schema(description = "카테고리" , example = "문의")
private String category; 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; private final JwtTokenUtil jwtTokenUtil;
/** /**
* Qna 삭제하기, file들도 모두 논리삭제함. * Qna 삭제하기, file들도 모두 논리삭제하는 기능.
*
* @param qnaSno * @param qnaSno
* @return * @return
*/ */
// @Transactional는 데이터베이스의 정합성을 위해 사용합니다, 추가 수정 삭제 등에서 사용합니다, 이 기능에서는 삭제컬럼은 수정했기 때문에 사용했습니다.
@Transactional @Transactional
public boolean deleteQna(int qnaSno) { public boolean deleteQna(int qnaSno) {
@ -62,11 +62,11 @@ public class CnsQnaService {
} }
/** /**
* Qna 업데이트하기 * Qna 업데이트하는 기능.
*
* @param rq * @param rq
* @return * @return
*/ */
// @Transactional는 데이터베이스의 정합성을 위해 사용합니다, 추가 수정 삭제 등에서 사용합니다, 이 기능에서는 수정하기 때문에 사용합니다.
@Transactional @Transactional
public boolean updateQna(QnaInsertRQModel rq) { public boolean updateQna(QnaInsertRQModel rq) {
@ -77,7 +77,7 @@ public class CnsQnaService {
List<Integer> prevFileSnoList = new ArrayList<>(); List<Integer> prevFileSnoList = new ArrayList<>();
List<Integer> currentFileSnoList = new ArrayList<>(); List<Integer> currentFileSnoList = new ArrayList<>();
if (entity.getFileGroupNo() != null) { 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()); prevFileSnoList = prevFileInfos.stream().map(ComnFileModel::getFileSno).collect(Collectors.toList());
} }
if (rq.getFileInfos() != null) { if (rq.getFileInfos() != null) {
@ -112,20 +112,22 @@ public class CnsQnaService {
} }
/** /**
* Qna 상세불러오기 * Qna 상세불러오기 기능.
*
* @param qnaSno * @param qnaSno
* @return * @return
*/ */
@Transactional // 조회수 증가하기떄문 // @Transactional는 데이터베이스의 정합성을 위해 사용합니다, 추가 수정 삭제 등에서 사용합니다, 이 기능에서는 조회수 증가하기 떄문에 사용했습니다.
@Transactional
public QnaDetailRSModel getQnaDetail(int qnaSno) { public QnaDetailRSModel getQnaDetail(int qnaSno) {
cnsQnaBasRepository.pulsViewCount(qnaSno); cnsQnaBasRepository.pulsViewCount(qnaSno);
CnsQnaBas entity = cnsQnaBasRepository.findFirstByQnaSnoAndTargetSnoAndDelYnAndExpsrYn(qnaSno, 0, "N", "Y"); CnsQnaBas entity = cnsQnaBasRepository.findFirstByQnaSnoAndTargetSnoAndDelYnAndExpsrYn(qnaSno, 0, "N", "Y");
if(entity == null) throw new CustomException(ErrorCode.DATA_NO);
List<ComnFileModel> files = null; List<ComnFileModel> files = null;
if (entity.getFileGroupNo() != null && entity.getFileGroupNo() != 0) if (entity.getFileGroupNo() != null && entity.getFileGroupNo() != 0)
files = comnFileService.getNormalFileListByGroupNo(entity.getFileGroupNo()); files = comnFileService.getNormalFileListByGroupNo(entity.getFileGroupNo()); // 파일그룹번호[fileGroupNo]에 해당하는 파일등 모두 가져오는 기능.
QnaDetailRSModel model = CnsQnaMapper.MAPPER.toModel(entity); QnaDetailRSModel model = CnsQnaMapper.MAPPER.toModel(entity);
PtyCstmrBas user = ptyCstmrBasRepository.findByUserId(entity.getCreateUserId()).orElse(null); PtyCstmrBas user = ptyCstmrBasRepository.findByUserId(entity.getCreateUserId()).orElse(null);
@ -141,7 +143,7 @@ public class CnsQnaService {
} }
/** /**
* Qna리스트 조회 * Qna리스트 조회하는 기능[관리자].
* *
* @param rq * @param rq
* @return * @return
@ -150,14 +152,18 @@ public class CnsQnaService {
return cnsQnaQueryRepository.getQnaList(rq); return cnsQnaQueryRepository.getQnaList(rq);
} }
/**
* Qna리스트 조회하는 기능[유저]
* @param rq
* @return
*/
public List<QnaBasModel> selectQnaForUser(QnaSelectListRQ rq) { public List<QnaBasModel> selectQnaForUser(QnaSelectListRQ rq) {
String userId = jwtTokenUtil.getUserIdByToken(); String userId = jwtTokenUtil.getUserIdByToken();
return cnsQnaQueryRepository.getQnaListForUser(rq, userId); return cnsQnaQueryRepository.getQnaListForUser(rq, userId);
} }
/** /**
* QnaInsert * Qna 추가 하는기능.
*
* @param rq * @param rq
* @return * @return
*/ */
@ -188,6 +194,11 @@ public class CnsQnaService {
} }
/**
* 답변추가하는 기능.
* @param rq
* @return
*/
public boolean insertAnswer(QnaInsertAnserRQModel rq) { public boolean insertAnswer(QnaInsertAnserRQModel rq) {
CnsQnaBas entity = cnsQnaBasRepository.findByQnaSnoAndDelYnAndExpsrYn(rq.getQnaSno(), "N", "Y"); CnsQnaBas entity = cnsQnaBasRepository.findByQnaSnoAndDelYnAndExpsrYn(rq.getQnaSno(), "N", "Y");
if (entity == null) throw new CustomException(ErrorCode.DATA_NOTFIND); 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.ErrorResponse;
import com.palnet.biz.api.comn.response.SuccessResponse; import com.palnet.biz.api.comn.response.SuccessResponse;
import com.palnet.comn.exception.CustomException; 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 io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@ -32,16 +33,28 @@ public class ComnElevController {
private final ComnElevService comnElevService; private final ComnElevService comnElevService;
/**
*
* @param rq
* @return
*/
@PostMapping(value = "/ground") @PostMapping(value = "/ground")
@ApiOperation(value = "지표면 고도 가져오기") @Operation(summary = "특정 좌표의 고도 가져오기", description = "특정 좌표의 해수면고도(MSL)를 입력하면 지표면고도(AGL)로 변환해 주는 API 입니다.")
@Tag(name = "공통 API", description = "공통 API")
public ResponseEntity<? extends BasicResponse> getGroundElev(@RequestBody List<ComnGroundElevRq> rq) { public ResponseEntity<? extends BasicResponse> getGroundElev(@RequestBody List<ComnGroundElevRq> rq) {
List<ComnElevRs> rs = null; List<ComnElevRs> rs = null;
try { try {
log.debug(">>> rq : {}", rq); log.debug(">>> rq : {}", rq);
rs = comnElevService.getGroundElev(rq); rs = comnElevService.getGroundElev(rq); // 지표면 고도 가져오는 기능
} catch (CustomException e) { } catch (CustomException e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* CustomException은 개발자가 "의도적으로" 예외처리,
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
Map<String, Object> resultMap = new HashMap<>(); Map<String, Object> resultMap = new HashMap<>();
log.error("IGNORE : ", e); log.error("IGNORE : ", e);
resultMap.put("result", false); resultMap.put("result", false);
@ -49,6 +62,13 @@ public class ComnElevController {
resultMap.put("errorMessage", e.getMessage()); resultMap.put("errorMessage", e.getMessage());
return ResponseEntity.ok().body(new SuccessResponse<>(resultMap)); return ResponseEntity.ok().body(new SuccessResponse<>(resultMap));
} catch (Exception e) { } catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : ", e); log.error("IGNORE : ", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1")); .body(new ErrorResponse("Server Error", "-1"));
@ -57,16 +77,28 @@ public class ComnElevController {
return ResponseEntity.ok().body(new SuccessResponse<>(rs)); return ResponseEntity.ok().body(new SuccessResponse<>(rs));
} }
/**
* MSL[해발고도] AGL[지표면고도] 변환하는 기능.
* @param rq
* @return
*/
@PostMapping(value = "/to/agl") @PostMapping(value = "/to/agl")
@ApiOperation(value = "msl을 agl로 변환") @Operation(summary = "해수면고도 -> 지표면고도 변환", description = "특정 좌표의 해수면고도(MSL)를 지표면고도(AGL)로 변환해 주는 API 입니다.")
@Tag(name = "공통 API", description = "공통 API")
public ResponseEntity<? extends BasicResponse> convertMslToAgl(@RequestBody List<ComnElevRq> rq) { public ResponseEntity<? extends BasicResponse> convertMslToAgl(@RequestBody List<ComnElevRq> rq) {
List<ComnElevRs> rs = null; List<ComnElevRs> rs = null;
try { try {
log.debug(">>> rq : {}", rq); log.debug(">>> rq : {}", rq);
rs = comnElevService.convertMslToAgl(rq); rs = comnElevService.convertMslToAgl(rq); // msl 기준 고도 > agl 기준 고도 변환하는 기능
} catch (CustomException e) { } catch (CustomException e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* CustomException은 개발자가 "의도적으로" 예외처리,
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
Map<String, Object> resultMap = new HashMap<>(); Map<String, Object> resultMap = new HashMap<>();
log.error("IGNORE : ", e); log.error("IGNORE : ", e);
resultMap.put("result", false); resultMap.put("result", false);
@ -74,6 +106,13 @@ public class ComnElevController {
resultMap.put("errorMessage", e.getMessage()); resultMap.put("errorMessage", e.getMessage());
return ResponseEntity.ok().body(new SuccessResponse<>(resultMap)); return ResponseEntity.ok().body(new SuccessResponse<>(resultMap));
} catch (Exception e) { } catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : ", e); log.error("IGNORE : ", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1")); .body(new ErrorResponse("Server Error", "-1"));
@ -82,16 +121,28 @@ public class ComnElevController {
return ResponseEntity.ok().body(new SuccessResponse<>(rs)); return ResponseEntity.ok().body(new SuccessResponse<>(rs));
} }
/**
* AGL[지표면고도] MSL[해발고도] 변환하는 기능.
* @param rq
* @return
*/
@PostMapping(value = "/to/msl") @PostMapping(value = "/to/msl")
@ApiOperation(value = "agl을 msl로 변환") @Operation(summary = "지표면고도 -> 해수면고도 변환", description = "특정 좌표의 지표면고도(AGL)를 해수면고도(MSL)로 변환해 주는 API 입니다.")
@Tag(name = "공통 API", description = "공통 API")
public ResponseEntity<? extends BasicResponse> convertAglToMsl(@RequestBody List<ComnElevRq> rq) { public ResponseEntity<? extends BasicResponse> convertAglToMsl(@RequestBody List<ComnElevRq> rq) {
List<ComnElevRs> rs = null; List<ComnElevRs> rs = null;
try { try {
log.debug(">>> rq : {}", rq); log.debug(">>> rq : {}", rq);
rs = comnElevService.convertAglToMsl(rq); rs = comnElevService.convertAglToMsl(rq); // agl 기준 고도 > msl 기준 고도 변환하는 기능
} catch (CustomException e) { } catch (CustomException e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* CustomException은 개발자가 "의도적으로" 예외처리,
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
Map<String, Object> resultMap = new HashMap<>(); Map<String, Object> resultMap = new HashMap<>();
log.error("IGNORE : ", e); log.error("IGNORE : ", e);
resultMap.put("result", false); resultMap.put("result", false);
@ -99,6 +150,13 @@ public class ComnElevController {
resultMap.put("errorMessage", e.getMessage()); resultMap.put("errorMessage", e.getMessage());
return ResponseEntity.ok().body(new SuccessResponse<>(resultMap)); return ResponseEntity.ok().body(new SuccessResponse<>(resultMap));
} catch (Exception e) { } catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : ", e); log.error("IGNORE : ", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1")); .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; package com.palnet.biz.api.comn.elev.model;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Builder; import lombok.Builder;
import lombok.Data; import lombok.Data;
@ -10,7 +11,13 @@ import lombok.NoArgsConstructor;
@AllArgsConstructor @AllArgsConstructor
@Builder @Builder
public class ComnElevRq { public class ComnElevRq {
@Schema(description = "위도" , example = "37.520930", implementation = Double.class)
private Double lat; private Double lat;
@Schema(description = "경도" , example = "126.605684", implementation = Double.class)
private Double lon; private Double lon;
@Schema(description = "고도" , example = "100.0", implementation = Double.class)
private Double elev; 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; package com.palnet.biz.api.comn.elev.model;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Builder; import lombok.Builder;
import lombok.Data; import lombok.Data;
@ -10,6 +11,10 @@ import lombok.NoArgsConstructor;
@AllArgsConstructor @AllArgsConstructor
@Builder @Builder
public class ComnGroundElevRq { public class ComnGroundElevRq {
@Schema(description = "위도" , example = "37.520930", implementation = Double.class)
private Double lat; private Double lat;
@Schema(description = "경도" , example = "126.605684", implementation = Double.class)
private Double lon; 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 @Service
public class ComnElevService { public class ComnElevService {
// 지표면 고도 가져오기 /**
* 지표면 고도 가져오는 기능.
* @param rq
* @return
*/
public List<ComnElevRs> getGroundElev(List<ComnGroundElevRq> rq) { public List<ComnElevRs> getGroundElev(List<ComnGroundElevRq> rq) {
DigitalElevationModelUtils demUtils = DigitalElevationModelUtils.getInstance(); DigitalElevationModelUtils demUtils = DigitalElevationModelUtils.getInstance();
List<ComnElevRs> rs = rq.stream().map(elev -> { List<ComnElevRs> rs = rq.stream().map(elev -> {
Coordinate coord = new Coordinate(elev.getLon(), elev.getLat()); Coordinate coord = new Coordinate(elev.getLon(), elev.getLat());
Double groundElevation = demUtils.getGroundElevation(coord); Double groundElevation = demUtils.getGroundElevation(coord); // 좌표로 고도값을 구하는 기능.[좌표계는 EPSG:4326으로 해야합니다]
return ComnElevRs.builder() return ComnElevRs.builder()
.elevType("ground") .elevType("ground")
.lat(elev.getLat()) .lat(elev.getLat())
@ -33,7 +37,11 @@ public class ComnElevService {
return rs; return rs;
} }
// msl 기준 고도 > agl 기준 고도 변환 /**
* msl 기준 고도 > agl 기준 고도 변환하는 기능.
* @param rq
* @return
*/
public List<ComnElevRs> convertMslToAgl(List<ComnElevRq> rq) { public List<ComnElevRs> convertMslToAgl(List<ComnElevRq> rq) {
DigitalElevationModelUtils demUtils = DigitalElevationModelUtils.getInstance(); DigitalElevationModelUtils demUtils = DigitalElevationModelUtils.getInstance();
List<ComnElevRs> rs = rq.stream().map(elev -> { List<ComnElevRs> rs = rq.stream().map(elev -> {
@ -52,7 +60,11 @@ public class ComnElevService {
return rs; return rs;
} }
// agl 기준 고도 > msl 기준 고도 변환 /**
* agl 기준 고도 > msl 기준 고도 변환하는 기능.
* @param rq
* @return
*/
public List<ComnElevRs> convertAglToMsl(List<ComnElevRq> rq) { public List<ComnElevRs> convertAglToMsl(List<ComnElevRq> rq) {
DigitalElevationModelUtils demUtils = DigitalElevationModelUtils.getInstance(); DigitalElevationModelUtils demUtils = DigitalElevationModelUtils.getInstance();
List<ComnElevRs> rs = rq.stream().map(elev -> { 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; package com.palnet.biz.api.comn.file.controller;
import com.palnet.biz.api.comn.file.service.ComnFileService; 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.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
@ -23,25 +28,53 @@ import org.springframework.web.bind.annotation.RestController;
@RequiredArgsConstructor @RequiredArgsConstructor
@RequestMapping("/api/comn/file") @RequestMapping("/api/comn/file")
@RestController @RestController
@Tag(name ="파일", description = "파일 관련 API")
public class ComnFileController { public class ComnFileController {
private final ComnFileService comnFileService; private final ComnFileService comnFileService;
/**
* 사용 안함[@Deprecated]
* 파일일련번호[fileSno] 파일 다운로드 하는 기능.
* QueryParam 방식으로 parameter를 받음.
* @param fileSno
*/
@Deprecated @Deprecated
@GetMapping("/download") @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 { try {
comnFileService.fileDownload(fileSno); comnFileService.fileDownload(fileSno); // 파일 일련번호[fileSno]로 파일 다운로드하는 기능
} catch (Exception e) { } catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악함
*/
log.error("ERROR: ", e); log.error("ERROR: ", e);
} }
} }
/**
* 파일일련번호[fileSno] 파일 다운로드 하는 기능.
* @param fileSno
*/
@GetMapping("/download/{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 { try {
comnFileService.fileDownload(fileSno); comnFileService.fileDownload(fileSno);
} catch (Exception e) { } catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악함
*/
log.error("ERROR: ", e); log.error("ERROR: ", e);
} }
} }

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

@ -146,20 +146,19 @@ public class ComnFileService {
} }
/** /**
* 파일 다운로드 * 파일 일련번호[fileSno] 파일 다운로드하는 기능.
*
* @param fileSno * @param fileSno
*/ */
public void fileDownload(int 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); if (comFileBas == null) throw new CustomException(ErrorCode.DATA_NOTFIND);
InputStream inputStream = null; InputStream inputStream = null;
OutputStream outputStream = null; OutputStream outputStream = null;
try { try {
File pdfFile = new File(comFileBas.getFilePath() + comFileBas.getFileSaveNm()); File pdfFile = new File(comFileBas.getFilePath() + comFileBas.getFileSaveNm()); // 파일경로에 맞춰 파일데이터를 PC에서 가져옴
inputStream = new FileInputStream(pdfFile); inputStream = new FileInputStream(pdfFile);
String fileOriName = comFileBas.getFileOriNm(); String fileOriName = comFileBas.getFileOriNm();
@ -176,7 +175,8 @@ public class ComnFileService {
byte[] buffer = new byte[1024]; //1KB 설정 byte[] buffer = new byte[1024]; //1KB 설정
int length; int length;
while ((length = inputStream.read(buffer)) != -1) { // 요청한 사용자에게 파일데이터 전송
while ((length = inputStream.read(buffer)) != -1) {
outputStream.write(buffer); outputStream.write(buffer);
} }
@ -185,6 +185,7 @@ public class ComnFileService {
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); e.printStackTrace();
} finally { } finally {
// INPUT, OUTPUT의 열어놨던 스트림들을 최종적으로 모두 닫음
try { try {
if (outputStream != null) { if (outputStream != null) {
Objects.requireNonNull(outputStream).flush(); Objects.requireNonNull(outputStream).flush();
@ -351,6 +352,13 @@ public class ComnFileService {
return true; return true;
} }
/**
* 파일일련번호 배열로 삭제처리 진행함.
* @param fileSnoList
* @return
*/
// @Transactional는 데이터베이스의 정합성을 위해 사용합니다, 추가 수정 삭제 등에서 사용합니다, 이 기능에서는 삭제컬럼은 수정했기 때문에 사용했습니다.
@Transactional @Transactional
public boolean deleteFiles(List<Integer> fileSnoList){ public boolean deleteFiles(List<Integer> fileSnoList){
@ -389,6 +397,11 @@ public class ComnFileService {
return true; return true;
} }
/**
* 파일그룹번호[fileGroupNo] 해당하는 파일등 모두 가져오는 기능.
* @param fileGroupNo
* @return
*/
public List<ComnFileModel> getNormalFileListByGroupNo(Integer fileGroupNo) { public List<ComnFileModel> getNormalFileListByGroupNo(Integer fileGroupNo) {
List<ComFileBas> files = comFileBasRepository.findByFileGroupNoAndDelYn(fileGroupNo, "N"); List<ComFileBas> files = comFileBasRepository.findByFileGroupNoAndDelYn(fileGroupNo, "N");
List<ComnFileModel> result = new ArrayList<>(); 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; package com.palnet.biz.api.comn.model;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;
@Data @Data
public class ComnPagingModel { public class ComnPagingModel {
@Schema(description = "데이터 표출 수" , example = "10")
private int record = 10; // 데이터 표출 수 private int record = 10; // 데이터 표출 수
@Schema(description = "현재 페이지" , example = "1")
private int page = 0; // 현재 페이지 private int page = 0; // 현재 페이지
@Schema(description = "시작위치" , example = "0")
private int stIdx = 0; // 시작 위치 private int stIdx = 0; // 시작 위치
@Schema(description = "끝 위치" , example = "0")
private int endIdx = 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; package com.palnet.biz.api.comn.model;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
@Data @Data
@EqualsAndHashCode(callSuper=false) @EqualsAndHashCode(callSuper=false)
public class ComnRqModel extends ComnPagingModel { public class ComnRqModel extends ComnPagingModel {
@Schema(description = "검색 시작 날짜" , example = "2023-11-01" , implementation = String.class)
private String stDate; private String stDate;
@Schema(description = "검색 종료 날짜" , example = "2023-11-30" , implementation = String.class)
private String endDate; private String endDate;
@Schema(hidden = true)
private String search1; private String search1;
@Schema(hidden = true)
private String searchType1; private String searchType1;
} }

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

@ -1,15 +1,20 @@
package com.palnet.biz.api.comn.response; package com.palnet.biz.api.comn.response;
import java.util.List; import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import java.util.List;
@Data @Data
@EqualsAndHashCode(callSuper=false) @EqualsAndHashCode(callSuper=false)
public class SuccessResponse<T> extends BasicResponse { public class SuccessResponse<T> extends BasicResponse {
@Schema(description = "응답 데이터 건수")
private int count; private int count;
@Schema(description = "응답 데이터")
private T data; private T data;
public SuccessResponse(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; private final SuredataRepository suredataRepository;
/**
* 비행승인시 SMS를 보내는 기능.
* @param model
*/
public void sendLaancAprovSms(ComnSmsLaancAprovModel model) { public void sendLaancAprovSms(ComnSmsLaancAprovModel model) {
log.info("sendSms : {}", model); log.info("sendSms : {}", model);
ClassPathResource resource = new ClassPathResource("templates/sms/SmsLaancAprov.txt"); ClassPathResource resource = new ClassPathResource("templates/sms/SmsLaancAprov.txt");
@ -78,6 +82,12 @@ public class ComnSmsService {
suredataRepository.save(entity); suredataRepository.save(entity);
} }
/**
* 내부적으로 사용할 메소드, 메세지 템플릿과, 객체의 파라미터를 매핑함.
* @param templateStr
* @param model
* @return
*/
private String getMessage(String templateStr, ComnSmsLaancAprovModel model) { private String getMessage(String templateStr, ComnSmsLaancAprovModel model) {
String message = templateStr; String message = templateStr;
message = message.replace("${pilotName}", model.getPilotName()); message = message.replace("${pilotName}", model.getPilotName());
@ -89,6 +99,10 @@ public class ComnSmsService {
return message; return message;
} }
/**
* 데이터베이스에 추가할 메세지 발송이력 데이터를 셋팅함.
* @return
*/
public SuredataEntity getInitialEntity() { public SuredataEntity getInitialEntity() {
String nowStr = InstantUtils.toDatetimeStringByFormat(Instant.now(), "yyyyMMddHHmmss"); String nowStr = InstantUtils.toDatetimeStringByFormat(Instant.now(), "yyyyMMddHHmmss");
SuredataEntity entity = new SuredataEntity(); 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.model.ComnSunrisesetRs;
import com.palnet.biz.api.comn.sunriseset.service.ComnSunrisesetService; import com.palnet.biz.api.comn.sunriseset.service.ComnSunrisesetService;
import com.palnet.comn.exception.CustomException; import com.palnet.comn.exception.CustomException;
import io.swagger.annotations.ApiImplicitParam; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; 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.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import springfox.documentation.annotations.ApiIgnore;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
@ -45,17 +42,30 @@ public class ComnSunrisesetController {
private final ComnSunrisesetService comnSunrisesetService; private final ComnSunrisesetService comnSunrisesetService;
@ApiOperation(value = "일출/일몰 조회", notes = "기간내 모든 일출/일몰조회") /**
@Tag(name = "공통 API", description = "공통 API") * 일출/일몰 시간대를 조회하는 기능,
* ComnSunrisesetRq에 있는 검색 시작일, 끝일의 조건에 맞춰 조회함.
* @param rq
* @return
*/
@GetMapping("/list") @GetMapping("/list")
@Operation(summary = "일출/일몰 조회", description = "기간 내 모든 일출과 일몰시간을 조회하는 API 입니다.")
public ResponseEntity<? extends BasicResponse> getSunRiseSetList(ComnSunrisesetRq rq) { public ResponseEntity<? extends BasicResponse> getSunRiseSetList(ComnSunrisesetRq rq) {
List<ComnSunrisesetRs> rs = null; List<ComnSunrisesetRs> rs = null;
try { try {
log.debug(">>> rq : {}", rq); log.debug(">>> rq : {}", rq);
rs = comnSunrisesetService.getSunRiseSetList(rq); rs = comnSunrisesetService.getSunRiseSetList(rq); // 검색조건의 맞춰 일몰,일출 시간을 조회하는 기능
// log.debug(">>> rs : {}", rs); // log.debug(">>> rs : {}", rs);
} catch (CustomException e) { } catch (CustomException e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* CustomException은 개발자가 "의도적으로" 예외처리,
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
Map<String, Object> resultMap = new HashMap<String, Object>(); Map<String, Object> resultMap = new HashMap<String, Object>();
log.error("IGNORE : ", e); log.error("IGNORE : ", e);
resultMap.put("result", false); resultMap.put("result", false);
@ -63,6 +73,13 @@ public class ComnSunrisesetController {
resultMap.put("errorMessage", e.getMessage()); resultMap.put("errorMessage", e.getMessage());
return ResponseEntity.ok().body(new SuccessResponse<Map>(resultMap)); return ResponseEntity.ok().body(new SuccessResponse<Map>(resultMap));
} catch (Exception e) { } catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : ", e); log.error("IGNORE : ", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1")); .body(new ErrorResponse("Server Error", "-1"));
@ -71,18 +88,30 @@ public class ComnSunrisesetController {
return ResponseEntity.ok().body(new SuccessResponse<>(rs)); return ResponseEntity.ok().body(new SuccessResponse<>(rs));
} }
/**
@ApiOperation(value = "일출/일몰 조회(좌표)", notes = "기간내 근접한 지역의 일출/일몰 조회") * 근접한 지역의 일출/일몰 조회,
@Tag(name = "공통 API", description = "공통 API") * ComnSunrisesetCoordRq 모델에 있는 시작,끝날짜 조건에 맞춰 가장 근접한 지역의 일출/일몰 조회.
* @param rq
* @return
*/
@GetMapping("/coord") @GetMapping("/coord")
@Operation(summary = "일출/일몰 조회(좌표)", description = "기간 내 좌표와 근접한 지역의 일출과 일몰시간을 1건 조회하는 API 입니다.")
public ResponseEntity<? extends BasicResponse> getSunRiseSetByCoordAndDate(ComnSunrisesetCoordRq rq) { public ResponseEntity<? extends BasicResponse> getSunRiseSetByCoordAndDate(ComnSunrisesetCoordRq rq) {
ComnSunrisesetRs rs = null; ComnSunrisesetRs rs = null;
try { try {
log.debug(">>> rq : {}", rq); log.debug(">>> rq : {}", rq);
rs = comnSunrisesetService.getSunRiseSetByCoordAndDate(rq); rs = comnSunrisesetService.getSunRiseSetByCoordAndDate(rq); // 기간내 근접한 지역의 일출/일몰 조회하는 기능
// log.debug(">>> rs : {}", rs); // log.debug(">>> rs : {}", rs);
} catch (CustomException e) { } catch (CustomException e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* CustomException은 개발자가 "의도적으로" 예외처리,
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
Map<String, Object> resultMap = new HashMap<String, Object>(); Map<String, Object> resultMap = new HashMap<String, Object>();
log.error("IGNORE : ", e); log.error("IGNORE : ", e);
resultMap.put("result", false); resultMap.put("result", false);
@ -90,6 +119,13 @@ public class ComnSunrisesetController {
resultMap.put("errorMessage", e.getMessage()); resultMap.put("errorMessage", e.getMessage());
return ResponseEntity.ok().body(new SuccessResponse<Map>(resultMap)); return ResponseEntity.ok().body(new SuccessResponse<Map>(resultMap));
} catch (Exception e) { } catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : ", e); log.error("IGNORE : ", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1")); .body(new ErrorResponse("Server Error", "-1"));
@ -98,14 +134,14 @@ public class ComnSunrisesetController {
return ResponseEntity.ok().body(new SuccessResponse<>(rs)); return ResponseEntity.ok().body(new SuccessResponse<>(rs));
} }
@ApiOperation(value = "일출/일몰 조회(좌표-6개월치)", notes = "근접한 지역의 현재~6개월치의 일출/일몰 데이터 조회") /**
@Tag(name = "공통 API", description = "공통 API") * 근접한 지역의 현재~6개월치의 일출/일몰 데이터 조회하는 기능
@ApiImplicitParams(value = { * @param rq
@ApiImplicitParam(name = "lat", value = "위도", required = true, dataType = "double", paramType = "query", example = "37.5665", defaultValue = "37.5665"), * @return
@ApiImplicitParam(name = "lon", value = "경도", required = true, dataType = "double", paramType = "query", example = "126.9780", defaultValue = "126.9780"), */
})
@GetMapping("/coord/list") @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; List<ComnSunrisesetRs> rs = null;
try { try {
log.debug(">>> rq : {}", rq); log.debug(">>> rq : {}", rq);
@ -113,6 +149,14 @@ public class ComnSunrisesetController {
// log.debug(">>> rs : {}", rs); // log.debug(">>> rs : {}", rs);
} catch (CustomException e) { } catch (CustomException e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* CustomException은 개발자가 "의도적으로" 예외처리,
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
Map<String, Object> resultMap = new HashMap<String, Object>(); Map<String, Object> resultMap = new HashMap<String, Object>();
log.error("IGNORE : ", e); log.error("IGNORE : ", e);
resultMap.put("result", false); resultMap.put("result", false);
@ -120,6 +164,13 @@ public class ComnSunrisesetController {
resultMap.put("errorMessage", e.getMessage()); resultMap.put("errorMessage", e.getMessage());
return ResponseEntity.ok().body(new SuccessResponse<Map>(resultMap)); return ResponseEntity.ok().body(new SuccessResponse<Map>(resultMap));
} catch (Exception e) { } catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : ", e); log.error("IGNORE : ", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1")); .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; package com.palnet.biz.api.comn.sunriseset.model;
import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnore;
import io.swagger.annotations.ApiParam;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Builder; import lombok.Builder;
import lombok.Data; import lombok.Data;
@ -23,13 +24,17 @@ import lombok.NoArgsConstructor;
@AllArgsConstructor @AllArgsConstructor
@Builder @Builder
public class ComnSunrisesetCoordRq { public class ComnSunrisesetCoordRq {
@ApiParam(value = "시작일자", defaultValue = "20231101", example = "20231101", required = true)
@Schema(description = "시작일자", example = "20231101")
private String locStDate; private String locStDate;
@ApiParam(value = "종료일자", defaultValue = "20231231", example = "20231231", required = true)
@Schema(description = "종료일자", example = "20231231")
private String locEndDate; private String locEndDate;
@ApiParam(value = "위도", defaultValue = "37.4717452", example = "37.11", required = true)
@Schema(description = "위도", example = "37.520987")
private Double lat; private Double lat;
@ApiParam(value = "경도", defaultValue = "126.7081059", example = "127.11", required = true)
@Schema(description = "경도", example = "126.610646")
private Double lon; private Double lon;
@JsonIgnore @JsonIgnore

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

Loading…
Cancel
Save