File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
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
*
* <pre>
* << 개정이력(Modification Information) >>
*
* 수정일 수정자 수정내용
* ------- -------- ---------------------------
* 2022.03.17 ITN 최초 생성
*
* </pre>
*/
@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<MjonBlockVO> 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<String, Object> mapInfo = new HashMap<String, Object>();
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<String, Object> 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<MjonMsgVO> 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<String, Object> mapInfo = new HashMap<String, Object>();
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<String, MultipartFile> files = multiRequest.getFileMap();
List<MultipartFile> files = (List<MultipartFile>) 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<HashMap<String, String>> json = new ArrayList<HashMap<String, String>>();
PhoneVO pVO = new PhoneVO();
for(int i=2; i< sheet.getLastRowNum() + 2; i++){ //먼저 밸리데이션 체크(1줄은 생략)
HSSFRow row = sheet.getRow(i); //열읽기
if(null == row) {
continue;
}
HashMap<String, String> 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<HashMap<String, String>> json = new ArrayList<HashMap<String, String>>();
PhoneVO pVO = new PhoneVO();
for(int i=2; i< sheet.getLastRowNum() + 2; i++){ //먼저 밸리데이션 체크(1줄은 생략)
XSSFRow row = sheet.getRow(i); //열읽기
if(null == row) {
continue;
}
HashMap<String, String> 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<MultipartFile> files = (List<MultipartFile>) 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;
}
BufferedReader reader = new BufferedReader(new InputStreamReader(multiRequest.getFile("file0").getInputStream()));
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<HashMap<String, String>> json = new ArrayList<HashMap<String, String>>();
//파일 읽어서 탭으로 구분해주기
while ((line = reader.readLine()) != null) {
HashMap<String, String> 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<MjonBlockVO> 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) {}
}
}
}