|
|
|
@ -2,9 +2,12 @@ package kr.xit.biz.ens.service;
|
|
|
|
|
|
|
|
|
|
import static kr.xit.core.support.utils.JsonUtils.*;
|
|
|
|
|
|
|
|
|
|
import java.time.LocalDateTime;
|
|
|
|
|
import java.time.format.DateTimeFormatter;
|
|
|
|
|
import java.util.ArrayList;
|
|
|
|
|
import java.util.Collections;
|
|
|
|
|
import java.util.List;
|
|
|
|
|
import java.util.Objects;
|
|
|
|
|
import java.util.Set;
|
|
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
|
|
|
@ -32,6 +35,8 @@ import kr.xit.biz.ens.model.EnsKtBcDTO;
|
|
|
|
|
import kr.xit.biz.ens.model.cmm.SndngMssageParam;
|
|
|
|
|
import kr.xit.biz.ens.model.kakao.v1.KkopayDocAttrDTO;
|
|
|
|
|
import kr.xit.biz.ens.model.kakao.v1.KkopayDocBulkDTO;
|
|
|
|
|
import kr.xit.biz.ens.model.kakao.v2.KkotalkDTO;
|
|
|
|
|
import kr.xit.biz.ens.model.kakao.v2.KkotalkDocDTO;
|
|
|
|
|
import kr.xit.biz.ens.model.kt.KtCommonDTO.ErrorMsg;
|
|
|
|
|
import kr.xit.biz.ens.model.kt.KtCommonDTO.KtCommonResponse;
|
|
|
|
|
import kr.xit.biz.ens.model.kt.KtMmsSendDTO.KtMainSendReqData;
|
|
|
|
@ -66,8 +71,13 @@ import lombok.extern.slf4j.Slf4j;
|
|
|
|
|
public class EnsBatchSendService extends AbstractService implements IEnsBatchSendService {
|
|
|
|
|
@Value("${app.contract.host}")
|
|
|
|
|
private String apiHost;
|
|
|
|
|
|
|
|
|
|
@Value("${app.contract.kakao.api.pay.bulksend}")
|
|
|
|
|
private String apiKkoBulkSend;
|
|
|
|
|
private String apiKkopayBulkSend;
|
|
|
|
|
|
|
|
|
|
@Value("${app.contract.kakao.api.talk.bulksend}")
|
|
|
|
|
private String apiKkotalkBulkSend;
|
|
|
|
|
|
|
|
|
|
@Value("${app.contract.kt.api.bulksend}")
|
|
|
|
|
private String apiKtBcBulkSend;
|
|
|
|
|
|
|
|
|
@ -145,7 +155,8 @@ public class EnsBatchSendService extends AbstractService implements IEnsBatchSen
|
|
|
|
|
* 모바일 페이지 생성 : tb_ens_mobile_page_manage
|
|
|
|
|
* 연계발송결과 생성 : tb_cntc_sndng_result
|
|
|
|
|
*/
|
|
|
|
|
case KAKAO -> sendBulkKakaoMyDocs(dto);
|
|
|
|
|
case KAKAO -> sendBulkKakaopay(dto);
|
|
|
|
|
case KAKAO_NEW -> sendBulkKakaotalk(dto);
|
|
|
|
|
case KT_BC -> sendBulkKtBc(dto);
|
|
|
|
|
default -> throw BizRuntimeException.create(String.format("정의 되지 않은 문서 중개자[%s] 입니다", seCode));
|
|
|
|
|
}
|
|
|
|
@ -161,32 +172,32 @@ public class EnsBatchSendService extends AbstractService implements IEnsBatchSen
|
|
|
|
|
* 1. 카카오페이 문서요청 대상 조회
|
|
|
|
|
* - {@link IEnsBatchMapper#selectKakaoSendTgts(Object) selectKakaoSendTgts}
|
|
|
|
|
* 2. 요청 대상 파라메터 set, validtion check
|
|
|
|
|
* - {@link #setKkoMyDocSendBulks}
|
|
|
|
|
* - {@link #validatedKkoMyDocSendBulks}
|
|
|
|
|
* - {@link #setKkopaySendBulks}
|
|
|
|
|
* - {@link #validatedKkopaySendBulks}
|
|
|
|
|
* 3. 카카오페이 문서요청 API 호출
|
|
|
|
|
* -> 결과 목록 획득
|
|
|
|
|
* 4. 카카오페이 문서요청 결과 반영
|
|
|
|
|
* - bulk 전송 기준 모든건이 실패인 경우만 실패 처리
|
|
|
|
|
* -
|
|
|
|
|
* -> {@link EnsBatchExtractService#saveKkoSendResult(String, String, List) saveKkoMyDocResult}
|
|
|
|
|
* -> {@link EnsBatchExtractService#saveKkopaySendResult(String, String, List) saveKkoMyDocResult}
|
|
|
|
|
* - 카카오페이 연계 결과 반영 : tb_ens_kakao_my_doc
|
|
|
|
|
* - 모바일 페이지 생성 : tb_ens_mobile_page_manage
|
|
|
|
|
* - 연계발송결과 생성 : tb_cntc_sndng_result
|
|
|
|
|
* @param dto SndngMssageParam
|
|
|
|
|
* </pre>
|
|
|
|
|
*/
|
|
|
|
|
private void sendBulkKakaoMyDocs(final SndngMssageParam dto) {
|
|
|
|
|
final String url = apiHost + apiKkoBulkSend;
|
|
|
|
|
private void sendBulkKakaopay(final SndngMssageParam dto) {
|
|
|
|
|
final String url = apiHost + apiKkopayBulkSend;
|
|
|
|
|
|
|
|
|
|
final List<SendKakaoTgt> list = mapper.selectKakaoSendTgts(dto);
|
|
|
|
|
final List<SendKakaoTgt> list = mapper.selectKakaopaySendTgts(dto);
|
|
|
|
|
if(list.isEmpty()) return;
|
|
|
|
|
|
|
|
|
|
final String mstId = list.get(0).getSndngMastrId();
|
|
|
|
|
final List<KkopayDocBulkDTO.BulkSendReq> bulkList = setKkoMyDocSendBulks(list);
|
|
|
|
|
final List<KkopayDocBulkDTO.BulkSendReq> bulkList = setKkopaySendBulks(list);
|
|
|
|
|
|
|
|
|
|
// validation check
|
|
|
|
|
try {
|
|
|
|
|
validatedKkoMyDocSendBulks(bulkList);
|
|
|
|
|
validatedKkopaySendBulks(bulkList);
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
extractService.updateSndngMstFailStatus(mstId, SndngSeCode.KAKAO, "", e.getMessage(), "[send]카카오 문서 발송(bulks)요청 실패(파라메터 오류)");
|
|
|
|
|
throw e;
|
|
|
|
@ -224,7 +235,79 @@ public class EnsBatchSendService extends AbstractService implements IEnsBatchSen
|
|
|
|
|
if(!isSuccess){
|
|
|
|
|
extractService.updateSndngMstFailStatus(mstId, SndngSeCode.KAKAO, "", errMsg, errMsg);
|
|
|
|
|
}
|
|
|
|
|
extractService.saveKkoSendResult(mstId, dto.getUnitySndngMastrId(), resList);
|
|
|
|
|
extractService.saveKkopaySendResult(mstId, dto.getUnitySndngMastrId(), resList);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* <pre>
|
|
|
|
|
* 카카오톡 전자고지 send
|
|
|
|
|
* 1. 카카오톡 전자고지 요청 대상 조회
|
|
|
|
|
* - {@link IEnsBatchMapper#selectKakaoSendTgts(Object) selectKakaoSendTgts}
|
|
|
|
|
* 2. 요청 대상 파라메터 set, validtion check
|
|
|
|
|
* - {@link #setKkoNewSendBulks}
|
|
|
|
|
* - {@link #validatedKkoNewSendBulks}
|
|
|
|
|
* 3. 카카오페이 문서요청 API 호출
|
|
|
|
|
* -> 결과 목록 획득
|
|
|
|
|
* 4. 카카오페이 문서요청 결과 반영
|
|
|
|
|
* - bulk 전송 기준 모든건이 실패인 경우만 실패 처리
|
|
|
|
|
* -
|
|
|
|
|
* -> {@link EnsBatchExtractService#saveKkopaySendResult(String, String, List) saveKkoNewSendResult}
|
|
|
|
|
* - 카카오페이 연계 결과 반영 : tb_ens_kakao_my_doc
|
|
|
|
|
* - 모바일 페이지 생성 : tb_ens_mobile_page_manage
|
|
|
|
|
* - 연계발송결과 생성 : tb_cntc_sndng_result
|
|
|
|
|
* @param dto SndngMssageParam
|
|
|
|
|
* </pre>
|
|
|
|
|
*/
|
|
|
|
|
private void sendBulkKakaotalk(final SndngMssageParam dto) {
|
|
|
|
|
final String url = apiHost + apiKkotalkBulkSend;
|
|
|
|
|
|
|
|
|
|
final List<EnsDTO.SendKakaotalkTgt> list = mapper.selectKakaotalkSendTgts(dto);
|
|
|
|
|
if(list.isEmpty()) return;
|
|
|
|
|
|
|
|
|
|
final String mstId = list.get(0).getSndngMastrId();
|
|
|
|
|
final List<KkotalkDocDTO.Envelope> bulkList = setKkotalkSendBulks(list);
|
|
|
|
|
|
|
|
|
|
// validation check
|
|
|
|
|
try {
|
|
|
|
|
validatedKkotalkSendBulks(bulkList);
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
extractService.updateSndngMstFailStatus(mstId, SndngSeCode.KAKAO_NEW, "", e.getMessage(), "[send]카카오톡 전자고지 발송(bulks)요청 실패(파라메터 오류)");
|
|
|
|
|
throw e;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
final List<List<KkotalkDocDTO.Envelope>> partitions = ListUtils.partition(bulkList, bulkKkoMaxCnt);
|
|
|
|
|
//noinspection rawtypes
|
|
|
|
|
final List<ApiResponseDTO> apiResults = partitions.stream()
|
|
|
|
|
.map(bulkSendList -> apiWebClient.exchange(
|
|
|
|
|
url,
|
|
|
|
|
HttpMethod.POST,
|
|
|
|
|
KkotalkDTO.BulkSendRequest.builder()
|
|
|
|
|
.signguCode(dto.getSignguCode())
|
|
|
|
|
.ffnlgCode(dto.getFfnlgCode())
|
|
|
|
|
.envelopes(bulkSendList)
|
|
|
|
|
.build(),
|
|
|
|
|
ApiResponseDTO.class,
|
|
|
|
|
CmmEnsBizUtils.getHeadeMap())
|
|
|
|
|
)
|
|
|
|
|
.toList();
|
|
|
|
|
|
|
|
|
|
final List<KkotalkDTO.BulkSendResponse> resList = new ArrayList<>();
|
|
|
|
|
boolean isSuccess = false;
|
|
|
|
|
String errMsg = null;
|
|
|
|
|
//noinspection rawtypes
|
|
|
|
|
for(ApiResponseDTO apiResult : apiResults) {
|
|
|
|
|
if(apiResult.getData() != null) {
|
|
|
|
|
resList.add(toObjByObj(apiResult.getData(), KkotalkDTO.BulkSendResponse.class));
|
|
|
|
|
isSuccess = true;
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
errMsg = apiResult.getMessage();
|
|
|
|
|
}
|
|
|
|
|
// 카카오 send 결과 반영
|
|
|
|
|
if(!isSuccess){
|
|
|
|
|
extractService.updateSndngMstFailStatus(mstId, SndngSeCode.KAKAO_NEW, "", errMsg, errMsg);
|
|
|
|
|
}
|
|
|
|
|
extractService.saveKkoNewSendResult(mstId, dto.getUnitySndngMastrId(), resList);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
@ -233,7 +316,7 @@ public class EnsBatchSendService extends AbstractService implements IEnsBatchSen
|
|
|
|
|
* @param list List<EnsDTO.SendKakaoTgt> 문서발송요청 대상 목록
|
|
|
|
|
* @return List<KkopayDocBulkDTO.BulkSendReq>
|
|
|
|
|
*/
|
|
|
|
|
private static List<KkopayDocBulkDTO.BulkSendReq> setKkoMyDocSendBulks(List<SendKakaoTgt> list) {
|
|
|
|
|
private static List<KkopayDocBulkDTO.BulkSendReq> setKkopaySendBulks(List<SendKakaoTgt> list) {
|
|
|
|
|
final List<KkopayDocBulkDTO.BulkSendReq> bulkList = new ArrayList<>();
|
|
|
|
|
|
|
|
|
|
for (SendKakaoTgt sendTgtDTO : list) {
|
|
|
|
@ -283,12 +366,54 @@ public class EnsBatchSendService extends AbstractService implements IEnsBatchSen
|
|
|
|
|
return bulkList;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* GET 카카오톡 전자고지 발송요청 파라메터 목록
|
|
|
|
|
* - CI 인증인 경우 개인 정보 삭제
|
|
|
|
|
* @param list List<EnsDTO.SendKakaoNewTgt> 문서발송요청 대상 목록
|
|
|
|
|
* @return List<KkoNewDocAttrDTO.Send>
|
|
|
|
|
*/
|
|
|
|
|
private static List<KkotalkDocDTO.Envelope> setKkotalkSendBulks(List<EnsDTO.SendKakaotalkTgt> list) {
|
|
|
|
|
final List<KkotalkDocDTO.Envelope> bulkList = new ArrayList<>();
|
|
|
|
|
|
|
|
|
|
for (EnsDTO.SendKakaotalkTgt sendTgtDTO : list) {
|
|
|
|
|
/*
|
|
|
|
|
방어 코드 추가 : CI 인증인 경우 개인정보 삭제
|
|
|
|
|
*/
|
|
|
|
|
KkotalkDocDTO.Envelope bulkReqDTO = null;
|
|
|
|
|
if(StringUtils.isNotEmpty(sendTgtDTO.getCi())){
|
|
|
|
|
bulkReqDTO = KkotalkDocDTO.Envelope.builder()
|
|
|
|
|
.ci(sendTgtDTO.getCi())
|
|
|
|
|
.build();
|
|
|
|
|
}else{
|
|
|
|
|
bulkReqDTO = KkotalkDocDTO.Envelope.builder()
|
|
|
|
|
.build();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
final KkotalkDocDTO.Content content = KkotalkDocDTO.Content.builder()
|
|
|
|
|
.link(sendTgtDTO.getContentLink())
|
|
|
|
|
.build();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bulkReqDTO.setExternalId(sendTgtDTO.getUnitySndngDetailId());
|
|
|
|
|
bulkReqDTO.setTitle(sendTgtDTO.getTitle());
|
|
|
|
|
bulkReqDTO.setPayload(sendTgtDTO.getPayload());
|
|
|
|
|
bulkReqDTO.setReadExpiresAt(sendTgtDTO.getReadExpiresAt());
|
|
|
|
|
bulkReqDTO.setReviewExpiresAt(sendTgtDTO.getReviewExpiresAt());
|
|
|
|
|
bulkReqDTO.setHash(sendTgtDTO.getHash());
|
|
|
|
|
bulkReqDTO.setGuide(sendTgtDTO.getGuide());
|
|
|
|
|
bulkReqDTO.setContent(content);
|
|
|
|
|
|
|
|
|
|
bulkList.add(bulkReqDTO);
|
|
|
|
|
}
|
|
|
|
|
return bulkList;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 카카오문서 발송요청 파라메터 유효성 체크
|
|
|
|
|
*
|
|
|
|
|
* @param bulkList List<KkopayDocBulkDTO.BulkSendReq> 카카오내문서함 발송요청 파라메터 목록
|
|
|
|
|
*/
|
|
|
|
|
private void validatedKkoMyDocSendBulks(List<KkopayDocBulkDTO.BulkSendReq> bulkList) {
|
|
|
|
|
private void validatedKkopaySendBulks(List<KkopayDocBulkDTO.BulkSendReq> bulkList) {
|
|
|
|
|
List<String> errors = new ArrayList<>();
|
|
|
|
|
int idx = 0;
|
|
|
|
|
|
|
|
|
@ -334,6 +459,59 @@ public class EnsBatchSendService extends AbstractService implements IEnsBatchSen
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 카카오톡 전자고지 발송요청 파라메터 유효성 체크
|
|
|
|
|
*
|
|
|
|
|
* @param bulkList List<KkoNewDocBulkDTO.Send> 카카오톡 전자고지 발송요청 파라메터 목록
|
|
|
|
|
*/
|
|
|
|
|
private void validatedKkotalkSendBulks(List<KkotalkDocDTO.Envelope> bulkList) {
|
|
|
|
|
List<String> errors = new ArrayList<>();
|
|
|
|
|
int idx = 0;
|
|
|
|
|
|
|
|
|
|
for (KkotalkDocDTO.Envelope dto : bulkList) {
|
|
|
|
|
final Set<ConstraintViolation<KkotalkDocDTO.Envelope>> errList = validator.validate(dto);
|
|
|
|
|
|
|
|
|
|
if(!errList.isEmpty()) {
|
|
|
|
|
int finalIdx = idx;
|
|
|
|
|
errors.addAll(errList.stream()
|
|
|
|
|
.map(row -> String.format("%s[%d]=%s", row.getPropertyPath(), finalIdx + 1,
|
|
|
|
|
row.getMessageTemplate()))
|
|
|
|
|
.toList()
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(dto.getReadExpiresAt() == null){
|
|
|
|
|
Objects.requireNonNull(errors).add("최초 열람 만료 일시는 필수입니다.");
|
|
|
|
|
}
|
|
|
|
|
if(dto.getReadExpiresAt() != null && dto.getReviewExpiresAt() != null){
|
|
|
|
|
DateTimeFormatter pattern1 = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss");
|
|
|
|
|
LocalDateTime parse1 = LocalDateTime.parse(dto.getReadExpiresAt(), pattern1);
|
|
|
|
|
LocalDateTime parse2 = LocalDateTime.parse(dto.getReviewExpiresAt(), pattern1);
|
|
|
|
|
if(parse1.isAfter(parse2)) Objects.requireNonNull(errors).add("재열람 만료 일시는 최초 열람 만료 일시보다 이전일 수 없습니다.");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (Checks.isEmpty(dto.getCi())) {
|
|
|
|
|
// if (Checks.isEmpty(dto.getName())) {
|
|
|
|
|
// errors.add(
|
|
|
|
|
// String.format("받는이 이름은 필수입니다(receiver.name[%d] 번째 오류)", idx + 1));
|
|
|
|
|
// }
|
|
|
|
|
// if (Checks.isEmpty(dto.getPhoneNumber())) {
|
|
|
|
|
// errors.add(String.format("받는이 전화번호는 필수입니다(receiver.phone_number[%d] 번째 오류)",
|
|
|
|
|
// idx + 1));
|
|
|
|
|
// }
|
|
|
|
|
// if (Checks.isEmpty(dto.getBirthday())) {
|
|
|
|
|
// errors.add(
|
|
|
|
|
// String.format("받는이 생년월일은 필수입니다(receiver.birthday[%d] 번째 오류)", idx + 1));
|
|
|
|
|
// }
|
|
|
|
|
}
|
|
|
|
|
idx++;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!errors.isEmpty()) {
|
|
|
|
|
throw BizRuntimeException.create(errors.toString());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* <pre>
|
|
|
|
|
* KT BC 문서 send
|
|
|
|
|