이호영 이호영 2024-07-29
주소록 > 엑셀입력 완료
@fc33fff87e8bccac13db493675f0c0c91bd6a777
src/main/java/itn/let/mail/service/StatusResponse.java
--- src/main/java/itn/let/mail/service/StatusResponse.java
+++ src/main/java/itn/let/mail/service/StatusResponse.java
@@ -5,6 +5,10 @@
 import org.springframework.http.HttpStatus;
 
 import itn.let.mjo.pay.service.RefundVO;
+import lombok.Builder;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
 
 /**
  * 
@@ -22,6 +26,9 @@
  * 
  * 
  */
+@Getter
+@Setter
+@NoArgsConstructor
 public class StatusResponse {
 
 	private  HttpStatus status;
@@ -61,51 +68,13 @@
 		this.messageTemp = messageTemp;
 	}
 	
-	public HttpStatus getStatus() {
-		return status;
-	}
-
-	public void setStatus(HttpStatus status) {
+	@Builder
+	public StatusResponse(HttpStatus status, String msg, Object data) {
 		this.status = status;
+		this.message = msg;
+		this.object = data;
 	}
-
-	public String getMessage() {
-		return message;
-	}
-
-	public void setMessage(String message) {
-		this.message = message;
-	}
-
-	public String getMessageTemp() {
-		return messageTemp;
-	}
-
-	public void setMessageTemp(String messageTemp) {
-		this.messageTemp = messageTemp;
-	}
-
-	public RefundVO getRefundVO() {
-		return refundVO;
-	}
-
-	public void setRefundVO(RefundVO refundVO) {
-		this.refundVO = refundVO;
-	}
-
-	public Object getObject() {
-		return object;
-	}
-
-	public void setObject(Object object) {
-		this.object = object;
-	}
-
-	public LocalDateTime getTimestamp() {
-		return timestamp;
-	}
-
-	public void setTimestamp(LocalDateTime timestamp) {
-		this.timestamp = timestamp;
-	}
+ 
+	
+	
 }
src/main/java/itn/let/mjo/addr/service/AddrGroupService.java
--- src/main/java/itn/let/mjo/addr/service/AddrGroupService.java
+++ src/main/java/itn/let/mjo/addr/service/AddrGroupService.java
@@ -2,6 +2,8 @@
 
 import java.util.List;
 
