From 3fd179f3f1e26ced8f3f5a1539633149b737ff25 Mon Sep 17 00:00:00 2001 From: wyh Date: Wed, 6 Nov 2024 12:51:53 +0900 Subject: [PATCH 1/4] =?UTF-8?q?=EC=88=98=EC=A0=95=EC=A4=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../WEB-INF/jsp/web/fax/addr/FaxAddrList.jsp | 46 +++++++++---------- src/main/webapp/js/web/addr/fax/faxEvent.js | 9 +--- 2 files changed, 25 insertions(+), 30 deletions(-) diff --git a/src/main/webapp/WEB-INF/jsp/web/fax/addr/FaxAddrList.jsp b/src/main/webapp/WEB-INF/jsp/web/fax/addr/FaxAddrList.jsp index 76be4110..f868abfc 100644 --- a/src/main/webapp/WEB-INF/jsp/web/fax/addr/FaxAddrList.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/fax/addr/FaxAddrList.jsp @@ -687,33 +687,29 @@ function getAddrGroupDuplCheckAjax() { //저장 function SetAddrMassSave(){ - var selectedData = $tableExcel.getRows(); - var columns = $tableExcel.getColumns(); - var isAddrFaxNoSelected = columns.some(column => column.getField() === 'addrFaxNo'); - - if (!isAddrFaxNoSelected) { - alert('팩스번호가 선택되지 않았습니다.'); - return false; - } - - if (selectedData == "" || selectedData == null) { - alert("한 개 이상의 연락처를 입력하세요"); - return false; - } - else if (selectedData.length > 20000) { - alert("2만줄 이상의 업로드는 데이터 부하로 업로드 할수 없습니다."); - return false; - } - - var selectMassVal = $("#addrGrpIdInfo option:selected").val(); - var loginVO = '${LoginVO}'; - if(loginVO == "" || loginVO == null){ alert("로그인 후 이용이 가능합니다."); return false; } - else if ($("#addrGrpIdInfo option:selected").val() == "NEW" && ($("#addrGrpNm").val() == "" || $("#addrGrpNm").val() == null || $("#addrGrpNm").val() == undefined)) { + + var $objTabul = fn_utils_getTabulator(); + var tabulNm = fn_utils_getTabulatorNm(); + + if($objTabul.getData().length < 1){ + alert("한 개 이상의 연락처를 입력하세요"); + return false; + } + + var columns = $objTabul.getColumns(); + var isAddrFaxNoSelected = columns.some(column => column.getField() === 'addrFaxNo'); + if (!isAddrFaxNoSelected) { + alert('팩스번호가 선택되지 않았습니다.'); + return false; + } + + var selectMassVal = $("#addrGrpIdInfo option:selected").val(); + if ($("#addrGrpIdInfo option:selected").val() == "NEW" && ($("#addrGrpNm").val() == "" || $("#addrGrpNm").val() == null || $("#addrGrpNm").val() == undefined)) { alert("저장할 그룹을 선택하거나 새 그룹명을 입력해주세요."); return false; } @@ -908,8 +904,12 @@ $(document).on('change', '#addrGrpIdInfo', function() { //############################################################################################# //파일 불러오기 //############################################################################################# + //seetJs 엑셀 파일 불러오기 -function excelExport(event){ +function excelExport_test(event){ + + alert("TEST 입니다."); + var data = new FormData(document.excelForm); data.append("file0", $('#excelFile').prop('files')[0]); diff --git a/src/main/webapp/js/web/addr/fax/faxEvent.js b/src/main/webapp/js/web/addr/fax/faxEvent.js index 2c42d1e9..a9ac2fe8 100644 --- a/src/main/webapp/js/web/addr/fax/faxEvent.js +++ b/src/main/webapp/js/web/addr/fax/faxEvent.js @@ -37,7 +37,7 @@ $(document).ready(function(){ // 데이터 넣기 updateTableFields($objTabul, group); - // 필드가 휴대폰이면 열 중복체크 + // 필드가 팩스번호이면 열 중복체크 if($(this).val() == 'addrFaxNo'){ fn_phoneDupl($objTabul); } @@ -47,7 +47,7 @@ $(document).ready(function(){ /** - * @ 핸드폰 중복 데이터 + * @ 팩스번호 중복 데이터 * */ function fn_phoneDupl($objTabul) { @@ -312,9 +312,6 @@ $(document).ready(function(){ } }); - - - // 주소록 에러결과 초기화 function fn_errorPopClean(){ @@ -323,7 +320,6 @@ function fn_errorPopClean(){ // popup 영역 $tableError.clearData(); - // 중복 카운트 $("#errorPopDupCnt").text(0); @@ -334,7 +330,6 @@ function fn_errorPopClean(){ // select box 초기화 $(tabluC+' .field-selector').each(function() { $(this).val(''); }); - } function fn_rowCntInit(){ From a9719735e86a141b2e7190c4167036c01b20a3b2 Mon Sep 17 00:00:00 2001 From: wyh Date: Thu, 7 Nov 2024 18:02:00 +0900 Subject: [PATCH 2/4] =?UTF-8?q?=EC=88=98=EC=A0=95=EC=A4=91=20=EC=9E=85?= =?UTF-8?q?=EB=8B=88=EB=8B=A4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../WEB-INF/jsp/web/fax/addr/FaxAddrList.jsp | 33 +++++++++++++------ .../addr/fax => user/fax/addr}/faxEvent.js | 0 .../fax => user/fax/addr}/faxTabulator.js | 0 3 files changed, 23 insertions(+), 10 deletions(-) rename src/main/webapp/js/{web/addr/fax => user/fax/addr}/faxEvent.js (100%) rename src/main/webapp/js/{web/addr/fax => user/fax/addr}/faxTabulator.js (100%) diff --git a/src/main/webapp/WEB-INF/jsp/web/fax/addr/FaxAddrList.jsp b/src/main/webapp/WEB-INF/jsp/web/fax/addr/FaxAddrList.jsp index f868abfc..61a67ba7 100644 --- a/src/main/webapp/WEB-INF/jsp/web/fax/addr/FaxAddrList.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/fax/addr/FaxAddrList.jsp @@ -7,8 +7,8 @@ - - + + @@ -656,13 +656,13 @@ function setAddrMassClose() { } // 주소록 그룹 중복체크 -function getAddrGroupDuplCheckAjax() { +function getAddrGroupDuplCheckAjax(addrGrpNm) { var isReturn = true; $.ajax({ url : "", type : 'POST', - data : {"addrGrpNm" : $("#addrGrpNm").val()}, + data : {"addrGrpNm" : addrGrpNm}, dataType:'json', async: false, // 동기 success : function(data, status){ @@ -687,15 +687,16 @@ function getAddrGroupDuplCheckAjax() { //저장 function SetAddrMassSave(){ + var $objTabul = fn_utils_getTabulator(); + var tabulNm = fn_utils_getTabulatorNm(); + var tabluC = '.'+tabulNm + var loginVO = '${LoginVO}'; if(loginVO == "" || loginVO == null){ alert("로그인 후 이용이 가능합니다."); return false; } - var $objTabul = fn_utils_getTabulator(); - var tabulNm = fn_utils_getTabulatorNm(); - if($objTabul.getData().length < 1){ alert("한 개 이상의 연락처를 입력하세요"); return false; @@ -708,14 +709,26 @@ function SetAddrMassSave(){ return false; } - var selectMassVal = $("#addrGrpIdInfo option:selected").val(); - if ($("#addrGrpIdInfo option:selected").val() == "NEW" && ($("#addrGrpNm").val() == "" || $("#addrGrpNm").val() == null || $("#addrGrpNm").val() == undefined)) { + + // 주소록이 새로생성이면 새로운 주소록명이 있는지 확인 + 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() != "") + { + var addrGrpNm = $(tabluC+" #addrGrpNm").val(); + console.log('addrGrpNm : ', addrGrpNm); + //주소록 중복체크 if (getAddrGroupDuplCheckAjax() == false) { alert("중복된 그룹명입니다. 새 그룹명을 입력해주세요."); diff --git a/src/main/webapp/js/web/addr/fax/faxEvent.js b/src/main/webapp/js/user/fax/addr/faxEvent.js similarity index 100% rename from src/main/webapp/js/web/addr/fax/faxEvent.js rename to src/main/webapp/js/user/fax/addr/faxEvent.js diff --git a/src/main/webapp/js/web/addr/fax/faxTabulator.js b/src/main/webapp/js/user/fax/addr/faxTabulator.js similarity index 100% rename from src/main/webapp/js/web/addr/fax/faxTabulator.js rename to src/main/webapp/js/user/fax/addr/faxTabulator.js From 9b66d4a7a04bbbb3a6ce75a94a6973e95aff2de6 Mon Sep 17 00:00:00 2001 From: wyh Date: Fri, 8 Nov 2024 16:52:52 +0900 Subject: [PATCH 3/4] =?UTF-8?q?=ED=8C=A9=EC=8A=A4=20=EC=A3=BC=EC=86=8C?= =?UTF-8?q?=EB=A1=9D=20=EB=93=B1=EB=A1=9D=EA=B8=B0=EB=8A=A5=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../let/fax/addr/service/FaxAddrService.java | 9 + .../addr/service/impl/FaxAddrServiceImpl.java | 193 +++++++++++++ .../fax/addr/web/FaxAddrRestController.java | 79 ++++++ .../WEB-INF/jsp/web/fax/addr/FaxAddrList.jsp | 256 ++++++++++-------- .../fax/addr/include/FaxAddrListforExcel.jsp | 6 +- src/main/webapp/js/user/fax/addr/faxEvent.js | 20 +- 6 files changed, 435 insertions(+), 128 deletions(-) create mode 100644 src/main/java/itn/let/fax/addr/web/FaxAddrRestController.java diff --git a/src/main/java/itn/let/fax/addr/service/FaxAddrService.java b/src/main/java/itn/let/fax/addr/service/FaxAddrService.java index 2b5ce4c2..0d06cca2 100644 --- a/src/main/java/itn/let/fax/addr/service/FaxAddrService.java +++ b/src/main/java/itn/let/fax/addr/service/FaxAddrService.java @@ -2,6 +2,8 @@ package itn.let.fax.addr.service; 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 @@ public interface FaxAddrService { List selectFaxAddrListAjax(FaxAddrVO faxAddrVO); + public StatusResponse faxAddrMassInsertByTempAjax_advc(List faxAddrListVO, String userId) throws Exception; + + void deleteFaxAddr_advc(FaxAddrGroupVO faxAddrGroupVO) throws Exception; + + int getFaxAddrCount(FaxAddrGroupVO faxAddrGroupVO) throws Exception; + + } diff --git a/src/main/java/itn/let/fax/addr/service/impl/FaxAddrServiceImpl.java b/src/main/java/itn/let/fax/addr/service/impl/FaxAddrServiceImpl.java index eac1f52d..64426fcf 100644 --- a/src/main/java/itn/let/fax/addr/service/impl/FaxAddrServiceImpl.java +++ b/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.FaxAddrGroupVO; 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") @@ -36,6 +44,16 @@ public class FaxAddrServiceImpl extends EgovAbstractServiceImpl implements FaxAd 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 selectFaxAddrList(FaxAddrVO addrVO) throws Exception { return faxAddrDAO.selectFaxAddrList(addrVO); } @@ -358,5 +376,180 @@ public class FaxAddrServiceImpl extends EgovAbstractServiceImpl implements FaxAd public List selectFaxAddrListAjax(FaxAddrVO faxAddrVO) { return faxAddrDAO.selectFaxAddrListAjax(faxAddrVO); } + + @Override + public StatusResponse faxAddrMassInsertByTempAjax_advc(List 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); + } } diff --git a/src/main/java/itn/let/fax/addr/web/FaxAddrRestController.java b/src/main/java/itn/let/fax/addr/web/FaxAddrRestController.java new file mode 100644 index 00000000..3d392aea --- /dev/null +++ b/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 + * + *
+ * << 개정이력(Modification Information) >>
+ *
+ *   수정일      수정자           수정내용
+ *  -------    --------    ---------------------------
+ *   2021.04.08  ITN          최초 생성
+ *
+ * 
+ */ +@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 faxAddrMassInsertByTempAjax_advc( + @RequestBody List 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 diff --git a/src/main/webapp/WEB-INF/jsp/web/fax/addr/FaxAddrList.jsp b/src/main/webapp/WEB-INF/jsp/web/fax/addr/FaxAddrList.jsp index 61a67ba7..fd916a03 100644 --- a/src/main/webapp/WEB-INF/jsp/web/fax/addr/FaxAddrList.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/fax/addr/FaxAddrList.jsp @@ -638,6 +638,8 @@ function setAddrMassClose() { var $objTabul = fn_utils_getTabulator(); $objTabul.clearData(); + fn_rowDataClear(); + $("#rowTotCnt").text(0); //총건수 수정 $("#rowDupCnt").text(0); //중복건수 수정 $("#rowErrorCnt").text(0); //오류건수 수정 @@ -655,6 +657,28 @@ function setAddrMassClose() { 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) { var isReturn = true; @@ -702,9 +726,14 @@ function SetAddrMassSave(){ 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; } @@ -721,7 +750,6 @@ function SetAddrMassSave(){ return false; } - // 새 그룹명 중복체크 if ($(tabluC+" #addrGrpIdInfo option:selected").val() == "NEW" && $(tabluC+" #addrGrpNm").val() != "") @@ -740,132 +768,130 @@ function SetAddrMassSave(){ 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(); +} + //주소록그룹 콤보박스 유지 function setSelectMassSetting(selectMassVal) { $("#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(); } //주소 대량등록 버튼 클릭 diff --git a/src/main/webapp/WEB-INF/jsp/web/fax/addr/include/FaxAddrListforExcel.jsp b/src/main/webapp/WEB-INF/jsp/web/fax/addr/include/FaxAddrListforExcel.jsp index df560e26..1631d3fd 100644 --- a/src/main/webapp/WEB-INF/jsp/web/fax/addr/include/FaxAddrListforExcel.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/fax/addr/include/FaxAddrListforExcel.jsp @@ -380,7 +380,7 @@ $(document).on("click", "#duplicationChkAll", function(e) { @@ -389,7 +389,7 @@ $(document).on("click", "#duplicationChkAll", function(e) { @@ -398,7 +398,7 @@ $(document).on("click", "#duplicationChkAll", function(e) { diff --git a/src/main/webapp/js/user/fax/addr/faxEvent.js b/src/main/webapp/js/user/fax/addr/faxEvent.js index a9ac2fe8..b6135b3e 100644 --- a/src/main/webapp/js/user/fax/addr/faxEvent.js +++ b/src/main/webapp/js/user/fax/addr/faxEvent.js @@ -38,7 +38,7 @@ $(document).ready(function(){ updateTableFields($objTabul, group); // 필드가 팩스번호이면 열 중복체크 - if($(this).val() == 'addrFaxNo'){ + if($(this).val() == 'addrPhoneNo'){ fn_phoneDupl($objTabul); } @@ -68,7 +68,7 @@ $(document).ready(function(){ 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 @@ $(document).ready(function(){ if (!existingNumbers.has(cleanedNumber)) { // 중복 번호 체크 if (isValidPhoneNumber(formattedNumber)) { // 유효성 검사 - row.addrFaxNo = formattedNumber; + row.addrPhoneNo = formattedNumber; existingNumbers.add(cleanedNumber); // 추가된 번호를 기존 목록에 추가 newData.push(row); // 유효한 데이터만 새로운 배열에 추가 } else { @@ -90,7 +90,7 @@ $(document).ready(function(){ errors.push({ name: row.addrNm, // 이름 - phone: row.addrFaxNo, // 폰번호 + phone: row.addrPhoneNo, // 폰번호 result: "오류" // 결과 메시지 추가 }); } @@ -100,7 +100,7 @@ $(document).ready(function(){ errors.push({ name: row.addrNm, // 이름 - phone: row.addrFaxNo, // 폰번호 + phone: row.addrPhoneNo, // 폰번호 result: "중복" // 결과 메시지 추가 }); } @@ -189,7 +189,7 @@ $(document).ready(function(){ for (var i = 0; i < 1000; i++) { newTableData.push({ addrNm: "", - addrFaxNo: "", + addrPhoneNo: "", addrNemo: "" }); } @@ -226,16 +226,16 @@ $(document).ready(function(){ // 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); // 기존 번호를 배열에 추가 } }); From fb59293a5e65e8ed851a74a44c7f29388f094842 Mon Sep 17 00:00:00 2001 From: wyh Date: Fri, 8 Nov 2024 17:14:41 +0900 Subject: [PATCH 4/4] =?UTF-8?q?=EB=93=B1=EB=A1=9D=20=EB=A1=9C=EB=94=A9?= =?UTF-8?q?=EB=B0=94=EC=97=90=20=EC=88=AB=EC=9E=90=20=EC=B9=B4=EC=9A=B4?= =?UTF-8?q?=ED=8A=B8=20=EC=A7=84=ED=96=89=EA=B8=B0=EB=8A=A5=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/webapp/WEB-INF/jsp/web/fax/addr/FaxAddrList.jsp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/main/webapp/WEB-INF/jsp/web/fax/addr/FaxAddrList.jsp b/src/main/webapp/WEB-INF/jsp/web/fax/addr/FaxAddrList.jsp index fd916a03..bc8b3347 100644 --- a/src/main/webapp/WEB-INF/jsp/web/fax/addr/FaxAddrList.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/fax/addr/FaxAddrList.jsp @@ -808,8 +808,6 @@ function setSenderList_advc(){ return row; }); - console.log('updateData : ', updateData); - $.ajax({ type: "POST" , url: "/web/mjon/fax/addr/faxAddrMassInsertByTempAjax_advc.do" @@ -1171,7 +1169,7 @@ function fn_tabToggle(tabNum){
-
Loading
+
Loading