wyh 2024-11-08
팩스 주소록 등록기능 수정
@9b66d4a7a04bbbb3a6ce75a94a6973e95aff2de6
src/main/java/itn/let/fax/addr/service/FaxAddrService.java
--- src/main/java/itn/let/fax/addr/service/FaxAddrService.java
+++ src/main/java/itn/let/fax/addr/service/FaxAddrService.java
@@ -2,6 +2,8 @@
 
 import java.util.List;
 
+import itn.let.mail.service.StatusResponse;
+import itn.let.mjo.addr.service.AddrGroupVO;
 import itn.let.mjo.addr.service.AddrVO;
 
 public interface FaxAddrService {
@@ -90,4 +92,11 @@
 
 	List<FaxAddrVO> selectFaxAddrListAjax(FaxAddrVO faxAddrVO);
 	
+	public StatusResponse faxAddrMassInsertByTempAjax_advc(List<FaxAddrVO> faxAddrListVO, String userId) throws Exception;
+
+	void deleteFaxAddr_advc(FaxAddrGroupVO faxAddrGroupVO) throws Exception;
+
+	int getFaxAddrCount(FaxAddrGroupVO faxAddrGroupVO) throws Exception;
+	
+	
 }
src/main/java/itn/let/fax/addr/service/impl/FaxAddrServiceImpl.java
--- src/main/java/itn/let/fax/addr/service/impl/FaxAddrServiceImpl.java
+++ src/main/java/itn/let/fax/addr/service/impl/FaxAddrServiceImpl.java
@@ -1,12 +1,19 @@
 package itn.let.fax.addr.service.impl;
 
+import java.nio.charset.Charset;
 import java.text.SimpleDateFormat;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
 import java.util.Date;
 import java.util.List;
 import java.util.Locale;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 import javax.annotation.Resource;
 
+import org.springframework.http.HttpStatus;
 import org.springframework.stereotype.Service;
 
 import egovframework.rte.fdl.cmmn.EgovAbstractServiceImpl;
@@ -17,6 +24,7 @@
 import itn.let.fax.addr.service.FaxAddrService;
 import itn.let.fax.addr.service.FaxAddrTransHistVO;
 import itn.let.fax.addr.service.FaxAddrVO;
+import itn.let.mail.service.StatusResponse;
 import itn.let.mjo.addr.service.AddrVO;
 
 @Service("FaxAddrService")
@@ -35,6 +43,16 @@
 	@Resource(name = "egovAddrTransHistIdGnrService")
     private EgovIdGnrService idgenAddrTransHistId;
 
