+ * ============ 변경 이력 ============
+ * 2023-08-16 leebj 최초 작성
+ * ================================
+ *
+ */
+@Component("crdnPayerHstryBean")
+public class CrdnPayerHstryBean extends AbstractBean {
+
+ /** 단속 납부자 이력 정보 DAO */
+ @Resource(name = "crdnPayerHstryMapper")
+ private CrdnPayerHstryMapper crdnPayerHstryMapper;
+
+ /**지정한 조건에 따라 단속 납부자 이력 목록을 조회하여 반환한다.
+ * @param req 단속 납부자 이력 조회 조건
+ * @return 단속 납부자 이력 목록
+ */
+ public List getCrdnPayerHstryList(CrdnPayerHstryQuery req) {
+ return crdnPayerHstryMapper.selectCrdnPayerHstryList(req);
+ }
+
+ /**지정한 조건에 따라 단속 납부자 이력 객체들을 반환한다.
+ * @param req 단속 납부자 이력 조회 조건
+ * @return 단속 납부자 이력 객체 목록
+ */
+ public List getCrdnPayerHstrys(CrdnPayerHstryQuery req) {
+ return crdnPayerHstryMapper.selectCrdnPayerHstrys(req);
+ }
+
+ /**단속 납부자 이력 정보를 등록한다.
+ * @param crdnPayerHstry 단속 납부자 이력
+ * @return 저장 여부
+ *
저장됐으면 true
+ *
그렇지 않으면 false
+ *
+ */
+ public boolean createCrdnPayerHstry(CrdnPayerHstry crdnPayerHstry) {
+ return crdnPayerHstryMapper.insertCrdnPayerHstry(crdnPayerHstry);
+ }
+
+ /**단속 납부자 주소 이력 정보를 등록한다.
+ * @param crdnPayerHstry 단속 납부자 이력
+ * @return 저장 여부
+ *
저장됐으면 true
+ *
그렇지 않으면 false
+ *
+ */
+ public boolean createCrdnPayerAddrHstry(CrdnPayerHstry crdnPayerHstry) {
+ return crdnPayerHstryMapper.insertCrdnPayerAddrHstry(crdnPayerHstry);
+ }
+
+ /**단속 납부자 이력 정보를 등록하고, 단속 대장의 납부자 정보를 수정한다.
+ * @param crdnPayerHstry 단속 납부자 이력
+ * @return 저장 여부
+ *
저장됐으면 true
+ *
그렇지 않으면 false
+ *
+ */
+ public boolean updateCrdnPayer(CrdnPayerHstry crdnPayerHstry) {
+ return crdnPayerHstryMapper.updateCrdnPayer(crdnPayerHstry);
+ }
+
+ /**단속 납부자 이력 및 주소 이력 정보를 등록하고, 단속 대장의 납부자 정보를 수정한다.
+ * @param crdnPayerHstry 단속 납부자 이력
+ * @return 저장 여부
+ *
저장됐으면 true
+ *
그렇지 않으면 false
+ *
+ */
+ public boolean createHstryUpdateCrdnPayer(CrdnPayerHstry crdnPayerHstry) {
+ boolean rtnScs = false; // DB 처리 결과
+
+ // 단속 납부자 이력 정보를 등록한다.
+ rtnScs = createCrdnPayerHstry(crdnPayerHstry);
+ if (!rtnScs) {
+ throw new RuntimeException("단속 납부자 이력 정보를 등록 중 오류가 발생하였습니다."); // 예외를 발생시켜서 DB Rollback
+ }
+
+ // 단속 납부자 주소 이력 정보를 등록한다.
+ rtnScs = createCrdnPayerAddrHstry(crdnPayerHstry);
+ if (!rtnScs) {
+ throw new RuntimeException("단속 납부자 이력 정보를 등록 중 오류가 발생하였습니다."); // 예외를 발생시켜서 DB Rollback
+ }
+
+ // 단속 대장의 납부자 ID, 주소 일련번호를 변경한다.
+ rtnScs = updateCrdnPayer(crdnPayerHstry);
+ if (!rtnScs) {
+ throw new RuntimeException("단속 납부자 이력 정보를 등록 중 오류가 발생하였습니다."); // 예외를 발생시켜서 DB Rollback
+ }
+
+ return rtnScs;
+ }
+
+ /**단속 납부자 주소 이력 정보를 등록하고, 단속 대장의 납부자 정보를 수정한다.
+ * @param crdnPayerHstry 단속 납부자 이력
+ * @return 저장 여부
+ *
저장됐으면 true
+ *
그렇지 않으면 false
+ *
+ */
+ public boolean createHstryUpdateCrdnPayerAddr(CrdnPayerHstry crdnPayerHstry) {
+ boolean rtnScs = false; // DB 처리 결과
+
+ // 단속 납부자 주소 이력 정보를 등록한다.
+ rtnScs = createCrdnPayerAddrHstry(crdnPayerHstry);
+ if (!rtnScs) {
+ throw new RuntimeException("단속 납부자 이력 정보를 등록 중 오류가 발생하였습니다."); // 예외를 발생시켜서 DB Rollback
+ }
+
+ // 단속 대장의 납부자 ID, 주소 일련번호를 변경한다.
+ rtnScs = updateCrdnPayer(crdnPayerHstry);
+ if (!rtnScs) {
+ throw new RuntimeException("단속 납부자 이력 정보를 등록 중 오류가 발생하였습니다."); // 예외를 발생시켜서 DB Rollback
+ }
+
+ return rtnScs;
+ }
+
+}
diff --git a/src/main/java/cokr/xit/fims/cmmn/service/bean/CrdnSttsHstryBean.java b/src/main/java/cokr/xit/fims/cmmn/service/bean/CrdnSttsHstryBean.java
new file mode 100644
index 00000000..01c7e8f0
--- /dev/null
+++ b/src/main/java/cokr/xit/fims/cmmn/service/bean/CrdnSttsHstryBean.java
@@ -0,0 +1,224 @@
+package cokr.xit.fims.cmmn.service.bean;
+
+import java.text.SimpleDateFormat;
+import java.util.List;
+
+import javax.annotation.Resource;
+
+import org.springframework.stereotype.Component;
+
+import cokr.xit.fims.cmmn.CrdnSttsHstry;
+import cokr.xit.fims.cmmn.CrdnSttsHstryQuery;
+import cokr.xit.fims.cmmn.dao.CrdnSttsHstryMapper;
+import cokr.xit.foundation.component.AbstractBean;
+import cokr.xit.foundation.data.DataObject;
+
+/**단속 상태 이력 정보 관리 Bean
+ *
+ *
상세 설명:
+ *
+ *
+ * ============ 변경 이력 ============
+ * 2023-07-19 JoJH 최초 작성
+ * ================================
+ *
+ */
+@Component("crdnSttsHstryBean")
+public class CrdnSttsHstryBean extends AbstractBean {
+
+ /** 단속 상태 이력 정보 DAO */
+ @Resource(name = "crdnSttsHstryMapper")
+ private CrdnSttsHstryMapper crdnSttsHstryMapper;
+
+ /**지정한 조건에 따라 단속 상태 이력 목록을 조회하여 반환한다.
+ * @param req 단속 상태 이력 조회 조건
+ * @return 단속 상태 이력 목록
+ */
+ public List getCrdnSttsHstryList(CrdnSttsHstryQuery req) {
+ return crdnSttsHstryMapper.selectCrdnSttsHstryList(req);
+ }
+
+ /**지정한 조건에 따라 단속 상태 이력 객체들을 반환한다.
+ * @param req 단속 상태 이력 조회 조건
+ * @return 단속 상태 이력 객체 목록
+ */
+ public List getCrdnSttsHstrys(CrdnSttsHstryQuery req) {
+ return crdnSttsHstryMapper.selectCrdnSttsHstrys(req);
+ }
+
+ /**단속 ID에 따라 마지막 단속 상태 이력 객체를 반환한다.
+ * @param crdnId 단속 ID
+ * @return 단속 상태 이력 객체 목록
+ */
+ public DataObject getCrdnSttsHstryInfo(String crdnId, String crdnSttsCd, String useYn) {
+ return crdnSttsHstryMapper.selectCrdnSttsHstryInfo(crdnId, crdnSttsCd, useYn);
+ }
+
+ /**단속 상태 이력 정보를 등록한다.
+ * @param crdnSttsHstry 단속 상태 이력
+ * @return 저장 여부
+ *
저장됐으면 true
+ *
그렇지 않으면 false
+ *
+ */
+ public boolean create(CrdnSttsHstry crdnSttsHstry) {
+ if (crdnSttsHstry.getUseYn() == null) {
+ crdnSttsHstry.setUseYn("Y");
+ }
+
+ return crdnSttsHstryMapper.insertCrdnSttsHstry(crdnSttsHstry) == 1;
+ }
+
+ /**단속 상태 이력 정보를 수정한다.
+ * @param crdnSttsHstry 단속 상태 이력
+ * @return 저장 여부
+ *
저장됐으면 true
+ *
그렇지 않으면 false
+ *
+ */
+ public boolean update(CrdnSttsHstry crdnSttsHstry) {
+ return crdnSttsHstryMapper.updateCrdnSttsHstry(crdnSttsHstry) == 1;
+ }
+
+ /**단속 상태 이력 정보를 삭제한다. 단속ID로 입력되면 여러건이 삭제가 가능하다.
+ * @param crdnSttsHstry 단속 상태 이력
+ * @return 저장 여부
+ *
저장됐으면 true
+ *
그렇지 않으면 false
+ *
+ */
+ public boolean remove(CrdnSttsHstry crdnSttsHstry) {
+ return crdnSttsHstryMapper.deleteCrdnSttsHstry(crdnSttsHstry) >= 1;
+ }
+
+ /**단속 대장의 상태 정보를 수정한다.
+ * @param excl 부과제외 대장
+ * @return 저장 여부
+ *
저장됐으면 true
+ *
그렇지 않으면 false
+ *
+ */
+ public boolean updateCrdn(CrdnSttsHstry crdnSttsHstry) {
+ return crdnSttsHstryMapper.updateCrdnSttsCd(crdnSttsHstry) == 1;
+ }
+
+ /**단속 상태 이력 정보를 등록하고, 단속 대장의 단속상태 정보를 수정한다.
+ * @param crdnSttsHstry 단속 상태 이력
+ * @return 저장 여부
+ *
저장됐으면 true
+ *
그렇지 않으면 false
+ *
+ */
+ public boolean createHstryUpdateCrdnSttsCd(CrdnSttsHstry crdnSttsHstry) {
+ // 변수 선언
+ int rtnNocs = -1;
+
+ // 사용 여부
+ if (crdnSttsHstry.getUseYn() == null) {
+ crdnSttsHstry.setUseYn("Y");
+ }
+ // 단속 상태 변경 일시
+ if (crdnSttsHstry.getCrdnSttsChgDt() == null || crdnSttsHstry.getCrdnSttsChgDt().equals("")) {
+ // 현재 날짜 구하기
+ SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
+ crdnSttsHstry.setCrdnSttsChgDt(dateFormat.format(System.currentTimeMillis()));
+ }
+
+ // 단속상태이력(TB_CRDN_STTS_HSTRY) 대장을 등록한다.
+ rtnNocs = crdnSttsHstryMapper.insertCrdnSttsHstry(crdnSttsHstry);
+ if (rtnNocs != 1) {
+ throw new RuntimeException("단속상태이력 대장 등록에 실패하였습니다."); // 예외를 발생시켜서 DB Rollback
+ }
+ // 단속(TB_CRDN) 대장을 수정한다.
+ rtnNocs = crdnSttsHstryMapper.updateCrdnSttsCd(crdnSttsHstry);
+ if (rtnNocs != 1) {
+ throw new RuntimeException("단속상태이력 정보 등록 중 오류가 발생하였습니다."); // 예외를 발생시켜서 DB Rollback
+ }
+
+ return true;
+ }
+
+ /**단속 상태 이력 정보를 삭제하고, 하고 단속 대장의 단속상태 정보를 수정한다.
+ * @param crdnSttsHstry 단속 상태 이력
+ * @return 저장 여부
+ *
저장됐으면 true
+ *
그렇지 않으면 false
+ *
+ */
+ public boolean removeHstryUpdateCrdnSttsCd(String crdnId, String crdnSttsCd, String deltSttsCd, String deltEtcCn, boolean insertBfrSttsYn) {
+ // 변수 선언
+ int rtnNocs = -1;
+
+ // 단속 ID에 해당하는 단속상태코드의 단속상태이력(TB_CRDN_STTS_HSTRY) 대장을 조회 한다.
+ DataObject crdnSttsHstryInfo = crdnSttsHstryMapper.selectCrdnSttsHstryInfo(crdnId, crdnSttsCd, "Y");
+
+ if (crdnSttsHstryInfo == null) {
+ throw new RuntimeException("단속상태이력 자료가 존재하지 않습니다."); // 예외를 발생시켜서 DB Rollback
+ }
+
+ if (!crdnSttsCd.equals("")) {
+ CrdnSttsHstry crdnSttsHstry = new CrdnSttsHstry();
+ crdnSttsHstry.setSttsHstryId(crdnSttsHstryInfo.string("STTS_HSTRY_ID"));
+ crdnSttsHstry.setUseYn("N");
+
+ rtnNocs = crdnSttsHstryMapper.updateCrdnSttsHstry(crdnSttsHstry);
+ if (rtnNocs != 1) {
+ throw new RuntimeException("단속상태이력 대장에 이력 수정에 실패하였습니다."); // 예외를 발생시켜서 DB Rollback
+ }
+ }
+
+ // 삭제 단속상태코드가 있다면.. 단속상태이력(TB_CRDN_STTS_HSTRY) 대장을 등록한다.
+ if (!deltSttsCd.equals("")) {
+ // 단속상태가 의견제출접수(31)가 아니면서, 삭제상태코드가 의견제출삭제(92)나 경찰서이첩삭제(97) 일 경우
+ if (!crdnSttsCd.equals("31") && "92,97".contains(deltSttsCd)) {
+ // 단속상태이력(TB_CRDN_STTS_HSTRY) 대장에서 의견제출접수(31) 이력을 조회후 사용여부를 미사용("N")으로 수정.
+ crdnSttsHstryInfo = crdnSttsHstryMapper.selectCrdnSttsHstryInfo(crdnId, "31", "Y");
+
+ if (crdnSttsHstryInfo == null) {
+ throw new RuntimeException("단속상태이력에 의견제출 접수 이력이 존재하지 않습니다."); // 예외를 발생시켜서 DB Rollback
+ }
+
+ CrdnSttsHstry opnnSttsHstry = new CrdnSttsHstry();
+ opnnSttsHstry.setSttsHstryId(crdnSttsHstryInfo.string("STTS_HSTRY_ID"));
+ opnnSttsHstry.setUseYn("N");
+
+ rtnNocs = crdnSttsHstryMapper.updateCrdnSttsHstry(opnnSttsHstry);
+ if (rtnNocs != 1) {
+ throw new RuntimeException("단속상태이력 대장에 의견제출접수 이력 수정에 실패하였습니다."); // 예외를 발생시켜서 DB Rollback
+ }
+ }
+
+ CrdnSttsHstry deleteSttsHstry = new CrdnSttsHstry();
+ deleteSttsHstry.setCrdnId(crdnSttsHstryInfo.string("CRDN_ID"));
+ deleteSttsHstry.setBfrSttsCd(crdnSttsHstryInfo.string("CRDN_STTS_CD"));
+ deleteSttsHstry.setBfrSttsChgDt(crdnSttsHstryInfo.string("REG_DT"));
+ deleteSttsHstry.setCrdnSttsCd(deltSttsCd);
+ deleteSttsHstry.setEtcCn(deltEtcCn);
+ deleteSttsHstry.setUseYn("N");
+
+ rtnNocs = crdnSttsHstryMapper.insertCrdnSttsHstry(deleteSttsHstry);
+ if (rtnNocs != 1) {
+ throw new RuntimeException("삭제 단속상태이력 정보 등록 중 오류가 발생하였습니다."); // 예외를 발생시켜서 DB Rollback
+ }
+ }
+
+ if (insertBfrSttsYn) {
+ // 단속상태이력(TB_CRDN_STTS_HSTRY) 대장을 등록한다.
+ CrdnSttsHstry crdnSttsHstry = new CrdnSttsHstry();
+ crdnSttsHstry.setCrdnId(crdnSttsHstryInfo.string("CRDN_ID"));
+ crdnSttsHstry.setBfrSttsCd(deltSttsCd);
+ crdnSttsHstry.setBfrSttsChgDt(crdnSttsHstry.getCreatedAt());
+ crdnSttsHstry.setCrdnSttsCd(crdnSttsHstryInfo.string("BFR_STTS_CD"));
+ crdnSttsHstry.setCrdnSttsChgDt(crdnSttsHstryInfo.string("BFR_STTS_CHG_DT"));
+ crdnSttsHstry.setUseYn("Y");
+
+ boolean rtnScs = createHstryUpdateCrdnSttsCd(crdnSttsHstry);
+ if (!rtnScs) {
+ throw new RuntimeException("단속상태이력 정보 등록 중 오류가 발생하였습니다."); // 예외를 발생시켜서 DB Rollback
+ }
+ }
+
+ return true;
+ }
+
+}
diff --git a/src/main/java/cokr/xit/fims/payer/Payer.java b/src/main/java/cokr/xit/fims/payer/Payer.java
new file mode 100644
index 00000000..97302d2f
--- /dev/null
+++ b/src/main/java/cokr/xit/fims/payer/Payer.java
@@ -0,0 +1,191 @@
+package cokr.xit.fims.payer;
+
+import cokr.xit.foundation.AbstractEntity;
+import cokr.xit.interfaces.lvis.service.reg.BasicInfoResponse;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 납부자 대장
+ * @author mjkhan
+ */
+@Getter
+@Setter
+public class Payer extends AbstractEntity {
+
+ /**
+ * 납부자 ID
+ */
+ private String rtpyrId;
+
+ /**
+ * 시군구 코드
+ */
+ private String sggCd;
+
+ /**
+ * 차량번호
+ */
+ private String vhrno;
+
+ /**
+ * 납부자 입력 구분 코드
+ */
+ private String rtpyrInptSeCd;
+
+ /**
+ * 납부자 구분 코드
+ */
+ private String rtpyrSeCd;
+
+ /**
+ * 납부자 번호
+ */
+ private String rtpyrNo;
+
+ /**
+ * 납부자 명
+ */
+ private String rtpyrNm;
+
+ /**
+ * 납부자 전화번호
+ */
+ private String rtpyrTelno;
+
+ /**
+ * 납부자 휴대 전화번호
+ */
+ private String rtpyrMblTelno;
+
+ /**
+ * 납부자 이메일
+ */
+ private String rtpyrEml;
+
+ /**
+ * 납부자 생년월일
+ */
+ private String rtpyrBrdt;
+
+ /**
+ * 납부자 상태 코드
+ */
+ private String rtpyrSttsCd;
+
+ /**
+ * 주소 일련번호
+ */
+ private String addrSn;
+
+ /**
+ * 주소 입력 구분 코드
+ */
+ private String addrInptSeCd;
+
+ /**
+ * 주소 구분 코드
+ */
+ private String addrSeCd;
+
+ /**
+ * 우편번호
+ */
+ private String zip;
+
+ /**
+ * 주소
+ */
+ private String addr;
+
+ /**
+ * 상세 주소
+ */
+ private String dtlAddr;
+
+ /**
+ * 도로 명 코드
+ */
+ private String roadNmCd;
+
+ /**
+ * 지하 구분 코드
+ */
+ private String udgdSeCd;
+
+ /**
+ * 건물본번
+ */
+ private Integer bmno;
+
+ /**
+ * 건물부번
+ */
+ private Integer bsno;
+
+ /**
+ * 건물 관리 번호
+ */
+ private String bldgMngNo;
+
+ /**
+ * 법정동 코드
+ */
+ private String stdgCd;
+
+ /**
+ * 행정동 코드
+ */
+ private String dongCd;
+
+ /**
+ * 산 구분 코드
+ */
+ private String mtnSeCd;
+
+ /**
+ * 본번
+ */
+ private Integer mno;
+
+ /**
+ * 부번
+ */
+ private Integer sno;
+
+ /**
+ * 특수 동
+ */
+ private String spclDong;
+
+ /**
+ * 특수 호
+ */
+ private String spclHo;
+
+ /**
+ * 특수 주소
+ */
+ private String spclAddr;
+
+ /**
+ * 전체 주소
+ */
+ private String wholAddr;
+
+ /** 차량 기본정보 */
+ private BasicInfoResponse.BasicInfo vehicleInfo;
+
+ /**"차량번호-납부자번호"를 반환한다.
+ * @return "차량번호-납부자번호"
+ */
+ public String getKey() {
+ return String.format("%s-%s", vhrno, rtpyrNo);
+ }
+
+ /**
+ * 단속 ID
+ */
+ private String crdnId;
+
+}
\ No newline at end of file
diff --git a/src/main/java/cokr/xit/fims/payer/PayerQuery.java b/src/main/java/cokr/xit/fims/payer/PayerQuery.java
new file mode 100644
index 00000000..ff4322e5
--- /dev/null
+++ b/src/main/java/cokr/xit/fims/payer/PayerQuery.java
@@ -0,0 +1,233 @@
+package cokr.xit.fims.payer;
+
+import cokr.xit.foundation.component.QueryRequest;
+
+/**납부자 대장 정보 조회 요청
+ *
+ *
상세 설명:
+ *
+ *
+ * ============ 변경 이력 ============
+ * 2023-08-18 mjkhan 최초 작성
+ * ================================
+ *
+ */
+public class PayerQuery extends QueryRequest {
+ private static final long serialVersionUID = 1L;
+
+ /** 납부자 Ids */
+ private String[] rtpyrIds;
+ /** 차량번호 */
+ private String vhrno;
+ /** 납부자 구분 코드 */
+ private String rtpyrSeCd;
+ /** 납부자번호 */
+ private String rtpyrNo;
+ /** 납부자 ID */
+ private String rtpyrId;
+ /** 주소 일련번호 */
+ private String addrSn;
+ /** 이력 일련번호 */
+ private String hstrySn;
+ /** 주소 입력 구분 코드 */
+ private String addrInptSeCd;
+ /** 도로명 코드 */
+ private String roadNmCd;
+ /** 주소 */
+ private String addr;
+ /** 상세 주소 */
+ private String dtlAddr;
+ /** 단속 ID */
+ private String crdnId;
+ /** 호출 용도 */
+ private String callPurpose; // infoDialog 호출 용도(view 조회(편집불가), create 등록, update 수정, refresh 재조회).
+
+ /**납부자 Ids를 반환한다.
+ * @return 납부자 Ids
+ */
+ public String[] getRtpyrIds() {
+ return ifEmpty(rtpyrIds, () -> null);
+ }
+
+ /**납부자 Ids를 설정한다.
+ * @param rtpyrIds 납부자 Ids
+ * @return 현재 PayerQuery
+ */
+ public PayerQuery setRtpyrIds(String... rtpyrIds) {
+ this.rtpyrIds = rtpyrIds;
+ return this;
+ }
+
+ /**납부자 ID를 반환한다.
+ * @return 납부자 ID
+ */
+ public String getRtpyrId() {
+ return !isEmpty(rtpyrIds) ? rtpyrIds[0] : rtpyrId;
+ }
+
+ /**납부자 ID를 설정한다.
+ * @param rtpyrId 납부자 ID
+ * @return 현재 PayerQuery
+ */
+ public PayerQuery setRtpyrId(String rtpyrId) {
+ this.rtpyrId = rtpyrId;
+ return this;
+ }
+
+ /**주소 일련번호를 반환한다.
+ * @return 주소 일련번호
+ */
+ public String getAddrSn() {
+ return ifEmpty(addrSn, () -> null);
+ }
+
+ /**주소 일련번호를 설정한다.
+ * @param addrSn 주소 일련번호
+ * @return 현재 PayerQuery
+ */
+ public PayerQuery setAddrSn(String addrSn) {
+ this.addrSn = addrSn;
+ return self();
+ }
+
+ /**이력 일련번호를 반환한다.
+ * @return 이력 일련번호
+ */
+ public String getHstrySn() {
+ return hstrySn;
+ }
+
+ /**이력 일련번호를 설정한다.
+ * @param hstrySn 이력 일련번호
+ * @return 현재 PayerQuery
+ */
+ public PayerQuery setHstrySn(String hstrySn) {
+ this.hstrySn = hstrySn;
+ return this;
+ }
+
+ /**차량번호를 반환한다.
+ * @return 차량번호
+ */
+ public String getVhrno() {
+ return vhrno;
+ }
+
+ /**차량번호를 설정한다.
+ * @param vhrno 차량번호
+ * @return 현재 PayerQuery
+ */
+ public PayerQuery setVhrno(String vhrno) {
+ this.vhrno = vhrno;
+ return this;
+ }
+
+ /**납부자 구분 코드를 반환한다.
+ * @return 납부자 구분 코드
+ */
+ public String getRtpyrSeCd() {
+ return rtpyrSeCd;
+ }
+
+ /**납부자 구분 코드를 설정한다.
+ * @param rtpyrSeCd 납부자 구분 코드
+ * @return 현재 PayerQuery
+ */
+ public void setRtpyrSeCd(String rtpyrSeCd) {
+ this.rtpyrSeCd = rtpyrSeCd;
+ }
+
+ /**납부자 번호를 반환한다.
+ * @return 납부자 번호
+ */
+ public String getRtpyrNo() {
+ return rtpyrNo;
+ }
+
+ /**납부자 번호를 설정한다.
+ * @param rtpyrNo 납부자 번호
+ * @return 현재 PayerQuery
+ */
+ public void setRtpyrNo(String rtpyrNo) {
+ this.rtpyrNo = rtpyrNo;
+ }
+
+ /**주소 입력 구분 코드를 반환한다.
+ * @return 주소 입력 구분 코드
+ */
+ public String getAddrInptSeCd() {
+ return addrInptSeCd;
+ }
+
+ /**주소 입력 구분 코드를 설정한다.
+ * @param addrInptSeCd 주소 입력 구분 코드
+ * @return 현재 PayerQuery
+ */
+ public void setAddrInptSeCd(String addrInptSeCd) {
+ this.addrInptSeCd = addrInptSeCd;
+ }
+
+ /**도로명 코드를 반환한다.
+ * @return 도로명 코드
+ */
+ public String getRoadNmCd() {
+ return roadNmCd;
+ }
+
+ /**도로명 코드를 설정한다.
+ * @param roadNmCd 도로명 코드
+ * @return 현재 PayerQuery
+ */
+ public void setRoadNmCd(String roadNmCd) {
+ this.roadNmCd = roadNmCd;
+ }
+
+ /**주소를 반환한다.
+ * @return 주소
+ */
+ public String getAddr() {
+ return addr;
+ }
+
+ /**주소를 설정한다.
+ * @param addr 주소
+ * @return 현재 PayerQuery
+ */
+ public void setAddr(String addr) {
+ this.addr = addr;
+ }
+
+ /**상세 주소를 반환한다.
+ * @return 상세 주소
+ */
+ public String getDtlAddr() {
+ return dtlAddr;
+ }
+
+ /**상세 주소를 설정한다.
+ * @param dtlAddr 상세 주소
+ * @return 현재 PayerQuery
+ */
+ public void setDtlAddr(String dtlAddr) {
+ this.dtlAddr = dtlAddr;
+ }
+
+ public String getCrdnId() {
+ return ifEmpty(crdnId, () -> null);
+ }
+
+ public T setCrdnId(String crdnId) {
+ this.crdnId = crdnId;
+ return self();
+ }
+
+ public String getCallPurpose() {
+ return ifEmpty(callPurpose, () -> null);
+ }
+
+ public T setCallPurpose(String callPurpose) {
+ this.callPurpose = callPurpose;
+ return self();
+ }
+
+}
diff --git a/src/main/java/cokr/xit/fims/payer/dao/PayerAddrMapper.java b/src/main/java/cokr/xit/fims/payer/dao/PayerAddrMapper.java
new file mode 100644
index 00000000..26170fd0
--- /dev/null
+++ b/src/main/java/cokr/xit/fims/payer/dao/PayerAddrMapper.java
@@ -0,0 +1,67 @@
+package cokr.xit.fims.payer.dao;
+
+import java.util.List;
+
+import org.egovframe.rte.psl.dataaccess.mapper.Mapper;
+
+import cokr.xit.foundation.component.AbstractMapper;
+import cokr.xit.foundation.data.DataObject;
+import cokr.xit.fims.payer.Payer;
+import cokr.xit.fims.payer.PayerQuery;
+
+/** 납부자 주소 정보 DAO
+ *
+ *
상세 설명:
+ *
+ *
+ * ============ 변경 이력 ============
+ * 2024-05-23 JoJH 최초 작성
+ * ================================
+ *
+ */
+@Mapper("payerAddrMapper")
+public interface PayerAddrMapper extends AbstractMapper {
+
+ /**지정한 조건에 따라 납부자 주소 목록을 조회하여 반환한다.
+ * @param req 납부자 주소 조회 조건
+ * @return 납부자 주소 목록
+ */
+ List selectPayerAddrList(PayerQuery req);
+
+ /**지정한 조건에 따라 납부자 주소 객체들을 반환한다.
+ * @param req 납부자 주소 조회 조건
+ * @return 납부자 주소 객체 목록
+ */
+ List selectPayerAddrs(PayerQuery req);
+
+ /**지정한 조건에 따라 납부자 주소 정보를 반환한다.
+ * @param req 부과제외 조회 조건
+ * @return 납부자 주소 정보
+ */
+ List selectPayerAddrInfo(PayerQuery req);
+
+ /**납부자 주소 정보를 등록한다.
+ * @param params 파라미터
+ *
"payerAddr" - 납부자 주소
+ *
"currentUser" - 현재 접속한 사용자
+ *
+ * @return 저장된 정보수
+ */
+ int insertPayerAddr(Payer payer);
+
+ /**납부자 주소 정보를 수정한다.
+ * @param params 파라미터
+ *
"payerAddr" - 납부자 주소
+ *
"currentUser" - 현재 접속한 사용자
+ *
+ * @return 저장된 정보수
+ */
+ int updatePayerAddr(Payer payer);
+
+ /**지정한 조건에 따라 납부자 주소 변경 이력 객체들을 반환한다.
+ * @param req 납부자 대장 조회 조건
+ * @return 납부자 대장 객체 목록
+ */
+ List selectPayerAddrHstrys(PayerQuery req);
+
+}
diff --git a/src/main/java/cokr/xit/fims/payer/dao/PayerMapper.java b/src/main/java/cokr/xit/fims/payer/dao/PayerMapper.java
new file mode 100644
index 00000000..ef5f113a
--- /dev/null
+++ b/src/main/java/cokr/xit/fims/payer/dao/PayerMapper.java
@@ -0,0 +1,117 @@
+package cokr.xit.fims.payer.dao;
+
+import java.util.List;
+import java.util.Map;
+
+import org.egovframe.rte.psl.dataaccess.mapper.Mapper;
+
+import cokr.xit.fims.payer.Payer;
+import cokr.xit.fims.payer.PayerQuery;
+import cokr.xit.foundation.component.AbstractMapper;
+import cokr.xit.foundation.data.DataObject;
+
+/** 납부자 대장 정보 DAO
+ *
+ *
상세 설명:
+ *
+ *
+ * ============ 변경 이력 ============
+ * 2023-08-18 mjkhan 최초 작성
+ * ================================
+ *
+ */
+@Mapper("payerMapper")
+public interface PayerMapper extends AbstractMapper {
+ /**지정한 조건에 따라 납부자 대장 목록을 조회하여 반환한다.
+ * @param req 납부자 대장 조회 조건
+ * @return 납부자 대장 목록
+ */
+ List selectPayerList(PayerQuery req);
+
+ /**지정한 조건에 따라 납부자 대장 객체들을 반환한다.
+ * @param req 납부자 대장 조회 조건
+ * @return 납부자 대장 객체 목록
+ */
+ List selectPayers(PayerQuery req);
+
+ /**납부자 대장 정보를 등록한다.
+ * @param payer 납부자 대장
+ * @return 저장된 정보수
+ */
+ int insertPayer(Map params);
+
+ /**납부자 대장 정보를 등록한다.
+ * @param payer 납부자 대장
+ * @return 저장 여부
+ *