into advc
This commit is contained in:
hehihoho3@gmail.com 2024-11-14 10:12:03 +09:00
commit b44427affa
69 changed files with 9569 additions and 1498 deletions

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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<MjonMsgSendVO> mjonMsgSendListVO, StatusResponse statusResponse, List<String> 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<String, Function<MjonMsgSendVO, String>> 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<String, Function<MjonMsgSendVO, String>> 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<String> 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<MjonMsgSendVO> list) { // 치환 구문과 필드 getter 매핑 Map<String,
* Function<MjonMsgSendVO, String>> 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<String, Function<MjonMsgSendVO, String>> 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) {

View File

@ -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;
}
}

View File

@ -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();

View File

@ -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<KakaoVO> kakaoTemplateInfoList = new ArrayList<KakaoVO>();
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<KakaoVO> 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

View File

@ -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<KakaoVO> kakaoSendList = new ArrayList<KakaoVO>();
//전체 받는사람 수량만큼 반복 확인
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<String[]> 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<String[]> varValList, List<String> 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<String> 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<String> 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<String> 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 "";
}
}

View File

@ -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;
}

View File

@ -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;
}
}

View File

@ -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;
}

View File

@ -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<KakaoVO>) list("kakaoAlimTalkDAO.selectKakaoAtSentRefundList");
}
@SuppressWarnings("unchecked")
public List<KakaoVO> selectKakaoFtSentRefundList() throws Exception{
return (List<KakaoVO>) 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);
}
}

View File

@ -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<String> dividDayList = kakaoVO.getDividDay();
//String sendTime = kakaoVO.getReqDate();
String[] phoneList = kakaoVO.getCallToList(); //받는사람 연락처 리스트
//카카오 알림톡 전송 리스트
List<KakaoVO> kakaoFtSendList = new ArrayList<KakaoVO>();
//야간스미싱 알림여부 정보 불러오기
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<MsgAlarmSetVO> 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<MsgHolidayVO> 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<KakaoVO> 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<KakaoVO> 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);
}
}
}
}

View File

@ -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";

View File

@ -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;
}

View File

@ -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;
}
}

View File

@ -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<KakaoButtonVO> buttonList = new ArrayList<KakaoButtonVO>();
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;
}
}

View File

@ -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<KakaoVO> resultProfileList = kakaoApiService.selectKakaoProfileList(kakaoVO);
model.addAttribute("resultProfileList", resultProfileList);
if(!userId.equals("") && !author.equals("ROLE_ADMIN")) {
// 특수문자 리스트 불러오기
MjonSymbolVO symbolVO = new MjonSymbolVO();
List<MjonSymbolVO> symbolList = mjonSymbolService.selectMjonSymbolList(symbolVO);
model.addAttribute("symbolList", symbolList);
//사용자 등록 발신프로필 정보 조회해오기
kakaoVO.setUserId(userId);
List<KakaoVO> resultProfileList = kakaoApiService.selectKakaoProfileList(kakaoVO);
model.addAttribute("resultProfileList", resultProfileList);
// 특수문자 리스트 불러오기
MjonSymbolVO symbolVO = new MjonSymbolVO();
List<MjonSymbolVO> symbolList = mjonSymbolService.selectMjonSymbolList(symbolVO);
model.addAttribute("symbolList", symbolList);
//아이디 발신번호 리스트 불러오기.
List<String> resultSendPhonList = mjonMsgDataService.selectSendPhonNumList(userId);
List<String> resultPhonList = new ArrayList<String>();
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<String> resultSendPhonList = mjonMsgDataService.selectSendPhonNumList(userId);
List<String> resultPhonList = new ArrayList<String>();
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<String> 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<String[]> 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<String[]> tempVarValList = new ArrayList<String[]>(); //임시 변수 리스트 저장용
String[] phoneList = kakaoVO.getCallToList();
List<String[]> 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<String> dividDayList = new ArrayList<String>();
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<String> arrPhoneList = new ArrayList<String>();
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<String> arrPhoneList = new ArrayList<String>();
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<MsgAlarmSetVO> 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<MsgHolidayVO> 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";
}
}

View File

@ -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<KakaoVO> 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<KakaoVO> resultProfileList = kakaoApiService.selectKakaoProfileList(kakaoVO);
model.addAttribute("resultProfileList", resultProfileList);
// 특수문자 리스트 불러오기
MjonSymbolVO symbolVO = new MjonSymbolVO();
List<MjonSymbolVO> 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<KakaoVO> kakaoTemplateInfoList = new ArrayList<KakaoVO>();
// 문자발송 완료건은 모두 보이도록 처리
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<KakaoVO> resultProfileList = kakaoApiService.selectKakaoProfileList(searchVO);
model.addAttribute("resultProfileList", resultProfileList);
} catch (Exception e) {
System.out.println("selectKakaoFriendsTemplateListAjax Controller Error !!! " + e);
}
return "/web/kakao/template/ft/KakaoFriendstalkTemplateListPopupAjax";
}
}

View File

@ -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<KakaoButtonVO> buttonList = new ArrayList<KakaoButtonVO>();
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;
}
}

View File

@ -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;

View File

@ -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<MjonMsgTabulVO> mjonMsgTabulListVO = new ArrayList<>();
private List<MjonMsgSendVO> mjonMsgSendVOList = new ArrayList<>();
}

View File

@ -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];
}
}

View File

