package itn.let.mjo.test.web; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.math.BigDecimal; import java.math.RoundingMode; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.text.SimpleDateFormat; import java.time.LocalDateTime; 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.imageio.ImageIO; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.apache.commons.lang.StringUtils; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.rendering.ImageType; import org.apache.pdfbox.rendering.PDFRenderer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.core.io.ByteArrayResource; import org.springframework.core.io.FileSystemResource; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; 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.client.RestTemplate; 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 org.springframework.web.util.UriUtils; import egovframework.rte.fdl.idgnr.EgovIdGnrService; import egovframework.rte.fdl.security.userdetails.util.EgovUserDetailsHelper; 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.service.FileVO; import itn.com.cmm.util.MJUtil; import itn.com.cmm.util.StringUtil; import itn.let.kakao.kakaoComm.KakaoVO; import itn.let.kakao.kakaoComm.kakaoApi.KakaoApiProfile; import itn.let.kakao.kakaoComm.kakaoApi.KakaoApiProfileCategory; import itn.let.lett.service.LetterService; import itn.let.mail.service.StatusResponse; import itn.let.mjo.addr.service.AddrGroupService; import itn.let.mjo.addr.service.AddrService; import itn.let.mjo.addragency.service.AddrAgencyVO; import itn.let.mjo.apikey.service.ApiKeyMngService; import itn.let.mjo.event.service.MjonEventService; import itn.let.mjo.event.service.MjonEventVO; import itn.let.mjo.mjocommon.MjonCommon; import itn.let.mjo.mjocommon.MjonHolidayApi; import itn.let.mjo.msg.service.MjonMsgService; import itn.let.mjo.msg.service.MjonMsgVO; import itn.let.mjo.msgdata.service.MjonMsgDataService; import itn.let.mjo.msgdata.service.MjonMsgReturnVO; import itn.let.mjo.msgholiday.service.MsgAlarmSetVO; import itn.let.mjo.msgholiday.service.MsgHolidayService; import itn.let.mjo.msgholiday.service.MsgHolidayVO; import itn.let.mjo.pay.service.MjonPayService; import itn.let.mjo.payva.service.VacsVactService; import itn.let.mjo.payva.service.VacsVactVO; import itn.let.mjo.spammsg.service.MjonSpamMsgService; import itn.let.mjo.spammsg.web.ComGetSpamStringParser; import itn.let.mjo.symbol.service.MjonSymbolService; import itn.let.schdlr.service.SchdlrManageService; 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.sym.site.service.TermsVO; import itn.let.uat.uia.service.AuthCertVO; import itn.let.uat.uia.web.KmcCertChecker; 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.user.service.CheckFileUtil; import itn.let.utl.user.service.CheckLoginUtil; import itn.let.utl.user.service.CheckNoServiceCommon; @Controller public class TestController { @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; /** EgovMessageSource */ @Resource(name="egovMessageSource") EgovMessageSource egovMessageSource; @Resource(name="EgovFileMngUtil") private EgovFileMngUtil fileUtil; @Resource(name="EgovFileMngService") private EgovFileMngService fileMngService; @Resource(name = "SchdlrManageService") private SchdlrManageService schdlrManageService; @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; @Resource(name = "MjonEventService") private MjonEventService mjonEventService; @Resource(name = "mjonSpamMsgService") private MjonSpamMsgService mjonSpamMsgService; //로그인 처리 @Resource(name = "checkLoginUtil") private CheckLoginUtil checkLoginUtil; //첨부파일 체크 @Resource(name = "checkFileUtil") private CheckFileUtil checkFileUtil; //가상계좌원장 @Resource(name="vacsVactService") private VacsVactService vacsVactService; //파일 체크 & 관리 @Resource(name="EgovFileMngUtil") private EgovFileMngUtil egovFileMngUtil; @Resource(name = "EgovCmmUseService") private EgovCmmUseService cmmUseService; @Autowired KakaoApiProfile kakaoApiProfile; @Autowired KakaoApiProfileCategory kakaoApiProfileCategory; @Autowired CheckNoServiceCommon checkNoServiceCommon; @Autowired MjonHolidayApi mjonHolidayApi; @Resource(name = "egovSiteManagerService") private EgovSiteManagerService egovSiteManagerService; /** userManageService */ @Resource(name = "userManageService") private EgovUserManageService userManageService; //api key 정보 @Resource(name = "apiKeyMngService") private ApiKeyMngService apiKeyMngService; /* //파일 정보 관리 @Resource(name="EgovFileMngService") private EgovFileMngService fileMngService; */ /** 등급제 관리 서비스 */ @Resource(name = "mberGrdService") MberGrdService mberGrdService; /** 후불제 자동 충전 서비스 */ @Resource (name = "userManageService") private EgovUserManageService egovUserManageService; @Resource(name = "MsgHolidayService") private MsgHolidayService msgHolidayService; private static final Logger logger = LoggerFactory.getLogger(TestController.class); ///////////////////////////////////////////////////////////////////////////////////////// // // // USER // // ///////////////////////////////////////////////////////////////////////////////////////// // // // ADMIN // // /*@RequestMapping(value= {"/web/mjon/test/selectSendTestView.do"}) public String selectSendTestView(ModelMap model) throws Exception { // 결제방식 코드조회 ComDefaultCodeVO vo = new ComDefaultCodeVO(); vo.setCodeId("BIZ01"); List bizList= cmmUseService.selectCmmCodeDetail(vo); model.addAttribute("bizList", bizList); return "/uss/ion/test/TestSandKakao"; }*/ /*@RequestMapping(value= {"/web/mjon/test/kakaoApiProfileTokenSendAjax.do"}) public ModelAndView kakaoApiProfileTokenSendAjax(KakaoVO kakaoVO , ModelAndView modelAndView ) throws Exception { //json 알림 modelAndView.setViewName("jsonView"); try { KakaoVO kakaoInfo = new KakaoVO(); String tempUrl = kakaoVO.getBizUrl(); if(!tempUrl.equals("") && tempUrl != null) { if(tempUrl.contains("profile/category/all")) { //발신프로필 카테고리 전체 내역 조회하기 kakaoApiProfileCategory.kakaoApiProfileCategoryAll(kakaoVO); }else if(tempUrl.contains("profile/category")) { //발신프로필 카테고리 코드 정보 조회하기 kakaoApiProfileCategory.kakaoApiProfileCategoryCode(kakaoVO); }else if(tempUrl.contains("profile/token")) { //발신프로필 인증 토큰 요처하기 kakaoInfo = kakaoApiProfile.kakaoApiProfileToken(kakaoVO); } }else{//요청 정보가 없으면 오류 반환 modelAndView.addObject("message", "요청 URL이 없습니다."); modelAndView.addObject("result", "fail"); return modelAndView; } modelAndView.addObject("kakaoInfo", kakaoInfo); modelAndView.addObject("result", "success"); }catch(Exception ex){ ex.printStackTrace(); modelAndView.addObject("message", egovMessageSource.getMessage("fail.common.update")); modelAndView.addObject("result", "fail"); return modelAndView; } return modelAndView; }*/ @RequestMapping(value= {"/web/mjon/test/insertJsonTestAjax.do"}) public ModelAndView insertJsonTestAjax(KakaoVO kakaoVO , ModelAndView modelAndView ) throws Exception { //json 알림 modelAndView.setViewName("jsonView"); try { // kakaoService.kakaoBizJson(kakaoVO); modelAndView.addObject("result", "success"); }catch(Exception ex){ ex.printStackTrace(); modelAndView.addObject("message", egovMessageSource.getMessage("fail.common.update")); modelAndView.addObject("result", "fail"); } return modelAndView; } /** * egov sample list 페이지 * @param addrVO * @param model * @return * @throws Exception */ @RequestMapping(value= {"/uss/ion/test/selectTestList.do"}) public String selectTestList( HttpServletRequest request , @ModelAttribute("searchVO") VacsVactVO vacsVactVO , ModelMap model , RedirectAttributes redirectAttributes ) throws Exception { //관리자 로그인 여부 체크 String isLogin = checkLoginUtil.isAdminLogin4PageMove(redirectAttributes); if (!"Y".equals(isLogin)) return isLogin; //로그인 정보 획득 LoginVO loginVO = (LoginVO) EgovUserDetailsHelper.getAuthenticatedUser(); //login 정보 model.addAttribute("loginVO", loginVO); //ajax를 위한 현재 URL 정보 받기 vacsVactVO.setUrl(request.getRequestURI()); return "/uss/ion/test/TestList"; } /** * 주소록 입력 대행(무료) 관리 리스트 ajax 부분 * @param addrVO * @param model * @return * @throws Exception */ @RequestMapping(value= { "/uss/ion/test/selectTestListAjax.do" }) public String selectTestListAjax( HttpServletRequest request , @ModelAttribute("searchVO") VacsVactVO vacsVactVO , ModelMap model , RedirectAttributes redirectAttributes ) throws Exception { System.out.println("1111111111111"); System.out.println("selectTestListAjax"); System.out.println(vacsVactVO.toString()); //return "/uss/ion/payva/VirtualAccountListAjax"; //관리자 로그인 여부 체크 String isLogin = checkLoginUtil.isLoginCheck4JsonPage(redirectAttributes); if ("N".equals(isLogin)) return "/uss/ion/test/TestListAjax"; // pageing step1 PaginationInfo paginationInfo = this.setPagingStep1(vacsVactVO); // pageing step2 vacsVactVO = this.setPagingStep2(vacsVactVO, paginationInfo); //대상 리스트 가져오기 //관리자 리스트는 30일 마감에 대한 제한을 없애기 위해서 해당 값을 넣어준다. List vacsVactList = vacsVactService.selectList(vacsVactVO); // pageing step3 paginationInfo = this.setPagingStep3(vacsVactList, paginationInfo); //대상 리스트, 페이징 정보 전달 model.addAttribute("resultList", vacsVactList); model.addAttribute("paginationInfo", paginationInfo); return "/uss/ion/test/TestListAjax"; } /** * egov ec:code sample 페이지 * @param addrVO * @param model * @return * @throws Exception */ @RequestMapping(value= { "/uss/ion/test/selectTestEcList.do" }) public String selectTestEcList( ) throws Exception { return "/uss/ion/test/TestEcList"; } /** * egov file 업로드시 사용자 제약 관리 페이지 * @param addrVO * @param model * @return * @throws Exception */ @RequestMapping(value= { "/uss/ion/test/selectTestFileList.do" }) public String selectTestFileList( ) throws Exception { return "/uss/ion/test/TestFileList"; } /** *egov file 업로드시 사용자 제약 관리 페이지 * * @param boardVO * @param board * @param model * @return * @throws Exception */ @RequestMapping(value= { "/uss/ion/test/insertTestFileAjax.do" } ) public ModelAndView insertTestFileList( HttpServletRequest request , final MultipartHttpServletRequest multiRequest //, ModelMap model , ModelAndView modelAndView , RedirectAttributes redirectAttributes ) throws Exception { //json 알림 modelAndView.setViewName("jsonView"); //사용자 로그인 여부 체크 for json String isLogin = checkLoginUtil.isLoginCheck4JsonAction(modelAndView); if ("N".equals(isLogin)) return modelAndView; //파일 정상 처리 여부와 첨부 파일 정보 - DB 저장 없이 업로드 파일명받기어서 배열로 처리 //DB 저장인 경우는 대표 파일 ID를 받으므로 하나의 ID만 넘겨 받는다.(file저장은 master-defail 구조) String[] atchFileIds = this.readFiles(multiRequest, modelAndView, "txt|xls|xlsx|png|jpg", 10, 3); //MB size and ea //String atchFileId = this.readFile(multiRequest, modelAndView, "txt|xls|xlsx", 10, 1); //size and ea for(int i=0;i result = null; String atchFileId = ""; String isThumbFile = ""; //String isThumbFile = "thumbFile"; //"thumbFile" - 썸네일을 생성한다. final Map files = p_multiRequest.getFileMap(); if (!files.isEmpty()) { System.out.println("isnotempty"); result = egovFileMngUtil.parseFileInf(files, "ADDRAGENCY_", 0, "", "", isThumbFile); //관리자에서 게시판 설정시 업로드 파일 사이즈와 수량 체크용 //사용자 설정용 업로드 파일 사이즈 & 파일 수량 & 확장자 체크용 if(!checkFileUtil.isPosblAtchFileMvWithUserSetting(result, p_modelAndView, 0, p_exts, p_i_file_size, p_i_file_count)) { // 공통코드 Set //setBBSCommCd(model, bmVO); //model.addAttribute("bdMstr", bmVO); //return "web/cop/bbs/EgovNoticeRegist"; //modelAndView.addObject("bdMstr", bmVO); p_modelAndView.addObject("result", "fail"); in_bool = false; }else { //atchFileId = fileMngService.insertFileInfs(result); //첨부 파일 for(int i=0;i p_vacsVactList , PaginationInfo p_paginationInfo )throws Exception{ // pageing step3 int totCnt = 0; if(p_vacsVactList.size() > 0) totCnt = p_vacsVactList.get(0).getTotCnt(); p_paginationInfo.setTotalRecordCount(totCnt); return p_paginationInfo; } /* @RequestMapping(value= {"/web/mjon/test/checkBizNoTestAjax.do"}) public ModelAndView checkBizNoTestAjax(KakaoVO kakaoVO , HttpServletRequest request , ModelAndView modelAndView ) throws Exception { //json 알림 modelAndView.setViewName("jsonView"); System.out.println("bizId " ); System.out.println("Kakao " ); //System.out.println(request.getParameter("b_no") ); try { //String s_b_no = request.getParameter("b_no"); String s_b_no = request.getParameter("b_no").replaceAll("-", ""); //사업자등록번호 String s_b_nm = request.getParameter("b_nm"); //업체명 String s_p_nm = request.getParameter("p_nm"); //대표자명 //KakaoVO kakaoInfo = checkNoServiceCommon.BizNoCheckApi(kakaoVO); KakaoVO kakaoInfo = checkNoServiceCommon.BizNoCheckApiEx2( kakaoVO , s_b_no , s_b_nm , s_p_nm ); modelAndView.addObject("kakaoInfo", kakaoInfo); modelAndView.addObject("result", kakaoInfo.getBizReturnCode()); }catch(Exception ex){ ex.printStackTrace(); modelAndView.addObject("message", egovMessageSource.getMessage("fail.common.update")); modelAndView.addObject("result", "fail"); } return modelAndView; } */ /* @RequestMapping(value= {"/uss/umt/user/checkBizNoTaxAjax.do"}) public ModelAndView checkBizNoTaxAjax(KakaoVO kakaoVO , HttpServletRequest request , ModelAndView modelAndView ) throws Exception { //json 알림 modelAndView.setViewName("jsonView"); System.out.println("bizId " ); System.out.println("Kakao " ); //System.out.println(request.getParameter("b_no") ); try { //String s_b_no = request.getParameter("b_no"); String s_b_no = request.getParameter("b_no").replaceAll("-", ""); //사업자등록번호 String s_b_nm = request.getParameter("b_nm"); //업체명 String s_p_nm = request.getParameter("p_nm"); //대표자명 String s_start_dt = request.getParameter("start_dt").replaceAll("-", ""); //설립일자 System.out.println("s_start_dt"); System.out.println(s_start_dt); System.out.println(s_start_dt); //KakaoVO kakaoInfo = checkNoServiceCommon.BizNoCheckApi(kakaoVO); KakaoVO kakaoInfo = checkNoServiceCommon.BizNoCheckApiEx3( kakaoVO , s_b_no , s_b_nm , s_p_nm , s_start_dt ); modelAndView.addObject("msg", kakaoInfo.getBizReturnMsg()); modelAndView.addObject("result", kakaoInfo.getBizReturnCode()); }catch(Exception ex){ ex.printStackTrace(); modelAndView.addObject("message", egovMessageSource.getMessage("fail.common.update")); modelAndView.addObject("result", "fail"); } return modelAndView; } */ // 회원가입 2뎁스 - 약관 동의 @RequestMapping(value = "/web/user/login/test_checkTerms.do") public String checkTerms(HttpServletRequest request, HttpServletResponse response, RedirectAttributes redirectAttributes, @ModelAttribute("mberManageVO") MberManageVO mberManageVO, TermsVO termsVO, ModelMap model) throws Exception { Boolean isAuthenticated = EgovUserDetailsHelper.isAuthenticated(); if (isAuthenticated) return "redirect:/"; //URL을 이용한 비정상적인 접근 차단 /* if("".equals(mberManageVO.getDept()) || mberManageVO.getDept() == null) { redirectAttributes.addFlashAttribute("message", "잘못된 경로로 접속하여 메인화면으로 이동됩니다"); return "redirect:/web/main/mainPage.do"; } */ // 본인인증 방식 선택 정보 불러오기 JoinSettingVO joinSettingVO = egovSiteManagerService.selectJoinCertTypeDetail(); model.addAttribute("joinSettingVO", joinSettingVO); // 약관 사용메뉴 - 01:회원가입 termsVO.setMenuNm("01"); List termsList = new ArrayList(); termsList = egovSiteManagerService.selectTermsMenu(termsVO); model.addAttribute("termsList", termsList); // 나이스 본인인증 /* * String referer = (String) request.getHeader("REFERER"); * * URL newURL = new URL(referer); * * String protocol = newURL.getProtocol() + "://"; String host = * newURL.getHost(); * * String succUrl = protocol + host + "/web/user/login/niceCheckAjax.do"; // 성공시 * 이동할 URL - String failUrl = protocol + host + * "/web/user/login/selectUserDept.do"; * * mberManageVO.setNiceSuccUrl(succUrl); mberManageVO.setNiceFailUrl(failUrl); */ model.addAttribute("mberManageVO", mberManageVO); // KMC 본인인증 데이터 불러오기 // 핸드폰인증만 사용할 시 if (joinSettingVO.getJoinCertType().equals("M")) { KmcCertChecker kmcCertCheck = new KmcCertChecker(); // kmc 본인인증 실/개발 서버 구분 String serverNm = ""; if (request.getServerName().contains("219.240.88.15") || request.getServerName().contains("localhost")) { serverNm = request.getScheme() + "://219.240.88.15:8095"; }else if(request.getRequestURL().toString().contains("www.")){ serverNm = request.getScheme() + "://www.munjaon.co.kr"; } else { serverNm = request.getScheme() + "://munjaon.co.kr"; } AuthCertVO certVO = kmcCertCheck.authCertCheck(serverNm + "/web/cop/kmc/authRequestAjax.do"); model.addAttribute("tr_cert", certVO.getTr_cert()); model.addAttribute("tr_url", certVO.getTr_url()); model.addAttribute("tr_add", certVO.getTr_add()); } return "web/login/test_usrCheckTerms"; } // 회원가입 3뎁스 - 정보입력 @RequestMapping(value = "/web/user/login/test_insertUsrView.do") public String insertUsrView(HttpServletRequest request, HttpServletResponse response, @ModelAttribute("mberManageVO") MberManageVO mberManageVO, TermsVO termsVO, ModelMap model, HttpSession session, JoinSettingVO joinSettingVO, RedirectAttributes redirectAttributes) throws Exception { Boolean isAuthenticated = EgovUserDetailsHelper.isAuthenticated(); if (isAuthenticated) return "redirect:/cmm/main/mainPage.do"; //URL을 이용한 비정상적인 접근 차단 if("".equals(mberManageVO.getDept()) || mberManageVO.getDept() == null || "".equals(mberManageVO.getMblDn()) || mberManageVO.getMblDn() == null) { redirectAttributes.addFlashAttribute("message", "잘못된 경로로 접속하여 메인화면으로 이동됩니다"); return "redirect:/web/main/mainPage.do"; } System.out.println("++++++++++++ 세션체크 ::: " + (MberManageVO) session.getAttribute("mberSession")); if (null == session.getAttribute("mberSession")) { // 세션이 없을 시 메인화면으로 팅김 redirectAttributes.addFlashAttribute("message", "쿠키 설정을 확인하세요."); return "redirect:/"; } // 이메일 코드조회 ComDefaultCodeVO voComCode = new ComDefaultCodeVO(); voComCode.setCodeId("ITN031"); model.addAttribute("emailCode", cmmUseService.selectCmmCodeDetail(voComCode)); // 방문경로 코드조회 voComCode.setCodeId("ITN025"); model.addAttribute("visitRoute", cmmUseService.selectCmmCodeDetail(voComCode)); // 기업유형 코드조회 voComCode.setCodeId("ITN033"); model.addAttribute("bizTypeCode", cmmUseService.selectCmmCodeDetail(voComCode)); // 본인인증 방식 선택 정보 불러오기 JoinSettingVO joinCertType = egovSiteManagerService.selectJoinCertTypeDetail(); String joinType = joinCertType.getJoinCertType(); model.addAttribute("joinType", joinType); // 본인인증 // 회원타입(개인,기업) 담아둔 세션 조회 session = request.getSession(); MberManageVO mberSessionVO = (MberManageVO) session.getAttribute("mberSession"); if (joinType.equals("M") || joinType.equals("A")) { // 크롬 SameSite정책 방지 - 도메인이 다른 타사로 이동 시 크롬 정책에 의해 세션 유실이 일어나는 경우가 있는데, 이를 방지하기 위해 // samesite 보안을 none처리 /* * response.setHeader("Set-Cookie", * "AuthKmcCertVO=AuthKmcCertVO; Secure; SameSite=None"); //KMC 문자 본인인증 세션 정보 * 받아오기 AuthCertVO certKmcVO = (AuthCertVO) * session.getAttribute("AuthKmcCertVO"); * * if(certKmcVO != null) { * * mberManageVO.setNiceNm(certKmcVO.getCertName()); //본인인증 이름 * mberManageVO.setMoblphonNo(certKmcVO.getCertPhone()); //본인인증 핸드폰 * mberManageVO.setMblDn(certKmcVO.getCertDi()); //본인인증 중복가입방지 번호 * mberManageVO.setNationality(certKmcVO.getCertNation()); * mberManageVO.setBirthDay(certKmcVO.getBirthDay()); * mberManageVO.setSexdstnCode(certKmcVO.getSexdstnCode()); * * } */ } else { // ARS 전화 본인인증 세션 정보 받아오기 AuthCertVO certArsVO = (AuthCertVO) session.getAttribute("AuthARSCertVO"); if (certArsVO != null) { mberManageVO.setMoblphonNo(certArsVO.getCertPhone()); // 본인인증 핸드폰 } } model.addAttribute("mberSessionVO", mberSessionVO); // 나이스 본인인증을 했을때 세션처리 후 데이터 저장해주기. /* * MberManageVO VO = new MberManageVO(); if (null != * request.getSession().getAttribute("userSearchVO")) { // 세션체크 VO = * ((MberManageVO) request.getSession().getAttribute("userSearchVO")); * mberManageVO.setNiceNm(VO.getNiceNm()); // 이름 * mberManageVO.setSexdstnCode(VO.getSexdstnCode()); // 성별 * mberManageVO.setMoblphonNo(VO.getMoblphonNo()); // 핸드폰번호 * mberManageVO.setBirthDay(VO.getBirthDay()); // 생년월일 * mberManageVO.setMblDn(VO.getMblDn()); // 모바일 인증키 * session.removeAttribute("userSearchVO"); } */ model.addAttribute("mberManageVO", mberManageVO); return "web/login/test_usrInsertView"; } @RequestMapping(value= {"/web/user/login/apiRequestTest.do"}) public ResponseEntity faxApiTest() throws Exception{ try { return ResponseEntity.ok().body(new StatusResponse(HttpStatus.OK, "요청 성공!!!", LocalDateTime.now())); // return ResponseEntity.ok().body(new StatusResponse(HttpStatus.BAD_REQUEST, "임시 성공.", LocalDateTime.now())); } catch (Exception e) { e.printStackTrace(); // TODO: handle exception } return ResponseEntity.ok().body(new StatusResponse(HttpStatus.BAD_REQUEST, "발송 요청 중 오류가 발생하였습니다.", LocalDateTime.now())); } @RequestMapping(value= {"/web/user/login/returnTest.do"}) public ModelAndView returnTest(@RequestBody MjonMsgVO mjonMsgVO, // public ResponseEntity returnTest(@RequestBody MjonMsgVO mjonMsgVO, RedirectAttributes redirectAttributes, HttpServletRequest request, ModelMap model) throws Exception{ ModelAndView modelAndView = new ModelAndView("jsonView"); System.out.println("mjonMsgVO.getSmsTxt() : "+ mjonMsgVO.getSmsTxt()); // return ResponseEntity.ok().body(new StatusResponse(HttpStatus.BAD_REQUEST, "발송 요청 중 오류가 발생하였습니다.", LocalDateTime.now())); modelAndView.addObject("result", "OK"); modelAndView.addObject("message", "요청 성공!"); return modelAndView; } // ======================================================================================================== @RequestMapping(value= {"/web/user/login/selectSpamTxtChkAjax.do"}) public ModelAndView selectSpamTxtChkAjax(@RequestBody MjonMsgVO mjonMsgVO) { ModelAndView modelAndView = new ModelAndView(); modelAndView.setViewName("jsonView"); try { //회원 정보 중 금지어 예외 항목에 대해서 스팸 필터링 처리 유무 적용 - 20240820 우영두 MberManageVO mberManageVO = new MberManageVO(); //회원정보 불러오기 mberManageVO = mberManageService.selectMber(mjonMsgVO.getMberId()); //스팸 필터링 예외처리 여부 값 - (온: Y, 오프 : N) 온 일때 스미싱의심 예외 되도록 적용 String exceptSpamYn = mberManageVO.getExceptSpamYn(); if(exceptSpamYn.equals("Y")) {//스팸 필터링 예외 온 일 경우 리턴 처리 modelAndView.addObject("result", "clear"); return modelAndView; } List resultSpamTxt = mjonMsgDataService.selectSpamKeywordList(); String spmFilterTxt = ""; if(resultSpamTxt == null) {//스팸 체크리스트가 없는 경우 modelAndView.addObject("result", "listEmpty"); return modelAndView; }else { String smsTxt = mjonMsgVO.getSmsTxt(); //발송 문자 내용 /* * 치환문자에 스팸문구가 있을수 있어서 첫번째 치환데이터만 변환 적용 해서 스팸문구가 있는지 체크하도록 함. * 차후에 전체 치환 데이터에 대한 체크를 할지를 검토하겠음. * * */ String txtReplYn = mjonMsgVO.getTxtReplYn(); if(txtReplYn.equals("Y")) { String[] nameList = mjonMsgVO.getNameList(); //치환 이름 리스트 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; } if (smsTxt.indexOf("[*이름*]") > -1) { smsTxt = smsTxt.replaceAll("\\[\\*이름\\*\\]", StringUtil.getString(nameList[0].replaceAll("§", ","))); }else { smsTxt = smsTxt.replaceAll("\\[\\*이름\\*\\]", ""); } if (smsTxt.indexOf("[*1*]") > -1) { smsTxt = smsTxt.replaceAll("\\[\\*1\\*\\]", StringUtil.getString(rep1[0].replaceAll("§", ","))); }else { smsTxt = smsTxt.replaceAll("\\[\\*1\\*\\]", ""); } if (smsTxt.indexOf("[*2*]") > -1) { smsTxt = smsTxt.replaceAll("\\[\\*2\\*\\]", StringUtil.getString(rep2[0].replaceAll("§", ","))); }else { smsTxt = smsTxt.replaceAll("\\[\\*2\\*\\]", ""); } if (smsTxt.indexOf("[*3*]") > -1) { smsTxt = smsTxt.replaceAll("\\[\\*3\\*\\]", StringUtil.getString(rep3[0].replaceAll("§", ","))); }else { smsTxt = smsTxt.replaceAll("\\[\\*3\\*\\]", ""); } if (smsTxt.indexOf("[*4*]") > -1) { smsTxt = smsTxt.replaceAll("\\[\\*4\\*\\]", StringUtil.getString(rep4[0].replaceAll("§", ","))); }else { smsTxt = smsTxt.replaceAll("\\[\\*4\\*\\]", ""); } } //입력 문장에 대해서 우회 문장 또는 특수 기호 입력 제거 등 문장 재구성 처리, 한글 자모음 분리 및 재조함도 함께 처리함. String resultParser = ComGetSpamStringParser.getSpamTextParse(smsTxt).trim(); //List jasoList = HangulParser.disassemble(resultParser); //String assembleStr = HangulParser.assemble(jasoList); System.out.println("++++++++++++++ spam resultParser ::: "+resultParser); /* //형태소 분석기 처리 KomoranUtils komoran = new KomoranUtils(); String resultKomoran = komoran.parseKomoranTextByString(assembleStr);*/ //System.out.println(resultKomoran); //한글, 영문, 숫자, 띄어쓰기를 제외한 다른 단어들을 삭제함. //String repSmsTxt = smsTxt.replaceAll("[^ㄱ-ㅎㅏ-ㅣ가-힣a-zA-Z0-9 ]", ""); //데이터베이스에 등록된 스팸문구와 일치하는 단어/문구가 있는지 체크함. int spmCnt = 0; for(String spmTxt : resultSpamTxt) { String parserStr = ComGetSpamStringParser.getSpamTextParse(spmTxt).trim(); if(resultParser.contains(parserStr)) { //스팸 단어/문구가 있으면 콤마로 연결시킨 후 리턴해줌. spmFilterTxt += spmTxt + ","; spmCnt++; } } if(spmCnt > 0) {//스팸문자가 포함되어 있으면 문자열 끝 , 단어 삭제 처리 if (StringUtil.getWordRight(spmFilterTxt.trim(), 1).equals(",")) { // 처음부터 idx 만큼 잘라낸 나머지 글자 spmFilterTxt = StringUtil.getWordLeft(spmFilterTxt.trim(), 1); } System.out.println("++++++++++++++ spmFilterTxt ::: "+spmFilterTxt); modelAndView.addObject("result", "spams"); // modelAndView.addObject("spmFilterTxt", spmFilterTxt); return modelAndView; } } }catch(Exception e) { logger.error(e.getMessage(), e); modelAndView.addObject("result", "fail"); modelAndView.addObject("message", "기타 시스템 오류 : " + e.getMessage()); return modelAndView; } // modelAndView.addObject("message", "test "); return modelAndView; } @RequestMapping(value= {"/web/user/login/sendMsgDataAjax.do"}) public ModelAndView sendMsgData(@RequestBody MjonMsgVO mjonMsgVO, RedirectAttributes redirectAttributes, HttpServletRequest request, ModelMap model) throws Exception{ ModelAndView modelAndView = new ModelAndView(); modelAndView.setViewName("jsonView"); String resultSts = "0"; String resultBlockSts = "0"; String userId = ""; try { // LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null; // userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId()); userId = mjonMsgVO.getMberId(); 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 //--------------------------------------------------------------------------------------------------------------- //단문, 장문 분리해서 전달하기 위해서 동일한 VO를 생성해 준다. MjonMsgVO shortMsgVO = new MjonMsgVO(); MjonMsgVO longMsgVO = new MjonMsgVO(); MjonMsgVO imgMsgVO = new MjonMsgVO(); shortMsgVO = mjonMsgVO; longMsgVO = mjonMsgVO; imgMsgVO = mjonMsgVO; int shortMsgCnt = Integer.parseInt(mjonMsgVO.getShortMsgCnt()); int longMsgCnt = Integer.parseInt(mjonMsgVO.getLongMsgCnt()); int imgMsgCnt = mjonMsgVO.getCallToList().length; int tmpFileCnt = Integer.parseInt(mjonMsgVO.getFileCnt()); int tmpPhoMsgCnt = mjonMsgVO.getCallToList().length; /*if(tmpFileCnt > 0) { shortMsgCnt = tmpPhoMsgCnt; longMsgCnt = tmpPhoMsgCnt; }*/ String[] shortNameList = new String[shortMsgCnt]; //단문 치환 이름 리스트 String[] shortPhone = new String[shortMsgCnt]; //단문 수신자 휴대폰 번호 String[] shortRep1 = new String[shortMsgCnt]; //단문 치환 문자1 리스트 String[] shortRep2 = new String[shortMsgCnt]; //단문 치환 문자2 리스트 String[] shortRep3 = new String[shortMsgCnt]; //단문 치환 문자3 리스트 String[] shortRep4 = new String[shortMsgCnt]; //단문 치환 문자4 리스트 String[] longNameList = new String[longMsgCnt]; //장문 치환 이름 리스트 String[] longPhone = new String[longMsgCnt]; //장문 수신자 휴대폰 번호 String[] longRep1 = new String[longMsgCnt]; //장문 치환 문자1 리스트 String[] longRep2 = new String[longMsgCnt]; //장문 치환 문자2 리스트 String[] longRep3 = new String[longMsgCnt]; //장문 치환 문자3 리스트 String[] longRep4 = new String[longMsgCnt]; //장문 치환 문자4 리스트 String[] imgNameList = new String[imgMsgCnt]; //이미지 치환 이름 리스트 String[] imgPhone = new String[imgMsgCnt]; //이미지 수신자 휴대폰 번호 String[] imgRep1 = new String[imgMsgCnt]; //이미지 치환 문자1 리스트 String[] imgRep2 = new String[imgMsgCnt]; //이미지 치환 문자2 리스트 String[] imgRep3 = new String[imgMsgCnt]; //이미지 치환 문자3 리스트 String[] imgRep4 = new String[imgMsgCnt]; //이미지 치환 문자4 리스트 int shortCnt = 0; int longCnt = 0; int imgCnt = 0; Map returnImgMap = new HashMap(); Map returnShortMap = new HashMap(); Map returnLongMap = new HashMap(); for(int i=0; i < totListCnt; i ++) { String smsTxt = mjonMsgVO.getSmsTxt(); //발송 문자 내용 //본문 내용 - 치환 처리 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("\\[\\*이름\\*\\]", ""); } } 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\\*\\]", ""); } } 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\\*\\]", ""); } } 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\\*\\]", ""); } } 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\\*\\]", ""); } } //문자열 바이트 수 구하기(한글 2Byte로 계산) // 한글 3Byte로 하기 위해서는 StandardCharsets.UTF_8 로 변경하면 된다. int bytes = smsTxt.getBytes(charset).length; //단문문자 리스트 만들기 if(bytes < 2000) { if(fileCount > 0) { if(nameList.length > i && !"".equals(nameList[i]) && nameList[i] != null) { imgNameList[imgCnt] = StringUtil.getString(nameList[i].replaceAll("§", ",")); //장문 치환 이름 리스트 }else { imgNameList[imgCnt] = " "; } if(phone.length > i && !"".equals(phone[i]) && phone[i] != null) { imgPhone[imgCnt] = StringUtil.getString(phone[i].replaceAll("§", ",")); //장문 수신자 휴대폰 번호 } if(rep1.length > i && !"".equals(rep1[i]) && rep1[i] != null) { imgRep1[imgCnt] = StringUtil.getString(rep1[i].replaceAll("§", ",")); //장문 치환 문자1 리스트 }else { imgRep1[imgCnt] = " "; } if(rep2.length > i && !"".equals(rep2[i]) && rep2[i] != null) { imgRep2[imgCnt] = StringUtil.getString(rep2[i].replaceAll("§", ",")); //장문 치환 문자2 리스트 }else { imgRep2[imgCnt] = " "; } if(rep3.length > i && !"".equals(rep3[i]) && rep3[i] != null) { imgRep3[imgCnt] = StringUtil.getString(rep3[i].replaceAll("§", ",")); //장문 치환 문자3 리스트 }else { imgRep3[imgCnt] = " "; } if(rep4.length > i && !"".equals(rep4[i]) && rep4[i] != null) { imgRep4[imgCnt] = StringUtil.getString(rep4[i].replaceAll("§", ",")); //장문 치환 문자4 리스트 }else { imgRep4[imgCnt] = " "; } imgCnt++; }else if(bytes > 90) {//장문문자 리스트 만들기 //shortMsgListVO.add(mjonMsgVO.get) /** * * 치환 리스트 중 데이터가 없는 경우 데이터 밀림방지를 위하여 공백 하나를 추가해줌 * 공백처리를 안하는 경우 데이터가 밀려서 치환되는 오류가 있어서 처리해줌 * * */ if(nameList.length > i && !"".equals(nameList[i]) && nameList[i] != null) { longNameList[longCnt] = StringUtil.getString(nameList[i].replaceAll("§", ",")); //장문 치환 이름 리스트 }else { longNameList[longCnt] = " "; } if(phone.length > i && !"".equals(phone[i]) && phone[i] != null) { longPhone[longCnt] = StringUtil.getString(phone[i].replaceAll("§", ",")); //장문 수신자 휴대폰 번호 } if(rep1.length > i && !"".equals(rep1[i]) && rep1[i] != null) { longRep1[longCnt] = StringUtil.getString(rep1[i].replaceAll("§", ",")); //장문 치환 문자1 리스트 }else { longRep1[longCnt] = " "; } if(rep2.length > i && !"".equals(rep2[i]) && rep2[i] != null) { longRep2[longCnt] = StringUtil.getString(rep2[i].replaceAll("§", ",")); //장문 치환 문자2 리스트 }else { longRep2[longCnt] = " "; } if(rep3.length > i && !"".equals(rep3[i]) && rep3[i] != null) { longRep3[longCnt] = StringUtil.getString(rep3[i].replaceAll("§", ",")); //장문 치환 문자3 리스트 }else { longRep3[longCnt] = " "; } if(rep4.length > i && !"".equals(rep4[i]) && rep4[i] != null) { longRep4[longCnt] = StringUtil.getString(rep4[i].replaceAll("§", ",")); //장문 치환 문자4 리스트 }else { longRep4[longCnt] = " "; } longCnt++; } else {//단문문자 리스트 만들기 /** * * 치환 리스트 중 데이터가 없는 경우 데이터 밀림방지를 위하여 공백 하나를 추가해줌 * 공백처리를 안하는 경우 데이터가 밀려서 치환되는 오류가 있어서 처리해줌 * * */ if(nameList.length > i && !"".equals(nameList[i]) && nameList[i] != null) { shortNameList[shortCnt] = StringUtil.getString(nameList[i].replaceAll("§", ",")); //단문 치환 이름 리스트 }else { shortNameList[shortCnt] = " "; } if(phone.length > i && !"".equals(phone[i]) && phone[i] != null) { shortPhone[shortCnt] = StringUtil.getString(phone[i].replaceAll("§", ",")); //단문 수신자 휴대폰 번호 } if(rep1.length > i && !"".equals(rep1[i]) && rep1[i] != null) { shortRep1[shortCnt] = StringUtil.getString(rep1[i].replaceAll("§", ",")); //단문 치환 문자1 리스트 }else { shortRep1[shortCnt] = " "; } if(rep2.length > i && !"".equals(rep2[i]) && rep2[i] != null) { shortRep2[shortCnt] = StringUtil.getString(rep2[i].replaceAll("§", ",")); //단문 치환 문자2 리스트 }else { shortRep2[shortCnt] = " "; } if(rep3.length > i && !"".equals(rep3[i]) && rep3[i] != null) { shortRep3[shortCnt] = StringUtil.getString(rep3[i].replaceAll("§", ",")); //단문 치환 문자3 리스트 }else { shortRep3[shortCnt] = " "; } if(rep4.length > i && !"".equals(rep4[i]) && rep4[i] != null) { shortRep4[shortCnt] = StringUtil.getString(rep4[i].replaceAll("§", ",")); //단문 치환 문자4 리스트 }else { shortRep4[shortCnt] = " "; } shortCnt++; } }else { modelAndView.addObject("message", "문자 치환 후 전송 문자 길이를 초과하였습니다."); modelAndView.addObject("result", "fail"); modelAndView.addObject("resultSts", "0"); modelAndView.addObject("resultBlockSts", "0"); return modelAndView; } } if(imgCnt > 0) {//그림문자 전송 이름, 전화번호, 변환문자 입력해주기 imgMsgVO.setNameList(imgNameList); imgMsgVO.setCallToList(imgPhone); imgMsgVO.setRep1List(imgRep1); imgMsgVO.setRep2List(imgRep2); imgMsgVO.setRep3List(imgRep3); imgMsgVO.setRep4List(imgRep4); //개별단가 계산하기 String eachPrice = imgMsgVO.getPPrice(); //api 서버에서 pPrice 값이 없는 경우가 있어서 오류 방지를위해서 추가 if(eachPrice == null) { eachPrice = imgMsgVO.getEachPrice(); } /** * 그림문자에 치환 내용이 포함되어 있는 경우 단가 계산하기. * 그림문자의 경우 이로직을 타지 않지만 혹시 몰라서 추가해놓음 * */ if(fileCount > 2) {//그림 이미지가 3개 eachPrice = mjonMsgVO.getP3Price(); }else if(fileCount > 1) {//그림 이미지가 2개 eachPrice = mjonMsgVO.getP2Price(); }else if(fileCount == 1) {//그림 이미지가 1개 eachPrice = mjonMsgVO.getPPrice(); } imgMsgVO.setEachPrice(eachPrice); //문자 종류 선택 imgMsgVO.setMsgType("6"); //총금액 계산하기 Float sTotPrice = Float.parseFloat(imgMsgVO.getEachPrice()) * imgCnt; imgMsgVO.setTotPrice(sTotPrice.toString()); //그림문자 발송 처리 returnImgMap = fncSendMsgRtnMap(imgMsgVO); } if(shortCnt > 0) {//단문문자 전송 이름, 전화번호, 변환문자 입력해주기 shortMsgVO.setNameList(shortNameList); shortMsgVO.setCallToList(shortPhone); shortMsgVO.setRep1List(shortRep1); shortMsgVO.setRep2List(shortRep2); shortMsgVO.setRep3List(shortRep3); shortMsgVO.setRep4List(shortRep4); //개별단가 계산하기 String eachPrice = shortMsgVO.getSPrice(); //api 서버에서 sPrice 값이 없는 경우가 있어서 오류 방지를위해서 추가 if(eachPrice == null) { eachPrice = shortMsgVO.getEachPrice(); } /** * 그림문자에 치환 내용이 포함되어 있는 경우 단가 계산하기. * 그림문자의 경우 이로직을 타지 않지만 혹시 몰라서 추가해놓음 * */ if(fileCount > 2) {//그림 이미지가 3개 eachPrice = mjonMsgVO.getP3Price(); }else if(fileCount > 1) {//그림 이미지가 2개 eachPrice = mjonMsgVO.getP2Price(); }else if(fileCount == 1) {//그림 이미지가 1개 eachPrice = mjonMsgVO.getPPrice(); } shortMsgVO.setEachPrice(eachPrice); //문자 종류 선택 if(fileCount > 0) {//그림문자인 경우 문자타임 지정 shortMsgVO.setMsgType("6"); }else { shortMsgVO.setMsgType("4"); } //총금액 계산하기 Float sTotPrice = Float.parseFloat(shortMsgVO.getEachPrice()) * shortCnt; shortMsgVO.setTotPrice(sTotPrice.toString()); //단문문자 발송 처리 returnShortMap = fncSendMsgRtnMap(shortMsgVO); } if(longCnt > 0) {//장문문자 전송 이름, 전화번호, 변환문자 입력해주기 longMsgVO.setNameList(longNameList); longMsgVO.setCallToList(longPhone); longMsgVO.setRep1List(longRep1); longMsgVO.setRep2List(longRep2); longMsgVO.setRep3List(longRep3); longMsgVO.setRep4List(longRep4); /** * 그림문자에 치환 내용이 포함되어 있는 경우 단가 계산하기. * 그림문자의 경우 이로직을 타지 않지만 혹시 몰라서 추가해놓음 * */ String eachPrice = longMsgVO.getMPrice(); //api 서버에서 mPrice 값이 없는 경우가 있어서 오류 방지를위해서 추가 if(eachPrice == null) { eachPrice = longMsgVO.getEachPrice(); } if(fileCount > 2) {//그림 이미지가 3개 eachPrice = mjonMsgVO.getP3Price(); }else if(fileCount > 1) {//그림 이미지가 2개 eachPrice = mjonMsgVO.getP2Price(); }else if(fileCount == 1) {//그림 이미지가 1개 eachPrice = mjonMsgVO.getPPrice(); } longMsgVO.setEachPrice(eachPrice); //문자 종류 선택 longMsgVO.setMsgType("6"); //총금액 계산하기 Float mTotPrice = Float.parseFloat(longMsgVO.getEachPrice()) * longCnt; longMsgVO.setTotPrice(mTotPrice.toString()); //장문문자 발송 returnLongMap = fncSendMsgRtnMap(longMsgVO); } //일괄변환에 의한 단문, 장문 별개로 전송을 했기 때문에 각각 전송 결과 건수를 합쳐준 후 결과를 modelAndView로 리턴해준다. String returnMessage = ""; String returnStatus = ""; String msgGroupIdListComma = ""; String msgTypeListComma = ""; //그림 결과 내용 if(!returnImgMap.isEmpty()) { if(!returnImgMap.get("result").contains("fail")) { //발송건수 계산 int sendCnt = Integer.parseInt(resultSts) + Integer.parseInt(returnImgMap.get("resultSts")); resultSts = Integer.toString(sendCnt); //수신거부 건수 계산 int sendBlockCnt = Integer.parseInt(resultBlockSts) + Integer.parseInt(returnImgMap.get("resultBlockSts")); resultBlockSts = Integer.toString(sendBlockCnt); returnMessage = returnImgMap.get("message"); returnStatus = returnImgMap.get("result"); msgGroupIdListComma = returnImgMap.get("msgGroupId"); }else { returnMessage = returnImgMap.get("message"); returnStatus = returnImgMap.get("result"); modelAndView.addObject("message", returnMessage); modelAndView.addObject("result", returnStatus); modelAndView.addObject("resultSts", "0"); modelAndView.addObject("resultBlockSts", "0"); return modelAndView; } } //장문발송 결과 내용 if(!returnLongMap.isEmpty()) { if(!returnLongMap.get("result").contains("fail")) { //발송건수 계산 int sendCnt = Integer.parseInt(resultSts) + Integer.parseInt(returnLongMap.get("resultSts")); resultSts = Integer.toString(sendCnt); //수신거부 건수 계산 int sendBlockCnt = Integer.parseInt(resultBlockSts) + Integer.parseInt(returnLongMap.get("resultBlockSts")); resultBlockSts = Integer.toString(sendBlockCnt); returnMessage = returnLongMap.get("message"); returnStatus = returnLongMap.get("result"); msgGroupIdListComma = StringUtils.isNotEmpty(msgGroupIdListComma) ? msgGroupIdListComma+","+returnLongMap.get("msgGroupId") : returnLongMap.get("msgGroupId"); msgTypeListComma = StringUtils.isNotEmpty(msgTypeListComma) ? msgTypeListComma+","+"6" : "6"; }else { returnMessage = returnLongMap.get("message"); returnStatus = returnLongMap.get("result"); modelAndView.addObject("message", returnMessage); modelAndView.addObject("result", returnStatus); modelAndView.addObject("resultSts", "0"); modelAndView.addObject("resultBlockSts", "0"); return modelAndView; } } //단문발송 결과 내용 if(!returnShortMap.isEmpty()) { if(!returnShortMap.get("result").contains("fail")) { //발송건수 계산 int sendCnt = Integer.parseInt(resultSts) + Integer.parseInt(returnShortMap.get("resultSts")); resultSts = Integer.toString(sendCnt); //수신거부 건수 계산 int sendBlockCnt = Integer.parseInt(resultBlockSts) + Integer.parseInt(returnShortMap.get("resultBlockSts")); resultBlockSts = Integer.toString(sendBlockCnt); returnMessage = returnShortMap.get("message"); returnStatus = returnShortMap.get("result"); msgGroupIdListComma = StringUtils.isNotEmpty(msgGroupIdListComma) ? msgGroupIdListComma+","+returnShortMap.get("msgGroupId") : returnShortMap.get("msgGroupId"); msgTypeListComma = StringUtils.isNotEmpty(msgTypeListComma) ? msgTypeListComma+","+"4" : "4"; }else { returnMessage = returnShortMap.get("message"); returnStatus = returnShortMap.get("result"); modelAndView.addObject("message", returnMessage); modelAndView.addObject("result", returnStatus); modelAndView.addObject("resultSts", "0"); modelAndView.addObject("resultBlockSts", "0"); return modelAndView; } } modelAndView.addObject("msgType", msgTypeListComma); modelAndView.addObject("msgGroupId", msgGroupIdListComma); modelAndView.addObject("message", returnMessage); modelAndView.addObject("result", returnStatus); modelAndView.addObject("resultSts", resultSts); modelAndView.addObject("resultBlockSts", resultBlockSts); }else { //문자발송 함수 호출 - 일괄변환이 없거나, 그림문자 일괄변환의 경우 한번에 전송 처리 modelAndView = fncSendMsg(mjonMsgVO); } }catch(Exception e) { System.out.println("========================================================================="); System.out.println("+++++++++++++++++++++++++++++ 일반문자 ==> 기타 시스템 오류 !!! : " + e.getMessage()); System.out.println("========================================================================="); //logger.error(e.getMessage(), e); e.printStackTrace(); modelAndView.addObject("result", "fail"); modelAndView.addObject("message", "기타 시스템 오류 : " + e.getMessage()); return modelAndView; } /** * 사용자가 보낸 문자를 문자온 법인폰으로도 하나 전송하는 기능 시작 * * */ try { 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(); String holiSmishingNoti = joinSettingVO.getHoliSmishingNoti(); //야간 스미싱의심 알림이 활성화 되어있는 경우 if(holiSmishingNoti.equals("Y")) { // SLACK 체크 if (joinSettingVO != null && joinSettingVO.getSlackNoti().equals("Y")) { MsgAlarmSetVO msgAlarmSetVO = new MsgAlarmSetVO(); msgAlarmSetVO.setUseYn("Y"); msgAlarmSetVO.setFirstIndex(0); List resultAlarmList = msgHolidayService.selectAlarmSettingList(msgAlarmSetVO); Calendar calendar = Calendar.getInstance(); int year = calendar.get(Calendar.YEAR); MsgHolidayVO msgHolidayVO = new MsgHolidayVO(); msgHolidayVO.setFirstIndex(0); msgHolidayVO.setRecordCountPerPage(100); msgHolidayVO.setSearchHoliYear(Integer.toString(year)); List resultHolidayList = msgHolidayService.selectMsgHolidayList(msgHolidayVO); MjonHolidayApi mjonHolidayApi = new MjonHolidayApi(); boolean smishingAlarmPassSts = mjonHolidayApi.getHolidaySmishingPassStatus(resultAlarmList, resultHolidayList); if(!smishingAlarmPassSts) {//평일,주말, 공휴일 알림설정 시간에 포함되지 않는 경우 슬랙 알림 발송 MjonCommon comm = new MjonCommon(); comm.getAdminSandSlack(mjonMsgVO); } //Slack으로 메세지 전송 처리 /*MjonCommon comm = new MjonCommon(); System.out.println("slack noti"); comm.getAdminSandSlack(mjonMsgVO);*/ } } /*else {//야간스미싱 알림 비활성화인 경우 - 알림일정에 포함되지 않으면 슬랙 발송 처리(알림일정에 포함되면 슬랙발송 X - 알림 비활성화이기 때문에 발송X) MsgAlarmSetVO msgAlarmSetVO = new MsgAlarmSetVO(); msgAlarmSetVO.setUseYn("Y"); msgAlarmSetVO.setFirstIndex(0); List resultAlarmList = msgHolidayService.selectAlarmSettingList(msgAlarmSetVO); Calendar calendar = Calendar.getInstance(); int year = calendar.get(Calendar.YEAR); MsgHolidayVO msgHolidayVO = new MsgHolidayVO(); msgHolidayVO.setFirstIndex(0); msgHolidayVO.setRecordCountPerPage(100); msgHolidayVO.setSearchHoliYear(Integer.toString(year)); List resultHolidayList = msgHolidayService.selectMsgHolidayList(msgHolidayVO); MjonHolidayApi mjonHolidayApi = new MjonHolidayApi(); boolean smishingAlarmPassSts = mjonHolidayApi.getHolidaySmishingPassStatus(resultAlarmList, resultHolidayList); if(!smishingAlarmPassSts) {//평일,주말, 공휴일 알림설정 시간에 포함되지 않는 경우 슬랙 알림 발송 MjonCommon comm = new MjonCommon(); comm.getAdminSandSlack(mjonMsgVO); } }*/ } } catch (Exception e) { throw new Exception("++++++++++++++++++++++ getAdminPhoneSendMsgData Error !!! " + e); } return modelAndView; } /** * 문자발송시 치환문자가 있거나 단문, 장문 일경우 타는 로직 * param : MjonMsgVO * return : ModelAndView * * */ public Map fncSendMsgRtnMap(MjonMsgVO mjonMsgVO) { Map returnMap = new HashMap(); //String resultSts = "0"; //발송결과 건수 //String resultBlockSts = "0"; //수신거부 등록번호로 발송을 안한 건수 int resultSts = 0; //발송결과 건수 int resultBlockSts = 0; //수신거부 등록번호로 발송을 안한 건수 try { //현재 고객의 보유 캐시가 문자 발송이 가능한 금액인지 체크 String userMoney = mjonMsgDataService.selectBeforeCashData(mjonMsgVO); String userPoint = mjonMsgDataService.selectBeforePointData(mjonMsgVO); mjonMsgVO.setBefPoint(userPoint); //현재 보유 포인트 정보 저장 String totPrice = mjonMsgVO.getTotPrice(); BigDecimal befCash = new BigDecimal(userMoney).setScale(2, RoundingMode.HALF_EVEN); BigDecimal totMsgPrice = new BigDecimal(totPrice).setScale(2, RoundingMode.HALF_EVEN); //현재 보유 금액이 발송 문자 총 금액보다 클 경우만 문자 발송 //BigDecimal 비교 연산 // befCash(현재 보유금액) 값이 totMsgPrice(문자전송 금액) 보다 많으면 문자 전송 if(befCash.compareTo(totMsgPrice) != -1) { // -1 : befCash < totMsgPrice, 0 : befCash = totMsgPrice, 1 : befCash > totMsgPrice, //문자 발송 처리 //MjonMsgReturnVO returnVO = new MjonMsgReturnVO(); //현재 보유 캐쉬금액 셋팅 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(); //서비스 단으로 특정 문자 건수 이상으로 한번에 보내지 않기 위해서 처리함 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 4번째 값을 추가해준다. tempPhoneList[sendCnt] = phoneList[i]; tempNameList[sendCnt] = nameList[i]; tempRep1List[sendCnt] = rep1List[i]; tempRep2List[sendCnt] = rep2List[i]; tempRep3List[sendCnt] = rep3List[i]; 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); } } for(String tmpName : tempNameList) { if(tmpName != null) { arrNameList.add(tmpName); } } for(String tmpRep1 : tempRep1List) { if(tmpRep1 != null) { arrRep1List.add(tmpRep1); } } for(String tmpRep2 : tempRep2List) { if(tmpRep2 != null) { arrRep2List.add(tmpRep2); } } for(String tmpRep3 : tempRep3List) { if(tmpRep3 != null) { arrRep3List.add(tmpRep3); } } 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); mjonMsgVO.setNameList(sendNameList); mjonMsgVO.setRep1List(sendRep1List); mjonMsgVO.setRep2List(sendRep2List); mjonMsgVO.setRep3List(sendRep3List); 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(); }else if((i == callToListCnt -1) && sendCnt < 200){//200개의 마지막일 경우 처리 //마지막 리스트의 수신번호를 추가해 준다. tempPhoneList[sendCnt] = phoneList[i]; tempNameList[sendCnt] = nameList[i]; tempRep1List[sendCnt] = rep1List[i]; tempRep2List[sendCnt] = rep2List[i]; tempRep3List[sendCnt] = rep3List[i]; 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); } } for(String tmpName : tempNameList) { if(tmpName != null) { arrNameList2.add(tmpName); } } for(String tmpRep1 : tempRep1List) { if(tmpRep1 != null) { arrRep1List2.add(tmpRep1); } } for(String tmpRep2 : tempRep2List) { if(tmpRep2 != null) { arrRep2List2.add(tmpRep2); } } for(String tmpRep3 : tempRep3List) { if(tmpRep3 != null) { arrRep3List2.add(tmpRep3); } } 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); mjonMsgVO.setNameList(sendNameList2); mjonMsgVO.setRep1List(sendRep1List2); mjonMsgVO.setRep2List(sendRep2List2); mjonMsgVO.setRep3List(sendRep3List2); 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()); }else {//198개가 될때까지 배열에 데이터를 쌓는다 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 { //분할 발송을 체크 한 경우 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(" 25xx +++++++++++++++++++++++++++++++++++++++++++ resultSts ::: " + resultSts); System.out.println("========================================================================="); try { //문자 발송 캐시 차감 해주기 - serviceImple에서 처리하도록 변경 함 /*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)); } //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("+++++++++++++++++++++++++++++ fncSendMsgRtnMap() MJ_MSG_GROUP && CASH INSER ERROR !!! : " + e.getMessage()); System.out.println("========================================================================="); } }else { returnMap.put("message", "문자 발송에 필요한 보유 잔액이 부족 합니다."); returnMap.put("result", "fail"); returnMap.put("resultSts", "0"); returnMap.put("resultBlockSts", "0"); return returnMap; } //문자 발송 후 남은 보유 캐시 정보 불러오기 String afterCash = mjonMsgDataService.selectBeforeCashData(mjonMsgVO); returnMap.put("afterCash", afterCash); }catch(Exception e) { logger.error(e.getMessage(), e); System.out.println("========================================================================="); System.out.println("+++++++++++++++++++++++++++++ 기타 시스템 오류 : " + e.getMessage()); System.out.println("========================================================================="); returnMap.put("result", "fail"); returnMap.put("message", "기타 시스템 오류 : " + e.getMessage()); } returnMap.put("message", "문자 전송이 완료되었습니다."); returnMap.put("result", "success"); returnMap.put("msgGroupId", mjonMsgVO.getMsgGroupId()); returnMap.put("resultSts", Integer.toString(resultSts)); returnMap.put("resultSts", Integer.toString(resultSts)); returnMap.put("resultBlockSts", Integer.toString(resultBlockSts)); return returnMap; } /** * 문자발송시 치환문자가 없거나 그림문자일 경우 타는 로직 * param : MjonMsgVO * return : ModelAndView * * */ public ModelAndView fncSendMsg(MjonMsgVO mjonMsgVO) { ModelAndView modelAndView = new ModelAndView(); modelAndView.setViewName("jsonView"); int resultSts = 0; //발송결과 건수 int resultBlockSts = 0; //수신거부 등록번호로 발송을 안한 건수 try { //문자열 길이 체크 해주기 String charset = "euc-kr"; String smsCont = mjonMsgVO.getSmsTxt().replace("\r\n", "\n"); int bytes = smsCont.getBytes(charset).length; //발송 문자 길이 if(mjonMsgVO.getFileName1() != null) { mjonMsgVO.setMsgType("6"); }else { if(bytes < 2000) { if(bytes > 90) {// 90Byte 초과시 장문 mjonMsgVO.setMsgType("6"); }else {// 그외 단문 mjonMsgVO.setMsgType("4"); } }else { //최대 문자길이 초과시 modelAndView.addObject("message", "문자 치환 후 전송 문자 길이를 초과하였습니다."); modelAndView.addObject("result", "fail"); modelAndView.addObject("resultSts", "0"); modelAndView.addObject("resultBlockSts", "0"); return modelAndView; } } //현재 고객의 보유 캐시가 문자 발송이 가능한 금액인지 체크 String userMoney = mjonMsgDataService.selectBeforeCashData(mjonMsgVO); String userPoint = mjonMsgDataService.selectBeforePointData(mjonMsgVO); mjonMsgVO.setBefPoint(userPoint); //현재 보유 포인트 정보 저장 String totPrice = mjonMsgVO.getTotPrice(); BigDecimal befCash = new BigDecimal(userMoney).setScale(2, RoundingMode.HALF_EVEN); BigDecimal totMsgPrice = new BigDecimal(totPrice).setScale(2, RoundingMode.HALF_EVEN); // 현재 보유 금액이 발송 문자 총 금액보다 클 경우만 문자 발송 // BigDecimal 비교 연산 // befCash(현재 보유금액) 값이 totMsgPrice(문자전송 금액) 보다 많으면 문자 전송 if(befCash.compareTo(totMsgPrice) != -1) { // -1 : befCash < totMsgPrice, 0 : befCash = totMsgPrice, 1 : befCash > totMsgPrice, mjonMsgVO.setBefCash(userMoney); // 문자 전송 그룹아이디 생성 mjonMsgVO.setMsgGroupId(idgenMjonMsgGroupId.getNextStringId()); //문자 발송 처리 //MjonMsgReturnVO returnVO = new MjonMsgReturnVO(); String[] tempPhoneList = new String[200]; //임시 수신번호 리스트 저장용 배열 String[] phoneList = mjonMsgVO.getCallToList(); 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(); //서비스 단으로 특정 문자 건수 이상으로 한번에 보내지 않기 위해서 처리함 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 4번째 값을 추가해준다. tempPhoneList[sendCnt] = phoneList[i]; List arrPhoneList = new ArrayList(); for(String temp : tempPhoneList) { if(temp != null) { arrPhoneList.add(temp); } } String[] sendPhoneList = new String[arrPhoneList.size()]; for(int j=0; j< arrPhoneList.size(); j++) { sendPhoneList[j] = arrPhoneList.get(j); } mjonMsgVO.setCallToList(sendPhoneList); 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(); }else if((i == callToListCnt -1) && sendCnt < 200){ //마지막 리스트의 수신번호를 추가해 준다. tempPhoneList[sendCnt] = phoneList[i]; List arrPhoneList2 = new ArrayList(); for(String temp : tempPhoneList) { if(temp != null) { arrPhoneList2.add(temp); } } String[] sendPhoneList2 = new String[arrPhoneList2.size()]; for(int j=0; j< arrPhoneList2.size(); j++) { sendPhoneList2[j] = arrPhoneList2.get(j); } mjonMsgVO.setCallToList(sendPhoneList2); 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()); }else { tempPhoneList[sendCnt] = phoneList[i]; sendCnt++; } } }else { //분할 발송을 체크 한 경우 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("======================================== totPrice ::: "+mjonMsgVO.getTotPrice()); } System.out.println("========================================================================="); System.out.println("+++++++++++++++++++++++++++++++++++++++++++ resultSts ::: " + resultSts); System.out.println("+++++++++++++++++++++++++++++++++++++++++++ resultBlockSts ::: " + resultBlockSts); System.out.println("========================================================================="); try { //문자 발송 캐시 차감 해주기 - serviceImple에서 처리하도록 변경 함 /*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)); } //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("====================================== fncSendMsg MJ_MSG_GROUP && CASH ERROR !!! ::: " + e.getMessage()); System.out.println("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"); } }else { modelAndView.addObject("message", "문자 발송에 필요한 보유 잔액이 부족 합니다."); modelAndView.addObject("result", "fail"); modelAndView.addObject("resultSts", "0"); modelAndView.addObject("resultBlockSts", "0"); return modelAndView; } //문자 발송 후 남은 보유 캐시 정보 불러오기 String afterCash = mjonMsgDataService.selectBeforeCashData(mjonMsgVO); System.out.println("afterCash :: "+ afterCash); modelAndView.addObject("afterCash", afterCash); }catch(Exception e) { logger.error(e.getMessage(), e); e.printStackTrace(); System.out.println("========================================================================="); System.out.println("++++++++++++++++++++++++++++++++++++++++++++기타 시스템 오류 : " + e.getMessage()); System.out.println("========================================================================="); modelAndView.addObject("result", "fail"); modelAndView.addObject("message", "기타 시스템 오류 : " + e.getMessage()); } modelAndView.addObject("message", "문자 전송이 완료되었습니다."); modelAndView.addObject("result", "success"); //TODO 기존 로직에 추가해야함 modelAndView.addObject("msgType", mjonMsgVO.getMsgType()); modelAndView.addObject("msgGroupId", mjonMsgVO.getMsgGroupId()); modelAndView.addObject("resultSts", resultSts); modelAndView.addObject("resultBlockSts", resultBlockSts); // return ResponseEntity.ok().body(new StatusResponse(HttpStatus.OK, "성공", LocalDateTime.now())); return modelAndView; } @RequestMapping(value= {"/web/user/login/fileTest.do"}) public void downloadAndSaveFile() throws Exception { String downloadUrl = "http://192.168.0.11:5000/converHWPtoPDF"; String filePath = "D:\\Development\\test_dev"; String fileNm = "저작권분쟁조정규칙(20220516)"; // String fileNm = "testFileName(20220516)"; String fileExt = ".pdf"; String cnvtfileExt = ".jpg"; byte[] fileData = fileSendAnddownloadFile(downloadUrl, filePath + File.separator + fileNm + ".hwp"); // byte[] fileData = downloadFile(downloadUrl, fileNm); this.saveFile(fileData, filePath, fileNm+fileExt); this.pdfToJpg(filePath, fileNm, fileExt, cnvtfileExt); } /** * @methodName : fileSendAnddownloadFile * @author : 이호영 * @date : 2023.08.04 * @description : 파일을 보내서 PFD로 변환한 파일을 받는다 * @param downloadUrl * @param filePathNm * @return * @throws IOException */ public byte[] fileSendAnddownloadFile(String downloadUrl, String filePathNm) throws IOException { RestTemplate restTemplate = new RestTemplate(); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.MULTIPART_FORM_DATA); // Create a ByteArrayResource to wrap the file content without relying on the file system FileSystemResource fileResource = new FileSystemResource(filePathNm); // To ensure correct encoding for non-ASCII characters String encodedFilename = UriUtils.encode(fileResource.getFilename(), "UTF-8"); // Create a new HttpEntity for file and use encoded filename MultiValueMap body = new LinkedMultiValueMap<>(); body.add("file", new ByteArrayResource(Files.readAllBytes(fileResource.getFile().toPath())) { @Override public String getFilename() { return encodedFilename; } }); HttpEntity> entity = new HttpEntity<>(body, headers); ResponseEntity responseEntity = restTemplate.exchange(downloadUrl, HttpMethod.POST, entity, byte[].class); if (responseEntity.getStatusCodeValue() == 200) { return responseEntity.getBody(); } else { throw new RuntimeException("Failed to download file from " + downloadUrl); } } /** * @methodName : downloadFile * @author : 이호영 * @date : 2023.08.04 * @description : 서버에 파일을 요청해서 받는 형식 * @param downloadUrl * @param fileNm * @return public byte[] downloadFile(String downloadUrl, String fileNm) { RestTemplate restTemplate = new RestTemplate(); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.MULTIPART_FORM_DATA); MultiValueMap body = new LinkedMultiValueMap<>(); body.add("fileNm", fileNm); HttpEntity> entity = new HttpEntity<>(body, headers); ResponseEntity responseEntity = restTemplate.exchange(downloadUrl, HttpMethod.POST, entity, byte[].class); // System.out.println("responseEntity :: "+ responseEntity); if (responseEntity.getStatusCodeValue() == 200) { return responseEntity.getBody(); } else { throw new RuntimeException("Failed to download file from " + downloadUrl); } } */ /** * @methodName : saveFile * @author : 이호영 * @date : 2023.08.04 * @description : 파일 저장 * @param fileData * @param filePath * @param fileNm */ public void saveFile(byte[] fileData, String filePath, String fileNm) { Path path = Paths.get(filePath, fileNm); try { Files.write(path, fileData); } catch (IOException e) { throw new RuntimeException("Failed to save file to " + filePath, e); } } /** * @methodName : pdfToJpg * @author : 이호영 * @date : 2023.08.04 * @description : 저장한 파일을 불러와서 파일명의 폴더를 생성하여 jpg로 저장 * @param filePath * @param fileNm * @param oriFileExt * @param cnvtfileExt * @throws Exception */ public void pdfToJpg(String filePath, String fileNm, String oriFileExt, String cnvtfileExt) throws Exception { File file = new File(filePath + File.separator + fileNm + oriFileExt); PDDocument document = PDDocument.load(file); try { int pageCount = document.getNumberOfPages(); PDFRenderer pdfRenderer = new PDFRenderer(document); System.out.println("pageCount : "+ pageCount); String saveFilePath = this.filePathChk(filePath + File.separator +fileNm); if(StringUtils.isNotEmpty(saveFilePath)) { for (int i = 0; i < pageCount; i++) { BufferedImage imageObj = pdfRenderer.renderImageWithDPI(i, 100, ImageType.RGB); File outputfile = new File(saveFilePath + File.separator + fileNm + i + cnvtfileExt); ImageIO.write(imageObj, "jpg", outputfile); } } } catch (Exception e) { e.printStackTrace(); // TODO: handle exception }finally { if (document != null) { document.close(); } } } /** * @methodName : filePathChk * @author : 이호영 * @date : 2023.08.04 * @description : jpg 파일 저장할 디렉토리 생성 * @param filePath * @return */ private String filePathChk(String filePath) { // TODO Auto-generated method stub String directoryPath = filePath; Path path = Paths.get(directoryPath); if (!Files.exists(path)) { try { Files.createDirectories(path); System.out.println("Directory created"); return directoryPath; } catch (IOException e) { throw new RuntimeException("Failed to create directory!", e); } } else { System.out.println("Directory already exists"); } return null; } @RequestMapping(value="/web/mjon/test/insertAfterPayCashChargeSchedulerAjax.do") public void testAfterPayCashCharge() throws Exception{ System.out.println("=================================testAfterPayCashCharge Start=========================================="); try { egovUserManageService.updateUserCashByAutoCash(); } catch (Exception e) { System.out.println("++++++++++++++ testAfterPayCashCharge Error!!! "+e); } } @RequestMapping(value = "/web/mjon/test/ajaxTest.do") public ResponseEntity ajaxTest( @RequestParam String isSuccess, @RequestParam String s_msg, @RequestParam String f_msg, @RequestParam int sleep, HttpServletRequest request, ModelMap model) throws Exception { System.out.println("sleep :: "+ sleep); int s = sleep*1000; try { // 3초 지연 Thread.sleep(s); } catch (InterruptedException e) { e.printStackTrace(); } if("Y".equals(isSuccess)) { return ResponseEntity.ok().body(new StatusResponse(HttpStatus.OK, s_msg, "")); }else { return ResponseEntity.ok().body(new StatusResponse(HttpStatus.BAD_REQUEST, f_msg, "")); } } }