From d5ae09274d1d40380ab067dc2d4fa85b5de449ea Mon Sep 17 00:00:00 2001 From: thkim Date: Wed, 24 Dec 2025 17:58:22 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=EB=B0=9C=EC=A3=BC=EA=B8=B0=EA=B4=80=20?= =?UTF-8?q?=EB=A1=9C=EA=B7=B8=EC=9D=B8=20=EB=82=B4=EC=97=AD=20=EC=97=91?= =?UTF-8?q?=EC=85=80=20=EB=8B=A4=EC=9A=B4=EB=A1=9C=EB=93=9C=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- admin_list.txt | 4 +- ...nstructionProjectManagementController.java | 50 +++++++- .../user/service/GeneralUserMngMapper.java | 2 +- .../user/service/GeneralUserMngService.java | 2 +- .../impl/GeneralUserMngServiceImpl.java | 2 +- .../geoinfo/util/ExcelMergeHeaderUtil.java | 107 ++++++++++++++++++ .../construction-user-login-history.jsp | 32 ++++++ 7 files changed, 192 insertions(+), 7 deletions(-) diff --git a/admin_list.txt b/admin_list.txt index 2a57f21..5d5589a 100644 --- a/admin_list.txt +++ b/admin_list.txt @@ -1,3 +1 @@ -#게시판 - 자료실에 파일 업로드 안 되는 문제 수정 건 -src\main\webapp\WEB-INF\views\admins\constructionProjectManagement\construction-project-statistics-index.jsp -src\main\resources\geoinfo\sqlmap\mappers\admins\constructionProjectManagement\ConstructionProjectManagementMapper.xml \ No newline at end of file +src\main\webapp\WEB-INF\views\admins\constructionProjectManagement\construction-user-login-history.jsp diff --git a/src/main/java/geoinfo/admins/constructionProjectManagement/ConstructionProjectManagementController.java b/src/main/java/geoinfo/admins/constructionProjectManagement/ConstructionProjectManagementController.java index df79d89..bf2de49 100644 --- a/src/main/java/geoinfo/admins/constructionProjectManagement/ConstructionProjectManagementController.java +++ b/src/main/java/geoinfo/admins/constructionProjectManagement/ConstructionProjectManagementController.java @@ -896,7 +896,7 @@ public class ConstructionProjectManagementController { params.put("firstRecordIndex", paginationInfo.getFirstRecordIndex()); params.put("recordCountPerPage", paginationInfo.getRecordCountPerPage()); - List resultList = masterService.selectUserLoginHistory(params); + List resultList = masterService.selectUserLoginHistory(params); int totalCnt = resultList.size() == 0 ? 0 : Integer.valueOf(((EgovMap) resultList.get(0)).get("totalrows").toString()); paginationInfo.setTotalRecordCount(totalCnt); @@ -925,5 +925,53 @@ public class ConstructionProjectManagementController { ServletOutputStream myOut = response.getOutputStream(); workbook.write(myOut); // 파일 저장 } + + /** + * 발주기관 건설현장 CSV 다운로드 처리 + * @param workbook + * @param request + * @param response + * @throws Exception + */ + @RequestMapping(value = "admins/constructionProjectManagement/excel.do") + public void constructionProjectManagementExcel(HttpServletRequest request, HttpServletResponse response, HSSFWorkbook workbook, @RequestParam HashMap params) throws Exception { + + HashMap map = new HashMap(); + + String[] headers = {"num","userid","userName","companyName","datetime","note"}; + String[] headerNames = {"번호", "아이디", "이름", "소속", "로그인일시", "로그인여부"}; + + final int[] headerWidths = {1325, 15900, 4240, 6360, 5830, 8830, 6890, 2915, 3710, 5035, 2915, 3710}; + String[] columnType = {"String", "String", "String", "String", "String", "String"}; + String sheetName = "발주기관 로그인 내역"; + + String excelFileName = "국토지반_발주기관_로그인_내역"; + +// int startIndex = 0; + Long totalCount = 0L; + // DB 조회 + /** pageing */ + PaginationInfo paginationInfo = new PaginationInfo(); + + if (params.get("pageIndex") == null || "".equals(params.get("pageIndex"))) { + paginationInfo.setCurrentPageNo(1); + params.put("pageIndex", 1); + } else { + paginationInfo.setCurrentPageNo(Integer.valueOf((String) params.get("pageIndex"))); + } + + paginationInfo.setRecordCountPerPage(10); + paginationInfo.setPageSize(10); + + params.put("firstRecordIndex", paginationInfo.getFirstRecordIndex()); + params.put("recordCountPerPage", paginationInfo.getRecordCountPerPage()); + + List resultList = masterService.selectUserLoginHistory(params); + + int totalCnt = resultList.size() == 0 ? 0 : Integer.valueOf(((EgovMap) resultList.get(0)).get("totalrows").toString()); + paginationInfo.setTotalRecordCount(totalCnt); + + ExcelMergeHeaderUtil.listToExcelMergeHeaderForLoginHistory(resultList, response, headers, headerNames, headerWidths, columnType, sheetName, excelFileName); + } } \ No newline at end of file diff --git a/src/main/java/geoinfo/admins/user/service/GeneralUserMngMapper.java b/src/main/java/geoinfo/admins/user/service/GeneralUserMngMapper.java index 62b548e..8181310 100644 --- a/src/main/java/geoinfo/admins/user/service/GeneralUserMngMapper.java +++ b/src/main/java/geoinfo/admins/user/service/GeneralUserMngMapper.java @@ -48,7 +48,7 @@ public interface GeneralUserMngMapper { public void updateUserPassInfo(HashMap params) throws Exception; - public List selectUserLoginHistory(HashMap params) throws Exception; + public List selectUserLoginHistory(HashMap params) throws Exception; String findProjectMasterCompanyNameByUserid(String userId); } diff --git a/src/main/java/geoinfo/admins/user/service/GeneralUserMngService.java b/src/main/java/geoinfo/admins/user/service/GeneralUserMngService.java index c4a9743..04d620e 100644 --- a/src/main/java/geoinfo/admins/user/service/GeneralUserMngService.java +++ b/src/main/java/geoinfo/admins/user/service/GeneralUserMngService.java @@ -46,6 +46,6 @@ public interface GeneralUserMngService { public void updateUserPassInfo(HashMap params) throws Exception; - public List selectUserLoginHistory(HashMap params) throws Exception; + public List selectUserLoginHistory(HashMap params) throws Exception; } diff --git a/src/main/java/geoinfo/admins/user/service/impl/GeneralUserMngServiceImpl.java b/src/main/java/geoinfo/admins/user/service/impl/GeneralUserMngServiceImpl.java index 789e367..70a8ec3 100644 --- a/src/main/java/geoinfo/admins/user/service/impl/GeneralUserMngServiceImpl.java +++ b/src/main/java/geoinfo/admins/user/service/impl/GeneralUserMngServiceImpl.java @@ -114,7 +114,7 @@ public class GeneralUserMngServiceImpl implements GeneralUserMngService { } @Override - public List selectUserLoginHistory(HashMap params) throws Exception { + public List selectUserLoginHistory(HashMap params) throws Exception { return masterMapper.selectUserLoginHistory(params); } diff --git a/src/main/java/geoinfo/util/ExcelMergeHeaderUtil.java b/src/main/java/geoinfo/util/ExcelMergeHeaderUtil.java index 01f5c53..e8aaa73 100644 --- a/src/main/java/geoinfo/util/ExcelMergeHeaderUtil.java +++ b/src/main/java/geoinfo/util/ExcelMergeHeaderUtil.java @@ -544,5 +544,112 @@ public class ExcelMergeHeaderUtil { String formattedDate = localDateTime.toLocalDate().format(formatter); return formattedDate; } + + + public static void listToExcelMergeHeaderForLoginHistory(List list, HttpServletResponse response, String[] headers, String[] headerNames, int[] headerWidths, String[] columnType, String sheetName, String excelFileName) throws IOException { + if(ExcelMergeHeaderUtil.isNotEmpty(list)) { + // 메모리에 100개의 행을 유지합니다. 행의 수가 넘으면 디스크에 적습니다. + XSSFWorkbook wb = new XSSFWorkbook(); + Sheet sheet = wb.createSheet(sheetName); + Row headerRow = sheet.createRow(headerNames.length); + CellStyle cellStyle1 = wb.createCellStyle(); //쉼표들어간 숫자 양식 + CellStyle cellStyle2 = wb.createCellStyle(); //숫자양식 + CellStyle headerStyle = wb.createCellStyle(); //헤더 스타일 + CellStyle borderStyle = wb.createCellStyle(); // 기본 검정 테두리 스타일 + + // 기본 검정 테두리 스타일 설정 + borderStyle.setBorderTop(BorderStyle.THIN); + borderStyle.setBorderBottom(BorderStyle.THIN); + borderStyle.setBorderLeft(BorderStyle.THIN); + borderStyle.setBorderRight(BorderStyle.THIN); + + // 글꼴 색상 흰색으로 설정 + Font headerFont = wb.createFont(); + headerFont.setColor(IndexedColors.WHITE.getIndex()); // 글씨 색상 흰색 + headerStyle.setFont(headerFont); // 헤더 스타일에 적용 + + XSSFDataFormat format = wb.createDataFormat(); + cellStyle1.setDataFormat(format.getFormat("#,##0")); + cellStyle2.setDataFormat(format.getFormat("#")); + headerStyle.setBorderTop(BorderStyle.THIN); + headerStyle.setBorderBottom(BorderStyle.THIN); + headerStyle.setBorderLeft(BorderStyle.THIN); + headerStyle.setBorderRight(BorderStyle.THIN); + headerStyle.setAlignment(HorizontalAlignment.CENTER); + headerStyle.setVerticalAlignment(VerticalAlignment.CENTER); + headerStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); +// headerStyle.setFillForegroundColor((short)3); + headerStyle.setFillForegroundColor(IndexedColors.GREY_40_PERCENT.getIndex()); + + // 바디 스타일 + CellStyle bodyStyle = wb.createCellStyle(); + bodyStyle.setAlignment(HorizontalAlignment.CENTER); + // ---------- 헤더구성 ------------------------------------ + Row hRow = null; + // rows + int rowCnt = 0; + + // 헤더 정보 구성 + hRow = sheet.createRow(rowCnt++); + for (int i = 0; i < headerNames.length; i++) { + Cell cell = headerRow.createCell(i); + cell = hRow.createCell(i); + cell.setCellStyle(headerStyle); + cell.setCellValue(headerNames[i]); + sheet.setColumnWidth(i, (sheet.getColumnWidth(i)) + 1000); + sheet.setColumnWidth(i, headerWidths[i]); + } + + // ---------- 헤더구성 끝------------------------------------ + + for (int i = 0; i < list.size(); i++) { + EgovMap rowData = list.get(i); + Row row = sheet.createRow(i + 1); + + for (int j = 0; j < headers.length; j++) { + Cell cell = row.createCell(j); + + Object value = rowData.get(headers[j]); + + // Money 타입 + if ("Money".equalsIgnoreCase(columnType[j])) { + if (value instanceof Number) { + cell.setCellValue(((Number) value).doubleValue()); + } else { + cell.setCellValue(0); + } + cell.setCellStyle(cellStyle1); + + // Int 타입 + } else if ("Int".equalsIgnoreCase(columnType[j])) { + if (value instanceof Number) { + cell.setCellValue(((Number) value).doubleValue()); + } else { + cell.setCellValue(0); + } + cell.setCellStyle(cellStyle2); + + // String 타입 + } else { + cell.setCellValue(value == null ? "" : String.valueOf(value)); + } + // 검정 테두리 적용 + cell.setCellStyle(borderStyle); + } + } + + //엑셀이름 한글깨짐방지 + String outputFileName = new String(excelFileName.getBytes("KSC5601"), "8859_1"); + + response.setHeader("Set-Cookie", "fileDownload=true; path=/"); + response.setHeader("Content-Disposition", String.format("attachment; filename=\""+outputFileName+"_"+ExcelMergeHeaderUtil.getTimeStampString("yyyyMMdd_HHmm")+".xlsx\"")); + + wb.write(response.getOutputStream()); + wb.close(); + } else { + createNoDataAlert(response); + } + + } } diff --git a/src/main/webapp/WEB-INF/views/admins/constructionProjectManagement/construction-user-login-history.jsp b/src/main/webapp/WEB-INF/views/admins/constructionProjectManagement/construction-user-login-history.jsp index e002fd0..b701bdd 100644 --- a/src/main/webapp/WEB-INF/views/admins/constructionProjectManagement/construction-user-login-history.jsp +++ b/src/main/webapp/WEB-INF/views/admins/constructionProjectManagement/construction-user-login-history.jsp @@ -93,6 +93,33 @@ $(function(){ searchTitle = searchTitle == "" ? "0" : searchTitle; $("#searchTitle").val(searchTitle); }); + + + + // 엑셀 다운로드 + function clickExcelDownload(){ + const params = new URLSearchParams(); + + params.append("constTag", ""); + params.append("constName", ""); + params.append("constStartDate", ""); + params.append("constEndDate", ""); + params.append("constStateCode", ""); + params.append("projectStateCode", ""); + params.append("constCompanyName", ""); + params.append("constCompanyAdmin", ""); + params.append("constCompanyTel", ""); + params.append("excelDownload", "Y"); + + // 페이지 정보 + const pagingEle = document.getElementById('paging'); + params.append("nPage", "0"); + params.append("nCount", "10000"); + + // AJAX가 아닌 직접 다운로드 요청 + window.location.href = "/admins/constructionProjectManagement/excel.do?" + params.toString(); + $('#excelDownload').val(""); + } @@ -143,6 +170,11 @@ $(function(){ + +
+ +
+