From 8b6bdc1d51002d051a9e85ebe9481230c0b42d10 Mon Sep 17 00:00:00 2001 From: jiHyung Date: Fri, 21 Oct 2022 15:04:10 +0900 Subject: [PATCH] =?UTF-8?q?=EC=97=91=EC=85=80=20=EA=B3=B5=ED=86=B5?= =?UTF-8?q?=EB=AA=A8=EB=93=88=20=EA=B5=AC=ED=98=84=20=EA=B5=AD=EC=A0=9C?= =?UTF-8?q?=EB=B2=94=EC=A3=84=EA=B2=80=EA=B1=B0=ED=98=84=ED=99=A9=20?= =?UTF-8?q?=EC=97=91=EC=85=80=EB=8B=A4=EC=9A=B4=EB=A1=9C=EB=93=9C=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../InternationalCrimeArrestController.java | 35 +++ .../InternationalCrimeArrestMapper.java | 5 + .../InternationalCrimeArrestService.java | 9 + src/main/java/com/dbnt/faisp/util/Excel.java | 48 ++++ src/main/java/com/dbnt/faisp/util/Utils.java | 233 +++++++++--------- .../InternationalCrimeArrestMapper.xml | 75 +++++- .../faStatistics/internationalCrimeArrest.js | 7 +- .../internationalCrimeArrest.html | 4 +- 8 files changed, 300 insertions(+), 116 deletions(-) create mode 100644 src/main/java/com/dbnt/faisp/util/Excel.java diff --git a/src/main/java/com/dbnt/faisp/faStatistics/internationalCrimeArrest/InternationalCrimeArrestController.java b/src/main/java/com/dbnt/faisp/faStatistics/internationalCrimeArrest/InternationalCrimeArrestController.java index 27594668..127c177e 100644 --- a/src/main/java/com/dbnt/faisp/faStatistics/internationalCrimeArrest/InternationalCrimeArrestController.java +++ b/src/main/java/com/dbnt/faisp/faStatistics/internationalCrimeArrest/InternationalCrimeArrestController.java @@ -9,11 +9,16 @@ import com.dbnt.faisp.faStatistics.internationalCrimeArrest.service.Internationa import com.dbnt.faisp.organMgt.model.OrganConfig; import com.dbnt.faisp.organMgt.service.OrganConfigService; import com.dbnt.faisp.userInfo.model.UserInfo; +import com.dbnt.faisp.util.Excel; +import com.dbnt.faisp.util.ParamMap; +import com.dbnt.faisp.util.Utils; import lombok.RequiredArgsConstructor; import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.web.bind.annotation.*; import org.springframework.web.servlet.ModelAndView; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; import java.time.LocalDateTime; import java.util.List; @@ -88,6 +93,36 @@ public class InternationalCrimeArrestController { return internationalCrimeArrestService.savedInternationalCrimeArrest(internationalCrimeArrest); } + @GetMapping("/internationalCrimeArrest/ExcelDown") + public void icaExcelDown(HttpServletResponse response, InternationalCrimeArrest internationalCrimeArrest) { + int duplicateCount = internationalCrimeArrestService.icaDuplicateCount(internationalCrimeArrest); + int rowCnt = internationalCrimeArrest.getRowCnt() + duplicateCount; + internationalCrimeArrest.setRowCnt(rowCnt); + internationalCrimeArrest.setQueryInfo(); + internationalCrimeArrest.setContentCnt(internationalCrimeArrestService.selectInternationalCrimeArrestListCnt(internationalCrimeArrest)); + internationalCrimeArrest.setPaginationInfo(); + + Excel excel = new Excel(); + String[] headers = {"ica_key", "case_num", "organ", "department", "crime_type", "violation_type", "crime_name", "occur_table", "arrest_table", "suspect_table", "sex", "age", "country", "crime_awareness_dt", "case_sent_dt", "process_result"}; + String[] headerNames = { "", "", "", "", "", "", "", "", "", "", "피의자 인적사항", "", "", "", "", ""}; + String[] headerNames2 = { "", "사건번호", "지방청", "경찰서", "범죄테마", "위반유형", "죄명", "발생원표", "검거원표", "피의자원표","성별","나이","국적","범죄인지","사건송치","신병처리"}; + String[] columnType = { "int", "int", "String", "String", "String", "String", "String", "String", "String", "String","String","String","String","String","String","String"}; + excel.setHeaders(headers); + excel.setHeaderNames(headerNames); + excel.setHeaderNames2(headerNames2); + excel.setColumnType(columnType); + excel.setSheetName("국제범죄검거현황"); + excel.setExcelFileName("국제범죄검거현황"); + List icaList = internationalCrimeArrestService.selectInternationalCrimeArrestParamList(internationalCrimeArrest); + excel.setList(icaList); + + try { + Utils.icaDownExcel(response, excel); + } catch (IOException e) { + + } + } + public List selectOrganList(){ List organCdList = codeMgtService.selectCodeMgtList("OG"); List organConfigList = organConfigService.selectSavedOrganList(); diff --git a/src/main/java/com/dbnt/faisp/faStatistics/internationalCrimeArrest/mapper/InternationalCrimeArrestMapper.java b/src/main/java/com/dbnt/faisp/faStatistics/internationalCrimeArrest/mapper/InternationalCrimeArrestMapper.java index 11686f6c..d27a3548 100644 --- a/src/main/java/com/dbnt/faisp/faStatistics/internationalCrimeArrest/mapper/InternationalCrimeArrestMapper.java +++ b/src/main/java/com/dbnt/faisp/faStatistics/internationalCrimeArrest/mapper/InternationalCrimeArrestMapper.java @@ -1,6 +1,8 @@ package com.dbnt.faisp.faStatistics.internationalCrimeArrest.mapper; +import com.dbnt.faisp.equip.model.Equip; import com.dbnt.faisp.faStatistics.internationalCrimeArrest.model.InternationalCrimeArrest; +import com.dbnt.faisp.util.ParamMap; import org.apache.ibatis.annotations.Mapper; import java.util.List; @@ -9,4 +11,7 @@ import java.util.List; public interface InternationalCrimeArrestMapper{ List selectInternationalCrimeArrestList(InternationalCrimeArrest internationalCrimeArrest); Integer selectInternationalCrimeArrestListCnt(InternationalCrimeArrest internationalCrimeArrest); + List selectInternationalCrimeArrestParamList(InternationalCrimeArrest internationalCrimeArrest); + List selectSuspectPersonInfoParamList(int icaKey); + Integer icaDuplicateCount(InternationalCrimeArrest internationalCrimeArrest); } diff --git a/src/main/java/com/dbnt/faisp/faStatistics/internationalCrimeArrest/service/InternationalCrimeArrestService.java b/src/main/java/com/dbnt/faisp/faStatistics/internationalCrimeArrest/service/InternationalCrimeArrestService.java index 85fc39a7..34a02955 100644 --- a/src/main/java/com/dbnt/faisp/faStatistics/internationalCrimeArrest/service/InternationalCrimeArrestService.java +++ b/src/main/java/com/dbnt/faisp/faStatistics/internationalCrimeArrest/service/InternationalCrimeArrestService.java @@ -7,6 +7,7 @@ import com.dbnt.faisp.faStatistics.internationalCrimeArrest.model.InternationalC import com.dbnt.faisp.faStatistics.internationalCrimeArrest.model.SuspectPersonInfo; import com.dbnt.faisp.faStatistics.internationalCrimeArrest.repository.InternationalCrimeArrestRepository; import com.dbnt.faisp.faStatistics.internationalCrimeArrest.repository.SuspectPersonInfoRepository; +import com.dbnt.faisp.util.ParamMap; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -24,10 +25,18 @@ public class InternationalCrimeArrestService extends BaseService { return internationalCrimeArrestMapper.selectInternationalCrimeArrestList(InternationalCrimeArrest); } + public List selectInternationalCrimeArrestParamList(InternationalCrimeArrest InternationalCrimeArrest) { + return internationalCrimeArrestMapper.selectInternationalCrimeArrestParamList(InternationalCrimeArrest); + } + public Integer selectInternationalCrimeArrestListCnt(InternationalCrimeArrest internationalCrimeArrest) { return internationalCrimeArrestMapper.selectInternationalCrimeArrestListCnt(internationalCrimeArrest); } + public Integer icaDuplicateCount(InternationalCrimeArrest internationalCrimeArrest) { + return internationalCrimeArrestMapper.icaDuplicateCount(internationalCrimeArrest); + } + public InternationalCrimeArrest selectInternationalCrimeArrest(Integer icaKey) { InternationalCrimeArrest savedInternationalCrimeArrest = internationalCrimeArrestRepository.findById(icaKey).orElse(null); if (savedInternationalCrimeArrest != null) { diff --git a/src/main/java/com/dbnt/faisp/util/Excel.java b/src/main/java/com/dbnt/faisp/util/Excel.java new file mode 100644 index 00000000..dda30032 --- /dev/null +++ b/src/main/java/com/dbnt/faisp/util/Excel.java @@ -0,0 +1,48 @@ +package com.dbnt.faisp.util; + +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; + +import java.util.List; + +@Getter +@Setter +@NoArgsConstructor +@ToString +public class Excel { + private String[] headers; + private String[] headerNames; + private String[] headerNames2; + private String[] headerNames3; + private String[] columnType; + private String sheetName; + private String excelFileName; + private List list; + private String outputFileName; + private Row row; + + private Row headerRow; + private Sheet sheet; + private CellStyle cellStyle1; //쉼표들어간 숫자 양식 + private CellStyle cellStyle2; //숫자양식 + private CellStyle headerStyle; //숫자양식 + private CellStyle headerStyle2; + private CellStyle headerStyle3; + + + public void defalutConfig(XSSFWorkbook wb){ + this.setSheet(wb.createSheet(this.sheetName)); + this.setHeaderRow(this.sheet.createRow(0)); + this.setCellStyle1(wb.createCellStyle()); + this.setCellStyle2(wb.createCellStyle()); + this.setHeaderStyle(wb.createCellStyle()); + this.setHeaderStyle2(wb.createCellStyle()); + this.setHeaderStyle3(wb.createCellStyle()); + } +} diff --git a/src/main/java/com/dbnt/faisp/util/Utils.java b/src/main/java/com/dbnt/faisp/util/Utils.java index 03c19b6c..d1c50820 100644 --- a/src/main/java/com/dbnt/faisp/util/Utils.java +++ b/src/main/java/com/dbnt/faisp/util/Utils.java @@ -166,21 +166,7 @@ public class Utils { wb.write(response.getOutputStream()); wb.close(); } else { - response.setHeader("Content-Type", "text/html; charset=UTF-8"); - PrintWriter out = response.getWriter(); - - out.write(""); - out.write(""); - out.write(""); - out.write(""); - out.write(""); - out.write(""); - - out.flush(); - out.close(); + createNoDataAlert(response); } } @@ -252,21 +238,7 @@ public class Utils { wb.write(response.getOutputStream()); wb.close(); } else { - response.setHeader("Content-Type", "text/html; charset=UTF-8"); - PrintWriter out = response.getWriter(); - - out.write(""); - out.write(""); - out.write(""); - out.write(""); - out.write(""); - out.write(""); - - out.flush(); - out.close(); + createNoDataAlert(response); } } @@ -360,21 +332,7 @@ public class Utils { wb.write(response.getOutputStream()); wb.close(); } else { - response.setHeader("Content-Type", "text/html; charset=UTF-8"); - PrintWriter out = response.getWriter(); - - out.write(""); - out.write(""); - out.write(""); - out.write(""); - out.write(""); - out.write(""); - - out.flush(); - out.close(); + createNoDataAlert(response); } } @@ -499,21 +457,7 @@ public class Utils { wb.write(response.getOutputStream()); wb.close(); } else { - response.setHeader("Content-Type", "text/html; charset=UTF-8"); - PrintWriter out = response.getWriter(); - - out.write(""); - out.write(""); - out.write(""); - out.write(""); - out.write(""); - out.write(""); - - out.flush(); - out.close(); + createNoDataAlert(response); } } @@ -612,7 +556,7 @@ public class Utils { sheet.autoSizeColumn(j); sheet.setColumnWidth(j, (sheet.getColumnWidth(j)) + 1024); } - sheet.addMergedRegion(new CellRangeAddress(0,1,0,0)); + sheet.addMergedRegion(new CellRangeAddress(0,1,0,0)); // ( 시작행, 종료행, 시작열, 종료열 ) sheet.addMergedRegion(new CellRangeAddress(0,1,1,1)); sheet.addMergedRegion(new CellRangeAddress(0,1,2,2)); sheet.addMergedRegion(new CellRangeAddress(0,0,3,8)); @@ -629,21 +573,7 @@ public class Utils { wb.write(response.getOutputStream()); wb.close(); } else { - response.setHeader("Content-Type", "text/html; charset=UTF-8"); - PrintWriter out = response.getWriter(); - - out.write(""); - out.write(""); - out.write(""); - out.write(""); - out.write(""); - out.write(""); - - out.flush(); - out.close(); + createNoDataAlert(response); } } @@ -732,21 +662,7 @@ public class Utils { wb.write(response.getOutputStream()); wb.close(); } else { - response.setHeader("Content-Type", "text/html; charset=UTF-8"); - PrintWriter out = response.getWriter(); - - out.write(""); - out.write(""); - out.write(""); - out.write(""); - out.write(""); - out.write(""); - - out.flush(); - out.close(); + createNoDataAlert(response); } } @@ -755,7 +671,7 @@ public class Utils { String[] headerNames, String[] columnType, String sheetName, String excelFileName) throws IOException { if(Utils.isNotEmpty(useExcelList)) { // 메모리에 100개의 행을 유지합니다. 행의 수가 넘으면 디스크에 적습니다. - XSSFWorkbook wb = new XSSFWorkbook(); + XSSFWorkbook wb = new XSSFWorkbook(); Sheet sheet = wb.createSheet(sheetName); Row headerRow = sheet.createRow(0); CellStyle cellStyle1 = wb.createCellStyle(); //쉼표들어간 숫자 양식 @@ -794,6 +710,7 @@ public class Utils { Row row = sheet.createRow(i+1); rowData.set("use_no", useExcelList.get(i).getUseNo()); rowData.set("sosok", useExcelList.get(i).getSosok()); + if(useExcelList.get(i).getUseDt() != null) { rowData.set("use_dt", useExcelList.get(i).getUseDt().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))); }else { @@ -842,26 +759,122 @@ public class Utils { wb.write(response.getOutputStream()); wb.close(); } else { - response.setHeader("Content-Type", "text/html; charset=UTF-8"); - PrintWriter out = response.getWriter(); - - out.write(""); - out.write(""); - out.write(""); - out.write(""); - out.write(""); - out.write(""); - - out.flush(); - out.close(); + createNoDataAlert(response); } } - - - + + public static void icaDownExcel(HttpServletResponse response, Excel excel) throws IOException { + if (Utils.isNotEmpty(excel.getList())) { + // 메모리에 100개의 행을 유지합니다. 행의 수가 넘으면 디스크에 적습니다. + XSSFWorkbook wb = new XSSFWorkbook(); + excel.defalutConfig(wb); + + XSSFDataFormat format = wb.createDataFormat(); + excel.getCellStyle1().setDataFormat(format.getFormat("#,##0")); + excel.getCellStyle2().setDataFormat(format.getFormat("#")); + excel.getHeaderStyle().setAlignment(HorizontalAlignment.CENTER); + excel.getHeaderStyle().setFillPattern(FillPatternType.SOLID_FOREGROUND); + excel.getHeaderStyle().setFillForegroundColor((short)3); + excel.getHeaderStyle().setFillForegroundColor(IndexedColors.LIME.getIndex()); + + // 헤더 생성 + createHeader(excel, excel.getHeaderNames(), excel.getHeaderStyle3(), 0); + createHeader(excel, excel.getHeaderNames2(), excel.getHeaderStyle2(), 1); + // 헤더 병합 + excel.getSheet().addMergedRegion(new CellRangeAddress(0,0,10,12)); // ( 시작행, 종료행, 시작열, 종료열 ) + + rowCreate(excel, 2, 10, 12); + + //엑셀이름 한글깨짐방지 + excelNameHangulBrokenPrevention(response, wb, excel); + } else { + // 데이터 없을 시 경고창 생성 + createNoDataAlert(response); + } + } + + private static void createNoDataAlert(HttpServletResponse response) throws IOException { + response.setHeader("Content-Type", "text/html; charset=UTF-8"); + PrintWriter out = response.getWriter(); + + out.write(""); + out.write(""); + out.write(""); + out.write(""); + out.write(""); + out.write(""); + + out.flush(); + out.close(); + } + + private static void excelNameHangulBrokenPrevention(HttpServletResponse response, XSSFWorkbook wb, Excel excel) throws IOException { + excel.setOutputFileName(new String(excel.getExcelFileName().getBytes("KSC5601"), "8859_1")); + response.setHeader("Set-Cookie", "fileDownload=true; path=/"); + response.setHeader("Content-Disposition", String.format("attachment; filename=\""+excel.getOutputFileName()+"_"+Utils.getTimeStampString("yyyyMMdd_HHmm")+".xlsx\"")); + + wb.write(response.getOutputStream()); + wb.close(); + } + + private static void createHeader(Excel excel, String[] headerNames, CellStyle headerStyle, int index) { + if (headerNames.length > 0) { + excel.setHeaderRow(excel.getSheet().createRow(index)); + for(int j=0; j< headerNames.length; j++) { + Cell cell = excel.getHeaderRow().createCell(j); + cell.setCellValue(headerNames[j]); + cell.setCellStyle(headerStyle); + excel.getSheet().autoSizeColumn(j); + excel.getSheet().setColumnWidth(j, (excel.getSheet().getColumnWidth(j)) + 1024); + } + } + } + + private static void rowCreate(Excel excel, int rownum, int startIndex, int endIndex){ + int mergeCount = 1; + boolean mergeCheck = false; + + for(int i=0; i 0 && j > 0) { + if (rowData.get(excel.getHeaders()[0]).equals(excel.getList().get(i-1).get(excel.getHeaders()[0])) && !(j >= startIndex && j <= endIndex)) { + if (i < excel.getList().size()-1 && rowData.get(excel.getHeaders()[0]).equals(excel.getList().get(i+1).get(excel.getHeaders()[0]))) { + mergeCheck = true; + } else { + excel.getSheet().addMergedRegion(new CellRangeAddress(i+rownum-mergeCount, i+rownum, j, j)); + mergeCheck = false; + } + } + } + + if(excel.getColumnType()[j].equalsIgnoreCase("Money")) { + cell.setCellValue(rowData.getInt(excel.getHeaders()[j])); + cell.setCellStyle(excel.getCellStyle1()); + } else if(excel.getColumnType()[j].equalsIgnoreCase("Int")) { + cell.setCellValue(rowData.getInt(excel.getHeaders()[j])); + cell.setCellStyle(excel.getCellStyle2()); + } else if(excel.getColumnType()[j].equalsIgnoreCase("String")) { + cell.setCellValue(rowData.getString(excel.getHeaders()[j])); + } else { + cell.setCellValue(rowData.getString(excel.getHeaders()[j])); + } + } + } + } } diff --git a/src/main/resources/mybatisMapper/InternationalCrimeArrestMapper.xml b/src/main/resources/mybatisMapper/InternationalCrimeArrestMapper.xml index 51a0ffec..15f32bc3 100644 --- a/src/main/resources/mybatisMapper/InternationalCrimeArrestMapper.xml +++ b/src/main/resources/mybatisMapper/InternationalCrimeArrestMapper.xml @@ -78,7 +78,59 @@ - + SELECT + i.ica_key, + i.occur_table, + i.arrest_table, + i.suspect_table, + i.crime_awareness_dt, + i.case_sent_dt, + i.other_crime, + i.case_num, + i.case_overview, + i.arrest_area, + i.crackdown_personel, + i.violation_amount, + i.destination, + i.content_status, + i.wrt_organ, + i.wrt_user_seq, + i.wrt_nm, + i.wrt_dt, + cm1.item_value AS organ, + cm2.item_value AS department, + cm3.item_value AS crime_type, + cm4.item_value AS violation_type, + COALESCE(cm5.item_value, i.process_result) AS process_result, + COALESCE(cm6.item_value, i.means) AS means, + cm7.item_value AS crime_form, + COALESCE(cm8.item_value, i.purpose) AS purpose, + COALESCE(cm9.item_value, i.smuggled_goods) AS smuggled_goods, + cm10.item_value AS SEX, + cm11.item_value AS age, + COALESCE(cm12.item_value, s.country) AS country + FROM international_crime_arrest i + INNER JOIN suspect_person_info s + ON i.ica_key = s.ica_key + LEFT JOIn code_mgt cm1 ON i.organ = cm1.item_cd + LEFT JOIN code_mgt cm2 ON i.department = cm2.item_cd + LEFT JOIN code_mgt cm3 ON i.crime_type = cm3.item_cd + LEFT JOIN code_mgt cm4 ON i.violation_type = cm4.item_cd + LEFT JOIN code_mgt cm5 ON i.process_result = cm5.item_cd + LEFT JOIN code_mgt cm6 ON i.means = cm6.item_cd + LEFT JOIN code_mgt cm7 ON i.crime_form = cm7.item_cd + LEFT JOIN code_mgt cm8 ON i.purpose = cm8.item_cd + LEFT JOIN code_mgt cm9 ON i.smuggled_goods = cm9.item_cd + LEFT JOIN code_mgt cm10 ON s.sex = cm10.item_cd + LEFT JOIN code_mgt cm11 ON s.age = cm11.item_cd + LEFT JOIN code_mgt cm12 ON s.country = cm12.item_cd + + ORDER BY i.ica_key DESC + LIMIT #{rowCnt} OFFSET #{firstIndex} + + + + + \ No newline at end of file diff --git a/src/main/resources/static/js/faStatistics/internationalCrimeArrest.js b/src/main/resources/static/js/faStatistics/internationalCrimeArrest.js index 1514afbe..c9717e41 100644 --- a/src/main/resources/static/js/faStatistics/internationalCrimeArrest.js +++ b/src/main/resources/static/js/faStatistics/internationalCrimeArrest.js @@ -508,4 +508,9 @@ function contentCheck(){ } return flag; -} \ No newline at end of file +} + +$(document).on('click', '#icaExcelDownBtn', function (){ + const formData = $("#icaSearchForm").serialize(); + location.href = '/faStatistics/internationalCrimeArrest/ExcelDown?'+formData; +}); diff --git a/src/main/resources/templates/faStatistics/internationalCrimeArrest/internationalCrimeArrest.html b/src/main/resources/templates/faStatistics/internationalCrimeArrest/internationalCrimeArrest.html index f6f8b2a5..d54e5004 100644 --- a/src/main/resources/templates/faStatistics/internationalCrimeArrest/internationalCrimeArrest.html +++ b/src/main/resources/templates/faStatistics/internationalCrimeArrest/internationalCrimeArrest.html @@ -18,7 +18,7 @@
-
+
@@ -187,7 +187,7 @@ - +