From 1b04bc71048de2cf00687a9c2bc73350349e1bb0 Mon Sep 17 00:00:00 2001 From: rosewiper Date: Tue, 16 Jan 2024 16:02:04 +0900 Subject: [PATCH] =?UTF-8?q?=EC=B9=B4=EC=B9=B4=EC=98=A4=20=EC=B9=9C?= =?UTF-8?q?=EA=B5=AC=ED=86=A1=20=EC=8A=A4=ED=8C=B8=20=ED=95=84=ED=84=B0?= =?UTF-8?q?=EB=A7=81=20=EA=B0=9C=EB=B0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../let/kakao/kakaoComm/KakaoSendUtil.java | 152 ++++ .../web/KakaoFriendsTalkSendController.java | 132 +++- .../ft/KakaoFriendsTalkMsgDataView.jsp | 717 +++++++++++++++++- .../jsp/web/msgdata/MsgDataSMLView.jsp | 3 - .../webapp/js/kakao/ft/friendstalkExcel.js | 151 ---- src/main/webapp/js/kakao/ft/ftPriceClclt.js | 14 + src/main/webapp/js/kakao/ft/ftTabulator.js | 61 +- 7 files changed, 1051 insertions(+), 179 deletions(-) diff --git a/src/main/java/itn/let/kakao/kakaoComm/KakaoSendUtil.java b/src/main/java/itn/let/kakao/kakaoComm/KakaoSendUtil.java index e1df6029..c7c91967 100644 --- a/src/main/java/itn/let/kakao/kakaoComm/KakaoSendUtil.java +++ b/src/main/java/itn/let/kakao/kakaoComm/KakaoSendUtil.java @@ -12,6 +12,7 @@ import itn.com.cmm.util.StringUtil; import itn.let.kakao.kakaoComm.kakaoApi.KakaoApiJsonSave; import itn.let.mjo.msg.service.MjonMsgVO; import itn.let.mjo.msgdata.service.MjonMsgDataService; +import itn.let.mjo.spammsg.web.ComGetSpamStringParser; import itn.let.sym.site.service.JoinSettingVO; import itn.let.uss.umt.service.MberManageVO; @@ -341,4 +342,155 @@ public class KakaoSendUtil { } return tempSubMagTxt; } + + /* + * 카카오 친구톡 치환 내용에 대한 변환 처리 + * + * + * */ + public String getKakaoFTCntReplace(String varValStr, String contents) throws Exception{ + + String[] array = varValStr.split("¶"); + String tmpContents = contents; + for(int j=0; j < array.length; j++) { + String tmpVarVal = array[j].replaceAll("§", ","); + if(tmpVarVal.length() > 0) { + + if(tmpContents.contains("#{이름}") && j == 0) { + tmpContents = tmpContents.replaceAll("\\#\\{이름\\}", tmpVarVal); + } + + //1번째에 핸드폰 번호가 포함 되어 있어서 건너뜀 + + if(tmpContents.contains("#{1}") && j == 2) { + tmpContents = tmpContents.replaceAll("\\#\\{1\\}", tmpVarVal); + } + + if(tmpContents.contains("#{2}") && j == 3) { + tmpContents = tmpContents.replaceAll("\\#\\{2\\}", tmpVarVal); + } + + if(tmpContents.contains("#{3}") && j == 4) { + tmpContents = tmpContents.replaceAll("\\#\\{3\\}", tmpVarVal); + } + + if(tmpContents.contains("#{4}") && j == 5) { + tmpContents = tmpContents.replaceAll("\\#\\{4\\}", tmpVarVal); + } + + } + + } + + System.out.println(tmpContents); + + return tmpContents; + } + + /* + * 카카오 친구톡 치환문자 내용 스팸 필터 + * 치환변수 내용 및 템플릿 내용, 스팸필터 단어 리스트를 전달하면 스팸 문구 포함 문구 리턴 + * 없으면 공백을 리턴 + * + * */ + public String getKakaoFTCntRepToSpamFilter(List varValList, List resultSpamTxt, String contents) throws Exception { + String spmFilterTxt = ""; + for(int i=0; i < varValList.size(); i++) { + //String[] array = varValList.get(i)[0].split("¶"); + String tmpContents = getKakaoFTCntReplace(varValList.get(i)[0], contents); + System.out.println(tmpContents); + + //입력 문장에 대해서 우회 문장 또는 특수 기호 입력 제거 등 문장 재구성 처리, 한글 자모음 분리 및 재조함도 함께 처리함. + String resultParser = ComGetSpamStringParser.getSpamTextParse(tmpContents).trim(); + //List jasoList = HangulParser.disassemble(resultParser); + //String assembleStr = HangulParser.assemble(jasoList); + + System.out.println("++++++++++++++ spam resultParser ::: "+resultParser); + + //데이터베이스에 등록된 스팸문구와 일치하는 단어/문구가 있는지 체크함. + 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); + + return spmFilterTxt; + + } + + } + return ""; + } + + /* + * 치환문자가 없는 내용에 대한 스팸필터링 처리 + * + * */ + public String getKakaoFTCntToSpamFilter(List resultSpamTxt, String contents) throws Exception { + String spmFilterTxt = ""; + //for(int i=0; i < varValList.size(); i++) { + //String[] array = varValList.get(i)[0].split("¶"); + String tmpContents = contents; + System.out.println(tmpContents); + + //입력 문장에 대해서 우회 문장 또는 특수 기호 입력 제거 등 문장 재구성 처리, 한글 자모음 분리 및 재조함도 함께 처리함. + String resultParser = ComGetSpamStringParser.getSpamTextParse(tmpContents).trim(); + //List jasoList = HangulParser.disassemble(resultParser); + //String assembleStr = HangulParser.assemble(jasoList); + + System.out.println("++++++++++++++ spam resultParser ::: "+resultParser); + + //데이터베이스에 등록된 스팸문구와 일치하는 단어/문구가 있는지 체크함. + 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); + + return spmFilterTxt; + + } + + //} + return ""; + } + } diff --git a/src/main/java/itn/let/kakao/user/kakaoFt/web/KakaoFriendsTalkSendController.java b/src/main/java/itn/let/kakao/user/kakaoFt/web/KakaoFriendsTalkSendController.java index 201b4c64..98cb0762 100644 --- a/src/main/java/itn/let/kakao/user/kakaoFt/web/KakaoFriendsTalkSendController.java +++ b/src/main/java/itn/let/kakao/user/kakaoFt/web/KakaoFriendsTalkSendController.java @@ -228,18 +228,128 @@ public class KakaoFriendsTalkSendController { } - /** - * @methodName : kakaoFriendsTalkMsgDataView - * @author : 우영두 - * @date : 2024.01.05 - * @description : kakaoFriendsTalkMsgDataView 카카오 친구톡 발송 화면 템플릿 팝업 리스트 조회 - * @param kakaoVO - * @param model - * @param response - * @return - * @throws Exception - */ + /** + * @Method Name : selectSpamKakaoFriendsTalkMsgChkAjax + * @작성일 : 2024. 1. 15. + * @작성자 : 우영두 + * @Method 설명 : 카카오 친구톡 전송시 스팸문구 확인 체크 + */ + @RequestMapping(value= {"/web/mjon/kakao/friendstalk/selectSpamKakaoFriendsTalkMsgChkAjax.do"}) + public ModelAndView selectSpamKakaoFriendsTalkMsgChkAjax(ModelMap model + , @ModelAttribute("kakaoVO") KakaoVO kakaoVO) throws Exception { + ModelAndView modelAndView = new ModelAndView(); + modelAndView.setViewName("jsonView"); + + try { + List resultSpamTxt = mjonMsgDataService.selectSpamKeywordList(); + System.out.println("친구톡 스팸 필터링"); + + if(resultSpamTxt == null) { + modelAndView.addObject("result", "listEmpty"); + return modelAndView; + }else { + //변환변수 포함(Y) 미포함(N) + String spmFilterTxt = ""; + + if(kakaoVO.getTxtReplYn().equals("Y")) { + List varValList = kakaoVO.getVarValList(); // value 값 + + String resultSpam = kakaoSendUtil.getKakaoFTCntRepToSpamFilter(varValList, resultSpamTxt, kakaoVO.getTemplateContent()); + + if(resultSpam.length() > 0) { + + modelAndView.addObject("result", "spams"); + return modelAndView; + + } + + if(kakaoVO.getSubMsgSendYn().equals("Y")) { + + String resultSmsTxtSpam = kakaoSendUtil.getKakaoFTCntRepToSpamFilter(varValList, resultSpamTxt, kakaoVO.getSmsTxtArea()); + + if(resultSmsTxtSpam.length() > 0) { + + modelAndView.addObject("result", "spams"); + return modelAndView; + + } + + } + + }else {//치환문자가 없는 경우 스팸 필터링 + + String resultSpam = kakaoSendUtil.getKakaoFTCntToSpamFilter(resultSpamTxt, kakaoVO.getTemplateContent()); + + if(resultSpam.length() > 0) { + + modelAndView.addObject("result", "spams"); + return modelAndView; + + } + + if(kakaoVO.getSubMsgSendYn().equals("Y")) { + + String resultSmsTxtSpam = kakaoSendUtil.getKakaoFTCntToSpamFilter(resultSpamTxt, kakaoVO.getSmsTxtArea()); + + if(resultSmsTxtSpam.length() > 0) { + + modelAndView.addObject("result", "spams"); + return modelAndView; + + } + + } + + } + + } + + }catch (Exception e) { + e.printStackTrace(); + modelAndView.addObject("message", egovMessageSource.getMessage("fail.common.select")); + modelAndView.addObject("result", "fail"); + return modelAndView; + } + + return modelAndView; + } + /** + * @Method Name : kakaoFriendsTalkMsgSendAjax + * @작성일 : 2024. 1. 16. + * @작성자 : 우영두 + * @Method 설명 : 카카오 친구톡 전송 + */ + @RequestMapping(value= {"/web/mjon/kakao/friendstalk/kakaoFriendsTalkMsgSendAjax.do"}) + public ModelAndView kakaoFriendsTalkMsgSendAjax(ModelMap model + , @ModelAttribute("kakaoVO") KakaoVO kakaoVO) throws Exception { + ModelAndView modelAndView = new ModelAndView(); + modelAndView.setViewName("jsonView"); + + System.out.println("++++++++++++++++++++++ senderKey ::: "+kakaoVO.getSenderKey()); + System.out.println("++++++++++++++++++++++ imageType ::: "+kakaoVO.getImageType()); + System.out.println("++++++++++++++++++++++ imageTitle ::: "+kakaoVO.getImageTitle()); + System.out.println("++++++++++++++++++++++ imageLink ::: "+kakaoVO.getImageLink()); + System.out.println("++++++++++++++++++++++ imageFileName ::: "+kakaoVO.getImageFileName()); + System.out.println("++++++++++++++++++++++ adFlag ::: "+kakaoVO.getAdFlag()); + System.out.println("++++++++++++++++++++++ templateContents ::: "+kakaoVO.getTemplateContent()); + System.out.println("++++++++++++++++++++++ kakaoFtPrice ::: "+kakaoVO.getKakaoFtPrice()); + System.out.println("++++++++++++++++++++++ eachPrice ::: "+kakaoVO.getEachPrice()); + System.out.println("++++++++++++++++++++++ totPrice ::: "+kakaoVO.getTotalPrice()); + + List varValList = new ArrayList(); + + System.out.println(kakaoVO.getTxtReplYn()); + + /*for(List varValList : kakaoVO.getVarValList()) { + + + } */ + + + return modelAndView; + } + } diff --git a/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/ft/KakaoFriendsTalkMsgDataView.jsp b/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/ft/KakaoFriendsTalkMsgDataView.jsp index f9cb8fb5..a86bda38 100644 --- a/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/ft/KakaoFriendsTalkMsgDataView.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/ft/KakaoFriendsTalkMsgDataView.jsp @@ -4,7 +4,7 @@ <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> <%@ taglib prefix="ec" uri="/WEB-INF/tld/ecnet_tld.tld"%> - +<%@ page import="itn.com.cmm.LoginVO" %> @@ -17,6 +17,8 @@ @@ -719,8 +1407,30 @@ function fn_noTimeSend(){ + + + + + + + + + + + + + + + + + + + + + +
@@ -1204,7 +1914,7 @@ function fn_noTimeSend(){

대체문자

- +
@@ -1249,7 +1959,7 @@ function fn_noTimeSend(){ 0 / 90byte

- 단문 + 단문
@@ -1258,7 +1968,6 @@ function fn_noTimeSend(){ -

* 현재 [단문] 0건 발송 가능합니다.

diff --git a/src/main/webapp/WEB-INF/jsp/web/msgdata/MsgDataSMLView.jsp b/src/main/webapp/WEB-INF/jsp/web/msgdata/MsgDataSMLView.jsp index ce81deff..129ed125 100644 --- a/src/main/webapp/WEB-INF/jsp/web/msgdata/MsgDataSMLView.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/msgdata/MsgDataSMLView.jsp @@ -541,9 +541,6 @@ $(document).ready(function (){ } - - - });//문자 바이트수 계산하기 끝 diff --git a/src/main/webapp/js/kakao/ft/friendstalkExcel.js b/src/main/webapp/js/kakao/ft/friendstalkExcel.js index 3ea21885..0e8b382b 100644 --- a/src/main/webapp/js/kakao/ft/friendstalkExcel.js +++ b/src/main/webapp/js/kakao/ft/friendstalkExcel.js @@ -151,154 +151,3 @@ function excelExport(event){ } } -/*function excelExport(event){ - - var fileValue = $("#excelFile").val().split("\\"); - var fileName = fileValue[fileValue.length-1]; - - var fileExt = fileName.split('.').pop().toLowerCase(); - - if(fileExt.length > 0){ - if($.inArray(fileExt, ['txt','xls','xlsx']) == -1) { - - alert('txt, xls, xlsx 파일만 업로드 할수 있습니다.'); - return false; - - } - - //$("#excelFile").val(""); - //선택 파일명 화면에 표시해주기 - $("#excelNm").val(fileName); - - } - -}*/ - - -//엑셀파일 자료 데이터베이스에 입력해주기 -function fnInsertAttchFileData(){ - - var data = new FormData(document.excelForm); - data.append("file0", $('#excelFile').prop('files')[0]); - - var fileValue = $("#excelFile").val().split("\\"); - var fileName = fileValue[fileValue.length-1]; - - var fileExt = fileName.split('.').pop().toLowerCase(); - - var url = ""; - - if(fileExt == "xls" || fileExt == "xlsx"){ - - //url = "/web/mjon/msgcampain/insertExelFileTWCallToAjax.do"; - - }else if(fileExt = "txt"){ - - //url = "/web/mjon/msgcampain/insertTxtFileTWCallToAjax.do"; - - }else{ - - alert('txt, xls, xlsx 파일만 업로드 할수 있습니다.'); - return; - - } - - //엑셀 데이터 변수에 자료가 있으면 지워준다. - if(excelAddr.length > 0){ - - excelAddr = []; - - } - - $.ajax({ - type: "POST", - enctype: 'multipart/form-data', - url: url, - data: data, - dataType:'json', - async: true, - processData: false, - contentType: false, - cache: false, - //timeout: 600000, - success: function (returnData, status) { - if(status == 'success'){ // status 확인 필요한가. 석세스 안뜨면 에러 가지 않나 - - if(returnData.success){ - - var data = returnData.data; - var message = returnData.message; - - if(message != '' ){ - alert(returnData.message); - } - - - if(data != null){ - - $.each(data, function(i, item){ - - //form 데이터 callSeq에 순번 입력해주기 - $("#callSeq").val(item.callSeq); - - }); - - } - - //입력된 데이터베이스에서 받는사람 20건 불러와서 화면에 표시해주기 - var callSeq = $("#callSeq").val(); - if(callSeq > 0){ - - //첨부파일로 불러온 데이터를 받는사람 목록에 추가해 준다. - addTWCallToInfo(); - - //첨부파일 초기화 시켜주기 - $("#excelFile").val(""); - $("#excelNm").val(""); - - }else{ - - alert("추가 엑셀 데이터가 없습니다."); - return false; - - } - - }else{ - alert(returnData.message); - excelAddr = []; //엑셀 데이터 저장 변수 초기화 - $("#excelFile").val(""); //첨부파일 input 초기화 - $("#excelNm").val(""); // 첨부파일 명 초기화 - fileName = ""; - return; - - } - } else if(status== 'fail'){ - alert("첨부파일 불러오는 중 오류가 발생하였습니다."); - console.log("status : fail ~"); - } - }, - error: function (e) { - alert("첨부파일 불러오는 중 오류가 발생하였습니다."); - console.log("ERROR : ", e); - }, - beforeSend : function(xmlHttpRequest) { - //로딩창 show - $('.loading_layer').addClass('active'); - }, - complete : function(xhr, textStatus) { - //로딩창 hide - $('.loading_layer').removeClass('active'); - } - }); - -} - -//엑셀 불러오기 팝업의 추가 버튼 처리 -$("#excelAdd").click(function(){ - - var callSeq = $("#callSeq").val(); - - //엑셀파일 자료 데이터베이스에 입력해주기 - fnInsertAttchFileData(); - -}); \ No newline at end of file diff --git a/src/main/webapp/js/kakao/ft/ftPriceClclt.js b/src/main/webapp/js/kakao/ft/ftPriceClclt.js index aad451e5..6a55e149 100644 --- a/src/main/webapp/js/kakao/ft/ftPriceClclt.js +++ b/src/main/webapp/js/kakao/ft/ftPriceClclt.js @@ -41,6 +41,20 @@ function totalFtPriceSum(totRows){ } + //대체문자가 있는 경우 대체문자의 단/장문에 따른 금액 계산 + var subMsgSts = $("#send_fail_check").is(":checked"); + + if(subMsgSts){ + + var conLeng = conByteLeng($('#smsTxtArea').val()); // 내용 문자 입력 바이트 수 계산하기 + if(conLeng > 90){ + price = $("#longPrice").val(); + }else{ + price = $("#shortPrice").val(); + } + + } + totalPrice = price * collNumCnt; // 소수점 첫째자리 까지 표시 diff --git a/src/main/webapp/js/kakao/ft/ftTabulator.js b/src/main/webapp/js/kakao/ft/ftTabulator.js index 3da934e5..537eef95 100644 --- a/src/main/webapp/js/kakao/ft/ftTabulator.js +++ b/src/main/webapp/js/kakao/ft/ftTabulator.js @@ -653,6 +653,7 @@ function fnFtReplCell(){ var rep2Status = false; var rep3Status = false; var rep4Status = false; + var varValStatus = true; if(smsTxtArea.indexOf("#{이름}") > -1){ @@ -692,6 +693,14 @@ function fnFtReplCell(){ var name = recTableData[j].getData().name; smsTxt = stringReplaceAll(smsTxt, "#{이름}", name); + }else{ + + if(nmStatus){ + //alert("#{이름} 변수에 데이터가 없는 항목이 있습니다. 받는사람 변수 데이터를 확인해 주세요."); + varValStatus = false; + //break; + } + } if(typeof recTableData[j].getData().rep1 != 'undefined' && recTableData[j].getData().rep1 != null && recTableData[j].getData().rep1 != ""){ @@ -699,6 +708,14 @@ function fnFtReplCell(){ var rep1 = recTableData[j].getData().rep1; smsTxt = stringReplaceAll(smsTxt, "#{1}", rep1); + }else{ + + if(rep1Status){ + //alert("#{1} 변수에 데이터가 없는 항목이 있습니다. 받는사람 변수 데이터를 확인해 주세요."); + varValStatus = false; + //break; + } + } if(typeof recTableData[j].getData().rep2 != 'undefined' && recTableData[j].getData().rep2 != null && recTableData[j].getData().rep2 != ""){ @@ -706,6 +723,14 @@ function fnFtReplCell(){ var rep2 = recTableData[j].getData().rep2; smsTxt = stringReplaceAll(smsTxt, "#{2}", rep2); + }else{ + + if(rep2Status){ + //alert("#{2} 변수에 데이터가 없는 항목이 있습니다. 받는사람 변수 데이터를 확인해 주세요."); + varValStatus = false; + //break; + } + } if(typeof recTableData[j].getData().rep3 != 'undefined' && recTableData[j].getData().rep3 != null && recTableData[j].getData().rep3 != ""){ @@ -713,6 +738,14 @@ function fnFtReplCell(){ var rep3 = recTableData[j].getData().rep3; smsTxt = stringReplaceAll(smsTxt, "#{3}", rep3); + }else{ + + if(rep3Status){ + //alert("#{3} 변수에 데이터가 없는 항목이 있습니다. 받는사람 변수 데이터를 확인해 주세요."); + varValStatus = false; + //break; + } + } if(typeof recTableData[j].getData().rep4 != 'undefined' && recTableData[j].getData().rep4 != null && recTableData[j].getData().rep4 != ""){ @@ -720,9 +753,16 @@ function fnFtReplCell(){ var rep4 = recTableData[j].getData().rep4; smsTxt = stringReplaceAll(smsTxt, "#{4}", rep4); + }else{ + + if(rep4Status){ + //alert("#{4} 변수에 데이터가 없는 항목이 있습니다. 받는사람 변수 데이터를 확인해 주세요."); + varValStatus = false; + //break; + } + } - var msgLen = strMaxCharacterCnt(smsTxt); var maxLenChar = 1000; @@ -750,16 +790,17 @@ function fnFtReplCell(){ } - //첫번째 수신자의 변환 텍스트 내용을 적용하여 미리보기 문자내용에 보여주자. - if(j == 0){ - - //미리보기에 내용 입력해 주기 - $('.template_text').text(smsTxt); - - } - } - + + //치환문자에 데이터가 누락된 경우 알림 메세지를 보여주고 받는사람 목록을 지워준다. + /*if(!varValStatus){ + + alert("치환변수 데이터가 없는 항목이 있습니다. 받는사람 변수 데이터를 확인해 주세요."); + tableL.clearData(); //기존 받는사람 목록을 삭제. + return false; + + }*/ + } //결제 금액 구하기