diff --git a/src/main/java/itn/com/cmm/MjonMsgSendVO.java b/src/main/java/itn/com/cmm/MjonMsgSendVO.java new file mode 100644 index 00000000..6169a8e7 --- /dev/null +++ b/src/main/java/itn/com/cmm/MjonMsgSendVO.java @@ -0,0 +1,116 @@ +package itn.com.cmm; + +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; + +@Getter +@Setter +@ToString +public class MjonMsgSendVO{ + + + /** + * @description : 수신자번호 + */ + private String phone; + + /** + * @description : [*이름*] - 치환문자 + */ + private String name; + + /** + * @description : [*1*] - 치환문자 + */ + private String rep1; + + /** + * @description : [*2*] - 치환문자 + */ + private String rep2; + + /** + * @description : [*3*] - 치환문자 + */ + private String rep3; + + /** + * @description : [*4*] - 치환문자 + */ + private String rep4; + + /** + * @description : 문자ID + */ + private String msgId; + + /** + * @description : 전송그룹ID (대량문자의 경우 하나의 그룹으로 세팅) + */ + private String msgGroupId; + + /** + * @description : 문자온 일반회원ID + */ + private String userId; + + /** + * @description : 발신번호 (하이픈 등의 문자를 제외한 12byte이하의 숫자로 입력한다.) + */ + private String callFrom; + /** + * @description : 수신번호 (하이픈 등의 문자를 제외한 12byte이하의 숫자로 입력한다.) + */ + private String callTo; + /** + * @description : 예약 발송일시 + */ + private String reqDate; + /** + * @description :전송사(04:다우, 05:JJ, 07:IVT, 01:아이하트 , 02:현대퓨처넷, 03:아이엠오) + */ + private String agentCode; + + /** + * @description : MMS용 메시지제목 + */ + private String subject; + + /** + * @description : SMS용 메시지본문 + */ + private String smsTxt; + + /** + * @description : 메세지타입(4: SMS 전송, 5: URL 전송, 6: MMS전송, 7: BARCODE전송, 8: 카카오 알림톡 전송) + */ + private String msgType; + + /** + * @description : 첨부파일 갯수 + */ + private String fileCnt; + + /** + * @description : 파일이름1 + */ + private String filePath1; + + /** + * @description : 파일이름2 + */ + private String filePath2; + + /** + * @description : 파일이름3 + */ + private String filePath3; + + + + + + + +} diff --git a/src/main/java/itn/com/cmm/MjonMsgTabulVO.java b/src/main/java/itn/com/cmm/MjonMsgTabulVO.java deleted file mode 100644 index 69294e16..00000000 --- a/src/main/java/itn/com/cmm/MjonMsgTabulVO.java +++ /dev/null @@ -1,20 +0,0 @@ -package itn.com.cmm; - -import lombok.Getter; -import lombok.Setter; -import lombok.ToString; - -@Getter -@Setter -@ToString -public class MjonMsgTabulVO{ - - private static final long serialVersionUID = 1L; - - private String name; - private String phone; - private String rep1; - private String rep2; - private String rep3; - private String rep4; -} diff --git a/src/main/java/itn/com/cmm/util/MsgSendUtils.java b/src/main/java/itn/com/cmm/util/MsgSendUtils.java index c7a767b1..da1ac7a3 100644 --- a/src/main/java/itn/com/cmm/util/MsgSendUtils.java +++ b/src/main/java/itn/com/cmm/util/MsgSendUtils.java @@ -3,16 +3,23 @@ package itn.com.cmm.util; import java.io.UnsupportedEncodingException; import java.math.BigDecimal; import java.math.RoundingMode; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import java.util.Objects; +import java.util.function.Function; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import java.util.stream.Stream; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; +import itn.com.cmm.MjonMsgSendVO; import itn.let.mail.service.StatusResponse; import itn.let.mjo.msg.service.MjonMsgVO; -import itn.let.mjo.msgdata.service.ReplacementListsVO; +import itn.let.mjo.spammsg.web.ComGetSpamStringParser; import itn.let.module.base.PriceAndPoint; import lombok.extern.slf4j.Slf4j; @@ -30,6 +37,7 @@ import lombok.extern.slf4j.Slf4j; * * */ +@Slf4j public final class MsgSendUtils { @@ -50,6 +58,7 @@ public final class MsgSendUtils { String smsCont = smsTxt.replace("\r\n", "\n"); smsBytes = smsCont.getBytes(charset).length; } + log.info(" + smsBytes :: [{}]", smsBytes); return smsBytes; } @@ -61,32 +70,33 @@ public final class MsgSendUtils { * @param mjonMsgVO * @param smsTxtByte * @return + * @throws UnsupportedEncodingException */ - public static String getMsgType(MjonMsgVO mjonMsgVO, int smsTxtByte) { - String msgType = mjonMsgVO.getMsgType(); + public static String getMsgTypeWithByteValidation(MjonMsgSendVO sendVO, String p_smsTxt) throws UnsupportedEncodingException { + + + int smsTxtByte = getSmsTxtBytes(p_smsTxt); + String msgType = "4"; + + // // 내문자저장함에 저장 후 문자를 발송하는 경우 문자 타입이 숫자가 아닌 문자로 넘어와서 변경 처리함 + // if ("P".equals(msgType) || "L".equals(msgType)) { + // msgType = "6"; + // } else if ("S".equals(msgType)) { + // msgType = "4"; + // } + + // 그림 이미지가 첨부된 경우 장문으로 설정 + if (StringUtils.isNotEmpty(sendVO.getFilePath1())) { + msgType = "6"; + } else if (smsTxtByte > 2000) { + // 2000 Byte를 초과할 경우 에러 처리 (이 부분은 호출부에서 검사하도록 유지할 수도 있음) + return "INVALID"; // 이 값은 호출부에서 에러 처리를 하도록 활용할 수 있습니다. + } else if (smsTxtByte > 90) { + // 90Byte 초과 시 장문으로 설정 + msgType = "6"; + } - // 내문자저장함에 저장 후 문자를 발송하는 경우 문자 타입이 숫자가 아닌 문자로 넘어와서 변경 처리함 - if ("P".equals(msgType) || "L".equals(msgType)) { - msgType = "6"; - } else if ("S".equals(msgType)) { - msgType = "4"; - } - - // 그림 이미지가 첨부된 경우 장문으로 설정 - if (mjonMsgVO.getFileName1() != null || (mjonMsgVO.getImgFilePath() != null && mjonMsgVO.getImgFilePath().length > 0)) { - msgType = "6"; - } else if (smsTxtByte > 2000) { - // 2000 Byte를 초과할 경우 에러 처리 (이 부분은 호출부에서 검사하도록 유지할 수도 있음) - return "INVALID"; // 이 값은 호출부에서 에러 처리를 하도록 활용할 수 있습니다. - } else if (smsTxtByte > 90) { - // 90Byte 초과 시 장문으로 설정 - msgType = "6"; - } else { - // 그 외 단문으로 설정 - msgType = "4"; - } - - return msgType; + return msgType; } public static float getValidPrice(Float personalPrice, Float defaultPrice) { @@ -129,16 +139,32 @@ public final class MsgSendUtils { return price; } - public static boolean isReplacementRequired(MjonMsgVO mjonMsgVO) { - return "Y".equals(mjonMsgVO.getTxtReplYn()); + + /** + * @methodName : isReplacementRequired + * @author : 이호영 + * @date : 2024.11.12 + * @description : 치환데이터가 있는지 확인 + * @param mjonMsgVO + * @return + */ + public static boolean isRepleasYN(MjonMsgVO mjonMsgVO) { + + // 치환 구문 패턴 리스트 + String[] placeholders = {"\\[\\*이름\\*\\]", "\\[\\*1\\*\\]", "\\[\\*2\\*\\]", "\\[\\*4\\*\\]", "\\[\\*3\\*\\]"}; + + for (String placeholder : placeholders) { + Pattern pattern = Pattern.compile(placeholder); + Matcher matcher = pattern.matcher(mjonMsgVO.getSmsTxt()); + // 해당 패턴이 존재하면 true 반환 + if (matcher.find()) { + return true; + } + } + return false; + } - public static ReplacementListsVO createReplacementLists(MjonMsgVO mjonMsgVO) throws UnsupportedEncodingException { - ReplacementListsVO lists = new ReplacementListsVO(); - lists.initializeLists(mjonMsgVO); // 배열을 초기화합니다. - return lists; -// return populateReplacementLists(mjonMsgVO, lists); // 데이터를 배열에 채웁니다. - } /** * @methodName : populateReplacementLists @@ -149,73 +175,168 @@ public final class MsgSendUtils { * @param lists * @param statusResponse * @return - * @throws UnsupportedEncodingException + * @throws Exception */ - public static Boolean populateReplacementLists(MjonMsgVO mjonMsgVO, ReplacementListsVO lists, StatusResponse statusResponse){ + public static Boolean populateSendLists(MjonMsgVO mjonMsgVO, List mjonMsgSendListVO, StatusResponse statusResponse, List resultSpamTxt) throws Exception{ - - String[] nameList = mjonMsgVO.getNameList(); - String[] phone = mjonMsgVO.getCallToList(); - String[] rep1 = mjonMsgVO.getRep1List(); - String[] rep2 = mjonMsgVO.getRep2List(); - String[] rep3 = mjonMsgVO.getRep3List(); - String[] rep4 = mjonMsgVO.getRep4List(); - String smsTxt = mjonMsgVO.getSmsTxt(); - int fileCount = Integer.parseInt(mjonMsgVO.getFileCnt()); - - // 이름 치환 - int shortCnt = 0; - int longCnt = 0; - int imgCnt = 0; - - - for (int i = 0; i < phone.length; i++) { - - smsTxt = smsTxt.replaceAll(String.valueOf((char) 13), ""); - + log.info(" :: populateSendLists :: "); - // 이름 및 치환 문자 처리 - smsTxt = replacePlaceholder(smsTxt, "[*이름*]", nameList, i); - smsTxt = replacePlaceholder(smsTxt, "[*1*]", rep1, i); - smsTxt = replacePlaceholder(smsTxt, "[*2*]", rep2, i); - smsTxt = replacePlaceholder(smsTxt, "[*3*]", rep3, i); - smsTxt = replacePlaceholder(smsTxt, "[*4*]", rep4, i); - + int spamChkSize = getSpamChkSize(mjonMsgSendListVO.size()); + int sampleCounter = 0; - try { - int bytes = getSmsTxtBytes(smsTxt); - if(bytes < 2000) { - if(fileCount > 0) { - populateImgLists(lists, nameList, phone, rep1, rep2, rep3, rep4, smsTxt, i); - imgCnt++; - - }else if(bytes > 90) {//장문문자 리스트 만들기 - populateLongLists(lists, nameList, phone, rep1, rep2, rep3, rep4, smsTxt, i); - longCnt++; - } else {//단문문자 리스트 만들기 - populateShortLists(lists, nameList, phone, rep1, rep2, rep3, rep4, smsTxt, i); - shortCnt++; + String smsTxtTemp = mjonMsgVO.getSmsTxt(); + + // 치환 구문과 필드 getter 매핑 + Map> placeholders = new HashMap<>(); + placeholders.put("[*이름*]", MjonMsgSendVO::getName); + placeholders.put("[*1*]", MjonMsgSendVO::getRep1); + placeholders.put("[*2*]", MjonMsgSendVO::getRep2); + placeholders.put("[*3*]", MjonMsgSendVO::getRep3); + placeholders.put("[*4*]", MjonMsgSendVO::getRep4); + + boolean hasPerformedSpamCheck = false; // 치환 문자가 없는 경우, 스팸 체크가 한 번만 수행되도록 제어 + boolean hasPerformedMsgType = false; // 치환 문자가 없는 경우, 스팸 체크가 한 번만 수행되도록 제어 + Boolean replaceYN = getReplaceYN(smsTxtTemp); + + String msgTypeResult = null; + + for (MjonMsgSendVO sendVO : mjonMsgSendListVO) { + + String smsTxt = smsTxtTemp; + // 치환 문자면 + if(replaceYN) { + + // 각 치환 구문을 확인하고 치환할 값이 없으면 오류 반환 + for (Map.Entry> entry : placeholders.entrySet()) { + String placeholder = entry.getKey(); + String value = entry.getValue().apply(sendVO); + if (smsTxtTemp.contains(placeholder)) { + if (StringUtils.isEmpty(value)) { + statusResponseSet(statusResponse, HttpStatus.BAD_REQUEST, "치환 문구중 " + placeholder + " 데이터가 없습니다."); + return false; + } + smsTxt = smsTxtTemp.replace(placeholder, value); } - }else { + } + } + + String smsSpamChkTxt = mjonMsgVO.getSmsTxt().replaceAll(String.valueOf((char) 13), ""); + // 스팸문자 체크 + // 치환문자가 아닐 경우 + if (!replaceYN && !hasPerformedSpamCheck) { + checkSpamAndSetStatus(mjonMsgVO, smsSpamChkTxt, resultSpamTxt); + hasPerformedSpamCheck = true; // 스팸 체크가 한 번만 수행되도록 설정 + // 치환 문자가 있는 경우에는 spamChkSize 카운트까지만 수행 + } else if (replaceYN && sampleCounter < spamChkSize && !"Y".equals(mjonMsgVO.getSpamStatus())) { + checkSpamAndSetStatus(mjonMsgVO, smsSpamChkTxt, resultSpamTxt); + sampleCounter++; + } + log.info(" ++ smsTxt:: [{}]", smsTxt); + sendVO.setSmsTxt(smsTxt); + + // 이미지 셋팅 + setImagePathsForMsgSendVO(mjonMsgVO, sendVO); + + + // msgType 셋팅 및 문자열 체크 + log.info(" + smsTxt :: [{}]", smsTxt); + if (!replaceYN && !hasPerformedMsgType) { + log.info(" 치환 X "); + // byte 체크와 msgType 구하기 + msgTypeResult = getMsgTypeWithByteValidation(sendVO, smsTxt); + if ("INVALID".equals(msgTypeResult)) { + statusResponseSet(statusResponse, HttpStatus.BAD_REQUEST, "문자 치환 후 전송 문자 길이를 초과하였습니다."); + return false; + } + hasPerformedMsgType = true; // 스팸 체크가 한 번만 수행되도록 설정 + }else if(replaceYN){ + log.info(" 치환 O "); + // byte 체크와 msgType 구하기 + msgTypeResult = getMsgTypeWithByteValidation(sendVO, smsTxt); + if ("INVALID".equals(msgTypeResult)) { statusResponseSet(statusResponse, HttpStatus.BAD_REQUEST, "문자 치환 후 전송 문자 길이를 초과하였습니다."); return false; } - - } catch (UnsupportedEncodingException e) { - statusResponseSet(statusResponse, HttpStatus.BAD_REQUEST, "문자 치환 중 오류가 발생하였습니다."); - e.printStackTrace(); - return false; } + + sendVO.setMsgType(msgTypeResult); + } - lists.setShortCnt(shortCnt); - lists.setLongCnt(longCnt); - lists.setImgCnt(imgCnt); - return true; } + private static void setImagePathsForMsgSendVO(MjonMsgVO mjonMsgVO, MjonMsgSendVO sendVO) { + int fileCount = Integer.parseInt(mjonMsgVO.getFileCnt()); + + switch (fileCount) { + case 3: + sendVO.setFilePath3(mjonMsgVO.getFileName3()); + case 2: + sendVO.setFilePath2(mjonMsgVO.getFileName2()); + case 1: + sendVO.setFilePath1(mjonMsgVO.getFileName1()); + break; + default: + // fileCount가 0이거나 설정할 파일이 없는 경우 + break; + } + sendVO.setFileCnt(mjonMsgVO.getFileCnt()); + } + + private static void checkSpamAndSetStatus(MjonMsgVO mjonMsgVO, String personalizedSmsTxt, List resultSpamTxt) throws Exception { + String resultParser = ComGetSpamStringParser.getSpamTextParse(personalizedSmsTxt).trim(); + int spmCnt = 0; + + for (String spmTxt : resultSpamTxt) { + String parserStr = ComGetSpamStringParser.getSpamTextParse(spmTxt).trim(); + if (resultParser.contains(parserStr)) { + spmCnt++; + } + } + + if (spmCnt > 0) { // 스팸 문자가 포함된 경우 + System.out.println("++++++++++++++ spam smsTxt ::: " + resultParser); + mjonMsgVO.setSpamStatus("Y"); + }else {mjonMsgVO.setSpamStatus("N");} + } + + private static Boolean getReplaceYN(String smsTxtTemplate) {// 여러 치환 구문이 포함된 정규식 패턴 + + Boolean replaceYN = false; + + Pattern pattern = Pattern.compile("\\[\\*이름\\*\\]|\\[\\*1\\*\\]|\\[\\*2\\*\\]|\\[\\*3\\*\\]|\\[\\*4\\*\\]"); + Matcher matcher = pattern.matcher(smsTxtTemplate); + + // 정규식 패턴에 해당하는 치환 구문이 존재하는지 확인 + if (matcher.find()) { + replaceYN = true; + } + return replaceYN; + } + + /** + * @methodName : getSpamChkSize + * @author : 이호영 + * @date : 2024.11.13 + * @description : 수신자 건수별로 스팸체크하는 갯수 설정 + * @param size + * @return + */ + private static int getSpamChkSize(int size) { + int chkSize = 1; // 기본 샘플 크기 + + // 수신자 수에 따른 샘플 크기 결정 + if (size > 100 && size <= 1000) { + chkSize = 10; + } else if (size > 1000) { + chkSize = 50; + } + + return chkSize; + } + /** * 특정 플레이스홀더를 리스트에서 가져온 값으로 치환합니다. * @@ -236,140 +357,6 @@ public final class MsgSendUtils { return smsTxt; } - private static void populateShortLists(ReplacementListsVO lists, String[] nameList, String[] phone, String[] rep1, - String[] rep2, String[] rep3, String[] rep4, String smsTxt, int i) { - // 이름 치환 - if (smsTxt.contains("[*이름*]")) { - if (nameList.length > i && StringUtil.isNotEmpty(nameList[i])) { - lists.getShortNameList()[i] = StringUtil.getString(nameList[i].replaceAll("§", ",")); - } else { - lists.getShortNameList()[i] = " "; - } - } else { - lists.getShortNameList()[i] = getSafeValue(nameList, i); - } - - lists.getShortPhone()[i] = getSafeValue(phone, i); - - // 문자 1 치환 - if (smsTxt.contains("[*1*]")) { - lists.getShortRep1()[i] = getReplacementValue(rep1, i, "[*1*]"); - } else { - lists.getShortRep1()[i] = getSafeValue(rep1, i); - } - - // 문자 2 치환 - if (smsTxt.contains("[*2*]")) { - lists.getShortRep2()[i] = getReplacementValue(rep2, i, "[*2*]"); - } else { - lists.getShortRep2()[i] = getSafeValue(rep2, i); - } - - // 문자 3 치환 - if (smsTxt.contains("[*3*]")) { - lists.getShortRep3()[i] = getReplacementValue(rep3, i, "[*3*]"); - } else { - lists.getShortRep3()[i] = getSafeValue(rep3, i); - } - - // 문자 4 치환 - if (smsTxt.contains("[*4*]")) { - lists.getShortRep4()[i] = getReplacementValue(rep4, i, "[*4*]"); - } else { - lists.getShortRep4()[i] = getSafeValue(rep4, i); - } - } - - // 장문 리스트에 데이터를 채우는 메서드 - private static void populateLongLists(ReplacementListsVO lists, String[] nameList, String[] phone, String[] rep1, String[] rep2, String[] rep3, String[] rep4, String smsTxt, int i) { - // 이름 치환 - if (smsTxt.contains("[*이름*]")) { - if (nameList.length > i && StringUtil.isNotEmpty(nameList[i])) { - lists.getLongNameList()[i] = StringUtil.getString(nameList[i].replaceAll("§", ",")); - } else { - lists.getLongNameList()[i] = " "; - } - } else { - lists.getLongNameList()[i] = getSafeValue(nameList, i); - } - - lists.getLongPhone()[i] = getSafeValue(phone, i); - - // 문자 1 치환 - if (smsTxt.contains("[*1*]")) { - lists.getLongRep1()[i] = getReplacementValue(rep1, i, "[*1*]"); - } else { - lists.getLongRep1()[i] = getSafeValue(rep1, i); - } - - // 문자 2 치환 - if (smsTxt.contains("[*2*]")) { - lists.getLongRep2()[i] = getReplacementValue(rep2, i, "[*2*]"); - } else { - lists.getLongRep2()[i] = getSafeValue(rep2, i); - } - - // 문자 3 치환 - if (smsTxt.contains("[*3*]")) { - lists.getLongRep3()[i] = getReplacementValue(rep3, i, "[*3*]"); - } else { - lists.getLongRep3()[i] = getSafeValue(rep3, i); - } - - // 문자 4 치환 - if (smsTxt.contains("[*4*]")) { - lists.getLongRep4()[i] = getReplacementValue(rep4, i, "[*4*]"); - } else { - lists.getLongRep4()[i] = getSafeValue(rep4, i); - } - } - - // 그림 문자 리스트에 데이터를 채우는 메서드 - private static void populateImgLists(ReplacementListsVO lists, String[] nameList, String[] phone, String[] rep1, String[] rep2, String[] rep3, String[] rep4, String smsTxt, int i) { - - // 이름 치환 - if (smsTxt.contains("[*이름*]")) { - if (nameList.length > i && StringUtil.isNotEmpty(nameList[i])) { - lists.getImgNameList()[i] = StringUtil.getString(nameList[i].replaceAll("§", ",")); - } else { - lists.getImgNameList()[i] = " "; - } - } else { - lists.getImgNameList()[i] = getSafeValue(nameList, i); - } - - lists.getImgPhone()[i] = getSafeValue(phone, i); - - // 문자 1 치환 - if (smsTxt.contains("[*1*]")) { - lists.getImgRep1()[i] = getReplacementValue(rep1, i, "[*1*]"); - } else { - lists.getImgRep1()[i] = getSafeValue(rep1, i); - } - - // 문자 2 치환 - if (smsTxt.contains("[*2*]")) { - lists.getImgRep2()[i] = getReplacementValue(rep2, i, "[*2*]"); - } else { - lists.getImgRep2()[i] = getSafeValue(rep2, i); - } - - // 문자 3 치환 - if (smsTxt.contains("[*3*]")) { - lists.getImgRep3()[i] = getReplacementValue(rep3, i, "[*3*]"); - } else { - lists.getImgRep3()[i] = getSafeValue(rep3, i); - } - - // 문자 4 치환 - if (smsTxt.contains("[*4*]")) { - lists.getImgRep4()[i] = getReplacementValue(rep4, i, "[*4*]"); - } else { - lists.getImgRep4()[i] = getSafeValue(rep4, i); - } - - } - // 배열 인덱스를 안전하게 접근하는 메서드 private static String getSafeValue(String[] array, int index) { return (array != null && array.length > index) ? array[index] : " "; @@ -412,54 +399,27 @@ public final class MsgSendUtils { * @date : 2024.09.25 * @description : 치환문자가 사용될 때 데이터가 올바른지 확인하는 메서드 * @param mjonMsgVO - * @param statusResponse + * @param list * @return boolean */ - public static boolean validateReplacementData(MjonMsgVO mjonMsgVO, StatusResponse statusResponse) { - String[] nameList = mjonMsgVO.getNameList(); - String[] phone = mjonMsgVO.getCallToList(); - String[] rep1 = mjonMsgVO.getRep1List(); - String[] rep2 = mjonMsgVO.getRep2List(); - String[] rep3 = mjonMsgVO.getRep3List(); - String[] rep4 = mjonMsgVO.getRep4List(); - - // 치환 문자 리스트가 모두 비어있는지 확인 - if (isEmpty(nameList) - && isEmpty(rep1) - && isEmpty(rep2) - && isEmpty(rep3) - && isEmpty(rep4)) { - statusResponseSet(statusResponse, HttpStatus.BAD_REQUEST, "특정문구 일괄변환 치환문자 데이터가 없습니다."); - return false; - } - - // 치환 문자 필드 개수와 전화번호 개수가 일치하는지 확인 - boolean isRepCountOk = true; - - if (mjonMsgVO.getSmsTxt().contains("[*이름*]") && nameList.length != phone.length) { - isRepCountOk = false; - } - if (mjonMsgVO.getSmsTxt().contains("[*1*]") && rep1.length != phone.length) { - isRepCountOk = false; - } - if (mjonMsgVO.getSmsTxt().contains("[*2*]") && rep2.length != phone.length) { - isRepCountOk = false; - } - if (mjonMsgVO.getSmsTxt().contains("[*3*]") && rep3.length != phone.length) { - isRepCountOk = false; - } - if (mjonMsgVO.getSmsTxt().contains("[*4*]") && rep4.length != phone.length) { - isRepCountOk = false; - } - - // 필드 개수가 일치하지 않는 경우 에러 메시지 반환 - if (!isRepCountOk) { - statusResponseSet(statusResponse, HttpStatus.BAD_REQUEST, "특정문구 일괄변환 치환문자 데이터가 일치하지 않습니다."); - return false; - } - - return true; // 모든 유효성 검사를 통과한 경우 - } + /* + * public static boolean validateReplacementData(MjonMsgVO mjonMsgVO, + * List list) { // 치환 구문과 필드 getter 매핑 Map> placeholders = new HashMap<>(); + * placeholders.put("\\[\\*이름\\*\\]", MjonMsgSendVO::getName); + * placeholders.put("\\[\\*1\\*\\]", MjonMsgSendVO::getRep1); + * placeholders.put("\\[\\*2\\*\\]", MjonMsgSendVO::getRep2); + * placeholders.put("\\[\\*3\\*\\]", MjonMsgSendVO::getRep3); + * placeholders.put("\\[\\*4\\*\\]", MjonMsgSendVO::getRep4); + * + * // smsTxt 에서 필요한 치환 구문이 포함되어 있는지 확인 String smsTxt = mjonMsgVO.getSmsTxt(); + * for (Map.Entry> entry : + * placeholders.entrySet()) { if + * (Pattern.compile(entry.getKey()).matcher(smsTxt).find()) { // 해당 치환 구문이 존재할 + * 경우 모든 수신자에서 필드 값 확인 for (MjonMsgSendVO recipient : list) { if + * (StringUtils.isEmpty(entry.getValue().apply(recipient))) { return false; // + * 데이터가 없는 경우 } } } } // 모든 치환 구문이 유효한 데이터를 가지고 있으면 true 반환 return true; } + */ // 배열이 비어있는지 확인하는 메서드 public static boolean isEmpty(String[] array) { diff --git a/src/main/java/itn/let/kakao/admin/kakaoAt/service/MjonKakaoATVO.java b/src/main/java/itn/let/kakao/admin/kakaoAt/service/MjonKakaoATVO.java index ba67b4fb..0054fb9a 100644 --- a/src/main/java/itn/let/kakao/admin/kakaoAt/service/MjonKakaoATVO.java +++ b/src/main/java/itn/let/kakao/admin/kakaoAt/service/MjonKakaoATVO.java @@ -149,6 +149,7 @@ public class MjonKakaoATVO extends ComDefaultVO{ private String bizKakaoResendOrgnlTxt; /* 대체 문자( 치환X ) */ private String bizKakaoResendYn; /* 대체 문자 사용 여부*/ private String bizKakaoResendType; /* 대체 문자 길이 => MMS / LMS / SMS */ + private String bizKakaoJsonFile; //카카오 친구톡 Json 파일 경로 public String getMsgDiv() { @@ -1266,5 +1267,11 @@ public class MjonKakaoATVO extends ComDefaultVO{ public void setBizKakaoResendType(String bizKakaoResendType) { this.bizKakaoResendType = bizKakaoResendType; } + public String getBizKakaoJsonFile() { + return bizKakaoJsonFile; + } + public void setBizKakaoJsonFile(String bizKakaoJsonFile) { + this.bizKakaoJsonFile = bizKakaoJsonFile; + } } diff --git a/src/main/java/itn/let/kakao/admin/kakaoAt/web/MjonKakaoATController.java b/src/main/java/itn/let/kakao/admin/kakaoAt/web/MjonKakaoATController.java index fc5bfecd..900b889f 100644 --- a/src/main/java/itn/let/kakao/admin/kakaoAt/web/MjonKakaoATController.java +++ b/src/main/java/itn/let/kakao/admin/kakaoAt/web/MjonKakaoATController.java @@ -851,6 +851,7 @@ public class MjonKakaoATController { kakaoVO.setPage(Integer.toString(channelIDVO.getPageIndex())); kakaoVO.setKeyword(channelIDVO.getSearchKeyword()); kakaoVO.setUserId(channelIDVO.getUserId()); + kakaoVO.setYellowId(channelIDVO.getYellowId()); String templateStatus = channelIDVO.getTemplateStatus(); String keyword = channelIDVO.getSearchKeyword(); diff --git a/src/main/java/itn/let/kakao/admin/kakaoFt/web/MjonKakaoFTController.java b/src/main/java/itn/let/kakao/admin/kakaoFt/web/MjonKakaoFTController.java index 4ffa631b..e2498ee4 100644 --- a/src/main/java/itn/let/kakao/admin/kakaoFt/web/MjonKakaoFTController.java +++ b/src/main/java/itn/let/kakao/admin/kakaoFt/web/MjonKakaoFTController.java @@ -13,14 +13,21 @@ import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.HandlerMapping; +import egovframework.rte.fdl.security.userdetails.util.EgovUserDetailsHelper; import egovframework.rte.ptl.mvc.tags.ui.pagination.PaginationInfo; +import itn.com.cmm.LoginVO; import itn.com.cmm.service.FileVO; import itn.com.cmm.util.StringUtil; +import itn.let.kakao.admin.kakaoAt.service.ChannelIDVO; import itn.let.kakao.admin.kakaoFt.service.MjonKakaoFTService; import itn.let.kakao.admin.kakaoFt.service.MjonKakaoFTVO; +import itn.let.kakao.kakaoComm.KakaoVO; +import itn.let.kakao.kakaoComm.kakaoApi.service.KakaoApiService; +import itn.let.kakao.user.kakaoFt.service.KakaoFriendsTalkTemplateService; import itn.let.mjo.msg.service.MjonMsgResultCodeVO; import itn.let.mjo.msg.service.MjonMsgService; import itn.let.mjo.reservmsg.service.MjonReservMsgService; +import itn.let.utl.fcc.service.EgovStringUtil; /** * @@ -52,6 +59,12 @@ public class MjonKakaoFTController { @Resource(name = "MjonReservMsgService") private MjonReservMsgService mjonReservMsgService; + @Resource(name = "kakaoFriendsTalkTemplateService") + private KakaoFriendsTalkTemplateService kakaoFtTemplateService; + + @Resource(name = "kakaoApiService") + private KakaoApiService kakaoApiService; + /* @Resource(name = "EgovCmmUseService") private EgovCmmUseService cmmUseService; @@ -501,6 +514,125 @@ public class MjonKakaoFTController { return "/uss/ion/kakaoft/ReserveKakaoFTModify"; } + + /** + * 채널 아이디별 등록 친구톡 템플릿 목록 팝업화면 관리자페이지 + * @param ChannelIDVO + * @param request + * @param model + * @return + * @throws Exception + */ + @RequestMapping("/uss/ion/kakaoft/KakaoFTChannelIDTemplateListPopupAjax.do") + public String KakaoFTChannelIDTemplateListPopupAjax(@ModelAttribute("searchVO") ChannelIDVO channelIDVO, + HttpServletRequest request , + ModelMap model) throws Exception { + + + try { + + LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null; + String id = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId()); + if(id == "") { + return "redirect:/uat/uia/EgovLoginUsr.do"; + } + + KakaoVO kakaoVO = new KakaoVO(); + + //페이징 처리 + PaginationInfo paginationInfo = new PaginationInfo(); + paginationInfo.setCurrentPageNo(channelIDVO.getPageIndex()); + paginationInfo.setRecordCountPerPage(9); + paginationInfo.setPageSize(channelIDVO.getPageSize()); + + kakaoVO.setFirstIndex(paginationInfo.getFirstRecordIndex()); + kakaoVO.setLastIndex(paginationInfo.getLastRecordIndex()); + kakaoVO.setRecordCountPerPage(9); + + kakaoVO.setSenderKey(channelIDVO.getSenderKey()); + kakaoVO.setPage(Integer.toString(channelIDVO.getPageIndex())); + kakaoVO.setSearchKeyword(channelIDVO.getSearchKeyword()); + kakaoVO.setUserId(channelIDVO.getUserId()); + + String templateStatus = channelIDVO.getTemplateStatus(); + String keyword = channelIDVO.getSearchKeyword(); + + /*if(keyword != null && keyword != "") { + kakaoVO.setSearchKeyword(keyword); + }else { + kakaoVO.setSearchKeyword(""); + }*/ + + if("".equals(kakaoVO.getSearchSortCnd())){ //최초조회시 최신것 조회List + kakaoVO.setSearchSortCnd("friendId"); + kakaoVO.setSearchSortOrd("desc"); + } + + //채널 아이디 정보 + String yellowId = kakaoVO.getYellowId(); + + kakaoVO.setCount("9"); //페이지 별 템플릿 개수 9개로 + List kakaoTemplateInfoList = new ArrayList(); + kakaoTemplateInfoList = kakaoFtTemplateService.selectKakaoFriendsTemplateList(kakaoVO); + + model.addAttribute("kakaoVO", kakaoVO); + model.addAttribute("paginationInfo", paginationInfo); + model.addAttribute("kakaoTemplateInfoList", kakaoTemplateInfoList); //친구톡 템플릿 리스트 + paginationInfo.setTotalRecordCount(kakaoTemplateInfoList.size() > 0 ? ((KakaoVO)kakaoTemplateInfoList.get(0)).getTotCnt() : 0); + + } catch (Exception e) { + System.out.println("KakaoFTChannelIDTemplateListPopupAjax Contrller Error ::: " + e); + } + + return "uss/ion/kakaoft/popup/KakaoFTChannelIDTemplateListPop"; + } + + /** + * 채널 아이디별 등록 친구톡 템플릿 상세내용 팝업화면 관리자페이지 + * @param ChannelIDVO + * @param request + * @param model + * @return + * @throws Exception + */ + @RequestMapping("/uss/ion/kakaoft/KakaoFTChannelIDTemplateDetailPopupAjax.do") + public String KakaoFTChannelIDTemplateDetailPopupAjax(@ModelAttribute("searchVO") ChannelIDVO channelIDVO, + HttpServletRequest request , + ModelMap model) throws Exception { + + + try { + + LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null; + String id = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId()); + if(id == "") { + return "redirect:/uat/uia/EgovLoginUsr.do"; + } + + KakaoVO kakaoVO = new KakaoVO(); + kakaoVO.setSenderKey(channelIDVO.getSenderKey()); + kakaoVO.setFriendId(channelIDVO.getTemplateCode()); + kakaoVO.setUserId(channelIDVO.getUserId()); + + String senderKey = kakaoVO.getSenderKey(); + model.addAttribute("senderKey", senderKey); + + //친구톡 템플릿 조회하기 + KakaoVO resultTemplateVO = kakaoFtTemplateService.selectKakaoFriendsTemplateDetail(kakaoVO); + model.addAttribute("resultTemplateVO", resultTemplateVO); + + // 사용자 아이디를 이용한 발신프로필 조회 + kakaoVO.setUserId(channelIDVO.getUserId()); + List selectKakaoProfileList = kakaoApiService.selectKakaoProfileList(kakaoVO); + model.addAttribute("kakaoProfileList", selectKakaoProfileList); + + } catch (Exception e) { + System.out.println("KakaoFTChannelIDTemplateDetailPopupAjax Contrller Error ::: " + e); + } + + return "uss/ion/kakaoft/popup/KakaoFTChannelIDTemplateDetailPop"; + } + /** * 카톡 전송사 발송 결과 코드 리스트 * @param MjonMsgResultCodeVO diff --git a/src/main/java/itn/let/kakao/kakaoComm/KakaoSendUtil.java b/src/main/java/itn/let/kakao/kakaoComm/KakaoSendUtil.java index 2ee66965..d96b4fb8 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; @@ -149,6 +150,134 @@ public class KakaoSendUtil { return kakaoVO; } + + /** + * @Method Name : kakaoFTSendPrice + * @작성일 : 2024. 1. 17. + * @작성자 : WYH + * @Method 설명 : 카카오 친구톡 전송 가격 설정 + */ + public KakaoVO kakaoFTSendPrice(KakaoVO kakaoVO) throws Exception { + + //사용자 현재 보유 금액 불러오기(문자 발송 금액 차감 이전 금액) + String befCash = kakaoVO.getBefCash(); + + //VO에서 현재 보유금액이 없으면 디비에서 조회해서 불러옴 + if("".equals(befCash) || befCash == null) { + + } + MjonMsgVO mjonMsgVO = new MjonMsgVO(); + mjonMsgVO.setUserId(kakaoVO.getUserId()); + String userMoney = mjonMsgDataService.selectBeforeCashData(mjonMsgVO); + String userPoint = mjonMsgDataService.selectBeforePointData(mjonMsgVO); + + //1.시스템 기본 단가 정보 불러오기 + JoinSettingVO sysJoinSetVO = mjonMsgDataService.selectJoinSettingInfo(); + + //2.사용자 개인 단가 정보 불러오기 + MberManageVO mberManageVO = mjonMsgDataService.selectMberManageInfo(kakaoVO.getUserId()); + Float kakaoFtPrice = mberManageVO.getKakaoFtPrice(); + + /** 대체문자 여부 체크(있으면 대체문자 가격으로 없으면 카카오톡 가격으로) */ + //대체문자 발송 여부 확인 + if(kakaoVO.getSubMsgSendYn().equals("Y")) { + + + String charset = "euc-kr"; //문자 바이트 계산에 필요한 캐릭터 셋 : 한글 2Byte로 계산 + int callToCnt = kakaoVO.getCallToList().length; + String sendType = ""; + + for(int count =0; count < callToCnt; count++) { + String tempSubMagTxt = kakaoVO.getSubMsgTxt().replace("\r\n", "\n"); + if(kakaoVO.getSubMsgTxtReplYn().equals("Y")) { + tempSubMagTxt = kakaoFTSubMagTxtRepl(tempSubMagTxt, kakaoVO, count); + } + int bytes = tempSubMagTxt.getBytes(charset).length; + + if(bytes < 2000) { + if(bytes > 90) { + sendType = "MMS"; + break; + }else { + sendType = "SMS"; + } + }else { + kakaoVO.setResultCode("2000"); + return kakaoVO; + } + } + + if(sendType.equals("MMS")) { + //협의 단가가 없으면 시스템 단가로 지정 + if(mberManageVO.getLongPrice() < 1) { + kakaoFtPrice = sysJoinSetVO.getLongPrice(); + + kakaoVO.setSmsPrice(sysJoinSetVO.getShortPrice()); + kakaoVO.setMmsPrice(sysJoinSetVO.getLongPrice()); + kakaoVO.setKakaoFtPrice(sysJoinSetVO.getKakaoFtPrice()); + }else { + kakaoFtPrice = mberManageVO.getLongPrice(); + + kakaoVO.setSmsPrice(mberManageVO.getShortPrice()); + kakaoVO.setMmsPrice(mberManageVO.getLongPrice()); + + if(mberManageVO.getKakaoFtPrice() < 1) { + kakaoVO.setKakaoFtPrice(sysJoinSetVO.getKakaoFtPrice()); + }else { + kakaoVO.setKakaoFtPrice(mberManageVO.getKakaoFtPrice()); + } + } + }else { + //협의 단가가 없으면 시스템 단가로 지정 + if(mberManageVO.getShortPrice() < 1) { + kakaoFtPrice = sysJoinSetVO.getShortPrice(); + + kakaoVO.setSmsPrice(sysJoinSetVO.getShortPrice()); + kakaoVO.setMmsPrice(sysJoinSetVO.getLongPrice()); + kakaoVO.setKakaoFtPrice(sysJoinSetVO.getKakaoFtPrice()); + }else { + kakaoFtPrice = mberManageVO.getShortPrice(); + + kakaoVO.setSmsPrice(mberManageVO.getShortPrice()); + kakaoVO.setMmsPrice(mberManageVO.getLongPrice()); + + if(mberManageVO.getKakaoFtPrice() < 1) { + kakaoVO.setKakaoFtPrice(sysJoinSetVO.getKakaoFtPrice()); + }else { + kakaoVO.setKakaoFtPrice(mberManageVO.getKakaoFtPrice()); + } + } + } + }else { + + if(kakaoFtPrice < 1) { //협의 단가가 없으면 시스템 단가로 지정 + kakaoFtPrice = sysJoinSetVO.getKakaoFtPrice(); + + kakaoVO.setSmsPrice(sysJoinSetVO.getShortPrice()); + kakaoVO.setMmsPrice(sysJoinSetVO.getLongPrice()); + kakaoVO.setKakaoFtPrice(sysJoinSetVO.getKakaoFtPrice()); + }else { + kakaoVO.setSmsPrice(mberManageVO.getShortPrice()); + kakaoVO.setMmsPrice(mberManageVO.getLongPrice()); + kakaoVO.setKakaoFtPrice(mberManageVO.getKakaoFtPrice()); + } + } + + /** 전송인원 확인*/ + int totCallCnt = kakaoVO.getCallToList().length; + Float kakaoTotPrice = totCallCnt * kakaoFtPrice; // 총결제 금액 = 총 전송수량 * 카카오 친구톡 단가 + String totPrice = kakaoTotPrice.toString(); + System.out.println("@@@@@@@ : "+kakaoTotPrice +" = "+totCallCnt+" * "+kakaoFtPrice); + + kakaoVO.setEachPrice(kakaoFtPrice.toString()); + kakaoVO.setBefCash(userMoney); // 고객 충전금액 + kakaoVO.setBefPoint(userPoint); // 고객 충전 포인트 + kakaoVO.setTotPrice(totPrice); // 총 카카오 전송 금액 + + return kakaoVO; + } + + /** * @methodName : selectSendPriceOfKakaoAtAndSmsAndMms * @author : 이호영 @@ -171,6 +300,10 @@ public class KakaoSendUtil { if(mberManageVO.getKakaoAtPrice() == 0.0f) mberManageVO.setKakaoAtPrice(sysJoinSetVO.getKakaoAtPrice()); + //카카오 친구톡 개인 단가가 없는 경우 시스템 단가로 + if(mberManageVO.getKakaoFtPrice() == 0.0f) + mberManageVO.setKakaoFtPrice(sysJoinSetVO.getKakaoFtPrice()); + // SMS 인경우 // 사용자 개인 단가가 없으면 시스템 단가로 @@ -284,6 +417,84 @@ public class KakaoSendUtil { return kakaoVO; } + + /** + * @Method Name : kakaoFTSendMsg + * @작성일 : 2024. 1. 17. + * @작성자 : 우영두 + * @Method 설명 : 카카오 친톡 전송 메세지 설정 + */ + public KakaoVO kakaoFTSendMsg(KakaoVO kakaoVO) throws Exception { + List kakaoSendList = new ArrayList(); + //전체 받는사람 수량만큼 반복 확인 + int callToCnt = kakaoVO.getCallToList().length; + try { + for(int count =0; count < callToCnt; count++) { + + KakaoVO setSendMsgVO = new KakaoVO(); + + setSendMsgVO.setDestPhone(kakaoVO.getCallToList()[count]); // 수신 번호 + // 카카오 전송내용 설정 + // 변환문자 포함(Y), 미포함(N) + if(kakaoVO.getTxtReplYn().equals("Y")) { + + String templateContent = kakaoFTSubMagTxtRepl(kakaoVO.getTemplateContent(), kakaoVO, count); + setSendMsgVO.setTemplateContent(templateContent); + + }else { + + // 템플릿 내용 설정 + setSendMsgVO.setTemplateContent(kakaoVO.getTemplateContent()); + } + + //대체문자 포함(Y), 미포함(N) + if(kakaoVO.getSubMsgSendYn().equals("Y")) { + + String charset = "euc-kr"; //문자 바이트 계산에 필요한 캐릭터 셋 : 한글 2Byte로 계산 + + String tempSubMagTxt = kakaoVO.getSubMsgTxt().replace("\r\n", "\n"); + kakaoVO.setKakaoSubMagOrgnlTxt(tempSubMagTxt); + if(kakaoVO.getSubMsgTxtReplYn().equals("Y")) { + tempSubMagTxt = kakaoFTSubMagTxtRepl(tempSubMagTxt, kakaoVO, count); + } + + setSendMsgVO.setSubMsgTxt(tempSubMagTxt); + + int FrBytes = tempSubMagTxt.getBytes(charset).length; + + //메세지 길이가 90Byte가 초과시 MMS + if(FrBytes > 90) { + setSendMsgVO.setSubMsgType("MMS"); + }else {// 아니면 SMS + setSendMsgVO.setSubMsgType("SMS"); + } + } + + if(kakaoVO.getBizJsonYn().equals("Y")) { + kakaoVO.setDestPhone(kakaoVO.getCallToList()[count]); // 수신 번호 + + String[] varValInfo = null; + if( kakaoVO.getVarValList().size() != 0) { + varValInfo = kakaoVO.getVarValList().get(count); + } + String jsonFileName = kakaoApiJsonSave.kakaoApiFTJsonSave(kakaoVO); +// String jsonFileName = kakaoApiJsonSave.kakaoApiJsonSave(kakaoVO, kakaoVO.getVarValList().get(count)); + setSendMsgVO.setBizJsonName(jsonFileName); //json 파일명 + } + + kakaoSendList.add(setSendMsgVO); + } + kakaoVO.setKakaoSendList(kakaoSendList); + + } catch (Exception e) { + System.out.println(e.toString()); + e.printStackTrace(); + } + + return kakaoVO; + } + + public String kakaoSendMsgTest(KakaoVO kakaoVO) throws Exception { String templateContent = ""; try { @@ -339,4 +550,159 @@ public class KakaoSendUtil { } return tempSubMagTxt; } + + public String kakaoFTSubMagTxtRepl(String tempSubMagTxt, KakaoVO kakaoVO, int count) throws Exception{ + + List varValList = kakaoVO.getVarValList(); + + tempSubMagTxt = getKakaoFTCntReplace(varValList.get(count)[0], tempSubMagTxt); + + 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); + } + + } + + } + + return tmpContents; + } + + /* + * 카카오 친구톡 치환문자 내용 스팸 필터 + * 치환변수 내용 및 템플릿 내용, 스팸필터 단어 리스트를 전달하면 스팸 문구 포함 문구 리턴 + * 없으면 공백을 리턴 + * + * */ + public String getKakaoFTCntRepToSpamFilter(List varValList, List resultSpamTxt, String contents) throws Exception { + String spmFilterTxt = ""; + for(int i=0; i < varValList.size(); i++) { + + String tmpContents = getKakaoFTCntReplace(varValList.get(i)[0], contents); + + //입력 문장에 대해서 우회 문장 또는 특수 기호 입력 제거 등 문장 재구성 처리, 한글 자모음 분리 및 재조함도 함께 처리함. + String resultParser = ComGetSpamStringParser.getSpamTextParse(tmpContents).trim(); + //List jasoList = HangulParser.disassemble(resultParser); + //String assembleStr = HangulParser.assemble(jasoList); + + //데이터베이스에 등록된 스팸문구와 일치하는 단어/문구가 있는지 체크함. + 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/kakaoComm/KakaoVO.java b/src/main/java/itn/let/kakao/kakaoComm/KakaoVO.java index c2a03178..e6dd28a3 100644 --- a/src/main/java/itn/let/kakao/kakaoComm/KakaoVO.java +++ b/src/main/java/itn/let/kakao/kakaoComm/KakaoVO.java @@ -238,6 +238,7 @@ public class KakaoVO extends MjonMsgVO{ private String imageTitle; //친구톡 이미지 제목 private String imageLink; //친구톡 이미지 클릭시 링크 주소 private String jsonText; //json 파일 생성시 내용 저장(혹시 몰라서 내용도 별도로 저장함) + private String imageFileName; //친구톡 이미지 원본 파일명 private String successDay; private String successMonth; @@ -1110,6 +1111,14 @@ public class KakaoVO extends MjonMsgVO{ this.jsonText = jsonText; } + public String getImageFileName() { + return imageFileName; + } + + public void setImageFileName(String imageFileName) { + this.imageFileName = imageFileName; + } + public String getSbscrbDe() { return sbscrbDe; } diff --git a/src/main/java/itn/let/kakao/kakaoComm/kakaoApi/KakaoApiJsonSave.java b/src/main/java/itn/let/kakao/kakaoComm/kakaoApi/KakaoApiJsonSave.java index 53b6cb92..2312ac1a 100644 --- a/src/main/java/itn/let/kakao/kakaoComm/kakaoApi/KakaoApiJsonSave.java +++ b/src/main/java/itn/let/kakao/kakaoComm/kakaoApi/KakaoApiJsonSave.java @@ -3,18 +3,14 @@ package itn.let.kakao.kakaoComm.kakaoApi; import java.io.BufferedWriter; import java.io.File; import java.io.FileOutputStream; -import java.io.FileWriter; import java.io.IOException; import java.io.OutputStreamWriter; import java.text.SimpleDateFormat; -import java.time.LocalDateTime; -import java.time.format.DateTimeFormatter; import java.util.Date; import java.util.List; -import org.json.simple.JSONObject; import org.json.simple.JSONArray; - +import org.json.simple.JSONObject; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; @@ -159,4 +155,111 @@ public class KakaoApiJsonSave { } return jsonFileName; } + + /* + * 친구톡 발송시 이미지, 버튼 추가에 따른 Json 파일 생성 + * 2024.01.17 + * 우영두 + * 파일은 하나만 생성해서 동일하게 사용함. + * + * */ + @SuppressWarnings("unchecked") + public String kakaoApiFTJsonSave(KakaoVO kakaoVO) { + // json파일 저장 + + Date nowDate = new Date(); + SimpleDateFormat todayFrom = new SimpleDateFormat("yyyyMMdd"); + SimpleDateFormat timeFrom = new SimpleDateFormat("HHmmss"); + String jsonFileName = mjonBizJsonDir+"/"+kakaoVO.getUserId()+"/"+todayFrom.format(nowDate)+"/"+kakaoVO.getSendType(); // 아이디/날짜/타입 + + String fileName = timeFrom.format(nowDate)+"_"+kakaoVO.getMsgGroupId()+".json"; + + try { + + File userIdFile = new File(jsonFileName); + if(!userIdFile.exists()) { + userIdFile.mkdirs(); // 없으면 하위 디렉토리 까지 생성 + jsonFileName = jsonFileName +"/"+fileName; + }else { + + jsonFileName = jsonFileName +"/"+fileName; + System.out.println("jsonFileName : "+jsonFileName); + File file1 = new File(jsonFileName); + if (file1.isFile()) { + return jsonFileName; + } + } + + //KakaoReturnVO templateDetail = kakaoApiTemplate.selectKakaoApiTemplateDetail(kakaoVO); + + // 버튼리스트 JSON 생성 + JSONArray buttonList = new JSONArray(); + for(KakaoButtonVO buttonInfoVO : kakaoVO.getButtonVOList()) { + JSONObject buttonInfo = new JSONObject(); + + buttonInfo.put("name", buttonInfoVO.getName()); + buttonInfo.put("type", buttonInfoVO.getLinkType()); + + if(buttonInfoVO.getLinkType().equals("WL")) { + buttonInfo.put("url_mobile", buttonInfoVO.getLinkMo()); + buttonInfo.put("url_pc", buttonInfoVO.getLinkPc()); + }else if(buttonInfoVO.getLinkType().equals("AL")) { + buttonInfo.put("scheme_ios", buttonInfoVO.getLinkIos()); + buttonInfo.put("scheme_android", buttonInfoVO.getLinkAnd()); + }else if(buttonInfoVO.getLinkType().equals("BC")) { + // 상담톡 진행시 등록해야함 + }else if(buttonInfoVO.getLinkType().equals("BT")) { + // 봇 전환 시 전달 + } + buttonList.add(buttonInfo); + } + + // 강조유형 JSON 생성 + JSONObject templateImageInfo = new JSONObject(); + JSONObject templateImageExtInfo = new JSONObject(); + String imageType = kakaoVO.getImageType(); + + if(!imageType.equals("")) { + templateImageInfo.put("img_url", kakaoVO.getTemplateImageUrl()); + templateImageInfo.put("img_link", kakaoVO.getImgLink()); + } + + if(imageType.equals("W")) { + templateImageExtInfo.put("wide", "Y"); + } + + + JSONObject jo = new JSONObject(); + + if(buttonList.size() != 0) { + jo.put("button", buttonList); + } + + if(templateImageInfo.size() != 0) { + jo.put("image", templateImageInfo); + } + + if(templateImageExtInfo.size() != 0) { + jo.put("extra", templateImageExtInfo); + } + + // 입력 json 데이터를 파일로 변경 + String jsonStr = jo.toString(); + System.out.println("jsonFileName : "+jsonFileName); + + File outPut = new File(jsonFileName); + outPut.createNewFile(); + + BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outPut), "utf-8")); + bw.write(jsonStr); + bw.close(); + + } catch (IOException e) { + System.out.println("json 생성 실패"); + e.printStackTrace(); + } + return jsonFileName; + } + + } diff --git a/src/main/java/itn/let/kakao/user/kakaoAt/service/KakaoAlimTalkService.java b/src/main/java/itn/let/kakao/user/kakaoAt/service/KakaoAlimTalkService.java index eb69d483..c19695ea 100644 --- a/src/main/java/itn/let/kakao/user/kakaoAt/service/KakaoAlimTalkService.java +++ b/src/main/java/itn/let/kakao/user/kakaoAt/service/KakaoAlimTalkService.java @@ -15,8 +15,14 @@ public interface KakaoAlimTalkService { //카카오 알림톡 발신 public MjonMsgReturnVO insertKakaoAtSandAjax(KakaoVO kakaoVO) throws Exception; + + //카카오 친구톡 발신 + public MjonMsgReturnVO insertKakaoFtSendAjax(KakaoVO kakaoVO) throws Exception; //카카오 알림톡 전송 실패 환불리스트 조회 public void selectKakaoAtSentRefundList() throws Exception; + //카카오 친구톡 전송 실패 환불리스트 조회 + public void selectKakaoFtSentRefundList() throws Exception; + } diff --git a/src/main/java/itn/let/kakao/user/kakaoAt/service/impl/KakaoAlimTalkDAO.java b/src/main/java/itn/let/kakao/user/kakaoAt/service/impl/KakaoAlimTalkDAO.java index ed896167..6a661ac3 100644 --- a/src/main/java/itn/let/kakao/user/kakaoAt/service/impl/KakaoAlimTalkDAO.java +++ b/src/main/java/itn/let/kakao/user/kakaoAt/service/impl/KakaoAlimTalkDAO.java @@ -7,7 +7,6 @@ import org.springframework.stereotype.Repository; import egovframework.rte.psl.dataaccess.EgovAbstractDAO; import itn.let.kakao.kakaoComm.KakaoVO; -import itn.let.mjo.msg.service.MjonMsgVO; @Repository("kakaoAlimTalkDAO") public class KakaoAlimTalkDAO extends EgovAbstractDAO { @@ -62,6 +61,11 @@ public class KakaoAlimTalkDAO extends EgovAbstractDAO { return (List) list("kakaoAlimTalkDAO.selectKakaoAtSentRefundList"); } + @SuppressWarnings("unchecked") + public List selectKakaoFtSentRefundList() throws Exception{ + return (List) list("kakaoAlimTalkDAO.selectKakaoFtSentRefundList"); + } + public KakaoVO selectKakaoAtUmid(KakaoVO kakaoVO) throws Exception{ return (KakaoVO) select("kakaoAlimTalkDAO.selectKakaoAtUmid", kakaoVO); } @@ -77,4 +81,17 @@ public class KakaoAlimTalkDAO extends EgovAbstractDAO { public void updateKakaoAtNotSend(KakaoVO kakaoVO) { select("kakaoAlimTalkDAO.updateKakaoAtNotSend", kakaoVO); } + + + public void updateKakaoFtSend(KakaoVO kakaoVO) { + select("kakaoAlimTalkDAO.updateKakaoFtSend", kakaoVO); + } + + public void updateKakaoFtSubMsgSend(KakaoVO kakaoVO) { + select("kakaoAlimTalkDAO.updateKakaoFtSubMsgSend", kakaoVO); + } + + public void updateKakaoFtNotSend(KakaoVO kakaoVO) { + select("kakaoAlimTalkDAO.updateKakaoFtNotSend", kakaoVO); + } } diff --git a/src/main/java/itn/let/kakao/user/kakaoAt/service/impl/KakaoAlimTalkServiceImpl.java b/src/main/java/itn/let/kakao/user/kakaoAt/service/impl/KakaoAlimTalkServiceImpl.java index 60d01ef7..61f0cd6a 100644 --- a/src/main/java/itn/let/kakao/user/kakaoAt/service/impl/KakaoAlimTalkServiceImpl.java +++ b/src/main/java/itn/let/kakao/user/kakaoAt/service/impl/KakaoAlimTalkServiceImpl.java @@ -409,7 +409,343 @@ public class KakaoAlimTalkServiceImpl extends EgovAbstractServiceImpl implements } return returnVO; } + + + + //카카오 친구톡 발신 + @Override + public MjonMsgReturnVO insertKakaoFtSendAjax(KakaoVO kakaoVO) throws Exception { + + MjonMsgReturnVO returnVO = new MjonMsgReturnVO(); + try { + String agentCode = "04"; // 다우기술 agent 코드 고정 + String msgType = "9"; // 카카오 알림톡 전송 코드 : 8번 + + int totCnt = 1; // 문자 리스트 추가 수량 + int resultCnt = 0; // 최종전송 수량 + int callToCnt = kakaoVO.getCallToList().length; // 전체 받는사람 건수 + + //Controller에서 전달 받은 분할 시간 정보 리스트 + List dividDayList = kakaoVO.getDividDay(); + //String sendTime = kakaoVO.getReqDate(); + String[] phoneList = kakaoVO.getCallToList(); //받는사람 연락처 리스트 + + //카카오 알림톡 전송 리스트 + List kakaoFtSendList = new ArrayList(); + + //야간스미싱 알림여부 정보 불러오기 + JoinSettingVO joinSettingVO = siteManagerDAO.selectAdminNotiDetail(); + String holiSmishingNoti = joinSettingVO.getHoliSmishingNoti(); + + //스팸,스미싱이어도 딜레이없이 문자 전송을 처리할지 선택 상태값 변수 + boolean spamSmishingPassStatus = false; //야간스미싱 알림여부가 활성화인 경우 false, 비활성화인경우 true 값을 가지도록 한다. + + //야간스미싱알리 여부가 비활성화 인경우 무조건 문자를 즉시 보내도록 한다. + //현재는 평일, 주말, 휴일 상관없이 N 이면 30분 딜레이 없이 발송 처리하도록 함. + if(holiSmishingNoti.equals("Y")) { + + MsgAlarmSetVO msgAlarmSetVO = new MsgAlarmSetVO(); + + msgAlarmSetVO.setUseYn("Y"); + msgAlarmSetVO.setFirstIndex(0); + + List resultAlarmList = msgHolidayDAO.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 = msgHolidayDAO.selectMsgHolidayList(msgHolidayVO); + + MjonHolidayApi mjonHolidayApi = new MjonHolidayApi(); + + boolean smishingAlarmPassSts = mjonHolidayApi.getHolidaySmishingPassStatus(resultAlarmList, resultHolidayList); + + spamSmishingPassStatus = smishingAlarmPassSts; + }else { + + spamSmishingPassStatus = true; + + } + + String atSmishingYn = kakaoVO.getAtSmishingYn(); + + if(spamSmishingPassStatus) { + atSmishingYn = "N"; + } + +/** 카카오 알림톡 전송 리스트 생성 (시작)-------------------------------------------*/ + for(int i = 0; i < callToCnt; i++) { + + KakaoVO kakaoSandInfo = new KakaoVO(); // 전송설정VO + + kakaoSandInfo.setMsgId(idgenMsgId.getNextStringId()); // 문자 Id 설정 + kakaoSandInfo.setMsgGroupId(kakaoVO.getMsgGroupId()); // 문자 그룹ID 설정 + kakaoSandInfo.setUserId(kakaoVO.getUserId()); // 사용자 ID + kakaoSandInfo.setAgentCode(agentCode); // 전송 agent 설정 + + kakaoSandInfo.setSenderKey(kakaoVO.getSenderKey()); + kakaoSandInfo.setTemplateCode(kakaoVO.getTemplateCode()); + + + kakaoSandInfo.setCallTo(phoneList[i]); // 받는사람 전화번호 + kakaoSandInfo.setCallFrom(kakaoVO.getCallFrom()); // 보내는사람 전화전호 + kakaoSandInfo.setMsgType(msgType); // 문자전송 타입 설정 + + + List kakaoSendMsgList = kakaoVO.getKakaoSendList(); + /**문자내용 치환 처리 (시작) --------------------------------------------*/ + kakaoSandInfo.setTemplateContent(kakaoSendMsgList.get(i).getTemplateContent()); //템플릿 내용 또는 치환 템플릿 내용 + /**문자내용 치환 처리 (끝) ---------------------------------------------*/ + + kakaoSandInfo.setTemplateTitle(kakaoSendMsgList.get(i).getTemplateTitle()); + /**json파일 여부 (시작) --------------------------------------------*/ + kakaoSandInfo.setBizJsonYn(kakaoVO.getBizJsonYn()); + if(kakaoVO.getBizJsonYn().equals("Y")){ + kakaoSandInfo.setBizJsonName(kakaoSendMsgList.get(i).getBizJsonName()); + } + /**json파일 여부 (끝) ---------------------------------------------*/ + + /**대체문자 처리 (시작) --------------------------------------------*/ + kakaoSandInfo.setSubMsgSendYn(kakaoVO.getSubMsgSendYn()); // 대체문자 전송여부 설정 + if(kakaoVO.getSubMsgSendYn().equals("Y")) { + kakaoSandInfo.setSubMsgType(kakaoSendMsgList.get(i).getSubMsgType()); // 대체문자 전송 타입 + kakaoSandInfo.setSubMsgTxt(kakaoSendMsgList.get(i).getSubMsgTxt()); // 대체문자 전송 내용 + } + /**대체문자 처리 (끝) ---------------------------------------------*/ + + /**전송시간 설정 (시작)------------------------------------------------*/ + if(!kakaoVO.getReserveYn().equals("N")) { + /** 예약 발송 설정 */ + //분할 발송을 체크 한 경우 + if(kakaoVO.getDivideChk().equals("Y")) { + + kakaoSandInfo.setReqDate(dividDayList.get(i)); //분할 문자 예약 시간 입력해주기 + + }else { + + kakaoSandInfo.setReqDate(kakaoVO.getReqDate()); + + } + }else { + /** 즉시 발송 설정 */ + Date now = new Date(); + SimpleDateFormat sdFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); + kakaoVO.setReqDate(sdFormat.format(now)); + kakaoSandInfo.setReqDate(sdFormat.format(now)); + + } + + if(atSmishingYn.equals("Y")) { + String sandDate = ""; + + if(kakaoVO.getDivideChk().equals("Y")) { + //분할 문자 예약 시간 입력해주기 + sandDate = dividDayList.get(i); + }else { + //예약 시간 입력해주기 + sandDate = kakaoVO.getReqDate(); + } + + if(!kakaoVO.getReserveYn().equals("N")) { + /** 예약 발송 설정 */ + if (i == 0) { + SimpleDateFormat sdFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); + Date date = sdFormat.parse(sandDate); + + Calendar cal1 = Calendar.getInstance(); + cal1.setTime(date); // 시간 설정 + cal1.add(Calendar.MINUTE, 30); // 30분 연산 + + String reqDate = sdFormat.format(cal1.getTime()); + + System.out.println("@@@@@@@@@@@@@@ reqDate : "+reqDate); + kakaoVO.setReqDate(reqDate); + kakaoSandInfo.setReqDate(reqDate); + } + else { + if(kakaoVO.getDivideChk().equals("Y")) { + SimpleDateFormat sdFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); + Date date = sdFormat.parse(sandDate); + + Calendar cal1 = Calendar.getInstance(); + cal1.setTime(date); // 시간 설정 + cal1.add(Calendar.MINUTE, 30); // 30분 연산 + + String reqDate = sdFormat.format(cal1.getTime()); + + System.out.println("@@@@@@@@@@@@@@ reqDate : "+reqDate); + kakaoVO.setReqDate(reqDate); + kakaoSandInfo.setReqDate(reqDate); + } + } + }else { + /** 즉시 발송 설정 */ + SimpleDateFormat sdFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); + Date date = sdFormat.parse(sandDate); + + Calendar cal1 = Calendar.getInstance(); + cal1.setTime(date); // 시간 설정 + cal1.add(Calendar.MINUTE, 30); // 30분 연산 + + String reqDate = sdFormat.format(cal1.getTime()); + + System.out.println("@@@@@@@@@@@@@@ reqDate : "+reqDate); + kakaoVO.setReqDate(reqDate); + kakaoSandInfo.setReqDate(reqDate); + } + } + + /**전송시간 설정 (끝)------------------------------------------------*/ + + /**카카오 전송 데이터 추가*/ + kakaoFtSendList.add(kakaoSandInfo); + + + int instCnt = 0; // DB등록 완료 수량 + //지금까지 루프 돌아간 것이 전체 수신자 갯수와 같으면 추가가 완료된 것으로 판단 되어 전송 해줌 + if(totCnt == callToCnt) { + + if(kakaoFtSendList.size() > 0) { + instCnt = kakaoAlimTalkDAO.insertKakaoAtDataInfo(kakaoFtSendList); + } + //총 디비 입력 건수 저장하기 + resultCnt = resultCnt + instCnt; + + }else { + + } + totCnt++; + + } +/** 카카오 알림톡 전송 리스트 (종료)-------------------------------------------*/ + +/** + * 1. 문자 발송 캐시 차감 ---------------------------------------------- + * 2. 문자 그룹 테이블 등록 -------------------------------------------- + */ + + //문자 발송 캐시 차감 해주기 + MjonPayVO mjonPayVO = new MjonPayVO(); + + MjonMsgVO mjonMsgVO = new MjonMsgVO(); + + //1건 이상 발송이 있는 경우만 캐쉬를 차감 시킨다. + //문자 발송 그룹 데이블에 추가 + if(resultCnt > 0) { + + +/** 발송 캐시 차감---------------------------------------------*/ + + + int totSendCnt = kakaoVO.getCallToList().length; + Float eachPrice = Float.parseFloat(kakaoVO.getEachPrice()); + Float totPrice = eachPrice * resultCnt; + String strTotPrice = String.format("%.1f", totPrice); + + mjonMsgVO.setTotPrice(strTotPrice);//현재 합산 금액 셋팅 + mjonPayVO.setCashId(idgenMjonCashId.getNextStringId()); + mjonPayVO.setUserId(kakaoVO.getUserId()); + mjonPayVO.setCash(-Float.parseFloat(strTotPrice)); + mjonPayVO.setFrstRegisterId(kakaoVO.getUserId()); + mjonPayVO.setMemo("카카오 친구톡 총 "+totSendCnt+"건 중 " + resultCnt + "건 발송"); + mjonPayVO.setMsgGroupId(kakaoVO.getMsgGroupId()); + + + mjonPayService.insertCash(mjonPayVO); //캐시차감 + mjonPayService.updateMemberCash(mjonPayVO); //회원정보 업데이트 + +/** 그룹 테이블 등록-------------------------------------------*/ + + mjonMsgVO.setUserId(kakaoVO.getUserId()); + mjonMsgVO.setMsgGroupId(kakaoVO.getMsgGroupId()); + mjonMsgVO.setCallFrom(kakaoVO.getCallFrom()); + mjonMsgVO.setSmsTxt(kakaoVO.getTemplateContent()); + mjonMsgVO.setReqDate(kakaoVO.getReqDate()); + mjonMsgVO.setMsgGroupCnt(Integer.toString(resultCnt)); + mjonMsgVO.setMsgType(msgType); + mjonMsgVO.setAgentCode(agentCode); + mjonMsgVO.setEachPrice(kakaoVO.getEachPrice()); + mjonMsgVO.setReserveYn(kakaoVO.getReserveYn()); + mjonMsgVO.setBefCash(kakaoVO.getBefCash()); + mjonMsgVO.setBefPoint(kakaoVO.getBefPoint()); + mjonMsgVO.setKakaoSubMagOrgnlTxt(kakaoVO.getKakaoSubMagOrgnlTxt()); + mjonMsgVO.setAtDelayYn(kakaoVO.getAtSmishingYn()); + + //야간 스미싱 알림 비활성화인 경우 딜레이처리 안하도록 함 20240912 우영두 수정 + if(spamSmishingPassStatus) { + mjonMsgVO.setAtDelayYn("N"); + }else { + mjonMsgVO.setAtDelayYn(kakaoVO.getAtSmishingYn()); + } + + if(kakaoVO.getBizJsonYn().equals("Y")) { + mjonMsgVO.setFileCnt("1"); + }else { + mjonMsgVO.setFileCnt("0"); + } + + mjonMsgVO.setDelayYn(kakaoVO.getDelayYn()); + + // 등록되어있는 그룹데이터가 있는지 조회 + int msgGroupDataCnt = mjonMsgDAO.selectMsgGroupDataCntByGroupId(mjonMsgVO); + + // 등록되어 있는 그룹데이터가 없으면 insert, 있으면 update를 진행한다. + if(msgGroupDataCnt < 1) { + mjonMsgDAO.insertGroupMsgData(mjonMsgVO); + + /* + * 현재 발송하는 카카오 친구톡 및 문자(단/장문) 발송 금액 정보를 mj_msg_group_id와 함께 디비에 저장해준다. + * 환불할 때 각 단가를 사용하기 때문에 별도로 저장함. + * 히스토리 기록을 위해서도 사용할 수 있을것 같음 + * + * */ + kakaoAlimTalkDAO.insertKakaoSendPrice(kakaoVO); + + + try { + + //야간 스미싱 알림이 활성화 이고 알림 예외 일정에 포함되고, 스팸 또는 스미싱 의심 상태일 경우 문자정보 별도 저장처리 - 20240821 우영두 추가 + if(holiSmishingNoti.equals("Y") && spamSmishingPassStatus && kakaoVO.getAtSmishingYn().equals("Y")) { + mjonMsgDAO.insertSpamPassMsgData(mjonMsgVO); + } + + } catch (Exception e) { + System.out.println("++++++++++++++++++++++++++++++ spamSmishingPassStatus 친구톡 야간 스미싱 알림 데이터 입력 오류 발생 !!!!"); + } + + + }else { + mjonMsgDAO.updateMsgGroupDataForTotCntSum(mjonMsgVO); + } + } + + returnVO.setSendMsgCnt(Integer.toString(resultCnt)); + + } catch (Exception e) { + // 실패 + returnVO.setSendMsgCnt(Integer.toString(0)); //발송 건수 저장 + returnVO.setSendMsgBlockCnt(Integer.toString(0)); //수신차단 건수 저장 + returnVO.setAgentCode("01"); + + System.out.println("========================================================================="); + System.out.println("+++++++++++++++++++++++++++++ 문자발송 ==> insertMsgDataInfo ERROR !!! : " + e); + System.out.println("========================================================================="); + return returnVO; + } + return returnVO; + } + + + /* + * 카카오 알림톡 발송 실패에 따른 금액 환불 처리 + * + * */ @Override public void selectKakaoAtSentRefundList() throws Exception { @@ -439,4 +775,45 @@ public class KakaoAlimTalkServiceImpl extends EgovAbstractServiceImpl implements } } } + + + /* + * 카카오 친구톡 발송 실패에 따른 금액 환불 처리 + * 카카오 친구톡 대체문자 선택에 대해 성공시 친구톡과 문자 간 금액 차액의 환불도 처리 됨. + * */ + @Override + public void selectKakaoFtSentRefundList() throws Exception { + + /** + * 1. 카카오 FT 전송성공 확인 + * 2. 카카오 FT 전송실패, 대채문자 전송확인 + * 3. 카카오 FT 전송 실패 확인 + */ + List kakaoFtSentRefundList = kakaoAlimTalkDAO.selectKakaoFtSentRefundList(); + + for(KakaoVO vo : kakaoFtSentRefundList) { + System.out.println(vo.getMsgGroupId() +"________결과 : " +vo.getRsltCode() +" 대체문자 전송 : "+vo.getSubMsgSendYn()); + + if(vo.getRsltCode().equals("7000")) {//친구톡 발송 성공시 + + kakaoAlimTalkDAO.updateKakaoFtSend(vo); + + }else if(vo.getSubMsgSendYn().equals("Y")) {//친구톡 발송 실패 했을 경우 + + //대체문자 발송 UMID 번호 조회 - 알림톡 쿼리 동일하게 사용 + KakaoVO info = kakaoAlimTalkDAO.selectKakaoAtUmid(vo); + + System.out.println("대체문자 전송 : " + info.getBizUmid()); + + if (info.getBizUmid() != null) {//대체문자 발송 완료인 경우 + kakaoAlimTalkDAO.updateKakaoAtSubMsgSend(vo); + }else { + kakaoAlimTalkDAO.updateKakaoFtNotSend(vo); + } + + }else { + kakaoAlimTalkDAO.updateKakaoFtNotSend(vo); + } + } + } } diff --git a/src/main/java/itn/let/kakao/user/kakaoAt/web/KakaoAlimTalkTemplateController.java b/src/main/java/itn/let/kakao/user/kakaoAt/web/KakaoAlimTalkTemplateController.java index 6ffe730c..f6a3a06e 100644 --- a/src/main/java/itn/let/kakao/user/kakaoAt/web/KakaoAlimTalkTemplateController.java +++ b/src/main/java/itn/let/kakao/user/kakaoAt/web/KakaoAlimTalkTemplateController.java @@ -871,6 +871,8 @@ public class KakaoAlimTalkTemplateController { LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null; String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId()); + model.addAttribute("loginVO", loginVO); + if(userId == "") { model.addAttribute("message", "로그인 후 이용이 가능합니다."); return "redirect:/web/user/login/login.do"; diff --git a/src/main/java/itn/let/kakao/user/kakaoFt/service/KakaoFriendsTalkTemplateService.java b/src/main/java/itn/let/kakao/user/kakaoFt/service/KakaoFriendsTalkTemplateService.java index 1c2e99aa..696dca96 100644 --- a/src/main/java/itn/let/kakao/user/kakaoFt/service/KakaoFriendsTalkTemplateService.java +++ b/src/main/java/itn/let/kakao/user/kakaoFt/service/KakaoFriendsTalkTemplateService.java @@ -14,4 +14,13 @@ public interface KakaoFriendsTalkTemplateService { //친구톡 템플릿 삭제처리하기 int deleteKakaoFriendstalkTemplate(KakaoVO kakaoVO) throws Exception; + + //친구톡 템플릿 상세정보 조회 + KakaoVO selectKakaoFriendsTemplateDetail(KakaoVO kakaoVO) throws Exception; + + //친구톡 템플릿 수정처리하기 + int updateKakaoFriendsTemplateData(KakaoVO kakaoVO) throws Exception; + + //친구톡 템플릿 이미지 삭제시 템플릿 데이터 변경 처리 + int updateKakaoFriendsTemplateImageDataDel(KakaoVO kakaoVO) throws Exception; } diff --git a/src/main/java/itn/let/kakao/user/kakaoFt/service/impl/KakaoFriendsTalkTemplateDAO.java b/src/main/java/itn/let/kakao/user/kakaoFt/service/impl/KakaoFriendsTalkTemplateDAO.java index bf289d51..b9eff615 100644 --- a/src/main/java/itn/let/kakao/user/kakaoFt/service/impl/KakaoFriendsTalkTemplateDAO.java +++ b/src/main/java/itn/let/kakao/user/kakaoFt/service/impl/KakaoFriendsTalkTemplateDAO.java @@ -107,4 +107,57 @@ public class KakaoFriendsTalkTemplateDAO extends EgovAbstractDAO{ return result; } + + + //친구톡 템플릿 상세정보 조회 + public KakaoVO selectKakaoFriendsTemplateDetail(KakaoVO kakaoVO) throws Exception{ + + KakaoVO result = new KakaoVO(); + + try { + + result = (KakaoVO) select("kakaoFriendsTalkTemplateDAO.selectKakaoFriendsTemplateDetail", kakaoVO); + + } catch (Exception e) { + System.out.println("selectKakaoFriendsTemplateDetail DAO Error !!! " + e); + } + + return result; + + } + + //친구톡 템플릿 수정처리하기 + public int updateKakaoFriendsTemplateData(KakaoVO kakaoVO) throws Exception{ + + int result = 0; + + try { + + result = update("kakaoFriendsTalkTemplateDAO.updateKakaoFriendsTemplateData", kakaoVO); + + } catch (Exception e) { + System.out.println("updateKakaoFriendsTemplateData DAO Error !!! " + e); + } + + return result; + + } + + //친구톡 템플릿 이미지 삭제시 템플릿 데이터 변경 처리 + public int updateKakaoFriendsTemplateImageDataDel(KakaoVO kakaoVO) throws Exception{ + + int result = 0; + + try { + + result = update("kakaoFriendsTalkTemplateDAO.updateKakaoFriendsTemplateImageDataDel",kakaoVO); + + } catch (Exception e) { + System.out.println("updateKakaoFriendsTemplateData DAO Error !!! " + e); + } + + return result; + + } + } diff --git a/src/main/java/itn/let/kakao/user/kakaoFt/service/impl/KakaoFriendsTalkTemplateServiceImpl.java b/src/main/java/itn/let/kakao/user/kakaoFt/service/impl/KakaoFriendsTalkTemplateServiceImpl.java index 5bc426c7..74b4e8c9 100644 --- a/src/main/java/itn/let/kakao/user/kakaoFt/service/impl/KakaoFriendsTalkTemplateServiceImpl.java +++ b/src/main/java/itn/let/kakao/user/kakaoFt/service/impl/KakaoFriendsTalkTemplateServiceImpl.java @@ -126,4 +126,102 @@ public class KakaoFriendsTalkTemplateServiceImpl extends EgovAbstractServiceImp return result; } + //친구톡 템플릿 상세정보 조회 + @Override + public KakaoVO selectKakaoFriendsTemplateDetail(KakaoVO kakaoVO) throws Exception{ + + KakaoVO result = new KakaoVO(); + + try { + + result = kakaoFriendsTalkTemplateDAO.selectKakaoFriendsTemplateDetail(kakaoVO); + + //템플릿에 등록된 버튼정보가 있는지 확인하여 추가 + if(result != null) { + + List buttonList = new ArrayList(); + MjonKakaoTemplateButtonVO buttonVO = new MjonKakaoTemplateButtonVO(); + buttonVO.setTemplateId(kakaoVO.getFriendId()); + buttonVO.setTemplateUseType("F"); + buttonList = kakaoFriendsTalkTemplateDAO.selectKakaoFriendsTemplateButtons(buttonVO); + + if(buttonList != null) { + result.setButtonVOList(buttonList); + } + + } + + } catch (Exception e) { + System.out.println("selectKakaoFriendsTemplateDetail ServiceImple Error !!! " + e); + } + + return result; + + } + + //친구톡 템플릿 수정처리하기 + @Override + public int updateKakaoFriendsTemplateData(KakaoVO kakaoVO) throws Exception{ + + int result = 0; + int resultBtn = 0; + + try { + + //템플릿 정보 수정 + result = kakaoFriendsTalkTemplateDAO.updateKakaoFriendsTemplateData(kakaoVO); + + String friendId = kakaoVO.getFriendId(); + if(result > 0) { + + //기존 버튼 정보 삭제 + int resultBtnCnt = kakaoFriendsTalkTemplateDAO.deleteKakaoFriendstalkButtons(kakaoVO); + + //신규 버튼 정보 입력 + for(KakaoButtonVO button: kakaoVO.getButtonVOList()) { + + MjonKakaoTemplateButtonVO tmpButtonVO = new MjonKakaoTemplateButtonVO(); + + tmpButtonVO.setTemplateId(friendId); + tmpButtonVO.setTemplateUseType("F"); + tmpButtonVO.setButtonName(button.getName()); + tmpButtonVO.setButtonLinktype(button.getLinkType()); + tmpButtonVO.setButtonLinkpc(button.getLinkPc()); + tmpButtonVO.setButtonLinkmo(button.getLinkMo()); + tmpButtonVO.setButtonLinkios(button.getLinkIos()); + tmpButtonVO.setButtonLinkand(button.getLinkAnd()); + tmpButtonVO.setUserId(kakaoVO.getUserId()); + + int resultCnt = kakaoFriendsTalkTemplateDAO.insertKakaoFriendsTemplateButtonData(tmpButtonVO); + resultBtn = resultBtn + resultCnt; + + } + + } + + } catch (Exception e) { + System.out.println("updateKakaoFriendsTemplateData ServiceImple Error !!! " + e); + } + + return result; + } + + //친구톡 템플릿 이미지 삭제시 템플릿 데이터 변경 처리 + @Override + public int updateKakaoFriendsTemplateImageDataDel(KakaoVO kakaoVO) throws Exception{ + + int result = 0; + + try { + + result = kakaoFriendsTalkTemplateDAO.updateKakaoFriendsTemplateImageDataDel(kakaoVO); + + } catch (Exception e) { + System.out.println("updateKakaoFriendsTemplateData ServiceImple Error !!! " + e); + } + + return result; + + } + } 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 9f9f4f03..e47e6a88 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 @@ -1,30 +1,57 @@ package itn.let.kakao.user.kakaoFt.web; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.text.SimpleDateFormat; import java.util.ArrayList; +import java.util.Arrays; +import java.util.Calendar; +import java.util.Date; import java.util.List; import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; +import egovframework.rte.fdl.idgnr.EgovIdGnrService; import egovframework.rte.fdl.security.userdetails.util.EgovUserDetailsHelper; import itn.com.cmm.EgovMessageSource; import itn.com.cmm.LoginVO; import itn.com.cmm.util.MJUtil; import itn.com.utl.fcc.service.EgovStringUtil; +import itn.let.kakao.kakaoComm.KakaoSendUtil; import itn.let.kakao.kakaoComm.KakaoVO; import itn.let.kakao.kakaoComm.kakaoApi.service.KakaoApiService; +import itn.let.kakao.user.kakaoAt.service.KakaoAlimTalkService; +import itn.let.kakao.user.kakaoFt.service.KakaoFriendsTalkTemplateService; +import itn.let.mjo.mjocommon.MjonCommon; +import itn.let.mjo.mjocommon.MjonHolidayApi; import itn.let.mjo.msgdata.service.MjonMsgDataService; +import itn.let.mjo.msgdata.service.MjonMsgDataVO; +import itn.let.mjo.msgdata.service.MjonMsgReturnVO; +import itn.let.mjo.msgholiday.service.MsgAlarmSetVO; +import itn.let.mjo.msgholiday.service.MsgHolidayService; +import itn.let.mjo.msgholiday.service.MsgHolidayVO; import itn.let.mjo.symbol.service.MjonSymbolService; import itn.let.mjo.symbol.service.MjonSymbolVO; +import itn.let.sym.site.service.EgovSiteManagerService; +import itn.let.sym.site.service.JoinSettingVO; +import itn.let.uss.umt.service.EgovUserManageService; +import itn.let.uss.umt.service.MberManageVO; +import itn.let.uss.umt.service.UserManageVO; @Controller public class KakaoFriendsTalkSendController { + @Resource(name = "egovMjonMsgGroupIdGnrService") + private EgovIdGnrService idgenMjonMsgGroupId; + /** EgovMessageSource */ @Resource(name="egovMessageSource") EgovMessageSource egovMessageSource; @@ -38,37 +65,159 @@ public class KakaoFriendsTalkSendController { @Resource(name = "MjonMsgDataService") private MjonMsgDataService mjonMsgDataService; + @Resource(name = "kakaoFriendsTalkTemplateService") + private KakaoFriendsTalkTemplateService kakaoFtTemplateService; + + /** userManageService */ + @Resource(name = "userManageService") + private EgovUserManageService userManageService; + + @Resource(name = "kakaoAlimTalkService") + private KakaoAlimTalkService kakaoAlimTalkService; + + /** 사이트 설정 */ + @Resource(name = "egovSiteManagerService") + EgovSiteManagerService egovSiteManagerService; + + @Resource(name = "MsgHolidayService") + private MsgHolidayService msgHolidayService; + + @Autowired + KakaoSendUtil kakaoSendUtil; + + + + /** + * @methodName : kakaoFriendsTalkMsgDataView + * @author : 우영두 + * @date : 2024.01.05 + * @description : kakaoFriendsTalkMsgDataView 카카오 친구톡 발송 화면 + * @param kakaoVO + * @param model + * @param response + * @return + * @throws Exception + */ + @RequestMapping(value= {"/web/mjon/kakao/friendstalk/kakaoFriendsTalkMsgDataView.do"}) public String KakaoAlimtalkMsgDataView(ModelMap model , @ModelAttribute("kakaoVO") KakaoVO kakaoVO) throws Exception { LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null; + String author = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getAuthority()); String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId()); - if(userId == "") { + + /*if(userId == "") { return "redirect:/web/user/login/login.do"; - } + }*/ + + model.addAttribute("loginVO", loginVO); try { - //사용자 등록 발신프로필 정보 조회해오기 - kakaoVO.setUserId(userId); - List resultProfileList = kakaoApiService.selectKakaoProfileList(kakaoVO); - model.addAttribute("resultProfileList", resultProfileList); + if(!userId.equals("") && !author.equals("ROLE_ADMIN")) { - // 특수문자 리스트 불러오기 - MjonSymbolVO symbolVO = new MjonSymbolVO(); - List symbolList = mjonSymbolService.selectMjonSymbolList(symbolVO); - model.addAttribute("symbolList", symbolList); + //사용자 등록 발신프로필 정보 조회해오기 + kakaoVO.setUserId(userId); + List resultProfileList = kakaoApiService.selectKakaoProfileList(kakaoVO); + model.addAttribute("resultProfileList", resultProfileList); + + // 특수문자 리스트 불러오기 + MjonSymbolVO symbolVO = new MjonSymbolVO(); + List symbolList = mjonSymbolService.selectMjonSymbolList(symbolVO); + model.addAttribute("symbolList", symbolList); + + //아이디 발신번호 리스트 불러오기. + List resultSendPhonList = mjonMsgDataService.selectSendPhonNumList(userId); + List resultPhonList = new ArrayList(); + MJUtil mjUtil = new MJUtil(); + for(String phone : resultSendPhonList) { + resultPhonList.add(mjUtil.addDash(phone)); + } + model.addAttribute("resultPhonList", resultPhonList); + + + MberManageVO mberManageVO = mjonMsgDataService.selectMberManageInfo(userId); + + model.addAttribute("atSmishingYn", mberManageVO.getAtSmishingYn()); + + //3.사용자 개인단가 정보가 0이 아니면 개인단가 사용, 없으면 시스템 기본 단가 사용 + /*Float shortPrice = mberManageVO.getShortPrice(); + Float longPrice = mberManageVO.getLongPrice(); + Float picturePrice = mberManageVO.getPicturePrice(); + Float picture2Price = mberManageVO.getPicture2Price(); + Float picture3Price = mberManageVO.getPicture3Price();*/ + BigDecimal userMoney = new BigDecimal(mberManageVO.getUserMoney()).setScale(2, RoundingMode.HALF_EVEN); + + model.addAttribute("userMoney", userMoney); + + + ////////////////////////////////////////////////////////////////// + + //최근 전송 내역 + MjonMsgDataVO searchVO = new MjonMsgDataVO(); + Calendar cal = Calendar.getInstance(); + Date now = new Date(); + SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd"); + cal.setTime(now); + cal.add(Calendar.DATE, -3); + String chkDate = format.format(cal.getTime()); + searchVO.setUserId(userId); + searchVO.setMyMsgStDt(chkDate); //검색 시작일 저장 - 현재날짜로 부터 3일 이전 날짜로 시작 + model.addAttribute("resultLatestMsgList", mjonMsgDataService.selectLatestMsgList(searchVO)); + + //자주보내는 번호 + model.addAttribute("resultBookMarkMsgList", mjonMsgDataService.selectBookMarkMsgList(searchVO)); + + // 사용자 정의 단가 정보 불러오기(시스템 단가 혹은 협의 단가) + model.addAttribute("sendPrice", kakaoSendUtil.selectSendPriceOfKakaoAtAndSmsAndMms(userId)); + + + //사용자 템플릿 정보 조회 + String friendId = kakaoVO.getFriendId(); + KakaoVO resultTemplateVO = new KakaoVO(); + + if(friendId != null) { + resultTemplateVO = kakaoFtTemplateService.selectKakaoFriendsTemplateDetail(kakaoVO); + } + model.addAttribute("resultTemplateVO", resultTemplateVO); + + + //친구톡 발송시간 체크 하기 - 20:50 ~ 익일 08:00 사이에는 발송 금지 + + SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + + Date nows = new Date(); + String nowDate = sdf1.format(nows); + cal.setTime(nows); + + int hours = cal.get(Calendar.HOUR_OF_DAY); + int minuts = cal.get(Calendar.MINUTE); + + boolean sendStatus = true; + + if(hours >= 20) { + + if(minuts >= 50) { + + System.out.println("발송금지 시간" + hours + ":" + minuts); + sendStatus = false; + + } + + } + + if(hours < 8) { + + System.out.println("발송금지 시간" + hours + ":" + minuts); + sendStatus = false; + + } + + System.out.println("발송상태는 ::: "+sendStatus); + model.addAttribute("sendStatus", sendStatus); - //아이디 발신번호 리스트 불러오기. - List resultSendPhonList = mjonMsgDataService.selectSendPhonNumList(userId); - List resultPhonList = new ArrayList(); - MJUtil mjUtil = new MJUtil(); - for(String phone : resultSendPhonList) { - resultPhonList.add(mjUtil.addDash(phone)); } - model.addAttribute("resultPhonList", resultPhonList); - } catch (Exception e) { System.out.println(" kakaoFriendsTalkMsgDataViewDataRegist Error ::: " + e); @@ -78,30 +227,535 @@ public class KakaoFriendsTalkSendController { } - @RequestMapping(value= {"/web/mjon/kakao/friendstalk/kakaoFriendsTalkMsgSendAjax.do"}) - public ModelAndView kakaoFriendsTalkMsgSendAjax( - @ModelAttribute("kakaoVO") KakaoVO kakaoVO - ) throws Exception { - ModelAndView modelAndView = new ModelAndView(); + /** + * @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"); - int sendCount = 0; //발송결과 건수 + 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 + , HttpServletRequest request + , @ModelAttribute("kakaoVO") KakaoVO kakaoVO) throws Exception { + ModelAndView modelAndView = new ModelAndView(); + modelAndView.setViewName("jsonView"); + + + int resultSts = 0; //발송결과 건수 + int resultBlockSts = 0; //수신거부 등록번호로 발송을 안한 건수 + + LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null; + String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId()); + try { - /** 카카오톡 전송 기본 설정 -------------------------------------------*/ - /** 카카오톡 전송 금액 설정 -------------------------------------------*/ - /** 카카오톡 전송 분할 설정 -------------------------------------------*/ - /** 카카오톡 예약 전송 설정 -------------------------------------------*/ - /** 카카오톡 전송 메시지 설정 ------------------------------------------*/ - /** 카카오톡 발송 처리 -----------------------------------------------*/ - - }catch (Exception e) { - System.out.println(" kakaoFriendsTalkMsgSendAjax Error ::: " + e); + if(userId == "") { + modelAndView.addObject("message", "로그인 후 이용이 가능합니다."); + modelAndView.addObject("result", "loginFail"); + return modelAndView; + }else { + + /** + * 회원 정지된 상태이면 알림톡 발송이 안되도록 처리함 + * 현재 로그인 세션도 만료 처리함 + * */ + boolean mberSttus = userManageService.selectUserStatusInfo(userId); + + if(!mberSttus) { + + modelAndView.addObject("message", "현재 고객님께서는 문자온 서비스 이용이 정지된 상태로 알림톡을 발송하실 수 없습니다. 이용정지 해제를 원하시면 고객센터로 연락주시기 바랍니다."); + modelAndView.addObject("result", "authFail"); + + request.getSession().invalidate(); + + return modelAndView; + + } + } + +/** 카카오톡 전송 기본 설정 -------------------------------------------*/ + kakaoVO.setSendType("FT"); + kakaoVO.setMsgType("9"); + kakaoVO.setUserId(userId); + + +/** 전송금액 설정 --------------------------------------------------*/ + KakaoVO priceSet = kakaoSendUtil.kakaoFTSendPrice(kakaoVO); + + if(priceSet.getResultCode() != null && priceSet.getResultCode().equals("2000")) { + + modelAndView.addObject("message", "대체문자 치환 후 전송 문자 길이를 초과하였습니다."); + modelAndView.addObject("result", "fail"); + return modelAndView; + } + + BigDecimal befCash = new BigDecimal(priceSet.getBefCash()).setScale(2, RoundingMode.HALF_EVEN); + BigDecimal totMsgPrice = new BigDecimal(priceSet.getTotPrice()).setScale(2, RoundingMode.HALF_EVEN); + + kakaoVO.setEachPrice(priceSet.getEachPrice()); + kakaoVO.setBefCash(befCash.toString()); + kakaoVO.setTotPrice(totMsgPrice.toString()); + + //현재 보유 금액이 발송 문자 총 금액보다 클 경우만 문자 발송 + //BigDecimal 비교 연산 + // befCash(현재 보유금액) 값이 totMsgPrice(문자전송 금액) 보다 많으면 문자 전송 + if(befCash.compareTo(totMsgPrice) != -1) { // -1 : befCash < totMsgPrice, 0 : befCash = totMsgPrice, 1 : befCash > totMsgPrice, + + kakaoVO.setMsgGroupId(idgenMjonMsgGroupId.getNextStringId()); // 문자 그룹ID 설정 + +/** 카카오톡 전송 분할 설정 ----------------------------------------------*/ + + String[] tempPhoneList = new String[200]; //임시 수신번호 리스트 저장용 배열 + List tempVarValList = new ArrayList(); //임시 변수 리스트 저장용 + + String[] phoneList = kakaoVO.getCallToList(); + List varValList = null; + + + //치환문자 포함 여부 + if(kakaoVO.getTxtReplYn().equals("Y")) { + varValList = kakaoVO.getVarValList(); + } + + System.out.println("+++++++++++++++++ 회원 스미싱 의심 온/오프 ::: "+kakaoVO.getAtSmishingYn()); + + //스팸 스미싱 여부 - 내용에 스팸 문자열 유무 체크 + if(kakaoVO.getSpamStatus().equals("Y") || kakaoVO.getAtSmishingYn().equals("Y")) { + kakaoVO.setAtSmishingYn("Y"); + }else { + kakaoVO.setAtSmishingYn("N"); + } + + //스미싱 의심이 아니면 delayYn 값 셋팅 + if(kakaoVO.getAtSmishingYn().equals("N")) { + kakaoVO.setAtDelayYn("N"); + }else { + kakaoVO.setAtDelayYn("Y"); + } + + //분할발송 여부 - 친구톡은 분할 발송이 없기애 N으로 픽스 + kakaoVO.setDivideChk("N"); + + int callToListCnt = kakaoVO.getCallToList().length; + kakaoVO.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(!kakaoVO.getReserveYn().equals("N")) {//예약문자인 경우 시간 셋팅 + + Date toDate = transFormat.parse(kakaoVO.getReqDate()); + cal.setTime(toDate); //예약 시간 캘린터 변수에 입력 + + //turmMin = Integer.parseInt(kakaoVO.getDivideTime()); //분할발송 시간 간격 + //dividDay = transFormat.format(cal.getTime()); + + totalCallCnt = kakaoVO.getCallToList().length; // 수신자 전체 갯수 + //divideCnt = Integer.parseInt(kakaoVO.getDivideCnt()); //분할 발송 갯수 + + } + + //분할 예약 시간 저장 리스트 생성 + List dividDayList = new ArrayList(); + + if(callToListCnt > 200) { + + int sendCnt = 0; + /** 카카오톡 전송 200개 이상일때 ----------------------------------------------*/ + for(int i =0; i < callToListCnt; i++) { + + //분할 발송을 체크 한 경우 + /*if(kakaoVO.getDivideChk().equals("Y")) { + if(count > divideCnt) { + count = 1; + cal.add(Calendar.MINUTE, turmMin); //분할 시간 간격을 증가시켜 준다. + dividDay = transFormat.format(cal.getTime()); + dividDayList.add(dividDay); + count++; + }else { + dividDayList.add(dividDay); + count++; + } + }*/ + + + if((i < callToListCnt -1) && sendCnt == 199) { + + tempPhoneList[sendCnt] = phoneList[i]; + + if(varValList != null) { + tempVarValList.add(varValList.get(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); + } + +/** 카카오톡 전송 메시지 설정 ----------------------------------------------*/ + kakaoVO.setCallToList(sendPhoneList); + kakaoVO.setVarValList(tempVarValList); + KakaoVO kakaoSendMsgSet = kakaoSendUtil.kakaoFTSendMsg(kakaoVO); + kakaoVO.setKakaoSendList(kakaoSendMsgSet.getKakaoSendList()); + +/** 카카오톡 발송 처리 --------------------------------------------------*/ + kakaoVO.setDividDay(dividDayList); + MjonMsgReturnVO returnVO = kakaoAlimTalkService.insertKakaoFtSendAjax(kakaoVO); + resultSts = resultSts + Integer.parseInt(returnVO.getSendMsgCnt()); + //전송 초기화 + sendCnt = 0; + Arrays.fill(tempPhoneList, null); + tempVarValList.clear(); + dividDayList.clear(); + + }else if((i == callToListCnt -1) && sendCnt < 200){//200개의 마지막일 경우 처리 + + tempPhoneList[sendCnt] = phoneList[i]; + + if(varValList != null) { + + tempVarValList.add(varValList.get(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); + } + +/** 카카오톡 전송 메시지 설정 ----------------------------------------------*/ + kakaoVO.setCallToList(sendPhoneList); + kakaoVO.setVarValList(tempVarValList); + KakaoVO kakaoSendMsgSet = kakaoSendUtil.kakaoFTSendMsg(kakaoVO); + kakaoVO.setKakaoSendList(kakaoSendMsgSet.getKakaoSendList()); + kakaoVO.setKakaoSubMagOrgnlTxt(kakaoSendMsgSet.getKakaoSubMagOrgnlTxt()); +/** 카카오톡 발송 처리 --------------------------------------------------*/ + kakaoVO.setDividDay(dividDayList); + MjonMsgReturnVO returnVO = kakaoAlimTalkService.insertKakaoFtSendAjax(kakaoVO); + resultSts = resultSts + Integer.parseInt(returnVO.getSendMsgCnt()); + }else {//198개가 될때까지 배열에 데이터를 쌓는다 + + tempPhoneList[sendCnt] = phoneList[i]; + + if(varValList != null && varValList.get(i).length > 0) { + tempVarValList.add(varValList.get(i)); + } + + sendCnt++; + } + } + }else { + /** 카카오톡 전송 200개 미만일때 ----------------------------------------------*/ + //분할 발송을 체크 한 경우 + /*if(kakaoVO.getDivideChk().equals("Y")) { + 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); + count++; + }else { + dividDayList.add(dividDay); + count++; + } + } + }*/ + + + +/** 카카오톡 전송 메시지 설정 ----------------------------------------------*/ + KakaoVO kakaoSendMsgSet = kakaoSendUtil.kakaoFTSendMsg(kakaoVO); + kakaoVO.setKakaoSendList(kakaoSendMsgSet.getKakaoSendList()); + kakaoVO.setKakaoSubMagOrgnlTxt(kakaoSendMsgSet.getKakaoSubMagOrgnlTxt()); + +/** 카카오톡 발송 처리 --------------------------------------------------*/ + kakaoVO.setDividDay(dividDayList); + MjonMsgReturnVO returnVO = kakaoAlimTalkService.insertKakaoFtSendAjax(kakaoVO); + resultSts = Integer.parseInt(returnVO.getSendMsgCnt()); + + } + +/** 카카오톡 결과 처리 --------------------------------------------------*/ + }else { + modelAndView.addObject("message", "친구톡 발송에 필요한 보유 잔액이 부족 합니다."); + modelAndView.addObject("result", "fail"); + return modelAndView; + } + + } catch (Exception e) { + System.out.println("kakaoFriendsTalkMsgSendAjax Controller Error !!!! "+e); modelAndView.addObject("message", egovMessageSource.getMessage("fail.common.update")); modelAndView.addObject("result", "fail"); return modelAndView; } + + modelAndView.addObject("message", "친구톡 전송이 완료되었습니다."); + modelAndView.addObject("result", "success"); + modelAndView.addObject("resultSts", resultSts); + + +/** 카카오 친구톡 발송 내용 법인폰, 친구톡 결과 처리 --------------------------------------------------*/ + try { + String adminSmsNoticeYn = "Y"; + String spamStatus = kakaoVO.getAtSmishingYn(); // 스미싱 의심으로 체크된 고객 정보 + + UserManageVO userManageVO = new UserManageVO(); + userManageVO.setMberId(userId); + + if(!userId.equals("")) { + userManageVO = userManageService.selectAdminSmsNoticeYn(userManageVO); + adminSmsNoticeYn = userManageVO.getAdminSmsNoticeYn(); + } + + //법인폰 알림 온 이거나 스미싱의심 문자인 경우 법인폰으로 발송 + if(adminSmsNoticeYn.equals("Y") || spamStatus.equals("Y")) { + + if(spamStatus.equals("Y")) { + kakaoVO.setAtDelayYn("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.getAdminKakaoAtSandSlack(kakaoVO); + + } + + } + + } + + // SLACK 체크 + /*if (joinSettingVO != null && joinSettingVO.getSlackNoti().equals("Y")) { + //Slack으로 메세지 전송 처리 + MjonCommon comm = new MjonCommon(); + comm.getAdminKakaoAtSandSlack(kakaoVO); + }*/ + } + + } catch (Exception e) { + throw new Exception("++++++++++++++++++++++ getAdminPhoneSendMsgData Error !!! " + e); + } + + return modelAndView; } + + /** + * @Method Name : kakaoFriendsTalkMsgSendRefundTestAjax + * @작성일 : 2024. 1. 18. + * @작성자 : 우영두 + * @Method 설명 : 카카오 친구톡 전송 환불 스케줄러 서비스 테스트 + */ + @RequestMapping(value= {"/web/mjon/kakao/friendstalk/kakaoFriendsTalkMsgSendRefundTestAjax.do"}) + public ModelAndView kakaoFriendsTalkMsgSendRefundTestAjax(ModelMap model + , HttpServletRequest request + , @ModelAttribute("kakaoVO") KakaoVO kakaoVO) throws Exception { + + ModelAndView modelAndView = new ModelAndView(); + modelAndView.setViewName("jsonView"); + + kakaoAlimTalkService.selectKakaoFtSentRefundList(); + + modelAndView.addObject("result", "success"); + return modelAndView; + } + + /** + * @Method Name : kakaoFriendsTalkMsgSendRefundTestAjax + * @작성일 : 2024. 1. 18. + * @작성자 : 우영두 + * @Method 설명 : 카카오 친구톡 전송 환불 스케줄러 서비스 테스트 + */ + @RequestMapping(value= {"/web/mjon/kakao/friendstalk/selectKakaoFriendsTalkTestSendPopup.do"}) + public String selectKakaoFriendsTalkTestSendPopup(ModelMap model + , @ModelAttribute("kakaoVO") KakaoVO kakaoVO) throws Exception { + + + LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null; + String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId()); + if(userId == "") { + return "redirect:/web/user/login/login.do"; + }else { + //1.시스템 기본 단가 정보 불러오기 + JoinSettingVO sysJoinSetVO = mjonMsgDataService.selectJoinSettingInfo(); + + //2.사용자 개인 단가 정보 불러오기 + MberManageVO mberManageVO = mjonMsgDataService.selectMberManageInfo(userId); + Float kakaoFtPrice = mberManageVO.getKakaoFtPrice(); + + if(kakaoFtPrice < 1) { + kakaoFtPrice = sysJoinSetVO.getKakaoFtPrice(); + } + + BigDecimal userMoney = new BigDecimal(mberManageVO.getUserMoney()).setScale(2, RoundingMode.HALF_EVEN); + model.addAttribute("userMoney", userMoney); + model.addAttribute("kakaoFtPrice", kakaoFtPrice); + } + + String tmpContents = kakaoVO.getTemplateContent(); + String txtReplYn = kakaoVO.getTxtReplYn(); + + if(txtReplYn.equals("Y")) { + + String[] varValStr = kakaoVO.getVarValList().get(0); + tmpContents = kakaoSendUtil.getKakaoFTCntReplace(varValStr[0], tmpContents); + + kakaoVO.setTemplateContent(tmpContents); + + } + + model.addAttribute("kakaoVO", kakaoVO); + + return "web/kakao/msgdata/ft/KakaoFriendsTalkMsgDataTestPop"; + } + + } diff --git a/src/main/java/itn/let/kakao/user/kakaoFt/web/KakaoFriendsTalkTemplateController.java b/src/main/java/itn/let/kakao/user/kakaoFt/web/KakaoFriendsTalkTemplateController.java index 8e71bf06..9b9540bd 100644 --- a/src/main/java/itn/let/kakao/user/kakaoFt/web/KakaoFriendsTalkTemplateController.java +++ b/src/main/java/itn/let/kakao/user/kakaoFt/web/KakaoFriendsTalkTemplateController.java @@ -34,6 +34,7 @@ import itn.let.kakao.kakaoComm.kakaoApi.service.KakaoApiService; import itn.let.kakao.user.kakaoFt.service.KakaoFriendsTalkTemplateService; import itn.let.mjo.symbol.service.MjonSymbolService; import itn.let.mjo.symbol.service.MjonSymbolVO; +import itn.let.uss.umt.service.EgovUserManageService; @Controller public class KakaoFriendsTalkTemplateController { @@ -54,6 +55,10 @@ public class KakaoFriendsTalkTemplateController { @Resource(name = "mjonSymbolService") private MjonSymbolService mjonSymbolService; + /** userManageService */ + @Resource(name = "userManageService") + private EgovUserManageService userManageService; + @Autowired KakaoApiProfile kakaoApiProfile; @@ -91,6 +96,8 @@ public class KakaoFriendsTalkTemplateController { return "redirect:/web/user/login/login.do"; } + model.addAttribute("loginVO", loginVO); + try { //사용자 등록 발신프로필 정보 조회해오기 @@ -260,11 +267,21 @@ public class KakaoFriendsTalkTemplateController { KakaoReturnVO result = kakaoApiImageUpload.kakaoApiImageDelete(kakaoVO); + String code = result.getBizReturnCode(); + + if(code.equals("200")) {//이미지 삭제 성공시 템플릿 디비에 있는 이미지 정보도 함께 지워준다. + + kakaoVO.setUserId(userId); + kakaoVO.setLastUpdusrId(userId); + kakaoFtTemplateService.updateKakaoFriendsTemplateImageDataDel(kakaoVO); + + } + modelAndView.addObject("code", result.getBizReturnCode()); modelAndView.addObject("msg", result.getBizReturnMsg()); modelAndView.addObject("result", "success"); } - }catch(Exception ex){ + }catch(Exception ex){ ex.printStackTrace(); modelAndView.addObject("message", egovMessageSource.getMessage("fail.common.update")); modelAndView.addObject("result", "fail"); @@ -276,10 +293,10 @@ public class KakaoFriendsTalkTemplateController { /** - * @methodName : deleteKakaoFriendsImageDataAjax + * @methodName : selectKakaoFriendsTemplateList * @author : 우영두 * @date : 2023.03.23 - * @description : deleteKakaoFriendsImageDataAjax 카카오 친구톡 이미지 삭제요청 + * @description : selectKakaoFriendsTemplateList 카카오 친구톡 템플릿 리스트 화면 * @param kakaoVO * @param model * @param response @@ -297,8 +314,19 @@ public class KakaoFriendsTalkTemplateController { return "redirect:/web/user/login/login.do"; } + model.addAttribute("loginVO", loginVO); + try { + /** + * 회원 정지된 상태이면 알림톡 템플릿 등록 화면으로 이동되지 않도록 처리 + * */ + boolean mberSttus = userManageService.selectUserStatusInfo(userId); + + if(!mberSttus) { + return "redirect:/web/uat/uia/actionLogout.do"; + } + //사용자 등록 발신프로필 정보 조회해오기 searchVO.setUserId(userId); List resultProfileList = kakaoApiService.selectKakaoProfileList(searchVO); @@ -319,10 +347,10 @@ public class KakaoFriendsTalkTemplateController { /** - * @methodName : deleteKakaoFriendsImageDataAjax + * @methodName : selectKakaoFriendsTemplateListAjax * @author : 우영두 * @date : 2023.03.23 - * @description : deleteKakaoFriendsImageDataAjax 카카오 친구톡 이미지 삭제요청 + * @description : selectKakaoFriendsTemplateListAjax 카카오 친구톡 템플릿 하단 리스트 정보 조회 * @param kakaoVO * @param model * @param response @@ -345,12 +373,12 @@ public class KakaoFriendsTalkTemplateController { /** pageing */ PaginationInfo paginationInfo = new PaginationInfo(); paginationInfo.setCurrentPageNo(searchVO.getPageIndex()); - paginationInfo.setRecordCountPerPage(searchVO.getPageUnit()); + paginationInfo.setRecordCountPerPage(9); paginationInfo.setPageSize(searchVO.getPageSize()); searchVO.setFirstIndex(paginationInfo.getFirstRecordIndex()); searchVO.setLastIndex(paginationInfo.getLastRecordIndex()); - searchVO.setRecordCountPerPage(paginationInfo.getRecordCountPerPage()); + searchVO.setRecordCountPerPage(9); if("".equals(searchVO.getSearchSortCnd())){ //최초조회시 최신것 조회List searchVO.setSearchSortCnd("FRIEND_ID"); @@ -456,4 +484,184 @@ public class KakaoFriendsTalkTemplateController { return modelAndView; } + + /** + * @methodName : selectKakaoFriendsTemplateDataDetail + * @author : 우영두 + * @date : 2024.01.04 + * @description : selectKakaoFriendsTemplateDataDetail 카카오 친구톡 템플릿 상세 화면 + * @param kakaoVO + * @param model + * @param response + * @return + * @throws Exception + */ + @RequestMapping(value= {"/web/mjon/kakao/template/selectKakaoFriendsTemplateDataDetail.do"}) + public String selectKakaoFriendsTemplateDataDetail( + @ModelAttribute("kakaoVO") KakaoVO kakaoVO, ModelMap model, HttpServletResponse response + ) throws Exception { + + LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null; + String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId()); + if(userId == "") { + return "redirect:/web/user/login/login.do"; + } + + model.addAttribute("loginVO", loginVO); + + try { + + //사용자 등록 발신프로필 정보 조회해오기 + kakaoVO.setUserId(userId); + List resultProfileList = kakaoApiService.selectKakaoProfileList(kakaoVO); + model.addAttribute("resultProfileList", resultProfileList); + + // 특수문자 리스트 불러오기 + MjonSymbolVO symbolVO = new MjonSymbolVO(); + List symbolList = mjonSymbolService.selectMjonSymbolList(symbolVO); + model.addAttribute("symbolList", symbolList); + + KakaoVO resultTemplateVO = kakaoFtTemplateService.selectKakaoFriendsTemplateDetail(kakaoVO); + + System.out.println("++++++++++++++++++ templateCode ::: "+kakaoVO.getFriendId()); + System.out.println("++++++++++++++++++ senderKey ::: "+kakaoVO.getSenderKey()); + + model.addAttribute("resultTemplateVO", resultTemplateVO); + + } catch (Exception e) { + System.out.println(" selectKakaoFriendsTemplateDataDetail Error ::: " + e); + } + + return "/web/kakao/template/ft/KakaoFriendstalkTemplateDetail"; + } + + // 카카오 친구톡 템플릿 수정요청 + /** + * @methodName : updateKakaoFriendsTemplateDataAjax + * @author : 우영두 + * @date : 2024.01.05 + * @description : updateKakaoFriendsTemplateDataAjax 카카오 친구톡 템플릿 수정요청 + * @param kakaoVO + * @param model + * @param response + * @return + * @throws Exception + */ + @RequestMapping(value= {"/web/mjon/kakao/template/updateKakaoFriendsTemplateDataAjax.do"}) + public ModelAndView updateKakaoFriendsTemplateDataAjax( + @ModelAttribute("kakaoVO") KakaoVO kakaoVO + , final MultipartHttpServletRequest multiRequest + ) throws Exception { + ModelAndView modelAndView = new ModelAndView(); + modelAndView.setViewName("jsonView"); + + try { + LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null; + String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId()); + + if(userId == "") { + modelAndView.addObject("result", "loginFail"); + return modelAndView; + }else { + + kakaoVO.setUserId(userId); + kakaoVO.setUserCallbackYn(userId); + kakaoVO.setFrstRegisterId(userId); + kakaoVO.setLastUpdusrId(userId); + kakaoVO.setSendType("FT"); + + String imgUrl = kakaoVO.getTemplateImageUrl(); + int buttonSize = kakaoVO.getButtonVOList().size(); + + if(!imgUrl.equals("") || buttonSize > 0) { + + //json 파일 생성 처리 + String resultJsonPath = kakaoFTJsonSave.kakaoApiJsonSave(kakaoVO); + kakaoVO.setBizJsonName(resultJsonPath); + + } + + int result = kakaoFtTemplateService.updateKakaoFriendsTemplateData(kakaoVO); + + if(result > 0) { + modelAndView.addObject("result", "success"); + }else { + modelAndView.addObject("result", "fail"); + } + } + }catch(Exception ex){ + ex.printStackTrace(); + modelAndView.addObject("message", egovMessageSource.getMessage("fail.common.update")); + modelAndView.addObject("result", "fail"); + return modelAndView; + } + + return modelAndView; + } + + + /** + * @methodName : selectKakaoFriendsTemplateListPopupAjax + * @author : 우영두 + * @date : 2024.01.05 + * @description : selectKakaoFriendsTemplateListPopupAjax 카카오 친구톡 발송화면 템플릿 팝업 리스트 화면 + * @param kakaoVO + * @param model + * @param response + * @return + * @throws Exception + */ + @RequestMapping(value= {"/web/mjon/kakao/template/selectKakaoFriendsTemplateListPopupAjax.do"}) + public String selectKakaoFriendsTemplateListPopupAjax(@ModelAttribute("searchVO") KakaoVO searchVO, + HttpServletRequest request , + ModelMap model) throws Exception{ + + LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null; + String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId()); + if(userId == "") { + return "redirect:/uat/uia/EgovLoginUsr.do"; + } + + try { + + searchVO.setUserId(userId); + + /** pageing */ + PaginationInfo paginationInfo = new PaginationInfo(); + paginationInfo.setCurrentPageNo(searchVO.getPageIndex()); + paginationInfo.setRecordCountPerPage(6); + paginationInfo.setPageSize(searchVO.getPageSize()); + + searchVO.setFirstIndex(paginationInfo.getFirstRecordIndex()); + searchVO.setLastIndex(paginationInfo.getLastRecordIndex()); + searchVO.setRecordCountPerPage(paginationInfo.getRecordCountPerPage()); + + if("".equals(searchVO.getSearchSortCnd())){ //최초조회시 최신것 조회List + searchVO.setSearchSortCnd("FRIEND_ID"); + searchVO.setSearchSortOrd("desc"); + } + + List kakaoTemplateInfoList = new ArrayList(); + // 문자발송 완료건은 모두 보이도록 처리 + searchVO.setUserId(userId); + kakaoTemplateInfoList = kakaoFtTemplateService.selectKakaoFriendsTemplateList(searchVO); + model.addAttribute("kakaoTemplateInfoList", kakaoTemplateInfoList); + model.addAttribute("searchVO", searchVO); + + paginationInfo.setTotalRecordCount(kakaoTemplateInfoList.size() > 0 ? ((KakaoVO)kakaoTemplateInfoList.get(0)).getTotCnt() : 0); + model.addAttribute("paginationInfo", paginationInfo); + + //사용자 등록 발신프로필 정보 조회해오기 + searchVO.setUserId(userId); + List resultProfileList = kakaoApiService.selectKakaoProfileList(searchVO); + model.addAttribute("resultProfileList", resultProfileList); + + } catch (Exception e) { + System.out.println("selectKakaoFriendsTemplateListAjax Controller Error !!! " + e); + } + + return "/web/kakao/template/ft/KakaoFriendstalkTemplateListPopupAjax"; + + } + } diff --git a/src/main/java/itn/let/kakao/user/sent/web/KakaoSentController.java b/src/main/java/itn/let/kakao/user/sent/web/KakaoSentController.java index 982fff2f..19d95a5e 100644 --- a/src/main/java/itn/let/kakao/user/sent/web/KakaoSentController.java +++ b/src/main/java/itn/let/kakao/user/sent/web/KakaoSentController.java @@ -1,5 +1,6 @@ package itn.let.kakao.user.sent.web; +import java.io.FileReader; import java.io.OutputStream; import java.text.SimpleDateFormat; import java.util.ArrayList; @@ -19,6 +20,9 @@ import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.util.CellRangeAddress; import org.apache.poi.xssf.streaming.SXSSFWorkbook; +import org.json.simple.JSONArray; +import org.json.simple.JSONObject; +import org.json.simple.parser.JSONParser; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -35,6 +39,7 @@ import itn.com.cmm.util.StringUtil; import itn.com.cmm.util.StringUtil2; import itn.com.utl.fcc.service.EgovStringUtil; import itn.let.kakao.admin.kakaoAt.service.MjonKakaoATVO; +import itn.let.kakao.kakaoComm.KakaoButtonVO; import itn.let.kakao.kakaoComm.KakaoReturnVO; import itn.let.kakao.kakaoComm.KakaoVO; import itn.let.kakao.kakaoComm.kakaoApi.KakaoApiTemplate; @@ -244,16 +249,36 @@ public class KakaoSentController { mjonKakaoATResultVO.setSmsTxt(StringUtil2.replaceBR(mjonKakaoATResultVO.getSmsTxt())); model.addAttribute("resultMsgDetail", mjonKakaoATResultVO); - // 템플릿 api 가져오기 - KakaoVO kakaoVO = new KakaoVO(); - kakaoVO.setSenderKey(mjonKakaoATResultVO.getMsgNoticetalkSenderKey()); - kakaoVO.setTemplateCode(mjonKakaoATResultVO.getMsgNoticetalkTmpKey()); + String msgType = mjonKakaoATResultVO.getMsgType(); - KakaoReturnVO kakaoTemplateInfo =kakaoApiTemplate.selectKakaoApiTemplateDetail(kakaoVO); - - model.addAttribute("kakaoTemplateInfo", kakaoTemplateInfo); - // //템플릿 api 가져오기 + if(msgType.equals("8")) {//카카오 알림톡인 경우 상세정보 처리 + + // 템플릿 api 가져오기 + KakaoVO kakaoVO = new KakaoVO(); + kakaoVO.setSenderKey(mjonKakaoATResultVO.getMsgNoticetalkSenderKey()); + kakaoVO.setTemplateCode(mjonKakaoATResultVO.getMsgNoticetalkTmpKey()); + + KakaoReturnVO kakaoTemplateInfo =kakaoApiTemplate.selectKakaoApiTemplateDetail(kakaoVO); + + model.addAttribute("kakaoTemplateInfo", kakaoTemplateInfo); + // //템플릿 api 가져오기 + + }else if(msgType.equals("9")) {//카카오 친구톡인 경우 상세정보 처리 + + //String smsTxt = mjonKakaoATResultVO.getSmsTxt(); + + KakaoReturnVO kakaoTemplateInfo = getKakaoFTSendTemplateInfo(mjonKakaoATResultVO); + //kakaoTemplateInfo.setTemplateContent(smsTxt); + + model.addAttribute("kakaoTemplateInfo", kakaoTemplateInfo); + + }else { + + model.addAttribute("kakaoTemplateInfo", ""); + + } + model.addAttribute("msgType", msgType); return "web/kakao/sent/KakaoSentDetailPopAjax"; } @@ -278,27 +303,45 @@ public class KakaoSentController { //발송 관리 문자발송 내용 상세보기 팝업 => 문자내용(MJ_MSG_DATA) MjonKakaoATVO mjonKakaoATResultVO = kakaoSentService.selectKakaoSentDetailData2Ajax(mjonKakaoATVO); - // 대체문자 엔터키 치환 - mjonKakaoATResultVO.setSmsTxtTrans(StringUtil2.replaceBR(mjonKakaoATResultVO.getSmsTxtTrans())); - // 강조형 타이틀이 있는지 없는지 구분 - if(StringUtil.isNotEmpty(mjonKakaoATResultVO.getBizKakaoTitle())) - { - String[] temp = mjonKakaoATResultVO.getBizKakaoTitle().split("§§"); - mjonKakaoATResultVO.setBizKakaoTitle01(temp[0]); - mjonKakaoATResultVO.setBizKakaoTitle02(temp[1]); + String msgType = mjonKakaoATResultVO.getMsgType(); + + if(msgType.equals("8")) { + + // 대체문자 엔터키 치환 + mjonKakaoATResultVO.setSmsTxtTrans(StringUtil2.replaceBR(mjonKakaoATResultVO.getSmsTxtTrans())); + + // 강조형 타이틀이 있는지 없는지 구분 + if(StringUtil.isNotEmpty(mjonKakaoATResultVO.getBizKakaoTitle())) + { + String[] temp = mjonKakaoATResultVO.getBizKakaoTitle().split("§§"); + mjonKakaoATResultVO.setBizKakaoTitle01(temp[0]); + mjonKakaoATResultVO.setBizKakaoTitle02(temp[1]); + } + + model.addAttribute("resultMsgDetail", mjonKakaoATResultVO); + + // 템플릿 api 가져오기 + KakaoVO kakaoVO = new KakaoVO(); + kakaoVO.setSenderKey(mjonKakaoATResultVO.getMsgNoticetalkSenderKey()); + kakaoVO.setTemplateCode(mjonKakaoATResultVO.getMsgNoticetalkTmpKey()); + + KakaoReturnVO kakaoTemplateInfo =kakaoApiTemplate.selectKakaoApiTemplateDetail(kakaoVO); + + model.addAttribute("kakaoTemplateInfo", kakaoTemplateInfo); + + }else if(msgType.equals("9")) { + + KakaoReturnVO kakaoTemplateInfo = getKakaoFTSendTemplateInfo(mjonKakaoATResultVO); + + model.addAttribute("kakaoTemplateInfo", kakaoTemplateInfo); + model.addAttribute("resultMsgDetail", mjonKakaoATResultVO); + + }else { + + model.addAttribute("kakaoTemplateInfo", ""); + } - - model.addAttribute("resultMsgDetail", mjonKakaoATResultVO); - - // 템플릿 api 가져오기 - KakaoVO kakaoVO = new KakaoVO(); - kakaoVO.setSenderKey(mjonKakaoATResultVO.getMsgNoticetalkSenderKey()); - kakaoVO.setTemplateCode(mjonKakaoATResultVO.getMsgNoticetalkTmpKey()); - - KakaoReturnVO kakaoTemplateInfo =kakaoApiTemplate.selectKakaoApiTemplateDetail(kakaoVO); - - model.addAttribute("kakaoTemplateInfo", kakaoTemplateInfo); return "web/kakao/sent/KakaoSentDetailPop2Ajax"; } @@ -846,5 +889,101 @@ public class KakaoSentController { } + + /* + * 20240122 우영두 추가 + * 친구톡 발송 결과 내용 팝업 처리 + * 발송 내용 처리 및 첨부 이미지, 버튼 정보 처리 + * + * */ + public KakaoReturnVO getKakaoFTSendTemplateInfo(MjonKakaoATVO kakaoATVO) throws Exception { + + KakaoReturnVO returnVO = new KakaoReturnVO(); + try { + + String tmpContent = kakaoATVO.getSmsTxtTrans(); + String jsonFilePath = kakaoATVO.getBizKakaoJsonFile(); + + //친구톡 이미지 또는 버튼 정보가 있다면 실행 + if(jsonFilePath != null && jsonFilePath.length() > 0) { + + FileReader reader = new FileReader(jsonFilePath); + int ch; + String resultStr = ""; + while ((ch = reader.read()) != -1) { + + resultStr = resultStr + (char)ch; + } + + JSONParser parser = new JSONParser(); + Object obj = parser.parse(resultStr); + JSONObject object = (JSONObject) obj; + + String image = (object.get("image") == null) ? null : object.get("image").toString(); + String button = (object.get("button") == null) ? null : object.get("button").toString(); + + if(image != null) { + + Object imagObj = parser.parse(image); + JSONObject jsonImgObj = (JSONObject) imagObj; + + System.out.println(jsonImgObj.toJSONString()); + + String imgUrl = (jsonImgObj.get("img_url") == null) ? null : jsonImgObj.get("img_url").toString(); + + System.out.println(imgUrl); + + returnVO.setTemplateEmphasizeType("IMAGE"); + returnVO.setTemplateImageUrl(imgUrl); + + } + + if(button != null) { + + JSONArray buttonJsonList = (JSONArray) object.get("button"); + + System.out.println(buttonJsonList.size()); + + List buttonList = new ArrayList(); + + for(int i=0; i < buttonJsonList.size(); i++) { + + JSONObject itemInfo = (JSONObject)buttonJsonList.get(i); + + String name = itemInfo.get("name").toString(); + + System.out.println(name); + + KakaoButtonVO buttonVO = new KakaoButtonVO(); + + buttonVO.setName(name); + + buttonList.add(buttonVO); + + } + + returnVO.setButtonList(buttonList); + + for(KakaoButtonVO butVO : returnVO.getButtonList()) { + + System.out.println("+++++++++++++ btn name ::: "+butVO.getName()); + + } + + } + + } + + //친구톡 내용 셋팅 + returnVO.setTemplateContent(tmpContent); + + } catch (Exception e) { + e.printStackTrace(); + } + + return returnVO; + + } + } diff --git a/src/main/java/itn/let/mjo/mjocommon/MjonCommon.java b/src/main/java/itn/let/mjo/mjocommon/MjonCommon.java index 988a3018..5979cde6 100644 --- a/src/main/java/itn/let/mjo/mjocommon/MjonCommon.java +++ b/src/main/java/itn/let/mjo/mjocommon/MjonCommon.java @@ -265,7 +265,12 @@ public class MjonCommon { String smisingSmsTxt = ""; //예약문자를 발송하는 경우 문자 내용 앞에 "[예약]" 표시되도록 처리 if(reserveYn.equals("Y")) { - reservSmsTxt = "[예약]" + smsTxt; + + if(atDelayYn.equals("Y")) {//예약문자 중 스미싱의심 일 경우 + reservSmsTxt = "[스미싱의심][예약]" + smsTxt; + }else { + reservSmsTxt = "[예약]" + smsTxt; + } smsTxt = reservSmsTxt; }else if(atDelayYn.equals("Y")) { @@ -280,7 +285,7 @@ public class MjonCommon { if(kakaoVO.getMsgType().equals("8")) { msgType = "[알림톡]"; }else if(kakaoVO.getMsgType().equals("9")){ - + msgType = "[친구톡]"; } sandName = "[" + userId + "]" + "[" + sandName + "]" + msgType; diff --git a/src/main/java/itn/let/mjo/msg/service/MjonMsgVO.java b/src/main/java/itn/let/mjo/msg/service/MjonMsgVO.java index 8b8402b6..2196bebb 100644 --- a/src/main/java/itn/let/mjo/msg/service/MjonMsgVO.java +++ b/src/main/java/itn/let/mjo/msg/service/MjonMsgVO.java @@ -6,7 +6,7 @@ import java.util.List; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import itn.com.cmm.ComDefaultVO; -import itn.com.cmm.MjonMsgTabulVO; +import itn.com.cmm.MjonMsgSendVO; import lombok.Getter; import lombok.Setter; @@ -305,6 +305,6 @@ public class MjonMsgVO extends ComDefaultVO{ private String detailType; - private List mjonMsgTabulListVO = new ArrayList<>(); + private List mjonMsgSendVOList = new ArrayList<>(); } diff --git a/src/main/java/itn/let/mjo/msgdata/service/ReplacementListsVO.java b/src/main/java/itn/let/mjo/msgdata/service/ReplacementListsVO.java deleted file mode 100644 index 7684dbe6..00000000 --- a/src/main/java/itn/let/mjo/msgdata/service/ReplacementListsVO.java +++ /dev/null @@ -1,59 +0,0 @@ -package itn.let.mjo.msgdata.service; - -import itn.let.mjo.msg.service.MjonMsgVO; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; - -@Getter -@Setter -@NoArgsConstructor -public class ReplacementListsVO { - String[] shortNameList; - String[] shortPhone; - String[] shortRep1; - String[] shortRep2; - String[] shortRep3; - String[] shortRep4; - int shortCnt; - - String[] longNameList; - String[] longPhone; - String[] longRep1; - String[] longRep2; - String[] longRep3; - String[] longRep4; - int longCnt; - - String[] imgNameList; - String[] imgPhone; - String[] imgRep1; - String[] imgRep2; - String[] imgRep3; - String[] imgRep4; - int imgCnt; - - // 배열을 초기화하는 메서드 - public void initializeLists(MjonMsgVO mjonMsgVO) { - shortNameList = new String[Integer.parseInt(mjonMsgVO.getShortMsgCnt())]; - shortPhone = new String[shortNameList.length]; - shortRep1 = new String[shortNameList.length]; - shortRep2 = new String[shortNameList.length]; - shortRep3 = new String[shortNameList.length]; - shortRep4 = new String[shortNameList.length]; - - longNameList = new String[Integer.parseInt(mjonMsgVO.getLongMsgCnt())]; - longPhone = new String[longNameList.length]; - longRep1 = new String[longNameList.length]; - longRep2 = new String[longNameList.length]; - longRep3 = new String[longNameList.length]; - longRep4 = new String[longNameList.length]; - - imgNameList = new String[mjonMsgVO.getCallToList().length]; - imgPhone = new String[imgNameList.length]; - imgRep1 = new String[imgNameList.length]; - imgRep2 = new String[imgNameList.length]; - imgRep3 = new String[imgNameList.length]; - imgRep4 = new String[imgNameList.length]; - } -} diff --git a/src/main/java/itn/let/mjo/msgdata/service/impl/MjonMsgDataServiceImpl.java b/src/main/java/itn/let/mjo/msgdata/service/impl/MjonMsgDataServiceImpl.java index b12dbcc3..c2587a13 100644 --- a/src/main/java/itn/let/mjo/msgdata/service/impl/MjonMsgDataServiceImpl.java +++ b/src/main/java/itn/let/mjo/msgdata/service/impl/MjonMsgDataServiceImpl.java @@ -27,6 +27,7 @@ import egovframework.rte.fdl.idgnr.EgovIdGnrService; import egovframework.rte.fdl.security.userdetails.util.EgovUserDetailsHelper; import egovframework.rte.psl.dataaccess.util.EgovMap; import itn.com.cmm.LoginVO; +import itn.com.cmm.MjonMsgSendVO; import itn.com.cmm.util.MJUtil; import itn.com.cmm.util.MsgSendUtils; import itn.com.cmm.util.StringUtil; @@ -47,7 +48,6 @@ import itn.let.mjo.msgagent.service.impl.MjonMsgAgentStsDAO; import itn.let.mjo.msgdata.service.MjonMsgDataService; import itn.let.mjo.msgdata.service.MjonMsgDataVO; import itn.let.mjo.msgdata.service.MjonMsgReturnVO; -import itn.let.mjo.msgdata.service.ReplacementListsVO; import itn.let.mjo.msgholiday.service.MsgAlarmSetVO; import itn.let.mjo.msgholiday.service.MsgHolidayVO; import itn.let.mjo.msgholiday.service.impl.MsgHolidayDAO; @@ -4022,6 +4022,7 @@ public class MjonMsgDataServiceImpl extends EgovAbstractServiceImpl implements M smsTxt = "(광고)"+smsTxt +"\n"+"무료거부 0808800858"; } + mjonMsgVO.setSmsTxt(smsTxt); log.debug(" :: smsTxt :: [{}]", smsTxt); @@ -4034,16 +4035,6 @@ public class MjonMsgDataServiceImpl extends EgovAbstractServiceImpl implements M log.debug(" + mjonMsgVO.getFileCnt() :: [{}]", mjonMsgVO.getFileCnt()); - ////////////////////////////////// - ////////////////////////////////// - ////////////////////////////////// - if(true) { - return new StatusResponse(HttpStatus.BAD_REQUEST, "문자 테스트 실패"); - } - ////////////////////////////////// - ////////////////////////////////// - ////////////////////////////////// - /* * 화면에서 넘어오는 단가 금액 및 총 결제 캐시 금액 체크 해주기 @@ -4052,23 +4043,23 @@ public class MjonMsgDataServiceImpl extends EgovAbstractServiceImpl implements M * 파라미터로 넘어온 개별단가(eachPrice), 총 결제캐시(totPrice)를 비요하여 동일하지 않으면 컨트롤러에서 계산한 금액으로 입력해줌. */ - int smsTxtByte = MsgSendUtils.getSmsTxtBytes(mjonMsgVO.getSmsTxt()); - if(smsTxtByte > 2000) { - return new StatusResponse(HttpStatus.BAD_REQUEST, "문자 내용은 2000Byte를 넘을 수 없습니다."); - } +// int smsTxtByte = MsgSendUtils.getSmsTxtBytes(mjonMsgVO.getSmsTxt()); +// if(smsTxtByte > 2000) { +// return new StatusResponse(HttpStatus.BAD_REQUEST, "문자 내용은 2000Byte를 넘을 수 없습니다."); +// } // MSG_TYPE 설정 - String msgType = MsgSendUtils.getMsgType(mjonMsgVO, smsTxtByte); - if ("INVALID".equals(msgType)) { - return new StatusResponse(HttpStatus.BAD_REQUEST, "문자 내용은 2000Byte를 넘을 수 없습니다."); - } - mjonMsgVO.setMsgType(msgType); - - - - MjonEventVO mjonEventVO = new MjonEventVO(); - mjonEventVO.setMberId(userId); +// String msgType = MsgSendUtils.getMsgType(mjonMsgVO, smsTxtByte); +// if ("INVALID".equals(msgType)) { +// return new StatusResponse(HttpStatus.BAD_REQUEST, "문자 내용은 2000Byte를 넘을 수 없습니다."); +// } +// mjonMsgVO.setMsgType(msgType); + + ///////////////////////////////////////////////////////////////////////////// + // 금액 관련은 끝에서 이벤트 발송 / 기존금액 박송으로 나눠야하기 때문에 나중에 수정 + ///////////////////////////////////////////////////////////////////////////// + /* //1.시스템 기본 단가 정보 불러오기 JoinSettingVO sysJoinSetVO = mjonMsgDataService.selectJoinSettingInfo(); @@ -4089,8 +4080,12 @@ public class MjonMsgDataServiceImpl extends EgovAbstractServiceImpl implements M // 기존 소수점 2째자리에서 반올림하였으나, 정책 변경으로 소수점 버림 처리함 // boolean compareEndDate = false; float paramEachPrice = Float.parseFloat(mjonMsgVO.getEachPrice()); + + MjonEventVO mjonEventVO = new MjonEventVO(); + mjonEventVO.setMberId(userId); + MjonEventVO eventMberInfo = mjonEventService.selectEventMsgMberDefaultInfo(mjonEventVO); // 호출부에서 handleEventStatus를 호출하고 예외 처리를 추가 @@ -4113,7 +4108,10 @@ public class MjonMsgDataServiceImpl extends EgovAbstractServiceImpl implements M picture3Price = Float.parseFloat(eventMberInfo.getEventPicture3Price()); } } - + + + + // 토탈금액 "," 리플레이스 처리 mjonMsgVO.setTotPrice(mjonMsgVO.getTotPrice().replaceAll(",", "")); @@ -4126,35 +4124,83 @@ public class MjonMsgDataServiceImpl extends EgovAbstractServiceImpl implements M int tmpTotCallCnt = mjonMsgVO.getCallToList().length; float tmpTotPrice = tmpTotCallCnt * tmpEachPrice; mjonMsgVO.setTotPrice(Float.toString(tmpTotPrice)); - +*/ + ///////////////////////////////////////////////////////////////////////////// + // 금액 관련은 끝에서 이벤트 발송 / 기존금액 박송으로 나눠야하기 때문에 나중에 수정 + ///////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////// // 치환 여부 //////////////////////////////////////////////// - if (MsgSendUtils.isReplacementRequired(mjonMsgVO)) { + List mjonMsgSendVOList = mjonMsgVO.getMjonMsgSendVOList(); +// if (MsgSendUtils.isRepleasYN(mjonMsgVO)) { - if (!MsgSendUtils.validateReplacementData(mjonMsgVO, statusResponse)) { - //특정문구 일괄변환 치환문자 데이터가 없습니다. - return statusResponse; // 유효성 검사 실패 시 처리 - } +// if (!MsgSendUtils.validateReplacementData(mjonMsgVO, mjonMsgTabulVO)) { +// //특정문구 일괄변환 치환문자 데이터가 없습니다. +// return statusResponse; // 유효성 검사 실패 시 처리 +// } - - // 치환 문자 리스트 생성 - ReplacementListsVO intiLists = MsgSendUtils.createReplacementLists(mjonMsgVO); - if(!MsgSendUtils.populateReplacementLists(mjonMsgVO ,intiLists, statusResponse)) {; - //문자 치환 후 전송 문자 길이를 초과하였습니다. - //문자 치환 중 오류가 발생하였습니다. - return statusResponse; - } - - // 발송 처리 - statusResponse = processMessageSending(mjonMsgVO, intiLists, statusResponse); - } else { - // 일반 문자 발송 - statusResponse = fncSendMsg(mjonMsgVO); + + log.info(" ++ mjonMsgVO.getSpamStatus() :: [{}]", mjonMsgVO.getSpamStatus()); + // smstxt 치환 및 스팸체크 후 mjonMsgSendVOList 에 add() + List resultSpamTxt = mjonMsgDataService.selectSpamKeywordList(); + if(!MsgSendUtils.populateSendLists(mjonMsgVO, mjonMsgSendVOList, statusResponse, resultSpamTxt)) {; + //문자 치환 후 전송 문자 길이를 초과하였습니다. + //문자 치환 중 오류가 발생하였습니다. + return statusResponse; } + log.info(" ++ mjonMsgVO.getSpamStatus() :: [{}]", mjonMsgVO.getSpamStatus()); + + + // 수신목록 셋팅 + + + + // 수신거부 목록 불러오기 + List userBlockList = mjonMsgDAO.selectUserBlockList(mjonMsgVO); + + List dupliBlockList = MJUtil.getDuplicateList(userBlockList); + int usrBlockCnt = dupliBlockList.size(); + + + + + + + + + + + + + +// mjonMsgSendVOList.stream().forEach(t-> System.out.println(t.toString())); + +// mjonMsgSendVOList.stream() +// .map(MjonMsgSendVO::getSmsTxt) // 각 객체의 getSmsTxt() 호출 +// .forEach(System.out::println); // 결과를 바로 출력 + + + + + ////////////////////////////////// + ////////////////////////////////// + ////////////////////////////////// +// if(true) { +// return new StatusResponse(HttpStatus.BAD_REQUEST, "문자 테스트 실패"); +// } + ////////////////////////////////// + ////////////////////////////////// + ////////////////////////////////// + + // 발송 처리 +// statusResponse = processMessageSending(mjonMsgVO, intiLists, statusResponse); +// } else { +// // 일반 문자 발송 +// statusResponse = fncSendMsg(mjonMsgVO); +// } return statusResponse; @@ -4208,6 +4254,7 @@ public class MjonMsgDataServiceImpl extends EgovAbstractServiceImpl implements M String imgFilePath = mjonMsgDAO.selectPhotoImgFileRealPath(fileId[i]); + log.info("imgFilePath : [{}]", imgFilePath); if (StringUtils.isEmpty(imgFilePath)) { statusResponse.setStatus(HttpStatus.NO_CONTENT); statusResponse.setMessage("문자 메세지 이미지 추가에 오류가 발생하여 문자 발송이 취소 되었습니다."); @@ -4262,7 +4309,7 @@ public class MjonMsgDataServiceImpl extends EgovAbstractServiceImpl implements M - + /* // 그림 문자 발송 처리 메서드 private StatusResponse processMessageSending(MjonMsgVO mjonMsgVO, ReplacementListsVO lists, StatusResponse statusResponse) throws Exception { @@ -4288,7 +4335,7 @@ public class MjonMsgDataServiceImpl extends EgovAbstractServiceImpl implements M return statusResponse; } - +*/ private Map fncSendMsgRtnMap(MjonMsgVO mjonMsgVO) throws Exception { Map returnMap = new HashMap(); @@ -4437,6 +4484,8 @@ public class MjonMsgDataServiceImpl extends EgovAbstractServiceImpl implements M * 20241002 이호영 * 치환 후 장문, 단문이 모두 있을 수 있기 때문에 아래 로직처럼 모든 if를 열어둠 */ + + /* private Map sendMessages(MjonMsgVO msgVO, ReplacementListsVO lists) throws Exception { Map resultMap = new HashMap<>(); @@ -4568,8 +4617,9 @@ public class MjonMsgDataServiceImpl extends EgovAbstractServiceImpl implements M return fncSendMsgRtnMap(msgVO); */ + /* } - +*/ // 20240924 이호영 // 이벤트 상태를 처리하는 메서드 @@ -4622,7 +4672,8 @@ public class MjonMsgDataServiceImpl extends EgovAbstractServiceImpl implements M // Step 1: 메시지 내용이 있는지 확인 후 msgType 정하기 - String msgType = checkMessageContent(mjonMsgVO); +// String msgType = checkMessageContent(mjonMsgVO); + String msgType = ""; if (msgType == null) { return new StatusResponse(HttpStatus.BAD_REQUEST, "입력 문자 내용을 확인할 수 없습니다. 문자 내용을 입력해 주세요."); } @@ -4677,27 +4728,27 @@ public class MjonMsgDataServiceImpl extends EgovAbstractServiceImpl implements M * @throws IllegalArgumentException 메시지 길이가 초과된 경우 예외 발생 * @작성자 20241007 이호영 */ - private String checkMessageContent(MjonMsgVO mjonMsgVO) { - try { - // 문자 바이트 계산을 MsgSendUtils의 유틸리티 메서드를 사용하여 처리 - int smsBytes = MsgSendUtils.getSmsTxtBytes(mjonMsgVO.getSmsTxt()); - - // 메시지 내용이 없는 경우 null 반환 - if (smsBytes < 1) { - return null; - } - - // 메시지 타입 결정 로직을 MsgSendUtils의 getMsgType 메서드를 사용하여 처리 - String msgType = MsgSendUtils.getMsgType(mjonMsgVO, smsBytes); - if ("INVALID".equals(msgType)) { - return "INVALID"; - } - - return msgType; - } catch (UnsupportedEncodingException e) { - throw new IllegalArgumentException("문자 인코딩 중 오류가 발생하였습니다.", e); - } - } +// private String checkMessageContent(MjonMsgVO mjonMsgVO) { +// try { +// // 문자 바이트 계산을 MsgSendUtils의 유틸리티 메서드를 사용하여 처리 +// int smsBytes = MsgSendUtils.getSmsTxtBytes(mjonMsgVO.getSmsTxt()); +// +// // 메시지 내용이 없는 경우 null 반환 +// if (smsBytes < 1) { +// return null; +// } +// +// // 메시지 타입 결정 로직을 MsgSendUtils의 getMsgType 메서드를 사용하여 처리 +// String msgType = MsgSendUtils.getMsgType(mjonMsgVO, smsBytes); +// if ("INVALID".equals(msgType)) { +// return "INVALID"; +// } +// +// return msgType; +// } catch (UnsupportedEncodingException e) { +// throw new IllegalArgumentException("문자 인코딩 중 오류가 발생하였습니다.", e); +// } +// } diff --git a/src/main/java/itn/let/mjo/msgdata/web/MjonMsgDataController.java b/src/main/java/itn/let/mjo/msgdata/web/MjonMsgDataController.java index 6aa3a33b..c17fa903 100644 --- a/src/main/java/itn/let/mjo/msgdata/web/MjonMsgDataController.java +++ b/src/main/java/itn/let/mjo/msgdata/web/MjonMsgDataController.java @@ -69,7 +69,7 @@ import egovframework.rte.ptl.mvc.tags.ui.pagination.PaginationInfo; import itn.com.cmm.EgovMessageSource; import itn.com.cmm.JsonResult; import itn.com.cmm.LoginVO; -import itn.com.cmm.MjonMsgTabulVO; +import itn.com.cmm.MjonMsgSendVO; import itn.com.cmm.service.EgovFileMngService; import itn.com.cmm.service.EgovFileMngUtil; import itn.com.cmm.service.FileVO; @@ -2071,6 +2071,7 @@ public class MjonMsgDataController { String parserStr = ComGetSpamStringParser.getSpamTextParse(spmTxt).trim(); System.out.println("spmTxt : "+ spmTxt); + System.out.println("parserStr : "+ parserStr); if(resultParser.contains(parserStr)) { //스팸 단어/문구가 있으면 콤마로 연결시킨 후 리턴해줌. spmFilterTxt += spmTxt + ","; @@ -3077,6 +3078,7 @@ public class MjonMsgDataController { String smishingYn = "N"; String spamStatus = mjonMsgVO.getSpamStatus(); //스미싱 의심으로 체크된 문자 정보 + UserManageVO userManageVO = new UserManageVO(); userManageVO.setMberId(userId); @@ -3172,8 +3174,8 @@ public class MjonMsgDataController { ModelMap model) throws Exception { // 디버깅 출력 - System.out.println("mjonMsgVO : " + mjonMsgVO.getMjonMsgTabulListVO().toString()); - System.out.println("mjonMsgVO : " + mjonMsgVO.getMjonMsgTabulListVO().size()); + System.out.println("mjonMsgVO : " + mjonMsgVO.getMjonMsgSendVOList().toString()); + System.out.println("mjonMsgVO : " + mjonMsgVO.getMjonMsgSendVOList().size()); return ResponseEntity.ok().body(mjonMsgDataService.sendMsgData_advc(mjonMsgVO, request)) ; // return null; diff --git a/src/main/java/itn/let/mjo/spammsg/web/ComGetSpamStringParser.java b/src/main/java/itn/let/mjo/spammsg/web/ComGetSpamStringParser.java index f68c6f82..dd67bafa 100644 --- a/src/main/java/itn/let/mjo/spammsg/web/ComGetSpamStringParser.java +++ b/src/main/java/itn/let/mjo/spammsg/web/ComGetSpamStringParser.java @@ -6,156 +6,128 @@ import itn.let.hangulparser.HangulParser; public class ComGetSpamStringParser { - /* - * 스팸 문자 필터링을 위한 변형된 한글 SMS 문장의 정규화 기법을 기반으로 개발 - * Kang Seung-Shik - * - * 20230419 - * */ - - //이상문자열 파싱 후 결합하여 - public static String getSpamTextParse(String strString) throws Exception { - - String smsTxt = strString; - String repSmsTxt = smsTxt.replaceAll("[^ㄱ-ㅎㅏ-ㅣ가-힣a-zA-Z0-9①ⓒ⒪㈄β]", ""); //한글, 영문, 숫자 이외의 문자는 제거 - String[] split = repSmsTxt.split(" "); //띄어쓰기를 기준으로 분할 - String reMakeStringText = ""; - - try { - - for(String txt : split) { - - for(int i=0; i < txt.length(); i++) { - - char test = txt.charAt(i); - if(test >= 0xAC00) {//한글 문자이면 스킵 - continue; - }else { - - String tmpStr = Character.toString(test); - if(tmpStr.matches(".*[ㄱ-ㅎ]+.*")) { - - String nextCharAt = Character.toString(txt.charAt(i+1));//현재 단어 다음 단어가 어떤것인지 가져온다. - if(i == txt.length() - 1 ) {//일단 마지막 자음은 스킵 한다. - break; - }/*else if(!nextCharAt.matches(".*[ㄱ-ㅎㅏ-ㅣa-zA-Z]+.*")) {//현재 자음이면서 다음글자가 자/모음이 아니면 삭제 액ㄱ정 이런 경우 삭제하려고 함. - txt = txt.replace(tmpStr, ""); - break; - }*/ - - - if(nextCharAt.matches(".*[a-zA-Z]+.*")) {//다음 단어가 영문이면 영문과 유사한 한글 모음을 찾아서 합쳐준다. - - String repCharAt = getEngToHanglue(nextCharAt); - String repStringChar = tmpStr + repCharAt; - - String repTxt = tmpStr + nextCharAt; - - txt = txt.replace(repTxt, repStringChar); - //System.out.println(txt); - - - }/*else if(nextCharAt.matches(".*[ㅏ-ㅣ]+.*")) {//다음 단어가 모음이면 앞 자음과 합쳐 주기 - - String repStringChar = tmpStr + nextCharAt; - //String norString = Normalizer.normalize(repStringChar, Normalizer.Form.NFC); - //System.out.println(repStringChar); - - //txt = txt.replace(repStringChar, repStringChar);//분리된 자믐, 모음을 합쳐진 한 단어로 치환해준다. - - //System.out.println(txt); - - }*/ - - }else if(tmpStr.matches(".*[a-zA-Z]+.*")) {//영문단어가 나오면 앞뒤 단어 체크하여 연관성 없으면 삭제 처리. - - String engStr = tmpStr; - if(i < txt.length() - 1) {//마지막 글자 제외 - char nextEngChar = txt.charAt(i+1); - if(i > 0) {//첫글자가 영문인 경우 제외 - - char befEngChar = txt.charAt(i-1); - - //한글 단어사이에 영문자 한글자만 있는 경우 삭제 처리함. - if(nextEngChar >= 0xAC00 && befEngChar >= 0xAC00) { - - if(tmpStr.toLowerCase().equals("b")) {//B를 넣어서 한글로 읽힐수 있게도 함, 서B스 와 같은 형태 - txt = txt.replace(engStr, "비"); - }else { - txt = txt.replace(engStr, ""); - } - } - - } - - }else { - - char befEngChar = txt.charAt(i-1); - //마지막 글자이고 앞글자가 한글이면 마지막 영단어 삭제 처리 - if(befEngChar >= 0xAC00) { - txt = txt.replace(engStr, ""); - //continue; - } - - } - - }else if(tmpStr.matches(".*[0-9]+.*")) { - - if(i-1 < 0) {//한글자만 있는경우 패스 - continue; - } - - String befString = Character.toString(txt.charAt(i-1)); - - if(befString.matches(".*[ㄱ-ㅎ]+.*")) {//이전 글자가 자음이면 변환 문자 체크 - - String numToStr = getNumberToString(tmpStr); //숫자를 모음으로 변환 처리 - - String orgStringChar = befString + tmpStr; //원래 앞자음 + 숫자 - String repStringChar = befString + numToStr; //원래 앞자음 + 숫자를 변환한 모음 - - txt = txt.replace(orgStringChar, repStringChar);//분리된 자믐, 모음을 합쳐진 한 단어로 치환해준다. - //System.out.println(txt); - - }else { - //숫자면 스킵 - continue; - } - - }else { - //특수문자들 처리 - String repSpcStr = getRepSpacialString(tmpStr); - if(!repSpcStr.equals("")) {//변환문자가 있는경우만 치환 - txt = txt.replace(tmpStr, repSpcStr); - } - - } - - } - - } - - reMakeStringText = reMakeStringText + " " + txt; - + /** + * @methodName : getSpamTextParse + * @author : 이호영 + * @date : 2024.11.13 + * @description : 리펙토링 + * 원본 : ComGetSpamStringParser_advc_backup_20241113.java + * @param strString + * @return + * @throws Exception + */ + public static String getSpamTextParse(String strString) throws Exception { + String smsTxt = strString; + String repSmsTxt = smsTxt.replaceAll("[^ㄱ-ㅎㅏ-ㅣ가-힣a-zA-Z0-9①ⓒ⒪㈄β]", ""); // 한글, 영문, 숫자 이외의 문자는 제거 + String[] split = repSmsTxt.split(" "); + StringBuilder reMakeStringText = new StringBuilder(); + + try { + for (String txt : split) { + txt = processCharacters(txt); + reMakeStringText.append(" ").append(txt); } - - //System.out.println("++++++++++++++ ::: "+reMakeStringText); - //넘어오는 모든 글자에서 한글에 대해서 자/모음을 분리해준다. - List jasoList = HangulParser.disassemble(reMakeStringText); - - //분리된 자/모음 리스트를 다시 한글로 합쳐준다. + + // 분리된 자/모음을 합쳐 최종 문자열 생성 + List jasoList = HangulParser.disassemble(reMakeStringText.toString()); String assembleStr = HangulParser.assemble(jasoList); - - reMakeStringText = assembleStr; - + + return assembleStr; + } catch (Exception e) { - System.out.println("++++++++++ getSpamTextParse Error !!! "+e); + System.out.println("++++++++++ getSpamTextParse Error !!! " + e); return "getSpamTextParse 오류가 발생하였습니다."; } - - return reMakeStringText; - + } + + // 한 단어 내 각 문자에 대한 처리 로직 + private static String processCharacters(String txt) throws Exception { + StringBuilder processedText = new StringBuilder(txt); + + for (int i = 0; i < txt.length(); i++) { + char currentChar = txt.charAt(i); + if (isKorean(currentChar)) continue; + + String tmpStr = Character.toString(currentChar); + + // 자음, 영문, 숫자, 특수문자 각각에 대한 처리 + if (isKoreanConsonant(tmpStr)) { + txt = handleConsonant(txt, tmpStr, i); + } else if (isEnglish(tmpStr)) { + txt = handleEnglish(txt, tmpStr, i); + } else if (isNumber(tmpStr)) { + txt = handleNumber(txt, tmpStr, i); + } else { + txt = handleSpecialCharacter(txt, tmpStr); + } + } + + return processedText.toString(); + } + + // 자음 처리 로직 + private static String handleConsonant(String txt, String tmpStr, int index) throws Exception { + if (index == txt.length() - 1) return txt; + + String nextCharAt = Character.toString(txt.charAt(index + 1)); + if (isEnglish(nextCharAt)) { + String repCharAt = getEngToHanglue(nextCharAt); + txt = txt.replace(tmpStr + nextCharAt, tmpStr + repCharAt); + } + return txt; + } + + // 영문 처리 로직 + private static String handleEnglish(String txt, String engStr, int index) { + if (index < txt.length() - 1 && index > 0) { + char nextChar = txt.charAt(index + 1); + char previousChar = txt.charAt(index - 1); + if (isKorean(previousChar) && isKorean(nextChar)) { + txt = txt.replace(engStr, engStr.equalsIgnoreCase("b") ? "비" : ""); + } + } else if (index > 0 && isKorean(txt.charAt(index - 1))) { + txt = txt.replace(engStr, ""); + } + return txt; + } + + // 숫자 처리 로직 + private static String handleNumber(String txt, String tmpStr, int index) throws Exception { + if (index == 0) return txt; + String previousStr = Character.toString(txt.charAt(index - 1)); + + if (isKoreanConsonant(previousStr)) { + String numToStr = getNumberToString(tmpStr); + txt = txt.replace(previousStr + tmpStr, previousStr + numToStr); + } + return txt; + } + + // 특수문자 처리 로직 + private static String handleSpecialCharacter(String txt, String tmpStr) throws Exception { + String repSpcStr = getRepSpacialString(tmpStr); + if (!repSpcStr.isEmpty()) { + txt = txt.replace(tmpStr, repSpcStr); + } + return txt; + } + + // 문자 유형 판별 메서드 + private static boolean isKorean(char ch) { + return ch >= 0xAC00; + } + + private static boolean isKoreanConsonant(String str) { + return str.matches(".*[ㄱ-ㅎ]+.*"); + } + + private static boolean isEnglish(String str) { + return str.matches(".*[a-zA-Z]+.*"); + } + + private static boolean isNumber(String str) { + return str.matches(".*[0-9]+.*"); } /* diff --git a/src/main/java/itn/let/mjo/spammsg/web/ComGetSpamStringParser_advc_backup_20241113.java b/src/main/java/itn/let/mjo/spammsg/web/ComGetSpamStringParser_advc_backup_20241113.java new file mode 100644 index 00000000..8781e949 --- /dev/null +++ b/src/main/java/itn/let/mjo/spammsg/web/ComGetSpamStringParser_advc_backup_20241113.java @@ -0,0 +1,249 @@ +package itn.let.mjo.spammsg.web; + +import java.util.List; + +import itn.let.hangulparser.HangulParser; + +public class ComGetSpamStringParser_advc_backup_20241113 { + + /* + * 스팸 문자 필터링을 위한 변형된 한글 SMS 문장의 정규화 기법을 기반으로 개발 + * Kang Seung-Shik + * + * 20230419 + * */ + + //이상문자열 파싱 후 결합하여 + public static String getSpamTextParse(String strString) throws Exception { + + String smsTxt = strString; + String repSmsTxt = smsTxt.replaceAll("[^ㄱ-ㅎㅏ-ㅣ가-힣a-zA-Z0-9①ⓒ⒪㈄β]", ""); //한글, 영문, 숫자 이외의 문자는 제거 + String[] split = repSmsTxt.split(" "); //띄어쓰기를 기준으로 분할 + String reMakeStringText = ""; + + try { + + for(String txt : split) { + + for(int i=0; i < txt.length(); i++) { + + char test = txt.charAt(i); + if(test >= 0xAC00) {//한글 문자이면 스킵 + continue; + }else { + + String tmpStr = Character.toString(test); + if(tmpStr.matches(".*[ㄱ-ㅎ]+.*")) { + + String nextCharAt = Character.toString(txt.charAt(i+1));//현재 단어 다음 단어가 어떤것인지 가져온다. + + if(i == txt.length() - 1 ) {//일단 마지막 자음은 스킵 한다. + break; + }/*else if(!nextCharAt.matches(".*[ㄱ-ㅎㅏ-ㅣa-zA-Z]+.*")) {//현재 자음이면서 다음글자가 자/모음이 아니면 삭제 액ㄱ정 이런 경우 삭제하려고 함. + txt = txt.replace(tmpStr, ""); + break; + }*/ + + + if(nextCharAt.matches(".*[a-zA-Z]+.*")) {//다음 단어가 영문이면 영문과 유사한 한글 모음을 찾아서 합쳐준다. + + String repCharAt = getEngToHanglue(nextCharAt); + String repStringChar = tmpStr + repCharAt; + + String repTxt = tmpStr + nextCharAt; + + txt = txt.replace(repTxt, repStringChar); + //System.out.println(txt); + + + }/*else if(nextCharAt.matches(".*[ㅏ-ㅣ]+.*")) {//다음 단어가 모음이면 앞 자음과 합쳐 주기 + + String repStringChar = tmpStr + nextCharAt; + //String norString = Normalizer.normalize(repStringChar, Normalizer.Form.NFC); + //System.out.println(repStringChar); + + //txt = txt.replace(repStringChar, repStringChar);//분리된 자믐, 모음을 합쳐진 한 단어로 치환해준다. + + //System.out.println(txt); + + }*/ + + }else if(tmpStr.matches(".*[a-zA-Z]+.*")) {//영문단어가 나오면 앞뒤 단어 체크하여 연관성 없으면 삭제 처리. + + String engStr = tmpStr; + if(i < txt.length() - 1) {//마지막 글자 제외 + char nextEngChar = txt.charAt(i+1); + if(i > 0) {//첫글자가 영문인 경우 제외 + + char befEngChar = txt.charAt(i-1); + + //한글 단어사이에 영문자 한글자만 있는 경우 삭제 처리함. + if(nextEngChar >= 0xAC00 && befEngChar >= 0xAC00) { + + if(tmpStr.toLowerCase().equals("b")) {//B를 넣어서 한글로 읽힐수 있게도 함, 서B스 와 같은 형태 + txt = txt.replace(engStr, "비"); + }else { + txt = txt.replace(engStr, ""); + } + } + + } + + }else { + + char befEngChar = txt.charAt(i-1); + //마지막 글자이고 앞글자가 한글이면 마지막 영단어 삭제 처리 + if(befEngChar >= 0xAC00) { + txt = txt.replace(engStr, ""); + //continue; + } + + } + + }else if(tmpStr.matches(".*[0-9]+.*")) { + + if(i-1 < 0) {//한글자만 있는경우 패스 + continue; + } + + String befString = Character.toString(txt.charAt(i-1)); + + if(befString.matches(".*[ㄱ-ㅎ]+.*")) {//이전 글자가 자음이면 변환 문자 체크 + + String numToStr = getNumberToString(tmpStr); //숫자를 모음으로 변환 처리 + + String orgStringChar = befString + tmpStr; //원래 앞자음 + 숫자 + String repStringChar = befString + numToStr; //원래 앞자음 + 숫자를 변환한 모음 + + txt = txt.replace(orgStringChar, repStringChar);//분리된 자믐, 모음을 합쳐진 한 단어로 치환해준다. + //System.out.println(txt); + + }else { + //숫자면 스킵 + continue; + } + + }else { + //특수문자들 처리 + String repSpcStr = getRepSpacialString(tmpStr); + if(!repSpcStr.equals("")) {//변환문자가 있는경우만 치환 + txt = txt.replace(tmpStr, repSpcStr); + } + + } + + } + + } + + reMakeStringText = reMakeStringText + " " + txt; + + } + + //System.out.println("++++++++++++++ ::: "+reMakeStringText); + //넘어오는 모든 글자에서 한글에 대해서 자/모음을 분리해준다. + List jasoList = HangulParser.disassemble(reMakeStringText); + + //분리된 자/모음 리스트를 다시 한글로 합쳐준다. + String assembleStr = HangulParser.assemble(jasoList); + + reMakeStringText = assembleStr; + + } catch (Exception e) { + System.out.println("++++++++++ getSpamTextParse Error !!! "+e); + return "getSpamTextParse 오류가 발생하였습니다."; + } + + return reMakeStringText; + + } + + /* + * + * 한글과 유사한 영문자를 변환 처리함 + * + * */ + public static String getEngToHanglue(String strWord) throws Exception { + + String returnStr = ""; + + try { + + if(strWord.toLowerCase().equals("r")) { + + returnStr = "ㅏ"; + + }else if(strWord.toLowerCase().equals("h")) { + + returnStr = "ㅐ"; + + }else if(strWord.toLowerCase().equals("i") || strWord.toLowerCase().equals("I") || strWord.toLowerCase().equals("l")) { + + returnStr = "ㅣ"; + + } + + } catch (Exception e) { + System.out.println("++++++++++++++ getEngToHanglue Error !!! "+e); + } + + return returnStr; + } + + + /* + * + * 한글과 유사한 숫자를 변환처리함 + * + * */ + public static String getNumberToString(String strWord) throws Exception { + + String returnStr = ""; + + try { + + if(strWord.equals("1")) { + + returnStr = "ㅣ"; + + } + + } catch (Exception e) { + System.out.println("++++++++++++++ getNumberToString Error !!! "+e); + } + + return returnStr; + } + + /* + * + * 한글과 유사한 특수문자들 변환처리함 + * + * */ + public static String getRepSpacialString(String strWord) throws Exception{ + + String returnStr = ""; + + try { + + if(strWord.equals("ⓒ")) { + returnStr = "c"; + }else if(strWord.equals("β")) { + returnStr = "비"; + }else if(strWord.equals("⒪")) { + returnStr = "ㅇ"; + }else if(strWord.equals("㈄")) { + returnStr = "ㅁ"; + }else if(strWord.equals("①")) { + returnStr = "ㅣ"; + } + + } catch (Exception e) { + System.out.println("++++++++++++++ getRepSpacialString Error !!! "+e); + } + + return returnStr; + + } + +} diff --git a/src/main/java/itn/let/schdlr/service/impl/SchdlrManageServiceImpl.java b/src/main/java/itn/let/schdlr/service/impl/SchdlrManageServiceImpl.java index 2e7928a4..624b6ee7 100644 --- a/src/main/java/itn/let/schdlr/service/impl/SchdlrManageServiceImpl.java +++ b/src/main/java/itn/let/schdlr/service/impl/SchdlrManageServiceImpl.java @@ -425,8 +425,12 @@ public class SchdlrManageServiceImpl extends EgovAbstractServiceImpl implements //카카오 환불 처리 리스트 public void kakaoFailPayBack() throws Exception { + //카카오 알림톡 환불 처리 kakaoAlimTalkService.selectKakaoAtSentRefundList(); + //카카오 친구톡 환불 처리 + kakaoAlimTalkService.selectKakaoFtSentRefundList(); + } @Override diff --git a/src/main/java/itn/let/sym/site/service/JoinSettingVO.java b/src/main/java/itn/let/sym/site/service/JoinSettingVO.java index 8dc3b39d..a76eca53 100644 --- a/src/main/java/itn/let/sym/site/service/JoinSettingVO.java +++ b/src/main/java/itn/let/sym/site/service/JoinSettingVO.java @@ -36,6 +36,7 @@ public class JoinSettingVO { private float customEdit3Price; // 이미지 편집(첨부이미지 3장이하) private float customTextPrice; // 텍스트 단순수정 private float kakaoAtPrice; // 카카오 알림톡 단가 + private float kakaoFtPrice; // 카카오 친구톡 단가 private float faxPrice; // 팩스 단가 private float refundPer; //환불 비율 @@ -210,6 +211,14 @@ public class JoinSettingVO { this.kakaoAtPrice = kakaoAtPrice; } + public float getKakaoFtPrice() { + return kakaoFtPrice; + } + + public void setKakaoFtPrice(float kakaoFtPrice) { + this.kakaoFtPrice = kakaoFtPrice; + } + public float getFaxPrice() { return faxPrice; } diff --git a/src/main/java/itn/let/uss/umt/web/EgovUserManageController.java b/src/main/java/itn/let/uss/umt/web/EgovUserManageController.java index 72342971..acfc7cbb 100644 --- a/src/main/java/itn/let/uss/umt/web/EgovUserManageController.java +++ b/src/main/java/itn/let/uss/umt/web/EgovUserManageController.java @@ -1105,6 +1105,7 @@ public class EgovUserManageController { model.addAttribute("sysPicture3Price", sysJoinSetVO.getPicture3Price()); model.addAttribute("sysPicture3Price", sysJoinSetVO.getPicture3Price()); model.addAttribute("sysKakaoAtPrice", sysJoinSetVO.getKakaoAtPrice()); + model.addAttribute("sysKakaoFtPrice", sysJoinSetVO.getKakaoFtPrice()); // 등급제 단가 추출 => 시스템 단가에 적용 sysJoinSetVO = mberGrdService.selectMberGrdDefaultInfo(sysJoinSetVO, userId); @@ -1116,6 +1117,7 @@ public class EgovUserManageController { Float picture2Price = mberManageVO.getPicture2Price(); Float picture3Price = mberManageVO.getPicture3Price(); Float kakaoAtPrice = mberManageVO.getKakaoAtPrice(); + Float kakaoFtPrice = mberManageVO.getKakaoFtPrice(); Float faxPrice = mberManageVO.getFaxPrice(); System.out.println("mberManageVO.getFaxPrice() : " + mberManageVO.getFaxPrice()); @@ -1131,6 +1133,11 @@ public class EgovUserManageController { if(kakaoAtPrice < 1) { kakaoAtPrice = sysJoinSetVO.getKakaoAtPrice(); } + + if(kakaoFtPrice < 1) { + kakaoFtPrice = sysJoinSetVO.getKakaoFtPrice(); + } + if(faxPrice < 1) { faxPrice = sysJoinSetVO.getFaxPrice(); } @@ -1141,6 +1148,7 @@ public class EgovUserManageController { model.addAttribute("picture2Price", picture2Price); model.addAttribute("picture3Price", picture3Price); model.addAttribute("kakaoAtPrice", kakaoAtPrice); + model.addAttribute("kakaoFtPrice", kakaoFtPrice); model.addAttribute("faxPrice", faxPrice); model.addAttribute("sysJoinSetVO", sysJoinSetVO); @@ -1319,6 +1327,9 @@ public class EgovUserManageController { double kakaoAtCost = 0.00; double kakaoAtMargin = 0.00; + double kakaoFtCost = 0.00; + double kakaoFtMargin = 0.00; + double faxCost = 0.00; double faxMargin = 0.00; @@ -1351,11 +1362,24 @@ public class EgovUserManageController { avgPriceP = Double.parseDouble(item.getAgentPrice()); } } + + /* + * 알림톡,친구톡 원가 정보 조회 + * Agent 코드 번호를 넘겨준다. + * 다우기술 04번으로 넘겨줌 + * */ - // kakao 원가 - kakaoAtCost = kakaoApiService.selectKakaoCost(); + MjonMsgAgentStsVO resultAgentCost = mjonMsgAgentStsService.selectHotLineAgentCost("04"); + kakaoAtCost = resultAgentCost.getKakaoAtCost(); //알림톡 원가 + kakaoFtCost = resultAgentCost.getKakaoFtCost(); //친구톡 원가 + + // kakao 알림톡 마진률 계산 + //kakaoAtCost = kakaoApiService.selectKakaoCost(); kakaoAtMargin = (1-(kakaoAtCost / kakaoAtPrice))*100; + //kakao 친구톡 마진률 계산 + kakaoFtMargin = (1-(kakaoFtCost / kakaoFtPrice))*100; + // fax 원가 SELECT faxCost = faxService.getFaxCost(); // fax 마직 계산 :: 1-원가/단가 @@ -1372,7 +1396,9 @@ public class EgovUserManageController { model.addAttribute("avgPriceL", avgPriceL); model.addAttribute("avgPriceP", avgPriceP); model.addAttribute("kakaoAtCost", kakaoAtCost); + model.addAttribute("kakaoFtCost", kakaoFtCost); model.addAttribute("kakaoAtMargin", kakaoAtMargin); + model.addAttribute("kakaoFtMargin", kakaoFtMargin); model.addAttribute("faxCost", faxCost); model.addAttribute("faxMargin", faxMargin); } @@ -3047,6 +3073,11 @@ public class EgovUserManageController { mberManageVO.setKakaoAtPrice(0); } + // 친구톡 => 수정하려는 단가가 시스템기본단가와 동일할경우 0으로 세팅 + if (Float.compare(sysJoinSetVO.getKakaoFtPrice(), mberManageVO.getKakaoFtPrice()) == 0) { + mberManageVO.setKakaoFtPrice(0); + } + int resultCnt = mberManageService.updateUserPrice(mberManageVO); if(resultCnt > 0) { @@ -4942,7 +4973,7 @@ public class EgovUserManageController { * 회원 이용정지 사유 조회하기 * @param searchVO * @param model - * @return "/uss/umt/user/uss/umt/user/EgovGnrlselectedUserView.do.do" + * @return "/uss/umt/user/uss/umt/user/selectMberSpamBlockMemoDetailAjax.do" * @throws Exception */ @RequestMapping(value = {"/uss/umt/user/selectMberSpamBlockMemoDetailAjax.do"}) diff --git a/src/main/resources/egovframework/sqlmap/let/kakao/MjonKakaoATData_SQL_mysql.xml b/src/main/resources/egovframework/sqlmap/let/kakao/MjonKakaoATData_SQL_mysql.xml index df0b4253..529d8129 100644 --- a/src/main/resources/egovframework/sqlmap/let/kakao/MjonKakaoATData_SQL_mysql.xml +++ b/src/main/resources/egovframework/sqlmap/let/kakao/MjonKakaoATData_SQL_mysql.xml @@ -367,11 +367,11 @@ AND C.RSLT_CODE != '7000' AND C.MSG_TYPE = '8' ) AS atFailCount , - - '0' AS ftSuccessCount, - '0' AS ftFailCount, + ) AS ftFailCount , + M2.bizUmid, M2.callStatus, M2.bizKakaoResendYn, @@ -525,7 +525,7 @@ AND MG.DEL_FLAG ='N' AND MG.RESERVE_C_YN = 'N' - AND MG.MSG_TYPE = '8' + AND MG.MSG_TYPE IN ('8', '9') )M LEFT JOIN MJ_KAKAO_PROFILE_INFO MKPI ON M.MSG_NOTICETALK_SENDER_KEY = MKPI.SENDER_KEY @@ -1142,7 +1142,7 @@ AND C.RSLT_CODE != '7000' AND C.MSG_TYPE = '8' ) AS atFailCount , - - '0' AS ftSuccessCount, - '0' AS ftFailCount, + ) AS ftFailCount , + M2.bizUmid, M2.callStatus, M2.bizKakaoResendYn, @@ -1290,7 +1290,7 @@ AND MG.DEL_FLAG ='N' AND MG.RESERVE_C_YN = 'N' - AND MG.MSG_TYPE = '8' + AND MG.MSG_TYPE IN ('8', '9') )M LEFT JOIN MJ_KAKAO_PROFILE_INFO MKPI ON M.MSG_NOTICETALK_SENDER_KEY = MKPI.SENDER_KEY @@ -1363,7 +1363,8 @@ - AND M.AT_DELAY_COMPLETE_YN ='Y' + /** 20240119 우영두 수정 - 딜레이 승인된 건들만 조회하고 있어서 AND 조건 에서 OR 조건으로 변경 처리함 */ + OR M.AT_DELAY_COMPLETE_YN ='Y' /*AND M.REFUND_YN = 'N'*/ @@ -2386,7 +2387,7 @@ MJ_MSG_DATA A WHERE 1=1 AND A.USER_ID = #userId# - AND A.MSG_TYPE IN (8) + AND A.MSG_TYPE IN ('8', '9') GROUP BY A.MSG_GROUP_ID )A LEFT JOIN MJ_MSG_GROUP_DATA MGD diff --git a/src/main/resources/egovframework/sqlmap/let/mjo/kakao/KakaoSent_SQL_Mysql.xml b/src/main/resources/egovframework/sqlmap/let/mjo/kakao/KakaoSent_SQL_Mysql.xml index e0017014..723ae746 100644 --- a/src/main/resources/egovframework/sqlmap/let/mjo/kakao/KakaoSent_SQL_Mysql.xml +++ b/src/main/resources/egovframework/sqlmap/let/mjo/kakao/KakaoSent_SQL_Mysql.xml @@ -911,6 +911,7 @@ SELECT MGD.MSG_GROUP_ID as msgGroupId , MGD.USER_ID as userId + , MD.MSG_TYPE as msgType , MD.REQ_DATE as reqDate /* 발송 시간 */ , MD.MSG_NOTICETALK_SENDER_KEY as msgNoticetalkSenderKey /* api key */ , MD.MSG_NOTICETALK_TMP_KEY as msgNoticetalkTmpKey /* 특정 템플릿 key */ @@ -921,6 +922,7 @@ , MD.BIZ_KAKAO_RESEND_TYPE as bizKakaoResendType /* MMS / LMS / SMS */ , MD.BIZ_KAKAO_RESEND_DATA as bizKakaoResendData /* 대체 문자 (치환O) */ , MGD.BIZ_KAKAO_RESEND_ORGNL_TXT as bizKakaoResendOrgnlTxt /* 대체 문자( 치환X ) */ + , MD.BIZ_KAKAO_JSON_FILE as bizKakaoJsonFile /* Json 파일 경로 */ FROM MJ_MSG_GROUP_DATA MGD INNER JOIN MJ_MSG_DATA MD ON MGD.MSG_GROUP_ID = MD.MSG_GROUP_ID @@ -937,6 +939,7 @@ SELECT MD.REQ_DATE as reqDate /* 발송 시간 */ + , MD.MSG_TYPE as msgType , MD.MSG_NOTICETALK_SENDER_KEY as msgNoticetalkSenderKey /* api key */ , MD.MSG_NOTICETALK_TMP_KEY as msgNoticetalkTmpKey /* 특정 템플릿 key */ , MD.SMS_TXT as smsTxtTrans /* 알림톡 본문 내용 치환(O)*/ @@ -944,6 +947,7 @@ , MD.BIZ_KAKAO_RESEND_YN as bizKakaoResendYn /* 대체 문자 사용 여부*/ , MD.BIZ_KAKAO_RESEND_TYPE as bizKakaoResendType /* MMS / LMS / SMS */ , MD.BIZ_KAKAO_RESEND_DATA as bizKakaoResendData /* 대체 문자 (치환O) */ + , MD.BIZ_KAKAO_JSON_FILE as bizKakaoJsonFile /* Json 파일 경로 */ FROM MJ_MSG_DATA MD WHERE MD.MSG_ID = #msgId# diff --git a/src/main/resources/egovframework/sqlmap/let/mjo/kakao/Kakao_AT_SQL_Mysql.xml b/src/main/resources/egovframework/sqlmap/let/mjo/kakao/Kakao_AT_SQL_Mysql.xml index 77ea6d3a..9ff146a3 100644 --- a/src/main/resources/egovframework/sqlmap/let/mjo/kakao/Kakao_AT_SQL_Mysql.xml +++ b/src/main/resources/egovframework/sqlmap/let/mjo/kakao/Kakao_AT_SQL_Mysql.xml @@ -103,6 +103,32 @@ AND MMD.MSG_TYPE = 8 + + - SELECT COUNT(A.FRIEND_ID) OVER() AS totCnt , - A.FRIEND_ID AS friendId, - A.USER_ID AS userId, - A.SENDER_KEY AS senderKey, - KPI.YELLOW_ID AS yellowId, - A.TEMPLATE_NAME AS templateName, - A.IMAGE_URL AS templateImageUrl, - A.IMAGE_TYPE AS imageType, - A.IMAGE_TITLE AS imgTitle, - A.IMAGE_LINK AS imgLink, - A.TEMPLATE_CONTENTS AS templateContent, - A.AD_FLAG AS adFlag, - DATE_FORMAT(A.FRST_REGIST_PNTTM, '%Y-%m-%d %T') AS frstRegistPnttm, - A.FRST_REGISTER_ID AS frstRegisterId, - DATE_FORMAT(A.LAST_UPDT_PNTTM, '%Y-%m-%d %T') AS lastUpdtPnttm, - A.LAST_UPDUSR_ID AS lastUpdusrId - FROM ( SELECT KFT.FRIEND_ID, - KFT.USER_ID, - KFT.SENDER_KEY, - KFT.TEMPLATE_NAME, - KFT.IMAGE_URL, - KFT.IMAGE_TYPE, - KFT.IMAGE_TITLE, - KFT.IMAGE_LINK, - KFT.TEMPLATE_CONTENTS, - KFT.AD_FLAG, - KFT.FRST_REGIST_PNTTM, - KFT.FRST_REGISTER_ID, - KFT.LAST_UPDT_PNTTM, - KFT.LAST_UPDUSR_ID - FROM MJ_KAKAO_FRIENDS_TEMPLATE KFT - WHERE DELETE_YN = 'N' - AND USER_ID = #userId# - AND SENDER_KEY = #senderKey# - - AND KFT.TEMPLATE_NAME LIKE CONCAT ('%', #searchKeyword#,'%') - - - = DATE_FORMAT(#startDate#, '%Y-%m-%d') - ]]> - - - - - ORDER BY 1 =1 - - - , curState $searchSortOrd$ - , orderByrsltCode - - - ,$searchSortCnd$ - - - - $searchSortOrd$ - - LIMIT #recordCountPerPage# OFFSET #firstIndex# - ) - A - LEFT JOIN MJ_KAKAO_PROFILE_INFO KPI - ON A.USER_ID = KPI.USER_ID - AND A.SENDER_KEY = KPI.SENDER_KEY + SELECT COUNT(KFT.FRIEND_ID) OVER() AS totCnt, + KFT.FRIEND_ID AS friendId, + KFT.USER_ID AS userId, + KFT.SENDER_KEY AS senderKey, + KPI.YELLOW_ID AS yellowId, + KFT.TEMPLATE_NAME AS templateName, + KFT.IMAGE_FILE_NAME AS imageFileName, + KFT.IMAGE_URL AS templateImageUrl, + KFT.IMAGE_TYPE AS imageType, + KFT.IMAGE_TITLE AS imgTitle, + KFT.IMAGE_LINK AS imgLink, + KFT.TEMPLATE_CONTENTS AS templateContent, + KFT.AD_FLAG AS adFlag, + DATE_FORMAT(KFT.FRST_REGIST_PNTTM, '%Y-%m-%d %T') AS frstRegistPnttm, + KFT.FRST_REGISTER_ID AS frstRegisterId, + DATE_FORMAT(KFT.LAST_UPDT_PNTTM, '%Y-%m-%d %T') AS lastUpdtPnttm, + KFT.LAST_UPDUSR_ID AS lastUpdusrId + FROM MJ_KAKAO_FRIENDS_TEMPLATE KFT + LEFT JOIN MJ_KAKAO_PROFILE_INFO KPI + ON KFT.USER_ID = KPI.USER_ID + AND KFT.SENDER_KEY = KPI.SENDER_KEY + WHERE KFT.DELETE_YN = 'N' + AND KFT.USER_ID = #userId# + + AND KFT.SENDER_KEY = #senderKey# + + + AND KFT.TEMPLATE_NAME LIKE CONCAT ('%', #searchKeyword#,'%') + + + = DATE_FORMAT(#startDate#, '%Y-%m-%d') + ]]> + + + + + ORDER BY 1 =1 + + + , curState $searchSortOrd$ + , orderByrsltCode + + + ,$searchSortCnd$ + + + + $searchSortOrd$ + + LIMIT #recordCountPerPage# OFFSET #firstIndex# + @@ -199,5 +189,87 @@ + + + + + UPDATE MJ_KAKAO_FRIENDS_TEMPLATE + SET ATCH_FILE_ID = #bizJsonName#, + TEMPLATE_NAME = #templateName#, + IMAGE_FILE_NAME = #imageFileName#, + IMAGE_URL = #templateImageUrl#, + IMAGE_TYPE = #imageType#, + IMAGE_TITLE = #imgTitle#, + IMAGE_LINK = #imgLink#, + SENDER_KEY = #senderKey#, + TEMPLATE_CONTENTS = #templateContent#, + AD_FLAG = #adFlag#, + LAST_UPDT_PNTTM = NOW(), + LAST_UPDUSR_ID = #lastUpdusrId# + WHERE + FRIEND_ID = #friendId# + AND USER_ID = #userId# + AND SENDER_KEY = #senderKey# + + + + + + UPDATE MJ_KAKAO_FRIENDS_TEMPLATE + SET IMAGE_FILE_NAME = '', + IMAGE_URL = '', + IMAGE_TYPE = '', + IMAGE_TITLE = '', + IMAGE_LINK = '', + LAST_UPDT_PNTTM = NOW(), + LAST_UPDUSR_ID = #lastUpdusrId# + WHERE + FRIEND_ID = #friendId# + AND USER_ID = #userId# + + + \ No newline at end of file diff --git a/src/main/resources/egovframework/sqlmap/let/msg/MjonMsgData_SQL_mysql.xml b/src/main/resources/egovframework/sqlmap/let/msg/MjonMsgData_SQL_mysql.xml index 9168815d..aae6c3ad 100644 --- a/src/main/resources/egovframework/sqlmap/let/msg/MjonMsgData_SQL_mysql.xml +++ b/src/main/resources/egovframework/sqlmap/let/msg/MjonMsgData_SQL_mysql.xml @@ -2105,6 +2105,7 @@ , CUSTOM_TEXT_PRICE AS customTextPrice , POINT_PER AS pointPer , KAKAO_AT_PRICE AS kakaoAtPrice + , KAKAO_FT_PRICE AS kakaoFtPrice , FAX_PRICE AS faxPrice FROM MJ_MBER_SETTING diff --git a/src/main/resources/egovframework/sqlmap/let/uss/umt/EgovMberManage_SQL_Mysql.xml b/src/main/resources/egovframework/sqlmap/let/uss/umt/EgovMberManage_SQL_Mysql.xml index 8e721c86..39465903 100644 --- a/src/main/resources/egovframework/sqlmap/let/uss/umt/EgovMberManage_SQL_Mysql.xml +++ b/src/main/resources/egovframework/sqlmap/let/uss/umt/EgovMberManage_SQL_Mysql.xml @@ -1217,6 +1217,7 @@ , PICTURE2_PRICE = #picture2Price# , PICTURE3_PRICE = #picture3Price# , KAKAO_AT_PRICE = #kakaoAtPrice# + , KAKAO_FT_PRICE = #kakaoFtPrice# , KAKAO_FT_IMG_PRICE = #kakaoFtImgPrice# , KAKAO_FT_WIDE_IMG_PRICE = #kakaoFtWideImgPrice# WHERE MBER_ID = #mberId# diff --git a/src/main/webapp/WEB-INF/decorators.xml b/src/main/webapp/WEB-INF/decorators.xml index 78fdba3c..38c86778 100644 --- a/src/main/webapp/WEB-INF/decorators.xml +++ b/src/main/webapp/WEB-INF/decorators.xml @@ -183,6 +183,7 @@ */web/pop/* /web/mjon/kakao/template/selectKakaoAlimtalkTemplateListPopupAjax.do /web/mjon/kakao/alimtalk/selectKakaoAlimtalkTemplateDataTestPopup.do + /web/mjon/kakao/friendstalk/selectKakaoFriendsTalkTestSendPopup.do /web/mjon/fax/faxSendDetailPopup.do diff --git a/src/main/webapp/WEB-INF/jsp/cmm/uss/umt/EgovGnrlUserSelectUpdt.jsp b/src/main/webapp/WEB-INF/jsp/cmm/uss/umt/EgovGnrlUserSelectUpdt.jsp index 2e9a3ec7..956e22a4 100644 --- a/src/main/webapp/WEB-INF/jsp/cmm/uss/umt/EgovGnrlUserSelectUpdt.jsp +++ b/src/main/webapp/WEB-INF/jsp/cmm/uss/umt/EgovGnrlUserSelectUpdt.jsp @@ -5289,7 +5289,7 @@ function fnInputSmsTxt(){ 구분 알림톡(원) - 친구톡(준비중) + 친구톡(원) 팩스(원) @@ -5297,7 +5297,7 @@ function fnInputSmsTxt(){ 문자온 원가 - 준비중 + @@ -5306,7 +5306,7 @@ function fnInputSmsTxt(){ - 준비중 + @@ -5315,7 +5315,7 @@ function fnInputSmsTxt(){ 마진률 % - 준비중 + % % @@ -5772,6 +5772,10 @@ function fnInputSmsTxt(){ 알림톡 금액 + + 친구톡 금액 + +
diff --git a/src/main/webapp/WEB-INF/jsp/uss/ion/kakaoat/KakaoATChannelIDList.jsp b/src/main/webapp/WEB-INF/jsp/uss/ion/kakaoat/KakaoATChannelIDList.jsp index bd264762..96b6fe35 100644 --- a/src/main/webapp/WEB-INF/jsp/uss/ion/kakaoat/KakaoATChannelIDList.jsp +++ b/src/main/webapp/WEB-INF/jsp/uss/ion/kakaoat/KakaoATChannelIDList.jsp @@ -83,13 +83,27 @@ function fnSetCalMonth(val) { } //선택 채널 알림톡 템플릿 리스트 불러오기 -function fnTemplateListPop(senderKey, userId){ +function fnAtTemplateListPop(yellowId, senderKey, userId){ + + document.popupForm.senderKey.value = senderKey; + document.popupForm.userId.value = userId; + document.popupForm.yellowId.value = yellowId; + + window.open("about:blank", 'listPopup', 'width=930, height=860, top=100, left=100, fullscreen=no, menubar=no, status=no, toolbar=no, titlebar=yes, location=no, scrollbars=yes'); + document.popupForm.action = ""; + document.popupForm.target = "listPopup"; + document.popupForm.submit(); + +} + +//선택 채널 친구톡 템플릿 리스트 불러오기 +function fnFtTemplateListPop(senderKey, userId){ document.popupForm.senderKey.value = senderKey; document.popupForm.userId.value = userId; window.open("about:blank", 'listPopup', 'width=930, height=860, top=100, left=100, fullscreen=no, menubar=no, status=no, toolbar=no, titlebar=yes, location=no, scrollbars=yes'); - document.popupForm.action = ""; + document.popupForm.action = ""; document.popupForm.target = "listPopup"; document.popupForm.submit(); @@ -118,6 +132,7 @@ function fnSelectMber(mberId) { + @@ -193,6 +208,7 @@ function fnSelectMber(mberId) { + @@ -204,6 +220,7 @@ function fnSelectMber(mberId) { 채널ID 채널명 등록상태 + 템플릿 채널생성일 채널등록일 삭제여부 @@ -226,7 +243,7 @@ function fnSelectMber(mberId) { ', '');" style="cursor:pointer;"> - ', '');" style="cursor:pointer;"> + @@ -250,6 +267,10 @@ function fnSelectMber(mberId) { + + ','', '');" value="AT"/> + ', '');" value="FT"/> + @@ -342,14 +363,14 @@ function fnSelectMber(mberId) { - +
- +
+ +
diff --git a/src/main/webapp/WEB-INF/jsp/uss/ion/kakaoat/ReserveKakaoATModify.jsp b/src/main/webapp/WEB-INF/jsp/uss/ion/kakaoat/ReserveKakaoATModify.jsp index 9882321b..2bc1a53a 100644 --- a/src/main/webapp/WEB-INF/jsp/uss/ion/kakaoat/ReserveKakaoATModify.jsp +++ b/src/main/webapp/WEB-INF/jsp/uss/ion/kakaoat/ReserveKakaoATModify.jsp @@ -358,14 +358,17 @@ function fnTemplateDetail(templateCode){ - - 템플릿명 - -
- '); return false;" value="템플릿 상세보기"> -
- - + + + + 템플릿명 + +
+ '); return false;" value="템플릿 상세보기"> +
+ + +
<%-- 발신번호 diff --git a/src/main/webapp/WEB-INF/jsp/uss/ion/kakaoat/SendKakaoATModify.jsp b/src/main/webapp/WEB-INF/jsp/uss/ion/kakaoat/SendKakaoATModify.jsp index b0a91382..d75bf37b 100644 --- a/src/main/webapp/WEB-INF/jsp/uss/ion/kakaoat/SendKakaoATModify.jsp +++ b/src/main/webapp/WEB-INF/jsp/uss/ion/kakaoat/SendKakaoATModify.jsp @@ -358,14 +358,17 @@ function fnTemplateDetail(templateCode){ - - 템플릿명 - -
- '); return false;" value="템플릿 상세보기"> -
- - + + + + 템플릿명 + +
+ '); return false;" value="템플릿 상세보기"> +
+ + +
<%-- 발신번호 diff --git a/src/main/webapp/WEB-INF/jsp/uss/ion/kakaoft/popup/KakaoFTChannelIDTemplateDetailPop.jsp b/src/main/webapp/WEB-INF/jsp/uss/ion/kakaoft/popup/KakaoFTChannelIDTemplateDetailPop.jsp new file mode 100644 index 00000000..5a88dbd9 --- /dev/null +++ b/src/main/webapp/WEB-INF/jsp/uss/ion/kakaoft/popup/KakaoFTChannelIDTemplateDetailPop.jsp @@ -0,0 +1,1112 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%> +<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> +<%@ taglib prefix="ec" uri="/WEB-INF/tld/ecnet_tld.tld"%> + + + + 친구톡 템플릿 상세보기 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+ +
+ +
+ + <%-- <%@include file="/WEB-INF/jsp/web/kakao/include/KaKaoAlimtalkTopMenuTap.jsp" %> --%> + + +
+
+

카카오 친구톡 템플릿 상세보기

+ +
+
+ + <%-- <%@include file="/WEB-INF/jsp/web/kakao/include/KaKaoAlimtalkSubMenuTap.jsp" %> --%> + +
+ +
+ + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
채널ID + +
템플릿명 + +

최대 50자, 템플릿 관리용

+
이미지 첨부 +
+ checked > + checked > + checked> +
+

* 이미지 첨부 안내

+
    +
  • - 권장사이즈 : 720px * 720px
  • +
  • - 제한사이즈 : 가로 500px 미만, 가로:세로 비율이 2:1 미만 또는 3:4 초과시 업로드 불가
  • +
  • - 파일형식 : jpg, png (최대 500kb)
  • +
  • - 이미지 첨부시 메시지 내용은 최대 400자까지 입력할 수 있습니다.
  • +
+
+
+

* 와이드 이미지 첨부 안내

+
    +
  • - 권장사이즈 : 800px * 600px
  • + +
  • - 파일형식 : jpg, png (최대 2mb)
  • +
  • - 와이드 이미지 첨부시 메시지 내용은 최대 76자, 버튼 1개까지 입력할 수 있습니다.
  • +
+
+
+
+
    +
  • +

    이미지 제목

    + +
  • +
  • +

    이미지 클릭시 이동할 URL

    + +
  • +
  • +

    첨부파일 이미지

    + + +
  • +
+ +
+
광고포함 여부 + checked > + <%-- checked > --%> +
내용 +
+ +
+
+

(광고) 채널ID

+
+ + +
+
+

수신거부 : 홈 > 채널차단

+
+
+

0 /1000

+
+
+
+
+
+
+ +
+ + +
+
+ + + + + +
+
+ + + +
+
+ + + ${symbolList.symbol} + + +
+
+ + + +
+
+ + + ${symbolList.symbol} + + +
+
+ + + +
+
+ + + ${symbolList.symbol} + + +
+
+ + + +
+
+ + + ${symbolList.symbol} + + +
+
+ + + +
+
+ + + ${symbolList.symbol} + + +
+
+ + +
+
+
+ +
+
+
+ 특정문구 일괄변환이란? +

주소록, 엑셀에 입력된 내용을 이용해 수신자마다 다른 내용의 메시지를 발송하는 기능

+
+
+ +
+
+ + + + +
+
+ +
+
+
+ +
+ <%@include file="/WEB-INF/jsp/web/kakao/include/KakaoSentImoticonInfo.jsp" %> + +
+
+
+ +
+
+ + +
+
+
버튼 + <%-- + --%> +
+ + + +
+
배송조회
+
+ + +

*이용가능 택배사 : KG로지스, 우체국택배,일양로지스, GTX로지스, FedEx, 경동택배, 합동택배, 롯데택배

+
+
+ +
+
+
+ + + +
+
웹링크
+
+
    +
  • + + +
  • +
  • + +
  • +
  • + +
  • +
+
+
+ +
+
+
+ + + +
+
앱링크
+
+
    +
  • + + +
  • +
  • + +
  • +
  • + +
  • +
+
+
+ +
+
+
+ + + +
+
봇키워드
+
+ + +
+
+ +
+
+
+ + + +
+
메시지전달
+
+ + +
+
+ +
+
+
+ + + +
+
상담톡전환
+
+ + +
+
+ +
+
+
+ + + +
+
챗봇전환
+
+ + +
+
+ +
+
+
+
+
+
+
+
+
+
+

+ @채널ID +

+ +
+

(광고) 채널ID

+
+ +

내용 미리보기

+
+ + + +
+
+

수신거부 : 홈 > 채널차단

+ +
+ +
+

※ 단말기 설정에 따라 다르게 보일 수 있습니다

+

+
+ + +
+
+
+
+
+
+
+
+
+ +
+ + \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/jsp/uss/ion/kakaoft/popup/KakaoFTChannelIDTemplateListPop.jsp b/src/main/webapp/WEB-INF/jsp/uss/ion/kakaoft/popup/KakaoFTChannelIDTemplateListPop.jsp new file mode 100644 index 00000000..58eaa918 --- /dev/null +++ b/src/main/webapp/WEB-INF/jsp/uss/ion/kakaoft/popup/KakaoFTChannelIDTemplateListPop.jsp @@ -0,0 +1,190 @@ +<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@ taglib prefix="ui" uri="http://egovframework.gov/ctl/ui"%> +<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%> +<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%> +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> +<% pageContext.setAttribute("newLineChar", "\r\n"); %> +<% pageContext.setAttribute("newLineChar2", "\n"); %> + + + + +친구톡 템플릿 목록 + + + + + + + + + + + + + + + + + + + + + +
+
+
+
Loading
+
+
+
+
+ "> + + "> +
+
+ "> + "> + + + + + + "> +
+
+
+ +
+ +
+
    + + + +
  • +
    +
    +
    +
    +
    +

    '); return false;" style="cursor:pointer;"> + (광고) + +

    +
    +
    '); return false;" style="cursor:pointer;"> + + +
    + +
    +
    + +

    + + + + +
    +
    + +

    수신거부 | 홈 > 채널차단

    +
    +
    +
    +
    +
    템플릿명
    +
    + +
    +
    +
    +
    등록일
    +
    + <%--
    + + +
    --%> +
    +
    +
    +
  • +
    +
    + +
  • 등록된 템플릿이 없습니다.
  • +
    +
    +
+
+ + +
    + +
+
+
+
+
+
+ + \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/jsp/web/kakao/include/KaKaoAlimtalkSubMenuTap.jsp b/src/main/webapp/WEB-INF/jsp/web/kakao/include/KaKaoAlimtalkSubMenuTap.jsp index 78a7e4e6..d276e16d 100644 --- a/src/main/webapp/WEB-INF/jsp/web/kakao/include/KaKaoAlimtalkSubMenuTap.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/kakao/include/KaKaoAlimtalkSubMenuTap.jsp @@ -1,4 +1,6 @@ <%@ page language="java" contentType="text/html; charset=UTF-8" %> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%> + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+ +
+
    +
  • 테스트 발송은 친구톡을 본인에게 발송하여 친구톡 내용을 미리 확인하는 서비스 입니다.
  • +
+
+
+
+
+
+
수신번호
+
+ +
+
+
+
발송금액
+
${kakaoFtPrice}
+
+

발송하시겠습니까?※ 친구톡 발송과 동일하게 요금이 차감됩니다.

+ +
+
+
+

+ ${kakaoVO.yellowId} +

+ +
+
+ 친구톡 +
+
+ + +
+ +
+
+ +

+ +

+ + + + + +
+
+ + + + +
+

※ 단말기 설정에 따라 다르게 보일 수 있습니다

+

+
+
\ No newline at end of file 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 516d1a84..ab93209a 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 @@ -2,34 +2,33 @@ <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%> <%@ 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" %> + + + + + + + + @@ -365,11 +1705,62 @@ function fnContentsReset(){

친구톡 전송

+ + + + + + + + +
- - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
@@ -383,22 +1774,29 @@ function fnContentsReset(){ 채널ID - + + 템플릿명 + + +

최대 50자, 템플릿 관리용

+ + + 이미지 첨부
- - - + checked > + checked > + checked >

* 이미지 첨부 안내

    @@ -422,11 +1820,11 @@ function fnContentsReset(){
    • 이미지 제목

      - +
    • 이미지 클릭시 이동할 URL

      - +
    • 첨부파일 이미지

      @@ -443,21 +1841,20 @@ function fnContentsReset(){ 광고포함 여부 - - + checked > + <%-- checked > --%> 내용
      -

      (광고) 채널ID

      - +

      수신거부 : 홈 > 채널차단

      @@ -563,7 +1960,7 @@ function fnContentsReset(){

      주소록, 엑셀에 입력된 내용을 이용해 수신자마다 다른 내용의 메시지를 발송하는 기능

      - +
      @@ -578,134 +1975,30 @@ function fnContentsReset(){
      -
      -
      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      -
      + <%@include file="/WEB-INF/jsp/web/kakao/include/KakaoSentImoticonInfo.jsp" %>
      - + + + + + + + +
      - + + + + + + + + +
      @@ -714,7 +2007,7 @@ function fnContentsReset(){ 버튼 - @@ -726,7 +2019,132 @@ function fnContentsReset(){ * 버튼 타입중 봇키워드, 메시지전달카카오톡 채널 관리자센터(https://center-pf.kakao.com)에서 설정을 직접 한 후 이용하셔야 동작합니다. (최대 5개까지 등록가능)

      -
      + + + + +
      +
      배송조회
      +
      + + +

      *이용가능 택배사 : KG로지스, 우체국택배,일양로지스, GTX로지스, FedEx, 경동택배, 합동택배, 롯데택배

      +
      +
      + +
      +
      +
      + + + +
      +
      웹링크
      +
      +
        +
      • + + +
      • +
      • + +
      • +
      • + +
      • +
      +
      +
      + +
      +
      +
      + + + +
      +
      앱링크
      +
      +
        +
      • + + +
      • +
      • + +
      • +
      • + +
      • +
      +
      +
      + +
      +
      +
      + + + +
      +
      봇키워드
      +
      + + +
      +
      +
      +
      + + + +
      +
      메시지전달
      +
      + + +
      +
      + +
      +
      +
      + + + +
      +
      상담톡전환
      +
      + + +
      +
      + +
      +
      +
      + + + +
      +
      챗봇전환
      +
      + + +
      +
      + +
      +
      +
      +
      +
      @@ -734,35 +2152,35 @@ function fnContentsReset(){
      - - - + + + * 중복번호는 한번만 발송됩니다.
      -
      +
      - +

      휴대폰

      - + +
      - +
      - +
      @@ -774,18 +2192,18 @@ function fnContentsReset(){
      - +
      -

      등록하신 전화번호(형식 등)가 정확하게 입력되었는지 오류여부를 자동으로 검사할 수 있습니다.

      - (예시) 010-1234-0001(O),
      010-123-0001(X)
      +

      휴대폰 번호 입력 시 해당 휴대폰 번호에 대한 형식이 어긋나거나 휴대폰 번호에 오류가 있는지 등을 검사하는 기능

      + (예시) 010-1234-0001(O) / 010-12345-0001(X)
      - - + +

      0건 / 중복 0

      @@ -814,7 +2232,8 @@ function fnContentsReset(){ - + +
      @@ -826,7 +2245,8 @@ function fnContentsReset(){

      대체문자

      - + +
      @@ -838,7 +2258,7 @@ function fnContentsReset(){ @@ -891,7 +2310,7 @@ function fnContentsReset(){
      발신번호 - +
      -
      +

      @@ -909,7 +2328,9 @@ function fnContentsReset(){

      내용 미리보기

      - + + +

      수신거부 : 홈 > 채널차단

      @@ -932,20 +2353,28 @@ function fnContentsReset(){
- - + <%-- 친구톡 발송시간 체크 하기 - 20:50 ~ 익일 08:00 사이에는 발송 금지 --%> + + + + + + + + +
-
+
날짜 :
- + - - + @@ -971,15 +2400,10 @@ function fnContentsReset(){
-
+ <%--
- - + + -
+
--%>
@@ -998,4 +2422,128 @@ function fnContentsReset(){
- \ No newline at end of file + + + +
+ +
+ + +
+ +
+ + + +
+
+ +
+
+ +
+ +
\ No newline at end of file diff --git a/src/main/webapp/WEB-INF/jsp/web/kakao/sent/KakaoSentDetailPopAjax.jsp b/src/main/webapp/WEB-INF/jsp/web/kakao/sent/KakaoSentDetailPopAjax.jsp index e1f02d43..f594a247 100644 --- a/src/main/webapp/WEB-INF/jsp/web/kakao/sent/KakaoSentDetailPopAjax.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/kakao/sent/KakaoSentDetailPopAjax.jsp @@ -19,12 +19,33 @@
- 알림톡 + + + + 알림톡 + + + 친구톡 + + + + +
- 알림톡 도착 + + + + 알림톡 도착 + + + 친구톡 도착 + + + +
diff --git a/src/main/webapp/WEB-INF/jsp/web/kakao/sent/KakaoSentView.jsp b/src/main/webapp/WEB-INF/jsp/web/kakao/sent/KakaoSentView.jsp index 24f05da8..8c6bccc2 100644 --- a/src/main/webapp/WEB-INF/jsp/web/kakao/sent/KakaoSentView.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/kakao/sent/KakaoSentView.jsp @@ -27,7 +27,7 @@ $(document).ready(function(){ //이전달 첫날/마지막날 조회 if(date.getMonth()+1 == 1){ lastfulstday = date.getFullYear()-1 + "/12" + "/01"; - lastfuledday = date.getFullYear()-1 + "/12" + "/"+new Date(date.getFullYear()-1, 12, 0); + lastfuledday = date.getFullYear()-1 + "/12" + "/"+new Date(date.getFullYear()-1, 12, 0).getDate()+""; }else{ lastfulstday = date.getFullYear() + "/" ; lastfulstday += date.getMonth() < 10 ? "0"+ (date.getMonth()) : date.getMonth()+"" ; @@ -946,7 +946,11 @@ function infoPop(pageUrl){
  • - + +
  • +
diff --git a/src/main/webapp/WEB-INF/jsp/web/kakao/template/at/KakaoAlimtalkTemplateDetail.jsp b/src/main/webapp/WEB-INF/jsp/web/kakao/template/at/KakaoAlimtalkTemplateDetail.jsp index 335c9c5d..e6821266 100644 --- a/src/main/webapp/WEB-INF/jsp/web/kakao/template/at/KakaoAlimtalkTemplateDetail.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/kakao/template/at/KakaoAlimtalkTemplateDetail.jsp @@ -972,128 +972,8 @@ $(document).on('click', '.symbolButton, .changeWord', function (){
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- + <%@include file="/WEB-INF/jsp/web/kakao/include/KakaoSentImoticonInfo.jsp" %> +
diff --git a/src/main/webapp/WEB-INF/jsp/web/kakao/template/at/KakaoAlimtalkTemplateRegist.jsp b/src/main/webapp/WEB-INF/jsp/web/kakao/template/at/KakaoAlimtalkTemplateRegist.jsp index fda86741..075dabd1 100644 --- a/src/main/webapp/WEB-INF/jsp/web/kakao/template/at/KakaoAlimtalkTemplateRegist.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/kakao/template/at/KakaoAlimtalkTemplateRegist.jsp @@ -886,128 +886,8 @@ $(document).on('click', '.symbolButton, .changeWord', function (){
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- + <%@include file="/WEB-INF/jsp/web/kakao/include/KakaoSentImoticonInfo.jsp" %> +
diff --git a/src/main/webapp/WEB-INF/jsp/web/kakao/template/at/KakaoAlimtalkTemplateSampleToRegist.jsp b/src/main/webapp/WEB-INF/jsp/web/kakao/template/at/KakaoAlimtalkTemplateSampleToRegist.jsp index e3f53e64..7b6e09c0 100644 --- a/src/main/webapp/WEB-INF/jsp/web/kakao/template/at/KakaoAlimtalkTemplateSampleToRegist.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/kakao/template/at/KakaoAlimtalkTemplateSampleToRegist.jsp @@ -895,128 +895,8 @@ $(document).on('click', '.symbolButton, .changeWord', function (){
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- + <%@include file="/WEB-INF/jsp/web/kakao/include/KakaoSentImoticonInfo.jsp" %> +
diff --git a/src/main/webapp/WEB-INF/jsp/web/kakao/template/ft/KakaoFriendstalkTemplateDetail.jsp b/src/main/webapp/WEB-INF/jsp/web/kakao/template/ft/KakaoFriendstalkTemplateDetail.jsp new file mode 100644 index 00000000..278ab422 --- /dev/null +++ b/src/main/webapp/WEB-INF/jsp/web/kakao/template/ft/KakaoFriendstalkTemplateDetail.jsp @@ -0,0 +1,1063 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%> +<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> +<%@ taglib prefix="ec" uri="/WEB-INF/tld/ecnet_tld.tld"%> + + + + + +
+
+
+
Loading
+
+
+ + +
+ +
+ + <%@include file="/WEB-INF/jsp/web/kakao/include/KaKaoAlimtalkTopMenuTap.jsp" %> + + +
+
+

카카오톡 설정

+ +
+
+ + <%@include file="/WEB-INF/jsp/web/kakao/include/KaKaoAlimtalkSubMenuTap.jsp" %> + +
+
+ + + + + + + + + + + + + + + +
+
+

친구톡 템플릿 상세

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
채널ID + +
템플릿명 + +

최대 100자, 템플릿 관리용

+
이미지 첨부 +
+ checked > + checked > + checked> +
+

* 이미지 첨부 안내

+
    +
  • - 권장사이즈 : 720px * 720px
  • +
  • - 제한사이즈 : 가로 500px 미만, 가로:세로 비율이 2:1 미만 또는 3:4 초과시 업로드 불가
  • +
  • - 파일형식 : jpg, png (최대 500kb)
  • +
  • - 이미지 첨부시 메시지 내용은 최대 400자까지 입력할 수 있습니다.
  • +
+
+
+

* 와이드 이미지 첨부 안내

+
    +
  • - 권장사이즈 : 800px * 600px
  • + +
  • - 파일형식 : jpg, png (최대 2mb)
  • +
  • - 와이드 이미지 첨부시 메시지 내용은 최대 76자, 버튼 1개까지 입력할 수 있습니다.
  • +
+
+
+
+
    +
  • +

    이미지 제목

    + +
  • +
  • +

    이미지 클릭시 이동할 URL

    + +
  • +
  • +

    첨부파일 이미지

    + + +
  • +
+ +
+
광고포함 여부 + checked > + <%-- checked > --%> +
내용 +
+ +
+
+

(광고) 채널ID

+
+ + +
+
+

수신거부 : 홈 > 채널차단

+
+
+

0 /1000

+
+
+
+
+
+
+ +
+ + +
+
+ + + + + +
+
+ + + +
+
+ + + ${symbolList.symbol} + + +
+
+ + + +
+
+ + + ${symbolList.symbol} + + +
+
+ + + +
+
+ + + ${symbolList.symbol} + + +
+
+ + + +
+
+ + + ${symbolList.symbol} + + +
+
+ + + +
+
+ + + ${symbolList.symbol} + + +
+
+ + +
+
+
+ +
+
+
+ 특정문구 일괄변환이란? +

주소록, 엑셀에 입력된 내용을 이용해 수신자마다 다른 내용의 메시지를 발송하는 기능

+
+
+ +
+
+ + + + +
+
+ +
+
+
+ +
+ <%@include file="/WEB-INF/jsp/web/kakao/include/KakaoSentImoticonInfo.jsp" %> + +
+
+
+ +
+
+ + +
+
+
버튼 + + +
+ + + + +
+
배송조회
+
+ + +

*이용가능 택배사 : KG로지스, 우체국택배,일양로지스, GTX로지스, FedEx, 경동택배, 합동택배, 롯데택배

+
+
+ +
+
+
+ + + +
+
웹링크
+
+
    +
  • + + +
  • +
  • + +
  • +
  • + +
  • +
+
+
+ +
+
+
+ + + +
+
앱링크
+
+
    +
  • + + +
  • +
  • + +
  • +
  • + +
  • +
+
+
+ +
+
+
+ + + +
+
봇키워드
+
+ + +
+
+
+
+ + + +
+
메시지전달
+
+ + +
+
+ +
+
+
+ + + +
+
상담톡전환
+
+ + +
+
+ +
+
+
+ + + +
+
챗봇전환
+
+ + +
+
+ +
+
+
+
+
+
+
+
+
+
+

+ @채널ID +

+ +
+

(광고) 채널ID

+
+ +

내용 미리보기

+
+ + + +
+
+

수신거부 : 홈 > 채널차단

+ +
+ +
+

※ 단말기 설정에 따라 다르게 보일 수 있습니다

+

+
+ + +
+
+
+
+
+
+
+
+
+ diff --git a/src/main/webapp/WEB-INF/jsp/web/kakao/template/ft/KakaoFriendstalkTemplateList.jsp b/src/main/webapp/WEB-INF/jsp/web/kakao/template/ft/KakaoFriendstalkTemplateList.jsp index 985eee2b..5e6bf1a3 100644 --- a/src/main/webapp/WEB-INF/jsp/web/kakao/template/ft/KakaoFriendstalkTemplateList.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/kakao/template/ft/KakaoFriendstalkTemplateList.jsp @@ -41,7 +41,7 @@ function selectTemplateListLoad(page){ //화면 로딩바 보여주기 $('.loading_layer').addClass('active'); - $("#templateList").load("/web/mjon/kakao/template/selectKakaoFriendsTemplateListAjax.do", {"senderKey":selectAgentCode, "categoryCode" : selectTemplateSecondCatagory, "templateStatus" : selectTemplateStatus, "searchKeyword" : keyword, "page" : page, "yellowId" : yellowId, "formListType" : formListType} ,function(){ + $("#templateList").load("/web/mjon/kakao/template/selectKakaoFriendsTemplateListAjax.do", {"senderKey":selectAgentCode, "categoryCode" : selectTemplateSecondCatagory, "templateStatus" : selectTemplateStatus, "searchKeyword" : keyword, "pageIndex" : page, "yellowId" : yellowId, "formListType" : formListType} ,function(){ //썸네일 박스 스크롤 적용해주기 $(".kakao_template_wrap").mCustomScrollbar({ @@ -297,15 +297,15 @@ function fnTemplateDelBtn(templateId){ } //알림톡 상세보기 화면 호출 -function fnTemplateDetail(templateCode){ +function fnTemplateDetail(friendId){ var form = document.templateForm; var selectAgentCode = $("select[name='selectAgentCode_select']").val(); // 선택 채널ID form.senderKey.value = selectAgentCode; - form.templateCode.value = templateCode; + form.friendId.value = friendId; - form.action="/web/mjon/kakao/template/requestKakaoApiTemplateDetail.do"; + form.action="/web/mjon/kakao/template/selectKakaoFriendsTemplateDataDetail.do"; form.submit(); } @@ -359,7 +359,7 @@ function fnGoSampleTemplate(){
- +
@@ -426,7 +426,7 @@ function fnGoSampleTemplate(){ diff --git a/src/main/webapp/WEB-INF/jsp/web/kakao/template/ft/KakaoFriendstalkTemplateListAjax.jsp b/src/main/webapp/WEB-INF/jsp/web/kakao/template/ft/KakaoFriendstalkTemplateListAjax.jsp index c0315c2f..cdefd3a5 100644 --- a/src/main/webapp/WEB-INF/jsp/web/kakao/template/ft/KakaoFriendstalkTemplateListAjax.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/kakao/template/ft/KakaoFriendstalkTemplateListAjax.jsp @@ -102,6 +102,14 @@ $(function(){

'); return false;" style="cursor:pointer;"> + + + +
+ +
+
+

@@ -114,9 +122,15 @@ $(function(){
+
+
템플릿명
+
+ +
+
등록일
-
+
@@ -176,7 +190,7 @@ $(function(){ - + diff --git a/src/main/webapp/WEB-INF/jsp/web/kakao/template/ft/KakaoFriendstalkTemplateListPopupAjax.jsp b/src/main/webapp/WEB-INF/jsp/web/kakao/template/ft/KakaoFriendstalkTemplateListPopupAjax.jsp new file mode 100644 index 00000000..a90629b6 --- /dev/null +++ b/src/main/webapp/WEB-INF/jsp/web/kakao/template/ft/KakaoFriendstalkTemplateListPopupAjax.jsp @@ -0,0 +1,217 @@ +<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@ taglib prefix="ui" uri="http://egovframework.gov/ctl/ui"%> +<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%> +<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%> +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> +<% pageContext.setAttribute("newLineChar", "\r\n"); %> +<% pageContext.setAttribute("newLineChar2", "\n"); %> + + + + + + 문자온 - 친구톡 템플릿 선택 + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ +
+ +
+
    + + + +
  • '); return false;" style="cursor:pointer;"> +
    +
    +
    + <%--
    + +
    --%> +

    + (광고) + +

    +
    + + +
    + +
    +
    +
    +

    + + + + +
    +
    + +

    수신거부 | 홈 > 채널차단

    +
    +
    + <%--
    + +
    --%> +
    +
    +
    템플릿명
    +
    + +
    +
    +
    +
    등록일
    +
    +
    +
    +
  • +
    +
    + +
  • 등록된 템플릿이 없습니다.
  • +
    +
    +
+
+ + +
    + +
+
+
+ + + \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/jsp/web/kakao/template/ft/KakaoFriendstalkTemplateRegist.jsp b/src/main/webapp/WEB-INF/jsp/web/kakao/template/ft/KakaoFriendstalkTemplateRegist.jsp index ec0fb166..d7accea9 100644 --- a/src/main/webapp/WEB-INF/jsp/web/kakao/template/ft/KakaoFriendstalkTemplateRegist.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/kakao/template/ft/KakaoFriendstalkTemplateRegist.jsp @@ -211,6 +211,7 @@ function getTemplateImagUrl(){ $('.kakao_image').css("display", "block"); $("#kakaoImg").attr("src", imgUrl); + $("#imageFileName").val(fileName); }else if(code == "2002"){//일반 이미지 가로 세로 크기 오류 발생 @@ -319,6 +320,13 @@ function addTemplate(){ } + if(inputTemplateImageUrl == ''){ + + alert("이미지를 선택해 주세요."); + return false; + + } + } @@ -356,7 +364,7 @@ function addTemplate(){ var result = returnData.result; - if(result == "notLogin") {//차단 발신번호인 경우 등록 불가 + if(result == "loginFail") {//차단 발신번호인 경우 등록 불가 alert("로그인후 진행이 가능합니다."); }else if(returnData.result == "success") { alert("템플릿 저장이 완료되었습니다."); @@ -413,7 +421,7 @@ function fnImageDel(){ var code = returnData.code; var msg = returnData.msg; - if(result == "notLogin") {//차단 발신번호인 경우 등록 불가 + if(result == "loginFail") {//차단 발신번호인 경우 등록 불가 alert("로그인후 진행이 가능합니다."); }else if(returnData.result == "success") { @@ -427,6 +435,7 @@ function fnImageDel(){ $("#templateImageUrl").val(""); $('.kakao_image').css("display", "none"); $("#kakaoImg").attr("src", ""); + $("#img_file_0").click(); //이미지첨부 안함 라이오 선택해주기 return false; }else{ @@ -565,7 +574,7 @@ $(document).on('click', '.symbolButton, .changeWord', function (){
- + @@ -576,7 +585,7 @@ $(document).on('click', '.symbolButton, .changeWord', function (){ - +
@@ -602,7 +611,7 @@ $(document).on('click', '.symbolButton, .changeWord', function (){ 템플릿명 -

최대 100자, 템플릿 관리용

+

최대 50자, 템플릿 관리용

@@ -656,9 +665,8 @@ $(document).on('click', '.symbolButton, .changeWord', function (){ 광고포함 여부 - - + + @@ -798,128 +806,8 @@ $(document).on('click', '.symbolButton, .changeWord', function (){
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- + <%@include file="/WEB-INF/jsp/web/kakao/include/KakaoSentImoticonInfo.jsp" %> +
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 3fadab27..47bf1503 100644 --- a/src/main/webapp/WEB-INF/jsp/web/msgdata/MsgDataSMLView.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/msgdata/MsgDataSMLView.jsp @@ -773,9 +773,6 @@ $(document).ready(function (){ fnByteString(contents); } - - - });//문자 바이트수 계산하기 끝 diff --git a/src/main/webapp/WEB-INF/jsp/web/msgdata/MsgDataView.jsp b/src/main/webapp/WEB-INF/jsp/web/msgdata/MsgDataView.jsp index 7d298332..1465a6f3 100644 --- a/src/main/webapp/WEB-INF/jsp/web/msgdata/MsgDataView.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/msgdata/MsgDataView.jsp @@ -1213,7 +1213,7 @@ function sendMsgAjax_advc(){ removeEmptyValues(formData); // 선택된 데이터 추가 - formData["mjonMsgTabulListVO"] = $selectedData; + formData["mjonMsgSendVOList"] = $selectedData; // JSON 데이터 확인 console.log("최종 formData:", JSON.stringify(formData)); diff --git a/src/main/webapp/WEB-INF/jsp/web/msgsent/MsgSentView.jsp b/src/main/webapp/WEB-INF/jsp/web/msgsent/MsgSentView.jsp index bf26a21d..e246210a 100644 --- a/src/main/webapp/WEB-INF/jsp/web/msgsent/MsgSentView.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/msgsent/MsgSentView.jsp @@ -21,7 +21,7 @@ $(document).ready(function(){ //이전달 첫날/마지막날 조회 if(date.getMonth()+1 == 1){ lastfulstday = date.getFullYear()-1 + "/12" + "/01"; - lastfuledday = date.getFullYear()-1 + "/12" + "/"+new Date(date.getFullYear()-1, 12, 0); + lastfuledday = date.getFullYear()-1 + "/12" + "/"+new Date(date.getFullYear()-1, 12, 0).getDate()+""; }else{ lastfulstday = date.getFullYear() + "/" ; lastfulstday += date.getMonth() < 10 ? "0"+ (date.getMonth()) : date.getMonth()+"" ; diff --git a/src/main/webapp/WEB-INF/jsp/web/reservedmsg/ReservedKakaoCancelListAjax.jsp b/src/main/webapp/WEB-INF/jsp/web/reservedmsg/ReservedKakaoCancelListAjax.jsp index 86391651..8a4bec78 100644 --- a/src/main/webapp/WEB-INF/jsp/web/reservedmsg/ReservedKakaoCancelListAjax.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/reservedmsg/ReservedKakaoCancelListAjax.jsp @@ -53,6 +53,7 @@ $(document).ready(function(){ }); +

diff --git a/src/main/webapp/WEB-INF/jsp/web/reservedmsg/ReservedKakaoView.jsp b/src/main/webapp/WEB-INF/jsp/web/reservedmsg/ReservedKakaoView.jsp index 36595e61..b13e79e2 100644 --- a/src/main/webapp/WEB-INF/jsp/web/reservedmsg/ReservedKakaoView.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/reservedmsg/ReservedKakaoView.jsp @@ -25,7 +25,7 @@ $(document).ready(function(){ //이전달 첫날/마지막날 조회 if(date.getMonth()+1 == 1){ lastfulstday = date.getFullYear()-1 + "/12" + "/01"; - lastfuledday = date.getFullYear()-1 + "/12" + "/"+new Date(date.getFullYear()-1, 12, 0); + lastfuledday = date.getFullYear()-1 + "/12" + "/"+new Date(date.getFullYear()-1, 12, 0).getDate()+""; }else{ lastfulstday = date.getFullYear() + "/" ; lastfulstday += date.getMonth() < 10 ? "0"+ (date.getMonth()) : date.getMonth()+"" ; @@ -394,6 +394,7 @@ function fnRevDetailPop02(msgGroupId){ // 전송건별 $("#msgSentDetailPopLoad").load("/web/kakao/sent/selectKakaoSentDetailDataAjax.do", sendData ,function(response, status, xhr){ + // 상세보기 클릭때마다 툴팁 1 tab이 열리게 설정 popupTab($('#atBtn'),'1'); $('#tooltopClick').trigger('click'); @@ -683,7 +684,11 @@ function enterKey() {
  • - + +
  • +
diff --git a/src/main/webapp/WEB-INF/jsp/web/reservedmsg/ReservedMsgView.jsp b/src/main/webapp/WEB-INF/jsp/web/reservedmsg/ReservedMsgView.jsp index 93b08657..2b5b56b7 100644 --- a/src/main/webapp/WEB-INF/jsp/web/reservedmsg/ReservedMsgView.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/reservedmsg/ReservedMsgView.jsp @@ -25,7 +25,7 @@ $(document).ready(function(){ //이전달 첫날/마지막날 조회 if(date.getMonth()+1 == 1){ lastfulstday = date.getFullYear()-1 + "/12" + "/01"; - lastfuledday = date.getFullYear()-1 + "/12" + "/"+new Date(date.getFullYear()-1, 12, 0); + lastfuledday = date.getFullYear()-1 + "/12" + "/"+new Date(date.getFullYear()-1, 12, 0).getDate()+""; }else{ lastfulstday = date.getFullYear() + "/" ; lastfulstday += date.getMonth() < 10 ? "0"+ (date.getMonth()) : date.getMonth()+"" ; diff --git a/src/main/webapp/js/kakao/ft/friendstalkExcel.js b/src/main/webapp/js/kakao/ft/friendstalkExcel.js new file mode 100644 index 00000000..0e8b382b --- /dev/null +++ b/src/main/webapp/js/kakao/ft/friendstalkExcel.js @@ -0,0 +1,153 @@ +/** + * + * @author : 우영두 + * @fileName : friendstalkExcel.js + * @date : 2024.01.08 + * @description : 친구톡 excel 관련된 fuction .js + * =========================================================== + * DATE AUTHOR NOTE + * ----------------------------------------------------------- * + * 2024.01.08 우영두 최초 생성 + * + * + * + */ + + +$(document).ready(function(){ + + //치환문자 없는 엑섹불러오기 버튼 클릭시 파일 첨부 실행 + $('.c1').click(function(){ // 엑셀파일 불러오기 선택 시 + + $("#excelFile").click(); + + }); + +}); + + +//엑셀 파일 불러오기 +function excelExport(event){ + + 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(); + + if(fileExt.length > 0){ + if($.inArray(fileExt, ['txt','xls','xlsx']) == -1) { + + alert('txt, xls, xlsx 파일만 업로드 할수 있습니다.'); + return false; + + } + + + var url = ""; + + if(fileExt == "xls" || fileExt == "xlsx"){ + + url = "/web/mjon/msgdata/sendExelFilePhoneNumAjax.do"; + + }else if(fileExt = "txt"){ + + url = "/web/mjon/msgdata/sendTxtFilePhoneNumAjax.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){ + + if(checkHpNum(item.phone)){ + + excelAddr.push({phone: item.phone, name: item.name, rep1: item.replace1, rep2: item.replace2, rep3: item.replace3, rep4: item.replace4}); + + }/* else{ + + alert("엑셀 파일 데이터의 형식이 맞지 않는 부분이 있습니다."); + excelAddr = []; //엑셀 데이터 저장 변수 초기화 + $("#excelFile").val(""); //첨부파일 input 초기화 + $("#excelNm").val(""); // 첨부파일 명 초기화 + fileName = ""; + return; + + } */ + + }); + + } + + }else{ + alert(returnData.message); +// alert("첨부파일 불러오는 중 오류가 발생하였습니다."); + 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'); + } + }); + + $("#excelFile").val(""); + $("#excelNm").val(fileName); + + } + +} diff --git a/src/main/webapp/js/kakao/ft/ftPriceClclt.js b/src/main/webapp/js/kakao/ft/ftPriceClclt.js new file mode 100644 index 00000000..6a55e149 --- /dev/null +++ b/src/main/webapp/js/kakao/ft/ftPriceClclt.js @@ -0,0 +1,329 @@ +/** + * + * @author : 우영두 + * @fileName : ftPriceClclt.js + * @date : 2024.01.12 + * @description : 친구톡 및 대체문자 금액 연산.js + * =========================================================== + * DATE AUTHOR NOTE + * ----------------------------------------------------------- * + * 2024.01.12 우영두 최초 생성 + * + * + * + */ + + +/** + * + * @param {*} totRows 수신자 수 + * @description 금액 계산 function + * 대체 문자 X + * 카카오 금액 * 수신자 수 계산 + */ +function totalFtPriceSum(totRows){ + + var collNumCnt = parseInt(totRows); //받는사람 건수 + var price = $("#kakaoFtPrice").val(); //개별 건수 금액 + var totalPrice = 0; //전체 금액 + var totalStr = "0"; //전체 합계 금액 + var userMoney = $('#hdUserMoney').text(); //헤더 영역 보유 금액 불러오기 + + if(!userMoney > 0){ + + userMoney = 0; + + } + //헤더 영역 보유 금액 콤마 문자 제거 + if(userMoney != ''){ + + userMoney = userMoney.replaceAll("," , ""); + + } + + //대체문자가 있는 경우 대체문자의 단/장문에 따른 금액 계산 + 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; + + // 소수점 첫째자리 까지 표시 + totalPrice = totalPrice.toFixed(1); + + if(totalPrice > 0){ + + //totalStr = totalPrice.toFixed(2); + totalStr = totalPrice; + + } + + //개별 문자 단가 파라미터에 입력 + $('#eachPrice').val(numberWithCommas(price)); + + //결제금액 합계 파라이터에 입력 + $('#totPrice').val(numberWithCommas(totalStr)); + + //결제금액 합계 화면에 표시 + $('#totalPriceTxt').text(numberWithCommas(totalStr)); + + $('#repPriceTxt').hide(); + + return totalStr; + +} + + + +/* + * ====================================================================================================================== + * + * */ + +//카카오 mms sms 단가 셋팅 +var KAKAO_FT_PRICE = ''; +var SHORT_PRICE = ''; +var LONG_PRICE = ''; + +/*$(document).ready(function(){ + + // 카카오 mms sms 단가 셋팅 + KAKAO_FT_PRICE = $('#kakaoFtPrice').val(); + SHORT_PRICE = $('#shortPrice').val(); + LONG_PRICE = $('#longPrice').val(); + + ///////////////////////////////////////// Mutation Observer + // 감시 대상 node 선택 + // 변수X 수신자 목록 + let target01 = document.getElementById('wrap01_body'); + // 변수O 수신자 목록 + let target02 = document.getElementById('wrap02'); + // 대체 문자 단문 장문 텍스트 노드 + let target03 = document.getElementById('afterDeny'); + + // 감시자의 설정 + let option = { + subtree : true // 대상 노드의 자식 요소뿐만 아니라 후손 요소의 변화까지 감지 + , childList : true // 대상 노드의 자식 요소(텍스트 포함)의 변화 감지 + , attributes : true // 해당 노드의 attribute 속성 + + // , characterData: true // 대상 노드의 데이터 변화 감지 + }; + + + // wrap01 감시자 인스턴스 만들기 + let observer_wrap01 = new MutationObserver((mutations) => { + // 노드가 변경 됐을 때의 작업 + fn_priceClclt(); + }); + + // wrap02 감시자 인스턴스 만들기 + let observer_wrap02 = new MutationObserver((mutations) => { + // 노드가 변경 됐을 때의 작업 + fn_priceClclt(); + }); + + // wrap03 감시자 인스턴스 만들기 + let observer_wrap03 = new MutationObserver((mutations) => { + // 노드가 변경 됐을 때의 작업 + fn_priceClclt(); + }); + + + + + // 대상 노드에 감시자 전달 + observer_wrap01.observe(target01, option); + observer_wrap02.observe(target02, option); + observer_wrap03.observe(target03, option); + + ///////////////////////////////////////// //Mutation Observer + +});*/ + +/** + * @description 금액 계산 function + */ +function fn_priceClclt(){ + + // 미리보기 텍스트 + var templateHtml = $('#smsTxtArea').val(); + // var templateHtml = $('.template_text').html(); + + // 수신 번호 개수 + var phoneSu = $('.phoneArea').length; + // 대체문자 있는지 확인 + var isSendFailChecked = $("#send_fail_check").is(":checked"); + // 치환문자 여부 확인 + var txtReplYn = $('#txtReplYn').val() + // 대체문자 하위에 장문 / 단문 select + var msgTypeText = $('.msg_com').text().trim(); + + if(typeof templateHtml == 'undefined') return false; + else if(isSendFailChecked && txtReplYn=='Y') fn_sendFailCheckedAndTxtRepl_Y(templateHtml, msgTypeText, phoneSu); // 대체문자 체크 & 치환문자 Y + else if(isSendFailChecked && txtReplYn=='N') fn_sendFailCheckedAndTxtRepl_N(msgTypeText, phoneSu); // 대체문자 체크 & 치환문자 N + else fn_sendFailUnChecked(phoneSu); + +} + +/** + * + * @param {*} phoneSu 수신자 수 + * @description 금액 계산 function + * 대체 문자 X + * 카카오 금액 * 수신자 수 계산 + */ +function fn_sendFailUnChecked(phoneSu){ + + // 카카오 금액 * 수신자 수 + // fn_writePriceText() 첫 파라미터가 null이면 카카오 전송으로 인식 + fn_writePriceText('', phoneSu); + // $('#totalPriceTxt').text((KAKAO_AT_PRICE * phoneSu).toFixed(1)); + fn_priceText('알림톡', phoneSu); +} + +/** + * + * @param {*} templateHtml 템플릿html + * @param {*} msgTypeText 발송 타입 + * @param {*} phoneSu 수신자 수 + * @description 금액 계산 function + * 대체 문자 O + * 치환 문자 O + */ +function fn_sendFailCheckedAndTxtRepl_Y(templateHtml, msgTypeText, phoneSu){ + + // 대체문자 하위에 html 그대로의 byte 계산이 단문일 경우에만 치환 후 장문이 있는지 확인 + if(msgTypeText == '단문'){ + msgTypeText = fn_transHtml(msgTypeText, templateHtml); + } + + fn_writePriceText(msgTypeText, phoneSu); + fn_priceText(msgTypeText, phoneSu); + + + +} + +/** + * + * @param {*} msgTypeText 발송 타입 + * @param {*} phoneSu 수신자 수 + * @description 금액 계산 function + * 대체 문자 O + * 치환 문자 X + */ +function fn_sendFailCheckedAndTxtRepl_N(msgTypeText, phoneSu){ + + fn_priceText(msgTypeText, phoneSu); + fn_writePriceText(msgTypeText, phoneSu); +} + + +/** + * + * @param {*} msgTypeText 발송 타입 + * @param {*} phoneSu 수신자 수 + * @returns + * @description 발송 금액 계산 / 노출 + */ +function fn_priceText(msgTypeText, phoneSu){ + + // $("#repPriceTxt").is(":visible") => 발송 금액 show hide 여부 + if(phoneSu === 0){ + + $('#repPriceTxt').empty(); + $('#repPriceTxt').hide(); + return false; + } + // 텍스트 초기화 + $('#repPriceTxt').show(); + $('#repPriceTxt').empty(); + + var priceText = '$SENDTYPE$ :$SU$건'; + priceText = priceText.replace('$SENDTYPE$', msgTypeText).replace('$SU$', phoneSu); + + $('#repPriceTxt').append(priceText); +} + +/** + * @description 발송금액 라인 text / 금액 초기화 + */ +function priceInit(){ + if($("#repPriceTxt").is(":visible")){ + $('#repPriceTxt').empty(); + $('#repPriceTxt').hide(); + } + $('#totalPriceTxt').text(0.0); + +} + +/** + * + * @param {*} msgTypeText 발송 타입 + * @param {*} phoneSu 수신자 수 + * @description 발송 금액 '발송타입:00건' 노출 + */ +function fn_writePriceText(msgTypeText, phoneSu){ + + var price; + msgTypeText = msgTypeText.trim(); + if(msgTypeText == '단문') price = SHORT_PRICE * phoneSu; + else if(msgTypeText == '장문') price = LONG_PRICE * phoneSu; + else price = KAKAO_AT_PRICE * phoneSu; // 카카오 + + $('#totalPriceTxt').text((price).toFixed(1)); +} + + +/** + * + * @param {*} msgTypeText 발송 타입 : 단문 + * @param {*} templateHtml 템플릿 html + * @returns msgTypeText : 단문 or 장문 + * @description 치환 데이터 있는 경우 단문일 경우만 호출 + * 치환 후 장문 데이터일경우 'returns 장문'으로 끝남 + */ +function fn_transHtml(msgTypeText, templateHtml){ + + // 템플릿 + templateHtml = templateHtml.trim().replace(/(
||
)/g, '\n'); + // 치환 부분 '#{내용}'만 추출 + var varList = $("#excelTemplateContent").val().match(/#\{([^}]+)\}/g); + // 템플릿을 반복할때마다 담는 temp 선언 + var tempTemplateHtml; + // 치환 데이터 담는 변수 선언 + var replaceStr; + + // excelBody 부분 반복 시작 + $('.excelBody').each(function(i, t){ + tempTemplateHtml = templateHtml; + + $(this).find('.transData').each(function(index, item){ + // console.log('item text :: ', $(item).text().trim()); + replaceStr = $(item).text().trim(); + tempTemplateHtml = tempTemplateHtml.replace(varList[index], replaceStr); + }); + // 치환 후 byte 계산 + // 장문이면 break; + if(90 < conByteLeng(tempTemplateHtml)) + { + msgTypeText = '장문'; + return false; + } + }); + + + return msgTypeText; +} + + \ No newline at end of file diff --git a/src/main/webapp/js/kakao/ft/ftTabulator.js b/src/main/webapp/js/kakao/ft/ftTabulator.js new file mode 100644 index 00000000..537eef95 --- /dev/null +++ b/src/main/webapp/js/kakao/ft/ftTabulator.js @@ -0,0 +1,869 @@ +/** + * + * @author : 우영두 + * @fileName : ftTabulator.js + * @date : 2024.01.09 + * @description : 받는사람 목록 tabulator 관련 js + * =========================================================== + * DATE AUTHOR NOTE + * ----------------------------------------------------------- * + * 2024.01.09 우영두 최초 생성 + * + * + * + */ + +$(document).ready(function (){ + + //받는사람 연락처 내용 처리 + //Tabulator AJAX Data Loading + tableL = new Tabulator(".callList_box", { + height:"255px", + layout:"fitColumns", + //data:tabledata, + //autoColumns:true, + headerHozAlign:"center", + validationMode:"highlight", + //clipboard:false, + //clipboardCopySelector:"table", + //clipboardPasteAction:"insert", // insert, update, replace + placeholder:"복사(Ctrl+C)한 내용을 여기에 붙여넣기(Ctrl+V) 해주세요.", //fit columns to width of table (optional) + resizableColumns:false, + columns:[ //Define Table Columns + {formatter:"rowSelection", titleFormatter:"rowSelection",clipboard:false, hozAlign:"center", headerSort:false, cellClick:function(e, cell){ + cell.getRow().toggleSelect(); + }}, + {title:"이름", hozAlign:"center", field:"name", editor:"input", validator:["maxLength:12"], cellEdited:function(cell){ + //cell - cell component + fnReplCell(); + }}, + {title:"휴대폰", hozAlign:"center", field:"phone", editor:"input", width:100, validator:["required","minLength:10", "maxLength:12"], cellEdited:function(cell){ + //cell - cell component + fnDuplPhone(); + }}, + {title:"[*1*]", hozAlign:"center", field:"rep1", editor:"input", minWidth:60, validator:["maxLength:40"], cellEdited:function(cell){ + //cell - cell component + fnReplCell(); + }}, + {title:"[*2*]", hozAlign:"center", field:"rep2", editor:"input", minWidth:60, validator:["maxLength:40"], cellEdited:function(cell){ + //cell - cell component + fnReplCell(); + }}, + {title:"[*3*]", hozAlign:"center", field:"rep3", editor:"input", minWidth:60, validator:["maxLength:40"], cellEdited:function(cell){ + //cell - cell component + fnReplCell(); + }}, + {title:"[*4*]", hozAlign:"center", field:"rep4", editor:"input", minWidth:60, validator:["maxLength:40"], cellEdited:function(cell){ + //cell - cell component + fnReplCell(); + }}, + + ], + validationFailed:function(cell, value, parameters){ // 유효성 체크 함수 - 아직 잘 모르겠음 + //take action on validation fail + var valid = cell.isValid(); + var fieldNm = cell.getField(); + var cellVal = cell.getValue(); + var returnVal = ""; + if(!valid){ + + if(fieldNm == "name"){ + alert("받는사람 이름은 최대 12글자까지만 입력 가능합니다."); + cell.setValue(strMaxLengthSubstring(cellVal, 11)); //스크립트 함수가 0부터 시작이므로 원하는 글자수 -1을 해줘야한다. + cell.clearValidation(); + }else if(fieldNm == "phone"){ + alert("휴대폰번호는 하이픈(-)을 제외한 숫자만 정확히 입력해 주세요."); + }else{ + alert("치환문자를 정확히 입력해 주세요. 40글자 이내로 입력 가능합니다."); + cell.setValue(strMaxLengthSubstring(cellVal, 39)); + cell.clearValidation(); + } + + //해당 셀 데이터 삭제 + //cell.setValue(""); + + } + return value % parameters.phone; + }, + + }); + + + //주소록 불러오기 팝업 내용 + //Tabulator AJAX Data Loading + tableAddr = new Tabulator(".callAddr_box", { + height:"255px", + layout:"fitColumns", + headerHozAlign:"center", + validationMode:"highlight", + placeholder:"주소록 그룹을 선택해 주세요.", //fit columns to width of table (optional) + resizableColumns:false, + columns:[ //Define Table Columns + {formatter:"rowSelection", titleFormatter:"rowSelection",clipboard:false, hozAlign:"center", headerSort:false, cellClick:function(e, cell){ + cell.getRow().toggleSelect(); + } + }, + {title:"그룹명", hozAlign:"center", field:"addrGroupNm", editor:"input", width:120, validator:["required","minLength:2", "maxLength:40"]}, + {title:"이름", hozAlign:"center", field:"addrName", editor:"input", width:120, validator:["maxLength:12"]}, + {title:"휴대폰번호", hozAlign:"center", field:"addrPhone", editor:"input", width:120, validator:["required","minLength:10", "maxLength:11"]}, + + ], + validationFailed:function(cell, value, parameters){ // 유효성 체크 함수 - 아직 잘 모르겠음 + var valid = cell.isValid(); + var fieldNm = cell.getField(); + if(!valid){ + if(fieldNm == "addrName"){ + alert("받는사람 이름은 최대 12글자까지만 입력 가능합니다."); + }else if(fieldNm == "addrPhone"){ + alert("휴대폰번호는 하이픈(-)을 제외한 숫자만 정확히 입력해 주세요."); + }else if(fieldNm == "addrGroupNm"){ + alert("그룹명을 정확히 입력해 주세요. 2 ~ 40글자 이내로 입력 가능합니다."); + } + + //해당 셀 데이터 삭제 + cell.setValue(""); + } + return value % parameters.addrPhone; + }, + + }); + + + //받는사람 번호 버튼 클릭시 Tabulator에 데이터 넣어주기 + $('.addCallToF').click(function(){ + + var callToNum = $('#callTo').val(); + if(callToNum == null || callToNum == ""){ + + alert("받는사람 번호를 입력해 주세요."); + return false; + + }else if(!checkHpNum(callToNum)){ + + alert("올바른 전화번호를 입력해 주세요."); + $('#callTo').val(""); + return false; + } + + //핸드폰 번호에 '-' 문자 제거하기 + callToNum = removeDash(callToNum); + + //기존 받는사람 연락처 모두 불러오기 + var data = tableL.getRows(); + var tableData = []; + var dpCnt = 0; + for(var i=0; i < tableL.getRows().length; i++){ + + if(callToNum == data[i].getData().phone){ + + dpCnt++; + + } + + } + + if(dpCnt > 0){ + + alert("받는사람 리스트에 동일한 연락처가 있습니다."); + $('#callTo').val(""); + return false; + + }else{ + + tabledata = [{phone: callToNum},]; + + //빈 row 데이터 삭제하기 + var befData = tableL.getRows(); + var totLen = tableL.getRows().length; + + for(var i=0; i < totLen; i++){ + + tableData.push({phone: data[i].getData().phone.trim(), name: data[i].getData().name}); + + } + + //연락처 추가해 주기 + addPhoneInfo(tabledata); + + $('#callTo').val(""); + + } + + }); + + + //받는사람 전체삭제 버튼 처리 + $('.all_del').click(function(){ + + var data = tableL.getRows(); + + if(data == null || data == ""){ + + alert("받는사람을 추가해 주세요."); + return false; + + }else{ + + if(confirm("받는사람 목록을 모두 삭제하시겠습니까?")){ + tableL.clearData(); + $("#rowTotCnt").text(0); //총건수 수정 + $("#rowDupCnt").text(0); //중복건수 수정 + totalFtPriceSum(0); //결제 금액 수정 + } + + } + + }); + + // 받는사람 선택삭제 버튼 처리해주기 + $('.select_del').click(function(){ + + if(tableL == null || tableL == ""){ + + alert("받는사람을 추가해 주세요."); + return false; + + } + + var selectedData = tableL.getSelectedRows(); + + if(selectedData == "" || selectedData == null){ + + alert("삭제할 연락처를 선택해주세요."); + return false; + + }else{ // 선택한 Row 데이터 삭제하기 + + if(confirm("선택하신 받는 사람을 삭제하시겠습니까?")){ + + for(var i=0; i < selectedData.length; i++){ + + selectedData[i].delete(); + + } + + totRows = tableL.getRows().length; + + var smsTxtArea = $('#inputTemplateContent').val(); + + //일괄변환 문구 결제금액 처리 + if(smsTxtArea.indexOf("#{이름}") > -1 + || smsTxtArea.indexOf("#{1}") > -1 + || smsTxtArea.indexOf("#{2}") > -1 + || smsTxtArea.indexOf("#{3}") > -1 + || smsTxtArea.indexOf("#{4}") > -1){ + + fnFtReplCell(); + + }else{ + //결제 금액 구하기 + totalFtPriceSum(totRows); + } + + //결제금액 합계 파라이터에 입력 + $('#rowTotCnt').text(numberWithCommas(totRows)); + + } + + } + + }); + + + + //주소록 불러오기 버튼 클릭시 + $('.popupAddr').click(function(){ + + var login = '${LoginVO.id}'; + + if(login == null || login == ''){ + + alert("로그인 후 이용이 가능합니다."); + return false; + + } + + $("#addrGroupLoad").load("/web/mjon/msgdata/selectAddrGroupListAjax.do", "" ,function(response, status, xhr){ + //리스트 스크롤 처리해주기 + $(".adr_pop_list").mCustomScrollbar({ + axis: 'y', + scrollbarPosition: "outside", + theme: "dark", + autoHideScrollbar: false + }); + }); + + }); + + + //엑섹불러오기 버튼 클릭시 파일 첨부 실행 + $('.upImg').click(function(){ // 엑셀파일 불러오기 선택 시 + + $("#imgFile").click(); + + }); + + //최근전송내역 팝업 선택추가 버튼 처리(체크내역 받는사람 리스트로 추가해주기) + $(document).on('click', '#latestAddPhone', function (){ + + var addPhoneList = []; //신규로 추가할 전화번호 저장변수 + + $("input:checkbox[name='latAddrChk']:checked").each(function(index){ + + var chkPhone = $(this).val(); + + if(!checkHpNum(chkPhone)){ + + alert("올바른 전화번호가 아닙니다."); + return false; + + }else{ + + addPhoneList.push({phone: removeDash(chkPhone.trim())}); + + } + + }); + + + if(addPhoneList.length > 0){ + //연락처 추가해 주기 + addPhoneInfo(addPhoneList); + $("#btnLatestAddPhoneClose").trigger("click"); + } + else { + alert("연락처를 선택해주세요."); + return false; + } + + //중복연락처 제거 + //var removeDuplData = dupliPhoneData(addPhoneList); + + //받는사람 목록에 추가 + //tableL.addData(removeDuplData); + + //총 받는사람 수 계산 + //totRows = tableL.getRows().length; + //updateTotCnt(totRows); + + //결제 금액 구하기 + //totalPriceSum(totRows); + + }); + + //최근전송내역 팝업 선택 취소 버튼 처리 + $(document).on('click', '#latestCancelPhone', function (){ + + $("input[name=latAddrChk]").prop("checked", false); + + }); + + //최근전송내역 팝업 삭제 버튼 처리 + $(document).on('click', '#latestAddrDel', function (){ + + $(this).parent("#latestLi").remove(); + + }); + + //자주보내는 번호 팝업 선택추가 버튼 처리(체크내역 받는사람 리스트로 추가해주기) + $(document).on('click', '#bookMarkAddPhone', function (){ + + var addPhoneList = []; //신규로 추가할 전화번호 저장변수 + + $("input:checkbox[name='bookAddrChk']:checked").each(function(index){ + + var chkPhone = $(this).val(); + + if(!checkHpNum(chkPhone)){ + + alert("올바른 전화번호가 아닙니다."); + return false; + + }else{ + + addPhoneList.push({phone: removeDash(chkPhone.trim())}); + + } + + }); + + if(addPhoneList.length > 0){ + //연락처 추가해 주기 + addPhoneInfo(addPhoneList); + $("#btnLatestAddPhoneClose").trigger("click"); + } + else { + alert("연락처를 선택해주세요."); + return false; + } + + //중복연락처 제거 + //var removeDuplData = dupliPhoneData(addPhoneList); + + //받는사람 목록에 추가 + //tableL.addData(removeDuplData); + + //총 받는사람 수 계산 + //totRows = tableL.getRows().length; + //updateTotCnt(totRows); + + //결제 금액 구하기 + //totalPriceSum(totRows); + + }); + + //자주보내는 번호 팝업 선택 취소 버튼 처리 + $(document).on('click', '#bookMarkCancelPhone', function (){ + + $("input[name=bookAddrChk]").prop("checked", false); + + }); + + //자주보내는 번호 팝업 삭제 버튼 처리 + $(document).on('click', '#bookMarkAddrDel', function (){ + + $(this).parent("#bookMarkLi").remove(); + + }); + + // 자주보내는 번호 팝업 닫기 버튼 처리 + $(document).on('click', '#btnLatestAddPhoneClose', function (){ + // 자주보내는 번호 체크박스 해제처리 + setCheckBoxUnChecked(); + }); + + // 자주보내는 번호 체크박스 해제처리 + function setCheckBoxUnChecked() { + $("input[name=latAddrChk]").prop("checked", false); + $("input[name=bookAddrChk]").prop("checked", false); + } + + + //오류 검사 버튼 처리 + $('.check_validity').click(function(){ + + var invalid = tableL.getInvalidCells(); //오류 데이터 체크 + var dataLen = tableL.getRows().length; //연락처 데이터 갯수 + var totLen = invalid.length; //오류 데이터 갯수 + var errMsg = ""; //최종 alert에 표시할 메시지 저장 변수 + + if(dataLen > 0){ //연락처 정보가 있으면 수행 + + if(totLen > 0){ //내용에 오류가 있으면 수행 + + //오류 데이터 값 저장 + for(var i=0; i < totLen; i++){ + + var cellValue = invalid[i].getValue(); + + if(i == 0){ + + errMsg = cellValue; + + }else{ + + errMsg = errMsg +", "+ cellValue; + + } + + } + + if(errMsg == "" || errMsg == null){ + + alert("내용에 오류가 있습니다."); + return false; + + }else{ + + alert(errMsg + "의 내용에 오류가 있습니다."); + return false; + + } + + }else{ + + alert("오류 데이터가 없습니다."); + return false; + + } + + }else{ + + alert("연락처를 입력해 주세요."); + return false; + + } + + }); + +}); + +var tableErrorData = []; +var totRows = 0; // 좌측 받는사람 총 갯수 + + +/* +* 토탈 카운트 화면에 노출 +* 변수 없는 리스트만 체크 +*/ +function updateTotCnt(){ + + $("#rowTotCnt").text($('#wrap01_body .list_body').length); + +} + +//주소록 불러오기에서 수신자 리스트 화면에 추가해주기 +function addPhoneInfo(data){ + + if(data == null){ + + alert("연락처 정보가 없습니다."); + return; + + }else{ + + var idx = 0; + var newData = data;//중복 연락처는 하나만 남기고 모두 제거 + + var recTableData = tableL.getRows(); // 받는사람 리스트의 전체 목록을 저장 + var tableData = []; + + //기존 받는사람 리스트를 배열에 미리 담아둔다. + if(recTableData.length > 0){ + + for(var j=0; j < recTableData.length; j++){ + + tableData.push({phone: removeDash(recTableData[j].getData().phone) , name: recTableData[j].getData().name, rep1: recTableData[j].getData().rep1, rep2: recTableData[j].getData().rep2, rep3: recTableData[j].getData().rep3, rep4: recTableData[j].getData().rep4}); + + } + + } + + //받는사람 리스트를 담아둔 배열에 신규 추가 데이터를 추가해 준다. + for(var i=0; i < newData.length; i++){ + + tableData.push({phone: removeDash(newData[i].phone) , name: newData[i].name, rep1: newData[i].rep1, rep2: newData[i].rep2, rep3: newData[i].rep3, rep4: newData[i].rep4}); + + } + + var temp = tableData.length; + + //기존 수신 리스트를 지워준 후 신규 전체 리스트를 추가해준다. + tableL.clearData(); //기존 받는사람 목록을 삭제. + tableL.addData(dupliPhoneData(tableData)); // 받는사람 목록에 주소 정보 입력하기 + _fileForm2 = []; //form file data 초기화 + _fileIdx = 0; //form file idx 초기화 + + totRows = tableL.getRows().length; + + var smsTxtArea = $('#inputTemplateContent').val(); + + //일괄변환 문구 결제금액 처리 + if(smsTxtArea.indexOf("#{이름}") > -1 + || smsTxtArea.indexOf("#{1}") > -1 + || smsTxtArea.indexOf("#{2}") > -1 + || smsTxtArea.indexOf("#{3}") > -1 + || smsTxtArea.indexOf("#{4}") > -1){ + + fnFtReplCell(); + + }else{ + + //결제 금액 구하기 + totalFtPriceSum(totRows); + + } + + //결제금액 합계 파라이터에 입력 + $('#rowTotCnt').text(numberWithCommas(totRows)); + + } + +} + + +function addrToList(){ + + var selectedData = tableAddr.getSelectedRows(); + var tableData = []; + + if(selectedData == "" || selectedData == null){ + + alert("주소록을 선택해 주세요."); + return false; + + }else{ // 선택한 Row 데이터 저장해주기 + + for(var i=0; i < selectedData.length; i++){ + + //좌측 받는사람 리스트를 담아둔 배열에 데이터를 추가해 준다. + tableData.push({phone: removeDash(selectedData[i].getData().addrPhone), + name: selectedData[i].getData().addrName, + rep1: selectedData[i].getData().addrRep1, + rep2: selectedData[i].getData().addrRep2, + rep3: selectedData[i].getData().addrRep3, + rep4: selectedData[i].getData().addrRep4} + ); + + } + + //선택한 데이터 받는사람 리스트에 추가해 주기 + addPhoneInfo(tableData); + $(".closeAddr").trigger("click"); + + //주소록 레이어 팝업의 Tabulator 데이터 지워주기 + tableAddr.clearData(); + + } + +} + + +//특정문구 일괄변환 문자길이 체크 하기 +function fnFtReplCell(){ + + var smsTxtArea = $('#inputTemplateContent').val(); + + //이벤트 잔여 캐시 자동 처리 관련 변수 + var eachPrice = parseFloat($("#eachPrice").val()); + var kakaoFtPrice = parseFloat($("#kakaoFtPrice").val()); + var shortPrice = parseFloat($("#shortPrice").val()); + var longPrice = parseFloat($("#longPrice").val()); + + if(smsTxtArea.indexOf("#{이름}") > -1 + || smsTxtArea.indexOf("#{1}") > -1 + || smsTxtArea.indexOf("#{2}") > -1 + || smsTxtArea.indexOf("#{3}") > -1 + || smsTxtArea.indexOf("#{4}") > -1){ + + + var rowData = tableL.getRows(); + var recTableData = tableL.getRows(); // 받는사람 리스트의 전체 목록을 저장 + //var tableData = []; + + var msg_short = 0; //단문문자 갯수 + var msg_long = 0; //장문문자 갯수 + + //일괄변환문자 포함 여부 변경 - 문자내용에 치환변환 문자는 있지만 받는사람 데이터에 치환 데이터를 안넣는 경우 오류가 발생하여 상태값 입력 위치 상단으로 변경함. + //치환데이터가 없는 경우 Alert 띄우고 빠져나가기 때문에 치환문자 상태 체크값이 누락되어서 변경함 - 20230407 우영두 + $('#txtReplYn').val("Y"); + + var nmStatus = false; + var rep1Status = false; + var rep2Status = false; + var rep3Status = false; + var rep4Status = false; + var varValStatus = true; + + if(smsTxtArea.indexOf("#{이름}") > -1){ + + nmStatus = true; + } + + if(smsTxtArea.indexOf("#{1}") > -1){ + + rep1Status = true; + } + + if(smsTxtArea.indexOf("#{2}") > -1){ + + rep2Status = true; + } + + if(smsTxtArea.indexOf("#{3}") > -1){ + + rep3Status = true; + } + + if(smsTxtArea.indexOf("#{4}") > -1){ + + rep4Status = true; + } + + + //기존 받는사람 리스트를 배열에 미리 담아둔다. + if(recTableData.length > 0){ + + for(var j=0; j < recTableData.length; j++){ + + var smsTxt = smsTxtArea; + + if(typeof recTableData[j].getData().name != 'undefined' && recTableData[j].getData().name != null && recTableData[j].getData().name != ""){ + + 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 != ""){ + + 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 != ""){ + + 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 != ""){ + + 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 != ""){ + + 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; + + var imgType = $("#imageType").val(); + + //일반 이미지 첨부시 글자수 최대 400글자 + if(imgType == "I"){ + + maxLenChar = 400; + + }else if(imgType == "W"){ + //와이드 이미지 첨부시 글자수 최대 76글자 + maxLenChar = 76; + + } + + if(msgLen < 1){ + + + }else if(msgLen > maxLenChar){ + + alert("친구톡 내용은 "+ maxLenChar +" 자를 넘을 수 없습니다."); + tableL.clearData(); //기존 받는사람 목록을 삭제. + return false; + + } + + } + + //치환문자에 데이터가 누락된 경우 알림 메세지를 보여주고 받는사람 목록을 지워준다. + /*if(!varValStatus){ + + alert("치환변수 데이터가 없는 항목이 있습니다. 받는사람 변수 데이터를 확인해 주세요."); + tableL.clearData(); //기존 받는사람 목록을 삭제. + return false; + + }*/ + + } + + //결제 금액 구하기 + totalFtPriceSum(tableL.getRows().length); + + } + +} + + +//오류 검사 버튼 처리 +$('.check_validity').click(function(){ + + var invalid = tableL.getInvalidCells(); //오류 데이터 체크 + var dataLen = tableL.getRows().length; //연락처 데이터 갯수 + var totLen = invalid.length; //오류 데이터 갯수 + var errMsg = ""; //최종 alert에 표시할 메시지 저장 변수 + + if(dataLen > 0){ //연락처 정보가 있으면 수행 + + if(totLen > 0){ //내용에 오류가 있으면 수행 + + //오류 데이터 값 저장 + for(var i=0; i < totLen; i++){ + + var cellValue = invalid[i].getValue(); + + if(i == 0){ + + errMsg = cellValue; + + }else{ + + errMsg = errMsg +", "+ cellValue; + + } + + } + + if(errMsg == "" || errMsg == null){ + + alert("내용에 오류가 있습니다."); + return false; + + }else{ + + alert(errMsg + "의 내용에 오류가 있습니다."); + return false; + + } + + }else{ + + alert("오류 데이터가 없습니다."); + return false; + + } + + }else{ + + alert("연락처를 입력해 주세요."); + return false; + + } + +}); diff --git a/src/main/webapp/js/kakao/templateComm.js b/src/main/webapp/js/kakao/templateComm.js index a88e42cc..a327838e 100644 --- a/src/main/webapp/js/kakao/templateComm.js +++ b/src/main/webapp/js/kakao/templateComm.js @@ -70,27 +70,29 @@ function setContentsLengForFriends(contents){ } - + //제한글자수를 넘겼을 경우 최대 글자수까지 잘라주고 미리보기 및 글자수 표시처리 if(conLeng > limitLeng){ var splicecon = strMaxLengthSubstring(contents, limitLeng-1); $('#inputTemplateContent').val(splicecon); - return false; - - }else{//현재 입력한 글자수 우측 하단에 표시해 주기 - - var repContent = ""; - repContent = contents.replace(/(?:\r\n|\r|\n)/g, '
'); - - $('.nowChar').text(conLeng + " /"); - $('.totChar').text(" "+limitLeng); - $('.template_text').show(); - if(repContent != ''){ - $('.template_text').html(repContent); - }else{ - $('.template_text').html("내용 미리보기"); - } + contents = splicecon; + conLeng = strMaxCharacterCnt(contents); } + var repContent = ""; + repContent = contents.replace(/(?:\r\n|\r|\n)/g, '
'); + + $('.nowChar').text(conLeng + " /"); + $('.totChar').text(" "+limitLeng); + $('.template_text').show(); + if(repContent != ''){ + $('.template_text').html(repContent); + $('#smsTxtArea').val( + $('.template_text').html().trim().replace(/(
||
)/g, '\r\n') + ); + }else{ + $('.template_text').html("내용 미리보기"); + } + } \ No newline at end of file