feat: KT BC, Post Plus feat

dev
gitea-관리자 1 year ago
parent 68dc84dd65
commit c04c3c4920

@ -98,6 +98,8 @@ public class BizKtMmsService extends EgovAbstractServiceImpl implements IBizKtMm
.srcSeq("1") .srcSeq("1")
.ci("1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678") .ci("1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678")
.mmsDtlCnts("db") .mmsDtlCnts("db")
// TODO:: mybatis에서 처리 - SHA2(teusd.unity_sndng_detail_id, 256)
//.docHash(Base64.getEncoder().encodeToString("db".getBytes(StandardCharsets.UTF_8)))
.docHash("db") .docHash("db")
.mmsTitle("") .mmsTitle("")
.url(CALLBACK_URL) //distInfoCrtYn - N이면 필수 .url(CALLBACK_URL) //distInfoCrtYn - N이면 필수

@ -57,7 +57,8 @@ contract:
# 사전/본 문자 발송/수신 결과 전송 : BC-AG-SN-010 # 사전/본 문자 발송/수신 결과 전송 : BC-AG-SN-010
result-message: /api/ag/message/result result-message: /api/ag/message/result
# 토큰인증확인 : 본문자수신등록 callback url # 토큰인증확인 : 본문자수신등록 callback url
callback-url: http://211.119.124.7:8081/api/biz/kt/v1/cfmToken dp-callback-url: http://211.119.124.7:8081/api/biz/kt/v1/cfmTokenDP
me-callback-url: http://211.119.124.7:8081/api/biz/kt/v1/cfmTokenMe
# 사전문자수신등록 : BC-AG-SN-001 # 사전문자수신등록 : BC-AG-SN-001
before-send: /api/message/before/send before-send: /api/message/before/send

@ -2,14 +2,15 @@ package kr.xit.biz.ens.mapper;
import java.util.List; import java.util.List;
import java.util.Optional; import java.util.Optional;
import kr.xit.biz.ens.model.EnsDTO;
import kr.xit.biz.ens.model.EnsDTO.SndngMssageParam;
import kr.xit.biz.ens.model.cntc.CntcDTO; import kr.xit.biz.ens.model.cntc.CntcDTO;
import kr.xit.biz.ens.model.kakao.KkopayDocBulkDTO.BulkStatus; import kr.xit.biz.ens.model.kakao.KkopayDocBulkDTO.BulkStatus;
import kr.xit.biz.ens.model.kakao.KkopayDocDTO.OneTimeToken; import kr.xit.biz.ens.model.kakao.KkopayDocDTO.OneTimeToken;
import kr.xit.biz.ens.model.kt.KtMmsSendDTO.KtMainSendReqData;
import kr.xit.biz.ens.model.kt.KtMmsSendDTO.KtMainSendRequest;
import org.egovframe.rte.psl.dataaccess.mapper.Mapper; import org.egovframe.rte.psl.dataaccess.mapper.Mapper;
import kr.xit.biz.ens.model.EnsDTO;
/** /**
* <pre> * <pre>
* description : * description :
@ -287,6 +288,9 @@ public interface IEnsBatchMapper {
* </pre> * </pre>
*/ */
<T> int updateProcessSttusSndngMst(final T t); <T> int updateProcessSttusSndngMst(final T t);
Optional<KtMainSendRequest> selectKtBcSendMstTgtInfo(final SndngMssageParam tgtDTO);
List<KtMainSendReqData> selectKtBcSendTgts(final SndngMssageParam tgtDTO);
//---------------------------------------------------------------------- //----------------------------------------------------------------------
// send // send
//---------------------------------------------------------------------- //----------------------------------------------------------------------
@ -380,4 +384,5 @@ public interface IEnsBatchMapper {
* </pre> * </pre>
*/ */
EnsDTO.MobilePageManage selectKkoMobilePage(final OneTimeToken dto); EnsDTO.MobilePageManage selectKkoMobilePage(final OneTimeToken dto);
} }

@ -1,6 +1,7 @@
package kr.xit.biz.ens.mapper; package kr.xit.biz.ens.mapper;
import kr.xit.biz.ens.model.EnsDTO; import kr.xit.biz.ens.model.EnsDTO;
import kr.xit.biz.ens.model.EnsDTO.EnsNtncCntcSndngTgt;
import org.egovframe.rte.psl.dataaccess.mapper.Mapper; import org.egovframe.rte.psl.dataaccess.mapper.Mapper;
import java.util.List; import java.util.List;
@ -25,8 +26,8 @@ public interface IEnsCctvFileMapper {
int selectLicense(String jobSeCode); int selectLicense(String jobSeCode);
int insertNtcnCntcData(EnsDTO.NtcnCntcData dto); int insertNtcnCntcData(EnsDTO.NtcnCntcData dto);
List<EnsDTO.EnsNtncCntcSndngTgts> selectEnsNtncCntcSndngs(); List<EnsNtncCntcSndngTgt> selectEnsNtncCntcSndngs();
int insertCntcSndngMst(EnsDTO.EnsNtncCntcSndngTgts dto); int insertCntcSndngMst(EnsNtncCntcSndngTgt dto);
int insertCntcSndngDtl(EnsDTO.EnsNtncCntcSndngTgts dto); int insertCntcSndngDtl(EnsNtncCntcSndngTgt dto);
int updateEnsNtcnCntcData(EnsDTO.EnsNtncCntcSndngTgts dto); int updateEnsNtcnCntcData(EnsNtncCntcSndngTgt dto);
} }

