From b495bcc71e1b2e52bd8ebc33d64fd3ecd6e1abf1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=B0=95=EC=84=B1=EC=98=81?= Date: Wed, 15 Oct 2025 16:19:36 +0900 Subject: [PATCH] =?UTF-8?q?=EC=97=91=EC=85=80=20=EB=8B=A4=EC=9A=B4?= =?UTF-8?q?=EB=A1=9C=EB=93=9C,=20=EA=B8=B0=EB=B3=B8=20=EB=A1=9C=EC=A7=81,?= =?UTF-8?q?=20=EB=8B=A4=EC=9A=B4=EB=A1=9C=EB=93=9C=20=EB=A1=9C=EC=A7=81?= =?UTF-8?q?=EC=97=90=20=EC=A0=9C=EB=AA=A9=20=EC=B6=94=EA=B0=80=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=20=EC=98=88=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CrdnRegistAndViewController.java | 73 ++++++++++++++ .../main/model/CrdnRegistAndViewExcelVO.java | 96 +++++++++++++++++++ .../crdn/crndRegistAndView/main/list.jsp | 35 ++++++- 3 files changed, 203 insertions(+), 1 deletion(-) create mode 100644 src/main/java/go/kr/project/crdn/crndRegistAndView/main/model/CrdnRegistAndViewExcelVO.java diff --git a/src/main/java/go/kr/project/crdn/crndRegistAndView/main/controller/CrdnRegistAndViewController.java b/src/main/java/go/kr/project/crdn/crndRegistAndView/main/controller/CrdnRegistAndViewController.java index ed153f0..1f900ee 100644 --- a/src/main/java/go/kr/project/crdn/crndRegistAndView/main/controller/CrdnRegistAndViewController.java +++ b/src/main/java/go/kr/project/crdn/crndRegistAndView/main/controller/CrdnRegistAndViewController.java @@ -5,8 +5,11 @@ import egovframework.constant.TilesConstants; import egovframework.exception.MessageException; import egovframework.util.ApiResponseUtil; import egovframework.util.SessionUtil; +import egovframework.util.excel.ExcelSheetData; +import egovframework.util.excel.SxssfExcelFile; import go.kr.project.common.model.CmmnCodeSearchVO; import go.kr.project.common.service.CommonCodeService; +import go.kr.project.crdn.crndRegistAndView.main.model.CrdnRegistAndViewExcelVO; import go.kr.project.crdn.crndRegistAndView.main.model.CrdnRegistAndViewVO; import go.kr.project.crdn.crndRegistAndView.main.service.CrdnImpltTaskService; import go.kr.project.crdn.crndRegistAndView.main.service.CrdnRegistAndViewService; @@ -23,7 +26,10 @@ import org.springframework.ui.Model; import org.springframework.web.bind.annotation.*; import org.springframework.web.servlet.ModelAndView; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; import java.util.List; +import java.util.stream.Collectors; /** * packageName : go.kr.project.crdn.crndRegistAndView.controller @@ -385,4 +391,71 @@ public class CrdnRegistAndViewController { } } + /** + * 단속 목록을 엑셀 파일로 다운로드합니다. + * + * @param paramVO 검색 조건을 담은 VO 객체 + * @param request HTTP 요청 객체 + * @param response HTTP 응답 객체 + */ + @PostMapping("/excel.do") + @Operation(summary = "단속 목록 엑셀 다운로드", description = "단속 목록을 엑셀 파일로 다운로드합니다.") + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "다운로드 성공"), + @ApiResponse(responseCode = "400", description = "다운로드 실패"), + @ApiResponse(description = "오류로 인한 실패") + }) + public void downloadExcel( + @ModelAttribute CrdnRegistAndViewVO paramVO, + HttpServletRequest request, + HttpServletResponse response) { + try { + log.debug("단속 목록 엑셀 다운로드 요청"); + + // 페이징 처리 없이 전체 데이터 조회 + paramVO.setPagingYn("N"); + + // 단속 목록 조회 + List list = service.selectList(paramVO); + + // VO를 ExcelVO로 변환 + List excelList = list.stream() + .map(vo -> CrdnRegistAndViewExcelVO.builder() + .crdnYr(vo.getCrdnYr()) + .crdnNo(vo.getCrdnNo()) + .stdgEmdCdNm(vo.getStdgEmdCdNm()) + .rgnSeCdNm(vo.getRgnSeCdNm()) + .dsclMthdCdNm(vo.getDsclMthdCdNm()) + .dsclYmd(vo.getDsclYmd()) + .exmnr(vo.getExmnr()) + .relevyYn(vo.getRelevyYn()) + .agrvtnLevyTrgtYn(vo.getAgrvtnLevyTrgtYn()) + .crdnPrcsSttsCdNm(vo.getCrdnPrcsSttsCdNm()) + .actCmpltCd(vo.getActCmpltCd()) + .lotnoWholAddr(vo.getLotnoWholAddr()) + .actTypeCdNm(vo.getActTypeCdNm()) + .usgIdxCdNm(vo.getUsgIdxCdNm()) + .ownrNams(vo.getOwnrNams()) + .actrNams(vo.getActrNams()) + .dspsBfhdBgngYmd(vo.getDspsBfhdBgngYmd()) + .crcCmdBgngYmd(vo.getCrcCmdBgngYmd()) + .crcUrgBgngYmd(vo.getCrcUrgBgngYmd()) + .levyPrvntcBgngYmd(vo.getLevyPrvntcBgngYmd()) + .levyBgngYmd(vo.getLevyBgngYmd()) + .payUrgBgngYmd(vo.getPayUrgBgngYmd()) + .regDt(vo.getRegDt() != null ? vo.getRegDt().format(java.time.format.DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")) : null) + .rgtrNm(vo.getRgtrNm()) + .build()) + .collect(Collectors.toList()); + + // 엑셀 파일 생성 및 다운로드 + String filename = "단속목록_" + java.time.LocalDateTime.now().format(java.time.format.DateTimeFormatter.ofPattern("yyyyMMddHHmmss")) + ".xlsx"; + new SxssfExcelFile(ExcelSheetData.of(excelList, CrdnRegistAndViewExcelVO.class), request, response, filename); + + log.debug("단속 목록 엑셀 다운로드 완료 - 파일명: {}, 건수: {}", filename, excelList.size()); + } catch (Exception e) { + log.error("엑셀 다운로드 중 오류 발생", e); + } + } + } \ No newline at end of file diff --git a/src/main/java/go/kr/project/crdn/crndRegistAndView/main/model/CrdnRegistAndViewExcelVO.java b/src/main/java/go/kr/project/crdn/crndRegistAndView/main/model/CrdnRegistAndViewExcelVO.java new file mode 100644 index 0000000..4346f0e --- /dev/null +++ b/src/main/java/go/kr/project/crdn/crndRegistAndView/main/model/CrdnRegistAndViewExcelVO.java @@ -0,0 +1,96 @@ +package go.kr.project.crdn.crndRegistAndView.main.model; + +import egovframework.util.excel.ExcelColumn; +import lombok.*; + +/** + * packageName : go.kr.project.crdn.crndRegistAndView.main.model + * fileName : CrdnRegistAndViewExcelVO + * author : 시스템 관리자 + * date : 2025-08-25 + * description : 단속 목록 엑셀 다운로드용 VO 클래스 + * 중요한 로직 주석: 엑셀 다운로드 시 사용되는 전용 VO로 @ExcelColumn 어노테이션을 포함 + * =========================================================== + * DATE AUTHOR NOTE + * ----------------------------------------------------------- + * 2025-08-25 시스템 관리자 최초 생성 + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +@ToString +public class CrdnRegistAndViewExcelVO { + + @ExcelColumn(headerName = "단속년도") + private String crdnYr; + + @ExcelColumn(headerName = "단속번호") + private String crdnNo; + + @ExcelColumn(headerName = "법정동") + private String stdgEmdCdNm; + + @ExcelColumn(headerName = "지역구분") + private String rgnSeCdNm; + + @ExcelColumn(headerName = "적발방법") + private String dsclMthdCdNm; + + @ExcelColumn(headerName = "적발일자") + private String dsclYmd; + + @ExcelColumn(headerName = "조사원") + private String exmnr; + + @ExcelColumn(headerName = "재부과여부") + private String relevyYn; + + @ExcelColumn(headerName = "가중부과대상") + private String agrvtnLevyTrgtYn; + + @ExcelColumn(headerName = "진행단계") + private String crdnPrcsSttsCdNm; + + @ExcelColumn(headerName = "조치처리상태") + private String actCmpltCd; + + @ExcelColumn(headerName = "위치") + private String lotnoWholAddr; + + @ExcelColumn(headerName = "행위유형") + private String actTypeCdNm; + + @ExcelColumn(headerName = "용도") + private String usgIdxCdNm; + + @ExcelColumn(headerName = "소유자") + private String ownrNams; + + @ExcelColumn(headerName = "행위자") + private String actrNams; + + @ExcelColumn(headerName = "처분사전 일자") + private String dspsBfhdBgngYmd; + + @ExcelColumn(headerName = "시정명령 일자") + private String crcCmdBgngYmd; + + @ExcelColumn(headerName = "시정촉구 일자") + private String crcUrgBgngYmd; + + @ExcelColumn(headerName = "부과예고 일자") + private String levyPrvntcBgngYmd; + + @ExcelColumn(headerName = "부과 일자") + private String levyBgngYmd; + + @ExcelColumn(headerName = "납부촉구 일자") + private String payUrgBgngYmd; + + @ExcelColumn(headerName = "등록일시") + private String regDt; + + @ExcelColumn(headerName = "등록자") + private String rgtrNm; +} diff --git a/src/main/webapp/WEB-INF/views/crdn/crndRegistAndView/main/list.jsp b/src/main/webapp/WEB-INF/views/crdn/crndRegistAndView/main/list.jsp index e6a7b27..26b9265 100644 --- a/src/main/webapp/WEB-INF/views/crdn/crndRegistAndView/main/list.jsp +++ b/src/main/webapp/WEB-INF/views/crdn/crndRegistAndView/main/list.jsp @@ -12,6 +12,9 @@
+ @@ -654,6 +657,31 @@ } }, + /** + * 엑셀 다운로드 + */ + downloadExcel: function() { + setSearchCond(); + var searchParams = $.param(SEARCH_COND); + + var $form = $('
'); + $form.attr('action', ''); + $form.attr('method', 'post'); + + var params = searchParams.split('&'); + for (var i = 0; i < params.length; i++) { + var param = params[i].split('='); + var name = decodeURIComponent(param[0]); + var value = decodeURIComponent(param[1] || ''); + + $form.append($('')); + } + + $('body').append($form); + $form.submit(); + $form.remove(); + }, + /** * 단속 상태를 업데이트합니다. * 선택된 행이 있을 때만 상태를 업데이트합니다. @@ -768,11 +796,16 @@ alert('수정할 단속 건을 선택해주세요.'); return; } - + // 선택된 행의 데이터로 팝업 열기 self.openViewPopup(self.selectedRow.crdnYr, self.selectedRow.crdnNo); }); + // 엑셀 다운로드 버튼 클릭 이벤트 + $("#excelDownBtn").on('click', function() { + self.downloadExcel(); + }); + // 이행정보 관리 팝업 호출 이벤트들 - "처분사전" 버튼 $("#btnDsps").on('click', function() { if (!self.selectedRow) {