package itn.let.mjo.msgcampain.web; import java.math.BigDecimal; import java.math.RoundingMode; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.List; import java.util.stream.Collectors; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.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.LoginVO; import itn.com.cmm.service.EgovCmmUseService; import itn.com.cmm.service.EgovFileMngService; import itn.com.cmm.service.EgovFileMngUtil; import itn.com.cmm.util.MJUtil; 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.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.pay.service.MjonPayService; 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 MjonMsgCampainHGDataController { @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; /** * 선거 문자 대량 발송 화면 * @param searchVO * @param model * @return "/web/mjon/msgcampain/huge/selectMsgHGDataView.do" * @throws Exception */ @RequestMapping(value= {"/web/mjon/msgcampain/huge/selectMsgHGDataView.do"}) public String selectMsgHGDataView(@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); // 문자 재전송 New model.addAttribute("msgResendAllFlag", searchVO.getMsgResendAllFlag()); model.addAttribute("msgResendAllGroupId", searchVO.getMsgResendAllGroupId()); model.addAttribute("msgResendAllAdvertiseYn", searchVO.getMsgResendAllAdvertiseYn()); model.addAttribute("msgResendAllReplaceYn", searchVO.getMsgResendAllReplaceYn()); return "web/msgcampain/huge/MsgHGDataView"; } /** * 선거 문자 대량 발송 단문/장문/그림문자 전송 화면 * @param searchVO * @param model * @return "/web/mjon/msgcampain/huge/selectMsgHGDataSMLViewAjax.do" * @throws Exception */ @RequestMapping(value= {"/web/mjon/msgcampain/huge/selectMsgHGDataSMLViewAjax.do"}) public String selectMsgHGDataSMLView(@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); model.addAttribute("mberManageVO", mberManageVO); return "web/msgcampain/huge/MsgHGDataSMLView"; } /** * 선거문자 10만건 이상 대량 문자 발송 처리 * @param searchVO * @param model * @return "/web/mjon/msgcampain/huge/sendMsgHGDataAjax.do" * @throws Exception */ @RequestMapping(value= {"/web/mjon/msgcampain/huge/sendMsgHGDataAjax.do"}) public ModelAndView sendMsgHGDataAjax(@ModelAttribute("searchVO") MjonMsgVO mjonMsgVO, RedirectAttributes redirectAttributes, HttpServletRequest request, ModelMap model) throws Exception{ ModelAndView modelAndView = new ModelAndView(); modelAndView.setViewName("jsonView"); int resultSts = 0; //발송결과 건수 int resultBlockSts = 0; //수신거부 등록번호로 발송을 안한 건수 //로그인 권한정보 불러오기 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 { 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; } } try { /*+++++++++화면에서 사용하지 않는 값 디폴트 셋팅++++++++++++++*/ mjonMsgVO.setDivideTime("1"); mjonMsgVO.setDivideCnt("20"); /*++++++스미싱 의심 및 문자 길이 초과 여부 체크++++++++++++++++ */ //회원정보에서 스미싱 회원 여부 정보 조회 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; } /*++++++문자 종류(단/장/그림) 체크++++++++++++++++ */ 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; } } System.out.println("++++++++++++ msgType ::: "+mjonMsgVO.getMsgType()); /* * 화면에서 넘어오는 단가 금액 및 총 결제 캐시 금액 체크 해주기 * 검증을 위해서 시스템 단가, 회원 협의 단가, 이벤트 단가 정보 조회 * 조회 단가를 이용하여 총 결제 캐시 금액 계산 * 파라미터로 넘어온 개별단가(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("+++ tmpOrgEachPrice ::: "+tmpOrgEachPrice); System.out.println("+++ tmpOrgTotPrice ::: "+tmpOrgTotPrice); // MSG_TYPE 다시계산 if(mjonMsgVO.getFileName1() != null) { mjonMsgVO.setMsgType("6"); }else { if(FrBytes < 2000) { if(FrBytes > 90) {// 90Byte 초과시 장문 mjonMsgVO.setMsgType("6"); }else {// 그외 단문 mjonMsgVO.setMsgType("4"); } } } System.out.println("mjonMsgVO.getMsgType3() ::: "+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; } } /* * 주소록 그룹에서 조회한 주소 갯수 카운팅 * 중복 제거한 데이터 갯수 적용해주기 * * */ List resultAddrList = mjonCandidateService.selectAddrGrpHGList(mjonMsgVO); if(resultAddrList == null) { modelAndView.addObject("message", "주소록 정보를 불러올 수 없습니다."); modelAndView.addObject("result", "statusFail"); modelAndView.addObject("resultSts", "0"); modelAndView.addObject("resultBlockSts", "0"); } int addrListLen = resultAddrList.size(); int addrDupListLen = 0; //주소록 그룹 전체 주소정보 중복 제거 resultAddrList = resultAddrList.stream().distinct().collect(Collectors.toList()); //제거 중복 건수 계산 addrDupListLen = resultAddrList.size(); System.out.println("++++++++++++++ 중복제거 후 리스트 갯수 ::: "+addrDupListLen); //수신자 총 수 * 단가 를 통해 총 결제 금액 계산 int tmpTotCallCnt = addrDupListLen; //mjonMsgVO.getCallToList().length; float tmpTotPrice = tmpTotCallCnt * tmpEachPrice; //중복 제거한 주소록 총 건수 와 개별 단가를 이용하여 총 발송 금액 계산하기 mjonMsgVO.setEachPrice(Float.toString(tmpEachPrice)); mjonMsgVO.setTotPrice(Float.toString(tmpTotPrice)); //화면에서 넘어온 파라미터 개별 단가와 컨트롤러에서 계산한 단가를 비교하여 맞지 않으면 컨트롤러 계산 단가 입력 /*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 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); System.out.println("++++ befCash ::: "+befCash); System.out.println("++++ totMsgPrice ::: "+totMsgPrice); /*+++++++++++주소록 그룹의 모든 주소록 정보 조회해오기++++++++++++++++++++++++*/ //현재 보유 금액이 발송 문자 총 금액보다 클 경우만 문자 발송 //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()); int maxRow = 0; int rowCnt = 0; int i = 0; List arrAddrList = new ArrayList(); System.out.println("++++++++++++++++++ 데이터베이스 입력 시작 ::: "+new Date()); for(String callTo : resultAddrList) { arrAddrList.add(callTo); if(maxRow == 4999) { rowCnt = rowCnt + maxRow; maxRow = 0; String[] arrPhoneList = arrAddrList.toArray(new String[arrAddrList.size()]); System.out.println("arrPhoneList len ::: "+arrPhoneList.length); mjonMsgVO.setCallToList(arrPhoneList); MjonMsgReturnVO returnVO = mjonMsgDataService.insertMsgDataInfoBatch(mjonMsgVO); mjonMsgVO.setAgentCode(returnVO.getAgentCode()); resultSts = resultSts + Integer.parseInt(returnVO.getSendMsgCnt()); resultBlockSts = resultBlockSts + Integer.parseInt(returnVO.getSendMsgBlockCnt()); arrAddrList.clear();//리스트 초기화 해주기 System.out.println("========================================================================="); System.out.println("+++++++++++++++++++++++++++++++++++++++++++선거문자 대량전송 ==> 5000 resultSts ::: " + resultSts); System.out.println("+++++++++++++++++++++++++++++++++++++++++++선거문자 대량전송 ==> 5000 resultBlockSts ::: " + resultBlockSts); System.out.println("========================================================================="); }else { maxRow++; } i++; } rowCnt = rowCnt + maxRow; /* * loop를 돌고 남은 잔여 건수 디비 입력 처리해주기 * */ String[] arrLastPhoneList = arrAddrList.toArray(new String[arrAddrList.size()]); mjonMsgVO.setCallToList(arrLastPhoneList); MjonMsgReturnVO returnVO = mjonMsgDataService.insertMsgDataInfoBatch(mjonMsgVO); mjonMsgVO.setAgentCode(returnVO.getAgentCode()); resultSts = resultSts + Integer.parseInt(returnVO.getSendMsgCnt()); resultBlockSts = resultBlockSts + Integer.parseInt(returnVO.getSendMsgBlockCnt()); System.out.println("========================================================================="); System.out.println("+++++++++++++++++++++++++++++++++++++++++++선거문자 대량전송 마지막 잔여건수 처리 ==> resultSts ::: " + resultSts); System.out.println("+++++++++++++++++++++++++++++++++++++++++++선거문자 대량전송 마지막 잔여건수 처리 ==> resultBlockSts ::: " + resultBlockSts); System.out.println("========================================================================="); System.out.println("Last arrLastPhoneList ::: "+arrLastPhoneList.length); System.out.println("req Date ::: "+ mjonMsgVO.getReqDate()); System.out.println("addrDupListLen ::: "+addrDupListLen); } System.out.println("++++++++++++++++++ 데이터베이스 입력 종료 ::: "+new Date()); } catch (Exception e) { System.out.println("========================================================================="); System.out.println("++++++++sendMsgHGDataAjax Controller Error!!!+++++++++++++++++++++ 선거문자 ==> 기타 시스템 오류 !!! : " + e); System.out.println("========================================================================="); modelAndView.addObject("result", "fail"); modelAndView.addObject("message", "기타 시스템 오류 "); } modelAndView.addObject("message", "문자 전송이 완료되었습니다."); modelAndView.addObject("result", "success"); modelAndView.addObject("resultSts", resultSts); modelAndView.addObject("resultBlockSts", resultBlockSts); /** * 사용자가 보낸 문자를 문자온 법인폰으로도 하나 전송하는 기능 시작 * * */ 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")) { MjonMsgCampainDataController mcdController = new MjonMsgCampainDataController(); mcdController.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; } }