Merge branch 'master' into 4608_kmc암호화모듈
This commit is contained in:
commit
f4ae2dcf53
1
.claude/.gitignore
vendored
Normal file
1
.claude/.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
||||
/settings.local.json
|
||||
4
.gitignore
vendored
4
.gitignore
vendored
@ -202,6 +202,4 @@ rebel.xml
|
||||
/mvnw
|
||||
/mvnw.cmd
|
||||
/.gemini.zip
|
||||
|
||||
### MAC OS ###
|
||||
.DS_Store
|
||||
/CLAUDE.md
|
||||
|
||||
130
src/main/java/itn/com/cmm/MjonFTSendVO.java
Normal file
130
src/main/java/itn/com/cmm/MjonFTSendVO.java
Normal file
@ -0,0 +1,130 @@
|
||||
package itn.com.cmm;
|
||||
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
import lombok.ToString;
|
||||
|
||||
@Getter
|
||||
@Setter
|
||||
@ToString
|
||||
public class MjonFTSendVO{
|
||||
|
||||
|
||||
/**
|
||||
* @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;
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* @description : event 여부 / group tb에 넣는 용도 / 기본값 N
|
||||
*/
|
||||
private String eventYn="N";
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* @description : 개별단가
|
||||
*/
|
||||
private String eachPrice;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
@ -229,8 +229,8 @@ public final class MsgSendUtils {
|
||||
placeholders.put("[*4*]", MjonMsgSendVO::getRep4);
|
||||
|
||||
boolean hasPerformedSpamCheck = false; // 치환 문자가 없는 경우, 스팸 체크가 한 번만 수행되도록 제어
|
||||
boolean hasPerformedMsgType = false; // 치환 문자가 없는 경우, 스팸 체크가 한 번만 수행되도록 제어
|
||||
boolean hasPerformedDelayYn = false; // 치환 문자가 없는 경우, 스팸 체크가 한 번만 수행되도록 제어
|
||||
boolean hasPerformedMsgType = false; // 치환 문자가 없는 경우, 메세지 타입 체크 한번
|
||||
boolean hasPerformedDelayYn = false; // 치환 문자가 없는 경우,
|
||||
|
||||
String msgKind = mjonMsgVO.getMsgKind();
|
||||
String smsTxtTemp = mjonMsgVO.getSmsTxt();
|
||||
@ -257,10 +257,6 @@ public final class MsgSendUtils {
|
||||
for (Map.Entry<String, Function<MjonMsgSendVO, String>> entry : placeholders.entrySet()) {
|
||||
String placeholder = entry.getKey();
|
||||
String value = entry.getValue().apply(sendVO);
|
||||
// log.info(" + smsTxtTemp [{}]", smsTxtTemp);
|
||||
// log.info(" + placeholder [{}]", placeholder);
|
||||
// log.info(" + value [{}]", value);
|
||||
// log.info(" + smsTxtTemp.contains(placeholder) [{}]", smsTxtTemp.contains(placeholder));
|
||||
if (smsTxt.contains(placeholder)) {
|
||||
if (StringUtils.isEmpty(value)) {
|
||||
statusResponseSet(statusResponse, HttpStatus.BAD_REQUEST, "치환 문구중 " + placeholder + " 데이터가 없습니다.");
|
||||
@ -463,7 +459,7 @@ public final class MsgSendUtils {
|
||||
}
|
||||
}
|
||||
|
||||
private static Boolean getReplaceYN(String smsTxtTemplate) {// 여러 치환 구문이 포함된 정규식 패턴
|
||||
public static Boolean getReplaceYN(String smsTxtTemplate) {// 여러 치환 구문이 포함된 정규식 패턴
|
||||
|
||||
if (smsTxtTemplate == null) {
|
||||
return false; // null일 경우 false 반환
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@ -796,9 +796,16 @@ public class MjonKakaoATController {
|
||||
String lastUpdtPnttm = resultChannelList.get(i).getLastUpdtPnttm();
|
||||
kakaoProfileVO.setSenderKey(senderKey);
|
||||
kakaoProfileVO.setProfileId(profileId);
|
||||
|
||||
KakaoReturnVO tmpProfileVO = kakaoApiProfile.kakaoApiProfileList(kakaoProfileVO);
|
||||
|
||||
KakaoReturnVO tmpProfileVO = null;
|
||||
// try {
|
||||
//
|
||||
// tmpProfileVO = kakaoApiProfile.kakaoApiProfileList(kakaoProfileVO);
|
||||
// } catch (Exception e) {
|
||||
// e.printStackTrace();
|
||||
// // TODO: handle exception
|
||||
// }
|
||||
|
||||
tmpProfileVO = kakaoApiProfile.kakaoApiProfileList(kakaoProfileVO);
|
||||
ChannelIDVO returnChannelVO = new ChannelIDVO();
|
||||
|
||||
returnChannelVO.setSenderKey(tmpProfileVO.getSenderKey());
|
||||
|
||||
34
src/main/java/itn/let/kakao/kakaoComm/BizKakaoPriceVO.java
Normal file
34
src/main/java/itn/let/kakao/kakaoComm/BizKakaoPriceVO.java
Normal file
@ -0,0 +1,34 @@
|
||||
package itn.let.kakao.kakaoComm;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
import lombok.NoArgsConstructor;
|
||||
import lombok.Setter;
|
||||
import lombok.ToString;
|
||||
|
||||
/**
|
||||
* @ BIZ_KAKAO_PRICE 테이블 관련
|
||||
*/
|
||||
@Getter
|
||||
@Setter
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
@ToString
|
||||
public class BizKakaoPriceVO {
|
||||
|
||||
private Long bizKakaoPriceId;
|
||||
|
||||
private String bizKakaoAtPrice; // 알림톡 단가
|
||||
private String bizKakaoFtPrice; // 친구톡 단가
|
||||
private String bizKakaoFtImgPrice; // 친구톡 이미지 단가
|
||||
private String bizKakaoFtWideImgPrice; // 친구톡 와이드 이미지 단가
|
||||
private String bizSmsPrice; // SMS 단가
|
||||
private String bizMmsPrice; // MMS 단가
|
||||
|
||||
private String msgGroupId; // 메시지 그룹 ID
|
||||
|
||||
|
||||
// getters and setters 생략
|
||||
}
|
||||
@ -45,7 +45,13 @@ public class KakaoSendAdvcVO implements Serializable {
|
||||
private String subMsgType; // 대체문자 타입
|
||||
private String reqDate; // 예약일시
|
||||
|
||||
private String msgKind; // 예약일시
|
||||
|
||||
private String jsonStr; // jsonStr
|
||||
|
||||
|
||||
|
||||
private String adFlag; //친구톡 광고성 정보 사용 유무(Y:사용 , N:미사용)
|
||||
|
||||
// =====
|
||||
// =====
|
||||
@ -53,15 +59,22 @@ public class KakaoSendAdvcVO implements Serializable {
|
||||
private String eachPrice; // sms 단가
|
||||
private String smsPrice; // sms 단가
|
||||
private String mmsPrice; // mms 단가
|
||||
private String picturePrice; // mms 단가
|
||||
private String totPrice; // mms 단가
|
||||
private String befCash; // mms 단가
|
||||
private String befPoint; // mms 단가
|
||||
private String kakaoAtPrice; // 카카오 알림톡 단가
|
||||
private String bizJsonName; // 카카오 알림톡 단가
|
||||
private String reserveYn; // 카카오 알림톡 단가
|
||||
private String atDelayYn; // 카카오 알림톡 단가
|
||||
private String atDelayYn; // 지연 문자 발송
|
||||
private String bizKakaoResendOrgnlTxt; // 카카오 알림톡 단가
|
||||
private String bizKakaoResendType; // 카카오 알림톡 단가
|
||||
private String filePath1; // 대체문자 이미지
|
||||
private String fileCnt; // 파일 카운트
|
||||
private String bizKakaoImageType; // 파일 카운트
|
||||
|
||||
private String spamStatus;
|
||||
|
||||
|
||||
|
||||
|
||||
@ -83,7 +96,7 @@ public class KakaoSendAdvcVO implements Serializable {
|
||||
"\n , msgType=[" + msgType + "]" +
|
||||
"\n , templateContent=[" + templateContent + "]" +
|
||||
"\n , templateTitle=[" + templateTitle + "]" +
|
||||
"\n , buttonList=[" + buttonList.toString() + "]" +
|
||||
"\n , buttonList=[" + (buttonList != null ? buttonList.toString() : "") + "]" +
|
||||
"\n , subMsgSendYn=[" + subMsgSendYn + "]" +
|
||||
"\n , subMsgTxt=[" + subMsgTxt + "]" +
|
||||
"\n , subMsgType=[" + subMsgType + "]" +
|
||||
@ -103,6 +116,8 @@ public class KakaoSendAdvcVO implements Serializable {
|
||||
"\n , atDelayYn=[" + atDelayYn + "]" +
|
||||
"\n , bizKakaoResendOrgnlTxt=[" + bizKakaoResendOrgnlTxt + "]" +
|
||||
"\n , bizKakaoResendType=[" + bizKakaoResendType + "]" +
|
||||
"\n , filePath1=[" + filePath1 + "]" +
|
||||
"\n , bizKakaoImageType=[" + bizKakaoImageType + "]" +
|
||||
"\n ]";
|
||||
}
|
||||
|
||||
|
||||
@ -1,12 +1,17 @@
|
||||
package itn.let.kakao.kakaoComm;
|
||||
|
||||
import java.io.UnsupportedEncodingException;
|
||||
import java.math.BigDecimal;
|
||||
import java.math.RoundingMode;
|
||||
import java.text.ParseException;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Calendar;
|
||||
import java.util.Date;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.function.Function;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
@ -19,17 +24,23 @@ import org.springframework.http.HttpStatus;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import egovframework.rte.fdl.idgnr.EgovIdGnrService;
|
||||
import itn.com.cmm.MjonFTSendVO;
|
||||
import itn.com.cmm.MjonMsgSendVO;
|
||||
import itn.com.cmm.util.MsgSendUtils;
|
||||
import itn.com.cmm.util.StringUtil;
|
||||
import itn.let.kakao.kakaoComm.kakaoApi.KakaoApiJsonSave;
|
||||
import itn.let.kakao.kakaoComm.kakaoApi.KakaoApiTemplate;
|
||||
import itn.let.kakao.user.kakaoAt.service.impl.KakaoAlimTalkDAO;
|
||||
import itn.let.mail.service.StatusResponse;
|
||||
import itn.let.mjo.mjocommon.MjonCommon;
|
||||
import itn.let.mjo.msg.service.MjonMsgVO;
|
||||
import itn.let.mjo.msg.service.impl.MjonMsgDAO;
|
||||
import itn.let.mjo.msgdata.service.MjonMsgDataService;
|
||||
import itn.let.mjo.spammsg.web.ComGetSpamStringParser;
|
||||
import itn.let.module.base.PriceAndPoint;
|
||||
import itn.let.sym.site.service.JoinSettingVO;
|
||||
import itn.let.uss.umt.service.MberManageVO;
|
||||
import itn.let.uss.umt.service.UserManageVO;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
@Slf4j
|
||||
@ -38,9 +49,15 @@ public class KakaoSendUtil {
|
||||
|
||||
@Autowired
|
||||
KakaoApiJsonSave kakaoApiJsonSave;
|
||||
|
||||
@Resource(name="kakaoAlimTalkDAO")
|
||||
private KakaoAlimTalkDAO kakaoAlimTalkDAO;
|
||||
|
||||
@Resource(name = "MjonMsgDataService")
|
||||
private MjonMsgDataService mjonMsgDataService;
|
||||
|
||||
@Resource(name = "mjonMsgDAO")
|
||||
private MjonMsgDAO mjonMsgDAO;
|
||||
|
||||
@Autowired
|
||||
KakaoApiTemplate kakaoApiTemplate;
|
||||
@ -51,6 +68,7 @@ public class KakaoSendUtil {
|
||||
@Autowired
|
||||
private MjonCommon mjonCommon;
|
||||
|
||||
|
||||
// 클래스 수준에서 정적 Pattern 정의 (성능 최적화)
|
||||
private static final Pattern REPLACEMENT_PATTERN = Pattern.compile("#\\{[^}]+\\}");
|
||||
|
||||
@ -138,7 +156,7 @@ public class KakaoSendUtil {
|
||||
log.info("");
|
||||
|
||||
/** @공통 기본값 */
|
||||
KakaoSendAdvcVO sendVO = createSendVO(kakaoVO);
|
||||
KakaoSendAdvcVO sendVO = createATSendVO(kakaoVO);
|
||||
String msgId = idList.get(i);
|
||||
sendVO.setMsgId(msgId);
|
||||
|
||||
@ -273,19 +291,464 @@ public class KakaoSendUtil {
|
||||
return kakaoSendAdvcListVO;
|
||||
}
|
||||
|
||||
private Calendar setupBaseDate(KakaoVO kakaoVO, boolean isNotified) throws ParseException {
|
||||
/**
|
||||
* @methodName : populateSendListsFT
|
||||
* @author : 이호영
|
||||
* @date : 2025. 4. 18.
|
||||
* @description :
|
||||
* @return : List<KakaoSendAdvcVO>
|
||||
* @param kakaoVO
|
||||
* @param isHolidayNotified
|
||||
* @param statusResponse
|
||||
* @return
|
||||
* @throws Exception
|
||||
*
|
||||
*/
|
||||
public List<KakaoSendAdvcVO> populateSendListsFT(KakaoVO kakaoVO
|
||||
, boolean isHolidayNotified
|
||||
, StatusResponse statusResponse
|
||||
, UserManageVO userManageVO
|
||||
, List<String> resultSpamTxt
|
||||
) throws Exception {
|
||||
|
||||
//사용자 현재 보유 금액 불러오기(문자 발송 금액 차감 이전 금액)
|
||||
// String befCash = kakaoVO.getBefCash();
|
||||
|
||||
log.info("kakaoVO.ftToString() :: [{}]", kakaoVO.ftToString());
|
||||
|
||||
|
||||
// 예약 시간 기본값 설정
|
||||
Date now = new Date();
|
||||
// ReqDate가 비어 있으면 현재 시간으로 설정, 그렇지 않으면 ReqDate로 설정
|
||||
// 화면에서 예약문자면 예약시간을 regDate로 설정한다.
|
||||
Date baseDate;
|
||||
if (StringUtils.isEmpty(kakaoVO.getReqDate())) {
|
||||
kakaoVO.setReqDate(DATE_FORMATTER.format(now)); // ReqDate에 현재 시간 설정
|
||||
baseDate = now;
|
||||
} else {
|
||||
baseDate = DATE_FORMATTER.parse(kakaoVO.getReqDate()); // ReqDate를 baseDate로 설정
|
||||
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
|
||||
|
||||
String atSmishingYn = userManageVO.getAtSmishingYn();
|
||||
String exceptSpamYn = userManageVO.getExceptSpamYn();
|
||||
|
||||
|
||||
List<KakaoSendAdvcVO> kakaoSendAdvcListVO = new ArrayList<>();
|
||||
Calendar calendar = setupBaseDateFT(kakaoVO);
|
||||
|
||||
|
||||
|
||||
// 친구톡 내용
|
||||
String templateContent = kakaoVO.getTemplateContent();
|
||||
// 실패 대체 문자
|
||||
String subMsgTxt = kakaoVO.getSubMsgTxt();
|
||||
log.info(" + StringUtils.isNotEmpty(subMsgTxt) :: [{}]", StringUtils.isNotEmpty(subMsgTxt));
|
||||
if(StringUtils.isNotEmpty(subMsgTxt)) {
|
||||
kakaoVO.setSubMsgSendYn("Y");
|
||||
|
||||
// 광고문자면 처리 - 광고 Y
|
||||
if ("Y".equals(kakaoVO.getAdFlag())) {
|
||||
subMsgTxt = "(광고)" + subMsgTxt + "\n" + "무료거부 0808800858";
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
// 사용자 개인 단가 정보 불러오기
|
||||
MberManageVO mberManageVO = mjonMsgDataService.selectMberManageInfo(kakaoVO.getUserId());
|
||||
// 시스템 기본 단가 정보 불러오기
|
||||
JoinSettingVO sysJoinSetVO = mjonMsgDataService.selectJoinSettingInfo();
|
||||
|
||||
|
||||
// 치환 문구가 있는지 확인
|
||||
Boolean replaceYN = MsgSendUtils.getReplaceYN(templateContent);
|
||||
Boolean replaceSubYN = MsgSendUtils.getReplaceYN(subMsgTxt);
|
||||
|
||||
|
||||
/** @MSGID KEY값 */
|
||||
List<String> idList = mjonCommon.getNextCustomMsgCId(kakaoVO.getMjonFTSendVOList().size());
|
||||
|
||||
|
||||
Map<String, Function<MjonFTSendVO, String>> placeholders = new HashMap<>();
|
||||
placeholders.put("[*이름*]", MjonFTSendVO::getName);
|
||||
placeholders.put("[*1*]", MjonFTSendVO::getRep1);
|
||||
placeholders.put("[*2*]", MjonFTSendVO::getRep2);
|
||||
placeholders.put("[*3*]", MjonFTSendVO::getRep3);
|
||||
placeholders.put("[*4*]", MjonFTSendVO::getRep4);
|
||||
|
||||
String imageType = kakaoVO.getImageType();
|
||||
// 개인단가
|
||||
Float kakaoMemberFtPrice =
|
||||
imageType == null ? mberManageVO.getKakaoFtPrice() :
|
||||
"I".equals(imageType) ? mberManageVO.getKakaoFtImgPrice() :
|
||||
"W".equals(imageType) ? mberManageVO.getKakaoFtWideImgPrice() :
|
||||
mberManageVO.getKakaoFtPrice();
|
||||
|
||||
// 시스템단가
|
||||
Float kakaoSysJoinFtPrice =
|
||||
imageType == null ? sysJoinSetVO.getKakaoFtPrice() :
|
||||
"I".equals(imageType) ? sysJoinSetVO.getKakaoFtImgPrice() :
|
||||
"W".equals(imageType) ? sysJoinSetVO.getKakaoFtWideImgPrice() :
|
||||
sysJoinSetVO.getKakaoFtPrice();
|
||||
|
||||
Float kakaoFtPrice =
|
||||
getValidPrice(kakaoMemberFtPrice, kakaoSysJoinFtPrice);
|
||||
|
||||
// 대체문자가 있을경우 사용
|
||||
float shortPrice = getValidPrice(mberManageVO.getShortPrice(), sysJoinSetVO.getShortPrice());
|
||||
float longPrice = getValidPrice(mberManageVO.getLongPrice(), sysJoinSetVO.getLongPrice());
|
||||
float picturePrice = getValidPrice(mberManageVO.getPicturePrice(), sysJoinSetVO.getPicturePrice());
|
||||
|
||||
boolean hasPerformedSpamCheck = false; // 치환 문자가 없는 경우, 스팸 체크가 한 번만 수행되도록 제어
|
||||
boolean hasPerformedSubSpamCheck = false; // 치환 문자가 없는 경우, 스팸 체크가 한 번만 수행되도록 제어
|
||||
boolean hasPerformedMsgType = false; // 치환 문자가 없는 경우, 메세지 타입 체크 한번
|
||||
boolean hasPerformedDelayYn = false; // 치환 문자가 없는 경우,
|
||||
|
||||
|
||||
|
||||
String imgFilePath = "";
|
||||
if(StringUtils.isNotEmpty(kakaoVO.getAtchFileId()) &&
|
||||
("I".equals(imageType) || "W".equals(imageType))) {
|
||||
imgFilePath = mjonMsgDAO.selectPhotoImgFileRealPath(kakaoVO.getAtchFileId());
|
||||
}
|
||||
|
||||
|
||||
|
||||
/** @jsonStr 필요유무 */
|
||||
boolean hasButtons = CollectionUtils.isNotEmpty(kakaoVO.getButtonVOList());
|
||||
String sharedJsonStr = null;
|
||||
|
||||
|
||||
// 치환데이터가 없는 경우 한 번만 계산하기 위한 캐시 변수 추가
|
||||
Map<String, Object> sharedPricingResult = null;
|
||||
// 치환데이터가 없는 경우 for문 전에 한 번만 계산
|
||||
if (!replaceSubYN && StringUtils.isNotEmpty(subMsgTxt)) {
|
||||
sharedPricingResult = calculateSubMsgPricing(subMsgTxt, imgFilePath, shortPrice, longPrice, picturePrice, kakaoFtPrice);
|
||||
|
||||
// 사전계산에서 INVALID인 경우 즉시 리턴
|
||||
String preSendType = (String) sharedPricingResult.get("sendType");
|
||||
if ("INVALID".equals(preSendType)) {
|
||||
statusResponseSet(statusResponse, HttpStatus.BAD_REQUEST, "전송 문자 길이를 초과하였습니다.");
|
||||
return kakaoSendAdvcListVO;
|
||||
}
|
||||
}
|
||||
|
||||
List<MjonFTSendVO> mjonFTSendVOList = kakaoVO.getMjonFTSendVOList();
|
||||
|
||||
for (int i = 0; i < mjonFTSendVOList.size(); i++) {
|
||||
MjonFTSendVO mjonFTSendVO = mjonFTSendVOList.get(i);
|
||||
|
||||
KakaoSendAdvcVO sendVO = createFTSendVO(kakaoVO, calendar);
|
||||
// 공통 가격 설정
|
||||
sendVO.setSmsPrice(Float.toString(shortPrice));
|
||||
sendVO.setMmsPrice(Float.toString(longPrice));
|
||||
sendVO.setPicturePrice(Float.toString(picturePrice));
|
||||
|
||||
sendVO.setCallTo(mjonFTSendVO.getPhone());
|
||||
sendVO.setMsgId(idList.get(i));
|
||||
|
||||
|
||||
// 친구톡 문자
|
||||
String templateContentTemp = templateContent;
|
||||
// 치환 문자면
|
||||
if(replaceYN) {
|
||||
|
||||
// 각 치환 구문을 확인하고 치환할 값이 없으면 오류 반환
|
||||
for (Map.Entry<String, Function<MjonFTSendVO, String>> entry : placeholders.entrySet()) {
|
||||
String placeholder = entry.getKey();
|
||||
String value = entry.getValue().apply(mjonFTSendVO);
|
||||
if (templateContentTemp.contains(placeholder)) {
|
||||
if (StringUtils.isEmpty(value)) {
|
||||
statusResponseSet(statusResponse, HttpStatus.BAD_REQUEST, "치환 문구중 " + placeholder + " 데이터가 없습니다.");
|
||||
return null;
|
||||
}
|
||||
templateContentTemp = templateContentTemp.replace(placeholder, value);
|
||||
}
|
||||
}
|
||||
}
|
||||
sendVO.setTemplateContent(templateContentTemp);
|
||||
|
||||
// 실패 대체 문자
|
||||
String subMsgTxtTemp = null;
|
||||
if(StringUtils.isNotEmpty(subMsgTxt)) {
|
||||
subMsgTxtTemp = subMsgTxt;
|
||||
|
||||
if(replaceSubYN) {
|
||||
// 각 치환 구문을 확인하고 치환할 값이 없으면 오류 반환
|
||||
for (Map.Entry<String, Function<MjonFTSendVO, String>> entry : placeholders.entrySet()) {
|
||||
String placeholder = entry.getKey();
|
||||
String value = entry.getValue().apply(mjonFTSendVO);
|
||||
if (subMsgTxtTemp.contains(placeholder)) {
|
||||
if (StringUtils.isEmpty(value)) {
|
||||
statusResponseSet(statusResponse, HttpStatus.BAD_REQUEST, "치환 문구중 " + placeholder + " 데이터가 없습니다.");
|
||||
return null;
|
||||
}
|
||||
subMsgTxtTemp = subMsgTxtTemp.replace(placeholder, value);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
sendVO.setSubMsgTxt(subMsgTxtTemp);
|
||||
|
||||
|
||||
//대체문자가 있으면
|
||||
// Step 1-4: 실패 대체 문자 치환데이터 설정
|
||||
if(StringUtils.isNotEmpty(subMsgTxtTemp)) { // 대체문자가 있나?
|
||||
|
||||
// 최적화된 계산 로직
|
||||
Map<String, Object> pricingResult;
|
||||
|
||||
if (replaceSubYN) {
|
||||
// 치환데이터 있음 → 매번 새로 계산
|
||||
pricingResult = calculateSubMsgPricing(subMsgTxtTemp, imgFilePath,
|
||||
shortPrice, longPrice, picturePrice, kakaoFtPrice);
|
||||
|
||||
// INVALID 체크
|
||||
String resultSendType = (String) pricingResult.get("sendType");
|
||||
if ("INVALID".equals(resultSendType)) {
|
||||
statusResponseSet(statusResponse, HttpStatus.BAD_REQUEST, "전송 문자 길이를 초과하였습니다.");
|
||||
return kakaoSendAdvcListVO;
|
||||
}
|
||||
} else {
|
||||
// 치환데이터 없음 → 미리 계산된 결과 재사용
|
||||
pricingResult = sharedPricingResult;
|
||||
}
|
||||
|
||||
|
||||
// 결과 적용
|
||||
applyPricingResult(sendVO, pricingResult);
|
||||
|
||||
|
||||
}else {
|
||||
// 대체문자가 없으면 카카오톡 단가 그대로 사용
|
||||
sendVO.setEachPrice( Float.toString(kakaoFtPrice) );
|
||||
}
|
||||
|
||||
|
||||
// 스팸 단어 체크
|
||||
// exceptSpam는 사용자 스팸 단어 체크할건지에 대한 여부 N : 체크
|
||||
if("N".equals(exceptSpamYn)) {
|
||||
// 친구톡 내용
|
||||
if(replaceYN) {
|
||||
checkSpamAndSetStatus(kakaoVO
|
||||
, templateContentTemp
|
||||
, resultSpamTxt, isHolidayNotified);
|
||||
}else if(!hasPerformedSpamCheck) {
|
||||
checkSpamAndSetStatus(kakaoVO
|
||||
, templateContentTemp
|
||||
, resultSpamTxt, isHolidayNotified);
|
||||
hasPerformedSpamCheck = true;
|
||||
}
|
||||
// 대체문자 내용
|
||||
if(StringUtils.isNotEmpty(subMsgTxtTemp)) {
|
||||
if(replaceSubYN) {
|
||||
checkSpamAndSetStatus(kakaoVO
|
||||
, subMsgTxtTemp
|
||||
, resultSpamTxt, isHolidayNotified);
|
||||
}else if(!hasPerformedSubSpamCheck) {
|
||||
checkSpamAndSetStatus(kakaoVO
|
||||
, subMsgTxtTemp
|
||||
, resultSpamTxt, isHolidayNotified);
|
||||
hasPerformedSubSpamCheck = true;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
log.info(" kakaoVO.toString() :: [{}]",kakaoVO.ftToString());
|
||||
|
||||
|
||||
/* @isHolidayNotified
|
||||
* - 관리자 알림 설정으로 인해
|
||||
* - 해당 시간이면 지연 미처리
|
||||
* @smishingYn
|
||||
* - 회원 별 '스미싱 온' 상태값
|
||||
* - Y면 알림, 지연 처리해야 함
|
||||
* */
|
||||
if("Y".equalsIgnoreCase(atSmishingYn) && isHolidayNotified) {
|
||||
kakaoVO.setSpamStatus("Y");
|
||||
kakaoVO.setSmishingYn("Y");
|
||||
kakaoVO.setAtDelayYn("Y");
|
||||
}
|
||||
|
||||
// 지연 여부 처리
|
||||
if (( "Y".equalsIgnoreCase(atSmishingYn) || "Y".equalsIgnoreCase(kakaoVO.getAtDelayYn()))
|
||||
&& !hasPerformedDelayYn && isHolidayNotified) {
|
||||
calendar.add(Calendar.MINUTE, 30); // 모든 시간을 30분 뒤로 미룸
|
||||
// TEST
|
||||
// calendar.add(Calendar.MINUTE, 5); // 모든 시간을 30분 뒤로 미룸
|
||||
hasPerformedDelayYn = true;
|
||||
}
|
||||
|
||||
sendVO.setReqDate(sdf.format(calendar.getTime())); // 분할된 시간 설정 또는 기본 예약 시간 사용
|
||||
|
||||
|
||||
|
||||
|
||||
// 타이틀이나 버튼이 있고
|
||||
if(hasButtons || StringUtils.isNotEmpty(kakaoVO.getTemplateImageUrl())) {
|
||||
//
|
||||
if (StringUtils.isEmpty(sharedJsonStr)) {
|
||||
// 치환 데이터가 없고 아직 생성되지 않았으면 한 번만 생성
|
||||
sharedJsonStr = kakaoApiJsonSave.kakaoApiFTJsonSave_advc(kakaoVO);
|
||||
sendVO.setJsonStr(sharedJsonStr);
|
||||
}
|
||||
sendVO.setBizJsonName(idList.get(0));
|
||||
|
||||
}
|
||||
|
||||
kakaoSendAdvcListVO.add(sendVO);
|
||||
log.info(" sendVO.toString() :: [{}]",sendVO.toString());
|
||||
}
|
||||
|
||||
|
||||
return kakaoSendAdvcListVO;
|
||||
}
|
||||
|
||||
private void checkSpamAndSetStatus(KakaoVO kakaoVO
|
||||
, String chkText
|
||||
, List<String> resultSpamTxt, boolean isHolidayNotified) throws Exception {
|
||||
// TODO Auto-generated method stub
|
||||
|
||||
|
||||
kakaoVO.setSpamStatus("N");
|
||||
kakaoVO.setAtDelayYn("N");
|
||||
|
||||
if(StringUtils.isNotEmpty(chkText)) {
|
||||
|
||||
String resultParser = ComGetSpamStringParser.getSpamTextParse(chkText).trim();
|
||||
int spmCnt = 0;
|
||||
String spmFilterTxt = "";
|
||||
|
||||
for (String spmTxt : resultSpamTxt) {
|
||||
String parserStr = ComGetSpamStringParser.getSpamTextParse(spmTxt).trim();
|
||||
if (resultParser.contains(parserStr) || chkText.contains(parserStr)) {
|
||||
spmCnt++;
|
||||
spmFilterTxt += spmTxt + ",";
|
||||
}
|
||||
}
|
||||
|
||||
if (spmCnt > 0) { // 스팸 문자가 포함된 경우
|
||||
|
||||
if (StringUtil.getWordRight(spmFilterTxt.trim(), 1).equals(",")) {
|
||||
// 처음부터 idx 만큼 잘라낸 나머지 글자
|
||||
spmFilterTxt = StringUtil.getWordLeft(spmFilterTxt.trim(), 1);
|
||||
|
||||
}
|
||||
|
||||
/* @isHolidayNotified
|
||||
* - 관리자 알림 설정으로 인해
|
||||
* - 해당 시간이면 지연 미처리
|
||||
* */
|
||||
kakaoVO.setSpamStatus("Y");
|
||||
if(isHolidayNotified) {
|
||||
kakaoVO.setAtDelayYn("Y");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
// TODO(human): 아래에 새로운 메소드 구현
|
||||
/**
|
||||
* 대체문자 가격 계산 최적화 메소드
|
||||
* @param subMsgTxt 대체문자 내용
|
||||
* @param imgFilePath 이미지 파일 경로
|
||||
* @param shortPrice 단문 가격
|
||||
* @param longPrice 장문 가격
|
||||
* @param picturePrice 사진 가격
|
||||
* @param kakaoFtPrice 카카오 친구톡 가격
|
||||
* @return 계산 결과 Map (sendType, chosenPrice, filePath 포함)
|
||||
* @throws UnsupportedEncodingException
|
||||
*/
|
||||
private Map<String, Object> calculateSubMsgPricing(String subMsgTxt, String imgFilePath,
|
||||
float shortPrice, float longPrice,
|
||||
float picturePrice, float kakaoFtPrice) throws UnsupportedEncodingException {
|
||||
Map<String, Object> result = new HashMap<>();
|
||||
|
||||
String sendType = "MMS";
|
||||
if(StringUtils.isEmpty(imgFilePath)) {
|
||||
int smsTxtByte = mjonCommon.getSmsTxtBytes(subMsgTxt);
|
||||
sendType = getMsgType(smsTxtByte);
|
||||
}
|
||||
|
||||
result.put("sendType", sendType);
|
||||
|
||||
// INVALID인 경우 추가 처리 없이 반환
|
||||
if ("INVALID".equals(sendType)) {
|
||||
return result;
|
||||
}
|
||||
|
||||
float chosenPrice = 0f;
|
||||
if(StringUtils.isNotEmpty(imgFilePath)) {
|
||||
chosenPrice = Math.max(picturePrice, kakaoFtPrice);
|
||||
result.put("filePath", imgFilePath);
|
||||
} else if ("MMS".equals(sendType)) {
|
||||
chosenPrice = Math.max(longPrice, kakaoFtPrice);
|
||||
} else {
|
||||
chosenPrice = Math.max(shortPrice, kakaoFtPrice);
|
||||
}
|
||||
|
||||
result.put("sendType", sendType);
|
||||
result.put("chosenPrice", Float.toString(chosenPrice));
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* 가격 계산 결과를 sendVO에 적용하는 헬퍼 메소드
|
||||
* @param sendVO 적용할 KakaoSendAdvcVO 객체
|
||||
* @param pricingResult 가격 계산 결과 Map
|
||||
*/
|
||||
private void applyPricingResult(KakaoSendAdvcVO sendVO, Map<String, Object> pricingResult) {
|
||||
sendVO.setSubMsgType((String) pricingResult.get("sendType"));
|
||||
sendVO.setEachPrice((String) pricingResult.get("chosenPrice"));
|
||||
if (pricingResult.get("filePath") != null) {
|
||||
sendVO.setFilePath1((String) pricingResult.get("filePath"));
|
||||
sendVO.setFileCnt("1");
|
||||
}
|
||||
}
|
||||
|
||||
public static String getMsgTypeWithByteValidation(MjonFTSendVO sendVO, String p_smsTxt) throws UnsupportedEncodingException {
|
||||
|
||||
|
||||
// // 내문자저장함에 저장 후 문자를 발송하는 경우 문자 타입이 숫자가 아닌 문자로 넘어와서 변경 처리함
|
||||
// if ("P".equals(msgType) || "L".equals(msgType)) {
|
||||
// msgType = "6";
|
||||
// } else if ("S".equals(msgType)) {
|
||||
// msgType = "4";
|
||||
// }
|
||||
|
||||
int smsTxtByte = MjonCommon.getSmsTxtBytes(p_smsTxt);
|
||||
String msgType = SHORT_MSG_TYPE;
|
||||
|
||||
// 1. 2000 Byte 초과는 에러 처리
|
||||
if (smsTxtByte > 2000) {
|
||||
return "INVALID";
|
||||
}
|
||||
|
||||
// 2. 첨부파일 여부 확인 (첨부파일이 있으면 장문으로 설정)
|
||||
if (StringUtils.isNotEmpty(sendVO.getFilePath1())) {
|
||||
msgType = LONG_MSG_TYPE;
|
||||
}
|
||||
// 3. 문자 길이에 따라 메시지 타입 설정 (90 Byte 초과는 장문)
|
||||
else if (smsTxtByte > 90) {
|
||||
msgType = LONG_MSG_TYPE;
|
||||
}
|
||||
return msgType;
|
||||
}
|
||||
|
||||
|
||||
private Calendar setupBaseDateFT(KakaoVO kakaoVO) throws ParseException {
|
||||
|
||||
// baseDate 추출
|
||||
Date baseDate = resolveBaseDate(kakaoVO);
|
||||
|
||||
// 시간 성정
|
||||
Calendar calendar = Calendar.getInstance();
|
||||
calendar.setTime(baseDate); // calendar에 baseDate 설정
|
||||
|
||||
return calendar;
|
||||
}
|
||||
|
||||
private Calendar setupBaseDate(KakaoVO kakaoVO, boolean isHolidayNotified) throws ParseException {
|
||||
|
||||
// baseDate 추출
|
||||
Date baseDate = resolveBaseDate(kakaoVO);
|
||||
|
||||
// 시간 성정
|
||||
Calendar calendar = Calendar.getInstance();
|
||||
calendar.setTime(baseDate); // calendar에 baseDate 설정
|
||||
@ -293,12 +756,37 @@ public class KakaoSendUtil {
|
||||
// 지연 여부 처리
|
||||
// 알림톡 스미싱의심 + 공휴일알림 조건이 맞으면 30분 delay
|
||||
if ( "Y".equalsIgnoreCase(kakaoVO.getAtSmishingYn())
|
||||
&& isNotified) {
|
||||
&& isHolidayNotified) {
|
||||
calendar.add(Calendar.MINUTE, 30); // 모든 시간을 30분 뒤로 미룸
|
||||
}
|
||||
return calendar;
|
||||
}
|
||||
|
||||
public Date resolveBaseDate(KakaoVO kakaoVO) throws ParseException {
|
||||
Date now = new Date();
|
||||
|
||||
if (StringUtils.isEmpty(kakaoVO.getReqDate())) {
|
||||
kakaoVO.setReqDate(DATE_FORMATTER.format(now));
|
||||
return now;
|
||||
}
|
||||
return DATE_FORMATTER.parse(kakaoVO.getReqDate());
|
||||
}
|
||||
|
||||
// 2. 친구톡 발송 제한 시간인지 확인
|
||||
public boolean isRestrictedFriendTalkTime(Date baseDate) {
|
||||
Calendar cal = Calendar.getInstance();
|
||||
cal.setTime(baseDate);
|
||||
|
||||
int hour = cal.get(Calendar.HOUR_OF_DAY);
|
||||
int minute = cal.get(Calendar.MINUTE);
|
||||
|
||||
// 20:50 이후 ~ 익일 08:00 이전은 제한
|
||||
if ((hour == 20 && minute >= 50) || hour > 20 || hour < 8) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* @methodName : createSendVO
|
||||
* @author : 이호영
|
||||
@ -309,14 +797,45 @@ public class KakaoSendUtil {
|
||||
* @return
|
||||
*
|
||||
*/
|
||||
private KakaoSendAdvcVO createSendVO(KakaoVO kakaoVO) {
|
||||
private KakaoSendAdvcVO createATSendVO(KakaoVO kakaoVO) {
|
||||
KakaoSendAdvcVO sendVO = new KakaoSendAdvcVO();
|
||||
sendVO.setMsgType("8");
|
||||
sendVO.setAgentCode("04");
|
||||
sendVO.setSenderKey(kakaoVO.getSenderKey());
|
||||
sendVO.setTemplateCode(kakaoVO.getTemplateCode());
|
||||
sendVO.setUserId(kakaoVO.getUserId());
|
||||
sendVO.setCallFrom(kakaoVO.getCallFrom());
|
||||
return sendVO;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @methodName : createFTSendVO
|
||||
* @author : 이호영
|
||||
* @date : 2025. 4. 23.
|
||||
* @description :
|
||||
* @return : KakaoSendAdvcVO
|
||||
* @param kakaoVO
|
||||
* @return
|
||||
*
|
||||
*/
|
||||
private KakaoSendAdvcVO createFTSendVO(KakaoVO kakaoVO, Calendar calendar) {
|
||||
KakaoSendAdvcVO sendVO = new KakaoSendAdvcVO();
|
||||
|
||||
sendVO.setMsgType("9"); // 알림톡 8 친구톡 9
|
||||
sendVO.setAgentCode("04");
|
||||
// 발송시간 : 친구톡은 분할 발송이 없어 처음 vo 생성 시 입력
|
||||
sendVO.setReqDate(DATE_FORMATTER.format(calendar.getTime()));
|
||||
|
||||
sendVO.setSenderKey(kakaoVO.getSenderKey());
|
||||
sendVO.setTemplateCode(kakaoVO.getTemplateCode());
|
||||
sendVO.setUserId(kakaoVO.getUserId());
|
||||
sendVO.setCallFrom(kakaoVO.getCallFrom());
|
||||
sendVO.setSubMsgSendYn(kakaoVO.getSubMsgSendYn());
|
||||
|
||||
sendVO.setAdFlag(kakaoVO.getAdFlag());
|
||||
|
||||
|
||||
return sendVO;
|
||||
}
|
||||
|
||||
@ -378,7 +897,7 @@ public class KakaoSendUtil {
|
||||
}
|
||||
|
||||
|
||||
public Float getValidPrice(Float personalPrice, Float defaultPrice) {
|
||||
public static Float getValidPrice(Float personalPrice, Float defaultPrice) {
|
||||
return (personalPrice != null && personalPrice > 0) ? personalPrice : defaultPrice;
|
||||
}
|
||||
|
||||
@ -692,6 +1211,10 @@ public class KakaoSendUtil {
|
||||
//카카오 친구톡 개인 단가가 없는 경우 시스템 단가로
|
||||
if(mberManageVO.getKakaoFtPrice() == 0.0f)
|
||||
mberManageVO.setKakaoFtPrice(sysJoinSetVO.getKakaoFtPrice());
|
||||
if(mberManageVO.getKakaoFtImgPrice() == 0.0f)
|
||||
mberManageVO.setKakaoFtImgPrice(sysJoinSetVO.getKakaoFtImgPrice());
|
||||
if(mberManageVO.getKakaoFtWideImgPrice() == 0.0f)
|
||||
mberManageVO.setKakaoFtWideImgPrice(sysJoinSetVO.getKakaoFtWideImgPrice());
|
||||
|
||||
|
||||
// SMS 인경우
|
||||
@ -703,7 +1226,9 @@ public class KakaoSendUtil {
|
||||
// 사용자 개인 단가가 없으면 시스템 단가로
|
||||
if(mberManageVO.getLongPrice() == 0.0f)
|
||||
mberManageVO.setLongPrice(sysJoinSetVO.getLongPrice());
|
||||
|
||||
|
||||
if(mberManageVO.getPicturePrice() == 0.0f)
|
||||
mberManageVO.setPicturePrice(sysJoinSetVO.getPicturePrice());
|
||||
|
||||
return mberManageVO;
|
||||
}
|
||||
@ -1202,4 +1727,175 @@ public class KakaoSendUtil {
|
||||
statusResponse.setMessage(msg);
|
||||
|
||||
}
|
||||
|
||||
|
||||
// 보유 금액이 충분한지 확인하는 메서드
|
||||
public boolean isCashSufficient(String userId, List<KakaoSendAdvcVO> kakaoSendAdvcListVO) throws Exception {
|
||||
|
||||
|
||||
String userMoney = priceAndPoint.getBefCash(userId);
|
||||
// 쉼표 제거
|
||||
userMoney = userMoney.replace(",", "");
|
||||
|
||||
|
||||
// 사용자 보유 금액 BigDecimal 변환 (HALF_EVEN 적용)
|
||||
BigDecimal befCash = new BigDecimal(userMoney).setScale(2, RoundingMode.HALF_EVEN);
|
||||
log.info(" + userMoney :: [{}]", userMoney);
|
||||
log.info(" + befCash :: [{}]", befCash);
|
||||
|
||||
|
||||
// 총 메시지 금액 계산 (HALF_EVEN 적용)
|
||||
BigDecimal totalEachPrice = kakaoSendAdvcListVO.stream()
|
||||
.map(msg -> new BigDecimal(String.valueOf(msg.getEachPrice()))) // 변환 오류 방지
|
||||
.reduce(BigDecimal.ZERO, BigDecimal::add)
|
||||
.setScale(2, RoundingMode.HALF_EVEN); // 일관성 유지
|
||||
|
||||
log.info(" + totalEachPrice :: [{}]", totalEachPrice);
|
||||
// 비교 수행
|
||||
return befCash.compareTo(totalEachPrice) >= 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* @methodName : insertKakaoAtDataJsonInfo_advc
|
||||
* @author : 이호영
|
||||
* @date : 2025. 4. 24.
|
||||
* @description : INSERT INTO BIZ_ATTACHMENTS
|
||||
* @return : void
|
||||
* @param kakaoSendAdvcListVO
|
||||
*
|
||||
*/
|
||||
public void insertKakaoAtDataJsonInfo_advc(List<KakaoSendAdvcVO> kakaoSendAdvcListVO) {
|
||||
|
||||
List<KakaoSendAdvcVO> jsonInfoData = new ArrayList<>(kakaoSendAdvcListVO);
|
||||
jsonInfoData.removeIf(t -> StringUtils.isBlank(t.getJsonStr()));
|
||||
log.info(" + jsonInfoData Insert :: [{}]", jsonInfoData.size());
|
||||
if(jsonInfoData.size() > 0) {
|
||||
kakaoAlimTalkDAO.insertKakaoAtDataJsonInfo_advc(jsonInfoData);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* @methodName : insertKakaoData_advc
|
||||
* @author : 이호영
|
||||
* @date : 2025. 3. 20.
|
||||
* @description : 카카오 batch 발송 => mj_msg_data
|
||||
* @return : int
|
||||
* @param kakaoSendAdvcVOList
|
||||
* @param parentLoopCount
|
||||
* @param isJsonNotEmpty
|
||||
* @param isJsonNameAllSame
|
||||
* @return
|
||||
*
|
||||
*/
|
||||
public int insertKakaoData_advc(List<KakaoSendAdvcVO> kakaoSendAdvcVOList) {
|
||||
|
||||
|
||||
// 시작 시간 측정
|
||||
long totalStartTime = System.currentTimeMillis();
|
||||
|
||||
int totalSize = kakaoSendAdvcVOList.size(); // 총 데이터 개수
|
||||
// Batch 크기 설정 (고정값)
|
||||
// int batchSize = 10000; 465
|
||||
int batchSize = 50000; // 9분 18초
|
||||
|
||||
log.info("총 데이터 개수 :: [{}] ", totalSize);
|
||||
log.info("설정된 Batch 크기 :: [{}] ", batchSize);
|
||||
|
||||
// 총 insert 카운트
|
||||
int instCnt = 0;
|
||||
int batchCount = 0;
|
||||
|
||||
// 각 배치별 실행 시간 기록
|
||||
List<Double> batchExecutionTimes = new ArrayList<>();
|
||||
|
||||
|
||||
// 첫 번째 배치에서만 삽입했는지 추적하는 플래그
|
||||
for (int i = 0; i < totalSize; i += batchSize) {
|
||||
// Batch 시작 시간 측정
|
||||
long batchStartTime = System.currentTimeMillis();
|
||||
|
||||
// Batch 리스트 생성
|
||||
List<KakaoSendAdvcVO> batchList = kakaoSendAdvcVOList.subList(i, Math.min(i + batchSize, totalSize));
|
||||
System.out.println("Batch 시작 인덱스: " + i);
|
||||
|
||||
// mj_msg_data 테이블 insert
|
||||
int insertedCount = kakaoAlimTalkDAO.insertKakaoAtDataInfo_advc(batchList);
|
||||
|
||||
/** @kakaoSendUtil.populateSendLists
|
||||
* 하단에서
|
||||
* getJsonStr 데이터 처리 후 활용
|
||||
* */
|
||||
instCnt += insertedCount;
|
||||
|
||||
// Batch 종료 시간 측정 및 실행 시간 계산
|
||||
long batchEndTime = System.currentTimeMillis();
|
||||
double batchExecutionTimeInSeconds = (batchEndTime - batchStartTime) / 1000.0;
|
||||
|
||||
// 실행 시간 기록
|
||||
batchExecutionTimes.add(batchExecutionTimeInSeconds);
|
||||
batchCount++;
|
||||
}
|
||||
|
||||
// 종료 시간 측정
|
||||
long totalEndTime = System.currentTimeMillis();
|
||||
|
||||
// 총 실행 시간 계산 (밀리초 -> 초로 변환)
|
||||
double totalExecutionTimeInSeconds = (totalEndTime - totalStartTime) / 1000.0;
|
||||
|
||||
// 실행 시간 출력
|
||||
log.info("총 배치 실행 횟수 :: [{}] ", batchCount);
|
||||
log.info("batchSize :: [{}] ", batchSize);
|
||||
log.info("총 실행 시간 :: [{}] ", totalExecutionTimeInSeconds + "초");
|
||||
log.info("총 삽입 건수 :: [{}] ", instCnt);
|
||||
|
||||
// 각 배치별 실행 시간 출력
|
||||
for (int k = 0; k < batchExecutionTimes.size(); k++) {
|
||||
System.out.println("배치 " + (k + 1) + " 실행 시간 :: " + batchExecutionTimes.get(k) + "초");
|
||||
}
|
||||
|
||||
return instCnt;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
public void insertKakaoGroupDataTb_advc(int instCnt, KakaoVO kakaoVO, KakaoSendAdvcVO sendVO) throws Exception {
|
||||
// TODO Auto-generated method stub
|
||||
|
||||
// log.info(" + insertKakaoGroupDataTb_advc kakaoVO :: \n[{}]", kakaoVO.toString());;
|
||||
// log.info(" + insertKakaoGroupDataTb_advc kakaoSendAdvcVOList :: \n[{}]", sendVO.toString());
|
||||
|
||||
|
||||
|
||||
sendVO.setTemplateContent(kakaoVO.getTemplateContent());
|
||||
sendVO.setMsgGroupCnt(Integer.toString(instCnt));
|
||||
sendVO.setReserveYn(kakaoVO.getReserveYn());
|
||||
sendVO.setBefCash(priceAndPoint.getBefCash(sendVO.getUserId()));
|
||||
sendVO.setBefPoint(priceAndPoint.getBefPoint(sendVO.getUserId()));
|
||||
sendVO.setAdFlag(kakaoVO.getAdFlag());
|
||||
|
||||
Float eachPrice = Float.parseFloat(sendVO.getEachPrice());
|
||||
|
||||
Float totPrice = eachPrice * instCnt;
|
||||
sendVO.setTotPrice(String.format("%.1f", totPrice));
|
||||
|
||||
sendVO.setAtDelayYn(kakaoVO.getAtDelayYn());
|
||||
sendVO.setBizKakaoResendOrgnlTxt(kakaoVO.getSubMsgTxt());
|
||||
sendVO.setBizKakaoResendType(sendVO.getSubMsgType());
|
||||
sendVO.setBizKakaoImageType(kakaoVO.getImageType());
|
||||
|
||||
kakaoAlimTalkDAO.insertKakaoGroupDataTb_advc(sendVO);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
@ -4,6 +4,7 @@ import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import itn.com.cmm.MjonFTSendVO;
|
||||
import itn.let.mjo.msg.service.MjonMsgVO;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
@ -259,9 +260,14 @@ public class KakaoVO extends MjonMsgVO{
|
||||
private String msgResendAllGroupId;
|
||||
private String msgResendAllTmpKey;
|
||||
private String msgResendAllYellowId;
|
||||
|
||||
private String bizKakaoResendType;
|
||||
private String fileCnt;
|
||||
|
||||
private List<Map<String, String>> varListMap;
|
||||
|
||||
private List<MjonFTSendVO> mjonFTSendVOList = new ArrayList<>();
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
String varListMapString = "[";
|
||||
@ -286,6 +292,18 @@ public class KakaoVO extends MjonMsgVO{
|
||||
}
|
||||
varListMapString += "]";
|
||||
|
||||
|
||||
StringBuilder mjonFTListSb = new StringBuilder("[");
|
||||
if (mjonFTSendVOList != null && !mjonFTSendVOList.isEmpty()) {
|
||||
String prefix = "";
|
||||
for (MjonFTSendVO vo : mjonFTSendVOList) {
|
||||
mjonFTListSb.append(prefix).append(vo == null ? "null" : vo.toString());
|
||||
prefix = ", ";
|
||||
}
|
||||
}
|
||||
mjonFTListSb.append("]");
|
||||
|
||||
|
||||
return "KakaoSendAdvcVO[" +
|
||||
"\n senderKey=[" + senderKey + "]" +
|
||||
"\n , subMsgTxtReplYn=[" + subMsgTxtReplYn + "]" +
|
||||
@ -312,8 +330,62 @@ public class KakaoVO extends MjonMsgVO{
|
||||
"\n , varListMap=[" + varListMapString + "]" +
|
||||
"\n , befCash=[" + getBefCash() + "]" +
|
||||
"\n , befPoint=[" + getBefPoint() + "]" +
|
||||
"\n , mjonFTSendVOList=" + mjonFTListSb.toString() +
|
||||
"\n ]";
|
||||
}
|
||||
|
||||
public String ftToString() {
|
||||
StringBuilder sb = new StringBuilder("KakaoFTSendVO[");
|
||||
sb.append("\n senderKey=[").append(senderKey).append("]");
|
||||
sb.append("\n , imageFileName=[").append(imageFileName).append("]");
|
||||
sb.append("\n , imageType=[").append(imageType).append("]");
|
||||
sb.append("\n , imgTitle=[").append(imgTitle).append("]");
|
||||
sb.append("\n , imgLink=[").append(imgLink).append("]");
|
||||
sb.append("\n , templateContent=[").append(templateContent).append("]");
|
||||
sb.append("\n , templateImageUrl=[").append(templateImageUrl).append("]");
|
||||
sb.append("\n , smsTxtArea=[").append(getSubMsgTxt()).append("]");
|
||||
sb.append("\n , subMsgSendYn=[").append(subMsgSendYn).append("]");
|
||||
sb.append("\n , subMsgTxtReplYn=[").append(subMsgTxtReplYn).append("]");
|
||||
sb.append("\n , subMsgType=[").append(subMsgType).append("]");
|
||||
sb.append("\n , subMsgTxt=[").append(subMsgTxt).append("]");
|
||||
sb.append("\n , reserveYn=[").append(getReserveYn()).append("]");
|
||||
sb.append("\n , menuTopTab=[").append(menuTopTab).append("]");
|
||||
sb.append("\n , bizJsonYn=[").append(bizJsonYn).append("]");
|
||||
sb.append("\n , senderKey=[").append(senderKey).append("]");
|
||||
sb.append("\n , callFrom=[").append(getCallFrom()).append("]");
|
||||
sb.append("\n , kakaoFtPrice=[").append(getEachPrice()).append("]");
|
||||
sb.append("\n , reqDate=[").append(getReqDate()).append("]");
|
||||
sb.append("\n , spamStatus=[").append(getSpamStatus()).append("]");
|
||||
sb.append("\n , txtReplYn=[").append(getTxtReplYn()).append("]");
|
||||
sb.append("\n , atSmishingYn=[").append(getAtSmishingYn()).append("]");
|
||||
sb.append("\n , atDelayYn=[").append(getAtDelayYn()).append("]");
|
||||
// sb.append("\n , tmpBtnSelect=[").append(getTmpBtnSelect()).append("]");
|
||||
StringBuilder btnListSb = new StringBuilder("[");
|
||||
if (buttonVOList != null && !buttonVOList.isEmpty()) {
|
||||
String prefix = "";
|
||||
for (KakaoButtonVO btn : buttonVOList) {
|
||||
btnListSb.append(prefix).append(btn == null ? "null" : btn.toString());
|
||||
prefix = ", ";
|
||||
}
|
||||
}
|
||||
btnListSb.append("]");
|
||||
sb.append("\n , buttonVOList=").append(btnListSb);
|
||||
|
||||
|
||||
// mjonFTSendVOList 내용
|
||||
StringBuilder ftList = new StringBuilder("[");
|
||||
if (mjonFTSendVOList != null && !mjonFTSendVOList.isEmpty()) {
|
||||
String prefix = "";
|
||||
for (MjonFTSendVO vo : mjonFTSendVOList) {
|
||||
ftList.append(prefix).append(vo == null ? "null" : vo.toString());
|
||||
prefix = ", ";
|
||||
}
|
||||
}
|
||||
ftList.append("]");
|
||||
sb.append("\n , mjonFTSendVOList=").append(ftList);
|
||||
|
||||
sb.append("\n]");
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -5,7 +5,10 @@ import java.awt.image.BufferedImage;
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.InputStream;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Date;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.ListIterator;
|
||||
@ -15,6 +18,8 @@ import javax.annotation.Resource;
|
||||
import javax.imageio.ImageIO;
|
||||
import javax.swing.ImageIcon;
|
||||
|
||||
import org.apache.commons.io.FilenameUtils;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.apache.http.HttpEntity;
|
||||
import org.apache.http.HttpResponse;
|
||||
import org.apache.http.client.HttpClient;
|
||||
@ -30,16 +35,21 @@ import org.apache.http.util.EntityUtils;
|
||||
import org.json.simple.JSONObject;
|
||||
import org.json.simple.parser.JSONParser;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
|
||||
import egovframework.rte.fdl.property.EgovPropertyService;
|
||||
import itn.com.cmm.service.EgovFileMngService;
|
||||
import itn.com.cmm.service.EgovFileMngUtil;
|
||||
import itn.com.cmm.service.FileVO;
|
||||
import itn.let.kakao.kakaoComm.KakaoReturnVO;
|
||||
import itn.let.kakao.kakaoComm.KakaoVO;
|
||||
import itn.let.mail.service.StatusResponse;
|
||||
import itn.let.utl.fcc.service.EgovStringUtil;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
@Slf4j
|
||||
@Component("kakaoApiImageUpload")
|
||||
public class KakaoApiImageUpload {
|
||||
|
||||
@ -57,7 +67,17 @@ public class KakaoApiImageUpload {
|
||||
|
||||
@Resource(name = "propertiesService")
|
||||
protected EgovPropertyService propertyService;
|
||||
|
||||
|
||||
/** 첨부파일 저장경로 */
|
||||
@Value("#{globalSettings['Globals.file.saveDir']}")
|
||||
private String fileSaveDir;
|
||||
|
||||
@Resource(name="EgovFileMngUtil")
|
||||
private EgovFileMngUtil fileUtil;
|
||||
|
||||
|
||||
@Resource(name="EgovFileMngService")
|
||||
private EgovFileMngService fileMngService;
|
||||
|
||||
/**
|
||||
* @Method Name : kakaoApiImageUpload
|
||||
@ -219,13 +239,13 @@ public class KakaoApiImageUpload {
|
||||
.addTextBody("bizId", mjonBizId)
|
||||
.addTextBody("apiKey", mjonBizKakaoApiKey)
|
||||
.addTextBody("imageType", kakaoVO.getImageType())
|
||||
.addTextBody("title", kakaoVO.getImgTitle())
|
||||
.addTextBody("link", kakaoVO.getImgLink())
|
||||
.addTextBody("title", "test")
|
||||
.addTextBody("link", "https://maaa.com")
|
||||
.addTextBody("senderKey", kakaoVO.getSenderKey())
|
||||
.addBinaryBody("image", new File(filePath),ContentType.MULTIPART_FORM_DATA,fullFileName)
|
||||
.build();
|
||||
|
||||
httpPost.setEntity(httpEntity);
|
||||
httpPost.setEntity(httpEntity);
|
||||
|
||||
CloseableHttpResponse response = httpClient.execute(httpPost);
|
||||
|
||||
@ -245,6 +265,7 @@ public class KakaoApiImageUpload {
|
||||
String msg = object.get("message").toString();
|
||||
String imgUrl = "";
|
||||
|
||||
log.info(" : code :: [{}]", code);
|
||||
if(code.equals("200")) {
|
||||
imgUrl = object.get("image").toString();
|
||||
}
|
||||
@ -273,6 +294,174 @@ public class KakaoApiImageUpload {
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* @methodName : kakaoApiImageUpload_advc
|
||||
* @author : 이호영
|
||||
* @date : 2025. 6. 4.
|
||||
* @description : kakaoApiImageUpload 수정
|
||||
* @return : StatusResponse
|
||||
* @param kakaoVO
|
||||
* @param files
|
||||
* @param i
|
||||
* @return
|
||||
* @throws Exception
|
||||
*
|
||||
*/
|
||||
public StatusResponse kakaoApiImageUpload_advc(KakaoVO kakaoVO, Map<String, MultipartFile> files, int fileKeyParam) throws Exception {
|
||||
// try {
|
||||
String storePathString = propertyService.getString("Globals.fileStorePath");
|
||||
File saveFolder = new File(storePathString);
|
||||
if (!saveFolder.exists()) saveFolder.mkdirs();
|
||||
|
||||
// for (MultipartFile file : files.values()) {
|
||||
MultipartFile file = files.values().stream().findFirst().orElse(null);
|
||||
if (file == null || file.isEmpty()) {
|
||||
return new StatusResponse(HttpStatus.BAD_REQUEST, "유효한 이미지 파일이 없습니다.", LocalDateTime.now());
|
||||
}
|
||||
|
||||
|
||||
String originalName = file.getOriginalFilename();
|
||||
if (originalName == null || originalName.isEmpty()) {
|
||||
return new StatusResponse(HttpStatus.BAD_REQUEST, "파일명이 비어 있습니다.", LocalDateTime.now());
|
||||
}
|
||||
|
||||
String ext = FilenameUtils.getExtension(originalName).toLowerCase();
|
||||
if (!ext.matches("jpg|jpeg|png")) {
|
||||
return new StatusResponse(HttpStatus.BAD_REQUEST, "지원하지 않는 이미지 형식입니다.");
|
||||
}
|
||||
|
||||
long size = file.getSize();
|
||||
if (size > 5 * 1024 * 1024) {
|
||||
return new StatusResponse(HttpStatus.BAD_REQUEST, "이미지 용량은 5MB 이내여야 합니다.");
|
||||
}
|
||||
|
||||
BufferedImage image = ImageIO.read(file.getInputStream());
|
||||
if (image == null) {
|
||||
return new StatusResponse(HttpStatus.BAD_REQUEST, "이미지를 읽을 수 없습니다.");
|
||||
}
|
||||
|
||||
int width = image.getWidth();
|
||||
int height = image.getHeight();
|
||||
String type = kakaoVO.getImageType();
|
||||
|
||||
if ("W".equals(type)) {
|
||||
if (width != 800 || height != 600) {
|
||||
return new StatusResponse(HttpStatus.BAD_REQUEST, "와이드 이미지는 800x600 사이즈만 허용됩니다.");
|
||||
}
|
||||
} else {
|
||||
float ratio = width / (float) height;
|
||||
// log.info("width : [{}], ",width);
|
||||
// log.info("height : [{}], ",height);
|
||||
// log.info("ratio : [{}], ",ratio);
|
||||
if (width < 500 || ratio < 0.75 || ratio > 2.0) {
|
||||
return new StatusResponse(HttpStatus.BAD_REQUEST, "일반 이미지는 가로 500px 이상, 비율 2:1 이상 또는 3:4 이하만 허용됩니다.");
|
||||
}
|
||||
}
|
||||
|
||||
String atchFileId = this.saveImgFile(files);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
String newName = EgovStringUtil.getTimeStamp() + fileKeyParam;
|
||||
String filePath = storePathString + File.separator + newName + "." + ext;
|
||||
file.transferTo(new File(filePath));
|
||||
|
||||
// 카카오 API 호출
|
||||
CloseableHttpClient httpClient = HttpClients.createDefault();
|
||||
String apiUrl = mjonBizUrl + "/v3/kakao/image/upload";
|
||||
|
||||
HttpPost httpPost = new HttpPost(apiUrl);
|
||||
/*HttpEntity httpEntity = MultipartEntityBuilder.create()
|
||||
.addTextBody("bizId", mjonBizId)
|
||||
.addTextBody("apiKey", mjonBizKakaoApiKey)
|
||||
.addTextBody("imageType", kakaoVO.getImageType())
|
||||
.addTextBody("title", kakaoVO.getImgTitle())
|
||||
.addTextBody("link", kakaoVO.getImgLink())
|
||||
.addTextBody("senderKey", kakaoVO.getSenderKey())
|
||||
.addBinaryBody("image", new File(filePath), ContentType.MULTIPART_FORM_DATA, newName + "." + ext)
|
||||
.build();
|
||||
*/
|
||||
|
||||
HttpEntity httpEntity = MultipartEntityBuilder.create()
|
||||
.addTextBody("bizId", mjonBizId)
|
||||
.addTextBody("apiKey", mjonBizKakaoApiKey)
|
||||
.addTextBody("imageType", kakaoVO.getImageType())
|
||||
.addTextBody("title", originalName)
|
||||
.addTextBody("link", StringUtils.isEmpty(kakaoVO.getImgLink()) ? "https://" : kakaoVO.getImgLink())
|
||||
.addTextBody("senderKey", kakaoVO.getSenderKey())
|
||||
.addBinaryBody("image", new File(filePath), ContentType.MULTIPART_FORM_DATA, newName + "." + ext)
|
||||
.build();
|
||||
|
||||
httpPost.setEntity(httpEntity);
|
||||
|
||||
|
||||
|
||||
CloseableHttpResponse response = httpClient.execute(httpPost);
|
||||
int statusCode = response.getStatusLine().getStatusCode();
|
||||
|
||||
if (statusCode == 200) {
|
||||
String result = EntityUtils.toString(response.getEntity(), "UTF-8");
|
||||
JSONParser parser = new JSONParser();
|
||||
JSONObject object = (JSONObject) parser.parse(result);
|
||||
|
||||
String code = object.get("code").toString();
|
||||
if ("200".equals(code)) {
|
||||
Map<String, Object> returnMap = new HashMap<>();
|
||||
returnMap.put("imgUrl", object.get("image").toString());
|
||||
returnMap.put("fileName", originalName);
|
||||
returnMap.put("atchFileId", atchFileId);
|
||||
|
||||
return new StatusResponse(HttpStatus.OK, "이미지 등록이 완료 되었습니다.", returnMap);
|
||||
} else {
|
||||
return new StatusResponse(HttpStatus.BAD_REQUEST, object.get("message").toString(), LocalDateTime.now());
|
||||
}
|
||||
} else {
|
||||
return new StatusResponse(HttpStatus.BAD_REQUEST, "카카오 API 요청 실패", LocalDateTime.now());
|
||||
}
|
||||
// }
|
||||
// } catch (Exception e) {
|
||||
// log.error("kakaoApiImageUpload_advc API Error", e);
|
||||
// return new StatusResponse(HttpStatus.BAD_REQUEST, "친구톡 이미지 등록에 실패했습니다.", LocalDateTime.now());
|
||||
// }
|
||||
}
|
||||
|
||||
|
||||
|
||||
private String saveImgFile(Map<String, MultipartFile> files) throws Exception {
|
||||
|
||||
|
||||
|
||||
String atchFileId = "";
|
||||
String isThumbFile = "";
|
||||
String imagePath = "";
|
||||
String KeyStr = "CANVASIMG_";
|
||||
|
||||
|
||||
Date now = new Date();
|
||||
SimpleDateFormat formatDate = new SimpleDateFormat("yyyyMMdd");
|
||||
String fdlDate = formatDate.format(now);
|
||||
|
||||
|
||||
imagePath = fileSaveDir+"/file/MMS/" + fdlDate;
|
||||
|
||||
|
||||
|
||||
if (!files.isEmpty()) {
|
||||
List<FileVO> result = fileUtil.parseImageFileInf(files, KeyStr, 0, atchFileId, imagePath, isThumbFile);
|
||||
atchFileId = fileMngService.insertFileInfs(result);
|
||||
}
|
||||
|
||||
|
||||
return atchFileId;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* @Method Name : kakaoApiTemplateImageUpload
|
||||
* @작성일 : 2023. 2. 16.
|
||||
@ -488,17 +677,20 @@ public class KakaoApiImageUpload {
|
||||
jsonObject.put("apiKey", mjonBizKakaoApiKey);
|
||||
jsonObject.put("imageUrl", kakaoVO.getTemplateImageUrl());
|
||||
|
||||
log.info("kakaoVO.getTemplateImageUrl() :: [{}]", kakaoVO.getTemplateImageUrl());
|
||||
|
||||
HttpClient httpClient = HttpClientBuilder.create().build();
|
||||
HttpPost httpPost = new HttpPost(sendUrl);
|
||||
httpPost.setEntity(new StringEntity(jsonObject.toString(), "UTF-8"));
|
||||
httpPost.addHeader("Content-type", "application/json");
|
||||
httpPost.addHeader("Accept", "application/json");
|
||||
httpPost.addHeader("Accept", "application/json");
|
||||
|
||||
HttpResponse response = httpClient.execute(httpPost);
|
||||
|
||||
String result = "";
|
||||
String statusCode = Integer.toString(response.getStatusLine().getStatusCode());
|
||||
|
||||
log.info(" + statusCode :: [{}]", statusCode);
|
||||
if(statusCode.equals("200")) {
|
||||
|
||||
result = EntityUtils.toString(response.getEntity());
|
||||
@ -528,5 +720,7 @@ public class KakaoApiImageUpload {
|
||||
|
||||
return kakaoReturnVO;
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
@ -10,12 +10,18 @@ import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
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;
|
||||
|
||||
import com.fasterxml.jackson.core.JsonProcessingException;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import com.fasterxml.jackson.databind.node.ArrayNode;
|
||||
import com.fasterxml.jackson.databind.node.ObjectNode;
|
||||
|
||||
import itn.com.cmm.util.StringUtil;
|
||||
import itn.let.kakao.kakaoComm.KakaoButtonVO;
|
||||
import itn.let.kakao.kakaoComm.KakaoReturnVO;
|
||||
@ -208,6 +214,139 @@ public class KakaoApiJsonSave {
|
||||
return jsonFileName;
|
||||
}
|
||||
|
||||
/*
|
||||
* 친구톡 발송시 이미지, 버튼 추가에 따른 Json 파일 생성
|
||||
* 2025.04.18
|
||||
* 우영두
|
||||
* 파일은 하나만 생성해서 동일하게 사용함.
|
||||
*
|
||||
* */
|
||||
public String kakaoApiFTJsonSave_advc(KakaoVO kakaoVO) throws JsonProcessingException {
|
||||
// json파일 저장
|
||||
|
||||
|
||||
ObjectMapper mapper = new ObjectMapper();
|
||||
ObjectNode jo = mapper.createObjectNode();
|
||||
|
||||
|
||||
|
||||
// 버튼
|
||||
if (kakaoVO.getButtonVOList() != null && !kakaoVO.getButtonVOList().isEmpty()) {
|
||||
ArrayNode buttonList = mapper.createArrayNode();
|
||||
|
||||
for (KakaoButtonVO buttonInfoVO : kakaoVO.getButtonVOList()) {
|
||||
ObjectNode button = mapper.createObjectNode();
|
||||
button.put("name", buttonInfoVO.getName());
|
||||
button.put("type", buttonInfoVO.getLinkType());
|
||||
|
||||
switch (buttonInfoVO.getLinkType()) {
|
||||
case "WL":
|
||||
button.put("url_mobile", buttonInfoVO.getLinkMo());
|
||||
button.put("url_pc", buttonInfoVO.getLinkPc());
|
||||
break;
|
||||
case "AL":
|
||||
button.put("scheme_ios", buttonInfoVO.getLinkIos());
|
||||
button.put("scheme_android", buttonInfoVO.getLinkAnd());
|
||||
break;
|
||||
case "BC":
|
||||
// 상담톡
|
||||
break;
|
||||
case "BT":
|
||||
// 봇 전환
|
||||
break;
|
||||
}
|
||||
buttonList.add(button);
|
||||
}
|
||||
jo.set("button", buttonList);
|
||||
}
|
||||
|
||||
|
||||
// 이미지
|
||||
String imageType = kakaoVO.getImageType();
|
||||
if (StringUtils.isNotEmpty(imageType)) {
|
||||
ObjectNode image = mapper.createObjectNode();
|
||||
image.put("img_url", kakaoVO.getTemplateImageUrl());
|
||||
image.put("img_link", StringUtils.isNotEmpty(kakaoVO.getImgLink()) ? kakaoVO.getImgLink() : kakaoVO.getTemplateImageUrl());
|
||||
jo.set("image", image);
|
||||
|
||||
// wide 여부
|
||||
if ("W".equals(imageType)) {
|
||||
ObjectNode extra = mapper.createObjectNode();
|
||||
extra.put("wide", "Y");
|
||||
jo.set("extra", extra);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
// 문자열로 변환 (이스케이프 없음)
|
||||
return mapper.writeValueAsString(jo);
|
||||
|
||||
|
||||
|
||||
/*
|
||||
|
||||
|
||||
// 버튼리스트 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(StringUtils.isNotEmpty(imageType)) {
|
||||
templateImageInfo.put("img_url", kakaoVO.getTemplateImageUrl());
|
||||
templateImageInfo.put("img_link", StringUtils.isNotEmpty(kakaoVO.getImgLink()) ? kakaoVO.getImgLink() : kakaoVO.getTemplateImageUrl() );
|
||||
}
|
||||
|
||||
// wide 여부
|
||||
if ("W".equals(imageType)) {
|
||||
ObjectNode extra = mapper.createObjectNode();
|
||||
extra.put("wide", "Y");
|
||||
jo.set("extra", extra);
|
||||
}
|
||||
|
||||
|
||||
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();
|
||||
|
||||
return jsonStr;*/
|
||||
}
|
||||
|
||||
/*
|
||||
* 친구톡 발송시 이미지, 버튼 추가에 따른 Json 파일 생성
|
||||
* 2024.01.17
|
||||
@ -298,7 +437,7 @@ public class KakaoApiJsonSave {
|
||||
// 입력 json 데이터를 파일로 변경
|
||||
String jsonStr = jo.toString();
|
||||
System.out.println("jsonFileName : "+jsonFileName);
|
||||
|
||||
|
||||
File outPut = new File(jsonFileName);
|
||||
outPut.createNewFile();
|
||||
|
||||
|
||||
@ -230,7 +230,8 @@ public class KakaoApiProfile {
|
||||
if(code.equals("200")) {
|
||||
|
||||
JSONObject templateProfile = (JSONObject) object.get("data");
|
||||
|
||||
System.out.println("templateProfile = " + templateProfile.toJSONString());
|
||||
|
||||
String senderKey = getStringValue(templateProfile, "senderKey"); //발신프로필키
|
||||
String uuid = getStringValue(templateProfile, "uuid"); //카카오톡 채널
|
||||
String name = getStringValue(templateProfile, "name"); //카카오톡 채널 발신프로필 명
|
||||
|
||||
@ -30,115 +30,6 @@ public class KakaoFTJsonSave {
|
||||
|
||||
static String json;
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public String kakaoApiJsonSave(KakaoVO kakaoVO, String[] varValInfo) {
|
||||
// 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.getDestPhone()+".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 : templateDetail.getButtonList()) {
|
||||
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);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
// Image JSON 생성
|
||||
JSONObject imageJson = new JSONObject();
|
||||
// img형과 wide 형인경우만 등록 (if문으로 제어)
|
||||
imageJson.put("img_url", "등록된 이미지 URL");
|
||||
imageJson.put("img_link", "이동 페이지 URL");
|
||||
|
||||
|
||||
// Wide JSON 생성
|
||||
JSONObject wideJson = new JSONObject();
|
||||
// wide 형인경우만 등록(if문으로 제어)
|
||||
wideJson.put("wide", "Y");
|
||||
|
||||
|
||||
|
||||
|
||||
JSONObject jo = new JSONObject();
|
||||
|
||||
if(imageJson.size() != 0) {
|
||||
jo.put("image", imageJson);
|
||||
}
|
||||
if(wideJson.size() != 0) {
|
||||
jo.put("extra", wideJson);
|
||||
}
|
||||
|
||||
if(buttonList.size() != 0) {
|
||||
jo.put("button", buttonList);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
// 입력 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), "euc-kr"));
|
||||
bw.write(jsonStr);
|
||||
bw.close();
|
||||
|
||||
} catch (IOException e) {
|
||||
System.out.println("json 생성 실패");
|
||||
e.printStackTrace();
|
||||
}
|
||||
return jsonFileName;
|
||||
}
|
||||
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public String kakaoApiJsonSave(KakaoVO kakaoVO) {
|
||||
|
||||
@ -23,12 +23,10 @@ public interface KakaoAlimTalkService {
|
||||
//카카오 친구톡 발신
|
||||
public MjonMsgReturnVO insertKakaoFtSendAjax(KakaoVO kakaoVO) throws Exception;
|
||||
|
||||
//카카오 알림톡 전송 실패 환불리스트 조회
|
||||
public void selectKakaoAtSentRefundList() throws Exception;
|
||||
|
||||
//카카오 친구톡 전송 실패 환불리스트 조회
|
||||
public void selectKakaoFtSentRefundList() throws Exception;
|
||||
|
||||
StatusResponse insertKakaoAtSandAjax_advc(KakaoVO kakaoVO, HttpServletRequest request) throws Exception;
|
||||
|
||||
//카카오(알림톡, 친구톡 통합) 전송 실패 환불리스트 조회
|
||||
public List<KakaoVO> selectKakaoSentRefundListForSingle() throws Exception;
|
||||
|
||||
public void kakaoSingleRefund(KakaoVO kakaoVO) throws Exception;
|
||||
}
|
||||
|
||||
@ -49,13 +49,8 @@ public class KakaoAlimTalkDAO extends EgovAbstractDAO {
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public List<KakaoVO> selectKakaoAtSentRefundList() throws Exception{
|
||||
return (List<KakaoVO>) list("kakaoAlimTalkDAO.selectKakaoAtSentRefundList");
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public List<KakaoVO> selectKakaoFtSentRefundList() throws Exception{
|
||||
return (List<KakaoVO>) list("kakaoAlimTalkDAO.selectKakaoFtSentRefundList");
|
||||
public List<KakaoVO> selectKakaoSentRefundList() throws Exception{
|
||||
return (List<KakaoVO>) list("kakaoAlimTalkDAO.selectKakaoSentRefundList");
|
||||
}
|
||||
|
||||
public KakaoVO selectKakaoAtUmid(KakaoVO kakaoVO) throws Exception{
|
||||
@ -108,4 +103,9 @@ public class KakaoAlimTalkDAO extends EgovAbstractDAO {
|
||||
public void insertKakaoGroupDataTb_advc(KakaoSendAdvcVO sendVO) {
|
||||
insert("kakaoAlimTalkDAO.insertKakaoGroupDataTb_advc", sendVO);
|
||||
}
|
||||
|
||||
public KakaoVO selectBizLog(String bizUmid) {
|
||||
return (KakaoVO) select("kakaoAlimTalkDAO.selectBizLog", bizUmid);
|
||||
// return (KakaoVO) select("kakaoAlimTalkDAO.selectKakaoAtUmid", bizUmid);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,7 +1,6 @@
|
||||
package itn.let.kakao.user.kakaoAt.service.impl;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.math.RoundingMode;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.time.Duration;
|
||||
import java.time.Instant;
|
||||
@ -11,8 +10,6 @@ import java.util.Date;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
@ -22,13 +19,15 @@ import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Propagation;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import egovframework.rte.fdl.cmmn.EgovAbstractServiceImpl;
|
||||
import egovframework.rte.fdl.idgnr.EgovIdGnrService;
|
||||
import egovframework.rte.fdl.security.userdetails.util.EgovUserDetailsHelper;
|
||||
import itn.com.cmm.LoginVO;
|
||||
import itn.com.cmm.MjonMsgSendVO;
|
||||
import itn.com.utl.fcc.service.EgovStringUtil;
|
||||
import itn.let.kakao.kakaoComm.BizKakaoPriceVO;
|
||||
import itn.let.kakao.kakaoComm.KakaoSendAdvcVO;
|
||||
import itn.let.kakao.kakaoComm.KakaoSendUtil;
|
||||
import itn.let.kakao.kakaoComm.KakaoVO;
|
||||
@ -45,11 +44,11 @@ import itn.let.mjo.msgholiday.service.MsgHolidayVO;
|
||||
import itn.let.mjo.msgholiday.service.impl.MsgHolidayDAO;
|
||||
import itn.let.mjo.pay.service.MjonPayService;
|
||||
import itn.let.mjo.pay.service.MjonPayVO;
|
||||
import itn.let.mjo.pay.service.impl.MjonPayDAO;
|
||||
import itn.let.module.base.PriceAndPoint;
|
||||
import itn.let.sym.site.service.JoinSettingVO;
|
||||
import itn.let.sym.site.service.impl.SiteManagerDAO;
|
||||
import itn.let.uss.umt.service.EgovUserManageService;
|
||||
import itn.let.uss.umt.service.UserManageVO;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
@Slf4j
|
||||
@ -86,6 +85,9 @@ public class KakaoAlimTalkServiceImpl extends EgovAbstractServiceImpl implements
|
||||
/** userManageService */
|
||||
@Resource(name = "userManageService")
|
||||
private EgovUserManageService userManageService;
|
||||
|
||||
@Autowired
|
||||
private MjonPayDAO mjonPayDAO;
|
||||
|
||||
@Autowired
|
||||
KakaoSendUtil kakaoSendUtil;
|
||||
@ -95,6 +97,13 @@ public class KakaoAlimTalkServiceImpl extends EgovAbstractServiceImpl implements
|
||||
|
||||
@Autowired
|
||||
private PriceAndPoint priceAndPoint;
|
||||
|
||||
final String KAKAO_SUCCESS_CODE = "7000";
|
||||
final String RESEND_YN_YES = "Y";
|
||||
final String SMS_SUCCESS_CODE = "4100"; // SMS 성공 코드
|
||||
final String MMS_SUCCESS_CODE = "6600"; // MMS 성공 코드
|
||||
final String AT_MSG_TYPE = "8"; // MSG 타입 알림톡
|
||||
final String FT_MSG_TYPE = "9"; // MSG 타입 친구톡
|
||||
|
||||
//발신프로필 상태값 변경(삭제/복구 기능)
|
||||
@Override
|
||||
@ -783,80 +792,76 @@ public class KakaoAlimTalkServiceImpl extends EgovAbstractServiceImpl implements
|
||||
return returnVO;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 카카오 알림톡 발송 실패에 따른 금액 환불 처리
|
||||
*
|
||||
* */
|
||||
@Override
|
||||
public void selectKakaoAtSentRefundList() throws Exception {
|
||||
private void processKakaoSendCharge(KakaoVO kakaoVO) throws Exception {
|
||||
|
||||
/**
|
||||
* 1. 카카오 AT 전송성공 확인
|
||||
* 2. 카카오 AT 전송실패, 대채문자 전송확인
|
||||
* 3. 카카오 AT 전송 실패 확인
|
||||
*/
|
||||
List<KakaoVO> kakaoAtSentRefundList = kakaoAlimTalkDAO.selectKakaoAtSentRefundList();
|
||||
|
||||
for(KakaoVO vo : kakaoAtSentRefundList) {
|
||||
System.out.println(vo.getMsgGroupId() +"________결과 : " +vo.getRsltCode() +" 대체문자 전송 : "+vo.getSubMsgSendYn());
|
||||
if(vo.getRsltCode().equals("7000")) {
|
||||
kakaoAlimTalkDAO.updateKakaoAtSend(vo);
|
||||
}else if(vo.getSubMsgSendYn().equals("Y")) {
|
||||
KakaoVO info = kakaoAlimTalkDAO.selectKakaoAtUmid(vo);
|
||||
|
||||
System.out.println("대체문자 전송 : " + info.getBizUmid());
|
||||
if (info.getBizUmid() != null) {
|
||||
kakaoAlimTalkDAO.updateKakaoAtSubMsgSend(vo);
|
||||
}else {
|
||||
kakaoAlimTalkDAO.updateKakaoAtNotSend(vo);
|
||||
}
|
||||
|
||||
//1-1.카카오톡 발송 성공 + 대체문자 신청 O : 대체문자 금액 환불
|
||||
if(RESEND_YN_YES.equals(kakaoVO.getSubMsgSendYn())) {
|
||||
|
||||
BizKakaoPriceVO bizKakaoPriceVO = mjonPayDAO.selectBizKakaoPrice(kakaoVO.getMsgGroupId());
|
||||
|
||||
BigDecimal sendPrice = null;
|
||||
|
||||
if(AT_MSG_TYPE.equals(kakaoVO.getMsgType())){
|
||||
sendPrice = new BigDecimal(bizKakaoPriceVO.getBizKakaoAtPrice());
|
||||
}else {
|
||||
kakaoAlimTalkDAO.updateKakaoAtNotSend(vo);
|
||||
if(StringUtils.isEmpty(kakaoVO.getBizKakaoImageType())){
|
||||
sendPrice = new BigDecimal(bizKakaoPriceVO.getBizKakaoFtPrice());
|
||||
}else if("I".equals(kakaoVO.getBizKakaoImageType())){
|
||||
sendPrice = new BigDecimal(bizKakaoPriceVO.getBizKakaoFtImgPrice());
|
||||
}else if("W".equals(kakaoVO.getBizKakaoImageType())){
|
||||
sendPrice = new BigDecimal(bizKakaoPriceVO.getBizKakaoFtWideImgPrice());
|
||||
}
|
||||
}
|
||||
// 예시: 각 건당 가격이 이미 String 형태라면 변환
|
||||
BigDecimal eachPrice = new BigDecimal(kakaoVO.getEachPrice());
|
||||
|
||||
// 차이 계산
|
||||
BigDecimal diffPrice = eachPrice.subtract(sendPrice);
|
||||
|
||||
//대체문자 비용(eachPrace - sendPrice)
|
||||
if (diffPrice.compareTo(BigDecimal.ZERO) > 0) {
|
||||
String result = diffPrice.toString();
|
||||
kakaoVO.setEachPrice(result);
|
||||
handleRefund(kakaoVO, "카카오 " + kakaoVO.getMsgTypeTxt() + " 발송 성공 후 대체문자 금액 환불");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//1-2.카카오톡 발송 성공 + 대체문자 신청 X : 금액 환불 X
|
||||
}
|
||||
|
||||
private void handleAlternativeMessageScenario(KakaoVO kakaoVO) throws Exception {
|
||||
KakaoVO bizLogVO = kakaoAlimTalkDAO.selectBizLog(kakaoVO.getBizUmid());
|
||||
log.info("대체문자 전송 UMID: {}", kakaoVO.getBizUmid());
|
||||
|
||||
//2-1.카카오톡 발송 실패 + 대체문자 발송 성공 : 금액 환불 X
|
||||
boolean isAlternativeMessageSuccessful = false;
|
||||
if (bizLogVO != null && StringUtils.isNotEmpty(bizLogVO.getBizLogCallStatus())) {
|
||||
if (SMS_SUCCESS_CODE.equals(bizLogVO.getBizLogCallStatus())
|
||||
|| MMS_SUCCESS_CODE.equals(bizLogVO.getBizLogCallStatus())) {
|
||||
isAlternativeMessageSuccessful = true;
|
||||
}
|
||||
log.info("bizLogVO.getBizLogCallStatus() :: [{}]", bizLogVO.getBizLogCallStatus());
|
||||
log.info("isAlternativeMessageSuccessful :: [{}]", isAlternativeMessageSuccessful);
|
||||
}
|
||||
|
||||
|
||||
//2-2.카카오톡 발송 실패 + 대체문자 발송 실패 : 전액 환불
|
||||
if (!isAlternativeMessageSuccessful) {
|
||||
handleRefund(kakaoVO, "카카오 " + kakaoVO.getMsgTypeTxt() + " 전송 실패로 인한 결제 금액 환불");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 카카오 친구톡 발송 실패에 따른 금액 환불 처리
|
||||
* 카카오 친구톡 대체문자 선택에 대해 성공시 친구톡과 문자 간 금액 차액의 환불도 처리 됨.
|
||||
* */
|
||||
@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);
|
||||
}
|
||||
}
|
||||
private void handleRefund(KakaoVO vo, String msg) throws Exception {
|
||||
// mj_cash 테이블에 환불 내역 추가 및 회원 금액 업데이트
|
||||
// eachPrice는 환불될 금액이므로 양수여야 합니다.
|
||||
priceAndPoint.insertCashAndPointNoUpdate(
|
||||
vo.getUserId(),
|
||||
Float.parseFloat(vo.getEachPrice()), // 환불 금액은 양수
|
||||
msg,
|
||||
vo.getMsgGroupId(),
|
||||
vo.getUserData()
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -913,7 +918,7 @@ public class KakaoAlimTalkServiceImpl extends EgovAbstractServiceImpl implements
|
||||
|
||||
|
||||
/** @전송금액 확인 --------------------------------------------------*/
|
||||
if (!isCashSufficient(userId, kakaoSendAdvcListVO)) {
|
||||
if (!kakaoSendUtil.isCashSufficient(userId, kakaoSendAdvcListVO)) {
|
||||
log.error("Insufficient balance for message sending.");
|
||||
return new StatusResponse(HttpStatus.BAD_REQUEST, "문자 발송에 필요한 보유 잔액이 부족 합니다.");
|
||||
}
|
||||
@ -921,7 +926,8 @@ public class KakaoAlimTalkServiceImpl extends EgovAbstractServiceImpl implements
|
||||
|
||||
|
||||
/** @json파일이 있을 떄 biz_attachments insert */
|
||||
this.insertKakaoAtDataJsonInfo_advc(kakaoSendAdvcListVO);
|
||||
kakaoSendUtil.insertKakaoAtDataJsonInfo_advc(kakaoSendAdvcListVO);
|
||||
// this.insertKakaoAtDataJsonInfo_advc(kakaoSendAdvcListVO);
|
||||
|
||||
|
||||
Map<String, List<KakaoSendAdvcVO>> priceGroupedMessages = kakaoSendAdvcListVO.stream()
|
||||
@ -941,7 +947,7 @@ public class KakaoAlimTalkServiceImpl extends EgovAbstractServiceImpl implements
|
||||
|
||||
|
||||
// 발송 데이터 삽입
|
||||
int instCnt = this.insertKakaoData_advc(groupedMsgList);
|
||||
int instCnt = kakaoSendUtil.insertKakaoData_advc(groupedMsgList);
|
||||
// int instCnt = 6;
|
||||
|
||||
if(instCnt > 0) {
|
||||
@ -951,7 +957,7 @@ public class KakaoAlimTalkServiceImpl extends EgovAbstractServiceImpl implements
|
||||
KakaoSendAdvcVO sendVO = groupedMsgList.get(0);
|
||||
|
||||
/** @groupData 테이블 insert */
|
||||
this.insertKakaoGroupDataTb_advc(instCnt, kakaoVO, sendVO);
|
||||
kakaoSendUtil.insertKakaoGroupDataTb_advc(instCnt, kakaoVO, sendVO);
|
||||
|
||||
|
||||
/** @biz_kakao_price에 insert (대체문자 환불관련 테이블)*/
|
||||
@ -1029,178 +1035,54 @@ public class KakaoAlimTalkServiceImpl extends EgovAbstractServiceImpl implements
|
||||
return statusResponse;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public List<KakaoVO> selectKakaoSentRefundListForSingle() throws Exception{
|
||||
return kakaoAlimTalkDAO.selectKakaoSentRefundList();
|
||||
}
|
||||
|
||||
|
||||
private void insertKakaoAtDataJsonInfo_advc(List<KakaoSendAdvcVO> kakaoSendAdvcListVO) {
|
||||
// TODO Auto-generated method stub
|
||||
|
||||
// 측정할 메소드 호출 전 시간 기록
|
||||
List<KakaoSendAdvcVO> jsonInfoData = new ArrayList<>(kakaoSendAdvcListVO);
|
||||
jsonInfoData.removeIf(t -> StringUtils.isBlank(t.getJsonStr()));
|
||||
log.info(" + jsonInfoData Insert :: [{}]", jsonInfoData.size());
|
||||
if(jsonInfoData.size() > 0) {
|
||||
kakaoAlimTalkDAO.insertKakaoAtDataJsonInfo_advc(jsonInfoData);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private void insertKakaoGroupDataTb_advc(int instCnt, KakaoVO kakaoVO, KakaoSendAdvcVO sendVO) throws Exception {
|
||||
// TODO Auto-generated method stub
|
||||
|
||||
// log.info(" + insertKakaoGroupDataTb_advc kakaoVO :: \n[{}]", kakaoVO.toString());;
|
||||
// log.info(" + insertKakaoGroupDataTb_advc kakaoSendAdvcVOList :: \n[{}]", sendVO.toString());
|
||||
@Override
|
||||
public void kakaoSingleRefund(KakaoVO kakaoVO) throws Exception {
|
||||
|
||||
sendVO.setMsgGroupCnt(Integer.toString(instCnt));
|
||||
sendVO.setReserveYn(kakaoVO.getReserveYn());
|
||||
sendVO.setBefCash(priceAndPoint.getBefCash(sendVO.getUserId()));
|
||||
sendVO.setBefPoint(priceAndPoint.getBefPoint(sendVO.getUserId()));
|
||||
System.out.println(kakaoVO.getMsgGroupId() +"________결과 : " +kakaoVO.getRsltCode() +" 대체문자 전송 : "+kakaoVO.getSubMsgSendYn());
|
||||
kakaoVO.setMsgTypeTxt(AT_MSG_TYPE.equals(kakaoVO.getMsgType()) ? "알림톡" : "친구톡");
|
||||
|
||||
Float eachPrice = Float.parseFloat(sendVO.getEachPrice());
|
||||
|
||||
Float totPrice = eachPrice * instCnt;
|
||||
sendVO.setTotPrice(String.format("%.1f", totPrice));
|
||||
|
||||
sendVO.setAtDelayYn(kakaoVO.getAtSmishingYn());
|
||||
sendVO.setBizKakaoResendOrgnlTxt(kakaoVO.getSubMsgTxt());
|
||||
sendVO.setBizKakaoResendType(sendVO.getSubMsgType());
|
||||
|
||||
kakaoAlimTalkDAO.insertKakaoGroupDataTb_advc(sendVO);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @methodName : insertKakaoData_advc
|
||||
* @author : 이호영
|
||||
* @date : 2025. 3. 20.
|
||||
* @description : 카카오 batch 발송 => mj_msg_data
|
||||
* @return : int
|
||||
* @param kakaoSendAdvcVOList
|
||||
* @param parentLoopCount
|
||||
* @param isJsonNotEmpty
|
||||
* @param isJsonNameAllSame
|
||||
* @return
|
||||
*
|
||||
*/
|
||||
private int insertKakaoData_advc(List<KakaoSendAdvcVO> kakaoSendAdvcVOList) {
|
||||
|
||||
|
||||
// 시작 시간 측정
|
||||
long totalStartTime = System.currentTimeMillis();
|
||||
|
||||
int totalSize = kakaoSendAdvcVOList.size(); // 총 데이터 개수
|
||||
// Batch 크기 설정 (고정값)
|
||||
// int batchSize = 10000; 465
|
||||
int batchSize = 50000; // 9분 18초
|
||||
|
||||
log.info("총 데이터 개수 :: [{}] ", totalSize);
|
||||
log.info("설정된 Batch 크기 :: [{}] ", batchSize);
|
||||
|
||||
// 총 insert 카운트
|
||||
int instCnt = 0;
|
||||
int batchCount = 0;
|
||||
|
||||
// 각 배치별 실행 시간 기록
|
||||
List<Double> batchExecutionTimes = new ArrayList<>();
|
||||
|
||||
|
||||
// 첫 번째 배치에서만 삽입했는지 추적하는 플래그
|
||||
for (int i = 0; i < totalSize; i += batchSize) {
|
||||
// Batch 시작 시간 측정
|
||||
long batchStartTime = System.currentTimeMillis();
|
||||
|
||||
// Batch 리스트 생성
|
||||
List<KakaoSendAdvcVO> batchList = kakaoSendAdvcVOList.subList(i, Math.min(i + batchSize, totalSize));
|
||||
System.out.println("Batch 시작 인덱스: " + i);
|
||||
|
||||
// mj_msg_data 테이블 insert
|
||||
int insertedCount = kakaoAlimTalkDAO.insertKakaoAtDataInfo_advc(batchList);
|
||||
if(KAKAO_SUCCESS_CODE.equals(kakaoVO.getRsltCode())) {
|
||||
//1.카카오톡 발송 성공
|
||||
processKakaoSendCharge(kakaoVO);
|
||||
|
||||
/** @kakaoSendUtil.populateSendLists
|
||||
* 하단에서
|
||||
* getJsonStr 데이터 처리 후 활용
|
||||
* */
|
||||
instCnt += insertedCount;
|
||||
|
||||
// Batch 종료 시간 측정 및 실행 시간 계산
|
||||
long batchEndTime = System.currentTimeMillis();
|
||||
double batchExecutionTimeInSeconds = (batchEndTime - batchStartTime) / 1000.0;
|
||||
|
||||
// 실행 시간 기록
|
||||
batchExecutionTimes.add(batchExecutionTimeInSeconds);
|
||||
batchCount++;
|
||||
}else if(RESEND_YN_YES.equals(kakaoVO.getSubMsgSendYn())) {//카카오톡 발송 실패, 대체문자 발송 신청 O
|
||||
//2.카카오톡 발송 실패 + 대체문자 신청 O
|
||||
handleAlternativeMessageScenario(kakaoVO);
|
||||
|
||||
}else {
|
||||
//3.카카오톡 발송 실패 + 대체문자 신청 X : 전액 환불
|
||||
handleRefund(kakaoVO, "카카오 " + kakaoVO.getMsgTypeTxt() + " 전송 실패로 인한 결제 금액 환불");
|
||||
}
|
||||
|
||||
// 종료 시간 측정
|
||||
long totalEndTime = System.currentTimeMillis();
|
||||
|
||||
// 총 실행 시간 계산 (밀리초 -> 초로 변환)
|
||||
double totalExecutionTimeInSeconds = (totalEndTime - totalStartTime) / 1000.0;
|
||||
|
||||
// 실행 시간 출력
|
||||
log.info("총 배치 실행 횟수 :: [{}] ", batchCount);
|
||||
log.info("batchSize :: [{}] ", batchSize);
|
||||
log.info("총 실행 시간 :: [{}] ", totalExecutionTimeInSeconds + "초");
|
||||
log.info("총 삽입 건수 :: [{}] ", instCnt);
|
||||
|
||||
// 각 배치별 실행 시간 출력
|
||||
for (int k = 0; k < batchExecutionTimes.size(); k++) {
|
||||
System.out.println("배치 " + (k + 1) + " 실행 시간 :: " + batchExecutionTimes.get(k) + "초");
|
||||
}
|
||||
|
||||
return instCnt;
|
||||
|
||||
//모든 유형 환불 완료 처리
|
||||
mjonMsgDAO.updateRefundY(kakaoVO);
|
||||
}
|
||||
|
||||
// 보유 금액이 충분한지 확인하는 메서드
|
||||
private boolean isCashSufficient(String userId, List<KakaoSendAdvcVO> kakaoSendAdvcListVO) throws Exception {
|
||||
|
||||
|
||||
String userMoney = priceAndPoint.getBefCash(userId);
|
||||
// 쉼표 제거
|
||||
userMoney = userMoney.replace(",", "");
|
||||
|
||||
// 사용자 보유 금액 BigDecimal 변환 (HALF_EVEN 적용)
|
||||
BigDecimal befCash = new BigDecimal(userMoney).setScale(2, RoundingMode.HALF_EVEN);
|
||||
|
||||
// 총 메시지 금액 계산 (HALF_EVEN 적용)
|
||||
BigDecimal totalEachPrice = kakaoSendAdvcListVO.stream()
|
||||
.map(msg -> new BigDecimal(String.valueOf(msg.getEachPrice()))) // 변환 오류 방지
|
||||
.reduce(BigDecimal.ZERO, BigDecimal::add)
|
||||
.setScale(2, RoundingMode.HALF_EVEN); // 일관성 유지
|
||||
|
||||
// 비교 수행
|
||||
return befCash.compareTo(totalEachPrice) >= 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
// // 보유 금액이 충분한지 확인하는 메서드
|
||||
// private boolean isCashSufficient(String userId, List<KakaoSendAdvcVO> kakaoSendAdvcListVO) throws Exception {
|
||||
//
|
||||
//
|
||||
// String userMoney = priceAndPoint.getBefCash(userId);
|
||||
// // 쉼표 제거
|
||||
// userMoney = userMoney.replace(",", "");
|
||||
//
|
||||
// // 사용자 보유 금액 BigDecimal 변환 (HALF_EVEN 적용)
|
||||
// BigDecimal befCash = new BigDecimal(userMoney).setScale(2, RoundingMode.HALF_EVEN);
|
||||
//
|
||||
// // 총 메시지 금액 계산 (HALF_EVEN 적용)
|
||||
// BigDecimal totalEachPrice = kakaoSendAdvcListVO.stream()
|
||||
// .map(msg -> new BigDecimal(String.valueOf(msg.getEachPrice()))) // 변환 오류 방지
|
||||
// .reduce(BigDecimal.ZERO, BigDecimal::add)
|
||||
// .setScale(2, RoundingMode.HALF_EVEN); // 일관성 유지
|
||||
//
|
||||
// // 비교 수행
|
||||
// return befCash.compareTo(totalEachPrice) >= 0;
|
||||
// }
|
||||
|
||||
|
||||
}
|
||||
|
||||
@ -9,9 +9,11 @@ import java.util.Arrays;
|
||||
import java.util.Calendar;
|
||||
import java.util.Date;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
@ -61,7 +63,6 @@ import itn.com.cmm.util.MJUtil;
|
||||
import itn.com.cmm.util.StringUtil;
|
||||
import itn.com.utl.fcc.service.EgovStringUtil;
|
||||
import itn.let.kakao.kakaoComm.KakaoReturnVO;
|
||||
import itn.let.kakao.kakaoComm.KakaoSendAdvcVO;
|
||||
import itn.let.kakao.kakaoComm.KakaoSendUtil;
|
||||
import itn.let.kakao.kakaoComm.KakaoVO;
|
||||
import itn.let.kakao.kakaoComm.kakaoApi.KakaoApiJsonSave;
|
||||
@ -79,6 +80,9 @@ import itn.let.mjo.msgdata.service.MjonMsgReturnVO;
|
||||
import itn.let.mjo.msgholiday.service.MsgAlarmSetVO;
|
||||
import itn.let.mjo.msgholiday.service.MsgHolidayService;
|
||||
import itn.let.mjo.msgholiday.service.MsgHolidayVO;
|
||||
import itn.let.mjo.pay.service.MjonPayService;
|
||||
import itn.let.mjo.pay.service.MjonPayVO;
|
||||
import itn.let.org.web.OrgChartManageController;
|
||||
import itn.let.sym.site.service.EgovSiteManagerService;
|
||||
import itn.let.sym.site.service.JoinSettingVO;
|
||||
import itn.let.uss.umt.service.EgovUserManageService;
|
||||
@ -102,6 +106,8 @@ import itn.let.uss.umt.service.UserManageVO;
|
||||
@Controller
|
||||
public class KakaoAlimTalkSendController {
|
||||
|
||||
private final OrgChartManageController orgChartManageController;
|
||||
|
||||
@Resource(name = "egovMjonMsgGroupIdGnrService")
|
||||
private EgovIdGnrService idgenMjonMsgGroupId;
|
||||
|
||||
@ -149,6 +155,13 @@ public class KakaoAlimTalkSendController {
|
||||
|
||||
@Autowired
|
||||
private MjonCommon mjonCommon;
|
||||
|
||||
@Resource(name = "mjonPayService")
|
||||
private MjonPayService mjonPayService;
|
||||
|
||||
KakaoAlimTalkSendController(OrgChartManageController orgChartManageController) {
|
||||
this.orgChartManageController = orgChartManageController;
|
||||
}
|
||||
|
||||
@RequestMapping(value= {"/web/mjon/alimtalk/kakaoAlimtalkMsgDataView.do"})
|
||||
public String KakaoAlimtalkMsgDataView(ModelMap model
|
||||
@ -1540,4 +1553,55 @@ public class KakaoAlimTalkSendController {
|
||||
|
||||
return "web/kakao/msgdata/at/KakaoAlimtalkMsgDataView_tmp";
|
||||
}
|
||||
|
||||
public void kakaoRefundSingleTransaction() throws Exception{
|
||||
System.out.println("=============카카오 환불 싱글 트랜잭션 수행 =============");
|
||||
|
||||
/* 회원 money 업데이트 처리 트랜잭션 분리를 위하여 impl이 아닌 현재 위치에서 반복문 실행 */
|
||||
System.out.println("=============SchedulerUtil=====runKakaoOneTime =============>");
|
||||
List<KakaoVO> kakaoRefundList = kakaoAlimTalkService.selectKakaoSentRefundListForSingle();
|
||||
Set<String> targetIdSet = new HashSet<>();
|
||||
|
||||
for(KakaoVO kakaoVO : kakaoRefundList) {
|
||||
try {
|
||||
kakaoAlimTalkService.kakaoSingleRefund(kakaoVO);
|
||||
targetIdSet.add(kakaoVO.getUserId());
|
||||
} catch (Exception e) {
|
||||
String msg = "[문자온] 환불 실패 - " + kakaoVO.getMsgId() +"("+ kakaoVO.getUserId() + ")";
|
||||
mjonCommon.sendSimpleSlackMsg(msg);;
|
||||
}
|
||||
}
|
||||
|
||||
MjonPayVO mjonPayVO = new MjonPayVO();
|
||||
for(String userId : targetIdSet) {
|
||||
try {
|
||||
mjonPayVO.setUserId(userId);
|
||||
mjonPayService.updateMemberCash(mjonPayVO); //회원정보 업데이트
|
||||
} catch(Exception e) {
|
||||
String msg = "[문자온] 환불 후 잔액 갱신 실패 - " + userId;
|
||||
mjonCommon.sendSimpleSlackMsg(msg);;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @Method Name : kakaoMsgSendRefundTestAjax
|
||||
* @작성일 : 2025. 8. 6.
|
||||
* @작성자 : 이지우
|
||||
* @Method 설명 : 카카오 친구톡 전송 환불 스케줄러 서비스 테스트
|
||||
*/
|
||||
@RequestMapping(value= {"/web/mjon/kakao/alimtalk/kakaoMsgSendRefundTestAjax.do"})
|
||||
public ModelAndView kakaoMsgSendRefundTestAjax(ModelMap model
|
||||
, HttpServletRequest request
|
||||
, @ModelAttribute("kakaoVO") KakaoVO kakaoVO) throws Exception {
|
||||
|
||||
ModelAndView modelAndView = new ModelAndView();
|
||||
modelAndView.setViewName("jsonView");
|
||||
|
||||
this.kakaoRefundSingleTransaction();
|
||||
|
||||
modelAndView.addObject("result", "success");
|
||||
return modelAndView;
|
||||
}
|
||||
}
|
||||
|
||||
@ -0,0 +1,12 @@
|
||||
package itn.let.kakao.user.kakaoFt.service;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
|
||||
import itn.let.kakao.kakaoComm.KakaoVO;
|
||||
import itn.let.mail.service.StatusResponse;
|
||||
|
||||
public interface KakaoFriendsTalkService {
|
||||
|
||||
StatusResponse insertKakaoFtSandAjax_advc(KakaoVO kakaoVO, HttpServletRequest request) throws Exception;
|
||||
|
||||
}
|
||||
@ -0,0 +1,261 @@
|
||||
package itn.let.kakao.user.kakaoFt.service.impl;
|
||||
|
||||
import java.time.Duration;
|
||||
import java.time.Instant;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import egovframework.rte.fdl.cmmn.EgovAbstractServiceImpl;
|
||||
import egovframework.rte.fdl.idgnr.EgovIdGnrService;
|
||||
import egovframework.rte.fdl.security.userdetails.util.EgovUserDetailsHelper;
|
||||
import itn.com.cmm.LoginVO;
|
||||
import itn.com.utl.fcc.service.EgovStringUtil;
|
||||
import itn.let.kakao.kakaoComm.KakaoSendAdvcVO;
|
||||
import itn.let.kakao.kakaoComm.KakaoSendUtil;
|
||||
import itn.let.kakao.kakaoComm.KakaoVO;
|
||||
import itn.let.kakao.user.kakaoAt.service.impl.KakaoAlimTalkDAO;
|
||||
import itn.let.kakao.user.kakaoFt.service.KakaoFriendsTalkService;
|
||||
import itn.let.mail.service.StatusResponse;
|
||||
import itn.let.mjo.mjocommon.MjonCommon;
|
||||
import itn.let.mjo.msg.service.MjonMsgVO;
|
||||
import itn.let.mjo.msg.service.impl.MjonMsgDAO;
|
||||
import itn.let.mjo.msgdata.service.MjonMsgDataService;
|
||||
import itn.let.module.base.PriceAndPoint;
|
||||
import itn.let.uss.umt.service.EgovUserManageService;
|
||||
import itn.let.uss.umt.service.UserManageVO;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
@Slf4j
|
||||
@Service("KakaoFriendsTalkService")
|
||||
public class KakaoFriendsTalkServiceImpl extends EgovAbstractServiceImpl implements KakaoFriendsTalkService{
|
||||
|
||||
@Resource(name = "egovFriendstalkTemplateIdService")
|
||||
private EgovIdGnrService idgenFriendTalkTmpId;
|
||||
|
||||
@Resource(name="kakaoFriendsTalkTemplateDAO")
|
||||
private KakaoFriendsTalkTemplateDAO kakaoFriendsTalkTemplateDAO;
|
||||
|
||||
@Resource(name="mjonMsgDAO")
|
||||
private MjonMsgDAO mjonMsgDAO;
|
||||
|
||||
/** userManageService */
|
||||
@Resource(name = "userManageService")
|
||||
private EgovUserManageService userManageService;
|
||||
|
||||
@Resource(name = "egovMjonMsgGroupIdGnrService")
|
||||
private EgovIdGnrService idgenMjonMsgGroupId;
|
||||
|
||||
|
||||
@Resource(name="kakaoAlimTalkDAO")
|
||||
private KakaoAlimTalkDAO kakaoAlimTalkDAO;
|
||||
|
||||
@Resource(name = "MjonMsgDataService")
|
||||
private MjonMsgDataService mjonMsgDataService;
|
||||
|
||||
@Autowired
|
||||
KakaoSendUtil kakaoSendUtil;
|
||||
|
||||
@Autowired
|
||||
private MjonCommon mjonCommon;
|
||||
|
||||
@Autowired
|
||||
private PriceAndPoint priceAndPoint;
|
||||
|
||||
@Override
|
||||
public StatusResponse insertKakaoFtSandAjax_advc(KakaoVO kakaoVO, HttpServletRequest request) throws Exception {
|
||||
StatusResponse statusResponse = new StatusResponse();
|
||||
|
||||
// log.info(" + kakaoVO.toString() :: [{}]", kakaoVO.toString());
|
||||
|
||||
// log.info(" + kakaoVO.toString() :: [{}]", kakaoVO.ftToString());
|
||||
|
||||
|
||||
|
||||
// 측정할 메소드 호출 전 시간 기록
|
||||
Instant start = Instant.now();
|
||||
// KakaoSendAdvcVO
|
||||
|
||||
Map<String, Object> returnMap = new HashMap<>();
|
||||
|
||||
LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()
|
||||
? (LoginVO) EgovUserDetailsHelper.getAuthenticatedUser()
|
||||
: null;
|
||||
String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
|
||||
|
||||
if (userId.equals("")) {
|
||||
return new StatusResponse(HttpStatus.BAD_REQUEST, "로그인 후 이용이 가능합니다.");
|
||||
}
|
||||
|
||||
kakaoVO.setUserId(userId);
|
||||
|
||||
/**
|
||||
* 회원 정지된 상태이면 문자 발송이 안되도록 처리함 현재 로그인 세션도 만료 처리함
|
||||
*/
|
||||
boolean mberSttus = userManageService.selectUserStatusInfo(userId);
|
||||
if (!mberSttus) {
|
||||
request.getSession().invalidate();
|
||||
// UNAUTHORIZED : 인증되지 않은 사용자가 접근하려고 할 때
|
||||
return new StatusResponse(HttpStatus.UNAUTHORIZED,
|
||||
"현재 고객님께서는 문자온 서비스 이용이 정지된 상태로 친구톡을 발송하실 수 없습니다. 이용정지 해제를 원하시면 고객센터로 연락주시기 바랍니다.");
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 친구톡은 발송 시간 제약이 있음
|
||||
*/
|
||||
if(kakaoSendUtil.isRestrictedFriendTalkTime(kakaoSendUtil.resolveBaseDate(kakaoVO))) {
|
||||
// UNAUTHORIZED : 인증되지 않은 사용자가 접근하려고 할 때
|
||||
return new StatusResponse(HttpStatus.BAD_REQUEST,
|
||||
"친구톡은 20시 50분부터 익일 08시까지 발송이 제한됩니다.");
|
||||
}
|
||||
|
||||
|
||||
/** @isHolidayNotified
|
||||
* @false : 알림 X
|
||||
* @true : 알림 O */
|
||||
boolean isHolidayNotified = mjonCommon.processUserAndCheckFT(kakaoVO);
|
||||
|
||||
|
||||
UserManageVO userManageVO = mjonCommon.getUserManageInfo(userId);
|
||||
|
||||
|
||||
// 스팸관련 키워드 select
|
||||
List<String> resultSpamTxt = mjonMsgDataService.selectSpamKeywordList();
|
||||
|
||||
/** @카카오톡 전송 list 셋팅 -------------------------------------------*/
|
||||
List<KakaoSendAdvcVO> kakaoSendAdvcListVO = kakaoSendUtil.populateSendListsFT(kakaoVO, isHolidayNotified, statusResponse, userManageVO, resultSpamTxt);
|
||||
if (statusResponse.getStatus() != null && !statusResponse.getStatus().equals(HttpStatus.OK)) {
|
||||
log.error(" + populateSendLists 처리 중 오류 발생: {}", statusResponse.getMessage());
|
||||
return statusResponse;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/** @전송금액 확인 --------------------------------------------------*/
|
||||
if (!kakaoSendUtil.isCashSufficient(userId, kakaoSendAdvcListVO)) {
|
||||
log.error("Insufficient balance for message sending.");
|
||||
return new StatusResponse(HttpStatus.BAD_REQUEST, "문자 발송에 필요한 보유 잔액이 부족 합니다.");
|
||||
}
|
||||
|
||||
|
||||
/** @json파일이 있을 떄 biz_attachments insert */
|
||||
kakaoSendUtil.insertKakaoAtDataJsonInfo_advc(kakaoSendAdvcListVO);
|
||||
|
||||
|
||||
|
||||
Map<String, List<KakaoSendAdvcVO>> priceGroupedMessages = kakaoSendAdvcListVO.stream()
|
||||
.collect(Collectors.groupingBy(KakaoSendAdvcVO::getEachPrice));
|
||||
// instTotalCnt : 화면에서 보여줄 총 발송건수
|
||||
int instTotalCnt = 0;
|
||||
|
||||
|
||||
// 임시
|
||||
List<String> nextMsgGroupIdA = new ArrayList<>();
|
||||
// 대안: entrySet() 직접 사용
|
||||
for (Map.Entry<String, List<KakaoSendAdvcVO>> entry : priceGroupedMessages.entrySet()) {
|
||||
// entry 사용
|
||||
|
||||
List<KakaoSendAdvcVO> groupedMsgList = entry.getValue(); // 해당 가격의 메시지 리스트
|
||||
|
||||
String nextMsgGroupId = idgenMjonMsgGroupId.getNextStringId();
|
||||
groupedMsgList.forEach(t -> t.setMsgGroupId(nextMsgGroupId));
|
||||
|
||||
|
||||
// 발송 데이터 삽입
|
||||
int instCnt = kakaoSendUtil.insertKakaoData_advc(groupedMsgList);
|
||||
// int instCnt = 6;
|
||||
|
||||
if(instCnt > 0) {
|
||||
|
||||
instTotalCnt += instCnt;
|
||||
|
||||
KakaoSendAdvcVO sendVO = groupedMsgList.get(0);
|
||||
|
||||
/** @groupData 테이블 insert */
|
||||
kakaoSendUtil.insertKakaoGroupDataTb_advc(instCnt, kakaoVO, sendVO);
|
||||
|
||||
|
||||
|
||||
/** @biz_kakao_price에 insert (대체문자 환불관련 테이블)*/
|
||||
priceAndPoint.insertBizFtKakaoPrice(kakaoVO.getUserId(), sendVO.getMsgGroupId());
|
||||
|
||||
|
||||
priceAndPoint.insertCashAndPoint(kakaoVO.getUserId()
|
||||
, -Float.parseFloat(sendVO.getTotPrice())
|
||||
, "카카오 친구톡 총 "+groupedMsgList.size()+"건 중 " + instCnt + "건 발송"
|
||||
, nextMsgGroupId
|
||||
);
|
||||
|
||||
|
||||
/** @SLACK발송 */
|
||||
/** @발송조건이되면 발송 */
|
||||
if(isHolidayNotified
|
||||
&& ("Y".equals(userManageVO.getAtSmishingYn()) || "Y".equals(kakaoVO.getAtDelayYn()))
|
||||
) {
|
||||
mjonCommon.getAdminKakaoAtSendSlack(sendVO);
|
||||
}else if("Y".equals(kakaoVO.getAtSmishingYn())){
|
||||
/** @발송조건이 안되면 DB INSERT */
|
||||
mjonMsgDAO.insertSpamPassMsgData(MjonMsgVO.builder()
|
||||
.msgGroupId(nextMsgGroupId)
|
||||
.userId(kakaoVO.getUserId())
|
||||
.reqDate(kakaoVO.getReqDate())
|
||||
.smsTxt(groupedMsgList.get(0).getTemplateContent())
|
||||
.totalCallCnt(instCnt)
|
||||
.callFrom(kakaoVO.getCallFrom())
|
||||
.msgType("8")
|
||||
.reserveYn(kakaoVO.getReserveYn())
|
||||
.build()
|
||||
);
|
||||
}
|
||||
|
||||
nextMsgGroupIdA.add(nextMsgGroupId);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
returnMap.put("resultSts", instTotalCnt);
|
||||
returnMap.put("reserYn", kakaoVO.getReserveYn());
|
||||
returnMap.put("groupIds", nextMsgGroupIdA);
|
||||
|
||||
|
||||
// 측정할 메소드 호출 후 시간 기록
|
||||
Instant end = Instant.now();
|
||||
|
||||
log.info(" + start :: [{}]", start);
|
||||
// 실행 시간 계산 (나노초, 밀리초, 초)
|
||||
long seconds = Duration.between(start, end).getSeconds();
|
||||
log.info("메소드 실행 시간 (초): {} s", seconds);
|
||||
double minutes = seconds / 60.0; // 소수점 포함을 위해 60.0으로 나눔
|
||||
|
||||
returnMap.put("second", seconds+" s");
|
||||
returnMap.put("minutes", minutes+" min");
|
||||
|
||||
|
||||
// System.out.println("메소드 실행 시간 (분): " + minutes + " min");
|
||||
|
||||
|
||||
|
||||
|
||||
// priceAndPoint.getBefCash(userId);
|
||||
|
||||
|
||||
|
||||
|
||||
statusResponse.setStatus(HttpStatus.OK);
|
||||
statusResponse.setObject(returnMap);
|
||||
|
||||
return statusResponse;
|
||||
}
|
||||
|
||||
}
|
||||
@ -13,9 +13,11 @@ import javax.annotation.Resource;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.stereotype.Controller;
|
||||
import org.springframework.ui.ModelMap;
|
||||
import org.springframework.web.bind.annotation.ModelAttribute;
|
||||
import org.springframework.web.bind.annotation.RequestBody;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.servlet.ModelAndView;
|
||||
|
||||
@ -29,7 +31,9 @@ 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.KakaoFriendsTalkService;
|
||||
import itn.let.kakao.user.kakaoFt.service.KakaoFriendsTalkTemplateService;
|
||||
import itn.let.mail.service.StatusResponse;
|
||||
import itn.let.mjo.mjocommon.MjonCommon;
|
||||
import itn.let.mjo.mjocommon.MjonHolidayApi;
|
||||
import itn.let.mjo.msgdata.service.MjonMsgDataService;
|
||||
@ -68,6 +72,9 @@ public class KakaoFriendsTalkSendController {
|
||||
@Resource(name = "kakaoFriendsTalkTemplateService")
|
||||
private KakaoFriendsTalkTemplateService kakaoFtTemplateService;
|
||||
|
||||
@Resource(name = "KakaoFriendsTalkService")
|
||||
private KakaoFriendsTalkService kakaoFriendsTalkService;
|
||||
|
||||
/** userManageService */
|
||||
@Resource(name = "userManageService")
|
||||
private EgovUserManageService userManageService;
|
||||
@ -113,114 +120,109 @@ public class KakaoFriendsTalkSendController {
|
||||
|
||||
model.addAttribute("loginVO", loginVO);
|
||||
|
||||
try {
|
||||
|
||||
if(!userId.equals("") && !author.equals("ROLE_ADMIN")) {
|
||||
if(!"".equals(userId) && !"ROLE_ADMIN".equals(author)) {
|
||||
|
||||
//사용자 등록 발신프로필 정보 조회해오기
|
||||
kakaoVO.setUserId(userId);
|
||||
List<KakaoVO> resultProfileList = kakaoApiService.selectKakaoProfileList(kakaoVO);
|
||||
model.addAttribute("resultProfileList", resultProfileList);
|
||||
|
||||
//사용자 등록 발신프로필 정보 조회해오기
|
||||
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);
|
||||
// 특수문자 리스트 불러오기
|
||||
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;
|
||||
boolean sendStatus = true;
|
||||
|
||||
if(hours >= 20) {
|
||||
|
||||
if(hours >= 20) {
|
||||
if(minuts >= 50) {
|
||||
|
||||
if(minuts >= 50) {
|
||||
|
||||
System.out.println("발송금지 시간" + hours + ":" + minuts);
|
||||
sendStatus = false;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if(hours < 8) {
|
||||
|
||||
System.out.println("발송금지 시간" + hours + ":" + minuts);
|
||||
System.out.println("발송금지 시간" + hours + ":" + minuts);
|
||||
sendStatus = false;
|
||||
|
||||
}
|
||||
|
||||
System.out.println("발송상태는 ::: "+sendStatus);
|
||||
model.addAttribute("sendStatus", sendStatus);
|
||||
|
||||
}
|
||||
|
||||
} catch (Exception e) {
|
||||
System.out.println(" kakaoFriendsTalkMsgDataViewDataRegist Error ::: " + e);
|
||||
if(hours < 8) {
|
||||
|
||||
System.out.println("발송금지 시간" + hours + ":" + minuts);
|
||||
sendStatus = false;
|
||||
|
||||
}
|
||||
|
||||
System.out.println("발송상태는 ::: "+sendStatus);
|
||||
model.addAttribute("sendStatus", sendStatus);
|
||||
|
||||
}
|
||||
|
||||
return "web/kakao/msgdata/ft/KakaoFriendsTalkMsgDataView";
|
||||
@ -313,7 +315,29 @@ public class KakaoFriendsTalkSendController {
|
||||
return modelAndView;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* @methodName : sendMsgData_ft_advc
|
||||
* @author : 이호영
|
||||
* @date : 2025. 4. 17.
|
||||
* @description : 친구톡 발송기능
|
||||
* @return : ResponseEntity<StatusResponse>
|
||||
* @param kakaoVO
|
||||
* @param request
|
||||
* @param model
|
||||
* @return
|
||||
* @throws Exception
|
||||
*
|
||||
*/
|
||||
@RequestMapping(value = "/web/mjon/kakao/friendstalk/kakaoFriendsTalkMsgSendAjax_advc.do")
|
||||
public ResponseEntity<StatusResponse> kakaoFriendsTalkMsgSendAjax_advc(
|
||||
@RequestBody KakaoVO kakaoVO,
|
||||
HttpServletRequest request
|
||||
) throws Exception {
|
||||
System.out.println(" :: sendMsgData_ft_advc :: ");
|
||||
return ResponseEntity.ok().body(kakaoFriendsTalkService.insertKakaoFtSandAjax_advc(kakaoVO, request)) ;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @Method Name : kakaoFriendsTalkMsgSendAjax
|
||||
@ -687,27 +711,6 @@ public class KakaoFriendsTalkSendController {
|
||||
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.
|
||||
|
||||
@ -1,5 +1,6 @@
|
||||
package itn.let.kakao.user.kakaoFt.web;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
@ -8,11 +9,16 @@ import javax.annotation.Resource;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.stereotype.Controller;
|
||||
import org.springframework.ui.Model;
|
||||
import org.springframework.ui.ModelMap;
|
||||
import org.springframework.web.bind.annotation.ModelAttribute;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.ResponseBody;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
import org.springframework.web.multipart.MultipartHttpServletRequest;
|
||||
import org.springframework.web.servlet.ModelAndView;
|
||||
@ -21,6 +27,7 @@ import egovframework.rte.fdl.security.userdetails.util.EgovUserDetailsHelper;
|
||||
import egovframework.rte.ptl.mvc.tags.ui.pagination.PaginationInfo;
|
||||
import itn.com.cmm.EgovMessageSource;
|
||||
import itn.com.cmm.LoginVO;
|
||||
import itn.com.cmm.RestResponse;
|
||||
import itn.com.cmm.service.EgovCmmUseService;
|
||||
import itn.com.utl.fcc.service.EgovStringUtil;
|
||||
import itn.let.kakao.kakaoComm.KakaoReturnVO;
|
||||
@ -32,10 +39,14 @@ import itn.let.kakao.kakaoComm.kakaoApi.KakaoApiTemplate;
|
||||
import itn.let.kakao.kakaoComm.kakaoApi.KakaoFTJsonSave;
|
||||
import itn.let.kakao.kakaoComm.kakaoApi.service.KakaoApiService;
|
||||
import itn.let.kakao.user.kakaoFt.service.KakaoFriendsTalkTemplateService;
|
||||
import itn.let.mail.service.StatusResponse;
|
||||
import itn.let.mjo.symbol.service.MjonSymbolService;
|
||||
import itn.let.mjo.symbol.service.MjonSymbolVO;
|
||||
import itn.let.uss.ion.cnt.service.CntManageVO;
|
||||
import itn.let.uss.umt.service.EgovUserManageService;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
@Slf4j
|
||||
@Controller
|
||||
public class KakaoFriendsTalkTemplateController {
|
||||
|
||||
@ -170,6 +181,63 @@ public class KakaoFriendsTalkTemplateController {
|
||||
|
||||
return modelAndView;
|
||||
}
|
||||
|
||||
|
||||
@RequestMapping(value="/web/pop/ft/kakaoTemplatePop.do")
|
||||
public String siteContentIntro(@ModelAttribute CntManageVO cntManageVO, HttpServletRequest request, Model model) throws Exception {
|
||||
|
||||
return "/web/pop/kakaoFtPop";
|
||||
}
|
||||
|
||||
@ResponseBody
|
||||
@RequestMapping(value= {"/web/mjon/kakao/template/sendKakaoFriendsTemplateImageUploadAjax_advc.do"})
|
||||
public ResponseEntity<StatusResponse> sendKakaoFriendsTemplateImageUploadAjax_advc(
|
||||
@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(StringUtils.isEmpty(userId)) { //KISA 보안취약점 조치 (2018-12-10, 이정은)
|
||||
return ResponseEntity.ok(
|
||||
new StatusResponse(HttpStatus.UNAUTHORIZED
|
||||
, "로그인을 하셔야 이용 가능합니다."
|
||||
, LocalDateTime.now()
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
|
||||
final Map<String, MultipartFile> files = multiRequest.getFileMap();
|
||||
/* if (!files.isEmpty()){
|
||||
|
||||
Map<String, String> resultMap = kakaoApiImageUpload.kakaoApiImageUpload(kakaoVO, files, 0);
|
||||
|
||||
//테스트 용
|
||||
modelAndView.addObject("code", resultMap.get("code"));
|
||||
modelAndView.addObject("msg", resultMap.get("msg"));
|
||||
modelAndView.addObject("imgUrl", resultMap.get("imgUrl"));
|
||||
}
|
||||
|
||||
modelAndView.addObject("result", "success");*/
|
||||
|
||||
return ResponseEntity.ok().body(kakaoApiImageUpload.kakaoApiImageUpload_advc(kakaoVO, files, 0));
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
// TODO: handle exception
|
||||
return ResponseEntity.ok().body(new StatusResponse(
|
||||
HttpStatus.BAD_REQUEST
|
||||
, "오류가 발생하였습니다."
|
||||
, ""
|
||||
));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
// 카카오 친구톡 템플릿 등록요청
|
||||
@ -189,9 +257,13 @@ public class KakaoFriendsTalkTemplateController {
|
||||
@ModelAttribute("kakaoVO") KakaoVO kakaoVO
|
||||
, final MultipartHttpServletRequest multiRequest
|
||||
) throws Exception {
|
||||
|
||||
|
||||
ModelAndView modelAndView = new ModelAndView();
|
||||
modelAndView.setViewName("jsonView");
|
||||
|
||||
// log.info(" + kakaoVO.getAdFlag() :: [{}]", kakaoVO.getAdFlag());
|
||||
log.info(" + ImgLink :: [{}]", kakaoVO.getImgLink());
|
||||
try {
|
||||
LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
|
||||
String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
|
||||
@ -207,16 +279,18 @@ public class KakaoFriendsTalkTemplateController {
|
||||
kakaoVO.setLastUpdusrId(userId);
|
||||
kakaoVO.setSendType("FT");
|
||||
|
||||
/*
|
||||
String imgUrl = kakaoVO.getTemplateImageUrl();
|
||||
int buttonSize = kakaoVO.getButtonVOList().size();
|
||||
|
||||
if(!imgUrl.equals("") || buttonSize > 0) {
|
||||
|
||||
|
||||
log.info(" + kakaoVO.getAdFlag() :: [{}]", kakaoVO.getAdFlag());
|
||||
//json 파일 생성 처리
|
||||
String resultJsonPath = kakaoFTJsonSave.kakaoApiJsonSave(kakaoVO);
|
||||
kakaoVO.setBizJsonName(resultJsonPath);
|
||||
|
||||
}
|
||||
}*/
|
||||
|
||||
int result = kakaoFtTemplateService.insertKakaoFriendsTemplateData(kakaoVO);
|
||||
|
||||
|
||||
@ -6,9 +6,11 @@ import java.util.List;
|
||||
import itn.let.uss.umt.service.UserDefaultVO;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
import lombok.ToString;
|
||||
|
||||
@Getter
|
||||
@Setter
|
||||
@ToString
|
||||
public class KakaoSentVO extends UserDefaultVO{
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
@ -90,7 +92,7 @@ public class KakaoSentVO extends UserDefaultVO{
|
||||
private String bizKakaoFtPrice;
|
||||
private String bizSmsPrice;
|
||||
private String bizMmsPrice;
|
||||
|
||||
|
||||
private int successCount;
|
||||
private int waitCount;
|
||||
private int failCount;
|
||||
@ -112,6 +114,7 @@ public class KakaoSentVO extends UserDefaultVO{
|
||||
|
||||
private String successPrice;
|
||||
private String kakaoResendSuccPrice;
|
||||
private String bizKakaoImageType;
|
||||
|
||||
private String divideYn;
|
||||
|
||||
@ -119,4 +122,6 @@ public class KakaoSentVO extends UserDefaultVO{
|
||||
|
||||
private String yellowId;
|
||||
|
||||
private String adFlag;
|
||||
|
||||
}
|
||||
|
||||
@ -39,7 +39,9 @@ import itn.let.kakao.user.sent.service.KakaoSentDetailVO;
|
||||
import itn.let.kakao.user.sent.service.KakaoSentService;
|
||||
import itn.let.kakao.user.sent.service.KakaoSentVO;
|
||||
import itn.let.mjo.msgsent.service.MjonMsgSentVO;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
@Slf4j
|
||||
@Service("KakaoSentService")
|
||||
public class KakaoSentServiceImpl extends EgovAbstractServiceImpl implements KakaoSentService{
|
||||
|
||||
@ -140,6 +142,9 @@ public class KakaoSentServiceImpl extends EgovAbstractServiceImpl implements Ka
|
||||
List<KakaoSentVO> resultList = new ArrayList<KakaoSentVO>();
|
||||
|
||||
resultList = kakaoSentDAO.selectAllKakaoSentList_advc(kakaoSentVO);
|
||||
|
||||
System.out.println("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
|
||||
|
||||
|
||||
//totPrice 계산 및 상태코드 set
|
||||
resultList = resultList.stream().map(t -> setPriceNCode(t)).collect(Collectors.toList());
|
||||
@ -287,15 +292,27 @@ public class KakaoSentServiceImpl extends EgovAbstractServiceImpl implements Ka
|
||||
* */
|
||||
private KakaoSentVO setPriceNCode(KakaoSentVO result) {
|
||||
|
||||
log.info("=============================== setPriceNCode ================================");
|
||||
|
||||
//성공 건수 세팅
|
||||
KakaoSentVO eachCnt = new KakaoSentVO();
|
||||
eachCnt.setMsgGroupId(result.getMsgGroupId());
|
||||
eachCnt.setBizKakaoResendYn("Y".equals(result.getBizKakaoResendYn()) ? "Y" : "N");
|
||||
eachCnt.setMsgType(result.getMsgType());
|
||||
eachCnt.setBizKakaoImageType(result.getBizKakaoImageType());
|
||||
eachCnt.setBizKakaoResendType(result.getBizKakaoResendType());
|
||||
|
||||
try {
|
||||
log.info("eachCnt.getMsgType() :: [{}]", eachCnt.getMsgType());
|
||||
log.info("eachCnt.getBizKakaoImageType() :: [{}]", eachCnt.getBizKakaoImageType());
|
||||
log.info("eachCnt.getBizKakaoResendType() :: [{}]", eachCnt.getBizKakaoResendType());
|
||||
|
||||
eachCnt = kakaoSentDAO.selectKakaoSentCntEachCnt_advc(eachCnt);
|
||||
} catch (Exception e) {
|
||||
System.out.println("setPriceNCode error!!");
|
||||
}
|
||||
log.info(" + eachCnt.toString() :: [{}]", eachCnt.toString());
|
||||
// log.info(" + eachCnt.getSuccessPrice() :: [{}]", eachCnt.getSuccessPrice());
|
||||
|
||||
result.setSuccessCount(eachCnt.getSuccessCount());
|
||||
result.setWaitCount(eachCnt.getWaitCount());
|
||||
@ -328,9 +345,9 @@ public class KakaoSentServiceImpl extends EgovAbstractServiceImpl implements Ka
|
||||
|
||||
//총금액 시작
|
||||
//=======================================================
|
||||
// TotPrice : 성공건수에 대한 금액 곱하기
|
||||
BigDecimal atPrice = new BigDecimal(successPrice);
|
||||
BigDecimal kakaoResendPrice = new BigDecimal(kakaoResendSuccPrice);
|
||||
// TotPrice : 성공건수에 대한 금액 곱하기 ? : null 처리
|
||||
BigDecimal atPrice = successPrice != null ? new BigDecimal(successPrice) : BigDecimal.ZERO;
|
||||
BigDecimal kakaoResendPrice = kakaoResendSuccPrice != null ? new BigDecimal(kakaoResendSuccPrice) : BigDecimal.ZERO;
|
||||
BigDecimal totalPrice = atPrice.add(kakaoResendPrice);
|
||||
// 소수점 한 자리로 설정 (반올림)// totalPrice 값을 소수점 한 자리까지 반올림하여 roundedTotalPrice에 저장
|
||||
// RoundingMode.HALF_UP: 반올림 방식으로, 소수점 기준 5 이상이면 올림, 그렇지 않으면 내림
|
||||
|
||||
@ -2,6 +2,7 @@ package itn.let.kakao.user.sent.web;
|
||||
|
||||
import java.io.FileReader;
|
||||
|
||||
import org.apache.commons.io.FilenameUtils;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import itn.com.cmm.util.DateUtils;
|
||||
import java.text.SimpleDateFormat;
|
||||
@ -38,6 +39,7 @@ import itn.com.cmm.LoginVO;
|
||||
import itn.com.cmm.util.StringUtil;
|
||||
import itn.com.cmm.util.StringUtil2;
|
||||
import itn.com.utl.fcc.service.EgovStringUtil;
|
||||
import itn.let.cmm.vo.FileInfoVO;
|
||||
import itn.let.kakao.admin.kakaoAt.service.MjonKakaoATVO;
|
||||
import itn.let.kakao.kakaoComm.KakaoButtonVO;
|
||||
import itn.let.kakao.kakaoComm.KakaoReturnVO;
|
||||
@ -46,13 +48,20 @@ import itn.let.kakao.kakaoComm.kakaoApi.KakaoApiTemplate;
|
||||
import itn.let.kakao.user.sent.service.KakaoSentDetailVO;
|
||||
import itn.let.kakao.user.sent.service.KakaoSentService;
|
||||
import itn.let.kakao.user.sent.service.KakaoSentVO;
|
||||
import itn.let.mjo.msgsent.service.MjonMsgSentVO;
|
||||
import itn.let.mjo.msgsent.service.impl.MjonMsgSentDAO;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
@Slf4j
|
||||
@Controller
|
||||
public class KakaoSentController {
|
||||
|
||||
@Resource(name = "KakaoSentService")
|
||||
private KakaoSentService kakaoSentService;
|
||||
|
||||
@Resource(name="MjonMsgSentDAO")
|
||||
private MjonMsgSentDAO mjonMsgSentDAO;
|
||||
|
||||
@Autowired
|
||||
KakaoApiTemplate kakaoApiTemplate;
|
||||
|
||||
@ -182,7 +191,7 @@ public class KakaoSentController {
|
||||
|
||||
//전체 발송 리스트 불러오기
|
||||
List<KakaoSentVO> resultAllSentList = kakaoSentService.selectAllKakaoSentList(kakaoSentVO);
|
||||
System.out.println("??");
|
||||
|
||||
model.addAttribute("resultAllSentList", resultAllSentList);
|
||||
// model.addAttribute("resultAllSentCnt", resultAllSentList.size());
|
||||
|
||||
@ -263,6 +272,25 @@ public class KakaoSentController {
|
||||
|
||||
model.addAttribute("kakaoTemplateInfo", kakaoTemplateInfo);
|
||||
|
||||
if(StringUtils.isNotEmpty( mjonKakaoATResultVO.getFilePath1() )) {
|
||||
List<FileInfoVO> fileInfos = new ArrayList<>();
|
||||
|
||||
|
||||
// 확장자 제외한 파일명
|
||||
String fileId = FilenameUtils.getBaseName(mjonKakaoATResultVO.getFilePath1());
|
||||
|
||||
// 파일 정보 조회
|
||||
MjonMsgSentVO info = mjonMsgSentDAO.selectFileInfo(fileId);
|
||||
|
||||
// FileInfo 객체 생성 및 추가
|
||||
FileInfoVO fileInfo = new FileInfoVO();
|
||||
fileInfo.setAtchFileId(info.getAtchFileId());
|
||||
fileInfo.setFileSn(info.getFileSn());
|
||||
|
||||
fileInfos.add(fileInfo);
|
||||
model.addAttribute("fileInfos", fileInfos);
|
||||
}
|
||||
|
||||
}else {
|
||||
|
||||
model.addAttribute("kakaoTemplateInfo", "");
|
||||
@ -890,22 +918,21 @@ public class KakaoSentController {
|
||||
KakaoReturnVO returnVO = new KakaoReturnVO();
|
||||
try {
|
||||
|
||||
String tmpContent = kakaoATVO.getSmsTxtTrans();
|
||||
String jsonFilePath = kakaoATVO.getBizKakaoJsonFile();
|
||||
String jsonContents = kakaoATVO.getContents();
|
||||
|
||||
//친구톡 이미지 또는 버튼 정보가 있다면 실행
|
||||
if(jsonFilePath != null && jsonFilePath.length() > 0) {
|
||||
if(jsonContents != null && jsonContents.length() > 0) {
|
||||
|
||||
FileReader reader = new FileReader(jsonFilePath);
|
||||
/*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);
|
||||
Object obj = parser.parse(jsonContents);
|
||||
JSONObject object = (JSONObject) obj;
|
||||
|
||||
String image = (object.get("image") == null) ? null : object.get("image").toString();
|
||||
@ -964,7 +991,7 @@ public class KakaoSentController {
|
||||
}
|
||||
|
||||
//친구톡 내용 셋팅
|
||||
returnVO.setTemplateContent(tmpContent);
|
||||
returnVO.setTemplateContent(kakaoATVO.getSmsTxt());
|
||||
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
@ -1037,42 +1064,70 @@ public class KakaoSentController {
|
||||
|
||||
|
||||
|
||||
//발송 관리 문자발송 내용 상세보기 팝업 => 문자내용(MJ_MSG_DATA)
|
||||
MjonKakaoATVO mjonKakaoATResultVO = kakaoSentService.selectKakaoSentDetailDataAjax(mjonKakaoATVO);
|
||||
// 대체문자 엔터키 치환
|
||||
mjonKakaoATResultVO.setSmsTxt(StringUtil2.replaceBR(mjonKakaoATResultVO.getSmsTxt()));
|
||||
model.addAttribute("resultMsgDetail", mjonKakaoATResultVO);
|
||||
try {
|
||||
|
||||
String msgType = mjonKakaoATResultVO.getMsgType();
|
||||
//발송 관리 문자발송 내용 상세보기 팝업 => 문자내용(MJ_MSG_DATA)
|
||||
MjonKakaoATVO mjonKakaoATResultVO = kakaoSentService.selectKakaoSentDetailDataAjax(mjonKakaoATVO);
|
||||
// 대체문자 엔터키 치환
|
||||
if(StringUtils.isNotEmpty(mjonKakaoATResultVO.getSmsTxt())) {
|
||||
mjonKakaoATResultVO.setSmsTxt(StringUtil2.replaceBR(mjonKakaoATResultVO.getSmsTxt()));
|
||||
}
|
||||
model.addAttribute("resultMsgDetail", mjonKakaoATResultVO);
|
||||
|
||||
String msgType = mjonKakaoATResultVO.getMsgType();
|
||||
|
||||
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);
|
||||
model.addAttribute("kakaoTemplateInfo", kakaoTemplateInfo);
|
||||
|
||||
if(StringUtils.isNotEmpty( mjonKakaoATResultVO.getFilePath1() )) {
|
||||
List<FileInfoVO> fileInfos = new ArrayList<>();
|
||||
|
||||
|
||||
// 확장자 제외한 파일명
|
||||
String fileId = FilenameUtils.getBaseName(mjonKakaoATResultVO.getFilePath1());
|
||||
|
||||
// 파일 정보 조회
|
||||
MjonMsgSentVO info = mjonMsgSentDAO.selectFileInfo(fileId);
|
||||
|
||||
// FileInfo 객체 생성 및 추가
|
||||
FileInfoVO fileInfo = new FileInfoVO();
|
||||
fileInfo.setAtchFileId(info.getAtchFileId());
|
||||
fileInfo.setFileSn(info.getFileSn());
|
||||
|
||||
fileInfos.add(fileInfo);
|
||||
model.addAttribute("fileInfos", fileInfos);
|
||||
}
|
||||
//kakaoTemplateInfo.setTemplateContent(smsTxt);
|
||||
|
||||
|
||||
}else {
|
||||
|
||||
model.addAttribute("kakaoTemplateInfo", "");
|
||||
|
||||
}
|
||||
model.addAttribute("msgType", msgType);
|
||||
|
||||
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", "");
|
||||
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
// TODO: handle exception
|
||||
}
|
||||
|
||||
model.addAttribute("msgType", msgType);
|
||||
return "web/kakao/sent/KakaoSentDetailPopAjax";
|
||||
return "web/kakao/sent/KakaoSentDetailPhoneAjax";
|
||||
}
|
||||
}
|
||||
|
||||
@ -188,6 +188,29 @@ public class KakaoStepInfoController {
|
||||
return "/web/kakao/intrd/KakaoAllimtalkIntro";
|
||||
}
|
||||
|
||||
/**
|
||||
* @Method Name : kakaotalkIntrdView
|
||||
* @Project : mjon
|
||||
* @Date : 2025. 8. 21
|
||||
* @작성자 : 원영현
|
||||
|
||||
* @프로그램 설명 :카카오 알림톡, 친구토 통합 소개페이지
|
||||
*/
|
||||
@RequestMapping(value= {"/web/mjon/kakao/alimtalk/kakaotalkIntrdView.do"})
|
||||
public String kakaotalkIntrdView(HttpServletRequest request,
|
||||
@ModelAttribute("searchVO") BoardMasterVO boardMasterVO, ModelMap model , BoardVO boardVO ,
|
||||
RedirectAttributes redirectAttributes) 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);
|
||||
|
||||
return "/web/kakao/intrd/KakaotalkIntro";
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* XSS 방지 처리.
|
||||
|
||||
@ -5,6 +5,7 @@ import java.time.LocalDateTime;
|
||||
import org.springframework.http.HttpStatus;
|
||||
|
||||
import itn.let.mjo.pay.service.RefundVO;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Getter;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
@ -533,12 +533,12 @@ private int parseIntOrDefault(String value, int defaultValue) {
|
||||
UserManageVO userManageVO = getUserManageInfo(kakaoVO.getUserId());
|
||||
|
||||
// 기본값 처리된 사용자 정보와 문자 상태
|
||||
String adminSmsNoticeYn = userManageVO.getAdminSmsNoticeYn();
|
||||
String atSmishingYn = userManageVO.getAtSmishingYn();
|
||||
String adminSmsNoticeYn = userManageVO.getAdminSmsNoticeYn(); // 법인폰 알람 여부 - Y : ON
|
||||
String atSmishingYn = userManageVO.getAtSmishingYn(); // 스미싱 의심 - Y : ON
|
||||
|
||||
// 조건 체크
|
||||
if ("Y".equals(adminSmsNoticeYn) || "Y".equals(atSmishingYn)) {
|
||||
kakaoVO.setAtSmishingYn("Y"); // MjonMsgVO에 스미싱 정보 설정
|
||||
kakaoVO.setAtSmishingYn("Y"); // MjonMsgVO에 스미싱 정보 설정 - Y면 디
|
||||
|
||||
// 스미싱 알림 처리
|
||||
return handleSmishingAlert(); // 알림 처리 결과 반환
|
||||
@ -546,6 +546,46 @@ private int parseIntOrDefault(String value, int defaultValue) {
|
||||
|
||||
return false; // 알림 처리되지 않음
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @methodName : processUserAndCheckFT
|
||||
* @author : 이호영
|
||||
* @date : 2025. 8. 21.
|
||||
* @description :
|
||||
* @return : boolean
|
||||
* @param kakaoVO
|
||||
* @return
|
||||
* @throws Exception
|
||||
*
|
||||
* @isHolidayNotified
|
||||
* @false : 알림 X
|
||||
* @true : 알림 O
|
||||
*
|
||||
*/
|
||||
public boolean processUserAndCheckFT(KakaoVO kakaoVO) throws Exception {
|
||||
// UserManageVO userManageVO = getUserManageInfo(kakaoVO.getUserId());
|
||||
// kakaoVO.setAtSmishingYn("N"); // MjonMsgVO에 스미싱 정보 설정 - Y면 딜레이 처리 됨
|
||||
|
||||
|
||||
// 기본값 처리된 사용자 정보와 문자 상태
|
||||
// String adminSmsNoticeYn = userManageVO.getAdminSmsNoticeYn(); // 법인폰 알람 여부 - Y : ON
|
||||
// String atSmishingYn = userManageVO.getAtSmishingYn(); // 스미싱 의심 - Y : ON !== mj_msg_group_data와 다른거임
|
||||
|
||||
// 조건 체크
|
||||
// if ("Y".equals(adminSmsNoticeYn) || "Y".equals(atSmishingYn)) {
|
||||
// if ("Y".equals(atSmishingYn)) {
|
||||
// Boolean B_return = handleSmishingAlert();
|
||||
// if(B_return) { // true면 알림ON이라서 스미싱Yn을 Y로 설정 아니면 N / 나머지는 로직에서 처리
|
||||
// kakaoVO.setAtSmishingYn(atSmishingYn); // MjonMsgVO에 스미싱 정보 설정 - Y면 딜레이 처리 됨
|
||||
// }
|
||||
// 스미싱 알림 처리
|
||||
// return B_return; // 알림 처리 결과 반환
|
||||
// }
|
||||
|
||||
return handleSmishingAlert(); // 알림 처리되지 않음
|
||||
}
|
||||
|
||||
|
||||
// 사용자 정보 조회 및 기본값 처리
|
||||
public UserManageVO getUserManageInfo(String userId) throws Exception {
|
||||
|
||||
@ -93,6 +93,7 @@ public class MjonMsgVO extends ComDefaultVO{
|
||||
private String reserveYn ; //예약문자 여부
|
||||
private String reserveCYn ; //예약문자 취소 여부
|
||||
private String cancelDate; //예약 취소 일자
|
||||
private String msgResult; //문자 발송결과 10:성공 20:실패 30:대체문자 대기 40:대체문자 성공 50:대체문자 실패
|
||||
|
||||
|
||||
private String sendRate; // 전송 배분률
|
||||
@ -165,6 +166,7 @@ public class MjonMsgVO extends ComDefaultVO{
|
||||
|
||||
private float smsPrice; // sms 단가
|
||||
private float mmsPrice; // mms 단가
|
||||
private float picturePrice; // mms 단가
|
||||
private float kakaoAtPrice; // 카카오 알림톡 단가
|
||||
private float kakaoFtPrice; // 카카오 친구톡 단가
|
||||
private float kakaoFtImgPrice;// 카카오 이미지 단가
|
||||
@ -301,6 +303,8 @@ public class MjonMsgVO extends ComDefaultVO{
|
||||
private String bizLogCallStatusCode; //다우기술 biz_log 테이블의 발송결과 코드 값 성공/실패/대기 코드값 변환(성공:S, 대기:W, 실패:F).
|
||||
private String bizLogCallStatusTxt; //다우기술 biz_log 테이블의 발송결과 내용 텍스트.
|
||||
private String bizLogStatus; //다우기술 biz_log 테이블의 전송상태값
|
||||
|
||||
private String bizKakaoImageType; // 비즈 발송 img 값
|
||||
|
||||
private String accessKey; // 'API Key',
|
||||
|
||||
@ -313,5 +317,8 @@ public class MjonMsgVO extends ComDefaultVO{
|
||||
private String detailType;
|
||||
|
||||
private List<MjonMsgSendVO> mjonMsgSendVOList = new ArrayList<>();
|
||||
|
||||
private String cmId; //다우기술 cmId
|
||||
|
||||
|
||||
}
|
||||
|
||||
@ -455,6 +455,11 @@ public class MjonMsgDAO extends EgovAbstractDAO {
|
||||
update("mjonMsgDAO.updateKakaoAtDelayCancelMsgDataFlag", mjonMsgVO);
|
||||
}
|
||||
|
||||
// mj_msg_data 테이블 지연 알림톡 취소 값 수정
|
||||
public void updateRefundY(MjonMsgVO mjonMsgVO) {
|
||||
update("mjonMsgDAO.updateRefundY", mjonMsgVO);
|
||||
}
|
||||
|
||||
// mj_msg_group_data 테이블 지연 알림톡 취소 값 수정
|
||||
public void updateKakaoAtDelayCancelMsgGroupDataFlag(MjonMsgVO mjonMsgVO) {
|
||||
update("mjonMsgDAO.updateKakaoAtDelayCancelMsgGroupDataFlag", mjonMsgVO);
|
||||
|
||||
@ -463,6 +463,23 @@ public class MjonMsgDataDAO extends EgovAbstractDAO {
|
||||
}
|
||||
|
||||
|
||||
//대체문자 대기 목록 조회
|
||||
@SuppressWarnings("unchecked")
|
||||
public List<MjonMsgVO> selectBizResendLogList()throws Exception{
|
||||
|
||||
return (List<MjonMsgVO>) list("mjonMsgDataDAO.selectBizResendLogList");
|
||||
}
|
||||
//대체문자 결과 반영
|
||||
public int updateResendResult(MjonMsgVO mjonMsgVO)throws Exception{
|
||||
|
||||
return update("mjonMsgDataDAO.updateResendResult", mjonMsgVO);
|
||||
}
|
||||
//대체문자 로그 삭제
|
||||
public int deleteBizResendLog(MjonMsgVO mjonMsgVO)throws Exception{
|
||||
|
||||
return delete("mjonMsgDataDAO.deleteBizResendLog", mjonMsgVO);
|
||||
}
|
||||
|
||||
|
||||
public Timestamp convertToTimestamp(String reqDate) {
|
||||
try {
|
||||
|
||||
@ -6543,5 +6543,4 @@ public class MjonMsgDataController {
|
||||
|
||||
return "web/msgdata/MsgSentListAjax";
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -0,0 +1,22 @@
|
||||
package itn.let.mjo.msgsent.service;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import itn.let.cmm.vo.FileInfoVO;
|
||||
import itn.let.uss.umt.service.UserDefaultVO;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
|
||||
@Getter
|
||||
@Setter
|
||||
public class MjonMsgDetailSentDTO extends UserDefaultVO{
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
|
||||
private String userId;
|
||||
private String callTo;
|
||||
private String statusTxt;
|
||||
|
||||
|
||||
}
|
||||
@ -65,7 +65,7 @@ public interface MjonMsgSentService {
|
||||
|
||||
public Map<String, Object> selectAllMsgSentDetailView(MjonMsgDetailSentVO mjonMsgDetailSentVO) throws Exception;
|
||||
|
||||
public List<MjonMsgDetailSentVO> findByMsgDetailListAjax(MjonMsgDetailSentVO mjonMsgDetailSentVO);
|
||||
public List<MjonMsgDetailSentDTO> findByMsgDetailListAjax(MjonMsgDetailSentVO mjonMsgDetailSentVO);
|
||||
|
||||
public void msgSentExcelDownLoad(MjonMsgSentVO mjonMsgSentVO, HttpServletResponse response) throws IOException, Exception;
|
||||
|
||||
|
||||
@ -9,6 +9,7 @@ import egovframework.rte.psl.dataaccess.EgovAbstractDAO;
|
||||
import itn.let.fax.addr.service.FaxAddrGroupVO;
|
||||
import itn.let.mjo.addr.service.AddrGroupVO;
|
||||
import itn.let.mjo.block.service.MjonBlockVO;
|
||||
import itn.let.mjo.msgsent.service.MjonMsgDetailSentDTO;
|
||||
import itn.let.mjo.msgsent.service.MjonMsgDetailSentVO;
|
||||
import itn.let.mjo.msgsent.service.MjonMsgSWFDTO;
|
||||
import itn.let.mjo.msgsent.service.MjonMsgSentVO;
|
||||
@ -182,9 +183,9 @@ public class MjonMsgSentDAO extends EgovAbstractDAO {
|
||||
return (MjonMsgDetailSentVO) select("MjonMsgSentDAO.selectAllMsgSentDetailView", mjonMsgDetailSentVO);
|
||||
}
|
||||
|
||||
public List<MjonMsgDetailSentVO> findByMsgDetailListAjax(MjonMsgDetailSentVO mjonMsgDetailSentVO) {
|
||||
public List<MjonMsgDetailSentDTO> findByMsgDetailListAjax(MjonMsgDetailSentVO mjonMsgDetailSentVO) {
|
||||
|
||||
return (List<MjonMsgDetailSentVO>) list("MjonMsgSentDAO.findByMsgDetailListAjax", mjonMsgDetailSentVO);
|
||||
return (List<MjonMsgDetailSentDTO>) list("MjonMsgSentDAO.findByMsgDetailListAjax", mjonMsgDetailSentVO);
|
||||
}
|
||||
|
||||
public List<String> findByReqDateWhereMsgGroupId(String msgGroupId) {
|
||||
|
||||
@ -39,6 +39,7 @@ import itn.let.cmm.vo.FileInfoVO;
|
||||
import itn.let.fax.addr.service.FaxAddrGroupVO;
|
||||
import itn.let.mjo.addr.service.AddrGroupVO;
|
||||
import itn.let.mjo.block.service.MjonBlockVO;
|
||||
import itn.let.mjo.msgsent.service.MjonMsgDetailSentDTO;
|
||||
import itn.let.mjo.msgsent.service.MjonMsgDetailSentVO;
|
||||
import itn.let.mjo.msgsent.service.MjonMsgSWFDTO;
|
||||
import itn.let.mjo.msgsent.service.MjonMsgSentService;
|
||||
@ -474,9 +475,9 @@ public class MjonMsgSentServiceImpl extends EgovAbstractServiceImpl implements
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<MjonMsgDetailSentVO> findByMsgDetailListAjax(MjonMsgDetailSentVO mjonMsgDetailSentVO) {
|
||||
public List<MjonMsgDetailSentDTO> findByMsgDetailListAjax(MjonMsgDetailSentVO mjonMsgDetailSentVO) {
|
||||
|
||||
List<MjonMsgDetailSentVO> list = mjonMsgSentDAO.findByMsgDetailListAjax(mjonMsgDetailSentVO);
|
||||
List<MjonMsgDetailSentDTO> list = mjonMsgSentDAO.findByMsgDetailListAjax(mjonMsgDetailSentVO);
|
||||
list.stream().forEach(t->{
|
||||
t.setCallTo(StringUtil2.formatPhone(t.getCallTo()));
|
||||
});
|
||||
|
||||
@ -50,6 +50,7 @@ import itn.let.mjo.addr.service.AddrService;
|
||||
import itn.let.mjo.addr.service.AddrVO;
|
||||
import itn.let.mjo.apikey.service.ApiKeyMngService;
|
||||
import itn.let.mjo.apikey.service.ApiKeyVO;
|
||||
import itn.let.mjo.msgsent.service.MjonMsgDetailSentDTO;
|
||||
import itn.let.mjo.msgsent.service.MjonMsgDetailSentVO;
|
||||
import itn.let.mjo.msgsent.service.MjonMsgSentCntVO;
|
||||
import itn.let.mjo.msgsent.service.MjonMsgSentService;
|
||||
@ -191,7 +192,17 @@ private static final Logger logger = LoggerFactory.getLogger(MjonMsgSentControll
|
||||
public ResponseEntity<StatusResponse> findByMsgDetailListAjax(MjonMsgDetailSentVO mjonMsgDetailSentVO) throws Exception {
|
||||
|
||||
|
||||
List<MjonMsgDetailSentVO> resultList = mjonMsgSentService.findByMsgDetailListAjax(mjonMsgDetailSentVO);
|
||||
List<MjonMsgDetailSentDTO> resultList = new ArrayList<>();
|
||||
try {
|
||||
|
||||
resultList = mjonMsgSentService.findByMsgDetailListAjax(mjonMsgDetailSentVO);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
// TODO: handle exception
|
||||
}
|
||||
log.info("resultList :: [{}]", resultList.size());
|
||||
// resultList = resultList.subList(0, 275000);
|
||||
// log.info("resultList :: [{}]", resultList.size());
|
||||
|
||||
|
||||
return ResponseEntity.ok().body(new StatusResponse(HttpStatus.OK, "", resultList));
|
||||
|
||||
@ -236,6 +236,8 @@ public class MjonPayVO extends ComDefaultVO{
|
||||
|
||||
private int remainPoint;
|
||||
|
||||
private String userData;
|
||||
|
||||
|
||||
private String totChgPay; // 간편결제분류
|
||||
|
||||
|
||||
@ -5,6 +5,7 @@ import java.util.List;
|
||||
import org.springframework.stereotype.Repository;
|
||||
|
||||
import egovframework.rte.psl.dataaccess.EgovAbstractDAO;
|
||||
import itn.let.kakao.kakaoComm.BizKakaoPriceVO;
|
||||
import itn.let.mjo.pay.service.MjonPayVO;
|
||||
import itn.let.mjo.pay.service.MjonVaMsgLogVO;
|
||||
import itn.let.mjo.pay.service.RefundVO;
|
||||
@ -45,6 +46,10 @@ public class MjonPayDAO extends EgovAbstractDAO {
|
||||
public MjonPayVO selectCashVO(MjonPayVO mjonPayVO) throws Exception{
|
||||
return (MjonPayVO)select("mjonPayDAO.selectCashVO", mjonPayVO);
|
||||
}
|
||||
|
||||
public BizKakaoPriceVO selectBizKakaoPrice(String msgGroupId) throws Exception{
|
||||
return (BizKakaoPriceVO)select("mjonPayDAO.selectBizKakaoPrice", msgGroupId);
|
||||
}
|
||||
|
||||
public void insertCash(MjonPayVO mjonPayVO) throws Exception{
|
||||
|
||||
|
||||
@ -4645,10 +4645,11 @@ public class MjonPayController {
|
||||
model.addAttribute("endDate", endDate);
|
||||
|
||||
DecimalFormat decFormat = new DecimalFormat("###,###");
|
||||
DecimalFormat decFormatFloat = new DecimalFormat("###,###.#");
|
||||
model.addAttribute("sendSumCount", decFormat.format(sendSumCount));
|
||||
model.addAttribute("supplySumPrice", decFormat.format(supplySumPrice));
|
||||
model.addAttribute("vatSumPrice", decFormat.format(vatSumPrice));
|
||||
model.addAttribute("totalSumPrice", decFormat.format(totalSumPrice));
|
||||
model.addAttribute("totalSumPrice", decFormatFloat.format(totalSumPrice));
|
||||
model.addAttribute("resultList", payUserSumList);
|
||||
|
||||
// 수신자 정보
|
||||
|
||||
@ -5,18 +5,27 @@ import java.math.RoundingMode;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import egovframework.rte.fdl.cmmn.exception.FdlException;
|
||||
import egovframework.rte.fdl.idgnr.EgovIdGnrService;
|
||||
import itn.let.kakao.kakaoComm.KakaoSendAdvcVO;
|
||||
import itn.let.kakao.kakaoComm.KakaoSendUtil;
|
||||
import itn.let.kakao.kakaoComm.KakaoVO;
|
||||
import itn.let.kakao.user.kakaoAt.service.impl.KakaoAlimTalkDAO;
|
||||
import itn.let.mjo.event.service.MjonEventService;
|
||||
import itn.let.mjo.event.service.MjonEventVO;
|
||||
import itn.let.mjo.event.service.impl.MjonEventDAO;
|
||||
import itn.let.mjo.msg.service.MjonMsgVO;
|
||||
import itn.let.mjo.msgdata.service.MjonMsgDataService;
|
||||
import itn.let.mjo.msgdata.service.impl.MjonMsgDataDAO;
|
||||
import itn.let.mjo.pay.service.MjonPayVO;
|
||||
import itn.let.mjo.pay.service.impl.MjonPayDAO;
|
||||
import itn.let.sym.site.service.JoinSettingVO;
|
||||
import itn.let.uss.umt.service.MberManageVO;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
/**
|
||||
*
|
||||
@ -32,6 +41,7 @@ import itn.let.uss.umt.service.MberManageVO;
|
||||
*
|
||||
*
|
||||
*/
|
||||
@Slf4j
|
||||
@Component
|
||||
public class PriceAndPoint {
|
||||
|
||||
@ -46,6 +56,11 @@ public class PriceAndPoint {
|
||||
|
||||
@Resource(name = "egovMjonCashIdGnrService")
|
||||
private EgovIdGnrService idgenMjonCashId;
|
||||
|
||||
@Resource(name="kakaoAlimTalkDAO")
|
||||
private KakaoAlimTalkDAO kakaoAlimTalkDAO;
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* @methodName : getBefCash
|
||||
@ -114,19 +129,120 @@ public class PriceAndPoint {
|
||||
, String msgGroupId
|
||||
) throws Exception {
|
||||
|
||||
MjonPayVO mjonPayVO = new MjonPayVO();
|
||||
mjonPayVO.setCashId(idgenMjonCashId.getNextStringId());
|
||||
mjonPayVO.setUserId(userId);
|
||||
System.out.println(" + totPrice :: "+ totPrice);
|
||||
mjonPayVO.setCash(totPrice);
|
||||
mjonPayVO.setFrstRegisterId(userId);
|
||||
mjonPayVO.setMemo(memo);
|
||||
mjonPayVO.setMsgGroupId(msgGroupId);
|
||||
// MjonPayVO mjonPayVO = new MjonPayVO();
|
||||
// mjonPayVO.setCashId(idgenMjonCashId.getNextStringId());
|
||||
// mjonPayVO.setUserId(userId);
|
||||
// System.out.println(" + totPrice :: "+ totPrice);
|
||||
// mjonPayVO.setCash(totPrice);
|
||||
// mjonPayVO.setFrstRegisterId(userId);
|
||||
// mjonPayVO.setMemo(memo);
|
||||
// mjonPayVO.setMsgGroupId(msgGroupId);
|
||||
|
||||
insertCashAndPoint(userId, totPrice, memo, msgGroupId, null);
|
||||
|
||||
// mjonPayDAO.insertCash(mjonPayVO); //캐시
|
||||
// mjonPayDAO.updateMemberCash(mjonPayVO); //회원정보 업데이트
|
||||
|
||||
}
|
||||
/**
|
||||
* @methodName : insertCashAndPoint
|
||||
* @author : 이호영
|
||||
* @date : 2025. 7. 17.
|
||||
* @description : insertCashAndPoint 에서 환불으로 인해 userData 추가
|
||||
* @return : void
|
||||
* @param userId
|
||||
* @param totPrice
|
||||
* @param memo
|
||||
* @param msgGroupId
|
||||
* @param userData
|
||||
* @throws Exception
|
||||
*
|
||||
*/
|
||||
public void insertCashAndPoint(
|
||||
String userId
|
||||
, float totPrice
|
||||
, String memo
|
||||
, String msgGroupId
|
||||
, String userData
|
||||
) throws Exception {
|
||||
|
||||
MjonPayVO mjonPayVO = buildPayVO(userId, totPrice, memo, msgGroupId);
|
||||
|
||||
// 환불로 인해 userData가 추후 사용될 경우 여기에 처리
|
||||
if (StringUtils.isNotEmpty(userData)) { mjonPayVO.setOrderId(userData); }
|
||||
|
||||
mjonPayDAO.insertCash(mjonPayVO); //캐시
|
||||
mjonPayDAO.updateMemberCash(mjonPayVO); //회원정보 업데이트
|
||||
|
||||
}
|
||||
|
||||
|
||||
private MjonPayVO buildPayVO(String userId, float totPrice, String memo, String msgGroupId) throws FdlException {
|
||||
MjonPayVO vo = new MjonPayVO();
|
||||
vo.setCashId(idgenMjonCashId.getNextStringId());
|
||||
vo.setUserId(userId);
|
||||
vo.setCash(totPrice);
|
||||
vo.setFrstRegisterId(userId);
|
||||
vo.setMemo(memo);
|
||||
vo.setMsgGroupId(msgGroupId);
|
||||
System.out.println(" + totPrice :: " + totPrice);
|
||||
return vo;
|
||||
}
|
||||
|
||||
public void insertBizFtKakaoPrice(String userId, String msgGroupId) throws Exception {
|
||||
KakaoVO kakaoVO = new KakaoVO();
|
||||
|
||||
System.out.println("=======================");
|
||||
// 사용자 개인 단가 정보 불러오기
|
||||
MberManageVO mberManageVO = mjonMsgDataDAO.selectMberManageInfo(userId);
|
||||
// 시스템 기본 단가 정보 불러오기
|
||||
JoinSettingVO sysJoinSetVO = mjonMsgDataDAO.selectJoinSettingInfo();
|
||||
KakaoSendUtil.getValidPrice(mberManageVO.getShortPrice(), sysJoinSetVO.getShortPrice());
|
||||
// TODO Auto-generated method stub
|
||||
kakaoVO.setMsgGroupId(msgGroupId);
|
||||
|
||||
kakaoVO.setSmsPrice(KakaoSendUtil.getValidPrice(mberManageVO.getShortPrice(), sysJoinSetVO.getShortPrice()));
|
||||
kakaoVO.setMmsPrice(KakaoSendUtil.getValidPrice(mberManageVO.getLongPrice(), sysJoinSetVO.getLongPrice()));
|
||||
kakaoVO.setPicturePrice(KakaoSendUtil.getValidPrice(mberManageVO.getPicturePrice(), sysJoinSetVO.getPicturePrice()));
|
||||
|
||||
kakaoVO.setKakaoFtPrice(KakaoSendUtil.getValidPrice(mberManageVO.getKakaoFtPrice(), sysJoinSetVO.getKakaoFtPrice()));
|
||||
kakaoVO.setKakaoFtImgPrice(KakaoSendUtil.getValidPrice(mberManageVO.getKakaoFtImgPrice(), sysJoinSetVO.getKakaoFtImgPrice()));
|
||||
kakaoVO.setKakaoFtWideImgPrice(KakaoSendUtil.getValidPrice(mberManageVO.getKakaoFtWideImgPrice(), sysJoinSetVO.getKakaoFtWideImgPrice()));
|
||||
|
||||
|
||||
|
||||
kakaoAlimTalkDAO.insertKakaoSendPrice(kakaoVO);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @methodName : insertCashAndPoint
|
||||
* @author : 이지우
|
||||
* @date : 2025. 8. 14.
|
||||
* @description : insertCashAndPoint 에서 updateMemberCash 제외
|
||||
* @return : void
|
||||
* @param userId
|
||||
* @param totPrice
|
||||
* @param memo
|
||||
* @param msgGroupId
|
||||
* @param userData
|
||||
* @throws Exception
|
||||
*
|
||||
*/
|
||||
public void insertCashAndPointNoUpdate(
|
||||
String userId
|
||||
, float totPrice
|
||||
, String memo
|
||||
, String msgGroupId
|
||||
, String userData
|
||||
) throws Exception {
|
||||
|
||||
MjonPayVO mjonPayVO = buildPayVO(userId, totPrice, memo, msgGroupId);
|
||||
|
||||
// 환불로 인해 userData가 추후 사용될 경우 여기에 처리
|
||||
if (StringUtils.isNotEmpty(userData)) { mjonPayVO.setOrderId(userData); }
|
||||
|
||||
mjonPayDAO.insertCash(mjonPayVO); //캐시
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@ -47,11 +47,11 @@ public interface SchdlrManageService {
|
||||
//전용계좌 자동 충전 배치
|
||||
public void vacsAutoCharge() throws Exception;
|
||||
|
||||
//문자온 카카오톡 실패 건수 환불 배치
|
||||
public void kakaoFailPayBack() throws Exception;
|
||||
|
||||
//문자온 문자전송 실패 건수 환불 배치
|
||||
public void payBack(String type, int limitCout) throws Exception;
|
||||
|
||||
public void payBack_advc(String p_type) throws Exception;
|
||||
|
||||
//대체문자 결과 반영 배치
|
||||
public void updateKakaoResendResult() throws Exception;
|
||||
}
|
||||
|
||||
@ -2,7 +2,9 @@ package itn.let.schdlr.service;
|
||||
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.Date;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import javax.sql.DataSource;
|
||||
@ -24,12 +26,16 @@ import itn.let.fax.admin.service.FaxAdmService;
|
||||
import itn.let.fax.admin.service.FaxStatVO;
|
||||
import itn.let.kakao.admin.kakaoAt.service.MjonKakaoAtStatVO;
|
||||
import itn.let.kakao.admin.statistics.service.KakaoStatisticsService;
|
||||
import itn.let.kakao.kakaoComm.KakaoVO;
|
||||
import itn.let.kakao.user.kakaoAt.service.KakaoAlimTalkService;
|
||||
import itn.let.lett.service.LetterService;
|
||||
import itn.let.mail.service.MailTemplateService;
|
||||
import itn.let.mjo.mjocommon.MjonCommon;
|
||||
import itn.let.mjo.msg.service.MjonMsgService;
|
||||
import itn.let.mjo.msg.service.MjonMsgStatVO;
|
||||
import itn.let.mjo.msg.service.MjonMsgVO;
|
||||
import itn.let.mjo.msgdata.service.impl.MjonMsgDataDAO;
|
||||
import itn.let.mjo.pay.service.MjonPayService;
|
||||
import itn.let.mjo.pay.service.MjonPayVO;
|
||||
import itn.let.sts.com.StatsVO;
|
||||
import itn.let.sts.cst.service.EgovConectStatsService;
|
||||
import itn.let.uss.umt.service.EgovUserManageService;
|
||||
@ -82,6 +88,15 @@ public class SchedulerUtil {
|
||||
@Resource(name="MjonMsgDataDAO")
|
||||
private MjonMsgDataDAO mjonMsgDataDAO;
|
||||
|
||||
@Resource(name="kakaoAlimTalkService")
|
||||
private KakaoAlimTalkService kakaoAlimTalkService;
|
||||
|
||||
@Resource(name="MjonCommon")
|
||||
private MjonCommon mjonCommon;
|
||||
|
||||
@Resource(name = "mjonPayService")
|
||||
private MjonPayService mjonPayService;
|
||||
|
||||
/** 설정값 가져오기 */
|
||||
@Value("#{globalSettings['Globals.Env']}")
|
||||
private String GlobalsEnv;
|
||||
@ -470,13 +485,46 @@ public class SchedulerUtil {
|
||||
@SchedulerLock(name = "runKakaoOneTime", lockAtMostForString = ONE_MIN, lockAtLeastForString = ONE_MIN)
|
||||
public void runKakaoOneTime() throws Exception {
|
||||
|
||||
// do something...
|
||||
try {
|
||||
/* 회원 money 업데이트 처리 트랜잭션 분리를 위하여 impl이 아닌 현재 위치에서 반복문 실행 */
|
||||
System.out.println("=============SchedulerUtil=====runKakaoOneTime =============>");
|
||||
schdlrManageService.kakaoFailPayBack();
|
||||
List<KakaoVO> kakaoRefundList = kakaoAlimTalkService.selectKakaoSentRefundListForSingle();
|
||||
Set<String> targetIdSet = new HashSet<>();
|
||||
|
||||
for(KakaoVO kakaoVO : kakaoRefundList) {
|
||||
try {
|
||||
kakaoAlimTalkService.kakaoSingleRefund(kakaoVO);
|
||||
targetIdSet.add(kakaoVO.getUserId());
|
||||
} catch (Exception e) {
|
||||
String msg = "[문자온] 환불 실패 - " + kakaoVO.getMsgId() +"("+ kakaoVO.getUserId() + ")";
|
||||
mjonCommon.sendSimpleSlackMsg(msg);;
|
||||
}
|
||||
}
|
||||
|
||||
MjonPayVO mjonPayVO = new MjonPayVO();
|
||||
for(String userId : targetIdSet) {
|
||||
try {
|
||||
mjonPayVO.setUserId(userId);
|
||||
mjonPayService.updateMemberCash(mjonPayVO); //회원정보 업데이트
|
||||
} catch(Exception e) {
|
||||
String msg = "[문자온] 환불 후 잔액 갱신 실패 - " + userId;
|
||||
mjonCommon.sendSimpleSlackMsg(msg);;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//대체문자 결과 반영
|
||||
@Scheduled(cron = "0 0/2 * * * ?") // 2분마다 실행
|
||||
@SchedulerLock(name = "updateKakaoResendResult", lockAtMostForString = ONE_MIN, lockAtLeastForString = ONE_MIN)
|
||||
public void runUpdateKakaoResendResult() throws Exception {
|
||||
|
||||
try {
|
||||
System.out.println("=============SchedulerUtil=====runUpdateKakaoResendResult =============>");
|
||||
schdlrManageService.updateKakaoResendResult();
|
||||
}catch(Exception ex) {
|
||||
ex.printStackTrace();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//환불 실행
|
||||
|
||||
@ -393,12 +393,12 @@ public class SchdlrManageServiceImpl extends EgovAbstractServiceImpl implements
|
||||
|
||||
// 대상 : 휴대폰결제, 즉시이체, 전용계좌
|
||||
// Step 1. 스미싱의심 지정 여부
|
||||
JoinSettingVO joinSettingVO = new JoinSettingVO();
|
||||
joinSettingVO = egovSiteManagerService.selectAdminNotiDetail();
|
||||
// JoinSettingVO joinSettingVO = new JoinSettingVO();
|
||||
JoinSettingVO joinSettingVO = egovSiteManagerService.selectAdminNotiDetail();
|
||||
if (joinSettingVO != null && joinSettingVO.getSmishingNoti().equals("Y")) {
|
||||
// Step 1. 개인회원 여부 체크
|
||||
int isPersnalMemberCnt = egovSiteManagerService.selectPersnalMemberCnt(Userid);
|
||||
if (isPersnalMemberCnt == 1) {
|
||||
// int isPersnalMemberCnt = egovSiteManagerService.selectPersnalMemberCnt(Userid);
|
||||
// if (isPersnalMemberCnt == 1) {
|
||||
// Step 2. 첫결제 여부 체크
|
||||
int isFirstPayCnt = egovSiteManagerService.selectFirstPayCnt(Userid);
|
||||
if (isFirstPayCnt == 1) {
|
||||
@ -418,10 +418,11 @@ public class SchdlrManageServiceImpl extends EgovAbstractServiceImpl implements
|
||||
// 스미싱 의심회원으로 변경
|
||||
UserManageVO userManageVO = new UserManageVO();
|
||||
userManageVO.setSmishingYn("Y");
|
||||
userManageVO.setAtSmishingYn("Y");
|
||||
userManageVO.setMberId(Userid);
|
||||
userManageService.updateOneUserSmishingYnNotAlert(userManageVO);
|
||||
}
|
||||
}
|
||||
// }
|
||||
}
|
||||
|
||||
} catch (Exception e) {
|
||||
@ -437,17 +438,6 @@ public class SchdlrManageServiceImpl extends EgovAbstractServiceImpl implements
|
||||
|
||||
}
|
||||
|
||||
// 카카오 환불 처리 리스트
|
||||
public void kakaoFailPayBack() throws Exception {
|
||||
|
||||
// 카카오 알림톡 환불 처리
|
||||
kakaoAlimTalkService.selectKakaoAtSentRefundList();
|
||||
|
||||
// 카카오 친구톡 환불 처리
|
||||
// kakaoAlimTalkService.selectKakaoFtSentRefundList();
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void payBack(String type, int limitCout) throws Exception {
|
||||
// 문자 환불
|
||||
@ -566,4 +556,37 @@ public class SchdlrManageServiceImpl extends EgovAbstractServiceImpl implements
|
||||
|
||||
return msgFailList;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @methodName : updateKakaoResendResult
|
||||
* @author : 이지우
|
||||
* @date : 2025.07.15
|
||||
* @description : 대체문자 결과 반영
|
||||
* @param p_type
|
||||
* @param request
|
||||
* @param model
|
||||
* @return
|
||||
* @throws Exception
|
||||
*/
|
||||
@Override
|
||||
public void updateKakaoResendResult() throws Exception {
|
||||
long startTime = System.currentTimeMillis();
|
||||
// 대체문자 대상 조회
|
||||
List<MjonMsgVO> resendLogList = mjonMsgDataDAO.selectBizResendLogList();
|
||||
for(MjonMsgVO vo : resendLogList) {
|
||||
if("4100".equals(vo.getResultCode())
|
||||
|| "6600".equals(vo.getResultCode())
|
||||
|| "7000".equals(vo.getResultCode())) {
|
||||
vo.setMsgResult("40");
|
||||
}else {
|
||||
vo.setMsgResult("50");
|
||||
}
|
||||
mjonMsgDataDAO.updateResendResult(vo);
|
||||
mjonMsgDataDAO.deleteBizResendLog(vo);
|
||||
}
|
||||
long endTime = System.currentTimeMillis();
|
||||
long elapsedTime = (endTime - startTime) / 1000; // 초 단위 변환
|
||||
System.out.println("updateKakaoResendResult 실행 시간: " + elapsedTime + "초 (" + resendLogList.size() + "건 처리)");
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,5 +1,12 @@
|
||||
package itn.let.sym.site.service;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Getter;
|
||||
import lombok.NoArgsConstructor;
|
||||
import lombok.Setter;
|
||||
import lombok.ToString;
|
||||
|
||||
/**
|
||||
* 로그인정책에 대한 VO 클래스를 정의한다.
|
||||
* 로그인정책정보의 목록 항목을 관리한다.
|
||||
@ -18,13 +25,18 @@ package itn.let.sym.site.service;
|
||||
*
|
||||
* </pre>
|
||||
*/
|
||||
|
||||
@Getter
|
||||
@Setter
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
@Builder
|
||||
@ToString
|
||||
public class JoinSettingVO {
|
||||
|
||||
/**
|
||||
* serialVersionUID
|
||||
*/
|
||||
@SuppressWarnings("unused")
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
private float shortPrice; // 단문 단가
|
||||
private float longPrice; //장문 단가
|
||||
@ -37,6 +49,9 @@ public class JoinSettingVO {
|
||||
private float customTextPrice; // 텍스트 단순수정
|
||||
private float kakaoAtPrice; // 카카오 알림톡 단가
|
||||
private float kakaoFtPrice; // 카카오 친구톡 단가
|
||||
private float kakaoFtImgPrice; // 카카오 친구톡 이미지 단가
|
||||
private float kakaoFtWideImgPrice; // 카카오 친구톡 와이드 단가
|
||||
|
||||
private float faxPrice; // 팩스 단가
|
||||
|
||||
private float refundPer; //환불 비율
|
||||
@ -51,188 +66,5 @@ public class JoinSettingVO {
|
||||
private String smishingNoti; //첫결제(카드제외) 스미싱의심 알림 여부
|
||||
private String holiSmishingNoti; //야간 스미싱알림 여부
|
||||
|
||||
public String getSmishingNoti() {
|
||||
return smishingNoti;
|
||||
}
|
||||
|
||||
public void setSmishingNoti(String smishingNoti) {
|
||||
this.smishingNoti = smishingNoti;
|
||||
}
|
||||
|
||||
public float getShortPrice() {
|
||||
return shortPrice;
|
||||
}
|
||||
|
||||
public void setShortPrice(float shortPrice) {
|
||||
this.shortPrice = shortPrice;
|
||||
}
|
||||
|
||||
public float getLongPrice() {
|
||||
return longPrice;
|
||||
}
|
||||
|
||||
public void setLongPrice(float longPrice) {
|
||||
this.longPrice = longPrice;
|
||||
}
|
||||
|
||||
public float getPicturePrice() {
|
||||
return picturePrice;
|
||||
}
|
||||
|
||||
public void setPicturePrice(float picturePrice) {
|
||||
this.picturePrice = picturePrice;
|
||||
}
|
||||
|
||||
public float getPicture2Price() {
|
||||
return picture2Price;
|
||||
}
|
||||
|
||||
public void setPicture2Price(float picture2Price) {
|
||||
this.picture2Price = picture2Price;
|
||||
}
|
||||
|
||||
public float getPicture3Price() {
|
||||
return picture3Price;
|
||||
}
|
||||
|
||||
public void setPicture3Price(float picture3Price) {
|
||||
this.picture3Price = picture3Price;
|
||||
}
|
||||
|
||||
public float getCustomSamplePrice() {
|
||||
return customSamplePrice;
|
||||
}
|
||||
|
||||
public void setCustomSamplePrice(float customSamplePrice) {
|
||||
this.customSamplePrice = customSamplePrice;
|
||||
}
|
||||
|
||||
public float getCustomEditPrice() {
|
||||
return customEditPrice;
|
||||
}
|
||||
|
||||
public void setCustomEditPrice(float customEditPrice) {
|
||||
this.customEditPrice = customEditPrice;
|
||||
}
|
||||
|
||||
public float getCustomEdit3Price() {
|
||||
return customEdit3Price;
|
||||
}
|
||||
|
||||
public void setCustomEdit3Price(float customEdit3Price) {
|
||||
this.customEdit3Price = customEdit3Price;
|
||||
}
|
||||
|
||||
public float getCustomTextPrice() {
|
||||
return customTextPrice;
|
||||
}
|
||||
|
||||
public void setCustomTextPrice(float customTextPrice) {
|
||||
this.customTextPrice = customTextPrice;
|
||||
}
|
||||
|
||||
public float getRefundPer() {
|
||||
return refundPer;
|
||||
}
|
||||
|
||||
public void setRefundPer(float refundPer) {
|
||||
this.refundPer = refundPer;
|
||||
}
|
||||
|
||||
public float getJoinCash() {
|
||||
return joinCash;
|
||||
}
|
||||
|
||||
public void setJoinCash(float joinCash) {
|
||||
this.joinCash = joinCash;
|
||||
}
|
||||
|
||||
public float getPointPer() {
|
||||
return pointPer;
|
||||
}
|
||||
|
||||
public void setPointPer(float pointPer) {
|
||||
this.pointPer = pointPer;
|
||||
}
|
||||
|
||||
public String getLasUpdusrId() {
|
||||
return lasUpdusrId;
|
||||
}
|
||||
|
||||
public void setLasUpdusrId(String lasUpdusrId) {
|
||||
this.lasUpdusrId = lasUpdusrId;
|
||||
}
|
||||
|
||||
public String getLastUpdtPnttm() {
|
||||
return lastUpdtPnttm;
|
||||
}
|
||||
|
||||
public void setLastUpdtPnttm(String lastUpdtPnttm) {
|
||||
this.lastUpdtPnttm = lastUpdtPnttm;
|
||||
}
|
||||
|
||||
public String getJoinCertType() {
|
||||
return joinCertType;
|
||||
}
|
||||
|
||||
public void setJoinCertType(String joinCertType) {
|
||||
this.joinCertType = joinCertType;
|
||||
}
|
||||
|
||||
public String getSmsNoti() {
|
||||
return smsNoti;
|
||||
}
|
||||
|
||||
public void setSmsNoti(String smsNoti) {
|
||||
this.smsNoti = smsNoti;
|
||||
}
|
||||
|
||||
public String getEmailNoti() {
|
||||
return emailNoti;
|
||||
}
|
||||
|
||||
public void setEmailNoti(String emailNoti) {
|
||||
this.emailNoti = emailNoti;
|
||||
}
|
||||
|
||||
public String getSlackNoti() {
|
||||
return slackNoti;
|
||||
}
|
||||
|
||||
public void setSlackNoti(String slackNoti) {
|
||||
this.slackNoti = slackNoti;
|
||||
}
|
||||
|
||||
public float getKakaoAtPrice() {
|
||||
return kakaoAtPrice;
|
||||
}
|
||||
|
||||
public void setKakaoAtPrice(float kakaoAtPrice) {
|
||||
this.kakaoAtPrice = kakaoAtPrice;
|
||||
}
|
||||
|
||||
public float getKakaoFtPrice() {
|
||||
return kakaoFtPrice;
|
||||
}
|
||||
|
||||
public void setKakaoFtPrice(float kakaoFtPrice) {
|
||||
this.kakaoFtPrice = kakaoFtPrice;
|
||||
}
|
||||
|
||||
public float getFaxPrice() {
|
||||
return faxPrice;
|
||||
}
|
||||
|
||||
public void setFaxPrice(float faxPrice) {
|
||||
this.faxPrice = faxPrice;
|
||||
}
|
||||
|
||||
public String getHoliSmishingNoti() {
|
||||
return holiSmishingNoti;
|
||||
}
|
||||
|
||||
public void setHoliSmishingNoti(String holiSmishingNoti) {
|
||||
this.holiSmishingNoti = holiSmishingNoti;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -28,7 +28,7 @@ Globals.Env = dev
|
||||
|
||||
# mysql
|
||||
Globals.DriverClassName=com.mysql.jdbc.Driver
|
||||
Globals.Url=jdbc:mysql://192.168.0.125:3306/mjon_advc
|
||||
Globals.Url=jdbc:mysql://192.168.0.60:3308/mjon_advc
|
||||
#Globals.Url=jdbc:mysql://139.150.73.12:3306/mjon
|
||||
Globals.UserName= mjonUr
|
||||
Globals.Password= mjon!@#$
|
||||
|
||||
@ -28,7 +28,7 @@ Globals.Env = local
|
||||
|
||||
# mysql
|
||||
Globals.DriverClassName=com.mysql.jdbc.Driver
|
||||
Globals.Url=jdbc:mysql://192.168.0.125:3306/mjon_advc
|
||||
Globals.Url=jdbc:mysql://192.168.0.60:3308/mjon_advc
|
||||
#Globals.Url=jdbc:mysql://192.168.0.60:3308/mjon
|
||||
Globals.UserName= mjonUr
|
||||
Globals.Password= mjon!@#$
|
||||
|
||||
@ -909,7 +909,7 @@
|
||||
|
||||
<!-- 발신 내용 상세보기 조회 (상세보기 버튼 클릭시)-->
|
||||
<select id="KakaoSentDAO.selectKakaoSentDetailDataAjax" parameterClass="mjonKakaoATVO" resultClass="mjonKakaoATVO">
|
||||
|
||||
/* KakaoSentDAO.selectKakaoSentDetailDataAjax */
|
||||
SELECT
|
||||
MGD.MSG_GROUP_ID as msgGroupId
|
||||
, MGD.USER_ID as userId
|
||||
@ -925,9 +925,14 @@
|
||||
, 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 파일 경로 */
|
||||
, BA.CONTENTS as contents
|
||||
, MGD.AD_FLAG as adFlag
|
||||
, MD.FILE_PATH1 as filePath1
|
||||
FROM MJ_MSG_GROUP_DATA MGD
|
||||
INNER JOIN MJ_MSG_DATA MD
|
||||
ON MGD.MSG_GROUP_ID = MD.MSG_GROUP_ID
|
||||
LEFT JOIN BIZ_ATTACHMENTS BA
|
||||
ON MD.BIZ_KAKAO_JSON_FILE = BA.MSG_KEY
|
||||
AND MGD.USER_ID = MD.USER_ID
|
||||
WHERE
|
||||
MGD.USER_ID = #userId#
|
||||
@ -1392,6 +1397,10 @@
|
||||
B.AT_DELAY_COMPLETE_YN AS atDelayCompleteYn,
|
||||
A.MSG_NOTICETALK_SENDER_KEY AS msgNoticetalkSenderKey,
|
||||
A.BIZ_KAKAO_RESEND_YN AS bizKakaoResendYn,
|
||||
A.BIZ_KAKAO_RESEND_DATA as bizKakaoResendData,
|
||||
B.AD_FLAG as adFlag ,
|
||||
B.BIZ_KAKAO_IMAGE_TYPE as bizKakaoImageType ,
|
||||
B.BIZ_KAKAO_RESEND_TYPE as bizKakaoResendType ,
|
||||
CASE
|
||||
WHEN B.AT_DELAY_YN = 'Y' AND B.AT_DELAY_COMPLETE_YN = 'N'
|
||||
THEN DATE_ADD(B.REQ_DATE, INTERVAL -30 MINUTE)
|
||||
@ -1400,7 +1409,7 @@
|
||||
C.YELLOW_ID AS yellowId
|
||||
FROM MJ_MSG_GROUP_DATA B
|
||||
INNER JOIN (
|
||||
select MSG_GROUP_ID, MSG_TYPE, DEL_FLAG, MSG_NOTICETALK_SENDER_KEY, BIZ_KAKAO_RESEND_YN
|
||||
select MSG_GROUP_ID, MSG_TYPE, DEL_FLAG, MSG_NOTICETALK_SENDER_KEY, BIZ_KAKAO_RESEND_YN, BIZ_KAKAO_RESEND_DATA
|
||||
from MJ_MSG_DATA
|
||||
where DEL_FLAG = 'N'
|
||||
<isNotEmpty property="tabType">
|
||||
@ -1663,23 +1672,96 @@
|
||||
</select>
|
||||
|
||||
<select id="KakaoSentDAO.selectKakaoSentCntEachCnt_advc" parameterClass="kakaoSentVO" resultClass="kakaoSentVO">
|
||||
/* KakaoSentDAO.selectKakaoSentCntEachCnt_advc */
|
||||
SELECT
|
||||
a.MSG_GROUP_ID AS msgGroupId
|
||||
, a.successCount
|
||||
, a.waitCount
|
||||
, a.failCount
|
||||
, a.divideYn
|
||||
<isEqual property="bizKakaoResendYn" compareValue="Y">
|
||||
, a.kakaoResendSuccCount
|
||||
, a.kakaoResendFailCount
|
||||
, a.successCount * bkp.BIZ_KAKAO_AT_PRICE AS successPrice
|
||||
, (a.smsCnt * bkp.BIZ_SMS_PRICE) + (a.mmsCnt * bkp.BIZ_MMS_PRICE) AS kakaoResendSuccPrice
|
||||
</isEqual>
|
||||
<isNotEqual property="bizKakaoResendYn" compareValue="Y">
|
||||
, 0 AS kakaoResendSuccCount
|
||||
, 0 AS kakaoResendFailCount
|
||||
, 0 AS successPrice
|
||||
, 0 AS kakaoResendSuccPrice
|
||||
a.MSG_GROUP_ID AS msgGroupId
|
||||
, a.successCount
|
||||
, a.waitCount
|
||||
, a.failCount
|
||||
, a.divideYn
|
||||
<isEqual property="bizKakaoResendYn" compareValue="Y">
|
||||
, a.kakaoResendSuccCount
|
||||
, a.kakaoResendFailCount
|
||||
|
||||
|
||||
<isEqual property="msgType" compareValue="8">
|
||||
, a.successCount * bkp.BIZ_KAKAO_AT_PRICE AS successPrice
|
||||
, (a.smsCnt * bkp.BIZ_SMS_PRICE) + (a.mmsCnt * bkp.BIZ_MMS_PRICE) AS kakaoResendSuccPrice
|
||||
|
||||
</isEqual>
|
||||
|
||||
|
||||
|
||||
<isEqual property="msgType" compareValue="9">
|
||||
|
||||
<!-- bizKakaoImageType 있음 + MMS -->
|
||||
<isNotEmpty property="bizKakaoImageType">
|
||||
|
||||
|
||||
<!-- 와이드 이미지인 경우 -->
|
||||
<isEqual property="bizKakaoImageType" compareValue="W">
|
||||
, a.successCount * bkp.BIZ_KAKAO_FT_WIDE_IMG_PRICE AS successPrice
|
||||
</isEqual>
|
||||
|
||||
<!-- 일반 이미지인 경우 -->
|
||||
<isEqual property="bizKakaoImageType" compareValue="I">
|
||||
, a.successCount * bkp.BIZ_KAKAO_FT_IMG_PRICE AS successPrice
|
||||
</isEqual>
|
||||
|
||||
, (a.smsCnt * bkp.BIZ_SMS_PRICE) + (a.mmsCnt * bkp.BIZ_PICTURE_PRICE) AS kakaoResendSuccPrice
|
||||
</isNotEmpty>
|
||||
|
||||
|
||||
<!-- 이미지 없음 -->
|
||||
<isEmpty property="bizKakaoImageType">
|
||||
|
||||
|
||||
, a.successCount * bkp.BIZ_KAKAO_FT_PRICE AS successPrice
|
||||
<isEqual property="bizKakaoResendType" compareValue="MMS">
|
||||
, (a.smsCnt * bkp.BIZ_SMS_PRICE) + (a.mmsCnt * bkp.BIZ_MMS_PRICE) AS kakaoResendSuccPrice
|
||||
</isEqual>
|
||||
|
||||
<isEqual property="bizKakaoResendType" compareValue="SMS">
|
||||
, (a.smsCnt * bkp.BIZ_SMS_PRICE) + (a.mmsCnt * 0) AS kakaoResendSuccPrice
|
||||
</isEqual>
|
||||
|
||||
<!-- 예외: bizKakaoResendType 이 MMS, SMS 둘 다 아닐 경우 -->
|
||||
<isNotEqual property="bizKakaoResendType" compareValue="MMS">
|
||||
<isNotEqual property="bizKakaoResendType" compareValue="SMS">
|
||||
, 0 AS kakaoResendSuccPrice
|
||||
</isNotEqual>
|
||||
</isNotEqual>
|
||||
</isEmpty>
|
||||
</isEqual>
|
||||
</isEqual>
|
||||
<isNotEqual property="bizKakaoResendYn" compareValue="Y">
|
||||
, 0 AS kakaoResendSuccCount
|
||||
, 0 AS kakaoResendFailCount
|
||||
<isEqual property="msgType" compareValue="8">
|
||||
, a.successCount * bkp.BIZ_KAKAO_AT_PRICE AS successPrice
|
||||
</isEqual>
|
||||
|
||||
<isEqual property="msgType" compareValue="9">
|
||||
|
||||
<!-- 와이드 이미지인 경우 -->
|
||||
<isEqual property="bizKakaoImageType" compareValue="W">
|
||||
, a.successCount * bkp.BIZ_KAKAO_FT_WIDE_IMG_PRICE AS successPrice
|
||||
</isEqual>
|
||||
|
||||
<!-- 일반 이미지인 경우 -->
|
||||
<isEqual property="bizKakaoImageType" compareValue="I">
|
||||
, a.successCount * bkp.BIZ_KAKAO_FT_IMG_PRICE AS successPrice
|
||||
</isEqual>
|
||||
|
||||
<!-- 텍스트형(이미지 없음)인 경우 -->
|
||||
<isNotEqual property="bizKakaoImageType" compareValue="W">
|
||||
<isNotEqual property="bizKakaoImageType" compareValue="I">
|
||||
, a.successCount * bkp.BIZ_KAKAO_FT_PRICE AS successPrice
|
||||
</isNotEqual>
|
||||
</isNotEqual>
|
||||
|
||||
</isEqual>
|
||||
, 0 AS kakaoResendSuccPrice
|
||||
</isNotEqual>
|
||||
FROM (
|
||||
SELECT
|
||||
@ -1738,8 +1820,19 @@
|
||||
, a.failCount
|
||||
, a.kakaoResendSuccCount
|
||||
, a.kakaoResendFailCount
|
||||
, a.successCount * bkp.BIZ_KAKAO_AT_PRICE AS successPrice
|
||||
, (a.smsCnt * bkp.BIZ_SMS_PRICE) + (a.mmsCnt * bkp.BIZ_MMS_PRICE) AS kakaoResendSuccPrice
|
||||
<!-- , a.successCount * bkp.BIZ_KAKAO_AT_PRICE AS successPrice -->
|
||||
,case
|
||||
when a.msgType = '8' then a.successCount * bkp.BIZ_KAKAO_AT_PRICE
|
||||
when a.msgType = '9' and a.bizKakaoImageType = 'I' then a.successCount * bkp.BIZ_KAKAO_FT_IMG_PRICE
|
||||
when a.msgType = '9' and a.bizKakaoImageType = 'W' then a.successCount * bkp.BIZ_KAKAO_FT_WIDE_IMG_PRICE
|
||||
when a.msgType = '9' and a.bizKakaoImageType != 'I' and a.bizKakaoImageType != 'W' then a.successCount * bkp.BIZ_KAKAO_FT_PRICE
|
||||
end successPrice
|
||||
<!-- , (a.smsCnt * bkp.BIZ_SMS_PRICE) + (a.mmsCnt * bkp.BIZ_MMS_PRICE) AS kakaoResendSuccPrice -->
|
||||
,case
|
||||
when a.msgType = '8' then (a.smsCnt * bkp.BIZ_SMS_PRICE) + (a.mmsCnt * bkp.BIZ_MMS_PRICE)
|
||||
when a.msgType = '9' and (a.bizKakaoImageType = 'I' or a.bizKakaoImageType = 'W') then a.mmsCnt * bkp.BIZ_PICTURE_PRICE
|
||||
when a.msgType = '9' and a.bizKakaoImageType != 'I' and a.bizKakaoImageType != 'W' then (a.smsCnt * bkp.BIZ_SMS_PRICE) + (a.mmsCnt * bkp.BIZ_MMS_PRICE)
|
||||
end kakaoResendSuccPrice
|
||||
, a.divideYn
|
||||
, a.bizKakaoResendYn
|
||||
, MKPI.YELLOW_ID AS yellowId
|
||||
@ -1865,6 +1958,7 @@
|
||||
, MD.BIZ_KAKAO_RESEND_YN as bizKakaoResendYn
|
||||
, MD.MSG_NOTICETALK_SENDER_KEY
|
||||
, MD.MSG_NOTICETALK_TMP_KEY
|
||||
, MGD.BIZ_KAKAO_IMAGE_TYPE as bizKakaoImageType
|
||||
FROM MJ_MSG_DATA MD
|
||||
inner join MJ_MSG_GROUP_DATA MGD on
|
||||
MGD.MSG_GROUP_ID = MD.MSG_GROUP_ID
|
||||
@ -1896,6 +1990,7 @@
|
||||
|
||||
<!-- 발신 내용 상세보기 조회 (상세보기 버튼 클릭시)-->
|
||||
<select id="KakaoSentDAO.selectKakaoSentDetailViewPhoneAjax" parameterClass="mjonKakaoATVO" resultClass="mjonKakaoATVO">
|
||||
/* KakaoSentDAO.selectKakaoSentDetailViewPhoneAjax */
|
||||
|
||||
SELECT
|
||||
MGD.MSG_GROUP_ID as msgGroupId
|
||||
|
||||
@ -72,12 +72,16 @@
|
||||
|
||||
, SMS_TXT
|
||||
, BIZ_KAKAO_TITLE
|
||||
, AD_FLAG
|
||||
, FILE_PATH1
|
||||
|
||||
, BIZ_KAKAO_RESEND_YN
|
||||
, BIZ_KAKAO_RESEND_DATA
|
||||
, BIZ_KAKAO_RESEND_TYPE
|
||||
, BIZ_KAKAO_JSON_FILE
|
||||
, REQ_DATE
|
||||
|
||||
, FILE_CNT
|
||||
)VALUES
|
||||
<iterate conjunction=",">
|
||||
(
|
||||
@ -95,12 +99,16 @@
|
||||
|
||||
, #[].templateContent#
|
||||
, #[].templateTitle#
|
||||
, #[].adFlag#
|
||||
, #[].filePath1#
|
||||
|
||||
, #[].subMsgSendYn#
|
||||
, #[].subMsgTxt#
|
||||
, #[].subMsgType#
|
||||
, #[].bizJsonName#
|
||||
, #[].reqDate#
|
||||
|
||||
, #[].fileCnt#
|
||||
)
|
||||
</iterate>
|
||||
</insert>
|
||||
@ -131,6 +139,7 @@
|
||||
REQ_DATE,
|
||||
MSG_GROUP_CNT,
|
||||
MSG_TYPE,
|
||||
AD_FLAG,
|
||||
|
||||
AGENT_CODE,
|
||||
EACH_PRICE,
|
||||
@ -142,7 +151,8 @@
|
||||
|
||||
AT_DELAY_YN,
|
||||
BIZ_KAKAO_RESEND_ORGNL_TXT,
|
||||
BIZ_KAKAO_RESEND_TYPE
|
||||
BIZ_KAKAO_RESEND_TYPE,
|
||||
BIZ_KAKAO_IMAGE_TYPE
|
||||
)VALUES
|
||||
(
|
||||
#msgGroupId#,
|
||||
@ -153,6 +163,7 @@
|
||||
#reqDate#,
|
||||
#msgGroupCnt#,
|
||||
#msgType#,
|
||||
#adFlag#,
|
||||
|
||||
#agentCode#,
|
||||
#eachPrice#,
|
||||
@ -164,7 +175,8 @@
|
||||
|
||||
#atDelayYn#,
|
||||
#bizKakaoResendOrgnlTxt#,
|
||||
#bizKakaoResendType#
|
||||
#bizKakaoResendType#,
|
||||
#bizKakaoImageType#
|
||||
)
|
||||
</insert>
|
||||
|
||||
@ -178,6 +190,7 @@
|
||||
, BIZ_KAKAO_FT_WIDE_IMG_PRICE
|
||||
, BIZ_SMS_PRICE
|
||||
, BIZ_MMS_PRICE
|
||||
, BIZ_PICTURE_PRICE
|
||||
)
|
||||
VALUES
|
||||
(
|
||||
@ -188,14 +201,18 @@
|
||||
,#kakaoFtWideImgPrice#
|
||||
,#smsPrice#
|
||||
,#mmsPrice#
|
||||
,#picturePrice#
|
||||
)
|
||||
</insert>
|
||||
|
||||
<select id="kakaoAlimTalkDAO.selectKakaoAtSentRefundList" resultClass="kakaoVO">
|
||||
<select id="kakaoAlimTalkDAO.selectKakaoSentRefundList" resultClass="kakaoVO">
|
||||
SELECT
|
||||
MMD.USER_ID AS userId
|
||||
, MMD.MSG_GROUP_ID AS msgGroupId
|
||||
, MMD.MSG_ID AS msgId
|
||||
, MMD.MSG_SEQ AS msgSeq
|
||||
, MMGD.BIZ_KAKAO_IMAGE_TYPE AS bizKakaoImageType
|
||||
, MMGD.EACH_PRICE AS eachPrice
|
||||
, MMD.USERDATA AS userData
|
||||
, MMD.REFUND_YN AS refundYn
|
||||
, MMD.RSLT_CODE AS rsltCode
|
||||
@ -205,42 +222,21 @@
|
||||
, 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
|
||||
|
||||
, MMD.FILE_CNT AS fileCnt
|
||||
, MMD.BIZ_UMID AS bizUmid
|
||||
, MMD.MSG_TYPE AS msgType
|
||||
FROM
|
||||
MJ_MSG_DATA MMD
|
||||
INNER JOIN LETTNGNRLMBER MB
|
||||
ON MMD.USER_ID = MB.MBER_ID
|
||||
INNER JOIN mj_msg_group_data MMGD
|
||||
on MMD.MSG_GROUP_ID = MMGD.MSG_GROUP_ID
|
||||
WHERE 1=1
|
||||
AND MMD.CUR_STATE = '3'
|
||||
AND MMD.REFUND_YN = 'N'
|
||||
AND MMD.RESERVE_C_YN = 'N'
|
||||
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
|
||||
AND MMD.MSG_TYPE IN(8, 9)
|
||||
ORDER BY MMD.USER_ID ASC
|
||||
</select>
|
||||
|
||||
<select id="kakaoAlimTalkDAO.selectKakaoAtUmid" resultClass="kakaoVO" parameterClass="kakaoVO">
|
||||
@ -252,6 +248,15 @@
|
||||
AND USERDATA = #userData#
|
||||
</select>
|
||||
|
||||
<select id="kakaoAlimTalkDAO.selectBizLog" resultClass="kakaoVO" parameterClass="String">
|
||||
SELECT
|
||||
CALL_STATUS AS bizLogCallStatus
|
||||
FROM
|
||||
BIZ_LOG
|
||||
WHERE 1=1
|
||||
AND CMID = #umid#
|
||||
</select>
|
||||
|
||||
<!-- 카카오 전송 환불 프로시저 실행 (카카오 전송 성공 관련) -->
|
||||
<procedure id="kakaoAlimTalkDAO.updateKakaoAtSend" parameterClass="kakaoVO">
|
||||
{call kakaoAt_Send(#userId#, #msgGroupId#, #userData#)}
|
||||
@ -271,7 +276,7 @@
|
||||
|
||||
<!-- 카카오 친구톡 전송 환불 프로시저 실행 (카카오 전송 성공 관련 - 대체문자 선택시 차액 환불 처리) -->
|
||||
<procedure id="kakaoAlimTalkDAO.updateKakaoFtSend" parameterClass="kakaoVO">
|
||||
{call kakaoFt_Send(#userId#, #msgGroupId#, #userData#)}
|
||||
{call kakaoFt_Send(#userId#, #msgGroupId#, #userData#, #fileCnt#, #bizKakaoResendType#, #bizKakaoImageType#)}
|
||||
</procedure>
|
||||
|
||||
<!-- 카카오 친구톡 전송 환불 프로시저 실행 (카카오 전송 실패시 대체문자 관련 - 대체문자 발송 완료 된 경우) -->
|
||||
|
||||
@ -37,7 +37,7 @@
|
||||
VALUES
|
||||
( #friendId#
|
||||
, #userId#
|
||||
, #bizJsonName#
|
||||
, #atchFileId#
|
||||
, #templateName#
|
||||
, #imageFileName#
|
||||
, #templateImageUrl#
|
||||
@ -200,6 +200,7 @@
|
||||
A.IMAGE_TYPE AS imageType,
|
||||
A.IMAGE_TITLE AS imgTitle,
|
||||
A.IMAGE_LINK AS imgLink,
|
||||
A.ATCH_FILE_ID AS atchFileId,
|
||||
A.TEMPLATE_CONTENTS AS templateContent,
|
||||
A.AD_FLAG AS adFlag,
|
||||
DATE_FORMAT(A.FRST_REGIST_PNTTM, '%Y-%m-%d %T') AS frstRegistPnttm,
|
||||
@ -215,6 +216,7 @@
|
||||
KFT.IMAGE_TYPE,
|
||||
KFT.IMAGE_TITLE,
|
||||
KFT.IMAGE_LINK,
|
||||
KFT.ATCH_FILE_ID,
|
||||
KFT.TEMPLATE_CONTENTS,
|
||||
KFT.AD_FLAG,
|
||||
KFT.FRST_REGIST_PNTTM,
|
||||
|
||||
@ -2151,6 +2151,8 @@
|
||||
, POINT_PER AS pointPer
|
||||
, KAKAO_AT_PRICE AS kakaoAtPrice
|
||||
, KAKAO_FT_PRICE AS kakaoFtPrice
|
||||
, KAKAO_FT_IMG_PRICE AS kakaoFtImgPrice
|
||||
, KAKAO_FT_WIDE_IMG_PRICE AS kakaoFtWideImgPrice
|
||||
, FAX_PRICE AS faxPrice
|
||||
FROM MJ_MBER_SETTING
|
||||
|
||||
@ -2169,6 +2171,8 @@
|
||||
, PICTURE3_PRICE AS picture3Price
|
||||
, KAKAO_AT_PRICE AS kakaoAtPrice
|
||||
, KAKAO_FT_PRICE AS kakaoFtPrice
|
||||
, KAKAO_FT_IMG_PRICE AS kakaoFtImgPrice
|
||||
, KAKAO_FT_WIDE_IMG_PRICE AS kakaoFtWideImgPrice
|
||||
, FAX_PRICE AS faxPrice
|
||||
, USER_MONEY AS userMoney
|
||||
, USER_POINT AS userPoint
|
||||
@ -3601,9 +3605,9 @@
|
||||
, SUM(IF(M.msgTypeName = '알림톡', 1, 0)) AS atSendCount
|
||||
, SUM(IF(M.msgTypeName = '친구톡', 1, 0)) AS ftSendCount
|
||||
<!-- , SUM(M.MSG_GROUP_CNT) AS sendCount -->
|
||||
, ifnull(TRUNCATE(SUM(M.EACH_PRICE) , 0), 0) AS supplyPrice
|
||||
, ifnull(TRUNCATE(SUM(M.EACH_PRICE) , 1), 0) AS supplyPrice
|
||||
, 0 AS vatPrice
|
||||
, ifnull(TRUNCATE(SUM(M.EACH_PRICE) , 0), 0) AS totalPrice
|
||||
, ifnull(TRUNCATE(SUM(M.EACH_PRICE) , 1), 0) AS totalPrice
|
||||
, M.MSG_TYPE
|
||||
FROM (
|
||||
SELECT
|
||||
@ -3641,8 +3645,6 @@
|
||||
AND A.MSG_GROUP_ID = B.MSG_GROUP_ID
|
||||
AND A.USER_ID = #userId#
|
||||
AND B.USER_ID = #userId#
|
||||
AND B.DEL_FLAG = 'N'
|
||||
AND IFNULL(B.DEL_FLAG,'N') = 'N'
|
||||
AND B.RESERVE_C_YN = 'N'
|
||||
|
||||
<isNotEmpty property="startDate">
|
||||
@ -3670,6 +3672,9 @@
|
||||
<isEqual property="pageType" compareValue="at">
|
||||
AND B.MSG_TYPE = '8'
|
||||
</isEqual>
|
||||
<isEqual property="pageType" compareValue="ft">
|
||||
AND B.MSG_TYPE = '9'
|
||||
</isEqual>
|
||||
</isNotEmpty>
|
||||
) M
|
||||
WHERE 1=1
|
||||
@ -3685,9 +3690,9 @@
|
||||
, IFNULL(MIN(DATE_FORMAT(M.REQ_DATE, '%Y-%m-%d' )), 0) AS minRegDate
|
||||
, M.msgTypeName
|
||||
, IFNULL(SUM(SentEA), 0) AS ftSendCount
|
||||
, ifnull(TRUNCATE(SUM(supplyPrice) , 0), 0) AS supplyPrice
|
||||
, ifnull(TRUNCATE(SUM(supplyPrice) , 1), 0) AS supplyPrice
|
||||
, 0 AS vatPrice
|
||||
, ifnull(TRUNCATE(SUM(M.TOT_PRICE) , 0), 0) AS totalPrice
|
||||
, ifnull(TRUNCATE(SUM(M.TOT_PRICE) , 1), 0) AS totalPrice
|
||||
FROM (
|
||||
SELECT pf.ReqDate AS REGDATE
|
||||
, pf.ReqDate AS REQ_DATE
|
||||
@ -7435,6 +7440,17 @@
|
||||
|
||||
</update>
|
||||
|
||||
<update id="mjonMsgDAO.updateRefundY" parameterClass="mjonMsgVO">
|
||||
|
||||
UPDATE MJ_MSG_DATA
|
||||
SET REFUND_YN = 'Y'
|
||||
WHERE
|
||||
USER_ID = #userId#
|
||||
AND USERDATA = #userData#
|
||||
AND MSG_GROUP_ID = #msgGroupId#
|
||||
|
||||
</update>
|
||||
|
||||
<update id="mjonMsgDAO.updateKakaoAtDelayCancelMsgGroupDataFlag" parameterClass="mjonMsgVO">
|
||||
|
||||
UPDATE
|
||||
@ -8248,5 +8264,35 @@
|
||||
|
||||
</update>
|
||||
|
||||
<select id="mjonMsgDataDAO.selectBizResendLogList" resultClass="mjonMsgVO">
|
||||
|
||||
SELECT
|
||||
BRLA.CMID AS cmId,
|
||||
BRLA.CALL_STATUS AS resultCode,
|
||||
BRLB.USER_KEY AS userData
|
||||
FROM
|
||||
BIZ_RESEND_LOG BRLA
|
||||
JOIN
|
||||
BIZ_RESEND_LOG BRLB
|
||||
ON BRLB.UMID = BRLA.CMID
|
||||
WHERE (BRLA.UMID = '' OR BRLA.UMID IS NULL);
|
||||
|
||||
</select>
|
||||
|
||||
<update id="mjonMsgDataDAO.updateResendResult" parameterClass="mjonMsgVO" >
|
||||
|
||||
UPDATE MJ_MSG_DATA
|
||||
SET MSG_RESULT = #msgResult#
|
||||
WHERE USERDATA = #userData#
|
||||
|
||||
</update>
|
||||
|
||||
<delete id="mjonMsgDataDAO.deleteBizResendLog" parameterClass="mjonMsgVO" >
|
||||
|
||||
DELETE FROM BIZ_RESEND_LOG
|
||||
WHERE CMID = #cmId# OR UMID = #cmId#
|
||||
|
||||
</delete>
|
||||
|
||||
</sqlMap>
|
||||
|
||||
|
||||
@ -7,6 +7,7 @@
|
||||
<sqlMap namespace="Msg">
|
||||
<typeAlias alias="mjonMsgSWFDTO" type="itn.let.mjo.msgsent.service.MjonMsgSWFDTO"/>
|
||||
<typeAlias alias="mjonMsgDetailSentVO" type="itn.let.mjo.msgsent.service.MjonMsgDetailSentVO"/>
|
||||
<typeAlias alias="mjonMsgDetailSentDTO" type="itn.let.mjo.msgsent.service.MjonMsgDetailSentDTO"/>
|
||||
<typeAlias alias="mjonMsgSentVO" type="itn.let.mjo.msgsent.service.MjonMsgSentVO"/>
|
||||
<typeAlias alias="mjonMsgVO" type="itn.let.mjo.msg.service.MjonMsgVO"/>
|
||||
<typeAlias alias="addrGroupVO" type="itn.let.mjo.addr.service.AddrGroupVO"/>
|
||||
@ -389,7 +390,7 @@
|
||||
|
||||
|
||||
<!-- 전체 발송결과 조회 (전송사별)-->
|
||||
<select id="MjonMsgSentDAO.findByMsgDetailListAjax" parameterClass="mjonMsgDetailSentVO" resultClass="mjonMsgDetailSentVO">
|
||||
<select id="MjonMsgSentDAO.findByMsgDetailListAjax" parameterClass="mjonMsgDetailSentVO" resultClass="mjonMsgDetailSentDTO">
|
||||
/* MjonMsgSentDAO.findByMsgDetailListAjax*/
|
||||
|
||||
SELECT
|
||||
|
||||
@ -3,10 +3,11 @@
|
||||
========= ======= =================================================
|
||||
2021.03.01 신명섭
|
||||
-->
|
||||
<!DOCTYPE sqlMap PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN" "http://www.ibatis.com/dtd/sql-map-config-2.dtd">
|
||||
<!DOCTYPE sqlMap PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-2.dtd">
|
||||
<sqlMap namespace="Pay">
|
||||
<typeAlias alias="mjonPayVO" type="itn.let.mjo.pay.service.MjonPayVO"/>
|
||||
<typeAlias alias="stVcVO" type="itn.let.mjo.pay.service.StVcVO"/>
|
||||
<typeAlias alias="bizKakaoPriceVO" type="itn.let.kakao.kakaoComm.BizKakaoPriceVO"/>
|
||||
<typeAlias alias="mjonVaMsgLogVO" type="itn.let.mjo.pay.service.MjonVaMsgLogVO"/>
|
||||
|
||||
<!-- 공통 쿼리 부분 문자 발송 관련 -->
|
||||
@ -608,6 +609,7 @@
|
||||
MEMO,
|
||||
ORDER_ID,
|
||||
MSG_GROUP_ID
|
||||
|
||||
)VALUES
|
||||
(
|
||||
#userId#,
|
||||
@ -626,6 +628,22 @@
|
||||
</update>
|
||||
|
||||
|
||||
|
||||
<select id="mjonPayDAO.selectBizKakaoPrice" resultClass="bizKakaoPriceVO" parameterClass="String">
|
||||
SELECT
|
||||
BIZ_KAKAO_PRICE_ID AS bizKakaoPriceId,
|
||||
BIZ_KAKAO_AT_PRICE AS bizKakaoAtPrice,
|
||||
BIZ_KAKAO_FT_PRICE AS bizKakaoFtPrice,
|
||||
BIZ_KAKAO_FT_IMG_PRICE AS bizKakaoFtImgPrice,
|
||||
BIZ_KAKAO_FT_WIDE_IMG_PRICE AS bizKakaoFtWideImgPrice,
|
||||
BIZ_SMS_PRICE AS bizSmsPrice,
|
||||
BIZ_MMS_PRICE AS bizMmsPrice,
|
||||
MSG_GROUP_ID AS msgGroupId
|
||||
FROM BIZ_KAKAO_PRICE
|
||||
WHERE MSG_GROUP_ID = #msgGroupId#
|
||||
</select>
|
||||
|
||||
|
||||
<insert id="mjonPayDAO.insertMjPg" parameterClass="mjonPayVO">
|
||||
INSERT INTO MJ_PG
|
||||
(
|
||||
|
||||
@ -1367,6 +1367,7 @@
|
||||
LETTNGNRLMBER
|
||||
SET
|
||||
SMISHING_YN = #smishingYn#
|
||||
, AT_SMISHING_YN = #atSmishingYn#
|
||||
WHERE 1=1
|
||||
AND MBER_ID = #mberId#
|
||||
</update>
|
||||
|
||||
@ -1557,8 +1557,10 @@ function actionLogin_end(){
|
||||
<dd>
|
||||
<ul>
|
||||
<li><a href="<c:out value='/web/mjon/alimtalk/kakaoAlimtalkMsgDataView.do'/>">알림톡</a></li>
|
||||
<li><a href="<c:out value='/web/mjon/kakao/friendstalk/kakaoFriendsTalkMsgDataView.do'/>">친구톡</a></li>
|
||||
<li><a href="<c:out value='/web/mjon/kakao/stepinfo/selectKaKaoStepInfo.do'/>" >카카오톡 설정</a></li>
|
||||
<li><a href="<c:out value='/web/mjon/kakao/alimtalk/kakaoAlimtalkIntrdView.do'/>" >알림톡 소개</a></li>
|
||||
<%-- <li><a href="<c:out value='/web/mjon/kakao/alimtalk/kakaoAlimtalkIntrdView.do'/>" >알림톡 소개</a></li> --%>
|
||||
<li><a href="<c:out value='/web/mjon/kakao/alimtalk/kakaotalkIntrdView.do'/>" >카카오톡 소개</a></li>
|
||||
</ul>
|
||||
</dd>
|
||||
</dl>
|
||||
|
||||
@ -90,6 +90,6 @@ 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>
|
||||
<li id="tabSubFt" class="tab subTab"><button type="button" onclick="javascript:fnLinkPageTab('tabSubFt');">친구톡 템플릿 관리</button></li>
|
||||
|
||||
</ul>
|
||||
@ -60,9 +60,9 @@ function fnLinkPageTopTab(tabInfo){
|
||||
|
||||
url = "<c:url value='/web/mjon/kakao/friendstalk/kakaoFriendsTalkMsgDataView.do'/>";
|
||||
|
||||
}else if(tabInfo == 'tabAlimtalkIntrd'){
|
||||
}else if(tabInfo == 'tabKakaotalkIntrd'){
|
||||
|
||||
url = "<c:url value='/web/mjon/kakao/alimtalk/kakaoAlimtalkIntrdView.do'/>";
|
||||
url = "<c:url value='/web/mjon/kakao/alimtalk/kakaotalkIntrdView.do'/>";
|
||||
|
||||
}
|
||||
|
||||
@ -142,10 +142,7 @@ function cntntBtnInfo(stepInfo){
|
||||
|
||||
<ul class="tabType4">
|
||||
<li id="tabAt" class="tab topTab"><button type="button" onclick="javascript:fnLinkPageTopTab('tabAlim');">알림톡</button></li>
|
||||
<c:if test="${pageContext.request.serverName == 'localhost'
|
||||
|| pageContext.request.serverName == '119.193.215.98'}">
|
||||
<li id="tabFt" class="tab topTab"><button type="button" onclick="javascript:fnLinkPageTopTab('tabFriend');">친구톡</button></li>
|
||||
</c:if>
|
||||
<li id="tabFt" class="tab topTab"><button type="button" onclick="javascript:fnLinkPageTopTab('tabFriend');">친구톡</button></li>
|
||||
<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>
|
||||
<li id="tabIntro" class="tab topTab"><button type="button" onclick="javascript:fnLinkPageTopTab('tabKakaotalkIntrd');">카카오톡 소개</button></li>
|
||||
</ul>
|
||||
@ -17,281 +17,492 @@
|
||||
<%@include file="/WEB-INF/jsp/web/kakao/include/KaKaoAlimtalkTopMenuTap.jsp" %>
|
||||
<!--// tab button -->
|
||||
|
||||
<div class="top_content kakao_intro_cont current">
|
||||
|
||||
|
||||
<div class="top_content kakao_intro_cont pay_tab_wrap current">
|
||||
<div class="heading">
|
||||
<h2>알림톡 소개</h2>
|
||||
<h2>카카오톡 소개</h2>
|
||||
</div>
|
||||
|
||||
<div class="kakao_intro">
|
||||
<div class="title">
|
||||
<h3>알림톡이란?</h3>
|
||||
</div>
|
||||
|
||||
<div class="title-line">
|
||||
<div class="left-line"></div>
|
||||
<div class="right-line"></div>
|
||||
</div>
|
||||
|
||||
<div class="con">
|
||||
<!--설명-->
|
||||
<div class="intro">
|
||||
<img class="phone" src="/publish/images/kakao_intro_cont/phone.png" alt="핸드폰">
|
||||
<ul class="list">
|
||||
<li>
|
||||
<img src="/publish/images/kakao_intro_cont/text.png" alt="카카오톡 전용 기업 메시지 서비스 “알림톡”">
|
||||
</li>
|
||||
<li>
|
||||
<p>1</p>
|
||||
<p>1,000자 이내 <span>텍스트 및 이미지 전송 가능</span></p>
|
||||
</li>
|
||||
<li>
|
||||
<p>2</p>
|
||||
<p><span>문자 메시지 대비</span> 65% 이상 저렴</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>3</p>
|
||||
<p>
|
||||
<span>카톡 채널아이디를 추가하지 않은 이용자에게도</span>
|
||||
<br>전화번호만 있으면 메시지 전송 가능
|
||||
</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>4</p>
|
||||
<p><span>발송실패 시</span> 자동으로 문자 대체 발송</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>5</p>
|
||||
<p><span>카카오 인증마크를 통해</span> 신뢰도 높은 메시지 발송</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>6</p>
|
||||
<p><span>발신자 브랜드의 이미지 및 </span>신뢰도 상승 효과 달성</p>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<!--문자vs알림톡-->
|
||||
<div class="fight">
|
||||
<div class="line"></div>
|
||||
<div class="fight-title">
|
||||
<h4>문자 <span>VS</span> 알림톡</h4>
|
||||
<div class="circle"></div>
|
||||
</div>
|
||||
<div class="wrap">
|
||||
<div class="box box-01">
|
||||
<div class="fight-img">
|
||||
<p class="name">문자</p>
|
||||
<div class="icon">
|
||||
<img src="/publish/images/kakao_intro_cont/message.jpg.jpg" alt="문자">
|
||||
<p class="price">18원</p>
|
||||
</div>
|
||||
</div>
|
||||
<p class="vs">VS</p>
|
||||
<div class="fight-img kakao">
|
||||
<p class="name">알림톡</p>
|
||||
<div class="icon">
|
||||
<img src="/publish/images/kakao_intro_cont/kakao.jpg.jpg" alt="카카오">
|
||||
<p class="price">6.9원</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="text">
|
||||
<p>문자 대비 <span>65% 저렴</span></p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="fight-line"></div>
|
||||
<div class="box box-02">
|
||||
<div class="fight-img">
|
||||
<p class="name">문자</p>
|
||||
<div class="icon">
|
||||
<img src="/publish/images/kakao_intro_cont/message.jpg.jpg" alt="문자">
|
||||
<p class="price">90Byte</p>
|
||||
</div>
|
||||
</div>
|
||||
<p class="vs">VS</p>
|
||||
<div class="fight-img kakao">
|
||||
<p class="name">알림톡</p>
|
||||
<div class="icon">
|
||||
<img src="/publish/images/kakao_intro_cont/kakao.jpg.jpg" alt="카카오">
|
||||
<p class="price">1,000글자</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="text">
|
||||
<p>바이트(byte)에 관계없이 <span>무조건 1,000자(한/영) 발송</span></p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!--알림톡 활용 방법-->
|
||||
<div class="use">
|
||||
<div class="title">
|
||||
<h3>알림톡 활용 방법</h3>
|
||||
</div>
|
||||
<div class="title-line">
|
||||
<div class="left-line"></div>
|
||||
<div class="right-line"></div>
|
||||
</div>
|
||||
<div class="tab-wrap">
|
||||
<ul class="tabs">
|
||||
<li class="tab-link current" data-tab="tab-1">금융/보험</li>
|
||||
<li class="tab-link" data-tab="tab-2">기관/단체</li>
|
||||
<li class="tab-link" data-tab="tab-3">여행</li>
|
||||
<li class="tab-link" data-tab="tab-4">예약/예매</li>
|
||||
<li class="tab-link" data-tab="tab-5">배송/배달</li>
|
||||
<li class="tab-link" data-tab="tab-6">안내/이벤트</li>
|
||||
</ul>
|
||||
<div id="tab-1" class="tab-content current">
|
||||
<img src="/publish/images/kakao_intro_cont/bank.png" alt="금융,보험">
|
||||
</div>
|
||||
<div id="tab-2" class="tab-content">
|
||||
<img src="/publish/images/kakao_intro_cont/organization.png" alt="기관,단체">
|
||||
</div>
|
||||
<div id="tab-3" class="tab-content">
|
||||
<img src="/publish/images/kakao_intro_cont/travel.png" alt="여행">
|
||||
</div>
|
||||
<div id="tab-4" class="tab-content">
|
||||
<img src="/publish/images/kakao_intro_cont/reservation.png" alt="예약,예약">
|
||||
</div>
|
||||
<div id="tab-5" class="tab-content">
|
||||
<img src="/publish/images/kakao_intro_cont/delivery.png" alt="배송,배달">
|
||||
</div>
|
||||
<div id="tab-6" class="tab-content">
|
||||
<img src="/publish/images/kakao_intro_cont/event.png" alt="안내,이벤트">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<ul class="tabType1">
|
||||
<li class="tab active"><button type="button" onclick="contentTab(this,'1');">알림톡</button></li>
|
||||
<li class="tab"><button type="button" onclick="contentTab(this,'2');">친구톡</button></li>
|
||||
</ul>
|
||||
|
||||
<!--서비스이용방법-->
|
||||
<div class="service">
|
||||
<div class="title">
|
||||
<h3>서비스 이용 방법</h3>
|
||||
</div>
|
||||
<div class="title-line">
|
||||
<div class="left-line"></div>
|
||||
<div class="right-line"></div>
|
||||
</div>
|
||||
<div class="con first-line">
|
||||
<div class="service-01 common">
|
||||
<div class="step">
|
||||
<p>STEP <span>01</span></p>
|
||||
</div>
|
||||
<div class="text">
|
||||
<div class="btn">
|
||||
<a href="https://center-pf.kakao.com/" target="_blank">카카오톡 채널 가입하러 가기<img src="/publish/images/kakao_intro_cont/arrow.jpg" alt="화살표"></a>
|
||||
</div>
|
||||
<div class="text-line"></div>
|
||||
<div class="type">
|
||||
<p>
|
||||
카카오톡 채널을 먼저 가입해주신 다음 <br>
|
||||
비즈니스 채널 전환 신청을 해주세요.
|
||||
</p>
|
||||
<p>
|
||||
※ 가입 후 카카오톡 채널 설정에서 <br>
|
||||
공개, 검색허용 설정을 하셔야 합니다.
|
||||
</p>
|
||||
</div>
|
||||
<div class="icon">
|
||||
<img src="/publish/images/kakao_intro_cont/service_01.jpg" alt="카카오톡 채널 가입하러 가기 아이콘">
|
||||
</div>
|
||||
</div>
|
||||
<!-- 알림톡 소개 -->
|
||||
<div class="tab_content current" id="tab_content_1">
|
||||
<div class="kakao_intro">
|
||||
<div class="title">
|
||||
<h3>알림톡이란?</h3>
|
||||
</div>
|
||||
<div class="service-02 common">
|
||||
<div class="step">
|
||||
<p>STEP <span>02</span></p>
|
||||
|
||||
<div class="title-line">
|
||||
<div class="left-line"></div>
|
||||
<div class="right-line"></div>
|
||||
</div>
|
||||
|
||||
<div class="con">
|
||||
<!--설명-->
|
||||
<div class="intro">
|
||||
<img class="phone" src="/publish/images/kakao_intro_cont/phone.png" alt="핸드폰">
|
||||
<ul class="list">
|
||||
<li>
|
||||
<img src="/publish/images/kakao_intro_cont/text.png" alt="카카오톡 전용 기업 메시지 서비스 “알림톡”">
|
||||
</li>
|
||||
<li>
|
||||
<p>1</p>
|
||||
<p>1,000자 이내 <span>텍스트 및 이미지 전송 가능</span></p>
|
||||
</li>
|
||||
<li>
|
||||
<p>2</p>
|
||||
<p><span>문자 메시지 대비</span> 65% 이상 저렴</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>3</p>
|
||||
<p>
|
||||
<span>카톡 채널아이디를 추가하지 않은 이용자에게도</span>
|
||||
<br>전화번호만 있으면 메시지 전송 가능
|
||||
</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>4</p>
|
||||
<p><span>발송실패 시</span> 자동으로 문자 대체 발송</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>5</p>
|
||||
<p><span>카카오 인증마크를 통해</span> 신뢰도 높은 메시지 발송</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>6</p>
|
||||
<p><span>발신자 브랜드의 이미지 및 </span>신뢰도 상승 효과 달성</p>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="text">
|
||||
<div class="btn">
|
||||
<%-- <a href="<c:url value='/web/mjon/kakao/profile/selectKaKaoProfileList.do'/>">채널 ID 등록하러 가기<img src="/publish/images/kakao_intro_cont/arrow.jpg" alt="화살표"></a> --%>
|
||||
<a href="javascript:cntntBtnInfo('step02');">채널 ID 등록하러 가기<img src="/publish/images/kakao_intro_cont/arrow.jpg" alt="화살표"></a>
|
||||
|
||||
<!--문자vs알림톡-->
|
||||
<div class="fight">
|
||||
<div class="line"></div>
|
||||
<div class="fight-title">
|
||||
<h4>문자 <span>VS</span> 알림톡</h4>
|
||||
<div class="circle"></div>
|
||||
</div>
|
||||
<div class="text-line"></div>
|
||||
<div class="type">
|
||||
<p>
|
||||
가입하신 카카오톡 채널의 채널ID(채널이름)를 <br>
|
||||
채널ID 등록 메뉴에 등록해주세요.
|
||||
</p>
|
||||
</div>
|
||||
<div class="icon">
|
||||
<img src="/publish/images/kakao_intro_cont/service_02.jpg" alt="채널 ID 등록하러 가기 아이콘">
|
||||
<div class="wrap">
|
||||
<div class="box box-01">
|
||||
<div class="fight-img">
|
||||
<p class="name">문자</p>
|
||||
<div class="icon">
|
||||
<img src="/publish/images/kakao_intro_cont/message.jpg.jpg" alt="문자">
|
||||
<p class="price">18원</p>
|
||||
</div>
|
||||
</div>
|
||||
<p class="vs">VS</p>
|
||||
<div class="fight-img kakao">
|
||||
<p class="name">알림톡</p>
|
||||
<div class="icon">
|
||||
<img src="/publish/images/kakao_intro_cont/kakao.jpg.jpg" alt="카카오">
|
||||
<p class="price">6.9원</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="text">
|
||||
<p>문자 대비 <span>65% 저렴</span></p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="fight-line"></div>
|
||||
<div class="box box-02">
|
||||
<div class="fight-img">
|
||||
<p class="name">문자</p>
|
||||
<div class="icon">
|
||||
<img src="/publish/images/kakao_intro_cont/message.jpg.jpg" alt="문자">
|
||||
<p class="price">90Byte</p>
|
||||
</div>
|
||||
</div>
|
||||
<p class="vs">VS</p>
|
||||
<div class="fight-img kakao">
|
||||
<p class="name">알림톡</p>
|
||||
<div class="icon">
|
||||
<img src="/publish/images/kakao_intro_cont/kakao.jpg.jpg" alt="카카오">
|
||||
<p class="price">1,000글자</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="text">
|
||||
<p>바이트(byte)에 관계없이 <span>무조건 1,000자(한/영) 발송</span></p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="con second-line">
|
||||
<div class="service-03 common">
|
||||
<div class="step">
|
||||
<p>STEP <span>03</span></p>
|
||||
</div>
|
||||
<div class="text">
|
||||
<div class="btn">
|
||||
<%-- <a href="<c:url value='/web/mjon/kakao/template/selectKaKaoTemplateList.do'/>">알림톡 템플릿 등록하러 가기<img src="/publish/images/kakao_intro_cont/arrow.jpg" alt="화살표"></a> --%>
|
||||
<a href="javascript:cntntBtnInfo('step03');">알림톡 템플릿 등록하러 가기<img src="/publish/images/kakao_intro_cont/arrow.jpg" alt="화살표"></a>
|
||||
</div>
|
||||
<div class="text-line"></div>
|
||||
<div class="type">
|
||||
<p>
|
||||
알림톡 발송을 위해서는 사용하실 템플릿(메시지 내용)에
|
||||
대한 카카오의 승인이 반드시 필요합니다.
|
||||
템플릿을 작성하신 후 심사요청을 진행해주세요.
|
||||
</p>
|
||||
<p>
|
||||
※ 템플릿 승인까지 최대 3일 소요
|
||||
</p>
|
||||
</div>
|
||||
<div class="icon">
|
||||
<img src="/publish/images/kakao_intro_cont/service_03.jpg" alt="알림톡 템플릿 등록하러 가기 아이콘">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!--알림톡 활용 방법-->
|
||||
<div class="use">
|
||||
<div class="title">
|
||||
<h3>알림톡 활용 방법</h3>
|
||||
</div>
|
||||
<div class="service-04 common">
|
||||
<div class="step">
|
||||
<p>STEP <span>04</span></p>
|
||||
<div class="title-line">
|
||||
<div class="left-line"></div>
|
||||
<div class="right-line"></div>
|
||||
</div>
|
||||
<div class="tab-wrap">
|
||||
<ul class="tabs">
|
||||
<li class="tab-link current" data-tab="tab-1">금융/보험</li>
|
||||
<li class="tab-link" data-tab="tab-2">기관/단체</li>
|
||||
<li class="tab-link" data-tab="tab-3">여행</li>
|
||||
<li class="tab-link" data-tab="tab-4">예약/예매</li>
|
||||
<li class="tab-link" data-tab="tab-5">배송/배달</li>
|
||||
<li class="tab-link" data-tab="tab-6">안내/이벤트</li>
|
||||
</ul>
|
||||
<div id="tab-1" class="tab-content current">
|
||||
<img src="/publish/images/kakao_intro_cont/bank.png" alt="금융,보험">
|
||||
</div>
|
||||
<div class="text">
|
||||
<div class="btn">
|
||||
<a href="<c:url value='/web/mjon/alimtalk/kakaoAlimtalkMsgDataView.do'/>">알림톡 전송하기<img src="/publish/images/kakao_intro_cont/arrow.jpg" alt="화살표"></a>
|
||||
</div>
|
||||
<div class="text-line"></div>
|
||||
<div class="type">
|
||||
<p>
|
||||
템플릿이 승인되셨다면 문자온 알림톡을 <br>
|
||||
통해 메시지를 발송하실 수 있습니다.
|
||||
</p>
|
||||
</div>
|
||||
<div class="icon">
|
||||
<img src="/publish/images/kakao_intro_cont/service_04.jpg" alt="알림톡 전송하기 아이콘">
|
||||
</div>
|
||||
<div id="tab-2" class="tab-content">
|
||||
<img src="/publish/images/kakao_intro_cont/organization.png" alt="기관,단체">
|
||||
</div>
|
||||
<div id="tab-3" class="tab-content">
|
||||
<img src="/publish/images/kakao_intro_cont/travel.png" alt="여행">
|
||||
</div>
|
||||
<div id="tab-4" class="tab-content">
|
||||
<img src="/publish/images/kakao_intro_cont/reservation.png" alt="예약,예약">
|
||||
</div>
|
||||
<div id="tab-5" class="tab-content">
|
||||
<img src="/publish/images/kakao_intro_cont/delivery.png" alt="배송,배달">
|
||||
</div>
|
||||
<div id="tab-6" class="tab-content">
|
||||
<img src="/publish/images/kakao_intro_cont/event.png" alt="안내,이벤트">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!--이용가이드 버튼-->
|
||||
<div class="guide">
|
||||
<a href="https://kakaobusiness.gitbook.io/main/ad/bizmessage/notice-friend" target="_blank">알림톡 이용가이드 보기 <img src="/publish/images/kakao_intro_cont/guide_arrow.png" alt="알림톡 이용가이드 화살표"></a>
|
||||
|
||||
<!--서비스이용방법-->
|
||||
<div class="service">
|
||||
<div class="title">
|
||||
<h3>서비스 이용 방법</h3>
|
||||
</div>
|
||||
<div class="title-line">
|
||||
<div class="left-line"></div>
|
||||
<div class="right-line"></div>
|
||||
</div>
|
||||
<div class="con first-line">
|
||||
<div class="service-01 common">
|
||||
<div class="step">
|
||||
<p>STEP <span>01</span></p>
|
||||
</div>
|
||||
<div class="text">
|
||||
<div class="btn">
|
||||
<a href="https://center-pf.kakao.com/" target="_blank">카카오톡 채널 가입하러 가기<img src="/publish/images/kakao_intro_cont/arrow.jpg" alt="화살표"></a>
|
||||
</div>
|
||||
<div class="text-line"></div>
|
||||
<div class="type">
|
||||
<p>
|
||||
카카오톡 채널을 먼저 가입해주신 다음 <br>
|
||||
비즈니스 채널 전환 신청을 해주세요.
|
||||
</p>
|
||||
<p>
|
||||
※ 가입 후 카카오톡 채널 설정에서 <br>
|
||||
공개, 검색허용 설정을 하셔야 합니다.
|
||||
</p>
|
||||
</div>
|
||||
<div class="icon">
|
||||
<img src="/publish/images/kakao_intro_cont/service_01.jpg" alt="카카오톡 채널 가입하러 가기 아이콘">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="service-02 common">
|
||||
<div class="step">
|
||||
<p>STEP <span>02</span></p>
|
||||
</div>
|
||||
<div class="text">
|
||||
<div class="btn">
|
||||
<%-- <a href="<c:url value='/web/mjon/kakao/profile/selectKaKaoProfileList.do'/>">채널 ID 등록하러 가기<img src="/publish/images/kakao_intro_cont/arrow.jpg" alt="화살표"></a> --%>
|
||||
<a href="javascript:cntntBtnInfo('step02');">채널 ID 등록하러 가기<img src="/publish/images/kakao_intro_cont/arrow.jpg" alt="화살표"></a>
|
||||
</div>
|
||||
<div class="text-line"></div>
|
||||
<div class="type">
|
||||
<p>
|
||||
가입하신 카카오톡 채널의 채널ID(채널이름)를 <br>
|
||||
채널ID 등록 메뉴에 등록해주세요.
|
||||
</p>
|
||||
</div>
|
||||
<div class="icon">
|
||||
<img src="/publish/images/kakao_intro_cont/service_02.jpg" alt="채널 ID 등록하러 가기 아이콘">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="con second-line">
|
||||
<div class="service-03 common">
|
||||
<div class="step">
|
||||
<p>STEP <span>03</span></p>
|
||||
</div>
|
||||
<div class="text">
|
||||
<div class="btn">
|
||||
<%-- <a href="<c:url value='/web/mjon/kakao/template/selectKaKaoTemplateList.do'/>">알림톡 템플릿 등록하러 가기<img src="/publish/images/kakao_intro_cont/arrow.jpg" alt="화살표"></a> --%>
|
||||
<a href="javascript:cntntBtnInfo('step03');">알림톡 템플릿 등록하러 가기<img src="/publish/images/kakao_intro_cont/arrow.jpg" alt="화살표"></a>
|
||||
</div>
|
||||
<div class="text-line"></div>
|
||||
<div class="type">
|
||||
<p>
|
||||
알림톡 발송을 위해서는 사용하실 템플릿(메시지 내용)에
|
||||
대한 카카오의 승인이 반드시 필요합니다.
|
||||
템플릿을 작성하신 후 심사요청을 진행해주세요.
|
||||
</p>
|
||||
<p>
|
||||
※ 템플릿 승인까지 최대 3일 소요
|
||||
</p>
|
||||
</div>
|
||||
<div class="icon">
|
||||
<img src="/publish/images/kakao_intro_cont/service_03.jpg" alt="알림톡 템플릿 등록하러 가기 아이콘">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="service-04 common">
|
||||
<div class="step">
|
||||
<p>STEP <span>04</span></p>
|
||||
</div>
|
||||
<div class="text">
|
||||
<div class="btn">
|
||||
<a href="<c:url value='/web/mjon/alimtalk/kakaoAlimtalkMsgDataView.do'/>">알림톡 전송하기<img src="/publish/images/kakao_intro_cont/arrow.jpg" alt="화살표"></a>
|
||||
</div>
|
||||
<div class="text-line"></div>
|
||||
<div class="type">
|
||||
<p>
|
||||
템플릿이 승인되셨다면 문자온 알림톡을 <br>
|
||||
통해 메시지를 발송하실 수 있습니다.
|
||||
</p>
|
||||
</div>
|
||||
<div class="icon">
|
||||
<img src="/publish/images/kakao_intro_cont/service_04.jpg" alt="알림톡 전송하기 아이콘">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!--이용가이드 버튼-->
|
||||
<div class="guide">
|
||||
<a href="https://kakaobusiness.gitbook.io/main/ad/bizmessage/notice-friend" target="_blank">알림톡 이용가이드 보기 <img src="/publish/images/kakao_intro_cont/guide_arrow.png" alt="알림톡 이용가이드 화살표"></a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!--유의사항-->
|
||||
<div class="note">
|
||||
<div class="note-title">
|
||||
<p>
|
||||
<span>
|
||||
<img src="/publish/images/kakao_intro_cont/note_icon.png" alt="유의사항 아이콘">
|
||||
</span>유의사항
|
||||
</p>
|
||||
</div>
|
||||
<ul>
|
||||
<li>- 한글, 영문 구분 없이 최대 1,000자까지 전송 가능합니다.</li>
|
||||
<li>- 알림톡 발송 실패에 따른 대체문자 발송 시 문자요금(단문, 장문, 그림)이 보유 캐시에서 차감됩니다.</li>
|
||||
<li>- 알림톡에서 허용하는 영리목적이 없는 정보성 메시지에 해당하는지 여부는 스팸 관련 정보통신망법 안내서를 꼭 참고하시길 바랍니다.</li>
|
||||
<li>(주문/예약 확인, 결제 내역, 배송 현황 메시지 등이 이에 해당하며 구독자 대상의 뉴스레터나 일반적인 공지문은 포함되지 않습니다.)</li>
|
||||
<li>
|
||||
<a href="/download/msg/K003_불법스팸_방지_안내서_제6차_개정판(수정_2024년).pdf" target="_blank">스팸 관련 정보통신망법 안내서 바로가기</a>
|
||||
</li>
|
||||
<li>- 부고, 답례, 초대장 등은 정보성 메시지가 아니므로 알림톡으로 보내실 수 없습니다. </li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!--유의사항-->
|
||||
<div class="note">
|
||||
<div class="note-title">
|
||||
<p>
|
||||
<span>
|
||||
<img src="/publish/images/kakao_intro_cont/note_icon.png" alt="유의사항 아이콘">
|
||||
</span>유의사항
|
||||
</p>
|
||||
<!-- // 알림톡 소개 -->
|
||||
|
||||
<!-- 친구톡 소개 -->
|
||||
<div class="tab_content friendtalk" id="tab_content_2">
|
||||
<div class="kakao_intro">
|
||||
<div class="title">
|
||||
<h3>친구톡이란?</h3>
|
||||
</div>
|
||||
|
||||
<div class="title-line">
|
||||
<div class="left-line"></div>
|
||||
<div class="right-line"></div>
|
||||
</div>
|
||||
|
||||
<div class="con">
|
||||
<!--설명-->
|
||||
<div class="intro">
|
||||
<img class="phone" src="/publish/images/kakao_intro_cont/phone_friendtalk.png" alt="핸드폰">
|
||||
|
||||
<ul class="list">
|
||||
<li>
|
||||
<img src="/publish/images/kakao_intro_cont/text_friendtalk.png" alt="카카오톡 전용 기업 메시지 서비스 “알림톡”">
|
||||
</li>
|
||||
<li>
|
||||
<p>1</p>
|
||||
<p><span>광고성 메시지</span> 발송 가능(광고 표기 및 수신거부 안내 포함)</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>2</p>
|
||||
<p>채널 친구 추가된 사용자라면 <span>누구에게나</span> 발송 가능</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>3</p>
|
||||
<p><span>1,000자 이내</span> 텍스트 및 <span>이미지</span> 전송 가능</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>4</p>
|
||||
<p><span>맞춤형 메시지 및 쿠폰, 링크</span> 버튼 제공 가능</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>5</p>
|
||||
<p>문자 메시지 대비 <span>O % 이상</span> 저렴</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>6</p>
|
||||
<p>발송실패 시 <span>대체문자 발송</span> 기능 지원</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>7</p>
|
||||
<p>클릭률/도달률 분석을 통한 <span>마케팅 효율 강화</span></p>
|
||||
</li>
|
||||
<li>
|
||||
<p>8</p>
|
||||
<p>브랜드 친화적인 <span>이미지 커스터마이징</span> 가능</p>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<!--문자vs알림톡-->
|
||||
<div class="fight">
|
||||
<div class="line"></div>
|
||||
<div class="fight-title">
|
||||
<h4>알림톡 <span>VS</span> 친구톡</h4>
|
||||
<div class="circle"></div>
|
||||
</div>
|
||||
|
||||
<div class="wrap">
|
||||
<div class="vs allimtalk_vs">
|
||||
<div class="title">알림톡</div>
|
||||
<div class="box">
|
||||
<ul>
|
||||
<li>전화번호 보유자</li>
|
||||
<li>정보성 <span>(예 : 주문, 예약, 안내 등)</span></li>
|
||||
<li>텍스트, 이미지 등</li>
|
||||
<li>최대 5개</li>
|
||||
<li>사전 승인 필요</li>
|
||||
<li>6.9원</li>
|
||||
<li>1,000자</li>
|
||||
<li>로고, 아이콘 형식만 가능</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="vs vs_title">
|
||||
<div class="title">VS</div>
|
||||
<ul>
|
||||
<li>전송대상</li>
|
||||
<li>발송목적</li>
|
||||
<li>메세지 형태</li>
|
||||
<li>버튼 사용</li>
|
||||
<li>템플릿 승인</li>
|
||||
<li>비용</li>
|
||||
<li>길이제한</li>
|
||||
<li>이미지</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="vs friendtalk_vs">
|
||||
<div class="title">친구톡</div>
|
||||
<div class="box">
|
||||
<ul>
|
||||
<li>채널 친구</li>
|
||||
<li>광고 및 마케팅성<span>(예 : 이벤트, 쿠폰 등)</span></li>
|
||||
<li>텍스트, 기본이미지, 와이드 이미지형 등</li>
|
||||
<li>최대 5개</li>
|
||||
<li>별도 승인 없음 <span>야간 발송 제한(20:50 ~ 익일 08:00)</span></li>
|
||||
<li>0.0원 ~ 0.0원</li>
|
||||
<li>1,000자</li>
|
||||
<li>가능</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 친구톡 유형 -->
|
||||
<div class="use">
|
||||
<div class="title">
|
||||
<h3>친구톡 유형</h3>
|
||||
</div>
|
||||
|
||||
<div class="title-line">
|
||||
<div class="left-line"></div>
|
||||
<div class="right-line"></div>
|
||||
</div>
|
||||
|
||||
<ul class="friendtalk_use">
|
||||
<li>
|
||||
<div class="title">텍스트형</div>
|
||||
<img src="/publish/images/kakao_intro_cont/friendtalk_use1.png" alt="">
|
||||
<p class="explan_text">한/영 구분없이 <span>1,000자</span> + 버튼 <span>최대 5개</span></p>
|
||||
</li>
|
||||
<li>
|
||||
<div class="title">기본 이미지형</div>
|
||||
<img src="/publish/images/kakao_intro_cont/friendtalk_use2.png" alt="">
|
||||
<p class="explan_text">한/영 구분없이 <span>400자</span> + 이미지 <span>1</span>장 + 버튼 <span>최대 5개</span></p>
|
||||
</li>
|
||||
<li>
|
||||
<div class="title">와이드 이미지형</div>
|
||||
<img src="/publish/images/kakao_intro_cont/friendtalk_use3.png" alt="">
|
||||
<p class="explan_text">한/영 구분없이 <span>76자</span> + 이미지 <span>1</span>장 + 버튼 <span>최대 1개</span></p>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<!--서비스이용방법-->
|
||||
<div class="service">
|
||||
<div class="title">
|
||||
<h3>서비스 이용 방법</h3>
|
||||
</div>
|
||||
|
||||
<div class="title-line">
|
||||
<div class="left-line"></div>
|
||||
<div class="right-line"></div>
|
||||
</div>
|
||||
|
||||
<ul class="kakao_use_guide">
|
||||
<li class="guide_01">
|
||||
<div class="title">STEP <span>01</span></div>
|
||||
<i></i>
|
||||
<p class="guide_title">카카오톡 채널 가입</p>
|
||||
<span class="guide_info">카카오톡 채널 생성을 위한 <br> 계정이 없으시다면, 카카오에서 <br> 카카오톡 비즈니스 회원가입을<br> 먼저 진행해주세요.</span>
|
||||
</li>
|
||||
<li class="guide_02">
|
||||
<div class="title">STEP <span>02</span></div>
|
||||
<i></i>
|
||||
<p class="guide_title">채널 ID 등록하러 가기</p>
|
||||
<span class="guide_info">가입하신 카카오톡 채널의 채널 ID(채널이름)를 채널 ID 등록 메뉴에 등록해주세요.</span>
|
||||
</li>
|
||||
<li class="guide_03">
|
||||
<div class="title">STEP <span>03</span></div>
|
||||
<i></i>
|
||||
<p class="guide_title">친구톡 전송</p>
|
||||
<span class="guide_info">친구톡은 별도의 템플릿 심사 절차 없이, 즉시 발송 가능합니다.</span>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<!--이용가이드 버튼-->
|
||||
<div class="guide">
|
||||
<a href="https://kakaobusiness.gitbook.io/main/ad/brandmessage" target="_blank">친구톡 이용가이드 보기 <img src="/publish/images/kakao_intro_cont/guide_arrow.png" alt="알림톡 이용가이드 화살표"></a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!--유의사항-->
|
||||
<div class="note">
|
||||
<div class="note-title">
|
||||
<p><span><img src="/publish/images/kakao_intro_cont/note_icon.png" alt="유의사항 아이콘"></span>유의사항</p>
|
||||
</div>
|
||||
<ul>
|
||||
<li>- (광고) 표기 여부는 선택 가능하나 , (광고)표기 해제에 따른 법령상 의무사항을 미 준수시에는 메시지 발송이 중단될 수 있습니다.</li>
|
||||
<li>- 광고성 친구톡 메시지에는 “(광고) 표시 및 수신거부 방식”이 표시되며, 대체 문자의 경우에는 “(광고) 문구 및 080 무료수신거부 번호”가 자동으로 포함됩니다.</li>
|
||||
<li><b>- 광고성 메시지의 발송 가능 시간은 08:00 ~ 20:50(한국시간) 입니다.</b></li>
|
||||
<li>- 친구톡 발송 실패에 따른 대체문자 발송 시 문자요금(단문, 장문, 그림)이 보유 캐시에서 차감됩니다.</li>
|
||||
<li>- 카카오정책 및 심의기준을 반드시 준수하여야 합니다.</li>
|
||||
</ul>
|
||||
</div>
|
||||
<ul>
|
||||
<li>- 한글, 영문 구분 없이 최대 1,000자까지 전송 가능합니다.</li>
|
||||
<li>- 알림톡 발송 실패에 따른 대체문자 발송 시 문자요금(단문, 장문, 그림)이 보유 캐시에서 차감됩니다.</li>
|
||||
<li>- 알림톡에서 허용하는 영리목적이 없는 정보성 메시지에 해당하는지 여부는 스팸 관련 정보통신망법 안내서를 꼭 참고하시길 바랍니다.</li>
|
||||
<li>(주문/예약 확인, 결제 내역, 배송 현황 메시지 등이 이에 해당하며 구독자 대상의 뉴스레터나 일반적인 공지문은 포함되지 않습니다.)</li>
|
||||
<li>
|
||||
<a href="/download/msg/K003_불법스팸_방지_안내서_제6차_개정판(수정_2024년).pdf" target="_blank">스팸 관련 정보통신망법 안내서 바로가기</a>
|
||||
</li>
|
||||
<li>- 부고, 답례, 초대장 등은 정보성 메시지가 아니므로 알림톡으로 보내실 수 없습니다. </li>
|
||||
</ul>
|
||||
</div>
|
||||
<!-- // 친구톡 소개 -->
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
509
src/main/webapp/WEB-INF/jsp/web/kakao/intrd/KakaotalkIntro.jsp
Normal file
509
src/main/webapp/WEB-INF/jsp/web/kakao/intrd/KakaotalkIntro.jsp
Normal file
@ -0,0 +1,509 @@
|
||||
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
|
||||
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
|
||||
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
|
||||
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
|
||||
<%@ taglib prefix="ec" uri="/WEB-INF/tld/ecnet_tld.tld"%>
|
||||
<%@ page import="itn.com.cmm.LoginVO" %>
|
||||
|
||||
|
||||
<form id="bizForm" name="bizForm" method="post">
|
||||
<input type="hidden" id="menuTopTab" name="menuTopTab" value="tabIntro">
|
||||
</form>
|
||||
|
||||
<div class="inner">
|
||||
<!-- send top -->
|
||||
<div class="send_top">
|
||||
<!-- tab button -->
|
||||
<%@include file="/WEB-INF/jsp/web/kakao/include/KaKaoAlimtalkTopMenuTap.jsp" %>
|
||||
<!--// tab button -->
|
||||
|
||||
|
||||
|
||||
<div class="top_content kakao_intro_cont pay_tab_wrap current">
|
||||
<div class="heading">
|
||||
<h2>카카오톡 소개</h2>
|
||||
</div>
|
||||
|
||||
<ul class="tabType1">
|
||||
<li class="tab active"><button type="button" onclick="contentTab(this,'1');">알림톡</button></li>
|
||||
<li class="tab"><button type="button" onclick="contentTab(this,'2');">친구톡</button></li>
|
||||
</ul>
|
||||
|
||||
<!-- 알림톡 소개 -->
|
||||
<div class="tab_content current" id="tab_content_1">
|
||||
<div class="kakao_intro">
|
||||
<div class="title">
|
||||
<h3>알림톡이란?</h3>
|
||||
</div>
|
||||
|
||||
<div class="title-line">
|
||||
<div class="left-line"></div>
|
||||
<div class="right-line"></div>
|
||||
</div>
|
||||
|
||||
<div class="con">
|
||||
<!--설명-->
|
||||
<div class="intro">
|
||||
<img class="phone" src="/publish/images/kakao_intro_cont/phone.png" alt="핸드폰">
|
||||
<ul class="list">
|
||||
<li>
|
||||
<img src="/publish/images/kakao_intro_cont/text.png" alt="카카오톡 전용 기업 메시지 서비스 “알림톡”">
|
||||
</li>
|
||||
<li>
|
||||
<p>1</p>
|
||||
<p>1,000자 이내 <span>텍스트 및 이미지 전송 가능</span></p>
|
||||
</li>
|
||||
<li>
|
||||
<p>2</p>
|
||||
<p><span>문자 메시지 대비</span> 65% 이상 저렴</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>3</p>
|
||||
<p>
|
||||
<span>카톡 채널아이디를 추가하지 않은 이용자에게도</span>
|
||||
<br>전화번호만 있으면 메시지 전송 가능
|
||||
</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>4</p>
|
||||
<p><span>발송실패 시</span> 자동으로 문자 대체 발송</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>5</p>
|
||||
<p><span>카카오 인증마크를 통해</span> 신뢰도 높은 메시지 발송</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>6</p>
|
||||
<p><span>발신자 브랜드의 이미지 및 </span>신뢰도 상승 효과 달성</p>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<!--문자vs알림톡-->
|
||||
<div class="fight">
|
||||
<div class="line"></div>
|
||||
<div class="fight-title">
|
||||
<h4>문자 <span>VS</span> 알림톡</h4>
|
||||
<div class="circle"></div>
|
||||
</div>
|
||||
<div class="wrap">
|
||||
<div class="box box-01">
|
||||
<div class="fight-img">
|
||||
<p class="name">문자</p>
|
||||
<div class="icon">
|
||||
<img src="/publish/images/kakao_intro_cont/message.jpg.jpg" alt="문자">
|
||||
<p class="price">18원</p>
|
||||
</div>
|
||||
</div>
|
||||
<p class="vs">VS</p>
|
||||
<div class="fight-img kakao">
|
||||
<p class="name">알림톡</p>
|
||||
<div class="icon">
|
||||
<img src="/publish/images/kakao_intro_cont/kakao.jpg.jpg" alt="카카오">
|
||||
<p class="price">6.9원</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="text">
|
||||
<p>문자 대비 <span>65% 저렴</span></p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="fight-line"></div>
|
||||
<div class="box box-02">
|
||||
<div class="fight-img">
|
||||
<p class="name">문자</p>
|
||||
<div class="icon">
|
||||
<img src="/publish/images/kakao_intro_cont/message.jpg.jpg" alt="문자">
|
||||
<p class="price">90Byte</p>
|
||||
</div>
|
||||
</div>
|
||||
<p class="vs">VS</p>
|
||||
<div class="fight-img kakao">
|
||||
<p class="name">알림톡</p>
|
||||
<div class="icon">
|
||||
<img src="/publish/images/kakao_intro_cont/kakao.jpg.jpg" alt="카카오">
|
||||
<p class="price">1,000글자</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="text">
|
||||
<p>바이트(byte)에 관계없이 <span>무조건 1,000자(한/영) 발송</span></p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!--알림톡 활용 방법-->
|
||||
<div class="use">
|
||||
<div class="title">
|
||||
<h3>알림톡 활용 방법</h3>
|
||||
</div>
|
||||
<div class="title-line">
|
||||
<div class="left-line"></div>
|
||||
<div class="right-line"></div>
|
||||
</div>
|
||||
<div class="tab-wrap">
|
||||
<ul class="tabs">
|
||||
<li class="tab-link current" data-tab="tab-1">금융/보험</li>
|
||||
<li class="tab-link" data-tab="tab-2">기관/단체</li>
|
||||
<li class="tab-link" data-tab="tab-3">여행</li>
|
||||
<li class="tab-link" data-tab="tab-4">예약/예매</li>
|
||||
<li class="tab-link" data-tab="tab-5">배송/배달</li>
|
||||
<li class="tab-link" data-tab="tab-6">안내/이벤트</li>
|
||||
</ul>
|
||||
<div id="tab-1" class="tab-content current">
|
||||
<img src="/publish/images/kakao_intro_cont/bank.png" alt="금융,보험">
|
||||
</div>
|
||||
<div id="tab-2" class="tab-content">
|
||||
<img src="/publish/images/kakao_intro_cont/organization.png" alt="기관,단체">
|
||||
</div>
|
||||
<div id="tab-3" class="tab-content">
|
||||
<img src="/publish/images/kakao_intro_cont/travel.png" alt="여행">
|
||||
</div>
|
||||
<div id="tab-4" class="tab-content">
|
||||
<img src="/publish/images/kakao_intro_cont/reservation.png" alt="예약,예약">
|
||||
</div>
|
||||
<div id="tab-5" class="tab-content">
|
||||
<img src="/publish/images/kakao_intro_cont/delivery.png" alt="배송,배달">
|
||||
</div>
|
||||
<div id="tab-6" class="tab-content">
|
||||
<img src="/publish/images/kakao_intro_cont/event.png" alt="안내,이벤트">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!--서비스이용방법-->
|
||||
<div class="service">
|
||||
<div class="title">
|
||||
<h3>서비스 이용 방법</h3>
|
||||
</div>
|
||||
<div class="title-line">
|
||||
<div class="left-line"></div>
|
||||
<div class="right-line"></div>
|
||||
</div>
|
||||
<div class="con first-line">
|
||||
<div class="service-01 common">
|
||||
<div class="step">
|
||||
<p>STEP <span>01</span></p>
|
||||
</div>
|
||||
<div class="text">
|
||||
<div class="btn">
|
||||
<a href="https://center-pf.kakao.com/" target="_blank">카카오톡 채널 가입하러 가기<img src="/publish/images/kakao_intro_cont/arrow.jpg" alt="화살표"></a>
|
||||
</div>
|
||||
<div class="text-line"></div>
|
||||
<div class="type">
|
||||
<p>
|
||||
카카오톡 채널을 먼저 가입해주신 다음 <br>
|
||||
비즈니스 채널 전환 신청을 해주세요.
|
||||
</p>
|
||||
<p>
|
||||
※ 가입 후 카카오톡 채널 설정에서 <br>
|
||||
공개, 검색허용 설정을 하셔야 합니다.
|
||||
</p>
|
||||
</div>
|
||||
<div class="icon">
|
||||
<img src="/publish/images/kakao_intro_cont/service_01.jpg" alt="카카오톡 채널 가입하러 가기 아이콘">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="service-02 common">
|
||||
<div class="step">
|
||||
<p>STEP <span>02</span></p>
|
||||
</div>
|
||||
<div class="text">
|
||||
<div class="btn">
|
||||
<%-- <a href="<c:url value='/web/mjon/kakao/profile/selectKaKaoProfileList.do'/>">채널 ID 등록하러 가기<img src="/publish/images/kakao_intro_cont/arrow.jpg" alt="화살표"></a> --%>
|
||||
<a href="javascript:cntntBtnInfo('step02');">채널 ID 등록하러 가기<img src="/publish/images/kakao_intro_cont/arrow.jpg" alt="화살표"></a>
|
||||
</div>
|
||||
<div class="text-line"></div>
|
||||
<div class="type">
|
||||
<p>
|
||||
가입하신 카카오톡 채널의 채널ID(채널이름)를 <br>
|
||||
채널ID 등록 메뉴에 등록해주세요.
|
||||
</p>
|
||||
</div>
|
||||
<div class="icon">
|
||||
<img src="/publish/images/kakao_intro_cont/service_02.jpg" alt="채널 ID 등록하러 가기 아이콘">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="con second-line">
|
||||
<div class="service-03 common">
|
||||
<div class="step">
|
||||
<p>STEP <span>03</span></p>
|
||||
</div>
|
||||
<div class="text">
|
||||
<div class="btn">
|
||||
<%-- <a href="<c:url value='/web/mjon/kakao/template/selectKaKaoTemplateList.do'/>">알림톡 템플릿 등록하러 가기<img src="/publish/images/kakao_intro_cont/arrow.jpg" alt="화살표"></a> --%>
|
||||
<a href="javascript:cntntBtnInfo('step03');">알림톡 템플릿 등록하러 가기<img src="/publish/images/kakao_intro_cont/arrow.jpg" alt="화살표"></a>
|
||||
</div>
|
||||
<div class="text-line"></div>
|
||||
<div class="type">
|
||||
<p>
|
||||
알림톡 발송을 위해서는 사용하실 템플릿(메시지 내용)에
|
||||
대한 카카오의 승인이 반드시 필요합니다.
|
||||
템플릿을 작성하신 후 심사요청을 진행해주세요.
|
||||
</p>
|
||||
<p>
|
||||
※ 템플릿 승인까지 최대 3일 소요
|
||||
</p>
|
||||
</div>
|
||||
<div class="icon">
|
||||
<img src="/publish/images/kakao_intro_cont/service_03.jpg" alt="알림톡 템플릿 등록하러 가기 아이콘">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="service-04 common">
|
||||
<div class="step">
|
||||
<p>STEP <span>04</span></p>
|
||||
</div>
|
||||
<div class="text">
|
||||
<div class="btn">
|
||||
<a href="<c:url value='/web/mjon/alimtalk/kakaoAlimtalkMsgDataView.do'/>">알림톡 전송하기<img src="/publish/images/kakao_intro_cont/arrow.jpg" alt="화살표"></a>
|
||||
</div>
|
||||
<div class="text-line"></div>
|
||||
<div class="type">
|
||||
<p>
|
||||
템플릿이 승인되셨다면 문자온 알림톡을 <br>
|
||||
통해 메시지를 발송하실 수 있습니다.
|
||||
</p>
|
||||
</div>
|
||||
<div class="icon">
|
||||
<img src="/publish/images/kakao_intro_cont/service_04.jpg" alt="알림톡 전송하기 아이콘">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!--이용가이드 버튼-->
|
||||
<div class="guide">
|
||||
<a href="https://kakaobusiness.gitbook.io/main/ad/bizmessage/notice-friend" target="_blank">알림톡 이용가이드 보기 <img src="/publish/images/kakao_intro_cont/guide_arrow.png" alt="알림톡 이용가이드 화살표"></a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!--유의사항-->
|
||||
<div class="note">
|
||||
<div class="note-title">
|
||||
<p>
|
||||
<span>
|
||||
<img src="/publish/images/kakao_intro_cont/note_icon.png" alt="유의사항 아이콘">
|
||||
</span>유의사항
|
||||
</p>
|
||||
</div>
|
||||
<ul>
|
||||
<li>- 한글, 영문 구분 없이 최대 1,000자까지 전송 가능합니다.</li>
|
||||
<li>- 알림톡 발송 실패에 따른 대체문자 발송 시 문자요금(단문, 장문, 그림)이 보유 캐시에서 차감됩니다.</li>
|
||||
<li>- 알림톡에서 허용하는 영리목적이 없는 정보성 메시지에 해당하는지 여부는 스팸 관련 정보통신망법 안내서를 꼭 참고하시길 바랍니다.</li>
|
||||
<li>(주문/예약 확인, 결제 내역, 배송 현황 메시지 등이 이에 해당하며 구독자 대상의 뉴스레터나 일반적인 공지문은 포함되지 않습니다.)</li>
|
||||
<li>
|
||||
<a href="/download/msg/K003_불법스팸_방지_안내서_제6차_개정판(수정_2024년).pdf" target="_blank">스팸 관련 정보통신망법 안내서 바로가기</a>
|
||||
</li>
|
||||
<li>- 부고, 답례, 초대장 등은 정보성 메시지가 아니므로 알림톡으로 보내실 수 없습니다. </li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<!-- // 알림톡 소개 -->
|
||||
|
||||
<!-- 친구톡 소개 -->
|
||||
<div class="tab_content friendtalk" id="tab_content_2">
|
||||
<div class="kakao_intro">
|
||||
<div class="title">
|
||||
<h3>친구톡이란?</h3>
|
||||
</div>
|
||||
|
||||
<div class="title-line">
|
||||
<div class="left-line"></div>
|
||||
<div class="right-line"></div>
|
||||
</div>
|
||||
|
||||
<div class="con">
|
||||
<!--설명-->
|
||||
<div class="intro">
|
||||
<img class="phone" src="/publish/images/kakao_intro_cont/phone_friendtalk.png" alt="핸드폰">
|
||||
|
||||
<ul class="list">
|
||||
<li>
|
||||
<img src="/publish/images/kakao_intro_cont/text_friendtalk.png" alt="카카오톡 전용 기업 메시지 서비스 “알림톡”">
|
||||
</li>
|
||||
<li>
|
||||
<p>1</p>
|
||||
<p><span>광고성 메시지</span> 발송 가능(광고 표기 및 수신거부 안내 포함)</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>2</p>
|
||||
<p>채널 친구 추가된 사용자라면 <span>누구에게나</span> 발송 가능</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>3</p>
|
||||
<p><span>1,000자 이내</span> 텍스트 및 <span>이미지</span> 전송 가능</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>4</p>
|
||||
<p><span>맞춤형 메시지 및 쿠폰, 링크</span> 버튼 제공 가능</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>5</p>
|
||||
<p>문자 메시지 대비 <span>저렴한</span> 단가</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>6</p>
|
||||
<p>발송실패 시 <span>대체문자 발송</span> 기능 지원</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>7</p>
|
||||
<p>클릭률/도달률 분석을 통한 <span>마케팅 효율 강화</span></p>
|
||||
</li>
|
||||
<li>
|
||||
<p>8</p>
|
||||
<p>브랜드 친화적인 <span>이미지 커스터마이징</span> 가능</p>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<!--문자vs알림톡-->
|
||||
<div class="fight">
|
||||
<div class="line"></div>
|
||||
<div class="fight-title">
|
||||
<h4>알림톡 <span>VS</span> 친구톡</h4>
|
||||
<div class="circle"></div>
|
||||
</div>
|
||||
|
||||
<div class="wrap">
|
||||
<div class="vs allimtalk_vs">
|
||||
<div class="title">알림톡</div>
|
||||
<div class="box">
|
||||
<ul>
|
||||
<li>전화번호 보유자</li>
|
||||
<li>정보성 <span>(예 : 주문, 예약, 안내 등)</span></li>
|
||||
<li>텍스트, 이미지 등</li>
|
||||
<li>최대 5개</li>
|
||||
<li>사전 승인 필요</li>
|
||||
<li>6.9원</li>
|
||||
<li>1,000자</li>
|
||||
<li>로고, 아이콘 형식만 가능</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="vs vs_title">
|
||||
<div class="title">VS</div>
|
||||
<ul>
|
||||
<li>전송대상</li>
|
||||
<li>발송목적</li>
|
||||
<li>메세지 형태</li>
|
||||
<li>버튼 사용</li>
|
||||
<li>템플릿 승인</li>
|
||||
<li>비용</li>
|
||||
<li>길이제한</li>
|
||||
<li>이미지</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="vs friendtalk_vs">
|
||||
<div class="title">친구톡</div>
|
||||
<div class="box">
|
||||
<ul>
|
||||
<li>채널 친구</li>
|
||||
<li>광고 및 마케팅성<span>(예 : 이벤트, 쿠폰 등)</span></li>
|
||||
<li>텍스트, 기본이미지, 와이드 이미지형 등</li>
|
||||
<li>최대 5개</li>
|
||||
<li>별도 승인 없음 <span>야간 발송 제한(20:50 ~ 익일 08:00)</span></li>
|
||||
<li>13.8원 ~ 22.9원</li>
|
||||
<li>1,000자</li>
|
||||
<li>가능</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 친구톡 유형 -->
|
||||
<div class="use">
|
||||
<div class="title">
|
||||
<h3>친구톡 유형</h3>
|
||||
</div>
|
||||
|
||||
<div class="title-line">
|
||||
<div class="left-line"></div>
|
||||
<div class="right-line"></div>
|
||||
</div>
|
||||
|
||||
<ul class="friendtalk_use">
|
||||
<li>
|
||||
<div class="title">텍스트형</div>
|
||||
<img src="/publish/images/kakao_intro_cont/friendtalk_use1.png" alt="">
|
||||
<p class="explan_text">한/영 구분없이 <span>1,000자</span> + 버튼 <span>최대 5개</span></p>
|
||||
</li>
|
||||
<li>
|
||||
<div class="title">기본 이미지형</div>
|
||||
<img src="/publish/images/kakao_intro_cont/friendtalk_use2.png" alt="">
|
||||
<p class="explan_text">한/영 구분없이 <span>400자</span> + 이미지 <span>1</span>장 + 버튼 <span>최대 5개</span></p>
|
||||
</li>
|
||||
<li>
|
||||
<div class="title">와이드 이미지형</div>
|
||||
<img src="/publish/images/kakao_intro_cont/friendtalk_use3.png" alt="">
|
||||
<p class="explan_text">한/영 구분없이 <span>76자</span> + 이미지 <span>1</span>장 + 버튼 <span>최대 1개</span></p>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<!--서비스이용방법-->
|
||||
<div class="service">
|
||||
<div class="title">
|
||||
<h3>서비스 이용 방법</h3>
|
||||
</div>
|
||||
|
||||
<div class="title-line">
|
||||
<div class="left-line"></div>
|
||||
<div class="right-line"></div>
|
||||
</div>
|
||||
|
||||
<ul class="kakao_use_guide">
|
||||
<li class="guide_01">
|
||||
<div class="title">STEP <span>01</span></div>
|
||||
<i></i>
|
||||
<p class="guide_title">카카오톡 채널 가입</p>
|
||||
<span class="guide_info">카카오톡 채널 생성을 위한 <br> 계정이 없으시다면, 카카오에서 <br> 카카오톡 비즈니스 회원가입을<br> 먼저 진행해주세요.</span>
|
||||
</li>
|
||||
<li class="guide_02">
|
||||
<div class="title">STEP <span>02</span></div>
|
||||
<i></i>
|
||||
<p class="guide_title">채널 ID 등록하러 가기</p>
|
||||
<span class="guide_info">가입하신 카카오톡 채널의 채널 ID(채널이름)를 채널 ID 등록 메뉴에 등록해주세요.</span>
|
||||
</li>
|
||||
<li class="guide_03">
|
||||
<div class="title">STEP <span>03</span></div>
|
||||
<i></i>
|
||||
<p class="guide_title">친구톡 전송</p>
|
||||
<span class="guide_info">친구톡은 별도의 템플릿 심사 절차 없이, 즉시 발송 가능합니다.</span>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<!--이용가이드 버튼-->
|
||||
<div class="guide">
|
||||
<a href="https://kakaobusiness.gitbook.io/main/ad/brandmessage" target="_blank">친구톡 이용가이드 보기 <img src="/publish/images/kakao_intro_cont/guide_arrow.png" alt="알림톡 이용가이드 화살표"></a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!--유의사항-->
|
||||
<div class="note">
|
||||
<div class="note-title">
|
||||
<p><span><img src="/publish/images/kakao_intro_cont/note_icon.png" alt="유의사항 아이콘"></span>유의사항</p>
|
||||
</div>
|
||||
<ul>
|
||||
<li>- (광고) 표기 여부는 선택 가능하나 , (광고)표기 해제에 따른 법령상 의무사항을 미 준수시에는 메시지 발송이 중단될 수 있습니다.</li>
|
||||
<li>- 광고성 친구톡 메시지에는 “(광고) 표시 및 수신거부 방식”이 표시되며, 대체 문자의 경우에는 “(광고) 문구 및 080 무료수신거부 번호”가 자동으로 포함됩니다.</li>
|
||||
<li><b>- 광고성 메시지의 발송 가능 시간은 08:00 ~ 20:50(한국시간) 입니다.</b></li>
|
||||
<li>- 친구톡 발송 실패에 따른 대체문자 발송 시 문자요금(단문, 장문, 그림)이 보유 캐시에서 차감됩니다.</li>
|
||||
<li>- 카카오정책 및 심의기준을 반드시 준수하여야 합니다.</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<!-- // 친구톡 소개 -->
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!--// send top -->
|
||||
@ -762,7 +762,7 @@ function sendTemplateInfo(){
|
||||
// $('.loading_layer').removeClass('active');
|
||||
|
||||
// 프로그래스 바 종료
|
||||
progressComplete();;
|
||||
progressComplete();
|
||||
}
|
||||
,error: function (e) {
|
||||
console.log("ERROR : ", e);
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,959 @@
|
||||
<%@ 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="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
|
||||
|
||||
<script type="text/javascript" src="<c:url value='/publish/js/content.js'/>"></script>
|
||||
|
||||
<script type="text/javascript">
|
||||
|
||||
var $tableExcel = null; //엑셀입력 탭
|
||||
var $tableError = null; //엑셀입력 탭
|
||||
$(document).ready(function(){
|
||||
|
||||
//Tabulator AJAX Data Loading
|
||||
$tableError = new Tabulator("#tabulator_error", {
|
||||
height:"255px",
|
||||
width:"100%",
|
||||
layout:"fitColumns",
|
||||
autoColumns:false,
|
||||
headerHozAlign:"center",
|
||||
validationMode:"highlight",
|
||||
clipboard:false,
|
||||
clipboardCopySelector:"table",
|
||||
clipboardPasteAction:"insert", // insert, update, replace
|
||||
placeholder:"등록 팝업에서 휴대폰을 선택 후 확인해주세요.", //fit columns to width of table (optional)
|
||||
columns:[ //Define Table Columns
|
||||
{title:"이름", field:"name", hozAlign:"center", headerHozAlign: "center", width:125},
|
||||
{title:"휴대폰", field:"phone", hozAlign:"center", headerHozAlign: "center"},
|
||||
{title:"미등록 결과", field:"result", hozAlign:"center", headerHozAlign: "center"}
|
||||
]
|
||||
});
|
||||
|
||||
|
||||
//Tabulator AJAX Data Loading
|
||||
$tableExcel = new Tabulator("#tabulator_excel", {
|
||||
height:"255px",
|
||||
width:"100%",
|
||||
layout:"fitColumns",
|
||||
autoColumns:false,
|
||||
headerHozAlign:"center",
|
||||
validationMode:"highlight",
|
||||
clipboard:false,
|
||||
clipboardCopySelector:"table",
|
||||
clipboardPasteAction:"insert", // insert, update, replace
|
||||
placeholder:"Excel 파일을 업로드 해주세요.", //fit columns to width of table (optional)
|
||||
columns:[ //Define Table Columns
|
||||
{formatter:"rowSelection", titleFormatter:"rowSelection",clipboard:false, headerHozAlign:"center", hozAlign:"center", headerSort:false, cellClick:function(e, cell){
|
||||
cell.getRow().toggleSelect();
|
||||
}
|
||||
},
|
||||
{formatter:"rownum", align:"center" ,title:"No", hozAlign:"center", headerHozAlign:"center", width:50},
|
||||
{title:"A", field:"A", hozAlign:"center", headerHozAlign: "center", width:140, validator:["maxLength:100", "string"]},
|
||||
{title:"B", field:"B", hozAlign:"center", headerHozAlign: "center", width:140, validator:["maxLength:100", "string"]},
|
||||
{title:"C", field:"C", hozAlign:"center", headerHozAlign: "center", width:140, validator:["maxLength:100", "string"]},
|
||||
{title:"D", field:"D", hozAlign:"center", headerHozAlign: "center", width:140, validator:["maxLength:100", "string"]},
|
||||
{title:"E", field:"E", hozAlign:"center", headerHozAlign: "center", width:140, validator:["maxLength:100", "string"]},
|
||||
{title:"F", field:"F", hozAlign:"center", headerHozAlign: "center", width:140, validator:["maxLength:100", "string"]}
|
||||
],
|
||||
validationFailed:function(cell, value, parameters){ // 유효성 체크 함수
|
||||
var valid = cell.isValid();
|
||||
if(!valid){
|
||||
alert("양식에 맞지 않는 정보가 입력되었습니다.");
|
||||
|
||||
//해당 셀 데이터 삭제
|
||||
cell.setValue("");
|
||||
}
|
||||
return value % parameters.phone;
|
||||
},
|
||||
});
|
||||
|
||||
|
||||
|
||||
|
||||
// 타뷸레이터 width값 변경 시 위에 select width 값 변경
|
||||
var titleArray = ["No","A","B","C","D","E","F"];
|
||||
|
||||
$tableExcel.on("columnWidth",function(column){
|
||||
var titleIndex = titleArray.indexOf(column._column.definition.title);
|
||||
titleIndex += 1;
|
||||
|
||||
if(titleIndex != 0){
|
||||
$('.select_adr_hd>div').eq(titleIndex).css('width', column._column.width);
|
||||
}else{
|
||||
$('.select_adr_hd>div').eq(0).css('width', column._column.width);
|
||||
|
||||
}
|
||||
});
|
||||
|
||||
$tableExcel.on("scrollHorizontal",function(left){
|
||||
$(".adr_excel").scrollLeft(left);
|
||||
})
|
||||
|
||||
|
||||
$(".adr_excel").on("scroll",function(){
|
||||
$(".tabulator-tableholder").scrollLeft($(this).scrollLeft());
|
||||
});
|
||||
|
||||
|
||||
|
||||
|
||||
$("#excelFileC4").on("change", function(event) {
|
||||
var fileInfo = event.target.files;
|
||||
if(fileInfo.length > 0){
|
||||
excelFileChange(fileInfo[0]);
|
||||
} else {
|
||||
fn_loadRemoveActive(); // 파일이 선택되지 않은 경우 로딩 상태 제거
|
||||
setTimeout(() => { $(this).val(''); }, 0); // 파일 선택 초기화
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
|
||||
$(document).on('click', '#btnAddrMassClose', function() {
|
||||
|
||||
$('.field-selector').each(function() { $(this).val(''); });
|
||||
setAddrMassClose();
|
||||
});
|
||||
|
||||
|
||||
$(document).on('click', '#closeBtn', function() {
|
||||
// 대량등록 닫기
|
||||
setAddrMassClose();
|
||||
});
|
||||
|
||||
|
||||
|
||||
|
||||
// 엑셀등록 닫기
|
||||
function setAddrMassClose() {
|
||||
$tableExcel.clearData();
|
||||
$("#excelRowTotCnt").text(0); //총건수 수정
|
||||
$("#excelRowDupCnt").text(0); //중복건수 수정
|
||||
$("#excelRowErrorCnt").text(0); //중복건수 수정
|
||||
// dupliPhoneDataRealList.length = 0; // 중복 휴대폰번호 초기화
|
||||
|
||||
|
||||
// 중복 카운트
|
||||
$("#errorPopDupCnt").text(0);
|
||||
// 에러 카운트
|
||||
$("#errorPopErrorCnt").text(0);
|
||||
//
|
||||
$("#errorPopTotCnt").text(0);
|
||||
|
||||
// popup 영역
|
||||
$tableError.clearData();
|
||||
|
||||
}
|
||||
|
||||
//#############################################################################################
|
||||
//파일업로드 드래그앤 드롭
|
||||
//#############################################################################################
|
||||
var objDragAndDrop = $(".upload_area");
|
||||
$(document).on("dragenter",".upload_area",function(e){
|
||||
e.stopPropagation();
|
||||
e.preventDefault();
|
||||
//$(this).css('border', '2px solid #0B85A1');
|
||||
});
|
||||
$(document).on("dragover",".upload_area",function(e){
|
||||
e.stopPropagation();
|
||||
e.preventDefault();
|
||||
});
|
||||
$(document).on("drop",".upload_area",function(e){
|
||||
fn_loadAddActive();
|
||||
e.preventDefault();
|
||||
var files = e.originalEvent.dataTransfer.files;
|
||||
excelFileChange(files[0]);
|
||||
});
|
||||
|
||||
$(document).on('dragenter', function (e){
|
||||
e.stopPropagation();
|
||||
e.preventDefault();
|
||||
});
|
||||
$(document).on('dragover', function (e){
|
||||
e.stopPropagation();
|
||||
e.preventDefault();
|
||||
//objDragAndDrop.css('border', '2px dotted #0B85A1');
|
||||
});
|
||||
$(document).on('drop', function (e){
|
||||
e.stopPropagation();
|
||||
e.preventDefault();
|
||||
});
|
||||
//파일 드래그앤드롭 종료
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
// 받는사람 선택삭제 버튼 처리해주기
|
||||
$('#in_select_del').click(function(){
|
||||
|
||||
if($tableExcel == null || $tableExcel == ""){
|
||||
|
||||
alert("받는사람을 추가해 주세요.");
|
||||
return false;
|
||||
|
||||
}
|
||||
|
||||
var selectedData = $tableExcel.getSelectedRows();
|
||||
|
||||
if(selectedData == "" || selectedData == null){
|
||||
|
||||
alert("삭제할 연락처를 선택해주세요.");
|
||||
return false;
|
||||
|
||||
}else{ // 선택한 Row 데이터 삭제하기
|
||||
|
||||
if(confirm("선택하신 받는 사람을 삭제하시겠습니까?")){
|
||||
|
||||
// 선택 데이터 삭제
|
||||
selectedData.forEach(row => row.delete());
|
||||
|
||||
|
||||
totRows = $tableExcel.getRows().length;
|
||||
$("#excelRowTotCnt").text(totRows);
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
// 추가버튼
|
||||
$('#btnAddrMassReg').click(function(){
|
||||
|
||||
if($tableExcel.getData().length < 1){
|
||||
alert("한 개 이상의 연락처를 입력하세요");
|
||||
return false;
|
||||
}
|
||||
// else if (selectedData.length > 20000) {
|
||||
// alert("2만줄 이상의 업로드는 데이터 부하로 업로드 할수 없습니다.");
|
||||
// return false;
|
||||
// }
|
||||
|
||||
|
||||
// tableExcel 그룹의 select 요소들을 확인
|
||||
var columns = $tableExcel.getColumns();
|
||||
var isAddrPhoneNoSelected = columns.some(column => column.getField() === 'addrPhoneNo');
|
||||
|
||||
if (!isAddrPhoneNoSelected) {
|
||||
alert('휴대폰이 선택되지 않았습니다.');
|
||||
return false;
|
||||
|
||||
}
|
||||
|
||||
var addrData = $tableExcel.getData().map((row, index) => ({
|
||||
name: row.addrNm,
|
||||
phone: removeDash(row.addrPhoneNo),
|
||||
rep1: row.addrInfo1,
|
||||
rep2: row.addrInfo2,
|
||||
rep3: row.addrInfo3,
|
||||
rep4: row.addrInfo4,
|
||||
}));
|
||||
|
||||
|
||||
|
||||
// 기존 tableL의 데이터를 가져옵니다.
|
||||
var existingData = tableL.getData();
|
||||
// 기존 데이터와 새로운 데이터를 합칩니다.
|
||||
var combinedData = existingData.concat(addrData);
|
||||
|
||||
|
||||
/**
|
||||
* @ phone을 기준으로 중복 제거 및 갯수 계산
|
||||
* @ 결과 반환
|
||||
* return {
|
||||
* uniqueArray, // 중복 제거된 배열
|
||||
* uniqueCount, // 중복 제거된 데이터 개수
|
||||
* duplicateArray, // 중복된 데이터 배열
|
||||
* duplicateCount: duplicateArray.length // 중복된 데이터 개수
|
||||
* };
|
||||
*/
|
||||
const result = removeDuplicatesAndCount(combinedData, 'phone');
|
||||
|
||||
|
||||
// 총 30만건이 넘으면 false
|
||||
if (!validateRowLimit(result.uniqueCount)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
// 6. 수량/가격 계산
|
||||
setAllCntData(result);
|
||||
// fn_priceClclt(result.uniqueCount);
|
||||
//결제 금액 구하기
|
||||
totalFtPriceSum(tableL.getRows().length);
|
||||
|
||||
|
||||
$('#closeBtn').click();
|
||||
});
|
||||
|
||||
|
||||
|
||||
//받는사람 전체삭제 버튼 처리
|
||||
$('#allDel').click(function(){
|
||||
var data = $tableExcel.getRows();
|
||||
$tableExcel.clearData();
|
||||
$("#excelRowTotCnt").text(0); //총건수 수정
|
||||
$("#excelRowDupCnt").text(0); //중복건수 수정
|
||||
$("#excelRowErrorCnt").text(0); //중복건수 수정
|
||||
dupliPhoneDataRealList.length = 0; // 중복 휴대폰번호 초기화
|
||||
$tableError.clearData();
|
||||
|
||||
// select box 초기화
|
||||
$('.field-selector').each(function() { $(this).val(''); });
|
||||
|
||||
});
|
||||
|
||||
|
||||
|
||||
//치환문자 있는 엑섹불러오기 버튼 클릭시 파일 첨부 실행
|
||||
$('.c3').click(function(){ // 엑셀파일 불러오기 선택 시
|
||||
|
||||
$("#excelFileC4").click();
|
||||
|
||||
});
|
||||
|
||||
|
||||
|
||||
//타이틀 select 선택 이벤트
|
||||
$('.field-selector').on('change', function() {
|
||||
fn_loadAddActive();
|
||||
|
||||
setTimeout(() => {
|
||||
var selectedFields = [];
|
||||
var isDuplicate = false;
|
||||
|
||||
if($tableExcel.getData().length < 1){
|
||||
alert('데이터 입력 후 선택해 주세요.');
|
||||
$(this).val("");
|
||||
fn_loadRemoveActive();
|
||||
return false;
|
||||
}
|
||||
|
||||
// 중복체크
|
||||
$('.field-selector').each(function() {
|
||||
var selectedField = $(this).val();
|
||||
if (selectedField) {
|
||||
if (selectedFields.includes(selectedField)) {
|
||||
alert("중복된 필드를 선택할 수 없습니다.");
|
||||
$(this).val(""); // 중복 필드를 선택한 경우 빈 값으로 초기화
|
||||
isDuplicate = true;
|
||||
return false; // 반복문 종료
|
||||
}
|
||||
selectedFields.push(selectedField);
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
//
|
||||
updateTableFields($tableExcel);
|
||||
|
||||
// 필드가 휴대폰이면 열 중복체크
|
||||
if($(this).val() == 'addrPhoneNo'){
|
||||
fn_phoneDupl($tableExcel);
|
||||
}
|
||||
fn_loadRemoveActive();
|
||||
|
||||
}, 0); // 지연 없이 즉시 실행되도록 0ms 지연을 설정
|
||||
|
||||
|
||||
});
|
||||
|
||||
|
||||
|
||||
});
|
||||
|
||||
|
||||
|
||||
function excelFileChange(file) {
|
||||
if (file) {
|
||||
|
||||
// 파일 크기 체크 (20MB)
|
||||
const maxSize = 20 * 1024 * 1024; // 20MB in bytes
|
||||
if (file.size > maxSize) {
|
||||
alert('파일 크기는 20MB를 초과할 수 없습니다.');
|
||||
return;
|
||||
}
|
||||
|
||||
fn_loadAddActive();
|
||||
var reader = new FileReader();
|
||||
var extension = file.name.split('.').pop().toLowerCase();
|
||||
reader.onload = function(e) {
|
||||
setTimeout(() => { // 파일 읽기 완료 후 실행되도록 함
|
||||
if (extension === 'xlsx') {
|
||||
var data = new Uint8Array(e.target.result);
|
||||
var workbook = XLSX.read(data, {type: 'array'});
|
||||
var firstSheet = workbook.Sheets[workbook.SheetNames[0]];
|
||||
var jsonData = XLSX.utils.sheet_to_json(firstSheet, {header: 1});
|
||||
// 문제 데이터를 확인하는 함수 호출
|
||||
findInvalidDBCharacters(jsonData);
|
||||
processExcelData(jsonData);
|
||||
} else if (extension === 'xls') {
|
||||
var data = e.target.result;
|
||||
var workbook = XLSX.read(data, { type: 'binary' });
|
||||
var firstSheet = workbook.Sheets[workbook.SheetNames[0]];
|
||||
var jsonData = XLSX.utils.sheet_to_json(firstSheet, { header: 1 });
|
||||
|
||||
// 문제 데이터를 확인하는 함수 호출
|
||||
findInvalidDBCharacters(jsonData);
|
||||
|
||||
|
||||
processExcelData(jsonData);
|
||||
} else if (extension === 'txt') {
|
||||
var textData = e.target.result;
|
||||
processTextData(textData);
|
||||
} else {
|
||||
alert('지원되지 않는 파일 형식입니다.');
|
||||
}
|
||||
fn_loadRemoveActive();
|
||||
}, 0); // 지연 없이 즉시 실행되도록 0ms 지연을 설정
|
||||
};
|
||||
if (extension === 'xlsx') {
|
||||
reader.readAsArrayBuffer(file);
|
||||
} else if (extension === 'xls') {
|
||||
reader.readAsBinaryString(file); // xls 파일에 적절한 read 메서드 호출
|
||||
} else if (extension === 'txt') {
|
||||
reader.readAsText(file);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//문제 데이터를 확인하는 함수
|
||||
function findInvalidDBCharacters(jsonData) {
|
||||
console.log('DB 입력 값 검사 중...');
|
||||
const invalidCharPattern = /[\uD800-\uDBFF][\uDC00-\uDFFF]/; // 4바이트 유니코드 문자 (이모지 등)
|
||||
for (let rowIndex = 0; rowIndex < jsonData.length; rowIndex++) {
|
||||
const row = jsonData[rowIndex];
|
||||
if (Array.isArray(row)) {
|
||||
for (let colIndex = 0; colIndex < row.length; colIndex++) {
|
||||
const cell = row[colIndex];
|
||||
if (typeof cell === 'string' && invalidCharPattern.test(cell)) {
|
||||
console.warn('허용되지 않는 문자: row', rowIndex + 1,', col ', colIndex + 1, ', value:', cell);
|
||||
// 허용되지 않는 문자를 제거 (선택 사항)
|
||||
row[colIndex] = cell.replace(invalidCharPattern, '');
|
||||
console.log('수정된 값:', row[colIndex]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//엑셀 데이터 처리 함수
|
||||
function processExcelData(data) {
|
||||
var keys = ['A', 'B', 'C', 'D', 'E', 'F', 'G'];
|
||||
var tableData = [];
|
||||
var totalRows = data.length - 2; // 전체 데이터 수 (1, 2행 제외)
|
||||
|
||||
|
||||
// 3번째 행부터 입력
|
||||
data.slice(0).forEach((row, index) => {
|
||||
var rowData = {};
|
||||
keys.forEach((key, idx) => { // index 변수명 변경 (내부와 외부에서 사용되므로 충돌 방지)
|
||||
// console.log('row[idx] : ', row[idx]);
|
||||
// rowData[key] = row[idx] ? row[idx].trim() : ""; // 각 컬럼에 대해 기본값을 설정
|
||||
rowData[key] = (typeof row[idx] === 'string') ? row[idx].trim() : row[idx];
|
||||
});
|
||||
tableData.push(rowData);
|
||||
|
||||
});
|
||||
|
||||
updateTable(tableData);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* function processExcelData(data) {
|
||||
console.log('data : ', data);
|
||||
var keys = ['A', 'B', 'C', 'D', 'E', 'F', 'G'];
|
||||
var tableData = [];
|
||||
var totalRows = data.length - 2; // 전체 데이터 수 (1, 2행 제외)
|
||||
console.log('data: ', data);
|
||||
|
||||
// 3번째 행부터 입력
|
||||
data.slice(0).forEach((row, index) => {
|
||||
var rowData = {};
|
||||
keys.forEach((key, idx) => { // index 변수명 변경 (내부와 외부에서 사용되므로 충돌 방지)
|
||||
// console.log('row[idx] : ', row[idx]);
|
||||
rowData[key] = row[idx] ? row[idx].trim() : ""; // 각 컬럼에 대해 기본값을 설정
|
||||
rowData[key] = (typeof row[idx] === 'string') ? row[idx].trim() : row[idx];
|
||||
});
|
||||
tableData.push(rowData);
|
||||
|
||||
});
|
||||
console.log('tableData :: ', tableData);
|
||||
updateTable(tableData);
|
||||
} */
|
||||
|
||||
|
||||
// 텍스트 데이터 처리 함수
|
||||
function processTextData(text) {
|
||||
var lines = text.split('\n'); // 각 줄을 배열로 분리
|
||||
var keys = ['A', 'B', 'C', 'D', 'E', 'F', 'G'];
|
||||
var tableData = [];
|
||||
|
||||
lines.forEach(line => {
|
||||
var rowData = {};
|
||||
var row = line.split(','); // 쉼표로 분리
|
||||
keys.forEach((key, index) => {
|
||||
rowData[key] = row[index] ? row[index].trim() : ""; // 각 컬럼에 대해 기본값을 설정
|
||||
});
|
||||
tableData.push(rowData);
|
||||
});
|
||||
|
||||
updateTable(tableData);
|
||||
}
|
||||
|
||||
//공통 테이블 업데이트 함수
|
||||
function updateTable(tableData) {
|
||||
$tableExcel.setColumns([ //Define Table Columns
|
||||
{formatter:"rowSelection", titleFormatter:"rowSelection",clipboard:false, headerHozAlign:"center", hozAlign:"center", headerSort:false, cellClick:function(e, cell){
|
||||
cell.getRow().toggleSelect();
|
||||
}
|
||||
},
|
||||
{formatter:"rownum", align:"center" ,title:"No", hozAlign:"center", headerHozAlign:"center", width:10},
|
||||
{title:"A", field:"A", hozAlign:"center", headerHozAlign: "center", width:150, validator:["maxLength:100", "string"]},
|
||||
{title:"B", field:"B", hozAlign:"center", headerHozAlign: "center", width:150, validator:["maxLength:100", "string"]},
|
||||
{title:"C", field:"C", hozAlign:"center", headerHozAlign: "center", width:150, validator:["maxLength:100", "string"]},
|
||||
{title:"D", field:"D", hozAlign:"center", headerHozAlign: "center", width:150, validator:["maxLength:100", "string"]},
|
||||
{title:"E", field:"E", hozAlign:"center", headerHozAlign: "center", width:150, validator:["maxLength:100", "string"]},
|
||||
{title:"F", field:"F", hozAlign:"center", headerHozAlign: "center", width:150, validator:["maxLength:100", "string"]}
|
||||
]);
|
||||
|
||||
$tableExcel.setData(tableData).then(() => {
|
||||
// excelRowTotCnt 업데이트
|
||||
document.getElementById("excelRowTotCnt").innerText = tableData.length;
|
||||
});
|
||||
|
||||
fn_loadRemoveActive();
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* 타이틀 select 선택할때마다 실행해서
|
||||
* 데이터테이블 필드값 수정
|
||||
*/
|
||||
function updateTableFields($objTabul) {
|
||||
var currentData = $objTabul.getData();
|
||||
var columns = [
|
||||
{formatter: "rowSelection", titleFormatter: "rowSelection", clipboard: false, hozAlign: "center", headerHozAlign: "center", headerSort: false, cellClick: function(e, cell) {
|
||||
cell.getRow().toggleSelect();
|
||||
}}
|
||||
,{formatter:"rownum", align:"center", title:"No", hozAlign:"center", headerHozAlign:"center", width:60}
|
||||
];
|
||||
|
||||
var fieldMapping = [];
|
||||
$('.field-selector').each(function(index) {
|
||||
var selectedField = $(this).val();
|
||||
// ASCII 문자 코드 사용 - 65=A, 66=B ...
|
||||
var field = String.fromCharCode(65 + index);
|
||||
if (selectedField) {
|
||||
columns.push({
|
||||
title: field
|
||||
, field: selectedField
|
||||
, hozAlign: "center"
|
||||
, headerHozAlign: "center"
|
||||
// , editor: "input"
|
||||
, editor: false
|
||||
, width: 140
|
||||
, validator: ["maxLength:100", "string"]
|
||||
});
|
||||
fieldMapping.push(selectedField);
|
||||
} else {
|
||||
columns.push({
|
||||
title: field
|
||||
, field: field
|
||||
, hozAlign: "center"
|
||||
, headerHozAlign: "center"
|
||||
, editor: false
|
||||
// , editor: "input"
|
||||
, width: 140
|
||||
, validator: ["maxLength:100", "string"]
|
||||
});
|
||||
fieldMapping.push(field);
|
||||
}
|
||||
});
|
||||
|
||||
var updatedData = currentData.map(row => {
|
||||
console.log('row : ', row);
|
||||
var newRow = {};
|
||||
fieldMapping.forEach((field, index) => {
|
||||
newRow[field] = row[Object.keys(row)[index]] ?? "";
|
||||
});
|
||||
return newRow;
|
||||
});
|
||||
|
||||
$objTabul.setColumns(columns);
|
||||
$objTabul.setData(updatedData);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @ 핸드폰 중복 데이터
|
||||
* */
|
||||
function fn_phoneDupl($objTabul) {
|
||||
|
||||
$tableError.clearData();
|
||||
|
||||
var data = $objTabul.getData();
|
||||
var phoneNumberChk = false;
|
||||
var existingNumbers = new Set(); // 배열에서 Set으로 변경
|
||||
|
||||
let errorCount = 0; // 중복 번호 개수를 저장할 변수
|
||||
let duplicateCount = 0; // 중복 번호 개수를 저장할 변수
|
||||
|
||||
const errors = []; // 오류 데이터를 저장할 배열
|
||||
const newData = []; // 유효한 데이터만 저장할 새로운 배열
|
||||
|
||||
data.forEach((row, index) => {
|
||||
|
||||
const number = row.addrPhoneNo;
|
||||
|
||||
// number가 null, undefined, 빈 문자열이거나 숫자인 경우 처리
|
||||
if (!number || (typeof number === 'string' && !number.trim())){
|
||||
console.log("number : ", number);
|
||||
return;
|
||||
}
|
||||
|
||||
const formattedNumber = formatPhoneNumber(number); // 번호 표준화
|
||||
const cleanedNumber = formattedNumber.replace(/[^0-9]/g, ''); // 숫자만 남김
|
||||
|
||||
if (!existingNumbers.has(cleanedNumber)) { // 중복 번호 체크
|
||||
if (isValidPhoneNumber(formattedNumber)) { // 유효성 검사
|
||||
row.addrPhoneNo = formattedNumber;
|
||||
existingNumbers.add(cleanedNumber); // 추가된 번호를 기존 목록에 추가
|
||||
newData.push(row); // 유효한 데이터만 새로운 배열에 추가
|
||||
} else {
|
||||
// 오류: 유효성 통과 못함
|
||||
errorCount++;
|
||||
|
||||
errors.push({
|
||||
name: row.addrNm, // 이름
|
||||
phone: row.addrPhoneNo, // 폰번호
|
||||
result: "오류" // 결과 메시지 추가
|
||||
});
|
||||
}
|
||||
} else {
|
||||
// 중복
|
||||
duplicateCount++;
|
||||
|
||||
errors.push({
|
||||
name: row.addrNm, // 이름
|
||||
phone: row.addrPhoneNo, // 폰번호
|
||||
result: "중복" // 결과 메시지 추가
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
// data 배열을 newData 배열로 대체
|
||||
data = newData;
|
||||
|
||||
|
||||
// 수정된 데이터로 테이블 업데이트
|
||||
$objTabul.setData(data);
|
||||
// 오류 총 카운트
|
||||
$("#excelRowTotCnt").text($objTabul.getDataCount());
|
||||
// 중복 카운트
|
||||
$("#excelRowDupCnt").text(duplicateCount);
|
||||
// 에러 카운트
|
||||
$("#excelRowErrorCnt").text(errorCount);
|
||||
|
||||
// popup 영역
|
||||
$("#errorPopTotCnt").text($objTabul.getDataCount());
|
||||
// 중복 카운트
|
||||
$("#errorPopDupCnt").text(duplicateCount);
|
||||
// 에러 카운트
|
||||
$("#errorPopErrorCnt").text(errorCount);
|
||||
|
||||
|
||||
$tableError.setData(errors);
|
||||
|
||||
if(errorCount > 0){
|
||||
alert('휴대폰 형식에 맞지 않는 데이터는 삭제 후 업로드 됩니다.\nex) 발송불가 특수문자, 자릿수 오류 등');
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
function fn_dupliPopupShow(){
|
||||
|
||||
$("#tableExcelDupliBtn").show();
|
||||
}
|
||||
|
||||
|
||||
// 상단 설명 더보기
|
||||
function popMore(e){
|
||||
$(e).closest(".pop_more_cont").toggleClass("pop_more_click");
|
||||
|
||||
if($(e).closest(".pop_more_cont").is(".pop_more_click")){
|
||||
$(e).html('숨기기');
|
||||
$(e).append('<i></i>');
|
||||
}else {
|
||||
$(e).html('더보기');
|
||||
$(e).append('<i></i>');
|
||||
}
|
||||
}
|
||||
|
||||
// excel 오류정보 테스트
|
||||
$(document).on('click', '#errorExcelBtn', function() {
|
||||
if($tableError.getDataCount()<1){
|
||||
alert('오류 정보가 없습니다.');
|
||||
return false;
|
||||
}
|
||||
$tableError.download("xlsx", "error_data.xlsx");
|
||||
});
|
||||
|
||||
|
||||
</script>
|
||||
|
||||
<!-- 중복전화번호 data-tooltip:addrMassDupli_layer -->
|
||||
<div class="tooltip-wrap">
|
||||
<div class="popup-com addrMassDupli_layer" tabindex="0" data-tooltip-con="addrMassDupli_layer" data-focus="addrMassDupli_layer" data-focus-prev="addrMassDupli_layer-close" style="width: 270px; height: 500px;">
|
||||
<div class="popup_heading">
|
||||
<p>중복 휴대폰번호</p>
|
||||
<button type="button" class="tooltip-close" data-focus="addrMassDupli_layer-close" onclick="setAddrDupliClose();"><img src="/publish/images/content/layerPopup_close.png" alt="팝업 닫기"></button>
|
||||
</div>
|
||||
<div class="layer_in" style="padding:20px 0px;" id="addrMassDupli_layer">
|
||||
</div>
|
||||
|
||||
<div class="popup_btn_wrap2" style="margin-top: 0px;">
|
||||
<button type="button" class="tooltip-close" data-focus="addrMassDupli_layer-close" data-focus-next="addrMassDupli_layer">닫기</button>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<!-- 주소록 상세 결과 팝업 data-tooltip:adr_popup14 -->
|
||||
<div class="tooltip-wrap">
|
||||
<div class="popup-com adr_layer adr_detail_result adr_popup14" tabindex="0" data-tooltip-con="adr_popup14" data-focus="adr_popup14" data-focus-prev="adr_popu14-close" style="width: 525px;z-index:125;">
|
||||
<div class="popup_heading">
|
||||
<p>주소록 상세 결과</p>
|
||||
<button type="button" class="tooltip-close" data-focus="adr_popup14-close"><img src="/publish/images/content/layerPopup_close.png" alt="팝업 닫기"></button>
|
||||
</div>
|
||||
<div class="layer_in" style="padding:30px 20px;">
|
||||
<div class="table_top">
|
||||
<p>
|
||||
총 <span class="c_e40000" id="errorPopTotCnt">0</span>건
|
||||
/ 중복 <span class="c_002c9a" id="errorPopDupCnt">0</span>건
|
||||
/ 오류 <span class="c_002c9a" id="errorPopErrorCnt">0</span>건</p>
|
||||
<button type="button" class="excel_btn btnType" id="errorExcelBtn"><i class="downroad"></i>엑셀 다운로드</button>
|
||||
</div>
|
||||
<div class="tb_wrap adr_list" id="tabulator_error">
|
||||
<!-- $tableError 참고 -->
|
||||
</div>
|
||||
<ul class="cf_text_ul">
|
||||
<li>*중복번호는 하나의 번호만 등록됩니다.</li>
|
||||
<li>*휴대폰 형식에 맞지 않는 데이터는 삭제 후 업로드 됩니다.</li>
|
||||
<li>ex) 발송불가 특수문자, 자릿수 오류 등</li>
|
||||
</ul>
|
||||
<div class="popup_btn_wrap2">
|
||||
<!-- <button type="button">저장</button> -->
|
||||
<button type="button" class="tooltip-close" data-focus="adr_popup14-close" data-focus-next="adr_popup14">닫기</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!--// 중복전화번호 팝업 -->
|
||||
<div class="popup_heading">
|
||||
<p>엑셀 불러오기</p>
|
||||
<button type="button" class="tooltip-close" id="closeBtn" data-focus="popup07-close"><img src="/publish/images/content/layerPopup_close.png" alt="팝업 닫기"></button>
|
||||
</div>
|
||||
<div class="layer_in execl_upload_layer" style="padding: 25px 30px;">
|
||||
<!-- <div class="list_tab_wrap2"> -->
|
||||
<!-- tab button -->
|
||||
<!-- <ul class="list_tab" id="tbTabl"> -->
|
||||
<!-- <li class="tab active" data-tabul="tableExcel"><button type="button" onclick="popupTab(this,'1'); fn_tabToggle('1');">엑셀입력</button></li> -->
|
||||
<!-- <li class="tab" data-tabul="tableClip"><button type="button" onclick="popupTab(this,'2'); fn_tabToggle('2');">붙여넣기</button></li> -->
|
||||
<!-- <li class="tab" data-tabul="tableSelf"><button type="button" onclick="popupTab(this,'3'); fn_tabToggle('3');">직접입력</button></li> -->
|
||||
<!-- </ul>// tab button -->
|
||||
<!-- </div> -->
|
||||
<!-- 엑셀입력 -->
|
||||
<div class="popCont current pop_more_cont" id="popCont_1">
|
||||
<div class="titBox">
|
||||
<p>- 주소록은 한 번에 최대 30만건까지 등록(EXCEL파일, 최대용량 20MB) 가능합니다. </p>
|
||||
<p>- 엑셀 파일에 비밀번호 설정, 제한된 보기, 수식 등이 설정되어 있는 경우 업로드가 불가합니다.</p>
|
||||
<p>- 구분선(|), 역슬래시(\, ₩), 큰따옴표("), 이모지(이모티콘) 등 발송불가 특수문자는 저장되지 않습니다.</p>
|
||||
<p>- 이름 200byte, [*1*]~[*4*] 200byte, 메모 250byte까지 입력 가능합니다.</p>
|
||||
<p>- 주소록 등록이 어려우신 경우에는 <a href="<c:url value='/web/mjon/addragency/selectAddrAgencyList.do'/>" style="font-weight: bold; color: blue;">주소록 입력대행</a> 메뉴를 이용하실 수 있습니다. </p>
|
||||
</div>
|
||||
<div class="pop_more_wrap">
|
||||
<button type="button" class="pop_more" onclick="popMore(this);">더보기<i></i></button>
|
||||
</div>
|
||||
</div><!--// 엑셀입력 -->
|
||||
|
||||
<!-- 공통 -->
|
||||
<div>
|
||||
<table class="layer_tType1">
|
||||
<caption>엑셀입력 표</caption>
|
||||
<colgroup>
|
||||
<col style="width: 95px">
|
||||
<col style="width: auto">
|
||||
</colgroup>
|
||||
<tbody>
|
||||
<tr>
|
||||
<!-- <th>그룹 선택</th>
|
||||
<td>
|
||||
<label for="" class="label">그룹 선택</label>
|
||||
<select id="addrGrpIdInfo" name="addrGrpIdInfo">
|
||||
</select>
|
||||
<label for="" class="label">그룹명 입력</label>
|
||||
<input type="text" id="addrGrpNm" name="addrGrpNm" placeholder="새 그룹명을 입력해주세요." onfocus="this.placeholder=''" onblur="this.placeholder='새 그룹명을 입력해주세요.'"class="inputLight" style="width: 300px;">
|
||||
<input type="file" id="excelFile" accept=".xls, .xlsx, .txt" style="display:none"/>
|
||||
<button type="button" class="excel_btn2 btnType c3"><i class="uproad"></i>엑셀, TXT파일 업로드</button>
|
||||
</td> -->
|
||||
<td colspan="2" style="padding:10px 0;">
|
||||
<div class="file_upload_wrap" style="width:100%;display:flex;">
|
||||
<div class="file_add upload_area">
|
||||
<p><img src="/publish/images/content/file_add.png" alt="파일 붙여넣기">마우스로 엑셀파일을 여기에 끌어다 놓으세요</p>
|
||||
</div>
|
||||
<input type="file" id="excelFileC4" accept=".xls, .xlsx, .txt" style="display:none"/>
|
||||
<button type="button" class="excel_btn2 btnType c3"><i class="uproad"></i>엑셀파일 업로드</button>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="excel_middle2">
|
||||
<p>
|
||||
총 <span class="c_e40000 fwBold" id="excelRowTotCnt">0</span>건
|
||||
/ 중복 <span class="c_002c9a fwBold" id="excelRowDupCnt">0</span>건
|
||||
/ 오류 <span class="c_002c9a fwBold" id="excelRowErrorCnt">0</span>건
|
||||
<button type="button" class="btn_list_detail" data-tooltip="adr_popup14"><img src="/publish/images/search.png"></button>
|
||||
</p>
|
||||
<!-- -->
|
||||
<!-- <button type="button" class="btnType btnType6" data-tooltip="addrMassDupli_layer" id="tableExcelDupliBtn">중복번호</button> -->
|
||||
<!-- -->
|
||||
<!-- <button type="button" class="btnType btnType6" data-tooltip="addrMassSaveDupli_layer" onclick="GetAddrMassSaveDupli()" id="btnAddrMassSaveDupli">중복번호</button> -->
|
||||
</p>
|
||||
<!-- <button type="button" class="btnType btnType6 addCallToF">번호추가</button> -->
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<div class="adr_excel" style="margin-top: 13px; overflow-x:auto;">
|
||||
<!-- <div class="adr_excel" style="margin-top: 13px;"> -->
|
||||
<!-- thead -->
|
||||
<div class="adr_hd select_adr_hd msg" data-group="tableExcel">
|
||||
<div style="width: 100px;"></div>
|
||||
<div style="width: 100px;"></div>
|
||||
<div style="width: 140px;">
|
||||
<label for="" class="label"></label>
|
||||
<select class="field-selector">
|
||||
<option value="">선택하기</option>
|
||||
<option value="addrNm">이름</option>
|
||||
<option value="addrPhoneNo">휴대폰</option>
|
||||
<option value="addrInfo1">[*1*]</option>
|
||||
<option value="addrInfo2">[*2*]</option>
|
||||
<option value="addrInfo3">[*3*]</option>
|
||||
<option value="addrInfo4">[*4*]</option>
|
||||
<!-- <option value="addrComment">메모</option> -->
|
||||
</select>
|
||||
</div>
|
||||
<div style="width: 140px;">
|
||||
<label for="" class="label"></label>
|
||||
<select class="field-selector">
|
||||
<option value="">선택하기</option>
|
||||
<option value="addrNm">이름</option>
|
||||
<option value="addrPhoneNo">휴대폰</option>
|
||||
<option value="addrInfo1">[*1*]</option>
|
||||
<option value="addrInfo2">[*2*]</option>
|
||||
<option value="addrInfo3">[*3*]</option>
|
||||
<option value="addrInfo4">[*4*]</option>
|
||||
<!-- <option value="addrComment">메모</option> -->
|
||||
</select>
|
||||
</div>
|
||||
<div style="width: 140px;">
|
||||
<label for="" class="label"></label>
|
||||
<select class="field-selector">
|
||||
<option value="">선택하기</option>
|
||||
<option value="addrNm">이름</option>
|
||||
<option value="addrPhoneNo">휴대폰</option>
|
||||
<option value="addrInfo1">[*1*]</option>
|
||||
<option value="addrInfo2">[*2*]</option>
|
||||
<option value="addrInfo3">[*3*]</option>
|
||||
<option value="addrInfo4">[*4*]</option>
|
||||
<!-- <option value="addrComment">메모</option> -->
|
||||
</select>
|
||||
</div>
|
||||
<div style="width: 140px;">
|
||||
<label for="" class="label"></label>
|
||||
<select class="field-selector">
|
||||
<option value="">선택하기</option>
|
||||
<option value="addrNm">이름</option>
|
||||
<option value="addrPhoneNo">휴대폰</option>
|
||||
<option value="addrInfo1">[*1*]</option>
|
||||
<option value="addrInfo2">[*2*]</option>
|
||||
<option value="addrInfo3">[*3*]</option>
|
||||
<option value="addrInfo4">[*4*]</option>
|
||||
<!-- <option value="addrComment">메모</option> -->
|
||||
</select>
|
||||
</div>
|
||||
<div style="width: 140px;">
|
||||
<label for="" class="label"></label>
|
||||
<select class="field-selector">
|
||||
<option value="">선택하기</option>
|
||||
<option value="addrNm">이름</option>
|
||||
<option value="addrPhoneNo">휴대폰</option>
|
||||
<option value="addrInfo1">[*1*]</option>
|
||||
<option value="addrInfo2">[*2*]</option>
|
||||
<option value="addrInfo3">[*3*]</option>
|
||||
<option value="addrInfo4">[*4*]</option>
|
||||
<!-- <option value="addrComment">메모</option> -->
|
||||
</select>
|
||||
</div>
|
||||
<div style="width: 140px;">
|
||||
<label for="" class="label"></label>
|
||||
<select class="field-selector">
|
||||
<option value="">선택하기</option>
|
||||
<option value="addrNm">이름</option>
|
||||
<option value="addrPhoneNo">휴대폰</option>
|
||||
<option value="addrInfo1">[*1*]</option>
|
||||
<option value="addrInfo2">[*2*]</option>
|
||||
<option value="addrInfo3">[*3*]</option>
|
||||
<option value="addrInfo4">[*4*]</option>
|
||||
<!-- <option value="addrComment">메모</option> -->
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="drag_drop_wrap callList_includ_box" id="tabulator_excel">
|
||||
<!-- <img src="/publish/images/content/excel.jpg" style="width: 100%;"> -->
|
||||
</div>
|
||||
<div class="excel_middle">
|
||||
<div class="select_btnWrap clearfix">
|
||||
<div>
|
||||
<button type="button" id="allDel"><i class="remove_img"></i>전체삭제</button>
|
||||
<button type="button" id="in_select_del"><i class="remove_img"></i>선택삭제</button>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div><!--// 공통 -->
|
||||
|
||||
<!-- 붙여놓기 설명 -->
|
||||
<!-- <div class="req_area"> -->
|
||||
<!-- <div class="text_box"> -->
|
||||
<!-- - 휴대폰 번호가 입력된 txt 파일을 열어 복사(Ctrl+c) + 붙여넣기(Ctrl+v)로도 입력하실 수 있습니다.<br> -->
|
||||
<!-- - 휴대폰 번호는 필수입력 항목입니다.<br> -->
|
||||
<!-- - 이름,휴대폰 번호,[*1*],[*2*],[*3*],[*4*],메모 순서대로 입력해주세요.(예 : 010-1234-5678,홍길동,변수1…메모)<br> -->
|
||||
<!-- - 이름은 24byte, [*1*]~[*4*] 40byte, 메모는 250byte까지 입력 가능합니다.<br> -->
|
||||
<!-- - '오류 검사'를 통해 등록된 데이터에 전화번호 입력 오류를 확인하실 수 있습니다. -->
|
||||
<!-- </div> -->
|
||||
<!-- </div> -->
|
||||
<div class="popup_btn_wrap2" style="margin: 0 auto 30px auto;">
|
||||
<button type="button" id="btnAddrMassReg">추가</button>
|
||||
<button type="button" id="btnAddrMassClose" class="tooltip-close" data-focus="adr_popup07-close" data-focus-next="popup07">닫기</button>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
@ -227,9 +227,15 @@ function pageUnitChg(obj){
|
||||
<span class="di">분할</span>
|
||||
</c:if>
|
||||
</c:if>
|
||||
<a href="#none" onclick="fn_sentDetailView('${resultAllSentList.msgGroupId}');">
|
||||
<%-- <a href="#none" onclick="fn_sentDetailView('${resultAllSentList.msgGroupId}');">
|
||||
<c:out value="${resultAllSentList.smsTxt}"/>
|
||||
</a> --%>
|
||||
<a href="#none" onclick="fn_sentDetailView('${resultAllSentList.msgGroupId}');">
|
||||
<c:if test="${resultAllSentList.adFlag eq 'Y'}">(광고)</c:if>
|
||||
<c:out value="${resultAllSentList.smsTxt}" />
|
||||
<c:if test="${resultAllSentList.adFlag eq 'Y'}">수신거부 : 홈 > 채널차단</c:if>
|
||||
</a>
|
||||
|
||||
</div>
|
||||
</td>
|
||||
<td>
|
||||
|
||||
@ -0,0 +1,194 @@
|
||||
<%@ 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="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
|
||||
<% pageContext.setAttribute("newLineChar", "\n"); %>
|
||||
<div class="phone">
|
||||
<!-- 탭스타일 -->
|
||||
<div class="list_tab_wrap2 type5 kakao_rev_tab">
|
||||
<ul class="tabType3" id="tabType" name="tabType">
|
||||
<li class="tab active"><button type="button" onclick="phoneTab(this,'1');" title="선택됨">카카오톡</button></li>
|
||||
<c:if test="${resultMsgDetail.bizKakaoResendYn eq 'Y'}">
|
||||
<li class="tab"><button type="button" onclick="phoneTab(this,'2');">대체문자</button></li>
|
||||
</c:if>
|
||||
</ul>
|
||||
</div>
|
||||
<!--// 탭스타일 -->
|
||||
|
||||
<!-- 카카오 미리보기 -->
|
||||
<!-- <div class="tab_phone current" id="tab_phone_1"> -->
|
||||
<!-- <div class="phone_kakako friendtalk"> -->
|
||||
<div class="tab_phone current kakao_wrap" id="tab_phone_1">
|
||||
<!-- 알림톡 미리보기 -->
|
||||
<c:if test="${msgType eq '8'}">
|
||||
<div class="phone_kakako">
|
||||
<div class="phoneIn">
|
||||
<p class="prev_p"><img src="/publish/images/content/kakao_prev_icon.png" alt=""></p>
|
||||
<!-- 텍스트 미리보기 -->
|
||||
<div class="text_preview">
|
||||
<div class="allimtalk_title">
|
||||
<img src="/publish/images/content/icon_allimtalk.png" alt="">
|
||||
알림톡 도착
|
||||
</div>
|
||||
<div class="allimtalk_content">
|
||||
<c:choose>
|
||||
<c:when test="${kakaoTemplateInfo.templateEmphasizeType eq 'TEXT'}">
|
||||
<p class="emphasis_side_text"><c:out value="${kakaoTemplateInfo.templateSubtitle}"/></p>
|
||||
<p class="emphasis_title_text"><c:out value="${kakaoTemplateInfo.templateTitle}"/></p>
|
||||
</c:when>
|
||||
<c:when test="${kakaoTemplateInfo.templateEmphasizeType eq 'IMAGE'}">
|
||||
<div class="kakao_image">
|
||||
<img src="<c:url value='${kakaoTemplateInfo.templateImageUrl}'/>" alt="">
|
||||
</div>
|
||||
</c:when>
|
||||
</c:choose>
|
||||
|
||||
<p class="template_text">
|
||||
<c:out value="${fn:replace(fn:replace(kakaoTemplateInfo.templateContent, newLineChar, '<br/>'), newLineChar2, '<br/>')}" escapeXml="false"/>
|
||||
</p>
|
||||
|
||||
<c:choose>
|
||||
<c:when test="${kakaoTemplateInfo.templateMessageType eq 'EX'}">
|
||||
<p class="side_info_text"><c:out value="${kakaoTemplateInfo.templateExtra}"/></p>
|
||||
</c:when>
|
||||
<c:when test="${kakaoTemplateInfo.templateMessageType eq 'AD'}">
|
||||
<p class="channel_info_text"><c:out value="${kakaoTemplateInfo.templateAd}"/></p>
|
||||
</c:when>
|
||||
</c:choose>
|
||||
|
||||
<c:forEach var="templatInfoButtonList" items="${kakaoTemplateInfo.buttonList}" varStatus="status">
|
||||
<c:choose>
|
||||
<c:when test="${templatInfoButtonList.name eq '채널 추가'}">
|
||||
<button type="button" class="btn_kakao_channel"><img src="/publish/images/content/icon_kakao_channel_plus.png" alt=""> 채널추가</button>
|
||||
</c:when>
|
||||
<c:otherwise>
|
||||
<button type="button" class="btn_kakao_type"><c:out value="${templatInfoButtonList.name}"/></button>
|
||||
</c:otherwise>
|
||||
</c:choose>
|
||||
</c:forEach>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<p class="addText">※ 단말기 설정에 따라 다르게 보일 수 있습니다</p>
|
||||
</div>
|
||||
</c:if>
|
||||
|
||||
<!-- 친구톡 미리보기 -->
|
||||
<c:if test="${msgType eq '9'}">
|
||||
<div class="phone_kakako friendtalk">
|
||||
<div class="phoneIn">
|
||||
<p class="prev_p"><img src="/publish/images/content/kakao_prev_icon.png" alt=""><c:out value="${searchVO.yellowId}"/></p>
|
||||
<!-- 텍스트 미리보기 -->
|
||||
<div class="text_preview">
|
||||
<c:if test="${resultMsgDetail.adFlag eq 'Y'}">
|
||||
<p class="friend_talk_title"><span>(광고)</span></p>
|
||||
</c:if>
|
||||
<div class="allimtalk_content">
|
||||
<c:choose>
|
||||
<c:when test="${kakaoTemplateInfo.templateEmphasizeType eq 'TEXT'}">
|
||||
<p class="emphasis_side_text"><c:out value="${kakaoTemplateInfo.templateSubtitle}"/></p>
|
||||
<p class="emphasis_title_text"><c:out value="${kakaoTemplateInfo.templateTitle}"/></p>
|
||||
</c:when>
|
||||
<c:when test="${kakaoTemplateInfo.templateEmphasizeType eq 'IMAGE'}">
|
||||
<div class="kakao_image">
|
||||
<img src="<c:url value='${kakaoTemplateInfo.templateImageUrl}'/>" alt="">
|
||||
</div>
|
||||
</c:when>
|
||||
</c:choose>
|
||||
|
||||
<p class="template_text">
|
||||
<c:out value="${fn:replace(fn:replace(kakaoTemplateInfo.templateContent, newLineChar, '<br/>'), newLineChar2, '<br/>')}" escapeXml="false"/>
|
||||
</p>
|
||||
|
||||
<c:choose>
|
||||
<c:when test="${kakaoTemplateInfo.templateMessageType eq 'EX'}">
|
||||
<p class="side_info_text"><c:out value="${kakaoTemplateInfo.templateExtra}"/></p>
|
||||
</c:when>
|
||||
<c:when test="${kakaoTemplateInfo.templateMessageType eq 'AD'}">
|
||||
<p class="channel_info_text"><c:out value="${kakaoTemplateInfo.templateAd}"/></p>
|
||||
</c:when>
|
||||
</c:choose>
|
||||
|
||||
<c:forEach var="templatInfoButtonList" items="${kakaoTemplateInfo.buttonList}" varStatus="status">
|
||||
<c:choose>
|
||||
<c:when test="${templatInfoButtonList.name eq '채널 추가'}">
|
||||
<button type="button" class="btn_kakao_channel"><img src="/publish/images/content/icon_kakao_channel_plus.png" alt=""> 채널추가</button>
|
||||
</c:when>
|
||||
<c:otherwise>
|
||||
<button type="button" class="btn_kakao_type"><c:out value="${templatInfoButtonList.name}"/></button>
|
||||
</c:otherwise>
|
||||
</c:choose>
|
||||
</c:forEach>
|
||||
</div>
|
||||
|
||||
<c:if test="${resultMsgDetail.adFlag eq 'Y'}">
|
||||
<p class="kakao_block_text">수신거부 : 홈 > 채널차단</p>
|
||||
</c:if>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<p class="addText">※ 단말기 설정에 따라 다르게 보일 수 있습니다</p>
|
||||
</div>
|
||||
</c:if>
|
||||
|
||||
</div>
|
||||
<!--// 카카오 미리보기 -->
|
||||
|
||||
<c:if test="${resultMsgDetail.bizKakaoResendYn eq 'Y'}">
|
||||
<!-- 문자 미리보기 -->
|
||||
<div class="tab_phone" id="tab_phone_2" style="display: none;position:relative;">
|
||||
<!-- <div class="tab_phone" id="tab_phone_2" > -->
|
||||
<!-- <div class="tab_phone" id="tab_phone_2" style="display:none" > -->
|
||||
<div class="phoneIn">
|
||||
<div>
|
||||
<p class="prev_p"><img src="/publish/images/search.png"> 문자내용</p>
|
||||
<div class="text_length2 clearfix">
|
||||
<c:if test="${resultMsgDetail.bizKakaoResendYn eq 'Y'}">
|
||||
<c:choose>
|
||||
<c:when test="${not empty fileInfos}">
|
||||
<span class="msg_com msg_photo">그림</span>
|
||||
</c:when>
|
||||
<c:otherwise>
|
||||
<c:choose>
|
||||
<c:when test="${resultMsgDetail.bizKakaoResendType eq 'SMS'}">
|
||||
<span class="msg_com msg_short">단문</span>
|
||||
</c:when>
|
||||
<c:otherwise>
|
||||
<span class="msg_com msg_long">장문</span>
|
||||
</c:otherwise>
|
||||
</c:choose>
|
||||
</c:otherwise>
|
||||
</c:choose>
|
||||
</c:if>
|
||||
</div>
|
||||
<div class="text_preview">
|
||||
<c:if test="${not empty fileInfos}">
|
||||
<div class="preiew_img">
|
||||
<c:forEach var="fileInfo" items="${fileInfos}">
|
||||
<div class="img_box">
|
||||
<img src="<c:url value='/cmm/fms/getImage2.do'/>?atchFileId=<c:out value="${fileInfo.atchFileId}"/>&fileSn=<c:out value="${fileInfo.fileSn}"/>" alt="발송된 그림문자 미리보기" style="width: 100%">
|
||||
</div>
|
||||
</c:forEach>
|
||||
</div>
|
||||
</c:if>
|
||||
<div class="preview_auto">
|
||||
<c:if test="${resultMsgDetail.adFlag eq 'Y'}">
|
||||
<p class="ad_tit">(광고)</p>
|
||||
</c:if>
|
||||
<p class="realtime">${fn:replace(resultMsgDetail.bizKakaoResendOrgnlTxt, newLineChar, "<br/>")}</p>
|
||||
|
||||
<c:if test="${resultMsgDetail.adFlag eq 'Y'}">
|
||||
<p class="deny_receipt">무료거부 0808800858</p>
|
||||
</c:if>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<p class="addText">※ 단말기 설정에 따라 다르게 보일 수 있습니다</p>
|
||||
</div>
|
||||
</c:if>
|
||||
<!--// 문자 미리보기 -->
|
||||
</div>
|
||||
|
||||
@ -6,127 +6,198 @@
|
||||
<% pageContext.setAttribute("newLineChar", "\n"); %>
|
||||
|
||||
<div class="phone">
|
||||
<!-- 탭스타일 -->
|
||||
<div class="list_tab_wrap2 type5 kakao_rev_tab">
|
||||
<ul class="tabType3" id="tabType" name="tabType">
|
||||
<li class="tab active"><button type="button" onclick="phoneTab(this,'1');" title="선택됨">카카오톡</button></li>
|
||||
<c:if test="${resultMsgDetail.bizKakaoResendYn eq 'Y'}">
|
||||
<li class="tab"><button type="button" onclick="phoneTab(this,'2');">대체문자</button></li>
|
||||
</c:if>
|
||||
</ul>
|
||||
</div>
|
||||
<!--// 탭스타일 -->
|
||||
<!-- 탭스타일 -->
|
||||
<div class="list_tab_wrap2 type5 kakao_rev_tab">
|
||||
<ul class="tabType3" id="tabType" name="tabType">
|
||||
<li class="tab active"><button type="button" onclick="phoneTab(this,'1');" title="선택됨">카카오톡</button></li>
|
||||
<c:if test="${resultMsgDetail.bizKakaoResendYn eq 'Y'}">
|
||||
<li class="tab"><button type="button" onclick="phoneTab(this,'2');">대체문자</button></li>
|
||||
</c:if>
|
||||
</ul>
|
||||
</div>
|
||||
<!--// 탭스타일 -->
|
||||
|
||||
<!-- 카카오 알림톡 미리보기 -->
|
||||
<div class="tab_phone current kakao_wrap" id="tab_phone_1">
|
||||
<div class="phone_kakako">
|
||||
<div class="phoneIn">
|
||||
<!-- 텍스트 미리보기 -->
|
||||
<div class="rev_pop_middle clearfix">
|
||||
<fmt:parseDate value="${resultMsgDetail.reqDate}" var="parsedDate" pattern="yyyy-MM-dd HH:mm:ss.S"/>
|
||||
<span>발송일시 : <fmt:formatDate value="${parsedDate}" pattern="yyyy-MM-dd HH:mm:ss"/></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:choose>
|
||||
</span>
|
||||
<div class="tab_phone current kakao_wrap" id="tab_phone_1">
|
||||
<!-- 카카오 알림톡 미리보기 -->
|
||||
<c:if test="${msgType eq '8'}">
|
||||
<div class="phone_kakako">
|
||||
<div class="phoneIn">
|
||||
<div class="rev_pop_middle clearfix">
|
||||
<fmt:parseDate value="${resultMsgDetail.reqDate}" var="parsedDate" pattern="yyyy-MM-dd HH:mm:ss.S"/>
|
||||
<span>발송일시 : <fmt:formatDate value="${parsedDate}" pattern="yyyy-MM-dd HH:mm:ss"/></span>
|
||||
<span class="msg_com msg_allimtalk">
|
||||
알림톡
|
||||
</span>
|
||||
</div>
|
||||
<!-- 텍스트 미리보기 -->
|
||||
<div class="rev_pop_txt">
|
||||
<div class="text_preview">
|
||||
<div class="allimtalk_title">
|
||||
<img src="/publish/images/content/icon_allimtalk.png" alt="">
|
||||
알림톡 도착
|
||||
</div>
|
||||
<div class="allimtalk_content">
|
||||
<c:choose>
|
||||
<c:when test="${kakaoTemplateInfo.templateEmphasizeType eq 'TEXT'}">
|
||||
<p class="emphasis_side_text"><c:out value="${kakaoTemplateInfo.templateSubtitle}"/></p>
|
||||
<p class="emphasis_title_text"><c:out value="${kakaoTemplateInfo.templateTitle}"/></p>
|
||||
</c:when>
|
||||
<c:when test="${kakaoTemplateInfo.templateEmphasizeType eq 'IMAGE'}">
|
||||
<div class="kakao_image">
|
||||
<img src="<c:url value='${kakaoTemplateInfo.templateImageUrl}'/>" alt="">
|
||||
</div>
|
||||
</c:when>
|
||||
</c:choose>
|
||||
<p class="template_text">
|
||||
<c:out value="${fn:replace(fn:replace(kakaoTemplateInfo.templateContent, newLineChar, '<br/>'), newLineChar2, '<br/>')}" escapeXml="false"/>
|
||||
</p>
|
||||
|
||||
<c:choose>
|
||||
<c:when test="${kakaoTemplateInfo.templateMessageType eq 'EX'}">
|
||||
<p class="side_info_text"><c:out value="${kakaoTemplateInfo.templateExtra}"/></p>
|
||||
</c:when>
|
||||
<c:when test="${kakaoTemplateInfo.templateMessageType eq 'AD'}">
|
||||
<p class="channel_info_text"><c:out value="${kakaoTemplateInfo.templateAd}"/></p>
|
||||
</c:when>
|
||||
</c:choose>
|
||||
|
||||
<c:forEach var="templatInfoButtonList" items="${kakaoTemplateInfo.buttonList}" varStatus="status">
|
||||
<c:choose>
|
||||
<c:when test="${templatInfoButtonList.name eq '채널 추가'}">
|
||||
<button type="button" class="btn_kakao_channel"><img src="/publish/images/content/icon_kakao_channel_plus.png" alt=""> 채널추가</button>
|
||||
</c:when>
|
||||
<c:otherwise>
|
||||
<button type="button" class="btn_kakao_type"><c:out value="${templatInfoButtonList.name}"/></button>
|
||||
</c:otherwise>
|
||||
</c:choose>
|
||||
</c:forEach>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="rev_pop_txt">
|
||||
<div class="text_preview">
|
||||
<div class="allimtalk_title">
|
||||
<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:choose>
|
||||
</div>
|
||||
<div class="allimtalk_content">
|
||||
<c:choose>
|
||||
<c:when test="${kakaoTemplateInfo.templateEmphasizeType eq 'TEXT'}">
|
||||
<p class="emphasis_side_text"><c:out value="${kakaoTemplateInfo.templateSubtitle}"/></p>
|
||||
<p class="emphasis_title_text"><c:out value="${kakaoTemplateInfo.templateTitle}"/></p>
|
||||
</c:when>
|
||||
<c:when test="${kakaoTemplateInfo.templateEmphasizeType eq 'IMAGE'}">
|
||||
<div class="kakao_image">
|
||||
<img src="<c:url value='${kakaoTemplateInfo.templateImageUrl}'/>" alt="">
|
||||
</div>
|
||||
</c:when>
|
||||
</c:choose>
|
||||
<p class="addText">※ 단말기 설정에 따라 다르게 보일 수 있습니다</p>
|
||||
</div>
|
||||
</c:if>
|
||||
|
||||
<c:if test="${msgType eq '9'}">
|
||||
<!-- 카카오 친구톡 미리보기 -->
|
||||
<div class="phone_kakako friendtalk">
|
||||
<div class="phoneIn">
|
||||
<div class="rev_pop_middle clearfix">
|
||||
<fmt:parseDate value="${resultMsgDetail.reqDate}" var="parsedDate" pattern="yyyy-MM-dd HH:mm:ss.S"/>
|
||||
<span>발송일시 : <fmt:formatDate value="${parsedDate}" pattern="yyyy-MM-dd HH:mm:ss"/></span>
|
||||
<span class="msg_com msg_allimtalk">
|
||||
친구톡
|
||||
</span>
|
||||
</div>
|
||||
<!-- 텍스트 미리보기 -->
|
||||
<div class="rev_pop_txt">
|
||||
<div class="text_preview">
|
||||
<c:if test="${resultMsgDetail.adFlag eq 'Y'}">
|
||||
<p class="friend_talk_title"><span>(광고)</span></p>
|
||||
</c:if>
|
||||
<div class="allimtalk_content">
|
||||
<c:choose>
|
||||
<c:when test="${kakaoTemplateInfo.templateEmphasizeType eq 'TEXT'}">
|
||||
<p class="emphasis_side_text"><c:out value="${kakaoTemplateInfo.templateSubtitle}"/></p>
|
||||
<p class="emphasis_title_text"><c:out value="${kakaoTemplateInfo.templateTitle}"/></p>
|
||||
</c:when>
|
||||
<c:when test="${kakaoTemplateInfo.templateEmphasizeType eq 'IMAGE'}">
|
||||
<div class="kakao_image">
|
||||
<img src="<c:url value='${kakaoTemplateInfo.templateImageUrl}'/>" alt="">
|
||||
</div>
|
||||
</c:when>
|
||||
</c:choose>
|
||||
|
||||
<p class="template_text">
|
||||
<c:out value="${fn:replace(fn:replace(kakaoTemplateInfo.templateContent, newLineChar, '<br/>'), newLineChar2, '<br/>')}" escapeXml="false"/>
|
||||
</p>
|
||||
|
||||
<c:choose>
|
||||
<c:when test="${kakaoTemplateInfo.templateMessageType eq 'EX'}">
|
||||
<p class="side_info_text"><c:out value="${kakaoTemplateInfo.templateExtra}"/></p>
|
||||
</c:when>
|
||||
<c:when test="${kakaoTemplateInfo.templateMessageType eq 'AD'}">
|
||||
<p class="channel_info_text"><c:out value="${kakaoTemplateInfo.templateAd}"/></p>
|
||||
</c:when>
|
||||
</c:choose>
|
||||
|
||||
<c:forEach var="templatInfoButtonList" items="${kakaoTemplateInfo.buttonList}" varStatus="status">
|
||||
<c:choose>
|
||||
<c:when test="${templatInfoButtonList.name eq '채널 추가'}">
|
||||
<button type="button" class="btn_kakao_channel"><img src="/publish/images/content/icon_kakao_channel_plus.png" alt=""> 채널추가</button>
|
||||
</c:when>
|
||||
<c:otherwise>
|
||||
<button type="button" class="btn_kakao_type"><c:out value="${templatInfoButtonList.name}"/></button>
|
||||
</c:otherwise>
|
||||
</c:choose>
|
||||
</c:forEach>
|
||||
</div>
|
||||
|
||||
<c:if test="${resultMsgDetail.adFlag eq 'Y'}">
|
||||
<p class="kakao_block_text">수신거부 : 홈 > 채널차단</p>
|
||||
</c:if>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<p class="addText">※ 단말기 설정에 따라 다르게 보일 수 있습니다</p>
|
||||
</div>
|
||||
</c:if>
|
||||
</div>
|
||||
|
||||
<p class="template_text">
|
||||
<c:out value="${fn:replace(fn:replace(kakaoTemplateInfo.templateContent, newLineChar, '<br/>'), newLineChar2, '<br/>')}" escapeXml="false"/>
|
||||
</p>
|
||||
|
||||
<c:choose>
|
||||
<c:when test="${kakaoTemplateInfo.templateMessageType eq 'EX'}">
|
||||
<p class="side_info_text"><c:out value="${kakaoTemplateInfo.templateExtra}"/></p>
|
||||
</c:when>
|
||||
<c:when test="${kakaoTemplateInfo.templateMessageType eq 'AD'}">
|
||||
<p class="channel_info_text"><c:out value="${kakaoTemplateInfo.templateAd}"/></p>
|
||||
</c:when>
|
||||
</c:choose>
|
||||
|
||||
<c:forEach var="templatInfoButtonList" items="${kakaoTemplateInfo.buttonList}" varStatus="status">
|
||||
<c:choose>
|
||||
<c:when test="${templatInfoButtonList.name eq '채널 추가'}">
|
||||
<button type="button" class="btn_kakao_channel"><img src="/publish/images/content/icon_kakao_channel_plus.png" alt=""> 채널추가</button>
|
||||
</c:when>
|
||||
<c:otherwise>
|
||||
<button type="button" class="btn_kakao_type"><c:out value="${templatInfoButtonList.name}"/></button>
|
||||
</c:otherwise>
|
||||
</c:choose>
|
||||
</c:forEach>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<p class="addText">※ 단말기 설정에 따라 다르게 보일 수 있습니다</p>
|
||||
</div>
|
||||
</div>
|
||||
<!--// 카카오 알림톡 미리보기 -->
|
||||
|
||||
<c:if test="${resultMsgDetail.bizKakaoResendYn eq 'Y'}">
|
||||
<!-- 문자 미리보기 -->
|
||||
<!-- <div class="tab_phone" id="tab_phone_2" > -->
|
||||
<div class="tab_phone" id="tab_phone_2" style="display:none" >
|
||||
<div class="phoneIn">
|
||||
<div>
|
||||
<div class="text_length2 clearfix">
|
||||
<span>발송일시 : <fmt:formatDate value="${parsedDate}" pattern="yyyy-MM-dd HH:mm:ss"/></span>
|
||||
<c:if test="${resultMsgDetail.bizKakaoResendYn eq 'Y'}">
|
||||
<c:choose>
|
||||
<c:when test="${resultMsgDetail.bizKakaoResendTypeCnt > 1}">
|
||||
<span class="msg_com msg_short" style="float:right;">단문</span>
|
||||
<span class="msg_com msg_long" style="float:right;">장문</span>
|
||||
</c:when>
|
||||
<c:when test="${resultMsgDetail.bizKakaoResendTypeCnt < 2
|
||||
&& resultMsgDetail.bizKakaoResendType eq 'SMS'}">
|
||||
<span class="msg_com msg_short" style="float:right;">단문</span>
|
||||
</c:when>
|
||||
<c:otherwise>
|
||||
<span class="msg_com msg_long" style="float:right;">장문</span>
|
||||
</c:otherwise>
|
||||
</c:choose>
|
||||
</c:if>
|
||||
<!-- <div>
|
||||
<span>글자크기</span>
|
||||
<button type="button" onclick="changeFontSize('plus');"><img src="/publish/images/content/font_plus.png"></button>
|
||||
<button type="button" onclick="changeFontSize('minus');"><img src="/publish/images/content/font_minus.png"></button>
|
||||
</div -->>
|
||||
<!-- 문자 미리보기 -->
|
||||
<div class="tab_phone" id="tab_phone_2" style="display: none;position:relative;">
|
||||
<!-- <div class="tab_phone" id="tab_phone_2" > -->
|
||||
<!-- <div class="tab_phone" id="tab_phone_2" style="display:none" > -->
|
||||
<div class="phoneIn">
|
||||
<div>
|
||||
<div class="rev_pop_middle clearfix">
|
||||
<span>발송일시 : <fmt:formatDate value="${parsedDate}" pattern="yyyy-MM-dd HH:mm:ss"/></span>
|
||||
<c:choose>
|
||||
<c:when test="${not empty fileInfos}">
|
||||
<span class="msg_com msg_photo" style="float:right;">그림</span>
|
||||
</c:when>
|
||||
<c:otherwise>
|
||||
<c:choose>
|
||||
<c:when test="${resultMsgDetail.bizKakaoResendType eq 'SMS'}">
|
||||
<span class="msg_com msg_short" style="float:right;">단문</span>
|
||||
</c:when>
|
||||
<c:otherwise>
|
||||
<span class="msg_com msg_long" style="float:right;">장문</span>
|
||||
</c:otherwise>
|
||||
</c:choose>
|
||||
</c:otherwise>
|
||||
</c:choose>
|
||||
</div>
|
||||
<div class="rev_pop_txt">
|
||||
<div class="text_preview">
|
||||
<div class="preview_auto">
|
||||
<p class="realtime">${fn:replace(resultMsgDetail.bizKakaoResendOrgnlTxt, newLineChar, "<br/>")}</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<p class="addText">※ 단말기 설정에 따라 다르게 보일 수 있습니다</p>
|
||||
</div>
|
||||
</c:if>
|
||||
<!--// 문자 미리보기 -->
|
||||
<div class="text_preview">
|
||||
<c:if test="${not empty fileInfos}">
|
||||
<div class="preiew_img">
|
||||
<c:forEach var="fileInfo" items="${fileInfos}">
|
||||
<div class="img_box">
|
||||
<img src="<c:url value='/cmm/fms/getImage2.do'/>?atchFileId=<c:out value="${fileInfo.atchFileId}"/>&fileSn=<c:out value="${fileInfo.fileSn}"/>" alt="발송된 그림문자 미리보기" style="width: 100%">
|
||||
</div>
|
||||
</c:forEach>
|
||||
</div>
|
||||
</c:if>
|
||||
<div class="rev_pop_txt">
|
||||
<c:if test="${resultMsgDetail.adFlag eq 'Y'}">
|
||||
<p class="ad_tit">(광고)</p>
|
||||
</c:if>
|
||||
<p class="realtime">${fn:replace(resultMsgDetail.smsTxt, newLineChar, "<br/>")}</p>
|
||||
|
||||
<c:if test="${resultMsgDetail.adFlag eq 'Y'}">
|
||||
<p class="deny_receipt">무료거부 0808800858</p>
|
||||
</c:if>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<p class="addText">※ 단말기 설정에 따라 다르게 보일 수 있습니다</p>
|
||||
</div>
|
||||
</c:if>
|
||||
<!--// 문자 미리보기 -->
|
||||
</div>
|
||||
|
||||
@ -394,20 +394,18 @@ function fnReservCancel(msgGroupId){
|
||||
}
|
||||
|
||||
/**
|
||||
* @알림톡 재전송
|
||||
* @재전송
|
||||
*/
|
||||
function fnMjMsgReSendAll() {
|
||||
|
||||
function fnMjMsgReSendAll() {
|
||||
var msgType = $('#msgType').val();
|
||||
var form = document.reSendAllForm;
|
||||
|
||||
if (!confirm("알림톡 발송 화면으로 이동합니다.")) {
|
||||
return;
|
||||
}
|
||||
|
||||
// msgKind에 따른 action 설정
|
||||
form.action = "/web/mjon/alimtalk/kakaoAlimtalkMsgDataView.do";
|
||||
|
||||
form.submit();
|
||||
if (confirm((msgType == '8' ? '알림톡' : '친구톡') + " 발송 화면으로 이동합니다.")) {
|
||||
form.action = msgType == '8'
|
||||
? '/web/mjon/alimtalk/kakaoAlimtalkMsgDataView.do'
|
||||
: '/web/mjon/kakao/friendstalk/kakaoFriendsTalkMsgDataView.do';
|
||||
form.submit();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -649,7 +647,11 @@ function previewPhone(){
|
||||
<div class="res_info_in">
|
||||
<div class="res_info_top clearfix">
|
||||
<p>발송정보</p>
|
||||
<p><button type="button" class="btnType btnType3" onclick="fnMjMsgReSendAll();">재전송</button></p>
|
||||
<p>
|
||||
<%-- <c:if test="${result.msgType eq '8'}"> --%>
|
||||
<button type="button" class="btnType btnType3" onclick="fnMjMsgReSendAll();">재전송</button>
|
||||
<%-- </c:if> --%>
|
||||
</p>
|
||||
</div>
|
||||
<div class="res_info_btm">
|
||||
<dl>
|
||||
@ -667,6 +669,7 @@ function previewPhone(){
|
||||
<dd>
|
||||
<c:if test="${result.msgType eq '8'}">알림톡</c:if>
|
||||
<c:if test="${result.msgType eq '9'}">친구톡</c:if>
|
||||
<input type="hidden" id="msgType" value="${result.msgType }"/>
|
||||
</dd>
|
||||
</dl>
|
||||
<dl>
|
||||
@ -750,41 +753,50 @@ function previewPhone(){
|
||||
<p>상세결과</p>
|
||||
<p></p>
|
||||
</div>
|
||||
<div class="res_num">
|
||||
<div class="res_info_btm1">
|
||||
<dl>
|
||||
<dt>전체건수</dt>
|
||||
<dd><a href="#" data-tooltip="rev_popup04"><span class="c_222_g"><fmt:formatNumber value="${result.msgGroupCnt}" type="number" groupingUsed="true" /></span>건</a></dd>
|
||||
</dl>
|
||||
</div>
|
||||
<div class="res_info_btm1">
|
||||
<dl>
|
||||
<dt>성공건수</dt>
|
||||
<dd><span class="c_002c9a_g"><fmt:formatNumber value="${result.successCount + result.kakaoResendSuccCount}" type="number" groupingUsed="true" /></span>건(${result.successPct})</dd>
|
||||
</dl>
|
||||
</div>
|
||||
</div>
|
||||
<div class="res_num">
|
||||
<div class="res_info_btm1">
|
||||
<dl>
|
||||
<dt>대기건수</dt>
|
||||
<dd><span class="c_666_g"><fmt:formatNumber value="${result.waitCount}" type="number" groupingUsed="true" /></span>건(${result.waitingPct})</dd>
|
||||
</dl>
|
||||
</div>
|
||||
<div class="res_info_btm1">
|
||||
<dl>
|
||||
<dt>실패건수</dt>
|
||||
<%-- 대체문자 기능 on
|
||||
카카오톡 실패 + 대체문자 실패 = 실패
|
||||
대체문자 기능 off
|
||||
카카오톡 실패 = 실패
|
||||
*카카오톡 실패임에도 대체문자로 발송이 성공한 경우 실패로 체크하지 않음 --%>
|
||||
<dd><span class="c_e40000_g"><fmt:formatNumber value="${result.failCount - result.kakaoResendSuccCount}" type="number" groupingUsed="true" /></span>건(${result.failedPct})</dd>
|
||||
</dl>
|
||||
</div>
|
||||
</div>
|
||||
<p class="table_bottom_txt">* 전체건수를 클릭하면 받는 사람 상세정보를 확인하실 수 있습니다.</p>
|
||||
<p class="table_bottom_txt">* 대체문자 발송 성공 시, 성공건수로 집계됩니다.</p>
|
||||
<div class="res_num">
|
||||
<div class="res_info_btm1">
|
||||
<dl>
|
||||
<dt>전체건수</dt>
|
||||
<dd><a href="#" data-tooltip="rev_popup04"><span class="c_222_g"><fmt:formatNumber value="${result.msgGroupCnt}" type="number" groupingUsed="true" /></span>건</a></dd>
|
||||
</dl>
|
||||
</div>
|
||||
<div class="res_info_btm1">
|
||||
<dl>
|
||||
<dt>성공건수</dt>
|
||||
<dd><span class="c_002c9a_g"><fmt:formatNumber value="${result.successCount + result.kakaoResendSuccCount}" type="number" groupingUsed="true" /></span>건(${result.successPct})</dd>
|
||||
</dl>
|
||||
</div>
|
||||
</div>
|
||||
<div class="res_num">
|
||||
<div class="res_info_btm1">
|
||||
<dl>
|
||||
<dt>대기건수</dt>
|
||||
<dd><span class="c_666_g"><fmt:formatNumber value="${result.waitCount}" type="number" groupingUsed="true" /></span>건(${result.waitingPct})</dd>
|
||||
</dl>
|
||||
</div>
|
||||
<div class="res_info_btm1">
|
||||
<dl>
|
||||
<dt>실패건수</dt>
|
||||
<%-- 대체문자 기능 on
|
||||
카카오톡 실패 + 대체문자 실패 = 실패
|
||||
대체문자 기능 off
|
||||
카카오톡 실패 = 실패
|
||||
*카카오톡 실패임에도 대체문자로 발송이 성공한 경우 실패로 체크하지 않음 --%>
|
||||
<dd><span class="c_e40000_g"><fmt:formatNumber value="${result.failCount - result.kakaoResendSuccCount}" type="number" groupingUsed="true" /></span>건(${result.failedPct})</dd>
|
||||
</dl>
|
||||
</div>
|
||||
</div>
|
||||
<div class="table_btn clearfix">
|
||||
<div class="table_btn_left">
|
||||
<!-- <button type="button" data-tooltip="rev_popup02" class="btnType btnType14"><i class="add_img"></i>주소록 등록</button>
|
||||
<button type="button" class="excel_btn btnType"><i class="downroad"></i>엑셀 다운로드</button> -->
|
||||
<p class="table_bottom_txt">* 전체건수를 클릭하면 받는 사람 상세정보를 확인하실 수 있습니다.</p>
|
||||
<p class="table_bottom_txt" style="padding:5px 0 0 0;">* 대체문자 발송 성공 시, 성공건수로 집계됩니다.</p>
|
||||
</div>
|
||||
<div class="table_btn_right">
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!--// 상세결과-->
|
||||
@ -925,6 +937,7 @@ function previewPhone(){
|
||||
|
||||
<form id="resPopForm" name="resPopForm" method="post">
|
||||
<input type="hidden" id="msgGroupId" name="msgGroupId" value="${result.msgGroupId}"/>
|
||||
<input type="hidden" name="yellowId" value="${result.yellowId}"/>
|
||||
<!-- <input type="hidden" id="msgId" name="msgId" value=""/> -->
|
||||
</form>
|
||||
|
||||
|
||||
@ -364,6 +364,7 @@ function cntSet(){
|
||||
|
||||
cntView('allCnt', response.allCnt);
|
||||
cntView('atCnt', response.atCnt);
|
||||
cntView('ftCnt', response.ftCnt);
|
||||
//cntView('ftCnt', response.ftCnt);
|
||||
},
|
||||
error: function(error) {
|
||||
@ -564,6 +565,15 @@ function fn_sentDetailView(msgGroupId) {
|
||||
<table class="tType4"><tbody><tr><td>LOADING...</td></tr></tbody></table>
|
||||
</div>
|
||||
</div>
|
||||
<div class="rev_admin_in">
|
||||
<div class="rev_admin_top clearfix">
|
||||
<p>친구톡</p>
|
||||
<p></p>
|
||||
</div>
|
||||
<div class="rev_admin_btm admin_btm">
|
||||
<table class="tType4"><tbody><tr><td>LOADING...</td></tr></tbody></table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="rev_admin" id="lodingAfter" style="display:none;">
|
||||
@ -607,37 +617,34 @@ function fn_sentDetailView(msgGroupId) {
|
||||
</dl>
|
||||
</div>
|
||||
</div>
|
||||
<%-- <div class="rev_admin_in" id="ftCnt">
|
||||
<div class="rev_admin_in" id="ftCnt">
|
||||
<div class="rev_admin_top clearfix">
|
||||
<p>친구톡</p>
|
||||
<p><span><fmt:formatNumber value="${totFtCnt}" pattern="#,###"/></span> 건</p>
|
||||
<p><span name="allCnt">0</span> 건</p>
|
||||
</div>
|
||||
<div class="rev_admin_btm">
|
||||
<dl>
|
||||
<dt>대기</dt>
|
||||
<dd><span class="c_002c9a" name="waitCnt"><fmt:formatNumber value="${waitFtCnt}" pattern="#,###"/></span>건</dd>
|
||||
<dd><span class="c_002c9a" name="waitCnt">0</span>건</dd>
|
||||
</dl>
|
||||
<dl>
|
||||
<dt>성공</dt>
|
||||
<dd><span class="c_002c9a" name="succCnt"><fmt:formatNumber value="${succFtCnt}" pattern="#,###"/></span>건</dd>
|
||||
<dd><span class="c_002c9a" name="succCnt">0</span>건</dd>
|
||||
</dl>
|
||||
<dl>
|
||||
<dt>실패</dt>
|
||||
<dd><span class="c_e40000" name="failCnt"><fmt:formatNumber value="${failFtCnt}" pattern="#,###"/></span>건</dd>
|
||||
<dd><span class="c_e40000" name="failCnt">0</span>건</dd>
|
||||
</dl>
|
||||
</div>
|
||||
</div> --%>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="list_tab_wrap2 type4">
|
||||
<!-- tab button -->
|
||||
<ul class="list_tab">
|
||||
<li class="tab <c:if test="${searchVO.tabType eq '' || searchVO.tabType eq 'all' || empty searchVO.tabType}">active</c:if>"><button type="button" onclick="fnTabLoad('',0); return false;">전체</button></li>
|
||||
<li class="tab <c:if test="${searchVO.tabType eq 'at'}">active</c:if>"><button type="button" onclick="fnTabLoad('at', 1); return false;">알림톡</button></li>
|
||||
<%-- <c:if test="${pageContext.request.serverName == 'localhost'
|
||||
|| pageContext.request.serverName == '119.193.215.98'}">
|
||||
<li class="tab <c:if test="${searchVO.tabType eq 'ft'}">active</c:if>"><button type="button" onclick="fnTabLoad('ft', 2); return false;">친구톡</button></li>
|
||||
</c:if> --%>
|
||||
<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>
|
||||
</ul><!--// tab button -->
|
||||
</div>
|
||||
<!-- 예약관리 > 전체 -->
|
||||
|
||||
@ -400,7 +400,8 @@ function fnGoSampleTemplate(){
|
||||
<div class="top_content kakaotalkset_cont current pay_tab_wrap">
|
||||
<div class="heading">
|
||||
<h2>카카오톡 설정</h2>
|
||||
<button type="button" class="button info" onclick="window.open('popup_kakaoset_template.html','_blank','width=790, height=300, top=100, left=100, fullscreen=no, menubar=no, status=no, toolbar=no, titlebar=yes, location=no, scrollbars=yes')">사용안내</button>
|
||||
<button type="button" class="button info" onclick="window.open('/web/pop/ft/kakaoTemplatePop.do','_blank','width=850, height=240, top=100, left=100, fullscreen=no, menubar=no, status=no, toolbar=no, titlebar=yes, location=no, scrollbars=yes')">사용안내</button>
|
||||
<!-- <button type="button" class="button info" onclick="window.open('popup_kakaoset_template.html','_blank','width=790, height=300, top=100, left=100, fullscreen=no, menubar=no, status=no, toolbar=no, titlebar=yes, location=no, scrollbars=yes')">사용안내</button> -->
|
||||
</div>
|
||||
<div class="list_tab_wrap2 type2 ">
|
||||
<!-- tab button -->
|
||||
@ -436,7 +437,7 @@ function fnGoSampleTemplate(){
|
||||
<!-- //검색조건 -->
|
||||
<div class="list_info">
|
||||
<div class="btn_wrap left">
|
||||
<button type="button" class="btnType btnType2 template_add" onclick="location.href='/web/mjon/kakao/template/selectKakaoFriendsTemplateDataRegist.do'">템플릿 등록</button>
|
||||
<!-- <button type="button" class="btnType btnType2 template_add" onclick="location.href='/web/mjon/kakao/template/selectKakaoFriendsTemplateDataRegist.do'">템플릿 등록</button> -->
|
||||
<button type="button" class="btnType btnType3 btn_list"><i></i>리스트</button>
|
||||
<button type="button" class="btnType btnType3 btn_thumbnail"><i></i>썸네일</button>
|
||||
</div>
|
||||
|
||||
@ -132,7 +132,7 @@ $(function(){
|
||||
<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_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>
|
||||
|
||||
@ -943,19 +943,6 @@ $(document).on('click', '#errorExcelBtn', function() {
|
||||
<!-- <option value="addrComment">메모</option> -->
|
||||
</select>
|
||||
</div>
|
||||
<!-- <div style="width: 125px;">
|
||||
<label for="" class="label"></label>
|
||||
<select class="field-selector">
|
||||
<option value="">선택하기</option>
|
||||
<option value="addrNm">이름</option>
|
||||
<option value="addrPhoneNo">휴대폰</option>
|
||||
<option value="addrInfo1">[*1*]</option>
|
||||
<option value="addrInfo2">[*2*]</option>
|
||||
<option value="addrInfo3">[*3*]</option>
|
||||
<option value="addrInfo4">[*4*]</option>
|
||||
<option value="addrComment">메모</option>
|
||||
</select>
|
||||
</div> -->
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
@ -11,7 +11,7 @@
|
||||
<%-- <label for="subject" class="label">발송된 문자 제목</label>
|
||||
<input type="text" id="subject" name="subject" placeholder="${resultMsgDetail.subject}" value="${resultMsgDetail.subject}" readonly> --%>
|
||||
<div class="rev_pop_middle clearfix">
|
||||
<span>발송일시 : <c:out value="${resultMsgDetail.sentDate}"/></span>
|
||||
<span>발송일시 : <c:out value="${resultMsgDetail.reqDate}"/></span>
|
||||
<c:choose>
|
||||
<c:when test="${resultMsgDetail.msgType == '4'}">
|
||||
<span class="msg_com msg_short">SMS</span>
|
||||
|
||||
@ -563,7 +563,7 @@ function fnRevDetailPop03(msgGroupId){
|
||||
<li class="tab"><button type="button" onclick="payUserTab(this,'mms');">그림</button></li>
|
||||
<li class="tab"><button type="button" onclick="payUserTab(this,'cam');">선거</button></li>
|
||||
<li class="tab"><button type="button" onclick="payUserTab(this,'at');">알림톡</button></li>
|
||||
<!-- <li class="tab"><button type="button" onclick="payUserTab(this,'ft');">친구톡</button></li> -->
|
||||
<li class="tab"><button type="button" onclick="payUserTab(this,'ft');">친구톡</button></li>
|
||||
<li class="tab"><button type="button" onclick="payUserTab(this,'fax');">팩스</button></li>
|
||||
</ul>
|
||||
<!--// tab button -->
|
||||
|
||||
30
src/main/webapp/WEB-INF/jsp/web/pop/kakaoFtPop.jsp
Normal file
30
src/main/webapp/WEB-INF/jsp/web/pop/kakaoFtPop.jsp
Normal file
@ -0,0 +1,30 @@
|
||||
|
||||
<%@ page contentType="text/html; charset=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"%>
|
||||
|
||||
|
||||
<!-- 카톡발송 > 친구톡 -->
|
||||
<div class="info_popup" id="friendTalkSend">
|
||||
<div class="popup_heading">
|
||||
<p>사용안내</p>
|
||||
</div>
|
||||
<div class="layer_in layer_info_wrap">
|
||||
<ul class="info_list">
|
||||
<!-- <li>친구톡 텍스트형은 최대 1,000자까지 작성 가능 (이미지형 400자, 와이드 이미지형 76자)</li>
|
||||
<li>변수는 [*이름*], [*1*]~[*4*]까지 입력하실 수 있습니다.</li>
|
||||
<li>광고성 정보 포함 시, 자동으로 (광고) 표시와 080무료수신거부번호가 메시지 내용에 표시됩니다.</li>
|
||||
<li>(광고) 표기 사용 여부는 선택 가능하나, (광고) 표기 해제에 따른 법규 의무사항 미준수 시, 메시지 발송이 중단될 수 있습니다.</li>
|
||||
<li>예약 메시지는 수정 가능하며, 예약 발송시간 5분전까지만 취소·삭제 가능합니다.</li>
|
||||
-->
|
||||
<li>친구톡은 알림톡과 달리 별도의 템플릿 심사가 필요하지 않습니다.</li>
|
||||
<li>등록된 템플릿은 자유롭게 삭제가 가능합니다.</li>
|
||||
<li>문자온이 제공하지 않는 이모티콘, 이모지를 포함하여 템플릿을 등록할 경우, 친구톡 발송이 불가합니다.</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<!-- // 카톡발송 > 친구톡 -->
|
||||
@ -202,55 +202,63 @@ function addrToList_advc(type){
|
||||
}
|
||||
|
||||
function loadAddrList(){
|
||||
console.log(' loadAddrList() ');
|
||||
|
||||
/*
|
||||
serialize 를 사용할때는 processData, contentType 옵션 제가할것
|
||||
*/
|
||||
var data = $("#searchAddrGrpForm").serialize();
|
||||
/*
|
||||
serialize 를 사용할때는 processDa ta, contentType 옵션 제가할것
|
||||
*/
|
||||
var data = $("#searchAddrGrpForm").serialize();
|
||||
|
||||
// var url = "/web/mjon/msgdata/selectMsgAddrListAjax.do";
|
||||
var url = "/web/mjon/msgdata/selectMsgAddrListAjax_advc.do";
|
||||
|
||||
$.ajax({
|
||||
|
||||
$.ajax({
|
||||
type: "POST",
|
||||
url: url,
|
||||
data: data,
|
||||
dataType:'json',
|
||||
async: false,
|
||||
async: true,
|
||||
cache: false,
|
||||
success: function (data) {
|
||||
console.log('data : ', data);
|
||||
if(data.status == "OK"){ // status 확인 필요한가. 석세스 안뜨면 에러 가지 않나
|
||||
|
||||
var addrList = data.object;
|
||||
console.log('data : ', data);
|
||||
if(data.status == "OK"){ // status 확인 필요한가. 석세스 안뜨면 에러 가지 않나
|
||||
|
||||
if(addrList.length == 0){
|
||||
var addrList = data.object;
|
||||
|
||||
alert("주소록 정보가 없습니다.");
|
||||
// tableAddr.setData([]);
|
||||
return false;
|
||||
}
|
||||
tableAddr.setData(addrList);
|
||||
}
|
||||
else
|
||||
{
|
||||
alert("주소록 불러오기에 실패하였습니다. !!");
|
||||
}
|
||||
if(addrList.length == 0){
|
||||
|
||||
alert("주소록 정보가 없습니다.");
|
||||
// tableAddr.setData([]);
|
||||
return false;
|
||||
}
|
||||
|
||||
// console.log('data : ', data);
|
||||
tableAddr.setData(addrList);
|
||||
}
|
||||
else
|
||||
{
|
||||
alert("주소록 불러오기에 실패하였습니다. !!");
|
||||
}
|
||||
},
|
||||
error: function (e) {
|
||||
alert("주소록 불러오기에 실패하였습니다."); console.log("ERROR : ", e);
|
||||
}
|
||||
, beforeSend : function(xmlHttpRequest) {
|
||||
//로딩창 show
|
||||
error: function (jqXHR, textStatus, errorThrown) {
|
||||
alert("주소록 불러오기에 실패하였습니다.");
|
||||
console.error("Error:", jqXHR.status, textStatus, errorThrown);
|
||||
console.error("Response Text:", jqXHR.responseText);
|
||||
try {
|
||||
let json = JSON.parse(jqXHR.responseText);
|
||||
console.log("Parsed JSON Response:", json);
|
||||
} catch (e) {
|
||||
console.error("JSON Parse Error:", e);
|
||||
}
|
||||
},
|
||||
beforeSend : function(xmlHttpRequest) {
|
||||
//로딩창 show
|
||||
$('.loading_layer').addClass('active');
|
||||
}
|
||||
, complete : function(xhr, textStatus) {
|
||||
},
|
||||
complete : function(xhr, textStatus) {
|
||||
//로딩창 hide
|
||||
$('.loading_layer').removeClass('active');
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
}
|
||||
|
||||
function fnAddrSearch(){
|
||||
|
||||
538
src/main/webapp/js/kakao/ft/addr.js
Normal file
538
src/main/webapp/js/kakao/ft/addr.js
Normal file
@ -0,0 +1,538 @@
|
||||
$(document).on('click', '.addressregi_btn', function() {
|
||||
var tableData = tableL.getRows();
|
||||
var dataLen = tableL.getRows().length;
|
||||
if(dataLen == 0){
|
||||
alert("연락처 정보를 등록해 주세요.");
|
||||
return false;
|
||||
}else{
|
||||
$('.addressregi_layer').css({'width':'680px','display':'block','left':'50%','top':'50%','transform':'translate(-50%,-50%)'});
|
||||
setTimeout(function(){
|
||||
$('.addressregi_layer').css({'opacity':'1'});
|
||||
},150);
|
||||
$('.mask').addClass('on');
|
||||
getAddrGroupList();
|
||||
}
|
||||
});
|
||||
|
||||
$(document).on('click', '.addressregi_layer .tooltip-close', function() {
|
||||
$('.addressregi_layer').attr('style','');
|
||||
$("#addrGrpNm").val("");
|
||||
});
|
||||
|
||||
$(document).on('change', '#addrGrpIdInfo', function() {
|
||||
if ($("#addrGrpIdInfo option:selected").val() != "NEW") {
|
||||
$("#addrGrpNm").val(""); // 새그룹명 Clear;
|
||||
}
|
||||
});
|
||||
|
||||
//주소록 그룹정보 불러오기
|
||||
function getAddrGroupList() {
|
||||
$.ajax({
|
||||
type : "POST",
|
||||
async : false,
|
||||
url : "/web/mjon/addr/addrGroupListAjax.do",
|
||||
data : {},
|
||||
dataType:'json',
|
||||
success : function(data) {
|
||||
//alert(JSON.stringify(data.addrGroupList));
|
||||
|
||||
// Show Html
|
||||
getAddrGroupListShow(data.addrGroupList);
|
||||
},
|
||||
error : function(xhr, status, error) {
|
||||
alert(error);
|
||||
return false;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
//Show Html
|
||||
function getAddrGroupListShow(jsonList) {
|
||||
var sHtml = "";
|
||||
sHtml += "<option value='NEW'>그룹추가</option>";
|
||||
sHtml += "<option value='0'>그룹미지정</option>";
|
||||
sHtml += "<option value='bookmark'>자주보내는 번호</option>";
|
||||
for (var j = 0; j < jsonList.length; j++) {
|
||||
sHtml += " <option value='" + $.trim(jsonList[j].addrGrpId) + "' />" + $.trim(jsonList[j].addrGrpNm) + "</option>";
|
||||
}
|
||||
|
||||
$("#addrGrpIdInfo").html(sHtml);
|
||||
}
|
||||
|
||||
//주소록 그룹 중복체크
|
||||
function getAddrGroupDuplCheckAjax(addrGrpNm) {
|
||||
console.log('addrGrpNm : ', addrGrpNm)
|
||||
console.log('getAddrGroupDuplCheckAjax()')
|
||||
var isReturn = true;
|
||||
|
||||
$.ajax({
|
||||
url : "<c:url value='/web/addr/getAddrGroupDuplCheckAjax.do' />",
|
||||
type : 'POST',
|
||||
data : {"addrGrpNm" : addrGrpNm},
|
||||
dataType:'json',
|
||||
async: false, // 동기
|
||||
success : function(data, status){
|
||||
if(data.isSuccess == true) {
|
||||
if(data.isDupl == true) {
|
||||
//alert("중복된 그룹명입니다.");
|
||||
isReturn = false;
|
||||
}
|
||||
}
|
||||
else {
|
||||
//alert("Message : " + msg);
|
||||
}
|
||||
},
|
||||
error: function (e) {
|
||||
//alert("주소록 중복체크에 실패했습니다.");
|
||||
}
|
||||
});
|
||||
|
||||
return isReturn;
|
||||
}
|
||||
|
||||
//주소록 팝업 닫기 기능
|
||||
function addrClose(){
|
||||
|
||||
$(".closeAddr").trigger("click");
|
||||
|
||||
//주소록 레이어 팝업의 Tabulator 데이터 지워주기
|
||||
tableAddr.clearData();
|
||||
|
||||
}
|
||||
|
||||
//주소록 불러오기에서 수신자 리스트 추가해 주기
|
||||
/*
|
||||
function addrToList(){
|
||||
|
||||
var selectedData = tableAddr.getSelectedRows();
|
||||
var tableData = [];
|
||||
|
||||
if(selectedData == "" || selectedData == null){
|
||||
|
||||
alert("주소록을 선택해 주세요.");
|
||||
return false;
|
||||
|
||||
}else{ // 선택한 Row 데이터 저장해주기
|
||||
|
||||
// 선택한 Row 데이터 저장해주기
|
||||
// if(selectedData.length > 500){
|
||||
// alert("최대 발송 건수는 500 입니다.");
|
||||
// return false;
|
||||
// }else{
|
||||
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 addrToList_advc(type){
|
||||
|
||||
|
||||
// 선택된 데이터 또는 전체 데이터 변수 초기화
|
||||
let selectedData = type === 'select' ? tableAddr.getSelectedRows() : tableAddr.getData();
|
||||
|
||||
// 데이터가 비어있으면 경고 후 종료
|
||||
if (!selectedData || selectedData.length < 1) {
|
||||
|
||||
if(tableAddr.getDataCount() < 1){
|
||||
alert("주소록을 선택해 주세요.");
|
||||
}else{
|
||||
alert("전화번호를 선택해 주세요.");
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
// 데이터 변환 로직
|
||||
const addrData = selectedData.map(row => {
|
||||
const rowData = type === 'select' ? row.getData() : row; // 'select'는 행 객체에서 데이터 추출
|
||||
return {
|
||||
name: rowData.name,
|
||||
phone: removeDash(rowData.phone),
|
||||
rep1: rowData.rep1,
|
||||
rep2: rowData.rep2,
|
||||
rep3: rowData.rep3,
|
||||
rep4: rowData.rep4
|
||||
};
|
||||
})
|
||||
.filter(row => checkHpNum(row.phone)); // 유효한 번호만 필터링;
|
||||
|
||||
|
||||
// 기존 tableL의 데이터를 가져옵니다.
|
||||
var existingData = tableL.getData();
|
||||
// 기존 데이터와 새로운 데이터를 합칩니다.
|
||||
var combinedData = existingData.concat(addrData);
|
||||
|
||||
// @ phone을 기준으로 중복 제거 및 갯수 계산
|
||||
const result = removeDuplicatesAndCount(combinedData, 'phone');
|
||||
|
||||
|
||||
|
||||
// 총 30만건이 넘으면 false
|
||||
if (!validateRowLimit(result.uniqueCount)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
setAllCntData(result);
|
||||
|
||||
|
||||
// 미리보기 버튼 활성화
|
||||
|
||||
|
||||
$(".closeAddr").trigger("click");
|
||||
//주소록 레이어 팝업의 Tabulator 데이터 지워주기
|
||||
tableAddr.clearData();
|
||||
//결제 금액 구하기
|
||||
totalFtPriceSum(tableL.getRows().length);
|
||||
// fn_priceClclt(result.uniqueCount);
|
||||
}
|
||||
|
||||
function loadAddrList(){
|
||||
|
||||
/*
|
||||
serialize 를 사용할때는 processDa ta, contentType 옵션 제가할것
|
||||
*/
|
||||
var data = $("#searchAddrGrpForm").serialize();
|
||||
|
||||
var url = "/web/mjon/msgdata/selectMsgAddrListAjax_advc.do";
|
||||
|
||||
$.ajax({
|
||||
type: "POST",
|
||||
url: url,
|
||||
data: data,
|
||||
dataType:'json',
|
||||
async: true,
|
||||
cache: false,
|
||||
success: function (data) {
|
||||
console.log('data : ', data);
|
||||
if(data.status == "OK"){ // status 확인 필요한가. 석세스 안뜨면 에러 가지 않나
|
||||
|
||||
var addrList = data.object;
|
||||
|
||||
if(addrList.length == 0){
|
||||
|
||||
alert("주소록 정보가 없습니다.");
|
||||
// tableAddr.setData([]);
|
||||
return false;
|
||||
}
|
||||
|
||||
// console.log('data : ', data);
|
||||
tableAddr.setData(addrList);
|
||||
}
|
||||
else
|
||||
{
|
||||
alert("주소록 불러오기에 실패하였습니다. !!");
|
||||
}
|
||||
},
|
||||
error: function (jqXHR, textStatus, errorThrown) {
|
||||
alert("주소록 불러오기에 실패하였습니다.");
|
||||
console.error("Error:", jqXHR.status, textStatus, errorThrown);
|
||||
console.error("Response Text:", jqXHR.responseText);
|
||||
try {
|
||||
let json = JSON.parse(jqXHR.responseText);
|
||||
console.log("Parsed JSON Response:", json);
|
||||
} catch (e) {
|
||||
console.error("JSON Parse Error:", e);
|
||||
}
|
||||
},
|
||||
beforeSend : function(xmlHttpRequest) {
|
||||
//로딩창 show
|
||||
$('.loading_layer').addClass('active');
|
||||
},
|
||||
complete : function(xhr, textStatus) {
|
||||
//로딩창 hide
|
||||
$('.loading_layer').removeClass('active');
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
function fnAddrSearch(){
|
||||
|
||||
var form = document.searchAddrGrpForm;
|
||||
form.searchKeyword.value = form.searchAddrKeyword.value;
|
||||
form.searchCondition.value = form.searchAddrCondition.value;
|
||||
|
||||
loadAddrList();
|
||||
|
||||
}
|
||||
|
||||
//주소록 불러오기 팝업의 그룹 선택시 우측에 주소록 불러오기
|
||||
function fnSelectAddrList(type,addrGrpId,item){
|
||||
|
||||
// 주소록 그룹 열림, 닫힘 폴더이미지 초기화
|
||||
$(".adr_pop_list div p").each(function (index, item) {
|
||||
$(item).find("img").attr("src", "/publish/images/content/close_folder2.png");
|
||||
$(item).find("img").attr("alt", "폴더 닫힘");
|
||||
});
|
||||
|
||||
var form = document.searchAddrGrpForm;
|
||||
form.type.value = type;
|
||||
form.searchAddrGrpId.value = addrGrpId;
|
||||
form.searchKeyword.value = "";
|
||||
form.searchCondition.value = form.searchAddrCondition.value;
|
||||
|
||||
//왼쪽 그룹리스트의 그룸명을 선택시 검색어를 초기화해준다.
|
||||
form.searchAddrKeyword.value="";
|
||||
|
||||
/*
|
||||
$(item).toggleClass("open");
|
||||
if ($(item).hasClass("open") === true) {
|
||||
$(item).find("img").attr("src", "/publish/images/content/open_folder2.png");
|
||||
$(item).find("img").attr("alt", "폴더 열림");
|
||||
}
|
||||
else {
|
||||
$(item).find("img").attr("src", "/publish/images/content/close_folder2.png");
|
||||
$(item).find("img").attr("alt", "폴더 닫힘");
|
||||
}
|
||||
*/
|
||||
|
||||
$(item).find("img").attr("src", "/publish/images/content/open_folder2.png");
|
||||
$(item).find("img").attr("alt", "폴더 열림");
|
||||
|
||||
loadAddrList();
|
||||
|
||||
}
|
||||
|
||||
//주소록 불러오기 그룹명 검색 기능처리
|
||||
function fnAddrGrpSearch(){
|
||||
|
||||
var form = document.searchAddrGrpForm;
|
||||
form.searchKeyword.value = form.searchGrpKeyword.value;
|
||||
form.searchCondition.value = "";
|
||||
|
||||
var sendData = $(document.searchAddrGrpForm).serializeArray();
|
||||
|
||||
$("#addrGroupLoad").load("/web/mjon/msgdata/selectAddrGroupListAjax.do", sendData ,function(response, status, xhr){
|
||||
//리스트 스크롤 처리해주기
|
||||
$(".adr_pop_list").mCustomScrollbar({
|
||||
axis: 'y',
|
||||
scrollbarPosition: "outside",
|
||||
theme: "dark",
|
||||
autoHideScrollbar: false
|
||||
});
|
||||
});
|
||||
|
||||
}
|
||||
/*
|
||||
//문자발송 받는사람 목록 주소록에 등록하기 기능 처리
|
||||
$('.registAddr').click(function(){
|
||||
|
||||
var tableData = tableL.getRows();
|
||||
var dataLen = tableL.getRows().length;
|
||||
|
||||
var nameList = []; //치환문자 이름
|
||||
var phoneNum = []; //받는사람
|
||||
var rep1List = []; //치환문자1
|
||||
var rep2List = []; //치환문자2
|
||||
var rep3List = []; //치환문자3
|
||||
var rep4List = []; //치환문자4
|
||||
|
||||
if(dataLen > 0){
|
||||
|
||||
for(var i=0; i < dataLen; i++){
|
||||
|
||||
var name = tableData[i].getData().name;
|
||||
var phone = removeDash(tableData[i].getData().phone);
|
||||
var rep1 = tableData[i].getData().rep1;
|
||||
var rep2 = tableData[i].getData().rep2;
|
||||
var rep3 = tableData[i].getData().rep3;
|
||||
var rep4 = tableData[i].getData().rep4;
|
||||
|
||||
if(phone == "" || phone == null){
|
||||
|
||||
alert("수신 목록에 핸드폰 번호가 없는 항목이 있습니다.");
|
||||
return false;
|
||||
|
||||
}else if(!checkHpNum(phone)){
|
||||
|
||||
alert("수신 목록에 잘 못된 핸드폰 번호가 있습니다. 핸드폰 번호 : " + phone + " 입니다.");
|
||||
return false;
|
||||
|
||||
}
|
||||
|
||||
nameList[i] = name;
|
||||
phoneNum[i] = phone;
|
||||
|
||||
if(rep1 == "" || rep1 == null){
|
||||
rep1List[i] = "-";
|
||||
}else{
|
||||
rep1List[i] = rep1;
|
||||
}
|
||||
|
||||
if(rep2 == "" || rep2 == null){
|
||||
rep2List[i] = "-";
|
||||
}else{
|
||||
rep2List[i] = rep2;
|
||||
}
|
||||
|
||||
if(rep3 == "" || rep3 == null){
|
||||
rep3List[i] = "-";
|
||||
}else{
|
||||
rep3List[i] = rep3;
|
||||
}
|
||||
|
||||
if(rep4 == "" || rep4 == null){
|
||||
rep4List[i] = "-";
|
||||
}else{
|
||||
rep4List[i] = rep4;
|
||||
}
|
||||
|
||||
if(name == "" || name == null){
|
||||
|
||||
alert("수신 목록에 이름이 없는 항목이 있습니다. 이름을 입력해 주세요");
|
||||
return false;
|
||||
|
||||
}else{
|
||||
|
||||
nameList[i] = name;
|
||||
phoneNum[i] = phone;
|
||||
|
||||
if(rep1 == "" || rep1 == null){
|
||||
rep1List[i] = "-";
|
||||
}else{
|
||||
rep1List[i] = rep1;
|
||||
}
|
||||
|
||||
if(rep2 == "" || rep2 == null){
|
||||
rep2List[i] = "-";
|
||||
}else{
|
||||
rep2List[i] = rep2;
|
||||
}
|
||||
|
||||
if(rep3 == "" || rep3 == null){
|
||||
rep3List[i] = "-";
|
||||
}else{
|
||||
rep3List[i] = rep3;
|
||||
}
|
||||
|
||||
if(rep4 == "" || rep4 == null){
|
||||
rep4List[i] = "-";
|
||||
}else{
|
||||
rep4List[i] = rep4;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//주소록 정보를 Form에 넣어준다.
|
||||
|
||||
var form = document.msgForm;
|
||||
form.callToList.value = phoneNum;
|
||||
form.nameList.value = nameList;
|
||||
form.rep1List.value = rep1List;
|
||||
form.rep2List.value = rep2List;
|
||||
form.rep3List.value = rep3List;
|
||||
form.rep4List.value = rep4List;
|
||||
form.addrGrpId.value = $("#addrGrpIdInfo").val();
|
||||
form.addrGrpNm.value = $("#addrGrpNm").val();
|
||||
|
||||
if ($("#addrGrpIdInfo option:selected").val() == "NEW" && ($("#addrGrpNm").val() == "" || $("#addrGrpNm").val() == null || $("#addrGrpNm").val() == undefined)) {
|
||||
alert("저장할 그룹을 선택하거나 새 그룹명을 입력해주세요.");
|
||||
return false;
|
||||
}else if ($("#addrGrpIdInfo option:selected").val() == "NEW" && $("#addrGrpNm").val() != "") {
|
||||
//주소록 중복체크
|
||||
if (getAddrGroupDuplCheckAjax() == false) {
|
||||
alert("중복된 그룹명입니다. 새 그룹명을 입력해주세요.");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
if(confirm("연락처 정보를 주소록에 등록 하시겠습니까?")){
|
||||
|
||||
var data = new FormData(form);
|
||||
var url = "/web/mjon/msgdata/insertMsgAddrListAjax.do";
|
||||
|
||||
$.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.result == "success"){
|
||||
var alertMsg = "총 " + returnData.resultCnt + "건의 " +returnData.message;
|
||||
|
||||
if(returnData.dupliCnt > 0) {
|
||||
alertMsg += "\n"+numberWithCommas(returnData.dupliCnt) + "건은 이미 등록되어있는 번호입니다.";
|
||||
}
|
||||
|
||||
alert(alertMsg);
|
||||
$("#addrGrpNm").val("");
|
||||
$('.addressregi_layer').attr('style','');
|
||||
$('.mask').removeClass('on');
|
||||
return false;
|
||||
|
||||
}else if(returnData.result == "allDupl") {
|
||||
alert("요청하신 "+returnData.dupliCnt+"건의 번호가 주소록에 이미 등록되어있습니다.");
|
||||
$("#addrGrpNm").val("");
|
||||
$('.addressregi_layer').attr('style','');
|
||||
$('.mask').removeClass('on');
|
||||
return false;
|
||||
}else{
|
||||
alert(returnData.message);
|
||||
$("#addrGrpNm").val("");
|
||||
$('.addressregi_layer').attr('style','');
|
||||
$('.mask').removeClass('on');
|
||||
return false;
|
||||
|
||||
}
|
||||
|
||||
} else if(status== 'fail'){
|
||||
alert("주소록 등록에 실패하였습니다. !!");
|
||||
}
|
||||
},
|
||||
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');
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
}else{
|
||||
|
||||
alert("연락처 정보를 등록해 주세요.");
|
||||
return false;
|
||||
|
||||
}
|
||||
|
||||
|
||||
});
|
||||
*/
|
||||
@ -13,6 +13,18 @@
|
||||
*
|
||||
*/
|
||||
|
||||
//카카오 mms sms 단가 셋팅
|
||||
var KAKAO_FT_PRICE = '';
|
||||
var SHORT_PRICE = '';
|
||||
var LONG_PRICE = '';
|
||||
$('document').ready(function(){
|
||||
|
||||
KAKAO_FT_PRICE = Number($('#kakaoFtPrice').val());
|
||||
SHORT_PRICE = Number($('#shortPrice').val());
|
||||
LONG_PRICE = Number($('#longPrice').val());
|
||||
console.log('SHORT_PRICE: ', SHORT_PRICE);
|
||||
console.log('LONG_PRICE: ', LONG_PRICE);
|
||||
});
|
||||
|
||||
/**
|
||||
*
|
||||
@ -21,67 +33,59 @@
|
||||
* 대체 문자 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();
|
||||
function totalFtPriceSum(totRows) {
|
||||
console.log(' :totalFtPriceSum: ');
|
||||
// 수신자 수 계산
|
||||
var count = parseInt(totRows);
|
||||
|
||||
// 기본 단가는 일반 친구톡 이미지 없는 가격
|
||||
var price = KAKAO_FT_PRICE;
|
||||
|
||||
// 선택된 이미지 유형에 따라 단가 변경
|
||||
var imgTypeId = $("input[name='img_file_add']:checked").attr("id");
|
||||
if (imgTypeId === "img_file_1") price = KAKAO_FT_IMG_PRICE;
|
||||
else if (imgTypeId === "img_file_2") price = KAKAO_FT_WIDE_IMG_PRICE;
|
||||
|
||||
// 대체문자 발송 옵션이 체크된 경우, 메시지 종류별로 단가 재계산
|
||||
if ($("#send_fail_check").is(":checked")) {
|
||||
if (imgTypeId === "img_file_0") {
|
||||
// 장문/단문 여부에 따라 가격 비교 후 더 큰 값으로 설정
|
||||
|
||||
var contents = adYChkAndMakeContents($('#smsTxtArea').val());
|
||||
|
||||
var len = conByteLeng(contents);
|
||||
var long = parseFloat($("#longPrice").val());
|
||||
var short = parseFloat($("#shortPrice").val());
|
||||
price = Math.max(price, len > 90 ? long : short);
|
||||
} else {
|
||||
// 이미지 대체문자의 경우 별도 이미지 가격과 비교
|
||||
var picture = parseFloat($('#picturePrice').val());
|
||||
price = Math.max(price, picture);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
totalPrice = price * collNumCnt;
|
||||
|
||||
// 소수점 첫째자리 까지 표시
|
||||
totalPrice = totalPrice.toFixed(1);
|
||||
|
||||
if(totalPrice > 0){
|
||||
|
||||
//totalStr = totalPrice.toFixed(2);
|
||||
totalStr = totalPrice;
|
||||
|
||||
}
|
||||
|
||||
//개별 문자 단가 파라미터에 입력
|
||||
|
||||
// 총 금액 계산 (단가 * 수신자 수)
|
||||
var totalPrice = (price * count).toFixed(1);
|
||||
var totalStr = totalPrice > 0 ? totalPrice : "0";
|
||||
|
||||
// 사용자 보유 금액 텍스트에서 콤마 제거 (표시 용도일 뿐 실제 계산엔 안 씀)
|
||||
var userMoney = $('#hdUserMoney').text().replaceAll(",", "") || 0;
|
||||
|
||||
// 개별 단가, 총 금액을 input/화면에 반영
|
||||
$('#eachPrice').val(numberWithCommas(price));
|
||||
|
||||
//결제금액 합계 파라이터에 입력
|
||||
$('#totPrice').val(numberWithCommas(totalStr));
|
||||
|
||||
//결제금액 합계 화면에 표시
|
||||
$('#totalPriceTxt').text(numberWithCommas(totalStr));
|
||||
|
||||
$('#repPriceTxt').hide();
|
||||
|
||||
return totalStr;
|
||||
|
||||
$('#repPriceTxt').hide(); // 기존 합계 표시 숨김
|
||||
|
||||
return totalStr; // 계산된 총 금액 반환
|
||||
}
|
||||
|
||||
function adYChkAndMakeContents(contents){
|
||||
if ($("#ad_Y").is(":checked")) {
|
||||
contents = "(광고)"+contents+"\n무료거부 0808800858"
|
||||
}
|
||||
return contents;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
@ -89,10 +93,6 @@ function totalFtPriceSum(totRows){
|
||||
*
|
||||
* */
|
||||
|
||||
//카카오 mms sms 단가 셋팅
|
||||
var KAKAO_FT_PRICE = '';
|
||||
var SHORT_PRICE = '';
|
||||
var LONG_PRICE = '';
|
||||
|
||||
/*$(document).ready(function(){
|
||||
|
||||
@ -153,14 +153,17 @@ var LONG_PRICE = '';
|
||||
/**
|
||||
* @description 금액 계산 function
|
||||
*/
|
||||
function fn_priceClclt(){
|
||||
function fn_priceClclt(phoneSu = 0){
|
||||
console.log('fn_priceClclt : ', phoneSu);
|
||||
|
||||
// 미리보기 텍스트
|
||||
var templateHtml = $('#smsTxtArea').val();
|
||||
// var templateHtml = $('.template_text').html();
|
||||
|
||||
// 수신 번호 개수
|
||||
var phoneSu = $('.phoneArea').length;
|
||||
if(phoneSu == 0){
|
||||
phoneSu = $('.phoneArea').length;
|
||||
}
|
||||
// 대체문자 있는지 확인
|
||||
var isSendFailChecked = $("#send_fail_check").is(":checked");
|
||||
// 치환문자 여부 확인
|
||||
@ -183,12 +186,13 @@ function fn_priceClclt(){
|
||||
* 카카오 금액 * 수신자 수 계산
|
||||
*/
|
||||
function fn_sendFailUnChecked(phoneSu){
|
||||
console.log('phoneSu; ', phoneSu);
|
||||
|
||||
// 카카오 금액 * 수신자 수
|
||||
// fn_writePriceText() 첫 파라미터가 null이면 카카오 전송으로 인식
|
||||
fn_writePriceText('', phoneSu);
|
||||
// $('#totalPriceTxt').text((KAKAO_AT_PRICE * phoneSu).toFixed(1));
|
||||
fn_priceText('알림톡', phoneSu);
|
||||
fn_priceText('친구톡', phoneSu);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -279,9 +283,9 @@ function fn_writePriceText(msgTypeText, phoneSu){
|
||||
msgTypeText = msgTypeText.trim();
|
||||
if(msgTypeText == '단문') price = SHORT_PRICE * phoneSu;
|
||||
else if(msgTypeText == '장문') price = LONG_PRICE * phoneSu;
|
||||
else price = KAKAO_AT_PRICE * phoneSu; // 카카오
|
||||
else price = KAKAO_FT_PRICE * phoneSu; // 카카오
|
||||
|
||||
$('#totalPriceTxt').text((price).toFixed(1));
|
||||
$('#totalPriceTxt').text(numberWithCommas((price).toFixed(1)));
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -20,40 +20,41 @@ $(document).ready(function (){
|
||||
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,
|
||||
columnDefaults:{ // 공통설정
|
||||
hozAlign: "center",
|
||||
headerHozAlign: "center",
|
||||
editor: false,
|
||||
editor: 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){
|
||||
{formatter:"rowSelection", headerHozAlign:"center", titleFormatter:"rowSelection",clipboard:false, hozAlign:"center", width:5, headerSort:false, cellClick:function(e, cell){
|
||||
cell.getRow().toggleSelect();
|
||||
}},
|
||||
{title:"이름", hozAlign:"center", field:"name", 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){
|
||||
{title:"휴대폰", hozAlign:"center", field:"phone", 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){
|
||||
{title:"[*1*]", hozAlign:"center", field:"rep1", 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){
|
||||
{title:"[*2*]", hozAlign:"center", field:"rep2", 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){
|
||||
{title:"[*3*]", hozAlign:"center", field:"rep3", 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){
|
||||
{title:"[*4*]", hozAlign:"center", field:"rep4", minWidth:60, validator:["maxLength:40"], cellEdited:function(cell){
|
||||
//cell - cell component
|
||||
fnReplCell();
|
||||
}},
|
||||
@ -88,7 +89,7 @@ $(document).ready(function (){
|
||||
|
||||
});
|
||||
|
||||
|
||||
/*
|
||||
//주소록 불러오기 팝업 내용
|
||||
//Tabulator AJAX Data Loading
|
||||
tableAddr = new Tabulator(".callAddr_box", {
|
||||
@ -126,7 +127,61 @@ $(document).ready(function (){
|
||||
return value % parameters.addrPhone;
|
||||
},
|
||||
|
||||
});
|
||||
});*/
|
||||
|
||||
|
||||
// Tabulator 초기화
|
||||
tableAddr = new Tabulator(".callAddr_box", {
|
||||
height: "255px",
|
||||
layout: "fitData",
|
||||
headerHozAlign: "center",
|
||||
validationMode: "highlight",
|
||||
resizableColumns: true,
|
||||
progressiveLoad:"scroll",
|
||||
progressiveRender: true, // 렌더링 최적화 활성화
|
||||
progressiveRenderSize: 100, // 한 번에 렌더링할 행 수를 줄임
|
||||
placeholder: "주소록 그룹을 선택해 주세요.",
|
||||
columns: [
|
||||
// {formatter: "rowSelection", clipboard: false, hozAlign: "center", headerSort: false},
|
||||
{formatter: "rowSelection", titleFormatter: "rowSelection", hozAlign: "center", headerSort: false,
|
||||
cellClick: function(e, cell) {
|
||||
fn_loadAddActive(); // 로딩 활성화
|
||||
setTimeout(() => {
|
||||
tableAddr.blockRedraw(); // 렌더링 차단
|
||||
cell.getRow().toggleSelect(); // 선택 상태 토글
|
||||
tableAddr.restoreRedraw(); // 렌더링 재개
|
||||
fn_loadRemoveActive(); // 로딩 비활성화
|
||||
}, 0); // 비동기적으로 실행
|
||||
}
|
||||
},
|
||||
{title: "No", hozAlign: "center", formatter: "rownum", align: "center", headerHozAlign: "center", width: 60},
|
||||
{title: "그룹명", hozAlign: "center", field: "addrGroupNm", editor: false, width: 100},
|
||||
{title: "이름", hozAlign: "center", field: "name", editor: false, width: 100},
|
||||
{title: "휴대폰번호", hozAlign: "center", field: "phone", editor: false, width: 100},
|
||||
{title: "[*1*]", hozAlign: "center", field: "rep1", editor: false, width: 84},
|
||||
{title: "[*2*]", hozAlign: "center", field: "rep2", editor: false, width: 84},
|
||||
{title: "[*3*]", hozAlign: "center", field: "rep3", editor: false, width: 84},
|
||||
{title: "[*4*]", hozAlign: "center", field: "rep4", editor: false, width: 84},
|
||||
],
|
||||
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글자 이내로 입력 가능합니다.");
|
||||
} else {
|
||||
alert("치환문자를 정확히 입력해 주세요. 100글자 이내로 입력 가능합니다.");
|
||||
}
|
||||
cell.setValue("");
|
||||
}
|
||||
console.log('parameters : ', parameters);
|
||||
return value % parameters.addrPhone;
|
||||
},
|
||||
});
|
||||
|
||||
|
||||
//받는사람 번호 버튼 클릭시 Tabulator에 데이터 넣어주기
|
||||
@ -186,6 +241,9 @@ $(document).ready(function (){
|
||||
addPhoneInfo(tabledata);
|
||||
|
||||
$('#callTo').val("");
|
||||
|
||||
|
||||
fn_priceText('친구톡', tableL.getDataCount());
|
||||
|
||||
}
|
||||
|
||||
@ -496,6 +554,210 @@ $(document).ready(function (){
|
||||
|
||||
});
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//받는사람 목록에 복사/붙여넣기 기능 처리
|
||||
$('.callList_box').on('paste', function (e) {
|
||||
console.log(' :: callList _box :: ');
|
||||
|
||||
var element = e.originalEvent.clipboardData.getData('text'); // 클립보드에 복사한 데이터 가져오기
|
||||
|
||||
var elmSplit= [];
|
||||
|
||||
elmSplit = element.split("\n");
|
||||
|
||||
var elmLen = elmSplit.length;
|
||||
|
||||
|
||||
if(elmLen < 0){
|
||||
|
||||
alert("붙여넣을 연락처를 복사해주세요.");
|
||||
return false;
|
||||
|
||||
}else{
|
||||
tableErrorData.length = 0; // 오류 번호 배열 초기화
|
||||
|
||||
var splitData = [];
|
||||
var realPhone = [];
|
||||
for(var i=0; i < elmLen; i++){
|
||||
|
||||
var splitStr = elmSplit[i];
|
||||
var tabData = [];
|
||||
var comData = [];
|
||||
|
||||
if(splitStr.indexOf('\t') != -1){
|
||||
splitData = splitStr.split('\t'); //탭 구분으로 데이터 분할
|
||||
}else if(splitStr.indexOf(',') != -1){
|
||||
splitData = splitStr.split(','); //콤마 구분으로 데이터 분할
|
||||
}else{
|
||||
splitData = splitStr.split(' ');
|
||||
}
|
||||
|
||||
|
||||
if(splitData.length == 0){// 데이터가 없는경우
|
||||
|
||||
alert("탭으로 구분하여 데이터를 복사해 주세요.");
|
||||
return false;
|
||||
|
||||
}else if(splitData.length == 1){// 데이터가 탭으로 구분이 없는 경우
|
||||
|
||||
for(var j=0; j < splitData.length; j++){
|
||||
if(checkHpNum(splitData[j].trim())){//핸드폰 양식이 맞는지 확인
|
||||
//배열 끝에 데이터 추가해 주기
|
||||
realPhone.push({phone: removeDash(splitData[j].trim()), name: ""});
|
||||
}
|
||||
else {
|
||||
if (splitData[j].trim() != '' && splitData[j].trim() != null && splitData[j].trim() != undefined) {
|
||||
tableErrorData.push(splitData[j].trim());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}else{//데이터가 탭으로 구분되어 이름, 연락처로 구분된 경우
|
||||
|
||||
var phone = ""; //핸드폰번호
|
||||
var name = ""; //이름
|
||||
var rep1 = ""; //치환문자1
|
||||
var rep2 = ""; //치환문자2
|
||||
var rep3 = ""; //치환문자3
|
||||
var rep4 = ""; //치환문자4
|
||||
var isPhoneValid = false;
|
||||
for(var j=0; j < splitData.length; j++){
|
||||
|
||||
if(j == 0){
|
||||
|
||||
name = splitData[j].trim();
|
||||
|
||||
}
|
||||
|
||||
if(j == 1){
|
||||
|
||||
if(checkHpNum(splitData[j].trim())){//핸드폰 양식이 맞는지 확인
|
||||
phone = removeDash(splitData[j].trim());
|
||||
isPhoneValid = true;
|
||||
}else{
|
||||
if (splitData[j].trim() != '' && splitData[j].trim() != null && splitData[j].trim() != undefined) {
|
||||
tableErrorData.push(splitData[j].trim());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if(j == 2){ //치환문자1
|
||||
|
||||
rep1 = splitData[j].trim();
|
||||
|
||||
}
|
||||
|
||||
if(j == 3){ //치환문자2
|
||||
|
||||
rep2 = splitData[j].trim();
|
||||
|
||||
}
|
||||
|
||||
if(j == 4){ //치환문자3
|
||||
|
||||
rep3 = splitData[j].trim();
|
||||
|
||||
}
|
||||
|
||||
if(j == 5){ //치환문자4
|
||||
|
||||
rep4 = splitData[j].trim();
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if (isPhoneValid == true) {
|
||||
//배열 끝에 데이터 추가해 주기
|
||||
realPhone.push({phone: phone, name: name, rep1 : rep1, rep2 : rep2, rep3 : rep3, rep4 : rep4 });
|
||||
}
|
||||
|
||||
}//else end
|
||||
|
||||
}
|
||||
|
||||
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.trim()) , 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, });
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if(realPhone.length > 0){
|
||||
|
||||
for(var j=0; j < realPhone.length; j++){
|
||||
|
||||
tableData.push({phone: removeDash(realPhone[j].phone.trim()) , name: realPhone[j].name, rep1: realPhone[j].rep1, rep2: realPhone[j].rep2, rep3: realPhone[j].rep3, rep4: realPhone[j].rep4});
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//tableData.push(realPhone);
|
||||
|
||||
//중복 연락처 1개만 남기고 삭제하기
|
||||
var removeDuplPhone = dupliPhoneData(tableData);
|
||||
|
||||
//수신자 리스트에 전화번호 추가해주기
|
||||
//tableL.addData(removeDuplPhone);
|
||||
tableL.setData(removeDuplPhone);
|
||||
|
||||
totRows = tableL.getRows().length;
|
||||
updateTotCnt(totRows); //전체 데이터 갯수 구하기
|
||||
|
||||
var smsTxtArea = $('#smsTxtArea').val();
|
||||
|
||||
//일괄변환 문구 결제금액 처리
|
||||
if(smsTxtArea.indexOf("[*이름*]") > -1
|
||||
|| smsTxtArea.indexOf("[*1*]") > -1
|
||||
|| smsTxtArea.indexOf("[*2*]") > -1
|
||||
|| smsTxtArea.indexOf("[*3*]") > -1
|
||||
|| smsTxtArea.indexOf("[*4*]") > -1){
|
||||
|
||||
fnReplCell_advc();
|
||||
}else{
|
||||
//결제 금액 구하기
|
||||
// totalPriceSum(totRows);
|
||||
// 붙여넣기 했을때 금액 구하는 함수
|
||||
totalFtPriceSum(totRows);
|
||||
}
|
||||
|
||||
if (tableErrorData.length > 0) {
|
||||
alert("올바르지 않은 휴대폰 번호가 "+ tableErrorData.length +" 건 있습니다.");
|
||||
}
|
||||
|
||||
|
||||
// 미리보기 버튼 활성화
|
||||
// updateButtons(0);
|
||||
|
||||
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
});
|
||||
|
||||
var tableErrorData = [];
|
||||
@ -506,9 +768,9 @@ var totRows = 0; // 좌측 받는사람 총 갯수
|
||||
* 토탈 카운트 화면에 노출
|
||||
* 변수 없는 리스트만 체크
|
||||
*/
|
||||
function updateTotCnt(){
|
||||
function updateTotCnt(cnt){
|
||||
|
||||
$("#rowTotCnt").text($('#wrap01_body .list_body').length);
|
||||
$("#rowTotCnt").text(cnt);
|
||||
|
||||
}
|
||||
|
||||
@ -867,3 +1129,8 @@ $('.check_validity').click(function(){
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
127
src/main/webapp/js/kakao/ft/templateComm.js
Normal file
127
src/main/webapp/js/kakao/ft/templateComm.js
Normal file
@ -0,0 +1,127 @@
|
||||
/**
|
||||
* 알림톡 템플릿 내용 글자수 체크 및 표시, 미리보기 내용 표시
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
function setContentsLeng(contents){
|
||||
|
||||
|
||||
if ($("#ad_Y").is(":checked")) {
|
||||
contents = "(광고)"+contents+"\n무료거부 0808800858"
|
||||
}
|
||||
|
||||
var conLeng = strMaxCharacterCnt(contents);
|
||||
|
||||
if ($("#ad_Y").is(":checked")) {
|
||||
// 광고문구 제거
|
||||
contents = contents
|
||||
.replace(/^\(광고\)/, '') // 맨 앞의 (광고) 제거
|
||||
.replace(/\n무료거부\s*0808800858\s*$/, ''); // 맨 뒤의 '무료거부 0808800858' 제거
|
||||
|
||||
}
|
||||
|
||||
|
||||
if(conLeng > 1000){
|
||||
|
||||
alert("알림톡 내용은 1000자를 넘을 수 없습니다.");
|
||||
var splicecon = strMaxLengthSubstring(contents, 999);
|
||||
$('#inputTemplateContent').val(splicecon);
|
||||
return false;
|
||||
|
||||
}else{//현재 입력한 글자수 우측 하단에 표시해 주기
|
||||
|
||||
var repContent = "";
|
||||
repContent = contents.replace(/(?:\r\n|\r|\n)/g, '<br/>');
|
||||
|
||||
$('.nowChar').text(conLeng + " /");
|
||||
$('.template_text').show();
|
||||
if(repContent != ''){
|
||||
$('.template_text').html(repContent);
|
||||
}else{
|
||||
$('.template_text').html("내용 미리보기");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 친구톡 템플릿 내용 글자수 체크 및 표시, 미리보기 내용 표시
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
function setContentsLengForFriends(contents){
|
||||
|
||||
|
||||
// if ($("#ad_Y").is(":checked")) {
|
||||
// contents = "(광고)"+contents+"\n무료거부 0808800858"
|
||||
// }
|
||||
|
||||
var conLeng = strMaxCharacterCnt(contents);
|
||||
|
||||
// if ($("#ad_Y").is(":checked")) {
|
||||
// // 광고문구 제거
|
||||
// contents = contents
|
||||
// .replace(/^\(광고\)/, '') // 맨 앞의 (광고) 제거
|
||||
// .replace(/\n무료거부\s*0808800858\s*$/, ''); // 맨 뒤의 '무료거부 0808800858' 제거
|
||||
//
|
||||
// }
|
||||
|
||||
|
||||
var imageType = $("input[name=img_file_add]:checked").val();
|
||||
var limitLeng = 1000;
|
||||
|
||||
if(imageType == 'I'){
|
||||
|
||||
limitLeng = 400;
|
||||
|
||||
if(conLeng > limitLeng){
|
||||
|
||||
alert("일반 이미지 첨부시 친구톡 내용은 400자를 넘을 수 없습니다.");
|
||||
|
||||
}
|
||||
|
||||
}else if(imageType == 'W'){
|
||||
|
||||
limitLeng = 76;
|
||||
|
||||
if(conLeng > limitLeng){
|
||||
|
||||
alert("와이드 이미지 첨부시 친구톡 내용은 76자를 넘을 수 없습니다.");
|
||||
|
||||
}
|
||||
|
||||
}else if(conLeng > 1000){
|
||||
|
||||
alert("친구톡 내용은 1000자를 넘을 수 없습니다.");
|
||||
|
||||
}
|
||||
|
||||
//제한글자수를 넘겼을 경우 최대 글자수까지 잘라주고 미리보기 및 글자수 표시처리
|
||||
if(conLeng > limitLeng){
|
||||
|
||||
var splicecon = strMaxLengthSubstring(contents, limitLeng-1);
|
||||
$('#inputTemplateContent').val(splicecon);
|
||||
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("내용 미리보기");
|
||||
}
|
||||
|
||||
}
|
||||
@ -206,7 +206,7 @@ caption, .label {position: absolute;width: 1px;height: 1px;margin: -1px;border:
|
||||
|
||||
/* 사이트맵 */
|
||||
.layer_sitemap {overflow:hidden;position:relative;display:block;width:100%;height:0;border-bottom:1px solid #d5d5d5;background:#fff;z-index:16;/*transition:height 0.4s;*/}
|
||||
.layer_sitemap.active {height:635px;box-shadow:0px 20px 30px 0px rgba(0, 0, 0, 0.1);}
|
||||
.layer_sitemap.active {height:670px;box-shadow:0px 20px 30px 0px rgba(0, 0, 0, 0.1);}
|
||||
.layer_sitemap .inner {padding:0;letter-spacing:-0.025em;}
|
||||
.layer_sitemap .menu {display:flex;justify-content:space-between;}
|
||||
/*.layer_sitemap .menu > li {width:calc(100%/7);}*/
|
||||
|
||||
@ -1652,18 +1652,18 @@ button.check_validity:hover {border: 1px solid #a3a3a3;box-shadow: 0px 0px 5px
|
||||
.kakao_wrap .img_add_info_wrap .info_text{font-size: 15px; color: #555;}
|
||||
.kakao_wrap .img_add_info_wrap .info_text li{margin: 3px 0 0 0;}
|
||||
.kakao_wrap .img_file_add_wrap .info_title_text{font-weight: 500;margin:0 0 5px 0;}
|
||||
.kakao_wrap .img_file_add_wrap .btn_img_upload{width: 251px;}
|
||||
.kakao_wrap .img_file_add_wrap .img_file_info_wrap{width: 100%; max-width: 623px; border: 1px solid #e5e5e5; border-radius: 5px;}
|
||||
.kakao_wrap .img_file_add_wrap .img_file_info_wrap li{display: flex;min-height: 60px;padding: 10px 20px; border-bottom: 1px solid #e5e5e5;justify-content: space-between; align-items: center; box-sizing: border-box;}
|
||||
.kakao_wrap .img_file_add_wrap .img_file_info_wrap li:last-child{border-bottom: 0;}
|
||||
.kakao_wrap .img_file_add_wrap .file_name{font-size: 16px; font-weight: 500;}
|
||||
.kakao_wrap .img_file_add_wrap .btn_del{width: 30px;height: 30px;border: 1px solid #002c9a;border-radius: 5px;}
|
||||
.kakao_wrap .img_file_add_wrap .img_url{width: calc(100% - 190px);}
|
||||
.kakao_wrap .img_file_add_wrap .info_text{margin:0 0 10px 0;}
|
||||
.kakao_wrap .img_file_add_wrap .info_text li{list-style:1.4;}
|
||||
.kakao_wrap .img_file_add_wrap .img_file_wrap{display:inline-flex;width:calc(100% - 200px);}
|
||||
.kakao_wrap .img_file_add_wrap .img_file_wrap .file_name{width:calc(100% - 28px);}
|
||||
.kakao_wrap .img_file_add_wrap .img_file_wrap .file_name.file_none{color:#666;font-weight:300;line-height:1.8;}
|
||||
.kakao_wrap .img_file_info_wrap .btn_img_upload{width: 251px;}
|
||||
.kakao_wrap .img_file_info_wrap{display:none;width: 100%; max-width: 623px; border: 1px solid #e5e5e5; border-radius: 5px;margin:15px 0 0 0;}
|
||||
.kakao_wrap .img_file_info_wrap li{display: flex;min-height: 60px;padding: 10px 20px; border-bottom: 1px solid #e5e5e5;justify-content: space-between; align-items: center; box-sizing: border-box;}
|
||||
.kakao_wrap .img_file_info_wrap li:last-child{border-bottom: 0;}
|
||||
.kakao_wrap .img_file_info_wrap .file_name{font-size: 16px; font-weight: 500;}
|
||||
.kakao_wrap .img_file_info_wrap .btn_del{width: 30px;height: 30px;border: 1px solid #002c9a;border-radius: 5px;}
|
||||
.kakao_wrap .img_file_info_wrap .img_url{width: calc(100% - 190px);}
|
||||
.kakao_wrap .img_file_info_wrap .info_text{margin:0 0 10px 0;}
|
||||
.kakao_wrap .img_file_info_wrap .info_text li{list-style:1.4;}
|
||||
.kakao_wrap .img_file_info_wrap .img_file_wrap{display:inline-flex;width:calc(100% - 200px);}
|
||||
.kakao_wrap .img_file_info_wrap .img_file_wrap .file_name{width:calc(100% - 28px);}
|
||||
.kakao_wrap .img_file_info_wrap .img_file_wrap .file_name.file_none{color:#666;font-weight:300;line-height:1.8;}
|
||||
|
||||
.kakaotalkset_cont .kakao_wrap .template_category{width: 270px;}
|
||||
.kakaotalkset_cont .kakao_wrap .emphasis_select{width: 250px;}
|
||||
|
||||
@ -512,8 +512,7 @@
|
||||
/* 예약관리 */
|
||||
/* 예약관리 - 문자내용 */
|
||||
.rev_pop_in input[type="text"] {background-color: #f2f2f2; width: 100%; height: 50px; border-radius: 5px;}
|
||||
.rev_pop_in input[type="text"]::placeholder {font-size: 17px; color: #222; font-weight: 400
|
||||
;}
|
||||
.rev_pop_in input[type="text"]::placeholder {font-size: 17px; color: #222; font-weight: 400;}
|
||||
.rev_pop_in input[type="text"]-ms-input-placeholder {font-size: 17px; color: #222; font-weight: 400;}
|
||||
.rev_pop_middle {margin:0 0 10px;}
|
||||
.rev_pop_middle span:first-child {float: left; font-size: 16px; font-weight: 300; padding-top: 5px;}
|
||||
@ -1077,6 +1076,7 @@
|
||||
.kakao_rev_popup .kakao_wrap .allimtalk_title::after{position: absolute; content: " "; width: 42px; height: 42px; background: url(/publish/images/content/icon_kakao01.png) no-repeat; right: -20px; top: -10px;}
|
||||
.kakao_rev_popup .kakao_wrap .allimtalk_title img{margin: 0 8px 0 0; vertical-align: bottom;}
|
||||
.kakao_rev_popup .kakao_wrap .allimtalk_content{width: calc(100% - 60px);background-color: #fff; border-radius: 0 0 5px 5px; padding: 0 0 10px 0; margin: 0 0 20px 0;}
|
||||
.kakao_rev_popup .kakao_wrap .friendtalk .allimtalk_content{margin:0;}
|
||||
.kakao_rev_popup .kakao_wrap .allimtalk_content .kakao_image img{width: 100%;}
|
||||
.kakao_rev_popup .kakao_wrap .allimtalk_content p{width: calc(100% - 20px); white-space: normal; word-break: break-all; line-height: 1.4; padding: 0 10px; margin: 0 auto;}
|
||||
.kakao_rev_popup .kakao_wrap .allimtalk_content .template_text,.kakao_rev_popup .kakao_wrap .allimtalk_content .emphasis_title_text{font-size: 16px; font-weight: 500; color: #222;}
|
||||
@ -1091,6 +1091,15 @@
|
||||
.kakao_rev_popup .kakao_wrap .allimtalk_content .template_text+.btn_kakao_type{margin-top: 8px;}
|
||||
.kakao_rev_popup .kakao_wrap .allimtalk_content .btn_kakao_channel{width: calc(100% - 20px); height: 40px; font-size: 15px; border-radius: 5px; background-color: #ffea00;}
|
||||
.kakao_rev_popup .kakao_wrap .allimtalk_content .btn_kakao_type{width: calc(100% - 20px); height: 40px; font-size: 15px; border-radius: 5px; background-color: #ededed;}
|
||||
.kakao_rev_popup .tab_phone .addText{margin:8px 0 0 0;color:#002c9a;font-size:14px;}
|
||||
|
||||
/* 카카오톡 발송결과, 예약관리 문자내용 보기 - 친구톡 */
|
||||
.kakao_rev_popup .kakao_wrap .friendtalk .allimtalk_content{border-radius:5px;}
|
||||
.kakao_rev_popup .kakao_wrap .friendtalk .kakao_image{border-radius:5px 5px 0 0;overflow:hidden;}
|
||||
.kakao_rev_popup .kakao_wrap .friendtalk .rev_pop_txt{padding:20px;}
|
||||
.kakao_rev_popup .kakao_wrap .friendtalk .rev_pop_txt p {margin:0 0 10px 0;font-size: 15px;color:#777;}
|
||||
.kakao_rev_popup .kakao_wrap .friendtalk .rev_pop_txt .template_text{padding:10px 10px 0 10px;}
|
||||
.kakao_rev_popup .kakao_wrap .friendtalk .rev_pop_txt p.kakao_block_text{width:calc(100% - 60px);text-align:right;font-size:13px;color:#555;font-weight:300;margin:10px 0 0 0;}
|
||||
|
||||
/* 카카오테스트발송 팝업 */
|
||||
.test_sendpop.kakao_rev_popup .kakao_wrap .phone .phoneIn{height: 620px; background-image: url(/publish/images/content/kakaoBg.png);padding: 28px 19px 0 19px;}
|
||||
|
||||
@ -1,3 +1,4 @@
|
||||
|
||||
$(document).ready(function () {
|
||||
|
||||
// 문자작성 영역 클릭시 textarea 활성화
|
||||
@ -522,15 +523,15 @@ $(document).ready(function () {
|
||||
$("input[name='img_file_add']").change(function () {
|
||||
if ($("input[name='img_file_add']:checked").attr("id") == "img_file_1") {
|
||||
$(".basic_img_add_wrap").show().siblings(".wide_img_add_wrap").hide();
|
||||
//$(".img_file_add_wrap").show();
|
||||
$(".img_file_info_wrap").show();
|
||||
$(".kakao_image img").show().attr("src", "/publish/images/content/kakao_img_basic.jpg");
|
||||
} else if ($("input[name='img_file_add']:checked").attr("id") == "img_file_2") {
|
||||
$(".wide_img_add_wrap").show().siblings(".basic_img_add_wrap").hide();
|
||||
$(".kakao_image img").show().attr("src", "/publish/images/content/kakao_img_wide.jpg");
|
||||
//$(".img_file_add_wrap").show();
|
||||
$(".img_file_info_wrap").show();
|
||||
} else {
|
||||
$(".img_add_info_wrap, .img_file_add_wrap").hide();
|
||||
$(".kakao_image img").hide();
|
||||
$(".kakao_image img, .img_file_info_wrap").hide();
|
||||
}
|
||||
});
|
||||
|
||||
@ -1661,31 +1662,45 @@ function friendTemplateButtonAdd() {
|
||||
}
|
||||
var buttonText;
|
||||
var buttonView;
|
||||
//템플릿 버튼은 buttonVO의 buttonVOList 변수에 셋팅해서 넘겨주게 만들었음
|
||||
//템플릿 버튼은 buttonVO의 buttonVOList 변수에 셋팅해서 넘겨주게 만들었음
|
||||
if (buttonType == "button_type_1") {
|
||||
buttonText = '<dl class="button_type_wrap type1"><dt>배송조회</dt><dd class="button_type_input"><input type="hidden" id="buttonLikeTypeDeliv" name="buttonVOList[' + buttonCnt + '].linkType" value="DS"/><input type="text" id="btnNmDeliv" name="buttonVOList[' + buttonCnt + '].name" value="배송조회" placeholder="버튼명 입력(최대 14자)" readonly><p class="cf_text">*이용가능 택배사 : KG로지스, 우체국택배,일양로지스, GTX로지스, FedEx, 경동택배, 합동택배, 롯데택배</p></dd><dd><button type="button" class="btn_del" onclick="buttonTypeDel(this);"><img src="/publish/images/btn_delete.png" alt=""></button></dd></dl>';
|
||||
buttonText = '<dl class="button_type_wrap type1"><dt>배송조회</dt><dd class="button_type_input">'
|
||||
+'<input type="hidden" id="buttonLikeTypeDeliv" name="buttonVOList[' + buttonCnt + '].linkType" value="DS"/>'
|
||||
+'<input type="text" id="btnNmDeliv" name="buttonVOList[' + buttonCnt + '].name" value="배송조회" placeholder="버튼명 입력(최대 14자)" readonly><p class="cf_text">*이용가능 택배사 : KG로지스, 우체국택배,일양로지스, GTX로지스, FedEx, 경동택배, 합동택배, 롯데택배</p></dd><dd><button type="button" class="btn_del" onclick="buttonTypeDel(this);"><img src="/publish/images/btn_delete.png" alt=""></button></dd></dl>';
|
||||
buttonView = '<button type="button" class="btn_kakao_type btnEmpty" id="btnViewDS">배송조회</button>';
|
||||
} else if (buttonType == "button_type_2") {
|
||||
buttonText = '<dl class="button_type_wrap type2"><dt>웹링크</dt><dd class="button_type_input"><ul><li><input type="hidden" id="buttonLikeTypeWeb" name="buttonVOList[' + buttonCnt + '].linkType" value="WL"/><input type="text" id="btnNmWeb" name="buttonVOList[' + buttonCnt + '].name" value="" placeholder="버튼명 입력(최대 14자)"></li><li><input type="text" id="buttonLinkMo" name="buttonVOList[' + buttonCnt + '].linkMo" value="" placeholder="모바일 링크 입력"></li><li><input type="text" id="buttonLinkPc" name="buttonVOList[' + buttonCnt + '].linkPc" value="" placeholder="PC 링크 입력"></li></ul></dd><dd><button type="button" class="btn_del" onclick="buttonTypeDel(this);"><img src="/publish/images/btn_delete.png" alt=""></button></dd></dl>';
|
||||
buttonText = '<dl class="button_type_wrap type2"><dt>웹링크</dt><dd class="button_type_input"> '
|
||||
+'<ul><li><input type="hidden" id="buttonLikeTypeWeb" name="buttonVOList[' + buttonCnt + '].linkType" value="WL"/>'
|
||||
+'<input type="text" class="kakaoBtnNmList" id="btnNmWeb" name="buttonVOList[' + buttonCnt + '].name" value="" maxlength="14" placeholder="버튼명 입력(최대 14자)"></li>'
|
||||
+'<li><input type="text" class="kakaoBtnList" id="buttonLinkMo" name="buttonVOList[' + buttonCnt + '].linkMo" value="" placeholder="모바일 링크 입력"></li>'
|
||||
+'<li><input type="text" class="kakaoBtnList" id="buttonLinkPc" name="buttonVOList[' + buttonCnt + '].linkPc" value="" placeholder="PC 링크 입력"></li></ul></dd><dd><button type="button" class="btn_del" onclick="buttonTypeDel(this);"><img src="/publish/images/btn_delete.png" alt=""></button></dd></dl>';
|
||||
buttonView = '<button type="button" class="btn_kakao_type btnEmpty" id="btnViewWL">웹링크</button>';
|
||||
} else if (buttonType == "button_type_3") {
|
||||
buttonText = '<dl class="button_type_wrap type3"><dt>앱링크</dt><dd class="button_type_input"><ul><li><input type="hidden" id="buttonLikeTypeApp" name="buttonVOList[' + buttonCnt + '].linkType" value="AL"/><input type="text" id="btnNmApp" name="buttonVOList[' + buttonCnt + '].name" value="" placeholder="버튼명 입력(최대 14자)"></li><li><input type="text" id="buttonLinkAnd" name="buttonVOList[' + buttonCnt + '].linkAnd" value="" placeholder="Android 링크 입력"></li><li><input type="text" id="buttonLinkIos" name="buttonVOList[' + buttonCnt + '].linkIos" value="" placeholder="IOS 링크 입력"></li></ul></dd><dd><button type="button" class="btn_del" onclick="buttonTypeDel(this);"><img src="/publish/images/btn_delete.png" alt=""></button></dd></dl>';
|
||||
buttonText = '<dl class="button_type_wrap type3"><dt>앱링크</dt><dd class="button_type_input">'
|
||||
+'<ul><li><input type="hidden" id="buttonLikeTypeApp" name="buttonVOList[' + buttonCnt + '].linkType" value="AL"/>'
|
||||
+'<input type="text" class="kakaoBtnNmList" id="btnNmApp" name="buttonVOList[' + buttonCnt + '].name" value="" maxlength="14" placeholder="버튼명 입력(최대 14자)"></li>'
|
||||
+'<li><input type="text" class="kakaoBtnList" id="buttonLinkAnd" name="buttonVOList[' + buttonCnt + '].linkAnd" value="" placeholder="Android 링크 입력"></li> '
|
||||
+'<li><input type="text" class="kakaoBtnList" id="buttonLinkIos" name="buttonVOList[' + buttonCnt + '].linkIos" value="" placeholder="IOS 링크 입력"></li></ul></dd><dd><button type="button" class="btn_del" onclick="buttonTypeDel(this);"><img src="/publish/images/btn_delete.png" alt=""></button></dd></dl>';
|
||||
buttonView = '<button type="button" class="btn_kakao_type btnEmpty" id="btnViewAL">앱링크</button>';
|
||||
} else if (buttonType == "button_type_4") {
|
||||
buttonText = '<dl class="button_type_wrap type4"><dt>봇키워드</dt><dd class="button_type_input"><input type="hidden" id="buttonLikeTypeBot" name="buttonVOList[' + buttonCnt + '].linkType" value="BK"/><input type="text" id="btnNmBot" name="buttonVOList[' + buttonCnt + '].name" value="" placeholder="버튼명 입력(최대 14자)"></dd><dd><button type="button" class="btn_del" onclick="buttonTypeDel(this);"><img src="/publish/images/btn_delete.png" alt=""></button></dd></dl>';
|
||||
buttonText = '<dl class="button_type_wrap type4"><dt>봇키워드</dt><dd class="button_type_input"><input type="hidden" id="buttonLikeTypeBot" name="buttonVOList[' + buttonCnt + '].linkType" value="BK"/>'
|
||||
+'<input type="text" id="btnNmBot" name="buttonVOList[' + buttonCnt + '].name" value="" placeholder="버튼명 입력(최대 14자)"></dd><dd><button type="button" class="btn_del" onclick="buttonTypeDel(this);"><img src="/publish/images/btn_delete.png" alt=""></button></dd></dl>';
|
||||
buttonView = '<button type="button" class="btn_kakao_type btnEmpty" id="btnViewBK">봇키워드</button>';
|
||||
} else if (buttonType == "button_type_5") {
|
||||
buttonText = '<dl class="button_type_wrap type5"><dt>메시지전달</dt><dd class="button_type_input"><input type="hidden" id="buttonLikeTypeMsg" name="buttonVOList[' + buttonCnt + '].linkType" value="MD"/><input type="text" id="btnNmMsg" name="buttonVOList[' + buttonCnt + '].name" value="" placeholder="버튼명 입력(최대 14자)"></dd><dd><button type="button" class="btn_del" onclick="buttonTypeDel(this);"><img src="/publish/images/btn_delete.png" alt=""></button></dd></dl>';
|
||||
buttonText = '<dl class="button_type_wrap type5"><dt>메시지전달</dt><dd class="button_type_input"><input type="hidden" id="buttonLikeTypeMsg" name="buttonVOList[' + buttonCnt + '].linkType" value="MD"/>'
|
||||
+'<input type="text" id="btnNmMsg" name="buttonVOList[' + buttonCnt + '].name" value="" placeholder="버튼명 입력(최대 14자)"></dd><dd><button type="button" class="btn_del" onclick="buttonTypeDel(this);"><img src="/publish/images/btn_delete.png" alt=""></button></dd></dl>';
|
||||
buttonView = '<button type="button" class="btn_kakao_type btnEmpty" id="btnViewMD">메시지전달</button>';
|
||||
} else if (buttonType == "button_type_6") {
|
||||
buttonText = '<dl class="button_type_wrap type6"><dt>상담톡전환</dt><dd class="button_type_input"><input type="hidden" id="buttonLikeTypeCons" name="buttonVOList[' + buttonCnt + '].linkType" value="BC"/><input type="text" id="btnNmCons" name="buttonVOList[' + buttonCnt + '].name" value="" placeholder="버튼명 입력(최대 14자)"></dd><dd><button type="button" class="btn_del" onclick="buttonTypeDel(this);"><img src="/publish/images/btn_delete.png" alt=""></button></dd></dl>';
|
||||
buttonText = '<dl class="button_type_wrap type6"><dt>상담톡전환</dt><dd class="button_type_input"><input type="hidden" id="buttonLikeTypeCons" name="buttonVOList[' + buttonCnt + '].linkType" value="BC"/>'
|
||||
+'<input type="text" id="btnNmCons" name="buttonVOList[' + buttonCnt + '].name" value="" placeholder="버튼명 입력(최대 14자)"></dd><dd><button type="button" class="btn_del" onclick="buttonTypeDel(this);"><img src="/publish/images/btn_delete.png" alt=""></button></dd></dl>';
|
||||
buttonView = '<button type="button" class="btn_kakao_type btnEmpty" id="btnViewBC">상담톡전환</button>';
|
||||
} else if (buttonType == "button_type_7") {
|
||||
buttonText = '<dl class="button_type_wrap type7"><dt>챗봇전환</dt><dd class="button_type_input"><input type="hidden" id="buttonLikeTypeBotChg" name="buttonVOList[' + buttonCnt + '].linkType" value="BT"/><input type="text" id="btnNmBotChg" name="buttonVOList[' + buttonCnt + '].name" value="" placeholder="버튼명 입력(최대 14자)"></dd><dd><button type="button" class="btn_del" onclick="buttonTypeDel(this);"><img src="/publish/images/btn_delete.png" alt=""></button></dd></dl>';
|
||||
buttonText = '<dl class="button_type_wrap type7"><dt>챗봇전환</dt><dd class="button_type_input"><input type="hidden" id="buttonLikeTypeBotChg" name="buttonVOList[' + buttonCnt + '].linkType" value="BT"/>'
|
||||
+'<input type="text" id="btnNmBotChg" name="buttonVOList[' + buttonCnt + '].name" value="" placeholder="버튼명 입력(최대 14자)"></dd><dd><button type="button" class="btn_del" onclick="buttonTypeDel(this);"><img src="/publish/images/btn_delete.png" alt=""></button></dd></dl>';
|
||||
buttonView = '<button type="button" class="btn_kakao_type btnEmpty" id="btnViewBT">챗봇전환</button>';
|
||||
} else {}
|
||||
$(".button_add_wrap").prepend(buttonText);
|
||||
$(".btnViewArea").prepend(buttonView);
|
||||
$(".button_add_wrap").append(buttonText);
|
||||
$(".btnViewArea").append(buttonView);
|
||||
}
|
||||
|
||||
//관리자 카카오톡 알림톡 샘플 템플릿 등록 - 버튼 추가
|
||||
|
||||
@ -101,6 +101,7 @@
|
||||
<label for="img_file_1">이미지 첨부</label>
|
||||
<input type="radio" name="img_file_add" id="img_file_2">
|
||||
<label for="img_file_2">와이드 이미지 첨부</label>
|
||||
|
||||
<div class="img_file_add_wrap basic_img_add_wrap">
|
||||
<p class="info_title_text"><span class="c_e40000">*</span> 이미지 첨부 안내</p>
|
||||
<ul class="info_text">
|
||||
|
||||
@ -469,6 +469,38 @@
|
||||
</tbody>
|
||||
</table>
|
||||
<span class="reqTxt4">* 텍스트 용량(Byte)에 대한 안내 : 한글2Byte, 영문·숫자 1Byte를 차지.</span>
|
||||
|
||||
<p class="tType1_title"><img src="/publish/images/content/icon_fee2.png" alt="알림톡 아이콘 이미지"> 친구톡</p>
|
||||
<table class="tType2">
|
||||
<colgroup>
|
||||
<col style="width: 20%;">
|
||||
<col style="width: 60%;">
|
||||
<col style="width: 20%;">
|
||||
</colgroup>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>구분</th>
|
||||
<th>특징</th>
|
||||
<th>가격</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<th>친구톡(텍스트)</th>
|
||||
<td rowspan="3">카카오톡을 통해 채널 친구 대상으로 발송이 가능한 광고성 메시지<br />(1,000자 이하의 텍스트 및 이미지 발송 가능)</td>
|
||||
<td><span>13.8</span>원</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>친구톡(이미지)</th>
|
||||
<td><span>19.9</span>원</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>친구톡(와이드 이미지)</th>
|
||||
<td><span>22.9</span>원</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<!-- <span class="reqTxt4">* 텍스트 용량(Byte)에 대한 안내 : 한글2Byte, 영문·숫자 1Byte를 차지.</span> -->
|
||||
|
||||
<p class="tType1_title"><img src="/publish/images/content/icon_fee_fax.png" alt="팩스 아이콘 이미지"> 팩스</p>
|
||||
<table class="tType2">
|
||||
|
||||
@ -732,11 +732,13 @@
|
||||
<div class="text_preview">
|
||||
<p class="friend_talk_title"><span>(광고)</span></p>
|
||||
<div class="allimtalk_content">
|
||||
<div class="kakao_image"><img src="/publish/images/content/kakao_img_basic.jpg" alt="" style="display:none;"></div>
|
||||
|
||||
<div class="kakao_image"><img src="/publish/images/content/kakao_img_basic.jpg" alt=""></div>
|
||||
<p class="template_text">홍길동 고객님 안녕하세요.
|
||||
문자온입니다.
|
||||
문자온에서는 재결제 고객님들께 다양한 이벤트를 준비하였으니, 방문하셔서 혜택 놓치지 마세요.</p>
|
||||
<button type="button" class="btn_kakao_type">문자온 바로가기</button>
|
||||
|
||||
</div>
|
||||
<p class="kakao_block_text">수신거부 : 홈 > 채널차단</p>
|
||||
</div>
|
||||
|
||||
Loading…
Reference in New Issue
Block a user