package itn.let.mjo.msgcampain.web; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStreamReader; import java.math.BigDecimal; import java.math.RoundingMode; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.Calendar; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; 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.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.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.ui.ModelMap; import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestBody; 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.bind.support.SessionStatus; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartHttpServletRequest; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.support.RedirectAttributes; import egovframework.rte.fdl.idgnr.EgovIdGnrService; import egovframework.rte.fdl.security.userdetails.util.EgovUserDetailsHelper; import egovframework.rte.psl.dataaccess.util.EgovMap; import egovframework.rte.ptl.mvc.tags.ui.pagination.PaginationInfo; import itn.com.cmm.ComDefaultCodeVO; import itn.com.cmm.EgovMessageSource; import itn.com.cmm.JsonResult; import itn.com.cmm.LoginVO; import itn.com.cmm.service.EgovCmmUseService; import itn.com.cmm.service.EgovFileMngService; import itn.com.cmm.service.EgovFileMngUtil; import itn.com.cmm.service.FileVO; import itn.com.cmm.util.MJUtil; import itn.com.cmm.util.StringUtil; import itn.com.utl.fcc.service.EgovStringUtil; import itn.let.lett.service.HashConfVO; import itn.let.lett.service.LetterService; import itn.let.lett.service.LetterVO; import itn.let.mjo.addr.service.AddrGroupService; import itn.let.mjo.addr.service.AddrGroupVO; import itn.let.mjo.addr.service.AddrService; import itn.let.mjo.addr.service.AddrVO; import itn.let.mjo.event.service.MjonEventService; import itn.let.mjo.event.service.MjonEventVO; import itn.let.mjo.mjocommon.MjonCommon; import itn.let.mjo.msg.service.MjonMsgService; import itn.let.mjo.msg.service.MjonMsgVO; import itn.let.mjo.msgcampain.service.MjonCandidateService; import itn.let.mjo.msgcampain.service.MjonCandidateVO; import itn.let.mjo.msgdata.service.MjonMsgDataService; import itn.let.mjo.msgdata.service.MjonMsgDataVO; import itn.let.mjo.msgdata.service.MjonMsgReturnVO; import itn.let.mjo.msgdata.service.PhoneVO; import itn.let.mjo.pay.service.MjonPayService; import itn.let.mjo.pay.service.MjonPayVO; import itn.let.mjo.spammsg.service.MjonSpamMsgService; import itn.let.mjo.symbol.service.MjonSymbolService; import itn.let.mjo.symbol.service.MjonSymbolVO; import itn.let.sym.ccm.cde.service.CateCode; import itn.let.sym.ccm.cde.service.EgovCcmCmmnDetailCodeManageService; import itn.let.sym.grd.service.MberGrdService; import itn.let.sym.site.service.EgovSiteManagerService; import itn.let.sym.site.service.JoinSettingVO; import itn.let.uss.umt.service.EgovMberManageService; import itn.let.uss.umt.service.EgovUserManageService; import itn.let.uss.umt.service.MberManageVO; import itn.let.uss.umt.service.UserManageVO; import itn.let.utl.fcc.service.EgovCryptoUtil; @Controller public class MjonMsgCampainDataController { @Resource(name = "mjonMsgService") private MjonMsgService mjonMsgService; @Resource(name = "mjonPayService") private MjonPayService mjonPayService; @Resource(name = "MjonMsgDataService") private MjonMsgDataService mjonMsgDataService; @Resource(name = "LetterService") private LetterService letterService; @Resource(name = "mjonSymbolService") private MjonSymbolService mjonSymbolService; /** mberManageService */ @Resource(name = "mberManageService") private EgovMberManageService mberManageService; @Resource (name = "AddrService") private AddrService addrService; @Resource (name = "AddrGroupService") private AddrGroupService addrGroupService; @Resource(name = "mjonCandidateService") private MjonCandidateService mjonCandidateService; @Resource(name = "EgovCmmUseService") private EgovCmmUseService cmmUseService; /** EgovMessageSource */ @Resource(name="egovMessageSource") EgovMessageSource egovMessageSource; @Resource(name="EgovFileMngUtil") private EgovFileMngUtil fileUtil; @Resource(name="EgovFileMngService") private EgovFileMngService fileMngService; /* 암복호화 */ @Resource(name = "egovCryptoUtil") EgovCryptoUtil egovCryptoUtil; @Resource(name = "egovMjonMsgGroupIdGnrService") private EgovIdGnrService idgenMjonMsgGroupId; @Resource(name = "egovMjonCashIdGnrService") private EgovIdGnrService idgenMjonCashId; @Resource(name = "CmmnDetailCodeManageService") private EgovCcmCmmnDetailCodeManageService cmmnDetailCodeManageService; /** 첨부파일 저장경로 */ @Value("#{globalSettings['Globals.file.saveDir']}") private String fileSaveDir; /** userManageService */ @Resource(name = "userManageService") private EgovUserManageService userManageService; @Resource(name = "MjonEventService") private MjonEventService mjonEventService; @Resource(name = "mjonSpamMsgService") private MjonSpamMsgService mjonSpamMsgService; /** 사이트 설정 */ @Resource(name = "egovSiteManagerService") EgovSiteManagerService egovSiteManagerService; /** 등급제 관리 서비스 */ @Resource(name = "mberGrdService") MberGrdService mberGrdService; private static final Logger logger = LoggerFactory.getLogger(MjonMsgCampainDataController.class); /** * 선거 문자 발송 화면 * @param searchVO * @param model * @return "/web/mjon/msgcampain/selectMsgDataView.do" * @throws Exception */ @RequestMapping(value= {"/web/mjon/msgcampain/selectMsgDataView.do"}) public String selectMsgDataView(@ModelAttribute("searchVO") MjonMsgDataVO searchVO , CateCode cateCode , HttpServletRequest request , ModelMap model) throws Exception{ String categoryType = cateCode.getCateType(); if(categoryType == null) { categoryType = "N"; } // 문자 카테고리 리스트 불러오기 List cateConfList = letterService.selectCateConfWithList(categoryType); model.addAttribute("cateCodeList", cateConfList); // 문자 해쉬태그 리스트 불러오기 String msgType = "M"; List hashTagList = letterService.selectHashTagWithList(msgType); model.addAttribute("hashTagList", hashTagList); // 문자 리스트 불러오기 LetterVO letterVO = new LetterVO(); if(letterVO.getPageUnit() != 10) { letterVO.setPageUnit(letterVO.getPageUnit()); } //로그인 권한정보 불러오기 LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null; model.addAttribute("loginVO", loginVO); for(int i=0 ; i < cateConfList.size(); i++) { if("선거".equals(cateConfList.get(i).getCateNm())) { letterVO.setCategoryCode(cateConfList.get(i).getCateCode()); } } //주소록에서 선택시 넘어오는 파라미터 if("Y".equals(searchVO.getMoveAddrFlag())) { model.addAttribute("addrVO", searchVO); } //주소록에서 선택시 넘어오는 파라미터 if("Y".equals(searchVO.getMoveAddrAllFlag())) { AddrVO addrVO = new AddrVO(); String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId()); if(userId != "") { addrVO.setMberId(userId); } addrVO.setRecordCountPerPage(100000); addrVO.setFirstIndex(0); addrVO.setSearchAddrGrpId(request.getParameter("searchAddrGrpId")); addrVO.setSearchCondition(request.getParameter("searchCondition")); addrVO.setSearchKeyword(request.getParameter("searchKeyword")); addrVO.setStartKeyword(request.getParameter("startKeyword")); List addrList = addrService.selectAddrList(addrVO); List addrIdList = new ArrayList(); for(AddrVO item : addrList) { addrIdList.add(item.getAddrId()); } searchVO.setAddrIdList(addrIdList); searchVO.setMoveAddrFlag("Y"); model.addAttribute("addrVO", searchVO); } /** pageing */ PaginationInfo paginationInfo = new PaginationInfo(); paginationInfo.setCurrentPageNo(letterVO.getPageIndex()); paginationInfo.setRecordCountPerPage(letterVO.getPageUnit()); paginationInfo.setPageSize(letterVO.getPageSize()); letterVO.setFirstIndex(paginationInfo.getFirstRecordIndex()); letterVO.setLastIndex(paginationInfo.getLastRecordIndex()); letterVO.setRecordCountPerPage(paginationInfo.getRecordCountPerPage()); List resultPhoList = mjonMsgDataService.selectPhotoLetterList(letterVO); model.addAttribute("resultPhoList", resultPhoList); paginationInfo.setTotalRecordCount( resultPhoList.size()> 0 ? ((Long)((EgovMap)resultPhoList.get(0)).get("totCnt")).intValue() : 0); model.addAttribute("paginationInfo", paginationInfo); //발송결과 문자 재전송에서 넘어오는 경우 파마리터 전달 List temp = searchVO.getMsgSeqList(); if(temp != null) { model.addAttribute("reSendMsgVO", searchVO); } model.addAttribute("letterVO", letterVO); return "web/msgcampain/MsgDataView"; } /** * 선거 문자 발송 단문/장문/그림문자 전송 화면 * @param searchVO * @param model * @return "/web/mjon/msgcampain/selectMsgDataSMLViewAjax.do" * @throws Exception */ @RequestMapping(value= {"/web/mjon/msgcampain/selectMsgDataSMLViewAjax.do"}) public String selectMsgDataSMLView(@ModelAttribute("searchVO") MjonMsgDataVO searchVO, CateCode cateCode, ModelMap model) throws Exception{ //로그인 권한정보 불러오기 LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null; String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId()); String author = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getAuthority()); String categoryType = cateCode.getCateType(); if(categoryType == null) { categoryType = "N"; } //문자 전송 개인 단가 불러오기 //0.이벤트 진행중이 회원 정보 불러오기. //이벤트 회원 정보 테이블에서 대상자의 정보를 불러온다. MjonEventVO mjonEventVO = new MjonEventVO(); mjonEventVO.setMberId(userId); MjonEventVO eventMberInfo = mjonEventService.selectEventMsgMberDefaultInfo(mjonEventVO); long eventDiffDate = 0; float eventRemainCash = 0; boolean compareEndDate = false; if(eventMberInfo != null) { String eventEndDate = eventMberInfo.getEventEndDate(); /** * MJUtil.getCompareDate() * 현재 날짜와 파라미터 전달 날짜를 비교 * 전달날짜를 지난경우 False를 리턴함. * 현재날짜 이전 혹은 같은 날짜면 True를 리턴함. * * */ if(eventEndDate != null) { compareEndDate = MJUtil.getCompareDate(eventEndDate); eventRemainCash = (float) eventMberInfo.getEventRemainCash(); //이벤트 종료 일자가 지난 경우, 이벤트 상태가 종료아 아니면 종료 처리 시킴 //이벤트 남은 캐시가 단문 발송금액 7.5원 보다 낮으면 이벤트 종료 시킴 if(!compareEndDate || eventRemainCash < 7.5) { if(!eventMberInfo.getEventStatus().equals("E")) { //이벤트 상태값을 종료로 변경한다. mjonEventVO.setEventInfoId(eventMberInfo.getEventInfoId()); mjonEventVO.setEventStatus("E"); mjonEventVO.setEventMemo("이벤트 발송 최소 금액(7.5) 부족 혹은 이벤트 종료일 초과되어 이벤트 종료 시킴"); mjonEventVO.setEventRemainCash(eventRemainCash); mjonEventService.updateEventEndStatus(mjonEventVO); eventMberInfo.setEventStatus("E"); } }else {//이벤트 진행중이면 남은 날짜 계산해서 전달. /** * MJUtil.getDiffDateDay() * 현재 날짜와 파라미터 날짜 사이의 날짜 수를 계산해줌. * * */ eventDiffDate = MJUtil.getDiffDateDay(eventEndDate); } } } //남은 날짜값을 절대값으로 변경(음수로 나오기 때문) model.addAttribute("eventDiffDate", Math.abs(eventDiffDate)); model.addAttribute("compareEndDate", compareEndDate); model.addAttribute("eventRemainCash", eventRemainCash); model.addAttribute("eventMberInfo", eventMberInfo); //1.시스템 기본 단가 정보 불러오기 JoinSettingVO sysJoinSetVO = mjonMsgDataService.selectJoinSettingInfo(); // 등급제 단가 추출 => 시스템 단가에 적용 sysJoinSetVO = mberGrdService.selectMberGrdDefaultInfo(sysJoinSetVO, userId); //2.사용자 개인 단가 정보 불러오기 MberManageVO mberManageVO = new MberManageVO(); if(!userId.equals("") && !author.equals("ROLE_ADMIN")) { mberManageVO = mjonMsgDataService.selectMberManageInfo(userId); searchVO.setUserId(userId); } model.addAttribute("exceptSpamYn", mberManageVO.getExceptSpamYn()); //3.사용자 개인단가 정보가 0이 아니면 개인단가 사용, 없으면 시스템 기본 단가 사용 Float shortPrice = mberManageVO.getShortPrice(); Float longPrice = mberManageVO.getLongPrice(); Float picturePrice = mberManageVO.getPicturePrice(); Float picture2Price = mberManageVO.getPicture2Price(); Float picture3Price = mberManageVO.getPicture3Price(); BigDecimal userMoney = new BigDecimal(mberManageVO.getUserMoney()).setScale(2, RoundingMode.HALF_EVEN); //일반 단가정보 저장 변수 셋팅 - 이벤트 캐시 부족시 일반단가로 계산하기 위해서임.20230328, 우영두추가 Float norShortPrice = mberManageVO.getShortPrice(); Float norLongPrice = mberManageVO.getLongPrice(); Float norPicturePrice = mberManageVO.getPicturePrice(); Float norPicture2Price = mberManageVO.getPicture2Price(); Float norPicture3Price = mberManageVO.getPicture3Price(); //기존 소수점 2째자리에서 반올림하였으나, 정책 변경으로 소수점 버림 처리함 20220623 /*int shortPrice = (int) mberManageVO.getShortPrice(); int longPrice = (int) mberManageVO.getLongPrice(); int picturePrice = (int) mberManageVO.getPicturePrice(); int picture2Price = (int) mberManageVO.getPicture2Price(); int picture3Price = (int) mberManageVO.getPicture3Price(); int userMoney = (int) mberManageVO.getUserMoney();*/ String userPoint = mberManageVO.getUserPoint(); //이벤트 진행 회원의 발송 단가 처리해주기 if(eventMberInfo != null && eventMberInfo.getEventStatus().equals("Y") && compareEndDate) { shortPrice = Float.parseFloat(eventMberInfo.getEventShortPrice()); longPrice = Float.parseFloat(eventMberInfo.getEventLongPrice()); picturePrice = Float.parseFloat(eventMberInfo.getEventPicturePrice()); picture2Price = Float.parseFloat(eventMberInfo.getEventPicture2Price()); picture3Price = Float.parseFloat(eventMberInfo.getEventPicture3Price()); //이벤트 캐시 부족시 일반단가로 계산하기 위해서임.20230328, 우영두추가 if(shortPrice < 1 || longPrice < 1 || picturePrice < 1) {//이벤트 단가 적용시 일반단가도 필요하여 셋팅 해줌. norShortPrice = (float) sysJoinSetVO.getShortPrice(); norLongPrice = (float) sysJoinSetVO.getLongPrice(); norPicturePrice = (float) sysJoinSetVO.getPicturePrice(); norPicture2Price = (float) sysJoinSetVO.getPicture2Price(); norPicture3Price = (float) sysJoinSetVO.getPicture3Price(); } }else if(shortPrice < 1 || longPrice < 1 || picturePrice < 1) { shortPrice = (float) sysJoinSetVO.getShortPrice(); longPrice = (float) sysJoinSetVO.getLongPrice(); picturePrice = (float) sysJoinSetVO.getPicturePrice(); picture2Price = (float) sysJoinSetVO.getPicture2Price(); picture3Price = (float) sysJoinSetVO.getPicture3Price(); } model.addAttribute("shortPrice", shortPrice); model.addAttribute("longPrice", longPrice); model.addAttribute("picturePrice", picturePrice); model.addAttribute("picture2Price", picture2Price); model.addAttribute("picture3Price", picture3Price); model.addAttribute("userMoney", userMoney); model.addAttribute("userPoint", userPoint); //이벤트 캐시 부족시 일반단가로 계산하기 위해서임.20230328, 우영두추가 if(norShortPrice < 1 || norLongPrice < 1 || norPicturePrice < 1) {//협의 단가가 없는 경우 일반단가에 시스템 단가로 셋팅해줌 norShortPrice = (float) sysJoinSetVO.getShortPrice(); norLongPrice = (float) sysJoinSetVO.getLongPrice(); norPicturePrice = (float) sysJoinSetVO.getPicturePrice(); norPicture2Price = (float) sysJoinSetVO.getPicture2Price(); norPicture3Price = (float) sysJoinSetVO.getPicture3Price(); } model.addAttribute("norShortPrice", norShortPrice); model.addAttribute("norLongPrice", norLongPrice); model.addAttribute("norPicturePrice", norPicturePrice); model.addAttribute("norPicture2Price", norPicture2Price); model.addAttribute("norPicture3Price", norPicture3Price); //선거 후보자 정보 불러오기 MjonCandidateVO mjonCandidateVO = new MjonCandidateVO(); if(userId != ""){ mjonCandidateVO = mjonCandidateService.selectCandidateDataInfo(userId); //String cryptText = egovCryptoUtil.encrypt(plainText); if(mjonCandidateVO != null) { // 주민번호 복호화 하기 String regidentNo1 = egovCryptoUtil.decrypt(mjonCandidateVO.getRegidentNo1()); String regidentNo2 = egovCryptoUtil.decrypt(mjonCandidateVO.getRegidentNo2()); mjonCandidateVO.setRegidentNo1(regidentNo1); mjonCandidateVO.setRegidentNo2(regidentNo2); } } model.addAttribute("mjonCandidateVO", mjonCandidateVO); // 이메일 코드조회 ComDefaultCodeVO voComCode = new ComDefaultCodeVO(); voComCode.setCodeId("ITN031"); model.addAttribute("emailCode", cmmUseService.selectCmmCodeDetail(voComCode)); if(!userId.equals("")) {//로그인 했을때만 발신번호 리스트 불러오기 //아이디 발신번호 리스트 불러오기. List resultSendPhonList = mjonMsgDataService.selectSendPhonNumList(userId); List resultPhonList = new ArrayList(); MJUtil mjUtil = new MJUtil(); for(String phone : resultSendPhonList) { resultPhonList.add(mjUtil.addDash(phone)); } model.addAttribute("resultPhonList", resultPhonList); } // 문자 카테고리 리스트 불러오기 List cateConfList = letterService.selectCateConfWithList(categoryType); model.addAttribute("cateCodeList", cateConfList); //그림 문자 리스트 불러오기 LetterVO letterVO = new LetterVO(); if(letterVO.getPageUnit() != 10) { letterVO.setPageUnit(letterVO.getPageUnit()); } MjonSymbolVO symbolVO = new MjonSymbolVO(); // 특수문자 리스트 불러오기 List symbolList = mjonSymbolService.selectMjonSymbolList(symbolVO); model.addAttribute("symbolList", symbolList); //최근 전송 내역 Calendar cal = Calendar.getInstance(); Date now = new Date(); SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd"); cal.setTime(now); cal.add(Calendar.DATE, -3); String chkDate = format.format(cal.getTime()); searchVO.setMyMsgStDt(chkDate); //검색 시작일 저장 - 현재날짜로 부터 3일 이전 날짜로 시작 List resultLatestMsgList = mjonMsgDataService.selectLatestMsgList(searchVO); model.addAttribute("resultLatestMsgList", resultLatestMsgList); //자주보내는 번호 List resultBookMarkMsgList = mjonMsgDataService.selectBookMarkMsgList(searchVO); model.addAttribute("resultBookMarkMsgList", resultBookMarkMsgList); /** pageing */ PaginationInfo paginationInfo = new PaginationInfo(); paginationInfo.setCurrentPageNo(letterVO.getPageIndex()); paginationInfo.setRecordCountPerPage(letterVO.getPageUnit()); paginationInfo.setPageSize(letterVO.getPageSize()); letterVO.setFirstIndex(paginationInfo.getFirstRecordIndex()); letterVO.setLastIndex(paginationInfo.getLastRecordIndex()); letterVO.setRecordCountPerPage(paginationInfo.getRecordCountPerPage()); List resultPhoList = mjonMsgDataService.selectPhotoLetterList(letterVO); model.addAttribute("resultPhoList", resultPhoList); paginationInfo.setTotalRecordCount( resultPhoList.size()> 0 ? ((Long)((EgovMap)resultPhoList.get(0)).get("totCnt")).intValue() : 0); model.addAttribute("paginationInfo", paginationInfo); return "web/msgcampain/MsgDataSMLView"; } /** * 선거 문자 후보자 등록 처리 * * @param letterVO * @param * @param sessionVO * @param model * @return * @throws Exception */ @RequestMapping(value= {"/web/mjon/msgcampain/insertCandidateDataInfoAjax.do"}) public ModelAndView insertCandidateDataInfoAjax( MjonCandidateVO mjonCandidateVO, HttpServletRequest req, ModelMap model) throws Exception { ModelAndView modelAndView = new ModelAndView(); modelAndView.setViewName("jsonView"); LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null; String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId()); if(userId.equals("")) { modelAndView.addObject("result", "loginFail"); modelAndView.addObject("message", "로그인이 필요합니다."); return modelAndView; }else { mjonCandidateVO.setMberId(userId); } MjonVOParamXssValues XssParam = new MjonVOParamXssValues(); int XssCnt = XssParam.buildUri(mjonCandidateVO); if(XssCnt > 0) { modelAndView.addObject("result", "fail"); modelAndView.addObject("message", "후보자 등록 정보에 잘못된 문자열이 있습니다."); return modelAndView; } int resultCnt = 0; String dataType = mjonCandidateVO.getDataType(); //주민번호 앞, 뒷 자리 암호화 처리하기 String regidentNo1 = egovCryptoUtil.encrypt(mjonCandidateVO.getRegidentNo1()); String regidentNo2 = egovCryptoUtil.encrypt(mjonCandidateVO.getRegidentNo2()); mjonCandidateVO.setRegidentNo1(regidentNo1); mjonCandidateVO.setRegidentNo2(regidentNo2); if(dataType.equals("Upt")) { resultCnt = mjonCandidateService.updateCandidateDataInfo(mjonCandidateVO); }else { resultCnt = mjonCandidateService.insertCandidateDataInfo(mjonCandidateVO); } if(resultCnt > 0 && dataType.equals("Upt")) { modelAndView.addObject("result", "success"); modelAndView.addObject("message", "후보자 정보의 수정이 완료되었습니다."); }else if(resultCnt > 0 && dataType.equals("Reg")) { modelAndView.addObject("result", "success"); modelAndView.addObject("message", "후보자 등록이 완료되었습니다."); }else { modelAndView.addObject("result", "fail"); modelAndView.addObject("message", "후보자 등록에 오류가 발생하였습니다."); } return modelAndView; } /** * 선거 문자 후보자 삭제 처리 * * @param letterVO * @param * @param sessionVO * @param model * @return * @throws Exception */ @RequestMapping(value= {"/web/mjon/msgcampain/deleteCandidateDataInfoAjax.do"}) public ModelAndView deleteCandidateDataInfoAjax( MjonCandidateVO mjonCandidateVO, HttpServletRequest req, ModelMap model) throws Exception { ModelAndView modelAndView = new ModelAndView(); modelAndView.setViewName("jsonView"); LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null; String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId()); if(userId.equals("")) { modelAndView.addObject("result", "loginFail"); modelAndView.addObject("message", "로그인이 필요합니다."); return modelAndView; }else { mjonCandidateVO.setMberId(userId); } MjonVOParamXssValues XssParam = new MjonVOParamXssValues(); int XssCnt = XssParam.buildUri(mjonCandidateVO); int resultCnt = 0; resultCnt = mjonCandidateService.deleteCandidateDataInfo(mjonCandidateVO); if(resultCnt > 0 ) { modelAndView.addObject("result", "success"); modelAndView.addObject("message", "후보자 정보의 삭제 완료되었습니다."); }else { modelAndView.addObject("result", "fail"); modelAndView.addObject("message", "후보자 삭제에 오류가 발생하였습니다."); } return modelAndView; } /** * 선거 문자재전송 내용 처리 * * @param letterVO * @param * @param sessionVO * @param model * @return * @throws Exception */ @RequestMapping(value= {"/web/mjon/msgcampain/selectReSendMsgDataListAjax.do"}) public ModelAndView selectReSendMsgDataListAjax( MjonMsgDataVO mjonMsgDataVO, HttpServletRequest req, ModelMap model) throws Exception { ModelAndView modelAndView = new ModelAndView(); modelAndView.setViewName("jsonView"); LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null; String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId()); if(userId.equals("")) { modelAndView.addObject("status", "loginFail"); modelAndView.addObject("message", "로그인이 필요합니다."); return modelAndView; }else { mjonMsgDataVO.setUserId(userId); } List msgSeqList = mjonMsgDataVO.getMsgSeqList(); List tempList = new ArrayList(); for(String seqStr : msgSeqList) { String seqId = seqStr.replace("[", ""); seqId = seqId.replace("]", ""); tempList.add(seqId); } mjonMsgDataVO.setMsgSeqList(tempList); List resultList = mjonMsgDataService.selectReSendMsgDataList(mjonMsgDataVO); int fileCnt = Integer.parseInt(resultList.get(0).getFileCnt()); MjonMsgDataVO resultMsgPhotoInfo = new MjonMsgDataVO(); if(fileCnt > 0) { MjonMsgVO resultMsgInfo = new MjonMsgVO(); //재발송 리스트의 첫번째 이미지 정보만 받아온다.(여러 발송문자를 선택 할 경우 첫번째 리스트의 정보를 사용함) resultMsgInfo.setFileType1(resultList.get(0).getFileType1()); resultMsgInfo.setFileType2(resultList.get(0).getFileType2()); resultMsgInfo.setFileType3(resultList.get(0).getFileType3()); //문자함 리스트의 첨부이미지 정보 불러오기 resultMsgPhotoInfo = mjonMsgDataService.selectMsgReSendPhotoInfo(resultMsgInfo); } if(resultList == null) { modelAndView.addObject("status", "emptyList"); modelAndView.addObject("message", "재전송 문자 내용이 없습니다."); }else { modelAndView.addObject("status", "success"); modelAndView.addObject("resultList", resultList); modelAndView.addObject("resultListCnt", resultList.size()); modelAndView.addObject("resultMsgPhotoInfo", resultMsgPhotoInfo); } return modelAndView; } /** * 선거문자 대량 문자 발송 화면 * @param searchVO * @param model * @return "/web/mjon/msgcampain/excel/selectMsgExcelDataView.do" * @throws Exception */ @RequestMapping(value= {"/web/mjon/msgcampain/excel/selectMsgExcelDataView.do"}) public String selectMsgExcelDataView(@ModelAttribute("searchVO") MjonMsgDataVO searchVO, CateCode cateCode, ModelMap model) throws Exception{ //로그인 권한정보 불러오기 LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null; model.addAttribute("loginVO", loginVO); String categoryType = cateCode.getCateType(); if(categoryType == null) { categoryType = "N"; } // 문자 카테고리 리스트 불러오기 List cateConfList = letterService.selectCateConfWithList(categoryType); model.addAttribute("cateCodeList", cateConfList); // 문자 해쉬태그 리스트 불러오기 String msgType = "M"; List hashTagList = letterService.selectHashTagWithList(msgType); model.addAttribute("hashTagList", hashTagList); // 문자 리스트 불러오기 LetterVO letterVO = new LetterVO(); if(letterVO.getPageUnit() != 10) { letterVO.setPageUnit(letterVO.getPageUnit()); } /** pageing */ PaginationInfo paginationInfo = new PaginationInfo(); paginationInfo.setCurrentPageNo(letterVO.getPageIndex()); paginationInfo.setRecordCountPerPage(letterVO.getPageUnit()); paginationInfo.setPageSize(letterVO.getPageSize()); letterVO.setFirstIndex(paginationInfo.getFirstRecordIndex()); letterVO.setLastIndex(paginationInfo.getLastRecordIndex()); letterVO.setRecordCountPerPage(paginationInfo.getRecordCountPerPage()); List resultPhoList = mjonMsgDataService.selectPhotoLetterList(letterVO); model.addAttribute("resultPhoList", resultPhoList); paginationInfo.setTotalRecordCount( resultPhoList.size()> 0 ? ((Long)((EgovMap)resultPhoList.get(0)).get("totCnt")).intValue() : 0); model.addAttribute("paginationInfo", paginationInfo); return "web/msgcampain/excel/MsgExcelDataView"; } /** * 선거 문자 발송 엑셀문자(대량전송) 화면 * @param searchVO * @param model * @return "/web/mjon/msgcampain/excel/selectMsgExcelDataViewAjax.do" * @throws Exception */ @RequestMapping(value= {"/web/mjon/msgcampain/excel/selectMsgExcelDataViewAjax.do"}) public String selectMsgDataExcelViewAjax(@ModelAttribute("searchVO") MjonMsgDataVO searchVO, CateCode cateCode, ModelMap model) throws Exception{ //로그인 권한정보 불러오기 LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null; String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId()); String author = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getAuthority()); String categoryType = cateCode.getCateType(); if(categoryType == null) { categoryType = "N"; } //문자 전송 개인 단가 불러오기 //0.이벤트 진행중이 회원 정보 불러오기. //이벤트 회원 정보 테이블에서 대상자의 정보를 불러온다. MjonEventVO mjonEventVO = new MjonEventVO(); mjonEventVO.setMberId(userId); MjonEventVO eventMberInfo = mjonEventService.selectEventMsgMberDefaultInfo(mjonEventVO); long eventDiffDate = 0; float eventRemainCash = 0; boolean compareEndDate = false; if(eventMberInfo != null) { String eventEndDate = eventMberInfo.getEventEndDate(); /** * MJUtil.getCompareDate() * 현재 날짜와 파라미터 전달 날짜를 비교 * 전달날짜를 지난경우 False를 리턴함. * 현재날짜 이전 혹은 같은 날짜면 True를 리턴함. * * */ if(eventEndDate != null) { compareEndDate = MJUtil.getCompareDate(eventEndDate); eventRemainCash = (float) eventMberInfo.getEventRemainCash(); //이벤트 종료 일자가 지난 경우, 이벤트 상태가 종료아 아니면 종료 처리 시킴 //이벤트 남은 캐시가 단문 발송금액 7.5원 보다 낮으면 이벤트 종료 시킴 if(!compareEndDate || eventRemainCash < 7.5) { if(!eventMberInfo.getEventStatus().equals("E")) { //이벤트 상태값을 종료로 변경한다. mjonEventVO.setEventInfoId(eventMberInfo.getEventInfoId()); mjonEventVO.setEventStatus("E"); mjonEventVO.setEventMemo("이벤트 발송 최소 금액(7.5) 부족 혹은 이벤트 종료일 초과되어 이벤트 종료 시킴"); mjonEventVO.setEventRemainCash(eventRemainCash); mjonEventService.updateEventEndStatus(mjonEventVO); eventMberInfo.setEventStatus("E"); } }else {//이벤트 진행중이면 남은 날짜 계산해서 전달. /** * MJUtil.getDiffDateDay() * 현재 날짜와 파라미터 날짜 사이의 날짜 수를 계산해줌. * * */ eventDiffDate = MJUtil.getDiffDateDay(eventEndDate); } } } //남은 날짜값을 절대값으로 변경(음수로 나오기 때문) model.addAttribute("eventDiffDate", Math.abs(eventDiffDate)); model.addAttribute("compareEndDate", compareEndDate); model.addAttribute("eventRemainCash", eventRemainCash); model.addAttribute("eventMberInfo", eventMberInfo); //1.시스템 기본 단가 정보 불러오기 JoinSettingVO sysJoinSetVO = mjonMsgDataService.selectJoinSettingInfo(); // 등급제 단가 추출 => 시스템 단가에 적용 sysJoinSetVO = mberGrdService.selectMberGrdDefaultInfo(sysJoinSetVO, userId); //2.사용자 개인 단가 정보 불러오기 MberManageVO mberManageVO = new MberManageVO(); if(!userId.equals("") && !author.equals("ROLE_ADMIN")) { mberManageVO = mjonMsgDataService.selectMberManageInfo(userId); } model.addAttribute("exceptSpamYn", mberManageVO.getExceptSpamYn()); //3.사용자 개인단가 정보가 0이 아니면 개인단가 사용, 없으면 시스템 기본 단가 사용 Float shortPrice = mberManageVO.getShortPrice(); Float longPrice = mberManageVO.getLongPrice(); Float picturePrice = mberManageVO.getPicturePrice(); Float picture2Price = mberManageVO.getPicture2Price(); Float picture3Price = mberManageVO.getPicture3Price(); BigDecimal userMoney = new BigDecimal(mberManageVO.getUserMoney()).setScale(2, RoundingMode.HALF_EVEN); //일반 단가정보 저장 변수 셋팅 - 이벤트 캐시 부족시 일반단가로 계산하기 위해서임.20230328, 우영두추가 Float norShortPrice = mberManageVO.getShortPrice(); Float norLongPrice = mberManageVO.getLongPrice(); Float norPicturePrice = mberManageVO.getPicturePrice(); Float norPicture2Price = mberManageVO.getPicture2Price(); Float norPicture3Price = mberManageVO.getPicture3Price(); //기존 소수점 2째자리에서 반올림하였으나, 정책 변경으로 소수점 버림 처리함 20220623 /*int shortPrice = (int) mberManageVO.getShortPrice(); int longPrice = (int) mberManageVO.getLongPrice(); int picturePrice = (int) mberManageVO.getPicturePrice(); int picture2Price = (int) mberManageVO.getPicture2Price(); int picture3Price = (int) mberManageVO.getPicture3Price(); int userMoney = (int) mberManageVO.getUserMoney();*/ String userPoint = mberManageVO.getUserPoint(); //이벤트 진행 회원의 발송 단가 처리해주기 if(eventMberInfo != null && eventMberInfo.getEventStatus().equals("Y") && compareEndDate) { shortPrice = Float.parseFloat(eventMberInfo.getEventShortPrice()); longPrice = Float.parseFloat(eventMberInfo.getEventLongPrice()); picturePrice = Float.parseFloat(eventMberInfo.getEventPicturePrice()); picture2Price = Float.parseFloat(eventMberInfo.getEventPicture2Price()); picture3Price = Float.parseFloat(eventMberInfo.getEventPicture3Price()); //이벤트 캐시 부족시 일반단가로 계산하기 위해서임.20230328, 우영두추가 if(shortPrice < 1 || longPrice < 1 || picturePrice < 1) {//이벤트 단가 적용시 일반단가도 필요하여 셋팅 해줌. norShortPrice = (float) sysJoinSetVO.getShortPrice(); norLongPrice = (float) sysJoinSetVO.getLongPrice(); norPicturePrice = (float) sysJoinSetVO.getPicturePrice(); norPicture2Price = (float) sysJoinSetVO.getPicture2Price(); norPicture3Price = (float) sysJoinSetVO.getPicture3Price(); } }else if(shortPrice < 1 || longPrice < 1 || picturePrice < 1) { shortPrice = (float) sysJoinSetVO.getShortPrice(); longPrice = (float) sysJoinSetVO.getLongPrice(); picturePrice = (float) sysJoinSetVO.getPicturePrice(); picture2Price = (float) sysJoinSetVO.getPicture2Price(); picture3Price = (float) sysJoinSetVO.getPicture3Price(); } model.addAttribute("shortPrice", shortPrice); model.addAttribute("longPrice", longPrice); model.addAttribute("picturePrice", picturePrice); model.addAttribute("picture2Price", picture2Price); model.addAttribute("picture3Price", picture3Price); model.addAttribute("userMoney", userMoney); model.addAttribute("userPoint", userPoint); //이벤트 캐시 부족시 일반단가로 계산하기 위해서임.20230328, 우영두추가 if(norShortPrice < 1 || norLongPrice < 1 || norPicturePrice < 1) {//협의 단가가 없는 경우 일반단가에 시스템 단가로 셋팅해줌 norShortPrice = (float) sysJoinSetVO.getShortPrice(); norLongPrice = (float) sysJoinSetVO.getLongPrice(); norPicturePrice = (float) sysJoinSetVO.getPicturePrice(); norPicture2Price = (float) sysJoinSetVO.getPicture2Price(); norPicture3Price = (float) sysJoinSetVO.getPicture3Price(); } model.addAttribute("norShortPrice", norShortPrice); model.addAttribute("norLongPrice", norLongPrice); model.addAttribute("norPicturePrice", norPicturePrice); model.addAttribute("norPicture2Price", norPicture2Price); model.addAttribute("norPicture3Price", norPicture3Price); //선거 후보자 정보 불러오기 MjonCandidateVO mjonCandidateVO = new MjonCandidateVO(); if(userId != ""){ mjonCandidateVO = mjonCandidateService.selectCandidateDataInfo(userId); //String cryptText = egovCryptoUtil.encrypt(plainText); if(mjonCandidateVO != null) { // 주민번호 복호화 하기 String regidentNo1 = egovCryptoUtil.decrypt(mjonCandidateVO.getRegidentNo1()); String regidentNo2 = egovCryptoUtil.decrypt(mjonCandidateVO.getRegidentNo2()); mjonCandidateVO.setRegidentNo1(regidentNo1); mjonCandidateVO.setRegidentNo2(regidentNo2); } } model.addAttribute("mjonCandidateVO", mjonCandidateVO); // 이메일 코드조회 ComDefaultCodeVO voComCode = new ComDefaultCodeVO(); voComCode.setCodeId("ITN031"); model.addAttribute("emailCode", cmmUseService.selectCmmCodeDetail(voComCode)); //아이디 발신번호 리스트 불러오기. List resultSendPhonList = mjonMsgDataService.selectSendPhonNumList(userId); List resultPhonList = new ArrayList(); MJUtil mjUtil = new MJUtil(); for(String phone : resultSendPhonList) { resultPhonList.add(mjUtil.addDash(phone)); } model.addAttribute("resultPhonList", resultPhonList); // 문자 카테고리 리스트 불러오기 List cateConfList = letterService.selectCateConfWithList(categoryType); model.addAttribute("cateCodeList", cateConfList); //그림 문자 리스트 불러오기 LetterVO letterVO = new LetterVO(); if(letterVO.getPageUnit() != 10) { letterVO.setPageUnit(letterVO.getPageUnit()); } MjonSymbolVO symbolVO = new MjonSymbolVO(); // 특수문자 리스트 불러오기 List symbolList = mjonSymbolService.selectMjonSymbolList(symbolVO); model.addAttribute("symbolList", symbolList); /*String categoryType = cateCode.getCateType(); if(categoryType == null) { categoryType = "N"; } // 문자 카테고리 리스트 불러오기 List cateConfList = letterService.selectCateConfWithList(categoryType); model.addAttribute("cateCodeList", cateConfList); //그림 문자 리스트 불러오기 LetterVO letterVO = new LetterVO(); if(letterVO.getPageUnit() != 10) { letterVO.setPageUnit(letterVO.getPageUnit()); }*/ /** pageing */ PaginationInfo paginationInfo = new PaginationInfo(); paginationInfo.setCurrentPageNo(letterVO.getPageIndex()); paginationInfo.setRecordCountPerPage(letterVO.getPageUnit()); paginationInfo.setPageSize(letterVO.getPageSize()); letterVO.setFirstIndex(paginationInfo.getFirstRecordIndex()); letterVO.setLastIndex(paginationInfo.getLastRecordIndex()); letterVO.setRecordCountPerPage(paginationInfo.getRecordCountPerPage()); List resultPhoList = mjonMsgDataService.selectPhotoLetterList(letterVO); model.addAttribute("resultPhoList", resultPhoList); paginationInfo.setTotalRecordCount( resultPhoList.size()> 0 ? ((Long)((EgovMap)resultPhoList.get(0)).get("totCnt")).intValue() : 0); model.addAttribute("paginationInfo", paginationInfo); return "web/msgcampain/excel/MsgExcelDataSMLView"; } /** * 선거문자 하위 카테고리 리스트 화면 불러오기 * * @param letterVO * @param * @param sessionVO * @param model * @return * @throws Exception */ @RequestMapping(value= {"/web/mjon/msgcampain/selectCateConfThrDptListAjax.do"}) public String selectCateConfThreeDepthListAjax( @ModelAttribute("searchVO") LetterVO letterVO, BindingResult bindingResult, ModelMap model, SessionStatus status, RedirectAttributes redirectAttributes) throws Exception { CateCode cateCode = new CateCode(); cateCode.setCateNo(letterVO.getCategoryCode()); //하위카테고리에서 전체 클릭 시 상위카테고리로 하위카테고리 조회 if(letterVO.getCategoryCode().equals("") && !letterVO.getUpperCateNo().equals("")) { cateCode.setCateNo(letterVO.getUpperCateNo()); } CateCode cateCodeInfoVO = cmmnDetailCodeManageService.selectCateCodeInfo(cateCode); //카테고리 상세 조회 if(cateCodeInfoVO != null) { //전체 카테고리가 아닌 경우 if(cateCodeInfoVO.getCateDepth().equals("2")) { //선택한 카테고리가 2뎁스(중분류)일 시 중분류의 코드로 하위분류 조회 cateCode.setUpperCateNo(cateCodeInfoVO.getId()); }else if(cateCodeInfoVO.getCateDepth().equals("3")) { //선택한 카테고리가 3뎁스(하위분류)일 시 해당 부모코드로 형제카테고리 조회 cateCode.setUpperCateNo(cateCodeInfoVO.getParent()); } } cateCode.setCateType("N"); //일반 o 맞춤제작 x String thrDptCateNo = ""; //클릭한 카테고리가 2뎁스(하위분류)일 시 하위 카테고리는 '전체' selected효과 if(cateCodeInfoVO != null && cateCodeInfoVO.getCateDepth().equals("3")) { //클릭한 카테고리가 3뎁스(하위분류)일 시 해당 카테고리 selected 효과 thrDptCateNo= letterVO.getCategoryCode(); } //3뎁스(하위분류) 카테고리 조회 List cateThreeConfList = letterService.selectCateConfThreeDepthWithList(cateCode); model.addAttribute("resultCateThreeConfList", cateThreeConfList); model.addAttribute("thrDptCateNo", thrDptCateNo); return "web/msgcampain/CateThrDptListAjax"; } /** * 선거 문자샘플 리스트 화면 불러오기 * * @param letterVO * @param * @param sessionVO * @param model * @return * @throws Exception */ @RequestMapping(value= {"/web/mjon/msgcampain/selectLetterDataListAjax.do"}) public String selectLetterDataListAjax( @ModelAttribute("searchVO") LetterVO letterVO, BindingResult bindingResult, ModelMap model, SessionStatus status, RedirectAttributes redirectAttributes) throws Exception { //검색 키워드 체크 기능 추가 String keyword = letterVO.getSearchKeyword(); boolean searchKeyType = StringUtil.getSearchKeywordValidation(keyword); if(!searchKeyType) {//검색 결과 Null로 리턴함. List exceptionLetterList = new ArrayList<>(); model.addAttribute("resultLetterList", exceptionLetterList); return "web/msgcampain/LetterListAjax"; } CateCode cateCode = new CateCode(); cateCode.setCateNo(letterVO.getCategoryCode()); CateCode cateCodeInfoVO = cmmnDetailCodeManageService.selectCateCodeInfo(cateCode); //카테고리 상세 조회 //1번. 문자 샘플 탭 or 단문문자 탭 or 상위카테고리에서 ALL 클릭 시 - 카테고리 관련 조건 없이 select //2번. 상위 카테고리 BEST 클릭 시 - bestCategory = Y 조건 추가 //3번. 상위 카테고리(All or BEST가 아닌 관리자가 등록한 카테고리) 클릭 시 - cateDepth를 2으로 넘겨주고 해당 카테고리 번호와 해당 카테고리리 번호를 upper 카테고리로 가지고 있는 하위 카테고리들 조회 //4번. 하위 카테고리 전체 클릭 시 - cateDepth를 2으로 넘겨주고 상위 카테고리와 상위 카테고리리 번호를 upper 카테고리로 가지고 있는 하위 카테고리들 조회 //5번. 하위 카테고리(전체가 아닌 관리자가 등록한 카테고리) 클릭 시 - cateDepth를 3으로 넘겨주고 해당 카테고리를 조건절에 추가 if(cateCodeInfoVO != null) { //3번. 상위 카테고리 클릭 시 letterVO.setCateDepth(cateCodeInfoVO.getCateDepth()); } if ("best".equals(letterVO.getCategoryCode())) { //2번. BEST 클릭 시 경우 letterVO.setBestCategory("Y"); letterVO.setCategoryCode(""); }else if(letterVO.getCategoryCode().equals("") && !letterVO.getUpperCateNo().equals("")) { //하위분류에서 전체 클릭 시 중분류의 코드로 문자샘플 조회 letterVO.setCateDepth("2"); letterVO.setCategoryCode(letterVO.getUpperCateNo()); } //그림 문자 리스트 불러오기 //LetterVO letterVO = new LetterVO(); if(letterVO.getPageUnit() != 10) { letterVO.setPageUnit(letterVO.getPageUnit()); } /** pageing */ PaginationInfo paginationInfo = new PaginationInfo(); paginationInfo.setCurrentPageNo(letterVO.getPageIndex()); paginationInfo.setRecordCountPerPage(letterVO.getPageUnit()); paginationInfo.setPageSize(letterVO.getPageSize()); letterVO.setFirstIndex(paginationInfo.getFirstRecordIndex()); letterVO.setLastIndex(paginationInfo.getLastRecordIndex()); letterVO.setRecordCountPerPage(paginationInfo.getRecordCountPerPage()); String letterType = letterVO.getLetterType(); // 문자 종류 정보가 없으면 단문문자로 셋팅 if(letterType == null || letterType.equals("")) { letterVO.setLetterType("S"); } // 장/단문 문자 리스트 List resultLetterList = mjonMsgDataService.selectLetterList(letterVO); model.addAttribute("resultLetterList", resultLetterList); paginationInfo.setTotalRecordCount( resultLetterList.size()> 0 ? ((Long)((EgovMap)resultLetterList.get(0)).get("totCnt")).intValue() : 0); model.addAttribute("paginationInfo", paginationInfo); model.addAttribute("letterVO", letterVO); return "web/msgcampain/LetterListAjax"; } /** * 선거문자 문자샘플 리스트 화면 불러오기 * * @param letterVO * @param * @param sessionVO * @param model * @return * @throws Exception */ @RequestMapping(value= {"/web/mjon/msgcampain/selectMainLetterDataListAjax.do"}) public String selectMainLetterDataListAjax( @ModelAttribute("searchVO") LetterVO letterVO, BindingResult bindingResult, ModelMap model, SessionStatus status, RedirectAttributes redirectAttributes) throws Exception { String subStr = letterVO.getCategoryCode(); if(!subStr.equals("")) { subStr = subStr.substring(0, 3); letterVO.setCategoryCode(subStr); }else { letterVO.setCategoryCode("131"); } //그림 문자 리스트 불러오기 //LetterVO letterVO = new LetterVO(); if(letterVO.getPageUnit() != 10) { letterVO.setPageUnit(letterVO.getPageUnit()); } /** pageing */ PaginationInfo paginationInfo = new PaginationInfo(); paginationInfo.setCurrentPageNo(letterVO.getPageIndex()); paginationInfo.setRecordCountPerPage(letterVO.getPageUnit()); paginationInfo.setPageSize(letterVO.getPageSize()); letterVO.setFirstIndex(paginationInfo.getFirstRecordIndex()); letterVO.setLastIndex(paginationInfo.getLastRecordIndex()); letterVO.setRecordCountPerPage(paginationInfo.getRecordCountPerPage()); String letterType = letterVO.getLetterType(); // 문자 종류 정보가 없으면 단문문자로 셋팅 if(letterType == null || letterType.equals("")) { letterVO.setLetterType("S"); } // 장/단문 문자 리스트 List resultLetterList = mjonMsgDataService.selectLetterList(letterVO); model.addAttribute("resultLetterList", resultLetterList); paginationInfo.setTotalRecordCount( resultLetterList.size()> 0 ? ((Long)((EgovMap)resultLetterList.get(0)).get("totCnt")).intValue() : 0); model.addAttribute("paginationInfo", paginationInfo); model.addAttribute("letterVO", letterVO); return "web/msgcampain/MainLetterListAjax"; } /** * 선거문자 그림 문자샘플 리스트 화면 불러오기 * * @param letterVO * @param * @param sessionVO * @param model * @return * @throws Exception */ @RequestMapping(value= {"/web/mjon/msgcampain/selectPhotoDataListAjax.do"}) public String selectPhotoDataListAjax( @ModelAttribute("searchVO") LetterVO letterVO, BindingResult bindingResult, ModelMap model, SessionStatus status, RedirectAttributes redirectAttributes) throws Exception { //검색 키워드 체크 기능 추가 String keyword = letterVO.getSearchKeyword(); boolean searchKeyType = StringUtil.getSearchKeywordValidation(keyword); if(!searchKeyType) {//검색 결과 Null로 리턴함. List exceptionPhoList = new ArrayList<>(); model.addAttribute("resultPhoList", exceptionPhoList); return "web/msgcampain/PhotoListAjax"; } CateCode cateCode = new CateCode(); cateCode.setCateNo(letterVO.getCategoryCode()); CateCode cateCodeInfoVO = cmmnDetailCodeManageService.selectCateCodeInfo(cateCode); //카테고리 상세 조회 //1번. 문자 샘플 탭 or 단문문자 탭 or 상위카테고리에서 ALL 클릭 시 - 카테고리 관련 조건 없이 select //2번. 상위 카테고리 BEST 클릭 시 - bestCategory = Y 조건 추가 //3번. 상위 카테고리(All or BEST가 아닌 관리자가 등록한 카테고리) 클릭 시 - cateDepth를 2으로 넘겨주고 해당 카테고리 번호와 해당 카테고리리 번호를 upper 카테고리로 가지고 있는 하위 카테고리들 조회 //4번. 하위 카테고리 전체 클릭 시 - cateDepth를 2으로 넘겨주고 상위 카테고리와 상위 카테고리리 번호를 upper 카테고리로 가지고 있는 하위 카테고리들 조회 //5번. 하위 카테고리(전체가 아닌 관리자가 등록한 카테고리) 클릭 시 - cateDepth를 3으로 넘겨주고 해당 카테고리를 조건절에 추가 if(cateCodeInfoVO != null) { //3번. 상위 카테고리 클릭 시 letterVO.setCateDepth(cateCodeInfoVO.getCateDepth()); } if ("best".equals(letterVO.getCategoryCode())) { //2번. BEST 클릭 시 경우 letterVO.setBestCategory("Y"); letterVO.setCategoryCode(""); }else if(letterVO.getCategoryCode().equals("") && !letterVO.getUpperCateNo().equals("")) { //하위분류에서 전체 클릭 시 중분류의 코드로 문자샘플 조회 letterVO.setCateDepth("2"); letterVO.setCategoryCode(letterVO.getUpperCateNo()); } //그림 문자 리스트 불러오기 //LetterVO letterVO = new LetterVO(); if(letterVO.getPageUnit() != 10) { letterVO.setPageUnit(letterVO.getPageUnit()); } /** pageing */ PaginationInfo paginationInfo = new PaginationInfo(); paginationInfo.setCurrentPageNo(letterVO.getPageIndex()); paginationInfo.setRecordCountPerPage(letterVO.getPageUnit()); paginationInfo.setPageSize(letterVO.getPageSize()); letterVO.setFirstIndex(paginationInfo.getFirstRecordIndex()); letterVO.setLastIndex(paginationInfo.getLastRecordIndex()); letterVO.setRecordCountPerPage(paginationInfo.getRecordCountPerPage()); String letterType = letterVO.getLetterType(); // 문자 종류 정보가 없으면 그림문자로 셋팅 if(letterType == null || letterType.equals("")) { letterVO.setLetterType("P"); //그림문자 셋팅 letterVO.setMemberType("P"); //개인 카테고리 셋팅 } // 그림 문자 리스트 List resultPhoList = mjonMsgDataService.selectPhotoLetterList(letterVO); model.addAttribute("resultPhoList", resultPhoList); paginationInfo.setTotalRecordCount( resultPhoList.size()> 0 ? ((Long)((EgovMap)resultPhoList.get(0)).get("totCnt")).intValue() : 0); model.addAttribute("paginationInfo", paginationInfo); model.addAttribute("letterVO", letterVO); return "web/msgcampain/PhotoListAjax"; } /** * 선거문자 그림 문자샘플 리스트 화면 불러오기 2 * * @param letterVO * @param * @param sessionVO * @param model * @return * @throws Exception */ @RequestMapping(value= {"/web/mjon/msgcampain/selectPhotoDataList2Ajax.do"}) public ModelAndView selectPhotoDataList2Ajax( @ModelAttribute("searchVO") LetterVO letterVO, ModelMap model) throws Exception { ModelAndView modelAndView = new ModelAndView(); modelAndView.setViewName("jsonView"); String subStr = letterVO.getCategoryCode(); if(!subStr.equals("")) { subStr = subStr.substring(0, 3); letterVO.setCategoryCode(subStr); } //그림 문자 리스트 불러오기 if(letterVO.getPageUnit() != 10) { letterVO.setPageUnit(letterVO.getPageUnit()); } /** pageing */ PaginationInfo paginationInfo = new PaginationInfo(); paginationInfo.setCurrentPageNo(letterVO.getPageIndex()); paginationInfo.setRecordCountPerPage(letterVO.getPageUnit()); paginationInfo.setPageSize(letterVO.getPageSize()); letterVO.setFirstIndex(paginationInfo.getFirstRecordIndex()); letterVO.setLastIndex(paginationInfo.getLastRecordIndex()); letterVO.setRecordCountPerPage(paginationInfo.getRecordCountPerPage()); String letterType = letterVO.getLetterType(); // 문자 종류 정보가 없으면 단문문자로 셋팅 if(letterType == null || letterType.equals("")) { letterVO.setLetterType("P"); } try { // 그림 문자 리스트 List resultPhoList = mjonMsgDataService.selectPhotoLetterList(letterVO); model.addAttribute("resultPhoList", resultPhoList); paginationInfo.setTotalRecordCount( resultPhoList.size()> 0 ? ((Long)((EgovMap)resultPhoList.get(0)).get("totCnt")).intValue() : 0); model.addAttribute("paginationInfo", paginationInfo); model.addAttribute("letterVO", letterVO); modelAndView.addObject("status", "success"); } catch (Exception e) { modelAndView.addObject("status", "fail"); } return modelAndView; } /** * 선거문자 그림 문자샘플 리스트 화면 불러오기 * * @param letterVO * @param * @param sessionVO * @param model * @return * @throws Exception */ @RequestMapping(value= {"/web/mjon/msgcampain/selectMainPhotoDataListAjax.do"}) public String selectMainPhotoDataListAjax( @ModelAttribute("searchVO") LetterVO letterVO, BindingResult bindingResult, ModelMap model, SessionStatus status, RedirectAttributes redirectAttributes) throws Exception { String subStr = letterVO.getCategoryCode(); if(!subStr.equals("")) { subStr = subStr.substring(0, 3); letterVO.setCategoryCode(subStr); }else if("C".equals(letterVO.getLetterType())) { letterVO.setCategoryCode("111600"); }else { letterVO.setCategoryCode("131"); } //그림 문자 리스트 불러오기 //LetterVO letterVO = new LetterVO(); if(letterVO.getPageUnit() != 10) { letterVO.setPageUnit(letterVO.getPageUnit()); } /** pageing */ PaginationInfo paginationInfo = new PaginationInfo(); paginationInfo.setCurrentPageNo(letterVO.getPageIndex()); paginationInfo.setRecordCountPerPage(letterVO.getPageUnit()); paginationInfo.setPageSize(letterVO.getPageSize()); letterVO.setFirstIndex(paginationInfo.getFirstRecordIndex()); letterVO.setLastIndex(paginationInfo.getLastRecordIndex()); letterVO.setRecordCountPerPage(paginationInfo.getRecordCountPerPage()); String letterType = letterVO.getLetterType(); // 문자 종류 정보가 없으면 단문문자로 셋팅 if(letterType == null || letterType.equals("")) { letterVO.setLetterType("P"); } // 그림 문자 리스트 List resultPhoList = mjonMsgDataService.selectPhotoLetterList(letterVO); model.addAttribute("resultPhoList", resultPhoList); paginationInfo.setTotalRecordCount( resultPhoList.size()> 0 ? ((Long)((EgovMap)resultPhoList.get(0)).get("totCnt")).intValue() : 0); model.addAttribute("paginationInfo", paginationInfo); model.addAttribute("letterVO", letterVO); return "web/msgcampain/MainPhotoListAjax"; } /** * 선거문자 내문자함 리스트 화면 불러오기 * * @param MjonMsgDataVO * @param * @param sessionVO * @param model * @return * @throws Exception */ @RequestMapping(value= {"/web/mjon/msgcampain/selectMyMsgDataListAjax.do"}) public String selectMyMsgDataListAjax( @ModelAttribute("searchVO") MjonMsgDataVO mjonMsgDataVO, BindingResult bindingResult, ModelMap model, SessionStatus status, RedirectAttributes redirectAttributes) throws Exception { //로그인 권한정보 불러오기 LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null; String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId()); mjonMsgDataVO.setUserId(userId); //검색 키워드 체크 기능 추가 String keyword = mjonMsgDataVO.getSearchKeyword(); boolean searchKeyType = StringUtil.getSearchKeywordValidation(keyword); if(!searchKeyType) {//검색 결과 Null로 리턴함. List exceptionMyMsgList = new ArrayList<>(); model.addAttribute("resultMyMsgList", exceptionMyMsgList); return "web/msgcampain/MyMsgListAjax"; } //그림 문자 리스트 불러오기 //LetterVO letterVO = new LetterVO(); if(mjonMsgDataVO.getPageUnit() != 10) { mjonMsgDataVO.setPageUnit(mjonMsgDataVO.getPageUnit()); } /** pageing */ PaginationInfo paginationInfo = new PaginationInfo(); paginationInfo.setCurrentPageNo(mjonMsgDataVO.getPageIndex()); paginationInfo.setRecordCountPerPage(mjonMsgDataVO.getPageUnit()); paginationInfo.setPageSize(mjonMsgDataVO.getPageSize()); mjonMsgDataVO.setFirstIndex(paginationInfo.getFirstRecordIndex()); mjonMsgDataVO.setLastIndex(paginationInfo.getLastRecordIndex()); mjonMsgDataVO.setRecordCountPerPage(paginationInfo.getRecordCountPerPage()); // 내 문자함 문자 리스트 List resultMyMsgList = mjonMsgDataService.selectMyMsgDataListAjax(mjonMsgDataVO); model.addAttribute("resultMyMsgList", resultMyMsgList); paginationInfo.setTotalRecordCount( resultMyMsgList.size()> 0 ? ((Long)((EgovMap)resultMyMsgList.get(0)).get("totCnt")).intValue() : 0); model.addAttribute("paginationInfo", paginationInfo); model.addAttribute("mjonMsgDataVO", mjonMsgDataVO); //문자함 리스트의 첨부이미지 정보 불러오기 List resultMyMsgPhotoList = mjonMsgDataService.selectMyMsgPhotoListInfo(resultMyMsgList); model.addAttribute("resultMyMsgPhotoList", resultMyMsgPhotoList); return "web/msgcampain/MyMsgListAjax"; } /** * 선거문자 추천인 아이디 확인 * * @param String * @param * @param sessionVO * @param model * @return * @throws Exception */ @RequestMapping(value= {"/web/mjon/msgcampain/selectRecommIdCheckAjax.do"}) public ModelAndView selectRecommIdCheckAjax( MjonMsgVO mjonMsgVO, ModelMap model) throws Exception { ModelAndView modelAndView = new ModelAndView(); modelAndView.setViewName("jsonView"); List checkId = new ArrayList(); checkId = mberManageService.selectIdCheck(mjonMsgVO.getRecommId()); int checkIdCnt = checkId.size(); String resultSts = "fail"; if(checkIdCnt > 0) { resultSts = "success"; } modelAndView.addObject("status", resultSts); return modelAndView; } /** * 선거문자 주소록 그룹 리스트 화면 불러오기 * * @param MjonMsgDataVO * @param * @param sessionVO * @param model * @return * @throws Exception */ @RequestMapping(value= {"/web/mjon/msgcampain/selectAddrGroupListAjax.do"}) public String selectAddrGroupListAjax( @ModelAttribute("searchVO") AddrGroupVO addrGroupVO, AddrVO addrVO, ModelMap model, RedirectAttributes redirectAttributes) throws Exception { //로그인 권한정보 불러오기 LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null; String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId()); if(loginVO == null) { return "redirect:/web/main/mainPage.do"; } if(userId != "") { addrGroupVO.setMberId(userId); addrVO.setMberId(userId); } if(addrGroupVO.getPageUnit() != 10) { addrGroupVO.setPageUnit(addrGroupVO.getPageUnit()); } if("".equals(addrGroupVO.getSearchSortCnd())){ //최초조회시 최신것 조회List addrGroupVO.setSearchSortCnd("addrGrpId"); addrGroupVO.setSearchSortOrd("desc"); } addrGroupVO.setSiteId("web"); List addrGroupList = addrGroupService.selectAddrGroupList(addrGroupVO); //회원별 주소록 전체 갯수 조회 int addrTotalCount = addrService.selectAddrTotalCount(addrVO); addrVO.setType("bookmark"); List addrBookmarkList = addrService.selectAddrBasicGrpList(addrVO); addrVO.setType("noGrp"); List addrNoGrpList = addrService.selectAddrBasicGrpList(addrVO); model.addAttribute("addrTotalCount", addrTotalCount); model.addAttribute("addrGroupList", addrGroupList); model.addAttribute("addrBookmarkList", addrBookmarkList); model.addAttribute("addrNoGrpList", addrNoGrpList); return "web/msgcampain/addr/MsgAddrGroupListAjax"; } /** * 선거문자 주소록 그룹 선택시 우측 주소록 리스트 화면 불러오기 * * @param AddrGroupVO * @param AddrVO * @param sessionVO * @param model * @return * @throws Exception */ @RequestMapping(value= {"/web/mjon/msgcampain/selectMsgAddrListAjax.do"}) public ModelAndView selectMsgAddrListAjax( @ModelAttribute("searchVO") AddrVO addrVO, ModelMap model, RedirectAttributes redirectAttributes) throws Exception { ModelAndView modelAndView = new ModelAndView(); modelAndView.setViewName("jsonView"); //로그인 권한정보 불러오기 LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null; String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId()); if(userId != "") { addrVO.setMberId(userId); }else { modelAndView.addObject("message", "로그인 후 이용이 가능합니다."); modelAndView.addObject("result", "loginFail"); return modelAndView; } List resultAddrList = mjonMsgDataService.selectMsgAddrListAjax(addrVO); modelAndView.addObject("resultAddrList", resultAddrList); modelAndView.addObject("result", "success"); return modelAndView; } /** * 선거문자 최근 전송내역 리스트 화면 불러오기 * * @param MjonMsgDataVO * @param * @param sessionVO * @param model * @return * @throws Exception */ @RequestMapping(value= {"/web/mjon/msgcampain/selectLatestMsgListAjax.do"}) public String selectLatestMsgListAjax( @ModelAttribute("searchVO") MjonMsgDataVO mjonMsgDataVO, ModelMap model, RedirectAttributes redirectAttributes) throws Exception { //로그인 권한정보 불러오기 LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null; String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId()); Calendar cal = Calendar.getInstance(); Date now = new Date(); SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd"); cal.setTime(now); cal.add(Calendar.DATE, -3); String chkDate = format.format(cal.getTime()); mjonMsgDataVO.setMyMsgStDt(chkDate); //검색 시작일 저장 - 현재날짜로 부터 3일 이전 날짜로 시작 mjonMsgDataVO.setUserId(userId); List resultLatestMsgList = mjonMsgDataService.selectLatestMsgList(mjonMsgDataVO); model.addAttribute("resultLatestMsgList", resultLatestMsgList); return "web/msgcampain/MsgLatestListAjax"; } /** * 선거문자 자주 보내는 번호 리스트 화면 불러오기 * * @param MjonMsgDataVO * @param * @param sessionVO * @param model * @return * @throws Exception */ @RequestMapping(value= {"/web/mjon/msgcampain/selectBookMarkMsgListAjax.do"}) public String selectBookMarkMsgListAjax( @ModelAttribute("searchVO") MjonMsgDataVO mjonMsgDataVO, ModelMap model, RedirectAttributes redirectAttributes) throws Exception { //로그인 권한정보 불러오기 LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null; String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId()); List resultBookMarkMsgList = mjonMsgDataService.selectBookMarkMsgList(mjonMsgDataVO); model.addAttribute("resultBookMarkMsgList", resultBookMarkMsgList); return "web/msgcampain/MsgBookMarkListAjax"; } /** * 선거문자 내문자함 리스트 삭제 처리 * * @param MjonMsgDataVO * @param * @param sessionVO * @param model * @return * @throws Exception */ @RequestMapping(value= {"/web/mjon/msgcampain/deleteMyMsgDataListAjax.do"}) public String deleteMyMsgDataListAjax( @ModelAttribute("searchVO") MjonMsgDataVO mjonMsgDataVO, BindingResult bindingResult, ModelMap model, SessionStatus status, RedirectAttributes redirectAttributes) throws Exception { //로그인 권한정보 불러오기 LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null; String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId()); mjonMsgDataVO.setUserId(userId); //내문자함 문자 삭제 처리하기 mjonMsgDataService.deleteMyMsgDataListAjax(mjonMsgDataVO); //그림 문자 리스트 불러오기 //LetterVO letterVO = new LetterVO(); if(mjonMsgDataVO.getPageUnit() != 10) { mjonMsgDataVO.setPageUnit(mjonMsgDataVO.getPageUnit()); } /** pageing */ PaginationInfo paginationInfo = new PaginationInfo(); paginationInfo.setCurrentPageNo(mjonMsgDataVO.getPageIndex()); paginationInfo.setRecordCountPerPage(mjonMsgDataVO.getPageUnit()); paginationInfo.setPageSize(mjonMsgDataVO.getPageSize()); mjonMsgDataVO.setFirstIndex(paginationInfo.getFirstRecordIndex()); mjonMsgDataVO.setLastIndex(paginationInfo.getLastRecordIndex()); mjonMsgDataVO.setRecordCountPerPage(paginationInfo.getRecordCountPerPage()); // 내 문자함 문자 리스트 List resultMyMsgList = mjonMsgDataService.selectMyMsgDataListAjax(mjonMsgDataVO); model.addAttribute("resultMyMsgList", resultMyMsgList); paginationInfo.setTotalRecordCount( resultMyMsgList.size()> 0 ? ((Long)((EgovMap)resultMyMsgList.get(0)).get("totCnt")).intValue() : 0); model.addAttribute("paginationInfo", paginationInfo); model.addAttribute("mjonMsgDataVO", mjonMsgDataVO); //문자함 리스트의 첨부이미지 정보 불러오기 List resultMyMsgPhotoList = mjonMsgDataService.selectMyMsgPhotoListInfo(resultMyMsgList); model.addAttribute("resultMyMsgPhotoList", resultMyMsgPhotoList); return "web/msgcampain/MyMsgListAjax"; } /** * 선거문자 문자 발송 화면 * @param searchVO * @param model * @return "/web/mjon/msgcampain/sendMsgDataAjax.do" * @throws Exception */ @RequestMapping(value= {"/web/mjon/msgcampain/sendMsgDataAjax.do"}) public ModelAndView sendMsgData(@ModelAttribute("searchVO") MjonMsgVO mjonMsgVO, RedirectAttributes redirectAttributes, HttpServletRequest request, ModelMap model) throws Exception{ ModelAndView modelAndView = new ModelAndView(); modelAndView.setViewName("jsonView"); //String resultSts = "0"; //String resultBlockSts = "0"; int resultSts = 0; //발송결과 건수 int resultBlockSts = 0; //수신거부 등록번호로 발송을 안한 건수 String userId = ""; try { LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null; userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId()); if(userId.equals("")) { modelAndView.addObject("message", "로그인 후 이용이 가능합니다."); modelAndView.addObject("result", "loginFail"); modelAndView.addObject("resultSts", resultSts); return modelAndView; }else { mjonMsgVO.setUserId(userId); /** * 회원 정지된 상태이면 문자 발송이 안되도록 처리함 * 현재 로그인 세션도 만료 처리함 * */ boolean mberSttus = userManageService.selectUserStatusInfo(userId); if(!mberSttus) { modelAndView.addObject("message", "현재 고객님께서는 문자온 서비스 이용이 정지된 상태로 문자를 발송하실 수 없습니다. 이용정지 해제를 원하시면 고객센터로 연락주시기 바랍니다."); modelAndView.addObject("result", "statusFail"); modelAndView.addObject("resultSts", resultSts); request.getSession().invalidate(); return modelAndView; } } //회원정보에서 스미싱 회원 여부 정보 조회 UserManageVO userManageVO = new UserManageVO(); userManageVO.setMberId(userId); UserManageVO resultUserVO = userManageService.selectSmishingYnUserInfo(userManageVO); String smishingYn = resultUserVO.getSmishingYn(); mjonMsgVO.setSmishingYn(smishingYn); String charset = "euc-kr"; //문자 바이트 계산에 필요한 캐릭터 셋 : 한글 2Byte로 계산 String smsCont = mjonMsgVO.getSmsTxt().replace("\r\n", "\n"); int FrBytes = smsCont.getBytes(charset).length; if(FrBytes > 2000) { modelAndView.addObject("message", "문자 내용은 2000Byte를 넘을 수 없습니다."); modelAndView.addObject("result", "smsLengFail"); return modelAndView; } System.out.println("mjonMsgVO.getMsgType1() ::: "+mjonMsgVO.getMsgType()); String msgType = mjonMsgVO.getMsgType(); //내문자저장함에 저장후 문자를 발송하는경우 문자 타입이 숫자가 아닌 문자로 넘어와서 변경 처리함- 20220520 우영두 if(msgType.equals("P") || msgType.equals("L")) { msgType = "6"; }else if(msgType.equals("S")) { msgType = "4"; } //메세지 타입이 단문이면 진짜 단문인지 한번더 확인해 준다. if(msgType.equals("4")) { //메세지 길이가 90Byte를초과 하거나, 그림 이미지가 있는경우 메세지 타입을 6으로 변경해준다. if(FrBytes > 90 || mjonMsgVO.getImgFilePath().length > 0) { msgType = "6"; } } mjonMsgVO.setMsgType(msgType); //장문 메세지일 경우 int fileCount = 0; if(msgType.equals("6")) { //그림 이미지가 첨부된 경우 if(mjonMsgVO.getImgFilePath() != null || mjonMsgVO.getImgFilePath().length > 0) { String[] path = mjonMsgVO.getImgFilePath(); String[] fileId = mjonMsgVO.getImgFileId(); String[] templateYn = mjonMsgVO.getTemplateYn(); for(int i=0; i 0) { if(mjonMsgVO.getFileName1() == null && mjonMsgVO.getFileName2() == null && mjonMsgVO.getFileName3() == null) { modelAndView.addObject("message", "문자 메세지 이미지 추가에 오류가 발생하여 문자 발송이 취소 되었습니다."); modelAndView.addObject("result", "imgSourceFail"); modelAndView.addObject("resultSts", "0"); modelAndView.addObject("resultBlockSts", "0"); return modelAndView; } } /* * 화면에서 넘어오는 단가 금액 및 총 결제 캐시 금액 체크 해주기 * 검증을 위해서 시스템 단가, 회원 협의 단가, 이벤트 단가 정보 조회 * 조회 단가를 이용하여 총 결제 캐시 금액 계산 * 파라미터로 넘어온 개별단가(eachPrice), 총 결제캐시(totPrice)를 비요하여 동일하지 않으면 컨트롤러에서 계산한 금액으로 입력해줌. */ MjonEventVO mjonEventVO = new MjonEventVO(); mjonEventVO.setMberId(userId); MjonEventVO eventMberInfo = mjonEventService.selectEventMsgMberDefaultInfo(mjonEventVO); //1.시스템 기본 단가 정보 불러오기 JoinSettingVO sysJoinSetVO = mjonMsgDataService.selectJoinSettingInfo(); // 등급제 단가 추출 => 시스템 단가에 적용 sysJoinSetVO = mberGrdService.selectMberGrdDefaultInfo(sysJoinSetVO, userId); //2.사용자 개인 단가 정보 불러오기 MberManageVO mberManageVO = new MberManageVO(); mberManageVO = mjonMsgDataService.selectMberManageInfo(userId); //3.사용자 개인단가 정보가 0이 아니면 개인단가 사용, 없으면 시스템 기본 단가 사용 Float shortPrice = mberManageVO.getShortPrice(); Float longPrice = mberManageVO.getLongPrice(); Float picturePrice = mberManageVO.getPicturePrice(); Float picture2Price = mberManageVO.getPicture2Price(); Float picture3Price = mberManageVO.getPicture3Price(); //기존 소수점 2째자리에서 반올림하였으나, 정책 변경으로 소수점 버림 처리함 20220623 boolean compareEndDate = false; float eventRemainCash = 0; float paramEachPrice = Float.parseFloat(mjonMsgVO.getEachPrice()); if(eventMberInfo != null) { String eventEndDate = eventMberInfo.getEventEndDate(); if(eventEndDate != null) { compareEndDate = MJUtil.getCompareDate(eventEndDate); eventRemainCash = (float) eventMberInfo.getEventRemainCash(); //이벤트 금액 및 기간 체크 if(!compareEndDate || eventRemainCash < paramEachPrice) { if(!eventMberInfo.getEventStatus().equals("E")) { //이벤트 상태값을 종료로 변경한다. mjonEventVO.setEventInfoId(eventMberInfo.getEventInfoId()); mjonEventVO.setEventStatus("E"); mjonEventVO.setEventMemo("발송 최소 금액("+ paramEachPrice +") 부족 혹은 이벤트 종료일 초과되어 이벤트 종료 시킴"); mjonEventVO.setEventRemainCash(eventRemainCash); mjonEventService.updateEventEndStatus(mjonEventVO); eventMberInfo.setEventStatus("E"); } } } } //이벤트 진행 회원의 발송 단가 처리해주기 if(eventMberInfo != null && eventMberInfo.getEventStatus().equals("Y") && compareEndDate) { shortPrice = Float.parseFloat(eventMberInfo.getEventShortPrice()); longPrice = Float.parseFloat(eventMberInfo.getEventLongPrice()); picturePrice = Float.parseFloat(eventMberInfo.getEventPicturePrice()); picture2Price = Float.parseFloat(eventMberInfo.getEventPicture2Price()); picture3Price = Float.parseFloat(eventMberInfo.getEventPicture3Price()); }else if(shortPrice < 1 || longPrice < 1 || picturePrice < 1) {//협의 단가가 없는 경우 시스템 단가 적용해 주기 shortPrice = (float) sysJoinSetVO.getShortPrice(); longPrice = (float) sysJoinSetVO.getLongPrice(); picturePrice = (float) sysJoinSetVO.getPicturePrice(); picture2Price = (float) sysJoinSetVO.getPicture2Price(); picture3Price = (float) sysJoinSetVO.getPicture3Price(); } // 토탈금액 "," 리플레이스 처리 mjonMsgVO.setTotPrice(mjonMsgVO.getTotPrice().replaceAll(",", "")); float tmpOrgEachPrice = Float.parseFloat(mjonMsgVO.getEachPrice()); float tmpOrgTotPrice = Float.parseFloat(mjonMsgVO.getTotPrice()); System.out.println("mjonMsgVO.getMsgType2() ::: "+mjonMsgVO.getMsgType()); //각 문자 종류별 단가 셋팅해주기 float tmpEachPrice = 0; if(mjonMsgVO.getMsgType().equals("4")) { mjonMsgVO.setEachPrice(shortPrice.toString()); tmpEachPrice = shortPrice; }else if(mjonMsgVO.getMsgType().equals("6")) { if(mjonMsgVO.getFileName3() != null) { mjonMsgVO.setEachPrice(picture3Price.toString()); tmpEachPrice = picture3Price; }else if(mjonMsgVO.getFileName2() != null) { mjonMsgVO.setEachPrice(picture2Price.toString()); tmpEachPrice = picture2Price; }else if(mjonMsgVO.getFileName1() != null) { mjonMsgVO.setEachPrice(picturePrice.toString()); tmpEachPrice = picturePrice; }else { mjonMsgVO.setEachPrice(longPrice.toString()); tmpEachPrice = longPrice; } } //수신자 총 수 * 단가 를 통해 총 결제 금액 계산 int tmpTotCallCnt = mjonMsgVO.getCallToList().length; float tmpTotPrice = tmpTotCallCnt * tmpEachPrice; //화면에서 넘어온 파라미터 개별 단가와 컨트롤러에서 계산한 단가를 비교하여 맞지 않으면 컨트롤러 계산 단가 입력 if(tmpOrgEachPrice != tmpEachPrice) { mjonMsgVO.setEachPrice(Float.toString(tmpEachPrice)); System.out.println("화면 : tmpOrgEachPrice ::: "+tmpOrgEachPrice); System.out.println("컨트롤러 : tmpEachPrice ::: "+tmpEachPrice); }else { System.out.println("tmpOrgEachPrice ::: "+tmpOrgEachPrice); } if(tmpOrgTotPrice != tmpTotPrice ) { mjonMsgVO.setTotPrice(Float.toString(tmpTotPrice)); System.out.println("화면 : tmpOrgTotPrice ::: "+tmpOrgTotPrice); System.out.println("컨트롤러 : tmpTotPrice ::: "+tmpTotPrice); }else { System.out.println("tmpOrgTotPrice ::: "+tmpOrgTotPrice); } /* * 개별단가 및 총결제 캐시 금액 체크 로직 종료 * * */ //치환문자 체크 처리 String txtReplYn = mjonMsgVO.getTxtReplYn(); if(txtReplYn.equals("Y")) { int totListCnt = mjonMsgVO.getCallToList().length; String[] nameList = mjonMsgVO.getNameList(); //치환 이름 리스트 String[] phone = mjonMsgVO.getCallToList(); //수신자 휴대폰 번호 String[] rep1 = mjonMsgVO.getRep1List(); //치환 문자1 리스트 String[] rep2 = mjonMsgVO.getRep2List(); //치환 문자2 리스트 String[] rep3 = mjonMsgVO.getRep3List(); //치환 문자3 리스트 String[] rep4 = mjonMsgVO.getRep4List(); //치환 문자4 리스트 //이름, 휴대폰, 치환문자 데이터가 없으면 취소 처리 if((nameList.length == 0 || nameList == null) && (rep1.length == 0 || rep1 == null) && (rep2.length == 0 || rep2 == null) && (rep3.length == 0 || rep3 == null) && (rep4.length == 0 || rep4 == null)) { modelAndView.addObject("message", "특정문구 일괄변환 치환문자 데이터가 없습니다."); modelAndView.addObject("result", "fail"); return modelAndView; } // 치환문자 전체 필수체크 Start boolean isRepCountOk = true; if (mjonMsgVO.getSmsTxt().indexOf("[*이름*]") > -1) { if(nameList.length != phone.length) { isRepCountOk = false; } } if (mjonMsgVO.getSmsTxt().indexOf("[*1*]") > -1) { if(rep1.length != phone.length) { isRepCountOk = false; } } if (mjonMsgVO.getSmsTxt().indexOf("[*2*]") > -1) { if(rep2.length != phone.length) { isRepCountOk = false; } } if (mjonMsgVO.getSmsTxt().indexOf("[*3*]") > -1) { if(rep3.length != phone.length) { isRepCountOk = false; } } if (mjonMsgVO.getSmsTxt().indexOf("[*4*]") > -1) { if(rep4.length != phone.length) { isRepCountOk = false; } } if (isRepCountOk == false) { modelAndView.addObject("message", "특정문구 일괄변환 치환문자 데이터가 없습니다"); modelAndView.addObject("result", "fail"); return modelAndView; } // End //--------------------------------------------------------------------------------------------------------------- int msgLeng = 90; //단문 문자열 길이 if(msgType.equals("6")) { msgLeng = 2000; //장문 문자열 길이 } for(int i=0; i < totListCnt; i ++) { String smsTxt = mjonMsgVO.getSmsTxt(); //발송 문자 내용 /** * 본문 내용 - 치환 처리 후 문자 길이 초과 여부만 체크 * 치환 리스트 중 데이터가 없는 경우 데이터 밀림방지를 위하여 공백 하나를 추가해줌 * 공백처리를 안하는 경우 데이터가 밀려서 치환되는 오류가 있어서 처리해줌 * * */ int repCnt = 0; smsTxt = smsTxt.replaceAll(String.valueOf((char)13), ""); if (smsTxt.indexOf("[*이름*]") > -1) { if(nameList.length > i && StringUtil.isNotEmpty(nameList[i])) { smsTxt = smsTxt.replaceAll("\\[\\*이름\\*\\]", StringUtil.getString(nameList[i].replaceAll("§", ","))); }else { smsTxt = smsTxt.replaceAll("\\[\\*이름\\*\\]", ""); nameList[i] = " "; } repCnt++; } if (smsTxt.indexOf("[*1*]") > -1) { if(rep1.length > i && StringUtil.isNotEmpty(rep1[i])) { smsTxt = smsTxt.replaceAll("\\[\\*1\\*\\]", StringUtil.getString(rep1[i].replaceAll("§", ","))); }else { smsTxt = smsTxt.replaceAll("\\[\\*1\\*\\]", ""); rep1[i] = " "; } repCnt++; } if (smsTxt.indexOf("[*2*]") > -1) { if(rep2.length > i && StringUtil.isNotEmpty(rep2[i])) { smsTxt = smsTxt.replaceAll("\\[\\*2\\*\\]", StringUtil.getString(rep2[i].replaceAll("§", ","))); }else { smsTxt = smsTxt.replaceAll("\\[\\*2\\*\\]", ""); rep2[i] = " "; } repCnt++; } if (smsTxt.indexOf("[*3*]") > -1) { if(rep3.length > i && StringUtil.isNotEmpty(rep3[i])) { smsTxt = smsTxt.replaceAll("\\[\\*3\\*\\]", StringUtil.getString(rep3[i].replaceAll("§", ","))); }else { smsTxt = smsTxt.replaceAll("\\[\\*3\\*\\]", ""); rep3[i] = " "; } repCnt++; } if (smsTxt.indexOf("[*4*]") > -1) { if(rep4.length > i && StringUtil.isNotEmpty(rep4[i])) { smsTxt = smsTxt.replaceAll("\\[\\*4\\*\\]", StringUtil.getString(rep4[i].replaceAll("§", ","))); }else { smsTxt = smsTxt.replaceAll("\\[\\*4\\*\\]", ""); rep4[i] = " "; } repCnt++; } //문자열 바이트 수 구하기(한글 2Byte로 계산) // 한글 3Byte로 하기 위해서는 StandardCharsets.UTF_8 로 변경하면 된다. int bytes = smsTxt.getBytes(charset).length; if(repCnt > 0) { if(bytes > msgLeng) { //전송 문자 길이를 초과한 경우 전송 취소 - 단문 작성 후 치환했을 때 장문으로 길이가 초과되는 경우 체크 modelAndView.addObject("message", "문자 치환 후 전송 문자 길이를 초과하였습니다."); modelAndView.addObject("result", "fail"); modelAndView.addObject("resultSts", "0"); modelAndView.addObject("resultBlockSts", "0"); return modelAndView; } } } mjonMsgVO.setNameList(nameList); mjonMsgVO.setRep1List(rep1); mjonMsgVO.setRep2List(rep2); mjonMsgVO.setRep3List(rep3); mjonMsgVO.setRep4List(rep4); } //현재 고객의 보유 캐시가 문자 발송이 가능한 금액인지 체크 String userMoney = mjonMsgDataService.selectBeforeCashData(mjonMsgVO); String userPoint = mjonMsgDataService.selectBeforePointData(mjonMsgVO); mjonMsgVO.setBefPoint(userPoint); //현재 보유 포인트 정보 저장 String totPrice = mjonMsgVO.getTotPrice(); String eachPrice = mjonMsgVO.getEachPrice(); if(msgType.equals("6")) {//문자 mms, lms 단가 설정하기 if(fileCount > 2) {//그림 이미지가 3개 eachPrice = mjonMsgVO.getP3Price(); }else if(fileCount > 1) {//그림 이미지가 2개 eachPrice = mjonMsgVO.getP2Price(); }else if(fileCount == 1) {//그림 이미지가 1개 eachPrice = mjonMsgVO.getpPrice(); }else {//장문 문자인 경우 eachPrice = mjonMsgVO.getmPrice(); } } 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, mjonMsgVO.setBefCash(befCash.toString()); //문자 전송 그룹아이디 생성 mjonMsgVO.setMsgGroupId(idgenMjonMsgGroupId.getNextStringId()); String[] tempPhoneList = new String[200]; //임시 수신번호 리스트 저장용 배열 String[] tempNameList = new String[200]; //임시 이름 리스트 저장용 배열 String[] tempRep1List = new String[200]; //임시 치환문자1 리스트 저장용 배열 String[] tempRep2List = new String[200]; //임시 치환문자1 리스트 저장용 배열 String[] tempRep3List = new String[200]; //임시 치환문자1 리스트 저장용 배열 String[] tempRep4List = new String[200]; //임시 치환문자1 리스트 저장용 배열 String[] phoneList = mjonMsgVO.getCallToList(); String[] nameList = mjonMsgVO.getNameList(); String[] rep1List = mjonMsgVO.getRep1List(); String[] rep2List = mjonMsgVO.getRep2List(); String[] rep3List = mjonMsgVO.getRep3List(); String[] rep4List = mjonMsgVO.getRep4List(); int callToListCnt = mjonMsgVO.getCallToList().length; mjonMsgVO.setTotalCallCnt(callToListCnt); /** * 예약 문자인 경우 시간 및 분할 시간 셋팅 해주기 * * * */ //분할문자 시간에 간격시간 더해주기 String dividDay = null; Calendar cal = Calendar.getInstance(); //예약시간 변환 SimpleDateFormat transFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); int turmMin = 0; int totalCallCnt = 0; int divideCnt = 0; int count = 1; //분할 카운트 if(!mjonMsgVO.getReserveYn().equals("N")) {//예약문자인 경우 시간 셋팅 Date toDate = transFormat.parse(mjonMsgVO.getReqDate()); cal.setTime(toDate); //예약 시간 캘린터 변수에 입력 //String 타입 시간 Int로 변환 turmMin = Integer.parseInt(mjonMsgVO.getDivideTime()); //분할발송 시간 간격 dividDay = transFormat.format(cal.getTime()); totalCallCnt = mjonMsgVO.getCallToList().length; // 수신자 전체 갯수 divideCnt = Integer.parseInt(mjonMsgVO.getDivideCnt()); //분할 발송 갯수 } //분할 예약 시간 저장 리스트 생성 List dividDayList = new ArrayList(); //서비스 단으로 특정 문자 건수 이상으로 한번에 보내지 않기 위해서 처리함 //200건이 넘으면 200개씩 서비스로 넘기고 if(callToListCnt > 200) { int sendCnt = 0; for(int i=0; i< callToListCnt; i++) { //분할 발송을 체크 한 경우 if(mjonMsgVO.getDivideChk() != null) { if(count > divideCnt) { count = 1; //분할 시간 간격을 증가시켜 준다. cal.add(Calendar.MINUTE, turmMin); dividDay = transFormat.format(cal.getTime()); dividDayList.add(dividDay); //tempVO.setReqDate(dividDay); //분할 문자 예약 시간 입력해주기 count++; }else { dividDayList.add(dividDay); //tempVO.setReqDate(dividDay); //분할 문자 예약 시간 입력해주기 count++; } } if((i < callToListCnt -1) && sendCnt == 199) { //sendCnt 200번째 값을 추가해준다. tempPhoneList[sendCnt] = phoneList[i]; if(nameList.length > 0) { tempNameList[sendCnt] = nameList[i]; } if(rep1List.length > 0) { tempRep1List[sendCnt] = rep1List[i]; } if(rep2List.length > 0) { tempRep2List[sendCnt] = rep2List[i]; } if(rep3List.length > 0) { tempRep3List[sendCnt] = rep3List[i]; } if(rep4List.length > 0) { tempRep4List[sendCnt] = rep4List[i]; } List arrPhoneList = new ArrayList(); List arrNameList = new ArrayList(); List arrRep1List = new ArrayList(); List arrRep2List = new ArrayList(); List arrRep3List = new ArrayList(); List arrRep4List = new ArrayList(); for(String temp : tempPhoneList) { if(temp != null) { arrPhoneList.add(temp); } } if(tempNameList.length > 0) { for(String tmpName : tempNameList) { if(tmpName != null) { arrNameList.add(tmpName); } } } if(tempRep1List.length > 0) { for(String tmpRep1 : tempRep1List) { if(tmpRep1 != null) { arrRep1List.add(tmpRep1); } } } if(tempRep2List.length > 0) { for(String tmpRep2 : tempRep2List) { if(tmpRep2 != null) { arrRep2List.add(tmpRep2); } } } if(tempRep3List.length > 0) { for(String tmpRep3 : tempRep3List) { if(tmpRep3 != null) { arrRep3List.add(tmpRep3); } } } if(tempRep4List.length > 0) { for(String tmpRep4 : tempRep4List) { if(tmpRep4 != null) { arrRep4List.add(tmpRep4); } } } //리스트에 추가된 내용 만큼 임시 수신목록 배열에 넣어준다. String[] sendPhoneList = new String[arrPhoneList.size()]; String[] sendNameList = new String[arrNameList.size()]; String[] sendRep1List = new String[arrRep1List.size()]; String[] sendRep2List = new String[arrRep2List.size()]; String[] sendRep3List = new String[arrRep3List.size()]; String[] sendRep4List = new String[arrRep4List.size()]; for(int j=0; j< arrPhoneList.size(); j++) { sendPhoneList[j] = arrPhoneList.get(j); } for(int k=0; k< arrNameList.size(); k++) { sendNameList[k] = arrNameList.get(k); } for(int k=0; k< arrRep1List.size(); k++) { sendRep1List[k] = arrRep1List.get(k); } for(int k=0; k< arrRep2List.size(); k++) { sendRep2List[k] = arrRep2List.get(k); } for(int k=0; k< arrRep3List.size(); k++) { sendRep3List[k] = arrRep3List.get(k); } for(int k=0; k< arrRep4List.size(); k++) { sendRep4List[k] = arrRep4List.get(k); } mjonMsgVO.setCallToList(sendPhoneList); if(sendNameList.length > 0) { mjonMsgVO.setNameList(sendNameList); } if(sendRep1List.length > 0) { mjonMsgVO.setRep1List(sendRep1List); } if(sendRep2List.length > 0) { mjonMsgVO.setRep2List(sendRep2List); } if(sendRep3List.length > 0) { mjonMsgVO.setRep3List(sendRep3List); } if(sendRep4List.length > 0) { mjonMsgVO.setRep4List(sendRep4List); } sendCnt = 0; mjonMsgVO.setDividDay(dividDayList); MjonMsgReturnVO returnVO = mjonMsgDataService.insertMsgDataInfo(mjonMsgVO); mjonMsgVO.setAgentCode(returnVO.getAgentCode()); resultSts = resultSts + Integer.parseInt(returnVO.getSendMsgCnt()); resultBlockSts = resultBlockSts + Integer.parseInt(returnVO.getSendMsgBlockCnt()); //발송 처리후 배열 초기화 Arrays.fill(tempPhoneList, null); dividDayList.clear(); System.out.println("========================================================================="); System.out.println("+++++++++++++++++++++++++++++++++++++++++++선거문자 ==> 199 resultSts ::: " + resultSts); System.out.println("+++++++++++++++++++++++++++++++++++++++++++선거문자 ==> 199 resultBlockSts ::: " + resultBlockSts); System.out.println("========================================================================="); }else if((i == callToListCnt -1) && sendCnt < 200){//수신목록 마지막이면서 200개 미만으로 남은 경우 발송 처리해준다. //마지막 리스트의 수신번호를 추가해 준다. tempPhoneList[sendCnt] = phoneList[i]; if(nameList.length > 0) { tempNameList[sendCnt] = nameList[i]; } if(rep1List.length > 0) { tempRep1List[sendCnt] = rep1List[i]; } if(rep2List.length > 0) { tempRep2List[sendCnt] = rep2List[i]; } if(rep3List.length > 0) { tempRep3List[sendCnt] = rep3List[i]; } if(rep4List.length > 0) { tempRep4List[sendCnt] = rep4List[i]; } List arrPhoneList2 = new ArrayList(); List arrNameList2 = new ArrayList(); List arrRep1List2 = new ArrayList(); List arrRep2List2 = new ArrayList(); List arrRep3List2 = new ArrayList(); List arrRep4List2 = new ArrayList(); for(String temp : tempPhoneList) { if(temp != null) { arrPhoneList2.add(temp); } } if(tempNameList.length > 0) { for(String tmpName : tempNameList) { if(tmpName != null) { arrNameList2.add(tmpName); } } } if(tempRep1List.length > 0) { for(String tmpRep1 : tempRep1List) { if(tmpRep1 != null) { arrRep1List2.add(tmpRep1); } } } if(tempRep2List.length > 0) { for(String tmpRep2 : tempRep2List) { if(tmpRep2 != null) { arrRep2List2.add(tmpRep2); } } } if(tempRep3List.length > 0) { for(String tmpRep3 : tempRep3List) { if(tmpRep3 != null) { arrRep3List2.add(tmpRep3); } } } if(tempRep4List.length > 0) { for(String tmpRep4 : tempRep4List) { if(tmpRep4 != null) { arrRep4List2.add(tmpRep4); } } } String[] sendPhoneList2 = new String[arrPhoneList2.size()]; String[] sendNameList2 = new String[arrNameList2.size()]; String[] sendRep1List2 = new String[arrRep1List2.size()]; String[] sendRep2List2 = new String[arrRep2List2.size()]; String[] sendRep3List2 = new String[arrRep3List2.size()]; String[] sendRep4List2 = new String[arrRep4List2.size()]; for(int j=0; j< arrPhoneList2.size(); j++) { sendPhoneList2[j] = arrPhoneList2.get(j); } for(int j=0; j< arrNameList2.size(); j++) { sendNameList2[j] = arrNameList2.get(j); } for(int k=0; k< arrRep1List2.size(); k++) { sendRep1List2[k] = arrRep1List2.get(k); } for(int k=0; k< arrRep2List2.size(); k++) { sendRep2List2[k] = arrRep2List2.get(k); } for(int k=0; k< arrRep3List2.size(); k++) { sendRep3List2[k] = arrRep3List2.get(k); } for(int k=0; k< arrRep4List2.size(); k++) { sendRep4List2[k] = arrRep4List2.get(k); } mjonMsgVO.setCallToList(sendPhoneList2); if(sendNameList2.length > 0) { mjonMsgVO.setNameList(sendNameList2); } if(sendRep1List2.length > 0) { mjonMsgVO.setRep1List(sendRep1List2); } if(sendRep2List2.length > 0) { mjonMsgVO.setRep2List(sendRep2List2); } if(sendRep3List2.length > 0) { mjonMsgVO.setRep3List(sendRep3List2); } if(sendRep4List2.length > 0) { mjonMsgVO.setRep4List(sendRep4List2); } sendCnt = 0; mjonMsgVO.setDividDay(dividDayList); MjonMsgReturnVO returnVO = mjonMsgDataService.insertMsgDataInfo(mjonMsgVO); mjonMsgVO.setAgentCode(returnVO.getAgentCode()); resultSts = resultSts + Integer.parseInt(returnVO.getSendMsgCnt()); resultBlockSts = resultBlockSts + Integer.parseInt(returnVO.getSendMsgBlockCnt()); System.out.println("========================================================================="); System.out.println("+++++++++++++++++++++++++++++++++++++++++++선거문자 ==> 200 resultSts ::: " + resultSts); System.out.println("+++++++++++++++++++++++++++++++++++++++++++선거문자 ==> 200 resultBlockSts ::: " + resultBlockSts); System.out.println("========================================================================="); }else { tempPhoneList[sendCnt] = phoneList[i]; if(nameList.length > 0) {//이름 치환문자가 있는 경우 tempNameList[sendCnt] = nameList[i]; } if(rep1List.length > 0) {//치환1 문자가 있는 경우 tempRep1List[sendCnt] = rep1List[i]; } if(rep2List.length > 0) {//치환2 문자가 있는 경우 tempRep2List[sendCnt] = rep2List[i]; } if(rep3List.length > 0) {//치환3 문자가 있는 경우 tempRep3List[sendCnt] = rep3List[i]; } if(rep4List.length > 0) {//치환4 문자가 있는 경우 tempRep4List[sendCnt] = rep4List[i]; } sendCnt++; } } }else {//200건 미만일 경우 한번에 발송 처리 //분할 발송을 체크 한 경우 if(mjonMsgVO.getDivideChk() != null) { for(int i=0; i< callToListCnt; i++) { if(count > divideCnt) { count = 1; //분할 시간 간격을 증가시켜 준다. cal.add(Calendar.MINUTE, turmMin); dividDay = transFormat.format(cal.getTime()); dividDayList.add(dividDay); //tempVO.setReqDate(dividDay); //분할 문자 예약 시간 입력해주기 count++; }else { dividDayList.add(dividDay); //tempVO.setReqDate(dividDay); //분할 문자 예약 시간 입력해주기 count++; } } } mjonMsgVO.setDividDay(dividDayList); MjonMsgReturnVO returnVO = mjonMsgDataService.insertMsgDataInfo(mjonMsgVO); mjonMsgVO.setAgentCode(returnVO.getAgentCode()); resultSts = Integer.parseInt(returnVO.getSendMsgCnt()); resultBlockSts = Integer.parseInt(returnVO.getSendMsgBlockCnt()); System.out.println("========================================================================="); System.out.println("+++++++++++++++++++++++++++++++++++++++++++200건 미만 건수 선거문자 ==> resultSts ::: " + resultSts); System.out.println("+++++++++++++++++++++++++++++++++++++++++++200건 미만 건수 선거문자 ==> resultBlockSts ::: " + resultBlockSts); System.out.println("========================================================================="); } System.out.println("========================================================================="); System.out.println("+++++++++++++++++++++++++++++++++++++++++++최종 건수 선거문자 ==> resultSts ::: " + resultSts); System.out.println("+++++++++++++++++++++++++++++++++++++++++++최종 건수 선거문자 ==> resultBlockSts ::: " + resultBlockSts); System.out.println("========================================================================="); try { //문자 발송 캐시 차감 해주기 /*MjonPayVO mjonPayVO = new MjonPayVO(); if(resultSts > 0 && resultBlockSts > 0) { Float blockPrice = Float.parseFloat(mjonMsgVO.getEachPrice()) * resultBlockSts; Float resultTotPrice = Float.parseFloat(mjonMsgVO.getTotPrice()); Float endPrice = resultTotPrice - blockPrice; mjonMsgVO.setTotPrice(Float.toString(endPrice)); //수신거부가 있는 경우 총 건수에서 수신거부 건수를 차감 후 그룹 테이블에 업데이트 해준다. int groupCnt = resultSts; mjonMsgVO.setMsgGroupCnt(Integer.toString(groupCnt)); //mjonMsgDAO.updateGroupMsgData(mjonMsgVO); } //1건 이상 발송이 있는 경우만 캐쉬를 차감 시킨다. if(resultSts > 0) { mjonPayVO.setCashId(idgenMjonCashId.getNextStringId()); mjonPayVO.setUserId(mjonMsgVO.getUserId()); mjonPayVO.setCash(-Float.parseFloat(mjonMsgVO.getTotPrice())); mjonPayVO.setFrstRegisterId(mjonMsgVO.getUserId()); mjonPayVO.setMemo("SMS 문자 " + resultSts + "건 발송"); mjonPayVO.setMsgGroupId(mjonMsgVO.getMsgGroupId()); mjonPayService.insertCash(mjonPayVO); //캐시차감 mjonPayService.updateMemberCash(mjonPayVO); //회원정보 업데이트 } //문자 발송 테이블에 입력 데이터가 있는 경우 그룹 테이블에도 입력 해 준다. if(resultSts > 0) { // 문자 전송 그룹 테이블에 정보 입력 int groupCnt = resultSts; mjonMsgVO.setMsgGroupCnt(Integer.toString(groupCnt)); mjonMsgService.insertGroupMsgData(mjonMsgVO); //이벤트 회원 남은 캐시 업데이트 fnUpdateEventRemainCash(mjonPayVO); }*/ //스팸문구 포함된 문자 발송의 경우 스팸 문구 내용도 별도 저장함. String spamStatus = mjonMsgVO.getSpamStatus(); if(spamStatus == null) { spamStatus = "N"; mjonMsgVO.setSpamStatus("N"); } if(spamStatus.equals("Y")) { int resultCnt = mjonSpamMsgService.insertSpamKeyWordMsgData(mjonMsgVO); System.out.println("+++++++++++++스팸문구 발송 내용 등록 +++++++++++++++++++++ "+resultCnt); } } catch (Exception e) { System.out.println("========================================================================="); System.out.println("+++++++++++++++++++++++++++++ 선거문자 ==> MJ_MSG_GROUP && CASH INSER ERROR !!! : " + e.getMessage()); System.out.println("========================================================================="); } /*//문자 발송 처리 //resultSts = mjonMsgDataService.insertMsgDataInfo(mjonMsgVO); MjonMsgReturnVO returnVO = mjonMsgDataService.insertMsgDataInfo(mjonMsgVO); resultSts = returnVO.getSendMsgCnt(); resultBlockSts = returnVO.getSendMsgBlockCnt();*/ }else { modelAndView.addObject("message", "문자 발송에 필요한 보유 잔액이 부족 합니다."); modelAndView.addObject("result", "fail"); modelAndView.addObject("resultSts", "0"); modelAndView.addObject("resultBlockSts", "0"); return modelAndView; } //문자 발송 후 남은 보유 캐시 정보 불러오기 String afterCash = mjonMsgDataService.selectBeforeCashData(mjonMsgVO); modelAndView.addObject("afterCash", afterCash); }catch(Exception e) { System.out.println("========================================================================="); System.out.println("+++++++++++++++++++++++++++++ 선거문자 ==> 기타 시스템 오류 !!! : " + e.getMessage()); System.out.println("========================================================================="); logger.error(e.getMessage(), e); modelAndView.addObject("result", "fail"); modelAndView.addObject("message", "기타 시스템 오류 : " + e.getMessage()); } //if(!resultSts.equals("0")) { modelAndView.addObject("message", "문자 전송이 완료되었습니다."); modelAndView.addObject("result", "success"); modelAndView.addObject("resultSts", resultSts); modelAndView.addObject("resultBlockSts", resultBlockSts); /*}else { modelAndView.addObject("message", "문자 전송에 오류가 발생하였습니다."); modelAndView.addObject("result", "fail"); modelAndView.addObject("resultSts", "0"); modelAndView.addObject("resultBlockSts", "0"); }*/ /** * 사용자가 보낸 문자를 문자온 법인폰으로도 하나 전송하는 기능 시작 * * */ try { if(resultSts > 0) {//전송 결과가 한건 이상인 경우 String adminSmsNoticeYn = "Y"; String smishingYn = "N"; String spamStatus = mjonMsgVO.getSpamStatus(); //스미싱 의심으로 체크된 문자 정보 UserManageVO userManageVO = new UserManageVO(); userManageVO.setMberId(userId); if(!userId.equals("")) { userManageVO = userManageService.selectAdminSmsNoticeYn(userManageVO); adminSmsNoticeYn = userManageVO.getAdminSmsNoticeYn(); smishingYn = userManageVO.getSmishingYn(); } //법인폰 알림 온 이거나 스미싱의심 문자인 경우 법인폰으로 발송 if(adminSmsNoticeYn.equals("Y") || spamStatus.equals("Y") || smishingYn.equals("Y")) { if(spamStatus.equals("Y")) { mjonMsgVO.setDelayYn("Y"); }else if(smishingYn.equals("Y")) { mjonMsgVO.setSmishingYn("Y"); } // 법인폰 알람여부 체크 JoinSettingVO joinSettingVO = new JoinSettingVO(); joinSettingVO = egovSiteManagerService.selectAdminNotiDetail(); // SMS 체크 if (joinSettingVO != null && joinSettingVO.getSmsNoti().equals("Y")) { getAdminPhoneSendMsgData(mjonMsgVO); } // SLACK 체크 if (joinSettingVO != null && joinSettingVO.getSlackNoti().equals("Y")) { //Slack으로 메세지 전송 처리 MjonCommon comm = new MjonCommon(); comm.getAdminSandSlack(mjonMsgVO); } } } } catch (Exception e) { throw new Exception("++++++++++++++++++++++ 선거문자 메뉴 getAdminPhoneSendMsgData Error !!! " + e); } return modelAndView; } /** * 관리자로 문자 발송해주기 * 사용자가 보낸 문자를 문자온 법인폰으로 발송해주는 기능 함수. * 일반문자 와 대량 문자 모두 적용하고 있음 * 2022.09.19 우영두 추가 * * */ public boolean getAdminPhoneSendMsgData(MjonMsgVO mjonMsgVO) throws Exception{ try { mjonMsgVO.setUserId("system");//시스템 발송 문자로 처리 //전송사 선택 String msgType = mjonMsgVO.getMsgType(); int fileCount = Integer.parseInt(mjonMsgVO.getFileCnt());//그림 이미지 갯수 //예약문자를 발송하는 경우 문자 내용 앞에 "[예약]" 표시되도록 처리 - 법인폰으로 발송되는 문자내용 수정함.20221123 추가 //스팸/스미싱 대상자 문자를 발송하는 경우 문자 내용 앞에 "[발송지연문자]" 표시되도록 처리 - 법인폰으로 발송되는 문자내용 수정함.20221202 추가 String reserveYn = mjonMsgVO.getReserveYn(); String delayYn = mjonMsgVO.getDelayYn(); String smishingYn = mjonMsgVO.getSmishingYn(); String smsTxt = mjonMsgVO.getSmsTxt(); String transSmsTxt = smsTxt; if(reserveYn.equals("Y")) { if(smishingYn.equals("Y") || delayYn.equals("Y")) { transSmsTxt = "[스미싱의심][예약]" + smsTxt; }else { transSmsTxt = "[예약]" + smsTxt; } }else if(delayYn.equals("Y")) { transSmsTxt = "[스미싱의심]" + smsTxt; } //[예약], [발송지연문자] 문구 추가시 문자열 길이 및 문자 종류 재계산 하기 String charset = "euc-kr"; int bytes = transSmsTxt.getBytes(charset).length; //발송 문자 길이 if(bytes > 2000) {//문자열 길이가 2000을 넘어가면 [예약], [발송지연문자] 문구를 제외한 원래 문구를 넣어준다. 안그러면 문자전송이 실패하게 됨. mjonMsgVO.setSmsTxt(smsTxt); }else { //[예약], [발송지연문자] 문구를 추가한 내용으로 메세지 내용을 셋팅해 준다. mjonMsgVO.setSmsTxt(transSmsTxt); if(bytes > 90) {//장문일 경우 문자타입을 변경해준다. msgType = "6"; mjonMsgVO.setMsgType(msgType); } } // 문자타입 구분 if (msgType.equals("4")) { mjonMsgVO.setMsgDiv("S"); // 단문 } else if (msgType.equals("6")) { if (fileCount > 0) { mjonMsgVO.setMsgDiv("P"); // 그림 mjonMsgVO.setNeoType("4"); } else { mjonMsgVO.setMsgDiv("L"); // 장문 } } // 문자타입별 대표전송사 정보 MjonMsgVO mjonMsgVO2 = new MjonMsgVO(); mjonMsgVO2 = mjonMsgService.selectRepMsgAgetnInfo(mjonMsgVO); // 전송사 구분 코드 - 01 : 아이하트, 02 : 현대 퓨쳐넷, 03 : 아이엠오, 04 : 다우기술 mjonMsgVO.setAgentCode(mjonMsgVO2.getAgentCode()); //전송사 선택 // 전송금액 mjonMsgVO.setTotPrice(mjonMsgVO2.getAgentPrice().toString()); //총금액 mjonMsgVO.setEachPrice(mjonMsgVO2.getAgentPrice().toString()); //한건 금액 //수신번호가 배열로 되어있어서 배열에 담아준다. String[] phone = new String[1]; String callTo = "01084329333"; phone[0] = callTo; mjonMsgVO.setCallToList(phone);//수신번호 리스트 //시스템 로그용 수신 정보 mjonMsgVO.setCallTo("help@iten.co.kr"); //현재 고객의 보유 캐시가 문자 발송이 가능한 금액인지 체크 //String userMoney = "0.0"; String userPoint = "0.0"; mjonMsgVO.setBefPoint(userPoint); //현재 보유 포인트 정보 저장 mjonMsgVO.setBefCash("0.0"); //관리자가 발송하는 것이라서 0원으로 입력 mjonMsgVO.setMsgGroupCnt("1"); //문자종류 관리자가 발송하는 것은 msgKind : S 로 셋팅 mjonMsgVO.setMsgKind("S"); Date now = new Date(); SimpleDateFormat sdFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); mjonMsgVO.setReqDate(sdFormat.format(now)); //문자 발송 처리 mjonMsgDataService.insertAdmToMberMsgDataInfo(mjonMsgVO); } catch (Exception e) { throw new Exception("+++++++++++++++++++++++++++++ getAdminPhoneSendMsgData Function Error !!!" + e); } return true; } //이벤트 회원 캐시 변경 함수 public void fnUpdateEventRemainCash(MjonPayVO mjonPayVO) throws Exception{ //이벤트 회원인 경우 이벤트 캐시도 함께 차감. MjonEventVO mjonEventVO = new MjonEventVO(); mjonEventVO.setMberId(mjonPayVO.getUserId()); mjonEventVO.setEventStatus("Y"); MjonEventVO eventMberInfo = mjonEventService.selectEventMsgMberDefaultInfo(mjonEventVO); if(eventMberInfo != null) { float evntRemainCash = (float) eventMberInfo.getEventRemainCash(); float totPrice = (float) Math.abs(mjonPayVO.getCash()); float totRemainCash = evntRemainCash - totPrice; mjonEventVO.setEventInfoId(eventMberInfo.getEventInfoId()); if(totRemainCash <= 0.0) {//차감액이 남아있지 않으면 이벤트를 종료 //이벤트 상태값을 종료로 변경한다. mjonEventVO.setEventStatus("E"); mjonEventVO.setEventRemainCash(0.0); mjonEventService.updateEventEndStatus(mjonEventVO); }else {//이벤트 회원 캐시 차감시킴 mjonEventVO.setEventRemainCash(totRemainCash); mjonEventService.updateEventRemainCash(mjonEventVO); } } } /** * 선거문자 내 문자함 저장 화면 * @param searchVO * @param model * @return "/web/mjon/msgcampain/insertMyMsgDataAjax.do" * @throws Exception */ @RequestMapping(value= {"/web/mjon/msgcampain/insertMyMsgDataAjax.do"}) public ModelAndView insertMyMsgDataAjax(MjonMsgDataVO mjonMsgDataVO, RedirectAttributes redirectAttributes, ModelMap model) throws Exception{ ModelAndView modelAndView = new ModelAndView(); modelAndView.setViewName("jsonView"); //로그인 권한정보 불러오기 LoginVO user = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null; if(user != null) { mjonMsgDataVO.setUserId(user.getId()); }else { modelAndView.addObject("message", "로그인 후 이용이 가능합니다."); modelAndView.addObject("result", "fail"); return modelAndView; } //문자에 첨부된 이미지 파일 아이디를 셋팅해준다. int i = 0; for(String fileId : mjonMsgDataVO.getImgFileId()) { if(i == 0) { mjonMsgDataVO.setAtchFileId1(fileId); }else if(i == 1) { mjonMsgDataVO.setAtchFileId2(fileId); }else if(i == 2) { mjonMsgDataVO.setAtchFileId3(fileId); } i++; } // 디비에 문자 내용을 저장해 준다. int resultSts = mjonMsgDataService.insertMyMsgDataAjax(mjonMsgDataVO); if(resultSts > 0) { modelAndView.addObject("message", "문자가 저장되었습니다."); modelAndView.addObject("result", "success"); }else { modelAndView.addObject("message", "문자가 저장이 실패 되었습니다."); modelAndView.addObject("result", "fail"); } return modelAndView; } /** * 선거문자 이미지에디터 팝업 * @param searchVO * @param model * @return "/web/mjon/msgcampain/openImageEditorPopup.do" * @throws Exception */ @RequestMapping(value= {"/web/mjon/msgcampain/openImageEditorPopup.do"}) public String openImageEditorPopup(@ModelAttribute("searchVO") MjonMsgDataVO searchVO, CateCode cateCode, ModelMap model) throws Exception{ // 그림문자 카테고리 리스트 불러오기 List cateConfList = letterService.selectCateConfWithList("N"); model.addAttribute("cateCodeList", cateConfList); //그림 문자 리스트 불러오기 LetterVO letterVO = new LetterVO(); if(letterVO.getPageUnit() != 10) { letterVO.setPageUnit(letterVO.getPageUnit()); } /** paging */ PaginationInfo paginationInfo = new PaginationInfo(); paginationInfo.setCurrentPageNo(letterVO.getPageIndex()); paginationInfo.setRecordCountPerPage(letterVO.getPageUnit()); paginationInfo.setPageSize(letterVO.getPageSize()); letterVO.setFirstIndex(paginationInfo.getFirstRecordIndex()); letterVO.setLastIndex(paginationInfo.getLastRecordIndex()); letterVO.setRecordCountPerPage(paginationInfo.getRecordCountPerPage()); List resultPhoList = mjonMsgDataService.selectPhotoLetterList(letterVO); model.addAttribute("resultPhoList", resultPhoList); paginationInfo.setTotalRecordCount( resultPhoList.size()> 0 ? ((Long)((EgovMap)resultPhoList.get(0)).get("totCnt")).intValue() : 0); model.addAttribute("paginationInfo", paginationInfo); return "web/msgdata/imageEditorPopup"; } /** * 선거문자 에디터에서 수정한 이미지 등록 Ajax * @param mjonMsgDataVO * @param model * @return modelAndView * @throws Exception */ @RequestMapping(value = {"/web/mjon/msgcampain/insertEditImageAjax.do"}) public ModelAndView insertEditImageAjax(final MultipartHttpServletRequest multiRequest , MjonMsgDataVO mjonMsgDataVO , RedirectAttributes redirectAttributes , HttpServletRequest request) throws Exception { //LoginVO user = (LoginVO) EgovUserDetailsHelper.getAuthenticatedUser(); ModelAndView modelAndView = new ModelAndView(); modelAndView.setViewName("jsonView"); try { String atchFileId = ""; String isThumbFile = ""; String imagePath = ""; final Map files = multiRequest.getFileMap(); String KeyStr = "CANVASIMG_"; Date now = new Date(); SimpleDateFormat formatDate = new SimpleDateFormat("yyyyMMdd"); String fdlDate = formatDate.format(now); //로컬 과 개발서버의 이미지 저장 경로 분기처리 if(request.getServerName().equals("localhost")) { imagePath = fileSaveDir+"src/main/webapp" + "/MMS/" + fdlDate; }else { /*imagePath = "C:/eGovFrameDev-3.9.0-64bit_ncms/workspace/mjon/src/main/webapp/MMS/" + fdlDate;*/ /*imagePath = "/usr/local/tomcat_mjon/webapps/mjon/MMS/" + fdlDate;*/ imagePath = fileSaveDir+"/file/MMS/" + fdlDate; } if (!files.isEmpty()) { List result = fileUtil.parseImageFileInf(files, KeyStr, 0, atchFileId, imagePath, isThumbFile); atchFileId = fileMngService.insertFileInfs(result); FileVO tmpVO = new FileVO(); tmpVO.setAtchFileId(atchFileId); //insert 한 파일의 정보를 가지고 옴 FileVO fileVO = new FileVO(); fileVO = fileMngService.selectFileInf(tmpVO); //저장한 파일의 경로 + 파일명 String filefullPath = fileVO.getFileStreCours() +"/"+ fileVO.getStreFileNm() + "." + fileVO.getFileExtsn(); modelAndView.addObject("atchFileId", atchFileId); modelAndView.addObject("filefullPath", filefullPath); modelAndView.addObject("result", "success"); //modelAndView.addObject("message", "이미지 업로드가 완료되었습니다."); } }catch(Exception e) { logger.error(e.getMessage(), e); modelAndView.addObject("result", "fail"); modelAndView.addObject("message", "기타 시스템 오류 : " + e.getMessage()); } return modelAndView; } /** * 선거문자 내문자함 문자내용 선택시 정보 불러오기 * @param String msgId, String pageType * @param model * @return modelAndView * @throws Exception */ @RequestMapping(value = {"/web/mjon/msgcampain/selectMsgAddInfoAjax.do"}) public ModelAndView selectMsgAddInfoAjax(@RequestParam Map commandMap , MjonMsgDataVO mjonMsgDataVO , HttpServletRequest request) throws Exception { ModelAndView modelAndView = new ModelAndView(); modelAndView.setViewName("jsonView"); /*LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null; String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());*/ try { //MjonMsgDataVO mjonMsgDataVO = new MjonMsgDataVO(); //mjonMsgDataVO.setMsgId(commandMap.get("msgId").toString()); //mjonMsgDataVO.setPageType(commandMap.get("pageType").toString()); //내 문자함 내용 및 첨부파일 정보 불러오기 MjonMsgDataVO resultMsgInfo = mjonMsgDataService.selectMsgAddInfoAjax(mjonMsgDataVO); //문자함 리스트의 첨부이미지 정보 불러오기 List resultMsgAddPhotoInfo = mjonMsgDataService.selectMsgAddPhotoInfo(resultMsgInfo); modelAndView.addObject("resultMsgInfo", resultMsgInfo); modelAndView.addObject("resultMsgAddPhotoInfo", resultMsgAddPhotoInfo); modelAndView.addObject("result", "success"); //modelAndView.addObject("message", "이미지 업로드가 완료되었습니다."); }catch(Exception e) { logger.error(e.getMessage(), e); modelAndView.addObject("result", "fail"); modelAndView.addObject("message", "기타 시스템 오류 : " + e.getMessage()); } return modelAndView; } /** * 선거문자 발송 - 엑셀파일 불러오기 * @param body * @param uploadFile * @param search * @param result * @param model * @param request * @return * @throws Exception */ @RequestMapping(value = "/web/mjon/msgcampain/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; int errNameCnt = 0; int errRep1Cnt = 0; int errRep2Cnt = 0; int errRep3Cnt = 0; int errRep4Cnt = 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; boolean errSts = true; //셀 값에 오류 여부 체크 for(int j = 0 ; j < 6; j++){ //행읽기(6행까지나 2행까지만 필요) cellValue = ""; cell = row.getCell(j); //이름/핸드폰/변환1/변환2/변환3/변환4/변환5 if(null == cell || "".equals(cell.toString().trim())) { //셀에 값이 없으면 //System.out.println("Cell 데이터가 없습니다."); 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) { //이름 boolean nmChk = getNameRepLenChk("name", cellValue); if(nmChk && errSts) { jm.put("name", cellValue); }else { errNameCnt++; errSts = false; break; } } if(j == 1) { //전화번호 if(cellValue.matches(phoneRegExp) && errSts) { jm.put("phone", cellValue); }else { errPhoneCnt++; errSts = false; break; } } if(j == 2) { //치환1 boolean repChk = getNameRepLenChk("rep", cellValue); if(repChk && errSts) { jm.put("replace1", cellValue); }else { errRep1Cnt++; errSts = false; break; } } if(j == 3) { //치환2 boolean repChk = getNameRepLenChk("rep", cellValue); if(repChk && errSts) { jm.put("replace2", cellValue); }else { errRep2Cnt++; errSts = false; break; } } if(j == 4) { //치환3 boolean repChk = getNameRepLenChk("rep", cellValue); if(repChk && errSts) { jm.put("replace3", cellValue); }else { errRep3Cnt++; errSts = false; break; } } if(j == 5) { //치환4 boolean repChk = getNameRepLenChk("rep", cellValue); if(repChk && errSts) { jm.put("replace4", cellValue); }else { errRep4Cnt++; errSts = false; break; } } } if(null != jm.get("phone") && errSts) { json.add(jm); } } int resultErrCnt = errPhoneCnt + errNameCnt + errRep1Cnt + errRep2Cnt + errRep3Cnt + errRep4Cnt; int resultErrCntExceptPhone = errPhoneCnt + errNameCnt + errRep1Cnt + errRep2Cnt + errRep3Cnt + errRep4Cnt; jr.setData(json); jr.setSuccess(true); if(resultErrCnt > 0) { jr.setMessage("유효하지 않은 형식의 전화번호 "+ errPhoneCnt +"건,\n이름 : 20byte, [*1*] [*2*] : 40byte 제한글자수 초과 "+ resultErrCntExceptPhone +"건 있습니다.\n해당 건을 제외하고 문자 발송됩니다."); }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; boolean errSts = true; for(int j = 0 ; j < 6; j++){ //행읽기(6행까지나 2행까지만 필요) cellValue = ""; cell = row.getCell(j); //이름/핸드폰/변환1/변환2/변환3/변환4/변환5 if(null == cell || "".equals(cell.toString().trim())) { //셀에 값이 없으면 //System.out.println("Cell 데이터가 없습니다."); 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) { //이름 boolean nmChk = getNameRepLenChk("name", cellValue); if(nmChk && errSts) { jm.put("name", cellValue); }else { errNameCnt++; errSts = false; break; } } if(j == 1) { //전화번호 if(cellValue.matches(phoneRegExp) && errSts) { jm.put("phone", cellValue); }else { errPhoneCnt++; errSts = false; break; } } if(j == 2) { //치환1 boolean repChk = getNameRepLenChk("rep", cellValue); if(repChk && errSts) { jm.put("replace1", cellValue); }else { errRep1Cnt++; errSts = false; break; } } if(j == 3) { //치환2 boolean repChk = getNameRepLenChk("rep", cellValue); if(repChk && errSts) { jm.put("replace2", cellValue); }else { errRep2Cnt++; errSts = false; break; } } if(j == 4) { //치환3 boolean repChk = getNameRepLenChk("rep", cellValue); if(repChk && errSts) { jm.put("replace3", cellValue); }else { errRep3Cnt++; errSts = false; break; } } if(j == 5) { //치환4 boolean repChk = getNameRepLenChk("rep", cellValue); if(repChk && errSts) { jm.put("replace4", cellValue); }else { errRep4Cnt++; errSts = false; break; } } } if(null != jm.get("phone") && errSts) { json.add(jm); } } int resultErrCnt = errPhoneCnt + errNameCnt + errRep1Cnt + errRep2Cnt + errRep3Cnt + errRep4Cnt; int resultErrCntExceptPhone = errPhoneCnt + errNameCnt + errRep1Cnt + errRep2Cnt + errRep3Cnt + errRep4Cnt; jr.setData(json); jr.setSuccess(true); if(resultErrCnt > 0) { jr.setMessage("유효하지 않은 형식의 전화번호 "+ errPhoneCnt +"건,\n이름 : 20byte, [*1*] [*2*] : 40byte 제한글자수 초과 "+ resultErrCntExceptPhone +"건 있습니다.\n해당 건을 제외하고 문자 발송됩니다."); }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/msgcampain/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("\t"); if(tempStr.length > 0) { splitedStr = tempStr; }else { splitedStr = line.split(","); } 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) { //치환1 jm.put("replace1", splitedStr[i]); } if(i == 3) { //치환2 jm.put("replace2", splitedStr[i]); } if(i == 4) { //치환3 jm.put("replace3", splitedStr[i]); } if(i == 5) { //치환4 jm.put("replace4", 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; } /** * 선거문자 엑셀 불러오기 레이어 팝업 화면 * @param searchVO * @param model * @return "/web/mjon/msgcampain/excelCallAjax.do" * @throws Exception */ @RequestMapping(value= {"/web/mjon/msgcampain/excelCallAjax.do"}) public String excelCallAjax(@ModelAttribute("searchVO") MjonMsgDataVO searchVO, CateCode cateCode, ModelMap model) throws Exception{ return "web/msgcampain/ExcelCallAjax"; } /** * 선거문자 발송 - 엑셀파일 불러오기 * @param body * @param uploadFile * @param search * @param result * @param model * @param request * @return * @throws Exception */ @RequestMapping(value = "/web/mjon/msgcampain/excelCallProc.do") @ResponseBody public Object excelProc(@RequestBody(required = false) String body, List uploadFile, BindingResult result, Model model, MultipartHttpServletRequest request) throws Exception { JsonResult jr = new JsonResult(); jr.setSuccess(false); jr.setMessage("엑셀 파일만 업로드할 수 있습니다."); //String sReturn = super.checkReferer(model, request, "", "", "/sms/mms.do", "/sms/sms.do"); String sReturn = ""; if (!StringUtil.isEmpty(sReturn)) { jr.setMessage("올바르지 않은 요청입니다."); return jr; } //mime : application/vnd.openxmlformats-officedocument.spreadsheetml.sheet // application/vnd.ms-excel if (uploadFile.get(0).getSize() > 0 && (uploadFile.get(0).getContentType().indexOf("spreadsheetml") > -1) || uploadFile.get(0).getContentType().indexOf("ms-excel") > -1 || uploadFile.get(0).getOriginalFilename().split("[.]")[1].indexOf("xlsx") > -1 || uploadFile.get(0).getOriginalFilename().split("[.]")[1].indexOf("xls") > -1) { String col = "A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z"; String[] cols = col.split(","); //List> excel = ExcelUploadUtil.readExcel(request, super.getConfig().getUploadPathTemp(), cols, 2); //List> excel = null; String UploadPathTemp = "/temp"; //List> excel = ExcelUploadUtil.readExcel(request, super.getConfig().getUploadPathTemp(), cols, 2); //List> excel = ExcelUploadUtil.readExcel(request, UploadPathTemp, cols, 2); OPCPackage opcPackage = OPCPackage.open(uploadFile.get(0).getInputStream()); XSSFWorkbook workbook = new XSSFWorkbook(opcPackage); XSSFSheet sheet = workbook.getSheetAt(0); // 첫번째 시트 불러오기 String errMessage = ""; String cellValue = ""; if(sheet.getLastRowNum() > 5000) { // errMessage = "5000줄 이상의 업로드는 데이터 부하로 업로드 할수 없습니다."; jr.setMessage(errMessage); return jr; } //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>(); PhoneVO pVO = new PhoneVO(); for(int i=1; i< sheet.getLastRowNum() + 1; i++){ //먼저 밸리데이션 체크(1줄은 생략) XSSFRow row = sheet.getRow(i); //열읽기 if(null == row) { continue; } HashMap jm = new HashMap<>(); jm.put("group", ""); //그룹 빈칸세팅 // 행의 두번째 열(이름부터 받아오기) XSSFCell cell = null; for(int j = 0 ; j < 6; j++){ //행읽기(6행까지나 2행까지만 필요) cellValue = ""; cell = row.getCell(j); //이름/핸드폰/집사무실/메모1/메모2/메모3 if(null == cell || "".equals(cell.toString().trim())) { //셀에 값이 없으면 } 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("receive", cellValue); } } if(j == 2) { //집사무실 jm.put("item2", cellValue); } if(j == 3) { //메모1 jm.put("item3", cellValue); } if(j == 4) { //메모2 jm.put("item4", cellValue); } if(j == 5) { //메모3 jm.put("item5", cellValue); } } if(null != jm.get("receive")) { json.add(jm); } } //json 형식에 맞게 변환 //[{phone: '전화번호', name: '주소록이름', group: '주소록 그룹 이름', item2: '집/사무실', item3: '메모1', item4: '메모2', item5: '메모3'}, {...}] /*List> json = new ArrayList>(); PhoneVO pVO = new PhoneVO();*/ //TODO : 데이터 유효성 판단? /*for (HashMap map : excel) { HashMap jm = new HashMap<>(); //핸드폰 pVO.setNo(StringUtil.getString(map.get(cols[1])).trim()); if (StringUtil.isEmpty(pVO.getNo())) continue; jm.put("receive", pVO.getNo()); //이름 jm.put("name", StringUtil.getString(map.get(cols[0])).trim()); //그룹 jm.put("group", ""); //항목2(집/사무실) - 주의 : 옵션 항목이므로 전화번호가 없어도 스킵하면 안됨 pVO.setNo(StringUtil.getString(map.get(cols[2])).trim()); jm.put("item2", pVO.getNo()); //항목3 jm.put("item3", StringUtil.getString(map.get(cols[3])).trim()); //항목4 jm.put("item4", StringUtil.getString(map.get(cols[4])).trim()); //항목5 jm.put("item5", StringUtil.getString(map.get(cols[5])).trim()); json.add(jm); }*/ jr.setData(json); jr.setSuccess(true); jr.setMessage(""); } return jr; } public boolean getNameRepLenChk(String type, String value) { boolean rtnValue = true; if(type.equals("name")) { String tmpNm = value; int nmLen = tmpNm.length(); if(nmLen > 12) { rtnValue = false; } }else if(type.equals("rep")) { String tmpRep = value; int repLen = tmpRep.length(); if(repLen > 20) { rtnValue = false; } } return rtnValue; } }