diff --git a/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/controller/BasLaancController.java b/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/controller/BasLaancController.java index e64b84fe..2b06a8ed 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/controller/BasLaancController.java +++ b/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/controller/BasLaancController.java @@ -132,7 +132,7 @@ public class BasLaancController { resultMap.put("result", false); resultMap.put("errorCode", e.getErrorCode()); resultMap.put("errorMessage", e.getMessage()); - return ResponseEntity.ok().body(new SuccessResponse(resultMap)); + return ResponseEntity.ok().body(new SuccessResponse<>(resultMap)); } catch (Exception e) { log.error("IGNORE : ", e); return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) @@ -156,7 +156,7 @@ public class BasLaancController { resultMap.put("result", false); resultMap.put("errorCode", e.getErrorCode()); resultMap.put("errorMessage", e.getMessage()); - return ResponseEntity.ok().body(new SuccessResponse(resultMap)); + return ResponseEntity.ok().body(new SuccessResponse<>(resultMap)); } catch (Exception e) { log.error("IGNORE : ", e); return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) @@ -179,7 +179,7 @@ public class BasLaancController { resultMap.put("result", false); resultMap.put("errorCode", e.getErrorCode()); resultMap.put("errorMessage", e.getMessage()); - return ResponseEntity.ok().body(new SuccessResponse(resultMap)); + return ResponseEntity.ok().body(new SuccessResponse<>(resultMap)); } catch (Exception e) { log.error("IGNORE : ", e); return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) @@ -188,7 +188,7 @@ public class BasLaancController { } return new ResponseEntity<>(new SuccessResponse<>(rs), HttpStatus.OK); } - + @GetMapping(value = "/ts/qr/{confirmKey}") @ApiOperation(value = "TS QR 코드 확인 - RS왔는지 확인") @Tag(name = "LAANC", description = "LAANC 관련 API") @@ -202,7 +202,10 @@ public class BasLaancController { resultMap.put("result", false); resultMap.put("errorCode", e.getErrorCode()); resultMap.put("errorMessage", e.getMessage()); - return ResponseEntity.ok().body(new SuccessResponse(resultMap)); + 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) @@ -213,5 +216,4 @@ public class BasLaancController { } - } diff --git a/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/service/BasLaancService.java b/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/service/BasLaancService.java index 05fa5fcc..f95ead21 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/service/BasLaancService.java +++ b/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/service/BasLaancService.java @@ -1,6 +1,7 @@ package com.palnet.biz.api.bas.laanc.service; import com.google.zxing.WriterException; +import com.itextpdf.io.util.HashCode; import com.palnet.biz.api.acnt.cstmr.model.AnctCstmrModel; import com.palnet.biz.api.acnt.cstmr.model.AnctCstmrTermsModel; import com.palnet.biz.api.acnt.jwt.utils.JwtTokenUtil; @@ -46,9 +47,7 @@ import java.time.LocalTime; import java.time.ZoneId; import java.time.format.DateTimeFormatter; import java.time.temporal.ChronoUnit; -import java.util.ArrayList; -import java.util.List; -import java.util.UUID; +import java.util.*; import java.util.stream.Collectors; /** @@ -668,7 +667,12 @@ public class BasLaancService { String userIdByToken = jwtTokenUtil.getUserIdByToken(); ComConfirmBas entity = comConfirmBasRepository.findFirstByConfirmKeyOrderByCreateDtDesc(confirmKey); - if (entity == null || "RECEIVED".equals(entity.getStatus())) throw new CustomException(ErrorCode.DATA_NOTFIND, "QR코드 조회 실패"); + if(entity == null) throw new CustomException(ErrorCode.DATA_NOTFIND, "QR코드 조회 실패"); + if (!"RECEIVED".equals(entity.getStatus())){ + Map errorParam = new HashMap<>(); + errorParam.put("status", entity.getStatus()); + throw new CustomException(ErrorCode.DATA_NOTFIND, errorParam); + } // TODO 일자 검증 - 3분 초과 Instant createDt = entity.getCreateDt().plus(3, ChronoUnit.MINUTES); diff --git a/pav-server/src/main/java/com/palnet/biz/api/external/controller/ExternalLaancController.java b/pav-server/src/main/java/com/palnet/biz/api/external/controller/ExternalLaancController.java index 1d00fdd8..46628122 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/external/controller/ExternalLaancController.java +++ b/pav-server/src/main/java/com/palnet/biz/api/external/controller/ExternalLaancController.java @@ -1,8 +1,10 @@ package com.palnet.biz.api.external.controller; import com.palnet.biz.api.bas.laanc.service.BasLaancService; +import com.palnet.biz.api.external.model.TsPlanRq; import com.palnet.biz.api.external.model.TsQrcodeRs; import com.palnet.biz.api.external.service.TsService; +import com.palnet.comn.utils.JsonUtils; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.http.ResponseEntity; @@ -11,6 +13,9 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import java.util.HashMap; +import java.util.Map; + @Slf4j @RequiredArgsConstructor @RequestMapping("/api/external/laanc") @@ -20,10 +25,31 @@ public class ExternalLaancController { private final BasLaancService basLaancService; private final TsService tsService; + /* + error code + 200 - 정상적으로 수신되었습니다. + 300 - 메시지 규격이 다릅니다. - Json 포멧이 틀린 경우 + 301 - 필수 항목이 누락되었습니다. - 필수 항목이 누락된 경우 + 302 - 메시지 타입이 맞지 않습니다. - 메시지내 파라미터의 타입이 잘못된 경우 + 500 - 서버 연결이 되지 않습니다. - call측 network exception 처리 + 501 - 네트워크 연결이 지연 됩니다. - call측 network exception 처리 + 600 - 인증키가 유효하지 않습니다. + 700 - 기타 오류 - 기 정의된 내용이 아닌 기타 오류인 경우 + */ + // TS로 부터 비행 신청 정보 - endpoint - @PostMapping("/plan/ost") + @PostMapping("/plan/dos") public ResponseEntity createTsFltPlan(@RequestBody String body) { log.info(">>>> /plan/ost body: {}", body); + try { + TsPlanRq tsPlanRq = JsonUtils.fromJson(body, TsPlanRq.class); + } catch (Exception e) { + log.error("IGNORE: ", e); + Map error = new HashMap<>(); + error.put("rspCode", "300"); + error.put("rspMessage", "메시지 규격이 다릅니다."); + return ResponseEntity.status(300).body(error); + } return ResponseEntity.ok().build(); } diff --git a/pav-server/src/main/java/com/palnet/biz/api/external/model/TsPlanRq.java b/pav-server/src/main/java/com/palnet/biz/api/external/model/TsPlanRq.java new file mode 100644 index 00000000..7be305e6 --- /dev/null +++ b/pav-server/src/main/java/com/palnet/biz/api/external/model/TsPlanRq.java @@ -0,0 +1,89 @@ +package com.palnet.biz.api.external.model; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class TsPlanRq { + + private List flightapprovalInfo; + private List arcrftInfo; + private List businessinfo; + private List flightInfo; + + @Data + @NoArgsConstructor + @AllArgsConstructor + @Builder + public static class TsFlightapprovalInfo { + + private List operatorinfo; + + @Data + @NoArgsConstructor + @AllArgsConstructor + @Builder + public static class Operatorinfo { + private String pilotname; + private String pilotcredentialno; + } + } + + @Data + @NoArgsConstructor + @AllArgsConstructor + @Builder + public static class TsArcrftInfo { + private String arcrfttype; + private String declarationnum; + private String arcrftmodelnm; + private String prdctcmpnnm; + private String prdctnum; + private String arcrftlwh; + private String arcrftwght; + private String ownernm; + private String corporationnm; + private String insrncyn; + private String arcrftinsuranceyn; + private String insuranceexperiod; + } + + @Data + @NoArgsConstructor + @AllArgsConstructor + @Builder + public static class TsBusinessinfo { + private String corpregyn; + } + + @Data + @NoArgsConstructor + @AllArgsConstructor + @Builder + public static class TsFlightInfo { + private String fltareacnt; + private String fltmethod; + private String pltstdt; + private String pltenddt; + private String pltpurpose; + private List areaInfo; + + @Data + @NoArgsConstructor + @AllArgsConstructor + @Builder + public static class TsAreaInfo { + private String addr; + private String coord; + private String elev; + private String radius; + } + } +} diff --git a/pav-server/src/main/java/com/palnet/comn/code/ErrorCode.java b/pav-server/src/main/java/com/palnet/comn/code/ErrorCode.java index f50745cb..0e412384 100644 --- a/pav-server/src/main/java/com/palnet/comn/code/ErrorCode.java +++ b/pav-server/src/main/java/com/palnet/comn/code/ErrorCode.java @@ -8,15 +8,24 @@ public enum ErrorCode { NOT_REGIST_ERROR_CODE("ER501", "등록되지 않은 오류 코드"), DATA_NOTFIND("DT001","데이터 를 찾을수 없습니다."), DATA_DUPLICATE("DT002","중복 데이터가 존재합니다."), + DATA_NOT_CHANGE("DT003","아직 갱신되지 않았습니다."), DATA_NO("DT003", "데이터 미존재"), DB_ERROR("DB001" , "디비 처리중 오류"), PLAN_DATA_DUPLICATE("FT500", "이미 등록된 비행계획서의 비행구역과 비행시간이 일치합니다.\n비행시간 또는 비행구역을 수정하여 주십시오."), ARCRFT_DATA_DUPLICATE("FT501", "해당 기체는 다른 비행계획서에서 이미 등록된 기체입니다.\n비행시간 또는 기체 정보를 확인하여 주십시오."), PLAN_LAANC_NOT_VALID("FT502", "LAANC를 통과하지 못한 비행계획서입니다."), EXTERNAL_API_ERROR("EA500", "외부서버 호출에 실패하였습니다."), - AUTH_NAUTHORIZED("AU001", "권한이 없습니다."); + AUTH_NAUTHORIZED("AU001", "권한이 없습니다."), - + // TS 연동 ERROR CODE + TS_SUCCESS("TS200", "정상적으로 수신되었습니다."), + TS_PARAM("TS300", "메시지 규격이 다릅니다."), // Json 포멧이 틀린 경우 + TS_PARAM_REQUIRED("TS301", "필수 항목이 누락되었습니다."), // 필수 항목이 누락된 경우 + TS_TYPE("TS302", "메시지 타입이 맞지 않습니다."), // 메시지내 파라미터의 타입이 잘못된 경우 + TS_SERVER_ERROR("TS500", "서버 연결이 되지 않습니다."), // call측 network exception 처리 + TS_NT_LAZY("TS501", "네트워크 연결이 지연 됩니다."), // call측 network exception 처리 + TS_AUTH_KEY("TS600", "인증키가 유효하지 않습니다."), + TS_ETC("TS700", "기타 오류"); // 기 정의된 내용이 아닌 기타 오류인 경우 private final String code;