commit ad380d2b7dad37034b08388352bb46b1f6c5a25b Author: mjkhan21 Date: Thu Jul 27 15:10:33 2023 +0900 최초 커밋 diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..4e76524 --- /dev/null +++ b/pom.xml @@ -0,0 +1,95 @@ + + 4.0.0 + + cokr.xit.interfaces + xit-epost + 23.04.01-SNAPSHOT + jar + + xit-epost + http://maven.apache.org + + + UTF-8 + + 17 + ${java.version} + ${java.version} + + + + + + mvn2s + https://repo1.maven.org/maven2/ + + true + + + true + + + + egovframe + http://maven.egovframe.kr:8080/maven/ + + true + + + false + + + + egovframe2 + http://www.egovframe.go.kr/maven/ + + true + + + false + + + + maven-public + https://nas.xit.co.kr:8888//repository/maven-public/ + + + + + + + cokr.xit.interfaces + xit-filejob + 23.04.01-SNAPSHOT + + + + + install + ${basedir}/target + ${artifactId}-${version} + + + ${basedir}/src/main/resources + + + ${basedir}/src/test/resources + ${basedir}/src/main/resources + + + + + + + maven-snapshot + https://nas.xit.co.kr:8888/repository/maven-snapshots/ + + + + maven-release + https://nas.xit.co.kr:8888/repository/maven-releases/ + + + + \ No newline at end of file diff --git a/src/main/java/cokr/xit/interfaces/epost/DeliveryResult.java b/src/main/java/cokr/xit/interfaces/epost/DeliveryResult.java new file mode 100644 index 0000000..680aa85 --- /dev/null +++ b/src/main/java/cokr/xit/interfaces/epost/DeliveryResult.java @@ -0,0 +1,143 @@ +package cokr.xit.interfaces.epost; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.function.Consumer; +import java.util.stream.Collectors; + +import cokr.xit.foundation.Assert; +import lombok.Getter; +import lombok.Setter; + +/** + * 전자우편 배달 결과 + * @author mjkhan + */ +@Getter +@Setter +public class DeliveryResult extends EmailResult { + /** 결과 유형 */ + public static final String TYPE = "deliv_"; + /** + * 배달 결과 ID + */ + private String dlvrRsltId; + + /** + * 외부연계식별키 + */ + private String conKey; + + /** + * 외부기관구분코드 + */ + private String outsiduserid; + + /** + * 발송인별추가데이터 + */ + private String reletcdata; + + /** + * 등기번호 + */ + private String regino; + + /** + * 배달일자 + */ + private String delivymd; + + /** + * 배달시분 + */ + private String delivhhmi; + + /** + * 배달결과코드 + */ + private String delivrsltcd; + + /** + * 미배달사유코드 + */ + private String nondelivreasncd; + + /** + * 미배달사유명 + */ + private String nondelivreasncdnm; + + /** + * 수령인명 + */ + private String subrecprsnnm; + + /** + * 수령인관계코드 + */ + private String relrecprsncd; + + /** + * 수령인관계명 + */ + private String relrecprsncdnm; + + public DeliveryResult parse(String str) { + String[] content = str.split("\\|", -1); + List> setters = Arrays.asList( + this::setOutsiduserid + , this::setReletcdata + , this::setRegino + , this::setDelivymd + , this::setDelivhhmi + , this::setDelivrsltcd + , this::setNondelivreasncd + , this::setNondelivreasncdnm + , this::setSubrecprsnnm + , this::setRelrecprsncd + , this::setRelrecprsncdnm + ); + + if (setters.size() > content.length) + throw new RuntimeException(String.format("Parsed data has %d fields.", content.length)); + + for (int i = 0; i < setters.size(); ++i) { + Consumer setter = setters.get(i); + String val = content[i]; + setter.accept(val); + } + + return this; + } + + /** 처리 유형 (로그) */ + private static final String PROC_TYPE = "5"; + + @Override + public EmailResultLog toLog() { + EmailResultLog log = new EmailResultLog(); + log.setProcType(PROC_TYPE); + log.setConKey(reletcdata); + log.setRgstNmbr(regino); + return log; + } + + public static Map> byStatus(List results) { + if (Assert.isEmpty(results)) return Collections.emptyMap(); + + HashMap> byStatus = new HashMap<>(); + results.stream() + .collect(Collectors.groupingBy(DeliveryResult::getReletcdata)) + .forEach((conKey, list) -> { + DeliveryResult result = list.get(0); + byStatus.computeIfAbsent(EmailRequest.IN_TRANSIT, key -> new ArrayList<>()).add(result); + }); + + return byStatus; + } +} \ No newline at end of file diff --git a/src/main/java/cokr/xit/interfaces/epost/EmailRequest.java b/src/main/java/cokr/xit/interfaces/epost/EmailRequest.java new file mode 100644 index 0000000..978b73d --- /dev/null +++ b/src/main/java/cokr/xit/interfaces/epost/EmailRequest.java @@ -0,0 +1,273 @@ +package cokr.xit.interfaces.epost; + +import cokr.xit.foundation.AbstractEntity; +import cokr.xit.foundation.data.DataObject; +import lombok.Getter; +import lombok.Setter; + +/** + * 전자우편 신청 + * @author mjkhan + */ +@Getter +@Setter +public class EmailRequest extends AbstractEntity { + /** 발송 대기 */ + public static final String TO_SEND = "01"; + /** 발송 취소 */ + public static final String SEND_CANCELLED = "02"; + /** 발송 */ + public static final String SENT = "03"; + /** 접수 대상 */ + public static final String VALID = "10"; + /** 제작 불가(정합성 결과) */ + public static final String INVALID = "12"; + /** 접수 */ + public static final String REGISTERED = "15"; + /** 제작 완료 */ + public static final String PRODUCED = "20"; + /** 제작 불가(제작 결과) */ + public static final String PROD_FAILED = "22"; + /** 미배달 */ + public static final String UNDELIVERED = "25"; + /** 배달 중 */ + public static final String IN_TRANSIT = "27"; + /** 배달 완료 */ + public static final String DELIVERED = "30"; + + /** + * 외부연계식별키 + */ + private String conKey; + + /** + * 접수우체국국기호 + */ + private String rceptId; + + /** + * 접수코드 + */ + private String dataCd; + + /** + * 취급구분 + */ + private String divKb; + + /** + * 결재방법 + */ + private String dfpayyn; + + /** + * 내용문 유형 + */ + private String rcptKb; + + /** + * 내용문 상세 종류 + */ + private String sealCd; + + /** + * 내용문 종류 + */ + private String wordKb; + + /** + * 내용문 매수 + */ + private Integer mailCnt; + + /** + * 수취인 수 + */ + private Integer recevCnt; + + /** + * 봉투 종류 + */ + private String envCd; + + /** + * 칼라우편물 + */ + private String colorYn; + + /** + * 메일머지 플래그 + */ + private String mmYn; + + /** + * 이면구분 + */ + private String flexCd; + + /** + * 동봉물 개수 + */ + private Integer dmCnt; + + /** + * 반송불필요 여부 + */ + private String sbFg; + + /** + * 승인번호 + */ + private String apvlNb; + + /** + * 신청 일자 + */ + private String sendDate; + + /** + * 전송 시간 + */ + private String sendTime; + + /** + * 연계기관결제부서코드 + */ + private String relorsectCd; + + /** + * 발송기관코드 + */ + private String recevSenderOrgCode; + + /** + * 발송인명 + */ + private String recevSenderNm; + + /** + * 발송인 우편번호 + */ + private String recevSenderZipcode; + + /** + * 주소 + */ + private String recevSenderAddr; + + /** + * 상세주소 + */ + private String recevSenderDetailaddr; + + /** + * 부과부서 전화번호 + */ + private String recevSenderDepartTel; + + /** + * 부과부서 + */ + private String recevSenderDepartNm; + + /** + * 등기구분 + */ + private String recevDivCd; + + /** + * 출력일자 + */ + private String recevPrintDt; + + /** + * 출력연도 + */ + private String recevPrintYear; + + /** + * 출력월 + */ + private String recevPrintMonth; + + /** + * 출력일 + */ + private String recevPrintDay; + + /** + * 부과부서 팩스번호 + */ + private String recevSenderFax; + + /** + * 부과부서 담당자 + */ + private String recevSerderStaff; + + /** + * 부과부서 이메일 + */ + private String recevSenderEmail; + + /** + * 발송 ID + */ + private String sndngId; + + /** + * 작업 코드 + */ + private String jobCd; + + /** + * 추가 데이터1 + */ + private String regVarData1; + + /** + * 추가 데이터2 + */ + private String regVarData2; + + /** + * 추가 데이터3 + */ + private String regVarData3; + + /** + * 추가 데이터4 + */ + private String regVarData4; + + /** + * 추가 데이터5 + */ + private String regVarData5; + +/** + * 우편 처리 상태 + */ + private String postProcStt; + + /** + * 접수 일자 + */ + private String rceptYmd; + + /** + * 삭제 여부 + */ + private String delYn; + + /** 처리 유형 (로그) */ + private static final String PROC_TYPE = "1"; + + public static EmailResultLog toLog(DataObject info) { + EmailResultLog log = new EmailResultLog(); + log.setProcType(PROC_TYPE); + log.setConKey(info.string("CON_KEY")); + log.setRgstNmbr(info.string("RGST_NMBR")); + return log; + } +} \ No newline at end of file diff --git a/src/main/java/cokr/xit/interfaces/epost/EmailRequestDetail.java b/src/main/java/cokr/xit/interfaces/epost/EmailRequestDetail.java new file mode 100644 index 0000000..64863b5 --- /dev/null +++ b/src/main/java/cokr/xit/interfaces/epost/EmailRequestDetail.java @@ -0,0 +1,343 @@ +package cokr.xit.interfaces.epost; + +import cokr.xit.foundation.AbstractEntity; +import lombok.Getter; +import lombok.Setter; + +/** + * 전자우편 신청 상세 + * @author mjkhan + */ +@Getter +@Setter +public class EmailRequestDetail extends AbstractEntity { + /** + * 외부연계식별키 + */ + private String conKey; + + /** + * 등기번호 + */ + private String rgstNmbr; + + /** + * 일련번호 + */ + private String recevSeq; + + /** + * 발송코드 + */ + private String recevCode; + + /** + * 바코드 + */ + private String recevBar1d; + + /** + * 이차원바코드 + */ + private String recevBar2d; + + /** + * 고지번호 + */ + private String recevBillNunber; + + /** + * 문서종류1 + */ + private String recevDocCd1; + + /** + * 문서종류2 + */ + private String recevDocCd2; + + /** + * 문서종류3 + */ + private String recevDocCd3; + + /** + * 문서종류4 + */ + private String recevDocCd4; + + /** + * 문서종류5 + */ + private String recevDocCd5; + + /** + * 과목명1 + */ + private String recevSubj1; + + /** + * 과목명2 + */ + private String recevSubj2; + + /** + * 과목명3 + */ + private String recevSubj3; + + /** + * 위반일시 + */ + private String recevViolateDt; + + /** + * 위반동 + */ + private String recevViolateDong; + + /** + * 위반장소 + */ + private String recevViolatePlace; + + /** + * 법조항 + */ + private String recevLaws; + + /** + * 납부번호1 + */ + private String recevPayNumber1; + + /** + * 납부번호2 + */ + private String recevPayNumber2; + + /** + * OCR0 + */ + private String recevOcr0; + + /** + * OCR1 + */ + private String recevOcr1; + + /** + * OCR2 + */ + private String recevOcr2; + + /** + * 전자납부번호 + */ + private String recevOnlinePayNumber; + + /** + * 과태료 + */ + private String recevFinePrice; + + /** + * 납부금액 + */ + private String recevPayPrice; + + /** + * 납부기한 + */ + private String recevPayDt; + + /** + * 납기내기한 + */ + private String recevPayInDate; + + /** + * 납기내금액 + */ + private String recevPayInPrice; + + /** + * 납기내가산금 + */ + private String recevPayInAddPrice; + + /** + * 납기내합계금액 + */ + private String recevPayInDefaultPrice; + + /** + * 납기후기한 + */ + private String recevPayOutDate; + + /** + * 납기후금액 + */ + private String recevPayOutPrice; + + /** + * 납기후가산금 + */ + private String recevPayOutAddPrice; + + /** + * 납기후합계금액 + */ + private String recevPayOutDefaultPrice; + + /** + * 차량번호 + */ + private String recevCarNumber; + + /** + * 우편번호 + */ + private String recevCarOwnerZipcode; + + /** + * 주소 + */ + private String recevCarOwnerAddr; + + /** + * 상세주소 + */ + private String recevCarOwnerDetailaddr; + + /** + * 소유자명 + */ + private String recevCarOwnerNm; + + /** + * 주민번호 + */ + private String recevCarOwnerSsn; + + /** + * 증거번호 + */ + private String recevEvidenceNumber; + + /** + * 사진장수 + */ + private String recevPhotoCnt; + + /** + * 사진파일명1 + */ + private String recevPhotoFilename1; + + /** + * 사진파일명2 + */ + private String recevPhotoFilename2; + + /** + * 사진파일명3 + */ + private String recevPhotoFilename3; + + /** + * 사진파일명4 + */ + private String recevPhotoFilename4; + + /** + * 가상계좌번호2 + */ + private String vractno2; + + /** + * 가상계좌번호3 + */ + private String vractno3; + + /** + * 가상계좌번호4 + */ + private String vractno4; + + /** + * 가상계좌번호5 + */ + private String vractno5; + + /** + * 가상계좌번호6 + */ + private String vractno6; + + /** + * 가상계좌번호7 + */ + private String vractno7; + + /** + * 가상계좌번호8 + */ + private String vractno8; + + /** + * 가상계좌번호9 + */ + private String vractno9; + + /** + * 가상계좌번호10 + */ + private String vractno10; + + /** + * 가상계좌번호11 + */ + private String vractno11; + + /** + * 추가 데이터1 + */ + private String dtlVarData1; + + /** + * 추가 데이터2 + */ + private String dtlVarData2; + + /** + * 추가 데이터3 + */ + private String dtlVarData3; + + /** + * 추가 데이터4 + */ + private String dtlVarData4; + + /** + * 추가 데이터5 + */ + private String dtlVarData5; + + /** + * 배달 결과 ID + */ + private String dlvrRsltId; + + /** + * 제작 결과 코드 + */ + private String makeRsltCd; + + /** + * 가상계좌번호 + */ + private String vractno; +} \ No newline at end of file diff --git a/src/main/java/cokr/xit/interfaces/epost/EmailRequestQuery.java b/src/main/java/cokr/xit/interfaces/epost/EmailRequestQuery.java new file mode 100644 index 0000000..d90d690 --- /dev/null +++ b/src/main/java/cokr/xit/interfaces/epost/EmailRequestQuery.java @@ -0,0 +1,68 @@ +package cokr.xit.interfaces.epost; + +import cokr.xit.foundation.component.QueryRequest; + +/**전자우편 신청 정보 조회 요청 + * + *

상세 설명: + * + *

