이호영 이호영 2025-06-18
친구톡 개발완료
@f3ddd22598712dff79d4c2211f0da5de5d0077c2
src/main/java/itn/let/kakao/admin/kakaoAt/service/MjonKakaoATVO.java
--- src/main/java/itn/let/kakao/admin/kakaoAt/service/MjonKakaoATVO.java
+++ src/main/java/itn/let/kakao/admin/kakaoAt/service/MjonKakaoATVO.java
@@ -217,6 +217,7 @@
 	private int regComCount;
 	private int orderByCode;		// 문자타입 정렬번호
 	private String detailType;
+	private String adFlag;
 	
 	
 	
src/main/java/itn/let/kakao/kakaoComm/KakaoSendUtil.java
--- src/main/java/itn/let/kakao/kakaoComm/KakaoSendUtil.java
+++ src/main/java/itn/let/kakao/kakaoComm/KakaoSendUtil.java
@@ -493,17 +493,9 @@
 	
 
 	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 @@
 		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		: 이호영
src/main/java/itn/let/kakao/user/kakaoFt/service/impl/KakaoFriendsTalkServiceImpl.java
--- src/main/java/itn/let/kakao/user/kakaoFt/service/impl/KakaoFriendsTalkServiceImpl.java
+++ src/main/java/itn/let/kakao/user/kakaoFt/service/impl/KakaoFriendsTalkServiceImpl.java
@@ -105,6 +105,15 @@
 		}
 		
 
+		/**
+		 * 친구톡은 발송 시간 제약이 있음
+		 */
+		if(kakaoSendUtil.isRestrictedFriendTalkTime(kakaoSendUtil.resolveBaseDate(kakaoVO))) {
+			// UNAUTHORIZED : 인증되지 않은 사용자가 접근하려고 할 때
+			return new StatusResponse(HttpStatus.BAD_REQUEST,
+					"친구톡은 20시 50분부터 익일 08시까지 발송이 제한됩니다.");
+		}
+		
 
 /** @isHolidayNotified 
  * @false : 알림 X
src/main/java/itn/let/kakao/user/sent/web/KakaoSentController.java
--- src/main/java/itn/let/kakao/user/sent/web/KakaoSentController.java
+++ src/main/java/itn/let/kakao/user/sent/web/KakaoSentController.java
@@ -1042,13 +1042,11 @@
 		
 			//발송 관리 문자발송 내용 상세보기 팝업 => 문자내용(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 @@
 			}
 			model.addAttribute("msgType", msgType);		
 		
-			log.info(" 3 resultMsgDetail.bizKakaoResendOrgnlTxt : [{}]", mjonKakaoATResultVO.getBizKakaoResendOrgnlTxt());
 			
 		} catch (Exception e) {
 			e.printStackTrace();
src/main/resources/egovframework/sqlmap/let/mjo/kakao/KakaoSent_SQL_Mysql.xml
--- src/main/resources/egovframework/sqlmap/let/mjo/kakao/KakaoSent_SQL_Mysql.xml
+++ 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
src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/ft/KakaoFriendsTalkMsgDataView.jsp
--- src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/ft/KakaoFriendsTalkMsgDataView.jsp
+++ 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" %>
-<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 @@
 
 			fnAgentCodeChg();
 		}
+		thisFnByteString($('#smsTxtArea').val());
 	});
 	$("#send_fail_check").change(function(){
 		if($("#send_fail_check").is(":checked")){
@@ -126,7 +127,7 @@
 	});
 	
 	
-	//대체문자 초기화 버튼 선택 처리
+/* 	//대체문자 초기화 버튼 선택 처리
 	$("#failCheckInit").click(function(){
 		
 		$('#smsTxtArea').val("");
@@ -140,7 +141,7 @@
 		fn_insertErrorYN('N');
 		
 	});
-	
+ */	
 
 	// 광고포함여부 체크 이벤트
 	$("#ad_Y").click(function () {
@@ -942,7 +943,7 @@
 		
 		if(resMin >= 50 && resMin <= 59){
 			
-			alert("친구톡은 20:50 ~ 익일 08:00까지 발송할 수 없습니다.");
+			alert("친구톡은 20시 50분부터 익일 08시까지 발송이 제한됩니다.");
 			$("#msgResMin").val("40").prop("selected", true);
 			
 		}
@@ -1353,13 +1354,18 @@
 
 	$('#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 @@
 																	<!-- 업로드한 이미지의 썸네일 영역 -->
 																	<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>
src/main/webapp/WEB-INF/jsp/web/kakao/sent/KakaoSentDetailPopAjax.jsp
--- src/main/webapp/WEB-INF/jsp/web/kakao/sent/KakaoSentDetailPopAjax.jsp
+++ src/main/webapp/WEB-INF/jsp/web/kakao/sent/KakaoSentDetailPopAjax.jsp
@@ -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>
src/main/webapp/WEB-INF/jsp/web/kakao/sent/KakaoSentDetailView.jsp
--- src/main/webapp/WEB-INF/jsp/web/kakao/sent/KakaoSentDetailView.jsp
+++ src/main/webapp/WEB-INF/jsp/web/kakao/sent/KakaoSentDetailView.jsp
@@ -753,41 +753,50 @@
                                       <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 @@
 	
 	<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>
 
 
src/main/webapp/js/kakao/ft/templateComm.js (added)
+++ 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, '<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("내용 미리보기");
+	}
+	
+}(No newline at end of file)
Add a comment
List