카카오 친구톡 테스트 발송 팝업 및 발송 처리 개발

This commit is contained in:
rosewiper 2024-01-19 14:48:44 +09:00
parent 3f40c8405d
commit feb9d37202
5 changed files with 551 additions and 35 deletions

View File

@ -661,4 +661,56 @@ public class KakaoFriendsTalkSendController {
return modelAndView;
}
/**
* @Method Name : kakaoFriendsTalkMsgSendRefundTestAjax
* @작성일 : 2024. 1. 18.
* @작성자 : 우영두
* @Method 설명 : 카카오 친구톡 전송 환불 스케줄러 서비스 테스트
*/
@RequestMapping(value= {"/web/mjon/kakao/friendstalk/selectKakaoFriendsTalkTestSendPopup.do"})
public String selectKakaoFriendsTalkTestSendPopup(ModelMap model
, @ModelAttribute("kakaoVO") KakaoVO kakaoVO) throws Exception {
LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
if(userId == "") {
return "redirect:/web/user/login/login.do";
}else {
//1.시스템 기본 단가 정보 불러오기
JoinSettingVO sysJoinSetVO = mjonMsgDataService.selectJoinSettingInfo();
//2.사용자 개인 단가 정보 불러오기
MberManageVO mberManageVO = mjonMsgDataService.selectMberManageInfo(userId);
Float kakaoFtPrice = mberManageVO.getKakaoFtPrice();
if(kakaoFtPrice < 1) {
kakaoFtPrice = sysJoinSetVO.getKakaoFtPrice();
}
BigDecimal userMoney = new BigDecimal(mberManageVO.getUserMoney()).setScale(2, RoundingMode.HALF_EVEN);
model.addAttribute("userMoney", userMoney);
model.addAttribute("kakaoFtPrice", kakaoFtPrice);
}
String tmpContents = kakaoVO.getTemplateContent();
String txtReplYn = kakaoVO.getTxtReplYn();
if(txtReplYn.equals("Y")) {
String[] varValStr = kakaoVO.getVarValList().get(0);
tmpContents = kakaoSendUtil.getKakaoFTCntReplace(varValStr[0], tmpContents);
kakaoVO.setTemplateContent(tmpContents);
}
System.out.println("++++++++++++++ tmpContents ::: "+tmpContents);
model.addAttribute("kakaoVO", kakaoVO);
return "web/kakao/msgdata/ft/KakaoFriendsTalkMsgDataTestPop";
}
}

View File

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

View File

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

View File

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

View File

