diff --git a/src/main/java/itn/com/cmm/util/MsgSendUtils.java b/src/main/java/itn/com/cmm/util/MsgSendUtils.java index d6234fc7..c7a767b1 100644 --- a/src/main/java/itn/com/cmm/util/MsgSendUtils.java +++ b/src/main/java/itn/com/cmm/util/MsgSendUtils.java @@ -1,13 +1,19 @@ package itn.com.cmm.util; import java.io.UnsupportedEncodingException; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.Objects; +import java.util.stream.Stream; import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import itn.let.mail.service.StatusResponse; import itn.let.mjo.msg.service.MjonMsgVO; import itn.let.mjo.msgdata.service.ReplacementListsVO; +import itn.let.module.base.PriceAndPoint; import lombok.extern.slf4j.Slf4j; /** @@ -24,7 +30,6 @@ import lombok.extern.slf4j.Slf4j; * * */ -@Slf4j public final class MsgSendUtils { @@ -103,51 +108,29 @@ public final class MsgSendUtils { * @return */ public static float determinePriceByMsgType(MjonMsgVO mjonMsgVO, float shortPrice, float longPrice, - float picturePrice, float picture2Price, float picture3Price) { - float price = 0; - String msgType = mjonMsgVO.getMsgType(); - - if ("4".equals(msgType)) { - price = shortPrice; - } else if ("6".equals(msgType)) { - // 파일 첨부 여부에 따라 장문 단가 설정 - if (mjonMsgVO.getFileName3() != null) { - price = picture3Price; - } else if (mjonMsgVO.getFileName2() != null) { - price = picture2Price; - } else if (mjonMsgVO.getFileName1() != null) { - price = picturePrice; - } else { - price = longPrice; - } - } - return price; + float picturePrice, float picture2Price, float picture3Price) { + float price = 0; + String msgType = mjonMsgVO.getMsgType(); + + if ("4".equals(msgType)) { + price = shortPrice; + } else if ("6".equals(msgType)) { + // 파일 첨부 여부에 따라 장문 단가 설정 + if (mjonMsgVO.getFileName3() != null) { + price = picture3Price; + } else if (mjonMsgVO.getFileName2() != null) { + price = picture2Price; + } else if (mjonMsgVO.getFileName1() != null) { + price = picturePrice; + } else { + price = longPrice; + } + } + return price; } public static boolean isReplacementRequired(MjonMsgVO mjonMsgVO) { - return "Y".equals(mjonMsgVO.getTxtReplYn()); - } - - public static boolean isReplacementDataValid(MjonMsgVO mjonMsgVO) { - String[] nameList = mjonMsgVO.getNameList(); - String[] rep1 = mjonMsgVO.getRep1List(); - String[] rep2 = mjonMsgVO.getRep2List(); - String[] rep3 = mjonMsgVO.getRep3List(); - String[] rep4 = mjonMsgVO.getRep4List(); - - - - // 치환 문자 리스트가 유효한지 확인 - return !(isEmpty(nameList) - && isEmpty(rep1) - && isEmpty(rep2) - && isEmpty(rep3) - && isEmpty(rep4)); - } - - // 배열이 비어있는지 확인하는 메서드 - public static boolean isEmpty(String[] array) { - return array == null || array.length == 0; + return "Y".equals(mjonMsgVO.getTxtReplYn()); } public static ReplacementListsVO createReplacementLists(MjonMsgVO mjonMsgVO) throws UnsupportedEncodingException { @@ -168,99 +151,90 @@ public final class MsgSendUtils { * @return * @throws UnsupportedEncodingException */ - public static void populateReplacementLists(MjonMsgVO mjonMsgVO, ReplacementListsVO lists, StatusResponse statusResponse){ + public static Boolean populateReplacementLists(MjonMsgVO mjonMsgVO, ReplacementListsVO lists, StatusResponse statusResponse){ - String[] nameList = mjonMsgVO.getNameList(); - String[] phone = mjonMsgVO.getCallToList(); - String[] rep1 = mjonMsgVO.getRep1List(); - String[] rep2 = mjonMsgVO.getRep2List(); - String[] rep3 = mjonMsgVO.getRep3List(); - String[] rep4 = mjonMsgVO.getRep4List(); - String smsTxt = mjonMsgVO.getSmsTxt(); - int fileCount = Integer.parseInt(mjonMsgVO.getFileCnt()); - - // 이름 치환 + String[] nameList = mjonMsgVO.getNameList(); + String[] phone = mjonMsgVO.getCallToList(); + String[] rep1 = mjonMsgVO.getRep1List(); + String[] rep2 = mjonMsgVO.getRep2List(); + String[] rep3 = mjonMsgVO.getRep3List(); + String[] rep4 = mjonMsgVO.getRep4List(); + String smsTxt = mjonMsgVO.getSmsTxt(); + int fileCount = Integer.parseInt(mjonMsgVO.getFileCnt()); + + // 이름 치환 int shortCnt = 0; int longCnt = 0; int imgCnt = 0; - for (int i = 0; i < phone.length; i++) { - - smsTxt = smsTxt.replaceAll(String.valueOf((char) 13), ""); - if (smsTxt.contains("[*이름*]")) { - if (nameList.length > i && StringUtil.isNotEmpty(nameList[i])) { - smsTxt = smsTxt.replaceAll("\\[\\*이름\\*\\]", StringUtil.getString(nameList[i].replaceAll("§", ","))); - } else { - smsTxt = smsTxt.replaceAll("\\[\\*이름\\*\\]", ""); - } - } + + + for (int i = 0; i < phone.length; i++) { + + smsTxt = smsTxt.replaceAll(String.valueOf((char) 13), ""); + - // 문자 1 치환 - if (smsTxt.contains("[*1*]")) { - if (rep1.length > i && StringUtil.isNotEmpty(rep1[i])) { - smsTxt = smsTxt.replaceAll("\\[\\*1\\*\\]", StringUtil.getString(rep1[i].replaceAll("§", ","))); - } else { - smsTxt = smsTxt.replaceAll("\\[\\*1\\*\\]", ""); - } - } - - // 문자 2 치환 - if (smsTxt.contains("[*2*]")) { - if (rep2.length > i && StringUtil.isNotEmpty(rep2[i])) { - smsTxt = smsTxt.replaceAll("\\[\\*2\\*\\]", StringUtil.getString(rep2[i].replaceAll("§", ","))); - } else { - smsTxt = smsTxt.replaceAll("\\[\\*2\\*\\]", ""); - } - } - - // 문자 3 치환 - if (smsTxt.contains("[*3*]")) { - if (rep3.length > i && StringUtil.isNotEmpty(rep3[i])) { - smsTxt = smsTxt.replaceAll("\\[\\*3\\*\\]", StringUtil.getString(rep3[i].replaceAll("§", ","))); - } else { - smsTxt = smsTxt.replaceAll("\\[\\*3\\*\\]", ""); - } - } - - // 문자 4 치환 - if (smsTxt.contains("[*4*]")) { - if (rep4.length > i && StringUtil.isNotEmpty(rep4[i])) { - smsTxt = smsTxt.replaceAll("\\[\\*4\\*\\]", StringUtil.getString(rep4[i].replaceAll("§", ","))); - } else { - smsTxt = smsTxt.replaceAll("\\[\\*4\\*\\]", ""); - } - } + // 이름 및 치환 문자 처리 + smsTxt = replacePlaceholder(smsTxt, "[*이름*]", nameList, i); + smsTxt = replacePlaceholder(smsTxt, "[*1*]", rep1, i); + smsTxt = replacePlaceholder(smsTxt, "[*2*]", rep2, i); + smsTxt = replacePlaceholder(smsTxt, "[*3*]", rep3, i); + smsTxt = replacePlaceholder(smsTxt, "[*4*]", rep4, i); + try { int bytes = getSmsTxtBytes(smsTxt); - if(bytes < 2000) { if(fileCount > 0) { - populateImgLists(lists, nameList, phone, rep1, rep2, rep3, rep4, smsTxt, i); - imgCnt++; - + populateImgLists(lists, nameList, phone, rep1, rep2, rep3, rep4, smsTxt, i); + imgCnt++; + }else if(bytes > 90) {//장문문자 리스트 만들기 - populateLongLists(lists, nameList, phone, rep1, rep2, rep3, rep4, smsTxt, i); - longCnt++; - } else {//단문문자 리스트 만들기 - populateShortLists(lists, nameList, phone, rep1, rep2, rep3, rep4, smsTxt, i); - shortCnt++; - } + populateLongLists(lists, nameList, phone, rep1, rep2, rep3, rep4, smsTxt, i); + longCnt++; + } else {//단문문자 리스트 만들기 + populateShortLists(lists, nameList, phone, rep1, rep2, rep3, rep4, smsTxt, i); + shortCnt++; + } }else { statusResponseSet(statusResponse, HttpStatus.BAD_REQUEST, "문자 치환 후 전송 문자 길이를 초과하였습니다."); + return false; } } catch (UnsupportedEncodingException e) { - statusResponseSet(statusResponse, HttpStatus.BAD_REQUEST, "전송 중 오류가 발생하였습니다."); + statusResponseSet(statusResponse, HttpStatus.BAD_REQUEST, "문자 치환 중 오류가 발생하였습니다."); e.printStackTrace(); + return false; } - } - + } + lists.setShortCnt(shortCnt); lists.setLongCnt(longCnt); lists.setImgCnt(imgCnt); + + return true; } + + /** + * 특정 플레이스홀더를 리스트에서 가져온 값으로 치환합니다. + * + * @param smsTxt 문자 내용 + * @param placeholder 치환할 플레이스홀더 (예: [*이름*]) + * @param list 치환할 데이터 리스트 + * @param index 현재 인덱스 + * @return 치환된 문자 내용 + */ + private static String replacePlaceholder(String smsTxt, String placeholder, String[] list, int index) { + if (smsTxt.contains(placeholder)) { + if (list.length > index && StringUtil.isNotEmpty(list[index])) { + smsTxt = smsTxt.replaceAll(placeholder, StringUtil.getString(list[index].replaceAll("§", ","))); + } else { + smsTxt = smsTxt.replaceAll(placeholder, ""); + } + } + return smsTxt; + } private static void populateShortLists(ReplacementListsVO lists, String[] nameList, String[] phone, String[] rep1, String[] rep2, String[] rep3, String[] rep4, String smsTxt, int i) { @@ -410,17 +384,38 @@ public final class MsgSendUtils { } } + + + private static void statusResponseSet (StatusResponse statusResponse, HttpStatus httpStatus, String msg ) { + statusResponse.setStatus(httpStatus); + statusResponse.setMessage(msg); + + } + + public static StatusResponse validateFilesForMessageSending(int fileCount, MjonMsgVO mjonMsgVO) { + if (fileCount > 0) { + boolean allFilesAreNull = Stream + .of(mjonMsgVO.getFileName1(), mjonMsgVO.getFileName2(), mjonMsgVO.getFileName3()) + .allMatch(Objects::isNull); + + if (allFilesAreNull) { + return new StatusResponse(HttpStatus.NO_CONTENT, "문자 메세지 이미지 추가에 오류가 발생하여 문자 발송이 취소 되었습니다."); + } + } + return null; // 유효성 검사를 통과한 경우 + } + /** - * @methodName : checkReplacementDataValidity + * @methodName : validateReplacementData * @author : 이호영 * @date : 2024.09.25 * @description : 치환문자가 사용될 때 데이터가 올바른지 확인하는 메서드 * @param mjonMsgVO - * @param modelAndView + * @param statusResponse * @return boolean */ - public static boolean checkReplacementDataValidity(MjonMsgVO mjonMsgVO, StatusResponse statusResponse) { + public static boolean validateReplacementData(MjonMsgVO mjonMsgVO, StatusResponse statusResponse) { String[] nameList = mjonMsgVO.getNameList(); String[] phone = mjonMsgVO.getCallToList(); String[] rep1 = mjonMsgVO.getRep1List(); @@ -428,9 +423,19 @@ public final class MsgSendUtils { String[] rep3 = mjonMsgVO.getRep3List(); String[] rep4 = mjonMsgVO.getRep4List(); + // 치환 문자 리스트가 모두 비어있는지 확인 + if (isEmpty(nameList) + && isEmpty(rep1) + && isEmpty(rep2) + && isEmpty(rep3) + && isEmpty(rep4)) { + statusResponseSet(statusResponse, HttpStatus.BAD_REQUEST, "특정문구 일괄변환 치환문자 데이터가 없습니다."); + return false; + } + + // 치환 문자 필드 개수와 전화번호 개수가 일치하는지 확인 boolean isRepCountOk = true; - // 치환 문자 전체 필수 체크 if (mjonMsgVO.getSmsTxt().contains("[*이름*]") && nameList.length != phone.length) { isRepCountOk = false; } @@ -447,21 +452,18 @@ public final class MsgSendUtils { isRepCountOk = false; } - // 검증 결과가 false인 경우 에러 메시지 반환 + // 필드 개수가 일치하지 않는 경우 에러 메시지 반환 if (!isRepCountOk) { - - statusResponseSet(statusResponse, HttpStatus.BAD_REQUEST, "특정문구 일괄변환 치환문자 데이터가 없습니다."); + statusResponseSet(statusResponse, HttpStatus.BAD_REQUEST, "특정문구 일괄변환 치환문자 데이터가 일치하지 않습니다."); return false; } - return true; + return true; // 모든 유효성 검사를 통과한 경우 } - - private static void statusResponseSet (StatusResponse statusResponse, HttpStatus httpStatus, String msg ) { - statusResponse.setStatus(httpStatus); - statusResponse.setMessage(msg); - + // 배열이 비어있는지 확인하는 메서드 + public static boolean isEmpty(String[] array) { + return array == null || array.length == 0; } diff --git a/src/main/java/itn/let/mjo/msg/service/impl/MjonMsgServiceImpl.java b/src/main/java/itn/let/mjo/msg/service/impl/MjonMsgServiceImpl.java index c9e979bb..68424bc4 100644 --- a/src/main/java/itn/let/mjo/msg/service/impl/MjonMsgServiceImpl.java +++ b/src/main/java/itn/let/mjo/msg/service/impl/MjonMsgServiceImpl.java @@ -1057,7 +1057,7 @@ public class MjonMsgServiceImpl extends EgovAbstractServiceImpl implements MjonM public List selectAgentSmsCountStatList(MjonMsgStatVO mjonMsgStatVO) throws Exception { List list = mjonMsgDAO.selectAgentSmsCountStatList(mjonMsgStatVO); - + System.out.println("??????++++++++++++++++++++++++"); return list; } diff --git a/src/main/java/itn/let/mjo/msgdata/service/MjonMsgDataService.java b/src/main/java/itn/let/mjo/msgdata/service/MjonMsgDataService.java index 11270c04..033c000b 100644 --- a/src/main/java/itn/let/mjo/msgdata/service/MjonMsgDataService.java +++ b/src/main/java/itn/let/mjo/msgdata/service/MjonMsgDataService.java @@ -184,6 +184,7 @@ public interface MjonMsgDataService { public List selectPayUserSumFaxList(MjonMsgVO mjonMsgVO) throws Exception; public StatusResponse sendMsgData_advc(MjonMsgVO mjonMsgVO, HttpServletRequest request) throws Exception; + } 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 1acf68a5..9ed67589 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 @@ -1,7 +1,9 @@ package itn.let.mjo.msgdata.service.impl; +import java.io.UnsupportedEncodingException; import java.math.BigDecimal; import java.math.RoundingMode; +import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; @@ -10,12 +12,12 @@ import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.Objects; -import java.util.stream.Stream; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Service; import org.springframework.web.servlet.ModelAndView; @@ -53,12 +55,12 @@ import itn.let.mjo.pay.service.MjonPayService; import itn.let.mjo.pay.service.MjonPayVO; import itn.let.mjo.pay.service.impl.MjonPayDAO; import itn.let.mjo.spammsg.service.MjonSpamMsgService; +import itn.let.module.base.PriceAndPoint; import itn.let.sym.site.service.JoinSettingVO; import itn.let.sym.site.service.impl.SiteManagerDAO; import itn.let.uat.uia.web.SendLogVO; import itn.let.uss.umt.service.EgovUserManageService; import itn.let.uss.umt.service.MberManageVO; -import itn.let.uss.umt.service.UserManageVO; import lombok.extern.slf4j.Slf4j; @Slf4j @@ -122,804 +124,1548 @@ public class MjonMsgDataServiceImpl extends EgovAbstractServiceImpl implements M private MjonSpamMsgService mjonSpamMsgService; - public List selectCcmCmmCodeList() throws Exception{ + @Autowired + private PriceAndPoint priceAndPoint; + + + public List selectCcmCmmCodeList() throws Exception { + + return mjonMsgDataDAO.selectCcmCmmCodeList(); + } + public MjonMsgReturnVO insertMsgDataInfo_advc(MjonMsgVO mjonMsgVO) throws Exception { + + MjonMsgReturnVO returnVO = new MjonMsgReturnVO(); + + try { + String msgType = mjonMsgVO.getMsgType(); + String agentCode = mjonMsgVO.getAgentCode(); + // 장문 전송 + String contSeq = ""; + + // 최종 입력 수 저장 변수 + int resultCnt = 0; + int limitCnt = 1000; + int blockCnt = 0; + + + int callToCnt = mjonMsgVO.getCallToList().length; // 전체 받는사람 건수 + + mjonMsgVO.setMsgGroupCnt(Integer.toString(callToCnt)); + + + // 사용자 현재 보유 금액 불러오기(문자 발송 금액 차감 이전 금액) + String befCash = mjonMsgVO.getBefCash(); + + // 수신거부 목록 불러오기 + List userBlockList = mjonMsgDAO.selectUserBlockList(mjonMsgVO); + + List dupliBlockList = MJUtil.getDuplicateList(userBlockList); + int usrBlockCnt = dupliBlockList.size(); + + + // 회원 전용 전송사 정보 불러오기 + MberManageVO userInfo = mjonMsgDataDAO.selectMberManageInfo(mjonMsgVO.getUserId()); + String hotlineAgentCode = userInfo.getHotlineAgentCode(); + + + // 전용 전송사가 있는 경우 처리 + if (!"00".equals(hotlineAgentCode)) { + MjonMsgAgentStsVO mjonMsgAgentStsVO = new MjonMsgAgentStsVO(); + mjonMsgAgentStsVO.setAgentCode(hotlineAgentCode); + + if ("6".equals(msgType)) { + int fCnt = Integer.parseInt(mjonMsgVO.getFileCnt()); + if (fCnt > 0) { + mjonMsgAgentStsVO.setMsgType("P"); + } else { + mjonMsgAgentStsVO.setMsgType("L"); + } + } else { + mjonMsgAgentStsVO.setMsgType("S"); + } + + List hotlineMsgAgentList = mjonMsgAgentStsDAO.selectMsgAgentListByAgentCode(mjonMsgAgentStsVO); + String mberAgentConde = ""; + String mberSendRate = ""; + String mberRepAgent = ""; + + for (MjonMsgAgentStsVO tmp : hotlineMsgAgentList) { + mberAgentConde = tmp.getAgentCode(); + mberSendRate = tmp.getSendRate(); + mberRepAgent = tmp.getRepAgent(); + String useYn = tmp.getUseYn(); + + if ("N".equals(userInfo.getBlineCode())) { + // 회원 전용 전송사의 전송 비율이 0 이면 대표전송사로 전송되도록 셋팅함. + if ("0".equals(mberSendRate) || "N".equals(useYn)) { + hotlineAgentCode = mberRepAgent; + } + } + } + } + + /** + * Agent 추가시 셋팅하기 Agent 발송 비율 불러오기 최초 : 아이하트(01), 현대 퓨쳐넷(02), 아이앰오(03) 22.10.12 + * : 비즈뿌리오(04) 추가 23.04.10 : 제이제이(05) 추가 23.05.02 : 인비토 (07) 추가 + */ + + int iheartCnt = 0; // 아이하트 전송갯수 + int hncCnt = 0; // 현대퓨처넷 전송갯수 + int imoCnt = 0; // 아이엠오 전송갯수 + int bizCnt = 0; // 비즈뿌리오 전송갯수 + int jjCnt = 0; // 제이제이 전송갯수 + int ivtCnt = 0; // 인비토 전송갯수 + + // 전송사별 발송 리스트 조회 + List sendRateList = mjonMsgDataDAO.selectSendAgentList(mjonMsgVO); + + if (callToCnt >= 10) { + // 전송사별 배분률 조회 + int sendRateSize = sendRateList.size(); + + /** + * Agent 추가시 셋팅하기 + * + * 최초 : 아이하트(01), 현대 퓨쳐넷(02), 아이앰오(03) 22.10.12 : 비즈뿌리오(04) 추가 23.04.10 : + * 제이제이(05) 추가 23.05.02 : 인비토 (07) 추가 + */ + for (MjonMsgVO sendRate : sendRateList) { + String sndAgentCode = sendRate.getAgentCode(); + int sendCount = Math.round(callToCnt * Float.parseFloat(sendRate.getSendRate())); + switch (sndAgentCode) { + case "01": + iheartCnt = sendCount; + break; + case "02": + hncCnt = sendCount; + break; + case "03": + imoCnt = sendCount; + break; + case "04": + bizCnt = sendCount; + break; + case "05": + jjCnt = sendCount; + break; + case "07": + ivtCnt = sendCount; + break; + } + } + } + + /** + * 한번에 서버가 보낼수 있는 문자건수를 체크 해서 넘으면 분할해서 디비 입렵해 준다. 발송 건수가 천 건이 넘어가면, 백건씩 끊어서 발송 + * 하도록 한다. + */ + + if (callToCnt >= 10000) { + limitCnt = 1000; + } + + + + + + // 수신자 리스트 처리 + List msgDataInfo = new ArrayList(); + + int cnt = 1; + int totCnt = 1; + + // 분할문자 시간에 간격시간 더해주기 + String dividDay = null; + Calendar cal = Calendar.getInstance(); + + // 예약시간 변환 + SimpleDateFormat transFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); + + int turmMin = 0; + int totalCallCnt = 0; + int divideCnt = 0; + int count = 1; // 분할 카운트 + String delayTime = "";// 30분 지연시간 + String spamStatus = mjonMsgVO.getSpamStatus();// 스팸 문구 유무 + String smishingYn = mjonMsgVO.getSmishingYn();// 스미싱 의심 유무 + String delayYn = "N"; // 문자발송 30분 지연 처리 유무 + + if (StringUtils.isEmpty(spamStatus)) + { + spamStatus = "N"; + } + + if (StringUtils.isEmpty(smishingYn)) + { + smishingYn = "N"; + } + + + + + + + + // 사용자 시스템 단가에 스미싱노티 컬럼이 있음 + JoinSettingVO joinSettingVO = siteManagerDAO.selectAdminNotiDetail(); + // 야간 스미싱 알림여부 정보 불러오기 + String holiSmishingNoti = joinSettingVO.getHoliSmishingNoti(); + + // 스미싱 알림 여부 처리 + boolean spamSmishingPassStatus = false; + + // 스팸, 스미싱 상태인 경우에만 true 처리 + // 야간스미싱알리 여부가 활성화 인경우 무조건 문자를 즉시 보내도록 한다. + // 스미싱 알림 일정에 등록된 날짜와 시간에 포함되면 30분 딜레이 없이 발송 처리하도록 함. + if ("Y".equals(holiSmishingNoti)) { + + MsgAlarmSetVO msgAlarmSetVO = new MsgAlarmSetVO(); + + msgAlarmSetVO.setUseYn("Y"); + msgAlarmSetVO.setFirstIndex(0); + + List resultAlarmList = msgHolidayDAO.selectAlarmSettingList(msgAlarmSetVO); - return mjonMsgDataDAO.selectCcmCmmCodeList(); - } + Calendar calendar = Calendar.getInstance(); + int year = calendar.get(Calendar.YEAR); - public MjonMsgReturnVO insertMsgDataInfo(MjonMsgVO mjonMsgVO) throws Exception{ + MsgHolidayVO msgHolidayVO = new MsgHolidayVO(); + msgHolidayVO.setFirstIndex(0); + msgHolidayVO.setRecordCountPerPage(100); + msgHolidayVO.setSearchHoliYear(Integer.toString(year)); - MjonMsgReturnVO returnVO = new MjonMsgReturnVO(); + List resultHolidayList = msgHolidayDAO.selectMsgHolidayList(msgHolidayVO); - try { + MjonHolidayApi mjonHolidayApi = new MjonHolidayApi(); - // 문자 전송 그룹아이디 생성 - //mjonMsgVO.setMsgGroupId(idgenMjonMsgGroupId.getNextStringId()); + boolean smishingAlarmPassSts = mjonHolidayApi.getHolidaySmishingPassStatus(resultAlarmList, + resultHolidayList); - // 문자 아이디 생성 - //mjonMsgVO.setMsgId(idgenMsgId.getNextStringId()); + spamSmishingPassStatus = smishingAlarmPassSts; + } else { - String msgType = mjonMsgVO.getMsgType(); - String agentCode = mjonMsgVO.getAgentCode(); - // 장문 전송 - String contSeq = ""; + spamSmishingPassStatus = true; - //float myPrice = 10000; - //float totPrice = Float.parseFloat(mjonMsgVO.getTotPrice()); - // 최종 입력 수 저장 변수 - int resultCnt = 0; - int limitCnt = 1000; - int blockCnt = 0; + } + + + // 야간 스미싱 알림여부가 활성화 이고 예외시간에 포함되는 경우 스팸, 스미싱, 딜레이 값을 모두 N 으로 처리 + if (spamSmishingPassStatus) { - // 총 보유 금액과 전송 합계 비교 + spamStatus = "N"; + smishingYn = "N"; + delayYn = "N"; - /*if(myPrice < totPrice) { // 보유 금액보다 전송 합계가 적은 경우 리턴 + } - return 0 ; - }*/ + if (!mjonMsgVO.getReserveYn().equals("N")) {// 예약문자인 경우 시간 셋팅 - int callToCnt = mjonMsgVO.getCallToList().length; //전체 받는사람 건수 + Date toDate = transFormat.parse(mjonMsgVO.getReqDate()); + cal.setTime(toDate); // 예약 시간 캘린터 변수에 입력 - mjonMsgVO.setMsgGroupCnt(Integer.toString(callToCnt)); + // String 타입 시간 Int로 변환 + turmMin = Integer.parseInt(mjonMsgVO.getDivideTime()); // 분할발송 시간 간격 + dividDay = transFormat.format(cal.getTime()); + totalCallCnt = mjonMsgVO.getCallToList().length; // 수신자 전체 갯수 + divideCnt = Integer.parseInt(mjonMsgVO.getDivideCnt()); // 분할 발송 갯수 - //그룹 테이블에 입력할 발송 시간 및 예약 발송 시간 처리 - /*if(mjonMsgVO.getReserveYn().equals("N")) {//즉시 전송의 경우 현재 시간을 입력 + if (spamStatus.equals("Y") || smishingYn.equals("Y")) { - Date now = new Date(); + mjonMsgVO.setDelayYn("Y");// 일단 값만 등록해준다. 이거 안해주면 NULL 값으로 들어간다. 차후에 변경하도록 할 예정임, 원래는 스팸이면 Y로 + // 넣어줘야한다. - SimpleDateFormat sdFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); + } else { - mjonMsgVO.setReqDate(sdFormat.format(now)); + mjonMsgVO.setDelayYn("N");// 일단 값만 등록해준다. 이거 안해주면 NULL 값으로 들어간다. 차후에 변경하도록 할 예정임 + } - }*/ + } else {// 즉시발송의 경우 현재 시간으로 입력해 준다. - //사용자 현재 보유 금액 불러오기(문자 발송 금액 차감 이전 금액) - String befCash = mjonMsgVO.getBefCash(); + Date now = new Date(); + if (spamStatus.equals("Y") || smishingYn.equals("Y")) {// 스팸 문자가 포함되었거나, 스미싱 의심 회원의 경우 문자발송 시간을 30분 딜레이 + // 시킨다. - //VO에서 현재 보유금액이 없으면 디비에서 조회해서 불러옴 - if("".equals(befCash) || befCash == null) { - befCash = mjonMsgDataDAO.selectBeforeCashData(mjonMsgVO); - } + String nowDate = transFormat.format(now); + Date toDate = transFormat.parse(nowDate); + System.out.println("++++++++++++++++++++ origin reqDate ::: " + toDate); + cal.setTime(toDate); - mjonMsgVO.setBefCash(befCash); - // 문자 전송 그룹 테이블에 정보 입력 - //mjonMsgDAO.insertGroupMsgData(mjonMsgVO); + cal.add(Calendar.MINUTE, 30); + delayTime = transFormat.format(cal.getTime()); + mjonMsgVO.setReqDate(delayTime); + System.out.println("++++++++++++++++++++ delay reqDate ::: " + mjonMsgVO.getReqDate()); + delayYn = "Y"; + mjonMsgVO.setDelayYn(delayYn);// 문자 발송 30분 지연 코드 셋팅 - //수신거부 목록 불러오기 - List userBlockList = mjonMsgDAO.selectUserBlockList(mjonMsgVO); + } else {// 정상적인 문자인 경우 즉시발송 처리해준다. - List dupliBlockList = MJUtil.getDuplicateList(userBlockList); - int usrBlockCnt = dupliBlockList.size(); + mjonMsgVO.setReqDate(transFormat.format(now)); + mjonMsgVO.setDelayYn(delayYn);// 문자 발송 30분 지연 디폴트 값 셋팅(N) - //회원 전용 전송사 정보 불러오기 - MberManageVO userInfo = mjonMsgDataDAO.selectMberManageInfo(mjonMsgVO.getUserId()); - String hotlineAgentCode = userInfo.getHotlineAgentCode(); + } - //야간스미싱 알림여부 정보(관리자 알림관리 상태 정보를 모두 불러옴) 불러오기 20240722 우영두 추가 - JoinSettingVO joinSettingVO = siteManagerDAO.selectAdminNotiDetail(); - String holiSmishingNoti = joinSettingVO.getHoliSmishingNoti(); + } - //스팸,스미싱이어도 딜레이없이 문자 전송을 처리할지 선택 상태값 변수 - boolean spamSmishingPassStatus = false; //야간스미싱 알림여부가 활성화인 경우 false, 비활성화인경우 true 값을 가지도록 한다. + String[] nameList = mjonMsgVO.getNameList(); // 치환 이름 리스트 + String[] phoneList = mjonMsgVO.getCallToList(); // 받는사람 연락처 리스트 + String[] rep1 = mjonMsgVO.getRep1List(); // 치환 문자1 리스트 + String[] rep2 = mjonMsgVO.getRep2List(); // 치환 문자2 리스트 + String[] rep3 = mjonMsgVO.getRep3List(); // 치환 문자3 리스트 + String[] rep4 = mjonMsgVO.getRep4List(); // 치환 문자4 리스트 - //스팸, 스미싱 상태인 경우에만 true 처리 - //야간스미싱알리 여부가 활성화 인경우 무조건 문자를 즉시 보내도록 한다. - //스미싱 알림 일정에 등록된 날짜와 시간에 포함되면 30분 딜레이 없이 발송 처리하도록 함. - if(holiSmishingNoti.equals("Y")) { + // Controller에서 전달 받은 분할 시간 정보 리스트 + List dividDayList = mjonMsgVO.getDividDay(); - MsgAlarmSetVO msgAlarmSetVO = new MsgAlarmSetVO(); + String frstDelayTime = mjonMsgVO.getReqDate(); + // 문자발송 리스트 생성 시작 + for (int i = 0; i < callToCnt; i++) { - msgAlarmSetVO.setUseYn("Y"); - msgAlarmSetVO.setFirstIndex(0); + Boolean blockSts = false; + for (int j = 0; j < usrBlockCnt; j++) { - List resultAlarmList = msgHolidayDAO.selectAlarmSettingList(msgAlarmSetVO); + if (phoneList[i].equals(dupliBlockList.get(j).toString())) { - Calendar calendar = Calendar.getInstance(); - int year = calendar.get(Calendar.YEAR); + blockCnt++; // 수신 차단 카운드를 해준다. + blockSts = true; - MsgHolidayVO msgHolidayVO = new MsgHolidayVO(); - msgHolidayVO.setFirstIndex(0); - msgHolidayVO.setRecordCountPerPage(100); - msgHolidayVO.setSearchHoliYear(Integer.toString(year)); + } - List resultHolidayList = msgHolidayDAO.selectMsgHolidayList(msgHolidayVO); + } - MjonHolidayApi mjonHolidayApi = new MjonHolidayApi(); + if (!blockSts) { // 수신거부가 아니면 추가 - boolean smishingAlarmPassSts = mjonHolidayApi.getHolidaySmishingPassStatus(resultAlarmList, resultHolidayList); + MjonMsgVO tempVO = new MjonMsgVO(); - spamSmishingPassStatus = smishingAlarmPassSts; - }else { + /** + * Agent 추가시 셋팅하기 + * + * 최초 : 아이하트(01), 현대 퓨쳐넷(02), 아이앰오(03) 22.10.12 : 비즈뿌리오(04) 추가 23.04.10 : + * 제이제이(05) 추가 23.05.02 : 인비토 (07) 추가 23.05.09 : 회원 전용 전송사 정보가 있으면 모든 문자를 전용 + * 전송사로 발송처리함. + */ + + if (hotlineAgentCode.equals("00")) {// 전용 전송사가 사용 안함인 경우 분배 및 대표 전송사로 설정 + + if (iheartCnt > 0) { + agentCode = "01"; + tempVO.setAgentCode(agentCode); + iheartCnt--; + } else if (hncCnt > 0) { + agentCode = "02"; + tempVO.setAgentCode(agentCode); + hncCnt--; + } else if (imoCnt > 0) { + agentCode = "03"; + tempVO.setAgentCode(agentCode); + imoCnt--; + } else if (bizCnt > 0) { + agentCode = "04"; + tempVO.setAgentCode(agentCode); + bizCnt--; + } else if (jjCnt > 0) { + agentCode = "05"; + tempVO.setAgentCode(agentCode); + jjCnt--; + } else if (ivtCnt > 0) { + agentCode = "07"; + tempVO.setAgentCode(agentCode); + ivtCnt--; + } else {// 전송사 Agent 대표 전송사로 지정한다. + + agentCode = sendRateList.get(0).getRepAgent(); + tempVO.setAgentCode(agentCode); + } + + } else {// 전용 전송사가 지정되어 있는 경우 전용 전송사로 지정 + + agentCode = hotlineAgentCode; + tempVO.setAgentCode(hotlineAgentCode); + } + // Agent 셋팅 끝 + + tempVO.setMsgId(idgenMsgId.getNextStringId()); + tempVO.setUserId(mjonMsgVO.getUserId()); + tempVO.setCallTo(phoneList[i]); + tempVO.setCallFrom(mjonMsgVO.getCallFrom()); + tempVO.setMsgType(mjonMsgVO.getMsgType()); + tempVO.setMsgGroupId(mjonMsgVO.getMsgGroupId()); + tempVO.setMsgCnt(mjonMsgVO.getMsgCnt()); + + // 아이엠오 전송사 문자 타입 설정해 주기 + if (agentCode.equals("03")) { + + // 단순 장문 문자는 neoType : 2, 그림 포함 : 4 + if (mjonMsgVO.getFileCnt().equals("0")) { // 단순 장문 문자 - spamSmishingPassStatus = true; + mjonMsgVO.setNeoType("2"); - } + } else { // 그림포함 문자인경우 - //전용 전송사가 지정되어 있으면 실행 - if(!hotlineAgentCode.equals("00")) { + mjonMsgVO.setNeoType("4"); + + } + + } + + // 문자내용 내용 - 치환 처리 + String smsTxt = mjonMsgVO.getSmsTxt(); // 발송 문자 내용 - MjonMsgAgentStsVO mjonMsgAgentStsVO = new MjonMsgAgentStsVO(); - mjonMsgAgentStsVO.setAgentCode(hotlineAgentCode); + // 일괄변환문자 리스트에서 콤마(,)를 특수문자(§)로 변환해서 넘겨받기 때문에 치환 처리를 해준도록 한다. + smsTxt = smsTxt.replaceAll(String.valueOf((char) 13), ""); + if (smsTxt.indexOf("[*이름*]") > -1) { + if (nameList.length > i && StringUtil.isNotEmpty(nameList[i])) { + smsTxt = smsTxt.replaceAll("\\[\\*이름\\*\\]", + StringUtil.getString(nameList[i].replaceAll("§", ","))); + } else { + smsTxt = smsTxt.replaceAll("\\[\\*이름\\*\\]", ""); + } + } - //문자 타입 셋팅 - if(msgType.equals("6")) { - int fCnt = Integer.parseInt(mjonMsgVO.getFileCnt()); - if(fCnt > 0) { + if (smsTxt.indexOf("[*1*]") > -1) { + if (rep1.length > i && StringUtil.isNotEmpty(rep1[i])) { + smsTxt = smsTxt.replaceAll("\\[\\*1\\*\\]", + StringUtil.getString(rep1[i].replaceAll("§", ","))); + } else { + smsTxt = smsTxt.replaceAll("\\[\\*1\\*\\]", ""); + } + } - mjonMsgAgentStsVO.setMsgType("P"); + if (smsTxt.indexOf("[*2*]") > -1) { + if (rep2.length > i && StringUtil.isNotEmpty(rep2[i])) { + smsTxt = smsTxt.replaceAll("\\[\\*2\\*\\]", + StringUtil.getString(rep2[i].replaceAll("§", ","))); + } else { + smsTxt = smsTxt.replaceAll("\\[\\*2\\*\\]", ""); + } + } + + if (smsTxt.indexOf("[*3*]") > -1) { + if (rep3.length > i && StringUtil.isNotEmpty(rep3[i])) { + smsTxt = smsTxt.replaceAll("\\[\\*3\\*\\]", + StringUtil.getString(rep3[i].replaceAll("§", ","))); + } else { + smsTxt = smsTxt.replaceAll("\\[\\*3\\*\\]", ""); + } + } + + if (smsTxt.indexOf("[*4*]") > -1) { + if (rep4.length > i && StringUtil.isNotEmpty(rep4[i])) { + smsTxt = smsTxt.replaceAll("\\[\\*4\\*\\]", + StringUtil.getString(rep4[i].replaceAll("§", ","))); + } else { + smsTxt = smsTxt.replaceAll("\\[\\*4\\*\\]", ""); + } + } - }else { - mjonMsgAgentStsVO.setMsgType("L"); - } + tempVO.setSmsTxt(smsTxt); - }else { - mjonMsgAgentStsVO.setMsgType("S"); - } + // 즉시 / 예약 전송 처리 + if (mjonMsgVO.getReserveYn().equals("N")) {// 즉시 전송의 경우 현재 시간을 입력 - List hotlineMsgAgentList = mjonMsgAgentStsDAO.selectMsgAgentListByAgentCode(mjonMsgAgentStsVO); + if (spamStatus.equals("Y") || smishingYn.equals("Y")) {// 스팸문자가 있거나, 스미싱 의심 회원의 경우 30분 지연시간을 입력해 + // 준다. - String mberAgentConde = ""; - String mberSendRate = ""; - String mberRepAgent = ""; + tempVO.setReqDate(mjonMsgVO.getReqDate());// 상단에서 스팸문구가 있는겨우 30분 딜레이시간을 입력해 두었기 때문에 같은 데이터를 + // 입력함. - for(MjonMsgAgentStsVO tmp : hotlineMsgAgentList) { + } else {// 일반 문자인 경우 현재시간을 입력해 준다. - mberAgentConde = tmp.getAgentCode(); - mberSendRate = tmp.getSendRate(); - mberRepAgent = tmp.getRepAgent(); - String useYn = tmp.getUseYn(); + Date now = new Date(); + SimpleDateFormat sdFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); + tempVO.setReqDate(sdFormat.format(now)); - if(userInfo.getBlineCode().equals("N")) { - //회원 전용 전송사의 전송 비율이 0 이면 대표전송사로 전송되도록 셋팅함. - if(mberSendRate.equals("0") || useYn.equals("N")) { + } - hotlineAgentCode = mberRepAgent; + } else { // 예약 발송의 경우 예약 시간을 입력 - } - } + // 분할 발송을 체크 한 경우 + if (mjonMsgVO.getDivideChk() != null) { - } + // 스팸문구 혹은 스미싱 의심 회원의 경우 30분 딜레이 처리해준다. + // 20230630 우영두 추가 + if (spamStatus.equals("Y") || smishingYn.equals("Y")) { - } + Date delayDate = transFormat.parse(dividDayList.get(i)); + cal.setTime(delayDate); + cal.add(Calendar.MINUTE, 30); + delayTime = transFormat.format(cal.getTime()); - /** - * Agent 추가시 셋팅하기 - * Agent 발송 비율 불러오기 - * 최초 : 아이하트(01), 현대 퓨쳐넷(02), 아이앰오(03) - * 22.10.12 : 비즈뿌리오(04) 추가 - * 23.04.10 : 제이제이(05) 추가 - * 23.05.02 : 인비토 (07) 추가 - * */ + tempVO.setReqDate(delayTime); // 분할 문자 예약 시간 입력해주기 - int iheartCnt = 0; //아이하트 전송갯수 - int hncCnt = 0; //현대퓨처넷 전송갯수 - int imoCnt = 0; //아이엠오 전송갯수 - int bizCnt = 0; //비즈뿌리오 전송갯수 - int jjCnt = 0; //제이제이 전송갯수 - int ivtCnt = 0; //인비토 전송갯수 + } else { - // 전송사별 발송 리스트 조회 - List sendRateList = mjonMsgDataDAO.selectSendAgentList(mjonMsgVO); + tempVO.setReqDate(dividDayList.get(i)); // 분할 문자 예약 시간 입력해주기 - if(callToCnt >= 10) { - // 전송사별 배분률 조회 - int sendRateSize = sendRateList.size(); + } - /** - * Agent 추가시 셋팅하기 - * - * 최초 : 아이하트(01), 현대 퓨쳐넷(02), 아이앰오(03) - * 22.10.12 : 비즈뿌리오(04) 추가 - * 23.04.10 : 제이제이(05) 추가 - * 23.05.02 : 인비토 (07) 추가 - * */ + } else {// 일반 예약 발송의 경우 - for(int i=0; i< sendRateSize; i++) { + if (spamStatus.equals("Y") || smishingYn.equals("Y")) {// 스팸문구 혹은 스미싱 의심 회원의 경우 30분 딜레이 + // 처리해준다. - String sndAgentCode = sendRateList.get(i).getAgentCode(); + Date delayDate = transFormat.parse(mjonMsgVO.getReqDate()); - if(sndAgentCode.equals("01")) {//아이하트 전송비율 + cal.setTime(delayDate); + cal.add(Calendar.MINUTE, 30); + delayTime = transFormat.format(cal.getTime()); - iheartCnt = Math.round(callToCnt * Float.parseFloat(sendRateList.get(i).getSendRate())); + tempVO.setReqDate(delayTime); - }else if(sndAgentCode.equals("02")) {//현대퓨처넷 전송비율 + } else { - hncCnt = Math.round(callToCnt * Float.parseFloat(sendRateList.get(i).getSendRate())); + tempVO.setReqDate(mjonMsgVO.getReqDate()); - }else if(sndAgentCode.equals("03")) {//아이엠오 전송비율 + } - imoCnt = Math.round(callToCnt * Float.parseFloat(sendRateList.get(i).getSendRate())); + } - }else if(sndAgentCode.equals("04")) {//비즈뿌리오 전송비율 + // 딜레이 처리되었을 수 있어서 임시 데이터의 발송 시간을 업데이트 해준다. + // 분할 발송일 경우 Loop을 돌기 때문에 마지막 시간이 reqDate에 들어가기 때문에 첫번째 데이터에서만 시간을 입력해 준다. + // mj_group_data 테이블의 reqdate 컬럼 값으로 셋팅 된다. + if (i == 0) { + frstDelayTime = tempVO.getReqDate(); + } + } - bizCnt = Math.round(callToCnt * Float.parseFloat(sendRateList.get(i).getSendRate())); + if (!msgType.equals("4")) { // 장문 혹은 그림문자일 경우 추가 - }else if(sndAgentCode.equals("05")) {//제이제이 전송비율 + /** + * 장문 / 그림문자 일 경우 제목 처리 만약 제목을 입력하지 않았을 경우 문자 내용의 텍스트 일부를 제목으로 사용 내용 텍스트가 없는 경우는 + * 어쩔수 없는 것으로 간주하여 Null로 처리한다. + * + */ + String contents = tempVO.getSmsTxt(); // 문자 내용 + if (StringUtil.isEmpty(mjonMsgVO.getMmsSubject()) || mjonMsgVO.getMmsSubject() == null) {// 제목 + // 입력이 + // 없는 + // 경우 - jjCnt = Math.round(callToCnt * Float.parseFloat(sendRateList.get(i).getSendRate())); + if (StringUtil.isNotEmpty(contents) && contents != null) {// 문자내용이 있는 경우 처리 - }else if(sndAgentCode.equals("07")) {//인비토 전송비율 + String[] split = contents.split("\n"); - ivtCnt = Math.round(callToCnt * Float.parseFloat(sendRateList.get(i).getSendRate())); + if (split.length > 0) { - } + String subject = ""; + String msgKind = mjonMsgVO.getMsgKind();// 문자 타입(일반, 광고, 선거문자) - } - } + // 선거문자인 경우 첫 글내용이 "(선거운동정보)"로 되어있어서 그 다음줄의 내용을 제목으로 사용 + /* + * if(subject.equals("(선거운동정보)")) { subject = split[1].trim(); } + */ - /** - * 한번에 서버가 보낼수 있는 문자건수를 체크 해서 넘으면 분할해서 디비 입렵해 준다. - * 발송 건수가 천 건이 넘어가면, 백건씩 끊어서 발송 하도록 한다. - * */ + if (msgKind.equals("C")) { + if (split.length > 1) { + subject = split[1].trim(); + } else { + subject = split[0].substring(0, 20); + } + } else { + subject = split[0].trim(); + } - if(callToCnt >= 10000) { + // 제목 글자수 20글자로 제한. + /* + * if(subject.length() > 20) { subject = subject.substring(0,20); } + * tempVO.setMmsSubject(subject); mjonMsgVO.setMmsSubject(subject); + */ - limitCnt = 1000; + } - } + } - //수신자 리스트 처리 - List msgDataInfo = new ArrayList(); + } else {// 제목 입력이 있는 경우 입력한 제목으로 셋팅 + tempVO.setMmsSubject(mjonMsgVO.getMmsSubject()); + } - int cnt = 1; - int totCnt = 1; + tempVO.setFileCnt(mjonMsgVO.getFileCnt()); + tempVO.setFileName1(mjonMsgVO.getFileName1()); + tempVO.setFileName2(mjonMsgVO.getFileName2()); + tempVO.setFileName3(mjonMsgVO.getFileName3()); + tempVO.setNeoType(mjonMsgVO.getNeoType()); + tempVO.setContSeq(mjonMsgVO.getContSeq()); - //분할문자 시간에 간격시간 더해주기 - String dividDay = null; - Calendar cal = Calendar.getInstance(); + } - //예약시간 변환 - SimpleDateFormat transFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); + // 아이하트 전송사의 LMS(장문) / MMS(그림문자) 전송시 컨텐츠 번호 받아오기 먼저 처리 + if (agentCode.equals("01") && msgType.equals("6")) { - int turmMin = 0; - int totalCallCnt = 0; - int divideCnt = 0; - int count = 1; //분할 카운트 - String delayTime ="";//30분 지연시간 - String spamStatus = mjonMsgVO.getSpamStatus();//스팸 문구 유무 - String smishingYn = mjonMsgVO.getSmishingYn();//스미싱 의심 유무 - String delayYn = "N"; //문자발송 30분 지연 처리 유무 + // 아이하트 MMS Contents 테이블에 입력 후 컨텐츠 아이디 받아오기 - if(spamStatus == null || spamStatus.equals("")) { + // 이미지가 있는경우 file_type, file_Cnt 값 셋팅 + int fileCnt = Integer.parseInt(mjonMsgVO.getFileCnt()); + String contents = mjonMsgVO.getSmsTxt(); - spamStatus = "N"; + if (fileCnt > 0) { + tempVO.setFileType1("IMG"); // 아이하트 그림문자 전송시 파일종류 이미지로 셋팅 - } + // 그림문자일 경우 이미지 갯수 + 1을 해줘야한다. (+1은 컨텐츠 내용을 의미한다.) + if (StringUtil.isNotEmpty(contents)) { + fileCnt = fileCnt + 1; + } + tempVO.setFileCnt(Integer.toString(fileCnt)); - if(smishingYn == null || smishingYn.equals("")) { + } else { + tempVO.setFileCnt("1"); + } - smishingYn = "N"; + contSeq = mjonMsgDataDAO.insertIHeartMmsMsgContentsInfo(tempVO); + mjonMsgVO.setContSeq(contSeq); + tempVO.setSmsTxt(smsTxt); + tempVO.setContSeq(contSeq); - } + } - //야간 스미싱 알림여부가 활성화 이고 예외시간에 포함되는 경우 스팸, 스미싱, 딜레이 값을 모두 N 으로 처리 - if(spamSmishingPassStatus) { + // 문자 내용 추가해 주기 + msgDataInfo.add(tempVO); - spamStatus = "N"; - smishingYn = "N"; - delayYn = "N"; + } // 수신거부 처리로직 끝 - } + int instCnt = 0; + // 지금까지 루프 돌아간 것이 전체 수신자 갯수와 같으면 추가가 완료된 것으로 판단 되어 전송 해줌 + if (totCnt == callToCnt) { + if (msgDataInfo.size() > 0) { - if(!mjonMsgVO.getReserveYn().equals("N")) {//예약문자인 경우 시간 셋팅 + // 데이터 디비 입력해주기 + instCnt = mjonMsgDataDAO.insertMsgDataInfo(msgDataInfo, msgType, agentCode); - Date toDate = transFormat.parse(mjonMsgVO.getReqDate()); - cal.setTime(toDate); //예약 시간 캘린터 변수에 입력 + } - //String 타입 시간 Int로 변환 - turmMin = Integer.parseInt(mjonMsgVO.getDivideTime()); //분할발송 시간 간격 - dividDay = transFormat.format(cal.getTime()); + // 총 디비 입력 건수 저장하기 + resultCnt = resultCnt + instCnt; - totalCallCnt = mjonMsgVO.getCallToList().length; // 수신자 전체 갯수 - divideCnt = Integer.parseInt(mjonMsgVO.getDivideCnt()); //분할 발송 갯수 + } else { - if(spamStatus.equals("Y") || smishingYn.equals("Y")) { + // 특정 건수 이상일 경우 분할해서 디비에 넣어준다. + if (cnt == limitCnt) { - mjonMsgVO.setDelayYn("Y");//일단 값만 등록해준다. 이거 안해주면 NULL 값으로 들어간다. 차후에 변경하도록 할 예정임, 원래는 스팸이면 Y로 넣어줘야한다. + if (msgDataInfo.size() > 0) { - }else { + // 분할 최대건수가 되면 디비에 입력하기 + instCnt = mjonMsgDataDAO.insertMsgDataInfo(msgDataInfo, msgType, agentCode); - mjonMsgVO.setDelayYn("N");//일단 값만 등록해준다. 이거 안해주면 NULL 값으로 들어간다. 차후에 변경하도록 할 예정임 - } + } - }else {//즉시발송의 경우 현재 시간으로 입력해 준다. + // 총 디비 입력 건수 저장하기 + resultCnt = resultCnt + instCnt; + cnt = 0; - Date now = new Date(); - if(spamStatus.equals("Y") || smishingYn.equals("Y")) {//스팸 문자가 포함되었거나, 스미싱 의심 회원의 경우 문자발송 시간을 30분 딜레이 시킨다. + // List 초기화 하기 + msgDataInfo.clear(); - String nowDate = transFormat.format(now); - Date toDate = transFormat.parse(nowDate); - System.out.println("++++++++++++++++++++ origin reqDate ::: "+toDate); - cal.setTime(toDate); + } - cal.add(Calendar.MINUTE, 30); - delayTime = transFormat.format(cal.getTime()); - mjonMsgVO.setReqDate(delayTime); - System.out.println("++++++++++++++++++++ delay reqDate ::: "+mjonMsgVO.getReqDate()); - delayYn = "Y"; - mjonMsgVO.setDelayYn(delayYn);//문자 발송 30분 지연 코드 셋팅 + } - }else {//정상적인 문자인 경우 즉시발송 처리해준다. + cnt++; + totCnt++; - mjonMsgVO.setReqDate(transFormat.format(now)); - mjonMsgVO.setDelayYn(delayYn);//문자 발송 30분 지연 디폴트 값 셋팅(N) + } - } + /* + * 각 처리 건별로 캐시 차감 및 그룹 데이터 정보 업데이트 1. 디비에 입력한 건수만큼 캐시 차감 및 회원 캐시 정보 업데이트 2. + * 그룹데이터에 처리 건수 업데이트(총 발송건수 합산 정보 업데이트) + * + */ - } + // 문자 발송 캐시 차감 해주기 + MjonPayVO mjonPayVO = new MjonPayVO(); + /* + * if(resultCnt > 0 && blockCnt > 0) { + * + * Float blockPrice = Float.parseFloat(mjonMsgVO.getEachPrice()) * blockCnt; + * Float resultTotPrice = Float.parseFloat(mjonMsgVO.getTotPrice()); Float + * endPrice = resultTotPrice - blockPrice; + * + * mjonMsgVO.setTotPrice(Float.toString(endPrice)); + * + * //수신거부가 있는 경우 총 건수에서 수신거부 건수를 차감 후 그룹 테이블에 업데이트 해준다. int groupCnt = + * resultCnt; mjonMsgVO.setMsgGroupCnt(Integer.toString(groupCnt)); + * + * //mjonMsgDAO.updateGroupMsgData(mjonMsgVO); + * + * } + */ - String[] nameList = mjonMsgVO.getNameList(); //치환 이름 리스트 - String[] phoneList = mjonMsgVO.getCallToList(); //받는사람 연락처 리스트 - String[] rep1 = mjonMsgVO.getRep1List(); //치환 문자1 리스트 - String[] rep2 = mjonMsgVO.getRep2List(); //치환 문자2 리스트 - String[] rep3 = mjonMsgVO.getRep3List(); //치환 문자3 리스트 - String[] rep4 = mjonMsgVO.getRep4List(); //치환 문자4 리스트 + // 1건 이상 발송이 있는 경우만 캐쉬를 차감 시킨다. + if (resultCnt > 0) { - //Controller에서 전달 받은 분할 시간 정보 리스트 - List dividDayList = mjonMsgVO.getDividDay(); + int totSendCnt = mjonMsgVO.getTotalCallCnt(); + Float eachPrice = Float.parseFloat(mjonMsgVO.getEachPrice()); + Float totPrice = eachPrice * resultCnt; + String strTotPrice = String.format("%.1f", totPrice); - String frstDelayTime = mjonMsgVO.getReqDate(); - //문자발송 리스트 생성 시작 - for(int i = 0; i < callToCnt; i++) { + mjonMsgVO.setTotPrice(strTotPrice);// 현재 합산 금액 셋팅 + mjonPayVO.setCashId(idgenMjonCashId.getNextStringId()); + mjonPayVO.setUserId(mjonMsgVO.getUserId()); + mjonPayVO.setCash(-Float.parseFloat(strTotPrice)); + mjonPayVO.setFrstRegisterId(mjonMsgVO.getUserId()); + mjonPayVO.setMemo("SMS 문자 총 " + totSendCnt + "건 중 " + resultCnt + "건 발송"); + mjonPayVO.setMsgGroupId(mjonMsgVO.getMsgGroupId()); - Boolean blockSts = false; - for(int j = 0; j < usrBlockCnt; j++) { + mjonPayService.insertCash(mjonPayVO); // 캐시차감 + mjonPayService.updateMemberCash(mjonPayVO); // 회원정보 업데이트 + } - if(phoneList[i].equals(dupliBlockList.get(j).toString())) { + // 문자 발송 테이블에 입력 데이터가 있는 경우 그룹 테이블에도 입력 해 준다. + if (resultCnt > 0) { - blockCnt++; //수신 차단 카운드를 해준다. - blockSts = true; + // 문자 전송 그룹 테이블에 정보 입력 + int groupCnt = resultCnt; + mjonMsgVO.setMsgGroupCnt(Integer.toString(groupCnt)); + // mjonMsgService.insertGroupMsgData(mjonMsgVO); + int msgGroupDataCnt = mjonMsgDAO.selectMsgGroupDataCntByGroupId(mjonMsgVO); - } + // 메세지 그룹 데이터가 없으면 추가 해주고 있으면 총메세지 건수를 합산해준다. + if (msgGroupDataCnt < 1) { + mjonMsgVO.setAgentCode(agentCode);// 전송사 코드 번호를 셋팅해 준다. + + // 지연 유무 코드가 Null 인경우 체크 + String tmpDelayYn = mjonMsgVO.getDelayYn(); + if (tmpDelayYn == null) { + mjonMsgVO.setDelayYn("N"); + } + + // 예약 문자이고 30분 지연이 된 문자의 Mj_msg_group_data 테이블의 req_date 시간을 첫번째 문자의 지연된 시간으로 + // 셋팅해준다. + if (mjonMsgVO.getReserveYn().equals("Y") && (spamStatus.equals("Y") || smishingYn.equals("Y"))) { + + mjonMsgVO.setReqDate(frstDelayTime); + + } + mjonMsgDAO.insertGroupMsgData(mjonMsgVO); + + try { + + // 야간 스미싱 알림이 활성화이고 알림 예외 일정에 포함되고 스팸 또는 스미싱 의심 상태일 경우 문자정보 별도 저장처리 - 20240821 + // 우영두 추가 + if (holiSmishingNoti.equals("Y") && spamSmishingPassStatus + && (mjonMsgVO.getSpamStatus().equals("Y") || mjonMsgVO.getSmishingYn().equals("Y"))) { + mjonMsgDAO.insertSpamPassMsgData(mjonMsgVO); + } + + } catch (Exception e) { + System.out.println( + "++++++++++++++++++++++++++++++ spamSmishingPassStatus 문자전송 야간 스미싱 알림 데이터 입력 오류 발생 !!!!"); + } + + } else { + mjonMsgDAO.updateMsgGroupDataForTotCntSum(mjonMsgVO); + } + + // 이벤트 회원 남은 캐시 업데이트 + fnUpdateEventRemainCash(mjonPayVO); + + } + + // 성공 + returnVO.setSendMsgCnt(Integer.toString(resultCnt)); // 발송 건수 저장 + returnVO.setSendMsgBlockCnt(Integer.toString(blockCnt)); // 수신차단 건수 저장 + returnVO.setAgentCode(agentCode); + + + + }catch (Exception e) { + // 실패 + returnVO.setSendMsgCnt(Integer.toString(0)); // 발송 건수 저장 + returnVO.setSendMsgBlockCnt(Integer.toString(0)); // 수신차단 건수 저장 + returnVO.setAgentCode("01"); + + System.out.println("========================================================================="); + System.out.println("+++++++++++++++++++++++++++++ 문자발송 ==> insertMsgDataInfo ERROR !!! : " + e); + System.out.println("========================================================================="); + return returnVO; + } + return returnVO; + } - } - if(!blockSts) { //수신거부가 아니면 추가 + public MjonMsgReturnVO insertMsgDataInfo(MjonMsgVO mjonMsgVO) throws Exception { + + MjonMsgReturnVO returnVO = new MjonMsgReturnVO(); - MjonMsgVO tempVO = new MjonMsgVO(); + try { + String msgType = mjonMsgVO.getMsgType(); + String agentCode = mjonMsgVO.getAgentCode(); + // 장문 전송 + String contSeq = ""; - /** - * Agent 추가시 셋팅하기 - * - * 최초 : 아이하트(01), 현대 퓨쳐넷(02), 아이앰오(03) - * 22.10.12 : 비즈뿌리오(04) 추가 - * 23.04.10 : 제이제이(05) 추가 - * 23.05.02 : 인비토 (07) 추가 - * 23.05.09 : 회원 전용 전송사 정보가 있으면 모든 문자를 전용 전송사로 발송처리함. - * */ + // 최종 입력 수 저장 변수 + int resultCnt = 0; + int limitCnt = 1000; + int blockCnt = 0; - if(hotlineAgentCode.equals("00")) {//전용 전송사가 사용 안함인 경우 분배 및 대표 전송사로 설정 - if(iheartCnt > 0) { - agentCode = "01"; - tempVO.setAgentCode(agentCode); - iheartCnt--; - }else if(hncCnt > 0) { - agentCode = "02"; - tempVO.setAgentCode(agentCode); - hncCnt--; - }else if(imoCnt > 0) { - agentCode = "03"; - tempVO.setAgentCode(agentCode); - imoCnt--; - }else if(bizCnt > 0) { - agentCode = "04"; - tempVO.setAgentCode(agentCode); - bizCnt--; - }else if(jjCnt > 0) { - agentCode = "05"; - tempVO.setAgentCode(agentCode); - jjCnt--; - }else if(ivtCnt > 0) { - agentCode = "07"; - tempVO.setAgentCode(agentCode); - ivtCnt--; - }else {//전송사 Agent 대표 전송사로 지정한다. + int callToCnt = mjonMsgVO.getCallToList().length; // 전체 받는사람 건수 - agentCode = sendRateList.get(0).getRepAgent(); - tempVO.setAgentCode(agentCode); - } + mjonMsgVO.setMsgGroupCnt(Integer.toString(callToCnt)); - }else {//전용 전송사가 지정되어 있는 경우 전용 전송사로 지정 - - agentCode = hotlineAgentCode; - tempVO.setAgentCode(hotlineAgentCode); - } - //Agent 셋팅 끝 - - tempVO.setMsgId(idgenMsgId.getNextStringId()); - tempVO.setUserId(mjonMsgVO.getUserId()); - tempVO.setCallTo(phoneList[i]); - tempVO.setCallFrom(mjonMsgVO.getCallFrom()); - tempVO.setMsgType(mjonMsgVO.getMsgType()); - tempVO.setMsgGroupId(mjonMsgVO.getMsgGroupId()); - tempVO.setMsgCnt(mjonMsgVO.getMsgCnt()); + // 그룹 테이블에 입력할 발송 시간 및 예약 발송 시간 처리 + /* + * if(mjonMsgVO.getReserveYn().equals("N")) {//즉시 전송의 경우 현재 시간을 입력 + * + * Date now = new Date(); + * + * SimpleDateFormat sdFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); + * + * mjonMsgVO.setReqDate(sdFormat.format(now)); + * + * } + */ - //아이엠오 전송사 문자 타입 설정해 주기 - if(agentCode.equals("03")) { + // 사용자 현재 보유 금액 불러오기(문자 발송 금액 차감 이전 금액) + String befCash = mjonMsgVO.getBefCash(); - // 단순 장문 문자는 neoType : 2, 그림 포함 : 4 - if(mjonMsgVO.getFileCnt().equals("0")) { // 단순 장문 문자 + // VO에서 현재 보유금액이 없으면 디비에서 조회해서 불러옴 + if ("".equals(befCash) || befCash == null) { + befCash = mjonMsgDataDAO.selectBeforeCashData(mjonMsgVO); + } - mjonMsgVO.setNeoType("2"); + mjonMsgVO.setBefCash(befCash); + // 문자 전송 그룹 테이블에 정보 입력 + // mjonMsgDAO.insertGroupMsgData(mjonMsgVO); - }else{ // 그림포함 문자인경우 + // 수신거부 목록 불러오기 + List userBlockList = mjonMsgDAO.selectUserBlockList(mjonMsgVO); - mjonMsgVO.setNeoType("4"); + List dupliBlockList = MJUtil.getDuplicateList(userBlockList); + int usrBlockCnt = dupliBlockList.size(); - } + // 회원 전용 전송사 정보 불러오기 + MberManageVO userInfo = mjonMsgDataDAO.selectMberManageInfo(mjonMsgVO.getUserId()); + String hotlineAgentCode = userInfo.getHotlineAgentCode(); - } + // 야간스미싱 알림여부 정보(관리자 알림관리 상태 정보를 모두 불러옴) 불러오기 20240722 우영두 추가 + JoinSettingVO joinSettingVO = siteManagerDAO.selectAdminNotiDetail(); + String holiSmishingNoti = joinSettingVO.getHoliSmishingNoti(); - //문자내용 내용 - 치환 처리 - String smsTxt = mjonMsgVO.getSmsTxt(); //발송 문자 내용 + // 스팸,스미싱이어도 딜레이없이 문자 전송을 처리할지 선택 상태값 변수 + boolean spamSmishingPassStatus = false; // 야간스미싱 알림여부가 활성화인 경우 false, 비활성화인경우 true 값을 가지도록 한다. - //일괄변환문자 리스트에서 콤마(,)를 특수문자(§)로 변환해서 넘겨받기 때문에 치환 처리를 해준도록 한다. - smsTxt = smsTxt.replaceAll(String.valueOf((char)13), ""); - if (smsTxt.indexOf("[*이름*]") > -1) { - if(nameList.length > i && StringUtil.isNotEmpty(nameList[i])) { - smsTxt = smsTxt.replaceAll("\\[\\*이름\\*\\]", StringUtil.getString(nameList[i].replaceAll("§", ","))); - }else { - smsTxt = smsTxt.replaceAll("\\[\\*이름\\*\\]", ""); - } - } + // 스팸, 스미싱 상태인 경우에만 true 처리 + // 야간스미싱알리 여부가 활성화 인경우 무조건 문자를 즉시 보내도록 한다. + // 스미싱 알림 일정에 등록된 날짜와 시간에 포함되면 30분 딜레이 없이 발송 처리하도록 함. + if (holiSmishingNoti.equals("Y")) { - if (smsTxt.indexOf("[*1*]") > -1) { - if(rep1.length > i && StringUtil.isNotEmpty(rep1[i])) { - smsTxt = smsTxt.replaceAll("\\[\\*1\\*\\]", StringUtil.getString(rep1[i].replaceAll("§", ","))); - }else { - smsTxt = smsTxt.replaceAll("\\[\\*1\\*\\]", ""); - } - } + MsgAlarmSetVO msgAlarmSetVO = new MsgAlarmSetVO(); - if (smsTxt.indexOf("[*2*]") > -1) { - if(rep2.length > i && StringUtil.isNotEmpty(rep2[i])) { - smsTxt = smsTxt.replaceAll("\\[\\*2\\*\\]", StringUtil.getString(rep2[i].replaceAll("§", ","))); - }else { - smsTxt = smsTxt.replaceAll("\\[\\*2\\*\\]", ""); - } - } + msgAlarmSetVO.setUseYn("Y"); + msgAlarmSetVO.setFirstIndex(0); - if (smsTxt.indexOf("[*3*]") > -1) { - if(rep3.length > i && StringUtil.isNotEmpty(rep3[i])) { - smsTxt = smsTxt.replaceAll("\\[\\*3\\*\\]", StringUtil.getString(rep3[i].replaceAll("§", ","))); - }else { - smsTxt = smsTxt.replaceAll("\\[\\*3\\*\\]", ""); - } - } + List resultAlarmList = msgHolidayDAO.selectAlarmSettingList(msgAlarmSetVO); - if (smsTxt.indexOf("[*4*]") > -1) { - if(rep4.length > i && StringUtil.isNotEmpty(rep4[i])) { - smsTxt = smsTxt.replaceAll("\\[\\*4\\*\\]", StringUtil.getString(rep4[i].replaceAll("§", ","))); - }else { - smsTxt = smsTxt.replaceAll("\\[\\*4\\*\\]", ""); - } - } + Calendar calendar = Calendar.getInstance(); + int year = calendar.get(Calendar.YEAR); - tempVO.setSmsTxt(smsTxt); + MsgHolidayVO msgHolidayVO = new MsgHolidayVO(); + msgHolidayVO.setFirstIndex(0); + msgHolidayVO.setRecordCountPerPage(100); + msgHolidayVO.setSearchHoliYear(Integer.toString(year)); - //즉시 / 예약 전송 처리 - if(mjonMsgVO.getReserveYn().equals("N")) {//즉시 전송의 경우 현재 시간을 입력 + List resultHolidayList = msgHolidayDAO.selectMsgHolidayList(msgHolidayVO); - if(spamStatus.equals("Y") || smishingYn.equals("Y")) {//스팸문자가 있거나, 스미싱 의심 회원의 경우 30분 지연시간을 입력해 준다. + MjonHolidayApi mjonHolidayApi = new MjonHolidayApi(); - tempVO.setReqDate(mjonMsgVO.getReqDate());//상단에서 스팸문구가 있는겨우 30분 딜레이시간을 입력해 두었기 때문에 같은 데이터를 입력함. + boolean smishingAlarmPassSts = mjonHolidayApi.getHolidaySmishingPassStatus(resultAlarmList, + resultHolidayList); + spamSmishingPassStatus = smishingAlarmPassSts; + } else { - }else {//일반 문자인 경우 현재시간을 입력해 준다. + spamSmishingPassStatus = true; - Date now = new Date(); - SimpleDateFormat sdFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); - tempVO.setReqDate(sdFormat.format(now)); + } - } + // 전용 전송사가 지정되어 있으면 실행 + if (!hotlineAgentCode.equals("00")) { - }else { // 예약 발송의 경우 예약 시간을 입력 + MjonMsgAgentStsVO mjonMsgAgentStsVO = new MjonMsgAgentStsVO(); + mjonMsgAgentStsVO.setAgentCode(hotlineAgentCode); - //분할 발송을 체크 한 경우 - if(mjonMsgVO.getDivideChk() != null) { + // 문자 타입 셋팅 + if (msgType.equals("6")) { + int fCnt = Integer.parseInt(mjonMsgVO.getFileCnt()); + if (fCnt > 0) { - //스팸문구 혹은 스미싱 의심 회원의 경우 30분 딜레이 처리해준다. - //20230630 우영두 추가 - if(spamStatus.equals("Y") || smishingYn.equals("Y")) { + mjonMsgAgentStsVO.setMsgType("P"); - Date delayDate = transFormat.parse(dividDayList.get(i)); + } else { + mjonMsgAgentStsVO.setMsgType("L"); + } - cal.setTime(delayDate); - cal.add(Calendar.MINUTE, 30); - delayTime = transFormat.format(cal.getTime()); + } else { + mjonMsgAgentStsVO.setMsgType("S"); + } - tempVO.setReqDate(delayTime); //분할 문자 예약 시간 입력해주기 + List hotlineMsgAgentList = mjonMsgAgentStsDAO + .selectMsgAgentListByAgentCode(mjonMsgAgentStsVO); - }else { + String mberAgentConde = ""; + String mberSendRate = ""; + String mberRepAgent = ""; - tempVO.setReqDate(dividDayList.get(i)); //분할 문자 예약 시간 입력해주기 + for (MjonMsgAgentStsVO tmp : hotlineMsgAgentList) { - } + mberAgentConde = tmp.getAgentCode(); + mberSendRate = tmp.getSendRate(); + mberRepAgent = tmp.getRepAgent(); + String useYn = tmp.getUseYn(); + if (userInfo.getBlineCode().equals("N")) { + // 회원 전용 전송사의 전송 비율이 0 이면 대표전송사로 전송되도록 셋팅함. + if (mberSendRate.equals("0") || useYn.equals("N")) { - }else {//일반 예약 발송의 경우 + hotlineAgentCode = mberRepAgent; - if(spamStatus.equals("Y") || smishingYn.equals("Y")) {//스팸문구 혹은 스미싱 의심 회원의 경우 30분 딜레이 처리해준다. + } + } - Date delayDate = transFormat.parse(mjonMsgVO.getReqDate()); + } - cal.setTime(delayDate); - cal.add(Calendar.MINUTE, 30); - delayTime = transFormat.format(cal.getTime()); + } - tempVO.setReqDate(delayTime); + /** + * Agent 추가시 셋팅하기 Agent 발송 비율 불러오기 최초 : 아이하트(01), 현대 퓨쳐넷(02), 아이앰오(03) 22.10.12 + * : 비즈뿌리오(04) 추가 23.04.10 : 제이제이(05) 추가 23.05.02 : 인비토 (07) 추가 + */ - }else { + int iheartCnt = 0; // 아이하트 전송갯수 + int hncCnt = 0; // 현대퓨처넷 전송갯수 + int imoCnt = 0; // 아이엠오 전송갯수 + int bizCnt = 0; // 비즈뿌리오 전송갯수 + int jjCnt = 0; // 제이제이 전송갯수 + int ivtCnt = 0; // 인비토 전송갯수 - tempVO.setReqDate(mjonMsgVO.getReqDate()); + // 전송사별 발송 리스트 조회 + List sendRateList = mjonMsgDataDAO.selectSendAgentList(mjonMsgVO); - } + if (callToCnt >= 10) { + // 전송사별 배분률 조회 + int sendRateSize = sendRateList.size(); - } + /** + * Agent 추가시 셋팅하기 + * + * 최초 : 아이하트(01), 현대 퓨쳐넷(02), 아이앰오(03) 22.10.12 : 비즈뿌리오(04) 추가 23.04.10 : + * 제이제이(05) 추가 23.05.02 : 인비토 (07) 추가 + */ - //딜레이 처리되었을 수 있어서 임시 데이터의 발송 시간을 업데이트 해준다. - //분할 발송일 경우 Loop을 돌기 때문에 마지막 시간이 reqDate에 들어가기 때문에 첫번째 데이터에서만 시간을 입력해 준다. - //mj_group_data 테이블의 reqdate 컬럼 값으로 셋팅 된다. - if(i==0) { - frstDelayTime = tempVO.getReqDate(); - } - } + for (int i = 0; i < sendRateSize; i++) { - if(!msgType.equals("4")) { // 장문 혹은 그림문자일 경우 추가 + String sndAgentCode = sendRateList.get(i).getAgentCode(); - /** - * 장문 / 그림문자 일 경우 제목 처리 - * 만약 제목을 입력하지 않았을 경우 문자 내용의 텍스트 일부를 제목으로 사용 - * 내용 텍스트가 없는 경우는 어쩔수 없는 것으로 간주하여 Null로 처리한다. - * - * */ - String contents = tempVO.getSmsTxt(); //문자 내용 - if(StringUtil.isEmpty(mjonMsgVO.getMmsSubject()) || mjonMsgVO.getMmsSubject() == null) {// 제목 입력이 없는 경우 + if (sndAgentCode.equals("01")) {// 아이하트 전송비율 - if(StringUtil.isNotEmpty(contents) && contents != null) {//문자내용이 있는 경우 처리 + iheartCnt = Math.round(callToCnt * Float.parseFloat(sendRateList.get(i).getSendRate())); - String[] split = contents.split("\n"); + } else if (sndAgentCode.equals("02")) {// 현대퓨처넷 전송비율 - if(split.length > 0) { + hncCnt = Math.round(callToCnt * Float.parseFloat(sendRateList.get(i).getSendRate())); - String subject = ""; - String msgKind = mjonMsgVO.getMsgKind();//문자 타입(일반, 광고, 선거문자) + } else if (sndAgentCode.equals("03")) {// 아이엠오 전송비율 - //선거문자인 경우 첫 글내용이 "(선거운동정보)"로 되어있어서 그 다음줄의 내용을 제목으로 사용 - /*if(subject.equals("(선거운동정보)")) { - subject = split[1].trim(); - }*/ + imoCnt = Math.round(callToCnt * Float.parseFloat(sendRateList.get(i).getSendRate())); - if(msgKind.equals("C")) { - if(split.length > 1) { - subject = split[1].trim(); - }else { - subject = split[0].substring(0,20); - } - }else { - subject = split[0].trim(); - } + } else if (sndAgentCode.equals("04")) {// 비즈뿌리오 전송비율 - //제목 글자수 20글자로 제한. - /*if(subject.length() > 20) { - subject = subject.substring(0,20); - } - tempVO.setMmsSubject(subject); - mjonMsgVO.setMmsSubject(subject); - */ + bizCnt = Math.round(callToCnt * Float.parseFloat(sendRateList.get(i).getSendRate())); - } + } else if (sndAgentCode.equals("05")) {// 제이제이 전송비율 - } + jjCnt = Math.round(callToCnt * Float.parseFloat(sendRateList.get(i).getSendRate())); - }else {// 제목 입력이 있는 경우 입력한 제목으로 셋팅 - tempVO.setMmsSubject(mjonMsgVO.getMmsSubject()); - } + } else if (sndAgentCode.equals("07")) {// 인비토 전송비율 - tempVO.setFileCnt(mjonMsgVO.getFileCnt()); - tempVO.setFileName1(mjonMsgVO.getFileName1()); - tempVO.setFileName2(mjonMsgVO.getFileName2()); - tempVO.setFileName3(mjonMsgVO.getFileName3()); - tempVO.setNeoType(mjonMsgVO.getNeoType()); - tempVO.setContSeq(mjonMsgVO.getContSeq()); + ivtCnt = Math.round(callToCnt * Float.parseFloat(sendRateList.get(i).getSendRate())); - } + } - //아이하트 전송사의 LMS(장문) / MMS(그림문자) 전송시 컨텐츠 번호 받아오기 먼저 처리 - if(agentCode.equals("01") && msgType.equals("6")) { + } + } - // 아이하트 MMS Contents 테이블에 입력 후 컨텐츠 아이디 받아오기 + /** + * 한번에 서버가 보낼수 있는 문자건수를 체크 해서 넘으면 분할해서 디비 입렵해 준다. 발송 건수가 천 건이 넘어가면, 백건씩 끊어서 발송 + * 하도록 한다. + */ - //이미지가 있는경우 file_type, file_Cnt 값 셋팅 - int fileCnt = Integer.parseInt(mjonMsgVO.getFileCnt()); - String contents = mjonMsgVO.getSmsTxt(); + if (callToCnt >= 10000) { - if(fileCnt > 0) { - tempVO.setFileType1("IMG"); //아이하트 그림문자 전송시 파일종류 이미지로 셋팅 + limitCnt = 1000; - //그림문자일 경우 이미지 갯수 + 1을 해줘야한다. (+1은 컨텐츠 내용을 의미한다.) - if(StringUtil.isNotEmpty(contents)) { - fileCnt = fileCnt + 1; - } - tempVO.setFileCnt(Integer.toString(fileCnt)); + } - }else { - tempVO.setFileCnt("1"); - } + // 수신자 리스트 처리 + List msgDataInfo = new ArrayList(); - contSeq = mjonMsgDataDAO.insertIHeartMmsMsgContentsInfo(tempVO); - mjonMsgVO.setContSeq(contSeq); - tempVO.setSmsTxt(smsTxt); - tempVO.setContSeq(contSeq); + int cnt = 1; + int totCnt = 1; - } + // 분할문자 시간에 간격시간 더해주기 + String dividDay = null; + Calendar cal = Calendar.getInstance(); - //문자 내용 추가해 주기 - msgDataInfo.add(tempVO); + // 예약시간 변환 + SimpleDateFormat transFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); - }//수신거부 처리로직 끝 + int turmMin = 0; + int totalCallCnt = 0; + int divideCnt = 0; + int count = 1; // 분할 카운트 + String delayTime = "";// 30분 지연시간 + String spamStatus = mjonMsgVO.getSpamStatus();// 스팸 문구 유무 + String smishingYn = mjonMsgVO.getSmishingYn();// 스미싱 의심 유무 + String delayYn = "N"; // 문자발송 30분 지연 처리 유무 - int instCnt = 0; - //지금까지 루프 돌아간 것이 전체 수신자 갯수와 같으면 추가가 완료된 것으로 판단 되어 전송 해줌 - if(totCnt == callToCnt) { + if (spamStatus == null || spamStatus.equals("")) { - if(msgDataInfo.size() > 0) { + spamStatus = "N"; - //데이터 디비 입력해주기 - instCnt = mjonMsgDataDAO.insertMsgDataInfo(msgDataInfo, msgType, agentCode); + } - } + if (smishingYn == null || smishingYn.equals("")) { - //총 디비 입력 건수 저장하기 - resultCnt = resultCnt + instCnt; + smishingYn = "N"; - }else { + } - //특정 건수 이상일 경우 분할해서 디비에 넣어준다. - if(cnt == limitCnt) { + // 야간 스미싱 알림여부가 활성화 이고 예외시간에 포함되는 경우 스팸, 스미싱, 딜레이 값을 모두 N 으로 처리 + if (spamSmishingPassStatus) { - if(msgDataInfo.size() > 0) { + spamStatus = "N"; + smishingYn = "N"; + delayYn = "N"; - //분할 최대건수가 되면 디비에 입력하기 - instCnt = mjonMsgDataDAO.insertMsgDataInfo(msgDataInfo, msgType, agentCode); + } - } + if (!mjonMsgVO.getReserveYn().equals("N")) {// 예약문자인 경우 시간 셋팅 - //총 디비 입력 건수 저장하기 - resultCnt = resultCnt + instCnt; - cnt = 0; + Date toDate = transFormat.parse(mjonMsgVO.getReqDate()); + cal.setTime(toDate); // 예약 시간 캘린터 변수에 입력 - //List 초기화 하기 - msgDataInfo.clear(); + // String 타입 시간 Int로 변환 + turmMin = Integer.parseInt(mjonMsgVO.getDivideTime()); // 분할발송 시간 간격 + dividDay = transFormat.format(cal.getTime()); - } + totalCallCnt = mjonMsgVO.getCallToList().length; // 수신자 전체 갯수 + divideCnt = Integer.parseInt(mjonMsgVO.getDivideCnt()); // 분할 발송 갯수 - } + if (spamStatus.equals("Y") || smishingYn.equals("Y")) { - cnt++; - totCnt++; + mjonMsgVO.setDelayYn("Y");// 일단 값만 등록해준다. 이거 안해주면 NULL 값으로 들어간다. 차후에 변경하도록 할 예정임, 원래는 스팸이면 Y로 + // 넣어줘야한다. - } + } else { - /* - * 각 처리 건별로 캐시 차감 및 그룹 데이터 정보 업데이트 - * 1. 디비에 입력한 건수만큼 캐시 차감 및 회원 캐시 정보 업데이트 - * 2. 그룹데이터에 처리 건수 업데이트(총 발송건수 합산 정보 업데이트) - * - * */ + mjonMsgVO.setDelayYn("N");// 일단 값만 등록해준다. 이거 안해주면 NULL 값으로 들어간다. 차후에 변경하도록 할 예정임 + } - //문자 발송 캐시 차감 해주기 - MjonPayVO mjonPayVO = new MjonPayVO(); + } else {// 즉시발송의 경우 현재 시간으로 입력해 준다. - /*if(resultCnt > 0 && blockCnt > 0) { + Date now = new Date(); + if (spamStatus.equals("Y") || smishingYn.equals("Y")) {// 스팸 문자가 포함되었거나, 스미싱 의심 회원의 경우 문자발송 시간을 30분 딜레이 + // 시킨다. - Float blockPrice = Float.parseFloat(mjonMsgVO.getEachPrice()) * blockCnt; - Float resultTotPrice = Float.parseFloat(mjonMsgVO.getTotPrice()); - Float endPrice = resultTotPrice - blockPrice; + String nowDate = transFormat.format(now); + Date toDate = transFormat.parse(nowDate); + System.out.println("++++++++++++++++++++ origin reqDate ::: " + toDate); + cal.setTime(toDate); - mjonMsgVO.setTotPrice(Float.toString(endPrice)); + cal.add(Calendar.MINUTE, 30); + delayTime = transFormat.format(cal.getTime()); + mjonMsgVO.setReqDate(delayTime); + System.out.println("++++++++++++++++++++ delay reqDate ::: " + mjonMsgVO.getReqDate()); + delayYn = "Y"; + mjonMsgVO.setDelayYn(delayYn);// 문자 발송 30분 지연 코드 셋팅 - //수신거부가 있는 경우 총 건수에서 수신거부 건수를 차감 후 그룹 테이블에 업데이트 해준다. - int groupCnt = resultCnt; - mjonMsgVO.setMsgGroupCnt(Integer.toString(groupCnt)); + } else {// 정상적인 문자인 경우 즉시발송 처리해준다. - //mjonMsgDAO.updateGroupMsgData(mjonMsgVO); + mjonMsgVO.setReqDate(transFormat.format(now)); + mjonMsgVO.setDelayYn(delayYn);// 문자 발송 30분 지연 디폴트 값 셋팅(N) - }*/ + } - //1건 이상 발송이 있는 경우만 캐쉬를 차감 시킨다. - if(resultCnt > 0) { + } - int totSendCnt = mjonMsgVO.getTotalCallCnt(); - Float eachPrice = Float.parseFloat(mjonMsgVO.getEachPrice()); - Float totPrice = eachPrice * resultCnt; - String strTotPrice = String.format("%.1f", totPrice); + String[] nameList = mjonMsgVO.getNameList(); // 치환 이름 리스트 + String[] phoneList = mjonMsgVO.getCallToList(); // 받는사람 연락처 리스트 + String[] rep1 = mjonMsgVO.getRep1List(); // 치환 문자1 리스트 + String[] rep2 = mjonMsgVO.getRep2List(); // 치환 문자2 리스트 + String[] rep3 = mjonMsgVO.getRep3List(); // 치환 문자3 리스트 + String[] rep4 = mjonMsgVO.getRep4List(); // 치환 문자4 리스트 - mjonMsgVO.setTotPrice(strTotPrice);//현재 합산 금액 셋팅 - mjonPayVO.setCashId(idgenMjonCashId.getNextStringId()); - mjonPayVO.setUserId(mjonMsgVO.getUserId()); - mjonPayVO.setCash(-Float.parseFloat(strTotPrice)); - mjonPayVO.setFrstRegisterId(mjonMsgVO.getUserId()); - mjonPayVO.setMemo("SMS 문자 총 "+totSendCnt+"건 중 " + resultCnt + "건 발송"); - mjonPayVO.setMsgGroupId(mjonMsgVO.getMsgGroupId()); + // Controller에서 전달 받은 분할 시간 정보 리스트 + List dividDayList = mjonMsgVO.getDividDay(); - mjonPayService.insertCash(mjonPayVO); //캐시차감 - mjonPayService.updateMemberCash(mjonPayVO); //회원정보 업데이트 - } + String frstDelayTime = mjonMsgVO.getReqDate(); + // 문자발송 리스트 생성 시작 + for (int i = 0; i < callToCnt; i++) { - //문자 발송 테이블에 입력 데이터가 있는 경우 그룹 테이블에도 입력 해 준다. - if(resultCnt > 0) { + Boolean blockSts = false; + for (int j = 0; j < usrBlockCnt; j++) { - // 문자 전송 그룹 테이블에 정보 입력 - int groupCnt = resultCnt; - mjonMsgVO.setMsgGroupCnt(Integer.toString(groupCnt)); - //mjonMsgService.insertGroupMsgData(mjonMsgVO); - int msgGroupDataCnt = mjonMsgDAO.selectMsgGroupDataCntByGroupId(mjonMsgVO); + if (phoneList[i].equals(dupliBlockList.get(j).toString())) { - //메세지 그룹 데이터가 없으면 추가 해주고 있으면 총메세지 건수를 합산해준다. - if(msgGroupDataCnt < 1) { - mjonMsgVO.setAgentCode(agentCode);//전송사 코드 번호를 셋팅해 준다. + blockCnt++; // 수신 차단 카운드를 해준다. + blockSts = true; - //지연 유무 코드가 Null 인경우 체크 - String tmpDelayYn = mjonMsgVO.getDelayYn(); - if(tmpDelayYn == null) { - mjonMsgVO.setDelayYn("N"); - } + } - //예약 문자이고 30분 지연이 된 문자의 Mj_msg_group_data 테이블의 req_date 시간을 첫번째 문자의 지연된 시간으로 셋팅해준다. - if(mjonMsgVO.getReserveYn().equals("Y") && (spamStatus.equals("Y") || smishingYn.equals("Y"))) { + } - mjonMsgVO.setReqDate(frstDelayTime); + if (!blockSts) { // 수신거부가 아니면 추가 - } - mjonMsgDAO.insertGroupMsgData(mjonMsgVO); + MjonMsgVO tempVO = new MjonMsgVO(); - try { + /** + * Agent 추가시 셋팅하기 + * + * 최초 : 아이하트(01), 현대 퓨쳐넷(02), 아이앰오(03) 22.10.12 : 비즈뿌리오(04) 추가 23.04.10 : + * 제이제이(05) 추가 23.05.02 : 인비토 (07) 추가 23.05.09 : 회원 전용 전송사 정보가 있으면 모든 문자를 전용 + * 전송사로 발송처리함. + */ - //야간 스미싱 알림이 활성화이고 알림 예외 일정에 포함되고 스팸 또는 스미싱 의심 상태일 경우 문자정보 별도 저장처리 - 20240821 우영두 추가 - if(holiSmishingNoti.equals("Y") && spamSmishingPassStatus && (mjonMsgVO.getSpamStatus().equals("Y") || mjonMsgVO.getSmishingYn().equals("Y"))) { - mjonMsgDAO.insertSpamPassMsgData(mjonMsgVO); - } + if (hotlineAgentCode.equals("00")) {// 전용 전송사가 사용 안함인 경우 분배 및 대표 전송사로 설정 + + if (iheartCnt > 0) { + agentCode = "01"; + tempVO.setAgentCode(agentCode); + iheartCnt--; + } else if (hncCnt > 0) { + agentCode = "02"; + tempVO.setAgentCode(agentCode); + hncCnt--; + } else if (imoCnt > 0) { + agentCode = "03"; + tempVO.setAgentCode(agentCode); + imoCnt--; + } else if (bizCnt > 0) { + agentCode = "04"; + tempVO.setAgentCode(agentCode); + bizCnt--; + } else if (jjCnt > 0) { + agentCode = "05"; + tempVO.setAgentCode(agentCode); + jjCnt--; + } else if (ivtCnt > 0) { + agentCode = "07"; + tempVO.setAgentCode(agentCode); + ivtCnt--; + } else {// 전송사 Agent 대표 전송사로 지정한다. + + agentCode = sendRateList.get(0).getRepAgent(); + tempVO.setAgentCode(agentCode); + } + + } else {// 전용 전송사가 지정되어 있는 경우 전용 전송사로 지정 + + agentCode = hotlineAgentCode; + tempVO.setAgentCode(hotlineAgentCode); + } + // Agent 셋팅 끝 + + tempVO.setMsgId(idgenMsgId.getNextStringId()); + tempVO.setUserId(mjonMsgVO.getUserId()); + tempVO.setCallTo(phoneList[i]); + tempVO.setCallFrom(mjonMsgVO.getCallFrom()); + tempVO.setMsgType(mjonMsgVO.getMsgType()); + tempVO.setMsgGroupId(mjonMsgVO.getMsgGroupId()); + tempVO.setMsgCnt(mjonMsgVO.getMsgCnt()); + + // 아이엠오 전송사 문자 타입 설정해 주기 + if (agentCode.equals("03")) { + + // 단순 장문 문자는 neoType : 2, 그림 포함 : 4 + if (mjonMsgVO.getFileCnt().equals("0")) { // 단순 장문 문자 - } catch (Exception e) { - System.out.println("++++++++++++++++++++++++++++++ spamSmishingPassStatus 문자전송 야간 스미싱 알림 데이터 입력 오류 발생 !!!!"); - } + mjonMsgVO.setNeoType("2"); - }else { - mjonMsgDAO.updateMsgGroupDataForTotCntSum(mjonMsgVO); - } + } else { // 그림포함 문자인경우 - //이벤트 회원 남은 캐시 업데이트 - fnUpdateEventRemainCash(mjonPayVO); + mjonMsgVO.setNeoType("4"); + + } + + } + + // 문자내용 내용 - 치환 처리 + String smsTxt = mjonMsgVO.getSmsTxt(); // 발송 문자 내용 - } + // 일괄변환문자 리스트에서 콤마(,)를 특수문자(§)로 변환해서 넘겨받기 때문에 치환 처리를 해준도록 한다. + smsTxt = smsTxt.replaceAll(String.valueOf((char) 13), ""); + if (smsTxt.indexOf("[*이름*]") > -1) { + if (nameList.length > i && StringUtil.isNotEmpty(nameList[i])) { + smsTxt = smsTxt.replaceAll("\\[\\*이름\\*\\]", + StringUtil.getString(nameList[i].replaceAll("§", ","))); + } else { + smsTxt = smsTxt.replaceAll("\\[\\*이름\\*\\]", ""); + } + } - // 성공 - returnVO.setSendMsgCnt(Integer.toString(resultCnt)); //발송 건수 저장 - returnVO.setSendMsgBlockCnt(Integer.toString(blockCnt)); //수신차단 건수 저장 - returnVO.setAgentCode(agentCode); + if (smsTxt.indexOf("[*1*]") > -1) { + if (rep1.length > i && StringUtil.isNotEmpty(rep1[i])) { + smsTxt = smsTxt.replaceAll("\\[\\*1\\*\\]", + StringUtil.getString(rep1[i].replaceAll("§", ","))); + } else { + smsTxt = smsTxt.replaceAll("\\[\\*1\\*\\]", ""); + } + } - } catch (Exception e) { - // 실패 - returnVO.setSendMsgCnt(Integer.toString(0)); //발송 건수 저장 - returnVO.setSendMsgBlockCnt(Integer.toString(0)); //수신차단 건수 저장 - returnVO.setAgentCode("01"); + if (smsTxt.indexOf("[*2*]") > -1) { + if (rep2.length > i && StringUtil.isNotEmpty(rep2[i])) { + smsTxt = smsTxt.replaceAll("\\[\\*2\\*\\]", + StringUtil.getString(rep2[i].replaceAll("§", ","))); + } else { + smsTxt = smsTxt.replaceAll("\\[\\*2\\*\\]", ""); + } + } + + if (smsTxt.indexOf("[*3*]") > -1) { + if (rep3.length > i && StringUtil.isNotEmpty(rep3[i])) { + smsTxt = smsTxt.replaceAll("\\[\\*3\\*\\]", + StringUtil.getString(rep3[i].replaceAll("§", ","))); + } else { + smsTxt = smsTxt.replaceAll("\\[\\*3\\*\\]", ""); + } + } + + if (smsTxt.indexOf("[*4*]") > -1) { + if (rep4.length > i && StringUtil.isNotEmpty(rep4[i])) { + smsTxt = smsTxt.replaceAll("\\[\\*4\\*\\]", + StringUtil.getString(rep4[i].replaceAll("§", ","))); + } else { + smsTxt = smsTxt.replaceAll("\\[\\*4\\*\\]", ""); + } + } - System.out.println("========================================================================="); - System.out.println("+++++++++++++++++++++++++++++ 문자발송 ==> insertMsgDataInfo ERROR !!! : " + e); - System.out.println("========================================================================="); - return returnVO; + tempVO.setSmsTxt(smsTxt); - } + // 즉시 / 예약 전송 처리 + if (mjonMsgVO.getReserveYn().equals("N")) {// 즉시 전송의 경우 현재 시간을 입력 - return returnVO; + if (spamStatus.equals("Y") || smishingYn.equals("Y")) {// 스팸문자가 있거나, 스미싱 의심 회원의 경우 30분 지연시간을 입력해 + // 준다. - } + tempVO.setReqDate(mjonMsgVO.getReqDate());// 상단에서 스팸문구가 있는겨우 30분 딜레이시간을 입력해 두었기 때문에 같은 데이터를 + // 입력함. + + } else {// 일반 문자인 경우 현재시간을 입력해 준다. + + Date now = new Date(); + SimpleDateFormat sdFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); + tempVO.setReqDate(sdFormat.format(now)); + + } + + } else { // 예약 발송의 경우 예약 시간을 입력 + + // 분할 발송을 체크 한 경우 + if (mjonMsgVO.getDivideChk() != null) { + + // 스팸문구 혹은 스미싱 의심 회원의 경우 30분 딜레이 처리해준다. + // 20230630 우영두 추가 + if (spamStatus.equals("Y") || smishingYn.equals("Y")) { + + Date delayDate = transFormat.parse(dividDayList.get(i)); + + cal.setTime(delayDate); + cal.add(Calendar.MINUTE, 30); + delayTime = transFormat.format(cal.getTime()); + + tempVO.setReqDate(delayTime); // 분할 문자 예약 시간 입력해주기 + + } else { + + tempVO.setReqDate(dividDayList.get(i)); // 분할 문자 예약 시간 입력해주기 + + } + + } else {// 일반 예약 발송의 경우 + + if (spamStatus.equals("Y") || smishingYn.equals("Y")) {// 스팸문구 혹은 스미싱 의심 회원의 경우 30분 딜레이 + // 처리해준다. + + Date delayDate = transFormat.parse(mjonMsgVO.getReqDate()); + + cal.setTime(delayDate); + cal.add(Calendar.MINUTE, 30); + delayTime = transFormat.format(cal.getTime()); + + tempVO.setReqDate(delayTime); + + } else { + + tempVO.setReqDate(mjonMsgVO.getReqDate()); + + } + + } + + // 딜레이 처리되었을 수 있어서 임시 데이터의 발송 시간을 업데이트 해준다. + // 분할 발송일 경우 Loop을 돌기 때문에 마지막 시간이 reqDate에 들어가기 때문에 첫번째 데이터에서만 시간을 입력해 준다. + // mj_group_data 테이블의 reqdate 컬럼 값으로 셋팅 된다. + if (i == 0) { + frstDelayTime = tempVO.getReqDate(); + } + } + + if (!msgType.equals("4")) { // 장문 혹은 그림문자일 경우 추가 + + /** + * 장문 / 그림문자 일 경우 제목 처리 만약 제목을 입력하지 않았을 경우 문자 내용의 텍스트 일부를 제목으로 사용 내용 텍스트가 없는 경우는 + * 어쩔수 없는 것으로 간주하여 Null로 처리한다. + * + */ + String contents = tempVO.getSmsTxt(); // 문자 내용 + if (StringUtil.isEmpty(mjonMsgVO.getMmsSubject()) || mjonMsgVO.getMmsSubject() == null) {// 제목 + // 입력이 + // 없는 + // 경우 + + if (StringUtil.isNotEmpty(contents) && contents != null) {// 문자내용이 있는 경우 처리 + + String[] split = contents.split("\n"); + + if (split.length > 0) { + + String subject = ""; + String msgKind = mjonMsgVO.getMsgKind();// 문자 타입(일반, 광고, 선거문자) + + // 선거문자인 경우 첫 글내용이 "(선거운동정보)"로 되어있어서 그 다음줄의 내용을 제목으로 사용 + /* + * if(subject.equals("(선거운동정보)")) { subject = split[1].trim(); } + */ + + if (msgKind.equals("C")) { + if (split.length > 1) { + subject = split[1].trim(); + } else { + subject = split[0].substring(0, 20); + } + } else { + subject = split[0].trim(); + } + + // 제목 글자수 20글자로 제한. + /* + * if(subject.length() > 20) { subject = subject.substring(0,20); } + * tempVO.setMmsSubject(subject); mjonMsgVO.setMmsSubject(subject); + */ + + } + + } + + } else {// 제목 입력이 있는 경우 입력한 제목으로 셋팅 + tempVO.setMmsSubject(mjonMsgVO.getMmsSubject()); + } + + tempVO.setFileCnt(mjonMsgVO.getFileCnt()); + tempVO.setFileName1(mjonMsgVO.getFileName1()); + tempVO.setFileName2(mjonMsgVO.getFileName2()); + tempVO.setFileName3(mjonMsgVO.getFileName3()); + tempVO.setNeoType(mjonMsgVO.getNeoType()); + tempVO.setContSeq(mjonMsgVO.getContSeq()); + + } + + // 아이하트 전송사의 LMS(장문) / MMS(그림문자) 전송시 컨텐츠 번호 받아오기 먼저 처리 + if (agentCode.equals("01") && msgType.equals("6")) { + + // 아이하트 MMS Contents 테이블에 입력 후 컨텐츠 아이디 받아오기 + + // 이미지가 있는경우 file_type, file_Cnt 값 셋팅 + int fileCnt = Integer.parseInt(mjonMsgVO.getFileCnt()); + String contents = mjonMsgVO.getSmsTxt(); + + if (fileCnt > 0) { + tempVO.setFileType1("IMG"); // 아이하트 그림문자 전송시 파일종류 이미지로 셋팅 + + // 그림문자일 경우 이미지 갯수 + 1을 해줘야한다. (+1은 컨텐츠 내용을 의미한다.) + if (StringUtil.isNotEmpty(contents)) { + fileCnt = fileCnt + 1; + } + tempVO.setFileCnt(Integer.toString(fileCnt)); + + } else { + tempVO.setFileCnt("1"); + } + + contSeq = mjonMsgDataDAO.insertIHeartMmsMsgContentsInfo(tempVO); + mjonMsgVO.setContSeq(contSeq); + tempVO.setSmsTxt(smsTxt); + tempVO.setContSeq(contSeq); + + } + + // 문자 내용 추가해 주기 + msgDataInfo.add(tempVO); + + } // 수신거부 처리로직 끝 + + int instCnt = 0; + // 지금까지 루프 돌아간 것이 전체 수신자 갯수와 같으면 추가가 완료된 것으로 판단 되어 전송 해줌 + if (totCnt == callToCnt) { + + if (msgDataInfo.size() > 0) { + + // 데이터 디비 입력해주기 + instCnt = mjonMsgDataDAO.insertMsgDataInfo(msgDataInfo, msgType, agentCode); + + } + + // 총 디비 입력 건수 저장하기 + resultCnt = resultCnt + instCnt; + + } else { + + // 특정 건수 이상일 경우 분할해서 디비에 넣어준다. + if (cnt == limitCnt) { + + if (msgDataInfo.size() > 0) { + + // 분할 최대건수가 되면 디비에 입력하기 + instCnt = mjonMsgDataDAO.insertMsgDataInfo(msgDataInfo, msgType, agentCode); + + } + + // 총 디비 입력 건수 저장하기 + resultCnt = resultCnt + instCnt; + cnt = 0; + + // List 초기화 하기 + msgDataInfo.clear(); + + } + + } + + cnt++; + totCnt++; + + } + + /* + * 각 처리 건별로 캐시 차감 및 그룹 데이터 정보 업데이트 1. 디비에 입력한 건수만큼 캐시 차감 및 회원 캐시 정보 업데이트 2. + * 그룹데이터에 처리 건수 업데이트(총 발송건수 합산 정보 업데이트) + * + */ + + // 문자 발송 캐시 차감 해주기 + MjonPayVO mjonPayVO = new MjonPayVO(); + + /* + * if(resultCnt > 0 && blockCnt > 0) { + * + * Float blockPrice = Float.parseFloat(mjonMsgVO.getEachPrice()) * blockCnt; + * Float resultTotPrice = Float.parseFloat(mjonMsgVO.getTotPrice()); Float + * endPrice = resultTotPrice - blockPrice; + * + * mjonMsgVO.setTotPrice(Float.toString(endPrice)); + * + * //수신거부가 있는 경우 총 건수에서 수신거부 건수를 차감 후 그룹 테이블에 업데이트 해준다. int groupCnt = + * resultCnt; mjonMsgVO.setMsgGroupCnt(Integer.toString(groupCnt)); + * + * //mjonMsgDAO.updateGroupMsgData(mjonMsgVO); + * + * } + */ + + // 1건 이상 발송이 있는 경우만 캐쉬를 차감 시킨다. + if (resultCnt > 0) { + + int totSendCnt = mjonMsgVO.getTotalCallCnt(); + Float eachPrice = Float.parseFloat(mjonMsgVO.getEachPrice()); + Float totPrice = eachPrice * resultCnt; + String strTotPrice = String.format("%.1f", totPrice); + + mjonMsgVO.setTotPrice(strTotPrice);// 현재 합산 금액 셋팅 + mjonPayVO.setCashId(idgenMjonCashId.getNextStringId()); + mjonPayVO.setUserId(mjonMsgVO.getUserId()); + mjonPayVO.setCash(-Float.parseFloat(strTotPrice)); + mjonPayVO.setFrstRegisterId(mjonMsgVO.getUserId()); + mjonPayVO.setMemo("SMS 문자 총 " + totSendCnt + "건 중 " + resultCnt + "건 발송"); + mjonPayVO.setMsgGroupId(mjonMsgVO.getMsgGroupId()); + + mjonPayService.insertCash(mjonPayVO); // 캐시차감 + mjonPayService.updateMemberCash(mjonPayVO); // 회원정보 업데이트 + } + + // 문자 발송 테이블에 입력 데이터가 있는 경우 그룹 테이블에도 입력 해 준다. + if (resultCnt > 0) { + + // 문자 전송 그룹 테이블에 정보 입력 + int groupCnt = resultCnt; + mjonMsgVO.setMsgGroupCnt(Integer.toString(groupCnt)); + // mjonMsgService.insertGroupMsgData(mjonMsgVO); + int msgGroupDataCnt = mjonMsgDAO.selectMsgGroupDataCntByGroupId(mjonMsgVO); + + // 메세지 그룹 데이터가 없으면 추가 해주고 있으면 총메세지 건수를 합산해준다. + if (msgGroupDataCnt < 1) { + mjonMsgVO.setAgentCode(agentCode);// 전송사 코드 번호를 셋팅해 준다. + + // 지연 유무 코드가 Null 인경우 체크 + String tmpDelayYn = mjonMsgVO.getDelayYn(); + if (tmpDelayYn == null) { + mjonMsgVO.setDelayYn("N"); + } + + // 예약 문자이고 30분 지연이 된 문자의 Mj_msg_group_data 테이블의 req_date 시간을 첫번째 문자의 지연된 시간으로 + // 셋팅해준다. + if (mjonMsgVO.getReserveYn().equals("Y") && (spamStatus.equals("Y") || smishingYn.equals("Y"))) { + + mjonMsgVO.setReqDate(frstDelayTime); + + } + mjonMsgDAO.insertGroupMsgData(mjonMsgVO); + + try { + + // 야간 스미싱 알림이 활성화이고 알림 예외 일정에 포함되고 스팸 또는 스미싱 의심 상태일 경우 문자정보 별도 저장처리 - 20240821 + // 우영두 추가 + if (holiSmishingNoti.equals("Y") && spamSmishingPassStatus + && (mjonMsgVO.getSpamStatus().equals("Y") || mjonMsgVO.getSmishingYn().equals("Y"))) { + mjonMsgDAO.insertSpamPassMsgData(mjonMsgVO); + } + + } catch (Exception e) { + System.out.println( + "++++++++++++++++++++++++++++++ spamSmishingPassStatus 문자전송 야간 스미싱 알림 데이터 입력 오류 발생 !!!!"); + } + + } else { + mjonMsgDAO.updateMsgGroupDataForTotCntSum(mjonMsgVO); + } + + // 이벤트 회원 남은 캐시 업데이트 + fnUpdateEventRemainCash(mjonPayVO); + + } + + // 성공 + returnVO.setSendMsgCnt(Integer.toString(resultCnt)); // 발송 건수 저장 + returnVO.setSendMsgBlockCnt(Integer.toString(blockCnt)); // 수신차단 건수 저장 + returnVO.setAgentCode(agentCode); + + } catch (Exception e) { + // 실패 + returnVO.setSendMsgCnt(Integer.toString(0)); // 발송 건수 저장 + returnVO.setSendMsgBlockCnt(Integer.toString(0)); // 수신차단 건수 저장 + returnVO.setAgentCode("01"); + + System.out.println("========================================================================="); + System.out.println("+++++++++++++++++++++++++++++ 문자발송 ==> insertMsgDataInfo ERROR !!! : " + e); + System.out.println("========================================================================="); + return returnVO; + + } + + return returnVO; + + } //이벤트 회원 캐시 변경 함수 public void fnUpdateEventRemainCash(MjonPayVO mjonPayVO) throws Exception{ @@ -3241,13 +3987,10 @@ public class MjonMsgDataServiceImpl extends EgovAbstractServiceImpl implements M @Override public StatusResponse sendMsgData_advc(MjonMsgVO mjonMsgVO, HttpServletRequest request) throws Exception { - String resultSts = "0"; - String resultBlockSts = "0"; - String userId = ""; LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null; - userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId()); + String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId()); if(userId.equals("")) { return new StatusResponse(HttpStatus.BAD_REQUEST, "로그인 후 이용이 가능합니다."); @@ -3314,13 +4057,12 @@ public class MjonMsgDataServiceImpl extends EgovAbstractServiceImpl implements M for(int i=0; i 0) { - - //if(mjonMsgVO.getFileName1() == null && mjonMsgVO.getFileName2() == null && mjonMsgVO.getFileName3() == null) { - - boolean allFilesAreNull = Stream.of( - mjonMsgVO.getFileName1(), - mjonMsgVO.getFileName2(), - mjonMsgVO.getFileName3() - ).allMatch(Objects::isNull); - - if (allFilesAreNull) { - return new StatusResponse(HttpStatus.NO_CONTENT - , "문자 메세지 이미지 추가에 오류가 발생하여 문자 발송이 취소 되었습니다." - ); - } + StatusResponse returnStatusResponse = MsgSendUtils.validateFilesForMessageSending(fileCount, mjonMsgVO); + if (returnStatusResponse != null) { + return returnStatusResponse; } @@ -3380,8 +4110,6 @@ public class MjonMsgDataServiceImpl extends EgovAbstractServiceImpl implements M //1.시스템 기본 단가 정보 불러오기 JoinSettingVO sysJoinSetVO = mjonMsgDataService.selectJoinSettingInfo(); - // 등급제 단가 추출 => 시스템 단가에 적용 -// sysJoinSetVO = mberGrdService.selectMberGrdDefaultInfo(sysJoinSetVO, userId); //2.사용자 개인 단가 정보 불러오기 MberManageVO mberManageVO = mjonMsgDataDAO.selectMberManageInfo(userId); @@ -3428,9 +4156,6 @@ public class MjonMsgDataServiceImpl extends EgovAbstractServiceImpl implements M // 토탈금액 "," 리플레이스 처리 mjonMsgVO.setTotPrice(mjonMsgVO.getTotPrice().replaceAll(",", "")); - float tmpOrgEachPrice = Float.parseFloat(mjonMsgVO.getEachPrice()); - float tmpOrgTotPrice = Float.parseFloat(mjonMsgVO.getTotPrice()); - // 각 문자 종류별 단가 설정 float tmpEachPrice = MsgSendUtils.determinePriceByMsgType(mjonMsgVO, shortPrice, longPrice, picturePrice, picture2Price, picture3Price); mjonMsgVO.setEachPrice(Float.toString(tmpEachPrice)); @@ -3438,23 +4163,8 @@ public class MjonMsgDataServiceImpl extends EgovAbstractServiceImpl implements M // 수신자 총 수 * 단가를 통해 총 결제 금액 계산 int tmpTotCallCnt = mjonMsgVO.getCallToList().length; float tmpTotPrice = tmpTotCallCnt * tmpEachPrice; + mjonMsgVO.setTotPrice(Float.toString(tmpTotPrice)); - // 화면에서 넘어온 파라미터 개별 단가와 컨트롤러에서 계산한 단가를 비교하여 맞지 않으면 컨트롤러 계산 단가 입력 - if (tmpOrgEachPrice != tmpEachPrice) { - mjonMsgVO.setEachPrice(Float.toString(tmpEachPrice)); - log.info("화면 : tmpOrgEachPrice ::: [{}]", tmpOrgEachPrice); - log.info("컨트롤러 : tmpEachPrice ::: [{}]", tmpEachPrice); - } else { - log.info("tmpOrgEachPrice ::: [{}]", tmpOrgEachPrice); - } - - if (tmpOrgTotPrice != tmpTotPrice) { - mjonMsgVO.setTotPrice(Float.toString(tmpTotPrice)); - log.info("화면 : tmpOrgTotPrice ::: [{}]", tmpOrgTotPrice); - log.info("컨트롤러 : tmpTotPrice ::: [{}]", tmpTotPrice); - } else { - log.info("tmpOrgTotPrice ::: [{}]", tmpOrgTotPrice); - } //////////////////////////////////////////////// @@ -3463,23 +4173,18 @@ public class MjonMsgDataServiceImpl extends EgovAbstractServiceImpl implements M StatusResponse statusResponse = new StatusResponse(); if (MsgSendUtils.isReplacementRequired(mjonMsgVO)) { - if (!MsgSendUtils.isReplacementDataValid(mjonMsgVO)) { - return new StatusResponse(HttpStatus.BAD_REQUEST, "특정문구 일괄변환 치환문자 데이터가 없습니다."); + if (!MsgSendUtils.validateReplacementData(mjonMsgVO, statusResponse)) { + //특정문구 일괄변환 치환문자 데이터가 없습니다. + return statusResponse; // 유효성 검사 실패 시 처리 } - - - if (!MsgSendUtils.checkReplacementDataValidity(mjonMsgVO, statusResponse)) { - return statusResponse; - } - + // 치환 문자 리스트 생성 ReplacementListsVO intiLists = MsgSendUtils.createReplacementLists(mjonMsgVO); - MsgSendUtils.populateReplacementLists(mjonMsgVO ,intiLists, statusResponse); - // 에러가 발생했는지 상태를 확인 - if (statusResponse.getStatus() == HttpStatus.BAD_REQUEST) { - // 에러 메시지 처리 + if(!MsgSendUtils.populateReplacementLists(mjonMsgVO ,intiLists, statusResponse)) {; + //문자 치환 후 전송 문자 길이를 초과하였습니다. + //문자 치환 중 오류가 발생하였습니다. return statusResponse; } @@ -3496,755 +4201,312 @@ public class MjonMsgDataServiceImpl extends EgovAbstractServiceImpl implements M // 그림 문자 발송 처리 메서드 - private StatusResponse processMessageSending(MjonMsgVO mjonMsgVO, ReplacementListsVO lists, StatusResponse statusResponse) { + private StatusResponse processMessageSending(MjonMsgVO mjonMsgVO, ReplacementListsVO lists, StatusResponse statusResponse) throws Exception { - Map resultMap = new HashMap(); - // 단문 문자 발송 - if (lists.getShortCnt() > 0) { - resultMap = sendShortMessages(mjonMsgVO, lists, statusResponse); - } - - // 장문 문자 발송 - if (lists.getLongCnt() > 0) { - resultMap = sendLongMessages(mjonMsgVO, lists, statusResponse); - } - - // 그림 문자 발송 - if (lists.getImgCnt() > 0) { - resultMap = sendImageMessages(mjonMsgVO, lists, statusResponse); - } + Map resultMap = sendMessages(mjonMsgVO, lists); if(!resultMap.isEmpty()) { - String returnMessage = ""; - String returnStatus = ""; - String resultBlockSts = "0"; - if(!resultMap.get("result").contains("fail")) { + if(resultMap.get("result").contains("fail")) { - //발송건수 계산 - int sendCnt = Integer.parseInt(resultMap.get("resultSts")); - String resultSts = Integer.toString(sendCnt); - - //수신거부 건수 계산 - int sendBlockCnt = Integer.parseInt(resultMap.get("resultBlockSts")); - resultBlockSts = Integer.toString(sendBlockCnt); - - returnMessage = resultMap.get("message"); - returnStatus = resultMap.get("result"); - - }else { - returnMessage = resultMap.get("message"); - returnStatus = resultMap.get("result"); - - statusResponse.setMessage(returnMessage); + statusResponse.setMessage(resultMap.get("message")); statusResponse.setObject(resultMap); - + statusResponse.setStatus(HttpStatus.BAD_REQUEST); return statusResponse; + } } - - Map returnMap = new HashMap(); - returnMap.put("msgType", mjonMsgVO.getMsgType()); - returnMap.put("msgGroupId", mjonMsgVO.getMsgGroupId()); - statusResponse.setObject(returnMap); + statusResponse.setObject(resultMap); + statusResponse.setStatus(HttpStatus.OK); + statusResponse.setMessage("문자 전송이 완료되었습니다."); - return statusResponse; - } + return statusResponse; + } + private Map fncSendMsgRtnMap(MjonMsgVO mjonMsgVO) throws Exception { + Map returnMap = new HashMap(); - // TODO : 모듈화 미진행 - private Map fncSendMsgRtnMap(MjonMsgVO mjonMsgVO) { - - Map returnMap = new HashMap(); - //String resultSts = "0"; //발송결과 건수 - //String resultBlockSts = "0"; //수신거부 등록번호로 발송을 안한 건수 - int resultSts = 0; //발송결과 건수 int resultBlockSts = 0; //수신거부 등록번호로 발송을 안한 건수 - - try { - - //현재 고객의 보유 캐시가 문자 발송이 가능한 금액인지 체크 - String userMoney = mjonMsgDataService.selectBeforeCashData(mjonMsgVO); - String userPoint = mjonMsgDataService.selectBeforePointData(mjonMsgVO); - mjonMsgVO.setBefPoint(userPoint); //현재 보유 포인트 정보 저장 - String totPrice = mjonMsgVO.getTotPrice(); - - BigDecimal befCash = new BigDecimal(userMoney).setScale(2, RoundingMode.HALF_EVEN); - BigDecimal totMsgPrice = new BigDecimal(totPrice).setScale(2, RoundingMode.HALF_EVEN); - - - //현재 보유 금액이 발송 문자 총 금액보다 클 경우만 문자 발송 - //BigDecimal 비교 연산 - // befCash(현재 보유금액) 값이 totMsgPrice(문자전송 금액) 보다 많으면 문자 전송 - if(befCash.compareTo(totMsgPrice) != -1) { // -1 : befCash < totMsgPrice, 0 : befCash = totMsgPrice, 1 : befCash > totMsgPrice, - - //문자 발송 처리 - //MjonMsgReturnVO returnVO = new MjonMsgReturnVO(); - //현재 보유 캐쉬금액 셋팅 - mjonMsgVO.setBefCash(befCash.toString()); - - //문자 전송 그룹아이디 생성 - mjonMsgVO.setMsgGroupId(idgenMjonMsgGroupId.getNextStringId()); - - String[] tempPhoneList = new String[200]; //임시 수신번호 리스트 저장용 배열 - String[] tempNameList = new String[200]; //임시 이름 리스트 저장용 배열 - String[] tempRep1List = new String[200]; //임시 치환문자1 리스트 저장용 배열 - String[] tempRep2List = new String[200]; //임시 치환문자1 리스트 저장용 배열 - String[] tempRep3List = new String[200]; //임시 치환문자1 리스트 저장용 배열 - String[] tempRep4List = new String[200]; //임시 치환문자1 리스트 저장용 배열 - - String[] phoneList = mjonMsgVO.getCallToList(); - String[] nameList = mjonMsgVO.getNameList(); - String[] rep1List = mjonMsgVO.getRep1List(); - String[] rep2List = mjonMsgVO.getRep2List(); - String[] rep3List = mjonMsgVO.getRep3List(); - String[] rep4List = mjonMsgVO.getRep4List(); - - - int callToListCnt = mjonMsgVO.getCallToList().length; - mjonMsgVO.setTotalCallCnt(callToListCnt); - - /** 예약 문자인 경우 시간 및 분할 시간 셋팅 해주기 */ - //분할문자 시간에 간격시간 더해주기 - String dividDay = null; - Calendar cal = Calendar.getInstance(); - - //예약시간 변환 - SimpleDateFormat transFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); - - int turmMin = 0; - int totalCallCnt = 0; // 수신자 전체 갯수 - int divideCnt = 0; - int count = 1; //분할 카운트 - - - if(!mjonMsgVO.getReserveYn().equals("N")) {//예약문자인 경우 시간 셋팅 - - Date toDate = transFormat.parse(mjonMsgVO.getReqDate()); - cal.setTime(toDate); //예약 시간 캘린터 변수에 입력 - - //String 타입 시간 Int로 변환 - turmMin = Integer.parseInt(mjonMsgVO.getDivideTime()); //분할발송 시간 간격 - dividDay = transFormat.format(cal.getTime()); - - totalCallCnt = mjonMsgVO.getCallToList().length; // 수신자 전체 갯수 - divideCnt = Integer.parseInt(mjonMsgVO.getDivideCnt()); //분할 발송 갯수 - - } - - //분할 예약 시간 저장 리스트 생성 - List dividDayList = new ArrayList(); - - //서비스 단으로 특정 문자 건수 이상으로 한번에 보내지 않기 위해서 처리함 - if(callToListCnt > 200) { - - int sendCnt = 0; - for(int i=0; i< callToListCnt; i++) { - - //분할 발송을 체크 한 경우 - if(mjonMsgVO.getDivideChk() != null) { - - if(count > divideCnt) { - - count = 1; - - //분할 시간 간격을 증가시켜 준다. - cal.add(Calendar.MINUTE, turmMin); - dividDay = transFormat.format(cal.getTime()); - - dividDayList.add(dividDay); - //tempVO.setReqDate(dividDay); //분할 문자 예약 시간 입력해주기 - count++; - - }else { - - dividDayList.add(dividDay); - //tempVO.setReqDate(dividDay); //분할 문자 예약 시간 입력해주기 - count++; - - } - - } - - if((i < callToListCnt -1) && sendCnt == 199) { - - //sendCnt 4번째 값을 추가해준다. - tempPhoneList[sendCnt] = phoneList[i]; - tempNameList[sendCnt] = nameList[i]; - tempRep1List[sendCnt] = rep1List[i]; - tempRep2List[sendCnt] = rep2List[i]; - tempRep3List[sendCnt] = rep3List[i]; - tempRep4List[sendCnt] = rep4List[i]; - - List arrPhoneList = new ArrayList(); - List arrNameList = new ArrayList(); - List arrRep1List = new ArrayList(); - List arrRep2List = new ArrayList(); - List arrRep3List = new ArrayList(); - List arrRep4List = new ArrayList(); - - for(String temp : tempPhoneList) { - - if(temp != null) { - - arrPhoneList.add(temp); - - } - - } - - for(String tmpName : tempNameList) { - - if(tmpName != null) { - - arrNameList.add(tmpName); - - } - - } - - for(String tmpRep1 : tempRep1List) { - - if(tmpRep1 != null) { - - arrRep1List.add(tmpRep1); - - } - - } - - for(String tmpRep2 : tempRep2List) { - - if(tmpRep2 != null) { - - arrRep2List.add(tmpRep2); - - } - - } - - for(String tmpRep3 : tempRep3List) { - - if(tmpRep3 != null) { - - arrRep3List.add(tmpRep3); - - } - - } - - for(String tmpRep4 : tempRep4List) { - - if(tmpRep4 != null) { - - arrRep4List.add(tmpRep4); - - } - - } - - String[] sendPhoneList = new String[arrPhoneList.size()]; - String[] sendNameList = new String[arrNameList.size()]; - String[] sendRep1List = new String[arrRep1List.size()]; - String[] sendRep2List = new String[arrRep2List.size()]; - String[] sendRep3List = new String[arrRep3List.size()]; - String[] sendRep4List = new String[arrRep4List.size()]; - - for(int j=0; j< arrPhoneList.size(); j++) { - - sendPhoneList[j] = arrPhoneList.get(j); - - } - - for(int k=0; k< arrNameList.size(); k++) { - - sendNameList[k] = arrNameList.get(k); - - } - - for(int k=0; k< arrRep1List.size(); k++) { - - sendRep1List[k] = arrRep1List.get(k); - - } - - for(int k=0; k< arrRep2List.size(); k++) { - - sendRep2List[k] = arrRep2List.get(k); - - } - - for(int k=0; k< arrRep3List.size(); k++) { - - sendRep3List[k] = arrRep3List.get(k); - - } - - for(int k=0; k< arrRep4List.size(); k++) { - - sendRep4List[k] = arrRep4List.get(k); - - } - - mjonMsgVO.setCallToList(sendPhoneList); - mjonMsgVO.setNameList(sendNameList); - mjonMsgVO.setRep1List(sendRep1List); - mjonMsgVO.setRep2List(sendRep2List); - mjonMsgVO.setRep3List(sendRep3List); - mjonMsgVO.setRep4List(sendRep4List); - sendCnt = 0; - - mjonMsgVO.setDividDay(dividDayList); - MjonMsgReturnVO returnVO = mjonMsgDataService.insertMsgDataInfo(mjonMsgVO); - mjonMsgVO.setAgentCode(returnVO.getAgentCode()); - resultSts = resultSts + Integer.parseInt(returnVO.getSendMsgCnt()); - resultBlockSts = resultBlockSts + Integer.parseInt(returnVO.getSendMsgBlockCnt()); - - //발송 처리후 배열 초기화 - Arrays.fill(tempPhoneList, null); - dividDayList.clear(); - - - }else if((i == callToListCnt -1) && sendCnt < 200){//200개의 마지막일 경우 처리 - - //마지막 리스트의 수신번호를 추가해 준다. - tempPhoneList[sendCnt] = phoneList[i]; - tempNameList[sendCnt] = nameList[i]; - tempRep1List[sendCnt] = rep1List[i]; - tempRep2List[sendCnt] = rep2List[i]; - tempRep3List[sendCnt] = rep3List[i]; - tempRep4List[sendCnt] = rep4List[i]; - - List arrPhoneList2 = new ArrayList(); - List arrNameList2 = new ArrayList(); - List arrRep1List2 = new ArrayList(); - List arrRep2List2 = new ArrayList(); - List arrRep3List2 = new ArrayList(); - List arrRep4List2 = new ArrayList(); - - for(String temp : tempPhoneList) { - - if(temp != null) { - - arrPhoneList2.add(temp); - - } - - } - - for(String tmpName : tempNameList) { - - if(tmpName != null) { - - arrNameList2.add(tmpName); - - } - - } - - for(String tmpRep1 : tempRep1List) { - - if(tmpRep1 != null) { - - arrRep1List2.add(tmpRep1); - - } - - } - - for(String tmpRep2 : tempRep2List) { - - if(tmpRep2 != null) { - - arrRep2List2.add(tmpRep2); - - } - - } - - for(String tmpRep3 : tempRep3List) { - - if(tmpRep3 != null) { - - arrRep3List2.add(tmpRep3); - - } - - } - - for(String tmpRep4 : tempRep4List) { - - if(tmpRep4 != null) { - - arrRep4List2.add(tmpRep4); - - } - - } - - String[] sendPhoneList2 = new String[arrPhoneList2.size()]; - String[] sendNameList2 = new String[arrNameList2.size()]; - String[] sendRep1List2 = new String[arrRep1List2.size()]; - String[] sendRep2List2 = new String[arrRep2List2.size()]; - String[] sendRep3List2 = new String[arrRep3List2.size()]; - String[] sendRep4List2 = new String[arrRep4List2.size()]; - - for(int j=0; j< arrPhoneList2.size(); j++) { - - sendPhoneList2[j] = arrPhoneList2.get(j); - - } - - for(int j=0; j< arrNameList2.size(); j++) { - - sendNameList2[j] = arrNameList2.get(j); - - } - - for(int k=0; k< arrRep1List2.size(); k++) { - - sendRep1List2[k] = arrRep1List2.get(k); - - } - - for(int k=0; k< arrRep2List2.size(); k++) { - - sendRep2List2[k] = arrRep2List2.get(k); - - } - - for(int k=0; k< arrRep3List2.size(); k++) { - - sendRep3List2[k] = arrRep3List2.get(k); - - } - - for(int k=0; k< arrRep4List2.size(); k++) { - - sendRep4List2[k] = arrRep4List2.get(k); - - } - - mjonMsgVO.setCallToList(sendPhoneList2); - mjonMsgVO.setNameList(sendNameList2); - mjonMsgVO.setRep1List(sendRep1List2); - mjonMsgVO.setRep2List(sendRep2List2); - mjonMsgVO.setRep3List(sendRep3List2); - mjonMsgVO.setRep4List(sendRep4List2); - sendCnt = 0; - - mjonMsgVO.setDividDay(dividDayList); - MjonMsgReturnVO returnVO = mjonMsgDataService.insertMsgDataInfo(mjonMsgVO); - mjonMsgVO.setAgentCode(returnVO.getAgentCode()); - resultSts = resultSts + Integer.parseInt(returnVO.getSendMsgCnt()); - resultBlockSts = resultBlockSts + Integer.parseInt(returnVO.getSendMsgBlockCnt()); - - }else {//198개가 될때까지 배열에 데이터를 쌓는다 - - tempPhoneList[sendCnt] = phoneList[i]; - - if(nameList.length > 0) {//이름 치환문자가 있는 경우 - tempNameList[sendCnt] = nameList[i]; - } - - if(rep1List.length > 0) {//치환1 문자가 있는 경우 - tempRep1List[sendCnt] = rep1List[i]; - } - - if(rep2List.length > 0) {//치환2 문자가 있는 경우 - tempRep2List[sendCnt] = rep2List[i]; - } - - if(rep3List.length > 0) {//치환3 문자가 있는 경우 - tempRep3List[sendCnt] = rep3List[i]; - } - - if(rep4List.length > 0) {//치환4 문자가 있는 경우 - tempRep4List[sendCnt] = rep4List[i]; - } - - sendCnt++; - - } - - } - - }else { - - //분할 발송을 체크 한 경우 - if(mjonMsgVO.getDivideChk() != null) { - for(int i=0; i< callToListCnt; i++) { - if(count > divideCnt) { - - count = 1; - - //분할 시간 간격을 증가시켜 준다. - cal.add(Calendar.MINUTE, turmMin); - dividDay = transFormat.format(cal.getTime()); - - dividDayList.add(dividDay); - //tempVO.setReqDate(dividDay); //분할 문자 예약 시간 입력해주기 - count++; - - }else { - - dividDayList.add(dividDay); - //tempVO.setReqDate(dividDay); //분할 문자 예약 시간 입력해주기 - count++; - - } - - } - - } - - mjonMsgVO.setDividDay(dividDayList); - MjonMsgReturnVO returnVO = mjonMsgDataService.insertMsgDataInfo(mjonMsgVO); - mjonMsgVO.setAgentCode(returnVO.getAgentCode()); - resultSts = Integer.parseInt(returnVO.getSendMsgCnt()); - resultBlockSts = Integer.parseInt(returnVO.getSendMsgBlockCnt()); - - } - - System.out.println("========================================================================="); - System.out.println("+++++++++++++++++++++++++++++++++++++++++++ resultSts ::: " + resultSts); - System.out.println("========================================================================="); - - try { - - //스팸문구 포함된 문자 발송의 경우 스팸 문구 내용도 별도 저장함. - String spamStatus = mjonMsgVO.getSpamStatus(); - - if(spamStatus == null) { - - spamStatus = "N"; - mjonMsgVO.setSpamStatus("N"); - - } - - if(spamStatus.equals("Y")) { - - int resultCnt = mjonSpamMsgService.insertSpamKeyWordMsgData(mjonMsgVO); - - System.out.println("+++++++++++++스팸문구 발송 내용 등록 +++++++++++++++++++++ "+resultCnt); - - } - - } catch (Exception e) { - System.out.println("========================================================================="); - System.out.println("+++++++++++++++++++++++++++++ fncSendMsgRtnMap() MJ_MSG_GROUP && CASH INSER ERROR !!! : " + e.getMessage()); - System.out.println("========================================================================="); - } - - }else { - - returnMap.put("message", "문자 발송에 필요한 보유 잔액이 부족 합니다."); - returnMap.put("result", "fail"); -// returnMap.put("resultSts", "0"); -// returnMap.put("resultBlockSts", "0"); - - return returnMap; -// return new StatusResponse(HttpStatus.BAD_REQUEST, "문자 발송에 필요한 보유 잔액이 부족 합니다."); - - } - - //문자 발송 후 남은 보유 캐시 정보 불러오기 - String afterCash = mjonMsgDataService.selectBeforeCashData(mjonMsgVO); - returnMap.put("afterCash", afterCash); - returnMap.put("message", "문자 전송이 완료되었습니다."); - returnMap.put("result", "success"); - returnMap.put("resultSts", Integer.toString(resultSts)); - returnMap.put("resultBlockSts", Integer.toString(resultBlockSts)); - - }catch(Exception e) { - log.error(e.getMessage(), e); - System.out.println("========================================================================="); - System.out.println("+++++++++++++++++++++++++++++ 기타 시스템 오류 : " + e.getMessage()); - System.out.println("========================================================================="); + // advc 현재 보유 금액 확인 + if (!isCashSufficient(mjonMsgVO)) { + returnMap.put("message", "문자 발송에 필요한 보유 잔액이 부족 합니다."); returnMap.put("result", "fail"); - returnMap.put("message", "기타 시스템 오류 : " + e.getMessage()); - + return returnMap; } + + // 보유 금액 및 포인트 데이터를 반환받아 새 MjonMsgVO 생성 + MjonMsgVO updatedMsgVO = setUserMoneyData(mjonMsgVO); + + + //문자 전송 그룹아이디 생성 + updatedMsgVO.setMsgGroupId(idgenMjonMsgGroupId.getNextStringId()); + + int callToListCnt = updatedMsgVO.getCallToList().length; + updatedMsgVO.setTotalCallCnt(callToListCnt); + + + // 예약 문자 처리 후 새로운 MjonMsgVO 반환 + updatedMsgVO = handleReserveMsg(updatedMsgVO); + + //분할 예약 시간 저장 리스트 생성 + List dividDayList = new ArrayList(); + + + mjonMsgVO.setDividDay(dividDayList); + MjonMsgReturnVO returnVO = insertMsgDataInfo_advc(updatedMsgVO); + resultSts = Integer.parseInt(returnVO.getSendMsgCnt()); + resultBlockSts = Integer.parseInt(returnVO.getSendMsgBlockCnt()); + + + System.out.println("========================================================================="); + System.out.println("+++++++++++++++++++++++++++++++++++++++++++ resultSts ::: " + resultSts); + System.out.println("========================================================================="); + + handleSpamMsg(updatedMsgVO); + + //문자 발송 후 남은 보유 캐시 정보 불러오기 + String afterCash = mjonMsgDataService.selectBeforeCashData(mjonMsgVO); + returnMap.put("afterCash", afterCash); + returnMap.put("message", "문자 전송이 완료되었습니다."); + returnMap.put("result", "success"); + returnMap.put("resultSts", Integer.toString(resultSts)); + returnMap.put("resultBlockSts", Integer.toString(resultBlockSts)); + return returnMap; } - // 단문 문자 발송 처리 메서드 - private Map sendShortMessages(MjonMsgVO shortMsgVO, ReplacementListsVO lists, StatusResponse statusResponse) { + private void handleSpamMsg(MjonMsgVO mjonMsgVO) { + try { + if ("Y".equals(mjonMsgVO.getSpamStatus())) { + int resultCnt = mjonSpamMsgService.insertSpamKeyWordMsgData(mjonMsgVO); + System.out.println("스팸 문구 발송 내용 등록: " + resultCnt); + } + } catch (Exception e) { + System.err.println("스팸 문구 처리 중 오류 발생: " + e.getMessage()); + } + } - log.info(" :: sendShortMessages :: "); + // 예약 문자인 경우 처리하는 메서드 + private MjonMsgVO handleReserveMsg(MjonMsgVO mjonMsgVO) throws ParseException { + if (!mjonMsgVO.getReserveYn().equals("N")) { + Calendar cal = Calendar.getInstance(); + SimpleDateFormat transFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); + + Date reserveDate = transFormat.parse(mjonMsgVO.getReqDate()); + cal.setTime(reserveDate); // 예약 시간 셋팅 + + int turmMin = Integer.parseInt(mjonMsgVO.getDivideTime()); // 분할 시간 간격 + int divideCnt = Integer.parseInt(mjonMsgVO.getDivideCnt()); // 분할 발송 갯수 + + // 분할 발송 예약 시간 셋팅 + List dividDayList = setDivideSendTime(mjonMsgVO, cal, transFormat, turmMin, divideCnt); + + mjonMsgVO.setDividDay(dividDayList); + + return mjonMsgVO; + } + + return mjonMsgVO; + } - shortMsgVO.setNameList(lists.getShortNameList()); - shortMsgVO.setCallToList(lists.getShortPhone()); - shortMsgVO.setRep1List(lists.getShortRep1()); - shortMsgVO.setRep2List(lists.getShortRep2()); - shortMsgVO.setRep3List(lists.getShortRep3()); - shortMsgVO.setRep4List(lists.getShortRep4()); + // 분할 발송 시간을 설정하여 리스트 반환 + private List setDivideSendTime(MjonMsgVO mjonMsgVO, Calendar cal, SimpleDateFormat transFormat, int turmMin, int divideCnt) { + List dividDayList = new ArrayList<>(); + String dividDay = transFormat.format(cal.getTime()); + + int count = 1; + for (int i = 0; i < mjonMsgVO.getCallToList().length; i++) { + if (count > divideCnt) { + count = 1; + cal.add(Calendar.MINUTE, turmMin); // 분할 시간 증가 + dividDay = transFormat.format(cal.getTime()); + } + dividDayList.add(dividDay); + count++; + } + + return dividDayList; + } - //개별단가 계산하기 - String eachPrice = shortMsgVO.getpPrice(); + // 보유 금액 및 포인트 셋팅 + private MjonMsgVO setUserMoneyData(MjonMsgVO mjonMsgVO) throws Exception { - //api 서버에서 sPrice 값이 없는 경우가 있어서 오류 방지를위해서 추가 - if(eachPrice == null) { - eachPrice = shortMsgVO.getEachPrice(); - } +// String userMoney = mjonMsgDataService.selectBeforeCashData(mjonMsgVO); +// String userPoint = mjonMsgDataService.selectBeforePointData(mjonMsgVO); + String userMoney = priceAndPoint.getBefCash(mjonMsgVO.getUserId()); + String userPoint = priceAndPoint.getBefPoint(mjonMsgVO.getUserId()); + + BigDecimal befCash = new BigDecimal(userMoney).setScale(2, RoundingMode.HALF_EVEN); + + MjonMsgVO updatedMsgVO = new MjonMsgVO(); // 원본을 복사한 새로운 객체 생성 + updatedMsgVO = mjonMsgVO; + updatedMsgVO.setBefPoint(userPoint); + updatedMsgVO.setBefCash(befCash.toString()); + + return updatedMsgVO; + + } - /** - * 그림문자에 치환 내용이 포함되어 있는 경우 단가 계산하기. - * 그림문자의 경우 이로직을 타지 않지만 혹시 몰라서 추가해놓음 - * - * */ - - // TODO : 기존 로직이라 리펙토링 예정 20240927 이호영 - int fileCount = Integer.parseInt(shortMsgVO.getFileCnt()); - if(fileCount > 2) {//그림 이미지가 3개 + // 보유 금액이 충분한지 확인하는 메서드 + private boolean isCashSufficient(MjonMsgVO mjonMsgVO) throws Exception { + String userMoney = priceAndPoint.getBefCash(mjonMsgVO.getUserId()); + BigDecimal befCash = new BigDecimal(userMoney).setScale(2, RoundingMode.HALF_EVEN); + BigDecimal totMsgPrice = new BigDecimal(mjonMsgVO.getTotPrice()).setScale(2, RoundingMode.HALF_EVEN); + + return befCash.compareTo(totMsgPrice) >= 0; + } - eachPrice = shortMsgVO.getP3Price(); + /** + * 범용 메시지 발송 처리 메서드 + * + * @param msgVO 발송할 메시지 VO + * @param lists 치환 데이터 리스트 + * @param msgType 메시지 유형 (short, long, img) + * @return 발송 결과 + * @throws Exception + * + * 20241002 이호영 + * 치환 후 장문, 단문이 모두 있을 수 있기 때문에 아래 로직처럼 모든 if를 열어둠 + */ + private Map sendMessages(MjonMsgVO msgVO, ReplacementListsVO lists) throws Exception { - }else if(fileCount > 1) {//그림 이미지가 2개 + Map resultMap = new HashMap<>(); + int totalResultSts = 0; + int totalResultBlockSts = 0; + + Map tempResult; - eachPrice = shortMsgVO.getP2Price(); + // Short 메시지 발송 + if (lists.getShortCnt() > 0) { + msgVO.setNameList(lists.getShortNameList()); + msgVO.setCallToList(lists.getShortPhone()); + msgVO.setRep1List(lists.getShortRep1()); + msgVO.setRep2List(lists.getShortRep2()); + msgVO.setRep3List(lists.getShortRep3()); + msgVO.setRep4List(lists.getShortRep4()); - }else if(fileCount == 1) {//그림 이미지가 1개 - eachPrice = shortMsgVO.getpPrice(); + log.info(" :: sendMessages - Type: short :: "); + tempResult = fncSendMsgRtnMap(msgVO); + + // 실패 여부 체크 후 즉시 반환 + if (tempResult.get("result").contains("fail")) { + return tempResult; + } - } + // 결과 합산 + totalResultSts += Integer.parseInt(tempResult.get("resultSts")); + totalResultBlockSts += Integer.parseInt(tempResult.get("resultBlockSts")); - shortMsgVO.setEachPrice(eachPrice); + resultMap.putAll(tempResult); + } - //문자 종류 선택 - if(fileCount > 0) {//그림문자인 경우 문자타임 지정 - shortMsgVO.setMsgType("6"); - }else { - shortMsgVO.setMsgType("4"); - } + // Long 메시지 발송 + if (lists.getLongCnt() > 0) { + msgVO.setNameList(lists.getLongNameList()); + msgVO.setCallToList(lists.getLongPhone()); + msgVO.setRep1List(lists.getLongRep1()); + msgVO.setRep2List(lists.getLongRep2()); + msgVO.setRep3List(lists.getLongRep3()); + msgVO.setRep4List(lists.getLongRep4()); - //총금액 계산하기 - Float sTotPrice = Float.parseFloat(shortMsgVO.getEachPrice()) * lists.getShortCnt(); - shortMsgVO.setTotPrice(sTotPrice.toString()); + log.info(" :: sendMessages - Type: long :: "); + tempResult = fncSendMsgRtnMap(msgVO); - //단문문자 발송 처리 - Map returnShortMap = fncSendMsgRtnMap(shortMsgVO); - return returnShortMap; - } + // 실패 여부 체크 후 즉시 반환 + if (tempResult.get("result").contains("fail")) { + return tempResult; + } + + // 결과 합산 + totalResultSts += Integer.parseInt(tempResult.get("resultSts")); + totalResultBlockSts += Integer.parseInt(tempResult.get("resultBlockSts")); + + resultMap.putAll(tempResult); + } + + // Img 메시지 발송 + if (lists.getImgCnt() > 0) { + msgVO.setNameList(lists.getImgNameList()); + msgVO.setCallToList(lists.getImgPhone()); + msgVO.setRep1List(lists.getImgRep1()); + msgVO.setRep2List(lists.getImgRep2()); + msgVO.setRep3List(lists.getImgRep3()); + msgVO.setRep4List(lists.getImgRep4()); + + log.info(" :: sendMessages - Type: img :: "); + tempResult = fncSendMsgRtnMap(msgVO); + + // 실패 여부 체크 후 즉시 반환 + if (tempResult.get("result").contains("fail")) { + return tempResult; + } + + // 결과 합산 + totalResultSts += Integer.parseInt(tempResult.get("resultSts")); + totalResultBlockSts += Integer.parseInt(tempResult.get("resultBlockSts")); + + resultMap.putAll(tempResult); + } + + // 누적된 resultSts와 resultBlockSts를 최종적으로 resultMap에 저장 + resultMap.put("resultSts", Integer.toString(totalResultSts)); + resultMap.put("resultBlockSts", Integer.toString(totalResultBlockSts)); + + return resultMap; + +/* + String msgType = ""; + + if (lists.getShortCnt() > 0) { + msgType = "short"; + } else if (lists.getLongCnt() > 0) { + msgType = "long"; + } else if (lists.getImgCnt() > 0) { + msgType = "img"; + } + + log.info(" :: sendMessages - Type: {} :: ", msgType); + + switch (msgType) { + case "short": + msgVO.setNameList(lists.getShortNameList()); + msgVO.setCallToList(lists.getShortPhone()); + msgVO.setRep1List(lists.getShortRep1()); + msgVO.setRep2List(lists.getShortRep2()); + msgVO.setRep3List(lists.getShortRep3()); + msgVO.setRep4List(lists.getShortRep4()); + break; + + case "long": + msgVO.setNameList(lists.getLongNameList()); + msgVO.setCallToList(lists.getLongPhone()); + msgVO.setRep1List(lists.getLongRep1()); + msgVO.setRep2List(lists.getLongRep2()); + msgVO.setRep3List(lists.getLongRep3()); + msgVO.setRep4List(lists.getLongRep4()); + break; + + case "img": + msgVO.setNameList(lists.getImgNameList()); + msgVO.setCallToList(lists.getImgPhone()); + msgVO.setRep1List(lists.getImgRep1()); + msgVO.setRep2List(lists.getImgRep2()); + msgVO.setRep3List(lists.getImgRep3()); + msgVO.setRep4List(lists.getImgRep4()); + break; + } + + return fncSendMsgRtnMap(msgVO); + + */ + } - // 장문 문자 발송 처리 메서드 - private Map sendLongMessages(MjonMsgVO longMsgVO, ReplacementListsVO lists, StatusResponse statusResponse) { - //장문문자 전송 이름, 전화번호, 변환문자 입력해주기 - - longMsgVO.setNameList(lists.getLongNameList()); - longMsgVO.setCallToList(lists.getLongPhone()); - longMsgVO.setRep1List(lists.getLongRep1()); - longMsgVO.setRep2List(lists.getLongRep2()); - longMsgVO.setRep3List(lists.getLongRep3()); - longMsgVO.setRep4List(lists.getLongRep4()); - - /** - * 그림문자에 치환 내용이 포함되어 있는 경우 단가 계산하기. - * 그림문자의 경우 이로직을 타지 않지만 혹시 몰라서 추가해놓음 - * */ - - String eachPrice = longMsgVO.getmPrice(); - - //api 서버에서 mPrice 값이 없는 경우가 있어서 오류 방지를위해서 추가 - if(eachPrice == null) { - - eachPrice = longMsgVO.getEachPrice(); - - } - - /** - * 그림문자에 치환 내용이 포함되어 있는 경우 단가 계산하기. - * 그림문자의 경우 이로직을 타지 않지만 혹시 몰라서 추가해놓음 - * TODO : 기존 로직이라 리펙토링 예정 - * */ - - int fileCount = Integer.parseInt(longMsgVO.getFileCnt()); - if(fileCount > 2) {//그림 이미지가 3개 - - eachPrice = longMsgVO.getP3Price(); - - }else if(fileCount > 1) {//그림 이미지가 2개 - - eachPrice = longMsgVO.getP2Price(); - - }else if(fileCount == 1) {//그림 이미지가 1개 - eachPrice = longMsgVO.getpPrice(); - - } - - longMsgVO.setEachPrice(eachPrice); - - //문자 종류 선택 - longMsgVO.setMsgType("6"); - - //총금액 계산하기 - Float mTotPrice = Float.parseFloat(longMsgVO.getEachPrice()) * lists.getLongCnt(); - longMsgVO.setTotPrice(mTotPrice.toString()); - - //장문문자 발송 - Map returnShortMap = fncSendMsgRtnMap(longMsgVO); - return returnShortMap; - } - // 그림 문자 발송 처리 메서드 - private Map sendImageMessages(MjonMsgVO imgMsgVO, ReplacementListsVO lists, StatusResponse statusResponse) { - log.info(" :: sendImageMessages :: "); - //그림문자 전송 이름, 전화번호, 변환문자 입력해주기 - - imgMsgVO.setNameList(lists.getImgNameList()); - imgMsgVO.setCallToList(lists.getImgPhone()); - imgMsgVO.setRep1List(lists.getImgRep1()); - imgMsgVO.setRep2List(lists.getImgRep2()); - imgMsgVO.setRep3List(lists.getImgRep3()); - imgMsgVO.setRep4List(lists.getImgRep4()); - - //개별단가 계산하기 - String eachPrice = imgMsgVO.getmPrice(); - - //api 서버에서 pPrice 값이 없는 경우가 있어서 오류 방지를위해서 추가 - if(eachPrice == null) { - - eachPrice = imgMsgVO.getEachPrice(); - - } - - /** - * 그림문자에 치환 내용이 포함되어 있는 경우 단가 계산하기. - * 그림문자의 경우 이로직을 타지 않지만 혹시 몰라서 추가해놓음 - * */ - int fileCount = Integer.parseInt(imgMsgVO.getFileCnt()); - - if(fileCount > 2) {//그림 이미지가 3개 - - eachPrice = imgMsgVO.getP3Price(); - - }else if(fileCount > 1) {//그림 이미지가 2개 - - eachPrice = imgMsgVO.getP2Price(); - - }else if(fileCount == 1) {//그림 이미지가 1개 - eachPrice = imgMsgVO.getpPrice(); - - } - - imgMsgVO.setEachPrice(eachPrice); - - //문자 종류 선택 - imgMsgVO.setMsgType("6"); - - //총금액 계산하기 - Float sTotPrice = Float.parseFloat(imgMsgVO.getEachPrice()) * lists.getImgCnt(); - imgMsgVO.setTotPrice(sTotPrice.toString()); - - //그림문자 발송 처리 - Map returnShortMap = fncSendMsgRtnMap(imgMsgVO); - return returnShortMap; - } // 20240924 이호영 // 이벤트 상태를 처리하는 메서드 @@ -4285,385 +4547,308 @@ public class MjonMsgDataServiceImpl extends EgovAbstractServiceImpl implements M /** * 문자발송시 치환문자가 없거나 그림문자일 경우 타는 로직 * param : MjonMsgVO - * return : ModelAndView + * return : StatusResponse * @throws Exception * * */ public StatusResponse fncSendMsg(MjonMsgVO mjonMsgVO) throws Exception { log.info(" :: fncSendMsg :: "); - ModelAndView modelAndView = new ModelAndView(); - modelAndView.setViewName("jsonView"); - int resultSts = 0; //발송결과 건수 int resultBlockSts = 0; //수신거부 등록번호로 발송을 안한 건수 + + + // Step 1: 메시지 내용이 있는지 확인 후 msgType 정하기 + String msgType = checkMessageContent(mjonMsgVO); + if (msgType == null) { + return new StatusResponse(HttpStatus.BAD_REQUEST, "입력 문자 내용을 확인할 수 없습니다. 문자 내용을 입력해 주세요."); + } + if ("INVALID".equals(msgType)) { + return new StatusResponse(HttpStatus.BAD_REQUEST, "문자 치환 후 전송 문자 길이를 초과하였습니다."); + } + mjonMsgVO.setMsgType(msgType); + + + log.debug("Step 2: Checking balance availability."); + // Step 2: 발신자의 잔액 확인 + if (!isCashSufficient(mjonMsgVO)) { + log.error("Insufficient balance for message sending."); + return new StatusResponse(HttpStatus.BAD_REQUEST, "문자 발송에 필요한 보유 잔액이 부족 합니다."); + } + + // 보유 포인트와 보유 캐시 정보를 VO에 설정 + mjonMsgVO.setBefPoint(priceAndPoint.getBefPoint(mjonMsgVO.getUserId())); // 현재 보유 포인트 정보 저장 + mjonMsgVO.setBefCash(priceAndPoint.getBefCash(mjonMsgVO.getUserId())); // 현재 보유 캐시 정보 저장 + -// try { - - //문자열 길이 체크 해주기 - String charset = "euc-kr"; - String smsCont = mjonMsgVO.getSmsTxt().replace("\r\n", "\n"); - int bytes = smsCont.getBytes(charset).length; //발송 문자 길이 - - if(mjonMsgVO.getFileName1() != null) { - mjonMsgVO.setMsgType("6"); - }else { - if(bytes < 2000) { - if(bytes > 90) {// 90Byte 초과시 장문 - mjonMsgVO.setMsgType("6"); - }else {// 그외 단문 - mjonMsgVO.setMsgType("4"); - } - - if(bytes < 1) {//단문, 장문의 경우 문자 내용이 없는 경우 발송 안되도록 처리 - - System.out.println("===================================fncSendMsg======================================"); - System.out.println("+++++++++++++++++++++++++++++++++++++++++++ 입력 문자 내용이 없습니다. ::: "); - System.out.println("===================================fncSendMsg======================================"); - -// modelAndView.addObject("message", "입력 문자 내용을 확인할 수 없습니다. 문자 내용을 입력해 주세요."); -// modelAndView.addObject("result", "fail"); -// modelAndView.addObject("resultSts", "0"); -// modelAndView.addObject("resultBlockSts", "0"); - - return new StatusResponse(HttpStatus.BAD_REQUEST, "입력 문자 내용을 확인할 수 없습니다. 문자 내용을 입력해 주세요."); - - } + mjonMsgVO.setMsgGroupId(idgenMjonMsgGroupId.getNextStringId()); - }else { //최대 문자길이 초과시 - -// modelAndView.addObject("message", "문자 치환 후 전송 문자 길이를 초과하였습니다."); -// modelAndView.addObject("result", "fail"); -// modelAndView.addObject("resultSts", "0"); -// modelAndView.addObject("resultBlockSts", "0"); + + log.debug("Step 3: Handling scheduled message."); + // Step 3: 예약 문자 처리 + if (isScheduledMessage(mjonMsgVO)) { + handleScheduledMessage(mjonMsgVO); + } - return new StatusResponse(HttpStatus.BAD_REQUEST, "문자 치환 후 전송 문자 길이를 초과하였습니다."); - } + log.debug("Step 4: Handling split message if required."); + // Step 4: 분할 발송이 필요한 경우 처리 + if (isDivideMessage(mjonMsgVO)) { + handleDivideMessage(mjonMsgVO); + } else if (isSplitRequired(mjonMsgVO)) { + handleSplitMessage(mjonMsgVO); + } else { + // 일반 문자 발송 로직 + sendMessage(mjonMsgVO); + } + + log.info("Message sending process completed."); + return new StatusResponse(HttpStatus.OK, "문자 전송이 완료되었습니다.", getReturnMap(resultSts, resultBlockSts)); + } + + + + /** + * @param mjonMsgVO + * @return String 메시지 타입 반환 (유효하지 않은 경우 "INVALID" 반환, 내용이 없을 경우 null 반환) + * @discription 메시지 내용을 확인하고 파일 첨부 여부 및 문자 길이에 따라 MMS 또는 SMS를 결정합니다. + * @throws IllegalArgumentException 메시지 길이가 초과된 경우 예외 발생 + * @작성자 20241007 이호영 + */ + private String checkMessageContent(MjonMsgVO mjonMsgVO) { + try { + // 문자 바이트 계산을 MsgSendUtils의 유틸리티 메서드를 사용하여 처리 + int smsBytes = MsgSendUtils.getSmsTxtBytes(mjonMsgVO.getSmsTxt()); + + // 메시지 내용이 없는 경우 null 반환 + if (smsBytes < 1) { + return null; } - - - //현재 고객의 보유 캐시가 문자 발송이 가능한 금액인지 체크 - String userMoney = mjonMsgDataService.selectBeforeCashData(mjonMsgVO); - String userPoint = mjonMsgDataService.selectBeforePointData(mjonMsgVO); - mjonMsgVO.setBefPoint(userPoint); //현재 보유 포인트 정보 저장 - String totPrice = mjonMsgVO.getTotPrice(); - - BigDecimal befCash = new BigDecimal(userMoney).setScale(2, RoundingMode.HALF_EVEN); - BigDecimal totMsgPrice = new BigDecimal(totPrice).setScale(2, RoundingMode.HALF_EVEN); - - - // 현재 보유 금액이 발송 문자 총 금액보다 클 경우만 문자 발송 - // BigDecimal 비교 연산 - // befCash(현재 보유금액) 값이 totMsgPrice(문자전송 금액) 보다 많으면 문자 전송 - if(befCash.compareTo(totMsgPrice) != -1) { // -1 : befCash < totMsgPrice, 0 : befCash = totMsgPrice, 1 : befCash > totMsgPrice, - - mjonMsgVO.setBefCash(userMoney); - // 문자 전송 그룹아이디 생성 - mjonMsgVO.setMsgGroupId(idgenMjonMsgGroupId.getNextStringId()); - - //문자 발송 처리 - //MjonMsgReturnVO returnVO = new MjonMsgReturnVO(); - String[] tempPhoneList = new String[200]; //임시 수신번호 리스트 저장용 배열 - String[] phoneList = mjonMsgVO.getCallToList(); - - int callToListCnt = mjonMsgVO.getCallToList().length; - mjonMsgVO.setTotalCallCnt(callToListCnt); - - /** - * 예약 문자인 경우 시간 및 분할 시간 셋팅 해주기 - * - * - * */ - //분할문자 시간에 간격시간 더해주기 - String dividDay = null; - Calendar cal = Calendar.getInstance(); - - //예약시간 변환 - SimpleDateFormat transFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); - - int turmMin = 0; - int totalCallCnt = 0; - int divideCnt = 0; - int count = 1; //분할 카운트 - - - if(!mjonMsgVO.getReserveYn().equals("N")) {//예약문자인 경우 시간 셋팅 - - Date toDate = transFormat.parse(mjonMsgVO.getReqDate()); - cal.setTime(toDate); //예약 시간 캘린터 변수에 입력 - - //String 타입 시간 Int로 변환 - turmMin = Integer.parseInt(mjonMsgVO.getDivideTime()); //분할발송 시간 간격 - dividDay = transFormat.format(cal.getTime()); - - totalCallCnt = mjonMsgVO.getCallToList().length; // 수신자 전체 갯수 - divideCnt = Integer.parseInt(mjonMsgVO.getDivideCnt()); //분할 발송 갯수 - - } - - //분할 예약 시간 저장 리스트 생성 - List dividDayList = new ArrayList(); - - //서비스 단으로 특정 문자 건수 이상으로 한번에 보내지 않기 위해서 처리함 - if(callToListCnt > 200) { - - int sendCnt = 0; - for(int i=0; i< callToListCnt; i++) { - - //분할 발송을 체크 한 경우 - if(mjonMsgVO.getDivideChk() != null) { - - if(count > divideCnt) { - - count = 1; - - //분할 시간 간격을 증가시켜 준다. - cal.add(Calendar.MINUTE, turmMin); - dividDay = transFormat.format(cal.getTime()); - - dividDayList.add(dividDay); - //tempVO.setReqDate(dividDay); //분할 문자 예약 시간 입력해주기 - count++; - - }else { - - dividDayList.add(dividDay); - //tempVO.setReqDate(dividDay); //분할 문자 예약 시간 입력해주기 - count++; - - } - - } - - if((i < callToListCnt -1) && sendCnt == 199) { - - //sendCnt 4번째 값을 추가해준다. - tempPhoneList[sendCnt] = phoneList[i]; - - List arrPhoneList = new ArrayList(); - - for(String temp : tempPhoneList) { - - if(temp != null) { - - arrPhoneList.add(temp); - - } - - } - - - String[] sendPhoneList = new String[arrPhoneList.size()]; - - for(int j=0; j< arrPhoneList.size(); j++) { - - sendPhoneList[j] = arrPhoneList.get(j); - - } - - - mjonMsgVO.setCallToList(sendPhoneList); - sendCnt = 0; - - mjonMsgVO.setDividDay(dividDayList); - MjonMsgReturnVO returnVO = mjonMsgDataService.insertMsgDataInfo(mjonMsgVO); - mjonMsgVO.setAgentCode(returnVO.getAgentCode()); - resultSts = resultSts + Integer.parseInt(returnVO.getSendMsgCnt()); - resultBlockSts = resultBlockSts + Integer.parseInt(returnVO.getSendMsgBlockCnt()); - - //발송 처리후 배열 초기화 - Arrays.fill(tempPhoneList, null); - dividDayList.clear(); - - }else if((i == callToListCnt -1) && sendCnt < 200){ - - //마지막 리스트의 수신번호를 추가해 준다. - tempPhoneList[sendCnt] = phoneList[i]; - - List arrPhoneList2 = new ArrayList(); - - for(String temp : tempPhoneList) { - - if(temp != null) { - - arrPhoneList2.add(temp); - - } - - } - - - String[] sendPhoneList2 = new String[arrPhoneList2.size()]; - - for(int j=0; j< arrPhoneList2.size(); j++) { - - sendPhoneList2[j] = arrPhoneList2.get(j); - - } - - - mjonMsgVO.setCallToList(sendPhoneList2); - sendCnt = 0; - - mjonMsgVO.setDividDay(dividDayList); - MjonMsgReturnVO returnVO = mjonMsgDataService.insertMsgDataInfo(mjonMsgVO); - mjonMsgVO.setAgentCode(returnVO.getAgentCode()); - resultSts = resultSts + Integer.parseInt(returnVO.getSendMsgCnt()); - resultBlockSts = resultBlockSts + Integer.parseInt(returnVO.getSendMsgBlockCnt()); - - }else { - - tempPhoneList[sendCnt] = phoneList[i]; - sendCnt++; - - } - - } - - }else { - - //분할 발송을 체크 한 경우 - if(mjonMsgVO.getDivideChk() != null) { - for(int i=0; i< callToListCnt; i++) { - if(count > divideCnt) { - - count = 1; - - //분할 시간 간격을 증가시켜 준다. - cal.add(Calendar.MINUTE, turmMin); - dividDay = transFormat.format(cal.getTime()); - - dividDayList.add(dividDay); - //tempVO.setReqDate(dividDay); //분할 문자 예약 시간 입력해주기 - count++; - - }else { - - dividDayList.add(dividDay); - //tempVO.setReqDate(dividDay); //분할 문자 예약 시간 입력해주기 - count++; - - } - - } - - } - - mjonMsgVO.setDividDay(dividDayList); - MjonMsgReturnVO returnVO = mjonMsgDataService.insertMsgDataInfo(mjonMsgVO); - mjonMsgVO.setAgentCode(returnVO.getAgentCode()); - resultSts = Integer.parseInt(returnVO.getSendMsgCnt()); - resultBlockSts = Integer.parseInt(returnVO.getSendMsgBlockCnt()); - System.out.println("======================================== totPrice ::: "+mjonMsgVO.getTotPrice()); - - } - - System.out.println("========================================================================="); - System.out.println("+++++++++++++++++++++++++++++++++++++++++++ resultSts ::: " + resultSts); - System.out.println("+++++++++++++++++++++++++++++++++++++++++++ resultBlockSts ::: " + resultBlockSts); - System.out.println("========================================================================="); - - try { - - - //스팸문구 포함된 문자 발송의 경우 스팸 문구 내용도 별도 저장함. - String spamStatus = mjonMsgVO.getSpamStatus(); - - if(spamStatus == null) { - - spamStatus = "N"; - mjonMsgVO.setSpamStatus("N"); - - } - - if(spamStatus.equals("Y")) { - - int resultCnt = mjonSpamMsgService.insertSpamKeyWordMsgData(mjonMsgVO); - - System.out.println("+++++++++++++스팸문구 발송 내용 등록 +++++++++++++++++++++ "+resultCnt); - - } - - } catch (Exception e) { - System.out.println("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"); - System.out.println("====================================== fncSendMsg MJ_MSG_GROUP && CASH ERROR !!! ::: " + e.getMessage()); - System.out.println("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"); - } - - }else { - - return new StatusResponse(HttpStatus.BAD_REQUEST, "문자 발송에 필요한 보유 잔액이 부족 합니다."); - - } - - //문자 발송 후 남은 보유 캐시 정보 불러오기 -// String afterCash = mjonMsgDataService.selectBeforeCashData(mjonMsgVO); -// modelAndView.addObject("afterCash", afterCash); - -// }catch(Exception e) { - -// log.error(e.getMessage(), e); - -// System.out.println("========================================================================="); -// System.out.println("++++++++++++++++++++++++++++++++++++++++++++기타 시스템 오류 : " + e.getMessage()); -// System.out.println("========================================================================="); -// -// modelAndView.addObject("result", "fail"); -// modelAndView.addObject("message", "기타 시스템 오류 : " + e.getMessage()); + // 메시지 타입 결정 로직을 MsgSendUtils의 getMsgType 메서드를 사용하여 처리 + String msgType = MsgSendUtils.getMsgType(mjonMsgVO, smsBytes); + if ("INVALID".equals(msgType)) { + return "INVALID"; + } -// } - - Map returnMap = new HashMap(); - -// returnMap.put("msgType", mjonMsgVO.getMsgType()); -// returnMap.put("msgGroupId", mjonMsgVO.getMsgGroupId()); - returnMap.put("resultSts", resultSts); - returnMap.put("resultBlockSts", resultBlockSts); - - - - return new StatusResponse(HttpStatus.OK, "문자 전송이 완료되었습니다.", returnMap); + return msgType; + } catch (UnsupportedEncodingException e) { + throw new IllegalArgumentException("문자 인코딩 중 오류가 발생하였습니다.", e); + } } + /** + * @param mjonMsgVO + * @return boolean 값으로 예약 문자 여부 확인 + * @discription 예약 여부에 따라 추가적인 예약 처리가 필요한지 확인합니다. + * @작성자 20241007 이호영 + */ + private boolean isScheduledMessage(MjonMsgVO mjonMsgVO) { + log.debug("Checking if the message is scheduled."); + // 예약 문자 여부 확인 (reserveYn이 "N"이 아닌 경우) + boolean isScheduled = !"N".equals(mjonMsgVO.getReserveYn()); + log.debug("Is scheduled: {}", isScheduled); + return isScheduled; + } + + /** + * @param mjonMsgVO + * @discription 예약 문자의 경우 예약 시간을 처리하고 예약 전송에 필요한 데이터를 설정합니다. + * @작성자 20241007 이호영 + */ + private void handleScheduledMessage(MjonMsgVO mjonMsgVO) { + log.debug("Handling scheduled message."); + try { + // 예약 시간 설정 및 처리 + SimpleDateFormat transFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); + Date toDate = transFormat.parse(mjonMsgVO.getReqDate()); + Calendar cal = Calendar.getInstance(); + cal.setTime(toDate); + String formattedDate = transFormat.format(cal.getTime()); + mjonMsgVO.setReqDate(formattedDate); + log.debug("Scheduled message date set to: {}", formattedDate); + } catch (ParseException e) { + log.error("Error occurred while parsing the scheduled date.", e); + throw new IllegalArgumentException("예약 시간 설정 중 오류가 발생하였습니다.", e); + } + } + + /** + * @param mjonMsgVO + * @return boolean 값으로 분할 발송 여부 확인 (DivideChk 기준) + * @discription DivideChk 필드를 기반으로 메시지가 분할 발송되어야 하는지 여부를 확인합니다. + * @작성자 20241007 이호영 + */ + private boolean isDivideMessage(MjonMsgVO mjonMsgVO) { + log.debug("Checking if the message needs to be divided."); + boolean needsDivide = mjonMsgVO.getDivideChk() != null; + log.debug("Needs divide: {}", needsDivide); + return needsDivide; + } + + /** + * @param mjonMsgVO + * @throws Exception + * @discription 메시지가 DivideChk 기준으로 분할 발송이 필요한 경우 처리합니다. + * @작성자 20241007 이호영 + */ + private void handleDivideMessage(MjonMsgVO mjonMsgVO) throws Exception { + log.debug("Handling divided message based on DivideChk."); + + // DivideChk 필드에 따라 메시지를 분할 발송하는 로직 구현 + // 예: 예약 시간 간격을 설정하고 해당 간격에 따라 여러 메시지로 나누어 발송합니다. + String[] phoneList = mjonMsgVO.getCallToList(); + int callToListCnt = phoneList.length; + mjonMsgVO.setTotalCallCnt(callToListCnt); + log.debug("Total call count set to: {}", callToListCnt); + + int batchSize = Integer.parseInt(mjonMsgVO.getDivideCnt()); // DivideChk에 설정된 배치 크기 사용 + int batchCount = (int) Math.ceil((double) callToListCnt / batchSize); + Calendar cal = Calendar.getInstance(); + SimpleDateFormat transFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); + List dividDayList = new ArrayList<>(); + + for (int batchIndex = 0; batchIndex < batchCount; batchIndex++) { + int startIdx = batchIndex * batchSize; + int endIdx = Math.min(startIdx + batchSize, callToListCnt); + String[] batchPhoneList = Arrays.copyOfRange(phoneList, startIdx, endIdx); + + // 분할 시간 설정 + if (batchIndex > 0) { + cal.add(Calendar.MINUTE, Integer.parseInt(mjonMsgVO.getDivideTime())); + } + String dividDay = transFormat.format(cal.getTime()); + dividDayList.add(dividDay); + mjonMsgVO.setDividDay(dividDayList); + + log.debug("Processing divided batch {} with {} recipients.", batchIndex + 1, batchPhoneList.length); + mjonMsgVO.setCallToList(batchPhoneList); + sendMessage(mjonMsgVO); + } + + log.debug("Divide message handling completed."); + } + + + /** + * @param mjonMsgVO + * @return boolean 값으로 분할 발송 여부 반환 + * @discription 메시지 발송 시 수신자 목록의 길이를 기준으로 분할 발송이 필요한지 판단합니다. + * @작성자 20241007 이호영 + */ + private boolean isSplitRequired(MjonMsgVO mjonMsgVO) { + log.debug("Determining if split is required based on recipient count."); + int recipientCount = mjonMsgVO.getCallToList().length; + boolean needsSplit = recipientCount > 200; + log.debug("Recipient count: {}, Needs split: {}", recipientCount, needsSplit); + return needsSplit; + } + /** + * @param mjonMsgVO + * @throws Exception + * @discription 메시지가 분할 발송이 필요한 경우 각 배치로 나누어 처리합니다. + * @작성자 20241007 이호영 + */ + private void handleSplitMessage(MjonMsgVO mjonMsgVO) throws Exception { + log.debug("Handling split message."); + String[] phoneList = mjonMsgVO.getCallToList(); + int callToListCnt = phoneList.length; + mjonMsgVO.setTotalCallCnt(callToListCnt); + log.debug("Total call count set to: {}", callToListCnt); + + int batchSize = 200; + int batchCount = (int) Math.ceil((double) callToListCnt / batchSize); + Calendar cal = Calendar.getInstance(); + SimpleDateFormat transFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); + List dividDayList = new ArrayList<>(); + String[] tempPhoneList = new String[batchSize]; + + for (int batchIndex = 0; batchIndex < batchCount; batchIndex++) { + int startIdx = batchIndex * batchSize; + int endIdx = Math.min(startIdx + batchSize, callToListCnt); + String[] batchPhoneList = Arrays.copyOfRange(phoneList, startIdx, endIdx); + System.arraycopy(batchPhoneList, 0, tempPhoneList, 0, batchPhoneList.length); + + // 분할 시간 설정 + if (batchIndex > 0) { + cal.add(Calendar.MINUTE, Integer.parseInt(mjonMsgVO.getDivideTime())); + } + String dividDay = transFormat.format(cal.getTime()); + dividDayList.add(dividDay); + mjonMsgVO.setDividDay(dividDayList); + + log.debug("Processing batch {} with {} recipients.", batchIndex + 1, batchPhoneList.length); + if (this.isLastBatch(batchPhoneList.length, batchIndex, batchCount)) { + this.processLastBatch(mjonMsgVO, tempPhoneList, batchPhoneList.length, dividDayList, phoneList[endIdx - 1]); + } else { + sendMessage(mjonMsgVO); + } + } + } + /** + * @param sendCnt + * @param currentIndex + * @param totalLength + * @return boolean 값으로 마지막 배치 여부 확인 + * @discription 현재 처리 중인 배치가 마지막 배치인지 확인합니다. + * @작성자 20241007 이호영 + */ + private boolean isLastBatch(int sendCnt, int currentIndex, int totalLength) { + boolean isLast = sendCnt == 199 || currentIndex == totalLength - 1; + log.debug("Is last batch: {}", isLast); + // 처리할 마지막 배치인지 확인 + return isLast; + } + /** + * @param mjonMsgVO + * @param tempPhoneList + * @param sendCnt + * @param dividDayList + * @param currentPhone + * @throws Exception + * @discription 마지막 배치를 처리하고 메시지를 발송합니다. + * @작성자 20241007 이호영 + */ + private void processLastBatch(MjonMsgVO mjonMsgVO, String[] tempPhoneList, int sendCnt, List dividDayList, String currentPhone) throws Exception { + log.debug("Processing last batch and sending message."); + tempPhoneList[sendCnt] = currentPhone; // 현재 전화번호를 배치에 추가 + mjonMsgVO.setCallToList(Arrays.copyOf(tempPhoneList, sendCnt + 1)); // 발송할 전화번호 목록 설정 + mjonMsgVO.setDividDay(dividDayList); // 해당 배치의 예약 시간 설정 + sendMessage(mjonMsgVO); // 메시지 배치 발송 + } + /** + * @param mjonMsgVO + * @throws Exception + * @discription 메시지 발송 데이터를 삽입하고 결과를 로그로 기록합니다. + * @작성자 20241007 이호영 + */ + private void sendMessage(MjonMsgVO mjonMsgVO) throws Exception { + log.debug("Sending message."); + // 메시지 데이터를 삽입하고 반환 값을 가져옴 + MjonMsgReturnVO returnVO = mjonMsgDataService.insertMsgDataInfo(mjonMsgVO); + mjonMsgVO.setAgentCode(returnVO.getAgentCode()); // VO에 에이전트 코드 설정 + log.info("Message sent: {} messages, {} blocked", returnVO.getSendMsgCnt(), returnVO.getSendMsgBlockCnt()); + } - - - - - - - - - - - - - - - - - - - - - - - - - + private Map getReturnMap(int resultSts, int resultBlockSts) { + log.debug("Generating return map with result status."); + Map returnMap = new HashMap<>(); + returnMap.put("resultSts", resultSts); + returnMap.put("resultBlockSts", resultBlockSts); + log.debug("Return map generated: {}", returnMap); + return returnMap; + } } diff --git a/src/main/resources/egovframework/sqlmap/config/mysql/sql-map-config-mysql-apikey.xml b/src/main/resources/egovframework/sqlmap/config/mysql/sql-map-config-mysql-apikey.xml index d624d184..fd7fb02d 100644 --- a/src/main/resources/egovframework/sqlmap/config/mysql/sql-map-config-mysql-apikey.xml +++ b/src/main/resources/egovframework/sqlmap/config/mysql/sql-map-config-mysql-apikey.xml @@ -1,6 +1,8 @@ - + + + diff --git a/src/main/resources/egovframework/sqlmap/let/holiday/MsgHolidayData_SQL_mysql.xml b/src/main/resources/egovframework/sqlmap/let/holiday/MsgHolidayData_SQL_mysql.xml index 529eab4d..a4e9cb45 100644 --- a/src/main/resources/egovframework/sqlmap/let/holiday/MsgHolidayData_SQL_mysql.xml +++ b/src/main/resources/egovframework/sqlmap/let/holiday/MsgHolidayData_SQL_mysql.xml @@ -3,7 +3,9 @@ ========= ======= ================================================= 2024.07.29 우영두 --> - + + + 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 81358dde..dc151e73 100644 --- a/src/main/webapp/WEB-INF/jsp/web/msgdata/MsgDataSMLView.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/msgdata/MsgDataSMLView.jsp @@ -2787,7 +2787,7 @@ function loadAddrList(){ */ var data = $("#searchAddrGrpForm").serialize(); - var url = "/web/mjon/msgdata/selectMsgAddrListAjax_advc.do"; + var url = "/web/mjon/msgdata/selectMsgAddrListAjax.do"; $.ajax({ type: "POST", diff --git a/src/main/webapp/WEB-INF/jsp/web/msgdata/MsgDataView.jsp b/src/main/webapp/WEB-INF/jsp/web/msgdata/MsgDataView.jsp index fbbcdf6e..408232ed 100644 --- a/src/main/webapp/WEB-INF/jsp/web/msgdata/MsgDataView.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/msgdata/MsgDataView.jsp @@ -1133,7 +1133,7 @@ function fn_sendMsgData(){ //수신번호 리스트 체크하기 var numCnt = 0; var nameList = []; //치환문자 이름 - var phoneNum = []; //받는사람 + var phoneNum = []; //받는사람 var rep1List = []; //치환문자1 var rep2List = []; //치환문자2 var rep3List = []; //치환문자3