친구톡 개발완료

This commit is contained in:
hehihoho3@gmail.com 2025-06-18 17:48:33 +09:00
parent 7527b7dd8a
commit f3ddd22598
9 changed files with 250 additions and 60 deletions

View File

@ -217,6 +217,7 @@ public class MjonKakaoATVO extends ComDefaultVO{
private int regComCount;
private int orderByCode; // 문자타입 정렬번호
private String detailType;
private String adFlag;

View File

@ -493,17 +493,9 @@ public class KakaoSendUtil {
private Calendar setupBaseDate(KakaoVO kakaoVO, boolean isNotified) throws ParseException {
// 예약 시간 기본값 설정
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로 설정
}
// baseDate 추출
Date baseDate = resolveBaseDate(kakaoVO);
// 시간 성정
Calendar calendar = Calendar.getInstance();
@ -518,6 +510,31 @@ public class KakaoSendUtil {
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 : 이호영

View File

@ -105,6 +105,15 @@ public class KakaoFriendsTalkServiceImpl extends EgovAbstractServiceImpl implem
}
/**
* 친구톡은 발송 시간 제약이 있음
*/
if(kakaoSendUtil.isRestrictedFriendTalkTime(kakaoSendUtil.resolveBaseDate(kakaoVO))) {
// UNAUTHORIZED : 인증되지 않은 사용자가 접근하려고
return new StatusResponse(HttpStatus.BAD_REQUEST,
"친구톡은 20시 50분부터 익일 08시까지 발송이 제한됩니다.");
}
/** @isHolidayNotified
* @false : 알림 X

View File

@ -1042,13 +1042,11 @@ public class KakaoSentController {
//발송 관리 문자발송 내용 상세보기 팝업 => 문자내용(MJ_MSG_DATA)
MjonKakaoATVO mjonKakaoATResultVO = kakaoSentService.selectKakaoSentDetailDataAjax(mjonKakaoATVO);
log.info(" 1 resultMsgDetail.bizKakaoResendOrgnlTxt : [{}]", mjonKakaoATResultVO.getBizKakaoResendOrgnlTxt());
// 대체문자 엔터키 치환
if(StringUtils.isNotEmpty(mjonKakaoATResultVO.getSmsTxt())) {
mjonKakaoATResultVO.setSmsTxt(StringUtil2.replaceBR(mjonKakaoATResultVO.getSmsTxt()));
}
model.addAttribute("resultMsgDetail", mjonKakaoATResultVO);
log.info(" 2 resultMsgDetail.bizKakaoResendOrgnlTxt : [{}]", mjonKakaoATResultVO.getBizKakaoResendOrgnlTxt());
String msgType = mjonKakaoATResultVO.getMsgType();
@ -1080,7 +1078,6 @@ public class KakaoSentController {
}
model.addAttribute("msgType", msgType);
log.info(" 3 resultMsgDetail.bizKakaoResendOrgnlTxt : [{}]", mjonKakaoATResultVO.getBizKakaoResendOrgnlTxt());
} catch (Exception e) {
e.printStackTrace();

View File

@ -926,6 +926,7 @@
, 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
FROM MJ_MSG_GROUP_DATA MGD
INNER JOIN MJ_MSG_DATA MD
ON MGD.MSG_GROUP_ID = MD.MSG_GROUP_ID

View File

@ -5,7 +5,7 @@
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="ec" uri="/WEB-INF/tld/ecnet_tld.tld"%>
<%@ page import="itn.com.cmm.LoginVO" %>
<script src="/js/kakao/templateComm.js"></script>
<script src="/js/kakao/ft/templateComm.js"></script>
<script type="text/javascript" src="<c:out value='/js/MJUtill.js' />"></script>
<script type="text/javascript" src="<c:out value='/js/kakao/ft/ftPriceClclt.js' />"></script>
@ -66,6 +66,7 @@ $(document).ready(function (){
fnAgentCodeChg();
}
thisFnByteString($('#smsTxtArea').val());
});
$("#send_fail_check").change(function(){
if($("#send_fail_check").is(":checked")){
@ -126,7 +127,7 @@ $(document).ready(function (){
});
//대체문자 초기화 버튼 선택 처리
/* //대체문자 초기화 버튼 선택 처리
$("#failCheckInit").click(function(){
$('#smsTxtArea').val("");
@ -140,7 +141,7 @@ $(document).ready(function (){
fn_insertErrorYN('N');
});
*/
// 광고포함여부 체크 이벤트
$("#ad_Y").click(function () {
@ -942,7 +943,7 @@ function fnSelectMinChk(){
if(resMin >= 50 && resMin <= 59){
alert("친구톡은 20:50 ~ 익일 08:00까지 발송할 수 없습니다.");
alert("친구톡은 20시 50분부터 익일 08시까지 발송이 제한됩니다.");
$("#msgResMin").val("40").prop("selected", true);
}
@ -1353,13 +1354,18 @@ function thisFnByteString(contents){
$('#msgLeng').html("");
$('#limitLeng').html("");
if ($("#ad_Y").is(":checked")) {
contents = "(광고)"+contents+"\n무료거부 0808800858"
}
console.log(contents);
var conLeng = conByteLeng(contents); // 내용 문자 입력 바이트 수 계산하기
$('#msgLeng').text(conLeng);
//문자 길이 변수에 저장해주기
$('#smsLen').val(conLeng);
// $('#smsLen').val(conLeng);
if(conLeng > 90){
@ -2201,9 +2207,15 @@ function updateButtons(){
<!-- 업로드한 이미지의 썸네일 영역 -->
<ul class="thumb_wrap liOnImg ui-sortable"></ul>
<!-- //업로드한 이미지의 썸네일 영역 -->
<div class="ad_txt" style="">
<p>(광고)</p>
</div>
<label for="smsTxtArea" class="label"></label>
<textarea id="smsTxtArea" class="put_text"></textarea>
<div class="text_length">
<div class="sub_ad_text">
<p>무료거부 0808800858</p>
</div>
<div name="afterDeny">
<p>
<span class="fwMd" id="msgLeng">0 /</span>

View File

@ -19,18 +19,21 @@
<!-- 카카오 알림톡 미리보기 -->
<div class="tab_phone current" id="tab_phone_1">
<div class="phone_kakako">
<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="${resultMsgDetail.yellowId}"/></p>
<p class="prev_p"><img src="/publish/images/content/kakao_prev_icon.png" alt=""><c:out value="${searchVO.yellowId}"/></p>
<!-- 텍스트 미리보기 -->
<div class="text_preview">
<div class="allimtalk_title">
<%--< 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> --%>
<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'}">
@ -68,6 +71,11 @@
</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>
@ -105,15 +113,23 @@
</c:otherwise>
</c:choose> --%>
</c:if>
<div>
<!-- <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> -->
</div>
<div class="text_preview">
<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>

View File

@ -753,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>
<!--// 상세결과-->
@ -928,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>

View 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("내용 미리보기");
}
}