팩스 주소록 등록기능 수정
@9b66d4a7a04bbbb3a6ce75a94a6973e95aff2de6
--- src/main/java/itn/let/fax/addr/service/FaxAddrService.java
+++ src/main/java/itn/let/fax/addr/service/FaxAddrService.java
... | ... | @@ -2,6 +2,8 @@ |
| 2 | 2 |
|
| 3 | 3 |
import java.util.List; |
| 4 | 4 |
|
| 5 |
+import itn.let.mail.service.StatusResponse; |
|
| 6 |
+import itn.let.mjo.addr.service.AddrGroupVO; |
|
| 5 | 7 |
import itn.let.mjo.addr.service.AddrVO; |
| 6 | 8 |
|
| 7 | 9 |
public interface FaxAddrService {
|
... | ... | @@ -90,4 +92,11 @@ |
| 90 | 92 |
|
| 91 | 93 |
List<FaxAddrVO> selectFaxAddrListAjax(FaxAddrVO faxAddrVO); |
| 92 | 94 |
|
| 95 |
+ public StatusResponse faxAddrMassInsertByTempAjax_advc(List<FaxAddrVO> faxAddrListVO, String userId) throws Exception; |
|
| 96 |
+ |
|
| 97 |
+ void deleteFaxAddr_advc(FaxAddrGroupVO faxAddrGroupVO) throws Exception; |
|
| 98 |
+ |
|
| 99 |
+ int getFaxAddrCount(FaxAddrGroupVO faxAddrGroupVO) throws Exception; |
|
| 100 |
+ |
|
| 101 |
+ |
|
| 93 | 102 |
} |
--- 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 @@ |
| 1 | 1 |
package itn.let.fax.addr.service.impl; |
| 2 | 2 |
|
| 3 |
+import java.nio.charset.Charset; |
|
| 3 | 4 |
import java.text.SimpleDateFormat; |
| 5 |
+import java.time.LocalDateTime; |
|
| 6 |
+import java.time.format.DateTimeFormatter; |
|
| 4 | 7 |
import java.util.Date; |
| 5 | 8 |
import java.util.List; |
| 6 | 9 |
import java.util.Locale; |
| 10 |
+import java.util.concurrent.atomic.AtomicInteger; |
|
| 11 |
+import java.util.regex.Matcher; |
|
| 12 |
+import java.util.regex.Pattern; |
|
| 7 | 13 |
|
| 8 | 14 |
import javax.annotation.Resource; |
| 9 | 15 |
|
| 16 |
+import org.springframework.http.HttpStatus; |
|
| 10 | 17 |
import org.springframework.stereotype.Service; |
| 11 | 18 |
|
| 12 | 19 |
import egovframework.rte.fdl.cmmn.EgovAbstractServiceImpl; |
... | ... | @@ -17,6 +24,7 @@ |
| 17 | 24 |
import itn.let.fax.addr.service.FaxAddrService; |
| 18 | 25 |
import itn.let.fax.addr.service.FaxAddrTransHistVO; |
| 19 | 26 |
import itn.let.fax.addr.service.FaxAddrVO; |
| 27 |
+import itn.let.mail.service.StatusResponse; |
|
| 20 | 28 |
import itn.let.mjo.addr.service.AddrVO; |
| 21 | 29 |
|
| 22 | 30 |
@Service("FaxAddrService")
|
... | ... | @@ -35,6 +43,16 @@ |
| 35 | 43 |
@Resource(name = "egovAddrTransHistIdGnrService") |
| 36 | 44 |
private EgovIdGnrService idgenAddrTransHistId; |
| 37 | 45 |
|
| 46 |
+ |
|
| 47 |
+ private static final String FAX_REGEX = "^(0\\d{1,2})-(\\d{3,4})-(\\d{4})$";
|
|
| 48 |
+ private static final String FAX_M_REGEX = "^(050\\d{1})-(\\d{3,4})-(\\d{4})$";
|
|
| 49 |
+ private static final Pattern FAX_PATTERN = Pattern.compile(FAX_REGEX); |
|
| 50 |
+ private static final Pattern FAX_M_PATTERN = Pattern.compile(FAX_M_REGEX); |
|
| 51 |
+ |
|
| 52 |
+ private static final Charset EUC_KR = Charset.forName("EUC-KR");
|
|
| 53 |
+ |
|
| 54 |
+ private static final int MAX_SINGLE_ENTRY_CNT = 350000; |
|
| 55 |
+ private static final int MAX_FAX_ADDR_CNT = 10000000; // 팩스 주소록 등록 최대 수량 |
|
| 38 | 56 |
|
| 39 | 57 |
public List<FaxAddrVO> selectFaxAddrList(FaxAddrVO addrVO) throws Exception {
|
| 40 | 58 |
return faxAddrDAO.selectFaxAddrList(addrVO); |
... | ... | @@ -358,5 +376,180 @@ |
| 358 | 376 |
public List<FaxAddrVO> selectFaxAddrListAjax(FaxAddrVO faxAddrVO) {
|
| 359 | 377 |
return faxAddrDAO.selectFaxAddrListAjax(faxAddrVO); |
| 360 | 378 |
} |
| 379 |
+ |
|
| 380 |
+ @Override |
|
| 381 |
+ public StatusResponse faxAddrMassInsertByTempAjax_advc(List<FaxAddrVO> faxAddrListVO, String userId) throws Exception {
|
|
| 382 |
+ |
|
| 383 |
+ for (FaxAddrVO faxAddr : faxAddrListVO) { faxAddr.setMberId(userId); }
|
|
| 384 |
+ |
|
| 385 |
+ if(faxAddrListVO.size() > MAX_SINGLE_ENTRY_CNT) {
|
|
| 386 |
+ return new StatusResponse( |
|
| 387 |
+ HttpStatus.BAD_REQUEST |
|
| 388 |
+ , "주소록은 한번에 100만개까지만 등록이 가능합니다." |
|
| 389 |
+ , LocalDateTime.now() |
|
| 390 |
+ ); |
|
| 391 |
+ } |
|
| 392 |
+ |
|
| 393 |
+ // step1 현재 주소록 갯수 조회 |
|
| 394 |
+ |
|
| 395 |
+ // step1-1 회원별 주소록 전체 갯수 조회 |
|
| 396 |
+ int faxAddrBefCnt = faxAddrDAO.selectFaxAddrTotalCount(faxAddrListVO.get(0)); |
|
| 397 |
+ int faxAddrNewCnt = faxAddrListVO.size(); //신규 추가할 주소록 갯수 |
|
| 398 |
+ int sumFaxAddrCnt = faxAddrBefCnt + faxAddrNewCnt; |
|
| 399 |
+ |
|
| 400 |
+ // step1-2 총 갯수가 (주소록 갯수 + 신규 주소록)1000만건 체크 |
|
| 401 |
+ if(sumFaxAddrCnt > MAX_FAX_ADDR_CNT) {
|
|
| 402 |
+ return new StatusResponse( |
|
| 403 |
+ HttpStatus.BAD_REQUEST |
|
| 404 |
+ , "주소록은 총 1000만개까지만 등록이 가능합니다." |
|
| 405 |
+ , LocalDateTime.now() |
|
| 406 |
+ ); |
|
| 407 |
+ } |
|
| 408 |
+ |
|
| 409 |
+ // step2 신규 주소록 생성 및 북마크 체크 |
|
| 410 |
+ if ("NEW".equals(faxAddrListVO.get(0).getAddrGrpId())) {
|
|
| 411 |
+ FaxAddrGroupVO faxAddrGroupVO = new FaxAddrGroupVO(); |
|
| 412 |
+ faxAddrGroupVO.setMberId(userId); |
|
| 413 |
+ faxAddrGroupVO.setAddrGrpNm(faxAddrListVO.get(0).getAddrGrpNm()); |
|
| 414 |
+ |
|
| 415 |
+ // 정렬순서 |
|
| 416 |
+ int nextOrderNumber = faxAddrGroupDAO.selectMaxOrderFaxNumber(faxAddrGroupVO); |
|
| 417 |
+ faxAddrGroupVO.setGrpOrder(nextOrderNumber); |
|
| 418 |
+ |
|
| 419 |
+ faxAddrGroupDAO.insertFaxAddrGroup(faxAddrGroupVO); |
|
| 420 |
+ |
|
| 421 |
+ // 신규 추가한 그룹아이디 |
|
| 422 |
+ for (FaxAddrVO faxAddr : faxAddrListVO) { faxAddr.setAddrGrpId(faxAddrGroupVO.getAddrGrpId()); }
|
|
| 423 |
+ }else if ("bookmark".equals(faxAddrListVO.get(0).getAddrGrpId())) {
|
|
| 424 |
+ for (FaxAddrVO faxAddr : faxAddrListVO) {
|
|
| 425 |
+ faxAddr.setBookmark("Y");
|
|
| 426 |
+ faxAddr.setAddrGrpId("0");
|
|
| 427 |
+ } |
|
| 428 |
+ }else {
|
|
| 429 |
+ for (FaxAddrVO faxAddr : faxAddrListVO) { faxAddr.setBookmark("N"); }
|
|
| 430 |
+ } |
|
| 431 |
+ |
|
| 432 |
+ // step3 |
|
| 433 |
+ // => 팩스번호 빼고 바이트 체크해서 20byte만 짜르고 넣기 |
|
| 434 |
+ // => 팩스번호는 유효성 체크 하기 |
|
| 435 |
+ long startTime = System.currentTimeMillis(); |
|
| 436 |
+ |
|
| 437 |
+ // 유효성 체크 및 하이픈 제거, 유효하지 않은 번호는 리스트에서 제거 |
|
| 438 |
+ // 나머지 필드들 20byte (euc-kr) 체크 후 넘으면 자르기 |
|
| 439 |
+ AtomicInteger invalid = new AtomicInteger(0); // 스레드-안전(thread-safe)하게 정수 값을 업데이트할 수 있는 기능을 제공 |
|
| 440 |
+ faxAddrListVO.removeIf(faxAddr -> {
|
|
| 441 |
+ String phoneNo = faxAddr.getAddrPhoneNo(); |
|
| 442 |
+ |
|
| 443 |
+ if (isValidFaxNumber(phoneNo)) {
|
|
| 444 |
+ faxAddr.setAddrPhoneNo(phoneNo); // 하이픈이 제거된 유효한 번호 설정 |
|
| 445 |
+ trimFieldsBytes(faxAddr); // 다른 필드들에 대한 20바이트 체크 및 자르기 |
|
| 446 |
+ return false; // 유효한 번호는 제거하지 않음 |
|
| 447 |
+ } else if (isValidMFaxNumber(phoneNo)) {
|
|
| 448 |
+ faxAddr.setAddrPhoneNo(phoneNo); // 하이픈이 제거된 유효한 번호 설정 |
|
| 449 |
+ trimFieldsBytes(faxAddr); // 다른 필드들에 대한 20바이트 체크 및 자르기 |
|
| 450 |
+ return false; // 유효한 번호는 제거하지 않음 |
|
| 451 |
+ }else{
|
|
| 452 |
+ invalid.getAndIncrement(); // 유효하지 않은 번호 개수 증가 |
|
| 453 |
+ return true; // 유효하지 않은 번호는 제거 |
|
| 454 |
+ } |
|
| 455 |
+ }); |
|
| 456 |
+ |
|
| 457 |
+ long endTime = System.currentTimeMillis(); |
|
| 458 |
+ double executionTime = (endTime - startTime) / 1000.0; |
|
| 459 |
+ System.out.println(" number chk Execution time: " + executionTime + " seconds");
|
|
| 460 |
+ |
|
| 461 |
+ startTime = System.currentTimeMillis(); |
|
| 462 |
+ System.out.println("addrListVO.size() : "+ faxAddrListVO.size());
|
|
| 463 |
+ |
|
| 464 |
+ try {
|
|
| 465 |
+ if(faxAddrListVO.size() > 0) {
|
|
| 466 |
+ // 등록 |
|
| 467 |
+ faxAddrDAO.insertFaxAddrList(faxAddrListVO); |
|
| 468 |
+ } |
|
| 469 |
+ |
|
| 470 |
+ } catch (Exception e) {
|
|
| 471 |
+ // TODO: handle exception |
|
| 472 |
+ e.printStackTrace(); |
|
| 473 |
+ return new StatusResponse( |
|
| 474 |
+ HttpStatus.BAD_REQUEST |
|
| 475 |
+ , "배치오류" |
|
| 476 |
+ , LocalDateTime.now() |
|
| 477 |
+ ); |
|
| 478 |
+ } |
|
| 479 |
+ endTime = System.currentTimeMillis(); |
|
| 480 |
+ executionTime = (endTime - startTime) / 1000.0; |
|
| 481 |
+ System.out.println("INSERT Execution time: " + executionTime + " seconds");
|
|
| 482 |
+ |
|
| 483 |
+ |
|
| 484 |
+ // 현재 시간 가져오기 |
|
| 485 |
+ LocalDateTime now = LocalDateTime.now(); |
|
| 486 |
+ |
|
| 487 |
+ // 원하는 포맷 설정 |
|
| 488 |
+ DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
|
|
| 489 |
+ |
|
| 490 |
+ // 포맷된 시간 문자열로 변환 |
|
| 491 |
+ String formattedDateTime = now.format(formatter); |
|
| 492 |
+ |
|
| 493 |
+ // 출력 |
|
| 494 |
+ System.out.println(formattedDateTime); |
|
| 495 |
+ |
|
| 496 |
+ |
|
| 497 |
+ String message = "저장에 성공했습니다.\n저장 : " + faxAddrListVO.size() + "건" |
|
| 498 |
+ +", INERT 총 시간 : " + executionTime+ "초" |
|
| 499 |
+ +", 현재시간 : " + formattedDateTime; |
|
| 500 |
+ |
|
| 501 |
+ return new StatusResponse( |
|
| 502 |
+ HttpStatus.OK |
|
| 503 |
+ , message |
|
| 504 |
+ , faxAddrListVO.get(0).getAddrGrpId() |
|
| 505 |
+ ); |
|
| 506 |
+ } |
|
| 507 |
+ |
|
| 508 |
+ @Override |
|
| 509 |
+ public void deleteFaxAddr_advc(FaxAddrGroupVO faxAddrGroupVO) throws Exception {
|
|
| 510 |
+ faxAddrGroupDAO.deleteFaxAddrGroup_advc(faxAddrGroupVO); |
|
| 511 |
+ } |
|
| 512 |
+ |
|
| 513 |
+ @Override |
|
| 514 |
+ public int getFaxAddrCount(FaxAddrGroupVO faxAddrGroupVO) throws Exception {
|
|
| 515 |
+ // TODO Auto-generated method stub |
|
| 516 |
+ return 0; |
|
| 517 |
+ } |
|
| 361 | 518 |
|
| 519 |
+ public static boolean isValidFaxNumber(String faxNo) {
|
|
| 520 |
+ if (faxNo == null || faxNo.isEmpty()) {
|
|
| 521 |
+ return false; |
|
| 522 |
+ } |
|
| 523 |
+ Matcher matcher = FAX_PATTERN.matcher(faxNo); |
|
| 524 |
+ return matcher.matches(); |
|
| 525 |
+ } |
|
| 526 |
+ |
|
| 527 |
+ public static boolean isValidMFaxNumber(String faxNo) {
|
|
| 528 |
+ if (faxNo == null || faxNo.isEmpty()) {
|
|
| 529 |
+ return false; |
|
| 530 |
+ } |
|
| 531 |
+ Matcher matcher = FAX_M_PATTERN.matcher(faxNo); |
|
| 532 |
+ return matcher.matches(); |
|
| 533 |
+ } |
|
| 534 |
+ |
|
| 535 |
+ public static void trimFieldsBytes(FaxAddrVO faxAddr) {
|
|
| 536 |
+ faxAddr.setAddrNm(trimToBytes(faxAddr.getAddrNm(), 20)); |
|
| 537 |
+ faxAddr.setAddrComment(trimToBytes(faxAddr.getAddrComment(), 250)); |
|
| 538 |
+ } |
|
| 539 |
+ |
|
| 540 |
+ // maxBytes만큼 글자수 처리해서 리턴 |
|
| 541 |
+ public static String trimToBytes(String str, int maxBytes) {
|
|
| 542 |
+ if (str == null) {
|
|
| 543 |
+ return null; |
|
| 544 |
+ } |
|
| 545 |
+ byte[] bytes = str.getBytes(EUC_KR); |
|
| 546 |
+ if (bytes.length <= maxBytes) {
|
|
| 547 |
+ return str; |
|
| 548 |
+ } |
|
| 549 |
+ int len = maxBytes; |
|
| 550 |
+ while (len > 0 && bytes[len - 1] < 0) {
|
|
| 551 |
+ len--; // 바이트 배열을 maxBytes로 자를 때, 잘못된 분할을 피하기 위해 문자 경계 확인 |
|
| 552 |
+ } |
|
| 553 |
+ return new String(bytes, 0, len, EUC_KR); |
|
| 554 |
+ } |
|
| 362 | 555 |
} |
+++ src/main/java/itn/let/fax/addr/web/FaxAddrRestController.java
... | ... | @@ -0,0 +1,79 @@ |
| 1 | +package itn.let.fax.addr.web; | |
| 2 | + | |
| 3 | +import java.time.LocalDateTime; | |
| 4 | +import java.util.List; | |
| 5 | + | |
| 6 | +import javax.annotation.Resource; | |
| 7 | + | |
| 8 | +import org.springframework.http.HttpStatus; | |
| 9 | +import org.springframework.http.ResponseEntity; | |
| 10 | +import org.springframework.ui.ModelMap; | |
| 11 | +import org.springframework.web.bind.annotation.RequestBody; | |
| 12 | +import org.springframework.web.bind.annotation.RequestMapping; | |
| 13 | +import org.springframework.web.bind.annotation.RestController; | |
| 14 | + | |
| 15 | +import egovframework.rte.fdl.security.userdetails.util.EgovUserDetailsHelper; | |
| 16 | +import itn.com.cmm.EgovMessageSource; | |
| 17 | +import itn.com.cmm.LoginVO; | |
| 18 | +import itn.com.utl.fcc.service.EgovStringUtil; | |
| 19 | +import itn.let.fax.addr.service.FaxAddrGroupService; | |
| 20 | +import itn.let.fax.addr.service.FaxAddrService; | |
| 21 | +import itn.let.fax.addr.service.FaxAddrVO; | |
| 22 | +import itn.let.mail.service.StatusResponse; | |
| 23 | + | |
| 24 | +/** | |
| 25 | + * 팩스 주소록 관한 controller 클래스를 정의한다. | |
| 26 | + * @author ITN | |
| 27 | + * @since 2024.11.08 | |
| 28 | + * @version 1.0 | |
| 29 | + * @see | |
| 30 | + * | |
| 31 | + * <pre> | |
| 32 | + * << 개정이력(Modification Information) >> | |
| 33 | + * | |
| 34 | + * 수정일 수정자 수정내용 | |
| 35 | + * ------- -------- --------------------------- | |
| 36 | + * 2021.04.08 ITN 최초 생성 | |
| 37 | + * | |
| 38 | + * </pre> | |
| 39 | + */ | |
| 40 | +@RestController | |
| 41 | +public class FaxAddrRestController { | |
| 42 | + | |
| 43 | + | |
| 44 | + @Resource (name = "FaxAddrService") | |
| 45 | + private FaxAddrService faxAddrService; | |
| 46 | + | |
| 47 | + @Resource (name = "FaxAddrGroupService") | |
| 48 | + private FaxAddrGroupService faxAddrGroupService; | |
| 49 | + | |
| 50 | + /** EgovMessageSource */ | |
| 51 | + @Resource(name="egovMessageSource") | |
| 52 | + EgovMessageSource egovMessageSource; | |
| 53 | + | |
| 54 | + /** | |
| 55 | + * 팩스 주소록 대량등록 저장 | |
| 56 | + * @param searchVO | |
| 57 | + * @param model | |
| 58 | + * @return "/web/mjon/addr/addrMassInsertByTempAjax_advc.do" | |
| 59 | + * @throws Exception | |
| 60 | + */ | |
| 61 | + @RequestMapping(value= {"/web/mjon/fax/addr/faxAddrMassInsertByTempAjax_advc.do"}) | |
| 62 | + public ResponseEntity<StatusResponse> faxAddrMassInsertByTempAjax_advc( | |
| 63 | + @RequestBody List<FaxAddrVO> faxAddrListVO | |
| 64 | + ,ModelMap model) throws Exception{ | |
| 65 | + | |
| 66 | + LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null; | |
| 67 | + String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId()); | |
| 68 | + | |
| 69 | + if(userId.equals("")) { | |
| 70 | + return ResponseEntity.ok( | |
| 71 | + new StatusResponse(HttpStatus.UNAUTHORIZED | |
| 72 | + , "로그인을 하셔야 이용 가능합니다." | |
| 73 | + , LocalDateTime.now() | |
| 74 | + ) | |
| 75 | + ); | |
| 76 | + } | |
| 77 | + return ResponseEntity.ok().body(faxAddrService.faxAddrMassInsertByTempAjax_advc(faxAddrListVO, userId)); | |
| 78 | + } | |
| 79 | +}(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
... | ... | @@ -638,6 +638,8 @@ |
| 638 | 638 |
var $objTabul = fn_utils_getTabulator(); |
| 639 | 639 |
$objTabul.clearData(); |
| 640 | 640 |
|
| 641 |
+ fn_rowDataClear(); |
|
| 642 |
+ |
|
| 641 | 643 |
$("#rowTotCnt").text(0); //총건수 수정
|
| 642 | 644 |
$("#rowDupCnt").text(0); //중복건수 수정
|
| 643 | 645 |
$("#rowErrorCnt").text(0); //오류건수 수정
|
... | ... | @@ -654,6 +656,28 @@ |
| 654 | 656 |
addrLoadAjax(); |
| 655 | 657 |
fn_errorPopClean(); // 에러 팝업 초기화 |
| 656 | 658 |
} |
| 659 |
+ |
|
| 660 |
+//주소록 탭마다 돌면서 총, 중복, 오류 건수 초기화 |
|
| 661 |
+function fn_rowDataClear(){
|
|
| 662 |
+ |
|
| 663 |
+ // 모든 .tab 요소를 선택하여 반복 |
|
| 664 |
+ $('#tbTabl .tab').each(function() {
|
|
| 665 |
+ // 현재 반복 중인 요소 |
|
| 666 |
+ var tab = $(this); |
|
| 667 |
+ |
|
| 668 |
+ // data-tabul 값 가져오기 |
|
| 669 |
+ var tabulNm = tab.data('tabul');
|
|
| 670 |
+ var tabluC = '.'+tabulNm |
|
| 671 |
+ |
|
| 672 |
+ // 중복 카운트 |
|
| 673 |
+ $(tabluC+" #rowTotCnt").text(0); |
|
| 674 |
+ // 에러 카운트 |
|
| 675 |
+ $(tabluC+" #rowDupCnt").text(0); |
|
| 676 |
+ // |
|
| 677 |
+ $(tabluC+" #rowErrorCnt").text(0); |
|
| 678 |
+ }); |
|
| 679 |
+} |
|
| 680 |
+ |
|
| 657 | 681 |
|
| 658 | 682 |
// 주소록 그룹 중복체크 |
| 659 | 683 |
function getAddrGroupDuplCheckAjax(addrGrpNm) {
|
... | ... | @@ -702,9 +726,14 @@ |
| 702 | 726 |
return false; |
| 703 | 727 |
} |
| 704 | 728 |
|
| 729 |
+ if($objTabul.getData().length > 300000){
|
|
| 730 |
+ alert("30만개 까지 등록 가능합니다.");
|
|
| 731 |
+ return false; |
|
| 732 |
+ } |
|
| 733 |
+ |
|
| 705 | 734 |
var columns = $objTabul.getColumns(); |
| 706 |
- var isAddrFaxNoSelected = columns.some(column => column.getField() === 'addrFaxNo'); |
|
| 707 |
- if (!isAddrFaxNoSelected) {
|
|
| 735 |
+ var isAddrPhoneNoSelected = columns.some(column => column.getField() === 'addrPhoneNo'); |
|
| 736 |
+ if (!isAddrPhoneNoSelected) {
|
|
| 708 | 737 |
alert('팩스번호가 선택되지 않았습니다.');
|
| 709 | 738 |
return false; |
| 710 | 739 |
} |
... | ... | @@ -720,7 +749,6 @@ |
| 720 | 749 |
$(tabluC+" #addrGrpNm").focus(); |
| 721 | 750 |
return false; |
| 722 | 751 |
} |
| 723 |
- |
|
| 724 | 752 |
|
| 725 | 753 |
// 새 그룹명 중복체크 |
| 726 | 754 |
if ($(tabluC+" #addrGrpIdInfo option:selected").val() == "NEW" |
... | ... | @@ -740,108 +768,97 @@ |
| 740 | 768 |
var phoneList = []; |
| 741 | 769 |
var nameList = []; |
| 742 | 770 |
var memoList = []; |
| 743 |
- |
|
| 744 |
- var commaSelectedData = numberWithCommas(selectedData.length); |
|
| 745 | 771 |
var confirmMsg = "저장하시겠습니까?\n이름 20byte, 메모 250byte 초과 글자는 절사됩니다."; |
| 746 |
- if (selectedData.length >= 10000) {
|
|
| 747 |
- confirmMsg = "저장하시겠습니까?\n이름 20byte, 메모 250byte 초과 글자는 절사됩니다.\n1만건 이상 등록시 약 30초정도 소요됩니다.\n잠시만 기다려주세요."; |
|
| 748 |
- } |
|
| 749 |
- else if (selectedData.length > 2000) {
|
|
| 750 |
- confirmMsg = "저장하시겠습니까?\n이름 20byte, 메모 250byte 초과 글자는 절사됩니다.\n" + commaSelectedData + "건 등록시 수초정도 소요됩니다.\n잠시만 기다려주세요."; |
|
| 751 |
- } |
|
| 752 |
- |
|
| 753 | 772 |
if (confirm(confirmMsg)) {
|
| 754 |
- |
|
| 755 |
- for (var i=0; i < selectedData.length; i++) {
|
|
| 756 |
- var name = $tableExcel.getRows()[i].getData().addrNm; |
|
| 757 |
- var phone = removeDash($tableExcel.getRows()[i].getData().addrFaxNo); |
|
| 758 |
- var memo = $tableExcel.getRows()[i].getData().addrMemo; |
|
| 759 |
- |
|
| 760 |
- // name |
|
| 761 |
- if (name == "" || name == null || name == undefined) {
|
|
| 762 |
- nameList[i] = ""; |
|
| 763 |
- } |
|
| 764 |
- else {
|
|
| 765 |
- if(!addrEmojiCheck(name)){//이모지 체크 해주기
|
|
| 766 |
- return false; |
|
| 767 |
- } |
|
| 768 |
- nameList[i] = name.replace(/,/g,"§"); |
|
| 769 |
- } |
|
| 770 |
- |
|
| 771 |
- // memo |
|
| 772 |
- phoneList[i] = phone; |
|
| 773 |
- |
|
| 774 |
- // memo |
|
| 775 |
- if (memo == "" || memo == null || memo == undefined) {
|
|
| 776 |
- memoList[i] = ""; |
|
| 777 |
- } |
|
| 778 |
- else {
|
|
| 779 |
- if(!addrEmojiCheck(memo)){//이모지 체크 해주기
|
|
| 780 |
- return false; |
|
| 781 |
- } |
|
| 782 |
- memoList[i] = memo.replace(/,/g,"§"); |
|
| 783 |
- } |
|
| 784 |
- |
|
| 785 |
- } |
|
| 786 |
- |
|
| 787 |
- var form = document.addrMassForm; |
|
| 788 |
- form.phoneList.value = phoneList; |
|
| 789 |
- form.nameList.value = nameList; |
|
| 790 |
- form.memoList.value = memoList; |
|
| 791 |
- form.addrGrpId.value = $("#addrGrpIdInfo").val();
|
|
| 792 |
- |
|
| 793 |
- var data = new FormData(form); |
|
| 794 |
- |
|
| 795 |
- url = "/web/mjon/fax/addr/faxAddrMassInsertByTempAjax.do"; |
|
| 796 |
- |
|
| 797 |
- $.ajax({
|
|
| 798 |
- type: "POST", |
|
| 799 |
- url: url, |
|
| 800 |
- data: data, |
|
| 801 |
- dataType:'json', |
|
| 802 |
- async: true, |
|
| 803 |
- processData: false, |
|
| 804 |
- contentType: false, |
|
| 805 |
- cache: false, |
|
| 806 |
- success: function (returnData) {
|
|
| 807 |
- if (returnData.isSuccess) {
|
|
| 808 |
- alert("저장에 성공했습니다.\n저장 : " + returnData.resultCnt + "건, 중복 : " + returnData.dupliCnt + "건, 팩스번호 오류 : " + returnData.errPhoneCnt + "건");
|
|
| 809 |
- |
|
| 810 |
- // 중복번호 Hide |
|
| 811 |
- $("#btnAddrMassDupli").hide();
|
|
| 812 |
- $("#btnAddrMassSaveDupli").hide();
|
|
| 813 |
- |
|
| 814 |
- // 중복건이 있을경우 |
|
| 815 |
- if (returnData.dupliCnt > 0) {
|
|
| 816 |
- // 중복번호(해당 그룹) Show |
|
| 817 |
- $("#btnAddrMassSaveDupli").show();
|
|
| 818 |
- addrMassDupliSaveList = returnData.addrMassDupliList; |
|
| 819 |
- } |
|
| 820 |
- |
|
| 821 |
- // 데이터 비우기 |
|
| 822 |
- SetClear(); |
|
| 823 |
- |
|
| 824 |
- // 주소록그룹 콤보박스 유지 |
|
| 825 |
- setTimeout(setSelectMassSetting, 500, selectMassVal); |
|
| 826 |
- } |
|
| 827 |
- else {
|
|
| 828 |
- alert("오류 알림 : " + returnData.msg);
|
|
| 829 |
- } |
|
| 830 |
- }, |
|
| 831 |
- error: function (e) {
|
|
| 832 |
- alert("저장에 실패하였습니다.");
|
|
| 833 |
- alert("ERROR : " + JSON.stringify(e));
|
|
| 834 |
- }, |
|
| 835 |
- beforeSend : function(xmlHttpRequest) {
|
|
| 836 |
- //로딩창 show |
|
| 837 |
- $('.loading_layer').addClass('active');
|
|
| 838 |
- }, |
|
| 839 |
- complete : function(xhr, textStatus) {
|
|
| 840 |
- //로딩창 hide |
|
| 841 |
- $('.loading_layer').removeClass('active');
|
|
| 842 |
- } |
|
| 843 |
- }); |
|
| 773 |
+ //로딩창 show |
|
| 774 |
+ fn_loadAddActive(); |
|
| 775 |
+ setTimeout(setSenderList_advc, 1000); |
|
| 844 | 776 |
} |
| 777 |
+} |
|
| 778 |
+ |
|
| 779 |
+function setSenderList_advc(){
|
|
| 780 |
+ |
|
| 781 |
+ var tabulNm = fn_utils_getTabulatorNm(); |
|
| 782 |
+ var tabluC = '.'+tabulNm |
|
| 783 |
+ |
|
| 784 |
+ var $objTabul = fn_utils_getTabulator(); |
|
| 785 |
+ var dataToSend = $objTabul.getData(); |
|
| 786 |
+ console.log('dataToSend : ', dataToSend);
|
|
| 787 |
+ var addrGrpIdInfo = $(tabluC+" #addrGrpIdInfo option:selected").val(); |
|
| 788 |
+ var addrGrpNmInfo = $(tabluC+" #addrGrpNm").val(); |
|
| 789 |
+ |
|
| 790 |
+ var batchSize = 30000; // 배치 크기 |
|
| 791 |
+ var totalBatches = Math.ceil(dataToSend.length / batchSize); // 총 배치 수 |
|
| 792 |
+ var currentBatch = 0; // 현재 배치 인덱스 |
|
| 793 |
+ |
|
| 794 |
+ fn_loadAddActive(); |
|
| 795 |
+ |
|
| 796 |
+ function sendBatch() {
|
|
| 797 |
+ if (currentBatch < totalBatches) {
|
|
| 798 |
+ |
|
| 799 |
+ fn_loadAddActive(); |
|
| 800 |
+ var start = currentBatch * batchSize; |
|
| 801 |
+ var end = Math.min(start + batchSize, dataToSend.length); |
|
| 802 |
+ var batchData = dataToSend.slice(start, end); |
|
| 803 |
+ |
|
| 804 |
+ |
|
| 805 |
+ var updateData = batchData.map(row => {
|
|
| 806 |
+ row.addrGrpId = addrGrpIdInfo; |
|
| 807 |
+ row.addrGrpNm = addrGrpNmInfo; |
|
| 808 |
+ return row; |
|
| 809 |
+ }); |
|
| 810 |
+ |
|
| 811 |
+ console.log('updateData : ', updateData);
|
|
| 812 |
+ |
|
| 813 |
+ $.ajax({
|
|
| 814 |
+ type: "POST" |
|
| 815 |
+ , url: "/web/mjon/fax/addr/faxAddrMassInsertByTempAjax_advc.do" |
|
| 816 |
+ , data: JSON.stringify(updateData) |
|
| 817 |
+ , dataType:'json' |
|
| 818 |
+ , contentType: 'application/json' |
|
| 819 |
+ , async: true |
|
| 820 |
+ , success: function (data) {
|
|
| 821 |
+ |
|
| 822 |
+ fn_loadRemoveActive(); |
|
| 823 |
+ |
|
| 824 |
+ console.log('Batch ' + (currentBatch + 1) + ' success: ', data);
|
|
| 825 |
+ if (data.status == 'OK') {
|
|
| 826 |
+ if (currentBatch === totalBatches - 1) {
|
|
| 827 |
+ alert("모든 데이터가 성공적으로 저장되었습니다.");
|
|
| 828 |
+ // 데이터 비우기 |
|
| 829 |
+ SetClear($objTabul); |
|
| 830 |
+ setAddrMassClose(); |
|
| 831 |
+ $("#btnAddrMassClose").trigger("click");
|
|
| 832 |
+ } else {
|
|
| 833 |
+ currentBatch++; |
|
| 834 |
+ // 새로만든 그룹ID나 기존 ID를 넣어줌 |
|
| 835 |
+ // 그룹추가 시 배치별로 똑같은 그룹을 생성해서 방지차원으로 넣어줌 |
|
| 836 |
+ addrGrpIdInfo = data.object; |
|
| 837 |
+ sendBatch(); // 다음 배치 전송 |
|
| 838 |
+ } |
|
| 839 |
+ } else {
|
|
| 840 |
+ alert("오류 알림 : " + returnData.msg);
|
|
| 841 |
+ } |
|
| 842 |
+ } |
|
| 843 |
+ ,error: function (e) {
|
|
| 844 |
+ alert("배치 전송에 실패하였습니다.");
|
|
| 845 |
+ console.error("ERROR: ", JSON.stringify(e));
|
|
| 846 |
+ } |
|
| 847 |
+ ,beforeSend : function(xmlHttpRequest) {
|
|
| 848 |
+ } |
|
| 849 |
+ ,complete : function(xhr, textStatus) {
|
|
| 850 |
+ if (currentBatch === totalBatches - 1) {
|
|
| 851 |
+ $('#lodingTxt').text('Loading');
|
|
| 852 |
+ } else {
|
|
| 853 |
+ $('#lodingTxt').text(end+'...');
|
|
| 854 |
+ } |
|
| 855 |
+ } |
|
| 856 |
+ }); |
|
| 857 |
+ } |
|
| 858 |
+ } |
|
| 859 |
+ |
|
| 860 |
+ // 첫 번째 배치 전송 시작 |
|
| 861 |
+ sendBatch(); |
|
| 845 | 862 |
} |
| 846 | 863 |
|
| 847 | 864 |
//주소록그룹 콤보박스 유지 |
... | ... | @@ -849,23 +866,32 @@ |
| 849 | 866 |
$("#addrGrpIdInfo").val(selectMassVal).prop("selected", true);
|
| 850 | 867 |
} |
| 851 | 868 |
|
| 852 |
- |
|
| 853 | 869 |
//데이터 비우기 |
| 854 |
-function SetClear() {
|
|
| 855 |
- $("#addrGrpNm").val(""); // 새그룹명 Clear;
|
|
| 856 |
- // 주소록 그룹정보 불러오기 |
|
| 857 |
- getAddrGroupList(); |
|
| 870 |
+function SetClear($objTabul) {
|
|
| 858 | 871 |
|
| 859 |
- var data = $tableExcel.getRows(); |
|
| 860 |
- if (data == null || data == "") {
|
|
| 861 |
- |
|
| 872 |
+ var tabulNm = fn_utils_getTabulatorNm(); |
|
| 873 |
+ var tabluC = '.'+tabulNm |
|
| 874 |
+ |
|
| 875 |
+ $(tabluC+" #addrGrpNm").val(""); // 새그룹명 Clear;
|
|
| 876 |
+ // 주소록 그룹정보 불러오기 |
|
| 877 |
+ getAddrGroupList(); |
|
| 878 |
+ |
|
| 879 |
+ if (tabulNm === 'tableSelf') {
|
|
| 880 |
+ var tableData = []; |
|
| 881 |
+ for (var i = 0; i < 1000; i++) {
|
|
| 882 |
+ tableData.push({addrNm: "", addrPhoneNo: "", addrInfo1: "", addrInfo2: "", addrInfo3: "", addrInfo4: "", addrComment: ""});
|
|
| 883 |
+ } |
|
| 884 |
+ console.log(tableData); // 데이터 출력 확인 |
|
| 885 |
+ fn_selfmakeTable() |
|
| 862 | 886 |
}else{
|
| 863 |
- $tableExcel.clearData(); |
|
| 864 |
- $("#rowTotCnt").text(0); //총건수 초기화
|
|
| 865 |
- $("#rowDupCnt").text(0); //중복건수 초기화
|
|
| 866 |
- $("#rowErrorCnt").text(0); //오류건수 초기화
|
|
| 867 |
- dupliPhoneDataRealList.length = 0; // 중복 팩스번호 초기화 |
|
| 887 |
+ $objTabul.clearData(); // clearData는 동기 방식이므로 바로 실행 |
|
| 868 | 888 |
} |
| 889 |
+ |
|
| 890 |
+ $(tabluC+" #rowTotCnt").text(0); //총건수 수정 |
|
| 891 |
+ $(tabluC+" #rowDupCnt").text(0); //중복건수 수정 |
|
| 892 |
+ $(tabluC+" #rowErrorCnt").text(0); //오류건수 수정 |
|
| 893 |
+ // popup 영역 |
|
| 894 |
+ fn_errorPopClean(); |
|
| 869 | 895 |
} |
| 870 | 896 |
|
| 871 | 897 |
//주소 대량등록 버튼 클릭 |
--- 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 @@ |
| 380 | 380 |
<select class="field-selector"> |
| 381 | 381 |
<option value="">선택하기</option> |
| 382 | 382 |
<option value="addrNm">이름</option> |
| 383 |
- <option value="addrFaxNo">팩스번호</option> |
|
| 383 |
+ <option value="addrPhoneNo">팩스번호</option> |
|
| 384 | 384 |
<option value="addrComment">메모</option> |
| 385 | 385 |
</select> |
| 386 | 386 |
</div> |
... | ... | @@ -389,7 +389,7 @@ |
| 389 | 389 |
<select class="field-selector"> |
| 390 | 390 |
<option value="">선택하기</option> |
| 391 | 391 |
<option value="addrNm">이름</option> |
| 392 |
- <option value="addrFaxNo">팩스번호</option> |
|
| 392 |
+ <option value="addrPhoneNo">팩스번호</option> |
|
| 393 | 393 |
<option value="addrComment">메모</option> |
| 394 | 394 |
</select> |
| 395 | 395 |
</div> |
... | ... | @@ -398,7 +398,7 @@ |
| 398 | 398 |
<select class="field-selector"> |
| 399 | 399 |
<option value="">선택하기</option> |
| 400 | 400 |
<option value="addrNm">이름</option> |
| 401 |
- <option value="addrFaxNo">팩스번호</option> |
|
| 401 |
+ <option value="addrPhoneNo">팩스번호</option> |
|
| 402 | 402 |
<option value="addrComment">메모</option> |
| 403 | 403 |
</select> |
| 404 | 404 |
</div> |
--- src/main/webapp/js/user/fax/addr/faxEvent.js
+++ src/main/webapp/js/user/fax/addr/faxEvent.js
... | ... | @@ -38,7 +38,7 @@ |
| 38 | 38 |
updateTableFields($objTabul, group); |
| 39 | 39 |
|
| 40 | 40 |
// 필드가 팩스번호이면 열 중복체크 |
| 41 |
- if($(this).val() == 'addrFaxNo'){
|
|
| 41 |
+ if($(this).val() == 'addrPhoneNo'){
|
|
| 42 | 42 |
fn_phoneDupl($objTabul); |
| 43 | 43 |
} |
| 44 | 44 |
|
... | ... | @@ -68,7 +68,7 @@ |
| 68 | 68 |
|
| 69 | 69 |
data.forEach((row, index) => {
|
| 70 | 70 |
|
| 71 |
- const number = row.addrFaxNo; |
|
| 71 |
+ const number = row.addrPhoneNo; |
|
| 72 | 72 |
|
| 73 | 73 |
// number가 null, undefined, 빈 문자열이거나 숫자인 경우 처리 |
| 74 | 74 |
if (!number || (typeof number === 'string' && !number.trim())){
|
... | ... | @@ -81,7 +81,7 @@ |
| 81 | 81 |
|
| 82 | 82 |
if (!existingNumbers.has(cleanedNumber)) { // 중복 번호 체크
|
| 83 | 83 |
if (isValidPhoneNumber(formattedNumber)) { // 유효성 검사
|
| 84 |
- row.addrFaxNo = formattedNumber; |
|
| 84 |
+ row.addrPhoneNo = formattedNumber; |
|
| 85 | 85 |
existingNumbers.add(cleanedNumber); // 추가된 번호를 기존 목록에 추가 |
| 86 | 86 |
newData.push(row); // 유효한 데이터만 새로운 배열에 추가 |
| 87 | 87 |
} else {
|
... | ... | @@ -90,7 +90,7 @@ |
| 90 | 90 |
|
| 91 | 91 |
errors.push({
|
| 92 | 92 |
name: row.addrNm, // 이름 |
| 93 |
- phone: row.addrFaxNo, // 폰번호 |
|
| 93 |
+ phone: row.addrPhoneNo, // 폰번호 |
|
| 94 | 94 |
result: "오류" // 결과 메시지 추가 |
| 95 | 95 |
}); |
| 96 | 96 |
} |
... | ... | @@ -100,7 +100,7 @@ |
| 100 | 100 |
|
| 101 | 101 |
errors.push({
|
| 102 | 102 |
name: row.addrNm, // 이름 |
| 103 |
- phone: row.addrFaxNo, // 폰번호 |
|
| 103 |
+ phone: row.addrPhoneNo, // 폰번호 |
|
| 104 | 104 |
result: "중복" // 결과 메시지 추가 |
| 105 | 105 |
}); |
| 106 | 106 |
} |
... | ... | @@ -189,7 +189,7 @@ |
| 189 | 189 |
for (var i = 0; i < 1000; i++) {
|
| 190 | 190 |
newTableData.push({
|
| 191 | 191 |
addrNm: "", |
| 192 |
- addrFaxNo: "", |
|
| 192 |
+ addrPhoneNo: "", |
|
| 193 | 193 |
addrNemo: "" |
| 194 | 194 |
}); |
| 195 | 195 |
} |
... | ... | @@ -226,16 +226,16 @@ |
| 226 | 226 |
|
| 227 | 227 |
// 1000개 행이 되도록 나머지 행 생성 |
| 228 | 228 |
for (var i = totRows; i < 1000; i++) {
|
| 229 |
- $objTabul.addRow({addrNm: "", addrFaxNo: "", addrMemo: ""});
|
|
| 229 |
+ $objTabul.addRow({addrNm: "", addrPhoneNo: "", addrMemo: ""});
|
|
| 230 | 230 |
} |
| 231 | 231 |
|
| 232 | 232 |
|
| 233 | 233 |
var existingNumbers = []; // 중복 번호를 저장할 배열 |
| 234 |
- // 모든 행의 'addrFaxNo' 값을 배열에 추가 |
|
| 234 |
+ // 모든 행의 'addrPhoneNo' 값을 배열에 추가 |
|
| 235 | 235 |
var allRows = $tableSelf.getData(); // 테이블의 모든 데이터를 가져옴 |
| 236 | 236 |
allRows.forEach(function(row) {
|
| 237 |
- if (row.addrFaxNo) {
|
|
| 238 |
- const cleanedExistingNumber = row.addrFaxNo.replace(/[^0-9]/g, ''); // 숫자만 남김 |
|
| 237 |
+ if (row.addrPhoneNo) {
|
|
| 238 |
+ const cleanedExistingNumber = row.addrPhoneNo.replace(/[^0-9]/g, ''); // 숫자만 남김 |
|
| 239 | 239 |
existingNumbers.push(cleanedExistingNumber); // 기존 번호를 배열에 추가 |
| 240 | 240 |
} |
| 241 | 241 |
}); |
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?