Merge branch 'advc' of http://hylee@vcs.iten.co.kr:9999/hylee/mjon_git into advc
This commit is contained in:
commit
8561a824f4
@ -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;
|
||||
|
||||
|
||||
}
|
||||
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@ -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));
|
||||
}
|
||||
}
|
||||
@ -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>
|
||||
|
||||
|
||||
@ -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>
|
||||
|
||||
@ -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(){
|
||||
Loading…
Reference in New Issue
Block a user