+import itn.let.mail.service.StatusResponse;
+
 /**
  * 주소록 관리를 위한 서비스 인터페이스  클래스
  * @author ITN
src/main/java/itn/let/mjo/addr/service/AddrService.java
--- src/main/java/itn/let/mjo/addr/service/AddrService.java
+++ src/main/java/itn/let/mjo/addr/service/AddrService.java
@@ -2,6 +2,8 @@
 
 import java.util.List;
 
+import itn.let.mail.service.StatusResponse;
+
 /**
  * 주소록 관리를 위한 서비스 인터페이스  클래스
  * @author ITN
@@ -99,5 +101,6 @@
 	
 	// 주소록 대량등록 By Temp 주소록 All
 	public int insertAddrByTempAddrAll(List<AddrVO> addrList, AddrVO addrVO) throws Exception;
-	
+
+	public StatusResponse addrMassInsertByTempAjax_advc(List<AddrVO> addrListVO, String userId) throws Exception;
 }
src/main/java/itn/let/mjo/addr/service/impl/AddrGroupServiceImpl.java
--- src/main/java/itn/let/mjo/addr/service/impl/AddrGroupServiceImpl.java
+++ src/main/java/itn/let/mjo/addr/service/impl/AddrGroupServiceImpl.java
@@ -1,12 +1,19 @@
 package itn.let.mjo.addr.service.impl;
 
+import java.nio.charset.Charset;
+import java.time.LocalDateTime;
 import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 import javax.annotation.Resource;
 
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
 import org.springframework.stereotype.Service;
 
 import egovframework.rte.fdl.cmmn.EgovAbstractServiceImpl;
+import itn.let.mail.service.StatusResponse;
 import itn.let.mjo.addr.service.AddrGroupService;
 import itn.let.mjo.addr.service.AddrGroupVO;
 import itn.let.mjo.addr.service.AddrService;
@@ -37,6 +44,11 @@
 	
 	@Resource(name = "AddrDAO")
 	private AddrDAO addrDAO;
+	
+
+	
+	
+	
 
 	public List<AddrGroupVO> selectAddrGroupList(AddrGroupVO addrGroupVO) throws Exception {
 		return addrGroupDAO.selectAddrGroupList(addrGroupVO);
@@ -159,4 +171,6 @@
 		
 		
 	}
+
+	
 }
src/main/java/itn/let/mjo/addr/service/impl/AddrServiceImpl.java
--- src/main/java/itn/let/mjo/addr/service/impl/AddrServiceImpl.java
+++ src/main/java/itn/let/mjo/addr/service/impl/AddrServiceImpl.java
@@ -1,18 +1,25 @@
 package itn.let.mjo.addr.service.impl;
 
+import java.nio.charset.Charset;
 import java.text.SimpleDateFormat;
+import java.time.LocalDateTime;
 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;
 import egovframework.rte.fdl.idgnr.EgovIdGnrService;
 import egovframework.rte.fdl.security.userdetails.util.EgovUserDetailsHelper;
 import itn.com.cmm.LoginVO;
+import itn.let.mail.service.StatusResponse;
 import itn.let.mjo.addr.service.AddrGroupVO;
 import itn.let.mjo.addr.service.AddrService;
 import itn.let.mjo.addr.service.AddrTransHistVO;
@@ -44,10 +51,16 @@
 	@Resource(name = "AddrTransHistDAO")
 	private AddrTransHistDAO addrTransHistDAO;
 
-	
 	@Resource(name = "egovAddrTransHistIdGnrService")
     private EgovIdGnrService idgenAddrTransHistId;
 
+
+
+    private static final String PHONE_REGEX = "^(01[016789]-?\\d{3,4}-?\\d{4})$";
+    private static final Pattern PHONE_PATTERN = Pattern.compile(PHONE_REGEX);
+    private static final Charset EUC_KR = Charset.forName("EUC-KR");
+    private static final int MAX_ADDR_CNT = 500000;
+	
 	
 	public List<AddrVO> selectAddrList(AddrVO addrVO) throws Exception {
 		return addrDAO.selectAddrList(addrVO);
@@ -366,5 +379,153 @@
 		
 		return rtnVal;
 	}
+
+	@Override
+	public StatusResponse addrMassInsertByTempAjax_advc(List<AddrVO> addrListVO, String userId) throws Exception {
+		
 	
+    	
+		// data init
+    	// For-each loop
+		for (AddrVO addr : addrListVO) { addr.setMberId(userId); }
+
+		
+		
+		// step1 현재 주소록 갯수 조회
+
+		//회원별 주소록 전체 갯수 조회
+		int addrBefCnt = addrDAO.selectAddrTotalCount(addrListVO.get(0));    		
+		int addrNewCnt = addrListVO.size();	//신규 추가할 주소록 갯수
+		int sumAddrCnt = addrBefCnt + addrNewCnt;	
+
+		// step1-1 총 갯수가 (주소록 갯수 + 신규 주소록)50만건 체크
+		if(sumAddrCnt > MAX_ADDR_CNT) {
+			return new StatusResponse(
+							HttpStatus.BAD_REQUEST
+							, "주소록은 총 50만개까지만 등록이 가능합니다."
+							, LocalDateTime.now()
+							);
+					
+		}
+
+		// step2 신규 주소록 생성 및 북마크 체크
+		// 		=> AddrGrpId
+		//
+		if ("NEW".equals(addrListVO.get(0).getAddrGrpId())) {
+			
+			AddrGroupVO addrGroupVO = new AddrGroupVO();
+			addrGroupVO.setMberId(userId);
+			addrGroupVO.setAddrGrpNm(addrListVO.get(0).getAddrGrpNm());
+			// 정렬순서
+			
+			int nextOrderNumber = addrGroupDAO.selectMaxOrderNumber(addrGroupVO);
+			addrGroupVO.setGrpOrder(nextOrderNumber);
+			
+			addrGroupDAO.insertAddrGroup(addrGroupVO);
+			
+			// 신규 추가한 그룹아이디
+    		for (AddrVO addr : addrListVO) { addr.setAddrGrpId(addrGroupVO.getAddrGrpId()); }
+    		
+		}
+		else if ("bookmark".equals(addrListVO.get(0).getAddrGrpId())) 
+		{
+    		for (AddrVO addr : addrListVO) { addr.setBookmark("Y"); addr.setAddrGrpId("0"); }
+		} 
+		else 
+		{
+			for (AddrVO addr : addrListVO) { addr.setBookmark("N"); }
+		} 
+		
+		// step4-1 true 
+		// 		=> 폰번호 빼고 바이트 체크해서 20byte만 짜르고 넣기
+		// 		=> 폰번호는 유효성 체크 하기
+
+        long startTime = System.currentTimeMillis();
+		// 유효성 체크 및 하이픈 제거, 유효하지 않은 번호는 리스트에서 제거
+		// 나머지 필드들 20byte (euc-kr) 체크 후 넘으면 자르기
+		AtomicInteger invalid = new AtomicInteger(0); // 스레드-안전(thread-safe)하게 정수 값을 업데이트할 수 있는 기능을 제공
+		addrListVO.removeIf(addr -> {
+			String phoneNo = addr.getAddrPhoneNo();
+//			phoneNo = phoneNo != null ? phoneNo.replaceAll("-", "") : "";
+//			System.out.println("phoneNo : "+ phoneNo);
+			if (isValidPhoneNumber(phoneNo)) {
+				addr.setAddrPhoneNo(phoneNo); // 하이픈이 제거된 유효한 번호 설정
+				trimFieldsBytes(addr); // 다른 필드들에 대한 20바이트 체크 및 자르기
+				return false; // 유효한 번호는 제거하지 않음
+			} else {
+//				System.out.println(phoneNo + " is an invalid phone number. Removing from list.");
+		        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() : "+ addrListVO.size());
+        
+        if(addrListVO.size() > 0) {
+    		// 등록 
+    		addrDAO.insertAddrList(addrListVO);
+        	
+        }
+
+        endTime = System.currentTimeMillis();
+        executionTime = (endTime - startTime) / 1000.0;
+        System.out.println("INSERT Execution time: " + executionTime + " seconds");
+		
+		
+		// 중복체크 dupliCnt
+		
+		
+		
+		//
+		String message = "저장에 성공했습니다.\n저장 : " + addrListVO.size() + "건"
+//			+", 중복 : " + invalid.dupliCnt + "건"
+			+", INERT 총 시간 : " + executionTime+ "초"
+			+", 휴대폰번호 오류 : " + invalid.get() + "건";
+
+		return new StatusResponse(
+				HttpStatus.OK
+				, message
+//				, ""
+				, LocalDateTime.now());
+	}
+
+    public static boolean isValidPhoneNumber(String phoneNo) {
+        if (phoneNo == null || phoneNo.isEmpty()) {
+            return false;
+        }
+        Matcher matcher = PHONE_PATTERN.matcher(phoneNo);
+        return matcher.matches();
+    }
+	
+
+    public static void trimFieldsBytes(AddrVO addr) {
+        addr.setAddrInfo1(trimToBytes(addr.getAddrInfo1(), 20));
+        addr.setAddrInfo2(trimToBytes(addr.getAddrInfo2(), 20));
+        addr.setAddrInfo3(trimToBytes(addr.getAddrInfo3(), 20));
+        addr.setAddrInfo4(trimToBytes(addr.getAddrInfo4(), 20));
+        addr.setAddrComment(trimToBytes(addr.getAddrComment(), 250));
+        addr.setAddrNm(trimToBytes(addr.getAddrNm(), 20));
+    }
+
+    // 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/mjo/addr/web/AddrRestController.java
--- src/main/java/itn/let/mjo/addr/web/AddrRestController.java
+++ src/main/java/itn/let/mjo/addr/web/AddrRestController.java
@@ -1,26 +1,25 @@
 package itn.let.mjo.addr.web;
 
+import java.nio.charset.Charset;
 import java.time.LocalDateTime;
-import java.util.ArrayList;
 import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 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.ModelAttribute;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
-import org.springframework.web.servlet.ModelAndView;
 import org.springframework.web.servlet.mvc.support.RedirectAttributes;
 
 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.admin.service.FaxStatVO;
 import itn.let.mail.service.StatusResponse;
 import itn.let.mjo.addr.service.AddrGroupService;
 import itn.let.mjo.addr.service.AddrGroupVO;
@@ -63,55 +62,31 @@
      * 주소록 대량등록 저장
      * @param searchVO
      * @param model
-     * @return	"/web/mjon/addr/addrMassInsertByTempAjax.do"
+     * @return	"/web/mjon/addr/addrMassInsertByTempAjax_advc.do"
      * @throws Exception
      */
 	@RequestMapping(value= {"/web/mjon/addr/addrMassInsertByTempAjax_advc.do"})