@ -785,37 +785,8 @@ function fn_sendMsgData(){
//이미지 첨부 체크
var imgChk = $("input[name=img_file_add]:checked").val();
if(imgChk == 'I' || imgChk == 'W'){
var imgTitle = $("#imgTitle").val();
var imgLink = $("#imgLink").val();
var imgFileName = $("#imageFileName").val();
if(imgTitle == ''){
alert("친구톡 이미지 제목정보를 입력해 주세요.");
return false;
}
if(imgLink == ''){
alert("친구톡 이미지 선택시 이동할 링크 주소를 입력해 주세요.");
return false;
}
if(imgFileName == ''){
alert("친구톡 이미지를 등록해 주세요.");
return false;
}
$("#imageType").val(imgChk);
//json 파일 필요 유무 셋팅
$("#bizJsonYn").val("Y");
if(!getFtImageType(imgChk)){
return false;
}
//템플릿 버튼 갯수 체크
@ -1434,6 +1405,275 @@ function msgSuccessClose(obj){
$('html').scrollTop(0);
}
function getFtImageType(imgChk){
if(imgChk == 'I' || imgChk == 'W'){
var imgTitle = $("#imgTitle").val();
var imgLink = $("#imgLink").val();
var imgFileName = $("#imageFileName").val();
if(imgTitle == ''){
alert("친구톡 이미지 제목정보를 입력해 주세요.");
return false;
}
if(imgLink == ''){
alert("친구톡 이미지 선택시 이동할 링크 주소를 입력해 주세요.");
return false;
}
if(imgFileName == ''){
alert("친구톡 이미지를 등록해 주세요.");
return false;
}
$("#imageType").val(imgChk);
//json 파일 필요 유무 셋팅
$("#bizJsonYn").val("Y");
}
return true;
}
function goToKakaoTestPopUp(){
if(loginVO == "" || loginVO == null){
alert("테스트 발송 서비스는 로그인 후 이용 가능합니다.");
location.href="<c:url value='/web/user/login/login.do'/>";
return false;
}
//기업회원 체크
if(!usrDeptChk()){
return false;
}
var form = document.bizForm;
var senderKey = $("#selectAgentCode option:checked").val();
var yellowId = $("#selectAgentCode option:checked").text();
if(senderKey == ''){
alert("채널ID를 선택해 주세요.");
return false;
}else{
$("#inputSenderKey").val(senderKey);
$("#yellowId").val(yellowId);
}
var imgChk = $("input[name=img_file_add]:checked").val();
if(!getFtImageType(imgChk)){
return false;
}
//템플릿 버튼 갯수 체크
var buttonCnt = $(".btn_kakao_type").length;
if(buttonCnt > 0){
//json 파일 필요 유무 셋팅
$("#bizJsonYn").val("Y");
}
//친구톡 내용 체크
var tmpContents = $('#inputTemplateContent').val();
if(tmpContents == ""){
alert("친구톡 내용을 입력해 주세요.");
return false;
}else{
//템플릿 내용 입력
$("#templateContent").val(tmpContents);
}
var rtnStr = strChinJpnCheck(tmpContents);
//문자내용에 이모지가 있는지 체크
if(!emojiCheck(tmpContents)) return false;
if(rtnStr.length > 0){
alert("입력하신 문구 중 \" " + rtnStr + " \" 는 일부 휴대폰에서 표기되지 않을 수 있습니다.");
}
var selectedData = tableL.getRows();
if(selectedData == "" || selectedData == null){
alert("받는사람 주소를 한 건 이상 입력해주세요.");
return false;
}else{
//치환문구 변환
var txtReplYn = $("#txtReplYn").val();
if(txtReplYn == 'Y'){
var name = tableL.getRows()[0].getData().name;
var phone = removeDash(tableL.getRows()[0].getData().phone);
var rep1 = tableL.getRows()[0].getData().rep1;
var rep2 = tableL.getRows()[0].getData().rep2;
var rep3 = tableL.getRows()[0].getData().rep3;
var rep4 = tableL.getRows()[0].getData().rep4;
var varValList = []; //치환문자 연결시킬 변수 셋팅
var nmStatus = false;
var rep1Status = false;
var rep2Status = false;
var rep3Status = false;
var rep4Status = false;
var varValStr = "";
var varValStatus = true;
if(tmpContents.indexOf("\#{이름}") > -1){
nmStatus = true;
}
if(tmpContents.indexOf("\#{1}") > -1){
rep1Status = true;
}
if(tmpContents.indexOf("\#{2}") > -1){
rep2Status = true;
}
if(tmpContents.indexOf("\#{3}") > -1){
rep3Status = true;
}
if(tmpContents.indexOf("\#{4}") > -1){
rep4Status = true;
}
if(nmStatus && (typeof(name) != 'undefined' && name != null && name !="")){
if(varValStr == ''){
varValStr = name.replaceAll(",","§");
}else{
varValStr = varValStr + "¶" + name.replaceAll(",","§");
}
}else{
if(nmStatus){
varValStatus = false;
}
}
if(varValStr == ''){
varValStr = phone;
}else{
varValStr = varValStr + "¶" + phone;
}
if(rep1Status && (typeof(rep1) != 'undefined' && rep1 != null && rep1 !="")){
if(varValStr == ''){
varValStr = rep1.replaceAll(",","§");
}else{
varValStr = varValStr + "¶" + rep1.replaceAll(",","§");
}
}else{
if(rep1Status){
varValStatus = false;
}
}
if(rep2Status && (typeof(rep2) != 'undefined' && rep2 != null && rep2 !="")){
if(varValStr == ''){
varValStr = rep2.replaceAll(",","§");
}else{
varValStr = varValStr + "¶" + rep2.replaceAll(",","§");
}
}else{
if(rep2Status){
varValStatus = false;
}
}
if(rep3Status && (typeof(rep3) != 'undefined' && rep3 != null && rep3 !="")){
if(varValStr == ''){
varValStr = rep3.replaceAll(",","§");
}else{
varValStr = varValStr + "¶" + rep3.replaceAll(",","§");
}
}else{
if(rep3Status){
varValStatus = false;
}
}
if(rep4Status && (typeof(rep4) != 'undefined' && rep4 != null && rep4 !="")){
if(varValStr == ''){
varValStr = rep4.replaceAll(",","§");
}else{
varValStr = varValStr + "¶" + rep4.replaceAll(",","§");
}
}else{
if(rep4Status){
varValStatus = false;
}
}
if(!varValStatus){
alert("특정문구 일괄변환에 대한 일부 데이터가 누락된 부분이 있습니다. 데이터를 확인해 주세요.");
return false;
}
varValList[0] = varValStr;
$("#varValList").val(varValList);
}
}
form.method = "post";
window.open("about:blank", 'testSendPop', 'width=770, height=850, top=100, left=100, fullscreen=no, menubar=no, status=no, toolbar=no, titlebar=yes, location=no, scrollbars=1');
form.target = "testSendPop";
form.action = "/web/mjon/kakao/friendstalk/selectKakaoFriendsTalkTestSendPopup.do";
form.submit();
}
</script>
<!-- 로딩바 -->
@ -1509,6 +1749,8 @@ function msgSuccessClose(obj){
<!-- 친구톡 발송 json 파일 필요 유무 -->
<input type="hidden" id="bizJsonYn" name="bizJsonYn" value="N"/>
<input type="hidden" id="yellowId" name="yellowId" value=""/>
<div class="send_general friend_talk_wrap kakao_wrap">
<div class="send_left">
@ -2109,7 +2351,7 @@ function msgSuccessClose(obj){
<button type="button" class="btnType btnType11" onclick="javascript:fn_noTimeSend(); return false;">발송하기</button>
</c:otherwise>
</c:choose>
<button type="button" class="btnType btnType10" onclick="javascript:fnTestSend(); return false;">테스트발송</button>
<button type="button" class="btnType btnType10" onclick="javascript:goToKakaoTestPopUp(); return false;">테스트발송</button>
</div>
</div>
<div class="rev_selected" >