From d6bed63fec0236e78b6d21a9f1f81913f2872919 Mon Sep 17 00:00:00 2001 From: "hehihoho3@gmail.com" Date: Thu, 6 Feb 2025 11:56:54 +0900 Subject: [PATCH] =?UTF-8?q?=EB=B0=9C=EC=86=A1=EA=B2=B0=EA=B3=BC=20?= =?UTF-8?q?=EC=A2=85=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../itn/let/mjo/addr/service/AddrService.java | 4 + .../let/mjo/addr/service/impl/AddrDAO.java | 4 + .../addr/service/impl/AddrServiceImpl.java | 55 ++ .../itn/let/mjo/addr/web/AddrController.java | 50 ++ .../msgdata/web/MjonMsgDataController.java | 4 +- .../msgsent/service/MjonMsgDetailSentVO.java | 1 + .../msgsent/service/impl/MjonMsgSentDAO.java | 4 + .../service/impl/MjonMsgSentServiceImpl.java | 84 ++- .../sqlmap/let/mjo/addr/Addr_SQL_Mysql.xml | 15 +- .../sqlmap/let/msg/MjonMsgData_SQL_mysql.xml | 3 + .../sqlmap/let/msg/MjonMsgSent_SQL_mysql.xml | 8 + .../jsp/web/msgsent/MsgSentDetailView.jsp | 522 +++++++++++++----- .../WEB-INF/jsp/web/msgsent/MsgSentView.jsp | 1 + 13 files changed, 599 insertions(+), 156 deletions(-) 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 ea1179a2..ad8f1b03 100644 --- a/src/main/java/itn/let/mjo/addr/service/AddrService.java +++ b/src/main/java/itn/let/mjo/addr/service/AddrService.java @@ -109,4 +109,8 @@ public interface AddrService { void deleteAddr_advc(AddrGroupVO addrGroupVO) throws Exception; int getAddrCount(AddrGroupVO addrGroupVO) throws Exception; + + StatusResponse insertByAddrGrpDataAndAddrDataAjax(AddrVO addrVO) throws Exception; + + StatusResponse deleteAddrNoDataAjax(AddrVO addrVO) throws Exception; } diff --git a/src/main/java/itn/let/mjo/addr/service/impl/AddrDAO.java b/src/main/java/itn/let/mjo/addr/service/impl/AddrDAO.java index 7e5a1bd2..d3be405f 100644 --- a/src/main/java/itn/let/mjo/addr/service/impl/AddrDAO.java +++ b/src/main/java/itn/let/mjo/addr/service/impl/AddrDAO.java @@ -292,5 +292,9 @@ public class AddrDAO extends EgovAbstractDAO { return (Integer)select("AddrDAO.getAddrCount", addrVO); } + public int deleteAddrPhoneNo(AddrVO addrVO) { + return update("AddrDAO.deleteAddrPhoneNo", addrVO); + } + } 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 f1437a01..777fa0a8 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 @@ -34,6 +34,8 @@ import itn.let.mjo.addr.service.AddrGroupVO; import itn.let.mjo.addr.service.AddrService; import itn.let.mjo.addr.service.AddrTransHistVO; import itn.let.mjo.addr.service.AddrVO; +import itn.let.mjo.msgsent.service.MjonMsgSentVO; +import lombok.extern.slf4j.Slf4j; /** * 주소록 관리를 위한 서비스 구현 클래스 @@ -49,6 +51,7 @@ import itn.let.mjo.addr.service.AddrVO; * 2021.04.08 ITN 최초 생성 * */ +@Slf4j @Service("AddrService") public class AddrServiceImpl extends EgovAbstractServiceImpl implements AddrService { @@ -644,5 +647,57 @@ public class AddrServiceImpl extends EgovAbstractServiceImpl implements AddrSer return aa; } + + @Override + public StatusResponse insertByAddrGrpDataAndAddrDataAjax(AddrVO addrVO) throws Exception { + + String userId = addrVO.getMberId(); + + AddrGroupVO addrGroupVO = new AddrGroupVO(); + addrGroupVO.setAddrGrpNm(addrVO.getAddrGrpNm()); + addrGroupVO.setMberId(userId); + addrGroupVO.setFrstRegisterId(userId); + + int usedCnt = addrGroupDAO.selectDuplAddrGroupCnt(addrGroupVO); + if(usedCnt > 0) { + return new StatusResponse(HttpStatus.BAD_REQUEST, "이미 등록되어있는 그룹이름입니다.", LocalDateTime.now()); + } + + String addrGrpId = addrGroupDAO.insertAddrGroup(addrGroupVO); + + + + List addrDataInfo = new ArrayList(); + + for(String phone : addrVO.getAddrPhones()) { + AddrVO addrTempVO = new AddrVO(); + addrTempVO.setAddrPhoneNo(phone); + addrTempVO.setAddrGrpId(addrGrpId); + addrTempVO.setBookmark("N"); //북마크 : N + addrTempVO.setFrstRegisterId(userId); + addrTempVO.setMberId(userId); + addrDataInfo.add(addrTempVO); + } + + int resultCnt = addrDAO.insertAddrList(addrDataInfo); + + + + return new StatusResponse(HttpStatus.OK, "총" + resultCnt + "건의 주소록 등록이 완료되었습니다.", addrVO); + + } + + @Override + public StatusResponse deleteAddrNoDataAjax(AddrVO addrVO) throws Exception { + +// AddrPhones + //아이디 저장 + + //주소록 디비에서 연락처 정보를 delete 시킴 + int resultCnt = addrDAO.deleteAddrPhoneNo(addrVO); + + + return new StatusResponse(HttpStatus.OK, "총 " + resultCnt + "건의 주소록을 삭제하였습니다.", addrVO); + } } diff --git a/src/main/java/itn/let/mjo/addr/web/AddrController.java b/src/main/java/itn/let/mjo/addr/web/AddrController.java index 2f04ae77..2e0f2ef9 100644 --- a/src/main/java/itn/let/mjo/addr/web/AddrController.java +++ b/src/main/java/itn/let/mjo/addr/web/AddrController.java @@ -4,6 +4,7 @@ import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.OutputStream; import java.text.SimpleDateFormat; +import java.time.LocalDateTime; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; @@ -31,10 +32,13 @@ import org.apache.poi.xssf.usermodel.XSSFCell; import org.apache.poi.xssf.usermodel.XSSFRow; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; 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.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; @@ -52,12 +56,14 @@ import itn.com.cmm.util.RedirectUrlMaker; import itn.com.cmm.util.StringUtil; import itn.com.utl.fcc.service.EgovStringUtil; import itn.let.fax.addr.service.FaxAddrVO; +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; import itn.let.mjo.addr.service.AddrTransHistVO; import itn.let.mjo.addr.service.AddrVO; import itn.let.mjo.msgdata.service.PhoneVO; +import lombok.extern.slf4j.Slf4j; /** * 주소록 관한 controller 클래스를 정의한다. @@ -75,6 +81,7 @@ import itn.let.mjo.msgdata.service.PhoneVO; * * */ +@Slf4j @Controller public class AddrController { @@ -2223,6 +2230,49 @@ public class AddrController { return modelAndView; } + + @RequestMapping(value = {"/web/mjon/addr/insertByAddrGrpDataAndAddrDataAjax.do"}) + public ResponseEntity insertByAddrGrpDataAndAddrDataAjax(@RequestBody AddrVO addrVO) throws Exception { + + ModelAndView modelAndView = new ModelAndView(); + modelAndView.setViewName("jsonView"); + + //로그인 권한정보 불러오기 + LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null; + String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId()); + + if(userId == null) { + if(StringUtils.isEmpty(userId)) return ResponseEntity.ok().body(new StatusResponse(HttpStatus.BAD_REQUEST, "로그인 후 이용해 주세요", LocalDateTime.now())); + } + + log.info(" + addrVO.getAddrPhones() :: [{}]", addrVO.getAddrPhones().length); + log.info(" + addrVO.getAddrGrpNm() :: [{}]", addrVO.getAddrGrpNm()); + addrVO.setMberId(userId); + + + return ResponseEntity.ok().body(addrService.insertByAddrGrpDataAndAddrDataAjax(addrVO)); + } + + @RequestMapping(value = {"/web/mjon/addr/deleteAddrNoDataAjax.do"}) + public ResponseEntity deleteAddrNoDataAjax(@RequestBody AddrVO addrVO) throws Exception { + + ModelAndView modelAndView = new ModelAndView(); + modelAndView.setViewName("jsonView"); + + //로그인 권한정보 불러오기 + LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null; + String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId()); + + if(userId == null) { + if(StringUtils.isEmpty(userId)) return ResponseEntity.ok().body(new StatusResponse(HttpStatus.BAD_REQUEST, "로그인 후 이용해 주세요", LocalDateTime.now())); + } + + addrVO.setMberId(userId); + + return ResponseEntity.ok().body(addrService.deleteAddrNoDataAjax(addrVO)); + } + + public boolean getNameRepLenChk(String type, String value) { diff --git a/src/main/java/itn/let/mjo/msgdata/web/MjonMsgDataController.java b/src/main/java/itn/let/mjo/msgdata/web/MjonMsgDataController.java index 79b24d41..77e3c526 100644 --- a/src/main/java/itn/let/mjo/msgdata/web/MjonMsgDataController.java +++ b/src/main/java/itn/let/mjo/msgdata/web/MjonMsgDataController.java @@ -114,8 +114,9 @@ import itn.let.uss.umt.service.EgovUserManageService; import itn.let.uss.umt.service.MberManageVO; import itn.let.uss.umt.service.UserManageVO; import itn.let.utl.sim.service.EgovClntInfo; +import lombok.extern.slf4j.Slf4j; - +@Slf4j @Controller public class MjonMsgDataController { @@ -816,6 +817,7 @@ public class MjonMsgDataController { mjonMsgDataVO.setMsgSeqList(tempList); + log.info("==================================================="); List resultList = mjonMsgDataService.selectReSendMsgDataList(mjonMsgDataVO); //문자발송 이미지 처리 - 사용하지 않아서 주석처리함. diff --git a/src/main/java/itn/let/mjo/msgsent/service/MjonMsgDetailSentVO.java b/src/main/java/itn/let/mjo/msgsent/service/MjonMsgDetailSentVO.java index 3bad5431..8e1a53ac 100644 --- a/src/main/java/itn/let/mjo/msgsent/service/MjonMsgDetailSentVO.java +++ b/src/main/java/itn/let/mjo/msgsent/service/MjonMsgDetailSentVO.java @@ -53,6 +53,7 @@ public class MjonMsgDetailSentVO extends UserDefaultVO{ private String statusCd; // 진행상태 코드 private String divideYN; + private String divideText; private int diffMin; private String totPrice; diff --git a/src/main/java/itn/let/mjo/msgsent/service/impl/MjonMsgSentDAO.java b/src/main/java/itn/let/mjo/msgsent/service/impl/MjonMsgSentDAO.java index 724d74d0..7e1e84ae 100644 --- a/src/main/java/itn/let/mjo/msgsent/service/impl/MjonMsgSentDAO.java +++ b/src/main/java/itn/let/mjo/msgsent/service/impl/MjonMsgSentDAO.java @@ -186,5 +186,9 @@ public class MjonMsgSentDAO extends EgovAbstractDAO { return (List) list("MjonMsgSentDAO.findByMsgDetailListAjax", mjonMsgDetailSentVO); } + + public List findByReqDateWhereMsgGroupId(String msgGroupId) { + return (List) list("MjonMsgSentDAO.findByReqDateWhereMsgGroupId", msgGroupId); + } } diff --git a/src/main/java/itn/let/mjo/msgsent/service/impl/MjonMsgSentServiceImpl.java b/src/main/java/itn/let/mjo/msgsent/service/impl/MjonMsgSentServiceImpl.java index 9e044cfe..bbc5f3f1 100644 --- a/src/main/java/itn/let/mjo/msgsent/service/impl/MjonMsgSentServiceImpl.java +++ b/src/main/java/itn/let/mjo/msgsent/service/impl/MjonMsgSentServiceImpl.java @@ -4,9 +4,12 @@ import java.io.OutputStream; import java.math.BigDecimal; import java.math.RoundingMode; import java.text.SimpleDateFormat; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.List; import java.util.Locale; import java.util.Map; @@ -126,13 +129,21 @@ public class MjonMsgSentServiceImpl extends EgovAbstractServiceImpl implements Map resultMap = new HashMap(); - System.out.println("mjonMsgSentVO.getSearchConditionSite() :: "+ mjonMsgSentVO.getSearchConditionSite()); // 목록 List resultList = mjonMsgSentDAO.selectAllMsgSentList_advc(mjonMsgSentVO); + // 내용이 없고 이미지만 있을 경우 + resultList.stream().forEach(t->{ + log.info("+ t.getMsgKind() : [{}]",t.getMsgType()); + if("6".equals(t.getMsgType()) + && StringUtils.isEmpty(t.getSmsTxt()) + && !"0".equals(t.getFileCnt()) + ) { + t.setSmsTxt("이미지"); + } + }); + // groupID에 대한 결과건수(대기, 성공 실패) 분할건수를 가져옴 - // TODO : 분할여부는 예약일 때만 가져오게 해야되는지 검토 필요 - resultList = makeDetailFunction(resultList); /* @@ -169,8 +180,8 @@ public class MjonMsgSentServiceImpl extends EgovAbstractServiceImpl implements resultVO.setResultSValue(updatedVO.getResultSValue()); // 성공건수 resultVO.setResultWValue(updatedVO.getResultWValue()); // 대기건수 resultVO.setResultFValue(updatedVO.getResultFValue()); // 실패건수 - resultVO.setTotPrice(updatedVO.getTotPrice()); - resultVO.setDivideYN(updatedVO.getDivideYN()); + resultVO.setTotPrice(updatedVO.getTotPrice()); // 총 발송 금액 (성공건수 * 개별금액) + resultVO.setDivideYN(updatedVO.getDivideYN()); // 분할 여부 // 퍼센트 계산 실행 @@ -182,21 +193,21 @@ public class MjonMsgSentServiceImpl extends EgovAbstractServiceImpl implements // 진행상태 코드화 String statusCode = getStatusCode(MjonMsgSentVO.builder() - .reserveCYn(resultVO.getReserveCYn()) - .reserveYn(resultVO.getReserveYn()) - .msgGroupCnt(resultVO.getMsgGroupCnt()) - .resultSValue(resultVO.getResultSValue()) - .resultWValue(resultVO.getResultWValue()) - .resultFValue(resultVO.getResultFValue()) - .diffMin(resultVO.getDiffMin()) - .build()); - log.info(" ++ statusCode :: [{}]" ,statusCode); + .reserveCYn(resultVO.getReserveCYn()) + .reserveYn(resultVO.getReserveYn()) + .msgGroupCnt(resultVO.getMsgGroupCnt()) + .resultSValue(resultVO.getResultSValue()) + .resultWValue(resultVO.getResultWValue()) + .resultFValue(resultVO.getResultFValue()) + .diffMin(resultVO.getDiffMin()) + .build()); + resultVO.setStatusCd(statusCode); // 결과 출력 - System.out.println("성공률: " + returnMap.get("successPct")); - System.out.println("대기율: " + returnMap.get("waitingPct")); - System.out.println("실패율: " + returnMap.get("failedPct")); +// log.info("성공률: [{}]", returnMap.get("successPct")); +// log.info("대기율: [{}]", returnMap.get("waitingPct")); +// log.info("실패율: [{}]", returnMap.get("failedPct")); // 광고일떄 (광고)와 줄바꿈+무료거부 0808800858 삭제 @@ -205,13 +216,19 @@ public class MjonMsgSentServiceImpl extends EgovAbstractServiceImpl implements .replaceAll("\\s*무료거부 0808800858", "")); } + // 그림문자일 경우 그림정보 가져오기 if(StringUtils.isNotEmpty(resultVO.getFileCnt()) && Integer.parseInt(resultVO.getFileCnt()) > 0) { - List fileInfos = getFileInfo(resultVO); resultVO.setFileInfos(fileInfos); } + // 분할문자인 경우 + if("Y".equals(resultVO.getDivideYN())) { + String divideText = calculateBatchInfo(resultVO); + resultVO.setDivideText(divideText); + } + @@ -221,6 +238,37 @@ public class MjonMsgSentServiceImpl extends EgovAbstractServiceImpl implements } + private String calculateBatchInfo(MjonMsgDetailSentVO resultVO) { + + String msgGroupId = resultVO.getMsgGroupId(); + + + List requestTimes = mjonMsgSentDAO.findByReqDateWhereMsgGroupId(msgGroupId); + + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.S"); + Map timeCountMap = new LinkedHashMap<>(); + + // REQ_DATE 그룹화 (같은 시간대 몇 건인지) + for (String timeStr : requestTimes) { + LocalDateTime time = LocalDateTime.parse(timeStr, formatter); + timeCountMap.put(time, timeCountMap.getOrDefault(time, 0) + 1); + } + + // 가장 첫 번째 시간 & 간격 계산 + List sortedKeys = new ArrayList<>(timeCountMap.keySet()); + if (sortedKeys.size() < 2) { + return "데이터 부족 (분석 불가)"; + } + + int batchSize = timeCountMap.get(sortedKeys.get(0)); // 한 번에 보낸 건수 + int intervalMinutes = sortedKeys.get(1).getMinute() - sortedKeys.get(0).getMinute(); // 시간 간격 계산 +// int batchCount = sortedKeys.size(); // 총 몇 번 보냈는지 + +// return String.format("%,d건씩 %d분 간격 (%d회 발송)", batchSize, intervalMinutes, batchCount); + return String.format("%,d건씩 %d분 간격", batchSize, intervalMinutes); + + } + private List getFileInfo(MjonMsgDetailSentVO result) throws Exception { 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 b43a863a..a20ea414 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 @@ -933,7 +933,7 @@ - + /* AddrDAO.insertAddrList */ INSERT INTO MJ_ADDR ( @@ -967,7 +967,18 @@ ) - + + + + + DELETE FROM MJ_ADDR + + WHERE MBER_ID = #mberId# + + #addrPhones[]# + + + + /* MjonMsgDataDAO.selectReSendMsgDataList */ + SELECT MSG_ID AS msgId, USER_ID AS userId, USERDATA AS msgSeq, @@ -7936,6 +7938,7 @@ + + + - + + + + +
@@ -421,7 +648,8 @@ function fnMjMsgReSendAll(msgGroupId
- 100,000건35분 간격 + ${result.divideText } +
@@ -562,7 +790,7 @@ function fnMjMsgReSendAll(msgGroupId

(광고)

-

+

무료 거부 080-0000-0000

@@ -596,31 +824,28 @@ function fnMjMsgReSendAll(msgGroupId