diff --git a/src/main/java/itn/let/mail/service/StatusResponse.java b/src/main/java/itn/let/mail/service/StatusResponse.java index c927d42e..e70a90af 100644 --- a/src/main/java/itn/let/mail/service/StatusResponse.java +++ b/src/main/java/itn/let/mail/service/StatusResponse.java @@ -5,6 +5,10 @@ import java.time.LocalDateTime; import org.springframework.http.HttpStatus; import itn.let.mjo.pay.service.RefundVO; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; /** * @@ -22,6 +26,9 @@ import itn.let.mjo.pay.service.RefundVO; * * */ +@Getter +@Setter +@NoArgsConstructor public class StatusResponse { private HttpStatus status; @@ -61,51 +68,13 @@ public class StatusResponse { this.messageTemp = messageTemp; } - public HttpStatus getStatus() { - return status; - } - - public void setStatus(HttpStatus status) { + @Builder + public StatusResponse(HttpStatus status, String msg, Object data) { this.status = status; + this.message = msg; + this.object = data; } - - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } - - public String getMessageTemp() { - return messageTemp; - } - - public void setMessageTemp(String messageTemp) { - this.messageTemp = messageTemp; - } - - public RefundVO getRefundVO() { - return refundVO; - } - - public void setRefundVO(RefundVO refundVO) { - this.refundVO = refundVO; - } - - public Object getObject() { - return object; - } - - public void setObject(Object object) { - this.object = object; - } - - public LocalDateTime getTimestamp() { - return timestamp; - } - - public void setTimestamp(LocalDateTime timestamp) { - this.timestamp = timestamp; - } + + + } diff --git a/src/main/java/itn/let/mjo/addr/service/AddrGroupService.java b/src/main/java/itn/let/mjo/addr/service/AddrGroupService.java index 260d4678..506aa3b3 100644 --- a/src/main/java/itn/let/mjo/addr/service/AddrGroupService.java +++ b/src/main/java/itn/let/mjo/addr/service/AddrGroupService.java @@ -2,6 +2,8 @@ package itn.let.mjo.addr.service; import java.util.List; +import itn.let.mail.service.StatusResponse; + /** * 주소록 관리를 위한 서비스 인터페이스 클래스 * @author ITN diff --git a/src/main/java/itn/let/mjo/addr/service/AddrService.java b/src/main/java/itn/let/mjo/addr/service/AddrService.java index 32fcd84f..4cf57279 100644 --- a/src/main/java/itn/let/mjo/addr/service/AddrService.java +++ b/src/main/java/itn/let/mjo/addr/service/AddrService.java @@ -2,6 +2,8 @@ package itn.let.mjo.addr.service; import java.util.List; +import itn.let.mail.service.StatusResponse; + /** * 주소록 관리를 위한 서비스 인터페이스 클래스 * @author ITN @@ -99,5 +101,6 @@ public interface AddrService { // 주소록 대량등록 By Temp 주소록 All public int insertAddrByTempAddrAll(List addrList, AddrVO addrVO) throws Exception; - + + public StatusResponse addrMassInsertByTempAjax_advc(List addrListVO, String userId) throws Exception; } diff --git a/src/main/java/itn/let/mjo/addr/service/impl/AddrGroupServiceImpl.java b/src/main/java/itn/let/mjo/addr/service/impl/AddrGroupServiceImpl.java index aa5170f9..f626c01a 100644 --- a/src/main/java/itn/let/mjo/addr/service/impl/AddrGroupServiceImpl.java +++ b/src/main/java/itn/let/mjo/addr/service/impl/AddrGroupServiceImpl.java @@ -1,12 +1,19 @@ package itn.let.mjo.addr.service.impl; +import java.nio.charset.Charset; +import java.time.LocalDateTime; import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import javax.annotation.Resource; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Service; import egovframework.rte.fdl.cmmn.EgovAbstractServiceImpl; +import itn.let.mail.service.StatusResponse; import itn.let.mjo.addr.service.AddrGroupService; import itn.let.mjo.addr.service.AddrGroupVO; import itn.let.mjo.addr.service.AddrService; @@ -37,6 +44,11 @@ public class AddrGroupServiceImpl extends EgovAbstractServiceImpl implements Ad @Resource(name = "AddrDAO") private AddrDAO addrDAO; + + + + + public List selectAddrGroupList(AddrGroupVO addrGroupVO) throws Exception { return addrGroupDAO.selectAddrGroupList(addrGroupVO); @@ -159,4 +171,6 @@ public class AddrGroupServiceImpl extends EgovAbstractServiceImpl implements Ad } + + } diff --git a/src/main/java/itn/let/mjo/addr/service/impl/AddrServiceImpl.java b/src/main/java/itn/let/mjo/addr/service/impl/AddrServiceImpl.java index b18bac66..b357e3e7 100644 --- a/src/main/java/itn/let/mjo/addr/service/impl/AddrServiceImpl.java +++ b/src/main/java/itn/let/mjo/addr/service/impl/AddrServiceImpl.java @@ -1,18 +1,25 @@ package itn.let.mjo.addr.service.impl; +import java.nio.charset.Charset; import java.text.SimpleDateFormat; +import java.time.LocalDateTime; import java.util.Date; import java.util.List; import java.util.Locale; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import javax.annotation.Resource; +import org.springframework.http.HttpStatus; import org.springframework.stereotype.Service; import egovframework.rte.fdl.cmmn.EgovAbstractServiceImpl; import egovframework.rte.fdl.idgnr.EgovIdGnrService; import egovframework.rte.fdl.security.userdetails.util.EgovUserDetailsHelper; import itn.com.cmm.LoginVO; +import itn.let.mail.service.StatusResponse; import itn.let.mjo.addr.service.AddrGroupVO; import itn.let.mjo.addr.service.AddrService; import itn.let.mjo.addr.service.AddrTransHistVO; @@ -44,10 +51,16 @@ public class AddrServiceImpl extends EgovAbstractServiceImpl implements AddrSer @Resource(name = "AddrTransHistDAO") private AddrTransHistDAO addrTransHistDAO; - @Resource(name = "egovAddrTransHistIdGnrService") private EgovIdGnrService idgenAddrTransHistId; + + + private static final String PHONE_REGEX = "^(01[016789]-?\\d{3,4}-?\\d{4})$"; + private static final Pattern PHONE_PATTERN = Pattern.compile(PHONE_REGEX); + private static final Charset EUC_KR = Charset.forName("EUC-KR"); + private static final int MAX_ADDR_CNT = 500000; + public List selectAddrList(AddrVO addrVO) throws Exception { return addrDAO.selectAddrList(addrVO); @@ -366,5 +379,153 @@ public class AddrServiceImpl extends EgovAbstractServiceImpl implements AddrSer return rtnVal; } + + @Override + public StatusResponse addrMassInsertByTempAjax_advc(List addrListVO, String userId) throws Exception { + + + // data init + // For-each loop + for (AddrVO addr : addrListVO) { addr.setMberId(userId); } + + + + // step1 현재 주소록 갯수 조회 + + //회원별 주소록 전체 갯수 조회 + int addrBefCnt = addrDAO.selectAddrTotalCount(addrListVO.get(0)); + int addrNewCnt = addrListVO.size(); //신규 추가할 주소록 갯수 + int sumAddrCnt = addrBefCnt + addrNewCnt; + + // step1-1 총 갯수가 (주소록 갯수 + 신규 주소록)50만건 체크 + if(sumAddrCnt > MAX_ADDR_CNT) { + return new StatusResponse( + HttpStatus.BAD_REQUEST + , "주소록은 총 50만개까지만 등록이 가능합니다." + , LocalDateTime.now() + ); + + } + + // step2 신규 주소록 생성 및 북마크 체크 + // => AddrGrpId + // + if ("NEW".equals(addrListVO.get(0).getAddrGrpId())) { + + AddrGroupVO addrGroupVO = new AddrGroupVO(); + addrGroupVO.setMberId(userId); + addrGroupVO.setAddrGrpNm(addrListVO.get(0).getAddrGrpNm()); + // 정렬순서 + + int nextOrderNumber = addrGroupDAO.selectMaxOrderNumber(addrGroupVO); + addrGroupVO.setGrpOrder(nextOrderNumber); + + addrGroupDAO.insertAddrGroup(addrGroupVO); + + // 신규 추가한 그룹아이디 + for (AddrVO addr : addrListVO) { addr.setAddrGrpId(addrGroupVO.getAddrGrpId()); } + + } + else if ("bookmark".equals(addrListVO.get(0).getAddrGrpId())) + { + for (AddrVO addr : addrListVO) { addr.setBookmark("Y"); addr.setAddrGrpId("0"); } + } + else + { + for (AddrVO addr : addrListVO) { addr.setBookmark("N"); } + } + + // step4-1 true + // => 폰번호 빼고 바이트 체크해서 20byte만 짜르고 넣기 + // => 폰번호는 유효성 체크 하기 + + long startTime = System.currentTimeMillis(); + // 유효성 체크 및 하이픈 제거, 유효하지 않은 번호는 리스트에서 제거 + // 나머지 필드들 20byte (euc-kr) 체크 후 넘으면 자르기 + AtomicInteger invalid = new AtomicInteger(0); // 스레드-안전(thread-safe)하게 정수 값을 업데이트할 수 있는 기능을 제공 + addrListVO.removeIf(addr -> { + String phoneNo = addr.getAddrPhoneNo(); +// phoneNo = phoneNo != null ? phoneNo.replaceAll("-", "") : ""; +// System.out.println("phoneNo : "+ phoneNo); + if (isValidPhoneNumber(phoneNo)) { + addr.setAddrPhoneNo(phoneNo); // 하이픈이 제거된 유효한 번호 설정 + trimFieldsBytes(addr); // 다른 필드들에 대한 20바이트 체크 및 자르기 + return false; // 유효한 번호는 제거하지 않음 + } else { +// System.out.println(phoneNo + " is an invalid phone number. Removing from list."); + invalid.getAndIncrement(); // 유효하지 않은 번호 개수 증가 + return true; // 유효하지 않은 번호는 제거 + } + }); + + + long endTime = System.currentTimeMillis(); + double executionTime = (endTime - startTime) / 1000.0; + System.out.println(" number chk Execution time: " + executionTime + " seconds"); + + startTime = System.currentTimeMillis(); + System.out.println("addrListVO.size() : "+ addrListVO.size()); + + if(addrListVO.size() > 0) { + // 등록 + addrDAO.insertAddrList(addrListVO); + + } + + endTime = System.currentTimeMillis(); + executionTime = (endTime - startTime) / 1000.0; + System.out.println("INSERT Execution time: " + executionTime + " seconds"); + + + // 중복체크 dupliCnt + + + + // + String message = "저장에 성공했습니다.\n저장 : " + addrListVO.size() + "건" +// +", 중복 : " + invalid.dupliCnt + "건" + +", INERT 총 시간 : " + executionTime+ "초" + +", 휴대폰번호 오류 : " + invalid.get() + "건"; + + return new StatusResponse( + HttpStatus.OK + , message +// , "" + , LocalDateTime.now()); + } + + public static boolean isValidPhoneNumber(String phoneNo) { + if (phoneNo == null || phoneNo.isEmpty()) { + return false; + } + Matcher matcher = PHONE_PATTERN.matcher(phoneNo); + return matcher.matches(); + } + + + public static void trimFieldsBytes(AddrVO addr) { + addr.setAddrInfo1(trimToBytes(addr.getAddrInfo1(), 20)); + addr.setAddrInfo2(trimToBytes(addr.getAddrInfo2(), 20)); + addr.setAddrInfo3(trimToBytes(addr.getAddrInfo3(), 20)); + addr.setAddrInfo4(trimToBytes(addr.getAddrInfo4(), 20)); + addr.setAddrComment(trimToBytes(addr.getAddrComment(), 250)); + addr.setAddrNm(trimToBytes(addr.getAddrNm(), 20)); + } + + // maxBytes만큼 글자수 처리해서 리턴 + public static String trimToBytes(String str, int maxBytes) { + if (str == null) { + return null; + } + byte[] bytes = str.getBytes(EUC_KR); + if (bytes.length <= maxBytes) { + return str; + } + int len = maxBytes; + while (len > 0 && bytes[len - 1] < 0) { + len--; // 바이트 배열을 maxBytes로 자를 때, 잘못된 분할을 피하기 위해 문자 경계 확인 + } + return new String(bytes, 0, len, EUC_KR); + } } diff --git a/src/main/java/itn/let/mjo/addr/web/AddrRestController.java b/src/main/java/itn/let/mjo/addr/web/AddrRestController.java index 84881bce..629f9949 100644 --- a/src/main/java/itn/let/mjo/addr/web/AddrRestController.java +++ b/src/main/java/itn/let/mjo/addr/web/AddrRestController.java @@ -1,26 +1,25 @@ package itn.let.mjo.addr.web; +import java.nio.charset.Charset; import java.time.LocalDateTime; -import java.util.ArrayList; import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import javax.annotation.Resource; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.ui.ModelMap; -import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.support.RedirectAttributes; import egovframework.rte.fdl.security.userdetails.util.EgovUserDetailsHelper; import itn.com.cmm.EgovMessageSource; import itn.com.cmm.LoginVO; import itn.com.utl.fcc.service.EgovStringUtil; -import itn.let.fax.admin.service.FaxStatVO; import itn.let.mail.service.StatusResponse; import itn.let.mjo.addr.service.AddrGroupService; import itn.let.mjo.addr.service.AddrGroupVO; @@ -63,55 +62,31 @@ public class AddrRestController { * 주소록 대량등록 저장 * @param searchVO * @param model - * @return "/web/mjon/addr/addrMassInsertByTempAjax.do" + * @return "/web/mjon/addr/addrMassInsertByTempAjax_advc.do" * @throws Exception */ @RequestMapping(value= {"/web/mjon/addr/addrMassInsertByTempAjax_advc.do"}) - public ResponseEntity addrMassInsertByTempAjax(@RequestBody List addrListVO, - RedirectAttributes redirectAttributes, - ModelMap model) throws Exception{ + public ResponseEntity addrMassInsertByTempAjax_advc(@RequestBody List addrListVO + ,ModelMap model) throws Exception{ - System.out.println("??"); - System.out.println("?? " + addrListVO.get(0).toString()); - return ResponseEntity.ok().body(new StatusResponse(HttpStatus.OK, "", LocalDateTime.now())); + LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null; + String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId()); + + if(userId.equals("")) { + return ResponseEntity.ok( + new StatusResponse(HttpStatus.UNAUTHORIZED + , "로그인을 하셔야 이용 가능합니다." + , LocalDateTime.now() + ) + ); + } + + return ResponseEntity.ok().body(addrService.addrMassInsertByTempAjax_advc(addrListVO, userId)); } - /* 바이트 자르기 - UTF-8일 경우 - subStringBytes("블라블라블라라", 10, 3); - EUC-KR일 경우 - subStringBytes("블라블라블라라", 10, 2); - */ - public String subStringBytes(String str, int byteLength, int sizePerLetter) { - int retLength = 0; - int tempSize = 0; - int asc; - if (str == null || "".equals(str) || "null".equals(str)) { - str = ""; - } - - int length = str.length(); - - for (int i = 1; i <= length; i++) { - asc = (int) str.charAt(i - 1); - if (asc > 127) { - if (byteLength >= tempSize + sizePerLetter) { - tempSize += sizePerLetter; - retLength++; - } - } else { - if (byteLength > tempSize) { - tempSize++; - retLength++; - } - } - } - - return str.substring(0, retLength); - } - + // } \ No newline at end of file diff --git a/src/main/resources/egovframework/sqlmap/let/mjo/addr/Addr_SQL_Mysql.xml b/src/main/resources/egovframework/sqlmap/let/mjo/addr/Addr_SQL_Mysql.xml index d68553a3..4e048d72 100644 --- a/src/main/resources/egovframework/sqlmap/let/mjo/addr/Addr_SQL_Mysql.xml +++ b/src/main/resources/egovframework/sqlmap/let/mjo/addr/Addr_SQL_Mysql.xml @@ -775,7 +775,7 @@ - + /* AddrDAO.insertAddrList */ INSERT INTO MJ_ADDR ( MBER_ID, @@ -790,9 +790,9 @@ BOOKMARK, ADDR_COMMENT, FRST_REGISTER_ID - )VALUES - - ( + ) + + ( #[].mberId#, #[].addrGrpId#, #[].addrNm#, @@ -805,8 +805,8 @@ #[].bookmark#, #[].addrComment#, #[].frstRegisterId# - ) - + ) + diff --git a/src/main/webapp/WEB-INF/jsp/web/addr/AddrList.jsp b/src/main/webapp/WEB-INF/jsp/web/addr/AddrList.jsp index 6e258f84..a55bb96d 100644 --- a/src/main/webapp/WEB-INF/jsp/web/addr/AddrList.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/addr/AddrList.jsp @@ -4,11 +4,15 @@ <%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> + + - + @@ -782,19 +879,19 @@ function fn_tabToggle(tabNum){
  • -
  • +
-
+
<%@include file="/WEB-INF/jsp/web/addr/include/addrListforExcel.jsp" %>
-