문자전송 > 엑셀 불러오기 || 주소록 > 엑셀 불러오기 -> 오류수정 번호 빈값 안나오게 처리
@4f5a47756190cd6ac5c7e9f2226239c08aca6200
--- src/main/webapp/WEB-INF/jsp/web/addr/AddrList.jsp
+++ src/main/webapp/WEB-INF/jsp/web/addr/AddrList.jsp
... | ... | @@ -1,869 +1,868 @@ |
| 1 |
-<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> |
|
| 2 |
-<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> |
|
| 3 |
-<%@ taglib prefix="ui" uri="http://egovframework.gov/ctl/ui"%> |
|
| 4 |
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> |
|
| 5 |
-<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> |
|
| 6 |
- |
|
| 7 |
-<script type="text/javascript"> |
|
| 8 |
- var currentTime = new Date().getTime(); // 현재 시간을 밀리초로 가져옵니다. |
|
| 9 |
-</script> |
|
| 10 |
- |
|
| 11 |
-<script type="text/javascript" src="<c:url value='/publish/js/content.js'/>"></script> |
|
| 12 |
-<script type="text/javascript" src="https://oss.sheetjs.com/sheetjs/xlsx.full.min.js"></script> |
|
| 13 |
-<script type="text/javascript" src="<c:url value='/js/web/addr/init.js'/>?v="+currentTime></script> |
|
| 14 |
-<script type="text/javascript" src="<c:url value='/js/web/addr/event.js'/>?v="+currentTime></script> |
|
| 15 |
-<script type="text/javascript" src="<c:url value='/js/web/addr/utils.js'/>?v="+currentTime></script> |
|
| 16 |
-<script type="text/javascript" src="<c:url value='/js/web/addr/cmn.js?date=202409021440'/>"></script> |
|
| 17 |
- |
|
| 18 |
- |
|
| 19 |
-<script type="text/javascript"> |
|
| 20 |
- |
|
| 21 |
-$(document).ready(function(){
|
|
| 22 |
- listAddrGrp(); |
|
| 23 |
- addrLoadAjax(); |
|
| 24 |
- |
|
| 25 |
- // 엑셀 중복번호 버튼 |
|
| 26 |
- $("#tableExcelDupliBtn").hide();
|
|
| 27 |
-// $("#btnAddrMassSaveDupli").hide();
|
|
| 28 |
- // 주소록 대량등록 |
|
| 29 |
-// addrMassTab(1); |
|
| 30 |
- |
|
| 31 |
- // 중복 휴대폰번호 버튼 노출여부 |
|
| 32 |
- |
|
| 33 |
- |
|
| 34 |
- // excel 오류정보 테스트 |
|
| 35 |
- $('#errorExcelBtn').click(function(){
|
|
| 36 |
- if($tableError.getDataCount()<1){
|
|
| 37 |
- alert('오류 정보가 없습니다.');
|
|
| 38 |
- return false; |
|
| 39 |
- } |
|
| 40 |
- $tableError.download("xlsx", "error_data.xlsx");
|
|
| 41 |
- }); |
|
| 42 |
-}); |
|
| 43 |
- |
|
| 44 |
-// 메인 화면 좌측메뉴 최신화 |
|
| 45 |
-function listAddrGrp(){
|
|
| 46 |
- var sendData = $(document.searchAddrGrpForm).serializeArray() ; |
|
| 47 |
- $("#adr1_left").load("/web/addr/selectAddrGroupListAjax.do", sendData ,function(response, status, xhr){});
|
|
| 48 |
-} |
|
| 49 |
- |
|
| 50 |
- |
|
| 51 |
-function addrGroupLoadAjax(){
|
|
| 52 |
- $("#addrRegistSelect").load("/web/addr/selectAddrGroupAjax.do", function(response, status, xhr){});
|
|
| 53 |
- $("#funcAddrGroupSelect").load("/web/addr/selectAddrGroupAjax.do", function(response, status, xhr){});
|
|
| 54 |
-} |
|
| 55 |
- |
|
| 56 |
-function addrLoadAjax(){
|
|
| 57 |
- $("#adr1_right").load("/web/mjon/addr/selectAddrAjax.do", function(response, status, xhr){tableAllChk();});
|
|
| 58 |
- addrGroupLoadAjax(); |
|
| 59 |
-} |
|
| 60 |
- |
|
| 61 |
-function insertAddrGroupAjax() {
|
|
| 62 |
- var form = document.addrGrpInsertForm; |
|
| 63 |
- if(form.addrGrpNm.value == "") {
|
|
| 64 |
- alert("주소록 그룹명을 입력해주세요.");
|
|
| 65 |
- return; |
|
| 66 |
- } |
|
| 67 |
- if(!confirm("주소록 그룹을 추가하시겠습니까?")) {
|
|
| 68 |
- return; |
|
| 69 |
- } |
|
| 70 |
- var data = new FormData(form); |
|
| 71 |
- |
|
| 72 |
- $.ajax({
|
|
| 73 |
- cache : false, |
|
| 74 |
- url : "<c:url value='/web/addr/insertAddrGroupAjax.do' />", |
|
| 75 |
- type : 'POST', |
|
| 76 |
- data : data, |
|
| 77 |
- dataType:'json', |
|
| 78 |
- processData: false, |
|
| 79 |
- contentType: false, |
|
| 80 |
- success : function(returnData, status){
|
|
| 81 |
- if(status == "success") {
|
|
| 82 |
- if("fail"==returnData.result){
|
|
| 83 |
- alert(returnData.message); |
|
| 84 |
- return; |
|
| 85 |
- } else if("dupl"==returnData.result) {
|
|
| 86 |
- alert("중복된 그룹명입니다.");
|
|
| 87 |
- return; |
|
| 88 |
- } |
|
| 89 |
- alert("등록되었습니다.");
|
|
| 90 |
- listAddrGrp(); |
|
| 91 |
- addrGroupLoadAjax(); |
|
| 92 |
- |
|
| 93 |
- }else{ alert("ERROR!");return;}
|
|
| 94 |
- }, |
|
| 95 |
- error: function (e) { alert("저장에 실패하였습니다."); console.log("ERROR : ", e); }
|
|
| 96 |
- }); |
|
| 97 |
- |
|
| 98 |
-} |
|
| 99 |
- |
|
| 100 |
- |
|
| 101 |
-// 주소록그룹 콤보박스 유지 |
|
| 102 |
-function setSelectSetting(selectVal) {
|
|
| 103 |
- $("#addrRegistSelect").val(selectVal).prop("selected", true);
|
|
| 104 |
-} |
|
| 105 |
- |
|
| 106 |
-function linkPage(pageNo){
|
|
| 107 |
- if ($('#searchKeywordAddr').val() != "" && $('#searchKeywordAddr').val() != null && $('#searchKeywordAddr').val() != undefined) {
|
|
| 108 |
- // 문자전송 검색용 |
|
| 109 |
- $("#msgStartKeyword").val("");
|
|
| 110 |
- } |
|
| 111 |
- |
|
| 112 |
- var searchForm = document.searchAddrForm; |
|
| 113 |
- searchForm.pageIndex.value = pageNo; |
|
| 114 |
- searchForm.pageUnit.value = $('#pageUnit').val();
|
|
| 115 |
- searchForm.searchCondition.value = $('#searchConditionAddr').val();
|
|
| 116 |
- searchForm.searchKeyword.value = $('#searchKeywordAddr').val();
|
|
| 117 |
- searchForm.startKeyword.value = $("#msgStartKeyword").val();
|
|
| 118 |
- |
|
| 119 |
- var sendData = $(document.searchAddrForm).serializeArray(); |
|
| 120 |
- $("#adr1_right").load("/web/mjon/addr/selectAddrAjax.do", sendData, function(response, status, xhr){tableAllChk();});
|
|
| 121 |
- addrGroupLoadAjax(); |
|
| 122 |
-} |
|
| 123 |
- |
|
| 124 |
-function moveTab(type){
|
|
| 125 |
- if(type == "addr") location.href="/web/mjon/addr/selectAddrList.do"; |
|
| 126 |
- if(type == "fax") location.href="/web/mjon/fax/addr/selectFaxAddrList.do"; |
|
| 127 |
- if(type == "block") location.href="/web/mjon/addrBlock/selectBlockList.do"; |
|
| 128 |
- if(type == "addrMob") location.href="/web/mjon/addr/addrMobGuide.do"; |
|
| 129 |
- if(type == "addrApply") location.href="/web/mjon/addragency/selectAddrAgencyList.do"; |
|
| 130 |
-} |
|
| 131 |
- |
|
| 132 |
- |
|
| 133 |
- |
|
| 134 |
-//############################################################################################# |
|
| 135 |
-//Tabulator |
|
| 136 |
-//############################################################################################# |
|
| 137 |
- |
|
| 138 |
-$(document).ready(function(){
|
|
| 139 |
- |
|
| 140 |
- |
|
| 141 |
- |
|
| 142 |
- |
|
| 143 |
- // 오류검사 항목 중복제거 |
|
| 144 |
- function SetTableErrorDupliCheck(sVal) {
|
|
| 145 |
- var isDuplicate = false; |
|
| 146 |
- if (tableErrorCheckData.length == 0) {
|
|
| 147 |
- tableErrorCheckData.push(sVal); |
|
| 148 |
- } |
|
| 149 |
- else {
|
|
| 150 |
- for (var i = 0; i < tableErrorCheckData.length; i++) |
|
| 151 |
- {
|
|
| 152 |
- if (tableErrorCheckData[i] == sVal) {
|
|
| 153 |
- isDuplicate = true; |
|
| 154 |
- } |
|
| 155 |
- } |
|
| 156 |
- |
|
| 157 |
- if (isDuplicate) {
|
|
| 158 |
- return; |
|
| 159 |
- } |
|
| 160 |
- else {
|
|
| 161 |
- tableErrorCheckData.push(sVal); |
|
| 162 |
- } |
|
| 163 |
- } |
|
| 164 |
- } |
|
| 165 |
- |
|
| 166 |
- |
|
| 167 |
- // 오류검사 항목 중복제거 |
|
| 168 |
- function SetTableErrorDupliCheck(sVal) {
|
|
| 169 |
- var isDuplicate = false; |
|
| 170 |
- if (tableErrorCheckData.length == 0) {
|
|
| 171 |
- tableErrorCheckData.push(sVal); |
|
| 172 |
- } |
|
| 173 |
- else {
|
|
| 174 |
- for (var i = 0; i < tableErrorCheckData.length; i++) |
|
| 175 |
- {
|
|
| 176 |
- if (tableErrorCheckData[i] == sVal) {
|
|
| 177 |
- isDuplicate = true; |
|
| 178 |
- } |
|
| 179 |
- } |
|
| 180 |
- |
|
| 181 |
- if (isDuplicate) {
|
|
| 182 |
- return; |
|
| 183 |
- } |
|
| 184 |
- else {
|
|
| 185 |
- tableErrorCheckData.push(sVal); |
|
| 186 |
- } |
|
| 187 |
- } |
|
| 188 |
- } |
|
| 189 |
- |
|
| 190 |
- |
|
| 191 |
- |
|
| 192 |
- |
|
| 193 |
-}); |
|
| 194 |
- |
|
| 195 |
- |
|
| 196 |
- |
|
| 197 |
-//############################################################################################# |
|
| 198 |
-//등록 |
|
| 199 |
-//############################################################################################# |
|
| 200 |
- |
|
| 201 |
-//등록 |
|
| 202 |
-$(document).on('click', '#btnAddrMassReg', function() {
|
|
| 203 |
- // 저장 |
|
| 204 |
- SetAddrMassSave(); |
|
| 205 |
-}); |
|
| 206 |
- |
|
| 207 |
-$(document).on('click', '#btnAddrMassClose', function() {
|
|
| 208 |
- // 대량등록 닫기 |
|
| 209 |
- setAddrMassClose(); |
|
| 210 |
-}); |
|
| 211 |
- |
|
| 212 |
-// 대량등록 닫기 |
|
| 213 |
-function setAddrMassClose() {
|
|
| 214 |
- var $objTabul = fn_utils_getTabulator(); |
|
| 215 |
- $objTabul.clearData(); |
|
| 216 |
- |
|
| 217 |
- fn_rowDataClear(); |
|
| 218 |
- |
|
| 219 |
- |
|
| 220 |
- $("#rowTotCnt").text(0); //총건수 수정
|
|
| 221 |
- $("#rowDupCnt").text(0); //중복건수 수정
|
|
| 222 |
- $("#rowErrorCnt").text(0); //중복건수 수정
|
|
| 223 |
- |
|
| 224 |
- |
|
| 225 |
- |
|
| 226 |
- dupliPhoneDataRealList.length = 0; // 중복 휴대폰번호 초기화 |
|
| 227 |
- addrMassDupliSaveList = null; |
|
| 228 |
- |
|
| 229 |
- $("#btnAddrMassDupli").hide();
|
|
| 230 |
- $("#btnAddrMassSaveDupli").hide();
|
|
| 231 |
- |
|
| 232 |
- //location.reload(); |
|
| 233 |
- listAddrGrp(); |
|
| 234 |
- addrGroupLoadAjax(); |
|
| 235 |
- addrLoadAjax(); |
|
| 236 |
- fn_errorPopClean(); // 에러 팝업 초기화 |
|
| 237 |
-} |
|
| 238 |
- |
|
| 239 |
-// 주소록 탭마다 돌면서 총, 중복, 오류 건수 초기화 |
|
| 240 |
-function fn_rowDataClear(){
|
|
| 241 |
- |
|
| 242 |
- // 모든 .tab 요소를 선택하여 반복 |
|
| 243 |
- $('#tbTabl .tab').each(function() {
|
|
| 244 |
- // 현재 반복 중인 요소 |
|
| 245 |
- var tab = $(this); |
|
| 246 |
- |
|
| 247 |
- // data-tabul 값 가져오기 |
|
| 248 |
- var tabulNm = tab.data('tabul');
|
|
| 249 |
- var tabluC = '.'+tabulNm |
|
| 250 |
- |
|
| 251 |
- // 중복 카운트 |
|
| 252 |
- $(tabluC+" #rowTotCnt").text(0); |
|
| 253 |
- // 에러 카운트 |
|
| 254 |
- $(tabluC+" #rowDupCnt").text(0); |
|
| 255 |
- // |
|
| 256 |
- $(tabluC+" #rowErrorCnt").text(0); |
|
| 257 |
- |
|
| 258 |
- |
|
| 259 |
- }); |
|
| 260 |
-} |
|
| 261 |
- |
|
| 262 |
- |
|
| 263 |
- |
|
| 264 |
-// 주소록 그룹 중복체크 |
|
| 265 |
-function getAddrGroupDuplCheckAjax(addrGrpNm) {
|
|
| 266 |
- var isReturn = true; |
|
| 267 |
- |
|
| 268 |
- $.ajax({
|
|
| 269 |
- url : "<c:url value='/web/addr/getAddrGroupDuplCheckAjax.do' />", |
|
| 270 |
- type : 'POST', |
|
| 271 |
- data : {"addrGrpNm" : addrGrpNm},
|
|
| 272 |
- dataType:'json', |
|
| 273 |
- async: false, // 동기 |
|
| 274 |
- success : function(data, status){
|
|
| 275 |
- if(data.isSuccess == true) {
|
|
| 276 |
- if(data.isDupl == true) {
|
|
| 277 |
- //alert("중복된 그룹명입니다.");
|
|
| 278 |
- isReturn = false; |
|
| 279 |
- } |
|
| 280 |
- } |
|
| 281 |
- else {
|
|
| 282 |
- //alert("Message : " + msg);
|
|
| 283 |
- } |
|
| 284 |
- }, |
|
| 285 |
- error: function (e) {
|
|
| 286 |
- //alert("주소록 중복체크에 실패했습니다.");
|
|
| 287 |
- } |
|
| 288 |
- }); |
|
| 289 |
- console.log('isReturn : ', isReturn);
|
|
| 290 |
- |
|
| 291 |
- return isReturn; |
|
| 292 |
-} |
|
| 293 |
- |
|
| 294 |
- |
|
| 295 |
-//저장 |
|
| 296 |
-function SetAddrMassSave(){
|
|
| 297 |
- |
|
| 298 |
- |
|
| 299 |
- |
|
| 300 |
- |
|
| 301 |
- |
|
| 302 |
- |
|
| 303 |
- |
|
| 304 |
- |
|
| 305 |
- |
|
| 306 |
- var $objTabul = fn_utils_getTabulator(); |
|
| 307 |
- var tabulNm = fn_utils_getTabulatorNm(); |
|
| 308 |
- var tabluC = '.'+tabulNm |
|
| 309 |
- |
|
| 310 |
- /* console.log('$objTabul : ', $objTabul.getData());
|
|
| 311 |
- if(tabulNm == 'tableSelf'){
|
|
| 312 |
- console.log('????');
|
|
| 313 |
- |
|
| 314 |
- var allRows = $objTabul.getData(); // 테이블의 모든 데이터를 가져옴 |
|
| 315 |
- |
|
| 316 |
- // addrPhoneNo 값이 있는 행만 필터링 |
|
| 317 |
- var rowsWithPhoneNumbers = allRows.filter(function(row) {
|
|
| 318 |
- return row.addrPhoneNo && row.addrPhoneNo.trim() !== ''; // 값이 존재하고 공백이 아닌 경우 |
|
| 319 |
- }); |
|
| 320 |
- $objTabul = rowsWithPhoneNumbers; |
|
| 321 |
- console.log('rowsWithPhoneNumbers : ', rowsWithPhoneNumbers);
|
|
| 322 |
- console.log('$objTabul : ', $objTabul.getData());
|
|
| 323 |
- return false; |
|
| 324 |
- } */ |
|
| 325 |
- |
|
| 326 |
- if($objTabul.getData().length < 1){
|
|
| 327 |
- alert("한 개 이상의 연락처를 입력하세요");
|
|
| 328 |
- return false; |
|
| 329 |
- } |
|
| 330 |
- |
|
| 331 |
- if($objTabul.getData().length > 300000){
|
|
| 332 |
- alert("30만개 까지 등록 가능합니다.");
|
|
| 333 |
- return false; |
|
| 334 |
- } |
|
| 335 |
- |
|
| 336 |
-// var selectMassVal = $(tabluC+" #addrGrpIdInfo option:selected").val(); |
|
| 337 |
- |
|
| 338 |
- var loginVO = '${LoginVO}';
|
|
| 339 |
- if(fn_utils_isEmpty(loginVO)){
|
|
| 340 |
- alert("로그인 후 이용이 가능합니다.");
|
|
| 341 |
- return false; |
|
| 342 |
- } |
|
| 343 |
- |
|
| 344 |
- // tableExcel select 요소들을 확인 |
|
| 345 |
- var columns = $objTabul.getColumns(); |
|
| 346 |
- var isAddrPhoneNoSelected = columns.some(column => column.getField() === 'addrPhoneNo'); |
|
| 347 |
- if (!isAddrPhoneNoSelected) {
|
|
| 348 |
-// isPhoneSelected = true; |
|
| 349 |
- alert('휴대폰이 선택되지 않았습니다.');
|
|
| 350 |
- return false; |
|
| 351 |
- |
|
| 352 |
- } |
|
| 353 |
- |
|
| 354 |
- // 주소록이 새로생성이면 새로운 주소록명이 있는지 확인 |
|
| 355 |
- if ($(tabluC+" #addrGrpIdInfo option:selected").val() == "NEW" |
|
| 356 |
- && ($(tabluC+" #addrGrpNm").val() == "" |
|
| 357 |
- || $(tabluC+" #addrGrpNm").val() == null |
|
| 358 |
- || $(tabluC+" #addrGrpNm").val() == undefined) |
|
| 359 |
- ) |
|
| 360 |
- {
|
|
| 361 |
- alert("저장할 그룹을 선택하거나 새 그룹명을 입력해주세요.");
|
|
| 362 |
- $(tabluC+" #addrGrpNm").focus(); |
|
| 363 |
- return false; |
|
| 364 |
- } |
|
| 365 |
- |
|
| 366 |
- // 새 그룹명 중복체크 |
|
| 367 |
- if ($(tabluC+" #addrGrpIdInfo option:selected").val() == "NEW" |
|
| 368 |
- && $(tabluC+" #addrGrpNm").val() != "") |
|
| 369 |
- {
|
|
| 370 |
- var addrGrpNm = $(tabluC+" #addrGrpNm").val(); |
|
| 371 |
- console.log('addrGrpNm : ', addrGrpNm);
|
|
| 372 |
- //주소록 중복체크 |
|
| 373 |
- if (getAddrGroupDuplCheckAjax(addrGrpNm) == false) {
|
|
| 374 |
- alert("중복된 그룹명입니다. 새 그룹명을 입력해주세요.");
|
|
| 375 |
- return false; |
|
| 376 |
- } |
|
| 377 |
- } |
|
| 378 |
- |
|
| 379 |
- var confirmMsg = "저장하시겠습니까?\n이름 200byte, [*1*]~[*4*] 200byte, 메모 250byte 초과 글자는 절사됩니다."; |
|
| 380 |
- if (confirm(confirmMsg)) {
|
|
| 381 |
- //로딩창 show |
|
| 382 |
- fn_loadAddActive(); |
|
| 383 |
- |
|
| 384 |
- setTimeout(setSenderList_advc, 1000); |
|
| 385 |
-// setTimeout(setSenderList_old, 1000); |
|
| 386 |
- |
|
| 387 |
- } |
|
| 388 |
-} |
|
| 389 |
-/* |
|
| 390 |
-// 주소록 등록 old |
|
| 391 |
-function setSenderList_old(){
|
|
| 392 |
- |
|
| 393 |
- // tab에 해당하는 타블레이터 가져오기 |
|
| 394 |
- |
|
| 395 |
- var tabulNm = fn_utils_getTabulatorNm(); |
|
| 396 |
- var tabluC = '.'+tabulNm |
|
| 397 |
- |
|
| 398 |
- var $objTabul = fn_utils_getTabulator(); |
|
| 399 |
- var dataToSend = $objTabul.getData(); |
|
| 400 |
- var addrGrpIdInfo = $(tabluC+" #addrGrpIdInfo option:selected").val(); |
|
| 401 |
- var addrGrpNmInfo = $(tabluC+" #addrGrpNm").val(); |
|
| 402 |
- |
|
| 403 |
- var updateData = dataToSend.map(row => {
|
|
| 404 |
- row.addrGrpId = addrGrpIdInfo; |
|
| 405 |
- row.addrGrpNm = addrGrpNmInfo; |
|
| 406 |
- return row; |
|
| 407 |
- }); |
|
| 408 |
- |
|
| 409 |
- console.log('updateData : ', updateData);
|
|
| 410 |
- $.ajax({
|
|
| 411 |
- type: "POST", |
|
| 412 |
- url: "/web/mjon/addr/addrMassInsertByTempAjax_advc.do", |
|
| 413 |
- data: JSON.stringify(updateData), |
|
| 414 |
- dataType: 'json', |
|
| 415 |
- contentType: 'application/json', |
|
| 416 |
- async: true, |
|
| 417 |
- success: function (data) {
|
|
| 418 |
- console.log('data : ', data);
|
|
| 419 |
- |
|
| 420 |
- |
|
| 421 |
- if (data.status == 'OK') {
|
|
| 422 |
- alert(data.message); |
|
| 423 |
- // 데이터 비우기 |
|
| 424 |
- SetClear($objTabul); |
|
| 425 |
- setAddrMassClose(); |
|
| 426 |
- var selectMassVal = $("#addrGrpIdInfo option:selected").val();
|
|
| 427 |
- } |
|
| 428 |
- else {
|
|
| 429 |
- alert("오류 알림 : :: "+data.message);
|
|
| 430 |
- } |
|
| 431 |
- }, |
|
| 432 |
- error: function (e) {
|
|
| 433 |
- alert("저장에 실패하였습니다.");
|
|
| 434 |
- alert("ERROR : " + JSON.stringify(e));
|
|
| 435 |
- }, |
|
| 436 |
- beforeSend : function(xmlHttpRequest) {
|
|
| 437 |
- //로딩창 show |
|
| 438 |
- $('.loading_layer').addClass('active');
|
|
| 439 |
- }, |
|
| 440 |
- complete : function(xhr, textStatus) {
|
|
| 441 |
- //로딩창 hide |
|
| 442 |
- $('.loading_layer').removeClass('active');
|
|
| 443 |
- } |
|
| 444 |
- }); |
|
| 445 |
-} |
|
| 446 |
- */ |
|
| 447 |
- |
|
| 448 |
-function setSenderList_advc(){
|
|
| 449 |
- |
|
| 450 |
- var tabulNm = fn_utils_getTabulatorNm(); |
|
| 451 |
- var tabluC = '.'+tabulNm |
|
| 452 |
- |
|
| 453 |
- var $objTabul = fn_utils_getTabulator(); |
|
| 454 |
- var dataToSend = $objTabul.getData(); |
|
| 455 |
- console.log('dataToSend : ', dataToSend);
|
|
| 456 |
- var addrGrpIdInfo = $(tabluC+" #addrGrpIdInfo option:selected").val(); |
|
| 457 |
- var addrGrpNmInfo = $(tabluC+" #addrGrpNm").val(); |
|
| 458 |
- |
|
| 459 |
- var batchSize = 30000; // 배치 크기 |
|
| 460 |
- var totalBatches = Math.ceil(dataToSend.length / batchSize); // 총 배치 수 |
|
| 461 |
- var currentBatch = 0; // 현재 배치 인덱스 |
|
| 462 |
- |
|
| 463 |
- |
|
| 464 |
- fn_loadAddActive(); |
|
| 465 |
- |
|
| 466 |
- function sendBatch() {
|
|
| 467 |
- if (currentBatch < totalBatches) {
|
|
| 468 |
- fn_loadAddActive(); |
|
| 469 |
- var start = currentBatch * batchSize; |
|
| 470 |
- var end = Math.min(start + batchSize, dataToSend.length); |
|
| 471 |
- var batchData = dataToSend.slice(start, end); |
|
| 472 |
- |
|
| 473 |
- var updateData = batchData.map(row => {
|
|
| 474 |
- row.addrGrpId = addrGrpIdInfo; |
|
| 475 |
- row.addrGrpNm = addrGrpNmInfo; |
|
| 476 |
- return row; |
|
| 477 |
- }); |
|
| 478 |
- |
|
| 479 |
- $.ajax({
|
|
| 480 |
- type: "POST", |
|
| 481 |
- url: "/web/mjon/addr/addrMassInsertByTempAjax_advc.do", |
|
| 482 |
- data: JSON.stringify(updateData), |
|
| 483 |
- dataType: 'json', |
|
| 484 |
- contentType: 'application/json', |
|
| 485 |
- async: true, |
|
| 486 |
- success: function (data) {
|
|
| 487 |
- |
|
| 488 |
- |
|
| 489 |
- fn_loadRemoveActive(); |
|
| 490 |
- |
|
| 491 |
- console.log('Batch ' + (currentBatch + 1) + ' success: ', data);
|
|
| 492 |
- if (data.status == 'OK') {
|
|
| 493 |
- if (currentBatch === totalBatches - 1) {
|
|
| 494 |
- alert("모든 데이터가 성공적으로 저장되었습니다.");
|
|
| 495 |
- // 데이터 비우기 |
|
| 496 |
- SetClear($objTabul); |
|
| 497 |
- setAddrMassClose(); |
|
| 498 |
- } else {
|
|
| 499 |
- currentBatch++; |
|
| 500 |
- // 새로만든 그룹ID나 기존 ID를 넣어줌 |
|
| 501 |
- // 그룹추가 시 배치별로 똑같은 그룹을 생성해서 방지차원으로 넣어줌 |
|
| 502 |
- addrGrpIdInfo = data.object; |
|
| 503 |
- sendBatch(); // 다음 배치 전송 |
|
| 504 |
- } |
|
| 505 |
- } else {
|
|
| 506 |
- alert("오류 알림 : " + data.message);
|
|
| 507 |
- } |
|
| 508 |
- }, |
|
| 509 |
- error: function (e) {
|
|
| 510 |
- alert("배치 전송에 실패하였습니다.");
|
|
| 511 |
- console.error("ERROR: ", JSON.stringify(e));
|
|
| 512 |
- }, |
|
| 513 |
- beforeSend: function(xmlHttpRequest) {
|
|
| 514 |
- }, |
|
| 515 |
- complete: function(xhr, textStatus) {
|
|
| 516 |
- if (currentBatch === totalBatches - 1) {
|
|
| 517 |
- $('#lodingTxt').text('Loading');
|
|
| 518 |
- } else {
|
|
| 519 |
- $('#lodingTxt').text(end+'...');
|
|
| 520 |
- } |
|
| 521 |
- } |
|
| 522 |
- }); |
|
| 523 |
- } |
|
| 524 |
- } |
|
| 525 |
- // 첫 번째 배치 전송 시작 |
|
| 526 |
- sendBatch(); |
|
| 527 |
-} |
|
| 528 |
- |
|
| 529 |
- |
|
| 530 |
- |
|
| 531 |
-//주소록그룹 콤보박스 유지 |
|
| 532 |
-function setSelectMassSetting(selectMassVal) {
|
|
| 533 |
- $("#addrGrpIdInfo").val(selectMassVal).prop("selected", true);
|
|
| 534 |
-} |
|
| 535 |
- |
|
| 536 |
- |
|
| 537 |
-//데이터 비우기 |
|
| 538 |
-function SetClear($objTabul) {
|
|
| 539 |
- |
|
| 540 |
- |
|
| 541 |
- var tabulNm = fn_utils_getTabulatorNm(); |
|
| 542 |
- var tabluC = '.'+tabulNm |
|
| 543 |
- |
|
| 544 |
- $(tabluC+" #addrGrpNm").val(""); // 새그룹명 Clear;
|
|
| 545 |
- // 주소록 그룹정보 불러오기 |
|
| 546 |
- getAddrGroupList(); |
|
| 547 |
- |
|
| 548 |
- |
|
| 549 |
- |
|
| 550 |
- if (tabulNm === 'tableSelf') {
|
|
| 551 |
- var tableData = []; |
|
| 552 |
- for (var i = 0; i < 1000; i++) {
|
|
| 553 |
- tableData.push({addrNm: "", addrPhoneNo: "", addrInfo1: "", addrInfo2: "", addrInfo3: "", addrInfo4: "", addrComment: ""});
|
|
| 554 |
- } |
|
| 555 |
- console.log(tableData); // 데이터 출력 확인 |
|
| 556 |
- fn_selfmakeTable() |
|
| 557 |
- }else{
|
|
| 558 |
- $objTabul.clearData(); // clearData는 동기 방식이므로 바로 실행 |
|
| 559 |
- |
|
| 560 |
- } |
|
| 561 |
-// console.log('tabulNm : ', tabulNm);
|
|
| 562 |
-// console.log('tabulNm : ', tabulNm.trim());
|
|
| 563 |
- |
|
| 564 |
- |
|
| 565 |
- $(tabluC+" #rowTotCnt").text(0); //총건수 수정 |
|
| 566 |
- $(tabluC+" #rowDupCnt").text(0); //중복건수 수정 |
|
| 567 |
- |
|
| 568 |
- // popup 영역 |
|
| 569 |
- fn_errorPopClean(); |
|
| 570 |
-} |
|
| 571 |
- |
|
| 572 |
-// 주소 대량등록 버튼 클릭 |
|
| 573 |
-// AddrListAjax.jsp에서 호출 |
|
| 574 |
-$(document).on('click', '#btnAddrMassRegCall', function() {
|
|
| 575 |
- getAddrGroupList(); |
|
| 576 |
-}); |
|
| 577 |
- |
|
| 578 |
- |
|
| 579 |
-// 주소록 그룹정보 불러오기 |
|
| 580 |
-function getAddrGroupList() {
|
|
| 581 |
- $.ajax({
|
|
| 582 |
- type : "POST", |
|
| 583 |
- async : false, |
|
| 584 |
- url : "/web/mjon/addr/addrGroupListAjax.do", |
|
| 585 |
- data : {},
|
|
| 586 |
- dataType:'json', |
|
| 587 |
- success : function(data) {
|
|
| 588 |
- //alert(JSON.stringify(data.addrGroupList)); |
|
| 589 |
- |
|
| 590 |
- // Show Html |
|
| 591 |
- getAddrGroupListShow(data.addrGroupList); |
|
| 592 |
- }, |
|
| 593 |
- error : function(xhr, status, error) {
|
|
| 594 |
- alert(error); |
|
| 595 |
- return false; |
|
| 596 |
- } |
|
| 597 |
- }); |
|
| 598 |
-} |
|
| 599 |
- |
|
| 600 |
- |
|
| 601 |
- |
|
| 602 |
- |
|
| 603 |
-// 그룹데이터 노출 |
|
| 604 |
-function getAddrGroupListShow(jsonList) {
|
|
| 605 |
- var sHtml = ""; |
|
| 606 |
- sHtml += "<option value='NEW'>그룹추가</option>"; |
|
| 607 |
- sHtml += "<option value='0'>그룹미지정</option>"; |
|
| 608 |
- sHtml += "<option value='bookmark'>자주보내는 번호</option>"; |
|
| 609 |
- for (var j = 0; j < jsonList.length; j++) {
|
|
| 610 |
- sHtml += " <option value='" + $.trim(jsonList[j].addrGrpId) + "' />" + $.trim(jsonList[j].addrGrpNm) + "</option>"; |
|
| 611 |
- } |
|
| 612 |
- |
|
| 613 |
- var tabulNm = fn_utils_getTabulatorNm(); |
|
| 614 |
- var tabluC = '.'+tabulNm |
|
| 615 |
- $(tabluC+" #addrGrpIdInfo").html(sHtml); |
|
| 616 |
-} |
|
| 617 |
- |
|
| 618 |
-$(document).on('change', '#addrGrpIdInfo', function() {
|
|
| 619 |
- if ($("#addrGrpIdInfo option:selected").val() != "NEW") {
|
|
| 620 |
- $("#addrGrpNm").val(""); // 새그룹명 Clear;
|
|
| 621 |
- } |
|
| 622 |
-}); |
|
| 623 |
- |
|
| 624 |
-//############################################################################################# |
|
| 625 |
-//파일 불러오기 |
|
| 626 |
-//############################################################################################# |
|
| 627 |
- |
|
| 628 |
-//체크박스 전체선택/해제 |
|
| 629 |
-$(document).on("click", "#chkAll", function(e) {
|
|
| 630 |
- var isChecked = $(this).is(":checked");
|
|
| 631 |
- $("input[name=addrCheck]:checkbox").prop("checked", isChecked);
|
|
| 632 |
-}); |
|
| 633 |
- |
|
| 634 |
-$(document).on("click", "#duplicationChkAll", function(e) {
|
|
| 635 |
- var isChecked = $(this).is(":checked");
|
|
| 636 |
- $("input[name=addrCheck]:checkbox").prop("checked", isChecked);
|
|
| 637 |
-}); |
|
| 638 |
- |
|
| 639 |
-//팝업 텍스트 더보기 클릭 시 펼쳐지고 숨겨짐 |
|
| 640 |
-function popMore(e){
|
|
| 641 |
- $(e).closest(".pop_more_cont").toggleClass("pop_more_click");
|
|
| 642 |
- |
|
| 643 |
- if($(e).closest(".pop_more_cont").is(".pop_more_click")){
|
|
| 644 |
- $(e).html('숨기기');
|
|
| 645 |
- $(e).append('<i></i>');
|
|
| 646 |
- }else {
|
|
| 647 |
- $(e).html('더보기');
|
|
| 648 |
- $(e).append('<i></i>');
|
|
| 649 |
- } |
|
| 650 |
-} |
|
| 651 |
- |
|
| 652 |
-/* 윈도우팝업 열기 */ |
|
| 653 |
-function infoPop(pageUrl){
|
|
| 654 |
- document.popForm.pageType.value = pageUrl; |
|
| 655 |
- document.popForm.action = "/web/pop/infoPop.do"; |
|
| 656 |
- document.popForm.method = "post"; |
|
| 657 |
- window.open("about:blank", 'infoPop', 'width=790, height=430, top=100, left=100, fullscreen=no, menubar=no, status=no, toolbar=no, titlebar=yes, location=no, scrollbars=1');
|
|
| 658 |
- document.popForm.target = "infoPop"; |
|
| 659 |
- document.popForm.submit(); |
|
| 660 |
-} |
|
| 661 |
- |
|
| 662 |
-// 중복 연락처 |
|
| 663 |
-function GetAddrMassDupli() {
|
|
| 664 |
- var sHtml = ""; |
|
| 665 |
- sHtml += "<div class='' style='overflow-x:auto; height:350px;'>"; |
|
| 666 |
- sHtml += "<table class='tType4'>"; |
|
| 667 |
- sHtml += " <colgroup>"; |
|
| 668 |
- sHtml += " <col style='width:auto' />"; |
|
| 669 |
- sHtml += " </colgroup>"; |
|
| 670 |
- sHtml += " <thead>"; |
|
| 671 |
- sHtml += " <tr>"; |
|
| 672 |
- sHtml += " <th>중복 휴대폰번호 (" + numberWithCommas(dupliPhoneDataRealList.length) + "개)</th>";
|
|
| 673 |
- sHtml += " </tr>"; |
|
| 674 |
- sHtml += " </thead>"; |
|
| 675 |
- sHtml += " <tbody>"; |
|
| 676 |
- for (var i = 0; i < dupliPhoneDataRealList.length; i++) {
|
|
| 677 |
- sHtml += " <tr>"; |
|
| 678 |
- sHtml += " <td>" + dupliPhoneDataRealList[i] + "</td>"; |
|
| 679 |
- sHtml += " </tr>"; |
|
| 680 |
- } |
|
| 681 |
- sHtml += " </tbody>"; |
|
| 682 |
- sHtml += " </table>"; |
|
| 683 |
- sHtml += " </div>"; |
|
| 684 |
- |
|
| 685 |
- $("#addrMassDupli_layer").html(sHtml);
|
|
| 686 |
-} |
|
| 687 |
- |
|
| 688 |
-//중복 연락처 => 저장시 |
|
| 689 |
-function GetAddrMassSaveDupli() {
|
|
| 690 |
- var sHtml = ""; |
|
| 691 |
- sHtml += "<div class='' style='overflow-x:auto; height:350px;'>"; |
|
| 692 |
- sHtml += "<table class='tType4'>"; |
|
| 693 |
- sHtml += " <colgroup>"; |
|
| 694 |
- sHtml += " <col style='width:auto' />"; |
|
| 695 |
- sHtml += " </colgroup>"; |
|
| 696 |
- sHtml += " <thead>"; |
|
| 697 |
- sHtml += " <tr>"; |
|
| 698 |
- sHtml += " <th>중복 휴대폰번호 (" + numberWithCommas(addrMassDupliSaveList.length) + "개)</th>";
|
|
| 699 |
- sHtml += " </tr>"; |
|
| 700 |
- sHtml += " </thead>"; |
|
| 701 |
- sHtml += " <tbody>"; |
|
| 702 |
- for (var i = 0; i < addrMassDupliSaveList.length; i++) {
|
|
| 703 |
- sHtml += " <tr>"; |
|
| 704 |
- sHtml += " <td>" + addrMassDupliSaveList[i].addrPhoneNo + "</td>"; |
|
| 705 |
- sHtml += " </tr>"; |
|
| 706 |
- } |
|
| 707 |
- sHtml += " </tbody>"; |
|
| 708 |
- sHtml += " </table>"; |
|
| 709 |
- sHtml += " </div>"; |
|
| 710 |
- |
|
| 711 |
- $("#addrMassSaveDupli_layer").html(sHtml);
|
|
| 712 |
-} |
|
| 713 |
- |
|
| 714 |
- |
|
| 715 |
-// function fn_tabToggle('1')
|
|
| 716 |
-function fn_tabToggle(tabNum){
|
|
| 717 |
- var tabId = '#tab'+tabNum; |
|
| 718 |
- $('.tab_c').hide();
|
|
| 719 |
- $(tabId).show(); |
|
| 720 |
- getAddrGroupList(); |
|
| 721 |
-} |
|
| 722 |
- |
|
| 723 |
- |
|
| 724 |
-</script> |
|
| 725 |
- |
|
| 726 |
-<div class="loading_layer"> |
|
| 727 |
- <div class="loading_container"> |
|
| 728 |
- <div class="bar"></div> |
|
| 729 |
- <div class="text" id="lodingTxt"> |
|
| 730 |
- Loading |
|
| 731 |
- </div> |
|
| 732 |
- </div> |
|
| 733 |
-</div> |
|
| 734 |
- |
|
| 735 |
-<div id="adrPopup_tab1"> |
|
| 736 |
- |
|
| 737 |
- |
|
| 738 |
-<!-- 수신거부 대량등록 data-tooltip:adr_popup01 --> |
|
| 739 |
- <form id="addrMassForm" name="addrMassForm" method="post"> |
|
| 740 |
- <input type="hidden" id="phoneList" name="phoneList" value=""/> |
|
| 741 |
- <input type="hidden" id="nameList" name="nameList" value=""/> |
|
| 742 |
- <input type="hidden" id="info1List" name="info1List" value=""/> |
|
| 743 |
- <input type="hidden" id="info2List" name="info2List" value=""/> |
|
| 744 |
- <input type="hidden" id="info3List" name="info3List" value=""/> |
|
| 745 |
- <input type="hidden" id="info4List" name="info4List" value=""/> |
|
| 746 |
- <input type="hidden" id="memoList" name="memoList" value=""/> |
|
| 747 |
- <input type="hidden" id="addrGrpId" name="addrGrpId" value=""/> |
|
| 748 |
- <div class="tooltip-wrap" id="addrMassLoad"> |
|
| 749 |
- <div class="popup-com adr_layer adr_popup01" tabindex="0" data-tooltip-con="adr_popup01" data-focus="adr_popup01" data-focus-prev="adr_popup01-close" style="width: 1000px;"> |
|
| 750 |
- <div class="popup_heading"> |
|
| 751 |
- <p>주소록 대량등록</p> |
|
| 752 |
- <button type="button" class="tooltip-close" data-focus="adr_popup01-close" onclick="setAddrMassClose();"><img src="/publish/images/content/layerPopup_close.png" alt="팝업 닫기"></button> |
|
| 753 |
- </div> |
|
| 754 |
- <div class="layer_in" style="padding: 25px 30px;"> |
|
| 755 |
- <div class="list_tab_wrap2"> |
|
| 756 |
- <!-- tab button --> |
|
| 757 |
- <ul class="list_tab" id="tbTabl"> |
|
| 758 |
- <li class="tab active" data-tabul="tableExcel"><button type="button" onclick="popupTab(this,'1'); fn_tabToggle('1');">엑셀입력</button></li>
|
|
| 759 |
- <li class="tab" data-tabul="tableClip"><button type="button" onclick="popupTab(this,'2'); fn_tabToggle('2');">붙여넣기</button></li>
|
|
| 760 |
- <li class="tab" data-tabul="tableSelf"><button type="button" onclick="popupTab(this,'3'); fn_tabToggle('3');">직접입력</button></li>
|
|
| 761 |
- </ul><!--// tab button --> |
|
| 762 |
- </div> |
|
| 763 |
- <div id="tab1" class="tab_c tableExcel"> |
|
| 764 |
- <%@include file="/WEB-INF/jsp/web/addr/include/addrListforExcel.jsp" %> |
|
| 765 |
- </div> |
|
| 766 |
- <div id="tab2" class="tab_c tableClip" style="display: none;"> |
|
| 767 |
- <%@include file="/WEB-INF/jsp/web/addr/include/addrListforClipboard.jsp" %> |
|
| 768 |
- </div> |
|
| 769 |
- <div id="tab3" class="tab_c tableSelf" style="display: none;"> |
|
| 770 |
- <%@include file="/WEB-INF/jsp/web/addr/include/addrListforSelf.jsp" %> |
|
| 771 |
- </div> |
|
| 772 |
- <div class="popup_btn_wrap2" style="margin: 0 auto 30px auto;"> |
|
| 773 |
- <button type="button" id="btnAddrMassReg">등록</button> |
|
| 774 |
- <button type="button" id="btnAddrMassClose" class="tooltip-close" data-focus="adr_popup01-close" data-focus-next="popup02">닫기</button> |
|
| 775 |
- </div> |
|
| 776 |
- |
|
| 777 |
- </div> |
|
| 778 |
- </div> |
|
| 779 |
- </div> |
|
| 780 |
- </form> |
|
| 781 |
- |
|
| 782 |
- |
|
| 783 |
- |
|
| 784 |
-<!-- 주소록 상세 결과 팝업 data-tooltip:adr_popup14 --> |
|
| 785 |
- <div class="tooltip-wrap"> |
|
| 786 |
- <div class="popup-com adr_layer adr_popup14" tabindex="0" data-tooltip-con="adr_popup14" data-focus="adr_popup14" data-focus-prev="adr_popu14-close" style="width: 450px;"> |
|
| 787 |
- <div class="popup_heading"> |
|
| 788 |
- <p>주소록 상세 결과</p> |
|
| 789 |
- <button type="button" class="tooltip-close" data-focus="adr_popup14-close"><img src="/publish/images/content/layerPopup_close.png" alt="팝업 닫기"></button> |
|
| 790 |
- </div> |
|
| 791 |
- <div class="layer_in" style="padding:30px 20px;"> |
|
| 792 |
- <div class="table_top"> |
|
| 793 |
- <p> |
|
| 794 |
- 총 <span class="c_e40000" id="errorPopTotCnt">0</span>건 |
|
| 795 |
- / 중복 <span class="c_002c9a" id="errorPopDupCnt">0</span>건 |
|
| 796 |
- / 오류 <span class="c_002c9a" id="errorPopErrorCnt">0</span>건</p> |
|
| 797 |
- <button type="button" class="excel_btn btnType" id="errorExcelBtn"><i class="downroad"></i>엑셀 다운로드</button> |
|
| 798 |
- </div> |
|
| 799 |
- <div class="tb_wrap adr_list" id="tabulator_error"> |
|
| 800 |
- <!-- $tableError 참고 --> |
|
| 801 |
- </div> |
|
| 802 |
- <ul class="cf_text_ul"> |
|
| 803 |
- <li>*중복번호는 하나의 번호만 등록됩니다.</li> |
|
| 804 |
- <li>*휴대폰 형식에 맞지 않는 데이터는 삭제 후 업로드 됩니다.</li> |
|
| 805 |
- <li>ex) 발송불가 특수문자, 자릿수 오류 등</li> |
|
| 806 |
- </ul> |
|
| 807 |
- <div class="popup_btn_wrap2"> |
|
| 808 |
-<!-- <button type="button">저장</button> --> |
|
| 809 |
- <button type="button" class="tooltip-close" data-focus="adr_popup14-close" data-focus-next="adr_popup14">닫기</button> |
|
| 810 |
- </div> |
|
| 811 |
- </div> |
|
| 812 |
- </div> |
|
| 813 |
- </div> |
|
| 814 |
- |
|
| 815 |
-</div> |
|
| 816 |
-<!--// 주소록 대량등록 팝업 --> |
|
| 817 |
- |
|
| 818 |
-<div class="inner"> |
|
| 819 |
- <!-- send top --> |
|
| 820 |
- <div class="send_top"> |
|
| 821 |
- <!-- tab button --> |
|
| 822 |
- <ul class="tabType4"> |
|
| 823 |
- <li class="tab active"><button type="button" onclick="TabType5(this,'1'); moveTab('addr');">주소록관리</button></li>
|
|
| 824 |
- <li class="tab"><button type="button" onclick="TabType5(this,'2'); moveTab('fax');">팩스 주소록관리</button></li>
|
|
| 825 |
- <li class="tab"><button type="button" onclick="TabType5(this,'3'); moveTab('block');">수신거부</button></li>
|
|
| 826 |
- <li class="tab"><button type="button" onclick="TabType5(this,'4'); moveTab('addrMob');">폰주소록 등록</button></li>
|
|
| 827 |
- <li class="tab"><button type="button" onclick="TabType5(this,'5'); moveTab('addrApply');">주소록 입력 대행(무료)</button></li>
|
|
| 828 |
- </ul><!--// tab button --> |
|
| 829 |
- <!-- 주소록 관리 - 주소록 관리 --> |
|
| 830 |
- <div class="adr_cont current" id="tab5_1"> |
|
| 831 |
- <div class="heading"> |
|
| 832 |
- <h2>주소록 관리</h2> |
|
| 833 |
- <button type="button" class="button info" onclick="infoPop('selectAddrList');">사용안내</button>
|
|
| 834 |
- </div> |
|
| 835 |
- <%--<div class="titBox"> |
|
| 836 |
- <p>- 연락처를 그룹별로 분류하여 간편하고 편리하게 관리할 수 있습니다(최대 100,000개까지 등록 가능)</p> |
|
| 837 |
- <p>- 그룹은 그룹 간 이동, 병합 및 복사가 가능합니다.</p> |
|
| 838 |
- <p>- 주소록은 중복검사가 가능하며 중복된 연락처를 삭제할 수 있습니다. 단, 데이터 양에 따라 시간이 소요될 수 있습니다.</p> |
|
| 839 |
- <p>- 주소록 관리에서 그룹 또는 연락처를 선택하여 문자를 바로 발송할 수 있습니다.</p> |
|
| 840 |
- <p>- 주소록 내보내기를 통해 다른 ID로 주소록을 복사할 수 있습니다(그룹 전송만 가능, 보낸 주소록 결과는 최대 90일까지 보관)</p> |
|
| 841 |
- <p>- 주소록 내보내기 시에는 개인정보보호를 위해 추가 휴대폰 인증을 실시하며, 휴대폰 인증은 등록된 발신번호로만 인증 가능합니다.</p> |
|
| 842 |
- <p>- 고객님께서 보유하신 엑셀파일이나 텍스트파일 등으로 작성된 주소록을 대량 등록할 수 있습니다.</p> |
|
| 843 |
- <p>- 주소록 등록이 어려우신 경우에는 주소록 입력대행 메뉴를 이용하시면 됩니다.</p> |
|
| 844 |
- <p>- 주소록 무료대행은 신규 그룹으로 생성됩니다(기존 그룹 수정 불가)</p> |
|
| 845 |
- </div>--%> |
|
| 846 |
- |
|
| 847 |
- <div class="adr1"> |
|
| 848 |
- <!-- 왼쪽 영역 --> |
|
| 849 |
- <div class="adr1_left" id="adr1_left"></div> |
|
| 850 |
- <!-- 오른쪽 영역 --> |
|
| 851 |
- <div class="adr1_right" id="adr1_right"> |
|
| 852 |
- </div> |
|
| 853 |
- </div> |
|
| 854 |
- </div> |
|
| 855 |
- </div><!--// 주소록 관리 - 주소록 관리 --> |
|
| 856 |
-</div><!--// send top --> |
|
| 857 |
- |
|
| 858 |
- |
|
| 859 |
- |
|
| 860 |
-<!--=================================================================== --> |
|
| 861 |
- |
|
| 862 |
- |
|
| 863 |
-<form name="popForm" id="popForm" method="post"> |
|
| 864 |
- <input type="hidden" name="pageType" id="pageType" value=""/> |
|
| 865 |
-</form> |
|
| 866 |
- |
|
| 867 |
-<form name="msgAddrForm2" id="msgAddrForm2" method="post"> |
|
| 868 |
- <input name="msgStartKeyword" id="msgStartKeyword" type="hidden" /> |
|
| 1 |
+<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> |
|
| 2 |
+<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> |
|
| 3 |
+<%@ taglib prefix="ui" uri="http://egovframework.gov/ctl/ui"%> |
|
| 4 |
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> |
|
| 5 |
+<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> |
|
| 6 |
+ |
|
| 7 |
+<script type="text/javascript"> |
|
| 8 |
+</script> |
|
| 9 |
+ |
|
| 10 |
+<script type="text/javascript" src="<c:url value='/publish/js/content.js'/>"></script> |
|
| 11 |
+<script type="text/javascript" src="https://oss.sheetjs.com/sheetjs/xlsx.full.min.js"></script> |
|
| 12 |
+<script type="text/javascript" src="<c:url value='/js/web/addr/init.js'/>?v=20240919"></script> |
|
| 13 |
+<script type="text/javascript" src="<c:url value='/js/web/addr/event.js'/>?v=20240919"></script> |
|
| 14 |
+<script type="text/javascript" src="<c:url value='/js/web/addr/utils.js'/>?v=20240919"></script> |
|
| 15 |
+<script type="text/javascript" src="<c:url value='/js/web/addr/cmn.js?date=202409021440'/>"></script> |
|
| 16 |
+ |
|
| 17 |
+ |
|
| 18 |
+<script type="text/javascript"> |
|
| 19 |
+ |
|
| 20 |
+$(document).ready(function(){
|
|
| 21 |
+ listAddrGrp(); |
|
| 22 |
+ addrLoadAjax(); |
|
| 23 |
+ |
|
| 24 |
+ // 엑셀 중복번호 버튼 |
|
| 25 |
+ $("#tableExcelDupliBtn").hide();
|
|
| 26 |
+// $("#btnAddrMassSaveDupli").hide();
|
|
| 27 |
+ // 주소록 대량등록 |
|
| 28 |
+// addrMassTab(1); |
|
| 29 |
+ |
|
| 30 |
+ // 중복 휴대폰번호 버튼 노출여부 |
|
| 31 |
+ |
|
| 32 |
+ |
|
| 33 |
+ // excel 오류정보 테스트 |
|
| 34 |
+ $('#errorExcelBtn').click(function(){
|
|
| 35 |
+ if($tableError.getDataCount()<1){
|
|
| 36 |
+ alert('오류 정보가 없습니다.');
|
|
| 37 |
+ return false; |
|
| 38 |
+ } |
|
| 39 |
+ $tableError.download("xlsx", "error_data.xlsx");
|
|
| 40 |
+ }); |
|
| 41 |
+}); |
|
| 42 |
+ |
|
| 43 |
+// 메인 화면 좌측메뉴 최신화 |
|
| 44 |
+function listAddrGrp(){
|
|
| 45 |
+ var sendData = $(document.searchAddrGrpForm).serializeArray() ; |
|
| 46 |
+ $("#adr1_left").load("/web/addr/selectAddrGroupListAjax.do", sendData ,function(response, status, xhr){});
|
|
| 47 |
+} |
|
| 48 |
+ |
|
| 49 |
+ |
|
| 50 |
+function addrGroupLoadAjax(){
|
|
| 51 |
+ $("#addrRegistSelect").load("/web/addr/selectAddrGroupAjax.do", function(response, status, xhr){});
|
|
| 52 |
+ $("#funcAddrGroupSelect").load("/web/addr/selectAddrGroupAjax.do", function(response, status, xhr){});
|
|
| 53 |
+} |
|
| 54 |
+ |
|
| 55 |
+function addrLoadAjax(){
|
|
| 56 |
+ $("#adr1_right").load("/web/mjon/addr/selectAddrAjax.do", function(response, status, xhr){tableAllChk();});
|
|
| 57 |
+ addrGroupLoadAjax(); |
|
| 58 |
+} |
|
| 59 |
+ |
|
| 60 |
+function insertAddrGroupAjax() {
|
|
| 61 |
+ var form = document.addrGrpInsertForm; |
|
| 62 |
+ if(form.addrGrpNm.value == "") {
|
|
| 63 |
+ alert("주소록 그룹명을 입력해주세요.");
|
|
| 64 |
+ return; |
|
| 65 |
+ } |
|
| 66 |
+ if(!confirm("주소록 그룹을 추가하시겠습니까?")) {
|
|
| 67 |
+ return; |
|
| 68 |
+ } |
|
| 69 |
+ var data = new FormData(form); |
|
| 70 |
+ |
|
| 71 |
+ $.ajax({
|
|
| 72 |
+ cache : false, |
|
| 73 |
+ url : "<c:url value='/web/addr/insertAddrGroupAjax.do' />", |
|
| 74 |
+ type : 'POST', |
|
| 75 |
+ data : data, |
|
| 76 |
+ dataType:'json', |
|
| 77 |
+ processData: false, |
|
| 78 |
+ contentType: false, |
|
| 79 |
+ success : function(returnData, status){
|
|
| 80 |
+ if(status == "success") {
|
|
| 81 |
+ if("fail"==returnData.result){
|
|
| 82 |
+ alert(returnData.message); |
|
| 83 |
+ return; |
|
| 84 |
+ } else if("dupl"==returnData.result) {
|
|
| 85 |
+ alert("중복된 그룹명입니다.");
|
|
| 86 |
+ return; |
|
| 87 |
+ } |
|
| 88 |
+ alert("등록되었습니다.");
|
|
| 89 |
+ listAddrGrp(); |
|
| 90 |
+ addrGroupLoadAjax(); |
|
| 91 |
+ |
|
| 92 |
+ }else{ alert("ERROR!");return;}
|
|
| 93 |
+ }, |
|
| 94 |
+ error: function (e) { alert("저장에 실패하였습니다."); console.log("ERROR : ", e); }
|
|
| 95 |
+ }); |
|
| 96 |
+ |
|
| 97 |
+} |
|
| 98 |
+ |
|
| 99 |
+ |
|
| 100 |
+// 주소록그룹 콤보박스 유지 |
|
| 101 |
+function setSelectSetting(selectVal) {
|
|
| 102 |
+ $("#addrRegistSelect").val(selectVal).prop("selected", true);
|
|
| 103 |
+} |
|
| 104 |
+ |
|
| 105 |
+function linkPage(pageNo){
|
|
| 106 |
+ if ($('#searchKeywordAddr').val() != "" && $('#searchKeywordAddr').val() != null && $('#searchKeywordAddr').val() != undefined) {
|
|
| 107 |
+ // 문자전송 검색용 |
|
| 108 |
+ $("#msgStartKeyword").val("");
|
|
| 109 |
+ } |
|
| 110 |
+ |
|
| 111 |
+ var searchForm = document.searchAddrForm; |
|
| 112 |
+ searchForm.pageIndex.value = pageNo; |
|
| 113 |
+ searchForm.pageUnit.value = $('#pageUnit').val();
|
|
| 114 |
+ searchForm.searchCondition.value = $('#searchConditionAddr').val();
|
|
| 115 |
+ searchForm.searchKeyword.value = $('#searchKeywordAddr').val();
|
|
| 116 |
+ searchForm.startKeyword.value = $("#msgStartKeyword").val();
|
|
| 117 |
+ |
|
| 118 |
+ var sendData = $(document.searchAddrForm).serializeArray(); |
|
| 119 |
+ $("#adr1_right").load("/web/mjon/addr/selectAddrAjax.do", sendData, function(response, status, xhr){tableAllChk();});
|
|
| 120 |
+ addrGroupLoadAjax(); |
|
| 121 |
+} |
|
| 122 |
+ |
|
| 123 |
+function moveTab(type){
|
|
| 124 |
+ if(type == "addr") location.href="/web/mjon/addr/selectAddrList.do"; |
|
| 125 |
+ if(type == "fax") location.href="/web/mjon/fax/addr/selectFaxAddrList.do"; |
|
| 126 |
+ if(type == "block") location.href="/web/mjon/addrBlock/selectBlockList.do"; |
|
| 127 |
+ if(type == "addrMob") location.href="/web/mjon/addr/addrMobGuide.do"; |
|
| 128 |
+ if(type == "addrApply") location.href="/web/mjon/addragency/selectAddrAgencyList.do"; |
|
| 129 |
+} |
|
| 130 |
+ |
|
| 131 |
+ |
|
| 132 |
+ |
|
| 133 |
+//############################################################################################# |
|
| 134 |
+//Tabulator |
|
| 135 |
+//############################################################################################# |
|
| 136 |
+ |
|
| 137 |
+$(document).ready(function(){
|
|
| 138 |
+ |
|
| 139 |
+ |
|
| 140 |
+ |
|
| 141 |
+ |
|
| 142 |
+ // 오류검사 항목 중복제거 |
|
| 143 |
+ function SetTableErrorDupliCheck(sVal) {
|
|
| 144 |
+ var isDuplicate = false; |
|
| 145 |
+ if (tableErrorCheckData.length == 0) {
|
|
| 146 |
+ tableErrorCheckData.push(sVal); |
|
| 147 |
+ } |
|
| 148 |
+ else {
|
|
| 149 |
+ for (var i = 0; i < tableErrorCheckData.length; i++) |
|
| 150 |
+ {
|
|
| 151 |
+ if (tableErrorCheckData[i] == sVal) {
|
|
| 152 |
+ isDuplicate = true; |
|
| 153 |
+ } |
|
| 154 |
+ } |
|
| 155 |
+ |
|
| 156 |
+ if (isDuplicate) {
|
|
| 157 |
+ return; |
|
| 158 |
+ } |
|
| 159 |
+ else {
|
|
| 160 |
+ tableErrorCheckData.push(sVal); |
|
| 161 |
+ } |
|
| 162 |
+ } |
|
| 163 |
+ } |
|
| 164 |
+ |
|
| 165 |
+ |
|
| 166 |
+ // 오류검사 항목 중복제거 |
|
| 167 |
+ function SetTableErrorDupliCheck(sVal) {
|
|
| 168 |
+ var isDuplicate = false; |
|
| 169 |
+ if (tableErrorCheckData.length == 0) {
|
|
| 170 |
+ tableErrorCheckData.push(sVal); |
|
| 171 |
+ } |
|
| 172 |
+ else {
|
|
| 173 |
+ for (var i = 0; i < tableErrorCheckData.length; i++) |
|
| 174 |
+ {
|
|
| 175 |
+ if (tableErrorCheckData[i] == sVal) {
|
|
| 176 |
+ isDuplicate = true; |
|
| 177 |
+ } |
|
| 178 |
+ } |
|
| 179 |
+ |
|
| 180 |
+ if (isDuplicate) {
|
|
| 181 |
+ return; |
|
| 182 |
+ } |
|
| 183 |
+ else {
|
|
| 184 |
+ tableErrorCheckData.push(sVal); |
|
| 185 |
+ } |
|
| 186 |
+ } |
|
| 187 |
+ } |
|
| 188 |
+ |
|
| 189 |
+ |
|
| 190 |
+ |
|
| 191 |
+ |
|
| 192 |
+}); |
|
| 193 |
+ |
|
| 194 |
+ |
|
| 195 |
+ |
|
| 196 |
+//############################################################################################# |
|
| 197 |
+//등록 |
|
| 198 |
+//############################################################################################# |
|
| 199 |
+ |
|
| 200 |
+//등록 |
|
| 201 |
+$(document).on('click', '#btnAddrMassReg', function() {
|
|
| 202 |
+ // 저장 |
|
| 203 |
+ SetAddrMassSave(); |
|
| 204 |
+}); |
|
| 205 |
+ |
|
| 206 |
+$(document).on('click', '#btnAddrMassClose', function() {
|
|
| 207 |
+ // 대량등록 닫기 |
|
| 208 |
+ setAddrMassClose(); |
|
| 209 |
+}); |
|
| 210 |
+ |
|
| 211 |
+// 대량등록 닫기 |
|
| 212 |
+function setAddrMassClose() {
|
|
| 213 |
+ var $objTabul = fn_utils_getTabulator(); |
|
| 214 |
+ $objTabul.clearData(); |
|
| 215 |
+ |
|
| 216 |
+ fn_rowDataClear(); |
|
| 217 |
+ |
|
| 218 |
+ |
|
| 219 |
+ $("#rowTotCnt").text(0); //총건수 수정
|
|
| 220 |
+ $("#rowDupCnt").text(0); //중복건수 수정
|
|
| 221 |
+ $("#rowErrorCnt").text(0); //중복건수 수정
|
|
| 222 |
+ |
|
| 223 |
+ |
|
| 224 |
+ |
|
| 225 |
+ dupliPhoneDataRealList.length = 0; // 중복 휴대폰번호 초기화 |
|
| 226 |
+ addrMassDupliSaveList = null; |
|
| 227 |
+ |
|
| 228 |
+ $("#btnAddrMassDupli").hide();
|
|
| 229 |
+ $("#btnAddrMassSaveDupli").hide();
|
|
| 230 |
+ |
|
| 231 |
+ //location.reload(); |
|
| 232 |
+ listAddrGrp(); |
|
| 233 |
+ addrGroupLoadAjax(); |
|
| 234 |
+ addrLoadAjax(); |
|
| 235 |
+ fn_errorPopClean(); // 에러 팝업 초기화 |
|
| 236 |
+} |
|
| 237 |
+ |
|
| 238 |
+// 주소록 탭마다 돌면서 총, 중복, 오류 건수 초기화 |
|
| 239 |
+function fn_rowDataClear(){
|
|
| 240 |
+ |
|
| 241 |
+ // 모든 .tab 요소를 선택하여 반복 |
|
| 242 |
+ $('#tbTabl .tab').each(function() {
|
|
| 243 |
+ // 현재 반복 중인 요소 |
|
| 244 |
+ var tab = $(this); |
|
| 245 |
+ |
|
| 246 |
+ // data-tabul 값 가져오기 |
|
| 247 |
+ var tabulNm = tab.data('tabul');
|
|
| 248 |
+ var tabluC = '.'+tabulNm |
|
| 249 |
+ |
|
| 250 |
+ // 중복 카운트 |
|
| 251 |
+ $(tabluC+" #rowTotCnt").text(0); |
|
| 252 |
+ // 에러 카운트 |
|
| 253 |
+ $(tabluC+" #rowDupCnt").text(0); |
|
| 254 |
+ // |
|
| 255 |
+ $(tabluC+" #rowErrorCnt").text(0); |
|
| 256 |
+ |
|
| 257 |
+ |
|
| 258 |
+ }); |
|
| 259 |
+} |
|
| 260 |
+ |
|
| 261 |
+ |
|
| 262 |
+ |
|
| 263 |
+// 주소록 그룹 중복체크 |
|
| 264 |
+function getAddrGroupDuplCheckAjax(addrGrpNm) {
|
|
| 265 |
+ var isReturn = true; |
|
| 266 |
+ |
|
| 267 |
+ $.ajax({
|
|
| 268 |
+ url : "<c:url value='/web/addr/getAddrGroupDuplCheckAjax.do' />", |
|
| 269 |
+ type : 'POST', |
|
| 270 |
+ data : {"addrGrpNm" : addrGrpNm},
|
|
| 271 |
+ dataType:'json', |
|
| 272 |
+ async: false, // 동기 |
|
| 273 |
+ success : function(data, status){
|
|
| 274 |
+ if(data.isSuccess == true) {
|
|
| 275 |
+ if(data.isDupl == true) {
|
|
| 276 |
+ //alert("중복된 그룹명입니다.");
|
|
| 277 |
+ isReturn = false; |
|
| 278 |
+ } |
|
| 279 |
+ } |
|
| 280 |
+ else {
|
|
| 281 |
+ //alert("Message : " + msg);
|
|
| 282 |
+ } |
|
| 283 |
+ }, |
|
| 284 |
+ error: function (e) {
|
|
| 285 |
+ //alert("주소록 중복체크에 실패했습니다.");
|
|
| 286 |
+ } |
|
| 287 |
+ }); |
|
| 288 |
+ console.log('isReturn : ', isReturn);
|
|
| 289 |
+ |
|
| 290 |
+ return isReturn; |
|
| 291 |
+} |
|
| 292 |
+ |
|
| 293 |
+ |
|
| 294 |
+//저장 |
|
| 295 |
+function SetAddrMassSave(){
|
|
| 296 |
+ |
|
| 297 |
+ |
|
| 298 |
+ |
|
| 299 |
+ |
|
| 300 |
+ |
|
| 301 |
+ |
|
| 302 |
+ |
|
| 303 |
+ |
|
| 304 |
+ |
|
| 305 |
+ var $objTabul = fn_utils_getTabulator(); |
|
| 306 |
+ var tabulNm = fn_utils_getTabulatorNm(); |
|
| 307 |
+ var tabluC = '.'+tabulNm |
|
| 308 |
+ |
|
| 309 |
+ /* console.log('$objTabul : ', $objTabul.getData());
|
|
| 310 |
+ if(tabulNm == 'tableSelf'){
|
|
| 311 |
+ console.log('????');
|
|
| 312 |
+ |
|
| 313 |
+ var allRows = $objTabul.getData(); // 테이블의 모든 데이터를 가져옴 |
|
| 314 |
+ |
|
| 315 |
+ // addrPhoneNo 값이 있는 행만 필터링 |
|
| 316 |
+ var rowsWithPhoneNumbers = allRows.filter(function(row) {
|
|
| 317 |
+ return row.addrPhoneNo && row.addrPhoneNo.trim() !== ''; // 값이 존재하고 공백이 아닌 경우 |
|
| 318 |
+ }); |
|
| 319 |
+ $objTabul = rowsWithPhoneNumbers; |
|
| 320 |
+ console.log('rowsWithPhoneNumbers : ', rowsWithPhoneNumbers);
|
|
| 321 |
+ console.log('$objTabul : ', $objTabul.getData());
|
|
| 322 |
+ return false; |
|
| 323 |
+ } */ |
|
| 324 |
+ |
|
| 325 |
+ if($objTabul.getData().length < 1){
|
|
| 326 |
+ alert("한 개 이상의 연락처를 입력하세요");
|
|
| 327 |
+ return false; |
|
| 328 |
+ } |
|
| 329 |
+ |
|
| 330 |
+ if($objTabul.getData().length > 300000){
|
|
| 331 |
+ alert("30만개 까지 등록 가능합니다.");
|
|
| 332 |
+ return false; |
|
| 333 |
+ } |
|
| 334 |
+ |
|
| 335 |
+// var selectMassVal = $(tabluC+" #addrGrpIdInfo option:selected").val(); |
|
| 336 |
+ |
|
| 337 |
+ var loginVO = '${LoginVO}';
|
|
| 338 |
+ if(fn_utils_isEmpty(loginVO)){
|
|
| 339 |
+ alert("로그인 후 이용이 가능합니다.");
|
|
| 340 |
+ return false; |
|
| 341 |
+ } |
|
| 342 |
+ |
|
| 343 |
+ // tableExcel select 요소들을 확인 |
|
| 344 |
+ var columns = $objTabul.getColumns(); |
|
| 345 |
+ var isAddrPhoneNoSelected = columns.some(column => column.getField() === 'addrPhoneNo'); |
|
| 346 |
+ if (!isAddrPhoneNoSelected) {
|
|
| 347 |
+// isPhoneSelected = true; |
|
| 348 |
+ alert('휴대폰이 선택되지 않았습니다.');
|
|
| 349 |
+ return false; |
|
| 350 |
+ |
|
| 351 |
+ } |
|
| 352 |
+ |
|
| 353 |
+ // 주소록이 새로생성이면 새로운 주소록명이 있는지 확인 |
|
| 354 |
+ if ($(tabluC+" #addrGrpIdInfo option:selected").val() == "NEW" |
|
| 355 |
+ && ($(tabluC+" #addrGrpNm").val() == "" |
|
| 356 |
+ || $(tabluC+" #addrGrpNm").val() == null |
|
| 357 |
+ || $(tabluC+" #addrGrpNm").val() == undefined) |
|
| 358 |
+ ) |
|
| 359 |
+ {
|
|
| 360 |
+ alert("저장할 그룹을 선택하거나 새 그룹명을 입력해주세요.");
|
|
| 361 |
+ $(tabluC+" #addrGrpNm").focus(); |
|
| 362 |
+ return false; |
|
| 363 |
+ } |
|
| 364 |
+ |
|
| 365 |
+ // 새 그룹명 중복체크 |
|
| 366 |
+ if ($(tabluC+" #addrGrpIdInfo option:selected").val() == "NEW" |
|
| 367 |
+ && $(tabluC+" #addrGrpNm").val() != "") |
|
| 368 |
+ {
|
|
| 369 |
+ var addrGrpNm = $(tabluC+" #addrGrpNm").val(); |
|
| 370 |
+ console.log('addrGrpNm : ', addrGrpNm);
|
|
| 371 |
+ //주소록 중복체크 |
|
| 372 |
+ if (getAddrGroupDuplCheckAjax(addrGrpNm) == false) {
|
|
| 373 |
+ alert("중복된 그룹명입니다. 새 그룹명을 입력해주세요.");
|
|
| 374 |
+ return false; |
|
| 375 |
+ } |
|
| 376 |
+ } |
|
| 377 |
+ |
|
| 378 |
+ var confirmMsg = "저장하시겠습니까?\n이름 200byte, [*1*]~[*4*] 200byte, 메모 250byte 초과 글자는 절사됩니다."; |
|
| 379 |
+ if (confirm(confirmMsg)) {
|
|
| 380 |
+ //로딩창 show |
|
| 381 |
+ fn_loadAddActive(); |
|
| 382 |
+ |
|
| 383 |
+ setTimeout(setSenderList_advc, 1000); |
|
| 384 |
+// setTimeout(setSenderList_old, 1000); |
|
| 385 |
+ |
|
| 386 |
+ } |
|
| 387 |
+} |
|
| 388 |
+/* |
|
| 389 |
+// 주소록 등록 old |
|
| 390 |
+function setSenderList_old(){
|
|
| 391 |
+ |
|
| 392 |
+ // tab에 해당하는 타블레이터 가져오기 |
|
| 393 |
+ |
|
| 394 |
+ var tabulNm = fn_utils_getTabulatorNm(); |
|
| 395 |
+ var tabluC = '.'+tabulNm |
|
| 396 |
+ |
|
| 397 |
+ var $objTabul = fn_utils_getTabulator(); |
|
| 398 |
+ var dataToSend = $objTabul.getData(); |
|
| 399 |
+ var addrGrpIdInfo = $(tabluC+" #addrGrpIdInfo option:selected").val(); |
|
| 400 |
+ var addrGrpNmInfo = $(tabluC+" #addrGrpNm").val(); |
|
| 401 |
+ |
|
| 402 |
+ var updateData = dataToSend.map(row => {
|
|
| 403 |
+ row.addrGrpId = addrGrpIdInfo; |
|
| 404 |
+ row.addrGrpNm = addrGrpNmInfo; |
|
| 405 |
+ return row; |
|
| 406 |
+ }); |
|
| 407 |
+ |
|
| 408 |
+ console.log('updateData : ', updateData);
|
|
| 409 |
+ $.ajax({
|
|
| 410 |
+ type: "POST", |
|
| 411 |
+ url: "/web/mjon/addr/addrMassInsertByTempAjax_advc.do", |
|
| 412 |
+ data: JSON.stringify(updateData), |
|
| 413 |
+ dataType: 'json', |
|
| 414 |
+ contentType: 'application/json', |
|
| 415 |
+ async: true, |
|
| 416 |
+ success: function (data) {
|
|
| 417 |
+ console.log('data : ', data);
|
|
| 418 |
+ |
|
| 419 |
+ |
|
| 420 |
+ if (data.status == 'OK') {
|
|
| 421 |
+ alert(data.message); |
|
| 422 |
+ // 데이터 비우기 |
|
| 423 |
+ SetClear($objTabul); |
|
| 424 |
+ setAddrMassClose(); |
|
| 425 |
+ var selectMassVal = $("#addrGrpIdInfo option:selected").val();
|
|
| 426 |
+ } |
|
| 427 |
+ else {
|
|
| 428 |
+ alert("오류 알림 : :: "+data.message);
|
|
| 429 |
+ } |
|
| 430 |
+ }, |
|
| 431 |
+ error: function (e) {
|
|
| 432 |
+ alert("저장에 실패하였습니다.");
|
|
| 433 |
+ alert("ERROR : " + JSON.stringify(e));
|
|
| 434 |
+ }, |
|
| 435 |
+ beforeSend : function(xmlHttpRequest) {
|
|
| 436 |
+ //로딩창 show |
|
| 437 |
+ $('.loading_layer').addClass('active');
|
|
| 438 |
+ }, |
|
| 439 |
+ complete : function(xhr, textStatus) {
|
|
| 440 |
+ //로딩창 hide |
|
| 441 |
+ $('.loading_layer').removeClass('active');
|
|
| 442 |
+ } |
|
| 443 |
+ }); |
|
| 444 |
+} |
|
| 445 |
+ */ |
|
| 446 |
+ |
|
| 447 |
+function setSenderList_advc(){
|
|
| 448 |
+ |
|
| 449 |
+ var tabulNm = fn_utils_getTabulatorNm(); |
|
| 450 |
+ var tabluC = '.'+tabulNm |
|
| 451 |
+ |
|
| 452 |
+ var $objTabul = fn_utils_getTabulator(); |
|
| 453 |
+ var dataToSend = $objTabul.getData(); |
|
| 454 |
+ console.log('dataToSend : ', dataToSend);
|
|
| 455 |
+ var addrGrpIdInfo = $(tabluC+" #addrGrpIdInfo option:selected").val(); |
|
| 456 |
+ var addrGrpNmInfo = $(tabluC+" #addrGrpNm").val(); |
|
| 457 |
+ |
|
| 458 |
+ var batchSize = 30000; // 배치 크기 |
|
| 459 |
+ var totalBatches = Math.ceil(dataToSend.length / batchSize); // 총 배치 수 |
|
| 460 |
+ var currentBatch = 0; // 현재 배치 인덱스 |
|
| 461 |
+ |
|
| 462 |
+ |
|
| 463 |
+ fn_loadAddActive(); |
|
| 464 |
+ |
|
| 465 |
+ function sendBatch() {
|
|
| 466 |
+ if (currentBatch < totalBatches) {
|
|
| 467 |
+ fn_loadAddActive(); |
|
| 468 |
+ var start = currentBatch * batchSize; |
|
| 469 |
+ var end = Math.min(start + batchSize, dataToSend.length); |
|
| 470 |
+ var batchData = dataToSend.slice(start, end); |
|
| 471 |
+ |
|
| 472 |
+ var updateData = batchData.map(row => {
|
|
| 473 |
+ row.addrGrpId = addrGrpIdInfo; |
|
| 474 |
+ row.addrGrpNm = addrGrpNmInfo; |
|
| 475 |
+ return row; |
|
| 476 |
+ }); |
|
| 477 |
+ |
|
| 478 |
+ $.ajax({
|
|
| 479 |
+ type: "POST", |
|
| 480 |
+ url: "/web/mjon/addr/addrMassInsertByTempAjax_advc.do", |
|
| 481 |
+ data: JSON.stringify(updateData), |
|
| 482 |
+ dataType: 'json', |
|
| 483 |
+ contentType: 'application/json', |
|
| 484 |
+ async: true, |
|
| 485 |
+ success: function (data) {
|
|
| 486 |
+ |
|
| 487 |
+ |
|
| 488 |
+ fn_loadRemoveActive(); |
|
| 489 |
+ |
|
| 490 |
+ console.log('Batch ' + (currentBatch + 1) + ' success: ', data);
|
|
| 491 |
+ if (data.status == 'OK') {
|
|
| 492 |
+ if (currentBatch === totalBatches - 1) {
|
|
| 493 |
+ alert("모든 데이터가 성공적으로 저장되었습니다.");
|
|
| 494 |
+ // 데이터 비우기 |
|
| 495 |
+ SetClear($objTabul); |
|
| 496 |
+ setAddrMassClose(); |
|
| 497 |
+ } else {
|
|
| 498 |
+ currentBatch++; |
|
| 499 |
+ // 새로만든 그룹ID나 기존 ID를 넣어줌 |
|
| 500 |
+ // 그룹추가 시 배치별로 똑같은 그룹을 생성해서 방지차원으로 넣어줌 |
|
| 501 |
+ addrGrpIdInfo = data.object; |
|
| 502 |
+ sendBatch(); // 다음 배치 전송 |
|
| 503 |
+ } |
|
| 504 |
+ } else {
|
|
| 505 |
+ alert("오류 알림 : " + data.message);
|
|
| 506 |
+ } |
|
| 507 |
+ }, |
|
| 508 |
+ error: function (e) {
|
|
| 509 |
+ alert("배치 전송에 실패하였습니다.");
|
|
| 510 |
+ console.error("ERROR: ", JSON.stringify(e));
|
|
| 511 |
+ }, |
|
| 512 |
+ beforeSend: function(xmlHttpRequest) {
|
|
| 513 |
+ }, |
|
| 514 |
+ complete: function(xhr, textStatus) {
|
|
| 515 |
+ if (currentBatch === totalBatches - 1) {
|
|
| 516 |
+ $('#lodingTxt').text('Loading');
|
|
| 517 |
+ } else {
|
|
| 518 |
+ $('#lodingTxt').text(end+'...');
|
|
| 519 |
+ } |
|
| 520 |
+ } |
|
| 521 |
+ }); |
|
| 522 |
+ } |
|
| 523 |
+ } |
|
| 524 |
+ // 첫 번째 배치 전송 시작 |
|
| 525 |
+ sendBatch(); |
|
| 526 |
+} |
|
| 527 |
+ |
|
| 528 |
+ |
|
| 529 |
+ |
|
| 530 |
+//주소록그룹 콤보박스 유지 |
|
| 531 |
+function setSelectMassSetting(selectMassVal) {
|
|
| 532 |
+ $("#addrGrpIdInfo").val(selectMassVal).prop("selected", true);
|
|
| 533 |
+} |
|
| 534 |
+ |
|
| 535 |
+ |
|
| 536 |
+//데이터 비우기 |
|
| 537 |
+function SetClear($objTabul) {
|
|
| 538 |
+ |
|
| 539 |
+ |
|
| 540 |
+ var tabulNm = fn_utils_getTabulatorNm(); |
|
| 541 |
+ var tabluC = '.'+tabulNm |
|
| 542 |
+ |
|
| 543 |
+ $(tabluC+" #addrGrpNm").val(""); // 새그룹명 Clear;
|
|
| 544 |
+ // 주소록 그룹정보 불러오기 |
|
| 545 |
+ getAddrGroupList(); |
|
| 546 |
+ |
|
| 547 |
+ |
|
| 548 |
+ |
|
| 549 |
+ if (tabulNm === 'tableSelf') {
|
|
| 550 |
+ var tableData = []; |
|
| 551 |
+ for (var i = 0; i < 1000; i++) {
|
|
| 552 |
+ tableData.push({addrNm: "", addrPhoneNo: "", addrInfo1: "", addrInfo2: "", addrInfo3: "", addrInfo4: "", addrComment: ""});
|
|
| 553 |
+ } |
|
| 554 |
+ console.log(tableData); // 데이터 출력 확인 |
|
| 555 |
+ fn_selfmakeTable() |
|
| 556 |
+ }else{
|
|
| 557 |
+ $objTabul.clearData(); // clearData는 동기 방식이므로 바로 실행 |
|
| 558 |
+ |
|
| 559 |
+ } |
|
| 560 |
+// console.log('tabulNm : ', tabulNm);
|
|
| 561 |
+// console.log('tabulNm : ', tabulNm.trim());
|
|
| 562 |
+ |
|
| 563 |
+ |
|
| 564 |
+ $(tabluC+" #rowTotCnt").text(0); //총건수 수정 |
|
| 565 |
+ $(tabluC+" #rowDupCnt").text(0); //중복건수 수정 |
|
| 566 |
+ |
|
| 567 |
+ // popup 영역 |
|
| 568 |
+ fn_errorPopClean(); |
|
| 569 |
+} |
|
| 570 |
+ |
|
| 571 |
+// 주소 대량등록 버튼 클릭 |
|
| 572 |
+// AddrListAjax.jsp에서 호출 |
|
| 573 |
+$(document).on('click', '#btnAddrMassRegCall', function() {
|
|
| 574 |
+ getAddrGroupList(); |
|
| 575 |
+}); |
|
| 576 |
+ |
|
| 577 |
+ |
|
| 578 |
+// 주소록 그룹정보 불러오기 |
|
| 579 |
+function getAddrGroupList() {
|
|
| 580 |
+ $.ajax({
|
|
| 581 |
+ type : "POST", |
|
| 582 |
+ async : false, |
|
| 583 |
+ url : "/web/mjon/addr/addrGroupListAjax.do", |
|
| 584 |
+ data : {},
|
|
| 585 |
+ dataType:'json', |
|
| 586 |
+ success : function(data) {
|
|
| 587 |
+ //alert(JSON.stringify(data.addrGroupList)); |
|
| 588 |
+ |
|
| 589 |
+ // Show Html |
|
| 590 |
+ getAddrGroupListShow(data.addrGroupList); |
|
| 591 |
+ }, |
|
| 592 |
+ error : function(xhr, status, error) {
|
|
| 593 |
+ alert(error); |
|
| 594 |
+ return false; |
|
| 595 |
+ } |
|
| 596 |
+ }); |
|
| 597 |
+} |
|
| 598 |
+ |
|
| 599 |
+ |
|
| 600 |
+ |
|
| 601 |
+ |
|
| 602 |
+// 그룹데이터 노출 |
|
| 603 |
+function getAddrGroupListShow(jsonList) {
|
|
| 604 |
+ var sHtml = ""; |
|
| 605 |
+ sHtml += "<option value='NEW'>그룹추가</option>"; |
|
| 606 |
+ sHtml += "<option value='0'>그룹미지정</option>"; |
|
| 607 |
+ sHtml += "<option value='bookmark'>자주보내는 번호</option>"; |
|
| 608 |
+ for (var j = 0; j < jsonList.length; j++) {
|
|
| 609 |
+ sHtml += " <option value='" + $.trim(jsonList[j].addrGrpId) + "' />" + $.trim(jsonList[j].addrGrpNm) + "</option>"; |
|
| 610 |
+ } |
|
| 611 |
+ |
|
| 612 |
+ var tabulNm = fn_utils_getTabulatorNm(); |
|
| 613 |
+ var tabluC = '.'+tabulNm |
|
| 614 |
+ $(tabluC+" #addrGrpIdInfo").html(sHtml); |
|
| 615 |
+} |
|
| 616 |
+ |
|
| 617 |
+$(document).on('change', '#addrGrpIdInfo', function() {
|
|
| 618 |
+ if ($("#addrGrpIdInfo option:selected").val() != "NEW") {
|
|
| 619 |
+ $("#addrGrpNm").val(""); // 새그룹명 Clear;
|
|
| 620 |
+ } |
|
| 621 |
+}); |
|
| 622 |
+ |
|
| 623 |
+//############################################################################################# |
|
| 624 |
+//파일 불러오기 |
|
| 625 |
+//############################################################################################# |
|
| 626 |
+ |
|
| 627 |
+//체크박스 전체선택/해제 |
|
| 628 |
+$(document).on("click", "#chkAll", function(e) {
|
|
| 629 |
+ var isChecked = $(this).is(":checked");
|
|
| 630 |
+ $("input[name=addrCheck]:checkbox").prop("checked", isChecked);
|
|
| 631 |
+}); |
|
| 632 |
+ |
|
| 633 |
+$(document).on("click", "#duplicationChkAll", function(e) {
|
|
| 634 |
+ var isChecked = $(this).is(":checked");
|
|
| 635 |
+ $("input[name=addrCheck]:checkbox").prop("checked", isChecked);
|
|
| 636 |
+}); |
|
| 637 |
+ |
|
| 638 |
+//팝업 텍스트 더보기 클릭 시 펼쳐지고 숨겨짐 |
|
| 639 |
+function popMore(e){
|
|
| 640 |
+ $(e).closest(".pop_more_cont").toggleClass("pop_more_click");
|
|
| 641 |
+ |
|
| 642 |
+ if($(e).closest(".pop_more_cont").is(".pop_more_click")){
|
|
| 643 |
+ $(e).html('숨기기');
|
|
| 644 |
+ $(e).append('<i></i>');
|
|
| 645 |
+ }else {
|
|
| 646 |
+ $(e).html('더보기');
|
|
| 647 |
+ $(e).append('<i></i>');
|
|
| 648 |
+ } |
|
| 649 |
+} |
|
| 650 |
+ |
|
| 651 |
+/* 윈도우팝업 열기 */ |
|
| 652 |
+function infoPop(pageUrl){
|
|
| 653 |
+ document.popForm.pageType.value = pageUrl; |
|
| 654 |
+ document.popForm.action = "/web/pop/infoPop.do"; |
|
| 655 |
+ document.popForm.method = "post"; |
|
| 656 |
+ window.open("about:blank", 'infoPop', 'width=790, height=430, top=100, left=100, fullscreen=no, menubar=no, status=no, toolbar=no, titlebar=yes, location=no, scrollbars=1');
|
|
| 657 |
+ document.popForm.target = "infoPop"; |
|
| 658 |
+ document.popForm.submit(); |
|
| 659 |
+} |
|
| 660 |
+ |
|
| 661 |
+// 중복 연락처 |
|
| 662 |
+function GetAddrMassDupli() {
|
|
| 663 |
+ var sHtml = ""; |
|
| 664 |
+ sHtml += "<div class='' style='overflow-x:auto; height:350px;'>"; |
|
| 665 |
+ sHtml += "<table class='tType4'>"; |
|
| 666 |
+ sHtml += " <colgroup>"; |
|
| 667 |
+ sHtml += " <col style='width:auto' />"; |
|
| 668 |
+ sHtml += " </colgroup>"; |
|
| 669 |
+ sHtml += " <thead>"; |
|
| 670 |
+ sHtml += " <tr>"; |
|
| 671 |
+ sHtml += " <th>중복 휴대폰번호 (" + numberWithCommas(dupliPhoneDataRealList.length) + "개)</th>";
|
|
| 672 |
+ sHtml += " </tr>"; |
|
| 673 |
+ sHtml += " </thead>"; |
|
| 674 |
+ sHtml += " <tbody>"; |
|
| 675 |
+ for (var i = 0; i < dupliPhoneDataRealList.length; i++) {
|
|
| 676 |
+ sHtml += " <tr>"; |
|
| 677 |
+ sHtml += " <td>" + dupliPhoneDataRealList[i] + "</td>"; |
|
| 678 |
+ sHtml += " </tr>"; |
|
| 679 |
+ } |
|
| 680 |
+ sHtml += " </tbody>"; |
|
| 681 |
+ sHtml += " </table>"; |
|
| 682 |
+ sHtml += " </div>"; |
|
| 683 |
+ |
|
| 684 |
+ $("#addrMassDupli_layer").html(sHtml);
|
|
| 685 |
+} |
|
| 686 |
+ |
|
| 687 |
+//중복 연락처 => 저장시 |
|
| 688 |
+function GetAddrMassSaveDupli() {
|
|
| 689 |
+ var sHtml = ""; |
|
| 690 |
+ sHtml += "<div class='' style='overflow-x:auto; height:350px;'>"; |
|
| 691 |
+ sHtml += "<table class='tType4'>"; |
|
| 692 |
+ sHtml += " <colgroup>"; |
|
| 693 |
+ sHtml += " <col style='width:auto' />"; |
|
| 694 |
+ sHtml += " </colgroup>"; |
|
| 695 |
+ sHtml += " <thead>"; |
|
| 696 |
+ sHtml += " <tr>"; |
|
| 697 |
+ sHtml += " <th>중복 휴대폰번호 (" + numberWithCommas(addrMassDupliSaveList.length) + "개)</th>";
|
|
| 698 |
+ sHtml += " </tr>"; |
|
| 699 |
+ sHtml += " </thead>"; |
|
| 700 |
+ sHtml += " <tbody>"; |
|
| 701 |
+ for (var i = 0; i < addrMassDupliSaveList.length; i++) {
|
|
| 702 |
+ sHtml += " <tr>"; |
|
| 703 |
+ sHtml += " <td>" + addrMassDupliSaveList[i].addrPhoneNo + "</td>"; |
|
| 704 |
+ sHtml += " </tr>"; |
|
| 705 |
+ } |
|
| 706 |
+ sHtml += " </tbody>"; |
|
| 707 |
+ sHtml += " </table>"; |
|
| 708 |
+ sHtml += " </div>"; |
|
| 709 |
+ |
|
| 710 |
+ $("#addrMassSaveDupli_layer").html(sHtml);
|
|
| 711 |
+} |
|
| 712 |
+ |
|
| 713 |
+ |
|
| 714 |
+// function fn_tabToggle('1')
|
|
| 715 |
+function fn_tabToggle(tabNum){
|
|
| 716 |
+ var tabId = '#tab'+tabNum; |
|
| 717 |
+ $('.tab_c').hide();
|
|
| 718 |
+ $(tabId).show(); |
|
| 719 |
+ getAddrGroupList(); |
|
| 720 |
+} |
|
| 721 |
+ |
|
| 722 |
+ |
|
| 723 |
+</script> |
|
| 724 |
+ |
|
| 725 |
+<div class="loading_layer"> |
|
| 726 |
+ <div class="loading_container"> |
|
| 727 |
+ <div class="bar"></div> |
|
| 728 |
+ <div class="text" id="lodingTxt"> |
|
| 729 |
+ Loading |
|
| 730 |
+ </div> |
|
| 731 |
+ </div> |
|
| 732 |
+</div> |
|
| 733 |
+ |
|
| 734 |
+<div id="adrPopup_tab1"> |
|
| 735 |
+ |
|
| 736 |
+ |
|
| 737 |
+<!-- 수신거부 대량등록 data-tooltip:adr_popup01 --> |
|
| 738 |
+ <form id="addrMassForm" name="addrMassForm" method="post"> |
|
| 739 |
+ <input type="hidden" id="phoneList" name="phoneList" value=""/> |
|
| 740 |
+ <input type="hidden" id="nameList" name="nameList" value=""/> |
|
| 741 |
+ <input type="hidden" id="info1List" name="info1List" value=""/> |
|
| 742 |
+ <input type="hidden" id="info2List" name="info2List" value=""/> |
|
| 743 |
+ <input type="hidden" id="info3List" name="info3List" value=""/> |
|
| 744 |
+ <input type="hidden" id="info4List" name="info4List" value=""/> |
|
| 745 |
+ <input type="hidden" id="memoList" name="memoList" value=""/> |
|
| 746 |
+ <input type="hidden" id="addrGrpId" name="addrGrpId" value=""/> |
|
| 747 |
+ <div class="tooltip-wrap" id="addrMassLoad"> |
|
| 748 |
+ <div class="popup-com adr_layer adr_popup01" tabindex="0" data-tooltip-con="adr_popup01" data-focus="adr_popup01" data-focus-prev="adr_popup01-close" style="width: 1000px;"> |
|
| 749 |
+ <div class="popup_heading"> |
|
| 750 |
+ <p>주소록 대량등록</p> |
|
| 751 |
+ <button type="button" class="tooltip-close" data-focus="adr_popup01-close" onclick="setAddrMassClose();"><img src="/publish/images/content/layerPopup_close.png" alt="팝업 닫기"></button> |
|
| 752 |
+ </div> |
|
| 753 |
+ <div class="layer_in" style="padding: 25px 30px;"> |
|
| 754 |
+ <div class="list_tab_wrap2"> |
|
| 755 |
+ <!-- tab button --> |
|
| 756 |
+ <ul class="list_tab" id="tbTabl"> |
|
| 757 |
+ <li class="tab active" data-tabul="tableExcel"><button type="button" onclick="popupTab(this,'1'); fn_tabToggle('1');">엑셀입력</button></li>
|
|
| 758 |
+ <li class="tab" data-tabul="tableClip"><button type="button" onclick="popupTab(this,'2'); fn_tabToggle('2');">붙여넣기</button></li>
|
|
| 759 |
+ <li class="tab" data-tabul="tableSelf"><button type="button" onclick="popupTab(this,'3'); fn_tabToggle('3');">직접입력</button></li>
|
|
| 760 |
+ </ul><!--// tab button --> |
|
| 761 |
+ </div> |
|
| 762 |
+ <div id="tab1" class="tab_c tableExcel"> |
|
| 763 |
+ <%@include file="/WEB-INF/jsp/web/addr/include/addrListforExcel.jsp" %> |
|
| 764 |
+ </div> |
|
| 765 |
+ <div id="tab2" class="tab_c tableClip" style="display: none;"> |
|
| 766 |
+ <%@include file="/WEB-INF/jsp/web/addr/include/addrListforClipboard.jsp" %> |
|
| 767 |
+ </div> |
|
| 768 |
+ <div id="tab3" class="tab_c tableSelf" style="display: none;"> |
|
| 769 |
+ <%@include file="/WEB-INF/jsp/web/addr/include/addrListforSelf.jsp" %> |
|
| 770 |
+ </div> |
|
| 771 |
+ <div class="popup_btn_wrap2" style="margin: 0 auto 30px auto;"> |
|
| 772 |
+ <button type="button" id="btnAddrMassReg">등록</button> |
|
| 773 |
+ <button type="button" id="btnAddrMassClose" class="tooltip-close" data-focus="adr_popup01-close" data-focus-next="popup02">닫기</button> |
|
| 774 |
+ </div> |
|
| 775 |
+ |
|
| 776 |
+ </div> |
|
| 777 |
+ </div> |
|
| 778 |
+ </div> |
|
| 779 |
+ </form> |
|
| 780 |
+ |
|
| 781 |
+ |
|
| 782 |
+ |
|
| 783 |
+<!-- 주소록 상세 결과 팝업 data-tooltip:adr_popup14 --> |
|
| 784 |
+ <div class="tooltip-wrap"> |
|
| 785 |
+ <div class="popup-com adr_layer adr_popup14" tabindex="0" data-tooltip-con="adr_popup14" data-focus="adr_popup14" data-focus-prev="adr_popu14-close" style="width: 450px;"> |
|
| 786 |
+ <div class="popup_heading"> |
|
| 787 |
+ <p>주소록 상세 결과</p> |
|
| 788 |
+ <button type="button" class="tooltip-close" data-focus="adr_popup14-close"><img src="/publish/images/content/layerPopup_close.png" alt="팝업 닫기"></button> |
|
| 789 |
+ </div> |
|
| 790 |
+ <div class="layer_in" style="padding:30px 20px;"> |
|
| 791 |
+ <div class="table_top"> |
|
| 792 |
+ <p> |
|
| 793 |
+ 총 <span class="c_e40000" id="errorPopTotCnt">0</span>건 |
|
| 794 |
+ / 중복 <span class="c_002c9a" id="errorPopDupCnt">0</span>건 |
|
| 795 |
+ / 오류 <span class="c_002c9a" id="errorPopErrorCnt">0</span>건</p> |
|
| 796 |
+ <button type="button" class="excel_btn btnType" id="errorExcelBtn"><i class="downroad"></i>엑셀 다운로드</button> |
|
| 797 |
+ </div> |
|
| 798 |
+ <div class="tb_wrap adr_list" id="tabulator_error"> |
|
| 799 |
+ <!-- $tableError 참고 --> |
|
| 800 |
+ </div> |
|
| 801 |
+ <ul class="cf_text_ul"> |
|
| 802 |
+ <li>*중복번호는 하나의 번호만 등록됩니다.</li> |
|
| 803 |
+ <li>*휴대폰 형식에 맞지 않는 데이터는 삭제 후 업로드 됩니다.</li> |
|
| 804 |
+ <li>ex) 발송불가 특수문자, 자릿수 오류 등</li> |
|
| 805 |
+ </ul> |
|
| 806 |
+ <div class="popup_btn_wrap2"> |
|
| 807 |
+<!-- <button type="button">저장</button> --> |
|
| 808 |
+ <button type="button" class="tooltip-close" data-focus="adr_popup14-close" data-focus-next="adr_popup14">닫기</button> |
|
| 809 |
+ </div> |
|
| 810 |
+ </div> |
|
| 811 |
+ </div> |
|
| 812 |
+ </div> |
|
| 813 |
+ |
|
| 814 |
+</div> |
|
| 815 |
+<!--// 주소록 대량등록 팝업 --> |
|
| 816 |
+ |
|
| 817 |
+<div class="inner"> |
|
| 818 |
+ <!-- send top --> |
|
| 819 |
+ <div class="send_top"> |
|
| 820 |
+ <!-- tab button --> |
|
| 821 |
+ <ul class="tabType4"> |
|
| 822 |
+ <li class="tab active"><button type="button" onclick="TabType5(this,'1'); moveTab('addr');">주소록관리</button></li>
|
|
| 823 |
+ <li class="tab"><button type="button" onclick="TabType5(this,'2'); moveTab('fax');">팩스 주소록관리</button></li>
|
|
| 824 |
+ <li class="tab"><button type="button" onclick="TabType5(this,'3'); moveTab('block');">수신거부</button></li>
|
|
| 825 |
+ <li class="tab"><button type="button" onclick="TabType5(this,'4'); moveTab('addrMob');">폰주소록 등록</button></li>
|
|
| 826 |
+ <li class="tab"><button type="button" onclick="TabType5(this,'5'); moveTab('addrApply');">주소록 입력 대행(무료)</button></li>
|
|
| 827 |
+ </ul><!--// tab button --> |
|
| 828 |
+ <!-- 주소록 관리 - 주소록 관리 --> |
|
| 829 |
+ <div class="adr_cont current" id="tab5_1"> |
|
| 830 |
+ <div class="heading"> |
|
| 831 |
+ <h2>주소록 관리</h2> |
|
| 832 |
+ <button type="button" class="button info" onclick="infoPop('selectAddrList');">사용안내</button>
|
|
| 833 |
+ </div> |
|
| 834 |
+ <%--<div class="titBox"> |
|
| 835 |
+ <p>- 연락처를 그룹별로 분류하여 간편하고 편리하게 관리할 수 있습니다(최대 100,000개까지 등록 가능)</p> |
|
| 836 |
+ <p>- 그룹은 그룹 간 이동, 병합 및 복사가 가능합니다.</p> |
|
| 837 |
+ <p>- 주소록은 중복검사가 가능하며 중복된 연락처를 삭제할 수 있습니다. 단, 데이터 양에 따라 시간이 소요될 수 있습니다.</p> |
|
| 838 |
+ <p>- 주소록 관리에서 그룹 또는 연락처를 선택하여 문자를 바로 발송할 수 있습니다.</p> |
|
| 839 |
+ <p>- 주소록 내보내기를 통해 다른 ID로 주소록을 복사할 수 있습니다(그룹 전송만 가능, 보낸 주소록 결과는 최대 90일까지 보관)</p> |
|
| 840 |
+ <p>- 주소록 내보내기 시에는 개인정보보호를 위해 추가 휴대폰 인증을 실시하며, 휴대폰 인증은 등록된 발신번호로만 인증 가능합니다.</p> |
|
| 841 |
+ <p>- 고객님께서 보유하신 엑셀파일이나 텍스트파일 등으로 작성된 주소록을 대량 등록할 수 있습니다.</p> |
|
| 842 |
+ <p>- 주소록 등록이 어려우신 경우에는 주소록 입력대행 메뉴를 이용하시면 됩니다.</p> |
|
| 843 |
+ <p>- 주소록 무료대행은 신규 그룹으로 생성됩니다(기존 그룹 수정 불가)</p> |
|
| 844 |
+ </div>--%> |
|
| 845 |
+ |
|
| 846 |
+ <div class="adr1"> |
|
| 847 |
+ <!-- 왼쪽 영역 --> |
|
| 848 |
+ <div class="adr1_left" id="adr1_left"></div> |
|
| 849 |
+ <!-- 오른쪽 영역 --> |
|
| 850 |
+ <div class="adr1_right" id="adr1_right"> |
|
| 851 |
+ </div> |
|
| 852 |
+ </div> |
|
| 853 |
+ </div> |
|
| 854 |
+ </div><!--// 주소록 관리 - 주소록 관리 --> |
|
| 855 |
+</div><!--// send top --> |
|
| 856 |
+ |
|
| 857 |
+ |
|
| 858 |
+ |
|
| 859 |
+<!--=================================================================== --> |
|
| 860 |
+ |
|
| 861 |
+ |
|
| 862 |
+<form name="popForm" id="popForm" method="post"> |
|
| 863 |
+ <input type="hidden" name="pageType" id="pageType" value=""/> |
|
| 864 |
+</form> |
|
| 865 |
+ |
|
| 866 |
+<form name="msgAddrForm2" id="msgAddrForm2" method="post"> |
|
| 867 |
+ <input name="msgStartKeyword" id="msgStartKeyword" type="hidden" /> |
|
| 869 | 868 |
</form>(No newline at end of file) |
--- src/main/webapp/WEB-INF/jsp/web/addr/include/addrListforExcel.jsp
+++ src/main/webapp/WEB-INF/jsp/web/addr/include/addrListforExcel.jsp
... | ... | @@ -142,134 +142,7 @@ |
| 142 | 142 |
}); |
| 143 | 143 |
|
| 144 | 144 |
|
| 145 |
- |
|
| 146 |
- // 오류검사 항목 중복제거 |
|
| 147 |
- function SetTableErrorDupliCheck(sVal) {
|
|
| 148 |
- var isDuplicate = false; |
|
| 149 |
- if (tableErrorCheckData.length == 0) {
|
|
| 150 |
- tableErrorCheckData.push(sVal); |
|
| 151 |
- } |
|
| 152 |
- else {
|
|
| 153 |
- for (var i = 0; i < tableErrorCheckData.length; i++) |
|
| 154 |
- {
|
|
| 155 |
- if (tableErrorCheckData[i] == sVal) {
|
|
| 156 |
- isDuplicate = true; |
|
| 157 |
- } |
|
| 158 |
- } |
|
| 159 |
- |
|
| 160 |
- if (isDuplicate) {
|
|
| 161 |
- return; |
|
| 162 |
- } |
|
| 163 |
- else {
|
|
| 164 |
- tableErrorCheckData.push(sVal); |
|
| 165 |
- } |
|
| 166 |
- } |
|
| 167 |
- } |
|
| 168 | 145 |
|
| 169 |
- |
|
| 170 |
- // 오류검사 항목 중복제거 |
|
| 171 |
- function SetTableErrorDupliCheck(sVal) {
|
|
| 172 |
- var isDuplicate = false; |
|
| 173 |
- if (tableErrorCheckData.length == 0) {
|
|
| 174 |
- tableErrorCheckData.push(sVal); |
|
| 175 |
- } |
|
| 176 |
- else {
|
|
| 177 |
- for (var i = 0; i < tableErrorCheckData.length; i++) |
|
| 178 |
- {
|
|
| 179 |
- if (tableErrorCheckData[i] == sVal) {
|
|
| 180 |
- isDuplicate = true; |
|
| 181 |
- } |
|
| 182 |
- } |
|
| 183 |
- |
|
| 184 |
- if (isDuplicate) {
|
|
| 185 |
- return; |
|
| 186 |
- } |
|
| 187 |
- else {
|
|
| 188 |
- tableErrorCheckData.push(sVal); |
|
| 189 |
- } |
|
| 190 |
- } |
|
| 191 |
- } |
|
| 192 |
- |
|
| 193 |
- $('.check_validity').click(function(){
|
|
| 194 |
- tableErrorCheckData.length = 0; // 오류 번호 배열 초기화 |
|
| 195 |
- |
|
| 196 |
- var data = $tableExcel.getRows(); |
|
| 197 |
- var invalid = $tableExcel.getInvalidCells(); //오류 데이터 체크 |
|
| 198 |
- var dataLen = $tableExcel.getRows().length; //연락처 데이터 갯수 |
|
| 199 |
- var totLen = invalid.length; //오류 데이터 갯수 |
|
| 200 |
- var errMsg = ""; //최종 alert에 표시할 메시지 저장 변수 |
|
| 201 |
- |
|
| 202 |
- if(dataLen > 0) { //연락처 정보가 있으면 수행
|
|
| 203 |
- if(totLen > 0) { //내용에 오류가 있으면 수행
|
|
| 204 |
- //오류 데이터 값 저장 |
|
| 205 |
- for(var i=0; i < totLen; i++) {
|
|
| 206 |
- var cellValue = invalid[i].getValue(); |
|
| 207 |
- SetTableErrorDupliCheck(cellValue); |
|
| 208 |
- } |
|
| 209 |
- |
|
| 210 |
- for(var i=0; i < dataLen; i++){
|
|
| 211 |
- // 휴대폰번호 체크 |
|
| 212 |
- var phone = data[i].getData().phone; |
|
| 213 |
- var valiCheck = checkHpNum(phone); |
|
| 214 |
- if(!valiCheck){
|
|
| 215 |
- SetTableErrorDupliCheck(phone); |
|
| 216 |
- } |
|
| 217 |
- } |
|
| 218 |
- } |
|
| 219 |
- else {
|
|
| 220 |
- for(var i=0; i < dataLen; i++){
|
|
| 221 |
- // 휴대폰번호 체크 |
|
| 222 |
- var phone = data[i].getData().phone; |
|
| 223 |
- var valiCheck = checkHpNum(phone); |
|
| 224 |
- if(!valiCheck){
|
|
| 225 |
- SetTableErrorDupliCheck(phone); |
|
| 226 |
- } |
|
| 227 |
- } |
|
| 228 |
- } |
|
| 229 |
- } |
|
| 230 |
- else {
|
|
| 231 |
- alert("연락처를 입력해 주세요.");
|
|
| 232 |
- return false; |
|
| 233 |
- } |
|
| 234 |
- |
|
| 235 |
- if (tableErrorCheckData.length > 0) {
|
|
| 236 |
- for (var i = 0; i < tableErrorCheckData.length; i++) |
|
| 237 |
- {
|
|
| 238 |
- errMsg += tableErrorCheckData[i]; |
|
| 239 |
- if ((tableErrorCheckData.length - 1) > i) {
|
|
| 240 |
- errMsg += ", "; |
|
| 241 |
- } |
|
| 242 |
- } |
|
| 243 |
- alert(errMsg + "의 내용에 오류가 있습니다."); |
|
| 244 |
- } |
|
| 245 |
- else {
|
|
| 246 |
- alert("오류 데이터가 없습니다.");
|
|
| 247 |
- } |
|
| 248 |
- |
|
| 249 |
- return false; |
|
| 250 |
- }); |
|
| 251 |
- |
|
| 252 |
- |
|
| 253 |
- |
|
| 254 |
- //받는사람 중복 삭제 |
|
| 255 |
- $('.duple_del').click(function(){
|
|
| 256 |
- //기존 연락처 모두 불러오기 |
|
| 257 |
- var data = $tableExcel.getRows(); |
|
| 258 |
- var tableData = []; |
|
| 259 |
- var dpCnt = 0; |
|
| 260 |
- var totLen = $tableExcel.getRows().length; |
|
| 261 |
- |
|
| 262 |
- for(var i=0; i < totLen; i++){
|
|
| 263 |
- tableData.push({name: data[i].getData().name.trim(), phone: data[i].getData().phone.trim()});
|
|
| 264 |
- } |
|
| 265 |
- |
|
| 266 |
- var removeDuplData = dupliPhoneData(tableData); |
|
| 267 |
- $tableExcel.setData(removeDuplData); |
|
| 268 |
- |
|
| 269 |
- //총 받는사람 수 계산 |
|
| 270 |
- totRows = $tableExcel.getRows().length; |
|
| 271 |
- updateTotCnt(totRows); |
|
| 272 |
- }); |
|
| 273 | 146 |
|
| 274 | 147 |
|
| 275 | 148 |
}); |
--- src/main/webapp/WEB-INF/jsp/web/msgdata/include/msgDataIncludeExcel.jsp
+++ src/main/webapp/WEB-INF/jsp/web/msgdata/include/msgDataIncludeExcel.jsp
... | ... | @@ -331,6 +331,14 @@ |
| 331 | 331 |
|
| 332 | 332 |
function excelFileChange(file) {
|
| 333 | 333 |
if (file) {
|
| 334 |
+ |
|
| 335 |
+ // 파일 크기 체크 (20MB) |
|
| 336 |
+ const maxSize = 20 * 1024 * 1024; // 20MB in bytes |
|
| 337 |
+ if (file.size > maxSize) {
|
|
| 338 |
+ alert('파일 크기는 20MB를 초과할 수 없습니다.');
|
|
| 339 |
+ return; |
|
| 340 |
+ } |
|
| 341 |
+ |
|
| 334 | 342 |
fn_loadAddActive(); |
| 335 | 343 |
var reader = new FileReader(); |
| 336 | 344 |
var extension = file.name.split('.').pop().toLowerCase();
|
... | ... | @@ -500,15 +508,18 @@ |
| 500 | 508 |
let duplicateCount = 0; // 중복 번호 개수를 저장할 변수 |
| 501 | 509 |
|
| 502 | 510 |
const errors = []; // 오류 데이터를 저장할 배열 |
| 503 |
- const duplicates = []; // 오류 데이터를 저장할 배열 |
|
| 504 | 511 |
const newData = []; // 유효한 데이터만 저장할 새로운 배열 |
| 505 | 512 |
|
| 506 | 513 |
data.forEach((row, index) => {
|
| 507 |
- if (index % 10000 === 0) {
|
|
| 508 |
- console.log('i : ', index);
|
|
| 509 |
- } |
|
| 510 | 514 |
|
| 511 | 515 |
const number = row.addrPhoneNo; |
| 516 |
+ |
|
| 517 |
+ // number가 null, undefined, 빈 문자열이거나 숫자인 경우 처리 |
|
| 518 |
+ if (!number || (typeof number === 'string' && !number.trim())){
|
|
| 519 |
+ console.log("number : ", number);
|
|
| 520 |
+ return; |
|
| 521 |
+ } |
|
| 522 |
+ |
|
| 512 | 523 |
const formattedNumber = formatPhoneNumber(number); // 번호 표준화 |
| 513 | 524 |
const cleanedNumber = formattedNumber.replace(/[^0-9]/g, ''); // 숫자만 남김 |
| 514 | 525 |
|
... | ... | @@ -518,32 +529,24 @@ |
| 518 | 529 |
existingNumbers.add(cleanedNumber); // 추가된 번호를 기존 목록에 추가 |
| 519 | 530 |
newData.push(row); // 유효한 데이터만 새로운 배열에 추가 |
| 520 | 531 |
} else {
|
| 521 |
- // 오류: 유효성 통과 못함 |
|
| 522 |
- errorCount++; |
|
| 523 |
- $tableError.addRow({
|
|
| 524 |
- name: row.addrNm, // 이름 |
|
| 525 |
- phone: row.addrPhoneNo, // 폰번호 |
|
| 526 |
- result: "오류" // 결과 메시지 추가 |
|
| 527 |
- }); |
|
| 528 |
- errors.push({
|
|
| 529 |
- name: row.addrNm, // 이름 |
|
| 530 |
- phone: row.addrPhoneNo, // 폰번호 |
|
| 531 |
- result: "오류" // 결과 메시지 추가 |
|
| 532 |
- }); |
|
| 532 |
+ // 오류: 유효성 통과 못함 |
|
| 533 |
+ errorCount++; |
|
| 534 |
+ |
|
| 535 |
+ errors.push({
|
|
| 536 |
+ name: row.addrNm, // 이름 |
|
| 537 |
+ phone: row.addrPhoneNo, // 폰번호 |
|
| 538 |
+ result: "오류" // 결과 메시지 추가 |
|
| 539 |
+ }); |
|
| 533 | 540 |
} |
| 534 | 541 |
} else {
|
| 535 |
- // 중복 |
|
| 536 |
- duplicateCount++; // 중복 번호가 발견될 때마다 카운트를 증가 |
|
| 537 |
- $tableError.addRow({
|
|
| 538 |
- name: row.addrNm, // 이름 |
|
| 539 |
- phone: row.addrPhoneNo, // 폰번호 |
|
| 540 |
- result: "중복" // 결과 메시지 추가 |
|
| 541 |
- }); |
|
| 542 |
- duplicates.push({
|
|
| 543 |
- name: row.addrNm, // 이름 |
|
| 544 |
- phone: row.addrPhoneNo, // 폰번호 |
|
| 545 |
- result: "중복" // 결과 메시지 추가 |
|
| 546 |
- }); |
|
| 542 |
+ // 중복 |
|
| 543 |
+ duplicateCount++; |
|
| 544 |
+ |
|
| 545 |
+ errors.push({
|
|
| 546 |
+ name: row.addrNm, // 이름 |
|
| 547 |
+ phone: row.addrPhoneNo, // 폰번호 |
|
| 548 |
+ result: "중복" // 결과 메시지 추가 |
|
| 549 |
+ }); |
|
| 547 | 550 |
} |
| 548 | 551 |
}); |
| 549 | 552 |
|
... | ... | @@ -561,17 +564,14 @@ |
| 561 | 564 |
$("#excelRowErrorCnt").text(errorCount);
|
| 562 | 565 |
|
| 563 | 566 |
// popup 영역 |
| 567 |
+ $("#errorPopTotCnt").text($objTabul.getDataCount());
|
|
| 564 | 568 |
// 중복 카운트 |
| 565 | 569 |
$("#errorPopDupCnt").text(duplicateCount);
|
| 566 | 570 |
// 에러 카운트 |
| 567 | 571 |
$("#errorPopErrorCnt").text(errorCount);
|
| 568 |
- // |
|
| 569 |
- $("#errorPopTotCnt").text(duplicateCount+errorCount);
|
|
| 570 | 572 |
|
| 571 | 573 |
|
| 572 |
- var errorData = errors.concat(duplicates); |
|
| 573 |
- // 오류 및 중복 데이터를 한 번에 추가 |
|
| 574 |
- $tableError.setData(errorData); |
|
| 574 |
+ $tableError.setData(errors); |
|
| 575 | 575 |
|
| 576 | 576 |
if(errorCount > 0){
|
| 577 | 577 |
alert('휴대폰 형식에 맞지 않는 데이터는 삭제 후 업로드 됩니다.\nex) 발송불가 특수문자, 자릿수 오류 등');
|
... | ... | @@ -711,7 +711,7 @@ |
| 711 | 711 |
<!-- 엑셀입력 --> |
| 712 | 712 |
<div class="popCont current pop_more_cont" id="popCont_1"> |
| 713 | 713 |
<div class="titBox"> |
| 714 |
- <p>- 주소록은 한 번에 최대 30만건까지 등록(EXCEL파일, 최대용량 3MB) 가능합니다. </p> |
|
| 714 |
+ <p>- 주소록은 한 번에 최대 30만건까지 등록(EXCEL파일, 최대용량 20MB) 가능합니다. </p> |
|
| 715 | 715 |
<p>- 엑셀 파일에 비밀번호 설정, 제한된 보기, 수식 등이 설정되어 있는 경우 업로드가 불가합니다.</p> |
| 716 | 716 |
<p>- 구분선(|), 역슬래시(\, ₩), 큰따옴표(") 등 발송불가 특수문자는 저장되지 않습니다.</p>
|
| 717 | 717 |
<p>- 이름 200byte, [*1*]~[*4*] 200byte, 메모 250byte까지 입력 가능합니다.</p> |
--- src/main/webapp/js/web/addr/event.js
+++ src/main/webapp/js/web/addr/event.js
... | ... | @@ -1,454 +1,453 @@ |
| 1 |
- |
|
| 2 |
- |
|
| 3 |
-$(document).ready(function(){
|
|
| 4 |
- |
|
| 5 |
- |
|
| 6 |
- //타이틀 select 선택 이벤트 |
|
| 7 |
- $('[data-group]').on('change', '.field-selector', function() {
|
|
| 8 |
- |
|
| 9 |
- fn_loadAddActive(); |
|
| 10 |
- |
|
| 11 |
- |
|
| 12 |
- var group = $(this).closest('[data-group]').data('group');
|
|
| 13 |
- var selectedFields = []; |
|
| 14 |
- var isDuplicate = false; |
|
| 15 |
- |
|
| 16 |
- |
|
| 17 |
- // 타불 객체 가져오기 |
|
| 18 |
- var $objTabul = fn_utils_getTabulator(); |
|
| 19 |
- |
|
| 20 |
- console.log('$objTabul : ', $objTabul);
|
|
| 21 |
- |
|
| 22 |
- if($objTabul.getData().length < 1){
|
|
| 23 |
- alert('데이터 입력 후 선택해 주세요.');
|
|
| 24 |
- $(this).val("");
|
|
| 25 |
- fn_loadRemoveActive(); |
|
| 26 |
- return false; |
|
| 27 |
- } |
|
| 28 |
- |
|
| 29 |
- // 중복체크 |
|
| 30 |
- $('[data-group="' + group + '"] .field-selector').each(function() {
|
|
| 31 |
- var selectedField = $(this).val(); |
|
| 32 |
- if (selectedField) {
|
|
| 33 |
- if (selectedFields.includes(selectedField)) {
|
|
| 34 |
- alert("중복된 필드를 선택할 수 없습니다.");
|
|
| 35 |
- $(this).val(""); // 중복 필드를 선택한 경우 빈 값으로 초기화
|
|
| 36 |
- isDuplicate = true; |
|
| 37 |
- return false; // 반복문 종료 |
|
| 38 |
- } |
|
| 39 |
- selectedFields.push(selectedField); |
|
| 40 |
- } |
|
| 41 |
- }); |
|
| 42 |
- |
|
| 43 |
- |
|
| 44 |
- // 데이터 넣기 |
|
| 45 |
- updateTableFields($objTabul, group); |
|
| 46 |
- |
|
| 47 |
- // 필드가 휴대폰이면 열 중복체크 |
|
| 48 |
- if($(this).val() == 'addrPhoneNo'){
|
|
| 49 |
- fn_phoneDupl($objTabul); |
|
| 50 |
- } |
|
| 51 |
- fn_loadRemoveActive(); |
|
| 52 |
- |
|
| 53 |
- }); |
|
| 54 |
- |
|
| 55 |
- |
|
| 56 |
- /** |
|
| 57 |
- * @ 핸드폰 중복 데이터 |
|
| 58 |
- * */ |
|
| 59 |
- function fn_phoneDupl($objTabul) {
|
|
| 60 |
- |
|
| 61 |
- $tableError.clearData(); |
|
| 62 |
- |
|
| 63 |
- var tabulNm = fn_utils_getTabulatorNm(); |
|
| 64 |
- var tabluC = '.'+tabulNm |
|
| 65 |
- |
|
| 66 |
- var data = $objTabul.getData(); |
|
| 67 |
- var phoneNumberChk = false; |
|
| 68 |
- var existingNumbers = new Set(); // 배열에서 Set으로 변경 |
|
| 69 |
- |
|
| 70 |
- let errorCount = 0; // 중복 번호 개수를 저장할 변수 |
|
| 71 |
- let duplicateCount = 0; // 중복 번호 개수를 저장할 변수 |
|
| 72 |
- |
|
| 73 |
- const errors = []; // 오류 데이터를 저장할 배열 |
|
| 74 |
- const duplicates = []; // 오류 데이터를 저장할 배열 |
|
| 75 |
- const newData = []; // 유효한 데이터만 저장할 새로운 배열 |
|
| 76 |
- |
|
| 77 |
- data.forEach((row, index) => {
|
|
| 78 |
-// if (index % 10000 === 0) {
|
|
| 79 |
-// console.log('i : ', index);
|
|
| 80 |
-// } |
|
| 81 |
- |
|
| 82 |
- const number = row.addrPhoneNo; |
|
| 83 |
- const formattedNumber = formatPhoneNumber(number); // 번호 표준화 |
|
| 84 |
- const cleanedNumber = formattedNumber.replace(/[^0-9]/g, ''); // 숫자만 남김 |
|
| 85 |
- |
|
| 86 |
- if (!existingNumbers.has(cleanedNumber)) { // 중복 번호 체크
|
|
| 87 |
- if (isValidPhoneNumber(formattedNumber)) { // 유효성 검사
|
|
| 88 |
- row.addrPhoneNo = formattedNumber; |
|
| 89 |
- existingNumbers.add(cleanedNumber); // 추가된 번호를 기존 목록에 추가 |
|
| 90 |
- newData.push(row); // 유효한 데이터만 새로운 배열에 추가 |
|
| 91 |
- } else {
|
|
| 92 |
- // 오류: 유효성 통과 못함 |
|
| 93 |
- errorCount++; |
|
| 94 |
- |
|
| 95 |
- errors.push({
|
|
| 96 |
- name: row.addrNm, // 이름 |
|
| 97 |
- phone: row.addrPhoneNo, // 폰번호 |
|
| 98 |
- result: "오류" // 결과 메시지 추가 |
|
| 99 |
- }); |
|
| 100 |
- } |
|
| 101 |
- } else {
|
|
| 102 |
- // 중복 |
|
| 103 |
- duplicateCount++; |
|
| 104 |
- |
|
| 105 |
- errors.push({
|
|
| 106 |
- name: row.addrNm, // 이름 |
|
| 107 |
- phone: row.addrPhoneNo, // 폰번호 |
|
| 108 |
- result: "중복" // 결과 메시지 추가 |
|
| 109 |
- }); |
|
| 110 |
- } |
|
| 111 |
- }); |
|
| 112 |
- |
|
| 113 |
- // data 배열을 newData 배열로 대체 |
|
| 114 |
- data = newData; |
|
| 115 |
- |
|
| 116 |
- // 중복 카운트 |
|
| 117 |
- $(tabluC+" #rowDupCnt").text(duplicateCount); |
|
| 118 |
- // 에러 카운트 |
|
| 119 |
- $(tabluC+" #rowErrorCnt").text(errorCount); |
|
| 120 |
- |
|
| 121 |
- // popup 영역 |
|
| 122 |
- // 중복 카운트 |
|
| 123 |
- $("#errorPopDupCnt").text(duplicateCount);
|
|
| 124 |
- // 에러 카운트 |
|
| 125 |
- $("#errorPopErrorCnt").text(errorCount);
|
|
| 126 |
- // |
|
| 127 |
-// $("#errorPopTotCnt").text(duplicateCount+errorCount);
|
|
| 128 |
- |
|
| 129 |
- // 수정된 데이터로 테이블 업데이트 |
|
| 130 |
- $objTabul.setData(data); |
|
| 131 |
- |
|
| 132 |
- // 중복 번호 개수를 #rowDupCnt 요소에 표시 |
|
| 133 |
- $("#rowDupCnt").text(duplicateCount);
|
|
| 134 |
- |
|
| 135 |
- $(tabluC+" #rowTotCnt").text($objTabul.getDataCount()); |
|
| 136 |
- $("#errorPopTotCnt").text($objTabul.getDataCount());
|
|
| 137 |
- |
|
| 138 |
- var errorData = errors.concat(duplicates); |
|
| 139 |
- // 오류 및 중복 데이터를 한 번에 추가 |
|
| 140 |
- $tableError.setData(errorData); |
|
| 141 |
- |
|
| 142 |
- if(errorCount > 0){
|
|
| 143 |
- alert('휴대폰 형식에 맞지 않는 데이터는 삭제 후 업로드 됩니다.\nex) 발송불가 특수문자, 자릿수 오류 등');
|
|
| 144 |
- } |
|
| 145 |
- |
|
| 146 |
- |
|
| 147 |
- |
|
| 148 |
- } |
|
| 149 |
- /* |
|
| 150 |
- function fn_phoneDupl_old($objTabul) {
|
|
| 151 |
- var data = $objTabul.getData(); |
|
| 152 |
- var uniquePhones = new Set(); |
|
| 153 |
- var rowsToKeep = []; |
|
| 154 |
- var rowsToDelete = []; |
|
| 155 |
- var phoneNumberChk = false; |
|
| 156 |
- |
|
| 157 |
- |
|
| 158 |
- var tabulNm = fn_utils_getTabulatorNm(); |
|
| 159 |
- var tabluC = '.'+tabulNm |
|
| 160 |
- |
|
| 161 |
- data.forEach((row, index) => {
|
|
| 162 |
- |
|
| 163 |
- if (!isValidKoreanPhoneNumber(row.addrPhoneNo)) {
|
|
| 164 |
- phoneNumberChk = true |
|
| 165 |
- return false; |
|
| 166 |
- } |
|
| 167 |
- |
|
| 168 |
- if (uniquePhones.has(row.addrPhoneNo)) {
|
|
| 169 |
- rowsToDelete.push(index); // 중복된 행의 인덱스를 기록 |
|
| 170 |
- } else {
|
|
| 171 |
- uniquePhones.add(row.addrPhoneNo); |
|
| 172 |
- rowsToKeep.push(row); // 고유한 데이터만 추가 |
|
| 173 |
- } |
|
| 174 |
- }); |
|
| 175 |
- |
|
| 176 |
- if(phoneNumberChk){
|
|
| 177 |
- alert('휴대폰 형식에 맞지 않는 데이터가 있습니다.\n 확인해 주세요');
|
|
| 178 |
- } |
|
| 179 |
- |
|
| 180 |
- |
|
| 181 |
- |
|
| 182 |
- // 중복된 행 삭제 |
|
| 183 |
- rowsToDelete.reverse().forEach(index => {
|
|
| 184 |
- $objTabul.deleteRow(index); |
|
| 185 |
- }); |
|
| 186 |
- |
|
| 187 |
- // 고유한 데이터만 남기고 테이블 업데이트 |
|
| 188 |
- $objTabul.setData(rowsToKeep); |
|
| 189 |
- $(tabluC+" #rowTotCnt").text(rowsToKeep.length); |
|
| 190 |
- }*/ |
|
| 191 |
- |
|
| 192 |
- //받는사람 전체삭제 버튼 처리 |
|
| 193 |
- $('.all_del').click(function(){
|
|
| 194 |
- |
|
| 195 |
- var tabulNm = fn_utils_getTabulatorNm(); |
|
| 196 |
- var tabluC = '.'+tabulNm |
|
| 197 |
- |
|
| 198 |
- var $objTabul = fn_utils_getTabulator(); |
|
| 199 |
- |
|
| 200 |
- $objTabul.clearData(); |
|
| 201 |
- fn_rowCntInit(); |
|
| 202 |
- |
|
| 203 |
- // select box 초기화 |
|
| 204 |
- $('.field-selector').each(function() { $(this).val(''); });
|
|
| 205 |
- }); |
|
| 206 |
- |
|
| 207 |
- // 받는사람 선택삭제 버튼 처리해주기 |
|
| 208 |
- $('.select_del').click(function(){
|
|
| 209 |
- |
|
| 210 |
- var tabulNm = fn_utils_getTabulatorNm(); |
|
| 211 |
- var tabluC = '.'+tabulNm |
|
| 212 |
- |
|
| 213 |
- var $objTabul = fn_utils_getTabulator(); |
|
| 214 |
- |
|
| 215 |
- $(tabluC+" #rowDupCnt").text(0); //중복건수 수정 |
|
| 216 |
- var selectedData = $objTabul.getSelectedRows(); |
|
| 217 |
- |
|
| 218 |
- if(selectedData == "" || selectedData == null){
|
|
| 219 |
- alert("삭제할 데이터를 선택해 주세요.");
|
|
| 220 |
- return false; |
|
| 221 |
- }else{ // 선택한 Row 데이터 삭제하기
|
|
| 222 |
- for(var i=0; i < selectedData.length; i++){
|
|
| 223 |
- selectedData[i].delete(); |
|
| 224 |
- } |
|
| 225 |
- } |
|
| 226 |
- |
|
| 227 |
- totRows = $objTabul.getRows().length; |
|
| 228 |
- |
|
| 229 |
- updateTotCnt(totRows); |
|
| 230 |
- }); |
|
| 231 |
- |
|
| 232 |
- |
|
| 233 |
- //받는사람 전체삭제 버튼 처리 |
|
| 234 |
- $('.self_all_del').click(function(){
|
|
| 235 |
- |
|
| 236 |
- var tabulNm = fn_utils_getTabulatorNm(); |
|
| 237 |
- var tabluC = '.'+tabulNm |
|
| 238 |
- |
|
| 239 |
- var $objTabul = fn_utils_getTabulator(); |
|
| 240 |
- |
|
| 241 |
- // 초기화 및 데이터 추가를 한번에 처리 |
|
| 242 |
- var newTableData = []; |
|
| 243 |
- |
|
| 244 |
- // 1000개의 빈 행을 미리 준비 |
|
| 245 |
- for (var i = 0; i < 1000; i++) {
|
|
| 246 |
- newTableData.push({
|
|
| 247 |
- addrNm: "", |
|
| 248 |
- addrPhoneNo: "", |
|
| 249 |
- addrInfo1: "", |
|
| 250 |
- addrInfo2: "", |
|
| 251 |
- addrInfo3: "", |
|
| 252 |
- addrInfo4: "", |
|
| 253 |
- addrComment: "" |
|
| 254 |
- }); |
|
| 255 |
- } |
|
| 256 |
- |
|
| 257 |
- // 기존 데이터 초기화 후, 새로운 데이터를 한 번에 추가 |
|
| 258 |
- $objTabul.setData(newTableData); |
|
| 259 |
- |
|
| 260 |
- // 행 수 초기화 함수 호출 |
|
| 261 |
- fn_rowCntInit(); |
|
| 262 |
- }); |
|
| 263 |
- |
|
| 264 |
- // 직접입력 받는사람 선택삭제 버튼 처리해주기 |
|
| 265 |
- $('.self_select_del').click(function(){
|
|
| 266 |
- |
|
| 267 |
- var tabulNm = fn_utils_getTabulatorNm(); |
|
| 268 |
- var tabluC = '.'+tabulNm |
|
| 269 |
- |
|
| 270 |
- var $objTabul = fn_utils_getTabulator(); |
|
| 271 |
- |
|
| 272 |
- $(tabluC+" #rowDupCnt").text(0); //중복건수 수정 |
|
| 273 |
- var selectedData = $objTabul.getSelectedRows(); |
|
| 274 |
- |
|
| 275 |
- if(selectedData == "" || selectedData == null){
|
|
| 276 |
- alert("삭제할 데이터를 선택해 주세요.");
|
|
| 277 |
- return false; |
|
| 278 |
- }else{ // 선택한 Row 데이터 삭제하기
|
|
| 279 |
- for(var i=0; i < selectedData.length; i++){
|
|
| 280 |
- selectedData[i].delete(); |
|
| 281 |
- } |
|
| 282 |
- } |
|
| 283 |
- |
|
| 284 |
- // 남은 행 수 계산 |
|
| 285 |
- var totRows = $objTabul.getRows().length; |
|
| 286 |
- |
|
| 287 |
- // 1000개 행이 되도록 나머지 행 생성 |
|
| 288 |
- for (var i = totRows; i < 1000; i++) {
|
|
| 289 |
- $objTabul.addRow({addrNm: "", addrPhoneNo: "", addrInfo1: "", addrInfo2: "", addrInfo3: "", addrInfo4: "", addrComment: ""});
|
|
| 290 |
- } |
|
| 291 |
- |
|
| 292 |
- |
|
| 293 |
- var existingNumbers = []; // 중복 번호를 저장할 배열 |
|
| 294 |
- // 모든 행의 'addrPhoneNo' 값을 배열에 추가 |
|
| 295 |
- var allRows = $tableSelf.getData(); // 테이블의 모든 데이터를 가져옴 |
|
| 296 |
- allRows.forEach(function(row) {
|
|
| 297 |
- if (row.addrPhoneNo) {
|
|
| 298 |
- const cleanedExistingNumber = row.addrPhoneNo.replace(/[^0-9]/g, ''); // 숫자만 남김 |
|
| 299 |
- existingNumbers.push(cleanedExistingNumber); // 기존 번호를 배열에 추가 |
|
| 300 |
- } |
|
| 301 |
- }); |
|
| 302 |
- updateTotCnt(existingNumbers.length); |
|
| 303 |
- }); |
|
| 304 |
- |
|
| 305 |
- //전체 데이터 갯수 구하는 함수 |
|
| 306 |
- function updateTotCnt(data){
|
|
| 307 |
- |
|
| 308 |
- var tabulNm = fn_utils_getTabulatorNm(); |
|
| 309 |
- var tabluC = '.'+tabulNm |
|
| 310 |
- |
|
| 311 |
- $(tabluC+" #rowTotCnt").text(data); |
|
| 312 |
- |
|
| 313 |
- } |
|
| 314 |
- |
|
| 315 |
- /* |
|
| 316 |
- * 타이틀 select 선택할때마다 실행해서 |
|
| 317 |
- * 데이터테이블 필드값 수정 |
|
| 318 |
- */ |
|
| 319 |
- function updateTableFields($objTabul, group) {
|
|
| 320 |
- // 데이터가져오기 |
|
| 321 |
- var currentData = $objTabul.getData(); |
|
| 322 |
- |
|
| 323 |
- // 필드 초기 값 셋팅 |
|
| 324 |
- var columns = [ |
|
| 325 |
- {formatter: "rowSelection", titleFormatter: "rowSelection", clipboard: false, hozAlign: "center", headerHozAlign: "center", headerSort: false, cellClick: function(e, cell) {
|
|
| 326 |
- cell.getRow().toggleSelect(); |
|
| 327 |
- }} |
|
| 328 |
- ,{formatter:"rownum", align:"center", title:"No", hozAlign:"center", headerHozAlign:"center", width:40}
|
|
| 329 |
- ]; |
|
| 330 |
- |
|
| 331 |
- var fieldMapping = []; |
|
| 332 |
- // 초기 후 필드 값 셋팅하기 |
|
| 333 |
- $('[data-group="' + group + '"] .field-selector').each(function(index) {
|
|
| 334 |
- var selectedField = $(this).val(); |
|
| 335 |
- // ASCII 문자 코드 사용 - 65=A, 66=B ... |
|
| 336 |
- var field = String.fromCharCode(65 + index); |
|
| 337 |
- if (selectedField) {
|
|
| 338 |
- columns.push({
|
|
| 339 |
- title: field |
|
| 340 |
- , field: selectedField |
|
| 341 |
- , hozAlign: "center" |
|
| 342 |
- , headerHozAlign: "center" |
|
| 343 |
-// , editor: "input" |
|
| 344 |
- , editor: false |
|
| 345 |
- , width: 125 |
|
| 346 |
- , validator: ["maxLength:100", "string"] |
|
| 347 |
- }); |
|
| 348 |
- fieldMapping.push(selectedField); |
|
| 349 |
- } else {
|
|
| 350 |
- columns.push({
|
|
| 351 |
- title: field |
|
| 352 |
- , field: field |
|
| 353 |
- , hozAlign: "center" |
|
| 354 |
- , headerHozAlign: "center" |
|
| 355 |
-// , editor: "input" |
|
| 356 |
- , editor: false |
|
| 357 |
- , width: 125 |
|
| 358 |
- , validator: ["maxLength:100", "string"] |
|
| 359 |
- }); |
|
| 360 |
- fieldMapping.push(field); |
|
| 361 |
- } |
|
| 362 |
- }); |
|
| 363 |
- |
|
| 364 |
- // 데이터 셋팅 |
|
| 365 |
- var updatedData = currentData.map(row => {
|
|
| 366 |
- var newRow = {};
|
|
| 367 |
- fieldMapping.forEach((field, index) => {
|
|
| 368 |
- newRow[field] = row[Object.keys(row)[index]] || ""; |
|
| 369 |
- }); |
|
| 370 |
- return newRow; |
|
| 371 |
- }); |
|
| 372 |
- |
|
| 373 |
- $objTabul.setColumns(columns); |
|
| 374 |
- $objTabul.setData(updatedData); |
|
| 375 |
- } |
|
| 376 |
-}); |
|
| 377 |
- |
|
| 378 |
- |
|
| 379 |
- |
|
| 380 |
- |
|
| 381 |
-// 주소록 에러결과 초기화 |
|
| 382 |
-function fn_errorPopClean(){
|
|
| 383 |
- |
|
| 384 |
- var tabulNm = fn_utils_getTabulatorNm(); |
|
| 385 |
- var tabluC = '.'+tabulNm |
|
| 386 |
- |
|
| 387 |
- // popup 영역 |
|
| 388 |
- $tableError.clearData(); |
|
| 389 |
- |
|
| 390 |
- |
|
| 391 |
- // 중복 카운트 |
|
| 392 |
- $("#errorPopDupCnt").text(0);
|
|
| 393 |
- // 에러 카운트 |
|
| 394 |
- $("#errorPopErrorCnt").text(0);
|
|
| 395 |
- // |
|
| 396 |
- $("#errorPopTotCnt").text(0);
|
|
| 397 |
- |
|
| 398 |
- // select box 초기화 |
|
| 399 |
- $(tabluC+' .field-selector').each(function() { $(this).val(''); });
|
|
| 400 |
- |
|
| 401 |
-} |
|
| 402 |
- |
|
| 403 |
-function fn_rowCntInit(){
|
|
| 404 |
- |
|
| 405 |
- var tabulNm = fn_utils_getTabulatorNm(); |
|
| 406 |
- var tabluC = '.'+tabulNm |
|
| 407 |
- |
|
| 408 |
- $(tabluC+" #rowTotCnt").text(0); //총건수 수정 |
|
| 409 |
- $(tabluC+" #rowDupCnt").text(0); //중복건수 수정 |
|
| 410 |
- $(tabluC+" #rowErrorCnt").text(0); //중복건수 수정 |
|
| 411 |
-} |
|
| 412 |
- |
|
| 413 |
- |
|
| 414 |
- |
|
| 415 |
-//1. 필드 초기화 함수 |
|
| 416 |
-function resetTableFieldsToDefault() {
|
|
| 417 |
- |
|
| 418 |
- // 타불 객체 가져오기 |
|
| 419 |
- var $objTabul = fn_utils_getTabulator(); |
|
| 420 |
- |
|
| 421 |
- // 필드를 A, B, C, D로 초기화 |
|
| 422 |
- var defaultFields = ['A', 'B', 'C', 'D', 'E', 'F', 'G']; |
|
| 423 |
- |
|
| 424 |
- // 테이블의 기존 데이터를 가져옵니다. |
|
| 425 |
- var currentData = $objTabul.getData(); |
|
| 426 |
- |
|
| 427 |
- // 초기 필드(A, B, C, D 등)를 위한 열 설정 |
|
| 428 |
- var columns = [ |
|
| 429 |
- {formatter: "rowSelection", titleFormatter: "rowSelection", clipboard: false, hozAlign: "center", headerHozAlign: "center", headerSort: false, cellClick: function(e, cell) {
|
|
| 430 |
- cell.getRow().toggleSelect(); |
|
| 431 |
- }}, |
|
| 432 |
- {formatter:"rownum", align:"center", title:"No", hozAlign:"center", headerHozAlign:"center", width:40}
|
|
| 433 |
- ]; |
|
| 434 |
- |
|
| 435 |
- // 기본 필드로 열 구성 |
|
| 436 |
- defaultFields.forEach(field => {
|
|
| 437 |
- columns.push({
|
|
| 438 |
- title: field, |
|
| 439 |
- field: field, |
|
| 440 |
- hozAlign: "center", |
|
| 441 |
- headerHozAlign: "center", |
|
| 442 |
- editor: false, // 편집 비활성화 |
|
| 443 |
- width: 125, |
|
| 444 |
- validator: ["maxLength:100", "string"] |
|
| 445 |
- }); |
|
| 446 |
- }); |
|
| 447 |
- |
|
| 448 |
- // 테이블을 기본 필드로 업데이트 |
|
| 449 |
- $objTabul.setColumns(columns); |
|
| 450 |
-// $objTabul.setData(updatedData); |
|
| 451 |
-} |
|
| 452 |
- |
|
| 453 |
- |
|
| 454 |
- |
|
| 1 |
+ |
|
| 2 |
+ |
|
| 3 |
+$(document).ready(function(){
|
|
| 4 |
+ |
|
| 5 |
+ |
|
| 6 |
+ //타이틀 select 선택 이벤트 |
|
| 7 |
+ $('[data-group]').on('change', '.field-selector', function() {
|
|
| 8 |
+ |
|
| 9 |
+ fn_loadAddActive(); |
|
| 10 |
+ |
|
| 11 |
+ |
|
| 12 |
+ var group = $(this).closest('[data-group]').data('group');
|
|
| 13 |
+ var selectedFields = []; |
|
| 14 |
+ var isDuplicate = false; |
|
| 15 |
+ |
|
| 16 |
+ |
|
| 17 |
+ // 타불 객체 가져오기 |
|
| 18 |
+ var $objTabul = fn_utils_getTabulator(); |
|
| 19 |
+ |
|
| 20 |
+ console.log('$objTabul : ', $objTabul);
|
|
| 21 |
+ |
|
| 22 |
+ if($objTabul.getData().length < 1){
|
|
| 23 |
+ alert('데이터 입력 후 선택해 주세요.');
|
|
| 24 |
+ $(this).val("");
|
|
| 25 |
+ fn_loadRemoveActive(); |
|
| 26 |
+ return false; |
|
| 27 |
+ } |
|
| 28 |
+ |
|
| 29 |
+ // 중복체크 |
|
| 30 |
+ $('[data-group="' + group + '"] .field-selector').each(function() {
|
|
| 31 |
+ var selectedField = $(this).val(); |
|
| 32 |
+ if (selectedField) {
|
|
| 33 |
+ if (selectedFields.includes(selectedField)) {
|
|
| 34 |
+ alert("중복된 필드를 선택할 수 없습니다.");
|
|
| 35 |
+ $(this).val(""); // 중복 필드를 선택한 경우 빈 값으로 초기화
|
|
| 36 |
+ isDuplicate = true; |
|
| 37 |
+ return false; // 반복문 종료 |
|
| 38 |
+ } |
|
| 39 |
+ selectedFields.push(selectedField); |
|
| 40 |
+ } |
|
| 41 |
+ }); |
|
| 42 |
+ |
|
| 43 |
+ |
|
| 44 |
+ // 데이터 넣기 |
|
| 45 |
+ updateTableFields($objTabul, group); |
|
| 46 |
+ |
|
| 47 |
+ // 필드가 휴대폰이면 열 중복체크 |
|
| 48 |
+ if($(this).val() == 'addrPhoneNo'){
|
|
| 49 |
+ fn_phoneDupl($objTabul); |
|
| 50 |
+ } |
|
| 51 |
+ fn_loadRemoveActive(); |
|
| 52 |
+ |
|
| 53 |
+ }); |
|
| 54 |
+ |
|
| 55 |
+ |
|
| 56 |
+ /** |
|
| 57 |
+ * @ 핸드폰 중복 데이터 |
|
| 58 |
+ * */ |
|
| 59 |
+ function fn_phoneDupl($objTabul) {
|
|
| 60 |
+ |
|
| 61 |
+ $tableError.clearData(); |
|
| 62 |
+ |
|
| 63 |
+ var tabulNm = fn_utils_getTabulatorNm(); |
|
| 64 |
+ var tabluC = '.'+tabulNm |
|
| 65 |
+ |
|
| 66 |
+ var data = $objTabul.getData(); |
|
| 67 |
+ var phoneNumberChk = false; |
|
| 68 |
+ var existingNumbers = new Set(); // 배열에서 Set으로 변경 |
|
| 69 |
+ |
|
| 70 |
+ let errorCount = 0; // 중복 번호 개수를 저장할 변수 |
|
| 71 |
+ let duplicateCount = 0; // 중복 번호 개수를 저장할 변수 |
|
| 72 |
+ |
|
| 73 |
+ const errors = []; // 오류 데이터를 저장할 배열 |
|
| 74 |
+ const newData = []; // 유효한 데이터만 저장할 새로운 배열 |
|
| 75 |
+ |
|
| 76 |
+ data.forEach((row, index) => {
|
|
| 77 |
+ |
|
| 78 |
+ const number = row.addrPhoneNo; |
|
| 79 |
+ |
|
| 80 |
+ // number가 null, undefined, 빈 문자열이거나 숫자인 경우 처리 |
|
| 81 |
+ if (!number || (typeof number === 'string' && !number.trim())){
|
|
| 82 |
+ console.log("number : ", number);
|
|
| 83 |
+ return; |
|
| 84 |
+ } |
|
| 85 |
+ |
|
| 86 |
+ const formattedNumber = formatPhoneNumber(number); // 번호 표준화 |
|
| 87 |
+ const cleanedNumber = formattedNumber.replace(/[^0-9]/g, ''); // 숫자만 남김 |
|
| 88 |
+ |
|
| 89 |
+ if (!existingNumbers.has(cleanedNumber)) { // 중복 번호 체크
|
|
| 90 |
+ if (isValidPhoneNumber(formattedNumber)) { // 유효성 검사
|
|
| 91 |
+ row.addrPhoneNo = formattedNumber; |
|
| 92 |
+ existingNumbers.add(cleanedNumber); // 추가된 번호를 기존 목록에 추가 |
|
| 93 |
+ newData.push(row); // 유효한 데이터만 새로운 배열에 추가 |
|
| 94 |
+ } else {
|
|
| 95 |
+ // 오류: 유효성 통과 못함 |
|
| 96 |
+ errorCount++; |
|
| 97 |
+ |
|
| 98 |
+ errors.push({
|
|
| 99 |
+ name: row.addrNm, // 이름 |
|
| 100 |
+ phone: row.addrPhoneNo, // 폰번호 |
|
| 101 |
+ result: "오류" // 결과 메시지 추가 |
|
| 102 |
+ }); |
|
| 103 |
+ } |
|
| 104 |
+ } else {
|
|
| 105 |
+ // 중복 |
|
| 106 |
+ duplicateCount++; |
|
| 107 |
+ |
|
| 108 |
+ errors.push({
|
|
| 109 |
+ name: row.addrNm, // 이름 |
|
| 110 |
+ phone: row.addrPhoneNo, // 폰번호 |
|
| 111 |
+ result: "중복" // 결과 메시지 추가 |
|
| 112 |
+ }); |
|
| 113 |
+ } |
|
| 114 |
+ }); |
|
| 115 |
+ |
|
| 116 |
+ // data 배열을 newData 배열로 대체 |
|
| 117 |
+ data = newData; |
|
| 118 |
+ |
|
| 119 |
+ // 수정된 데이터로 테이블 업데이트 |
|
| 120 |
+ $objTabul.setData(data); |
|
| 121 |
+ |
|
| 122 |
+ $(tabluC+" #rowTotCnt").text($objTabul.getDataCount()); |
|
| 123 |
+ // 중복 카운트 |
|
| 124 |
+ $(tabluC+" #rowDupCnt").text(duplicateCount); |
|
| 125 |
+ // 에러 카운트 |
|
| 126 |
+ $(tabluC+" #rowErrorCnt").text(errorCount); |
|
| 127 |
+ |
|
| 128 |
+ // popup 영역 |
|
| 129 |
+ $("#errorPopTotCnt").text($objTabul.getDataCount());
|
|
| 130 |
+ // 중복 카운트 |
|
| 131 |
+ $("#errorPopDupCnt").text(duplicateCount);
|
|
| 132 |
+ // 에러 카운트 |
|
| 133 |
+ $("#errorPopErrorCnt").text(errorCount);
|
|
| 134 |
+ // |
|
| 135 |
+// $("#errorPopTotCnt").text(duplicateCount+errorCount);
|
|
| 136 |
+ |
|
| 137 |
+ |
|
| 138 |
+ // 오류 및 중복 데이터를 한 번에 추가 |
|
| 139 |
+ $tableError.setData(errors); |
|
| 140 |
+ |
|
| 141 |
+ if(errorCount > 0){
|
|
| 142 |
+ alert('휴대폰 형식에 맞지 않는 데이터는 삭제 후 업로드 됩니다.\nex) 발송불가 특수문자, 자릿수 오류 등');
|
|
| 143 |
+ } |
|
| 144 |
+ |
|
| 145 |
+ |
|
| 146 |
+ |
|
| 147 |
+ } |
|
| 148 |
+ /* |
|
| 149 |
+ function fn_phoneDupl_old($objTabul) {
|
|
| 150 |
+ var data = $objTabul.getData(); |
|
| 151 |
+ var uniquePhones = new Set(); |
|
| 152 |
+ var rowsToKeep = []; |
|
| 153 |
+ var rowsToDelete = []; |
|
| 154 |
+ var phoneNumberChk = false; |
|
| 155 |
+ |
|
| 156 |
+ |
|
| 157 |
+ var tabulNm = fn_utils_getTabulatorNm(); |
|
| 158 |
+ var tabluC = '.'+tabulNm |
|
| 159 |
+ |
|
| 160 |
+ data.forEach((row, index) => {
|
|
| 161 |
+ |
|
| 162 |
+ if (!isValidKoreanPhoneNumber(row.addrPhoneNo)) {
|
|
| 163 |
+ phoneNumberChk = true |
|
| 164 |
+ return false; |
|
| 165 |
+ } |
|
| 166 |
+ |
|
| 167 |
+ if (uniquePhones.has(row.addrPhoneNo)) {
|
|
| 168 |
+ rowsToDelete.push(index); // 중복된 행의 인덱스를 기록 |
|
| 169 |
+ } else {
|
|
| 170 |
+ uniquePhones.add(row.addrPhoneNo); |
|
| 171 |
+ rowsToKeep.push(row); // 고유한 데이터만 추가 |
|
| 172 |
+ } |
|
| 173 |
+ }); |
|
| 174 |
+ |
|
| 175 |
+ if(phoneNumberChk){
|
|
| 176 |
+ alert('휴대폰 형식에 맞지 않는 데이터가 있습니다.\n 확인해 주세요');
|
|
| 177 |
+ } |
|
| 178 |
+ |
|
| 179 |
+ |
|
| 180 |
+ |
|
| 181 |
+ // 중복된 행 삭제 |
|
| 182 |
+ rowsToDelete.reverse().forEach(index => {
|
|
| 183 |
+ $objTabul.deleteRow(index); |
|
| 184 |
+ }); |
|
| 185 |
+ |
|
| 186 |
+ // 고유한 데이터만 남기고 테이블 업데이트 |
|
| 187 |
+ $objTabul.setData(rowsToKeep); |
|
| 188 |
+ $(tabluC+" #rowTotCnt").text(rowsToKeep.length); |
|
| 189 |
+ }*/ |
|
| 190 |
+ |
|
| 191 |
+ //받는사람 전체삭제 버튼 처리 |
|
| 192 |
+ $('.all_del').click(function(){
|
|
| 193 |
+ |
|
| 194 |
+ var tabulNm = fn_utils_getTabulatorNm(); |
|
| 195 |
+ var tabluC = '.'+tabulNm |
|
| 196 |
+ |
|
| 197 |
+ var $objTabul = fn_utils_getTabulator(); |
|
| 198 |
+ |
|
| 199 |
+ $objTabul.clearData(); |
|
| 200 |
+ fn_rowCntInit(); |
|
| 201 |
+ |
|
| 202 |
+ // select box 초기화 |
|
| 203 |
+ $('.field-selector').each(function() { $(this).val(''); });
|
|
| 204 |
+ }); |
|
| 205 |
+ |
|
| 206 |
+ // 받는사람 선택삭제 버튼 처리해주기 |
|
| 207 |
+ $('.select_del').click(function(){
|
|
| 208 |
+ |
|
| 209 |
+ var tabulNm = fn_utils_getTabulatorNm(); |
|
| 210 |
+ var tabluC = '.'+tabulNm |
|
| 211 |
+ |
|
| 212 |
+ var $objTabul = fn_utils_getTabulator(); |
|
| 213 |
+ |
|
| 214 |
+ $(tabluC+" #rowDupCnt").text(0); //중복건수 수정 |
|
| 215 |
+ var selectedData = $objTabul.getSelectedRows(); |
|
| 216 |
+ |
|
| 217 |
+ if(selectedData == "" || selectedData == null){
|
|
| 218 |
+ alert("삭제할 데이터를 선택해 주세요.");
|
|
| 219 |
+ return false; |
|
| 220 |
+ }else{ // 선택한 Row 데이터 삭제하기
|
|
| 221 |
+ for(var i=0; i < selectedData.length; i++){
|
|
| 222 |
+ selectedData[i].delete(); |
|
| 223 |
+ } |
|
| 224 |
+ } |
|
| 225 |
+ |
|
| 226 |
+ totRows = $objTabul.getRows().length; |
|
| 227 |
+ |
|
| 228 |
+ updateTotCnt(totRows); |
|
| 229 |
+ }); |
|
| 230 |
+ |
|
| 231 |
+ |
|
| 232 |
+ //받는사람 전체삭제 버튼 처리 |
|
| 233 |
+ $('.self_all_del').click(function(){
|
|
| 234 |
+ |
|
| 235 |
+ var tabulNm = fn_utils_getTabulatorNm(); |
|
| 236 |
+ var tabluC = '.'+tabulNm |
|
| 237 |
+ |
|
| 238 |
+ var $objTabul = fn_utils_getTabulator(); |
|
| 239 |
+ |
|
| 240 |
+ // 초기화 및 데이터 추가를 한번에 처리 |
|
| 241 |
+ var newTableData = []; |
|
| 242 |
+ |
|
| 243 |
+ // 1000개의 빈 행을 미리 준비 |
|
| 244 |
+ for (var i = 0; i < 1000; i++) {
|
|
| 245 |
+ newTableData.push({
|
|
| 246 |
+ addrNm: "", |
|
| 247 |
+ addrPhoneNo: "", |
|
| 248 |
+ addrInfo1: "", |
|
| 249 |
+ addrInfo2: "", |
|
| 250 |
+ addrInfo3: "", |
|
| 251 |
+ addrInfo4: "", |
|
| 252 |
+ addrComment: "" |
|
| 253 |
+ }); |
|
| 254 |
+ } |
|
| 255 |
+ |
|
| 256 |
+ // 기존 데이터 초기화 후, 새로운 데이터를 한 번에 추가 |
|
| 257 |
+ $objTabul.setData(newTableData); |
|
| 258 |
+ |
|
| 259 |
+ // 행 수 초기화 함수 호출 |
|
| 260 |
+ fn_rowCntInit(); |
|
| 261 |
+ }); |
|
| 262 |
+ |
|
| 263 |
+ // 직접입력 받는사람 선택삭제 버튼 처리해주기 |
|
| 264 |
+ $('.self_select_del').click(function(){
|
|
| 265 |
+ |
|
| 266 |
+ var tabulNm = fn_utils_getTabulatorNm(); |
|
| 267 |
+ var tabluC = '.'+tabulNm |
|
| 268 |
+ |
|
| 269 |
+ var $objTabul = fn_utils_getTabulator(); |
|
| 270 |
+ |
|
| 271 |
+ $(tabluC+" #rowDupCnt").text(0); //중복건수 수정 |
|
| 272 |
+ var selectedData = $objTabul.getSelectedRows(); |
|
| 273 |
+ |
|
| 274 |
+ if(selectedData == "" || selectedData == null){
|
|
| 275 |
+ alert("삭제할 데이터를 선택해 주세요.");
|
|
| 276 |
+ return false; |
|
| 277 |
+ }else{ // 선택한 Row 데이터 삭제하기
|
|
| 278 |
+ for(var i=0; i < selectedData.length; i++){
|
|
| 279 |
+ selectedData[i].delete(); |
|
| 280 |
+ } |
|
| 281 |
+ } |
|
| 282 |
+ |
|
| 283 |
+ // 남은 행 수 계산 |
|
| 284 |
+ var totRows = $objTabul.getRows().length; |
|
| 285 |
+ |
|
| 286 |
+ // 1000개 행이 되도록 나머지 행 생성 |
|
| 287 |
+ for (var i = totRows; i < 1000; i++) {
|
|
| 288 |
+ $objTabul.addRow({addrNm: "", addrPhoneNo: "", addrInfo1: "", addrInfo2: "", addrInfo3: "", addrInfo4: "", addrComment: ""});
|
|
| 289 |
+ } |
|
| 290 |
+ |
|
| 291 |
+ |
|
| 292 |
+ var existingNumbers = []; // 중복 번호를 저장할 배열 |
|
| 293 |
+ // 모든 행의 'addrPhoneNo' 값을 배열에 추가 |
|
| 294 |
+ var allRows = $tableSelf.getData(); // 테이블의 모든 데이터를 가져옴 |
|
| 295 |
+ allRows.forEach(function(row) {
|
|
| 296 |
+ if (row.addrPhoneNo) {
|
|
| 297 |
+ const cleanedExistingNumber = row.addrPhoneNo.replace(/[^0-9]/g, ''); // 숫자만 남김 |
|
| 298 |
+ existingNumbers.push(cleanedExistingNumber); // 기존 번호를 배열에 추가 |
|
| 299 |
+ } |
|
| 300 |
+ }); |
|
| 301 |
+ updateTotCnt(existingNumbers.length); |
|
| 302 |
+ }); |
|
| 303 |
+ |
|
| 304 |
+ //전체 데이터 갯수 구하는 함수 |
|
| 305 |
+ function updateTotCnt(data){
|
|
| 306 |
+ |
|
| 307 |
+ var tabulNm = fn_utils_getTabulatorNm(); |
|
| 308 |
+ var tabluC = '.'+tabulNm |
|
| 309 |
+ |
|
| 310 |
+ $(tabluC+" #rowTotCnt").text(data); |
|
| 311 |
+ |
|
| 312 |
+ } |
|
| 313 |
+ |
|
| 314 |
+ /* |
|
| 315 |
+ * 타이틀 select 선택할때마다 실행해서 |
|
| 316 |
+ * 데이터테이블 필드값 수정 |
|
| 317 |
+ */ |
|
| 318 |
+ function updateTableFields($objTabul, group) {
|
|
| 319 |
+ // 데이터가져오기 |
|
| 320 |
+ var currentData = $objTabul.getData(); |
|
| 321 |
+ |
|
| 322 |
+ // 필드 초기 값 셋팅 |
|
| 323 |
+ var columns = [ |
|
| 324 |
+ {formatter: "rowSelection", titleFormatter: "rowSelection", clipboard: false, hozAlign: "center", headerHozAlign: "center", headerSort: false, cellClick: function(e, cell) {
|
|
| 325 |
+ cell.getRow().toggleSelect(); |
|
| 326 |
+ }} |
|
| 327 |
+ ,{formatter:"rownum", align:"center", title:"No", hozAlign:"center", headerHozAlign:"center", width:40}
|
|
| 328 |
+ ]; |
|
| 329 |
+ |
|
| 330 |
+ var fieldMapping = []; |
|
| 331 |
+ // 초기 후 필드 값 셋팅하기 |
|
| 332 |
+ $('[data-group="' + group + '"] .field-selector').each(function(index) {
|
|
| 333 |
+ var selectedField = $(this).val(); |
|
| 334 |
+ // ASCII 문자 코드 사용 - 65=A, 66=B ... |
|
| 335 |
+ var field = String.fromCharCode(65 + index); |
|
| 336 |
+ if (selectedField) {
|
|
| 337 |
+ columns.push({
|
|
| 338 |
+ title: field |
|
| 339 |
+ , field: selectedField |
|
| 340 |
+ , hozAlign: "center" |
|
| 341 |
+ , headerHozAlign: "center" |
|
| 342 |
+// , editor: "input" |
|
| 343 |
+ , editor: false |
|
| 344 |
+ , width: 125 |
|
| 345 |
+ , validator: ["maxLength:100", "string"] |
|
| 346 |
+ }); |
|
| 347 |
+ fieldMapping.push(selectedField); |
|
| 348 |
+ } else {
|
|
| 349 |
+ columns.push({
|
|
| 350 |
+ title: field |
|
| 351 |
+ , field: field |
|
| 352 |
+ , hozAlign: "center" |
|
| 353 |
+ , headerHozAlign: "center" |
|
| 354 |
+// , editor: "input" |
|
| 355 |
+ , editor: false |
|
| 356 |
+ , width: 125 |
|
| 357 |
+ , validator: ["maxLength:100", "string"] |
|
| 358 |
+ }); |
|
| 359 |
+ fieldMapping.push(field); |
|
| 360 |
+ } |
|
| 361 |
+ }); |
|
| 362 |
+ |
|
| 363 |
+ // 데이터 셋팅 |
|
| 364 |
+ var updatedData = currentData.map(row => {
|
|
| 365 |
+ var newRow = {};
|
|
| 366 |
+ fieldMapping.forEach((field, index) => {
|
|
| 367 |
+ newRow[field] = row[Object.keys(row)[index]] || ""; |
|
| 368 |
+ }); |
|
| 369 |
+ return newRow; |
|
| 370 |
+ }); |
|
| 371 |
+ |
|
| 372 |
+ $objTabul.setColumns(columns); |
|
| 373 |
+ $objTabul.setData(updatedData); |
|
| 374 |
+ } |
|
| 375 |
+}); |
|
| 376 |
+ |
|
| 377 |
+ |
|
| 378 |
+ |
|
| 379 |
+ |
|
| 380 |
+// 주소록 에러결과 초기화 |
|
| 381 |
+function fn_errorPopClean(){
|
|
| 382 |
+ |
|
| 383 |
+ var tabulNm = fn_utils_getTabulatorNm(); |
|
| 384 |
+ var tabluC = '.'+tabulNm |
|
| 385 |
+ |
|
| 386 |
+ // popup 영역 |
|
| 387 |
+ $tableError.clearData(); |
|
| 388 |
+ |
|
| 389 |
+ |
|
| 390 |
+ // 중복 카운트 |
|
| 391 |
+ $("#errorPopDupCnt").text(0);
|
|
| 392 |
+ // 에러 카운트 |
|
| 393 |
+ $("#errorPopErrorCnt").text(0);
|
|
| 394 |
+ // |
|
| 395 |
+ $("#errorPopTotCnt").text(0);
|
|
| 396 |
+ |
|
| 397 |
+ // select box 초기화 |
|
| 398 |
+ $(tabluC+' .field-selector').each(function() { $(this).val(''); });
|
|
| 399 |
+ |
|
| 400 |
+} |
|
| 401 |
+ |
|
| 402 |
+function fn_rowCntInit(){
|
|
| 403 |
+ |
|
| 404 |
+ var tabulNm = fn_utils_getTabulatorNm(); |
|
| 405 |
+ var tabluC = '.'+tabulNm |
|
| 406 |
+ |
|
| 407 |
+ $(tabluC+" #rowTotCnt").text(0); //총건수 수정 |
|
| 408 |
+ $(tabluC+" #rowDupCnt").text(0); //중복건수 수정 |
|
| 409 |
+ $(tabluC+" #rowErrorCnt").text(0); //중복건수 수정 |
|
| 410 |
+} |
|
| 411 |
+ |
|
| 412 |
+ |
|
| 413 |
+ |
|
| 414 |
+//1. 필드 초기화 함수 |
|
| 415 |
+function resetTableFieldsToDefault() {
|
|
| 416 |
+ |
|
| 417 |
+ // 타불 객체 가져오기 |
|
| 418 |
+ var $objTabul = fn_utils_getTabulator(); |
|
| 419 |
+ |
|
| 420 |
+ // 필드를 A, B, C, D로 초기화 |
|
| 421 |
+ var defaultFields = ['A', 'B', 'C', 'D', 'E', 'F', 'G']; |
|
| 422 |
+ |
|
| 423 |
+ // 테이블의 기존 데이터를 가져옵니다. |
|
| 424 |
+ var currentData = $objTabul.getData(); |
|
| 425 |
+ |
|
| 426 |
+ // 초기 필드(A, B, C, D 등)를 위한 열 설정 |
|
| 427 |
+ var columns = [ |
|
| 428 |
+ {formatter: "rowSelection", titleFormatter: "rowSelection", clipboard: false, hozAlign: "center", headerHozAlign: "center", headerSort: false, cellClick: function(e, cell) {
|
|
| 429 |
+ cell.getRow().toggleSelect(); |
|
| 430 |
+ }}, |
|
| 431 |
+ {formatter:"rownum", align:"center", title:"No", hozAlign:"center", headerHozAlign:"center", width:40}
|
|
| 432 |
+ ]; |
|
| 433 |
+ |
|
| 434 |
+ // 기본 필드로 열 구성 |
|
| 435 |
+ defaultFields.forEach(field => {
|
|
| 436 |
+ columns.push({
|
|
| 437 |
+ title: field, |
|
| 438 |
+ field: field, |
|
| 439 |
+ hozAlign: "center", |
|
| 440 |
+ headerHozAlign: "center", |
|
| 441 |
+ editor: false, // 편집 비활성화 |
|
| 442 |
+ width: 125, |
|
| 443 |
+ validator: ["maxLength:100", "string"] |
|
| 444 |
+ }); |
|
| 445 |
+ }); |
|
| 446 |
+ |
|
| 447 |
+ // 테이블을 기본 필드로 업데이트 |
|
| 448 |
+ $objTabul.setColumns(columns); |
|
| 449 |
+// $objTabul.setData(updatedData); |
|
| 450 |
+} |
|
| 451 |
+ |
|
| 452 |
+ |
|
| 453 |
+ |
--- src/main/webapp/js/web/addr/init.js
+++ src/main/webapp/js/web/addr/init.js
... | ... | @@ -158,7 +158,6 @@ |
| 158 | 158 |
$tableExcel.on("columnWidth",function(column){
|
| 159 | 159 |
var titleIndex = titleArray.indexOf(column._column.definition.title); |
| 160 | 160 |
titleIndex += 1; |
| 161 |
- console.log(titleIndex) |
|
| 162 | 161 |
if(titleIndex != 0){
|
| 163 | 162 |
$('.tableExcel .select_adr_hd>div').eq(titleIndex).css('width', column._column.width);
|
| 164 | 163 |
}else{
|
... | ... | @@ -181,7 +180,6 @@ |
| 181 | 180 |
$tableClip.on("columnWidth",function(column){
|
| 182 | 181 |
var titleIndex = titleArray.indexOf(column._column.definition.title); |
| 183 | 182 |
titleIndex += 1; |
| 184 |
- console.log(titleIndex) |
|
| 185 | 183 |
if(titleIndex != 0){
|
| 186 | 184 |
$('.tableClip .select_adr_hd>div').eq(titleIndex).css('width', column._column.width);
|
| 187 | 185 |
}else{
|
Add a comment
Delete comment
Once you delete this comment, you won't be able to recover it. Are you sure you want to delete this comment?