-	public ResponseEntity<StatusResponse> addrMassInsertByTempAjax(@RequestBody List<AddrVO> addrListVO,
-			RedirectAttributes redirectAttributes, 
-			ModelMap model) throws Exception{
+	public ResponseEntity<StatusResponse> addrMassInsertByTempAjax_advc(@RequestBody List<AddrVO> addrListVO
+			,ModelMap model) throws Exception{
 		
 		
-		System.out.println("??");
-		System.out.println("?? " + addrListVO.get(0).toString());
 		
-		return ResponseEntity.ok().body(new StatusResponse(HttpStatus.OK, "", LocalDateTime.now()));
+		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(addrService.addrMassInsertByTempAjax_advc(addrListVO, userId));
 	} 
 	
-	/* 바이트 자르기
-	UTF-8일 경우
-	subStringBytes("블라블라블라라", 10, 3);
-	EUC-KR일 경우
-	subStringBytes("블라블라블라라", 10, 2);
-	*/
-	public String subStringBytes(String str, int byteLength, int sizePerLetter) {
-		  int retLength = 0;
-		  int tempSize = 0;
-		  int asc;
-		  if (str == null || "".equals(str) || "null".equals(str)) {
-		    str = "";
-		  }
-		 
-		  int length = str.length();
-		 
-		  for (int i = 1; i <= length; i++) {
-		    asc = (int) str.charAt(i - 1);
-		    if (asc > 127) {
-		      if (byteLength >= tempSize + sizePerLetter) {
-		        tempSize += sizePerLetter;
-		        retLength++;
-		      }
-		    } else {
-		      if (byteLength > tempSize) {
-		        tempSize++;
-		        retLength++;
-		      }
-		    }
-		  }
-		 
-	  return str.substring(0, retLength);
-	}
-
+	// 
 
 	
 }
