From 8b5d21c242704f5b27a230346ae3b4051aa50836 Mon Sep 17 00:00:00 2001 From: "hehihoho3@gmail.com" Date: Tue, 17 Dec 2024 12:51:00 +0900 Subject: [PATCH] =?UTF-8?q?=EB=AC=B8=EC=9E=90=EC=A0=84=EC=86=A1=20?= =?UTF-8?q?=EB=B0=9B=EB=8A=90=EC=82=AC=EB=9E=8C=2030=EB=A7=8C=EA=B1=B4=20?= =?UTF-8?q?=EC=A0=9C=ED=95=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jsp/web/msgdata/MsgDataSMLView.jsp | 326 +++++++++--------- .../web/msgdata/addr/MsgAddrGroupListAjax.jsp | 7 +- .../msgdata/include/msgDataIncludeExcel.jsp | 1 - src/main/webapp/js/MJUtill.js | 66 +++- src/main/webapp/js/web/addr/cmn.js | 2 +- 5 files changed, 225 insertions(+), 177 deletions(-) diff --git a/src/main/webapp/WEB-INF/jsp/web/msgdata/MsgDataSMLView.jsp b/src/main/webapp/WEB-INF/jsp/web/msgdata/MsgDataSMLView.jsp index 776643a1..41fd6e51 100644 --- a/src/main/webapp/WEB-INF/jsp/web/msgdata/MsgDataSMLView.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/msgdata/MsgDataSMLView.jsp @@ -18,7 +18,6 @@ $(document).ready(function(){ - //받는사람 연락처 내용 처리 @@ -98,12 +97,21 @@ $(document).ready(function(){ 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 @@ $(document).ready(function (){ .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).ready(function (){ //최근전송내역 팝업 선택추가 버튼 처리(체크내역 받는사람 리스트로 추가해주기) $(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).ready(function (){ //자주보내는 번호 팝업 선택추가 버튼 처리(체크내역 받는사람 리스트로 추가해주기) $(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; - } + } + + 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"); - if(addPhoneList.length > 0){ - //연락처 추가해 주기 - addPhoneInfo(addPhoneList); - $("#btnLatestAddPhoneClose").trigger("click"); - } - else { - alert("연락처가 없습니다."); - return false; - } }); //자주보내는 번호 팝업 선택 취소 버튼 처리 @@ -2934,61 +2939,63 @@ function addrToList(){ //주소록 불러오기에서 수신자 리스트 추가해 주기 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(); + } @@ -3428,7 +3435,6 @@ function getMjMsgSentListAll(pageNo) { }); } -
diff --git a/src/main/webapp/WEB-INF/jsp/web/msgdata/addr/MsgAddrGroupListAjax.jsp b/src/main/webapp/WEB-INF/jsp/web/msgdata/addr/MsgAddrGroupListAjax.jsp index 93a33383..2306ba28 100644 --- a/src/main/webapp/WEB-INF/jsp/web/msgdata/addr/MsgAddrGroupListAjax.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/msgdata/addr/MsgAddrGroupListAjax.jsp @@ -95,9 +95,10 @@ $(".adr_cb_wrap2").click(function(){
-

- 폴더 닫힘전체[명] -

+ +<%-- 폴더 닫힘전체[명] --%> + 전체[명] +
diff --git a/src/main/webapp/WEB-INF/jsp/web/msgdata/include/msgDataIncludeExcel.jsp b/src/main/webapp/WEB-INF/jsp/web/msgdata/include/msgDataIncludeExcel.jsp index 49ea344a..55be90fd 100644 --- a/src/main/webapp/WEB-INF/jsp/web/msgdata/include/msgDataIncludeExcel.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/msgdata/include/msgDataIncludeExcel.jsp @@ -320,7 +320,6 @@ $(document).ready(function(){ */ const result = removeDuplicatesAndCount(combinedData, 'phone'); - console.table('result : ', result); // 총 30만건이 넘으면 false if (!validateRowLimit(result.uniqueCount)) { diff --git a/src/main/webapp/js/MJUtill.js b/src/main/webapp/js/MJUtill.js index 064a712c..504b3aef 100644 --- a/src/main/webapp/js/MJUtill.js +++ b/src/main/webapp/js/MJUtill.js @@ -131,11 +131,14 @@ function checkTelHpType(str){ /** * 휴대폰번호 대시('-') 제거 */ +/** + * 휴대폰번호에서 숫자가 아닌 문자를 모두 제거 + */ function removeDash(str) { - var regExp = new RegExp('-', 'g'); - return str.replace(regExp, ''); + return str.replace(/\D/g, ''); // 숫자 이외의 문자 제거 } + /** * 휴대폰번호 대시('-') 추가 * 대시 유무 상관없음 @@ -1012,16 +1015,6 @@ function removeDuplicatesAndCount(array, key) { }; } -/* -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 @@ function validateRowLimit(totalRows, limit = 300000) { 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) } diff --git a/src/main/webapp/js/web/addr/cmn.js b/src/main/webapp/js/web/addr/cmn.js index 121f78df..36bbba2e 100644 --- a/src/main/webapp/js/web/addr/cmn.js +++ b/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); // 유효한 형식 체크