문자전송 받느사람 30만건 제한

This commit is contained in:
hehihoho3@gmail.com 2024-12-17 12:51:00 +09:00
parent b06cc7e71e
commit 8b5d21c242
5 changed files with 225 additions and 177 deletions

View File

@ -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) {
});
}
</script>
<div class="loading_layer">

View File

@ -95,9 +95,10 @@ $(".adr_cb_wrap2").click(function(){
<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">

View File

@ -320,7 +320,6 @@ $(document).ready(function(){
*/
const result = removeDuplicatesAndCount(combinedData, 'phone');
console.table('result : ', result);
// 총 30만건이 넘으면 false
if (!validateRowLimit(result.uniqueCount)) {

View File

@ -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)
}

View File

@ -3,7 +3,7 @@
// 유효한 번호인지 확인하는 함수
function isValidPhoneNumber(phone) {
// 숫자만 추출
const numberOnly = phone.replace(/\D/g, '');
numberOnly = phone.replace(/\D/g, ''); // 숫자 이외의 문자 제거
// console.log('numberOnly : ' ,numberOnly);
// 유효한 형식 체크