From f3ddd22598712dff79d4c2211f0da5de5d0077c2 Mon Sep 17 00:00:00 2001 From: "hehihoho3@gmail.com" Date: Wed, 18 Jun 2025 17:48:33 +0900 Subject: [PATCH] =?UTF-8?q?=EC=B9=9C=EA=B5=AC=ED=86=A1=20=EA=B0=9C?= =?UTF-8?q?=EB=B0=9C=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/kakaoAt/service/MjonKakaoATVO.java | 1 + .../let/kakao/kakaoComm/KakaoSendUtil.java | 39 ++++-- .../impl/KakaoFriendsTalkServiceImpl.java | 9 ++ .../user/sent/web/KakaoSentController.java | 3 - .../let/mjo/kakao/KakaoSent_SQL_Mysql.xml | 1 + .../ft/KakaoFriendsTalkMsgDataView.jsp | 22 ++- .../web/kakao/sent/KakaoSentDetailPopAjax.jsp | 28 +++- .../web/kakao/sent/KakaoSentDetailView.jsp | 80 ++++++----- src/main/webapp/js/kakao/ft/templateComm.js | 127 ++++++++++++++++++ 9 files changed, 250 insertions(+), 60 deletions(-) create mode 100644 src/main/webapp/js/kakao/ft/templateComm.js diff --git a/src/main/java/itn/let/kakao/admin/kakaoAt/service/MjonKakaoATVO.java b/src/main/java/itn/let/kakao/admin/kakaoAt/service/MjonKakaoATVO.java index a7baa76d..1792b097 100644 --- a/src/main/java/itn/let/kakao/admin/kakaoAt/service/MjonKakaoATVO.java +++ b/src/main/java/itn/let/kakao/admin/kakaoAt/service/MjonKakaoATVO.java @@ -217,6 +217,7 @@ public class MjonKakaoATVO extends ComDefaultVO{ private int regComCount; private int orderByCode; // 문자타입 정렬번호 private String detailType; + private String adFlag; diff --git a/src/main/java/itn/let/kakao/kakaoComm/KakaoSendUtil.java b/src/main/java/itn/let/kakao/kakaoComm/KakaoSendUtil.java index a7ddbd85..6d63f619 100644 --- a/src/main/java/itn/let/kakao/kakaoComm/KakaoSendUtil.java +++ b/src/main/java/itn/let/kakao/kakaoComm/KakaoSendUtil.java @@ -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 : 이호영 diff --git a/src/main/java/itn/let/kakao/user/kakaoFt/service/impl/KakaoFriendsTalkServiceImpl.java b/src/main/java/itn/let/kakao/user/kakaoFt/service/impl/KakaoFriendsTalkServiceImpl.java index 24b47cf2..0d28cd6e 100644 --- a/src/main/java/itn/let/kakao/user/kakaoFt/service/impl/KakaoFriendsTalkServiceImpl.java +++ b/src/main/java/itn/let/kakao/user/kakaoFt/service/impl/KakaoFriendsTalkServiceImpl.java @@ -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 diff --git a/src/main/java/itn/let/kakao/user/sent/web/KakaoSentController.java b/src/main/java/itn/let/kakao/user/sent/web/KakaoSentController.java index 0cd9b891..792bcfae 100644 --- a/src/main/java/itn/let/kakao/user/sent/web/KakaoSentController.java +++ b/src/main/java/itn/let/kakao/user/sent/web/KakaoSentController.java @@ -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(); diff --git a/src/main/resources/egovframework/sqlmap/let/mjo/kakao/KakaoSent_SQL_Mysql.xml b/src/main/resources/egovframework/sqlmap/let/mjo/kakao/KakaoSent_SQL_Mysql.xml index c571a6d8..1f37609c 100644 --- a/src/main/resources/egovframework/sqlmap/let/mjo/kakao/KakaoSent_SQL_Mysql.xml +++ b/src/main/resources/egovframework/sqlmap/let/mjo/kakao/KakaoSent_SQL_Mysql.xml @@ -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 diff --git a/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/ft/KakaoFriendsTalkMsgDataView.jsp b/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/ft/KakaoFriendsTalkMsgDataView.jsp index 653ec2dd..3f4d110f 100644 --- a/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/ft/KakaoFriendsTalkMsgDataView.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/ft/KakaoFriendsTalkMsgDataView.jsp @@ -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" %> - + @@ -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(){ +
+

(광고)

+
+
+

무료거부 0808800858

+

0 / diff --git a/src/main/webapp/WEB-INF/jsp/web/kakao/sent/KakaoSentDetailPopAjax.jsp b/src/main/webapp/WEB-INF/jsp/web/kakao/sent/KakaoSentDetailPopAjax.jsp index 4789a0fd..9c20acb9 100644 --- a/src/main/webapp/WEB-INF/jsp/web/kakao/sent/KakaoSentDetailPopAjax.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/kakao/sent/KakaoSentDetailPopAjax.jsp @@ -19,18 +19,21 @@

-
+
-

+

-
+ <%--< div class="allimtalk_title"> 알림톡 도착 친구톡 도착 -
+
--%> + +

(광고)

+
@@ -68,6 +71,11 @@
+ + +

수신거부 : 홈 > 채널차단

+
+

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

@@ -105,15 +113,23 @@ --%> -
+
+ + +

(광고)

+

${fn:replace(resultMsgDetail.bizKakaoResendOrgnlTxt, newLineChar, "
")}

+ + +

무료거부 0808800858

+
diff --git a/src/main/webapp/WEB-INF/jsp/web/kakao/sent/KakaoSentDetailView.jsp b/src/main/webapp/WEB-INF/jsp/web/kakao/sent/KakaoSentDetailView.jsp index 6c913d9d..212e8042 100644 --- a/src/main/webapp/WEB-INF/jsp/web/kakao/sent/KakaoSentDetailView.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/kakao/sent/KakaoSentDetailView.jsp @@ -753,41 +753,50 @@ function previewPhone(){

상세결과

-
-
-
-
전체건수
-
-
-
-
-
-
성공건수
-
건(${result.successPct})
-
-
-
-
-
-
-
대기건수
-
건(${result.waitingPct})
-
-
-
-
-
실패건수
- <%-- 대체문자 기능 on - 카카오톡 실패 + 대체문자 실패 = 실패 - 대체문자 기능 off - 카카오톡 실패 = 실패 - *카카오톡 실패임에도 대체문자로 발송이 성공한 경우 실패로 체크하지 않음 --%> -
건(${result.failedPct})
-
-
-
-

* 전체건수를 클릭하면 받는 사람 상세정보를 확인하실 수 있습니다.

-

* 대체문자 발송 성공 시, 성공건수로 집계됩니다.

+
+
+
+
전체건수
+
+
+
+
+
+
성공건수
+
건(${result.successPct})
+
+
+
+
+
+
+
대기건수
+
건(${result.waitingPct})
+
+
+
+
+
실패건수
+ <%-- 대체문자 기능 on + 카카오톡 실패 + 대체문자 실패 = 실패 + 대체문자 기능 off + 카카오톡 실패 = 실패 + *카카오톡 실패임에도 대체문자로 발송이 성공한 경우 실패로 체크하지 않음 --%> +
건(${result.failedPct})
+
+
+
+
+
+ +

* 전체건수를 클릭하면 받는 사람 상세정보를 확인하실 수 있습니다.

+

* 대체문자 발송 성공 시, 성공건수로 집계됩니다.

+
+
+ +
+
@@ -928,6 +937,7 @@ function previewPhone(){
+
diff --git a/src/main/webapp/js/kakao/ft/templateComm.js b/src/main/webapp/js/kakao/ft/templateComm.js new file mode 100644 index 00000000..1448c5af --- /dev/null +++ b/src/main/webapp/js/kakao/ft/templateComm.js @@ -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, '
'); + + $('.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, '
'); + + $('.nowChar').text(conLeng + " /"); + $('.totChar').text(" "+limitLeng); + $('.template_text').show(); + if(repContent != ''){ + $('.template_text').html(repContent); + $('#smsTxtArea').val( + $('.template_text').html().trim().replace(/(
||
)/g, '\r\n') + ); + }else{ + $('.template_text').html("내용 미리보기"); + } + +} \ No newline at end of file