@ -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<MjonMsgSendVO> 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<String> resultSpamTxt = mjonMsgDataService.selectSpamKeywordList();
if(!MsgSendUtils.populateSendLists(mjonMsgVO, mjonMsgSendVOList, statusResponse, resultSpamTxt)) {;
//문자 치환 전송 문자 길이를 초과하였습니다.
//문자 치환 오류가 발생하였습니다.
return statusResponse;
}
log.info(" ++ mjonMsgVO.getSpamStatus() :: [{}]", mjonMsgVO.getSpamStatus());
// 수신목록 셋팅
// 수신거부 목록 불러오기
List<String> userBlockList = mjonMsgDAO.selectUserBlockList(mjonMsgVO);
List<String> 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<String, String> fncSendMsgRtnMap(MjonMsgVO mjonMsgVO) throws Exception {
Map<String, String> returnMap = new HashMap<String, String>();
@ -4437,6 +4484,8 @@ public class MjonMsgDataServiceImpl extends EgovAbstractServiceImpl implements M
* 20241002 이호영
* 치환 장문, 단문이 모두 있을 있기 때문에 아래 로직처럼 모든 if를 열어둠
*/
/*
private Map<String, String> sendMessages(MjonMsgVO msgVO, ReplacementListsVO lists) throws Exception {
Map<String, String> 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);
// }
// }

View File

@ -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;

View File

@ -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<String> jasoList = HangulParser.disassemble(reMakeStringText);
//분리된 /모음 리스트를 다시 한글로 합쳐준다.
// 분리된 /모음을 합쳐 최종 문자열 생성
List<String> 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]+.*");
}
/*

View File

@ -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<String> 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;
}
}

View File

@ -425,8 +425,12 @@ public class SchdlrManageServiceImpl extends EgovAbstractServiceImpl implements
//카카오 환불 처리 리스트
public void kakaoFailPayBack() throws Exception {
//카카오 알림톡 환불 처리
kakaoAlimTalkService.selectKakaoAtSentRefundList();
//카카오 친구톡 환불 처리
kakaoAlimTalkService.selectKakaoFtSentRefundList();
}
@Override

View File

@ -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;
}

View File

@ -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"})

View File

@ -367,11 +367,11 @@
AND C.RSLT_CODE != '7000'
AND C.MSG_TYPE = '8'
) AS atFailCount ,
<!-- ( SELECT COUNT(0)
( SELECT COUNT(0)
FROM MJ_MSG_DATA C
WHERE C.DEL_FLAG = 'N'
AND C.RESERVE_C_YN = 'N'
AND C.MSG_GROUP_ID = MG.MSG_GROUP_ID
AND C.MSG_GROUP_ID = M2.msgGroupId
AND C.RSLT_CODE = '7000'
AND C.MSG_TYPE = '9'
) AS ftSuccessCount ,
@ -379,12 +379,12 @@
FROM MJ_MSG_DATA C
WHERE C.DEL_FLAG = 'N'
AND C.RESERVE_C_YN = 'N'
AND C.MSG_GROUP_ID = MG.MSG_GROUP_ID
AND C.MSG_GROUP_ID = M2.msgGroupId
AND C.RSLT_CODE != '7000'
AND C.MSG_TYPE = '9'
) AS ftFailCount , -->
'0' AS ftSuccessCount,
'0' AS ftFailCount,
) AS ftFailCount ,
<!-- '0' AS ftSuccessCount,
'0' AS ftFailCount, -->
M2.bizUmid,
M2.callStatus,
M2.bizKakaoResendYn,
@ -525,7 +525,7 @@
</isNotEmpty>
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 ,
<!-- ( SELECT COUNT(0)
( SELECT COUNT(0)
FROM MJ_MSG_DATA C
WHERE C.DEL_FLAG = 'N'
AND C.RESERVE_C_YN = 'N'
@ -1157,9 +1157,9 @@
AND C.MSG_GROUP_ID = M2.msgGroupId
AND C.RSLT_CODE != '7000'
AND C.MSG_TYPE = '9'
) AS ftFailCount ,-->
'0' AS ftSuccessCount,
'0' AS ftFailCount,
) AS ftFailCount ,
<!-- '0' AS ftSuccessCount,
'0' AS ftFailCount, -->
M2.bizUmid,
M2.callStatus,
M2.bizKakaoResendYn,
@ -1290,7 +1290,7 @@
</isNotEmpty>
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 @@
<isNotEmpty property="pageType">
<isEqual property="pageType" compareValue="sand">
AND M.AT_DELAY_COMPLETE_YN ='Y'
/** 20240119 우영두 수정 - 딜레이 승인된 건들만 조회하고 있어서 AND 조건 에서 OR 조건으로 변경 처리함 */
OR M.AT_DELAY_COMPLETE_YN ='Y'
/*AND M.REFUND_YN = 'N'*/
</isEqual>
</isNotEmpty>
@ -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

View File

@ -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#

View File

@ -103,6 +103,32 @@
AND MMD.MSG_TYPE = 8
</select>
<select id="kakaoAlimTalkDAO.selectKakaoFtSentRefundList" resultClass="kakaoVO">
SELECT
MMD.USER_ID AS userId
, MMD.MSG_GROUP_ID AS msgGroupId
, MMD.MSG_SEQ AS msgSeq
, MMD.USERDATA AS userData
, MMD.REFUND_YN AS refundYn
, MMD.RSLT_CODE AS rsltCode
, MMD.RSLT_CODE2 AS rsltCode2
, MMD.AGENT_CODE AS agentCode
, DATE_FORMAT(MMD.SENT_DATE,'%Y-%m-%d %T') AS sentDate
, DATE_FORMAT(MMD.RSLT_DATE,'%Y-%m-%d %T') AS rsltDate
, MMD.BIZ_KAKAO_RESEND_YN AS subMsgSendYn
, MMD.BIZ_KAKAO_RESEND_TYPE AS subMsgType
FROM
MJ_MSG_DATA MMD
INNER JOIN LETTNGNRLMBER MB
ON MMD.USER_ID = MB.MBER_ID
WHERE 1=1
AND MMD.CUR_STATE = '3'
AND MMD.REFUND_YN = 'N'
AND MMD.RESERVE_C_YN = 'N'
AND MMD.MSG_TYPE = 9
</select>
<select id="kakaoAlimTalkDAO.selectKakaoAtUmid" resultClass="kakaoVO" parameterClass="kakaoVO">
SELECT
BIZ_UMID AS bizUmid
@ -126,4 +152,22 @@
<procedure id="kakaoAlimTalkDAO.updateKakaoAtNotSend" parameterClass="kakaoVO">
{call kakaoAt_NotSend(#userId#, #msgGroupId#, #userData#)}
</procedure>
<!-- 카카오 친구톡 전송 환불 프로시저 실행 (카카오 전송 성공 관련 - 대체문자 선택시 차액 환불 처리) -->
<procedure id="kakaoAlimTalkDAO.updateKakaoFtSend" parameterClass="kakaoVO">
{call kakaoFt_Send(#userId#, #msgGroupId#, #userData#)}
</procedure>
<!-- 카카오 친구톡 전송 환불 프로시저 실행 (카카오 전송 실패시 대체문자 관련 - 대체문자 발송 완료 된 경우) -->
<procedure id="kakaoAlimTalkDAO.updateKakaoFtSubMsgSend" parameterClass="kakaoVO">
{call kakaoFt_SubMsg_Send(#userId#, #msgGroupId#, #userData#)}
</procedure>
<!-- 카카오 친구톡 전송 환불 프로시저 실행 (카카오 전송 실패시 대체문자 관련 - 대체문자 발송 실패 된 경우) -->
<procedure id="kakaoAlimTalkDAO.updateKakaoFtNotSend" parameterClass="kakaoVO">
{call kakaoFt_NotSend(#userId#, #msgGroupId#, #userData#)}
</procedure>
</sqlMap>

View File

@ -20,6 +20,7 @@
USER_ID,
ATCH_FILE_ID,
TEMPLATE_NAME,
IMAGE_FILE_NAME,
IMAGE_URL,
IMAGE_TYPE,
IMAGE_TITLE,
@ -38,6 +39,7 @@
, #userId#
, #bizJsonName#
, #templateName#
, #imageFileName#
, #templateImageUrl#
, #imageType#
, #imgTitle#
@ -94,72 +96,60 @@
<select id="kakaoFriendsTalkTemplateDAO.selectKakaoFriendsTemplateList" parameterClass="kakaoVO" resultClass="kakaoVO">
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#
<isNotEmpty property="searchKeyword">
AND KFT.TEMPLATE_NAME LIKE CONCAT ('%', #searchKeyword#,'%')
</isNotEmpty>
<isNotEmpty property="startDate">
<![CDATA[
AND DATE_FORMAT(KFT.FRST_REGIST_PNTTM, '%Y-%m-%d') >= DATE_FORMAT(#startDate#, '%Y-%m-%d')
]]>
</isNotEmpty>
<isNotEmpty property="startDate">
<![CDATA[
AND DATE_FORMAT(KFT.FRST_REGIST_PNTTM, '%Y-%m-%d') <= DATE_FORMAT(#endDate#, '%Y-%m-%d')
]]>
</isNotEmpty>
ORDER BY 1 =1
<isNotEmpty property="searchSortCnd">
<isEqual property="searchSortCnd" compareValue="curState">
, curState $searchSortOrd$
, orderByrsltCode
</isEqual>
<isNotEqual property="searchSortCnd" compareValue="curState">
,$searchSortCnd$
</isNotEqual>
</isNotEmpty>
<isNotEmpty property="searchSortOrd">
$searchSortOrd$
</isNotEmpty>
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#
<isNotEmpty property="senderKey">
AND KFT.SENDER_KEY = #senderKey#
</isNotEmpty>
<isNotEmpty property="searchKeyword">
AND KFT.TEMPLATE_NAME LIKE CONCAT ('%', #searchKeyword#,'%')
</isNotEmpty>
<isNotEmpty property="startDate">
<![CDATA[
AND DATE_FORMAT(KFT.FRST_REGIST_PNTTM, '%Y-%m-%d') >= DATE_FORMAT(#startDate#, '%Y-%m-%d')
]]>
</isNotEmpty>
<isNotEmpty property="startDate">
<![CDATA[
AND DATE_FORMAT(KFT.FRST_REGIST_PNTTM, '%Y-%m-%d') <= DATE_FORMAT(#endDate#, '%Y-%m-%d')
]]>
</isNotEmpty>
ORDER BY 1 =1
<isNotEmpty property="searchSortCnd">
<isEqual property="searchSortCnd" compareValue="curState">
, curState $searchSortOrd$
, orderByrsltCode
</isEqual>
<isNotEqual property="searchSortCnd" compareValue="curState">
,$searchSortCnd$
</isNotEqual>
</isNotEmpty>
<isNotEmpty property="searchSortOrd">
$searchSortOrd$
</isNotEmpty>
LIMIT #recordCountPerPage# OFFSET #firstIndex#
</select>
@ -199,5 +189,87 @@
</delete>
<select id="kakaoFriendsTalkTemplateDAO.selectKakaoFriendsTemplateDetail" parameterClass="kakaoVO" resultClass="kakaoVO">
SELECT 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_FILE_NAME AS imageFileName,
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_FILE_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 FRIEND_ID = #friendId#
)
A
LEFT JOIN MJ_KAKAO_PROFILE_INFO KPI
ON A.USER_ID = KPI.USER_ID
AND A.SENDER_KEY = KPI.SENDER_KEY
</select>
<update id="kakaoFriendsTalkTemplateDAO.updateKakaoFriendsTemplateData" parameterClass="kakaoVO" >
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>
<update id="kakaoFriendsTalkTemplateDAO.updateKakaoFriendsTemplateImageDataDel" parameterClass="kakaoVO">
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#
</update>
</sqlMap>

View File

@ -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

View File

@ -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#

View File

@ -183,6 +183,7 @@
<pattern>*/web/pop/*</pattern>
<pattern>/web/mjon/kakao/template/selectKakaoAlimtalkTemplateListPopupAjax.do</pattern>
<pattern>/web/mjon/kakao/alimtalk/selectKakaoAlimtalkTemplateDataTestPopup.do</pattern>
<pattern>/web/mjon/kakao/friendstalk/selectKakaoFriendsTalkTestSendPopup.do</pattern>
<pattern>/web/mjon/fax/faxSendDetailPopup.do</pattern>
</decorator>

View File

@ -5289,7 +5289,7 @@ function fnInputSmsTxt(){
<tr>
<th>구분</th>
<th>알림톡(<fmt:formatNumber value="${sysJoinSetVO.kakaoAtPrice}" pattern="###.#" />원)</th>
<th>친구톡(준비중)</th>
<th>친구톡(<fmt:formatNumber value="${sysJoinSetVO.kakaoFtPrice}" pattern="###.#" />원)</th>
<th>팩스(<fmt:formatNumber value="${sysJoinSetVO.faxPrice}" pattern="###.#" />원)</th>
</tr>
</thead>
@ -5297,7 +5297,7 @@ function fnInputSmsTxt(){
<tr>
<td>문자온 원가</td>
<td><c:out value="${kakaoAtCost}"/></td>
<td>준비중</td>
<td><c:out value="${kakaoFtCost}"/></td>
<td><c:out value="${faxCost}"/></td>
</tr>
<tr>
@ -5306,7 +5306,7 @@ function fnInputSmsTxt(){
<fmt:formatNumber value='${kakaoAtPrice}' pattern='###.#' />
</td>
<td>
준비중
<fmt:formatNumber value='${kakaoFtPrice}' pattern='###.#' />
</td>
<td>
<fmt:formatNumber value='${faxPrice}' pattern='###.#' />
@ -5315,7 +5315,7 @@ function fnInputSmsTxt(){
<tr>
<td>마진률</td>
<td><fmt:formatNumber value="${kakaoAtMargin}" pattern=".0" />%</td>
<td>준비중</td>
<td><fmt:formatNumber value="${kakaoFtMargin}" pattern=".0" />%</td>
<td><fmt:formatNumber value="${faxMargin}" pattern=".0" />%</td>
</tr>
</tbody>
@ -5772,6 +5772,10 @@ function fnInputSmsTxt(){
<th>알림톡 금액</th>
<td><input type="text" name="kakaoAtPrice" id="kakaoAtPrice" value="<c:out value='${kakaoAtPrice}'/>"/></td>
</tr>
<tr>
<th>친구톡 금액</th>
<td><input type="text" name="kakaoFtPrice" id="kakaoFtPrice" value="<c:out value='${kakaoFtPrice}'/>"/></td>
</tr>
</tbody>
</table>
<div class="button_box">

View File

@ -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 = "<c:url value='/uss/ion/kakaoat/KakaoATChannelIDTemplateListPopupAjax.do'/>";
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 = "<c:url value='/uss/ion/kakaoat/KakaoATChannelIDTemplateListPopupAjax.do'/>";
document.popupForm.action = "<c:url value='/uss/ion/kakaoft/KakaoFTChannelIDTemplateListPopupAjax.do'/>";
document.popupForm.target = "listPopup";
document.popupForm.submit();
@ -118,6 +132,7 @@ function fnSelectMber(mberId) {
<input type="hidden" name="mberId"/>
<input type="hidden" id="senderKey" name="senderKey" value=""/>
<input type="hidden" name="userId" value=""/>
<input type="hidden" name="yellowId" value=""/>
</form>
@ -193,6 +208,7 @@ function fnSelectMber(mberId) {
<col style="width: 19%">
<col style="width: 24%">
<col style="width: 10%">
<col style="width: 10%">
<col style="width: 11%">
<col style="width: 11%">
<col style="width: 10%">
@ -204,6 +220,7 @@ function fnSelectMber(mberId) {
<th>채널ID<input type="button" class="sort sortBtn" id="sort_yellowId"></th>
<th>채널명<input type="button" class="sort sortBtn" id="sort_yellowId"></th>
<th>등록상태</th>
<th>템플릿</th>
<th>채널생성일</th>
<th>채널등록일<input type="button" class="sort sortBtn" id="sort_lastUpdtPnttm"></th>
<th>삭제여부<input type="button" class="sort sortBtn" id="sort_deleteYn"></th>
@ -226,7 +243,7 @@ function fnSelectMber(mberId) {
<td onClick="fnTemplateListPop('<c:out value="${result.senderKey}"/>', '<c:out value="${result.userId}"/>');" style="cursor:pointer;">
<c:out value="${result.uuid}"/>
</td>
<td onClick="fnTemplateListPop('<c:out value="${result.senderKey}"/>', '<c:out value="${result.userId}"/>');" style="cursor:pointer;">
<td>
<c:out value="${result.name}"/>
</td>
<td>
@ -250,6 +267,10 @@ function fnSelectMber(mberId) {
</c:otherwise>
</c:choose>
</td>
<td>
<input type="button" class="btnType1" onClick="fnAtTemplateListPop('<c:out value="${result.uuid}"/>','<c:out value="${result.senderKey}"/>', '<c:out value="${result.userId}"/>');" value="AT"/>
<input type="button" class="btnType1" onClick="fnFtTemplateListPop('<c:out value="${result.senderKey}"/>', '<c:out value="${result.userId}"/>');" value="FT"/>
</td>
<td>
<fmt:parseDate value="${result.createdAt}" var="dateValue" pattern="yyyy-MM-dd HH:mm:ss"/>
<fmt:formatDate value="${dateValue}" pattern="yyyy-MM-dd"/>
@ -342,14 +363,14 @@ function fnSelectMber(mberId) {
</tr>
</c:forEach>
<c:if test="${empty resultChannelList}">
<tr><td colspan="14"><spring:message code="common.nodata.msg" /></td></tr>
<tr><td colspan="9"><spring:message code="common.nodata.msg" /></td></tr>
</c:if>
</tbody>
</table>
</div>
<!-- <div class="btnWrap">
<input type="button" class="btnType2" onclick="javascript:fnSttusYAll(); return false;" value="일괄승인">
</div> -->
<div class="btnWrap">
<!-- <input type="button" class="btnType2" onclick="javascript:fnSttusYAll(); return false;" value="일괄승인"> -->
</div>
<!-- 페이지 네비게이션 시작 -->
<c:if test="${!empty resultChannelList}">
<div class="page">

View File

@ -358,14 +358,17 @@ function fnTemplateDetail(templateCode){
<c:out value="${mjonKakaoATDetailVO.yellowId}"/>
</td>
</tr>
<tr>
<th><span class="reqArea">템플릿명</span></th>
<td colspan="3">
<div class="btnWrap">
<input type="button" class="btnType2" style="padding:5px 10px" onclick="fnTemplateDetail('<c:out value="${mjonKakaoATDetailVO.msgNoticetalkTmpKey}"/>'); return false;" value="템플릿 상세보기">
</div>
</td>
</tr>
<c:if test="${not empty mjonKakaoATDetailVO.msgNoticetalkTmpKey}">
<!-- 알림톡 템플릿 상세 팝업 호출 -->
<tr>
<th><span class="reqArea">템플릿명</span></th>
<td colspan="3">
<div class="btnWrap">
<input type="button" class="btnType2" style="padding:5px 10px" onclick="fnTemplateDetail('<c:out value="${mjonKakaoATDetailVO.msgNoticetalkTmpKey}"/>'); return false;" value="템플릿 상세보기">
</div>
</td>
</tr>
</c:if>
<%-- <tr>
<th><span class="reqArea">발신번호</span></th>
<td colspan="3">

View File

@ -358,14 +358,17 @@ function fnTemplateDetail(templateCode){
<c:out value="${mjonKakaoATDetailVO.yellowId}"/>
</td>
</tr>
<tr>
<th><span class="reqArea">템플릿명</span></th>
<td colspan="3">
<div class="btnWrap">
<input type="button" class="btnType2" style="padding:5px 10px" onclick="fnTemplateDetail('<c:out value="${mjonKakaoATDetailVO.msgNoticetalkTmpKey}"/>'); return false;" value="템플릿 상세보기">
</div>
</td>
</tr>
<c:if test="${not empty mjonKakaoATDetailVO.msgNoticetalkTmpKey}">
<!-- 알림톡 템플릿 상세 팝업 호출 -->
<tr>
<th><span class="reqArea">템플릿명</span></th>
<td colspan="3">
<div class="btnWrap">
<input type="button" class="btnType2" style="padding:5px 10px" onclick="fnTemplateDetail('<c:out value="${mjonKakaoATDetailVO.msgNoticetalkTmpKey}"/>'); return false;" value="템플릿 상세보기">
</div>
</td>
</tr>
</c:if>
<%-- <tr>
<th><span class="reqArea">발신번호</span></th>
<td colspan="3">

View File

@ -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"); %>
<!DOCTYPE html>
<html lang="ko">
<head>
<title>친구톡 템플릿 목록</title>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<link href="https://fonts.googleapis.com/css2?family=Noto+Sans+KR:wght@100;300;400;500;700;900&amp;display=swap"
rel="stylesheet">
<link rel="stylesheet" href="/publish/css/reset.css">
<link rel="stylesheet" href="/publish/css/jquery.mCustomScrollbar.css">
<link rel="stylesheet" href="/publish/css/common.css">
<link rel="stylesheet" href="/publish/css/button.css">
<link rel="stylesheet" href="/publish/css/content.css?date=202301160001">
<link rel="stylesheet" href="/publish/css/mem.css">
<link rel="stylesheet" href="/publish/css/font.css">
<link rel="stylesheet" href="/publish/css/popupLayer.css">
<script src="/publish/js/jquery-3.5.0.js"></script>
<script src="/publish/js/jquery.mCustomScrollbar.concat.min.js"></script>
<script src="/publish/js/common.js"></script>
<script src="/publish/js/content.js?date=202211070003"></script>
<script src="/publish/js/popupLayer.js"></script>
<script>
function linkPage(page){
form = document.listForm;
form.pageIndex.value=page;
form.action="<c:url value='/uss/ion/kakaoft/KakaoFTChannelIDTemplateListPopupAjax.do'/>";
form.submit();
}
function fnSearch(){
var templateStatus = $("select[name=selectTemplateStatus]").val();
var searchKeyword = $("input[name=inputSearchKeyword]").val();
if(searchKeyword != ''){
if(searchKeyword.length < 2 || searchKeyword.length > 50){
alert("검색어는 최소 2자 이상 50자 이내로 입력해야 합니다.");
return false;
}
}
var form = document.listForm;
form.searchKeyword.value = searchKeyword;
form.templateStatus.value = templateStatus;
linkPage(1);
}
function fnTemplateDetail(friendId){
var form = document.templateForm;
form.templateCode.value = friendId;
window.open("about:blank", 'popupTemplateDetail', 'width=1240, height=1080, top=100, left=100, fullscreen=no, menubar=no, status=no, toolbar=no, titlebar=yes, location=no, scrollbar=no');
form.action = "<c:url value='/uss/ion/kakaoft/KakaoFTChannelIDTemplateDetailPopupAjax.do'/>";
form.target = "popupTemplateDetail";
form.submit();
}
</script>
</head>
<body>
<div class="loading_layer">
<div class="loading_container">
<div class="bar"></div>
<div class="text">Loading</div>
</div>
</div>
<div class="top_content kakaotalkset_cont current pay_tab_wrap">
<form id="templateForm" name="templateForm" method="post">
<input type="hidden" name="SenderKey" value="<c:out value="${kakaoVO.senderKey }"/>">
<input type="hidden" id="templateCode" name="templateCode" value="">
<input type="hidden" id="tmpUserId" name="userId" value="<c:out value="${kakaoVO.userId}"/>">
</form>
<form id="listForm" name="listForm" method="post">
<input type="hidden" name="SenderKey" value="<c:out value="${kakaoVO.senderKey }"/>">
<input type="hidden" name="yellowId" value="<c:out value="${kakaoVO.yellowId }"/>">
<input type="hidden" id="page" name="page" value="">
<input type="hidden" id="pageIndex" name="pageIndex" value="">
<input type="hidden" id="searchKeyword" name="searchKeyword" value="">
<input type="hidden" id="templateStatus" name="templateStatus" value="">
<input type="hidden" id="templateCode" name="templateCode" value="">
<input type="hidden" id="listUserId" name="userId" value="<c:out value="${kakaoVO.userId}"/>">
</form>
<div class="info_popup ad_layer template_choice_popup adpopup01" style="width:930px; margin-left:45px;">
<div class="top_content kakaotalkset_cont current pay_tab_wrap" style="width:930px;">
<div class="popup_heading">
<p>친구톡 템플릿 선택</p>
</div>
<div class="layer_in">
<div class="popup_search_wrap type2 grayborder grayfill">
<input type="text" name="inputSearchKeyword" id="inputSearchKeyword" placeholder="템플릿명을 입력해주세요." class="inputType template_name" value="<c:out value='${kakaoVO.keyword}'/>">
<button type="button" class="popup_button_type bluefill" onclick="fnSearch(); return false;">검색</button>
</div>
<div class="template_list">
<ul class="kakao_template_list thumbnail_list">
<c:choose>
<c:when test="${not empty kakaoTemplateInfoList}">
<c:forEach var="templatInfoList" items="${kakaoTemplateInfoList}" varStatus="status">
<li>
<div class="kakao_template_wrap">
<div class="template_cont">
<div class="title">
<div class="check">
</div>
<p title="친구톡 템플릿 내용" onclick="javascript:fnTemplateDetail('<c:out value="${templatInfoList.friendId}"/>'); return false;" style="cursor:pointer;">
<c:if test="${templatInfoList.adFlag eq 'Y'}">(광고)</c:if>
<c:out value="${fn:replace(templatInfoList.yellowId, '@', '')}"/>
</p>
</div>
<div class="allimtalk_content" onclick="javascript:fnTemplateDetail('<c:out value="${templatInfoList.friendId}"/>'); return false;" style="cursor:pointer;">
<!-- 템플릿에 이미지가 있는경우 이미지 표시 -->
<c:if test="${not empty templatInfoList.imageType}">
<div class="img_box">
<img src="<c:url value='${templatInfoList.templateImageUrl}'/>" alt="">
</div>
</c:if>
<p class="template_text"><c:out value="${fn:replace(fn:replace(templatInfoList.templateContent, newLineChar, '<br/>'), newLineChar2, '<br/>')}" escapeXml="false"/></p>
<!-- 채널 추가형을 선택한 경우 자동으로 버튼이 하나 추가됨, 버튼을 추가한 경우 버튼 정보 표시 -->
<c:forEach var="templatInfoButtonList" items="${templatInfoList.buttonVOList}" varStatus="status">
<button type="button" class="btn_kakao_type"><c:out value="${templatInfoButtonList.name}"/></button>
</c:forEach>
</div>
</div>
<c:if test="${templatInfoList.adFlag eq 'Y'}">
<p class="cf_text">수신거부 홈 > 채널차단</p>
</c:if>
</div>
<div class="kakao_template_info">
<dl>
<dt>템플릿명</dt>
<dd>
<c:out value="${templatInfoList.templateName}"/>
</dd>
</dl>
<dl>
<dt>등록일</dt>
<dd><c:out value="${templatInfoList.frstRegistPnttm}"/>
<%-- <div class="btn_wrap">
<button type="button" class="btn_template_edit" title="템플릿 수정" onclick="javascript:fnTemplateDetail('<c:out value="${templatInfoList.friendId}"/>'); return false;"><img src="/publish/images/content/btn_template_edit.png" alt=""></button>
<button type="button" class="btn_template_delete" title="템플릿 삭제" onclick="javascript:fnTemplateDelBtn('<c:out value="${templatInfoList.friendId}"/>'); return false;"><img src="/publish/images/content/btn_template_delete.png" alt=""></button>
</div> --%>
</dd>
</dl>
</div>
</li>
</c:forEach>
</c:when>
<c:otherwise>
<li class="template_none">등록된 템플릿이 없습니다.</li>
</c:otherwise>
</c:choose>
</ul>
</div>
<!-- pagination -->
<c:if test="${not empty kakaoTemplateInfoList}">
<ul class="pagination">
<ui:pagination paginationInfo = "${paginationInfo}" type="imageWeb" jsFunction="linkPage" />
</ul><!-- //pageWrap -->
</c:if>
</div>
</div>
</div>
</div>
</body>
</html>

View File

@ -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"%>
<script type="text/javascript">
@ -88,5 +90,8 @@ function fnLinkPageTab(tabInfo){
<li id="tabStep" class="tab subTab"><button type="button" onclick="javascript:fnLinkPageTab('tabStep');">사용안내</button></li>
<li id="tabProfile" class="tab subTab"><button type="button" onclick="javascript:fnLinkPageTab('tabProfile');">채널ID 등록/관리</button></li>
<li id="tabTemplate" class="tab subTab"><button type="button" onclick="javascript:fnLinkPageTab('tabTemplate');">알림톡 템플릿 등록/관리</button></li>
<!-- <li id="tabSubFt" class="tab subTab"><button type="button" onclick="javascript:fnLinkPageTab('tabSubFt');">친구톡 템플릿 등록/관리</button></li> -->
<c:if test="${loginVO.id eq 'rosewiper'}">
<li id="tabSubFt" class="tab subTab"><button type="button" onclick="javascript:fnLinkPageTab('tabSubFt');">친구톡 템플릿 등록/관리</button></li>
</c:if>
</ul>

View File

@ -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"%>
<script type="text/javascript">
@ -27,6 +29,11 @@ function initMenuTopTab(){
}else if(menuTopTab == 'tabAlim'){
$(".topTab").removeClass("active");
$("#tabAt").addClass("active");
}else if(menuTopTab == 'tabFriend'){
$(".topTab").removeClass("active");
$("#tabFt").addClass("active");
}else if(menuTopTab == 'tabIntro'){
$(".topTab").removeClass("active");
$("#tabIntro").addClass("active");
@ -51,16 +58,18 @@ function fnLinkPageTopTab(tabInfo){
}else if(tabInfo == 'tabFriend'){
alert("친구톡 메뉴는 현재 개발이 진행 중입니다.");
return false
url = "<c:url value='/web/mjon/kakao/friendstalk/kakaoFriendsTalkMsgDataView.do'/>";
}else if(tabInfo == 'tabAlimtalkIntrd'){
url = "<c:url value='/web/mjon/kakao/alimtalk/kakaoAlimtalkIntrdView.do'/>";
}
form.action =url;
form.submit();
//form.action =url;
//form.submit();
//메뉴 선택시 폼 데이터로 인한 오류 발생하여 location으로 변경 - 20240117 우영두
location.href=url;
}
@ -133,6 +142,11 @@ function cntntBtnInfo(stepInfo){
<ul class="tabType4">
<li id="tabAt" class="tab topTab"><button type="button" onclick="javascript:fnLinkPageTopTab('tabAlim');">알림톡</button></li>
<c:if test="${fn:contains(pageContext.request.requestURL , 'localhost')
|| fn:contains(pageContext.request.requestURL , '192.168.0.33')
|| fn:contains(pageContext.request.requestURL , '119.193.215.98')}">
<li id="tabFt" class="tab topTab"><button type="button" onclick="javascript:fnLinkPageTopTab('tabFriend');">친구톡</button></li>
</c:if>
<li id="tabConf" class="tab topTab"><button type="button" onclick="javascript:fnLinkPageTopTab('tabConf');">카카오톡 설정</button></li>
<li id="tabIntro" class="tab topTab"><button type="button" onclick="javascript:fnLinkPageTopTab('tabAlimtalkIntrd');">알림톡 소개</button></li>
</ul>

View File

@ -0,0 +1,122 @@
<%@ page language="java" contentType="text/html; charset=UTF-8" %>
<div class="cnt_character">
<div class="box_character">
<a href="javascript:void(0)" class="changeWord" value="(미소)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_001.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(윙크)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_002.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(방긋)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_003.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(반함)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_004.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(눈물)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_005.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(절규)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_006.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(크크)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_007.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(메롱)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_008.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(잘자)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_009.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(잘난척)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_010.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(헤롱)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_011.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(놀람)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_012.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(아픔)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_013.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(당황)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_014.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(풍선껌)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_015.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(버럭)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_016.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(부끄)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_017.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(궁금)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_018.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(흡족)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_019.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(깜찍)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_020.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(으으)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_021.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(민망)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_022.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(곤란)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_023.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(잠)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_024.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(행복)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_025.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(안도)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_026.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(우웩)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_027.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(외계인)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_028.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(외계인녀)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_029.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(공포)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_030.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(근심)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_031.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(악마)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_032.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(썩소)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_033.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(쳇)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_034.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(야호)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_035.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(좌절)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_036.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(삐침)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_037.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(하트)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_038.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(실연)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_039.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(별)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_040.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(브이)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_041.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(오케이)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_042.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(최고)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_043.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(최악)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_044.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(그만)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_045.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(땀)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_046.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(알약)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_047.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(밥)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_048.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(커피)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_049.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(맥주)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_050.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(소주)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_051.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(와인)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_052.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(치킨)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_053.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(축하)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_054.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(음표)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_055.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(선물)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_056.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(케이크)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_057.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(촛불)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_058.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(컵케이크a)'"><img src="/publish/images/kakao_emoticon/kakao_emoticon_059.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(컵케이크b)'"><img src="/publish/images/kakao_emoticon/kakao_emoticon_060.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(해)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_061.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(구름)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_062.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(비)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_063.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(눈)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_064.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(똥)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_065.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(근조)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_066.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(딸기)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_067.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(호박)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_068.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(입술)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_069.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(야옹)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_070.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(돈)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_071.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(담배)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_072.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(축구)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_073.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(야구)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_074.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(농구)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_075.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(당구)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_076.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(골프)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_077.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(카톡)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_078.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(꽃)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_079.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(총)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_080.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(크리스마스)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_081.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(콜)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_082.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(하트뿅)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1001.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(하하)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1002.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(우와)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1003.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(심각)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1004.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(힘듦)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1005.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(흑흑)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1006.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(아잉)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1007.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(찡긋)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1008.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(뿌듯)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1009.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(깜짝)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1010.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(빠직)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1011.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(짜증)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1012.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(제발)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1013.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(씨익)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1014.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(신나)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1015.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(헉)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1016.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(열받아)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1017.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(흥)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1018.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(감동)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1019.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(뽀뽀)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1020.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(멘붕)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1021.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(정색)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1022.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(쑥스)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1023.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(꺄아)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1024.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(좋아)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1025.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(굿)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1026.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(훌쩍)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1027.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(허걱)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1028.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(부르르)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1029.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(푸하하)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1030.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(발그레)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1031.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(수줍)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1032.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(컴온)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1033.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(졸려)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1034.png" alt="" /></a>
</div>
</div>

View File

@ -135,7 +135,7 @@
<!-- 텍스트 미리보기 -->
<div class="text_preview">
<div class="allimtalk_title">
<img src="/publish/images/content/icon_allimtalk.png" alt="">친구톡 수정
<img src="/publish/images/content/icon_allimtalk.png" alt="">알림톡 도착
</div>
<div class="allimtalk_content" id="alimtalkTemplate">
<!-- <p class="emphasis_side_text">템플릿을 선택해 주세요</p> -->
@ -196,10 +196,10 @@
<!-- 텍스트 미리보기 -->
<!-- //텍스트 미리보기 -->
<div class="template_info_wrap">
<!-- <div class="template_info_wrap">
<div class="template_byte">
</div>
</div>
</div> -->
</div>
<p class="addText">※ 단말기 설정에 따라 다르게 보일 수 있습니다<p>
</div>

View File

@ -1188,11 +1188,11 @@ function checkNumber(event) {
<!-- 문자발송 성공 레이어팝업 -->
<div class="popup-com pop_msg_success">
<div class="popup_heading">
<p>알톡 전송 결과</p>
<p>알톡 전송 결과</p>
<button type="button" class="tooltip-close" onclick="msgSuccessClose(this);"><img src="/publish/images/content/layerPopup_close.png" alt="팝업 닫기"></button>
</div>
<div class="layer_in">
<div class="msg_text">발송 성공 : <strong>1</strong> 건,수신거부 : <span>0</span>건의<br>문자가 발송 되었습니다.</div>
<div class="msg_text">발송 성공 : <strong>1</strong> 건,수신거부 : <span>0</span>건의<br>알림톡이 발송 되었습니다.</div>
</div>
<div class="popup_btn">
<button type="button" onclick="msgResultLink(); return false;">알림톡 발송결과 바로가기</button>
@ -1249,7 +1249,7 @@ function checkNumber(event) {
<tr>
<th>채널ID</th>
<td>
<label for="" class="채널ID 선택"></label>
<label for="selectKakaoProfileList" class="채널ID 선택"></label>
<select class="select_gray_type" id="selectKakaoProfileList" name="selectKakaoProfileList">
<option value="">채널ID 선택</option>
<c:forEach var="kakaoProfileInfo" items="${kakaoProfileList}" varStatus="status">
@ -1285,7 +1285,7 @@ function checkNumber(event) {
<td class="putText">
<div class="clearfix receipt_num receiver_wrap01">
<div class="receipt_num_top">
<label for="" class="label">받는 번호입력</label>
<label for="callTo" class="label">받는 번호입력</label>
<input type="text" id="callTo" name="callTo" oninput="this.value = this.value.replace(/[^0-9.]/g, '').replace(/(\..*)\./g, '$1');" placeholder="번호를 입력하세요" onfocus="this.placeholder=''" onblur="this.placeholder='번호를 입력하세요'" style="width:340px;">
<button type="button" class="btnType btnType6 addCallToF">번호추가</button>
</br>
@ -1301,7 +1301,7 @@ function checkNumber(event) {
<div class="listType list01" >
<div class="list_table list_head">
<div class="cb_wrap">
<label for="" class="label"></label>
<label for="select_all" class="label"></label>
<input type="checkbox" id="select_all">
</div>
<div class="list_table_num">
@ -1416,7 +1416,7 @@ function checkNumber(event) {
<tr>
<th>발신번호</th>
<td class="put_num">
<label for="callFrom" class="label"></label>
<label for="callFromList" class="label"></label>
<select id="callFromList" name="callFromList" class="sel_number">
<c:choose>
<c:when test="${not empty resultPhonList}">
@ -1522,7 +1522,7 @@ function checkNumber(event) {
<div class="calendar_wrap">
<input type="text" class="startDate2 inp resDate calendar picker__input picker__input--active" title="검색 시작일" id="startDate2" name="startDate2" value="" data-datecontrol="true" readonly="" aria-haspopup="true" aria-expanded="true" aria-readonly="false" aria-owns="startDate2_root">
</div>
<label for="" class="label">시 선택</label>
<label for="msgResHour" class="label">시 선택</label>
<div class="selBox">
<select class="selType1" id="msgResHour" name="msgResHour">
<c:forEach var="hour" begin="0" end="23" step="1" varStatus="status">
@ -1536,7 +1536,7 @@ function checkNumber(event) {
</c:choose>
</c:forEach>
</select>
<label for="" class="label">분 선택</label>
<label for="msgResMin" class="label">분 선택</label>
<select class="selType1" id="msgResMin" name="msgResMin">
<c:forEach var="min" begin="0" end="55" step="5">
<c:choose>
@ -1553,9 +1553,9 @@ function checkNumber(event) {
</div>
<div class="rev_bottom">
<input type="checkbox" id="inputDivideChk" name="inputDivideChk">
<label for="">분할전송</label>
<label for="inputDivideChk">분할전송</label>
<input type="text" class="dividType1" id="frmDivideCnt" name="frmDivideCnt" value="20" onkeypress='return checkNumber(event)' maxlength="4"/>
<label for="divideCnt">건씩</label>
<label for="frmDivideCnt">건씩</label>
<select class="selType1" id="divideTime" name="divideTime">
<option value="5">05분</option>
<option value="10">10분</option>
@ -1596,7 +1596,7 @@ function checkNumber(event) {
<input type="hidden" name="searchCondition" id="searchCondition" value="0" />
<div class="adr_pop_left">
<div class="adr_left_search">
<label for="searchKeyword" class="label">그룹명 검색</label>
<label for="searchGrpKeyword" class="label">그룹명 검색</label>
<input type="text" name="searchGrpKeyword" id="searchGrpKeyword" placeholder="그룹명 검색" onfocus="this.placeholder=''" onblur="this.placeholder='그룹명 검색'" class="inputLight">
<button type="button" onClick="javascrit:fnAddrGrpSearch(); return false;"><img src="/publish/images/popup/search.png" alt="검색"></button>
</div>
@ -1737,7 +1737,7 @@ function checkNumber(event) {
<button type="button" class="excel_btn" onclick="location.href='/download/msg/알림톡_엑셀주소록_등록양식.xlsx'"><i class="downroad"></i>샘플파일 다운로드</button>
</div>
<div class="attachedFile">
<label for="" class="attachedFile_label">첨부파일</label>
<label for="excelNm01" class="attachedFile_label">첨부파일</label>
<input type="text" id="excelNm01" value="" readonly>
<input type="file" id="excelFile01" accept=".xls, .xlsx" onchange="excelExportAjax(event); return false;" style="display:none"/>
<!-- <input type="file" id="excelFile01" accept=".xls, .xlsx" onchange="excelExport01(event); return false;" style="display:none"/> -->

View File

@ -0,0 +1,221 @@
<%@ 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 prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<%@ taglib prefix="ec" uri="/WEB-INF/tld/ecnet_tld.tld"%>
<% pageContext.setAttribute("newLineChar", "\r\n"); %>
<% pageContext.setAttribute("newLineChar2", "\n"); %>
<script>
function fn_testSendMsgData(){
var callNum = $("#callTo").val(); // 받는 전화번호
var userMoney = $('#oriUserMoney').val(); // 사용자 금액
var kakaoFtPrice = $('#kakaoFtPrice').val(); // 카카오전송 금액
var resutlPrice = parseFloat(userMoney)-parseFloat(kakaoFtPrice); // 금액 확인
// 음수면 -1 값
if(Math.sign(resutlPrice) < 0){
alert("발송에 필요한 회원님의 보유 잔액이 부족 합니다.");
return false;
}
$('#bizForm #callToList').val(callNum);
var data = new FormData(document.bizForm);
$.ajax({
type: "POST"
, url: "/web/mjon/kakao/friendstalk/kakaoFriendsTalkMsgSendAjax.do"
, data: data
, dataType: 'json'
, async: true
, processData: false
, contentType: false
, cache: false
, success: function (returnData, status) {
if(status == 'success'){
if("loginFail" == returnData.result){
alert(returnData.message);
return false;
}else if('fail' == returnData.result){
alert(returnData.message);
return false;
} else if(status == 'success'){
alert("테스트 친구톡 전송이 완료 되었습니다.")
window.close();
}
}
}
,beforeSend : function(xmlHttpRequest) {
//로딩창 show
$('.loading_layer').addClass('active');
}
,complete : function(xhr, textStatus) {
//로딩창 hide
$('.loading_layer').removeClass('active');
}
,error: function (e) {
console.log("ERROR : ", e);
alert("카카오 친구톡 전송에 실패하였습니다.");
}
});
}
</script>
<form id="bizForm" name="bizForm" method="post">
<input type="hidden" id="senderKey" name="senderKey" value="<c:out value='${kakaoVO.senderKey}'/>"> <!-- 카카오 보내는 사람 Key -->
<input type="hidden" id="templateContent" name="templateContent" value="<c:out value='${kakaoVO.templateContent }'/>"> <!-- 카카오 전송 templat내용 -->
<input type="hidden" id="callToList" name="callToList" value=""> <!-- 카카오 전송 전화번호 -->
<input type="hidden" id="txtReplYn" name="txtReplYn" value="N"> <!-- 치환문자 여부 - -->
<input type="hidden" id="subMsgSendYn" name="subMsgSendYn" value="N"> <!-- 대체문자 전송여부 -->
<input type="hidden" id="reserveYn" name="reserveYn" value="N"> <!-- 예약문자 여부 -->
<input type="hidden" id="divideChk" name="divideChk" value="N"> <!--분할발성 체크 여부-->
<input type="hidden" id="reqDate" name="reqDate" value=""> <!--전송일자-->
<input type="hidden" id="bizJsonYn" name="bizJsonYn" value="<c:out value='${kakaoVO.bizJsonYn}' />"> <!-- JSON 생성 여부 -->
<input type="hidden" id="imageType" name="imageType" value="<c:out value='${kakaoVO.imageType}'/>"/> <!-- 이미지 종류 -->
<input type="hidden" id="imageFileName" name="imageFileName" value="<c:out value='${kakaoVO.imageFileName}'/>"> <!-- 이미지 파일 이름 -->
<input type="hidden" id="templateImageUrl" name="templateImageUrl" value="<c:out value='${kakaoVO.templateImageUrl}'/>"> <!-- 이미지 경로 -->
<input type="hidden" id="imgTitle" name="imgTitle" value="<c:out value='${kakaoVO.imgTitle}'/>"> <!-- 이미지 타이틀 -->
<input type="hidden" id="imgLink" name="imgLink" value="<c:out value='${kakaoVO.imgLink}'/>"> <!-- 이미지 링크정보 -->
<input type="hidden" id="adFlag" name="adFlag" value="<c:out value='${kakaoVO.adFlag}'/>"/> <!-- 광고여부 -->
<input type="hidden" id="spamStatus" name="spamStatus" value="N"/>
<input type="hidden" id="atSmishingYn" name="atSmishingYn" value="N"/>
<input type="hidden" id="kakaoFtPrice" value="<c:out value='${kakaoFtPrice}' />">
<input type="hidden" id="eachPrice" name="eachPrice" value="<c:out value='${kakaoFtPrice}' />"/>
<input type="hidden" id="totPrice" name="totalPrice" value="<c:out value='${kakaoFtPrice}' />"/>
<input type="hidden" id="varValList" name="varValList" value="<c:out value='${kakaoVO.varValList}' />"/>
<!-- 버튼 정보 처리 -->
<c:forEach var="buttonList" items="${kakaoVO.buttonVOList}" varStatus="status">
<c:if test="${buttonList.linkType eq 'DS'}">
<!-- 배송조회 버튼 -->
<input type="hidden" id="buttonLikeTypeDeliv" name="buttonVOList[${status.index}].linkType" value="DS"/>
<input type="hidden" id="btnNmDeliv" name="buttonVOList[${status.index}].name" value="<c:out value='${buttonList.name}'/>">
</c:if>
<c:if test="${buttonList.linkType eq 'WL'}">
<!-- 웹링크 버튼 -->
<input type="hidden" id="buttonLikeTypeWeb" name="buttonVOList[${status.index}].linkType" value="WL"/>
<input type="hidden" id="btnNmWeb" name="buttonVOList[${status.index}].name" value="<c:out value='${buttonList.name}'/>">
<input type="hidden" id="buttonLinkMo" name="buttonVOList[${status.index}].linkMo" value="<c:out value='${buttonList.linkMo}'/>">
<input type="hidden" id="buttonLinkPc" name="buttonVOList[${status.index}].linkPc" value="<c:out value='${buttonList.linkPc}'/>">
</c:if>
<c:if test="${buttonList.linkType eq 'AL'}">
<!-- 앱링크 버튼 -->
<input type="hidden" id="buttonLikeTypeApp" name="buttonVOList[${status.index}].linkType" value="AL"/>
<input type="hidden" id="btnNmApp" name="buttonVOList[${status.index}].name" value="<c:out value='${buttonList.name}'/>">
<input type="hidden" id="buttonLinkAnd" name="buttonVOList[${status.index}].linkAnd" value="<c:out value='${buttonList.linkAnd}'/>">
<input type="hidden" id="buttonLinkIos" name="buttonVOList[${status.index}].linkIos" value="<c:out value='${buttonList.linkIos}'/>">
</c:if>
<c:if test="${buttonList.linkType eq 'BK'}">
<!-- 봇키워드 -->
<input type="hidden" id="buttonLikeTypeBot" name="buttonVOList[${status.index}].linkType" value="BK"/>
<input type="hidden" id="btnNmBot" name="buttonVOList[${status.index}].name" value="<c:out value='${buttonList.name}'/>">
</c:if>
<c:if test="${buttonList.linkType eq 'MD'}">
<!-- 메시지 전달 -->
<input type="hidden" id="buttonLikeTypeMsg" name="buttonVOList[${status.index}].linkType" value="MD" />
<input type="hidden" id="btnNmMsg" name="buttonVOList[${status.index}].name" value="<c:out value='${buttonList.name}'/>">
</c:if>
<c:if test="${buttonList.linkType eq 'BC'}">
<!-- 상담톡 전환 -->
<input type="hidden" id="buttonLikeTypeCons" name="buttonVOList[${status.index}].linkType" value="BC" />
<input type="hidden" id="btnNmCons" name="buttonVOList[${status.index}].name" value="<c:out value='${buttonList.name}'/>">
</c:if>
<c:if test="${buttonList.linkType eq 'BT'}">
<!-- 챗봇전환 -->
<input type="hidden" id="buttonLikeTypeBotChg" name="buttonVOList[${status.index}].linkType" value="BT" />
<input type="hidden" id="btnNmBotChg" name="buttonVOList[${status.index}].name" value="<c:out value='${buttonList.name}'/>">
</c:if>
</c:forEach>
</form>
<!-- 유저 보유잔액 -->
<input type="hidden" id="oriUserMoney" value="<c:out value='${userMoney}' />">
<div class="test_sendpop kakao_rev_popup" style="width: 770px;">
<div class="info_popup">
<div class="popup_heading">
<p>테스트 발송</p>
</div>
<div class="layer_in">
<ul class="info_list">
<li>테스트 발송은 친구톡을 본인에게 발송하여 친구톡 내용을 미리 확인하는 서비스 입니다.</li>
</ul>
</div>
</div>
<div class="test_wrap kakao_wrap">
<div class="number">
<dl>
<dt>수신번호</dt>
<dd>
<input type="text" id="callTo" name="callTo" maxlength="11" oninput="this.value = this.value.replace(/[^0-9]/g, '').replace(/(\..*)\./g, '$1');" placeholder="번호를 입력하세요" onfocus="this.placeholder=''" onblur="this.placeholder='번호를 입력하세요'">
</dd>
</dl>
<dl class="price">
<dt>발송금액</dt>
<dd><span>${kakaoFtPrice}</span>원</dd>
</dl>
<p class="text">발송하시겠습니까?<span>※ 친구톡 발송과 동일하게 요금이 차감됩니다.</span></p>
<button type="button" class="btnType btnType10" onclick="fn_testSendMsgData(); return false;">테스트발송</button>
</div>
<div class="phone">
<div class="phoneIn">
<p class="prev_p" id="prev_p_top">
${kakaoVO.yellowId}
</p>
<!-- 텍스트 미리보기 -->
<div class="text_preview">
<div class="allimtalk_title">
<img src="/publish/images/content/icon_allimtalk.png" alt="">친구톡
</div>
<div class="allimtalk_content" id="alimtalkTemplate">
<!-- <p class="emphasis_side_text">템플릿을 선택해 주세요</p> -->
<c:if test="${kakaoVO.imageType eq 'I' || kakaoVO.imageType eq 'W'}">
<div class="kakao_image">
<img src="<c:url value='${kakaoVO.templateImageUrl}'/>" alt="">
</div>
</c:if>
<!-- 알림톡 내용 표시 -->
<p class="template_text">
<c:out value="${fn:replace(fn:replace(kakaoVO.templateContent, newLineChar, '<br/>'), newLineChar2, '<br/>')}" escapeXml="false"/>
</p>
<!-- 채널 추가형을 선택한 경우 자동으로 버튼이 하나 추가됨, 버튼을 추가한 경우 버튼 정보 표시 -->
<c:forEach var="templatInfoButtonList" items="${kakaoVO.buttonVOList}" varStatus="status">
<button type="button" class="btn_kakao_type"><c:out value="${templatInfoButtonList.name}"/></button>
</c:forEach>
</div>
</div>
<!-- 텍스트 미리보기 -->
<!-- //텍스트 미리보기 -->
<!-- <div class="template_info_wrap">
<div class="template_byte">
</div>
</div> -->
</div>
<p class="addText">※ 단말기 설정에 따라 다르게 보일 수 있습니다<p>
</div>
</div>
</div>

View File

@ -19,12 +19,33 @@
<div class="rev_pop_in">
<div class="rev_pop_middle clearfix">
<span><c:out value="${resultMsgDetail.reqDate }" /></span>
<span class="msg_com msg_allimtalk">알림톡</span>
<span class="msg_com msg_allimtalk">
<c:choose>
<c:when test="${msgType eq '8'}">
알림톡
</c:when>
<c:when test="${msgType eq '9'}">
친구톡
</c:when>
<c:otherwise>
</c:otherwise>
</c:choose>
</span>
</div>
<div class="rev_pop_txt">
<div class="text_preview">
<div class="allimtalk_title">
<img src="/publish/images/content/icon_allimtalk.png" alt="">알림톡 도착
<img src="/publish/images/content/icon_allimtalk.png" alt="">
<c:choose>
<c:when test="${msgType eq '8'}">
알림톡 도착
</c:when>
<c:when test="${msgType eq '9'}">
친구톡 도착
</c:when>
<c:otherwise>
</c:otherwise>
</c:choose>
</div>
<div class="allimtalk_content">
<!-- 강조 텍스트 -->

View File

@ -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){
<ul class="list_tab">
<li class="tab active"><button type="button" onclick="fnTabLoad('',0); return false;">전체</button></li>
<li class="tab"><button type="button" onclick="fnTabLoad('at', 1); return false;">알림톡</button></li>
<!-- <li class="tab"><button type="button" onclick="fnTabLoad('ft', 2); return false;">친구톡</button></li> -->
<c:if test="${fn:contains(pageContext.request.requestURL , 'localhost')
|| fn:contains(pageContext.request.requestURL , '192.168.0.33')
|| fn:contains(pageContext.request.requestURL , '119.193.215.98')}">
<li class="tab"><button type="button" onclick="fnTabLoad('ft', 2); return false;">친구톡</button></li>
</c:if>
</ul><!--// tab button -->
</div>
<!-- 예약관리 > 전체 -->

View File

@ -972,128 +972,8 @@ $(document).on('click', '.symbolButton, .changeWord', function (){
<button type="button" class="btnType btnType7"
onclick="miniPopup(this)">카카오 이모티콘</button>
<div class="send_miniPop spc_character kakao_emoticon">
<div class="cnt_character">
<div class="box_character">
<a href="javascript:void(0)" class="changeWord" value="(미소)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_001.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(윙크)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_002.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(방긋)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_003.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(반함)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_004.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(눈물)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_005.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(절규)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_006.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(크크)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_007.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(메롱)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_008.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(잘자)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_009.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(잘난척)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_010.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(헤롱)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_011.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(놀람)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_012.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(아픔)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_013.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(당황)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_014.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(풍선껌)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_015.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(버럭)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_016.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(부끄)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_017.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(궁금)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_018.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(흡족)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_019.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(깜찍)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_020.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(으으)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_021.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(민망)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_022.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(곤란)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_023.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(잠)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_024.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(행복)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_025.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(안도)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_026.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(우웩)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_027.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(외계인)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_028.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(외계인녀)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_029.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(공포)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_030.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(근심)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_031.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(악마)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_032.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(썩소)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_033.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(쳇)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_034.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(야호)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_035.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(좌절)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_036.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(삐침)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_037.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(하트)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_038.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(실연)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_039.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(별)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_040.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(브이)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_041.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(오케이)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_042.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(최고)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_043.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(최악)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_044.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(그만)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_045.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(땀)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_046.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(알약)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_047.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(밥)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_048.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(커피)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_049.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(맥주)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_050.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(소주)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_051.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(와인)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_052.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(치킨)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_053.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(축하)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_054.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(음표)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_055.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(선물)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_056.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(케이크)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_057.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(촛불)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_058.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(컵케이크a)'"><img src="/publish/images/kakao_emoticon/kakao_emoticon_059.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(컵케이크b)'"><img src="/publish/images/kakao_emoticon/kakao_emoticon_060.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(해)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_061.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(구름)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_062.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(비)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_063.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(눈)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_064.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(똥)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_065.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(근조)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_066.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(딸기)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_067.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(호박)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_068.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(입술)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_069.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(야옹)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_070.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(돈)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_071.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(담배)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_072.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(축구)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_073.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(야구)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_074.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(농구)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_075.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(당구)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_076.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(골프)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_077.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(카톡)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_078.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(꽃)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_079.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(총)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_080.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(크리스마스)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_081.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(콜)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_082.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(하트뿅)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1001.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(하하)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1002.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(우와)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1003.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(심각)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1004.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(힘듦)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1005.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(흑흑)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1006.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(아잉)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1007.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(찡긋)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1008.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(뿌듯)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1009.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(깜짝)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1010.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(빠직)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1011.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(짜증)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1012.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(제발)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1013.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(씨익)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1014.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(신나)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1015.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(헉)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1016.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(열받아)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1017.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(흥)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1018.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(감동)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1019.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(뽀뽀)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1020.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(멘붕)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1021.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(정색)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1022.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(쑥스)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1023.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(꺄아)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1024.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(좋아)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1025.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(굿)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1026.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(훌쩍)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1027.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(허걱)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1028.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(부르르)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1029.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(푸하하)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1030.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(발그레)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1031.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(수줍)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1032.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(컴온)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1033.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(졸려)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1034.png" alt="" /></a>
</div>
</div>
<button type="button" class="btn_close"
onclick="miniPopup(this)">닫기</button>
<%@include file="/WEB-INF/jsp/web/kakao/include/KakaoSentImoticonInfo.jsp" %>
<button type="button" class="btn_close" onclick="miniPopup(this)">닫기</button>
</div>
</div>
<div class="send_btnWrap">

View File

@ -886,128 +886,8 @@ $(document).on('click', '.symbolButton, .changeWord', function (){
<button type="button" class="btnType btnType7"
onclick="miniPopup(this)">카카오 이모티콘</button>
<div class="send_miniPop spc_character kakao_emoticon">
<div class="cnt_character">
<div class="box_character">
<a href="javascript:void(0)" class="changeWord" value="(미소)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_001.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(윙크)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_002.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(방긋)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_003.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(반함)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_004.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(눈물)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_005.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(절규)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_006.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(크크)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_007.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(메롱)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_008.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(잘자)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_009.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(잘난척)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_010.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(헤롱)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_011.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(놀람)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_012.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(아픔)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_013.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(당황)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_014.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(풍선껌)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_015.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(버럭)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_016.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(부끄)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_017.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(궁금)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_018.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(흡족)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_019.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(깜찍)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_020.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(으으)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_021.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(민망)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_022.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(곤란)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_023.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(잠)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_024.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(행복)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_025.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(안도)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_026.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(우웩)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_027.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(외계인)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_028.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(외계인녀)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_029.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(공포)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_030.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(근심)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_031.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(악마)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_032.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(썩소)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_033.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(쳇)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_034.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(야호)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_035.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(좌절)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_036.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(삐침)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_037.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(하트)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_038.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(실연)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_039.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(별)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_040.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(브이)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_041.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(오케이)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_042.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(최고)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_043.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(최악)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_044.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(그만)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_045.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(땀)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_046.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(알약)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_047.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(밥)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_048.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(커피)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_049.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(맥주)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_050.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(소주)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_051.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(와인)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_052.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(치킨)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_053.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(축하)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_054.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(음표)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_055.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(선물)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_056.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(케이크)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_057.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(촛불)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_058.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(컵케이크a)'"><img src="/publish/images/kakao_emoticon/kakao_emoticon_059.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(컵케이크b)'"><img src="/publish/images/kakao_emoticon/kakao_emoticon_060.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(해)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_061.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(구름)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_062.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(비)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_063.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(눈)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_064.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(똥)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_065.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(근조)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_066.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(딸기)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_067.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(호박)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_068.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(입술)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_069.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(야옹)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_070.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(돈)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_071.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(담배)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_072.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(축구)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_073.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(야구)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_074.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(농구)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_075.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(당구)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_076.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(골프)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_077.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(카톡)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_078.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(꽃)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_079.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(총)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_080.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(크리스마스)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_081.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(콜)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_082.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(하트뿅)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1001.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(하하)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1002.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(우와)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1003.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(심각)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1004.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(힘듦)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1005.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(흑흑)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1006.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(아잉)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1007.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(찡긋)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1008.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(뿌듯)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1009.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(깜짝)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1010.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(빠직)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1011.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(짜증)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1012.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(제발)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1013.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(씨익)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1014.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(신나)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1015.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(헉)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1016.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(열받아)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1017.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(흥)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1018.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(감동)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1019.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(뽀뽀)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1020.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(멘붕)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1021.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(정색)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1022.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(쑥스)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1023.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(꺄아)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1024.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(좋아)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1025.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(굿)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1026.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(훌쩍)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1027.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(허걱)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1028.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(부르르)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1029.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(푸하하)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1030.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(발그레)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1031.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(수줍)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1032.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(컴온)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1033.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(졸려)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1034.png" alt="" /></a>
</div>
</div>
<button type="button" class="btn_close"
onclick="miniPopup(this)">닫기</button>
<%@include file="/WEB-INF/jsp/web/kakao/include/KakaoSentImoticonInfo.jsp" %>
<button type="button" class="btn_close" onclick="miniPopup(this)">닫기</button>
</div>
</div>
<div class="send_btnWrap">

View File

@ -895,128 +895,8 @@ $(document).on('click', '.symbolButton, .changeWord', function (){
<button type="button" class="btnType btnType7"
onclick="miniPopup(this)">이모티콘</button>
<div class="send_miniPop spc_character kakao_emoticon">
<div class="cnt_character">
<div class="box_character">
<a href="javascript:void(0)" class="changeWord" value="(미소)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_001.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(윙크)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_002.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(방긋)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_003.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(반함)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_004.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(눈물)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_005.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(절규)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_006.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(크크)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_007.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(메롱)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_008.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(잘자)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_009.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(잘난척)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_010.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(헤롱)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_011.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(놀람)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_012.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(아픔)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_013.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(당황)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_014.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(풍선껌)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_015.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(버럭)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_016.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(부끄)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_017.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(궁금)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_018.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(흡족)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_019.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(깜찍)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_020.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(으으)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_021.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(민망)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_022.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(곤란)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_023.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(잠)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_024.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(행복)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_025.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(안도)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_026.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(우웩)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_027.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(외계인)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_028.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(외계인녀)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_029.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(공포)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_030.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(근심)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_031.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(악마)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_032.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(썩소)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_033.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(쳇)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_034.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(야호)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_035.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(좌절)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_036.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(삐침)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_037.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(하트)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_038.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(실연)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_039.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(별)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_040.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(브이)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_041.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(오케이)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_042.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(최고)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_043.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(최악)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_044.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(그만)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_045.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(땀)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_046.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(알약)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_047.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(밥)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_048.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(커피)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_049.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(맥주)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_050.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(소주)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_051.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(와인)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_052.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(치킨)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_053.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(축하)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_054.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(음표)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_055.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(선물)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_056.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(케이크)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_057.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(촛불)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_058.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(컵케이크a)'"><img src="/publish/images/kakao_emoticon/kakao_emoticon_059.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(컵케이크b)'"><img src="/publish/images/kakao_emoticon/kakao_emoticon_060.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(해)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_061.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(구름)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_062.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(비)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_063.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(눈)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_064.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(똥)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_065.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(근조)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_066.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(딸기)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_067.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(호박)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_068.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(입술)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_069.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(야옹)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_070.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(돈)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_071.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(담배)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_072.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(축구)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_073.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(야구)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_074.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(농구)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_075.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(당구)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_076.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(골프)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_077.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(카톡)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_078.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(꽃)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_079.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(총)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_080.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(크리스마스)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_081.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(콜)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_082.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(하트뿅)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1001.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(하하)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1002.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(우와)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1003.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(심각)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1004.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(힘듦)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1005.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(흑흑)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1006.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(아잉)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1007.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(찡긋)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1008.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(뿌듯)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1009.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(깜짝)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1010.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(빠직)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1011.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(짜증)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1012.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(제발)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1013.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(씨익)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1014.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(신나)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1015.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(헉)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1016.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(열받아)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1017.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(흥)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1018.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(감동)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1019.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(뽀뽀)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1020.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(멘붕)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1021.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(정색)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1022.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(쑥스)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1023.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(꺄아)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1024.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(좋아)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1025.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(굿)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1026.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(훌쩍)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1027.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(허걱)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1028.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(부르르)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1029.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(푸하하)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1030.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(발그레)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1031.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(수줍)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1032.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(컴온)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1033.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(졸려)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1034.png" alt="" /></a>
</div>
</div>
<button type="button" class="btn_close"
onclick="miniPopup(this)">닫기</button>
<%@include file="/WEB-INF/jsp/web/kakao/include/KakaoSentImoticonInfo.jsp" %>
<button type="button" class="btn_close" onclick="miniPopup(this)">닫기</button>
</div>
</div>
<div class="send_btnWrap">

View File

@ -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(){
<form id="templateForm" name="templateForm" method="post">
<input type="hidden" id="inputSenderKey" name="senderKey" value=""/>
<input type="hidden" id="inputTemplateCode" name="templateCode" value=""/>
<input type="hidden" id="inputFriendId" name="friendId" value=""/>
<input type="hidden" id="arrTemplateCode" name="arrTemplateCode" value=""/>
</form>
@ -426,7 +426,7 @@ function fnGoSampleTemplate(){
</c:forEach>
</select>
<div class="search">
<label for="id" class="label"></label>
<label for="inputSearchKeyword" class="label"></label>
<input type="text" class="search_input" id="inputSearchKeyword" name="inputSearchKeyword" value="<c:out value=""/>" placeholder="템플릿명을 입력하세요." onfocus="this.placeholder=''" onblur="this.placeholder='검색어를 입력하세요.'">
<button type="button" class="btnType btnType2" onclick="selectTemplateListLoad('1');">검색</button>
</div>

View File

@ -102,6 +102,14 @@ $(function(){
</p>
</div>
<div class="allimtalk_content" onclick="javascript:fnTemplateDetail('<c:out value="${templatInfoList.friendId}"/>'); return false;" style="cursor:pointer;">
<!-- 템플릿에 이미지가 있는경우 이미지 표시 -->
<c:if test="${not empty templatInfoList.imageType}">
<div class="img_box">
<img src="<c:url value='${templatInfoList.templateImageUrl}'/>" alt="">
</div>
</c:if>
<p class="template_text"><c:out value="${fn:replace(fn:replace(templatInfoList.templateContent, newLineChar, '<br/>'), newLineChar2, '<br/>')}" escapeXml="false"/></p>
<!-- 채널 추가형을 선택한 경우 자동으로 버튼이 하나 추가됨, 버튼을 추가한 경우 버튼 정보 표시 -->
<c:forEach var="templatInfoButtonList" items="${templatInfoList.buttonVOList}" varStatus="status">
@ -114,9 +122,15 @@ $(function(){
</c:if>
</div>
<div class="kakao_template_info">
<dl>
<dt>템플릿명</dt>
<dd>
<c:out value="${templatInfoList.templateName}"/>
</dd>
</dl>
<dl>
<dt>등록일</dt>
<dd><c:out value="${templatInfoList.lastUpdtPnttm}"/>
<dd><c:out value="${templatInfoList.frstRegistPnttm}"/>
<div class="btn_wrap">
<button type="button" class="btn_template_edit" title="템플릿 수정" onclick="javascript:fnTemplateDetail('<c:out value="${templatInfoList.friendId}"/>'); return false;"><img src="/publish/images/content/btn_template_edit.png" alt=""></button>
<button type="button" class="btn_template_delete" title="템플릿 삭제" onclick="javascript:fnTemplateDelBtn('<c:out value="${templatInfoList.friendId}"/>'); return false;"><img src="/publish/images/content/btn_template_delete.png" alt=""></button>
@ -176,7 +190,7 @@ $(function(){
</c:otherwise>
</c:choose>
</td>
<td><c:out value="${templatInfoList.lastUpdtPnttm}"/></td>
<td><c:out value="${templatInfoList.frstRegistPnttm}"/></td>
</tr>
</c:forEach>
</c:when>

View File

@ -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"); %>
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>문자온 - 친구톡 템플릿 선택</title>
<link href="https://fonts.googleapis.com/css2?family=Noto+Sans+KR:wght@100;300;400;500;700;900&amp;display=swap"
rel="stylesheet">
<link rel="stylesheet" href="/publish/css/reset.css">
<link rel="stylesheet" href="/publish/css/jquery.mCustomScrollbar.css">
<link rel="stylesheet" href="/publish/css/common.css">
<link rel="stylesheet" href="/publish/css/button.css">
<link rel="stylesheet" href="/publish/css/content.css?date=202301160001">
<link rel="stylesheet" href="/publish/css/mem.css">
<link rel="stylesheet" href="/publish/css/font.css">
<link rel="stylesheet" href="/publish/css/popupLayer.css">
<script src="/publish/js/jquery-3.5.0.js"></script>
<script src="/publish/js/jquery.mCustomScrollbar.concat.min.js"></script>
<script src="/publish/js/common.js"></script>
<script src="/publish/js/content.js?date=202211070003"></script>
<script src="/publish/js/popupLayer.js"></script>
</head>
<script>
//리스트 체크 박스 선택 스크립트
//체크박스 전체 선택 및 해제
var allChkSts = false; //썸네일 타입 리스트 체크박스 상태
var allChkListSts = false; //리스트 타입 리스트 체크박스 상태
$("#btnAllChk").click(function(){
if(!allChkSts){// 전체선택이 해제되어 있을 경우
$("input[name=inputTemplateId]").prop("checked", true);
allChkSts = true;
$("input:checkbox[name='inputTemplateId']:checked").each(function(index){
var disabledChk = $(this).prop('disabled');
if(disabledChk){ //checkbox disabled 인 것은 제외하고 아이디 저장
$(this).prop("checked", false);
}
});
}else{
$("input[name=inputTemplateId]").prop("checked", false);
allChkSts = false;
}
//리스트 타입 화면에 있는 체크박스 해제해 주기
$("input[name=inputTemplateIdList]").prop("checked", false);
$("input[name=allCheckList]").prop("checked", false); //리스트 전체 선택 체크박스 해제해주기
allChkListSts = false;
});
$("#allCheckList").click(function(){
if(!allChkListSts){// 전체선택이 해제되어 있을 경우
$("input[name=inputTemplateIdList]").prop("checked", true);
allChkListSts = true;
$("input:checkbox[name='inputTemplateIdList']:checked").each(function(index){
var disabledChk = $(this).prop('disabled');
if(disabledChk){ //checkbox disabled 인 것은 제외하고 아이디 저장
$(this).prop("checked", false);
}
});
}else{
$("input[name=inputTemplateIdList]").prop("checked", false);
allChkListSts = false;
}
//썸네일 리스트에 있는 체크박스를 해제해준다.
$("input[name=inputTemplateId]").prop("checked", false);
allChkSts = false;
});
function selectTemplateListLoad(page){
var form = document.listForm;
form.searchKeyword.value = $("#inputSearchKeyword").val();
form.senderKey.value = $("select[name='selectAgentCode_select']").val();
form.pageIndex.value = page;
form.action = "/web/mjon/kakao/template/selectKakaoFriendsTemplateListPopupAjax.do";
form.submit();
}
function fnTemplateDetail(ftId){
opener.parent.myTemplateSelect(ftId);
self.close();
}
</script>
<body>
<form id="listForm" name="listForm" method="post">
<input type="hidden" id="pageIndex" name="pageIndex" value="1"/>
<input type="hidden" id="searchKeyword" name="searchKeyword" value=""/>
<input type="hidden" id="senderKey" name="senderKey" value=""/>
</form>
<div class="info_popup ad_layer template_choice_popup adpopup01" style="width:930px;">
<div class="popup_heading">
<p>친구톡 템플릿 선택</p>
</div>
<div class="layer_in">
<div class="popup_search_wrap type2 grayborder grayfill">
<select name="selectAgentCode_select" id="selectAgentCode_select" class="selType2">
<option value="">채널ID 선택</option>
<c:forEach var="kakaoProfileInfo" items="${resultProfileList}" varStatus="status">
<option value="${kakaoProfileInfo.senderKey}" <c:if test="${searchVO.senderKey eq kakaoProfileInfo.senderKey}">selected</c:if> ><c:out value='${kakaoProfileInfo.yellowId}'/></option>
</c:forEach>
</select>
<label for="searchKeyword" class="label"></label>
<input type="text" class="search_input" id="inputSearchKeyword" name="inputSearchKeyword" value="<c:out value="${searchVO.searchKeyword}"/>" placeholder="템플릿명을 입력하세요." onfocus="this.placeholder=''" onblur="this.placeholder='검색어를 입력하세요.'">
<button type="button" class="btnType btnType2" onclick="selectTemplateListLoad('1');">검색</button>
</div>
<div class="template_list">
<ul class="kakao_template_list thumbnail_list">
<c:choose>
<c:when test="${not empty kakaoTemplateInfoList}">
<c:forEach var="templatInfoList" items="${kakaoTemplateInfoList}" varStatus="status">
<li onClick="fnTemplateDetail('<c:out value="${templatInfoList.friendId}"/>'); return false;" style="cursor:pointer;">
<div class="kakao_template_wrap">
<div class="template_cont">
<div class="title">
<%-- <div class="check">
<input type="checkbox" name="inputTemplateId" id="inputTemplateId" value="<c:out value='${templatInfoList.friendId}'/>">
</div> --%>
<p title="친구톡 템플릿 내용">
<c:if test="${templatInfoList.adFlag eq 'Y'}">(광고)</c:if>
<c:out value="${fn:replace(templatInfoList.yellowId, '@', '')}"/>
</p>
</div>
<!-- 템플릿에 이미지가 있는경우 이미지 표시 -->
<c:if test="${not empty templatInfoList.imageType}">
<div class="img_box">
<img src="<c:url value='${templatInfoList.templateImageUrl}'/>" alt="">
</div>
</c:if>
<div class="text_box">
<p><c:out value="${fn:replace(fn:replace(templatInfoList.templateContent, newLineChar, '<br/>'), newLineChar2, '<br/>')}" escapeXml="false"/></p>
<!-- 채널 추가형을 선택한 경우 자동으로 버튼이 하나 추가됨, 버튼을 추가한 경우 버튼 정보 표시 -->
<c:forEach var="templatInfoButtonList" items="${templatInfoList.buttonVOList}" varStatus="status">
<button type="button" class="btn_kakao_type"><c:out value="${templatInfoButtonList.name}"/></button>
</c:forEach>
</div>
</div>
<c:if test="${templatInfoList.adFlag eq 'Y'}">
<p class="cf_text">수신거부 홈 > 채널차단</p>
</c:if>
</div>
<%-- <div class="btn_wrap">
<button type="button" class="btnType btnType3 btn_template_use" onClick="fnTemplateDetail('<c:out value="${templatInfoList.friendId}"/>'); return false;">템플릿 사용하기</button>
</div> --%>
<div class="kakao_template_info">
<dl>
<dt>템플릿명</dt>
<dd>
<c:out value="${templatInfoList.templateName}"/>
</dd>
</dl>
<dl>
<dt>등록일</dt>
<dd><c:out value="${templatInfoList.frstRegistPnttm}"/></dd>
</dl>
</div>
</li>
</c:forEach>
</c:when>
<c:otherwise>
<li class="template_none">등록된 템플릿이 없습니다.</li>
</c:otherwise>
</c:choose>
</ul>
</div>
<!-- table 안 ul의 가운데 정렬을 위한 style 처리 -->
<!-- pagination -->
<ul class="pagination">
<ui:pagination paginationInfo = "${paginationInfo}" type="imageWeb" jsFunction="selectTemplateListLoad" />
</ul><!-- //pageWrap -->
</div>
</div>
</body>
</html>

View File

@ -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 (){
<!--// tab button -->
</div>
<form id="bizForm" name="bizForm" method="multipart/form-data">
<input type="hidden" id="menuTopTab" name="menuTopTab" value="tabConf">
<input type="hidden" id="menuTopTab" name="menuTopTab" value="tabConf">
<input type="hidden" id="menuSubTab" name="menuSubTab" value="tabSubFt">
<input type="hidden" id="inputSenderKey" name="senderKey" value=""/>
<input type="hidden" id="yellowId" name="yellowId" value=""/>
@ -576,7 +585,7 @@ $(document).on('click', '.symbolButton, .changeWord', function (){
<input type="hidden" id="adFlag" name="adFlag" value="">
<input type="hidden" id="templateImageUrl" name="templateImageUrl" value="">
<input type="hidden" id="templateContent" name="templateContent" value="">
<input type="hidden" id="imageFileName" name="imageFileName" value=""/>
<div class="send_general friend_talk_wrap kakao_wrap">
<div class="send_left">
@ -602,7 +611,7 @@ $(document).on('click', '.symbolButton, .changeWord', function (){
<th>템플릿명</th>
<td>
<input type="text" class="template_name" id="inputTemplateName" name="inputTemplateName" placeholder="템플릿 명을 입력해주세요" maxLength="100">
<p class="template_name_cf">최대 100자, 템플릿 관리용</p>
<p class="template_name_cf">최대 50자, 템플릿 관리용</p>
</td>
</tr>
<tr>
@ -656,9 +665,8 @@ $(document).on('click', '.symbolButton, .changeWord', function (){
<tr>
<th>광고포함 여부</th>
<td>
<input type="radio" class="inputAdFlag" name="ad_flag" id="ad_Y" value="Y" checked><label for="ad_Y">광고성 정보
포함</label>
<input type="radio" class="inputAdFlag" name="ad_flag" id="ad_N" value="N"><label for="ad_N">포함 안함</label>
<input type="radio" class="inputAdFlag" name="ad_flag" id="ad_Y" value="Y" checked><label for="ad_Y">광고성 정보 포함</label>
<!-- <input type="radio" class="inputAdFlag" name="ad_flag" id="ad_N" value="N"><label for="ad_N">포함 안함</label> -->
</td>
</tr>
<tr>
@ -798,128 +806,8 @@ $(document).on('click', '.symbolButton, .changeWord', function (){
<button type="button" class="btnType btnType7"
onclick="miniPopup(this)">이모티콘</button>
<div class="send_miniPop spc_character kakao_emoticon">
<div class="cnt_character">
<div class="box_character">
<a href="javascript:void(0)" class="changeWord" value="(미소)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_001.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(윙크)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_002.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(방긋)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_003.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(반함)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_004.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(눈물)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_005.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(절규)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_006.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(크크)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_007.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(메롱)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_008.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(잘자)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_009.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(잘난척)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_010.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(헤롱)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_011.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(놀람)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_012.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(아픔)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_013.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(당황)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_014.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(풍선껌)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_015.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(버럭)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_016.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(부끄)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_017.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(궁금)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_018.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(흡족)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_019.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(깜찍)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_020.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(으으)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_021.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(민망)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_022.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(곤란)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_023.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(잠)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_024.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(행복)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_025.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(안도)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_026.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(우웩)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_027.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(외계인)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_028.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(외계인녀)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_029.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(공포)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_030.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(근심)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_031.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(악마)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_032.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(썩소)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_033.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(쳇)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_034.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(야호)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_035.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(좌절)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_036.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(삐침)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_037.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(하트)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_038.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(실연)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_039.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(별)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_040.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(브이)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_041.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(오케이)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_042.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(최고)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_043.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(최악)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_044.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(그만)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_045.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(땀)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_046.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(알약)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_047.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(밥)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_048.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(커피)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_049.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(맥주)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_050.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(소주)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_051.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(와인)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_052.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(치킨)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_053.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(축하)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_054.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(음표)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_055.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(선물)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_056.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(케이크)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_057.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(촛불)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_058.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(컵케이크a)'"><img src="/publish/images/kakao_emoticon/kakao_emoticon_059.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(컵케이크b)'"><img src="/publish/images/kakao_emoticon/kakao_emoticon_060.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(해)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_061.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(구름)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_062.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(비)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_063.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(눈)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_064.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(똥)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_065.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(근조)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_066.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(딸기)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_067.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(호박)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_068.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(입술)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_069.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(야옹)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_070.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(돈)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_071.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(담배)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_072.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(축구)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_073.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(야구)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_074.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(농구)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_075.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(당구)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_076.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(골프)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_077.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(카톡)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_078.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(꽃)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_079.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(총)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_080.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(크리스마스)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_081.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(콜)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_082.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(하트뿅)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1001.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(하하)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1002.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(우와)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1003.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(심각)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1004.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(힘듦)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1005.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(흑흑)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1006.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(아잉)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1007.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(찡긋)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1008.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(뿌듯)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1009.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(깜짝)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1010.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(빠직)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1011.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(짜증)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1012.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(제발)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1013.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(씨익)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1014.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(신나)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1015.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(헉)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1016.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(열받아)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1017.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(흥)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1018.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(감동)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1019.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(뽀뽀)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1020.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(멘붕)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1021.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(정색)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1022.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(쑥스)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1023.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(꺄아)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1024.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(좋아)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1025.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(굿)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1026.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(훌쩍)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1027.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(허걱)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1028.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(부르르)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1029.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(푸하하)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1030.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(발그레)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1031.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(수줍)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1032.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(컴온)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1033.png" alt="" /></a>
<a href="javascript:void(0)" class="changeWord" value="(졸려)"><img src="/publish/images/kakao_emoticon/kakao_emoticon_1034.png" alt="" /></a>
</div>
</div>
<button type="button" class="btn_close"
onclick="miniPopup(this)">닫기</button>
<%@include file="/WEB-INF/jsp/web/kakao/include/KakaoSentImoticonInfo.jsp" %>
<button type="button" class="btn_close" onclick="miniPopup(this)">닫기</button>
</div>
</div>
<div class="btn_popup_wrap template_call_wrap">

View File

@ -773,9 +773,6 @@ $(document).ready(function (){
fnByteString(contents);
}
});//문자 바이트수 계산하기 끝

View File

@ -1213,7 +1213,7 @@ function sendMsgAjax_advc(){
removeEmptyValues(formData);
// 선택된 데이터 추가
formData["mjonMsgTabulListVO"] = $selectedData;
formData["mjonMsgSendVOList"] = $selectedData;
// JSON 데이터 확인
console.log("최종 formData:", JSON.stringify(formData));

View File

@ -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()+"" ;

View File

@ -53,6 +53,7 @@ $(document).ready(function(){
});
</script>
<input type="button" id="tooltopClick" data-tooltip="rev_popup02" style="display:none;"/>
<div class="list_info">
<p>총 <span class="c_e40000"><c:out value="${totalRecordCount}"/></span>건</p>
<div>

View File

@ -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() {
<ul class="list_tab">
<li class="tab active"><button type="button" onclick="fnTabLoad('',0); return false;">전체</button></li>
<li class="tab"><button type="button" onclick="fnTabLoad('at',1); return false;">알림톡</button></li>
<!-- <li class="tab"><button type="button" onclick="fnTabLoad('ft',2); return false;">친구톡</button></li> -->
<c:if test="${fn:contains(pageContext.request.requestURL , 'localhost')
|| fn:contains(pageContext.request.requestURL , '192.168.0.33')
|| fn:contains(pageContext.request.requestURL , '119.193.215.98')}">
<li class="tab"><button type="button" onclick="fnTabLoad('ft',2); return false;">친구톡</button></li>
</c:if>
<!-- <li class="tab"><button type="button" onclick="fnTabLoad('M',3); return false;">그림(MMS)</button></li> -->
</ul><!--// tab button -->
</div>

View File

@ -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()+"" ;

View File

@ -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);
}
}

View File

@ -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$ :<strong>$SU$</strong>건';
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(/(<br>|<br\/>|<br \/>)/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;
}

View File

@ -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;
}
});

View File

@ -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, '<br/>');
$('.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, '<br/>');
$('.nowChar').text(conLeng + " /");
$('.totChar').text(" "+limitLeng);
$('.template_text').show();
if(repContent != ''){
$('.template_text').html(repContent);
$('#smsTxtArea').val(
$('.template_text').html().trim().replace(/(<br>|<br\/>|<br \/>)/g, '\r\n')
);
}else{
$('.template_text').html("내용 미리보기");
}
}