From 3afef8e37cd1476f2f6d4224c4d1b75a4f0dc834 Mon Sep 17 00:00:00 2001 From: "hehihoho3@gmail.com" Date: Tue, 18 Mar 2025 12:11:23 +0900 Subject: [PATCH] =?UTF-8?q?=EC=95=8C=EB=A6=BC=ED=86=A1=20=EC=88=98?= =?UTF-8?q?=EC=8B=A0=EC=9E=90=20=EB=AA=A9=EB=A1=9D=20=ED=83=80=EB=B8=94?= =?UTF-8?q?=EB=A0=88=EC=9D=B4=ED=84=B0=EB=A1=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../let/kakao/kakaoComm/KakaoReturnVO.java | 417 +----------------- .../let/kakao/kakaoComm/KakaoSendAdvcVO.java | 5 +- .../let/kakao/kakaoComm/KakaoSendUtil.java | 231 +++++++--- .../kakaoComm/kakaoApi/KakaoApiJsonSave.java | 77 +--- .../impl/KakaoAlimTalkServiceImpl.java | 78 +++- .../web/KakaoAlimTalkSendController.java | 4 +- .../itn/let/mjo/mjocommon/MjonCommon.java | 22 + .../msgdata/web/MjonMsgDataController.java | 8 - .../msgdata/at/KakaoAlimtalkMsgDataView.jsp | 115 +++-- .../jsp/web/msgdata/MsgDataSMLView.jsp | 3 - src/main/webapp/js/MJUtill.js | 13 + src/main/webapp/js/kakao/at/addr.js | 139 ++++-- src/main/webapp/js/kakao/at/alimtalkExcel.js | 9 +- src/main/webapp/js/kakao/at/init.js | 2 + src/main/webapp/js/kakao/at/priceClclt.js | 30 +- src/main/webapp/js/kakao/at/tabulator.js | 165 +++---- 16 files changed, 528 insertions(+), 790 deletions(-) diff --git a/src/main/java/itn/let/kakao/kakaoComm/KakaoReturnVO.java b/src/main/java/itn/let/kakao/kakaoComm/KakaoReturnVO.java index bb259b28..05cba634 100644 --- a/src/main/java/itn/let/kakao/kakaoComm/KakaoReturnVO.java +++ b/src/main/java/itn/let/kakao/kakaoComm/KakaoReturnVO.java @@ -4,6 +4,9 @@ import java.util.ArrayList; import java.util.List; import itn.com.cmm.ComDefaultVO; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; /** * @FileName : KakaoReturnVO.java @@ -13,6 +16,9 @@ import itn.com.cmm.ComDefaultVO; * @프로그램 설명 : 카카오톡 리턴 변수 목록 */ +@Getter +@Setter +@ToString public class KakaoReturnVO extends ComDefaultVO{ private static final long serialVersionUID = 1L; @@ -130,415 +136,4 @@ public class KakaoReturnVO extends ComDefaultVO{ private String businessType = ""; //카카오톡 채널 비즈니스 인증 타입 - public static long getSerialversionuid() { - return serialVersionUID; - } - - public String getBizReturnMsg() { - return bizReturnMsg; - } - - public void setBizReturnMsg(String bizReturnMsg) { - this.bizReturnMsg = bizReturnMsg; - } - - public String getBizReturnCode() { - return bizReturnCode; - } - - public void setBizReturnCode(String bizReturnCode) { - this.bizReturnCode = bizReturnCode; - } - - public String getProfileId() { - return profileId; - } - - public void setProfileId(String profileId) { - this.profileId = profileId; - } - - public String getTotalCount() { - return totalCount; - } - - public void setTotalCount(String totalCount) { - this.totalCount = totalCount; - } - - public String getTotalPage() { - return totalPage; - } - - public void setTotalPage(String totalPage) { - this.totalPage = totalPage; - } - - public String getCurrentPage() { - return currentPage; - } - - public void setCurrentPage(String currentPage) { - this.currentPage = currentPage; - } - - public String getSenderKey() { - return senderKey; - } - - public void setSenderKey(String senderKey) { - this.senderKey = senderKey; - } - - public String getSenderKeyType() { - return senderKeyType; - } - - public void setSenderKeyType(String senderKeyType) { - this.senderKeyType = senderKeyType; - } - - public String getTemplateCode() { - return templateCode; - } - - public void setTemplateCode(String templateCode) { - this.templateCode = templateCode; - } - - public String getTemplateName() { - return templateName; - } - - public void setTemplateName(String templateName) { - this.templateName = templateName; - } - - public String getCategoryCode() { - return categoryCode; - } - - public void setCategoryCode(String categoryCode) { - this.categoryCode = categoryCode; - } - - public String getCreatedAt() { - return createdAt; - } - - public void setCreatedAt(String createdAt) { - this.createdAt = createdAt; - } - - public String getModifiedAt() { - return modifiedAt; - } - - public void setModifiedAt(String modifiedAt) { - this.modifiedAt = modifiedAt; - } - - public String getServiceStatus() { - return serviceStatus; - } - - public void setServiceStatus(String serviceStatus) { - this.serviceStatus = serviceStatus; - } - - public List getTemplatList() { - return templatList; - } - - public void setTemplatList(List templatList) { - this.templatList = templatList; - } - - public String getUuid() { - return uuid; - } - - public void setUuid(String uuid) { - this.uuid = uuid; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getStatus() { - return status; - } - - public void setStatus(String status) { - this.status = status; - } - - public boolean isBlock() { - return block; - } - - public void setBlock(boolean block) { - this.block = block; - } - - public boolean isDormant() { - return dormant; - } - - public void setDormant(boolean dormant) { - this.dormant = dormant; - } - - public String getTitle() { - return title; - } - - public void setTitle(String title) { - this.title = title; - } - - public String getDescription() { - return description; - } - - public void setDescription(String description) { - this.description = description; - } - - public String getImageUrl() { - return imageUrl; - } - - public void setImageUrl(String imageUrl) { - this.imageUrl = imageUrl; - } - - public String getListTitle() { - return listTitle; - } - - public void setListTitle(String listTitle) { - this.listTitle = listTitle; - } - - public String getListDescription() { - return listDescription; - } - - public void setListDescription(String listDescription) { - this.listDescription = listDescription; - } - - public String getSumTitle() { - return sumTitle; - } - - public void setSumTitle(String sumTitle) { - this.sumTitle = sumTitle; - } - - public String getSumDescription() { - return sumDescription; - } - - public void setSumDescription(String sumDescription) { - this.sumDescription = sumDescription; - } - - public String getProfileStatus() { - return profileStatus; - } - - public void setProfileStatus(String profileStatus) { - this.profileStatus = profileStatus; - } - - public boolean isAlimtalk() { - return alimtalk; - } - - public void setAlimtalk(boolean alimtalk) { - this.alimtalk = alimtalk; - } - - public boolean isBizchat() { - return bizchat; - } - - public void setBizchat(boolean bizchat) { - this.bizchat = bizchat; - } - - public boolean isBrandtalk() { - return brandtalk; - } - - public void setBrandtalk(boolean brandtalk) { - this.brandtalk = brandtalk; - } - - public String getCommittalCompanyName() { - return committalCompanyName; - } - - public void setCommittalCompanyName(String committalCompanyName) { - this.committalCompanyName = committalCompanyName; - } - - public String getChannelKey() { - return channelKey; - } - - public void setChannelKey(String channelKey) { - this.channelKey = channelKey; - } - - public boolean isBusinessProfile() { - return businessProfile; - } - - public void setBusinessProfile(boolean businessProfile) { - this.businessProfile = businessProfile; - } - - public String getBusinessType() { - return businessType; - } - - public void setBusinessType(String businessType) { - this.businessType = businessType; - } - - public String getTemplateMessageType() { - return templateMessageType; - } - - public void setTemplateMessageType(String templateMessageType) { - this.templateMessageType = templateMessageType; - } - - public String getTemplateEmphasizeType() { - return templateEmphasizeType; - } - - public void setTemplateEmphasizeType(String templateEmphasizeType) { - this.templateEmphasizeType = templateEmphasizeType; - } - - public String getTemplateContent() { - return templateContent; - } - - public void setTemplateContent(String templateContent) { - this.templateContent = templateContent; - } - - public String getTemplateExtra() { - return templateExtra; - } - - public void setTemplateExtra(String templateExtra) { - this.templateExtra = templateExtra; - } - - public String getTemplateAd() { - return templateAd; - } - - public void setTemplateAd(String templateAd) { - this.templateAd = templateAd; - } - - public String getTemplateImageName() { - return templateImageName; - } - - public void setTemplateImageName(String templateImageName) { - this.templateImageName = templateImageName; - } - - public String getTemplateImageUrl() { - return templateImageUrl; - } - - public void setTemplateImageUrl(String templateImageUrl) { - this.templateImageUrl = templateImageUrl; - } - - public String getTemplateTitle() { - return templateTitle; - } - - public void setTemplateTitle(String templateTitle) { - this.templateTitle = templateTitle; - } - - public String getTemplateSubtitle() { - return templateSubtitle; - } - - public void setTemplateSubtitle(String templateSubtitle) { - this.templateSubtitle = templateSubtitle; - } - - public String getTemplateHeader() { - return templateHeader; - } - - public void setTemplateHeader(String templateHeader) { - this.templateHeader = templateHeader; - } - - public Boolean getSecurityFlag() { - return securityFlag; - } - - public void setSecurityFlag(Boolean securityFlag) { - this.securityFlag = securityFlag; - } - - public String getInspectionStatus() { - return inspectionStatus; - } - - public void setInspectionStatus(String inspectionStatus) { - this.inspectionStatus = inspectionStatus; - } - - public List getButtonList() { - return buttonList; - } - - public void setButtonList(List buttonList) { - this.buttonList = buttonList; - } - - public List getQuickReplyList() { - return quickReplyList; - } - - public void setQuickReplyList(List quickReplyList) { - this.quickReplyList = quickReplyList; - } - - public List getCommentList() { - return commentList; - } - - public void setCommentList(List commentList) { - this.commentList = commentList; - } - - public List getItemList() { - return itemList; - } - - public void setItemList(List itemList) { - this.itemList = itemList; - } } diff --git a/src/main/java/itn/let/kakao/kakaoComm/KakaoSendAdvcVO.java b/src/main/java/itn/let/kakao/kakaoComm/KakaoSendAdvcVO.java index 839a73b3..093a82bc 100644 --- a/src/main/java/itn/let/kakao/kakaoComm/KakaoSendAdvcVO.java +++ b/src/main/java/itn/let/kakao/kakaoComm/KakaoSendAdvcVO.java @@ -41,8 +41,9 @@ public class KakaoSendAdvcVO implements Serializable { private String subMsgSendYn; // 대체문자 전송 여부 private String subMsgTxt; // 대체문자 내용 private String subMsgType; // 대체문자 타입 - private String bizJsonName; // JSON 파일명 private String reqDate; // 예약일시 + + private String jsonStr; // jsonStr // ===== // ===== @@ -71,8 +72,8 @@ public class KakaoSendAdvcVO implements Serializable { "\n , subMsgSendYn=[" + subMsgSendYn + "]" + "\n , subMsgTxt=[" + subMsgTxt + "]" + "\n , subMsgType=[" + subMsgType + "]" + - "\n , bizJsonName=[" + bizJsonName + "]" + "\n , reqDate=[" + reqDate + "]" + + "\n , jsonStr=[" + jsonStr + "]" + "\n , ==== MJ_MSG_DATA INSERT DATA END =======" + "\n " + "\n , smsPrice=[" + smsPrice + "]" + diff --git a/src/main/java/itn/let/kakao/kakaoComm/KakaoSendUtil.java b/src/main/java/itn/let/kakao/kakaoComm/KakaoSendUtil.java index 48a0eb42..bc77e1a2 100644 --- a/src/main/java/itn/let/kakao/kakaoComm/KakaoSendUtil.java +++ b/src/main/java/itn/let/kakao/kakaoComm/KakaoSendUtil.java @@ -2,12 +2,12 @@ package itn.let.kakao.kakaoComm; import java.text.SimpleDateFormat; import java.util.ArrayList; -import java.util.Arrays; import java.util.Calendar; import java.util.Date; -import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import javax.annotation.Resource; @@ -18,6 +18,7 @@ import org.springframework.stereotype.Component; import itn.com.cmm.util.StringUtil; import itn.let.kakao.kakaoComm.kakaoApi.KakaoApiJsonSave; +import itn.let.kakao.kakaoComm.kakaoApi.KakaoApiTemplate; import itn.let.mail.service.StatusResponse; import itn.let.mjo.mjocommon.MjonCommon; import itn.let.mjo.msg.service.MjonMsgVO; @@ -38,6 +39,9 @@ public class KakaoSendUtil { @Resource(name = "MjonMsgDataService") private MjonMsgDataService mjonMsgDataService; + @Autowired + KakaoApiTemplate kakaoApiTemplate; + @Autowired private PriceAndPoint priceAndPoint; @@ -52,7 +56,7 @@ public class KakaoSendUtil { public static final String LONG_MSG_TYPE = "MMS"; /** - * @methodName : kakaoSendPrice_advc + * @methodName : populateSendLists _advc * @author : 이호영 * @date : 2025. 3. 7. * @description : 기존 kakaoSendPrice 개선 @@ -91,20 +95,40 @@ public class KakaoSendUtil { Calendar calendar = Calendar.getInstance(); calendar.setTime(baseDate); // calendar에 baseDate 설정 + + + KakaoReturnVO templateDetail = kakaoApiTemplate.selectKakaoApiTemplateDetail(kakaoVO); + log.info(" + templateDetail :: [{}]", templateDetail.toString()); + String templateContent = templateDetail.getTemplateContent(); // 알림톡 템플릿 + String templateTitle = templateDetail.getTemplateTitle(); + log.info(" + templateTitle :: [{}]",templateTitle); + + kakaoVO.setTxtReplYn(replYnChecker(templateContent+" "+templateTitle)); + + String subMsgTxt = kakaoVO.getSubMsgTxt(); // 실패 대체 문자 + + // 시스템 기본 단가 정보 불러오기 + JoinSettingVO sysJoinSetVO = mjonMsgDataService.selectJoinSettingInfo(); + // 사용자 개인 단가 정보 불러오기 + MberManageVO mberManageVO = mjonMsgDataService.selectMberManageInfo(kakaoVO.getUserId()); + int counter = 0; // 분할 건수 카운터 - // Map에 총 갯수가 수신자 갯수와 동일함 for(Map variables : kakaoVO.getVarListMap()) { KakaoSendAdvcVO sendVO = new KakaoSendAdvcVO(); - +// 공통 기본값 + sendVO.setMsgType("8"); + sendVO.setSenderKey(kakaoVO.getSenderKey()); + sendVO.setTemplateCode(kakaoVO.getTemplateCode()); + sendVO.setUserId(kakaoVO.getUserId()); // 수신자 + sendVO.setCallFrom(kakaoVO.getCallFrom()); // 발신자 + sendVO.setAgentCode("04"); // 발신자 // step1 // Step 1-1: 값 치환 및 수신번호 셋팅 - String templateContent = kakaoVO.getTemplateContent(); // 알림톡 템플릿 - // Step 1-2: 수신자 정보 설정 (callToList는 항상 설정). if (variables.containsKey("callToList")) { sendVO.setCallTo(variables.get("callToList")); @@ -114,17 +138,19 @@ public class KakaoSendUtil { // Step 1-3: 템플릿 치환데이터 설정 // TxtReplYn이 "Y"일 때만 치환 수행 if ("Y".equals(kakaoVO.getTxtReplYn())) { - templateContent = replaceTemplateVariables(templateContent, variables); + templateContent = mjonCommon.ATReplaceTemplateVariables(templateContent, variables); + if("TEXT".equals(templateDetail.getTemplateEmphasizeType())) { + templateTitle = mjonCommon.ATReplaceTemplateVariables(templateTitle, variables); + } } + sendVO.setTemplateTitle(templateTitle); sendVO.setTemplateContent(templateContent); - + // Step 1-4: 실패 대체 문자 치환데이터 설정 - if("Y".equals(kakaoVO.getSubMsgSendYn())) { - String subMsgTxt = kakaoVO.getSubMsgTxt(); // 실패 대체 치환 문자 - // TxtReplYn이 "Y"일 때만 치환 수행 - if ("Y".equals(kakaoVO.getSubMsgTxtReplYn())) { - subMsgTxt = replaceTemplateVariables(subMsgTxt, variables); + if("Y".equals(kakaoVO.getSubMsgSendYn())) { // 대체문자가 있나? + if ("Y".equals(kakaoVO.getSubMsgTxtReplYn())) { // 치환데이터가 있나? + subMsgTxt = mjonCommon.ATReplaceTemplateVariables(subMsgTxt, variables); } sendVO.setSubMsgTxt(subMsgTxt);// 실패 } @@ -136,43 +162,41 @@ public class KakaoSendUtil { ); */ + // Step1 END - // step3 - // 바이트 수 체크 및 금액설정 +// step3 +// 바이트 수 체크 및 금액설정 - // 시스템 기본 단가 정보 불러오기 - JoinSettingVO sysJoinSetVO = mjonMsgDataService.selectJoinSettingInfo(); - // 사용자 개인 단가 정보 불러오기 - MberManageVO mberManageVO = mjonMsgDataService.selectMberManageInfo(kakaoVO.getUserId()); Float kakaoAtPrice = mberManageVO.getKakaoAtPrice(); // 유효한 단가 계산 float shortPrice = getValidPrice(mberManageVO.getShortPrice(), sysJoinSetVO.getShortPrice()); float longPrice = getValidPrice(mberManageVO.getLongPrice(), sysJoinSetVO.getLongPrice()); // 공통 가격 설정 - kakaoVO.setSmsPrice(shortPrice); - kakaoVO.setMmsPrice(longPrice); + sendVO.setSmsPrice(shortPrice); + sendVO.setMmsPrice(longPrice); if("Y".equals(kakaoVO.getSubMsgSendYn())) { int smsTxtByte = mjonCommon.getSmsTxtBytes(sendVO.getSubMsgTxt()); - String sendType = getMsgType(smsTxtByte); + sendVO.setSubMsgType(sendType); if ("INVALID".equals(sendType)) { statusResponseSet(statusResponse, HttpStatus.BAD_REQUEST, "전송 문자 길이를 초과하였습니다.");return kakaoSendAdvcListVO; } boolean isMms = "MMS".equals(sendType); - kakaoAtPrice = isMms ? longPrice : shortPrice; - kakaoVO.setKakaoAtPrice(getValidPrice(mberManageVO.getKakaoAtPrice(), sysJoinSetVO.getKakaoAtPrice())); +// kakaoAtPrice = isMms ? longPrice : shortPrice; +// sendVO.setKakaoAtPrice(getValidPrice(mberManageVO.getKakaoAtPrice(), sysJoinSetVO.getKakaoAtPrice())); + sendVO.setKakaoAtPrice(isMms ? longPrice : shortPrice); } else { kakaoAtPrice = getValidPrice(mberManageVO.getKakaoAtPrice(), sysJoinSetVO.getKakaoAtPrice()); - kakaoVO.setKakaoAtPrice(kakaoAtPrice); + sendVO.setKakaoAtPrice(kakaoAtPrice); } @@ -181,7 +205,7 @@ public class KakaoSendUtil { // 예약 시간 설정 및 분할 데이터 설정 if ("Y".equalsIgnoreCase(kakaoVO.getReserveYn())) { // 분할 발송일 경우 - if ("on".equalsIgnoreCase(kakaoVO.getDivideChk())) { + if ("Y".equalsIgnoreCase(kakaoVO.getDivideChk())) { if (counter == Integer.parseInt(kakaoVO.getDivideCnt())) { // 지정된 건수마다 간격 추가 counter = 0; calendar.add(Calendar.MINUTE, Integer.parseInt(kakaoVO.getDivideTime())); @@ -190,26 +214,20 @@ public class KakaoSendUtil { } // 예약 시간 설정 } - // 즉시 발송인경우 현재 시간 // 예약인 경우 위에 설정한 시간 입력 sendVO.setReqDate(sdf.format(calendar.getTime())); - - - - // step5 - // 전송 메세지 설정 kakaoSendMsg 참고 - - - -// kakaoSendAdvcVO.setSendType("AT"); - sendVO.setMsgType("8"); - sendVO.setUserId(kakaoVO.getUserId()); - + // 전송 메세지 설정 json파일 만들기 + if("Y".equals(kakaoVO.getBizJsonYn())) { + String jsonStr = kakaoApiJsonSave.kakaoApiJsonSave_advc(sendVO, templateDetail); + sendVO.setJsonStr(jsonStr); + } +// log.info(" + sendVO :: [{}]", sendVO.toString()); + kakaoSendAdvcListVO.add(sendVO); } @@ -217,6 +235,17 @@ public class KakaoSendUtil { } + private String replYnChecker(String input) { + // #{...} 패턴을 확인하는 정규 표현식 + String regex = "#\\{[^}]+\\}"; + Pattern pattern = Pattern.compile(regex); + Matcher matcher = pattern.matcher(input); + + // 패턴이 존재하면 "Y", 없으면 "N" 반환 + return matcher.find() ? "Y" : "N"; + } + + public Float getValidPrice(Float personalPrice, Float defaultPrice) { return (personalPrice != null && personalPrice > 0) ? personalPrice : defaultPrice; } @@ -251,25 +280,7 @@ public class KakaoSendUtil { } - /** - * @methodName : replaceTemplateVariables - * @author : 이호영 - * @date : 2025. 3. 12. - * @description : 헬퍼 메서드: 템플릿 변수 치환 - * @return : String - * @param content - * @param variables - * @return - */ - private String replaceTemplateVariables(String content, Map variables) { - String result = content; - for (Map.Entry entry : variables.entrySet()) { - String placeholder = entry.getKey(); - String value = entry.getValue(); - result = result.replace(placeholder, value); - } - return result; - } + @@ -312,8 +323,6 @@ public class KakaoSendUtil { String tempSubMagTxt = kakaoVO.getSubMsgTxt().replace("\r\n", "\n"); if(kakaoVO.getSubMsgTxtReplYn().equals("Y")) { tempSubMagTxt = kakaoSubMagTxtRepl(tempSubMagTxt, kakaoVO, count); -// tempSubMagTxt = kakaoSubMagTxtRepl_advc(tempSubMagTxt, kakaoVO, count); - System.out.println("+ tempSubMagTxt :: "+ tempSubMagTxt); } int bytes = tempSubMagTxt.getBytes(charset).length; @@ -641,6 +650,106 @@ public class KakaoSendUtil { System.out.println("@@ 대체문자타입 : " + setSendMsgVO.getSubMsgType()); } + if(kakaoVO.getBizJsonYn().equals("Y")) { + kakaoVO.setDestPhone(kakaoVO.getCallToList()[count]); // 수신 번호 + + String[] varValInfo = null; + if( kakaoVO.getVarValList().size() != 0) { + varValInfo = kakaoVO.getVarValList().get(count); + } + String jsonFileName = kakaoApiJsonSave.kakaoApiJsonSave(kakaoVO, varValInfo); + setSendMsgVO.setBizJsonName(jsonFileName); //json 파일명 + } + + kakaoSendList.add(setSendMsgVO); + } + kakaoVO.setKakaoSendList(kakaoSendList); + + } catch (Exception e) { + System.out.println(e.toString()); + e.printStackTrace(); + } + + return kakaoVO; + } + + /** + * @methodName : kakaoSendMsg_advc + * @author : 이호영 + * @date : 2025. 3. 13. + * @description : kakaoSendMsg 개선 + * @return : KakaoVO + * @param kakaoVO + * @return + * @throws Exception + * + */ + public KakaoVO kakaoSendMsg_advc(KakaoVO kakaoVO) throws Exception { + List kakaoSendList = new ArrayList(); + //전체 받는사람 수량만큼 반복 확인 + int callToCnt = kakaoVO.getCallToList().length; + try { + for(int count =0; count < callToCnt; count++) { + + KakaoVO setSendMsgVO = new KakaoVO(); + + setSendMsgVO.setDestPhone(kakaoVO.getCallToList()[count]); // 수신 번호 + // 카카오 전송내용 설정 + // 변환문자 포함(Y), 미포함(N) + if(kakaoVO.getTxtReplYn().equals("Y")) { + + String templateContent = kakaoSubMagTxtRepl(kakaoVO.getTemplateContent(), kakaoVO, count); + setSendMsgVO.setTemplateContent(templateContent); + + if(kakaoVO.getTemplateEmphasizeType().equals("TEXT")) { + + String title = kakaoSubMagTxtRepl(kakaoVO.getTemplateTitle(), kakaoVO, count); + String subTitle = kakaoVO.getTemplateSubtitle(); +// title = title +"§§"+ subTitle; + setSendMsgVO.setTemplateEmphasizeType(kakaoVO.getTemplateEmphasizeType()); + setSendMsgVO.setTemplateTitle(title); + } + + }else { + + if(kakaoVO.getTemplateEmphasizeType().equals("TEXT")) { + + String title = kakaoSubMagTxtRepl(kakaoVO.getTemplateTitle(), kakaoVO, count); + String subTitle = kakaoVO.getTemplateSubtitle(); +// title = title +"§§"+ subTitle; + setSendMsgVO.setTemplateEmphasizeType(kakaoVO.getTemplateEmphasizeType()); + setSendMsgVO.setTemplateTitle(title); + } + + // 템플릿 내용 설정 + setSendMsgVO.setTemplateContent(kakaoVO.getTemplateContent()); + } + + //대체문자 포함(Y), 미포함(N) + if(kakaoVO.getSubMsgSendYn().equals("Y")) { + + String charset = "euc-kr"; //문자 바이트 계산에 필요한 캐릭터 셋 : 한글 2Byte로 계산 + + String tempSubMagTxt = kakaoVO.getSubMsgTxt().replace("\r\n", "\n"); + kakaoVO.setKakaoSubMagOrgnlTxt(tempSubMagTxt); + if(kakaoVO.getSubMsgTxtReplYn().equals("Y")) { + tempSubMagTxt = kakaoSubMagTxtRepl(tempSubMagTxt, kakaoVO, count); + } + System.out.println("@@ 대체문자내용 : " + tempSubMagTxt); + setSendMsgVO.setSubMsgTxt(tempSubMagTxt); + + int FrBytes = tempSubMagTxt.getBytes(charset).length; + System.out.println("@@ 대체문자길이 : " + FrBytes); + //메세지 길이가 90Byte가 초과시 MMS + if(FrBytes > 90) { + setSendMsgVO.setSubMsgType("MMS"); + }else {// 아니면 SMS + setSendMsgVO.setSubMsgType("SMS"); + } + + System.out.println("@@ 대체문자타입 : " + setSendMsgVO.getSubMsgType()); + } + if(kakaoVO.getBizJsonYn().equals("Y")) { kakaoVO.setDestPhone(kakaoVO.getCallToList()[count]); // 수신 번호 diff --git a/src/main/java/itn/let/kakao/kakaoComm/kakaoApi/KakaoApiJsonSave.java b/src/main/java/itn/let/kakao/kakaoComm/kakaoApi/KakaoApiJsonSave.java index 1d396889..65790add 100644 --- a/src/main/java/itn/let/kakao/kakaoComm/kakaoApi/KakaoApiJsonSave.java +++ b/src/main/java/itn/let/kakao/kakaoComm/kakaoApi/KakaoApiJsonSave.java @@ -8,6 +8,7 @@ import java.io.OutputStreamWriter; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; +import java.util.Map; import org.json.simple.JSONArray; import org.json.simple.JSONObject; @@ -18,6 +19,7 @@ import org.springframework.stereotype.Component; import itn.com.cmm.util.StringUtil; import itn.let.kakao.kakaoComm.KakaoButtonVO; import itn.let.kakao.kakaoComm.KakaoReturnVO; +import itn.let.kakao.kakaoComm.KakaoSendAdvcVO; import itn.let.kakao.kakaoComm.KakaoVO; @Component @@ -32,33 +34,7 @@ public class KakaoApiJsonSave { static String json; - public String kakaoApiJsonSave_advc(KakaoVO kakaoVO, String[] varValInfo) { - // json파일 저장 - - - Date nowDate = new Date(); - SimpleDateFormat todayFrom = new SimpleDateFormat("yyyyMMdd"); - SimpleDateFormat timeFrom = new SimpleDateFormat("HHmmss"); - String jsonFileName = mjonBizJsonDir+"/"+kakaoVO.getUserId()+"/"+todayFrom.format(nowDate)+"/"+kakaoVO.getSendType(); // 아이디/날짜/타입 - - String fileName = timeFrom.format(nowDate)+"_"+kakaoVO.getDestPhone()+".json"; - - -// File userIdFile = new File(jsonFileName); -// if(!userIdFile.exists()) { -// userIdFile.mkdirs(); // 없으면 하위 디렉토리 까지 생성 -// jsonFileName = jsonFileName +"/"+fileName; -// }else { -// -// jsonFileName = jsonFileName +"/"+fileName; -// System.out.println("jsonFileName : "+jsonFileName); -// File file1 = new File(jsonFileName); -// if (file1.isFile()) { -// return jsonFileName; -// } -// } - - KakaoReturnVO templateDetail = kakaoApiTemplate.selectKakaoApiTemplateDetail(kakaoVO); + public String kakaoApiJsonSave_advc(KakaoSendAdvcVO sendVO, KakaoReturnVO templateDetail) { // 버튼리스트 JSON 생성 JSONArray buttonList = new JSONArray(); @@ -86,44 +62,11 @@ public class KakaoApiJsonSave { JSONObject templateDetailInfo = new JSONObject(); String emphasizeType = templateDetail.getTemplateEmphasizeType(); + if(emphasizeType.equals("TEXT")) { - - String templateTitle = templateDetail.getTemplateTitle(); - if(kakaoVO.getVarNmList().size() != 0) { - String[] varNm = new String[kakaoVO.getVarNmList().size()]; - int q=0; - for(String temp : kakaoVO.getVarNmList()) { - temp = temp.replaceAll("\\#\\{" , "§§"); - temp = temp.replaceAll("\\}" , "§"); - varNm[q] = temp; - q++; - } - List varValList = kakaoVO.getVarValList(); // value 값 - - templateTitle = templateTitle.replaceAll(String.valueOf((char)13), ""); - templateTitle = templateTitle.replaceAll("\\#\\{" , "§§"); - templateTitle = templateTitle.replaceAll("\\}" , "§"); - - for(int i=0; i < varNm.length; i++) { - for(int j=0; j < varValInfo.length; j++) { - if (templateTitle.indexOf(varNm[i]) > -1) { - if(varValInfo[j] != null) { - templateTitle = templateTitle.replaceAll(varNm[i] , StringUtil.getString(varValInfo[j])); - }else { - templateTitle = templateTitle.replaceAll(varNm[i] , ""); - } - } - } - } - - templateDetailInfo.put("title", templateTitle); - }else { - templateDetailInfo.put("title", templateTitle); - } + templateDetailInfo.put("title", sendVO.getTemplateTitle()); }else if(emphasizeType.equals("IMAGE")) { templateDetailInfo.put("msg_type", "ai"); - }else if(emphasizeType.equals("NONE")) { - } @@ -138,16 +81,8 @@ public class KakaoApiJsonSave { // 입력 json 데이터를 파일로 변경 String jsonStr = jo.toString(); -// System.out.println("jsonStr : "+jsonStr); - -// File outPut = new File(jsonFileName); -// outPut.createNewFile(); -// BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outPut), "utf-8")); -// bw.write(jsonStr); -// bw.close(); - - return jsonFileName; + return jsonStr; } public String kakaoApiJsonSave(KakaoVO kakaoVO, String[] varValInfo) { diff --git a/src/main/java/itn/let/kakao/user/kakaoAt/service/impl/KakaoAlimTalkServiceImpl.java b/src/main/java/itn/let/kakao/user/kakaoAt/service/impl/KakaoAlimTalkServiceImpl.java index 8a67f99c..fb777437 100644 --- a/src/main/java/itn/let/kakao/user/kakaoAt/service/impl/KakaoAlimTalkServiceImpl.java +++ b/src/main/java/itn/let/kakao/user/kakaoAt/service/impl/KakaoAlimTalkServiceImpl.java @@ -1,6 +1,10 @@ package itn.let.kakao.user.kakaoAt.service.impl; +import java.math.BigDecimal; +import java.math.RoundingMode; import java.text.SimpleDateFormat; +import java.time.Duration; +import java.time.Instant; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; @@ -80,6 +84,9 @@ public class KakaoAlimTalkServiceImpl extends EgovAbstractServiceImpl implements @Autowired private MjonCommon mjonCommon; + @Autowired + private PriceAndPoint priceAndPoint; + //발신프로필 상태값 변경(삭제/복구 기능) @Override public int updateKakaoProfileStatus(KakaoVO kakaoVO) throws Exception{ @@ -878,22 +885,47 @@ public class KakaoAlimTalkServiceImpl extends EgovAbstractServiceImpl implements StatusResponse statusResponse = new StatusResponse(); -/** 카카오톡 전송 기본 설정 -------------------------------------------*/ - - -/** 전송금액 설정 --------------------------------------------------*/ +/** 카카오톡 전송 설정 -------------------------------------------*/ List kakaoSendAdvcListVO = kakaoSendUtil.populateSendLists(kakaoVO, statusResponse); if (statusResponse.getStatus() != null && !statusResponse.getStatus().equals(HttpStatus.OK)) { log.error(" + populateSendLists 처리 중 오류 발생: {}", statusResponse.getMessage()); return statusResponse; } + + // 측정할 메소드 호출 전 시간 기록 + Instant start = Instant.now(); +/** 전송금액 확인 --------------------------------------------------*/ + if (!isCashSufficient(userId, kakaoSendAdvcListVO)) { + log.error("Insufficient balance for message sending."); + return new StatusResponse(HttpStatus.BAD_REQUEST, "문자 발송에 필요한 보유 잔액이 부족 합니다."); + } + + // 측정할 메소드 호출 후 시간 기록 + Instant end = Instant.now(); + + log.info(" + start :: [{}]", start); + // 실행 시간 계산 (나노초, 밀리초, 초) + System.out.println("메소드 실행 시간 (초): " + Duration.between(start, end).getSeconds() + " s"); + System.out.println("메소드 실행 시간 (Nano): " + Duration.between(start, end).getNano() + " Nano"); - // step 1 -// List idList = mjonCommon.getNextCustomMsgCId(mjonMsgSendVOList.size()); + start = Instant.now(); + List idList = mjonCommon.getNextCustomMsgCId(kakaoSendAdvcListVO.size()); + for (int i = 0; i < kakaoSendAdvcListVO.size(); i++) { + kakaoSendAdvcListVO.get(i).setMsgId(idList.get(i)); + } + + // 측정할 메소드 호출 후 시간 기록 + end = Instant.now(); + + log.info(" + start :: [{}]", start); + // 실행 시간 계산 (나노초, 밀리초, 초) + System.out.println("메소드 실행 시간 (초): " + Duration.between(start, end).getSeconds() + " s"); + System.out.println("메소드 실행 시간 (Nano): " + Duration.between(start, end).getNano() + " Nano"); + kakaoSendAdvcListVO.forEach(t-> log.info(" + t.toString() :: [{}]", t.toString()) ); @@ -913,14 +945,6 @@ public class KakaoAlimTalkServiceImpl extends EgovAbstractServiceImpl implements - -/** 카카오톡 전송 기본 설정 -------------------------------------------*/ - kakaoVO.setSendType("AT"); - kakaoVO.setMsgType("8"); - kakaoVO.setUserId(userId); - - - // priceAndPoint.getBefCash(userId); @@ -931,6 +955,29 @@ public class KakaoAlimTalkServiceImpl extends EgovAbstractServiceImpl implements } + + // 보유 금액이 충분한지 확인하는 메서드 + private boolean isCashSufficient(String userId, List kakaoSendAdvcListVO) throws Exception { + + + String userMoney = priceAndPoint.getBefCash(userId); + // 쉼표 제거 + userMoney = userMoney.replace(",", ""); + + // 사용자 보유 금액 BigDecimal 변환 (HALF_EVEN 적용) + BigDecimal befCash = new BigDecimal(userMoney).setScale(2, RoundingMode.HALF_EVEN); + + // 총 메시지 금액 계산 (HALF_EVEN 적용) + BigDecimal totalEachPrice = kakaoSendAdvcListVO.stream() + .map(msg -> new BigDecimal(String.valueOf(msg.getKakaoAtPrice()))) // 변환 오류 방지 + .reduce(BigDecimal.ZERO, BigDecimal::add) + .setScale(2, RoundingMode.HALF_EVEN); // 일관성 유지 + + // 비교 수행 + return befCash.compareTo(totalEachPrice) >= 0; + } + + @@ -956,9 +1003,6 @@ public class KakaoAlimTalkServiceImpl extends EgovAbstractServiceImpl implements - - - diff --git a/src/main/java/itn/let/kakao/user/kakaoAt/web/KakaoAlimTalkSendController.java b/src/main/java/itn/let/kakao/user/kakaoAt/web/KakaoAlimTalkSendController.java index f4cc5897..c7f78365 100644 --- a/src/main/java/itn/let/kakao/user/kakaoAt/web/KakaoAlimTalkSendController.java +++ b/src/main/java/itn/let/kakao/user/kakaoAt/web/KakaoAlimTalkSendController.java @@ -220,8 +220,8 @@ public class KakaoAlimTalkSendController { model.addAttribute("sendPrice", kakaoSendUtil.selectSendPriceOfKakaoAtAndSmsAndMms(userId)); } -// return "web/kakao/msgdata/at/KakaoAlimtalkMsgDataView"; - return "web/kakao/msgdata/at/KakaoAlimtalkMsgDataView_advcbackup_20250310"; + return "web/kakao/msgdata/at/KakaoAlimtalkMsgDataView"; +// return "web/kakao/msgdata/at/KakaoAlimtalkMsgDataView_advcbackup_20250310"; } diff --git a/src/main/java/itn/let/mjo/mjocommon/MjonCommon.java b/src/main/java/itn/let/mjo/mjocommon/MjonCommon.java index 85119792..c3298153 100644 --- a/src/main/java/itn/let/mjo/mjocommon/MjonCommon.java +++ b/src/main/java/itn/let/mjo/mjocommon/MjonCommon.java @@ -6,6 +6,7 @@ import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.List; +import java.util.Map; import javax.annotation.Resource; @@ -733,6 +734,27 @@ private int parseIntOrDefault(String value, int defaultValue) { // log.info(" + smsBytes :: [{}]", smsBytes); return smsBytes; } + + + /** + * @methodName : replaceTemplateVariables + * @author : 이호영 + * @date : 2025. 3. 12. + * @description : 헬퍼 메서드: 템플릿 변수 치환 + * @return : String + * @param content + * @param variables + * @return + */ + public static String ATReplaceTemplateVariables(String content, Map variables) { + String result = content; + for (Map.Entry entry : variables.entrySet()) { + String placeholder = entry.getKey(); + String value = entry.getValue(); + result = result.replace(placeholder, value); + } + return result; + } diff --git a/src/main/java/itn/let/mjo/msgdata/web/MjonMsgDataController.java b/src/main/java/itn/let/mjo/msgdata/web/MjonMsgDataController.java index 79b24d41..daf33b94 100644 --- a/src/main/java/itn/let/mjo/msgdata/web/MjonMsgDataController.java +++ b/src/main/java/itn/let/mjo/msgdata/web/MjonMsgDataController.java @@ -2088,16 +2088,8 @@ public class MjonMsgDataController { } - long startTime = System.currentTimeMillis(); // 시작 시간 측정 - List resultAddrList = mjonMsgDataService.selectMsgAddrListAjax(addrVO); - long endTime = System.currentTimeMillis(); // 종료 시간 측정 - - long elapsedTime = endTime - startTime; // 소요 시간 계산 - System.out.println("소요 시간: " + elapsedTime + " 밀리초"); - - modelAndView.addObject("resultAddrList", resultAddrList); modelAndView.addObject("result", "success"); diff --git a/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/at/KakaoAlimtalkMsgDataView.jsp b/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/at/KakaoAlimtalkMsgDataView.jsp index c24c7336..34221242 100644 --- a/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/at/KakaoAlimtalkMsgDataView.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/at/KakaoAlimtalkMsgDataView.jsp @@ -7,6 +7,8 @@ + + @@ -15,7 +17,6 @@