+	
+	private static final String FAX_REGEX = "^(0\\d{1,2})-(\\d{3,4})-(\\d{4})$";
+	private static final String FAX_M_REGEX = "^(050\\d{1})-(\\d{3,4})-(\\d{4})$";
+	private static final Pattern FAX_PATTERN = Pattern.compile(FAX_REGEX);
+	private static final Pattern FAX_M_PATTERN = Pattern.compile(FAX_M_REGEX);
+	
+    private static final Charset EUC_KR = Charset.forName("EUC-KR");
+    
+	private static final int MAX_SINGLE_ENTRY_CNT = 350000;
+    private static final int MAX_FAX_ADDR_CNT = 10000000; // 팩스 주소록 등록 최대 수량
 	
 	public List<FaxAddrVO> selectFaxAddrList(FaxAddrVO addrVO) throws Exception {
 		return faxAddrDAO.selectFaxAddrList(addrVO);
@@ -358,5 +376,180 @@
 	public List<FaxAddrVO> selectFaxAddrListAjax(FaxAddrVO faxAddrVO) {
 		return faxAddrDAO.selectFaxAddrListAjax(faxAddrVO);
 	}
+
+	@Override
+	public StatusResponse faxAddrMassInsertByTempAjax_advc(List<FaxAddrVO> faxAddrListVO, String userId) throws Exception {
+		
+		for (FaxAddrVO faxAddr : faxAddrListVO) { faxAddr.setMberId(userId); }
+		
+		if(faxAddrListVO.size() > MAX_SINGLE_ENTRY_CNT) {
+			return new StatusResponse(
+				HttpStatus.BAD_REQUEST
+				, "주소록은 한번에 100만개까지만 등록이 가능합니다."
+				, LocalDateTime.now()
+			);
+		}
+		
+		// step1 현재 주소록 갯수 조회
+		
+		// step1-1 회원별 주소록 전체 갯수 조회
+		int faxAddrBefCnt = faxAddrDAO.selectFaxAddrTotalCount(faxAddrListVO.get(0));
+		int faxAddrNewCnt = faxAddrListVO.size();	//신규 추가할 주소록 갯수
+		int sumFaxAddrCnt = faxAddrBefCnt + faxAddrNewCnt;	
+		
+		// step1-2 총 갯수가 (주소록 갯수 + 신규 주소록)1000만건 체크
+		if(sumFaxAddrCnt > MAX_FAX_ADDR_CNT) {
+			return new StatusResponse(
+				HttpStatus.BAD_REQUEST
+				, "주소록은 총 1000만개까지만 등록이 가능합니다."
+				, LocalDateTime.now()
+			);
+		}
+		
+		// step2 신규 주소록 생성 및 북마크 체크
+		if ("NEW".equals(faxAddrListVO.get(0).getAddrGrpId())) {
+			FaxAddrGroupVO faxAddrGroupVO = new FaxAddrGroupVO();
+			faxAddrGroupVO.setMberId(userId);
+			faxAddrGroupVO.setAddrGrpNm(faxAddrListVO.get(0).getAddrGrpNm());
+			
+			// 정렬순서
+			int nextOrderNumber = faxAddrGroupDAO.selectMaxOrderFaxNumber(faxAddrGroupVO);
+			faxAddrGroupVO.setGrpOrder(nextOrderNumber);
+			
+			faxAddrGroupDAO.insertFaxAddrGroup(faxAddrGroupVO);
+			
+			// 신규 추가한 그룹아이디
+    		for (FaxAddrVO faxAddr : faxAddrListVO) { faxAddr.setAddrGrpId(faxAddrGroupVO.getAddrGrpId()); }
+		}else if  ("bookmark".equals(faxAddrListVO.get(0).getAddrGrpId())) {
+			for (FaxAddrVO faxAddr : faxAddrListVO) {
+				faxAddr.setBookmark("Y"); 
+				faxAddr.setAddrGrpId("0"); 
+			}
+		}else {
+			for (FaxAddrVO faxAddr : faxAddrListVO) { faxAddr.setBookmark("N"); }
+		} 
+		
+		// step3
+		// 		=> 팩스번호 빼고 바이트 체크해서 20byte만 짜르고 넣기
+		// 		=> 팩스번호는 유효성 체크 하기
+		long startTime = System.currentTimeMillis();
+		
+		// 유효성 체크 및 하이픈 제거, 유효하지 않은 번호는 리스트에서 제거
+		// 나머지 필드들 20byte (euc-kr) 체크 후 넘으면 자르기
+		AtomicInteger invalid = new AtomicInteger(0); // 스레드-안전(thread-safe)하게 정수 값을 업데이트할 수 있는 기능을 제공
+		faxAddrListVO.removeIf(faxAddr -> {
+			String phoneNo = faxAddr.getAddrPhoneNo();
+			
+			if (isValidFaxNumber(phoneNo)) {
+				faxAddr.setAddrPhoneNo(phoneNo); // 하이픈이 제거된 유효한 번호 설정
+				trimFieldsBytes(faxAddr); // 다른 필드들에 대한 20바이트 체크 및 자르기
+				return false; // 유효한 번호는 제거하지 않음
+			} else if (isValidMFaxNumber(phoneNo)) {
+				faxAddr.setAddrPhoneNo(phoneNo); // 하이픈이 제거된 유효한 번호 설정
+				trimFieldsBytes(faxAddr); // 다른 필드들에 대한 20바이트 체크 및 자르기
+				return false; // 유효한 번호는 제거하지 않음
+			}else{
+		        invalid.getAndIncrement(); // 유효하지 않은 번호 개수 증가
+				return true; // 유효하지 않은 번호는 제거
+			}
+        });
+		
+		long endTime = System.currentTimeMillis();
+		double executionTime = (endTime - startTime) / 1000.0;
+        System.out.println(" number chk Execution time: " + executionTime + " seconds");
+        
+        startTime = System.currentTimeMillis();
+        System.out.println("addrListVO.size() : "+ faxAddrListVO.size());
+        
+        try {
+	        if(faxAddrListVO.size() > 0) {
+	    		// 등록 
+	        	faxAddrDAO.insertFaxAddrList(faxAddrListVO);
+	        }
+
+		} catch (Exception e) {
+			// TODO: handle exception
+			e.printStackTrace();
+			return new StatusResponse(
+				HttpStatus.BAD_REQUEST
+				, "배치오류"
+				, LocalDateTime.now()
+			);
+		}
+        endTime = System.currentTimeMillis();
+        executionTime = (endTime - startTime) / 1000.0;
+        System.out.println("INSERT Execution time: " + executionTime + " seconds");
+        
+        
+        // 현재 시간 가져오기
+        LocalDateTime now = LocalDateTime.now();
+        
+        // 원하는 포맷 설정
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+        
+        // 포맷된 시간 문자열로 변환
+        String formattedDateTime = now.format(formatter);
+        
+        // 출력
+        System.out.println(formattedDateTime);
+        
+        
+		String message = "저장에 성공했습니다.\n저장 : " + faxAddrListVO.size() + "건"
+			+", INERT 총 시간 : " + executionTime+ "초"
+			+", 현재시간 : " + formattedDateTime;
+		
+		return new StatusResponse(
+				HttpStatus.OK
+				, message
+				, faxAddrListVO.get(0).getAddrGrpId()
+				);
+	}
+
+	@Override
+	public void deleteFaxAddr_advc(FaxAddrGroupVO faxAddrGroupVO) throws Exception {
+		 faxAddrGroupDAO.deleteFaxAddrGroup_advc(faxAddrGroupVO);
+	}
+
+	@Override
+	public int getFaxAddrCount(FaxAddrGroupVO faxAddrGroupVO) throws Exception {
+		// TODO Auto-generated method stub
+		return 0;
+	}
 	
+	public static boolean isValidFaxNumber(String faxNo) {
+        if (faxNo == null || faxNo.isEmpty()) {
+            return false;
+        }
+        Matcher matcher = FAX_PATTERN.matcher(faxNo);
+        return matcher.matches();
+    }
+	
+	public static boolean isValidMFaxNumber(String faxNo) {
+        if (faxNo == null || faxNo.isEmpty()) {
+            return false;
+        }
+        Matcher matcher = FAX_M_PATTERN.matcher(faxNo);
+        return matcher.matches();
+    }
+	
+	public static void trimFieldsBytes(FaxAddrVO faxAddr) {
+		faxAddr.setAddrNm(trimToBytes(faxAddr.getAddrNm(), 20));
+		faxAddr.setAddrComment(trimToBytes(faxAddr.getAddrComment(), 250));
+    }
+	
+	// maxBytes만큼 글자수 처리해서 리턴
+    public static String trimToBytes(String str, int maxBytes) {
+        if (str == null) {
+            return null;
+        }
+        byte[] bytes = str.getBytes(EUC_KR);
+        if (bytes.length <= maxBytes) {
+            return str;
+        }
+        int len = maxBytes;
+        while (len > 0 && bytes[len - 1] < 0) {
+            len--; // 바이트 배열을 maxBytes로 자를 때, 잘못된 분할을 피하기 위해 문자 경계 확인
+        }
+        return new String(bytes, 0, len, EUC_KR);
+    }
 }
 
