fix: accept 처리

- nice CI 처리 추가 : DICI(VNOInterop) - 춘천 전자고지용
main
Jonguk. Lim 1 year ago
parent a77a13747a
commit 84a1c5950a

@ -0,0 +1,52 @@
select ECL_ENCRYPT('8312181157213');
select *
from tb_elctrn_ntic_sndng;
select *
from tb_elctrn_ntic_sndng_detail;
select *
from tb_ens_unity_sndng_mastr;
select *
from tb_ens_unity_sndng_detail;
select *
from tb_ens_ci;
/** 접수 reset */
select * from tb_elctrn_ntic_sndng;
select * from tb_ens_unity_sndng_mastr;
select * from tb_ens_unity_sndng_detail;
select * from tb_ens_ci;
select * from tb_ens_ihidnum_manage;
select * from tb_ens_ci_manage;
select *
from tb_ens_ci_manage;
select *
from tb_ens_ihidnum_manage;
select *
from tb_ens_ci_manage;
select tecm.ci
from tb_ens_ihidnum_manage teim
LEFT join tb_ens_ci_manage tecm
ON teim.ihidnum_manage_id = tecm.ihidnum_manage_id
where teim.ihidnum = 'RUNCNjEwM0JERENGMEMzNjRBOTAyMERERjg5MDFEODc=';
SELECT tecm.ci
FROM tb_ens_ihidnum_manage teim
LEFT JOIN tb_ens_ci_manage tecm
ON teim.ihidnum_manage_id = tecm.ihidnum_manage_id
WHERE teim.ihidnum = '8312181157213';
SELECT teim.ihidnum_manage_id AS ihidnumManageId
, tecm.ci
FROM tb_ens_ihidnum_manage teim
LEFT JOIN tb_ens_ci_manage tecm
ON teim.ihidnum_manage_id = tecm.ihidnum_manage_id
WHERE teim.ihidnum = 'RUNCNjEwM0JERENGMEMzNjRBOTAyMERERjg5MDFEODc=';

@ -78,7 +78,13 @@
<artifactId>spring-boot-starter-jta-atomikos</artifactId>
</dependency>
<dependency>
<groupId>external</groupId>
<artifactId>nicedici</artifactId>
<version>1.0</version>
<scope>system</scope>
<systemPath>${basedir}/lib/VNOInterop.jar</systemPath>
</dependency>

