package itn.let.mjo.block.web; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.math.BigDecimal; import java.math.RoundingMode; import java.text.SimpleDateFormat; import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermodel.HSSFRow; import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.openxml4j.opc.OPCPackage; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellStyle; import org.apache.poi.ss.usermodel.Font; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; 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.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartHttpServletRequest; import org.springframework.web.servlet.HandlerMapping; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.support.RedirectAttributes; import egovframework.rte.fdl.security.userdetails.util.EgovUserDetailsHelper; import egovframework.rte.ptl.mvc.tags.ui.pagination.PaginationInfo; import itn.com.cmm.JsonResult; import itn.com.cmm.LoginVO; import itn.com.cmm.util.StringUtil; import itn.com.utl.fcc.service.EgovStringUtil; import itn.let.mjo.block.service.MjonBlockService; import itn.let.mjo.block.service.MjonBlockVO; import itn.let.mjo.msg.service.MjonMsgService; import itn.let.mjo.msg.service.MjonMsgVO; import itn.let.mjo.msgdata.service.MjonMsgDataService; import itn.let.mjo.msgdata.service.PhoneVO; import itn.let.sym.site.service.JoinSettingVO; import itn.let.uss.umt.service.MberManageVO; /** * 주소록 수신거부 관한 controller 클래스를 정의한다. * @author ITN * @since 2022.03.17 * @version 1.0 * @see * *
 * << 개정이력(Modification Information) >>
 *
 *   수정일      수정자           수정내용
 *  -------    --------    ---------------------------
 *   2022.03.17  ITN          최초 생성
 *
 * 
*/ @Controller public class AddrBlockController { @Resource(name = "mjonBlockService") private MjonBlockService mjonBlockService; @Resource(name = "mjonMsgService") private MjonMsgService mjonMsgService; @Resource(name = "MjonMsgDataService") private MjonMsgDataService mjonMsgDataService; //배열 정의{"컬럼순차번호, 컬럼이름, 컬럼내용, 컬럼이름에 붙여야할 내용(엑셀코드양식다운로드시 필요)"} private String[][] sendBlockExcelValue ={ {"0" ,"번호" , "1" , "" }, {"1", "형태" , "직접등록" , ""}, {"2", "거부번호" , "01012345678", ""}, {"3", "수신자" , "홍길동", ""}, {"4", "등록일시" , "2021-06-08 11:05:38", ""}, {"5", "메모" , "테스트", ""} } ; /** * 주소록 수신거부 관리 이동 * * @param addrVO * @param model * @return * @throws Exception */ @RequestMapping(value= {"/web/mjon/addrBlock/selectBlockList.do" , "/web/mjon/addrBlock/selectBlockAllAjax.do", "/web/mjon/addrBlock/selectBlock080Ajax.do", "/web/mjon/addrBlock/selectBlockSelfAjax.do" }) public String selectBlockList(@ModelAttribute("searchVO") MjonBlockVO blockVO , HttpServletRequest request , RedirectAttributes redirectAttributes , ModelMap model) throws Exception { String pattern = (String) request.getAttribute(HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE) ; //로그인 권한정보 불러오기 LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null; String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId()); String userName = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getName()); if(userId == "") { redirectAttributes.addFlashAttribute("message", "수신거부 서비스는 로그인 후 이용 가능합니다."); return "redirect:/web/user/login/login.do"; } // 현재 날짜 구하기 LocalDate now = LocalDate.now(); // 포맷 정의 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy.MM.dd"); // 포맷 적용 String formatedNow = now.format(formatter); model.addAttribute("userName", userName); model.addAttribute("nowDate", formatedNow); if(userId != "") { blockVO.setUserId(userId); } if(blockVO.getPageUnit() != 10) { blockVO.setPageUnit(blockVO.getPageUnit()); } if(pattern.equals("/web/mjon/addrBlock/selectBlockAllAjax.do") || pattern.equals("/web/mjon/addrBlock/selectBlock080Ajax.do") || pattern.equals("/web/mjon/addrBlock/selectBlockSelfAjax.do") ) { //전체 , 080, 자체 /** paging */ PaginationInfo paginationInfo = new PaginationInfo(); paginationInfo.setCurrentPageNo(blockVO.getPageIndex()); paginationInfo.setRecordCountPerPage(blockVO.getPageUnit()); paginationInfo.setPageSize(blockVO.getPageSize()); blockVO.setFirstIndex(paginationInfo.getFirstRecordIndex()); blockVO.setLastIndex(paginationInfo.getLastRecordIndex()); blockVO.setRecordCountPerPage(paginationInfo.getRecordCountPerPage()); if("".equals(blockVO.getSearchSortCnd())){ //최초조회시 최신것 조회List blockVO.setSearchSortCnd("blockId"); blockVO.setSearchSortOrd("desc"); } // 수신거부형태 (1: 080 자동수신거부, 2: 직접등록) if(pattern.equals("/web/mjon/addrBlock/selectBlock080Ajax.do")) { blockVO.setBlockType(1); } else if(pattern.equals("/web/mjon/addrBlock/selectBlockSelfAjax.do")) { blockVO.setBlockType(2); } List blockList = mjonBlockService.selectBlockList(blockVO); int totCnt = 0; if(blockList.size() > 0) { totCnt = blockList.get(0).getTotCnt(); } model.addAttribute("resultList", blockList); paginationInfo.setTotalRecordCount(totCnt); model.addAttribute("paginationInfo", paginationInfo); if(pattern.equals("/web/mjon/addrBlock/selectBlock080Ajax.do")) { return "/web/addrBlock/AddrBlock080Ajax"; } else if(pattern.equals("/web/mjon/addrBlock/selectBlockSelfAjax.do")) { return "/web/addrBlock/AddrBlockSelfAjax"; } else { return "/web/addrBlock/AddrBlockAllAjax"; } } return "/web/addrBlock/AddrBlockList"; } /** * 수신거부 저장 * @param searchVO * @param model * @return "/web/mjon/addrBlock/addrBlockInsertAjax.do" * @throws Exception */ @RequestMapping(value= {"/web/mjon/addrBlock/addrBlockInsertAjax.do"}) public ModelAndView addrBlockInsertAjax(@ModelAttribute("searchVO") MjonBlockVO mjonBlockVO, RedirectAttributes redirectAttributes, ModelMap model) throws Exception{ ModelAndView modelAndView = new ModelAndView(); modelAndView.setViewName("jsonView"); boolean isSuccess = true; String msg = ""; try { LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null; String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId()); if(userId.equals("")) { isSuccess = false; modelAndView.addObject("isSuccess", isSuccess); modelAndView.addObject("msg", "로그인 후 이용이 가능합니다."); return modelAndView; } else { mjonBlockVO.setUserId(userId); } //치환문자 체크 처리 //String[] phoneList = mjonBlockVO.getPhoneList(); //String[] nameList = mjonBlockVO.getNameList(); //String[] memoList = mjonBlockVO.getMemoList(); mjonBlockVO.setBlockType(2); // 직접등록 mjonBlockService.insertBlockList(mjonBlockVO); } catch(Exception e) { isSuccess = false; msg = e.getMessage(); } modelAndView.addObject("isSuccess", isSuccess); modelAndView.addObject("msg", msg); return modelAndView; } /** * 수신거부 삭제 * @param searchVO * @param model * @return "/web/mjon/addrBlock/addrBlockDeleteAjax.do" * @throws Exception */ @RequestMapping(value= {"/web/mjon/addrBlock/addrBlockDeleteAjax.do"}) public ModelAndView addrBlockDeleteAjax(@ModelAttribute("searchVO") MjonBlockVO mjonBlockVO, RedirectAttributes redirectAttributes, @RequestParam String[] blockCheckList, ModelMap model) throws Exception{ ModelAndView modelAndView = new ModelAndView(); modelAndView.setViewName("jsonView"); boolean isSuccess = true; String msg = ""; try { LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null; String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId()); if(userId.equals("")) { isSuccess = false; modelAndView.addObject("isSuccess", isSuccess); modelAndView.addObject("msg", "로그인 후 이용이 가능합니다."); return modelAndView; } else { mjonBlockVO.setUserId(userId); } for(String id:blockCheckList) { mjonBlockVO.setBlockId(id); mjonBlockService.deleteBlock(mjonBlockVO); } } catch(Exception e) { isSuccess = false; msg = e.getMessage(); } modelAndView.addObject("isSuccess", isSuccess); modelAndView.addObject("msg", msg); return modelAndView; } /** * 주소록 삭제 * @param searchVO * @param model * @return "/web/mjon/addrBlock/addrBlockAddrDeleteAjax.do" * @throws Exception */ @RequestMapping(value= {"/web/mjon/addrBlock/addrBlockAddrDeleteAjax.do"}) public ModelAndView addrBlockAddrDeleteAjax(@ModelAttribute("searchVO") MjonBlockVO mjonBlockVO, RedirectAttributes redirectAttributes, @RequestParam(value="blockCheck", defaultValue="0") String[] blockCheck, ModelMap model) throws Exception{ ModelAndView modelAndView = new ModelAndView(); modelAndView.setViewName("jsonView"); boolean isSuccess = true; String msg = ""; try { LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null; String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId()); if(userId.equals("")) { isSuccess = false; modelAndView.addObject("isSuccess", isSuccess); modelAndView.addObject("msg", "로그인 후 이용이 가능합니다."); return modelAndView; } else { mjonBlockVO.setUserId(userId); } for(String id:blockCheck) { mjonBlockVO.setBlockId(id); mjonBlockService.deleteBlockAddr(mjonBlockVO); } } catch(Exception e) { isSuccess = false; msg = e.getMessage(); } modelAndView.addObject("isSuccess", isSuccess); modelAndView.addObject("msg", msg); return modelAndView; } /** * 수신거부 메모 업데이트 * @param searchVO * @param model * @return "/web/mjon/addrBlock/addrBlockUpdateMemoAjax.do" * @throws Exception */ @RequestMapping(value= {"/web/mjon/addrBlock/addrBlockUpdateMemoAjax.do"}) public ModelAndView addrBlockUpdateMemoAjax(@ModelAttribute("searchVO") MjonBlockVO mjonBlockVO, RedirectAttributes redirectAttributes, @RequestParam(value="blockCheck", defaultValue="0") String[] blockCheck, ModelMap model) throws Exception{ ModelAndView modelAndView = new ModelAndView(); modelAndView.setViewName("jsonView"); boolean isSuccess = true; String msg = ""; try { LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null; String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId()); if(userId.equals("")) { isSuccess = false; modelAndView.addObject("isSuccess", isSuccess); modelAndView.addObject("msg", "로그인 후 이용이 가능합니다."); return modelAndView; } else { mjonBlockVO.setUserId(userId); } // 메모 수정 mjonBlockService.updateBlockMemo(mjonBlockVO); } catch(Exception e) { isSuccess = false; msg = e.getMessage(); } modelAndView.addObject("isSuccess", isSuccess); modelAndView.addObject("msg", msg); return modelAndView; } /** * 수신거부 결과전송 업데이트 * @param searchVO * @param model * @return "/web/mjon/addrBlock/addrBlockUpdateResultAjax.do" * @throws Exception */ @RequestMapping(value= {"/web/mjon/addrBlock/addrBlockUpdateResultAjax.do"}) public ModelAndView addrBlockUpdateResultAjax(@ModelAttribute("searchVO") MjonBlockVO mjonBlockVO, RedirectAttributes redirectAttributes, HttpServletRequest request, ModelMap model) throws Exception{ ModelAndView modelAndView = new ModelAndView(); modelAndView.setViewName("jsonView"); boolean isSuccess = true; String msg = ""; try { String blockId = request.getParameter("blockId"); mjonBlockVO.setBlockId(blockId); mjonBlockVO = mjonBlockService.selectAddrBlockDetail(mjonBlockVO); LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null; String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId()); String userName = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getName()); String mobile = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getMoblphonNo()); if(userId.equals("")) { isSuccess = false; modelAndView.addObject("isSuccess", isSuccess); modelAndView.addObject("msg", "로그인 후 이용이 가능합니다."); return modelAndView; } else { mjonBlockVO.setUserId(userId); } // Step1. 문자발송 String[] phones = {mjonBlockVO.getPhone()}; Map mapInfo = new HashMap(); mapInfo = sendMsgData(userId, userName, mobile, phones); isSuccess = Boolean.parseBoolean((mapInfo.get("IsSuccess").toString())); msg = mapInfo.get("Msg").toString(); System.out.println("isSuccess : " + isSuccess); if (isSuccess == true) { // Step2. 수신거부 결과전송 업데이트 mjonBlockService.updateBlockResult(mjonBlockVO); } } catch(Exception e) { isSuccess = false; msg = e.getMessage(); } modelAndView.addObject("isSuccess", isSuccess); modelAndView.addObject("msg", msg); return modelAndView; } // 문자발송 public Map sendMsgData(String userId, String userName, String mobile, String[] phones) throws Exception{ boolean isSuccess = true; String msg = "문자 전송이 완료되었습니다."; Date nowDate = new Date(); SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy.MM.dd"); SimpleDateFormat simpleDateFormat2 = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss"); String smsTxt = "문자온" + System.lineSeparator() + " 전송자 : " + userName + System.lineSeparator() + "수신거부일자 : " + simpleDateFormat.format(nowDate) + System.lineSeparator() + "처리결과 : 수신거부 완료"; MjonMsgVO mjonMsgVO = new MjonMsgVO(); //개별문자 가격 및 총 금액 셋팅해주기 - 시스템 기본 단가기준으로 입력해줌 //1.시스템 기본 단가 정보 불러오기 JoinSettingVO sysJoinSetVO = mjonMsgDataService.selectJoinSettingInfo(); //2.사용자 개인 단가 정보 불러오기 MberManageVO mberManageVO = new MberManageVO(); float shortPrice = 0; if(!userId.equals("")) { mberManageVO = mjonMsgDataService.selectMberManageInfo(userId); //3.사용자 개인단가 정보가 0이 아니면 개인단가 사용, 없으면 시스템 기본 단가 사용 shortPrice = mberManageVO.getShortPrice(); } if(shortPrice < 1) { shortPrice = sysJoinSetVO.getShortPrice(); } mjonMsgVO.setTotPrice(Float.toString(shortPrice)); mjonMsgVO.setEachPrice(Float.toString(shortPrice)); mjonMsgVO.setFileCnt("0"); mjonMsgVO.setCurState("3"); mjonMsgVO.setReserveYn("N"); // 즉시 전송 mjonMsgVO.setMsgGroupCnt("0"); mjonMsgVO.setUserId(userId); mjonMsgVO.setMsgType("4"); // 단문전송 mjonMsgVO.setMsgKind("N"); // 일반 mjonMsgVO.setMsgPayCode("SMS"); mjonMsgVO.setCallToList(phones); mjonMsgVO.setCallFrom(mobile); mjonMsgVO.setReqDate(simpleDateFormat2.format(nowDate)); mjonMsgVO.setSmsTxt(smsTxt); try { // 전송사 전송 배분 MjonMsgVO pramVO = new MjonMsgVO(); List sendRateList = mjonMsgService.selectTodayAgentSendCntList(pramVO); // 전송사 전송 배분률 및 현재 전송건수 조회 for (MjonMsgVO tmpVO : sendRateList) { float cnt = Float.parseFloat(tmpVO.getMsgGroupCnt()); float totCnt = tmpVO.getTotCnt(); tmpVO.setSendRateInfo(Float.parseFloat(tmpVO.getSendRate()) - (cnt / totCnt * 100)); // 배분률 - 현재전송 비율 } String sendAgent = sendRateList.get(0).getAgentCode(); float maxRate = sendRateList.get(0).getSendRateInfo(); for (MjonMsgVO tmpVO : sendRateList) { // 배분률 대비 현재전송 비율이 가장 적은거 찾기 if (maxRate < tmpVO.getSendRateInfo()) { maxRate = tmpVO.getSendRateInfo(); sendAgent = tmpVO.getAgentCode(); } } //전송사 구분 코드 - 01 : 아이하트, 02 : 현대 퓨쳐넷, 03 : 아이엠오 //mjonMsgVO.setAgentCode("01"); // 하드코딩 //sendAgent = "02"; mjonMsgVO.setAgentCode(sendAgent); if(mjonMsgVO.getAgentCode().equals("03")) { //아이엠오 전송사 문자 타입 설정해 주기 // 단순 장문 문자는 neoType : 2, 그림 포함 : 4 if(mjonMsgVO.getFileCnt().equals("0")) { // 단순 장문 문자 mjonMsgVO.setNeoType("2"); }else{ // 그림포함 문자인경우 mjonMsgVO.setNeoType("4"); } } //현재 고객의 보유 캐시가 문자 발송이 가능한 금액인지 체크 String userMoney = mjonMsgDataService.selectBeforeCashData(mjonMsgVO); String userPoint = mjonMsgDataService.selectBeforePointData(mjonMsgVO); mjonMsgVO.setBefPoint(userPoint); //현재 보유 포인트 정보 저장 String totPrice = mjonMsgVO.getTotPrice(); BigDecimal befCash = new BigDecimal(userMoney).setScale(2, RoundingMode.HALF_EVEN); BigDecimal totMsgPrice = new BigDecimal(totPrice).setScale(2, RoundingMode.HALF_EVEN); //현재 보유 금액이 발송 문자 총 금액보다 클 경우만 문자 발송 //BigDecimal 비교 연산 // befCash(현재 보유금액) 값이 totMsgPrice(문자전송 금액) 보다 많으면 문자 전송 if(befCash.compareTo(totMsgPrice) == 1) { // -1 : befCash > totMsgPrice, 0 : befCash = totMsgPrice, 1 : befCash < totMsgPrice, //문자 발송 처리 mjonMsgDataService.insertMsgDataByBlockInfo(mjonMsgVO); } else { isSuccess = false; msg = "문자 발송에 필요한 보유 잔액이 부족 합니다."; } } catch(Exception e) { isSuccess = false; msg = "기타 시스템 오류 : " + e.getMessage(); } Map mapInfo = new HashMap(); mapInfo.put("IsSuccess", isSuccess); mapInfo.put("Msg", msg); return mapInfo; } /** * 주소록 수신거부 - 엑셀파일 불러오기 * @param body * @param uploadFile * @param search * @param result * @param model * @param request * @return * @throws Exception */ @RequestMapping(value = "/web/mjon/addrBlock/sendExelFilePhoneNumAjax.do") @ResponseBody public Object sendExelFilePhoneNumAjax(final MultipartHttpServletRequest multiRequest) throws Exception { JsonResult jr = new JsonResult(); jr.setSuccess(false); jr.setMessage("엑셀 파일만 업로드할 수 있습니다."); //final Map files = multiRequest.getFileMap(); 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 = ""; //String phoneRegExp = "^01(?:0|1|[6-9])[.-]?(\\d{3}|\\d{4})[.-]?(\\d{4})$"; String phoneRegExp = "^(050[234567]{1}|01[016789]{1})-?[0-9]{3,4}-?[0-9]{4}$"; int errPhoneCnt = 0; //엑셀 확장자에 따른 처리 로직 분리 if(Ext.equals("xls")) { HSSFWorkbook workbook = new HSSFWorkbook(files.get(0).getInputStream()); HSSFSheet sheet = workbook.getSheetAt(0); if(sheet.getLastRowNum() > 20000) { // errMessage = "20000건 이상의 업로드는 데이터 부하로 업로드 할수 없습니다."; jr.setSuccess(false); jr.setMessage(errMessage); return jr; } List> json = new ArrayList>(); PhoneVO pVO = new PhoneVO(); for(int i=2; i< sheet.getLastRowNum() + 2; i++){ //먼저 밸리데이션 체크(1줄은 생략) HSSFRow row = sheet.getRow(i); //열읽기 if(null == row) { continue; } HashMap jm = new HashMap<>(); // 행의 두번째 열(핸드폰부터 받아오기) HSSFCell cell = null; for(int j = 0 ; j < 3; j++){ //행읽기(6행까지나 2행까지만 필요) cellValue = ""; cell = row.getCell(j); //핸드폰/이름/메모 if(null == cell || "".equals(cell.toString().trim())) { //셀에 값이 없으면 if(j == 1) { if (sheet.getLastRowNum() == i) { continue; } //errPhoneCnt++; //errSts = false; 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) { //이름 jm.put("name", cellValue); } if(j == 1) { //전화번호 if(cellValue.matches(phoneRegExp)) { jm.put("phone", cellValue); }else { errPhoneCnt++; } } if(j == 2) { //메모 jm.put("memo", cellValue); } } if(null != jm.get("phone")) { json.add(jm); } } jr.setData(json); jr.setSuccess(true); if(errPhoneCnt > 0) { jr.setMessage("올바르지 않은 휴대폰 번호가 "+ errPhoneCnt +" 건 있습니다."); }else { jr.setMessage(""); } }else { //확장자가 xlsx OPCPackage opcPackage = OPCPackage.open(files.get(0).getInputStream()); XSSFWorkbook workbook = new XSSFWorkbook(opcPackage); XSSFSheet sheet = workbook.getSheetAt(0); // 첫번째 시트 불러오기 opcPackage.close(); if(sheet.getLastRowNum() > 20000) { // errMessage = "20000건 이상의 업로드는 데이터 부하로 업로드 할수 없습니다."; jr.setSuccess(false); jr.setMessage(errMessage); return jr; } List> json = new ArrayList>(); PhoneVO pVO = new PhoneVO(); for(int i=2; i< sheet.getLastRowNum() + 2; i++){ //먼저 밸리데이션 체크(1줄은 생략) XSSFRow row = sheet.getRow(i); //열읽기 if(null == row) { continue; } HashMap jm = new HashMap<>(); // 행의 두번째 열(핸드폰부터 받아오기) XSSFCell cell = null; for(int j = 0 ; j < 3; j++){ //행읽기(6행까지나 2행까지만 필요) cellValue = ""; cell = row.getCell(j); //핸드폰/이름/메모 // 핸드폰만 공백체크 if(null == cell || "".equals(cell.toString().trim())) { //셀에 값이 없으면 if(j == 1) { if (sheet.getLastRowNum() == i) { continue; } //errPhoneCnt++; //errSts = false; 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) { //이름 jm.put("name", cellValue); } if(j == 1) { //전화번호 if(cellValue.matches(phoneRegExp)) { jm.put("phone", cellValue); }else { errPhoneCnt++; } } if(j == 2) { //메모 jm.put("memo", cellValue); } } if(null != jm.get("phone")) { json.add(jm); } } jr.setData(json); jr.setSuccess(true); if(errPhoneCnt > 0) { jr.setMessage("올바르지 않은 휴대폰 번호가 "+ errPhoneCnt +" 건 있습니다."); }else { jr.setMessage(""); } } //xlsx 처리 끝 } } return jr; } /** * 주소록 수신거부 - TXT파일 불러오기 * @param body * @param uploadFile * @param search * @param result * @param model * @param request * @return * @throws Exception */ @RequestMapping(value = "/web/mjon/addrBlock/sendTxtFilePhoneNumAjax.do") @ResponseBody public Object sendTxtFilePhoneNumAjax(final MultipartHttpServletRequest multiRequest) throws Exception { JsonResult jr = new JsonResult(); jr.setSuccess(false); jr.setMessage("TXT 파일만 업로드할 수 있습니다."); List files = (List) multiRequest.getFiles("file0"); if(!files.isEmpty()) { if (files.get(0).getSize() > 0 || files.get(0).getOriginalFilename().split("[.]")[1].indexOf("txt") > -1) { // txt 파일 용량 3MB이상 시 10만건 이상으로 서버가 다운되는 증상 발생 long fileSize = multiRequest.getFile("file0").getSize(); if(fileSize > 3374653) { jr.setMessage("txt 파일은 3MB를 넘을수 없습니다."); return jr; } //Multi file to file 변환해주기 File file = new File(files.get(0).getOriginalFilename()); file.createNewFile(); FileOutputStream fos = new FileOutputStream(file); fos.write(files.get(0).getBytes()); fos.close(); BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(file))); String line = null; String[] splitedStr = null; String[] tempStr = null; int errPhoneCnt = 0; //String phoneRegExp = "^01(?:0|1|[6-9])[.-]?(\\d{3}|\\d{4})[.-]?(\\d{4})$"; String phoneRegExp = "^(050[234567]{1}|01[016789]{1})-?[0-9]{3,4}-?[0-9]{4}$"; List> json = new ArrayList>(); //파일 읽어서 탭으로 구분해주기 while ((line = reader.readLine()) != null) { HashMap jm = new HashMap<>(); splitedStr = null; tempStr = null; //txt 파일의 데이터가 탭 혹은 콤마로 구분되어 있는지 구분처리 tempStr = line.split("\\,"); if(tempStr.length > 1) { splitedStr = line.split("\\,"); }else { splitedStr = line.split("\t");; } for (int i = 0; i < splitedStr.length; i++) { splitedStr[i] = splitedStr[i].trim(); if(i == 0) { //이름 jm.put("name", splitedStr[i]); } if(i == 1) { if(splitedStr[i].matches(phoneRegExp)) { //휴대폰 번호 jm.put("phone", splitedStr[i]); }else { errPhoneCnt++; } } if(i == 2) { //메모 jm.put("memo", splitedStr[i]); } } if(jm.get("phone") != null) { json.add(jm); } } // end while jr.setData(json); jr.setSuccess(true); if(errPhoneCnt > 0) { jr.setMessage("올바르지 않은 휴대폰 번호가 "+ errPhoneCnt +" 건 있습니다."); }else { jr.setMessage(""); } } } return jr; } //수신거부 엑셀 다운로드 @RequestMapping(value= {"/web/mjon/addrBlock/BlockExcelDownload.do"}) public void BlockExcelDownload( MjonBlockVO blockVO, HttpServletRequest request, HttpServletResponse response , ModelMap model) throws Exception { blockVO.setRecordCountPerPage(100000); blockVO.setFirstIndex(0); LoginVO loginVO = (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser(); //로그인 권한정보 불러오기 String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId()); if(userId != "") { blockVO.setUserId(userId); } // 메모리에 100개의 행을 유지합니다. 행의 수가 넘으면 디스크에 적습니다. SXSSFWorkbook wb = new SXSSFWorkbook(100); CellStyle style = wb.createCellStyle(); style.setBorderBottom(CellStyle.BORDER_THIN); //테두리 두껍게 style.setBorderLeft(CellStyle.BORDER_THIN); style.setBorderRight(CellStyle.BORDER_THIN); style.setBorderTop(CellStyle.BORDER_THIN); Font font = wb.createFont(); font.setBoldweight(Font.BOLDWEIGHT_BOLD); //글씨 bold Cell cell = null; Row row = null; String fileName ="수신거부 엑셀 리스트"; String sheetTitle = ""; try { if("".equals(blockVO.getSearchSortCnd())){ //최초조회시 최신것 조회List blockVO.setSearchSortCnd("blockId"); blockVO.setSearchSortOrd("desc"); } // 수신거부형태 (1: 080 자동수신거부, 2: 직접등록) List resultList = mjonBlockService.selectBlockList(blockVO); { //화면 리스트 sheetTitle = "수신거부내역" ; //제목 Sheet sheet = wb.createSheet(sheetTitle); row = sheet.createRow(0); for(int i=0 ; i < sendBlockExcelValue.length ; i++) { cell = row.createCell(i); cell.setCellStyle(style); cell.setCellValue(sendBlockExcelValue[i][1]); } for(int i=0; i < resultList.size(); i++){ row = sheet.createRow(i+1); for(int j=0 ; j < sendBlockExcelValue.length ; j++) { cell = row.createCell(j); cell.setCellStyle(style); if(j==0) cell.setCellValue(i+1); //번호 if(j==1) cell.setCellValue(((MjonBlockVO)resultList.get(i)).getBlockTypeName()); //형태 if(j==2) cell.setCellValue(((MjonBlockVO)resultList.get(i)).getPhone()); //거부번호 if(j==3) cell.setCellValue(((MjonBlockVO)resultList.get(i)).getName()); //수신자 if(j==4) cell.setCellValue(((MjonBlockVO)resultList.get(i)).getRegDate()); //등록일시 if(j==5) cell.setCellValue(((MjonBlockVO)resultList.get(i)).getMemo()); //메모 } } } response.setHeader("Set-Cookie", "fileDownload=true; path=/"); SimpleDateFormat mSimpleDateFormat = new SimpleDateFormat ( "yyyy_MM_dd_HH_mm_ss", Locale.KOREA ); Date currentTime = new Date (); String mTime = mSimpleDateFormat.format ( currentTime ); fileName = fileName+"("+mTime+")"; response.setHeader("Content-Disposition", String.format("attachment; filename=\""+new String((fileName).getBytes("KSC5601"),"8859_1")+".xlsx")); wb.write(response.getOutputStream()); }catch(Exception e) { response.setHeader("Set-Cookie", "fileDownload=false; path=/"); response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); response.setHeader("Content-Type","text/html; charset=utf-8"); OutputStream out = null; try { out = response.getOutputStream(); byte[] data = new String("fail..").getBytes(); out.write(data, 0, data.length); } catch(Exception ignore) { ignore.printStackTrace(); } finally { if(out != null) try { out.close(); } catch(Exception ignore) {} } }finally { // 디스크 적었던 임시파일을 제거합니다. wb.dispose(); try { wb.close(); } catch(Exception ignore) {} } } }