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 java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.Objects;
import java.util.stream.Stream;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import itn.let.mail.service.StatusResponse;
import itn.let.mjo.msg.service.MjonMsgVO;
import itn.let.mjo.msgdata.service.ReplacementListsVO;
import itn.let.module.base.PriceAndPoint;
import lombok.extern.slf4j.Slf4j;
/**
*
* @author : 이호영
* @fileName : MsgSendUtils.java
* @date : 2024.09.23
* @description : 메세지발송 데이터 다루는 유틸
* ===========================================================
* DATE AUTHOR NOTE
* ----------------------------------------------------------- *
* 2024.09.23 이호영 최초 생성
*
*
*
*/
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 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 Boolean populateReplacementLists(MjonMsgVO mjonMsgVO, ReplacementListsVO lists, StatusResponse statusResponse){
String[] nameList = mjonMsgVO.getNameList();
String[] phone = mjonMsgVO.getCallToList();
String[] rep1 = mjonMsgVO.getRep1List();
String[] rep2 = mjonMsgVO.getRep2List();
String[] rep3 = mjonMsgVO.getRep3List();
String[] rep4 = mjonMsgVO.getRep4List();
String smsTxt = mjonMsgVO.getSmsTxt();
int fileCount = Integer.parseInt(mjonMsgVO.getFileCnt());
// 이름 치환
int shortCnt = 0;
int longCnt = 0;
int imgCnt = 0;
for (int i = 0; i < phone.length; i++) {
smsTxt = smsTxt.replaceAll(String.valueOf((char) 13), "");
// 이름 및 치환 문자 처리
smsTxt = replacePlaceholder(smsTxt, "[*이름*]", nameList, i);
smsTxt = replacePlaceholder(smsTxt, "[*1*]", rep1, i);
smsTxt = replacePlaceholder(smsTxt, "[*2*]", rep2, i);
smsTxt = replacePlaceholder(smsTxt, "[*3*]", rep3, i);
smsTxt = replacePlaceholder(smsTxt, "[*4*]", rep4, i);
try {
int bytes = getSmsTxtBytes(smsTxt);
if(bytes < 2000) {
if(fileCount > 0) {
populateImgLists(lists, nameList, phone, rep1, rep2, rep3, rep4, smsTxt, i);
imgCnt++;
}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, "문자 치환 후 전송 문자 길이를 초과하였습니다.");
return false;
}
} catch (UnsupportedEncodingException e) {
statusResponseSet(statusResponse, HttpStatus.BAD_REQUEST, "문자 치환 중 오류가 발생하였습니다.");
e.printStackTrace();
return false;
}
}
lists.setShortCnt(shortCnt);
lists.setLongCnt(longCnt);
lists.setImgCnt(imgCnt);
return true;
}
/**
* 특정 플레이스홀더를 리스트에서 가져온 값으로 치환합니다.
*
* @param smsTxt 문자 내용
* @param placeholder 치환할 플레이스홀더 (예: [*이름*])
* @param list 치환할 데이터 리스트
* @param index 현재 인덱스
* @return 치환된 문자 내용
*/
private static String replacePlaceholder(String smsTxt, String placeholder, String[] list, int index) {
if (smsTxt.contains(placeholder)) {
if (list.length > index && StringUtil.isNotEmpty(list[index])) {
smsTxt = smsTxt.replaceAll(placeholder, StringUtil.getString(list[index].replaceAll("§", ",")));
} else {
smsTxt = smsTxt.replaceAll(placeholder, "");
}
}
return smsTxt;
}
private static void populateShortLists(ReplacementListsVO lists, String[] nameList, String[] phone, String[] rep1,
String[] rep2, String[] rep3, String[] rep4, String smsTxt, int i) {
// 이름 치환
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 " ";
}
}
private static void statusResponseSet (StatusResponse statusResponse, HttpStatus httpStatus, String msg ) {
statusResponse.setStatus(httpStatus);
statusResponse.setMessage(msg);
}
public static StatusResponse validateFilesForMessageSending(int fileCount, MjonMsgVO mjonMsgVO) {
if (fileCount > 0) {
boolean allFilesAreNull = Stream
.of(mjonMsgVO.getFileName1(), mjonMsgVO.getFileName2(), mjonMsgVO.getFileName3())
.allMatch(Objects::isNull);
if (allFilesAreNull) {
return new StatusResponse(HttpStatus.NO_CONTENT, "문자 메세지 이미지 추가에 오류가 발생하여 문자 발송이 취소 되었습니다.");
}
}
return null; // 유효성 검사를 통과한 경우
}
/**
* @methodName : validateReplacementData
* @author : 이호영
* @date : 2024.09.25
* @description : 치환문자가 사용될 때 데이터가 올바른지 확인하는 메서드
* @param mjonMsgVO
* @param statusResponse
* @return boolean
*/
public static boolean validateReplacementData(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();
// 치환 문자 리스트가 모두 비어있는지 확인
if (isEmpty(nameList)
&& isEmpty(rep1)
&& isEmpty(rep2)
&& isEmpty(rep3)
&& isEmpty(rep4)) {
statusResponseSet(statusResponse, HttpStatus.BAD_REQUEST, "특정문구 일괄변환 치환문자 데이터가 없습니다.");
return false;
}
// 치환 문자 필드 개수와 전화번호 개수가 일치하는지 확인
boolean isRepCountOk = true;
if (mjonMsgVO.getSmsTxt().contains("[*이름*]") && nameList.length != phone.length) {
isRepCountOk = false;
}
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;
}
// 필드 개수가 일치하지 않는 경우 에러 메시지 반환
if (!isRepCountOk) {
statusResponseSet(statusResponse, HttpStatus.BAD_REQUEST, "특정문구 일괄변환 치환문자 데이터가 일치하지 않습니다.");
return false;
}
return true; // 모든 유효성 검사를 통과한 경우
}
// 배열이 비어있는지 확인하는 메서드
public static boolean isEmpty(String[] array) {
return array == null || array.length == 0;
}
}