이호영 이호영 2025-03-24
카톡발송진행중
@2bb22a522f5fe38a9e50fce62842e89724cb4fa4
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
@@ -630,7 +630,7 @@
 			// 각 가격을 합산
 			totalPrice += Float.parseFloat(eachPrice);
 		}
-
+		mjonMsgVO.setTotalPrice(totalPrice);
 		
 	}
 	
src/main/java/itn/let/kakao/kakaoComm/KakaoSendAdvcVO.java
--- src/main/java/itn/let/kakao/kakaoComm/KakaoSendAdvcVO.java
+++ src/main/java/itn/let/kakao/kakaoComm/KakaoSendAdvcVO.java
@@ -29,6 +29,7 @@
 	// Insert 데이터
 	private String msgId;				// 문자ID
 	private String msgGroupId;			// 전송그룹ID
+	private String msgGroupCnt;			// 전송그룹ID
 	private String userId;				// 사용자ID
 	private String agentCode;			// 전송사코드
 	private String senderKey;			// 발신프로필 키
@@ -52,8 +53,17 @@
 	private String eachPrice;		// sms 단가
 	private String smsPrice;		// sms 단가
 	private String mmsPrice;		// mms 단가
+	private String totPrice;		// mms 단가
+	private String befCash;		// mms 단가
+	private String befPoint;		// mms 단가
 	private String kakaoAtPrice;	// 카카오 알림톡 단가
 	private String bizJsonName;	// 카카오 알림톡 단가
+	private String reserveYn;	// 카카오 알림톡 단가
+	private String atDelayYn;	// 카카오 알림톡 단가
+	private String bizKakaoResendOrgnlTxt;	// 카카오 알림톡 단가
+	private String bizKakaoResendType;	// 카카오 알림톡 단가
+	
+	
 	
 	
 	
@@ -63,6 +73,7 @@
 		return "MsgSendVO[" +
 			"\n msgId=[" + msgId + "]" +
 			"\n , msgGroupId=[" + msgGroupId + "]" +
+			"\n , msgGroupCnt=[" + msgGroupCnt + "]" +
 			"\n , userId=[" + userId + "]" +
 			"\n , agentCode=[" + agentCode + "]" +
 			"\n , senderKey=[" + senderKey + "]" +
@@ -83,10 +94,23 @@
 			"\n , eachPrice=[" + eachPrice + "]" +
 			"\n , smsPrice=[" + smsPrice + "]" +
 			"\n , mmsPrice=[" + mmsPrice + "]" +
+			"\n , totPrice=[" + totPrice + "]" +
+			"\n , befCash=[" + befCash + "]" +
+			"\n , befPoint=[" + befPoint + "]" +
 			"\n , kakaoAtPrice=[" + kakaoAtPrice + "]" +
 			"\n , bizJsonName=[" + bizJsonName + "]" +
+			"\n , reserveYn=[" + reserveYn + "]" +
+			"\n , atDelayYn=[" + atDelayYn + "]" +
+			"\n , bizKakaoResendOrgnlTxt=[" + bizKakaoResendOrgnlTxt + "]" +
+			"\n , bizKakaoResendType=[" + bizKakaoResendType + "]" +
 			"\n ]";
 	}
 
+
+
+
+
+
+
 	
 }
src/main/java/itn/let/kakao/kakaoComm/KakaoSendUtil.java
--- src/main/java/itn/let/kakao/kakaoComm/KakaoSendUtil.java
+++ src/main/java/itn/let/kakao/kakaoComm/KakaoSendUtil.java
@@ -141,7 +141,8 @@
 			
 /** @공통 기본값 */		
 			KakaoSendAdvcVO sendVO = createSendVO(kakaoVO);
-
+			String msgId = idList.get(i);
+			sendVO.setMsgId(msgId);
 
 			// step1
 			// Step 1-1: 값 치환 및 수신번호 셋팅
@@ -176,6 +177,7 @@
 				}
 				sendVO.setSubMsgTxt(subMsgTxt);// 실패 
 			}
+			sendVO.setSubMsgSendYn(kakaoVO.getSubMsgSendYn()); 
 			
 			
 			/*
@@ -242,21 +244,23 @@
 			sendVO.setReqDate(DATE_FORMATTER.format(calendar.getTime())); 
 			
 			
+			
 /** @step5 전송 메세지 설정 json파일 만들기*/
 			// 타이틀과 버튼이 있고
