diff --git a/mens-api/src/main/java/kr/xit/ens/kt/service/IKtMmsService.java b/mens-api/src/main/java/kr/xit/ens/kt/service/IKtMmsService.java index 3451765..41ba7f5 100644 --- a/mens-api/src/main/java/kr/xit/ens/kt/service/IKtMmsService.java +++ b/mens-api/src/main/java/kr/xit/ens/kt/service/IKtMmsService.java @@ -1,8 +1,11 @@ package kr.xit.ens.kt.service; -import kr.xit.biz.ens.model.kt.KtMmsDTO.KtTokenRequest; -import kr.xit.biz.ens.model.kt.KtMmsDTO.KtTokenResponse; +import kr.xit.biz.ens.model.kt.KtCommonDTO.KtCommonResponse; +import kr.xit.biz.ens.model.kt.KtMmsSendDTO.KtBefSendRequest; +import kr.xit.biz.ens.model.kt.KtTokenDTO.KtTokenRequest; +import kr.xit.biz.ens.model.kt.KtTokenDTO.KtTokenResponse; + /** *
@@ -22,4 +25,5 @@ import kr.xit.biz.ens.model.kt.KtMmsDTO.KtTokenResponse;
 public interface IKtMmsService {
 
     KtTokenResponse requestToken(final KtTokenRequest reqDTO);
+    KtCommonResponse beforeSend(final KtBefSendRequest reqDTO);
 }
diff --git a/mens-api/src/main/java/kr/xit/ens/kt/service/KtMmsService.java b/mens-api/src/main/java/kr/xit/ens/kt/service/KtMmsService.java
index 3b7b981..6b92309 100644
--- a/mens-api/src/main/java/kr/xit/ens/kt/service/KtMmsService.java
+++ b/mens-api/src/main/java/kr/xit/ens/kt/service/KtMmsService.java
@@ -1,9 +1,18 @@
 package kr.xit.ens.kt.service;
 
-import kr.xit.biz.ens.model.kt.KtMmsDTO.KtTokenRequest;
-import kr.xit.biz.ens.model.kt.KtMmsDTO.KtTokenResponse;
+import java.util.ArrayList;
+import java.util.List;
+import kr.xit.biz.ens.model.kt.KtCommonDTO.ErrorMsg;
+import kr.xit.biz.ens.model.kt.KtCommonDTO.KtCommonResponse;
+import kr.xit.biz.ens.model.kt.KtMmsSendDTO.KtBefSendRequest;
+import kr.xit.biz.ens.model.kt.KtTokenDTO.KtTokenRequest;
+import kr.xit.biz.ens.model.kt.KtTokenDTO.KtTokenResponse;
+import kr.xit.core.spring.util.ApiWebClientUtil;
+import kr.xit.core.support.utils.DateUtils;
 import kr.xit.ens.cmm.CmmEnsUtils;
+import lombok.RequiredArgsConstructor;
 import org.egovframe.rte.fdl.cmmn.EgovAbstractServiceImpl;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 
 /**
@@ -21,12 +30,83 @@ import org.springframework.stereotype.Service;
  *
  * 
*/ +@RequiredArgsConstructor @Service public class KtMmsService extends EgovAbstractServiceImpl implements IKtMmsService { + @Value("${contract.kt.host}") + private String HOST; + @Value("${contract.kt.api.generate-token}") + private String API_GENERATE_TOKEN; + + private static final String AUTH_TYPE_BEARER = "Bearer"; + + private final ApiWebClientUtil webClient; @Override public KtTokenResponse requestToken(final KtTokenRequest reqDTO) { CmmEnsUtils.validate(reqDTO); + + return KtTokenResponse.builder() + .accessToken("eyJhbGciOiJSUzI1NiIsI…") + .expiresIn("7776000") + .scope("ag.api") + .jti("67410d77-0064-4694-9da9..") + .error("sjj") + .errorDescription("jjjjjjj") + .build(); + + +// return KtCommonResponse.builder() +// .resultCd("00") +// .resultDt(DateUtils.getTodayAndNowTime("yyyyMMddHHmmss")) +// //.errors(errors) +// .build(); +/* + String jsonStr = "{\"client_id\":\"" + "clientId" + "\",\"client_secret\":\"" + "clientSecret" + "\"}"; + + + final Map headerMap = new HashMap<>(); + headerMap.put(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE); +// headerMap.put("client-id", "client-id"); +// headerMap.put("client-tp", "10"); + headerMap.put(HttpHeaders.AUTHORIZATION, String.format("%s %s", AUTH_TYPE_BEARER, "access-token")); + + +// final KtTokenResponse tokenResponse = webClient.exchange( +// HOST + API_GENERATE_TOKEN, +// HttpMethod.POST, +// JsonUtils.toJson(reqDTO), +// KtTokenResponse.class, +// headerMap +// ); + + final String aaa = webClient.post( + HOST + API_GENERATE_TOKEN, + jsonStr, + String.class, + headerMap + ); + return null; + + */ + } + + /** + * 사전 문자 수신 등록 요청(BC-AG-SN-001) + * @param reqDTO + */ + @Override + public KtCommonResponse beforeSend(KtBefSendRequest reqDTO) { + CmmEnsUtils.validate(reqDTO); + List errors = new ArrayList<>(); + errors.add(new ErrorMsg("error1")); + errors.add(new ErrorMsg("error2")); + + return KtCommonResponse.builder() + .resultCd("00") + .resultDt(DateUtils.getTodayAndNowTime("yyyyMMddHHmmss")) + .errors(errors) + .build(); } } diff --git a/mens-api/src/main/java/kr/xit/ens/kt/web/KtMmsController.java b/mens-api/src/main/java/kr/xit/ens/kt/web/KtMmsController.java index b3e1dcb..47bd76f 100644 --- a/mens-api/src/main/java/kr/xit/ens/kt/web/KtMmsController.java +++ b/mens-api/src/main/java/kr/xit/ens/kt/web/KtMmsController.java @@ -2,9 +2,13 @@ package kr.xit.ens.kt.web; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; +import java.util.ArrayList; import kr.xit.biz.cmm.service.ICmmEnsCacheService; -import kr.xit.biz.ens.model.kt.KtMmsDTO.KtMnsRequest; -import kr.xit.biz.ens.model.kt.KtMmsDTO.KtTokenRequest; +import kr.xit.biz.ens.model.kt.KtCommonDTO.KtCommonResponse; +import kr.xit.biz.ens.model.kt.KtCommonDTO.KtMnsRequest; +import kr.xit.biz.ens.model.kt.KtMmsSendDTO.KtBefSendRequest; +import kr.xit.biz.ens.model.kt.KtTokenDTO.KtTokenRequest; +import kr.xit.biz.ens.model.kt.KtTokenDTO.KtTokenResponse; import kr.xit.core.model.ApiResponseDTO; import kr.xit.ens.kt.service.IKtMmsService; import lombok.RequiredArgsConstructor; @@ -39,10 +43,68 @@ public class KtMmsController { @Operation(summary = "기관용 토큰 발급 요청", description = "기관용 토큰 발급 요청") @PostMapping(value = "/requestToken", produces = MediaType.APPLICATION_JSON_VALUE) + //@PostMapping(value = "/requestToken", produces = MediaType.APPLICATION_FORM_URLENCODED_VALUE) public ApiResponseDTO requestToken(@RequestBody final KtMnsRequest reqDTO) { - return ApiResponseDTO.success(service.requestToken(KtTokenRequest.builder() - .build())); + + KtTokenResponse dto = service.requestToken( + KtTokenRequest.builder() + .clientId("dkdkkd") + .clientSecret("dkdkkdkdkd") + .build()); + + return ApiResponseDTO.success(dto); // return ApiResponseDTO.success( // service.requestToken(CmmKtMmsUtils.getKtMnsInfo(reqDTO.getSignguCode(), reqDTO.getFfnlgCode()))); } +/* + @io.swagger.v3.oas.annotations.parameters.RequestBody(required = true, content = { + @Content( + mediaType = "application/json", + examples = { + @ExampleObject( + value = """ + { + "service_cd": "NPS", + "service_key": "A3AD41349D759DD3", + "msg_cd": "10006", + "msg_type": "2", + "make_dt": "20211229102000", + "sndn_ex_time": "20211229180000", + "sndn_tot_cnt": 1, + "reqs": [ + { + "src_key": "S20211229102000001", + "src_seq": "1", + "ci": "gdlIa53FZGQz5aKa3wLk33nW57N3mDpcwHytWlWMhzxHKulk7EZs143442394326642342364238648423864237", + "mdn": "01011112222", "rcve_rf_str":" ○ 수신거부 및 수신 휴대폰 지정하기 :" + } + ], + "opt_type": "2", + "mktn_rcve_csyn": "N", + "m_type": "2" + } + """) + }) + })*/ + @Operation(summary = "사전 문자 수신 등록 요청", description = "사전 문자 수신 등록 요청(BC-AG-SN-001)") + @PostMapping(value = "/beforeSend", produces = MediaType.APPLICATION_JSON_VALUE) + //@PostMapping(value = "/beforeSend", produces = MediaType.APPLICATION_FORM_URLENCODED_VALUE) + public ApiResponseDTO beforeSend(@RequestBody final KtBefSendRequest reqDTO) { + + + KtBefSendRequest reqDTO2 = KtBefSendRequest.builder() + .serviceCd("NPS") + .serviceKey("A3AD41349D759DD3") + .msgCd("10006") + .msgType("2") + .makeDt("20211229102000") + .sndnExTime("20211229180000") + .mType("2") + .sndnTotCnt(1) + .reqs(new ArrayList<>()) + .build(); + + KtCommonResponse dto = service.beforeSend(reqDTO); + return ApiResponseDTO.success(dto); + } } diff --git a/mens-api/src/main/resources/egovframework/mapper/biz/ens-cmm-cache-mysql-mapper.xml b/mens-api/src/main/resources/egovframework/mapper/biz/ens-cmm-cache-mysql-mapper.xml index 3dff68c..5b8be6a 100644 --- a/mens-api/src/main/resources/egovframework/mapper/biz/ens-cmm-cache-mysql-mapper.xml +++ b/mens-api/src/main/resources/egovframework/mapper/biz/ens-cmm-cache-mysql-mapper.xml @@ -39,10 +39,14 @@ ffnlg_code, /* 과태료코드 */ signgu_nm, /* 시군구 명 */ ffnlg_nm, /* 과태료 명 */ + kakao_client_id, /* 카카오 Client ID */ + kakao_product_cd, /* 카카오 상품 코드 */ kakao_access_token, /* 카카오 access token */ kakao_contract_uuid, /* 카카오 contract uuid */ kt_access_token, /* KT access token */ kt_company_cd, /* KT company code */ + DATE_ADD(from_unixtime(kt_token_expires_in, '%Y%m%d%H%i%s'), INTERVAL -1 HOUR) AS ktTokenExpiresIn, /* KT 토큰 유효기간 */ + kt_token_jti, /* KT 토큰 식별자 */ sender_nm, /* 발송인 명 */ sender_zip_no, /* 발송인 우편 번호 */ sender_addr, /* 발송인 주소 */ diff --git a/mens-core/src/main/java/kr/xit/biz/ens/model/cmm/CmmEnsRlaybsnmDTO.java b/mens-core/src/main/java/kr/xit/biz/ens/model/cmm/CmmEnsRlaybsnmDTO.java index ea72297..fa8fd9c 100644 --- a/mens-core/src/main/java/kr/xit/biz/ens/model/cmm/CmmEnsRlaybsnmDTO.java +++ b/mens-core/src/main/java/kr/xit/biz/ens/model/cmm/CmmEnsRlaybsnmDTO.java @@ -46,6 +46,14 @@ public class CmmEnsRlaybsnmDTO extends AuditFields implements Serializable { * 과태료 명 */ private String ffnlgNm; + /** + * KAKAO CLIENT ID + */ + private String kakaoClientId; + /** + * KAKAO 상품 코드 + */ + private String kakaoProductCd; /** * KAKAO ACCESS TOKEN */ @@ -62,6 +70,14 @@ public class CmmEnsRlaybsnmDTO extends AuditFields implements Serializable { * KT COMPANY CD */ private String ktCompanyCd; + /** + * KT 토큰 유효 기간 + */ + private String ktTokenExpiresIn; + /** + * KT 토큰 식별자 + */ + private String ktTokenJti; /** * 발송인 명 */ diff --git a/mens-core/src/main/java/kr/xit/biz/ens/model/kt/KtAcmdDTO.java b/mens-core/src/main/java/kr/xit/biz/ens/model/kt/KtAcmdDTO.java new file mode 100644 index 0000000..b2f7ad3 --- /dev/null +++ b/mens-core/src/main/java/kr/xit/biz/ens/model/kt/KtAcmdDTO.java @@ -0,0 +1,350 @@ +package kr.xit.biz.ens.model.kt; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.databind.PropertyNamingStrategies; +import com.fasterxml.jackson.databind.annotation.JsonNaming; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.media.Schema.RequiredMode; +import java.util.List; +import javax.validation.Valid; +import javax.validation.constraints.Digits; +import javax.validation.constraints.Size; +import kr.xit.biz.ens.model.kt.KtCommonDTO.KtCommonResponse; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +/** + *
+ * description : KT 유통증명서 DTO
+ *               - 유통증명서 발급(BC-AG-SM-001)
+ *                 Request : {@link KtAcmdCerfRequest}
+ *                 Response : {@link KtAcmdCerfResponse}
+ *               - 전자문서 유통정보 수치조회(BC-AG-HS-001)
+ *                 Request : {@link KtAcmdInfoRequest}
+ *                 Response : {@link KtAcmdInfoResponse}
+ *               - 전자문서 유통정보 수치 확인서 발급(BC-AG-HS-002)
+ *                 Request : {@link KtAcmdInfoCfmRequest}
+ *                 Response : {@link KtAcmdInfoCfmResponse}
+ * packageName : kr.xit.biz.ens.model.kt
+ * fileName    : KtInputDTO
+ * author      : limju
+ * date        : 2023-09-26
+ * ======================================================================
+ * 변경일         변경자        변경 내용
+ * ----------------------------------------------------------------------
+ * 2023-09-26    limju       최초 생성
+ *
+ * 
+ */ +public class KtAcmdDTO { + //------------------------------------------------------------------- + // 유통증명서 발급 : BC-AG-SM-001 + // Request : KtAcmdCerfRequest + // Response : KtAcmdCerfResponse + //------------------------------------------------------------------- + @Schema(name = "KtAcmdCerfRequest", description = "KT 유통증명서 발급 요청 DTO") + @Data + @NoArgsConstructor + @AllArgsConstructor + @Builder + @JsonInclude(JsonInclude.Include.NON_NULL) + @JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class) + public static class KtAcmdCerfRequest { + /** + *
+         * 발급요청구분 - 필수 : 1자리
+         * 1: 요청, 2: 발급
+         * 
+ */ + @Schema(requiredMode = RequiredMode.REQUIRED, title = "발급유청구분", example = " ") + @Size(min = 1, max = 1, message = "발급요청구분은 필수 입니다(1|2)") + private String reqDvcd; + + /** + *
+         * 서비스코드 : 필수 - 10
+         * 
+ */ + @Schema(requiredMode = RequiredMode.REQUIRED, title = "서비스코드", example = " ") + @Size(min = 1, max = 10, message = "서비스코드는 필수 입니다(max:10)") + private String serviceCd; + + /** + *
+         * 서비스 코드 인증키 : 필수 - 8 자리
+         * 
+ */ + @Schema(requiredMode = RequiredMode.REQUIRED, title = "서비스 코드 인증키", example = " ") + @Size(min = 1, max = 8, message = "서비스 코드 인증키는 필수 입니다(max:8)") + private String serviceKey; + + /** + *
+         * 관리키 : 필수 - max 50
+         * 
+ */ + @Schema(requiredMode = RequiredMode.REQUIRED, title = "관리키", example = " ") + @Size(min = 1, max = 50, message = "관리키는 필수 입니다(max:50)") + private String srcKey; + + /** + *
+         * 발급요청사요 : max 200
+         * 
+ */ + @Schema(requiredMode = RequiredMode.AUTO, title = "발급요청사유", example = " ") + @Size(max = 200, message = "발급요청사유는 200자를 넘을수 없습니다.") + private String issReqRsn; + } + + @Schema(name = "KtAcmdCerfResponse", description = "KT 유통증명서 발급 요청 결과 DTO") + @Data + @NoArgsConstructor + @AllArgsConstructor + @Builder + @JsonInclude(JsonInclude.Include.NON_NULL) + @JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class) + public static class KtAcmdCerfResponse extends KtCommonResponse { + /** + *
+         * 발급상태 : 성공시 필수 - 1
+         * 1: 요청
+         * 2: 발급완료(통신사발급완료)
+         * 3: 발급완료(기관발급완료)
+         * 4: 발급실패
+         * 
+ */ + @Schema(requiredMode = RequiredMode.AUTO, title = "발급상태") + @Size(min = 1, max = 1) + private String issCls; + + /** + *
+         * 발급실패 메세지 : max 255
+         * 
+ */ + @Schema(requiredMode = RequiredMode.AUTO, title = "발급실패 메시지") + @Size(max = 255) + private String issResultMsg; + + /** + *
+         * 유통증명서파일명 : max 100
+         * iss_cls상태값이 '2'일 때 필수
+         * 
+ */ + @Schema(requiredMode = RequiredMode.AUTO, title = "유통증명서파일명", example = " ") + @Size(max = 100) + private String fileName; + + /** + *
+         * 유통증명서 파일의 binary 값 : 가변
+         * iss_cls상태값이 '2'일 때 필수
+         * 
+ */ + @Schema(requiredMode = RequiredMode.AUTO, title = "유통증명서 파일의 binary 값", example = " ") + private String fileBinary; + } + //------------------------------------------------------------------- + + //------------------------------------------------------------------- + // 전자문서 유통정보 수치조회 : BC-AG-HS-001 + // Request : KtAcmdInfoRequest + // Response : KtAcmdInfoResponse + //------------------------------------------------------------------- + @Schema(name = "KtAcmdInfoRequest", description = "KT 전자문서 유통정보 수치조회 요청 DTO") + @Data + @NoArgsConstructor + @AllArgsConstructor + @Builder + @JsonInclude(JsonInclude.Include.NON_NULL) + @JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class) + public static class KtAcmdInfoRequest { + /** + *
+         * 서비스코드 : 필수 - 5
+         * 
+ */ + @Schema(requiredMode = RequiredMode.REQUIRED, title = "서비스코드", example = " ") + @Size(min = 1, max = 5, message = "서비스코드는 필수 입니다(max:5)") + private String serviceCd; + + /** + *
+         * 연월 : 필수 - 7
+         * 조회대상 월 (yyyy-mm 형식)
+         * 
+ */ + @Schema(requiredMode = RequiredMode.REQUIRED, title = "연월", example = " ") + @Size(min = 7, max = 7, message = "연월은 필수 입니다(YYYY-MM)") + private String period; + } + + @Schema(name = "KtAcmdInfoResponse", description = "KT 전자문서 유통정보 수치조회 요청 결과 DTO") + @Getter + @NoArgsConstructor + @AllArgsConstructor + @SuperBuilder + @JsonInclude(JsonInclude.Include.NON_NULL) + @JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class) + public static class KtAcmdInfoResponse extends KtCommonResponse { + @Schema(requiredMode = RequiredMode.AUTO) + @Valid + private List results; + } + + @Schema(name = "KtAcmdInfoResData", description = "KT 전자문서 유통정보 수치조회 요청 결과 results DTO") + @Getter + @NoArgsConstructor + @AllArgsConstructor + @Builder + @JsonInclude(JsonInclude.Include.NON_NULL) + public static class KtAcmdInfoResData { + /** + *
+         * 모바일사업자구분 : 필수 - 2자리
+         * 발송 통신사 구분(01:KT, 02:SKT, 03:LGT)
+         * 
+ */ + @Schema(requiredMode = RequiredMode.REQUIRED, title = "통신사구분코드") + @Size(min = 2, max = 2) + @JsonProperty("mbl_bzowr_dvcd") + private String mblBzowrDvcd; + + /** + *
+         * 통계집계일 : 필수 - 10자리
+         * YYYY-MM-DD
+         * 
+ */ + @Schema(requiredMode = RequiredMode.REQUIRED, title = "통계집계일") + @Size(min = 10, max = 10) + private String date; + + /** + * 송신건수 : 필수 - 8자리 + */ + @Schema(requiredMode = RequiredMode.REQUIRED, title = "송신건수") + @Digits(integer = 8, fraction = 0) + private Integer sendCount; + + /** + * 송신건수 : 필수 - 8자리 + */ + @Schema(requiredMode = RequiredMode.REQUIRED, title = "송신건수") + @Digits(integer = 8, fraction = 0) + private Integer recvCount; + + /** + * 열람건수 : 필수 - 8자리 + */ + @Schema(requiredMode = RequiredMode.REQUIRED, title = "열람건수") + @Digits(integer = 8, fraction = 0) + private Integer readCount; + } + //------------------------------------------------------------------- + + //------------------------------------------------------------------- + // 전자문서 유통정보 수치 확인서 발급 : BC-AG-HS-002 + // Request : KtAcmdInfoCfmRequest + // Response : KtAcmdInfoCfmResponse + //------------------------------------------------------------------- + @Schema(name = "KtAcmdInfoCfmRequest", description = "KT 전자문서 유통정보 수치 확인서 발급 요청 DTO") + @Data + @NoArgsConstructor + @AllArgsConstructor + @Builder + @JsonInclude(JsonInclude.Include.NON_NULL) + @JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class) + public static class KtAcmdInfoCfmRequest extends KtAcmdInfoRequest { + /** + *
+         * 발급요청구분 - 필수 : 1자리
+         * 1: 요청, 2: 발급
+         * 
+ */ + @Schema(requiredMode = RequiredMode.REQUIRED, title = "발급유청구분", example = " ") + @Size(min = 1, max = 1, message = "발급요청구분은 필수 입니다(1|2)") + private String reqDvcd; + } + + @Schema(name = "KtAcmdInfoCfmResponse", description = "KT 전자문서 유통정보 수치 확인서 발급 요청 결과 DTO") + @Getter + @NoArgsConstructor + @AllArgsConstructor + @SuperBuilder + @JsonInclude(JsonInclude.Include.NON_NULL) + @JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class) + public static class KtAcmdInfoCfmResponse extends KtCommonResponse { + /** + *
+         * 발급상태 : 성공시 필수 - 1
+         * 1: 요청
+         * 2: 발급완료
+         * 4: 발급실패
+         * 
+ */ + @Schema(requiredMode = RequiredMode.AUTO, title = "발급상태") + @Size(min = 1, max = 1) + private String issCls; + + /** + *
+         * 발급결과 메세지 : max 255
+         * iss_cls=4 일때, 실패 메세지
+         * 
+ */ + @Schema(requiredMode = RequiredMode.AUTO, title = "발급결과 메시지") + @Size(max = 255) + private String issResultMsg; + + @Schema(requiredMode = RequiredMode.AUTO) + @Valid + private List results; + } + + @Schema(name = "KtAcmdInfoResData", description = "KT 전자문서 유통정보 수치조회 요청 결과 results DTO") + @Getter + @NoArgsConstructor + @AllArgsConstructor + @Builder + @JsonInclude(JsonInclude.Include.NON_NULL) + public static class KtAcmdInfoCfmResData { + /** + *
+         * 모바일사업자구분 : 필수 - 2자리
+         * 발송 통신사 구분(01:KT, 02:SKT, 03:LGT)
+         * 
+ */ + @Schema(requiredMode = RequiredMode.REQUIRED, title = "모바일사업자구분") + @Size(min = 2, max = 2) + @JsonProperty("mbl_bzowr_dvcd") + private String mblBzowrDvcd; + + /** + *
+         * 유통증명서파일명 : max 100
+         * iss_cls상태값이 '2'일 때 필수
+         * 
+ */ + @Schema(requiredMode = RequiredMode.AUTO, title = "유통증명서파일명") + @Size(max = 100) + private String fileName; + + /** + *
+         * 유통증명서 파일의 binary 값 : 가변
+         * iss_cls상태값이 '2'일 때 필수
+         * 
+ */ + @Schema(requiredMode = RequiredMode.AUTO, title = "유통증명서 파일의 binary 값") + private String fileBinary; + } + //------------------------------------------------------------------- +} diff --git a/mens-core/src/main/java/kr/xit/biz/ens/model/kt/KtCommonDTO.java b/mens-core/src/main/java/kr/xit/biz/ens/model/kt/KtCommonDTO.java new file mode 100644 index 0000000..58ad0ec --- /dev/null +++ b/mens-core/src/main/java/kr/xit/biz/ens/model/kt/KtCommonDTO.java @@ -0,0 +1,128 @@ +package kr.xit.biz.ens.model.kt; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.databind.PropertyNamingStrategies; +import com.fasterxml.jackson.databind.annotation.JsonNaming; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.media.Schema.RequiredMode; +import java.util.List; +import javax.validation.Valid; +import javax.validation.constraints.Size; +import kr.xit.core.model.IApiResponse; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; +import org.hibernate.validator.constraints.NotEmpty; + +/** + *
+ * description : KT 공공 알림문자 공통 DTO
+ *
+ * packageName : kr.xit.biz.ens.model.kt
+ * fileName    : KtCommonDTO
+ * author      : limju
+ * date        : 2023-09-22
+ * ======================================================================
+ * 변경일         변경자        변경 내용
+ * ----------------------------------------------------------------------
+ * 2023-09-22    limju       최초 생성
+ *
+ * 
+ */ +public class KtCommonDTO { + + @Schema(name = "KtMnsRequest", description = "KT MMS 공통 파라메터 DTO") + @Data + @NoArgsConstructor + @AllArgsConstructor + @Builder + @JsonInclude(JsonInclude.Include.NON_NULL) + public static class KtMnsRequest { + + /** + * 시군구 코드 + */ + @Schema(requiredMode = RequiredMode.REQUIRED, title = "시군구코드", example = "88328") + @NotEmpty(message = "시군구 코드는 필수 입니다") + @Size(max = 10) + private String signguCode; + + /** + * 과태료 코드 + */ + @Schema(requiredMode = RequiredMode.REQUIRED, title = "과태료코드", example = "11") + @NotEmpty(message = "과태료 코드는 필수 입니다") + @Size(max = 2) + private final String ffnlgCode = "11"; + + /** + * 주민Id + */ + @Schema(requiredMode = RequiredMode.AUTO, title = "주민번호", example = " ") + @Size(min = 13, max = 13, message = "주민번호는 13자리 입니다.") + private String juminId; + } + + @Schema(name = "KtCommonResponse", description = "KT 응답 공통 DTO") + @Getter + @NoArgsConstructor + @AllArgsConstructor + @SuperBuilder + @JsonInclude(JsonInclude.Include.NON_NULL) + @JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class) + public static class KtCommonResponse implements IApiResponse { + + /** + *
+         * 처리코드 : 2
+         * 00 : 정상, 01: 에허
+         * 
+ */ + @Schema(requiredMode = RequiredMode.REQUIRED, title = "처리코드", example = " ") + @Size(min = 2, max = 2) + private String resultCd; + + /** + *
+         * 처리일시 : 14
+         * Biz Center 응답 처리 일시(YYYYMMDDHHMISS)
+         * 
+ */ + @Schema(requiredMode = RequiredMode.REQUIRED, title = "처리일시", example = " ") + @Size(min = 14, max = 14) + private String resultDt; + + /** + *
+         * 에러내용
+         * 처리코드(resultCd) '01' 인 경우 필수
+         * 
+ */ + @Schema(requiredMode = RequiredMode.AUTO) + @Valid + private List errors; + } + + @Schema(name = "ErrorMsg", description = "KT 응답 공통 errors DTO") + @Getter + @NoArgsConstructor + @AllArgsConstructor + @SuperBuilder + @JsonInclude(JsonInclude.Include.NON_NULL) + @JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class) + public static class ErrorMsg { + + /** + *
+         * 오류메세지
+         * 
+ */ + @Schema(requiredMode = RequiredMode.REQUIRED) + @Size(max = 255) + private String errorMsg; + } + +} diff --git a/mens-core/src/main/java/kr/xit/biz/ens/model/kt/KtExcaDTO.java b/mens-core/src/main/java/kr/xit/biz/ens/model/kt/KtExcaDTO.java new file mode 100644 index 0000000..a678c95 --- /dev/null +++ b/mens-core/src/main/java/kr/xit/biz/ens/model/kt/KtExcaDTO.java @@ -0,0 +1,196 @@ +package kr.xit.biz.ens.model.kt; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.databind.PropertyNamingStrategies; +import com.fasterxml.jackson.databind.annotation.JsonNaming; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.media.Schema.RequiredMode; +import java.util.List; +import javax.validation.Valid; +import javax.validation.constraints.Digits; +import javax.validation.constraints.Size; +import kr.xit.biz.ens.model.kt.KtCommonDTO.KtCommonResponse; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; +import org.hibernate.validator.constraints.NotEmpty; + +/** + *
+ * description : KT 공공 알림문자 정산 DTO
+ *               - 기관정산화면연계 토큰인증(BC-AG-SM-002)
+ *                 Request : {@link KtTokenExcaRequest}
+ *                 Response : {@link KtCommonResponse}
+ *               - 정산연계 자료 조회 : BC-AG-EC-001
+ *                 Request : {@link KtExcaRequest}
+ *                 Response : {@link KtExcaResponse}
+ * packageName : kr.xit.biz.ens.model.kt
+ * fileName    : KtTokenDTO
+ * author      : limju
+ * date        : 2023-09-22
+ * ======================================================================
+ * 변경일         변경자        변경 내용
+ * ----------------------------------------------------------------------
+ * 2023-09-22    limju       최초 생성
+ *
+ * 
+ */ +public class KtExcaDTO { + //---------------------------------------------------------------------------------------- + // 기관정산화면연계 토큰인증 : BC-AG-SM-002 + // Request : KtTokenExcaRequest + // Response : KtCommonResponse + //---------------------------------------------------------------------------------------- + @Schema(name = "KtTokenExcaRequest", description = "KT 기관정산화면연계 토큰 인증 요청 DTO") + @Data + @NoArgsConstructor + @AllArgsConstructor + @SuperBuilder + @JsonInclude(JsonInclude.Include.NON_NULL) + @JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class) + public static class KtTokenExcaRequest { + /** + *
+         * 엑세스토큰 : 필수 - 100
+         * 기관정산화면 호출 시 전달 받은 토큰
+         * 1회 인증시 만료처리
+         * 
> + */ + @Schema(requiredMode = RequiredMode.REQUIRED, title = "엑세스토큰", example = " ") + @NotEmpty(message = "엑세스토큰은 필수 입니다(max:100)") + private String accessToken; + } + //------------------------------------------------------------------- + + //---------------------------------------------------------------------------------------- + // 정산연계 자료 조회 : BC-AG-EC-001 + // Request : KtExcaRequest + // Response : KtExcaResponse + //---------------------------------------------------------------------------------------- + @Schema(name = "KtExcaRequest", description = "KT 정산연계 자료 조회 요청 DTO") + @Data + @NoArgsConstructor + @AllArgsConstructor + @SuperBuilder + @JsonInclude(JsonInclude.Include.NON_NULL) + @JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class) + public static class KtExcaRequest { + /** + *
+         * 정산연월 : 필수 - YYYYMM
+         * 
> + */ + @Schema(requiredMode = RequiredMode.REQUIRED, title = "정산연월", example = " ") + @Size(min = 6, max = 6, message = "정산연월은 필수 입니다(YYYYMM)") + private String yyyymm; + } + + @Schema(name = "KtExcaResponse", description = "KT 정산연계 자료 조회 요청 결과 DTO") + @Getter + @NoArgsConstructor + @AllArgsConstructor + @SuperBuilder + @JsonInclude(JsonInclude.Include.NON_NULL) + @JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class) + public static class KtExcaResponse extends KtCommonResponse { + @Schema(requiredMode = RequiredMode.REQUIRED) + @Valid + private List rsps; + } + + @Schema(name = "KtExcaResData", description = "KT 정산연계 자료 조회 요청 결과 rsps DTO") + @Getter + @NoArgsConstructor + @AllArgsConstructor + @SuperBuilder + @JsonInclude(JsonInclude.Include.NON_NULL) + @JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class) + public static class KtExcaResData { + /** + *
+         * 정산연월 : 필수 - YYYYMM
+         * 
> + */ + @Schema(requiredMode = RequiredMode.REQUIRED, title = "정산연월") + @Size(min = 6, max = 6) + private String yyyymm; + + /** + *
+         * 서비스코드 : 필수 - 5
+         * 
+ */ + @Schema(requiredMode = RequiredMode.REQUIRED, title = "서비스코드") + @Size(min = 1, max = 5) + private String serviceCd; + + /** + *
+         * 문서 코드: 필수 - 5
+         * 각 기관의 문서코드
+         * 
+ */ + @Schema(requiredMode = RequiredMode.REQUIRED, title = "문서코드") + @Size(min = 5, max = 5) + private String msgCd; + + /** + *
+         * 통신사구분코드: 필수 - 2
+         * 01:KT, 02:SKT, 03:LGT
+         * 
+ */ + @Schema(requiredMode = RequiredMode.REQUIRED, title = "통신사구분코드") + @Size(min = 2, max = 2) + private String mobileGbn; + + /** + *
+         * 발송요청건수: 필수 - 9
+         * 정산년월의 기관, 문서별 발송요청 건수
+         * 
+ */ + @Schema(requiredMode = RequiredMode.REQUIRED, title = "발송요청건수") + @Digits(integer = 9, fraction = 0) + private Integer sndnReqCnt; + + /** + *
+         * 미동의발송건수: 필수 - 9
+         * 
+ */ + @Schema(requiredMode = RequiredMode.REQUIRED, title = "미동의발송건수") + @Digits(integer = 9, fraction = 0) + private Integer notAppBalsongCnt; + + /** + *
+         * 동의발송건수: 필수 - 9
+         * 
+ */ + @Schema(requiredMode = RequiredMode.REQUIRED, title = "동의발송건수") + @Digits(integer = 9, fraction = 0) + private Integer preAppBalsongCnt; + + /** + *
+         * 미동의열람건수: 필수 - 9
+         * 
+ */ + @Schema(requiredMode = RequiredMode.REQUIRED, title = "미동의열람건수") + @Digits(integer = 9, fraction = 0) + private Integer notAppSusinCnt; + + /** + *
+         * 미동의열람건수: 필수 - 9
+         * 
+ */ + @Schema(requiredMode = RequiredMode.REQUIRED, title = "동의열람건수") + @Digits(integer = 9, fraction = 0) + private Integer preAppSusinCnt; + } + //------------------------------------------------------------------- +} diff --git a/mens-core/src/main/java/kr/xit/biz/ens/model/kt/KtInputDTO.java b/mens-core/src/main/java/kr/xit/biz/ens/model/kt/KtInputDTO.java new file mode 100644 index 0000000..e0c8740 --- /dev/null +++ b/mens-core/src/main/java/kr/xit/biz/ens/model/kt/KtInputDTO.java @@ -0,0 +1,183 @@ +package kr.xit.biz.ens.model.kt; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.databind.PropertyNamingStrategies; +import com.fasterxml.jackson.databind.annotation.JsonNaming; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.media.Schema.RequiredMode; +import java.util.List; +import javax.validation.Valid; +import javax.validation.constraints.Size; +import kr.xit.biz.ens.model.kt.KtCommonDTO.KtCommonResponse; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + *
+ * description : KT MMS DTO - KT에 제공해야 하는 API DTO
+ *               - 수신거부상태 전송(BC-AG-SN-014)
+ *                 Request : {@link KtRefuseRcvRequest}
+ *                 Response : {@link KtCommonResponse}
+ *               - 수신동의상태 전송(BC-AG-SN-015)
+ *                 Request : {@link KtApproveRcvRequest}
+ *                 Response : {@link KtCommonResponse}
+ * packageName : kr.xit.biz.ens.model.kt
+ * fileName    : KtInputDTO
+ * author      : limju
+ * date        : 2023-09-26
+ * ======================================================================
+ * 변경일         변경자        변경 내용
+ * ----------------------------------------------------------------------
+ * 2023-09-26    limju       최초 생성
+ *
+ * 
+ */ +public class KtInputDTO { + //------------------------------------------------------------------- + // 수신거부상태 전송 : BC-AG-SN-014 + // Request : KtRefuseRcvRequest + // Response : KtCommonResponse + //------------------------------------------------------------------- + @Schema(name = "KtRefuseRcvRequest", description = "KT 수신거부상태 등록 요청 DTO") + @Data + @NoArgsConstructor + @AllArgsConstructor + @Builder + @JsonInclude(JsonInclude.Include.NON_NULL) + @JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class) + public static class KtRefuseRcvRequest { + /** + *
+         * 신청일자 : 8(YYYYMMDD)
+         * 수신거부 등록/해제 발생일자
+         * 
+ */ + @Schema(requiredMode = RequiredMode.AUTO, title = "신청일자", example = " ") + @Size(min = 8, max = 8, message = "신청일자는 8자 입니다.") + private String apctDt; + + @Schema(requiredMode = RequiredMode.REQUIRED) + @Valid + private List reqs; + } + + @Schema(name = "KtRefuseRcvReqData", description = "KT 수신거부상태 등록 요청 reqs DTO") + @Data + @NoArgsConstructor + @AllArgsConstructor + @Builder + @JsonInclude(JsonInclude.Include.NON_NULL) + @JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class) + public static class KtRefuseRcvReqData { + /** + *
+         * 서비스코드 : 필수 - 20
+         * BizCenter에서 발행한 기관의 서비스 코드, 전기관(ALL)
+         * 
+ */ + @Schema(requiredMode = RequiredMode.REQUIRED, title = "서비스코드", example = " ") + @Size(min = 1, max = 20, message = "서비스코드는 필수 입니다(max:20)") + private String serviceCd; + + /** + *
+         * 개인식별코드(CI) - 필수 : 88자리
+         * 
+ */ + @Schema(requiredMode = RequiredMode.REQUIRED, title = "개인식별코드", example = " ") + @Size(min = 88, max = 88, message = "개인식별코드(CI)는 필수 입니다(88자리)") + private String ci; + + /** + *
+         * 신청구분 - 필수 : 1자리
+         * 0: 해지, 1: 신청
+         * 
+ */ + @Schema(requiredMode = RequiredMode.REQUIRED, title = "신청구분", example = " ") + @Size(min = 1, max = 1, message = "신청구분은 필수 입니다(0|1)") + private String apctAcctCls; + + /** + *
+         * 신청일시 : 14
+         * 수신거부 등록/해제 발생일자 (YYYYMMDDhhmmss)
+         * 
+ */ + @Schema(requiredMode = RequiredMode.AUTO, title = "신청일시", example = " ") + @Size(min = 14, max = 14, message = "신청일시는 14자 입니다.") + private String apctTm; + } + //------------------------------------------------------------------- + + //------------------------------------------------------------------- + // 수신동의상태 전송 : BC-AG-SN-015 + // Request : KtApproveRcvRequest + // Response : KtCommonResponse + //------------------------------------------------------------------- + @Schema(name = "KtApproveRcvRequest", description = "KT 수신동의상태 등록 요청 DTO") + @Data + @NoArgsConstructor + @AllArgsConstructor + @Builder + @JsonInclude(JsonInclude.Include.NON_NULL) + @JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class) + public static class KtApproveRcvRequest { + @Schema(requiredMode = RequiredMode.REQUIRED) + @Valid + private List reqs; + } + + @Schema(name = "KtApproveRcvReqData", description = "KT 수신동의상태 등록 요청 reqs DTO") + @Data + @NoArgsConstructor + @AllArgsConstructor + @Builder + @JsonInclude(JsonInclude.Include.NON_NULL) + @JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class) + public static class KtApproveRcvReqData { + /** + *
+         * 신청일자 : 14(YYYYMMDDHHMISS)
+         * 수신동의 등록/해제 발생일시
+         * 
+ */ + @Schema(requiredMode = RequiredMode.AUTO, title = "신청일시", example = " ") + @Size(min = 8, max = 8, message = "신청일시는 14자 입니다.") + private String apctDt; + + /** + *
+         * 서비스코드 : 필수 - 20
+         * BizCenter에서 발행한 기관의 서비스 코드
+         * 
+ */ + @Schema(requiredMode = RequiredMode.REQUIRED, title = "서비스코드", example = " ") + @Size(min = 1, max = 20, message = "서비스코드는 필수 입니다(max:20)") + private String serviceCd; + + /** + *
+         * 개인식별코드(CI) - 필수 : 88자리
+         * 
+ */ + @Schema(requiredMode = RequiredMode.REQUIRED, title = "개인식별코드", example = " ") + @Size(min = 88, max = 88, message = "개인식별코드(CI)는 필수 입니다(88자리)") + private String ci; + + /** + *
+         * 신청구분 - 필수 : 1자리
+         * 0:해지(수신동의 신청상태 해지 처리)
+         * 1:신청(수신동의 신청)
+         * 
+ */ + @Schema(requiredMode = RequiredMode.REQUIRED, title = "신청구분", example = " ") + @Size(min = 1, max = 1, message = "신청구분은 필수 입니다(0|1)") + private String apctAcctCls; + } + //------------------------------------------------------------------- + +} diff --git a/mens-core/src/main/java/kr/xit/biz/ens/model/kt/KtMmsDTO.java b/mens-core/src/main/java/kr/xit/biz/ens/model/kt/KtMmsDTO.java index 71c409e..45fe75a 100644 --- a/mens-core/src/main/java/kr/xit/biz/ens/model/kt/KtMmsDTO.java +++ b/mens-core/src/main/java/kr/xit/biz/ens/model/kt/KtMmsDTO.java @@ -5,179 +5,463 @@ import com.fasterxml.jackson.databind.PropertyNamingStrategies; import com.fasterxml.jackson.databind.annotation.JsonNaming; import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema.RequiredMode; +import java.util.List; +import javax.validation.Valid; +import javax.validation.constraints.Digits; import javax.validation.constraints.Size; -import kr.xit.core.model.IApiResponse; +import kr.xit.biz.ens.model.kt.KtCommonDTO.KtCommonResponse; import lombok.AllArgsConstructor; import lombok.Builder; -import lombok.Builder.Default; import lombok.Data; +import lombok.Getter; import lombok.NoArgsConstructor; -import lombok.ToString; -import org.hibernate.validator.constraints.Length; import org.hibernate.validator.constraints.NotEmpty; /** *
- * description : KT 공공 알림문자 DTO
- *
+ * description : KT 공공 알림 문자 DTO
+ *               - 수신거부등록(BC-AG-SN-007)
+ *                 Request : {@link KtBlacklist}
+ *                 Response : {@link KtCommonResponse}
+ *               - 백오피스 발송통계 연계 조회(BC-AG-SN-011)
+ *                 Request : {@link KtSendSttcRequest}
+ *                 Response : {@link KtSendSttcResponse}
+ *               - 백오피스 발송결과 연계 조회(BC-AG-SN-012)
+ *                 Request : {@link KtSendSttcDtlRequest}
+ *                 Response : {@link KtSendSttcDtlResponse}
+ *               - Whitelist 등록(BC-AG-SN-013)
+ *                 Request : {@link KtWhitelistRequest}
+ *                 Response : {@link KtCommonResponse}
  * packageName : kr.xit.biz.ens.model.kt
  * fileName    : KtMmsDTO
  * author      : limju