@ -1,22 +1,25 @@
package kr.xit.biz.ens.model; package kr.xit.biz.ens.model;
import java.io.Serializable;
import java.time.LocalDateTime;
import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer; import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import java.io.Serializable;
import java.time.LocalDateTime;
import javax.validation.constraints.Digits;
import javax.validation.constraints.Size;
import kr.xit.biz.common.ApiConstants; import kr.xit.biz.common.ApiConstants;
import kr.xit.biz.ens.model.cmm.CmmEnsRequestDTO; import kr.xit.biz.ens.model.cmm.CmmEnsRequestDTO;
import kr.xit.biz.ens.model.kt.KtMmsSendDTO.KtMainSendRequest;
import kr.xit.core.biz.model.AuditFields; import kr.xit.core.biz.model.AuditFields;
import lombok.*; import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.ToString;
import lombok.experimental.SuperBuilder; import lombok.experimental.SuperBuilder;
import javax.validation.constraints.Digits;
import javax.validation.constraints.Size;
/** /**
* <pre> * <pre>
* description : tb_ens_ Entity DTO * description : tb_ens_ Entity DTO
@ -114,7 +117,7 @@ public class EnsDTO {
@AllArgsConstructor @AllArgsConstructor
@SuperBuilder @SuperBuilder
@EqualsAndHashCode(callSuper = true) @EqualsAndHashCode(callSuper = true)
public static class SendKakaoTgt extends EnsDTO.KakaoMyDoc implements Serializable { public static class SendKakaoTgt extends EnsDTO.KakaoMyDoc {
/** /**
* id * id
@ -904,7 +907,7 @@ public class EnsDTO {
@NoArgsConstructor @NoArgsConstructor
@AllArgsConstructor @AllArgsConstructor
@SuperBuilder @SuperBuilder
public static class EnsNtncCntcSndngTgts implements Serializable { public static class EnsNtncCntcSndngTgt implements Serializable {
/** /**
* data id * data id
*/ */
@ -994,4 +997,394 @@ public class EnsDTO {
@Builder.Default @Builder.Default
private String sndngProcessSttus = ApiConstants.SndngProcessStatus.ACCEPT.getCode(); private String sndngProcessSttus = ApiConstants.SndngProcessStatus.ACCEPT.getCode();
} }
@Data
@NoArgsConstructor
@AllArgsConstructor
@SuperBuilder
@EqualsAndHashCode(callSuper = true)
public static class KtBcSendTgtInfo extends KtMainSendRequest { //KtBcSendReqData {
@Builder.Default
private String sndngTyCode = "ENS";
/**
* FIXME ::
* 릿 ID
*/
private String tmplatId;
/**
*
*/
private String tgtYn;
/**
* ID
*/
private String unitySndngMastrId;
/**
* ID
*/
private String unitySndngDetailId;
/**
*
*/
@Builder.Default
private String sndngProcessSttus = ApiConstants.SndngProcessStatus.ACCEPT.getCode();
// //-------------------------------------------------------------------
// // 필수
// //-------------------------------------------------------------------
// /**
// * <pre>
// * 서비스 코드: 필수 - 20
// * BizCenter에서 발행한 기관의 서비스 코드
// * </pre>
// */
// private String serviceCd;
//
// /**
// * <pre>
// * 서비스 코드: 필수 - 16
// * BizCenter에서 발행한 기관의 서비스 코드 인증키
// * </pre>
// */
// private String serviceKey;
//
// /**
// * <pre>
// * 문서 코드: 필수 - 5
// * 문서코드에 따라 발신번호 Mapping
// * </pre>
// */
// private String msgCd;
//
// /**
// * <pre>
// * 문발송 메시지 타입: 필수 - 1
// * RCS/xMS (RCS :1, xMS: 2)
// * </pre>
// */
// private final String msgType = "2";
//
// /**
// * <pre>
// * 발송시작일시: 필수 - 14
// * 메시지 발송 처리 시작일시(YYYYMMDDHHMiSS)
// * </pre>
// */
// private String makeDt;
//
// /**
// * <pre>
// * 발송마감시간: 필수 - 14
// * 메시지 발송에 대한 마감시간(YYYYMMDDHHMiSS)
// * </pre>
// */
// private String sndnExTime;
//
// /**
// * <pre>
// * 열람마감시간: 필수 - 14
// * 문서열람에 대한 마감시간(YYYYMMDDHHMiSS)
// * </pre>
// */
// private String exTime;
//
// /**
// * <pre>
// * 문서종류: 필수 - 3
// * 메시지타입(과금코드)
// * 3: LMS
// * 4: MMS
// * 6: RCS
// * </pre>
// */
// private final String m_type = "4";
//
// /**
// * <pre>
// * 발송요청건수: 필수 - 8
// * 발송메세지의 총 건수
// * </pre>
// */
// private Integer sndnTotCnt;
//
// private List<KtMainSendReqData> reqs;
// //-------------------------------------------------------------------
//
// /**
// * <pre>
// * 대행사 코드: max 10
// * msg_type 1(RCS 메세지인 경우)인 경우 필수
// * LG U+에서 사용되며 기관에서 등록한 대행사 코드의 값 default 'lguplus'
// * </pre>
// */
// private String agencyId;
//
// /**
// * <pre>
// * 부서 코드: max 5
// * 기관에 따른 부서 코드
// * </pre>
// */
// private String deptCd;
//
// /**
// * <pre>
// * 발송 번호: max 20
// * 문서코드 등록시 발신번호 Mapping
// * Biz.center 등록시 통신사실증명원 등록(민간)
// *
// * API에 있는 경우 API 발송 번호를 우선으로 하고, 없는 경우 문서코드 등록시 입력된 발신번호를 사용한다.
// * </pre>
// */
// private String sndTelNo;
//
// /**
// * <pre>
// * 메세지발송구분: max 1
// * 3: 하이브리드
// *
// * 값이 null인 경우 default 1(OPT_OUT 본문)로 P/F 전송 됨
// * 마케팅수신동의 고객인 경우 5 또는 7 코드를 전송해야 함.
// * </pre>
// */
// private final String optType = "1";
//
// /**
// * <pre>
// * RCS 브랜드홈 값 : max 30
// * msg_type 1(RCS 메시지)인 경우 필수
// * </pre>
// */
// private String brandId;
//
// /**
// * <pre>
// * 토큰확인대체여부 : Y|N
// * Y 인경우 본인인증시 열람확인처리
// * </pre>
// */
// private String tknRpmtYn;
//
// /**
// * <pre>
// * 열람확인대체여부 : Y|N
// * Y 인경우 토큰인증시 열람확인처리
// * </pre>
// */
// private String rdngRpmtYn;
//
// /**
// * <pre>
// * MMS 바이너리 : 가변 - MMS 필수
// * 이미지 등 Binary (용량 : 300KB 이내)
// * </pre>
// */
// private String mmsBinary;
//
// /**
// * <pre>
// * MMS 바이너리 파일포맷(확장자) : 10
// * MMS 바이너리 값이 있는 경우 필수
// * </pre>
// */
// private String fileFmat;
//
// /**
// * <pre>
// * 마케팅 수신 동의 : 1
// * Y : 동의, N : 비동의 (NULL인 경우 비동의 처리)
// * </pre>
// */
// private String mktnRcveCsyn;
//
// /**
// * <pre>
// * 송신자 플랫폼 ID : max 25
// * 타 중계기관(포스토피아)에서 발송 요청인 경우 필수
// * 송신중계자(포스토피아) 플랫폼 ID
// * </pre>
// */
// private String sndPlfmId;
//
// /**
// * <pre>
// * 송신 공인전자주소 : max 100
// * 타 중계기관(포스토피아)에서 발송 요청인 경우 필수
// * 중계자 전자유통정보 등록을 위한 송신 공인전자주소
// * </pre>
// */
// private String sndNpost;
//
// /**
// * <pre>
// * 송신일시 : 14(YYYYMMDDHHMISS)
// * 타 중계기관(포스토피아)에서 발송 요청인 경우 필수
// * 중계자간의 발송시 유통정보의 송신일시는 송신중계자의 송신일시로 적용
// * </pre>
// */
// private String sndDate;
//
// /**
// * <pre>
// * 다회선 사용자 처리구분 : 1
// * 1 : 다회선 모두 발송
// * 2 : 다회선 발송 제외(default) (NULL 일경우 동일취급)
// * 3 : 다회선 중 임의 1회선 발송
// * </pre>
// */
// private String multiMblPrcType;
//
// /**
// * <pre>
// * 테스트 발송여부 : 1
// * Y : 테스트 발송 (KISA 연동, 통계, 이력 제외)
// * N : 실발송(NULL일경우 동일 취급)
// * </pre>
// */
// private String testSndnYn;
//
// /**
// * <pre>
// * 수신거부해제 여부 : 1
// * Y : 해제 (수신거부 시 수신거부 해제)
// * N : 미해제(NULL일경우 동일취급)
// * </pre>
// */
// private String rcvRfrlYn;
//
//
// /**
// * <pre>
// * 재열람 일수 : max 3
// * 값이 있을 경우 발송시작일시+재열람 일수 동안 재열람
// * 값이 없을 경우 열람마감이후 열람 불가
// * </pre>
// */
// private String reopenDay;
}
// @Data
// @NoArgsConstructor
// @AllArgsConstructor
// @SuperBuilder
// public static class KtBcSendReqData {
// //-------------------------------------------------------------------
// // 필수
// //-------------------------------------------------------------------
// /**
// * 관리키 : 고객메시지 건별 Unique key
// */
// private String srcKey;
//
// /**
// * 리스트순번 : max 8자리
// */
// private String srcSeq;
//
// /**
// * 개인식별코드 : 88 자리
// */
// private String ci;
//
// /**
// * <pre>
// * MMS 상세내용 : max 4000
// * URL 없음
// * {#INFO_CFRM_STR}, {#RCVE_RF_STR} 문자열이 없는 경우 요청 거부 처리 함.
// * 단, 유통정보미생성여부가 'Y'인 경우 {#RCVE_RF_STR} 문자열만 체크.
// * </pre>
// */
// private String mmsDtlCnts;
//
// /**
// * 문서해시 : max 100
// */
// private String docHash;
// //-------------------------------------------------------------------
//
// /**
// * <pre>
// * MMS 제목 : max 40
// * utf-8 한글20자
// * </pre>
// */
// private String mmsTitle;
//
// /**
// * <pre>
// * RCS 상세내용 : max 4000 - RCS|Binary 전송시 필수
// * RCS 메시지 fallback 시 mms_dtl_cnts를 사용하며
// * RCS title은 mms_title 항목을 함께 사용한다.
// * </pre>
// */
// private String rcsDtlCnts;
//
// /**
// * <pre>
// * 연결 URL : max 1000
// * dist_info_crt_yn의 값이 'Y'가 아닌 경우 필수
// * </pre>
// */
// @Setter
// private String url;
//
// /**
// * <pre>
// * MMS 바이너리 : 가변 - MMS 필수
// * 이미지 등 Binary (용량 : 300KB 이내)
// * </pre>
// */
// private String mmsBinary;
//
// /**
// * <pre>
// * MMS 바이너리 파일포맷(확장자) : 10
// * MMS 바이너리 값이 있는 경우 필수
// * </pre>
// */
// private String fileFmat;
//
// /**
// * <pre>
// * 개인휴대전화번호 : 11 자리
// * 특정 MDN으로 발송할 경우
// * </pre>
// */
// private String mdn;
//
// /**
// * <pre>
// * 유통정보 미생성여부 : Y|N
// * Y : 본문자 발송 중 안내문확인하기 문구 및 URL이 표기 되지 않아야 함.(KISA 유통정보 생성 하지 않음)
// * N Or NULL인 경우 안내문확인하기 문구 및 URL이 표기
// * </pre>
// */
// private String distInfoCrtYn;
//
// /**
// * <pre>
// * 안내문 확인하기 치환문구 : max 50
// * 안내문 확인하기 예약어로써 API에 추가 될 {#INFO_CFRM_STR} 항목에 있는 문구를 치환 하여 사용 한다.
// * 항목이 NULL인 경우 default로 아래 문구를 사용 한다.
// * ‘○ 안내문 확인하기 :
// * RCS 버튼명 사용이 가능(한글은 최대 17자 권고)
// * </pre>
// */
// private String infoCfrmStr;
//
// /**
// * <pre>
// * 수신거부 및 수신 휴대폰 지정하기 치환문구 : max 50
// * 수신거부 및 수신 휴대폰 지정하기 예약어로써 API에 추가 될 {#RCVE_RF_STR} 항목에 있는 문구를 치환하여 사용 한다.
// * 항목이 NULL인 경우 default로 아래 문구를 사용 한다.
// * "○ 수신거부 및 수신 휴대폰 지정하기 : "
// * RCS 버튼명 사용이 가능(한글은 최대 17자 권고)
// * </pre>
// */
// private String rcveRfStr;
// }
} }

