diff --git a/src/main/java/cokr/xit/fims/crdn/Crdn.java b/src/main/java/cokr/xit/fims/crdn/Crdn.java
new file mode 100644
index 00000000..4c96f4d4
--- /dev/null
+++ b/src/main/java/cokr/xit/fims/crdn/Crdn.java
@@ -0,0 +1,400 @@
+package cokr.xit.fims.crdn;
+
+import cokr.xit.foundation.AbstractEntity;
+import lombok.Getter;
+import lombok.Setter;
+
+/**단속 자료 정보
+ * @author leebj
+ */
+@Getter
+@Setter
+public class Crdn extends AbstractEntity {
+ public static String INF_TYPE = "100";
+
+ /**
+ * 단속 ID
+ */
+ private String crdnId;
+
+ /**
+ * 시군구 코드
+ */
+ private String sggCd;
+
+ /**
+ * 업무 구분 코드
+ */
+ private String taskSeCd;
+
+ /**
+ * 단속 등록 구분 코드
+ */
+ private String crdnRegSeCd;
+
+ /**
+ * 단속 입력 구분 코드
+ */
+ private String crdnInptSeCd;
+
+ /**
+ * 연계 ID
+ */
+ private String linkId;
+
+ /**
+ * 단속 구분 코드
+ */
+ private String crdnSeCd;
+
+ /**
+ * 납부자 ID
+ */
+ private String rtpyrId;
+
+ /**
+ * 주소 일련번호
+ */
+ private String addrSn;
+
+ /**
+ * 단속 일자
+ */
+ private String crdnYmd;
+
+ /**
+ * 단속 시각
+ */
+ private String crdnTm;
+
+ /**
+ * 차량번호
+ */
+ private String vhrno;
+
+ /**
+ * 단속 법정동 명
+ */
+ private String crdnStdgNm;
+
+ /**
+ * 단속 도로 명
+ */
+ private String crdnRoadNm;
+
+ /**
+ * 단속 장소
+ */
+ private String crdnPlc;
+
+ /**
+ * 상세 단속 장소
+ */
+ private String dtlCrdnPlc;
+
+ /**
+ * 조 ID
+ */
+ private String teamId;
+
+ /**
+ * 위반 ID
+ */
+ private String vltnId;
+
+ /**
+ * 단속 특별구역 코드
+ */
+ private String crdnSpareaCd;
+
+ /**
+ * 단속 시작 시각
+ */
+ private String crdnBgngTm;
+
+ /**
+ * 단속 종료 시간
+ */
+ private String crdnEndTm;
+
+ /**
+ * 단속 일련번호
+ */
+ private String crdnSn;
+
+ /**
+ * GPS X
+ */
+ private String gpsX;
+
+ /**
+ * GPS Y
+ */
+ private String gpsY;
+
+ /**
+ * 모자이크 X
+ */
+ private String moscX;
+
+ /**
+ * 모자이크 Y
+ */
+ private String moscY;
+
+ /**
+ * 견인 여부
+ */
+ private String towngYn;
+
+ /**
+ * 첨부 파일 수
+ */
+ private Integer atchFileCnt;
+
+ /**
+ * 차대번호
+ */
+ private String vin;
+
+ /**
+ * 말소등록일자
+ */
+ private String ersrRegYmd;
+
+ /**
+ * 차량 명
+ */
+ private String vhclNm;
+
+ /**
+ * 차량 색상
+ */
+ private String vhclColr;
+
+ /**
+ * 사용 연료 코드
+ */
+ private String useFuelCd;
+
+ /**
+ * 과태료 차종 코드
+ */
+ private String ffnlgCarmdlCd;
+
+ /**
+ * 주차 가능 결과 코드
+ */
+ private String prkPsbltyRsltCd;
+
+ /**
+ * 위반 횟수
+ */
+ private String vltnNmtm;
+
+ /**
+ * 시간외 여부
+ */
+ private String ovtmYn;
+
+ /**
+ * 시간외 분할 여부
+ */
+ private String ovtmPrttnYn;
+
+ /**
+ * 과태료 단속 금액
+ */
+ private Integer ffnlgCrdnAmt;
+
+ /**
+ * 과태료 감경율
+ */
+ private String ffnlgRdcrt;
+
+ /**
+ * 과태료 금액
+ */
+ private Integer ffnlgAmt;
+
+ /**
+ * 사전통지 시작 일자
+ */
+ private String advntceBgngYmd;
+
+ /**
+ * 사전통지 납기 일자
+ */
+ private String advntceDudtYmd;
+
+ /**
+ * 사전통지 금액
+ */
+ private Integer advntceAmt;
+
+ /**
+ * 의견 제출 여부
+ */
+ private String opnnSbmsnYn;
+
+ /**
+ * 기타 내용
+ */
+ private String etcCn;
+
+ /**
+ * 부과 ID
+ */
+ private String levyId;
+
+ /**
+ * 단속 상태 코드
+ */
+ private String crdnSttsCd;
+
+ /**
+ * 단속 상태 변경 일시
+ */
+ private String crdnSttsChgDt;
+
+ /**
+ * 가산 금액
+ */
+ private Integer adtnAmt;
+
+ /**
+ * 감경 금액
+ */
+ private Integer minusAmt;
+
+ /**
+ * 수납 금액
+ */
+ private Integer rcvmtAmt;
+
+ /**
+ * 이전 단속 ID
+ */
+ private String bfrCrdnId;
+
+ /**
+ * 세외수입 단속 연계 여부
+ */
+ private String nxrpCrdnLinkYn;
+
+ /**
+ * 세외수입 단속 연계 사용자 ID
+ */
+ private String nxrpCrdnLinkUserId;
+
+ /**
+ * 세외수입 단속 연계 일시
+ */
+ private String nxrpCrdnLinkDt;
+
+ /**
+ * 세외수입 대장 키
+ */
+ private String nxrpAcbKey;
+
+ /**
+ * 삭제 여부
+ */
+ private String delYn;
+
+ /**
+ * 삭제 일시
+ */
+ private String delDt;
+
+ /**
+ * 삭제자
+ */
+ private String dltr;
+
+ /**
+ * 삭제 사유
+ */
+ private String delRsn;
+
+ /**
+ * 연계 테이블 명
+ */
+ private String linkTblNm;
+
+ /**
+ * 민원 연계 여부
+ */
+ private String cvlcptLinkYn;
+
+ /**
+ * 위반코드
+ */
+ private String vltnCd;
+
+ /**
+ * 납부자 구분 코드
+ */
+ private String rtpyrSeCd;
+
+ /**
+ * 납부자 명
+ */
+ private String rtpyrNm;
+
+ /**
+ * 납부자 번호
+ */
+ private String rtpyrNo;
+
+ /**
+ * 납부자 우편번호
+ */
+ private String zip;
+
+ /**
+ * 납부자 주소
+ */
+ private String addr;
+
+ /**
+ * 납부자 상세주소
+ */
+ private String dtlAddr;
+
+ /**
+ * 부과 제외 구분 코드
+ */
+ private String levyExclSeCd;
+
+ /**
+ * 부과 제외 사유 코드
+ */
+ private String levyExclRsnCd;
+
+ /**
+ * 부과 제외 일자
+ */
+ private String levyExclYmd;
+
+ /**
+ * 조원1
+ */
+ private String teamer1;
+
+ /**
+ * 조원2
+ */
+ private String teamer2;
+
+ /**
+ * 조원3
+ */
+ private String teamer3;
+
+ /**
+ * 조원4
+ */
+ private String teamer4;
+
+}
diff --git a/src/main/java/cokr/xit/fims/crdn/CrdnQuery.java b/src/main/java/cokr/xit/fims/crdn/CrdnQuery.java
new file mode 100644
index 00000000..f907970e
--- /dev/null
+++ b/src/main/java/cokr/xit/fims/crdn/CrdnQuery.java
@@ -0,0 +1,447 @@
+package cokr.xit.fims.crdn;
+
+import cokr.xit.fims.cmmn.CmmnQuery;
+
+/**단속 대장 정보 조회 요청
+*
+*
상세 설명:
+*
+*
+* ============ 변경 이력 ============
+* 2023-06-23 leebj 최초 작성
+* ================================
+*
+*/
+public class CrdnQuery extends CmmnQuery {
+
+ private static final long serialVersionUID = 1L;
+
+ //조회유형
+ private String gridType;
+ private String inspectionDataType;
+
+ //현재정보
+ private String currentUserId;
+ private String currentUserAcnt;
+ private String currentInstitute;
+
+ //ID
+ private String crdnId;
+ private String[] crdnIds;
+ private String amtDcsnCdGroupId;
+ private String dtlAmtDcsnGroupId;
+ private String fileLayoutId;
+
+ //날짜
+ private String aplcnYmd;
+ private String schCvlcptRcptYmdFrom;
+ private String schCvlcptRcptYmdTo;
+ private String schCvlcptPrcsPrnmntDtFrom;
+ private String schCvlcptPrcsPrnmntDtTo;
+ private String schRdctYmdFrom;
+ private String schRdctYmdTo;
+ private String crdnYmd;
+ private String schCrdnYmdFrom;
+ private String schCrdnYmdTo;
+ private String schDmndYmdFrom;
+ private String schDmndYmdTo;
+
+ //from, to
+ private Integer schCrdnCntFrom;
+ private Integer schCrdnCntTo;
+
+ //코드
+ private String amtDcsnCd;
+ private String dtlAmtDcsnCd;
+ private String crdnInptSeCd;
+ private String cvlcptPrcsCd;
+ private String crdnSttsCd;
+ private String ansSeCd;
+ private String ansRsnCd;
+
+ //포함, 제외, 특정 자료
+ private String schOnlySamePlace;
+ private String schOnlyUnpay;
+ private String schExclEnd;
+ private String schExclOvtime;
+
+ //YN
+ private String dstrbncYn;
+ private String towngYn;
+
+ //기타
+ private String vhrno;
+ private String cvlcptPrcsPicNm;
+ private String teamNm;
+ private String nxrpSendStts;
+
+ public String getGridType() {
+ return ifEmpty(gridType, () -> null);
+ }
+
+ public T setGridType(String gridType) {
+ this.gridType = gridType;
+ return self();
+ }
+
+ public String getCurrentUserId() {
+ return ifEmpty(currentUserId, () -> null);
+ }
+
+ public T setCurrentUserId(String currentUserId) {
+ this.currentUserId = currentUserId;
+ return self();
+ }
+
+ public String getCurrentUserAcnt() {
+ return ifEmpty(currentUserAcnt, () -> null);
+ }
+
+ public T setCurrentUserAcnt(String currentUserAcnt) {
+ this.currentUserAcnt = currentUserAcnt;
+ return self();
+ }
+
+ public String getCurrentInstitute() {
+ return ifEmpty(currentInstitute, () -> null);
+ }
+
+ public T setCurrentInstitute(String currentInstitute) {
+ this.currentInstitute = currentInstitute;
+ return self();
+ }
+
+ public String getInspectionDataType() {
+ return ifEmpty(inspectionDataType, () -> null);
+ }
+
+ public T setInspectionDataType(String inspectionDataType) {
+ this.inspectionDataType = inspectionDataType;
+ return self();
+ }
+
+ public String getCrdnId() {
+ return ifEmpty(crdnId, () -> null);
+ }
+
+ public T setCrdnId(String crdnId) {
+ this.crdnId = crdnId;
+ return self();
+ }
+
+ public String[] getCrdnIds() {
+ return ifEmpty(crdnIds, () -> null);
+ }
+
+ public T setCrdnIds(String... crdnIds) {
+ this.crdnIds = crdnIds;
+ return self();
+ }
+
+ public String getDstrbncYn() {
+ return ifEmpty(dstrbncYn, () -> null);
+ }
+
+ public T setDstrbncYn(String dstrbncYn) {
+ this.dstrbncYn = dstrbncYn;
+ return self();
+ }
+
+ public String getTowngYn() {
+ return ifEmpty(towngYn, () -> null);
+ }
+
+ public T setTowngYn(String towngYn) {
+ this.towngYn = towngYn;
+ return self();
+ }
+
+ public String getVhrno() {
+ return ifEmpty(vhrno, () -> null);
+ }
+
+ public T setVhrno(String vhrno) {
+ this.vhrno = vhrno;
+ return self();
+ }
+
+ public String getCvlcptPrcsPicNm() {
+ return ifEmpty(cvlcptPrcsPicNm, () -> null);
+ }
+
+ public T setCvlcptPrcsPicNm(String cvlcptPrcsPicNm) {
+ this.cvlcptPrcsPicNm = cvlcptPrcsPicNm;
+ return self();
+ }
+
+ public String getTeamNm() {
+ return ifEmpty(teamNm, () -> null);
+ }
+
+ public T setTeamNm(String teamNm) {
+ this.teamNm = teamNm;
+ return self();
+ }
+
+ public String getSchCvlcptRcptYmdFrom() {
+ return ifEmpty(schCvlcptRcptYmdFrom, () -> null);
+ }
+
+ public T setSchCvlcptRcptYmdFrom(String schCvlcptRcptYmdFrom) {
+ this.schCvlcptRcptYmdFrom = schCvlcptRcptYmdFrom;
+ return self();
+ }
+
+ public String getSchCvlcptRcptYmdTo() {
+ return ifEmpty(schCvlcptRcptYmdTo, () -> null);
+ }
+
+ public T setSchCvlcptRcptYmdTo(String schCvlcptRcptYmdTo) {
+ this.schCvlcptRcptYmdTo = schCvlcptRcptYmdTo;
+ return self();
+ }
+
+ public String getSchCvlcptPrcsPrnmntDtFrom() {
+ return ifEmpty(schCvlcptPrcsPrnmntDtFrom, () -> null);
+ }
+
+ public T setSchCvlcptPrcsPrnmntDtFrom(String schCvlcptPrcsPrnmntDtFrom) {
+ this.schCvlcptPrcsPrnmntDtFrom = schCvlcptPrcsPrnmntDtFrom;
+ return self();
+ }
+
+ public String getSchCvlcptPrcsPrnmntDtTo() {
+ return ifEmpty(schCvlcptPrcsPrnmntDtTo, () -> null);
+ }
+
+ public T setSchCvlcptPrcsPrnmntDtTo(String schCvlcptPrcsPrnmntDtTo) {
+ this.schCvlcptPrcsPrnmntDtTo = schCvlcptPrcsPrnmntDtTo;
+ return self();
+ }
+
+ public String getSchRdctYmdFrom() {
+ return ifEmpty(schRdctYmdFrom, () -> null);
+ }
+
+ public T setSchRdctYmdFrom(String schRdctYmdFrom) {
+ this.schRdctYmdFrom = schRdctYmdFrom;
+ return self();
+ }
+
+ public String getSchRdctYmdTo() {
+ return ifEmpty(schRdctYmdTo, () -> null);
+ }
+
+ public T setSchRdctYmdTo(String schRdctYmdTo) {
+ this.schRdctYmdTo = schRdctYmdTo;
+ return self();
+ }
+
+ public String getCrdnYmd() {
+ return ifEmpty(crdnYmd, () -> null);
+ }
+
+ public T setCrdnYmd(String crdnYmd) {
+ this.crdnYmd = crdnYmd;
+ return self();
+ }
+
+ public String getSchCrdnYmdFrom() {
+ return ifEmpty(schCrdnYmdFrom, () -> null);
+ }
+
+ public T setSchCrdnYmdFrom(String schCrdnYmdFrom) {
+ this.schCrdnYmdFrom = schCrdnYmdFrom;
+ return self();
+ }
+
+ public String getSchCrdnYmdTo() {
+ return ifEmpty(schCrdnYmdTo, () -> null);
+ }
+
+ public T setSchCrdnYmdTo(String schCrdnYmdTo) {
+ this.schCrdnYmdTo = schCrdnYmdTo;
+ return self();
+ }
+
+ public String getSchDmndYmdFrom() {
+ return ifEmpty(schDmndYmdFrom, () -> null);
+ }
+
+ public T setSchDmndYmdFrom(String schDmndYmdFrom) {
+ this.schDmndYmdFrom = schDmndYmdFrom;
+ return self();
+ }
+
+ public String getSchDmndYmdTo() {
+ return ifEmpty(schDmndYmdTo, () -> null);
+ }
+
+ public T setSchDmndYmdTo(String schDmndYmdTo) {
+ this.schDmndYmdTo = schDmndYmdTo;
+ return self();
+ }
+
+ public Integer getSchCrdnCntFrom() {
+ return ifEmpty(schCrdnCntFrom, () -> null);
+ }
+
+ public T setSchCrdnCntFrom(Integer schCrdnCntFrom) {
+ this.schCrdnCntFrom = schCrdnCntFrom;
+ return self();
+ }
+
+ public Integer getSchCrdnCntTo() {
+ return ifEmpty(schCrdnCntTo, () -> null);
+ }
+
+ public T setSchCrdnCntTo(Integer schCrdnCntTo) {
+ this.schCrdnCntTo = schCrdnCntTo;
+ return self();
+ }
+
+ public String getSchOnlySamePlace() {
+ return ifEmpty(schOnlySamePlace, () -> null);
+ }
+
+ public T setSchOnlySamePlace(String schOnlySamePlace) {
+ this.schOnlySamePlace = schOnlySamePlace;
+ return self();
+ }
+
+ public String getSchOnlyUnpay() {
+ return ifEmpty(schOnlyUnpay, () -> null);
+ }
+
+ public T setSchOnlyUnpay(String schOnlyUnpay) {
+ this.schOnlyUnpay = schOnlyUnpay;
+ return self();
+ }
+
+ public String getSchExclEnd() {
+ return ifEmpty(schExclEnd, () -> null);
+ }
+
+ public T setSchExclEnd(String schExclEnd) {
+ this.schExclEnd = schExclEnd;
+ return self();
+ }
+
+ public String getSchExclOvtime() {
+ return ifEmpty(schExclOvtime, () -> null);
+ }
+
+ public T setSchExclOvtime(String schExclOvtime) {
+ this.schExclOvtime = schExclOvtime;
+ return self();
+ }
+
+ public String getCrdnInptSeCd() {
+ return ifEmpty(crdnInptSeCd, () -> null);
+ }
+
+ public T setCrdnInptSeCd(String crdnInptSeCd) {
+ this.crdnInptSeCd = crdnInptSeCd;
+ return self();
+ }
+
+ public String getCvlcptPrcsCd() {
+ return ifEmpty(cvlcptPrcsCd, () -> null);
+ }
+
+ public T setCvlcptPrcsCd(String cvlcptPrcsCd) {
+ this.cvlcptPrcsCd = cvlcptPrcsCd;
+ return self();
+ }
+
+ public String getCrdnSttsCd() {
+ return ifEmpty(crdnSttsCd, () -> null);
+ }
+
+ public T setCrdnSttsCd(String crdnSttsCd) {
+ this.crdnSttsCd = crdnSttsCd;
+ return self();
+ }
+
+ public String getAnsSeCd() {
+ return ifEmpty(ansSeCd, () -> null);
+ }
+
+ public T setAnsSeCd(String ansSeCd) {
+ this.ansSeCd = ansSeCd;
+ return self();
+ }
+
+ public String getAnsRsnCd() {
+ return ifEmpty(ansRsnCd, () -> null);
+ }
+
+ public T setAnsRsnCd(String ansRsnCd) {
+ this.ansRsnCd = ansRsnCd;
+ return self();
+ }
+
+ public String getAplcnYmd() {
+ return ifEmpty(aplcnYmd, () -> null);
+ }
+
+ public T setAplcnYmd(String aplcnYmd) {
+ this.aplcnYmd = aplcnYmd;
+ return self();
+ }
+
+ public String getAmtDcsnCdGroupId() {
+ return ifEmpty(amtDcsnCdGroupId, () -> null);
+ }
+
+ public T setAmtDcsnCdGroupId(String amtDcsnCdGroupId) {
+ this.amtDcsnCdGroupId = amtDcsnCdGroupId;
+ return self();
+ }
+
+ public String getAmtDcsnCd() {
+ return ifEmpty(amtDcsnCd, () -> null);
+ }
+
+ public T setAmtDcsnCd(String amtDcsnCd) {
+ this.amtDcsnCd = amtDcsnCd;
+ return self();
+ }
+
+ public String getDtlAmtDcsnGroupId() {
+ return ifEmpty(dtlAmtDcsnGroupId, () -> null);
+ }
+
+ public T setDtlAmtDcsnGroupId(String dtlAmtDcsnGroupId) {
+ this.dtlAmtDcsnGroupId = dtlAmtDcsnGroupId;
+ return self();
+ }
+
+ public String getFileLayoutId() {
+ return ifEmpty(fileLayoutId, () -> null);
+ }
+
+ public T setFileLayoutId(String fileLayoutId) {
+ this.fileLayoutId = fileLayoutId;
+ return self();
+ }
+
+ public String getDtlAmtDcsnCd() {
+ return ifEmpty(dtlAmtDcsnCd, () -> null);
+ }
+
+ public T setDtlAmtDcsnCd(String dtlAmtDcsnCd) {
+ this.dtlAmtDcsnCd = dtlAmtDcsnCd;
+ return self();
+ }
+
+ public String getNxrpSendStts() {
+ return ifEmpty(nxrpSendStts, () -> null);
+ }
+
+ public T setNxrpSendStts(String nxrpSendStts) {
+ this.nxrpSendStts = nxrpSendStts;
+ return self();
+ }
+
+}
diff --git a/src/main/java/cokr/xit/fims/crdn/ExmptnVhcl.java b/src/main/java/cokr/xit/fims/crdn/ExmptnVhcl.java
new file mode 100644
index 00000000..40678bef
--- /dev/null
+++ b/src/main/java/cokr/xit/fims/crdn/ExmptnVhcl.java
@@ -0,0 +1,99 @@
+package cokr.xit.fims.crdn;
+
+import cokr.xit.foundation.AbstractEntity;
+import lombok.Getter;
+import lombok.Setter;
+
+/**면제차량 정보
+ * @author leebj
+ */
+@Getter
+@Setter
+public class ExmptnVhcl extends AbstractEntity {
+
+ /**
+ * 면제차량 ID
+ */
+ private String exmptnVhclId;
+
+ /**
+ * 이력 일련번호
+ */
+ private String hstrySn;
+
+ /**
+ * 시군구 코드
+ */
+ private String sggCd;
+
+ /**
+ * 차량번호
+ */
+ private String vhrno;
+
+ /**
+ * 면제 사유
+ */
+ private String exmptnRsn;
+
+ /**
+ * 문서 번호
+ */
+ private String docNo;
+
+ /**
+ * 소유자 명
+ */
+ private String ownrNm;
+
+ /**
+ * 면제 시작 일자
+ */
+ private String exmptnBgngYmd;
+
+ /**
+ * 면제 종료 일자
+ */
+ private String exmptnEndYmd;
+
+ /**
+ * 삭제 여부
+ */
+ private String delYn;
+
+ /**
+ * 등록 일시
+ */
+ private String regDt;
+
+ /**
+ * 등록자
+ */
+ private String rgtr;
+
+ /**
+ * 수정 일시
+ */
+ private String mdfcnDt;
+
+ /**
+ * 수정자
+ */
+ private String mdfr;
+
+ /**
+ * 삭제 일시
+ */
+ private String delDt;
+
+ /**
+ * 삭제자
+ */
+ private String dltr;
+
+ /**
+ * 삭제 사유
+ */
+ private String delRsn;
+
+}
diff --git a/src/main/java/cokr/xit/fims/crdn/Team.java b/src/main/java/cokr/xit/fims/crdn/Team.java
new file mode 100644
index 00000000..543de8b3
--- /dev/null
+++ b/src/main/java/cokr/xit/fims/crdn/Team.java
@@ -0,0 +1,88 @@
+package cokr.xit.fims.crdn;
+
+import cokr.xit.foundation.AbstractEntity;
+import lombok.Getter;
+import lombok.Setter;
+
+/**단속팀 정보
+ * @author leebj
+ */
+@Getter
+@Setter
+public class Team extends AbstractEntity {
+
+ /**
+ * 단속팀 ID
+ */
+ private String teamId;
+
+ /**
+ * 시군구 코드
+ */
+ private String sggCd;
+
+ /**
+ * 업무 구분 코드
+ */
+ private String taskSeCd;
+
+ /**
+ * 단속 구분 코드
+ */
+ private String crdnSeCd;
+
+ /**
+ * 조 명
+ */
+ private String teamNm;
+
+ /**
+ * 조원1
+ */
+ private String teamer1;
+
+ /**
+ * 조원2
+ */
+ private String teamer2;
+
+ /**
+ * 조원3
+ */
+ private String teamer3;
+
+ /**
+ * 조원4
+ */
+ private String teamer4;
+
+ /**
+ * 기타 내용
+ */
+ private String etcCn;
+
+ /**
+ * 사용 여부
+ */
+ private String useYn;
+
+ /**
+ * 등록일시
+ */
+ private String regDt;
+
+ /**
+ * 등록자
+ */
+ private String rgtr;
+
+ /**
+ * 수정일시
+ */
+ private String mdfcnDt;
+
+ /**
+ * 수정자
+ */
+ private String mdfr;
+}
diff --git a/src/main/java/cokr/xit/fims/crdn/dao/CrdnInfoMapper.java b/src/main/java/cokr/xit/fims/crdn/dao/CrdnInfoMapper.java
new file mode 100644
index 00000000..4da56bf0
--- /dev/null
+++ b/src/main/java/cokr/xit/fims/crdn/dao/CrdnInfoMapper.java
@@ -0,0 +1,20 @@
+package cokr.xit.fims.crdn.dao;
+
+import org.egovframe.rte.psl.dataaccess.mapper.Mapper;
+
+import cokr.xit.foundation.component.AbstractMapper;
+import cokr.xit.foundation.data.DataObject;
+
+/**단속 정보 조회 DAO
+ * @author leebj
+ */
+@Mapper("crdnInfoMapper")
+public interface CrdnInfoMapper extends AbstractMapper {
+
+ /**단속 대장 정보를 조회한다.
+ * @param crdnId 단속 아이디
+ * @return 단속 정보
+ */
+ DataObject selectCrdnInfo(String crdnId);
+
+}
diff --git a/src/main/java/cokr/xit/fims/crdn/dao/CrdnInstMapper.java b/src/main/java/cokr/xit/fims/crdn/dao/CrdnInstMapper.java
new file mode 100644
index 00000000..ad0d5373
--- /dev/null
+++ b/src/main/java/cokr/xit/fims/crdn/dao/CrdnInstMapper.java
@@ -0,0 +1,32 @@
+package cokr.xit.fims.crdn.dao;
+
+import org.egovframe.rte.psl.dataaccess.mapper.Mapper;
+
+import cokr.xit.fims.crdn.Crdn;
+import cokr.xit.foundation.component.AbstractMapper;
+
+/**단속 자료 등록 DAO
+ * @author leebj
+ */
+@Mapper("crdnInstMapper")
+public interface CrdnInstMapper extends AbstractMapper {
+
+ /**단속 대장 정보를 등록한다.
+ * @param params 파라미터
+ * "crdn" - 단속 대장
+ * "currentUser" - 현재 접속한 사용자
+ *
+ * @return 저장된 정보수
+ */
+ int insertCrdn(Crdn crdn);
+
+ /**단속 부가 정보를 등록한다.
+ * @param params 파라미터
+ * "crdn" - 단속 부가 정보
+ * "currentUser" - 현재 접속한 사용자
+ *
+ * @return 저장된 정보수
+ */
+ int insertCrdnAddition(Crdn crdn);
+
+}
diff --git a/src/main/java/cokr/xit/fims/crdn/dao/CrdnListMapper.java b/src/main/java/cokr/xit/fims/crdn/dao/CrdnListMapper.java
new file mode 100644
index 00000000..bf320171
--- /dev/null
+++ b/src/main/java/cokr/xit/fims/crdn/dao/CrdnListMapper.java
@@ -0,0 +1,65 @@
+package cokr.xit.fims.crdn.dao;
+
+import java.util.List;
+
+import org.egovframe.rte.psl.dataaccess.mapper.Mapper;
+
+import cokr.xit.fims.crdn.CrdnQuery;
+import cokr.xit.foundation.component.AbstractMapper;
+import cokr.xit.foundation.data.DataObject;
+
+/**단속 대장 목록 조회 DAO
+ * @author leebj
+ */
+@Mapper("crdnListMapper")
+public interface CrdnListMapper extends AbstractMapper {
+
+ /**금일 등록한 단속자료 목록을 조회한다.
+ * {@link cokr.xit.fims.crdn.service.bean.CrdnService#getCrackdownList(CrdnQuery)} 참고
+ * @param query 단속자료 목록 조회 조건
+ * @return 단속자료 목록
+ */
+ List selectTodayCrackdownList(CrdnQuery query);
+
+ /**단속자료 목록을 조회한다.
+ * {@link cokr.xit.fims.crdn.service.bean.CrdnService#getCrackdownList(CrdnQuery)} 참고
+ * @param query 단속자료 목록 조회 조건
+ * @return 단속자료 목록
+ */
+ List selectCrackdownList(CrdnQuery query);
+
+ /**단속사진 검사 자료 목록을 조회한다.
+ * {@link cokr.xit.fims.crdn.service.bean.CrdnService#getCrackdownList(CrdnQuery)} 참고
+ * @param query 단속사진 검사 자료 목록 조회 조건
+ * @return 단속사진 검사 자료 목록
+ */
+ List selectPhotoInspectionDataList(CrdnQuery query);
+
+ /**동일 차량 단속 그룹 목록을 조회한다.
+ * {@link cokr.xit.fims.crdn.service.bean.CrdnService#getCrackdownList(CrdnQuery)} 참고
+ * @param query 동일 차량 단속 그룹 목록 조회 조건
+ * @return 동일 차량 단속 그룹 목록
+ */
+ List selectSameVehicleMainList(CrdnQuery query);
+
+ /**동일 차량 단속 자료 목록을 조회한다.
+ * {@link cokr.xit.fims.crdn.service.bean.CrdnService#getCrackdownList(CrdnQuery)} 참고
+ * @param query 동일 차량 단속 자료 목록 조회 조건
+ * @return 동일 차량 단속 자료 목록
+ */
+ List selectSameVehicleSubList(CrdnQuery query);
+
+ /**표지정보 미확인 자료 목록을 조회한다.
+ * {@link cokr.xit.fims.crdn.service.bean.CrdnService#getCrackdownList(CrdnQuery)} 참고
+ * @param query 표지정보 미확인 자료 목록 조회 조건
+ * @return 표지정보 미확인 자료 목록
+ */
+ List selectTagInformationUndefinedDataList(CrdnQuery query);
+
+ /**단속 건수를 반환한다.
+ * @param crdnQuery 조회조건
+ * @return 단속 건수
+ */
+ int countCrdn(CrdnQuery crdnQuery);
+
+}
diff --git a/src/main/java/cokr/xit/fims/crdn/dao/CrdnStngMapper.java b/src/main/java/cokr/xit/fims/crdn/dao/CrdnStngMapper.java
new file mode 100644
index 00000000..6e913d3e
--- /dev/null
+++ b/src/main/java/cokr/xit/fims/crdn/dao/CrdnStngMapper.java
@@ -0,0 +1,35 @@
+package cokr.xit.fims.crdn.dao;
+
+import java.util.List;
+import java.util.Map;
+
+import org.egovframe.rte.psl.dataaccess.mapper.Mapper;
+
+import cokr.xit.fims.crdn.CrdnQuery;
+import cokr.xit.foundation.component.AbstractMapper;
+
+@Mapper("crdnStngMapper")
+public interface CrdnStngMapper extends AbstractMapper {
+
+ /**기본금액을 조회한다.
+ * {@link cokr.xit.fims.crdn.service.bean.CrdnStngBean#getBasicAmt(CrdnQuery)} 참고
+ * @param query 단속자료 정보
+ * @return 기본금액
+ */
+ String selectBasicAmt(CrdnQuery query);
+
+ /**시군구코드에 따른 법정동명 목록을 조회한다.
+ * @param sggCd 시군구코드
+ * @return 법정동 목록
+ */
+ List selectStdgNmList(String sggCd);
+
+ /**법정동명으로 법정동코드를 조회한다.
+ * @param map 시군구코드 및 법정동명
+ * @return 법정동코드 목록
+ */
+ List selectStdgCdListByStdgNm(Map map);
+
+
+
+}
\ No newline at end of file
diff --git a/src/main/java/cokr/xit/fims/crdn/dao/CrdnTeamMapper.java b/src/main/java/cokr/xit/fims/crdn/dao/CrdnTeamMapper.java
new file mode 100644
index 00000000..745baf0e
--- /dev/null
+++ b/src/main/java/cokr/xit/fims/crdn/dao/CrdnTeamMapper.java
@@ -0,0 +1,57 @@
+package cokr.xit.fims.crdn.dao;
+
+import java.util.List;
+
+import org.egovframe.rte.psl.dataaccess.mapper.Mapper;
+
+import cokr.xit.fims.crdn.CrdnQuery;
+import cokr.xit.fims.crdn.Team;
+import cokr.xit.foundation.component.AbstractMapper;
+import cokr.xit.foundation.data.DataObject;
+
+@Mapper("crdnTeamMapper")
+public interface CrdnTeamMapper extends AbstractMapper {
+
+ /**단속팀 목록을 조회한다.
+ * @param query 단속팀 목록 조회 조건
+ * @return 단속팀 목록
+ */
+ List selectTeamList(CrdnQuery query);
+
+ /**비사용 단속팀 목록을 조회한다.
+ * @param query 비사용 단속팀 목록 조회 조건
+ * @return 비사용 단속팀 목록
+ */
+ List selectRemovedTeamList(CrdnQuery query);
+
+ /**단속팀 정보를 삭제한다.
+ * @param team 단속팀 정보
+ * @return 저장된 정보 수
+ */
+ int deleteTeamInfo(Team team);
+
+ /**단속팀 정보를 등록한다.
+ * @param team 단속팀 정보
+ * @return 저장된 정보 수
+ */
+ int insertTeamInfo(Team team);
+
+ /**단속팀 정보를 수정한다.
+ * @param team 단속팀 정보
+ * @return 저장된 정보 수
+ */
+ int updateTeamInfo(Team team);
+
+ /**단속팀명으로 단속팀 정보를 조회한다.
+ * @param team 단속팀 정보
+ * @return 단속팀 정보
+ */
+ DataObject selectTeamInfoByName(Team team);
+
+ /**단속팀 정보를 조회한다.
+ * @param teamId 단속팀 ID
+ * @return 단속팀 정보
+ */
+ DataObject selectTeamInfo(String teamId);
+
+}
diff --git a/src/main/java/cokr/xit/fims/crdn/dao/CrdnUpdtMapper.java b/src/main/java/cokr/xit/fims/crdn/dao/CrdnUpdtMapper.java
new file mode 100644
index 00000000..261db1aa
--- /dev/null
+++ b/src/main/java/cokr/xit/fims/crdn/dao/CrdnUpdtMapper.java
@@ -0,0 +1,95 @@
+package cokr.xit.fims.crdn.dao;
+
+import java.util.Map;
+
+import org.egovframe.rte.psl.dataaccess.mapper.Mapper;
+
+import cokr.xit.fims.crdn.Crdn;
+import cokr.xit.foundation.component.AbstractMapper;
+
+/**단속 관리 DAO
+ * @author leebj
+ */
+@Mapper("crdnUpdtMapper")
+public interface CrdnUpdtMapper extends AbstractMapper {
+ /**단속 상태를 변경한다.
+ * @param crdn 단속 대장
+ * @return 저장된 정보수
+ */
+ int updateCrdnStatus(Crdn crdn);
+
+ /**표지정보 미확인 자료를 확인 자료로 수정한다.
+ * @param crdn 단속 대장
+ * @return 저장된 정보수
+ */
+ int updateTagInfo(Crdn crdn);
+
+ /** 2시간 초과 여부를 변경한다.
+ * @param crdn 단속 대장
+ * @return 저장된 정보수
+ */
+ int updateOverTimeInfo(Crdn crdn);
+
+ /** 단속 자료의 금액을 변경한다.
+ * @param crdn 단속 대장
+ * @return 저장된 정보수
+ */
+ int updateCrdnAmt(Crdn crdn);
+
+ /** 단속 자료의 기타사항을 변경한다.
+ * @param crdn 단속 대장
+ * @return 저장된 정보수
+ */
+ int updateEtcCn(Crdn crdn);
+
+ /**단속정보를 변경한다.
+ * {@link cokr.xit.fims.crdn.service.bean.CrdnBean#update(Crdn)} 참고
+ * @param crdn 단속정보
+ * @return 저장된 정보수
+ */
+ int updateCrdn(Crdn crdn);
+
+ /**단속 부가 정보를 변경한다.
+ * {@link cokr.xit.fims.crdn.service.bean.CrdnBean#update(Crdn)} 참고
+ * @param crdn 단속정보
+ * @return 저장된 정보수
+ */
+ int updateCrdnAddition(Crdn crdn);
+
+ /**단속 정보를 변경한다.
+ * @param crdn 단속정보
+ * @return 저장된 정보수
+ */
+ int updateEditCrdn(Crdn crdn);
+
+ /** 단속 정보를 삭제한다.
+ * @param map 삭제 요청 파라미터
+ * @return 저장된 정보수
+ */
+ int deleteCrdn(Map map);
+
+ /** 단속 부가 정보를 삭제한다.
+ * @param map 삭제 요청 파라미터
+ * @return 저장된 정보수
+ */
+ int deleteCrdnAdi(Map map);
+
+ /** 단속 정보의 납부자 ID를 삭제한다.
+ * @param map 삭제 요청 파라미터
+ * @return 저장된 정보수
+ */
+ int deleteCrdnPayer(Crdn crdn);
+
+ /**
+ * @param
+ * @return 저장된 정보수
+ */
+ int updateNxrpCrdnLinkYn(Crdn crdn);
+
+ /** 단속 정보의 사전통지 일자를 변경한다.
+ * @param crdn 단속 대장
+ * @return 저장된 정보수
+ */
+ int updateAdvntceYmd(Crdn crdn);
+
+}
diff --git a/src/main/java/cokr/xit/fims/crdn/dao/ExmptnVhclMapper.java b/src/main/java/cokr/xit/fims/crdn/dao/ExmptnVhclMapper.java
new file mode 100644
index 00000000..1cb77dbb
--- /dev/null
+++ b/src/main/java/cokr/xit/fims/crdn/dao/ExmptnVhclMapper.java
@@ -0,0 +1,57 @@
+package cokr.xit.fims.crdn.dao;
+
+import java.util.List;
+
+import org.egovframe.rte.psl.dataaccess.mapper.Mapper;
+
+import cokr.xit.fims.crdn.CrdnQuery;
+import cokr.xit.fims.crdn.ExmptnVhcl;
+import cokr.xit.foundation.component.AbstractMapper;
+import cokr.xit.foundation.data.DataObject;
+
+@Mapper("exmptnVhclMapper")
+public interface ExmptnVhclMapper extends AbstractMapper {
+
+ /**면제차량 목록을 조회한다.
+ * @param query 면제차량 목록 조회 조건
+ * @return 면제차량 목록
+ */
+ List selectExemptionVehicleList(CrdnQuery query);
+
+ /**면제차량 정보를 조회한다.
+ * @param exemptionVehicleId 면제차량 ID
+ * @return 면제차량 정보
+ */
+ DataObject selectExemptionVehicleInfo(String exemptionVehicleId);
+
+ /**면제차량 정보를 등록한다.
+ * @param exmptnVhcl 면제차량 정보
+ * return 저장된 정보 수
+ */
+ int insertExemptionVehicleInfo(ExmptnVhcl exmptnVhcl);
+
+ /**면제차량 정보를 수정한다.
+ * @param exmptnVhcl 면제차량 정보
+ * return 저장된 정보 수
+ */
+ int updateExemptionVehicleInfo(ExmptnVhcl exmptnVhcl);
+
+ /**면제차량 정보를 삭제한다.
+ * @param exmptnVhcl 면제차량 정보
+ * return 저장된 정보 수
+ */
+ int deleteExemptionVehicleInfo(ExmptnVhcl exmptnVhcl);
+
+ /**면제차량 이력을 등록한다.
+ * @param exmptnVhcl 면제차량 정보
+ * return 저장된 정보 수
+ */
+ int insertExemptionVehicleHistory(ExmptnVhcl exmptnVhcl);
+
+ /**면제차량 이력을 조회한다.
+ * @param exemptionVehicleId 면제차량 ID
+ * @return 면제차량 이력
+ */
+ List selectExemptionVehicleHistoryList(String exmptnVhclId);
+
+}
diff --git a/src/main/java/cokr/xit/fims/crdn/service/bean/CrdnBean.java b/src/main/java/cokr/xit/fims/crdn/service/bean/CrdnBean.java
new file mode 100644
index 00000000..5c3096e0
--- /dev/null
+++ b/src/main/java/cokr/xit/fims/crdn/service/bean/CrdnBean.java
@@ -0,0 +1,412 @@
+package cokr.xit.fims.crdn.service.bean;
+
+import java.io.File;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import javax.annotation.Resource;
+
+import org.springframework.stereotype.Component;
+
+import cokr.xit.base.file.FileInfo;
+import cokr.xit.base.file.service.bean.FileBean;
+import cokr.xit.fims.cmmn.CmmnUtil;
+import cokr.xit.fims.cmmn.CrdnPayerHstry;
+import cokr.xit.fims.cmmn.CrdnSttsHstry;
+import cokr.xit.fims.cmmn.service.bean.CrdnPayerHstryBean;
+import cokr.xit.fims.cmmn.service.bean.CrdnSttsHstryBean;
+import cokr.xit.fims.crdn.Crdn;
+import cokr.xit.fims.crdn.Team;
+import cokr.xit.fims.crdn.dao.CrdnInfoMapper;
+import cokr.xit.fims.crdn.dao.CrdnInstMapper;
+import cokr.xit.fims.crdn.dao.CrdnTeamMapper;
+import cokr.xit.fims.crdn.dao.CrdnUpdtMapper;
+import cokr.xit.fims.excl.LevyExcl;
+import cokr.xit.fims.excl.service.bean.LevyExclBean;
+import cokr.xit.foundation.UserInfo;
+import cokr.xit.foundation.component.AbstractBean;
+import cokr.xit.foundation.data.DataObject;
+
+/** 단속 관리 Bean
+ * @author leebj
+ */
+@Component("crdnBean")
+public class CrdnBean extends AbstractBean {
+
+ @Resource(name = "crdnSttsHstryBean")
+ private CrdnSttsHstryBean crdnSttsHstryBean;
+
+ @Resource(name = "crdnPayerHstryBean")
+ private CrdnPayerHstryBean crdnPayerHstryBean;
+
+ @Resource(name = "fileBean")
+ private FileBean fileBean;
+
+ @Resource(name = "crdnStngBean")
+ private CrdnStngBean crdnStngBean;
+
+ @Resource(name = "crdnInfoMapper")
+ private CrdnInfoMapper crdnInfoMapper;
+
+ @Resource(name = "crdnInstMapper")
+ private CrdnInstMapper crdnInstMapper;
+
+ @Resource(name = "crdnUpdtMapper")
+ private CrdnUpdtMapper crdnUpdtMapper;
+
+ @Resource(name = "crdnTeamMapper")
+ private CrdnTeamMapper crdnTeamMapper;
+
+ @Resource(name = "levyExclBean")
+ protected LevyExclBean levyExclBean;
+
+ public boolean create(Map nonQueryRequest, Crdn crdn, List fileInfoList) {
+ if(fileInfoList != null && !fileInfoList.isEmpty()) {
+ crdn.setAtchFileCnt(fileInfoList.size());
+ } else {
+ crdn.setAtchFileCnt(0);
+ }
+
+ //금액 계산
+ int[] basicAmt = crdnStngBean.getBasicAmt(crdn);
+ crdn.setFfnlgCrdnAmt(basicAmt[0]);
+ crdn.setFfnlgAmt(basicAmt[0]);
+ crdn.setAdvntceAmt(basicAmt[1]);
+
+ //단속팀 정보 갱신
+ if(!ifEmpty(crdn.getTeamId(), () -> "").equals("")) {
+ DataObject teamInfo = crdnTeamMapper.selectTeamInfo(crdn.getTeamId());
+
+ Team team = new Team();
+ team.setTaskSeCd(crdn.getTaskSeCd());
+ team.setSggCd(crdn.getSggCd());
+ team.setTeamNm(teamInfo.string("TEAM_NM"));
+ team.setCrdnSeCd(crdn.getCrdnSeCd());
+ team.setTeamer1(crdn.getTeamer1());
+ team.setTeamer2(crdn.getTeamer2());
+ team.setTeamer3(crdn.getTeamer3());
+ team.setTeamer4(crdn.getTeamer4());
+
+ crdnStngBean.saveTeamInfo(true, team);
+ }
+
+ //상태코드 설정
+ SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
+ if(ifEmpty(crdn.getCrdnSttsCd(), () -> "").equals("")){ //상태코드가 없을경우
+ if(ifEmpty(crdn.getCvlcptLinkYn(), () -> "").equals("Y")) { //민원연계자료일 경우
+ crdn.setCrdnSttsCd("01"); //초기상태
+ crdn.setCrdnSttsChgDt(dateFormat.format(System.currentTimeMillis()));
+ } else { //민원연계자료가 아닐 경우
+ if(ifEmpty(crdn.getRtpyrId(), () -> "").equals("")) { //납부자가 정보가 없을 경우
+ crdn.setCrdnSttsCd("01"); //초기상태
+ crdn.setCrdnSttsChgDt(dateFormat.format(System.currentTimeMillis()));
+ } else {
+ crdn.setCrdnSttsCd("21"); //납부자등록완료
+ crdn.setCrdnSttsChgDt(dateFormat.format(System.currentTimeMillis()));
+ }
+ }
+ }
+
+ //단속 대장 등록
+ boolean result = this.createLedger(crdn);
+ if (!result) {
+ throw new RuntimeException("단속자료 등록 중 단속자료 등록에 실패하였습니다.");
+ }
+
+ SimpleDateFormat yyyyMMdd = new SimpleDateFormat("yyyyMMdd");
+ Date curTime = new Date();
+ String strCurrentDate = yyyyMMdd.format(curTime);
+
+ String taskDtlId = crdn.getCrdnId();
+
+ if(crdn.getCrdnSttsCd().equals("83")) {
+ // 부과제외(TB_LEVY_EXCL) 대장 등록
+ LevyExcl excl01 = new LevyExcl();
+ excl01.setCrdnId(crdn.getCrdnId());
+ excl01.setLevyExclYmd(strCurrentDate);
+ excl01.setLevyExclSeCd("2");
+ excl01.setLevyExclRsnCd("192");
+ excl01.setEtcCn("");
+
+ String rtnScs = levyExclBean.createLevyExcl(excl01);
+ if (rtnScs.contains("[F]")) {
+ throw new RuntimeException("단속자료 등록 중 부과제외 자료 등록에 실패하였습니다.");
+ }
+
+ taskDtlId = excl01.getLevyExclId();
+ }
+
+ // 단속상태이력(TB_CRDN_STTS_HSTRY) 대장 등록
+ CrdnSttsHstry crdnSttsHstry = new CrdnSttsHstry();
+ crdnSttsHstry.setCrdnId(crdn.getCrdnId());
+ crdnSttsHstry.setBfrSttsCd("");
+ crdnSttsHstry.setBfrSttsChgDt("");
+ crdnSttsHstry.setCrdnSttsCd(crdn.getCrdnSttsCd());
+ crdnSttsHstry.setTaskDtlId(taskDtlId);
+ crdnSttsHstry.setEtcCn("");
+
+ result = crdnSttsHstryBean.create(crdnSttsHstry);
+ if (!result) {
+ throw new RuntimeException("단속자료 등록 중 단속상태 이력 등록에 실패하였습니다.");
+ }
+
+ //단속납부자이력(TB_CRDN_PAYER_HSTRY) 대장 등록
+ if(!ifEmpty(crdn.getRtpyrId(), () -> "").equals("")) {
+ CrdnPayerHstry crdnPayerHstry = new CrdnPayerHstry();
+ crdnPayerHstry.setCrdnId(crdn.getCrdnId());
+ crdnPayerHstry.setRtpyrId(crdn.getRtpyrId());
+ crdnPayerHstry.setAddrSn(crdn.getAddrSn());
+ result = crdnPayerHstryBean.createCrdnPayerHstry(crdnPayerHstry);
+ if (!result) {
+ throw new RuntimeException("단속자료 등록 중 단속 납부자 이력 등록에 실패하였습니다.");
+ }
+
+ // 단속 대장의 납부자ID 수정 및 단속 납부자 이력(TB_CRDN_PAYER_HSTRY) 대장에 등록한다.
+ result = crdnPayerHstryBean.createCrdnPayerAddrHstry(crdnPayerHstry);
+ if (!result) {
+ throw new RuntimeException("단속자료 등록 중 단속 납부자주소 이력 등록에 실패하였습니다.");
+ }
+ }
+
+ //파일 등록
+ if(fileInfoList != null && !fileInfoList.isEmpty()) {
+ fileInfoList.forEach(fileInfo -> fileInfo.setInfoType(Crdn.INF_TYPE).setInfoKey(crdn.getCrdnId()));
+ int effected = fileBean.create(fileInfoList);
+ if(effected == 0) {
+ throw new RuntimeException("단속자료 등록 중 파일 등록에 실패하였습니다.");
+ }
+ }
+
+ return result;
+ }
+
+ /**단속 대장 정보를 등록한다.
+ * @param crdn 단속 대장
+ * @return 저장 여부
+ * 저장됐으면 true
+ * 그렇지 않으면 false
+ *
+ */
+ public boolean createLedger(Crdn crdn) {
+
+ int effected = crdnInstMapper.insertCrdn(crdn);
+ if(effected != 1) {
+ return false;
+ }
+
+ effected = crdnInstMapper.insertCrdnAddition(crdn);
+ if(effected != 1) {
+ return false;
+ }
+
+ return true;
+
+ }
+
+ /**단속 대장 정보를 수정한다.
+ * @param nonQueryRequest 수정 요청, crdn 단속 대장
+ * @return 저장 여부
+ * 저장됐으면 true
+ * 그렇지 않으면 false
+ *
+ */
+ public boolean updateLedger(Map nonQueryRequest, Crdn crdn) {
+ String updateInfomationType = (String)ifEmpty(nonQueryRequest.get("updateInfomationType"), "") ;
+
+ switch (ifEmpty(updateInfomationType, () -> "")) {
+ default:
+ if(crdnUpdtMapper.updateCrdnAddition(crdn) != 1) {
+ return false;
+ }
+ return crdnUpdtMapper.updateCrdn(crdn) == 1 ? true : false;
+ }
+ }
+
+ /**단속 정보를 삭제한다.
+ * @param crdnIds 단속아이디 목록
+ * @return 저장 여부
+ * 저장됐으면 true
+ * 그렇지 않으면 false
+ *
+ */
+ public boolean remove(String... crdnIds) {
+ if (isEmpty(crdnIds)) return false;
+
+ Map paramMap = new HashMap();
+ List crdnIdList = Arrays.asList(crdnIds);
+ paramMap.put("crdnIds", crdnIdList);
+ paramMap.put("removedBy", UserInfo.current().getId());
+
+ return crdnUpdtMapper.deleteCrdn(paramMap) >= 1 ? true : false;
+ }
+
+ /**단속 자료를 수정한다.
+ * @param crdn 단속
+ * @return 저장 여부
+ * 저장됐으면 true
+ * 그렇지 않으면 false
+ *
+ */
+ public String updateCrackdown(Crdn crdn) {
+ // 변수 선언
+ int effected = 0; // DB 처리 결과
+
+ //금액 계산
+ int[] basicAmt = crdnStngBean.getBasicAmt(crdn);
+ crdn.setFfnlgCrdnAmt(basicAmt[0]);
+ crdn.setFfnlgAmt(basicAmt[0]);
+ crdn.setAdvntceAmt(basicAmt[1]);
+
+ // 단속(TB_CRDN) 대장을 수정한다.
+ effected = crdnUpdtMapper.updateEditCrdn(crdn);
+ if (effected != 1) {
+ throw new RuntimeException("단속 대장 수정에 실패하였습니다."); // 예외를 발생시켜서 DB Rollback
+ }
+
+ // 단속 부가 정보(TB_CRDN_ADI) 대장을 수정한다.
+ effected = crdnUpdtMapper.updateCrdnAddition(crdn);
+ if (effected != 1) {
+ throw new RuntimeException("단속 부가 정보 수정에 실패하였습니다."); // 예외를 발생시켜서 DB Rollback
+ }
+
+ return "[S] 작업이 정상 처리 되었습니다.";
+ }
+
+ /**단속 자료를 삭제한다.
+ * @param crdn 단속
+ * @return 저장 여부
+ * 저장됐으면 true
+ * 그렇지 않으면 false
+ *
+ */
+ public String removeCrackdown(Crdn crdn) {
+ // 변수 선언
+ boolean rtnScs = false; // DB 처리 결과
+ int effected = 0;
+
+ // 단속 ID로 단속 정보 조회
+ DataObject infoCrdn = crdnInfoMapper.selectCrdnInfo(crdn.getCrdnId());
+
+ // 단속상태이력(TB_CRDN_STTS_HSTRY)
+ CrdnSttsHstry crdnSttsHstry = new CrdnSttsHstry();
+ crdnSttsHstry.setCrdnId(infoCrdn.string("CRDN_ID"));
+ crdnSttsHstry.setBfrSttsCd(infoCrdn.string("CRDN_STTS_CD"));
+ crdnSttsHstry.setBfrSttsChgDt(infoCrdn.string("CRDN_STTS_CHG_DT"));
+ crdnSttsHstry.setCrdnSttsCd("99");
+
+ // 단속 상태 이력(TB_CRDN_STTS_HSTRY) 대장에 등록한다.
+ rtnScs = crdnSttsHstryBean.createHstryUpdateCrdnSttsCd(crdnSttsHstry);
+ if (!rtnScs) {
+ throw new RuntimeException("단속 삭제 중 단속 대장의 단속상태코드 변경에 실패하였습니다."); // 예외를 발생시켜서 DB Rollback
+ }
+
+ Map paramMap = new HashMap();
+ List crdnIdList = Arrays.asList(crdn.getCrdnId());
+ paramMap.put("crdnIds", crdnIdList);
+ paramMap.put("removedBy", UserInfo.current().getId());
+ paramMap.put("delRsn", crdn.getDelRsn());
+
+ // 단속(TB_CRDN) 대장을 삭제한다.
+ effected = crdnUpdtMapper.deleteCrdn(paramMap);
+ if (effected != 1) {
+ throw new RuntimeException("단속 대장 삭제에 실패하였습니다."); // 예외를 발생시켜서 DB Rollback
+ }
+
+ // 단속(TB_CRDN) 대장을 삭제한다.
+ effected = crdnUpdtMapper.deleteCrdnAdi(paramMap);
+ if (effected != 1) {
+ throw new RuntimeException("단속 부가 정보 삭제에 실패하였습니다."); // 예외를 발생시켜서 DB Rollback
+ }
+
+ return "[S] 작업이 정상 처리 되었습니다.";
+ }
+
+ /**단속 자료의 납부자 ID를 삭제한다.
+ * @param crdn 단속
+ * @return 저장 여부
+ * 저장됐으면 true
+ * 그렇지 않으면 false
+ *
+ */
+ public String removeCrackdownPayer(Crdn crdn) {
+ // 단속(TB_CRDN) 대장에 납부자 ID를 삭제한다.
+ int effected = crdnUpdtMapper.deleteCrdnPayer(crdn);
+ if (effected != 1) {
+ throw new RuntimeException("단속 자료의 납부자 정보가 없습니다."); // 예외를 발생시켜서 DB Rollback
+ }
+
+ return "[S] 작업이 정상 처리 되었습니다.";
+ }
+
+ /**단속 자료의 처리 상태 코드를 수정한다.
+ * @param crdn 단속
+ * @return 저장 여부
+ * 저장됐으면 true
+ * 그렇지 않으면 false
+ *
+ */
+ public String updateCrackdownStatus(Crdn crdn) {
+ // 단속 ID로 단속 정보 조회
+ DataObject infoCrdn = crdnInfoMapper.selectCrdnInfo(crdn.getCrdnId());
+
+ // 단속상태이력(TB_CRDN_STTS_HSTRY)
+ CrdnSttsHstry crdnSttsHstry = new CrdnSttsHstry();
+ crdnSttsHstry.setCrdnId(infoCrdn.string("CRDN_ID"));
+ crdnSttsHstry.setBfrSttsCd(infoCrdn.string("CRDN_STTS_CD"));
+ crdnSttsHstry.setBfrSttsChgDt(infoCrdn.string("CRDN_STTS_CHG_DT"));
+ crdnSttsHstry.setEtcCn("[개별총정보-단속상태변경] " + crdn.getEtcCn());
+ crdnSttsHstry.setCrdnSttsCd(crdn.getCrdnSttsCd());
+
+ // 단속 상태 이력(TB_CRDN_STTS_HSTRY) 대장에 등록한다.
+ boolean rtnScs = crdnSttsHstryBean.createHstryUpdateCrdnSttsCd(crdnSttsHstry);
+ if (!rtnScs) {
+ throw new RuntimeException("단속 대장의 단속상태코드 변경에 실패하였습니다."); // 예외를 발생시켜서 DB Rollback
+ }
+
+ return "[S] 작업이 정상 처리 되었습니다.";
+ }
+
+ /** 장비 연계파일을 삭제한다.
+ * @param workPath 작업 디렉토리, fileName 파일명
+ * @return 저장 여부
+ */
+ public boolean removeEquipmentLinkFile(String workPath, String fileName) {
+ boolean saved = false;
+
+ try {
+
+ Stream walk = Files.walk(Paths.get(workPath));
+
+ List deleteFilePaths = new ArrayList();
+
+ walk.filter(Files::isRegularFile)
+ .filter(p -> p.toFile().getName().equalsIgnoreCase(fileName))
+ .collect(Collectors.toList())
+ .forEach(item -> deleteFilePaths.add(item.toFile().getPath()));
+
+ for(String deleteFilePath : deleteFilePaths) {
+ saved = (new File(deleteFilePath)).delete();
+ }
+
+ //빈 디렉토리 삭제
+ CmmnUtil.deleteEmptyDir(new File(workPath), false);
+
+ walk.close();
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+
+ return saved;
+ }
+
+}
diff --git a/src/main/java/cokr/xit/fims/crdn/service/bean/CrdnStngBean.java b/src/main/java/cokr/xit/fims/crdn/service/bean/CrdnStngBean.java
new file mode 100644
index 00000000..b0951f84
--- /dev/null
+++ b/src/main/java/cokr/xit/fims/crdn/service/bean/CrdnStngBean.java
@@ -0,0 +1,560 @@
+package cokr.xit.fims.crdn.service.bean;
+
+import java.util.List;
+
+import javax.annotation.Resource;
+
+import org.assertj.core.util.Arrays;
+import org.springframework.stereotype.Component;
+
+import cokr.xit.fims.cmmn.CmmnUtil;
+import cokr.xit.fims.crdn.Crdn;
+import cokr.xit.fims.crdn.CrdnQuery;
+import cokr.xit.fims.crdn.ExmptnVhcl;
+import cokr.xit.fims.crdn.Team;
+import cokr.xit.fims.crdn.dao.CrdnStngMapper;
+import cokr.xit.fims.crdn.dao.CrdnTeamMapper;
+import cokr.xit.fims.crdn.dao.ExmptnVhclMapper;
+import cokr.xit.foundation.component.AbstractBean;
+import cokr.xit.foundation.data.DataObject;
+
+/** 단속 설정 Bean
+ * @author leebj
+ */
+@Component("crdnStngBean")
+public class CrdnStngBean extends AbstractBean {
+
+ public static String[] SAFE_TAG_AREA = {"03","06","07"}; //안전표지구역
+
+ public static String[] CAR_GROUP1 = {"12","14","15","21"}; //승합자동차등
+ public static String[] CAR_GROUP2 = {"11","13"}; //승용자동차등
+ public static String[] CAR_GROUP3 = {"31"}; //이륜자동차등
+
+ @Resource(name = "crdnStngMapper")
+ private CrdnStngMapper crdnStngMapper;
+
+ @Resource(name = "crdnTeamMapper")
+ private CrdnTeamMapper crdnTeamMapper;
+
+ @Resource(name = "exmptnVhclMapper")
+ private ExmptnVhclMapper exmptnVhclMapper;
+
+ /**잔액을 계산한다.
+ * @param state 대장 자료 상태
+ * @param advntceAmt 사전통지금액
+ * @param ffnlgAmt 과태료금액
+ * @param minusAmt 감경금액
+ * @param adtnAmt 가산금액
+ * @param rcvmtAmt 수납금액
+ * @return 잔액
+ */
+ public int getBalance(String state, int advntceAmt, int ffnlgAmt, int minusAmt, int adtnAmt, int rcvmtAmt) {
+ int result = 0;
+ if(Integer.parseInt(state) < Integer.parseInt("51")) {
+ result = advntceAmt - rcvmtAmt - minusAmt;
+ } else if(state.equals("71") ||
+ state.equals("72") ||
+ state.equals("73") ||
+ state.equals("74") ||
+ state.equals("75") ||
+ state.equals("76") ||
+ state.equals("80") ||
+ state.equals("81") ||
+ state.equals("82") ||
+ state.equals("83") ||
+ state.equals("84") ||
+ state.equals("85")) {
+
+ } else {
+ result = ffnlgAmt - rcvmtAmt - minusAmt + adtnAmt;
+ }
+
+ return result;
+ }
+
+ /**기본금액을 계산한다.
+ * @param crdn 단속 정보
+ * @return 최초금액, 사전통지금액
+ */
+ public int[] getBasicAmt(Crdn crdn) {
+ int[] amt = {0, 0};
+
+ String taskSeCd = crdn.getTaskSeCd();
+
+ CrdnQuery query = new CrdnQuery();
+ query.setTaskSeCd(crdn.getTaskSeCd());
+ query.setAplcnYmd(crdn.getCrdnYmd());
+
+ String ffnlgCarmdlCd = crdn.getFfnlgCarmdlCd();
+ if(taskSeCd.equals("PVS") || taskSeCd.equals("BPV") || taskSeCd.equals("PES")) {
+ if(ifEmpty(ffnlgCarmdlCd, () -> "").equals("")) {
+ return amt;
+ }
+ }
+
+ if(taskSeCd.equals("PVS")) {
+ query.setAmtDcsnCdGroupId("FIM055");
+ String crdnSpareaCd = crdn.getCrdnSpareaCd();
+ if(Arrays.asList(SAFE_TAG_AREA).contains(crdnSpareaCd)) {
+ query.setAmtDcsnCd("02");
+ } else {
+
+ String crdnTm = crdn.getCrdnTm();
+ boolean workTimeYn = Integer.parseInt(crdnTm) >= 80000 && Integer.parseInt(crdnTm) <= 200000;
+
+ if(crdnSpareaCd.equals("01") && workTimeYn) {
+ query.setAmtDcsnCd("03");
+ } else if((crdnSpareaCd.equals("02") || crdnSpareaCd.equals("05")) && workTimeYn) {
+ query.setAmtDcsnCd("04");
+ } else {
+ query.setAmtDcsnCd("01");
+ }
+ }
+
+ query.setDtlAmtDcsnGroupId("FIM056");
+ if(Arrays.asList(CAR_GROUP1).contains(ffnlgCarmdlCd)) {
+ query.setDtlAmtDcsnCd("01");
+ }
+ if(Arrays.asList(CAR_GROUP2).contains(ffnlgCarmdlCd)) {
+ query.setDtlAmtDcsnCd("02");
+ }
+
+ int ffnlgCrdnAmt = Integer.parseInt(ifEmpty(crdnStngMapper.selectBasicAmt(query), () -> "0"));
+
+ if(ffnlgCrdnAmt > 0 && ifEmpty(crdn.getOvtmYn(), ()-> "").equals("Y")) {
+ ffnlgCrdnAmt += 10000;
+ }
+
+ amt[0] = ffnlgCrdnAmt;
+ amt[1] = (int)(ffnlgCrdnAmt * 0.8);
+
+ } else if(taskSeCd.equals("BPV")) {
+
+ query.setAmtDcsnCdGroupId("FIM056");
+ if(Arrays.asList(CAR_GROUP1).contains(ffnlgCarmdlCd)) {
+ query.setAmtDcsnCd("01");
+ }
+ if(Arrays.asList(CAR_GROUP2).contains(ffnlgCarmdlCd)) {
+ query.setAmtDcsnCd("02");
+ }
+ if(Arrays.asList(CAR_GROUP3).contains(ffnlgCarmdlCd)) {
+ query.setAmtDcsnCd("03");
+ }
+
+ int ffnlgCrdnAmt = Integer.parseInt(ifEmpty(crdnStngMapper.selectBasicAmt(query), () -> "0"));
+ amt[0] = ffnlgCrdnAmt;
+ amt[1] = ffnlgCrdnAmt;
+
+ } else if(taskSeCd.equals("DPV")) {
+
+ query.setAmtDcsnCdGroupId("FIM006");
+ query.setAmtDcsnCd(crdn.getVltnCd());
+
+ int ffnlgCrdnAmt = Integer.parseInt(ifEmpty(crdnStngMapper.selectBasicAmt(query), () -> "0"));
+ amt[0] = ffnlgCrdnAmt;
+ amt[1] = (int)(ffnlgCrdnAmt * 0.8);
+
+ } else if(taskSeCd.equals("ECA")) {
+
+ query.setAmtDcsnCdGroupId("FIM061");
+ query.setAmtDcsnCd(crdn.getVltnCd());
+
+ int ffnlgCrdnAmt = Integer.parseInt(ifEmpty(crdnStngMapper.selectBasicAmt(query), () -> "0"));
+ amt[0] = ffnlgCrdnAmt;
+ amt[1] = (int)(ffnlgCrdnAmt * 0.8);
+
+ } else if(taskSeCd.equals("PES")) {
+
+ query.setAmtDcsnCdGroupId("FIM057");
+
+ if(ffnlgCarmdlCd.equals("21")) {
+ query.setAmtDcsnCd("01");
+ query.setDtlAmtDcsnGroupId("FIM059");
+
+ String vltnNmtm = crdn.getVltnNmtm();
+ if(vltnNmtm == null || vltnNmtm.equals("") || vltnNmtm.equals("0") || vltnNmtm.equals("1")) {
+ query.setDtlAmtDcsnCd("01");
+ } else if(vltnNmtm.equals("2")) {
+ query.setDtlAmtDcsnCd("02");
+ } else {
+ query.setDtlAmtDcsnCd("03");
+ }
+ }
+
+
+ if(ffnlgCarmdlCd.equals("13") || ffnlgCarmdlCd.equals("14")) {
+ query.setAmtDcsnCd("02");
+ query.setDtlAmtDcsnGroupId("FIM058");
+ //query.setDtlAmtDcsnCd(업종); // TODO : 차주 업종
+ }
+ ;
+
+ int ffnlgCrdnAmt = Integer.parseInt(ifEmpty(crdnStngMapper.selectBasicAmt(query), () -> "0"));
+ amt[0] = ffnlgCrdnAmt;
+ boolean isPenaltyAmt = (crdn.getFfnlgCarmdlCd().equals("13") || crdn.getFfnlgCarmdlCd().equals("14")); //과징금
+ if(isPenaltyAmt) {
+ amt[1] = (ffnlgCrdnAmt);
+ } else {
+ amt[1] = (int)(ffnlgCrdnAmt * 0.8);
+ }
+
+ }
+
+ return amt;
+ }
+
+ /** 차량번호로 렌트카 여부를 확인한다.
+ * @param vhrno 차량번호
+ * @return 렌트카 여부
+ */
+ public boolean isRent(String vhrno) {
+ int len = vhrno.length();
+ if(len >= 7) {
+
+ String fifthFromLast = vhrno.substring(len-5, len-4);
+
+ if(fifthFromLast.equals("하")
+ || fifthFromLast.equals("허")
+ || fifthFromLast.equals("호")
+ || fifthFromLast.equals("후")) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ /** 차종과 차량번호로 영업용 차량 여부를 확인한다.
+ * @param ffnlgCarmdlCd 차종, vhrno 차량번호
+ * @return 영업용 차량 여부 판단 결과
+ */
+ public String getBusinessYnOfCar(String ffnlgCarmdlCd, String vhrno) {
+
+ if(vhrno.equals("")) {
+ return "차량번호없음";
+ }
+ if(ffnlgCarmdlCd.equals("") || ffnlgCarmdlCd.equals("31")) {
+ return "판단불가";
+ }
+
+ if(vhrno.contains("바") || vhrno.contains("사") || vhrno.contains("아") || vhrno.contains("자")) {
+ return "영업용";
+ } else {
+ return "비영업용";
+ }
+
+ }
+
+ /** 차량번호로 차량구분을 판단한다.
+ * @param vhrno 차량번호
+ * @return 영업용 차량 여부 판단 결과
+ */
+ public String getCarGb(String vhrno) {
+
+ if(vhrno.equals("")) {
+ return "차량번호 없음";
+ }
+
+ boolean first3isNumber = CmmnUtil.isNumeric(vhrno.substring(0, 3));
+ if(first3isNumber) {
+ int first3 = Integer.parseInt(vhrno.substring(0, 3));
+ if(first3 >= 0 && first3 <= 99) {
+ return "중기";
+ } else if(first3 >= 100 && first3 <= 997) {
+ return "일반";
+ } else if(first3 >= 998 && first3 <= 999) {
+ return "기타";
+ }
+ }
+
+ if(!(this.getHeavyEquipmentCarkind(vhrno).equals(""))) {
+ return "중기";
+ }
+
+ if(vhrno.contains("외교")) {
+ return "외교";
+ }
+ if(vhrno.contains("준외")) {
+ return "준외";
+ }
+ if(vhrno.contains("영사")) {
+ return "영사";
+ }
+ if(vhrno.contains("준영")) {
+ return "준영";
+ }
+
+ if(vhrno.contains("국기") || vhrno.contains("협정") || vhrno.contains("대표") || vhrno.contains("외빈")) {
+ return "국제";
+ }
+
+ if(vhrno.substring(0,1).equals("임")) {
+ return "임시";
+ }
+
+ if(vhrno.length() == 7
+ && vhrno.substring(0, 3).equals("16다")
+ && CmmnUtil.isNumeric(vhrno.substring(3, 7))) {
+ return "미군";
+ }
+
+ if(vhrno.length() == 10
+ && this.isBiefSidoName(vhrno.substring(0, 2))
+ && CmmnUtil.isNumeric(vhrno.substring(2, 5))
+ && vhrno.substring(5, 6).equals("-")
+ && CmmnUtil.isNumeric(vhrno.substring(6, 10))) {
+ return "미군";
+ }
+
+ int vhrnoLength = vhrno.length();
+
+ if(this.isBiefSidoName(vhrno.substring(0, 2))) {
+
+ //서울 0 가 0000
+ //서울 00 가 0000
+ //서울 중 가 0000
+ //서울 마포 가 0000
+ //서울 영등포 가 0000
+
+ if(vhrnoLength >= 8 && vhrnoLength <= 10) {
+
+ String suffix1 = vhrno.substring(vhrnoLength-5, vhrnoLength-4);
+ String suffix2 = vhrno.substring(vhrnoLength-4);
+
+ String middle = vhrno.substring(2, vhrnoLength-5);
+
+ if(CmmnUtil.isKorean(suffix1) && CmmnUtil.isNumeric(suffix2)) {
+
+ if(CmmnUtil.isNumeric(middle) && (middle.length() == 1 || middle.length() == 2)) {
+ return "일반";
+ }
+ if(CmmnUtil.isKorean(middle) && (middle.length() >= 1 && middle.length() <= 3)) {
+ return "일반";
+ }
+ }
+ }
+
+ } else {
+
+ //00가0000
+ if(vhrnoLength == 7
+ && CmmnUtil.isNumeric(vhrno.substring(0, 2))
+ && CmmnUtil.isKorean(vhrno.substring(2, 3))
+ && CmmnUtil.isNumeric(vhrno.substring(3, 7))) {
+ return "일반";
+ }
+ }
+
+ return "판단불가";
+ }
+
+
+
+ public String getHeavyEquipmentCarkind(String vhrno) {
+
+
+
+ if(this.isBiefSidoName(vhrno.substring(0, 2))
+ && CmmnUtil.isKorean(vhrno.substring(4, 5))
+ && CmmnUtil.isNumeric(vhrno.substring(5, 9))
+ ) {
+ switch(vhrno.substring(2, 4)) {
+ case "01" : return "불도저";
+ case "02" : return "굴삭기";
+ case "03" : return "로더";
+ case "04" : return "지게차";
+ case "05" : return "스크레이퍼";
+ case "06" : return "덤프트럭";
+ case "07" : return "기중기";
+ case "08" : return "콘크리트믹서트럭";
+ case "14" :
+ if(!vhrno.substring(4,5).equals("허")) {
+ return "콘크리트믹서트럭";
+ }
+ }
+
+ switch(vhrno.substring(2, 5)) {
+ case "26거" : return "도로보수트럭";
+ case "26너" : return "노면파쇄기";
+ case "26버" : return "터널고소용자동차";
+ case "26어" : return "수목이식기";
+ }
+
+ }
+
+ return "";
+ }
+
+ public boolean isBiefSidoName(String str) {
+
+ String[] sidoNames = {
+ "서울","대전","대구","부산","광주","인천","울산","세종",
+ "경기","강원","충북","충남","전북","전남","경북","경남","제주"
+ };
+
+ if(Arrays.asList(sidoNames).contains(str)) {
+ return true;
+ } else {
+ return false;
+ }
+
+ }
+
+
+
+ /**단속팀 목록을 조회한다.
+ * @param query 단속팀 목록 조회조건
+ * @return 단속팀 목록
+ */
+ public List selectTeamList(CrdnQuery query){
+ return crdnTeamMapper.selectTeamList(query);
+ }
+
+ /**비사용 단속팀 목록을 조회한다.
+ * @param query 비사용 단속팀 목록 조회조건
+ * @return 비사용 단속팀 목록
+ */
+ public List selectRemovedTeamList(CrdnQuery query) {
+ return crdnTeamMapper.selectRemovedTeamList(query);
+ }
+
+ /**단속팀 정보를 삭제한다.
+ * @param teamId 단속팀 ID
+ * @return 저장 여부
+ * 저장됐으면 true
+ * 그렇지 않으면 false
+ *
+ */
+ public boolean removeTeamInfo(String teamId) {
+
+ Team team = new Team();
+ team.setTeamId(teamId);
+ team.setRemovedBy(currentUser().getId());
+ return crdnTeamMapper.deleteTeamInfo(team) == 1 ? true : false;
+ }
+
+ /**단속팀 정보를 저장한다.
+ * @param fromInsertCrdn 단속정보 입력 프로세스에서 호출하였는지 여부, teamId 단속팀 ID
+ * @return 저장 여부
+ * 저장됐으면 true
+ * 그렇지 않으면 false
+ *
+ */
+ public boolean saveTeamInfo(boolean fromInsertCrdn, Team team) {
+ DataObject teamInfo = crdnTeamMapper.selectTeamInfoByName(team);
+
+ boolean result = false;
+
+ if(teamInfo != null) {
+ boolean differ = false;
+ if(!ifEmpty(team.getCrdnSeCd(), () -> "").equals(teamInfo.string("CRDN_SE_CD"))) {
+ differ = true;
+ }
+ if(!ifEmpty(team.getTeamer1(), () -> "").equals(teamInfo.string("TEAMER_1"))) {
+ differ = true;
+ }
+ if(!ifEmpty(team.getTeamer2(), () -> "").equals(teamInfo.string("TEAMER_2"))) {
+ differ = true;
+ }
+ if(!ifEmpty(team.getTeamer3(), () -> "").equals(teamInfo.string("TEAMER_3"))) {
+ differ = true;
+ }
+ if(!ifEmpty(team.getTeamer4(), () -> "").equals(teamInfo.string("TEAMER_4"))) {
+ differ = true;
+ }
+
+ if(differ) {
+ Team del = new Team();
+ del.setTeamId(teamInfo.string("TEAM_ID"));
+ del.setRemovedBy(currentUser().getId());
+ crdnTeamMapper.deleteTeamInfo(del);
+
+ result = crdnTeamMapper.insertTeamInfo(team) == 1 ? true : false;
+ } else {
+ if(!fromInsertCrdn) {
+ team.setTeamId(teamInfo.string("TEAM_ID"));
+ result = crdnTeamMapper.updateTeamInfo(team) == 1 ? true : false;
+ }
+ }
+ } else {
+ result = crdnTeamMapper.insertTeamInfo(team) == 1 ? true : false;
+ }
+
+ return result;
+ }
+
+ /**단속팀 정보를 조회한다.
+ * @param teamId 단속팀 ID
+ * @return 단속팀 정보
+ */
+ public DataObject selectTeamInfo(String teamId) {
+ return crdnTeamMapper.selectTeamInfo(teamId);
+ }
+
+ /**면제차량 목록을 조회한다.
+ * @param query 면제차량 목록 조회조건
+ * @return 면제차량 목록
+ */
+ public List selectExemptionVehicleList(CrdnQuery query) {
+ return exmptnVhclMapper.selectExemptionVehicleList(query);
+ }
+
+ /**면제차량 정보를 조회한다.
+ * @param exemptionVehicleId 면제차량 ID
+ * @return 면제차량 정보
+ */
+ public DataObject getExemptionVehicleInfo(String exemptionVehicleId) {
+ return exmptnVhclMapper.selectExemptionVehicleInfo(exemptionVehicleId);
+ }
+
+ /**면제차량 정보를 등록한다.
+ * @param exmptnVhcl 면제차량 정보
+ * @return 저장 여부
+ * 저장됐으면 true
+ * 그렇지 않으면 false
+ *
+ */
+ public boolean createExemptionVehicleInfo(ExmptnVhcl exmptnVhcl) {
+ if(exmptnVhclMapper.insertExemptionVehicleInfo(exmptnVhcl) != 1) {
+ return false;
+ }
+
+ return exmptnVhclMapper.insertExemptionVehicleHistory(exmptnVhcl) == 1 ? true : false;
+ }
+
+ /**면제차량 정보를 수정한다.
+ * @param exmptnVhcl 면제차량 정보
+ * @return 저장 여부
+ * 저장됐으면 true
+ * 그렇지 않으면 false
+ *
+ */
+ public boolean updateExemptionVehicleInfo(ExmptnVhcl exmptnVhcl) {
+ if(exmptnVhclMapper.updateExemptionVehicleInfo(exmptnVhcl) != 1) {
+ return false;
+ }
+
+ return exmptnVhclMapper.insertExemptionVehicleHistory(exmptnVhcl) == 1 ? true : false;
+ }
+
+ /**면제차량 정보를 삭제한다.
+ * @param exmptnVhcl 면제차량 정보
+ * @return 저장 여부
+ * 저장됐으면 true
+ * 그렇지 않으면 false
+ *
+ */
+ public boolean removeExemptionVehicleInfo(ExmptnVhcl exmptnVhcl) {
+ exmptnVhcl.setRemovedBy(currentUser().getId());
+ if(exmptnVhclMapper.deleteExemptionVehicleInfo(exmptnVhcl) != 1) {
+ return false;
+ }
+
+ return exmptnVhclMapper.insertExemptionVehicleHistory(exmptnVhcl) == 1 ? true : false;
+ }
+
+ public List getExemptionVehicleHistoryList(String exmptnVhclId) {
+ return exmptnVhclMapper.selectExemptionVehicleHistoryList(exmptnVhclId);
+ }
+
+}
diff --git a/src/main/java/cokr/xit/fims/excl/LevyExcl.java b/src/main/java/cokr/xit/fims/excl/LevyExcl.java
new file mode 100644
index 00000000..3a38adfa
--- /dev/null
+++ b/src/main/java/cokr/xit/fims/excl/LevyExcl.java
@@ -0,0 +1,66 @@
+package cokr.xit.fims.excl;
+
+import cokr.xit.foundation.AbstractEntity;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 부과 제외 대장
+ * @author JoJH
+ */
+@Getter
+@Setter
+public class LevyExcl extends AbstractEntity {
+
+ /**
+ * 부과 제외 ID
+ */
+ private String levyExclId;
+
+ /**
+ * 단속 ID
+ */
+ private String crdnId;
+
+ /**
+ * 부과 제외 일자
+ */
+ private String levyExclYmd;
+
+ /**
+ * 부과 제외 구분 코드
+ */
+ private String levyExclSeCd;
+
+ /**
+ * 부과 제외 사유 코드
+ */
+ private String levyExclRsnCd;
+
+ /**
+ * 기타 내용
+ */
+ private String etcCn;
+
+ /**
+ * 삭제 여부
+ */
+ private String delYn;
+
+ /**
+ * 삭제 사유
+ */
+ private String delRsn;
+
+ // 추가 /////////////////////////////////////////////////////////////////////
+ /**
+ * 부과제외 Ids
+ */
+ private String[] levyExclIds;
+
+ /**
+ * 시군구 코드
+ */
+ private String sggCd;
+
+}
diff --git a/src/main/java/cokr/xit/fims/excl/LevyExclQuery.java b/src/main/java/cokr/xit/fims/excl/LevyExclQuery.java
new file mode 100644
index 00000000..9cfbd4ee
--- /dev/null
+++ b/src/main/java/cokr/xit/fims/excl/LevyExclQuery.java
@@ -0,0 +1,345 @@
+package cokr.xit.fims.excl;
+
+import cokr.xit.fims.cmmn.CmmnQuery;
+
+/**부과제외 대장 정보 조회 요청
+*
+* 상세 설명:
+*
+*
+* ============ 변경 이력 ============
+* 2023-06-23 JoJH 최초 작성
+* ================================
+*
+*/
+public class LevyExclQuery extends CmmnQuery {
+
+ private static final long serialVersionUID = 1L;
+
+ // ID
+ private String crdnId; // 단속 ID
+ private String[] levyExclIds; // 부과제외 Ids
+ private String levyExclId; // 부과제외 ID
+ private String[] opnnIds; // 의견제출 Ids
+ private String opnnId; // 의견제출 ID
+ private String mngId; // 의견제출 심의 회원 ID
+ private String[] reRegIds; // 재등록 Ids
+ private String reRegId; // 재등록 ID
+
+ // 검색 조건
+ private String schLevyExclYmdFrom; // 부과제외_부과제외 일자 시작
+ private String schLevyExclYmdTo; // 부과제외_부과제외 일자 종료
+ private String schLevyExclSeCd; // 부과제외_부과제외 구분 코드
+ private String schLevyExclRsnCd; // 부과제외_부과제외 구분 코드
+ private String schRcptYmdFrom; // 의견제출_접수 일자 시작
+ private String schRcptYmdTo; // 의견제출_접수 일자 종료
+ private String schAnsYmdFrom; // 의견제출_답변 일자 시작
+ private String schAnsYmdTo; // 의견제출_답변 일자 종료
+ private String schOpnnSbmsnSttsCd; // 의견제출_의견 제출 상태 코드
+ private String schOpnnSbmsnSeCd; // 의견제출_의견 제출 구분 코드
+ private String schNtfctnSeCd; // 의견제출_통보 구분 코드
+ private String schSttrNm; // 의견제출_진술자 명
+ private String schReRegYmdFrom; // 단속재등록_재등록 일자 시작
+ private String schReRegYmdTo; // 단속재등록_재등록 일자 종료
+ // 상세 검색 조건
+ private String schCrdnYmdFrom; // 단속(TB_CRDN)_단속 일자 시작
+ private String schCrdnYmdTo; // 단속(TB_CRDN)_단속 일자 종료
+ private String schVhrno; // 단속(TB_CRDN)_차량번호
+ private String schRtpyrNo; // 납부자(TB_PAYER)_납부자 번호
+ private String schRtpyrNm; // 납부자(TB_PAYER)_납부자 명
+
+ // ETC
+ private String callPurpose; // infoDialog 호출 용도(view 조회(편집불가), create 등록, update 수정, refresh 재조회).
+ private String delRsn; // 삭제 사유
+ private String levyExclSeCd; // 부과제외_부과 제외 구분 코드
+ private String ansRsnCd; // 민원 답변 문구(TB_CVLCPT_ANS_WORDS) - 답변 사유 코드
+ private String sndngRcvmtCd; // 발송 수납 코드
+
+ public String getCrdnId() {
+ return ifEmpty(crdnId, () -> null);
+ }
+
+ public T setCrdnId(String crdnId) {
+ this.crdnId = crdnId;
+ return self();
+ }
+
+ public String[] getLevyExclIds() {
+ return ifEmpty(levyExclIds, () -> null);
+ }
+
+ public T setLevyExclIds(String... levyExclIds) {
+ this.levyExclIds = levyExclIds;
+ return self();
+ }
+
+ public String getLevyExclId() {
+ return ifEmpty(levyExclId, () -> null);
+ }
+
+ public T setLevyExclId(String levyExclId) {
+ this.levyExclId = levyExclId;
+ return self();
+ }
+
+ public String[] getOpnnIds() {
+ return ifEmpty(opnnIds, () -> null);
+ }
+
+ public T setOpnnIds(String... opnnIds) {
+ this.opnnIds = opnnIds;
+ return self();
+ }
+
+ public String getOpnnId() {
+ return ifEmpty(opnnId, () -> null);
+ }
+
+ public T setOpnnId(String opnnId) {
+ this.opnnId = opnnId;
+ return self();
+ }
+
+ public String getMngId() {
+ return ifEmpty(mngId, () -> null);
+ }
+
+ public T setMngId(String mngId) {
+ this.mngId = mngId;
+ return self();
+ }
+
+ public String[] getReRegIds() {
+ return ifEmpty(reRegIds, () -> null);
+ }
+
+ public T setReRegIds(String... reRegIds) {
+ this.reRegIds = reRegIds;
+ return self();
+ }
+
+ public String getReRegId() {
+ return ifEmpty(reRegId, () -> null);
+ }
+
+ public T setReRegId(String reRegId) {
+ this.reRegId = reRegId;
+ return self();
+ }
+
+ public String getSchLevyExclYmdFrom() {
+ return ifEmpty(schLevyExclYmdFrom, () -> null);
+ }
+
+ public T setSchLevyExclYmdFrom(String schLevyExclYmdFrom) {
+ this.schLevyExclYmdFrom = schLevyExclYmdFrom;
+ return self();
+ }
+
+ public String getSchLevyExclYmdTo() {
+ return ifEmpty(schLevyExclYmdTo, () -> null);
+ }
+
+ public T setSchLevyExclYmdTo(String schLevyExclYmdTo) {
+ this.schLevyExclYmdTo = schLevyExclYmdTo;
+ return self();
+ }
+
+ public String getSchLevyExclSeCd() {
+ return ifEmpty(schLevyExclSeCd, () -> null);
+ }
+
+ public T setSchLevyExclSeCd(String schLevyExclSeCd) {
+ this.schLevyExclSeCd = schLevyExclSeCd;
+ return self();
+ }
+
+ public String getSchLevyExclRsnCd() {
+ return ifEmpty(schLevyExclRsnCd, () -> null);
+ }
+
+ public T setSchLevyExclRsnCd(String schLevyExclRsnCd) {
+ this.schLevyExclRsnCd = schLevyExclRsnCd;
+ return self();
+ }
+
+ public String getSchRcptYmdFrom() {
+ return ifEmpty(schRcptYmdFrom, () -> null);
+ }
+
+ public T setSchRcptYmdFrom(String schRcptYmdFrom) {
+ this.schRcptYmdFrom = schRcptYmdFrom;
+ return self();
+ }
+
+ public String getSchRcptYmdTo() {
+ return ifEmpty(schRcptYmdTo, () -> null);
+ }
+
+ public T setSchRcptYmdTo(String schRcptYmdTo) {
+ this.schRcptYmdTo = schRcptYmdTo;
+ return self();
+ }
+
+ public String getSchAnsYmdFrom() {
+ return ifEmpty(schAnsYmdFrom, () -> null);
+ }
+
+ public T setSchAnsYmdFrom(String schAnsYmdFrom) {
+ this.schAnsYmdFrom = schAnsYmdFrom;
+ return self();
+ }
+
+ public String getSchAnsYmdTo() {
+ return ifEmpty(schAnsYmdTo, () -> null);
+ }
+
+ public T setSchAnsYmdTo(String schAnsYmdTo) {
+ this.schAnsYmdTo = schAnsYmdTo;
+ return self();
+ }
+
+ public String getSchOpnnSbmsnSttsCd() {
+ return ifEmpty(schOpnnSbmsnSttsCd, () -> null);
+ }
+
+ public T setSchOpnnSbmsnSttsCd(String schOpnnSbmsnSttsCd) {
+ this.schOpnnSbmsnSttsCd = schOpnnSbmsnSttsCd;
+ return self();
+ }
+
+ public String getSchOpnnSbmsnSeCd() {
+ return ifEmpty(schOpnnSbmsnSeCd, () -> null);
+ }
+
+ public T setSchOpnnSbmsnSeCd(String schOpnnSbmsnSeCd) {
+ this.schOpnnSbmsnSeCd = schOpnnSbmsnSeCd;
+ return self();
+ }
+
+ public String getSchNtfctnSeCd() {
+ return ifEmpty(schNtfctnSeCd, () -> null);
+ }
+
+ public T setSchNtfctnSeCd(String schNtfctnSeCd) {
+ this.schNtfctnSeCd = schNtfctnSeCd;
+ return self();
+ }
+
+ public String getSchSttrNm() {
+ return ifEmpty(schSttrNm, () -> null);
+ }
+
+ public T setSchSttrNm(String schSttrNm) {
+ this.schSttrNm = schSttrNm;
+ return self();
+ }
+
+ public String getSchReRegYmdFrom() {
+ return ifEmpty(schReRegYmdFrom, () -> null);
+ }
+
+ public T setSchReRegYmdFrom(String schReRegYmdFrom) {
+ this.schReRegYmdFrom = schReRegYmdFrom;
+ return self();
+ }
+
+ public String getSchReRegYmdTo() {
+ return ifEmpty(schReRegYmdTo, () -> null);
+ }
+
+ public T setSchReRegYmdTo(String schReRegYmdTo) {
+ this.schReRegYmdTo = schReRegYmdTo;
+ return self();
+ }
+
+ // 상세 검색 조건 ///////////////////////////////////////////////////////////////
+ public String getSchCrdnYmdFrom() {
+ return ifEmpty(schCrdnYmdFrom, () -> null);
+ }
+
+ public void setSchCrdnYmdFrom(String schCrdnYmdFrom) {
+ this.schCrdnYmdFrom = schCrdnYmdFrom;
+ }
+
+ public String getSchCrdnYmdTo() {
+ return ifEmpty(schCrdnYmdTo, () -> null);
+ }
+
+ public void setSchCrdnYmdTo(String schCrdnYmdTo) {
+ this.schCrdnYmdTo = schCrdnYmdTo;
+ }
+
+ public String getSchVhrno() {
+ return ifEmpty(schVhrno, () -> null);
+ }
+
+ public void setSchVhrno(String schVhrno) {
+ this.schVhrno = schVhrno;
+ }
+
+ public String getSchRtpyrNo() {
+ return ifEmpty(schRtpyrNo, () -> null);
+ }
+
+ public void setSchRtpyrNo(String schRtpyrNo) {
+ this.schRtpyrNo = schRtpyrNo;
+ }
+
+ public String getSchRtpyrNm() {
+ return ifEmpty(schRtpyrNm, () -> null);
+ }
+
+ public void setSchRtpyrNm(String schRtpyrNm) {
+ this.schRtpyrNm = schRtpyrNm;
+ }
+ // 상세 검색 조건 ///////////////////////////////////////////////////////////////
+
+ // ETC /////////////////////////////////////////////////////////////////////
+ public String getCallPurpose() {
+ return ifEmpty(callPurpose, () -> null);
+ }
+
+ public T setCallPurpose(String callPurpose) {
+ this.callPurpose = callPurpose;
+ return self();
+ }
+
+ public String getDelRsn() {
+ return ifEmpty(delRsn, () -> null);
+ }
+
+ public T setDelRsn(String delRsn) {
+ this.delRsn = delRsn;
+ return self();
+ }
+
+ public String getLevyExclSeCd() {
+ return ifEmpty(levyExclSeCd, () -> null);
+ }
+
+ public T setLevyExclSeCd(String levyExclSeCd) {
+ this.levyExclSeCd = levyExclSeCd;
+ return self();
+ }
+
+ public String getAnsRsnCd() {
+ return ifEmpty(ansRsnCd, () -> null);
+ }
+
+ public T setAnsRsnCd(String ansRsnCd) {
+ this.ansRsnCd = ansRsnCd;
+ return self();
+ }
+
+ public String getSndngRcvmtCd() {
+ return ifEmpty(sndngRcvmtCd, () -> null);
+ }
+
+ public T setSndngRcvmtCd(String sndngRcvmtCd) {
+ this.sndngRcvmtCd = sndngRcvmtCd;
+ return self();
+ }
+ // ETC /////////////////////////////////////////////////////////////////////
+
+}
diff --git a/src/main/java/cokr/xit/fims/excl/dao/LevyExclMapper.java b/src/main/java/cokr/xit/fims/excl/dao/LevyExclMapper.java
new file mode 100644
index 00000000..45e1a28b
--- /dev/null
+++ b/src/main/java/cokr/xit/fims/excl/dao/LevyExclMapper.java
@@ -0,0 +1,90 @@
+package cokr.xit.fims.excl.dao;
+
+import java.util.List;
+
+import org.egovframe.rte.psl.dataaccess.mapper.Mapper;
+
+import cokr.xit.fims.crdn.Crdn;
+import cokr.xit.fims.excl.LevyExcl;
+import cokr.xit.fims.excl.LevyExclQuery;
+import cokr.xit.foundation.component.AbstractMapper;
+import cokr.xit.foundation.data.DataObject;
+
+/** 부과제외 대장 정보 DAO
+ *
+ * 상세 설명: 부과제외 대장 테이블에 접근하여 데이터를 조회하고 저장한다.
+ *
+ *
+ * ============ 변경 이력 ============
+ * 2023-06-23 JoJH 최초 작성
+ * ================================
+ *
+ */
+@Mapper("levyExclMapper")
+public interface LevyExclMapper extends AbstractMapper {
+
+ /**지정한 조건에 따라 부과제외 대장 목록을 조회하여 반환한다.
+ * @param req 부과제외 대장 조회 조건
+ * @return 부과제외 대장 목록
+ */
+ List selectLevyExclList(LevyExclQuery req);
+
+ /**지정한 조건에 따라 부과제외 대장 객체들을 조회하여 반환한다.
+ * @param req 부과제외 대장 조회 조건
+ * @return 부과제외 대장 객체 정보
+ */
+ List selectLevyExcls(LevyExclQuery req);
+
+ /**지정한 조건에 따라 부과제외 대장 정보를 조회하여 반환한다.
+ * @param req 부과제외 대장 조회 조건
+ * @return 부과제외 대장 정보
+ */
+ default DataObject selectLevyExclInfo(LevyExclQuery req) {
+ // 삭제 여부 확인
+ if (req.getDelYn() == null) {
+ req.setDelYn("N");
+ }
+ // 기본 정렬
+ if (req.getOrderBy() == null) {
+ req.setOrderBy("LE.LEVY_EXCL_ID DESC");
+ }
+
+ List levyExcls = selectLevyExcls(req);
+
+ return !levyExcls.isEmpty() ? levyExcls.get(0) : null;
+ }
+
+ /**부과제외 대장 정보를 등록한다.
+ * @param params 파라미터
+ * "levyExcl" - 부과제외 대장
+ * "currentUser" - 현재 접속한 사용자
+ *
+ * @return 저장된 정보수
+ */
+ int insertLevyExcl(LevyExcl levyExcl);
+
+ /**부과제외 대장 정보를 수정한다.
+ * @param params 파라미터
+ * "levyExcl" - 부과제외 대장
+ * "currentUser" - 현재 접속한 사용자
+ *
+ * @return 저장된 정보수
+ */
+ int updateLevyExcl(LevyExcl levyExcl);
+
+ /**부과제외 대장 정보를 삭제한다.
+ * @param params 파라미터
+ * "levyExcl" - 부과제외 대장
+ * "currentUser" - 현재 접속한 사용자
+ *
+ * @return 저장된 정보수
+ */
+ int deleteLevyExcl(LevyExcl levyExcl);
+
+ /**단속(TB_CRDN) 대장의 주차가능결과코드를 수정한다.
+ * @param crdn 단속 대장
+ * @return 저장된 정보수
+ */
+ int updatePrkPsbltyRsltCd(Crdn crdn);
+
+}
diff --git a/src/main/java/cokr/xit/fims/excl/service/bean/LevyExclBean.java b/src/main/java/cokr/xit/fims/excl/service/bean/LevyExclBean.java
new file mode 100644
index 00000000..fcf7a358
--- /dev/null
+++ b/src/main/java/cokr/xit/fims/excl/service/bean/LevyExclBean.java
@@ -0,0 +1,288 @@
+package cokr.xit.fims.excl.service.bean;
+
+import java.util.List;
+
+import javax.annotation.Resource;
+
+import org.springframework.stereotype.Component;
+
+import cokr.xit.fims.cmmn.CmmnUtil;
+import cokr.xit.fims.cmmn.CrdnSttsHstry;
+import cokr.xit.fims.cmmn.service.bean.CrdnSttsHstryBean;
+import cokr.xit.fims.crdn.Crdn;
+import cokr.xit.fims.excl.LevyExcl;
+import cokr.xit.fims.excl.LevyExclQuery;
+import cokr.xit.fims.excl.dao.LevyExclMapper;
+import cokr.xit.fims.rdca.Rdamt;
+import cokr.xit.fims.rdca.service.bean.RdamtBean;
+import cokr.xit.foundation.component.AbstractBean;
+import cokr.xit.foundation.data.DataObject;
+
+/**부과제외 대장 정보 관리 Bean
+ *
+ * 상세 설명: 부과제외 대장 DAO(Excl01Mapper)를 사용해 업무 기능을 구현한 클래스
+ *
+ *
+ * ============ 변경 이력 ============
+ * 2023-06-23 JoJH 최초 작성
+ * ================================
+ *
+ */
+@Component("levyExclBean")
+public class LevyExclBean extends AbstractBean {
+
+ /** 부과제외 대장 정보 DAO */
+ @Resource(name="levyExclMapper")
+ private LevyExclMapper levyExclMapper;
+
+ /** 단속 상태 이력 정보 Bean */
+ @Resource(name="crdnSttsHstryBean")
+ private CrdnSttsHstryBean crdnSttsHstryBean;
+
+ /** 감액 대장 정보 Bean */
+ @Resource(name="rdamtBean")
+ private RdamtBean rdamtBean;
+
+ /**지정한 조건에 따라 부과제외 대장 목록을 조회하여 반환한다.
+ * @param req 부과제외 조회 조건
+ * @return 부과제외 대장 목록
+ */
+ public List getLevyExclList(LevyExclQuery req) {
+ // 삭제 여부 확인
+ if (req.getDelYn() == null) {
+ req.setDelYn("N");
+ }
+ // 정렬 확인
+ if (req.getOrderBy() == null) {
+ if (req.getBy() == null) {
+ req.setOrderBy("REG_DT");
+ } else {
+ req.setOrderBy(CmmnUtil.convertCamelCaseToSnakeCase(req.getBy()));
+ }
+ }
+
+ return levyExclMapper.selectLevyExclList(req);
+ }
+
+ /**지정한 조건에 따라 부과제외 이력 객체들을 반환한다.
+ * @param req 부과제외 조회 조건
+ * @return 부과제외 객체 목록
+ */
+ public List getLevyExcls(LevyExclQuery req) {
+ // 삭제 여부 확인
+ if (req.getDelYn() == null) {
+ req.setDelYn("N");
+ }
+ // 정렬 확인
+ if (req.getOrderBy() == null) {
+ req.setOrderBy("LE.LEVY_EXCL_ID DESC");
+ }
+
+ return levyExclMapper.selectLevyExcls(req);
+ }
+
+ /**지정한 부과제외 ID의 부과제외 정보를 반환한다.
+ * @param req 부과제외 조회 조건
+ * @return 부과제외 정보
+ */
+ public DataObject getLevyExclInfo(LevyExclQuery req) {
+ DataObject info = levyExclMapper.selectLevyExclInfo(req);
+
+ // 신규 부과제외 등록일 경우 부과제외 구분코드를 입력한다.
+ if (req.getCallPurpose().equals("create")) {
+ info.set("LEVY_EXCL_SE_CD", req.getLevyExclSeCd());
+ }
+
+ return info;
+ }
+
+ /**부과제외 대장 정보를 등록한다.
+ * @param excl 부과제외 대장
+ * @return 저장 여부
+ * 저장됐으면 true
+ * 그렇지 않으면 false
+ *
+ */
+ public String createLevyExcl(LevyExcl levyExcl) {
+ // 변수 선언
+ int rtnNocs = -1; // 처리 결과 건수
+ String rtnMsg = ""; // 처리 결과 메시지
+
+ // 단속 ID로 단속, 부과제외 정보 조회
+ DataObject levyExclInfo = levyExclMapper.selectLevyExclInfo(new LevyExclQuery().setCrdnId(levyExcl.getCrdnId()));
+
+ // 등록 대상 자료 검증
+ if (!levyExclInfo.string("LEVY_EXCL_ID").equals("")) { // 부과제외 ID가 있다면 이미 부과제외 자료가 존재하므로 종료..
+ rtnMsg = "[F] 작업중 이미 등록된 부과제외 자료가 존재합니다.";
+ return rtnMsg;
+ }
+ if (!levyExclInfo.string("CVLCPT_LINK_ID").equals("")) { // 민원 ID
+ if (levyExclInfo.string("CVLCPT_PRCS_CD").equals("00")) { // 민원 처리상태 확인
+ rtnMsg = "[F] 작업중 단속 민원 자료가 처리 되지 않았습니다. 단속 민원 업무를 먼저 처리 하시기 바랍니다.";
+ return rtnMsg;
+ }
+ }
+ if (levyExcl.getLevyExclSeCd().contains("1,2")) { // 비부과(서손), 계고
+ if (levyExclInfo.number("CRDN_STTS_CD").intValue() >= 51) { // 단속상태코드가 부과(51) 보다 크다면, 비부과 또는 계고 등록을 할 수 없다.
+ rtnMsg = "[F] 작업중 오류가 발생하였습니다. 현재 자료의 단속상태가 " + levyExclInfo.string("CRDN_STTS_NM") + " 상태 입니다.";
+ return rtnMsg;
+ }
+ } else if (levyExcl.getLevyExclSeCd().equals("3")) { // 부과취소
+ if (levyExclInfo.number("CRDN_STTS_CD").intValue() < 51) { // 단속상태코드가 부과(51) 보다 작다면, 전액감액 등록 할 수 없다.
+ rtnMsg = "[F] 작업중 오류가 발생하였습니다. 현재 자료의 단속상태가 " + levyExclInfo.string("CRDN_STTS_NM") + " 상태 입니다.";
+ return rtnMsg;
+ }
+ if (levyExclInfo.string("LEVY_ID").equals("")) { // 부과(TB_LEVY) 정보 확인
+ rtnMsg = "[F] 작업 중 부과 자료가 존재하지 않습니다. 비부과로 처리 하시기 바랍니다.";
+ return rtnMsg;
+ }
+ }
+
+ // 부과취소(전액감액)일 경우 부과(TB_LEVY)에 감액금액 입력이 필요..
+ if (levyExcl.getLevyExclSeCd().equals("3")) {
+ // 감액(TB_RDAMT) 등록
+ Rdamt rdamt = new Rdamt();
+ rdamt.setLevyId(levyExclInfo.string("LEVY_ID")); // 부과 ID
+ rdamt.setRdamtYmd(levyExcl.getLevyExclYmd()); // 감액 일자
+ rdamt.setRdamtSeCd("02"); // 감액 구분 코드 FIM085 - 02:부과취소
+ rdamt.setRdamtRsnCd(levyExcl.getLevyExclRsnCd()); // 감액 사유 코드
+
+ rtnMsg = rdamtBean.createRdamt(rdamt);
+ if (!rtnMsg.contains("[S]")) {
+ throw new RuntimeException(rtnMsg.replace("[F]", "")); // 예외를 발생시켜서 DB Rollback
+ }
+ }
+
+ // 부과제외(TB_LEVY_EXCL) 대장을 등록한다.
+ rtnNocs = levyExclMapper.insertLevyExcl(levyExcl);
+ if (rtnNocs != 1) {
+ throw new RuntimeException("부과제외 정보 등록에 실패하였습니다."); // 예외를 발생시켜서 DB Rollback
+ }
+
+ // 표지정보 확인여부가 미확인(0)이면 -> 조회미대상(9) 으로
+ if (levyExclInfo.string("PRK_PSBLTY_RSLT_CD").equals("0")) { // 주차 가능 결과 코드(FIM034) - 0: 미확인
+ Crdn crdn = new Crdn();
+ crdn.setCrdnId(levyExclInfo.string("CRDN_ID")); // 단속 ID
+ crdn.setPrkPsbltyRsltCd("9"); // 주차 가능 결과 코드(FIM034) 9: 조회미대상
+
+ rtnNocs = levyExclMapper.updatePrkPsbltyRsltCd(crdn);
+ if (rtnNocs != 1) {
+ throw new RuntimeException("부과제외 삭제 작업 중 단속 대장의 표지정보 수정에 실패하였습니다."); // 예외를 발생시켜서 DB Rollback
+ }
+ }
+
+ // 단속 상태 이력(TB_CRDN_STTS_HSTRY) 대장에 등록하고, 단속(TB_CRDN) 대장을 수정한다.
+ String newCrdnSttsCd = ""; // 신규 단속 상태 코드(CRDN_STTS_CD)
+ if (levyExcl.getLevyExclSeCd().equals("1")) { // 비부과
+ newCrdnSttsCd = "81"; // 비부과(서손)
+ } else if (levyExcl.getLevyExclSeCd().equals("2")) { // 계고
+ newCrdnSttsCd = "83"; // 계고
+ } else if (levyExcl.getLevyExclSeCd().equals("3")) { // 부과취소(전액감액)
+ newCrdnSttsCd = "80"; // 부과취소
+ }
+
+ // 단속상태이력(TB_CRDN_STTS_HSTRY)
+ CrdnSttsHstry crdnSttsHstry = new CrdnSttsHstry();
+ crdnSttsHstry.setCrdnId(levyExclInfo.string("CRDN_ID"));
+ crdnSttsHstry.setBfrSttsCd(levyExclInfo.string("CRDN_STTS_CD"));
+ crdnSttsHstry.setBfrSttsChgDt(levyExclInfo.string("CRDN_STTS_CHG_DT"));
+ crdnSttsHstry.setCrdnSttsCd(newCrdnSttsCd);
+ crdnSttsHstry.setTaskDtlId(levyExcl.getLevyExclId());
+
+ boolean rtnScs = crdnSttsHstryBean.createHstryUpdateCrdnSttsCd(crdnSttsHstry);
+ if (!rtnScs) {
+ throw new RuntimeException("부과제외 등록 작업 중 단속상태 변경에 실패하였습니다."); // 예외를 발생시켜서 DB Rollback
+ }
+
+ return "[S] 작업이 정상 처리 되었습니다.";
+ }
+
+ /**부과제외 대장 정보를 수정한다.
+ * @param excl 부과제외 대장
+ * @return 저장 여부
+ * 저장됐으면 true
+ * 그렇지 않으면 false
+ *
+ */
+ public String updateLevyExcl(LevyExcl levyExcl) {
+ // 부과제외(TB_LEVY_EXCL) 대장을 수정한다.
+ int rtnNocs = levyExclMapper.updateLevyExcl(levyExcl);
+ if (rtnNocs != 1) {
+ throw new RuntimeException("부과제외 정보 수정에 실패하였습니다."); // 예외를 발생시켜서 DB Rollback
+ }
+
+ return "[S] 작업이 정상 처리 되었습니다.";
+ }
+
+ /**부과제외 대장 정보를 삭제한다.
+ * @param excl 부과제외 대장
+ * @return 저장 여부
+ * 저장됐으면 true
+ * 그렇지 않으면 false
+ *
+ */
+ public String removeLevyExcl(LevyExcl levyExcl) {
+ // 변수 선언
+ int rtnNocs = -1; // 처리 결과 건수
+ String rtnMsg = ""; // 처리 결과 메시지
+
+ // 부과제외(TB_LEVY_EXCL) 정보를 조회한다.
+ DataObject levyExclInfo = levyExclMapper.selectLevyExclInfo(new LevyExclQuery().setLevyExclId(levyExcl.getLevyExclId()));
+
+ // 삭제 대상 자료 검증
+ if (levyExclInfo.string("LEVY_EXCL_ID").equals("")) {
+ rtnMsg = "[F] 작업 중 오류가 발생하였습니다. 부과제외 자료가 존재하지 않습니다.";
+ return rtnMsg;
+ }
+ if (levyExclInfo.string("LEVY_EXCL_SE_CD").equals("1") && !levyExclInfo.string("CRDN_STTS_CD").equals("81")) { // 비부과(서손)
+ rtnMsg = "[F] 작업 중 오류가 발생하였습니다. 현재 자료의 단속 상태가 " + levyExclInfo.string("CRDN_STTS_NM") + " 이(가) 아닙니다.";
+ return rtnMsg;
+ } else if (levyExclInfo.string("LEVY_EXCL_SE_CD").equals("2") && !("83,84").contains(levyExclInfo.string("CRDN_STTS_CD"))) { // 계고
+ rtnMsg = "[F] 작업 중 오류가 발생하였습니다. 현재 자료의 단속 상태가 " + levyExclInfo.string("CRDN_STTS_NM") + " 이(가) 아닙니다.";
+ return rtnMsg;
+ } else if (levyExclInfo.string("LEVY_EXCL_SE_CD").equals("3") && !levyExclInfo.string("CRDN_STTS_CD").equals("80")) { // 부과취소
+ rtnMsg = "[F] 작업 중 오류가 발생하였습니다. 현재 자료의 단속 상태가 " + levyExclInfo.string("CRDN_STTS_NM") + " 이(가) 아닙니다.";
+ return rtnMsg;
+ }
+
+ // 부과제외(TB_LEVY_EXCL) 대장을 삭제한다.
+ rtnNocs = levyExclMapper.deleteLevyExcl(levyExcl);
+ if (rtnNocs != 1) {
+ throw new RuntimeException("부과제외 정보 삭제에 실패하였습니다."); // 예외를 발생시켜서 DB Rollback
+ }
+
+ // 단속상태이력(TB_CRDN_STTS_HSTRY) 대장에 부과제외 이력삭제 및 부과제외삭제 이력을 등록한다.
+ String deltCrdnSttsCd = "";
+ if (levyExclInfo.string("CRDN_STTS_CD").equals("80")) { // 임시
+ throw new RuntimeException("부과취소는 부과제외 삭제에 실패하였습니다."); // 예외를 발생시켜서 DB Rollback
+ } else if (levyExclInfo.string("CRDN_STTS_CD").equals("81")) {
+ deltCrdnSttsCd = "91"; // 비부과(서손) 삭제
+ } else if (("83,84").contains(levyExclInfo.string("CRDN_STTS_CD"))) {
+ deltCrdnSttsCd = "93"; // 계고 삭제
+ }
+
+ boolean rtnScs = crdnSttsHstryBean.removeHstryUpdateCrdnSttsCd(levyExclInfo.string("CRDN_ID"), levyExclInfo.string("CRDN_STTS_CD"), deltCrdnSttsCd, levyExcl.getDelRsn(), true);
+ if (!rtnScs) {
+ throw new RuntimeException("부과제외 삭제 작업 중 단속상태이력 삭제 및 등록에 실패하였습니다."); // 예외를 발생시켜서 DB Rollback
+ }
+
+ // 부과제외 구분이 비부과(서손)일 경우
+ if (levyExclInfo.string("LEVY_EXCL_SE_CD").equals("1")) {
+ // 표지정보 확인여부가 조회미대상이면 -> 미확인 으로
+ // 혹시 차적조회가 안되었으면? 놔두자 차적조회되면 그 때 표지정보 BJ_Send가 처리할테니
+ if (levyExclInfo.string("PRK_PSBLTY_RSLT_CD").equals("9")) { // 주차 가능 결과 코드 - 9 조회 미대상
+ Crdn crdn = new Crdn();
+ crdn.setCrdnId(levyExclInfo.string("CRDN_ID")); // 단속 ID
+ crdn.setPrkPsbltyRsltCd("0"); // 주차 가능 결과 코드 - 0 미확인
+
+ rtnNocs = levyExclMapper.updatePrkPsbltyRsltCd(crdn);
+ if (rtnNocs != 1) {
+ throw new RuntimeException("부과제외 삭제 작업 중 단속 대장의 표지정보 수정에 실패하였습니다."); // 예외를 발생시켜서 DB Rollback
+ }
+ }
+ }
+
+ return "[S] 작업이 정상 처리 되었습니다.";
+ }
+
+}
diff --git a/src/main/java/cokr/xit/fims/levy/Levy.java b/src/main/java/cokr/xit/fims/levy/Levy.java
new file mode 100644
index 00000000..93ee0ec2
--- /dev/null
+++ b/src/main/java/cokr/xit/fims/levy/Levy.java
@@ -0,0 +1,466 @@
+package cokr.xit.fims.levy;
+
+import cokr.xit.foundation.AbstractEntity;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 부과 대장
+ * @author JoJH
+ */
+@Getter
+@Setter
+public class Levy extends AbstractEntity {
+
+ /**
+ * 부과 ID
+ */
+ private String levyId;
+
+ /**
+ * 시군구 코드
+ */
+ private String sggCd;
+
+ /**
+ * 업무 구분 코드
+ */
+ private String taskSeCd;
+
+ /**
+ * 단속 ID
+ */
+ private String crdnId;
+
+ /**
+ * 기관 코드
+ */
+ private String instCd;
+
+ /**
+ * 부서 코드
+ */
+ private String deptCd;
+
+ /**
+ * 회계 연도
+ */
+ private String fyr;
+
+ /**
+ * 회계 구분 코드
+ */
+ private String acntgSeCd;
+
+ /**
+ * 세목 코드
+ */
+ private String txitmCd;
+
+ /**
+ * 운영 항목 코드
+ */
+ private String operItemCd;
+
+ /**
+ * 특별회계 사업 코드
+ */
+ private String spclBizCd;
+
+ /**
+ * 부과 번호
+ */
+ private String levyNo;
+
+ /**
+ * 분납 일련번호
+ */
+ private String ispySn;
+
+ /**
+ * 부과 구분 코드
+ */
+ private String levySeCd;
+
+ /**
+ * 통합 구분 코드
+ */
+ private String untySeCd;
+
+ /**
+ * 감경 구분 코드
+ */
+ private String rdctSeCd;
+
+ /**
+ * 분납 구분 명
+ */
+ private String ispySeNm;
+
+ /**
+ * 부과 일자
+ */
+ private String levyYmd;
+
+ /**
+ * 최초 납기 일자
+ */
+ private String frstDudtYmd;
+
+ /**
+ * 납기 일자
+ */
+ private String dudtYmd;
+
+ /**
+ * 과태료 금액
+ */
+ private Integer ffnlgAmt;
+
+ /**
+ * 부과 본세
+ */
+ private Integer levyPcptax;
+
+ /**
+ * 부과 가산금
+ */
+ private Integer levyAdamt;
+
+ /**
+ * 분납 이자
+ */
+ private Integer ispyInt;
+
+ /**
+ * 수납 본세
+ */
+ private Integer rcvmtPcptax;
+
+ /**
+ * 수납 가산금
+ */
+ private Integer rcvmtAdamt;
+
+ /**
+ * 감액 본세
+ */
+ private Integer rdamtPcptax;
+
+ /**
+ * 감액 가산금
+ */
+ private Integer rdamtAdamt;
+
+ /**
+ * 합계 금액
+ */
+ private Integer sumAmt;
+
+ /**
+ * 납기 후 일자
+ */
+ private String dudtAftrYmd;
+
+ /**
+ * 납기 후 금액
+ */
+ private Integer dudtAftrAmt;
+
+ /**
+ * 과세 물건
+ */
+ private String txtnThing;
+
+ /**
+ * 관리 아이템1
+ */
+ private String mngItem1;
+
+ /**
+ * 관리 아이템2
+ */
+ private String mngItem2;
+
+ /**
+ * 관리 아이템3
+ */
+ private String mngItem3;
+
+ /**
+ * 관리 아이템4
+ */
+ private String mngItem4;
+
+ /**
+ * 관리 아이템5
+ */
+ private String mngItem5;
+
+ /**
+ * 관리 아이템6
+ */
+ private String mngItem6;
+
+ /**
+ * 체납 사유 코드
+ */
+ private String npmntRsnCd;
+
+ /**
+ * 수납 일자
+ */
+ private String rcvmtYmd;
+
+ /**
+ * 납부 방법 구분 코드
+ */
+ private String payMthdSeCd;
+
+ /**
+ * 압류 일자
+ */
+ private String szrYmd;
+
+ /**
+ * 압류 물건
+ */
+ private String szrThing;
+
+ /**
+ * 대체 압류 자동차등록번호
+ */
+ private String rpmSzrVhrno;
+
+ /**
+ * 압류 해제 일자
+ */
+ private String szrRmvYmd;
+
+ /**
+ * 압류 해제 사유
+ */
+ private String szrRmvRsn;
+
+ /**
+ * 기타 내용
+ */
+ private String etcCn;
+
+ /**
+ * 전자납부번호
+ */
+ private String epayno;
+
+ /**
+ * 은행 명
+ */
+ private String bankNm;
+
+ /**
+ * 가상 계좌번호
+ */
+ private String vrActno;
+
+ /**
+ * 은행 명 2
+ */
+ private String bankNm2;
+
+ /**
+ * 가상 계좌번호 2
+ */
+ private String vrActno2;
+
+ /**
+ * 은행 명 3
+ */
+ private String bankNm3;
+
+ /**
+ * 가상 계좌번호 3
+ */
+ private String vrActno3;
+
+ /**
+ * 은행 명 4
+ */
+ private String bankNm4;
+
+ /**
+ * 가상 계좌번호 4
+ */
+ private String vrActno4;
+
+ /**
+ * 은행 명 5
+ */
+ private String bankNm5;
+
+ /**
+ * 가상 계좌번호 5
+ */
+ private String vrActno5;
+
+ /**
+ * 은행 명 6
+ */
+ private String bankNm6;
+
+ /**
+ * 가상 계좌번호 6
+ */
+ private String vrActno6;
+
+ /**
+ * 은행 명 7
+ */
+ private String bankNm7;
+
+ /**
+ * 가상 계좌번호 7
+ */
+ private String vrActno7;
+
+ /**
+ * 은행 명 8
+ */
+ private String bankNm8;
+
+ /**
+ * 가상 계좌번호 8
+ */
+ private String vrActno8;
+
+ /**
+ * 은행 명 9
+ */
+ private String bankNm9;
+
+ /**
+ * 가상 계좌번호 9
+ */
+ private String vrActno9;
+
+ /**
+ * 은행 명 10
+ */
+ private String bankNm10;
+
+ /**
+ * 가상 계좌번호 10
+ */
+ private String vrActno10;
+
+ /**
+ * 은행 명 11
+ */
+ private String bankNm11;
+
+ /**
+ * 가상 계좌번호 11
+ */
+ private String vrActno11;
+
+ /**
+ * 은행 명 12
+ */
+ private String bankNm12;
+
+ /**
+ * 가상 계좌번호 12
+ */
+ private String vrActno12;
+ /**
+ * 은행 명 13
+ */
+ private String bankNm13;
+
+ /**
+ * 가상 계좌번호 13
+ */
+ private String vrActno13;
+ /**
+ * 은행 명 14
+ */
+ private String bankNm14;
+
+ /**
+ * 가상 계좌번호 14
+ */
+ private String vrActno14;
+ /**
+ * 은행 명 15
+ */
+ private String bankNm15;
+
+ /**
+ * 가상 계좌번호 15
+ */
+ private String vrActno15;
+ /**
+ * 은행 명 16
+ */
+ private String bankNm16;
+
+ /**
+ * 가상 계좌번호 16
+ */
+ private String vrActno16;
+ /**
+ * 은행 명 17
+ */
+ private String bankNm17;
+
+ /**
+ * 가상 계좌번호 17
+ */
+ private String vrActno17;
+ /**
+ * 은행 명 18
+ */
+ private String bankNm18;
+
+ /**
+ * 가상 계좌번호 18
+ */
+ private String vrActno18;
+ /**
+ * 은행 명 19
+ */
+ private String bankNm19;
+
+ /**
+ * 가상 계좌번호 19
+ */
+ private String vrActno19;
+ /**
+ * 은행 명 20
+ */
+ private String bankNm20;
+
+ /**
+ * 가상 계좌번호 20
+ */
+ private String vrActno20;
+ /**
+ * 세외수입 부과 키
+ */
+ private String nxrpLevyKey;
+
+ /**
+ * 삭제 여부
+ */
+ private String delYn;
+
+ /**
+ * 삭제 사유
+ */
+ private String delRsn;
+
+ /**
+ * 단속 Ids
+ */
+ private String[] crdnIds;
+
+}
diff --git a/src/main/java/cokr/xit/fims/levy/LevyQuery.java b/src/main/java/cokr/xit/fims/levy/LevyQuery.java
new file mode 100644
index 00000000..a92e63de
--- /dev/null
+++ b/src/main/java/cokr/xit/fims/levy/LevyQuery.java
@@ -0,0 +1,428 @@
+package cokr.xit.fims.levy;
+
+import cokr.xit.fims.cmmn.CmmnQuery;
+
+/**과태료 부과 대장 정보 조회 요청
+ *
+ * 상세 설명:
+ *
+ *
+ * ============ 변경 이력 ============
+ * 2023-08-30 JoJH 최초 작성
+ * ================================
+ *
+ */
+public class LevyQuery extends CmmnQuery {
+
+ private static final long serialVersionUID = 1L;
+
+ // ID
+ private String[] crdnIds; // 단속 Ids
+ private String crdnId; // 단속 ID
+ private String[] levyIds; // 부과 Ids
+ private String levyId; // 부과 ID
+ private String[] rdctIds; // 감경 Ids
+ private String rdctId; // 감경 ID
+ // 검색 조건
+ private String schFyr; // 회계연도
+ private String schLevyNoFrom; // 부과 번호 시작
+ private String schLevyNoTo; // 부과 번호 종료
+ private String schRdctSeCd; // 감경 구분 코드
+ private String schLevyYmdFrom; // 부과 일자 시작
+ private String schLevyYmdTo; // 부과 일자 종료
+ private String schRdctYmdFrom; // 감경 일자 시작
+ private String schRdctYmdTo; // 감경 일자 종료
+ private String schRdctRsnCd; // 감경 사유 코드
+ private String schCrdnYmdFrom; // 단속 일자 시작
+ private String schCrdnYmdTo; // 단속 일자 종료
+ private String schVhrno; // 차량번호
+ private String schCrdnSttsCd; // 단속 상태 코드
+ private String schVltnCd; // 위반 코드
+ private String schCvlcptRcptYmdFrom; // 민원 접수 일자 시작
+ private String schCvlcptRcptYmdTo; // 민원 접수 일자 종료
+ private String schCvlcptPrcsCmptnDtFrom; // 민원 처리 완료 일시 시작
+ private String schCvlcptPrcsCmptnDtTo; // 민원 처리 완료 일시 종료
+ private String schCvlcptPrcsPic; // 민원 처리 담당자
+ private String schRtpyrNo; // 납부자 번호
+ private String schRtpyrNm; // 납부자 명
+ // 상세 검색 조건
+
+ // ETC
+ private String callPurpose; // infoDialog 호출 용도(view 조회(편집불가), create 등록, update 수정, refresh 재조회).
+ private String delRsn; // 삭제 사유
+ private String tnocs; // 총 건수
+ private String gramtFfnlgAmt; // 총 금액
+ private String gramtAdvntceAmt; // 총 감경부과 금액
+ // 부과 등록
+ private String fyr; // 회계연도
+ private String acntgSeCd; // 회계 구분 코드
+ private String txitmCd; // 세목 코드
+ private String operItemCd; // 운영 항목 코드
+ private String levyYmd; // 부과 일자
+ private String dudtYmd; // 납기 일자
+ private String crdnSttsCd; // 단속 상태 코드
+
+ // ID
+ public String[] getCrdnIds() {
+ return ifEmpty(crdnIds, () -> null);
+ }
+
+ public T setCrdnIds(String... crdnIds) {
+ this.crdnIds = crdnIds;
+ return self();
+ }
+
+ public String getCrdnId() {
+ return ifEmpty(crdnId, () -> null);
+ }
+
+ public T setCrdnId(String crdnId) {
+ this.crdnId = crdnId;
+ return self();
+ }
+
+ public String[] getLevyIds() {
+ return ifEmpty(levyIds, () -> null);
+ }
+
+ public T setLevyIds(String... levyIds) {
+ this.levyIds = levyIds;
+ return self();
+ }
+
+ public String getLevyId() {
+ return ifEmpty(levyId, () -> null);
+ }
+
+ public T setLevyId(String levyId) {
+ this.levyId = levyId;
+ return self();
+ }
+
+ public String[] getRdctIds() {
+ return ifEmpty(rdctIds, () -> null);
+ }
+
+ public T setRdctIds(String... rdctIds) {
+ this.rdctIds = rdctIds;
+ return self();
+ }
+
+ public String getRdctId() {
+ return ifEmpty(rdctId, () -> null);
+ }
+
+ public T setRdctId(String rdctId) {
+ this.rdctId = rdctId;
+ return self();
+ }
+
+ // 검색 조건 //////////////////////////////////////////////////////////////////
+ public String getSchRdctYmdFrom() {
+ return ifEmpty(schRdctYmdFrom, () -> null);
+ }
+
+ public T setSchRdctYmdFrom(String schRdctYmdFrom) {
+ this.schRdctYmdFrom = schRdctYmdFrom;
+ return self();
+ }
+
+ public String getSchRdctYmdTo() {
+ return ifEmpty(schRdctYmdTo, () -> null);
+ }
+
+ public T setSchRdctYmdTo(String schRdctYmdTo) {
+ this.schRdctYmdTo = schRdctYmdTo;
+ return self();
+ }
+
+ public String getSchRdctRsnCd() {
+ return ifEmpty(schRdctRsnCd, () -> null);
+ }
+
+ public T setSchRdctRsnCd(String schRdctRsnCd) {
+ this.schRdctRsnCd = schRdctRsnCd;
+ return self();
+ }
+
+ public String getSchFyr() {
+ return ifEmpty(schFyr, () -> null);
+ }
+
+ public T setSchFyr(String schFyr) {
+ this.schFyr = schFyr;
+ return self();
+ }
+
+ public String getSchLevyNoFrom() {
+ return ifEmpty(schLevyNoFrom, () -> null);
+ }
+
+ public T setSchLevyNoFrom(String schLevyNoFrom) {
+ this.schLevyNoFrom = schLevyNoFrom;
+ return self();
+ }
+
+ public String getSchLevyNoTo() {
+ return ifEmpty(schLevyNoTo, () -> null);
+ }
+
+ public T setSchLevyNoTo(String schLevyNoTo) {
+ this.schLevyNoTo = schLevyNoTo;
+ return self();
+ }
+
+ public String getSchRdctSeCd() {
+ return ifEmpty(schRdctSeCd, () -> null);
+ }
+
+ public T setSchRdctSeCd(String schRdctSeCd) {
+ this.schRdctSeCd = schRdctSeCd;
+ return self();
+ }
+
+ public String getSchLevyYmdFrom() {
+ return ifEmpty(schLevyYmdFrom, () -> null);
+ }
+
+ public T setSchLevyYmdFrom(String schLevyYmdFrom) {
+ this.schLevyYmdFrom = schLevyYmdFrom;
+ return self();
+ }
+
+ public String getSchLevyYmdTo() {
+ return ifEmpty(schLevyYmdTo, () -> null);
+ }
+
+ public T setSchLevyYmdTo(String schLevyYmdTo) {
+ this.schLevyYmdTo = schLevyYmdTo;
+ return self();
+ }
+
+ public String getSchCrdnYmdFrom() {
+ return ifEmpty(schCrdnYmdFrom, () -> null);
+ }
+
+ public T setSchCrdnYmdFrom(String schCrdnYmdFrom) {
+ this.schCrdnYmdFrom = schCrdnYmdFrom;
+ return self();
+ }
+
+ public String getSchCrdnYmdTo() {
+ return ifEmpty(schCrdnYmdTo, () -> null);
+ }
+
+ public T setSchCrdnYmdTo(String schCrdnYmdTo) {
+ this.schCrdnYmdTo = schCrdnYmdTo;
+ return self();
+ }
+
+ public String getSchVhrno() {
+ return ifEmpty(schVhrno, () -> null);
+ }
+
+ public T setSchVhrno(String schVhrno) {
+ this.schVhrno = schVhrno;
+ return self();
+ }
+
+ public String getSchCrdnSttsCd() {
+ return ifEmpty(schCrdnSttsCd, () -> null);
+ }
+
+ public T setSchCrdnSttsCd(String schCrdnSttsCd) {
+ this.schCrdnSttsCd = schCrdnSttsCd;
+ return self();
+ }
+
+ public String getSchVltnCd() {
+ return ifEmpty(schVltnCd, () -> null);
+ }
+
+ public T setSchVltnCd(String schVltnCd) {
+ this.schVltnCd = schVltnCd;
+ return self();
+ }
+
+ public String getSchCvlcptRcptYmdFrom() {
+ return ifEmpty(schCvlcptRcptYmdFrom, () -> null);
+ }
+
+ public T setSchCvlcptRcptYmdFrom(String schCvlcptRcptYmdFrom) {
+ this.schCvlcptRcptYmdFrom = schCvlcptRcptYmdFrom;
+ return self();
+ }
+
+ public String getSchCvlcptRcptYmdTo() {
+ return ifEmpty(schCvlcptRcptYmdTo, () -> null);
+ }
+
+ public T setSchCvlcptRcptYmdTo(String schCvlcptRcptYmdTo) {
+ this.schCvlcptRcptYmdTo = schCvlcptRcptYmdTo;
+ return self();
+ }
+
+ public String getSchCvlcptPrcsCmptnDtFrom() {
+ return ifEmpty(schCvlcptPrcsCmptnDtFrom, () -> null);
+ }
+
+ public T setSchCvlcptPrcsCmptnDtFrom(String schCvlcptPrcsCmptnDtFrom) {
+ this.schCvlcptPrcsCmptnDtFrom = schCvlcptPrcsCmptnDtFrom;
+ return self();
+ }
+
+ public String getSchCvlcptPrcsCmptnDtTo() {
+ return ifEmpty(schCvlcptPrcsCmptnDtTo, () -> null);
+ }
+
+ public T setSchCvlcptPrcsCmptnDtTo(String schCvlcptPrcsCmptnDtTo) {
+ this.schCvlcptPrcsCmptnDtTo = schCvlcptPrcsCmptnDtTo;
+ return self();
+ }
+
+ public String getSchCvlcptPrcsPic() {
+ return ifEmpty(schCvlcptPrcsPic, () -> null);
+ }
+
+ public T setSchCvlcptPrcsPic(String schCvlcptPrcsPic) {
+ this.schCvlcptPrcsPic = schCvlcptPrcsPic;
+ return self();
+ }
+
+ public String getSchRtpyrNo() {
+ return ifEmpty(schRtpyrNo, () -> null);
+ }
+
+ public T setSchRtpyrNo(String schRtpyrNo) {
+ this.schRtpyrNo = schRtpyrNo;
+ return self();
+ }
+
+ public String getSchRtpyrNm() {
+ return ifEmpty(schRtpyrNm, () -> null);
+ }
+
+ public T setSchRtpyrNm(String schRtpyrNm) {
+ this.schRtpyrNm = schRtpyrNm;
+ return self();
+ }
+ // 검색 조건 //////////////////////////////////////////////////////////////////
+
+ // 상세 검색 조건 ///////////////////////////////////////////////////////////////
+
+ // 상세 검색 조건 ///////////////////////////////////////////////////////////////
+
+ // ETC ////////////////////////////////////////////////////////////////////
+ public String getCallPurpose() {
+ return ifEmpty(callPurpose, () -> null);
+ }
+
+ public T setCallPurpose(String callPurpose) {
+ this.callPurpose = callPurpose;
+ return self();
+ }
+
+ public String getDelRsn() {
+ return ifEmpty(delRsn, () -> null);
+ }
+
+ public T setDelRsn(String delRsn) {
+ this.delRsn = delRsn;
+ return self();
+ }
+ // ETC /////////////////////////////////////////////////////////////////////
+
+ public String getTnocs() {
+ return ifEmpty(tnocs, () -> null);
+ }
+
+ public T setTnocs(String tnocs) {
+ this.tnocs = tnocs;
+ return self();
+ }
+
+ public String getGramtFfnlgAmt() {
+ return ifEmpty(gramtFfnlgAmt, () -> null);
+ }
+
+ public T setGramtFfnlgAmt(String gramtFfnlgAmt) {
+ this.gramtFfnlgAmt = gramtFfnlgAmt;
+ return self();
+ }
+
+ public String getGramtAdvntceAmt() {
+ return ifEmpty(gramtAdvntceAmt, () -> null);
+ }
+
+ public T setGramtAdvntceAmt(String gramtAdvntceAmt) {
+ this.gramtAdvntceAmt = gramtAdvntceAmt;
+ return self();
+ }
+ // ETC ////////////////////////////////////////////////////////////////////
+
+ // 부과 등록 //////////////////////////////////////////////////////////////////
+ public String getFyr() {
+ return ifEmpty(fyr, () -> null);
+ }
+
+ public T setFyr(String fyr) {
+ this.fyr = fyr;
+ return self();
+ }
+
+ public String getAcntgSeCd() {
+ return ifEmpty(acntgSeCd, () -> null);
+ }
+
+ public T setAcntgSeCd(String acntgSeCd) {
+ this.acntgSeCd = acntgSeCd;
+ return self();
+ }
+
+ public String getTxitmCd() {
+ return ifEmpty(txitmCd, () -> null);
+ }
+
+ public T setTxitmCd(String txitmCd) {
+ this.txitmCd = txitmCd;
+ return self();
+ }
+
+ public String getOperItemCd() {
+ return ifEmpty(operItemCd, () -> null);
+ }
+
+ public T setOperItemCd(String operItemCd) {
+ this.operItemCd = operItemCd;
+ return self();
+ }
+
+ public String getLevyYmd() {
+ return ifEmpty(levyYmd, () -> null);
+ }
+
+ public T setLevyYmd(String levyYmd) {
+ this.levyYmd = levyYmd;
+ return self();
+ }
+
+ public String getDudtYmd() {
+ return ifEmpty(dudtYmd, () -> null);
+ }
+
+ public T setDudtYmd(String dudtYmd) {
+ this.dudtYmd = dudtYmd;
+ return self();
+ }
+
+ public String getCrdnSttsCd() {
+ return ifEmpty(crdnSttsCd, () -> null);
+ }
+
+ public T setCrdnSttsCd(String crdnSttsCd) {
+ this.crdnSttsCd = crdnSttsCd;
+ return self();
+ }
+ // 부과 등록 //////////////////////////////////////////////////////////////////
+
+}
diff --git a/src/main/java/cokr/xit/fims/levy/dao/LevyMapper.java b/src/main/java/cokr/xit/fims/levy/dao/LevyMapper.java
new file mode 100644
index 00000000..23881c4f
--- /dev/null
+++ b/src/main/java/cokr/xit/fims/levy/dao/LevyMapper.java
@@ -0,0 +1,140 @@
+package cokr.xit.fims.levy.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.levy.Levy;
+import cokr.xit.fims.levy.LevyQuery;
+
+/** 부과 대장 정보 DAO
+ *
+ * 상세 설명:
+ *
+ *
+ * ============ 변경 이력 ============
+ * 2023-08-30 JoJH 최초 작성
+ * ================================
+ *
+ */
+@Mapper("levyMapper")
+public interface LevyMapper extends AbstractMapper {
+
+ /**지정한 조건에 따라 감경부과 대상 목록을 조회하여 반환한다.
+ * @param req 부과 대장 조회 조건
+ * @return 부과 대장 목록
+ */
+ List selectRdctLevyTrgtList(LevyQuery req);
+
+ /**지정한 조건에 따라 감경부과 대상 단속ID 목록을 조회하여 반환한다.
+ * @param req 부과 대장 조회 조건
+ * @return 단속 ID 목록
+ */
+ List selectRdctLevyTrgtIds(LevyQuery req);
+
+ /**지정한 조건에 따라 부과 대장 목록을 조회하여 반환한다.
+ * @param req 부과 대장 조회 조건
+ * @return 부과 대장 목록
+ */
+ List selectLevyList(LevyQuery req);
+
+ /**지정한 조건에 따라 부과 대장 객체들을 반환한다.
+ * @param req 부과 대장 조회 조건
+ * @return 부과 대장 객체 목록
+ */
+ List selectLevys(LevyQuery req);
+
+ /**지정한 부과 ID에 따라 부과 대장 객체를 반환한다.
+ * @param levyId 부과 ID
+ * @return 부과 대장 객체
+ */
+ default DataObject selectLevyInfo(LevyQuery req) {
+ // 삭제 여부 확인
+ if (req.getDelYn() == null) {
+ req.setDelYn("N");
+ }
+ // 기본 정렬
+ if (req.getOrderBy() == null) {
+ req.setOrderBy("L.LEVY_ID DESC");
+ }
+
+ List levys = selectLevys(req);
+
+ return !levys.isEmpty() ? levys.get(0) : null;
+ }
+
+ /**지정한 단속 ID에 따라 단속 대장 객체를 반환한다.
+ * @param crdnId 단속 ID
+ * @return 고지 번호
+ */
+ String selectMaxLevyNo(LevyQuery req);
+
+ /**부과 대장 정보를 등록한다.
+ * @param params 파라미터
+ * "levy" - 부과 대장
+ * "currentUser" - 현재 접속한 사용자
+ *
+ * @return 저장된 정보수
+ */
+ int insertLevy(Levy levy);
+
+ /**부과 대장 정보를 수정한다.
+ * @param params 파라미터
+ * "levy" - 부과 대장
+ * "currentUser" - 현재 접속한 사용자
+ *
+ * @return 저장된 정보수
+ */
+ int updateLevy(Levy levy);
+
+ /**부과 대장에 부과일자, 최초납기일자, 납기일자 정보를 수정한다.
+ * @param levy 부과 대장
+ * @return 저장 여부
+ * 저장됐으면 true
+ * 그렇지 않으면 false
+ *
+ */
+ int updateRdctLevyYmd(Levy levy);
+
+ /**부과 대장에 수납 금액 정보를 수정한다.
+ * @param levy 부과 대장
+ * @return 저장 여부
+ * 저장됐으면 true
+ * 그렇지 않으면 false
+ *
+ */
+ int updateRcvmt(Levy levy);
+
+ /**부과 대장에 감액 금액 정보를 수정한다.
+ * @param levy 부과 대장
+ * @return 저장 여부
+ * 저장됐으면 true
+ * 그렇지 않으면 false
+ *
+ */
+ int updateRdamt(Levy levy);
+
+ /**지정한 부과 대장을 삭제한다.
+ * @param params 파라미터
+ * "levy" - 부과 대장
+ * "currentUser" - 현재 접속한 사용자
+ *
+ * @return 저장된 정보수
+ */
+ int deleteLevy(Levy levy);
+
+ /**지정한 단속 ID로 단속 대장 객체를 반환한다.
+ * @param crdnId 단속 ID
+ * @return 단속 대장 객체
+ */
+ DataObject selectCrdn(String crdnId);
+
+ /**지정한 조건에 따라 부과 대장 객체들을 반환한다.
+ * @param req 부과 대장 조회 조건
+ * @return 부과 대장 객체 목록
+ */
+ DataObject selectLevyAmt(LevyQuery req);
+
+}
diff --git a/src/main/java/cokr/xit/fims/rdca/Rdamt.java b/src/main/java/cokr/xit/fims/rdca/Rdamt.java
new file mode 100644
index 00000000..964bfbb8
--- /dev/null
+++ b/src/main/java/cokr/xit/fims/rdca/Rdamt.java
@@ -0,0 +1,96 @@
+package cokr.xit.fims.rdca;
+
+import lombok.Getter;
+import lombok.Setter;
+import cokr.xit.foundation.AbstractEntity;
+
+/**
+ * 감액 대장
+ * @author JoJH
+ */
+@Getter
+@Setter
+public class Rdamt extends AbstractEntity {
+
+ /**
+ * 감액 ID
+ */
+ private String rdamtId;
+
+ /**
+ * 부과 ID
+ */
+ private String levyId;
+
+ /**
+ * 최종 본세
+ */
+ private Integer lastPcptax;
+
+ /**
+ * 최종 가산금
+ */
+ private Integer lastAdamt;
+
+ /**
+ * 감액 일자
+ */
+ private String rdamtYmd;
+
+ /**
+ * 감액 구분 코드
+ */
+ private String rdamtSeCd;
+
+ /**
+ * 감액 사유 코드
+ */
+ private String rdamtRsnCd;
+
+ /**
+ * 감액 본세
+ */
+ private Integer rdamtPcptax;
+
+ /**
+ * 감액 가산금
+ */
+ private Integer rdamtAdamt;
+
+ /**
+ * 감액 취소 여부
+ */
+ private String rdamtRtrcnYn;
+
+ /**
+ * 감액 취소 일자
+ */
+ private String rdamtRtrcnYmd;
+
+ /**
+ * 감액 취소 사유
+ */
+ private String rdamtRtrcnRsn;
+
+ /**
+ * 삭제 여부
+ */
+ private String delYn;
+
+ /**
+ * 삭제 사유
+ */
+ private String delRsn;
+
+ // 추가 /////////////////////////////////////////////////////////////////////
+ /**
+ * 부과 Ids
+ */
+ private String[] levyIds;
+
+ /**
+ * 시군구 코드
+ */
+ private String sggCd;
+
+}
diff --git a/src/main/java/cokr/xit/fims/rdca/RdamtQuery.java b/src/main/java/cokr/xit/fims/rdca/RdamtQuery.java
new file mode 100644
index 00000000..af8eb1eb
--- /dev/null
+++ b/src/main/java/cokr/xit/fims/rdca/RdamtQuery.java
@@ -0,0 +1,110 @@
+package cokr.xit.fims.rdca;
+
+import cokr.xit.fims.cmmn.CmmnQuery;
+
+/**감액 대장 정보 조회 요청
+ *
+ * 상세 설명:
+ *
+ *
+ * ============ 변경 이력 ============
+ * 2024-02-01 JoJH 최초 작성
+ * ================================
+ *
+ */
+public class RdamtQuery extends CmmnQuery {
+
+ private static final long serialVersionUID = 1L;
+
+ // ID
+ private String[] rdamtIds; // 감액 Ids
+ private String rdamtId; // 감액 ID
+ private String[] levyIds; // 부과 Ids
+ private String levyId; // 부과 ID
+
+ // 검색 조건
+ private String schLevyExclYmdFrom; // 부과제외_부과제외 일자 시작
+ private String schLevyExclYmdTo; // 부과제외_부과제외 일자 종료
+ // 상세 검색 조건
+
+ // 동적 검색 조건
+
+ // ETC
+ private String callPurpose; // infoDialog 호출 용도(view 조회(편집불가), create 등록, update 수정, refresh 재조회).
+ private String delRsn; // 삭제 사유
+
+
+ public String[] getRdamtIds() {
+ return ifEmpty(rdamtIds, () -> null);
+ }
+
+ public T setRdamtIds(String... rdamtIds) {
+ this.rdamtIds = rdamtIds;
+ return self();
+ }
+
+ public String getRdamtId() {
+ return ifEmpty(rdamtId, () -> null);
+ }
+
+ public T setRdamtId(String rdamtId) {
+ this.rdamtId = rdamtId;
+ return self();
+ }
+
+ public String[] getLevyIds() {
+ return ifEmpty(levyIds, () -> null);
+ }
+
+ public T setLevyIds(String... levyIds) {
+ this.levyIds = levyIds;
+ return self();
+ }
+
+ public String getLevyId() {
+ return ifEmpty(levyId, () -> null);
+ }
+
+ public T setLevyId(String levyId) {
+ this.levyId = levyId;
+ return self();
+ }
+
+ public String getSchLevyExclYmdFrom() {
+ return ifEmpty(schLevyExclYmdFrom, () -> null);
+ }
+
+ public T setSchLevyExclYmdFrom(String schLevyExclYmdFrom) {
+ this.schLevyExclYmdFrom = schLevyExclYmdFrom;
+ return self();
+ }
+
+ public String getSchLevyExclYmdTo() {
+ return ifEmpty(schLevyExclYmdTo, () -> null);
+ }
+
+ public T setSchLevyExclYmdTo(String schLevyExclYmdTo) {
+ this.schLevyExclYmdTo = schLevyExclYmdTo;
+ return self();
+ }
+
+ // ETC /////////////////////////////////////////////////////////////////////
+ public String getCallPurpose() {
+ return ifEmpty(callPurpose, () -> null);
+ }
+
+ public T setCallPurpose(String callPurpose) {
+ this.callPurpose = callPurpose;
+ return self();
+ }
+
+ public String getDelRsn() {
+ return ifEmpty(delRsn, () -> null);
+ }
+
+ public T setDelRsn(String delRsn) {
+ this.delRsn = delRsn;
+ return self();
+ }
+ // ETC /////////////////////////////////////////////////////////////////////
+}
diff --git a/src/main/java/cokr/xit/fims/rdca/dao/RdamtMapper.java b/src/main/java/cokr/xit/fims/rdca/dao/RdamtMapper.java
new file mode 100644
index 00000000..4b3ec010
--- /dev/null
+++ b/src/main/java/cokr/xit/fims/rdca/dao/RdamtMapper.java
@@ -0,0 +1,117 @@
+package cokr.xit.fims.rdca.dao;
+
+import java.util.List;
+import java.util.Map;
+
+import org.egovframe.rte.psl.dataaccess.mapper.Mapper;
+
+import cokr.xit.foundation.component.AbstractMapper;
+import cokr.xit.foundation.data.DataObject;
+import cokr.xit.fims.rdca.Rdamt;
+import cokr.xit.fims.rdca.RdamtQuery;
+
+/** 감액 대장 정보 DAO
+ *
+ * 상세 설명:
+ *
+ *
+ * ============ 변경 이력 ============
+ * 2024-02-01 JoJH 최초 작성
+ * ================================
+ *
+ */
+@Mapper("rdamtMapper")
+public interface RdamtMapper extends AbstractMapper {
+
+ /**지정한 조건에 따라 감액 대장 목록을 조회하여 반환한다.
+ * @param req 감액 대장 조회 조건
+ * @return 감액 대장 목록
+ */
+ List selectRdamtList(RdamtQuery req);
+
+ /**지정한 조건에 따라 감액 대장 객체들을 반환한다.
+ * @param req 감액 대장 조회 조건
+ * @return 감액 대장 객체 목록
+ */
+ List selectRdamts(RdamtQuery req);
+
+ /**지정한 조건에 따라 감액 대장 객체 1건을 반환한다.
+ * @param req 감액 대장 조회 조건
+ * @return 감액 대장 객체
+ */
+ default DataObject selectRdamtInfo(RdamtQuery req) {
+ // 삭제 여부 확인
+ if (req.getDelYn() == null) {
+ req.setDelYn("N");
+ }
+ // 기본 정렬
+ if (req.getOrderBy() == null) {
+ req.setOrderBy("R.RDAMT_ID DESC");
+ }
+
+ List rdcamts = selectRdamts(req);
+
+ return !rdcamts.isEmpty() ? rdcamts.get(0) : null;
+ }
+
+ /**감액 대장 정보를 등록한다.
+ * @param params 파라미터
+ * "rdcamt" - 감액 대장
+ * "currentUser" - 현재 접속한 사용자
+ *
+ * @return 저장된 정보수
+ */
+ int insertRdamt(Map params);
+
+ /**감액 대장 정보를 등록한다.
+ * @param rdamt 감액 대장
+ * @return 저장 여부
+ * 저장됐으면 true
+ * 그렇지 않으면 false
+ *
+ */
+ default boolean insert(Rdamt rdamt) {
+ return rdamt != null && insertRdamt(params().set("rdamt", rdamt)) == 1;
+ }
+
+ /**감액 대장 정보를 수정한다.
+ * @param params 파라미터
+ * "rdamt" - 감액 대장
+ * "currentUser" - 현재 접속한 사용자
+ *
+ * @return 저장된 정보수
+ */
+ int updateRdamt(Map params);
+
+ /**감액 대장 정보를 수정한다.
+ * @param rdamt 감액 대장
+ * @return 저장 여부
+ * 저장됐으면 true
+ * 그렇지 않으면 false
+ *
+ */
+ default boolean update(Rdamt rdamt) {
+ return rdamt != null && updateRdamt(params().set("rdamt", rdamt)) == 1;
+ }
+
+ /**지정한 감액 대장을 삭제한다.
+ * @param params 파라미터
+ * "rdcamt" - 감액 대장
+ * "currentUser" - 현재 접속한 사용자
+ *
+ * @return 저장된 정보수
+ */
+ int deleteRdamt(Map params);
+
+ /**감액 대장 정보를 삭제한다.
+ * @param rdamt 감액 대장
+ * @return 저장 여부
+ * 저장됐으면 true
+ * 그렇지 않으면 false
+ *
+ */
+ default boolean delete(Rdamt rdamt) {
+ return rdamt != null && deleteRdamt(params().set("rdamt", rdamt)) == 1;
+ }
+
+}
diff --git a/src/main/java/cokr/xit/fims/rdca/service/bean/RdamtBean.java b/src/main/java/cokr/xit/fims/rdca/service/bean/RdamtBean.java
new file mode 100644
index 00000000..66ec4624
--- /dev/null
+++ b/src/main/java/cokr/xit/fims/rdca/service/bean/RdamtBean.java
@@ -0,0 +1,207 @@
+package cokr.xit.fims.rdca.service.bean;
+
+import java.util.List;
+
+import javax.annotation.Resource;
+
+import org.springframework.stereotype.Component;
+
+import cokr.xit.fims.cmmn.CmmnUtil;
+import cokr.xit.fims.levy.Levy;
+import cokr.xit.fims.levy.LevyQuery;
+import cokr.xit.fims.levy.dao.LevyMapper;
+import cokr.xit.fims.rdca.Rdamt;
+import cokr.xit.fims.rdca.RdamtQuery;
+import cokr.xit.fims.rdca.dao.RdamtMapper;
+import cokr.xit.foundation.component.AbstractBean;
+import cokr.xit.foundation.data.DataObject;
+
+/**감액 대장 정보 관리 Bean
+ *
+ * 상세 설명:
+ *
+ *
+ * ============ 변경 이력 ============
+ * 2024-02-01 JoJH 최초 작성
+ * ================================
+ *
+ */
+@Component("rdamtBean")
+public class RdamtBean extends AbstractBean {
+
+ /** 감액 대장 정보 DAO */
+ @Resource(name = "rdamtMapper")
+ private RdamtMapper rdamtMapper;
+
+ /** 부과 대장 정보 DAO */
+ @Resource(name = "levyMapper")
+ private LevyMapper levyMapper;
+
+ /**지정한 조건에 따라 감액 대장 목록을 조회하여 반환한다.
+ * @param req 감액 대장 조회 조건
+ * @return 감액 대장 목록
+ */
+ public List getRdamtList(RdamtQuery req) {
+ // 삭제 여부 확인
+ if (req.getDelYn() == null) {
+ req.setDelYn("N");
+ }
+ // 정렬 확인
+ if (req.getOrderBy() == null) {
+ if (req.getBy() == null) {
+ req.setOrderBy("REG_DT");
+ } else {
+ req.setOrderBy(CmmnUtil.convertCamelCaseToSnakeCase(req.getBy()));
+ }
+ }
+
+ return rdamtMapper.selectRdamtList(req);
+ }
+
+ /**지정한 조건에 따라 감액 대장 객체들을 반환한다.
+ * @param req 감액 대장 조회 조건
+ * @return 감액 대장 객체 목록
+ */
+ public List getRdamts(RdamtQuery req) {
+ // 삭제 여부 확인
+ if (req.getDelYn() == null) {
+ req.setDelYn("N");
+ }
+ if (req.getOrderBy() == null) {
+ req.setOrderBy("R.RDAMT_ID DESC");
+ }
+
+ return rdamtMapper.selectRdamts(req);
+ }
+
+ /**지정한 조건에 따라 감액 대장 객체 1건을 반환한다.
+ * @param req 감액 대장 조회 조건
+ * @return 감액 대장 객체
+ */
+ public DataObject getRdamtInfo(RdamtQuery req) {
+ DataObject rdamtInfo = new DataObject();
+
+// if (req.getCallPurpose().equals("create")) {
+// rdcamtInfo = rdcamtMapper.selectCrdnInfo(req);
+// } else {
+ rdamtInfo = rdamtMapper.selectRdamtInfo(req);
+// }
+
+ return rdamtInfo;
+ }
+
+ /**감액 대장 정보를 등록한다.
+ * @param rdcamt 감액 대장
+ * @return 저장 여부
+ * 저장됐으면 true
+ * 그렇지 않으면 false
+ *
+ */
+ public String createRdamt(Rdamt rdamt) {
+ // 변수 선언
+ boolean rtnScs = false; // DB 처리 결과
+ int rtnNocs = -1; // 처리 결과 건수
+ String rtnMsg = ""; // 처리 결과 메시지
+
+ // 부과 ID로 부과 정보 조회
+ DataObject levyInfo = levyMapper.selectLevyAmt(new LevyQuery().setLevyId(rdamt.getLevyId()));
+
+ // 부과(TB_LEVY) 대장 정보를 수정한다.
+ Levy levy = new Levy();
+ levy.setLevyId(levyInfo.string("LEVY_ID")); // 부과 ID
+
+ if ("02,03,04".contains(rdamt.getRdamtSeCd())) { // 02:부과취소, 03:이의신청수용, 04:법원이송
+ // 수납금액이 있으면 오류 발생
+ if (levyInfo.number("RCVMT_PCPTAX").intValue() + levyInfo.number("RCVMT_ADAMT").intValue() > 0) {
+ rtnMsg = "[F] 수납금액이 존재합니다. 부분 감액으로 진행하시기 바랍니다."; // 예외를 발생시켜서 DB Rollback
+ return rtnMsg;
+ }
+
+ levy.setRdamtPcptax(levyInfo.number("LEVY_PCPTAX").intValue()); // 감액 본세
+ levy.setRdamtAdamt(levyInfo.number("LEVY_ADAMT").intValue()); // 감액 가산금
+ levy.setSumAmt(0); // 합계 금액
+ levy.setDudtAftrAmt(0); // 납기 후 금액
+ } else {
+ levy.setRdamtPcptax(levyInfo.number("RDAMT_PCPTAX").intValue() + rdamt.getRdamtPcptax()); // 감액 본세
+ levy.setRdamtAdamt(levyInfo.number("RDAMT_ADAMT").intValue() + rdamt.getRdamtAdamt()); // 감액 가산금
+ levy.setSumAmt(levyInfo.number("SUM_AMT").intValue() - rdamt.getRdamtPcptax() - rdamt.getRdamtAdamt()); // 합계 금액
+ if (levy.getSumAmt() > 0) {
+ levy.setDudtAftrAmt(levyInfo.number("DUDT_AFTR_AMT").intValue() - rdamt.getRdamtPcptax() - rdamt.getRdamtAdamt()); // 납기 후 금액
+ } else {
+ levy.setDudtAftrAmt(0);
+ }
+ }
+
+ rtnNocs = levyMapper.updateRdamt(levy);
+ if (rtnNocs != 1) {
+ throw new RuntimeException("부과 대장의 감액 금액 수정에 실패하였습니다."); // 예외를 발생시켜서 DB Rollback
+ }
+
+ // 감액(TB_RDAMT) 대장 정보를 등록한다.
+ if ("02,03,04".contains(rdamt.getRdamtSeCd())) { // 02:부과취소, 03:이의신청수용, 04:법원이송
+ rdamt.setLastPcptax(levyInfo.number("LEVY_PCPTAX").intValue());
+ rdamt.setLastAdamt(levyInfo.number("LEVY_ADAMT").intValue());
+ rdamt.setRdamtPcptax(levyInfo.number("LEVY_PCPTAX").intValue());
+ rdamt.setRdamtAdamt(levyInfo.number("LEVY_ADAMT").intValue());
+ } else {
+ rdamt.setLastPcptax(levyInfo.number("LAST_PCPTAX").intValue());
+ rdamt.setLastAdamt(levyInfo.number("LAST_ADAMT").intValue());
+ rdamt.setRdamtPcptax(rdamt.getRdamtPcptax());
+ rdamt.setRdamtAdamt(rdamt.getRdamtAdamt());
+ }
+
+ rtnScs = rdamtMapper.insert(rdamt);
+ if (!rtnScs) {
+ throw new RuntimeException("감액 대장 등록에 실패하였습니다."); // 예외를 발생시켜서 DB Rollback
+ }
+
+ return "[S] 작업이 정상 처리 되었습니다.";
+ }
+
+ /**감액 대장 정보를 수정한다.
+ * @param rdcamt 감액 대장
+ * @return 저장 여부
+ * 저장됐으면 true
+ * 그렇지 않으면 false
+ *
+ */
+ public String updateRdamt(Rdamt rdamt) {
+ // 변수 선언
+ boolean rtnScs = false; // DB 처리 결과
+ String rtnMsg = "[F] "; // 처리 결과 메시지
+
+ // 감액(TB_RDAMT) 대장 정보를 수정한다.
+ rtnScs = rdamtMapper.update(rdamt);
+ if (!rtnScs) {
+ throw new RuntimeException("감액 대장 수정에 실패하였습니다."); // 예외를 발생시켜서 DB Rollback
+ }
+
+ rtnMsg = "[S] 작업이 정상 처리 되었습니다.";
+
+ return rtnMsg;
+ }
+
+ /**감액 대장 정보를 삭제한다.
+ * @param rdcamt 감액 대장
+ * @return 저장 여부
+ * 저장됐으면 true
+ * 그렇지 않으면 false
+ *
+ */
+ public String removeRdamt(Rdamt rdamt) {
+ // 변수 선언
+ boolean rtnScs = false; // DB 처리 결과
+ String rtnMsg = "[F] "; // 처리 결과 메시지
+
+ // 감액(TB_RDAMT) 대장 정보를 삭제한다.
+ rtnScs = rdamtMapper.delete(rdamt);
+ if (!rtnScs) {
+ throw new RuntimeException("감액 정보 삭제에 실패하였습니다."); // 예외를 발생시켜서 DB Rollback
+ }
+
+ rtnMsg = "[S] 작업이 정상 처리 되었습니다.";
+
+ return rtnMsg;
+ }
+
+}
diff --git a/src/main/resources/sql/mapper/fims/crdn/crdn-info-mapper.xml b/src/main/resources/sql/mapper/fims/crdn/crdn-info-mapper.xml
new file mode 100644
index 00000000..76c9eb84
--- /dev/null
+++ b/src/main/resources/sql/mapper/fims/crdn/crdn-info-mapper.xml
@@ -0,0 +1,159 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ /* 단속정보 조회(crdnInfoMapper.selectCrdnInfo) */
+ SELECT C.CRDN_ID
+ , C.SGG_CD
+ , C.TASK_SE_CD
+ , C.CRDN_REG_SE_CD
+ , C.CRDN_YMD
+ , C.CRDN_TM
+ , C.VHRNO
+ , C.CRDN_STDG_NM
+ , C.CRDN_ROAD_NM
+ , C.CRDN_PLC
+ , C.VLTN_ID
+ , C.VIN VIN
+ , C.VHCL_NM
+ , C.VHCL_COLR
+ , C.FFNLG_CRDN_AMT
+ , C.ETC_CN
+ , C.ATCH_FILE_CNT
+ , C.CRDN_STTS_CD
+ , C.CRDN_STTS_CHG_DT
+ , C.NXRP_CRDN_LINK_YN
+ , C.NXRP_CRDN_LINK_USER_ID
+ , C.NXRP_CRDN_LINK_DT
+ , C.LINK_TBL_NM
+ , C.LINK_ID
+ , C.GPS_X
+ , C.GPS_Y
+ , V.VLTN_CD
+ , V.VLTN_ARTCL
+ , V.VLTN_LAW_NM
+ , V.VLTN_LAW1
+ , V.VLTN_LAW2
+ , CA.CRDN_SE_CD
+ , CA.TEAM_ID
+ , CA.DTL_CRDN_PLC
+ , CA.CRDN_SPAREA_CD
+ , CA.CRDN_BGNG_TM
+ , CA.CRDN_END_TM
+ , CA.CRDN_SN
+ , CA.MOSC_X
+ , CA.MOSC_Y
+ , CA.TOWNG_YN
+ , CA.USE_FUEL_CD
+ , CA.FFNLG_CARMDL_CD
+ , CA.PRK_PSBLTY_RSLT_CD
+ , CA.VLTN_NMTM
+ , CA.OVTM_YN
+ , CA.OVTM_PRTTN_YN
+ , P.RTPYR_ID
+ , PA.ADDR_SN
+ , CC.CVLCPT_LINK_ID
+ , CC.CVLCPT_TRSM_CD
+ , CC.CVLCPT_PRCS_CD
+ , CC.DSTRBNC_YN
+ , LE.LEVY_EXCL_SE_CD
+ , LE.LEVY_EXCL_RSN_CD
+ FROM TB_CRDN C
+ INNER JOIN TB_CRDN_ADI CA ON (C.CRDN_ID = CA.CRDN_ID)
+ INNER JOIN TB_VLTN V ON (C.VLTN_ID = V.VLTN_ID)
+ LEFT OUTER JOIN TB_CRDN_CVLCPT CC ON (C.CVLCPT_LINK_YN = 'Y' AND C.LINK_ID = CC.CVLCPT_LINK_ID)
+ LEFT OUTER JOIN TB_PAYER P ON (C.RTPYR_ID = P.RTPYR_ID)
+ LEFT OUTER JOIN TB_PAYER_ADDR PA ON (C.RTPYR_ID = PA.RTPYR_ID AND C.ADDR_SN = PA.ADDR_SN)
+ LEFT OUTER JOIN TB_LEVY_EXCL LE ON (C.CRDN_ID = LE.CRDN_ID AND LE.DEL_YN = 'N')
+ WHERE C.DEL_YN = 'N'
+ AND C.CRDN_ID = #{crdnId}
+
+
+
diff --git a/src/main/resources/sql/mapper/fims/crdn/crdn-inst-mapper.xml b/src/main/resources/sql/mapper/fims/crdn/crdn-inst-mapper.xml
new file mode 100644
index 00000000..4dcd3b1b
--- /dev/null
+++ b/src/main/resources/sql/mapper/fims/crdn/crdn-inst-mapper.xml
@@ -0,0 +1,170 @@
+
+
+
+
+
+/* 단속 대장 등록(crdnInstMapper.insertCrdn) */
+
+
+
+
+
+
+
+INSERT INTO TB_CRDN (
+ CRDN_ID
+ , SGG_CD
+ , CRDN_REG_SE_CD
+ , CRDN_INPT_SE_CD
+ , TASK_SE_CD
+ , CVLCPT_LINK_YN
+ , LINK_TBL_NM
+ , LINK_ID
+ , RTPYR_ID
+ , ADDR_SN
+ , CRDN_YMD
+ , CRDN_TM
+ , VHRNO
+ , CRDN_STDG_NM
+ , CRDN_ROAD_NM
+ , CRDN_PLC
+ , VLTN_ID
+ , GPS_X
+ , GPS_Y
+ , ATCH_FILE_CNT
+ , VIN
+ , VHCL_NM
+ , VHCL_COLR
+ , FFNLG_CRDN_AMT
+ , FFNLG_RDCRT
+ , FFNLG_AMT
+ , ADVNTCE_BGNG_YMD
+ , ADVNTCE_DUDT_YMD
+ , ADVNTCE_AMT
+ , OPNN_SBMSN_YN
+ , ETC_CN
+ , CRDN_STTS_CD
+ , CRDN_STTS_CHG_DT
+ , ADTN_AMT
+ , MINUS_AMT
+ , RCVMT_AMT
+ , BFR_CRDN_ID
+ , DEL_YN
+ , REG_DT
+ , RGTR
+ , MDFCN_DT
+ , MDFR
+ , DEL_DT
+ , DLTR
+ , DEL_RSN
+) VALUES (
+ #{crdnId}
+ , #{sggCd}
+ , #{crdnRegSeCd}
+ , #{crdnInptSeCd}
+ , #{taskSeCd}
+ , #{cvlcptLinkYn}
+ , #{linkTblNm}
+ , #{linkId}
+ , #{rtpyrId}
+ , #{addrSn}
+ , #{crdnYmd}
+ , #{crdnTm}
+ , #{vhrno}
+ , #{crdnStdgNm}
+ , #{crdnRoadNm}
+ , #{crdnPlc}
+ , (SELECT A.VLTN_ID
+ FROM TB_VLTN A
+ WHERE A.SGG_CD = #{sggCd}
+ AND A.TASK_SE_CD = #{taskSeCd}
+ AND A.VLTN_CD = #{vltnCd})
+ , #{gpsX}
+ , #{gpsY}
+ , #{atchFileCnt}
+ , #{vin}
+ , #{vhclNm}
+ , #{vhclColr}
+ , #{ffnlgCrdnAmt}
+ , #{ffnlgRdcrt}
+ , #{ffnlgAmt}
+ , #{advntceBgngYmd}
+ , #{advntceDudtYmd}
+ , #{advntceAmt}
+ , #{opnnSbmsnYn}
+ , #{etcCn}
+ , #{crdnSttsCd}
+ , #{crdnSttsChgDt}
+ , #{adtnAmt}
+ , #{minusAmt}
+ , #{rcvmtAmt}
+ , #{bfrCrdnId}
+ , 'N'
+ , #{createdAt}
+ , #{createdBy}
+ , #{lastModified}
+ , #{modifiedBy}
+ , #{removedAt}
+ , #{removedBy}
+ , #{delRsn}
+)
+
+
+
+/* 단속 부가 정보 등록(crdnInstMapper.insertCrdnAddition) */
+INSERT INTO TB_CRDN_ADI (
+ CRDN_ID
+ , CRDN_SE_CD
+ , DTL_CRDN_PLC
+ , CRDN_SPAREA_CD
+ , CRDN_BGNG_TM
+ , CRDN_END_TM
+ , CRDN_SN
+ , MOSC_X
+ , MOSC_Y
+ , TOWNG_YN
+ , USE_FUEL_CD
+ , FFNLG_CARMDL_CD
+ , PRK_PSBLTY_RSLT_CD
+ , VLTN_NMTM
+ , OVTM_YN
+ , OVTM_PRTTN_YN
+ , TEAM_ID
+ , DEL_YN
+ , REG_DT
+ , RGTR
+ , MDFCN_DT
+ , MDFR
+ , DEL_DT
+ , DLTR
+ , DEL_RSN
+) VALUES (
+ #{crdnId}
+ , #{crdnSeCd}
+ , #{dtlCrdnPlc}
+ , #{crdnSpareaCd}
+ , #{crdnBgngTm}
+ , #{crdnEndTm}
+ , #{crdnSn}
+ , #{moscX}
+ , #{moscY}
+ , #{towngYn}
+ , #{useFuelCd}
+ , #{ffnlgCarmdlCd}
+ , #{prkPsbltyRsltCd}
+ , #{vltnNmtm}
+ , IFNULL(#{ovtmYn},'N')
+ , 'N'
+ , #{teamId}
+ , 'N'
+ , #{createdAt}
+ , #{createdBy}
+ , #{lastModified}
+ , #{modifiedBy}
+ , #{removedAt}
+ , #{removedBy}
+ , #{delRsn}
+)
+
+
+
\ No newline at end of file
diff --git a/src/main/resources/sql/mapper/fims/crdn/crdn-list-mapper.xml b/src/main/resources/sql/mapper/fims/crdn/crdn-list-mapper.xml
new file mode 100644
index 00000000..56df26b7
--- /dev/null
+++ b/src/main/resources/sql/mapper/fims/crdn/crdn-list-mapper.xml
@@ -0,0 +1,497 @@
+
+
+
+
+
+
+/* 단속자료 목록 조회(crdnListMapper.selectCrackdownList) */
+
+SELECT C.CRDN_ID
+ , C.SGG_CD
+ , (SELECT SGG_NM FROM TB_SGG WHERE SGG_CD = C.SGG_CD) AS SGG_NM
+ , C.TASK_SE_CD
+ , (SELECT GET_CODE_NM('FIM054', C.TASK_SE_CD) FROM DUAL) AS TASK_SE_NM
+ , C.CRDN_REG_SE_CD
+ , GET_CODE_NM('FIM026', C.CRDN_REG_SE_CD) AS CRDN_REG_SE_NM
+ , C.CRDN_INPT_SE_CD
+ , (SELECT GET_CODE_NM('FIM003', C.CRDN_INPT_SE_CD) FROM DUAL) AS CRDN_INPT_SE_NM
+ , C.LINK_TBL_NM
+ , C.LINK_ID
+ , C.RTPYR_ID
+ , C.CRDN_YMD
+ , C.CRDN_TM
+ , CONCAT(C.CRDN_YMD,'',C.CRDN_TM) AS CRDN_YMD_TM
+ , C.VHRNO
+ , L.RPM_SZR_VHRNO
+ , C.CRDN_STDG_NM
+ , C.CRDN_ROAD_NM
+ , C.CRDN_PLC
+ , C.VLTN_ID
+ , (SELECT VLTN_ARTCL FROM TB_VLTN WHERE VLTN_ID = C.VLTN_ID) AS VLTN_ARTCL
+ , C.GPS_X
+ , C.GPS_Y
+ , C.ATCH_FILE_CNT
+ , C.VIN
+ , C.VHCL_NM
+ , C.VHCL_COLR
+ , C.FFNLG_CRDN_AMT
+ , C.FFNLG_RDCRT
+ , C.FFNLG_AMT
+ , C.ADVNTCE_BGNG_YMD
+ , C.ADVNTCE_DUDT_YMD
+ , C.ADVNTCE_AMT
+ , C.OPNN_SBMSN_YN
+ , L.LEVY_ID
+ , (CONCAT(L.FYR, '-', L.LEVY_NO)) AS GOJI_NO
+ , L.EPAYNO
+ , L.VR_ACTNO
+ , (L.LEVY_PCPTAX + L.LEVY_ADAMT) AS LEVY_AMT
+ , L.DUDT_YMD
+ , L.RCVMT_YMD
+ , C.CRDN_STTS_CD
+ , (SELECT GET_CODE_NM('FIM010', C.CRDN_STTS_CD) FROM DUAL) AS CRDN_STTS_NM
+ , C.CRDN_STTS_CHG_DT
+ , C.ADTN_AMT
+ , C.MINUS_AMT
+ , C.RCVMT_AMT
+ , C.BFR_CRDN_ID
+ , CA.CRDN_SE_CD
+ , GET_CODE_NM('FIM002', CA.CRDN_SE_CD) AS CRDN_SE_NM
+ , CA.DTL_CRDN_PLC
+ , CA.TEAM_ID
+ , T.TEAM_NM
+ , CA.CRDN_SPAREA_CD
+ , (SELECT GET_CODE_NM('FIM007', CA.CRDN_SPAREA_CD) FROM DUAL) AS CRDN_SPAREA_NM
+ , CA.CRDN_BGNG_TM
+ , CA.CRDN_END_TM
+ , CA.CRDN_SN
+ , CA.MOSC_X
+ , CA.MOSC_Y
+ , CA.TOWNG_YN
+ , CA.USE_FUEL_CD
+ , CA.FFNLG_CARMDL_CD
+ , CA.PRK_PSBLTY_RSLT_CD
+ , (SELECT GET_CODE_NM('FIM034', CA.PRK_PSBLTY_RSLT_CD) FROM DUAL) AS PRK_PSBLTY_RSLT_NM
+ , CA.VLTN_NMTM
+ , CA.OVTM_YN
+ , CC.CVLCPT_LINK_ID
+ , CC.DSTRBNC_YN
+ , CC.CVLCPT_RCPT_YMD
+ , CC.CVLCPT_APLY_SE_CD
+ , CC.CVLCPT_APLY_NO
+ , CC.CVLCPT_RCPT_NO
+ , CC.CVLCPT_LIST_NO
+ , CC.CVLCPT_APLCNT_NM
+ , CC.CVLCPT_APLY_DT
+ , CC.CVLCPT_PRCS_PIC_NM
+ , CC.CVLCPT_PRCS_PRNMNT_DT
+ , CC.CVLCPT_PRCS_CD
+ , CC.CVLCPT_PRCS_SMRY
+ , CC.CVLCPT_PRCS_CMPTN_DT
+ , CC.CVLCPT_PRCS_PIC
+ , CC.CVLCPT_TRSM_DT
+ , CC.CVLCPT_TRSM_CD
+ , LE.LEVY_EXCL_RSN_CD
+ , (SELECT GET_CODE_NM('FIM022', LE.LEVY_EXCL_RSN_CD) FROM DUAL) AS LEVY_EXCL_RSN_NM
+ , LE.LEVY_EXCL_YMD
+ , LE.ETC_CN AS LEVY_EXCL_ETC_CN
+ , P.RTPYR_NM
+ , P.RTPYR_NO
+ , PA.WHOL_ADDR AS RTPYR_FULL_ADDR
+ , PA.ZIP AS RTPYR_ZIP
+ , C.DEL_YN
+ , C.RGTR
+ , C.REG_DT
+ , C.MDFR
+ , C.MDFCN_DT
+ , C.DLTR
+ , C.DEL_DT
+FROM TB_CRDN C
+INNER JOIN TB_CRDN_ADI CA ON (C.CRDN_ID = CA.CRDN_ID)
+LEFT OUTER JOIN TB_TEAM T ON (CA.TEAM_ID = T.TEAM_ID)
+LEFT OUTER JOIN TB_CRDN_CVLCPT CC ON (C.CVLCPT_LINK_YN = 'Y' AND C.LINK_ID = CC.CVLCPT_LINK_ID)
+LEFT OUTER JOIN TB_LEVY_EXCL LE ON (C.CRDN_ID = LE.CRDN_ID AND LE.DEL_YN = 'N')
+LEFT OUTER JOIN TB_LEVY L ON (C.CRDN_ID = L.CRDN_ID)
+LEFT OUTER JOIN TB_PAYER P ON (C.RTPYR_ID = P.RTPYR_ID)
+LEFT OUTER JOIN TB_PAYER_ADDR PA ON (C.RTPYR_ID = PA.RTPYR_ID AND C.ADDR_SN = PA.ADDR_SN)
+WHERE C.DEL_YN = 'N'
+
+ AND C.SGG_CD = #{sggCd}
+
+AND C.CRDN_ID = #{crdnId}
+
+ AND C.CRDN_ID IN (#{CRDN_ID} )
+
+AND C.TASK_SE_CD = #{taskSeCd}
+AND C.VHRNO LIKE CONCAT('%', #{vhrno}, '%')
+AND C.CRDN_INPT_SE_CD = #{crdnInptSeCd}
+
+ AND C.CRDN_YMD = ]]> #{schCrdnYmdFrom}
+ AND C.CRDN_YMD #{schCrdnYmdTo}
+
+
+AND C.CRDN_STTS_CD = #{crdnSttsCd}
+
+
+AND CA.TOWNG_YN = #{towngYn}
+
+
+
+ AND C.REG_DT =]]> CONCAT(#{schRegDateFrom},'000000')
+ AND C.REG_DT CONCAT(#{schRegDateTo},'235959')
+
+
+ AND C.MDFCN_DT = ]]> CONCAT(#{schRegDateFrom},'000000')
+ AND C.MDFCN_DT CONCAT(#{schRegDateTo},'235959')
+
+
+
+
+ AND C.RGTR = #{schRgtrCd}
+
+
+ AND C.MDFR = #{schRgtrCd}
+
+
+
+
+ AND C.NXRP_CRDN_LINK_YN = 'N' AND C.ATCH_FILE_CNT != 0 AND C.ATCH_FILE_CNT IS NOT NULL
+
+
+ AND C.NXRP_CRDN_LINK_YN = 'Y'
+
+
+ AND C.NXRP_CRDN_LINK_YN = 'N' AND (C.ATCH_FILE_CNT = 0 OR C.ATCH_FILE_CNT IS NULL)
+
+
+
+
+
+
+
+ C.CRDN_INPT_SE_CD
+ C.VHRNO
+ C.CRDN_YMD
+ C.CRDN_PLC
+ C.ATCH_FILE_CNT
+ CA.CRDN_SN
+ CA.PRK_PSBLTY_RSLT_CD
+ C.CRDN_STTS_CD
+ LE.LEVY_EXCL_RSN_CD
+ LE.LEVY_EXCL_YMD
+ LE.ETC_CN
+
+ #{term}
+
+
+
+
+
+
+
+
+
+
+/* 금일 단속자료 목록 조회(crdnListMapper.selectTodayCrackdownList) */
+
+SELECT C.CRDN_ID
+ , C.SGG_CD
+ , C.TASK_SE_CD
+ , C.CRDN_REG_SE_CD
+ , GET_CODE_NM('FIM026', C.CRDN_REG_SE_CD) AS CRDN_REG_SE_NM
+ , C.CRDN_INPT_SE_CD
+ , GET_CODE_NM('FIM003', C.CRDN_INPT_SE_CD) AS CRDN_INPT_SE_NM
+ , CONCAT(C.CRDN_YMD,'', C.CRDN_TM) AS CRDN_YMD_TM
+ , C.VHRNO
+ , C.CRDN_PLC
+ , (SELECT VLTN_ARTCL FROM TB_VLTN WHERE VLTN_ID = C.VLTN_ID) AS VLTN_ARTCL
+ , C.DEL_YN
+ , C.RGTR
+ , C.REG_DT
+ , C.MDFR
+ , C.MDFCN_DT
+ , C.DLTR
+ , C.DEL_DT
+ FROM TB_CRDN C
+ WHERE C.DEL_YN = 'N'
+ AND C.SGG_CD = #{sggCd}
+ AND C.TASK_SE_CD = #{taskSeCd}
+ AND C.RGTR = #{currentUserId}
+ AND SUBSTR(C.REG_DT,1,8) =
+
+
+
+
+
+
+/* 단속사진 검사 자료 목록 조회(crdnListMapper.selectPhotoInspectionDataList) */
+
+SELECT C.CRDN_ID
+ , C.SGG_CD
+ , C.TASK_SE_CD
+ , CONCAT(C.CRDN_YMD,'',C.CRDN_TM) AS CRDN_YMD_TM
+ , C.VHRNO
+ , COUNT(*) OVER (PARTITION BY C.VHRNO, C.CRDN_PLC) AS CRDN_CNT
+ , '' AS INSP_RSLT
+ , '' AS PRCS_MTHD
+ , C.CRDN_STDG_NM
+ , C.CRDN_PLC
+ , C.ATCH_FILE_CNT
+ , C.CRDN_STTS_CD
+ , (SELECT GET_CODE_NM('FIM010', C.CRDN_STTS_CD) FROM DUAL) AS CRDN_STTS_NM
+ , C.FFNLG_CRDN_AMT
+ , C.ADVNTCE_AMT
+ , C.CRDN_INPT_SE_CD
+ , (SELECT GET_CODE_NM('FIM003', C.CRDN_INPT_SE_CD) FROM DUAL) AS CRDN_INPT_SE_NM
+ FROM TB_CRDN C
+ INNER JOIN TB_CRDN_ADI CA ON (C.CRDN_ID = CA.CRDN_ID)
+ WHERE C.DEL_YN = 'N'
+ AND C.SGG_CD = #{sggCd}
+ AND C.TASK_SE_CD = #{taskSeCd}
+
+ AND C.CRDN_YMD = ]]> #{schCrdnYmdFrom}
+ AND C.CRDN_YMD #{schCrdnYmdTo}
+
+AND C.CRDN_INPT_SE_CD = #{crdnInptSeCd}
+AND C.VHRNO = #{vhrno}
+AND C.CRDN_STTS_CD != '81'
+
+
+
+
+
+ AND IFNULL(CA.OVTM_YN,'N') = 'N'
+ AND IFNULL(CA.OVTM_PRTTN_YN,'N') = 'N'
+
+
+
+
+ AND C.REG_DT =]]> CONCAT(#{schRegDateFrom},'000000')
+ AND C.REG_DT CONCAT(#{schRegDateTo},'235959')
+
+
+ AND C.MDFCN_DT = ]]> CONCAT(#{schRegDateFrom},'000000')
+ AND C.MDFCN_DT CONCAT(#{schRegDateTo},'235959')
+
+
+
+
+ AND C.RGTR = #{schRgtrCd}
+
+
+ AND C.MDFR = #{schRgtrCd}
+
+
+
+
+
+
+
+ C.CRDN_YMD
+ C.VHRNO
+ C.CRDN_STDG_NM
+ C.CRDN_PLC
+ C.ATCH_FILE_CNT
+ C.CRDN_STTS_CD
+ C.FFNLG_CRDN_AMT
+ C.ADVNTCE_AMT
+ C.CRDN_INPT_SE_CD
+
+ #{term}
+
+
+
+
+
+
+AND C.CRDN_STTS_CD = #{crdnSttsCd}
+
+
+
+ AND SUBSTR(C.REG_DT,1,8) = ]]> #{schDateFrom}
+ AND SUBSTR(C.REG_DT,1,8) #{schDateTo}
+
+
+ AND SUBSTR(C.MDFCN_DT,1,8) = ]]> #{schDateFrom}
+ AND SUBSTR(C.MDFCN_DT,1,8) #{schDateTo}
+
+
+
+
+
+
+
+/* 동일 차량 단속 그룹 목록 조회(crdnListMapper.selectSameVehicleMainList) */
+
+SELECT GROUP_CONCAT(C.CRDN_ID) AS CRDN_ID_LIST
+ , C.VHRNO
+
+
+ , C.CRDN_STDG_NM
+
+
+ , '' AS CRDN_STDG_NM
+
+
+ , COUNT(*) AS CRDN_CNT
+ FROM TB_CRDN C
+ INNER JOIN TB_CRDN_ADI CA ON (C.CRDN_ID = CA.CRDN_ID)
+ LEFT OUTER JOIN TB_TEAM T ON (CA.TEAM_ID = T.TEAM_ID)
+ LEFT OUTER JOIN TB_PAYER P ON (C.RTPYR_ID = P.RTPYR_ID)
+ WHERE C.DEL_YN = 'N'
+ AND C.SGG_CD = #{sggCd}
+ AND C.TASK_SE_CD = #{taskSeCd}
+ AND C.VHRNO != ''
+
+ AND C.CRDN_STDG_NM != ''
+
+
+ AND C.CRDN_YMD = ]]> #{schCrdnYmdFrom}
+ AND C.CRDN_YMD #{schCrdnYmdTo}
+
+AND C.CRDN_INPT_SE_CD = #{crdnInptSeCd}
+AND C.VHRNO = #{vhrno}
+AND C.CRDN_STTS_CD != '81'
+
+
+
+
+
+ C.CRDN_YMD
+ C.CRDN_INPT_SE_CD
+ T.TEAM_NM
+ C.VHRNO
+ C.CRDN_STDG_NM
+ C.CRDN_PLC
+ C.CRDN_STTS_CD
+ C.FFNLG_CRDN_AMT
+ P.RTPYR_NM
+
+ #{term}
+
+
+
+
+
+
+AND C.CRDN_STTS_CD = #{crdnSttsCd}
+
+
+
+ AND SUBSTR(C.REG_DT,1,8) = ]]> #{schDateFrom}
+ AND SUBSTR(C.REG_DT,1,8) #{schDateTo}
+
+
+ AND SUBSTR(C.MDFCN_DT,1,8) = ]]> #{schDateFrom}
+ AND SUBSTR(C.MDFCN_DT,1,8) #{schDateTo}
+
+
+GROUP BY C.VHRNO, C.CRDN_STDG_NM
+HAVING COUNT(*) = ]]>
+
+ #{schCrdnCntFrom}
+ 2
+
+ AND COUNT(*) #{schCrdnCntTo}
+
+
+
+
+
+
+/* 동일 차량 단속 자료 목록 조회(crdnListMapper.selectSameVehicleSubList) */
+SELECT C.CRDN_ID
+ , C.SGG_CD
+ , C.TASK_SE_CD
+ , CONCAT(C.CRDN_YMD,'',C.CRDN_TM) AS CRDN_YMD_TM
+ , C.CRDN_INPT_SE_CD
+ , (SELECT GET_CODE_NM('FIM003', C.CRDN_INPT_SE_CD) FROM DUAL) AS CRDN_INPT_SE_NM
+ , T.TEAM_NM
+ , C.VHRNO
+ , C.CRDN_STDG_NM
+ , C.CRDN_PLC
+ , C.CRDN_STTS_CD
+ , (SELECT GET_CODE_NM('FIM010', C.CRDN_STTS_CD) FROM DUAL) AS CRDN_STTS_NM
+ , C.FFNLG_CRDN_AMT
+ , P.RTPYR_NM
+ , P.RTPYR_NO
+ FROM TB_CRDN C
+ INNER JOIN TB_CRDN_ADI CA ON (C.CRDN_ID = CA.CRDN_ID)
+ LEFT OUTER JOIN TB_TEAM T ON (CA.TEAM_ID = T.TEAM_ID)
+ LEFT OUTER JOIN TB_PAYER P ON (C.RTPYR_ID = P.RTPYR_ID)
+ WHERE C.DEL_YN = 'N'
+ AND C.SGG_CD = #{sggCd}
+ AND C.TASK_SE_CD = #{taskSeCd}
+ AND C.CRDN_ID IN (#{CRDN_ID} )
+
+
+
+
+/* 표지정보 미확인 자료 목록 조회(crdnListMapper.selectTagInformationUndefinedDataList) */
+
+SELECT C.CRDN_ID
+ , C.SGG_CD
+ , C.TASK_SE_CD
+ , C.CRDN_INPT_SE_CD
+ , (SELECT GET_CODE_NM('FIM003', C.CRDN_INPT_SE_CD) FROM DUAL) AS CRDN_INPT_SE_NM
+ , CONCAT(C.CRDN_YMD,'',C.CRDN_TM) AS CRDN_YMD_TM
+ , C.VHRNO
+ , C.CRDN_STDG_NM
+ , C.CRDN_STTS_CD
+ , C.FFNLG_AMT
+ , C.ADVNTCE_AMT
+ , C.MINUS_AMT
+ , C.ADTN_AMT
+ , C.RCVMT_AMT
+ , C.ATCH_FILE_CNT
+ , CA.CRDN_SN
+ , 0 AS BLNC
+ FROM TB_CRDN C
+ INNER JOIN TB_CRDN_ADI CA ON (C.CRDN_ID = CA.CRDN_ID)
+ LEFT OUTER JOIN TB_TEAM T ON (CA.TEAM_ID = T.TEAM_ID)
+ LEFT OUTER JOIN TB_CRDN_CVLCPT CC ON (C.CVLCPT_LINK_YN = 'Y' AND C.LINK_ID = CC.CVLCPT_LINK_ID)
+ WHERE C.DEL_YN = 'N'
+ AND C.SGG_CD = #{sggCd}
+ AND C.TASK_SE_CD = 'DPV'
+ AND CA.PRK_PSBLTY_RSLT_CD = '0'
+ AND C.CRDN_STTS_CD = '21'
+
+
+
+
+
+ C.CRDN_INPT_SE_CD
+ C.CRDN_YMD
+ C.VHRNO
+ C.CRDN_STDG_NM
+ C.ATCH_FILE_CNT
+ CA.CRDN_SN
+
+ #{term}
+
+
+
+
+
+AND C.CRDN_ID = #{crdnId}
+
+ AND C.CRDN_YMD = ]]> #{schCrdnYmdFrom}
+ AND C.CRDN_YMD #{schCrdnYmdTo}
+
+
+
+
+
+
+/* 단속 건수 조회(crdnListMapper.countCrdn) */
+ SELECT COUNT(*)
+ FROM TB_CRDN C
+LEFT OUTER JOIN TB_PAYER P ON (C.RTPYR_ID = P.RTPYR_ID)
+ WHERE C.DEL_YN = 'N'
+ AND C.SGG_CD = #{sggCd}
+ AND C.CRDN_STTS_CD != '01'
+ AND C.TASK_SE_CD = #{taskSeCd}
+ AND C.VHRNO = #{vhrno}
+
+
+
\ No newline at end of file
diff --git a/src/main/resources/sql/mapper/fims/crdn/crdn-stng-mapper.xml b/src/main/resources/sql/mapper/fims/crdn/crdn-stng-mapper.xml
new file mode 100644
index 00000000..a2aa1133
--- /dev/null
+++ b/src/main/resources/sql/mapper/fims/crdn/crdn-stng-mapper.xml
@@ -0,0 +1,52 @@
+
+
+
+
+
+
+/* 기본금액 조회(crdnStngMapper.selectBasicAmt) */
+SELECT AMT
+ FROM TB_AMT
+ WHERE USE_YN = 'Y'
+ AND TASK_SE_CD = #{taskSeCd}
+ AND BGNG_YMD #{aplcnYmd}
+ AND END_YMD = ]]> #{aplcnYmd}
+
+ AND AMT_DCSN_CD_GROUP_ID = #{amtDcsnCdGroupId}
+ AND AMT_DCSN_CD = #{amtDcsnCd}
+
+
+ AND DTL_AMT_DCSN_GROUP_ID = #{dtlAmtDcsnGroupId}
+ AND DTL_AMT_DCSN_CD = #{dtlAmtDcsnCd}
+
+
+
+
+
+/* 법정동코드 목록 조회(crdnStngMapper.selectStdgNmList) */
+SELECT CONCAT(A.EMD_NM,
+ CASE WHEN A.LI_NM = ''
+ THEN ''
+ ELSE CONCAT(' ', A.LI_NM)
+ END) AS STDG_NM
+ FROM TB_STDG A
+ WHERE A.STDG_CD LIKE CONCAT(#{sggCd},'%')
+ AND A.STDG_CD != CONCAT(#{sggCd},'00000')
+ ORDER BY A.EMD_NM, A.LI_NM
+
+
+
+/* 법정동명으로 법정동코드 조회(crdnStngMapper.selectStdgCdListByStdgNm) */
+SELECT STDG_CD
+ FROM TB_STDG
+ WHERE EMD_NM IS NOT NULL
+ AND EMD_NM != ''
+ AND USE_YN = 'Y'
+ AND EMD_NM = #{emdNm}
+ AND SUBSTR(STDG_CD,1,5) = #{sggCd}
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/resources/sql/mapper/fims/crdn/crdn-team-mapper.xml b/src/main/resources/sql/mapper/fims/crdn/crdn-team-mapper.xml
new file mode 100644
index 00000000..1e31ec7e
--- /dev/null
+++ b/src/main/resources/sql/mapper/fims/crdn/crdn-team-mapper.xml
@@ -0,0 +1,143 @@
+
+
+
+
+
+/* 단속팀 목록 조회(crdnTeamMapper.selectTeamList) */
+SELECT A.TEAM_ID
+ , A.TEAM_NM
+ , A.CRDN_SE_CD
+ , GET_CODE_NM('FIM002', A.CRDN_SE_CD) AS CRDN_SE_NM
+ , A.TEAMER_1
+ , A.TEAMER_2
+ , A.TEAMER_3
+ , A.TEAMER_4
+ , A.ETC_CN
+ , A.REG_DT
+ FROM TB_TEAM A
+ WHERE A.USE_YN = 'Y'
+ AND A.SGG_CD = #{sggCd}
+ AND A.TASK_SE_CD = #{taskSeCd}
+ ORDER BY A.TEAM_NM
+
+
+
+/* 비사용 단속팀 목록 조회(crdnTeamMapper.selectRemovedTeamList) */
+SELECT A.TEAM_ID
+ , A.TEAM_NM
+ , A.CRDN_SE_CD
+ , GET_CODE_NM('FIM002', A.CRDN_SE_CD) AS CRDN_SE_NM
+ , A.TEAMER_1
+ , A.TEAMER_2
+ , A.TEAMER_3
+ , A.TEAMER_4
+ , A.ETC_CN
+ , A.REG_DT
+ , A.MDFCN_DT
+ FROM TB_TEAM A
+ WHERE A.USE_YN = 'N'
+ AND A.SGG_CD = #{sggCd}
+ AND A.TASK_SE_CD = #{taskSeCd}
+ AND A.TEAM_NM = #{teamNm}
+ ORDER BY A.MDFCN_DT
+
+
+
+/* 단속팀 정보 삭제(crdnTeamMapper.deleteTeamInfo) */
+UPDATE TB_TEAM
+ SET USE_YN = 'N'
+ , MDFCN_DT =
+ , MDFR = #{removedBy}
+ WHERE TEAM_ID = #{teamId}
+
+
+
+/* 단속팀 정보 등록(crdnTeamMapper.insertTeamInfo) */
+
+
+
+
+
+
+
+INSERT
+ INTO TB_TEAM (
+ TEAM_ID
+ , SGG_CD
+ , TASK_SE_CD
+ , TEAM_NM
+ , CRDN_SE_CD
+ , TEAMER_1
+ , TEAMER_2
+ , TEAMER_3
+ , TEAMER_4
+ , ETC_CN
+ , USE_YN
+ , REG_DT
+ , RGTR
+ , MDFCN_DT
+ , MDFR
+ ) VALUES (
+ #{teamId}
+ , #{sggCd}
+ , #{taskSeCd}
+ , #{teamNm}
+ , #{crdnSeCd}
+ , #{teamer1}
+ , #{teamer2}
+ , #{teamer3}
+ , #{teamer4}
+ , #{etcCn}
+ , 'Y'
+ ,
+ , #{createdBy}
+ ,
+ , #{modifiedBy}
+ )
+
+
+
+/* 단속팀 정보 수정(crdnTeamMapper.updateTeamInfo) */
+UPDATE TB_TEAM
+ SET ETC_CN = #{etcCn}
+ , MDFCN_DT =
+ , MDFR = #{modifiedBy}
+ WHERE TEAM_ID = #{teamId}
+
+
+
+/* 단속팀명으로 단속팀 정보 조회(crdnTeamMapper.selectTeamInfoByName) */
+SELECT TEAM_ID
+ , SGG_CD
+ , TASK_SE_CD
+ , TEAM_NM
+ , CRDN_SE_CD
+ , TEAMER_1
+ , TEAMER_2
+ , TEAMER_3
+ , TEAMER_4
+ , ETC_CN
+ FROM TB_TEAM
+ WHERE TEAM_NM = #{teamNm}
+ AND SGG_CD = #{sggCd}
+ AND TASK_SE_CD = #{taskSeCd}
+ AND USE_YN = 'Y'
+
+
+
+/* 단속팀 정보 조회(crdnTeamMapper.selectTeamInfo) */
+SELECT TEAM_ID
+ , SGG_CD
+ , TASK_SE_CD
+ , TEAM_NM
+ , CRDN_SE_CD
+ , TEAMER_1
+ , TEAMER_2
+ , TEAMER_3
+ , TEAMER_4
+ , ETC_CN
+ FROM TB_TEAM
+ WHERE TEAM_ID = #{teamId}
+
+
+
\ No newline at end of file
diff --git a/src/main/resources/sql/mapper/fims/crdn/crdn-updt-mapper.xml b/src/main/resources/sql/mapper/fims/crdn/crdn-updt-mapper.xml
new file mode 100644
index 00000000..996307f9
--- /dev/null
+++ b/src/main/resources/sql/mapper/fims/crdn/crdn-updt-mapper.xml
@@ -0,0 +1,207 @@
+
+
+
+
+ /* 단속 상태 수정(crdnUpdtMapper.updateCrdnStatus) */
+ UPDATE TB_CRDN
+ SET CRDN_STTS_CD = #{crdnSttsCd} /* 단속 상태 */
+ , CRDN_STTS_CHG_DT = /* 단속 상태 변경 일시 */
+ , MDFCN_DT = /* 수정일시 */
+ , MDFR = #{modifiedBy} /* 수정자 */
+ WHERE CRDN_ID = #{crdnId} /* 단속 ID */
+ AND DEL_YN = 'N' /* 삭제 여부 */
+
+
+
+ /* 단속정보 수정(crdnUpdtMapper.updateCrdn) */
+ UPDATE TB_CRDN
+ SET MDFCN_DT = /* 수정일시 */
+ , MDFR = #{modifiedBy} /* 수정자 */
+ , ATCH_FILE_CNT = ATCH_FILE_CNT + (#{changeFileCnt})
+ , RTPYR_ID = #{rtpyrId}
+ , CRDN_YMD = #{crdnYmd}
+ , CRDN_TM = #{crdnTm}
+ , VHRNO = #{vhrno}
+ , CRDN_STDG_NM = #{crdnStdgNm}
+ , CRDN_ROAD_NM = #{crdnRoadNm}
+ , CRDN_PLC = #{crdnPlc}
+ , VLTN_ID = (SELECT A.VLTN_ID
+ FROM TB_VLTN A
+ WHERE A.SGG_CD = #{sggCd}
+ AND A.TASK_SE_CD = #{taskSeCd}
+ AND A.VLTN_CD = #{vltnCd})
+ , GPS_X = #{gpsX}
+ , GPS_Y = #{gpsY}
+ , VIN = #{vin}
+ , VHCL_NM = #{vhclNm}
+ , VHCL_COLR = #{vhclColr}
+ , ETC_CN = #{etcCn}
+ , FFNLG_CRDN_AMT = #{ffnlgCrdnAmt}
+ , FFNLG_AMT = #{ffnlgAmt}
+ , FFNLG_RDCRT = #{ffnlgRdcrt}
+ , ADVNTCE_AMT = #{advntceAmt}
+
+ , CRDN_STTS_CD = #{crdnSttsCd}
+ , CRDN_STTS_CHG_DT =
+
+ WHERE CRDN_ID = #{crdnId} /* 단속 ID */
+
+
+
+/* 단속 부가정보 수정(crdnUpdtMapper.updateCrdnAddition) */
+ UPDATE TB_CRDN_ADI
+ SET MDFCN_DT = /* 수정일시 */
+ , MDFR = #{modifiedBy} /* 수정자 */
+
+ , OVTM_YN = #{ovtmYn}
+ , CRDN_SPAREA_CD = #{crdnSpareaCd}
+
+
+ , DTL_CRDN_PLC = #{dtlCrdnPlc}
+ , MOSC_X = #{moscX}
+ , MOSC_Y = #{moscY}
+
+
+ , USE_FUEL_CD = #{useFuelCd}
+
+
+ , PRK_PSBLTY_RSLT_CD = #{prkPsbltyRsltCd}
+
+
+ , VLTN_NMTM = #{vltnNmtm}
+
+
+ , CRDN_SE_CD = #{crdnSeCd}
+ , CRDN_BGNG_TM = #{crdnBgngTm}
+ , CRDN_END_TM = #{crdnEndTm}
+ , FFNLG_CARMDL_CD = #{ffnlgCarmdlCd}
+
+
+ , CRDN_SN = #{crdnSn}
+ , TOWNG_YN = #{towngYn}
+
+ WHERE CRDN_ID = #{crdnId}
+
+
+
+ /* 표지정보확인 수정(crdnUpdtMapper.updateTagInfo) */
+ UPDATE TB_CRDN_ADI
+ SET PRK_PSBLTY_RSLT_CD = '1'
+ , MDFCN_DT = /* 수정일시 */
+ , MDFR = #{modifiedBy} /* 수정자 */
+ WHERE CRDN_ID = #{crdnId} /* 단속 ID */
+
+
+
+ /* 시간초과 여부 수정(crdnUpdtMapper.overTimeInfo) */
+ UPDATE TB_CRDN_ADI
+ SET OVTM_YN = #{ovtmYn}
+ , MDFCN_DT = /* 수정일시 */
+ , MDFR = #{modifiedBy} /* 수정자 */
+ WHERE CRDN_ID = #{crdnId} /* 단속 ID */
+
+
+
+ /* 단속 금액 수정(crdnUpdtMapper.updateCrdnAmt) */
+ UPDATE TB_CRDN
+ SET MDFCN_DT = /* 수정일시 */
+ , MDFR = #{modifiedBy} /* 수정자 */
+ , FFNLG_CRDN_AMT = #{ffnlgCrdnAmt}
+ , FFNLG_AMT = #{ffnlgAmt}
+ , ADVNTCE_AMT = #{advntceAmt}
+ WHERE CRDN_ID = #{crdnId} /* 단속 ID */
+
+
+
+ /* 단속 기타사항 수정(crdnUpdtMapper.updateEtcCn) */
+ UPDATE TB_CRDN
+ SET MDFCN_DT = /* 수정일시 */
+ , MDFR = #{modifiedBy} /* 수정자 */
+ , ETC_CN = #{etcCn}
+ WHERE CRDN_ID = #{crdnId} /* 단속 ID */
+
+
+ /* 단속 정보 수정(crdnUpdtMapper.updateEditCrdn) */
+ UPDATE TB_CRDN
+ SET CRDN_YMD = #{crdnYmd}
+ , CRDN_TM = #{crdnTm}
+ , VHRNO = #{vhrno}
+ , CRDN_STDG_NM = #{crdnStdgNm}
+ , CRDN_ROAD_NM = #{crdnRoadNm}
+ , CRDN_PLC = #{crdnPlc}
+ , VLTN_ID = (SELECT X.VLTN_ID
+ FROM TB_VLTN X
+ WHERE X.SGG_CD = #{sggCd} AND X.TASK_SE_CD = #{taskSeCd}
+ AND X.VLTN_CD = #{vltnCd})
+ , GPS_X = #{gpsX}
+ , GPS_Y = #{gpsY}
+ , VIN = #{vin}
+ , VHCL_NM = #{vhclNm}
+ , VHCL_COLR = #{vhclColr}
+ , FFNLG_CRDN_AMT = #{ffnlgCrdnAmt}
+ , FFNLG_AMT = #{ffnlgAmt}
+ , ADVNTCE_AMT = #{advntceAmt}
+ , ETC_CN = #{etcCn}
+ , MDFCN_DT =
+ , MDFR = #{modifiedBy}
+ WHERE CRDN_ID = #{crdnId}
+ AND DEL_YN = 'N'
+
+
+ /* 단속 정보 삭제(crdnUpdtMapper.deleteCrdn) */
+ UPDATE TB_CRDN
+ SET DEL_YN = 'Y'
+ , DEL_DT =
+ , DLTR = #{removedBy}
+ , DEL_RSN = #{delRsn}
+ WHERE CRDN_ID IN (
+ #{crdnId}
+ )
+ AND DEL_YN = 'N'
+
+
+ /* 단속 부가 정보 삭제(crdnUpdtMapper.deleteCrdnAdi) */
+ UPDATE TB_CRDN_ADI
+ SET DEL_YN = 'Y'
+ , DEL_DT =
+ , DLTR = #{removedBy}
+ , DEL_RSN = #{delRsn}
+ WHERE CRDN_ID IN (
+ #{crdnId}
+ )
+ AND DEL_YN = 'N'
+
+
+ /* 단속 납부자 ID 삭제(crdnUpdtMapper.deleteCrdnPayer) */
+ UPDATE TB_CRDN
+ SET RTPYR_ID = NULL
+ , MDFCN_DT =
+ , MDFR = #{modifiedBy}
+ WHERE CRDN_ID = #{crdnId}
+ AND RTPYR_ID = #{rtpyrId}
+ AND DEL_YN = 'N'
+
+
+
+ /* 세외수입 단속 연계 여부 변경(crdnUpdtMapper.updateNxrpCrdnLinkYn) */
+ UPDATE TB_CRDN
+ SET NXRP_CRDN_LINK_YN = 'Y'
+ , NXRP_CRDN_LINK_DT =
+ , NXRP_CRDN_LINK_USER_ID = #{modifiedBy}
+ , MDFCN_DT =
+ , MDFR = #{modifiedBy}
+ WHERE CRDN_ID = #{crdnId}
+ AND DEL_YN = 'N'
+
+
+ /* 사전통지 일자 수정(crdnUpdtMapper.updateAdvntceYmd) */
+ UPDATE TB_CRDN
+ SET ADVNTCE_BGNG_YMD = #{advntceBgngYmd}
+ , ADVNTCE_DUDT_YMD = #{advntceDudtYmd}
+ , MDFCN_DT =
+ , MDFR = #{modifiedBy}
+ WHERE CRDN_ID = #{crdnId}
+ AND DEL_YN = 'N'
+
+
+
\ No newline at end of file
diff --git a/src/main/resources/sql/mapper/fims/crdn/exmptn-vhcl-mapper.xml b/src/main/resources/sql/mapper/fims/crdn/exmptn-vhcl-mapper.xml
new file mode 100644
index 00000000..0bd02708
--- /dev/null
+++ b/src/main/resources/sql/mapper/fims/crdn/exmptn-vhcl-mapper.xml
@@ -0,0 +1,188 @@
+
+
+
+
+
+/* 면제차량 목록 조회(exmptnVhclMapper.selectExemptionVehicleList) */
+
+SELECT A.EXMPTN_VHCL_ID
+ , A.VHRNO
+ , A.EXMPTN_RSN
+ , A.DOC_NO
+ , A.OWNR_NM
+ , A.EXMPTN_BGNG_YMD
+ , A.EXMPTN_END_YMD
+ , (SELECT USER_NM FROM TB_USER X WHERE X.USER_ID = A.RGTR) AS RGTR_NM
+ , A.REG_DT
+ , (SELECT USER_NM FROM TB_USER X WHERE X.USER_ID = A.MDFR) AS MDFR_NM
+ , A.MDFCN_DT
+ , (SELECT USER_NM FROM TB_USER X WHERE X.USER_ID = A.DLTR) AS DLTR_NM
+ , A.DEL_RSN
+ , A.DEL_DT
+ , A.DEL_YN
+ FROM TB_EXMPTN_VHCL A
+ WHERE A.SGG_CD = #{sggCd}
+
+ AND A.VHRNO = #{vhrno}
+
+
+ AND A.DEL_YN = #{delYn}
+
+
+ AND A.EXMPTN_BGNG_YMD #{crdnYmd}
+ AND A.EXMPTN_END_YMD = ]]> #{crdnYmd}
+
+
+
+
+
+
+/* 면제차량 정보 조회(exmptnVhclMapper.selectExemptionVehicleInfo) */
+SELECT A.EXMPTN_VHCL_ID
+ , A.SGG_CD
+ , A.VHRNO
+ , A.EXMPTN_RSN
+ , A.DOC_NO
+ , A.OWNR_NM
+ , A.EXMPTN_BGNG_YMD
+ , A.EXMPTN_END_YMD
+ FROM TB_EXMPTN_VHCL A
+ WHERE A.EXMPTN_VHCL_ID = #{exmptnVhclId}
+
+
+
+/* 면제차량 정보 등록(exmptnVhclMapper.insertExemptionVehicleInfo) */
+
+
+
+
+
+
+
+INSERT INTO TB_EXMPTN_VHCL (
+ EXMPTN_VHCL_ID
+ , SGG_CD
+ , VHRNO
+ , EXMPTN_RSN
+ , DOC_NO
+ , OWNR_NM
+ , EXMPTN_BGNG_YMD
+ , EXMPTN_END_YMD
+ , DEL_YN
+ , REG_DT
+ , RGTR
+ , MDFCN_DT
+ , MDFR
+) VALUES (
+ #{exmptnVhclId}
+ , #{sggCd}
+ , #{vhrno}
+ , #{exmptnRsn}
+ , #{docNo}
+ , #{ownrNm}
+ , #{exmptnBgngYmd}
+ , #{exmptnEndYmd}
+ , 'N'
+ ,
+ , #{createdBy}
+ ,
+ , #{modifiedBy}
+)
+
+
+
+/* 면제차량 정보 수정(exmptnVhclMapper.updateExemptionVehicleInfo) */
+UPDATE TB_EXMPTN_VHCL
+ SET EXMPTN_RSN = #{exmptnRsn}
+ , DOC_NO = #{docNo}
+ , OWNR_NM = #{ownrNm}
+ , EXMPTN_BGNG_YMD = #{exmptnBgngYmd}
+ , EXMPTN_END_YMD = #{exmptnEndYmd}
+ , MDFCN_DT =
+ , MDFR = #{modifiedBy}
+ WHERE EXMPTN_VHCL_ID = #{exmptnVhclId}
+
+
+
+/* 면제차량 정보 삭제(exmptnVhclMapper.deleteExemptionVehicleInfo) */
+UPDATE TB_EXMPTN_VHCL
+ SET DEL_YN = 'Y'
+ , DEL_RSN = #{delRsn}
+ , DEL_DT =
+ , DLTR = #{removedBy}
+ WHERE EXMPTN_VHCL_ID = #{exmptnVhclId}
+
+
+
+/* 면제차량 정보 등록(exmptnVhclMapper.insertExemptionVehicleHistory) */
+
+SELECT
+ LPAD(CAST(IFNULL(MAX(HSTRY_SN) + 1, 1) AS INT), 5, '0')
+ AS NEW_ID
+FROM TB_EXMPTN_VHCL_HSTRY WHERE EXMPTN_VHCL_ID = #{exmptnVhclId}
+
+INSERT INTO TB_EXMPTN_VHCL_HSTRY (
+ EXMPTN_VHCL_ID
+ , HSTRY_SN
+ , SGG_CD
+ , VHRNO
+ , EXMPTN_RSN
+ , DOC_NO
+ , OWNR_NM
+ , EXMPTN_BGNG_YMD
+ , EXMPTN_END_YMD
+ , DEL_YN
+ , REG_DT
+ , RGTR
+ , MDFCN_DT
+ , MDFR
+ , DEL_DT
+ , DLTR
+ , DEL_RSN
+) SELECT
+ EXMPTN_VHCL_ID
+ , #{hstrySn}
+ , SGG_CD
+ , VHRNO
+ , EXMPTN_RSN
+ , DOC_NO
+ , OWNR_NM
+ , EXMPTN_BGNG_YMD
+ , EXMPTN_END_YMD
+ , DEL_YN
+ , REG_DT
+ , RGTR
+ , MDFCN_DT
+ , MDFR
+ , DEL_DT
+ , DLTR
+ , DEL_RSN
+ FROM TB_EXMPTN_VHCL
+ WHERE EXMPTN_VHCL_ID = #{exmptnVhclId}
+
+
+
+/* 면제차량 이력 정보 조회(exmptnVhclMapper.selectExemptionVehicleHistoryList) */
+SELECT A.EXMPTN_VHCL_ID
+ , A.HSTRY_SN
+ , A.SGG_CD
+ , A.VHRNO
+ , A.EXMPTN_RSN
+ , A.DOC_NO
+ , A.OWNR_NM
+ , A.EXMPTN_BGNG_YMD
+ , A.EXMPTN_END_YMD
+ , A.DEL_YN
+ , (SELECT USER_NM FROM TB_USER X WHERE X.USER_ID = A.RGTR) AS RGTR_NM
+ , A.REG_DT
+ , (SELECT USER_NM FROM TB_USER X WHERE X.USER_ID = A.MDFR) AS MDFR_NM
+ , A.MDFCN_DT
+ , (SELECT USER_NM FROM TB_USER X WHERE X.USER_ID = A.DLTR) AS DLTR_NM
+ , A.DEL_DT
+ , A.DEL_RSN
+ FROM TB_EXMPTN_VHCL_HSTRY A
+ WHERE A.EXMPTN_VHCL_ID = #{exmptnVhclId}
+ ORDER BY A.HSTRY_SN
+
+
+
\ No newline at end of file
diff --git a/src/main/resources/sql/mapper/fims/excl/levyExcl-mapper.xml b/src/main/resources/sql/mapper/fims/excl/levyExcl-mapper.xml
new file mode 100644
index 00000000..14d4b4a2
--- /dev/null
+++ b/src/main/resources/sql/mapper/fims/excl/levyExcl-mapper.xml
@@ -0,0 +1,327 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ SELECT LE.LEVY_EXCL_ID
+ , LE.LEVY_EXCL_YMD
+ , LE.LEVY_EXCL_SE_CD
+ , (SELECT GET_CODE_NM('FIM021', LE.LEVY_EXCL_SE_CD) FROM DUAL) AS LEVY_EXCL_SE_NM
+ , LE.LEVY_EXCL_RSN_CD
+ , (SELECT GET_CODE_NM('FIM022', LE.LEVY_EXCL_RSN_CD) FROM DUAL) AS LEVY_EXCL_RSN_NM
+ , LE.ETC_CN
+ , LE.DEL_YN
+ , LE.REG_DT
+ , LE.RGTR
+ , (SELECT USER_NM FROM TB_USER X WHERE X.USER_ID = LE.RGTR) AS RGTR_NM
+ , LE.MDFCN_DT
+ , LE.MDFR
+ , (SELECT USER_NM FROM TB_USER X WHERE X.USER_ID = LE.MDFR) AS MDFR_NM
+ , C.CRDN_ID
+ , C.SGG_CD
+ , C.TASK_SE_CD
+ , (SELECT GET_CODE_NM('FIM054', C.TASK_SE_CD) FROM DUAL) AS TASK_SE_NM
+ , C.CRDN_YMD
+ , (CONCAT(C.CRDN_YMD, C.CRDN_TM)) AS CRDN_YMD_TM
+ , C.VHRNO
+ , C.CRDN_STDG_NM
+ , C.CRDN_ROAD_NM
+ , C.CRDN_PLC
+ , C.FFNLG_CRDN_AMT
+ , C.CRDN_STTS_CD
+ , (SELECT GET_CODE_NM('FIM010', C.CRDN_STTS_CD) FROM DUAL) AS CRDN_STTS_NM
+ , (SELECT GET_CODE_NM('FIM002', CA.CRDN_SE_CD) FROM DUAL) AS CRDN_SE_NM
+ , (SELECT GET_CODE_NM('FIM007', CA.CRDN_SPAREA_CD) FROM DUAL) AS CRDN_SPAREA_NM
+ , (SELECT GET_CODE_NM('LVS005', CA.USE_FUEL_CD) FROM DUAL) AS USE_FUEL_NM
+ , (SELECT GET_CODE_NM('FIM034', CA.PRK_PSBLTY_RSLT_CD) FROM DUAL) AS PRK_PSBLTY_RSLT_NM
+ , V.VLTN_ID
+ , V.VLTN_CD
+ , V.VLTN_ARTCL
+ , P.RTPYR_ID
+ , P.RTPYR_SE_CD
+ , (SELECT GET_CODE_NM('FIM011', P.RTPYR_SE_CD) FROM DUAL) AS RTPYR_SE_NM
+ , P.RTPYR_NO
+ , P.RTPYR_NM
+ , PA.ADDR_SN
+ , PA.ZIP
+ , PA.ADDR
+ , PA.DTL_ADDR
+ , CC.CVLCPT_LINK_ID
+ , CC.CVLCPT_RCPT_YMD
+ , CC.CVLCPT_APLY_NO
+ , CC.CVLCPT_RCPT_NO
+ , CC.CVLCPT_PRCS_CD
+ , (SELECT GET_CODE_NM('FIM017', CC.CVLCPT_PRCS_CD) FROM DUAL) AS CVLCPT_PRCS_NM
+ FROM TB_LEVY_EXCL LE
+ INNER JOIN TB_CRDN C ON (LE.CRDN_ID = C.CRDN_ID)
+ INNER JOIN TB_CRDN_ADI CA ON (C.CRDN_ID = CA.CRDN_ID)
+ LEFT OUTER JOIN TB_VLTN V ON (C.VLTN_ID = V.VLTN_ID)
+ LEFT OUTER JOIN TB_PAYER P ON (C.RTPYR_ID = P.RTPYR_ID)
+ LEFT OUTER JOIN TB_PAYER_ADDR PA ON (C.RTPYR_ID = PA.RTPYR_ID AND C.ADDR_SN = PA.ADDR_SN)
+ LEFT OUTER JOIN TB_CRDN_CVLCPT CC ON (C.LINK_ID = CC.CVLCPT_LINK_ID AND C.CVLCPT_LINK_YN = 'Y' AND CC.DEL_YN = 'N')
+
+
+ /* 부과제외 대장 목록 조회(levyExclMapper.selectLevyExclList) */
+
+
+
+
+ AND LE.LEVY_EXCL_YMD =]]> #{schLevyExclYmdFrom}
+
+
+ AND LE.LEVY_EXCL_YMD #{schLevyExclYmdTo}
+
+
+ AND LE.LEVY_EXCL_SE_CD = #{schLevyExclSeCd}
+
+
+ AND LE.LEVY_EXCL_RSN_CD = #{schLevyExclRsnCd}
+
+
+ AND LE.DEL_YN = #{delYn}
+
+
+ AND C.CRDN_YMD =]]> #{schCrdnYmdFrom}
+
+
+ AND C.CRDN_YMD #{schCrdnYmdTo}
+
+
+ AND C.VHRNO = #{schVhrno}
+
+
+ AND P.RTPYR_NO = #{schRtpyrNo}
+
+
+ AND P.RTPYR_NO = #{rtpyrNo}
+
+
+ AND P.RTPYR_NM = #{schRtpyrNm}
+
+
+ AND C.SGG_CD = #{sggCd}
+
+
+ AND C.TASK_SE_CD = #{taskSeCd}
+
+ AND C.DEL_YN = 'N'
+
+
+
+ AND LE.REG_DT =]]> CONCAT(#{schRegDateFrom},'000000')
+
+
+ AND LE.REG_DT CONCAT(#{schRegDateTo},'235959')
+
+
+
+
+ AND LE.MDFCN_DT =]]> CONCAT(#{schRegDateFrom},'000000')
+
+
+ AND LE.MDFCN_DT CONCAT(#{schRegDateTo},'235959')
+
+
+
+
+
+
+
+
+ AND LE.RGTR = #{schRgtrCd}
+
+
+
+
+ AND LE.MDFR = #{schRgtrCd}
+
+
+
+
+
+
+
+
+
+
+ LE.LEVY_EXCL_YMD
+ LE.LEVY_EXCL_SE_CD
+ LE.LEVY_EXCL_RSN_CD
+ LE.ETC_CN
+ C.CRDN_YMD
+ C.VHRNO
+ C.CRDN_STDG_NM
+ C.CRDN_PLC
+ C.FFNLG_CRDN_AMT
+ C.FFNLG_AMT
+ C.ADVNTCE_AMT
+ C.CRDN_STTS_CD
+ P.RTPYR_SE_CD
+ P.RTPYR_NO
+ P.RTPYR_NM
+ PA.ZIP
+ PA.ADDR
+ PA.DTL_ADDR
+ V.VLTN_ARTCL
+ CC.CVLCPT_RCPT_YMD
+ CC.CVLCPT_APLY_NO
+ CC.CVLCPT_RCPT_NO
+ CC.CVLCPT_PRCS_CD
+ CC.CVLCPT_PRCS_CMPTN_DT
+
+ #{term}
+
+
+
+
+
+
+
+
+
+
+
+ SELECT C.CRDN_ID
+ , C.SGG_CD
+ , C.TASK_SE_CD
+ , (CONCAT(C.CRDN_YMD, C.CRDN_TM)) AS CRDN_YMD_TM
+ , C.VHRNO
+ , C.CRDN_STDG_NM
+ , C.CRDN_PLC
+ , C.CRDN_STTS_CD
+ , (SELECT GET_CODE_NM('FIM010', C.CRDN_STTS_CD) FROM DUAL) AS CRDN_STTS_NM
+ , CA.PRK_PSBLTY_RSLT_CD
+ , CC.CVLCPT_LINK_ID
+ , CC.CVLCPT_PRCS_CD
+ , L.LEVY_ID
+ , LE.LEVY_EXCL_ID
+ , LE.LEVY_EXCL_YMD
+ , LE.LEVY_EXCL_SE_CD
+ , (SELECT GET_CODE_NM('FIM021', LE.LEVY_EXCL_SE_CD) FROM DUAL) AS LEVY_EXCL_SE_NM
+ , LE.LEVY_EXCL_RSN_CD
+ , (SELECT GET_CODE_NM('FIM022', LE.LEVY_EXCL_RSN_CD) FROM DUAL) AS LEVY_EXCL_RSN_NM
+ , LE.ETC_CN
+ , LE.REG_DT
+ , (SELECT USER_NM FROM TB_USER X WHERE X.USER_ID = LE.RGTR) AS RGTR_NM
+ , LE.MDFCN_DT
+ , (SELECT USER_NM FROM TB_USER X WHERE X.USER_ID = LE.MDFR) AS MDFR_NM
+ FROM TB_CRDN C
+ INNER JOIN TB_CRDN_ADI CA ON (C.CRDN_ID = CA.CRDN_ID)
+ LEFT OUTER JOIN TB_CRDN_CVLCPT CC ON (C.LINK_ID = CC.CVLCPT_LINK_ID AND C.CVLCPT_LINK_YN = 'Y' AND CC.DEL_YN = 'N')
+ LEFT OUTER JOIN TB_LEVY L ON (C.CRDN_ID = L.CRDN_ID AND L.DEL_YN = 'N')
+ LEFT OUTER JOIN TB_LEVY_EXCL LE ON (C.CRDN_ID = LE.CRDN_ID AND LE.DEL_YN = 'N')
+
+
+ /* 부과제외 대장 객체 가져오기(levyExclMapper.selectLevyExcls) */
+
+
+
+ AND LE.LEVY_EXCL_ID IN (
+ #{levyExclId}
+ )
+
+
+ AND LE.LEVY_EXCL_ID = #{levyExclId}
+
+
+ AND C.CRDN_ID = #{crdnId}
+ AND C.DEL_YN = 'N'
+
+
+
+
+
+ /* 부과제외 대장 등록(levyExclMapper.insertLevyExcl) */
+
+
+
+
+
+
+
+
+ INSERT
+ INTO TB_LEVY_EXCL (
+ LEVY_EXCL_ID
+ , CRDN_ID
+ , LEVY_EXCL_YMD
+ , LEVY_EXCL_SE_CD
+ , LEVY_EXCL_RSN_CD
+ , ETC_CN
+ , DEL_YN
+ , REG_DT
+ , RGTR
+ , MDFCN_DT
+ , MDFR
+ )
+ VALUES (
+ #{levyExclId}
+ , #{crdnId}
+ , #{levyExclYmd}
+ , #{levyExclSeCd}
+ , #{levyExclRsnCd}
+ , #{etcCn}
+ , 'N'
+ ,
+ , #{createdBy}
+ ,
+ , #{modifiedBy}
+ )
+
+
+ /* 부과제외 대장 수정(levyExclMapper.updateLevyExcl) */
+ UPDATE TB_LEVY_EXCL
+ SET LEVY_EXCL_YMD = #{levyExclYmd}
+ , LEVY_EXCL_RSN_CD = #{levyExclRsnCd}
+ , ETC_CN = #{etcCn}
+ , MDFCN_DT =
+ , MDFR = #{modifiedBy}
+ WHERE LEVY_EXCL_ID = #{levyExclId}
+ AND DEL_YN = 'N'
+
+
+ /* 부과제외 대장 삭제(levyExclMapper.deleteLevyExcl) */
+ UPDATE TB_LEVY_EXCL
+ SET DEL_YN = 'Y'
+ , DEL_DT =
+ , DLTR = #{modifiedBy}
+ , DEL_RSN = #{delRsn}
+ WHERE LEVY_EXCL_ID = #{levyExclId}
+ AND DEL_YN = 'N'
+
+
+ /* 단속 대장 주차가능결과코드를 수정(levyExclMapper.updatePrkPsbltyRsltCd) */
+ UPDATE TB_CRDN_ADI
+ SET PRK_PSBLTY_RSLT_CD = #{prkPsbltyRsltCd}
+ , MDFCN_DT =
+ , MDFR = #{modifiedBy}
+ WHERE CRDN_ID = #{crdnId}
+ AND DEL_YN = 'N'
+
+
+
diff --git a/src/main/resources/sql/mapper/fims/levy/levy-mapper.xml b/src/main/resources/sql/mapper/fims/levy/levy-mapper.xml
new file mode 100644
index 00000000..48116620
--- /dev/null
+++ b/src/main/resources/sql/mapper/fims/levy/levy-mapper.xml
@@ -0,0 +1,1055 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ SELECT COUNT(*) OVER() AS TNOCS
+ , SUM(C.FFNLG_AMT) OVER() AS GRAMT_FFNLG_AMT
+ , SUM(C.ADVNTCE_AMT) OVER() AS GRAMT_ADVNTCE_AMT
+ , C.CRDN_ID
+ , C.SGG_CD
+ , C.TASK_SE_CD
+ , (SELECT GET_CODE_NM('FIM054', C.TASK_SE_CD) FROM DUAL) AS TASK_SE_NM
+ , C.CRDN_INPT_SE_CD
+ , (SELECT GET_CODE_NM('FIM003', C.CRDN_INPT_SE_CD) FROM DUAL) AS CRDN_INPT_SE_NM
+ , C.CRDN_YMD
+ , (CONCAT(C.CRDN_YMD, C.CRDN_TM)) AS CRDN_YMD_TM
+ , (SELECT GET_MASK_DATETIME(C.CRDN_YMD, '-', C.CRDN_TM, ':') FROM DUAL) AS CRDN_YMD_TM_MASK
+ , C.VHRNO
+ , C.CRDN_STDG_NM
+ , C.CRDN_ROAD_NM
+ , C.CRDN_PLC
+ , C.FFNLG_CRDN_AMT
+ , C.FFNLG_AMT
+ , C.ADVNTCE_AMT
+ , C.CRDN_STTS_CD
+ , (SELECT GET_CODE_NM('FIM010', C.CRDN_STTS_CD) FROM DUAL) AS CRDN_STTS_NM
+ , C.CRDN_STTS_CHG_DT
+ , C.REG_DT
+ , C.RGTR
+ , (SELECT USER_NM FROM TB_USER X WHERE X.USER_ID = C.RGTR) AS RGTR_NM
+ , C.MDFCN_DT
+ , C.MDFR
+ , (SELECT USER_NM FROM TB_USER X WHERE X.USER_ID = C.MDFR) AS MDFR_NM
+ , V.VLTN_ID
+ , V.VLTN_CD
+ , V.VLTN_ARTCL
+ , CC.CVLCPT_LINK_ID
+ , CC.CVLCPT_RCPT_YMD
+ , CC.CVLCPT_APLY_NO
+ , CC.CVLCPT_RCPT_NO
+ , CC.CVLCPT_PRCS_PIC_NM
+ , CC.CVLCPT_PRCS_SMRY
+ , CC.CVLCPT_PRCS_CD
+ , (SELECT GET_CODE_NM('FIM017', CC.CVLCPT_PRCS_CD) FROM DUAL) AS CVLCPT_PRCS_NM
+ , CC.CVLCPT_PRCS_CMPTN_DT
+ , CC.CVLCPT_TRSM_CD
+ , (SELECT GET_CODE_NM('FIM018', CC.CVLCPT_TRSM_CD) FROM DUAL) AS CVLCPT_TRSM_NM
+ , CC.CVLCPT_TRSM_DT
+ , P.RTPYR_ID
+ , P.RTPYR_SE_CD
+ , (SELECT GET_CODE_NM('FIM011', P.RTPYR_SE_CD) FROM DUAL) AS RTPYR_SE_NM
+ , P.RTPYR_NO
+ , P.RTPYR_NM
+ , PA.ADDR_SN
+ , PA.ZIP
+ , PA.ADDR
+ , PA.DTL_ADDR
+ , L.LEVY_ID
+
+
+
+ FROM TB_CRDN C
+ INNER JOIN TB_VLTN V ON (C.VLTN_ID = V.VLTN_ID)
+ LEFT OUTER JOIN TB_CRDN_CVLCPT CC ON (C.LINK_ID = CC.CVLCPT_LINK_ID AND C.CVLCPT_LINK_YN = 'Y' AND CC.DEL_YN = 'N')
+ LEFT OUTER JOIN TB_PAYER P ON (C.RTPYR_ID = P.RTPYR_ID)
+ LEFT OUTER JOIN TB_PAYER_ADDR PA ON (C.RTPYR_ID = PA.RTPYR_ID AND C.ADDR_SN = PA.ADDR_SN)
+ LEFT OUTER JOIN TB_LEVY L ON (C.CRDN_ID = L.CRDN_ID AND L.DEL_YN = 'N')
+
+
+ AND C.CRDN_ID IN (
+ #{crdnId}
+ )
+
+
+ AND C.CRDN_YMD =]]> #{schCrdnYmdFrom}
+
+
+ AND C.CRDN_YMD #{schCrdnYmdTo}
+
+
+ AND C.VHRNO = #{schVhrno}
+
+
+ AND V.VLTN_CD = #{schVltnCd}
+
+
+ AND CC.CVLCPT_RCPT_YMD =]]> #{schCvlcptRcptYmdFrom}
+
+
+ AND CC.CVLCPT_RCPT_YMD #{schCvlcptRcptYmdTo}
+
+
+ AND CC.CVLCPT_PRCS_CMPTN_DT =]]> CONCAT(#{schCvlcptPrcsCmptnDtFrom},'000000')
+
+
+ AND CC.CVLCPT_PRCS_CMPTN_DT CONCAT(#{schCvlcptPrcsCmptnDtTo},'235959')
+
+
+ AND CC.CVLCPT_PRCS_PIC = #{schCvlcptPrcsPic}
+
+
+ AND P.RTPYR_NO = #{schRtpyrNo}
+
+
+ AND P.RTPYR_NM = #{schRtpyrNm}
+
+
+ AND C.SGG_CD = #{sggCd}
+
+
+ AND C.TASK_SE_CD = #{taskSeCd}
+
+ AND C.DEL_YN = 'N'
+
+
+
+ AND C.REG_DT =]]> CONCAT(#{schRegDateFrom},'000000')
+
+
+ AND C.REG_DT CONCAT(#{schRegDateTo},'235959')
+
+
+
+
+ AND C.MDFCN_DT =]]> CONCAT(#{schRegDateFrom},'000000')
+
+
+ AND C.MDFCN_DT CONCAT(#{schRegDateTo},'235959')
+
+
+
+
+
+
+
+
+ AND C.RGTR = #{schRgtrCd}
+
+
+
+
+ AND C.MDFR = #{schRgtrCd}
+
+
+
+
+
+
+
+
+
+
+ C.CRDN_YMD
+ C.VHRNO
+ C.CRDN_STDG_NM
+ C.CRDN_PLC
+ C.FFNLG_CRDN_AMT
+ C.FFNLG_AMT
+ C.ADVNTCE_AMT
+ C.CRDN_STTS_CD
+ P.RTPYR_SE_CD
+ P.RTPYR_NO
+ P.RTPYR_NM
+ PA.ZIP
+ PA.ADDR
+ PA.DTL_ADDR
+ V.VLTN_ARTCL
+ CC.CVLCPT_RCPT_YMD
+ CC.CVLCPT_APLY_NO
+ CC.CVLCPT_RCPT_NO
+ CC.CVLCPT_TRSM_CD
+
+ #{term}
+
+
+
+
+
+ AND C.CRDN_STTS_CD BETWEEN '21' AND '31'
+ AND C.RTPYR_ID IS NOT NULL
+ AND (CC.CVLCPT_PRCS_CD IS NULL OR CC.CVLCPT_PRCS_CD ]]> '00')
+ AND L.LEVY_ID IS NULL
+
+
+
+ /* 감경부과 대상 목록 조회(levyMapper.selectRdctLevyTrgtList) */
+
+
+
+
+
+
+
+ /* 감경부과 대상 목록 조회(levyMapper.selectRdctLevyTrgtIds) */
+ SELECT C.CRDN_ID
+ , C.SGG_CD
+ , C.TASK_SE_CD
+
+
+
+
+
+ SELECT L.LEVY_ID
+ , L.SGG_CD
+ , L.TASK_SE_CD
+ , (SELECT GET_CODE_NM('FIM054', L.TASK_SE_CD) FROM DUAL) AS TASK_SE_NM
+ , L.INST_CD
+ , L.DEPT_CD
+ , L.FYR
+ , L.ACNTG_SE_CD
+ , (SELECT GET_CODE_NM('FIM074', L.ACNTG_SE_CD) FROM DUAL) AS ACNTG_SE_NM
+ , L.TXITM_CD
+ , (SELECT GET_CODE_NM('FIM075', L.TXITM_CD) FROM DUAL) AS TXITM_NM
+ , L.OPER_ITEM_CD
+ , (SELECT GET_CODE_NM('FIM076', L.TXITM_CD+L.OPER_ITEM_CD) FROM DUAL) AS OPER_ITEM_NM
+ , L.SPCL_BIZ_CD
+ , (SELECT GET_CODE_NM('FIM077', L.SPCL_BIZ_CD) FROM DUAL) AS SPCL_BIZ_NM
+ , L.LEVY_NO
+ , L.ISPY_SN
+ , L.LEVY_SE_CD
+ , (SELECT GET_CODE_NM('FIM040', L.LEVY_SE_CD) FROM DUAL) AS LEVY_SE_NM
+ , L.UNTY_SE_CD
+ , (SELECT GET_CODE_NM('FIM072', L.UNTY_SE_CD) FROM DUAL) AS UNTY_SE_NM
+ , L.RDCT_SE_CD
+ , (SELECT GET_CODE_NM('FIM046', L.RDCT_SE_CD) FROM DUAL) AS RDCT_SE_NM
+ , L.ISPY_SE_NM
+ , L.LEVY_YMD
+ , L.FRST_DUDT_YMD
+ , L.DUDT_YMD
+ , L.DUDT_AFTR_YMD
+ , L.FFNLG_AMT
+ , L.LEVY_PCPTAX
+ , L.LEVY_ADAMT
+ , L.ISPY_INT
+ , L.RCVMT_PCPTAX
+ , L.RCVMT_ADAMT
+ , L.RDAMT_PCPTAX
+ , L.RDAMT_ADAMT
+ , L.SUM_AMT
+ , L.DUDT_AFTR_AMT
+ , L.TXTN_THING
+ , L.MNG_ITEM1
+ , L.MNG_ITEM2
+ , L.MNG_ITEM3
+ , L.MNG_ITEM4
+ , L.MNG_ITEM5
+ , L.MNG_ITEM6
+ , L.NPMNT_RSN_CD
+ , (SELECT GET_CODE_NM('FIM043', L.NPMNT_RSN_CD) FROM DUAL) AS NPMNT_RSN_NM
+ , L.RCVMT_YMD
+ , L.PAY_MTHD_SE_CD
+ , (SELECT GET_CODE_NM('FIM045', L.PAY_MTHD_SE_CD) FROM DUAL) AS PAY_MTHD_SE_NM
+ , L.SZR_YMD
+ , L.SZR_THING
+ , L.RPM_SZR_VHRNO
+ , L.SZR_RMV_YMD
+ , L.SZR_RMV_RSN
+ , L.ETC_CN
+ , L.EPAYNO
+ , (SELECT GET_MASK_EPAYNO(L.EPAYNO) FROM DUAL) AS EPAYNO_MASK
+ , L.BANK_NM
+ , L.VR_ACTNO
+ , L.BANK_NM2
+ , L.VR_ACTNO2
+ , L.BANK_NM3
+ , L.VR_ACTNO3
+ , L.BANK_NM4
+ , L.VR_ACTNO4
+ , L.BANK_NM5
+ , L.VR_ACTNO5
+ , L.BANK_NM6
+ , L.VR_ACTNO6
+ , L.BANK_NM7
+ , L.VR_ACTNO7
+ , L.BANK_NM8
+ , L.VR_ACTNO8
+ , L.BANK_NM9
+ , L.VR_ACTNO9
+ , L.BANK_NM10
+ , L.VR_ACTNO10
+ , L.BANK_NM11
+ , L.VR_ACTNO11
+ , L.BANK_NM12
+ , L.VR_ACTNO12
+ , L.BANK_NM13
+ , L.VR_ACTNO13
+ , L.BANK_NM14
+ , L.VR_ACTNO14
+ , L.BANK_NM15
+ , L.VR_ACTNO15
+ , L.BANK_NM16
+ , L.VR_ACTNO16
+ , L.BANK_NM17
+ , L.VR_ACTNO17
+ , L.BANK_NM18
+ , L.VR_ACTNO18
+ , L.BANK_NM19
+ , L.VR_ACTNO19
+ , L.BANK_NM20
+ , L.VR_ACTNO20
+ , L.NXRP_LEVY_KEY
+ , L.DEL_YN
+ , L.REG_DT
+ , L.RGTR
+ , (SELECT USER_NM FROM TB_USER X WHERE X.USER_ID = L.RGTR) AS RGTR_NM
+ , L.MDFCN_DT
+ , L.MDFR
+ , (SELECT USER_NM FROM TB_USER X WHERE X.USER_ID = L.MDFR) AS MDFR_NM
+ , C.CRDN_ID
+ , C.CRDN_YMD
+ , (CONCAT(C.CRDN_YMD, C.CRDN_TM)) AS CRDN_YMD_TM
+ , (GET_MASK_DATETIME(C.CRDN_YMD, '-', C.CRDN_TM, ':')) AS CRDN_YMD_TM_MASK
+ , C.VHRNO
+ , C.CRDN_STDG_NM
+ , C.CRDN_ROAD_NM
+ , C.CRDN_PLC
+ , C.FFNLG_CRDN_AMT
+ , C.CRDN_STTS_CD
+ , (SELECT GET_CODE_NM('FIM010', C.CRDN_STTS_CD) FROM DUAL) AS CRDN_STTS_NM
+ , C.CRDN_STTS_CHG_DT
+ , V.VLTN_ID
+ , V.VLTN_CD
+ , V.VLTN_ARTCL
+ , P.RTPYR_ID
+ , P.RTPYR_SE_CD
+ , (SELECT GET_CODE_NM('FIM011', P.RTPYR_SE_CD) FROM DUAL) AS RTPYR_SE_NM
+ , P.RTPYR_NO
+ , P.RTPYR_NM
+ , PA.ADDR_SN
+ , PA.ZIP
+ , PA.ADDR
+ , PA.DTL_ADDR
+ FROM TB_LEVY L
+ INNER JOIN TB_CRDN C ON (L.CRDN_ID = C.CRDN_ID)
+ INNER JOIN TB_VLTN V ON (C.VLTN_ID = V.VLTN_ID)
+ LEFT OUTER JOIN TB_PAYER P ON (C.RTPYR_ID = P.RTPYR_ID)
+ LEFT OUTER JOIN TB_PAYER_ADDR PA ON (C.RTPYR_ID = PA.RTPYR_ID AND C.ADDR_SN = PA.ADDR_SN)
+
+
+ /* 부과 대장 목록 조회(levyMapper.selectLevyList) */
+
+
+
+
+ AND L.FYR = #{schFyr}
+
+
+ AND L.LEVY_NO =]]> #{schLevyNoFrom}
+
+
+ AND L.LEVY_NO #{schLevyNoTo}
+
+
+ AND L.RDCT_SE_CD = #{schRdctSeCd}
+
+
+ AND L.LEVY_YMD =]]> #{schLevyYmdFrom}
+
+
+ AND L.LEVY_YMD #{schLevyYmdTo}
+
+
+ AND L.DEL_YN = #{delYn}
+
+
+ AND C.CRDN_YMD =]]> #{schCrdnYmdFrom}
+
+
+ AND C.CRDN_YMD #{schCrdnYmdTo}
+
+
+ AND C.VHRNO = #{schVhrno}
+
+
+ AND C.CRDN_STTS_CD = #{schCrdnSttsCd}
+
+
+ AND P.RTPYR_NO = #{schRtpyrNo}
+
+
+ AND P.RTPYR_NM = #{schRtpyrNm}
+
+
+ AND C.SGG_CD = #{sggCd}
+
+
+ AND C.TASK_SE_CD = #{taskSeCd}
+
+ AND C.DEL_YN = 'N'
+
+
+
+ AND L.REG_DT =]]> CONCAT(#{schRegDateFrom},'000000')
+
+
+ AND L.REG_DT CONCAT(#{schRegDateTo},'235959')
+
+
+
+
+ AND L.MDFCN_DT =]]> CONCAT(#{schRegDateFrom},'000000')
+
+
+ AND L.MDFCN_DT CONCAT(#{schRegDateTo},'235959')
+
+
+
+
+
+
+
+
+ AND L.RGTR = #{schRgtrCd}
+
+
+
+
+ AND L.MDFR = #{schRgtrCd}
+
+
+
+
+
+
+
+
+
+
+ L.FYR
+ L.ACNTG_SE_CD
+ L.TXITM_CD
+ L.LEVY_YMD
+ L.LEVY_NO
+ L.LEVY_SE_CD
+ L.RDCT_SE_CD
+ L.FRST_DUDT_YMD
+ L.DUDT_YMD
+ L.FFNLG_AMT
+ L.LEVY_PCPTAX
+ L.LEVY_ADAMT
+ L.RCVMT_PCPTAX
+ L.RCVMT_ADAMT
+ L.RDAMT_PCPTAX
+ L.RDAMT_ADAMT
+ L.SUM_AMT
+ L.TXTN_THING
+ L.SZR_YMD
+ L.SZR_THING
+ L.RPM_SZR_VHRNO
+ L.SZR_RMV_YMD
+ L.EPAYNO
+ L.BANK_NM
+ L.VR_ACTNO
+ C.CRDN_YMD
+ C.VHRNO
+ C.CRDN_STDG_NM
+ C.CRDN_PLC
+ C.FFNLG_CRDN_AMT
+ C.FFNLG_AMT
+ C.ADVNTCE_AMT
+ C.CRDN_STTS_CD
+ P.RTPYR_SE_CD
+ P.RTPYR_NO
+ P.RTPYR_NM
+ PA.ZIP
+ PA.ADDR
+ PA.DTL_ADDR
+ V.VLTN_ARTCL
+
+ #{term}
+
+
+
+
+
+
+
+
+
+
+ /* 부과 대장 객체 가져오기(levyMapper.selectLevys) */
+
+
+
+ AND L.LEVY_ID IN (
+ #{levyId}
+ )
+
+
+ AND L.LEVY_ID = #{levyId}
+
+
+ AND L.DEL_YN = #{delYn}
+
+
+ AND C.CRDN_ID = #{crdnId}
+ AND C.DEL_YN = 'N'
+
+
+
+
+
+ /* 고지번호 가져오기(levyMapper.selectMaxLevyNo) */
+ SELECT LPAD(IFNULL(MAX(LEVY_NO) + 1, 1), 6, '0') AS NEW_LEVY_NO
+ FROM TB_LEVY
+ WHERE SGG_CD = #{sggCd}
+ AND TASK_SE_CD = #{taskSeCd}
+ AND FYR = #{fyr}
+ AND ACNTG_SE_CD = #{acntgSeCd}
+ AND TXITM_CD = #{txitmCd}
+ AND OPER_ITEM_CD = #{operItemCd}
+
+
+ /* 부과 금액 가져오기(levyMapper.selectLevyAmt) */
+ SELECT LEVY_ID
+ , CRDN_ID
+ , DEPT_CD
+ , SPCL_BIZ_CD
+ , FYR
+ , ACNTG_SE_CD
+ , TXITM_CD
+ , OPER_ITEM_CD
+ , LEVY_NO
+ , ISPY_SN
+ , FFNLG_AMT
+ , LEVY_PCPTAX
+ , LEVY_ADAMT
+ , RCVMT_PCPTAX
+ , RCVMT_ADAMT
+ , RDAMT_PCPTAX
+ , RDAMT_ADAMT
+ , SUM_AMT
+ , LEVY_PCPTAX - RCVMT_PCPTAX - RDAMT_PCPTAX AS LAST_PCPTAX
+ , LEVY_ADAMT - RCVMT_ADAMT - RDAMT_ADAMT AS LAST_ADAMT
+ FROM TB_LEVY
+
+
+ WHERE CRDN_ID = #{crdnId}
+
+
+ WHERE LEVY_ID = #{levyId}
+
+
+ WHERE DEPT_CD = #{deptCd}
+ AND SPCL_BIZ_CD = #{spclBizCd}
+ AND FYR = #{fyr}
+ AND ACNTG_SE_CD = #{acntgSeCd}
+ AND TXITM_CD = #{txitmCd}
+ AND OPER_ITEM_CD = #{operItemCd}
+ AND LEVY_NO = #{levyNo}
+ AND ISPY_SN = #{inspySn}
+
+
+ AND DEL_YN = 'N'
+
+
+ /* 부과 대장 등록(levyMapper.insertLevy) */
+
+
+
+
+
+
+
+ INSERT
+ INTO TB_LEVY (
+ LEVY_ID
+ , SGG_CD
+ , TASK_SE_CD
+ , CRDN_ID
+ , INST_CD
+ , DEPT_CD
+ , FYR
+ , ACNTG_SE_CD
+ , TXITM_CD
+ , OPER_ITEM_CD
+ , SPCL_BIZ_CD
+ , LEVY_NO
+ , ISPY_SN
+ , LEVY_SE_CD
+ , UNTY_SE_CD
+ , RDCT_SE_CD
+ , ISPY_SE_NM
+ , LEVY_YMD
+ , FRST_DUDT_YMD
+ , DUDT_YMD
+ , DUDT_AFTR_YMD
+ , FFNLG_AMT
+ , LEVY_PCPTAX
+ , LEVY_ADAMT
+ , ISPY_INT
+ , RCVMT_PCPTAX
+ , RCVMT_ADAMT
+ , RDAMT_PCPTAX
+ , RDAMT_ADAMT
+ , SUM_AMT
+ , DUDT_AFTR_AMT
+ , TXTN_THING
+ , MNG_ITEM1
+ , MNG_ITEM2
+ , MNG_ITEM3
+ , MNG_ITEM4
+ , MNG_ITEM5
+ , MNG_ITEM6
+ , NPMNT_RSN_CD
+ , RCVMT_YMD
+ , PAY_MTHD_SE_CD
+ , SZR_YMD
+ , SZR_THING
+ , RPM_SZR_VHRNO
+ , SZR_RMV_YMD
+ , SZR_RMV_RSN
+ , ETC_CN
+ , EPAYNO
+ , BANK_NM
+ , VR_ACTNO
+ , BANK_NM2
+ , VR_ACTNO2
+ , BANK_NM3
+ , VR_ACTNO3
+ , BANK_NM4
+ , VR_ACTNO4
+ , BANK_NM5
+ , VR_ACTNO5
+ , BANK_NM6
+ , VR_ACTNO6
+ , BANK_NM7
+ , VR_ACTNO7
+ , BANK_NM8
+ , VR_ACTNO8
+ , BANK_NM9
+ , VR_ACTNO9
+ , BANK_NM10
+ , VR_ACTNO10
+ , BANK_NM11
+ , VR_ACTNO11
+ , BANK_NM12
+ , VR_ACTNO12
+ , BANK_NM13
+ , VR_ACTNO13
+ , BANK_NM14
+ , VR_ACTNO14
+ , BANK_NM15
+ , VR_ACTNO15
+ , BANK_NM16
+ , VR_ACTNO16
+ , BANK_NM17
+ , VR_ACTNO17
+ , BANK_NM18
+ , VR_ACTNO18
+ , BANK_NM19
+ , VR_ACTNO19
+ , BANK_NM20
+ , VR_ACTNO20
+ , NXRP_LEVY_KEY
+ , DEL_YN
+ , REG_DT
+ , RGTR
+ , MDFCN_DT
+ , MDFR
+ )
+ VALUES (
+ #{levyId}
+ , #{sggCd}
+ , #{taskSeCd}
+ , #{crdnId}
+ , #{instCd}
+ , #{deptCd}
+ , #{fyr}
+ , #{acntgSeCd}
+ , #{txitmCd}
+ , #{operItemCd}
+ , #{spclBizCd}
+ , #{levyNo}
+ , #{ispySn}
+ , #{levySeCd}
+ , #{untySeCd}
+ , #{rdctSeCd}
+ , #{ispySeNm}
+ , #{levyYmd}
+ , #{frstDudtYmd}
+ , #{dudtYmd}
+ , #{dudtAftrYmd}
+ , #{ffnlgAmt}
+ , #{levyPcptax}
+ , #{levyAdamt}
+ , #{ispyInt}
+ , #{rcvmtPcptax}
+ , #{rcvmtAdamt}
+ , #{rdamtPcptax}
+ , #{rdamtAdamt}
+ , #{sumAmt}
+ , #{dudtAftrAmt}
+ , #{txtnThing}
+ , #{mngItem1}
+ , #{mngItem2}
+ , #{mngItem3}
+ , #{mngItem4}
+ , #{mngItem5}
+ , #{mngItem6}
+ , #{npmntRsnCd}
+ , #{rcvmtYmd}
+ , #{payMthdSeCd}
+ , #{szrYmd}
+ , #{szrThing}
+ , #{rpmSzrVhrno}
+ , #{szrRmvYmd}
+ , #{szrRmvRsn}
+ , #{etcCn}
+ , #{epayno}
+ , #{bankNm}
+ , #{vrActno}
+ , #{bankNm2}
+ , #{vrActno2}
+ , #{bankNm3}
+ , #{vrActno3}
+ , #{bankNm4}
+ , #{vrActno4}
+ , #{bankNm5}
+ , #{vrActno5}
+ , #{bankNm6}
+ , #{vrActno6}
+ , #{bankNm7}
+ , #{vrActno7}
+ , #{bankNm8}
+ , #{vrActno8}
+ , #{bankNm9}
+ , #{vrActno9}
+ , #{bankNm10}
+ , #{vrActno10}
+ , #{bankNm11}
+ , #{vrActno11}
+ , #{bankNm12}
+ , #{vrActno12}
+ , #{bankNm13}
+ , #{vrActno13}
+ , #{bankNm14}
+ , #{vrActno14}
+ , #{bankNm15}
+ , #{vrActno15}
+ , #{bankNm16}
+ , #{vrActno16}
+ , #{bankNm17}
+ , #{vrActno17}
+ , #{bankNm18}
+ , #{vrActno18}
+ , #{bankNm19}
+ , #{vrActno19}
+ , #{bankNm20}
+ , #{vrActno20}
+ , #{nxrpLevyKey}
+ , 'N'
+ ,
+ , #{createdBy}
+ ,
+ , #{modifiedBy}
+ )
+
+
+ /* 부과 대장 수정(levyMapper.updateLevy) */
+ UPDATE TB_LEVY
+ SET INST_CD = #{instCd}
+ , DEPT_CD = #{deptCd}
+ , FYR = #{fyr}
+ , ACNTG_SE_CD = #{acntgSeCd}
+ , TXITM_CD = #{txitmCd}
+ , OPER_ITEM_CD = #{operItemCd}
+ , SPCL_BIZ_CD = #{spclBizCd}
+ , LEVY_NO = #{levyNo}
+ , ISPY_SN = #{ispySn}
+ , LEVY_SE_CD = #{levySeCd}
+ , UNTY_SE_CD = #{untySeCd}
+ , RDCT_SE_CD = #{rdctSeCd}
+ , ISPY_SE_NM = #{ispySeNm}
+ , LEVY_YMD = #{levyYmd}
+ , FRST_DUDT_YMD = #{frstDudtYmd}
+ , DUDT_YMD = #{dudtYmd}
+ , DUDT_AFTR_YMD = #{dudtAftrYmd}
+ , FFNLG_AMT = #{ffnlgAmt}
+ , LEVY_PCPTAX = #{levyPcptax}
+ , LEVY_ADAMT = #{levyAdamt}
+ , ISPY_INT = #{ispyInt}
+ , RCVMT_PCPTAX = #{rcvmtPcptax}
+ , RCVMT_ADAMT = #{rcvmtAdamt}
+ , RDAMT_PCPTAX = #{rdamtPcptax}
+ , RDAMT_ADAMT = #{rdamtAdamt}
+ , SUM_AMT = #{sumAmt}
+ , DUDT_AFTR_AMT = #{dudtAftrAmt}
+ , TXTN_THING = #{txtnThing}
+ , MNG_ITEM1 = #{mngItem1}
+ , MNG_ITEM2 = #{mngItem2}
+ , MNG_ITEM3 = #{mngItem3}
+ , MNG_ITEM4 = #{mngItem4}
+ , MNG_ITEM5 = #{mngItem5}
+ , MNG_ITEM6 = #{mngItem6}
+ , NPMNT_RSN_CD = #{npmntRsnCd}
+ , RCVMT_YMD = #{rcvmtYmd}
+ , PAY_MTHD_SE_CD = #{payMthdSeCd}
+ , SZR_YMD = #{szrYmd}
+ , SZR_THING = #{szrThing}
+ , RPM_SZR_VHRNO = #{rpmSzrVhrno}
+ , SZR_RMV_YMD = #{szrRmvYmd}
+ , SZR_RMV_RSN = #{szrRmvRsn}
+ , ETC_CN = #{etcCn}
+ , EPAYNO = #{epayno}
+ , BANK_NM = #{bankNm}
+ , VR_ACTNO = #{vrActno}
+ , BANK_NM2 = #{bankNm2}
+ , VR_ACTNO2 = #{vrActno2}
+ , BANK_NM3 = #{bankNm3}
+ , VR_ACTNO3 = #{vrActno3}
+ , BANK_NM4 = #{bankNm4}
+ , VR_ACTNO4 = #{vrActno4}
+ , BANK_NM5 = #{bankNm5}
+ , VR_ACTNO5 = #{vrActno5}
+ , BANK_NM6 = #{bankNm6}
+ , VR_ACTNO6 = #{vrActno6}
+ , BANK_NM7 = #{bankNm7}
+ , VR_ACTNO7 = #{vrActno7}
+ , BANK_NM8 = #{bankNm8}
+ , VR_ACTNO8 = #{vrActno8}
+ , BANK_NM9 = #{bankNm9}
+ , VR_ACTNO9 = #{vrActno9}
+ , BANK_NM10 = #{bankNm10}
+ , VR_ACTNO10 = #{vrActno10}
+ , BANK_NM11 = #{bankNm11}
+ , VR_ACTNO11 = #{vrActno11}
+ , BANK_NM12 = #{bankNm12}
+ , VR_ACTNO12 = #{vrActno12}
+ , BANK_NM13 = #{bankNm13}
+ , VR_ACTNO13 = #{vrActno13}
+ , BANK_NM14 = #{bankNm14}
+ , VR_ACTNO14 = #{vrActno14}
+ , BANK_NM15 = #{bankNm15}
+ , VR_ACTNO15 = #{vrActno15}
+ , BANK_NM16 = #{bankNm16}
+ , VR_ACTNO16 = #{vrActno16}
+ , BANK_NM17 = #{bankNm17}
+ , VR_ACTNO17 = #{vrActno17}
+ , BANK_NM18 = #{bankNm18}
+ , VR_ACTNO18 = #{vrActno18}
+ , BANK_NM19 = #{bankNm19}
+ , VR_ACTNO19 = #{vrActno19}
+ , BANK_NM20 = #{bankNm20}
+ , VR_ACTNO20 = #{vrActno20}
+ , NXRP_LEVY_KEY = #{nxrpLevyKey}
+ , MDFCN_DT =
+ , MDFR = #{modifiedBy}
+ WHERE LEVY_ID = #{levyId}
+ AND DEL_YN = 'N'
+
+
+ /* 부과 대장에 부과일자, 최초납기일자, 납기일자 수정(levyMapper.updateRdctLevyYmd) */
+ UPDATE TB_LEVY
+ SET LEVY_YMD = #{levyYmd}
+ , FRST_DUDT_YMD = #{frstDudtYmd}
+ , DUDT_YMD = #{dudtYmd}
+
+ , FFNLG_AMT = #{ffnlgAmt}
+
+
+ , LEVY_PCPTAX = #{levyPcptax}
+
+
+ , SUM_AMT = #{sumAmt}
+
+ , MDFCN_DT =
+ , MDFR = #{modifiedBy}
+ WHERE LEVY_ID = #{levyId}
+ AND DEL_YN = 'N'
+
+
+ /* 부과 대장에 수납 금액 정보를 수정(levyMapper.updateRcvmt) */
+ UPDATE TB_LEVY
+ SET RCVMT_PCPTAX = #{rcvmtPcptax}
+ , RCVMT_ADAMT = #{rcvmtAdamt}
+ , SUM_AMT = #{sumAmt}
+ , DUDT_AFTR_AMT = #{dudtAftrAmt}
+ , RCVMT_YMD = #{rcvmtYmd}
+ , PAY_MTHD_SE_CD = #{payMthdSeCd}
+ , MDFCN_DT =
+ , MDFR = #{modifiedBy}
+ WHERE LEVY_ID = #{levyId}
+ AND DEL_YN = 'N'
+
+
+ /* 부과 대장에 감액 금액 정보를 수정(levyMapper.updateRdamt) */
+ UPDATE TB_LEVY
+ SET RDAMT_PCPTAX = #{rdamtPcptax}
+ , RDAMT_ADAMT = #{rdamtAdamt}
+ , SUM_AMT = #{sumAmt}
+ , DUDT_AFTR_AMT = #{dudtAftrAmt}
+ , MDFCN_DT =
+ , MDFR = #{modifiedBy}
+ WHERE LEVY_ID = #{levyId}
+ AND DEL_YN = 'N'
+
+
+ /* 부과 대장 삭제(levyMapper.deleteLevy) */
+ UPDATE TB_LEVY
+ SET DEL_YN = 'Y'
+ , DEL_DT =
+ , DLTR = #{modifiedBy}
+ , DEL_RSN = #{delRsn}
+ WHERE LEVY_ID = #{levyId}
+ AND DEL_YN = 'N'
+
+
+ /* 단속 정보 가져오기(levyMapper.selectCrdn) */
+ SELECT C.CRDN_ID
+ , C.SGG_CD
+ , C.TASK_SE_CD
+ , (SELECT GET_CODE_NM('FIM054', C.TASK_SE_CD) FROM DUAL) AS TASK_SE_NM
+ , (SELECT GET_MASK_DATETIME(C.CRDN_YMD, '-', C.CRDN_TM, ':') FROM DUAL) AS CRDN_YMD_TM_MASK
+ , C.VHRNO
+ , C.CRDN_STDG_NM
+ , C.CRDN_ROAD_NM
+ , C.CRDN_PLC
+ , C.VLTN_ID
+ , C.FFNLG_CRDN_AMT
+ , C.FFNLG_RDCRT
+ , C.FFNLG_AMT
+ , C.ADVNTCE_BGNG_YMD
+ , C.ADVNTCE_DUDT_YMD
+ , C.ADVNTCE_AMT
+ , C.CRDN_STTS_CD
+ , (SELECT GET_CODE_NM('FIM010', C.CRDN_STTS_CD) FROM DUAL) AS CRDN_STTS_NM
+ , V.VLTN_CD
+ , V.VLTN_ARTCL
+ , V.VLTN_LAW_NM
+ , V.VLTN_LAW1
+ , V.VLTN_LAW2
+ , V.VLTN_LAW_ETC
+ , V.ACNTG_SE_CD
+ , V.TXITM_CD
+ , V.OPER_ITEM_CD
+ , V.SPCL_BIZ_CD
+ , P.RTPYR_ID
+ , P.RTPYR_NO
+ , P.RTPYR_NM
+ , L.LEVY_ID
+ FROM TB_CRDN C
+ INNER JOIN TB_VLTN V ON (C.VLTN_ID = V.VLTN_ID)
+ LEFT OUTER JOIN TB_PAYER P ON (C.RTPYR_ID = P.RTPYR_ID)
+ LEFT OUTER JOIN TB_LEVY L ON (C.CRDN_ID = L.CRDN_ID AND L.DEL_YN = 'N')
+ WHERE C.CRDN_ID = #{crdnId}
+ AND C.DEL_YN = 'N'
+
+
+
diff --git a/src/main/resources/sql/mapper/fims/rdca/rdcamt-mapper.xml b/src/main/resources/sql/mapper/fims/rdca/rdcamt-mapper.xml
new file mode 100644
index 00000000..cd73d34a
--- /dev/null
+++ b/src/main/resources/sql/mapper/fims/rdca/rdcamt-mapper.xml
@@ -0,0 +1,176 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ SELECT R.RDAMT_ID
+ , R.LEVY_ID
+ , R.LAST_PCPTAX
+ , R.LAST_ADAMT
+ , R.RDAMT_YMD
+ , R.RDAMT_SE_CD
+ , R.RDAMT_RSN_CD
+ , R.RDAMT_PCPTAX
+ , R.RDAMT_ADAMT
+ , R.RDAMT_RTRCN_YN
+ , R.RDAMT_RTRCN_YMD
+ , R.RDAMT_RTRCN_RSN
+ , R.DEL_YN
+ , R.REG_DT
+ , R.RGTR
+ , R.MDFCN_DT
+ , R.MDFR
+ , R.DEL_DT
+ , R.DLTR
+ , (SELECT USER_NM FROM TB_USER X WHERE X.USER_ID = L.RGTR) AS RGTR_NM
+ , (SELECT USER_NM FROM TB_USER X WHERE X.USER_ID = L.MDFR) AS MDFR_NM
+ , (SELECT USER_NM FROM TB_USER X WHERE X.USER_ID = L.DLTR) AS DLTR_NM
+ FROM TB_RDAMT R
+ INNER JOIN TB_LEVY L ON (R.LEVY_ID = L.LEVY_ID)
+
+
+
+ SELECT R.RDAMT_ID
+ , R.LEVY_ID
+ , R.LAST_PCPTAX
+ , R.LAST_ADAMT
+ , R.RDAMT_YMD
+ , R.RDAMT_SE_CD
+ , R.RDAMT_RSN_CD
+ , R.RDAMT_PCPTAX
+ , R.RDAMT_ADAMT
+ , R.RDAMT_RTRCN_YN
+ , R.RDAMT_RTRCN_YMD
+ , R.RDAMT_RTRCN_RSN
+ , R.DEL_YN
+ , R.REG_DT
+ , R.RGTR
+ , R.MDFCN_DT
+ , R.MDFR
+ , R.DEL_DT
+ , R.DLTR
+ , R.DEL_RSN
+ , (SELECT USER_NM FROM TB_USER X WHERE X.USER_ID = L.RGTR) AS RGTR_NM
+ , (SELECT USER_NM FROM TB_USER X WHERE X.USER_ID = L.MDFR) AS MDFR_NM
+ , (SELECT USER_NM FROM TB_USER X WHERE X.USER_ID = L.DLTR) AS DLTR_NM
+ FROM TB_RDAMT
+
+
+ /* 감액 대장 목록 조회(rdcamtMapper.selectRdamtList) */
+
+
+
+
+
+
+
+ /* 감액 대장 객체 가져오기(rdcamtMapper.selectRdamts) */
+
+
+
+
+
+ /* 감액 대장 등록(rdcamtMapper.insertRdamt) */
+
+ SELECT CONCAT(#{rdamt.sggCd}, DATE_FORMAT(CURRENT_DATE, '%Y'), LPAD(CAST(IFNULL(MAX(SUBSTRING(RDAMT_ID, 10)) + 1, 1) AS INT), 11, '0')) AS NEW_ID
+ FROM TB_RDAMT
+ WHERE RDAMT_ID LIKE CONCAT(#{rdamt.sggCd}, DATE_FORMAT(CURRENT_DATE, '%Y'), '%')
+
+ INSERT
+ INTO TB_RDAMT (
+ RDAMT_ID
+ , LEVY_ID
+ , LAST_PCPTAX
+ , LAST_ADAMT
+ , RDAMT_YMD
+ , RDAMT_SE_CD
+ , RDAMT_RSN_CD
+ , RDAMT_PCPTAX
+ , RDAMT_ADAMT
+ , RDAMT_RTRCN_YN
+ , RDAMT_RTRCN_YMD
+ , RDAMT_RTRCN_RSN
+ , DEL_YN
+ , REG_DT
+ , RGTR
+ , MDFCN_DT
+ , MDFR
+ )
+ VALUES (
+ #{rdamt.rdamtId}
+ , #{rdamt.levyId}
+ , #{rdamt.lastPcptax}
+ , #{rdamt.lastAdamt}
+ , #{rdamt.rdamtYmd}
+ , #{rdamt.rdamtSeCd}
+ , #{rdamt.rdamtRsnCd}
+ , #{rdamt.rdamtPcptax}
+ , #{rdamt.rdamtAdamt}
+ , 'N'
+ , #{rdamt.rdamtRtrcnYmd}
+ , #{rdamt.rdamtRtrcnRsn}
+ , 'N'
+ ,
+ , #{rdamt.createdBy}
+ ,
+ , #{rdamt.modifiedBy}
+ )
+
+
+ /* 감액 대장 수정(rdamtMapper.updateRdamt) */
+ UPDATE TB_RDAMT
+ SET LAST_PCPTAX = #{rdamt.lastPcptax}
+ , LAST_ADAMT = #{rdamt.lastAdamt}
+ , RDAMT_YMD = #{rdamt.rdamtYmd}
+ , RDAMT_SE_CD = #{rdamt.rdamtSeCd}
+ , RDAMT_RSN_CD = #{rdamt.rdamtRsnCd}
+ , RDAMT_PCPTAX = #{rdamt.rdamtPcptax}
+ , RDAMT_ADAMT = #{rdamt.rdamtAdamt}
+ , RDAMT_RTRCN_YN = #{rdamt.rdamtRtrcnYn}
+ , RDAMT_RTRCN_YMD = #{rdamt.rdamtRtrcnYmd}
+ , RDAMT_RTRCN_RSN = #{rdamt.rdamtRtrcnRsn}
+ , MDFCN_DT =
+ , MDFR = #{rdamt.modifiedBy}
+ WHERE RDAMT_ID = #{rdamt.rdamtId}
+ AND DEL_YN = 'N'
+
+
+ /* 감액 대장 삭제(rdamtMapper.deleteRdamt) */
+ UPDATE TB_RDAMT
+ SET DEL_YN = 'Y'
+ , DEL_DT =
+ , DLTR = #{rdamt.modifiedBy}
+ , DEL_RSN = #{rdamt.delRsn}
+ WHERE RDAMT_ID = #{rdamt.rdamtId}
+ AND DEL_YN = 'N'
+
+
+