src/main/java/itn/let/fax/addr/web/FaxAddrRestController.java (added)
+++ src/main/java/itn/let/fax/addr/web/FaxAddrRestController.java
@@ -0,0 +1,79 @@
+package itn.let.fax.addr.web;
+
+import java.time.LocalDateTime;
+import java.util.List;
+
+import javax.annotation.Resource;
+
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.ui.ModelMap;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import egovframework.rte.fdl.security.userdetails.util.EgovUserDetailsHelper;
+import itn.com.cmm.EgovMessageSource;
+import itn.com.cmm.LoginVO;
+import itn.com.utl.fcc.service.EgovStringUtil;
+import itn.let.fax.addr.service.FaxAddrGroupService;
+import itn.let.fax.addr.service.FaxAddrService;
+import itn.let.fax.addr.service.FaxAddrVO;
+import itn.let.mail.service.StatusResponse;
+
+/**
+ * 팩스 주소록 관한 controller 클래스를 정의한다.
+ * @author ITN
+ * @since 2024.11.08
+ * @version 1.0
+ * @see
+ *
+ * <pre>
+ * << 개정이력(Modification Information) >>
+ *
+ *   수정일      수정자           수정내용
+ *  -------    --------    ---------------------------
+ *   2021.04.08  ITN          최초 생성
+ *
+ * </pre>
+ */
+@RestController
+public class FaxAddrRestController {
+
+	
+	@Resource (name = "FaxAddrService")
+	private FaxAddrService faxAddrService;
+	
+	@Resource (name = "FaxAddrGroupService")
+	private FaxAddrGroupService faxAddrGroupService;
+	
+	/** EgovMessageSource */
+	@Resource(name="egovMessageSource")
+	EgovMessageSource egovMessageSource;
+	
+    /**
+     *  팩스 주소록 대량등록 저장
+     * @param searchVO
+     * @param model
+     * @return	"/web/mjon/addr/addrMassInsertByTempAjax_advc.do"
+     * @throws Exception
+     */
+	@RequestMapping(value= {"/web/mjon/fax/addr/faxAddrMassInsertByTempAjax_advc.do"})
+	public ResponseEntity<StatusResponse> faxAddrMassInsertByTempAjax_advc(
+			@RequestBody List<FaxAddrVO> faxAddrListVO
+			,ModelMap model) throws Exception{
+		
+		LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
+		String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
+		
+		if(userId.equals("")) {
+			return ResponseEntity.ok(
+					new StatusResponse(HttpStatus.UNAUTHORIZED
+							, "로그인을 하셔야 이용 가능합니다."
+							, LocalDateTime.now()
+							)
+					);
+		}
+		return ResponseEntity.ok().body(faxAddrService.faxAddrMassInsertByTempAjax_advc(faxAddrListVO, userId));
+	} 
+}(No newline at end of file)
src/main/webapp/WEB-INF/jsp/web/fax/addr/FaxAddrList.jsp
--- src/main/webapp/WEB-INF/jsp/web/fax/addr/FaxAddrList.jsp
+++ src/main/webapp/WEB-INF/jsp/web/fax/addr/FaxAddrList.jsp
@@ -638,6 +638,8 @@
 	var $objTabul = fn_utils_getTabulator();
 	$objTabul.clearData();
 	