(No newline at end of file)
src/main/resources/egovframework/sqlmap/let/mjo/addr/Addr_SQL_Mysql.xml
--- src/main/resources/egovframework/sqlmap/let/mjo/addr/Addr_SQL_Mysql.xml
+++ src/main/resources/egovframework/sqlmap/let/mjo/addr/Addr_SQL_Mysql.xml
@@ -775,7 +775,7 @@
 	</select>
 	
 	<insert id="AddrDAO.insertAddrList" parameterClass="java.util.List">
-		
+		/* AddrDAO.insertAddrList */
 		INSERT INTO MJ_ADDR
 		(
 			MBER_ID,
@@ -790,9 +790,9 @@
 			BOOKMARK,
 			ADDR_COMMENT,
 			FRST_REGISTER_ID
-		)VALUES
-		<iterate conjunction=",">
-	       	(
+		)
+		<iterate prepend="VALUES" conjunction=",">
+		(
 	          #[].mberId#,
 	          #[].addrGrpId#,
 	          #[].addrNm#,
@@ -805,8 +805,8 @@
 	          #[].bookmark#,
 	          #[].addrComment#,
 	          #[].frstRegisterId#
-	       )
-	    </iterate>
+          )
+		</iterate>
 	
 	</insert>
 	
src/main/webapp/WEB-INF/jsp/web/addr/AddrList.jsp
--- src/main/webapp/WEB-INF/jsp/web/addr/AddrList.jsp
+++ src/main/webapp/WEB-INF/jsp/web/addr/AddrList.jsp
@@ -4,11 +4,15 @@
 <%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
 <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
 
+<script type="text/javascript">
+    var currentTime = "${Instant.now().toEpochMilli()}";
+</script>
+
 <script type="text/javascript" src="<c:url value='/publish/js/content.js'/>"></script>
 <script type="text/javascript" src="https://oss.sheetjs.com/sheetjs/xlsx.full.min.js"></script>
 <script type="text/javascript" src="<c:url value='/js/web/addr/init.js'/>"></script>
 <script type="text/javascript" src="<c:url value='/js/web/addr/event.js'/>"></script>
-<script type="text/javascript" src="<c:url value='/js/web/addr/utils.js'/>"></script>
+<script type="text/javascript" src="<c:url value='/js/web/addr/utils.js'/>?v=${currentTime}"></script>
 
 
 <script type="text/javascript">
