이호영 이호영 2024-12-17
문자전송 받느사람 30만건 제한
@8b5d21c242704f5b27a230346ae3b4051aa50836
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
@@ -18,7 +18,6 @@
 
 $(document).ready(function(){
 	
-	
 
 	
 	//받는사람 연락처 내용 처리
@@ -98,12 +97,21 @@
 	    placeholder: "주소록 그룹을 선택해 주세요.", 
 	    resizableColumns: false,
 		progressiveLoad:"scroll",
+	    progressiveRender: true,   // 렌더링 최적화 활성화
+	    progressiveRenderSize: 100, // 한 번에 렌더링할 행 수를 줄임
 	    columns: [
-	        {formatter: "rowSelection", clipboard: false, hozAlign: "center", headerSort: false}, 
-// 	        {formatter: "rowSelection", titleFormatter: "rowSelection", clipboard: false, hozAlign: "center", headerSort: false, cellClick: function(e, cell) {
-// 	                cell.getRow().toggleSelect();
-// 	            }
-// 	        }, 
+// 	        {formatter: "rowSelection", clipboard: false, hozAlign: "center", headerSort: false}, 
+	        {formatter: "rowSelection", titleFormatter: "rowSelection", hozAlign: "center", headerSort: false, 
+	            cellClick: function(e, cell) {
+	        		fn_loadAddActive(); // 로딩 활성화
+	                setTimeout(() => {
+	                    tableAddr.blockRedraw(); // 렌더링 차단
+	                    cell.getRow().toggleSelect(); // 선택 상태 토글
+	                    tableAddr.restoreRedraw(); // 렌더링 재개
+	                    fn_loadRemoveActive(); // 로딩 비활성화
+	                }, 0); // 비동기적으로 실행
+	            }
+	        },
 	        {formatter: "rownum", align: "center", title: "No", hozAlign: "center", headerHozAlign: "center", width: 60},
 	        {title: "그룹명", hozAlign: "center", field: "addrGroupNm", editor: false, width: 100, validator: ["required", "minLength:2", "maxLength:40"]},
 	        {title: "이름", hozAlign: "center", field: "name", editor: false, width: 100, validator: ["maxLength:12"]},
@@ -1018,60 +1026,18 @@
 									.filter(num => isValidPhoneNumber(num)); // 유효한 번호만 필터링;
 		
 		console.log('numbers : ', numbers);
-									
-		const addrData = numbers
-						.map(number => {
-							if (!number) return null; // 빈 값은 제외
-							return {
-								name: "",              // name은 빈 문자열
-								phone: removeDash(number), // 전화번호는 removeDash 처리
-								rep1: "",              // rep로 시작하는 값 모두 빈 문자열
-								rep2: "",
-								rep3: "",
-								rep4: "",
-							};
-						})
-		.filter(data => data !== null); // null 제거
+		const addrData = processPhoneNumbers(numbers);
 
-
-		
-		
 
 		// 기존 tableL의 데이터를 가져옵니다.
 		var existingData = tableL.getData();
-		var combinedData = existingData.concat(addrData);
-		
-		/** 
-		* @ phone을 기준으로 중복 제거 및 갯수 계산
-		* @ 결과 반환
-		* 	return {
-		* 		uniqueArray,       // 중복 제거된 배열                    
-		* 		uniqueCount, // 중복 제거된 데이터 개수  
-		* 		duplicateArray // 중복된 데이터 배열                   
-		* 		duplicateCount: duplicateArray.length // 중복된 데이터 개수
-		* 	};
-		*/
-		const result = removeDuplicatesAndCount(combinedData, 'phone');
-		
 
-		// 총 30만건이 넘으면 false
-		if (!validateRowLimit(result.uniqueCount)) {
-			return false;
-		}
+		// 데이터 병합 및 중복 제거
+		const result = mergeAndValidateData(existingData, addrData);
 
-		// 합쳐진 데이터를 tableL에 설정합니다.
-		tableL.setData(result.uniqueArray);
-		// 중복데이터 건수 입력
-		setRowDupCnt(result.duplicateArray.length);
 
-		// 미리보기 버튼 활성화
-		updateButtons(0);
-		
-		var totRows = tableL.getRows().length; 
-		updateTotCnt(totRows); //전체 데이터 갯수 구하기
-		
-
-		totalPriceSum(totRows);
+		// 테이블 데이터 업데이트
+		if (!updateTableData(tableL, result)) return false;
 		
 		// textarea 초기화
 		textarea.val(''); // jQuery 객체에서 값을 초기화할 때는 .val('') 사용
@@ -1223,56 +1189,79 @@
 	
 	//최근전송내역 팝업 선택추가 버튼 처리(체크내역 받는사람 리스트로 추가해주기)
 	$(document).on('click', '#latestAddPhone', function (){
-		var addPhoneList = []; //신규로 추가할 전화번호 저장변수
+		var numbers = []; //신규로 추가할 전화번호 저장변수
 		$("input:checkbox[name='latAddrChk']:checked").each(function(index){
 			var chkPhone = $(this).val();
 			if(!checkHpNum(chkPhone)){
 				alert("올바른 전화번호가 아닙니다.");
 				return false;
 			}else{
-				addPhoneList.push({phone: removeDash(chkPhone.trim())});
+				numbers.push(removeDash(chkPhone.trim()));
 			}
 		});
 
-		if (!validateRowLimit(tableL.getDataCount(), addPhoneList.length)) {
-			return false;
-		}
-		if(addPhoneList.length > 0){
-			//연락처 추가해 주기
-			addPhoneInfo(addPhoneList);
-			$("#btnLatestAddPhoneClose").trigger("click");
-		}
-		else {
+
+		if(numbers.length < 1)
+		{
 			alert("연락처를 선택해주세요.");
 			return false;
-		}		
+		}	
+		
+		console.log('numbers : ', numbers);
+		const addrData = processPhoneNumbers(numbers);
+
+
+		// 기존 tableL의 데이터를 가져옵니다.
+		var existingData = tableL.getData();
+
+		// 데이터 병합 및 중복 제거
+		const result = mergeAndValidateData(existingData, addrData);
+
+
+		// 테이블 데이터 업데이트
+		if (!updateTableData(tableL, result)) return false;
+		
+		
+		$("#btnLatestAddPhoneClose").trigger("click");
+		
 	});
 	
 	//최근전송내역 팝업 전체추가 버튼 처리
 	$(document).on('click', '#latestAddPhoneAll', function (){
-		var addPhoneList = []; //신규로 추가할 전화번호 저장변수
+		var numbers = []; //신규로 추가할 전화번호 저장변수
 		$("input:checkbox[name='latAddrChk']").each(function(index){
 			var chkPhone = $(this).val();
 			if(!checkHpNum(chkPhone)){
 				alert("올바른 전화번호가 아닙니다.");
 				return false;
 			}else{
-				addPhoneList.push({phone: removeDash(chkPhone.trim())});
+				numbers.push(removeDash(chkPhone.trim()));
 			}
 		});
 
-		if (!validateRowLimit(tableL.getDataCount(), addPhoneList.length)) {
+		if(numbers.length < 1)
+		{
+			alert("연락처를 선택해주세요.");
 			return false;
-		}
-		if(addPhoneList.length > 0){
-			//연락처 추가해 주기
-			addPhoneInfo(addPhoneList);
-			$("#btnLatestAddPhoneClose").trigger("click");
-		}
-		else {
-			alert("연락처가 없습니다.");
-			return false;
-		}		
+		}	
+		
+		console.log('numbers : ', numbers);
+		const addrData = processPhoneNumbers(numbers);
+
+
+		// 기존 tableL의 데이터를 가져옵니다.
+		var existingData = tableL.getData();
+
+		// 데이터 병합 및 중복 제거
+		const result = mergeAndValidateData(existingData, addrData);
+
+
+		// 테이블 데이터 업데이트
+		if (!updateTableData(tableL, result)) return false;
+		
+		
+		$("#btnLatestAddPhoneClose").trigger("click");
+			
 	});
 	
 	//최근전송내역 팝업 선택 취소 버튼 처리
@@ -1291,62 +1280,78 @@
 	
 	//자주보내는 번호 팝업 선택추가 버튼 처리(체크내역 받는사람 리스트로 추가해주기)
 	$(document).on('click', '#bookMarkAddPhone', function (){
-		var addPhoneList = []; //신규로 추가할 전화번호 저장변수
+		var numbers = []; //신규로 추가할 전화번호 저장변수
 		$("input:checkbox[name='bookAddrChk']:checked").each(function(index){
 			var chkPhone = $(this).val();
 			if(!checkHpNum(chkPhone)){
 				alert("올바른 전화번호가 아닙니다.");
 				return false;
 			}else{
-				addPhoneList.push({phone: removeDash(chkPhone.trim())});
+				numbers.push(removeDash(chkPhone.trim()));
 			}
 		});
 
-		if (!validateRowLimit(tableL.getDataCount(), addPhoneList.length)) {
-			return false;
-		}
-		
-		
-		if(addPhoneList.length > 0){
-			//연락처 추가해 주기
-			addPhoneInfo(addPhoneList);
-			$("#btnLatestAddPhoneClose").trigger("click");
-		}
-		else {
+		if(numbers.length < 1)
+		{
 			alert("연락처를 선택해주세요.");
 			return false;
-		}		
+		}	
+		
+		console.log('numbers : ', numbers);
+		const addrData = processPhoneNumbers(numbers);
+
+
+		// 기존 tableL의 데이터를 가져옵니다.
+		var existingData = tableL.getData();
+
+		// 데이터 병합 및 중복 제거
+		const result = mergeAndValidateData(existingData, addrData);
+
+
+		// 테이블 데이터 업데이트
+		if (!updateTableData(tableL, result)) return false;
+		
+		
+		$("#btnLatestAddPhoneClose").trigger("click");
 	});
 	
 	//자주보내는 번호 팝업 전체추가 버튼 처리
 	$(document).on('click', '#bookMarkAddPhoneAll', function (){
-		
-		var addPhoneList = []; //신규로 추가할 전화번호 저장변수
+		var numbers = []; //신규로 추가할 전화번호 저장변수
 		$("input:checkbox[name='bookAddrChk']").each(function(index){
 			var chkPhone = $(this).val();
 			if(!checkHpNum(chkPhone)){
 				alert("올바른 전화번호가 아닙니다.");
 				return false;
 			}else{
-				addPhoneList.push({phone: removeDash(chkPhone.trim())});
+				numbers.push(removeDash(chkPhone.trim()));
 			}
 		});
 		
 
-		
-		if (!validateRowLimit(tableL.getDataCount(), addPhoneList.length)) {
+		if(numbers.length < 1)
+		{
+			alert("연락처를 선택해주세요.");
 			return false;
-		}
+		}	
 		
-		if(addPhoneList.length > 0){
-			//연락처 추가해 주기
-			addPhoneInfo(addPhoneList);
-			$("#btnLatestAddPhoneClose").trigger("click");
-		}
-		else {
-			alert("연락처가 없습니다.");
-			return false;
-		}		
+		console.log('numbers : ', numbers);
+		const addrData = processPhoneNumbers(numbers);
+
+
+		// 기존 tableL의 데이터를 가져옵니다.
+		var existingData = tableL.getData();
+
+		// 데이터 병합 및 중복 제거
+		const result = mergeAndValidateData(existingData, addrData);
+
+
+		// 테이블 데이터 업데이트
+		if (!updateTableData(tableL, result)) return false;
+		
+		
+		$("#btnLatestAddPhoneClose").trigger("click");
+		
 	});
 	
 	//자주보내는 번호 팝업 선택 취소 버튼 처리
@@ -2934,61 +2939,63 @@
 
 //주소록 불러오기에서 수신자 리스트 추가해 주기
 function addrToList_advc(type){
-	var selectedData = tableAddr.getSelectedRows();
-	var tableData = [];
-	
-	console.log()
-	
-	if(selectedData < 1){
-		
+	// 선택된 데이터 또는 전체 데이터 변수 초기화
+	let selectedData = type === 'select' ? tableAddr.getSelectedRows() : tableAddr.getData();
+
+	// 데이터가 비어있으면 경고 후 종료
+	if (!selectedData || selectedData.length < 1) {
 		alert("주소록을 선택해 주세요.");
 		return false;
-	
-	}else{ // 선택한 Row 데이터 저장해주기
-		
-
-		if (!validateRowLimit(tableL.getDataCount(), tableAddr.getSelectedRows())) {
-			return false;
-		}
-		
-		
-		// 기존 tableL의 데이터를 가져옵니다.
-		var existingData = tableL.getData();
-		var addrData;
-
-		if(type == 'all'){
-			addrData = tableAddr.getData();
-		}else{
-			addrData = tableAddr.getSelectedData();
-		}
-		
-		// 기존 데이터와 새로운 데이터를 합칩니다.
-		var combinedData = existingData.concat(addrData);
-		
-		// 합쳐진 데이터를 tableL에 설정합니다.
-		tableL.setData(combinedData);
-		
-		//일괄변환 문구 결제금액 처리
-		totRows = tableL.getRows().length; 
-		updateTotCnt(totRows); //전체 데이터 갯수 구하기
-		var smsTxtArea = $('#smsTxtArea').val();
-		if(smsTxtArea.indexOf("[*이름*]")  > -1 
-				|| smsTxtArea.indexOf("[*1*]") > -1
-				|| smsTxtArea.indexOf("[*2*]") > -1
-				|| smsTxtArea.indexOf("[*3*]") > -1
-				|| smsTxtArea.indexOf("[*4*]") > -1){
-			
-			fnReplCell();
-		}else{
-			//결제 금액 구하기
-		    totalPriceSum(totRows);
-		} 
-	
-		$(".closeAddr").trigger("click");
-		//주소록 레이어 팝업의 Tabulator 데이터 지워주기
-		tableAddr.clearData();
-
 	}
+
+	// 데이터 변환 로직
+	const addrData = selectedData.map(row => {
+		const rowData = type === 'select' ? row.getData() : row; // 'select'는 행 객체에서 데이터 추출
+		return {
+			name: rowData.name,
+			phone: removeDash(rowData.phone),
+			rep1: rowData.rep1,
+			rep2: rowData.rep2,
+			rep3: rowData.rep3,
+			rep4: rowData.rep4
+		};
+	});
+	
+
+	// 기존 tableL의 데이터를 가져옵니다.
+	var existingData = tableL.getData();
+	// 기존 데이터와 새로운 데이터를 합칩니다.
+	var combinedData = existingData.concat(addrData);
+
+	// @ phone을 기준으로 중복 제거 및 갯수 계산
+	const result = removeDuplicatesAndCount(combinedData, 'phone');
+	
+
+	
+	// 총 30만건이 넘으면 false
+	if (!validateRowLimit(result.uniqueCount)) {
+		return false;
+	}
+	
+	
+	// 합쳐진 데이터를 tableL에 설정합니다.
+	tableL.setData(result.uniqueArray);
+	// 중복데이터 건수 입력
+	setRowDupCnt(result.duplicateArray.length);
+	 
+	
+	// 미리보기 버튼 활성화
+	updateButtons(0);
+	
+	var totRows = tableL.getRows().length; 
+	updateTotCnt(totRows); //전체 데이터 갯수 구하기
+	totalPriceSum(totRows);
+	
+
+	$(".closeAddr").trigger("click");
+	//주소록 레이어 팝업의 Tabulator 데이터 지워주기
+	tableAddr.clearData();
+
 	
 }
 
@@ -3427,7 +3434,6 @@
 
 	});
 }
-
 
 </script>
 	
src/main/webapp/WEB-INF/jsp/web/msgdata/addr/MsgAddrGroupListAjax.jsp
--- src/main/webapp/WEB-INF/jsp/web/msgdata/addr/MsgAddrGroupListAjax.jsp
+++ src/main/webapp/WEB-INF/jsp/web/msgdata/addr/MsgAddrGroupListAjax.jsp
@@ -95,9 +95,10 @@
 
 <div class="adr_pop_list">
 	<div class="adr_cb_wrap2">
-		<p onClick="javascript:fnSelectAddrList('all','',this); return false;">
-			<img src="/publish/images/content/close_folder2.png" alt="폴더 닫힘">전체[<span id="addrTotCnt"><fmt:formatNumber value="${addrTotalCount}" pattern="#,###"/></span>명]
-		</p>
+<!-- 		<p onClick="javascript:fnSelectAddrList('all','',this); return false;"> -->
+<%-- 			<img src="/publish/images/content/close_folder2.png" alt="폴더 닫힘">전체[<span id="addrTotCnt"><fmt:formatNumber value="${addrTotalCount}" pattern="#,###"/></span>명] --%>
+			전체[<span id="addrTotCnt"><fmt:formatNumber value="${addrTotalCount}" pattern="#,###"/></span>명]
+<!-- 		</p> -->
 	</div>
 	
 	<div class="adr_cb_wrap2">
src/main/webapp/WEB-INF/jsp/web/msgdata/include/msgDataIncludeExcel.jsp
--- src/main/webapp/WEB-INF/jsp/web/msgdata/include/msgDataIncludeExcel.jsp
+++ src/main/webapp/WEB-INF/jsp/web/msgdata/include/msgDataIncludeExcel.jsp
@@ -320,7 +320,6 @@
 		*/
 		const result = removeDuplicatesAndCount(combinedData, 'phone');
 
-		console.table('result : ', result);
 		
 		// 총 30만건이 넘으면 false
 		if (!validateRowLimit(result.uniqueCount)) {
src/main/webapp/js/MJUtill.js
--- src/main/webapp/js/MJUtill.js
+++ src/main/webapp/js/MJUtill.js
@@ -131,10 +131,13 @@
 /**
  * 휴대폰번호 대시('-') 제거
  */
+/**
+ * 휴대폰번호에서 숫자가 아닌 문자를 모두 제거
+ */
 function removeDash(str) {
-	var regExp = new RegExp('-', 'g');
-	return str.replace(regExp, '');
+	return str.replace(/\D/g, ''); // 숫자 이외의 문자 제거
 }
+
 
 /**
  * 휴대폰번호 대시('-') 추가
@@ -1012,16 +1015,6 @@
 	};
 }
 
-/*
-function validateRowLimit(currentRows, newRows, limit = 300000) {
-	const totalRows = currentRows + newRows;
-	console.log('validateRowLimit totalRows : ', totalRows);
-	if (totalRows > limit) {
-		alert('안정적인 서비스 운영을 위해서 최대 '+limit+'건 이내로 분할 발송해 주시기 바랍니다.');
-		return false;
-	}
-	return true;
-}*/
 
 function validateRowLimit(totalRows, limit = 300000) {
 	// 값과 타입 확인
@@ -1045,6 +1038,55 @@
 	return true;
 }
 
+
+// 전화번호 리스트 처리
+function processPhoneNumbers(phoneList) {
+	return phoneList
+		.map(number => {
+			const cleanPhone = removeDash(number.trim());
+			if (!isValidPhoneNumber(cleanPhone)) return null;
+			return {
+				name: "",
+				phone: cleanPhone,
+				rep1: "",
+				rep2: "",
+				rep3: "",
+				rep4: "",
+			};
+		})
+		.filter(data => data !== null);
+}
+
+
+// 데이터 병합 및 중복 제거
+function mergeAndValidateData(existingData, newData, uniqueKey = 'phone') {
+	const combinedData = existingData.concat(newData);
+	const result = removeDuplicatesAndCount(combinedData, uniqueKey);
+
+	if (!validateRowLimit(result.uniqueCount)) {
+		return null;
+	}
+
+	return result;
+}
+
+// 테이블 데이터 업데이트
+function updateTableData(table, result) {
+	if (!result) return false;
+
+	table.setData(result.uniqueArray);
+	setRowDupCnt(result.duplicateArray.length);
+	updateButtons(0);
+	const totRows = table.getRows().length;
+	updateTotCnt(totRows);
+	totalPriceSum(totRows);
+	return true;
+}
+
+/**
+ * @Discript : 문자발송 화면에 중복 카운트 입력
+ * 
+ */
 function setRowDupCnt(cnt){
 	$('#rowDupCnt').text(cnt)
 }
src/main/webapp/js/web/addr/cmn.js
--- src/main/webapp/js/web/addr/cmn.js
+++ src/main/webapp/js/web/addr/cmn.js
@@ -3,7 +3,7 @@
 // 유효한 번호인지 확인하는 함수
 function isValidPhoneNumber(phone) {
     // 숫자만 추출
-    const numberOnly = phone.replace(/\D/g, '');
+	numberOnly = phone.replace(/\D/g, ''); // 숫자 이외의 문자 제거
 	// console.log('numberOnly : ' ,numberOnly);
 
     // 유효한 형식 체크
Add a comment
List