diff --git a/src/main/java/itn/com/cmm/util/MsgSendUtils.java b/src/main/java/itn/com/cmm/util/MsgSendUtils.java new file mode 100644 index 00000000..d6234fc7 --- /dev/null +++ b/src/main/java/itn/com/cmm/util/MsgSendUtils.java @@ -0,0 +1,468 @@ +package itn.com.cmm.util; + +import java.io.UnsupportedEncodingException; + +import org.apache.commons.lang3.StringUtils; +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 lombok.extern.slf4j.Slf4j; + +/** + * + * @author : 이호영 + * @fileName : MsgSendUtils.java + * @date : 2024.09.23 + * @description : 메세지발송 데이터 다루는 유틸 + * =========================================================== + * DATE AUTHOR NOTE + * ----------------------------------------------------------- * + * 2024.09.23 이호영 최초 생성 + * + * + * + */ +@Slf4j +public final class MsgSendUtils { + + + /** + * @methodName : getSmsTxtBytes + * @author : 이호영 + * @date : 2024.09.23 + * @description : sms 텍스트 바이트 계산 후 return; + * @param smsTxt + * @return + * @throws UnsupportedEncodingException + */ + public static int getSmsTxtBytes(String smsTxt) throws UnsupportedEncodingException { //문자열 길이 체크 해주기 + int smsBytes = 0; + //문자 바이트 계산에 필요한 캐릭터 셋 : 한글 2Byte로 계산 + String charset = "euc-kr"; + if(StringUtils.isNotEmpty(smsTxt)) { + String smsCont = smsTxt.replace("\r\n", "\n"); + smsBytes = smsCont.getBytes(charset).length; + } + return smsBytes; + } + + /** + * @methodName : getMsgType + * @author : 이호영 + * @date : 2024.09.23 + * @description : msgType 재정의 + * @param mjonMsgVO + * @param smsTxtByte + * @return + */ + public static String getMsgType(MjonMsgVO mjonMsgVO, int smsTxtByte) { + String msgType = mjonMsgVO.getMsgType(); + + // 내문자저장함에 저장 후 문자를 발송하는 경우 문자 타입이 숫자가 아닌 문자로 넘어와서 변경 처리함 + if ("P".equals(msgType) || "L".equals(msgType)) { + msgType = "6"; + } else if ("S".equals(msgType)) { + msgType = "4"; + } + + // 그림 이미지가 첨부된 경우 장문으로 설정 + if (mjonMsgVO.getFileName1() != null || (mjonMsgVO.getImgFilePath() != null && mjonMsgVO.getImgFilePath().length > 0)) { + msgType = "6"; + } else if (smsTxtByte > 2000) { + // 2000 Byte를 초과할 경우 에러 처리 (이 부분은 호출부에서 검사하도록 유지할 수도 있음) + return "INVALID"; // 이 값은 호출부에서 에러 처리를 하도록 활용할 수 있습니다. + } else if (smsTxtByte > 90) { + // 90Byte 초과 시 장문으로 설정 + msgType = "6"; + } else { + // 그 외 단문으로 설정 + msgType = "4"; + } + + return msgType; + } + + public static float getValidPrice(Float personalPrice, Float defaultPrice) { + return (personalPrice != null && personalPrice > 0) ? personalPrice : defaultPrice; + } + + + /** + * @methodName : determinePriceByMsgType + * @author : 이호영 + * @date : 2024.09.24 + * @description : 문자 메시지 타입에 따라 단가를 결정하는 메서드 + * @param mjonMsgVO + * @param shortPrice + * @param longPrice + * @param picturePrice + * @param picture2Price + * @param picture3Price + * @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; + } + + 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; + } + + public static ReplacementListsVO createReplacementLists(MjonMsgVO mjonMsgVO) throws UnsupportedEncodingException { + ReplacementListsVO lists = new ReplacementListsVO(); + lists.initializeLists(mjonMsgVO); // 배열을 초기화합니다. + return lists; +// return populateReplacementLists(mjonMsgVO, lists); // 데이터를 배열에 채웁니다. + } + + /** + * @methodName : populateReplacementLists + * @author : 이호영 + * @date : 2024.09.26 + * @description : 배열에 데이터를 채우는 메서드 + * @param mjonMsgVO + * @param lists + * @param statusResponse + * @return + * @throws UnsupportedEncodingException + */ + public static void 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()); + + // 이름 치환 + 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("\\[\\*이름\\*\\]", ""); + } + } + + // 문자 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\\*\\]", ""); + } + } + + try { + int bytes = getSmsTxtBytes(smsTxt); + + if(bytes < 2000) { + if(fileCount > 0) { + 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++; + } + }else { + statusResponseSet(statusResponse, HttpStatus.BAD_REQUEST, "문자 치환 후 전송 문자 길이를 초과하였습니다."); + } + + } catch (UnsupportedEncodingException e) { + statusResponseSet(statusResponse, HttpStatus.BAD_REQUEST, "전송 중 오류가 발생하였습니다."); + e.printStackTrace(); + } + } + + lists.setShortCnt(shortCnt); + lists.setLongCnt(longCnt); + lists.setImgCnt(imgCnt); + + } + + private static void populateShortLists(ReplacementListsVO lists, String[] nameList, String[] phone, String[] rep1, + String[] rep2, String[] rep3, String[] rep4, String smsTxt, int i) { + // 이름 치환 + if (smsTxt.contains("[*이름*]")) { + if (nameList.length > i && StringUtil.isNotEmpty(nameList[i])) { + lists.getShortNameList()[i] = StringUtil.getString(nameList[i].replaceAll("§", ",")); + } else { + lists.getShortNameList()[i] = " "; + } + } else { + lists.getShortNameList()[i] = getSafeValue(nameList, i); + } + + lists.getShortPhone()[i] = getSafeValue(phone, i); + + // 문자 1 치환 + if (smsTxt.contains("[*1*]")) { + lists.getShortRep1()[i] = getReplacementValue(rep1, i, "[*1*]"); + } else { + lists.getShortRep1()[i] = getSafeValue(rep1, i); + } + + // 문자 2 치환 + if (smsTxt.contains("[*2*]")) { + lists.getShortRep2()[i] = getReplacementValue(rep2, i, "[*2*]"); + } else { + lists.getShortRep2()[i] = getSafeValue(rep2, i); + } + + // 문자 3 치환 + if (smsTxt.contains("[*3*]")) { + lists.getShortRep3()[i] = getReplacementValue(rep3, i, "[*3*]"); + } else { + lists.getShortRep3()[i] = getSafeValue(rep3, i); + } + + // 문자 4 치환 + if (smsTxt.contains("[*4*]")) { + lists.getShortRep4()[i] = getReplacementValue(rep4, i, "[*4*]"); + } else { + lists.getShortRep4()[i] = getSafeValue(rep4, i); + } + } + + // 장문 리스트에 데이터를 채우는 메서드 + private static void populateLongLists(ReplacementListsVO lists, String[] nameList, String[] phone, String[] rep1, String[] rep2, String[] rep3, String[] rep4, String smsTxt, int i) { + // 이름 치환 + if (smsTxt.contains("[*이름*]")) { + if (nameList.length > i && StringUtil.isNotEmpty(nameList[i])) { + lists.getLongNameList()[i] = StringUtil.getString(nameList[i].replaceAll("§", ",")); + } else { + lists.getLongNameList()[i] = " "; + } + } else { + lists.getLongNameList()[i] = getSafeValue(nameList, i); + } + + lists.getLongPhone()[i] = getSafeValue(phone, i); + + // 문자 1 치환 + if (smsTxt.contains("[*1*]")) { + lists.getLongRep1()[i] = getReplacementValue(rep1, i, "[*1*]"); + } else { + lists.getLongRep1()[i] = getSafeValue(rep1, i); + } + + // 문자 2 치환 + if (smsTxt.contains("[*2*]")) { + lists.getLongRep2()[i] = getReplacementValue(rep2, i, "[*2*]"); + } else { + lists.getLongRep2()[i] = getSafeValue(rep2, i); + } + + // 문자 3 치환 + if (smsTxt.contains("[*3*]")) { + lists.getLongRep3()[i] = getReplacementValue(rep3, i, "[*3*]"); + } else { + lists.getLongRep3()[i] = getSafeValue(rep3, i); + } + + // 문자 4 치환 + if (smsTxt.contains("[*4*]")) { + lists.getLongRep4()[i] = getReplacementValue(rep4, i, "[*4*]"); + } else { + lists.getLongRep4()[i] = getSafeValue(rep4, i); + } + } + + // 그림 문자 리스트에 데이터를 채우는 메서드 + private static void populateImgLists(ReplacementListsVO lists, String[] nameList, String[] phone, String[] rep1, String[] rep2, String[] rep3, String[] rep4, String smsTxt, int i) { + + // 이름 치환 + if (smsTxt.contains("[*이름*]")) { + if (nameList.length > i && StringUtil.isNotEmpty(nameList[i])) { + lists.getImgNameList()[i] = StringUtil.getString(nameList[i].replaceAll("§", ",")); + } else { + lists.getImgNameList()[i] = " "; + } + } else { + lists.getImgNameList()[i] = getSafeValue(nameList, i); + } + + lists.getImgPhone()[i] = getSafeValue(phone, i); + + // 문자 1 치환 + if (smsTxt.contains("[*1*]")) { + lists.getImgRep1()[i] = getReplacementValue(rep1, i, "[*1*]"); + } else { + lists.getImgRep1()[i] = getSafeValue(rep1, i); + } + + // 문자 2 치환 + if (smsTxt.contains("[*2*]")) { + lists.getImgRep2()[i] = getReplacementValue(rep2, i, "[*2*]"); + } else { + lists.getImgRep2()[i] = getSafeValue(rep2, i); + } + + // 문자 3 치환 + if (smsTxt.contains("[*3*]")) { + lists.getImgRep3()[i] = getReplacementValue(rep3, i, "[*3*]"); + } else { + lists.getImgRep3()[i] = getSafeValue(rep3, i); + } + + // 문자 4 치환 + if (smsTxt.contains("[*4*]")) { + lists.getImgRep4()[i] = getReplacementValue(rep4, i, "[*4*]"); + } else { + lists.getImgRep4()[i] = getSafeValue(rep4, i); + } + + } + + // 배열 인덱스를 안전하게 접근하는 메서드 + private static String getSafeValue(String[] array, int index) { + return (array != null && array.length > index) ? array[index] : " "; + } + + // 치환 처리에 특수문자 제거 로직이 포함된 메서드 + private static String getReplacementValue(String[] array, int index, String placeholder) { + if (array != null && array.length > index && StringUtil.isNotEmpty(array[index])) { + return StringUtil.getString(array[index].replaceAll("§", ",")); + } else { + return " "; + } + } + + + /** + * @methodName : checkReplacementDataValidity + * @author : 이호영 + * @date : 2024.09.25 + * @description : 치환문자가 사용될 때 데이터가 올바른지 확인하는 메서드 + * @param mjonMsgVO + * @param modelAndView + * @return boolean + */ + public static boolean checkReplacementDataValidity(MjonMsgVO mjonMsgVO, 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(); + + boolean isRepCountOk = true; + + // 치환 문자 전체 필수 체크 + if (mjonMsgVO.getSmsTxt().contains("[*이름*]") && nameList.length != phone.length) { + isRepCountOk = false; + } + if (mjonMsgVO.getSmsTxt().contains("[*1*]") && rep1.length != phone.length) { + isRepCountOk = false; + } + if (mjonMsgVO.getSmsTxt().contains("[*2*]") && rep2.length != phone.length) { + isRepCountOk = false; + } + if (mjonMsgVO.getSmsTxt().contains("[*3*]") && rep3.length != phone.length) { + isRepCountOk = false; + } + if (mjonMsgVO.getSmsTxt().contains("[*4*]") && rep4.length != phone.length) { + isRepCountOk = false; + } + + // 검증 결과가 false인 경우 에러 메시지 반환 + if (!isRepCountOk) { + + statusResponseSet(statusResponse, HttpStatus.BAD_REQUEST, "특정문구 일괄변환 치환문자 데이터가 없습니다."); + return false; + } + + return true; + } + + + private static void statusResponseSet (StatusResponse statusResponse, HttpStatus httpStatus, String msg ) { + statusResponse.setStatus(httpStatus); + statusResponse.setMessage(msg); + + } + + +} diff --git a/src/main/java/itn/let/mail/service/StatusResponse.java b/src/main/java/itn/let/mail/service/StatusResponse.java index baf77c12..50649c95 100644 --- a/src/main/java/itn/let/mail/service/StatusResponse.java +++ b/src/main/java/itn/let/mail/service/StatusResponse.java @@ -85,13 +85,19 @@ public class StatusResponse { this.timestamp = timestamp; this.messageTemp = messageTemp; } - - @Builder - public StatusResponse(HttpStatus status, String msg, Object data) { + + public StatusResponse(HttpStatus status, String message) { this.status = status; - this.message = msg; - this.object = data; + this.message = message; } + + + public StatusResponse(HttpStatus status, String message, Object object) { + this.status = status; + this.message = message; + this.object = object; + } + 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 5148dd10..11270c04 100644 --- a/src/main/java/itn/let/mjo/msgdata/service/MjonMsgDataService.java +++ b/src/main/java/itn/let/mjo/msgdata/service/MjonMsgDataService.java @@ -2,7 +2,10 @@ package itn.let.mjo.msgdata.service; import java.util.List; +import javax.servlet.http.HttpServletRequest; + import itn.let.lett.service.LetterVO; +import itn.let.mail.service.StatusResponse; import itn.let.mjo.addr.service.AddrVO; import itn.let.mjo.msg.service.MjonMsgVO; import itn.let.sym.site.service.JoinSettingVO; @@ -179,6 +182,8 @@ 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/ReplacementListsVO.java b/src/main/java/itn/let/mjo/msgdata/service/ReplacementListsVO.java new file mode 100644 index 00000000..7684dbe6 --- /dev/null +++ b/src/main/java/itn/let/mjo/msgdata/service/ReplacementListsVO.java @@ -0,0 +1,59 @@ +package itn.let.mjo.msgdata.service; + +import itn.let.mjo.msg.service.MjonMsgVO; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@NoArgsConstructor +public class ReplacementListsVO { + String[] shortNameList; + String[] shortPhone; + String[] shortRep1; + String[] shortRep2; + String[] shortRep3; + String[] shortRep4; + int shortCnt; + + String[] longNameList; + String[] longPhone; + String[] longRep1; + String[] longRep2; + String[] longRep3; + String[] longRep4; + int longCnt; + + String[] imgNameList; + String[] imgPhone; + String[] imgRep1; + String[] imgRep2; + String[] imgRep3; + String[] imgRep4; + int imgCnt; + + // 배열을 초기화하는 메서드 + public void initializeLists(MjonMsgVO mjonMsgVO) { + shortNameList = new String[Integer.parseInt(mjonMsgVO.getShortMsgCnt())]; + shortPhone = new String[shortNameList.length]; + shortRep1 = new String[shortNameList.length]; + shortRep2 = new String[shortNameList.length]; + shortRep3 = new String[shortNameList.length]; + shortRep4 = new String[shortNameList.length]; + + longNameList = new String[Integer.parseInt(mjonMsgVO.getLongMsgCnt())]; + longPhone = new String[longNameList.length]; + longRep1 = new String[longNameList.length]; + longRep2 = new String[longNameList.length]; + longRep3 = new String[longNameList.length]; + longRep4 = new String[longNameList.length]; + + imgNameList = new String[mjonMsgVO.getCallToList().length]; + imgPhone = new String[imgNameList.length]; + imgRep1 = new String[imgNameList.length]; + imgRep2 = new String[imgNameList.length]; + imgRep3 = new String[imgNameList.length]; + imgRep4 = new String[imgNameList.length]; + } +} 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 56a847ca..b87433d5 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,21 +1,37 @@ package itn.let.mjo.msgdata.service.impl; +import java.math.BigDecimal; +import java.math.RoundingMode; import java.text.SimpleDateFormat; import java.util.ArrayList; +import java.util.Arrays; import java.util.Calendar; 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.springframework.http.HttpStatus; import org.springframework.stereotype.Service; +import org.springframework.web.servlet.ModelAndView; import egovframework.rte.fdl.cmmn.EgovAbstractServiceImpl; import egovframework.rte.fdl.idgnr.EgovIdGnrService; +import egovframework.rte.fdl.security.userdetails.util.EgovUserDetailsHelper; import egovframework.rte.psl.dataaccess.util.EgovMap; +import itn.com.cmm.LoginVO; import itn.com.cmm.util.MJUtil; +import itn.com.cmm.util.MsgSendUtils; import itn.com.cmm.util.StringUtil; +import itn.com.utl.fcc.service.EgovStringUtil; import itn.let.lett.service.LetterVO; +import itn.let.lett.service.impl.LetterDAO; +import itn.let.mail.service.StatusResponse; import itn.let.mjo.addr.service.AddrVO; import itn.let.mjo.event.service.MjonEventService; import itn.let.mjo.event.service.MjonEventVO; @@ -29,3173 +45,4638 @@ import itn.let.mjo.msgagent.service.impl.MjonMsgAgentStsDAO; import itn.let.mjo.msgdata.service.MjonMsgDataService; import itn.let.mjo.msgdata.service.MjonMsgDataVO; import itn.let.mjo.msgdata.service.MjonMsgReturnVO; +import itn.let.mjo.msgdata.service.ReplacementListsVO; import itn.let.mjo.msgholiday.service.MsgAlarmSetVO; import itn.let.mjo.msgholiday.service.MsgHolidayVO; import itn.let.mjo.msgholiday.service.impl.MsgHolidayDAO; 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.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 @Service("MjonMsgDataService") public class MjonMsgDataServiceImpl extends EgovAbstractServiceImpl implements MjonMsgDataService{ - @Resource(name="MjonMsgDataDAO") - private MjonMsgDataDAO mjonMsgDataDAO; - - @Resource(name="mjonMsgDAO") - private MjonMsgDAO mjonMsgDAO; - - @Resource(name="mjonPayDAO") - private MjonPayDAO mjonPayDAO; - - @Resource(name="mjonMsgAgentStsDAO") - private MjonMsgAgentStsDAO mjonMsgAgentStsDAO; - - @Resource(name="siteManagerDAO") - SiteManagerDAO siteManagerDAO; - - @Resource(name="MsgHolidayDAO") - private MsgHolidayDAO msgHolidayDAO; - - @Resource(name = "egovMjonMsgIdGnrService") + @Resource(name="MjonMsgDataDAO") + private MjonMsgDataDAO mjonMsgDataDAO; + + @Resource(name="mjonMsgDAO") + private MjonMsgDAO mjonMsgDAO; + + @Resource(name="mjonPayDAO") + private MjonPayDAO mjonPayDAO; + + @Resource(name="mjonMsgAgentStsDAO") + private MjonMsgAgentStsDAO mjonMsgAgentStsDAO; + + @Resource(name="siteManagerDAO") + SiteManagerDAO siteManagerDAO; + + @Resource(name="MsgHolidayDAO") + private MsgHolidayDAO msgHolidayDAO; + + + @Resource(name="LetterDAO") + private LetterDAO letterDAO; + + /** userManageService */ + @Resource(name = "userManageService") + private EgovUserManageService userManageService; + + @Resource(name = "egovMjonMsgIdGnrService") private EgovIdGnrService idgenMsgId; - + @Resource(name = "egovMjonMsgGroupIdGnrService") private EgovIdGnrService idgenMjonMsgGroupId; - - @Resource(name = "egovPhoneMemberIdGnrService") + + @Resource(name = "egovPhoneMemberIdGnrService") private EgovIdGnrService idgenPhoneMemberId; - - @Resource(name = "egovMjonCashIdGnrService") + + @Resource(name = "egovMjonCashIdGnrService") private EgovIdGnrService idgenMjonCashId; - - @Resource(name = "egovSystemSendIdGnrService") + + @Resource(name = "egovSystemSendIdGnrService") private EgovIdGnrService idgenSystemSendId; - - @Resource(name = "MjonMsgDataService") - private MjonMsgDataService mjonMsgDataService; - - @Resource(name = "mjonPayService") + + @Resource(name = "MjonMsgDataService") + private MjonMsgDataService mjonMsgDataService; + + @Resource(name = "mjonPayService") private MjonPayService mjonPayService; - - @Resource(name = "MjonEventService") + + @Resource(name = "MjonEventService") private MjonEventService mjonEventService; - - @Resource(name = "mjonMsgAgentStsService") - private MjonMsgAgentStsService mjonMsgAgentStsService; - - - public List selectCcmCmmCodeList() throws Exception{ - - return mjonMsgDataDAO.selectCcmCmmCodeList(); - } - - public MjonMsgReturnVO insertMsgDataInfo(MjonMsgVO mjonMsgVO) throws Exception{ - - MjonMsgReturnVO returnVO = new MjonMsgReturnVO(); - - try { - - // 문자 전송 그룹아이디 생성 - //mjonMsgVO.setMsgGroupId(idgenMjonMsgGroupId.getNextStringId()); - - // 문자 아이디 생성 - //mjonMsgVO.setMsgId(idgenMsgId.getNextStringId()); - - String msgType = mjonMsgVO.getMsgType(); - String agentCode = mjonMsgVO.getAgentCode(); - // 장문 전송 - String contSeq = ""; - - //float myPrice = 10000; - //float totPrice = Float.parseFloat(mjonMsgVO.getTotPrice()); - // 최종 입력 수 저장 변수 - int resultCnt = 0; - int limitCnt = 1000; - int blockCnt = 0; - - // 총 보유 금액과 전송 합계 비교 - - /*if(myPrice < totPrice) { // 보유 금액보다 전송 합계가 적은 경우 리턴 - - return 0 ; - }*/ - - int callToCnt = mjonMsgVO.getCallToList().length; //전체 받는사람 건수 - mjonMsgVO.setMsgGroupCnt(Integer.toString(callToCnt)); - - - //그룹 테이블에 입력할 발송 시간 및 예약 발송 시간 처리 - /*if(mjonMsgVO.getReserveYn().equals("N")) {//즉시 전송의 경우 현재 시간을 입력 - - Date now = new Date(); - - SimpleDateFormat sdFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); - - mjonMsgVO.setReqDate(sdFormat.format(now)); - - }*/ - - //사용자 현재 보유 금액 불러오기(문자 발송 금액 차감 이전 금액) - String befCash = mjonMsgVO.getBefCash(); - - //VO에서 현재 보유금액이 없으면 디비에서 조회해서 불러옴 - if("".equals(befCash) || befCash == null) { - befCash = mjonMsgDataDAO.selectBeforeCashData(mjonMsgVO); - } - - mjonMsgVO.setBefCash(befCash); - // 문자 전송 그룹 테이블에 정보 입력 - //mjonMsgDAO.insertGroupMsgData(mjonMsgVO); - - //수신거부 목록 불러오기 - List userBlockList = mjonMsgDAO.selectUserBlockList(mjonMsgVO); - - 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(); - - //스팸,스미싱이어도 딜레이없이 문자 전송을 처리할지 선택 상태값 변수 - boolean spamSmishingPassStatus = false; //야간스미싱 알림여부가 활성화인 경우 false, 비활성화인경우 true 값을 가지도록 한다. - - //스팸, 스미싱 상태인 경우에만 true 처리 - //야간스미싱알리 여부가 활성화 인경우 무조건 문자를 즉시 보내도록 한다. - //스미싱 알림 일정에 등록된 날짜와 시간에 포함되면 30분 딜레이 없이 발송 처리하도록 함. - if(holiSmishingNoti.equals("Y")) { - - MsgAlarmSetVO msgAlarmSetVO = new MsgAlarmSetVO(); - - msgAlarmSetVO.setUseYn("Y"); - msgAlarmSetVO.setFirstIndex(0); - - List resultAlarmList = msgHolidayDAO.selectAlarmSettingList(msgAlarmSetVO); - - Calendar calendar = Calendar.getInstance(); - int year = calendar.get(Calendar.YEAR); - - MsgHolidayVO msgHolidayVO = new MsgHolidayVO(); - msgHolidayVO.setFirstIndex(0); - msgHolidayVO.setRecordCountPerPage(100); - msgHolidayVO.setSearchHoliYear(Integer.toString(year)); - - List resultHolidayList = msgHolidayDAO.selectMsgHolidayList(msgHolidayVO); - - MjonHolidayApi mjonHolidayApi = new MjonHolidayApi(); - - boolean smishingAlarmPassSts = mjonHolidayApi.getHolidaySmishingPassStatus(resultAlarmList, resultHolidayList); - - spamSmishingPassStatus = smishingAlarmPassSts; - }else { - - spamSmishingPassStatus = true; - - } - - //전용 전송사가 지정되어 있으면 실행 - if(!hotlineAgentCode.equals("00")) { - - MjonMsgAgentStsVO mjonMsgAgentStsVO = new MjonMsgAgentStsVO(); - mjonMsgAgentStsVO.setAgentCode(hotlineAgentCode); - - //문자 타입 셋팅 - if(msgType.equals("6")) { - 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(userInfo.getBlineCode().equals("N")) { - //회원 전용 전송사의 전송 비율이 0 이면 대표전송사로 전송되도록 셋팅함. - if(mberSendRate.equals("0") || useYn.equals("N")) { - - 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(int i=0; i< sendRateSize; i++) { - - String sndAgentCode = sendRateList.get(i).getAgentCode(); - - if(sndAgentCode.equals("01")) {//아이하트 전송비율 - - iheartCnt = Math.round(callToCnt * Float.parseFloat(sendRateList.get(i).getSendRate())); - - }else if(sndAgentCode.equals("02")) {//현대퓨처넷 전송비율 - - hncCnt = Math.round(callToCnt * Float.parseFloat(sendRateList.get(i).getSendRate())); - - }else if(sndAgentCode.equals("03")) {//아이엠오 전송비율 - - imoCnt = Math.round(callToCnt * Float.parseFloat(sendRateList.get(i).getSendRate())); - - }else if(sndAgentCode.equals("04")) {//비즈뿌리오 전송비율 - - 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 if(sndAgentCode.equals("07")) {//인비토 전송비율 - - ivtCnt = Math.round(callToCnt * Float.parseFloat(sendRateList.get(i).getSendRate())); - - } - - } - } - - /** - * 한번에 서버가 보낼수 있는 문자건수를 체크 해서 넘으면 분할해서 디비 입렵해 준다. - * 발송 건수가 천 건이 넘어가면, 백건씩 끊어서 발송 하도록 한다. - * */ - - 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(spamStatus == null || spamStatus.equals("")) { - - spamStatus = "N"; - - } - - if(smishingYn == null || smishingYn.equals("")) { - - smishingYn = "N"; - - } - - //야간 스미싱 알림여부가 활성화 이고 예외시간에 포함되는 경우 스팸, 스미싱, 딜레이 값을 모두 N 으로 처리 - if(spamSmishingPassStatus) { - - spamStatus = "N"; - smishingYn = "N"; - delayYn = "N"; - - } - - - 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()); //분할 발송 갯수 - - if(spamStatus.equals("Y") || smishingYn.equals("Y")) { - - mjonMsgVO.setDelayYn("Y");//일단 값만 등록해준다. 이거 안해주면 NULL 값으로 들어간다. 차후에 변경하도록 할 예정임, 원래는 스팸이면 Y로 넣어줘야한다. - - }else { - - mjonMsgVO.setDelayYn("N");//일단 값만 등록해준다. 이거 안해주면 NULL 값으로 들어간다. 차후에 변경하도록 할 예정임 - } - - }else {//즉시발송의 경우 현재 시간으로 입력해 준다. - - Date now = new Date(); - if(spamStatus.equals("Y") || smishingYn.equals("Y")) {//스팸 문자가 포함되었거나, 스미싱 의심 회원의 경우 문자발송 시간을 30분 딜레이 시킨다. - - 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 {//정상적인 문자인 경우 즉시발송 처리해준다. - - mjonMsgVO.setReqDate(transFormat.format(now)); - mjonMsgVO.setDelayYn(delayYn);//문자 발송 30분 지연 디폴트 값 셋팅(N) - - } - - } - - - 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 리스트 - - //Controller에서 전달 받은 분할 시간 정보 리스트 - List dividDayList = mjonMsgVO.getDividDay(); - - String frstDelayTime = mjonMsgVO.getReqDate(); - //문자발송 리스트 생성 시작 - for(int i = 0; i < callToCnt; i++) { - - Boolean blockSts = false; - for(int j = 0; j < usrBlockCnt; j++) { + @Resource(name = "mjonMsgAgentStsService") + private MjonMsgAgentStsService mjonMsgAgentStsService; + + @Resource(name = "mjonSpamMsgService") + private MjonSpamMsgService mjonSpamMsgService; - if(phoneList[i].equals(dupliBlockList.get(j).toString())) { - - blockCnt++; //수신 차단 카운드를 해준다. - blockSts = true; - - } - - } - - if(!blockSts) { //수신거부가 아니면 추가 - - MjonMsgVO tempVO = new MjonMsgVO(); - - /** - * 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")) { // 단순 장문 문자 - - mjonMsgVO.setNeoType("2"); - - }else{ // 그림포함 문자인경우 - - 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("\\[\\*이름\\*\\]", ""); - } - } - - 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\\*\\]", ""); - } - } - - 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\\*\\]", ""); - } - } - - tempVO.setSmsTxt(smsTxt); - - //즉시 / 예약 전송 처리 - if(mjonMsgVO.getReserveYn().equals("N")) {//즉시 전송의 경우 현재 시간을 입력 - - 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(); - } + public List selectCcmCmmCodeList() throws Exception{ - //제목 글자수 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); + return mjonMsgDataDAO.selectCcmCmmCodeList(); + } - //메세지 그룹 데이터가 없으면 추가 해주고 있으면 총메세지 건수를 합산해준다. - 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{ - - //이벤트 회원인 경우 이벤트 캐시도 함께 차감. - MjonEventVO mjonEventVO = new MjonEventVO(); - mjonEventVO.setMberId(mjonPayVO.getUserId()); - mjonEventVO.setEventStatus("Y"); - MjonEventVO eventMberInfo = mjonEventService.selectEventMsgMberDefaultInfo(mjonEventVO); - - if(eventMberInfo != null) { - - float evntRemainCash = (float) eventMberInfo.getEventRemainCash(); - float totPrice = (float) Math.abs(mjonPayVO.getCash()); - - float totRemainCash = evntRemainCash - totPrice; - mjonEventVO.setEventInfoId(eventMberInfo.getEventInfoId()); - - if(totRemainCash <= 0.0) {//차감액이 남아있지 않으면 이벤트를 종료 - - //이벤트 상태값을 종료로 변경한다. - mjonEventVO.setEventStatus("E"); - mjonEventVO.setEventRemainCash(0.0); - mjonEventService.updateEventEndStatus(mjonEventVO); - - }else {//이벤트 회원 캐시 차감시킴 - - mjonEventVO.setEventRemainCash(totRemainCash); - mjonEventService.updateEventRemainCash(mjonEventVO); - - } - - } - - } + public MjonMsgReturnVO insertMsgDataInfo(MjonMsgVO mjonMsgVO) throws Exception{ - //성능 테스트용************************************************************************ - public MjonMsgReturnVO insertMsgTestDataInfo(MjonMsgVO mjonMsgVO - , int i_nRate - , int i_hRate - , int i_iRate - , String p_msgGroupId - ) throws Exception{ - - // 문자 전송 그룹아이디 생성 - if ("".equals(p_msgGroupId)) { - //String s_msgGroupId = idgenMjonMsgGroupId.getNextStringId(); - p_msgGroupId = idgenMjonMsgGroupId.getNextStringId(); - } - - mjonMsgVO.setMsgGroupId(p_msgGroupId); - - // 문자 아이디 생성 - //mjonMsgVO.setMsgId(idgenMsgId.getNextStringId()); - - String msgType = mjonMsgVO.getMsgType(); - String agentCode = mjonMsgVO.getAgentCode(); - + MjonMsgReturnVO returnVO = new MjonMsgReturnVO(); - - // 장문 전송 - String contSeq = ""; - - //float myPrice = 10000; - //float totPrice = Float.parseFloat(mjonMsgVO.getTotPrice()); - // 최종 입력 수 저장 변수 - int resultCnt = 0; - int limitCnt = 1000; - int blockCnt = 0; - - // 총 보유 금액과 전송 합계 비교 - - /*if(myPrice < totPrice) { // 보유 금액보다 전송 합계가 적은 경우 리턴 - - return 0 ; - }*/ - - int callToCnt = mjonMsgVO.getCallToList().length; //전체 받는사람 건수 + try { - mjonMsgVO.setMsgGroupCnt(Integer.toString(callToCnt)); - - - //그룹 테이블에 입력할 발송 시간 및 예약 발송 시간 처리 - if(mjonMsgVO.getReserveYn().equals("N")) {//즉시 전송의 경우 현재 시간을 입력 - - Date now = new Date(); - - SimpleDateFormat sdFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); - - mjonMsgVO.setReqDate(sdFormat.format(now)); - - } - - - /* - * 한번에 서버가 보낼수 있는 문자건수를 체크 해서 넘으면 분할해서 디비 입렵해 준다. - * 발송 건수가 2만 건이 넘어가면, 1만건씩 끊어서 발송 하도록 한다. - * - * - * */ - - if(callToCnt >= 1000) { - - limitCnt = 100; - - } - - //수신자 리스트 처리 - 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[] 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 리스트 - - //for(String phonNum : mjonMsgVO.getCallToList()) { - - for(int i = 0; i < callToCnt; i++) { - - //전송사 랜덤 발생 - int random1 = (int )(Math.random() * (i_nRate+i_hRate+i_iRate));//5~14 - length - - //System.out.println("random1"); - //System.out.println(random1); - - if (random1 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++; - - } - - //문자 발송 캐시 차감 해주기 - 삭제했음 - - - - MjonMsgReturnVO returnVO = new MjonMsgReturnVO(); - - returnVO.setMsgGroupId(p_msgGroupId); - returnVO.setSendMsgCnt(Integer.toString(resultCnt)); //발송 건수 저장 - returnVO.setSendMsgBlockCnt(Integer.toString(blockCnt)); //수신차단 건수 저장 - - return returnVO; - } - - - // JSP 2022.04.08 - // 080 자동 수신거부목록 > 결과알림 => 수신거부목록 체크 제거 - public MjonMsgReturnVO insertMsgDataByBlockInfo(MjonMsgVO mjonMsgVO) throws Exception{ - - // 문자 전송 그룹아이디 생성 - mjonMsgVO.setMsgGroupId(idgenMjonMsgGroupId.getNextStringId()); - - // 문자 아이디 생성 - mjonMsgVO.setMsgId(idgenMsgId.getNextStringId()); - - String msgType = mjonMsgVO.getMsgType(); - String agentCode = mjonMsgVO.getAgentCode(); - // 장문 전송 - String contSeq = ""; - - // 최종 입력 수 저장 변수 - int resultCnt = 0; - int limitCnt = 1000; - int blockCnt = 0; - - // 총 보유 금액과 전송 합계 비교 - - /*if(myPrice < totPrice) { // 보유 금액보다 전송 합계가 적은 경우 리턴 - - return 0 ; - }*/ - - int callToCnt = mjonMsgVO.getCallToList().length; //전체 받는사람 건수 + // 문자 전송 그룹아이디 생성 + //mjonMsgVO.setMsgGroupId(idgenMjonMsgGroupId.getNextStringId()); - mjonMsgVO.setMsgGroupCnt(Integer.toString(callToCnt)); - - - //그룹 테이블에 입력할 발송 시간 및 예약 발송 시간 처리 - if(mjonMsgVO.getReserveYn().equals("N")) {//즉시 전송의 경우 현재 시간을 입력 - - Date now = new Date(); - - SimpleDateFormat sdFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); - - mjonMsgVO.setReqDate(sdFormat.format(now)); - - } - - //사용자 현재 보유 금액 불러오기(문자 발송 금액 차감 이전 금액) - String befCash = mjonMsgDataDAO.selectBeforeCashData(mjonMsgVO); - - mjonMsgVO.setBefCash(befCash); - if(callToCnt >= 1000) { - - limitCnt = 100; - - } - - //수신자 리스트 처리 - 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; //분할 카운트 - - - 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()); //분할 발송 갯수 - - } - - - 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 리스트 - - //for(String phonNum : mjonMsgVO.getCallToList()) { - - for(int i = 0; i < callToCnt; i++) { - MjonMsgVO tempVO = new MjonMsgVO(); - tempVO.setReqDate(mjonMsgVO.getReqDate()); - tempVO.setMsgId(mjonMsgVO.getMsgId()); - tempVO.setUserId(mjonMsgVO.getUserId()); - tempVO.setCallTo(phoneList[i]); - //tempVO.setCallTo("01063170383"); - tempVO.setCallFrom(mjonMsgVO.getCallFrom()); - - tempVO.setMsgType(mjonMsgVO.getMsgType()); - tempVO.setAgentCode(mjonMsgVO.getAgentCode()); - tempVO.setMsgGroupId(mjonMsgVO.getMsgGroupId()); - tempVO.setMsgCnt(mjonMsgVO.getMsgCnt()); - - //문자내용 내용 - 치환 처리 - String smsTxt = mjonMsgVO.getSmsTxt(); //발송 문자 내용 - - smsTxt = smsTxt.replaceAll(String.valueOf((char)13), ""); - if (smsTxt.indexOf("[*이름*]") > -1) - smsTxt = smsTxt.replaceAll("\\[\\*이름\\*\\]", StringUtil.getString(nameList[i].replace("§", ","))); - if (smsTxt.indexOf("[*1*]") > -1) - smsTxt = smsTxt.replaceAll("\\[\\*1\\*\\]", StringUtil.getString(rep1[i].replace("§", ","))); - if (smsTxt.indexOf("[*2*]") > -1) - smsTxt = smsTxt.replaceAll("\\[\\*2\\*\\]", StringUtil.getString(rep2[i].replace("§", ","))); - if (smsTxt.indexOf("[*3*]") > -1) - smsTxt = smsTxt.replaceAll("\\[\\*3\\*\\]", StringUtil.getString(rep3[i].replace("§", ","))); - if (smsTxt.indexOf("[*4*]") > -1) - smsTxt = smsTxt.replaceAll("\\[\\*4\\*\\]", StringUtil.getString(rep4[i].replace("§", ","))); - - tempVO.setSmsTxt(smsTxt); - - //아이하트 전송사의 LMS(장문) / MMS(그림문자) 전송시 컨텐츠 번호 받아오기 먼저 처리 - if(agentCode == "01" && !msgType.equals("4")) { - // 아이하트 MMS Contents 테이블에 입력 후 컨텐츠 아이디 받아오기 - int fileCnt = Integer.parseInt(mjonMsgVO.getFileCnt()); - if(fileCnt > 0) { - - tempVO.setFileType1("IMG"); //아이하트 그림문자 전송시 파일 종류 셋팅 - - } - - 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++; - - } - - //문자 발송 캐시 차감 해주기 - MjonPayVO mjonPayVO = new MjonPayVO(); - - if(blockCnt > 0) { - - Float blockPrice = Float.parseFloat(mjonMsgVO.getEachPrice()) * blockCnt; - Float totPrice = Float.parseFloat(mjonMsgVO.getTotPrice()); - Float endPrice = totPrice - blockPrice; - - mjonMsgVO.setTotPrice(Float.toString(endPrice)); - - //수신거부가 있는 경우 총 건수에서 수신거부 건수를 차감 후 그룹 테이블에 업데이트 해준다. - int groupCnt = callToCnt - blockCnt; - mjonMsgVO.setMsgGroupCnt(Integer.toString(groupCnt)); - - //mjonMsgDAO.updateGroupMsgData(mjonMsgVO); - - } - - if(Integer.parseInt(mjonMsgVO.getMsgGroupCnt()) > 0) { - - // 문자 전송 그룹 테이블에 정보 입력 - mjonMsgDAO.insertGroupMsgData(mjonMsgVO); - - } - - - mjonPayVO.setCashId(idgenMjonCashId.getNextStringId()); - mjonPayVO.setUserId(mjonMsgVO.getUserId()); - mjonPayVO.setCash(-Float.parseFloat(mjonMsgVO.getTotPrice())); - mjonPayVO.setFrstRegisterId(mjonMsgVO.getUserId()); - mjonPayVO.setMemo("SMS 문자 " + resultCnt + "건 발송"); - mjonPayVO.setMsgGroupId(mjonMsgVO.getMsgGroupId()); - - mjonPayDAO.insertCash(mjonPayVO); //캐시차감 - mjonPayDAO.updateMemberCash(mjonPayVO); //회원정보 업데이트 - - MjonMsgReturnVO returnVO = new MjonMsgReturnVO(); - - returnVO.setSendMsgCnt(Integer.toString(resultCnt)); //발송 건수 저장 - returnVO.setSendMsgBlockCnt(Integer.toString(blockCnt)); //수신차단 건수 저장 - - return returnVO; - } - - //관리자에서 사용자에게 문자발송하기 - public MjonMsgReturnVO insertAdmToMberMsgDataInfo(MjonMsgVO mjonMsgVO) throws Exception{ - - // 문자 전송 그룹아이디 생성 - mjonMsgVO.setMsgGroupId(idgenMjonMsgGroupId.getNextStringId()); - - // 문자 아이디 생성 - mjonMsgVO.setMsgId(idgenMsgId.getNextStringId()); - - String msgType = mjonMsgVO.getMsgType(); - String agentCode = mjonMsgVO.getAgentCode(); - // 장문 전송 - String contSeq = ""; - - //float myPrice = 10000; - //float totPrice = Float.parseFloat(mjonMsgVO.getTotPrice()); - // 최종 입력 수 저장 변수 - int resultCnt = 0; - int limitCnt = 1000; - int blockCnt = 0; - - // 총 보유 금액과 전송 합계 비교 - int callToCnt = mjonMsgVO.getCallToList().length; //전체 받는사람 건수 + // 문자 아이디 생성 + //mjonMsgVO.setMsgId(idgenMsgId.getNextStringId()); - mjonMsgVO.setMsgGroupCnt(Integer.toString(callToCnt)); - - - //그룹 테이블에 입력할 발송 시간 및 예약 발송 시간 처리 - if(mjonMsgVO.getReserveYn().equals("N")) {//즉시 전송의 경우 현재 시간을 입력 - - Date now = new Date(); - - SimpleDateFormat sdFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); - - mjonMsgVO.setReqDate(sdFormat.format(now)); - - } - - //사용자 현재 보유 금액 불러오기(문자 발송 금액 차감 이전 금액) - String befCash = mjonMsgVO.getBefCash(); - - //VO에서 현재 보유금액이 없으면 디비에서 조회해서 불러옴 - if(befCash.equals("") || befCash == null) { - befCash = mjonMsgDataDAO.selectBeforeCashData(mjonMsgVO); - } - - mjonMsgVO.setBefCash(befCash); - // 문자 전송 그룹 테이블에 정보 입력 - - //수신거부 목록 불러오기 - //List userBlockList = mjonMsgDAO.selectUserBlockList(mjonMsgVO); - - //List dupliBlockList = MJUtil.getDuplicateList(userBlockList); - //int usrBlockCnt = dupliBlockList.size(); - - /* - * 한번에 서버가 보낼수 있는 문자건수를 체크 해서 넘으면 분할해서 디비 입렵해 준다. - * 발송 건수가 2만 건이 넘어가면, 1만건씩 끊어서 발송 하도록 한다. - * - * - * */ - - if(callToCnt >= 1000) { - - limitCnt = 100; - - } - - //수신자 리스트 처리 - 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; //분할 카운트 - - - 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()); //분할 발송 갯수 - - } - - - //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 리스트 - - //for(String phonNum : mjonMsgVO.getCallToList()) { - - for(int i = 0; i < callToCnt; i++) { - - Boolean blockSts = false; - /*for(int j = 0; j < usrBlockCnt; j++) { + String msgType = mjonMsgVO.getMsgType(); + String agentCode = mjonMsgVO.getAgentCode(); + // 장문 전송 + String contSeq = ""; - if(phoneList[i].equals(dupliBlockList.get(j).toString())) { - - blockCnt++; //수신 차단 카운드를 해준다. - blockSts = true; - - } - - }*/ - - if(!blockSts) { //수신거부가 아니면 추가 - - MjonMsgVO tempVO = new MjonMsgVO(); - - tempVO.setMsgId(mjonMsgVO.getMsgId()); - tempVO.setUserId(mjonMsgVO.getUserId()); - tempVO.setCallTo(phoneList[i]); - tempVO.setCallFrom(mjonMsgVO.getCallFrom()); - - tempVO.setMsgType(mjonMsgVO.getMsgType()); - tempVO.setAgentCode(mjonMsgVO.getAgentCode()); - tempVO.setMsgGroupId(mjonMsgVO.getMsgGroupId()); - tempVO.setMsgCnt(mjonMsgVO.getMsgCnt()); - tempVO.setSmsTxt(mjonMsgVO.getSmsTxt()); - - //즉시 / 예약 전송 처리 - if(mjonMsgVO.getReserveYn().equals("N")) {//즉시 전송의 경우 현재 시간을 입력 - - Date now = new Date(); - - SimpleDateFormat sdFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); - - tempVO.setReqDate(sdFormat.format(now)); - - }else { // 예약 발송의 경우 예약 시간을 입력 - - //분할 발송을 체크 한 경우 - if(mjonMsgVO.getDivideChk() != null) { - - if(count > divideCnt) { - - count = 1; - - //분할 시간 간격을 증가시켜 준다. - cal.add(Calendar.MINUTE, turmMin); - dividDay = transFormat.format(cal.getTime()); - - tempVO.setReqDate(dividDay); //분할 문자 예약 시간 입력해주기 - count++; - - }else { - - tempVO.setReqDate(dividDay); //분할 문자 예약 시간 입력해주기 - count++; - - } - - }else {//일반 예약 발송의 경우 - - tempVO.setReqDate(mjonMsgVO.getReqDate()); - - } - } - - if(!msgType.equals("4")) { // 장문 혹은 그림문자일 경우 추가 - - tempVO.setMmsSubject(mjonMsgVO.getMmsSubject()); - //tempVO.setSmsTxt(smsTxt); - 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(contents); - 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++; - - } - - //문자 발송 캐시 차감 해주기 - MjonPayVO mjonPayVO = new MjonPayVO(); - - if(resultCnt > 0 && blockCnt > 0) { - - Float blockPrice = Float.parseFloat(mjonMsgVO.getEachPrice()) * blockCnt; - Float totPrice = Float.parseFloat(mjonMsgVO.getTotPrice()); - Float endPrice = totPrice - blockPrice; - - mjonMsgVO.setTotPrice(Float.toString(endPrice)); - - //수신거부가 있는 경우 총 건수에서 수신거부 건수를 차감 후 그룹 테이블에 업데이트 해준다. - int groupCnt = callToCnt - blockCnt; - mjonMsgVO.setMsgGroupCnt(Integer.toString(groupCnt)); - - } - - //문자 발송 테이블에 입력 데이터가 있는 경우 그룹 테이블에도 입력 해 준다. - if(resultCnt > 0 && Integer.parseInt(mjonMsgVO.getMsgGroupCnt()) > 0) { - - // 문자 전송 그룹 테이블에 정보 입력 - mjonMsgDAO.insertGroupMsgData(mjonMsgVO); - - } - - //1건 이상 발송이 완료된 경우 시스템 로그를 기록한다. - if(resultCnt > 0) { - - // 시스템 발송 로그 - SendLogVO sendLogVO = new SendLogVO(); - // SendType 1:문자로 발송 2:이메일로 발송 - sendLogVO.setSendId(mjonMsgVO.getMsgGroupId()); - sendLogVO.setSendType("1"); - sendLogVO.setFrstSendInfo(mjonMsgVO.getCallFrom()); - sendLogVO.setReceive(mjonMsgVO.getCallTo()); - sendLogVO.setCheckNo(""); - sendLogVO.setContents(mjonMsgVO.getSmsTxt()); + //float myPrice = 10000; + //float totPrice = Float.parseFloat(mjonMsgVO.getTotPrice()); + // 최종 입력 수 저장 변수 + int resultCnt = 0; + int limitCnt = 1000; + int blockCnt = 0; - mjonMsgDataService.insertSysMsgLog(sendLogVO); - - } - - MjonMsgReturnVO returnVO = new MjonMsgReturnVO(); - - returnVO.setSendMsgCnt(Integer.toString(resultCnt)); //발송 건수 저장 - returnVO.setSendMsgBlockCnt(Integer.toString(blockCnt)); //수신차단 건수 저장 - - return returnVO; - - } - - - public List selectLetterList(LetterVO letterVO) throws Exception{ - - return mjonMsgDataDAO.selectLetterList(letterVO); - } - - public List selectPhotoLetterList(LetterVO letterVO) throws Exception{ - - return mjonMsgDataDAO.selectPhotoLetterList(letterVO); - - } - - public List selectCustomPopupImgList(LetterVO letterVO) throws Exception { - - return mjonMsgDataDAO.selectCustomPopupImgList(letterVO); - } - - public int insertMyMsgDataAjax(MjonMsgDataVO mjonMsgDataVO) throws Exception{ - - return mjonMsgDataDAO.insertMyMsgDataAjax(mjonMsgDataVO); - } - - public List selectMyMsgDataListAjax(MjonMsgDataVO mjonMsgDataVO) throws Exception{ - - return mjonMsgDataDAO.selectMyMsgDataListAjax(mjonMsgDataVO); - } - - public List selectSendPhonNumList(String userId) throws Exception{ - - return mjonMsgDataDAO.selectSendPhonNumList(userId); - } - - //차단 발신번호 리스트 불러오기 - public List selectBlockPhonNumList() throws Exception{ - return mjonMsgDataDAO.selectBlockPhonNumList(); - } + // 총 보유 금액과 전송 합계 비교 - public JoinSettingVO selectJoinSettingInfo() throws Exception{ - - return mjonMsgDataDAO.selectJoinSettingInfo(); - } - - public MberManageVO selectMberManageInfo(String userId) throws Exception{ - - return mjonMsgDataDAO.selectMberManageInfo(userId); - } - - public List selectMyMsgPhotoListInfo(List myMsgList) throws Exception{ - - List atchFileList = new ArrayList(); - - int size = myMsgList.size(); - for(int i=0; i < size; i++ ) { - - String atchFileId1 = ((EgovMap)myMsgList.get(i)).get("atchFileId1") != null ? ((EgovMap)myMsgList.get(i)).get("atchFileId1").toString() : ""; - String atchFileId2 = ((EgovMap)myMsgList.get(i)).get("atchFileId2") != null ? ((EgovMap)myMsgList.get(i)).get("atchFileId2").toString() : ""; - String atchFileId3 = ((EgovMap)myMsgList.get(i)).get("atchFileId3") != null ? ((EgovMap)myMsgList.get(i)).get("atchFileId3").toString() : ""; + /*if(myPrice < totPrice) { // 보유 금액보다 전송 합계가 적은 경우 리턴 - if(atchFileId1 != null && !atchFileId1.equals("")) { - - atchFileList.add(atchFileId1); - - } - if(atchFileId2 != null && !atchFileId2.equals("")) { - - atchFileList.add(atchFileId2); - - } - if(atchFileId3 != null && !atchFileId3.equals("")) { - - atchFileList.add(atchFileId3); - - } - - } - - MjonMsgDataVO mjonMsgDataVO = new MjonMsgDataVO(); - mjonMsgDataVO.setAtchFileList(atchFileList); - - return mjonMsgDataDAO.selectMyMsgPhotoListInfo(mjonMsgDataVO); - - } - - public void deleteMyMsgDataListAjax(MjonMsgDataVO mjonMsgDataVO) throws Exception{ - - mjonMsgDataDAO.deleteMyMsgDataListAjax(mjonMsgDataVO); - } - - public List selectLatestMsgList(MjonMsgDataVO mjonMsgDataVO) throws Exception{ - - return mjonMsgDataDAO.selectLatestMsgList(mjonMsgDataVO); - } - - public List selectBookMarkMsgList(MjonMsgDataVO mjonMsgDataVO) throws Exception{ - - return mjonMsgDataDAO.selectBookMarkMsgList(mjonMsgDataVO); - } - - public String selectBeforeCashData(MjonMsgVO mjonMsgVO) throws Exception{ - - return mjonMsgDataDAO.selectBeforeCashData(mjonMsgVO); - } - - public String selectBeforePointData(MjonMsgVO mjonMsgVO) throws Exception{ - - return mjonMsgDataDAO.selectBeforePointData(mjonMsgVO); - } + return 0 ; + }*/ - @Override - public List selectPayUserList(MjonMsgVO mjonMsgVO) throws Exception { - return mjonMsgDataDAO.selectPayUserList(mjonMsgVO); - } - - @Override - public List selectPayUserSWList(MjonMsgVO mjonMsgVO) throws Exception { - return mjonMsgDataDAO.selectPayUserSWList(mjonMsgVO); - } - - @Override - public List selectPayUserSumList(MjonMsgVO mjonMsgVO) throws Exception { - return mjonMsgDataDAO.selectPayUserSumList(mjonMsgVO); - } - - //시스템 문자발송 - public MjonMsgReturnVO insertSysMsgDataInfo(MjonMsgVO mjonMsgVO) throws Exception{ - - // 문자 전송 그룹아이디 생성 - mjonMsgVO.setMsgGroupId(idgenMjonMsgGroupId.getNextStringId()); - - // 문자 아이디 생성 - mjonMsgVO.setMsgId(idgenMsgId.getNextStringId()); - - String msgType = mjonMsgVO.getMsgType(); - String agentCode = mjonMsgVO.getAgentCode(); - // 장문 전송 - String contSeq = ""; - - //float myPrice = 10000; - //float totPrice = Float.parseFloat(mjonMsgVO.getTotPrice()); - // 최종 입력 수 저장 변수 - int resultCnt = 0; - int limitCnt = 1000; - int blockCnt = 0; - - // 총 보유 금액과 전송 합계 비교 - - /*if(myPrice < totPrice) { // 보유 금액보다 전송 합계가 적은 경우 리턴 - - return 0 ; - }*/ - - int callToCnt = 1; //전체 받는사람 건수 + int callToCnt = mjonMsgVO.getCallToList().length; //전체 받는사람 건수 - mjonMsgVO.setMsgGroupCnt(Integer.toString(callToCnt)); - - - //그룹 테이블에 입력할 발송 시간 및 예약 발송 시간 처리 - 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(callToCnt >= 1000) { - - limitCnt = 100; - - } - - //수신자 리스트 처리 - 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; //분할 카운트 - - - 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 = 1; // 수신자 전체 갯수 - divideCnt = Integer.parseInt(mjonMsgVO.getDivideCnt()); //분할 발송 갯수 - - } - - String[] phoneList = mjonMsgVO.getCallToList(); //받는사람 연락처 리스트 - /*String[] nameList = mjonMsgVO.getNameList(); //치환 이름 리스트 - String[] rep1 = mjonMsgVO.getRep1List(); //치환 문자1 리스트 - String[] rep2 = mjonMsgVO.getRep2List(); //치환 문자2 리스트 - String[] rep3 = mjonMsgVO.getRep3List(); //치환 문자3 리스트 - String[] rep4 = mjonMsgVO.getRep4List(); //치환 문자4 리스트 -*/ - //for(String phonNum : mjonMsgVO.getCallToList()) { - - for(int i = 0; i < callToCnt; i++) { - - /*Boolean blockSts = false; - for(int j = 0; j < usrBlockCnt; j++) { + mjonMsgVO.setMsgGroupCnt(Integer.toString(callToCnt)); - if(phoneList[i].equals(userBlockList.get(j).toString())) { - - blockCnt++; //수신 차단 카운드를 해준다. - blockSts = true; - - } - - }*/ - - - MjonMsgVO tempVO = new MjonMsgVO(); - - tempVO.setMsgId(mjonMsgVO.getMsgId()); - tempVO.setUserId(mjonMsgVO.getUserId()); - //tempVO.setCallTo(phoneList[i]); - tempVO.setCallTo(mjonMsgVO.getCallTo()); - tempVO.setCallFrom(mjonMsgVO.getCallFrom()); - - tempVO.setMsgType(mjonMsgVO.getMsgType()); - tempVO.setAgentCode(mjonMsgVO.getAgentCode()); - tempVO.setMsgGroupId(mjonMsgVO.getMsgGroupId()); - tempVO.setMsgCnt(mjonMsgVO.getMsgCnt()); - - //문자내용 내용 - 치환 처리 - /*String smsTxt = mjonMsgVO.getSmsTxt(); //발송 문자 내용 - - smsTxt = smsTxt.replaceAll(String.valueOf((char)13), ""); - if (smsTxt.indexOf("[*이름*]") > -1) - smsTxt = smsTxt.replaceAll("\\[\\*이름\\*\\]", StringUtil.getString(nameList[i])); - if (smsTxt.indexOf("[*1*]") > -1) - smsTxt = smsTxt.replaceAll("\\[\\*1\\*\\]", StringUtil.getString(rep1[i])); - if (smsTxt.indexOf("[*2*]") > -1) - smsTxt = smsTxt.replaceAll("\\[\\*2\\*\\]", StringUtil.getString(rep2[i])); - if (smsTxt.indexOf("[*3*]") > -1) - smsTxt = smsTxt.replaceAll("\\[\\*3\\*\\]", StringUtil.getString(rep3[i])); - if (smsTxt.indexOf("[*4*]") > -1) - smsTxt = smsTxt.replaceAll("\\[\\*4\\*\\]", StringUtil.getString(rep4[i])); - - tempVO.setSmsTxt(smsTxt);*/ - tempVO.setSmsTxt(mjonMsgVO.getSmsTxt()); - - Date now = new Date(); - - SimpleDateFormat sdFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); - - tempVO.setReqDate(sdFormat.format(now)); - - //문자 내용 추가해 주기 - msgDataInfo.add(tempVO); - - - int instCnt = 0; - //지금까지 루프 돌아간 것이 전체 수신자 갯수와 같으면 추가가 완료된 것으로 판단 되어 전송 해줌 - if(totCnt == callToCnt) { - - if(msgDataInfo.size() > 0) { - - //데이터 디비 입력해주기 - instCnt = mjonMsgDataDAO.insertSysMsgDataInfo(msgDataInfo, msgType, agentCode); - - } - - - //총 디비 입력 건수 저장하기 - resultCnt = resultCnt + instCnt; - - }else { - - //특정 건수 이상일 경우 분할해서 디비에 넣어준다. - if(cnt == limitCnt) { - - if(msgDataInfo.size() > 0) { - - //분할 최대건수가 되면 디비에 입력하기 - instCnt = mjonMsgDataDAO.insertSysMsgDataInfo(msgDataInfo, msgType, agentCode); - - } - - - //총 디비 입력 건수 저장하기 - resultCnt = resultCnt + instCnt; - cnt = 0; - - //List 초기화 하기 - msgDataInfo.clear(); - - } - - } - - cnt++; - totCnt++; - - } - - if(blockCnt > 0) { - - //수신거부가 있는 경우 총 건수에서 수신거부 건수를 차감 후 그룹 테이블에 업데이트 해준다. - int groupCnt = callToCnt - blockCnt; - mjonMsgVO.setMsgGroupCnt(Integer.toString(groupCnt)); - - //mjonMsgDAO.updateGroupMsgData(mjonMsgVO); - - } - - //시스템 발송은 문자 발송 금액이 없음 - mjonMsgVO.setTotPrice("0"); - mjonMsgVO.setBefCash("0"); - mjonMsgVO.setFileCnt("0"); - mjonMsgVO.setEachPrice("0"); - - if(Integer.parseInt(mjonMsgVO.getMsgGroupCnt()) > 0) { - - // 문자 전송 그룹 테이블에 정보 입력 - mjonMsgDAO.insertGroupMsgData(mjonMsgVO); - - } - - MjonMsgReturnVO returnVO = new MjonMsgReturnVO(); - - returnVO.setMsgGroupId(mjonMsgVO.getMsgGroupId()); - returnVO.setSendMsgCnt(Integer.toString(resultCnt)); //발송 건수 저장 - returnVO.setSendMsgBlockCnt(Integer.toString(blockCnt)); //수신차단 건수 저장 - - return returnVO; - } - - @Override - public void insertSysMsgLog(SendLogVO sendLogVO) throws Exception{ - //시스템 문자발송 이력 Idgen + + //그룹 테이블에 입력할 발송 시간 및 예약 발송 시간 처리 + /*if(mjonMsgVO.getReserveYn().equals("N")) {//즉시 전송의 경우 현재 시간을 입력 + + Date now = new Date(); + + SimpleDateFormat sdFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); + + mjonMsgVO.setReqDate(sdFormat.format(now)); + + }*/ + + //사용자 현재 보유 금액 불러오기(문자 발송 금액 차감 이전 금액) + String befCash = mjonMsgVO.getBefCash(); + + //VO에서 현재 보유금액이 없으면 디비에서 조회해서 불러옴 + if("".equals(befCash) || befCash == null) { + befCash = mjonMsgDataDAO.selectBeforeCashData(mjonMsgVO); + } + + mjonMsgVO.setBefCash(befCash); + // 문자 전송 그룹 테이블에 정보 입력 + //mjonMsgDAO.insertGroupMsgData(mjonMsgVO); + + //수신거부 목록 불러오기 + List userBlockList = mjonMsgDAO.selectUserBlockList(mjonMsgVO); + + 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(); + + //스팸,스미싱이어도 딜레이없이 문자 전송을 처리할지 선택 상태값 변수 + boolean spamSmishingPassStatus = false; //야간스미싱 알림여부가 활성화인 경우 false, 비활성화인경우 true 값을 가지도록 한다. + + //스팸, 스미싱 상태인 경우에만 true 처리 + //야간스미싱알리 여부가 활성화 인경우 무조건 문자를 즉시 보내도록 한다. + //스미싱 알림 일정에 등록된 날짜와 시간에 포함되면 30분 딜레이 없이 발송 처리하도록 함. + if(holiSmishingNoti.equals("Y")) { + + MsgAlarmSetVO msgAlarmSetVO = new MsgAlarmSetVO(); + + msgAlarmSetVO.setUseYn("Y"); + msgAlarmSetVO.setFirstIndex(0); + + List resultAlarmList = msgHolidayDAO.selectAlarmSettingList(msgAlarmSetVO); + + Calendar calendar = Calendar.getInstance(); + int year = calendar.get(Calendar.YEAR); + + MsgHolidayVO msgHolidayVO = new MsgHolidayVO(); + msgHolidayVO.setFirstIndex(0); + msgHolidayVO.setRecordCountPerPage(100); + msgHolidayVO.setSearchHoliYear(Integer.toString(year)); + + List resultHolidayList = msgHolidayDAO.selectMsgHolidayList(msgHolidayVO); + + MjonHolidayApi mjonHolidayApi = new MjonHolidayApi(); + + boolean smishingAlarmPassSts = mjonHolidayApi.getHolidaySmishingPassStatus(resultAlarmList, resultHolidayList); + + spamSmishingPassStatus = smishingAlarmPassSts; + }else { + + spamSmishingPassStatus = true; + + } + + //전용 전송사가 지정되어 있으면 실행 + if(!hotlineAgentCode.equals("00")) { + + MjonMsgAgentStsVO mjonMsgAgentStsVO = new MjonMsgAgentStsVO(); + mjonMsgAgentStsVO.setAgentCode(hotlineAgentCode); + + //문자 타입 셋팅 + if(msgType.equals("6")) { + 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(userInfo.getBlineCode().equals("N")) { + //회원 전용 전송사의 전송 비율이 0 이면 대표전송사로 전송되도록 셋팅함. + if(mberSendRate.equals("0") || useYn.equals("N")) { + + 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(int i=0; i< sendRateSize; i++) { + + String sndAgentCode = sendRateList.get(i).getAgentCode(); + + if(sndAgentCode.equals("01")) {//아이하트 전송비율 + + iheartCnt = Math.round(callToCnt * Float.parseFloat(sendRateList.get(i).getSendRate())); + + }else if(sndAgentCode.equals("02")) {//현대퓨처넷 전송비율 + + hncCnt = Math.round(callToCnt * Float.parseFloat(sendRateList.get(i).getSendRate())); + + }else if(sndAgentCode.equals("03")) {//아이엠오 전송비율 + + imoCnt = Math.round(callToCnt * Float.parseFloat(sendRateList.get(i).getSendRate())); + + }else if(sndAgentCode.equals("04")) {//비즈뿌리오 전송비율 + + 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 if(sndAgentCode.equals("07")) {//인비토 전송비율 + + ivtCnt = Math.round(callToCnt * Float.parseFloat(sendRateList.get(i).getSendRate())); + + } + + } + } + + /** + * 한번에 서버가 보낼수 있는 문자건수를 체크 해서 넘으면 분할해서 디비 입렵해 준다. + * 발송 건수가 천 건이 넘어가면, 백건씩 끊어서 발송 하도록 한다. + * */ + + 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(spamStatus == null || spamStatus.equals("")) { + + spamStatus = "N"; + + } + + if(smishingYn == null || smishingYn.equals("")) { + + smishingYn = "N"; + + } + + //야간 스미싱 알림여부가 활성화 이고 예외시간에 포함되는 경우 스팸, 스미싱, 딜레이 값을 모두 N 으로 처리 + if(spamSmishingPassStatus) { + + spamStatus = "N"; + smishingYn = "N"; + delayYn = "N"; + + } + + + 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()); //분할 발송 갯수 + + if(spamStatus.equals("Y") || smishingYn.equals("Y")) { + + mjonMsgVO.setDelayYn("Y");//일단 값만 등록해준다. 이거 안해주면 NULL 값으로 들어간다. 차후에 변경하도록 할 예정임, 원래는 스팸이면 Y로 넣어줘야한다. + + }else { + + mjonMsgVO.setDelayYn("N");//일단 값만 등록해준다. 이거 안해주면 NULL 값으로 들어간다. 차후에 변경하도록 할 예정임 + } + + }else {//즉시발송의 경우 현재 시간으로 입력해 준다. + + Date now = new Date(); + if(spamStatus.equals("Y") || smishingYn.equals("Y")) {//스팸 문자가 포함되었거나, 스미싱 의심 회원의 경우 문자발송 시간을 30분 딜레이 시킨다. + + 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 {//정상적인 문자인 경우 즉시발송 처리해준다. + + mjonMsgVO.setReqDate(transFormat.format(now)); + mjonMsgVO.setDelayYn(delayYn);//문자 발송 30분 지연 디폴트 값 셋팅(N) + + } + + } + + + 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 리스트 + + //Controller에서 전달 받은 분할 시간 정보 리스트 + List dividDayList = mjonMsgVO.getDividDay(); + + String frstDelayTime = mjonMsgVO.getReqDate(); + //문자발송 리스트 생성 시작 + for(int i = 0; i < callToCnt; i++) { + + Boolean blockSts = false; + for(int j = 0; j < usrBlockCnt; j++) { + + if(phoneList[i].equals(dupliBlockList.get(j).toString())) { + + blockCnt++; //수신 차단 카운드를 해준다. + blockSts = true; + + } + + } + + if(!blockSts) { //수신거부가 아니면 추가 + + MjonMsgVO tempVO = new MjonMsgVO(); + + /** + * 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")) { // 단순 장문 문자 + + mjonMsgVO.setNeoType("2"); + + }else{ // 그림포함 문자인경우 + + 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("\\[\\*이름\\*\\]", ""); + } + } + + 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\\*\\]", ""); + } + } + + 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\\*\\]", ""); + } + } + + tempVO.setSmsTxt(smsTxt); + + //즉시 / 예약 전송 처리 + if(mjonMsgVO.getReserveYn().equals("N")) {//즉시 전송의 경우 현재 시간을 입력 + + 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{ + + //이벤트 회원인 경우 이벤트 캐시도 함께 차감. + MjonEventVO mjonEventVO = new MjonEventVO(); + mjonEventVO.setMberId(mjonPayVO.getUserId()); + mjonEventVO.setEventStatus("Y"); + MjonEventVO eventMberInfo = mjonEventService.selectEventMsgMberDefaultInfo(mjonEventVO); + + if(eventMberInfo != null) { + + float evntRemainCash = (float) eventMberInfo.getEventRemainCash(); + float totPrice = (float) Math.abs(mjonPayVO.getCash()); + + float totRemainCash = evntRemainCash - totPrice; + mjonEventVO.setEventInfoId(eventMberInfo.getEventInfoId()); + + if(totRemainCash <= 0.0) {//차감액이 남아있지 않으면 이벤트를 종료 + + //이벤트 상태값을 종료로 변경한다. + mjonEventVO.setEventStatus("E"); + mjonEventVO.setEventRemainCash(0.0); + mjonEventService.updateEventEndStatus(mjonEventVO); + + }else {//이벤트 회원 캐시 차감시킴 + + mjonEventVO.setEventRemainCash(totRemainCash); + mjonEventService.updateEventRemainCash(mjonEventVO); + + } + + } + + } + + //성능 테스트용************************************************************************ + public MjonMsgReturnVO insertMsgTestDataInfo(MjonMsgVO mjonMsgVO + , int i_nRate + , int i_hRate + , int i_iRate + , String p_msgGroupId + ) throws Exception{ + + // 문자 전송 그룹아이디 생성 + if ("".equals(p_msgGroupId)) { + //String s_msgGroupId = idgenMjonMsgGroupId.getNextStringId(); + p_msgGroupId = idgenMjonMsgGroupId.getNextStringId(); + } + + mjonMsgVO.setMsgGroupId(p_msgGroupId); + + // 문자 아이디 생성 + //mjonMsgVO.setMsgId(idgenMsgId.getNextStringId()); + + String msgType = mjonMsgVO.getMsgType(); + String agentCode = mjonMsgVO.getAgentCode(); + + + + // 장문 전송 + String contSeq = ""; + + //float myPrice = 10000; + //float totPrice = Float.parseFloat(mjonMsgVO.getTotPrice()); + // 최종 입력 수 저장 변수 + int resultCnt = 0; + int limitCnt = 1000; + int blockCnt = 0; + + // 총 보유 금액과 전송 합계 비교 + + /*if(myPrice < totPrice) { // 보유 금액보다 전송 합계가 적은 경우 리턴 + + return 0 ; + }*/ + + int callToCnt = mjonMsgVO.getCallToList().length; //전체 받는사람 건수 + + mjonMsgVO.setMsgGroupCnt(Integer.toString(callToCnt)); + + + //그룹 테이블에 입력할 발송 시간 및 예약 발송 시간 처리 + if(mjonMsgVO.getReserveYn().equals("N")) {//즉시 전송의 경우 현재 시간을 입력 + + Date now = new Date(); + + SimpleDateFormat sdFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); + + mjonMsgVO.setReqDate(sdFormat.format(now)); + + } + + + /* + * 한번에 서버가 보낼수 있는 문자건수를 체크 해서 넘으면 분할해서 디비 입렵해 준다. + * 발송 건수가 2만 건이 넘어가면, 1만건씩 끊어서 발송 하도록 한다. + * + * + * */ + + if(callToCnt >= 1000) { + + limitCnt = 100; + + } + + //수신자 리스트 처리 + 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[] 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 리스트 + + //for(String phonNum : mjonMsgVO.getCallToList()) { + + for(int i = 0; i < callToCnt; i++) { + + //전송사 랜덤 발생 + int random1 = (int )(Math.random() * (i_nRate+i_hRate+i_iRate));//5~14 - length + + //System.out.println("random1"); + //System.out.println(random1); + + if (random1 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++; + + } + + //문자 발송 캐시 차감 해주기 - 삭제했음 + + + + MjonMsgReturnVO returnVO = new MjonMsgReturnVO(); + + returnVO.setMsgGroupId(p_msgGroupId); + returnVO.setSendMsgCnt(Integer.toString(resultCnt)); //발송 건수 저장 + returnVO.setSendMsgBlockCnt(Integer.toString(blockCnt)); //수신차단 건수 저장 + + return returnVO; + } + + + // JSP 2022.04.08 + // 080 자동 수신거부목록 > 결과알림 => 수신거부목록 체크 제거 + public MjonMsgReturnVO insertMsgDataByBlockInfo(MjonMsgVO mjonMsgVO) throws Exception{ + + // 문자 전송 그룹아이디 생성 + mjonMsgVO.setMsgGroupId(idgenMjonMsgGroupId.getNextStringId()); + + // 문자 아이디 생성 + mjonMsgVO.setMsgId(idgenMsgId.getNextStringId()); + + String msgType = mjonMsgVO.getMsgType(); + String agentCode = mjonMsgVO.getAgentCode(); + // 장문 전송 + String contSeq = ""; + + // 최종 입력 수 저장 변수 + int resultCnt = 0; + int limitCnt = 1000; + int blockCnt = 0; + + // 총 보유 금액과 전송 합계 비교 + + /*if(myPrice < totPrice) { // 보유 금액보다 전송 합계가 적은 경우 리턴 + + return 0 ; + }*/ + + int callToCnt = mjonMsgVO.getCallToList().length; //전체 받는사람 건수 + + mjonMsgVO.setMsgGroupCnt(Integer.toString(callToCnt)); + + + //그룹 테이블에 입력할 발송 시간 및 예약 발송 시간 처리 + if(mjonMsgVO.getReserveYn().equals("N")) {//즉시 전송의 경우 현재 시간을 입력 + + Date now = new Date(); + + SimpleDateFormat sdFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); + + mjonMsgVO.setReqDate(sdFormat.format(now)); + + } + + //사용자 현재 보유 금액 불러오기(문자 발송 금액 차감 이전 금액) + String befCash = mjonMsgDataDAO.selectBeforeCashData(mjonMsgVO); + + mjonMsgVO.setBefCash(befCash); + if(callToCnt >= 1000) { + + limitCnt = 100; + + } + + //수신자 리스트 처리 + 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; //분할 카운트 + + + 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()); //분할 발송 갯수 + + } + + + 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 리스트 + + //for(String phonNum : mjonMsgVO.getCallToList()) { + + for(int i = 0; i < callToCnt; i++) { + MjonMsgVO tempVO = new MjonMsgVO(); + tempVO.setReqDate(mjonMsgVO.getReqDate()); + tempVO.setMsgId(mjonMsgVO.getMsgId()); + tempVO.setUserId(mjonMsgVO.getUserId()); + tempVO.setCallTo(phoneList[i]); + //tempVO.setCallTo("01063170383"); + tempVO.setCallFrom(mjonMsgVO.getCallFrom()); + + tempVO.setMsgType(mjonMsgVO.getMsgType()); + tempVO.setAgentCode(mjonMsgVO.getAgentCode()); + tempVO.setMsgGroupId(mjonMsgVO.getMsgGroupId()); + tempVO.setMsgCnt(mjonMsgVO.getMsgCnt()); + + //문자내용 내용 - 치환 처리 + String smsTxt = mjonMsgVO.getSmsTxt(); //발송 문자 내용 + + smsTxt = smsTxt.replaceAll(String.valueOf((char)13), ""); + if (smsTxt.indexOf("[*이름*]") > -1) + smsTxt = smsTxt.replaceAll("\\[\\*이름\\*\\]", StringUtil.getString(nameList[i].replace("§", ","))); + if (smsTxt.indexOf("[*1*]") > -1) + smsTxt = smsTxt.replaceAll("\\[\\*1\\*\\]", StringUtil.getString(rep1[i].replace("§", ","))); + if (smsTxt.indexOf("[*2*]") > -1) + smsTxt = smsTxt.replaceAll("\\[\\*2\\*\\]", StringUtil.getString(rep2[i].replace("§", ","))); + if (smsTxt.indexOf("[*3*]") > -1) + smsTxt = smsTxt.replaceAll("\\[\\*3\\*\\]", StringUtil.getString(rep3[i].replace("§", ","))); + if (smsTxt.indexOf("[*4*]") > -1) + smsTxt = smsTxt.replaceAll("\\[\\*4\\*\\]", StringUtil.getString(rep4[i].replace("§", ","))); + + tempVO.setSmsTxt(smsTxt); + + //아이하트 전송사의 LMS(장문) / MMS(그림문자) 전송시 컨텐츠 번호 받아오기 먼저 처리 + if(agentCode == "01" && !msgType.equals("4")) { + // 아이하트 MMS Contents 테이블에 입력 후 컨텐츠 아이디 받아오기 + int fileCnt = Integer.parseInt(mjonMsgVO.getFileCnt()); + if(fileCnt > 0) { + + tempVO.setFileType1("IMG"); //아이하트 그림문자 전송시 파일 종류 셋팅 + + } + + 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++; + + } + + //문자 발송 캐시 차감 해주기 + MjonPayVO mjonPayVO = new MjonPayVO(); + + if(blockCnt > 0) { + + Float blockPrice = Float.parseFloat(mjonMsgVO.getEachPrice()) * blockCnt; + Float totPrice = Float.parseFloat(mjonMsgVO.getTotPrice()); + Float endPrice = totPrice - blockPrice; + + mjonMsgVO.setTotPrice(Float.toString(endPrice)); + + //수신거부가 있는 경우 총 건수에서 수신거부 건수를 차감 후 그룹 테이블에 업데이트 해준다. + int groupCnt = callToCnt - blockCnt; + mjonMsgVO.setMsgGroupCnt(Integer.toString(groupCnt)); + + //mjonMsgDAO.updateGroupMsgData(mjonMsgVO); + + } + + if(Integer.parseInt(mjonMsgVO.getMsgGroupCnt()) > 0) { + + // 문자 전송 그룹 테이블에 정보 입력 + mjonMsgDAO.insertGroupMsgData(mjonMsgVO); + + } + + + mjonPayVO.setCashId(idgenMjonCashId.getNextStringId()); + mjonPayVO.setUserId(mjonMsgVO.getUserId()); + mjonPayVO.setCash(-Float.parseFloat(mjonMsgVO.getTotPrice())); + mjonPayVO.setFrstRegisterId(mjonMsgVO.getUserId()); + mjonPayVO.setMemo("SMS 문자 " + resultCnt + "건 발송"); + mjonPayVO.setMsgGroupId(mjonMsgVO.getMsgGroupId()); + + mjonPayDAO.insertCash(mjonPayVO); //캐시차감 + mjonPayDAO.updateMemberCash(mjonPayVO); //회원정보 업데이트 + + MjonMsgReturnVO returnVO = new MjonMsgReturnVO(); + + returnVO.setSendMsgCnt(Integer.toString(resultCnt)); //발송 건수 저장 + returnVO.setSendMsgBlockCnt(Integer.toString(blockCnt)); //수신차단 건수 저장 + + return returnVO; + } + + //관리자에서 사용자에게 문자발송하기 + public MjonMsgReturnVO insertAdmToMberMsgDataInfo(MjonMsgVO mjonMsgVO) throws Exception{ + + // 문자 전송 그룹아이디 생성 + mjonMsgVO.setMsgGroupId(idgenMjonMsgGroupId.getNextStringId()); + + // 문자 아이디 생성 + mjonMsgVO.setMsgId(idgenMsgId.getNextStringId()); + + String msgType = mjonMsgVO.getMsgType(); + String agentCode = mjonMsgVO.getAgentCode(); + // 장문 전송 + String contSeq = ""; + + //float myPrice = 10000; + //float totPrice = Float.parseFloat(mjonMsgVO.getTotPrice()); + // 최종 입력 수 저장 변수 + int resultCnt = 0; + int limitCnt = 1000; + int blockCnt = 0; + + // 총 보유 금액과 전송 합계 비교 + int callToCnt = mjonMsgVO.getCallToList().length; //전체 받는사람 건수 + + mjonMsgVO.setMsgGroupCnt(Integer.toString(callToCnt)); + + + //그룹 테이블에 입력할 발송 시간 및 예약 발송 시간 처리 + if(mjonMsgVO.getReserveYn().equals("N")) {//즉시 전송의 경우 현재 시간을 입력 + + Date now = new Date(); + + SimpleDateFormat sdFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); + + mjonMsgVO.setReqDate(sdFormat.format(now)); + + } + + //사용자 현재 보유 금액 불러오기(문자 발송 금액 차감 이전 금액) + String befCash = mjonMsgVO.getBefCash(); + + //VO에서 현재 보유금액이 없으면 디비에서 조회해서 불러옴 + if(befCash.equals("") || befCash == null) { + befCash = mjonMsgDataDAO.selectBeforeCashData(mjonMsgVO); + } + + mjonMsgVO.setBefCash(befCash); + // 문자 전송 그룹 테이블에 정보 입력 + + //수신거부 목록 불러오기 + //List userBlockList = mjonMsgDAO.selectUserBlockList(mjonMsgVO); + + //List dupliBlockList = MJUtil.getDuplicateList(userBlockList); + //int usrBlockCnt = dupliBlockList.size(); + + /* + * 한번에 서버가 보낼수 있는 문자건수를 체크 해서 넘으면 분할해서 디비 입렵해 준다. + * 발송 건수가 2만 건이 넘어가면, 1만건씩 끊어서 발송 하도록 한다. + * + * + * */ + + if(callToCnt >= 1000) { + + limitCnt = 100; + + } + + //수신자 리스트 처리 + 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; //분할 카운트 + + + 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()); //분할 발송 갯수 + + } + + + //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 리스트 + + //for(String phonNum : mjonMsgVO.getCallToList()) { + + for(int i = 0; i < callToCnt; i++) { + + Boolean blockSts = false; + /*for(int j = 0; j < usrBlockCnt; j++) { + + if(phoneList[i].equals(dupliBlockList.get(j).toString())) { + + blockCnt++; //수신 차단 카운드를 해준다. + blockSts = true; + + } + + }*/ + + if(!blockSts) { //수신거부가 아니면 추가 + + MjonMsgVO tempVO = new MjonMsgVO(); + + tempVO.setMsgId(mjonMsgVO.getMsgId()); + tempVO.setUserId(mjonMsgVO.getUserId()); + tempVO.setCallTo(phoneList[i]); + tempVO.setCallFrom(mjonMsgVO.getCallFrom()); + + tempVO.setMsgType(mjonMsgVO.getMsgType()); + tempVO.setAgentCode(mjonMsgVO.getAgentCode()); + tempVO.setMsgGroupId(mjonMsgVO.getMsgGroupId()); + tempVO.setMsgCnt(mjonMsgVO.getMsgCnt()); + tempVO.setSmsTxt(mjonMsgVO.getSmsTxt()); + + //즉시 / 예약 전송 처리 + if(mjonMsgVO.getReserveYn().equals("N")) {//즉시 전송의 경우 현재 시간을 입력 + + Date now = new Date(); + + SimpleDateFormat sdFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); + + tempVO.setReqDate(sdFormat.format(now)); + + }else { // 예약 발송의 경우 예약 시간을 입력 + + //분할 발송을 체크 한 경우 + if(mjonMsgVO.getDivideChk() != null) { + + if(count > divideCnt) { + + count = 1; + + //분할 시간 간격을 증가시켜 준다. + cal.add(Calendar.MINUTE, turmMin); + dividDay = transFormat.format(cal.getTime()); + + tempVO.setReqDate(dividDay); //분할 문자 예약 시간 입력해주기 + count++; + + }else { + + tempVO.setReqDate(dividDay); //분할 문자 예약 시간 입력해주기 + count++; + + } + + }else {//일반 예약 발송의 경우 + + tempVO.setReqDate(mjonMsgVO.getReqDate()); + + } + } + + if(!msgType.equals("4")) { // 장문 혹은 그림문자일 경우 추가 + + tempVO.setMmsSubject(mjonMsgVO.getMmsSubject()); + //tempVO.setSmsTxt(smsTxt); + 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(contents); + 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++; + + } + + //문자 발송 캐시 차감 해주기 + MjonPayVO mjonPayVO = new MjonPayVO(); + + if(resultCnt > 0 && blockCnt > 0) { + + Float blockPrice = Float.parseFloat(mjonMsgVO.getEachPrice()) * blockCnt; + Float totPrice = Float.parseFloat(mjonMsgVO.getTotPrice()); + Float endPrice = totPrice - blockPrice; + + mjonMsgVO.setTotPrice(Float.toString(endPrice)); + + //수신거부가 있는 경우 총 건수에서 수신거부 건수를 차감 후 그룹 테이블에 업데이트 해준다. + int groupCnt = callToCnt - blockCnt; + mjonMsgVO.setMsgGroupCnt(Integer.toString(groupCnt)); + + } + + //문자 발송 테이블에 입력 데이터가 있는 경우 그룹 테이블에도 입력 해 준다. + if(resultCnt > 0 && Integer.parseInt(mjonMsgVO.getMsgGroupCnt()) > 0) { + + // 문자 전송 그룹 테이블에 정보 입력 + mjonMsgDAO.insertGroupMsgData(mjonMsgVO); + + } + + //1건 이상 발송이 완료된 경우 시스템 로그를 기록한다. + if(resultCnt > 0) { + + // 시스템 발송 로그 + SendLogVO sendLogVO = new SendLogVO(); + // SendType 1:문자로 발송 2:이메일로 발송 + sendLogVO.setSendId(mjonMsgVO.getMsgGroupId()); + sendLogVO.setSendType("1"); + sendLogVO.setFrstSendInfo(mjonMsgVO.getCallFrom()); + sendLogVO.setReceive(mjonMsgVO.getCallTo()); + sendLogVO.setCheckNo(""); + sendLogVO.setContents(mjonMsgVO.getSmsTxt()); + + mjonMsgDataService.insertSysMsgLog(sendLogVO); + + } + + MjonMsgReturnVO returnVO = new MjonMsgReturnVO(); + + returnVO.setSendMsgCnt(Integer.toString(resultCnt)); //발송 건수 저장 + returnVO.setSendMsgBlockCnt(Integer.toString(blockCnt)); //수신차단 건수 저장 + + return returnVO; + + } + + + public List selectLetterList(LetterVO letterVO) throws Exception{ + + return mjonMsgDataDAO.selectLetterList(letterVO); + } + + public List selectPhotoLetterList(LetterVO letterVO) throws Exception{ + + return mjonMsgDataDAO.selectPhotoLetterList(letterVO); + + } + + public List selectCustomPopupImgList(LetterVO letterVO) throws Exception { + + return mjonMsgDataDAO.selectCustomPopupImgList(letterVO); + } + + public int insertMyMsgDataAjax(MjonMsgDataVO mjonMsgDataVO) throws Exception{ + + return mjonMsgDataDAO.insertMyMsgDataAjax(mjonMsgDataVO); + } + + public List selectMyMsgDataListAjax(MjonMsgDataVO mjonMsgDataVO) throws Exception{ + + return mjonMsgDataDAO.selectMyMsgDataListAjax(mjonMsgDataVO); + } + + public List selectSendPhonNumList(String userId) throws Exception{ + + return mjonMsgDataDAO.selectSendPhonNumList(userId); + } + + //차단 발신번호 리스트 불러오기 + public List selectBlockPhonNumList() throws Exception{ + return mjonMsgDataDAO.selectBlockPhonNumList(); + } + + public JoinSettingVO selectJoinSettingInfo() throws Exception{ + + return mjonMsgDataDAO.selectJoinSettingInfo(); + } + + public MberManageVO selectMberManageInfo(String userId) throws Exception{ + + return mjonMsgDataDAO.selectMberManageInfo(userId); + } + + public List selectMyMsgPhotoListInfo(List myMsgList) throws Exception{ + + List atchFileList = new ArrayList(); + + int size = myMsgList.size(); + for(int i=0; i < size; i++ ) { + + String atchFileId1 = ((EgovMap)myMsgList.get(i)).get("atchFileId1") != null ? ((EgovMap)myMsgList.get(i)).get("atchFileId1").toString() : ""; + String atchFileId2 = ((EgovMap)myMsgList.get(i)).get("atchFileId2") != null ? ((EgovMap)myMsgList.get(i)).get("atchFileId2").toString() : ""; + String atchFileId3 = ((EgovMap)myMsgList.get(i)).get("atchFileId3") != null ? ((EgovMap)myMsgList.get(i)).get("atchFileId3").toString() : ""; + + if(atchFileId1 != null && !atchFileId1.equals("")) { + + atchFileList.add(atchFileId1); + + } + if(atchFileId2 != null && !atchFileId2.equals("")) { + + atchFileList.add(atchFileId2); + + } + if(atchFileId3 != null && !atchFileId3.equals("")) { + + atchFileList.add(atchFileId3); + + } + + } + + MjonMsgDataVO mjonMsgDataVO = new MjonMsgDataVO(); + mjonMsgDataVO.setAtchFileList(atchFileList); + + return mjonMsgDataDAO.selectMyMsgPhotoListInfo(mjonMsgDataVO); + + } + + public void deleteMyMsgDataListAjax(MjonMsgDataVO mjonMsgDataVO) throws Exception{ + + mjonMsgDataDAO.deleteMyMsgDataListAjax(mjonMsgDataVO); + } + + public List selectLatestMsgList(MjonMsgDataVO mjonMsgDataVO) throws Exception{ + + return mjonMsgDataDAO.selectLatestMsgList(mjonMsgDataVO); + } + + public List selectBookMarkMsgList(MjonMsgDataVO mjonMsgDataVO) throws Exception{ + + return mjonMsgDataDAO.selectBookMarkMsgList(mjonMsgDataVO); + } + + public String selectBeforeCashData(MjonMsgVO mjonMsgVO) throws Exception{ + + return mjonMsgDataDAO.selectBeforeCashData(mjonMsgVO); + } + + public String selectBeforePointData(MjonMsgVO mjonMsgVO) throws Exception{ + + return mjonMsgDataDAO.selectBeforePointData(mjonMsgVO); + } + + @Override + public List selectPayUserList(MjonMsgVO mjonMsgVO) throws Exception { + return mjonMsgDataDAO.selectPayUserList(mjonMsgVO); + } + + @Override + public List selectPayUserSWList(MjonMsgVO mjonMsgVO) throws Exception { + return mjonMsgDataDAO.selectPayUserSWList(mjonMsgVO); + } + + @Override + public List selectPayUserSumList(MjonMsgVO mjonMsgVO) throws Exception { + return mjonMsgDataDAO.selectPayUserSumList(mjonMsgVO); + } + + //시스템 문자발송 + public MjonMsgReturnVO insertSysMsgDataInfo(MjonMsgVO mjonMsgVO) throws Exception{ + + // 문자 전송 그룹아이디 생성 + mjonMsgVO.setMsgGroupId(idgenMjonMsgGroupId.getNextStringId()); + + // 문자 아이디 생성 + mjonMsgVO.setMsgId(idgenMsgId.getNextStringId()); + + String msgType = mjonMsgVO.getMsgType(); + String agentCode = mjonMsgVO.getAgentCode(); + // 장문 전송 + String contSeq = ""; + + //float myPrice = 10000; + //float totPrice = Float.parseFloat(mjonMsgVO.getTotPrice()); + // 최종 입력 수 저장 변수 + int resultCnt = 0; + int limitCnt = 1000; + int blockCnt = 0; + + // 총 보유 금액과 전송 합계 비교 + + /*if(myPrice < totPrice) { // 보유 금액보다 전송 합계가 적은 경우 리턴 + + return 0 ; + }*/ + + int callToCnt = 1; //전체 받는사람 건수 + + mjonMsgVO.setMsgGroupCnt(Integer.toString(callToCnt)); + + + //그룹 테이블에 입력할 발송 시간 및 예약 발송 시간 처리 + 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(callToCnt >= 1000) { + + limitCnt = 100; + + } + + //수신자 리스트 처리 + 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; //분할 카운트 + + + 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 = 1; // 수신자 전체 갯수 + divideCnt = Integer.parseInt(mjonMsgVO.getDivideCnt()); //분할 발송 갯수 + + } + + String[] phoneList = mjonMsgVO.getCallToList(); //받는사람 연락처 리스트 + /*String[] nameList = mjonMsgVO.getNameList(); //치환 이름 리스트 + String[] rep1 = mjonMsgVO.getRep1List(); //치환 문자1 리스트 + String[] rep2 = mjonMsgVO.getRep2List(); //치환 문자2 리스트 + String[] rep3 = mjonMsgVO.getRep3List(); //치환 문자3 리스트 + String[] rep4 = mjonMsgVO.getRep4List(); //치환 문자4 리스트 +*/ + //for(String phonNum : mjonMsgVO.getCallToList()) { + + for(int i = 0; i < callToCnt; i++) { + + /*Boolean blockSts = false; + for(int j = 0; j < usrBlockCnt; j++) { + + if(phoneList[i].equals(userBlockList.get(j).toString())) { + + blockCnt++; //수신 차단 카운드를 해준다. + blockSts = true; + + } + + }*/ + + + MjonMsgVO tempVO = new MjonMsgVO(); + + tempVO.setMsgId(mjonMsgVO.getMsgId()); + tempVO.setUserId(mjonMsgVO.getUserId()); + //tempVO.setCallTo(phoneList[i]); + tempVO.setCallTo(mjonMsgVO.getCallTo()); + tempVO.setCallFrom(mjonMsgVO.getCallFrom()); + + tempVO.setMsgType(mjonMsgVO.getMsgType()); + tempVO.setAgentCode(mjonMsgVO.getAgentCode()); + tempVO.setMsgGroupId(mjonMsgVO.getMsgGroupId()); + tempVO.setMsgCnt(mjonMsgVO.getMsgCnt()); + + //문자내용 내용 - 치환 처리 + /*String smsTxt = mjonMsgVO.getSmsTxt(); //발송 문자 내용 + + smsTxt = smsTxt.replaceAll(String.valueOf((char)13), ""); + if (smsTxt.indexOf("[*이름*]") > -1) + smsTxt = smsTxt.replaceAll("\\[\\*이름\\*\\]", StringUtil.getString(nameList[i])); + if (smsTxt.indexOf("[*1*]") > -1) + smsTxt = smsTxt.replaceAll("\\[\\*1\\*\\]", StringUtil.getString(rep1[i])); + if (smsTxt.indexOf("[*2*]") > -1) + smsTxt = smsTxt.replaceAll("\\[\\*2\\*\\]", StringUtil.getString(rep2[i])); + if (smsTxt.indexOf("[*3*]") > -1) + smsTxt = smsTxt.replaceAll("\\[\\*3\\*\\]", StringUtil.getString(rep3[i])); + if (smsTxt.indexOf("[*4*]") > -1) + smsTxt = smsTxt.replaceAll("\\[\\*4\\*\\]", StringUtil.getString(rep4[i])); + + tempVO.setSmsTxt(smsTxt);*/ + tempVO.setSmsTxt(mjonMsgVO.getSmsTxt()); + + Date now = new Date(); + + SimpleDateFormat sdFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); + + tempVO.setReqDate(sdFormat.format(now)); + + //문자 내용 추가해 주기 + msgDataInfo.add(tempVO); + + + int instCnt = 0; + //지금까지 루프 돌아간 것이 전체 수신자 갯수와 같으면 추가가 완료된 것으로 판단 되어 전송 해줌 + if(totCnt == callToCnt) { + + if(msgDataInfo.size() > 0) { + + //데이터 디비 입력해주기 + instCnt = mjonMsgDataDAO.insertSysMsgDataInfo(msgDataInfo, msgType, agentCode); + + } + + + //총 디비 입력 건수 저장하기 + resultCnt = resultCnt + instCnt; + + }else { + + //특정 건수 이상일 경우 분할해서 디비에 넣어준다. + if(cnt == limitCnt) { + + if(msgDataInfo.size() > 0) { + + //분할 최대건수가 되면 디비에 입력하기 + instCnt = mjonMsgDataDAO.insertSysMsgDataInfo(msgDataInfo, msgType, agentCode); + + } + + + //총 디비 입력 건수 저장하기 + resultCnt = resultCnt + instCnt; + cnt = 0; + + //List 초기화 하기 + msgDataInfo.clear(); + + } + + } + + cnt++; + totCnt++; + + } + + if(blockCnt > 0) { + + //수신거부가 있는 경우 총 건수에서 수신거부 건수를 차감 후 그룹 테이블에 업데이트 해준다. + int groupCnt = callToCnt - blockCnt; + mjonMsgVO.setMsgGroupCnt(Integer.toString(groupCnt)); + + //mjonMsgDAO.updateGroupMsgData(mjonMsgVO); + + } + + //시스템 발송은 문자 발송 금액이 없음 + mjonMsgVO.setTotPrice("0"); + mjonMsgVO.setBefCash("0"); + mjonMsgVO.setFileCnt("0"); + mjonMsgVO.setEachPrice("0"); + + if(Integer.parseInt(mjonMsgVO.getMsgGroupCnt()) > 0) { + + // 문자 전송 그룹 테이블에 정보 입력 + mjonMsgDAO.insertGroupMsgData(mjonMsgVO); + + } + + MjonMsgReturnVO returnVO = new MjonMsgReturnVO(); + + returnVO.setMsgGroupId(mjonMsgVO.getMsgGroupId()); + returnVO.setSendMsgCnt(Integer.toString(resultCnt)); //발송 건수 저장 + returnVO.setSendMsgBlockCnt(Integer.toString(blockCnt)); //수신차단 건수 저장 + + return returnVO; + } + + @Override + public void insertSysMsgLog(SendLogVO sendLogVO) throws Exception{ + //시스템 문자발송 이력 Idgen // sendLogVO.setSendId(idgenMjonMsgGroupId.getNextStringId()); - mjonMsgDataDAO.insertSysMsgLog(sendLogVO); - } + mjonMsgDataDAO.insertSysMsgLog(sendLogVO); + } - @Override - public SendLogVO selectSysMsgLog(SendLogVO sendLogVO) throws Exception { - return mjonMsgDataDAO.selectSysMsgLog(sendLogVO); - } - - public List selectMsgAddrListAjax(AddrVO addrVO) throws Exception{ - - return mjonMsgDataDAO.selectMsgAddrListAjax(addrVO); - } - - public MjonMsgDataVO selectMsgAddInfoAjax(MjonMsgDataVO mjonMsgDataVO) throws Exception{ - - return mjonMsgDataDAO.selectMsgAddInfoAjax(mjonMsgDataVO); - } - - public List selectMsgAddPhotoInfo(MjonMsgDataVO mjonMsgDataVO) throws Exception{ - - List atchFileList = new ArrayList(); - - String atchFileId1 = mjonMsgDataVO.getAtchFileId1() != null ? mjonMsgDataVO.getAtchFileId1() : ""; - String atchFileId2 = mjonMsgDataVO.getAtchFileId2() != null ? mjonMsgDataVO.getAtchFileId2() : ""; - String atchFileId3 = mjonMsgDataVO.getAtchFileId3() != null ? mjonMsgDataVO.getAtchFileId3() : ""; + @Override + public SendLogVO selectSysMsgLog(SendLogVO sendLogVO) throws Exception { + return mjonMsgDataDAO.selectSysMsgLog(sendLogVO); + } - if(atchFileId1 != null && !atchFileId1.equals("")) { - - atchFileList.add(atchFileId1); - - } - if(atchFileId2 != null && !atchFileId2.equals("")) { - - atchFileList.add(atchFileId2); - - } - if(atchFileId3 != null && !atchFileId3.equals("")) { - - atchFileList.add(atchFileId3); - - } - - mjonMsgDataVO.setAtchFileList(atchFileList); - - List result = new ArrayList<>(); - - if(atchFileList.size() > 0) { //저장 내용에 그림 이미지가 있는 경우만 처리 - - result = mjonMsgDataDAO.selectMyMsgPhotoListInfo(mjonMsgDataVO); - - } - - return result; - } - - public List selectReSendMsgDataList(MjonMsgDataVO mjonMsgDataVO) throws Exception{ - - return mjonMsgDataDAO.selectReSendMsgDataList(mjonMsgDataVO); - } - - public MjonMsgDataVO selectMsgReSendPhotoInfo(MjonMsgVO mjonMsgVO) throws Exception{ - - MjonMsgDataVO mjonMsgDataVO = new MjonMsgDataVO(); - - String filePath1 = mjonMsgVO.getFileType1() != null ? mjonMsgVO.getFileType1() : ""; - String filePath2 = mjonMsgVO.getFileType2() != null ? mjonMsgVO.getFileType2() : ""; - String filePath3 = mjonMsgVO.getFileType3() != null ? mjonMsgVO.getFileType3() : ""; - - String atchFileId1 = ""; - String atchFileId2 = ""; - String atchFileId3 = ""; - - if(filePath1 != null && !filePath1.equals("")) { - - filePath1 = filePath1.replace("/usr/local/tomcat_mjon/webapps/mjon/", ""); - String[] spFilePath = filePath1.split("/"); - - String cours = ""; - String fileNm = ""; - String extsn = ""; - - cours = "/" + spFilePath[0] + "/" + spFilePath[1]; //파일 STRE_FILE_COURS 내용 저장 - - String[] spFileNm = spFilePath[2].replace(".", "/").split("/"); - fileNm = spFileNm[0]; //파일 STRE_FILE_NM 내용 저장 - extsn = spFileNm[1]; //파일 FILE_EXTSN 내용 저장 - - mjonMsgDataVO.setFileStreCours(cours); - mjonMsgDataVO.setStreFileNm(fileNm); - mjonMsgDataVO.setFileExtsn(extsn); - - atchFileId1 = mjonMsgDataDAO.selectMsgPhotoAtchFilIdInfo(mjonMsgDataVO); - - mjonMsgDataVO.setAtchFileId1(atchFileId1); - //atchFileList.add(atchFileId1); - - } - - if(filePath2 != null && !filePath2.equals("")) { - - filePath2 = filePath2.replace("/usr/local/tomcat_mjon/webapps/mjon/", ""); - String[] spFilePath = filePath1.split("/"); - - String cours = ""; - String fileNm = ""; - String extsn = ""; - - cours = "/" + spFilePath[0] + "/" + spFilePath[1]; //파일 STRE_FILE_COURS 내용 저장 - - String[] spFileNm = spFilePath[2].replace(".", "/").split("/"); - fileNm = spFileNm[0]; //파일 STRE_FILE_NM 내용 저장 - extsn = spFileNm[1]; //파일 FILE_EXTSN 내용 저장 - - mjonMsgDataVO.setFileStreCours(cours); - mjonMsgDataVO.setStreFileNm(fileNm); - mjonMsgDataVO.setFileExtsn(extsn); - - atchFileId2 = mjonMsgDataDAO.selectMsgPhotoAtchFilIdInfo(mjonMsgDataVO); - mjonMsgDataVO.setAtchFileId2(atchFileId2); - //atchFileList.add(atchFileId2); - - } - - if(filePath3 != null && !filePath3.equals("")) { - - filePath3 = filePath3.replace("/usr/local/tomcat_mjon/webapps/mjon/", ""); - String[] spFilePath = filePath1.split("/"); - - String cours = ""; - String fileNm = ""; - String extsn = ""; - - cours = "/" + spFilePath[0] + "/" + spFilePath[1]; //파일 STRE_FILE_COURS 내용 저장 - - String[] spFileNm = spFilePath[2].replace(".", "/").split("/"); - fileNm = spFileNm[0]; //파일 STRE_FILE_NM 내용 저장 - extsn = spFileNm[1]; //파일 FILE_EXTSN 내용 저장 - - mjonMsgDataVO.setFileStreCours(cours); - mjonMsgDataVO.setStreFileNm(fileNm); - mjonMsgDataVO.setFileExtsn(extsn); - - atchFileId3 = mjonMsgDataDAO.selectMsgPhotoAtchFilIdInfo(mjonMsgDataVO); - mjonMsgDataVO.setAtchFileId3(atchFileId3); - //atchFileList.add(atchFileId3); - - } - - //mjonMsgDataVO.setAtchFileList(atchFileList); - - List result = new ArrayList<>(); - - /*if(atchFileList.size() > 0) { //저장 내용에 그림 이미지가 있는 경우만 처리 - - result = mjonMsgDataDAO.selectMyMsgPhotoListInfo(mjonMsgDataVO); - - }*/ - - return mjonMsgDataVO; - - } - - public MjonMsgDataVO selectLetterCnById(MjonMsgDataVO mjonMsgDataVO) throws Exception{ - - return mjonMsgDataDAO.selectLetterCnById(mjonMsgDataVO); - } - - public int selectMsgSearchWordCnt(MjonMsgDataVO mjonMsgDataVO) throws Exception{ - - return mjonMsgDataDAO.selectMsgSearchWordCnt(mjonMsgDataVO); - } - - public int insertMsgSearchWordInfo(MjonMsgDataVO mjonMsgDataVO) throws Exception{ - - return mjonMsgDataDAO.insertMsgSearchWordInfo(mjonMsgDataVO); - } - - public int updateMsgSearchWordCnt(MjonMsgDataVO mjonMsgDataVO) throws Exception{ - - return mjonMsgDataDAO.updateMsgSearchWordCnt(mjonMsgDataVO); - } - - public List selectMsgSearchWordList(MjonMsgDataVO mjonMsgDataVO) throws Exception{ - - return mjonMsgDataDAO.selectMsgSearchWordList(mjonMsgDataVO); - } - - //문자검색 인기검색어(노출여부=Y) 리스트 불러오기 2023-05-30 Hans - public List selectMsgSearchWordExpList(MjonMsgDataVO mjonMsgDataVO) throws Exception{ - - return mjonMsgDataDAO.selectMsgSearchWordExpList(mjonMsgDataVO); - } - - - - //문자검색 전송 실패 리스트 불러오기 - public void selectMsgSentFailList()throws Exception{ + public List selectMsgAddrListAjax(AddrVO addrVO) throws Exception{ - List msgFailList = mjonMsgDataDAO.selectMsgSentFailList(); - - for(MjonMsgVO vo : msgFailList) { - - mjonMsgDataDAO.updateMsgSentFailPayBack(vo); - - } - - } + return mjonMsgDataDAO.selectMsgAddrListAjax(addrVO); + } - //문자검색 전송 실패 리스트 불러오기 - public void selectMsgSentFailListOneByDay()throws Exception{ + public MjonMsgDataVO selectMsgAddInfoAjax(MjonMsgDataVO mjonMsgDataVO) throws Exception{ - List msgFailList = mjonMsgDataDAO.selectMsgSentFailListOneByDay(); - - for(MjonMsgVO vo : msgFailList) { - - mjonMsgDataDAO.updateMsgSentFailPayBack(vo); - - } - - } - - //현재 월 총 발송 건수 합계 구하기 - public String selectMsgSentSumData(String userId) throws Exception{ - return mjonMsgDataDAO.selectMsgSentSumData(userId); - } - - - public int insertMsgDataInfoIheartTest() throws Exception{ - int result = mjonMsgDataDAO.insertMsgDataInfoIheartTest(); - - return result; - } - - //결제관리 사용내역화면의 문자 상세보기 내용 - public MjonMsgVO selectPayUserMsgDetailDataAjax(MjonMsgVO mjonMsgVO) throws Exception{ - return mjonMsgDataDAO.selectPayUserMsgDetailDataAjax(mjonMsgVO); - } - - // MsgGroupData Not Exist Check - public MjonMsgVO selectMsgGroupNotExistInfo(MjonMsgVO mjonMsgVO) throws Exception{ - return mjonMsgDataDAO.selectMsgGroupNotExistInfo(mjonMsgVO); - } - - //문자발송 스팸 문자 리스트 불러오기 - public List selectSpamKeywordList() throws Exception{ - return mjonMsgDataDAO.selectSpamKeywordList(); - } - - public List selectBestMsgDataList(LetterVO letterVO) throws Exception{ - - return mjonMsgDataDAO.selectBestMsgDataList(letterVO); - } + return mjonMsgDataDAO.selectMsgAddInfoAjax(mjonMsgDataVO); + } - public List selectBestPhotoMsgDataList(LetterVO letterVO) throws Exception{ - - return mjonMsgDataDAO.selectBestPhotoMsgDataList(letterVO); - } + public List selectMsgAddPhotoInfo(MjonMsgDataVO mjonMsgDataVO) throws Exception{ + + List atchFileList = new ArrayList(); + + String atchFileId1 = mjonMsgDataVO.getAtchFileId1() != null ? mjonMsgDataVO.getAtchFileId1() : ""; + String atchFileId2 = mjonMsgDataVO.getAtchFileId2() != null ? mjonMsgDataVO.getAtchFileId2() : ""; + String atchFileId3 = mjonMsgDataVO.getAtchFileId3() != null ? mjonMsgDataVO.getAtchFileId3() : ""; + + if(atchFileId1 != null && !atchFileId1.equals("")) { + + atchFileList.add(atchFileId1); + + } + if(atchFileId2 != null && !atchFileId2.equals("")) { + + atchFileList.add(atchFileId2); + + } + if(atchFileId3 != null && !atchFileId3.equals("")) { + + atchFileList.add(atchFileId3); + + } + + mjonMsgDataVO.setAtchFileList(atchFileList); + + List result = new ArrayList<>(); + + if(atchFileList.size() > 0) { //저장 내용에 그림 이미지가 있는 경우만 처리 + + result = mjonMsgDataDAO.selectMyMsgPhotoListInfo(mjonMsgDataVO); + + } + + return result; + } + + public List selectReSendMsgDataList(MjonMsgDataVO mjonMsgDataVO) throws Exception{ + + return mjonMsgDataDAO.selectReSendMsgDataList(mjonMsgDataVO); + } + + public MjonMsgDataVO selectMsgReSendPhotoInfo(MjonMsgVO mjonMsgVO) throws Exception{ + + MjonMsgDataVO mjonMsgDataVO = new MjonMsgDataVO(); + + String filePath1 = mjonMsgVO.getFileType1() != null ? mjonMsgVO.getFileType1() : ""; + String filePath2 = mjonMsgVO.getFileType2() != null ? mjonMsgVO.getFileType2() : ""; + String filePath3 = mjonMsgVO.getFileType3() != null ? mjonMsgVO.getFileType3() : ""; + + String atchFileId1 = ""; + String atchFileId2 = ""; + String atchFileId3 = ""; + + if(filePath1 != null && !filePath1.equals("")) { + + filePath1 = filePath1.replace("/usr/local/tomcat_mjon/webapps/mjon/", ""); + String[] spFilePath = filePath1.split("/"); + + String cours = ""; + String fileNm = ""; + String extsn = ""; + + cours = "/" + spFilePath[0] + "/" + spFilePath[1]; //파일 STRE_FILE_COURS 내용 저장 + + String[] spFileNm = spFilePath[2].replace(".", "/").split("/"); + fileNm = spFileNm[0]; //파일 STRE_FILE_NM 내용 저장 + extsn = spFileNm[1]; //파일 FILE_EXTSN 내용 저장 + + mjonMsgDataVO.setFileStreCours(cours); + mjonMsgDataVO.setStreFileNm(fileNm); + mjonMsgDataVO.setFileExtsn(extsn); + + atchFileId1 = mjonMsgDataDAO.selectMsgPhotoAtchFilIdInfo(mjonMsgDataVO); + + mjonMsgDataVO.setAtchFileId1(atchFileId1); + //atchFileList.add(atchFileId1); + + } + + if(filePath2 != null && !filePath2.equals("")) { + + filePath2 = filePath2.replace("/usr/local/tomcat_mjon/webapps/mjon/", ""); + String[] spFilePath = filePath1.split("/"); + + String cours = ""; + String fileNm = ""; + String extsn = ""; + + cours = "/" + spFilePath[0] + "/" + spFilePath[1]; //파일 STRE_FILE_COURS 내용 저장 + + String[] spFileNm = spFilePath[2].replace(".", "/").split("/"); + fileNm = spFileNm[0]; //파일 STRE_FILE_NM 내용 저장 + extsn = spFileNm[1]; //파일 FILE_EXTSN 내용 저장 + + mjonMsgDataVO.setFileStreCours(cours); + mjonMsgDataVO.setStreFileNm(fileNm); + mjonMsgDataVO.setFileExtsn(extsn); + + atchFileId2 = mjonMsgDataDAO.selectMsgPhotoAtchFilIdInfo(mjonMsgDataVO); + mjonMsgDataVO.setAtchFileId2(atchFileId2); + //atchFileList.add(atchFileId2); + + } + + if(filePath3 != null && !filePath3.equals("")) { + + filePath3 = filePath3.replace("/usr/local/tomcat_mjon/webapps/mjon/", ""); + String[] spFilePath = filePath1.split("/"); + + String cours = ""; + String fileNm = ""; + String extsn = ""; + + cours = "/" + spFilePath[0] + "/" + spFilePath[1]; //파일 STRE_FILE_COURS 내용 저장 + + String[] spFileNm = spFilePath[2].replace(".", "/").split("/"); + fileNm = spFileNm[0]; //파일 STRE_FILE_NM 내용 저장 + extsn = spFileNm[1]; //파일 FILE_EXTSN 내용 저장 + + mjonMsgDataVO.setFileStreCours(cours); + mjonMsgDataVO.setStreFileNm(fileNm); + mjonMsgDataVO.setFileExtsn(extsn); + + atchFileId3 = mjonMsgDataDAO.selectMsgPhotoAtchFilIdInfo(mjonMsgDataVO); + mjonMsgDataVO.setAtchFileId3(atchFileId3); + //atchFileList.add(atchFileId3); + + } + + //mjonMsgDataVO.setAtchFileList(atchFileList); + + List result = new ArrayList<>(); + + /*if(atchFileList.size() > 0) { //저장 내용에 그림 이미지가 있는 경우만 처리 + + result = mjonMsgDataDAO.selectMyMsgPhotoListInfo(mjonMsgDataVO); + + }*/ + + return mjonMsgDataVO; + + } + + public MjonMsgDataVO selectLetterCnById(MjonMsgDataVO mjonMsgDataVO) throws Exception{ + + return mjonMsgDataDAO.selectLetterCnById(mjonMsgDataVO); + } + + public int selectMsgSearchWordCnt(MjonMsgDataVO mjonMsgDataVO) throws Exception{ + + return mjonMsgDataDAO.selectMsgSearchWordCnt(mjonMsgDataVO); + } + + public int insertMsgSearchWordInfo(MjonMsgDataVO mjonMsgDataVO) throws Exception{ + + return mjonMsgDataDAO.insertMsgSearchWordInfo(mjonMsgDataVO); + } + + public int updateMsgSearchWordCnt(MjonMsgDataVO mjonMsgDataVO) throws Exception{ + + return mjonMsgDataDAO.updateMsgSearchWordCnt(mjonMsgDataVO); + } + + public List selectMsgSearchWordList(MjonMsgDataVO mjonMsgDataVO) throws Exception{ + + return mjonMsgDataDAO.selectMsgSearchWordList(mjonMsgDataVO); + } + + //문자검색 인기검색어(노출여부=Y) 리스트 불러오기 2023-05-30 Hans + public List selectMsgSearchWordExpList(MjonMsgDataVO mjonMsgDataVO) throws Exception{ + + return mjonMsgDataDAO.selectMsgSearchWordExpList(mjonMsgDataVO); + } + + + + //문자검색 전송 실패 리스트 불러오기 + public void selectMsgSentFailList()throws Exception{ + + List msgFailList = mjonMsgDataDAO.selectMsgSentFailList(); + + for(MjonMsgVO vo : msgFailList) { + + mjonMsgDataDAO.updateMsgSentFailPayBack(vo); + + } + + } + + //문자검색 전송 실패 리스트 불러오기 + public void selectMsgSentFailListOneByDay()throws Exception{ + + List msgFailList = mjonMsgDataDAO.selectMsgSentFailListOneByDay(); + + for(MjonMsgVO vo : msgFailList) { + + mjonMsgDataDAO.updateMsgSentFailPayBack(vo); + + } + + } + + //현재 월 총 발송 건수 합계 구하기 + public String selectMsgSentSumData(String userId) throws Exception{ + return mjonMsgDataDAO.selectMsgSentSumData(userId); + } + + + public int insertMsgDataInfoIheartTest() throws Exception{ + int result = mjonMsgDataDAO.insertMsgDataInfoIheartTest(); + + return result; + } + + //결제관리 사용내역화면의 문자 상세보기 내용 + public MjonMsgVO selectPayUserMsgDetailDataAjax(MjonMsgVO mjonMsgVO) throws Exception{ + return mjonMsgDataDAO.selectPayUserMsgDetailDataAjax(mjonMsgVO); + } + + // MsgGroupData Not Exist Check + public MjonMsgVO selectMsgGroupNotExistInfo(MjonMsgVO mjonMsgVO) throws Exception{ + return mjonMsgDataDAO.selectMsgGroupNotExistInfo(mjonMsgVO); + } + + //문자발송 스팸 문자 리스트 불러오기 + public List selectSpamKeywordList() throws Exception{ + return mjonMsgDataDAO.selectSpamKeywordList(); + } + + public List selectBestMsgDataList(LetterVO letterVO) throws Exception{ + + return mjonMsgDataDAO.selectBestMsgDataList(letterVO); + } + + public List selectBestPhotoMsgDataList(LetterVO letterVO) throws Exception{ + + return mjonMsgDataDAO.selectBestPhotoMsgDataList(letterVO); + } + + @Override + public List selectSendAgentList(MjonMsgVO mjonMsgVO) throws Exception { + return mjonMsgDataDAO.selectSendAgentList(mjonMsgVO); + } + + @Override + public MjonMsgVO selectSendAgentInfo(MjonMsgVO mjonMsgVO) throws Exception { + return mjonMsgDataDAO.selectSendAgentInfo(mjonMsgVO); + } + + @Override + public List selectPayUserWithKakaoList(MjonMsgVO mjonMsgVO) throws Exception { + return mjonMsgDataDAO.selectPayUserWithKakaoList(mjonMsgVO); + } + + @Override + public List selectPayUserWithKakaoSumList(MjonMsgVO mjonMsgVO) throws Exception { + return mjonMsgDataDAO.selectPayUserWithKakaoSumList(mjonMsgVO); + } + + // 문자 그룹정보 => 재전송용 + public MjonMsgDataVO selectMjMsgGroupInfoByResend(MjonMsgDataVO mjonMsgDataVO) throws Exception{ + return mjonMsgDataDAO.selectMjMsgGroupInfoByResend(mjonMsgDataVO); + } + + // 문자 상세정보 => 재전송용 + public List selectMjMsgListByResend(MjonMsgDataVO mjonMsgDataVO) throws Exception{ + return mjonMsgDataDAO.selectMjMsgListByResend(mjonMsgDataVO); + } - @Override - public List selectSendAgentList(MjonMsgVO mjonMsgVO) throws Exception { - return mjonMsgDataDAO.selectSendAgentList(mjonMsgVO); - } - @Override - public MjonMsgVO selectSendAgentInfo(MjonMsgVO mjonMsgVO) throws Exception { - return mjonMsgDataDAO.selectSendAgentInfo(mjonMsgVO); - } - - @Override - public List selectPayUserWithKakaoList(MjonMsgVO mjonMsgVO) throws Exception { - return mjonMsgDataDAO.selectPayUserWithKakaoList(mjonMsgVO); - } - - @Override - public List selectPayUserWithKakaoSumList(MjonMsgVO mjonMsgVO) throws Exception { - return mjonMsgDataDAO.selectPayUserWithKakaoSumList(mjonMsgVO); - } - - // 문자 그룹정보 => 재전송용 - public MjonMsgDataVO selectMjMsgGroupInfoByResend(MjonMsgDataVO mjonMsgDataVO) throws Exception{ - return mjonMsgDataDAO.selectMjMsgGroupInfoByResend(mjonMsgDataVO); - } - // 문자 상세정보 => 재전송용 - public List selectMjMsgListByResend(MjonMsgDataVO mjonMsgDataVO) throws Exception{ - return mjonMsgDataDAO.selectMjMsgListByResend(mjonMsgDataVO); - } - - - /* * 대량 문자 데이터 배치 입력 처리 신규 추가 - * 2024/02/02 우영두 - * - * + * 2024/02/02 우영두 + * + * * */ - public MjonMsgReturnVO insertMsgDataInfoBatch(MjonMsgVO mjonMsgVO) throws Exception{ - - MjonMsgReturnVO returnVO = new MjonMsgReturnVO(); - - try { - - String msgType = mjonMsgVO.getMsgType(); - String agentCode = mjonMsgVO.getAgentCode(); - // 장문 전송 - String contSeq = ""; - - //float myPrice = 10000; - //float totPrice = Float.parseFloat(mjonMsgVO.getTotPrice()); - // 최종 입력 수 저장 변수 - int resultCnt = 0; - int limitCnt = 10000; - int blockCnt = 0; - - // 총 보유 금액과 전송 합계 비교 - - /*if(myPrice < totPrice) { // 보유 금액보다 전송 합계가 적은 경우 리턴 - - return 0 ; - }*/ - - int callToCnt = mjonMsgVO.getCallToList().length; //전체 받는사람 건수 + public MjonMsgReturnVO insertMsgDataInfoBatch(MjonMsgVO mjonMsgVO) throws Exception{ + + MjonMsgReturnVO returnVO = new MjonMsgReturnVO(); + + try { + + String msgType = mjonMsgVO.getMsgType(); + String agentCode = mjonMsgVO.getAgentCode(); + // 장문 전송 + String contSeq = ""; + + //float myPrice = 10000; + //float totPrice = Float.parseFloat(mjonMsgVO.getTotPrice()); + // 최종 입력 수 저장 변수 + int resultCnt = 0; + int limitCnt = 10000; + int blockCnt = 0; + + // 총 보유 금액과 전송 합계 비교 + + /*if(myPrice < totPrice) { // 보유 금액보다 전송 합계가 적은 경우 리턴 + + return 0 ; + }*/ + + int callToCnt = mjonMsgVO.getCallToList().length; //전체 받는사람 건수 + + mjonMsgVO.setMsgGroupCnt(Integer.toString(callToCnt)); + + + //그룹 테이블에 입력할 발송 시간 및 예약 발송 시간 처리 + /*if(mjonMsgVO.getReserveYn().equals("N")) {//즉시 전송의 경우 현재 시간을 입력 + + Date now = new Date(); + + SimpleDateFormat sdFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); + + mjonMsgVO.setReqDate(sdFormat.format(now)); + + }*/ + + //사용자 현재 보유 금액 불러오기(문자 발송 금액 차감 이전 금액) + String befCash = mjonMsgVO.getBefCash(); + + //VO에서 현재 보유금액이 없으면 디비에서 조회해서 불러옴 + if("".equals(befCash) || befCash == null) { + befCash = mjonMsgDataDAO.selectBeforeCashData(mjonMsgVO); + } + + mjonMsgVO.setBefCash(befCash); + // 문자 전송 그룹 테이블에 정보 입력 + //mjonMsgDAO.insertGroupMsgData(mjonMsgVO); + + //수신거부 목록 불러오기 + List userBlockList = mjonMsgDAO.selectUserBlockList(mjonMsgVO); + + List dupliBlockList = MJUtil.getDuplicateList(userBlockList); + int usrBlockCnt = dupliBlockList.size(); + + //회원 전용 전송사 정보 불러오기 + MberManageVO userInfo = mjonMsgDataDAO.selectMberManageInfo(mjonMsgVO.getUserId()); + String hotlineAgentCode = userInfo.getHotlineAgentCode(); + + //야간스미싱 알림여부 정보 불러오기 + JoinSettingVO joinSettingVO = siteManagerDAO.selectAdminNotiDetail(); + String holiSmishingNoti = joinSettingVO.getHoliSmishingNoti(); + + System.out.println("++++++++++++++++++ holiSmishingNoti ::: "+holiSmishingNoti); + //스팸,스미싱이어도 딜레이없이 문자 전송을 처리할지 선택 상태값 변수 + boolean spamSmishingPassStatus = false; //야간스미싱 알림여부가 활성화인 경우 예외 알림 일정에 포함되는 시간에는 슬랙 및 30분 딜레이를 하지 않는다. + + //스팸, 스미싱 상태인 경우에만 true 처리 + //야간스미싱알리 여부가 비활성화 인경우 무조건 문자를 즉시 보내도록 한다. + //야간 스미싱 알림 여부가 활성화 이고 스미싱 알림 일정에 등록된 날짜와 시간에 포함되면 30분 딜레이 없이 발송 처리하도록 함. + if(holiSmishingNoti.equals("Y")) { + + MsgAlarmSetVO msgAlarmSetVO = new MsgAlarmSetVO(); + + msgAlarmSetVO.setUseYn("Y"); + msgAlarmSetVO.setFirstIndex(0); + + List resultAlarmList = msgHolidayDAO.selectAlarmSettingList(msgAlarmSetVO); + + Calendar calendar = Calendar.getInstance(); + int year = calendar.get(Calendar.YEAR); + + MsgHolidayVO msgHolidayVO = new MsgHolidayVO(); + msgHolidayVO.setFirstIndex(0); + msgHolidayVO.setRecordCountPerPage(100); + msgHolidayVO.setSearchHoliYear(Integer.toString(year)); + + List resultHolidayList = msgHolidayDAO.selectMsgHolidayList(msgHolidayVO); + + MjonHolidayApi mjonHolidayApi = new MjonHolidayApi(); + + boolean smishingAlarmPassSts = mjonHolidayApi.getHolidaySmishingPassStatus(resultAlarmList, resultHolidayList); + + spamSmishingPassStatus = smishingAlarmPassSts; + }else { + + spamSmishingPassStatus = true; + } + + //전용 전송사가 지정되어 있으면 실행 + if(!hotlineAgentCode.equals("00")) { + + MjonMsgAgentStsVO mjonMsgAgentStsVO = new MjonMsgAgentStsVO(); + mjonMsgAgentStsVO.setAgentCode(hotlineAgentCode); + + //문자 타입 셋팅 + if(msgType.equals("6")) { + 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(userInfo.getBlineCode().equals("N")) { + //회원 전용 전송사의 전송 비율이 0 이면 대표전송사로 전송되도록 셋팅함. + if(mberSendRate.equals("0") || useYn.equals("N")) { + + 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(int i=0; i< sendRateSize; i++) { + + String sndAgentCode = sendRateList.get(i).getAgentCode(); + + if(sndAgentCode.equals("01")) {//아이하트 전송비율 + + iheartCnt = Math.round(callToCnt * Float.parseFloat(sendRateList.get(i).getSendRate())); + + }else if(sndAgentCode.equals("02")) {//현대퓨처넷 전송비율 + + hncCnt = Math.round(callToCnt * Float.parseFloat(sendRateList.get(i).getSendRate())); + + }else if(sndAgentCode.equals("03")) {//아이엠오 전송비율 + + imoCnt = Math.round(callToCnt * Float.parseFloat(sendRateList.get(i).getSendRate())); + + }else if(sndAgentCode.equals("04")) {//비즈뿌리오 전송비율 + + 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 if(sndAgentCode.equals("07")) {//인비토 전송비율 + + ivtCnt = Math.round(callToCnt * Float.parseFloat(sendRateList.get(i).getSendRate())); + + } + + } + } + + /** + * 한번에 서버가 보낼수 있는 문자건수를 체크 해서 넘으면 분할해서 디비 입렵해 준다. + * 발송 건수가 천 건이 넘어가면, 백건씩 끊어서 발송 하도록 한다. + * */ + + /*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(spamStatus == null || spamStatus.equals("")) { + + spamStatus = "N"; + + } + + if(smishingYn == null || smishingYn.equals("")) { + + smishingYn = "N"; + + } + + //스팸스미싱 예외 상태가 true 이면 30분 딜레이 및 슬랙 알림을 하지 않는다. + if(spamSmishingPassStatus) { + + spamStatus = "N"; + smishingYn = "N"; + delayYn = "N"; + + } + + + 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()); //분할 발송 갯수 + + if(spamStatus.equals("Y") || smishingYn.equals("Y")) { + + mjonMsgVO.setDelayYn("Y");//일단 값만 등록해준다. 이거 안해주면 NULL 값으로 들어간다. 차후에 변경하도록 할 예정임, 원래는 스팸이면 Y로 넣어줘야한다. + + }else { + + mjonMsgVO.setDelayYn("N");//일단 값만 등록해준다. 이거 안해주면 NULL 값으로 들어간다. 차후에 변경하도록 할 예정임 + } + + }else {//즉시발송의 경우 현재 시간으로 입력해 준다. + + Date now = new Date(); + if(spamStatus.equals("Y") || smishingYn.equals("Y")) {//스팸 문자가 포함되었거나, 스미싱 의심 회원의 경우 문자발송 시간을 30분 딜레이 시킨다. + + 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 {//정상적인 문자인 경우 즉시발송 처리해준다. + + mjonMsgVO.setReqDate(transFormat.format(now)); + mjonMsgVO.setDelayYn(delayYn);//문자 발송 30분 지연 디폴트 값 셋팅(N) + + } + + } + + + //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 리스트 + + //Controller에서 전달 받은 분할 시간 정보 리스트 + List dividDayList = mjonMsgVO.getDividDay(); + + String frstDelayTime = mjonMsgVO.getReqDate(); - mjonMsgVO.setMsgGroupCnt(Integer.toString(callToCnt)); - - - //그룹 테이블에 입력할 발송 시간 및 예약 발송 시간 처리 - /*if(mjonMsgVO.getReserveYn().equals("N")) {//즉시 전송의 경우 현재 시간을 입력 - - Date now = new Date(); - - SimpleDateFormat sdFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); - - mjonMsgVO.setReqDate(sdFormat.format(now)); - - }*/ - - //사용자 현재 보유 금액 불러오기(문자 발송 금액 차감 이전 금액) - String befCash = mjonMsgVO.getBefCash(); - - //VO에서 현재 보유금액이 없으면 디비에서 조회해서 불러옴 - if("".equals(befCash) || befCash == null) { - befCash = mjonMsgDataDAO.selectBeforeCashData(mjonMsgVO); - } - - mjonMsgVO.setBefCash(befCash); - // 문자 전송 그룹 테이블에 정보 입력 - //mjonMsgDAO.insertGroupMsgData(mjonMsgVO); - - //수신거부 목록 불러오기 - List userBlockList = mjonMsgDAO.selectUserBlockList(mjonMsgVO); - - List dupliBlockList = MJUtil.getDuplicateList(userBlockList); - int usrBlockCnt = dupliBlockList.size(); - - //회원 전용 전송사 정보 불러오기 - MberManageVO userInfo = mjonMsgDataDAO.selectMberManageInfo(mjonMsgVO.getUserId()); - String hotlineAgentCode = userInfo.getHotlineAgentCode(); - - //야간스미싱 알림여부 정보 불러오기 - JoinSettingVO joinSettingVO = siteManagerDAO.selectAdminNotiDetail(); - String holiSmishingNoti = joinSettingVO.getHoliSmishingNoti(); - - System.out.println("++++++++++++++++++ holiSmishingNoti ::: "+holiSmishingNoti); - //스팸,스미싱이어도 딜레이없이 문자 전송을 처리할지 선택 상태값 변수 - boolean spamSmishingPassStatus = false; //야간스미싱 알림여부가 활성화인 경우 예외 알림 일정에 포함되는 시간에는 슬랙 및 30분 딜레이를 하지 않는다. - - //스팸, 스미싱 상태인 경우에만 true 처리 - //야간스미싱알리 여부가 비활성화 인경우 무조건 문자를 즉시 보내도록 한다. - //야간 스미싱 알림 여부가 활성화 이고 스미싱 알림 일정에 등록된 날짜와 시간에 포함되면 30분 딜레이 없이 발송 처리하도록 함. - if(holiSmishingNoti.equals("Y")) { - - MsgAlarmSetVO msgAlarmSetVO = new MsgAlarmSetVO(); - - msgAlarmSetVO.setUseYn("Y"); - msgAlarmSetVO.setFirstIndex(0); - - List resultAlarmList = msgHolidayDAO.selectAlarmSettingList(msgAlarmSetVO); - - Calendar calendar = Calendar.getInstance(); - int year = calendar.get(Calendar.YEAR); - - MsgHolidayVO msgHolidayVO = new MsgHolidayVO(); - msgHolidayVO.setFirstIndex(0); - msgHolidayVO.setRecordCountPerPage(100); - msgHolidayVO.setSearchHoliYear(Integer.toString(year)); - - List resultHolidayList = msgHolidayDAO.selectMsgHolidayList(msgHolidayVO); - - MjonHolidayApi mjonHolidayApi = new MjonHolidayApi(); - - boolean smishingAlarmPassSts = mjonHolidayApi.getHolidaySmishingPassStatus(resultAlarmList, resultHolidayList); - - spamSmishingPassStatus = smishingAlarmPassSts; - }else { - - spamSmishingPassStatus = true; - } - - //전용 전송사가 지정되어 있으면 실행 - if(!hotlineAgentCode.equals("00")) { - - MjonMsgAgentStsVO mjonMsgAgentStsVO = new MjonMsgAgentStsVO(); - mjonMsgAgentStsVO.setAgentCode(hotlineAgentCode); - - //문자 타입 셋팅 - if(msgType.equals("6")) { - 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(userInfo.getBlineCode().equals("N")) { - //회원 전용 전송사의 전송 비율이 0 이면 대표전송사로 전송되도록 셋팅함. - if(mberSendRate.equals("0") || useYn.equals("N")) { - - 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(int i=0; i< sendRateSize; i++) { - - String sndAgentCode = sendRateList.get(i).getAgentCode(); - - if(sndAgentCode.equals("01")) {//아이하트 전송비율 - - iheartCnt = Math.round(callToCnt * Float.parseFloat(sendRateList.get(i).getSendRate())); - - }else if(sndAgentCode.equals("02")) {//현대퓨처넷 전송비율 - - hncCnt = Math.round(callToCnt * Float.parseFloat(sendRateList.get(i).getSendRate())); - - }else if(sndAgentCode.equals("03")) {//아이엠오 전송비율 - - imoCnt = Math.round(callToCnt * Float.parseFloat(sendRateList.get(i).getSendRate())); - - }else if(sndAgentCode.equals("04")) {//비즈뿌리오 전송비율 - - 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 if(sndAgentCode.equals("07")) {//인비토 전송비율 - - ivtCnt = Math.round(callToCnt * Float.parseFloat(sendRateList.get(i).getSendRate())); - - } - - } - } - - /** - * 한번에 서버가 보낼수 있는 문자건수를 체크 해서 넘으면 분할해서 디비 입렵해 준다. - * 발송 건수가 천 건이 넘어가면, 백건씩 끊어서 발송 하도록 한다. - * */ - - /*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(spamStatus == null || spamStatus.equals("")) { - - spamStatus = "N"; - - } - - if(smishingYn == null || smishingYn.equals("")) { - - smishingYn = "N"; - - } - - //스팸스미싱 예외 상태가 true 이면 30분 딜레이 및 슬랙 알림을 하지 않는다. - if(spamSmishingPassStatus) { - - spamStatus = "N"; - smishingYn = "N"; - delayYn = "N"; - - } - - - 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()); //분할 발송 갯수 - - if(spamStatus.equals("Y") || smishingYn.equals("Y")) { - - mjonMsgVO.setDelayYn("Y");//일단 값만 등록해준다. 이거 안해주면 NULL 값으로 들어간다. 차후에 변경하도록 할 예정임, 원래는 스팸이면 Y로 넣어줘야한다. - - }else { - - mjonMsgVO.setDelayYn("N");//일단 값만 등록해준다. 이거 안해주면 NULL 값으로 들어간다. 차후에 변경하도록 할 예정임 - } - - }else {//즉시발송의 경우 현재 시간으로 입력해 준다. - - Date now = new Date(); - if(spamStatus.equals("Y") || smishingYn.equals("Y")) {//스팸 문자가 포함되었거나, 스미싱 의심 회원의 경우 문자발송 시간을 30분 딜레이 시킨다. - - 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 {//정상적인 문자인 경우 즉시발송 처리해준다. - - mjonMsgVO.setReqDate(transFormat.format(now)); - mjonMsgVO.setDelayYn(delayYn);//문자 발송 30분 지연 디폴트 값 셋팅(N) - - } - - } - - - //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 리스트 - - //Controller에서 전달 받은 분할 시간 정보 리스트 - List dividDayList = mjonMsgVO.getDividDay(); - - String frstDelayTime = mjonMsgVO.getReqDate(); - /* * 대용량 발송자의 msg_id 마지막 값 불러오기 * 신규 IDgen 값 생성해주기 - * + * * */ - /*String subUserId = ""; - if(mjonMsgVO.getUserId().length() < 5) { - int a = 5 - mjonMsgVO.getUserId().length(); - subUserId = mjonMsgVO.getUserId(); - for(int i=0; i < a; i++) { - subUserId += "0"; - } - }else { - subUserId = mjonMsgVO.getUserId().substring(0, 5).toUpperCase(); - } - mjonMsgVO.setSearchKeyword(subUserId); - System.out.println("+++++++++++ subUserId ::: "+subUserId); + /*String subUserId = ""; + if(mjonMsgVO.getUserId().length() < 5) { + int a = 5 - mjonMsgVO.getUserId().length(); + subUserId = mjonMsgVO.getUserId(); + for(int i=0; i < a; i++) { + subUserId += "0"; + } + }else { + subUserId = mjonMsgVO.getUserId().substring(0, 5).toUpperCase(); + } + mjonMsgVO.setSearchKeyword(subUserId); + System.out.println("+++++++++++ subUserId ::: "+subUserId); + + String userLastIdgen = mjonMsgDataDAO.selectMsgUserLastIdgen(mjonMsgVO); + System.out.println(userLastIdgen); + + //기존에 등록된 pk값이 없으면 초기 번호로 셋팅 + if(userLastIdgen == null || userLastIdgen.equals("null")) { + + userLastIdgen = subUserId + "_00000000000000"; + + }*/ - String userLastIdgen = mjonMsgDataDAO.selectMsgUserLastIdgen(mjonMsgVO); - System.out.println(userLastIdgen); - - //기존에 등록된 pk값이 없으면 초기 번호로 셋팅 - if(userLastIdgen == null || userLastIdgen.equals("null")) { - - userLastIdgen = subUserId + "_00000000000000"; - - }*/ - // System.out.println("+_+++++ startUserId ::: "+startUserId); - String startUserId = ""; - MjonCommon mjComm = new MjonCommon(); - //문자발송 리스트 생성 시작 - for(int i = 0; i < callToCnt; i++) { - startUserId = idgenMsgId.getNextStringId(); - //신규 pk IDgen 데이터 생성 - /*startUserId = mjComm.getCreateMsgUserIdgen(subUserId, startUserId);*/ - - Boolean blockSts = false; - for(int j = 0; j < usrBlockCnt; j++) { + String startUserId = ""; + MjonCommon mjComm = new MjonCommon(); + //문자발송 리스트 생성 시작 + for(int i = 0; i < callToCnt; i++) { + startUserId = idgenMsgId.getNextStringId(); + //신규 pk IDgen 데이터 생성 + /*startUserId = mjComm.getCreateMsgUserIdgen(subUserId, startUserId);*/ - if(phoneList[i].equals(dupliBlockList.get(j).toString())) { - - blockCnt++; //수신 차단 카운드를 해준다. - blockSts = true; - - } - - } - - if(!blockSts) { //수신거부가 아니면 추가 - - MjonMsgVO tempVO = new MjonMsgVO(); - - /** - * Agent 추가시 셋팅하기 - * - * 최초 : 아이하트(01), 현대 퓨쳐넷(02), 아이앰오(03) - * 22.10.12 : 비즈뿌리오(04) 추가 - * 23.04.10 : 제이제이(05) 추가 - * 23.05.02 : 인비토 (07) 추가 - * 23.05.09 : 회원 전용 전송사 정보가 있으면 모든 문자를 전용 전송사로 발송처리함. - * */ + Boolean blockSts = false; + for(int j = 0; j < usrBlockCnt; j++) { - 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 셋팅 끝 + if(phoneList[i].equals(dupliBlockList.get(j).toString())) { + + blockCnt++; //수신 차단 카운드를 해준다. + blockSts = true; + + } + + } + + if(!blockSts) { //수신거부가 아니면 추가 + + MjonMsgVO tempVO = new MjonMsgVO(); + + /** + * 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.setMsgId(startUserId); + + 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")) { // 단순 장문 문자 + + mjonMsgVO.setNeoType("2"); + + }else{ // 그림포함 문자인경우 + + 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("\\[\\*이름\\*\\]", ""); + } + } + + 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\\*\\]", ""); + } + } + + 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\\*\\]", ""); + } + }*/ + + tempVO.setSmsTxt(smsTxt); + + //즉시 / 예약 전송 처리 + if(mjonMsgVO.getReserveYn().equals("N")) {//즉시 전송의 경우 현재 시간을 입력 + 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(msgKind.equals("C")) { + if(split.length > 1) { + subject = split[1].trim(); + }else { + subject = split[0].substring(0,20); + } + }else { + subject = split[0].trim(); + } + + } + + } + + }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(); + + //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 HG 대량 선거 문자전송 야간 스미싱 알림 데이터 입력 오류 발생 !!!!"); + } + + }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("+++++++++++++++++++++++++++++ 문자발송 ==> insertMsgDataInfoBatch ERROR !!! : " + e); + System.out.println("========================================================================="); + return returnVO; + + } + + return returnVO; + + } + + + //대용량 문자 전송시 사용자 마지막 PK 값 조회하기 + @Override + public String selectMsgUserLastIdgen(MjonMsgVO mjonMsgVO) throws Exception{ + return mjonMsgDataDAO.selectMsgUserLastIdgen(mjonMsgVO); + } + + @Override + public List selectMsgAddrListAjax_advc(AddrVO addrVO) throws Exception { + + return mjonMsgDataDAO.selectMsgAddrListAjax_advc(addrVO); + } + + @Override + public int countByMsgAddrListAjax_advc(AddrVO addrVO) throws Exception { + + return mjonMsgDataDAO.countByMsgAddrListAjax_advc(addrVO); + } + + @Override + public List selectPayUserSumFaxList(MjonMsgVO mjonMsgVO) throws Exception { + return mjonMsgDataDAO.selectPayUserSumFaxList(mjonMsgVO); + } + + /* (non-Javadoc) + * @see itn.let.mjo.msgdata.service.MjonMsgDataService#sendMsgData_advc(itn.let.mjo.msg.service.MjonMsgVO, javax.servlet.http.HttpServletRequest) + */ + /* (non-Javadoc) + * @see itn.let.mjo.msgdata.service.MjonMsgDataService#sendMsgData_advc(itn.let.mjo.msg.service.MjonMsgVO, javax.servlet.http.HttpServletRequest) + */ + @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()); + + if(userId.equals("")) { + // Map returnMap = new HashMap<>(); +// returnMap.put("message", "로그인 후 이용이 가능합니다."); +// returnMap.put("result", "loginFail"); +// returnMap.put("resultSts", resultSts); + return new StatusResponse(HttpStatus.BAD_REQUEST, "로그인 후 이용이 가능합니다."); + } + + mjonMsgVO.setUserId(userId); + + //발신번호가 등록된 유효한 번호인지 확인 + int sendCallFromCnt = mjonMsgDAO.selectCallFromNumberChk(mjonMsgVO); + log.info("sendCallFromCnt :: [{}]", sendCallFromCnt); + if(sendCallFromCnt < 1) { + return new StatusResponse(HttpStatus.BAD_REQUEST, "등록된 발신번호를 찾을 수 없습니다."); + } + + /** + * 회원 정지된 상태이면 문자 발송이 안되도록 처리함 + * 현재 로그인 세션도 만료 처리함 + * */ + boolean mberSttus = userManageService.selectUserStatusInfo(userId); + if(!mberSttus) { + request.getSession().invalidate(); + // UNAUTHORIZED : 인증되지 않은 사용자가 접근하려고 할 때 + return new StatusResponse(HttpStatus.UNAUTHORIZED, "현재 고객님께서는 문자온 서비스 이용이 정지된 상태로 문자를 발송하실 수 없습니다. 이용정지 해제를 원하시면 고객센터로 연락주시기 바랍니다."); + + } + + /* + * 어디에 사용하는지 모르겠음 + * //회원정보에서 스미싱 회원 여부 정보 조회 + UserManageVO userManageVO = new UserManageVO(); + + userManageVO.setMberId(userId); + UserManageVO resultUserVO = userManageService.selectSmishingYnUserInfo(userManageVO); + String smishingYn = resultUserVO.getSmishingYn(); + mjonMsgVO.setSmishingYn(smishingYn); + */ + + int smsTxtByte = MsgSendUtils.getSmsTxtBytes(mjonMsgVO.getSmsTxt()); + if(smsTxtByte > 2000) { + return new StatusResponse(HttpStatus.BAD_REQUEST, "문자 내용은 2000Byte를 넘을 수 없습니다."); + } + + // MSG_TYPE 설정 + String msgType = MsgSendUtils.getMsgType(mjonMsgVO, smsTxtByte); + if ("INVALID".equals(msgType)) { + return new StatusResponse(HttpStatus.BAD_REQUEST, "문자 내용은 2000Byte를 넘을 수 없습니다."); + } + mjonMsgVO.setMsgType(msgType); + + + + //장문 메세지일 경우 + int fileCount = 0; + if(msgType.equals("6")) { + + //그림 이미지가 첨부된 경우 + if(mjonMsgVO.getImgFilePath() != null || mjonMsgVO.getImgFilePath().length > 0) { + + String[] path = mjonMsgVO.getImgFilePath(); + String[] fileId = mjonMsgVO.getImgFileId(); + String[] templateYn = mjonMsgVO.getTemplateYn(); + + 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 + , "문자 메세지 이미지 추가에 오류가 발생하여 문자 발송이 취소 되었습니다." + ); + + } + + } + + + + /* + * 화면에서 넘어오는 단가 금액 및 총 결제 캐시 금액 체크 해주기 + * 검증을 위해서 시스템 단가, 회원 협의 단가, 이벤트 단가 정보 조회 + * 조회 단가를 이용하여 총 결제 캐시 금액 계산 + * 파라미터로 넘어온 개별단가(eachPrice), 총 결제캐시(totPrice)를 비요하여 동일하지 않으면 컨트롤러에서 계산한 금액으로 입력해줌. + */ + + + MjonEventVO mjonEventVO = new MjonEventVO(); + mjonEventVO.setMberId(userId); + + //1.시스템 기본 단가 정보 불러오기 + JoinSettingVO sysJoinSetVO = mjonMsgDataService.selectJoinSettingInfo(); + + // 등급제 단가 추출 => 시스템 단가에 적용 +// sysJoinSetVO = mberGrdService.selectMberGrdDefaultInfo(sysJoinSetVO, userId); + + //2.사용자 개인 단가 정보 불러오기 + MberManageVO mberManageVO = mjonMsgDataDAO.selectMberManageInfo(userId); + + + // 3. 사용자 단가 정보 설정 + //협의 단가가 없는 경우 시스템 단가 적용해 주기 + float shortPrice = MsgSendUtils.getValidPrice(mberManageVO.getShortPrice(), sysJoinSetVO.getShortPrice()); + float longPrice = MsgSendUtils.getValidPrice(mberManageVO.getLongPrice(), sysJoinSetVO.getLongPrice()); + float picturePrice = MsgSendUtils.getValidPrice(mberManageVO.getPicturePrice(), sysJoinSetVO.getPicturePrice()); + float picture2Price = MsgSendUtils.getValidPrice(mberManageVO.getPicture2Price(), sysJoinSetVO.getPicture2Price()); + float picture3Price = MsgSendUtils.getValidPrice(mberManageVO.getPicture3Price(), sysJoinSetVO.getPicture3Price()); + + + // 기존 소수점 2째자리에서 반올림하였으나, 정책 변경으로 소수점 버림 처리함 +// boolean compareEndDate = false; + float paramEachPrice = Float.parseFloat(mjonMsgVO.getEachPrice()); + + + MjonEventVO eventMberInfo = mjonEventService.selectEventMsgMberDefaultInfo(mjonEventVO); + // 호출부에서 handleEventStatus를 호출하고 예외 처리를 추가 + if (eventMberInfo != null) { + String eventEndDate = eventMberInfo.getEventEndDate(); + boolean compareEndDate = MJUtil.getCompareDate(eventEndDate); + boolean isSuccess = handleEventStatus(eventMberInfo, paramEachPrice, mjonEventVO, compareEndDate); + + if (!isSuccess) { + // 예외가 발생했을 때의 리턴 처리 + return new StatusResponse(HttpStatus.INTERNAL_SERVER_ERROR, "이벤트 상태 처리 중 오류가 발생했습니다."); + } + // 이벤트 진행 회원의 발송 단가 처리 + if(eventMberInfo != null && "Y".equals(eventMberInfo.getEventStatus()) && compareEndDate) { + shortPrice = Float.parseFloat(eventMberInfo.getEventShortPrice()); + longPrice = Float.parseFloat(eventMberInfo.getEventLongPrice()); + picturePrice = Float.parseFloat(eventMberInfo.getEventPicturePrice()); + picture2Price = Float.parseFloat(eventMberInfo.getEventPicture2Price()); + picture3Price = Float.parseFloat(eventMberInfo.getEventPicture3Price()); + } + } + + + // 토탈금액 "," 리플레이스 처리 + 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)); + + // 수신자 총 수 * 단가를 통해 총 결제 금액 계산 + int tmpTotCallCnt = mjonMsgVO.getCallToList().length; + float tmpTotPrice = tmpTotCallCnt * tmpEachPrice; + + // 화면에서 넘어온 파라미터 개별 단가와 컨트롤러에서 계산한 단가를 비교하여 맞지 않으면 컨트롤러 계산 단가 입력 + 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); + } + + + //////////////////////////////////////////////// + // 치환 여부 + //////////////////////////////////////////////// + StatusResponse statusResponse = new StatusResponse(); + if (MsgSendUtils.isReplacementRequired(mjonMsgVO)) { + + if (!MsgSendUtils.isReplacementDataValid(mjonMsgVO)) { + return new StatusResponse(HttpStatus.BAD_REQUEST, "특정문구 일괄변환 치환문자 데이터가 없습니다."); + } + + + if (!MsgSendUtils.checkReplacementDataValidity(mjonMsgVO, statusResponse)) { + return statusResponse; + } + + + + // 치환 문자 리스트 생성 + ReplacementListsVO intiLists = MsgSendUtils.createReplacementLists(mjonMsgVO); + MsgSendUtils.populateReplacementLists(mjonMsgVO ,intiLists, statusResponse); + // 에러가 발생했는지 상태를 확인 + if (statusResponse.getStatus() == HttpStatus.BAD_REQUEST) { + // 에러 메시지 처리 + return statusResponse; + } + + + + // 발송 처리 + statusResponse = processMessageSending(mjonMsgVO, intiLists, statusResponse); + } else { + // 일반 문자 발송 + statusResponse = fncSendMsg(mjonMsgVO); + } + + return statusResponse; + + } + + + // 그림 문자 발송 처리 메서드 + private StatusResponse processMessageSending(MjonMsgVO mjonMsgVO, ReplacementListsVO lists, StatusResponse statusResponse) { + + 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); + } + + if(!resultMap.isEmpty()) { + + String returnMessage = ""; + String returnStatus = ""; + String resultBlockSts = "0"; + 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.setObject(resultMap); +// modelAndView.addObject("message", returnMessage); +// modelAndView.addObject("result", returnStatus); +// modelAndView.addObject("resultSts", "0"); +// modelAndView.addObject("resultBlockSts", "0"); - //tempVO.setMsgId(idgenMsgId.getNextStringId()); - - tempVO.setMsgId(startUserId); - - 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")) { // 단순 장문 문자 - - mjonMsgVO.setNeoType("2"); - - }else{ // 그림포함 문자인경우 - - mjonMsgVO.setNeoType("4"); - - } - - } - - //문자내용 내용 - 치환 처리 - String smsTxt = mjonMsgVO.getSmsTxt(); //발송 문자 내용 + return statusResponse; + } + + } + + Map returnMap = new HashMap(); + returnMap.put("msgType", mjonMsgVO.getMsgType()); + returnMap.put("msgGroupId", mjonMsgVO.getMsgGroupId()); +// returnMap.put("message", returnMessage); +// returnMap.put("result", returnStatus); +// returnMap.put("resultSts", resultSts); +// returnMap.put("resultBlockSts", resultBlockSts); + + + statusResponse.setObject(returnMap); + + return statusResponse; + } + + + + // 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, - //일괄변환문자 리스트에서 콤마(,)를 특수문자(§)로 변환해서 넘겨받기 때문에 치환 처리를 해준도록 한다. - 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 (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\\*\\]", ""); - } - } - - 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\\*\\]", ""); - } - }*/ - - tempVO.setSmsTxt(smsTxt); - - //즉시 / 예약 전송 처리 - if(mjonMsgVO.getReserveYn().equals("N")) {//즉시 전송의 경우 현재 시간을 입력 - 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 { // 예약 발송의 경우 예약 시간을 입력 + //문자 발송 처리 + //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++; + + } - //스팸문구 혹은 스미싱 의심 회원의 경우 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(); - } + + } + + 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"); - 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(msgKind.equals("C")) { - if(split.length > 1) { - subject = split[1].trim(); - }else { - subject = split[0].substring(0,20); - } - }else { - subject = split[0].trim(); - } + 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) { - } - - } - - }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++; - + log.error(e.getMessage(), e); + System.out.println("========================================================================="); + System.out.println("+++++++++++++++++++++++++++++ 기타 시스템 오류 : " + e.getMessage()); + System.out.println("========================================================================="); + returnMap.put("result", "fail"); + returnMap.put("message", "기타 시스템 오류 : " + e.getMessage()); + } + return returnMap; + } + + // 단문 문자 발송 처리 메서드 + private Map sendShortMessages(MjonMsgVO shortMsgVO, ReplacementListsVO lists, StatusResponse statusResponse) { + + log.info(" :: sendShortMessages :: "); + + shortMsgVO.setNameList(lists.getShortNameList()); + shortMsgVO.setCallToList(lists.getShortPhone()); + shortMsgVO.setRep1List(lists.getShortRep1()); + shortMsgVO.setRep2List(lists.getShortRep2()); + shortMsgVO.setRep3List(lists.getShortRep3()); + shortMsgVO.setRep4List(lists.getShortRep4()); + + //개별단가 계산하기 + String eachPrice = shortMsgVO.getpPrice(); + + //api 서버에서 sPrice 값이 없는 경우가 있어서 오류 방지를위해서 추가 + if(eachPrice == null) { + eachPrice = shortMsgVO.getEachPrice(); + } + + /** + * 그림문자에 치환 내용이 포함되어 있는 경우 단가 계산하기. + * 그림문자의 경우 이로직을 타지 않지만 혹시 몰라서 추가해놓음 + * + * */ + + // TODO : 기존 로직이라 리펙토링 예정 20240927 이호영 + int fileCount = Integer.parseInt(shortMsgVO.getFileCnt()); + if(fileCount > 2) {//그림 이미지가 3개 + + eachPrice = shortMsgVO.getP3Price(); + + }else if(fileCount > 1) {//그림 이미지가 2개 + + eachPrice = shortMsgVO.getP2Price(); + + }else if(fileCount == 1) {//그림 이미지가 1개 + eachPrice = shortMsgVO.getpPrice(); + + } + + shortMsgVO.setEachPrice(eachPrice); + + //문자 종류 선택 + if(fileCount > 0) {//그림문자인 경우 문자타임 지정 + shortMsgVO.setMsgType("6"); + }else { + shortMsgVO.setMsgType("4"); + } + + //총금액 계산하기 + Float sTotPrice = Float.parseFloat(shortMsgVO.getEachPrice()) * lists.getShortCnt(); + shortMsgVO.setTotPrice(sTotPrice.toString()); + + //단문문자 발송 처리 + Map returnShortMap = fncSendMsgRtnMap(shortMsgVO); + return returnShortMap; + } + + // 장문 문자 발송 처리 메서드 + private Map sendLongMessages(MjonMsgVO longMsgVO, ReplacementListsVO lists, StatusResponse statusResponse) { + //장문문자 전송 이름, 전화번호, 변환문자 입력해주기 - /* - * 각 처리 건별로 캐시 차감 및 그룹 데이터 정보 업데이트 - * 1. 디비에 입력한 건수만큼 캐시 차감 및 회원 캐시 정보 업데이트 - * 2. 그룹데이터에 처리 건수 업데이트(총 발송건수 합산 정보 업데이트) - * + longMsgVO.setNameList(lists.getLongNameList()); + longMsgVO.setCallToList(lists.getLongPhone()); + longMsgVO.setRep1List(lists.getLongRep1()); + longMsgVO.setRep2List(lists.getLongRep2()); + longMsgVO.setRep3List(lists.getLongRep3()); + longMsgVO.setRep4List(lists.getLongRep4()); + + /** + * 그림문자에 치환 내용이 포함되어 있는 경우 단가 계산하기. + * 그림문자의 경우 이로직을 타지 않지만 혹시 몰라서 추가해놓음 * */ - //문자 발송 캐시 차감 해주기 - MjonPayVO mjonPayVO = new MjonPayVO(); + String eachPrice = longMsgVO.getmPrice(); - //1건 이상 발송이 있는 경우만 캐쉬를 차감 시킨다. - if(resultCnt > 0) { + //api 서버에서 mPrice 값이 없는 경우가 있어서 오류 방지를위해서 추가 + if(eachPrice == null) { - int totSendCnt = mjonMsgVO.getTotalCallCnt(); - Float eachPrice = Float.parseFloat(mjonMsgVO.getEachPrice()); - Float totPrice = eachPrice * resultCnt; - String strTotPrice = String.format("%.1f", totPrice); + eachPrice = longMsgVO.getEachPrice(); - 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()); + } + + /** + * 그림문자에 치환 내용이 포함되어 있는 경우 단가 계산하기. + * 그림문자의 경우 이로직을 타지 않지만 혹시 몰라서 추가해놓음 + * 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(); - mjonPayService.insertCash(mjonPayVO); //캐시차감 - mjonPayService.updateMemberCash(mjonPayVO); //회원정보 업데이트 } - //문자 발송 테이블에 입력 데이터가 있는 경우 그룹 테이블에도 입력 해 준다. - if(resultCnt > 0) { + 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) { - // 문자 전송 그룹 테이블에 정보 입력 - int groupCnt = resultCnt; - mjonMsgVO.setMsgGroupCnt(Integer.toString(groupCnt)); - //mjonMsgService.insertGroupMsgData(mjonMsgVO); - int msgGroupDataCnt = mjonMsgDAO.selectMsgGroupDataCntByGroupId(mjonMsgVO); + 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; + } - //메세지 그룹 데이터가 없으면 추가 해주고 있으면 총메세지 건수를 합산해준다. - 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); + // 20240924 이호영 + // 이벤트 상태를 처리하는 메서드 + // 개선중에 service 처리부분으로 일단 utils화 보류 + private boolean handleEventStatus(MjonEventVO eventMberInfo, float paramEachPrice, MjonEventVO mjonEventVO,boolean compareEndDate){ + try { + String eventEndDate = eventMberInfo.getEventEndDate(); + if (eventEndDate != null) { + float eventRemainCash = (float) eventMberInfo.getEventRemainCash(); + + if (!compareEndDate || eventRemainCash < paramEachPrice) { + if (!"E".equals(eventMberInfo.getEventStatus())) { + // 이벤트 상태를 종료로 변경 + mjonEventVO.setEventInfoId(eventMberInfo.getEventInfoId()); + mjonEventVO.setEventStatus("E"); + mjonEventVO.setEventMemo("발송 최소 금액(" + paramEachPrice + ") 부족 혹은 이벤트 종료일 초과로 종료"); + mjonEventVO.setEventRemainCash(eventRemainCash); + mjonEventService.updateEventEndStatus(mjonEventVO); + eventMberInfo.setEventStatus("E"); + } + } + } + return true; // 성공 시 true 리턴 + } catch (Exception e) { + // 예외 발생 시 로그를 남기고 false 리턴 + e.printStackTrace(); + return false; + } + } + + + + + + + + + /** + * 문자발송시 치환문자가 없거나 그림문자일 경우 타는 로직 + * param : MjonMsgVO + * return : ModelAndView + * @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; //수신거부 등록번호로 발송을 안한 건수 + +// 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"); } - } catch (Exception e) { - System.out.println("++++++++++++++++++++++++++++++ spamSmishingPassStatus HG 대량 선거 문자전송 야간 스미싱 알림 데이터 입력 오류 발생 !!!!"); + 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, "입력 문자 내용을 확인할 수 없습니다. 문자 내용을 입력해 주세요."); + + } + + }else { //최대 문자길이 초과시 + +// modelAndView.addObject("message", "문자 치환 후 전송 문자 길이를 초과하였습니다."); +// modelAndView.addObject("result", "fail"); +// modelAndView.addObject("resultSts", "0"); +// modelAndView.addObject("resultBlockSts", "0"); + + return new StatusResponse(HttpStatus.BAD_REQUEST, "문자 치환 후 전송 문자 길이를 초과하였습니다."); } - - }else { - mjonMsgDAO.updateMsgGroupDataForTotCntSum(mjonMsgVO); } - //이벤트 회원 남은 캐시 업데이트 - fnUpdateEventRemainCash(mjonPayVO); - } + //현재 고객의 보유 캐시가 문자 발송이 가능한 금액인지 체크 + 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()); + +// } + + Map returnMap = new HashMap(); - // 성공 - 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("+++++++++++++++++++++++++++++ 문자발송 ==> insertMsgDataInfoBatch ERROR !!! : " + e); - System.out.println("========================================================================="); - return returnVO; - - } +// returnMap.put("msgType", mjonMsgVO.getMsgType()); +// returnMap.put("msgGroupId", mjonMsgVO.getMsgGroupId()); + returnMap.put("resultSts", resultSts); + returnMap.put("resultBlockSts", resultBlockSts); + - return returnVO; + return new StatusResponse(HttpStatus.OK, "문자 전송이 완료되었습니다.", returnMap); } - - //대용량 문자 전송시 사용자 마지막 PK 값 조회하기 - @Override - public String selectMsgUserLastIdgen(MjonMsgVO mjonMsgVO) throws Exception{ - return mjonMsgDataDAO.selectMsgUserLastIdgen(mjonMsgVO); - } - @Override - public List selectMsgAddrListAjax_advc(AddrVO addrVO) throws Exception { - - return mjonMsgDataDAO.selectMsgAddrListAjax_advc(addrVO); - } - - @Override - public int countByMsgAddrListAjax_advc(AddrVO addrVO) throws Exception { - - return mjonMsgDataDAO.countByMsgAddrListAjax_advc(addrVO); - } - - @Override - public List selectPayUserSumFaxList(MjonMsgVO mjonMsgVO) throws Exception { - return mjonMsgDataDAO.selectPayUserSumFaxList(mjonMsgVO); - } + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + } diff --git a/src/main/java/itn/let/mjo/msgdata/web/MjonMsgDataController.java b/src/main/java/itn/let/mjo/msgdata/web/MjonMsgDataController.java index 152f04b5..3db8e841 100644 --- a/src/main/java/itn/let/mjo/msgdata/web/MjonMsgDataController.java +++ b/src/main/java/itn/let/mjo/msgdata/web/MjonMsgDataController.java @@ -1795,7 +1795,7 @@ public class MjonMsgDataController { * @return * @throws Exception */ - @RequestMapping(value= {"/web/mjon/msgdata/selectMsgAddrListAjax_advc.do"}) + @RequestMapping(value= {"/web/mjon/msgdata/selectMsgAddrListAjaxQ.do"}) public ResponseEntity selectMsgAddrListAjax_advc(@ModelAttribute("searchVO") AddrVO addrVO) { Map response = new HashMap<>(); @@ -2197,7 +2197,7 @@ public class MjonMsgDataController { * 현재 로그인 세션도 만료 처리함 * */ boolean mberSttus = userManageService.selectUserStatusInfo(userId); - + if(!mberSttus) { modelAndView.addObject("message", "현재 고객님께서는 문자온 서비스 이용이 정지된 상태로 문자를 발송하실 수 없습니다. 이용정지 해제를 원하시면 고객센터로 연락주시기 바랍니다."); @@ -2247,14 +2247,10 @@ public class MjonMsgDataController { //메세지 타입이 단문이면 진짜 단문인지 한번더 확인해 준다. if(msgType.equals("4")) { - //메세지 길이가 90Byte를초과 하거나, 그림 이미지가 있는경우 메세지 타입을 6으로 변경해준다. if(FrBytes > 90 || mjonMsgVO.getImgFilePath().length > 0) { - msgType = "6"; - } - } mjonMsgVO.setMsgType(msgType); @@ -3155,6 +3151,25 @@ public class MjonMsgDataController { return modelAndView; } + + /** + * 문자 발송 기능 + * @param searchVO + * @param model + * @return "/web/mjon/msgdata/sendMsgDataAjax.do" + * @throws Exception + */ + @RequestMapping(value= {"/web/mjon/msgdata/sendMsgDataAjax_advc.do"}) + public ResponseEntity sendMsgData_advc(@ModelAttribute("searchVO") MjonMsgVO mjonMsgVO, + RedirectAttributes redirectAttributes, + HttpServletRequest request, + ModelMap model) throws Exception{ + + return ResponseEntity.ok().body(mjonMsgDataService.sendMsgData_advc(mjonMsgVO, request)) ; + + } + + /** * 관리자로 문자 발송해주기 * 사용자가 보낸 문자를 문자온 법인폰으로 발송해주는 기능 함수. 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 60890860..81358dde 100644 --- a/src/main/webapp/WEB-INF/jsp/web/msgdata/MsgDataSMLView.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/msgdata/MsgDataSMLView.jsp @@ -250,6 +250,7 @@ var excelAddr = []; //엑셀 불러오기에서 내용 저장하는 배열 변 //전체 데이터 갯수 구하는 함수 function updateTotCnt(data){ + console.log(' :: updateTotCnt :: '); var rowTotCnt = data; $("#rowTotCnt").text(numberWithCommas(rowTotCnt)); @@ -746,8 +747,8 @@ $(document).ready(function (){ //문자 내용 입력시 바이트수 계산하기 $('#smsTxtArea').keyup(function(e){ - console.log("11$('.preview_auto').test() :: ",$('.realtime').html()) - console.log("11$('.preview_auto').test() :: ",$('.realtime').text()) +// console.log("11$('.preview_auto').test() :: ",$('.realtime').html()) +// console.log("11$('.preview_auto').test() :: ",$('.realtime').text()) var contents = $(this).val(); var adrYn = $("input[name=send_adYn]:checked").val(); @@ -2200,7 +2201,7 @@ function fnByteString(contents){ } //수신목록 전체 데이터 갯수 구하기 - updateTotCnt(totRows); +// updateTotCnt(totRows); //일괄변환 문구 결제금액 처리 if(contents.indexOf("[*이름*]") > -1 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 240938f3..fbbcdf6e 100644 --- a/src/main/webapp/WEB-INF/jsp/web/msgdata/MsgDataView.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/msgdata/MsgDataView.jsp @@ -1050,20 +1050,25 @@ function fn_sendMsgData(){ alert("현재 문자 발송하기 기능 점검 중입니다.\n\n1분 후 다시 시도해주세요."); return false; } - - var testString = document.msgForm.smsTxtArea.value; var form = document.msgForm; - - //회원 보유 잔액 비교 var totPriceOnly = stringReplaceAll(form.totPrice.value, ",", ""); var userMoneyOnly = stringReplaceAll(form.myPrice.value, ",", ""); + if(parseFloat(userMoneyOnly) < parseFloat(totPriceOnly)){ alert("문자 발송에 필요한 회원님의 보유 잔액이 부족 합니다."); return false; } - + var loginVO = '${LoginVO}'; + if (!loginVO) { + alert("문자발송 서비스는 로그인 후 이용 가능합니다."); + return false; + } + + // 폼 유효성 검사 + if (!validateForm(form)) return false; + var adverYn = $("input[name='send_adYn']:checked").val(); var spamStatus = false; var exceptSpamYn = $("#exceptSpamYn").val(); //금지어 필터링 예외 여부 - N 일 경우만 스팸 검사를 진행 @@ -1104,69 +1109,6 @@ function fn_sendMsgData(){ // return false; //} - if(form.callFromList.value == ""){ - - alert("발신번호를 입력해 주세요."); - return false; - - } - - var titleStatus = form.title_status.value; - if(titleStatus == 'N'){//장문 제목 사용안함으로 선택시 제목에 있는 데이터 지워주기 - - form.mmsSubject.value = ""; - - }else{//장문 제목에 치환문자 포함된 경우 입력 못하도록 처리. - - var mmsSubject = form.mmsSubject.value; - if(getSpacialStringChk(mmsSubject)){ - alert("문자 제목에는 치환문자(엑셀 내 *이름*, *1*, *2*, *3*, *4* 등)를 사용하실 수 없습니다."); - return false; - } - - } - - //문자내용 첫글자에 특수기호 포함 여부 체크 - var strCont = form.smsTxtArea.value; - var rtnStr = strChinJpnCheck(strCont); - - //문자제목에 이모지가 있는지 체크 - var titleStatusYn = $("input[name='title_status']:checked").val(); - if(titleStatusYn == 'Y') { - if(!emojiCheck(form.mmsSubject.value)) return false; - } - - //문자내용에 이모지가 있는지 체크 - if(!emojiCheck(strCont)) return false; - - if(rtnStr.length > 0){ - - alert("입력하신 문구 중 \" " + rtnStr + " \" 는 일부 휴대폰에서 표기되지 않을 수 있습니다."); - - } - - /* var strCont = form.smsTxtArea.value; - var repStr = strFirstCharCheck(strCont); - - if(repStr.length > 0){ - - alert("문자 내용 첫 글자는 특수기호가 들어갈 수 없습니다."); - $('#smsTxtArea').val(strCont.replace(repStr, "")); - fnByteString(strCont.replace(repStr, "")); - return false; - - } */ - - if(imgFilePath.length == 0){ // 그림문자일 경우 내용이 없어도 됨 , 장문 문자일 경우만 문자내용 체크함 - - if(form.smsTxtArea.value == ""){ - - alert("문자 내용을 입력해 주세요."); - return false; - - } - - } //광고 문자 내용 합쳐주기 @@ -1312,7 +1254,8 @@ function fn_sendMsgData(){ } - + + console.log(' : 전송하시겠습니까 : ') if(confirm("문자를 전송하시겠습니까?")){ imgFilePath = []; $('.thumb_wrap').find('.thumb_img').each(function(idx, el) { @@ -1390,7 +1333,7 @@ function fn_sendMsgData(){ //문자내용이 입력된 경우 스팸 필터링 실행 if(!form.smsTxtArea.value == "" && exceptSpamYn == "N"){ - + console.log(' : selectSpamTxtChkAjax : ') var spmData = new FormData(form); url = "/web/mjon/msgdata/selectSpamTxtChkAjax.do"; @@ -1452,6 +1395,7 @@ function fn_sendMsgData(){ } var eventRemainCash = parseFloat(form.eventRemainCash.value); + console.log('eventStatus : ', eventStatus); if(eventStatus == 'Y'){ @@ -1629,8 +1573,9 @@ function fn_sendMsgData(){ var form = document.msgForm; var data = new FormData(form); - url = "/web/mjon/msgdata/sendMsgDataAjax.do"; - +// url = "/web/mjon/msgdata/sendMsgDataAjax.do"; + url = "/web/mjon/msgdata/sendMsgDataAjax_advc.do"; + console.log('url :: ', url); $.ajax({ type: "POST", url: url, @@ -1641,6 +1586,7 @@ function fn_sendMsgData(){ contentType: false, cache: false, success: function (returnData, status) { + console.log('returnData : ', returnData); if(status == 'success'){ // status 확인 필요한가. 석세스 안뜨면 에러 가지 않나 if("fail" == returnData.result){ @@ -1794,7 +1740,7 @@ function fn_sendMsgData(){ form.eventStatus.value = 'N'; form.eventYn.value = 'N'; - sendMsgAjax(0,0); + sendMsgAjax_advc(0,0); }else{ @@ -1815,14 +1761,14 @@ function fn_sendMsgData(){ }else{ //발송 Ajax 호출해주기 - sendMsgAjax(0,0); + sendMsgAjax_advc(0,0); } }else{ //발송 Ajax 호출해주기 - sendMsgAjax(0,0); + sendMsgAjax_advc(0,0); } @@ -1831,6 +1777,46 @@ function fn_sendMsgData(){ } + +//폼 유효성 검사 함수 +function validateForm(form) { + + if(form.callFromList.value == ""){ + + alert("발신번호를 입력해 주세요."); + return false; + + } + + if (form.title_status.value === 'N') { + form.mmsSubject.value = ""; + } else if (getSpacialStringChk(form.mmsSubject.value)) { + alert("문자 제목에는 치환문자(엑셀 내 *이름*, *1*, *2*, *3*, *4* 등)를 사용하실 수 없습니다."); + return false; + } + + //문자제목에 이모지가 있는지 체크 + var titleStatusYn = $("input[name='title_status']:checked").val(); + if(titleStatusYn == 'Y') { + if(!emojiCheck(form.mmsSubject.value)) return false; + } + + // 문자내용에 이모지가 있는지 체크 + var strCont = form.smsTxtArea.value; + if (!emojiCheck(strCont)) return false; + + var rtnStr = strChinJpnCheck(strCont); + if(rtnStr.length > 0){ + alert("입력하신 문구 중 \" " + rtnStr + " \" 는 일부 휴대폰에서 표기되지 않을 수 있습니다."); + } + + if (imgFilePath.length === 0 && !form.smsTxtArea.value) { + alert("문자 내용을 입력해 주세요."); + return false; + } + return true; +} + //이벤트가 아닌 일반 개별 단가 셋팅해주기 function getNorEachPrice(evnMsgType){ @@ -1873,13 +1859,103 @@ function getNorEachPrice(evnMsgType){ } -function sendMsgAjax(paramSmsCnt, paramBlockCnt){ - +function sendMsgAjax_advc(paramSmsCnt, paramBlockCnt){ + console.log('sendMsgAjax : '); var form = document.msgForm; var reserYn = $("#reserveYn").val(); var data = new FormData(form); - url = "/web/mjon/msgdata/sendMsgDataAjax.do"; +// url = "/web/mjon/msgdata/sendMsgDataAjax.do"; + url = "/web/mjon/msgdata/sendMsgDataAjax_advc.do"; + + $.ajax({ + type: "POST", + url: url, + data: data, + dataType:'json', + async: true, + processData: false, + contentType: false, + cache: false, + success: function (data) { + console.log('data : ', data); + /* message:"특정문구 일괄변환 치환문자 데이터가 없습니다." + status:"BAD_REQUEST" */ + + var status = data.status; +// if(status == 'success'){ // status 확인 필요한가. 석세스 안뜨면 에러 가지 않나 + if("OK" == status){ + + var smsCnt = Number(data.object.resultSts); + var blockCnt = Number(data.object.resultBlockSts); + + smsCnt = Number(smsCnt) + Number(paramSmsCnt); + blockCnt = Number(blockCnt) + Number(paramBlockCnt); + + if((smsCnt + blockCnt) == 0){ + + $('.pop_msg_spam').css({'display':'block','opacity':'1','left':'50%','top':'50%','transform':'translate(-50%,-50%)'}); + $('.pop_msg_spam .msg_text').html("문자 발송(예약)에 실패하였습니다.
다시 시도해주세요.
* 정상적으로 발송 시도하였으나 실패하신 경우 혹시 문자내용에 사용불가 이모지
또는 복사-붙여넣기로 인한 보이지 않는 특수문자가 포함되었는지 확인 후 다시 시도해주세요."); + $('.mask').addClass('on'); + + }else{ + + $('.pop_msg_success').css({'display':'block','opacity':'1','left':'50%','top':'50%','transform':'translate(-50%,-50%)'}); + //예약발송 건의 경우 결과 팝업 문구 변경 + if(reserYn == 'Y'){ + $('.pop_msg_success .msg_text').html("예약 성공 : "+ smsCnt + "건,수신거부 : " + blockCnt + "건의
문자가 예약 되었습니다."); + }else{ + $('.pop_msg_success .msg_text').html("발송 성공 : "+ smsCnt + "건,수신거부 : " + blockCnt + "건의
문자가 발송 되었습니다."); + } + + $('.mask').addClass('on'); + + } + + + }else if("BAD_REQUEST" == status){ + + alert(data.message); + return false; + + }else if("UNAUTHORIZED" == status){ + + alert(data.message); + //문자발송 URL Move + goMsgUrlMove(); + return false; + + }else if("NO_CONTENT" == status){ + + $('.pop_msg_fails').css({'display':'block','opacity':'1','left':'50%','top':'50%','transform':'translate(-50%,-50%)'}); + $('.pop_msg_fails .msg_text').html(returnData.message); + $('.mask').addClass('on'); + + } + +// } else if(status== 'fail'){ +// alert(returnData.message); +// } + }, + beforeSend : function(xmlHttpRequest) { + //로딩창 show + $('.loading_layer').addClass('active'); + }, + complete : function(xhr, textStatus) { + //로딩창 hide + $('.loading_layer').removeClass('active'); + }, + error: function (e) { alert("문자 발송에 실패하였습니다."); console.log("ERROR : ", e); } + }); + +} + +function sendMsgAjax(paramSmsCnt, paramBlockCnt){ + var form = document.msgForm; + var reserYn = $("#reserveYn").val(); + + var data = new FormData(form); + url = "/web/mjon/msgdata/sendMsgDataAjax.do"; $.ajax({ type: "POST", diff --git a/src/main/webapp/WEB-INF/jsp/web/msgdata/excel/MsgExcelDataView.jsp b/src/main/webapp/WEB-INF/jsp/web/msgdata/excel/MsgExcelDataView.jsp index a765ade7..51f8a204 100644 --- a/src/main/webapp/WEB-INF/jsp/web/msgdata/excel/MsgExcelDataView.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/msgdata/excel/MsgExcelDataView.jsp @@ -1082,7 +1082,10 @@ function fn_sendMsgData(){ var form = document.msgForm; var data = new FormData(form); - url = "/web/mjon/msgdata/sendMsgDataAjax.do"; +// url = "/web/mjon/msgdata/sendMsgDataAjax.do"; + url = "/web/mjon/msgdata/sendMsgDataAjax_advc.do"; + + console.log('url : ', url); $.ajax({ type: "POST", @@ -1094,6 +1097,8 @@ function fn_sendMsgData(){ contentType: false, cache: false, success: function (returnData, status) { + console.log('returnData : ', returnData); + console.log('status : ', status); if(status == 'success'){ // status 확인 필요한가. 석세스 안뜨면 에러 가지 않나 if("fail" == returnData.result){ diff --git a/src/main/webapp/WEB-INF/jsp/web/msgdata/include/msgDataIncludeExcel.jsp b/src/main/webapp/WEB-INF/jsp/web/msgdata/include/msgDataIncludeExcel.jsp index 06e837f6..90b2ed62 100644 --- a/src/main/webapp/WEB-INF/jsp/web/msgdata/include/msgDataIncludeExcel.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/msgdata/include/msgDataIncludeExcel.jsp @@ -1,938 +1,940 @@ -<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> -<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> -<%@ taglib prefix="ui" uri="http://egovframework.gov/ctl/ui"%> -<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> -<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> - - - - - - -
- -
- - - -
- -
- - - -
- - - - - - - - - -
-
-

- 주소록은 한 번에 최대 30만건까지 등록(EXCEL파일, 최대용량 20MB) 가능합니다.

-

- 엑셀 파일에 비밀번호 설정, 제한된 보기, 수식 등이 설정되어 있는 경우 업로드가 불가합니다.

-

- 구분선(|), 역슬래시(\, ₩), 큰따옴표(") 등 발송불가 특수문자는 저장되지 않습니다.

-

- 이름 200byte, [*1*]~[*4*] 200byte, 메모 250byte까지 입력 가능합니다.

-

- 주소록 등록이 어려우신 경우에는 주소록 입력대행 메뉴를 이용하실 수 있습니다.

-
-
- -
-
- - -
- - - - - - - - - - - - -
엑셀입력 표
-
-
-

파일 붙여넣기마우스로 엑셀, TXT파일을 여기에 끌어다 놓으세요

-
- - -
-
-
- - -
-

- 총 0건 - / 중복 0건 - / 오류 0건 - -

- - - - -

- -
- - - - -
- - -
-
-
- - -
-
- - -
-
- - -
-
- - -
-
- - -
-
- - -
- -
-
- -
- -
-
-
-
- - -
- -
-
- - - - - - - - - - - - - +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="ui" uri="http://egovframework.gov/ctl/ui"%> +<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> + + + + + + +
+ +
+ + + +
+ +
+ + + +
+ + + + + + + + + +
+
+

- 주소록은 한 번에 최대 30만건까지 등록(EXCEL파일, 최대용량 20MB) 가능합니다.

+

- 엑셀 파일에 비밀번호 설정, 제한된 보기, 수식 등이 설정되어 있는 경우 업로드가 불가합니다.

+

- 구분선(|), 역슬래시(\, ₩), 큰따옴표(") 등 발송불가 특수문자는 저장되지 않습니다.

+

- 이름 200byte, [*1*]~[*4*] 200byte, 메모 250byte까지 입력 가능합니다.

+

- 주소록 등록이 어려우신 경우에는 주소록 입력대행 메뉴를 이용하실 수 있습니다.

+
+
+ +
+
+ + +
+ + + + + + + + + + + + +
엑셀입력 표
+
+
+

파일 붙여넣기마우스로 엑셀, TXT파일을 여기에 끌어다 놓으세요

+
+ + +
+
+
+ + +
+

+ 총 0건 + / 중복 0건 + / 오류 0건 + +

+ + + + +

+ +
+ + + + +
+ + +
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+ +
+
+ +
+ +
+
+
+
+ + +
+ +
+
+ + + + + + + + + + + + +
\ No newline at end of file