+ * ============ 변경 이력 ============
+ * 2023-07-03	mjkhan 최초 작성
+ * ================================
+ * 
+ */ +public class EmailRequestQuery extends QueryRequest { + private static final long serialVersionUID = 1L; + + private String[] conKeys; + private String[] rgstNmbrs; + private String fromRegDate; + private String toRegDate; + private String[] statusList; + + public String[] getConKeys() { + return ifEmpty(conKeys, () -> null); + } + + public EmailRequestQuery setConKeys(String... conKeys) { + this.conKeys = conKeys; + return this; + } + + public String[] getRgstNmbrs() { + return ifEmpty(rgstNmbrs, () -> null); + } + + public EmailRequestQuery setRgstNmbrs(String... rgstNmbrs) { + this.rgstNmbrs = rgstNmbrs; + return this; + } + + public String getFromRegDate() { + return fromRegDate; + } + + public EmailRequestQuery setFromRegDate(String fromRegDate) { + this.fromRegDate = fromRegDate; + return this; + } + + public String getToRegDate() { + return toRegDate; + } + + public EmailRequestQuery setToRegDate(String toRegDate) { + this.toRegDate = toRegDate; + return this; + } + + public String[] getStatusList() { + return ifEmpty(statusList, () -> null); + } + + public EmailRequestQuery setStatusList(String... statusList) { + this.statusList = statusList; + return this; + } +} \ No newline at end of file diff --git a/src/main/java/cokr/xit/interfaces/epost/EmailResult.java b/src/main/java/cokr/xit/interfaces/epost/EmailResult.java new file mode 100644 index 0000000..71bc2f3 --- /dev/null +++ b/src/main/java/cokr/xit/interfaces/epost/EmailResult.java @@ -0,0 +1,36 @@ +package cokr.xit.interfaces.epost; + +import cokr.xit.foundation.AbstractEntity; + +/**전자우편 신청 결과 + * @author mjkhan + */ +public abstract class EmailResult extends AbstractEntity { + /** 결과 정보 등록 여부 */ + private boolean saved; + + /**결과정보 등록 여부를 반환한다. + * @return 결과정보 등록 여부 + *
  • 결과정보가 등록됐으면 true
  • + *
  • 그렇지 않으면 false
  • + *
+ */ + public boolean isSaved() { + return saved; + } + + /**결과정보 등록 여부를 설정한다. + * @param saved 결과정보 등록 여부 + *
  • 결과정보가 등록됐으면 true
  • + *
  • 그렇지 않으면 false
  • + *
+ */ + public void setSaved(boolean saved) { + this.saved = saved; + } + + /**전자우편 신청 결과를 전자우편 신청 처리 로그로 반환한다. + * @return 전자우편 신청 처리 로그 + */ + public abstract EmailResultLog toLog(); +} \ No newline at end of file diff --git a/src/main/java/cokr/xit/interfaces/epost/EmailResultLog.java b/src/main/java/cokr/xit/interfaces/epost/EmailResultLog.java new file mode 100644 index 0000000..5725314 --- /dev/null +++ b/src/main/java/cokr/xit/interfaces/epost/EmailResultLog.java @@ -0,0 +1,48 @@ +package cokr.xit.interfaces.epost; + +import cokr.xit.foundation.AbstractEntity; +import lombok.Getter; +import lombok.Setter; + +/** + * 전자우편 신청 결과 로그 + * @author mjkhan + */ +@Getter +@Setter +public class EmailResultLog extends AbstractEntity { + /** + * 처리 ID + */ + private String procId; + + /** + * 처리 순번 + */ + private long procSeq; + + /** + * 처리 유형 + */ + private String procType; + + /** + * 결과 ID + */ + private String resultId; + + /** + * 외부연계 식별키 + */ + private String conKey; + + /** + * 등기번호 + */ + private String rgstNmbr; + + /** + * 업무 연계 상태 + */ + private String procStt; +} \ No newline at end of file diff --git a/src/main/java/cokr/xit/interfaces/epost/ProductionResult.java b/src/main/java/cokr/xit/interfaces/epost/ProductionResult.java new file mode 100644 index 0000000..f206e8d --- /dev/null +++ b/src/main/java/cokr/xit/interfaces/epost/ProductionResult.java @@ -0,0 +1,107 @@ +package cokr.xit.interfaces.epost; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.function.Consumer; +import java.util.stream.Collectors; + +import cokr.xit.foundation.Assert; +import lombok.Getter; +import lombok.Setter; + +/** + * 전자우편 제작 결과 + * @author mjkhan + */ +@Getter +@Setter +public class ProductionResult extends EmailResult { + /** 결과 유형 */ + public static final String TYPE = "prt_"; + /** + * 외부연계식별키 + */ + private String conKey; + + /** + * 등기 번호 + */ + private String rgstNmbr; + + /** + * 발송인별추가데이터 + */ + private String reletcdata; + + /** + * 제작결과 + */ + private String dataCd; + + /** + * 내용문매수 + */ + private Integer mailCnt; + + public ProductionResult parse(String str) { + String[] content = str.split("\\|", -1); + List> setters = Arrays.asList( + this::setRgstNmbr + , this::setConKey + , this::setReletcdata + , this::setDataCd + , this::parseTotpostPrc + ); + + if (setters.size() > content.length) + throw new RuntimeException(String.format("Parsed data has %d fields.", content.length)); + + for (int i = 0; i < setters.size(); ++i) { + Consumer setter = setters.get(i); + String val = content[i]; + setter.accept(val); + } + + return this; + } + + private void parseTotpostPrc(String str) { + String val = Assert.ifEmpty(str, "0"); + setMailCnt(Integer.valueOf(val)); + } + + /** 처리 유형 (로그) */ + private static final String PROC_TYPE = "4"; + + @Override + public EmailResultLog toLog() { + EmailResultLog log = new EmailResultLog(); + log.setProcType(PROC_TYPE); + log.setConKey(conKey); + log.setRgstNmbr(rgstNmbr); + return log; + } + + public static Map> byStatus(List results) { + if (Assert.isEmpty(results)) return Collections.emptyMap(); + + HashMap> byStatus = new HashMap<>(); + results.stream() + .collect(Collectors.groupingBy(ProductionResult::getReletcdata)) + .forEach((conKey, list) -> { + // 하나라도 제작된 것이 있으면 제작 완료 + boolean produced = list.stream().filter(result -> "20".equals(result.getDataCd())).count() > 0; + String status = produced ? EmailRequest.PRODUCED : EmailRequest.PROD_FAILED; + ProductionResult result = list.get(0); + + List tmp = byStatus.computeIfAbsent(status, key -> new ArrayList<>()); + tmp.add(result); + }); + + return byStatus; + } +} \ No newline at end of file diff --git a/src/main/java/cokr/xit/interfaces/epost/ReceptionResult.java b/src/main/java/cokr/xit/interfaces/epost/ReceptionResult.java new file mode 100644 index 0000000..bf99c5d --- /dev/null +++ b/src/main/java/cokr/xit/interfaces/epost/ReceptionResult.java @@ -0,0 +1,154 @@ +package cokr.xit.interfaces.epost; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.function.Consumer; +import java.util.stream.Collectors; + +import cokr.xit.foundation.Assert; +import lombok.Getter; +import lombok.Setter; + +/**전자우편 수신 결과 + * @author mjkhan + */ + +@Getter +@Setter +public class ReceptionResult extends EmailResult { + /** 결과 유형 */ + public static final String TYPE = "check_"; + /** + * 수신 결과 ID + */ + private String rcptnRsltId; + + /** + * 연계기관코드 + */ + private String outsiduserid; + + /** + * 수신일시 + */ + private String initTime; + + /** + * 수신파일명 + */ + private String recvFilename; + + /** + * 연계키 + */ + private String reldivkey; + + /** + * 수취인순번 + */ + private Integer recprsnseq; + + /** + * 등기번호 + */ + private String regino; + + /** + * 첨부파일명 + */ + private String attachfilenm; + + /** + * 1차검증 + */ + private String junghap1; + + /** + * 2차검증 + */ + private String junghap2; + + /** + * 3차검증 + */ + private String junghap3; + + /** + * 상태코드 + */ + private String code; + + /** + * 메시지 + */ + private String msg; + + public ReceptionResult parse(String str) { + String[] content = str.split("\\|", -1); + List> setters = Arrays.asList( + this::setOutsiduserid + , this::setInitTime + , this::setRecvFilename + , this::setReldivkey + , this::parseRecprsnseq + , this::setRegino + , this::setAttachfilenm + , this::setJunghap1 + , this::setJunghap2 + , this::setJunghap3 + , this::setCode + , this::setMsg + ); + + if (setters.size() > content.length) + throw new RuntimeException(String.format("Parsed data has %d fields.", content.length)); + + for (int i = 0; i < setters.size(); ++i) { + Consumer setter = setters.get(i); + String val = content[i]; + setter.accept(val); + } + return this; + } + + private void parseRecprsnseq(String str) { + String val = Assert.ifEmpty(str, "0"); + setRecprsnseq(Integer.valueOf(val)); + } + + /** 처리 유형 (로그) */ + private static final String PROC_TYPE = "2"; + + @Override + public EmailResultLog toLog() { + EmailResultLog log = new EmailResultLog(); + log.setProcType(PROC_TYPE); + log.setResultId(rcptnRsltId); + log.setConKey(reldivkey); + log.setRgstNmbr(regino); + return log; + } + + public static Map> byStatus(List results) { + if (Assert.isEmpty(results)) return Collections.emptyMap(); + + HashMap> byStatus = new HashMap<>(); + results.stream() + .collect(Collectors.groupingBy(ReceptionResult::getReldivkey)) + .forEach((conKey, list) -> { + // 하나라도 오류면 제작불가 + boolean invalid = list.stream().filter(result -> !"200".equals(result.getCode())).count() > 0; + ReceptionResult result = list.get(0); + String status = invalid ? EmailRequest.INVALID : EmailRequest.VALID; + + List tmp = byStatus.computeIfAbsent(status, key -> new ArrayList<>()); + tmp.add(result); + }); + + return byStatus; + } +} \ No newline at end of file diff --git a/src/main/java/cokr/xit/interfaces/epost/RegistrationResult.java b/src/main/java/cokr/xit/interfaces/epost/RegistrationResult.java new file mode 100644 index 0000000..1b93601 --- /dev/null +++ b/src/main/java/cokr/xit/interfaces/epost/RegistrationResult.java @@ -0,0 +1,145 @@ +package cokr.xit.interfaces.epost; + +import java.util.Arrays; +import java.util.List; +import java.util.function.Consumer; + +import cokr.xit.foundation.Assert; +import lombok.Getter; +import lombok.Setter; + +/** +* 전자우편 접수 결과 +* @author mjkhan +*/ +@Getter +@Setter +public class RegistrationResult extends EmailResult { + /** 결과 유형 */ + public static final String TYPE = "recv_"; + + /** + * 접수 결과 ID + */ + private String rcptRsltId; + + /** + * 외부기관구분코드 + */ + private String conOrg; + + /** + * 결제부서코드 + */ + private String relorsectCd; + + /** + * 발송인별추가데이터 + */ + private String reletcdata; + + /** + * 기관발송일자 + */ + private String extriRegymd; + + /** + * 접수일자 + */ + private String rceptYmd; + + /** + * 접수우체국국기호 + */ + private String rceptId; + + /** + * 취급구분 + */ + private String divKb; + + /** + * 발송수량 + */ + private Integer rceptCnt; + + /** + * 결제금액 + */ + private Integer rceptAmt; + + /** + * 제작수수료 + */ + private Integer usefeeAmt; + + /** + * 우편요금 + */ + private Integer totpostPrc; + + /** + * 작업 코드 + */ + private String jobCd; + + public RegistrationResult parse(String str) { + String[] content = str.split("\\|", -1); + List> setters = Arrays.asList( + this::setConOrg + , this::setRelorsectCd + , this::setReletcdata + , this::setExtriRegymd + , this::setRceptYmd + , this::setRceptId + , this::setDivKb + , this::parseRceptCnt + , this::parseRceptAmt + , this::parseUsefeeAmt + , this::parseTotpostPrc + ); + + if (setters.size() > content.length) + throw new RuntimeException(String.format("Parsed data has %d fields.", content.length)); + + for (int i = 0; i < setters.size(); ++i) { + Consumer setter = setters.get(i); + String val = content[i]; + setter.accept(val); + } + return this; + } + + private void parseRceptCnt(String str) { + String val = Assert.ifEmpty(str, "0"); + setRceptCnt(Integer.valueOf(val)); + } + + private void parseRceptAmt(String str) { + String val = Assert.ifEmpty(str, "0"); + setRceptAmt(Integer.valueOf(val)); + } + + private void parseUsefeeAmt(String str) { + String val = Assert.ifEmpty(str, "0"); + setUsefeeAmt(Integer.valueOf(val)); + } + + private void parseTotpostPrc(String str) { + String val = Assert.ifEmpty(str, "0"); + setTotpostPrc(Integer.valueOf(val)); + + } + + /** 처리 유형 (로그) */ + private static final String PROC_TYPE = "3"; + + @Override + public EmailResultLog toLog() { + EmailResultLog log = new EmailResultLog(); + log.setProcType(PROC_TYPE); + log.setResultId(rcptRsltId); + log.setConKey(reletcdata); + return log; + } +} \ No newline at end of file diff --git a/src/main/java/cokr/xit/interfaces/epost/dao/EmailRequestMapper.java b/src/main/java/cokr/xit/interfaces/epost/dao/EmailRequestMapper.java new file mode 100644 index 0000000..cf799c6 --- /dev/null +++ b/src/main/java/cokr/xit/interfaces/epost/dao/EmailRequestMapper.java @@ -0,0 +1,342 @@ +package cokr.xit.interfaces.epost.dao; + +import java.util.List; +import java.util.Map; + +import org.egovframe.rte.psl.dataaccess.mapper.Mapper; + +import cokr.xit.foundation.component.AbstractMapper; +import cokr.xit.foundation.data.DataObject; +import cokr.xit.foundation.util.ListSupport; +import cokr.xit.interfaces.epost.EmailRequest; +import cokr.xit.interfaces.epost.EmailRequestDetail; +import cokr.xit.interfaces.epost.EmailRequestQuery; +import cokr.xit.interfaces.epost.EmailResult; + +/** 전자우편 신청 정보 DAO + * + *

상세 설명: + * + *

+ * ============ 변경 이력 ============
+ * 2023-07-03	mjkhan 최초 작성
+ * ================================
+ * 
+ */ +@Mapper("emailRequestMapper") +public interface EmailRequestMapper extends AbstractMapper { + /**전송 대상 신청 목록을 조회한다. + * @param params 파라미터 + *
  • "conOrg" - 외부기관 구분코드
  • + *
+ * @return 전송 대상 접수 목록 + */ + List selectSendingRequestList(Map params); + + /**전송 대상 신청 목록을 조회한다. + * @param conOrg 외부기관 구분코드 + * @return 전송 대상 접수 목록 + */ + default List selectSendingRequestList(String conOrg) { + return selectSendingRequestList(params().set("conOrg", conOrg)); + } + + /**지정한 조건에 따라 전자우편 신청 목록을 조회하여 반환한다.
+ * @param req 전자우편 신청 조회 조건 + * @return 전자우편 신청 목록 + */ + List selectRequestList(EmailRequestQuery req); + + /**지정한 conKey의 전자우편 신청 정보를 조회하여 반환한다.
+ * @param conKey 외부연계식별키 + * @return 전자우편 신청 정보 + */ + default DataObject selectRequestInfo(String conKey) { + List list = selectRequestList(new EmailRequestQuery().setConKeys(conKey)); + return !list.isEmpty() ? list.get(0) : null; + } + + /**지정한 조건에 따라 전자우편 신청 객체들을 반환한다. + * @param req 전자우편 신청 조회 조건 + * @return 전자우편 신청 객체 목록 + */ + List selectRequests(EmailRequestQuery req); + + /**지정한 조건에 따라 전자우편 신청 객체들을 반환한다. + * @param req 전자우편 신청 조회 조건 + * @return 전자우편 신청 객체 목록 + */ + default List selectRequests(String... conKeys) { + return selectRequests(new EmailRequestQuery().setConKeys(conKeys)); + } + + /**전자우편 신청 정보를 등록한다. + * @param params 파라미터 + *
  • "emailRequest" - 전자우편 신청
  • + *
  • "currentUser" - 현재 접속한 사용자
  • + *
+ * @return 저장된 정보수 + */ + int insertRequest(Map params); + + /**전자우편 신청 정보를 등록한다. + * @param request 전자우편 신청 + * @return 저장 여부 + *
  • 저장됐으면 true
  • + *
  • 그렇지 않으면 false
  • + *
+ */ + default boolean insert(EmailRequest request) { + return request != null + && insertRequest(params().set("emailRequest", request)) == 1; + } + + /**전자우편 신청 정보를 수정한다. + * @param params 파라미터 + *
  • "emailRequest" - 전자우편 신청
  • + *
  • "currentUser" - 현재 접속한 사용자
  • + *
+ * @return 저장된 정보수 + */ + int updateRequest(Map params); + + /**전자우편 신청 정보를 수정한다. + * @param request 전자우편 신청 + * @return 저장 여부 + *
  • 저장됐으면 true
  • + *
  • 그렇지 않으면 false
  • + *
+ */ + default boolean update(EmailRequest request) { + return request != null + && updateRequest(params().set("emailRequest", request)) == 1; + } + + /**전자우편 신청의 처리 상태를 변경한다. + * @param params 파라미터 + *
  • "resultType" - 신청 처리 결과 유형
  • + *
  • "results" - 신청 처리 결과
  • + *
  • "maxStatus" - 반영 기준 처리 상태
  • + *
  • "status" - 처리 상태
  • + *
  • "conKeys" - conKey
  • + *
  • "currentUser" - 현재 접속한 사용자
  • + *
+ * @return 저장된 정보수 + */ + int updateRequestStatus(Map params); + + /**전자우편 신청의 처리 상태를 변경한다. + * @param maxStatus 반영 기준 처리 상태 + * @param status 처리 상태 + * @param conKeys 외부연계식별키 + * @param workSize 한 번에 저장할 데이터 수 + * @return 저장된 정보수 + */ + default int updateRequestStatus(String resultType, Iterable results, String maxStatus, String status, int workSize) { + List list = ListSupport.asList(results); + if (list.isEmpty()) return 0; + + ListSupport listSupport = new ListSupport() + .setWorkSize(workSize) + .setIterable(list.stream().filter(EmailResult::isSaved).toList()); + + DataObject params = params() + .set("resultType", resultType) + .set("maxStatus", maxStatus) + .set("status", status); + + int affected = 0; + + for (List objs: listSupport.split()) { + affected += updateRequestStatus( + params.set("results", objs) + ); + } + + return affected; + } + + /**전자우편 신청의 처리 상태를 변경한다. + * @param maxStatus 반영 기준 처리 상태 + * @param status 처리 상태 + * @param conKeys 외부연계식별키 + * @param workSize 한 번에 저장할 데이터 수 + * @return 저장된 정보수 + */ + default int updateRequestStatus(String maxStatus, String status, Iterable conKeys, int workSize) { + ListSupport listSupport = new ListSupport() + .setWorkSize(workSize) + .setIterable(conKeys); + + DataObject params = params() + .set("status", status) + .set("maxStatus", maxStatus); + int affected = 0; + + for (List keys: listSupport.split()) { + affected += updateRequestStatus( + params.set("conKeys", keys) + ); + } + + return affected; + } + + /**전자우편 신청의 처리 상태를 변경한다. + * @param status 처리 상태 + * @param conKeys 외부연계식별키 + * @return 저장된 정보수 + */ + default int updateRequestStatus(String status, Iterable conKeys, int workSize) { + return updateRequestStatus(status, status, conKeys, workSize); + } + + /**배달 중 상태의 전자우편 신청을 배달 완료로 업데이트 한다. + * @param params 파라미터 + *
  • expiryDays - 만료일수
  • + *
  • status - 배달 완료 코드
  • + *
+ * @return 저장된 정보수 + */ + int updateRequestAsDelivered(Map params); + + /**배달 중 상태의 전자우편 신청을 배달 완료로 업데이트 한다. + * @param expiryDays - 만료일수 + * @param status - 배달 완료 코드 + * @return 저장된 정보수 + */ + default int updateRequestAsDelivered(int expiryDays, String status) { + DataObject params = params() + .set("expiryDays", expiryDays) + .set("status", status); + return updateRequestAsDelivered(params); + } + + /**지정한 전자우편 신청을 삭제한다. + * @param params 파라미터 + *
  • "conKeys" - 외부연계식별키
  • + *
  • "currentUser" - 현재 접속한 사용자
  • + *
+ * @return 저장된 정보수 + */ + int deleteRequest(Map params); + + /**전자우편 신청 정보를 삭제한다. + * @param conKeys 외부연계식별키 + * @return 저장된 정보수 + */ + default int deleteRequest(String... conKeys) { + return deleteRequest(params().set("conKeys", conKeys)); + } + + /**지정한 조건에 따라 전자우편 신청 상세 목록을 조회하여 반환한다.
+ * @param req 전자우편 신청 상세 조회 조건 + * @return 전자우편 신청 상세 목록 + */ + List selectRequestDetailList(EmailRequestQuery req); + + /**지정한 조건에 따라 전자우편 신청 상세 정보를 조회하여 반환한다.
+ * @param conKey 외부연계식별키 + * @param rgstNmbr 등기번호 + * @return 전자우편 신청 상세 목록 + */ + default DataObject selectRequestDetailInfo(String conKey, String rgstNmbr) { + List list = selectRequestDetailList(new EmailRequestQuery().setConKeys(conKey).setRgstNmbrs(rgstNmbr)); + return !list.isEmpty() ? list.get(0) : null; + } + + /**지정한 조건에 따라 전자우편 신청 상세 객체들을 반환한다. + * @param req 전자우편 신청 상세 조회 조건 + * @return 전자우편 신청 상세 신청 객체 목록 + */ + List selectRequestDetails(EmailRequestQuery req); + + /**지정한 조건에 따라 전자우편 신청 상세 객체들을 반환한다. + * @param conKey 외부연계식별키 + * @return 전자우편 신청 상세 객체 목록 + */ + default List selectRequestDetails(String conKey) { + return selectRequestDetails(new EmailRequestQuery().setConKeys(conKey)); + } + + /**지정한 조건에 따라 전자우편 신청 상세 객체를 반환한다. + * @param conKey 외부연계식별키 + * @param rgstNmbr 등기번호 + * @return 전자우편 신청 상세 객체 + */ + default EmailRequestDetail selectRequestDetail(String conKey, String rgstNmbr) { + List list = selectRequestDetails(new EmailRequestQuery().setConKeys(conKey).setRgstNmbrs(rgstNmbr)); + return !list.isEmpty() ? list.get(0) : null; + } + + /**전자우편 신청 상세 정보를 등록한다. + * @param params 파라미터 + *
  • "emailRequestDetail" - 전자우편 신청 상세
  • + *
  • "currentUser" - 현재 접속한 사용자
  • + *
+ * @return 저장된 정보수 + */ + int insertRequestDetail(Map params); + + /**전자우편 신청 상세 정보를 등록한다. + * @param requestDetail 전자우편 신청 상세 + * @return 저장 여부 + *
  • 저장됐으면 true
  • + *
  • 그렇지 않으면 false
  • + *
+ */ + default boolean insert(EmailRequestDetail requestDetail) { + return requestDetail != null + && insertRequestDetail(params().set("emailRequestDetail", requestDetail)) == 1; + } + + /**전자우편 신청 상세 정보를 수정한다. + * @param params 파라미터 + *
  • "emailRequestDetail" - 전자우편 신청 상세
  • + *
  • "currentUser" - 현재 접속한 사용자
  • + *
+ * @return 저장된 정보수 + */ + int updateRequestDetail(Map params); + + /**전자우편 신청 상세 정보를 수정한다. + * @param requestDetail 전자우편 신청 상세 + * @return 저장 여부 + *
  • 저장됐으면 true
  • + *
  • 그렇지 않으면 false
  • + *
+ */ + default boolean update(EmailRequestDetail requestDetail) { + return requestDetail != null + && updateRequestDetail(params().set("emailRequestDetail", requestDetail)) == 1; + } + + /**전자우편 신청 상세 정보의 상태를 변경한다. + * @param params 파라미터 + * @return 저장된 정보수 + */ + int updateRequestDetailStatus(Map params); + + /**전자우편 신청 상세 정보의 상태를 변경한다. + * @param resultType 결과 유형 + * @param results 결과 목록 + * @param workSize 한 번에 저장할 데이터 수 + * @return 저장된 정보수 + */ + default int updateRequestDetailStatus(String resultType, List results, int workSize) { + int affected = 0; + + ListSupport listSupport = new ListSupport() + .setWorkSize(workSize) + .setIterable(results); + + DataObject params = params().set("resultType", resultType); + + for (List list: listSupport.split()) { + params.set("results", list); + affected += updateRequestDetailStatus(params); + } + + return affected; + } +} \ No newline at end of file diff --git a/src/main/java/cokr/xit/interfaces/epost/dao/EmailResultMapper.java b/src/main/java/cokr/xit/interfaces/epost/dao/EmailResultMapper.java new file mode 100644 index 0000000..6302107 --- /dev/null +++ b/src/main/java/cokr/xit/interfaces/epost/dao/EmailResultMapper.java @@ -0,0 +1,224 @@ +package cokr.xit.interfaces.epost.dao; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.function.Function; + +import org.egovframe.rte.psl.dataaccess.mapper.Mapper; + +import cokr.xit.foundation.component.AbstractMapper; +import cokr.xit.foundation.data.DataObject; +import cokr.xit.foundation.util.ListSupport; +import cokr.xit.interfaces.epost.DeliveryResult; +import cokr.xit.interfaces.epost.EmailResult; +import cokr.xit.interfaces.epost.EmailResultLog; +import cokr.xit.interfaces.epost.ProductionResult; +import cokr.xit.interfaces.epost.ReceptionResult; +import cokr.xit.interfaces.epost.RegistrationResult; + +/** 전자우편 결과 정보 DAO + * + *

상세 설명: + * + *

+ * ============ 변경 이력 ============
+ * 2023-07-03	mjkhan 최초 작성
+ * ================================
+ * 
+ */ +@Mapper("emailResultMapper") +public interface EmailResultMapper extends AbstractMapper { + /**전자우편 수신 결과를 등록한다. + * @param result 전자우편 수신 결과 + * @return 저장된 정보수 + */ + int insertReceptionResult(ReceptionResult result); + + private int insertEmailResults(Iterable results, Function insert) { + int affected = 0; + + for (T result: results) { + int saved = insert.apply(result); + result.setSaved(saved > 0); + affected += saved; + } + + return affected; + } + + /**전자우편 수신 결과를 등록한다. + * @param results 전자우편 수신 결과 + * @return 저장된 정보수 + */ + default int insertReceptionResults(Iterable results) { + return insertEmailResults(results, this::insertReceptionResult); + } + + /**전자우편 접수 결과를 등록한다. + * @param result 전자우편 접수 결과 + * @return 저장된 정보수 + */ + int insertRegistrationResult(RegistrationResult result); + + /**전자우편 접수 결과를 등록한다. + * @param results 전자우편 접수 결과 + * @return 저장된 정보수 + */ + default int insertRegistrationResults(Iterable results) { + return insertEmailResults(results, this::insertRegistrationResult); + } + + /**전자우편 접수 결과 정보(jobCd)를 수정한다. + * @param params 파라미터 + *
  • "conKeys" - 외부 연계 키
  • + *
+ * @return 저장된 정보수 + */ + int updateRegistrationResult(Map params); + + /**전자우편 접수 결과 정보(jobCd)를 수정한다. + * @param conKeys - 외부 연계 키 + * @param workSize 한 번에 저장할 데이터 수 + * @return 저장된 정보수 + */ + default int updateRegistrationResult(List results, int workSize) { + List conKeys = results.stream() + .filter(RegistrationResult::isSaved) + .map(RegistrationResult::getReletcdata) + .toList(); + + ListSupport listSupport = new ListSupport() + .setWorkSize(workSize) + .setIterable(conKeys); + int affected = 0; + Map params = params(); + + for (List keys: listSupport.split()) { + params.put("conKeys", keys); + affected += updateRegistrationResult(params); + } + + return affected; + } + + /**전자우편 제작 결과를 등록한다. + * @param result 전자우편 제작 결과 + * @return 저장된 정보수 + */ + int insertProductionResult(ProductionResult result); + + /**전자우편 제작 결과를 등록한다. + * @param results 전자우편 제작 결과 + * @return 저장된 정보수 + */ + default int insertProductionResults(Iterable results) { + return insertEmailResults(results, this::insertProductionResult); + } + + /**전자우편 배달 결과를 등록한다. + * @param result 전자우편 배달 결과 + * @return 저장된 정보수 + */ + int insertDeliveryResult(DeliveryResult result); + + /**전자우편 배달 결과를 등록한다. + * @param results 전자우편 배달 결과 + * @return 저장된 정보수 + */ + default int insertDeliveryResults(Iterable results) { + return insertEmailResults(results, this::insertDeliveryResult); + } + + /**전자우편 신청 결과 로그를 조회한다. + * @param params 파라미터 + *
  • procID - 전자우편 신청 결과 처리 아이디
  • + *
  • fetchSize - 반환할 조회 결과 갯수
  • + *
+ * @return 전자우편 신청 결과 로그 + */ + List selectResultLogs(Map params); + + /**전자우편 신청결과 로그를 조회한다. + * @param procID 전자우편 신청결과 처리 아이디 + * @param fetchSize 반환할 조회 결과 갯수 + * @return 전자우편 처리 로그 + */ + default List selectResultLogs(String procID, int fetchSize) { + DataObject params = params() + .set("procID", procID) + .set("pageNum", 1) + .set("fetchSize", fetchSize) + .set("orderBy", "PROC_SEQ"); + return selectResultLogs(params); + } + + /**전자우편 신청결과 로그 정보를 등록한다. + * @param params 파라미터 + *
  • "logs" - 전자우편 처리 로그
  • + *
+ * @return 저장된 정보수 + */ + int insertResultLogs(Map params); + + /**전자우편 신청결과 로그 정보를 등록한다. + * @param logs 전자우편 신청결과 로그 + * @param workSize 한 번에 저장할 데이터 수 + * @return 처리 아이디 + */ + default String insertResultLogs(List logs, int workSize) { + List list = ListSupport.asList(logs); + if (list.isEmpty()) return null; + + ListSupport listSupport = new ListSupport() + .setWorkSize(workSize) + .setIterable(logs); + + String procID = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()); + for (int i = 0; i < logs.size(); ++i) { + EmailResultLog log = logs.get(i); + log.setProcId(procID); + log.setProcSeq(i + 1); + } + + DataObject params = params(); + + for (List objs: listSupport.split()) { + params.set("logs", objs); + insertResultLogs(params); + } + + return procID; + } + + /**전자우편 신청결과 로그 상태를 업데이트 한다. + * @param params 파라미터 + *
  • "logs" - 변경된 상태의 전자우편 신청결과 로그 목록
  • + *
+ * @return 저장된 정보수 + */ + int updateResultLogStatus(Map params); + + /**전자우편 신청결과 로그 상태를 업데이트 한다. + * @param logs 변경된 상태의 전자우편 신청결과 로그 목록 + * @param workSize 한 번에 저장할 데이터 수 + * @return 저장된 정보수 + */ + default int updateResultLogStatus(List logs, int workSize) { + ListSupport listSupport = new ListSupport() + .setWorkSize(workSize) + .setIterable(logs); + + DataObject params = params(); + + int affected = 0; + + for (List objs: listSupport.split()) { + params.set("logs", objs); + affected += updateResultLogStatus(params); + } + + return affected; + } +} \ No newline at end of file diff --git a/src/main/java/cokr/xit/interfaces/epost/dao/package-info.java b/src/main/java/cokr/xit/interfaces/epost/dao/package-info.java new file mode 100644 index 0000000..66e0d59 --- /dev/null +++ b/src/main/java/cokr/xit/interfaces/epost/dao/package-info.java @@ -0,0 +1,3 @@ +/**국민 신문고와의 파일 연계 실행을 위한 DAO + */ +package cokr.xit.interfaces.epost.dao; \ No newline at end of file diff --git a/src/main/java/cokr/xit/interfaces/epost/package-info.java b/src/main/java/cokr/xit/interfaces/epost/package-info.java new file mode 100644 index 0000000..8d612a4 --- /dev/null +++ b/src/main/java/cokr/xit/interfaces/epost/package-info.java @@ -0,0 +1,17 @@ +/**국민 신문고와의 파일 연계를 제공한다. + *

국민 신문고와 연계하는 파일로는 + *

  • 수신 - 단속 민원
  • + *
  • 전송 - 단속 민원의 답변/반송
  • + *
+ * 등이 있다. + *

수신한 민원 파일은 내용을 파싱하여 데이터베이스의 다음 테이블에 저장한다. + *

  • 민원 내용 - TB_ESB_INTERFACE
  • + *
  • 민원 첨부파일 이름 및 내용 - TB_ESB_INTERFACE_FILE
  • + *
  • 첨부파일 저장 경로 - TB_FILE
  • + *
+ * 전송할 민원의 답변/반송 정보는 데이터베이스의 다음 테이블에 저장한다. + *
  • 전송 민원 답변/반송 - TB_ESB_INTERFACE_TRSM
  • + *
+ * 파일의 수신과 전송을 위한 설정은 'conf/file-job.conf' 파일에 지정한다. + */ +package cokr.xit.interfaces.epost; \ No newline at end of file diff --git a/src/main/java/cokr/xit/interfaces/epost/service/EmailRequestService.java b/src/main/java/cokr/xit/interfaces/epost/service/EmailRequestService.java new file mode 100644 index 0000000..218a102 --- /dev/null +++ b/src/main/java/cokr/xit/interfaces/epost/service/EmailRequestService.java @@ -0,0 +1,116 @@ +package cokr.xit.interfaces.epost.service; + +import java.util.List; + +import cokr.xit.foundation.data.DataObject; +import cokr.xit.interfaces.epost.EmailRequest; +import cokr.xit.interfaces.epost.EmailRequestDetail; +import cokr.xit.interfaces.epost.EmailRequestQuery; + +/**전자우편 신청 관리 서비스 인터페이스. + * + *

상세 설명: + * + *

+ * ============ 변경 이력 ============
+ * 2023-07-03	mjkhan 최초 작성
+ * ================================
+ * 
+ */ +public interface EmailRequestService { + /**전자우편 접수 요청을 전송한다. + */ + void sendRequests(); + + /**지정한 조건에 따라 전자우편 신청 목록을 조회하여 반환한다. + * @param req 전자우편 신청 조회 조건 + * @return 전자우편 신청 목록 + */ + List getRequestList(EmailRequestQuery req); + + /**지정한 conKey의 전자우편 신청 정보를 조회하여 반환한다. + * @param conKey 외부연계식별키 + * @return 전자우편 신청 정보 + */ + DataObject getRequestInfo(String conKey); + + /**지정한 conKeys의 전자우편 신청 객체들을 반환한다. + * @param conKeys 외부연계식별키 + * @return 전자우편 신청 객체 목록 + */ + List getRequests(String... conKeys); + + /**전자우편 신청 정보를 등록한다. + * @param request 전자우편 신청 + * @return 저장 여부 + *
  • 저장됐으면 true
  • + *
  • 그렇지 않으면 false
  • + *
+ */ + boolean create(EmailRequest request); + + /**전자우편 신청 정보를 수정한다. + * @param request 전자우편 신청 + * @return 저장 여부 + *
  • 저장됐으면 true
  • + *
  • 그렇지 않으면 false
  • + *
+ */ + boolean update(EmailRequest request); + + /**배달 중 상태의 전자우편 신청을 배달 완료로 업데이트 한다.
+ * 만료일수는 file-job.conf의 epost-send-request/expiryDays에 설정된 값을 사용한다. + * @return 저장된 정보수 + */ + void updateRequestAsDelivered(); + + /**전자우편 신청 정보를 삭제한다. + * @param conKeys 외부연계식별키 + * @return 저장된 정보수 + */ + int removeRequest(String... conKeys); + + /**지정한 조건에 따라 전자우편 신청 상세 목록을 조회하여 반환한다. + * @param req 전자우편 신청 상세 조회 조건 + * @return 전자우편 신청 상세 목록 + */ + List getRequestDetailList(EmailRequestQuery req); + + /**지정한 조건에 따라 전자우편 신청 상세 정보를 조회하여 반환한다.
+ * @param conKey 외부연계식별키 + * @param rgstNmbr 등기번호 + * @return 전자우편 신청 상세 목록 + */ + DataObject getRequestDetailInfo(String conKey, String rgstNmbr); + + /**지정한 조건에 따라 전자우편 신청 상세 객체들을 반환한다. + * @param conKey 외부연계식별키 + * @return 전자우편 신청 상세 객체 목록 + */ + List getRequestDetails(String conKey); + + /**지정한 조건에 따라 전자우편 신청 상세 객체들을 반환한다. + * @param conKey 외부연계식별키 + * @param rgstNmbr 등기번호 + * @return 전자우편 신청 상세 객체 목록 + */ + EmailRequestDetail getRequestDetail(String conKey, String rgstNmbr); + + /**전자우편 신청 상세 정보를 등록한다. + * @param requestDetail 전자우편 신청 상세 + * @return 저장 여부 + *
  • 저장됐으면 true
  • + *
  • 그렇지 않으면 false
  • + *
+ */ + boolean create(EmailRequestDetail requestDetail); + + /**전자우편 신청 상세 정보를 수정한다. + * @param requestDetail 전자우편 신청 상세 + * @return 저장 여부 + *
  • 저장됐으면 true
  • + *
  • 그렇지 않으면 false
  • + *
+ */ + boolean update(EmailRequestDetail requestDetail); +} \ No newline at end of file diff --git a/src/main/java/cokr/xit/interfaces/epost/service/EmailResultService.java b/src/main/java/cokr/xit/interfaces/epost/service/EmailResultService.java new file mode 100644 index 0000000..5050807 --- /dev/null +++ b/src/main/java/cokr/xit/interfaces/epost/service/EmailResultService.java @@ -0,0 +1,41 @@ +package cokr.xit.interfaces.epost.service; + +import java.util.List; + +import cokr.xit.foundation.data.DataObject; + +/**전자우편 접수 결과 서비스 인터페이스. + * + *

상세 설명: + * + *

+ * ============ 변경 이력 ============
+ * 2023-07-03	mjkhan 최초 작성
+ * ================================
+ * 
+ */ +public interface EmailResultService { + /**전자우편 수신 결과를 수신한다. + */ + void receiveReceptionResults(); + + /**전자우편 접수 결과를 수신한다. + */ + void receiveRegistrationResults(); + + /**전자우편 제작 결과를 수신한다. + */ + void receiveProductionResults(); + + /**전자우편 배달 결과를 수신한다. + */ + void receiveDeliveryResults(); + + /**전자우편 수신, 접수, 제작, 배달 결과를 수신한다. + */ + void receiveResults(); + + List getResultLogs(String procID, int fetchSize); + + int updateResultLogStatus(List logs); +} \ No newline at end of file diff --git a/src/main/java/cokr/xit/interfaces/epost/service/bean/EmailRequestBean.java b/src/main/java/cokr/xit/interfaces/epost/service/bean/EmailRequestBean.java new file mode 100644 index 0000000..11a5e70 --- /dev/null +++ b/src/main/java/cokr/xit/interfaces/epost/service/bean/EmailRequestBean.java @@ -0,0 +1,248 @@ +package cokr.xit.interfaces.epost.service.bean; + +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import javax.annotation.Resource; + +import org.springframework.stereotype.Component; + +import cokr.xit.base.file.ZIP; +import cokr.xit.foundation.data.DataObject; +import cokr.xit.interfaces.epost.EmailRequest; +import cokr.xit.interfaces.epost.EmailRequestDetail; +import cokr.xit.interfaces.epost.EmailRequestQuery; +import cokr.xit.interfaces.epost.dao.EmailRequestMapper; +import cokr.xit.interfaces.filejob.service.bean.FileJobBean; + +/**전자우편 신청 정보 관리 Bean + * + *

상세 설명: + * + *

+ * ============ 변경 이력 ============
+ * 2023-07-03	mjkhan 최초 작성
+ * ================================
+ * 
+ */ +@Component("emailRequestBean") +public class EmailRequestBean extends FileJobBean { + /** 전자우편 신청 정보 DAO */ + @Resource(name = "emailRequestMapper") + private EmailRequestMapper requestMapper; + + @Override + public String jobName() { + return "epost-send-request"; + } + + private int workSize() { + return toInt(ifEmpty(config("workSize"), "100")); + } + + /**전자우편 신청접수 목록을 전송한다. + * @return 전송 대상 접수 목록 + */ + public void sendRequests() { + List reqList = requestMapper.selectSendingRequestList(config("conOrg")); + if (reqList.isEmpty()) return; + + String sendWorkingDir = sendWorkingDir(), + zipFilename = config("zipFilename"), + txtFilename = config("txtFilename"); + mkdirs(sendWorkingDir); + + ZIP zip = new ZIP(); + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmssSSS"); + ArrayList paths = new ArrayList<>(); + + Map> byConKey = reqList.stream().collect(Collectors.groupingBy(row -> row.string("CON_KEY"))); + byConKey.forEach((conKey, list) -> { + Path path = compressAttachments(zip, Paths.get(sendWorkingDir, zipFilename.replace("{conKey}", conKey)), list); + paths.add(path); + path = writeData(Paths.get(sendWorkingDir, txtFilename.replace("{yyyyMMddHHmmssSSS}", dateFormat.format(new Date()))), list); + paths.add(path); + }); + + move( + paths.stream().filter(path -> path != null).toList(), + sendDir() + ); + + requestMapper.updateRequestStatus(EmailRequest.SENT, byConKey.keySet(), workSize()); + } + + private Path compressAttachments(ZIP zip, Path zipPath, List list) { + List paths = getAttachmentPaths(list); + if (paths.isEmpty()) return null; + + zip.compress(zipPath.toString(), paths); + list.forEach(row -> row.put("ATTACH_NM", row.string("CON_KEY") + ".zip")); + return zipPath; + } + + private List getAttachmentPaths(List list) { + if (isEmpty(list)) return Collections.emptyList(); + + String attachmentDir = config("attachmentDir"); + + return list.stream() + .flatMap(row -> row.entrySet().stream() + .filter(entry -> entry.getKey().startsWith("RECEV_PHOTO_FILENAME") && !isEmpty(entry.getValue())) + .map(entry -> Paths.get(attachmentDir, (String)entry.getValue()).toString()) + ) + .toList(); + } + + private Path writeData(Path txtPath, List list) { + try { + String content = list.stream() + .map(row -> row.entrySet().stream() + .filter(entry -> !entry.getKey().startsWith("_")) + .map(entry -> { + Object value = entry.getValue(); + return value instanceof Number ? Long.toString(toLong(value)) : toString(value); + }) + .collect(Collectors.joining("|")) + ) + .collect(Collectors.joining("\n")); + + return Files.writeString(txtPath, content); + } catch (Exception e) { + throw runtimeException(e); + } + } + + /**지정한 조건에 따라 전자우편 신청 목록을 조회하여 반환한다. + * @param req 전자우편 신청 조회 조건 + * @return 전자우편 신청 목록 + */ + public List getRequestList(EmailRequestQuery req) { + return requestMapper.selectRequestList(req); + } + + /**지정한 conKey의 전자우편 신청 정보를 조회하여 반환한다.
+ * @param conKey 외부연계식별키 + * @return 전자우편 신청 정보 + */ + public DataObject getRequestInfo(String conKey) { + return requestMapper.selectRequestInfo(conKey); + } + + /**지정한 conKeys의 전자우편 신청 객체들을 반환한다. + * @param conKeys 외부연계식별키 + * @return 전자우편 신청 객체 목록 + */ + public List getRequests(String... conKeys) { + return requestMapper.selectRequests(conKeys); + } + + /**전자우편 신청 정보를 등록한다. + * @param request 전자우편 신청 + * @return 저장 여부 + *
  • 저장됐으면 true
  • + *
  • 그렇지 않으면 false
  • + *
+ */ + public boolean create(EmailRequest request) { + request.setRceptId(config("rceptId")); + request.setDataCd("00"); // 신규 + request.setDfpayyn("001"); // 후납 + request.setMailCnt(1); + + return requestMapper.insert(request); + } + + /**전자우편 신청 정보를 수정한다. + * @param request 전자우편 신청 + * @return 저장 여부 + *
  • 저장됐으면 true
  • + *
  • 그렇지 않으면 false
  • + *
+ */ + public boolean update(EmailRequest request) { + return requestMapper.update(request); + } + + /**배달 중 상태의 전자우편 신청을 배달 완료로 업데이트 한다.
+ * 만료일수는 file-job.conf의 epost-send-request/expiryDays에 설정된 값을 사용한다. + * @return 저장된 정보수 + */ + public int updateRequestAsDelivered() { + return requestMapper.updateRequestAsDelivered( + toInt(config("expiryDays")), + EmailRequest.DELIVERED + ); + } + + /**전자우편 신청 정보를 삭제한다. + * @param conKeys 외부연계식별키 + * @return 저장된 정보 수 + */ + public int removeRequest(String... conKeys) { + return requestMapper.deleteRequest(conKeys); + } + + /**지정한 조건에 따라 전자우편 신청 상세 목록을 조회하여 반환한다. + * @param req 전자우편 신청 상세 조회 조건 + * @return 전자우편 신청 상세 목록 + */ + public List getRequestDetailList(EmailRequestQuery req) { + return requestMapper.selectRequestDetailList(req); + } + + /**지정한 조건에 따라 전자우편 신청 상세 정보를 조회하여 반환한다.
+ * @param conKey 외부연계식별키 + * @param rgstNmbr 등기번호 + * @return 전자우편 신청 상세 목록 + */ + public DataObject getRequestDetailInfo(String conKey, String rgstNmbr) { + return requestMapper.selectRequestDetailInfo(conKey, rgstNmbr); + } + + /**지정한 조건에 따라 전자우편 신청 상세 객체들을 반환한다. + * @param conKey 외부연계식별키 + * @return 전자우편 신청 상세 객체 목록 + */ + public List getRequestDetails(String conKey) { + return requestMapper.selectRequestDetails(conKey); + } + + /**지정한 조건에 따라 전자우편 신청 상세 객체들을 반환한다. + * @param conKey 외부연계식별키 + * @return 전자우편 신청 상세 객체 목록 + */ + public EmailRequestDetail getRequestDetail(String conKey, String rgstNmbr) { + return requestMapper.selectRequestDetail(conKey, rgstNmbr); + } + + /**전자우편 신청 상세 정보를 등록한다. + * @param requestDetail 전자우편 신청 상세 + * @return 저장 여부 + *
  • 저장됐으면 true
  • + *
  • 그렇지 않으면 false
  • + *
+ */ + public boolean create(EmailRequestDetail requestDetail) { + return requestMapper.insert(requestDetail); + } + + /**전자우편 신청 상세 정보를 수정한다. + * @param requestDetail 전자우편 신청 상세 + * @return 저장 여부 + *
  • 저장됐으면 true
  • + *
  • 그렇지 않으면 false
  • + *
+ */ + public boolean update(EmailRequestDetail requestDetail) { + return requestMapper.update(requestDetail); + } +} \ No newline at end of file diff --git a/src/main/java/cokr/xit/interfaces/epost/service/bean/EmailRequestServiceBean.java b/src/main/java/cokr/xit/interfaces/epost/service/bean/EmailRequestServiceBean.java new file mode 100644 index 0000000..e7f66fc --- /dev/null +++ b/src/main/java/cokr/xit/interfaces/epost/service/bean/EmailRequestServiceBean.java @@ -0,0 +1,105 @@ +package cokr.xit.interfaces.epost.service.bean; + +import java.util.List; + +import javax.annotation.Resource; + +import org.springframework.stereotype.Service; + +import cokr.xit.foundation.data.DataObject; +import cokr.xit.interfaces.epost.EmailRequest; +import cokr.xit.interfaces.epost.EmailRequestDetail; +import cokr.xit.interfaces.epost.EmailRequestQuery; +import cokr.xit.interfaces.epost.service.EmailRequestService; +import cokr.xit.interfaces.filejob.service.bean.FileJobServiceBean; + +/**전자우편 신청 서비스 구현체. + * + *

상세 설명: + * + *

+ * ============ 변경 이력 ============
+ * 2023-07-03	mjkhan 최초 작성
+ * ================================
+ * 
+ */ +@Service("emailRequestService") +public class EmailRequestServiceBean extends FileJobServiceBean implements EmailRequestService { + /** 전자우편 신청 정보 Bean */ + @Resource(name = "emailRequestBean") + private EmailRequestBean requestBean; + + @Override + public void sendRequests() { + execute(requestBean, requestBean::sendRequests); + } + + @Override + public List getRequestList(EmailRequestQuery req) { + return requestBean.getRequestList(req); + } + + /**지정한 conKey의 전자우편 신청 정보를 조회하여 반환한다.
+ * @param conKey 외부연계식별키 + * @return 전자우편 신청 정보 + */ + @Override + public DataObject getRequestInfo(String conKey) { + return requestBean.getRequestInfo(conKey); + } + + @Override + public List getRequests(String... conKeys) { + return requestBean.getRequests(conKeys); + } + + @Override + public boolean create(EmailRequest request) { + return requestBean.create(request); + } + + @Override + public boolean update(EmailRequest request) { + return requestBean.update(request); + } + + @Override + public void updateRequestAsDelivered() { + execute(requestBean, requestBean::updateRequestAsDelivered); + } + + @Override + public int removeRequest(String... conKeys) { + return requestBean.removeRequest(conKeys); + } + + @Override + public List getRequestDetailList(EmailRequestQuery req) { + return requestBean.getRequestDetailList(req); + } + + @Override + public DataObject getRequestDetailInfo(String conKey, String rgstNmbr) { + return requestBean.getRequestDetailInfo(conKey, rgstNmbr); + } + + @Override + public List getRequestDetails(String conKey) { + return requestBean.getRequestDetails(conKey); + } + + @Override + public EmailRequestDetail getRequestDetail(String conKey, String rgstNmbr) { + return requestBean.getRequestDetail(conKey, rgstNmbr); + } + + @Override + public boolean create(EmailRequestDetail requestDetail) { + return requestBean.create(requestDetail); + } + + @Override + public boolean update(EmailRequestDetail requestDetail) { + return requestBean.update(requestDetail); + } +} \ No newline at end of file diff --git a/src/main/java/cokr/xit/interfaces/epost/service/bean/EmailResultBean.java b/src/main/java/cokr/xit/interfaces/epost/service/bean/EmailResultBean.java new file mode 100644 index 0000000..97565e9 --- /dev/null +++ b/src/main/java/cokr/xit/interfaces/epost/service/bean/EmailResultBean.java @@ -0,0 +1,283 @@ +package cokr.xit.interfaces.epost.service.bean; + +import java.nio.charset.Charset; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.function.Consumer; +import java.util.function.Function; +import java.util.stream.Collectors; + +import javax.annotation.Resource; + +import org.springframework.stereotype.Component; + +import cokr.xit.foundation.data.DataObject; +import cokr.xit.foundation.web.WebClient; +import cokr.xit.interfaces.epost.DeliveryResult; +import cokr.xit.interfaces.epost.EmailRequest; +import cokr.xit.interfaces.epost.EmailResult; +import cokr.xit.interfaces.epost.EmailResultLog; +import cokr.xit.interfaces.epost.ProductionResult; +import cokr.xit.interfaces.epost.ReceptionResult; +import cokr.xit.interfaces.epost.RegistrationResult; +import cokr.xit.interfaces.epost.dao.EmailRequestMapper; +import cokr.xit.interfaces.epost.dao.EmailResultMapper; +import cokr.xit.interfaces.filejob.service.bean.FileJobBean; + +/**전자우편 신청 결과 수신 Bean + * + *

상세 설명: + * + *

+ * ============ 변경 이력 ============
+ * 2023-07-03	mjkhan 최초 작성
+ * ================================
+ * 
+ */ +@Component("emailResultBean") +public class EmailResultBean extends FileJobBean { + /** 전자우편 신청 DAO */ + @Resource(name = "emailRequestMapper") + private EmailRequestMapper requestMapper; + + /** 전자우편 결과 DAO */ + @Resource(name = "emailResultMapper") + private EmailResultMapper resultMapper; + + @Override + public String jobName() { + return "epost-receive-result"; + } + + private int workSize() { + return toInt(ifEmpty(config("workSize"), "100")); + } + + /** 결과 유형별 핸들러 */ + private Map, List>> receivers = Map.of( + ReceptionResult.TYPE, this::receiveReceptionResults, + RegistrationResult.TYPE, this::receiveRegistrationResults, + ProductionResult.TYPE, this::receiveProductionResults, + DeliveryResult.TYPE, this::receiveDeliveryResults + ); + + /**지정하는 결과 유형의 파일을 읽어서 수신 처리한다. 지정하지 않으면 모든 유형의 결과를 처리한다. + * @param types 결과 유형 + *
  • 수신 결과 - {@link ReceptionResult#TYPE}
  • + *
  • 접수 결과 - {@link RegistrationResult#TYPE}
  • + *
  • 제작 결과 - {@link ProductionResult#TYPE}
  • + *
  • 배달 결과 - {@link DeliveryResult#TYPE}
  • + *
+ */ + public void receiveResults(String... types) { + List resultTypes = !isEmpty(types) ? + List.of(types) : + List.of( + ReceptionResult.TYPE, + RegistrationResult.TYPE, + ProductionResult.TYPE, + DeliveryResult.TYPE + ); + List paths = getReceivedFilePaths(path -> resultTypes.contains(resultType(path))); + if (paths.isEmpty()) return; + + ArrayList processed = new ArrayList<>(); + paths.stream() + .collect(Collectors.groupingBy(path -> resultType(path))) //결과 유형별 분류 + .forEach((type, pathList) -> { + Function, List> receiver = receivers.get(type); + if (receiver == null) return; + + processed.addAll(receiver.apply(pathList)); //결과파일 처리 + }); + + Map> successFail = processed.stream() //처리 결과를 성공 / 실패로 분류 + .collect(Collectors.groupingBy(file -> file.isSuccess())); + + List success = successFail.get(true); + createLogs(success); + + move(FileStatus.getPaths(success), successDir()); // 성공 디렉토리로 이동 + move(FileStatus.getPaths(successFail.get(false)), failDir()); // 실패 디렉토리로 이동 + } + + private String resultType(Path path) { + String filename = path.getFileName().toString(); + + for (String type: receivers.keySet()) { + if (filename.contains(type)) + return type; + } + + throw new RuntimeException("Invalid result file: " + filename); + } + + /**전자우편 신청의 정합성 결과 파일을 처리한다. + */ + private List receiveReceptionResults(List paths) { + List fileStatus = readReceived(paths, Charset.forName("EUC_KR"), line -> new ReceptionResult().parse(line)); + fileStatus = writeReceived(fileStatus, resultMapper::insertReceptionResults); + List results = getResults(fileStatus, true); + + ReceptionResult.byStatus(results).forEach((status, list) -> + requestMapper.updateRequestStatus( + "reception", + list, + status, + status, + workSize() + ) + ); + + return fileStatus; + } + + /**전자우편 신청 접수 결과 파일을 처리한다. + */ + private List receiveRegistrationResults(List paths) { + List fileStatus = readReceived(paths, null, line -> new RegistrationResult().parse(line)); + fileStatus = writeReceived(fileStatus, resultMapper::insertRegistrationResults); + List results = getResults(fileStatus, true); + + resultMapper.updateRegistrationResult(results, workSize()); + requestMapper.updateRequestStatus( + "registration", + results, + EmailRequest.REGISTERED, + EmailRequest.REGISTERED, + workSize() + ); + + return fileStatus; + } + + /**전자우편 제작 결과 파일을 처리한다. + */ + private List receiveProductionResults(List paths) { + List fileStatus = readReceived(paths, null, line -> new ProductionResult().parse(line)); + fileStatus = writeReceived(fileStatus, resultMapper::insertProductionResults); + List results = getResults(fileStatus, true); + String resultType = "production"; + + ProductionResult.byStatus(results).forEach((status, list) -> + requestMapper.updateRequestStatus( + resultType, + list, + status, + status, + workSize() + ) + ); + requestMapper.updateRequestDetailStatus(resultType, results, workSize()); + + return fileStatus; + } + + /**전자우편 배달 결과 파일을 처리한다. + */ + private List receiveDeliveryResults(List paths) { + List fileStatus = readReceived(paths, null, line -> new DeliveryResult().parse(line)); + fileStatus = writeReceived(fileStatus, resultMapper::insertDeliveryResults); + String resultType = "delivery"; + + List results = getResults(fileStatus, true); + DeliveryResult.byStatus(results).forEach((status, list) -> + requestMapper.updateRequestStatus( + resultType, + list, + status, + status, + workSize() + ) + ); + requestMapper.updateRequestDetailStatus(resultType, results, workSize()); + + return fileStatus; + } + + /**신청결과를 로그로 저장한다. + * @param fileStatus 결과파일 처리상태 + */ + private void createLogs(List fileStatus) { + List results = getResults(fileStatus, false); + config("workSize"); + String procID = resultMapper.insertResultLogs(results.stream().map(EmailResult::toLog).toList(), workSize()); + String alert = config("alert"); + if (isEmpty(alert)) return; + + new WebClient().post(req -> + req.uri(alert) + .data("procID", procID) + .data("infoCount", results.size()) + .json(true) + .async(true) + ); + } + + private List readReceived(List paths, Charset charset, Function parser) { + Charset chars = ifEmpty(charset, Charset::defaultCharset); + return isEmpty(paths) ? + Collections.emptyList() : + paths.stream() + .map(path -> { + FileStatus status = new FileStatus().setPath(path); + try { + List results = Files.lines(path, chars) + .map(line -> parser.apply(line)) + .toList(); + return status.set("results", results); + } catch (Exception e) { + return status.setCause(e); + } + }) + .toList(); + } + + private List writeReceived(List fileStatus, Consumer> writer) { + if (isEmpty(fileStatus)) return Collections.emptyList(); + + List results = getResults(fileStatus, false); + writer.accept(results); + + return fileStatus; + } + + @SuppressWarnings("unchecked") + private List getResults(List fileStatus, boolean savedOnly) { + return fileStatus.stream() + .filter(FileStatus::isSuccess) + .flatMap(status -> ((List)status.get("results")).stream()) + .toList().stream() + .filter(savedOnly ? EmailResult::isSaved : (result) -> true) + .toList(); + } + + /**전자우편 신청결과 로그를 조회한다. + * @param procID 전자우편 신청결과 처리 아이디 + * @param fetchSize 반환할 조회 결과 갯수 + * @return 전자우편 처리 로그 + */ + public List getResultLogs(String procID, int fetchSize) { + return resultMapper.selectResultLogs(procID, fetchSize); + } + + /**전자우편 신청결과 로그를 등록한다. + * @param log 전자우편 신청결과 로그 + * @return 처리 아이디 + */ + public String createResultLogs(List logs) { + return resultMapper.insertResultLogs(logs, workSize()); + } + + /**전자우편 신청결과 로그 상태를 업데이트 한다. + * @param logs 변경된 상태의 전자우편 신청결과 로그 목록 + * @return 저장된 정보수 + */ + public int updateResultLogStatus(List logs) { + return resultMapper.updateResultLogStatus(logs, workSize()); + } +} \ No newline at end of file diff --git a/src/main/java/cokr/xit/interfaces/epost/service/bean/EmailResultServiceBean.java b/src/main/java/cokr/xit/interfaces/epost/service/bean/EmailResultServiceBean.java new file mode 100644 index 0000000..c60a8eb --- /dev/null +++ b/src/main/java/cokr/xit/interfaces/epost/service/bean/EmailResultServiceBean.java @@ -0,0 +1,67 @@ +package cokr.xit.interfaces.epost.service.bean; + +import java.util.List; + +import javax.annotation.Resource; + +import org.springframework.stereotype.Service; + +import cokr.xit.foundation.data.DataObject; +import cokr.xit.interfaces.epost.DeliveryResult; +import cokr.xit.interfaces.epost.ProductionResult; +import cokr.xit.interfaces.epost.ReceptionResult; +import cokr.xit.interfaces.epost.RegistrationResult; +import cokr.xit.interfaces.epost.service.EmailResultService; +import cokr.xit.interfaces.filejob.service.bean.FileJobServiceBean; + +/**전자우편 접수 결과 서비스 구현체. + * + *

상세 설명: + * + *

+ * ============ 변경 이력 ============
+ * 2023-07-03	mjkhan 최초 작성
+ * ================================
+ * 
+ */ +@Service("emailResultService") +public class EmailResultServiceBean extends FileJobServiceBean implements EmailResultService { + /** 전자우편 접수 결과 정보 Bean */ + @Resource(name = "emailResultBean") + private EmailResultBean resultBean; + + @Override + public void receiveReceptionResults() { + execute(resultBean, () -> resultBean.receiveResults(ReceptionResult.TYPE)); + } + + @Override + public void receiveRegistrationResults() { + execute(resultBean, () -> resultBean.receiveResults(RegistrationResult.TYPE)); + } + + @Override + public void receiveProductionResults() { + execute(resultBean, () -> resultBean.receiveResults(ProductionResult.TYPE)); + } + + @Override + public void receiveDeliveryResults() { + execute(resultBean, () -> resultBean.receiveResults(DeliveryResult.TYPE)); + } + + @Override + public void receiveResults() { + execute(resultBean, () -> resultBean.receiveResults()); + } + + @Override + public List getResultLogs(String procID, int fetchSize) { + return resultBean.getResultLogs(procID, fetchSize); + } + + @Override + public int updateResultLogStatus(List logs) { + return resultBean.updateResultLogStatus(logs); + } +} \ No newline at end of file diff --git a/src/main/java/cokr/xit/interfaces/epost/service/bean/package-info.java b/src/main/java/cokr/xit/interfaces/epost/service/bean/package-info.java new file mode 100644 index 0000000..a4d911f --- /dev/null +++ b/src/main/java/cokr/xit/interfaces/epost/service/bean/package-info.java @@ -0,0 +1,3 @@ +/**국민 신문고와의 파일 연계 서비스 구현을 위한 클래스 정의 + */ +package cokr.xit.interfaces.epost.service.bean; \ No newline at end of file diff --git a/src/main/java/cokr/xit/interfaces/epost/service/package-info.java b/src/main/java/cokr/xit/interfaces/epost/service/package-info.java new file mode 100644 index 0000000..429104b --- /dev/null +++ b/src/main/java/cokr/xit/interfaces/epost/service/package-info.java @@ -0,0 +1,3 @@ +/**국민 신문고와의 파일 연계 서비스 인터페이스 + */ +package cokr.xit.interfaces.epost.service; \ No newline at end of file diff --git a/src/main/java/cokr/xit/interfaces/epost/web/ApiController.java b/src/main/java/cokr/xit/interfaces/epost/web/ApiController.java new file mode 100644 index 0000000..faaa847 --- /dev/null +++ b/src/main/java/cokr/xit/interfaces/epost/web/ApiController.java @@ -0,0 +1,54 @@ +package cokr.xit.interfaces.epost.web; + +import java.util.List; +import java.util.Map; + +import javax.annotation.Resource; + +import org.springframework.stereotype.Controller; +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.servlet.ModelAndView; + +import cokr.xit.foundation.data.DataObject; +import cokr.xit.foundation.web.AbstractController; +import cokr.xit.interfaces.epost.service.EmailRequestService; +import cokr.xit.interfaces.epost.service.EmailResultService; + +@Controller +@RequestMapping(name = "전자우편 신청 결과", value = "/api/epost/result") +public class ApiController extends AbstractController { + @Resource(name = "emailRequestService") + private EmailRequestService requestService; + @Resource(name = "emailResultService") + private EmailResultService resultService; + + @PostMapping(name = "/전자우편 신청결과 통보", value = "/receive.do") + public ModelAndView receive(@RequestBody Map resultInfo) { + log().debug("received processID: {}", resultInfo); + return new ModelAndView("jsonView") + .addObject("received", true); + } + + @PostMapping(name = "/전자우편 신청결과 로그 조회", value = "/list.do") + public ModelAndView getResultLogs(@RequestBody Map req) { + String procID = (String)req.get("procID"); + int fetchSize = (Integer)req.get("fetchSize"); + List list = resultService.getResultLogs(procID, fetchSize); + DataObject last = list.isEmpty() ? null : list.get(list.size() - 1); + boolean more = last != null && last.number("TOT_CNT").longValue() > last.number("").longValue(); + return new ModelAndView("jsonView") + .addObject("logs", list) + .addObject("more", more); + } + + @PostMapping(name = "/전자우편 신청결과 상태 변경", value = "/update.do") + public ModelAndView updateResultLogStatus(@RequestBody Map req) { + List logs = (List)req.get("logs"); + int affected = resultService.updateResultLogStatus(logs); + return new ModelAndView("jsonView") + .addObject("affected", affected) + .addObject("saved", affected > 0); + } +} \ No newline at end of file diff --git a/src/main/java/cokr/xit/interfaces/epost/web/EmailRequestController.java b/src/main/java/cokr/xit/interfaces/epost/web/EmailRequestController.java new file mode 100644 index 0000000..b554785 --- /dev/null +++ b/src/main/java/cokr/xit/interfaces/epost/web/EmailRequestController.java @@ -0,0 +1,177 @@ +package cokr.xit.interfaces.epost.web; + +import java.util.List; + +import javax.annotation.Resource; + +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.servlet.ModelAndView; + +import cokr.xit.foundation.web.AbstractController; +import cokr.xit.interfaces.epost.EmailRequest; +import cokr.xit.interfaces.epost.EmailRequestDetail; +import cokr.xit.interfaces.epost.EmailRequestQuery; +import cokr.xit.interfaces.epost.service.EmailRequestService; + +/**전자우편 신청 서비스의 웹 컨트롤러 + * + *

상세 설명: + * + *

+ * ============ 변경 이력 ============
+ * 2023-07-03	mjkhan 최초 작성
+ * ================================
+ * 
+ */ +@RequestMapping(name = "전자우편 신청", value = "/request") +public class EmailRequestController extends AbstractController { + /**전자우편 신청 서비스*/ + @Resource(name = "emailRequestService") + private EmailRequestService emailRequestService; + + /**전자우편 신청 관리 메인화면(request/request-main)을 연다. + * 조건없는 {@link #getEmailRequestList(EmailRequestQuery) 전자우편 신청 조회 결과}를 포함시킨다. + * @return /request/request-main + */ + @RequestMapping(name = "전자우편 신청 메인", value = "/main.do") + public ModelAndView main() { + ModelAndView mav = getEmailRequestList(new EmailRequestQuery().setPageNum(1)); + mav.setViewName("/request/request-main"); + return mav.addObject("requestList", toJson(mav.getModel().get("requestList"))); + } + + /**전자우편 신청 목록을 조회하여 반환한다.
+ * {@link EmailRequestService#getRequestList(EmailRequestQuery)} 참고 + * @param req 전자우편 신청 조회 조건 + * @return jsonView + *
 {
+	 *     "requestList": [전자우편 신청 목록]
+	 *     "requestStart": 전자우편 신청 목록 시작 인덱스
+	 *     "requestFetch": 한 번에 가져오는 전자우편 신청 목록 수
+	 *     "requestTotal": 조회 결과 찾은 전체 전자우편 신청 수
+	 * }
+ */ + @RequestMapping(name = "전자우편 신청 조회", value = "/list.do") + public ModelAndView getEmailRequestList(EmailRequestQuery req) { + List result = emailRequestService.getRequestList(setFetchSize(req)); + return setCollectionInfo(new ModelAndView("jsonView"), result, "emailRequest"); + } + + /**전자우편 신청 정보를 조회하여 반환한다.
+ * {@link EmailRequestService#getRequestInfo(String)} 참고 + * @param conKey 외부연계식별키 + * @return jsonView + *
 {
+	 *     "emailRequestInfo": 전자우편 신청 정보
+	 * }
+ */ + @RequestMapping(name = "전자우편 신청 정보 조회", value = "/info.do") + public ModelAndView getEmailRequestInfo(String conKey) { + return new ModelAndView("jsonView") + .addObject("requestInfo", emailRequestService.getRequestInfo(conKey)); + } + + /**전자우편 신청를 등록한다. + * @param request 전자우편 신청 정보 + * @return jsonView + *
 {
+	 *     "saved": 등록되었으면 true, 그렇지 않으면 false
+	 * }
+ */ + @PostMapping(name = "전자우편 신청 등록", value = "/create.do") + public ModelAndView create(EmailRequest request) { + boolean saved = emailRequestService.create(request); + return new ModelAndView("jsonView") + .addObject("saved", saved); + } + + /**전자우편 신청 정보를 수정한다. + * @param request 전자우편 신청 정보 + * @return jsonView + *
 {
+	 *     "saved": 수정되었으면 true, 그렇지 않으면 false
+	 * }
+ */ + @PostMapping(name = "전자우편 신청 수정", value = "/update.do") + public ModelAndView update(EmailRequest request) { + boolean saved = emailRequestService.update(request); + return new ModelAndView("jsonView") + .addObject("saved", saved); + } + + /**지정한 전자우편 신청를 제거한다. + * @param requestIDs 전자우편 신청 아이디 + * @return jsonView + *
 {
+	 *     "affected": 저장된 정보수
+	 *     "saved": 저장되었으면 true, 그렇지 않으면 false
+	 * }
+ */ + @PostMapping(name = "전자우편 신청 제거", value = "/remove.do") + public ModelAndView remove(String[] conKeys) { + int affected = emailRequestService.removeRequest(conKeys); + return new ModelAndView("jsonView") + .addObject("affected", affected) + .addObject("saved", affected > 0); + } + + /**전자우편 신청 상세 목록을 조회하여 반환한다.
+ * {@link emailRequestService#getEmailRequestDetailList(EmailRequestQuery)} 참고 + * @param req 전자우편 신청 상세 조회 조건 + * @return jsonView + *
 {
+	 *     "requestDetailList": [전자우편 신청 상세 목록]
+	 *     "requestDetailStart": 전자우편 신청 상세 목록 시작 인덱스
+	 *     "requestDetailFetch": 한 번에 가져오는 전자우편 신청 상세 목록 수
+	 *     "requestDetailTotal": 조회 결과 찾은 전체 전자우편 신청 상세 수
+	 * }
+ */ + @RequestMapping(name = "전자우편 신청 상세 목록 조회", value = "/detail/list.do") + public ModelAndView getRequestDetailList(EmailRequestQuery req) { + List result = emailRequestService.getRequestDetailList(setFetchSize(req)); + return setCollectionInfo(new ModelAndView("jsonView"), result, "requestDetail"); + } + + /**전자우편 신청 상세 정보를 조회하여 반환한다.
+ * {@link emailRequestService#getEmailRequestDetailInfo(EmailRequestQuery)} 참고 + * @param req 전자우편 신청 상세 조회 조건 + * @return jsonView + *
 {
+	 *     "requestDetailInfo": 전자우편 신청 상세 정보
+	 * }
+ */ + @RequestMapping(name = "전자우편 신청 상세 정보 조회", value = "/detail/info.do") + public ModelAndView getEmailRequestDetailInfo(String conKey, String rgstNmbr) { + return new ModelAndView("jsonView") + .addObject("requestDetailInfo", emailRequestService.getRequestDetailInfo(conKey, rgstNmbr)); + } + + /**전자우편 신청 상세를 등록한다. + * @param requestDetail 전자우편 신청 상세 정보 + * @return jsonView + *
 {
+	 *     "saved": 등록되었으면 true, 그렇지 않으면 false
+	 * }
+ */ + @PostMapping(name = "전자우편 신청 상세 등록", value = "/detail/create.do") + public ModelAndView create(EmailRequestDetail requestDetail) { + boolean saved = emailRequestService.create(requestDetail); + return new ModelAndView("jsonView") + .addObject("saved", saved); + } + + /**전자우편 신청 상세 정보를 수정한다. + * @param requestDetail 전자우편 신청 상세 정보 + * @return jsonView + *
 {
+	 *     "saved": 수정되었으면 true, 그렇지 않으면 false
+	 * }
+ */ + @PostMapping(name = "전자우편 신청 상세 수정", value = "/detail/update.do") + public ModelAndView update(EmailRequestDetail requestDetail) { + boolean saved = emailRequestService.update(requestDetail); + return new ModelAndView("jsonView") + .addObject("saved", saved); + } +} \ No newline at end of file diff --git a/src/main/java/cokr/xit/interfaces/epost/web/EmailResultController.java b/src/main/java/cokr/xit/interfaces/epost/web/EmailResultController.java new file mode 100644 index 0000000..e60a4a3 --- /dev/null +++ b/src/main/java/cokr/xit/interfaces/epost/web/EmailResultController.java @@ -0,0 +1,16 @@ +package cokr.xit.interfaces.epost.web; + +import javax.annotation.Resource; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; + +import cokr.xit.foundation.web.AbstractController; +import cokr.xit.interfaces.epost.service.EmailResultService; + +@Controller +@RequestMapping(name = "전자우편 신청 결과", value = "/result") +public class EmailResultController extends AbstractController { + @Resource(name = "emailResultService") + private EmailResultService resultService; +} diff --git a/src/main/java/cokr/xit/interfaces/epost/web/package-info.java b/src/main/java/cokr/xit/interfaces/epost/web/package-info.java new file mode 100644 index 0000000..8dd19eb --- /dev/null +++ b/src/main/java/cokr/xit/interfaces/epost/web/package-info.java @@ -0,0 +1,3 @@ +/**국민 신문고와의 파일 연계 작업 후 업무 시스템 통보 + */ +package cokr.xit.interfaces.epost.web; \ No newline at end of file diff --git a/src/main/resources/sql/mapper/epost/emailRequest-mapper.xml b/src/main/resources/sql/mapper/epost/emailRequest-mapper.xml new file mode 100644 index 0000000..2e71394 --- /dev/null +++ b/src/main/resources/sql/mapper/epost/emailRequest-mapper.xml @@ -0,0 +1,835 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +SELECT CON_KEY + , RCEPT_ID + , DATA_CD + , DIV_KB + , DFPAYYN + , RCPT_KB + , SEAL_CD + , WORD_KB + , MAIL_CNT + , RECEV_CNT + , ENV_CD + , COLOR_YN + , MM_YN + , FLEX_CD + , DM_CNT + , SB_FG + , APVL_NB + , SEND_DATE + , SEND_TIME + , RELORSECT_CD + , RECEV_SENDER_ORG_CODE + , RECEV_SENDER_NM + , RECEV_SENDER_ZIPCODE + , RECEV_SENDER_ADDR + , RECEV_SENDER_DETAILADDR + , RECEV_SENDER_DEPART_TEL + , RECEV_SENDER_DEPART_NM + , RECEV_DIV_CD + , RECEV_PRINT_DT + , RECEV_PRINT_YEAR + , RECEV_PRINT_MONTH + , RECEV_PRINT_DAY + , RECEV_SENDER_FAX + , RECEV_SERDER_STAFF + , RECEV_SENDER_EMAIL + , SNDNG_ID + , JOB_CD + , REG_VAR_DATA1 + , REG_VAR_DATA2 + , REG_VAR_DATA3 + , REG_VAR_DATA4 + , REG_VAR_DATA5 + , POST_PROC_STT + , RCEPT_YMD + , DEL_YN + , REG_DT + , RGTR + , DEL_DT + , DLTR + FROM TB_EPOST_RCPT_REG + + + + + +/* 전자우편 신청 등록(emailRequestMapper.insertRequest) */ +INSERT INTO TB_EPOST_RCPT_REG ( + CON_KEY + , RCEPT_ID + , DATA_CD + , DIV_KB + , DFPAYYN + , RCPT_KB + , SEAL_CD + , WORD_KB + , MAIL_CNT + , RECEV_CNT + , ENV_CD + , COLOR_YN + , MM_YN + , FLEX_CD + , DM_CNT + , SB_FG + , APVL_NB + , SEND_DATE + , SEND_TIME + , RELORSECT_CD + , RECEV_SENDER_ORG_CODE + , RECEV_SENDER_NM + , RECEV_SENDER_ZIPCODE + , RECEV_SENDER_ADDR + , RECEV_SENDER_DETAILADDR + , RECEV_SENDER_DEPART_TEL + , RECEV_SENDER_DEPART_NM + , RECEV_DIV_CD + , RECEV_PRINT_DT + , RECEV_PRINT_YEAR + , RECEV_PRINT_MONTH + , RECEV_PRINT_DAY + , RECEV_SENDER_FAX + , RECEV_SERDER_STAFF + , RECEV_SENDER_EMAIL + , SNDNG_ID + , JOB_CD + , REG_VAR_DATA1 + , REG_VAR_DATA2 + , REG_VAR_DATA3 + , REG_VAR_DATA4 + , REG_VAR_DATA5 + , POST_PROC_STT + , RCEPT_YMD + , DEL_YN + , REG_DT + , RGTR + , DEL_DT + , DLTR +) VALUES ( + #{emailRequest.conKey} + , #{emailRequest.rceptId} + , #{emailRequest.dataCd} + , #{emailRequest.divKb} + , #{emailRequest.dfpayyn} + , #{emailRequest.rcptKb} + , #{emailRequest.sealCd} + , #{emailRequest.wordKb} + , #{emailRequest.mailCnt} + , #{emailRequest.recevCnt} + , #{emailRequest.envCd} + , #{emailRequest.colorYn} + , #{emailRequest.mmYn} + , #{emailRequest.flexCd} + , #{emailRequest.dmCnt} + , #{emailRequest.sbFg} + , #{emailRequest.apvlNb} + , #{emailRequest.sendDate} + , #{emailRequest.sendTime} + , #{emailRequest.relorsectCd} + , #{emailRequest.recevSenderOrgCode} + , #{emailRequest.recevSenderNm} + , #{emailRequest.recevSenderZipcode} + , #{emailRequest.recevSenderAddr} + , #{emailRequest.recevSenderDetailaddr} + , #{emailRequest.recevSenderDepartTel} + , #{emailRequest.recevSenderDepartNm} + , #{emailRequest.recevDivCd} + , #{emailRequest.recevPrintDt} + , #{emailRequest.recevPrintYear} + , #{emailRequest.recevPrintMonth} + , #{emailRequest.recevPrintDay} + , #{emailRequest.recevSenderFax} + , #{emailRequest.recevSerderStaff} + , #{emailRequest.recevSenderEmail} + , #{emailRequest.sndngId} + , #{emailRequest.jobCd} + , #{emailRequest.regVarData1} + , #{emailRequest.regVarData2} + , #{emailRequest.regVarData3} + , #{emailRequest.regVarData4} + , #{emailRequest.regVarData5} + , #{emailRequest.postProcStt} + , #{emailRequest.rceptYmd} + , #{emailRequest.delYn} + , + , #{currentUser.id} + , #{emailRequest.removedAt} + , #{emailRequest.removedBy} +) + +/* 전자우편 신청 수정(emailRequestMapper.updateRequest) */ +UPDATE TB_EPOST_RCPT_REG SET + RCEPT_ID = #{emailRequest.rceptId} + , DATA_CD = #{emailRequest.dataCd} + , DIV_KB = #{emailRequest.divKb} + , DFPAYYN = #{emailRequest.dfpayyn} + , RCPT_KB = #{emailRequest.rcptKb} + , SEAL_CD = #{emailRequest.sealCd} + , WORD_KB = #{emailRequest.wordKb} + , MAIL_CNT = #{emailRequest.mailCnt} + , RECEV_CNT = #{emailRequest.recevCnt} + , ENV_CD = #{emailRequest.envCd} + , COLOR_YN = #{emailRequest.colorYn} + , MM_YN = #{emailRequest.mmYn} + , FLEX_CD = #{emailRequest.flexCd} + , DM_CNT = #{emailRequest.dmCnt} + , SB_FG = #{emailRequest.sbFg} + , APVL_NB = #{emailRequest.apvlNb} + , SEND_DATE = #{emailRequest.sendDate} + , SEND_TIME = #{emailRequest.sendTime} + , RELORSECT_CD = #{emailRequest.relorsectCd} + , RECEV_SENDER_ORG_CODE = #{emailRequest.recevSenderOrgCode} + , RECEV_SENDER_NM = #{emailRequest.recevSenderNm} + , RECEV_SENDER_ZIPCODE = #{emailRequest.recevSenderZipcode} + , RECEV_SENDER_ADDR = #{emailRequest.recevSenderAddr} + , RECEV_SENDER_DETAILADDR = #{emailRequest.recevSenderDetailaddr} + , RECEV_SENDER_DEPART_TEL = #{emailRequest.recevSenderDepartTel} + , RECEV_SENDER_DEPART_NM = #{emailRequest.recevSenderDepartNm} + , RECEV_DIV_CD = #{emailRequest.recevDivCd} + , RECEV_PRINT_DT = #{emailRequest.recevPrintDt} + , RECEV_PRINT_YEAR = #{emailRequest.recevPrintYear} + , RECEV_PRINT_MONTH = #{emailRequest.recevPrintMonth} + , RECEV_PRINT_DAY = #{emailRequest.recevPrintDay} + , RECEV_SENDER_FAX = #{emailRequest.recevSenderFax} + , RECEV_SERDER_STAFF = #{emailRequest.recevSerderStaff} + , RECEV_SENDER_EMAIL = #{emailRequest.recevSenderEmail} + , SNDNG_ID = #{emailRequest.sndngId} + , JOB_CD = #{emailRequest.jobCd} + , REG_VAR_DATA1 = #{emailRequest.regVarData1} + , REG_VAR_DATA2 = #{emailRequest.regVarData2} + , REG_VAR_DATA3 = #{emailRequest.regVarData3} + , REG_VAR_DATA4 = #{emailRequest.regVarData4} + , REG_VAR_DATA5 = #{emailRequest.regVarData5} + , POST_PROC_STT = #{emailRequest.postProcStt} + , RCEPT_YMD = #{emailRequest.rceptYmd} + , DEL_YN = #{emailRequest.delYn} + , DEL_DT = #{emailRequest.removedAt} + , DLTR = #{emailRequest.removedBy} + WHERE CON_KEY = #{emailRequest.conKey} + +/* 전자우편 신청 상태 변경(emailRequestMapper.updateRequestStatus) */ +UPDATE TB_EPOST_RCPT_REG SET + POST_PROC_STT = #{status} + , RCEPT_YMD = CASE CON_KEY + WHEN #{result.reletcdata} THEN #{result.rceptYmd} + ELSE RCEPT_YMD END + WHERE CON_KEY IN ( + #{conKey} + #{result.reldivkey} + #{result.reletcdata} + #{result.conKey} + #{result.reletcdata} + ) + AND POST_PROC_STT < #{maxStatus} + +/* 전자우편 배달 완료 처리(emailRequestMapper.updateRequestAsDelivered) */ +UPDATE TB_EPOST_RCPT_REG SET + POST_PROC_STT = #{status} + WHERE POST_PROC_STT = '27' + AND DEL_YN = 'N' + AND REG_DT < CONCAT(DATE_FORMAT(DATE_SUB(CURRENT_DATE, INTERVAL #{expiryDays} DAY), '%Y%m%d'), '000000') + +/* 전자우편 신청 삭제(emailRequestMapper.deleteRequest) */ +UPDATE TB_EPOST_RCPT_REG SET + DEL_YN = 'Y' + , DEL_DT = + , DLTR = #{currentUser.id} + WHERE CON_KEY IN (#{conKey}) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +SELECT CON_KEY + , RGST_NMBR + , RECEV_SEQ + , RECEV_CODE + , RECEV_BAR1D + , RECEV_BAR2D + , RECEV_BILL_NUNBER + , RECEV_DOC_CD1 + , RECEV_DOC_CD2 + , RECEV_DOC_CD3 + , RECEV_DOC_CD4 + , RECEV_DOC_CD5 + , RECEV_SUBJ1 + , RECEV_SUBJ2 + , RECEV_SUBJ3 + , RECEV_VIOLATE_DT + , RECEV_VIOLATE_DONG + , RECEV_VIOLATE_PLACE + , RECEV_LAWS + , RECEV_PAY_NUMBER1 + , RECEV_PAY_NUMBER2 + , RECEV_OCR0 + , RECEV_OCR1 + , RECEV_OCR2 + , RECEV_ONLINE_PAY_NUMBER + , RECEV_FINE_PRICE + , RECEV_PAY_PRICE + , RECEV_PAY_DT + , RECEV_PAY_IN_DATE + , RECEV_PAY_IN_PRICE + , RECEV_PAY_IN_ADD_PRICE + , RECEV_PAY_IN_DEFAULT_PRICE + , RECEV_PAY_OUT_DATE + , RECEV_PAY_OUT_PRICE + , RECEV_PAY_OUT_ADD_PRICE + , RECEV_PAY_OUT_DEFAULT_PRICE + , RECEV_CAR_NUMBER + , RECEV_CAR_OWNER_ZIPCODE + , RECEV_CAR_OWNER_ADDR + , RECEV_CAR_OWNER_DETAILADDR + , RECEV_CAR_OWNER_NM + , RECEV_CAR_OWNER_SSN + , RECEV_EVIDENCE_NUMBER + , RECEV_PHOTO_CNT + , RECEV_PHOTO_FILENAME1 + , RECEV_PHOTO_FILENAME2 + , RECEV_PHOTO_FILENAME3 + , RECEV_PHOTO_FILENAME4 + , VRACTNO2 + , VRACTNO3 + , VRACTNO4 + , VRACTNO5 + , VRACTNO6 + , VRACTNO7 + , VRACTNO8 + , VRACTNO9 + , VRACTNO10 + , VRACTNO11 + , DTL_VAR_DATA1 + , DTL_VAR_DATA2 + , DTL_VAR_DATA3 + , DTL_VAR_DATA4 + , DTL_VAR_DATA5 + , DLVR_RSLT_ID + , MAKE_RSLT_CD + , REG_DT + , RGTR + , VRACTNO + FROM TB_EPOST_RCPT_DTL + + + + + +/* 전자우편 신청 상세 등록(emailRequestMapper.insertRequestDetail) */ +INSERT INTO TB_EPOST_RCPT_DTL ( + CON_KEY + , RGST_NMBR + , RECEV_SEQ + , RECEV_CODE + , RECEV_BAR1D + , RECEV_BAR2D + , RECEV_BILL_NUNBER + , RECEV_DOC_CD1 + , RECEV_DOC_CD2 + , RECEV_DOC_CD3 + , RECEV_DOC_CD4 + , RECEV_DOC_CD5 + , RECEV_SUBJ1 + , RECEV_SUBJ2 + , RECEV_SUBJ3 + , RECEV_VIOLATE_DT + , RECEV_VIOLATE_DONG + , RECEV_VIOLATE_PLACE + , RECEV_LAWS + , RECEV_PAY_NUMBER1 + , RECEV_PAY_NUMBER2 + , RECEV_OCR0 + , RECEV_OCR1 + , RECEV_OCR2 + , RECEV_ONLINE_PAY_NUMBER + , RECEV_FINE_PRICE + , RECEV_PAY_PRICE + , RECEV_PAY_DT + , RECEV_PAY_IN_DATE + , RECEV_PAY_IN_PRICE + , RECEV_PAY_IN_ADD_PRICE + , RECEV_PAY_IN_DEFAULT_PRICE + , RECEV_PAY_OUT_DATE + , RECEV_PAY_OUT_PRICE + , RECEV_PAY_OUT_ADD_PRICE + , RECEV_PAY_OUT_DEFAULT_PRICE + , RECEV_CAR_NUMBER + , RECEV_CAR_OWNER_ZIPCODE + , RECEV_CAR_OWNER_ADDR + , RECEV_CAR_OWNER_DETAILADDR + , RECEV_CAR_OWNER_NM + , RECEV_CAR_OWNER_SSN + , RECEV_EVIDENCE_NUMBER + , RECEV_PHOTO_CNT + , RECEV_PHOTO_FILENAME1 + , RECEV_PHOTO_FILENAME2 + , RECEV_PHOTO_FILENAME3 + , RECEV_PHOTO_FILENAME4 + , VRACTNO2 + , VRACTNO3 + , VRACTNO4 + , VRACTNO5 + , VRACTNO6 + , VRACTNO7 + , VRACTNO8 + , VRACTNO9 + , VRACTNO10 + , VRACTNO11 + , DTL_VAR_DATA1 + , DTL_VAR_DATA2 + , DTL_VAR_DATA3 + , DTL_VAR_DATA4 + , DTL_VAR_DATA5 + , DLVR_RSLT_ID + , MAKE_RSLT_CD + , REG_DT + , RGTR + , VRACTNO +) VALUES ( + #{emailRequestDetail.conKey} + , #{emailRequestDetail.rgstNmbr} + , #{emailRequestDetail.recevSeq} + , #{emailRequestDetail.recevCode} + , #{emailRequestDetail.recevBar1d} + , #{emailRequestDetail.recevBar2d} + , #{emailRequestDetail.recevBillNunber} + , #{emailRequestDetail.recevDocCd1} + , #{emailRequestDetail.recevDocCd2} + , #{emailRequestDetail.recevDocCd3} + , #{emailRequestDetail.recevDocCd4} + , #{emailRequestDetail.recevDocCd5} + , #{emailRequestDetail.recevSubj1} + , #{emailRequestDetail.recevSubj2} + , #{emailRequestDetail.recevSubj3} + , #{emailRequestDetail.recevViolateDt} + , #{emailRequestDetail.recevViolateDong} + , #{emailRequestDetail.recevViolatePlace} + , #{emailRequestDetail.recevLaws} + , #{emailRequestDetail.recevPayNumber1} + , #{emailRequestDetail.recevPayNumber2} + , #{emailRequestDetail.recevOcr0} + , #{emailRequestDetail.recevOcr1} + , #{emailRequestDetail.recevOcr2} + , #{emailRequestDetail.recevOnlinePayNumber} + , #{emailRequestDetail.recevFinePrice} + , #{emailRequestDetail.recevPayPrice} + , #{emailRequestDetail.recevPayDt} + , #{emailRequestDetail.recevPayInDate} + , #{emailRequestDetail.recevPayInPrice} + , #{emailRequestDetail.recevPayInAddPrice} + , #{emailRequestDetail.recevPayInDefaultPrice} + , #{emailRequestDetail.recevPayOutDate} + , #{emailRequestDetail.recevPayOutPrice} + , #{emailRequestDetail.recevPayOutAddPrice} + , #{emailRequestDetail.recevPayOutDefaultPrice} + , #{emailRequestDetail.recevCarNumber} + , #{emailRequestDetail.recevCarOwnerZipcode} + , #{emailRequestDetail.recevCarOwnerAddr} + , #{emailRequestDetail.recevCarOwnerDetailaddr} + , #{emailRequestDetail.recevCarOwnerNm} + , #{emailRequestDetail.recevCarOwnerSsn} + , #{emailRequestDetail.recevEvidenceNumber} + , #{emailRequestDetail.recevPhotoCnt} + , #{emailRequestDetail.recevPhotoFilename1} + , #{emailRequestDetail.recevPhotoFilename2} + , #{emailRequestDetail.recevPhotoFilename3} + , #{emailRequestDetail.recevPhotoFilename4} + , #{emailRequestDetail.vractno2} + , #{emailRequestDetail.vractno3} + , #{emailRequestDetail.vractno4} + , #{emailRequestDetail.vractno5} + , #{emailRequestDetail.vractno6} + , #{emailRequestDetail.vractno7} + , #{emailRequestDetail.vractno8} + , #{emailRequestDetail.vractno9} + , #{emailRequestDetail.vractno10} + , #{emailRequestDetail.vractno11} + , #{emailRequestDetail.dtlVarData1} + , #{emailRequestDetail.dtlVarData2} + , #{emailRequestDetail.dtlVarData3} + , #{emailRequestDetail.dtlVarData4} + , #{emailRequestDetail.dtlVarData5} + , #{emailRequestDetail.dlvrRsltId} + , #{emailRequestDetail.makeRsltCd} + , + , #{currentUser.id} + , #{emailRequestDetail.vractno} +) + +/* 전자우편 신청 상세 수정(emailRequestMapper.updateRequestDetail) */ +UPDATE TB_EPOST_RCPT_DTL SET + RECEV_SEQ = #{emailRequestDetail.recevSeq} + , RECEV_CODE = #{emailRequestDetail.recevCode} + , RECEV_BAR1D = #{emailRequestDetail.recevBar1d} + , RECEV_BAR2D = #{emailRequestDetail.recevBar2d} + , RECEV_BILL_NUNBER = #{emailRequestDetail.recevBillNunber} + , RECEV_DOC_CD1 = #{emailRequestDetail.recevDocCd1} + , RECEV_DOC_CD2 = #{emailRequestDetail.recevDocCd2} + , RECEV_DOC_CD3 = #{emailRequestDetail.recevDocCd3} + , RECEV_DOC_CD4 = #{emailRequestDetail.recevDocCd4} + , RECEV_DOC_CD5 = #{emailRequestDetail.recevDocCd5} + , RECEV_SUBJ1 = #{emailRequestDetail.recevSubj1} + , RECEV_SUBJ2 = #{emailRequestDetail.recevSubj2} + , RECEV_SUBJ3 = #{emailRequestDetail.recevSubj3} + , RECEV_VIOLATE_DT = #{emailRequestDetail.recevViolateDt} + , RECEV_VIOLATE_DONG = #{emailRequestDetail.recevViolateDong} + , RECEV_VIOLATE_PLACE = #{emailRequestDetail.recevViolatePlace} + , RECEV_LAWS = #{emailRequestDetail.recevLaws} + , RECEV_PAY_NUMBER1 = #{emailRequestDetail.recevPayNumber1} + , RECEV_PAY_NUMBER2 = #{emailRequestDetail.recevPayNumber2} + , RECEV_OCR0 = #{emailRequestDetail.recevOcr0} + , RECEV_OCR1 = #{emailRequestDetail.recevOcr1} + , RECEV_OCR2 = #{emailRequestDetail.recevOcr2} + , RECEV_ONLINE_PAY_NUMBER = #{emailRequestDetail.recevOnlinePayNumber} + , RECEV_FINE_PRICE = #{emailRequestDetail.recevFinePrice} + , RECEV_PAY_PRICE = #{emailRequestDetail.recevPayPrice} + , RECEV_PAY_DT = #{emailRequestDetail.recevPayDt} + , RECEV_PAY_IN_DATE = #{emailRequestDetail.recevPayInDate} + , RECEV_PAY_IN_PRICE = #{emailRequestDetail.recevPayInPrice} + , RECEV_PAY_IN_ADD_PRICE = #{emailRequestDetail.recevPayInAddPrice} + , RECEV_PAY_IN_DEFAULT_PRICE = #{emailRequestDetail.recevPayInDefaultPrice} + , RECEV_PAY_OUT_DATE = #{emailRequestDetail.recevPayOutDate} + , RECEV_PAY_OUT_PRICE = #{emailRequestDetail.recevPayOutPrice} + , RECEV_PAY_OUT_ADD_PRICE = #{emailRequestDetail.recevPayOutAddPrice} + , RECEV_PAY_OUT_DEFAULT_PRICE = #{emailRequestDetail.recevPayOutDefaultPrice} + , RECEV_CAR_NUMBER = #{emailRequestDetail.recevCarNumber} + , RECEV_CAR_OWNER_ZIPCODE = #{emailRequestDetail.recevCarOwnerZipcode} + , RECEV_CAR_OWNER_ADDR = #{emailRequestDetail.recevCarOwnerAddr} + , RECEV_CAR_OWNER_DETAILADDR = #{emailRequestDetail.recevCarOwnerDetailaddr} + , RECEV_CAR_OWNER_NM = #{emailRequestDetail.recevCarOwnerNm} + , RECEV_CAR_OWNER_SSN = #{emailRequestDetail.recevCarOwnerSsn} + , RECEV_EVIDENCE_NUMBER = #{emailRequestDetail.recevEvidenceNumber} + , RECEV_PHOTO_CNT = #{emailRequestDetail.recevPhotoCnt} + , RECEV_PHOTO_FILENAME1 = #{emailRequestDetail.recevPhotoFilename1} + , RECEV_PHOTO_FILENAME2 = #{emailRequestDetail.recevPhotoFilename2} + , RECEV_PHOTO_FILENAME3 = #{emailRequestDetail.recevPhotoFilename3} + , RECEV_PHOTO_FILENAME4 = #{emailRequestDetail.recevPhotoFilename4} + , VRACTNO2 = #{emailRequestDetail.vractno2} + , VRACTNO3 = #{emailRequestDetail.vractno3} + , VRACTNO4 = #{emailRequestDetail.vractno4} + , VRACTNO5 = #{emailRequestDetail.vractno5} + , VRACTNO6 = #{emailRequestDetail.vractno6} + , VRACTNO7 = #{emailRequestDetail.vractno7} + , VRACTNO8 = #{emailRequestDetail.vractno8} + , VRACTNO9 = #{emailRequestDetail.vractno9} + , VRACTNO10 = #{emailRequestDetail.vractno10} + , VRACTNO11 = #{emailRequestDetail.vractno11} + , DTL_VAR_DATA1 = #{emailRequestDetail.dtlVarData1} + , DTL_VAR_DATA2 = #{emailRequestDetail.dtlVarData2} + , DTL_VAR_DATA3 = #{emailRequestDetail.dtlVarData3} + , DTL_VAR_DATA4 = #{emailRequestDetail.dtlVarData4} + , DTL_VAR_DATA5 = #{emailRequestDetail.dtlVarData5} + , DLVR_RSLT_ID = #{emailRequestDetail.dlvrRsltId} + , MAKE_RSLT_CD = #{emailRequestDetail.makeRsltCd} + , VRACTNO = #{emailRequestDetail.vractno} + WHERE CON_KEY = #{emailRequestDetail.conKey} + AND RGST_NMBR = #{emailRequestDetail.rgstNmbr} + +/* 전자우편 신청 상세 상태 변경(emailRequestMapper.updateRequestDetailStatus) */ +UPDATE TB_EPOST_RCPT_DTL A + + , ( + SELECT #{result.conKey} CON_KEY, #{result.rgstNmbr} RGST_NMBR, #{result.dataCd} MAKE_RSLT_CD + ) B + SET A.MAKE_RSLT_CD = B.MAKE_RSLT_CD + + + , ( + SELECT #{result.reletcdata} CON_KEY, #{result.regino} RGST_NMBR, #{result.dlvrRsltId} DLVR_RSLT_ID + ) B + SET A.DLVR_RSLT_ID = B.DLVR_RSLT_ID + + WHERE A.CON_KEY = B.CON_KEY + AND B.RGST_NMBR = B.RGST_NMBR + + + \ No newline at end of file diff --git a/src/main/resources/sql/mapper/epost/emailResult-mapper.xml b/src/main/resources/sql/mapper/epost/emailResult-mapper.xml new file mode 100644 index 0000000..73a2c9b --- /dev/null +++ b/src/main/resources/sql/mapper/epost/emailResult-mapper.xml @@ -0,0 +1,216 @@ + + + + + + +/* 전자우편 신청 수신 결과 등록(emailResultMapper.insertReceptionResult) */ + +SELECT IFNULL(MAX(RCPTN_RSLT_ID) + 1, CONCAT(TODAY, '0000001')) NEW_ID + FROM TB_EPOST_RCPTN_RSLT A, () B + WHERE RCPTN_RSLT_ID LIKE CONCAT(TODAY, '%') +INSERT INTO TB_EPOST_RCPTN_RSLT ( + RCPTN_RSLT_ID + , OUTSIDUSERID + , INIT_TIME + , RECV_FILENAME + , RELDIVKEY + , RECPRSNSEQ + , REGINO + , ATTACHFILENM + , JUNGHAP1 + , JUNGHAP2 + , JUNGHAP3 + , CODE + , MSG + , REG_DT + , RGTR +) +SELECT #{rcptnRsltId} + , #{outsiduserid} + , #{initTime} + , #{recvFilename} + , #{reldivkey} + , #{recprsnseq} + , #{regino} + , #{attachfilenm} + , #{junghap1} + , #{junghap2} + , #{junghap3} + , #{code} + , #{msg} + , #{createdAt} + , #{createdBy} + WHERE NOT EXISTS ( + SELECT 1 + FROM TB_EPOST_RCPTN_RSLT + WHERE RELDIVKEY = #{reldivkey} + AND REGINO = #{regino} + ) + +/* 전자우편 신청 접수 결과 등록(emailResultMapper.insertRegistrationResult) */ + +SELECT IFNULL(MAX(RCPT_RSLT_ID) + 1, CONCAT(TODAY, '0000001')) NEW_ID + FROM TB_EPOST_RCPT_RSLT A, () B + WHERE RCPT_RSLT_ID LIKE CONCAT(TODAY, '%') +INSERT INTO TB_EPOST_RCPT_RSLT ( + RCPT_RSLT_ID + , CON_ORG + , RELORSECT_CD + , RELETCDATA + , EXTRI_REGYMD + , RCEPT_YMD + , RCEPT_ID + , DIV_KB + , RCEPT_CNT + , RCEPT_AMT + , USEFEE_AMT + , TOTPOST_PRC + , JOB_CD + , REG_DT + , RGTR +) +SELECT #{rcptRsltId} + , #{conOrg} + , #{relorsectCd} + , #{reletcdata} + , #{extriRegymd} + , #{rceptYmd} + , #{rceptId} + , #{divKb} + , #{rceptCnt} + , #{rceptAmt} + , #{usefeeAmt} + , #{totpostPrc} + , #{jobCd} + , #{createdAt} + , #{createdBy} + FROM DUAL + WHERE NOT EXISTS ( + SELECT 1 + FROM TB_EPOST_RCPT_RSLT + WHERE RELETCDATA = #{reletcdata} + ) + +/* 전자우편 신청 접수 결과(jobCd) 업데이트(emailResultMapper.updateRegistrationResult) */ +UPDATE TB_EPOST_RCPT_RSLT A + , TB_EPOST_RCPT_REG B + SET A.JOB_CD = SUBSTR(B.JOB_CD, 2) + WHERE A.RELETCDATA IN (#{conKey}) + AND A.RELETCDATA = B.CON_KEY + +/* 전자우편 제작 결과 등록(emailResultMapper.insertProductionResult) */ +INSERT INTO TB_EPOST_MAKE_RSLT ( + CON_KEY + , RGST_NMBR + , RELETCDATA + , DATA_CD + , MAIL_CNT + , REG_DT + , RGTR +) +SELECT #{conKey} + , #{rgstNmbr} + , #{reletcdata} + , #{dataCd} + , #{mailCnt} + , #{createdAt} + , #{createdBy} + FROM DUAL + WHERE NOT EXISTS ( + SELECT 1 + FROM TB_EPOST_MAKE_RSLT + WHERE CON_KEY = #{conKey} + AND RGST_NMBR = #{rgstNmbr} + ) + +/* 전자우편 배달 결과 등록(emailResultMapper.insertDeliveryResult) */ + +SELECT IFNULL(MAX(DLVR_RSLT_ID) + 1, CONCAT(TODAY, '0000001')) NEW_ID + FROM TB_EPOST_DLVR_RSLT A, () B + WHERE DLVR_RSLT_ID LIKE CONCAT(TODAY, '%') +INSERT INTO TB_EPOST_DLVR_RSLT ( + DLVR_RSLT_ID + , CON_KEY + , OUTSIDUSERID + , RELETCDATA + , REGINO + , DELIVYMD + , DELIVHHMI + , DELIVRSLTCD + , NONDELIVREASNCD + , NONDELIVREASNCDNM + , SUBRECPRSNNM + , RELRECPRSNCD + , RELRECPRSNCDNM + , REG_DT + , RGTR +) VALUES ( + #{dlvrRsltId} + , #{reletcdata} + , #{outsiduserid} + , #{reletcdata} + , #{regino} + , #{delivymd} + , #{delivhhmi} + , #{delivrsltcd} + , #{nondelivreasncd} + , #{nondelivreasncdnm} + , #{subrecprsnnm} + , #{relrecprsncd} + , #{relrecprsncdnm} + , #{createdAt} + , #{createdBy} +) + + + +/* 전자우편 신청결과 로그 등록(emailResultMapper.insertResultLogs) */ +INSERT INTO TB_EPOST_PROC_LOG ( + PROC_ID + , PROC_SEQ + , PROC_TYPE + , RESULT_ID + , CON_KEY + , RGST_NMBR + , PROC_STT + , REG_DT + , RGTR +) +SELECT #{log.procId} + , #{log.procSeq} + , #{log.procType} + , #{log.resultId} + , #{log.conKey} + , #{log.rgstNmbr} + , 'N' + , #{log.createdAt} + , #{log.createdBy} + + +/* 전자우편 신청결과 로그 상태 업데이트(emailResultMapper.updateResultLogStatus) */ +UPDATE TB_EPOST_PROC_LOG A + , ( + SELECT #{log.PROC_ID} PROC_ID, #{log.PROC_SEQ} PROC_SEQ, #{log.PROC_STT} PROC_STT + ) B + SET A.PROC_STT = B.PROC_STT + WHERE A.PROC_ID = B.PROC_ID + AND A.PROC_SEQ = B.PROC_SEQ + + \ No newline at end of file diff --git a/src/main/sql/xit-epost-mariadb.sql b/src/main/sql/xit-epost-mariadb.sql new file mode 100644 index 0000000..bf4eb5d --- /dev/null +++ b/src/main/sql/xit-epost-mariadb.sql @@ -0,0 +1,114 @@ +CREATE OR REPLACE TABLE TB_EPOST_RCPT_REG ( + CON_KEY VARCHAR(30) NOT NULL COMMENT '외부연계식별키', + RCEPT_ID VARCHAR(5) COMMENT '접수우체국국기호', + DATA_CD VARCHAR(2) COMMENT '접수코드', + DIV_KB VARCHAR(3) COMMENT '취급구분', + DFPAYYN VARCHAR(3) COMMENT '결재방법', + RCPT_KB VARCHAR(3) COMMENT '내용문 유형', + SEAL_CD VARCHAR(3) COMMENT '내용문 상세 종류', + WORD_KB VARCHAR(3) COMMENT '내용문 종류', + MAIL_CNT INT(11) COMMENT '내용문 매수', + RECEV_CNT INT(11) COMMENT '수취인 수', + ENV_CD VARCHAR(3) COMMENT '봉투 종류', + COLOR_YN VARCHAR(1) COMMENT '칼라우편물', + MM_YN VARCHAR(1) COMMENT '메일머지 플래그', + FLEX_CD VARCHAR(1) COMMENT '이면구분', + DM_CNT INT(11) COMMENT '동봉물 개수', + SB_FG VARCHAR(1) COMMENT '반송불필요 여부', + APVL_NB VARCHAR(10) COMMENT '승인번호', + SEND_DATE VARCHAR(8) COMMENT '신청 일자', + SEND_TIME VARCHAR(6) COMMENT '전송 시간', + RELORSECT_CD VARCHAR(15) COMMENT '연계기관결제부서코드', + RECEV_SENDER_ORG_CODE VARCHAR(15) COMMENT '발송기관코드', + RECEV_SENDER_NM VARCHAR(40) COMMENT '발송인명', + RECEV_SENDER_ZIPCODE VARCHAR(6) COMMENT '발송인 우편번호', + RECEV_SENDER_ADDR VARCHAR(60) COMMENT '주소', + RECEV_SENDER_DETAILADDR VARCHAR(100) COMMENT '상세주소', + RECEV_SENDER_DEPART_TEL VARCHAR(60) COMMENT '부과부서 전화번호', + RECEV_SENDER_DEPART_NM VARCHAR(30) COMMENT '부과부서', + RECEV_DIV_CD VARCHAR(1) COMMENT '등기구분', + RECEV_PRINT_DT VARCHAR(21) COMMENT '출력일자', + RECEV_PRINT_YEAR VARCHAR(4) COMMENT '출력연도', + RECEV_PRINT_MONTH VARCHAR(2) COMMENT '출력월', + RECEV_PRINT_DAY VARCHAR(2) COMMENT '출력일', + RECEV_SENDER_FAX VARCHAR(20) COMMENT '부과부서 팩스번호', + RECEV_SERDER_STAFF VARCHAR(30) COMMENT '부과부서 담당자', + RECEV_SENDER_EMAIL VARCHAR(60) COMMENT '부과부서 이메일', + SNDNG_ID VARCHAR(20) COMMENT '발송 ID', + JOB_CD VARCHAR(4) COMMENT '작업 코드', + POST_PROC_STT VARCHAR(2) COMMENT 'POST_PROC_STT', + RCEPT_YMD VARCHAR(8) COMMENT 'RCEPT_YMD', + DEL_YN VARCHAR(1) COMMENT '삭제 여부', + REG_DT VARCHAR(14) COMMENT '등록 일시', + RGTR VARCHAR(20) COMMENT '등록자', + DEL_DT VARCHAR(14) COMMENT '삭제 일시', + DLTR VARCHAR(20) COMMENT '삭제자', + PRIMARY KEY (CON_KEY) +) COMMENT='전자우편 접수 등록'; + +CREATE OR REPLACE TABLE TB_EPOST_RCPT_DTL ( + CON_KEY VARCHAR(30) NOT NULL COMMENT '외부연계식별키', + RGST_NMBR VARCHAR(13) NOT NULL COMMENT '등기번호', + RECEV_SEQ VARCHAR(20) COMMENT '일련번호', + RECEV_CODE VARCHAR(10) COMMENT '발송코드', + RECEV_BAR1D VARCHAR(18) COMMENT '바코드', + RECEV_BAR2D VARCHAR(170) COMMENT '이차원바코드', + RECEV_BILL_NUNBER VARCHAR(21) COMMENT '고지번호', + RECEV_DOC_CD1 VARCHAR(60) COMMENT '문서종류1', + RECEV_DOC_CD2 VARCHAR(30) COMMENT '문서종류2', + RECEV_DOC_CD3 VARCHAR(6) COMMENT '문서종류3', + RECEV_DOC_CD4 VARCHAR(60) COMMENT '문서종류4', + RECEV_DOC_CD5 VARCHAR(15) COMMENT '문서종류5', + RECEV_SUBJ1 VARCHAR(6) COMMENT '과목명1', + RECEV_SUBJ2 VARCHAR(6) COMMENT '과목명2', + RECEV_SUBJ3 VARCHAR(14) COMMENT '과목명3', + RECEV_VIOLATE_DT VARCHAR(30) COMMENT '위반일시', + RECEV_VIOLATE_DONG VARCHAR(39) COMMENT '위반동', + RECEV_VIOLATE_PLACE VARCHAR(80) COMMENT '위반장소', + RECEV_LAWS VARCHAR(70) COMMENT '법조항', + RECEV_PAY_NUMBER1 VARCHAR(17) COMMENT '납부번호1', + RECEV_PAY_NUMBER2 VARCHAR(15) COMMENT '납부번호2', + RECEV_OCR0 VARCHAR(32) COMMENT 'OCR0', + RECEV_OCR1 VARCHAR(54) COMMENT 'OCR1', + RECEV_OCR2 VARCHAR(54) COMMENT 'OCR2', + RECEV_ONLINE_PAY_NUMBER VARCHAR(30) COMMENT '전자납부번호', + RECEV_VACCOUNT_NUMBER VARCHAR(50) COMMENT '가상계좌번호', + RECEV_FINE_PRICE VARCHAR(10) COMMENT '과태료', + RECEV_PAY_PRICE VARCHAR(10) COMMENT '납부금액', + RECEV_PAY_DT VARCHAR(15) COMMENT '납부기한', + RECEV_PAY_IN_DATE VARCHAR(10) COMMENT '납기내기한', + RECEV_PAY_IN_PRICE VARCHAR(10) COMMENT '납기내금액', + RECEV_PAY_IN_ADD_PRICE VARCHAR(10) COMMENT '납기내가산금', + RECEV_PAY_IN_DEFAULT_PRICE VARCHAR(10) COMMENT '납기내합계금액', + RECEV_PAY_OUT_DATE VARCHAR(10) COMMENT '납기후기한', + RECEV_PAY_OUT_PRICE VARCHAR(10) COMMENT '납기후금액', + RECEV_PAY_OUT_ADD_PRICE VARCHAR(10) COMMENT '납기후가산금', + RECEV_PAY_OUT_DEFAULT_PRICE VARCHAR(10) COMMENT '납기후합계금액', + RECEV_CAR_NUMBER VARCHAR(50) COMMENT '차량번호', + RECEV_CAR_OWNER_ZIPCODE VARCHAR(6) COMMENT '우편번호', + RECEV_CAR_OWNER_ADDR VARCHAR(99) COMMENT '주소', + RECEV_CAR_OWNER_DETAILADDR VARCHAR(159) COMMENT '상세주소', + RECEV_CAR_OWNER_NM VARCHAR(60) COMMENT '소유자명', + RECEV_CAR_OWNER_SSN VARCHAR(6) COMMENT '주민번호', + RECEV_EVIDENCE_NUMBER VARCHAR(24) COMMENT '증거번호', + RECEV_PHOTO_CNT VARCHAR(2) COMMENT '사진장수', + RECEV_PHOTO_FILENAME1 VARCHAR(80) COMMENT '사진파일명1', + RECEV_PHOTO_FILENAME2 VARCHAR(80) COMMENT '사진파일명2', + RECEV_PHOTO_FILENAME3 VARCHAR(80) COMMENT '사진파일명3', + RECEV_PHOTO_FILENAME4 VARCHAR(80) COMMENT '사진파일명4', + VRACTNO2 VARCHAR(50) COMMENT '가상계좌번호2', + VRACTNO3 VARCHAR(50) COMMENT '가상계좌번호3', + VRACTNO4 VARCHAR(50) COMMENT '가상계좌번호4', + VRACTNO5 VARCHAR(50) COMMENT '가상계좌번호5', + VRACTNO6 VARCHAR(50) COMMENT '가상계좌번호6', + VRACTNO7 VARCHAR(50) COMMENT '가상계좌번호7', + VRACTNO8 VARCHAR(50) COMMENT '가상계좌번호8', + VRACTNO9 VARCHAR(50) COMMENT '가상계좌번호9', + VRACTNO10 VARCHAR(50) COMMENT '가상계좌번호10', + VRACTNO11 VARCHAR(50) COMMENT '가상계좌번호11', + DLVR_RSLT_ID VARCHAR(20) COMMENT '배달 결과 ID', + MAKE_RSLT_CD VARCHAR(2) COMMENT '제작 결과 코드', + REG_DT VARCHAR(14) COMMENT '등록 일시', + RGTR VARCHAR(20) COMMENT '등록자', + PRIMARY KEY (CON_KEY, RGST_NMBR) +) COMMENT = '전자우편 접수 상세'; \ No newline at end of file