diff --git a/src/main/java/kcc/com/cmm/JsonResult.java b/src/main/java/kcc/com/cmm/JsonResult.java new file mode 100644 index 00000000..b26a3891 --- /dev/null +++ b/src/main/java/kcc/com/cmm/JsonResult.java @@ -0,0 +1,106 @@ +package kcc.com.cmm; + +import java.io.Serializable; + +/** + * 공용 JSON 리턴 모델 + * @author wimy + * + */ +public class JsonResult implements Serializable{ + /** + * + */ + private static final long serialVersionUID = -6362971805582357050L; + + private boolean success; + + private String code; + + private String message; + + private Object data; + + private String redirectUrl = ""; + + /** + * json 성공 여부 + * @return + */ + public boolean isSuccess() { + return success; + } + + /** + * json 성공 여부 + * @param success + */ + public void setSuccess(boolean success) { + this.success = success; + } + + /** + * 코드 + * @return + */ + public String getCode() { + return code; + } + + /** + * 코드 + * @param code + */ + public void setCode(String code) { + this.code = code; + } + + /** + * 메시지 + * @return + */ + public String getMessage() { + return message; + } + + /** + * 메시지 + * @param message + */ + public void setMessage(String message) { + this.message = message; + } + + /** + * JSON 데이터 + * @return + */ + public Object getData() { + return data; + } + + /** + * JSON 데이터 + * @param data + */ + public void setData(Object data) { + this.data = data; + } + + /** + * 리다이렉트 URL + * @return + */ + public String getRedirectUrl() { + return redirectUrl; + } + + /** + * 리다이렉트 URL + * @param redirectUrl + */ + public void setRedirectUrl(String redirectUrl) { + this.redirectUrl = redirectUrl; + } + +} \ No newline at end of file diff --git a/src/main/java/kcc/kccadr/adrpr/service/AdrPrsctLinkService.java b/src/main/java/kcc/kccadr/adrpr/service/AdrPrsctLinkService.java index 3e11722c..e744a6b9 100644 --- a/src/main/java/kcc/kccadr/adrpr/service/AdrPrsctLinkService.java +++ b/src/main/java/kcc/kccadr/adrpr/service/AdrPrsctLinkService.java @@ -12,6 +12,8 @@ public interface AdrPrsctLinkService { void adrPrsctLinkInsert(AdrPrsctLinkVO adrPrsctLinkVO) throws Exception; + void adrPrsctLinkListInsert(List adrPrsctLinkList) throws Exception; + int adrPrsctLinkUpdate(AdrPrsctLinkVO adrPrsctLinkVO) throws Exception; int adrPrsctLinkDelete(AdrPrsctLinkVO aprvlLineMgrVO) throws Exception; diff --git a/src/main/java/kcc/kccadr/adrpr/service/impl/AdrPrsctLinkServiceImpl.java b/src/main/java/kcc/kccadr/adrpr/service/impl/AdrPrsctLinkServiceImpl.java index a14bf49c..641ce87f 100644 --- a/src/main/java/kcc/kccadr/adrpr/service/impl/AdrPrsctLinkServiceImpl.java +++ b/src/main/java/kcc/kccadr/adrpr/service/impl/AdrPrsctLinkServiceImpl.java @@ -7,6 +7,7 @@ import javax.annotation.Resource; import org.springframework.stereotype.Service; import egovframework.rte.fdl.cmmn.EgovAbstractServiceImpl; +import egovframework.rte.fdl.idgnr.EgovIdGnrService; import kcc.kccadr.adrpr.service.AdrPrsctLinkService; import kcc.kccadr.adrpr.service.AdrPrsctLinkVO; @@ -16,6 +17,10 @@ public class AdrPrsctLinkServiceImpl extends EgovAbstractServiceImpl implements @Resource(name = "adrPrsctLinkDAO") private AdrPrsctLinkDAO adrPrsctLinkDAO; + // PRSCT_SEQ + @Resource(name="adrPrsctLinkIdgenService") + private EgovIdGnrService adrPrsctLinkIdgenService; + public AdrPrsctLinkVO selectAdrPrsctLinkDetail(AdrPrsctLinkVO adrPrsctLinkVO) throws Exception { return adrPrsctLinkDAO.selectAdrPrsctLinkDetail(adrPrsctLinkVO); } @@ -29,14 +34,27 @@ public class AdrPrsctLinkServiceImpl extends EgovAbstractServiceImpl implements return adrPrsctLinkDAO.selectAdrPrsctLinkListCount(aprvlLineMgrVO); } + //저장 public void adrPrsctLinkInsert(AdrPrsctLinkVO adrPrsctLinkVO) throws Exception { adrPrsctLinkDAO.adrPrsctLinkInsert(adrPrsctLinkVO); } + //엑셀업로드 멀티저장 + public void adrPrsctLinkListInsert(List adrPrsctLinkList) throws Exception { + for(AdrPrsctLinkVO adrPrsctLinkVO : adrPrsctLinkList) { + // 인서트 + String nextId = adrPrsctLinkIdgenService.getNextStringId(); + adrPrsctLinkVO.setPrsctSeq(nextId); + adrPrsctLinkInsert(adrPrsctLinkVO); + } + } + + //업데이트 public int adrPrsctLinkUpdate(AdrPrsctLinkVO adrPrsctLinkVO) throws Exception{ return adrPrsctLinkDAO.adrPrsctLinkUpdate(adrPrsctLinkVO); } + //삭제 public int adrPrsctLinkDelete(AdrPrsctLinkVO adrPrsctLinkVO) throws Exception{ return adrPrsctLinkDAO.adrPrsctLinkDelete(adrPrsctLinkVO); } diff --git a/src/main/java/kcc/kccadr/adrpr/web/AdrPrsctLinkController.java b/src/main/java/kcc/kccadr/adrpr/web/AdrPrsctLinkController.java index e4107269..5400d2c9 100644 --- a/src/main/java/kcc/kccadr/adrpr/web/AdrPrsctLinkController.java +++ b/src/main/java/kcc/kccadr/adrpr/web/AdrPrsctLinkController.java @@ -1,20 +1,32 @@ package kcc.kccadr.adrpr.web; +import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.Locale; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; +import org.apache.poi.openxml4j.opc.OPCPackage; +import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.xssf.streaming.SXSSFWorkbook; +import org.apache.poi.xssf.usermodel.XSSFCell; +import org.apache.poi.xssf.usermodel.XSSFRow; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.MultipartHttpServletRequest; import org.springframework.web.servlet.ModelAndView; import egovframework.rte.fdl.idgnr.EgovIdGnrService; import egovframework.rte.ptl.mvc.tags.ui.pagination.PaginationInfo; +import kcc.com.cmm.JsonResult; import kcc.com.cmm.LoginVO; import kcc.com.cmm.spring.data.util.ExcelUtil; import kcc.com.cmm.util.StringUtil; @@ -108,6 +120,18 @@ public class AdrPrsctLinkController { return modelAndView; } + /** + * 검찰연계 엑셀등록 화면 + * date : 2023.10.23 + */ + @RequestMapping(value = "/kccadr/adrpr/popup/adrPrsctLinkExcelRegistPop.do") + public String adjstReqOpenExamplePop(@ModelAttribute("adrPrsctLinkVO") AdrPrsctLinkVO adrPrsctLinkVO + , ModelMap model) throws Exception { + + + return "kccadr/adrpr/popup/adrPrsctLinkExcelRegistPop"; + } + /** * 검찰연계 등록 화면 * date : 2023.10.23 @@ -140,7 +164,7 @@ public class AdrPrsctLinkController { // 저장 if (StringUtil.isEmpty(adrPrsctLinkVO.getPrsctSeq())) { // 인서트 - String nextId =adrPrsctLinkIdgenService.getNextStringId(); + String nextId = adrPrsctLinkIdgenService.getNextStringId(); adrPrsctLinkVO.setPrsctSeq(nextId); adrPrsctLinkService.adrPrsctLinkInsert(adrPrsctLinkVO); } @@ -193,4 +217,306 @@ public class AdrPrsctLinkController { return modelAndView; } + /** + * 문자 발송 - 엑셀파일 불러오기 + * @param body + * @param uploadFile + * @param search + * @param result + * @param model + * @param request + * @return + * @throws Exception + */ + @RequestMapping(value = "/kccadr/adrpr/adrPrsctLinkSendExelAjax.do") + @ResponseBody + public Object adrPrsctLinkSendExelAjax(final MultipartHttpServletRequest multiRequest) throws Exception { + + //로그인 정보 획득 - ssoLoginVO 사용 + LoginVO loginVO = checkLoginUtil.getLoginVO(); + + JsonResult jr = new JsonResult(); + jr.setSuccess(false); + jr.setMessage("엑셀 파일만 업로드할 수 있습니다."); + + try { + if (loginVO != null) { + List files = (List) multiRequest.getFiles("file0"); + + // 파일명에 .이 있을경우 오류 => Ex) 테스트6.20.xlsx + int fileNameSplitCnt = 0; + + if(!files.isEmpty()) { + fileNameSplitCnt = files.get(0).getOriginalFilename().split("[.]").length; + + if (files.get(0).getSize() > 0 + && (files.get(0).getContentType().indexOf("spreadsheetml") > -1) + || files.get(0).getContentType().indexOf("ms-excel") > -1 + || files.get(0).getOriginalFilename().split("[.]")[fileNameSplitCnt-1].indexOf("xlsx") > -1 + || files.get(0).getOriginalFilename().split("[.]")[fileNameSplitCnt-1].indexOf("xls") > -1) { + + // 엑셀 파일 용량 3MB이상 시 10만건 이상으로 서버가 다운되는 증상 발생 + long fileSize = multiRequest.getFile("file0").getSize(); + + if(fileSize > 3374653) { + jr.setMessage("엑셀 파일은 3MB를 넘을수 없습니다."); + return jr; + } + + String Ext = files.get(0).getOriginalFilename().split("[.]")[1]; + String errMessage = ""; + String cellValue = ""; + + int errItemCnt = 0; + String errItemLine = ""; + + //엑셀 확장자에 따른 처리 로직 분리 + //확장자가 xlsx + if(Ext.equals("xlsx")) { + OPCPackage opcPackage = OPCPackage.open(files.get(0).getInputStream()); + XSSFWorkbook workbook = new XSSFWorkbook(opcPackage); + XSSFSheet sheet = workbook.getSheetAt(0); // 첫번째 시트 불러오기 + opcPackage.close(); + + int totRowDataCnt = 0; + for(int r=1; r 20001) { + errMessage = "20000건 이상의 업로드는 데이터 부하로 업로드 할수 없습니다."; + jr.setSuccess(false); + jr.setMessage(errMessage); + return jr; + } + + List> hashMapList = new ArrayList>(); + for(int i=2; i< sheet.getLastRowNum() + 2; i++){ //먼저 밸리데이션 체크(1줄은 생략) + XSSFRow row = sheet.getRow(i); //열읽기 + if(null == row) { + continue; + } + + HashMap hashMap = new HashMap<>(); + // 행의 두번째 열(이름부터 받아오기) + XSSFCell cell = null; + boolean errSts = true; + + for(int j = 0 ; j <= 7; j++){ //행읽기(6행까지나 2행까지만 필요) + cellValue = ""; + cell = row.getCell(j); //이름/핸드폰/변환1/변환2/변환3/변환4/변환5 + if(null == cell || "".equals(cell.toString().trim())) { //셀에 값이 없으면 + if(j == 1) { + if (sheet.getLastRowNum() == i) { + continue; + } + break; + } + } + if(null != cell){ + switch(cell.getCellType()){ //숫자타임을 문자로 변환 + case Cell.CELL_TYPE_NUMERIC: + cell.setCellType(Cell.CELL_TYPE_STRING); + } + cellValue = StringUtil.getString(cell.getStringCellValue().trim()) ; + } + + // 항목 체크 + if(j == 0) { + //배당일 + if(getItemChk("dividendDate", cellValue) && errSts) { + hashMap.put("dividendDate", cellValue); + }else { + errItemCnt++; + errItemLine += (i+1) + "행(배당일) "; + errSts = false; + break; + } + } + if(j == 1) { + //본사건번호 + if(getItemChk("prsctNo", cellValue) && errSts) { + hashMap.put("prsctNo", cellValue); + }else { + errItemCnt++; + errItemLine += (i+1) + "행(본사건번호) "; + errSts = false; + break; + } + } + if(j == 2) { + //조정사건번호 + if(getItemChk("prsctAdrNo", cellValue) && errSts) { + hashMap.put("prsctAdrNo", cellValue); + }else { + errItemCnt++; + errItemLine += (i+1) + "행(조정사건번호) "; + errSts = false; + break; + } + } + if(j == 3) { + //원고 이름 + if(getItemChk("plntfNm", cellValue) && errSts) { + hashMap.put("plntfNm", cellValue); + }else { + errItemCnt++; + errItemLine += (i+1) + "행(원고 이름) "; + errSts = false; + break; + } + } + if(j == 4) { + //원고 연락처 + if(getItemChk("plntfPhone", cellValue) && errSts) { + hashMap.put("plntfPhone", cellValue); + }else { + errItemCnt++; + errItemLine += (i+1) + "행(원고 연락처) "; + errSts = false; + break; + } + } + if(j == 5) { + //피고 이름 + if(getItemChk("dfndnNm", cellValue) && errSts) { + hashMap.put("dfndnNm", cellValue); + }else { + errItemCnt++; + errItemLine += (i+1) + "행(피고 이름) "; + errSts = false; + break; + } + } + if(j == 6) { + //피고 연락처 + if(getItemChk("dfndnPhone", cellValue) && errSts) { + hashMap.put("dfndnPhone", cellValue); + }else { + errItemCnt++; + errItemLine += (i+1) + "행(피고 연락처) "; + errSts = false; + break; + } + } + if(j == 7) { + //사건내용 + if(getItemChk("prsctCn", cellValue) && errSts) { + hashMap.put("prsctCn", cellValue); + }else { + errItemCnt++; + errItemLine += (i+1) + "행(사건내용) "; + errSts = false; + break; + } + } + } + + if(errSts) { + hashMapList.add(hashMap); + } + + } + + //jr.setData(hashMapList); + jr.setSuccess(true); + + if(errItemCnt > 0) { + jr.setMessage("유효하지 않은 형식의 데이터가 " + errItemCnt +"건입니다.\n" + errItemLine.trim()); + }else { + jr.setMessage(""); + + //Step1. 데이터 변환 + List adrPrsctLinkList = new ArrayList(); + // List foreach 문 + for (HashMap item : hashMapList) { + AdrPrsctLinkVO adrPrsctLinkVO = new AdrPrsctLinkVO(); + adrPrsctLinkVO.setDividendDate(item.get("dividendDate")); + adrPrsctLinkVO.setPrsctNo(item.get("prsctNo")); + adrPrsctLinkVO.setPrsctAdrNo(item.get("prsctAdrNo")); + adrPrsctLinkVO.setPlntfNm(item.get("plntfNm")); + adrPrsctLinkVO.setPlntfPhone(item.get("plntfPhone")); + adrPrsctLinkVO.setDfndnNm(item.get("dfndnNm")); + adrPrsctLinkVO.setDfndnPhone(item.get("dfndnPhone")); + adrPrsctLinkVO.setPrsctCn(item.get("prsctCn")); + adrPrsctLinkVO.setFrstRegisterId(loginVO.getUniqId()); + adrPrsctLinkVO.setLastUpdusrId(loginVO.getUniqId()); + + //List Add + adrPrsctLinkList.add(adrPrsctLinkVO); + } + + //Step2. 데이터 저장 + adrPrsctLinkService.adrPrsctLinkListInsert(adrPrsctLinkList); + } + } //xlsx 처리 끝 + + } + + } + } + else { + jr.setSuccess(false); + jr.setMessage("로그인후 이용해주세요."); + } + + return jr; + + } catch (Exception e) { + // TODO: handle exception + System.out.println("+++++++++++++++++ adrPrsctLinkSendExelAjax Controller Error !!! " + e.getMessage()); + jr.setSuccess(false); + jr.setMessage("엑셀 데이터에 오류가 있습니다. 엑셀 데이터를 확인해 주세요."); + return jr; + } + + } + + // 엑셀 항목 체크 + public boolean getItemChk(String type, String value) { + boolean rtnVal = true; + String dateRegExp = "^(19|20)[\\d]{2}-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])$"; + String phoneRegExp = "^(050[234567]{1}|01[016789]{1})-?[0-9]{3,4}-?[0-9]{4}$"; + + /* + try { + if(type.equals("dividendDate")) { + //배당일 + if(!value.matches(dateRegExp)) { + rtnVal = false; + } + } + else if(type.equals("plntfPhone")) { + //원고 연락처 + if(!value.matches(phoneRegExp)) { + rtnVal = false; + } + } + else if(type.equals("dfndnPhone")) { + //피고 연락처 + if(!value.matches(phoneRegExp)) { + rtnVal = false; + } + } + } + catch(Exception e) { + rtnVal = false; + + System.out.println("엑셀 항목 체크"); + System.out.println("type : " + type); + System.out.println("value : " + value); + System.out.println("getItemChk : " + e.getMessage()); + } + */ + + return rtnVal; + } + } diff --git a/src/main/resources/egovframework/spring/com/context-idgen.xml b/src/main/resources/egovframework/spring/com/context-idgen.xml index 2b29b357..06fef7c2 100644 --- a/src/main/resources/egovframework/spring/com/context-idgen.xml +++ b/src/main/resources/egovframework/spring/com/context-idgen.xml @@ -2913,7 +2913,7 @@ - + diff --git a/src/main/webapp/WEB-INF/jsp/kccadr/adrpr/adrPrsctLinkList.jsp b/src/main/webapp/WEB-INF/jsp/kccadr/adrpr/adrPrsctLinkList.jsp index c5c492c5..60f1d42b 100644 --- a/src/main/webapp/WEB-INF/jsp/kccadr/adrpr/adrPrsctLinkList.jsp +++ b/src/main/webapp/WEB-INF/jsp/kccadr/adrpr/adrPrsctLinkList.jsp @@ -72,17 +72,18 @@ function fncExcel() { } } -function AppReq(){ - var form = $('
'); - form.append($('', {type: 'hidden', name: 'mltApprSeq', value: 'test'})); - form.appendTo('body'); - commonPopWindowopenForm("/kccadr/adrpr/adrPrsctLinkExcelPop.do" , "850", "700", "AppExcelPopup", form); - form.remove(); +//엑셀 업로드 +function openExcelUploadPop() { + window.open('/kccadr/adrpr/popup/adrPrsctLinkExcelRegistPop.do', 'openExcelUploadPop', 'width=700px,height=410px,scrollbars=no'); } + 검찰연계 목록 +
+
+
" /> @@ -155,7 +156,10 @@ function AppReq(){
+ <%-- + --%> +
@@ -197,9 +201,7 @@ function AppReq(){ - - ${list.prsctNo} - + ${list.prsctNo} ${list.prsctAdrNo} ${list.plntfNm} diff --git a/src/main/webapp/WEB-INF/jsp/kccadr/adrpr/popup/adrPrsctLinkExcelRegistPop.jsp b/src/main/webapp/WEB-INF/jsp/kccadr/adrpr/popup/adrPrsctLinkExcelRegistPop.jsp new file mode 100644 index 00000000..a63f3ad8 --- /dev/null +++ b/src/main/webapp/WEB-INF/jsp/kccadr/adrpr/popup/adrPrsctLinkExcelRegistPop.jsp @@ -0,0 +1,195 @@ + +<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="ui" uri="http://egovframework.gov/ctl/ui"%> +<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> +<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%> +<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> +<%@ taglib prefix="validator" uri="http://www.springmodules.org/tags/commons-validator" %> + + + + + + + + + +검찰연계 엑셀 업로드 + + + + + +
+ + + +
+
+ + + + + + + + + + + + +
첨부파일 + + +
+ + + + + + + + + + + + + + + + + + +
파일 명종류크기삭제
+

첨부하실 파일을 마우스로 끌어서 넣어주세요.

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
파일 명종류크기삭제
+ + ${fileList.orignlFileNm} + + "> + + +
+
+
+
+
+
+
+ + +
+
+
+ +
+ + + + +