@ -1,6 +1,7 @@
package kr.xit.biz.ens.mapper;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import org.egovframe.rte.psl.dataaccess.mapper.Mapper;
@ -52,7 +53,7 @@ public interface IEnsBatchMapper {
* @return List<EnsDTO.SndngMssageParam>
* </pre>
*/
<T> List<EnsDTO.sndngVali> selectAcceptVali(final T t);
<T> List<EnsDTO.sndngValidation> selectAcceptValidation(final T t);
/**
* <pre>
@ -83,6 +84,27 @@ public interface IEnsBatchMapper {
* </pre>
*/
<T> int updateProcessSttusCntcSndngMst(final T t);
/**
* <pre>
* (ihidnum) ci
* () null
* ci , ci null
* @param ihidnum
* @return
* <pre>
*/
Map<String, String> selectCiByIhidnum(final String ihidnum);
int insertIhidnumManage(final Map<String, Object> paraMap);
int insertCiManage(final Map<String, Object> paraMap);
/**
* nice CI
* @param dto
* @return
*/
int insertCi(EnsDTO.NiceCiRslt dto);
//----------------------------------------------------------------------
// accept
//----------------------------------------------------------------------

@ -1,16 +1,21 @@
package kr.xit.biz.ens.model;
import java.io.Serializable;
import java.time.LocalDateTime;
import javax.validation.constraints.Digits;
import javax.validation.constraints.Size;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer;
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.ens.model.cmm.CmmEnsRequestDTO;
import kr.xit.biz.ens.model.nice.NiceCiDTO;
import kr.xit.core.biz.model.AuditFields;
import lombok.AllArgsConstructor;
import lombok.Builder;
@ -512,13 +517,15 @@ public class EnsDTO {
private String register;
}
@Schema(name = "sndngVali", description = "Ac 요청 결과 DTO")
@Schema(name = "sndngValidation", description = "Accept 요청 결과 DTO")
@Data
@NoArgsConstructor
@AllArgsConstructor
@SuperBuilder
public static class sndngVali {
public static class sndngValidation {
/* mastr */
private String unitySndngDetailId;
/**
*
*/
@ -600,6 +607,8 @@ public class EnsDTO {
@Schema(requiredMode = Schema.RequiredMode.AUTO, title = "주민등록번호 (max:100)", example = " ")
@Size(max = 100)
private String ihidnum;
private String encIhidnum;
/**
*
*/
@ -872,4 +881,43 @@ public class EnsDTO {
private String sndngProcessSttus = ApiConstants.SndngProcessStatus.ACCEPT.getCode();
}
@Schema(name = "NiceCiRslt", description = "Nice CI 결과 DTO")
@Data
@NoArgsConstructor
@AllArgsConstructor
@SuperBuilder
@JsonInclude(JsonInclude.Include.NON_NULL)
@EqualsAndHashCode(callSuper = true)
public static class NiceCiRslt extends NiceCiDTO.IpinCiResEncData {
/**
* ID :
* key - unique key
*/
@Schema(requiredMode = Schema.RequiredMode.REQUIRED, title = "통합발송상세ID")
private String unitySndngDetailId;
/**
* code - error code
*/
@Schema(requiredMode = Schema.RequiredMode.REQUIRED, title = "result")
private String resultCd;
/**
* message - error message
*/
@Schema(requiredMode = Schema.RequiredMode.REQUIRED, title = "message")
private String message;
/**
*
*/
@JsonDeserialize(using = LocalDateDeserializer.class)
@JsonFormat(pattern = "yyyy-MM-dd kk:mm:ss")
private LocalDateTime registDt;
/**
*
*/
private String register;
}
}

@ -1,7 +1,9 @@
package kr.xit.biz.ens.service;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
@ -11,21 +13,31 @@ import javax.validation.Validator;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.MDC;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpMethod;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import KISINFO.VNO.VNOInterop;
import egovframework.com.cmm.util.EgovDateUtil;
import egovframework.com.cmm.util.EgovStringUtil;
import kr.xit.biz.common.ApiConstants;
import kr.xit.biz.common.ApiConstants.MappingSndngProcessStatus;
import kr.xit.biz.common.ApiConstants.SndngProcessStatus;
import kr.xit.biz.common.ApiConstants.SndngSeCode;
import kr.xit.biz.ens.cmm.CmmEnsBizUtils;
import kr.xit.biz.ens.mapper.IEnsBatchMapper;
import kr.xit.biz.ens.model.EnsDTO;
import kr.xit.biz.ens.model.cmm.SndngMssageParam;
import kr.xit.biz.ens.model.nice.NiceCiDTO;
import kr.xit.core.exception.BizRuntimeException;
import kr.xit.core.service.AbstractService;
import kr.xit.core.spring.util.ApiWebClientUtil;
import kr.xit.core.spring.util.MessageUtil;
import kr.xit.core.support.utils.Checks;
import kr.xit.core.support.utils.DateUtils;
import lombok.NonNull;
import lombok.RequiredArgsConstructor;
/**
@ -47,7 +59,20 @@ import lombok.RequiredArgsConstructor;
@RequiredArgsConstructor
@Service
public class EnsBatchAcceptService extends AbstractService implements IEnsBatchAcceptService {
@Value("${app.contract.host}")
private String apiHost;
@Value("${app.contract.nice.api.ci}")
private String apiNiceCi;
@Value("${app.contract.nice.dici.site-code}")
private String diciSiteCode;
@Value("${app.contract.nice.dici.site-pwd}")
private String diciSitePwd;
private final IEnsBatchMapper mapper;
private final MessageUtil messageUtil;
private static final Validator validator = Validation.buildDefaultValidatorFactory()
.getValidator();
@ -55,6 +80,13 @@ public class EnsBatchAcceptService extends AbstractService implements IEnsBatchA
private static final String UNITY_SNDNG_MST_ID = "unitySndngMastrId";
private static final String YMDHMS = ApiConstants.FMT_DT_EMPTY_DLT;
/**
*
*/
private static final boolean IS_CCN = ApiConstants.PROFILE.matches(".*-ccn");
private final ApiWebClientUtil apiWebClient;
/**
* <pre>
* accept()
@ -91,59 +123,75 @@ public class EnsBatchAcceptService extends AbstractService implements IEnsBatchA
@Override
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void accept(final EnsDTO.BatchEnsRequest reqDTO) {
reqDTO.setSndngProcessSttus(MappingSndngProcessStatus.fromEns(SndngProcessStatus.ACCEPT.getCode()));
final List<SndngMssageParam> list = mapper.selectAcceptTgts(reqDTO);
String sndngDt = null;
for (SndngMssageParam dto : list) {
dto.setSignguCode(reqDTO.getSignguCode());
dto.setFfnlgCode(reqDTO.getFfnlgCode());
dto.setProfile(ApiConstants.PROFILE);
final List<String> mstIdList = new ArrayList<>();
String mstId = "";
if (!Objects.equals(mstId, dto.getUnitySndngMastrId())) {
mstId = dto.getUnitySndngMastrId();
mstIdList.add(mstId);
MDC.put(UNITY_SNDNG_MST_ID, mstId);
}
//try {
dto.setSignguCode(reqDTO.getSignguCode());
dto.setFfnlgCode(reqDTO.getFfnlgCode());
dto.setProfile(ApiConstants.PROFILE);
final List<String> mstIdList = new ArrayList<>();
String mstId = "";
if (!Objects.equals(mstId, dto.getUnitySndngMastrId())) {
mstId = dto.getUnitySndngMastrId();
mstIdList.add(mstId);
MDC.put(UNITY_SNDNG_MST_ID, mstId);
}
// validation check
final List<EnsDTO.sndngVali> valiList = mapper.selectAcceptVali(dto);
try {
validatedAccept(valiList);
} catch (Exception e) {
updateAcceptCntcSndngMstFailStatus(mstIdList,
"accept 생성 요청 실패(파라메터 오류) : " + EgovStringUtil.cutString(e.getMessage(), 300));
continue;
}
// validation check
final List<EnsDTO.sndngValidation> valiList = mapper.selectAcceptValidation(dto);
try {
// CI 생성이 모두 실패한 경우 오류처리후 skip
if(!validatedAccept(valiList)){
updateAcceptCntcSndngMstFailStatus(mstIdList,
"accept 생성 요청 실패 : api log 확인");
continue;
}
} catch (Exception e) {
updateAcceptCntcSndngMstFailStatus(mstIdList,
"accept 생성 요청 실패(파라메터 오류) : " + EgovStringUtil.cutString(e.getMessage(), 300));
continue;
}
// 초기 1회 셋팅 (발송 일시2, 발송 일시3 : 템플릿 관리 try2_minute, try3_minute 값에 따라 처리)
if (StringUtils.isEmpty(sndngDt)) {
sndngDt = StringUtils.defaultString(dto.getSndngDt());
if (StringUtils.isNotEmpty(dto.getTry2()) && StringUtils.isNotEmpty(sndngDt)) {
dto.setSndngDt2(
EgovDateUtil.addMinute(sndngDt, Integer.parseInt(dto.getTry2Minute())));
}
if (StringUtils.isNotEmpty(dto.getTry3()) && StringUtils.isNotEmpty(sndngDt)) {
dto.setSndngDt3(
EgovDateUtil.addMinute(sndngDt, Integer.parseInt(dto.getTry3Minute())));
}
}
// 초기 1회 셋팅 (발송 일시2, 발송 일시3 : 템플릿 관리 try2_minute, try3_minute 값에 따라 처리)
if (StringUtils.isEmpty(sndngDt)) {
sndngDt = StringUtils.defaultString(dto.getSndngDt());
if (StringUtils.isNotEmpty(dto.getTry2()) && StringUtils.isNotEmpty(sndngDt)) {
dto.setSndngDt2(
EgovDateUtil.addMinute(sndngDt, Integer.parseInt(dto.getTry2Minute())));
dto.setSndngProcessSttus(reqDTO.getSndngProcessSttus());
dto.setNewSndngProcessSttus(SndngProcessStatus.ACCEPT_OK.getCode());
if (mapper.insertUnitySndngMst(dto) != 1) {
throw BizRuntimeException.create("접수 데이타 생성(마스터) 실패");
}
if (StringUtils.isNotEmpty(dto.getTry3()) && StringUtils.isNotEmpty(sndngDt)) {
dto.setSndngDt3(
EgovDateUtil.addMinute(sndngDt, Integer.parseInt(dto.getTry3Minute())));
int insCnt = mapper.insertUnitySndngDtls(dto);
if (insCnt != dto.getSndngCo()) {
throw BizRuntimeException.create(
String.format("접수 상세 데이타 생성 실패-발송건수[%d]와 생성건수[%d] 불일치",
dto.getSndngCo(),
insCnt));
}
}
dto.setSndngProcessSttus(reqDTO.getSndngProcessSttus());
dto.setNewSndngProcessSttus(ApiConstants.SndngProcessStatus.ACCEPT_OK.getCode());
if (mapper.insertUnitySndngMst(dto) != 1) {
throw BizRuntimeException.create("접수 데이타 생성(마스터) 실패");
}
int insCnt = mapper.insertUnitySndngDtls(dto);
if (insCnt != dto.getSndngCo()) {
throw BizRuntimeException.create(
String.format("접수 상세 데이타 생성 실패-발송건수[%d]와 생성건수[%d] 불일치",
dto.getSndngCo(),
insCnt));
}
if (mapper.updateProcessSttusCntcSndngMst(dto) != 1) {
throw BizRuntimeException.create("접수 데이타 생성(통합발송마스터 상태변경) 실패");
}
dto.setNewSndngProcessSttus(MappingSndngProcessStatus.fromEns(SndngProcessStatus.ACCEPT_OK.getCode()));
if (mapper.updateProcessSttusCntcSndngMst(dto) != 1) {
throw BizRuntimeException.create("접수 데이타 생성(통합발송마스터 상태변경) 실패");
}
// } catch (Exception e) {
// // FIXME: 에러 로그 저장 추가 필요
// //throw e;
// // updateAcceptCntcSndngMstFailStatus(mstIdList,
// // "accept 생성 요청 실패(파라메터 오류) : " + EgovStringUtil.cutString(e.getMessage(), 300));
// continue;
// }
}
}
@ -157,12 +205,15 @@ public class EnsBatchAcceptService extends AbstractService implements IEnsBatchA
* @param valiList List<EnsDTO.sndngVali>
* </pre>
*/
private void validatedAccept(List<EnsDTO.sndngVali> valiList) {
// FIXME:파라메터 유효성 check 는 하지않는다???
private boolean validatedAccept(List<EnsDTO.sndngValidation> valiList) {
final String url = apiHost + apiNiceCi;
final List<String> errors = new ArrayList<>();
int idx = 0;
boolean isSuccess = false;
for (EnsDTO.sndngVali dto : valiList) {
Set<ConstraintViolation<EnsDTO.sndngVali>> errList = validator.validate(dto);
for (EnsDTO.sndngValidation dto : valiList) {
Set<ConstraintViolation<EnsDTO.sndngValidation>> errList = validator.validate(dto);
if(!errList.isEmpty()) {
int finalIdx = idx;
@ -194,20 +245,28 @@ public class EnsBatchAcceptService extends AbstractService implements IEnsBatchA
Checks.checkVal(dto.getTry3(), "")
};
// CI 생성 여부
boolean isCiCreate = false;
boolean isError = false;
switch(SndngSeCode.compare(tryVal[dto.getTrySeq() - 1])) {
case KAKAO:
if(Checks.isEmpty(dto.getCi())) {
isCiCreate = true;
if(Checks.isEmpty(dto.getIhidnum())) {
isError = true;
errors.add(
String.format("주민등록번호는 필수입니다(dto.getIhidnum[%d] 번째 오류)",
idx + 1));
}
if(Checks.isEmpty(dto.getMoblphonNo())) {
isError = true;
errors.add(
String.format("핸드폰 번호는 필수입니다(dto.getMoblphonNo[%d] 번째 오류)",
idx + 1));
}
if(Checks.isEmpty(dto.getIhidnum())) {
isError = true;
errors.add(
String.format("받는이 이름은 필수입니다(dto.getIhidnum[%d] 번째 오류)",
idx + 1));
@ -217,17 +276,204 @@ public class EnsBatchAcceptService extends AbstractService implements IEnsBatchA
//FIXME : KT 데이타 적합성 체크
case KT_BC:
isCiCreate = true;
break;
case KAKAO_NEW:
if(Checks.isEmpty(dto.getCi())) {
isCiCreate = true;
if(Checks.isEmpty(dto.getIhidnum())) {
isError = true;
errors.add(
String.format("주민등록번호는 필수입니다(dto.getIhidnum[%d] 번째 오류)",
idx + 1));
}
}
break;
default:
break;
}
// CI 생성
if(isCiCreate && !isError) {
// 주민번호(ihidnum)로 등록된 ci가 있는지 조회 - 있으면 재활용
// 사용되지 않은(등록안된) 주민번호 이면 null 반환
// 해당 주민번호의 ci가 없으면, ci가 null
Map<String, String> rsltMap = mapper.selectCiByIhidnum(dto.getEncIhidnum());
if(rsltMap != null && rsltMap.get("ci") != null){
mapper.insertCi(
EnsDTO.NiceCiRslt.builder()
.unitySndngDetailId(dto.getUnitySndngDetailId())
.ci1(rsltMap.get("ci"))
.build()
);
isSuccess = true;
continue;
}
String ihidnumManageId;
// 등록되지 않은 주민번호 등록
if(rsltMap == null){
Map<String, Object> map = new HashMap<>();
map.put("ihidnumManageId", StringUtils.EMPTY);
map.put("ihidnum", dto.getEncIhidnum());
mapper.insertIhidnumManage(map);
ihidnumManageId = map.get("ihidnumManageId").toString();
}else {
ihidnumManageId = rsltMap.get("ihidnumManageId");
}
// 춘천인 경우 DICI를 통한 CI 획득
if(IS_CCN) {
boolean isScc = requestNiceDici(dto, ihidnumManageId);
if(isScc) isSuccess = true;
}else{
boolean isScc = requestNiceCiApi(dto, ihidnumManageId, url);
if(isScc) isSuccess = true;
}
}
idx++;
}
if (!errors.isEmpty()) {
throw BizRuntimeException.create(errors.toString());
}
return isSuccess;
}
/**
* Nice Ci -
* @param reqDto EnsDTO.sndngValidation
* @param ihidnumManageId id
* @param url ci API URL
* @return CI
*/
private boolean requestNiceCiApi(EnsDTO.sndngValidation reqDto, String ihidnumManageId, String url) {
boolean isSuccess = false;
NiceCiDTO.IpinCiResDataBody dataBody = apiWebClient.exchange(
url,
HttpMethod.POST,
NiceCiDTO.NiceCiRequest.builder()
.signguCode(reqDto.getSignguCode())
.ffnlgCode(reqDto.getFfnlgCode())
.juminId(reqDto.getIhidnum())
.build(),
NiceCiDTO.IpinCiResDataBody.class,
CmmEnsBizUtils.getHeadeMap());
NiceCiDTO.IpinCiResEncData resEncData = dataBody.toEncData();
EnsDTO.NiceCiRslt rsltDto = EnsDTO.NiceCiRslt.builder()
.unitySndngDetailId(reqDto.getUnitySndngDetailId())
.build();
if(resEncData == null) {
//rsltDto.setResultCd(dataBody.getResultCd());
rsltDto.setMessage("NICE-CI API 획득 실패: api log 확인");
mapper.insertCi(rsltDto);
return isSuccess;
}
rsltDto.setCi1(resEncData.getCi1());
rsltDto.setCi2(resEncData.getCi2());
rsltDto.setResultCd(dataBody.getResultCd());
rsltDto.setMessage(messageUtil.getMessage("err.api.nice.ci." + dataBody.getResultCd()));
mapper.insertCi(rsltDto);
// CI가 return 되지 않으면(에러발생시), CI 관리 테이블 데이타 생성 skip
if(resEncData.getCi1() != null) {
isSuccess = true;
mapper.insertCiManage(
Map.of("ihidnumManageId", ihidnumManageId, "ci", resEncData.getCi1())
);
}
return isSuccess;
}
/**
* Nice Ci -
* @param reqDto EnsDTO.sndngValidation
* @param ihidnumManageId id
*
* @return CI
*/
private boolean requestNiceDici(EnsDTO.sndngValidation reqDto, String ihidnumManageId) {
boolean isSuccess = false;
EnsDTO.NiceCiRslt rslt = getDiCi(reqDto.getIhidnum(), true);
rslt.setUnitySndngDetailId(reqDto.getUnitySndngDetailId());
mapper.insertCi(rslt);
// CI가 return 되지 않으면(에러발생시), CI 관리 테이블 데이타 생성 skip
if(rslt.getCi1() != null){
isSuccess = true;
mapper.insertCiManage(
Map.of("ihidnumManageId", ihidnumManageId, "ci", rslt.getCi1())
);
}
return isSuccess;
}
private EnsDTO.NiceCiRslt getDiCi(@NonNull String ihidnum, boolean isCi) {
int iRtn = -1;
String errMsg = "";
String ci = "";
try {
// 모듈 객체 생성
VNOInterop vnoInterop = new VNOInterop();
/* ──── DI or CI 값을 추출하기 위한 부분 Start */
// FIXME : site code, site password 반영 필요
if(isCi) {
iRtn = vnoInterop.fnRequestConnInfo(diciSiteCode, diciSitePwd, ihidnum, "JID");
} else {
iRtn = vnoInterop.fnRequestDupInfo(diciSiteCode, diciSitePwd, ihidnum, "JID");
}
switch (iRtn) {
case 1:
// iRtn 값이 정상이므로, 귀사의 기획의도에 맞게 진행하시면 됩니다.
// 아래와 같이 getDupInfo 함수를 통해 DI 값(64 Byte)을 추출할 수 있습니다.
if(isCi) ci = vnoInterop.getConnInfo();
else ci = vnoInterop.getDupInfo();
break;
case 3:
errMsg = "[사용자 정보와 실명확인 서비스 구분값 매핑 오류]";
break;
case -9:
errMsg = "[입력값 오류]\nfnRequestDupInfo 함수 처리시, 필요한 4개의 파라미터값의 정보를 정확하게 입력해 주시기 바랍니다.";
break;
case -21:
case -31:
case -34:
errMsg = "[통신오류]\n서버 네트웍크 및 방확벽 관련하여 아래 IP와 Port(5개)를 오픈해 주셔야 이용 가능합니다.\nIP : 203.234.219.72 / Port : 81, 82, 83, 84, 85";
break;
default:
errMsg = "return 값 확인 후, NICE평가정보 전산 담당자에게 문의해 주세요.\n[return 값:" + iRtn + "]";
break;
}
if (!errMsg.isEmpty()){
return EnsDTO.NiceCiRslt.builder()
.resultCd(String.valueOf(iRtn))
.message(errMsg)
.build();
}
return EnsDTO.NiceCiRslt.builder()
.ci1(ci)
.resultCd(String.valueOf(iRtn))
.message(errMsg)
.build();
} catch (Exception e) {
return EnsDTO.NiceCiRslt.builder()
.resultCd(String.valueOf(iRtn))
.message(e.getMessage())
.build();
}
}
/**
@ -244,7 +490,7 @@ public class EnsBatchAcceptService extends AbstractService implements IEnsBatchA
for (String id : mstIdList) {
final SndngMssageParam paramDTO = SndngMssageParam.builder()
.unitySndngMastrId(id)
.newSndngProcessSttus("accept-fail")
.newSndngProcessSttus(MappingSndngProcessStatus.fromEns(SndngProcessStatus.ACCEPT_FAIL.getCode()))
.errorMssage(stsErrMsg)
.build();

@ -1,5 +1,11 @@
package kr.xit.biz.ens.web;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.media.ExampleObject;
@ -11,11 +17,6 @@ import kr.xit.biz.ens.service.IEnsBatchStatusService;
import kr.xit.core.model.ApiResponseDTO;
import kr.xit.core.model.IApiResponse;
import lombok.RequiredArgsConstructor;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* <pre>
@ -46,7 +47,7 @@ public class EnsBatchController {
@Content(mediaType = "application/json", examples = {
@ExampleObject(value = """
{
"signguCode": "88328",
"signguCode": "51110",
"ffnlgCode": "11",
"sndngProcessSttus": "accept"
}

@ -13,6 +13,14 @@ app:
corePoolSize: 5
# 스레드 풀에서 사용할 수 있는 최대 개수
maxPoolSize: 10
nice:
# nice api CI 생성
api:
ci: /api/ens/nice/v1/requestNiceCi
# vno api CI 생성
dici:
site-code: EQ00y
site-pwd: 76646885
kakao:
bulk-max-cnt: 10
api:

@ -52,10 +52,6 @@ logging:
io.netty: warn
org.springframework.web.reactive.function.client.ExchangeFunctions: debug
org.springframework: warn
file:
# 로그파일 위치
path: ${app.data.root.path}/mens/logs
name: ${app.name}
# ==================================================================================================================
# SQL logging lib setting

@ -17,7 +17,7 @@ server:
whitelabel:
enabled: false
app:
name: mens-batch
name: mens-traffic-batch
# springdoc url 정보
desc: 모바일 전자고지 batch
data:
@ -88,5 +88,9 @@ spring:
# rewriteBatchedStatements: true
logging:
file:
# 로그파일 위치
path: ${app.data.root.path}/mens/logs
name: ${app.name}
level:
root: error

@ -121,6 +121,50 @@
, updusr = 'batch'
WHERE elctrn_ntic_sndng_id = #{unitySndngMastrId}
</update>
<select id="selectCiByIhidnum" resultType="map">
/** ens-mysql-mapper|selectCiByIhidnum-주민번호로 ci 조회|julim */
SELECT teim.ihidnum_manage_id AS ihidnumManageId
, tecm.ci
FROM tb_ens_ihidnum_manage teim
LEFT JOIN tb_ens_ci_manage tecm
ON teim.ihidnum_manage_id = tecm.ihidnum_manage_id
WHERE teim.ihidnum = #{ihidnum}
</select>
<insert id="insertIhidnumManage" parameterType="map">
/** ens-mysql-mapper|insertIhidnumManage-주민번호로 관리 데이타 생성|julim */
<selectKey keyProperty="ihidnumManageId" resultType="string" order="BEFORE">
SELECT nextval(tb_ens_ihidnum_manage_seq)
</selectKey>
INSERT INTO tb_ens_ihidnum_manage (
ihidnum_manage_id,
ihidnum,
regist_dt,
register
) VALUE (
#{ihidnumManageId},
#{ihidnum},
now(),
'batch'
)
</insert>
<insert id="insertCiManage" parameterType="map">
/** ens-mysql-mapper|insertCiManage-CI 관리 데이타 생성|julim */
INSERT INTO tb_ens_ci_manage (
ihidnum_manage_id,
ci,
regist_dt,
register
) VALUE (
#{ihidnumManageId},
#{ci},
now(),
'batch'
)
</insert>
<!-- =================================================================================== -->
<!-- ================================ accept =========================================== -->
<!-- =================================================================================== -->
@ -979,43 +1023,57 @@
WHERE tmplat_id = #{tmplatId}
</select>
<select id="selectAcceptVali" resultType="kr.xit.biz.ens.model.EnsDTO$sndngVali">
<select id="selectAcceptValidation" resultType="kr.xit.biz.ens.model.EnsDTO$sndngValidation">
/** ens-mysql-mapper|selectAcceptVali-Validate용|seojh */
SELECT term.ffnlg_code
, term.signgu_code
, tetm.tmplat_id
, tcsm.sndng_ty_code
, tcsm.sndng_co
, tcsm.sndng_dt
, tcsm.clos_dt
, tcsd.main_code
, tcsd.vhcle_no
, tcsd.nm
, tcsd.ffnlg_code AS ffnlg_code_de
, tcsd.signgu_code AS signgu_code_de
, tcsd.ihidnum
, tcsd.moblphon_no
, tcsd.mobile_page_cn
, tcsd.adres
, tcsd.detail_adres
, tcsd.zip
, tetm.try1
, tetm.try2
, tetm.try3
, 1 AS try_seq
, term.signgu_code
, tetm.tmplat_id
, tcsm.sndng_ty_code
, tcsm.sndng_co
, tcsm.sndng_dt
, tcsm.clos_dt
, tcsd.elctrn_ntic_sndng_detail_id AS unitySndngDetailId
, tcsd.main_code
, tcsd.ffnlg_code AS ffnlg_code_de
, tcsd.signgu_code AS signgu_code_de
, ECL_DECRYPT(tcsd.ihidnum) AS ihidnum
, tcsd.ihidnum AS encIhidnum
, tcsd.mobile_page_cn
, tetm.try1
, tetm.try2
, tetm.try3
, 1 AS try_seq
, tec.ci
FROM tb_cntc_sndng_mastr tcsm
JOIN tb_cntc_sndng_detail tcsd
ON tcsm.unity_sndng_mastr_id = tcsd.unity_sndng_mastr_id
FROM tb_elctrn_ntic_sndng tcsm
JOIN tb_elctrn_ntic_sndng_detail tcsd
ON tcsm.elctrn_ntic_sndng_id = tcsd.elctrn_ntic_sndng_id
LEFT JOIN tb_ens_ci tec
ON tcsd.unity_sndng_detail_id = tec.unity_sndng_detail_id
LEFT OUTER JOIN tb_ens_tmplat_manage tetm
ON tcsm.tmplat_id = tetm.tmplat_id
LEFT OUTER JOIN tb_ens_rlaybsnm_manage term
ON tcsm.signgu_code = term.signgu_code AND tcsm.ffnlg_code = term.ffnlg_code
WHERE tcsm.unity_sndng_mastr_id = #{unitySndngMastrId}
ON tcsd.elctrn_ntic_sndng_detail_id = tec.unity_sndng_detail_id
LEFT JOIN tb_ens_tmplat_manage tetm
ON tcsm.nht_tmplat_id = tetm.tmplat_id
LEFT JOIN tb_ens_rlaybsnm_manage term
ON (tcsm.signgu_code = term.signgu_code
AND tcsm.ffnlg_code = term.ffnlg_code)
WHERE tcsm.elctrn_ntic_sndng_id = #{unitySndngMastrId}
AND tcsm.sndng_process_sttus = #{sndngProcessSttus}
</select>
<insert id="insertCi">
/** ens-mysql-mapper|insertCi-CI자료 생성|limju */
INSERT INTO tb_ens_ci (
unity_sndng_detail_id,
ci,
result_cd,
message,
regist_dt,
register
) VALUES (
#{unitySndngDetailId}
, NVL(#{ci1}, #{ci2})
, #{resultCd}
, #{message}
, now()
, #{register}
)
</insert>
</mapper>

@ -162,6 +162,7 @@ public class ApiConstants {
@Getter
public enum SndngSeCode {
KAKAO("KKO-MY-DOC", "카카오"),
KAKAO_NEW("KKO-NEW", "카카오NEW"),
KT_BC("KT-BC", "공공알림문자"),
;
@ -219,4 +220,70 @@ public class ApiConstants {
return valueOf(en);
}
}
/**
* <pre>
* : ENS003
* 01: , 11: , 19:
* 22: , 29: , 08: , 09: , 99:
* </pre>
*/
@Getter
public enum MappingSndngProcessStatus {
ACCEPT("accept", "01"),
ACCEPT_OK("accept-ok", "11"),
ACCEPT_FAIL("accept-fail", "19"),
MAKE_OK("make-ok", "22"),
MAKE_FAIL1("make-fail1", "29"),
MAKE_FAIL2("make-fail2", "29"),
MAKE_FAIL3("make-fail3", "29"),
SENDING1("sending1", "08"),
SENDING2("sending2", "08"),
SEND_OK("send-ok", "08"),
SEND_FAIL1("send-fail1", "99"),
SEND_FAIL2("send-fail2", "99"),
SEND_FAIL3("send-fail3", "99"),
CLOSE("close", "09")
;
private final String ensCode;
private final String trfCode;
MappingSndngProcessStatus(String ensCode, String trfCode) {
this.ensCode = ensCode;
this.trfCode = trfCode;
}
/**
* <pre>
* traffic ens
* @param trfCode
* @return traffic ens
* </pre>
*/
public static String fromTraffic(final String trfCode){
return Arrays.stream(MappingSndngProcessStatus.values())
.filter(en -> en.getTrfCode().equals(trfCode))
.findFirst()
.map(MappingSndngProcessStatus::getEnsCode)
.orElseThrow(() -> BizRuntimeException.create(String.format("미정의된 상태코드가[%s]", trfCode)));
}
/**
* <pre>
* ens traffic
* @param ensCode
* @return ens traffic
* </pre>
*/
public static String fromEns(final String ensCode){
return Arrays.stream(MappingSndngProcessStatus.values())
.filter(en -> en.getEnsCode().equals(ensCode))
.findFirst()
.map(MappingSndngProcessStatus::getTrfCode)
.orElseThrow(() -> BizRuntimeException.create(String.format("미정의된 상태코드가[%s]", ensCode)));
}
}
}

@ -1,515 +0,0 @@
package kr.xit.biz.ens.model.cmm;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.media.Schema.RequiredMode;
import java.time.LocalDateTime;
import javax.validation.constraints.Size;
import kr.xit.biz.ens.model.nice.NiceCiDTO.IpinCiResEncData;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
import org.hibernate.validator.constraints.NotEmpty;
import org.springframework.web.multipart.MultipartFile;
/**
* <pre>
* description : DTO
*
* packageName : kr.xit.biz.ens.model.cmm
* fileName : CmmEnsFileInfDTO
* author : limju
* date : 2023-09-04
* ======================================================================
*
* ----------------------------------------------------------------------
* 2023-09-04 limju
*
* </pre>
*/
public class CmmEnsFileInfDTO {
@Schema(name = "FmcExcelUpload", description = "시설관리공단 전자문서 발송대상 엑셀 파일 업로드 DTO")
@Data
@NoArgsConstructor
@AllArgsConstructor
@SuperBuilder
@JsonInclude(JsonInclude.Include.NON_NULL)
@EqualsAndHashCode(callSuper = true)
public static class FmcExcelUpload extends CmmEnsRequestDTO {
//-----------------------------------------------------------------------------------
// 시설관리공단 전자고지 대상 엑셀파일 업로드 필수 속성
//-----------------------------------------------------------------------------------
/**
* :
* - yyyyMMdd
*/
@Schema(requiredMode = RequiredMode.REQUIRED, title = "등록자", example = "userid", description = "등록자")
@Size(message = "등록자는 필수 입니다")
private String register;
/**
* excel file :
*/
@JsonIgnore
@Schema(requiredMode = RequiredMode.REQUIRED, title = "excel file", example = "null", description = "업로드 excel file")
@NotEmpty(message = "첨부파일은 필수 입니다")
private MultipartFile[] files;
//-----------------------------------------------------------------------------------
// 시설관리공단 전자고지 대상 엑셀파일 업로드 결과 속성
//-----------------------------------------------------------------------------------
/**
* : response
*
*/
@Schema(requiredMode = RequiredMode.AUTO, title = "발송 건수", example = "0", description = "발송건수")
private int sndngCo;
/**
* ID : response
* key -
*/
@Schema(requiredMode = RequiredMode.AUTO, title = "통합발송마스터ID", example = "0", description = "통합발송마스터ID")
private String unitySndngMastrId;
private String postDlvrSe;
private String postTmplatCode;
}
@Schema(name = "FmcInfExcel", description = "시설관리공단 전자문서 발송대상 엑셀 파일 interface DTO")
@Data
@NoArgsConstructor
@AllArgsConstructor
@SuperBuilder
@JsonInclude(JsonInclude.Include.NON_NULL)
public static class FmcInfExcel {
//-----------------------------------------------------------------------------------
// 시설관리공단 전자고지 대상 엑셀파일 헤더
//-----------------------------------------------------------------------------------
/**
* ID :
* key - unique key
*/
@Schema(requiredMode = RequiredMode.REQUIRED, title = "파일 유일키", example = " ", description = "통합발송상세ID")
@NotEmpty(message = "파일 유일키는 필수입니다.")
private String unitySndngMastrId;
/**
* :
*/
@Schema(requiredMode = RequiredMode.REQUIRED, title = "우편물 일련번호", example = " ", description = "우편물 일련번호")
@NotEmpty(message = "우편물 일련번호는 필수입니다.")
private String unitySndngDetailId;
/**
* :
*/
@Schema(requiredMode = RequiredMode.REQUIRED, title = "우편물 요청일시", example = " ", description = "우편물 요청일시")
@NotEmpty(message = "우편물 요청일시는 필수입니다.")
private String sndngDt;
/**
* :
*/
@Schema(requiredMode = RequiredMode.REQUIRED, title = "우편물 발송구분", example = " ", description = "우편물 발송구분")
@NotEmpty(message = "우편물 발송구분은 필수입니다.")
private String tmplatId;
//-----------------------------------------------------------------------------------
// 겉봉투 인쇄용
//-----------------------------------------------------------------------------------
/**
* :
*/
@Schema(requiredMode = RequiredMode.AUTO, title = "발송인 명", example = " ", description = "발송인 명")
private String senderNm;
/**
* :
*/
@Schema(requiredMode = RequiredMode.AUTO, title = "발송인 우편번호", example = " ", description = "발송인 우편번호")
private String senderZipNo;
/**
* :
*/
@Schema(requiredMode = RequiredMode.AUTO, title = "발송인 주소", example = " ", description = "발송인 주소")
private String senderAddr;
/**
* :
*/
@Schema(requiredMode = RequiredMode.AUTO, title = "발송인 상세주소", example = " ", description = "발송인 상세주소")
private String senderDetailAddr;
/**
* :
*/
@Schema(requiredMode = RequiredMode.AUTO, title = "발송인 전화번호", example = " ", description = "발송인 전화번호")
private String senderTelno;
/**
* :
*/
@Schema(requiredMode = RequiredMode.AUTO, title = "수취인 명", example = " ", description = "수취인 명")
private String recevNm;
/**
* :
*/
@Schema(requiredMode = RequiredMode.AUTO, title = "수취인 우편번호", example = " ", description = "수취인 우편번호")
private String recevZipNo;
/**
* :
*/
@Schema(requiredMode = RequiredMode.AUTO, title = "수취인 주소", example = " ", description = "수취인 주소")
private String recevAddr;
/**
* :
*/
@Schema(requiredMode = RequiredMode.AUTO, title = "수취인 상세주소", example = " ", description = "수취인 상세주소")
private String recevDetailAddr;
/**
* :
*/
@Schema(requiredMode = RequiredMode.AUTO, title = "수취인 전화번호", example = " ", description = "수취인 전화번호")
private String recevTelno;
//-----------------------------------------------------------------------------------
// 전자고지
//-----------------------------------------------------------------------------------
/**
*
*/
@Schema(requiredMode = RequiredMode.AUTO, title = "수취인 주민등록번호", example = " ", description = "수취인 주민등록번호-전자고지 일 경우 필수")
private String recveJuminno;
//-----------------------------------------------------------------------------------
// 내용물
//-----------------------------------------------------------------------------------
/**
*
*/
@Schema(requiredMode = RequiredMode.AUTO, title = "고지서 구분명", example = " ", description = "고지서 구분명")
private String gojiGubun;
/**
*
*/
@Schema(requiredMode = RequiredMode.AUTO, title = "고지서 명", example = " ", description = "고지서 명")
private String gojiNm;
/**
*
*/
@Schema(requiredMode = RequiredMode.AUTO, title = "고지서 상세명", example = " ", description = "고지서 상세명")
private String gojiDetailNm;
/**
* QR
*/
@Schema(requiredMode = RequiredMode.REQUIRED, title = "QR 바코드", example = " ", description = "QR 바코드")
@NotEmpty(message = "QR 바코드는 필수입니다.")
private String qrBarcode;
/**
*
*/
@Schema(requiredMode = RequiredMode.REQUIRED, title = "부과대상", example = " ", description = "부과대상")
@NotEmpty(message = "부과대상은 필수입니다.")
private String buTarget;
/**
*
*/
@Schema(requiredMode = RequiredMode.REQUIRED, title = "자료관리번호", example = " ", description = "자료관리번호")
@NotEmpty(message = "자료관리번호는 필수입니다.")
private String dataSn;
/**
*
*/
@Schema(requiredMode = RequiredMode.AUTO, title = "관리비기간", example = " ", description = "관리비기간")
private String costPd;
/**
*
*/
@Schema(requiredMode = RequiredMode.AUTO, title = "기관번호", example = " ", description = "기관번호")
private String taxNum1;
/**
*
*/
@Schema(requiredMode = RequiredMode.AUTO, title = "세목", example = " ", description = "세목")
private String taxNum2;
/**
*
*/
@Schema(requiredMode = RequiredMode.AUTO, title = "납세년월기", example = " ", description = "납세년월기")
private String taxNum3;
/**
*
*/
@Schema(requiredMode = RequiredMode.AUTO, title = "과세번호", example = " ", description = "과세번호")
private String taxNum4;
/**
* 1
*/
@Schema(requiredMode = RequiredMode.AUTO, title = "부과내역1", example = " ", description = "부과내역1")
private String buContent1;
/**
* 2
*/
@Schema(requiredMode = RequiredMode.AUTO, title = "부과내역2", example = " ", description = "부과내역2")
private String buContent2;
/**
* 3
*/
@Schema(requiredMode = RequiredMode.AUTO, title = "부과내역3", example = " ", description = "부과내역3")
private String buContent3;
/**
* 4
*/
@Schema(requiredMode = RequiredMode.AUTO, title = "부과내역4", example = " ", description = "부과내역4")
private String buContent4;
/**
* 1
*/
@Schema(requiredMode = RequiredMode.REQUIRED, title = "납부금액명1", example = " ", description = "납부금액명1")
@NotEmpty(message = "납부금액명1은 필수입니다.")
private String napAmountNm1;
/**
* 2
*/
@Schema(requiredMode = RequiredMode.REQUIRED, title = "납부금액명2", example = " ", description = "납부금액명2")
@NotEmpty(message = "납부금액명2는 필수입니다.")
private String napAmountNm2;
/**
* 1
*/
@Schema(requiredMode = RequiredMode.REQUIRED, title = "납부금액상세명1", example = " ", description = "납부금액상세명1")
@NotEmpty(message = "납부금액상세명1은 필수입니다.")
private String napAmountDetailNm1;
/**
* 2
*/
@Schema(requiredMode = RequiredMode.REQUIRED, title = "납부금액상세명2", example = " ", description = "납부금액상세명2")
@NotEmpty(message = "납부금액상세명2는 필수입니다.")
private String napAmountDetailNm2;
/**
* 3
*/
@Schema(requiredMode = RequiredMode.REQUIRED, title = "납부금액상세명3", example = " ", description = "납부금액상세명3")
@NotEmpty(message = "납부금액상세명3은 필수입니다.")
private String napAmountDetailNm3;
/**
* 1
*/
@Schema(requiredMode = RequiredMode.REQUIRED, title = "납기구분1", example = " ", description = "납기구분1")
@NotEmpty(message = "납기구분1은 필수입니다.")
private String napGubun1;
/**
* 2
*/
@Schema(requiredMode = RequiredMode.REQUIRED, title = "납기구분2", example = " ", description = "납기구분2")
@NotEmpty(message = "납기구분2는 필수입니다.")
private String napGubun2;
/**
*
*/
@Schema(requiredMode = RequiredMode.AUTO, title = "납기내기한", example = " ", description = "납기내기한")
private String napPd;
/**
* 1
*/
@Schema(requiredMode = RequiredMode.REQUIRED, title = "납기내금액1", example = " ", description = "납기내금액1")
@NotEmpty(message = "납기내금액1은 필수입니다.")
private String napAmount1;
/**
* 2
*/
@Schema(requiredMode = RequiredMode.REQUIRED, title = "납기내금액2", example = " ", description = "납기내금액2")
@NotEmpty(message = "납기내금액2는 필수입니다.")
private String napAmount2;
/**
* 3
*/
@Schema(requiredMode = RequiredMode.REQUIRED, title = "납기내금액3", example = " ", description = "납기내금액3")
@NotEmpty(message = "납기내금액3은 필수입니다.")
private String napAmount3;
/**
* 4
*/
@Schema(requiredMode = RequiredMode.REQUIRED, title = "납기내금액4", example = " ", description = "납기내금액4")
@NotEmpty(message = "납기내금액4는 필수입니다.")
private String napAmount4;
/**
*
*/
@Schema(requiredMode = RequiredMode.REQUIRED, title = "납기내합계액", example = " ", description = "납기내합계액")
@NotEmpty(message = "납기내합계액은 필수입니다.")
private String napAmountTotal;
/**
*
*/
@Schema(requiredMode = RequiredMode.REQUIRED, title = "납기후기한", example = " ", description = "납기후기한")
@NotEmpty(message = "납기후기한은 필수입니다.")
private String napAftPd;
/**
* 1
*/
@Schema(requiredMode = RequiredMode.REQUIRED, title = "납기후금액1", example = " ", description = "납기후금액1")
@NotEmpty(message = "납기후금액1은 필수입니다.")
private String napAftAmount1;
/**
* 2
*/
@Schema(requiredMode = RequiredMode.REQUIRED, title = "납기후금액2", example = " ", description = "납기후금액2")
@NotEmpty(message = "납기후금액2는 필수입니다.")
private String napAftAmount2;
/**
* 3
*/
@Schema(requiredMode = RequiredMode.REQUIRED, title = "납기후금액3", example = " ", description = "납기후금액3")
@NotEmpty(message = "납기후금액3은 필수입니다.")
private String napAftAmount3;
/**
* 4
*/
@Schema(requiredMode = RequiredMode.REQUIRED, title = "납기후금액4", example = " ", description = "납기후금액4")
@NotEmpty(message = "납기후금액4는 필수입니다.")
private String napAftAmount4;
/**
*
*/
@Schema(requiredMode = RequiredMode.REQUIRED, title = "납기후합계액", example = " ", description = "납기후합계액")
@NotEmpty(message = "납기후합계액는 필수입니다.")
private String napAftAmountTotal;
/**
*
*/
@Schema(requiredMode = RequiredMode.REQUIRED, title = "출력일자", example = " ", description = "출력일자")
@NotEmpty(message = "출력일자는 필수입니다.")
private String prtDe;
/**
*
*/
@Schema(requiredMode = RequiredMode.REQUIRED, title = "담당자", example = " ", description = "담당자")
@NotEmpty(message = "담당자는 필수입니다.")
private String worker;
/**
*
*/
@Schema(requiredMode = RequiredMode.REQUIRED, title = "농협가상계좌", example = " ", description = "농협가상계좌")
@NotEmpty(message = "농협가상계좌는 필수입니다.")
private String nVacct;
/**
*
*/
@Schema(requiredMode = RequiredMode.REQUIRED, title = "국민가상계좌", example = " ", description = "국민가상계좌")
@NotEmpty(message = "국민가상계좌는 필수입니다.")
private String kVacct;
/**
*
*/
@Schema(requiredMode = RequiredMode.REQUIRED, title = "우리가상계좌", example = " ", description = "우리가상계좌")
@NotEmpty(message = "우리가상계좌는 필수입니다.")
private String wVacct;
/**
*
*/
@Schema(requiredMode = RequiredMode.REQUIRED, title = "신한가상계좌", example = " ", description = "신한가상계좌")
@NotEmpty(message = "신한가상계좌는 필수입니다.")
private String sVacct;
/**
*
*/
@Schema(requiredMode = RequiredMode.REQUIRED, title = "하나가상계좌", example = " ", description = "하나가상계좌")
@NotEmpty(message = "하나가상계좌는 필수입니다.")
private String hVacct;
/**
*
*/
@Schema(requiredMode = RequiredMode.REQUIRED, title = "우체국가상계좌", example = " ", description = "우체국가상계좌")
@NotEmpty(message = "우체국가상계좌는 필수입니다.")
private String pVacct;
/**
*
*/
@Schema(requiredMode = RequiredMode.REQUIRED, title = "가상계좌받는분", example = " ", description = "가상계좌받는분")
@NotEmpty(message = "가상계좌받는분은 필수입니다.")
private String vacctNm;
}
@Schema(name = "FmcInfExcelRslt", description = "시설관리공단 전자문서 발송대상 엑셀 파일 interface 결과 DTO")
@Data
@NoArgsConstructor
@AllArgsConstructor
@SuperBuilder
@JsonInclude(JsonInclude.Include.NON_NULL)
@EqualsAndHashCode(callSuper = true)
public static class FmcInfExcelRslt extends IpinCiResEncData {
/**
* ID :
* key - unique key
*/
@Schema(requiredMode = RequiredMode.REQUIRED, title = "통합발송상세ID")
private String unitySndngDetailId;
/**
* code - error code
*/
@Schema(requiredMode = RequiredMode.REQUIRED, title = "result")
private String resultCd;
/**
* message - error message
*/
@Schema(requiredMode = RequiredMode.REQUIRED, title = "message")
private String message;
/**
*
*/
@JsonDeserialize(using = LocalDateDeserializer.class)
@JsonFormat(pattern = "yyyy-MM-dd kk:mm:ss")
private LocalDateTime registDt;
/**
*
*/
private String register;
}
}

@ -1,15 +1,20 @@
package kr.xit.biz.ens.model.nice;
import java.io.Serializable;
import javax.validation.Valid;
import javax.validation.constraints.Size;
import org.hibernate.validator.constraints.NotEmpty;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonInclude.Include;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.PropertyNamingStrategies;
import com.fasterxml.jackson.databind.annotation.JsonNaming;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.media.Schema.RequiredMode;
import java.io.Serializable;
import javax.validation.Valid;
import javax.validation.constraints.Size;
import kr.xit.biz.common.AuditFields;
import kr.xit.core.model.IApiResponse;
import kr.xit.core.support.utils.JsonUtils;
@ -20,7 +25,6 @@ import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
import org.hibernate.validator.constraints.NotEmpty;
/**
* <pre>
@ -622,6 +626,7 @@ public class NiceCiDTO {
@NoArgsConstructor
@AllArgsConstructor
@SuperBuilder
@EqualsAndHashCode(callSuper = false)
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
public static class IpinCiResDataBody extends CommonResponseDataBody {

Loading…
Cancel
Save