Compare commits

...

2 Commits

Author SHA1 Message Date
jiHyung bf06615c2f Merge branch 'master' of http://118.219.150.34:50501/DBNT/FAISP 2022-10-21 15:04:14 +09:00
jiHyung 8b6bdc1d51 엑셀 공통모듈 구현
국제범죄검거현황 엑셀다운로드 구현
2022-10-21 15:04:10 +09:00
8 changed files with 300 additions and 116 deletions

View File

@ -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<ParamMap> icaList = internationalCrimeArrestService.selectInternationalCrimeArrestParamList(internationalCrimeArrest);
excel.setList(icaList);
try {
Utils.icaDownExcel(response, excel);
} catch (IOException e) {
}
}
public List<OrganConfig> selectOrganList(){
List<CodeMgt> organCdList = codeMgtService.selectCodeMgtList("OG");
List<OrganConfig> organConfigList = organConfigService.selectSavedOrganList();

View File

@ -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<InternationalCrimeArrest> selectInternationalCrimeArrestList(InternationalCrimeArrest internationalCrimeArrest);
Integer selectInternationalCrimeArrestListCnt(InternationalCrimeArrest internationalCrimeArrest);
List<ParamMap> selectInternationalCrimeArrestParamList(InternationalCrimeArrest internationalCrimeArrest);
List<ParamMap> selectSuspectPersonInfoParamList(int icaKey);
Integer icaDuplicateCount(InternationalCrimeArrest internationalCrimeArrest);
}

View File

@ -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<ParamMap> 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) {

View File

@ -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<ParamMap> 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());
}
}

View File

@ -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("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">");
out.write("<html lang=\"ko\">");
out.write("<head>");
out.write("<script type=\"text/javascript\">");
out.write("alert('데이터가 없습니다.');");
out.write("history.back(-1);");
out.write("</script>");
out.write("</head>");
out.write("</html>");
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("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">");
out.write("<html lang=\"ko\">");
out.write("<head>");
out.write("<script type=\"text/javascript\">");
out.write("alert('데이터가 없습니다.');");
out.write("history.back(-1);");
out.write("</script>");
out.write("</head>");
out.write("</html>");
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("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">");
out.write("<html lang=\"ko\">");
out.write("<head>");
out.write("<script type=\"text/javascript\">");
out.write("alert('데이터가 없습니다.');");
out.write("history.back(-1);");
out.write("</script>");
out.write("</head>");
out.write("</html>");
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("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">");
out.write("<html lang=\"ko\">");
out.write("<head>");
out.write("<script type=\"text/javascript\">");
out.write("alert('데이터가 없습니다.');");
out.write("history.back(-1);");
out.write("</script>");
out.write("</head>");
out.write("</html>");
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("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">");
out.write("<html lang=\"ko\">");
out.write("<head>");
out.write("<script type=\"text/javascript\">");
out.write("alert('데이터가 없습니다.');");
out.write("history.back(-1);");
out.write("</script>");
out.write("</head>");
out.write("</html>");
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("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">");
out.write("<html lang=\"ko\">");
out.write("<head>");
out.write("<script type=\"text/javascript\">");
out.write("alert('데이터가 없습니다.');");
out.write("history.back(-1);");
out.write("</script>");
out.write("</head>");
out.write("</html>");
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("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">");
out.write("<html lang=\"ko\">");
out.write("<head>");
out.write("<script type=\"text/javascript\">");
out.write("alert('데이터가 없습니다.');");
out.write("history.back(-1);");
out.write("</script>");
out.write("</head>");
out.write("</html>");
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("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">");
out.write("<html lang=\"ko\">");
out.write("<head>");
out.write("<script type=\"text/javascript\">");
out.write("alert('데이터가 없습니다.');");
out.write("history.back(-1);");
out.write("</script>");
out.write("</head>");
out.write("</html>");
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<excel.getList().size(); i++) {
ParamMap rowData = excel.getList().get(i);
excel.setRow(excel.getSheet().createRow(i+rownum));
if (mergeCheck) {
mergeCount += 1;
} else {
mergeCount = 1;
}
for(int j=0; j<excel.getHeaders().length; j++) {
Cell cell = excel.getRow().createCell(j);
if (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]));
}
}
}
}
}

View File

@ -78,7 +78,59 @@
<include refid="selectInternationalCrimeArrestListWhere"></include>
</select>
<select id="selectSuspectPersonInfoList" resultType="SuspectPersonInfo" parameterType="int">
<select id="selectInternationalCrimeArrestParamList" resultType="com.dbnt.faisp.util.ParamMap" parameterType="InternationalCrimeArrest">
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
<include refid="selectInternationalCrimeArrestListWhere"></include>
ORDER BY i.ica_key DESC
LIMIT #{rowCnt} OFFSET #{firstIndex}
</select>
<select id="selectSuspectPersonInfoParamList" resultType="com.dbnt.faisp.util.ParamMap" parameterType="int">
SELECT
s.spi_key,
s.ica_key,
@ -89,8 +141,25 @@
s.stay_period_expired_dt,
s.entry_visa
FROM suspect_person_info s
INNER JOIN international_crime_arrest i
ON s.ica_key = i.ica_key
INNER JOIN international_crime_arrest i
ON s.ica_key = i.ica_key
WHERE s.ica_key = #{icaKey}
</select>
<select id="icaDuplicateCount" resultType="int" parameterType="InternationalCrimeArrest">
SELECT
COUNT(*)
FROM (
SELECT
s.ica_key
, row_number() OVER (PARTITION BY s.ica_key) AS row
FROM suspect_person_info s
INNER JOIN international_crime_arrest i
ON s.ica_key = i.ica_key
<include refid="selectInternationalCrimeArrestListWhere"></include>
ORDER BY i.ica_key DESC
LIMIT #{rowCnt} OFFSET #{firstIndex}
) a
WHERE a.row > 1
</select>
</mapper>

View File

@ -508,4 +508,9 @@ function contentCheck(){
}
return flag;
}
}
$(document).on('click', '#icaExcelDownBtn', function (){
const formData = $("#icaSearchForm").serialize();
location.href = '/faStatistics/internationalCrimeArrest/ExcelDown?'+formData;
});

View File

@ -18,7 +18,7 @@
<div class="row mx-0">
<div class="col-12 card">
<div class="card-body">
<form method="get" th:action="@{/faStatistics/internationalCrimeArrest}">
<form method="get" th:action="@{/faStatistics/internationalCrimeArrest}" id="icaSearchForm">
<input type="hidden" name="pageIndex" id="pageIndex" th:value="${searchParams.pageIndex}">
<input type="hidden" name="dateSelector" value="wrtDt">
<div class="row justify-content-between pe-3 py-1">
@ -187,7 +187,7 @@
</tbody>
</table>
<button id="ivsgtAddBtn">관리자마감</button>
<button id="ivsgtAddBtn">엑셀 다운로드</button>
<button id="icaExcelDownBtn">엑셀 다운로드</button>
<button id="icaAddBtn">등록</button>
</div>
<!-- 페이징 -->