-			String msgId = idList.get(i);
-			sendVO.setMsgId(msgId);
 			if(hasTitleOrButtons) {
 				// 버튼과 타이틀에 치환데이터가 있으면 json String을 계속 생성
 				if(needsJsonReplacement) {
 					sharedJsonStr = kakaoApiJsonSave.kakaoApiJsonSave_advc(sendVO, templateDetail);
 					sendVO.setBizJsonName(msgId);
+					sendVO.setJsonStr(sharedJsonStr);
 				} else if (StringUtils.isEmpty(sharedJsonStr)) {
 					// 치환 데이터가 없고 아직 생성되지 않았으면 한 번만 생성
 					sharedJsonStr = kakaoApiJsonSave.kakaoApiJsonSave_advc(sendVO, templateDetail);
 					sendVO.setBizJsonName(idList.get(0));
+					sendVO.setJsonStr(sharedJsonStr);
+				}else {
+					sendVO.setBizJsonName(idList.get(0));
 				}
-				sendVO.setJsonStr(sharedJsonStr);
 				
 			}
 			kakaoSendAdvcListVO.add(sendVO);
src/main/java/itn/let/kakao/kakaoComm/KakaoVO.java
--- src/main/java/itn/let/kakao/kakaoComm/KakaoVO.java
+++ src/main/java/itn/let/kakao/kakaoComm/KakaoVO.java
@@ -302,6 +302,8 @@
 			"\n , msgType=[" + getMsgType() + "]" +
 			"\n , userId=[" + userId + "]" +
 			"\n , varListMap=[" + varListMapString + "]" +
+			"\n , befCash=[" + getBefCash() + "]" +
+			"\n , befPoint=[" + getBefPoint() + "]" +
 			"\n ]";
 	}
 	
src/main/java/itn/let/kakao/user/kakaoAt/service/impl/KakaoAlimTalkDAO.java
--- src/main/java/itn/let/kakao/user/kakaoAt/service/impl/KakaoAlimTalkDAO.java
+++ src/main/java/itn/let/kakao/user/kakaoAt/service/impl/KakaoAlimTalkDAO.java
@@ -104,4 +104,8 @@
 	public void insertKakaoAtDataJsonInfo_advc(List<KakaoSendAdvcVO> kakaoSendAdvcVOList) {
 		insert("kakaoAlimTalkDAO.insertKakaoAtDataJsonInfo_advc", kakaoSendAdvcVOList);
 	}
+
+	public void insertKakaoGroupDataTb_advc(KakaoSendAdvcVO sendVO) {
+		insert("kakaoAlimTalkDAO.insertKakaoGroupDataTb_advc", sendVO);
+	}
 }
src/main/java/itn/let/kakao/user/kakaoAt/service/impl/KakaoAlimTalkServiceImpl.java
--- src/main/java/itn/let/kakao/user/kakaoAt/service/impl/KakaoAlimTalkServiceImpl.java
+++ src/main/java/itn/let/kakao/user/kakaoAt/service/impl/KakaoAlimTalkServiceImpl.java
@@ -926,23 +926,12 @@
 		Map<String, List<KakaoSendAdvcVO>> priceGroupedMessages = kakaoSendAdvcListVO.stream()
 				.collect(Collectors.groupingBy(KakaoSendAdvcVO::getEachPrice));
 		
-		// json Str이 있는지 확인
-		Boolean isJsonNotEmpty = StringUtils.isNotEmpty(kakaoSendAdvcListVO.get(0).getJsonStr());
-		// json Str 값이 list에서 다른지 확인
-		Boolean isJsonNameAllSame = false;
-		if(isJsonNotEmpty) {
-			String firstBizJsonName = kakaoSendAdvcListVO.get(0).getBizJsonName();
-			isJsonNameAllSame = kakaoSendAdvcListVO.stream()
-				.allMatch(t -> Objects.equals(t.getBizJsonName(), firstBizJsonName));
-		}
-		
 
 		// instTotalCnt : 화면에서 보여줄 총 발송건수
 		int instTotalCnt = 0;
