--- src/main/java/itn/let/kakao/admin/kakaoAt/web/MjonKakaoATController.java
+++ src/main/java/itn/let/kakao/admin/kakaoAt/web/MjonKakaoATController.java
... | ... | @@ -796,9 +796,16 @@ |
| 796 | 796 |
String lastUpdtPnttm = resultChannelList.get(i).getLastUpdtPnttm(); |
| 797 | 797 |
kakaoProfileVO.setSenderKey(senderKey); |
| 798 | 798 |
kakaoProfileVO.setProfileId(profileId); |
| 799 |
- |
|
| 800 |
- KakaoReturnVO tmpProfileVO = kakaoApiProfile.kakaoApiProfileList(kakaoProfileVO); |
|
| 801 |
- |
|
| 799 |
+ KakaoReturnVO tmpProfileVO = null; |
|
| 800 |
+// try {
|
|
| 801 |
+// |
|
| 802 |
+// tmpProfileVO = kakaoApiProfile.kakaoApiProfileList(kakaoProfileVO); |
|
| 803 |
+// } catch (Exception e) {
|
|
| 804 |
+// e.printStackTrace(); |
|
| 805 |
+// // TODO: handle exception |
|
| 806 |
+// } |
|
| 807 |
+ |
|
| 808 |
+ tmpProfileVO = kakaoApiProfile.kakaoApiProfileList(kakaoProfileVO); |
|
| 802 | 809 |
ChannelIDVO returnChannelVO = new ChannelIDVO(); |
| 803 | 810 |
|
| 804 | 811 |
returnChannelVO.setSenderKey(tmpProfileVO.getSenderKey()); |
--- src/main/java/itn/let/kakao/kakaoComm/KakaoSendAdvcVO.java
+++ src/main/java/itn/let/kakao/kakaoComm/KakaoSendAdvcVO.java
... | ... | @@ -83,7 +83,7 @@ |
| 83 | 83 |
"\n , msgType=[" + msgType + "]" + |
| 84 | 84 |
"\n , templateContent=[" + templateContent + "]" + |
| 85 | 85 |
"\n , templateTitle=[" + templateTitle + "]" + |
| 86 |
- "\n , buttonList=[" + buttonList.toString() + "]" + |
|
| 86 |
+ "\n , buttonList=[" + (buttonList != null ? buttonList.toString() : "") + "]" + |
|
| 87 | 87 |
"\n , subMsgSendYn=[" + subMsgSendYn + "]" + |
| 88 | 88 |
"\n , subMsgTxt=[" + subMsgTxt + "]" + |
| 89 | 89 |
"\n , subMsgType=[" + subMsgType + "]" + |
--- src/main/java/itn/let/kakao/kakaoComm/KakaoSendUtil.java
+++ src/main/java/itn/let/kakao/kakaoComm/KakaoSendUtil.java
... | ... | @@ -1,6 +1,8 @@ |
| 1 | 1 |
package itn.let.kakao.kakaoComm; |
| 2 | 2 |
|
| 3 | 3 |
import java.io.UnsupportedEncodingException; |
| 4 |
+import java.math.BigDecimal; |
|
| 5 |
+import java.math.RoundingMode; |
|
| 4 | 6 |
import java.text.ParseException; |
| 5 | 7 |
import java.text.SimpleDateFormat; |
| 6 | 8 |
import java.util.ArrayList; |
... | ... | @@ -28,6 +30,7 @@ |
| 28 | 30 |
import itn.com.cmm.util.StringUtil; |
| 29 | 31 |
import itn.let.kakao.kakaoComm.kakaoApi.KakaoApiJsonSave; |
| 30 | 32 |
import itn.let.kakao.kakaoComm.kakaoApi.KakaoApiTemplate; |
| 33 |
+import itn.let.kakao.user.kakaoAt.service.impl.KakaoAlimTalkDAO; |
|
| 31 | 34 |
import itn.let.mail.service.StatusResponse; |
| 32 | 35 |
import itn.let.mjo.mjocommon.MjonCommon; |
| 33 | 36 |
import itn.let.mjo.msg.service.MjonMsgVO; |
... | ... | @@ -44,6 +47,9 @@ |
| 44 | 47 |
|
| 45 | 48 |
@Autowired |
| 46 | 49 |
KakaoApiJsonSave kakaoApiJsonSave; |
| 50 |
+ |
|
| 51 |
+ @Resource(name="kakaoAlimTalkDAO") |
|
| 52 |
+ private KakaoAlimTalkDAO kakaoAlimTalkDAO; |
|
| 47 | 53 |
|
| 48 | 54 |
@Resource(name = "MjonMsgDataService") |
| 49 | 55 |
private MjonMsgDataService mjonMsgDataService; |
... | ... | @@ -56,6 +62,7 @@ |
| 56 | 62 |
|
| 57 | 63 |
@Autowired |
| 58 | 64 |
private MjonCommon mjonCommon; |
| 65 |
+ |
|
| 59 | 66 |
|
| 60 | 67 |
// 클래스 수준에서 정적 Pattern 정의 (성능 최적화) |
| 61 | 68 |
private static final Pattern REPLACEMENT_PATTERN = Pattern.compile("#\\{[^}]+\\}");
|
... | ... | @@ -142,7 +149,7 @@ |
| 142 | 149 |
log.info("");
|
| 143 | 150 |
|
| 144 | 151 |
/** @공통 기본값 */ |
| 145 |
- KakaoSendAdvcVO sendVO = createSendVO(kakaoVO); |
|
| 152 |
+ KakaoSendAdvcVO sendVO = createATSendVO(kakaoVO); |
|
| 146 | 153 |
String msgId = idList.get(i); |
| 147 | 154 |
sendVO.setMsgId(msgId); |
| 148 | 155 |
|
... | ... | @@ -293,33 +300,16 @@ |
| 293 | 300 |
//사용자 현재 보유 금액 불러오기(문자 발송 금액 차감 이전 금액) |
| 294 | 301 |
// String befCash = kakaoVO.getBefCash(); |
| 295 | 302 |
|
| 296 |
- |
|
| 303 |
+ log.info(" [{}]", kakaoVO.ftToString());
|
|
| 297 | 304 |
|
| 298 | 305 |
List<KakaoSendAdvcVO> kakaoSendAdvcListVO = new ArrayList<>(); |
| 299 | 306 |
Calendar calendar = setupBaseDate(kakaoVO, isNotified); |
| 300 | 307 |
|
| 301 | 308 |
|
| 302 |
- |
|
| 303 |
- String templateContent = kakaoVO.getTemplateContent(); // 친구톡 내용 |
|
| 304 |
-// kakaoVO.setTemplateContent(templateContent); |
|
| 305 |
-// String templateTitle = templateDetail.getTemplateTitle(); |
|
| 306 |
- |
|
| 307 |
- |
|
| 308 |
-// log.info(" + templateDetail :: [{}]", templateDetail);
|
|
| 309 |
-// templateDetail.getButtonList().forEach(t->log.info(" + ButtonList :: [{}]", t.toString()));
|
|
| 310 |
- |
|
| 311 |
- Boolean hasContentReplacement = this.replBooleanStrChecker(templateContent); |
|
| 312 |
-// Boolean hasTitleReplacement = this.replBooleanStrChecker(templateTitle); |
|
| 313 |
-// Boolean hasButtonReplacement = this.needsButtonReplacement(templateDetail.getButtonList()); |
|
| 314 |
- |
|
| 315 |
- /** @jsonStr 필요유무 */ |
|
| 316 |
- boolean hasTitleOrButtons = CollectionUtils.isNotEmpty(kakaoVO.getButtonVOList()); |
|
| 317 |
- |
|
| 318 |
- /** @jsonStr 반복유무 */ |
|
| 319 |
-// boolean needsJsonReplacement = hasTitleReplacement || hasButtonReplacement; |
|
| 320 |
- String sharedJsonStr = null; |
|
| 321 |
- |
|
| 322 |
- String subMsgTxt = kakaoVO.getSubMsgTxt(); // 실패 대체 문자 |
|
| 309 |
+ // 친구톡 내용 |
|
| 310 |
+ String templateContent = kakaoVO.getTemplateContent(); |
|
| 311 |
+ // 실패 대체 문자 |
|
| 312 |
+ String subMsgTxt = kakaoVO.getSubMsgTxt(); |
|
| 323 | 313 |
|
| 324 | 314 |
// 시스템 기본 단가 정보 불러오기 |
| 325 | 315 |
JoinSettingVO sysJoinSetVO = mjonMsgDataService.selectJoinSettingInfo(); |
... | ... | @@ -327,14 +317,15 @@ |
| 327 | 317 |
MberManageVO mberManageVO = mjonMsgDataService.selectMberManageInfo(kakaoVO.getUserId()); |
| 328 | 318 |
|
| 329 | 319 |
|
| 330 |
- String smsTxtTemp = templateContent; |
|
| 320 |
+ // 치환 문구가 있는지 확인 |
|
| 331 | 321 |
Boolean replaceYN = MsgSendUtils.getReplaceYN(templateContent); |
| 322 |
+ Boolean replaceSubYN = MsgSendUtils.getReplaceYN(subMsgTxt); |
|
| 332 | 323 |
|
| 333 | 324 |
boolean hasPerformedMsgType = false; // 치환 문자가 없는 경우, 스팸 체크가 한 번만 수행되도록 제어 |
| 334 | 325 |
|
| 335 | 326 |
|
| 336 | 327 |
/** @MSGID KEY값 */ |
| 337 |
- List<String> idList = mjonCommon.getNextCustomMsgCId(kakaoVO.getVarListMap().size()); |
|
| 328 |
+ List<String> idList = mjonCommon.getNextCustomMsgCId(kakaoVO.getMjonFTSendVOList().size()); |
|
| 338 | 329 |
|
| 339 | 330 |
|
| 340 | 331 |
Map<String, Function<MjonFTSendVO, String>> placeholders = new HashMap<>(); |
... | ... | @@ -345,97 +336,114 @@ |
| 345 | 336 |
placeholders.put("[*4*]", MjonFTSendVO::getRep4);
|
| 346 | 337 |
|
| 347 | 338 |
|
| 339 |
+ // 친구통 금액 |
|
| 340 |
+ Float kakaoFtPrice = mberManageVO.getKakaoFtPrice(); |
|
| 341 |
+ |
|
| 342 |
+ // 대체문자가 있을경우 사용 |
|
| 343 |
+ float shortPrice = getValidPrice(mberManageVO.getShortPrice(), sysJoinSetVO.getShortPrice()); |
|
| 344 |
+ float longPrice = getValidPrice(mberManageVO.getLongPrice(), sysJoinSetVO.getLongPrice()); |
|
| 345 |
+ |
|
| 346 |
+ String shortPStr = Float.toString(shortPrice); |
|
| 347 |
+ String mmsPStr = Float.toString(longPrice); |
|
| 348 | 348 |
|
| 349 |
- String msgTypeResult = null; |
|
| 349 |
+ |
|
| 350 |
+ /** @jsonStr 필요유무 */ |
|
| 351 |
+ boolean hasTitleOrButtons = CollectionUtils.isNotEmpty(kakaoVO.getButtonVOList()); |
|
| 352 |
+ String sharedJsonStr = null; |
|
| 353 |
+ |
|
| 354 |
+ |
|
| 355 |
+ |
|
| 350 | 356 |
List<MjonFTSendVO> mjonFTSendVOList = kakaoVO.getMjonFTSendVOList(); |
| 351 | 357 |
|
| 352 | 358 |
// 분할 건수 카운터 |
| 353 | 359 |
int counter = 0; |
| 354 |
- for (MjonFTSendVO sendVO : mjonFTSendVOList) {
|
|
| 355 |
- KakaoSendAdvcVO kakaoSendAdvcVO = new KakaoSendAdvcVO(); |
|
| 356 |
- |
|
| 357 |
- kakaoSendAdvcVO.setCallFrom(kakaoVO.getCallFrom()); |
|
| 358 |
- kakaoSendAdvcVO.setCallTo(sendVO.getPhone()); |
|
| 359 |
- kakaoSendAdvcVO.setUserId(kakaoVO.getUserId()); |
|
| 360 |
+ for (int i = 0; i < mjonFTSendVOList.size(); i++) {
|
|
| 361 |
+ MjonFTSendVO mjonFTSendVO = mjonFTSendVOList.get(i); |
|
| 360 | 362 |
|
| 361 |
- String smsTxt = smsTxtTemp; |
|
| 363 |
+ KakaoSendAdvcVO sendVO = createFTSendVO(kakaoVO, calendar); |
|
| 364 |
+ // 공통 가격 설정 |
|
| 365 |
+ sendVO.setSmsPrice(shortPStr); |
|
| 366 |
+ sendVO.setMmsPrice(mmsPStr); |
|
| 367 |
+ |
|
| 368 |
+ sendVO.setCallTo(mjonFTSendVO.getPhone()); |
|
| 369 |
+ sendVO.setMsgId(idList.get(i)); |
|
| 370 |
+ |
|
| 371 |
+ String smsTxt = templateContent; |
|
| 362 | 372 |
// 치환 문자면 |
| 363 | 373 |
if(replaceYN) {
|
| 364 | 374 |
|
| 365 | 375 |
// 각 치환 구문을 확인하고 치환할 값이 없으면 오류 반환 |
| 366 | 376 |
for (Map.Entry<String, Function<MjonFTSendVO, String>> entry : placeholders.entrySet()) {
|
| 367 | 377 |
String placeholder = entry.getKey(); |
| 368 |
- String value = entry.getValue().apply(sendVO); |
|
| 369 |
-// log.info(" + smsTxtTemp [{}]", smsTxtTemp);
|
|
| 370 |
-// log.info(" + placeholder [{}]", placeholder);
|
|
| 371 |
-// log.info(" + value [{}]", value);
|
|
| 372 |
-// log.info(" + smsTxtTemp.contains(placeholder) [{}]", smsTxtTemp.contains(placeholder));
|
|
| 378 |
+ String value = entry.getValue().apply(mjonFTSendVO); |
|
| 373 | 379 |
if (smsTxt.contains(placeholder)) {
|
| 374 | 380 |
if (StringUtils.isEmpty(value)) {
|
| 375 | 381 |
statusResponseSet(statusResponse, HttpStatus.BAD_REQUEST, "치환 문구중 " + placeholder + " 데이터가 없습니다."); |
| 376 |
- return false; |
|
| 382 |
+ return null; |
|
| 377 | 383 |
} |
| 378 | 384 |
smsTxt = smsTxt.replace(placeholder, value); |
| 379 |
-// log.info(" + smsTxt [{}]", smsTxt);
|
|
| 380 |
- |
|
| 381 | 385 |
} |
| 382 | 386 |
} |
| 383 | 387 |
} |
| 384 |
- |
|
| 385 |
- String smsSpamChkTxt = smsTxt; |
|
| 386 |
- if(StringUtils.isNotEmpty(smsTxt)) {
|
|
| 387 |
- smsSpamChkTxt = smsTxt.replaceAll(String.valueOf((char) 13), ""); |
|
| 388 |
- } |
|
| 389 |
- |
|
| 388 |
+ sendVO.setTemplateContent(smsTxt); |
|
| 390 | 389 |
|
| 391 | 390 |
|
| 392 |
- // == 치환 여부에 따라 처리 로직 분기 == |
|
| 393 |
- // 치환 문자가 아닌 경우 |
|
| 394 |
- if (!replaceYN) {
|
|
| 395 |
- if (!hasPerformedMsgType) {
|
|
| 396 |
- msgTypeResult = getMsgTypeWithByteValidation(sendVO, smsTxt); |
|
| 397 |
- if ("INVALID".equals(msgTypeResult)) {
|
|
| 398 |
- statusResponseSet(statusResponse, HttpStatus.BAD_REQUEST, "문자 치환 후 전송 문자 길이를 초과하였습니다."); |
|
| 399 |
- return null; |
|
| 391 |
+ |
|
| 392 |
+ String subMsgTxtTemp = null; |
|
| 393 |
+ |
|
| 394 |
+ if(StringUtils.isNotEmpty(subMsgTxt)) {
|
|
| 395 |
+ subMsgTxtTemp = subMsgTxt; |
|
| 396 |
+ |
|
| 397 |
+ // 각 치환 구문을 확인하고 치환할 값이 없으면 오류 반환 |
|
| 398 |
+ for (Map.Entry<String, Function<MjonFTSendVO, String>> entry : placeholders.entrySet()) {
|
|
| 399 |
+ String placeholder = entry.getKey(); |
|
| 400 |
+ String value = entry.getValue().apply(mjonFTSendVO); |
|
| 401 |
+ if (subMsgTxtTemp.contains(placeholder)) {
|
|
| 402 |
+ if (StringUtils.isEmpty(value)) {
|
|
| 403 |
+ statusResponseSet(statusResponse, HttpStatus.BAD_REQUEST, "치환 문구중 " + placeholder + " 데이터가 없습니다."); |
|
| 404 |
+ return null; |
|
| 405 |
+ } |
|
| 406 |
+ subMsgTxtTemp = subMsgTxtTemp.replace(placeholder, value); |
|
| 400 | 407 |
} |
| 401 |
- hasPerformedMsgType = true; |
|
| 402 |
- } |
|
| 403 |
- } |
|
| 404 |
- else |
|
| 405 |
- {// 치환 문자인 경우
|
|
| 406 |
- |
|
| 407 |
- // 메시지 타입 체크는 매번 수행 |
|
| 408 |
- msgTypeResult = getMsgTypeWithByteValidation(sendVO, smsTxt); |
|
| 409 |
- if ("INVALID".equals(msgTypeResult)) {
|
|
| 410 |
- statusResponseSet(statusResponse, HttpStatus.BAD_REQUEST, "문자 치환 후 전송 문자 길이를 초과하였습니다."); |
|
| 411 |
- return null; |
|
| 412 | 408 |
} |
| 413 | 409 |
} |
| 410 |
+ sendVO.setSubMsgTxt(subMsgTxtTemp); |
|
| 414 | 411 |
|
| 415 | 412 |
|
| 416 |
- |
|
| 417 |
- |
|
| 418 |
- kakaoSendAdvcVO.setTemplateContent(smsTxt); |
|
| 419 |
- kakaoSendAdvcVO.setMsgType(msgTypeResult); |
|
| 420 |
- |
|
| 421 |
- |
|
| 413 |
+ //대체문자가 있으면 |
|
| 414 |
+ // Step 1-4: 실패 대체 문자 치환데이터 설정 |
|
| 415 |
+ if(StringUtils.isNotEmpty(subMsgTxtTemp)) { // 대체문자가 있나?
|
|
| 416 |
+ int smsTxtByte = mjonCommon.getSmsTxtBytes(subMsgTxtTemp); |
|
| 417 |
+ String sendType = getMsgType(smsTxtByte); |
|
| 418 |
+ sendVO.setSubMsgType(sendType); |
|
| 422 | 419 |
|
| 423 |
- |
|
| 424 |
- // 예약 여부 확인 |
|
| 425 |
- if ("Y".equalsIgnoreCase(kakaoVO.getReserveYn())
|
|
| 426 |
- && "Y".equalsIgnoreCase(kakaoVO.getDivideChk()) |
|
| 427 |
- && counter == Integer.parseInt(kakaoVO.getDivideCnt())) |
|
| 428 |
- {
|
|
| 429 |
- counter = 0; |
|
| 430 |
- calendar.add(Calendar.MINUTE, Integer.parseInt(kakaoVO.getDivideTime())); |
|
| 420 |
+ if ("INVALID".equals(sendType)) {
|
|
| 421 |
+ statusResponseSet(statusResponse, HttpStatus.BAD_REQUEST, "전송 문자 길이를 초과하였습니다.");return kakaoSendAdvcListVO; |
|
| 422 |
+ } |
|
| 423 |
+ |
|
| 424 |
+ boolean isMms = "MMS".equals(sendType); |
|
| 425 |
+ sendVO.setEachPrice(isMms ? mmsPStr : shortPStr); |
|
| 426 |
+ sendVO.setSubMsgTxt(subMsgTxt);// 실패 |
|
| 427 |
+ }else {
|
|
| 428 |
+ kakaoFtPrice = getValidPrice(mberManageVO.getKakaoAtPrice(), sysJoinSetVO.getKakaoAtPrice()); |
|
| 429 |
+ sendVO.setEachPrice( Float.toString(kakaoFtPrice) ); |
|
| 431 | 430 |
} |
| 432 |
- counter++; |
|
| 433 |
- // 즉시 발송인경우 현재 시간 |
|
| 434 |
- // 예약인 경우 위에 설정한 시간 입력 |
|
| 435 |
- kakaoSendAdvcVO.setReqDate(DATE_FORMATTER.format(calendar.getTime())); |
|
| 436 | 431 |
|
| 437 |
- kakaoSendAdvcListVO.add(kakaoSendAdvcVO); |
|
| 432 |
+ |
|
| 433 |
+ // 타이틀과 버튼이 있고 |
|
| 434 |
+ if(hasTitleOrButtons) {
|
|
| 435 |
+ // |
|
| 436 |
+ if (StringUtils.isEmpty(sharedJsonStr)) {
|
|
| 437 |
+ // 치환 데이터가 없고 아직 생성되지 않았으면 한 번만 생성 |
|
| 438 |
+ sharedJsonStr = kakaoApiJsonSave.kakaoApiFTJsonSave_advc(kakaoVO); |
|
| 439 |
+ sendVO.setJsonStr(sharedJsonStr); |
|
| 440 |
+ } |
|
| 441 |
+ sendVO.setBizJsonName(idList.get(0)); |
|
| 442 |
+ |
|
| 443 |
+ } |
|
| 438 | 444 |
|
| 445 |
+ kakaoSendAdvcListVO.add(sendVO); |
|
| 446 |
+ log.info(" sendVO.toString() :: [{}]",sendVO.toString());
|
|
| 439 | 447 |
} |
| 440 | 448 |
|
| 441 | 449 |
|
... | ... | @@ -508,14 +516,40 @@ |
| 508 | 516 |
* @return |
| 509 | 517 |
* |
| 510 | 518 |
*/ |
| 511 |
- private KakaoSendAdvcVO createSendVO(KakaoVO kakaoVO) {
|
|
| 519 |
+ private KakaoSendAdvcVO createATSendVO(KakaoVO kakaoVO) {
|
|
| 512 | 520 |
KakaoSendAdvcVO sendVO = new KakaoSendAdvcVO(); |
| 513 | 521 |
sendVO.setMsgType("8");
|
| 522 |
+ sendVO.setAgentCode("04");
|
|
| 514 | 523 |
sendVO.setSenderKey(kakaoVO.getSenderKey()); |
| 515 | 524 |
sendVO.setTemplateCode(kakaoVO.getTemplateCode()); |
| 516 | 525 |
sendVO.setUserId(kakaoVO.getUserId()); |
| 517 | 526 |
sendVO.setCallFrom(kakaoVO.getCallFrom()); |
| 527 |
+ return sendVO; |
|
| 528 |
+ } |
|
| 529 |
+ |
|
| 530 |
+ |
|
| 531 |
+ /** |
|
| 532 |
+ * @methodName : createFTSendVO |
|
| 533 |
+ * @author : 이호영 |
|
| 534 |
+ * @date : 2025. 4. 23. |
|
| 535 |
+ * @description : |
|
| 536 |
+ * @return : KakaoSendAdvcVO |
|
| 537 |
+ * @param kakaoVO |
|
| 538 |
+ * @return |
|
| 539 |
+ * |
|
| 540 |
+ */ |
|
| 541 |
+ private KakaoSendAdvcVO createFTSendVO(KakaoVO kakaoVO, Calendar calendar) {
|
|
| 542 |
+ KakaoSendAdvcVO sendVO = new KakaoSendAdvcVO(); |
|
| 543 |
+ |
|
| 544 |
+ sendVO.setMsgType("9"); // 알림톡 8 친구톡 9
|
|
| 518 | 545 |
sendVO.setAgentCode("04");
|
| 546 |
+ // 발송시간 : 친구톡은 분할 발송이 없어 처음 vo 생성 시 입력 |
|
| 547 |
+ sendVO.setReqDate(DATE_FORMATTER.format(calendar.getTime())); |
|
| 548 |
+ |
|
| 549 |
+ sendVO.setSenderKey(kakaoVO.getSenderKey()); |
|
| 550 |
+ sendVO.setTemplateCode(kakaoVO.getTemplateCode()); |
|
| 551 |
+ sendVO.setUserId(kakaoVO.getUserId()); |
|
| 552 |
+ sendVO.setCallFrom(kakaoVO.getCallFrom()); |
|
| 519 | 553 |
return sendVO; |
| 520 | 554 |
} |
| 521 | 555 |
|
... | ... | @@ -1401,4 +1435,165 @@ |
| 1401 | 1435 |
statusResponse.setMessage(msg); |
| 1402 | 1436 |
|
| 1403 | 1437 |
} |
| 1438 |
+ |
|
| 1439 |
+ |
|
| 1440 |
+ // 보유 금액이 충분한지 확인하는 메서드 |
|
| 1441 |
+ public boolean isCashSufficient(String userId, List<KakaoSendAdvcVO> kakaoSendAdvcListVO) throws Exception {
|
|
| 1442 |
+ |
|
| 1443 |
+ |
|
| 1444 |
+ String userMoney = priceAndPoint.getBefCash(userId); |
|
| 1445 |
+ // 쉼표 제거 |
|
| 1446 |
+ userMoney = userMoney.replace(",", "");
|
|
| 1447 |
+ |
|
| 1448 |
+ // 사용자 보유 금액 BigDecimal 변환 (HALF_EVEN 적용) |
|
| 1449 |
+ BigDecimal befCash = new BigDecimal(userMoney).setScale(2, RoundingMode.HALF_EVEN); |
|
| 1450 |
+ |
|
| 1451 |
+ // 총 메시지 금액 계산 (HALF_EVEN 적용) |
|
| 1452 |
+ BigDecimal totalEachPrice = kakaoSendAdvcListVO.stream() |
|
| 1453 |
+ .map(msg -> new BigDecimal(String.valueOf(msg.getEachPrice()))) // 변환 오류 방지 |
|
| 1454 |
+ .reduce(BigDecimal.ZERO, BigDecimal::add) |
|
| 1455 |
+ .setScale(2, RoundingMode.HALF_EVEN); // 일관성 유지 |
|
| 1456 |
+ |
|
| 1457 |
+ // 비교 수행 |
|
| 1458 |
+ return befCash.compareTo(totalEachPrice) >= 0; |
|
| 1459 |
+ } |
|
| 1460 |
+ |
|
| 1461 |
+ |
|
| 1462 |
+ |
|
| 1463 |
+ /** |
|
| 1464 |
+ * @methodName : insertKakaoAtDataJsonInfo_advc |
|
| 1465 |
+ * @author : 이호영 |
|
| 1466 |
+ * @date : 2025. 4. 24. |
|
| 1467 |
+ * @description : INSERT INTO BIZ_ATTACHMENTS |
|
| 1468 |
+ * @return : void |
|
| 1469 |
+ * @param kakaoSendAdvcListVO |
|
| 1470 |
+ * |
|
| 1471 |
+ */ |
|
| 1472 |
+ public void insertKakaoAtDataJsonInfo_advc(List<KakaoSendAdvcVO> kakaoSendAdvcListVO) {
|
|
| 1473 |
+ |
|
| 1474 |
+ List<KakaoSendAdvcVO> jsonInfoData = new ArrayList<>(kakaoSendAdvcListVO); |
|
| 1475 |
+ jsonInfoData.removeIf(t -> StringUtils.isBlank(t.getJsonStr())); |
|
| 1476 |
+ log.info(" + jsonInfoData Insert :: [{}]", jsonInfoData.size());
|
|
| 1477 |
+ if(jsonInfoData.size() > 0) {
|
|
| 1478 |
+ kakaoAlimTalkDAO.insertKakaoAtDataJsonInfo_advc(jsonInfoData); |
|
| 1479 |
+ } |
|
| 1480 |
+ |
|
| 1481 |
+ } |
|
| 1482 |
+ |
|
| 1483 |
+ |
|
| 1484 |
+ |
|
| 1485 |
+ /** |
|
| 1486 |
+ * @methodName : insertKakaoData_advc |
|
| 1487 |
+ * @author : 이호영 |
|
| 1488 |
+ * @date : 2025. 3. 20. |
|
| 1489 |
+ * @description : 카카오 batch 발송 => mj_msg_data |
|
| 1490 |
+ * @return : int |
|
| 1491 |
+ * @param kakaoSendAdvcVOList |
|
| 1492 |
+ * @param parentLoopCount |
|
| 1493 |
+ * @param isJsonNotEmpty |
|
| 1494 |
+ * @param isJsonNameAllSame |
|
| 1495 |
+ * @return |
|
| 1496 |
+ * |
|
| 1497 |
+ */ |
|
| 1498 |
+ public int insertKakaoData_advc(List<KakaoSendAdvcVO> kakaoSendAdvcVOList) {
|
|
| 1499 |
+ |
|
| 1500 |
+ |
|
| 1501 |
+ // 시작 시간 측정 |
|
| 1502 |
+ long totalStartTime = System.currentTimeMillis(); |
|
| 1503 |
+ |
|
| 1504 |
+ int totalSize = kakaoSendAdvcVOList.size(); // 총 데이터 개수 |
|
| 1505 |
+ // Batch 크기 설정 (고정값) |
|
| 1506 |
+// int batchSize = 10000; 465 |
|
| 1507 |
+ int batchSize = 50000; // 9분 18초 |
|
| 1508 |
+ |
|
| 1509 |
+ log.info("총 데이터 개수 :: [{}] ", totalSize);
|
|
| 1510 |
+ log.info("설정된 Batch 크기 :: [{}] ", batchSize);
|
|
| 1511 |
+ |
|
| 1512 |
+ // 총 insert 카운트 |
|
| 1513 |
+ int instCnt = 0; |
|
| 1514 |
+ int batchCount = 0; |
|
| 1515 |
+ |
|
| 1516 |
+ // 각 배치별 실행 시간 기록 |
|
| 1517 |
+ List<Double> batchExecutionTimes = new ArrayList<>(); |
|
| 1518 |
+ |
|
| 1519 |
+ |
|
| 1520 |
+ // 첫 번째 배치에서만 삽입했는지 추적하는 플래그 |
|
| 1521 |
+ for (int i = 0; i < totalSize; i += batchSize) {
|
|
| 1522 |
+ // Batch 시작 시간 측정 |
|
| 1523 |
+ long batchStartTime = System.currentTimeMillis(); |
|
| 1524 |
+ |
|
| 1525 |
+ // Batch 리스트 생성 |
|
| 1526 |
+ List<KakaoSendAdvcVO> batchList = kakaoSendAdvcVOList.subList(i, Math.min(i + batchSize, totalSize)); |
|
| 1527 |
+ System.out.println("Batch 시작 인덱스: " + i);
|
|
| 1528 |
+ |
|
| 1529 |
+ // mj_msg_data 테이블 insert |
|
| 1530 |
+ int insertedCount = kakaoAlimTalkDAO.insertKakaoAtDataInfo_advc(batchList); |
|
| 1531 |
+ |
|
| 1532 |
+ /** @kakaoSendUtil.populateSendLists |
|
| 1533 |
+ * 하단에서 |
|
| 1534 |
+ * getJsonStr 데이터 처리 후 활용 |
|
| 1535 |
+ * */ |
|
| 1536 |
+ instCnt += insertedCount; |
|
| 1537 |
+ |
|
| 1538 |
+ // Batch 종료 시간 측정 및 실행 시간 계산 |
|
| 1539 |
+ long batchEndTime = System.currentTimeMillis(); |
|
| 1540 |
+ double batchExecutionTimeInSeconds = (batchEndTime - batchStartTime) / 1000.0; |
|
| 1541 |
+ |
|
| 1542 |
+ // 실행 시간 기록 |
|
| 1543 |
+ batchExecutionTimes.add(batchExecutionTimeInSeconds); |
|
| 1544 |
+ batchCount++; |
|
| 1545 |
+ } |
|
| 1546 |
+ |
|
| 1547 |
+ // 종료 시간 측정 |
|
| 1548 |
+ long totalEndTime = System.currentTimeMillis(); |
|
| 1549 |
+ |
|
| 1550 |
+ // 총 실행 시간 계산 (밀리초 -> 초로 변환) |
|
| 1551 |
+ double totalExecutionTimeInSeconds = (totalEndTime - totalStartTime) / 1000.0; |
|
| 1552 |
+ |
|
| 1553 |
+ // 실행 시간 출력 |
|
| 1554 |
+ log.info("총 배치 실행 횟수 :: [{}] ", batchCount);
|
|
| 1555 |
+ log.info("batchSize :: [{}] ", batchSize);
|
|
| 1556 |
+ log.info("총 실행 시간 :: [{}] ", totalExecutionTimeInSeconds + "초");
|
|
| 1557 |
+ log.info("총 삽입 건수 :: [{}] ", instCnt);
|
|
| 1558 |
+ |
|
| 1559 |
+ // 각 배치별 실행 시간 출력 |
|
| 1560 |
+ for (int k = 0; k < batchExecutionTimes.size(); k++) {
|
|
| 1561 |
+ System.out.println("배치 " + (k + 1) + " 실행 시간 :: " + batchExecutionTimes.get(k) + "초");
|
|
| 1562 |
+ } |
|
| 1563 |
+ |
|
| 1564 |
+ return instCnt; |
|
| 1565 |
+ |
|
| 1566 |
+ } |
|
| 1567 |
+ |
|
| 1568 |
+ |
|
| 1569 |
+ |
|
| 1570 |
+ |
|
| 1571 |
+ |
|
| 1572 |
+ |
|
| 1573 |
+ public void insertKakaoGroupDataTb_advc(int instCnt, KakaoVO kakaoVO, KakaoSendAdvcVO sendVO) throws Exception {
|
|
| 1574 |
+ // TODO Auto-generated method stub |
|
| 1575 |
+ |
|
| 1576 |
+// log.info(" + insertKakaoGroupDataTb_advc kakaoVO :: \n[{}]", kakaoVO.toString());;
|
|
| 1577 |
+// log.info(" + insertKakaoGroupDataTb_advc kakaoSendAdvcVOList :: \n[{}]", sendVO.toString());
|
|
| 1578 |
+ |
|
| 1579 |
+ sendVO.setMsgGroupCnt(Integer.toString(instCnt)); |
|
| 1580 |
+ sendVO.setReserveYn(kakaoVO.getReserveYn()); |
|
| 1581 |
+ sendVO.setBefCash(priceAndPoint.getBefCash(sendVO.getUserId())); |
|
| 1582 |
+ sendVO.setBefPoint(priceAndPoint.getBefPoint(sendVO.getUserId())); |
|
| 1583 |
+ |
|
| 1584 |
+ Float eachPrice = Float.parseFloat(sendVO.getEachPrice()); |
|
| 1585 |
+ |
|
| 1586 |
+ Float totPrice = eachPrice * instCnt; |
|
| 1587 |
+ sendVO.setTotPrice(String.format("%.1f", totPrice));
|
|
| 1588 |
+ |
|
| 1589 |
+ sendVO.setAtDelayYn(kakaoVO.getAtSmishingYn()); |
|
| 1590 |
+ sendVO.setBizKakaoResendOrgnlTxt(kakaoVO.getSubMsgTxt()); |
|
| 1591 |
+ sendVO.setBizKakaoResendType(sendVO.getSubMsgType()); |
|
| 1592 |
+ |
|
| 1593 |
+ kakaoAlimTalkDAO.insertKakaoGroupDataTb_advc(sendVO); |
|
| 1594 |
+ |
|
| 1595 |
+ } |
|
| 1596 |
+ |
|
| 1597 |
+ |
|
| 1598 |
+ |
|
| 1404 | 1599 |
} |
--- src/main/java/itn/let/kakao/kakaoComm/KakaoVO.java
+++ src/main/java/itn/let/kakao/kakaoComm/KakaoVO.java
... | ... | @@ -344,6 +344,7 @@ |
| 344 | 344 |
sb.append("\n , subMsgSendYn=[").append(subMsgSendYn).append("]");
|
| 345 | 345 |
sb.append("\n , subMsgTxtReplYn=[").append(subMsgTxtReplYn).append("]");
|
| 346 | 346 |
sb.append("\n , subMsgType=[").append(subMsgType).append("]");
|
| 347 |
+ sb.append("\n , subMsgTxt=[").append(subMsgTxt).append("]");
|
|
| 347 | 348 |
sb.append("\n , reserveYn=[").append(getReserveYn()).append("]");
|
| 348 | 349 |
sb.append("\n , menuTopTab=[").append(menuTopTab).append("]");
|
| 349 | 350 |
sb.append("\n , bizJsonYn=[").append(bizJsonYn).append("]");
|
--- src/main/java/itn/let/kakao/kakaoComm/kakaoApi/KakaoApiJsonSave.java
+++ src/main/java/itn/let/kakao/kakaoComm/kakaoApi/KakaoApiJsonSave.java
... | ... | @@ -10,6 +10,7 @@ |
| 10 | 10 |
import java.util.List; |
| 11 | 11 |
import java.util.Map; |
| 12 | 12 |
|
| 13 |
+import org.apache.commons.lang3.StringUtils; |
|
| 13 | 14 |
import org.json.simple.JSONArray; |
| 14 | 15 |
import org.json.simple.JSONObject; |
| 15 | 16 |
import org.springframework.beans.factory.annotation.Autowired; |
... | ... | @@ -246,12 +247,12 @@ |
| 246 | 247 |
JSONObject templateImageExtInfo = new JSONObject(); |
| 247 | 248 |
String imageType = kakaoVO.getImageType(); |
| 248 | 249 |
|
| 249 |
- if(!imageType.equals("")) {
|
|
| 250 |
+ if(StringUtils.isNotEmpty(imageType)) {
|
|
| 250 | 251 |
templateImageInfo.put("img_url", kakaoVO.getTemplateImageUrl());
|
| 251 | 252 |
templateImageInfo.put("img_link", kakaoVO.getImgLink());
|
| 252 | 253 |
} |
| 253 | 254 |
|
| 254 |
- if(imageType.equals("W")) {
|
|
| 255 |
+ if("W".equals(imageType)) {
|
|
| 255 | 256 |
templateImageExtInfo.put("wide", "Y");
|
| 256 | 257 |
} |
| 257 | 258 |
|
--- src/main/java/itn/let/kakao/user/kakaoAt/service/impl/KakaoAlimTalkServiceImpl.java
+++ src/main/java/itn/let/kakao/user/kakaoAt/service/impl/KakaoAlimTalkServiceImpl.java
... | ... | @@ -913,7 +913,7 @@ |
| 913 | 913 |
|
| 914 | 914 |
|
| 915 | 915 |
/** @전송금액 확인 --------------------------------------------------*/ |
| 916 |
- if (!isCashSufficient(userId, kakaoSendAdvcListVO)) {
|
|
| 916 |
+ if (!kakaoSendUtil.isCashSufficient(userId, kakaoSendAdvcListVO)) {
|
|
| 917 | 917 |
log.error("Insufficient balance for message sending.");
|
| 918 | 918 |
return new StatusResponse(HttpStatus.BAD_REQUEST, "문자 발송에 필요한 보유 잔액이 부족 합니다."); |
| 919 | 919 |
} |
... | ... | @@ -921,7 +921,8 @@ |
| 921 | 921 |
|
| 922 | 922 |
|
| 923 | 923 |
/** @json파일이 있을 떄 biz_attachments insert */ |
| 924 |
- this.insertKakaoAtDataJsonInfo_advc(kakaoSendAdvcListVO); |
|
| 924 |
+ kakaoSendUtil.insertKakaoAtDataJsonInfo_advc(kakaoSendAdvcListVO); |
|
| 925 |
+// this.insertKakaoAtDataJsonInfo_advc(kakaoSendAdvcListVO); |
|
| 925 | 926 |
|
| 926 | 927 |
|
| 927 | 928 |
Map<String, List<KakaoSendAdvcVO>> priceGroupedMessages = kakaoSendAdvcListVO.stream() |
... | ... | @@ -941,7 +942,7 @@ |
| 941 | 942 |
|
| 942 | 943 |
|
| 943 | 944 |
// 발송 데이터 삽입 |
| 944 |
- int instCnt = this.insertKakaoData_advc(groupedMsgList); |
|
| 945 |
+ int instCnt = kakaoSendUtil.insertKakaoData_advc(groupedMsgList); |
|
| 945 | 946 |
// int instCnt = 6; |
| 946 | 947 |
|
| 947 | 948 |
if(instCnt > 0) {
|
... | ... | @@ -951,7 +952,7 @@ |
| 951 | 952 |
KakaoSendAdvcVO sendVO = groupedMsgList.get(0); |
| 952 | 953 |
|
| 953 | 954 |
/** @groupData 테이블 insert */ |
| 954 |
- this.insertKakaoGroupDataTb_advc(instCnt, kakaoVO, sendVO); |
|
| 955 |
+ kakaoSendUtil.insertKakaoGroupDataTb_advc(instCnt, kakaoVO, sendVO); |
|
| 955 | 956 |
|
| 956 | 957 |
|
| 957 | 958 |
/** @biz_kakao_price에 insert (대체문자 환불관련 테이블)*/ |
... | ... | @@ -1032,146 +1033,26 @@ |
| 1032 | 1033 |
|
| 1033 | 1034 |
|
| 1034 | 1035 |
|
| 1035 |
- private void insertKakaoAtDataJsonInfo_advc(List<KakaoSendAdvcVO> kakaoSendAdvcListVO) {
|
|
| 1036 |
- // TODO Auto-generated method stub |
|
| 1037 |
- |
|
| 1038 |
- // 측정할 메소드 호출 전 시간 기록 |
|
| 1039 |
- List<KakaoSendAdvcVO> jsonInfoData = new ArrayList<>(kakaoSendAdvcListVO); |
|
| 1040 |
- jsonInfoData.removeIf(t -> StringUtils.isBlank(t.getJsonStr())); |
|
| 1041 |
- log.info(" + jsonInfoData Insert :: [{}]", jsonInfoData.size());
|
|
| 1042 |
- if(jsonInfoData.size() > 0) {
|
|
| 1043 |
- kakaoAlimTalkDAO.insertKakaoAtDataJsonInfo_advc(jsonInfoData); |
|
| 1044 |
- } |
|
| 1045 |
- |
|
| 1046 |
- } |
|
| 1047 |
- |
|
| 1048 |
- private void insertKakaoGroupDataTb_advc(int instCnt, KakaoVO kakaoVO, KakaoSendAdvcVO sendVO) throws Exception {
|
|
| 1049 |
- // TODO Auto-generated method stub |
|
| 1050 |
- |
|
| 1051 |
-// log.info(" + insertKakaoGroupDataTb_advc kakaoVO :: \n[{}]", kakaoVO.toString());;
|
|
| 1052 |
-// log.info(" + insertKakaoGroupDataTb_advc kakaoSendAdvcVOList :: \n[{}]", sendVO.toString());
|
|
| 1053 |
- |
|
| 1054 |
- sendVO.setMsgGroupCnt(Integer.toString(instCnt)); |
|
| 1055 |
- sendVO.setReserveYn(kakaoVO.getReserveYn()); |
|
| 1056 |
- sendVO.setBefCash(priceAndPoint.getBefCash(sendVO.getUserId())); |
|
| 1057 |
- sendVO.setBefPoint(priceAndPoint.getBefPoint(sendVO.getUserId())); |
|
| 1058 |
- |
|
| 1059 |
- Float eachPrice = Float.parseFloat(sendVO.getEachPrice()); |
|
| 1060 |
- |
|
| 1061 |
- Float totPrice = eachPrice * instCnt; |
|
| 1062 |
- sendVO.setTotPrice(String.format("%.1f", totPrice));
|
|
| 1063 |
- |
|
| 1064 |
- sendVO.setAtDelayYn(kakaoVO.getAtSmishingYn()); |
|
| 1065 |
- sendVO.setBizKakaoResendOrgnlTxt(kakaoVO.getSubMsgTxt()); |
|
| 1066 |
- sendVO.setBizKakaoResendType(sendVO.getSubMsgType()); |
|
| 1067 |
- |
|
| 1068 |
- kakaoAlimTalkDAO.insertKakaoGroupDataTb_advc(sendVO); |
|
| 1069 |
- |
|
| 1070 |
- } |
|
| 1071 |
- |
|
| 1072 |
- /** |
|
| 1073 |
- * @methodName : insertKakaoData_advc |
|
| 1074 |
- * @author : 이호영 |
|
| 1075 |
- * @date : 2025. 3. 20. |
|
| 1076 |
- * @description : 카카오 batch 발송 => mj_msg_data |
|
| 1077 |
- * @return : int |
|
| 1078 |
- * @param kakaoSendAdvcVOList |
|
| 1079 |
- * @param parentLoopCount |
|
| 1080 |
- * @param isJsonNotEmpty |
|
| 1081 |
- * @param isJsonNameAllSame |
|
| 1082 |
- * @return |
|
| 1083 |
- * |
|
| 1084 |
- */ |
|
| 1085 |
- private int insertKakaoData_advc(List<KakaoSendAdvcVO> kakaoSendAdvcVOList) {
|
|
| 1086 |
- |
|
| 1087 |
- |
|
| 1088 |
- // 시작 시간 측정 |
|
| 1089 |
- long totalStartTime = System.currentTimeMillis(); |
|
| 1090 |
- |
|
| 1091 |
- int totalSize = kakaoSendAdvcVOList.size(); // 총 데이터 개수 |
|
| 1092 |
- // Batch 크기 설정 (고정값) |
|
| 1093 |
-// int batchSize = 10000; 465 |
|
| 1094 |
- int batchSize = 50000; // 9분 18초 |
|
| 1095 |
- |
|
| 1096 |
- log.info("총 데이터 개수 :: [{}] ", totalSize);
|
|
| 1097 |
- log.info("설정된 Batch 크기 :: [{}] ", batchSize);
|
|
| 1098 |
- |
|
| 1099 |
- // 총 insert 카운트 |
|
| 1100 |
- int instCnt = 0; |
|
| 1101 |
- int batchCount = 0; |
|
| 1102 |
- |
|
| 1103 |
- // 각 배치별 실행 시간 기록 |
|
| 1104 |
- List<Double> batchExecutionTimes = new ArrayList<>(); |
|
| 1105 |
- |
|
| 1106 |
- |
|
| 1107 |
- // 첫 번째 배치에서만 삽입했는지 추적하는 플래그 |
|
| 1108 |
- for (int i = 0; i < totalSize; i += batchSize) {
|
|
| 1109 |
- // Batch 시작 시간 측정 |
|
| 1110 |
- long batchStartTime = System.currentTimeMillis(); |
|
| 1111 |
- |
|
| 1112 |
- // Batch 리스트 생성 |
|
| 1113 |
- List<KakaoSendAdvcVO> batchList = kakaoSendAdvcVOList.subList(i, Math.min(i + batchSize, totalSize)); |
|
| 1114 |
- System.out.println("Batch 시작 인덱스: " + i);
|
|
| 1115 |
- |
|
| 1116 |
- // mj_msg_data 테이블 insert |
|
| 1117 |
- int insertedCount = kakaoAlimTalkDAO.insertKakaoAtDataInfo_advc(batchList); |
|
| 1118 |
- |
|
| 1119 |
- /** @kakaoSendUtil.populateSendLists |
|
| 1120 |
- * 하단에서 |
|
| 1121 |
- * getJsonStr 데이터 처리 후 활용 |
|
| 1122 |
- * */ |
|
| 1123 |
- instCnt += insertedCount; |
|
| 1124 |
- |
|
| 1125 |
- // Batch 종료 시간 측정 및 실행 시간 계산 |
|
| 1126 |
- long batchEndTime = System.currentTimeMillis(); |
|
| 1127 |
- double batchExecutionTimeInSeconds = (batchEndTime - batchStartTime) / 1000.0; |
|
| 1128 |
- |
|
| 1129 |
- // 실행 시간 기록 |
|
| 1130 |
- batchExecutionTimes.add(batchExecutionTimeInSeconds); |
|
| 1131 |
- batchCount++; |
|
| 1132 |
- } |
|
| 1133 |
- |
|
| 1134 |
- // 종료 시간 측정 |
|
| 1135 |
- long totalEndTime = System.currentTimeMillis(); |
|
| 1136 |
- |
|
| 1137 |
- // 총 실행 시간 계산 (밀리초 -> 초로 변환) |
|
| 1138 |
- double totalExecutionTimeInSeconds = (totalEndTime - totalStartTime) / 1000.0; |
|
| 1139 |
- |
|
| 1140 |
- // 실행 시간 출력 |
|
| 1141 |
- log.info("총 배치 실행 횟수 :: [{}] ", batchCount);
|
|
| 1142 |
- log.info("batchSize :: [{}] ", batchSize);
|
|
| 1143 |
- log.info("총 실행 시간 :: [{}] ", totalExecutionTimeInSeconds + "초");
|
|
| 1144 |
- log.info("총 삽입 건수 :: [{}] ", instCnt);
|
|
| 1145 |
- |
|
| 1146 |
- // 각 배치별 실행 시간 출력 |
|
| 1147 |
- for (int k = 0; k < batchExecutionTimes.size(); k++) {
|
|
| 1148 |
- System.out.println("배치 " + (k + 1) + " 실행 시간 :: " + batchExecutionTimes.get(k) + "초");
|
|
| 1149 |
- } |
|
| 1150 |
- |
|
| 1151 |
- return instCnt; |
|
| 1152 |
- |
|
| 1153 |
- } |
|
| 1154 |
- |
|
| 1155 |
- // 보유 금액이 충분한지 확인하는 메서드 |
|
| 1156 |
- private boolean isCashSufficient(String userId, List<KakaoSendAdvcVO> kakaoSendAdvcListVO) throws Exception {
|
|
| 1157 |
- |
|
| 1158 |
- |
|
| 1159 |
- String userMoney = priceAndPoint.getBefCash(userId); |
|
| 1160 |
- // 쉼표 제거 |
|
| 1161 |
- userMoney = userMoney.replace(",", "");
|
|
| 1162 |
- |
|
| 1163 |
- // 사용자 보유 금액 BigDecimal 변환 (HALF_EVEN 적용) |
|
| 1164 |
- BigDecimal befCash = new BigDecimal(userMoney).setScale(2, RoundingMode.HALF_EVEN); |
|
| 1165 |
- |
|
| 1166 |
- // 총 메시지 금액 계산 (HALF_EVEN 적용) |
|
| 1167 |
- BigDecimal totalEachPrice = kakaoSendAdvcListVO.stream() |
|
| 1168 |
- .map(msg -> new BigDecimal(String.valueOf(msg.getEachPrice()))) // 변환 오류 방지 |
|
| 1169 |
- .reduce(BigDecimal.ZERO, BigDecimal::add) |
|
| 1170 |
- .setScale(2, RoundingMode.HALF_EVEN); // 일관성 유지 |
|
| 1171 |
- |
|
| 1172 |
- // 비교 수행 |
|
| 1173 |
- return befCash.compareTo(totalEachPrice) >= 0; |
|
| 1174 |
- } |
|
| 1036 |
+// // 보유 금액이 충분한지 확인하는 메서드 |
|
| 1037 |
+// private boolean isCashSufficient(String userId, List<KakaoSendAdvcVO> kakaoSendAdvcListVO) throws Exception {
|
|
| 1038 |
+// |
|
| 1039 |
+// |
|
| 1040 |
+// String userMoney = priceAndPoint.getBefCash(userId); |
|
| 1041 |
+// // 쉼표 제거 |
|
| 1042 |
+// userMoney = userMoney.replace(",", "");
|
|
| 1043 |
+// |
|
| 1044 |
+// // 사용자 보유 금액 BigDecimal 변환 (HALF_EVEN 적용) |
|
| 1045 |
+// BigDecimal befCash = new BigDecimal(userMoney).setScale(2, RoundingMode.HALF_EVEN); |
|
| 1046 |
+// |
|
| 1047 |
+// // 총 메시지 금액 계산 (HALF_EVEN 적용) |
|
| 1048 |
+// BigDecimal totalEachPrice = kakaoSendAdvcListVO.stream() |
|
| 1049 |
+// .map(msg -> new BigDecimal(String.valueOf(msg.getEachPrice()))) // 변환 오류 방지 |
|
| 1050 |
+// .reduce(BigDecimal.ZERO, BigDecimal::add) |
|
| 1051 |
+// .setScale(2, RoundingMode.HALF_EVEN); // 일관성 유지 |
|
| 1052 |
+// |
|
| 1053 |
+// // 비교 수행 |
|
| 1054 |
+// return befCash.compareTo(totalEachPrice) >= 0; |
|
| 1055 |
+// } |
|
| 1175 | 1056 |
|
| 1176 | 1057 |
|
| 1177 | 1058 |
|
--- src/main/java/itn/let/kakao/user/kakaoFt/service/impl/KakaoFriendsTalkServiceImpl.java
+++ src/main/java/itn/let/kakao/user/kakaoFt/service/impl/KakaoFriendsTalkServiceImpl.java
... | ... | @@ -1,9 +1,12 @@ |
| 1 | 1 |
package itn.let.kakao.user.kakaoFt.service.impl; |
| 2 | 2 |
|
| 3 |
+import java.time.Duration; |
|
| 3 | 4 |
import java.time.Instant; |
| 5 |
+import java.util.ArrayList; |
|
| 4 | 6 |
import java.util.HashMap; |
| 5 | 7 |
import java.util.List; |
| 6 | 8 |
import java.util.Map; |
| 9 |
+import java.util.stream.Collectors; |
|
| 7 | 10 |
|
| 8 | 11 |
import javax.annotation.Resource; |
| 9 | 12 |
import javax.servlet.http.HttpServletRequest; |
... | ... | @@ -20,9 +23,13 @@ |
| 20 | 23 |
import itn.let.kakao.kakaoComm.KakaoSendAdvcVO; |
| 21 | 24 |
import itn.let.kakao.kakaoComm.KakaoSendUtil; |
| 22 | 25 |
import itn.let.kakao.kakaoComm.KakaoVO; |
| 26 |
+import itn.let.kakao.user.kakaoAt.service.impl.KakaoAlimTalkDAO; |
|
| 23 | 27 |
import itn.let.kakao.user.kakaoFt.service.KakaoFriendsTalkService; |
| 24 | 28 |
import itn.let.mail.service.StatusResponse; |
| 25 | 29 |
import itn.let.mjo.mjocommon.MjonCommon; |
| 30 |
+import itn.let.mjo.msg.service.MjonMsgVO; |
|
| 31 |
+import itn.let.mjo.msg.service.impl.MjonMsgDAO; |
|
| 32 |
+import itn.let.module.base.PriceAndPoint; |
|
| 26 | 33 |
import itn.let.uss.umt.service.EgovUserManageService; |
| 27 | 34 |
import lombok.extern.slf4j.Slf4j; |
| 28 | 35 |
|
... | ... | @@ -36,16 +43,28 @@ |
| 36 | 43 |
@Resource(name="kakaoFriendsTalkTemplateDAO") |
| 37 | 44 |
private KakaoFriendsTalkTemplateDAO kakaoFriendsTalkTemplateDAO; |
| 38 | 45 |
|
| 46 |
+ @Resource(name="mjonMsgDAO") |
|
| 47 |
+ private MjonMsgDAO mjonMsgDAO; |
|
| 48 |
+ |
|
| 39 | 49 |
/** userManageService */ |
| 40 | 50 |
@Resource(name = "userManageService") |
| 41 | 51 |
private EgovUserManageService userManageService; |
| 42 | 52 |
|
| 43 |
- @Autowired |
|
| 44 |
- private MjonCommon mjonCommon; |
|
| 53 |
+ @Resource(name = "egovMjonMsgGroupIdGnrService") |
|
| 54 |
+ private EgovIdGnrService idgenMjonMsgGroupId; |
|
| 45 | 55 |
|
| 56 |
+ |
|
| 57 |
+ @Resource(name="kakaoAlimTalkDAO") |
|
| 58 |
+ private KakaoAlimTalkDAO kakaoAlimTalkDAO; |
|
| 46 | 59 |
|
| 47 | 60 |
@Autowired |
| 48 | 61 |
KakaoSendUtil kakaoSendUtil; |
| 62 |
+ |
|
| 63 |
+ @Autowired |
|
| 64 |
+ private MjonCommon mjonCommon; |
|
| 65 |
+ |
|
| 66 |
+ @Autowired |
|
| 67 |
+ private PriceAndPoint priceAndPoint; |
|
| 49 | 68 |
|
| 50 | 69 |
@Override |
| 51 | 70 |
public StatusResponse insertKakaoFtSandAjax_advc(KakaoVO kakaoVO, HttpServletRequest request) throws Exception {
|
... | ... | @@ -103,29 +122,122 @@ |
| 103 | 122 |
|
| 104 | 123 |
|
| 105 | 124 |
|
| 125 |
+/** @전송금액 확인 --------------------------------------------------*/ |
|
| 126 |
+ if (!kakaoSendUtil.isCashSufficient(userId, kakaoSendAdvcListVO)) {
|
|
| 127 |
+ log.error("Insufficient balance for message sending.");
|
|
| 128 |
+ return new StatusResponse(HttpStatus.BAD_REQUEST, "문자 발송에 필요한 보유 잔액이 부족 합니다."); |
|
| 129 |
+ } |
|
| 106 | 130 |
|
| 107 |
- |
|
| 108 |
- |
|
| 109 |
- |
|
| 110 |
- |
|
| 111 |
- |
|
| 112 |
- |
|
| 113 |
- |
|
| 114 |
- |
|
| 115 |
- |
|
| 116 |
- |
|
| 117 |
- |
|
| 118 |
- |
|
| 119 |
- |
|
| 120 |
- |
|
| 121 |
- |
|
| 122 |
- |
|
| 123 |
- // KakaoSendAdvcVO 발송 VO |
|
| 124 | 131 |
|
| 132 |
+/** @json파일이 있을 떄 biz_attachments insert */ |
|
| 133 |
+ kakaoSendUtil.insertKakaoAtDataJsonInfo_advc(kakaoSendAdvcListVO); |
|
| 125 | 134 |
|
| 126 | 135 |
|
| 136 |
+ |
|
| 137 |
+ Map<String, List<KakaoSendAdvcVO>> priceGroupedMessages = kakaoSendAdvcListVO.stream() |
|
| 138 |
+ .collect(Collectors.groupingBy(KakaoSendAdvcVO::getEachPrice)); |
|
| 139 |
+ // instTotalCnt : 화면에서 보여줄 총 발송건수 |
|
| 140 |
+ int instTotalCnt = 0; |
|
| 141 |
+ |
|
| 142 |
+ |
|
| 143 |
+ // 임시 |
|
| 144 |
+ List<String> nextMsgGroupIdA = new ArrayList<>(); |
|
| 145 |
+ // 대안: entrySet() 직접 사용 |
|
| 146 |
+ for (Map.Entry<String, List<KakaoSendAdvcVO>> entry : priceGroupedMessages.entrySet()) {
|
|
| 147 |
+ // entry 사용 |
|
| 148 |
+ |
|
| 149 |
+ List<KakaoSendAdvcVO> groupedMsgList = entry.getValue(); // 해당 가격의 메시지 리스트 |
|
| 150 |
+ |
|
| 151 |
+ String nextMsgGroupId = idgenMjonMsgGroupId.getNextStringId(); |
|
| 152 |
+ groupedMsgList.forEach(t -> t.setMsgGroupId(nextMsgGroupId)); |
|
| 153 |
+ |
|
| 154 |
+ |
|
| 155 |
+ // 발송 데이터 삽입 |
|
| 156 |
+ int instCnt = kakaoSendUtil.insertKakaoData_advc(groupedMsgList); |
|
| 157 |
+// int instCnt = 6; |
|
| 158 |
+ |
|
| 159 |
+ if(instCnt > 0) {
|
|
| 160 |
+ |
|
| 161 |
+ instTotalCnt += instCnt; |
|
| 162 |
+ |
|
| 163 |
+ KakaoSendAdvcVO sendVO = groupedMsgList.get(0); |
|
| 164 |
+ |
|
| 165 |
+/** @groupData 테이블 insert */ |
|
| 166 |
+ kakaoSendUtil.insertKakaoGroupDataTb_advc(instCnt, kakaoVO, sendVO); |
|
| 167 |
+ |
|
| 168 |
+ |
|
| 169 |
+/** @biz_kakao_price에 insert (대체문자 환불관련 테이블)*/ |
|
| 170 |
+ kakaoVO.setMsgGroupId(sendVO.getMsgGroupId()); |
|
| 171 |
+ kakaoVO.setKakaoAtPrice(Float.parseFloat(sendVO.getEachPrice())); |
|
| 172 |
+ kakaoVO.setSmsPrice(Float.parseFloat(sendVO.getSmsPrice())); |
|
| 173 |
+ kakaoVO.setMmsPrice(Float.parseFloat(sendVO.getMmsPrice())); |
|
| 174 |
+ |
|
| 175 |
+ kakaoAlimTalkDAO.insertKakaoSendPrice(kakaoVO); |
|
| 176 |
+ |
|
| 177 |
+ |
|
| 178 |
+ priceAndPoint.insertCashAndPoint(kakaoVO.getUserId() |
|
| 179 |
+ , -Float.parseFloat(sendVO.getTotPrice()) |
|
| 180 |
+ , "카카오 알림톡 총 "+groupedMsgList.size()+"건 중 " + instCnt + "건 발송" |
|
| 181 |
+ , nextMsgGroupId |
|
| 182 |
+ ); |
|
| 183 |
+ |
|
| 184 |
+ |
|
| 185 |
+/** @SLACK발송 */ |
|
| 186 |
+ /** @발송조건이되면 발송 */ |
|
| 187 |
+ if(isNotified) {
|
|
| 188 |
+ mjonCommon.getAdminKakaoAtSendSlack(sendVO); |
|
| 189 |
+ }else if("Y".equals(kakaoVO.getAtSmishingYn())){
|
|
| 190 |
+ /** @발송조건이 안되면 DB INSERT */ |
|
| 191 |
+ mjonMsgDAO.insertSpamPassMsgData(MjonMsgVO.builder() |
|
| 192 |
+ .msgGroupId(nextMsgGroupId) |
|
| 193 |
+ .userId(kakaoVO.getUserId()) |
|
| 194 |
+ .reqDate(kakaoVO.getReqDate()) |
|
| 195 |
+ .smsTxt(groupedMsgList.get(0).getTemplateContent()) |
|
| 196 |
+ .totalCallCnt(instCnt) |
|
| 197 |
+ .callFrom(kakaoVO.getCallFrom()) |
|
| 198 |
+ .msgType("8")
|
|
| 199 |
+ .reserveYn(kakaoVO.getReserveYn()) |
|
| 200 |
+ .build() |
|
| 201 |
+ ); |
|
| 202 |
+ } |
|
| 203 |
+ |
|
| 204 |
+ nextMsgGroupIdA.add(nextMsgGroupId); |
|
| 205 |
+ |
|
| 206 |
+ } |
|
| 207 |
+ |
|
| 208 |
+ } |
|
| 209 |
+ |
|
| 210 |
+ returnMap.put("resultSts", instTotalCnt);
|
|
| 211 |
+ returnMap.put("reserYn", kakaoVO.getReserveYn());
|
|
| 212 |
+ returnMap.put("groupIds", nextMsgGroupIdA);
|
|
| 213 |
+ |
|
| 214 |
+ |
|
| 215 |
+ // 측정할 메소드 호출 후 시간 기록 |
|
| 216 |
+ Instant end = Instant.now(); |
|
| 217 |
+ |
|
| 218 |
+ log.info(" + start :: [{}]", start);
|
|
| 219 |
+ // 실행 시간 계산 (나노초, 밀리초, 초) |
|
| 220 |
+ long seconds = Duration.between(start, end).getSeconds(); |
|
| 221 |
+ log.info("메소드 실행 시간 (초): {} s", seconds);
|
|
| 222 |
+ double minutes = seconds / 60.0; // 소수점 포함을 위해 60.0으로 나눔 |
|
| 223 |
+ |
|
| 224 |
+ returnMap.put("second", seconds+" s");
|
|
| 225 |
+ returnMap.put("minutes", minutes+" min");
|
|
| 226 |
+ |
|
| 227 |
+ |
|
| 228 |
+// System.out.println("메소드 실행 시간 (분): " + minutes + " min");
|
|
| 229 |
+ |
|
| 230 |
+ |
|
| 231 |
+ |
|
| 232 |
+ |
|
| 233 |
+// priceAndPoint.getBefCash(userId); |
|
| 234 |
+ |
|
| 235 |
+ |
|
| 236 |
+ |
|
| 237 |
+ |
|
| 127 | 238 |
statusResponse.setStatus(HttpStatus.OK); |
| 128 |
-// statusResponse.setObject(returnMap); |
|
| 239 |
+ statusResponse.setObject(returnMap); |
|
| 240 |
+ |
|
| 129 | 241 |
return statusResponse; |
| 130 | 242 |
} |
| 131 | 243 |
|
--- src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/at/KakaoAlimtalkMsgDataView.jsp
+++ src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/at/KakaoAlimtalkMsgDataView.jsp
... | ... | @@ -700,7 +700,7 @@ |
| 700 | 700 |
success: function (data) {
|
| 701 | 701 |
console.log('data : ', data);
|
| 702 | 702 |
|
| 703 |
- var status = data.status; |
|
| 703 |
+ /* var status = data.status; |
|
| 704 | 704 |
if("OK" == status){
|
| 705 | 705 |
var resultSts = data.object.resultSts; |
| 706 | 706 |
var reserYn = data.object.reserYn; |
... | ... | @@ -715,7 +715,7 @@ |
| 715 | 715 |
}else{
|
| 716 | 716 |
alert(data.message); |
| 717 | 717 |
return false; |
| 718 |
- } |
|
| 718 |
+ } */ |
|
| 719 | 719 |
|
| 720 | 720 |
|
| 721 | 721 |
// if(data == 'success'){
|
--- src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/ft/KakaoFriendsTalkMsgDataView.jsp
+++ src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/ft/KakaoFriendsTalkMsgDataView.jsp
... | ... | @@ -313,17 +313,12 @@ |
| 313 | 313 |
alert("이미지 클릭시 이동할 URL 주소를 http:// 또는 https:// 포함하여 입력해 주세요.");
|
| 314 | 314 |
return false; |
| 315 | 315 |
|
| 316 |
- }else{
|
|
| 317 |
- |
|
| 318 |
- if(link.search("http://") == -1 && link.search("https://") == -1){
|
|
| 319 |
- |
|
| 320 |
- $("#imgNm").text("");
|
|
| 321 |
- $("#imgFile").val("");
|
|
| 322 |
- alert("이미지 URL 주소에는 http:// 또는 https://를 포함하여 입력해야 합니다.");
|
|
| 323 |
- return false; |
|
| 324 |
- |
|
| 325 |
- } |
|
| 326 |
- |
|
| 316 |
+ }else if(link.search("http://") == -1 && link.search("https://") == -1){
|
|
| 317 |
+ |
|
| 318 |
+ $("#imgNm").text("");
|
|
| 319 |
+ $("#imgFile").val("");
|
|
| 320 |
+ alert("이미지 URL 주소에는 http:// 또는 https://를 포함하여 입력해야 합니다.");
|
|
| 321 |
+ return false; |
|
| 327 | 322 |
} |
| 328 | 323 |
|
| 329 | 324 |
//첨부파일 선택 팝업 호출해주기 |
... | ... | @@ -891,8 +886,10 @@ |
| 891 | 886 |
var subMsgSendYn = "N"; |
| 892 | 887 |
if($("#send_fail_check").is(":checked")){
|
| 893 | 888 |
subMsgSendYn = 'Y' |
| 889 |
+ $('#callFrom').val($('#callFromList').val())
|
|
| 894 | 890 |
} |
| 895 | 891 |
$("#subMsgSendYn").val(subMsgSendYn);
|
| 892 |
+ $("#subMsgTxt").val( $('#smsTxtArea').val());
|
|
| 896 | 893 |
|
| 897 | 894 |
|
| 898 | 895 |
|
... | ... | @@ -912,166 +909,120 @@ |
| 912 | 909 |
|
| 913 | 910 |
} |
| 914 | 911 |
|
| 915 |
- var spamChk = true; |
|
| 912 |
+ |
|
| 913 |
+ |
|
| 914 |
+ // 타블레이터 호출 |
|
| 915 |
+ var $selectedData = tableL.getData(); // 데이터 가져오기 |
|
| 916 | 916 |
|
| 917 |
- var spmData = new FormData(document.bizForm); |
|
| 918 |
- $.ajax({
|
|
| 919 |
- type: "POST" |
|
| 920 |
- , url: "/web/mjon/kakao/friendstalk/selectSpamKakaoFriendsTalkMsgChkAjax.do" |
|
| 921 |
- , data: spmData |
|
| 922 |
- , dataType:'json' |
|
| 923 |
- , async: false |
|
| 924 |
- , processData: false |
|
| 925 |
- , contentType: false |
|
| 926 |
- , cache: false |
|
| 927 |
- , success: function (returnData, status) {
|
|
| 928 |
- if(status == 'success'){ // status 확인 필요한가. 석세스 안뜨면 에러 가지 않나
|
|
| 929 |
- |
|
| 930 |
- if("fail" == returnData.result){
|
|
| 931 |
- alert(returnData.message); |
|
| 932 |
- spamChk = false; |
|
| 933 |
- return false; |
|
| 934 |
- }else if("loginFail" == returnData.result){
|
|
| 935 |
- alert(returnData.message); |
|
| 936 |
- spamChk = false; |
|
| 937 |
- return false; |
|
| 938 |
- }else if("spams" == returnData.result){
|
|
| 939 |
- //alert("전송 내용에 스팸문구가 포함되어 있습니다.")
|
|
| 940 |
- $("#spamStatus").val("Y");
|
|
| 941 |
- return false; |
|
| 942 |
- }else{
|
|
| 943 |
- spamChk = true; |
|
| 944 |
- return false; |
|
| 945 |
- } |
|
| 946 |
- |
|
| 947 |
- } else if(status== 'fail'){
|
|
| 948 |
- alert(returnData.message); |
|
| 949 |
- return false; |
|
| 950 |
- } |
|
| 951 |
- } |
|
| 952 |
- , error: function (e) {
|
|
| 953 |
- alert("문자 발송에 실패하였습니다.");
|
|
| 954 |
- console.log("ERROR : ", e);
|
|
| 955 |
- return false; |
|
| 917 |
+ var data = $('#bizForm');
|
|
| 918 |
+ var formDataArray = data.serializeArray(); |
|
| 919 |
+ |
|
| 920 |
+ // 배열을 객체로 변환 |
|
| 921 |
+ var formData = {};
|
|
| 922 |
+ $.each(formDataArray, function(index, field) {
|
|
| 923 |
+ formData[field.name] = field.value; |
|
| 924 |
+ }); |
|
| 925 |
+ |
|
| 926 |
+ // 2. buttonVOList 수동으로 수집 |
|
| 927 |
+ var buttonList = []; |
|
| 928 |
+ $('input[name^="buttonVOList"]').each(function() {
|
|
| 929 |
+ let nameAttr = $(this).attr('name');
|
|
| 930 |
+ let match = nameAttr.match(/buttonVOList\[(\d+)\]\.(\w+)/); |
|
| 931 |
+ |
|
| 932 |
+ if (match) {
|
|
| 933 |
+ let index = parseInt(match[1]); |
|
| 934 |
+ let key = match[2]; |
|
| 935 |
+ let value = $(this).val(); |
|
| 936 |
+ |
|
| 937 |
+ if (!buttonList[index]) buttonList[index] = {};
|
|
| 938 |
+ buttonList[index][key] = value; |
|
| 939 |
+ } |
|
| 940 |
+ }); |
|
| 941 |
+ |
|
| 942 |
+ // 3. formData에 배열로 추가 |
|
| 943 |
+ formData["buttonVOList"] = buttonList; |
|
| 944 |
+ |
|
| 945 |
+ // 4. 기존의 buttonVOList[0].xxx 형태 제거 |
|
| 946 |
+ Object.keys(formData).forEach(function(key) {
|
|
| 947 |
+ if (/^buttonVOList\[\d+\]\./.test(key)) {
|
|
| 948 |
+ delete formData[key]; |
|
| 956 | 949 |
} |
| 957 | 950 |
}); |
| 958 | 951 |
|
| 959 |
- if(spamChk){
|
|
| 960 |
- |
|
| 952 |
+ // VO에 정의되어있지 않는 필요없는 값은 제거 |
|
| 953 |
+ ["adFlag", "img_file_add", "userMoney", "callToList"].forEach(function(key) {
|
|
| 954 |
+ delete formData[key]; |
|
| 955 |
+ }); |
|
| 961 | 956 |
|
| 962 |
- // 타블레이터 호출 |
|
| 963 |
- var $selectedData = tableL.getData(); // 데이터 가져오기 |
|
| 964 |
- |
|
| 965 |
- var data = $('#bizForm');
|
|
| 966 |
- var formDataArray = data.serializeArray(); |
|
| 967 |
- |
|
| 968 |
- // 배열을 객체로 변환 |
|
| 969 |
- var formData = {};
|
|
| 970 |
- $.each(formDataArray, function(index, field) {
|
|
| 971 |
- formData[field.name] = field.value; |
|
| 972 |
- }); |
|
| 973 |
- |
|
| 974 |
- // 2. buttonVOList 수동으로 수집 |
|
| 975 |
- var buttonList = []; |
|
| 976 |
- $('input[name^="buttonVOList"]').each(function() {
|
|
| 977 |
- let nameAttr = $(this).attr('name');
|
|
| 978 |
- let match = nameAttr.match(/buttonVOList\[(\d+)\]\.(\w+)/); |
|
| 979 |
- |
|
| 980 |
- if (match) {
|
|
| 981 |
- let index = parseInt(match[1]); |
|
| 982 |
- let key = match[2]; |
|
| 983 |
- let value = $(this).val(); |
|
| 984 |
- |
|
| 985 |
- if (!buttonList[index]) buttonList[index] = {};
|
|
| 986 |
- buttonList[index][key] = value; |
|
| 987 |
- } |
|
| 988 |
- }); |
|
| 989 |
- |
|
| 990 |
- // 3. formData에 배열로 추가 |
|
| 991 |
- formData["buttonVOList"] = buttonList; |
|
| 992 |
- |
|
| 993 |
- // 4. 기존의 buttonVOList[0].xxx 형태 제거 |
|
| 994 |
- Object.keys(formData).forEach(function(key) {
|
|
| 995 |
- if (/^buttonVOList\[\d+\]\./.test(key)) {
|
|
| 996 |
- delete formData[key]; |
|
| 997 |
- } |
|
| 998 |
- }); |
|
| 999 |
- |
|
| 1000 |
- // VO에 정의되어있지 않는 필요없는 값은 제거 |
|
| 1001 |
- ["adFlag", "img_file_add", "userMoney", "callToList"].forEach(function(key) {
|
|
| 1002 |
- delete formData[key]; |
|
| 1003 |
- }); |
|
| 1004 |
- |
|
| 1005 |
- |
|
| 1006 |
- // 빈 값 제거 |
|
| 1007 |
- removeEmptyValues(formData); |
|
| 1008 |
- // 선택된 데이터 추가 |
|
| 1009 |
- formData["mjonFTSendVOList"] = $selectedData; |
|
| 1010 |
- // JSON 데이터 확인 |
|
| 1011 |
- console.log("최종 formData:", JSON.stringify(formData));
|
|
| 1012 |
- |
|
| 1013 |
- |
|
| 1014 |
- |
|
| 1015 |
- |
|
| 1016 |
- $.ajax({
|
|
| 1017 |
- type: "POST" |
|
| 1018 |
- , url: "/web/mjon/kakao/friendstalk/kakaoFriendsTalkMsgSendAjax_advc.do" |
|
| 1019 |
- , data: JSON.stringify(formData) |
|
| 1020 |
- , contentType: 'application/json' |
|
| 1021 |
- , dataType: 'json' |
|
| 1022 |
- , success: function (returnData) {
|
|
| 1023 |
- |
|
| 1024 |
- console.log('returnData : ', returnData);
|
|
| 1025 |
- |
|
| 1026 |
- |
|
| 1027 |
- /* |
|
| 1028 |
- if(status == 'success'){
|
|
| 1029 |
- if("loginFail" == returnData.result){
|
|
| 1030 |
- |
|
| 1031 |
- alert(returnData.message); |
|
| 1032 |
- return false; |
|
| 1033 |
- |
|
| 1034 |
- }else if('fail' == returnData.result){
|
|
| 1035 |
- |
|
| 1036 |
- alert(returnData.message); |
|
| 1037 |
- return false; |
|
| 1038 |
- |
|
| 1039 |
- }else if('authFail' == returnData.result){
|
|
| 1040 |
- |
|
| 1041 |
- alert(returnData.message); |
|
| 1042 |
- location.reload(); |
|
| 1043 |
- |
|
| 1044 |
- } else if(status == 'success'){
|
|
| 1045 |
- |
|
| 1046 |
- var kakaoSendCnt = returnData.resultSts; |
|
| 1047 |
- |
|
| 1048 |
- $('.pop_msg_success').css({'display':'block','opacity':'1','left':'50%','top':'50%','transform':'translate(-50%,-50%)'});
|
|
| 1049 |
- |
|
| 1050 |
- //예약발송 건의 경우 결과 팝업 문구 변경 |
|
| 1051 |
- if(reserYn == 'Y'){
|
|
| 1052 |
- $('.pop_msg_success .msg_text').html("예약 성공 : <strong>"+ kakaoSendCnt + "</strong>건의<br>친구톡이 예약 되었습니다.");
|
|
| 1053 |
- }else{
|
|
| 1054 |
- $('.pop_msg_success .msg_text').html("발송 성공 : <strong>"+ kakaoSendCnt + "</strong>건의<br>친구톡이 발송 되었습니다.");
|
|
| 1055 |
- } |
|
| 1056 |
- |
|
| 1057 |
- $('.mask').addClass('on');
|
|
| 957 |
+ |
|
| 958 |
+ // 빈 값 제거 |
|
| 959 |
+ removeEmptyValues(formData); |
|
| 960 |
+ // 선택된 데이터 추가 |
|
| 961 |
+ formData["mjonFTSendVOList"] = $selectedData; |
|
| 962 |
+ // JSON 데이터 확인 |
|
| 963 |
+ console.log("최종 formData:", JSON.stringify(formData));
|
|
| 964 |
+ |
|
| 965 |
+ |
|
| 966 |
+ |
|
| 967 |
+ |
|
| 968 |
+ $.ajax({
|
|
| 969 |
+ type: "POST" |
|
| 970 |
+ , url: "/web/mjon/kakao/friendstalk/kakaoFriendsTalkMsgSendAjax_advc.do" |
|
| 971 |
+ , data: JSON.stringify(formData) |
|
| 972 |
+ , contentType: 'application/json' |
|
| 973 |
+ , dataType: 'json' |
|
| 974 |
+ , success: function (returnData) {
|
|
| 975 |
+ |
|
| 976 |
+ console.log('returnData : ', returnData);
|
|
| 977 |
+ |
|
| 978 |
+ |
|
| 979 |
+ /* |
|
| 980 |
+ if(status == 'success'){
|
|
| 981 |
+ if("loginFail" == returnData.result){
|
|
| 982 |
+ |
|
| 983 |
+ alert(returnData.message); |
|
| 984 |
+ return false; |
|
| 985 |
+ |
|
| 986 |
+ }else if('fail' == returnData.result){
|
|
| 987 |
+ |
|
| 988 |
+ alert(returnData.message); |
|
| 989 |
+ return false; |
|
| 990 |
+ |
|
| 991 |
+ }else if('authFail' == returnData.result){
|
|
| 992 |
+ |
|
| 993 |
+ alert(returnData.message); |
|
| 994 |
+ location.reload(); |
|
| 995 |
+ |
|
| 996 |
+ } else if(status == 'success'){
|
|
| 997 |
+ |
|
| 998 |
+ var kakaoSendCnt = returnData.resultSts; |
|
| 999 |
+ |
|
| 1000 |
+ $('.pop_msg_success').css({'display':'block','opacity':'1','left':'50%','top':'50%','transform':'translate(-50%,-50%)'});
|
|
| 1001 |
+ |
|
| 1002 |
+ //예약발송 건의 경우 결과 팝업 문구 변경 |
|
| 1003 |
+ if(reserYn == 'Y'){
|
|
| 1004 |
+ $('.pop_msg_success .msg_text').html("예약 성공 : <strong>"+ kakaoSendCnt + "</strong>건의<br>친구톡이 예약 되었습니다.");
|
|
| 1005 |
+ }else{
|
|
| 1006 |
+ $('.pop_msg_success .msg_text').html("발송 성공 : <strong>"+ kakaoSendCnt + "</strong>건의<br>친구톡이 발송 되었습니다.");
|
|
| 1058 | 1007 |
} |
| 1059 |
- } */ |
|
| 1060 |
- } |
|
| 1061 |
- ,beforeSend : function(xmlHttpRequest) {
|
|
| 1062 |
- //로딩창 show |
|
| 1063 |
- $('.loading_layer').addClass('active');
|
|
| 1064 |
- } |
|
| 1065 |
- ,complete : function(xhr, textStatus) {
|
|
| 1066 |
- //로딩창 hide |
|
| 1067 |
- $('.loading_layer').removeClass('active');
|
|
| 1068 |
- } |
|
| 1069 |
- ,error: function (e) {
|
|
| 1070 |
- console.log("ERROR : ", e);
|
|
| 1071 |
- alert("카카오 친구톡 전송에 실패하였습니다.");
|
|
| 1072 |
- } |
|
| 1073 |
- }); |
|
| 1074 |
- } |
|
| 1008 |
+ |
|
| 1009 |
+ $('.mask').addClass('on');
|
|
| 1010 |
+ } |
|
| 1011 |
+ } */ |
|
| 1012 |
+ } |
|
| 1013 |
+ ,beforeSend : function(xmlHttpRequest) {
|
|
| 1014 |
+ //로딩창 show |
|
| 1015 |
+ $('.loading_layer').addClass('active');
|
|
| 1016 |
+ } |
|
| 1017 |
+ ,complete : function(xhr, textStatus) {
|
|
| 1018 |
+ //로딩창 hide |
|
| 1019 |
+ $('.loading_layer').removeClass('active');
|
|
| 1020 |
+ } |
|
| 1021 |
+ ,error: function (e) {
|
|
| 1022 |
+ console.log("ERROR : ", e);
|
|
| 1023 |
+ alert("카카오 친구톡 전송에 실패하였습니다.");
|
|
| 1024 |
+ } |
|
| 1025 |
+ }); |
|
| 1075 | 1026 |
|
| 1076 | 1027 |
} |
| 1077 | 1028 |
|
... | ... | @@ -1117,6 +1068,8 @@ |
| 1117 | 1068 |
function fn_insertErrorYN(val){
|
| 1118 | 1069 |
$('#errorChk').val(val);
|
| 1119 | 1070 |
} |
| 1071 |
+ |
|
| 1072 |
+ |
|
| 1120 | 1073 |
|
| 1121 | 1074 |
|
| 1122 | 1075 |
//문자 바이트수 계산하기 함수 |
... | ... | @@ -1282,154 +1235,6 @@ |
| 1282 | 1235 |
|
| 1283 | 1236 |
alert("받는사람 주소를 한 건 이상 입력해주세요.");
|
| 1284 | 1237 |
return false; |
| 1285 |
- |
|
| 1286 |
- }else{
|
|
| 1287 |
- |
|
| 1288 |
- //치환문구 변환 |
|
| 1289 |
- var txtReplYn = $("#txtReplYn").val();
|
|
| 1290 |
- |
|
| 1291 |
- if(txtReplYn == 'Y'){
|
|
| 1292 |
- |
|
| 1293 |
- var name = tableL.getRows()[0].getData().name; |
|
| 1294 |
- var phone = removeDash(tableL.getRows()[0].getData().phone); |
|
| 1295 |
- var rep1 = tableL.getRows()[0].getData().rep1; |
|
| 1296 |
- var rep2 = tableL.getRows()[0].getData().rep2; |
|
| 1297 |
- var rep3 = tableL.getRows()[0].getData().rep3; |
|
| 1298 |
- var rep4 = tableL.getRows()[0].getData().rep4; |
|
| 1299 |
- |
|
| 1300 |
- var varValList = []; //치환문자 연결시킬 변수 셋팅 |
|
| 1301 |
- |
|
| 1302 |
- |
|
| 1303 |
- var nmStatus = false; |
|
| 1304 |
- var rep1Status = false; |
|
| 1305 |
- var rep2Status = false; |
|
| 1306 |
- var rep3Status = false; |
|
| 1307 |
- var rep4Status = false; |
|
| 1308 |
- |
|
| 1309 |
- var varValStr = ""; |
|
| 1310 |
- var varValStatus = true; |
|
| 1311 |
- |
|
| 1312 |
- |
|
| 1313 |
- if(tmpContents.indexOf("\#{이름}") > -1){
|
|
| 1314 |
- nmStatus = true; |
|
| 1315 |
- } |
|
| 1316 |
- |
|
| 1317 |
- if(tmpContents.indexOf("\#{1}") > -1){
|
|
| 1318 |
- rep1Status = true; |
|
| 1319 |
- } |
|
| 1320 |
- |
|
| 1321 |
- if(tmpContents.indexOf("\#{2}") > -1){
|
|
| 1322 |
- rep2Status = true; |
|
| 1323 |
- } |
|
| 1324 |
- |
|
| 1325 |
- if(tmpContents.indexOf("\#{3}") > -1){
|
|
| 1326 |
- rep3Status = true; |
|
| 1327 |
- } |
|
| 1328 |
- |
|
| 1329 |
- if(tmpContents.indexOf("\#{4}") > -1){
|
|
| 1330 |
- rep4Status = true; |
|
| 1331 |
- } |
|
| 1332 |
- |
|
| 1333 |
- |
|
| 1334 |
- if(nmStatus && (typeof(name) != 'undefined' && name != null && name !="")){
|
|
| 1335 |
- |
|
| 1336 |
- if(varValStr == ''){
|
|
| 1337 |
- varValStr = name.replaceAll(",","§");
|
|
| 1338 |
- }else{
|
|
| 1339 |
- varValStr = varValStr + "¶" + name.replaceAll(",","§");
|
|
| 1340 |
- } |
|
| 1341 |
- |
|
| 1342 |
- }else{
|
|
| 1343 |
- |
|
| 1344 |
- if(nmStatus){
|
|
| 1345 |
- varValStatus = false; |
|
| 1346 |
- } |
|
| 1347 |
- |
|
| 1348 |
- } |
|
| 1349 |
- |
|
| 1350 |
- if(varValStr == ''){
|
|
| 1351 |
- varValStr = phone; |
|
| 1352 |
- }else{
|
|
| 1353 |
- varValStr = varValStr + "¶" + phone; |
|
| 1354 |
- } |
|
| 1355 |
- |
|
| 1356 |
- if(rep1Status && (typeof(rep1) != 'undefined' && rep1 != null && rep1 !="")){
|
|
| 1357 |
- |
|
| 1358 |
- if(varValStr == ''){
|
|
| 1359 |
- varValStr = rep1.replaceAll(",","§");
|
|
| 1360 |
- }else{
|
|
| 1361 |
- varValStr = varValStr + "¶" + rep1.replaceAll(",","§");
|
|
| 1362 |
- } |
|
| 1363 |
- |
|
| 1364 |
- }else{
|
|
| 1365 |
- |
|
| 1366 |
- if(rep1Status){
|
|
| 1367 |
- varValStatus = false; |
|
| 1368 |
- } |
|
| 1369 |
- |
|
| 1370 |
- } |
|
| 1371 |
- |
|
| 1372 |
- |
|
| 1373 |
- if(rep2Status && (typeof(rep2) != 'undefined' && rep2 != null && rep2 !="")){
|
|
| 1374 |
- |
|
| 1375 |
- if(varValStr == ''){
|
|
| 1376 |
- varValStr = rep2.replaceAll(",","§");
|
|
| 1377 |
- }else{
|
|
| 1378 |
- varValStr = varValStr + "¶" + rep2.replaceAll(",","§");
|
|
| 1379 |
- } |
|
| 1380 |
- |
|
| 1381 |
- }else{
|
|
| 1382 |
- |
|
| 1383 |
- if(rep2Status){
|
|
| 1384 |
- varValStatus = false; |
|
| 1385 |
- } |
|
| 1386 |
- |
|
| 1387 |
- } |
|
| 1388 |
- |
|
| 1389 |
- if(rep3Status && (typeof(rep3) != 'undefined' && rep3 != null && rep3 !="")){
|
|
| 1390 |
- |
|
| 1391 |
- if(varValStr == ''){
|
|
| 1392 |
- varValStr = rep3.replaceAll(",","§");
|
|
| 1393 |
- }else{
|
|
| 1394 |
- varValStr = varValStr + "¶" + rep3.replaceAll(",","§");
|
|
| 1395 |
- } |
|
| 1396 |
- |
|
| 1397 |
- }else{
|
|
| 1398 |
- |
|
| 1399 |
- if(rep3Status){
|
|
| 1400 |
- varValStatus = false; |
|
| 1401 |
- } |
|
| 1402 |
- |
|
| 1403 |
- } |
|
| 1404 |
- |
|
| 1405 |
- if(rep4Status && (typeof(rep4) != 'undefined' && rep4 != null && rep4 !="")){
|
|
| 1406 |
- |
|
| 1407 |
- if(varValStr == ''){
|
|
| 1408 |
- varValStr = rep4.replaceAll(",","§");
|
|
| 1409 |
- }else{
|
|
| 1410 |
- varValStr = varValStr + "¶" + rep4.replaceAll(",","§");
|
|
| 1411 |
- } |
|
| 1412 |
- |
|
| 1413 |
- }else{
|
|
| 1414 |
- |
|
| 1415 |
- if(rep4Status){
|
|
| 1416 |
- varValStatus = false; |
|
| 1417 |
- } |
|
| 1418 |
- |
|
| 1419 |
- } |
|
| 1420 |
- |
|
| 1421 |
- if(!varValStatus){
|
|
| 1422 |
- |
|
| 1423 |
- alert("특정문구 일괄변환에 대한 일부 데이터가 누락된 부분이 있습니다. 데이터를 확인해 주세요.");
|
|
| 1424 |
- return false; |
|
| 1425 |
- |
|
| 1426 |
- } |
|
| 1427 |
- |
|
| 1428 |
- varValList[0] = varValStr; |
|
| 1429 |
- |
|
| 1430 |
- $("#varValList").val(varValList);
|
|
| 1431 |
- } |
|
| 1432 |
- |
|
| 1433 | 1238 |
} |
| 1434 | 1239 |
|
| 1435 | 1240 |
form.method = "post"; |
... | ... | @@ -1730,13 +1535,13 @@ |
| 1730 | 1535 |
<p>주소록, 엑셀에 입력된 내용을 이용해 수신자마다 다른 내용의 메시지를 발송하는 기능</p> |
| 1731 | 1536 |
</div> |
| 1732 | 1537 |
<div class="convers_middle"> |
| 1733 |
- <a href="javascript:void(0)" class="changeWord" value="\#{이름}"><c:out value="\#{이름}"/></a>
|
|
| 1538 |
+ <a href="javascript:void(0)" class="changeWord" value="[*이름*]"><c:out value="[*이름*]"/></a> |
|
| 1734 | 1539 |
</div> |
| 1735 | 1540 |
<div class="convers_bottom"> |
| 1736 |
- <a href="javascript:void(0)" class="changeWord" value="\#{1}"><c:out value="\#{1}"/></a>
|
|
| 1737 |
- <a href="javascript:void(0)" class="changeWord" value="\#{2}"><c:out value="\#{2}"/></a>
|
|
| 1738 |
- <a href="javascript:void(0)" class="changeWord" value="\#{3}"><c:out value="\#{3}"/></a>
|
|
| 1739 |
- <a href="javascript:void(0)" class="changeWord" value="\#{4}"><c:out value="\#{4}"/></a>
|
|
| 1541 |
+ <a href="javascript:void(0)" class="changeWord" value="[*1*]"><c:out value="[*1*]"/></a> |
|
| 1542 |
+ <a href="javascript:void(0)" class="changeWord" value="[*2*]"><c:out value="[*2*]"/></a> |
|
| 1543 |
+ <a href="javascript:void(0)" class="changeWord" value="[*3*]"><c:out value="[*3*]"/></a> |
|
| 1544 |
+ <a href="javascript:void(0)" class="changeWord" value="[*4*]"><c:out value="[*4*]"/></a> |
|
| 1740 | 1545 |
</div> |
| 1741 | 1546 |
</div> |
| 1742 | 1547 |
<button type="button" class="btn_close" onclick="miniPopup(this)">닫기</button> |
... | ... | @@ -2053,7 +1858,7 @@ |
| 2053 | 1858 |
<ul class="thumb_wrap liOnImg ui-sortable"></ul> |
| 2054 | 1859 |
<!-- //업로드한 이미지의 썸네일 영역 --> |
| 2055 | 1860 |
<label for="smsTxtArea" class="label"></label> |
| 2056 |
- <textarea id="smsTxtArea" name="smsTxtArea" class="put_text"></textarea> |
|
| 1861 |
+ <textarea id="smsTxtArea" class="put_text"></textarea> |
|
| 2057 | 1862 |
<div class="text_length"> |
| 2058 | 1863 |
<div name="afterDeny"> |
| 2059 | 1864 |
<p> |
... | ... | @@ -2066,7 +1871,7 @@ |
| 2066 | 1871 |
</div> |
| 2067 | 1872 |
<div class="put_right"> |
| 2068 | 1873 |
<button type="button" class="btnType btnType9" id="failCheckInit">초기화</button> |
| 2069 |
- <button type="button" class="btnType btnType7" onclick="javascript:fn_errorChk(); return false;">오류검사<i class="qmMark"></i></button> |
|
| 1874 |
+<!-- <button type="button" class="btnType btnType7" onclick="javascript:fn_errorChk(); return false;">오류검사<i class="qmMark"></i></button> --> |
|
| 2070 | 1875 |
</div> |
| 2071 | 1876 |
</div> |
| 2072 | 1877 |
</td> |
--- src/main/webapp/WEB-INF/jsp/web/kakao/sent/KakaoSentView.jsp
+++ src/main/webapp/WEB-INF/jsp/web/kakao/sent/KakaoSentView.jsp
... | ... | @@ -557,10 +557,10 @@ |
| 557 | 557 |
<ul class="list_tab"> |
| 558 | 558 |
<li class="tab active"><button type="button" onclick="fnTabLoad('',0); return false;">전체</button></li>
|
| 559 | 559 |
<li class="tab"><button type="button" onclick="fnTabLoad('at', 1); return false;">알림톡</button></li>
|
| 560 |
- <%-- <c:if test="${pageContext.request.serverName == 'localhost'
|
|
| 560 |
+ <c:if test="${pageContext.request.serverName == 'localhost'
|
|
| 561 | 561 |
|| pageContext.request.serverName == '119.193.215.98'}"> |
| 562 | 562 |
<li class="tab"><button type="button" onclick="fnTabLoad('ft', 2); return false;">친구톡</button></li>
|
| 563 |
- </c:if> --%> |
|
| 563 |
+ </c:if> |
|
| 564 | 564 |
</ul><!--// tab button --> |
| 565 | 565 |
</div> |
| 566 | 566 |
<!-- 예약관리 > 전체 --> |
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?