--- src/main/java/itn/com/cmm/util/MsgSendUtils.java
+++ src/main/java/itn/com/cmm/util/MsgSendUtils.java
... | ... | @@ -229,8 +229,8 @@ |
| 229 | 229 |
placeholders.put("[*4*]", MjonMsgSendVO::getRep4);
|
| 230 | 230 |
|
| 231 | 231 |
boolean hasPerformedSpamCheck = false; // 치환 문자가 없는 경우, 스팸 체크가 한 번만 수행되도록 제어 |
| 232 |
- boolean hasPerformedMsgType = false; // 치환 문자가 없는 경우, 스팸 체크가 한 번만 수행되도록 제어 |
|
| 233 |
- boolean hasPerformedDelayYn = false; // 치환 문자가 없는 경우, 스팸 체크가 한 번만 수행되도록 제어 |
|
| 232 |
+ boolean hasPerformedMsgType = false; // 치환 문자가 없는 경우, 메세지 타입 체크 한번 |
|
| 233 |
+ boolean hasPerformedDelayYn = false; // 치환 문자가 없는 경우, |
|
| 234 | 234 |
|
| 235 | 235 |
String msgKind = mjonMsgVO.getMsgKind(); |
| 236 | 236 |
String smsTxtTemp = mjonMsgVO.getSmsTxt(); |
... | ... | @@ -257,10 +257,6 @@ |
| 257 | 257 |
for (Map.Entry<String, Function<MjonMsgSendVO, String>> entry : placeholders.entrySet()) {
|
| 258 | 258 |
String placeholder = entry.getKey(); |
| 259 | 259 |
String value = entry.getValue().apply(sendVO); |
| 260 |
-// log.info(" + smsTxtTemp [{}]", smsTxtTemp);
|
|
| 261 |
-// log.info(" + placeholder [{}]", placeholder);
|
|
| 262 |
-// log.info(" + value [{}]", value);
|
|
| 263 |
-// log.info(" + smsTxtTemp.contains(placeholder) [{}]", smsTxtTemp.contains(placeholder));
|
|
| 264 | 260 |
if (smsTxt.contains(placeholder)) {
|
| 265 | 261 |
if (StringUtils.isEmpty(value)) {
|
| 266 | 262 |
statusResponseSet(statusResponse, HttpStatus.BAD_REQUEST, "치환 문구중 " + placeholder + " 데이터가 없습니다."); |
--- src/main/java/itn/let/kakao/kakaoComm/KakaoSendAdvcVO.java
+++ src/main/java/itn/let/kakao/kakaoComm/KakaoSendAdvcVO.java
... | ... | @@ -66,13 +66,16 @@ |
| 66 | 66 |
private String kakaoAtPrice; // 카카오 알림톡 단가 |
| 67 | 67 |
private String bizJsonName; // 카카오 알림톡 단가 |
| 68 | 68 |
private String reserveYn; // 카카오 알림톡 단가 |
| 69 |
- private String atDelayYn; // 카카오 알림톡 단가 |
|
| 69 |
+ private String atDelayYn; // 지연 문자 발송 |
|
| 70 | 70 |
private String bizKakaoResendOrgnlTxt; // 카카오 알림톡 단가 |
| 71 | 71 |
private String bizKakaoResendType; // 카카오 알림톡 단가 |
| 72 | 72 |
private String filePath1; // 대체문자 이미지 |
| 73 | 73 |
private String fileCnt; // 파일 카운트 |
| 74 | 74 |
private String bizKakaoImageType; // 파일 카운트 |
| 75 | 75 |
|
| 76 |
+ private String spamStatus; |
|
| 77 |
+ |
|
| 78 |
+ |
|
| 76 | 79 |
|
| 77 | 80 |
|
| 78 | 81 |
|
--- src/main/java/itn/let/kakao/kakaoComm/KakaoSendUtil.java
+++ src/main/java/itn/let/kakao/kakaoComm/KakaoSendUtil.java
... | ... | @@ -40,6 +40,7 @@ |
| 40 | 40 |
import itn.let.module.base.PriceAndPoint; |
| 41 | 41 |
import itn.let.sym.site.service.JoinSettingVO; |
| 42 | 42 |
import itn.let.uss.umt.service.MberManageVO; |
| 43 |
+import itn.let.uss.umt.service.UserManageVO; |
|
| 43 | 44 |
import lombok.extern.slf4j.Slf4j; |
| 44 | 45 |
|
| 45 | 46 |
@Slf4j |
... | ... | @@ -297,21 +298,36 @@ |
| 297 | 298 |
* @description : |
| 298 | 299 |
* @return : List<KakaoSendAdvcVO> |
| 299 | 300 |
* @param kakaoVO |
| 300 |
- * @param isNotified |
|
| 301 |
+ * @param isHolidayNotified |
|
| 301 | 302 |
* @param statusResponse |
| 302 | 303 |
* @return |
| 303 | 304 |
* @throws Exception |
| 304 | 305 |
* |
| 305 | 306 |
*/ |
| 306 |
- public List<KakaoSendAdvcVO> populateSendListsFT(KakaoVO kakaoVO, boolean isNotified, StatusResponse statusResponse) throws Exception {
|
|
| 307 |
+ public List<KakaoSendAdvcVO> populateSendListsFT(KakaoVO kakaoVO |
|
| 308 |
+ , boolean isHolidayNotified |
|
| 309 |
+ , StatusResponse statusResponse |
|
| 310 |
+ , UserManageVO userManageVO |
|
| 311 |
+ , List<String> resultSpamTxt |
|
| 312 |
+ ) throws Exception {
|
|
| 307 | 313 |
|
| 308 | 314 |
//사용자 현재 보유 금액 불러오기(문자 발송 금액 차감 이전 금액) |
| 309 | 315 |
// String befCash = kakaoVO.getBefCash(); |
| 310 | 316 |
|
| 311 | 317 |
log.info("kakaoVO.ftToString() :: [{}]", kakaoVO.ftToString());
|
| 312 | 318 |
|
| 319 |
+ |
|
| 320 |
+ // 예약 시간 기본값 설정 |
|
| 321 |
+ Date now = new Date(); |
|
| 322 |
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
|
|
| 323 |
+ |
|
| 324 |
+ String smishingYn = userManageVO.getSmishingYn(); |
|
| 325 |
+ String exceptSpamYn = userManageVO.getExceptSpamYn(); |
|
| 326 |
+ |
|
| 327 |
+ |
|
| 313 | 328 |
List<KakaoSendAdvcVO> kakaoSendAdvcListVO = new ArrayList<>(); |
| 314 |
- Calendar calendar = setupBaseDate(kakaoVO, isNotified); |
|
| 329 |
+ Calendar calendar = setupBaseDateFT(kakaoVO); |
|
| 330 |
+ |
|
| 315 | 331 |
|
| 316 | 332 |
|
| 317 | 333 |
// 친구톡 내용 |
... | ... | @@ -375,18 +391,18 @@ |
| 375 | 391 |
float shortPrice = getValidPrice(mberManageVO.getShortPrice(), sysJoinSetVO.getShortPrice()); |
| 376 | 392 |
float longPrice = getValidPrice(mberManageVO.getLongPrice(), sysJoinSetVO.getLongPrice()); |
| 377 | 393 |
float picturePrice = getValidPrice(mberManageVO.getPicturePrice(), sysJoinSetVO.getPicturePrice()); |
| 378 |
-// String shortPStr = Float.toString(shortPrice); |
|
| 379 |
-// String mmsPStr = Float.toString(longPrice); |
|
| 380 |
-// String imgPrice = Float.toString(picturePrice); |
|
| 394 |
+ |
|
| 395 |
+ boolean hasPerformedSpamCheck = false; // 치환 문자가 없는 경우, 스팸 체크가 한 번만 수행되도록 제어 |
|
| 396 |
+ boolean hasPerformedSubSpamCheck = false; // 치환 문자가 없는 경우, 스팸 체크가 한 번만 수행되도록 제어 |
|
| 397 |
+ boolean hasPerformedMsgType = false; // 치환 문자가 없는 경우, 메세지 타입 체크 한번 |
|
| 398 |
+ boolean hasPerformedDelayYn = false; // 치환 문자가 없는 경우, |
|
| 399 |
+ |
|
| 381 | 400 |
|
| 382 | 401 |
|
| 383 | 402 |
String imgFilePath = ""; |
| 384 | 403 |
if(StringUtils.isNotEmpty(kakaoVO.getAtchFileId()) && |
| 385 | 404 |
("I".equals(imageType) || "W".equals(imageType))) {
|
| 386 |
- |
|
| 387 |
- |
|
| 388 | 405 |
imgFilePath = mjonMsgDAO.selectPhotoImgFileRealPath(kakaoVO.getAtchFileId()); |
| 389 |
- |
|
| 390 | 406 |
} |
| 391 | 407 |
|
| 392 | 408 |
|
... | ... | @@ -395,7 +411,20 @@ |
| 395 | 411 |
boolean hasButtons = CollectionUtils.isNotEmpty(kakaoVO.getButtonVOList()); |
| 396 | 412 |
String sharedJsonStr = null; |
| 397 | 413 |
|
| 398 |
- |
|
| 414 |
+ |
|
| 415 |
+ // 치환데이터가 없는 경우 한 번만 계산하기 위한 캐시 변수 추가 |
|
| 416 |
+ Map<String, Object> sharedPricingResult = null; |
|
| 417 |
+ // 치환데이터가 없는 경우 for문 전에 한 번만 계산 |
|
| 418 |
+ if (!replaceSubYN && StringUtils.isNotEmpty(subMsgTxt)) {
|
|
| 419 |
+ sharedPricingResult = calculateSubMsgPricing(subMsgTxt, imgFilePath, shortPrice, longPrice, picturePrice, kakaoFtPrice); |
|
| 420 |
+ |
|
| 421 |
+ // 사전계산에서 INVALID인 경우 즉시 리턴 |
|
| 422 |
+ String preSendType = (String) sharedPricingResult.get("sendType");
|
|
| 423 |
+ if ("INVALID".equals(preSendType)) {
|
|
| 424 |
+ statusResponseSet(statusResponse, HttpStatus.BAD_REQUEST, "전송 문자 길이를 초과하였습니다."); |
|
| 425 |
+ return kakaoSendAdvcListVO; |
|
| 426 |
+ } |
|
| 427 |
+ } |
|
| 399 | 428 |
|
| 400 | 429 |
List<MjonFTSendVO> mjonFTSendVOList = kakaoVO.getMjonFTSendVOList(); |
| 401 | 430 |
|
... | ... | @@ -411,7 +440,9 @@ |
| 411 | 440 |
sendVO.setCallTo(mjonFTSendVO.getPhone()); |
| 412 | 441 |
sendVO.setMsgId(idList.get(i)); |
| 413 | 442 |
|
| 414 |
- String smsTxt = templateContent; |
|
| 443 |
+ |
|
| 444 |
+ // 친구톡 문자 |
|
| 445 |
+ String templateContentTemp = templateContent; |
|
| 415 | 446 |
// 치환 문자면 |
| 416 | 447 |
if(replaceYN) {
|
| 417 | 448 |
|
... | ... | @@ -419,21 +450,19 @@ |
| 419 | 450 |
for (Map.Entry<String, Function<MjonFTSendVO, String>> entry : placeholders.entrySet()) {
|
| 420 | 451 |
String placeholder = entry.getKey(); |
| 421 | 452 |
String value = entry.getValue().apply(mjonFTSendVO); |
| 422 |
- if (smsTxt.contains(placeholder)) {
|
|
| 453 |
+ if (templateContentTemp.contains(placeholder)) {
|
|
| 423 | 454 |
if (StringUtils.isEmpty(value)) {
|
| 424 | 455 |
statusResponseSet(statusResponse, HttpStatus.BAD_REQUEST, "치환 문구중 " + placeholder + " 데이터가 없습니다."); |
| 425 | 456 |
return null; |
| 426 | 457 |
} |
| 427 |
- smsTxt = smsTxt.replace(placeholder, value); |
|
| 458 |
+ templateContentTemp = templateContentTemp.replace(placeholder, value); |
|
| 428 | 459 |
} |
| 429 | 460 |
} |
| 430 | 461 |
} |
| 431 |
- sendVO.setTemplateContent(smsTxt); |
|
| 462 |
+ sendVO.setTemplateContent(templateContentTemp); |
|
| 432 | 463 |
|
| 433 |
- |
|
| 434 |
- |
|
| 464 |
+ // 실패 대체 문자 |
|
| 435 | 465 |
String subMsgTxtTemp = null; |
| 436 |
- |
|
| 437 | 466 |
if(StringUtils.isNotEmpty(subMsgTxt)) {
|
| 438 | 467 |
subMsgTxtTemp = subMsgTxt; |
| 439 | 468 |
|
... | ... | @@ -459,34 +488,28 @@ |
| 459 | 488 |
// Step 1-4: 실패 대체 문자 치환데이터 설정 |
| 460 | 489 |
if(StringUtils.isNotEmpty(subMsgTxtTemp)) { // 대체문자가 있나?
|
| 461 | 490 |
|
| 462 |
- String sendType = "MMS"; |
|
| 463 |
- if(StringUtils.isEmpty(imgFilePath)) {
|
|
| 464 |
- int smsTxtByte = mjonCommon.getSmsTxtBytes(subMsgTxtTemp); // 문자 byte 수 계산 |
|
| 465 |
- sendType = getMsgType(smsTxtByte); // 문자 타입(SHORT / MMS) 판별 |
|
| 466 |
- } |
|
| 467 |
- sendVO.setSubMsgType(sendType); // 실패 대체 문자 타입 설정 |
|
| 491 |
+ // 최적화된 계산 로직 |
|
| 492 |
+ Map<String, Object> pricingResult; |
|
| 493 |
+ |
|
| 494 |
+ if (replaceSubYN) {
|
|
| 495 |
+ // 치환데이터 있음 → 매번 새로 계산 |
|
| 496 |
+ pricingResult = calculateSubMsgPricing(subMsgTxtTemp, imgFilePath, |
|
| 497 |
+ shortPrice, longPrice, picturePrice, kakaoFtPrice); |
|
| 468 | 498 |
|
| 469 |
- if ("INVALID".equals(sendType)) {
|
|
| 470 |
- // INVALID 타입이면 길이 초과 에러 응답 후 리턴 |
|
| 471 |
- statusResponseSet(statusResponse, HttpStatus.BAD_REQUEST, "전송 문자 길이를 초과하였습니다."); |
|
| 472 |
- return kakaoSendAdvcListVO; |
|
| 473 |
- } |
|
| 474 |
- |
|
| 475 |
- float chosenPrice = 0f; |
|
| 476 |
- |
|
| 477 |
- if(StringUtils.isNotEmpty(imgFilePath)) {
|
|
| 478 |
- chosenPrice = Math.max(picturePrice, kakaoFtPrice); |
|
| 479 |
- sendVO.setFilePath1(imgFilePath); |
|
| 480 |
- sendVO.setFileCnt("1");
|
|
| 481 |
- |
|
| 482 |
- }else if ("MMS".equals(sendType)) {
|
|
| 483 |
- // MMS 타입일 경우: longPrice(장문 가격)와 카카오톡 단가 중 큰 값을 선택 |
|
| 484 |
- chosenPrice = Math.max(longPrice, kakaoFtPrice); |
|
| 499 |
+ // INVALID 체크 |
|
| 500 |
+ String resultSendType = (String) pricingResult.get("sendType");
|
|
| 501 |
+ if ("INVALID".equals(resultSendType)) {
|
|
| 502 |
+ statusResponseSet(statusResponse, HttpStatus.BAD_REQUEST, "전송 문자 길이를 초과하였습니다."); |
|
| 503 |
+ return kakaoSendAdvcListVO; |
|
| 504 |
+ } |
|
| 485 | 505 |
} else {
|
| 486 |
- // SHORT 타입일 경우: shortPrice(단문 가격)와 카카오톡 단가 중 큰 값을 선택 |
|
| 487 |
- chosenPrice = Math.max(shortPrice, kakaoFtPrice); |
|
| 506 |
+ // 치환데이터 없음 → 미리 계산된 결과 재사용 |
|
| 507 |
+ pricingResult = sharedPricingResult; |
|
| 488 | 508 |
} |
| 489 |
- sendVO.setEachPrice(Float.toString(chosenPrice)); // 선택된 단가 설정 |
|
| 509 |
+ |
|
| 510 |
+ |
|
| 511 |
+ // 결과 적용 |
|
| 512 |
+ applyPricingResult(sendVO, pricingResult); |
|
| 490 | 513 |
|
| 491 | 514 |
|
| 492 | 515 |
}else {
|
... | ... | @@ -494,8 +517,68 @@ |
| 494 | 517 |
sendVO.setEachPrice( Float.toString(kakaoFtPrice) ); |
| 495 | 518 |
} |
| 496 | 519 |
|
| 520 |
+ |
|
| 521 |
+ // 스팸 단어 체크 |
|
| 522 |
+ // exceptSpam는 사용자 스팸 단어 체크할건지에 대한 여부 Y : 체크 |
|
| 523 |
+ if("N".equals(exceptSpamYn)) {
|
|
| 524 |
+ // 친구톡 내용 |
|
| 525 |
+ if(replaceYN) {
|
|
| 526 |
+ checkSpamAndSetStatus(kakaoVO |
|
| 527 |
+ , templateContentTemp |
|
| 528 |
+ , resultSpamTxt, isHolidayNotified); |
|
| 529 |
+ }else if(!hasPerformedSpamCheck) {
|
|
| 530 |
+ checkSpamAndSetStatus(kakaoVO |
|
| 531 |
+ , templateContentTemp |
|
| 532 |
+ , resultSpamTxt, isHolidayNotified); |
|
| 533 |
+ hasPerformedSpamCheck = true; |
|
| 534 |
+ } |
|
| 535 |
+ // 대체문자 내용 |
|
| 536 |
+ if(StringUtils.isNotEmpty(subMsgTxtTemp)) {
|
|
| 537 |
+ if(replaceSubYN) {
|
|
| 538 |
+ checkSpamAndSetStatus(kakaoVO |
|
| 539 |
+ , subMsgTxtTemp |
|
| 540 |
+ , resultSpamTxt, isHolidayNotified); |
|
| 541 |
+ }else if(!hasPerformedSubSpamCheck) {
|
|
| 542 |
+ checkSpamAndSetStatus(kakaoVO |
|
| 543 |
+ , subMsgTxtTemp |
|
| 544 |
+ , resultSpamTxt, isHolidayNotified); |
|
| 545 |
+ hasPerformedSubSpamCheck = true; |
|
| 546 |
+ } |
|
| 497 | 547 |
|
| 498 |
- // 타이틀과 버튼이 있고 |
|
| 548 |
+ } |
|
| 549 |
+ } |
|
| 550 |
+ |
|
| 551 |
+ log.info(" kakaoVO.toString() :: [{}]",kakaoVO.ftToString());
|
|
| 552 |
+ |
|
| 553 |
+ |
|
| 554 |
+ /* @isHolidayNotified |
|
| 555 |
+ * - 관리자 알림 설정으로 인해 |
|
| 556 |
+ * - 해당 시간이면 지연 미처리 |
|
| 557 |
+ * @smishingYn |
|
| 558 |
+ * - 회원 별 '스미싱 온' 상태값 |
|
| 559 |
+ * - Y면 알림, 지연 처리해야 함 |
|
| 560 |
+ * */ |
|
| 561 |
+ if("Y".equalsIgnoreCase(smishingYn) && isHolidayNotified) {
|
|
| 562 |
+ kakaoVO.setSpamStatus("Y");
|
|
| 563 |
+ kakaoVO.setSmishingYn("Y");
|
|
| 564 |
+ kakaoVO.setAtDelayYn("Y");
|
|
| 565 |
+ } |
|
| 566 |
+ |
|
| 567 |
+ // 지연 여부 처리 |
|
| 568 |
+ if (( "Y".equalsIgnoreCase(smishingYn) || "Y".equalsIgnoreCase(kakaoVO.getAtDelayYn())) |
|
| 569 |
+ && !hasPerformedDelayYn && isHolidayNotified) {
|
|
| 570 |
+ calendar.add(Calendar.MINUTE, 30); // 모든 시간을 30분 뒤로 미룸 |
|
| 571 |
+ // TEST |
|
| 572 |
+// calendar.add(Calendar.MINUTE, 5); // 모든 시간을 30분 뒤로 미룸 |
|
| 573 |
+ hasPerformedDelayYn = true; |
|
| 574 |
+ } |
|
| 575 |
+ |
|
| 576 |
+ sendVO.setReqDate(sdf.format(calendar.getTime())); // 분할된 시간 설정 또는 기본 예약 시간 사용 |
|
| 577 |
+ |
|
| 578 |
+ |
|
| 579 |
+ |
|
| 580 |
+ |
|
| 581 |
+ // 타이틀이나 버튼이 있고 |
|
| 499 | 582 |
if(hasButtons || StringUtils.isNotEmpty(kakaoVO.getTemplateImageUrl())) {
|
| 500 | 583 |
// |
| 501 | 584 |
if (StringUtils.isEmpty(sharedJsonStr)) {
|
... | ... | @@ -510,9 +593,113 @@ |
| 510 | 593 |
kakaoSendAdvcListVO.add(sendVO); |
| 511 | 594 |
log.info(" sendVO.toString() :: [{}]",sendVO.toString());
|
| 512 | 595 |
} |
| 513 |
- |
|
| 596 |
+ |
|
| 514 | 597 |
|
| 515 | 598 |
return kakaoSendAdvcListVO; |
| 599 |
+ } |
|
| 600 |
+ |
|
| 601 |
+ private void checkSpamAndSetStatus(KakaoVO kakaoVO |
|
| 602 |
+ , String chkText |
|
| 603 |
+ , List<String> resultSpamTxt, boolean isHolidayNotified) throws Exception {
|
|
| 604 |
+ // TODO Auto-generated method stub |
|
| 605 |
+ |
|
| 606 |
+ |
|
| 607 |
+ kakaoVO.setSpamStatus("N");
|
|
| 608 |
+ kakaoVO.setAtDelayYn("N");
|
|
| 609 |
+ |
|
| 610 |
+ if(StringUtils.isNotEmpty(chkText)) {
|
|
| 611 |
+ |
|
| 612 |
+ String resultParser = ComGetSpamStringParser.getSpamTextParse(chkText).trim(); |
|
| 613 |
+ int spmCnt = 0; |
|
| 614 |
+ String spmFilterTxt = ""; |
|
| 615 |
+ |
|
| 616 |
+ for (String spmTxt : resultSpamTxt) {
|
|
| 617 |
+ String parserStr = ComGetSpamStringParser.getSpamTextParse(spmTxt).trim(); |
|
| 618 |
+ if (resultParser.contains(parserStr)) {
|
|
| 619 |
+ spmCnt++; |
|
| 620 |
+ spmFilterTxt += spmTxt + ","; |
|
| 621 |
+ } |
|
| 622 |
+ } |
|
| 623 |
+ |
|
| 624 |
+ if (spmCnt > 0) { // 스팸 문자가 포함된 경우
|
|
| 625 |
+ |
|
| 626 |
+ if (StringUtil.getWordRight(spmFilterTxt.trim(), 1).equals(",")) {
|
|
| 627 |
+ // 처음부터 idx 만큼 잘라낸 나머지 글자 |
|
| 628 |
+ spmFilterTxt = StringUtil.getWordLeft(spmFilterTxt.trim(), 1); |
|
| 629 |
+ |
|
| 630 |
+ } |
|
| 631 |
+ |
|
| 632 |
+ /* @isHolidayNotified |
|
| 633 |
+ * - 관리자 알림 설정으로 인해 |
|
| 634 |
+ * - 해당 시간이면 지연 미처리 |
|
| 635 |
+ * */ |
|
| 636 |
+ kakaoVO.setSpamStatus("Y");
|
|
| 637 |
+ if(isHolidayNotified) {
|
|
| 638 |
+ kakaoVO.setAtDelayYn("Y");
|
|
| 639 |
+ } |
|
| 640 |
+ } |
|
| 641 |
+ } |
|
| 642 |
+ |
|
| 643 |
+ |
|
| 644 |
+ } |
|
| 645 |
+ |
|
| 646 |
+ // TODO(human): 아래에 새로운 메소드 구현 |
|
| 647 |
+ /** |
|
| 648 |
+ * 대체문자 가격 계산 최적화 메소드 |
|
| 649 |
+ * @param subMsgTxt 대체문자 내용 |
|
| 650 |
+ * @param imgFilePath 이미지 파일 경로 |
|
| 651 |
+ * @param shortPrice 단문 가격 |
|
| 652 |
+ * @param longPrice 장문 가격 |
|
| 653 |
+ * @param picturePrice 사진 가격 |
|
| 654 |
+ * @param kakaoFtPrice 카카오 친구톡 가격 |
|
| 655 |
+ * @return 계산 결과 Map (sendType, chosenPrice, filePath 포함) |
|
| 656 |
+ * @throws UnsupportedEncodingException |
|
| 657 |
+ */ |
|
| 658 |
+ private Map<String, Object> calculateSubMsgPricing(String subMsgTxt, String imgFilePath, |
|
| 659 |
+ float shortPrice, float longPrice, |
|
| 660 |
+ float picturePrice, float kakaoFtPrice) throws UnsupportedEncodingException {
|
|
| 661 |
+ Map<String, Object> result = new HashMap<>(); |
|
| 662 |
+ |
|
| 663 |
+ String sendType = "MMS"; |
|
| 664 |
+ if(StringUtils.isEmpty(imgFilePath)) {
|
|
| 665 |
+ int smsTxtByte = mjonCommon.getSmsTxtBytes(subMsgTxt); |
|
| 666 |
+ sendType = getMsgType(smsTxtByte); |
|
| 667 |
+ } |
|
| 668 |
+ |
|
| 669 |
+ result.put("sendType", sendType);
|
|
| 670 |
+ |
|
| 671 |
+ // INVALID인 경우 추가 처리 없이 반환 |
|
| 672 |
+ if ("INVALID".equals(sendType)) {
|
|
| 673 |
+ return result; |
|
| 674 |
+ } |
|
| 675 |
+ |
|
| 676 |
+ float chosenPrice = 0f; |
|
| 677 |
+ if(StringUtils.isNotEmpty(imgFilePath)) {
|
|
| 678 |
+ chosenPrice = Math.max(picturePrice, kakaoFtPrice); |
|
| 679 |
+ result.put("filePath", imgFilePath);
|
|
| 680 |
+ } else if ("MMS".equals(sendType)) {
|
|
| 681 |
+ chosenPrice = Math.max(longPrice, kakaoFtPrice); |
|
| 682 |
+ } else {
|
|
| 683 |
+ chosenPrice = Math.max(shortPrice, kakaoFtPrice); |
|
| 684 |
+ } |
|
| 685 |
+ |
|
| 686 |
+ result.put("sendType", sendType);
|
|
| 687 |
+ result.put("chosenPrice", Float.toString(chosenPrice));
|
|
| 688 |
+ return result; |
|
| 689 |
+ } |
|
| 690 |
+ |
|
| 691 |
+ /** |
|
| 692 |
+ * 가격 계산 결과를 sendVO에 적용하는 헬퍼 메소드 |
|
| 693 |
+ * @param sendVO 적용할 KakaoSendAdvcVO 객체 |
|
| 694 |
+ * @param pricingResult 가격 계산 결과 Map |
|
| 695 |
+ */ |
|
| 696 |
+ private void applyPricingResult(KakaoSendAdvcVO sendVO, Map<String, Object> pricingResult) {
|
|
| 697 |
+ sendVO.setSubMsgType((String) pricingResult.get("sendType"));
|
|
| 698 |
+ sendVO.setEachPrice((String) pricingResult.get("chosenPrice"));
|
|
| 699 |
+ if (pricingResult.get("filePath") != null) {
|
|
| 700 |
+ sendVO.setFilePath1((String) pricingResult.get("filePath"));
|
|
| 701 |
+ sendVO.setFileCnt("1");
|
|
| 702 |
+ } |
|
| 516 | 703 |
} |
| 517 | 704 |
|
| 518 | 705 |
public static String getMsgTypeWithByteValidation(MjonFTSendVO sendVO, String p_smsTxt) throws UnsupportedEncodingException {
|
... | ... | @@ -543,9 +730,21 @@ |
| 543 | 730 |
} |
| 544 | 731 |
return msgType; |
| 545 | 732 |
} |
| 546 |
- |
|
| 547 | 733 |
|
| 548 |
- private Calendar setupBaseDate(KakaoVO kakaoVO, boolean isNotified) throws ParseException {
|
|
| 734 |
+ |
|
| 735 |
+ private Calendar setupBaseDateFT(KakaoVO kakaoVO) throws ParseException {
|
|
| 736 |
+ |
|
| 737 |
+ // baseDate 추출 |
|
| 738 |
+ Date baseDate = resolveBaseDate(kakaoVO); |
|
| 739 |
+ |
|
| 740 |
+ // 시간 성정 |
|
| 741 |
+ Calendar calendar = Calendar.getInstance(); |
|
| 742 |
+ calendar.setTime(baseDate); // calendar에 baseDate 설정 |
|
| 743 |
+ |
|
| 744 |
+ return calendar; |
|
| 745 |
+ } |
|
| 746 |
+ |
|
| 747 |
+ private Calendar setupBaseDate(KakaoVO kakaoVO, boolean isHolidayNotified) throws ParseException {
|
|
| 549 | 748 |
|
| 550 | 749 |
// baseDate 추출 |
| 551 | 750 |
Date baseDate = resolveBaseDate(kakaoVO); |
... | ... | @@ -557,7 +756,7 @@ |
| 557 | 756 |
// 지연 여부 처리 |
| 558 | 757 |
// 알림톡 스미싱의심 + 공휴일알림 조건이 맞으면 30분 delay |
| 559 | 758 |
if ( "Y".equalsIgnoreCase(kakaoVO.getAtSmishingYn()) |
| 560 |
- && isNotified) {
|
|
| 759 |
+ && isHolidayNotified) {
|
|
| 561 | 760 |
calendar.add(Calendar.MINUTE, 30); // 모든 시간을 30분 뒤로 미룸 |
| 562 | 761 |
} |
| 563 | 762 |
return calendar; |
... | ... | @@ -1688,7 +1887,7 @@ |
| 1688 | 1887 |
Float totPrice = eachPrice * instCnt; |
| 1689 | 1888 |
sendVO.setTotPrice(String.format("%.1f", totPrice));
|
| 1690 | 1889 |
|
| 1691 |
- sendVO.setAtDelayYn(kakaoVO.getAtSmishingYn()); |
|
| 1890 |
+ sendVO.setAtDelayYn(kakaoVO.getAtDelayYn()); |
|
| 1692 | 1891 |
sendVO.setBizKakaoResendOrgnlTxt(kakaoVO.getSubMsgTxt()); |
| 1693 | 1892 |
sendVO.setBizKakaoResendType(sendVO.getSubMsgType()); |
| 1694 | 1893 |
sendVO.setBizKakaoImageType(kakaoVO.getImageType()); |
--- src/main/java/itn/let/kakao/kakaoComm/KakaoVO.java
+++ src/main/java/itn/let/kakao/kakaoComm/KakaoVO.java
... | ... | @@ -358,6 +358,7 @@ |
| 358 | 358 |
sb.append("\n , spamStatus=[").append(getSpamStatus()).append("]");
|
| 359 | 359 |
sb.append("\n , txtReplYn=[").append(getTxtReplYn()).append("]");
|
| 360 | 360 |
sb.append("\n , atSmishingYn=[").append(getAtSmishingYn()).append("]");
|
| 361 |
+ sb.append("\n , atDelayYn=[").append(getAtDelayYn()).append("]");
|
|
| 361 | 362 |
// sb.append("\n , tmpBtnSelect=[").append(getTmpBtnSelect()).append("]");
|
| 362 | 363 |
StringBuilder btnListSb = new StringBuilder("[");
|
| 363 | 364 |
if (buttonVOList != null && !buttonVOList.isEmpty()) {
|
--- src/main/java/itn/let/kakao/user/kakaoFt/service/impl/KakaoFriendsTalkServiceImpl.java
+++ src/main/java/itn/let/kakao/user/kakaoFt/service/impl/KakaoFriendsTalkServiceImpl.java
... | ... | @@ -29,8 +29,10 @@ |
| 29 | 29 |
import itn.let.mjo.mjocommon.MjonCommon; |
| 30 | 30 |
import itn.let.mjo.msg.service.MjonMsgVO; |
| 31 | 31 |
import itn.let.mjo.msg.service.impl.MjonMsgDAO; |
| 32 |
+import itn.let.mjo.msgdata.service.MjonMsgDataService; |
|
| 32 | 33 |
import itn.let.module.base.PriceAndPoint; |
| 33 | 34 |
import itn.let.uss.umt.service.EgovUserManageService; |
| 35 |
+import itn.let.uss.umt.service.UserManageVO; |
|
| 34 | 36 |
import lombok.extern.slf4j.Slf4j; |
| 35 | 37 |
|
| 36 | 38 |
@Slf4j |
... | ... | @@ -56,6 +58,9 @@ |
| 56 | 58 |
|
| 57 | 59 |
@Resource(name="kakaoAlimTalkDAO") |
| 58 | 60 |
private KakaoAlimTalkDAO kakaoAlimTalkDAO; |
| 61 |
+ |
|
| 62 |
+ @Resource(name = "MjonMsgDataService") |
|
| 63 |
+ private MjonMsgDataService mjonMsgDataService; |
|
| 59 | 64 |
|
| 60 | 65 |
@Autowired |
| 61 | 66 |
KakaoSendUtil kakaoSendUtil; |
... | ... | @@ -70,9 +75,9 @@ |
| 70 | 75 |
public StatusResponse insertKakaoFtSandAjax_advc(KakaoVO kakaoVO, HttpServletRequest request) throws Exception {
|
| 71 | 76 |
StatusResponse statusResponse = new StatusResponse(); |
| 72 | 77 |
|
| 73 |
- log.info(" + kakaoVO.toString() :: [{}]", kakaoVO.toString());
|
|
| 78 |
+// log.info(" + kakaoVO.toString() :: [{}]", kakaoVO.toString());
|
|
| 74 | 79 |
|
| 75 |
- log.info(" + kakaoVO.toString() :: [{}]", kakaoVO.ftToString());
|
|
| 80 |
+// log.info(" + kakaoVO.toString() :: [{}]", kakaoVO.ftToString());
|
|
| 76 | 81 |
|
| 77 | 82 |
|
| 78 | 83 |
|
... | ... | @@ -118,12 +123,17 @@ |
| 118 | 123 |
/** @isHolidayNotified |
| 119 | 124 |
* @false : 알림 X |
| 120 | 125 |
* @true : 알림 O */ |
| 121 |
- boolean isNotified = mjonCommon.processUserAndCheckAT(kakaoVO); |
|
| 126 |
+ boolean isHolidayNotified = mjonCommon.processUserAndCheckFT(kakaoVO); |
|
| 122 | 127 |
|
| 128 |
+ |
|
| 129 |
+ UserManageVO userManageVO = mjonCommon.getUserManageInfo(userId); |
|
| 123 | 130 |
|
| 131 |
+ |
|
| 132 |
+ // 스팸관련 키워드 select |
|
| 133 |
+ List<String> resultSpamTxt = mjonMsgDataService.selectSpamKeywordList(); |
|
| 124 | 134 |
|
| 125 | 135 |
/** @카카오톡 전송 list 셋팅 -------------------------------------------*/ |
| 126 |
- List<KakaoSendAdvcVO> kakaoSendAdvcListVO = kakaoSendUtil.populateSendListsFT(kakaoVO, isNotified, statusResponse); |
|
| 136 |
+ List<KakaoSendAdvcVO> kakaoSendAdvcListVO = kakaoSendUtil.populateSendListsFT(kakaoVO, isHolidayNotified, statusResponse, userManageVO, resultSpamTxt); |
|
| 127 | 137 |
if (statusResponse.getStatus() != null && !statusResponse.getStatus().equals(HttpStatus.OK)) {
|
| 128 | 138 |
log.error(" + populateSendLists 처리 중 오류 발생: {}", statusResponse.getMessage());
|
| 129 | 139 |
return statusResponse; |
... | ... | @@ -189,7 +199,7 @@ |
| 189 | 199 |
|
| 190 | 200 |
/** @SLACK발송 */ |
| 191 | 201 |
/** @발송조건이되면 발송 */ |
| 192 |
- if(isNotified) {
|
|
| 202 |
+ if(isHolidayNotified && "Y".equals(userManageVO.getAtSmishingYn())) {
|
|
| 193 | 203 |
mjonCommon.getAdminKakaoAtSendSlack(sendVO); |
| 194 | 204 |
}else if("Y".equals(kakaoVO.getAtSmishingYn())){
|
| 195 | 205 |
/** @발송조건이 안되면 DB INSERT */ |
--- src/main/java/itn/let/mjo/mjocommon/MjonCommon.java
+++ src/main/java/itn/let/mjo/mjocommon/MjonCommon.java
... | ... | @@ -533,12 +533,12 @@ |
| 533 | 533 |
UserManageVO userManageVO = getUserManageInfo(kakaoVO.getUserId()); |
| 534 | 534 |
|
| 535 | 535 |
// 기본값 처리된 사용자 정보와 문자 상태 |
| 536 |
- String adminSmsNoticeYn = userManageVO.getAdminSmsNoticeYn(); |
|
| 537 |
- String atSmishingYn = userManageVO.getAtSmishingYn(); |
|
| 536 |
+ String adminSmsNoticeYn = userManageVO.getAdminSmsNoticeYn(); // 법인폰 알람 여부 - Y : ON |
|
| 537 |
+ String atSmishingYn = userManageVO.getAtSmishingYn(); // 스미싱 의심 - Y : ON |
|
| 538 | 538 |
|
| 539 | 539 |
// 조건 체크 |
| 540 | 540 |
if ("Y".equals(adminSmsNoticeYn) || "Y".equals(atSmishingYn)) {
|
| 541 |
- kakaoVO.setAtSmishingYn("Y"); // MjonMsgVO에 스미싱 정보 설정
|
|
| 541 |
+ kakaoVO.setAtSmishingYn("Y"); // MjonMsgVO에 스미싱 정보 설정 - Y면 디
|
|
| 542 | 542 |
|
| 543 | 543 |
// 스미싱 알림 처리 |
| 544 | 544 |
return handleSmishingAlert(); // 알림 처리 결과 반환 |
... | ... | @@ -546,6 +546,46 @@ |
| 546 | 546 |
|
| 547 | 547 |
return false; // 알림 처리되지 않음 |
| 548 | 548 |
} |
| 549 |
+ |
|
| 550 |
+ |
|
| 551 |
+ /** |
|
| 552 |
+ * @methodName : processUserAndCheckFT |
|
| 553 |
+ * @author : 이호영 |
|
| 554 |
+ * @date : 2025. 8. 21. |
|
| 555 |
+ * @description : |
|
| 556 |
+ * @return : boolean |
|
| 557 |
+ * @param kakaoVO |
|
| 558 |
+ * @return |
|
| 559 |
+ * @throws Exception |
|
| 560 |
+ * |
|
| 561 |
+ * @isHolidayNotified |
|
| 562 |
+ * @false : 알림 X |
|
| 563 |
+ * @true : 알림 O |
|
| 564 |
+ * |
|
| 565 |
+ */ |
|
| 566 |
+ public boolean processUserAndCheckFT(KakaoVO kakaoVO) throws Exception {
|
|
| 567 |
+// UserManageVO userManageVO = getUserManageInfo(kakaoVO.getUserId()); |
|
| 568 |
+// kakaoVO.setAtSmishingYn("N"); // MjonMsgVO에 스미싱 정보 설정 - Y면 딜레이 처리 됨
|
|
| 569 |
+ |
|
| 570 |
+ |
|
| 571 |
+ // 기본값 처리된 사용자 정보와 문자 상태 |
|
| 572 |
+// String adminSmsNoticeYn = userManageVO.getAdminSmsNoticeYn(); // 법인폰 알람 여부 - Y : ON |
|
| 573 |
+// String atSmishingYn = userManageVO.getAtSmishingYn(); // 스미싱 의심 - Y : ON !== mj_msg_group_data와 다른거임 |
|
| 574 |
+ |
|
| 575 |
+ // 조건 체크 |
|
| 576 |
+// if ("Y".equals(adminSmsNoticeYn) || "Y".equals(atSmishingYn)) {
|
|
| 577 |
+// if ("Y".equals(atSmishingYn)) {
|
|
| 578 |
+// Boolean B_return = handleSmishingAlert(); |
|
| 579 |
+// if(B_return) { // true면 알림ON이라서 스미싱Yn을 Y로 설정 아니면 N / 나머지는 로직에서 처리
|
|
| 580 |
+// kakaoVO.setAtSmishingYn(atSmishingYn); // MjonMsgVO에 스미싱 정보 설정 - Y면 딜레이 처리 됨 |
|
| 581 |
+// } |
|
| 582 |
+ // 스미싱 알림 처리 |
|
| 583 |
+// return B_return; // 알림 처리 결과 반환 |
|
| 584 |
+// } |
|
| 585 |
+ |
|
| 586 |
+ return handleSmishingAlert(); // 알림 처리되지 않음 |
|
| 587 |
+ } |
|
| 588 |
+ |
|
| 549 | 589 |
|
| 550 | 590 |
// 사용자 정보 조회 및 기본값 처리 |
| 551 | 591 |
public UserManageVO getUserManageInfo(String userId) throws Exception {
|
Add a comment
Delete comment
Once you delete this comment, you won't be able to recover it. Are you sure you want to delete this comment?