This commit is contained in:
hehihoho3@gmail.com 2024-11-08 17:53:08 +09:00
commit 8561a824f4
7 changed files with 473 additions and 160 deletions

View File

@ -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<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;
}

View File

@ -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<FaxAddrVO> selectFaxAddrList(FaxAddrVO addrVO) throws Exception {
return faxAddrDAO.selectFaxAddrList(addrVO);
}
@ -358,5 +376,180 @@ public class FaxAddrServiceImpl extends EgovAbstractServiceImpl implements FaxAd
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);
}
}

View File

@ -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));
}
}

View File

@ -7,8 +7,8 @@
<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/fax/faxTabulator.js'/>?v=20241031"></script>
<script type="text/javascript" src="<c:url value='/js/web/addr/fax/faxEvent.js'/>?v=20241031"></script>
<script type="text/javascript" src="<c:url value='/js/user/fax/addr/faxTabulator.js'/>?v=20241031"></script>
<script type="text/javascript" src="<c:url value='/js/user/fax/addr/faxEvent.js'/>?v=20241031"></script>
<script type="text/javascript" src="<c:url value='/js/web/addr/cmn.js?date=202409021440'/>"></script>
<script type="text/javascript" src="<c:url value='/js/web/addr/utils.js'/>?v=20240919"></script>
@ -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,14 +657,36 @@ 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() {
function getAddrGroupDuplCheckAjax(addrGrpNm) {
var isReturn = true;
$.ajax({
url : "<c:url value='/web/mjon/fax/addr/getFaxAddrGroupDuplCheckAjax.do' />",
type : 'POST',
data : {"addrGrpNm" : $("#addrGrpNm").val()},
data : {"addrGrpNm" : addrGrpNm},
dataType:'json',
async: false, // 동기
success : function(data, status){
@ -687,39 +711,52 @@ 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 $objTabul = fn_utils_getTabulator();
var tabulNm = fn_utils_getTabulatorNm();
var tabluC = '.'+tabulNm
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)) {
if($objTabul.getData().length < 1){
alert("한 개 이상의 연락처를 입력하세요");
return false;
}
if($objTabul.getData().length > 300000){
alert("30만개 까지 등록 가능합니다.");
return false;
}
var columns = $objTabul.getColumns();
var isAddrPhoneNoSelected = columns.some(column => column.getField() === 'addrPhoneNo');
if (!isAddrPhoneNoSelected) {
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() != "")
{
var addrGrpNm = $(tabluC+" #addrGrpNm").val();
console.log('addrGrpNm : ', addrGrpNm);
//주소록 중복체크
if (getAddrGroupDuplCheckAjax() == false) {
alert("중복된 그룹명입니다. 새 그룹명을 입력해주세요.");
@ -731,132 +768,128 @@ 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;
});
$.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();
}
//주소 대량등록 버튼 클릭
@ -908,8 +941,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]);
@ -1132,7 +1169,7 @@ function fn_tabToggle(tabNum){
<div class="loading_layer">
<div class="loading_container">
<div class="bar"></div>
<div class="text">Loading</div>
<div class="text" id="lodingTxt">Loading</div>
</div>
</div>

View File

@ -380,7 +380,7 @@ $(document).on("click", "#duplicationChkAll", function(e) {
<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 @@ $(document).on("click", "#duplicationChkAll", function(e) {
<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 @@ $(document).on("click", "#duplicationChkAll", function(e) {
<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>

View File

@ -37,8 +37,8 @@ $(document).ready(function(){
// 데이터 넣기
updateTableFields($objTabul, group);
// 필드가 휴대폰이면 열 중복체크
if($(this).val() == 'addrFaxNo'){
// 필드가 팩스번호이면 열 중복체크
if($(this).val() == 'addrPhoneNo'){
fn_phoneDupl($objTabul);
}
@ -47,7 +47,7 @@ $(document).ready(function(){
/**
* @ 핸드폰 중복 데이터
* @ 팩스번호 중복 데이터
* */
function 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); // 기존 번호를 배열에 추가
}
});
@ -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(){