Merge branch '5102_친구톡_발송속도_개선'

This commit is contained in:
hehihoho3@gmail.com 2025-08-22 15:47:42 +09:00
commit 74cf3443fd
9 changed files with 320 additions and 68 deletions

1
.claude/.gitignore vendored Normal file
View File

@ -0,0 +1 @@
/settings.local.json

View File

@ -229,8 +229,8 @@ public final class MsgSendUtils {
placeholders.put("[*4*]", MjonMsgSendVO::getRep4); placeholders.put("[*4*]", MjonMsgSendVO::getRep4);
boolean hasPerformedSpamCheck = false; // 치환 문자가 없는 경우, 스팸 체크가 번만 수행되도록 제어 boolean hasPerformedSpamCheck = false; // 치환 문자가 없는 경우, 스팸 체크가 번만 수행되도록 제어
boolean hasPerformedMsgType = false; // 치환 문자가 없는 경우, 스팸 체크가 번만 수행되도록 제어 boolean hasPerformedMsgType = false; // 치환 문자가 없는 경우, 메세지 타입 체크 한번
boolean hasPerformedDelayYn = false; // 치환 문자가 없는 경우, 스팸 체크가 번만 수행되도록 제어 boolean hasPerformedDelayYn = false; // 치환 문자가 없는 경우,
String msgKind = mjonMsgVO.getMsgKind(); String msgKind = mjonMsgVO.getMsgKind();
String smsTxtTemp = mjonMsgVO.getSmsTxt(); String smsTxtTemp = mjonMsgVO.getSmsTxt();
@ -257,10 +257,6 @@ public final class MsgSendUtils {
for (Map.Entry<String, Function<MjonMsgSendVO, String>> entry : placeholders.entrySet()) { for (Map.Entry<String, Function<MjonMsgSendVO, String>> entry : placeholders.entrySet()) {
String placeholder = entry.getKey(); String placeholder = entry.getKey();
String value = entry.getValue().apply(sendVO); String value = entry.getValue().apply(sendVO);
// log.info(" + smsTxtTemp [{}]", smsTxtTemp);
// log.info(" + placeholder [{}]", placeholder);
// log.info(" + value [{}]", value);
// log.info(" + smsTxtTemp.contains(placeholder) [{}]", smsTxtTemp.contains(placeholder));
if (smsTxt.contains(placeholder)) { if (smsTxt.contains(placeholder)) {
if (StringUtils.isEmpty(value)) { if (StringUtils.isEmpty(value)) {
statusResponseSet(statusResponse, HttpStatus.BAD_REQUEST, "치환 문구중 " + placeholder + " 데이터가 없습니다."); statusResponseSet(statusResponse, HttpStatus.BAD_REQUEST, "치환 문구중 " + placeholder + " 데이터가 없습니다.");

View File

@ -66,13 +66,16 @@ public class KakaoSendAdvcVO implements Serializable {
private String kakaoAtPrice; // 카카오 알림톡 단가 private String kakaoAtPrice; // 카카오 알림톡 단가
private String bizJsonName; // 카카오 알림톡 단가 private String bizJsonName; // 카카오 알림톡 단가
private String reserveYn; // 카카오 알림톡 단가 private String reserveYn; // 카카오 알림톡 단가
private String atDelayYn; // 카카오 알림톡 단가 private String atDelayYn; // 지연 문자 발송
private String bizKakaoResendOrgnlTxt; // 카카오 알림톡 단가 private String bizKakaoResendOrgnlTxt; // 카카오 알림톡 단가
private String bizKakaoResendType; // 카카오 알림톡 단가 private String bizKakaoResendType; // 카카오 알림톡 단가
private String filePath1; // 대체문자 이미지 private String filePath1; // 대체문자 이미지
private String fileCnt; // 파일 카운트 private String fileCnt; // 파일 카운트
private String bizKakaoImageType; // 파일 카운트 private String bizKakaoImageType; // 파일 카운트
private String spamStatus;

View File

@ -40,6 +40,7 @@ import itn.let.mjo.spammsg.web.ComGetSpamStringParser;
import itn.let.module.base.PriceAndPoint; import itn.let.module.base.PriceAndPoint;
import itn.let.sym.site.service.JoinSettingVO; import itn.let.sym.site.service.JoinSettingVO;
import itn.let.uss.umt.service.MberManageVO; import itn.let.uss.umt.service.MberManageVO;
import itn.let.uss.umt.service.UserManageVO;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@Slf4j @Slf4j
@ -297,21 +298,36 @@ public class KakaoSendUtil {
* @description : * @description :
* @return : List<KakaoSendAdvcVO> * @return : List<KakaoSendAdvcVO>
* @param kakaoVO * @param kakaoVO
* @param isNotified * @param isHolidayNotified
* @param statusResponse * @param statusResponse
* @return * @return
* @throws Exception * @throws Exception
* *
*/ */
public List<KakaoSendAdvcVO> populateSendListsFT(KakaoVO kakaoVO, boolean isNotified, StatusResponse statusResponse) throws Exception { public List<KakaoSendAdvcVO> populateSendListsFT(KakaoVO kakaoVO
, boolean isHolidayNotified
, StatusResponse statusResponse
, UserManageVO userManageVO
, List<String> resultSpamTxt
) throws Exception {
//사용자 현재 보유 금액 불러오기(문자 발송 금액 차감 이전 금액) //사용자 현재 보유 금액 불러오기(문자 발송 금액 차감 이전 금액)
// String befCash = kakaoVO.getBefCash(); // String befCash = kakaoVO.getBefCash();
log.info("kakaoVO.ftToString() :: [{}]", kakaoVO.ftToString()); log.info("kakaoVO.ftToString() :: [{}]", kakaoVO.ftToString());
// 예약 시간 기본값 설정
Date now = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
String smishingYn = userManageVO.getSmishingYn();
String exceptSpamYn = userManageVO.getExceptSpamYn();
List<KakaoSendAdvcVO> kakaoSendAdvcListVO = new ArrayList<>(); List<KakaoSendAdvcVO> kakaoSendAdvcListVO = new ArrayList<>();
Calendar calendar = setupBaseDate(kakaoVO, isNotified); Calendar calendar = setupBaseDateFT(kakaoVO);
// 친구톡 내용 // 친구톡 내용
@ -375,18 +391,18 @@ public class KakaoSendUtil {
float shortPrice = getValidPrice(mberManageVO.getShortPrice(), sysJoinSetVO.getShortPrice()); float shortPrice = getValidPrice(mberManageVO.getShortPrice(), sysJoinSetVO.getShortPrice());
float longPrice = getValidPrice(mberManageVO.getLongPrice(), sysJoinSetVO.getLongPrice()); float longPrice = getValidPrice(mberManageVO.getLongPrice(), sysJoinSetVO.getLongPrice());
float picturePrice = getValidPrice(mberManageVO.getPicturePrice(), sysJoinSetVO.getPicturePrice()); float picturePrice = getValidPrice(mberManageVO.getPicturePrice(), sysJoinSetVO.getPicturePrice());
// String shortPStr = Float.toString(shortPrice);
// String mmsPStr = Float.toString(longPrice); boolean hasPerformedSpamCheck = false; // 치환 문자가 없는 경우, 스팸 체크가 번만 수행되도록 제어
// String imgPrice = Float.toString(picturePrice); boolean hasPerformedSubSpamCheck = false; // 치환 문자가 없는 경우, 스팸 체크가 번만 수행되도록 제어
boolean hasPerformedMsgType = false; // 치환 문자가 없는 경우, 메세지 타입 체크 한번
boolean hasPerformedDelayYn = false; // 치환 문자가 없는 경우,
String imgFilePath = ""; String imgFilePath = "";
if(StringUtils.isNotEmpty(kakaoVO.getAtchFileId()) && if(StringUtils.isNotEmpty(kakaoVO.getAtchFileId()) &&
("I".equals(imageType) || "W".equals(imageType))) { ("I".equals(imageType) || "W".equals(imageType))) {
imgFilePath = mjonMsgDAO.selectPhotoImgFileRealPath(kakaoVO.getAtchFileId()); imgFilePath = mjonMsgDAO.selectPhotoImgFileRealPath(kakaoVO.getAtchFileId());
} }
@ -395,7 +411,20 @@ public class KakaoSendUtil {
boolean hasButtons = CollectionUtils.isNotEmpty(kakaoVO.getButtonVOList()); boolean hasButtons = CollectionUtils.isNotEmpty(kakaoVO.getButtonVOList());
String sharedJsonStr = null; String sharedJsonStr = null;
// 치환데이터가 없는 경우 번만 계산하기 위한 캐시 변수 추가
Map<String, Object> sharedPricingResult = null;
// 치환데이터가 없는 경우 for문 전에 번만 계산
if (!replaceSubYN && StringUtils.isNotEmpty(subMsgTxt)) {
sharedPricingResult = calculateSubMsgPricing(subMsgTxt, imgFilePath, shortPrice, longPrice, picturePrice, kakaoFtPrice);
// 사전계산에서 INVALID인 경우 즉시 리턴
String preSendType = (String) sharedPricingResult.get("sendType");
if ("INVALID".equals(preSendType)) {
statusResponseSet(statusResponse, HttpStatus.BAD_REQUEST, "전송 문자 길이를 초과하였습니다.");
return kakaoSendAdvcListVO;
}
}
List<MjonFTSendVO> mjonFTSendVOList = kakaoVO.getMjonFTSendVOList(); List<MjonFTSendVO> mjonFTSendVOList = kakaoVO.getMjonFTSendVOList();
@ -411,7 +440,9 @@ public class KakaoSendUtil {
sendVO.setCallTo(mjonFTSendVO.getPhone()); sendVO.setCallTo(mjonFTSendVO.getPhone());
sendVO.setMsgId(idList.get(i)); sendVO.setMsgId(idList.get(i));
String smsTxt = templateContent;
// 친구톡 문자
String templateContentTemp = templateContent;
// 치환 문자면 // 치환 문자면
if(replaceYN) { if(replaceYN) {
@ -419,21 +450,19 @@ public class KakaoSendUtil {
for (Map.Entry<String, Function<MjonFTSendVO, String>> entry : placeholders.entrySet()) { for (Map.Entry<String, Function<MjonFTSendVO, String>> entry : placeholders.entrySet()) {
String placeholder = entry.getKey(); String placeholder = entry.getKey();
String value = entry.getValue().apply(mjonFTSendVO); String value = entry.getValue().apply(mjonFTSendVO);
if (smsTxt.contains(placeholder)) { if (templateContentTemp.contains(placeholder)) {
if (StringUtils.isEmpty(value)) { if (StringUtils.isEmpty(value)) {
statusResponseSet(statusResponse, HttpStatus.BAD_REQUEST, "치환 문구중 " + placeholder + " 데이터가 없습니다."); statusResponseSet(statusResponse, HttpStatus.BAD_REQUEST, "치환 문구중 " + placeholder + " 데이터가 없습니다.");
return null; return null;
} }
smsTxt = smsTxt.replace(placeholder, value); templateContentTemp = templateContentTemp.replace(placeholder, value);
} }
} }
} }
sendVO.setTemplateContent(smsTxt); sendVO.setTemplateContent(templateContentTemp);
// 실패 대체 문자
String subMsgTxtTemp = null; String subMsgTxtTemp = null;
if(StringUtils.isNotEmpty(subMsgTxt)) { if(StringUtils.isNotEmpty(subMsgTxt)) {
subMsgTxtTemp = subMsgTxt; subMsgTxtTemp = subMsgTxt;
@ -459,34 +488,28 @@ public class KakaoSendUtil {
// Step 1-4: 실패 대체 문자 치환데이터 설정 // Step 1-4: 실패 대체 문자 치환데이터 설정
if(StringUtils.isNotEmpty(subMsgTxtTemp)) { // 대체문자가 있나? if(StringUtils.isNotEmpty(subMsgTxtTemp)) { // 대체문자가 있나?
String sendType = "MMS"; // 최적화된 계산 로직
if(StringUtils.isEmpty(imgFilePath)) { Map<String, Object> pricingResult;
int smsTxtByte = mjonCommon.getSmsTxtBytes(subMsgTxtTemp); // 문자 byte 계산
sendType = getMsgType(smsTxtByte); // 문자 타입(SHORT / MMS) 판별 if (replaceSubYN) {
} // 치환데이터 있음 매번 새로 계산
sendVO.setSubMsgType(sendType); // 실패 대체 문자 타입 설정 pricingResult = calculateSubMsgPricing(subMsgTxtTemp, imgFilePath,
shortPrice, longPrice, picturePrice, kakaoFtPrice);
if ("INVALID".equals(sendType)) { // INVALID 체크
// INVALID 타입이면 길이 초과 에러 응답 리턴 String resultSendType = (String) pricingResult.get("sendType");
statusResponseSet(statusResponse, HttpStatus.BAD_REQUEST, "전송 문자 길이를 초과하였습니다."); if ("INVALID".equals(resultSendType)) {
return kakaoSendAdvcListVO; statusResponseSet(statusResponse, HttpStatus.BAD_REQUEST, "전송 문자 길이를 초과하였습니다.");
} return kakaoSendAdvcListVO;
}
float chosenPrice = 0f;
if(StringUtils.isNotEmpty(imgFilePath)) {
chosenPrice = Math.max(picturePrice, kakaoFtPrice);
sendVO.setFilePath1(imgFilePath);
sendVO.setFileCnt("1");
}else if ("MMS".equals(sendType)) {
// MMS 타입일 경우: longPrice(장문 가격) 카카오톡 단가 값을 선택
chosenPrice = Math.max(longPrice, kakaoFtPrice);
} else { } else {
// SHORT 타입일 경우: shortPrice(단문 가격) 카카오톡 단가 값을 선택 // 치환데이터 없음 미리 계산된 결과 재사용
chosenPrice = Math.max(shortPrice, kakaoFtPrice); pricingResult = sharedPricingResult;
} }
sendVO.setEachPrice(Float.toString(chosenPrice)); // 선택된 단가 설정
// 결과 적용
applyPricingResult(sendVO, pricingResult);
}else { }else {
@ -494,8 +517,68 @@ public class KakaoSendUtil {
sendVO.setEachPrice( Float.toString(kakaoFtPrice) ); sendVO.setEachPrice( Float.toString(kakaoFtPrice) );
} }
// 스팸 단어 체크
// exceptSpam는 사용자 스팸 단어 체크할건지에 대한 여부 Y : 체크
if("N".equals(exceptSpamYn)) {
// 친구톡 내용
if(replaceYN) {
checkSpamAndSetStatus(kakaoVO
, templateContentTemp
, resultSpamTxt, isHolidayNotified);
}else if(!hasPerformedSpamCheck) {
checkSpamAndSetStatus(kakaoVO
, templateContentTemp
, resultSpamTxt, isHolidayNotified);
hasPerformedSpamCheck = true;
}
// 대체문자 내용
if(StringUtils.isNotEmpty(subMsgTxtTemp)) {
if(replaceSubYN) {
checkSpamAndSetStatus(kakaoVO
, subMsgTxtTemp
, resultSpamTxt, isHolidayNotified);
}else if(!hasPerformedSubSpamCheck) {
checkSpamAndSetStatus(kakaoVO
, subMsgTxtTemp
, resultSpamTxt, isHolidayNotified);
hasPerformedSubSpamCheck = true;
}
// 타이틀과 버튼이 있고 }
}
log.info(" kakaoVO.toString() :: [{}]",kakaoVO.ftToString());
/* @isHolidayNotified
* - 관리자 알림 설정으로 인해
* - 해당 시간이면 지연 미처리
* @smishingYn
* - 회원 '스미싱 ' 상태값
* - Y면 알림, 지연 처리해야
* */
if("Y".equalsIgnoreCase(smishingYn) && isHolidayNotified) {
kakaoVO.setSpamStatus("Y");
kakaoVO.setSmishingYn("Y");
kakaoVO.setAtDelayYn("Y");
}
// 지연 여부 처리
if (( "Y".equalsIgnoreCase(smishingYn) || "Y".equalsIgnoreCase(kakaoVO.getAtDelayYn()))
&& !hasPerformedDelayYn && isHolidayNotified) {
calendar.add(Calendar.MINUTE, 30); // 모든 시간을 30분 뒤로 미룸
// TEST
// calendar.add(Calendar.MINUTE, 5); // 모든 시간을 30분 뒤로 미룸
hasPerformedDelayYn = true;
}
sendVO.setReqDate(sdf.format(calendar.getTime())); // 분할된 시간 설정 또는 기본 예약 시간 사용
// 타이틀이나 버튼이 있고
if(hasButtons || StringUtils.isNotEmpty(kakaoVO.getTemplateImageUrl())) { if(hasButtons || StringUtils.isNotEmpty(kakaoVO.getTemplateImageUrl())) {
// //
if (StringUtils.isEmpty(sharedJsonStr)) { if (StringUtils.isEmpty(sharedJsonStr)) {
@ -510,10 +593,114 @@ public class KakaoSendUtil {
kakaoSendAdvcListVO.add(sendVO); kakaoSendAdvcListVO.add(sendVO);
log.info(" sendVO.toString() :: [{}]",sendVO.toString()); log.info(" sendVO.toString() :: [{}]",sendVO.toString());
} }
return kakaoSendAdvcListVO; return kakaoSendAdvcListVO;
} }
private void checkSpamAndSetStatus(KakaoVO kakaoVO
, String chkText
, List<String> resultSpamTxt, boolean isHolidayNotified) throws Exception {
// TODO Auto-generated method stub
kakaoVO.setSpamStatus("N");
kakaoVO.setAtDelayYn("N");
if(StringUtils.isNotEmpty(chkText)) {
String resultParser = ComGetSpamStringParser.getSpamTextParse(chkText).trim();
int spmCnt = 0;
String spmFilterTxt = "";
for (String spmTxt : resultSpamTxt) {
String parserStr = ComGetSpamStringParser.getSpamTextParse(spmTxt).trim();
if (resultParser.contains(parserStr)) {
spmCnt++;
spmFilterTxt += spmTxt + ",";
}
}
if (spmCnt > 0) { // 스팸 문자가 포함된 경우
if (StringUtil.getWordRight(spmFilterTxt.trim(), 1).equals(",")) {
// 처음부터 idx 만큼 잘라낸 나머지 글자
spmFilterTxt = StringUtil.getWordLeft(spmFilterTxt.trim(), 1);
}
/* @isHolidayNotified
* - 관리자 알림 설정으로 인해
* - 해당 시간이면 지연 미처리
* */
kakaoVO.setSpamStatus("Y");
if(isHolidayNotified) {
kakaoVO.setAtDelayYn("Y");
}
}
}
}
// TODO(human): 아래에 새로운 메소드 구현
/**
* 대체문자 가격 계산 최적화 메소드
* @param subMsgTxt 대체문자 내용
* @param imgFilePath 이미지 파일 경로
* @param shortPrice 단문 가격
* @param longPrice 장문 가격
* @param picturePrice 사진 가격
* @param kakaoFtPrice 카카오 친구톡 가격
* @return 계산 결과 Map (sendType, chosenPrice, filePath 포함)
* @throws UnsupportedEncodingException
*/
private Map<String, Object> calculateSubMsgPricing(String subMsgTxt, String imgFilePath,
float shortPrice, float longPrice,
float picturePrice, float kakaoFtPrice) throws UnsupportedEncodingException {
Map<String, Object> result = new HashMap<>();
String sendType = "MMS";
if(StringUtils.isEmpty(imgFilePath)) {
int smsTxtByte = mjonCommon.getSmsTxtBytes(subMsgTxt);
sendType = getMsgType(smsTxtByte);
}
result.put("sendType", sendType);
// INVALID인 경우 추가 처리 없이 반환
if ("INVALID".equals(sendType)) {
return result;
}
float chosenPrice = 0f;
if(StringUtils.isNotEmpty(imgFilePath)) {
chosenPrice = Math.max(picturePrice, kakaoFtPrice);
result.put("filePath", imgFilePath);
} else if ("MMS".equals(sendType)) {
chosenPrice = Math.max(longPrice, kakaoFtPrice);
} else {
chosenPrice = Math.max(shortPrice, kakaoFtPrice);
}
result.put("sendType", sendType);
result.put("chosenPrice", Float.toString(chosenPrice));
return result;
}
/**
* 가격 계산 결과를 sendVO에 적용하는 헬퍼 메소드
* @param sendVO 적용할 KakaoSendAdvcVO 객체
* @param pricingResult 가격 계산 결과 Map
*/
private void applyPricingResult(KakaoSendAdvcVO sendVO, Map<String, Object> pricingResult) {
sendVO.setSubMsgType((String) pricingResult.get("sendType"));
sendVO.setEachPrice((String) pricingResult.get("chosenPrice"));
if (pricingResult.get("filePath") != null) {
sendVO.setFilePath1((String) pricingResult.get("filePath"));
sendVO.setFileCnt("1");
}
}
public static String getMsgTypeWithByteValidation(MjonFTSendVO sendVO, String p_smsTxt) throws UnsupportedEncodingException { public static String getMsgTypeWithByteValidation(MjonFTSendVO sendVO, String p_smsTxt) throws UnsupportedEncodingException {
@ -543,9 +730,21 @@ public class KakaoSendUtil {
} }
return msgType; return msgType;
} }
private Calendar setupBaseDate(KakaoVO kakaoVO, boolean isNotified) throws ParseException {
private Calendar setupBaseDateFT(KakaoVO kakaoVO) throws ParseException {
// baseDate 추출
Date baseDate = resolveBaseDate(kakaoVO);
// 시간 성정
Calendar calendar = Calendar.getInstance();
calendar.setTime(baseDate); // calendar에 baseDate 설정
return calendar;
}
private Calendar setupBaseDate(KakaoVO kakaoVO, boolean isHolidayNotified) throws ParseException {
// baseDate 추출 // baseDate 추출
Date baseDate = resolveBaseDate(kakaoVO); Date baseDate = resolveBaseDate(kakaoVO);
@ -557,7 +756,7 @@ public class KakaoSendUtil {
// 지연 여부 처리 // 지연 여부 처리
// 알림톡 스미싱의심 + 공휴일알림 조건이 맞으면 30분 delay // 알림톡 스미싱의심 + 공휴일알림 조건이 맞으면 30분 delay
if ( "Y".equalsIgnoreCase(kakaoVO.getAtSmishingYn()) if ( "Y".equalsIgnoreCase(kakaoVO.getAtSmishingYn())
&& isNotified) { && isHolidayNotified) {
calendar.add(Calendar.MINUTE, 30); // 모든 시간을 30분 뒤로 미룸 calendar.add(Calendar.MINUTE, 30); // 모든 시간을 30분 뒤로 미룸
} }
return calendar; return calendar;
@ -1688,7 +1887,7 @@ public class KakaoSendUtil {
Float totPrice = eachPrice * instCnt; Float totPrice = eachPrice * instCnt;
sendVO.setTotPrice(String.format("%.1f", totPrice)); sendVO.setTotPrice(String.format("%.1f", totPrice));
sendVO.setAtDelayYn(kakaoVO.getAtSmishingYn()); sendVO.setAtDelayYn(kakaoVO.getAtDelayYn());
sendVO.setBizKakaoResendOrgnlTxt(kakaoVO.getSubMsgTxt()); sendVO.setBizKakaoResendOrgnlTxt(kakaoVO.getSubMsgTxt());
sendVO.setBizKakaoResendType(sendVO.getSubMsgType()); sendVO.setBizKakaoResendType(sendVO.getSubMsgType());
sendVO.setBizKakaoImageType(kakaoVO.getImageType()); sendVO.setBizKakaoImageType(kakaoVO.getImageType());

View File

@ -358,6 +358,7 @@ public class KakaoVO extends MjonMsgVO{
sb.append("\n , spamStatus=[").append(getSpamStatus()).append("]"); sb.append("\n , spamStatus=[").append(getSpamStatus()).append("]");
sb.append("\n , txtReplYn=[").append(getTxtReplYn()).append("]"); sb.append("\n , txtReplYn=[").append(getTxtReplYn()).append("]");
sb.append("\n , atSmishingYn=[").append(getAtSmishingYn()).append("]"); sb.append("\n , atSmishingYn=[").append(getAtSmishingYn()).append("]");
sb.append("\n , atDelayYn=[").append(getAtDelayYn()).append("]");
// sb.append("\n , tmpBtnSelect=[").append(getTmpBtnSelect()).append("]"); // sb.append("\n , tmpBtnSelect=[").append(getTmpBtnSelect()).append("]");
StringBuilder btnListSb = new StringBuilder("["); StringBuilder btnListSb = new StringBuilder("[");
if (buttonVOList != null && !buttonVOList.isEmpty()) { if (buttonVOList != null && !buttonVOList.isEmpty()) {

View File

@ -29,8 +29,10 @@ import itn.let.mail.service.StatusResponse;
import itn.let.mjo.mjocommon.MjonCommon; import itn.let.mjo.mjocommon.MjonCommon;
import itn.let.mjo.msg.service.MjonMsgVO; import itn.let.mjo.msg.service.MjonMsgVO;
import itn.let.mjo.msg.service.impl.MjonMsgDAO; import itn.let.mjo.msg.service.impl.MjonMsgDAO;
import itn.let.mjo.msgdata.service.MjonMsgDataService;
import itn.let.module.base.PriceAndPoint; import itn.let.module.base.PriceAndPoint;
import itn.let.uss.umt.service.EgovUserManageService; import itn.let.uss.umt.service.EgovUserManageService;
import itn.let.uss.umt.service.UserManageVO;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@Slf4j @Slf4j
@ -56,6 +58,9 @@ public class KakaoFriendsTalkServiceImpl extends EgovAbstractServiceImpl implem
@Resource(name="kakaoAlimTalkDAO") @Resource(name="kakaoAlimTalkDAO")
private KakaoAlimTalkDAO kakaoAlimTalkDAO; private KakaoAlimTalkDAO kakaoAlimTalkDAO;
@Resource(name = "MjonMsgDataService")
private MjonMsgDataService mjonMsgDataService;
@Autowired @Autowired
KakaoSendUtil kakaoSendUtil; KakaoSendUtil kakaoSendUtil;
@ -70,9 +75,9 @@ public class KakaoFriendsTalkServiceImpl extends EgovAbstractServiceImpl implem
public StatusResponse insertKakaoFtSandAjax_advc(KakaoVO kakaoVO, HttpServletRequest request) throws Exception { public StatusResponse insertKakaoFtSandAjax_advc(KakaoVO kakaoVO, HttpServletRequest request) throws Exception {
StatusResponse statusResponse = new StatusResponse(); StatusResponse statusResponse = new StatusResponse();
log.info(" + kakaoVO.toString() :: [{}]", kakaoVO.toString()); // log.info(" + kakaoVO.toString() :: [{}]", kakaoVO.toString());
log.info(" + kakaoVO.toString() :: [{}]", kakaoVO.ftToString()); // log.info(" + kakaoVO.toString() :: [{}]", kakaoVO.ftToString());
@ -118,12 +123,17 @@ public class KakaoFriendsTalkServiceImpl extends EgovAbstractServiceImpl implem
/** @isHolidayNotified /** @isHolidayNotified
* @false : 알림 X * @false : 알림 X
* @true : 알림 O */ * @true : 알림 O */
boolean isNotified = mjonCommon.processUserAndCheckAT(kakaoVO); boolean isHolidayNotified = mjonCommon.processUserAndCheckFT(kakaoVO);
UserManageVO userManageVO = mjonCommon.getUserManageInfo(userId);
// 스팸관련 키워드 select
List<String> resultSpamTxt = mjonMsgDataService.selectSpamKeywordList();
/** @카카오톡 전송 list 셋팅 -------------------------------------------*/ /** @카카오톡 전송 list 셋팅 -------------------------------------------*/
List<KakaoSendAdvcVO> kakaoSendAdvcListVO = kakaoSendUtil.populateSendListsFT(kakaoVO, isNotified, statusResponse); List<KakaoSendAdvcVO> kakaoSendAdvcListVO = kakaoSendUtil.populateSendListsFT(kakaoVO, isHolidayNotified, statusResponse, userManageVO, resultSpamTxt);
if (statusResponse.getStatus() != null && !statusResponse.getStatus().equals(HttpStatus.OK)) { if (statusResponse.getStatus() != null && !statusResponse.getStatus().equals(HttpStatus.OK)) {
log.error(" + populateSendLists 처리 중 오류 발생: {}", statusResponse.getMessage()); log.error(" + populateSendLists 처리 중 오류 발생: {}", statusResponse.getMessage());
return statusResponse; return statusResponse;
@ -189,7 +199,7 @@ public class KakaoFriendsTalkServiceImpl extends EgovAbstractServiceImpl implem
/** @SLACK발송 */ /** @SLACK발송 */
/** @발송조건이되면 발송 */ /** @발송조건이되면 발송 */
if(isNotified) { if(isHolidayNotified && "Y".equals(userManageVO.getAtSmishingYn())) {
mjonCommon.getAdminKakaoAtSendSlack(sendVO); mjonCommon.getAdminKakaoAtSendSlack(sendVO);
}else if("Y".equals(kakaoVO.getAtSmishingYn())){ }else if("Y".equals(kakaoVO.getAtSmishingYn())){
/** @발송조건이 안되면 DB INSERT */ /** @발송조건이 안되면 DB INSERT */

View File

@ -533,12 +533,12 @@ private int parseIntOrDefault(String value, int defaultValue) {
UserManageVO userManageVO = getUserManageInfo(kakaoVO.getUserId()); UserManageVO userManageVO = getUserManageInfo(kakaoVO.getUserId());
// 기본값 처리된 사용자 정보와 문자 상태 // 기본값 처리된 사용자 정보와 문자 상태
String adminSmsNoticeYn = userManageVO.getAdminSmsNoticeYn(); String adminSmsNoticeYn = userManageVO.getAdminSmsNoticeYn(); // 법인폰 알람 여부 - Y : ON
String atSmishingYn = userManageVO.getAtSmishingYn(); String atSmishingYn = userManageVO.getAtSmishingYn(); // 스미싱 의심 - Y : ON
// 조건 체크 // 조건 체크
if ("Y".equals(adminSmsNoticeYn) || "Y".equals(atSmishingYn)) { if ("Y".equals(adminSmsNoticeYn) || "Y".equals(atSmishingYn)) {
kakaoVO.setAtSmishingYn("Y"); // MjonMsgVO에 스미싱 정보 설정 kakaoVO.setAtSmishingYn("Y"); // MjonMsgVO에 스미싱 정보 설정 - Y면
// 스미싱 알림 처리 // 스미싱 알림 처리
return handleSmishingAlert(); // 알림 처리 결과 반환 return handleSmishingAlert(); // 알림 처리 결과 반환
@ -546,6 +546,46 @@ private int parseIntOrDefault(String value, int defaultValue) {
return false; // 알림 처리되지 않음 return false; // 알림 처리되지 않음
} }
/**
* @methodName : processUserAndCheckFT
* @author : 이호영
* @date : 2025. 8. 21.
* @description :
* @return : boolean
* @param kakaoVO
* @return
* @throws Exception
*
* @isHolidayNotified
* @false : 알림 X
* @true : 알림 O
*
*/
public boolean processUserAndCheckFT(KakaoVO kakaoVO) throws Exception {
// UserManageVO userManageVO = getUserManageInfo(kakaoVO.getUserId());
// kakaoVO.setAtSmishingYn("N"); // MjonMsgVO에 스미싱 정보 설정 - Y면 딜레이 처리
// 기본값 처리된 사용자 정보와 문자 상태
// String adminSmsNoticeYn = userManageVO.getAdminSmsNoticeYn(); // 법인폰 알람 여부 - Y : ON
// String atSmishingYn = userManageVO.getAtSmishingYn(); // 스미싱 의심 - Y : ON !== mj_msg_group_data와 다른거임
// 조건 체크
// if ("Y".equals(adminSmsNoticeYn) || "Y".equals(atSmishingYn)) {
// if ("Y".equals(atSmishingYn)) {
// Boolean B_return = handleSmishingAlert();
// if(B_return) { // true면 알림ON이라서 스미싱Yn을 Y로 설정 아니면 N / 나머지는 로직에서 처리
// kakaoVO.setAtSmishingYn(atSmishingYn); // MjonMsgVO에 스미싱 정보 설정 - Y면 딜레이 처리
// }
// 스미싱 알림 처리
// return B_return; // 알림 처리 결과 반환
// }
return handleSmishingAlert(); // 알림 처리되지 않음
}
// 사용자 정보 조회 기본값 처리 // 사용자 정보 조회 기본값 처리
public UserManageVO getUserManageInfo(String userId) throws Exception { public UserManageVO getUserManageInfo(String userId) throws Exception {

View File

@ -393,12 +393,12 @@ public class SchdlrManageServiceImpl extends EgovAbstractServiceImpl implements
// 대상 : 휴대폰결제, 즉시이체, 전용계좌 // 대상 : 휴대폰결제, 즉시이체, 전용계좌
// Step 1. 스미싱의심 지정 여부 // Step 1. 스미싱의심 지정 여부
JoinSettingVO joinSettingVO = new JoinSettingVO(); // JoinSettingVO joinSettingVO = new JoinSettingVO();
joinSettingVO = egovSiteManagerService.selectAdminNotiDetail(); JoinSettingVO joinSettingVO = egovSiteManagerService.selectAdminNotiDetail();
if (joinSettingVO != null && joinSettingVO.getSmishingNoti().equals("Y")) { if (joinSettingVO != null && joinSettingVO.getSmishingNoti().equals("Y")) {
// Step 1. 개인회원 여부 체크 // Step 1. 개인회원 여부 체크
int isPersnalMemberCnt = egovSiteManagerService.selectPersnalMemberCnt(Userid); // int isPersnalMemberCnt = egovSiteManagerService.selectPersnalMemberCnt(Userid);
if (isPersnalMemberCnt == 1) { // if (isPersnalMemberCnt == 1) {
// Step 2. 첫결제 여부 체크 // Step 2. 첫결제 여부 체크
int isFirstPayCnt = egovSiteManagerService.selectFirstPayCnt(Userid); int isFirstPayCnt = egovSiteManagerService.selectFirstPayCnt(Userid);
if (isFirstPayCnt == 1) { if (isFirstPayCnt == 1) {
@ -418,10 +418,11 @@ public class SchdlrManageServiceImpl extends EgovAbstractServiceImpl implements
// 스미싱 의심회원으로 변경 // 스미싱 의심회원으로 변경
UserManageVO userManageVO = new UserManageVO(); UserManageVO userManageVO = new UserManageVO();
userManageVO.setSmishingYn("Y"); userManageVO.setSmishingYn("Y");
userManageVO.setAtSmishingYn("Y");
userManageVO.setMberId(Userid); userManageVO.setMberId(Userid);
userManageService.updateOneUserSmishingYnNotAlert(userManageVO); userManageService.updateOneUserSmishingYnNotAlert(userManageVO);
} }
} // }
} }
} catch (Exception e) { } catch (Exception e) {

View File

@ -1367,6 +1367,7 @@
LETTNGNRLMBER LETTNGNRLMBER
SET SET
SMISHING_YN = #smishingYn# SMISHING_YN = #smishingYn#
, AT_SMISHING_YN = #atSmishingYn#
WHERE 1=1 WHERE 1=1
AND MBER_ID = #mberId# AND MBER_ID = #mberId#
</update> </update>