포스트플러스 제작신청/조회 수정, 템플릿 설정 추가

master
mjkhan21 4 months ago
parent ae7dcc8c1d
commit 036f221927

@ -1,11 +1,15 @@
package cokr.xit.interfaces.postplus;
import java.io.InputStream;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import org.springframework.core.io.ClassPathResource;
import cokr.xit.foundation.AbstractComponent;
import cokr.xit.foundation.data.DataObject;
import cokr.xit.foundation.data.JSON;
import lombok.Getter;
import lombok.Setter;
@ -31,9 +35,8 @@ public class Postplus extends AbstractComponent {
public static Postplus get() {
if (conf == null)
try {
ClassPathResource res = new ClassPathResource("intf-conf/xit-postplus.conf");
conf = new JSON().parse(res.getInputStream(), Postplus.class);
try (InputStream input = new ClassPathResource("intf-conf/xit-postplus.conf").getInputStream();) {
conf = new JSON().parse(input, Postplus.class);
} catch (Exception e) {
throw runtimeException(e);
}
@ -43,7 +46,11 @@ public class Postplus extends AbstractComponent {
private String
host,
version;
private boolean test;
private Boolean
sendRequest = Boolean.TRUE,
test = Boolean.FALSE,
logTable = Boolean.TRUE;
private Map<String, Api> apis;
private Map<String, String>
urls,
apiKeys;
@ -52,8 +59,24 @@ public class Postplus extends AbstractComponent {
return test ? "Y" : "N";
}
public String apiKey(String key) {
return !isEmpty(apiKeys) ? apiKeys.get(key) : null;
public List<DataObject> getApis() {
return !isEmpty(apis) ?
apis.values().stream().map(Api::getInfo).toList() :
Collections.emptyList();
}
public Api api(String name) {
Api api = !isEmpty(apis) ? apis.get(ifEmpty(name, "default")) : null;
if (api != null)
log().debug("postplus api: {}\npostplus api key: {}\npostplus valueMapper: {}", api.name, api.key, api.valueMapper);
return api;
}
public void setApis(List<Api> apis) {
this.apis = apis.stream().collect(Collectors.toMap(
api -> api.name,
api -> api
));
}
private Map<String, String> urls() {
@ -68,4 +91,21 @@ public class Postplus extends AbstractComponent {
public String productionStatusURL() {
return getHost() + urls().getOrDefault("productionStatus", "/po/api/postplusPstStatusApi.do");
}
@Getter
@Setter
public static class Api {
private String
name,
key,
systemCode,
valueMapper;
public DataObject getInfo() {
return new DataObject()
.set("name", name)
.set("key", key)
.set("systemCode", systemCode)
.set("valueMapper", valueMapper);
}
}
}

@ -12,4 +12,8 @@ public class PostResponse {
private String result;
@JsonProperty("비고")
private String remark;
public boolean success() {
return "OK".equalsIgnoreCase(result);
}
}

@ -0,0 +1,17 @@
package cokr.xit.interfaces.postplus.post;
import java.util.List;
import cokr.xit.foundation.component.ServiceRequest;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;
@Getter
@Setter
@Accessors(chain = true)
public class PostplusRequest extends ServiceRequest {
private static final long serialVersionUID = 1L;
private List<String> templateIDs;
}

@ -5,11 +5,13 @@ import java.io.FileInputStream;
import java.io.InputStream;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import cokr.xit.foundation.AbstractComponent;
import cokr.xit.foundation.AbstractObject;
import cokr.xit.foundation.data.DataObject;
import cokr.xit.foundation.data.Named;
import cokr.xit.interfaces.postplus.Postplus;
import cokr.xit.interfaces.postplus.Postplus.Api;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;
@ -17,7 +19,7 @@ import lombok.experimental.Accessors;
/**
* @author mjkhan
*/
public class PstMsr extends AbstractComponent {
public class PstMsr extends AbstractObject {
/**
* @author mjkhan
*/
@ -25,20 +27,18 @@ public class PstMsr extends AbstractComponent {
@Setter
@Accessors(chain = true)
public static class Master {
private static final List<String> cols = List.of(new String[] {
"버전", "테스트여부", "서비스", "연계식별키", "봉투",
"봉투창", "흑백칼라", "단면양면", "배달", "템플릿코드",
"템플릿출력여부", "수취인수", "여백생성유무", "주소페이지유무", "맞춤자제유무",
"메일머지유무", "동봉물유무", "반송여부", "스테이플러유무", "로고파일",
"발송인명", "발송인우편번호", "발송인주소", "발송인상세주소", "발송인전화번호"
});
/** 버전 */
private String version;
private String version = Postplus.get().getVersion();
/** 테스트여부 */
private String testYN;
private String testYN = Postplus.get().getTest();
/** 서비스 */
private String service;
private String service = Postplus.Service.PST.getCode();
/** 시스템코드 */
private String systemCd;
/** 발송ID */
private String sndngId;
/** 고지서구분 */
private String noticeGb;
/** 연계식별키 */
private String intfID;
/** 봉투 */
@ -54,27 +54,31 @@ public class PstMsr extends AbstractComponent {
/** 템플릿코드 */
private String templateCode;
/** 템플릿출력여부 */
private String templatePrint;
private String templatePrint = "N";
/** 수취인수 */
private String recipientCount;
/** 여백생성유무 */
private String marginYN;
private String marginYN = "N";
/** 주소페이지유무 */
private String addressPageYN;
private String addressPageYN = "N";
/** 맞춤자제유무 */
private String orderYN;
private String alignYN = "N";
/** 메일머지유무 */
private String mailMergeYN;
private String mailMergeYN = "N";
/** 동봉물유무 */
private String enclosedYN;
private String enclosureYN = "N";
/** 반송여부 */
private String returnYN;
private String returnYN = "N";
/** 스테이플러유무 */
private String staplerYN;
private String staplerYN = "N";
/** 로고파일 */
private String logoFile;
/** 발송인명 */
private String senderName;
/** 발송시군구명 */
private String senderSigungu;
/** 발송부서코드 */
private String senderDeptCd;
/** 발송인우편번호 */
private String senderZipcode;
/** 발송인주소 */
@ -83,49 +87,15 @@ public class PstMsr extends AbstractComponent {
private String senderDetailAddress;
/** 발송인전화번호 */
private String senderPhoneNo;
/** 발송인전자우편 */
private String senderEmail;
/** .
* @return
*/
public DataObject toRequest() {
return new DataObject()
.set("cols", toCols())
.set("rows", toRows());
}
protected List<String> toCols() {
return cols;
}
protected List<String> toRows() {
return List.of(new String[] {
ifEmpty(version, Postplus.get()::getVersion),
ifEmpty(testYN, Postplus.get()::getTest),
ifEmpty(service, Postplus.Service.PST::getCode),
blankIfEmpty(intfID),
blankIfEmpty(envelop),
blankIfEmpty(envelopWindow),
blankIfEmpty(bwColor),
blankIfEmpty(faceType),
blankIfEmpty(delivery),
blankIfEmpty(templateCode),
blankIfEmpty(templatePrint),
blankIfEmpty(recipientCount),
blankIfEmpty(marginYN),
blankIfEmpty(addressPageYN),
blankIfEmpty(orderYN),
blankIfEmpty(mailMergeYN),
blankIfEmpty(enclosedYN),
blankIfEmpty(returnYN),
blankIfEmpty(staplerYN),
blankIfEmpty(logoFile),
blankIfEmpty(senderName),
blankIfEmpty(senderZipcode),
blankIfEmpty(senderAddress),
blankIfEmpty(senderDetailAddress),
blankIfEmpty(senderPhoneNo)
});
}
/** 진행상태 */
private String status;
/** 최종제작 상태 */
private String postProgress;
/** 최종제작 상태확인 일시 */
private String statusCheckDate;
}
/**
@ -135,31 +105,12 @@ public class PstMsr extends AbstractComponent {
@Setter
@Accessors(chain = true)
public static class Detail {
private static final List<String> cols = List.of(new String[] {
"순번", "이름", "우편번호", "주소", "상세주소",
"전화번호", "첨부파일", "가변1", "가변2", "가변3", "가변4"
});
protected List<String> toCols() {
return cols;
}
public static DataObject toRequest(List<Detail> details) {
DataObject req = new DataObject();
if (isEmpty(details)) return req;
Detail first = details.get(0);
req.set("cols", first.toCols());
List<List<String>> rows = details.stream()
.map(Detail::toRow)
.toList();
return req.set("rows", rows);
}
/** 연계식별키 */
private String intfID;
/** 순번 */
private String seq;
/** 발송상세ID */
private String sndngDtlId;
/** 이름 */
private String name;
/** 우편번호 */
@ -170,8 +121,120 @@ public class PstMsr extends AbstractComponent {
private String detailAddress;
/** 전화번호 */
private String phoneNo;
/** 첨부파일 */
private String attachment;
/** 휴대전화번호 */
private String mobileNo;
/** 이메일주소 */
private String email;
/** 등기구분 */
private String regGb;
/** 등기번호 */
private String regNo;
/** 등기번호 등록일시 */
private String regNoDatetime;
/** 일련번호 */
private String serNo;
/** 발송코드 */
private String deliveryCd;
/** 바코드 1D */
private String bar1D;
/** 바코드 2D */
private String bar2D;
/** 고지서번호 */
private String noticeNo;
/** 문서종류1 */
private String docCd1;
/** 문서종류2 */
private String docCd2;
/** 문서종류3 */
private String docCd3;
/** 문서종류4 */
private String docCd4;
/** 문서종류5 */
private String docCd5;
/** 과목명1 */
private String subject1;
/** 과목명2 */
private String subject2;
/** 과목명3 */
private String subject3;
/** 위반일시 */
private String violationDatetime;
/** 위반동 */
private String violationDong;
/** 위반장소 */
private String violationLocation;
/** 법조항 */
private String legalBasis;
/** 납부번호1 */
private String paymentNo1;
/** 납부번호2 */
private String paymentNo2;
/** ocr0 */
private String ocr0;
/** ocr1 */
private String ocr1;
/** ocr2 */
private String ocr2;
/** 전자납부번호 */
private String epaymentNo;
/** 가상계좌번호 */
private String vaccountNo;
/** 과태료 */
private long fineAmt;
/** 납부금액 */
private long paymentAmt;
/** 납부기한 */
private String dueDate;
/** 납기내기한 */
private String inDueDate;
/** 납기내금액 */
private long inDueAmt;
/** 납기내가산금 */
private long inDueAddedAmt;
/** 납기내체납처분비 */
private long inDueChenapAmt;
/** 납기후기한 */
private String overdueDate;
/** 납기후금액 */
private long overdueAmt;
/** 납기후가산금 */
private long overdueAddedAmt;
/** 납기후체납처분금 */
private long overdueChenapAmt;
/** 차량번호 */
private String vhrno;
/** 생년월일 */
private String birthday;
/** 출력일자 */
private String printDate;
/** 출력년도 */
private String printYear;
/** 출력월 */
private String printMonth;
/** 출력일 */
private String printDay;
/** 증거번호 */
private String evidenceNo;
/** 첨부파일수 */
private int attachmentCount;
/** 첨부파일1 */
private String attachment1;
/** 첨부파일2 */
private String attachment2;
/** 첨부파일3 */
private String attachment3;
/** 첨부파일4 */
private String attachment4;
/** 가변제목 */
private String variableTitle;
/** 가변1 */
private String variableContent1;
/** 가변2 */
@ -181,24 +244,20 @@ public class PstMsr extends AbstractComponent {
/** 가변4 */
private String variableContent4;
/** .
* @return
*/
protected List<String> toRow() {
return List.of(new String[] {
blankIfEmpty(seq),
blankIfEmpty(name),
blankIfEmpty(zipcode),
blankIfEmpty(address),
blankIfEmpty(detailAddress),
blankIfEmpty(phoneNo),
blankIfEmpty(attachment),
blankIfEmpty(variableContent1),
blankIfEmpty(variableContent2),
blankIfEmpty(variableContent3),
blankIfEmpty(variableContent4)
});
}
/** 가상계좌번호2 */
private String vaccountNo2;
/** 가상계좌번호3 */
private String vaccountNo3;
/** 가상계좌번호4 */
private String vaccountNo4;
/** 가상계좌번호5 */
private String vaccountNo5;
/** 가상계좌번호6 */
private String vaccountNo6;
/** 가상계좌번호7 */
private String vaccountNo7;
/** 가상계좌번호8 */
private String vaccountNo8;
}
/** {@code Named<InputStream>} .
@ -213,10 +272,32 @@ public class PstMsr extends AbstractComponent {
}
}
private String apiName;
private Master master;
private List<Detail> details;
private Map<String, InputStream> attachments;
private PostResponse result;
private ValueMapper valueMapper;
public String getApiName() {
return apiName;
}
public PstMsr setApiName(String apiName) {
this.apiName = apiName;
return this;
}
public PstMsr setIntfID(String intfID) {
if (master != null)
master.setIntfID(intfID);
if (!isEmpty(details))
details.forEach(detail -> detail.setIntfID(intfID));
return this;
}
public Master getMaster() {
return master;
}
@ -251,13 +332,39 @@ public class PstMsr extends AbstractComponent {
return this;
}
public Map<String, InputStream> getAttachments() {
return attachments;
}
public PstMsr setAttachments(Map<String, InputStream> attachments) {
this.attachments = attachments;
return this;
}
public PstMsr setValueMapper(ValueMapper mapper) {
valueMapper = mapper;
return this;
}
/** .
* @return
*/
public DataObject toRequest() {
Api api = Postplus.get().api(apiName);
if (valueMapper == null)
valueMapper = ValueMapper.create(api.getValueMapper());
ValueMapper.Reader<Master> masterReader = valueMapper.getMasterReader();
DataObject masterInfo = new DataObject()
.set("cols", masterReader.getCols())
.set("rows", masterReader.getRow(master));
ValueMapper.Reader<Detail> detailReader = valueMapper.getDetailReader();
DataObject detailInfo = new DataObject()
.set("cols", detailReader.getCols())
.set("rows", detailReader.getRows(details));
return new DataObject()
.set("master", master.toRequest())
.set("detail", Detail.toRequest(details));
.set("master", masterInfo)
.set("detail", detailInfo);
}
public PostResponse getResult() {

@ -0,0 +1,92 @@
package cokr.xit.interfaces.postplus.post;
import cokr.xit.foundation.AbstractEntity;
import lombok.Getter;
import lombok.Setter;
/** 릿
* <ul><li>id - 릿</li>
* <li>noticeGb - </li>
* <li>envelop - </li>
* <li>envelopWindow - </li>
* <li>bwColor - </li>
* <li>faceType - </li>
* <li>delivery - ( )</li>
* <li>templatePrint - 릿</li>
* <li>marginYN - </li>
* <li>addressPageYN - </li>
* <li>alignYN - </li>
* <li>mailMergeYN - </li>
* <li>enclosureYN - </li>
* <li>returnYN - </li>
* <li>staplerYN - </li>
* <li>logoFile - </li>
* <li>createdAt - </li>
* <li>creadedBy - </li>
* <li>useYn - </li>
* </ul>
* @author mjkhan
*/
@Getter
@Setter
public class PstTemplate extends AbstractEntity {
/** 템플릿코드 */
private String id;
/** 고지서구분 */
private String noticeGb;
/** 봉투 */
private String envelop;
/** 봉투창 */
private String envelopWindow;
/** 흑백칼라 */
private String bwColor;
/** 단면양면 */
private String faceType;
/** 배달(일반, 등기, 선택등기) */
private String delivery;
/** 템플릿출력여부 */
private String templatePrint;
/** 여백생성유무 */
private String marginYN;
/** 주소페이지유무 */
private String addressPageYN;
/** 맞춤자제유무 */
private String alignYN;
/** 메일머지유무 */
private String mailMergeYN;
/** 동봉물유무 */
private String enclosureYN;
/** 반송여부 */
private String returnYN;
/** 스테이플러유무 */
private String staplerYN;
/** 로고파일 */
private String logoFile;
/** 등록일시 */
private String createdAt;
/** 등록사용자 */
private String creadedBy;
/** 사용여부 */
private String useYn;
/** 릿 .
* @param master
*/
public void setInfo(PstMsr.Master master) {
master.setNoticeGb(noticeGb); // 고지서구분
master.setEnvelop(envelop); // 봉투
master.setEnvelopWindow(envelopWindow); // 봉투창
master.setBwColor(bwColor); // 흑백칼라
master.setFaceType(faceType); // 단면양면
master.setDelivery(delivery); // 배달(일반, 등기, 선택등기)
master.setTemplatePrint(templatePrint); // 템플릿출력여부
master.setMarginYN(marginYN); // 여백생성유무
master.setAddressPageYN(addressPageYN); // 주소페이지유무
master.setAlignYN(alignYN); // 맞춤자제유무
master.setMailMergeYN(mailMergeYN); // 메일머지유무
master.setEnclosureYN(enclosureYN); // 동봉물유무
master.setReturnYN(returnYN); // 반송여부
master.setStaplerYN(staplerYN); // 스테이플러유무
master.setLogoFile(logoFile); // 로고파일
}
}

@ -0,0 +1,185 @@
package cokr.xit.interfaces.postplus.post;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Stream;
import cokr.xit.foundation.AbstractObject;
public class ValueMapper extends AbstractObject {
public static final ValueMapper create(String className) {
if (isEmpty(className))
return new ValueMapper();
try {
Class<?> klass = Class.forName(className);
return (ValueMapper)klass.getConstructor().newInstance();
} catch (Exception e) {
throw runtimeException(e);
}
}
protected Reader<PstMsr.Master> masterReader;
protected Reader<PstMsr.Detail> detailReader;
public Reader<PstMsr.Master> getMasterReader() {
return ifEmpty(masterReader, masterReader = masterReader());
}
public ValueMapper setMasterReader(Reader<PstMsr.Master> reader) {
masterReader = reader;
return this;
}
public Reader<PstMsr.Detail> getDetailReader() {
return ifEmpty(detailReader, detailReader = detailReader());
}
public ValueMapper setDetailReader(Reader<PstMsr.Detail> reader) {
detailReader = reader;
return this;
}
public static class Reader<T> {
private LinkedHashMap<String, Function<T, String>> getters;
public Reader<T> add(String col, Function<T, String> getter) {
if (getters == null)
getters = new LinkedHashMap<>();
getters.put(col, getter);
return this;
}
public Reader<T> remove(String... cols) {
if (!isEmpty(getters))
Stream.of(cols).forEach(getters::remove);
return this;
}
public List<String> getCols() {
return isEmpty(getters) ?
Collections.emptyList():
getters.keySet().stream().toList();
}
public List<String> getRow(T t) {
return isEmpty(getters) || isEmpty(t) ?
Collections.emptyList():
getters.values().stream()
.map(getter -> getter.apply(t))
.toList();
}
public List<List<String>> getRows(List<T> list) {
return isEmpty(list) ?
Collections.emptyList():
list.stream()
.map(this::getRow)
.toList();
}
}
public static final Reader<PstMsr.Master> masterReader() {
return new Reader<PstMsr.Master>()
.add("버전", PstMsr.Master::getVersion)
.add("테스트여부", PstMsr.Master::getTestYN)
.add("서비스", PstMsr.Master::getService)
.add("연계식별키", PstMsr.Master::getIntfID)
.add("봉투", PstMsr.Master::getEnvelop)
.add("봉투창", PstMsr.Master::getEnvelopWindow)
.add("흑백칼라", PstMsr.Master::getBwColor)
.add("단면양면", PstMsr.Master::getFaceType)
.add("배달", PstMsr.Master::getDelivery)
.add("템플릿코드", PstMsr.Master::getTemplateCode)
.add("템플릿출력여부", PstMsr.Master::getTemplatePrint)
.add("수취인수", PstMsr.Master::getRecipientCount)
.add("여백생성유무", PstMsr.Master::getMarginYN)
.add("주소페이지유무", PstMsr.Master::getAddressPageYN)
.add("맞춤자제유무", PstMsr.Master::getAlignYN)
.add("메일머지유무", PstMsr.Master::getMailMergeYN)
.add("동봉물유무", PstMsr.Master::getEnclosureYN)
.add("반송여부", PstMsr.Master::getReturnYN)
.add("스테이플러유무", PstMsr.Master::getStaplerYN)
.add("로고파일", PstMsr.Master::getLogoFile)
.add("발송인명", PstMsr.Master::getSenderName)
.add("발송인우편번호", PstMsr.Master::getSenderZipcode)
.add("발송인주소", PstMsr.Master::getSenderAddress)
.add("발송인상세주소", PstMsr.Master::getSenderDetailAddress)
.add("발송인전화번호", PstMsr.Master::getSenderPhoneNo)
.add("발송인전자우편", PstMsr.Master::getSenderEmail)
.add("발송시군구명", PstMsr.Master::getSenderSigungu);
}
public static final Reader<PstMsr.Detail> detailReader() {
return new Reader<PstMsr.Detail>()
.add("순번", PstMsr.Detail::getSeq)
.add("이름", PstMsr.Detail::getName)
.add("우편번호", PstMsr.Detail::getZipcode)
.add("주소", PstMsr.Detail::getAddress)
.add("상세주소", PstMsr.Detail::getDetailAddress)
.add("전화번호", PstMsr.Detail::getPhoneNo)
.add("등기구분", PstMsr.Detail::getRegGb)
.add("일련번호", PstMsr.Detail::getSerNo)
.add("발송코드", PstMsr.Detail::getDeliveryCd)
.add("바코드1", PstMsr.Detail::getBar1D)
.add("바코드2", PstMsr.Detail::getBar2D)
.add("고지번호", PstMsr.Detail::getNoticeNo)
.add("문서종류1", PstMsr.Detail::getDocCd1)
.add("문서종류2", PstMsr.Detail::getDocCd2)
.add("문서종류3", PstMsr.Detail::getDocCd3)
.add("문서종류4", PstMsr.Detail::getDocCd4)
.add("문서종류5", PstMsr.Detail::getDocCd5)
.add("과목명1", PstMsr.Detail::getSubject1)
.add("과목명2", PstMsr.Detail::getSubject2)
.add("과목명3", PstMsr.Detail::getSubject3)
.add("위반일시", PstMsr.Detail::getViolationDatetime)
.add("위반동", PstMsr.Detail::getViolationDong)
.add("위반장소", PstMsr.Detail::getViolationLocation)
.add("법조항", PstMsr.Detail::getLegalBasis)
.add("납부번호1", PstMsr.Detail::getPaymentNo1)
.add("납부번호2", PstMsr.Detail::getPaymentNo2)
.add("OCR0", PstMsr.Detail::getOcr0)
.add("OCR1", PstMsr.Detail::getOcr1)
.add("OCR2", PstMsr.Detail::getOcr2)
.add("전자납부번호", PstMsr.Detail::getEpaymentNo)
.add("가상계좌번호", PstMsr.Detail::getVaccountNo)
.add("과태료", detail -> Long.toString(detail.getFineAmt()))
.add("납부금액",detail -> Long.toString(detail.getPaymentAmt()))
.add("납부기한", PstMsr.Detail::getDueDate)
.add("납기내기한", PstMsr.Detail::getInDueDate)
.add("납기내금액", detail -> Long.toString(detail.getInDueAmt()))
.add("납기내가산금", detail -> Long.toString(detail.getInDueAddedAmt()))
.add("납기내체납처분비", detail -> Long.toString(detail.getInDueChenapAmt()))
.add("납기후기한", PstMsr.Detail::getOverdueDate)
.add("납기후금액", detail -> Long.toString(detail.getOverdueAmt()))
.add("납기후가산금", detail -> Long.toString(detail.getOverdueAddedAmt()))
.add("납기후체납처분비", detail -> Long.toString(detail.getOverdueChenapAmt()))
.add("차량번호", PstMsr.Detail::getVhrno)
.add("주민번호(생년월일)", PstMsr.Detail::getBirthday)
.add("출력일자", PstMsr.Detail::getPrintDate)
.add("출력년도", PstMsr.Detail::getPrintYear)
.add("출력월", PstMsr.Detail::getPrintMonth)
.add("출력일", PstMsr.Detail::getPrintDay)
.add("증거번호", PstMsr.Detail::getEvidenceNo)
.add("이미지갯수", detail -> Integer.toString(detail.getAttachmentCount()))
.add("이미지1", PstMsr.Detail::getAttachment1)
.add("이미지2", PstMsr.Detail::getAttachment2)
.add("이미지3", PstMsr.Detail::getAttachment3)
.add("이미지4", PstMsr.Detail::getAttachment4)
.add("가변제목", PstMsr.Detail::getVariableTitle)
.add("가변내용1", PstMsr.Detail::getVariableContent1)
.add("가변내용2", PstMsr.Detail::getVariableContent2)
.add("가변내용3", PstMsr.Detail::getVariableContent3)
.add("가변내용4", PstMsr.Detail::getVariableContent4)
.add("가상계좌번호2", PstMsr.Detail::getVaccountNo2)
.add("가상계좌번호3", PstMsr.Detail::getVaccountNo3)
.add("가상계좌번호4", PstMsr.Detail::getVaccountNo4)
.add("가상계좌번호5", PstMsr.Detail::getVaccountNo5)
.add("가상계좌번호6", PstMsr.Detail::getVaccountNo6)
.add("가상계좌번호7", PstMsr.Detail::getVaccountNo7)
.add("가상계좌번호8", PstMsr.Detail::getVaccountNo8);
}
}

@ -1,13 +1,59 @@
package cokr.xit.interfaces.postplus.post.dao;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import org.egovframe.rte.psl.dataaccess.mapper.Mapper;
import cokr.xit.foundation.component.AbstractMapper;
import cokr.xit.foundation.data.DataObject;
import cokr.xit.interfaces.postplus.post.PostplusRequest;
import cokr.xit.interfaces.postplus.post.PstMsr;
import cokr.xit.interfaces.postplus.post.PstTemplate;
import cokr.xit.interfaces.postplus.post.service.StatusResponse;
@Mapper("postplusMapper")
public interface PostplusMapper extends AbstractMapper {
List<DataObject> selectTemplateList(PostplusRequest req);
default List<DataObject> selectTemplateList(List<String> templateIDs) {
return selectTemplateList(new PostplusRequest().setTemplateIDs(templateIDs));
}
default DataObject selectTemplateInfo(String templateID) {
List<DataObject> list = !isEmpty(templateID) ?
selectTemplateList(List.of(templateID)) :
Collections.emptyList();
return !list.isEmpty() ? list.get(0) : null;
}
List<PstTemplate> selectTemplates(PostplusRequest req);
default List<PstTemplate> selectTemplates(List<String> templateIDs) {
return selectTemplates(new PostplusRequest().setTemplateIDs(templateIDs));
}
default PstTemplate selectTemplate(String templateID) {
List<PstTemplate> list = !isEmpty(templateID) ?
selectTemplates(List.of(templateID)) :
Collections.emptyList();
return !list.isEmpty() ? list.get(0) : null;
}
int insertTemplate(DataObject params);
default int insert(PstTemplate template) {
return insertTemplate(params().set("tmplt", template));
}
int updateTemplate(PstTemplate template);
int removeTemplates(List<String> templateIDs);
List<PstMsr.Master> selectMasters(Iterable<String> intfIDs);
DataObject selectNewIntfID(DataObject params);
default String newIntfID() {
@ -17,26 +63,90 @@ public interface PostplusMapper extends AbstractMapper {
int insertMaster(DataObject params);
int insertDetail(DataObject params);
int updateMaster(DataObject params);
default int insert(PstMsr.Master master) {
return insertMaster(
params().set("obj", master)
);
}
int deleteMasters(List<String> intfIDs);
List<PstMsr.Detail> selectDetails(Iterable<String> intfIDs);
int insertDetail(PstMsr.Detail detail);
default int insert(Iterable<PstMsr.Detail> details) {
default int insertDetails(Iterable<PstMsr.Detail> details) {
if (isEmpty(details)) return 0;
int affected = 0;
DataObject params = params();
for (PstMsr.Detail detail: details) {
affected += insertDetail(detail);
}
return affected;
}
int updateDetail(PstMsr.Detail detail);
default int updateDetails(Iterable<PstMsr.Detail> details) {
if (isEmpty(details)) return 0;
int affected = 0;
for (PstMsr.Detail detail: details) {
affected += insertDetail(
params.set("obj", detail)
);
affected += updateDetail(detail);
}
return affected;
}
default List<PstMsr> selectPstMsrs(Iterable<String> intfIDs) {
List<PstMsr.Master> masters = selectMasters(intfIDs);
if (masters.isEmpty())
return Collections.emptyList();
Map<String, List<PstMsr.Detail>> details = selectDetails(intfIDs).stream().collect(
Collectors.groupingBy(PstMsr.Detail::getIntfID)
);
return masters.stream()
.map(master -> new PstMsr()
.setMaster(master)
.setDetails(details.get(master.getIntfID()))
)
.toList();
}
default PstMsr selectPstMsr(String intfID) {
List<PstMsr> pstMsrs = selectPstMsrs(List.of(intfID));
return !pstMsrs.isEmpty() ? pstMsrs.get(0) : null;
}
default int insert(PstMsr pstMsr) {
return
insertMaster(
params()
.set("mst", pstMsr.getMaster())
.set("result", pstMsr.getResult())
)
+ insertDetails(pstMsr.getDetails());
}
default int update(StatusResponse resp) {
PstMsr pstMsr = selectPstMsr(resp.getIntfID());
if (pstMsr == null)
return 0;
resp.update(pstMsr);
return
updateMaster(new DataObject()
.set("mst", pstMsr.getMaster())
.set("result", resp)
)
+ updateDetails(pstMsr.getDetails());
}
int deleteDetails(List<String> intfIDs);
default int delete(List<String> intfIDs) {
return
deleteDetails(intfIDs)
+ deleteMasters(intfIDs);
}
}

@ -1,29 +1,46 @@
package cokr.xit.interfaces.postplus.post.service;
import java.io.InputStream;
import java.util.List;
import java.util.Map;
import cokr.xit.foundation.data.DataObject;
import cokr.xit.interfaces.postplus.post.PostResponse;
import cokr.xit.interfaces.postplus.post.PostplusRequest;
import cokr.xit.interfaces.postplus.post.PstMsr;
import cokr.xit.interfaces.postplus.post.PstTemplate;
/**
* @author mjkhan
*/
public interface PostplusService {
List<DataObject> getTemplateList(PostplusRequest req);
DataObject getTemplateInfo(String templateID);
List<PstTemplate> getTemplates(PostplusRequest req);
PstTemplate getTemplate(String templateID);
int insert(PstTemplate template);
int update(PstTemplate template);
int removeTemplates(List<String> templateIDs);
List<PstMsr> getPstMsrs(List<String> intfIDs);
/** .
* @param apiID apiKey
* @param master
* @param details
* @param attachments
* @param pstMsr
* @return
*/
PostResponse requestProduction(String apiID, PstMsr.Master master, List<PstMsr.Detail> details, Map<String, InputStream> attachments);
PostResponse requestProduction(PstMsr pstMsr);
/** .
* @param apiID apiKey
/** .
* @param apiName apiKey
* @param intfID
* @return
*/
List<StatusResponse> getProductionStatus(String apiID, String intfID);
StatusResponse updateProductionStatus(String apiName, String intfID);
void updateProductionStatus();
int delete(List<String> intfIDs);
}

@ -2,15 +2,19 @@ package cokr.xit.interfaces.postplus.post.service;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import com.fasterxml.jackson.annotation.JsonProperty;
import cokr.xit.interfaces.postplus.post.PostResponse;
import cokr.xit.interfaces.postplus.post.PstMsr;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;
@Getter
@Setter
@Accessors(chain = true)
public class StatusResponse extends PostResponse {
@JsonProperty("신청일자")
private String reqDate;
@ -33,5 +37,33 @@ public class StatusResponse extends PostResponse {
@JsonProperty("연계식별키")
private String intfID;
@JsonProperty("순번등기번호")
private List<Map<String, String>> sortedRegNos;
private List<Map<String, String>> regNos;
public void update(PstMsr pstMsr) {
update(pstMsr.getMaster());
if (regNos == null) return;
Map<String, String> bySeq = regNos.stream()
.flatMap(map -> map.entrySet().stream())
.collect(Collectors.toMap(
entry -> entry.getKey(),
entry -> entry.getValue()
));
for (PstMsr.Detail detail: pstMsr.getDetails()) {
String regNo = bySeq.get(detail.getSeq());
detail.setRegNo(regNo); // 등기번호 업데이트
}
}
private void update(PstMsr.Master master) {
// ? <- 신청일자
master.setEnvelop(envelop);
master.setDelivery(delivery);
master.setBwColor(bwColor);
master.setFaceType(faceType);
// ? <- 발송건수
master.setPostProgress(status);
// TODO: 상태코드 정의 필요
master.setStatus(null);
}
}

@ -12,35 +12,71 @@ import javax.annotation.Resource;
import org.springframework.stereotype.Service;
import com.fasterxml.jackson.core.type.TypeReference;
import cokr.xit.base.file.ZIP;
import cokr.xit.foundation.component.AbstractServiceBean;
import cokr.xit.foundation.component.ScheduledServiceBean;
import cokr.xit.foundation.data.DataObject;
import cokr.xit.foundation.data.JSON;
import cokr.xit.foundation.web.WebClient;
import cokr.xit.interfaces.postplus.Postplus;
import cokr.xit.interfaces.postplus.post.PostResponse;
import cokr.xit.interfaces.postplus.post.PostplusRequest;
import cokr.xit.interfaces.postplus.post.PstMsr;
import cokr.xit.interfaces.postplus.post.PstTemplate;
import cokr.xit.interfaces.postplus.post.dao.PostplusMapper;
import cokr.xit.interfaces.postplus.post.service.PostplusService;
import cokr.xit.interfaces.postplus.post.service.StatusResponse;
@Service("postplusService")
public class PostplusServiceBean extends AbstractServiceBean implements PostplusService {
private static String apiKey(String apiID) {
return Postplus.get().apiKey(apiID);
}
public class PostplusServiceBean extends ScheduledServiceBean implements PostplusService {
private static final Postplus conf = Postplus.get();
private JSON json = new JSON();
@Resource(name = "postplusMapper")
private PostplusMapper postplusMapper;
@Override
public PostResponse requestProduction(String apiID, PstMsr.Master master, List<PstMsr.Detail> details, Map<String, InputStream> attachments) {
PstMsr pstMsr = new PstMsr()
.setMaster(master.setIntfID(postplusMapper.newIntfID()))
.setDetails(details);
public List<DataObject> getTemplateList(PostplusRequest req) {
return postplusMapper.selectTemplateList(req);
}
@Override
public DataObject getTemplateInfo(String templateID) {
return postplusMapper.selectTemplateInfo(templateID);
}
@Override
public List<PstTemplate> getTemplates(PostplusRequest req) {
return postplusMapper.selectTemplates(req);
}
@Override
public PstTemplate getTemplate(String templateID) {
return postplusMapper.selectTemplate(templateID);
}
@Override
public int insert(PstTemplate template) {
return postplusMapper.insert(template);
}
@Override
public int update(PstTemplate template) {
return postplusMapper.updateTemplate(template);
}
@Override
public int removeTemplates(List<String> templateIDs) {
return postplusMapper.removeTemplates(templateIDs);
}
@Override
public List<PstMsr> getPstMsrs(List<String> intfIDs) {
return postplusMapper.selectPstMsrs(intfIDs);
}
@Override
public PostResponse requestProduction(PstMsr pstMsr) {
pstMsr.setIntfID(postplusMapper.newIntfID());
String tmpdir = System.getProperty("java.io.tmpdir"),
filepath = tmpdir + "/pstFile.json",
str = json.stringify(pstMsr.toRequest(), true);
@ -52,47 +88,75 @@ public class PostplusServiceBean extends AbstractServiceBean implements Postplus
throw runtimeException(e);
}
File file = new File(filepath);
Map<String, InputStream> attachments = pstMsr.getAttachments();
File zipped = !isEmpty(attachments) ? new ZIP().compress(filepath = tmpdir + "/pstFile.zip", attachments) : null;
try {
HttpResponse<String> hresp = new WebClient().upload(req ->
req.uri(Postplus.get().requestProductionURL())
.data("apiKey", apiKey(apiID))
.data("pstFile", List.of(file, zipped))
// .data("jsonFile", file)
// .data("pstFile", zipped)
HttpResponse<String> hresp = !conf.getSendRequest() ? null:
new WebClient().upload(req ->
req.uri(conf.requestProductionURL())
.data("apiKey", conf.api(pstMsr.getApiName()).getKey())
.data("pstFile", zipped != null ? List.of(file, zipped) : List.of(file))
/*
.data("jsonFile", file)
.data("pstFile", zipped)
*/
);
String body = hresp.body();
log().debug("response:\n{}", body);
PostResponse result = json.parse(body, PostResponse.class);
pstMsr.setResult(result);
PostResponse result = null;
if (hresp != null) {
String body = hresp.body();
log().debug("response:\n{}", body);
result = json.parse(body, PostResponse.class);
pstMsr.setResult(result);
}
logProductionRequest(pstMsr);
return result;
return ifEmpty(result, PostResponse::new);
} finally {
file.delete();
zipped.delete();
if (file != null && file.exists())
file.delete();
if (zipped != null && zipped.exists())
zipped.delete();
}
}
private void logProductionRequest(PstMsr pstMsr) {
postplusMapper.insert(pstMsr.getMaster());
postplusMapper.insert(pstMsr.getDetails());
if (!conf.getLogTable()) return;
postplusMapper.insert(pstMsr);
}
@Override
public List<StatusResponse> getProductionStatus(String apiID, String intfID) {
public StatusResponse updateProductionStatus(String apiName, String intfID) {
HttpResponse<String> hresp = new WebClient().post(req ->
req.uri(Postplus.get().productionStatusURL())
req.uri(conf.productionStatusURL())
.json(json)
.data("apiKey", apiKey(apiID))
.data("apiKey", conf.api(apiName).getKey())
.data("inputCode", intfID)
);
String body = hresp.body();
log().debug("response:\n{}", body);
return json.parse(body, new TypeReference<List<StatusResponse>>() {});
StatusResponse resp = json.parse(body, StatusResponse.class);
logProductionStatus(resp);
return resp;
}
private void logProductionStatus(StatusResponse resp) {
if (!conf.getLogTable() || !resp.success()) return;
postplusMapper.update(resp);
}
@Override
public void updateProductionStatus() {
}
@Override
public int delete(List<String> intfIDs) {
return postplusMapper.delete(intfIDs);
}
}

@ -48,16 +48,31 @@ public class PostplusController extends AbstractController {
}
}
));
return postplusService.requestProduction(apiID, master, details, fileMap);
try {
PstMsr pstMsr = new PstMsr()
.setApiName(apiID)
.setMaster(master)
.setDetails(details)
.setAttachments(fileMap);
return postplusService.requestProduction(pstMsr);
} finally {
fileMap.values().forEach(input -> {
try {
input.close();
} catch (Exception e) {
throw runtimeException(e);
}
});
}
}
/** .
* @param apiID apiKey
* @param apiName apiKey
* @param intfID
* @return
*/
@PostMapping(name = "신청우편 상태 조회", value = "/status")
public List<StatusResponse> getProductionStatus(String apiID, String intfID) {
return postplusService.getProductionStatus(apiID, intfID);
public StatusResponse getProductionStatus(String apiName, String intfID) {
return postplusService.updateProductionStatus(apiName, intfID);
}
}

@ -1,13 +1,20 @@
{
"host": "https://t.postplus.co.kr", /* API 서비스 호스트 */
"version": "v1.10",
"logTable": true,
/* API 키 */
"apiKeys": {
"site0": "00197D16F7FE4A84E9C97F55033339FBE07C8850882FFA26F3E538E0DDF0DB1EFEEC3DB451AE1EE011776DEB1505120A556942FA98240AADD3A73F085313AF693545931B338D1B92365F5B1A8AEBC939E33"
}
"host": "https://t.postplus.co.kr", // API 서비스 호스트
"version": "v1.10", // 서비스 버젼
"sendRequest": false, // 서비스 실제 호출 여부
"apis": [ // 사용기관별 서비스 호출 시 설정
{
"name": "default",
"key": "00197D16F7FE4A84E9C97F55033339FBE07C8850882FFA26F3E538E0DDF0DB1EFEEC3DB451AE1EE011776DEB1505120A556942FA98240AADD3A73F085313AF693545931B338D1B92365F5B1A8AEBC939E33",
"systemCode": ""
}
]
/*
, "test": true
"valueMapper": "cokr.xit.interfaces.postplus.post.ValueMapper" // apis <- valueMapper 클래스 이름
"test": true, // 테스트 여부
"logTable": false, // 요청 결과 테이블 저장 여부
"urls": { // 지정하지 않으면 디폴트 URL 사용
"requestProduction": "우편제작 신청 URL",
"productionStatus": "신청우편 상태조회 URL"

@ -6,115 +6,701 @@
========== 변경 이력 ==========
2023-09-05 mjkhan 최초 작성
============================ -->
<resultMap id="templateRow" type="cokr.xit.interfaces.postplus.post.PstTemplate"><!-- 제작신청 템플릿 설정 -->
<result property="id" column="TMPLT_CD" /> <!-- 템플릿코드 -->
<result property="noticeGb" column="NOTICE_GB" /> <!-- 고지서구분 -->
<result property="envelop" column="NVLP" /> <!-- 봉투 -->
<result property="envelopWindow" column="NVLP_WND" /> <!-- 봉투창 -->
<result property="bwColor" column="BW_COLOR" /> <!-- 흑백칼라 -->
<result property="faceType" column="FACE_TYPE" /> <!-- 단면양면 -->
<result property="delivery" column="DLVR_TYPE" /> <!-- 배달(일반, 등기, 선택등기) -->
<result property="templatePrint" column="TMPLT_PRINT_YN" /> <!-- 템플릿출력여부 -->
<result property="marginYN" column="MARGIN_YN" /> <!-- 여백생성유무 -->
<result property="addressPageYN" column="ADDR_PAGE_YN" /> <!-- 주소페이지유무 -->
<result property="alignYN" column="ALIGN_YN" /> <!-- 맞춤자제유무 -->
<result property="mailMergeYN" column="MAIL_MERGE_YN" /> <!-- 메일머지유무 -->
<result property="enclosureYN" column="ENCL_YN" /> <!-- 동봉물유무 -->
<result property="returnYN" column="RETURN_YN" /> <!-- 반송여부 -->
<result property="staplerYN" column="STAPLER_YN" /> <!-- 스테이플러유무 -->
<result property="logoFile" column="LOGO_FILE" /> <!-- 로고파일 -->
<result property="createdAt" column="REG_DT" /> <!-- 제작상태 -->
<result property="creadedBy" column="RGTR" /> <!-- 제작상태 확인일시 -->
<result property="useYn" column="USE_YN" /> <!-- 사용여부 -->
</resultMap>
<sql id="selectTmpls">
SELECT TMPLT_CD <!-- 템플릿코드 -->
, NOTICE_GB <!-- 고지서구분 -->
, NVLP <!-- 봉투 -->
, NVLP_WND <!-- 봉투창 -->
, BW_COLOR <!-- 흑백칼라 -->
, FACE_TYPE <!-- 단면양면 -->
, DLVR_TYPE <!-- 배달(일반, 등기, 선택등기) -->
, TMPLT_PRINT_YN <!-- 템플릿출력여부 -->
, MARGIN_YN <!-- 여백생성유무 -->
, ADDR_PAGE_YN <!-- 주소페이지유무 -->
, ALIGN_YN <!-- 맞춤자제유무 -->
, MAIL_MERGE_YN <!-- 메일머지유무 -->
, ENCL_YN <!-- 동봉물유무 -->
, RETURN_YN <!-- 반송여부 -->
, STAPLER_YN <!-- 스테이플러유무 -->
, LOGO_FILE <!-- 로고파일 -->
, REG_DT <!-- 등록일시 -->
, RGTR <!-- 등록사용자 -->
, USE_YN <!-- 사용여부 -->
FROM TB_PST_TMPLT
<where><if test='templateIDs != null'>AND TMPLT_CD IN (<foreach collection="templateIDs" item="id" separator=",">#{id}</foreach>)</if>
AND USE_YN = 'Y'
</where></sql>
<select id="selectTemplateList" parameterType="map" resultType="dataobject">/* 제작신청 템플릿정보 목록 조회(PostplusMapper.selectTemplateList) */
<include refid="utility.paging-prefix"/>
<include refid="selectTmpls" />
<include refid="utility.orderBy"/>
<include refid="utility.paging-suffix"/></select>
<select id="selectTemplates" parameterType="map" resultType="templateRow">/* 제작신청 템플릿객체 조회(PostplusMapper.selectTemplates) */
<include refid="selectTmpls" /></select>
<insert id="insertTemlate" parameterMap="map">/* 제작신청 템플릿 등록(PostplusMapper.insertTemplate) */
INSERT INTO TB_PST_TMPLT (
TMPLT_CD <!-- 템플릿코드 -->
, NOTICE_GB <!-- 고지서구분 -->
, NVLP <!-- 봉투 -->
, NVLP_WND <!-- 봉투창 -->
, BW_COLOR <!-- 흑백칼라 -->
, FACE_TYPE <!-- 단면양면 -->
, DLVR_TYPE <!-- 배달(일반, 등기, 선택등기) -->
, TMPLT_PRINT_YN <!-- 템플릿출력여부 -->
, MARGIN_YN <!-- 여백생성유무 -->
, ADDR_PAGE_YN <!-- 주소페이지유무 -->
, ALIGN_YN <!-- 맞춤자제유무 -->
, MAIL_MERGE_YN <!-- 메일머지유무 -->
, ENCL_YN <!-- 동봉물유무 -->
, RETURN_YN <!-- 반송여부 -->
, STAPLER_YN <!-- 스테이플러유무 -->
, LOGO_FILE <!-- 로고파일 -->
, REG_DT <!-- 등록일시 -->
, RGTR <!-- 등록사용자 -->
, USE_YN <!-- 사용여부 -->
) VALUES (
#{tmplt.id} <!-- 템플릿코드 -->
, #{tmplt.noticeGb} <!-- 고지서구분 -->
, #{tmplt.envelop} <!-- 봉투 -->
, #{tmplt.envelopWindow} <!-- 봉투창 -->
, #{tmplt.bwColor} <!-- 흑백칼라 -->
, #{tmplt.faceType} <!-- 단면양면 -->
, #{tmplt.delivery} <!-- 배달(일반, 등기, 선택등기) -->
, #{tmplt.templatePrint} <!-- 템플릿출력여부 -->
, #{tmplt.marginYN} <!-- 여백생성유무 -->
, #{tmplt.addressPageYN} <!-- 주소페이지유무 -->
, #{tmplt.alignYN} <!-- 맞춤자제유무 -->
, #{tmplt.mailMergeYN} <!-- 메일머지유무 -->
, #{tmplt.enclosureYN} <!-- 동봉물유무 -->
, #{tmplt.returnYN} <!-- 반송여부 -->
, #{tmplt.staplerYN} <!-- 스테이플러유무 -->
, #{tmplt.logoFile} <!-- 로고파일 -->
,<include refid="utility.now" /><!-- 등록일시 -->
, #{currentUser.id} <!-- 등록사용자 -->
, 'Y' <!-- 사용여부 -->
)</insert>
<update id="updateTemplate" parameterMap="templateRow">/* 제작신청 템플릿 수정(PostplusMapper.updateTemplate) */
UPDATE TB_PST_TMPLT
SET NOTICE_GB = {#noticeGb} <!--고지서구분 -->
, NVLP = {#envelop} <!--봉투 -->
, NVLP_WND = {#envelopWindow} <!--봉투창 -->
, BW_COLOR = {#bwColor} <!--흑백칼라 -->
, FACE_TYPE = {#faceType} <!--단면양면 -->
, DLVR_TYPE = {#delivery} <!--배달(일반, 등기, 선택등기) -->
, TMPLT_PRINT_YN = {#templatePrint} <!--템플릿출력여부 -->
, MARGIN_YN = {#marginYN} <!--여백생성유무 -->
, ADDR_PAGE_YN = {#addressPageYN} <!--주소페이지유무 -->
, ALIGN_YN = {#alignYN} <!--맞춤자제유무 -->
, MAIL_MERGE_YN = {#mailMergeYN} <!--메일머지유무 -->
, ENCL_YN = {#enclosureYN} <!--동봉물유무 -->
, RETURN_YN = {#returnYN} <!--반송여부 -->
, STAPLER_YN = {#staplerYN} <!--스테이플러유무 -->
, LOGO_FILE = {#logoFile} <!--로고파일 -->
WHERE TMPLT_CD = {#id}</update>
<update id="removeTemplates" parameterType="list">/* 제작신청 템플릿 제거(PostplusMapper.removeTemplates) */
UPDATE TB_PST_TMPLT
SET USE_YN = 'N'
WHERE TMPLT_CD IN (<foreach collection="list" item="id" separator=",">#{id}</foreach>)
AND USE_YN != 'N'</update>
<resultMap id="masterRow" type="cokr.xit.interfaces.postplus.post.PstMsr$Master"><!-- 제작신청 마스터 -->
<result property="intfID" column="INTF_ID" /> <!-- 연계식별키 -->
<result property="version" column="VERSION" /> <!-- 버전 -->
<result property="testYN" column="TEST_YN" /> <!-- 테스트여부 -->
<result property="service" column="SERVICE" /> <!-- 서비스 -->
<result property="systemCd" column="SYSTEM_CD" /> <!-- 시스템구분 -->
<result property="sndngId" column="SNDNG_ID" /> <!-- 발송ID -->
<result property="noticeGb" column="NOTICE_GB" /> <!-- 고지서구분 -->
<result property="envelop" column="NVLP" /> <!-- 봉투 -->
<result property="envelopWindow" column="NVLP_WND" /> <!-- 봉투창 -->
<result property="bwColor" column="BW_COLOR" /> <!-- 흑백칼라 -->
<result property="faceType" column="FACE_TYPE" /> <!-- 단면양면 -->
<result property="delivery" column="DLVR_TYPE" /> <!-- 배달(일반, 등기, 선택등기) -->
<result property="templateCode" column="TMPLT_CD" /> <!-- 템플릿코드 -->
<result property="templatePrint" column="TMPLT_PRINT_YN" /> <!-- 템플릿출력여부 -->
<result property="recipientCount" column="RCPNT_CNT" /> <!-- 수취인수 -->
<result property="marginYN" column="MARGIN_YN" /> <!-- 여백생성유무 -->
<result property="addressPageYN" column="ADDR_PAGE_YN" /> <!-- 주소페이지유무 -->
<result property="alignYN" column="ALIGN_YN" /> <!-- 맞춤자제유무 -->
<result property="mailMergeYN" column="MAIL_MERGE_YN" /> <!-- 메일머지유무 -->
<result property="enclosureYN" column="ENCL_YN" /> <!-- 동봉물유무 -->
<result property="returnYN" column="RETURN_YN" /> <!-- 반송여부 -->
<result property="staplerYN" column="STAPLER_YN" /> <!-- 스테이플러유무 -->
<result property="logoFile" column="LOGO_FILE" /> <!-- 로고파일 -->
<result property="senderName" column="SENDER_NM" /> <!-- 발송인명 -->
<result property="senderSigungu" column="SENDER_SGG" /> <!-- 발송인시군구명 -->
<result property="senderDeptCd" column="SENDER_DEPT" /> <!-- 발송부서코드 -->
<result property="senderZipcode" column="SENDER_ZIPCODE" /> <!-- 발송인우편번호 -->
<result property="senderAddress" column="SENDER_ADDR" /> <!-- 발송인주소 -->
<result property="senderDetailAddress" column="SENDER_DTL_ADDR" /> <!-- 발송인상세주소 -->
<result property="senderPhoneNo" column="SENDER_TELNO" /> <!-- 발송인전화번호 -->
<result property="senderEmail" column="SENDER_EMAIL" /> <!-- 발송인이메일 -->
<result property="status" column="STATUS" /> <!-- 진행상태 -->
<result property="postProgress" column="POST_PRGRS" /> <!-- 제작상태 -->
<result property="statusCheckDate" column="STAT_CHECK_DT" /> <!-- 제작상태 확인일시 -->
</resultMap>
<select id="selectMasters" parameterType="list" resultMap="masterRow">/* 우편제작 신청마스터 조회(PostplusMapper.selectMasters) */
SELECT INTF_ID <!-- 연계식별키 -->
, VERSION <!-- 버전 -->
, TEST_YN <!-- 테스트여부 -->
, SERVICE <!-- 서비스 -->
, SYSTEM_CD <!-- 시스템구분 -->
, SNDNG_ID <!-- 발송ID -->
, NOTICE_GB <!-- 고지서구분 -->
, NVLP <!-- 봉투 -->
, NVLP_WND <!-- 봉투창 -->
, BW_COLOR <!-- 흑백칼라 -->
, FACE_TYPE <!-- 단면양면 -->
, DLVR_TYPE <!-- 배달(일반, 등기, 선택등기) -->
, TMPLT_CD <!-- 템플릿코드 -->
, TMPLT_PRINT_YN <!-- 템플릿출력여부 -->
, RCPNT_CNT <!-- 수취인수 -->
, MARGIN_YN <!-- 여백생성유무 -->
, ADDR_PAGE_YN <!-- 주소페이지유무 -->
, ALIGN_YN <!-- 맞춤자제유무 -->
, MAIL_MERGE_YN <!-- 메일머지유무 -->
, ENCL_YN <!-- 동봉물유무 -->
, RETURN_YN <!-- 반송여부 -->
, STAPLER_YN <!-- 스테이플러유무 -->
, LOGO_FILE <!-- 로고파일 -->
, SENDER_NM <!-- 발송인명 -->
, SENDER_SGG <!-- 발송인시군구명 -->
, SENDER_DEPT <!-- 발송부서코드 -->
, SENDER_ZIPCODE <!-- 발송인우편번호 -->
, SENDER_ADDR <!-- 발송인주소 -->
, SENDER_DTL_ADDR <!-- 발송인상세주소 -->
, SENDER_TELNO <!-- 발송인전화번호 -->
, SENDER_EMAIL <!-- 발송인이메일 -->
, REG_DT <!-- 등록일시 -->
, RGTR <!-- 등록사용자 -->
, STATUS <!-- 진행상태 -->
, RESULT_CD <!-- 연계 결과 코드 -->
, RESULT_MSG <!-- 연계 결과 메세지 -->
, POST_PRGRS <!-- 제작상태 -->
, STAT_CHECK_DT <!-- 제작상태 확인일시 -->
FROM TB_PST_MSR
WHERE INTF_ID IN (<foreach collection="list" item="intfID" separator=",">#{intfID}</foreach>)</select>
<select id="selectNewIntfID" parameterType="map" resultType="dataobject">/* 우편제작 신청 연계ID 생성(PostplusMapper.selectNewIntfID) */
SELECT CONCAT(PREFIX, LPAD(NVL(replace(MAX(B.INTF_ID), PREFIX, '') + 1, '1'), 5, '0')) NEW_ID
FROM (SELECT CONCAT(<include refid="utility.today" />, '-', #{currentUser.orgID}, '-', #{currentUser.deptCode}, '-') PREFIX FROM DUAL) A
LEFT OUTER JOIN TB_PST_MSR_MASTER B ON B.INTF_ID LIKE CONCAT(A.PREFIX, '%')
SELECT CONCAT(PREFIX, LPAD(NVL(REPLACE(MAX(B.INTF_ID), PREFIX, '') + 1, '1'), 5, '0')) NEW_ID
FROM (SELECT <include refid="utility.today" /> PREFIX FROM DUAL) A
<!-- FROM (SELECT CONCAT(<include refid="utility.today" />, '-', #{currentUser.orgID}, '-', #{currentUser.deptCode}, '-') PREFIX FROM DUAL) A -->
LEFT OUTER JOIN TB_PST_MSR B ON B.INTF_ID LIKE CONCAT(A.PREFIX, '%')
</select>
<insert id="insertMaster" parameterType="map">/* 우편제작 신청 마스터 등록(PostplusMapper.insertMaster) */
INSERT INTO TB_PST_MSR_MASTER (
INTF_ID <!-- 연계식별키 -->
, VERSION <!-- 버전 -->
, TEST_YN <!-- 테스트여부 -->
, SERVICE <!-- 서비스 -->
, SYSTEM_CD <!-- 시스템구분 -->
, POST_GB <!-- 고지서구분 -->
, NVLP <!-- 봉투 -->
, NVLP_GB <!-- 봉투창 -->
, BW_COLOR <!-- 흑백칼라 -->
, FACE_TYPE <!-- 단면양면 -->
, DLVR_TYPE <!-- 배달(일반, 등기, 선택등기) -->
, TMPLT_CD <!-- 템플릿코드 -->
, TMPLT_PRINT_YN <!-- 템플릿출력여부 -->
, RCPNT_CNT <!-- 수취인수 -->
, MARGIN_YN <!-- 여백생성유무 -->
, ADDR_PAGE_YN <!-- 주소페이지유무 -->
, SET_PAPER_YN <!-- 맞춤자제유무 -->
, MAIL_MERGE_YN <!-- 메일머지유무 -->
, ENCL_YN <!-- 동봉물유무 -->
, RETURN_YN <!-- 반송여부 -->
, STAPLER_YN <!-- 스테이플러유무 -->
, LOGO_FILE <!-- 로고파일 -->
, SENDER_NM <!-- 발송인명 -->
, SENDER_CODE <!-- 발송부서코드 -->
, SENDER_ZIPCODE <!-- 발송인우편번호 -->
, SENDER_ADDR <!-- 발송인주소 -->
, SENDER_DETAIL_ADDR <!-- 발송인상세주소 -->
, SENDER_PHONENO <!-- 발송인전화번호 -->
, REG_DT <!-- 등록일시 -->
, RGTR <!-- 등록사용자 -->
, STATUS <!-- 진행상태 -->
, RESULT_CD <!-- 연계 결과 코드 -->
, RESULT_MSG <!-- 연계 결과 메세지 -->
, POST_PROGRESS <!-- 최종 제작 상태 -->
, STAT_CHECK_DT <!-- 최종 제작 상태 확인 일시 -->
INSERT INTO TB_PST_MSR (
INTF_ID <!-- 연계식별키 -->
, VERSION <!-- 버전 -->
, TEST_YN <!-- 테스트여부 -->
, SERVICE <!-- 서비스 -->
, SYSTEM_CD <!-- 시스템구분 -->
, SNDNG_ID <!-- 발송ID -->
, NOTICE_GB <!-- 고지서구분 -->
, NVLP <!-- 봉투 -->
, NVLP_WND <!-- 봉투창 -->
, BW_COLOR <!-- 흑백칼라 -->
, FACE_TYPE <!-- 단면양면 -->
, DLVR_TYPE <!-- 배달(일반, 등기, 선택등기) -->
, TMPLT_CD <!-- 템플릿코드 -->
, TMPLT_PRINT_YN <!-- 템플릿출력여부 -->
, RCPNT_CNT <!-- 수취인수 -->
, MARGIN_YN <!-- 여백생성유무 -->
, ADDR_PAGE_YN <!-- 주소페이지유무 -->
, ALIGN_YN <!-- 맞춤자제유무 -->
, MAIL_MERGE_YN <!-- 메일머지유무 -->
, ENCL_YN <!-- 동봉물유무 -->
, RETURN_YN <!-- 반송여부 -->
, STAPLER_YN <!-- 스테이플러유무 -->
, LOGO_FILE <!-- 로고파일 -->
, SENDER_NM <!-- 발송인명 -->
, SENDER_SGG <!-- 발송인시군구명 -->
, SENDER_DEPT <!-- 발송부서코드 -->
, SENDER_ZIPCODE <!-- 발송인우편번호 -->
, SENDER_ADDR <!-- 발송인주소 -->
, SENDER_DTL_ADDR <!-- 발송인상세주소 -->
, SENDER_TELNO <!-- 발송인전화번호 -->
, SENDER_EMAIL <!-- 발송인이메일 -->
, REG_DT <!-- 등록일시 -->
, RGTR <!-- 등록사용자 -->
, STATUS <!-- 진행상태 -->
, RESULT_CD <!-- 연계 결과 코드 -->
, RESULT_MSG <!-- 연계 결과 메세지 -->
, POST_PRGRS <!-- 제작상태 -->
, STAT_CHECK_DT <!-- 제작상태 확인일시 -->
) VALUES (
#{obj.intfID} <!-- 연계식별키 -->
, #{obj.version} <!-- 버전 -->
, #{obj.testYN} <!-- 테스트여부 -->
, #{obj.service} <!-- 서비스 -->
, #{obj.systemCd} <!-- 시스템구분 -->
, #{obj.postGb} <!-- 고지서구분 -->
, #{obj.envelop} <!-- 봉투 -->
, #{obj.envelopWindow} <!-- 봉투창 -->
, #{obj.bwColor} <!-- 흑백칼라 -->
, #{obj.faceType} <!-- 단면양면 -->
, #{obj.deliveryType} <!-- 배달(일반, 등기, 선택등기) -->
, #{obj.templateCode} <!-- 템플릿코드 -->
, #{obj.templatePrint} <!-- 템플릿출력여부 -->
, #{obj.recipientCount} <!-- 수취인수 -->
, #{obj.marginYN} <!-- 여백생성유무 -->
, #{obj.addressPageYN} <!-- 주소페이지유무 -->
, #{obj.orderYN} <!-- 맞춤자제유무 -->
, #{obj.mailMergeYN} <!-- 메일머지유무 -->
, #{obj.enclosedYN} <!-- 동봉물유무 -->
, #{obj.returnYN} <!-- 반송여부 -->
, #{obj.staplerYN} <!-- 스테이플러유무 -->
, #{obj.logoFile} <!-- 로고파일 -->
, #{obj.senderName} <!-- 발송인명 -->
, #{obj.senderDeptCode} <!-- 발송부서코드 -->
, #{obj.senderZipcode} <!-- 발송인우편번호 -->
, #{obj.senderAddress} <!-- 발송인주소 -->
, #{obj.senderDetailAddress} <!-- 발송인상세주소 -->
, #{obj.senderPhoneNo} <!-- 발송인전화번호 -->
#{mst.intfID} <!-- 연계식별키 -->
, #{mst.version} <!-- 버전 -->
, #{mst.testYN} <!-- 테스트여부 -->
, #{mst.service} <!-- 서비스 -->
, #{mst.systemCd} <!-- 시스템구분 -->
, #{mst.sndngId} <!-- 발송ID -->
, #{mst.noticeGb} <!-- 고지서구분 -->
, #{mst.envelop} <!-- 봉투 -->
, #{mst.envelopWindow} <!-- 봉투창 -->
, #{mst.bwColor} <!-- 흑백칼라 -->
, #{mst.faceType} <!-- 단면양면 -->
, #{mst.delivery} <!-- 배달(일반, 등기, 선택등기) -->
, #{mst.templateCode} <!-- 템플릿코드 -->
, #{mst.templatePrint} <!-- 템플릿출력여부 -->
, #{mst.recipientCount} <!-- 수취인수 -->
, #{mst.marginYN} <!-- 여백생성유무 -->
, #{mst.addressPageYN} <!-- 주소페이지유무 -->
, #{mst.alignYN} <!-- 맞춤자제유무 -->
, #{mst.mailMergeYN} <!-- 메일머지유무 -->
, #{mst.enclosureYN} <!-- 동봉물유무 -->
, #{mst.returnYN} <!-- 반송여부 -->
, #{mst.staplerYN} <!-- 스테이플러유무 -->
, #{mst.logoFile} <!-- 로고파일 -->
, #{mst.senderName} <!-- 발송인명 -->
, #{mst.senderSigungu} <!-- 발송부서코드 -->
, #{mst.senderDeptCd} <!-- 발송부서코드 -->
, #{mst.senderZipcode} <!-- 발송인우편번호 -->
, #{mst.senderAddress} <!-- 발송인주소 -->
, #{mst.senderDetailAddress} <!-- 발송인상세주소 -->
, #{mst.senderPhoneNo} <!-- 발송인전화번호 -->
, #{mst.senderEmail} <!-- 발송인메일주소 -->
,<include refid="utility.now" />
, #{obj.currentUser.id} <!-- 등록사용자 -->
, #{obj.status} <!-- 진행상태 -->
, #{obj.result_cd} <!-- 연계 결과 코드 -->
, #{obj.result_msg} <!-- 연계 결과 메세지 -->
, #{obj.post_progress} <!-- 최종 제작 상태 -->
, #{obj.stat_check_dt} <!-- 최종 제작 상태 확인 일시 -->
, #{currentUser.id} <!-- 등록사용자 -->
, #{mst.status} <!-- 진행상태 -->
, #{result.result} <!-- 연계결과 코드 -->
, #{result.remark} <!-- 연계결과 메세지 -->
, #{mst.postProgress} <!-- 제작상태 -->
, #{mst.statusCheckDate} <!-- 제작상태 확인일시 -->
)</insert>
<insert id="insertDetail" parameterType="map">/* 우편제작 신청 상세 등록(PostplusMapper.insertDetail) */
<update id="updateMaster" parameterType="map">/* 우편제작 신청 마스터 수정(PostplusMapper.updateMaster) */
UPDATE TB_PST_MSR
SET NVLP = #{mst.envelop} <!-- 봉투 -->
, NVLP_WND = #{mst.envelopWindow} <!-- 봉투창 -->
, BW_COLOR = #{mst.bwColor} <!-- 흑백칼라 -->
, FACE_TYPE = #{mst.faceType} <!-- 단면양면 -->
, DLVR_TYPE = #{mst.delivery} <!-- 배달(일반, 등기, 선택등기) -->
, TMPLT_PRINT_YN = #{mst.templatePrint} <!-- 템플릿출력여부 -->
, RCPNT_CNT = #{mst.recipientCount} <!-- 수취인수 -->
, MARGIN_YN = #{mst.marginYN} <!-- 여백생성유무 -->
, ADDR_PAGE_YN = #{mst.addressPageYN} <!-- 주소페이지유무 -->
, ALIGN_YN = #{mst.alignYN} <!-- 맞춤자제유무 -->
, MAIL_MERGE_YN = #{mst.mailMergeYN} <!-- 메일머지유무 -->
, ENCL_YN = #{mst.enclosureYN} <!-- 동봉물유무 -->
, RETURN_YN = #{mst.returnYN} <!-- 반송여부 -->
, STAPLER_YN = #{mst.staplerYN} <!-- 스테이플러유무 -->
, LOGO_FILE = #{mst.logoFile} <!-- 로고파일 -->
, SENDER_NM = #{mst.senderName} <!-- 발송인명 -->
, SENDER_SGG = #{mst.senderSigungu} <!-- 발송부서코드 -->
, SENDER_DEPT = #{mst.senderDeptCd} <!-- 발송부서코드 -->
, SENDER_ZIPCODE = #{mst.senderZipcode} <!-- 발송인우편번호 -->
, SENDER_ADDR = #{mst.senderAddress} <!-- 발송인주소 -->
, SENDER_DTL_ADDR = #{mst.senderDetailAddress} <!-- 발송인상세주소 -->
, SENDER_TELNO = #{mst.senderPhoneNo} <!-- 발송인전화번호 -->
, SENDER_EMAIL = #{mst.senderEmail} <!-- 발송인메일주소 -->
, STATUS = #{mst.status} <!-- 진행상태 -->
, RESULT_CD = #{result.result} <!-- 연계결과 코드 -->
, RESULT_MSG = #{result.remark} <!-- 연계결과 메세지 -->
, POST_PRGRS = #{mst.postProgress} <!-- 제작상태 -->
, STAT_CHECK_DT =<include refid="utility.now" /><!-- 제작상태 확인일시 -->
WHERE INTF_ID = #{mst.intfID}</update>
<delete id="deleteMasters" parameterType="list">/* 우편제작 신청마스터 삭제(PostplusMapper.deleteMasters) */
DELETE FROM TB_PST_MSR
WHERE INTF_ID IN (<foreach collection="list" item="intfID" separator=",">#{intfID}</foreach>)</delete>
<resultMap id="detailRow" type="cokr.xit.interfaces.postplus.post.PstMsr$Detail"><!-- 제작신청 상세 -->
<result property="intfID" column="INTF_ID" /> <!-- 연계식별키 -->
<result property="seq" column="SEQ" /> <!-- 순번 -->
<result property="sndngDtlId" column="SNDNG_DTL_ID" /> <!-- 발송상세ID -->
<result property="name" column="OWNER_NM" /> <!-- 이름 -->
<result property="zipcode" column="OWNER_ZIPCODE" /> <!-- 우편번호 -->
<result property="address" column="OWNER_ADDR" /> <!-- 주소 -->
<result property="detailAddress" column="OWNER_DTL_ADDR" /> <!-- 상세주소 -->
<result property="phoneNo" column="OWNER_TELNO" /> <!-- 전화번호 -->
<result property="regGb" column="REG_GB" /> <!-- 등기구분 -->
<result property="regNo" column="REG_NO" /> <!-- 등기번호 -->
<result property="regNoDatetime" column="REG_NO_REG_DT" /> <!-- 등기번호 등록일시 -->
<result property="serNo" column="SRL_NO" /> <!-- 일련번호 -->
<result property="deliveryCd" column="DLV_CD" /> <!-- 발송코드 -->
<result property="bar1D" column="BAR1D" /> <!-- 바코드1 -->
<result property="bar2D" column="BAR2D" /> <!-- 바코드2 -->
<result property="noticeNo" column="NTC_NO" /> <!-- 고지번호 -->
<result property="docCd1" column="DOC_CD1" /> <!-- 문서종류1 -->
<result property="docCd2" column="DOC_CD2" /> <!-- 문서종류2 -->
<result property="docCd3" column="DOC_CD3" /> <!-- 문서종류3 -->
<result property="docCd4" column="DOC_CD4" /> <!-- 문서종류4 -->
<result property="docCd5" column="DOC_CD5" /> <!-- 문서종류5 -->
<result property="subject1" column="SUBJ1" /> <!-- 과목명1 -->
<result property="subject2" column="SUBJ2" /> <!-- 과목명2 -->
<result property="subject3" column="SUBJ3" /> <!-- 과목명3 -->
<result property="violationDatetime" column="VLTN_DT" /> <!-- 위반일시 -->
<result property="violationDong" column="VLTN_DONG" /> <!-- 위반동 -->
<result property="violationLocation" column="VLTN_LOC" /> <!-- 위반장소 -->
<result property="legalBasis" column="LEGAL_BASIS" /> <!-- 법조항 -->
<result property="paymentNo1" column="PAYMENT_NO1" /> <!-- 납부번호1 -->
<result property="paymentNo2" column="PAYMENT_NO2" /> <!-- 납부번호2 -->
<result property="ocr0" column="OCR0" /> <!-- OCR0 -->
<result property="ocr1" column="OCR1" /> <!-- OCR1 -->
<result property="ocr2" column="OCR2" /> <!-- OCR2 -->
<result property="epaymentNo" column="EPAYMENT_NO" /> <!-- 전자납부번호 -->
<result property="vaccountNo" column="VACNT_NO" /> <!-- 가상계좌번호 -->
<result property="fineAmt" column="FINE_AMT" /> <!-- 과태료 -->
<result property="paymentAmt" column="PAYMENT_AMT" /> <!-- 납부금액 -->
<result property="dueDate" column="PAYMENT_DUE_DT" /> <!-- 납부기한 -->
<result property="inDueDate" column="PAYMENT_IN_DATE" /> <!-- 납기내기한 -->
<result property="inDueAmt" column="PAYMENT_IN_AMT" /> <!-- 납기내금액 -->
<result property="inDueAddedAmt" column="PAYMENT_IN_ADD_AMT" /> <!-- 납기내가산금 -->
<result property="inDueChenapAmt" column="PAYMENT_IN_DEFAULT_AMT" /> <!-- 납기내체납처분비 -->
<result property="overdueDate" column="PAYMENT_OUT_DATE" /> <!-- 납기후기한 -->
<result property="overdueAmt" column="PAYMENT_OUT_AMT" /> <!-- 납기후금액 -->
<result property="overdueAddedAmt" column="PAYMENT_OUT_ADD_AMT" /> <!-- 납기후가산금 -->
<result property="overdueChenapAmt" column="PAYMENT_OUT_DEFAULT_AMT" /> <!-- 납기후체납처분비 -->
<result property="vhrno" column="VHRNO" /> <!-- 차량번호 -->
<result property="birthday" column="OWNER_BDT" /> <!-- 주민번호 -->
<result property="printDate" column="PRINT_DT" /> <!-- 출력일자 -->
<result property="printYear" column="PRINT_YEAR" /> <!-- 출력년도 -->
<result property="printMonth" column="PRINT_MONTH" /> <!-- 출력월 -->
<result property="printDay" column="PRINT_DAY" /> <!-- 출력일 -->
<result property="evidenceNo" column="EVDNC_NO" /> <!-- 증거번호 -->
<result property="attachmentCount" column="PHOTO_CNT" /> <!-- 사진장수 -->
<result property="attachment1" column="PHOTO_FILENAME1" /> <!-- 사진파일명1 -->
<result property="attachment2" column="PHOTO_FILENAME2" /> <!-- 사진파일명2 -->
<result property="attachment3" column="PHOTO_FILENAME3" /> <!-- 사진파일명3 -->
<result property="attachment4" column="PHOTO_FILENAME4" /> <!-- 사진파일명4 -->
<result property="variableTitle" column="VAR_TITLE" /> <!-- 가변제목 -->
<result property="variableContent1" column="VAR_CONT1" /> <!-- 가변내용1 -->
<result property="variableContent2" column="VAR_CONT2" /> <!-- 가변내용2 -->
<result property="variableContent3" column="VAR_CONT3" /> <!-- 가변내용3 -->
<result property="variableContent4" column="VAR_CONT4" /> <!-- 가변내용4 -->
<result property="vaccountNo2" column="VACNT_NO2" /> <!-- 가상계좌번호2 -->
<result property="vaccountNo3" column="VACNT_NO3" /> <!-- 가상계좌번호3 -->
<result property="vaccountNo4" column="VACNT_NO4" /> <!-- 가상계좌번호4 -->
<result property="vaccountNo5" column="VACNT_NO5" /> <!-- 가상계좌번호5 -->
<result property="vaccountNo6" column="VACNT_NO6" /> <!-- 가상계좌번호6 -->
<result property="vaccountNo7" column="VACNT_NO7" /> <!-- 가상계좌번호7 -->
<result property="vaccountNo8" column="VACNT_NO8" /> <!-- 가상계좌번호8 -->
</resultMap>
<select id="selectDetails" parameterType="list" resultMap="detailRow">/* 우편제작 신청상세 조회(PostplusMapper.selectDetails) */
SELECT INTF_ID <!-- 연계식별키 -->
, SEQ <!-- 순번 -->
, SNDNG_DTL_ID <!-- 발송상세ID -->
, OWNER_NM <!-- 이름 -->
, OWNER_ZIPCODE <!-- 우편번호 -->
, OWNER_ADDR <!-- 주소 -->
, OWNER_DTL_ADDR <!-- 상세주소 -->
, OWNER_TELNO <!-- 전화번호 -->
, REG_GB <!-- 등기구분 -->
, REG_NO <!-- 등기번호 -->
, REG_NO_REG_DT <!-- 등기번호 등록일시 -->
, SRL_NO <!-- 일련번호 -->
, DLV_CD <!-- 발송코드 -->
, BAR1D <!-- 바코드1 -->
, BAR2D <!-- 바코드2 -->
, NTC_NO <!-- 고지번호 -->
, DOC_CD1 <!-- 문서종류1 -->
, DOC_CD2 <!-- 문서종류2 -->
, DOC_CD3 <!-- 문서종류3 -->
, DOC_CD4 <!-- 문서종류4 -->
, DOC_CD5 <!-- 문서종류5 -->
, SUBJ1 <!-- 과목명1 -->
, SUBJ2 <!-- 과목명2 -->
, SUBJ3 <!-- 과목명3 -->
, VLTN_DT <!-- 위반일시 -->
, VLTN_DONG <!-- 위반동 -->
, VLTN_LOC <!-- 위반장소 -->
, LEGAL_BASIS <!-- 법조항 -->
, PAYMENT_NO1 <!-- 납부번호1 -->
, PAYMENT_NO2 <!-- 납부번호2 -->
, OCR0 <!-- OCR0 -->
, OCR1 <!-- OCR1 -->
, OCR2 <!-- OCR2 -->
, EPAYMENT_NO <!-- 전자납부번호 -->
, VACNT_NO <!-- 가상계좌번호 -->
, FINE_AMT <!-- 과태료 -->
, PAYMENT_AMT <!-- 납부금액 -->
, PAYMENT_DUE_DT <!-- 납부기한 -->
, PAYMENT_IN_DATE <!-- 납기내기한 -->
, PAYMENT_IN_AMT <!-- 납기내금액 -->
, PAYMENT_IN_ADD_AMT <!-- 납기내가산금 -->
, PAYMENT_IN_DEFAULT_AMT <!-- 납기내체납처분비 -->
, PAYMENT_OUT_DATE <!-- 납기후기한 -->
, PAYMENT_OUT_AMT <!-- 납기후금액 -->
, PAYMENT_OUT_ADD_AMT <!-- 납기후가산금 -->
, PAYMENT_OUT_DEFAULT_AMT <!-- 납기후체납처분비 -->
, VHRNO <!-- 차량번호 -->
, OWNER_BDT <!-- 주민번호 -->
, PRINT_DT <!-- 출력일자 -->
, PRINT_YEAR <!-- 출력년도 -->
, PRINT_MONTH <!-- 출력월 -->
, PRINT_DAY <!-- 출력일 -->
, EVDNC_NO <!-- 증거번호 -->
, PHOTO_CNT <!-- 사진장수 -->
, PHOTO_FILENAME1 <!-- 사진파일명1 -->
, PHOTO_FILENAME2 <!-- 사진파일명2 -->
, PHOTO_FILENAME3 <!-- 사진파일명3 -->
, PHOTO_FILENAME4 <!-- 사진파일명4 -->
, VAR_TITLE <!-- 가변제목 -->
, VAR_CONT1 <!-- 가변내용1 -->
, VAR_CONT2 <!-- 가변내용2 -->
, VAR_CONT3 <!-- 가변내용3 -->
, VAR_CONT4 <!-- 가변내용4 -->
, VACNT_NO2 <!-- 가상계좌번호2 -->
, VACNT_NO3 <!-- 가상계좌번호3 -->
, VACNT_NO4 <!-- 가상계좌번호4 -->
, VACNT_NO5 <!-- 가상계좌번호5 -->
, VACNT_NO6 <!-- 가상계좌번호6 -->
, VACNT_NO7 <!-- 가상계좌번호7 -->
, VACNT_NO8 <!-- 가상계좌번호8 -->
FROM TB_PST_MSR_DETAIL
WHERE INTF_ID IN (<foreach collection="list" item="intfID" separator=",">#{intfID}</foreach>)
ORDER BY INTF_ID, SEQ</select>
<insert id="insertDetail" parameterType="map">/* 우편제작 신청상세 등록(PostplusMapper.insertDetail) */
INSERT INTO TB_PST_MSR_DETAIL (
INTF_ID <!-- 연계식별키 -->
, SEQ <!-- 순번 -->
, OWNER_NM <!-- 이름 -->
, ZIPCODE <!-- 우편번호 -->
, ADDR <!-- 주소 -->
, DETAIL_ADDR <!-- 상세주소 -->
, PHONENO <!-- 전화번호 -->
, FILENAME <!-- 사진파일명1 -->
, VAR_CNT1 <!-- 가변내용1 -->
, VAR_CNT2 <!-- 가변내용2 -->
, VAR_CNT3 <!-- 가변내용3 -->
, VAR_CNT4 <!-- 가변내용4' -->
INTF_ID <!-- 연계식별키 -->
, SEQ <!-- 순번 -->
, SNDNG_DTL_ID <!-- 발송상세ID -->
, OWNER_NM <!-- 이름 -->
, OWNER_ZIPCODE <!-- 우편번호 -->
, OWNER_ADDR <!-- 주소 -->
, OWNER_DTL_ADDR <!-- 상세주소 -->
, OWNER_TELNO <!-- 전화번호 -->
, REG_GB <!-- 등기구분 -->
, REG_NO <!-- 등기번호 -->
, REG_NO_REG_DT <!-- 등기번호 등록일시 -->
, SRL_NO <!-- 일련번호 -->
, DLV_CD <!-- 발송코드 -->
, BAR1D <!-- 바코드1 -->
, BAR2D <!-- 바코드2 -->
, NTC_NO <!-- 고지번호 -->
, DOC_CD1 <!-- 문서종류1 -->
, DOC_CD2 <!-- 문서종류2 -->
, DOC_CD3 <!-- 문서종류3 -->
, DOC_CD4 <!-- 문서종류4 -->
, DOC_CD5 <!-- 문서종류5 -->
, SUBJ1 <!-- 과목명1 -->
, SUBJ2 <!-- 과목명2 -->
, SUBJ3 <!-- 과목명3 -->
, VLTN_DT <!-- 위반일시 -->
, VLTN_DONG <!-- 위반동 -->
, VLTN_LOC <!-- 위반장소 -->
, LEGAL_BASIS <!-- 법조항 -->
, PAYMENT_NO1 <!-- 납부번호1 -->
, PAYMENT_NO2 <!-- 납부번호2 -->
, OCR0 <!-- OCR0 -->
, OCR1 <!-- OCR1 -->
, OCR2 <!-- OCR2 -->
, EPAYMENT_NO <!-- 전자납부번호 -->
, VACNT_NO <!-- 가상계좌번호 -->
, FINE_AMT <!-- 과태료 -->
, PAYMENT_AMT <!-- 납부금액 -->
, PAYMENT_DUE_DT <!-- 납부기한 -->
, PAYMENT_IN_DATE <!-- 납기내기한 -->
, PAYMENT_IN_AMT <!-- 납기내금액 -->
, PAYMENT_IN_ADD_AMT <!-- 납기내가산금 -->
, PAYMENT_IN_DEFAULT_AMT <!-- 납기내체납처분비 -->
, PAYMENT_OUT_DATE <!-- 납기후기한 -->
, PAYMENT_OUT_AMT <!-- 납기후금액 -->
, PAYMENT_OUT_ADD_AMT <!-- 납기후가산금 -->
, PAYMENT_OUT_DEFAULT_AMT <!-- 납기후체납처분비 -->
, VHRNO <!-- 차량번호 -->
, OWNER_BDT <!-- 주민번호 -->
, PRINT_DT <!-- 출력일자 -->
, PRINT_YEAR <!-- 출력년도 -->
, PRINT_MONTH <!-- 출력월 -->
, PRINT_DAY <!-- 출력일 -->
, EVDNC_NO <!-- 증거번호 -->
, PHOTO_CNT <!-- 사진장수 -->
, PHOTO_FILENAME1 <!-- 사진파일명1 -->
, PHOTO_FILENAME2 <!-- 사진파일명2 -->
, PHOTO_FILENAME3 <!-- 사진파일명3 -->
, PHOTO_FILENAME4 <!-- 사진파일명4 -->
, VAR_TITLE <!-- 가변제목 -->
, VAR_CONT1 <!-- 가변내용1 -->
, VAR_CONT2 <!-- 가변내용2 -->
, VAR_CONT3 <!-- 가변내용3 -->
, VAR_CONT4 <!-- 가변내용4 -->
, VACNT_NO2 <!-- 가상계좌번호2 -->
, VACNT_NO3 <!-- 가상계좌번호3 -->
, VACNT_NO4 <!-- 가상계좌번호4 -->
, VACNT_NO5 <!-- 가상계좌번호5 -->
, VACNT_NO6 <!-- 가상계좌번호6 -->
, VACNT_NO7 <!-- 가상계좌번호7 -->
, VACNT_NO8 <!-- 가상계좌번호8 -->
) VALUES (
#{obj.intfID} <!-- 연계식별키 -->
, #{obj.seq} <!-- 순번 -->
, #{obj.name} <!-- 이름 -->
, #{obj.Zipcode} <!-- 우편번호 -->
, #{obj.address} <!-- 주소 -->
, #{obj.detailAddress} <!-- 상세주소 -->
, #{obj.phoneNo} <!-- 전화번호 -->
, #{obj.attachment} <!-- 사진파일명1 -->
, #{obj.variableContent1} <!-- 가변내용1 -->
, #{obj.variableContent2} <!-- 가변내용2 -->
, #{obj.variableContent3} <!-- 가변내용3 -->
, #{obj.variableContent4} <!-- 가변내용4 -->
#{intfID} <!-- 연계식별키 -->
, #{seq} <!-- 순번 -->
, #{sndngDtlId} <!-- 발송상세ID -->
, #{name} <!-- 이름 -->
, #{zipcode} <!-- 우편번호 -->
, #{address} <!-- 주소 -->
, #{detailAddress} <!-- 상세주소 -->
, #{phoneNo} <!-- 전화번호 -->
, #{regGb} <!-- 등기구분 -->
, #{regNo} <!-- 등기번호 -->
, #{regNoDatetime} <!-- 등기번호 등록일시 -->
, #{serNo} <!-- 일련번호 -->
, #{deliveryCd} <!-- 발송코드 -->
, #{bar1D} <!-- 바코드1 -->
, #{bar2D} <!-- 바코드2 -->
, #{noticeNo} <!-- 고지번호 -->
, #{docCd1} <!-- 문서종류1 -->
, #{docCd2} <!-- 문서종류2 -->
, #{docCd3} <!-- 문서종류3 -->
, #{docCd4} <!-- 문서종류4 -->
, #{docCd5} <!-- 문서종류5 -->
, #{subject1} <!-- 과목명1 -->
, #{subject2} <!-- 과목명2 -->
, #{subject3} <!-- 과목명3 -->
, #{violationDatetime} <!-- 위반일시 -->
, #{violationDong} <!-- 위반동 -->
, #{violationLocation} <!-- 위반장소 -->
, #{legalBasis} <!-- 법조항 -->
, #{paymentNo1} <!-- 납부번호1 -->
, #{paymentNo2} <!-- 납부번호2 -->
, #{ocr0} <!-- OCR0 -->
, #{ocr1} <!-- OCR1 -->
, #{ocr2} <!-- OCR2 -->
, #{epaymentNo} <!-- 전자납부번호 -->
, #{vaccountNo} <!-- 가상계좌번호 -->
, #{fineAmt} <!-- 과태료 -->
, #{paymentAmt} <!-- 납부금액 -->
, #{dueDate} <!-- 납부기한 -->
, #{inDueDate} <!-- 납기내기한 -->
, #{inDueAmt} <!-- 납기내금액 -->
, #{inDueAddedAmt} <!-- 납기내가산금 -->
, #{inDueChenapAmt} <!-- 납기내체납처분비 -->
, #{overdueDate} <!-- 납기후기한 -->
, #{overdueAmt} <!-- 납기후금액 -->
, #{overdueAddedAmt} <!-- 납기후가산금 -->
, #{overdueChenapAmt} <!-- 납기후체납처분비 -->
, #{vhrno} <!-- 차량번호 -->
, #{birthday} <!-- 주민번호 -->
, #{printDate} <!-- 출력일자 -->
, #{printYear} <!-- 출력년도 -->
, #{printMonth} <!-- 출력월 -->
, #{printDay} <!-- 출력일 -->
, #{evidenceNo} <!-- 증거번호 -->
, #{attachmentCount} <!-- 사진장수 -->
, #{attachment1} <!-- 사진파일명1 -->
, #{attachment2} <!-- 사진파일명2 -->
, #{attachment3} <!-- 사진파일명3 -->
, #{attachment4} <!-- 사진파일명4 -->
, #{variableTitle} <!-- 가변제목 -->
, #{variableContent1} <!-- 가변내용1 -->
, #{variableContent2} <!-- 가변내용2 -->
, #{variableContent3} <!-- 가변내용3 -->
, #{variableContent4} <!-- 가변내용4 -->
, #{vaccountNo2} <!-- 가상계좌번호2 -->
, #{vaccountNo3} <!-- 가상계좌번호3 -->
, #{vaccountNo4} <!-- 가상계좌번호4 -->
, #{vaccountNo5} <!-- 가상계좌번호5 -->
, #{vaccountNo6} <!-- 가상계좌번호6 -->
, #{vaccountNo7} <!-- 가상계좌번호7 -->
, #{vaccountNo8} <!-- 가상계좌번호8 -->
)</insert>
<update id="updateDetail" parameterType="map">/* 우편제작 신청상세 수정(PostplusMapper.updateDetail) */
UPDATE TB_PST_MSR_DETAIL
SET OWNER_NM = #{name} <!-- 이름 -->
, OWNER_ZIPCODE = #{zipcode} <!-- 우편번호 -->
, OWNER_ADDR = #{address} <!-- 주소 -->
, OWNER_DTL_ADDR = #{detailAddress} <!-- 상세주소 -->
, OWNER_TELNO = #{phoneNo} <!-- 전화번호 -->
, REG_GB = #{regGb} <!-- 등기구분 -->
, REG_NO = #{regNo} <!-- 등기번호 -->
, REG_NO_REG_DT = #{regNoDatetime} <!-- 등기번호 등록일시 -->
, SRL_NO = #{serNo} <!-- 일련번호 -->
, DLV_CD = #{deliveryCd} <!-- 발송코드 -->
, BAR1D = #{bar1D} <!-- 바코드1 -->
, BAR2D = #{bar2D} <!-- 바코드2 -->
, NTC_NO = #{noticeNo} <!-- 고지번호 -->
, DOC_CD1 = #{docCd1} <!-- 문서종류1 -->
, DOC_CD2 = #{docCd2} <!-- 문서종류2 -->
, DOC_CD3 = #{docCd3} <!-- 문서종류3 -->
, DOC_CD4 = #{docCd4} <!-- 문서종류4 -->
, DOC_CD5 = #{docCd5} <!-- 문서종류5 -->
, SUBJ1 = #{subject1} <!-- 과목명1 -->
, SUBJ2 = #{subject2} <!-- 과목명2 -->
, SUBJ3 = #{subject3} <!-- 과목명3 -->
, VLTN_DT = #{violationDatetime} <!-- 위반일시 -->
, VLTN_DONG = #{violationDong} <!-- 위반동 -->
, VLTN_LOC = #{violationLocation} <!-- 위반장소 -->
, LEGAL_BASIS = #{legalBasis} <!-- 법조항 -->
, PAYMENT_NO1 = #{paymentNo1} <!-- 납부번호1 -->
, PAYMENT_NO2 = #{paymentNo2} <!-- 납부번호2 -->
, OCR0 = #{ocr0} <!-- OCR0 -->
, OCR1 = #{ocr1} <!-- OCR1 -->
, OCR2 = #{ocr2} <!-- OCR2 -->
, EPAYMENT_NO = #{epaymentNo} <!-- 전자납부번호 -->
, VACNT_NO = #{vaccountNo} <!-- 가상계좌번호 -->
, FINE_AMT = #{fineAmt} <!-- 과태료 -->
, PAYMENT_AMT = #{paymentAmt} <!-- 납부금액 -->
, PAYMENT_DUE_DT = #{dueDate} <!-- 납부기한 -->
, PAYMENT_IN_DATE = #{inDueDate} <!-- 납기내기한 -->
, PAYMENT_IN_AMT = #{inDueAmt} <!-- 납기내금액 -->
, PAYMENT_IN_ADD_AMT = #{inDueAddedAmt} <!-- 납기내가산금 -->
, PAYMENT_IN_DEFAULT_AMT = #{inDueChenapAmt} <!-- 납기내체납처분비 -->
, PAYMENT_OUT_DATE = #{overdueDate} <!-- 납기후기한 -->
, PAYMENT_OUT_AMT = #{overdueAmt} <!-- 납기후금액 -->
, PAYMENT_OUT_ADD_AMT = #{overdueAddedAmt} <!-- 납기후가산금 -->
, PAYMENT_OUT_DEFAULT_AMT = #{overdueChenapAmt} <!-- 납기후체납처분비 -->
, VHRNO = #{vhrno} <!-- 차량번호 -->
, OWNER_BDT = #{birthday} <!-- 주민번호 -->
, PRINT_DT = #{printDate} <!-- 출력일자 -->
, PRINT_YEAR = #{printYear} <!-- 출력년도 -->
, PRINT_MONTH = #{printMonth} <!-- 출력월 -->
, PRINT_DAY = #{printDay} <!-- 출력일 -->
, EVDNC_NO = #{evidenceNo} <!-- 증거번호 -->
, PHOTO_CNT = #{attachmentCount} <!-- 사진장수 -->
, PHOTO_FILENAME1 = #{attachment1} <!-- 사진파일명1 -->
, PHOTO_FILENAME2 = #{attachment2} <!-- 사진파일명2 -->
, PHOTO_FILENAME3 = #{attachment3} <!-- 사진파일명3 -->
, PHOTO_FILENAME4 = #{attachment4} <!-- 사진파일명4 -->
, VAR_TITLE = #{variableTitle} <!-- 가변제목 -->
, VAR_CONT1 = #{variableContent1} <!-- 가변내용1 -->
, VAR_CONT2 = #{variableContent2} <!-- 가변내용2 -->
, VAR_CONT3 = #{variableContent3} <!-- 가변내용3 -->
, VAR_CONT4 = #{variableContent4} <!-- 가변내용4 -->
, VACNT_NO2 = #{vaccountNo2} <!-- 가상계좌번호2 -->
, VACNT_NO3 = #{vaccountNo3} <!-- 가상계좌번호3 -->
, VACNT_NO4 = #{vaccountNo4} <!-- 가상계좌번호4 -->
, VACNT_NO5 = #{vaccountNo5} <!-- 가상계좌번호5 -->
, VACNT_NO6 = #{vaccountNo6} <!-- 가상계좌번호6 -->
, VACNT_NO7 = #{vaccountNo7} <!-- 가상계좌번호7 -->
, VACNT_NO8 = #{vaccountNo8} <!-- 가상계좌번호8 -->
WHERE INTF_ID = #{intfID}
AND SEQ = #{seq}</update>
<delete id="deleteDetails" parameterType="list">/* 우편제작 신청상세 삭제(PostplusMapper.deleteDetails) */
DELETE FROM TB_PST_MSR_DETAIL
WHERE INTF_ID IN (<foreach collection="list" item="intfID" separator=",">#{intfID}</foreach>)</delete>
</mapper>

@ -1,56 +1,141 @@
CREATE OR REPLACE TABLE TB_PST_MSR_MASTER (
INTF_ID VARCHAR(40) COMMENT '연계식별키',
VERSION VARCHAR(10) COMMENT '버전',
TEST_YN VARCHAR(2) COMMENT '테스트여부',
SERVICE VARCHAR(5) COMMENT '서비스',
SYSTEM_CD VARCHAR(3) COMMENT '시스템구분',
POST_GB VARCHAR(10) COMMENT '고지서구분',
NVLP VARCHAR(20) COMMENT '봉투',
NVLP_GB VARCHAR(20) COMMENT '봉투창',
BW_COLOR VARCHAR(10) COMMENT '흑백칼라',
FACE_TYPE VARCHAR(10) COMMENT '단면양면',
DLVR_TYPE VARCHAR(20) COMMENT '배달(일반, 등기, 선택등기)',
TMPLT_CD VARCHAR(20) COMMENT '템플릿코드',
TMPLT_PRINT_YN VARCHAR(1) DEFAULT 'N' COMMENT '템플릿출력여부',
RCPNT_CNT INT COMMENT '수취인수',
MARGIN_YN VARCHAR(1) DEFAULT 'N' COMMENT '여백생성유무',
ADDR_PAGE_YN VARCHAR(1) DEFAULT 'N' COMMENT '주소페이지유무',
SET_PAPER_YN VARCHAR(1) DEFAULT 'N' COMMENT '맞춤자제유무',
MAIL_MERGE_YN VARCHAR(1) DEFAULT 'N' COMMENT '메일머지유무',
ENCL_YN VARCHAR(1) DEFAULT 'N' COMMENT '동봉물유무',
RETURN_YN VARCHAR(1) DEFAULT 'N' COMMENT '반송여부',
STAPLER_YN VARCHAR(1) DEFAULT 'N' COMMENT '스테이플러유무',
LOGO_FILE VARCHAR(50) COMMENT '로고파일',
SENDER_NM VARCHAR(90) COMMENT '발송인명',
SENDER_CODE VARCHAR(11) COMMENT '발송부서코드',
SENDER_ZIPCODE VARCHAR(6) COMMENT '발송인우편번호',
SENDER_ADDR VARCHAR(99) COMMENT '발송인주소',
SENDER_DETAIL_ADDR VARCHAR(99) COMMENT '발송인상세주소',
SENDER_PHONENO VARCHAR(120) COMMENT '발송인전화번호',
REG_DT VARCHAR(14) COMMENT '등록일시',
RGTR VARCHAR(20) COMMENT '등록사용자',
STATUS VARCHAR(2) COMMENT '진행상태',
RESULT_CD VARCHAR(10) COMMENT '연계 결과 코드',
RESULT_MSG VARCHAR(100) COMMENT '연계 결과 메세지',
POST_PROGRESS VARCHAR(100) COMMENT '최종 제작 상태',
STAT_CHECK_DT VARCHAR(14) COMMENT '최종 제작 상태 확인 일시',
CREATE OR REPLACE TABLE TB_PST_TMPLT (
TMPLT_CD VARCHAR(20) COMMENT '템플릿코드',
NOTICE_GB VARCHAR(10) COMMENT '고지서구분',
NVLP VARCHAR(20) COMMENT '봉투',
NVLP_WND VARCHAR(20) COMMENT '봉투창',
BW_COLOR VARCHAR(10) COMMENT '흑백칼라',
FACE_TYPE VARCHAR(10) COMMENT '단면양면',
DLVR_TYPE VARCHAR(20) COMMENT '배달(일반, 등기, 선택등기)',
TMPLT_PRINT_YN VARCHAR(1) DEFAULT 'N' COMMENT '템플릿출력여부',
MARGIN_YN VARCHAR(1) DEFAULT 'N' COMMENT '여백생성유무',
ADDR_PAGE_YN VARCHAR(1) DEFAULT 'N' COMMENT '주소페이지유무',
ALIGN_YN VARCHAR(1) DEFAULT 'N' COMMENT '맞춤자제유무',
MAIL_MERGE_YN VARCHAR(1) DEFAULT 'N' COMMENT '메일머지유무',
ENCL_YN VARCHAR(1) DEFAULT 'N' COMMENT '동봉물유무',
RETURN_YN VARCHAR(1) DEFAULT 'N' COMMENT '반송여부',
STAPLER_YN VARCHAR(1) DEFAULT 'N' COMMENT '스테이플러유무',
LOGO_FILE VARCHAR(50) COMMENT '로고파일',
REG_DT VARCHAR(14) COMMENT '등록일시',
RGTR VARCHAR(20) COMMENT '등록사용자',
USE_YN VARCHAR(1) DEFAULT 'Y' COMMENT '사용여부',
PRIMARY KEY (TMPLT_CD)
) COMMENT = '우편제작 신청 마스터 설정';
CREATE OR REPLACE TABLE TB_PST_MSR (
INTF_ID VARCHAR(40) COMMENT '연계식별키',
VERSION VARCHAR(10) COMMENT '버전',
TEST_YN VARCHAR(2) COMMENT '테스트여부',
SERVICE VARCHAR(5) COMMENT '서비스',
SYSTEM_CD VARCHAR(3) COMMENT '시스템구분',
SNDNG_ID VARCHAR(20) COMMENT '발송ID',
NOTICE_GB VARCHAR(10) COMMENT '고지서구분',
NVLP VARCHAR(20) COMMENT '봉투',
NVLP_WND VARCHAR(20) COMMENT '봉투창',
BW_COLOR VARCHAR(10) COMMENT '흑백칼라',
FACE_TYPE VARCHAR(10) COMMENT '단면양면',
DLVR_TYPE VARCHAR(20) COMMENT '배달(일반, 등기, 선택등기)',
TMPLT_CD VARCHAR(20) COMMENT '템플릿코드',
TMPLT_PRINT_YN VARCHAR(1) DEFAULT 'N' COMMENT '템플릿출력여부',
RCPNT_CNT INT COMMENT '수취인수',
MARGIN_YN VARCHAR(1) DEFAULT 'N' COMMENT '여백생성유무',
ADDR_PAGE_YN VARCHAR(1) DEFAULT 'N' COMMENT '주소페이지유무',
ALIGN_YN VARCHAR(1) DEFAULT 'N' COMMENT '맞춤자제유무',
MAIL_MERGE_YN VARCHAR(1) DEFAULT 'N' COMMENT '메일머지유무',
ENCL_YN VARCHAR(1) DEFAULT 'N' COMMENT '동봉물유무',
RETURN_YN VARCHAR(1) DEFAULT 'N' COMMENT '반송여부',
STAPLER_YN VARCHAR(1) DEFAULT 'N' COMMENT '스테이플러유무',
LOGO_FILE VARCHAR(50) COMMENT '로고파일',
SENDER_NM VARCHAR(90) COMMENT '발송인명',
SENDER_SGG VARCHAR(60) COMMENT '발송시군구명',
SENDER_DEPT VARCHAR(11) COMMENT '발송부서코드',
SENDER_ZIPCODE VARCHAR(6) COMMENT '발송인우편번호',
SENDER_ADDR VARCHAR(99) COMMENT '발송인주소',
SENDER_DTL_ADDR VARCHAR(99) COMMENT '발송인상세주소',
SENDER_TELNO VARCHAR(120) COMMENT '발송인전화번호',
SENDER_EMAIL VARCHAR(120) COMMENT '발송인이메일',
REG_DT VARCHAR(14) COMMENT '등록일시',
RGTR VARCHAR(20) COMMENT '등록사용자',
STATUS VARCHAR(2) COMMENT '진행상태',
RESULT_CD VARCHAR(10) COMMENT '연계 결과 코드',
RESULT_MSG VARCHAR(100) COMMENT '연계 결과 메세지',
POST_PRGRS VARCHAR(100) COMMENT '최종 제작 상태',
STAT_CHECK_DT VARCHAR(14) COMMENT '최종 제작 상태 확인 일시',
PRIMARY KEY (INTF_ID)
) COMMENT = '우편제작 신청 마스터';
CREATE OR REPLACE TABLE TB_PST_MSR_DETAIL (
INTF_ID VARCHAR(40) COMMENT '연계식별키',
SEQ INT COMMENT'순번',
OWNER_NM VARCHAR(80) COMMENT'이름',
ZIPCODE VARCHAR(6) COMMENT'우편번호',
ADDR VARCHAR(100) COMMENT'주소',
DETAIL_ADDR VARCHAR(200) COMMENT'상세주소',
PHONENO VARCHAR(20) COMMENT'전화번호',
FILENAME VARCHAR(20) COMMENT'사진파일명1',
VAR_CNT1 VARCHAR(300) COMMENT'가변내용1',
VAR_CNT2 VARCHAR(300) COMMENT'가변내용2',
VAR_CNT3 VARCHAR(500) COMMENT'가변내용3',
VAR_CNT4 VARCHAR(300) COMMENT'가변내용4',
INTF_ID VARCHAR(40) COMMENT '연계식별키',
SEQ INT COMMENT '순번',
SNDNG_DTL_ID VARCHAR(20) COMMENT '발송상세ID',
OWNER_NM VARCHAR(80) COMMENT '이름',
OWNER_ZIPCODE VARCHAR(6) COMMENT '우편번호',
OWNER_ADDR VARCHAR(100) COMMENT '주소',
OWNER_DTL_ADDR VARCHAR(200) COMMENT '상세주소',
OWNER_TELNO VARCHAR(20) COMMENT '전화번호',
REG_GB VARCHAR(1) COMMENT '등기구분',
REG_NO VARCHAR(20) COMMENT '등기번호',
REG_NO_REG_DT VARCHAR(14) COMMENT '등기번호 등록일시',
SRL_NO VARCHAR(20) COMMENT '일련번호',
DLV_CD VARCHAR(2) COMMENT '발송코드',
BAR1D VARCHAR(20) COMMENT '바코드1',
BAR2D VARCHAR(170) COMMENT '바코드2',
NTC_NO VARCHAR(21) COMMENT '고지번호',
DOC_CD1 VARCHAR(60) COMMENT '문서종류1',
DOC_CD2 VARCHAR(30) COMMENT '문서종류2',
DOC_CD3 VARCHAR(6) COMMENT '문서종류3',
DOC_CD4 VARCHAR(60) COMMENT '문서종류4',
DOC_CD5 VARCHAR(15) COMMENT '문서종류5',
SUBJ1 VARCHAR(6) COMMENT '과목명1',
SUBJ2 VARCHAR(6) COMMENT '과목명2',
SUBJ3 VARCHAR(14) COMMENT '과목명3',
VLTN_DT VARCHAR(30) COMMENT '위반일시',
VLTN_DONG VARCHAR(40) COMMENT '위반동',
VLTN_LOC VARCHAR(80) COMMENT '위반장소',
LEGAL_BASIS VARCHAR(70) COMMENT '법조항',
PAYMENT_NO1 VARCHAR(17) COMMENT '납부번호1',
PAYMENT_NO2 VARCHAR(15) COMMENT '납부번호2',
OCR0 VARCHAR(32) COMMENT 'OCR0',
OCR1 VARCHAR(54) COMMENT 'OCR1',
OCR2 VARCHAR(54) COMMENT 'OCR2',
EPAYMENT_NO VARCHAR(30) COMMENT '전자납부번호',
VACNT_NO VARCHAR(50) COMMENT '가상계좌번호',
FINE_AMT VARCHAR(10) COMMENT '과태료',
PAYMENT_AMT VARCHAR(10) COMMENT '납부금액',
PAYMENT_DUE_DT VARCHAR(15) COMMENT '납부기한',
PAYMENT_IN_DATE VARCHAR(10) COMMENT '납기내기한',
PAYMENT_IN_AMT VARCHAR(10) COMMENT '납기내금액',
PAYMENT_IN_ADD_AMT VARCHAR(10) COMMENT '납기내가산금',
PAYMENT_IN_DEFAULT_AMT VARCHAR(10) COMMENT '납기내체납처분비',
PAYMENT_OUT_DATE VARCHAR(10) COMMENT '납기후기한',
PAYMENT_OUT_AMT VARCHAR(10) COMMENT '납기후금액',
PAYMENT_OUT_ADD_AMT VARCHAR(10) COMMENT '납기후가산금',
PAYMENT_OUT_DEFAULT_AMT VARCHAR(10) COMMENT '납기후체납처분비',
VHRNO VARCHAR(50) COMMENT '차량번호',
OWNER_BDT VARCHAR(6) COMMENT '주민번호',
PRINT_DT VARCHAR(21) COMMENT '출력일자',
PRINT_YEAR VARCHAR(4) COMMENT '출력년도',
PRINT_MONTH VARCHAR(2) COMMENT '출력월',
PRINT_DAY VARCHAR(2) COMMENT '출력일',
EVDNC_NO VARCHAR(24) COMMENT '증거번호',
PHOTO_CNT INT DEFAULT 0 COMMENT '사진장수',
PHOTO_FILENAME1 VARCHAR(20) COMMENT '사진파일명1',
PHOTO_FILENAME2 VARCHAR(20) COMMENT '사진파일명2',
PHOTO_FILENAME3 VARCHAR(20) COMMENT '사진파일명3',
PHOTO_FILENAME4 VARCHAR(20) COMMENT '사진파일명4',
VAR_TITLE VARCHAR(100) COMMENT '가변제목',
VAR_CONT1 VARCHAR(300) COMMENT '가변내용1',
VAR_CONT2 VARCHAR(300) COMMENT '가변내용2',
VAR_CONT3 VARCHAR(500) COMMENT '가변내용3',
VAR_CONT4 VARCHAR(300) COMMENT '가변내용4',
VACNT_NO2 VARCHAR(50) COMMENT '가상계좌번호2',
VACNT_NO3 VARCHAR(50) COMMENT '가상계좌번호3',
VACNT_NO4 VARCHAR(50) COMMENT '가상계좌번호4',
VACNT_NO5 VARCHAR(50) COMMENT '가상계좌번호5',
VACNT_NO6 VARCHAR(50) COMMENT '가상계좌번호6',
VACNT_NO7 VARCHAR(50) COMMENT '가상계좌번호7',
VACNT_NO8 VARCHAR(50) COMMENT '가상계좌번호8',
PRIMARY KEY (INTF_ID, SEQ)
) COMMENT = '우편제작 신청 상세';

@ -4,51 +4,41 @@ import java.util.List;
import javax.annotation.Resource;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import cokr.xit.foundation.data.JSON;
import cokr.xit.foundation.test.TestSupport;
import cokr.xit.foundation.util.DateFormats;
import cokr.xit.interfaces.postplus.Postplus;
import cokr.xit.interfaces.postplus.post.PostResponse;
import cokr.xit.interfaces.postplus.post.PstMsr;
import cokr.xit.interfaces.postplus.post.dao.PostplusMapper;
public class PostplusServiceTest extends TestSupport {
@Resource(name = "postService")
private PostplusService postService;
private String apiID = "site0";
@Resource(name = "postplusService")
private PostplusService postplusService;
@Resource(name = "postplusMapper")
private PostplusMapper postplusMapper;
@Test
void postplus() {
Postplus conf = Postplus.get();
System.out.println("host: " + conf.getHost());
System.out.println("apiKeys: " + conf.getApiKeys());
System.out.println("version: " + conf.getVersion());
System.out.println("test: " + conf.getTest());
System.out.println(json.stringify(conf, true));
System.out.println("requestProductionURL: " + conf.requestProductionURL());
System.out.println("productionStatusURL: " + conf.productionStatusURL());
}
@Test
void requestProduction() {
PstMsr newPstMsr() {
PstMsr.Master master = new PstMsr.Master()
.setTestYN("Y")
.setIntfID("POST20230428_000001")
// .setIntfID("POST20230428_000001")
.setEnvelop("소봉투")
.setEnvelopWindow("이중창")
.setBwColor("흑백")
.setFaceType("단면")
.setDelivery("일반")
.setTemplateCode("")
.setTemplatePrint("N")
.setTemplateCode("template-001")
.setRecipientCount("2")
.setMarginYN("N")
.setAddressPageYN("N")
.setOrderYN("N")
.setMailMergeYN("N")
.setEnclosedYN("N")
.setReturnYN("N")
.setStaplerYN("N")
.setLogoFile("N")
.setSenderName("포스토피아")
.setSenderZipcode("5048")
.setSenderAddress("서울특별시 광진구 강변역로2")
@ -62,7 +52,8 @@ public class PostplusServiceTest extends TestSupport {
.setAddress("서울특별시 광진구 강변역로2")
.setDetailAddress("서울광진우체국 B동 1층")
.setPhoneNo("1012341234")
.setAttachment("pstFile.pdf")
.setRegGb("E")
.setAttachment1("pstFile.pdf")
.setVariableContent1("24926737")
.setVariableContent2("2021-09-02")
.setVariableContent3("대출(고정)")
@ -73,23 +64,76 @@ public class PostplusServiceTest extends TestSupport {
.setAddress("서울특별시 광진구 강변역로2")
.setDetailAddress("서울광진우체국 B동 2층")
.setPhoneNo("01012341234")
.setAttachment("pstFile.pdf")
.setRegGb("E")
.setAttachment1("pstFile.pdf")
.setVariableContent1("25685047")
.setVariableContent2("2021-09-02")
.setVariableContent3("대출B(고정)")
.setVariableContent4("421,000,000")
);
PstMsr pstMsr = new PstMsr()
return new PstMsr()
.setMaster(master)
.setDetails(details);
System.out.println(new JSON().stringify(pstMsr.toRequest(), true));
}
@Test
void requestProduction() {
PstMsr pstMsr = newPstMsr();
System.out.println(json.stringify(pstMsr.toRequest(), true));
PostResponse resp = postplusService.requestProduction(pstMsr);
PstMsr.Master master = pstMsr.getMaster();
String intfID = master.getIntfID();
List<PstMsr> loaded = postplusService.getPstMsrs(List.of(intfID));
Assertions.assertEquals(1, loaded.size());
// PostResponse resp = postService.requestProduction(apiID, master, details, null);
pstMsr = loaded.get(0);
log().debug(json.stringify(pstMsr.toRequest(), true));
int affected = postplusService.delete(List.of(intfID));
Assertions.assertTrue(affected > 0);
}
@Test
void productionStatus() {
PstMsr pstMsr = newPstMsr();
postplusService.requestProduction(pstMsr);
PstMsr.Master master = pstMsr.getMaster();
List<PstMsr.Detail> details = pstMsr.getDetails();
String
intfID = master.getIntfID(),
resp = """
{
"결과": "OK",
"비고": "SUCCESS",
"신청일자": "{date}",
"봉투": "소봉투",
"배달": "일반",
"흑백칼라": "흑백",
"단면양면": "단면",
"발송건수": "2",
"상태": "접수대기",
"시작등기번호": "{date}00001",
"종료등기번호": "{date}00002",
"연계식별키": "{intfID}",
"순번등기번호": [
{"1": "{date}00001"},
{"2": "{date}00002"}
]
}""";
resp = resp.replace("{intfID}", intfID)
.replace("{date}", new DateFormats().today())
.trim();
StatusResponse statusResponse = json.parse(resp, StatusResponse.class);
log().debug(json.stringify(statusResponse, true));
postplusMapper.update(statusResponse);
/*
int affected = postplusService.delete(List.of(intfID));
Assertions.assertTrue(affected > 0);
*/
}
}

@ -0,0 +1,4 @@
log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator
log4jdbc.dump.sql.maxlinelength=0
log4jdbc.drivers=org.mariadb.jdbc.Driver

@ -0,0 +1,86 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- 60초마다 설정 파일의 변경을 확인 하여 변경시 갱신 -->
<configuration scan="true" scanPeriod="60 seconds">
<property name="applicationName" value="xit-postplus"/>
<property name="LOG_PATH" value="logs"/>
<property name="LOG_FILE_NAME" value="${applicationName}"/>
<property name="ERR_LOG_FILE_NAME" value="${LOG_FILE_NAME}-error"/>
<property name="LOG_PATTERN" value="%d{HH:mm:ss.SSS} %-5level [%logger{0}:%line] - %msg%n"/>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${LOG_PATTERN}</pattern>
</encoder>
</appender>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH}/${LOG_FILE_NAME}.log</file>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${LOG_PATTERN}</pattern>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- .gz,.zip 등을 넣으면 자동 일자별 로그파일 압축 -->
<fileNamePattern>${LOG_PATH}/${LOG_FILE_NAME}.%d{yyyy-MM-dd}_%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>10MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<maxHistory>30</maxHistory><!-- 로그파일 보관주기(일)-->
<!--<MinIndex>1</MinIndex>
<MaxIndex>10</MaxIndex>-->
</rollingPolicy>
</appender>
<appender name="Error" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>error</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<file>${LOG_PATH}/${ERR_LOG_FILE_NAME}.log</file>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${LOG_PATTERN}</pattern>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- .gz,.zip 등을 넣으면 자동 일자별 로그파일 압축 -->
<fileNamePattern>${LOG_PATH}/${ERR_LOG_FILE_NAME}.%d{yyyy-MM-dd}_%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<!-- 파일당 최고 용량 kb, mb, gb -->
<maxFileSize>10MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!-- 일자별 로그파일 최대 보관주기(~일), 해당 설정일 이상된 파일은 자동으로 제거-->
<maxHistory>60</maxHistory>
</rollingPolicy>
</appender>
<root level="DEBUG">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE"/>
<appender-ref ref="Error"/>
</root>
<logger name="jdbc" level="OFF"/>
<logger name="org.apache.commons" level="OFF" additivity="false"/>
<logger name="org.apache.ibatis" level="Error" additivity="false"/>
<logger name="org.springframework" level="Error" additivity="false"/>
<logger name="com.ibatis" level="Error" additivity="false"/>
<logger name="org.mariadb" level="OFF" additivity="false"/>
<logger name="jdbc.connection" level="OFF" additivity="false"/>
<logger name="jdbc.sqlonly" level="OFF" additivity="false"/>
<logger name="jdbc.resultset" level="OFF" additivity="false"/>
<logger name="jdbc.resultsettable" level="OFF" additivity="false"/>
<logger name="jdbc.audit" level="OFF" additivity="false"/>
<logger name="jdbc.sqltiming" level="DEBUG" />
<logger name="com.zaxxer" level="OFF" additivity="false"/>
<logger name="org.quartz" level="Error" additivity="false"/>
<!-- 특정패키지 로깅레벨 설정 -->
<logger name="cokr.xit" level="DEBUG" additivity="false">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE"/>
<appender-ref ref="Error"/>
</logger>
</configuration>

@ -0,0 +1,37 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="utility">
<!-- For Maria DB -->
<sql id="paging-prefix"><if test="fetchSize != null and fetchSize &gt; 0">
SELECT QROWS.* FROM (
SELECT ROW_NUMBER() OVER(<include refid="utility.sortBy" />) ROW_NUM
, COUNT(*) OVER() TOT_CNT, QBODY.*
FROM (</if></sql>
<sql id="paging-suffix"><if test="fetchSize != null and fetchSize &gt; 0"> ) QBODY
) QROWS
WHERE ROW_NUM BETWEEN ((#{pageNum} - 1) * #{fetchSize}) + 1 AND (#{pageNum} * #{fetchSize})</if></sql>
<select id="foundRows" resultType="dataobject">/* 전체 결과수 가져오기(utility.foundRows) */
SELECT FOUND_ROWS() TOT_CNT</select>
<sql id="sortBy"><if test="orderBy != null and orderBy != ''">ORDER BY ${orderBy}</if></sql>
<sql id="orderBy"><if test="fetchSize == null or fetchSize &lt; 1"><include refid="utility.sortBy" /></if></sql>
<sql id="now"><if test="_databaseId == 'mariadb'">DATE_FORMAT(CURRENT_TIMESTAMP, '%Y%m%d%H%i%s')</if>
<if test="_databaseId == 'oracle'">TO_CHAR(CURRENT_TIMESTAMP, 'YYYYMMDDHH24MISS')</if></sql>
<sql id="selectNow">SELECT<include refid="utility.now" />NOW FROM DUAL</sql>
<sql id="today"><if test="_databaseId == 'mariadb'">DATE_FORMAT(CURRENT_DATE, '%Y%m%d')</if>
<if test="_databaseId == 'oracle'">TO_CHAR(CURRENT_DATE, 'YYYYMMDD')</if></sql>
<sql id="selectToday">SELECT<include refid="utility.today" />TODAY FROM DUAL</sql>
<sql id="thisDay">NVL(#{thisDay},<include refid="utility.today" />)</sql>
<sql id="selectThisDay">SELECT<include refid="utility.thisDay" />THIS_DAY FROM DUAL</sql>
</mapper>
Loading…
Cancel
Save