File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
2024-08-23
2023-10-11
File name
Commit message
Commit date
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);
}
}