-		List<Map.Entry<String, List<KakaoSendAdvcVO>>> entryList = new ArrayList<>(priceGroupedMessages.entrySet());
-		// 기본 for문으로 반복 카운트를 사용하기 위해 foreach -> for 수정
-		for (int i = 0; i < entryList.size(); i++) {
-			Map.Entry<String, List<KakaoSendAdvcVO>> entry = entryList.get(i);
+			// 대안: entrySet() 직접 사용
+		for (Map.Entry<String, List<KakaoSendAdvcVO>> entry : priceGroupedMessages.entrySet()) {
+			    // entry 사용
 
 			List<KakaoSendAdvcVO> groupedMsgList = entry.getValue(); // 해당 가격의 메시지 리스트
 
@@ -951,14 +940,36 @@
 			
 
 			// 발송 데이터 삽입
-//			int instCnt = this.insertKakaoData_advc(groupedMsgList, i, isJsonNotEmpty, isJsonNameAllSame);
-			int instCnt = 6;
+			int instCnt = this.insertKakaoData_advc(groupedMsgList);
+//			int instCnt = 6;
 			
 			if(instCnt > 0) {
 
 				instTotalCnt += instCnt;
-//				this.insertMsgGroupDataTb_advc(instCnt, mjonMsgVO, groupedMsgList);
-				this.insertKakaoGroupDataTb_advc(instCnt, kakaoVO, groupedMsgList);
+
+				KakaoSendAdvcVO sendVO = groupedMsgList.get(0);
+
+/** @groupData 테이블 insert */
+				this.insertKakaoGroupDataTb_advc(instCnt, kakaoVO, sendVO);
+
+
+/** @biz_kakao_price에 insert (대체문자 환불관련 테이블)*/ 
+				kakaoVO.setMsgGroupId(sendVO.getMsgGroupId());
+				kakaoVO.setKakaoAtPrice(Float.parseFloat(sendVO.getEachPrice()));
+				kakaoVO.setSmsPrice(Float.parseFloat(sendVO.getSmsPrice()));
+				kakaoVO.setMmsPrice(Float.parseFloat(sendVO.getMmsPrice()));
+				
+				kakaoAlimTalkDAO.insertKakaoSendPrice(kakaoVO);
+				
+				
+				priceAndPoint.insertCashAndPoint(kakaoVO.getUserId()
+						, -Float.parseFloat(sendVO.getTotPrice())
+//						, "SMS 문자 " + groupedMsgList.size() + "건 발송"
+						, "카카오 알림톡 총 "+groupedMsgList.size()+"건 중 " + instCnt + "건 발송"
+						, nextMsgGroupId
+					);
+				
+				
 			}
 			
 			
@@ -972,7 +983,7 @@
 		// 실행 시간 계산 (나노초, 밀리초, 초)
 		System.out.println("메소드 실행 시간 (초): " + Duration.between(start, end).getSeconds() + " s");
 		System.out.println("메소드 실행 시간 (Nano): " + Duration.between(start, end).getNano() + " Nano");
-		kakaoSendAdvcListVO.forEach(t-> log.info(" + t.toString() :: [{}]", t.toString()) );		
+//		kakaoSendAdvcListVO.forEach(t-> log.info(" + t.toString() :: [{}]", t.toString()) );		
 		
 //		idgenMjonMsgGroupId.getNextStringId();
 		
@@ -995,41 +1006,27 @@
 	
 
 
-	private void insertKakaoGroupDataTb_advc(int instCnt, KakaoVO kakaoVO, List<KakaoSendAdvcVO> kakaoSendAdvcVOList) {
+	private void insertKakaoGroupDataTb_advc(int instCnt, KakaoVO kakaoVO, KakaoSendAdvcVO sendVO) throws Exception {
 		// TODO Auto-generated method stub
 
-		log.info(" + insertKakaoGroupDataTb_advc kakaoVO :: \n[{}]", kakaoVO.toString());;
-		log.info(" + insertKakaoGroupDataTb_advc kakaoSendAdvcVOList :: \n[{}]", kakaoSendAdvcVOList.get(0).toString());
+//		log.info(" + insertKakaoGroupDataTb_advc kakaoVO :: \n[{}]", kakaoVO.toString());;
+//		log.info(" + insertKakaoGroupDataTb_advc kakaoSendAdvcVOList :: \n[{}]", sendVO.toString());
 		
+		sendVO.setMsgGroupCnt(Integer.toString(instCnt));
+		sendVO.setReserveYn(kakaoVO.getReserveYn());
+		sendVO.setBefCash(priceAndPoint.getBefCash(sendVO.getUserId()));
+		sendVO.setBefPoint(priceAndPoint.getBefPoint(sendVO.getUserId()));
 		
-		/*
-		#msgGroupId#,
-		#userId#,
-		#callFrom#,
-		#smsTxt#,	mjonMsgVO.setSmsTxt(kakaoVO.getTemplateContent());
-		// #mmsSubject#,
-		
-		#reqDate#,
-		#msgGroupCnt#,
-		// #conectMthd#,
-		#msgType#,
-		// #msgKind#,
-		
-		#agentCode#,
-		#eachPrice#,
-		#reserveYn#,
-		#befCash#,
-		#befPoint#,
-		
-		// #recommId#,
-		// #fileCnt#,
-		#totPrice#,
-		// #eventYn#,
-		// #delayYn#,
+		Float eachPrice = Float.parseFloat(sendVO.getEachPrice());
 
-		#atDelayYn#,
-		#kakaoSubMagOrgnlTxt#
-		*/
+		Float totPrice = eachPrice * instCnt;
+		sendVO.setTotPrice(String.format("%.1f", totPrice));
+		
+		sendVO.setAtDelayYn(kakaoVO.getAtSmishingYn()); 
+		sendVO.setBizKakaoResendOrgnlTxt(kakaoVO.getSubMsgTxt());
+		sendVO.setBizKakaoResendType(sendVO.getSubMsgType());
+		kakaoAlimTalkDAO.insertKakaoGroupDataTb_advc(sendVO);
+		
 	}
 
 	/**
@@ -1045,7 +1042,7 @@
 	 * @return
 	 * 
 	 */
-	private int insertKakaoData_advc(List<KakaoSendAdvcVO> kakaoSendAdvcVOList, int parentLoopCount, Boolean isJsonNotEmpty, Boolean isJsonNameAllSame) {
+	private int insertKakaoData_advc(List<KakaoSendAdvcVO> kakaoSendAdvcVOList) {
 
 
 		// 시작 시간 측정
@@ -1068,7 +1065,6 @@
 
 	
 		// 첫 번째 배치에서만 삽입했는지 추적하는 플래그
-		boolean isJsonInserted = false;
 		for (int i = 0; i < totalSize; i += batchSize) {
 			// Batch 시작 시간 측정
 			long batchStartTime = System.currentTimeMillis();
@@ -1079,15 +1075,14 @@
 
 			// mj_msg_data 테이블 insert
 			int insertedCount = kakaoAlimTalkDAO.insertKakaoAtDataInfo_advc(batchList);
-			if (isJsonNotEmpty) {
-				if (!isJsonNameAllSame) {
-					// BizJsonName이 동일하지 않으면 매번 삽입
-					kakaoAlimTalkDAO.insertKakaoAtDataJsonInfo_advc(batchList);
-				} else if (parentLoopCount==0) {
-					// BizJsonName이 동일하면 첫 번째 배치에서만 삽입
-					kakaoAlimTalkDAO.insertKakaoAtDataJsonInfo_advc(batchList);
-					isJsonInserted = true; // 삽입 완료 플래그 설정
-				}
+			
+			/** @kakaoSendUtil.populateSendLists  
+			 * 하단에서 
+			 * getJsonStr 데이터 처리 후 활용
+			 *  */
+			batchList.removeIf(t -> StringUtils.isBlank(t.getJsonStr()));
+			if(batchList.size() > 0) {
+				kakaoAlimTalkDAO.insertKakaoAtDataJsonInfo_advc(batchList);
 			}
 			instCnt += insertedCount;
 
@@ -1131,7 +1126,7 @@
 
 		// 사용자 보유 금액 BigDecimal 변환 (HALF_EVEN 적용)
 		BigDecimal befCash = new BigDecimal(userMoney).setScale(2, RoundingMode.HALF_EVEN);
-
+		
 		// 총 메시지 금액 계산 (HALF_EVEN 적용)
 		BigDecimal totalEachPrice = kakaoSendAdvcListVO.stream()
 			.map(msg -> new BigDecimal(String.valueOf(msg.getEachPrice()))) // 변환 오류 방지
src/main/resources/egovframework/sqlmap/let/mjo/kakao/Kakao_AT_SQL_Mysql.xml
--- src/main/resources/egovframework/sqlmap/let/mjo/kakao/Kakao_AT_SQL_Mysql.xml
+++ src/main/resources/egovframework/sqlmap/let/mjo/kakao/Kakao_AT_SQL_Mysql.xml
@@ -120,6 +120,54 @@
 		</iterate>
 	</insert>
 	
+	<insert id="kakaoAlimTalkDAO.insertKakaoGroupDataTb_advc" parameterClass="kakaoSendAdvcVO">
+		INSERT INTO MJ_MSG_GROUP_DATA
+		(
+            MSG_GROUP_ID,
+            USER_ID,
+            CALL_FROM,
+            SMS_TXT,
+            
+            REQ_DATE,
+            MSG_GROUP_CNT,
+            MSG_TYPE,
+            
+            AGENT_CODE,
+            EACH_PRICE,
+            RESERVE_YN,
+            BEF_CASH,
+            BEF_POINT,
+            
+            TOT_PRICE,
+            
+            AT_DELAY_YN,
+            BIZ_KAKAO_RESEND_ORGNL_TXT,
+            BIZ_KAKAO_RESEND_TYPE
+		)VALUES
+		(
+           #msgGroupId#,
+           #userId#,
+           #callFrom#,
+           #templateContent#,
+
+           #reqDate#,
+           #msgGroupCnt#,
+           #msgType#,
+
+           #agentCode#,
+           #eachPrice#,
+           #reserveYn#,
+           #befCash#,
+           #befPoint#,
+
+           #totPrice#,
+           
+           #atDelayYn#,
+           #bizKakaoResendOrgnlTxt#,
+           #bizKakaoResendType#
+		)
+	</insert>
+	
 	<insert id="kakaoAlimTalkDAO.insertKakaoSendPrice" parameterClass="kakaoVO">
 		INSERT INTO BIZ_KAKAO_PRICE
 		(
Add a comment
List