+	fn_rowDataClear();
+	
 	$("#rowTotCnt").text(0);	//총건수 수정
 	$("#rowDupCnt").text(0);	//중복건수 수정
 	$("#rowErrorCnt").text(0);	//오류건수 수정
@@ -654,6 +656,28 @@
 	addrLoadAjax();
 	fn_errorPopClean(); // 에러 팝업 초기화
 }
+
+//주소록 탭마다 돌면서 총, 중복, 오류 건수 초기화
+function fn_rowDataClear(){
+
+	// 모든 .tab 요소를 선택하여 반복
+	$('#tbTabl .tab').each(function() {
+	    // 현재 반복 중인 요소
+	    var tab = $(this);
+
+	    // data-tabul 값 가져오기
+	    var tabulNm = tab.data('tabul');
+		var tabluC = '.'+tabulNm
+
+	    // 중복 카운트
+	    $(tabluC+" #rowTotCnt").text(0);
+	    // 에러 카운트
+	    $(tabluC+" #rowDupCnt").text(0);
+	    // 
+	    $(tabluC+" #rowErrorCnt").text(0);
+	});
+}
+
 
 // 주소록 그룹 중복체크
 function getAddrGroupDuplCheckAjax(addrGrpNm) {
@@ -702,9 +726,14 @@
 		return false;
 	}
 	
