From eecd562d5ecc10a15624b5b905b128a97482fb27 Mon Sep 17 00:00:00 2001 From: "hehihoho3@gmail.com" Date: Fri, 6 Dec 2024 15:52:20 +0900 Subject: [PATCH] =?UTF-8?q?=EB=AC=B8=EC=9E=90=20=EA=B0=9C=EB=B3=84?= =?UTF-8?q?=EB=8B=A8=EA=B0=80=EB=B3=84=20=EA=B7=B8=EB=A3=B9=ED=99=94?= =?UTF-8?q?=ED=95=98=EC=97=AC=20=EB=B6=84=EB=A6=AC=20=EB=B0=9C=EC=86=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/itn/com/cmm/MjonMsgSendVO.java | 7 ++ .../java/itn/com/cmm/util/MsgSendUtils.java | 6 +- .../itn/let/mjo/mjocommon/MjonCommon.java | 1 + .../service/impl/MjonMsgDataServiceImpl.java | 118 ++++++++++++------ .../jsp/web/msgdata/MsgDataSMLView.jsp | 8 +- 5 files changed, 95 insertions(+), 45 deletions(-) diff --git a/src/main/java/itn/com/cmm/MjonMsgSendVO.java b/src/main/java/itn/com/cmm/MjonMsgSendVO.java index 0dd70470..4ab7ce04 100644 --- a/src/main/java/itn/com/cmm/MjonMsgSendVO.java +++ b/src/main/java/itn/com/cmm/MjonMsgSendVO.java @@ -109,6 +109,13 @@ public class MjonMsgSendVO{ + /** + * @description : event 여부 / group tb에 넣는 용도 + */ + private String eventYn; + + + /** * @description : 개별단가 */ diff --git a/src/main/java/itn/com/cmm/util/MsgSendUtils.java b/src/main/java/itn/com/cmm/util/MsgSendUtils.java index 88ff9352..db0fff70 100644 --- a/src/main/java/itn/com/cmm/util/MsgSendUtils.java +++ b/src/main/java/itn/com/cmm/util/MsgSendUtils.java @@ -203,7 +203,7 @@ public final class MsgSendUtils { */ public static Boolean populateSendLists(MjonMsgVO mjonMsgVO, List mjonMsgSendListVO , StatusResponse statusResponse, List resultSpamTxt - , Map agentSendCounts, List sendRateList, String nextMsgGroupId) throws Exception{ + , Map agentSendCounts, List sendRateList) throws Exception{ log.info(" :: populateSendLists :: "); @@ -381,8 +381,6 @@ public final class MsgSendUtils { : mjonMsgVO.getAgentCode(); sendVO.setAgentCode(agentCode); - sendVO.setMsgGroupId(nextMsgGroupId); - } // Group TB에 넣어줄 제목 // 치환안된 sms 데이터로 넣어야함 @@ -612,7 +610,6 @@ public final class MsgSendUtils { // 각 가격을 합산 totalPrice += Float.parseFloat(eachPrice); } - mjonMsgVO.setTotPrice(String.valueOf(totalPrice)); } @@ -724,6 +721,7 @@ public final class MsgSendUtils { if (sum + floatEachPrice <= targetCash) { sum += floatEachPrice; msg.setEachPrice(eachPrice); + msg.setEventYn("Y"); optimalList.add(msg); iterator.remove(); } else { diff --git a/src/main/java/itn/let/mjo/mjocommon/MjonCommon.java b/src/main/java/itn/let/mjo/mjocommon/MjonCommon.java index a78c727b..0d05c391 100644 --- a/src/main/java/itn/let/mjo/mjocommon/MjonCommon.java +++ b/src/main/java/itn/let/mjo/mjocommon/MjonCommon.java @@ -588,6 +588,7 @@ private int parseIntOrDefault(String value, int defaultValue) { if (eventMberInfo == null || "E".equals(eventMberInfo.getEventStatus())) { return statusResponse; // 이벤트 상태가 종료인 경우 처리하지 않음 } + log.info(" + 이벤트 진행 대상자 :: [{}]", userId); // 최적화된 메시지 리스트 및 이벤트 정보 가져오기 OptimalMsgResultDTO result = MsgSendUtils.getOptimalMsgList(eventMberInfo, mjonMsgSendVOList); diff --git a/src/main/java/itn/let/mjo/msgdata/service/impl/MjonMsgDataServiceImpl.java b/src/main/java/itn/let/mjo/msgdata/service/impl/MjonMsgDataServiceImpl.java index 1acaf11d..96260e32 100644 --- a/src/main/java/itn/let/mjo/msgdata/service/impl/MjonMsgDataServiceImpl.java +++ b/src/main/java/itn/let/mjo/msgdata/service/impl/MjonMsgDataServiceImpl.java @@ -12,6 +12,7 @@ import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; @@ -4107,9 +4108,6 @@ public class MjonMsgDataServiceImpl extends EgovAbstractServiceImpl implements M // 스팸관련 키워드 select List resultSpamTxt = mjonMsgDataService.selectSpamKeywordList(); - // msgGroupId 생성 - String nextMsgGroupId = idgenMjonMsgGroupId.getNextStringId(); - /** * @methodName : populateReplacementLists @@ -4125,7 +4123,7 @@ public class MjonMsgDataServiceImpl extends EgovAbstractServiceImpl implements M * 7. 전송사 코드 셋팅 */ if(!MsgSendUtils.populateSendLists(mjonMsgVO, mjonMsgSendVOList, statusResponse, resultSpamTxt - , agentSendCounts, sendRateList, nextMsgGroupId)) {; + , agentSendCounts, sendRateList)) {; //문자 치환 후 전송 문자 길이를 초과하였습니다. //문자 치환 중 오류가 발생하였습니다. return statusResponse; @@ -4161,15 +4159,11 @@ public class MjonMsgDataServiceImpl extends EgovAbstractServiceImpl implements M */ // mjonCommon 호출 statusResponse = mjonCommon.processEventMessages(userId, mjonMsgVO, mjonMsgSendVOList); - if (statusResponse.getStatus() != null && !statusResponse.getStatus().equals(HttpStatus.OK)) { log.error("이벤트 처리 중 오류 발생: {}", statusResponse.getMessage()); return statusResponse; } - float totalPrice = MsgSendUtils.setPriceforVO(mjonMsgSendVOList); - mjonMsgVO.setTotPrice(String.valueOf(totalPrice)); - if (!isCashSufficient(mjonMsgVO)) { log.error("Insufficient balance for message sending."); @@ -4184,6 +4178,49 @@ public class MjonMsgDataServiceImpl extends EgovAbstractServiceImpl implements M // log.info("mj_msg_data insert start [{}]", mjonMsgSendVOList.size()); // 합산 금액을 String으로 변환하여 설정 + + + + // Step 1: 메시지를 가격별로 그룹화 + Map> priceGroupedMessages = mjonMsgSendVOList.stream() + .collect(Collectors.groupingBy(MjonMsgSendVO::getEachPrice)); + + int instTotalCnt = 0; + // Step 2: 그룹화 된 데이터를 그룹별로 insert 처리 + for (Map.Entry> entry : priceGroupedMessages.entrySet()) { + String price = entry.getKey(); // 가격 (String) + List groupedMsgList = entry.getValue(); // 해당 가격의 메시지 리스트 + + // msgGroupId 생성 + String nextMsgGroupId = idgenMjonMsgGroupId.getNextStringId(); + groupedMsgList.forEach(t -> t.setMsgGroupId(nextMsgGroupId)); + + // 발송 데이터 삽입 + int instCnt = this.insertMsgData_advc(groupedMsgList); + + if(instCnt > 0) { + instTotalCnt += instCnt; + this.insertMsgGroupDataTb_advc(instCnt, mjonMsgVO, groupedMsgList); + + // 금액 및 포인트 insert + priceAndPoint.insertCashAndPoint( + userId + , -Float.parseFloat(mjonMsgVO.getTotPrice()) + , "SMS 문자 총 " + groupedMsgList.size() + "건 중 " + instCnt + "건 발송" + , mjonMsgVO.getMsgGroupId() + ); + // spam 문자 저장 + handleSpamMsg_advc(mjonMsgVO, groupedMsgList.get(0)); + } + + // 수신거부 목록 업데이트 +// returnMap.put("resultSts", instCnt); + + log.debug("가격 [{}]의 총 갯수: [{}]", price, groupedMsgList.size()); + + } + + // 분할 최대건수가 되면 디비에 입력하기 // int instCnt = mjonMsgDataDAO.insertMsgDataInfo_advc(mjonMsgSendVOList); @@ -4192,34 +4229,31 @@ public class MjonMsgDataServiceImpl extends EgovAbstractServiceImpl implements M // Batch 시작 시간 측정 // 총 발송 건수 = DB insert // int instCnt = 0; - int instCnt = this.insertMsgData_advc(mjonMsgSendVOList); - - // Batch 종료 시간 측정 및 실행 시간 계산 +// int instCnt = this.insertMsgData_advc(mjonMsgSendVOList); // 수신거부 목록 - returnMap.put("resultSts", instCnt); - + returnMap.put("resultSts", instTotalCnt); log.debug("총 단가 합계: [{}]", mjonMsgVO.getTotPrice()); //TODO: group 테이블에 저장 - if(instCnt > 0) { - - // Group TB insert - mjonMsgVO.setMsgGroupCnt(Integer.toString(instCnt)); - this.insertMsgGroupDataTb_advc(mjonMsgVO, mjonMsgSendVOList.get(0)); - - // 금액 및 포인트 insert - priceAndPoint.insertCashAndPoint( - userId - , -Float.parseFloat(mjonMsgVO.getTotPrice()) - , "SMS 문자 총 " + mjonMsgVO.getMjonMsgSendVOList().size() + "건 중 " + instCnt + "건 발송" - , mjonMsgVO.getMsgGroupId() - ); - - // 스팸 데이터가 있으면 MJ_SPAM_MSG_GROUP_DATA 테이블에 insert - handleSpamMsg_advc(mjonMsgVO, mjonMsgSendVOList.get(0)); - - } - +// if(instCnt > 0) { +// +// // Group TB insert +// mjonMsgVO.setMsgGroupCnt(Integer.toString(instCnt)); +// this.insertMsgGroupDataTb_advc(mjonMsgVO, mjonMsgSendVOList.get(0)); +// +// // 금액 및 포인트 insert +// priceAndPoint.insertCashAndPoint( +// userId +// , -Float.parseFloat(mjonMsgVO.getTotPrice()) +// , "SMS 문자 총 " + mjonMsgVO.getMjonMsgSendVOList().size() + "건 중 " + instCnt + "건 발송" +// , mjonMsgVO.getMsgGroupId() +// ); +// +// // 스팸 데이터가 있으면 MJ_SPAM_MSG_GROUP_DATA 테이블에 insert +// handleSpamMsg_advc(mjonMsgVO, mjonMsgSendVOList.get(0)); +// +// } +// // 스팸 및 스미싱 의심이면 slack 알림 boolean isNotified = mjonCommon.processUserAndCheckSms(mjonMsgVO, userId); @@ -4248,10 +4282,24 @@ public class MjonMsgDataServiceImpl extends EgovAbstractServiceImpl implements M } - private void insertMsgGroupDataTb_advc(MjonMsgVO mjonMsgVO, MjonMsgSendVO mjonMsgSendVO) throws Exception { + private void insertMsgGroupDataTb_advc(int instCnt, MjonMsgVO mjonMsgVO, List mjonMsgSendVOList) throws Exception { - mjonMsgVO.setAgentCode(mjonMsgSendVO.getAgentCode());// 전송사 코드 번호를 셋팅해 준다. - // 지연 유무 코드가 Null 인경우 체크 + + // insert 총 데이터 + mjonMsgVO.setMsgGroupCnt(Integer.toString(instCnt)); + + // insert 총 금액 + float totalPrice = MsgSendUtils.setPriceforVO(mjonMsgSendVOList); + mjonMsgVO.setTotPrice(String.valueOf(totalPrice)); + + + MjonMsgSendVO mjonMsgSendVO = mjonMsgSendVOList.get(0); + + // 개별단가 + mjonMsgVO.setEachPrice(mjonMsgSendVO.getEachPrice()); + + // 전송사 코드 번호를 셋팅해 준다. + mjonMsgVO.setAgentCode(mjonMsgSendVO.getAgentCode()); mjonMsgVO.setBefCash(priceAndPoint.getBefCash(mjonMsgVO.getUserId())); mjonMsgVO.setBefPoint(priceAndPoint.getBefPoint(mjonMsgVO.getUserId())); diff --git a/src/main/webapp/WEB-INF/jsp/web/msgdata/MsgDataSMLView.jsp b/src/main/webapp/WEB-INF/jsp/web/msgdata/MsgDataSMLView.jsp index 4dc4b7ea..2debbe3c 100644 --- a/src/main/webapp/WEB-INF/jsp/web/msgdata/MsgDataSMLView.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/msgdata/MsgDataSMLView.jsp @@ -2182,16 +2182,12 @@ function fnByteString(contents){ $('.realtime').text(contents); // 2000byte 초과시 메세지 알림 -// console.log('conLeng : ', conLeng); if(conLeng > 2000){ var fullContents = adverYn != "N" ? adverTxt + denyTxt + contents : contents; var subUnderStr = strUnderLineSubstring(fullContents, 2000).replace(adverTxt, "").replace(denyTxt, ""); - - -// var subUnderStr = strUnderLineSubstring(adverTxt+denyTxt+contents, 2000); subUnderStr = subUnderStr.replace(adverTxt,"").replace(denyTxt, ""); - console.log('subUnderStr : ', subUnderStr) +// console.log('subUnderStr : ', subUnderStr) $('#smsTxtArea').val(subUnderStr); @@ -2199,7 +2195,7 @@ function fnByteString(contents){ var contentLeng = conByteLeng(subUnderStr); var totalLeng = adverYn != "N" ? contentLeng + adTxtLeng + denyTxtLeng : contentLeng; - console.log('contentLeng : ', totalLeng); +// console.log('contentLeng : ', totalLeng); $('#msgLeng').text(totalLeng + " / "); $('#smsLen').val(contentLeng);