@ -11,6 +11,7 @@ import kr.xit.biz.common.ApiConstants;
import kr.xit.biz.common.ApiConstants.SndngSeCode; import kr.xit.biz.common.ApiConstants.SndngSeCode;
import kr.xit.biz.ens.mapper.IEnsBatchMapper; import kr.xit.biz.ens.mapper.IEnsBatchMapper;
import kr.xit.biz.ens.model.EnsDTO; import kr.xit.biz.ens.model.EnsDTO;
import kr.xit.biz.ens.model.EnsDTO.SndngMssageParam;
import kr.xit.biz.ens.model.cntc.CntcDTO; import kr.xit.biz.ens.model.cntc.CntcDTO;
import kr.xit.biz.ens.model.kakao.KkopayDocBulkDTO.BulkSendResponses; import kr.xit.biz.ens.model.kakao.KkopayDocBulkDTO.BulkSendResponses;
import kr.xit.biz.sms.service.ISmsMessageService; import kr.xit.biz.sms.service.ISmsMessageService;
@ -131,11 +132,23 @@ public class EnsBatchRequireNewService extends EgovAbstractServiceImpl implement
updateStepSendMststatus(paramDTO, "SMS"); updateStepSendMststatus(paramDTO, "SMS");
} }
//----------------------------------------------------------------------------------------------------------------- @Override
public void sendKtBc(SndngMssageParam tgtDTO) {
// KtMainSendRequest infoDto = mapper.selectKtBcSendMstTgtInfo(tgtDTO)
// .orElseThrow(() -> BizRuntimeException.create("KT BC 본문자 수신 등록 대상이 존재 하지 않습니다 "));
// infoDto.getReqs().addAll(
// mapper.selectKtBcSendTgts(tgtDTO)
// );
}
@Override
public void sendPostPlus(SndngMssageParam tgtDTO) {
}
//-----------------------------------------------------------------------------------------------------------------
// private method
//-----------------------------------------------------------------------------------------------------------------
/** /**
* (tb_cntc_sndng_result) * (tb_cntc_sndng_result)
* *

@ -28,6 +28,9 @@ import kr.xit.biz.ens.model.kakao.KkopayDocBulkDTO.BulkSendResponses;
import kr.xit.biz.ens.model.kakao.KkopayDocBulkDTO.BulkStatusRequests; import kr.xit.biz.ens.model.kakao.KkopayDocBulkDTO.BulkStatusRequests;
import kr.xit.biz.ens.model.kakao.KkopayDocBulkDTO.BulkStatusResponses; import kr.xit.biz.ens.model.kakao.KkopayDocBulkDTO.BulkStatusResponses;
import kr.xit.biz.ens.model.kakao.KkopayDocBulkDTO.PropertyBulk; import kr.xit.biz.ens.model.kakao.KkopayDocBulkDTO.PropertyBulk;
import kr.xit.biz.ens.model.kt.KtCommonDTO.KtCommonResponse;
import kr.xit.biz.ens.model.kt.KtMmsSendDTO.KtMainSendReqData;
import kr.xit.biz.ens.model.kt.KtMmsSendDTO.KtMainSendRequest;
import kr.xit.core.exception.BizRuntimeException; import kr.xit.core.exception.BizRuntimeException;
import kr.xit.core.model.ApiResponseDTO; import kr.xit.core.model.ApiResponseDTO;
import kr.xit.core.spring.util.ApiWebClientUtil; import kr.xit.core.spring.util.ApiWebClientUtil;
@ -63,12 +66,16 @@ import org.springframework.transaction.annotation.Transactional;
@RequiredArgsConstructor @RequiredArgsConstructor
@Service @Service
public class EnsBatchService extends EgovAbstractServiceImpl implements IEnsBatchService { public class EnsBatchService extends EgovAbstractServiceImpl implements IEnsBatchService {
@Value("${contract.kakao.host}") @Value("${contract.host}")
private String apiHost; private String apiHost;
@Value("${contract.kakao.api.bulksend}") @Value("${contract.kakao.api.bulksend}")
private String apiBulkSend; private String apiKkoBulkSend;
@Value("${contract.kakao.api.bulkstatus}") @Value("${contract.kakao.api.bulkstatus}")
private String apiBulkStatus; private String apiKkoBulkStatus;
@Value("${contract.kt.api.bulksend}")
private String apiKtBcBulkSend;
@Value("${contract.kt.api.bulkstatus}")
private String apiKtBcBulkStatus;
private static final String profile = System.getProperty("spring.profiles.active"); private static final String profile = System.getProperty("spring.profiles.active");
@ -80,7 +87,10 @@ public class EnsBatchService extends EgovAbstractServiceImpl implements IEnsBatc
.getValidator(); .getValidator();
@Value("${contract.kakao.bulk-max-cnt}") @Value("${contract.kakao.bulk-max-cnt}")
private int bulkMaxCnt; private int bulkKkoMaxCnt;
@Value("${contract.kt.bulk-max-cnt}")
private int bulkKtMaxCnt;
private static final String SNDNG_PROCESS_STTUS = "sndngProcessSttus"; private static final String SNDNG_PROCESS_STTUS = "sndngProcessSttus";
private static final String UNITY_SNDNG_MST_ID = "unitySndngMastrId"; private static final String UNITY_SNDNG_MST_ID = "unitySndngMastrId";
@ -304,24 +314,15 @@ public class EnsBatchService extends EgovAbstractServiceImpl implements IEnsBatc
// 업무 문서 구분에 따른 분기 // 업무 문서 구분에 따른 분기
switch (SndngSeCode.compare(tryVal[tgtDTO.getTrySeq() - 1])) { switch (SndngSeCode.compare(tryVal[tgtDTO.getTrySeq() - 1])) {
// 카카오 case KAKAO -> sendBulkKakaoMyDocs(tgtDTO);
case KAKAO: case KT_BC -> sendBulkKtBc(tgtDTO);
sendBulkKakaoMyDocs(tgtDTO); case PPLUS -> sendBulkPplus(tgtDTO);
break; case E_GREEN -> requireNewService.sendEgreen(tgtDTO);
case SMS -> requireNewService.sendSms(tgtDTO);
// E-GREEN
case E_GREEN:
requireNewService.sendEgreen(tgtDTO);
break;
// SMS
case SMS:
requireNewService.sendSms(tgtDTO);
break;
default:
break;
} }
throw BizRuntimeException.create(
String.format("정의 되지 않은 문서 중개자[%s] 입니다", tryVal[tgtDTO.getTrySeq() - 1])
);
} }
} }
@ -333,11 +334,11 @@ public class EnsBatchService extends EgovAbstractServiceImpl implements IEnsBatc
@Override @Override
@Transactional @Transactional
public void findKkoMyDocStatusBulks(final EnsDTO.BatchEnsRequest reqDTO) { public void findKkoMyDocStatusBulks(final EnsDTO.BatchEnsRequest reqDTO) {
final String url = apiHost + apiBulkStatus; final String url = apiHost + apiKkoBulkStatus;
final List<String> docsBinderUuids = mapper.selectKakaoStatusTgts(reqDTO.getSndngProcessSttus()); final List<String> docsBinderUuids = mapper.selectKakaoStatusTgts(reqDTO.getSndngProcessSttus());
List<List<String>> partitions = ListUtils.partition(docsBinderUuids, bulkMaxCnt); List<List<String>> partitions = ListUtils.partition(docsBinderUuids, bulkKkoMaxCnt);
List<ApiResponseDTO<KkopayDocBulkDTO.BulkStatusResponses>> apiResults = partitions.stream() List<ApiResponseDTO<KkopayDocBulkDTO.BulkStatusResponses>> apiResults = partitions.stream()
.map(uuids -> .map(uuids ->
ApiResponseDTO.success( ApiResponseDTO.success(
@ -471,7 +472,7 @@ public class EnsBatchService extends EgovAbstractServiceImpl implements IEnsBatc
List<String> errors = new ArrayList<>(); List<String> errors = new ArrayList<>();
int idx = 0; int idx = 0;
List<List<EnsDTO.sndngVali>> arrList = ListUtils.partition(valiList, bulkMaxCnt); List<List<EnsDTO.sndngVali>> arrList = ListUtils.partition(valiList, bulkKkoMaxCnt);
for (List<EnsDTO.sndngVali> list : arrList) { for (List<EnsDTO.sndngVali> list : arrList) {
for (EnsDTO.sndngVali dto : list) { for (EnsDTO.sndngVali dto : list) {
Set<ConstraintViolation<EnsDTO.sndngVali>> errList = validator.validate(dto); Set<ConstraintViolation<EnsDTO.sndngVali>> errList = validator.validate(dto);
@ -672,8 +673,14 @@ public class EnsBatchService extends EgovAbstractServiceImpl implements IEnsBatc
// send // send
//----------------------------------------------------------------------------------------------------------------- //-----------------------------------------------------------------------------------------------------------------
/**
* <pre>
* send
* @param tgtDTO SndngMssageParam
* </pre>
*/
private void sendBulkKakaoMyDocs(final EnsDTO.SndngMssageParam tgtDTO) { private void sendBulkKakaoMyDocs(final EnsDTO.SndngMssageParam tgtDTO) {
final String url = apiHost + apiBulkSend; final String url = apiHost + apiKkoBulkSend;
final List<SendKakaoTgt> list = mapper.selectKakaoSendTgts(tgtDTO); final List<SendKakaoTgt> list = mapper.selectKakaoSendTgts(tgtDTO);
final List<BulkSendReq> bulkList = new ArrayList<>(); final List<BulkSendReq> bulkList = new ArrayList<>();
@ -689,7 +696,7 @@ public class EnsBatchService extends EgovAbstractServiceImpl implements IEnsBatc
throw e; throw e;
} }
List<List<BulkSendReq>> partitions = ListUtils.partition(bulkList, bulkMaxCnt); List<List<BulkSendReq>> partitions = ListUtils.partition(bulkList, bulkKkoMaxCnt);
List<ApiResponseDTO<BulkSendResponses>> apiResults = partitions.stream() List<ApiResponseDTO<BulkSendResponses>> apiResults = partitions.stream()
@ -788,7 +795,7 @@ public class EnsBatchService extends EgovAbstractServiceImpl implements IEnsBatc
List<String> errors = new ArrayList<>(); List<String> errors = new ArrayList<>();
int idx = 0; int idx = 0;
List<List<BulkSendReq>> arrList = ListUtils.partition(bulkList, bulkMaxCnt); List<List<BulkSendReq>> arrList = ListUtils.partition(bulkList, bulkKkoMaxCnt);
for (List<BulkSendReq> list : arrList) { for (List<BulkSendReq> list : arrList) {
for (KkopayDocBulkDTO.BulkSendReq dto : list) { for (KkopayDocBulkDTO.BulkSendReq dto : list) {
Set<ConstraintViolation<KkopayDocBulkDTO.BulkSendReq>> errList = validator.validate( Set<ConstraintViolation<KkopayDocBulkDTO.BulkSendReq>> errList = validator.validate(
@ -845,6 +852,7 @@ public class EnsBatchService extends EgovAbstractServiceImpl implements IEnsBatc
final String stsErrMsg) { final String stsErrMsg) {
for (String id : mstIdList) { for (String id : mstIdList) {
// FIXME :: stsErrMsg 메세지 확인 필
EnsDTO.SndngMssageParam dto = mapper.selectSndProcessStatus(id) EnsDTO.SndngMssageParam dto = mapper.selectSndProcessStatus(id)
.orElseThrow(() -> BizRuntimeException.create(stsErrMsg)); .orElseThrow(() -> BizRuntimeException.create(stsErrMsg));
@ -875,8 +883,71 @@ public class EnsBatchService extends EgovAbstractServiceImpl implements IEnsBatc
} }
} }
/**
* <pre>
* KT BC send
* @param tgtDTO SndngMssageParam
* </pre>
*/
// TODO :: 구현 필요
private void sendBulkKtBc(final EnsDTO.SndngMssageParam tgtDTO) {
final String url = apiHost + apiKtBcBulkSend;
KtMainSendRequest infoDto = mapper.selectKtBcSendMstTgtInfo(tgtDTO)
.orElseThrow(() -> BizRuntimeException.create("KT BC 본문자 수신 등록 대상이 존재 하지 않습니다 "));
List<KtMainSendReqData> sendReqs = mapper.selectKtBcSendTgts(tgtDTO);
final List<BulkSendReq> bulkList = new ArrayList<>();
final List<String> mstIdList = new ArrayList<>();
// setKkoMyDocSendBulks(list, bulkList, mstIdList);
// validation check
// try {
// validatedKkoMyDocSendBulks(bulkList);
// } catch (Exception e) {
// updateKkoMyDocSndngMstFailStatus(mstIdList, "[send]카카오 문서 발송(bulks)요청 실패(파라메터 오류)");
// throw e;
// }
List<List<KtMainSendReqData>> partitions = ListUtils.partition(sendReqs, bulkKtMaxCnt);
List<ApiResponseDTO<KtCommonResponse>> apiResults = partitions.stream()
.map(bulkSendList -> {
infoDto.setReqs(bulkSendList);
return ApiResponseDTO.success(
apiWebClient.exchange(
url.toString(),
HttpMethod.POST,
infoDto,
KtCommonResponse.class,
getHeadeMap()));
}
)
.collect(Collectors.toList());
// GET 결과 목록
List<KtCommonResponse> resList = apiResults.stream()
.map(ApiResponseDTO::getData)
.collect(Collectors.toList());
// 카카오 문서 요청 결과 반영
//requireNewService.saveKkoMyDocResult(mstIdList, tgtDTO.getUnitySndngMastrId(), resList);
requireNewService.sendKtBc(tgtDTO);
}
//----------------------------------------------------------------------------------------------------------------- //-----------------------------------------------------------------------------------------------------------------
/**
* <pre>
* KT BC send
* @param tgtDTO SndngMssageParam
* </pre>
*/
// TODO:: 구현 필요
private void sendBulkPplus(final EnsDTO.SndngMssageParam tgtDTO) {
requireNewService.sendPostPlus(tgtDTO);
}
} }

@ -2,6 +2,7 @@ package kr.xit.biz.ens.service;
import kr.xit.biz.ens.mapper.IEnsCctvFileMapper; import kr.xit.biz.ens.mapper.IEnsCctvFileMapper;
import kr.xit.biz.ens.model.EnsDTO; import kr.xit.biz.ens.model.EnsDTO;
import kr.xit.biz.ens.model.EnsDTO.EnsNtncCntcSndngTgt;
import kr.xit.core.support.utils.Checks; import kr.xit.core.support.utils.Checks;
import kr.xit.core.support.utils.DateUtils; import kr.xit.core.support.utils.DateUtils;
import kr.xit.core.support.utils.SFTPUtils; import kr.xit.core.support.utils.SFTPUtils;
@ -137,12 +138,12 @@ public class EnsCctvFileService extends EgovAbstractServiceImpl implements IEnsC
@Override @Override
@Transactional @Transactional
public void acceptEnsNtnccntcSndng() { public void acceptEnsNtnccntcSndng() {
List<EnsDTO.EnsNtncCntcSndngTgts> tgtList = mapper.selectEnsNtncCntcSndngs(); List<EnsNtncCntcSndngTgt> tgtList = mapper.selectEnsNtncCntcSndngs();
if(tgtList.size() == 0) return; if(tgtList.size() == 0) return;
// search 전자 고지 연계발송 데이타 생성 대상 // search 전자 고지 연계발송 데이타 생성 대상
Optional<EnsDTO.EnsNtncCntcSndngTgts> first = tgtList.stream() Optional<EnsNtncCntcSndngTgt> first = tgtList.stream()
.filter(dto -> "Y".equals(dto.getTgtYn())) .filter(dto -> "Y".equals(dto.getTgtYn()))
.findFirst(); .findFirst();
@ -150,7 +151,7 @@ public class EnsCctvFileService extends EgovAbstractServiceImpl implements IEnsC
final String unitySndngMastrId; final String unitySndngMastrId;
final String closDt; final String closDt;
if(first.isPresent()){ if(first.isPresent()){
EnsDTO.EnsNtncCntcSndngTgts tgtDTO = first.get(); EnsNtncCntcSndngTgt tgtDTO = first.get();
mapper.insertCntcSndngMst(tgtDTO); mapper.insertCntcSndngMst(tgtDTO);
unitySndngMastrId = tgtDTO.getUnitySndngMastrId(); unitySndngMastrId = tgtDTO.getUnitySndngMastrId();
closDt = tgtDTO.getClosDt(); closDt = tgtDTO.getClosDt();
@ -197,7 +198,7 @@ public class EnsCctvFileService extends EgovAbstractServiceImpl implements IEnsC
} }
} }
private String jsonCn(EnsDTO.EnsNtncCntcSndngTgts dto){ private String jsonCn(EnsNtncCntcSndngTgt dto){
String jsonCn = "{" String jsonCn = "{"
+ "\"details\": [" + "\"details\": ["
+ "{" + "{"

@ -1,7 +1,7 @@
package kr.xit.biz.ens.service; package kr.xit.biz.ens.service;
import java.util.List; import java.util.List;
import kr.xit.biz.ens.model.EnsDTO; import kr.xit.biz.ens.model.EnsDTO.SndngMssageParam;
import kr.xit.biz.ens.model.kakao.KkopayDocBulkDTO.BulkSendResponses; import kr.xit.biz.ens.model.kakao.KkopayDocBulkDTO.BulkSendResponses;
/** /**
@ -24,6 +24,9 @@ import kr.xit.biz.ens.model.kakao.KkopayDocBulkDTO.BulkSendResponses;
public interface IEnsBatchRequireNewService { public interface IEnsBatchRequireNewService {
void saveKkoMyDocResult(final List<String> mstIdList, String unitySndMstId, final List<BulkSendResponses> resList); void saveKkoMyDocResult(final List<String> mstIdList, String unitySndMstId, final List<BulkSendResponses> resList);
void sendEgreen(final EnsDTO.SndngMssageParam tgtDTO); void sendEgreen(final SndngMssageParam tgtDTO);
void sendSms(final EnsDTO.SndngMssageParam tgtDTO); void sendSms(final SndngMssageParam tgtDTO);
void sendKtBc(final SndngMssageParam tgtDTO);
void sendPostPlus(final SndngMssageParam tgtDTO);
} }

@ -11,9 +11,15 @@ contract:
corePoolSize: 5 corePoolSize: 5
# 스레드 풀에서 사용할 수 있는 최대 개수 # 스레드 풀에서 사용할 수 있는 최대 개수
maxPoolSize: 10 maxPoolSize: 10
host: http://localhost:8081
kakao: kakao:
bulk-max-cnt: 10 bulk-max-cnt: 10
host: http://localhost:8081
api: api:
bulksend: /api/ens/kakao/v1/documents/bulk bulksend: /api/ens/kakao/v1/documents/bulk
bulkstatus: /api/ens/kakao/v1/documents/bulk/status bulkstatus: /api/ens/kakao/v1/documents/bulk/status
kt:
bulk-max-cnt: 10
api:
bulksend: /api/ens/kt/v1/mainSend
bulkstatus: /api/ens/kt/v1/messageResult

@ -37,7 +37,7 @@
) )
</insert> </insert>
<select id="selectEnsNtncCntcSndngs" resultType="kr.xit.biz.ens.model.EnsDTO$EnsNtncCntcSndngTgts"> <select id="selectEnsNtncCntcSndngs" resultType="kr.xit.biz.ens.model.EnsDTO.EnsNtncCntcSndngTgt">
/** ens-mysql-mapper|selectEnsNtnccntcSndngs-전자 고지 연계 발송 데이타 대상 조회|seojh */ /** ens-mysql-mapper|selectEnsNtnccntcSndngs-전자 고지 연계 발송 데이타 대상 조회|seojh */
SELECT tpncd.ens_cntc_data_id /* 전자 고지연계데이타 ID*/ SELECT tpncd.ens_cntc_data_id /* 전자 고지연계데이타 ID*/
, tpncd.vhcle_no /* 차량번호 */ , tpncd.vhcle_no /* 차량번호 */

@ -635,19 +635,99 @@
, tess.signgu_code , tess.signgu_code
, tess.ffnlg_code , tess.ffnlg_code
, tess.vhcle_no , tess.vhcle_no
, tess.sms_sndng_dt /* 문자 발송 일시 */ , tess.sms_sndng_dt /* 문자 발송 일시 */
, tess.sms_trnsmis_stle /* 문자 전송 형태 */ , tess.sms_trnsmis_stle /* 문자 전송 형태 */
, tess.sms_trnsmit_tlphon_no /* 문자 송신 전화 번호 */ , tess.sms_trnsmit_tlphon_no /* 문자 송신 전화 번호 */
, tess.sms_recptn_tlphon_no /* 문자 수진 전화 번호 */ , tess.sms_recptn_tlphon_no /* 문자 수진 전화 번호 */
, tess.sms_mssage /* 문자 메세지 */ , tess.sms_mssage /* 문자 메세지 */
, tess.sms_sndng_sttus /* 문자 발송 상태 */ , tess.sms_sndng_sttus /* 문자 발송 상태 */
, tess.sms_sndng_process_sttus /* 문자 발송 처리 상태 */ , tess.sms_sndng_process_sttus /* 문자 발송 처리 상태 */
FROM tb_ens_sndng_mastr tesm FROM tb_ens_sndng_mastr tesm
JOIN tb_ens_sms_sndng tess JOIN tb_ens_sms_sndng tess
ON tesm.sndng_mastr_id=tess.sndng_mastr_id ON tesm.sndng_mastr_id=tess.sndng_mastr_id
WHERE tess.sndng_mastr_id = #{sndngMastrId} WHERE tess.sndng_mastr_id = #{sndngMastrId}
</select> </select>
<select id="selectKtBcSendMstTgtInfo" resultType="kr.xit.biz.ens.model.EnsDTO$KtBcSendTgtInfo">
/** ens-mysql-mapper|selectKtBcSendMstTgtInfo-Kt 본문자 수신 대상 정보 조회|julim */
SELECT tesm.sndng_mastr_id /* 발송마스터 ID */
, tesm.unity_sndng_mastr_id /* 통합발송마스터 ID */
, tesm.signgu_code /* 시군구 코드 */
, tesm.ffnlg_code /* 과태료 코드 */
, tesm.tmplat_id /* 템플릿 Id */
, tesm.sndng_ty_code /* 발송유형 코드 */
, tesm.sndng_co /* 발송건수 */
, unix_timestamp(tesm.clos_dt) AS closDt /* 마감일시 */
, tekbm.sndng_mastr_id /* 발송마스터 ID */
, tekbm.service_cd
, tekbm.service_key
, tekbm.agency_id
, tekbm.dept_cd
, tekbm.msg_cd
, tekbm.msg_type
, tekbm.make_dt
, tekbm.sndn_ex_time
, tekbm.ex_time
, tekbm.snd_tel_no
, tekbm.m_type
, tekbm.brand_id
, tekbm.opt_type
, tekbm.tkn_rpmt_yn
, tekbm.rdng_rpmt_yn
, tekbm.mms_binary
, tekbm.file_fmat
, tekbm.sndn_tot_cnt
, tekbm.mktn_rcve_csyn
, tekbm.snd_plfm_id
, tekbm.snd_npost
, tekbm.snd_date
, tekbm.multi_mbl_prc_type
, tekbm.test_sndn_yn
, tekbm.rcv_rfrl_yn
, tekbm.reopen_day /* ci */
FROM tb_ens_sndng_mastr tesm
JOIN tb_ens_kt_bc_mastr tekbm
ON tesm.sndng_mastr_id = tekbm.sndng_mastr_id
WHERE tesm.sndng_mastr_id = #{sndngMastrId}
ORDER BY tesm.unity_sndng_mastr_id
</select>
<select id="selectKtBcSendTgts" resultType="kr.xit.biz.ens.model.kt.KtMmsSendDTO$KtMainSendReqData">
/** ens-mysql-mapper|selectKtBcSendTgts-Kt 본문자 수신 대상 목록 조회|julim */
SELECT tekbm.sndng_mastr_id /* 발송마스터 ID */
, tekbm.signgu_code /* 시군구 코드 */
, tekbm.ffnlg_code /* 과태료 코드 */
, tekbd.src_key
, tekbd.src_seq
, tekbd.ci
, tekbd.mms_dtl_cnts
, tekbd.mms_title
, tekbd.rcs_dtl_cnts
, tekbd.url
, tekbd.doc_hash
, tekbd.reqs_mms_binary
, tekbd.reqs_file_fmat
, tekbd.mdn
, tekbd.dist_info_crt_yn
, tekbd.info_cfrm_str
, tekbd.rcve_rf_str
, tekbd.result_cd
, tekbd.result_dt
, tekbd.error_msg
, tekbd.mms_sndg_rslt_sqno
, tekbd.prcs_dt
, tekbd.mbl_bzowr_dvcd
, tekbd.rl_mms_sndg_telno
, tekbd.mms_sndg_rslt_dvcd
, tekbd.mms_sndg_tmst
, tekbd.mms_rdg_tmst
FROM tb_ens_kt_bc_mastr tekbm
JOIN tb_ens_kt_bc_detail tekbd
ON tekbm.sndng_mastr_id = tekbd.sndng_mastr_id
WHERE tekbm.sndng_mastr_id = #{sndngMastrId}
ORDER BY tekbd.sndng_detail_id
</select>
<select id="selectSndProcessStatus" resultType="kr.xit.biz.ens.model.EnsDTO$SndngMssageParam"> <select id="selectSndProcessStatus" resultType="kr.xit.biz.ens.model.EnsDTO$SndngMssageParam">
/** ens-mysql-mapper|selectSndProcessStatus-발송상태정보조회|julim */ /** ens-mysql-mapper|selectSndProcessStatus-발송상태정보조회|julim */
SELECT tesm.sndng_mastr_id SELECT tesm.sndng_mastr_id

@ -1059,5 +1059,4 @@ public class KtMmsSendDTO {
private String rcyYn; private String rcyYn;
} }
//------------------------------------------------------------------- //-------------------------------------------------------------------
} }

Loading…
Cancel
Save