diff --git a/src/main/java/cokr/xit/fims/excl/web/Excl01Controller.java b/src/main/java/cokr/xit/fims/excl/web/Excl01Controller.java index ad11ecf4..c6672d78 100644 --- a/src/main/java/cokr/xit/fims/excl/web/Excl01Controller.java +++ b/src/main/java/cokr/xit/fims/excl/web/Excl01Controller.java @@ -99,6 +99,7 @@ public class Excl01Controller extends ApplicationController { .setFilename("부과제외 목록.xlsx") .worksheet(0); + // CellStyle 지정은 여기에서.. CellStyle center = xlsx.cellStyle(Styler.CENTER); // 가운데 정렬 CellStyle numeric = xlsx.n_nn0(); // 숫자 3자리 콤마(,) CellStyle dateYMD = xlsx.yyyy_mm_dd(); // 연월일 diff --git a/src/main/java/cokr/xit/fims/excl/web/Excl02Controller.java b/src/main/java/cokr/xit/fims/excl/web/Excl02Controller.java index 3befa9c2..95a132b9 100644 --- a/src/main/java/cokr/xit/fims/excl/web/Excl02Controller.java +++ b/src/main/java/cokr/xit/fims/excl/web/Excl02Controller.java @@ -110,6 +110,7 @@ public class Excl02Controller extends ApplicationController { .setFilename("의견제출 목록.xlsx") .worksheet(0); + // CellStyle 지정은 여기에서.. CellStyle center = xlsx.cellStyle(Styler.CENTER); // 가운데 정렬 CellStyle numeric = xlsx.n_nn0(); // 숫자 3자리 콤마(,) CellStyle dateYMD = xlsx.yyyy_mm_dd(); // 연월일 diff --git a/src/main/java/cokr/xit/fims/excl/web/Excl03Controller.java b/src/main/java/cokr/xit/fims/excl/web/Excl03Controller.java index dcc97ef5..18728eef 100644 --- a/src/main/java/cokr/xit/fims/excl/web/Excl03Controller.java +++ b/src/main/java/cokr/xit/fims/excl/web/Excl03Controller.java @@ -97,6 +97,7 @@ public class Excl03Controller extends ApplicationController { .setFilename("단속 재등록 목록.xlsx") .worksheet(0); + // CellStyle 지정은 여기에서.. CellStyle center = xlsx.cellStyle(Styler.CENTER); // 가운데 정렬 CellStyle numeric = xlsx.n_nn0(); // 숫자 3자리 콤마(,) CellStyle dateYMD = xlsx.yyyy_mm_dd(); // 연월일 diff --git a/src/main/java/cokr/xit/fims/levy/service/bean/LevyBean.java b/src/main/java/cokr/xit/fims/levy/service/bean/LevyBean.java index d27c7e95..179dbcc2 100644 --- a/src/main/java/cokr/xit/fims/levy/service/bean/LevyBean.java +++ b/src/main/java/cokr/xit/fims/levy/service/bean/LevyBean.java @@ -131,10 +131,16 @@ public class LevyBean extends AbstractComponent { DataObject crdnInfo = levyMapper.selectCrdn(levy.getCrdnId()); if (!crdnInfo.string("LEVY_ID").equals("")) { - throw new RuntimeException("감경부과 등록 중 이미 감경부과된 자료가 있습니다."); // 예외를 발생시켜서 DB Rollback + rtnMsg = "[F] 작업 중 이미 감경 부과된 자료가 있습니다."; + return rtnMsg; } if (crdnInfo.number("CRDN_STTS_CD").intValue() > 31 ) { - throw new RuntimeException("감경부과 등록 중 단속상태가 " + crdnInfo.string("CRDN_STTS_NM") + " 자료가 있습니다."); // 예외를 발생시켜서 DB Rollback + rtnMsg = "[F] 작업 중 단속 상태가 " + crdnInfo.string("CRDN_STTS_NM") + " 자료가 있습니다."; + return rtnMsg; + } + if (!crdnInfo.string("RTPYR_ID").equals("")) { + rtnMsg = "[F] 작업 중 납부자 정보가 없는 자료가 있습니다."; + return rtnMsg; } // 전용차로위반, 주정차위반 과태료 diff --git a/src/main/java/cokr/xit/fims/levy/web/Levy01Controller.java b/src/main/java/cokr/xit/fims/levy/web/Levy01Controller.java index 415bee8c..31774780 100644 --- a/src/main/java/cokr/xit/fims/levy/web/Levy01Controller.java +++ b/src/main/java/cokr/xit/fims/levy/web/Levy01Controller.java @@ -3,16 +3,17 @@ package cokr.xit.fims.levy.web; import java.util.ArrayList; import java.util.List; import java.util.Map; -import java.util.function.BiFunction; import javax.annotation.Resource; import org.apache.poi.ss.usermodel.CellStyle; -import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.servlet.ModelAndView; +import com.fasterxml.jackson.core.type.TypeReference; + import cokr.xit.base.code.CommonCode; import cokr.xit.base.file.xls.XLSWriter; +import cokr.xit.base.file.xls.XLSWriter.CellDef; import cokr.xit.base.file.xls.XLSWriter.Styler; import cokr.xit.base.user.ManagedUser; import cokr.xit.base.web.ApplicationController; @@ -95,72 +96,53 @@ public class Levy01Controller extends ApplicationController { List result = levyService.getRductLevyTrgtList(setFetchSize(req)); return setCollectionInfo(new ModelAndView("jsonView"), result, "rductLevyTrgt"); } else { + ArrayList cellDefs = fromJson(req.getCellDefs(), new TypeReference>() {}); + XLSWriter xlsx = new XLSWriter() .setFilename("사전 감경부과 대상 목록.xlsx") .worksheet(0); - // CellStyle 지정은 여기에서.. - CellStyle center = xlsx.cellStyle(Styler.CENTER) // 가운데 정렬 - , numeric = xlsx.n_nn0() // 숫자 3자리 콤마(,) - , dateYMD = xlsx.yyyy_mm_dd() // 연월일 - , dateDT = xlsx.yyyy_mm_dd_hh_mm_ss(); // 연월일+시간 + CellStyle center = xlsx.cellStyle(Styler.CENTER); // 가운데 정렬 + CellStyle numeric = xlsx.n_nn0(); // 숫자 3자리 콤마(,) + CellStyle dateYMD = xlsx.yyyy_mm_dd(); // 연월일 + CellStyle dateDT = xlsx.yyyy_mm_dd_hh_mm_ss(); // 연월일+시간 - String[] excelTitle = req.getExcelTitle(); - List titles = new ArrayList(); - for (int iLoop = 0; iLoop < excelTitle.length; iLoop++) { - String item = excelTitle[iLoop]; - titles.add(item); - } - - int[] excelTitleWidth = req.getExcelTitleWidth(); - List widths = new ArrayList<>(); - for (int jLoop = 0; jLoop < excelTitleWidth.length; jLoop++) { - int item = excelTitleWidth[jLoop]; - widths.add(item); - } + List list = levyService.getRductLevyTrgtList(req.setFetchSize(0)); - List headerStylers = CmmnUtil.makeHeadersByDiffrentWidths(widths, xlsx); + CellDef.setValues(cellDefs, Map.ofEntries( + Map.entry("업무구분", xlsx.style("TASK_SE_NM", center)) + , Map.entry("단속일시", xlsx.format(o -> xlsx.str2datetime(o.get("CRDN_YMD_TM"))).style(dateDT)) + , Map.entry("차량번호", "VHRNO") + , Map.entry("법정동", "CRDN_STDG_NM") + , Map.entry("단속장소", "CRDN_PLC") + , Map.entry("위반항목", "VLTN_ARTCL") + , Map.entry("최초단속금액", xlsx.style("FFNLG_CRDN_AMT", numeric)) + , Map.entry("과태료금액", xlsx.style("FFNLG_AMT", numeric)) + , Map.entry("사전통지금액", xlsx.style("ADVNTCE_AMT", numeric)) + , Map.entry("처리상태", "CRDN_STTS_NM") + , Map.entry("민원신청번호", xlsx.style("CVLCPT_APLY_NO", center)) + , Map.entry("민원접수번호", xlsx.style("CVLCPT_RCPT_NO", center)) + , Map.entry("민원접수일자", xlsx.format(o -> xlsx.str2date(o.get("CVLCPT_RCPT_YMD"))).style(dateYMD)) + , Map.entry("민원전송결과", xlsx.style("CVLCPT_TRSM_NM", center)) + , Map.entry("납부자명", "RTPYR_NM") + , Map.entry("납부자생일", xlsx.style("RTPYR_BRDT_MASK", center)) + , Map.entry("우편번호", xlsx.style("ZIP", center)) + , Map.entry("주소", "ADDR") + , Map.entry("상세주소", "DTL_ADDR") + , Map.entry("등록일시", xlsx.format(o -> xlsx.str2datetime(o.get("REG_DT"))).style(dateDT)) + , Map.entry("등록사용자", xlsx.style("RGTR_NM", center)) + , Map.entry("수정일시", xlsx.format(o -> xlsx.str2datetime(o.get("MDFCN_DT"))).style(dateDT)) + , Map.entry("수정사용자", xlsx.style("MDFR_NM", center)) + ) + ); xlsx.cell(0, 0) - .value("사전 감경부과 대상", XLSWriter.Styler.CENTER) - .merge(0, 11) + .value("사전 감경부과 대상", center) + .merge(0, cellDefs.size() - 1) .cell(3, 0) - .rowValues(CmmnUtil.mergeListByIndex(titles, headerStylers)); - - List list = levyService.getRductLevyTrgtList(req.setFetchSize(0)); - - BiFunction getValue = (titleNm, nothing) -> { - switch (titleNm) { - case "업무구분" : return xlsx.style("TASK_SE_NM", center); - case "단속일시" : return xlsx.format(o -> xlsx.str2datetime(o.get("CRDN_YMD_TM"))).style(dateDT); - case "차량번호" : return "VHRNO"; - case "법정동" : return "CRDN_STDG_NM"; - case "단속장소" : return "CRDN_PLC"; - case "위반항목" : return "VLTN_ARTCL"; - case "최초단속금액" : return xlsx.style("FFNLG_CRDN_AMT", numeric); - case "과태료금액" : return xlsx.style("FFNLG_AMT", numeric); - case "사전통지금액" : return xlsx.style("ADVNTCE_AMT", numeric); - case "처리상태" : return "CRDN_STTS_NM"; - case "민원신청번호" : return xlsx.style("CVLCPT_APLY_NO", center); - case "민원접수번호" : return xlsx.style("CVLCPT_RCPT_NO", center); - case "민원접수일자" : return xlsx.format(o -> xlsx.str2date(o.get("CVLCPT_RCPT_YMD"))).style(dateYMD); - case "민원전송결과" : return xlsx.style("CVLCPT_TRSM_NM", center); - case "납부자명" : return "RTPYR_NM"; - case "납부자생일" : return xlsx.style("RTPYR_BRDT_MASK", center); - case "우편번호" : return xlsx.style("ZIP", center); - case "주소" : return "ADDR"; - case "상세주소" : return "DTL_ADDR"; - case "등록일시" : return xlsx.format(o -> xlsx.str2datetime(o.get("REG_DT"))).style(dateDT); - case "등록사용자" : return xlsx.style("RGTR_NM", center); - case "수정일시" : return xlsx.format(o -> xlsx.str2datetime(o.get("MDFCN_DT"))).style(dateDT); - case "수정사용자" : return xlsx.style("MDFR_NM", center); - } - - return ""; - }; - - xlsx.cell(4, 0) - .values(list, titles.stream().map((item) -> { return getValue.apply(item, null); }).toArray()); + .rowValues(CellDef.header(cellDefs, () -> CmmnUtil.headerStyle(xlsx))) + .cell(4, 0) + .values(list, CellDef.values(cellDefs)); return new ModelAndView("xlsView") .addObject("xls", xlsx); @@ -254,102 +236,83 @@ public class Levy01Controller extends ApplicationController { List result = levyService.getLevyList(setFetchSize(req)); return setCollectionInfo(new ModelAndView("jsonView"), result, "levy"); } else { + ArrayList cellDefs = fromJson(req.getCellDefs(), new TypeReference>() {}); + XLSWriter xlsx = new XLSWriter() .setFilename("부과 목록.xlsx") .worksheet(0); - // CellStyle 지정은 여기에서.. - CellStyle center = xlsx.cellStyle(Styler.CENTER) // 가운데 정렬 - , numeric = xlsx.n_nn0() // 숫자 3자리 콤마(,) - , dateYMD = xlsx.yyyy_mm_dd() // 연월일 - , dateDT = xlsx.yyyy_mm_dd_hh_mm_ss(); // 연월일+시간 - - String[] excelTitle = req.getExcelTitle(); - List titles = new ArrayList(); - for (int iLoop = 0; iLoop < excelTitle.length; iLoop++) { - String item = excelTitle[iLoop]; - titles.add(item); - } + CellStyle center = xlsx.cellStyle(Styler.CENTER); // 가운데 정렬 + CellStyle numeric = xlsx.n_nn0(); // 숫자 3자리 콤마(,) + CellStyle dateYMD = xlsx.yyyy_mm_dd(); // 연월일 + CellStyle dateDT = xlsx.yyyy_mm_dd_hh_mm_ss(); // 연월일+시간 - int[] excelTitleWidth = req.getExcelTitleWidth(); - List widths = new ArrayList<>(); - for (int jLoop = 0; jLoop < excelTitleWidth.length; jLoop++) { - int item = excelTitleWidth[jLoop]; - widths.add(item); - } + List list = levyService.getLevyList(req.setFetchSize(0)); - List headerStylers = CmmnUtil.makeHeadersByDiffrentWidths(widths, xlsx); + CellDef.setValues(cellDefs, Map.ofEntries( + Map.entry("업무구분", xlsx.style("TASK_SE_NM", center)) + , Map.entry("회계연도", xlsx.style("FYR", center)) + , Map.entry("회계코드", xlsx.style("ACNTG_SE_CD", center)) + , Map.entry("세목코드", xlsx.style("TXITM_CD", center)) + , Map.entry("세목명", xlsx.style("TXITM_NM", center)) + , Map.entry("부과번호", xlsx.style("LEVY_NO", center)) + , Map.entry("분납순번", xlsx.style("INSPY_SN", center)) + , Map.entry("부과구분", xlsx.style("LEVY_SE_NM", center)) + , Map.entry("통합구분", xlsx.style("UNTY_SE_NM", center)) + , Map.entry("감경구분", xlsx.style("RDUCT_SE_NM", center)) + , Map.entry("부과일자", xlsx.format(o -> xlsx.str2date(o.get("LEVY_YMD"))).style(dateYMD)) + , Map.entry("최초납기일자", xlsx.format(o -> xlsx.str2date(o.get("FRST_DUDT_YMD"))).style(dateYMD)) + , Map.entry("납기일자", xlsx.format(o -> xlsx.str2date(o.get("DUDT_YMD"))).style(dateYMD)) + , Map.entry("과태료금액", xlsx.style("FFNLG_AMT", numeric)) + , Map.entry("부과본세", xlsx.style("LEVY_PCPTAX", numeric)) + , Map.entry("부과가산금", xlsx.style("LEVY_ADAMT", numeric)) + , Map.entry("분납이자", xlsx.style("INSPY_INT", numeric)) + , Map.entry("수납본세", xlsx.style("RCVMT_PCPTAX", numeric)) + , Map.entry("수납가산금", xlsx.style("RCVMT_ADAMT", numeric)) + , Map.entry("감액본세", xlsx.style("RDCAMT_PCPTAX", numeric)) + , Map.entry("감액가산금", xlsx.style("RDCAMT_ADAMT", numeric)) + , Map.entry("합계금액", xlsx.style("SUM_AMT", numeric)) + , Map.entry("과세물건", "TXTN_THING") + , Map.entry("체납사유", "NPMNT_RSN_NM") + , Map.entry("수납일자", xlsx.format(o -> xlsx.str2date(o.get("RCVMT_YMD"))).style(dateYMD)) + , Map.entry("압류일자", xlsx.format(o -> xlsx.str2date(o.get("SZR_YMD"))).style(dateYMD)) + , Map.entry("압류물건", "SZR_THING") + , Map.entry("대체압류차량", "RPM_SZR_VHRNO") + , Map.entry("압류해제일자", xlsx.format(o -> xlsx.str2date(o.get("SZR_RMV_YMD"))).style(dateYMD)) + , Map.entry("전자납부번호", "EPAYNO_MASK") + , Map.entry("은행명", "BANK_NM") + , Map.entry("가상계좌번호", xlsx.style("VR_ACTNO", center)) + , Map.entry("은행명2", "BANK_NM2") + , Map.entry("가상계좌번호2", xlsx.style("VR_ACTNO2", center)) + , Map.entry("은행명3", "BANK_NM3") + , Map.entry("가상계좌번호3", xlsx.style("VR_ACTNO3", center)) + , Map.entry("단속일시", xlsx.format(o -> xlsx.str2datetime(o.get("CRDN_YMD_TM"))).style(dateDT)) + , Map.entry("차량번호", "VHRNO") + , Map.entry("법정동", "CRDN_STDG_NM") + , Map.entry("단속장소", "CRDN_PLC") + , Map.entry("위반항목", "VLTN_ARTCL") + , Map.entry("최초단속금액", xlsx.style("FFNLG_CRDN_AMT", numeric)) + , Map.entry("처리상태", "CRDN_STTS_NM") + , Map.entry("납부자구분", xlsx.style("RTPYR_SE_NM", center)) + , Map.entry("납부자명", "RTPYR_NM") + , Map.entry("납부자생일", xlsx.style("RTPYR_BRDT_MASK", center)) + , Map.entry("우편번호", xlsx.style("ZIP", center)) + , Map.entry("주소", "ADDR") + , Map.entry("상세주소", "DTL_ADDR") + , Map.entry("등록일시", xlsx.format(o -> xlsx.str2datetime(o.get("REG_DT"))).style(dateDT)) + , Map.entry("등록사용자", xlsx.style("RGTR_NM", center)) + , Map.entry("수정일시", xlsx.format(o -> xlsx.str2datetime(o.get("MDFCN_DT"))).style(dateDT)) + , Map.entry("수정사용자", xlsx.style("MDFR_NM", center)) + ) + ); xlsx.cell(0, 0) - .value("부과", XLSWriter.Styler.CENTER) - .merge(0, 15) + .value("부과", center) + .merge(0, cellDefs.size() - 1) .cell(3, 0) - .rowValues(CmmnUtil.mergeListByIndex(titles, headerStylers)); - - List list = levyService.getLevyList(req.setFetchSize(0)); - - BiFunction getValue = (titleNm, nothing) -> { - switch (titleNm) { - case "업무구분" : return xlsx.style("TASK_SE_NM", center); - case "회계연도" : return xlsx.style("FYR", center); - case "회계코드" : return xlsx.style("ACNTG_SE_CD", center); - case "세목코드" : return xlsx.style("TXITM_CD", center); - case "세목명" : return xlsx.style("TXITM_NM", center); - case "부과번호" : return xlsx.style("LEVY_NO", center); - case "분납순번" : return xlsx.style("INSPY_SN", center); - case "부과구분" : return xlsx.style("LEVY_SE_NM", center); - case "통합구분" : return xlsx.style("UNTY_SE_NM", center); - case "감경구분" : return xlsx.style("RDUCT_SE_NM", center); - case "부과일자" : return xlsx.format(o -> xlsx.str2date(o.get("LEVY_YMD"))).style(dateYMD); - case "최초납기일자" : return xlsx.format(o -> xlsx.str2date(o.get("FRST_DUDT_YMD"))).style(dateYMD); - case "납기일자" : return xlsx.format(o -> xlsx.str2date(o.get("DUDT_YMD"))).style(dateYMD); - case "과태료금액" : return xlsx.style("FFNLG_AMT", numeric); - case "부과본세" : return xlsx.style("LEVY_PCPTAX", numeric); - case "부과가산금" : return xlsx.style("LEVY_ADAMT", numeric); - case "분납이자" : return xlsx.style("INSPY_INT", numeric); - case "수납본세" : return xlsx.style("RCVMT_PCPTAX", numeric); - case "수납가산금" : return xlsx.style("RCVMT_ADAMT", numeric); - case "감액본세" : return xlsx.style("RDCAMT_PCPTAX", numeric); - case "감액가산금" : return xlsx.style("RDCAMT_ADAMT", numeric); - case "합계금액" : return xlsx.style("SUM_AMT", numeric); - case "과세물건" : return "TXTN_THING"; - case "체납사유" : return "NPMNT_RSN_NM"; - case "수납일자" : return xlsx.format(o -> xlsx.str2date(o.get("RCVMT_YMD"))).style(dateYMD); - case "압류일자" : return xlsx.format(o -> xlsx.str2date(o.get("SZR_YMD"))).style(dateYMD); - case "압류물건" : return "SZR_THING"; - case "대체압류차량" : return "RPM_SZR_VHRNO"; - case "압류해제일자" : return xlsx.format(o -> xlsx.str2date(o.get("SZR_RMV_YMD"))).style(dateYMD); - case "전자납부번호" : return "EPAYNO_MASK"; - case "은행명" : return "BANK_NM"; - case "가상계좌번호" : return xlsx.style("VR_ACTNO", center); - case "은행명2" : return "BANK_NM2"; - case "가상계좌번호2" : return xlsx.style("VR_ACTNO2", center); - case "은행명3" : return "BANK_NM3"; - case "가상계좌번호3" : return xlsx.style("VR_ACTNO3", center); - case "단속일시" : return xlsx.format(o -> xlsx.str2datetime(o.get("CRDN_YMD_TM"))).style(dateDT); - case "차량번호" : return "VHRNO"; - case "법정동" : return "CRDN_STDG_NM"; - case "단속장소" : return "CRDN_PLC"; - case "위반항목" : return "VLTN_ARTCL"; - case "최초단속금액" : return xlsx.style("FFNLG_CRDN_AMT", numeric); - case "처리상태" : return "CRDN_STTS_NM"; - case "납부자구분" : return xlsx.style("RTPYR_SE_NM", center); - case "납부자명" : return "RTPYR_NM"; - case "납부자생일" : return xlsx.style("RTPYR_BRDT_MASK", center); - case "우편번호" : return xlsx.style("ZIP", center); - case "주소" : return "ADDR"; - case "상세주소" : return "DTL_ADDR"; - case "등록일시" : return xlsx.format(o -> xlsx.str2datetime(o.get("REG_DT"))).style(dateDT); - case "등록사용자" : return xlsx.style("RGTR_NM", center); - case "수정일시" : return xlsx.format(o -> xlsx.str2datetime(o.get("MDFCN_DT"))).style(dateDT); - case "수정사용자" : return xlsx.style("MDFR_NM", center); - } - - return ""; - }; - - xlsx.cell(4, 0) - .values(list, titles.stream().map((item) -> { return getValue.apply(item, null); }).toArray()); + .rowValues(CellDef.header(cellDefs, () -> CmmnUtil.headerStyle(xlsx))) + .cell(4, 0) + .values(list, CellDef.values(cellDefs)); return new ModelAndView("xlsView") .addObject("xls", xlsx); @@ -363,7 +326,7 @@ public class Levy01Controller extends ApplicationController { * "saved": 등록되었으면 true, 그렇지 않으면 false * } */ - @PostMapping(name = "부과 대장 등록", value = "/010/create.do") +// @PostMapping(name = "부과 대장 등록", value = "/010/create.do") public ModelAndView create(Levy levy) { boolean saved = levyService.create(levy); @@ -378,7 +341,7 @@ public class Levy01Controller extends ApplicationController { * "saved": 수정되었으면 true, 그렇지 않으면 false * } */ - @PostMapping(name = "부과 대장 수정", value = "/010/update.do") +// @PostMapping(name = "부과 대장 수정", value = "/010/update.do") public ModelAndView update(Levy levy) { boolean saved = levyService.update(levy); @@ -394,7 +357,7 @@ public class Levy01Controller extends ApplicationController { * "saved": 저장되었으면 true, 그렇지 않으면 false * } */ - @PostMapping(name = "부과 대장 제거", value = "/010/remove.do") +// @PostMapping(name = "부과 대장 제거", value = "/010/remove.do") public ModelAndView remove(Levy levy) { boolean saved = levyService.remove(levy); diff --git a/src/main/java/cokr/xit/fims/rcvm/web/Rcvm01Controller.java b/src/main/java/cokr/xit/fims/rcvm/web/Rcvm01Controller.java index eb4480a0..f4448087 100644 --- a/src/main/java/cokr/xit/fims/rcvm/web/Rcvm01Controller.java +++ b/src/main/java/cokr/xit/fims/rcvm/web/Rcvm01Controller.java @@ -3,15 +3,17 @@ package cokr.xit.fims.rcvm.web; import java.util.ArrayList; import java.util.List; import java.util.Map; -import java.util.function.BiFunction; import javax.annotation.Resource; import org.apache.poi.ss.usermodel.CellStyle; import org.springframework.web.servlet.ModelAndView; +import com.fasterxml.jackson.core.type.TypeReference; + import cokr.xit.base.code.CommonCode; import cokr.xit.base.file.xls.XLSWriter; +import cokr.xit.base.file.xls.XLSWriter.CellDef; import cokr.xit.base.file.xls.XLSWriter.Styler; import cokr.xit.base.user.ManagedUser; import cokr.xit.base.web.ApplicationController; @@ -89,90 +91,71 @@ public class Rcvm01Controller extends ApplicationController { List result = rcvmtService.getRcvmtList(setFetchSize(req)); return setCollectionInfo(new ModelAndView("jsonView"), result, "rcvmt"); } else { + ArrayList cellDefs = fromJson(req.getCellDefs(), new TypeReference>() {}); + XLSWriter xlsx = new XLSWriter() .setFilename("수납 목록.xlsx") .worksheet(0); - // CellStyle 지정은 여기에서.. - CellStyle center = xlsx.cellStyle(Styler.CENTER) // 가운데 정렬 - , numeric = xlsx.n_nn0() // 숫자 3자리 콤마(,) - , dateYMD = xlsx.yyyy_mm_dd() // 연월일 - , dateDT = xlsx.yyyy_mm_dd_hh_mm_ss(); // 연월일+시간 + CellStyle center = xlsx.cellStyle(Styler.CENTER); // 가운데 정렬 + CellStyle numeric = xlsx.n_nn0(); // 숫자 3자리 콤마(,) + CellStyle dateYMD = xlsx.yyyy_mm_dd(); // 연월일 + CellStyle dateDT = xlsx.yyyy_mm_dd_hh_mm_ss(); // 연월일+시간 - String[] excelTitle = req.getExcelTitle(); - List titles = new ArrayList(); - for (int iLoop = 0; iLoop < excelTitle.length; iLoop++) { - String item = excelTitle[iLoop]; - titles.add(item); - } - - int[] excelTitleWidth = req.getExcelTitleWidth(); - List widths = new ArrayList<>(); - for (int jLoop = 0; jLoop < excelTitleWidth.length; jLoop++) { - int item = excelTitleWidth[jLoop]; - widths.add(item); - } + List list = rcvmtService.getRcvmtList(req.setFetchSize(0)); - List headerStylers = CmmnUtil.makeHeadersByDiffrentWidths(widths, xlsx); + CellDef.setValues(cellDefs, Map.ofEntries( + Map.entry("업무구분", xlsx.style("TASK_SE_NM", center)) + , Map.entry("수납입력구분", xlsx.style("RCVMT_INPT_SE_NM", center)) + , Map.entry("수납취소", xlsx.style("RCVMT_RTRCN_NM", center)) + , Map.entry("회계연도", xlsx.style("FYR", center)) + , Map.entry("회계구분", xlsx.style("ACNTG_SE_CD", center)) + , Map.entry("세목코드", xlsx.style("TXITM_CD", center)) + , Map.entry("세목명", "TXITM_NM") + , Map.entry("부과번호", xlsx.style("LEVY_NO", center)) + , Map.entry("수납일련번호", xlsx.style("RCVMT_SN", center)) + , Map.entry("소인일자", xlsx.format(o -> xlsx.str2date(o.get("PSTMRK_YMD"))).style(dateYMD)) + , Map.entry("회계일자", xlsx.format(o -> xlsx.str2date(o.get("ACNTG_YMD"))).style(dateYMD)) + , Map.entry("수납일자", xlsx.format(o -> xlsx.str2date(o.get("RCVMT_YMD"))).style(dateYMD)) + , Map.entry("수납금액", xlsx.style("RCVMT_AMT", numeric)) + , Map.entry("수납본세", xlsx.style("RCVMT_PCPTAX", numeric)) + , Map.entry("수납가산금", xlsx.style("RCVMT_ADAMT", numeric)) + , Map.entry("수납이자", xlsx.style("RCVMT_INT", numeric)) + , Map.entry("수납은행", "RCVMT_BANK_NM") + , Map.entry("납부방법", "PAY_MTHD_SE_NM") + , Map.entry("수납구분", xlsx.style("RCVMT_SE_NM", center)) + , Map.entry("수납상태", xlsx.style("RCVMT_STTS_NM", center)) + , Map.entry("부과일자", xlsx.format(o -> xlsx.str2date(o.get("LEVY_YMD"))).style(dateYMD)) + , Map.entry("최초납기일자", xlsx.format(o -> xlsx.str2date(o.get("FRST_DUDT_YMD"))).style(dateYMD)) + , Map.entry("납기일자", xlsx.format(o -> xlsx.str2date(o.get("DUDT_YMD"))).style(dateYMD)) + , Map.entry("부과본세", xlsx.style("LEVY_PCPTAX", numeric)) + , Map.entry("부과가산금", xlsx.style("LEVY_ADAMT", numeric)) + , Map.entry("분납이자", xlsx.style("INSPY_INT", numeric)) + , Map.entry("압류일자", xlsx.format(o -> xlsx.str2date(o.get("SZR_YMD"))).style(dateYMD)) + , Map.entry("압류물건", "SZR_THING") + , Map.entry("대체압류차량", "RPM_SZR_VHRNO") + , Map.entry("압류해제일자", xlsx.format(o -> xlsx.str2date(o.get("SZR_RMV_YMD"))).style(dateYMD)) + , Map.entry("단속일시", xlsx.format(o -> xlsx.str2datetime(o.get("CRDN_YMD_TM"))).style(dateDT)) + , Map.entry("차량번호", "VHRNO") + , Map.entry("법정동", "CRDN_STDG_NM") + , Map.entry("단속장소", "CRDN_PLC") + , Map.entry("처리상태", "CRDN_STTS_NM") + , Map.entry("납부자명", "RTPYR_NM") + , Map.entry("납부자생일", xlsx.style("RTPYR_BRDT_MASK", center)) + , Map.entry("등록일시", xlsx.format(o -> xlsx.str2datetime(o.get("REG_DT"))).style(dateDT)) + , Map.entry("등록사용자", xlsx.style("RGTR_NM", center)) + , Map.entry("수정일시", xlsx.format(o -> xlsx.str2datetime(o.get("MDFCN_DT"))).style(dateDT)) + , Map.entry("수정사용자", xlsx.style("MDFR_NM", center)) + ) + ); xlsx.cell(0, 0) - .value("수납", XLSWriter.Styler.CENTER) - .merge(0, 10) + .value("수납", center) + .merge(0, cellDefs.size() - 1) .cell(3, 0) - .rowValues(CmmnUtil.mergeListByIndex(titles, headerStylers)); - - List list = rcvmtService.getRcvmtList(req.setFetchSize(0)); - - BiFunction getValue = (titleNm, nothing) -> { - switch (titleNm) { - case "업무구분" : return xlsx.style("TASK_SE_NM", center); - case "수납입력구분" : return xlsx.style("RCVMT_INPT_SE_NM", center); - case "수납취소" : return xlsx.style("RCVMT_RTRCN_NM", center); - case "회계연도" : return xlsx.style("FYR", center); - case "회계구분" : return xlsx.style("ACNTG_SE_CD", center); - case "세목코드" : return xlsx.style("TXITM_CD", center); - case "세목명" : return "TXITM_NM"; - case "부과번호" : return xlsx.style("LEVY_NO", center); - case "수납일련번호" : return xlsx.style("RCVMT_SN", center); - case "소인일자" : return xlsx.format(o -> xlsx.str2date(o.get("PSTMRK_YMD"))).style(dateYMD); - case "회계일자" : return xlsx.format(o -> xlsx.str2date(o.get("ACNTG_YMD"))).style(dateYMD); - case "수납일자" : return xlsx.format(o -> xlsx.str2date(o.get("RCVMT_YMD"))).style(dateYMD); - case "수납금액" : return xlsx.style("RCVMT_AMT", numeric); - case "수납본세" : return xlsx.style("RCVMT_PCPTAX", numeric); - case "수납가산금" : return xlsx.style("RCVMT_ADAMT", numeric); - case "수납이자" : return xlsx.style("RCVMT_INT", numeric); - case "수납은행" : return "RCVMT_BANK_NM"; - case "납부방법" : return "PAY_MTHD_SE_NM"; - case "수납구분" : return xlsx.style("RCVMT_SE_NM", center); - case "수납상태" : return xlsx.style("RCVMT_STTS_NM", center); - case "부과일자" : return xlsx.format(o -> xlsx.str2date(o.get("LEVY_YMD"))).style(dateYMD); - case "최초납기일자" : return xlsx.format(o -> xlsx.str2date(o.get("FRST_DUDT_YMD"))).style(dateYMD); - case "납기일자" : return xlsx.format(o -> xlsx.str2date(o.get("DUDT_YMD"))).style(dateYMD); - case "부과본세" : return xlsx.style("LEVY_PCPTAX", numeric); - case "부과가산금" : return xlsx.style("LEVY_ADAMT", numeric); - case "분납이자" : return xlsx.style("INSPY_INT", numeric); - case "압류일자" : return xlsx.format(o -> xlsx.str2date(o.get("SZR_YMD"))).style(dateYMD); - case "압류물건" : return "SZR_THING"; - case "대체압류차량" : return "RPM_SZR_VHRNO"; - case "압류해제일자" : return xlsx.format(o -> xlsx.str2date(o.get("SZR_RMV_YMD"))).style(dateYMD); - case "단속일시" : return xlsx.format(o -> xlsx.str2datetime(o.get("CRDN_YMD_TM"))).style(dateDT); - case "차량번호" : return "VHRNO"; - case "법정동" : return "CRDN_STDG_NM"; - case "단속장소" : return "CRDN_PLC"; - case "처리상태" : return "CRDN_STTS_NM"; - case "납부자명" : return "RTPYR_NM"; - case "납부자생일" : return xlsx.style("RTPYR_BRDT_MASK", center); - case "등록일시" : return xlsx.format(o -> xlsx.str2datetime(o.get("REG_DT"))).style(dateDT); - case "등록사용자" : return xlsx.style("RGTR_NM", center); - case "수정일시" : return xlsx.format(o -> xlsx.str2datetime(o.get("MDFCN_DT"))).style(dateDT); - case "수정사용자" : return xlsx.style("MDFR_NM", center); - } - - return ""; - }; - - xlsx.cell(4, 0) - .values(list, titles.stream().map((item) -> { return getValue.apply(item, null); }).toArray()); + .rowValues(CellDef.header(cellDefs, () -> CmmnUtil.headerStyle(xlsx))) + .cell(4, 0) + .values(list, CellDef.values(cellDefs)); return new ModelAndView("xlsView") .addObject("xls", xlsx); diff --git a/src/main/resources/sql/mapper/fims/rcvm/rcvmt-mapper.xml b/src/main/resources/sql/mapper/fims/rcvm/rcvmt-mapper.xml index b25ac510..b4f1426c 100644 --- a/src/main/resources/sql/mapper/fims/rcvm/rcvmt-mapper.xml +++ b/src/main/resources/sql/mapper/fims/rcvm/rcvmt-mapper.xml @@ -13,6 +13,7 @@ + @@ -48,41 +49,42 @@ - - SELECT R.RCVMT_ID /* 수납 ID */ - , R.SGG_CD /* 시군구 코드 */ - , R.TASK_SE_CD /* 업무 구분 코드 */ - , R.RCVMT_INPT_SE_CD /* 수납 입력 구분 코드 */ - , R.FYR /* 회계연도 */ - , R.ACNTG_SE_CD /* 회계 구분 코드 */ - , R.TXITM_CD /* 세목 코드 */ - , R.LEVY_NO /* 부과 번호 */ - , R.INSPY_SN /* 분납 일련번호 */ - , R.LAST_PCPTAX /* 최종 본세 */ - , R.LAST_ADAMT /* 최종 가산금 */ - , R.RCVMT_SN /* 수납 일련번호 */ - , R.RCVMT_YMD /* 수납 일자 */ - , R.RCVMT_AMT /* 수납 금액 */ - , R.RCVMT_PCPTAX /* 수납 본세 */ - , R.RCVMT_ADAMT /* 수납 가산금 */ - , R.RCVMT_INT /* 수납 이자 */ - , R.RCVMT_BANK_NM /* 수납 은행 명 */ - , R.PAY_MTHD_SE_CD /* 납부 방법 구분 코드 */ - , R.PSTMRK_YMD /* 소인 일자 */ - , R.ACNTG_YMD /* 회계 일자 */ - , R.VRACTNO /* 가상계좌번호 */ - , R.EPAYNO /* 전자납부번호 */ - , R.RCVMT_SE_CD /* 수납 구분 코드 */ - , R.NXRP_LEVY_KEY /* 세외수입 부과 키 */ - , R.RCVMT_RTRCN_YN /* 수납 취소 여부 */ - , R.RCVMT_RTRCN_DT /* 수납 취소 일시 */ - , R.RCVMT_RTRCN_RSN /* 수납 취소 사유 */ - , R.RCVMT_STTS_CD /* 수납 상태 코드 */ - , R.DEL_YN /* 삭제 여부 */ - , R.REG_DT /* 등록 일시 */ - , R.MDFCN_DT /* 수정 일시 */ - , R.DEL_DT /* 삭제 일시 */ - , R.DEL_RSN /* 삭제 사유 */ + + SELECT R.RCVMT_ID /* 수납 ID */ + , R.SGG_CD /* 시군구 코드 */ + , R.TASK_SE_CD /* 업무 구분 코드 */ + , R.RCVMT_INPT_SE_CD /* 수납 입력 구분 코드 */ + , R.DEPT_CD /* 부서 코드 */ + , R.FYR /* 회계연도 */ + , R.ACNTG_SE_CD /* 회계 구분 코드 */ + , R.TXITM_CD /* 세목 코드 */ + , R.LEVY_NO /* 부과 번호 */ + , R.INSPY_SN /* 분납 일련번호 */ + , R.LAST_PCPTAX /* 최종 본세 */ + , R.LAST_ADAMT /* 최종 가산금 */ + , R.RCVMT_SN /* 수납 일련번호 */ + , R.RCVMT_YMD /* 수납 일자 */ + , R.RCVMT_AMT /* 수납 금액 */ + , R.RCVMT_PCPTAX /* 수납 본세 */ + , R.RCVMT_ADAMT /* 수납 가산금 */ + , R.RCVMT_INT /* 수납 이자 */ + , R.RCVMT_BANK_NM /* 수납 은행 명 */ + , R.PAY_MTHD_SE_CD /* 납부 방법 구분 코드 */ + , R.PSTMRK_YMD /* 소인 일자 */ + , R.ACNTG_YMD /* 회계 일자 */ + , R.VRACTNO /* 가상계좌번호 */ + , R.EPAYNO /* 전자납부번호 */ + , R.RCVMT_SE_CD /* 수납 구분 코드 */ + , R.NXRP_LEVY_KEY /* 세외수입 부과 키 */ + , R.RCVMT_RTRCN_YN /* 수납 취소 여부 */ + , R.RCVMT_RTRCN_DT /* 수납 취소 일시 */ + , R.RCVMT_RTRCN_RSN /* 수납 취소 사유 */ + , R.RCVMT_STTS_CD /* 수납 상태 코드 */ + , R.DEL_YN /* 삭제 여부 */ + , R.REG_DT /* 등록 일시 */ + , R.MDFCN_DT /* 수정 일시 */ + , R.DEL_DT /* 삭제 일시 */ + , R.DEL_RSN /* 삭제 사유 */ , (SELECT GET_CODE_NM('FIM054', R.TASK_SE_CD) FROM DUAL) AS TASK_SE_NM /* 업무 구분 명 */ , (SELECT GET_CODE_NM('FIM044', R.RCVMT_INPT_SE_CD) FROM DUAL) AS RCVMT_INPT_SE_NM /* 수납 입력 구분 명 */ , (SELECT GET_CODE_NM('FIM074', R.ACNTG_SE_CD) FROM DUAL) AS ACNTG_SE_NM /* 회계 구분 명 */ @@ -94,49 +96,49 @@ , (SELECT USER_NM FROM TB_USER X WHERE X.USER_ID = R.RGTR) AS RGTR_NM /* 등록자 명 */ , (SELECT USER_NM FROM TB_USER X WHERE X.USER_ID = R.MDFR) AS MDFR_NM /* 수정자 명 */ , (SELECT USER_NM FROM TB_USER X WHERE X.USER_ID = R.DLTR) AS DLTR_NM /* 삭제자 명 */ - , L.LEVY_ID /* 부과 ID */ - , L.LEVY_YMD /* 부과 일자 */ - , L.FRST_DUDT_YMD /* 최초 납기 일자 */ - , L.DUDT_YMD /* 납기 일자 */ - , L.FFNLG_AMT /* 과태료 금액 */ - , L.LEVY_PCPTAX /* 부과 본세 */ - , L.LEVY_ADAMT /* 부과 가산금 */ - , L.INSPY_INT /* 분납 이자 */ - , L.SZR_YMD /* 압류 일자 */ - , L.SZR_THING /* 압류 물건 */ - , L.RPM_SZR_VHRNO /* 대체 압류 자동차등록번호 */ - , L.SZR_RMV_YMD /* 압류 해제 일자 */ - , L.SZR_RMV_RSN /* 압류 해제 사유 */ - , C.CRDN_ID /* 단속 ID */ - , C.CRDN_YMD /* 단속 일자 */ - , C.CRDN_TM /* 단속 시각 */ - , C.VHRNO /* 차량번호 */ - , C.CRDN_STDG_NM /* 단속 법정동 명 */ - , C.CRDN_ROAD_NM /* 단속 도로 명 */ - , C.CRDN_PLC /* 단속 장소 */ - , C.CRDN_STTS_CD /* 단속 상태 코드 */ - , C.CRDN_STTS_CHG_DT /* 단속 상태 변경 일시 */ + , L.LEVY_ID /* 부과 ID */ + , L.LEVY_YMD /* 부과 일자 */ + , L.FRST_DUDT_YMD /* 최초 납기 일자 */ + , L.DUDT_YMD /* 납기 일자 */ + , L.FFNLG_AMT /* 과태료 금액 */ + , L.LEVY_PCPTAX /* 부과 본세 */ + , L.LEVY_ADAMT /* 부과 가산금 */ + , L.INSPY_INT /* 분납 이자 */ + , L.SZR_YMD /* 압류 일자 */ + , L.SZR_THING /* 압류 물건 */ + , L.RPM_SZR_VHRNO /* 대체 압류 자동차등록번호 */ + , L.SZR_RMV_YMD /* 압류 해제 일자 */ + , L.SZR_RMV_RSN /* 압류 해제 사유 */ + , C.CRDN_ID /* 단속 ID */ + , C.CRDN_YMD /* 단속 일자 */ + , C.CRDN_TM /* 단속 시각 */ + , C.VHRNO /* 차량번호 */ + , C.CRDN_STDG_NM /* 단속 법정동 명 */ + , C.CRDN_ROAD_NM /* 단속 도로 명 */ + , C.CRDN_PLC /* 단속 장소 */ + , C.CRDN_STTS_CD /* 단속 상태 코드 */ + , C.CRDN_STTS_CHG_DT /* 단속 상태 변경 일시 */ , (CONCAT(C.CRDN_YMD, C.CRDN_TM)) AS CRDN_YMD_TM /* 단속 일시 */ , (SELECT GET_CODE_NM('FIM010', C.CRDN_STTS_CD) FROM DUAL) AS CRDN_STTS_NM /* 단속 상태 명 */ - , P.RTPYR_ID /* 납부자 ID */ - , P.RTPYR_SE_CD /* 납부자 구분 코드 */ - , P.RTPYR_NO /* 납부자 번호 */ - , P.RTPYR_NM /* 납부자 명 */ - , P.RTPYR_BRDT /* 납부자 생년월일 */ - , P.ZIP /* 우편번호 */ - , P.ADDR /* 주소 */ - , P.DTL_ADDR /* 상세 주소 */ + , P.RTPYR_ID /* 납부자 ID */ + , P.RTPYR_SE_CD /* 납부자 구분 코드 */ + , P.RTPYR_NO /* 납부자 번호 */ + , P.RTPYR_NM /* 납부자 명 */ + , P.RTPYR_BRDT /* 납부자 생년월일 */ + , P.ZIP /* 우편번호 */ + , P.ADDR /* 주소 */ + , P.DTL_ADDR /* 상세 주소 */ , (SELECT GET_CODE_NM('FIM011', P.RTPYR_SE_CD) FROM DUAL) AS RTPYR_SE_NM /* 납부자 구분 명 */ , (SELECT GET_BRDT_FORMAT(P.RTPYR_BRDT, '.') FROM DUAL) AS RTPYR_BRDT_MASK /* 납부자 생년월일 마스크 */ FROM TB_RCVMT R - INNER JOIN TB_LEVY L ON (R.LEVY_ID = L.LEVY_ID) - INNER JOIN TB_CRDN C ON (L.CRDN_ID = C.CRDN_ID) + LEFT OUTER JOIN TB_LEVY L ON (R.LEVY_ID = L.LEVY_ID) + LEFT OUTER JOIN TB_CRDN C ON (L.CRDN_ID = C.CRDN_ID) LEFT OUTER JOIN TB_PAYER P ON (C.RTPYR_ID = P.RTPYR_ID) + + SELECT R.RCVMT_ID /* 수납 ID */ + , R.SGG_CD /* 시군구 코드 */ + , R.TASK_SE_CD /* 업무 구분 코드 */ + , R.RCVMT_INPT_SE_CD /* 수납 입력 구분 코드 */ + , R.DEPT_CD /* 부서 코드 */ + , R.FYR /* 회계연도 */ + , R.ACNTG_SE_CD /* 회계 구분 코드 */ + , R.TXITM_CD /* 세목 코드 */ + , R.LEVY_NO /* 부과 번호 */ + , R.INSPY_SN /* 분납 일련번호 */ + , R.LAST_PCPTAX /* 최종 본세 */ + , R.LAST_ADAMT /* 최종 가산금 */ + , R.RCVMT_SN /* 수납 일련번호 */ + , R.RCVMT_YMD /* 수납 일자 */ + , R.RCVMT_AMT /* 수납 금액 */ + , R.RCVMT_PCPTAX /* 수납 본세 */ + , R.RCVMT_ADAMT /* 수납 가산금 */ + , R.RCVMT_INT /* 수납 이자 */ + , R.RCVMT_BANK_NM /* 수납 은행 명 */ + , R.PAY_MTHD_SE_CD /* 납부 방법 구분 코드 */ + , R.PSTMRK_YMD /* 소인 일자 */ + , R.ACNTG_YMD /* 회계 일자 */ + , R.VRACTNO /* 가상계좌번호 */ + , R.EPAYNO /* 전자납부번호 */ + , R.RCVMT_SE_CD /* 수납 구분 코드 */ + , R.NXRP_LEVY_KEY /* 세외수입 부과 키 */ + , R.RCVMT_RTRCN_YN /* 수납 취소 여부 */ + , R.RCVMT_RTRCN_DT /* 수납 취소 일시 */ + , R.RCVMT_RTRCN_RSN /* 수납 취소 사유 */ + , R.RCVMT_STTS_CD /* 수납 상태 코드 */ + , R.DEL_YN /* 삭제 여부 */ + , R.REG_DT /* 등록 일시 */ + , R.MDFCN_DT /* 수정 일시 */ + , R.DEL_DT /* 삭제 일시 */ + , R.DEL_RSN /* 삭제 사유 */ + , (SELECT GET_CODE_NM('FIM054', R.TASK_SE_CD) FROM DUAL) AS TASK_SE_NM /* 업무 구분 명 */ + , (SELECT GET_CODE_NM('FIM044', R.RCVMT_INPT_SE_CD) FROM DUAL) AS RCVMT_INPT_SE_NM /* 수납 입력 구분 명 */ + , (SELECT GET_CODE_NM('FIM074', R.ACNTG_SE_CD) FROM DUAL) AS ACNTG_SE_NM /* 회계 구분 명 */ + , (SELECT GET_CODE_NM('FIM075', R.TXITM_CD) FROM DUAL) AS TXITM_NM /* 세목 코드 명 */ + , (SELECT GET_CODE_NM('FIM045', R.PAY_MTHD_SE_CD) FROM DUAL) AS PAY_MTHD_SE_NM /* 납부 방법 구분 명 */ + , (SELECT GET_CODE_NM('FIM041', R.RCVMT_SE_CD) FROM DUAL) AS RCVMT_SE_NM /* 수납 구분 명 */ + , (SELECT GET_CODE_NM('CMM005', R.RCVMT_RTRCN_YN) FROM DUAL) AS RCVMT_RTRCN_NM /* 수납 취소 여부 명 */ + , (SELECT GET_CODE_NM('FIM020', R.RCVMT_STTS_CD) FROM DUAL) AS RCVMT_STTS_NM /* 수납 상태 명 */ + , (SELECT USER_NM FROM TB_USER X WHERE X.USER_ID = R.RGTR) AS RGTR_NM /* 등록자 명 */ + , (SELECT USER_NM FROM TB_USER X WHERE X.USER_ID = R.MDFR) AS MDFR_NM /* 수정자 명 */ + , (SELECT USER_NM FROM TB_USER X WHERE X.USER_ID = R.DLTR) AS DLTR_NM /* 삭제자 명 */ + , L.LEVY_ID /* 부과 ID */ + , C.CRDN_ID /* 단속 ID */ + FROM TB_RCVMT R + LEFT OUTER JOIN TB_LEVY L ON (R.LEVY_ID = L.LEVY_ID) + LEFT OUTER JOIN TB_CRDN C ON (L.CRDN_ID = C.CRDN_ID) + +