diff --git a/build.gradle b/build.gradle index c505fc82..1225f8f2 100644 --- a/build.gradle +++ b/build.gradle @@ -29,6 +29,10 @@ dependencies { implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.2.2' implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity5:3.0.4.RELEASE' implementation 'org.bgee.log4jdbc-log4j2:log4jdbc-log4j2-jdbc4.1:1.16' + //엑셀다운 + implementation 'org.apache.poi:poi:4.1.0' + implementation 'org.apache.poi:poi-ooxml:4.1.0' + developmentOnly 'org.springframework.boot:spring-boot-devtools:2.7.2' runtimeOnly 'org.postgresql:postgresql:42.3.6' annotationProcessor 'org.springframework.boot:spring-boot-configuration-processor:2.7.2' diff --git a/src/main/java/com/dbnt/faisp/translator/TranslatorController.java b/src/main/java/com/dbnt/faisp/translator/TranslatorController.java index 9f67c537..68299c48 100644 --- a/src/main/java/com/dbnt/faisp/translator/TranslatorController.java +++ b/src/main/java/com/dbnt/faisp/translator/TranslatorController.java @@ -7,13 +7,17 @@ import com.dbnt.faisp.translator.model.TranslatorCrr; import com.dbnt.faisp.translator.service.TranslatorService; import com.dbnt.faisp.userInfo.model.UserInfo; import com.dbnt.faisp.util.ParamMap; +import com.dbnt.faisp.util.Utils; import lombok.RequiredArgsConstructor; +import java.io.IOException; import java.util.HashMap; import java.util.List; import java.util.Map; +import javax.servlet.http.HttpServletResponse; + import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.web.bind.annotation.*; import org.springframework.web.servlet.ModelAndView; @@ -30,17 +34,33 @@ public class TranslatorController { @GetMapping("/info") - public ModelAndView translatorInfo(@AuthenticationPrincipal UserInfo loginUser,Translator translator) { + public ModelAndView translatorInfo(@AuthenticationPrincipal UserInfo loginUser,Translator translator,HttpServletResponse response) { ModelAndView mav = new ModelAndView("translator/translator"); Map params = new HashMap<>(); params.put("userSeq", loginUser.getUserSeq()); params.put("menuUrl", "/translator/info"); + translator.setOrganCdList(organConfigService.selectOrganListWhereUserOgCd(loginUser.getOgCd())); + //엑셀다운 + if(translator.getExcel() != null && translator.getExcel().equals("Y")){ + String[] headers = { "translator_key", "ogdp1", "tr_lang", "tr_career", "tr_name", "tr_age", "tr_nny", "tr_edu", "tr_cft", "dml_yn", "apt_dt", "tr_phone"}; + String[] headerNames = { "연번", "관서명", "언어", "경력", "성명", "나이", "국적", "학력", "자격증", "해촉", "위촉일", "연락처" }; + String[] columnType = { "String", "String", "String", "String", "String", "String", "String", "String", "String", "String", "String", "String"}; + String sheetName = "민간 통역인 현황"; + String excelFileName = "민간 통역인 현황"; + List translatorInfoList= translatorSevice.selectTranslatorListEx(translator); + + try { + Utils.listToExcel(translatorInfoList, response, headers, headerNames, columnType, sheetName, excelFileName); + } catch (IOException e) { + + } + return null; + } //메뉴권한 확인 String accessAuth = authMgtService.selectAccessConfigList(params).get(0).getAccessAuth(); mav.addObject("mgtOrganList", loginUser.getOrganCdList()); mav.addObject("accessAuth", accessAuth); - translator.setOrganCdList(organConfigService.selectOrganListWhereUserOgCd(loginUser.getOgCd())); translator.setQueryInfo(); mav.addObject("translatorList", translatorSevice.selectTranslatorList(translator)); translator.setContentCnt(translatorSevice.selectTranslatorListCnt(translator)); @@ -136,10 +156,11 @@ public class TranslatorController { public ModelAndView statisticsLang() { ModelAndView mav = new ModelAndView("translator/translatorStatisticsLang"); mav.addObject("cntList", translatorSevice.selectStatisticsLangCnt()); - + mav.addObject("total", translatorSevice.selectStatisticsLangTotal()); return mav; } + } diff --git a/src/main/java/com/dbnt/faisp/translator/mapper/TranslatorMapper.java b/src/main/java/com/dbnt/faisp/translator/mapper/TranslatorMapper.java index 39e5a818..6ae4bffa 100644 --- a/src/main/java/com/dbnt/faisp/translator/mapper/TranslatorMapper.java +++ b/src/main/java/com/dbnt/faisp/translator/mapper/TranslatorMapper.java @@ -24,4 +24,8 @@ public interface TranslatorMapper { List selectStatisticsLangCnt(); + ParamMap selectStatisticsLangTotal(); + + List selectTranslatorListEx(Translator translator); + } diff --git a/src/main/java/com/dbnt/faisp/translator/model/Translator.java b/src/main/java/com/dbnt/faisp/translator/model/Translator.java index 957091f3..6c729c04 100644 --- a/src/main/java/com/dbnt/faisp/translator/model/Translator.java +++ b/src/main/java/com/dbnt/faisp/translator/model/Translator.java @@ -16,6 +16,7 @@ import javax.persistence.*; import java.io.Serializable; import java.time.LocalDate; import java.time.LocalDateTime; +import java.util.Date; @Getter @@ -70,16 +71,9 @@ public class Translator extends BaseModel implements Serializable{ private String wrtOrgan; + @Transient + private String excel; - -@Override -public String toString() { - return "Translator [translatorKey=" + translatorKey + ", versionNo=" + versionNo + ", ogdp1=" + ogdp1 + ", trLang=" - + trLang + ", trCareer=" + trCareer + ", trName=" + trName + ", trSex=" + trSex + ", trPhone=" + trPhone - + ", trNny=" + trNny + ", trAge=" + trAge + ", trCft=" + trCft + ", trVisa=" + trVisa + ", aptDt=" + aptDt - + ", dmlYn=" + dmlYn + ", remark=" + remark + ", wrtNm=" + wrtNm + ", wrtDt=" + wrtDt + "]"; -} - @Embeddable @Data @NoArgsConstructor @@ -90,6 +84,23 @@ public static class TranslatorId implements Serializable { private Integer versionNo; } +public Date getInt(String string) { + return null; +} + +public Date getString(String string) { + return null; +} + +@Override +public String toString() { + return "Translator [translatorKey=" + translatorKey + ", versionNo=" + versionNo + ", ogdp1=" + ogdp1 + ", trLang=" + + trLang + ", trCareer=" + trCareer + ", trName=" + trName + ", trSex=" + trSex + ", trPhone=" + trPhone + + ", trNny=" + trNny + ", trAge=" + trAge + ", trEdu=" + trEdu + ", trCft=" + trCft + ", trVisa=" + trVisa + + ", aptDt=" + aptDt + ", dmlYn=" + dmlYn + ", remark=" + remark + ", wrtNm=" + wrtNm + ", wrtDt=" + wrtDt + + ", wrtOrgan=" + wrtOrgan + ", excel=" + excel + "]"; +} + diff --git a/src/main/java/com/dbnt/faisp/translator/service/TranslatorService.java b/src/main/java/com/dbnt/faisp/translator/service/TranslatorService.java index 6ed709f9..84bdbfaa 100644 --- a/src/main/java/com/dbnt/faisp/translator/service/TranslatorService.java +++ b/src/main/java/com/dbnt/faisp/translator/service/TranslatorService.java @@ -131,4 +131,12 @@ public class TranslatorService { return translatorMapper.selectStatisticsLangCnt(); } + public ParamMap selectStatisticsLangTotal() { + return translatorMapper.selectStatisticsLangTotal(); + } + + public List selectTranslatorListEx(Translator translator) { + return translatorMapper.selectTranslatorListEx(translator); + } + } diff --git a/src/main/java/com/dbnt/faisp/util/Utils.java b/src/main/java/com/dbnt/faisp/util/Utils.java new file mode 100644 index 00000000..7c0abc35 --- /dev/null +++ b/src/main/java/com/dbnt/faisp/util/Utils.java @@ -0,0 +1,192 @@ +package com.dbnt.faisp.util; + +import java.awt.image.BufferedImage; +import java.io.BufferedReader; +import java.io.DataOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.io.PrintWriter; +import java.net.HttpURLConnection; +import java.net.InetAddress; +import java.net.NetworkInterface; +import java.net.SocketException; +import java.net.URL; +import java.net.URLEncoder; +import java.util.ArrayList; +import java.util.Base64; +import java.util.Date; +import java.util.Enumeration; +import java.util.List; +import java.util.Map; +import java.util.Random; + +import javax.imageio.ImageIO; +import javax.servlet.http.Cookie; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.FillPatternType; +import org.apache.poi.ss.usermodel.HorizontalAlignment; +import org.apache.poi.ss.usermodel.IndexedColors; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.xssf.usermodel.XSSFDataFormat; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; + +import org.springframework.ui.Model; +import org.springframework.util.FileCopyUtils; + + + +import com.dbnt.faisp.util.ParamMap; + +public class Utils { + + + public static boolean isEmpty(final Object obj) { + return !isNotEmpty(obj); + } + + public static boolean isNotEmpty(final Object obj) { + if(null == obj) return false; + else { + if(obj instanceof String) return "".equals(obj) ? false : true; + else if(obj instanceof List) return !((List)obj).isEmpty(); + else if(obj instanceof Map) return !((Map)obj).isEmpty(); +// else if(obj instanceof Object[]) return 0 == Array.getLength(obj) ? false : true; + else if(obj instanceof Integer) return !(null == obj); + else if(obj instanceof Long) return !(null == obj); + else return false; + } + } + + public static String getTimeStampString(final String format) { + return getTimeStampString(new Date(), format); + } + + public static String getTimeStampString(final Date date) { + return getTimeStampString(date, "yyyyMMddHHmmss"); + } + + public static String getTimeStampString(final Date date, final String format){ + java.text.SimpleDateFormat formatter = new java.text.SimpleDateFormat (format, java.util.Locale.KOREA); + return formatter.format(date); + } + + public static String getTimeStampString(String date, final String format) { + try { + if(null == date || "".equals(date)) return ""; + + Date d = null; + date= date.replaceAll("-", ""); + + switch(date.length()) { + case 14: break; + case 12: date += "00"; break; + case 10: date += "0000"; break; + case 8: date += "000000"; break; + case 6: date += "01000000"; break; + case 4: date += "0101000000"; break; + default: return ""; + } + + java.text.SimpleDateFormat tmpFormat = new java.text.SimpleDateFormat("yyyyMMddHHmmss", java.util.Locale.KOREA); + + if("".equals(date)) d = new Date(); + else { + tmpFormat.setLenient(true); + d = tmpFormat.parse(date); + } + + return getTimeStampString(d, format); + } catch(Exception e) { + e.printStackTrace(); + return ""; + } + } + + public static void listToExcel(List list, HttpServletResponse response, String[] headers, String[] headerNames, String[] columnType, String sheetName, String excelFileName) throws IOException { + if(Utils.isNotEmpty(list)) { + // 메모리에 100개의 행을 유지합니다. 행의 수가 넘으면 디스크에 적습니다. + XSSFWorkbook wb = new XSSFWorkbook(); + Sheet sheet = wb.createSheet(sheetName); + Row headerRow = sheet.createRow(0); + CellStyle cellStyle1 = wb.createCellStyle(); //쉼표들어간 숫자 양식 + CellStyle cellStyle2 = wb.createCellStyle(); //숫자양식 + CellStyle headerStyle = wb.createCellStyle(); //숫자양식 + + XSSFDataFormat format = wb.createDataFormat(); + cellStyle1.setDataFormat(format.getFormat("#,##0")); + cellStyle2.setDataFormat(format.getFormat("#")); + headerStyle.setAlignment(HorizontalAlignment.CENTER); + headerStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); + headerStyle.setFillForegroundColor((short)3); + headerStyle.setFillForegroundColor(IndexedColors.LIME.getIndex()); + + for(int i=0; i"); + out.write(""); + out.write(""); + out.write(""); + out.write(""); + out.write(""); + + out.flush(); + out.close(); + } + + } + + + + +} diff --git a/src/main/resources/mybatisMapper/TranslatorMapper.xml b/src/main/resources/mybatisMapper/TranslatorMapper.xml index b7a005b6..f1acb2af 100644 --- a/src/main/resources/mybatisMapper/TranslatorMapper.xml +++ b/src/main/resources/mybatisMapper/TranslatorMapper.xml @@ -208,5 +208,108 @@ inner join code_mgt cm on d.lang=cm.item_cd group by cm.item_value + + + + \ No newline at end of file diff --git a/src/main/resources/static/js/translator/translator.js b/src/main/resources/static/js/translator/translator.js index 5e18ef77..00c89f6a 100644 --- a/src/main/resources/static/js/translator/translator.js +++ b/src/main/resources/static/js/translator/translator.js @@ -411,6 +411,16 @@ $(document).on('click', '#trDeleteBtn', function (){ } }) +$(document).on('click', '#goExcel', function (){ + if(confirm("엑셀로 다운로드 하시겠습니까?")){ + $('input[name=excel]').val('Y'); + $('#searchFm').submit(); + $('input[name=excel]').val(''); + }else{ + false; + } +}) + diff --git a/src/main/resources/templates/translator/translator.html b/src/main/resources/templates/translator/translator.html index d747d78b..388b5ef9 100644 --- a/src/main/resources/templates/translator/translator.html +++ b/src/main/resources/templates/translator/translator.html @@ -13,7 +13,8 @@
-
+ +
@@ -171,6 +172,7 @@
+
diff --git a/src/main/resources/templates/translator/translatorStatisticsLang.html b/src/main/resources/templates/translator/translatorStatisticsLang.html index 9aaa823d..d12930b4 100644 --- a/src/main/resources/templates/translator/translatorStatisticsLang.html +++ b/src/main/resources/templates/translator/translatorStatisticsLang.html @@ -18,8 +18,6 @@
- - @@ -34,17 +32,17 @@ - - - - - - + + + + + + - - + +
연번