+	if($objTabul.getData().length > 300000){
+		alert("30만개 까지 등록 가능합니다.");
+		return false;
+	}
+	
 	var columns = $objTabul.getColumns();
-	var isAddrFaxNoSelected = columns.some(column => column.getField() === 'addrFaxNo');
-	if (!isAddrFaxNoSelected) {
+	var isAddrPhoneNoSelected = columns.some(column => column.getField() === 'addrPhoneNo');
+	if (!isAddrPhoneNoSelected) {
 		alert('팩스번호가 선택되지 않았습니다.');
 		return false;
 	}
@@ -720,7 +749,6 @@
 		$(tabluC+" #addrGrpNm").focus();
 		return false;		
 	}
-	
 	
 	// 새 그룹명 중복체크
 	if ($(tabluC+" #addrGrpIdInfo option:selected").val() == "NEW" 
@@ -740,108 +768,97 @@
 	var phoneList = [];
 	var nameList = [];
 	var memoList = [];
-	
-	var commaSelectedData = numberWithCommas(selectedData.length);
 	var confirmMsg = "저장하시겠습니까?\n이름 20byte, 메모 250byte 초과 글자는 절사됩니다.";
-	if (selectedData.length >= 10000) {
-		confirmMsg = "저장하시겠습니까?\n이름 20byte, 메모 250byte 초과 글자는 절사됩니다.\n1만건 이상 등록시 약 30초정도 소요됩니다.\n잠시만 기다려주세요.";
-	}
-	else if (selectedData.length > 2000) {
-		confirmMsg = "저장하시겠습니까?\n이름 20byte, 메모 250byte 초과 글자는 절사됩니다.\n" + commaSelectedData + "건 등록시 수초정도 소요됩니다.\n잠시만 기다려주세요.";
-	}	
-	 
 	if (confirm(confirmMsg)) {
-		
-		for (var i=0; i < selectedData.length; i++) {
-			var name = $tableExcel.getRows()[i].getData().addrNm;
-			var phone = removeDash($tableExcel.getRows()[i].getData().addrFaxNo);
-			var memo = $tableExcel.getRows()[i].getData().addrMemo;
-			
-			// name
-			if (name == "" || name == null || name == undefined) {
-				nameList[i] = "";
-			}
-			else {
-				if(!addrEmojiCheck(name)){//이모지 체크 해주기
-					return false;
-				}
-				nameList[i] = name.replace(/,/g,"§");
-			}
-			
-			// memo
-			phoneList[i] = phone;
-			
-			// memo
-			if (memo == "" || memo == null || memo == undefined) {
-				memoList[i] = "";
-			}
-			else {
-				if(!addrEmojiCheck(memo)){//이모지 체크 해주기
-					return false;
-				}
-				memoList[i] = memo.replace(/,/g,"§");
-			}
-
-		}
-		
-		var form = document.addrMassForm;
-		form.phoneList.value = phoneList;
-		form.nameList.value = nameList;
-		form.memoList.value = memoList;
-		form.addrGrpId.value = $("#addrGrpIdInfo").val();
-		
-		var data = new FormData(form);
-		
-		url = "/web/mjon/fax/addr/faxAddrMassInsertByTempAjax.do";
-		
-		$.ajax({
-	        type: "POST",
-	        url: url,
-	        data: data,
-	        dataType:'json',
-	        async: true,
-	        processData: false,
-	        contentType: false,
-	        cache: false,
-	        success: function (returnData) {
-				if (returnData.isSuccess) { 
-					alert("저장에 성공했습니다.\n저장 : " + returnData.resultCnt + "건, 중복 : " + returnData.dupliCnt + "건, 팩스번호 오류 : " + returnData.errPhoneCnt + "건");
-
-					// 중복번호 Hide
-					$("#btnAddrMassDupli").hide();
-					$("#btnAddrMassSaveDupli").hide();
-					
-					// 중복건이 있을경우
-					if (returnData.dupliCnt > 0) {
-						// 중복번호(해당 그룹) Show
-						$("#btnAddrMassSaveDupli").show();
-						addrMassDupliSaveList = returnData.addrMassDupliList;
-					}
-					
-					// 데이터 비우기
-					SetClear();		
-					
-					// 주소록그룹 콤보박스 유지
-					setTimeout(setSelectMassSetting, 500, selectMassVal);					
-				} 
-				else {
-					alert("오류 알림 : " + returnData.msg);
-				}
-			},
-	        error: function (e) { 
-	        	alert("저장에 실패하였습니다."); 
-	        	alert("ERROR : " + JSON.stringify(e)); 
-	        },
-			beforeSend : function(xmlHttpRequest) {
-	        	//로딩창 show
-	        	$('.loading_layer').addClass('active');				
-			},	        	        
-	        complete : function(xhr, textStatus) {
-	        	//로딩창 hide
-	        	$('.loading_layer').removeClass('active');
-			}	        
-	    });
+		//로딩창 show
+		fn_loadAddActive();				
+		setTimeout(setSenderList_advc, 1000);
 	}
+}
+
+function setSenderList_advc(){
+
+	var tabulNm = fn_utils_getTabulatorNm();
+	var tabluC = '.'+tabulNm
+	  
+    var $objTabul = fn_utils_getTabulator();
+    var dataToSend = $objTabul.getData();
+    console.log('dataToSend : ', dataToSend);
+    var addrGrpIdInfo = $(tabluC+" #addrGrpIdInfo option:selected").val();
+    var addrGrpNmInfo = $(tabluC+" #addrGrpNm").val();
+
+    var batchSize = 30000; // 배치 크기
+    var totalBatches = Math.ceil(dataToSend.length / batchSize); // 총 배치 수
+    var currentBatch = 0; // 현재 배치 인덱스
+
+	fn_loadAddActive();
+    
+	function sendBatch() {
+		if (currentBatch < totalBatches) {
+			
+			fn_loadAddActive();
+            var start = currentBatch * batchSize;
+            var end = Math.min(start + batchSize, dataToSend.length);
+            var batchData = dataToSend.slice(start, end);
+			
+			
+			var updateData = batchData.map(row => {
+	            row.addrGrpId = addrGrpIdInfo;
+	            row.addrGrpNm = addrGrpNmInfo;
+	            return row;
+	        });
+			
+			 console.log('updateData : ', updateData);
+			
+			$.ajax({
+		        type: "POST"
+		        , url: "/web/mjon/fax/addr/faxAddrMassInsertByTempAjax_advc.do"
+		        , data: JSON.stringify(updateData)
+		        , dataType:'json'
+		        , contentType: 'application/json'
+		        , async: true
+		        , success: function (data) {
+		        	
+		        	fn_loadRemoveActive();
+		        	
+		        	console.log('Batch ' + (currentBatch + 1) + ' success: ', data);
+					if (data.status == 'OK') {
+						if (currentBatch === totalBatches - 1) {
+                            alert("모든 데이터가 성공적으로 저장되었습니다.");
+                            // 데이터 비우기
+                            SetClear($objTabul);
+                            setAddrMassClose();
+                            $("#btnAddrMassClose").trigger("click");
+                        } else {
+                            currentBatch++;
+                            // 새로만든 그룹ID나 기존 ID를 넣어줌
+                            // 그룹추가 시 배치별로 똑같은 그룹을 생성해서 방지차원으로 넣어줌 
+                            addrGrpIdInfo = data.object;
+                            sendBatch(); // 다음 배치 전송
+                        }
+					} else {
+						alert("오류 알림 : " + returnData.msg);
+					}
+				}
+				,error: function (e) { 
+					alert("배치 전송에 실패하였습니다."); 
+	                console.error("ERROR: ", JSON.stringify(e)); 
+		        }
+				,beforeSend : function(xmlHttpRequest) {
+				}
+		        ,complete : function(xhr, textStatus) {
+					if (currentBatch === totalBatches - 1) {
+						$('#lodingTxt').text('Loading');
+					} else {
+						$('#lodingTxt').text(end+'...');
+					}
+				}	        
+		    });
+		}
+	}
+	
+	// 첫 번째 배치 전송 시작
+    sendBatch();
 }
 
 //주소록그룹 콤보박스 유지
