mjon_git/src/main/webapp/js/txtSpecialReplace.js
2024-12-19 21:01:54 +09:00

649 lines
19 KiB
JavaScript

function fnReplCell_advc(){
console.log(':: fnReplCell_advc ::'); // 함수 실행 로그
let smsTxtArea = $('#smsTxtArea').val(); // 문자 내용을 가져옴
const adTxt = $('.ad_txt').text(); // 광고 문구
const denyTxt = $('.deny_txt').text(); // 수신 거부 문구
const recTableData = tableL.getRows(); // 받는사람 리스트
// 광고 문구와 수신 거부 문구를 문자 내용에 추가
if (adTxt && denyTxt) {
smsTxtArea = `${adTxt}\n${smsTxtArea}\n${denyTxt}`;
}
// 문자 내용에 치환 문자열이 포함되어 있는지 확인
if (!SmsTextProcessor.hasPlaceholders(smsTxtArea)) return;
$('#txtReplYn').val("Y"); // 치환 여부 상태값 설정
// 받는사람 데이터가 없는 경우 종료
if (!recTableData.length) return;
try {
// 문자 내용을 처리하고 단문/장문 카운트를 얻음
const msgCount = SmsTextProcessor.processSmsText(smsTxtArea, recTableData);
// 총 가격 계산 및 업데이트
replTotalPriceSum(msgCount.short, msgCount.long, recTableData.length);
$('#txtReplYn').val("Y"); // 일괄변환문자 포함 여부 설정
} catch (error) {
console.error(error.message); // 오류 메시지 로그
}
}
//특정문구 일괄변환 문자길이 체크 하기
function fnReplCell(){
var smsTxtArea = $('#smsTxtArea').val();
var imgCnt = $("#imgCnt").val(); // 현재 페이지에 첨부된 이미지 갯수
var orgSmsTxt = smsTxtArea; // 광고문자 뺀 문자내용
var adTxt = $('.ad_txt').text();
var denyTxt = $('.deny_txt').text();
var adverTxt = "";
//이벤트 잔여 캐시 자동 처리 관련 변수
var evnRemainCash = parseFloat($("#eventRemainCash").val()); //이벤트 잔여 캐시 금액
var evnEachPrice = parseFloat($("#eachPrice").val());
var evnShortPrice = parseFloat($("#sPrice").val());
var evnLongPrice = parseFloat($("#mPrice").val());
var evnPhoneNumCnt = 0;
var evnShortMsgCnt = 0;
var evnLongMsgCnt = 0;
var evnMsgCntSts = true;
if(adTxt.length > 0 && denyTxt.length > 0){
adverTxt = adTxt + "\n" + smsTxtArea + "\n" + denyTxt;
smsTxtArea = adverTxt;
}
console.log('???smsTxtArea :: ', smsTxtArea);
if(smsTxtArea.indexOf("[*이름*]") > -1
|| smsTxtArea.indexOf("[*1*]") > -1
|| smsTxtArea.indexOf("[*2*]") > -1
|| smsTxtArea.indexOf("[*3*]") > -1
|| smsTxtArea.indexOf("[*4*]") > -1){
var rowData = tableL.getRows();
var recTableData = tableL.getRows(); // 받는사람 리스트의 전체 목록을 저장
//var tableData = [];
var msg_short = 0; //단문문자 갯수
var msg_long = 0; //장문문자 갯수
//일괄변환문자 포함 여부 변경 - 문자내용에 치환변환 문자는 있지만 받는사람 데이터에 치환 데이터를 안넣는 경우 오류가 발생하여 상태값 입력 위치 상단으로 변경함.
//치환데이터가 없는 경우 Alert 띄우고 빠져나가기 때문에 치환문자 상태 체크값이 누락되어서 변경함 - 20230407 우영두
$('#txtReplYn').val("Y");
var nmStatus = false;
var rep1Status = false;
var rep2Status = false;
var rep3Status = false;
var rep4Status = false;
if(smsTxtArea.indexOf("[*이름*]") > -1){
nmStatus = true;
}
if(smsTxtArea.indexOf("[*1*]") > -1){
rep1Status = true;
}
if(smsTxtArea.indexOf("[*2*]") > -1){
rep2Status = true;
}
if(smsTxtArea.indexOf("[*3*]") > -1){
rep3Status = true;
}
if(smsTxtArea.indexOf("[*4*]") > -1){
rep4Status = true;
}
//기존 받는사람 리스트를 배열에 미리 담아둔다.
if(recTableData.length > 0){
for(var j=0; j < recTableData.length; j++){
var smsTxt = smsTxtArea;
if(typeof recTableData[j].getData().name != 'undefined'
&& recTableData[j].getData().name != null
&& recTableData[j].getData().name != ""){
// console.log('name : ', name);
// console.log('smsTxt : ', smsTxt);
// console.log('orgSmsTxt : ', orgSmsTxt);
var name = recTableData[j].getData().name;
smsTxt = stringReplaceAll(smsTxt, "[*이름*]", name);
orgSmsTxt = stringReplaceAll(orgSmsTxt, "[*이름*]", name);//광고, 선거 문자인 경우 상하단 문구 제거한 문자내용만 보여주도록 함. 치환문자 있으면 변환해서 보여줌
}/*else{
if(nmStatus){
alert("[*이름*] 치환 문자에 데이터가 없습니다. 받는사람 목록의 치환 데이터를 확인해 주세요.");
return false;
}
}*/
if(typeof recTableData[j].getData().rep1 != 'undefined' && recTableData[j].getData().rep1 != null && recTableData[j].getData().rep1 != ""){
var rep1 = recTableData[j].getData().rep1;
smsTxt = stringReplaceAll(smsTxt, "[*1*]", rep1);
orgSmsTxt = stringReplaceAll(orgSmsTxt, "[*1*]", rep1);
}/*else{
if(rep1Status){
alert("[*1*] 치환 문자에 데이터가 없습니다. 받는사람 목록의 치환 데이터를 확인해 주세요.");
return false;
}
}*/
if(typeof recTableData[j].getData().rep2 != 'undefined' && recTableData[j].getData().rep2 != null && recTableData[j].getData().rep2 != ""){
var rep2 = recTableData[j].getData().rep2;
smsTxt = stringReplaceAll(smsTxt, "[*2*]", rep2);
orgSmsTxt = stringReplaceAll(orgSmsTxt, "[*2*]", rep2);
}/*else{
if(rep2Status){
alert("[*2*] 치환 문자에 데이터가 없습니다. 받는사람 목록의 치환 데이터를 확인해 주세요.");
return false;
}
}*/
if(typeof recTableData[j].getData().rep3 != 'undefined' && recTableData[j].getData().rep3 != null && recTableData[j].getData().rep3 != ""){
var rep3 = recTableData[j].getData().rep3;
smsTxt = stringReplaceAll(smsTxt, "[*3*]", rep3);
orgSmsTxt = stringReplaceAll(orgSmsTxt, "[*3*]", rep3);
}/*else{
if(rep3Status){
alert("[*3*] 치환 문자에 데이터가 없습니다. 받는사람 목록의 치환 데이터를 확인해 주세요.");
return false;
}
}*/
if(typeof recTableData[j].getData().rep4 != 'undefined' && recTableData[j].getData().rep4 != null && recTableData[j].getData().rep4 != ""){
var rep4 = recTableData[j].getData().rep4;
smsTxt = stringReplaceAll(smsTxt, "[*4*]", rep4);
orgSmsTxt = stringReplaceAll(orgSmsTxt, "[*4*]", rep4);
}/*else{
if(rep4Status){
alert("[*4*] 치환 문자에 데이터가 없습니다. 받는사람 목록의 치환 데이터를 확인해 주세요.");
return false;
}
}*/
var msgLen = conByteLeng(smsTxt);
if(msgLen < 1){
}else if(msgLen > 2000){
alert("문자 내용은 2000byte를 넘을 수 없습니다.");
return false;
}else{
if(msgLen > 90){
msg_long++;
console.log(evnRemainCash + " === " + evnLongPrice);
if(evnRemainCash >= evnLongPrice && evnMsgCntSts == true){//이벤트 금액으로 보낼수 있으면 카운팅
evnRemainCash = evnRemainCash - evnLongPrice;
evnPhoneNumCnt++;
evnLongMsgCnt++;
$("#evnPhoneNumCnt").val(evnPhoneNumCnt);
$("#evnLongMsgCnt").val(evnLongMsgCnt);
}else{//이벤트 금액으로 보낼수 없으면 카운팅 중지
evnMsgCntSts = false;
}
}else{
msg_short++;
console.log(evnRemainCash + " === " + evnShortPrice);
if(evnRemainCash >= evnShortPrice && evnMsgCntSts == true){//이벤트 금액으로 발송할 수 있으면 카운팅
evnRemainCash = evnRemainCash - evnShortPrice;
evnPhoneNumCnt++;
evnShortMsgCnt++;
$("#evnPhoneNumCnt").val(evnPhoneNumCnt);
$("#evnShortMsgCnt").val(evnShortMsgCnt);
}else{//이벤트 금액으로 보낼수 없으면 카운티 중지
evnMsgCntSts = false;
}
}
}
replTotalPriceSum(msg_short, msg_long, totRows);
//첫번째 수신자의 변환 텍스트 내용을 적용하여 미리보기 문자내용에 보여주자.
if(j == 0){
console.log('adverTxt : ', adverTxt);
//미리보기에 내용 입력해 주기
if(adverTxt.length > 0){
$('.realtime').text(orgSmsTxt);
}else{
$('.realtime').text(smsTxt);
}
}
//일괄변환문자 포함 여부 변경
//$('#txtReplYn').val("Y");
}
//변환후 문자 중에 장문이 1개 이상 있는 경우 문자 제목을 입력해 주기
/*var txtReplYn = $('#txtReplYn').val();
if(txtReplYn == 'Y' && (msg_long > 0 || imgCnt > 0)){
//장문, 그림 문자가 포함되어 있는 경우 제목을 입력하도록 처리
$('#mmsSubject').attr("disabled", false);
}else if(txtReplYn == 'Y' && msg_long < 1){
//일괄변환애 단문문자만 있는경우 제목 입력 안되도록 처리
$('#mmsSubject').val("");
$('#mmsSubject').attr("disabled", true);
}*/
}
}
}
// 문자 처리 객체
const SmsTextProcessor = {
// 치환 문자열 배열
placeholders: ["[*이름*]", "[*1*]", "[*2*]", "[*3*]", "[*4*]"],
// 치환 문자열이 포함되어 있는지 확인
hasPlaceholders(smsTxt) {
// smsTxt에서 placeholders 중 하나라도 포함되면 true 반환
return this.placeholders.some(ph => smsTxt.includes(ph));
},
// 문자 내용을 치환하는 함수
replacePlaceholders(text, data) {
// 치환 문자열 키와 값을 매핑하여 처리
return this.placeholders.reduce((result, ph, index) => {
// 치환 키 설정 (예: [*1*], [*2*])
const key = index === 0 ? "name" : `rep${index}`;
// 데이터 값이 없으면 치환 문자열 그대로 유지
const value = data[key] !== undefined && data[key] !== null ? data[key] : ph;
// console.log(`Replacing ${ph} with ${value}:`); // 디버깅 로그
// 현재 치환 문자열만 교체
// return result.replace(new RegExp(`\\${ph}(?!\\[)`, "g"), value);
return stringReplaceAll(result, ph, value)
}, text);
}
,
// 문자 길이를 계산하고 메시지 유형(단문/장문) 카운트
processMessageLength(smsTxt, msgCount) {
// 문자 길이(byte) 계산
const msgLen = conByteLeng(smsTxt);
//console.log('msgLen : ', msgLen);
//console.log('smsTxt : ', smsTxt);
// 2000byte 초과시 오류 발생
if (msgLen > 2000) {
alert("문자 내용은 2000byte를 넘을 수 없습니다.");
throw new Error("문자 내용 초과");
}
// 길이에 따라 장문/단문 카운트 증가
if (msgLen > 90) {
msgCount.long++;
} else {
msgCount.short++;
}
return msgCount; // 업데이트된 카운트 반환
},
// 문자 내용 처리 함수
processSmsText(smsTxtArea, rowData) {
const msgCount = { short: 0, long: 0 }; // 단문/장문 초기화
// 수신자 데이터가 없는 경우 원본 문자 유지
if (!rowData || rowData.length === 0) {
$('.realtime').text(smsTxtArea);
return msgCount;
}
// 받는사람 데이터 순회
rowData.forEach((row, index) => {
// 문자 내용을 개별 데이터로 치환
let smsTxt = this.replacePlaceholders(smsTxtArea, row.getData());
// 문자 길이를 계산하고 카운트를 업데이트
this.processMessageLength(smsTxt, msgCount);
// 첫 번째 수신자의 변환 결과를 미리보기로 설정
if (index === 0) {
// console.log('smsTxt : ',smsTxt);
$('.realtime').text(smsTxt); // 화면에 표시
}
});
return msgCount; // 최종 카운트 반환
}
};
//특정문구 일괄변환 문자길이 체크 하기
function fnReplCellExcel(){
console.log('fnReplCellExcel');
var smsTxtArea = $('#smsTxtArea').val();
var imgCnt = $("#imgCnt").val(); // 현재 페이지에 첨부된 이미지 갯수
var orgSmsTxt = smsTxtArea; // 광고문자 뺀 문자내용
var adTxt = $('.ad_txt').text();
var denyTxt = $('.deny_txt').text();
var adverTxt = "";
//이벤트 잔여 캐시 자동 처리 관련 변수
var evnRemainCash = parseFloat($("#eventRemainCash").val()); //이벤트 잔여 캐시 금액
var evnEachPrice = parseFloat($("#eachPrice").val());
var evnShortPrice = parseFloat($("#sPrice").val());
var evnLongPrice = parseFloat($("#mPrice").val());
var evnPhoneNumCnt = 0;
var evnShortMsgCnt = 0;
var evnLongMsgCnt = 0;
var evnMsgCntSts = true;
if(adTxt.length > 0 && denyTxt.length > 0){
adverTxt = adTxt + "\n" + smsTxtArea + "\n" + denyTxt;
smsTxtArea = adverTxt;
}
if(smsTxtArea.indexOf("[*이름*]") > -1
|| smsTxtArea.indexOf("[*1*]") > -1
|| smsTxtArea.indexOf("[*2*]") > -1
|| smsTxtArea.indexOf("[*3*]") > -1
|| smsTxtArea.indexOf("[*4*]") > -1){
var rowData = tableR.getRows();
var recTableData = tableR.getRows(); // 받는사람 리스트의 전체 목록을 저장
//var tableData = [];
var msg_short = 0;
var msg_long = 0;
var nmStatus = false;
var rep1Status = false;
var rep2Status = false;
var rep3Status = false;
var rep4Status = false;
if(smsTxtArea.indexOf("[*이름*]") > -1){
nmStatus = true;
}
if(smsTxtArea.indexOf("[*1*]") > -1){
rep1Status = true;
}
if(smsTxtArea.indexOf("[*2*]") > -1){
rep2Status = true;
}
if(smsTxtArea.indexOf("[*3*]") > -1){
rep3Status = true;
}
if(smsTxtArea.indexOf("[*4*]") > -1){
rep4Status = true;
}
//일괄변환문자 포함 여부 변경 - 문자내용에 치환변환 문자는 있지만 받는사람 데이터에 치환 데이터를 안넣는 경우 오류가 발생하여 상태값 입력 위치 상단으로 변경함.
//치환데이터가 없는 경우 Alert 띄우고 빠져나가기 때문에 치환문자 상태 체크값이 누락되어서 변경함 - 20230407 우영두
$('#txtReplYn').val("Y");
//기존 받는사람 리스트를 배열에 미리 담아둔다.
if(recTableData.length > 0){
for(var j=0; j < recTableData.length; j++){
var smsTxt = smsTxtArea;
if(typeof recTableData[j].getData().name != 'undefined'
&& recTableData[j].getData().name != null
&& recTableData[j].getData().name != "")
{
var name = recTableData[j].getData().name;
smsTxt = stringReplaceAll(smsTxt, "[*이름*]", name);
orgSmsTxt = stringReplaceAll(orgSmsTxt, "[*이름*]", name);//광고, 선거 문자인 경우 상하단 문구 제거한 문자내용만 보여주도록 함. 치환문자 있으면 변환해서 보여줌
}/*else{
if(nmStatus){
alert("[*이름*] 치환 문자에 데이터가 없습니다. 받는사람 목록의 치환 데이터를 확인해 주세요.");
return false;
}
}*/
if(typeof recTableData[j].getData().rep1 != 'undefined' && recTableData[j].getData().rep1 != null){
var rep1 = recTableData[j].getData().rep1;
smsTxt = stringReplaceAll(smsTxt, "[*1*]", rep1);
orgSmsTxt = stringReplaceAll(orgSmsTxt, "[*1*]", rep1);
}/*else{
if(rep1Status){
alert("[*1*] 치환 문자에 데이터가 없습니다. 받는사람 목록의 치환 데이터를 확인해 주세요.");
return false;
}
}*/
if(typeof recTableData[j].getData().rep2 != 'undefined' && recTableData[j].getData().rep2 != null){
var rep2 = recTableData[j].getData().rep2;
smsTxt = stringReplaceAll(smsTxt, "[*2*]", rep2);
orgSmsTxt = stringReplaceAll(orgSmsTxt, "[*2*]", rep2);
}/*else{
if(rep2Status){
alert("[*2*] 치환 문자에 데이터가 없습니다. 받는사람 목록의 치환 데이터를 확인해 주세요.");
return false;
}
}*/
if(typeof recTableData[j].getData().rep3 != 'undefined' && recTableData[j].getData().rep3 != null){
var rep3 = recTableData[j].getData().rep3;
smsTxt = stringReplaceAll(smsTxt, "[*3*]", rep3);
orgSmsTxt = stringReplaceAll(orgSmsTxt, "[*3*]", rep3);
}/*else{
if(rep3Status){
alert("[*3*] 치환 문자에 데이터가 없습니다. 받는사람 목록의 치환 데이터를 확인해 주세요.");
return false;
}
}*/
if(typeof recTableData[j].getData().rep4 != 'undefined' && recTableData[j].getData().rep4 != null){
var rep4 = recTableData[j].getData().rep4;
smsTxt = stringReplaceAll(smsTxt, "[*4*]", rep4);
orgSmsTxt = stringReplaceAll(orgSmsTxt, "[*4*]", rep4);
}/*else{
if(rep4Status){
alert("[*4*] 치환 문자에 데이터가 없습니다. 받는사람 목록의 치환 데이터를 확인해 주세요.");
return false;
}
}*/
var msgLen = conByteLeng(smsTxt);
if(msgLen < 1){
}else if(msgLen > 2000){
alert("문자 내용은 2000byte를 넘을 수 없습니다.");
return false;
}else{
if(msgLen > 90){
msg_long++;
console.log(evnRemainCash + " === " + evnLongPrice);
if(evnRemainCash >= evnLongPrice && evnMsgCntSts == true){//이벤트 금액으로 보낼수 있으면 카운팅
evnRemainCash = evnRemainCash - evnLongPrice;
evnPhoneNumCnt++;
evnLongMsgCnt++;
$("#evnPhoneNumCnt").val(evnPhoneNumCnt);
$("#evnLongMsgCnt").val(evnLongMsgCnt);
}else{//이벤트 금액으로 보낼수 없으면 카운팅 중지
evnMsgCntSts = false;
}
}else{
msg_short++;
if(evnRemainCash >= evnShortPrice && evnMsgCntSts == true){//이벤트 금액으로 발송할 수 있으면 카운팅
evnRemainCash = evnRemainCash - evnShortPrice;
evnPhoneNumCnt++;
evnShortMsgCnt++;
$("#evnPhoneNumCnt").val(evnPhoneNumCnt);
$("#evnShortMsgCnt").val(evnShortMsgCnt);
}else{//이벤트 금액으로 보낼수 없으면 카운티 중지
evnMsgCntSts = false;
}
}
}
replTotalPriceSum(msg_short, msg_long, totRows);
//첫번째 수신자의 변환 텍스트 내용을 적용하여 미리보기 문자내용에 보여주자.
if(j == 0){
//미리보기에 내용 입력해 주기
if(adverTxt.length > 0){
$('.realtime').text(orgSmsTxt);
}else{
$('.realtime').text(smsTxt);
}
}
//일괄변환문자 포함 여부 변경
//$('#txtReplYn').val("Y")
}
//변환후 문자 중에 장문이 1개 이상 있는 경우 문자 제목을 입력해 주기
/*var txtReplYn = $('#txtReplYn').val();
if(txtReplYn == 'Y' && (msg_long > 0 || imgCnt > 0 )){
//장문, 그림 문자가 포함되어 있는 경우 제목을 입력하도록 처리
$('#mmsSubject').attr("disabled", false);
}else if(txtReplYn == 'Y' && msg_long < 1){
//일괄변환에 단문문자만 있는경우 제목 입력 안되도록 처리
$('#mmsSubject').val("");
$('#mmsSubject').attr("disabled", true);
}*/
}
}
}
//치환문자 replaceAll 기능 처리하는 함수
function stringReplaceAll(str, a, b){
return str.split(a).join(b);
}