mjon_git/src/main/webapp/js/kakao/at/alimtalkExcel.js
2025-04-16 09:52:47 +09:00

702 lines
19 KiB
JavaScript

/**
*
* @author : 이호영
* @fileName : alimtalkExcel.js
* @date : 2023.02.21
* @description : 알림톡 excel 관련된 fuction .js
* ===========================================================
* DATE AUTHOR NOTE
* ----------------------------------------------------------- *
* 2023.02.21 이호영 최초 생성
*
*
*
*/
$(document).ready(function(){
//치환문자 없는 엑섹불러오기 버튼 클릭시 파일 첨부 실행
$('.c1').click(function(){ // 엑셀파일 불러오기 선택 시
$("#excelFile01").click();
});
});
function excelAdd(){
var files = document.getElementById('excelFile01').files;
var filename = files[0].name;
var extension = filename.substring(filename.lastIndexOf(".")).toUpperCase();
if (extension == '.XLS' || extension == '.XLSX') {
excelFileToJSON01(files[0]);
}else{
alert("엑셀 파일을 첨부해주세요.");
}
}
/*
* 신규 엑셀 파일 불러오기
* 기존 json 처리가 아닌 POI 방식으로 처리하기 위함
*
* */
function excelExportAjax(){
var data = new FormData(document.excelToolTipForm);
var fileValue = $("#excelFile01").val().split("\\");
var fileName = fileValue[fileValue.length-1];
var fileExt = fileName.split('.').pop().toLowerCase();
if(fileExt.length > 0){
if($.inArray(fileExt, ['xls','xlsx']) == -1) {
alert('xls, xlsx 파일만 업로드 할수 있습니다.');
return false;
}
}
fn_viewDataInit02();
$('#excelNm01').val(fileName);
}
function excelAddAjax(){
var data = new FormData(document.excelToolTipForm);
data.append("file0", $('#excelFile01').prop('files')[0]);
var url = "/web/mjon/alimtalk/sendAlimtalkExelFilePhoneNumAjax.do";
$.ajax({
type: "POST",
enctype: 'multipart/form-data',
url: url,
data: data,
dataType:'json',
async: true,
processData: false,
contentType: false,
cache: false,
//timeout: 600000,
success: function (returnData, status) {
if(status == 'success'){ // status 확인 필요한가. 석세스 안뜨면 에러 가지 않나
if(returnData.success){
var data = returnData.data;
var message = returnData.message;
if(message != '' ){
alert(returnData.message);
}
if(data != null){
//수신목록 Html 태그
var addHtml = '<div class="list_table list_body excelBody">'
+'\t<div class="cb_wrap">'
+'\t\t<label for="" class="label"></label>'
+'\t\t<input type="checkbox" class="wrap01C">'
+'\t</div>'
+'\t<div class="list_table_num phoneArea">'
+'\t\t<p>$PHONE$</p>'
+'\t</div>'
/*23.04.06 이름제거 요청으로인한 화면 이름 제거*/
/*+'\t<div class="list_table_name">'
+'\t\t<p>$NAME$</p>'
+'\t</div>'*/
+'</div>';
var totalDuplCnt = $('#rowDupCnt').text();//중복 건수 정보
var $excelBody = $('#wrap01_body');
var phoneNum;
$.each(data, function(i, item){
if(checkHpNum(item.phone)){
phoneNum = removeDash(item.phone);
if(!phoneDupl(phoneNum))
/*23.04.06 이름제거 요청으로인한 화면 이름 제거*/
// $excelBody.append(addHtml.replace('$PHONE$', phoneNum).replace('$NAME$', jsonData[bodyIndex]['이름'] ??= ''));
$excelBody.append(addHtml.replace('$PHONE$', phoneNum));
else
totalDuplCnt++;
} else{
alert("엑셀 파일 데이터의 형식이 맞지 않는 부분이 있습니다.");
excelAddr = []; //엑셀 데이터 저장 변수 초기화
$("#excelFile").val(""); //첨부파일 input 초기화
$("#excelNm").val(""); // 첨부파일 명 초기화
fileName = "";
return;
}
});
$('#rowDupCnt').text(totalDuplCnt);
$("#excelFile01").val(""); //첨부파일 input 초기화
$("#excelNm01").val(""); // 첨부파일 명 초기화
updateTotCnt();
}
}else{
alert(returnData.message);
// alert("첨부파일 불러오는 중 오류가 발생하였습니다.");
excelAddr = []; //엑셀 데이터 저장 변수 초기화
$("#excelFile01").val(""); //첨부파일 input 초기화
$("#excelNm01").val(""); // 첨부파일 명 초기화
fileName = "";
return;
}
} else if(status== 'fail'){
alert("첨부파일 불러오는 중 오류가 발생하였습니다.1");
console.log("status : fail ~");
}
},
error: function (e) {
alert("첨부파일 불러오는 중 오류가 발생하였습니다2.");
console.log("ERROR : ", e);
},
beforeSend : function(xmlHttpRequest) {
//로딩창 show
$('.loading_layer').addClass('active');
},
complete : function(xhr, textStatus) {
//로딩창 hide
$('.loading_layer').removeClass('active');
}
});
}
/*
* 신규 변수명 설정 엑셀 파일 불러오기
* 기존 json 처리가 아닌 POI 방식으로 처리하기 위함
*
* */
function excelExportVarAjax(){
console.log(' :: excelExportVarAjax ::')
var data = document.getElementById('excelFile').files;
var fileValue = $("#excelFile").val().split("\\");
var fileName = fileValue[fileValue.length-1];
var fileExt = fileName.split('.').pop().toLowerCase();
if(fileExt.length > 0){
if($.inArray(fileExt, ['xls','xlsx']) == -1) {
alert('xls, xlsx 파일만 업로드 할수 있습니다.');
return false;
}
}
fn_viewDataInit01();
excelAddVarAjax();
}
function excelAddVarAjax(){
var varList = $("#excelTemplateContent").val().match(/#\{([^}]+)\}/g);
var varListSize = new Set(varList);
var form = document.excelVarFileForm;
form.excelVarCnt.value = varListSize.size;
form.excelVarList.value = varList;
var data = new FormData(form);
data.append("file0", $('#excelFile').prop('files')[0]);
var url = "/web/mjon/alimtalk/sendAlimtalkExelVarFilePhoneNumAjax.do";
$.ajax({
type: "POST",
enctype: 'multipart/form-data',
url: url,
data: data,
dataType:'json',
async: true,
processData: false,
contentType: false,
cache: false,
//timeout: 600000,
success: function (returnData, status) {
if(status == 'success'){ // status 확인 필요한가. 석세스 안뜨면 에러 가지 않나
console.log('returnData : ', returnData);
if(returnData.success){
var data = returnData.data;
var message = returnData.message;
if(message != '' ){
alert(returnData.message);
}
if(data != null){
//수신목록 Html 태그
// 엑셀 헤더
var excelTitleHeadText ='<div class="list_table_name">'
+'\t<p>$HEADTITLE$</p>'
+'</div>';
// 바디 row 수신자 tag
var excelBodyRowTextIndex00 ='<div class="list_table_name phoneArea">'
+'\t\t<p>$ROWTEXT$</p>'
+'\t</div>';
// 바디 row tag
var excelBodyRowTextIndex01 ='<div class="list_table_name transData">'
+'\t\t<p>$ROWTEXT$</p>'
+'\t</div>';
//맨 앞에 수신번호 배열 추가
varList.unshift('수신번호');
//변수 문자열 중복 제거
var newList = Array.from(new Set(varList));
//엑셀헤더 selector
var $excelHead = $('#excelHead');
//엑셀바디 selector
var $excelBody = $('#excelBody02');
// 엑셀 헤더 부분
$.each(newList, function(headerIndex, value) {
$excelHead.append(excelTitleHeadText.replace('$HEADTITLE$', value));
});
var totalDuplCnt = $('#rowDupCnt').text();//중복 건수 정보
var $excelBody = $('#excelBody02');
var addDiv = "";
var phoneNum;
var msgCnt = 0;
//입력데이터를 역정렬해준다.
data.reverse();
//변수명 추출해주기
var varListArr = [];
varListArr = form.excelVarList.value.split(",");
var forBreakB = true
$.each(data, function(i, item){
if(checkHpNum(item.phone)){
phoneNum = removeDash(item.phone);
if(!phoneDupl(phoneNum)){
var varVal = item.varVal;
var lengthCheck =true;
/*23.04.06 이름제거 요청으로인한 화면 이름 제거*/
var excelBody = '<div class="list_table list_body excelBody">';
//수신번호 화면 태그 생성
excelBody += excelBodyRowTextIndex00.replace('$ROWTEXT$', removeDash(phoneNum));
//변수 데이터 태그 생성
var varValArr = []
varValArr = varVal.split("§");
for(var i=0; i < varValArr.length; i++){
var bodyData = varValArr[i];
// 기타변수는 50자리 까지 입력
if(bodyData.length > 100 || bodyData.length == 0 ){
if(forBreakB){
alert("등록 변수[ "+varListArr[i]+" ] \n기타변수의 입력 값이 없거나 100자리를 초과하는 내용이 포함되어 해당 내용 제외되었습니다.");
forBreakB = false;
}
lengthCheck = false;
break;
}
excelBody += excelBodyRowTextIndex01.replace('$ROWTEXT$', bodyData);
}
excelBody += '</div>';
if(lengthCheck){
addDiv += excelBody;
msgCnt++;
}
}
else
totalDuplCnt++;
} else{
alert("엑셀 파일 데이터의 형식이 맞지 않는 부분이 있습니다.");
excelAddr = []; //엑셀 데이터 저장 변수 초기화
$("#excelFile").val(""); //첨부파일 input 초기화
$("#excelNm").val(""); // 첨부파일 명 초기화
fileName = "";
return;
}
});
//화면에 수신번호 및 변수 데이터 추가해 주기
$excelBody.append(addDiv);
// 총 금액 계산
fn_priceClclt(msgCnt);
}
}else{
alert(returnData.message);
// alert("첨부파일 불러오는 중 오류가 발생하였습니다.");
excelAddr = []; //엑셀 데이터 저장 변수 초기화
$("#excelFile01").val(""); //첨부파일 input 초기화
$("#excelNm01").val(""); // 첨부파일 명 초기화
fileName = "";
return;
}
} else if(status== 'fail'){
alert("첨부파일 불러오는 중 오류가 발생하였습니다.");
console.log("status : fail ~");
}
},
error: function (e) {
alert("첨부파일 불러오는 중 오류가 발생하였습니다.");
console.log("ERROR : ", e);
},
beforeSend : function(xmlHttpRequest) {
//로딩창 show
$('.loading_layer').addClass('active');
},
complete : function(xhr, textStatus) {
//로딩창 hide
$('.loading_layer').removeClass('active');
}
});
}
/**
* 엑셀 파일 불러오기
*/
function excelExport01() {
var files = document.getElementById('excelFile01').files;
if(files.length==0){
alert("파일을 선택해주세요.");
return;
}
// (치환문자가 있는)다른 형식의 값이 있으면 초기화
fn_viewDataInit02();
var filename = files[0].name;
$('#excelNm01').val(filename);
// var extension = filename.substring(filename.lastIndexOf(".")).toUpperCase();
// if (extension == '.XLS' || extension == '.XLSX') {
// excelFileToJSON01(files[0]);
// }else{
// alert("엑셀 파일을 첨부해주세요.");
// }
}
/**
* 변수 포함한 엑셀 파일 불러오기
*/
function excelExport02() {
var files = document.getElementById('excelFile').files;
if(files.length==0){
alert("파일을 선택해주세요.");
return;
}
// (치환문자가 없는)다른 형식의 값이 있으면 초기화
fn_viewDataInit01();
// fn_viewDataInit02();
var filename = files[0].name;
var extension = filename.substring(filename.lastIndexOf(".")).toUpperCase();
if (extension == '.XLS' || extension == '.XLSX') {
excelFileToJSON02(files[0]);
}else{
alert("엑셀 파일을 첨부해주세요.");
}
}
/**
* 엑셀 정보 json으로 변환
*/
function excelFileToJSON01(file){
/*
* 시트 row 삭제 function 시작
*
* */
const ec = (r, c) => {
return XLSX.utils.encode_cell({r:r,c:c})
}
const delete_row = (ws, row_index) => {
let range = XLSX.utils.decode_range(ws["!ref"])
for(var R = row_index; R < range.e.r; ++R){
for(var C = range.s.c; C <= range.e.c; ++C){
ws[ec(R, C)] = ws[ec(R+1, C)]
}
}
range.e.r--
ws['!ref'] = XLSX.utils.encode_range(range.s, range.e)
}
/*
* 시트 row 삭제 function 끝
*
* */
try {
var reader = new FileReader();
reader.readAsBinaryString(file);
reader.onload = function(e) {
var data = e.target.result;
var workbook = XLSX.read(data, {
type : 'binary'
});
var result = {};
//첫번째 시트 정보 json으로 변환
var firstSheetName = workbook.SheetNames[0];
//첫번째 시트의 첫번째 로우 삭제
delete_row(workbook.Sheets[firstSheetName], 0);
var jsonData = XLSX.utils.sheet_to_json(workbook.Sheets[firstSheetName]);
displayJsonToHtmlTable01(jsonData);
}
}catch(e){
console.error(e);
}
}
/**
* 엑셀 정보 json으로 변환
*/
function excelFileToJSON02(file){
try {
var reader = new FileReader();
reader.readAsBinaryString(file);
reader.onload = function(e) {
var data = e.target.result;
var workbook = XLSX.read(data, {
type : 'binary'
});
var result = {};
//첫번째 시트 정보 json으로 변환
var firstSheetName = workbook.SheetNames[0];
var jsonData = XLSX.utils.sheet_to_json(workbook.Sheets[firstSheetName]);
displayJsonToHtmlTable02(jsonData);
}
}catch(e){
console.error(e);
}
}
/**
* 변수 없는 엑셀 json 정보를 테이블로 그려주기
*/
function displayJsonToHtmlTable01(jsonData){
var addHtml = '<div class="list_table list_body excelBody">'
+'\t<div class="cb_wrap">'
+'\t\t<label for="" class="label"></label>'
+'\t\t<input type="checkbox" class="wrap01C">'
+'\t</div>'
+'\t<div class="list_table_num phoneArea">'
+'\t\t<p>$PHONE$</p>'
+'\t</div>'
/*23.04.06 이름제거 요청으로인한 화면 이름 제거*/
/*+'\t<div class="list_table_name">'
+'\t\t<p>$NAME$</p>'
+'\t</div>'*/
+'</div>';
// 중복 텍스트
var totalDuplCnt = $('#rowDupCnt').text();
var keys = Object.keys(jsonData); // json에 key만 추출
var $excelBody = $('#wrap01_body');
// jsonData.reverse();
var phoneNum;
$.each(jsonData, function(bodyIndex, value) {
phoneNum = removeDash(jsonData[bodyIndex]['수신번호'])
if(!phoneDupl(phoneNum))
/*23.04.06 이름제거 요청으로인한 화면 이름 제거*/
// $excelBody.append(addHtml.replace('$PHONE$', phoneNum).replace('$NAME$', jsonData[bodyIndex]['이름'] ??= ''));
$excelBody.append(addHtml.replace('$PHONE$', phoneNum));
else
totalDuplCnt++;
});
$('#rowDupCnt').text(totalDuplCnt);
updateTotCnt();
}
/**
* 변수 있는 엑셀 json 정보를 테이블로 그려주기
*/
function displayJsonToHtmlTable02(jsonData){
// 엑셀 헤더
var excelTitleHeadText ='<div class="list_table_name">'
+'\t<p>$HEADTITLE$</p>'
+'</div>';
// 바디 row 수신자 tag
var excelBodyRowTextIndex00 ='<div class="list_table_name phoneArea">'
+'\t\t<p>$ROWTEXT$</p>'
+'\t</div>';
// 바디 row tag
var excelBodyRowTextIndex01 ='<div class="list_table_name transData">'
+'\t\t<p>$ROWTEXT$</p>'
+'\t</div>';
//합친 내용에서 변수 문자열 뽑기 - #과{}포함
var varList = $("#excelTemplateContent").val().match(/#\{([^}]+)\}/g);
//맨 앞에 수신번호 배열 추가
varList.unshift('수신번호');
//변수 문자열 중복 제거
var newList = Array.from(new Set(varList));
//엑셀헤더 selector
var $excelHead = $('#excelHead');
//엑셀바디 selector
var $excelBody = $('#excelBody02');
// 엑셀 헤더 부분
$.each(newList, function(headerIndex, value) {
$excelHead.append(excelTitleHeadText.replace('$HEADTITLE$', value));
});
// 중복 텍스트
var totalDuplCnt = $('#rowDupCnt').text();
//엑셀바디 내용 리버스
jsonData.reverse();
// 치환 데이터 선언
var bodyData;
// 추가 div 선언
var addDiv = "";
// 입력 글자수 체크 선언
var lengthCheck =true;
outerLoop : for(var bodyIndex=0; bodyIndex < jsonData.length; bodyIndex++)
{
if(lengthCheck){
var excelBody = '<div class="list_table list_body excelBody">';
for(var headerIndex=0; headerIndex < newList.length; headerIndex++)
{
// 치환할 데이터
bodyData = jsonData[bodyIndex][newList[headerIndex]];
if(bodyData == null){
// reverse 감안하여 전체 개수 - 하여 몇행인지 알려줌
// alert((jsonData.length - bodyIndex+1)+'번째 데이터에 오류가 있습니다. 확인해주세요.');
continue outerLoop; // outerLoop 다음 loop 실행
}
//headerIndex == 0 : 전화번호
if(headerIndex == 0)
{
// 핸드폰 번호 11자리 체크
if(bodyData.length > 11){
alert("등록 핸드폰 번호["+bodyData+"] \n핸드폰 번호는 11자리 까지 입력이 가능합니다.");
lengthCheck = false;
break;
}
// 전화번호 중복 체크
if(!phoneDupl(bodyData)) excelBody += excelBodyRowTextIndex00.replace('$ROWTEXT$', removeDash(bodyData));
else
{
totalDuplCnt++;
continue outerLoop; // outerLoop 다음 loop 실행
}
}
else
{
// 기타변수는 50자리 까지 입력
if(bodyData.length > 100){
alert("등록 변수["+bodyData+"] \n기타 변수에는 100자리 까지 입력이 가능합니다.");
lengthCheck = false;
break;
}
excelBody += excelBodyRowTextIndex01.replace('$ROWTEXT$', bodyData);
}
}
excelBody += '</div>';
addDiv += excelBody;
}else{
addDiv = "";
break;
}
}
$excelBody.append(addDiv);
}
/**
* 중복체크
* true : 중복 [O]
* false : 중복 [X]
*/
function phoneDupl(data){
var resultBoo = true;
data = removeDash(data);
/*
* 중복체크
* 기존 데이터 배열화
*/
var area = [];
$('.phoneArea').each(function(index, item){
area.push($(item).text().trim());
});
if(!area.includes(data))
resultBoo = false;
return resultBoo;
}