이호영 이호영 2024-12-06
문자 개별단가별 그룹화하여 분리 발송
@eecd562d5ecc10a15624b5b905b128a97482fb27
src/main/java/itn/com/cmm/MjonMsgSendVO.java
--- src/main/java/itn/com/cmm/MjonMsgSendVO.java
+++ src/main/java/itn/com/cmm/MjonMsgSendVO.java
@@ -110,6 +110,13 @@
 
 
 	/**
+	 * @description : event 여부 / group tb에 넣는 용도
+	 */
+	private String 	eventYn;
+	
+	
+	
+	/**
 	 * @description : 개별단가
 	 */
 	private String 	eachPrice;
src/main/java/itn/com/cmm/util/MsgSendUtils.java
--- src/main/java/itn/com/cmm/util/MsgSendUtils.java
+++ src/main/java/itn/com/cmm/util/MsgSendUtils.java
@@ -203,7 +203,7 @@
 	 */
 	public static Boolean populateSendLists(MjonMsgVO mjonMsgVO, List<MjonMsgSendVO> mjonMsgSendListVO
 			, StatusResponse statusResponse, List<String> resultSpamTxt
-			, Map<String, Integer> agentSendCounts, List<MjonMsgVO> sendRateList, String nextMsgGroupId) throws Exception{
+			, Map<String, Integer> agentSendCounts, List<MjonMsgVO> sendRateList) throws Exception{
 		
 		log.info(" :: populateSendLists :: ");
 		
@@ -380,8 +380,6 @@
 					? MsgSendUtils.assignAgentBasedOnCount(agentSendCounts, sendRateList)
 					: mjonMsgVO.getAgentCode();
 			sendVO.setAgentCode(agentCode);
-			
-			sendVO.setMsgGroupId(nextMsgGroupId);
 			
 		}
 		// Group TB에 넣어줄 제목
@@ -612,7 +610,6 @@
 			// 각 가격을 합산
 			totalPrice += Float.parseFloat(eachPrice);
 		}
-		mjonMsgVO.setTotPrice(String.valueOf(totalPrice));
 
 		
 	}
@@ -724,6 +721,7 @@
 			if (sum + floatEachPrice <= targetCash) {
 				sum += floatEachPrice;
 				msg.setEachPrice(eachPrice);
+				msg.setEventYn("Y");
 				optimalList.add(msg);
 				iterator.remove();
 			} else {
src/main/java/itn/let/mjo/mjocommon/MjonCommon.java
--- src/main/java/itn/let/mjo/mjocommon/MjonCommon.java
+++ src/main/java/itn/let/mjo/mjocommon/MjonCommon.java
@@ -588,6 +588,7 @@
 			if (eventMberInfo == null || "E".equals(eventMberInfo.getEventStatus())) {
 				return statusResponse; // 이벤트 상태가 종료인 경우 처리하지 않음
 			}
+			log.info(" + 이벤트 진행 대상자 :: [{}]", userId);
 
 			// 최적화된 메시지 리스트 및 이벤트 정보 가져오기
 			OptimalMsgResultDTO result = MsgSendUtils.getOptimalMsgList(eventMberInfo, mjonMsgSendVOList);
src/main/java/itn/let/mjo/msgdata/service/impl/MjonMsgDataServiceImpl.java
--- src/main/java/itn/let/mjo/msgdata/service/impl/MjonMsgDataServiceImpl.java
+++ src/main/java/itn/let/mjo/msgdata/service/impl/MjonMsgDataServiceImpl.java
@@ -12,6 +12,7 @@
 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 @@
 		
 		// 스팸관련 키워드 select
 		List<String> resultSpamTxt = mjonMsgDataService.selectSpamKeywordList();
-		// msgGroupId 생성
-		String nextMsgGroupId = idgenMjonMsgGroupId.getNextStringId();
-		
 
 		/** 
 		 * @methodName	: populateReplacementLists 
@@ -4125,7 +4123,7 @@
 		 * 				7. 전송사 코드 셋팅
 		 */
 		if(!MsgSendUtils.populateSendLists(mjonMsgVO, mjonMsgSendVOList, statusResponse, resultSpamTxt
-				, agentSendCounts, sendRateList, nextMsgGroupId)) {;
+				, agentSendCounts, sendRateList)) {;
 			//문자 치환 후 전송 문자 길이를 초과하였습니다.
 			//문자 치환 중 오류가 발생하였습니다.
 			return statusResponse;
@@ -4161,15 +4159,11 @@
 		 */		
 		// 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 @@
 //		log.info("mj_msg_data insert start [{}]", mjonMsgSendVOList.size());
 		// 합산 금액을 String으로 변환하여 설정
 		
+
+		
+		
+		// Step 1: 메시지를 가격별로 그룹화
+		Map<String, List<MjonMsgSendVO>> priceGroupedMessages = mjonMsgSendVOList.stream()
+			.collect(Collectors.groupingBy(MjonMsgSendVO::getEachPrice));
+		
+		int instTotalCnt = 0;
+		// Step 2: 그룹화 된 데이터를 그룹별로 insert 처리
+		for (Map.Entry<String, List<MjonMsgSendVO>> entry : priceGroupedMessages.entrySet()) {
+			String price = entry.getKey(); // 가격 (String)
+			List<MjonMsgSendVO> 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 @@
 		// 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 @@
 
 	}
 	
-    private void insertMsgGroupDataTb_advc(MjonMsgVO mjonMsgVO, MjonMsgSendVO mjonMsgSendVO) throws Exception {
+    private void insertMsgGroupDataTb_advc(int instCnt, MjonMsgVO mjonMsgVO, List<MjonMsgSendVO> 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()));
src/main/webapp/WEB-INF/jsp/web/msgdata/MsgDataSMLView.jsp
--- src/main/webapp/WEB-INF/jsp/web/msgdata/MsgDataSMLView.jsp
+++ src/main/webapp/WEB-INF/jsp/web/msgdata/MsgDataSMLView.jsp
@@ -2182,16 +2182,12 @@
 	$('.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 @@
 		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);
 		
Add a comment
List