- * date        : 2023-09-22
+ * date        : 2023-09-26
  * ======================================================================
  * 변경일         변경자        변경 내용
  * ----------------------------------------------------------------------
- * 2023-09-22    limju       최초 생성
+ * 2023-09-26    limju       최초 생성
  *
  * 
*/ public class KtMmsDTO { + //------------------------------------------------------------------- + // 수신거부등록 : BC-AG-SN-007 + // Request : Blacklist + // Response : KtCommonResponse + //------------------------------------------------------------------- + @Schema(name = "KtBlacklist", description = "KT 수신 거부 요청 DTO") + @Data + @NoArgsConstructor + @AllArgsConstructor + @Builder + @JsonInclude(JsonInclude.Include.NON_NULL) + @JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class) + public static class KtBlacklist { + /** + *
+         * 서비스코드 : 필수 - 20
+         * BizCenter에서 발행한 기관의 서비스 코드
+         * 
+ */ + @Schema(requiredMode = RequiredMode.REQUIRED, title = "서비스코드", example = " ") + @NotEmpty(message = "서비스코드는 필수 입니다(max:20)") + private String serviceCd; + + /** + *
+         * 서비스 코드 인증키 : 필수 - 16 자리
+         * 
+ */ + @Schema(requiredMode = RequiredMode.REQUIRED, title = "서비스 코드 인증키", example = " ") + @Size(min = 16, max = 16, message = "서비스 코드 인증키는 필수 입니다(16자리)") + private String serviceKey; + + @Schema(requiredMode = RequiredMode.REQUIRED) + @Valid + private List reqs; + } - @Schema(name = "KtMnsRequest", description = "KT MMS 공통 파라메터 DTO") + @Schema(name = "KtBlacklistReqData", description = "KT 수신거부 등록 요청 reqs DTO") @Data @NoArgsConstructor @AllArgsConstructor @Builder @JsonInclude(JsonInclude.Include.NON_NULL) - public static class KtMnsRequest { + @JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class) + public static class KtBlacklistReqData { /** - * 시군구 코드 + *
+         * 개인식별코드(CI) - 필수 : 88자리
+         * 
*/ - @Schema(requiredMode = RequiredMode.REQUIRED, title = "시군구코드", example = "88328") - @NotEmpty(message = "시군구 코드는 필수 입니다") - @Size(max = 10) - private String signguCode; + @Schema(requiredMode = RequiredMode.REQUIRED, title = "개인식별코드", example = " ") + @Size(min = 88, max = 88, message = "개인식별코드(CI)는 필수 입니다(88자리)") + private String ci; /** - * 과태료 코드 + *
+         * 신청구분 - 필수 : 1자리
+         * 0: 해지, 1: 신청
+         * 
*/ - @Schema(requiredMode = RequiredMode.REQUIRED, title = "과태료코드", example = "11") - @NotEmpty(message = "과태료 코드는 필수 입니다") - @Size(max = 2) - private final String ffnlgCode = "11"; + @Schema(requiredMode = RequiredMode.REQUIRED, title = "신청구분", example = " ") + @Size(min = 1, max = 1, message = "신청구분은 필수 입니다(0|1)") + private String apctAcctCls; /** - * 주민Id + *
+         * 신청일시 - 필수 : 14자리(YYYYMMDDHHMISS)
+         * 수신거부 등록/해지 발생일자
+         * 
*/ - @Schema(requiredMode = RequiredMode.AUTO, title = "주민번호", example = " ") - private String juminId; + @Schema(requiredMode = RequiredMode.REQUIRED, title = "신청일시", example = " ") + @Size(min = 14, max = 14, message = "신청일시는 필수 입니다(YYYYMMDDHHMISS)") + private String apctTm; } + //------------------------------------------------------------------- + + //------------------------------------------------------------------- + // 백오피스 발송통계 연계 조회 : BC-AG-SN-011 + // Request : KtSendSttcRequest + // Response : KtSendSttcResponse + //------------------------------------------------------------------- - @Schema(name = "KtTokenRequest", description = "KT MMS 토큰발행 요청 DTO") + @Schema(name = "KtSendSttcRequest", description = "KT 백오피스 발송통계 연계 조회 요청 DTO") @Data @NoArgsConstructor @AllArgsConstructor @Builder @JsonInclude(JsonInclude.Include.NON_NULL) - public static class KtTokenRequest { + @JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class) + public static class KtSendSttcRequest { + + /** + *
+         * 발송일자 : 필수(YYYYMMDD)
+         * 
+ */ + @Schema(requiredMode = RequiredMode.REQUIRED, title = "발송일자", example = " ") + @Size(min = 8, max = 8, message = "발송일자는 필수입니다(YYYYMMDD)") + private String balsongDt; + } + + @Schema(name = "KtSendSttcResponse", description = "KT 백오피스 발송통계 연계 조회 결과 DTO") + @Getter + @NoArgsConstructor + @AllArgsConstructor + @Builder + @JsonInclude(JsonInclude.Include.NON_NULL) + @JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class) + public static class KtSendSttcResponse extends KtCommonResponse { + + @Schema(requiredMode = RequiredMode.REQUIRED) + @Valid + private List rsps; + } + + @Schema(name = "KtSendSttcResData", description = "KT 백오피스 발송통계 연계 조회 결과 rsps DTO") + @Getter + @NoArgsConstructor + @AllArgsConstructor + @Builder + @JsonInclude(JsonInclude.Include.NON_NULL) + @JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class) + public static class KtSendSttcResData { + /** + *
+         * 관리키 : 필수 - max 22
+         * 통계생성기준 키값(그룹을 구분하기 위함)
+         * 
+ */ + @Schema(requiredMode = RequiredMode.REQUIRED, title = "관리키") + @Size(min = 1, max = 22) + private String srcKey; + /** - * 권한부여방식 : 'clinet_credentials' 로 고정 + *
+         * 발송일자 : 필수(YYYYMMDD)
+         * 
*/ - @Default - @Schema(requiredMode = RequiredMode.REQUIRED, title = "권한부여방식", example = "clinet_credentials") - @NotEmpty(message = "권한부여방식은 필수 입니다") - @Size(max = 100) - private String grantType = "clinet_credentials"; + @Schema(requiredMode = RequiredMode.REQUIRED, title = "발송일자") + @Size(min = 8, max = 8) + private String balsongDt; /** - * 과태료 코드 + *
+         * 서비스코드 : 필수 - 5
+         * BizCenter에서 발행한 기관의 서비스 코드
+         * 
*/ - @Schema(requiredMode = RequiredMode.REQUIRED, title = "클라이언트 ID", example = " ") - @NotEmpty(message = "클라이언트 ID는 필수 입니다") - @Size(max = 500) - private String clientId; + @Schema(requiredMode = RequiredMode.REQUIRED, title = "서비스코드") + @Size(min = 5, max = 5) + private String serviceCd; /** - * 클라이언트 secret + *
+         * 문서 코드: 필수 - 5
+         * 각 기관의 문서코드
+         * 
*/ - @Schema(requiredMode = RequiredMode.REQUIRED, title = "클라이언트 secret", example = " ") - @NotEmpty(message = "클라이언트 secret는 필수 입니다") - @Size(max = 500) - private String clientSecret; + @Schema(requiredMode = RequiredMode.REQUIRED, title = "문서코드") + @Size(min = 5, max = 5) + private String msgCd; /** *
-         * 접근토큰 권한범위 : ag.api|pf.api
+         * 통신사구분코드: 필수 - 2
+         * 01:KT, 02:SKT, 03:LGT
          * 
*/ - @Schema(requiredMode = RequiredMode.REQUIRED, title = "권한범위", example = "ag.api") - @NotEmpty(message = "권한범위는 필수 입니다") - @Length(max = 1) - private String scope; + @Schema(requiredMode = RequiredMode.REQUIRED, title = "통신사구분코드") + @Size(min = 2, max = 2) + private String mobileGbn; + + /** + *
+         * 요청건수 : 필수 - max 9
+         * 발송일자 + 서비스코드 + 문서코드 별 합
+         * 
> + */ + @Schema(requiredMode = RequiredMode.REQUIRED, title = "요청건수") + @Digits(integer = 9, fraction = 0) + private Integer balsongTotCnt; + + /** + *
+         * 매핑건수 : 필수 - max 9
+         * 3개 통신사 사용자인 경우의 건수
+         * 각 통신사 별 발송 성공 건수
+         * (통신사 사용자로 발송 실패인 경우도 집계가 됨 Ex. 다회선 사용자 등)
+         * 
> + */ + @Schema(requiredMode = RequiredMode.REQUIRED, title = "매핑건수") + @Digits(integer = 9, fraction = 0) + private Integer mapping_cnt; + + /** + *
+         * 동의건수 : 필수 - max 9
+         * 기동의 사용자의 건수
+         * 
> + */ + @Schema(requiredMode = RequiredMode.REQUIRED, title = "동의건수") + @Digits(integer = 9, fraction = 0) + private Integer approveCnt; + + /** + *
+         * 발송건수 : 필수 - max 9
+         * 각 통신사 별 정상 수신 건수
+         * 
> + */ + @Schema(requiredMode = RequiredMode.REQUIRED, title = "발송건수") + @Digits(integer = 9, fraction = 0) + private Integer balsongCnt; + + /** + *
+         * 열람건수 : 필수 - max 9
+         * 열람한 건수
+         * 
> + */ + @Schema(requiredMode = RequiredMode.REQUIRED, title = "열람건수") + @Digits(integer = 9, fraction = 0) + private Integer susinCnt; } + //------------------------------------------------------------------- - @Schema(name = "KtTokenResponse", description = "KT MMS 토큰발행 요청 결과 DTO") - @ToString + //------------------------------------------------------------------- + // 백오피스 발송결과 연계 조회 : BC-AG-SN-012 + // Request : KtSendSttcDtlRequest + // Response : KtSendSttcDtlResponse + //------------------------------------------------------------------- + @Schema(name = "KtSendSttcDtlRequest", description = "KT 백오피스 발송 결과 연계 조회 요청 DTO") + @Data @NoArgsConstructor @AllArgsConstructor @Builder @JsonInclude(JsonInclude.Include.NON_NULL) @JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class) - public static class KtTokenResponse implements IApiResponse { - //------------------------------------------------------------------- - // 토큰 발행 성공시 필수 - //------------------------------------------------------------------- + public static class KtSendSttcDtlRequest { + /** - * 접근토큰 : 성공시 필수 + *
+         * 관리키 : 필수 - max 22
+         * 통계생성기준 키값(그룹을 구분하기 위함)
+         * 
*/ - @Schema(requiredMode = RequiredMode.AUTO, title = "접근 토큰", example = " ") - @Size(max = 1000) - private String accessToken; + @Schema(requiredMode = RequiredMode.REQUIRED, title = "관리키", example = "") + @Size(min = 1, max = 22, message = "관리키는 필수입니다(max:22)") + private String srcKey; /** *
-         * 접근 토큰 유형 : 성공시 필수
-         * bearer 고정
+         * 통신사구분코드: 필수 - 2
+         * 01:KT, 02:SKT, 03:LGT
          * 
*/ - @Schema(requiredMode = RequiredMode.AUTO, title = "접근 토큰 유형", example = "bearer") - @Size(max = 100) - private final String tokenType = "bearer"; + @Schema(requiredMode = RequiredMode.REQUIRED, title = "통신사구분코드") + @Size(min = 2, max = 2) + private String mobileGbn; + } + + @Schema(name = "KtSendSttcDtlResponse", description = "KT 백오피스 발송결과 연계 조회 결과 DTO") + @Getter + @NoArgsConstructor + @AllArgsConstructor + @Builder + @JsonInclude(JsonInclude.Include.NON_NULL) + @JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class) + public static class KtSendSttcDtlResponse extends KtCommonResponse { + @Schema(requiredMode = RequiredMode.REQUIRED) + @Valid + private List rsps; + } + + @Schema(name = "KtSendSttcDtlResData", description = "KT 백오피스 발송결과 연계 조회 결과 rsps DTO") + @Getter + @NoArgsConstructor + @AllArgsConstructor + @Builder + @JsonInclude(JsonInclude.Include.NON_NULL) + @JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class) + public static class KtSendSttcDtlResData { /** - * 접근 토큰 유효 기간 : 성공시 필수 + *
+         * 결과코드 : 필수 - 4
+         * 발송결과 코드 값
+         * 40	MMS/RCS 발송	수신성공
+         * 41	MMS발송	메시지 내용 스팸
+         * 42	MMS발송	착신자 스팸
+         * 43	MMS발송	레포트 수신 시간 만료(메시지전송후 24시간 레포트 못받는 경우 )
+         * 47	MMS발송	비가입자, 결번, 서비스정지
+         * 48	MMS발송	단말기 전원 꺼짐
+         * 49	MMS발송	기타
+         * 4A	MMS발송	UNKNOWN/단말기형식오류(스팸설정)
+         * 4D	MMS발송	전송 실패(무선망), 단말기 일시정지
+         * 4J	MMS발송	비가용폰 오류
+         * 4N	MMS발송	수신거부
+         * 4O	MMS발송	LMS발송오류(시간초과)
+         * 4P	MMS발송	LMS발송오류(기타)
+         * 4T	MMS발송	가입자미존재(미동의포함)
+         * 4Q	MMS발송	수신대기
+         * 4R	MMS발송	다회선 제외
+         * 4V	MMS발송	수신등록 휴대폰번호 미존재
+         * 4W	MMS발송	기동의 사전문자 제외
+         * 50	수신확인	수신성공
+         * 60	열람확인	열람확인 (MMS발송결과순번=2, 열람타임스탬프가 있는 경우)
+         * 
*/ - @Schema(requiredMode = RequiredMode.AUTO, title = "접근 토큰 유효 기간", example = " ") - @Size(max = 100) - private String expiresIn; + @Schema(requiredMode = RequiredMode.REQUIRED, title = "결과코드") + @Size(min = 1, max = 4) + private String balsongRstCd; /** *
-         * 접근토큰 권한범위 : 성공시 필수
-         * 또는, 실패시 scope에러인 경우 발생
+         * 결과메세지 : max 200
+         * 발송결과 코드의 메세지
          * 
*/ - @Schema(requiredMode = RequiredMode.AUTO, title = "권한범위|scope에러인 경우만 발생", example = "ag.api") - @Size(max = 100) - private String scope; + @Schema(requiredMode = RequiredMode.REQUIRED, title = "결과메세지") + @Size(min = 1, max = 200) + private String balsongRstMsg; /** - * 접근토큰 식별자 : 성공시 필수 + *
+         * 건수 : 필수 - max 9
+         * 
> */ - @Schema(requiredMode = RequiredMode.AUTO, title = "접근토큰 식별자", example = "ag.api") - @Size(max = 100) - private String jtl; - //------------------------------------------------------------------- + @Schema(requiredMode = RequiredMode.REQUIRED, title = "건수") + @Digits(integer = 9, fraction = 0) + private Integer balsongCnt; + } + //------------------------------------------------------------------- + //------------------------------------------------------------------- + // Whitelist 등록 : BC-AG-SN-013 + // Request : KtWhitelistRequest + // Response : KtCommonResponse + //------------------------------------------------------------------- + @Schema(name = "KtWhitelistRequest", description = "KT Whitelist 등록 요청 DTO") + @Data + @NoArgsConstructor + @AllArgsConstructor + @Builder + @JsonInclude(JsonInclude.Include.NON_NULL) + @JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class) + public static class KtWhitelistRequest { + /** + *
+         * 서비스코드 : 필수 - 20
+         * BizCenter에서 발행한 기관의 서비스 코드
+         * 
+ */ + @Schema(requiredMode = RequiredMode.REQUIRED, title = "서비스코드", example = " ") + @NotEmpty(message = "서비스코드는 필수 입니다(max:20)") + private String serviceCd; - //------------------------------------------------------------------- - // 토큰 발행 실패시 필수 - //------------------------------------------------------------------- /** *
-         * 접근 토큰 유형 : 성공시 필수
-         * bearer 고정
+         * 서비스 코드 인증키 : 필수 - 16 자리
          * 
*/ - @Schema(requiredMode = RequiredMode.AUTO, title = "에러코드", example = " ") - @Size(max = 100) - private String error; + @Schema(requiredMode = RequiredMode.REQUIRED, title = "서비스 코드 인증키", example = " ") + @Size(min = 16, max = 16, message = "서비스 코드 인증키는 필수 입니다(16자리)") + private String serviceKey; + @Schema(requiredMode = RequiredMode.REQUIRED) + @Valid + private List reqs; + } + + @Schema(name = "KtWhitelistReqData", description = "KT Whitelist 등록 요청 reqs DTO") + @Data + @NoArgsConstructor + @AllArgsConstructor + @Builder + @JsonInclude(JsonInclude.Include.NON_NULL) + @JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class) + public static class KtWhitelistReqData { /** - * 접근 토큰 유효 기간 : 성공시 필수 + *
+         * 개인식별코드(CI) - 필수 : 88자리
+         * 
+ */ + @Schema(requiredMode = RequiredMode.REQUIRED, title = "개인식별코드", example = " ") + @Size(min = 88, max = 88, message = "개인식별코드(CI)는 필수 입니다(88자리)") + private String ci; + + /** + *
+         * 신청구분 - 필수 : 1자리
+         * 0: 해지, 1: 신청
+         * 
+ */ + @Schema(requiredMode = RequiredMode.REQUIRED, title = "신청구분", example = " ") + @Size(min = 1, max = 1, message = "신청구분은 필수 입니다(0|1)") + private String apctAcctCls; + + /** + *
+         * 모바일사업자구분 : 필수 - 2자리
+         * 발송 통신사 구분(01:KT, 02:SKT, 03:LGT)
+         * 통신사 구분, 개인휴대전화번호 중 하나는 필수입력
+         * 
+ */ + @Schema(requiredMode = RequiredMode.AUTO, title = "통신사구분코드", example = " ") + @Size(min = 2, max = 2, message = "통신사구분코드는 필수 입니다(01|02|03)") + private String mblBzowrDvcd; + + /** + *
+         * 개인휴대전화번호 : 11 자리
+         * 통신사 구분, 개인휴대전화번호 중 하나는 필수입력
+         * 
*/ - @Schema(requiredMode = RequiredMode.AUTO, title = "에러메세지", example = " ") - @Size(max = 100) - private String error_description; + @Schema(requiredMode = RequiredMode.AUTO, title = "개인휴대전화번호", example = "01011112222") + @Size(min = 11, max = 11, message = "개인 휴대 전화번호는 11자리 입니다") + private String mdn; } + //------------------------------------------------------------------- } diff --git a/mens-core/src/main/java/kr/xit/biz/ens/model/kt/KtMmsSendDTO.java b/mens-core/src/main/java/kr/xit/biz/ens/model/kt/KtMmsSendDTO.java new file mode 100644 index 0000000..6a4b292 --- /dev/null +++ b/mens-core/src/main/java/kr/xit/biz/ens/model/kt/KtMmsSendDTO.java @@ -0,0 +1,1045 @@ +package kr.xit.biz.ens.model.kt; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.databind.PropertyNamingStrategies; +import com.fasterxml.jackson.databind.annotation.JsonNaming; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.media.Schema.RequiredMode; +import java.util.List; +import javax.validation.Valid; +import javax.validation.constraints.Digits; +import javax.validation.constraints.Size; +import kr.xit.biz.ens.model.kt.KtCommonDTO.KtCommonResponse; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; +import org.hibernate.validator.constraints.NotEmpty; + +/** + *
+ * description : KT 공공 알림문자 사전알림문자, 본문자수신 등록 DTO
+ *               - 사전 알림문자 수신 등록(BC-AG-SN-001)
+ *                 Request : {@link KtBefSendRequest}
+ *                 Response : {@link KtCommonResponse}
+ *               - 본문자 수신 등록(BC-AG-SN-002)
+ *                 Request : {@link KtMainSendRequest}
+ *                 Response : {@link KtCommonResponse}
+ *               - 사전/본 문자 발송/수신 결과 전송(BC-AG-SN-010)
+ *                 - Request : {@link KtMsgRsltRequest}
+ *                 - Response : {@link KtCommonResponse}
+ * packageName : kr.xit.biz.ens.model.kt
+ * fileName    : KtMmsSendDTO
+ * author      : limju
+ * date        : 2023-09-22
+ * ======================================================================
+ * 변경일         변경자        변경 내용
+ * ----------------------------------------------------------------------
+ * 2023-09-22    limju       최초 생성
+ *
+ * 
+ */ +public class KtMmsSendDTO { + //---------------------------------------------------------------------------------------- + // 사전문자 수신 등록 : BC-AG-SN-001 + // Request : KtBefSendRequest + // Response : KtCommonResponse + //---------------------------------------------------------------------------------------- + @Schema(name = "KtBefSendRequest", description = "사전문자수신(BC-AG-SN-001) 등록 요청 DTO") + @Data + @NoArgsConstructor + @AllArgsConstructor + @SuperBuilder + @JsonInclude(JsonInclude.Include.NON_NULL) + @JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class) + public static class KtBefSendRequest { + //------------------------------------------------------------------- + // 필수 + //------------------------------------------------------------------- + /** + *
+         * 서비스 코드: 필수 - 20
+         * BizCenter에서 발행한 기관의 서비스 코드
+         * 
+ */ + @Schema(requiredMode = RequiredMode.REQUIRED, title = "서비스 코드", example = "NPS") + @NotEmpty(message = "서비스 코드는 필수 입니다(max:20)") + @Size(max = 20) + private String serviceCd; + + /** + *
+         * 서비스 코드: 필수 - 16
+         * BizCenter에서 발행한 기관의 서비스 코드 인증키
+         * 
+ */ + @Schema(requiredMode = RequiredMode.REQUIRED, title = "서비스코드", example = "A3AD41349D759DD3") + @Size(min = 16, max = 16, message = "서비스 코드 인증키는 필수 입니다") + private String serviceKey; + + /** + *
+         * 문서 코드: 필수 - 5
+         * 문서코드에 따라 발신번호 Mapping
+         * 
+ */ + @Schema(requiredMode = RequiredMode.REQUIRED, title = "문서코드", example = "10006") + @Size(min = 5, max = 5, message = "문서 코드는 필수 입니다(max:5)") + private String msgCd; + + /** + *
+         * 문발송 메시지 타입: 필수 - 1
+         * RCS/xMS (RCS :1, xMS: 2)
+         * 
+ */ + @Schema(requiredMode = RequiredMode.REQUIRED, title = "발송 메시지 타입", example = "2") + @Size(min = 1, max = 1, message = "발송 메시지 타입은 필수 입니다") + private String msgType; + + /** + *
+         * 발송시작일시: 필수 - 14
+         * 메시지 발송 처리 시작일시(YYYYMMDDHHMiSS)
+         * 
+ */ + @Schema(requiredMode = RequiredMode.REQUIRED, title = "발송시작일시", example = "20211229102000") + @Size(min = 14, max = 14, message = "발송시작일시는 필수 입니다") + private String makeDt; + + /** + *
+         * 발송마감시간: 필수 - 14
+         * 메시지 발송에 대한 마감시간(YYYYMMDDHHMiSS)
+         * 
+ */ + @Schema(requiredMode = RequiredMode.REQUIRED, title = "발송마감시간", example = "20211229180000") + @Size(min = 14, max = 14, message = "발송마감시간은 필수 입니다") + private String sndnExTime; + + /** + *
+         * 문서종류: 필수 - 3
+         * 메시지타입(과금코드)
+         * 1: LMS
+         * 2: MMS
+         * 3: 하이브리드 LMS
+         * 4: 하이브리드 MMS
+         * 5: RCS
+         * 
+ */ + @Schema(requiredMode = RequiredMode.REQUIRED, title = "문서종류", example = "2") + @NotEmpty(message = "문서종류는 필수 입니다(max:3)") + @Size(max = 3) + @JsonProperty("m_type") + private String mType; + + /** + *
+         * 발송요청건수: 필수 - 8
+         * 발송메세지의 총 건수
+         * 
+ */ + @Schema(requiredMode = RequiredMode.REQUIRED, title = "발송요청건수", example = "1") + @Digits(integer = 8, fraction = 0, message = "발송요청건수(max:8)") + private Integer sndnTotCnt; + + @Schema(requiredMode = RequiredMode.REQUIRED) + @Valid + private List reqs; + //------------------------------------------------------------------- + + /** + *
+         * 대행사 코드: max 10
+         * msg_type 1(RCS 메세지인 경우)인 경우 필수
+         * LG U+에서 사용되며 기관에서 등록한 대행사 코드의 값 default 'lguplus'
+         * 
+ */ + @Schema(requiredMode = RequiredMode.AUTO, title = "대행사코드", example = " ") + @Size(max = 10, message = "대행사 코드는 10자를 넘을 수 없습니다.") + private String agencyId; + + /** + *
+         * 부서 코드: max 5
+         * 기관에 따른 부서 코드
+         * 
+ */ + @Schema(requiredMode = RequiredMode.AUTO, title = "부서코드", example = " ") + @Size(max = 5, message = "부서 코드는 5자를 넘을 수 없습니다.") + private String deptCd; + + /** + *
+         * 발송 번호: max 20
+         * 서비스기관 발송전화번호
+         * 문서코드 등록시 발신번호 Mapping
+         * Biz.center 등록시 통신사실증명원 등록(민간)
+         *
+         * API에 있는 경우 API 발송 번호를 우선으로 하고, 없는 경우 문서코드 등록시 입력된 발신번호를 사용한다.
+         * 
+ */ + @Schema(requiredMode = RequiredMode.AUTO, title = "발송번호", example = " ") + @Size(max = 20, message = "서비스기관 발송전화번호는 20자를 넘을 수 없습니다.") + private String sndTelNo; + + /** + *
+         * 메세지발송구분: max 1
+         * 2: OPT_OUT 사전문자
+         * 6. OPT_OUT 사전문자(마케팅수신동의고객만 발송)
+         *
+         * 값이 null인 경우 default 2(OPT_OUT 사전문자)로 P/F 전송 됨
+         * 마케팅수신동의값이 'Y'인 경우 opt-type은 '6'으로 보내야 함.
+         * 
+ */ + @Schema(requiredMode = RequiredMode.AUTO, title = "메세지발송구분", example = "2") + @Size(min = 1, max = 1, message = "메세지발송구분은 1자리 입니다.") + private String optType; + + /** + *
+         * RCS 브랜드홈 값 : mzx 30
+         * msg_type 1(RCS 메시지)인 경우 필수
+         * 
+ */ + @Schema(requiredMode = RequiredMode.AUTO, title = "RCS 브랜드홈 값", example = " ") + @Size(max = 30, message = "RCS 브랜드홈 값은 30자를 넘을 수 없습니다.") + private String brandId; + + /** + *
+         * 마케팅 수신 동의 : 1
+         * Y|N
+         * 
+ */ + @Schema(requiredMode = RequiredMode.AUTO, title = "마케팅수신동의", example = "N") + @Size(min = 1, max = 1, message = "마게팅 수신 동의는 1(Y|N)자 입니다.") + private String mktnRcveCsyn; + + /** + *
+         * 사전문자 본인인증 URL 포함 여부 : 1
+         * 타 중계기관(포스토피아)에서 발송 요청인 경우 필수
+         * Y : 본인인증 URL 포함,
+         * N : 미포함 (NULL인 경우 미포함)
+         * 
+ */ + @Schema(requiredMode = RequiredMode.AUTO, title = "사전문자 본인인증 URL 포함 여부", example = "N") + @Size(min = 1, max = 1, message = "사전문자 본인인증 URL 포함 여부는 1(Y|N)자 입니다.") + private String certificationYn; + + /** + *
+         * 다회선 사용자 처리구분 : 1
+         * 1 : 다회선 모두 발송
+         * 2 : 다회선 발송 제외(default) (NULL 일경우 동일취급)
+         * 3 : 다회선 중 임의 1회선 발송
+         * 
+ */ + @Schema(requiredMode = RequiredMode.AUTO, title = "다회선 사용자 처리구분", example = "2") + @Size(min = 1, max = 1, message = "다회선 사용자 처리구분은 1(1|2|3)자 입니다.") + private String multiMblPrcType; + + /** + *
+         * 테스트 발송여부 : 1
+         * Y : 테스트 발송 (KISA 연동, 통계, 이력 제외)
+         * N : 실발송(NULL일경우 동일 취급)
+         * 
+ */ + @Schema(requiredMode = RequiredMode.AUTO, title = "테스트 발송 여부", example = "N") + @Size(min = 1, max = 1, message = "테스트 발송 여부는 1(Y|N)자 입니다.") + private String testSndnYn; + + /** + *
+         * 수신거부해제 여부 : 1
+         * Y : 해제 (수신거부 시 수신거부 해제)
+         * N : 미해제(NULL일경우 동일취급)
+         * 
+ */ + @Schema(requiredMode = RequiredMode.AUTO, title = "수신거부해제 여부", example = "Y") + @Size(min = 1, max = 1, message = "수신거부해제 여부는 1(Y|N)자 입니다.") + private String rcvRfrlYn; + } + + + @Schema(name = "KtBefSendReqData", description = "사전문자수신 등록 요청 reqs DTO") + @Getter + @NoArgsConstructor + @AllArgsConstructor + @SuperBuilder + @JsonInclude(JsonInclude.Include.NON_NULL) + @JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class) + public static class KtBefSendReqData { + //------------------------------------------------------------------- + // 필수 + //------------------------------------------------------------------- + /** + * 관리키 : 고객메시지 건별 Unique key + */ + @Schema(requiredMode = RequiredMode.REQUIRED, title = "관리키", example = "S20211229102000001") + @NotEmpty(message = "관리키는 필수 입니다(max:50)") + @Size(max = 50) + private String srcKey; + + /** + * 리스트순번 : max 8자리 + */ + @Schema(requiredMode = RequiredMode.REQUIRED, title = "리스트순번", example = "1") + @NotEmpty(message = "리스트 순번은 필수 입니다(max:8)") + @Size(max = 8) + private String srcSeq; + + /** + * 개인식별코드 : 88 자리 + */ + @Schema(requiredMode = RequiredMode.REQUIRED, title = "개인식별코드", example = "gdlIa53FZGQz5aKa3wLk33nW57N3mDpcwHytWlWMhzxHKulk7EZs143442394326642342364238648423864237") + @NotEmpty(message = "개인식별코드는 필수 입니다") + @Size(min = 88, max = 88, message = "개인식별코드는 필수 입니다(88자리)") + private String ci; + //------------------------------------------------------------------- + + /** + *
+         * 개인휴대전화번호 : 11 자리
+         * 특정 MDN으로 발송할 경우
+         * 
+ */ + @Schema(requiredMode = RequiredMode.AUTO, title = "개인휴대전화번호", example = "01011112222") + @Size(min = 11, max = 11, message = "개인 휴대 전화번호는 11자리 입니다") + private String mdn; + + /** + *
+         * 사전문자 본인인증 URL : max 1000
+         * 타 중계기관(포스토피아)에서 발송 요청인 경우 필수
+         * 사전문자 등록 시 {#INFO_CFRM_STR} 항목이 있는 경우 필수
+         * 
+ */ + @Schema(requiredMode = RequiredMode.AUTO, title = "사전문자 본인인증 URL", example = " ") + @Size(max = 1000, message = "사전문자 본인인증 URL은 1000자를 넘을 수 없습니다.") + private String url; + + /** + *
+         * 수신거부 및 수신 휴대폰 지정하기 치환문구 : max 50
+         * 수신거부 및 수신 휴대폰 지정하기 예약어로써 API에 추가 될 {#RCVE_RF_STR} 항목에 있는 문구를 치환하여 사용 한다.
+         * 항목이 NULL인 경우 default로 아래 문구를 사용 한다.
+         * "○ 수신거부 및 수신 휴대폰 지정하기 : "
+         * RCS 버튼명 사용이 가능(한글은 최대 17자 권고)
+         * 
+ */ + @Schema(requiredMode = RequiredMode.AUTO, title = "수신거부 및 수신 휴대폰 지정하기 치환문구", example = " ○ 수신거부 및 수신 휴대폰 지정하기 :") + @Size(max = 50, message = "수신거부 및 수신 휴대폰 지정하기 치환문구는 50자를 넘을 수 없습니다.") + private String rcveRfStr; + + /** + *
+         * 안내문 확인하기 치환문구 : max 50
+         * 포스토피아 발송건(url 의 값이 있는 경우)에 대해서
+         * 안내문 확인하기 예약어로써 API에 추가 될 {#INFO_CFRM_STR} 항목에 있는 문구를 치환 하여 사용 한다.
+         * 항목이 NULL인 경우 default로 아래 문구를 사용 한다.
+         * "○ 안내문 확인하기 : "
+         * RCS 버튼명 사용이 가능(한글은 최대 17자 권고)
+         * 
+ */ + @Schema(requiredMode = RequiredMode.AUTO, title = "안내문 확인하기 치환문구", example = " ") + @Size(max = 50, message = "안내문 확인하기 치환문구는 50자를 넘을 수 없습니다.") + private String infoCfrmStr; + } + //---------------------------------------------------------------------------------------- + + + //---------------------------------------------------------------------------------------- + // 본문자 수신 등록 : BC-AG-SN-002 + //---------------------------------------------------------------------------------------- + //---------------------------------------------------------------------------------------- + // 본문자 수신 등록 : BC-AG-SN-002 + // Request : KtMainSendRequest + // Response : KtCommonResponse + //---------------------------------------------------------------------------------------- + @Schema(name = "KtMainSendRequest", description = "본문자수신(BC-AG-SN-002) 등록 요청 DTO") + @Data + @NoArgsConstructor + @AllArgsConstructor + @SuperBuilder + @JsonInclude(JsonInclude.Include.NON_NULL) + @JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class) + public static class KtMainSendRequest { + //------------------------------------------------------------------- + // 필수 + //------------------------------------------------------------------- + /** + *
+         * 서비스 코드: 필수 - 20
+         * BizCenter에서 발행한 기관의 서비스 코드
+         * 
+ */ + @Schema(requiredMode = RequiredMode.REQUIRED, title = "서비스 코드", example = "NPS") + @NotEmpty(message = "서비스 코드는 필수 입니다(max:20)") + @Size(max = 20) + private String serviceCd; + + /** + *
+         * 서비스 코드: 필수 - 16
+         * BizCenter에서 발행한 기관의 서비스 코드 인증키
+         * 
+ */ + @Schema(requiredMode = RequiredMode.REQUIRED, title = "서비스코드", example = "A3AD41349D759DD3") + @Size(min = 16, max = 16, message = "서비스 코드 인증키는 필수 입니다") + private String serviceKey; + + /** + *
+         * 문서 코드: 필수 - 5
+         * 문서코드에 따라 발신번호 Mapping
+         * 
+ */ + @Schema(requiredMode = RequiredMode.REQUIRED, title = "문서코드", example = "10006") + @Size(min = 5, max = 5, message = "문서 코드는 필수 입니다(max:5)") + private String msgCd; + + /** + *
+         * 문발송 메시지 타입: 필수 - 1
+         * RCS/xMS (RCS :1, xMS: 2)
+         * 
+ */ + @Schema(requiredMode = RequiredMode.REQUIRED, title = "발송 메시지 타입", example = "2") + @Size(min = 1, max = 1, message = "발송 메시지 타입은 필수 입니다") + private String msgType; + + /** + *
+         * 발송시작일시: 필수 - 14
+         * 메시지 발송 처리 시작일시(YYYYMMDDHHMiSS)
+         * 
+ */ + @Schema(requiredMode = RequiredMode.REQUIRED, title = "발송시작일시", example = "20211229102000") + @Size(min = 14, max = 14, message = "발송시작일시는 필수 입니다") + private String makeDt; + + /** + *
+         * 발송마감시간: 필수 - 14
+         * 메시지 발송에 대한 마감시간(YYYYMMDDHHMiSS)
+         * 
+ */ + @Schema(requiredMode = RequiredMode.REQUIRED, title = "발송마감시간", example = "20211229180000") + @Size(min = 14, max = 14, message = "발송마감시간은 필수 입니다") + private String sndnExTime; + + /** + *
+         * 열람마감시간: 필수 - 14
+         * 문서열람에 대한 마감시간(YYYYMMDDHHMiSS)
+         * 
+ */ + @Schema(requiredMode = RequiredMode.REQUIRED, title = "열람마감시간", example = "20211229180000") + @Size(min = 14, max = 14, message = "열람마감시간은 필수 입니다") + private String exTime; + + /** + *
+         * 문서종류: 필수 - 3
+         * 메시지타입(과금코드)
+         * 3: LMS
+         * 4: MMS
+         * 6: RCS
+         * 
+ */ + @Schema(requiredMode = RequiredMode.REQUIRED, title = "문서종류", example = "2") + @NotEmpty(message = "문서종류는 필수 입니다(max:3)") + @Size(max = 3) + @JsonProperty("m_type") + private String mType; + + /** + *
+         * 발송요청건수: 필수 - 8
+         * 발송메세지의 총 건수
+         * 
+ */ + @Schema(requiredMode = RequiredMode.REQUIRED, title = "발송요청건수", example = "1") + @Digits(integer = 8, fraction = 0, message = "발송요청건수(max:8)") + private Integer sndnTotCnt; + + @Schema(requiredMode = RequiredMode.REQUIRED) + @Valid + private List reqs; + //------------------------------------------------------------------- + + /** + *
+         * 대행사 코드: max 10
+         * msg_type 1(RCS 메세지인 경우)인 경우 필수
+         * LG U+에서 사용되며 기관에서 등록한 대행사 코드의 값 default 'lguplus'
+         * 
+ */ + @Schema(requiredMode = RequiredMode.AUTO, title = "대행사코드", example = " ") + @Size(max = 10, message = "대행사 코드는 10자를 넘을 수 없습니다.") + private String agencyId; + + /** + *
+         * 부서 코드: max 5
+         * 기관에 따른 부서 코드
+         * 
+ */ + @Schema(requiredMode = RequiredMode.AUTO, title = "부서코드", example = " ") + @Size(max = 5, message = "부서 코드는 5자를 넘을 수 없습니다.") + private String deptCd; + + /** + *
+         * 발송 번호: max 20
+         * 문서코드 등록시 발신번호 Mapping
+         * Biz.center 등록시 통신사실증명원 등록(민간)
+         *
+         * API에 있는 경우 API 발송 번호를 우선으로 하고, 없는 경우 문서코드 등록시 입력된 발신번호를 사용한다.
+         * 
+ */ + @Schema(requiredMode = RequiredMode.AUTO, title = "발송번호", example = " ") + @Size(max = 20, message = "서비스기관 발송번호는 20자를 넘을 수 없습니다.") + private String sndTelNo; + + /** + *
+         * 메세지발송구분: max 1
+         * 3: 하이브리드
+         *
+         * 값이 null인 경우 default 1(OPT_OUT 본문)로 P/F 전송 됨
+         * 마케팅수신동의 고객인 경우 5 또는 7 코드를 전송해야 함.
+         * 
+ */ + @Schema(requiredMode = RequiredMode.AUTO, title = "메세지발송구분", example = "1") + @Size(min = 1, max = 1, message = "메세지발송구분은 1자리 입니다.") + private String optType; + + /** + *
+         * RCS 브랜드홈 값 : max 30
+         * msg_type 1(RCS 메시지)인 경우 필수
+         * 
+ */ + @Schema(requiredMode = RequiredMode.AUTO, title = "RCS 브랜드홈 값", example = " ") + @Size(max = 30, message = "RCS 브랜드홈 값은 30자를 넘을 수 없습니다.") + private String brandId; + + /** + *
+         * 토큰확인대체여부 : Y|N
+         * Y 인경우 본인인증시 열람확인처리
+         * 
+ */ + @Schema(requiredMode = RequiredMode.AUTO, title = "토큰확인대체여부", example = " ") + @Size(min = 1, max = 1, message = "토큰확인대체여부는 1자리 입니다(Y|N)") + private String tknRpmtYn; + + /** + *
+         * 열람확인대체여부 : Y|N
+         * Y 인경우 토큰인증시 열람확인처리
+         * 
+ */ + @Schema(requiredMode = RequiredMode.AUTO, title = "열람확인대체여부", example = " ") + @Size(min = 1, max = 1, message = "열람확인대체여부는 1자리 입니다(Y|N)") + private String rdngRpmtYn; + + /** + *
+         * MMS 바이너리 : 가변 - MMS 필수
+         * 이미지 등 Binary (용량 : 300KB 이내)
+         * 
+ */ + @Schema(requiredMode = RequiredMode.AUTO, title = "MMS 바이너리", example = " ") + private String mmsBinary; + + /** + *
+         * MMS 바이너리 파일포맷(확장자) : 10
+         * MMS 바이너리 값이 있는 경우 필수
+         * 
+ */ + @Schema(requiredMode = RequiredMode.AUTO, title = "MMS 바이너리 파일포맷(확장자)", example = " ") + @Size(max = 10, message = "MMS 바이너리 파일포맷(확장자)은 10자를 넘을 수 없습니다.") + private String fileFmat; + + /** + *
+         * 마케팅 수신 동의 : 1
+         * Y : 동의, N : 비동의 (NULL인 경우 비동의 처리)
+         * 
+ */ + @Schema(requiredMode = RequiredMode.AUTO, title = "마케팅수신동의", example = "N") + @Size(min = 1, max = 1, message = "마게팅 수신 동의는 1(Y|N)자 입니다.") + private String mktnRcveCsyn; + + /** + *
+         * 송신자 플랫폼 ID : max 25
+         * 타 중계기관(포스토피아)에서 발송 요청인 경우 필수
+         * 송신중계자(포스토피아) 플랫폼 ID
+         * 
+ */ + @Schema(requiredMode = RequiredMode.AUTO, title = "송신자 플랫폼 ID", example = " ") + @Size(max = 25, message = "송신자 플랫폼 ID는 25자를 넘을 수 없습니다.") + private String sndPlfmId; + + /** + *
+         * 송신 공인전자주소 : max 100
+         * 타 중계기관(포스토피아)에서 발송 요청인 경우 필수
+         * 중계자 전자유통정보 등록을 위한 송신 공인전자주소
+         * 
+ */ + @Schema(requiredMode = RequiredMode.AUTO, title = "송신 공인전자주소", example = " ") + @Size(max = 100, message = "송신 공인전자주소는 100자를 넘을 수 없습니다.") + private String sndNpost; + + /** + *
+         * 송신일시 : 14(YYYYMMDDHHMISS)
+         * 타 중계기관(포스토피아)에서 발송 요청인 경우 필수
+         * 중계자간의 발송시 유통정보의 송신일시는 송신중계자의 송신일시로 적용
+         * 
+ */ + @Schema(requiredMode = RequiredMode.AUTO, title = "송신일시", example = " ") + @Size(min = 14, max = 14, message = "송신일시는 14자 입니다.") + private String sndDate; + + /** + *
+         * 다회선 사용자 처리구분 : 1
+         * 1 : 다회선 모두 발송
+         * 2 : 다회선 발송 제외(default) (NULL 일경우 동일취급)
+         * 3 : 다회선 중 임의 1회선 발송
+         * 
+ */ + @Schema(requiredMode = RequiredMode.AUTO, title = "다회선 사용자 처리구분", example = "2") + @Size(min = 1, max = 1, message = "다회선 사용자 처리구분은 1(1|2|3)자 입니다.") + private String multiMblPrcType; + + /** + *
+         * 테스트 발송여부 : 1
+         * Y : 테스트 발송 (KISA 연동, 통계, 이력 제외)
+         * N : 실발송(NULL일경우 동일 취급)
+         * 
+ */ + @Schema(requiredMode = RequiredMode.AUTO, title = "테스트 발송 여부", example = "N") + @Size(min = 1, max = 1, message = "테스트 발송 여부는 1(Y|N)자 입니다.") + private String testSndnYn; + + /** + *
+         * 수신거부해제 여부 : 1
+         * Y : 해제 (수신거부 시 수신거부 해제)
+         * N : 미해제(NULL일경우 동일취급)
+         * 
+ */ + @Schema(requiredMode = RequiredMode.AUTO, title = "수신거부해제 여부", example = "Y") + @Size(min = 1, max = 1, message = "수신거부해제 여부는 1(Y|N)자 입니다.") + private String rcvRfrlYn; + + + /** + *
+         * 재열람 일수 : max 3
+         * 값이 있을 경우 발송시작일시+재열람 일수 동안 재열람
+         * 값이 없을 경우 열람마감이후 열람 불가
+         * 
+ */ + @Schema(requiredMode = RequiredMode.AUTO, title = "재열람 일수", example = " ") + @Size(max = 3, message = "재열람 일수는 3자를 넘을 수 없습니다.") + private String reopenDay; + } + + @Schema(name = "KtMainSendReqData", description = "본문자수신 등록 요청 reqs DTO") + @Getter + @NoArgsConstructor + @AllArgsConstructor + @SuperBuilder + @JsonInclude(JsonInclude.Include.NON_NULL) + @JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class) + public static class KtMainSendReqData { + //------------------------------------------------------------------- + // 필수 + //------------------------------------------------------------------- + /** + * 관리키 : 고객메시지 건별 Unique key + */ + @Schema(requiredMode = RequiredMode.REQUIRED, title = "관리키", example = "S20211229102000001") + @NotEmpty(message = "관리키는 필수 입니다(max:50)") + @Size(max = 50) + private String srcKey; + + /** + * 리스트순번 : max 8자리 + */ + @Schema(requiredMode = RequiredMode.REQUIRED, title = "리스트순번", example = "1") + @NotEmpty(message = "리스트 순번은 필수 입니다(max:8)") + @Size(max = 8) + private String srcSeq; + + /** + * 개인식별코드 : 88 자리 + */ + @Schema(requiredMode = RequiredMode.REQUIRED, title = "개인식별코드", example = "gdlIa53FZGQz5aKa3wLk33nW57N3mDpcwHytWlWMhzxHKulk7EZs143442394326642342364238648423864237") + @Size(min = 88, max = 88, message = "개인식별코드는 필수 입니다(88자리)") + private String ci; + + /** + * MMS 상세내용 : max 4000 + * URL 없음 + * {#INFO_CFRM_STR}, {#RCVE_RF_STR} 문자열이 없는 경우 요청 거부 처리 함. + * 단, 유통정보미생성여부가 'Y'인 경우 {#RCVE_RF_STR} 문자열만 체크. + */ + @Schema(requiredMode = RequiredMode.REQUIRED, title = "MMS 상세내용", example = "gdlIa53FZGQz5aKa3wLk33nW57N3mDpcwHytWlWMhzxHKulk7EZs143442394326642342364238648423864237") + @Size(min = 1, max = 4000, message = "MMS 상세내용은 4000자를 넘을 수 없습니다.") + private String mmsDtlCnts; + + /** + * 문서해시 : max 100 + */ + @Schema(requiredMode = RequiredMode.REQUIRED, title = "문서해시", example = "gdlIa53FZGQz5aKa3wLk33nW57N3mDpcwHytWlWMhzxHKulk7EZs143442394326642342364238648423864237") + @Size(min = 1, max = 100, message = "문서해시 100자를 넘을 수 없습니다.") + private String docHash; + //------------------------------------------------------------------- + + /** + *
+         * MMS 제목 : max 40
+         * utf-8 한글20자
+         * 
+ */ + @Schema(requiredMode = RequiredMode.AUTO, title = "MMS 제목", example = "01011112222") + @Size(max = 40, message = "MMS 제목은 40자를 넘을 수 없습니다") + private String mmsTitle; + + /** + *
+         * 연결 URL : max 1000
+         * dist_info_crt_yn의 값이 'Y'가 아닌 경우 필수
+         * 
+ */ + @Schema(requiredMode = RequiredMode.AUTO, title = "연결 URL", example = " ") + @Size(max = 1000, message = "연결 URL은 1000자를 넘을 수 없습니다.") + private String url; + + /** + *
+         * MMS 바이너리 : 가변 - MMS 필수
+         * 이미지 등 Binary (용량 : 300KB 이내)
+         * 
+ */ + @Schema(requiredMode = RequiredMode.AUTO, title = "MMS 바이너리", example = " ") + private String mmsBinary; + + /** + *
+         * MMS 바이너리 파일포맷(확장자) : 10
+         * MMS 바이너리 값이 있는 경우 필수
+         * 
+ */ + @Schema(requiredMode = RequiredMode.AUTO, title = "MMS 바이너리 파일포맷(확장자)", example = " ") + @Size(max = 10, message = "MMS 바이너리 파일포맷(확장자)은 10자를 넘을 수 없습니다.") + private String fileFmat; + + /** + *
+         * 개인휴대전화번호 : 11 자리
+         * 특정 MDN으로 발송할 경우
+         * 
+ */ + @Schema(requiredMode = RequiredMode.AUTO, title = "개인휴대전화번호", example = "01011112222") + @Size(min = 11, max = 11, message = "개인 휴대 전화번호는 11자리 입니다") + private String mdn; + + /** + *
+         * 유통정보 미생성여부 : Y|N
+         * Y : 본문자 발송 중 안내문확인하기 문구 및 URL이 표기 되지 않아야 함.(KISA 유통정보 생성 하지 않음)
+         * N Or NULL인 경우 안내문확인하기 문구 및 URL이 표기
+         * 
+ */ + @Schema(requiredMode = RequiredMode.AUTO, title = "유통정보 미생성 여부", example = " ") + @Size(min = 1, max = 1, message = "유통정보 미생성 여부는 1(Y|N)자 입니다.") + private String distInfoCrtYn; + + /** + *
+         * 안내문 확인하기 치환문구 : max 50
+         * 안내문 확인하기 예약어로써 API에 추가 될 {#INFO_CFRM_STR} 항목에 있는 문구를 치환 하여 사용 한다.
+         * 항목이 NULL인 경우 default로 아래 문구를 사용 한다.
+         * ‘○ 안내문 확인하기 : ‘
+         * RCS 버튼명 사용이 가능(한글은 최대 17자 권고)
+         * 
+ */ + @Schema(requiredMode = RequiredMode.AUTO, title = "안내문 확인하기 치환문구", example = " ") + @Size(max = 50, message = "안내문 확인하기 치환문구는 50자를 넘을 수 없습니다.") + private String infoCfrmStr; + + /** + *
+         * 수신거부 및 수신 휴대폰 지정하기 치환문구 : max 50
+         * 수신거부 및 수신 휴대폰 지정하기 예약어로써 API에 추가 될 {#RCVE_RF_STR} 항목에 있는 문구를 치환하여 사용 한다.
+         * 항목이 NULL인 경우 default로 아래 문구를 사용 한다.
+         * "○ 수신거부 및 수신 휴대폰 지정하기 : "
+         * RCS 버튼명 사용이 가능(한글은 최대 17자 권고)
+         * 
+ */ + @Schema(requiredMode = RequiredMode.AUTO, title = "수신거부 및 수신 휴대폰 지정하기 치환문구", example = " ○ 수신거부 및 수신 휴대폰 지정하기 :") + @Size(max = 50, message = "수신거부 및 수신 휴대폰 지정하기 치환문구는 50자를 넘을 수 없습니다.") + private String rcveRfStr; + } + //------------------------------------------------------------------- + + //---------------------------------------------------------------------------------------- + // 사전/본 문자 발송/수신 결과 전송 : BC-AG-SN-010 + // Request : KtMsgRsltRequest + // Response : KtCommonResponse + //---------------------------------------------------------------------------------------- + @Schema(name = "KtMsgRsltRequest", description = "사전/본 문자 발송/수신 결과 전송 요청 DTO") + @Data + @NoArgsConstructor + @AllArgsConstructor + @SuperBuilder + @JsonInclude(JsonInclude.Include.NON_NULL) + @JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class) + public static class KtMsgRsltRequest { + /** + *
+         * 서비스코드 : 필수 - 20
+         * BizCenter에서 발행한 기관의 서비스 코드
+         * 
> + */ + @Schema(requiredMode = RequiredMode.REQUIRED, title = "서비스코드", example = " ") + @NotEmpty(message = "서비스코드는 필수 입니다(max:20)") + private String serviceCd; + + /** + *
+         * 발송 요청 메시지 구분 : 필수 - 0|1
+         * 0: 사전문자, 1: 본문자
+         * 
> + */ + @Schema(requiredMode = RequiredMode.REQUIRED, title = "발송 요청 메시지 구분", example = "1") + @NotEmpty(message = "발송 요청 메시지 구분은 필수 입니다(0|1)") + private String reqMsgTypeDvcd; + + @Schema(requiredMode = RequiredMode.REQUIRED) + @Valid + private List reqs; + } + + @Schema(name = "KtMsgRsltReqData", description = "사전/본 문자 발송/수신 결과 전송 요청 reqs DTO") + @Data + @NoArgsConstructor + @AllArgsConstructor + @SuperBuilder + @JsonInclude(JsonInclude.Include.NON_NULL) + @JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class) + public static class KtMsgRsltReqData { + //------------------------------------------------------------------- + // 필수 + //------------------------------------------------------------------- + /** + * 관리키 : 고객메시지 건별 Unique key + */ + @Schema(requiredMode = RequiredMode.REQUIRED, title = "관리키", example = "S20211229102000001") + @NotEmpty(message = "관리키는 필수 입니다(max:50)") + @Size(max = 50) + private String srcKey; + + /** + *
+         * MMS 발송결과 상태 순번 : 필수 - max 8
+         * 1:수신시(결과), 열람시(결과):2
+         * 
> + */ + @Schema(requiredMode = RequiredMode.REQUIRED, title = "MMS 발송결과 상태 순번", example = " ") + @Digits(integer = 8, fraction = 0, message = "MMS 발송결과 상태 순번(1|2)") + private Integer mmsSndgRsltSqno; + + /** + *
+         * 처리일자 : 필수 - 8
+         * 이통사 처리일자
+         * 
> + */ + @Schema(requiredMode = RequiredMode.REQUIRED, title = "처리일자", example = " ") + @Size(min = 8, max = 8, message = "처리일자는 필수 입니다(YYYYMMDD)") + private String prcsDt; + + /** + * 문서코드 : 필수 - 5자리 + */ + @Schema(requiredMode = RequiredMode.REQUIRED, title = "문서코드", example = "S20211229102000001") + @NotEmpty(message = "문서코드는 필수 입니다(5자리)") + @Size(max = 5) + private String mmsBsnsDvcd; + + /** + *
+         * 모바일사업자구분 : 필수 - 2자리
+         * 발송 통신사 구분(01:KT, 02:SKT, 03:LGT)
+         * 
+ */ + @Schema(requiredMode = RequiredMode.REQUIRED, title = "모바일사업자구분", example = " ") + @Size(min = 2, max = 2, message = "모바일 사업자 구분은 필수 입니다(01|02|03)") + private String mblBzowrDvcd; + + /** + *
+         * 발송결과코드 : 필수 - 2자리
+         * 40	MMS/RCS 발송	수신성공
+         * 41	MMS발송	메시지 내용 스팸
+         * 42	MMS발송	착신자 스팸
+         * 43	MMS발송	레포트 수신 시간 만료(메시지전송후 24시간 레포트 못받는 경우 )
+         * 47	MMS발송	비가입자, 결번, 서비스정지
+         * 48	MMS발송	단말기 전원 꺼짐
+         * 49	MMS발송	기타
+         * 4A	MMS발송	UNKNOWN/단말기형식오류(스팸설정)
+         * 4D	MMS발송	전송 실패(무선망), 단말기 일시정지
+         * 4J	MMS발송	비가용폰 오류
+         * 4N	MMS발송	수신거부
+         * 4O	MMS발송	LMS발송오류(시간초과)
+         * 4P	MMS발송	LMS발송오류(기타)
+         * 4T	MMS발송	가입자미존재(미동의포함)
+         * 4Q	MMS발송	수신대기
+         * 4R	MMS발송	다회선 제외
+         * 4V	MMS발송	수신등록 휴대폰번호 미존재
+         * 4W	MMS발송	기동의 사전문자 제외
+         * 50	수신확인	수신성공
+         * 60	열람확인	열람확인 (MMS발송결과순번=2, 열람타임스탬프가 있는 경우)
+         * 
+ */ + @Schema(requiredMode = RequiredMode.REQUIRED, title = "발송결과코드", example = "S20211229102000001") + @Size(min = 2, max = 2, message = "발송결과코드는 필수 입니다") + private String mmsSndgRsltDvcd; + + /** + *
+         * 발송타임스탬프 : 필수 - 14
+         * YYYYMMDDHHMISS
+         * 
> + */ + @Schema(requiredMode = RequiredMode.REQUIRED, title = "발송타임스탬프", example = " ") + @Size(min = 14, max = 14, message = "발송타임스탬프는 필수 입니다(YYYYMMDDHHMISS)") + private String mmsSndgTmst; + + /** + *
+         * 문발송 메시지 타입: 필수 - 1
+         * RCS/xMS (RCS :1, xMS: 2)
+         * 
+ */ + @Schema(requiredMode = RequiredMode.REQUIRED, title = "발송 메시지 타입", example = "2") + @Size(min = 1, max = 1, message = "발송 메시지 타입은 필수 입니다") + private String msgType; + //------------------------------------------------------------------- + + /** + *
+         * 실제발송번호(일부) : max 20
+         * 고객휴대폰번호 일부 (****0323)
+         * 
+ */ + @Schema(requiredMode = RequiredMode.AUTO, title = "실제발송번호(일부)", example = "S20211229102000001") + @Size(max = 20, message = "실제발송번호(일부)는 20자를 넘을 수 없습니다.") + private String rl_mms_sndg_telno; + + /** + *
+         * 수신타임스탬프 : 14
+         * mms_sndg_rslt_sqno 코드값이 1인 경우 필수
+         * 
> + */ + @Schema(requiredMode = RequiredMode.AUTO, title = "수신타임스탬프", example = " ") + @Size(min = 14, max = 14, message = "수신타임스탬프는 14자리 입니다") + private String mmsRcvTmst; + + /** + *
+         * 열람타임스탬프 : 14
+         * mms_sndg_rslt_sqno 코드값이 2인 경우 필수
+         * 
> + */ + @Schema(requiredMode = RequiredMode.AUTO, title = "열람타임스탬프", example = " ") + @Size(min = 14, max = 14, message = "열람타임스탬프는 14자리 입니다") + private String mmsRdgTmst; + + /** + *
+         * 기동의발송여부: 1
+         * Y: 기동의(발송 시점 전 수신동의 및 전자주소가 생성되어있는 고객)
+         * N: 미동의(발송 시점까지 수신동의 및 전자주소가 생성되어있지 않은 고객)
+         * 
+ */ + @Schema(requiredMode = RequiredMode.AUTO, title = "기동의발송여부", example = "2") + @Size(min = 1, max = 1, message = "기동의발송여부는 1자리 입니다(Y|N)") + private String prevApproveYn; + + /** + *
+         * 수신자 공인전자주소 : max 100
+         * 타 중계기관(포스토피아)에서 발송 요청 메시지 회신인 경우 필수
+         * mms_sndg_rslt_sqno이 1, 2인 경우 필수
+         * 송신중계자에 제공해야할 정보
+         * 
+ */ + @Schema(requiredMode = RequiredMode.AUTO, title = "수신자 공인전자주소", example = " ") + @Size(max = 100, message = "수신자 공인전자주소는 100자를 넘을 수 없습니다.") + private String rcvNpost; + + /** + *
+         * 수신 중계자 플랫폼 ID : max 25
+         * 타 중계기관(포스토피아)에서 발송 요청 메시지 회신인 경우 필수
+         * 수신 중계자플랫폼ID (각 P/F의 중계자 ID)
+         * 
+ */ + @Schema(requiredMode = RequiredMode.AUTO, title = "수신 중계자 플랫폼 ID", example = " ") + @Size(max = 25, message = "수신 중계자 플랫폼 ID는 25자를 넘을 수 없습니다.") + private String rcvPlfmId; + + /** + *
+         * 클릭일시 : 14(YYYYMMDDHHMISS)
+         * 지정된 기관(국민연금공단, AXA자동차보험)의 메시지 열람 클릭일시(최초1회시)
+         * 
+ */ + @Schema(requiredMode = RequiredMode.AUTO, title = "클릭일시", example = " ") + @Size(min = 14, max = 14, message = "클릭일시는 14자 입니다.") + private String clickDt; + + /** + *
+         * 동의일시 : 14(YYYYMMDDHHMISS)
+         * 지정된 기관(국민연금공단, AXA자동차보험)의 최초 동의 일시
+         * 
+ */ + @Schema(requiredMode = RequiredMode.AUTO, title = "동의일시", example = " ") + @Size(min = 14, max = 14, message = "동의일시는 14자 입니다.") + private String approveDt; + + /** + *
+         * RCS 발송 여부: 1
+         * Y: RCS 발송 , N : xMS 발송
+         * 
+ */ + @Schema(requiredMode = RequiredMode.AUTO, title = "RCS 발송 여부", example = "2") + @Size(min = 1, max = 1, message = "RCS 발송 여부는 1자리 입니다(Y|N)") + private String rcyYn; + } + //------------------------------------------------------------------- + +} diff --git a/mens-core/src/main/java/kr/xit/biz/ens/model/kt/KtTokenDTO.java b/mens-core/src/main/java/kr/xit/biz/ens/model/kt/KtTokenDTO.java new file mode 100644 index 0000000..fb234f3 --- /dev/null +++ b/mens-core/src/main/java/kr/xit/biz/ens/model/kt/KtTokenDTO.java @@ -0,0 +1,269 @@ +package kr.xit.biz.ens.model.kt; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.databind.PropertyNamingStrategies; +import com.fasterxml.jackson.databind.annotation.JsonNaming; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.media.Schema.RequiredMode; +import javax.validation.constraints.Size; +import kr.xit.biz.ens.model.kt.KtCommonDTO.KtCommonResponse; +import kr.xit.core.model.IApiResponse; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Builder.Default; +import lombok.Data; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; +import org.hibernate.validator.constraints.Length; +import org.hibernate.validator.constraints.NotEmpty; + +/** + *
+ * description : KT 공공 알림문자 토큰발행 DTO
+ *               - 토큰발행
+ *                 Request: {@link KtTokenRequest}
+ *                 Response: {@link KtTokenResponse}
+ *               - Token 인증 확인 조회(BC-AG-SN-008)
+ *                 Request: {@link KtTokenConfirmRequest}
+ *                 Response: {@link KtCommonResponse}
+ *               - 열람확인결과전송(BC-AG-SN-009)
+ *                 Request : {@link KtTokenReadRequest}
+ *                 Response : {@link KtCommonResponse}
+ *               - 기관정산화면연계 토큰인증(BC-AG-SM-002)
+ *                 Request : {@link KtTokenExcaRequest}
+ *                 Response : {@link KtCommonResponse}
+ * packageName : kr.xit.biz.ens.model.kt
+ * fileName    : KtTokenDTO
+ * author      : limju
+ * date        : 2023-09-22
+ * ======================================================================
+ * 변경일         변경자        변경 내용
+ * ----------------------------------------------------------------------
+ * 2023-09-22    limju       최초 생성
+ *
+ * 
+ */ +public class KtTokenDTO { + + //---------------------------------------------------------------------------------------- + // Token 발행 + // Request : KtTokenRequest + // Response : KtTokenResponse + //---------------------------------------------------------------------------------------- + @Schema(name = "KtTokenRequest", description = "KT MMS 토큰발행 요청 DTO") + @Data + @NoArgsConstructor + @AllArgsConstructor + @Builder + @JsonInclude(JsonInclude.Include.NON_NULL) + @JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class) + public static class KtTokenRequest { + + /** + * 권한부여방식 : 'clinet_credentials' 로 고정 + */ + @Default + @Schema(requiredMode = RequiredMode.REQUIRED, title = "권한부여방식", example = "clinet_credentials") + @NotEmpty(message = "권한부여방식은 필수 입니다") + @Size(max = 100) + private String grantType = "clinet_credentials"; + + /** + * 과태료 코드 + */ + @Schema(requiredMode = RequiredMode.REQUIRED, title = "클라이언트 ID", example = " ") + @NotEmpty(message = "클라이언트 ID는 필수 입니다") + @Size(max = 500) + private String clientId; + + /** + * 클라이언트 secret + */ + @Schema(requiredMode = RequiredMode.REQUIRED, title = "클라이언트 secret", example = " ") + @NotEmpty(message = "클라이언트 secret는 필수 입니다") + @Size(max = 500) + private String clientSecret; + + /** + *
+         * 접근토큰 권한범위 : ag.api|pf.api
+         * 
+ */ + @Default + @Schema(requiredMode = RequiredMode.REQUIRED, title = "권한범위", example = "ag.api") + @NotEmpty(message = "권한범위는 필수 입니다") + @Length(max = 100) + private String scope = "ag.api"; + } + + @Schema(name = "KtTokenResponse", description = "KT MMS 토큰발행 요청 결과 DTO") + @Getter + @NoArgsConstructor + @AllArgsConstructor + @SuperBuilder + @JsonInclude(JsonInclude.Include.NON_NULL) + @JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class) + public static class KtTokenResponse implements IApiResponse { + //------------------------------------------------------------------- + // 토큰 발행 성공시 필수 + //------------------------------------------------------------------- + /** + * 접근토큰 : 성공시 필수 + */ + @Schema(requiredMode = RequiredMode.AUTO, title = "접근 토큰", example = " ") + @Size(max = 1000) + private String accessToken; + + /** + *
+         * 접근 토큰 유형 : 성공시 필수
+         * bearer 고정
+         * 
+ */ + @Schema(requiredMode = RequiredMode.AUTO, title = "접근 토큰 유형", example = "bearer") + @Size(max = 100) + private final String tokenType = "bearer"; + + /** + * 접근 토큰 유효 기간 : 성공시 필수 + */ + @Schema(requiredMode = RequiredMode.AUTO, title = "접근 토큰 유효 기간", example = " ") + @Size(max = 100) + private String expiresIn; + + /** + *
+         * 접근토큰 권한범위 : 성공시 필수
+         * 또는, 실패시 scope에러인 경우 발생
+         * 
+ */ + @Schema(requiredMode = RequiredMode.AUTO, title = "권한범위|scope에러인 경우만 발생", example = "ag.api") + @Size(max = 100) + private String scope; + + /** + * 접근토큰 식별자 : 성공시 필수 + */ + @Schema(requiredMode = RequiredMode.AUTO, title = "접근토큰 식별자", example = "ag.api") + @Size(max = 100) + private String jti; + //------------------------------------------------------------------- + + //------------------------------------------------------------------- + // 토큰 발행 실패시 필수 + //------------------------------------------------------------------- + /** + *
+         * 접근 토큰 유형 : 성공시 필수
+         * bearer 고정
+         * 
+ */ + @Schema(requiredMode = RequiredMode.AUTO, title = "에러코드", example = " ") + @Size(max = 100) + private String error; + + /** + * 접근 토큰 유효 기간 : 성공시 필수 + */ + @Schema(requiredMode = RequiredMode.AUTO, title = "에러메세지", example = " ") + @Size(max = 100) + private String errorDescription; + } + //---------------------------------------------------------------------------------------- + + + //---------------------------------------------------------------------------------------- + // Token 인증 확인 조회 : BC-AG-SN-008 + // Request : KtTokenConfirmRequest + // Response : KtCommonResponse + //---------------------------------------------------------------------------------------- + @Schema(name = "KtTokenConfirmRequest", description = "KT 토큰 인증 확인 요청 DTO") + @Data + @NoArgsConstructor + @AllArgsConstructor + @SuperBuilder + @JsonInclude(JsonInclude.Include.NON_NULL) + @JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class) + public static class KtTokenConfirmRequest { + /** + *
+         * 서비스코드 : 필수 - 20
+         * BizCenter에서 발행한 기관의 서비스 코드
+         * 
> + */ + @Schema(requiredMode = RequiredMode.REQUIRED, title = "서비스코드", example = " ") + @NotEmpty(message = "서비스코드는 필수 입니다(max:20)") + private String serviceCd; + + /** + *
+         * 서비스 코드 인증키 : 필수 - 16 자리
+         * 
+ */ + @Schema(requiredMode = RequiredMode.REQUIRED, title = "서비스 코드 인증키", example = " ") + @Size(min = 16, max = 16, message = "서비스 코드 인증키는 필수 입니다(16자리)") + private String serviceKey; + + /** + *
+         * 토큰 : 필수 - max 150
+         * 
+ */ + @Schema(requiredMode = RequiredMode.REQUIRED, title = "토큰", example = " ") + @Size(min = 1, max = 150, message = "토큰은 필수 입니다(max:150)") + private String accessToken; + } + //---------------------------------------------------------------------------------------- + + //---------------------------------------------------------------------------------------- + // 열람확인결과전송 : BC-AG-SN-009 + // Request : KtTokenReadRequest + // Response : KtCommonResponse + //---------------------------------------------------------------------------------------- + @Schema(name = "KtTokenReadRequest", description = "KT 열람확인 결과 전송 요청 DTO") + @Data + @NoArgsConstructor + @AllArgsConstructor + @SuperBuilder + @JsonInclude(JsonInclude.Include.NON_NULL) + @JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class) + public static class KtTokenReadRequest extends KtTokenConfirmRequest { + /** + *
+         * 서비스코드 : 필수 - 20
+         * BizCenter에서 발행한 기관의 서비스 코드
+         * 
> + */ + @Schema(requiredMode = RequiredMode.REQUIRED, title = "서비스코드", example = " ") + @NotEmpty(message = "서비스코드는 필수 입니다(max:20)") + private String mmsRdgTmst; + } + //------------------------------------------------------------------- + + //---------------------------------------------------------------------------------------- + // 기관정산화면연계 토큰인증 : BC-AG-SM-002 + // Request : KtTokenExcaRequest + // Response : KtCommonResponse + //---------------------------------------------------------------------------------------- + @Schema(name = "KtTokenExcaRequest", description = "KT 기관정산화면연계 토큰 인증 요청 DTO") + @Data + @NoArgsConstructor + @AllArgsConstructor + @SuperBuilder + @JsonInclude(JsonInclude.Include.NON_NULL) + @JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class) + public static class KtTokenExcaRequest { + /** + *
+         * 엑세스토큰 : 필수 - 100
+         * 기관정산화면 호출 시 전달 받은 토큰
+         * 1회 인증시 만료처리
+         * 
> + */ + @Schema(requiredMode = RequiredMode.REQUIRED, title = "엑세스토큰", example = " ") + @NotEmpty(message = "엑세스토큰은 필수 입니다(max:100)") + private String accessToken; + } + //------------------------------------------------------------------- +} diff --git a/mens-core/src/main/java/kr/xit/biz/ens/model/nice/NiceCiDTO.java b/mens-core/src/main/java/kr/xit/biz/ens/model/nice/NiceCiDTO.java index 0d30db4..f675e88 100644 --- a/mens-core/src/main/java/kr/xit/biz/ens/model/nice/NiceCiDTO.java +++ b/mens-core/src/main/java/kr/xit/biz/ens/model/nice/NiceCiDTO.java @@ -61,6 +61,7 @@ public class NiceCiDTO { * 주민Id */ @Schema(requiredMode = RequiredMode.AUTO, title = "주민번호", example = " ") + @Size(min = 13, max = 13, message = "주민번호는 13자리 입니다.") private String juminId; } @@ -403,7 +404,7 @@ public class NiceCiDTO { * */ @Schema(requiredMode = RequiredMode.REQUIRED, title = "공개키버전", example = "20210121ca8c1612-2c2d-IPaa-aad1-xxxxxxxxxxxx") - @NotEmpty(message = "공개키버전은 필수 입니다") + @NotEmpty(message = "공개키버전은 필수 입니다(max:50)") @Size(max = 50) private String pubkeyVersion; diff --git a/mens-core/src/main/java/kr/xit/core/spring/config/WebMvcConfig.java b/mens-core/src/main/java/kr/xit/core/spring/config/WebMvcConfig.java index f72c832..c1f657c 100644 --- a/mens-core/src/main/java/kr/xit/core/spring/config/WebMvcConfig.java +++ b/mens-core/src/main/java/kr/xit/core/spring/config/WebMvcConfig.java @@ -76,8 +76,12 @@ public class WebMvcConfig implements WebMvcConfigurer { */ @Override public void extendMessageConverters(List> converters) { + //converters.forEach(System.out::println); + // XML 관련 HttpMessageConverter 의 우선순위를 최하위로 낮추는 메소드 reorderXmlConvertersToEnd(converters); + + //converters.forEach(System.out::println); } @Override