Compare commits
85 Commits
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,24 @@
|
||||
|
||||
echo "1.remove...."
|
||||
rm -r /DATA/was/phts-manager/*
|
||||
|
||||
echo "2.file move...."
|
||||
cp /DATA/was/deploy-app/phts-manager/war/module-post-0.0.1-SNAPSHOT.war /DATA/was/phts-manager/phts-manager.war
|
||||
|
||||
echo "3.unzip..."
|
||||
cd /DATA/was/phts-manager/
|
||||
jar xvf ./phts-manager.war
|
||||
|
||||
echo "4.add jar..."
|
||||
cp /DATA/was/deploy-app/phts-manager/lib/tomcat-juli-8.5.4.jar /DATA/was/phts-manager/WEB-INF/lib/
|
||||
cp /DATA/was/deploy-app/phts-manager/lib/javaee.jar /DATA/was/phts-manager/WEB-INF/lib/
|
||||
#cp /was/deploy-app/phts-manager/lib/ojdbc8.jar /was/phts-manager/WEB-INF/lib/
|
||||
|
||||
#echo "5.remove jar..."
|
||||
#rm -r /was/phts-manager/WEB-INF/lib/log4j-api-*.jar
|
||||
#rm -r /was/phts-manager/WEB-INF/lib/log4j-to-slf4j-*.jar
|
||||
#rm -r /was/phts-manager/WEB-INF/lib/tomcat-embed*.jar
|
||||
#rm -r /was/phts-manager/WEB-INF/lib-provided/tomcat-embed*.jar
|
||||
|
||||
#echo "5.redis start..."
|
||||
#java -jar ./war/redis-0.0.1-SNAPSHOT.jar
|
@ -0,0 +1,244 @@
|
||||
package cokr.xit.ens.modules.nice.cmm;
|
||||
|
||||
import java.io.*;
|
||||
import java.nio.charset.*;
|
||||
|
||||
import org.apache.commons.lang3.*;
|
||||
|
||||
import cokr.xit.ens.core.exception.*;
|
||||
import lombok.extern.slf4j.*;
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* description :
|
||||
* packageName : cokr.xit.ens.modules.nice.cmm
|
||||
* fileName : NiceCiUtils
|
||||
* author : limju
|
||||
* date : 2024 9월 25
|
||||
* ======================================================================
|
||||
* 변경일 변경자 변경 내용
|
||||
* ----------------------------------------------------------------------
|
||||
* 2024 9월 25 limju 최초 생성
|
||||
*
|
||||
* </pre>
|
||||
*/
|
||||
@Slf4j
|
||||
public class NiceCiUtils {
|
||||
|
||||
/**
|
||||
* "ISO-8859-1", "UTF-8", "EUC-KR" 중 하나로 변환
|
||||
* @param src
|
||||
* @param charset
|
||||
* @return String
|
||||
*/
|
||||
public static String covertCharset(final String src, final String charset){
|
||||
|
||||
try {
|
||||
return new String(src.getBytes(), charset);
|
||||
} catch (UnsupportedEncodingException e) {
|
||||
throw BizRuntimeException.create(e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* "ISO-8859-1", "UTF-8", "EUC-KR" -> "ISO-8859-1", "UTF-8", "EUC-KR" 중 하나로 변환
|
||||
* @param src "ISO-8859-1", "UTF-8", "EUC-KR"
|
||||
* @param srcCharset "ISO-8859-1", "UTF-8", "EUC-KR"
|
||||
* @param tgtCharset "ISO-8859-1", "UTF-8", "EUC-KR"
|
||||
* @return String
|
||||
*/
|
||||
public static String covertCharset(final String src, final Charset srcCharset, final Charset tgtCharset) {
|
||||
|
||||
//CharBuffer cb = srcCharset.decode(ByteBuffer.wrap(src.getBytes(srcCharset)));
|
||||
//try {
|
||||
return new String(src.getBytes(srcCharset), tgtCharset);
|
||||
//} catch (UnsupportedEncodingException e) {
|
||||
// throw BizRuntimeException.create(e.getMessage());
|
||||
// }
|
||||
}
|
||||
|
||||
/**
|
||||
* "ISO-8859-1", "UTF-8", "EUC-KR" -> "ISO-8859-1", "UTF-8", "EUC-KR" 중 하나로 변환
|
||||
* @param src "ISO-8859-1", "UTF-8", "EUC-KR"
|
||||
* @param srcCharset "ISO-8859-1", "UTF-8", "EUC-KR"
|
||||
* @param tgtCharset "ISO-8859-1", "UTF-8", "EUC-KR"
|
||||
* @return String
|
||||
*/
|
||||
public static String covertCharset(final String src, final String srcCharset, final String tgtCharset) {
|
||||
|
||||
try {
|
||||
return new String(src.getBytes(srcCharset), tgtCharset);
|
||||
} catch (UnsupportedEncodingException e) {
|
||||
throw BizRuntimeException.create(e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
public static String leftKr(String str, int len) {
|
||||
if (str == null) {
|
||||
return null;
|
||||
} else if (len < 0) {
|
||||
return "";
|
||||
} else {
|
||||
return lengthKr(str) <= len ? str : getStringKr(str, len);
|
||||
}
|
||||
}
|
||||
|
||||
public static String rightPadKr(String str, int size, String padStr) {
|
||||
if (str == null) {
|
||||
return null;
|
||||
} else {
|
||||
if (StringUtils.isEmpty(padStr)) {
|
||||
padStr = " ";
|
||||
}
|
||||
|
||||
int padLen = padStr.length();
|
||||
int strLen = lengthKr(str);
|
||||
int pads = size - strLen;
|
||||
if (pads <= 0) {
|
||||
return str;
|
||||
} else if (padLen == 1 && pads <= 8192) {
|
||||
return rightPadKr(str, size, padStr.charAt(0));
|
||||
} else if (pads == padLen) {
|
||||
return str.concat(padStr);
|
||||
} else if (pads < padLen) {
|
||||
return str.concat(padStr.substring(0, pads));
|
||||
} else {
|
||||
char[] padding = new char[pads];
|
||||
char[] padChars = padStr.toCharArray();
|
||||
|
||||
for(int i = 0; i < pads; ++i) {
|
||||
padding[i] = padChars[i % padLen];
|
||||
}
|
||||
|
||||
return str.concat(new String(padding));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 문자열을 한글은 2, 그외 1의 길이로 계산하여 자른다 : UTF-8 기준
|
||||
* 시작위치가 10인 경우, 10번째 글자부터 자른다.
|
||||
* -> 10번째 글자 내에 한글이 있는 경우 2자로 계산
|
||||
* -> 한글이 2자 있으면, 10-2 = 8번째 글자부터 자른다.
|
||||
* @param strText 대상문자열
|
||||
* @param beginIndex 자를 시작할 위치
|
||||
* @return
|
||||
* </pre>
|
||||
*/
|
||||
public static String substringKr(String strText, int beginIndex) {
|
||||
if(beginIndex == 0) return strText;
|
||||
|
||||
StringBuilder strRtnText = new StringBuilder();
|
||||
boolean isSkip = true;
|
||||
|
||||
for (int i = 0, skipIdx = 0; i<strText.length(); i++) {
|
||||
if(!isSkip) {
|
||||
strRtnText.append(strText.charAt(i));
|
||||
continue;
|
||||
}
|
||||
char c = strText.charAt(i);
|
||||
if (c > 127)
|
||||
skipIdx += 2;
|
||||
else
|
||||
skipIdx++;
|
||||
|
||||
if (skipIdx >= beginIndex){
|
||||
isSkip = false;
|
||||
if(skipIdx > beginIndex) strRtnText.append(strText.charAt(i));
|
||||
}
|
||||
}
|
||||
return strRtnText.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 문자열을 바이트 단위로 자른다 : UTF-8 기준
|
||||
* 한글은 2자(2바이트), 영문은 1자(1바이트) 처리
|
||||
* @param strText 대상문자열
|
||||
* @param iBytes 자르고 싶은 문자 수
|
||||
* @return
|
||||
* </pre>
|
||||
*/
|
||||
public static String getStringKr(String strText, int iBytes) {
|
||||
StringBuilder strRtnText = new StringBuilder();
|
||||
int iByte = 0;
|
||||
|
||||
// 문자열을 문자 배열로 변환하여 반복문을 통해 처리
|
||||
for (int i = 0; i < strText.length(); i++) {
|
||||
char c = strText.charAt(i);
|
||||
strRtnText.append(c);
|
||||
// 한글 등의 2바이트 문자 처리
|
||||
if(c > 127) {
|
||||
iByte += 2;
|
||||
}else{
|
||||
iByte++;
|
||||
}
|
||||
|
||||
// 지정된 바이트 수를 넘으면 반복 종료
|
||||
if (iByte >= iBytes) {
|
||||
break; // for 루프 종료
|
||||
}
|
||||
}
|
||||
return strRtnText.toString();
|
||||
}
|
||||
|
||||
public static int lengthKr(String strText) {
|
||||
return strText.chars()
|
||||
//.map(ch -> (ch > 127 || ch == '\n' || ch == '\t') ? 2 : 1) // 한글(또는 다른 비 ASCII 문자)인 경우 2바이트, 아니면 1바이트
|
||||
.map(ch -> (ch > 127) ? 2 : 1) // 한글(또는 다른 비 ASCII 문자)인 경우 2바이트, 아니면 1바이트
|
||||
.sum();
|
||||
}
|
||||
|
||||
|
||||
public static String rightPadKr(String str, int size, char padChar) {
|
||||
if (str == null) {
|
||||
return null;
|
||||
} else {
|
||||
int pads = size - lengthKr(str);
|
||||
if (pads <= 0) {
|
||||
return str;
|
||||
} else {
|
||||
return pads > 8192 ? rightPadKr(str, size, java.lang.String.valueOf(padChar)) : str.concat(StringUtils.repeat(padChar, pads));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static String decodeText(String input, String sourceEncoding, String encoding) throws IOException {
|
||||
return
|
||||
new BufferedReader(
|
||||
new InputStreamReader(
|
||||
new ByteArrayInputStream(input.getBytes("euc-kr")),
|
||||
Charset.forName(encoding)))
|
||||
.readLine();
|
||||
}
|
||||
|
||||
public static void main(String[] args) throws IOException {
|
||||
final String tgt = new String("123ab한글이ㅂa들어있다열자ㅁ".getBytes(), StandardCharsets.UTF_8);
|
||||
final String tgt2 = new String("123ab한글이ㅂa들어있다열자ㅁ".getBytes(), StandardCharsets.ISO_8859_1);
|
||||
final String tgt3 = new String("123ab한글이ㅂa들어있다열자ㅁ".getBytes(), "euc-kr");
|
||||
|
||||
System.out.println(tgt2);
|
||||
System.out.println(covertCharset(tgt2, StandardCharsets.ISO_8859_1, StandardCharsets.UTF_8));
|
||||
//System.out.println(decodeText(tgt3, "ISO_8859_1", "UTF-8"));
|
||||
System.out.println(tgt3);
|
||||
System.out.println(decodeText(tgt3, "euc-kr", "UTF-8"));
|
||||
System.out.println(covertCharset(tgt3, Charset.forName("euc-kr"), StandardCharsets.UTF_8));
|
||||
//System.out.println(covertCharset(tgt3, "EUC-KR", "UTF-8"));
|
||||
|
||||
System.out.println(substringKr(tgt, 1));
|
||||
System.out.println(substringKr(tgt, 5));
|
||||
System.out.println(substringKr(tgt, 6));
|
||||
System.out.println(substringKr(tgt, 7));
|
||||
System.out.println(substringKr(tgt, 8));
|
||||
System.out.println(substringKr("gks한글이시작되는데", 8));
|
||||
System.out.println(substringKr("한글로abcdefgh계속", 12));
|
||||
System.out.println(substringKr("1한글2ㅇ ab", 10));
|
||||
|
||||
System.out.println(leftKr(tgt, 18));
|
||||
System.out.println(leftKr(tgt2, 18));
|
||||
System.out.println(leftKr(tgt3, 18));
|
||||
|
||||
System.out.println("["+rightPadKr("1한글2ㅇ", 10, " ")+"]");
|
||||
}
|
||||
}
|
@ -0,0 +1,161 @@
|
||||
package cokr.xit.ens.modules.nice.mapper;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
import org.apache.ibatis.annotations.*;
|
||||
|
||||
import cokr.xit.ens.modules.common.ctgy.sys.mng.domain.*;
|
||||
import cokr.xit.ens.modules.nice.model.*;
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* description :
|
||||
* packageName : cokr.xit.ens.modules.nice.mapper
|
||||
* fileName : INiceMapper
|
||||
* author : limju
|
||||
* date : 2024 9월 30
|
||||
* ======================================================================
|
||||
* 변경일 변경자 변경 내용
|
||||
* ----------------------------------------------------------------------
|
||||
* 2024 9월 30 limju 최초 생성
|
||||
*
|
||||
* </pre>
|
||||
*/
|
||||
@Mapper
|
||||
public interface INiceCiMapper {
|
||||
//----------------------------------------------------------------------
|
||||
// 공통
|
||||
//----------------------------------------------------------------------
|
||||
/**
|
||||
* tb_input_xit 목록 조회
|
||||
*
|
||||
* @param niceCiParam NiceCiDTO.NiceCiParam
|
||||
* @return List<NiceCiDTO.InputXit> InputXit 객체 목록.
|
||||
*/
|
||||
List<NiceCiDTO.InputXit> selectInputXits(final NiceCiDTO.NiceCiParam niceCiParam);
|
||||
|
||||
/**
|
||||
* tb_input_data_xit 목록 조회
|
||||
*
|
||||
* @param niceCiParam NiceCiDTO.NiceCiParam
|
||||
* @return List<NiceCiDTO.InputDataXit> InputDataXit 객체 목록.
|
||||
*/
|
||||
List<NiceCiDTO.InputDataXit> selectInputDataXits(final NiceCiDTO.NiceCiParam niceCiParam);
|
||||
//----------------------------------------------------------------------
|
||||
// 공통
|
||||
//----------------------------------------------------------------------
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
// accept
|
||||
//----------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* 청구서(결제) 데이타 생성
|
||||
*
|
||||
* @param billDTO NiceCiDTO.BillDTO
|
||||
*/
|
||||
void insertBill(final NiceCiDTO.BillDTO billDTO);
|
||||
|
||||
/**
|
||||
* 청구서(결제) 데이타 변경
|
||||
*
|
||||
* @param billDTO NiceCiDTO.BillDTO
|
||||
*/
|
||||
void updateBill(final NiceCiDTO.BillDTO billDTO);
|
||||
|
||||
/**
|
||||
* 카카오 청구서(결제) 데이타 저장 - 생성 및 변경
|
||||
*
|
||||
* @param billKkoDTO NiceCiDTO.BillKkoDTO
|
||||
*/
|
||||
void mergeBillKko(final NiceCiDTO.BillKkoDTO billKkoDTO);
|
||||
|
||||
/**
|
||||
* NICE CI API 호출 결과의 결재URL 반영 - tb_input_data_xit
|
||||
* @param inputDataXit NiceCiDTO.InputDataXit
|
||||
*/
|
||||
void updatePayUrlOfDataInput(final NiceCiDTO.InputDataXit inputDataXit);
|
||||
|
||||
/**
|
||||
* 전자고지 상태 및 에러 메세지 반영 - tb_input_xit
|
||||
* @param inputXit
|
||||
*/
|
||||
void updatePrcsCdAndErrorOfInputXit(final NiceCiDTO.InputXit inputXit);
|
||||
|
||||
/**
|
||||
* 조직 관리 테이블에서 카카오 API 인증 관련 정보 조회
|
||||
* @param orgCd 조직코드
|
||||
* @return Optional<OrgMng>
|
||||
*/
|
||||
Optional<OrgMng> selectKkoBpApiUrlFromEnsOrgMng(final String orgCd);
|
||||
//----------------------------------------------------------------------
|
||||
// accept
|
||||
//----------------------------------------------------------------------
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
// send
|
||||
//----------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* GET NICE CI request unique PK - sequence
|
||||
* @return Optional<String> leftPad "0", 10자리 String
|
||||
*/
|
||||
Optional<String> selectNiceCiRequestId();
|
||||
|
||||
/**
|
||||
* 템플릿 정보 조회
|
||||
* @param tmpltId 템플릿 ID
|
||||
* @return Optional<NiceCiDTO.TmpltMngDTO>
|
||||
*/
|
||||
Optional<NiceCiDTO.TmpltMngDTO> selectTmpltMsg(final String tmpltId);
|
||||
|
||||
/**
|
||||
* SMS 전송 요청 전문 저장
|
||||
* @param requestDTO NiceCiApiSendDTO.Request
|
||||
*/
|
||||
void insertNiceSmsSndngRequest(final NiceCiApiSendDTO.Request requestDTO);
|
||||
|
||||
/**
|
||||
* SMS 전송 결과 저장
|
||||
* @param responseDTO NiceCiApiSendDTO.Response
|
||||
*/
|
||||
void insertNiceSmsSndngResponse(final NiceCiApiSendDTO.Response responseDTO);
|
||||
//----------------------------------------------------------------------
|
||||
// send
|
||||
//----------------------------------------------------------------------
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
// status
|
||||
//----------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* GET NICE CI 상태 조회를 위한 전문의 조회 일시(from ~ to)
|
||||
* -> tb_input_xit 의 run_dt MIN(run_dt) ~ MAX(run_dt) + 1
|
||||
* @param niceCiParam NiceCiDTO.NiceCiParam
|
||||
* @return Optional<NiceCiApiStatusDTO.Request>
|
||||
* </pre>
|
||||
*/
|
||||
Optional<NiceCiApiStatusDTO.Request> selectFromAndToOfStatusParam(final NiceCiDTO.NiceCiParam niceCiParam);
|
||||
|
||||
/**
|
||||
* GET NICE CI inquire unique PK - sequence
|
||||
* @return Optional<String> leftPad "0", 10자리 String
|
||||
*/
|
||||
Optional<String> selectNiceCiInqireId();
|
||||
|
||||
/**
|
||||
* SMS 전송 상태 조회 요청 전문 저장
|
||||
* @param requestDTO NiceCiApiStatusDTO.Request
|
||||
*/
|
||||
void insertNiceSmsSndngInquireRequest(final NiceCiApiStatusDTO.Request requestDTO);
|
||||
|
||||
/**
|
||||
* SMS 전송 상태 조회 결과 저장
|
||||
* @param responseDTO NiceCiApiStatusDTO.Response
|
||||
*/
|
||||
void insertNiceSmsSndngInquireResponse(final NiceCiApiStatusDTO.Response responseDTO);
|
||||
//----------------------------------------------------------------------
|
||||
// status
|
||||
//----------------------------------------------------------------------
|
||||
}
|
@ -0,0 +1,72 @@
|
||||
package cokr.xit.ens.modules.nice.mapper;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
import org.apache.ibatis.annotations.*;
|
||||
|
||||
import cokr.xit.ens.modules.nice.model.*;
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* description : NICE CI 에서 트랜잭션 분리 처리가 필요한 서비스의 mapper
|
||||
* packageName : cokr.xit.ens.modules.nice.mapper
|
||||
* fileName : INiceMapper
|
||||
* author : limju
|
||||
* date : 2024 9월 30
|
||||
* ======================================================================
|
||||
* 변경일 변경자 변경 내용
|
||||
* ----------------------------------------------------------------------
|
||||
* 2024 9월 30 limju 최초 생성
|
||||
*
|
||||
* </pre>
|
||||
*/
|
||||
@Mapper
|
||||
public interface INiceCiNewTransactionMapper {
|
||||
//----------------------------------------------------------------------
|
||||
// accept
|
||||
//----------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* 청구서 이력 생성
|
||||
* @param billHistDTO NiceCiDTO.BillHistDTO
|
||||
*/
|
||||
void insertBillHistory(final NiceCiDTO.BillHistDTO billHistDTO);
|
||||
|
||||
/**
|
||||
* 청구서 이력 변경
|
||||
* @param billHistDTO NiceCiDTO.BillHistDTO
|
||||
*/
|
||||
void updateBillHistory(final NiceCiDTO.BillHistDTO billHistDTO);
|
||||
//----------------------------------------------------------------------
|
||||
// accept
|
||||
//----------------------------------------------------------------------
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
// status
|
||||
//----------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* NICE CI SMS 전송 상태 결과 반복부 생성
|
||||
* @param resultList List<NiceCiApiResult>
|
||||
*/
|
||||
void insertNiceSmsSndngInquireResponseRepeats(final List<NiceCiApiResult> resultList);
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 전송결과를 생성하기 위한 DATA ID 조회
|
||||
* NICE CI SMS 전송 상태 결과의 메세지와 NICE CI SMS 전송 요청 전문의 주민번호로 DATA ID GET
|
||||
* @param result NiceCiApiResult
|
||||
* @return Optional<NiceCiDTO.SendResult>
|
||||
* </pre>
|
||||
*/
|
||||
Optional<NiceCiDTO.SendResult> selectDataIdFromSendResult(final NiceCiApiResult result);
|
||||
|
||||
/**
|
||||
* SMS 전송 결과 생성
|
||||
* @param sendResults NiceCiDTO.SendResult
|
||||
*/
|
||||
void insertSendResults(final List<NiceCiDTO.SendResult> sendResults);
|
||||
//----------------------------------------------------------------------
|
||||
// status
|
||||
//----------------------------------------------------------------------
|
||||
}
|
@ -0,0 +1,292 @@
|
||||
package cokr.xit.ens.modules.nice.model;
|
||||
|
||||
import javax.validation.constraints.*;
|
||||
|
||||
import org.apache.commons.lang3.*;
|
||||
|
||||
import cokr.xit.ens.core.utils.*;
|
||||
import io.swagger.v3.oas.annotations.media.*;
|
||||
import lombok.*;
|
||||
import lombok.extern.slf4j.*;
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* description : NICE CI API 전문 공통 DTO
|
||||
* packageName : cokr.xit.ens.modules.nice.model
|
||||
* fileName : NiceCiCommon
|
||||
* author : limju
|
||||
* date : 2024 9월 25
|
||||
* ======================================================================
|
||||
* 변경일 변경자 변경 내용
|
||||
* ----------------------------------------------------------------------
|
||||
* 2024 9월 25 limju 최초 생성
|
||||
*
|
||||
* </pre>
|
||||
*/
|
||||
@Schema(name = "NiceCiApiCommon", description = "NICE CI API 전문 공통 DTO")
|
||||
@Data
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
@Slf4j
|
||||
public class NiceCiApiCommon {
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 전문그룹코드 - 요청시 필수 9자리
|
||||
* "NICEIF "
|
||||
* </pre>
|
||||
*/
|
||||
@Schema(requiredMode = Schema.RequiredMode.REQUIRED, title = "전문그룹코드(9자리)", example = "NICEIF ")
|
||||
@Size(min = 9, max = 9, message = "전문그룹코드는 9자리 입니다.")
|
||||
private String spcltyGroupcode = StringUtils.rightPad("NICEIF", 9, StringUtils.SPACE);
|
||||
public void setSpcltyGroupcode(String spcltyGroupcode) {
|
||||
this.spcltyGroupcode = StringUtils.rightPad(nvl(spcltyGroupcode), 9, StringUtils.SPACE);
|
||||
}
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 거래종별코드 - 요청/응답 필수 4자리
|
||||
* 조회요청코드 "0200" set
|
||||
* NICE 응답시 "0210" set
|
||||
* </pre>
|
||||
*/
|
||||
@Schema(requiredMode = Schema.RequiredMode.REQUIRED, title = "거래종별코드(4자리)", example = "0200")
|
||||
@Size(min = 4, max = 4, message = "거래 종별 코드는 4자리 입니다.")
|
||||
private String delngAsortcode = "0200";
|
||||
public void setDelngAsortcode(String delngAsortcode) {
|
||||
this.delngAsortcode = StringUtils.rightPad(nvl(delngAsortcode), 4, StringUtils.SPACE);
|
||||
}
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 거래구분코드 - 필수 5자리
|
||||
* 단위업무구분코드 "31896" set
|
||||
* </pre>
|
||||
*/
|
||||
@Schema(requiredMode = Schema.RequiredMode.REQUIRED, title = "거래구분코드(5자리)", example = "31895")
|
||||
@Size(min = 5, max = 5, message = "거래 구분 코드는 5자리 입니다.")
|
||||
private String delngSecode = "31896";
|
||||
public void setDelngSecode(String delngSecode) {
|
||||
this.delngSecode = StringUtils.rightPad(nvl(delngSecode), 5, StringUtils.SPACE);
|
||||
}
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 송수신플래그 - 요청/응답 필수 1자리
|
||||
* 전문을 발생시킨 기관을 나타내는 코드 : "B" set
|
||||
* NICE 응답시 "N" set
|
||||
* </pre>
|
||||
*/
|
||||
@Schema(requiredMode = Schema.RequiredMode.REQUIRED, title = "송수신플래그(1자리)", example = "B")
|
||||
@Size(min = 1, max = 1, message = "송수신 플래그는 1자리 입니다.")
|
||||
@Setter
|
||||
private String trsmrcvAt = "B";
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 단말기구분 - 필수 3자리
|
||||
* "503" set
|
||||
* </pre>
|
||||
*/
|
||||
@Schema(requiredMode = Schema.RequiredMode.REQUIRED, title = "단말기구분(3자리)", example = "503")
|
||||
@Size(min = 3, max = 3, message = "단말기 구분은 3자리 입니다.")
|
||||
private String trmnlSe = "503";
|
||||
public void setTrmnlSe(String trmnlSe) {
|
||||
this.trmnlSe = StringUtils.rightPad(nvl(trmnlSe), 3, StringUtils.SPACE);
|
||||
}
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 응답코드 - 4자리 NICE 응답시 필수 4자리
|
||||
* P000 정상
|
||||
* P001 주민번호오류
|
||||
* P005 참가기관ID오류
|
||||
* E998 내부TimeOut발생
|
||||
* E999 내부시스템오류
|
||||
* S602 개별 요청부 오류
|
||||
* S702 서비스이용권한 오류
|
||||
* S722 Server System 오류
|
||||
* S316 발신자번호 오류(지역번호를 포함하여 숫자만 입력 요망)
|
||||
* S317 발송문구에 10자리 이상 연속된 숫자는 입력 불가
|
||||
* </pre>
|
||||
*/
|
||||
@Schema(title = "응답코드(4자리)", example = " ")
|
||||
@Pattern(regexp = "^\\s{4}$|$|^[P|E|S][\\d]{3}$", message = "응답코드(4자리)는 4자리 입니다")
|
||||
private String rspnsCode = StringUtils.rightPad(StringUtils.EMPTY, 4, StringUtils.SPACE);
|
||||
public void setRspnsCode(String rspnsCode) {
|
||||
this.rspnsCode = StringUtils.rightPad(nvl(rspnsCode), 4, StringUtils.SPACE);
|
||||
}
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 참가기관ID - 요청 필수 9자리
|
||||
* CB정보 H/I용으로 NICE에서 부여한 USER ID
|
||||
* </pre>
|
||||
*/
|
||||
@Schema(requiredMode = Schema.RequiredMode.REQUIRED, title = "참가기관ID(9자리)", example = "503")
|
||||
@Size(min = 9, max = 9, message = "참가기관ID는 9자리 입니다.")
|
||||
private String partcptInsttId = StringUtils.rightPad(StringUtils.EMPTY, 9, StringUtils.SPACE);
|
||||
public void setPartcptInsttId(String partcptInsttId) {
|
||||
this.partcptInsttId = StringUtils.rightPad(nvl(partcptInsttId), 9, StringUtils.SPACE);
|
||||
}
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 기관전문관리번호 - 요청 필수 10자리
|
||||
* 기관에서 전문관리를 위해 요청전문 전송시 set
|
||||
* </pre>
|
||||
*/
|
||||
@Schema(requiredMode = Schema.RequiredMode.REQUIRED, title = "기관전문관리번호(10자리)", example = " ")
|
||||
@Size(min = 10, max = 10, message = "기관전문관리번호는 10자리 입니다.")
|
||||
private String insttSpcltyManageno = StringUtils.rightPad(StringUtils.EMPTY, 10, StringUtils.SPACE);
|
||||
public void setInsttSpcltyManageno(String insttSpcltyManageno) {
|
||||
this.insttSpcltyManageno = StringUtils.rightPad(nvl(insttSpcltyManageno), 10, StringUtils.SPACE);
|
||||
}
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 기관전문전송시간 - 요청 필수 14자리
|
||||
* 기관에서 요청전문 전송시 set
|
||||
* </pre>
|
||||
*/
|
||||
@Schema(requiredMode = Schema.RequiredMode.REQUIRED, title = "기관전문전송시간(14자리)", example = " ")
|
||||
@Size(min = 14, max = 14, message = "기관전문전송시간은 14자리 입니다.")
|
||||
private String insttSpcltyTrnsmistime = DateUtil.getTodayAndNowTime("yyyyMMddHHmmss");
|
||||
public void setInsttSpcltyTrnsmistime(String insttSpcltyTrnsmistime) {
|
||||
this.insttSpcltyTrnsmistime = StringUtils.rightPad(nvl(insttSpcltyTrnsmistime), 14, StringUtils.SPACE);
|
||||
}
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* NICE전문관리번호 - 응답 필수 10자리
|
||||
* NICE에서 전문관리를 위해 응답전문 전송시 set
|
||||
* </pre>
|
||||
*/
|
||||
@Schema(title = "NICE전문관리번호(10자리)", example = " ")
|
||||
@Size(min = 10, max = 10, message = "NICE전문관리번호 10자리 입니다.")
|
||||
private String niceSpcltyManageno = StringUtils.rightPad(StringUtils.EMPTY, 10, StringUtils.SPACE);
|
||||
public void setNiceSpcltyManageno(String niceSpcltyManageno) {
|
||||
this.niceSpcltyManageno = StringUtils.rightPad(nvl(niceSpcltyManageno), 10, StringUtils.SPACE);
|
||||
}
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* NICE전문전송시간 - 응답 필수 14자리
|
||||
* NICE에서 응답전문 전송시 set
|
||||
* </pre>
|
||||
*/
|
||||
@Schema(title = "NICE전문전송시간(14자리)", example = " ")
|
||||
@Size(min = 14, max = 14, message = "NICE전문전송시간은 14자리 입니다.")
|
||||
private String niceSpcltyTrnsmistime = StringUtils.rightPad(StringUtils.EMPTY, 14, StringUtils.SPACE);
|
||||
public void setNiceSpcltyTrnsmistime(String niceSpcltyTrnsmistime) {
|
||||
this.niceSpcltyTrnsmistime = StringUtils.rightPad(nvl(niceSpcltyTrnsmistime), 14, StringUtils.SPACE);
|
||||
}
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 공란 - 조회시 16 자리, 이력조회시 17자리
|
||||
* </pre>
|
||||
*/
|
||||
@Schema(title = "공란", example = " ")
|
||||
private String blnk;
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 조회동의사유 코드 : 4, 이력조회시 미사용
|
||||
* </pre>
|
||||
*/
|
||||
@Schema(title = "조회동의사유", example = "4")
|
||||
@Size(min = 1, max = 1, message = "조회동의사유는 1자리 입니다")
|
||||
private String inqireAgreResn = "4";
|
||||
|
||||
/**
|
||||
* NICE CI API 공통 전문 생성 - 한글 2, 그외 1 자리로 생성
|
||||
* @param isSend send 공통 전문 여부
|
||||
* @return String NICE CI 공통 전문
|
||||
*/
|
||||
public String ofString(boolean isSend) {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
sb.append(spcltyGroupcode);
|
||||
sb.append(delngAsortcode);
|
||||
sb.append(delngSecode);
|
||||
sb.append(trsmrcvAt);
|
||||
sb.append(trmnlSe);
|
||||
sb.append(rspnsCode);
|
||||
sb.append(partcptInsttId);
|
||||
sb.append(insttSpcltyManageno);
|
||||
sb.append(insttSpcltyTrnsmistime);
|
||||
sb.append(niceSpcltyManageno);
|
||||
sb.append(niceSpcltyTrnsmistime);
|
||||
sb.append(blnk);
|
||||
if(isSend) sb.append(inqireAgreResn);
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* NICE CI API 공통 전문 파싱 - 한글 2, 그외 1 자리로 생성
|
||||
* @param tgtString 전문
|
||||
* @return NiceCiApiCommon NICE CI 공통 전문 DTO
|
||||
*/
|
||||
public static NiceCiApiCommon parse(String tgtString) {
|
||||
final int[] parseLength = {
|
||||
9, // 전문그룹코드
|
||||
4, // 거래종별코드
|
||||
5, // 거래구분코드
|
||||
1, // 송수신Flag
|
||||
3, // 단말기구분
|
||||
4, // 응답코드
|
||||
9, // 참가기관ID
|
||||
10, // 기관전문관리번호
|
||||
14, // 기관전문전송시간
|
||||
10, //NICE 전문관리번호
|
||||
14, // NICE 전문전송시간
|
||||
17 // 공란
|
||||
};
|
||||
|
||||
if (StringUtils.isNotBlank(tgtString) && tgtString.length() >= 83) {
|
||||
NiceCiApiCommon nc = new NiceCiApiCommon();
|
||||
int idx = 0;
|
||||
nc.setSpcltyGroupcode(StringUtils.trim(StringUtils.left(tgtString, parseLength[idx])));
|
||||
tgtString = tgtString.substring(parseLength[idx++]);
|
||||
|
||||
nc.setDelngAsortcode(StringUtils.trim(StringUtils.left(tgtString, parseLength[idx])));
|
||||
tgtString = tgtString.substring(parseLength[idx++]);
|
||||
|
||||
nc.setDelngSecode(StringUtils.trim(StringUtils.left(tgtString, parseLength[idx])));
|
||||
tgtString = tgtString.substring(parseLength[idx++]);
|
||||
|
||||
nc.setTrsmrcvAt(StringUtils.trim(StringUtils.left(tgtString, parseLength[idx])));
|
||||
tgtString = tgtString.substring(parseLength[idx++]);
|
||||
|
||||
nc.setTrmnlSe(StringUtils.trim(StringUtils.left(tgtString, parseLength[idx])));
|
||||
tgtString = tgtString.substring(parseLength[idx++]);
|
||||
|
||||
nc.setRspnsCode(StringUtils.trim(StringUtils.left(tgtString, parseLength[idx])));
|
||||
tgtString = tgtString.substring(parseLength[idx++]);
|
||||
|
||||
nc.setPartcptInsttId(StringUtils.trim(StringUtils.left(tgtString, parseLength[idx])));
|
||||
tgtString = tgtString.substring(parseLength[idx++]);
|
||||
|
||||
nc.setInsttSpcltyManageno(StringUtils.trim(StringUtils.left(tgtString, parseLength[idx])));
|
||||
tgtString = tgtString.substring(parseLength[idx++]);
|
||||
|
||||
nc.setInsttSpcltyTrnsmistime(StringUtils.trim(StringUtils.left(tgtString, parseLength[idx])));
|
||||
tgtString = tgtString.substring(parseLength[idx++]);
|
||||
|
||||
nc.setNiceSpcltyManageno(StringUtils.trim(StringUtils.left(tgtString, parseLength[idx])));
|
||||
tgtString = tgtString.substring(parseLength[idx++]);
|
||||
|
||||
nc.setNiceSpcltyTrnsmistime(StringUtils.trim(StringUtils.left(tgtString, parseLength[idx])));
|
||||
tgtString = tgtString.substring(parseLength[idx++]);
|
||||
|
||||
nc.setBlnk(StringUtils.trim(StringUtils.left(tgtString, parseLength[idx])));
|
||||
return nc;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
private static String nvl(String src){
|
||||
return StringUtils.defaultIfEmpty(src, StringUtils.EMPTY);
|
||||
}
|
||||
}
|
@ -0,0 +1,395 @@
|
||||
package cokr.xit.ens.modules.nice.model;
|
||||
|
||||
import org.apache.commons.lang3.*;
|
||||
|
||||
import cokr.xit.ens.modules.nice.cmm.*;
|
||||
import io.swagger.v3.oas.annotations.media.*;
|
||||
import lombok.*;
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* description : NICE CI API 호출 결과 DTO
|
||||
* packageName : cokr.xit.ens.modules.nice.model
|
||||
* fileName : NiceCiApiResult
|
||||
* author : limju
|
||||
* date : 2024 9월 25
|
||||
* ======================================================================
|
||||
* 변경일 변경자 변경 내용
|
||||
* ----------------------------------------------------------------------
|
||||
* 2024 9월 25 limju 최초 생성
|
||||
*
|
||||
* </pre>
|
||||
*/
|
||||
@Schema(name = "NiceCiApiResult", description = "NICE CI API 결과 DTO")
|
||||
@Data
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public class NiceCiApiResult {
|
||||
|
||||
//------------------------------------------------------------------------------------
|
||||
// 연락처 이력 조회시만
|
||||
//------------------------------------------------------------------------------------
|
||||
/**
|
||||
* nice sms 발송 요청 ID - 업무 PK
|
||||
*/
|
||||
private String niceSmsSndngInqireId;
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 연락처 이력 조회시 사용 - 조회일시 - 20 자리
|
||||
* YYYYMMDDHHMMSS(14)+microSecond(6)
|
||||
* </pre>
|
||||
*/
|
||||
private String inqireDt;
|
||||
public void setInqireDt(String inqireDt) {
|
||||
this.inqireDt = StringUtils.trim(inqireDt);
|
||||
}
|
||||
//------------------------------------------------------------------------------------
|
||||
// 연락처 이력 조회시만
|
||||
//------------------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 개인/사업자/법인구분 - 1자리
|
||||
* 1(개인) 고정
|
||||
* </pre>
|
||||
*/
|
||||
private String indvdlBsnmCprSe;
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 주민번호 - 13자리
|
||||
* </pre>
|
||||
*/
|
||||
private String ihidnum;
|
||||
public void setIhidnum(String ihidnum) {
|
||||
this.ihidnum = StringUtils.trim(ihidnum);
|
||||
}
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 이름 - 20자리
|
||||
* NiceCiUtils.leftKr, substringKr 메소드 사용
|
||||
* </pre>
|
||||
*/
|
||||
private String nm;
|
||||
public void setNm(String nm) {
|
||||
this.nm = StringUtils.trim(nm);
|
||||
}
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 1순위연락처 - 11자리
|
||||
* </pre>
|
||||
*/
|
||||
private String rankCttpc_1;
|
||||
public void setRankCttpc_1(String rankCttpc_1) {
|
||||
this.rankCttpc_1 = StringUtils.trim(rankCttpc_1);
|
||||
}
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 2순위연락처 - 11자리
|
||||
* </pre>
|
||||
*/
|
||||
private String rankCttpc_2;
|
||||
public void setRankCttpc_2(String rankCttpc_2) {
|
||||
this.rankCttpc_2 = StringUtils.trim(rankCttpc_2);
|
||||
}
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 3순위연락처 - 11자리
|
||||
* </pre>
|
||||
*/
|
||||
private String rankCttpc_3;
|
||||
public void setRankCttpc_3(String rankCttpc_3) {
|
||||
this.rankCttpc_3 = StringUtils.trim(rankCttpc_3);
|
||||
}
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 결과구분코드 - 2자리
|
||||
* 00 정상(SMS미발송시 조회정상, SMS발송시 발송정상)
|
||||
* 01 주민번호오류
|
||||
* 02 데이터 없음
|
||||
* 10 진행중(연락처조회 정상 건중 SMS발송 이전)
|
||||
* 99 기타오류
|
||||
* </pre>
|
||||
*/
|
||||
private String resultSe;
|
||||
public void setResultSe(String resultSe) {
|
||||
this.resultSe = StringUtils.trim(resultSe);
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------------
|
||||
// 연락처 이력 조회시만
|
||||
//------------------------------------------------------------------------------------
|
||||
/**
|
||||
* <pre>
|
||||
* 연락처 이력 조회시 사용 - SMS발송요청구분코드: 필수 1자리
|
||||
* 1 ~ 3 : 발송
|
||||
* 0 : 미요청,
|
||||
* 4: 연락처 죄회 없이 발송요청 (31894전문)
|
||||
* </pre>
|
||||
*/
|
||||
private String smsSndngRequstSe;
|
||||
public void setSmsSndReq(String smsSndReqCode) {
|
||||
this.smsSndngRequstSe = StringUtils.trim(smsSndReqCode);
|
||||
}
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 연락처 이력 조회시 사용 - 발송메세지: 10 ~ 2000자리
|
||||
* 발송요청구분(smsSndReqCode)가 1, 2, 3인 경우 필수
|
||||
* NiceCiUtils.leftKr, substringKr 메소드 사용
|
||||
* </pre>
|
||||
*/
|
||||
private String sndngMssage;
|
||||
public void setSndngMssage(String sndngMssage) {
|
||||
this.sndngMssage = StringUtils.trim(sndngMssage);
|
||||
}
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 연락처 이력 조회시 사용 - 발신번호: 12자리
|
||||
* 발송요청구분(smsSndReqCode)가 1, 2, 3인 경우 필수
|
||||
* </pre>
|
||||
*/
|
||||
private String dsptchNo;
|
||||
public void setDsptchNo(String dsptchNo) {
|
||||
this.dsptchNo = StringUtils.trim(dsptchNo);
|
||||
}
|
||||
//------------------------------------------------------------------------------------
|
||||
// 연락처 이력 조회시만
|
||||
//------------------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* SMS발송연락처순위 - 1자리
|
||||
* 0 : 미요청,
|
||||
* 1: 1순위연락처로 발송,
|
||||
* 2: 2 순위 연락처로 발송
|
||||
* 3: 3 순위 연락처로 발송
|
||||
* </pre>
|
||||
*/
|
||||
private String smsSndngCttpcRank;
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* SMS발송연락처번호 - 11자리
|
||||
* </pre>
|
||||
*/
|
||||
private String smsSndngCttpcNo;
|
||||
public void setSmsSndngCttpcNo(String smsSndngCttpcNo) {
|
||||
this.smsSndngCttpcNo = StringUtils.trim(smsSndngCttpcNo);
|
||||
}
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* SMS발송예정일시 - 14자리
|
||||
* </pre>
|
||||
*/
|
||||
private String smsSndngDt;
|
||||
public void setSmsSndngDt(String smsSndngDt) {
|
||||
this.smsSndngDt = StringUtils.trim(smsSndngDt);
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------------
|
||||
// 연락처 이력 조회시만
|
||||
//------------------------------------------------------------------------------------
|
||||
/**
|
||||
* <pre>
|
||||
* 연락처 이력 조회시 사용 - 처리자ID : 9 자리
|
||||
* </pre>
|
||||
*/
|
||||
private String opetrId;
|
||||
public void setOpetrId(String opetrId) {
|
||||
this.opetrId = StringUtils.trim(opetrId);
|
||||
}
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 연락처 이력 조회시 사용 - 연락처조회구분: 1자리
|
||||
* default: 3
|
||||
* 1: 1순위만 조회,
|
||||
* 2: 2순위 이내 조회
|
||||
* 3: 3순위 이내 조회
|
||||
* </pre>
|
||||
*/
|
||||
private String cttpcInqireSe;
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 연락처 이력 조회시 사용 - 메세지발송결과구분 : 1 자리
|
||||
* 0(미발송), 1(알림톡 발송), 2(SMS/LMS발송)
|
||||
* 진행중 건, 오류로 인한 미발송 건의 경우에도 0 제공
|
||||
* </pre>
|
||||
*/
|
||||
private String mssageSndngResultSe;
|
||||
//------------------------------------------------------------------------------------
|
||||
// 연락처 이력 조회시만
|
||||
//------------------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 공란 - 15, 이력조회시는 11 자리
|
||||
* </pre>
|
||||
*/
|
||||
private String rspnsReptitBlnk;
|
||||
public void setRspnsReptitBlnk(String rspnsReptitBlnk) {
|
||||
this.rspnsReptitBlnk = StringUtils.trim(rspnsReptitBlnk);
|
||||
}
|
||||
|
||||
/**
|
||||
* NICE CI API 호출 결과 전문 파싱 - 한글 2, 그외 1 자리로 생성
|
||||
* @param tgtString 전문
|
||||
* @return NiceCiApiResult NICE CI 호출결과 전문 DTO
|
||||
*/
|
||||
public static NiceCiApiResult parse(String tgtString) {
|
||||
// 110 자리
|
||||
final int[] parseLength = {
|
||||
1, // 개인.사업자.법인구분
|
||||
13, // 주민번호
|
||||
20, // 성명
|
||||
11, // 1순위 연락처
|
||||
11, // 2순위 연락처
|
||||
11, // 3순위 연락처
|
||||
2, // 결과구분
|
||||
1, // SMS발송 연락처 순위
|
||||
11, // SMS발송 연락처 번호
|
||||
14, // SMS발송(예정)일시
|
||||
15, // 공란
|
||||
};
|
||||
|
||||
if (StringUtils.isNotBlank(tgtString) && NiceCiUtils.lengthKr(tgtString)%110 == 0) {
|
||||
NiceCiApiResult result = new NiceCiApiResult();
|
||||
int idx = 0;
|
||||
|
||||
result.setIndvdlBsnmCprSe(StringUtils.left(tgtString, parseLength[idx]));
|
||||
tgtString = tgtString.substring(parseLength[idx++]);
|
||||
|
||||
result.setIhidnum(StringUtils.left(tgtString, parseLength[idx]));
|
||||
tgtString = tgtString.substring(parseLength[idx++]);
|
||||
|
||||
result.setNm(NiceCiUtils.leftKr(tgtString, parseLength[idx]));
|
||||
tgtString = NiceCiUtils.substringKr(tgtString, parseLength[idx++]);
|
||||
|
||||
result.setRankCttpc_1(StringUtils.left(tgtString, parseLength[idx]));
|
||||
tgtString = tgtString.substring(parseLength[idx++]);
|
||||
|
||||
result.setRankCttpc_2(StringUtils.left(tgtString, parseLength[idx]));
|
||||
tgtString = tgtString.substring(parseLength[idx++]);
|
||||
|
||||
result.setRankCttpc_3(StringUtils.left(tgtString, parseLength[idx]));
|
||||
tgtString = tgtString.substring(parseLength[idx++]);
|
||||
|
||||
result.setResultSe(StringUtils.left(tgtString, parseLength[idx]));
|
||||
tgtString = tgtString.substring(parseLength[idx++]);
|
||||
|
||||
result.setSmsSndngCttpcRank(StringUtils.left(tgtString, parseLength[idx]));
|
||||
tgtString = tgtString.substring(parseLength[idx++]);
|
||||
|
||||
result.setSmsSndngCttpcNo(StringUtils.left(tgtString, parseLength[idx]));
|
||||
tgtString = tgtString.substring(parseLength[idx++]);
|
||||
|
||||
result.setSmsSndngDt(StringUtils.left(tgtString, parseLength[idx]));
|
||||
tgtString = tgtString.substring(parseLength[idx++]);
|
||||
|
||||
result.setRspnsReptitBlnk(StringUtils.left(tgtString, parseLength[idx]));
|
||||
return result;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public static NiceCiApiResult parseStatus(String tgtString) {
|
||||
// 1150
|
||||
final int[] parseLength = {
|
||||
20, // 조회일시 - 이력조회시만 사용
|
||||
1, // 개인.사업자.법인구분
|
||||
13, // 주민번호
|
||||
20, // 성명
|
||||
11, // 1순위 연락처
|
||||
11, // 2순위 연락처
|
||||
11, // 3순위 연락처
|
||||
2, // 결과구분
|
||||
1, // SMS발송 요청 구분 - 이력조회시만 사용
|
||||
1000, // 발송메세지 - 이력조회시만 사용
|
||||
12, // 발신번호 - 이력조회시만 사용
|
||||
1, // SMS발송 연락처 순위
|
||||
11, // SMS발송 연락처 번호
|
||||
14, // SMS발송(예정)일시
|
||||
9, // 처리자ID - 이력조회시만 사용
|
||||
1, // 연락처 조회 구분 - 이력조회시만 사용
|
||||
1, // 메세지발송결과 구붑
|
||||
11, // 공란
|
||||
};
|
||||
|
||||
if (StringUtils.isNotBlank(tgtString) && NiceCiUtils.lengthKr(tgtString)%1150 == 0) {
|
||||
NiceCiApiResult result = new NiceCiApiResult();
|
||||
int idx = 0;
|
||||
|
||||
// 이력조회시만 사용 ////////////////////////////////////////////////////////
|
||||
result.setInqireDt(StringUtils.left(tgtString, parseLength[idx]));
|
||||
tgtString = tgtString.substring(parseLength[idx++]);
|
||||
// 이력조회시만 사용 ////////////////////////////////////////////////////////
|
||||
|
||||
result.setIndvdlBsnmCprSe(StringUtils.left(tgtString, parseLength[idx]));
|
||||
tgtString = tgtString.substring(parseLength[idx++]);
|
||||
|
||||
result.setIhidnum(StringUtils.left(tgtString, parseLength[idx]));
|
||||
tgtString = tgtString.substring(parseLength[idx++]);
|
||||
|
||||
result.setNm(NiceCiUtils.leftKr(tgtString, parseLength[idx]));
|
||||
tgtString = NiceCiUtils.substringKr(tgtString, parseLength[idx++]);
|
||||
|
||||
result.setRankCttpc_1(StringUtils.left(tgtString, parseLength[idx]));
|
||||
tgtString = tgtString.substring(parseLength[idx++]);
|
||||
|
||||
result.setRankCttpc_2(StringUtils.left(tgtString, parseLength[idx]));
|
||||
tgtString = tgtString.substring(parseLength[idx++]);
|
||||
|
||||
result.setRankCttpc_3(StringUtils.left(tgtString, parseLength[idx]));
|
||||
tgtString = tgtString.substring(parseLength[idx++]);
|
||||
|
||||
result.setResultSe(StringUtils.left(tgtString, parseLength[idx]));
|
||||
tgtString = tgtString.substring(parseLength[idx++]);
|
||||
|
||||
// 이력조회시만 사용 ////////////////////////////////////////////////////////
|
||||
result.setSmsSndngRequstSe(StringUtils.left(tgtString, parseLength[idx]));
|
||||
tgtString = tgtString.substring(parseLength[idx++]);
|
||||
result.setSndngMssage(NiceCiUtils.leftKr(tgtString, parseLength[idx]));
|
||||
tgtString = NiceCiUtils.substringKr(tgtString, parseLength[idx++]);
|
||||
result.setSmsSndngCttpcNo(StringUtils.left(tgtString, parseLength[idx]));
|
||||
tgtString = tgtString.substring(parseLength[idx++]);
|
||||
// 이력조회시만 사용 ////////////////////////////////////////////////////////
|
||||
|
||||
result.setSmsSndngCttpcRank(StringUtils.left(tgtString, parseLength[idx]));
|
||||
tgtString = tgtString.substring(parseLength[idx++]);
|
||||
|
||||
result.setSmsSndngCttpcNo(StringUtils.left(tgtString, parseLength[idx]));
|
||||
tgtString = tgtString.substring(parseLength[idx++]);
|
||||
|
||||
result.setSmsSndngDt(StringUtils.left(tgtString, parseLength[idx]));
|
||||
tgtString = tgtString.substring(parseLength[idx++]);
|
||||
|
||||
// 이력조회시만 사용 ////////////////////////////////////////////////////////
|
||||
result.setOpetrId(StringUtils.left(tgtString, parseLength[idx]));
|
||||
tgtString = tgtString.substring(parseLength[idx++]);
|
||||
result.setCttpcInqireSe(StringUtils.left(tgtString, parseLength[idx]));
|
||||
tgtString = tgtString.substring(parseLength[idx++]);
|
||||
result.setResultSe(StringUtils.left(tgtString, parseLength[idx]));
|
||||
tgtString = tgtString.substring(parseLength[idx++]);
|
||||
// 이력조회시만 사용 ////////////////////////////////////////////////////////
|
||||
|
||||
result.setRspnsReptitBlnk(StringUtils.left(tgtString, parseLength[idx]));
|
||||
return result;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
private static String nvl(String src){
|
||||
return StringUtils.defaultIfEmpty(src, StringUtils.EMPTY);
|
||||
}
|
||||
}
|
@ -0,0 +1,561 @@
|
||||
package cokr.xit.ens.modules.nice.model;
|
||||
|
||||
import java.io.*;
|
||||
import java.util.*;
|
||||
import java.util.stream.*;
|
||||
|
||||
import javax.validation.*;
|
||||
import javax.validation.constraints.*;
|
||||
|
||||
import org.apache.commons.lang3.*;
|
||||
|
||||
import cokr.xit.ens.core.exception.*;
|
||||
import cokr.xit.ens.core.exception.code.*;
|
||||
import cokr.xit.ens.modules.nice.cmm.*;
|
||||
import io.swagger.v3.oas.annotations.media.*;
|
||||
import lombok.*;
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* description : Nice CI 전송 요청 전문 DTO
|
||||
* Builder 패턴 사용 X
|
||||
* -> setter를 사용 필드 길이 고정 필요
|
||||
* packageName : cokr.xit.ens.modules.nice.model
|
||||
* fileName : NiceCiApiSendDTO
|
||||
* author : limju
|
||||
* date : 2024 9월 23
|
||||
* ======================================================================
|
||||
* 변경일 변경자 변경 내용
|
||||
* ----------------------------------------------------------------------
|
||||
* 2024 9월 23 limju 최초 생성
|
||||
*
|
||||
* </pre>
|
||||
*/
|
||||
public class NiceCiApiSendDTO {
|
||||
|
||||
@Schema(name = "Request(Nice CI Send) API DTO", description = "NICE CI API Send 요청 전문 DTO")
|
||||
@Data
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public static class Request implements Serializable {
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
//----------------------------------------------------------------------------------------------
|
||||
// TR-CODE : 0 ~ 9 자리
|
||||
//----------------------------------------------------------------------------------------------
|
||||
/**
|
||||
* <pre>
|
||||
* TR-CODE
|
||||
* 요청시 필수 10자리
|
||||
* 전문길이 set
|
||||
* </pre>
|
||||
*/
|
||||
private String trnscId = StringUtils.EMPTY;
|
||||
public void setTrnscId(String trnscId) {
|
||||
this.trnscId = StringUtils.leftPad(nvl(trnscId), 10, "0");
|
||||
}
|
||||
|
||||
/**
|
||||
* nice sms 발송 요청 ID - 업무 PK
|
||||
*/
|
||||
private String niceSmsSndngRequstId;
|
||||
|
||||
/**
|
||||
* data_id
|
||||
*/
|
||||
private String dataId;
|
||||
//----------------------------------------------------------------------------------------------
|
||||
|
||||
//----------------------------------------------------------------------------------------------
|
||||
// 공통부 : 100 자리
|
||||
//----------------------------------------------------------------------------------------------
|
||||
@Schema(requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
@Valid
|
||||
NiceCiApiCommon niceCommon;
|
||||
//----------------------------------------------------------------------------------------------
|
||||
// 공통부 : 100 자리
|
||||
//----------------------------------------------------------------------------------------------
|
||||
|
||||
//----------------------------------------------------------------------------------------------
|
||||
// 개별요청부 : 3000 자리
|
||||
//----------------------------------------------------------------------------------------------
|
||||
/**
|
||||
* <pre>
|
||||
* 조회사유: 필수 2자리
|
||||
* </pre>
|
||||
*/
|
||||
@Schema(requiredMode = Schema.RequiredMode.REQUIRED, title = "조회사유", example = " ")
|
||||
@Size(min = 2, max = 2, message = "조회사유는 2자리 입니다")
|
||||
private String inqireResn = "17";
|
||||
public void setInqireResn(String inqireResn) {
|
||||
this.inqireResn = StringUtils.rightPad(nvl(inqireResn), 2, StringUtils.SPACE);
|
||||
}
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 조회요청건수: 필수 2자리
|
||||
* 최대 48
|
||||
* </pre>
|
||||
*/
|
||||
@Schema(requiredMode = Schema.RequiredMode.REQUIRED, title = "조회요청건수", example = " ")
|
||||
@Pattern(regexp = "^\\s{2}$|\\d{1,2}", message = "조회요청 최대건수는 48입니다(2자리)")
|
||||
private String inqireRequstCo = "01";
|
||||
public void setInqireRequstCo(Integer inqireRequstCo) {
|
||||
this.inqireRequstCo = StringUtils.leftPad(nvl(inqireRequstCo == null? "": inqireRequstCo.toString()), 2, "0");
|
||||
}
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* SMS발송요청구분코드: 필수 1자리
|
||||
* 1 ~ 3의 경우 발송메세지와 발신번호 필수
|
||||
* 0 : 미요청,
|
||||
* 1: 1순위연락처로 발송,
|
||||
* 2: 1 ~ 2 순위 연락처중 최우선순위 1개로 발송
|
||||
* 3: 1 ~ 3 순위 연락처중 최우선순위 1개로 발송
|
||||
* </pre>
|
||||
*/
|
||||
@Schema(requiredMode = Schema.RequiredMode.REQUIRED, title = "SMS발송요청구분코드", example = " ", allowableValues = {"0", "1", "2", "3"})
|
||||
@Pattern(regexp = "[0-3]", message = "SMS발송요청구분코드 0 ~ 3 입니다(1자리)")
|
||||
private String smsSndngRequstSe = "3";
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 발송메세지: 10 ~ 2000자리
|
||||
* 발송요청구분(smsSndReqCode)가 1, 2, 3인 경우 필수
|
||||
* </pre>
|
||||
*/
|
||||
@Schema(title = "SMS 발송메세지", example = " ")
|
||||
@Pattern(regexp = "^[\\s\\S]{10,2000}$", message = "SMS발송메세지는 10 ~ 2000자리 입니다")
|
||||
private String sndngMssage = StringUtils.rightPad(StringUtils.EMPTY, 2000, StringUtils.SPACE);
|
||||
public void setSndngMssage(String sndngMssage) {
|
||||
this.sndngMssage = NiceCiUtils.rightPadKr(nvl(sndngMssage), 2000, StringUtils.SPACE);
|
||||
}
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 발신번호: 12자리
|
||||
* 발송요청구분(smsSndReqCode)가 1, 2, 3인 경우 필수
|
||||
* </pre>
|
||||
*/
|
||||
@Schema(title = "SMS 발신번호", example = " ")
|
||||
@Pattern(regexp = "^[\\s\\S]{3,12}$", message = "SMS 발신번호는 3 ~ 12자리 입니다")
|
||||
private String dsptchNo = StringUtils.rightPad("0442113377", 12, StringUtils.SPACE);
|
||||
public void setDsptchNo(String dsptchNo) {
|
||||
this.dsptchNo = StringUtils.rightPad(nvl(dsptchNo), 12, StringUtils.SPACE);
|
||||
}
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 연락처조회구분: 1자리
|
||||
* default: 3
|
||||
* 1: 1순위만 조회,
|
||||
* 2: 2순위 이내 조회
|
||||
* 3: 3순위 이내 조회
|
||||
* </pre>
|
||||
*/
|
||||
@Schema(requiredMode = Schema.RequiredMode.REQUIRED, title = "연락처조회구분코드", example = " ", allowableValues = {"1", "2", "3"})
|
||||
@Pattern(regexp = "[1-3]", message = "연락처조회구분 코드는 1 ~ 3 입니다(1자리)")
|
||||
private String cttpcInqireSe = "3";
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 알림톡발송요청구분: 1자리
|
||||
* 1(알림톡+SMS발송), 2(알림톡 발송), 3(default: SMS발송)
|
||||
* 알림톡 발송시 발송메시지가 템플릿 레이아웃에 맞게 입력되어야 함.
|
||||
* 요청구분 1의 경우, 알림톡 발송 실패시 SMS발송. 2의 경우 실패시 발송 안함.
|
||||
* </pre>
|
||||
*/
|
||||
@Schema(requiredMode = Schema.RequiredMode.REQUIRED, title = "알림톡발송요청구분", example = " ")
|
||||
@Size(min = 1, max = 1, message = "알림톡발송요청구분 코드는 1자리 입니다")
|
||||
private String ntcntalkSndngRequstSe = "1";
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 알림톡템플릿코드: 100자리
|
||||
* </pre>
|
||||
*/
|
||||
@Schema(requiredMode = Schema.RequiredMode.REQUIRED, title = "알림톡템플릿코드", example = " ")
|
||||
@Size(min = 100, max = 100, message = "알림톡템플릿 코드는 100자리 입니다")
|
||||
private String ntcntalkTmplatCode = StringUtils.rightPad(StringUtils.EMPTY, 100, StringUtils.SPACE);
|
||||
public void setNtcntalkTmplatCode(String ntcntalkTmplatCode) {
|
||||
this.ntcntalkTmplatCode = StringUtils.rightPad(nvl(ntcntalkTmplatCode), 100, StringUtils.SPACE);
|
||||
}
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 버튼요청건수: 1자리
|
||||
* 최대 5
|
||||
* </pre>
|
||||
*/
|
||||
@Schema(requiredMode = Schema.RequiredMode.REQUIRED, title = "버튼요청건수", example = " ")
|
||||
@Pattern(regexp = "^[0-5]$", message = "버튼요청건수는 1자리로 최대 5 입니다.")
|
||||
private String bttonRequstCo = "1";
|
||||
public void setBttonRequstCo(Integer bttonRequstCo) {
|
||||
this.bttonRequstCo = StringUtils.rightPad(nvl(bttonRequstCo == null ? "" : bttonRequstCo.toString()), 1, StringUtils.SPACE);
|
||||
}
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 공란 - 880
|
||||
* </pre>
|
||||
*/
|
||||
@Schema(title = "공란", example = " ")
|
||||
@Size(min = 880, max = 880, message = "공란(880자리)")
|
||||
private String indvdlzRequstBlnk = StringUtils.rightPad(StringUtils.EMPTY, 880, StringUtils.SPACE);
|
||||
//----------------------------------------------------------------------------------------------
|
||||
// 개별요청부 : 3000 자리
|
||||
//----------------------------------------------------------------------------------------------
|
||||
|
||||
//----------------------------------------------------------------------------------------------
|
||||
// 조회요청부 반복: 50 자리
|
||||
//----------------------------------------------------------------------------------------------
|
||||
List<QueryRequest> queryRequests = new ArrayList<>();
|
||||
//----------------------------------------------------------------------------------------------
|
||||
// 조회요청부 반복: 50 자리
|
||||
//----------------------------------------------------------------------------------------------
|
||||
|
||||
//----------------------------------------------------------------------------------------------
|
||||
// 버튼요청부 반복: 3000 자리
|
||||
//----------------------------------------------------------------------------------------------
|
||||
List<ButtonRequest> buttonRequests = new ArrayList<>();
|
||||
//----------------------------------------------------------------------------------------------
|
||||
// 버튼요청부 반복: 3000 자리
|
||||
//----------------------------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* NICE CI API 전송 요청 전문 생성 - 한글 2, 그외 1 자리로 생성
|
||||
* @return String NICE CI send 전문
|
||||
*/
|
||||
public String ofString() {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
//sb.append(trCode);
|
||||
// 공통부
|
||||
sb.append(niceCommon.ofString(true));
|
||||
|
||||
// 개별요청부
|
||||
sb.append(inqireResn);
|
||||
sb.append(inqireRequstCo);
|
||||
sb.append(smsSndngRequstSe);
|
||||
sb.append(sndngMssage);
|
||||
sb.append(dsptchNo);
|
||||
sb.append(cttpcInqireSe);
|
||||
sb.append(ntcntalkSndngRequstSe);
|
||||
sb.append(ntcntalkTmplatCode);
|
||||
sb.append(bttonRequstCo);
|
||||
sb.append(indvdlzRequstBlnk);
|
||||
sb.append(queryRequests.stream().map(QueryRequest::ofString).collect(Collectors.joining()));
|
||||
sb.append(buttonRequests.stream().map(ButtonRequest::ofString).collect(Collectors.joining()));
|
||||
// FIXME: 인코딩확인후 적용
|
||||
//return NiceCiUtils.covertCharset(sb.toString(), "EUC-KR");
|
||||
return sb.toString();
|
||||
}
|
||||
}
|
||||
|
||||
@Schema(name = "Response(Nice CI) DTO", description = "NICE CI 응답 전문 DTO")
|
||||
@Data
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public static class Response implements Serializable {
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
/**
|
||||
* nice sms 발송 요청 ID - 업무 PK
|
||||
*/
|
||||
private String niceSmsSndngRequstId;
|
||||
|
||||
//----------------------------------------------------------------------------------------------
|
||||
// TR-CODE : 0 ~ 9 자리
|
||||
//----------------------------------------------------------------------------------------------
|
||||
/**
|
||||
* <pre>
|
||||
* TR-CODE
|
||||
* 회원사 고유키 - 요청시 필수 max: 9
|
||||
* </pre>
|
||||
*/
|
||||
private String trnscId;
|
||||
public void setTrnscId(String trnscId) {
|
||||
this.trnscId = StringUtils.trim(trnscId);
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------------------------
|
||||
// 공통부 : 100 자리
|
||||
//----------------------------------------------------------------------------------------------
|
||||
NiceCiApiCommon niceCommon;
|
||||
//----------------------------------------------------------------------------------------------
|
||||
// 공통부 : 100 자리
|
||||
//----------------------------------------------------------------------------------------------
|
||||
|
||||
//----------------------------------------------------------------------------------------------
|
||||
// 개별응답부 : 2100 자리
|
||||
//----------------------------------------------------------------------------------------------
|
||||
/**
|
||||
* <pre>
|
||||
* 응답건수: 필수 2자리
|
||||
* 최대 48
|
||||
* </pre>
|
||||
*/
|
||||
private String rspnsCo;
|
||||
public void setRspnsCo(String rspnsCo) {
|
||||
this.rspnsCo = StringUtils.trim(rspnsCo);
|
||||
}
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* SMS발송요청구분코드: 필수 1자리
|
||||
* 1 ~ 3의 경우 발송메세지와 발신번호 필수
|
||||
* 0 : 미요청,
|
||||
* 1: 1순위연락처로 발송,
|
||||
* 2: 1 ~ 2 순위 연락처중 최우선순위 1개로 발송
|
||||
* 3: 1 ~ 3 순위 연락처중 최우선순위 1개로 발송
|
||||
* </pre>
|
||||
*/
|
||||
private String smsSndngRequstSe;
|
||||
public void setSmsSndReq(String smsSndReqCode) {
|
||||
this.smsSndngRequstSe = StringUtils.trim(smsSndReqCode);
|
||||
}
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 발송메세지: 10 ~ 2000자리
|
||||
* 발송요청구분(smsSndReqCode)가 1, 2, 3인 경우 필수
|
||||
* NiceCiUtils.leftKr, substringKr 메소드 사용
|
||||
* </pre>
|
||||
*/
|
||||
private String sndngMssage;
|
||||
public void setSndngMssage(String sndngMssage) {
|
||||
this.sndngMssage = StringUtils.trim(sndngMssage);
|
||||
}
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 발신번호: 12자리
|
||||
* 발송요청구분(smsSndReqCode)가 1, 2, 3인 경우 필수
|
||||
* </pre>
|
||||
*/
|
||||
private String dsptchNo;
|
||||
public void setDsptchNo(String dsptchNo) {
|
||||
this.dsptchNo = StringUtils.trim(dsptchNo);
|
||||
}
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 연락처조회구분: 1자리
|
||||
* default: 3
|
||||
* 1: 1순위만 조회,
|
||||
* 2: 2순위 이내 조회
|
||||
* 3: 3순위 이내 조회
|
||||
* </pre>
|
||||
*/
|
||||
private String cttpcInqireSe = "3";
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 공란 - 84 자리
|
||||
* </pre>
|
||||
*/
|
||||
private String indvdlzRspnsBlnk;
|
||||
public void setIndvdlzRspnsBlnk(String indvdlzRspnsBlnk) {
|
||||
this.indvdlzRspnsBlnk = StringUtils.trim(indvdlzRspnsBlnk);
|
||||
}
|
||||
//----------------------------------------------------------------------------------------------
|
||||
// 개별응답부 : 2100 자리
|
||||
//----------------------------------------------------------------------------------------------
|
||||
|
||||
//----------------------------------------------------------------------------------------------
|
||||
// 응답반복부 : 110 자리
|
||||
//----------------------------------------------------------------------------------------------
|
||||
List<NiceCiApiResult> niceCiResults = new ArrayList<>();
|
||||
//----------------------------------------------------------------------------------------------
|
||||
// 응답반복부 : 110 자리
|
||||
//----------------------------------------------------------------------------------------------
|
||||
|
||||
public static Response parse(String tgtString) {
|
||||
final int repeatLength = 110;
|
||||
final int[] parseLength = {
|
||||
10, // tr-code
|
||||
100, // 공통부
|
||||
// FIXME: spec과 상이 - 확인 필요 : "1"이 들어오고 있다
|
||||
2, // 응답건수
|
||||
1, // SMS발송요청구분코드
|
||||
2000, // SMS 발송메세지
|
||||
12, // SMS 발신번호
|
||||
1, // 연락처조회구분
|
||||
84, // 공란
|
||||
};
|
||||
|
||||
if (StringUtils.isNotBlank(tgtString) && NiceCiUtils.lengthKr(tgtString) >= 2210) {
|
||||
Response response = new Response();
|
||||
int idx = 0;
|
||||
response.setTrnscId(StringUtils.left(tgtString, parseLength[idx]));
|
||||
tgtString = tgtString.substring(parseLength[idx++]);
|
||||
|
||||
response.setNiceCommon(NiceCiApiCommon.parse(tgtString));
|
||||
tgtString = tgtString.substring(parseLength[idx++]);
|
||||
|
||||
response.setRspnsCo(StringUtils.left(tgtString, parseLength[idx]));
|
||||
tgtString = tgtString.substring(parseLength[idx++]);
|
||||
|
||||
response.setSmsSndngRequstSe(StringUtils.left(tgtString, parseLength[idx]));
|
||||
tgtString = tgtString.substring(parseLength[idx++]);
|
||||
|
||||
response.setSndngMssage(NiceCiUtils.leftKr(tgtString, parseLength[idx]));
|
||||
tgtString = NiceCiUtils.substringKr(tgtString, parseLength[idx++]);
|
||||
|
||||
response.setDsptchNo(StringUtils.left(tgtString, parseLength[idx]));
|
||||
tgtString = tgtString.substring(parseLength[idx++]);
|
||||
|
||||
response.setCttpcInqireSe(StringUtils.left(tgtString, parseLength[idx]));
|
||||
tgtString = tgtString.substring(parseLength[idx++]);
|
||||
|
||||
response.setIndvdlzRspnsBlnk(StringUtils.left(tgtString, parseLength[idx]));
|
||||
tgtString = tgtString.substring(parseLength[idx]);
|
||||
|
||||
if(NiceCiUtils.lengthKr(tgtString) > 0 && NiceCiUtils.lengthKr(tgtString) % repeatLength == 0){
|
||||
int repeat = NiceCiUtils.lengthKr(tgtString) / repeatLength;
|
||||
String finalTgtString = tgtString;
|
||||
List<NiceCiApiResult> resResults = IntStream.range(0, repeat)
|
||||
.mapToObj(i -> {
|
||||
String currentString = NiceCiUtils.substringKr(finalTgtString, i * repeatLength);
|
||||
return NiceCiApiResult.parse(currentString);
|
||||
})
|
||||
.collect(Collectors.toList());
|
||||
response.setNiceCiResults(resResults);
|
||||
}else{
|
||||
if((NiceCiUtils.lengthKr(tgtString) != 0)){
|
||||
throw new EnsException(EnsErrCd.INVALID_RESPONSE, "NICE CI 송신 응답 반복부 전문 오류:: length - " + NiceCiUtils.lengthKr(tgtString));
|
||||
}
|
||||
}
|
||||
return response;
|
||||
}
|
||||
throw new EnsException(EnsErrCd.INVALID_RESPONSE, "NICE CI 송신 응답 전문 오류:: length - " + NiceCiUtils.lengthKr(tgtString));
|
||||
}
|
||||
}
|
||||
|
||||
@Schema(name = "QueryRequest", description = "NICE CI 조회 요청 DTO")
|
||||
@Data
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public static class QueryRequest {
|
||||
/**
|
||||
* <pre>
|
||||
* 개인/사업자/법인구분 - 1자리
|
||||
* 1(개인) 고정
|
||||
* </pre>
|
||||
*/
|
||||
@Schema(title = "개인/사업자/법인구분", example = "1")
|
||||
@Size(min = 1, max = 1, message = "개인/사업자/법인구분은 1자리 입니다.")
|
||||
private String indvdlBsnmCprSe = "1";
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 주민번호 - 13자리
|
||||
* </pre>
|
||||
*/
|
||||
@Schema(title = "주민번호", example = " ")
|
||||
@Size(min = 13, max = 13, message = "주민번호는 13자리 입니다.")
|
||||
private String ihidnum = StringUtils.rightPad(StringUtils.EMPTY, 13, StringUtils.SPACE);
|
||||
public void setIhidnum(String ihidnum) {
|
||||
this.ihidnum = StringUtils.rightPad(nvl(ihidnum), 13, StringUtils.SPACE);
|
||||
}
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 공란 - 880
|
||||
* </pre>
|
||||
*/
|
||||
@Schema(title = "공란", example = " ")
|
||||
@Size(min = 36, max = 36, message = "공란(36자리)")
|
||||
private String inqireRequstBlnk = StringUtils.rightPad(StringUtils.EMPTY, 36, StringUtils.SPACE);
|
||||
|
||||
public String ofString() {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
sb.append(indvdlBsnmCprSe);
|
||||
sb.append(ihidnum);
|
||||
sb.append(inqireRequstBlnk);
|
||||
return sb.toString();
|
||||
}
|
||||
}
|
||||
|
||||
@Schema(name = "ButtonRequest", description = "NICE CI 버튼 요청 DTO")
|
||||
@Data
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public static class ButtonRequest {
|
||||
/**
|
||||
* <pre>
|
||||
* 버튼타입 - 2자리
|
||||
* WL|AL
|
||||
* </pre>
|
||||
*/
|
||||
@Schema(requiredMode = Schema.RequiredMode.REQUIRED, title = "버튼타입", example = " ", allowableValues = {"WL", "AL"})
|
||||
@Pattern(regexp = "[WL|AL]", message = "버튼 타입은 2자리 입니다.")
|
||||
private String bttonTy = "WL";
|
||||
public void setBttonTy(String bttonTy) {
|
||||
this.bttonTy = StringUtils.rightPad(nvl(bttonTy), 2, StringUtils.SPACE);
|
||||
}
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 버튼이름 - 56자리
|
||||
* </pre>
|
||||
*/
|
||||
@Schema(title = "버튼이름", example = "1")
|
||||
@Size(min = 56, max = 56, message = "버튼이름은 56자리 입니다.")
|
||||
private String bttonNm = NiceCiUtils.rightPadKr("납부하기", 56, StringUtils.SPACE);
|
||||
public void setBttonNm(String bttonNm) {
|
||||
this.bttonNm = NiceCiUtils.rightPadKr(nvl(bttonNm), 56, StringUtils.SPACE);
|
||||
}
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 버튼URL웹링크1 - 1000자리
|
||||
* 버튼타입(btnType)이 WL일 경우 모마일 URL, AL일 경우 Android scheme
|
||||
* </pre>
|
||||
*/
|
||||
@Schema(title = "버튼URL웹링크1", example = " ")
|
||||
@Size(min = 1000, max = 1000, message = "버튼URL웹링크1 은 1000자리 입니다.")
|
||||
private String bttonUrlWebLink_1 = StringUtils.rightPad(
|
||||
"https://billgates-web.kakao.com/r/platform/pages/paynow/search/1832/11/01819e09-8b4c-4287-9f0f-1c5c2df80bf0",
|
||||
1000,
|
||||
StringUtils.SPACE);
|
||||
public void setBttonUrlWebLink_1(String bttonUrlWebLink_1) {
|
||||
this.bttonUrlWebLink_1 = StringUtils.rightPad(nvl(bttonUrlWebLink_1), 1000, StringUtils.SPACE);
|
||||
}
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 버튼URL웹링크2 - 1000자리
|
||||
* 버튼타입(btnType)이 WL일 경우 PC URL, AL일 경우 IOS scheme
|
||||
* </pre>
|
||||
*/
|
||||
@Schema(title = "버튼URL웹링크2", example = " ")
|
||||
@Size(min = 1000, max = 1000, message = "버튼URL웹링크2 은 1000자리 입니다.")
|
||||
private String bttonUrlWebLink_2 = StringUtils.rightPad(StringUtils.EMPTY, 1000, StringUtils.SPACE);
|
||||
public void setBttonUrlWebLink_2(String bttonUrlWebLink_2) {
|
||||
this.bttonUrlWebLink_2 = StringUtils.rightPad(nvl(bttonUrlWebLink_2), 1000, StringUtils.SPACE);
|
||||
}
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 공란 - 942
|
||||
* </pre>
|
||||
*/
|
||||
@Schema(title = "공란", example = " ")
|
||||
@Size(min = 942, max = 942, message = "공란(36자리)")
|
||||
private String bttonRequstBlnk = StringUtils.rightPad(StringUtils.EMPTY, 942, StringUtils.SPACE);
|
||||
|
||||
public String ofString() {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
sb.append(bttonTy);
|
||||
sb.append(bttonNm);
|
||||
sb.append(bttonUrlWebLink_1);
|
||||
sb.append(bttonUrlWebLink_2);
|
||||
sb.append(bttonRequstBlnk);
|
||||
return sb.toString();
|
||||
}
|
||||
}
|
||||
|
||||
private static String nvl(String src){
|
||||
return StringUtils.defaultIfEmpty(src, StringUtils.EMPTY);
|
||||
}
|
||||
}
|
@ -0,0 +1,361 @@
|
||||
package cokr.xit.ens.modules.nice.model;
|
||||
|
||||
import java.io.*;
|
||||
import java.nio.charset.*;
|
||||
import java.util.*;
|
||||
import java.util.stream.*;
|
||||
|
||||
import javax.validation.*;
|
||||
import javax.validation.constraints.*;
|
||||
|
||||
import org.apache.commons.lang3.*;
|
||||
|
||||
import cokr.xit.ens.core.exception.*;
|
||||
import cokr.xit.ens.core.exception.code.*;
|
||||
import cokr.xit.ens.modules.nice.cmm.*;
|
||||
import io.swagger.v3.oas.annotations.media.*;
|
||||
import lombok.*;
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* description : Nice CI 상태 조회 전문 DTO
|
||||
* Builder 패턴 사용 X
|
||||
* -> setter를 사용 필드 길이 고정 필요
|
||||
* packageName : cokr.xit.ens.modules.nice.model
|
||||
* fileName : NiceCiApiStatusDTO
|
||||
* author : limju
|
||||
* date : 2024 9월 23
|
||||
* ======================================================================
|
||||
* 변경일 변경자 변경 내용
|
||||
* ----------------------------------------------------------------------
|
||||
* 2024 9월 23 limju 최초 생성
|
||||
*
|
||||
* </pre>
|
||||
*/
|
||||
public class NiceCiApiStatusDTO {
|
||||
|
||||
@Schema(name = "Request(Nice CI History) API DTO", description = "NICE CI API 이력 요청 전문 DTO")
|
||||
@Data
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public static class Request implements Serializable {
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
//----------------------------------------------------------------------------------------------
|
||||
// TR-CODE : 0 ~ 9 자리
|
||||
//----------------------------------------------------------------------------------------------
|
||||
/**
|
||||
* <pre>
|
||||
* TR-CODE
|
||||
* 요청시 필수 10자리
|
||||
* 전문길이 set
|
||||
* </pre>
|
||||
*/
|
||||
//@Schema(requiredMode = Schema.RequiredMode.REQUIRED, title = "TR Code", example = " ")
|
||||
//@Size(min = 10, max = 10, message = "트랜잭션 코드는 10자리 입니다.")
|
||||
private String trnscId = StringUtils.EMPTY;
|
||||
public void setTrnscId(String trnscId) {
|
||||
this.trnscId = StringUtils.leftPad(nvl(trnscId), 10, "0");
|
||||
}
|
||||
|
||||
/**
|
||||
* nice sms 발송 요청 ID - 업무 PK
|
||||
*/
|
||||
private String niceSmsSndngInqireId;
|
||||
//----------------------------------------------------------------------------------------------
|
||||
|
||||
//----------------------------------------------------------------------------------------------
|
||||
// 공통부 : 100 자리
|
||||
//----------------------------------------------------------------------------------------------
|
||||
@Schema(requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
@Valid
|
||||
NiceCiApiCommon niceCommon;
|
||||
//----------------------------------------------------------------------------------------------
|
||||
// 공통부 : 100 자리
|
||||
//----------------------------------------------------------------------------------------------
|
||||
|
||||
//----------------------------------------------------------------------------------------------
|
||||
// 개별요청부 : 100 자리
|
||||
//----------------------------------------------------------------------------------------------
|
||||
/**
|
||||
* <pre>
|
||||
* 검색기간 from - 20 자리
|
||||
* YYYYMMDDHHMMSS(14)+microSecond(6)
|
||||
* DateUtils.getNowTimeMicrosecond()
|
||||
* </pre>
|
||||
*/
|
||||
@Schema(title = "검색기간 from", example = " ")
|
||||
@Size(min = 20, max = 20, message = "검색기간 from")
|
||||
private String searchPdFrom;
|
||||
public void setSearchPdFrom(String searchPdFrom) {
|
||||
this.searchPdFrom = StringUtils.rightPad(nvl(searchPdFrom), 20, "0");
|
||||
}
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 검색기간 to - 20 자리
|
||||
* YYYYMMDDHHMMSS(14)+microSecond(6)
|
||||
* </pre>
|
||||
*/
|
||||
@Schema(title = "검색기간 to", example = " ")
|
||||
@Size(min = 20, max = 20, message = "검색기간 to")
|
||||
private String searchPdTo;
|
||||
public void setSearchPdTo(String searchPdTo) {
|
||||
this.searchPdTo = StringUtils.rightPad(nvl(searchPdTo), 20, "0");
|
||||
}
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 개인/사업자/법인구분 - 1자리
|
||||
* 1(개인) 고정
|
||||
* </pre>
|
||||
*/
|
||||
@Schema(title = "개인/사업자/법인구분", example = "1")
|
||||
@Size(min = 1, max = 1, message = "개인/사업자/법인구분은 1자리 입니다.")
|
||||
private String indvdlBsnmCprSe = "1";
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 주민번호 - 13자리
|
||||
* </pre>
|
||||
*/
|
||||
@Schema(title = "주민번호", example = " ")
|
||||
//@Size(min = 13, max = 13, message = "주민번호는 13자리 입니다.")
|
||||
private String ihidnum = StringUtils.rightPad(StringUtils.EMPTY, 13, StringUtils.SPACE);
|
||||
public void setIhidnum(String ihidnum) {
|
||||
this.ihidnum = StringUtils.rightPad(nvl(ihidnum), 13, StringUtils.SPACE);
|
||||
}
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 결과구분코드 - 2자리
|
||||
* " " - 전체조회
|
||||
* 00 - 정상(SMS미발송시 조회정상, SMS발송시 발송정상)
|
||||
* 01 - 연락처조회 실패건(주민번호오류/데이터없음/기타오류 건)
|
||||
* 10 - 진행중(연락처조회 정상건 중 SMS발송 이전)
|
||||
* </pre>
|
||||
*/
|
||||
@Schema(title = "결과구분코드", example = " ", allowableValues = {" ", "00", "01", "10"})
|
||||
@Size(min = 2, max = 2, message = "결과구분코드는 2자리 입니다.")
|
||||
private String resultSe = " ";
|
||||
public void setResultSe(String resultSe) {
|
||||
this.resultSe = StringUtils.rightPad(nvl(resultSe), 2, StringUtils.SPACE);
|
||||
}
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* SMS발송요청구분 - 1자리
|
||||
* 0 : 미요청,
|
||||
* 1: 1순위연락처로 발송,
|
||||
* 2: 1 ~ 2 순위중 최우선 순위로 1개 발송
|
||||
* 3: 1 ~ 3 순위중 최우선 순위로 1개 발송
|
||||
* 4: 1{1순위로 요청건} + 2{1~2순위로 요청건} + 3{1~3 순위로 요청건}
|
||||
* </pre>
|
||||
*/
|
||||
@Schema(title = "SMS발송요청구분", example = " ", allowableValues = {"0", "1", "2", "3", "4"})
|
||||
@Size(min = 1, max = 1, message = "SMS발송요청구분은 1자리 입니다.")
|
||||
private String smsSndngRequstSe = "0";
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 요청건수 - 10자리
|
||||
* 한 트랜잭션에서 받고자 한는 건 수 : 최대 100건
|
||||
* </pre>
|
||||
*/
|
||||
@Schema(title = "요청건수", example = " ")
|
||||
@Pattern(regexp = "^[\\s\\S]{10}$", message = "요청건수는 10자리(max 100)입니다")
|
||||
private String requstCo;
|
||||
public void setRequstCo(String requstCo){
|
||||
this.requstCo = StringUtils.leftPad(nvl(requstCo), 10, "0");
|
||||
}
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 누적수신건수 - 10자리
|
||||
* 최초조회시 "0000000000"
|
||||
* </pre>
|
||||
*/
|
||||
@Schema(title = "누적수신건수", example = " ")
|
||||
@Size(min = 10, max = 10, message = "누적수신건수는 10자리 입니다.")
|
||||
@Pattern(regexp = "^\\d{10}$", message = "요청건수는 10자리(max 100)입니다")
|
||||
private String accmltRecptnCo;
|
||||
public void setAccmltRecptnCo(String accmltRecptnCo) {
|
||||
this.accmltRecptnCo = StringUtils.leftPad(nvl(accmltRecptnCo), 10, "0");
|
||||
}
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 공란 - 880
|
||||
* </pre>
|
||||
*/
|
||||
@Schema(title = "공란", example = " ")
|
||||
@Size(min = 23, max = 23, message = "공란(23자리)")
|
||||
private String indvdlzRequstBlnk = StringUtils.rightPad(StringUtils.EMPTY, 23, StringUtils.SPACE);
|
||||
public void setIndvdlzRequstBlnk(String indvdlzRequstBlnk) {
|
||||
this.indvdlzRequstBlnk = StringUtils.rightPad(nvl(indvdlzRequstBlnk), 23, StringUtils.SPACE);
|
||||
}
|
||||
//----------------------------------------------------------------------------------------------
|
||||
// 개별요청부 : 100 자리
|
||||
//----------------------------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* NICE CI API 상태 조회 전문 생성 - 한글 2, 그외 1 자리로 생성
|
||||
* @return String NICE CI 상태 조회 전문
|
||||
*/
|
||||
public String ofString() {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
sb.append(trnscId);
|
||||
|
||||
// 공통부
|
||||
sb.append(niceCommon.ofString(false));
|
||||
|
||||
// 개별요청부
|
||||
sb.append(searchPdFrom);
|
||||
sb.append(searchPdTo);
|
||||
sb.append(indvdlBsnmCprSe);
|
||||
sb.append(ihidnum);
|
||||
sb.append(resultSe);
|
||||
sb.append(smsSndngRequstSe);
|
||||
sb.append(requstCo);
|
||||
sb.append(accmltRecptnCo);
|
||||
sb.append(indvdlzRequstBlnk);
|
||||
|
||||
// FIXME: 인코딩확인후 적용
|
||||
return new String(sb.toString().getBytes(), StandardCharsets.UTF_8);
|
||||
}
|
||||
}
|
||||
|
||||
@Schema(name = "Response(Nice CI Status) DTO", description = "NICE CI 상태(이력) 응답 전문 DTO")
|
||||
@Data
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public static class Response implements Serializable {
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
//----------------------------------------------------------------------------------------------
|
||||
// TR-CODE : 0 ~ 9 자리
|
||||
//----------------------------------------------------------------------------------------------
|
||||
/**
|
||||
* <pre>
|
||||
* TR-CODE
|
||||
* 회원사 고유키 - 요청시 필수 max: 9
|
||||
* </pre>
|
||||
*/
|
||||
private String trnscId;
|
||||
public void setTrnscId(String trnscId) {
|
||||
this.trnscId = StringUtils.trim(trnscId);
|
||||
}
|
||||
|
||||
/**
|
||||
* nice sms 발송 요청 ID - 업무 PK
|
||||
*/
|
||||
private String niceSmsSndngInqireId;
|
||||
|
||||
//----------------------------------------------------------------------------------------------
|
||||
// 공통부 : 100 자리
|
||||
//----------------------------------------------------------------------------------------------
|
||||
NiceCiApiCommon niceCommon;
|
||||
//----------------------------------------------------------------------------------------------
|
||||
// 공통부 : 100 자리
|
||||
//----------------------------------------------------------------------------------------------
|
||||
|
||||
//----------------------------------------------------------------------------------------------
|
||||
// 개별응답부 : 30 자리
|
||||
//----------------------------------------------------------------------------------------------
|
||||
/**
|
||||
* <pre>
|
||||
* 총건수: 10자리
|
||||
* </pre>
|
||||
*/
|
||||
private String totCo;
|
||||
public void setTotCo(String totCo) {
|
||||
this.totCo = StringUtils.trim(totCo);
|
||||
}
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 누적건수: 10자리
|
||||
* </pre>
|
||||
*/
|
||||
private String accmltCo;
|
||||
public void setAccmltCo(String accmltCo) {
|
||||
this.accmltCo = StringUtils.trim(accmltCo);
|
||||
}
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 응답건수: 10자리
|
||||
* 최대 100건
|
||||
* </pre>
|
||||
*/
|
||||
private String rspnsCo;
|
||||
public void setRspnsCo(String rspnsCo) {
|
||||
this.rspnsCo = StringUtils.trim(rspnsCo);
|
||||
}
|
||||
//----------------------------------------------------------------------------------------------
|
||||
// 개별응답부 : 30 자리
|
||||
//----------------------------------------------------------------------------------------------
|
||||
|
||||
//----------------------------------------------------------------------------------------------
|
||||
// 응답반복부 : 1150 자리
|
||||
//----------------------------------------------------------------------------------------------
|
||||
List<NiceCiApiResult> niceCiResults = new ArrayList<>();
|
||||
//----------------------------------------------------------------------------------------------
|
||||
// 응답반복부 : 1150 자리
|
||||
//----------------------------------------------------------------------------------------------
|
||||
|
||||
public static Response parse(String tgtString) {
|
||||
final int repeatLength = 1150;
|
||||
final int[] parseLength = {
|
||||
10, // tr-code
|
||||
100, // 공통부
|
||||
10, // 총건수
|
||||
10, // 누적건수
|
||||
10, // 응답건수
|
||||
};
|
||||
// FIXME: 인코딩확인후 필요시 사용
|
||||
//String tgtString = new String(tgtStr.getBytes(), StandardCharsets.UTF_8);
|
||||
|
||||
if (StringUtils.isNotBlank(tgtString) && NiceCiUtils.lengthKr(tgtString) >= 140) {
|
||||
Response nr = new Response();
|
||||
int idx = 0;
|
||||
nr.setTrnscId(StringUtils.left(tgtString, parseLength[idx]));
|
||||
tgtString = tgtString.substring(parseLength[idx++]);
|
||||
|
||||
nr.setNiceCommon(NiceCiApiCommon.parse(tgtString));
|
||||
tgtString = tgtString.substring(parseLength[idx++]);
|
||||
|
||||
nr.setTotCo(StringUtils.left(tgtString, parseLength[idx]));
|
||||
tgtString = tgtString.substring(parseLength[idx++]);
|
||||
|
||||
nr.setAccmltCo(StringUtils.left(tgtString, parseLength[idx]));
|
||||
tgtString = tgtString.substring(parseLength[idx++]);
|
||||
|
||||
nr.setRspnsCo(StringUtils.left(tgtString, parseLength[idx]));
|
||||
tgtString = tgtString.substring(parseLength[idx++]);
|
||||
|
||||
if(NiceCiUtils.lengthKr(tgtString) > 0 && NiceCiUtils.lengthKr(tgtString) % repeatLength == 0){
|
||||
int repeat = NiceCiUtils.lengthKr(tgtString) / repeatLength;
|
||||
String finalTgtString = tgtString;
|
||||
List<NiceCiApiResult> resResults = IntStream.range(0, repeat)
|
||||
.mapToObj(i -> {
|
||||
String currentString = NiceCiUtils.substringKr(finalTgtString, i * repeatLength);
|
||||
return NiceCiApiResult.parseStatus(currentString);
|
||||
})
|
||||
.collect(Collectors.toList());
|
||||
nr.setNiceCiResults(resResults);
|
||||
}else{
|
||||
if((NiceCiUtils.lengthKr(tgtString) != 0)){
|
||||
throw new EnsException(EnsErrCd.INVALID_RESPONSE, "NICE CI 상태(이력) 조회 응답 반복부 전문 오류:: length - " + NiceCiUtils.lengthKr(tgtString));
|
||||
}
|
||||
}
|
||||
return nr;
|
||||
}
|
||||
throw new EnsException(EnsErrCd.INVALID_RESPONSE, "NICE CI 상태(이력) 조회 응답 전문 오류:: length - " + NiceCiUtils.lengthKr(tgtString));
|
||||
}
|
||||
}
|
||||
|
||||
private static String nvl(String src){
|
||||
return StringUtils.defaultIfEmpty(src, StringUtils.EMPTY);
|
||||
}
|
||||
}
|
@ -0,0 +1,491 @@
|
||||
package cokr.xit.ens.modules.nice.model;
|
||||
|
||||
import java.time.*;
|
||||
import java.util.*;
|
||||
|
||||
import cokr.xit.ens.biz.iup.code.*;
|
||||
import cokr.xit.ens.modules.common.ctgy.intgrnbill.support.code.*;
|
||||
import io.swagger.v3.oas.annotations.media.*;
|
||||
import lombok.*;
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* description : NICE CI 인증 업무 DTO
|
||||
* packageName : cokr.xit.ens.modules.nice.model
|
||||
* fileName : NiceCiDTO
|
||||
* author : limju
|
||||
* date : 2024 9월 30
|
||||
* ======================================================================
|
||||
* 변경일 변경자 변경 내용
|
||||
* ----------------------------------------------------------------------
|
||||
* 2024 9월 30 limju 최초 생성
|
||||
*
|
||||
* </pre>
|
||||
*/
|
||||
public class NiceCiDTO {
|
||||
@Schema(name = "InputXit DTO", description = "InputXit DTO")
|
||||
@Data
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
@Builder
|
||||
public static class NiceCiParam {
|
||||
/**
|
||||
* 발송구분
|
||||
*/
|
||||
private String sendType = IupSendTypeCd.NI.getCode();
|
||||
|
||||
/**
|
||||
* 상태값
|
||||
*/
|
||||
private String prcsCd = IupPrcsCd.TGRG.getCode();
|
||||
|
||||
/**
|
||||
* 연계입수아이디
|
||||
*/
|
||||
private Long lnkInputId;
|
||||
|
||||
/**
|
||||
* 진행 상태
|
||||
*/
|
||||
private String reqStatusCd;
|
||||
|
||||
/**
|
||||
* 안내장 코드
|
||||
*/
|
||||
private String jobCd;
|
||||
|
||||
private String errorCode;
|
||||
private String errorMessage;
|
||||
|
||||
private String resultCd;
|
||||
private String resultDt;
|
||||
|
||||
private String url;
|
||||
}
|
||||
|
||||
@Schema(name = "InputXit DTO", description = "InputXit DTO")
|
||||
@Data
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
@Builder
|
||||
public static class InputXit {
|
||||
/**
|
||||
* 연계입수아이디
|
||||
*/
|
||||
private Long lnkInputId;
|
||||
|
||||
/**
|
||||
* 기관코드
|
||||
*/
|
||||
private String orgCd;
|
||||
|
||||
/**
|
||||
* 안내장 코드
|
||||
*/
|
||||
private String jobCd;
|
||||
|
||||
/**
|
||||
* 입수 건수
|
||||
*/
|
||||
private Long totCnt;
|
||||
|
||||
/**
|
||||
* 상태값
|
||||
*/
|
||||
private String prcsCd;
|
||||
|
||||
/**
|
||||
* 에러메세지
|
||||
*/
|
||||
private String errMsg;
|
||||
|
||||
/**
|
||||
* 발송일시분
|
||||
*/
|
||||
private LocalDateTime runDt;
|
||||
|
||||
/**
|
||||
* 조회마감일시
|
||||
*/
|
||||
private LocalDateTime expiresDt;
|
||||
|
||||
/**
|
||||
* 발송구분
|
||||
*/
|
||||
private String sendType;
|
||||
|
||||
/**
|
||||
* 접수일시
|
||||
*/
|
||||
private String rcptDt;
|
||||
|
||||
/**
|
||||
* 결재마감일시
|
||||
*/
|
||||
private LocalDateTime payExpiresDt;
|
||||
|
||||
List<InputDataXit> inputDataXits = new ArrayList<>();
|
||||
|
||||
private String regId;
|
||||
private LocalDateTime regDt;
|
||||
private String updId;
|
||||
private LocalDateTime updDt;
|
||||
}
|
||||
|
||||
@Schema(name = "InputDataXit DTO", description = "InputDataXit DTO")
|
||||
@Data
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
@Builder
|
||||
public static class InputDataXit {
|
||||
private String dataId;
|
||||
private Long lnkInputId;
|
||||
|
||||
private String birthday;
|
||||
|
||||
private String callCenterNo;
|
||||
|
||||
private String carNo;
|
||||
|
||||
private String gender;
|
||||
|
||||
private String linkedUuid;
|
||||
|
||||
private String moblphonNo;
|
||||
|
||||
private String msgData;
|
||||
|
||||
private String msgDtlData;
|
||||
|
||||
private String name;
|
||||
|
||||
private String payStatusCd;
|
||||
|
||||
private String payUrl;
|
||||
|
||||
private String sid;
|
||||
|
||||
private String regId;
|
||||
private LocalDateTime regDt;
|
||||
private String updId;
|
||||
private LocalDateTime updDt;
|
||||
}
|
||||
|
||||
@Schema(name = "BillDTO DTO", description = "BillDTO DTO")
|
||||
@Data
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
@Builder
|
||||
public static class BillDTO {
|
||||
private Long billId;
|
||||
|
||||
private String billUid;
|
||||
|
||||
private String billerUserKey;
|
||||
|
||||
|
||||
/**
|
||||
* 청구서 타입
|
||||
*/
|
||||
//@Enumerated(EnumType.STRING)
|
||||
private String billSeCd;
|
||||
|
||||
private String orgCd;
|
||||
|
||||
/**
|
||||
* 납부결제여부
|
||||
*/
|
||||
private Boolean paidAt;
|
||||
|
||||
/**
|
||||
* 지불유형
|
||||
*/
|
||||
//@Enumerated(EnumType.STRING)
|
||||
private String paidType;
|
||||
|
||||
/**
|
||||
* 납부(결제) 날짜 - 14자리
|
||||
*/
|
||||
private String paidDt;
|
||||
|
||||
/**
|
||||
* 납부(결제) 취소 날짜 - 14자리
|
||||
*/
|
||||
private String paidCancelDt;
|
||||
|
||||
|
||||
private String docBillKko;
|
||||
|
||||
|
||||
private String docBillNv;
|
||||
}
|
||||
|
||||
@Schema(name = "BillKkoDTO DTO", description = "BillKkoDTO DTO")
|
||||
@Data
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
@Builder
|
||||
public static class BillKkoDTO {
|
||||
private Long billId;
|
||||
private String billUid;
|
||||
private String billerUserKey;
|
||||
|
||||
/**
|
||||
* 청구년월
|
||||
*/
|
||||
private String billedYearMonth;
|
||||
|
||||
/**
|
||||
* 동일 고객번호 구분 값
|
||||
*/
|
||||
private String ordinal;
|
||||
|
||||
/**
|
||||
* 개별 청구서를 식별하는 키 값
|
||||
*/
|
||||
private String billerNoticeKey;
|
||||
|
||||
/**
|
||||
* URL 만료일
|
||||
*/
|
||||
private String expireAt;
|
||||
|
||||
/**
|
||||
* API 호출 시 함께 전달할 JSON형태의 문자열
|
||||
*/
|
||||
private String parameters;
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 청구서조회/납부가능여부/납부결과 API Url정보 JSON형태의 문자열
|
||||
* " "custom_url\": {\n" +
|
||||
* " \"notice_url\" : \" https://test-api.dozn.co.kr/kakao/notice\",\n" +
|
||||
* " \"prepay_url\": \"https://test-api.dozn.co.kr/kakao/prepay\",\n" +
|
||||
* " \"pay_result_url\": \" https://test-api.dozn.co.kr/kakao/pay-result\"\n" +
|
||||
* " }"
|
||||
* </pre>
|
||||
*/
|
||||
private String customUrl;
|
||||
|
||||
/**
|
||||
* 청구서 URL
|
||||
*/
|
||||
private String url;
|
||||
|
||||
/* =====================================
|
||||
* 결제진행 - PayNotice 단계
|
||||
===================================== */
|
||||
|
||||
/**
|
||||
* 청구서 명
|
||||
*/
|
||||
private String title;
|
||||
|
||||
/**
|
||||
* 납부 요청 금액
|
||||
*/
|
||||
private Integer amount;
|
||||
|
||||
/**
|
||||
* 비과세 금액
|
||||
*/
|
||||
private Integer taxFreeAmount;
|
||||
|
||||
/**
|
||||
* 부가세 금액
|
||||
*/
|
||||
private Integer vatAmount;
|
||||
|
||||
/**
|
||||
* 납기 안내타입 : D1
|
||||
*/
|
||||
private String expireType;
|
||||
|
||||
/**
|
||||
* 첫번째 납기일
|
||||
*/
|
||||
private String payExpireDate;
|
||||
|
||||
/**
|
||||
* 두번째 납기일
|
||||
*/
|
||||
private String secondPayExpireDate;
|
||||
|
||||
/**
|
||||
* 계좌송금수단 사용 시 계좌정보
|
||||
*/
|
||||
private String bankAccounts;
|
||||
|
||||
/**
|
||||
* 청구서 상세정보
|
||||
*/
|
||||
private String details;
|
||||
|
||||
/**
|
||||
* 결제일시(YYYYMMDDHH24MISS)
|
||||
*/
|
||||
private String lastPaidAt;
|
||||
|
||||
/**
|
||||
* 결제번호
|
||||
*/
|
||||
private Integer lastPayId;
|
||||
|
||||
|
||||
private String errorCode;
|
||||
private String errorMessage;
|
||||
// @Embedded
|
||||
// @Setter
|
||||
// private FieldError error;
|
||||
|
||||
|
||||
}
|
||||
|
||||
@Schema(name = "BillHistDTO DTO", description = "BillHistDTO DTO")
|
||||
@Data
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
@Builder
|
||||
public static class BillHistDTO {
|
||||
private Long id;
|
||||
|
||||
/**
|
||||
* 청구서 유니크 아이디
|
||||
*/
|
||||
private String billUid;
|
||||
|
||||
/**
|
||||
* 청구서구분 : 카카오페이 청구서 - "bpKko"
|
||||
*/
|
||||
@Builder.Default
|
||||
private String billSe = BillSeCd.bpKko.getCode();
|
||||
|
||||
/**
|
||||
* 요청구분 : 청구서링크생성 - "VD_URL"
|
||||
*/
|
||||
@Builder.Default
|
||||
private String reqSe = BillReqSeCd.VD_URL.getCode();
|
||||
|
||||
/**
|
||||
* 기관코드
|
||||
*/
|
||||
private String orgCd;
|
||||
|
||||
/**
|
||||
* 연계식별키
|
||||
*/
|
||||
private String linkedUuid;
|
||||
|
||||
private String requestData;
|
||||
|
||||
private String responseData;
|
||||
|
||||
private String errorCode;
|
||||
private String errorMessage;
|
||||
}
|
||||
|
||||
@Schema(name = "TmpltMngDTO DTO", description = "TmpltMngDTO DTO")
|
||||
@Data
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
@Builder
|
||||
public static class TmpltMngDTO {
|
||||
private String dtype;
|
||||
|
||||
private String orgCd;
|
||||
|
||||
private String tmpltCd;
|
||||
|
||||
private String title;
|
||||
|
||||
private String message;
|
||||
|
||||
private String useYn;
|
||||
|
||||
private String ntcntalkTmplatCode;
|
||||
|
||||
private String orgNm;
|
||||
|
||||
private String registId;
|
||||
|
||||
private LocalDateTime registDt;
|
||||
|
||||
|
||||
private String updId;
|
||||
|
||||
private LocalDateTime lastUpdtDt;
|
||||
}
|
||||
|
||||
@Schema(name = "SendResult DTO", description = "SendResult DTO")
|
||||
@Data
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
@Builder
|
||||
public static class SendResult {
|
||||
/**
|
||||
* 연계입수아이디 - PK
|
||||
*/
|
||||
private Long lnkInputId;
|
||||
|
||||
/**
|
||||
* 데이터 아이디 - PK
|
||||
*/
|
||||
private String dataId;
|
||||
|
||||
/**
|
||||
* 처리차수 - PK
|
||||
*/
|
||||
private String prcsOdr;
|
||||
|
||||
/**
|
||||
* 발송상태코드
|
||||
*/
|
||||
private String sendSttusCd;
|
||||
|
||||
/**
|
||||
* 발송구분 : NI:알림톡, KP: 인증톡
|
||||
*/
|
||||
private String sendType;
|
||||
|
||||
/**
|
||||
* 발송 일시
|
||||
*/
|
||||
private LocalDateTime runDt;
|
||||
|
||||
/**
|
||||
* 사업자요청일시
|
||||
*/
|
||||
private LocalDateTime bizSendDt;
|
||||
|
||||
/**
|
||||
* 사업자조회일시
|
||||
*/
|
||||
private LocalDateTime bizRecvDt;
|
||||
|
||||
/**
|
||||
* 사업자열람일시
|
||||
*/
|
||||
private LocalDateTime bizReadDt;
|
||||
|
||||
/**
|
||||
* 사업자 오류내용
|
||||
*/
|
||||
private String bizErrMsg;
|
||||
|
||||
/**
|
||||
* 마감일시
|
||||
*/
|
||||
private LocalDateTime expiresDt;
|
||||
|
||||
/**
|
||||
* 처리여부 - 엑스아이티
|
||||
*/
|
||||
private String prcsYn;
|
||||
|
||||
private String regId;
|
||||
|
||||
private LocalDateTime regDt;
|
||||
|
||||
private String ihidnum;
|
||||
}
|
||||
}
|
@ -0,0 +1,76 @@
|
||||
package cokr.xit.ens.modules.nice.model;
|
||||
|
||||
import java.io.*;
|
||||
import java.net.*;
|
||||
import java.nio.charset.*;
|
||||
|
||||
public class TestSocketServer {
|
||||
|
||||
public static void main(String[] args) {
|
||||
|
||||
try (ServerSocket serverSocket = new ServerSocket(10002)) { // 포트 12345에서 서버 소켓 열기
|
||||
System.out.println("서버가 시작되었습니다.");
|
||||
|
||||
while (true) {
|
||||
Socket clientSocket = serverSocket.accept(); // 클라이언트 연결 수락
|
||||
new Thread(() -> handleClient(clientSocket)).start(); // 새로운 스레드에서 클라이언트 처리
|
||||
}
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
private static void handleClient(Socket clientSocket) {
|
||||
final String niceCiRes = "0000002310NICEIF 021031896N503P000Z755400 000000010320240919 466241822620240919160011 1013민자도로 관리지원센터에서 김해찬님께 발송한 미납통행료 고지서가 도착했습니다.\n"
|
||||
+ "\n"
|
||||
+ "민자도로 미납통행료 고지서\n"
|
||||
+ "\n"
|
||||
+ "□ 차량번호 : 19너0914\n"
|
||||
+ "□ 미납발생 노선 : 서울-문산\n"
|
||||
+ "□ 미납발생 기간 : 2021년 04월 12일~2023년 08월 30일\n"
|
||||
+ "□ 납부금액 : 819,500원(42건)\n"
|
||||
+ "□ 납부기한 : 2024년10월01일\n"
|
||||
+ "□ 납부방법 : \n"
|
||||
+ "① 하단의 (납부하기) 클릭\n"
|
||||
+ "② 가상계좌 납부\n"
|
||||
+ "-(가상계좌) : 농협은행 792000-36-986609\n"
|
||||
+ "국민은행 731190-72-253083\n"
|
||||
+ "우리은행 283752-73-918780\n"
|
||||
+ "신한은행 562146-27-470101\n"
|
||||
+ "\n"
|
||||
+ "※ 알림톡 수신 시 종이고지서는 발송되지 않습니다.\n"
|
||||
+ "\n"
|
||||
+ "문의처 : 044-211-3377 0442113377 3 18912111020220김해찬 01084289916 0010108428991620240919160011 ";
|
||||
|
||||
try (BufferedReader in = new BufferedReader(
|
||||
new InputStreamReader(clientSocket.getInputStream(), Charset.forName("EUC-KR")));
|
||||
// new InputStreamReader(clientSocket.getInputStream(), Charset.forName("UTF-8")));
|
||||
BufferedWriter out = new BufferedWriter(
|
||||
new OutputStreamWriter(clientSocket.getOutputStream(), Charset.forName("EUC-KR")))) {
|
||||
|
||||
// 클라이언트로부터 메시지 읽기
|
||||
String message;
|
||||
StringBuffer sb = new StringBuffer();
|
||||
while((message = in.readLine()) != null) {
|
||||
if("EXIT".equals(message)) break;
|
||||
sb.append(message).append("\n");
|
||||
};
|
||||
System.out.println("=============>>>클라이언트로부터 받은 메시지<<<====================================");
|
||||
System.out.println(sb.toString());
|
||||
System.out.println("=============>>>클라이언트로부터 받은 메시지<<<====================================");
|
||||
|
||||
// 응답 메시지 작성 및 전송
|
||||
out.write(niceCiRes);
|
||||
out.newLine();
|
||||
out.flush();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
} finally {
|
||||
try {
|
||||
clientSocket.close();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,74 @@
|
||||
package cokr.xit.ens.modules.nice.presentation;
|
||||
|
||||
import org.springframework.http.*;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import cokr.xit.ens.modules.nice.service.*;
|
||||
import io.swagger.v3.oas.annotations.*;
|
||||
import io.swagger.v3.oas.annotations.tags.*;
|
||||
import lombok.*;
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* description :
|
||||
* packageName : cokr.xit.ens.modules.nice.presentation
|
||||
* fileName : NiceCiController
|
||||
* author : limju
|
||||
* date : 2024 9월 27
|
||||
* ======================================================================
|
||||
* 변경일 변경자 변경 내용
|
||||
* ----------------------------------------------------------------------
|
||||
* 2024 9월 27 limju 최초 생성
|
||||
*
|
||||
* </pre>
|
||||
*/
|
||||
@Tag(name = "NiceCiController", description = "NICE CI 인증톡")
|
||||
@RestController
|
||||
@RequiredArgsConstructor
|
||||
@RequestMapping(value = "/nice/talk")
|
||||
public class NiceCiController {
|
||||
private final NiceCiAcceptService niceCiAcceptService;
|
||||
private final NiceCiSendBulkService niceCiSendService;
|
||||
private final NiceCiStatBulkService niceCiStatBulkService;
|
||||
private final NiceCiCloseService niceCiCloseService;
|
||||
|
||||
/**
|
||||
* NICE CI 전자 고지 접수
|
||||
* @return ResponseEntity
|
||||
*/
|
||||
@Operation(summary = "접수")
|
||||
@PostMapping(value = "/accept/all", produces = MediaType.APPLICATION_JSON_VALUE)
|
||||
public ResponseEntity<?> accept() {
|
||||
return new ResponseEntity<>(niceCiAcceptService.accept(), HttpStatus.OK);
|
||||
}
|
||||
|
||||
/**
|
||||
* NICE CI 전자 고지 전송 요청
|
||||
* @return ResponseEntity
|
||||
*/
|
||||
@Operation(summary = "(대량)전송요청")
|
||||
@PostMapping(value = "/send/bulk/all", produces = MediaType.APPLICATION_JSON_VALUE)
|
||||
public ResponseEntity<?> sendBulk() {
|
||||
return new ResponseEntity<>(niceCiSendService.requestSendBulk(), HttpStatus.OK);
|
||||
}
|
||||
|
||||
/**
|
||||
* NICE CI 전자 고지 전송 상태 조회
|
||||
* @return ResponseEntity
|
||||
*/
|
||||
@Operation(summary = "(대량)상태조회")
|
||||
@PostMapping(value = "/stat/bulk/all", produces = MediaType.APPLICATION_JSON_VALUE)
|
||||
public ResponseEntity<?> findBulkStatus() {
|
||||
return new ResponseEntity<>(niceCiStatBulkService.findBulkStatus(), HttpStatus.OK);
|
||||
}
|
||||
|
||||
/**
|
||||
* NICE CI 전자 고지 마감
|
||||
* @return ResponseEntity
|
||||
*/
|
||||
@Operation(summary = "마감(종료)")
|
||||
@PostMapping(value = "/stat/closed", produces = MediaType.APPLICATION_JSON_VALUE)
|
||||
public ResponseEntity<?> cloased() {
|
||||
return new ResponseEntity<>(niceCiCloseService.close(), HttpStatus.OK);
|
||||
}
|
||||
}
|
@ -0,0 +1,270 @@
|
||||
package cokr.xit.ens.modules.nice.service;
|
||||
|
||||
import java.time.*;
|
||||
import java.util.*;
|
||||
|
||||
import org.apache.commons.lang3.*;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.http.*;
|
||||
import org.springframework.stereotype.*;
|
||||
import org.springframework.transaction.annotation.*;
|
||||
|
||||
import com.google.gson.*;
|
||||
import com.google.gson.reflect.*;
|
||||
|
||||
import cokr.xit.ens.biz.iup.code.*;
|
||||
import cokr.xit.ens.core.aop.*;
|
||||
import cokr.xit.ens.core.exception.*;
|
||||
import cokr.xit.ens.core.exception.code.*;
|
||||
import cokr.xit.ens.core.utils.*;
|
||||
import cokr.xit.ens.modules.common.code.*;
|
||||
import cokr.xit.ens.modules.common.ctgy.intgrnbill.kko.api.*;
|
||||
import cokr.xit.ens.modules.common.ctgy.intgrnbill.kko.service.process.model.*;
|
||||
import cokr.xit.ens.modules.common.ctgy.intgrnbill.support.code.*;
|
||||
import cokr.xit.ens.modules.common.ctgy.intgrnbill.support.model.*;
|
||||
import cokr.xit.ens.modules.common.ctgy.sys.mng.domain.*;
|
||||
import cokr.xit.ens.modules.common.ctgy.sys.mng.service.*;
|
||||
import cokr.xit.ens.modules.nice.mapper.*;
|
||||
import cokr.xit.ens.modules.nice.model.*;
|
||||
import lombok.*;
|
||||
import lombok.extern.slf4j.*;
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* description :
|
||||
* packageName : cokr.xit.ens.modules.nice.service
|
||||
* fileName : NiceCiService
|
||||
* author : limju
|
||||
* date : 2024 9월 27
|
||||
* ======================================================================
|
||||
* 변경일 변경자 변경 내용
|
||||
* ----------------------------------------------------------------------
|
||||
* 2024 9월 27 limju 최초 생성
|
||||
*
|
||||
* </pre>
|
||||
*/
|
||||
@Slf4j
|
||||
@Service
|
||||
@RequiredArgsConstructor
|
||||
public class NiceCiAcceptService {
|
||||
@Value("${contract.kakao.pay.bill.dozn.api.validate.host}")
|
||||
private String BILL_HOST;
|
||||
@Value("${contract.kakao.pay.bill.dozn.api.validate.notice}")
|
||||
private String BILL_NOTICE_URL;
|
||||
@Value("${contract.kakao.pay.bill.dozn.api.validate.prepay}")
|
||||
private String BILL_PREPAY_URL;
|
||||
@Value("${contract.kakao.pay.bill.dozn.api.validate.payresult}")
|
||||
private String BILL_PAYREUSLT_URL;
|
||||
|
||||
private final KeySequenceService keySequenceService;
|
||||
private final NiceCiNewTransactionService billHistoryService;
|
||||
private final INiceCiMapper niceCiMapper;
|
||||
|
||||
private final BillKkoPayApiSpec billKkoPayApi;
|
||||
|
||||
private Gson gson = new GsonBuilder().disableHtmlEscaping().create();
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* -- 1. 대상 조회
|
||||
* SELECT *
|
||||
* FROM tb_input_xit tix
|
||||
* JOIN tb_input_data_xit tidx
|
||||
* ON tix.lnk_input_id=tidx.lnk_input_id
|
||||
* WHERE 1=1
|
||||
* -- AND tix.send_type='NI'
|
||||
* AND tix.prcs_cd='TGRG'
|
||||
*
|
||||
* -- 2. bill 생성
|
||||
* -- 3. 카카오 청구서 생성
|
||||
* -- 4. KkoPayUrlService.callApi() 호출후 tb_input_data_xit 테이블 pay_url 에 청구서 URL UPDATE
|
||||
* KkoPayUrlServiceTest
|
||||
* -- 5. tb_input_xit 테이블 prcs_cd='GRUC' / 실패 시 prcs_cd='TGRF'
|
||||
*
|
||||
* @return EnsResponseVO
|
||||
* </pre>
|
||||
*/
|
||||
@Transactional(propagation = Propagation.REQUIRES_NEW)
|
||||
public EnsResponseVO<?> accept(){
|
||||
final NiceCiDTO.NiceCiParam niceCiParam = NiceCiDTO.NiceCiParam.builder()
|
||||
.sendType(IupSendTypeCd.NI.getCode())
|
||||
.prcsCd(IupPrcsCd.TGRG.getCode())
|
||||
.reqStatusCd("ACCEPT")
|
||||
.build();
|
||||
|
||||
final List<NiceCiDTO.InputXit> list = niceCiMapper.selectInputXits(niceCiParam);
|
||||
if(list.isEmpty()){
|
||||
return EnsResponseVO.errBuilder()
|
||||
.errCode(EnsErrCd.ERR404)
|
||||
.errMsg(EnsErrCd.ERR404.getCodeNm())
|
||||
.build();
|
||||
}
|
||||
|
||||
list.forEach(d -> {
|
||||
niceCiParam.setLnkInputId(d.getLnkInputId());
|
||||
d.setInputDataXits(niceCiMapper.selectInputDataXits(niceCiParam));
|
||||
});
|
||||
|
||||
final String prefixBillUid = PostSeCd.intgrnNoti.getCode() + "-" + IdGenerator.getCurrentTimeSec();
|
||||
for(NiceCiDTO.InputXit xit : list){
|
||||
try {
|
||||
processAccept(xit, prefixBillUid);
|
||||
|
||||
// FIXME: API 호출 에러
|
||||
} catch (EnsException e) {
|
||||
|
||||
if(EnsErrCd.API_COMM_ERROR.equals(e.getErrCd())){
|
||||
xit.setPrcsCd(IupPrcsCd.TGRF.getCode());
|
||||
xit.setErrMsg(e.getMessage());
|
||||
niceCiMapper.updatePrcsCdAndErrorOfInputXit(xit);
|
||||
}
|
||||
|
||||
} catch (Exception e){
|
||||
xit.setPrcsCd(IupPrcsCd.TGRF.getCode());
|
||||
xit.setErrMsg(ObjectUtils.isNotEmpty(e.getCause())? e.getCause().getMessage() : e.getMessage());
|
||||
niceCiMapper.updatePrcsCdAndErrorOfInputXit(xit);
|
||||
}
|
||||
}
|
||||
return EnsResponseVO.okBuilder()
|
||||
//.resultInfo(niceCiMapper.selectAcceptTgts(null))
|
||||
.build();
|
||||
}
|
||||
|
||||
private void processAccept(NiceCiDTO.InputXit xit, String prefixBillUid) throws Exception {
|
||||
final KkoPayUrlRespData kkoPayUrlRespData = buildKkoPayUrlRespData(xit.getPayExpiresDt());
|
||||
final OrgMng orgMng = niceCiMapper.selectKkoBpApiUrlFromEnsOrgMng(xit.getOrgCd())
|
||||
.orElseThrow(() -> new EnsException(EnsErrCd.NO_DATA_FOUND, EnsErrCd.NO_DATA_FOUND.getCodeNm()));
|
||||
|
||||
//List<NiceCiDTO.InputDataXit> inputDataXits = xit.getInputDataXits();
|
||||
for (NiceCiDTO.InputDataXit data : xit.getInputDataXits()) {
|
||||
NiceCiDTO.BillHistDTO billHistDTO = new NiceCiDTO.BillHistDTO();
|
||||
|
||||
//----------------------------------------------------------
|
||||
// pay Url API call & Get Result
|
||||
//----------------------------------------------------------
|
||||
PayApiRespDTO<Map<String, Object>> respDTO = getPayUrl(data, billHistDTO, orgMng, kkoPayUrlRespData);
|
||||
|
||||
//----------------------------------------------------------
|
||||
// API Call 후처리 - response 반영 & 결제 이력 생성
|
||||
//----------------------------------------------------------
|
||||
// FIXME: API 호출 결과 SET - 연계 설정후 확인 필요
|
||||
data.setPayUrl(String.valueOf(respDTO.getData()));
|
||||
niceCiMapper.updatePayUrlOfDataInput(data);
|
||||
|
||||
final String billUid = IdGenerator.getShortUUID(prefixBillUid);
|
||||
// FIXME: API 호출 결과 로그 저장
|
||||
billHistDTO.setBillUid(billUid);
|
||||
billHistDTO.setResponseData(String.valueOf(respDTO.getData()));
|
||||
billHistoryService.updateBillHistory(billHistDTO);
|
||||
|
||||
// FIXME: bill_se_cd, org_cd 설정 및 확인 필요???
|
||||
insertBillRecord(data, xit, billUid);
|
||||
|
||||
// FIXME: biller_notice_key, custom_url, expire_at 설정 및 확인 필요???
|
||||
insertBillKkoRecord(data, kkoPayUrlRespData, billUid);
|
||||
}
|
||||
xit.setPrcsCd(IupPrcsCd.GRUC.getCode());
|
||||
niceCiMapper.updatePrcsCdAndErrorOfInputXit(xit);
|
||||
}
|
||||
|
||||
/**
|
||||
* NICE CI payUrn Call
|
||||
* @param dataXit NiceCiDTO.InputDataXit
|
||||
* @param billHistDTO NiceCiDTO.BillHistDTO
|
||||
* @param orgMng OrgMng
|
||||
* @param kkoPayUrlRespData KkoPayUrlRespData
|
||||
* @return KkoPayUrlRespData
|
||||
*/
|
||||
private PayApiRespDTO<Map<String, Object>> getPayUrl(final NiceCiDTO.InputDataXit dataXit, NiceCiDTO.BillHistDTO billHistDTO, final OrgMng orgMng, final KkoPayUrlRespData kkoPayUrlRespData){
|
||||
// FIXME: 파라메터 확인 필요
|
||||
Map<String, Object> requestParam = createRequestParam(dataXit, kkoPayUrlRespData);
|
||||
|
||||
// FIXME: API 호출 로그 저장
|
||||
saveBillHistory(dataXit, billHistDTO, orgMng, requestParam);
|
||||
|
||||
ResponseEntity<String> resEntity = billKkoPayApi.url(orgMng.getKkoBpBillerCode(), orgMng.getKkoBpAuthorization(),
|
||||
gson.toJson(requestParam));
|
||||
|
||||
// 마스터 상태 실패처리
|
||||
String responseBody = resEntity.getBody();
|
||||
if(resEntity.getStatusCode() != HttpStatus.OK){
|
||||
handleApiError(billHistDTO, resEntity, responseBody);
|
||||
}
|
||||
return parseApiResponse(responseBody, billHistDTO);
|
||||
}
|
||||
|
||||
private KkoPayUrlRespData buildKkoPayUrlRespData(LocalDateTime expiresDt) {
|
||||
return KkoPayUrlRespData.builder()
|
||||
.customUrl(CustomUrl.builder()
|
||||
.noticeUrl(BILL_HOST + BILL_NOTICE_URL)
|
||||
.prepayUrl(BILL_HOST + BILL_PREPAY_URL)
|
||||
.payResultUrl(BILL_HOST + BILL_PAYREUSLT_URL)
|
||||
.build())
|
||||
.expireAt(DateUtil.getStringFromLocalDate(expiresDt, "yyyyMMddHHmmss"))
|
||||
.build();
|
||||
}
|
||||
|
||||
private void insertBillRecord(NiceCiDTO.InputDataXit data, NiceCiDTO.InputXit xit, String billUid) {
|
||||
niceCiMapper.insertBill(
|
||||
NiceCiDTO.BillDTO.builder()
|
||||
.billId(keySequenceService.getKeySequence("Bill_id"))
|
||||
.billUid(billUid)
|
||||
.billerUserKey(data.getDataId())
|
||||
.billSeCd(BillSeCd.privt.getCode())
|
||||
.orgCd(xit.getOrgCd())
|
||||
.build()
|
||||
);
|
||||
}
|
||||
|
||||
private void insertBillKkoRecord(NiceCiDTO.InputDataXit data, KkoPayUrlRespData kkoPayUrlRespData, String billUid) {
|
||||
niceCiMapper.mergeBillKko(
|
||||
NiceCiDTO.BillKkoDTO.builder()
|
||||
.billId(keySequenceService.getKeySequence("BillKko_id"))
|
||||
.billerUserKey(data.getDataId())
|
||||
.billerNoticeKey(billUid)
|
||||
.customUrl(gson.toJson(kkoPayUrlRespData.getCustomUrl()))
|
||||
.expireAt(kkoPayUrlRespData.getExpireAt())
|
||||
.billUid(billUid)
|
||||
.build()
|
||||
);
|
||||
}
|
||||
|
||||
private Map<String, Object> createRequestParam(NiceCiDTO.InputDataXit dataXit, KkoPayUrlRespData kkoPayUrlRespData) {
|
||||
Map<String, Object> map = new HashMap<>();
|
||||
map.put("biller_user_key", dataXit.getDataId());
|
||||
map.put("expire_at", kkoPayUrlRespData.getExpireAt());
|
||||
map.put("custom_url", gson.toJsonTree(kkoPayUrlRespData.getCustomUrl()));
|
||||
Map<String, Object> param = new HashMap<>();
|
||||
param.put("data", map);
|
||||
return param;
|
||||
}
|
||||
|
||||
private void saveBillHistory(final NiceCiDTO.InputDataXit dataXit, NiceCiDTO.BillHistDTO billHistDTO, final OrgMng orgMng, Map<String, Object> requestParam) {
|
||||
billHistDTO = NiceCiDTO.BillHistDTO.builder()
|
||||
.linkedUuid(dataXit.getDataId())
|
||||
.orgCd(orgMng.getOrgCd())
|
||||
.requestData(gson.toJson(requestParam))
|
||||
.build();
|
||||
billHistoryService.insertBillHistory(billHistDTO);
|
||||
}
|
||||
|
||||
private void handleApiError(NiceCiDTO.BillHistDTO billHistDTO, ResponseEntity<String> resEntity, String responseBody) {
|
||||
String errorMessage = "[" + BillLogSeCd.VD + "] " + EnsErrCd.API_COMM_ERROR.getCodeNm() + " " + resEntity.getStatusCode().toString();
|
||||
billHistDTO.setErrorCode(EnsErrCd.API_COMM_ERROR.getCode());
|
||||
billHistDTO.setErrorMessage(errorMessage);
|
||||
billHistoryService.updateBillHistory(billHistDTO);
|
||||
throw new EnsException(EnsErrCd.API_COMM_ERROR, errorMessage, responseBody);
|
||||
}
|
||||
|
||||
private PayApiRespDTO<Map<String, Object>> parseApiResponse(String responseBody, NiceCiDTO.BillHistDTO billHistDTO) {
|
||||
try {
|
||||
return gson.fromJson(responseBody, new TypeToken<PayApiRespDTO<Map<String, Object>>>() {}.getType());
|
||||
} catch (Exception ex) {
|
||||
String errorMessage = "[" + BillLogSeCd.VD + "] " + EnsErrCd.INVALID_RESPONSE.getCodeNm();
|
||||
billHistDTO.setErrorCode(EnsErrCd.INVALID_RESPONSE.getCode());
|
||||
billHistDTO.setErrorMessage(errorMessage);
|
||||
billHistoryService.updateBillHistory(billHistDTO);
|
||||
throw new EnsException(EnsErrCd.INVALID_RESPONSE, errorMessage, ex);
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,80 @@
|
||||
package cokr.xit.ens.modules.nice.service;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
import org.apache.commons.lang3.*;
|
||||
import org.springframework.stereotype.*;
|
||||
|
||||
import cokr.xit.ens.biz.iup.code.*;
|
||||
import cokr.xit.ens.core.aop.*;
|
||||
import cokr.xit.ens.core.exception.code.*;
|
||||
import cokr.xit.ens.modules.nice.mapper.*;
|
||||
import cokr.xit.ens.modules.nice.model.*;
|
||||
import lombok.*;
|
||||
import lombok.extern.slf4j.*;
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* description :
|
||||
* packageName : cokr.xit.ens.modules.nice.service
|
||||
* fileName : NiceCiStatBulkService
|
||||
* author : limju
|
||||
* date : 2024 9월 27
|
||||
* ======================================================================
|
||||
* 변경일 변경자 변경 내용
|
||||
* ----------------------------------------------------------------------
|
||||
* 2024 9월 27 limju 최초 생성
|
||||
*
|
||||
* </pre>
|
||||
*/
|
||||
@Slf4j
|
||||
@Service
|
||||
@RequiredArgsConstructor
|
||||
public class NiceCiCloseService {
|
||||
private final INiceCiMapper niceCiMapper;
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* -- 1. 대상 조회
|
||||
* SELECT *
|
||||
* FROM tb_input_xit tix
|
||||
* WHERE tix.send_type='NI'
|
||||
* AND tix.prcs_cd='IPCP';
|
||||
* AND tix.expires_dt < SYSDATE - 1;
|
||||
*
|
||||
* -- tb_input_xit 테이블 prcs_cd='CLOS' / 실패(update error) 시 prcs_cd='FAIL'
|
||||
* @return EnsResponseVO
|
||||
* </pre>
|
||||
*/
|
||||
public EnsResponseVO<?> close() {
|
||||
final NiceCiDTO.NiceCiParam niceCiParam = NiceCiDTO.NiceCiParam.builder()
|
||||
.sendType(IupSendTypeCd.NI.getCode())
|
||||
.prcsCd(IupPrcsCd.IPCP.getCode())
|
||||
.reqStatusCd("CLOS")
|
||||
.build();
|
||||
|
||||
final List<NiceCiDTO.InputXit> list = niceCiMapper.selectInputXits(niceCiParam);
|
||||
if(list.isEmpty()){
|
||||
return EnsResponseVO.errBuilder()
|
||||
.errCode(EnsErrCd.ERR404)
|
||||
.errMsg(EnsErrCd.ERR404.getCodeNm())
|
||||
.build();
|
||||
}
|
||||
|
||||
for(NiceCiDTO.InputXit xit : list) {
|
||||
|
||||
try {
|
||||
xit.setPrcsCd("CLOS");
|
||||
niceCiMapper.updatePrcsCdAndErrorOfInputXit(xit);
|
||||
} catch (Exception e) {
|
||||
xit.setPrcsCd("FAIL");
|
||||
xit.setErrMsg(ObjectUtils.isNotEmpty(e.getCause()) ? e.getCause().getMessage() : e.getMessage());
|
||||
niceCiMapper.updatePrcsCdAndErrorOfInputXit(xit);
|
||||
}
|
||||
}
|
||||
|
||||
return EnsResponseVO.okBuilder()
|
||||
//.resultInfo(niceCiMapper.selectAcceptTgts(null))
|
||||
.build();
|
||||
}
|
||||
}
|
@ -0,0 +1,61 @@
|
||||
package cokr.xit.ens.modules.nice.service;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
import org.springframework.stereotype.*;
|
||||
import org.springframework.transaction.annotation.*;
|
||||
|
||||
import cokr.xit.ens.modules.nice.mapper.*;
|
||||
import cokr.xit.ens.modules.nice.model.*;
|
||||
import lombok.*;
|
||||
import lombok.extern.slf4j.*;
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* description : NICE CI 에서 트랜잭션 분리 처리가 필요한 서비스
|
||||
* packageName : cokr.xit.ens.modules.nice.service
|
||||
* fileName : NiceCiNewTransactionService
|
||||
* author : limju
|
||||
* date : 2024 9월 27
|
||||
* ======================================================================
|
||||
* 변경일 변경자 변경 내용
|
||||
* ----------------------------------------------------------------------
|
||||
* 2024 9월 27 limju 최초 생성
|
||||
*
|
||||
* </pre>
|
||||
*/
|
||||
@Slf4j
|
||||
@Service
|
||||
@RequiredArgsConstructor
|
||||
public class NiceCiNewTransactionService {
|
||||
private final INiceCiNewTransactionMapper mapper;
|
||||
|
||||
// accept /////////////////////////////////////////////////////
|
||||
@Transactional(propagation = Propagation.REQUIRES_NEW)
|
||||
public void insertBillHistory(final NiceCiDTO.BillHistDTO histDTO){
|
||||
mapper.insertBillHistory(histDTO);
|
||||
}
|
||||
|
||||
@Transactional(propagation = Propagation.REQUIRES_NEW)
|
||||
public void updateBillHistory(final NiceCiDTO.BillHistDTO histDTO){
|
||||
mapper.updateBillHistory(histDTO);
|
||||
}
|
||||
// accept /////////////////////////////////////////////////////
|
||||
|
||||
// status /////////////////////////////////////////////////////
|
||||
@Transactional(readOnly = true)
|
||||
public Optional<NiceCiDTO.SendResult> findDataIdFromSendResult(final NiceCiApiResult result){
|
||||
return mapper.selectDataIdFromSendResult(result);
|
||||
}
|
||||
|
||||
@Transactional(propagation = Propagation.REQUIRES_NEW)
|
||||
public void insertNiceSmsSndngInquireResponseRepeats(final List<NiceCiApiResult> resultList){
|
||||
mapper.insertNiceSmsSndngInquireResponseRepeats(resultList);
|
||||
}
|
||||
|
||||
@Transactional(propagation = Propagation.REQUIRES_NEW)
|
||||
public void insertSendResults(final List<NiceCiDTO.SendResult> sendResults){
|
||||
mapper.insertSendResults(sendResults);
|
||||
}
|
||||
// status /////////////////////////////////////////////////////
|
||||
}
|
@ -0,0 +1,320 @@
|
||||
package cokr.xit.ens.modules.nice.service;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.stream.*;
|
||||
|
||||
import javax.validation.*;
|
||||
|
||||
import org.apache.commons.lang3.*;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.stereotype.*;
|
||||
|
||||
import com.google.gson.*;
|
||||
|
||||
import cokr.xit.ens.biz.iup.code.*;
|
||||
import cokr.xit.ens.core.aop.*;
|
||||
import cokr.xit.ens.core.exception.*;
|
||||
import cokr.xit.ens.core.exception.code.*;
|
||||
import cokr.xit.ens.core.utils.*;
|
||||
import cokr.xit.ens.modules.nice.cmm.*;
|
||||
import cokr.xit.ens.modules.nice.mapper.*;
|
||||
import cokr.xit.ens.modules.nice.model.*;
|
||||
import cokr.xit.ens.modules.nice.service.support.*;
|
||||
import lombok.*;
|
||||
import lombok.extern.slf4j.*;
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* description :
|
||||
* packageName : cokr.xit.ens.modules.nice.service
|
||||
* fileName : NiceCiSendBulkService
|
||||
* author : limju
|
||||
* date : 2024 9월 27
|
||||
* ======================================================================
|
||||
* 변경일 변경자 변경 내용
|
||||
* ----------------------------------------------------------------------
|
||||
* 2024 9월 27 limju 최초 생성
|
||||
*
|
||||
* </pre>
|
||||
*/
|
||||
@Slf4j
|
||||
@Service
|
||||
@RequiredArgsConstructor
|
||||
public class NiceCiSendBulkService {
|
||||
@Value("${contract.niceCi.orgId}")
|
||||
private String ORG_ID;
|
||||
|
||||
private final NiceCiApiService niceCiApiService;
|
||||
private final INiceCiMapper niceCiMapper;
|
||||
|
||||
private static final Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
|
||||
private Gson gson = new GsonBuilder().disableHtmlEscaping().create();
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* -- 1. 대상 조회
|
||||
* SELECT *
|
||||
* FROM tb_input_xit tix
|
||||
* WHERE tix.send_type='NI'
|
||||
* AND tix.prcs_cd='GRUC'
|
||||
* AND tix.RUN_DT < SYSDATE;
|
||||
*
|
||||
* -- 2. 나이스 연계
|
||||
*
|
||||
* -- 3. tb_input_xit 테이블 prcs_cd='IPCP' / 실패 시 prcs_cd='FAIL'
|
||||
* @return EnsResponseVO
|
||||
* </pre>>
|
||||
*/
|
||||
public EnsResponseVO<?> requestSendBulk() {
|
||||
final NiceCiDTO.NiceCiParam niceCiParam = NiceCiDTO.NiceCiParam.builder()
|
||||
.sendType(IupSendTypeCd.NI.getCode())
|
||||
.prcsCd(IupPrcsCd.GRUC.getCode())
|
||||
.reqStatusCd("SEND")
|
||||
.build();
|
||||
|
||||
final List<NiceCiDTO.InputXit> list = niceCiMapper.selectInputXits(niceCiParam);
|
||||
if(list.isEmpty()){
|
||||
return EnsResponseVO.errBuilder()
|
||||
.errCode(EnsErrCd.ERR404)
|
||||
.errMsg(EnsErrCd.ERR404.getCodeNm())
|
||||
.build();
|
||||
}
|
||||
|
||||
list.forEach(d -> {
|
||||
niceCiParam.setLnkInputId(d.getLnkInputId());
|
||||
d.setInputDataXits(niceCiMapper.selectInputDataXits(niceCiParam));
|
||||
});
|
||||
|
||||
for(NiceCiDTO.InputXit xit : list) {
|
||||
|
||||
try {
|
||||
processSendBulk(xit);
|
||||
|
||||
// FIXME: API 호출 에러
|
||||
} catch (EnsException e) {
|
||||
// FIXME : API 통신에러 인경우 skip - 재시도 되어야
|
||||
handleEnsException(xit, e);
|
||||
|
||||
} catch (Exception e){
|
||||
xit.setPrcsCd(IupPrcsCd.FAIL.getCode());
|
||||
xit.setErrMsg(ObjectUtils.isNotEmpty(e.getCause())? e.getCause().getMessage() : e.getMessage());
|
||||
niceCiMapper.updatePrcsCdAndErrorOfInputXit(xit);
|
||||
}
|
||||
}
|
||||
return EnsResponseVO.okBuilder()
|
||||
//.resultInfo(niceCiMapper.selectAcceptTgts(null))
|
||||
.build();
|
||||
}
|
||||
|
||||
private void processSendBulk(NiceCiDTO.InputXit xit) throws EnsException {
|
||||
final NiceCiDTO.TmpltMngDTO tmpltMngDTO = niceCiMapper.selectTmpltMsg(xit.getJobCd())
|
||||
.orElseThrow(() -> new EnsException(EnsErrCd.NO_DATA_FOUND, EnsErrCd.NO_DATA_FOUND.getCodeNm()));
|
||||
|
||||
for (NiceCiDTO.InputDataXit data : xit.getInputDataXits()) {
|
||||
|
||||
// 기관전문관리번호, TB_NICE_SMS_SNDNG_REQUEST - NICE_SMS_SNDNG_REQUST_ID
|
||||
final String niceSmsReqId = niceCiMapper.selectNiceCiRequestId().orElseThrow(
|
||||
() -> new EnsException(EnsErrCd.MAKE521, EnsErrCd.MAKE521.getCodeNm())
|
||||
);
|
||||
|
||||
NiceCiApiSendDTO.Request ciRequest = createCiRequest(tmpltMngDTO, data, niceSmsReqId);
|
||||
String ciTxt = ciRequest.ofString();
|
||||
ciRequest.setTrnscId(String.valueOf(NiceCiUtils.lengthKr(ciTxt)));
|
||||
validate(ciRequest);
|
||||
niceCiMapper.insertNiceSmsSndngRequest(ciRequest);
|
||||
//----------------------------------------------------------
|
||||
// API Call 전처리 END - request 저장
|
||||
//----------------------------------------------------------
|
||||
|
||||
//----------------------------------------------------------
|
||||
// Status API call & Get Result START
|
||||
//----------------------------------------------------------
|
||||
// FIXME : 연계 이후 확인 필요
|
||||
EnsResponseVO<?> responseVO = niceCiApiService.requestSendBulk(ciRequest.getTrnscId(), ciTxt);
|
||||
if (!EnsErrCd.OK.equals(responseVO.getErrCode()))
|
||||
throw new EnsException(responseVO.getErrCode(), responseVO.getErrMsg());
|
||||
NiceCiApiSendDTO.Response resDTO = (NiceCiApiSendDTO.Response)responseVO.getResultInfo();
|
||||
//----------------------------------------------------------
|
||||
// Status API call & Get Result END
|
||||
//----------------------------------------------------------
|
||||
|
||||
//----------------------------------------------------------
|
||||
// API Call 후처리 START - response 저장
|
||||
//----------------------------------------------------------
|
||||
resDTO.setNiceSmsSndngRequstId(niceSmsReqId);
|
||||
niceCiMapper.insertNiceSmsSndngResponse(resDTO);
|
||||
//----------------------------------------------------------
|
||||
// API Call 후처리 START - response 저장
|
||||
//----------------------------------------------------------
|
||||
|
||||
log.info(responseVO.toString());
|
||||
}
|
||||
xit.setPrcsCd(IupPrcsCd.IPCP.getCode());
|
||||
niceCiMapper.updatePrcsCdAndErrorOfInputXit(xit);
|
||||
}
|
||||
|
||||
|
||||
private NiceCiApiSendDTO.Request createCiRequest(NiceCiDTO.TmpltMngDTO tmpltMngDTO, NiceCiDTO.InputDataXit data, String niceSmsReqId) {
|
||||
NiceCiApiSendDTO.Request ciRequest = new NiceCiApiSendDTO.Request();
|
||||
NiceCiApiCommon nCommon = new NiceCiApiCommon();
|
||||
NiceCiApiSendDTO.QueryRequest queryRequest = new NiceCiApiSendDTO.QueryRequest();
|
||||
NiceCiApiSendDTO.ButtonRequest btnRequest = new NiceCiApiSendDTO.ButtonRequest();
|
||||
|
||||
// 공통부 set
|
||||
setNiceCiApiRequestCommon(nCommon, niceSmsReqId);
|
||||
// 개별부 set
|
||||
setNiceCiApiPrivateReq(ciRequest, tmpltMngDTO, data);
|
||||
// 조회요청반복부 set
|
||||
setQueryRequest(queryRequest, data);
|
||||
// 버튼요청반복부 set
|
||||
setBtnRequest(btnRequest, data);
|
||||
|
||||
ciRequest.setNiceCommon(nCommon);
|
||||
ciRequest.getQueryRequests().add(queryRequest);
|
||||
ciRequest.getButtonRequests().add(btnRequest);
|
||||
|
||||
//----------------------------------------------------------
|
||||
// API Call 전처리 START - request 저장
|
||||
//----------------------------------------------------------
|
||||
ciRequest.setNiceSmsSndngRequstId(niceSmsReqId);
|
||||
ciRequest.setDataId(data.getDataId());
|
||||
|
||||
return ciRequest;
|
||||
}
|
||||
|
||||
/**
|
||||
* 공통부 set
|
||||
* @param nCommon NiceCiApiCommon
|
||||
* @param niceSmsReqId 기관전문관리번호 - 업무 PK
|
||||
*/
|
||||
private void setNiceCiApiRequestCommon(final NiceCiApiCommon nCommon, final String niceSmsReqId) {
|
||||
////////////////////////////////////////////////////////////
|
||||
// 공통부 START
|
||||
////////////////////////////////////////////////////////////
|
||||
//---------------------------------------------------------
|
||||
// 공통부 : default start
|
||||
//---------------------------------------------------------
|
||||
// nCommon.setSpcltyGroupcode("NICEIF "); // 전문그룹코드
|
||||
// nCommon.setDelngAsortcode("0200"); // 거래종별코드
|
||||
// nCommon.setDelngSecode("31896"); // 거래구분코드
|
||||
// nCommon.setTrmnlSe("B"); // 송수신플래그
|
||||
// nCommon.setTrmnlSe("503"); // 단말기구분
|
||||
// nCommon.setRspnsCode(" "); // 응답코드
|
||||
// nCommon.setNiceSpcltyManageno(""); // NICE 전문관리번호
|
||||
// nCommon.setNiceSpcltyTrnsmistime(""); // NICE 전문 전송시간
|
||||
// ciRequest.setInqireAgreResn("1"); // 조회동의사유
|
||||
//----------------------------------------------------------
|
||||
// 공통부 : default end
|
||||
//----------------------------------------------------------
|
||||
|
||||
nCommon.setPartcptInsttId(ORG_ID); // 참가기관ID - property 에서
|
||||
nCommon.setInsttSpcltyManageno(niceSmsReqId); // 기관전문관리번호 - LPAD(SEQ_NICE_SMS_SNDNG_REQUST_ID, 10, '0')
|
||||
nCommon.setInsttSpcltyTrnsmistime(DateUtil.getTodayAndNowTime("yyyyMMdd")); // 기관전문전송시간
|
||||
nCommon.setBlnk(StringUtils.rightPad(StringUtils.EMPTY, 16, StringUtils.SPACE)); // 공란 16자리
|
||||
////////////////////////////////////////////////////////////
|
||||
// 공통부 END
|
||||
////////////////////////////////////////////////////////////
|
||||
}
|
||||
|
||||
/**
|
||||
* 개별요청부 set
|
||||
* @param ciRequest NiceCiApiSendDTO.Request
|
||||
* @param tmpltMngDTO NiceCiDTO.TmpltMngDTO
|
||||
* @param data NiceCiDTO.InputDataXit data
|
||||
*/
|
||||
private void setNiceCiApiPrivateReq(final NiceCiApiSendDTO.Request ciRequest, NiceCiDTO.TmpltMngDTO tmpltMngDTO, final NiceCiDTO.InputDataXit data){
|
||||
////////////////////////////////////////////////////////////
|
||||
// 개별요청부 START
|
||||
////////////////////////////////////////////////////////////
|
||||
//----------------------------------------------------------
|
||||
// 개별요청부 : default start
|
||||
//----------------------------------------------------------
|
||||
// ciRequest.setInqireResn("17"); // 조회사유
|
||||
// ciRequest.setSmsSndngRequstSe("3"); // SMS발송요청구분코드
|
||||
// ciRequest.setDsptchNo("0442113377"); // 발신번호
|
||||
// ciRequest.setCttpcInqireSe("3"); // 연락처 조회 구분
|
||||
// ciRequest.setNtcntalkSndngRequstSe("1"); // 알림톡발송요청구분코드
|
||||
// ciRequest.setBttonRequstCo(1); // 버튼요청건수
|
||||
// ciRequest.setIndvdlzRequstBlnk(""); // 공란 - 880자리
|
||||
//---------------------------------------------------------
|
||||
// 개별요청부 : default end
|
||||
//---------------------------------------------------------
|
||||
|
||||
ciRequest.setInqireRequstCo(1); // 조회요청건수
|
||||
Map<String, String> map = gson.fromJson(data.getMsgData(), Map.class);
|
||||
String sndMsg = tmpltMngDTO.getMessage();
|
||||
for(Map.Entry<String, String> entry : map.entrySet()){
|
||||
sndMsg = sndMsg.replace(entry.getKey(), entry.getValue());
|
||||
}
|
||||
sndMsg = sndMsg.replace("~~@@!!ORG_NM!!@@~~", tmpltMngDTO.getOrgNm());
|
||||
sndMsg = sndMsg.replace("~~@@!!TARGET_NAME!!@@~~", data.getName());
|
||||
ciRequest.setSndngMssage(sndMsg); // 발송메세지
|
||||
ciRequest.setNtcntalkTmplatCode(tmpltMngDTO.getNtcntalkTmplatCode()); // 알림톡 템플릿 코드
|
||||
////////////////////////////////////////////////////////////
|
||||
// 개별요청부 END
|
||||
////////////////////////////////////////////////////////////
|
||||
}
|
||||
|
||||
/**
|
||||
* 조회요청 반복부 set
|
||||
* @param queryRequest NiceCiApiSendDTO.QueryRequest
|
||||
* @param data NiceCiDTO.InputDataXit
|
||||
*/
|
||||
private void setQueryRequest(final NiceCiApiSendDTO.QueryRequest queryRequest, final NiceCiDTO.InputDataXit data) {
|
||||
//---------------------------------------------------------
|
||||
// 조회요청 반복부 : default START
|
||||
//---------------------------------------------------------
|
||||
// queryRequest.setIndvdlBsnmCprSe("1"); // 개인사업자법인구분 : "1"
|
||||
// queryRequest.setInqireRequstBlnk(""); // 공란 - 36 자리
|
||||
// //---------------------------------------------------------
|
||||
// 조회요청 반복부 : default END
|
||||
//---------------------------------------------------------
|
||||
queryRequest.setIhidnum(data.getSid()); // 주민번호
|
||||
}
|
||||
|
||||
/**
|
||||
* 버튼요청 반복부 set
|
||||
* @param btnRequest NiceCiApiSendDTO.ButtonRequest
|
||||
* @param data NiceCiDTO.InputDataXit
|
||||
*/
|
||||
private void setBtnRequest(final NiceCiApiSendDTO.ButtonRequest btnRequest, final NiceCiDTO.InputDataXit data) {
|
||||
//---------------------------------------------------------
|
||||
// 버튼요청 반복부 : default START
|
||||
//---------------------------------------------------------
|
||||
// btnRequest.setBttonTy("WL"); // 버튼타입
|
||||
// btnRequest.setBttonNm("납부하기"); // 버튼이름
|
||||
// btnRequest.setBttonUrlWebLink_2("");
|
||||
// btnRequest.setBttonRequstBlnk(""); // 공란 : 942 자리
|
||||
//---------------------------------------------------------
|
||||
// 버튼요청 반복부 : default END
|
||||
//---------------------------------------------------------
|
||||
btnRequest.setBttonUrlWebLink_1(data.getPayUrl()); // 공란 - 36 자리
|
||||
}
|
||||
|
||||
private void handleEnsException(NiceCiDTO.InputXit xit, EnsException e) {
|
||||
if (EnsErrCd.API_COMM_ERROR.equals(e.getErrCd())) {
|
||||
xit.setPrcsCd(IupPrcsCd.FAIL.getCode());
|
||||
xit.setErrMsg(e.getMessage());
|
||||
niceCiMapper.updatePrcsCdAndErrorOfInputXit(xit);
|
||||
return;
|
||||
}
|
||||
xit.setErrMsg(e.getMessage());
|
||||
xit.setPrcsCd(IupPrcsCd.FAIL.getCode());
|
||||
niceCiMapper.updatePrcsCdAndErrorOfInputXit(xit);
|
||||
}
|
||||
|
||||
private void validate(final NiceCiApiSendDTO.Request ciRequest) {
|
||||
List<String> errors = new ArrayList<>();
|
||||
final Set<ConstraintViolation<NiceCiApiSendDTO.Request>> list = validator.validate(ciRequest);
|
||||
if (!list.isEmpty()) {
|
||||
errors.addAll(list.stream()
|
||||
.map(row -> String.format("%s=%s", row.getPropertyPath(), row.getMessageTemplate()))
|
||||
.collect(Collectors.toList())
|
||||
);
|
||||
}
|
||||
|
||||
if(!errors.isEmpty()){
|
||||
throw new EnsException(EnsErrCd.INVALID_DATA, errors.toString());
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,295 @@
|
||||
package cokr.xit.ens.modules.nice.service;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.stream.*;
|
||||
|
||||
import javax.validation.*;
|
||||
|
||||
import org.apache.commons.lang3.*;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.stereotype.*;
|
||||
|
||||
import cokr.xit.ens.biz.iup.code.*;
|
||||
import cokr.xit.ens.core.aop.*;
|
||||
import cokr.xit.ens.core.exception.*;
|
||||
import cokr.xit.ens.core.exception.code.*;
|
||||
import cokr.xit.ens.core.utils.*;
|
||||
import cokr.xit.ens.modules.nice.cmm.*;
|
||||
import cokr.xit.ens.modules.nice.mapper.*;
|
||||
import cokr.xit.ens.modules.nice.model.*;
|
||||
import cokr.xit.ens.modules.nice.service.support.*;
|
||||
import lombok.*;
|
||||
import lombok.extern.slf4j.*;
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* description :
|
||||
* packageName : cokr.xit.ens.modules.nice.service
|
||||
* fileName : NiceCiStatBulkService
|
||||
* author : limju
|
||||
* date : 2024 9월 27
|
||||
* ======================================================================
|
||||
* 변경일 변경자 변경 내용
|
||||
* ----------------------------------------------------------------------
|
||||
* 2024 9월 27 limju 최초 생성
|
||||
*
|
||||
* </pre>
|
||||
*/
|
||||
@Slf4j
|
||||
@Service
|
||||
@RequiredArgsConstructor
|
||||
public class NiceCiStatBulkService {
|
||||
@Value("${contract.niceCi.orgId}")
|
||||
private String ORG_ID;
|
||||
|
||||
private final NiceCiApiService niceCiApiService;
|
||||
private final NiceCiNewTransactionService niceCiNewTransactionService;
|
||||
private final INiceCiMapper niceCiMapper;
|
||||
|
||||
private static final Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
|
||||
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* -- 1. 대상 조회
|
||||
* SELECT *
|
||||
* FROM tb_input_xit tix
|
||||
* WHERE tix.send_type='NI'
|
||||
* AND tix.prcs_cd='IPCP';
|
||||
*
|
||||
* -- 2.결과 INSERT OR UPDATE tb_send_result
|
||||
* SELECT * FROM tb_send_result;
|
||||
* send_sttus_cd 발송 처리 코드
|
||||
* TALK_SEND 카카오 알림톡 발송 성공
|
||||
* SMS_SEND KT 문자 발송 성공
|
||||
* FAIL 발송 실패
|
||||
* @return EnsResponseVO
|
||||
* </pre>
|
||||
*/
|
||||
public EnsResponseVO<?> findBulkStatus() {
|
||||
try {
|
||||
// 기관전문관리번호, TB_NICE_SMS_SNDNG_REQUEST - NICE_SMS_SNDNG_REQUST_ID
|
||||
final String niceSmsInqId = niceCiMapper.selectNiceCiInqireId().orElseThrow(
|
||||
() -> new EnsException(EnsErrCd.MAKE521, EnsErrCd.MAKE521.getCodeNm())
|
||||
);
|
||||
|
||||
// 검색기간 (from ~ to) 조회 및 SET
|
||||
NiceCiApiStatusDTO.Request ciRequest = niceCiMapper.selectFromAndToOfStatusParam(
|
||||
NiceCiDTO.NiceCiParam.builder()
|
||||
.sendType(IupSendTypeCd.NI.getCode())
|
||||
.prcsCd(IupPrcsCd.IPCP.getCode())
|
||||
.reqStatusCd("STATUS")
|
||||
.build()
|
||||
)
|
||||
.orElseThrow(() -> new EnsException(EnsErrCd.MAKE521, "검색기간 설정 조회 실패"));
|
||||
NiceCiApiCommon nCommon = new NiceCiApiCommon();
|
||||
|
||||
// 공통부 set
|
||||
setNiceCiApiRequestCommon(nCommon, niceSmsInqId);
|
||||
ciRequest.setNiceCommon(nCommon);
|
||||
|
||||
// 개별요청부 set
|
||||
setNiceCiApiPrivateReq(ciRequest);
|
||||
|
||||
int totCo = 0;
|
||||
int repeat = 0;
|
||||
do {
|
||||
ciRequest.setAccmltRecptnCo(Integer.toString(repeat));
|
||||
NiceCiApiStatusDTO.Response resDTO = repeatStatusBulk(
|
||||
ciRequest
|
||||
);
|
||||
if (totCo == 0)
|
||||
totCo = Integer.parseInt(resDTO.getTotCo());
|
||||
repeat += 100;
|
||||
} while (totCo > 100 && totCo > repeat);
|
||||
|
||||
} catch (EnsException e) {
|
||||
// FIXME : API 통신에러 인경우 skip - 재시도 되어야
|
||||
log.error("NICE CI Status 조회 ERROR::{}[{}]", e.getMessage(), e.getErrCd());
|
||||
return EnsResponseVO.errBuilder()
|
||||
.errCode(EnsErrCd.ERR999)
|
||||
.errMsg(e.getMessage())
|
||||
.build();
|
||||
|
||||
} catch (Exception e) {
|
||||
log.error("NICE CI Status 조회 ERROR::{}", ObjectUtils.isNotEmpty(e.getCause())? e.getCause().getMessage() : e.getMessage());
|
||||
return EnsResponseVO.errBuilder()
|
||||
.errCode(EnsErrCd.ERR999)
|
||||
.errMsg(ObjectUtils.isNotEmpty(e.getCause())? e.getCause().getMessage() : e.getMessage())
|
||||
.build();
|
||||
}
|
||||
return EnsResponseVO.okBuilder()
|
||||
//.resultInfo(niceCiMapper.selectAcceptTgts(null))
|
||||
.build();
|
||||
}
|
||||
|
||||
/**
|
||||
* 공통부 set
|
||||
* @param nCommon NiceCiApiCommon
|
||||
* @param niceSmsReqId 기관전문관리번호 - 업무 PK
|
||||
*/
|
||||
private void setNiceCiApiRequestCommon(final NiceCiApiCommon nCommon, final String niceSmsReqId) {
|
||||
////////////////////////////////////////////////////////////
|
||||
// 공통부 START
|
||||
////////////////////////////////////////////////////////////
|
||||
//---------------------------------------------------------
|
||||
// 공통부 : default start
|
||||
//---------------------------------------------------------
|
||||
// nCommon.setGrpCode("NICEIF "); // 전문그룹코드
|
||||
// nCommon.setTrType("0200"); // 거래종별코드
|
||||
// nCommon.setSndAndRcvFlag("B"); // 송수신플래그
|
||||
// nCommon.setDeviceClassification("503"); // 단말기구분
|
||||
// nCommon.setRsltCode(" "); // 응답코드
|
||||
// nCommon.setNiceMngNo(""); // NICE 전문관리번호
|
||||
// nCommon.setNiceSndDt(""); // NICE 전문 전송시간
|
||||
// ciRequest.setCommonEmptyField(""); // 공란 - 16자리
|
||||
// ciRequest.setQueryConsentReason("1"); // 조회동의사유
|
||||
//----------------------------------------------------------
|
||||
// 공통부 : default end
|
||||
//----------------------------------------------------------
|
||||
nCommon.setDelngSecode("31893"); // 거래구분코드
|
||||
nCommon.setPartcptInsttId(ORG_ID); // 참가기관ID - property 에서
|
||||
nCommon.setInsttSpcltyManageno(
|
||||
niceSmsReqId); // 기관전문관리번호 - LPAD(SEQ_NICE_SMS_SNDNG_REQUST_ID, 10, '0')
|
||||
nCommon.setInsttSpcltyTrnsmistime(DateUtil.getTodayAndNowTime("yyyyMMddHHmmss")); // 기관전문전송시간
|
||||
nCommon.setBlnk(StringUtils.rightPad(StringUtils.EMPTY, 17, StringUtils.SPACE)); // 공란 16자리
|
||||
////////////////////////////////////////////////////////////
|
||||
// 공통부 END
|
||||
////////////////////////////////////////////////////////////
|
||||
}
|
||||
|
||||
/**
|
||||
* 개별요청부 set
|
||||
* @param ciRequest NiceCiApiDTO.Request
|
||||
*/
|
||||
private void setNiceCiApiPrivateReq(final NiceCiApiStatusDTO.Request ciRequest) {
|
||||
////////////////////////////////////////////////////////////
|
||||
// 개별요청부 START
|
||||
////////////////////////////////////////////////////////////
|
||||
//----------------------------------------------------------
|
||||
// 개별요청부 : default start
|
||||
//----------------------------------------------------------
|
||||
// ciRequest.setIndvdlBsnmCprSe("1"); // 개인/사업자/법인구분
|
||||
// ciRequest.setIhidnum(""); // 주민번호 : blank
|
||||
// FIXME : 값 확인 필요
|
||||
// 결과구분
|
||||
// " "-전체, "00" - 정상((SMS미발송시 조회정상, SMS발송시 발송정상)
|
||||
// 01 - 연락처조회 실패건(주민번호오류/데이터없음/기타오류 건)
|
||||
// 10 - 진행중(연락처조회 정상건 중 SMS발송 이전)
|
||||
// ciRequest.setResultSe(" ");
|
||||
// FIXME : 값 확인 필요
|
||||
// SMS발송요청구분
|
||||
// 0 : 미요청,
|
||||
// 1: 1순위연락처로 발송,
|
||||
// 2: 1 ~ 2 순위중 최우선 순위로 1개 발송
|
||||
// 3: 1 ~ 3 순위중 최우선 순위로 1개 발송
|
||||
// 4: 1{1순위로 요청건} + 2{1~2순위로 요청건} + 3{1~3 순위로 요청건}
|
||||
// ciRequest.setSmsSndngRequstSe("3"); // SMS발송요청구분코드
|
||||
// FIXME : 값 확인 필요
|
||||
// 누적수신건수 : 최초조회시 "0000000000"
|
||||
// ciRequest.setAccmltRecptnCo("0000000000");
|
||||
// ciRequest.setIndvdlzRequstBlnk(""); // 공란 - 23자리
|
||||
//---------------------------------------------------------
|
||||
// 개별요청부 : default end
|
||||
//---------------------------------------------------------
|
||||
|
||||
// selectFromAndToOfStatusParam 에서 SET
|
||||
// ciRequest.setSearchPdFrom(DateUtil.getNowTimeMicrosecond()); // 검색기간 - from
|
||||
// ciRequest.setSearchPdTo(DateUtil.getNowTimeMicrosecond()); // 검색기간 - to
|
||||
ciRequest.setRequstCo("100"); // 요청건수
|
||||
ciRequest.setAccmltRecptnCo("0000000000"); // 누적수신건수
|
||||
////////////////////////////////////////////////////////////
|
||||
// 개별요청부 END
|
||||
////////////////////////////////////////////////////////////
|
||||
}
|
||||
|
||||
private NiceCiApiStatusDTO.Response repeatStatusBulk(
|
||||
NiceCiApiStatusDTO.Request ciRequest) {
|
||||
//NiceCiDTO.InputXit xit,
|
||||
//NiceCiDTO.InputDataXit data){
|
||||
// 기관전문관리번호, TB_NICE_SMS_SNDNG_REQUEST - NICE_SMS_SNDNG_REQUST_ID
|
||||
final String niceSmsInqId = niceCiMapper.selectNiceCiInqireId()
|
||||
.orElseThrow(() -> new EnsException(EnsErrCd.MAKE521, EnsErrCd.MAKE521.getCodeNm())
|
||||
);
|
||||
|
||||
//----------------------------------------------------------
|
||||
// API Call 전처리 START - request
|
||||
//----------------------------------------------------------
|
||||
ciRequest.setNiceSmsSndngInqireId(niceSmsInqId);
|
||||
String ciTxt = ciRequest.ofString();
|
||||
ciRequest.setTrnscId(String.valueOf(NiceCiUtils.lengthKr(ciTxt)));
|
||||
validate(ciRequest);
|
||||
niceCiMapper.insertNiceSmsSndngInquireRequest(ciRequest);
|
||||
//----------------------------------------------------------
|
||||
// API Call 전처리 END - request
|
||||
//----------------------------------------------------------
|
||||
|
||||
//----------------------------------------------------------
|
||||
// Status API call & Get Result START
|
||||
//----------------------------------------------------------
|
||||
EnsResponseVO<?> responseVO = niceCiApiService.findBulkStatus(ciRequest.getTrnscId(), ciTxt);
|
||||
if (!EnsErrCd.OK.equals(responseVO.getErrCode()))
|
||||
throw new EnsException(responseVO.getErrCode(), responseVO.getErrMsg());
|
||||
|
||||
NiceCiApiStatusDTO.Response resDTO = (NiceCiApiStatusDTO.Response)responseVO.getResultInfo();
|
||||
//----------------------------------------------------------
|
||||
// Status API call & Get Result END
|
||||
//----------------------------------------------------------
|
||||
|
||||
//----------------------------------------------------------
|
||||
// API Call 후처리 START - response & 결과테이블 저장
|
||||
//----------------------------------------------------------
|
||||
// API response 저장
|
||||
resDTO.setNiceSmsSndngInqireId(niceSmsInqId);
|
||||
niceCiMapper.insertNiceSmsSndngInquireResponse(resDTO);
|
||||
|
||||
// API response 반복부 저장
|
||||
List<NiceCiApiResult> apiResults = resDTO.getNiceCiResults();
|
||||
List<NiceCiDTO.SendResult> sendResults = new ArrayList<>();
|
||||
for (NiceCiApiResult result : apiResults) {
|
||||
result.setNiceSmsSndngInqireId(niceSmsInqId);
|
||||
try {
|
||||
NiceCiDTO.SendResult sendResult = niceCiNewTransactionService.findDataIdFromSendResult(result)
|
||||
.orElseThrow(() -> new EnsException(EnsErrCd.SEND404, "상태조회 발송결과응답 데이타로 API 요청 데이타 조회 결과 데이타 미존재"));
|
||||
|
||||
// mssageSndngResultSe 1 -> TALK_SEND, 2 -> SMS_SEND, FAIL
|
||||
sendResult.setSendSttusCd(
|
||||
"1".equals(result.getMssageSndngResultSe()) ? "TALK_SEND" :
|
||||
("2".equals(result.getMssageSndngResultSe()) ? "SMS_SEND"
|
||||
: "FAIL"));
|
||||
sendResults.add(sendResult);
|
||||
|
||||
// error 처리
|
||||
} catch (Exception e) {
|
||||
if (e instanceof EnsException) {
|
||||
EnsException ens = (EnsException)e;
|
||||
log.error("NICE CI Status 조회 ERROR::{}[{}]", ens.getMessage(), ens.getErrCd());
|
||||
} else {
|
||||
log.error("NICE CI Status 조회 ERROR::{}", ObjectUtils.isNotEmpty(e.getCause())? e.getCause().getMessage() : e.getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
if(!apiResults.isEmpty()) niceCiNewTransactionService.insertNiceSmsSndngInquireResponseRepeats(apiResults);
|
||||
if(!sendResults.isEmpty()) niceCiNewTransactionService.insertSendResults(sendResults);
|
||||
//----------------------------------------------------------
|
||||
// API Call 후처리 END - response & 결과테이블 저장
|
||||
//----------------------------------------------------------
|
||||
|
||||
return resDTO;
|
||||
}
|
||||
|
||||
private void validate(final NiceCiApiStatusDTO.Request ciRequest) {
|
||||
List<String> errors = new ArrayList<>();
|
||||
final Set<ConstraintViolation<NiceCiApiStatusDTO.Request>> list = validator.validate(ciRequest);
|
||||
if (!list.isEmpty()) {
|
||||
errors.addAll(list.stream()
|
||||
.map(row -> String.format("%s=%s", row.getPropertyPath(), row.getMessageTemplate()))
|
||||
.collect(Collectors.toList())
|
||||
);
|
||||
}
|
||||
|
||||
if(!errors.isEmpty()){
|
||||
throw new EnsException(EnsErrCd.INVALID_DATA, errors.toString());
|
||||
}
|
||||
}
|
||||
}
|
File diff suppressed because one or more lines are too long
@ -0,0 +1,502 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
<mapper namespace="cokr.xit.ens.modules.nice.mapper.INiceCiMapper">
|
||||
|
||||
<!-- =================================================================================== -->
|
||||
<!-- ================================ 공통 =========================================== -->
|
||||
<!-- =================================================================================== -->
|
||||
<select id="selectInputXits" parameterType="cokr.xit.ens.modules.nice.model.NiceCiDTO$NiceCiParam" resultType="cokr.xit.ens.modules.nice.model.NiceCiDTO$InputXit">
|
||||
/** iup-niceci-mapper|selectInputXits-NICE CI 대상 조회|julim */
|
||||
SELECT lnk_input_id /* 연계 ID */
|
||||
, '' AS err_msg /* 오류 메시지 */
|
||||
, expires_dt /* 마감 일시 */
|
||||
, org_cd /* 기관 코드 */
|
||||
, pay_expires_dt /* 결제 만료 일시 */
|
||||
, prcs_cd /* 처리 코드 */
|
||||
, rcpt_dt /* 접수 일시 */
|
||||
, run_dt /* 발송 일시 */
|
||||
, send_type /* 발송구분 : NI-알림톡, KP:인증톡 */
|
||||
, tot_cnt /* 총 개수 */
|
||||
, job_cd /* 작업 코드 */
|
||||
, reg_dt
|
||||
, reg_id
|
||||
, upd_dt
|
||||
, upd_id
|
||||
FROM tb_input_xit
|
||||
WHERE send_type = #{sendType}
|
||||
AND prcs_cd = #{prcsCd}
|
||||
<if test="reqStatusCd eq 'GRUC'">
|
||||
AND run_dt < sysdate
|
||||
</if>
|
||||
<if test="reqStatusCd eq 'CLOS'">
|
||||
AND expires_dt < SYSDATE - 1
|
||||
</if>
|
||||
</select>
|
||||
|
||||
<select id="selectInputDataXits" parameterType="cokr.xit.ens.modules.nice.model.NiceCiDTO$NiceCiParam" resultType="cokr.xit.ens.modules.nice.model.NiceCiDTO$InputDataXit">
|
||||
/** iup-niceci-mapper|selectInputDataXits-NICE CI 발송 대상 조회|julim */
|
||||
SELECT lnk_input_id /* 연계 ID */
|
||||
, data_id /* 데이터 ID (Primary Key) */
|
||||
, birthday /* 생년월일 */
|
||||
, call_center_no /* 콜 센터 번호 */
|
||||
, car_no /* 차량 번호 */
|
||||
, gender /* 성별 */
|
||||
, linked_uuid /* 연계 UUID */
|
||||
, moblphon_no /* 휴대전화 번호 */
|
||||
, msg_data /* 메시지 데이터 */
|
||||
, msg_dtl_data /* 메시지 상세 데이터 */
|
||||
, name /* 이름 */
|
||||
, pay_status_cd /* 결제 상태 코드 */
|
||||
, pay_url /* 결제 URL */
|
||||
, sid /* 세션 ID(주민번호|CI) */
|
||||
, reg_dt
|
||||
, reg_id
|
||||
, upd_dt
|
||||
, upd_id
|
||||
FROM tb_input_data_xit
|
||||
WHERE lnk_input_id = #{lnkInputId}
|
||||
</select>
|
||||
|
||||
|
||||
<update id="updatePrcsCdAndErrorOfInputXit" parameterType="cokr.xit.ens.modules.nice.model.NiceCiDTO$InputXit">
|
||||
/** iup-niceci-mapper|updatePrcsCdAndErrorOfInputXit-prcsCd and errorupdate|julim */
|
||||
UPDATE tb_input_xit
|
||||
SET prcs_cd = #{prcsCd}
|
||||
, err_msg = SUBSTR(#{errMsg}, 0, 1000)
|
||||
, upd_dt = sysdate
|
||||
, upd_id = 'ENS_SYS'
|
||||
WHERE lnk_input_id = #{lnkInputId}
|
||||
</update>
|
||||
<!-- =================================================================================== -->
|
||||
<!-- ================================ 공통 =========================================== -->
|
||||
<!-- =================================================================================== -->
|
||||
|
||||
<!-- =================================================================================== -->
|
||||
<!-- ================================ accept =========================================== -->
|
||||
<!-- =================================================================================== -->
|
||||
<insert id="insertBill" parameterType="cokr.xit.ens.modules.nice.model.NiceCiDTO$BillDTO">
|
||||
/** iup-niceci-mapper|insertBill-NICE CI 청구서 생성|julim */
|
||||
INSERT INTO ens_bill (
|
||||
bill_id, /* 청구 ID (Primary Key) */
|
||||
bill_uid, /* 청구 UID */
|
||||
biller_user_key, /* 청구 사용자 키 */
|
||||
bill_se_cd, /* 청구 구분 코드 */
|
||||
org_cd, /* 기관 코드 */
|
||||
regist_dt
|
||||
) VALUES (
|
||||
#{billId},
|
||||
#{billUid},
|
||||
#{billerUserKey},
|
||||
#{billSeCd},
|
||||
#{orgCd},
|
||||
sysdate
|
||||
)
|
||||
</insert>
|
||||
|
||||
<update id="updateBill" parameterType="cokr.xit.ens.modules.nice.model.NiceCiDTO$BillDTO">
|
||||
UPDATE ens_bill
|
||||
SET doc_bill_kko = #{docBillKko}
|
||||
, paid_at = #{paidAt}
|
||||
, paid_cancel_dt = #{paidCancelDt}
|
||||
, paid_dt = #{paidDt}
|
||||
, paid_type = #{paidType}
|
||||
, last_updt_dt = sysdate
|
||||
WHERE bill_id = #{billId}
|
||||
</update>
|
||||
|
||||
<insert id="mergeBillKko" parameterType="cokr.xit.ens.modules.nice.model.NiceCiDTO$BillKkoDTO">
|
||||
<!-- //FIXME: NICE CI INSERT UPDATE 항목 확인 적용 필요 -->
|
||||
/** iup-niceci-mapper|mergeBill-NICE CI 청구서 생성|julim */
|
||||
MERGE
|
||||
INTO ens_bill_kko
|
||||
USING DUAL
|
||||
ON (bill_id = #{billId})
|
||||
WHEN MATCHED THEN
|
||||
UPDATE
|
||||
SET amount = #{amount}
|
||||
, details = #{details}
|
||||
, url = #{url}
|
||||
, title = #{title}
|
||||
, expire_type = #{expireType}
|
||||
, pay_expire_date = #{payExpireDate}
|
||||
, second_pay_expire_date = #{secondPayExpireDate}
|
||||
, billed_year_month = #{billedYearMonth}
|
||||
, ordinal = #{ordinal}
|
||||
, parameters = #{parameters}
|
||||
, bank_accounts = #{bankAccounts}
|
||||
, tax_free_amount = #{taxFreeAmount}
|
||||
, vat_amount = #{vatAmount}
|
||||
, last_paid_at = TO_CHAR(sysdate, 'YYYYMMDDHH24MISS')
|
||||
, last_pay_id = #{lastPayId}
|
||||
, error_code = #{errorCode}
|
||||
, error_message = #{errorMessage}
|
||||
, last_updt_dt = sysdate
|
||||
WHEN NOT MATCHED THEN
|
||||
INSERT (
|
||||
bill_id,
|
||||
bill_uid,
|
||||
biller_user_key,
|
||||
biller_notice_key,
|
||||
custom_url,
|
||||
expire_at,
|
||||
regist_dt
|
||||
) VALUES (
|
||||
#{billId}
|
||||
, #{billUid}
|
||||
, #{billerUserKey}
|
||||
, #{billerNoticeKey}
|
||||
, #{customUrl}
|
||||
, #{expireAt}
|
||||
, sysdate
|
||||
)
|
||||
</insert>
|
||||
<!--
|
||||
amount,
|
||||
details,
|
||||
url,
|
||||
title,
|
||||
expire_type,
|
||||
pay_expire_date,
|
||||
second_pay_expire_date,
|
||||
billed_year_month,
|
||||
ordinal,
|
||||
parameters,
|
||||
bank_accounts,
|
||||
tax_free_amount,
|
||||
vat_amount,
|
||||
last_paid_at,
|
||||
last_pay_id,
|
||||
error_code,
|
||||
error_message,
|
||||
last_updt_dt
|
||||
-->
|
||||
|
||||
<update id="updatePayUrlOfDataInput" parameterType="cokr.xit.ens.modules.nice.model.NiceCiDTO$InputDataXit">
|
||||
/** iup-niceci-mapper|updatePayUrlOfDataInput-payUrl update|julim */
|
||||
UPDATE tb_input_data_xit
|
||||
SET pay_url = #{payUrl}
|
||||
WHERE lnk_input_id = #{lnkInputId}
|
||||
</update>
|
||||
|
||||
<select id="selectKkoBpApiUrlFromEnsOrgMng" parameterType="string" resultType="cokr.xit.ens.modules.common.ctgy.sys.mng.domain.OrgMng">
|
||||
/** iup-niceci-mapper|selectKkoBpApiUrlFromEnsOrgMng-API url 조회|julim */
|
||||
SELECT kko_bp_url_api AS kkoBpUrlApi
|
||||
, kko_bp_biller_code AS kkoBpBillerCode
|
||||
, kko_bp_authorization AS kkoBpAuthorization
|
||||
FROM ens_org_mng
|
||||
WHERE org_cd = #{orgCd}
|
||||
</select>
|
||||
<!-- =================================================================================== -->
|
||||
<!-- ================================ accept =========================================== -->
|
||||
<!-- =================================================================================== -->
|
||||
|
||||
<!-- =================================================================================== -->
|
||||
<!-- ================================ send =========================================== -->
|
||||
<!-- =================================================================================== -->
|
||||
<select id="selectNiceCiRequestId" resultType="string">
|
||||
/** iup-niceci-mapper|selectNiceCiRequestId-select nice ci request Id|julim */
|
||||
SELECT LPAD(SEQ_NICE_SMS_SNDNG_REQUST_ID.nextval, 10, '0')
|
||||
FROM DUAL
|
||||
</select>
|
||||
|
||||
<select id="selectTmpltMsg" parameterType="string" resultType="cokr.xit.ens.modules.nice.model.NiceCiDTO$TmpltMngDTO">
|
||||
/** iup-niceci-mapper|selectTmpltMsg-selest nice ci template message|julim */
|
||||
SELECT etm.dtype
|
||||
, etm.org_cd
|
||||
, etm.tmplt_cd
|
||||
, etm.message
|
||||
, etm.title
|
||||
, etm.ntcntalk_tmplat_code
|
||||
, eom.org_nm
|
||||
FROM ens_org_mng eom
|
||||
JOIN ens_tmplt_mng etm
|
||||
ON eom.org_cd = etm.org_cd
|
||||
WHERE etm.tmplt_cd = #{tmpltCd}
|
||||
</select>
|
||||
|
||||
<insert id="insertNiceSmsSndngRequest" parameterType="cokr.xit.ens.modules.nice.model.NiceCiApiSendDTO$Request">
|
||||
/** iup-niceci-mapper|insertNiceSmsSndngRequest-nice ci Send request data 생성|julim */
|
||||
INSERT INTO tb_nice_sms_sndng_requst (
|
||||
nice_sms_sndng_requst_id, /* NICE SMS 발송 요청 ID */
|
||||
data_id, /* DATA ID */
|
||||
trnsc_id, /* 트랜잭션 ID - 전문 길이(한글2, 그외 1자리 계산)*/
|
||||
spclty_groupcode, /* 전문 그룹 코드 */
|
||||
delng_asortcode, /* 거래 종별 코드 */
|
||||
delng_secode, /* 거래 구분 코드 */
|
||||
trsmrcv_at, /* 송수신 플래그 */
|
||||
trmnl_se, /* 단말기 구분 */
|
||||
rspns_code, /* 응답코드 */
|
||||
partcpt_instt_id, /* 참가기관 ID */
|
||||
instt_spclty_manageno, /* 기관 전문 관리번호 */
|
||||
instt_spclty_trnsmistime, /* 기관 전문 전송 시간 */
|
||||
nice_spclty_manageno, /* NICE 전문 관리 번호 */
|
||||
nice_spclty_trnsmistime, /* NICE 전문 전송 시간 */
|
||||
blnk, /* 공란 */
|
||||
inqire_agre_resn, /* 조회 동의 사유 */
|
||||
inqire_resn, /* 조회 사유 */
|
||||
inqire_requst_co, /* 조회 요청 건수 */
|
||||
sms_sndng_requst_se, /* SMS 발송 요청 구분 */
|
||||
sndng_mssage, /* 발송 메세지 */
|
||||
dsptch_no, /* 발신 번호 */
|
||||
cttpc_inqire_se, /* 연락처 조회 구분 */
|
||||
ntcntalk_sndng_requst_se, /* 알림톡 발송 요청 구분 */
|
||||
ntcntalk_tmplat_code, /* 알림톡 템플릿 코드 */
|
||||
btton_requst_co, /* 버튼 요청 건수 */
|
||||
indvdlz_requst_blnk, /* 개별 요청 공란 */
|
||||
indvdl_bsnm_cpr_se, /* 개인 사업자 법인 구분 */
|
||||
ihidnum, /* 주민 번호 */
|
||||
inqire_requst_blnk, /* 조회 요청 공란 */
|
||||
btton_ty, /* 버튼 타입 */
|
||||
btton_nm, /* 버튼 이름 */
|
||||
btton_url_web_link_1, /* 버튼 URL 웹 링크 1 */
|
||||
btton_url_web_link_2, /* 버튼 URL 웹 링크 2 */
|
||||
btton_requst_blnk, /* 버튼 요청 공란 */
|
||||
creat_dt,
|
||||
crtr
|
||||
) VALUES (
|
||||
#{niceSmsSndngRequstId},
|
||||
#{dataId},
|
||||
#{trnscId},
|
||||
#{niceCommon.spcltyGroupcode},
|
||||
#{niceCommon.delngAsortcode},
|
||||
#{niceCommon.delngSecode},
|
||||
#{niceCommon.trsmrcvAt},
|
||||
#{niceCommon.trmnlSe},
|
||||
#{niceCommon.rspnsCode},
|
||||
#{niceCommon.partcptInsttId},
|
||||
#{niceCommon.insttSpcltyManageno},
|
||||
#{niceCommon.insttSpcltyTrnsmistime},
|
||||
#{niceCommon.niceSpcltyManageno},
|
||||
#{niceCommon.niceSpcltyTrnsmistime},
|
||||
#{niceCommon.blnk},
|
||||
#{niceCommon.inqireAgreResn},
|
||||
#{inqireResn},
|
||||
#{inqireRequstCo},
|
||||
#{smsSndngRequstSe},
|
||||
#{sndngMssage},
|
||||
#{dsptchNo},
|
||||
#{cttpcInqireSe},
|
||||
#{ntcntalkSndngRequstSe},
|
||||
#{ntcntalkTmplatCode},
|
||||
#{bttonRequstCo},
|
||||
#{indvdlzRequstBlnk},
|
||||
<foreach collection="queryRequests" item="queryRequest" separator=",">
|
||||
#{queryRequest.indvdlBsnmCprSe},
|
||||
#{queryRequest.ihidnum},
|
||||
#{queryRequest.inqireRequstBlnk},
|
||||
</foreach>
|
||||
<foreach collection="buttonRequests" item="buttonRequest" separator=",">
|
||||
#{buttonRequest.bttonTy},
|
||||
#{buttonRequest.bttonNm},
|
||||
#{buttonRequest.bttonUrlWebLink_1},
|
||||
#{buttonRequest.bttonUrlWebLink_2},
|
||||
#{buttonRequest.bttonRequstBlnk},
|
||||
</foreach>
|
||||
sysdate,
|
||||
'ENS_SYS'
|
||||
)
|
||||
</insert>
|
||||
|
||||
<insert id="insertNiceSmsSndngResponse" parameterType="cokr.xit.ens.modules.nice.model.NiceCiApiSendDTO$Response">
|
||||
/** iup-niceci-mapper|insertNiceSmsSndngResponse-nice ci Send response 생성|julim */
|
||||
INSERT INTO tb_nice_sms_sndng_rspns (
|
||||
nice_sms_sndng_requst_id, /* NICE SMS 발송 요청 ID */
|
||||
trnsc_id, /* 트랜잭션 ID - 전문 길이(한글2, 그외 1자리 계산)*/
|
||||
spclty_groupcode, /* 전문 그룹 코드 */
|
||||
delng_asortcode, /* 거래 종별 코드 */
|
||||
delng_secode, /* 거래 구분 코드 */
|
||||
trsmrcv_at, /* 송수신 플래그 */
|
||||
trmnl_se, /* 단말기 구분 */
|
||||
rspns_code, /* 응답코드 */
|
||||
partcpt_instt_id, /* 참가기관 ID */
|
||||
instt_spclty_manageno, /* 기관 전문 관리번호 */
|
||||
instt_spclty_trnsmistime, /* 기관 전문 전송 시간 */
|
||||
nice_spclty_manageno, /* NICE 전문 관리 번호 */
|
||||
nice_spclty_trnsmistime, /* NICE 전문 전송 시간 */
|
||||
blnk, /* 공란 */
|
||||
rspns_co, /* 응답 건수 */
|
||||
sms_sndng_requst_se, /* SMS 발송 요청 구분 */
|
||||
sndng_mssage, /* 발송 메세지 */
|
||||
dsptch_no, /* 발신 번호 */
|
||||
cttpc_inqire_se, /* 연락처 조회 구분 */
|
||||
indvdlz_rspns_blnk, /* 개별 응답 공란 */
|
||||
indvdl_bsnm_cpr_se, /* 개인 사업자 법인 구분 */
|
||||
ihidnum, /* 주민번호 */
|
||||
nm, /* 성명 */
|
||||
rank_cttpc_1, /* 1순위 연락처 */
|
||||
rank_cttpc_2, /* 2순위 연락처 */
|
||||
rank_cttpc_3, /* 3순위 연락처 */
|
||||
result_se, /* 결과 구분 */
|
||||
sms_sndng_cttpc_rank, /* SMS 발송 연락처 순위 */
|
||||
sms_sndng_cttpc_no, /* SMS 반송 연락처 번호 */
|
||||
sms_sndng_dt, /* SMS 발송 일시 */
|
||||
rspns_reptit_blnk, /* 응답 반복 공란 */
|
||||
creat_dt,
|
||||
crtr
|
||||
) VALUES (
|
||||
#{niceSmsSndngRequstId},
|
||||
#{trnscId},
|
||||
#{niceCommon.spcltyGroupcode},
|
||||
#{niceCommon.delngAsortcode},
|
||||
#{niceCommon.delngSecode},
|
||||
#{niceCommon.trsmrcvAt},
|
||||
#{niceCommon.trmnlSe},
|
||||
#{niceCommon.rspnsCode},
|
||||
#{niceCommon.partcptInsttId},
|
||||
#{niceCommon.insttSpcltyManageno},
|
||||
#{niceCommon.insttSpcltyTrnsmistime},
|
||||
#{niceCommon.niceSpcltyManageno},
|
||||
#{niceCommon.niceSpcltyTrnsmistime},
|
||||
#{niceCommon.blnk},
|
||||
#{rspnsCo},
|
||||
#{smsSndngRequstSe},
|
||||
#{sndngMssage},
|
||||
#{dsptchNo},
|
||||
#{cttpcInqireSe},
|
||||
#{indvdlzRspnsBlnk},
|
||||
<foreach collection="niceCiResults" item="niceCiResult" separator=",">
|
||||
#{niceCiResult.indvdlBsnmCprSe},
|
||||
#{niceCiResult.ihidnum},
|
||||
#{niceCiResult.nm},
|
||||
#{niceCiResult.rankCttpc_1},
|
||||
#{niceCiResult.rankCttpc_2},
|
||||
#{niceCiResult.rankCttpc_3},
|
||||
#{niceCiResult.resultSe},
|
||||
#{niceCiResult.smsSndngCttpcRank},
|
||||
#{niceCiResult.smsSndngCttpcNo},
|
||||
#{niceCiResult.smsSndngDt},
|
||||
#{niceCiResult.rspnsReptitBlnk},
|
||||
</foreach>
|
||||
sysdate,
|
||||
'ENS_SYS'
|
||||
)
|
||||
</insert>
|
||||
<!-- =================================================================================== -->
|
||||
<!-- ================================ send =========================================== -->
|
||||
<!-- =================================================================================== -->
|
||||
|
||||
|
||||
<!-- =================================================================================== -->
|
||||
<!-- ================================ status =========================================== -->
|
||||
<!-- =================================================================================== -->
|
||||
<select id="selectFromAndToOfStatusParam" parameterType="cokr.xit.ens.modules.nice.model.NiceCiDTO$NiceCiParam" resultType="cokr.xit.ens.modules.nice.model.NiceCiApiStatusDTO$Request">
|
||||
/** iup-niceci-mapper|selectFromAndToOfStatusParam-상태조회 조회시작일과 종료일 조회|julim */
|
||||
SELECT TO_CHAR(MIN(run_dt), 'YYYYMMDD')||'000000000000' AS searchPdFrom
|
||||
, TO_CHAR(MAX(run_dt+1), 'YYYYMMDD')||'000000000000' AS searchPdTo
|
||||
FROM tb_input_xit
|
||||
WHERE send_type = #{sendType}
|
||||
AND prcs_cd = #{prcsCd}
|
||||
</select>
|
||||
|
||||
<select id="selectNiceCiInqireId" resultType="string">
|
||||
/** iup-niceci-mapper|selectNiceCiInqireId-select nice ci Inquire Id|julim */
|
||||
SELECT LPAD(SEQ_NICE_SMS_SNDNG_INQIRE_ID.nextval, 10, '0')
|
||||
FROM DUAL
|
||||
</select>
|
||||
|
||||
<insert id="insertNiceSmsSndngInquireRequest" parameterType="cokr.xit.ens.modules.nice.model.NiceCiApiStatusDTO$Request">
|
||||
/** iup-niceci-mapper|insertNiceSmsSndngInquireRequest-nice ci Status request data 생성|julim */
|
||||
INSERT INTO tb_nice_sms_sndng_inqire_requs (
|
||||
nice_sms_sndng_inqire_id, /* NICE SMS 발송 조회 ID */
|
||||
trnsc_id, /* 트랜잭션 ID - 전문 길이(한글2, 그외 1자리 계산)*/
|
||||
spclty_groupcode, /* 전문 그룹 코드 */
|
||||
delng_asortcode, /* 거래 종별 코드 */
|
||||
delng_secode, /* 거래 구분 코드 */
|
||||
trsmrcv_at, /* 송수신 플래그 */
|
||||
trmnl_se, /* 단말기 구분 */
|
||||
rspns_code, /* 응답코드 */
|
||||
partcpt_instt_id, /* 참가기관 ID */
|
||||
instt_spclty_manageno, /* 기관 전문 관리번호 */
|
||||
instt_spclty_trnsmistime, /* 기관 전문 전송 시간 */
|
||||
nice_spclty_manageno, /* NICE 전문 관리 번호 */
|
||||
nice_spclty_trnsmistime, /* NICE 전문 전송 시간 */
|
||||
blnk, /* 공란 */
|
||||
search_pd_from, /* 검색기간 from */
|
||||
search_pd_to, /* 검색기간 to */
|
||||
indvdl_bsnm_cpr_se, /* 개인 사업자 법인 구분 */
|
||||
ihidnum, /* 주민번호 */
|
||||
result_se, /* 결과구분 */
|
||||
sms_sndng_requst_se, /* SMS 발송 요청 구분 */
|
||||
requst_co, /* 요청 건수 */
|
||||
accmlt_recptn_co, /* 누적 수신 건수 */
|
||||
indvdlz_requst_blnk, /* 개별 요청 공란 */
|
||||
creat_dt,
|
||||
crtr
|
||||
) VALUES (
|
||||
#{niceSmsSndngInqireId},
|
||||
#{trnscId},
|
||||
#{niceCommon.spcltyGroupcode},
|
||||
#{niceCommon.delngAsortcode},
|
||||
#{niceCommon.delngSecode},
|
||||
#{niceCommon.trsmrcvAt},
|
||||
#{niceCommon.trmnlSe},
|
||||
#{niceCommon.rspnsCode},
|
||||
#{niceCommon.partcptInsttId},
|
||||
#{niceCommon.insttSpcltyManageno},
|
||||
#{niceCommon.insttSpcltyTrnsmistime},
|
||||
#{niceCommon.niceSpcltyManageno},
|
||||
#{niceCommon.niceSpcltyTrnsmistime},
|
||||
#{niceCommon.blnk},
|
||||
#{searchPdFrom},
|
||||
#{searchPdTo},
|
||||
#{indvdlBsnmCprSe},
|
||||
#{ihidnum},
|
||||
#{resultSe},
|
||||
#{smsSndngRequstSe},
|
||||
#{requstCo},
|
||||
#{accmltRecptnCo},
|
||||
#{indvdlzRequstBlnk},
|
||||
sysdate,
|
||||
'ENS_SYS'
|
||||
)
|
||||
</insert>
|
||||
|
||||
<insert id="insertNiceSmsSndngInquireResponse" parameterType="cokr.xit.ens.modules.nice.model.NiceCiApiStatusDTO$Response">
|
||||
/** iup-niceci-mapper|insertNiceSmsSndngInquireResponse-nice ci Send response 생성|julim */
|
||||
INSERT INTO tb_nice_sms_sndng_inqire_rspns (
|
||||
nice_sms_sndng_inqire_id, /* NICE SMS 발송 조회 ID */
|
||||
trnsc_id, /* 트랜잭션 ID - 전문 길이(한글2, 그외 1자리 계산)*/
|
||||
spclty_groupcode, /* 전문 그룹 코드 */
|
||||
delng_asortcode, /* 거래 종별 코드 */
|
||||
delng_secode, /* 거래 구분 코드 */
|
||||
trsmrcv_at, /* 송수신 플래그 */
|
||||
trmnl_se, /* 단말기 구분 */
|
||||
rspns_code, /* 응답코드 */
|
||||
partcpt_instt_id, /* 참가기관 ID */
|
||||
instt_spclty_manageno, /* 기관 전문 관리번호 */
|
||||
instt_spclty_trnsmistime, /* 기관 전문 전송 시간 */
|
||||
nice_spclty_manageno, /* NICE 전문 관리 번호 */
|
||||
nice_spclty_trnsmistime, /* NICE 전문 전송 시간 */
|
||||
blnk, /* 공란 */
|
||||
tot_co, /* 총 건수 */
|
||||
accmlt_co, /* 누적 건수 */
|
||||
rspns_co, /* 응답 건수 */
|
||||
creat_dt,
|
||||
crtr
|
||||
) VALUES (
|
||||
#{niceSmsSndngInqireId},
|
||||
#{trnscId},
|
||||
#{niceCommon.spcltyGroupcode},
|
||||
#{niceCommon.delngAsortcode},
|
||||
#{niceCommon.delngSecode},
|
||||
#{niceCommon.trsmrcvAt},
|
||||
#{niceCommon.trmnlSe},
|
||||
#{niceCommon.rspnsCode},
|
||||
#{niceCommon.partcptInsttId},
|
||||
#{niceCommon.insttSpcltyManageno},
|
||||
#{niceCommon.insttSpcltyTrnsmistime},
|
||||
#{niceCommon.niceSpcltyManageno},
|
||||
#{niceCommon.niceSpcltyTrnsmistime},
|
||||
#{niceCommon.blnk},
|
||||
#{totCo},
|
||||
#{accmltCo},
|
||||
#{rspnsCo},
|
||||
sysdate,
|
||||
'ENS_SYS'
|
||||
)
|
||||
</insert>
|
||||
<!-- =================================================================================== -->
|
||||
<!-- ================================ status =========================================== -->
|
||||
<!-- =================================================================================== -->
|
||||
</mapper>
|
@ -0,0 +1,155 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
<mapper namespace="cokr.xit.ens.modules.nice.mapper.INiceCiNewTransactionMapper">
|
||||
|
||||
<!-- =================================================================================== -->
|
||||
<!-- ================================ accept =========================================== -->
|
||||
<!-- =================================================================================== -->
|
||||
<insert id="insertBillHistory" parameterType="cokr.xit.ens.modules.nice.model.NiceCiDTO$BillHistDTO">
|
||||
/** iup-niceci-new-transaction-mapper|insertBillHistory-Bill API(NICE CI) call history save|julim */
|
||||
<selectKey keyProperty="id" resultType="long" order="BEFORE">
|
||||
SELECT NVL(MAX(id), 0) + 1
|
||||
FROM ens_bill_his
|
||||
</selectKey>
|
||||
INSERT INTO ens_bill_his (
|
||||
id, /* Primary Key */
|
||||
linked_uuid, /* 연계 UUID */
|
||||
org_cd, /* 기관 코드 */
|
||||
req_se, /* 요청 구분 */
|
||||
bill_se, /* 청구 구분 */
|
||||
request_data, /* 요청 데이터 */
|
||||
regist_dt /* 등록 일시 */
|
||||
) VALUES (
|
||||
#{id},
|
||||
#{linkedUuid},
|
||||
#{orgCd},
|
||||
#{reqSe},
|
||||
#{billSe},
|
||||
#{requestData},
|
||||
sysdate
|
||||
)
|
||||
</insert>
|
||||
|
||||
<update id="updateBillHistory" parameterType="cokr.xit.ens.modules.nice.model.NiceCiDTO$BillHistDTO">
|
||||
/** iup-niceci-new-transaction-mapper|updateBillHistory-Bill API(NICE CI) call history save|julim */
|
||||
UPDATE ens_bill_his
|
||||
SET bill_uid = #{billUid}
|
||||
, response_data = #{responseData}
|
||||
, error_code = #{errorCode}
|
||||
, error_message = #{errorMessage}
|
||||
, last_updt_dt = sysdate
|
||||
WHERE id = #{id}
|
||||
</update>
|
||||
<!-- =================================================================================== -->
|
||||
<!-- ================================ accept =========================================== -->
|
||||
<!-- =================================================================================== -->
|
||||
|
||||
|
||||
<!-- =================================================================================== -->
|
||||
<!-- ================================ status =========================================== -->
|
||||
<!-- =================================================================================== -->
|
||||
<insert id="insertNiceSmsSndngInquireResponseRepeats" parameterType="list">
|
||||
/** iup-new-transaction-mapper|insertNiceSmsSndngInquireResponseRepeats-nice ci Send response 반복부 생성|julim */
|
||||
<!-- //FIXME: oracle인 경우 Insert ALL SELECT ... DUAL 사용해야 함 -->
|
||||
<foreach collection="list" item="item" index="index" open="INSERT ALL" close="SELECT 1 FROM DUAL">
|
||||
INTO tb_nice_sms_sndng_inqire_repti (
|
||||
nice_sms_sndng_inqire_id, /* NICE SMS 발송 조회 ID */
|
||||
sn, /* 순번 */
|
||||
inqire_dt, /* 조회 일시 */
|
||||
indvdl_bsnm_cpr_se, /* 개인 사업자 법인 구분 */
|
||||
ihidnum, /* 주민 번호 */
|
||||
nm, /* 성명 */
|
||||
rank_cttpc_1, /* 1순위 연락처 */
|
||||
rank_cttpc_2, /* 2순위 연락처 */
|
||||
rank_cttpc_3, /* 3순위 연락처 */
|
||||
result_se, /* 결과 구분 */
|
||||
sms_sndng_requst_se, /* SMS 발송요청 구분*/
|
||||
sndng_mssage, /* 전송 메세지 */
|
||||
dsptch_no, /* 발송 번호 */
|
||||
sms_sndng_cttpc_rank, /* SMS 발송 연락처 순위 */
|
||||
sms_sndng_cttpc_no, /* SMS 발송 연락처 번호 */
|
||||
sms_sndng_dt, /* SMS 발송 일시 */
|
||||
opetr_id, /* 처리자 ID */
|
||||
cttpc_inqire_se, /* 연락처 조회 구분 */
|
||||
mssage_sndng_result_se, /* 메세지 발송 결과 구분 */
|
||||
rspns_reptit_blnk, /* 응답 반복 공란 */
|
||||
creat_dt,
|
||||
crtr
|
||||
) VALUES (
|
||||
#{item.niceSmsSndngInqireId},
|
||||
(#{index} + 1),
|
||||
#{item.inqireDt},
|
||||
#{item.indvdlBsnmCprSe},
|
||||
#{item.ihidnum},
|
||||
#{item.nm},
|
||||
#{item.rankCttpc_1},
|
||||
#{item.rankCttpc_2},
|
||||
#{item.rankCttpc_3},
|
||||
#{item.resultSe},
|
||||
#{item.smsSndngRequstSe},
|
||||
#{item.sndngMssage},
|
||||
#{item.dsptchNo},
|
||||
#{item.smsSndngCttpcRank},
|
||||
#{item.smsSndngCttpcNo},
|
||||
#{item.smsSndngDt},
|
||||
#{item.opetrId},
|
||||
#{item.cttpcInqireSe},
|
||||
#{item.mssageSndngResultSe},
|
||||
#{item.rspnsReptitBlnk},
|
||||
sysdate,
|
||||
'ENS_SYS'
|
||||
)
|
||||
</foreach>
|
||||
</insert>
|
||||
|
||||
<select id="selectDataIdFromSendResult" parameterType="cokr.xit.ens.modules.nice.model.NiceCiApiResult" resultType="cokr.xit.ens.modules.nice.model.NiceCiDTO$SendResult">
|
||||
/** iup-new-transaction-mapper|selectDataIdFromSendResult-상태조회 발송결과응답 데이타로 API 요청 데이타 조회|julim */
|
||||
SELECT tix.lnk_input_id
|
||||
, tidx.data_id
|
||||
, tix.send_type
|
||||
, tix.run_dt
|
||||
, tix.expires_dt
|
||||
, 'N' AS prcsYn
|
||||
, tnssr.ihidnum
|
||||
FROM tb_nice_sms_sndng_requst tnssr
|
||||
JOIN tb_input_data_xit tidx
|
||||
ON tnssr.data_id = tidx.data_id
|
||||
JOIN tb_input_xit tix
|
||||
ON tidx.lnk_input_id = tix.lnk_input_id
|
||||
WHERE tnssr.ihidnum = #{ihidnum} -- 응답받은 주민번호
|
||||
AND REGEXP_REPLACE(tnssr.sndng_mssage, '[[:space:]]+', '') = REGEXP_REPLACE(#{sndngMssage}, '[[:space:]]+', '') -- 응답받은 발송메시지
|
||||
</select>
|
||||
|
||||
<insert id="insertSendResults" parameterType="list">
|
||||
/** iup-new-transaction-mapper|insertSendResults-nice ci 전송 상태 조회 결과 생성|julim */
|
||||
<!-- //FIXME: oracle인 경우 Insert ALL SELECT ... DUAL 사용해야 함 -->
|
||||
<foreach collection="list" item="item" index="index" open="INSERT ALL" close="SELECT 1 FROM DUAL">
|
||||
INTO tb_send_result (
|
||||
lnk_input_id, /* 연계 ID */
|
||||
data_id, /* data id */
|
||||
run_dt, /* 발송일시 */
|
||||
send_type, /* 발송구분 : NI-알림톡, KP:인증톡 */
|
||||
expires_dt, /* 마감일시 */
|
||||
biz_err_msg, /* 사업자 오류 내용 */
|
||||
prcs_yn, /* 처리여부 */
|
||||
reg_dt,
|
||||
reg_id
|
||||
) VALUES (
|
||||
#{lnkInputId}
|
||||
, #{dataId}
|
||||
, #{runDt}
|
||||
, #{sendType}
|
||||
, #{expiresDt}
|
||||
, #{bizErrMsg}
|
||||
, #{prcsYn}
|
||||
, sysdate
|
||||
, 'ENS_SYS'
|
||||
)
|
||||
</foreach>
|
||||
</insert>
|
||||
<!-- =================================================================================== -->
|
||||
<!-- ================================ status =========================================== -->
|
||||
<!-- =================================================================================== -->
|
||||
|
||||
</mapper>
|
Loading…
Reference in New Issue