feat: NICE CI 소켓 통신 추가
parent
6771f69594
commit
dca46fa392
File diff suppressed because one or more lines are too long
@ -0,0 +1,37 @@
|
||||
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 NiceCiService niceCiService;
|
||||
|
||||
@Operation(summary = "(대량)전송요청")
|
||||
@PostMapping(value = "/send/bulk", produces = MediaType.APPLICATION_JSON_VALUE)
|
||||
public ResponseEntity<?> sendBulk() {
|
||||
return new ResponseEntity<>(niceCiService.requestSendBulk(), HttpStatus.OK);
|
||||
}
|
||||
}
|
@ -0,0 +1,104 @@
|
||||
package cokr.xit.ens.modules.nice.service;
|
||||
|
||||
import org.apache.commons.lang3.*;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.stereotype.*;
|
||||
|
||||
import cokr.xit.ens.core.aop.*;
|
||||
import cokr.xit.ens.modules.nice.cmm.*;
|
||||
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 : NiceCiService
|
||||
* author : limju
|
||||
* date : 2024 9월 27
|
||||
* ======================================================================
|
||||
* 변경일 변경자 변경 내용
|
||||
* ----------------------------------------------------------------------
|
||||
* 2024 9월 27 limju 최초 생성
|
||||
*
|
||||
* </pre>
|
||||
*/
|
||||
@Slf4j
|
||||
@Service
|
||||
@RequiredArgsConstructor
|
||||
public class NiceCiService {
|
||||
@Value("${contract.niceCi.orgId}")
|
||||
private String ORG_ID;
|
||||
|
||||
@Value("${contract.niceCi.clientId}")
|
||||
private String CLIENT_ID;
|
||||
|
||||
private final NiceCiApiService niceCiApiService;
|
||||
|
||||
final String msg = "민자도로 관리지원센터에서 김해찬님께 발송한 미납통행료 고지서가 도착했습니다.\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";
|
||||
|
||||
public EnsResponseVO<?> requestSendBulk() {
|
||||
NiceCiDTO.Request ciRequest = new NiceCiDTO.Request();
|
||||
//ciRequest.setTrCode("0000006150");
|
||||
// // 공통부
|
||||
//
|
||||
// // 개별요청부
|
||||
// nr.setQueryReason(StringUtils.EMPTY);
|
||||
// nr.setQueryReqCnt(46);
|
||||
// nr.setSmsSndReqCode("1");
|
||||
String tmp = NiceCiUtils.rightPadKr(msg, 2000, StringUtils.SPACE);
|
||||
System.out.println(
|
||||
String.format("[%s] kr length - %d, utf-8 length - %d", tmp, NiceCiUtils.lengthKr(tmp), tmp.length()));
|
||||
ciRequest.setSndMessage(msg);
|
||||
// nr.setSndPhoneNo("010");
|
||||
// nr.setContactSearchCode("1");
|
||||
|
||||
// 공통부
|
||||
NiceCiCommon nc = new NiceCiCommon();
|
||||
// nc.setGrpCode("grpCode");
|
||||
//nc.setTrType("Type");
|
||||
nc.setTrClassification("31895"); // 거래구분
|
||||
nc.setOrgId(ORG_ID); // 참가기관Id - property 에서
|
||||
nc.setOrgMngNo("0000000103"); // 기관관리번호
|
||||
nc.setOrgSndDt("20240919");
|
||||
|
||||
NiceCiDTO.QueryRequest qr = new NiceCiDTO.QueryRequest();
|
||||
NiceCiDTO.ButtonRequest br = new NiceCiDTO.ButtonRequest();
|
||||
|
||||
ciRequest.setNiceCommon(nc);
|
||||
ciRequest.getQueryRequests().add(qr);
|
||||
ciRequest.getButtonRequests().add(br);
|
||||
// nc.setNiceMngNo(StringUtils.EMPTY);
|
||||
// nc.setNiceSndDt(StringUtils.EMPTY);
|
||||
String ciTxt = ciRequest.ofString();
|
||||
String ft = String.format("%s%s", StringUtils.leftPad(String.valueOf(NiceCiUtils.lengthKr(ciTxt)), 10, "0"),
|
||||
ciTxt);
|
||||
System.out.println(
|
||||
String.format("[%s] kr length - %d, utf-8 length - %d", ft, NiceCiUtils.lengthKr(ft), ft.length()));
|
||||
|
||||
// String rtnMsg = niceCiApiService.requestSendBulk(ciRequest);
|
||||
// NiceCiDTO.Response resDTO = NiceCiDTO.Response.parse(rtnMsg);
|
||||
return niceCiApiService.requestSendBulk(ciRequest);
|
||||
}
|
||||
}
|
@ -0,0 +1,127 @@
|
||||
package cokr.xit.ens.modules.nice.service.support;
|
||||
|
||||
import java.io.*;
|
||||
import java.net.*;
|
||||
import java.nio.charset.*;
|
||||
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.core.aop.*;
|
||||
import cokr.xit.ens.core.exception.*;
|
||||
import cokr.xit.ens.core.exception.code.*;
|
||||
import cokr.xit.ens.modules.nice.cmm.*;
|
||||
import cokr.xit.ens.modules.nice.model.*;
|
||||
import lombok.*;
|
||||
import lombok.extern.slf4j.*;
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* description :
|
||||
* packageName : cokr.xit.ens.modules.nice.service.support
|
||||
* fileName : NiceCiService
|
||||
* author : limju
|
||||
* date : 2024 9월 27
|
||||
* ======================================================================
|
||||
* 변경일 변경자 변경 내용
|
||||
* ----------------------------------------------------------------------
|
||||
* 2024 9월 27 limju 최초 생성
|
||||
*
|
||||
* </pre>
|
||||
*/
|
||||
@Slf4j
|
||||
@Service
|
||||
@RequiredArgsConstructor
|
||||
public class NiceCiApiService {
|
||||
|
||||
@Value("${contract.niceCi.host}")
|
||||
private String HOST;
|
||||
|
||||
@Value("${contract.niceCi.port}")
|
||||
private int PORT;
|
||||
|
||||
@Value("${contract.niceCi.timeout}")
|
||||
private int TIMEOUT;
|
||||
|
||||
private static final Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
|
||||
|
||||
public EnsResponseVO<?> requestSendBulk(final NiceCiDTO.Request reqDTO) {
|
||||
List<String> errors = new ArrayList<>();
|
||||
final Set<ConstraintViolation<NiceCiDTO.Request>> list = validator.validate(reqDTO);
|
||||
if (!list.isEmpty()) {
|
||||
errors.addAll(list.stream()
|
||||
.map(row -> String.format("%s=%s", row.getPropertyPath(), row.getMessageTemplate()))
|
||||
.collect(Collectors.toList())
|
||||
);
|
||||
}
|
||||
|
||||
if(!errors.isEmpty()){
|
||||
return EnsResponseVO.errBuilder()
|
||||
.errCode(EnsErrCd.INVALID_DATA)
|
||||
.errMsg(errors.toString())
|
||||
.build();
|
||||
}
|
||||
String ciTxt = reqDTO.ofString();
|
||||
String ft = String.format("%s%s", StringUtils.leftPad(String.valueOf(NiceCiUtils.lengthKr(ciTxt)), 10, "0"),
|
||||
ciTxt);
|
||||
log.info("[{}] kr length - {}, utf-8 length - {}", ft, NiceCiUtils.lengthKr(ft), ft.length());
|
||||
|
||||
final String rtnMsg;
|
||||
try {
|
||||
rtnMsg = sendNiceCiSocket(ft);
|
||||
} catch (Exception e) {
|
||||
return EnsResponseVO.errBuilder()
|
||||
.errCode(EnsErrCd.API_COMM_ERROR)
|
||||
.errMsg(e.getMessage())
|
||||
.build();
|
||||
}
|
||||
NiceCiDTO.Response resDTO = NiceCiDTO.Response.parse(rtnMsg);
|
||||
return EnsResponseVO.okBuilder()
|
||||
.resultInfo(resDTO)
|
||||
.build();
|
||||
}
|
||||
|
||||
private String sendNiceCiSocket(final String binTxt) {
|
||||
String rtnMsg = "";
|
||||
|
||||
try (Socket socket = new Socket(HOST, PORT); // 서버에 연결
|
||||
BufferedWriter out = new BufferedWriter(
|
||||
new OutputStreamWriter(socket.getOutputStream(), Charset.forName("EUC-KR")));
|
||||
//new OutputStreamWriter(socket.getOutputStream()));
|
||||
BufferedReader in = new BufferedReader(
|
||||
new InputStreamReader(socket.getInputStream(), Charset.forName("EUC-KR")))) {
|
||||
|
||||
socket.setSoTimeout(TIMEOUT); // 읽기 타임아웃 설정
|
||||
|
||||
out.write(binTxt);
|
||||
// FIXME: 테스트 소켓서버 통신을 위해 임시로 추가 : 테스트 완료후 제거
|
||||
out.write("\nEXIT");
|
||||
|
||||
out.newLine();
|
||||
out.flush();
|
||||
|
||||
String message;
|
||||
StringBuffer sb = new StringBuffer();
|
||||
while((message = in.readLine()) != null) {
|
||||
sb.append(message);
|
||||
};
|
||||
rtnMsg = sb.toString();
|
||||
System.out.println("=============>>>서버 응답(EUC-KR로 읽어온 값)<<<====================================");
|
||||
System.out.println(rtnMsg);
|
||||
System.out.println("=============>>>서버 응답(EUC-KR로 읽어온 값)<<<====================================");
|
||||
} catch (SocketTimeoutException e) {
|
||||
// 타임아웃 발생 시 처리
|
||||
log.error("NICE CI Socket 서버 응답 시간 초과: " + e.getMessage());
|
||||
throw BizRuntimeException.create("NICE CI Socket 서버 응답 시간 초과로 인해 통신이 종료되었습니다.");
|
||||
|
||||
} catch (IOException e) {
|
||||
throw BizRuntimeException.create(e.getMessage());
|
||||
}
|
||||
return rtnMsg;
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue