이호영 이호영 2024-12-16
문자전송 화면 수정중
@74e23201ccdddc2297fea1785e3d7335a9df39f0
src/main/java/itn/let/mjo/addr/web/AddrGroupController.java
--- src/main/java/itn/let/mjo/addr/web/AddrGroupController.java
+++ src/main/java/itn/let/mjo/addr/web/AddrGroupController.java
@@ -484,6 +484,7 @@
 			msg = e.getMessage();
 		}	
         
+        System.out.println("addrTotCnt : "+ addrTotCnt);
 		modelAndView.addObject("isSuccess", isSuccess);
 		modelAndView.addObject("msg", msg);
 		modelAndView.addObject("addrTotCnt", addrTotCnt);
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
@@ -1717,22 +1717,41 @@
     	
 		addrGroupVO.setSiteId("web");
     	List<AddrGroupVO> addrGroupList = addrGroupService.selectAddrGroupList(addrGroupVO);
-    	
-		/*
-		 * JSPark 2023.08.30 => Ajax 로 변경		    	
-    	//회원별 주소록 전체 갯수 조회
-    	int addrTotalCount = addrService.selectAddrTotalCount(addrVO);
-    	
-    	addrVO.setType("bookmark");
+
+		addrVO.setType("bookmark");
 		List<AddrVO> addrBookmarkList = addrService.selectAddrBasicGrpList(addrVO);
 
 		addrVO.setType("noGrp");
 		List<AddrVO> addrNoGrpList = addrService.selectAddrBasicGrpList(addrVO);
 		
+		int totalGrpCount = addrGroupList.stream()
+			    .mapToInt(group -> {
+			        String grpCountStr = group.getGrpCount();
+			        if (grpCountStr != null && !grpCountStr.isEmpty()) {
+			            try {
+			                return Integer.parseInt(grpCountStr);
+			            } catch (NumberFormatException e) {
+			                // 파싱에 실패한 경우 0을 반환하거나 예외 처리를 합니다.
+			                return 0;
+			            }
+			        } else {
+			            return 0;
+			        }
+			    })
+			    .sum();
+
+			// 결과 출력
+
+		System.out.println("totalGrpCount :: "+ totalGrpCount);
+		
+		int addrTotalCount = (addrNoGrpList.size() >0 ? addrNoGrpList.get(0).getTotcnt() : 0)
+				+ (addrBookmarkList.size() >0 ? addrBookmarkList.get(0).getTotcnt() : 0)
+				+ totalGrpCount
+				;		
+
 		model.addAttribute("addrTotalCount", addrTotalCount);
-     	model.addAttribute("addrBookmarkList", addrBookmarkList);
-		model.addAttribute("addrNoGrpList", addrNoGrpList);
-		*/
+	 	model.addAttribute("addrBookmarkCnt", addrBookmarkList.size() >0 ? addrBookmarkList.get(0).getTotcnt() : 0);
+		model.addAttribute("addrNoGrpCnt", addrNoGrpList.size() >0 ? addrNoGrpList.get(0).getTotcnt() : 0);
 
 		model.addAttribute("addrGroupList", addrGroupList);
 		
src/main/java/itn/let/schdlr/service/SchedulerUtil.java
--- src/main/java/itn/let/schdlr/service/SchedulerUtil.java
+++ src/main/java/itn/let/schdlr/service/SchedulerUtil.java
@@ -99,6 +99,10 @@
 		// do something...
 		try {
 			System.out.println("=============SchedulerUtil=====runScenarioOneTime =============>");
+			System.out.println("=============SchedulerUtil=====runScenarioOneTime =============>");
+			System.out.println("=============SchedulerUtil=====runScenarioOneTime =============>");
+			System.out.println("=============SchedulerUtil=====runScenarioOneTime =============>");
+			System.out.println("=============SchedulerUtil=====runScenarioOneTime =============>");
 			
 			//문자 환불, 팩스 환불
 			
src/main/webapp/WEB-INF/jsp/web/fax/addr/FaxAddrGroupListAjax.jsp
--- src/main/webapp/WEB-INF/jsp/web/fax/addr/FaxAddrGroupListAjax.jsp
+++ src/main/webapp/WEB-INF/jsp/web/fax/addr/FaxAddrGroupListAjax.jsp
@@ -599,7 +599,7 @@
 				<label for="groupAll" class="label">전체 선택</label>
 				<input type="checkbox" name="groupAll" id="groupAll" value="1" onClick="fnCheckAll();">
 			</div>
-			<p class="open" onclick="openThisGroup('');"><img src="/publish/images/content/open_folder.png" alt="폴더 열림">전체[<span class="c_002c9a fwMd"><fmt:formatNumber value="${addrTotalCount}" pattern="#,###"/></span>/최대 500,000]</p>
+			<p class="open" onclick="openThisGroup('');"><img src="/publish/images/content/open_folder.png" alt="폴더 열림">전체[<span class="c_002c9a fwMd"><fmt:formatNumber value="${addrTotalCount}" pattern="#,###"/></span>/최대 1,000,000]</p>
 		</div>
 		<div class="adr1_btnWrap">
 			<div>
src/main/webapp/WEB-INF/jsp/web/fax/addr/FaxAddrList.jsp
--- src/main/webapp/WEB-INF/jsp/web/fax/addr/FaxAddrList.jsp
+++ src/main/webapp/WEB-INF/jsp/web/fax/addr/FaxAddrList.jsp
@@ -409,11 +409,11 @@
 			
 			
 			var updateData = batchData.map(row => {
-	            row.addrGrpId = addrGrpIdInfo;
-	            row.addrGrpNm = addrGrpNmInfo;
-	            row.batchStart = start;
-	            row.dataTotCount = dataTotCount;
-	            return row;
+				row.addrGrpId = addrGrpIdInfo;
+				row.addrGrpNm = addrGrpNmInfo;
+				row.batchStart = start;
+				row.dataTotCount = dataTotCount;
+				return row;
 	        });
 			
 			$.ajax({
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
@@ -1006,64 +1006,73 @@
 	//받는사람 번호 버튼 클릭시 Tabulator에 데이터 넣어주기
 	$('.addCallToF').click(function(){ 
 		
-		var callToNum = $('#callTo').val();
-		if (callToNum == null || callToNum == "") {
+		var textarea = $('#callTo');
+		if (textarea.val() == null || textarea.val() == "") {
 		    alert("받는사람 번호를 입력해 주세요.");
 		    return false;
 		}
 
-		const textarea = $('#callTo');
 		const numbers = textarea.val().split('\n')
-		.map(num => num.trim())
-		.filter(num => num !== "");
+									.map(num => removeDash(num.trim()))
+									.filter(num => num !== "")
+									.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 제거
+
+
 		
 		
-		var numLen = numbers.length;
+
+		// 기존 tableL의 데이터를 가져옵니다.
+		var existingData = tableL.getData();
+		var combinedData = existingData.concat(addrData);
 		
-		if (!validateRowLimit(tableL.getDataCount(), numLen)) {
+		/** 
+		* @ phone을 기준으로 중복 제거 및 갯수 계산
+		* @ 결과 반환
+		* 	return {
+		* 		uniqueArray,       // 중복 제거된 배열                    
+		* 		uniqueCount, // 중복 제거된 데이터 개수  
+		* 		duplicateArray // 중복된 데이터 배열                   
+		* 		duplicateCount: duplicateArray.length // 중복된 데이터 개수
+		* 	};
+		*/
+		const result = removeDuplicatesAndCount(combinedData, 'phone');
+		
+
+		// 총 30만건이 넘으면 false
+		if (!validateRowLimit(result.count)) {
 			return false;
 		}
+
+		// 합쳐진 데이터를 tableL에 설정합니다.
+		tableL.setData(result.uniqueArray);
+		// 중복데이터 건수 입력
+		setRowDupCnt(result.duplicateArray.length);
+
+		// 미리보기 버튼 활성화
+		updateButtons(0);
 		
-
-		// 현재 테이블에 있는 데이터 가져오기
-		const existingRows = tableL.getData();
-		const existingNumbers = new Set(existingRows.map(row => row.phone.replace(/[^0-9]/g, ''))); // 숫자만 남겨서 중복 비교
-
-		let duplicateCount = 0; // 중복 번호 개수를 저장할 변수
-		let invalidNumbers = []; // 유효하지 않은 번호를 저장할 배열
-
-		// 각 번호를 테이블에 추가 (중복 검사 및 포맷팅 포함)
-		numbers.forEach(number => {
-// 			const formattedNumber = formatPhoneNumber(number); // 번호 표준화
-
-			const formattedNumber = formatPhoneNumber(number); // 번호 표준화
-			const cleanedNumber = formattedNumber.replace(/[^0-9]/g, ''); // 숫자만 남김
-			if (!existingNumbers.has(cleanedNumber)) { // 중복 번호 체크
-				if (isValidPhoneNumber(formattedNumber)) { // 유효성 검사
-					tableL.addRow({ phone: cleanedNumber }); // 하이픈 제거된 번호로 추가
-					existingNumbers.add(cleanedNumber); // 추가된 번호를 기존 목록에 추가
-				} else {
-					invalidNumbers.push(number); // 유효하지 않은 번호를 배열에 추가
-				}
-			} else {
-				duplicateCount++; // 중복 번호가 발견될 때마다 카운트를 증가
-			}
-		});
-
-		// 중복 번호 개수를 #rowDupCnt 요소에 표시
-		$("#rowDupCnt").text(duplicateCount);
-
 		var totRows = tableL.getRows().length; 
-		updateTotCnt(totRows);
-	    totalPriceSum(totRows);
+		updateTotCnt(totRows); //전체 데이터 갯수 구하기
 		
+
+		totalPriceSum(totRows);
 		
-		
-		// 유효하지 않은 번호가 있으면 alert로 표시
-		console.log('invalidNumbers : ', invalidNumbers);
-		if (invalidNumbers.length > 0) {
-			alert('유효하지 않은 번호 형식: \n'+ invalidNumbers.join('\n'));
-		}
 		// textarea 초기화
 		textarea.val(''); // jQuery 객체에서 값을 초기화할 때는 .val('') 사용
 		
@@ -2925,11 +2934,12 @@
 
 //주소록 불러오기에서 수신자 리스트 추가해 주기
 function addrToList_advc(type){
-// 	var selectedData = tableAddr.getSelectedRows();
-	var tableSize = tableAddr.getDataCount();
+	var selectedData = tableAddr.getSelectedRows();
 	var tableData = [];
 	
-	if(tableSize < 1){
+	console.log()
+	
+	if(selectedData < 1){
 		
 		alert("주소록을 선택해 주세요.");
 		return false;
@@ -2937,7 +2947,7 @@
 	}else{ // 선택한 Row 데이터 저장해주기
 		
 
-		if (!validateRowLimit(tableL.getDataCount(), tableAddr.getDataCount())) {
+		if (!validateRowLimit(tableL.getDataCount(), tableAddr.getSelectedRows())) {
 			return false;
 		}
 		
@@ -3416,15 +3426,6 @@
 	$("#mjMsgSentListAllLoad").load("/web/mjon/msgdata/selectMjMsgSentListAjax.do", sendData ,function(response, status, xhr){
 
 	});
-}
-
-function validateRowLimit(currentRows, newRows, limit = 300000) {
-	const totalRows = currentRows + newRows;
-	if (totalRows > limit) {
-		alert('안정적인 서비스 운영을 위해서 최대 '+limit+'건 이내로 분할 발송해 주시기 바랍니다.');
-		return false;
-	}
-	return true;
 }
 
 
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
@@ -9,10 +9,10 @@
 $(document).ready(function(){
 	
 	// 주소록 그룹 카운트(전체)
-	getAddrGroupTotCnt();
+// 	getAddrGroupTotCnt();
 
 	//주소록 그룹 카운트(그룹미지정)
-	getAddrGroupNogrpCnt();
+// 	getAddrGroupNogrpCnt();
 
 	//주소록 그룹 카운트(자주보내는 번호)
 	getAddrGroupBookmarkCnt();
@@ -96,19 +96,19 @@
 <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"></span>명]
+			<img src="/publish/images/content/close_folder2.png" alt="폴더 닫힘">전체[<span id="addrTotCnt"><fmt:formatNumber value="${addrTotalCount}" pattern="#,###"/></span>명]
 		</p>
 	</div>
 	
 	<div class="adr_cb_wrap2">
 		<p onClick="javascript:fnSelectAddrList('none','',this); return false;">
-			<img src="/publish/images/content/close_folder2.png" alt="폴더 닫힘">그룹미지정[<span id="nogrpCnt"></span>명]
+			<img src="/publish/images/content/close_folder2.png" alt="폴더 닫힘">그룹미지정[<span id="nogrpCnt"><fmt:formatNumber value="${addrNoGrpCnt}" pattern="#,###"/></span>명]
 		</p>
 	</div>
 	
 	<div class="adr_cb_wrap2">
 		<p onClick="javascript:fnSelectAddrList('book','',this); return false;">
-			<img src="/publish/images/content/close_folder2.png" alt="폴더 닫힘">자주보내는 번호[<span id="bookmarkCnt"></span>명]
+			<img src="/publish/images/content/close_folder2.png" alt="폴더 닫힘">자주보내는 번호[<span id="bookmarkCnt"><fmt:formatNumber value="${addrBookmarkCnt}" pattern="#,###"/></span>명]
 		</p>
 	</div>
 	
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
@@ -282,23 +282,15 @@
 		
 		
 		// tableExcel 그룹의 select 요소들을 확인
-//	 	var isPhoneSelected = false;
-//	 	var isNameSelected = false;
 		var columns = $tableExcel.getColumns();
 		var isAddrPhoneNoSelected = columns.some(column => column.getField() === 'addrPhoneNo');
 
 		if (!isAddrPhoneNoSelected) {
-//			    isPhoneSelected = true;
 			alert('휴대폰이 선택되지 않았습니다.');
 			return false;
 
 		} 
 
-		// 총 30만건이 넘으면 false
-		if (!validateRowLimit($tableExcel.getDataCount(), tableL.getDataCount())) {
-			return false;
-		}
-		
 		
 		var addrData = $tableExcel.getData().map((row, index) => ({
 		    name: row.addrNm,
@@ -309,17 +301,35 @@
 		    rep4: row.addrInfo4,
 		}));
 
-		
-		
-		
-		
-
 		// 기존 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.count)) {
+			return false;
+		}
+		
+		
 		// 합쳐진 데이터를 tableL에 설정합니다.
-		tableL.setData(combinedData);
+		tableL.setData(result.uniqueArray);
+		// 중복데이터 건수 입력
+		setRowDupCnt(result.duplicateArray.length);
+		 
 		
 		// 미리보기 버튼 활성화
 		updateButtons(0);
src/main/webapp/js/MJUtill.js
--- src/main/webapp/js/MJUtill.js
+++ src/main/webapp/js/MJUtill.js
@@ -973,4 +973,70 @@
 	
 	return totAddrCnt;
 
-}
(No newline at end of file)
+}
+
+/** 
+* @ phone을 기준으로 중복 제거 및 갯수 계산
+* @ 결과 반환
+* 	return {
+* 		uniqueArray,       // 중복 제거된 배열                    
+* 		uniqueCount, // 중복 제거된 데이터 개수  
+* 		duplicateArray // 중복된 데이터 배열                   
+* 		duplicateCount: duplicateArray.length // 중복된 데이터 개수
+* 	};
+*/
+function removeDuplicatesAndCount(array, key) {
+	// 중복을 제거한 배열 생성
+	const uniqueArray = array.filter((item, index, self) => 
+		index === self.findIndex((t) => t[key] === item[key])
+	);
+	
+	// 중복된 데이터만 추출
+	const duplicateArray = array.filter((item, index, self) =>
+		index !== self.findIndex((t) => t[key] === item[key])
+	);
+	
+	// 결과 반환
+	return {
+		uniqueArray,       // 중복 제거된 배열
+		uniqueCount: uniqueArray.length, // 중복 제거된 데이터 개수
+		duplicateArray,    // 중복된 데이터 배열
+		duplicateCount: duplicateArray.length // 중복된 데이터 개수
+	};
+}
+
+/*
+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) {
+	// 값과 타입 확인
+
+	// 숫자 변환
+	const totalRowsNum = Number(totalRows);
+	const limitNum = Number(limit);
+
+	// 변환 후 값 확인
+
+	// 비교 연산 결과 확인
+	const isOverLimit = totalRowsNum > limitNum;
+	
+	// 조건 처리
+	 if (isOverLimit) {
+	     alert('안정적인 서비스 운영을 위해서 최대 ' + limit + '건 이내로 분할 발송해 주시기 바랍니다.');
+	     return false;
+	 }
+	return true;
+}
+
+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
@@ -4,6 +4,7 @@
 function isValidPhoneNumber(phone) {
     // 숫자만 추출
     const numberOnly = phone.replace(/\D/g, '');
+	console.log('numberOnly : ' ,numberOnly);
 
     // 유효한 형식 체크
     return (
Add a comment
List