@@ -849,23 +866,32 @@
 	$("#addrGrpIdInfo").val(selectMassVal).prop("selected", true);	
 }
 
-
 //데이터 비우기
-function SetClear() {
-	$("#addrGrpNm").val(""); //	새그룹명 Clear;
-	// 주소록 그룹정보 불러오기
-	getAddrGroupList();	
+function SetClear($objTabul) {
 	
-	var data = $tableExcel.getRows();	
-	if (data == null || data == "") {
-		
+	var tabulNm = fn_utils_getTabulatorNm();
+	var tabluC = '.'+tabulNm
+	
+	$(tabluC+" #addrGrpNm").val(""); //	새그룹명 Clear;
+	// 주소록 그룹정보 불러오기
+	getAddrGroupList();
+	
+	if (tabulNm === 'tableSelf') {
+		var tableData = [];
+		for (var i = 0; i < 1000; i++) {
+			tableData.push({addrNm: "", addrPhoneNo: "", addrInfo1: "", addrInfo2: "", addrInfo3: "", addrInfo4: "", addrComment: ""});
+		}
+		console.log(tableData); // 데이터 출력 확인
+		fn_selfmakeTable()
 	}else{
-		$tableExcel.clearData();
-		$("#rowTotCnt").text(0);	//총건수 초기화
-		$("#rowDupCnt").text(0);	//중복건수 초기화
-		$("#rowErrorCnt").text(0);	//오류건수 초기화
-		dupliPhoneDataRealList.length = 0;	// 중복 팩스번호 초기화
+	 	$objTabul.clearData(); // clearData는 동기 방식이므로 바로 실행
 	}
+	
+	$(tabluC+" #rowTotCnt").text(0);	//총건수 수정
+	$(tabluC+" #rowDupCnt").text(0);	//중복건수 수정
+	$(tabluC+" #rowErrorCnt").text(0);	//오류건수 수정
+	// popup 영역
+	fn_errorPopClean();
 }
 
 //주소 대량등록 버튼 클릭 
src/main/webapp/WEB-INF/jsp/web/fax/addr/include/FaxAddrListforExcel.jsp
--- src/main/webapp/WEB-INF/jsp/web/fax/addr/include/FaxAddrListforExcel.jsp
+++ src/main/webapp/WEB-INF/jsp/web/fax/addr/include/FaxAddrListforExcel.jsp
@@ -380,7 +380,7 @@
 			<select class="field-selector">
 				<option value="">선택하기</option>
 				<option value="addrNm">이름</option>
-				<option value="addrFaxNo">팩스번호</option>
+				<option value="addrPhoneNo">팩스번호</option>
 				<option value="addrComment">메모</option>
 			</select>
 		</div>
@@ -389,7 +389,7 @@
 			<select class="field-selector">
 				<option value="">선택하기</option>
 				<option value="addrNm">이름</option>
-				<option value="addrFaxNo">팩스번호</option>
+				<option value="addrPhoneNo">팩스번호</option>
 				<option value="addrComment">메모</option>
 			</select>
 		</div>
@@ -398,7 +398,7 @@
 			<select class="field-selector">
 				<option value="">선택하기</option>
 				<option value="addrNm">이름</option>
-				<option value="addrFaxNo">팩스번호</option>
+				<option value="addrPhoneNo">팩스번호</option>
 				<option value="addrComment">메모</option>
 			</select>
 		</div>
src/main/webapp/js/user/fax/addr/faxEvent.js
--- src/main/webapp/js/user/fax/addr/faxEvent.js
+++ src/main/webapp/js/user/fax/addr/faxEvent.js
@@ -38,7 +38,7 @@
 		updateTableFields($objTabul, group);
 		
 		// 필드가 팩스번호이면 열 중복체크
-		if($(this).val() == 'addrFaxNo'){
+		if($(this).val() == 'addrPhoneNo'){
 			fn_phoneDupl($objTabul);
 		}
 		
@@ -68,7 +68,7 @@
 
 		data.forEach((row, index) => {
 	
-			const number = row.addrFaxNo;
+			const number = row.addrPhoneNo;
 
 	        // number가 null, undefined, 빈 문자열이거나 숫자인 경우 처리
 	        if (!number || (typeof number === 'string' && !number.trim())){
@@ -81,7 +81,7 @@
 			
 			if (!existingNumbers.has(cleanedNumber)) { // 중복 번호 체크
 				if (isValidPhoneNumber(formattedNumber)) { // 유효성 검사
-					row.addrFaxNo = formattedNumber;
+					row.addrPhoneNo = formattedNumber;
 					existingNumbers.add(cleanedNumber); // 추가된 번호를 기존 목록에 추가
 					newData.push(row); // 유효한 데이터만 새로운 배열에 추가
 				} else {
@@ -90,7 +90,7 @@
 					
 					errors.push({ 
 						name: row.addrNm, // 이름
-						phone: row.addrFaxNo, // 폰번호
+						phone: row.addrPhoneNo, // 폰번호
 						result: "오류" // 결과 메시지 추가
 					});
 				}
@@ -100,7 +100,7 @@
 				
 				errors.push({ 
 					name: row.addrNm, // 이름
-					phone: row.addrFaxNo, // 폰번호
+					phone: row.addrPhoneNo, // 폰번호
 					result: "중복" // 결과 메시지 추가
 				});
 			}
@@ -189,7 +189,7 @@
 	    for (var i = 0; i < 1000; i++) {
 	    	newTableData.push({
 				addrNm: "", 
-				addrFaxNo: "", 
+				addrPhoneNo: "", 
 				addrNemo: ""
 	        });
 	    }
@@ -226,16 +226,16 @@
 
 	    // 1000개 행이 되도록 나머지 행 생성
 	    for (var i = totRows; i < 1000; i++) {
-	        $objTabul.addRow({addrNm: "", addrFaxNo: "", addrMemo: ""});
+	        $objTabul.addRow({addrNm: "", addrPhoneNo: "", addrMemo: ""});
 	    }
 
 
 	    var existingNumbers = []; // 중복 번호를 저장할 배열
-		// 모든 행의 'addrFaxNo' 값을 배열에 추가
+		// 모든 행의 'addrPhoneNo' 값을 배열에 추가
 		var allRows = $tableSelf.getData(); // 테이블의 모든 데이터를 가져옴
 		allRows.forEach(function(row) {
-			if (row.addrFaxNo) {
-				const cleanedExistingNumber = row.addrFaxNo.replace(/[^0-9]/g, ''); // 숫자만 남김
+			if (row.addrPhoneNo) {
+				const cleanedExistingNumber = row.addrPhoneNo.replace(/[^0-9]/g, ''); // 숫자만 남김
 				existingNumbers.push(cleanedExistingNumber); // 기존 번호를 배열에 추가
 			}
 		});
Add a comment
List