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) {}
}
}
}