이호영 이호영 2025-01-09
테스트 문자 진행중
@bd994861a5ff1b8acbe5a44afd6289a022dcff79
src/main/java/itn/let/mjo/msgdata/web/MjonMsgDataController.java
--- src/main/java/itn/let/mjo/msgdata/web/MjonMsgDataController.java
+++ src/main/java/itn/let/mjo/msgdata/web/MjonMsgDataController.java
@@ -5707,6 +5707,56 @@
  		return "/web/pop/testSendPop";
     }
 	
+	
+
+	/* 테스트 발송 팝업 */
+	@RequestMapping(value="/web/pop/testSmsSendPop.do")
+    public String testSmsSendPop(@ModelAttribute("searchVO") MjonMsgDataVO searchVO, HttpServletRequest request, Model model) throws Exception {
+		
+		LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
+    	String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
+    	String author = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getAuthority());
+    	
+		String msgpreview = request.getParameter("msgpreview");
+		String mmsSubject = request.getParameter("mmsSubject");
+		String callFrom = request.getParameter("callFrom");
+		String eachPrice = request.getParameter("eachPrice");
+		model.addAttribute("msgpreview", msgpreview);
+		model.addAttribute("mmsSubject", mmsSubject);
+		model.addAttribute("callFrom", callFrom);
+		model.addAttribute("eachPrice", eachPrice);
+		model.addAttribute("searchVO", searchVO);
+
+		MberManageVO mberManageVO = new MberManageVO(); 
+		
+		if(!userId.equals("") && !author.equals("ROLE_ADMIN")) {
+			
+			mberManageVO = mjonMsgDataService.selectMberManageInfo(userId);
+			searchVO.setUserId(userId);
+			
+		}
+		
+		//3.사용자 개인단가 정보가 0이 아니면 개인단가 사용, 없으면 시스템 기본 단가 사용
+		BigDecimal userMoney = new BigDecimal(mberManageVO.getUserMoney()).setScale(2, RoundingMode.HALF_EVEN);
+		String userPoint = mberManageVO.getUserPoint();
+		
+		model.addAttribute("mberManageVO", mberManageVO);
+		model.addAttribute("userMoney", userMoney);
+		model.addAttribute("userPoint", userPoint);
+		
+		//0.이벤트 진행중이 회원 정보 불러오기.
+		//이벤트 회원 정보 테이블에서 대상자의 정보를 불러온다.
+		MjonEventVO mjonEventVO = new MjonEventVO();
+		mjonEventVO.setMberId(userId);
+		MjonEventVO eventMberInfo = mjonEventService.selectEventMsgMberDefaultInfo(mjonEventVO);
+		
+		model.addAttribute("eventMberInfo", eventMberInfo);
+		
+// 		return "/web/pop/testSendPop";
+ 		return "/web/pop/testSmsSendPop";
+    }
+	
+	
 	/**
 	 * 문자 발송 - 엑셀파일 불러오기
 	 * @param body
src/main/webapp/WEB-INF/jsp/web/msgdata/MsgDataSMLView.jsp
--- src/main/webapp/WEB-INF/jsp/web/msgdata/MsgDataSMLView.jsp
+++ src/main/webapp/WEB-INF/jsp/web/msgdata/MsgDataSMLView.jsp
@@ -3424,7 +3424,7 @@
 		form.msgKind.value = "N";
 	}
 	
-	form.action = "/web/pop/testSendPop.do";
+	form.action = "/web/pop/testSmsSendPop.do";
 	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";
src/main/webapp/WEB-INF/jsp/web/msgdata/MsgDataView.jsp
--- src/main/webapp/WEB-INF/jsp/web/msgdata/MsgDataView.jsp
+++ src/main/webapp/WEB-INF/jsp/web/msgdata/MsgDataView.jsp
@@ -28,8 +28,8 @@
 </script>
 
 
-<script type="text/javascript" src="<c:url value='/js/web/msgdata/init.js?date=20241218'/>"></script>
 <script type="text/javascript" src="<c:url value='/js/web/msgdata/msgDataView.js?date=20241218'/>"></script>
+<script type="text/javascript" src="<c:url value='/js/web/msgdata/init.js?date=20241218'/>"></script>
 
 
 
 
src/main/webapp/WEB-INF/jsp/web/pop/testSmsSendPop.jsp (added)
+++ src/main/webapp/WEB-INF/jsp/web/pop/testSmsSendPop.jsp
@@ -0,0 +1,318 @@
+<%@ 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"%>
+<script type="text/javascript" src="<c:url value='/js/txtSpecialReplace.js?date=202209210001'/>"></script>
+<script type="text/javascript" src="<c:url value='/js/MJUtill.js'/>"></script>
+
+<script>
+$(document).ready(function (){
+	
+	var phoneIn = $(".send_right .phone", opener.document).html();
+	//팝업으로 보내기 전에 realtime class 삭제 - 스크립트 제외
+	phoneIn = phoneIn.replace(' class="realtime"',"");
+	
+	// DOM 구조로 변환
+	var tempDiv = document.createElement("div");
+	tempDiv.innerHTML = phoneIn;
+
+	// 미리보기 영역 삭제
+	var realtimeElement = tempDiv.querySelector(".preview_util");
+	if (realtimeElement) {
+		realtimeElement.remove();
+	}
+
+	// 최종 수정된 HTML 반환
+	phoneIn = tempDiv.innerHTML.trim();
+	
+	
+	$("#phonePreview").html(phoneIn)
+	
+});
+
+//문자발송 처리 함수
+function fn_testSendMsgData(){
+	var form = document.msgForm;
+
+	//회원 보유 잔액 비교
+	var totPriceOnly = stringReplaceAll(form.totPrice.value, ",", "");
+	var userMoneyOnly = stringReplaceAll(form.myPrice.value, ",", "");
+	if(parseFloat(userMoneyOnly) < parseFloat(totPriceOnly)){
+		alert("문자 발송에 필요한 회원님의 보유 잔액이 부족 합니다.");
+		return false;
+	}
+	
+	//이벤트 진행중 회원의 경우 이벤트 잔여금액 비교 처리 필요.
+	var eventStatus = form.eventStatus.value;
+	var eventRemainCash = parseFloat(form.eventRemainCash.value);
+	
+	if(eventStatus == 'Y'){
+		
+		if(parseFloat(eventRemainCash) < parseFloat(totPriceOnly)){
+			
+			alert("고객님의 이벤트 캐시 잔액은 " + eventRemainCash + "원으로 입력하신 수량의 문자를 전부 발송할 수 없습니다. 잔액 이하로 발송건수를 재설정하시기 바랍니다.");
+			return false;
+		}
+		
+		//이벤트 발송 문자 종류로 셋팅
+		form.eventYn.value = "Y"; //이벤트문자 종류 설정
+		
+	}
+	
+	if(confirm("테스트 문자를 전송하시겠습니까?")){
+		var imgFilePath = [];
+		var imgFileId = [];
+		var templateYn = [];
+//		$('.thumb_wrap').find('.thumb_img').each(function(idx, el) {
+		$('.preiew_img').find('.preBoxF').each(function(idx, el) {
+			var imgSrc = $(el).find("img").attr("src");
+			//if($(el).hasClass("edit_y")) {
+			//에디터에서 넘어온 이미지인지 확인, 해당 문자열이 없으면 -1 반환
+			if(imgSrc.indexOf('base64') > 0) {
+
+				//이미지 변환
+				const imgBase64 = $(el).find("img").attr("src");
+				const decodImg = atob(imgBase64.split(',')[1]);  // base64~ 부분을 제외하고 데이터 디코딩
+				
+		
+				let array = [];
+				for (let i = 0; i < decodImg.length; i++) {
+				  array.push(decodImg.charCodeAt(i));
+				}
+
+				const file = new Blob([new Uint8Array(array)], {type: 'image/jpeg'});
+				const fileName = 'canvas_img_' + new Date().getMilliseconds() + '.jpg';
+				let formData = new FormData();
+				formData.append('file', file, fileName);
+
+				$.ajax({
+					type: 'post',
+					url: '/web/mjon/msgdata/insertEditImageAjax.do',
+					cache: false,
+					data: formData,
+					dataType:'json',
+					processData: false,
+					contentType: false,
+					async: false,
+					success: function (returnData, status) {
+						if(status == 'success'){
+							// imgFilePath 에 배열로 담아주기(이미지 순서대로)
+							//console.log(imgFilePath);
+							imgFilePath.push(returnData.filefullPath);
+							imgFileId.push(returnData.atchFileId);
+							templateYn.push('N');
+						} else if(status== 'fail'){
+							alert(returnData.message);
+						}
+					},
+					error: function (e) { alert("이미지 업로드에 실패하였습니다."); console.log("ERROR : ", e); }
+				});
+
+			} else {
+				
+				var fileId = imgSrc.substring(imgSrc.indexOf("=")+1, imgSrc.indexOf("&"));
+				//에디터 안거친 템플릿 이미지면 바로 src 때림
+				imgFilePath.push(imgSrc);
+				
+				imgFileId.push(fileId);
+				templateYn.push('Y');
+			}	
+		});
+		
+		form.templateYnAdvc.value = templateYn; // 템플릿 사용여부 담아주기
+		form.imgFilePathAdvc.value = imgFilePath; // 저장한 이미지 경로 담아주기 
+		form.imgFileIdAdvc.value = imgFileId;
+// 		form.templateYn.value = templateYn; // 템플릿 사용여부 담아주기
+// 		form.imgFilePath.value = imgFilePath; // 저장한 이미지 경로 담아주기 
+// 		form.imgFileId.value = imgFileId;
+		
+		form.callFrom.value = removeDash(form.callFrom.value); // 발신번호 대쉬(-) 문자 없애주기
+		form.reserveYn.value = "N"; // 즉시 / 예약 문자 선택 여부
+		
+		//광고, 선거문자 후처리
+		var msgKind = form.msgKind.value;
+		form.smsTxt.value = $(".preview_auto").find("pre").text();
+		/* if(msgKind == 'A') {	//광고
+			var adTxt = $('.ad_tit').text();
+			var denyTxt = $('.deny_receipt').text();
+			
+			form.smsTxt.value = adTxt + $(".preview_auto").find("pre").text() + '\n' + denyTxt + " "; //광고 문구 뒤에 공백을 붙이게되므로, 뒤에 한칸 추가하여 바이트수를 맞춤
+			
+		} else if (msgKind == 'C') {	//선거문자
+			var adTxt = '';
+			var denyTxt = '';
+			var adverYn = opener.document.msgForm.send_adYn.value;
+			
+			//선거문자 20건 발송에서는 선거 필수문구가 필수가 아니어서 선거문자 필수 문구가 있는지 체크하여 처리함.20231214 추가
+			if(adverYn == 'Y'){
+				adTxt = $('.ad_tit').text();
+				denyTxt = $('.deny_receipt').html();
+				denyTxt = denyTxt.replaceAll("<br>","\n");
+			}
+			
+			form.smsTxt.value = adTxt + '\n' + $(".preview_auto").find("pre").text() + '\n' + denyTxt;
+		
+		} else {	//일반문자
+			form.smsTxt.value = $(".preview_auto").find("pre").text();
+		} */
+		
+		console.log('form : ',form)
+		
+		
+		 // 폼 데이터를 배열로 직렬화
+		 var form = $('#msgForm');
+		 var formDataArray = form.serializeArray();
+
+		 // 배열을 객체로 변환
+		 var formData = {};
+		 $.each(formDataArray, function(index, field) {
+		     formData[field.name] = field.value;
+		 });
+		
+
+		formData.mjonMsgSendVOList = [
+			{
+				phone: formData.callToList
+			}
+		];
+		// 기존 callToList 제거
+		delete formData.callToList;
+		// JSON 데이터 확인
+	 	console.log("최종 formData:", JSON.stringify(formData, null, 4));
+		
+		
+		
+		
+// 		return false;
+// 		var data = new FormData(form);
+		// url = "/web/mjon/msgdata/sendMsgDataAjax.do";
+		var url = "/web/mjon/msgdata/sendMsgDataAjax_advc.do";
+		
+		$.ajax({
+	        type: "POST",
+	        url: url,
+	        data: JSON.stringify(formData),
+	        dataType:'json',
+	        // async: false,
+	        // processData: false,
+	        // contentType: false,
+	        // cache: false,
+	        success: function (returnData, status) {
+	        	if(status == 'success'){ // status 확인 필요한가. 석세스 안뜨면 에러 가지 않나
+					if("fail" == returnData.result){
+						
+						alert(returnData.message);
+						return false;
+						
+					}else if("loginFail" == returnData.result){
+						
+						alert(returnData.message);
+						return false;
+							
+					}else if("smsLengFail" == returnData.result){
+						
+						alert(returnData.message);
+						return false;
+							
+					}else if("imgSourceFail" == returnData.result){
+						alert(returnData.message);
+					}else{
+						var resultCnt = returnData.resultSts;
+						var resultBlockCnt = returnData.resultBlockSts;
+						//차단한 번호 제외하고 발송건수가 1 미만인 경우는 발송이 안된 것
+						if(resultCnt < 1) {
+							alert("테스트 문자가 발송되지 않았습니다. \n"+ resultBlockCnt + "건의 번호가 수신거부 상태입니다.");
+						} else if (resultCnt >= 1) {
+							alert("테스트 문자가 발송되었습니다.");
+						}
+						
+						//내 충전금액 변경해 주기 - 헤더, 충전금액 두군데 수정
+						var afterCash = opener.numberWithCommas(returnData.afterCash);
+						//$("#hdUserMoney").text(afterCash); // 헤더 보유잔액 부분
+						//$("#spUserMoney").text(afterCash); // 문자발송 내 충전금
+						//$("#userMoney").attr('placeholder', afterCash);  // 문자발송 내 충전금
+						
+						$("#hdUserMoney",opener.document).text(afterCash); // 헤더 보유잔액 부분
+						$("#spUserMoney",opener.document).text(afterCash); // 문자발송 내 충전금
+						$("#userMoney",opener.document).text(afterCash);  // 문자발송 내 충전금
+						$("#userMoney",opener.document).attr('placeholder', afterCash);  // 문자발송 내 충전금
+						
+						window.close();
+						
+					}
+					
+				} else if(status== 'fail'){
+					alert(returnData.message);
+				}
+			},
+	        error: function (e) { alert("문자 발송에 실패하였습니다."); console.log("ERROR : ", e); }
+	    });
+		
+	}
+	
+}
+
+</script>
+<form id="msgForm" name="msgForm" method="post">
+	<input type="hidden" id="msgKind" name="msgKind" value="${searchVO.msgKind}" /><!-- 문자종류(일반:N, 광고:A , 선거:C,관리자:S) -->
+	<input type="hidden" id="msgType" name="msgType" value="${searchVO.msgType}" /><!-- 문자 종류 : 단문 - 4, 장문/그림 - 6 -->
+	<input type="hidden" id="imgFilePath" name="imgFilePath" value="" /><!-- 선택 이미지 파일 경로 정보 , 로 구분 최대 3장까지 -->
+	<input type="hidden" id="imgFilePathAdvc" name="imgFilePathAdvc" value="" /><!-- 선택 이미지 파일 경로 정보 , 로 구분 최대 3장까지 -->
+	<input type="hidden" id="imgFileId" name="imgFileId" value="" /><!-- 선택 이미지 파일 아이디 정보 , 로 구분 최대 3장까지 -->
+	<input type="hidden" id="imgFileIdAdvc" name="imgFileIdAdvc" value="" /><!-- 선택 이미지 파일 아이디 정보 , 로 구분 최대 3장까지 -->
+	<input type="hidden" id="fileCnt" name="fileCnt" value="0" /><!-- 첨부파일 추가 갯수 -->
+	<input type="hidden" id="mmsSubject" name="mmsSubject" value="${mmsSubject}"/> <!-- mms 제목 -->
+	<input type="hidden" id="callFrom" name="callFrom" value="${callFrom}"/> <!-- 발신자 전화번호 -->
+	<input type="hidden" id="eachPrice" name="eachPrice" value="${eachPrice}"/> <!-- 문자 개별 단가 금액 -->
+	<input type="hidden" id="totPrice" name="totPrice" value="${eachPrice}"/> <!-- 총 결제 금액 -->
+	<input type="hidden" id="smsLen" name="smsLen" value="0"/> <!-- 문자 길이 정보 -->
+	<input type="hidden" id="reserveYn" name="reserveYn" value="N"/> <!-- 즉시/예약 선택여부 -->
+	<input type="hidden" id="reqDate" name="reqDate" value=""/><!-- 예약문자 날짜 -->
+	<input type="hidden" id="imgCnt" value="0" />
+	<input type="hidden" id="templateYn" name="templateYn" value="" />
+	<input type="hidden" id="templateYnAdvc" name="templateYnAdvc" value="" />
+	<input type="hidden" id="smsTxt" name="smsTxt" value=""/><!-- 문자발송 문자 내용 -->
+	<input type="hidden" id="myPrice" name="myPrice" value="<c:out value="${userMoney}"/>"/><!-- 보유 캐시금액 -->
+	<input type="hidden" id="txtReplYn" name="txtReplYn" value="N"/><!-- 변환문자 유무 -->
+	<!-- <input type="hidden" id="shortMsgCnt" name="shortMsgCnt" value="0"/> --><!-- 단문 변환문자 건수  -->
+	<!-- <input type="hidden" id="longMsgCnt" name="longMsgCnt" value="0"/> --><!-- 장문 변환문자 건수 -->
+
+
+	<!-- 이벤트 관련 변수 -->
+	<input type="hidden" id="eventStatus" name="eventStatus" value="<c:out value='${eventMberInfo.eventStatus}'/>"/>
+	<input type="hidden" id="eventRemainCash" name="eventRemainCash" value="<c:out value='${eventMberInfo.eventRemainCash}'/>"/>
+	<input type="hidden" id="eventYn" name="eventYn" value="N"/>
+
+	<div class="test_sendpop">
+		<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">
+			<div class="number">
+				<dl>
+					<dt>수신번호</dt>
+					<dd><input type="text" name="callToList" id="callToList" value="${mberManageVO.moblphonNo}"/></dd>
+				</dl>
+				<dl class="price">
+					<dt>발송금액</dt>
+					<dd><span>${eachPrice}</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" id="phonePreview"></div>
+		</div>
+		
+	</div>
+
+</form>(No newline at end of file)
src/main/webapp/js/web/msgdata/msgDataView.js
--- src/main/webapp/js/web/msgdata/msgDataView.js
+++ src/main/webapp/js/web/msgdata/msgDataView.js
@@ -1127,10 +1127,6 @@
 
 	//form.reserveYn.value = reserYn; // 즉시 / 예약 문자 선택 여부 
 	form.templateYnAdvc.value = templateYn;
