문자 개별단가별 그룹화하여 분리 발송

This commit is contained in:
hehihoho3@gmail.com 2024-12-06 15:52:20 +09:00
parent 113d2fc25a
commit eecd562d5e
5 changed files with 95 additions and 45 deletions

View File

@ -109,6 +109,13 @@ public class MjonMsgSendVO{
/**
* @description : event 여부 / group tb에 넣는 용도
*/
private String eventYn;
/**
* @description : 개별단가
*/

View File

@ -203,7 +203,7 @@ public final class MsgSendUtils {
*/
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 :: ");
@ -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 {

View File

@ -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);

View File

@ -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<String> 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<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 @@ 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<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()));

View File

@ -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);