@@ -274,7 +278,8 @@
 
 // 대량등록 닫기
 function setAddrMassClose() {
-	tableR.clearData();
+	var $objTabul = fn_utils_getTabulator();
+	$objTabul.clearData();
 	$("#rowTotCnt").text(0); //총건수 수정
 	$("#rowDupCnt").text(0); //중복건수 수정
 	dupliPhoneDataRealList.length = 0;	// 중복 휴대폰번호 초기화
@@ -296,7 +301,7 @@
 	$.ajax({
 		url : "<c:url value='/web/addr/getAddrGroupDuplCheckAjax.do' />", 
 		type : 'POST', 
-		data : {"addrGrpNm" : $("#addrGrpNm").val()},
+		data : {"addrGrpNm" : $(tabluC+" #addrGrpNm").val()},
 		dataType:'json',
 		async: false,			// 동기
 		success : function(data, status){
@@ -331,7 +336,9 @@
 // 	gMemoList = [];			//메모
 	
 	var $objTabul = fn_utils_getTabulator();
-
+	var tabulNm = fn_utils_getTabulatorNm();
+	var tabluC = '.'+tabulNm
+	
 	if($objTabul.getData().length < 1){
 		alert("한 개 이상의 연락처를 입력하세요");
 		return false;
@@ -341,7 +348,7 @@
 // 		return false;
 // 	}
 	
-	var selectMassVal = $("#addrGrpIdInfo option:selected").val();
+	var selectMassVal = $(tabluC+" #addrGrpIdInfo option:selected").val();
 	
 	var loginVO = '${LoginVO}';
 // 	if(loginVO == "" || loginVO == null){
@@ -349,18 +356,46 @@
 		alert("로그인 후 이용이 가능합니다.");
 		return false;
 	}
-	else if ($("#addrGrpIdInfo option:selected").val() == "NEW" 
-				&& ($("#addrGrpNm").val() == "" 
-						|| $("#addrGrpNm").val() == null 
-						|| $("#addrGrpNm").val() == undefined)
+	
+	// tableExcel 그룹의 select 요소들을 확인
+	var isPhoneSelected = false;
+	var isNameSelected = false;
+	$('.adr_hd.select_adr_hd[data-group="'+tabulNm+'"] .field-selector').each(function() {
+		var value = $(this).val();
+		if (value === 'addrPhoneNo') {
+		    isPhoneSelected = true;
+		} else if (value === 'addrNm') {
+		    isNameSelected = true;
+		}
+		
+		// 두 조건이 모두 충족되면 반복문 종료
+		if (isPhoneSelected && isNameSelected) {
+		    return false;
+		}
+	});
+	
+	if (!isPhoneSelected || !isNameSelected) {
+		alert('휴대폰 또는 이름이 선택되지 않았습니다.');
+		return false;
+	}
+	
+	
+	// 주소록이 새로생성이면 새로운 주소록명이 있는지 확인
+	if ($(tabluC+" #addrGrpIdInfo option:selected").val() == "NEW" 
+				&& ($(tabluC+" #addrGrpNm").val() == "" 
+						|| $(tabluC+" #addrGrpNm").val() == null 
+						|| $(tabluC+" #addrGrpNm").val() == undefined)
 						) 
 	{
 		alert("저장할 그룹을 선택하거나 새 그룹명을 입력해주세요.");
+		$(tabluC+" #addrGrpNm").focus();
 		return false;		
 	}
 	
 	// 새 그룹명 중복체크
-	if ($("#addrGrpIdInfo option:selected").val() == "NEW" && $("#addrGrpNm").val() != "") {
+	if ($(tabluC+" #addrGrpIdInfo option:selected").val() == "NEW" 
+			&& $(tabluC+" #addrGrpNm").val() != "") 
+	{
 		//주소록 중복체크
 		if (getAddrGroupDuplCheckAjax() == false) {
 			alert("중복된 그룹명입니다. 새 그룹명을 입력해주세요.");
@@ -368,44 +403,98 @@
 		}
 	}	
 	
-	var commaSelectedData = numberWithCommas(selectedData.length);
 	var confirmMsg = "저장하시겠습니까?\n이름 20byte, [*1*]~[*4*] 40byte, 메모 250byte 초과 글자는 절사됩니다.";
 // 	if (selectedData.length >= 10000) {
 // 		confirmMsg = "저장하시겠습니까?\n이름 20byte, [*1*]~[*4*] 40byte, 메모 250byte 초과 글자는 절사됩니다.\n1만건 이상 등록시 약 30초정도 소요됩니다.\n잠시만 기다려주세요.";
 // 	}
 	if (confirm(confirmMsg)) {	
 		//로딩창 show
-		$('.loading_layer').addClass('active');				
+// 		$('.loading_layer').addClass('active');				
 
-		setTimeout(setSenderList_advc, 1000);
+// 		setTimeout(setSenderList_advc, 1000);
+		setSenderList_advc();
 	}
 }
 
 function setSenderList_advc(){
 
+	// tab에 해당하는 타블레이터 가져오기
 	var $objTabul = fn_utils_getTabulator();
 	var dataToSend = $objTabul.getData();
 	
-		$.ajax({
-		    type: "POST",
-		    url: "/web/mjon/addr/addrMassInsertByTempAjax_advc.do",
-		    data: JSON.stringify(dataToSend),
-		    dataType: 'json',
-		    contentType: 'application/json',
-		    async: true,
-		    success: function (data) {
-		    	console.log('data : ', data);
-// 		        alert(data.object.message);
-// 		        if (data.object.result == 'success') {
-// 		            location.reload();
-// 		        } 
-		    },
-		    error: function (e) { 
-		        alert("ERROR : " + JSON.stringify(e)); 
-		    }
-		});
-}
+	var addrGrpIdInfo = $("#addrGrpIdInfo").val();
+	var addrGrpNmInfo = $("#addrGrpNm").val();
 
+	var updateData = dataToSend.map(row => {
+	    row.addrGrpId = addrGrpIdInfo;
+	    row.addrGrpNm = addrGrpNmInfo;
+	    return row;
+	});
+	
+	console.log('updateData : ', updateData);
+	$.ajax({
+	    type: "POST",
+	    url: "/web/mjon/addr/addrMassInsertByTempAjax_advc.do",
+	    data: JSON.stringify(updateData),
+	    dataType: 'json',
+	    contentType: 'application/json',
+	    async: true,
+	    success: function (data) {
+	    	console.log('data : ', data);
+	    	
+
+			if (data.status == 'OK') {  
+				alert(data.message);
+// 				alert("저장에 성공했습니다.\n저장 : " + returnData.resultCnt + "건"
+// 						+", 중복 : " + returnData.dupliCnt + "건"
+// 						+", 휴대폰번호 오류 : " + returnData.errPhoneCnt + "건");
+
+				// 중복번호 Hide
+// 				$("#btnAddrMassDupli").hide();
+// 				$("#btnAddrMassSaveDupli").hide();
+				
+				// 중복건이 있을경우
+					
+// 				if (returnData.dupliCnt > 0) {
+					//alert(returnData.addrMassDupliList.length);
+
+					// 중복번호(해당 그룹) Show
+// 					$("#btnAddrMassSaveDupli").show();
+					
+// 					addrMassDupliSaveList = returnData.addrMassDupliList;
+					//$("#btnAddrMassSaveDupli").trigger("click");
+// 				}
+				
+				// 데이터 비우기
+				SetClear($objTabul);		
+				
+				var selectMassVal = $("#addrGrpIdInfo option:selected").val();
+				
+				// 주소록그룹 콤보박스 유지
+				setTimeout(setSelectMassSetting, 500, selectMassVal);					
+			} 
+			else {
+				alert("오류 알림 : " + returnData.msg);
+			}
+		},
+		error: function (e) { 
+			//로딩창 hide
+			$('.loading_layer').removeClass('active');			
+			
+			alert("저장에 실패하였습니다."); 
+			alert("ERROR : " + JSON.stringify(e)); 
+		},
+		beforeSend : function(xmlHttpRequest) {
+			//로딩창 show
+			$('.loading_layer').addClass('active');				
+		},	        	        
+		complete : function(xhr, textStatus) {
+			//로딩창 hide
+			$('.loading_layer').removeClass('active');
+		}
+	});
+}
+/* 
 function setSenderList() {
 	var selectedData = tableR.getRows();
 	for (var i=gArrRestartIndex; i < selectedData.length; i++) {
@@ -504,9 +593,9 @@
 		SetAddrMassSave_Step2();
 	}	
 }
-
+ */
 //저장
-function SetAddrMassSave_Step2(){
+/* function SetAddrMassSave_Step2(){
 	var form = document.addrMassForm;
 	form.phoneList.value = gPhoneList;
 	form.nameList.value = gNameList;
@@ -580,7 +669,7 @@
 			$('.loading_layer').removeClass('active');
 		}	        
 	});
-}
+} */
 
 //주소록그룹 콤보박스 유지
 function setSelectMassSetting(selectMassVal) {
@@ -589,27 +678,29 @@
 
 
 //데이터 비우기
-function SetClear() {
-	$("#addrGrpNm").val(""); //	새그룹명 Clear;
+function SetClear($objTabul) {
+	
+
+	var tabulNm = fn_utils_getTabulatorNm();
+	var tabluC = '.'+tabulNm
+	
+	$(tabluC+" #addrGrpNm").val(""); //	새그룹명 Clear;
 	// 주소록 그룹정보 불러오기
 	getAddrGroupList();	
 	
-	var data = tableR.getRows();	
-	if (data == null || data == "") {
-	}
-	else {
-		tableR.clearData();
-		$("#rowTotCnt").text(0); //총건수 수정
-		$("#rowDupCnt").text(0); //중복건수 수정
-		dupliPhoneDataRealList.length = 0;	// 중복 휴대폰번호 초기화
-	}
+	$objTabul.clearData();
+	$(tabluC+" #rowTotCnt").text(0); //총건수 수정
+	$(tabluC+" #rowDupCnt").text(0); //중복건수 수정
+// 	dupliPhoneDataRealList.length = 0;	// 중복 휴대폰번호 초기화
 }
 
 // 주소 대량등록 버튼 클릭 
 // AddrListAjax.jsp에서 호출
 $(document).on('click', '#btnAddrMassRegCall', function() {
 	getAddrGroupList();
+	console.log('??');
 });
+
 
 // 주소록 그룹정보 불러오기
 function getAddrGroupList() {
@@ -631,6 +722,9 @@
 		}
 	});	    	
 }
+
+
+
 	
 // 그룹데이터 노출
 function getAddrGroupListShow(jsonList) {
@@ -641,8 +735,10 @@
 	for (var j = 0; j < jsonList.length; j++) {
 		sHtml += "	<option value='" + $.trim(jsonList[j].addrGrpId) + "' />" + $.trim(jsonList[j].addrGrpNm) + "</option>";
 	}
-			
-	$("#addrGrpIdInfo").html(sHtml);
+
+	var tabulNm = fn_utils_getTabulatorNm();
+	var tabluC = '.'+tabulNm
+	$(tabluC+" #addrGrpIdInfo").html(sHtml);
 }
 
 $(document).on('change', '#addrGrpIdInfo', function() {
@@ -747,6 +843,7 @@
 	var tabId = '#tab'+tabNum;
 	$('.tab_c').hide();
 	$(tabId).show();
+	getAddrGroupList();
 }
 
 </script>
@@ -782,19 +879,19 @@
 						   <ul class="list_tab" id="tbTabl"> 
 							   <li class="tab active" data-tabul="tableExcel"><button type="button" onclick="popupTab(this,'1'); fn_tabToggle('1');">엑셀입력</button></li>
 							   <li class="tab" data-tabul="tableClip"><button type="button" onclick="popupTab(this,'2'); fn_tabToggle('2');">붙여넣기</button></li>
-							   <li class="tab" data-tabul="tableSelf"><button type="button" onclick="popupTab(this,'3'); fn_tabToggle('3');">붙여넣기</button></li>
+							   <li class="tab" data-tabul="tableSelf"><button type="button" onclick="popupTab(this,'3'); fn_tabToggle('3');">직접입력</button></li>
 						   </ul><!--// tab button -->
 					   </div>
 					   
 					   
-						<div id="tab1" class="tab_c">
+						<div id="tab1" class="tab_c tableExcel">
 					  		<%@include file="/WEB-INF/jsp/web/addr/include/addrListforExcel.jsp" %>
 						</div>
-						<div id="tab2" class="tab_c" style="display: none;">
+						<div id="tab2" class="tab_c tableClip" style="display: none;">
 					  		<%@include file="/WEB-INF/jsp/web/addr/include/addrListforClipboard.jsp" %>
 						</div>
 <!-- 						<div id="tab3" class="tab_c" style="display: none;"> -->
-						<div id="tab3" class="tab_c" style="display: none;">
+						<div id="tab3" class="tab_c tableSelf" style="display: none;">
 					  		<%@include file="/WEB-INF/jsp/web/addr/include/addrListforSelf.jsp" %>
 						</div>
 						   
src/main/webapp/WEB-INF/jsp/web/addr/include/addrListforClipboard.jsp
--- src/main/webapp/WEB-INF/jsp/web/addr/include/addrListforClipboard.jsp
+++ src/main/webapp/WEB-INF/jsp/web/addr/include/addrListforClipboard.jsp
@@ -392,30 +392,6 @@
 });
 
 
-// Show Html
-function getAddrGroupListShow(jsonList) {
-	var sHtml = "";
-	sHtml += "<option value='NEW'>그룹추가</option>";
-	sHtml += "<option value='0'>그룹미지정</option>";
-	sHtml += "<option value='bookmark'>자주보내는 번호</option>";
-	for (var j = 0; j < jsonList.length; j++) {
-		sHtml += "	<option value='" + $.trim(jsonList[j].addrGrpId) + "' />" + $.trim(jsonList[j].addrGrpNm) + "</option>";
-	}
-	    	
-	$("#addrGrpIdInfo").html(sHtml);
-}
-
-$(document).on('change', '#addrGrpIdInfo', function() {
-	if ($("#addrGrpIdInfo option:selected").val() != "NEW") {
-		$("#addrGrpNm").val(""); //	새그룹명 Clear;
-	}
-});
-
-//#############################################################################################
-//파일 불러오기
-//#############################################################################################
-
-
 //체크박스 전체선택/해제
 $(document).on("click", "#chkAll", function(e) {
     var isChecked = $(this).is(":checked");
src/main/webapp/WEB-INF/jsp/web/addr/include/addrListforExcel.jsp
--- src/main/webapp/WEB-INF/jsp/web/addr/include/addrListforExcel.jsp
+++ src/main/webapp/WEB-INF/jsp/web/addr/include/addrListforExcel.jsp
@@ -622,67 +622,6 @@
 	return isReturn;	
 }
 
-//주소록그룹 콤보박스 유지
-function setSelectMassSetting(selectMassVal) {
-	$("#addrGrpIdInfo").val(selectMassVal).prop("selected", true);	
-}
-
-//데이터 비우기
-function SetClear() {
-	$("#addrGrpNm").val(""); //	새그룹명 Clear;
-	// 주소록 그룹정보 불러오기
-	getAddrGroupList();	
-	
-	var data = $tableExcel.getRows();	
-	if (data == null || data == "") {
-	}
-	else {
-		$tableExcel.clearData();
-		$("#rowTotCnt").text(0); //총건수 수정
-		$("#rowDupCnt").text(0); //중복건수 수정
-		dupliPhoneDataRealList.length = 0;	// 중복 휴대폰번호 초기화
-	}
-}
-
-// 주소록 그룹정보 불러오기
-function getAddrGroupList() {
-    $.ajax({
-        type : "POST",
-        async : false,
-        url : "/web/mjon/addr/addrGroupListAjax.do",
-        data : {},
-        dataType:'json',
-        success : function(data) {
-			//alert(JSON.stringify(data.addrGroupList));
-
-			// Show Html
-			getAddrGroupListShow(data.addrGroupList);
-        },
-        error : function(xhr, status, error) {
-            alert(error);
-            return false;
-        }
-    });	    	
-}
-	
-// Show Html
-function getAddrGroupListShow(jsonList) {
-	var sHtml = "";
-	sHtml += "<option value='NEW'>그룹추가</option>";
-	sHtml += "<option value='0'>그룹미지정</option>";
-	sHtml += "<option value='bookmark'>자주보내는 번호</option>";
-	for (var j = 0; j < jsonList.length; j++) {
-		sHtml += "	<option value='" + $.trim(jsonList[j].addrGrpId) + "' />" + $.trim(jsonList[j].addrGrpNm) + "</option>";
-	}
-	    	
-	$("#addrGrpIdInfo").html(sHtml);
-}
-
-$(document).on('change', '#addrGrpIdInfo', function() {
-	if ($("#addrGrpIdInfo option:selected").val() != "NEW") {
-		$("#addrGrpNm").val(""); //	새그룹명 Clear;
-	}
-});
 
 //#############################################################################################
 //파일 불러오기
src/main/webapp/WEB-INF/jsp/web/addr/include/addrListforSelf.jsp
--- src/main/webapp/WEB-INF/jsp/web/addr/include/addrListforSelf.jsp
+++ src/main/webapp/WEB-INF/jsp/web/addr/include/addrListforSelf.jsp
@@ -414,19 +414,6 @@
 });
 
 
-// Show Html
-function getAddrGroupListShow(jsonList) {
-	var sHtml = "";
-	sHtml += "<option value='NEW'>그룹추가</option>";
-	sHtml += "<option value='0'>그룹미지정</option>";
-	sHtml += "<option value='bookmark'>자주보내는 번호</option>";
-	for (var j = 0; j < jsonList.length; j++) {
-		sHtml += "	<option value='" + $.trim(jsonList[j].addrGrpId) + "' />" + $.trim(jsonList[j].addrGrpNm) + "</option>";
-	}
-	    	
-	$("#addrGrpIdInfo").html(sHtml);
-}
-
 $(document).on('change', '#addrGrpIdInfo', function() {
 	if ($("#addrGrpIdInfo option:selected").val() != "NEW") {
 		$("#addrGrpNm").val(""); //	새그룹명 Clear;
src/main/webapp/js/web/addr/utils.js
--- src/main/webapp/js/web/addr/utils.js
+++ src/main/webapp/js/web/addr/utils.js
@@ -14,11 +14,21 @@
     var activeTab = $('#tbTabl .tab.active');
     // data-tabul 값 가져오기
     var tabulValue = activeTab.data('tabul');
-    console.log('tabulValue : ',tabulValue);
 	
 	return window['$' + tabulValue]; 
 }
 
+function fn_utils_getTabulatorNm(){
+	
+	var activeTab = $('#tbTabl .tab.active');
+	// data-tabul 값 가져오기
+	var tabulValue = activeTab.data('tabul');
+	
+	return tabulValue; 
+}
+
+
+
 function fn_utils_isEmpty(obj){
 	return obj == null || obj == "";
 }
(No newline at end of file)
Add a comment
List