-	console.log('imgFilePath : ', imgFilePath);
-	console.log('imgFilePath : ', JSON.stringify(imgFilePath));
-	console.log('imgFileId : ', imgFileId);
-	console.log('imgFileId : ', JSON.stringify(imgFileId));
 	form.imgFilePathAdvc.value = imgFilePath;
 	form.imgFileIdAdvc.value =  imgFileId;
 // 	form.imgFilePath.value = JSON.stringify(imgFilePath).replace(/\\/g, '');
@@ -1232,8 +1228,9 @@
 	formData["mjonMsgSendVOList"] = $selectedData;
 	
 	// JSON 데이터 확인
-// 	console.log("최종 formData:", JSON.stringify(formData));
-	
+ 	console.log("최종 formData:", JSON.stringify(formData));
+	// 
+	return false;
 	
 	var url = "/web/mjon/msgdata/sendMsgDataAjax_advc.do";
 	 // 시작 시간
@@ -1254,7 +1251,7 @@
 		success: function (data) {
 			
 			// 요청 종료 시간 및 경과 시간 계산
-			const endTime = new Date();
+			/*const endTime = new Date();
 			const elapsed = (endTime - startTime) / 1000; // 밀리초 -> 초로 변환
 			console.log('AJAX 요청 성공, 경과 시간 : ', elapsed);
 			if (elapsed >= 60) {
@@ -1264,7 +1261,7 @@
 			} else {
 				console.log('AJAX 요청 성공, 경과 시간 : ' + elapsed + '초');
 			}
-			
+			*/
 			
 			
 			console.log('data : ', data);
Add a comment
List