From 301135e19070ab680c731e0c351fc60c825cdb7e Mon Sep 17 00:00:00 2001 From: "hehihoho3@gmail.com" Date: Mon, 10 Mar 2025 17:27:52 +0900 Subject: [PATCH 01/11] =?UTF-8?q?=EC=B9=B4=ED=86=A1=EB=B0=9C=EC=86=A1=20?= =?UTF-8?q?=ED=99=94=EB=A9=B4=20json=20=EB=A1=9C=EC=A7=81=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20=EB=B0=8F=20=EB=B0=9C=EC=86=A1=20VO=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../let/kakao/kakaoComm/KakaoSendAdvcVO.java | 68 + .../let/kakao/kakaoComm/KakaoSendUtil.java | 155 +- .../java/itn/let/kakao/kakaoComm/KakaoVO.java | 1046 +--------- .../kakaoComm/kakaoApi/KakaoApiJsonSave.java | 135 +- .../kakaoAt/service/KakaoAlimTalkService.java | 6 + .../impl/KakaoAlimTalkServiceImpl.java | 140 ++ .../web/KakaoAlimTalkSendController.java | 33 + .../msgdata/at/KakaoAlimtalkMsgDataView.jsp | 256 +-- ...limtalkMsgDataView_advcbackup_20250310.jsp | 1773 +++++++++++++++++ 9 files changed, 2490 insertions(+), 1122 deletions(-) create mode 100644 src/main/java/itn/let/kakao/kakaoComm/KakaoSendAdvcVO.java create mode 100644 src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/at/KakaoAlimtalkMsgDataView_advcbackup_20250310.jsp diff --git a/src/main/java/itn/let/kakao/kakaoComm/KakaoSendAdvcVO.java b/src/main/java/itn/let/kakao/kakaoComm/KakaoSendAdvcVO.java new file mode 100644 index 00000000..686cc621 --- /dev/null +++ b/src/main/java/itn/let/kakao/kakaoComm/KakaoSendAdvcVO.java @@ -0,0 +1,68 @@ +package itn.let.kakao.kakaoComm; + +import java.io.Serializable; +import java.util.List; +import java.util.Map; + +import lombok.Getter; +import lombok.Setter; + +/** +* @FileName : KakaoSendVO.java +* @Project : mjon +* @Date : 2025. 3. 25. +* @작성자 : 이호영 + +* @프로그램 설명 : 문자온 발송부분만 ADVC +*/ +@Getter +@Setter +public class KakaoSendAdvcVO implements Serializable { + + + /** + * + */ + private static final long serialVersionUID = 343099046833205405L; + + private String msgId; // 문자ID + private String msgGroupId; // 전송그룹ID + private String userId; // 사용자ID + private String agentCode; // 전송사코드 + private String senderKey; // 발신프로필 키 + private String templateCode; // 템플릿 코드 + private String callTo; // 수신번호 + private String callFrom; // 발신번호 + private String msgType; // 메시지 타입 + private String templateContent; // 템플릿 내용 + private String templateTitle; // 템플릿 제목 + private String subMsgSendYn; // 대체문자 전송 여부 + private String subMsgTxt; // 대체문자 내용 + private String subMsgType; // 대체문자 타입 + private String bizJsonName; // JSON 파일명 + private String reqDate; // 예약일시 + + @Override + public String toString() { + return "MsgSendVO[" + + "\n msgId=[" + msgId + "]" + + "\n , msgGroupId=[" + msgGroupId + "]" + + "\n , userId=[" + userId + "]" + + "\n , agentCode=[" + agentCode + "]" + + "\n , senderKey=[" + senderKey + "]" + + "\n , templateCode=[" + templateCode + "]" + + "\n , callTo=[" + callTo + "]" + + "\n , callFrom=[" + callFrom + "]" + + "\n , msgType=[" + msgType + "]" + + "\n , templateContent=[" + templateContent + "]" + + "\n , templateTitle=[" + templateTitle + "]" + + "\n , subMsgSendYn=[" + subMsgSendYn + "]" + + "\n , subMsgTxt=[" + subMsgTxt + "]" + + "\n , subMsgType=[" + subMsgType + "]" + + "\n , bizJsonName=[" + bizJsonName + "]" + + "\n , reqDate=[" + reqDate + "]" + + "\n ]"; + } + + +} diff --git a/src/main/java/itn/let/kakao/kakaoComm/KakaoSendUtil.java b/src/main/java/itn/let/kakao/kakaoComm/KakaoSendUtil.java index d96b4fb8..26825760 100644 --- a/src/main/java/itn/let/kakao/kakaoComm/KakaoSendUtil.java +++ b/src/main/java/itn/let/kakao/kakaoComm/KakaoSendUtil.java @@ -1,7 +1,10 @@ package itn.let.kakao.kakaoComm; import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; import java.util.List; +import java.util.Map; import javax.annotation.Resource; @@ -10,9 +13,11 @@ import org.springframework.stereotype.Component; import itn.com.cmm.util.StringUtil; import itn.let.kakao.kakaoComm.kakaoApi.KakaoApiJsonSave; +import itn.let.mail.service.StatusResponse; import itn.let.mjo.msg.service.MjonMsgVO; import itn.let.mjo.msgdata.service.MjonMsgDataService; import itn.let.mjo.spammsg.web.ComGetSpamStringParser; +import itn.let.module.base.PriceAndPoint; import itn.let.sym.site.service.JoinSettingVO; import itn.let.uss.umt.service.MberManageVO; @@ -24,7 +29,141 @@ public class KakaoSendUtil { @Resource(name = "MjonMsgDataService") private MjonMsgDataService mjonMsgDataService; + + @Autowired + private PriceAndPoint priceAndPoint; + /** + * @methodName : kakaoSendPrice_advc + * @author : 이호영 + * @date : 2025. 3. 7. + * @description : 기존 kakaoSendPrice 개선 + * @return : KakaoVO + * @param kakaoVO + * @param statusResponse + * @return + * @throws Exception + * + */ + public KakaoVO populateSendLists(KakaoVO kakaoVO, StatusResponse statusResponse) throws Exception { + + //사용자 현재 보유 금액 불러오기(문자 발송 금액 차감 이전 금액) +// String befCash = kakaoVO.getBefCash(); + + MjonMsgVO mjonMsgVO = new MjonMsgVO(); + mjonMsgVO.setUserId(kakaoVO.getUserId()); + String userMoney = priceAndPoint.getBefCash(kakaoVO.getUserId()); + String userPoint = priceAndPoint.getBefPoint(kakaoVO.getUserId()); + + //1.시스템 기본 단가 정보 불러오기 + JoinSettingVO sysJoinSetVO = mjonMsgDataService.selectJoinSettingInfo(); + + //2.사용자 개인 단가 정보 불러오기 + MberManageVO mberManageVO = mjonMsgDataService.selectMberManageInfo(kakaoVO.getUserId()); + Float kakaoAtPrice = mberManageVO.getKakaoAtPrice(); + + /** 대체문자 여부 체크(있으면 대체문자 가격으로 없으면 카카오톡 가격으로) */ + //대체문자 발송 여부 확인 + if("Y".equals(kakaoVO.getSubMsgSendYn())) { + +// MsgSendUtils.getSmsTxtBytes + + + String charset = "euc-kr"; //문자 바이트 계산에 필요한 캐릭터 셋 : 한글 2Byte로 계산 + int callToCnt = kakaoVO.getCallToList().length; + String sendType = ""; + + for(int count =0; count < callToCnt; count++) { + + + String tempSubMagTxt = kakaoVO.getSubMsgTxt().replace("\r\n", "\n"); + + + if(kakaoVO.getSubMsgTxtReplYn().equals("Y")) { + tempSubMagTxt = kakaoSubMagTxtRepl(tempSubMagTxt, kakaoVO, count); + } + int bytes = tempSubMagTxt.getBytes(charset).length; + + if(bytes < 2000) { + if(bytes > 90) { + sendType = "MMS"; + break; + }else { + sendType = "SMS"; + } + }else { + kakaoVO.setResultCode("2000"); + return kakaoVO; + } + } + + if(sendType.equals("MMS")) { + //협의 단가가 없으면 시스템 단가로 지정 + if(mberManageVO.getLongPrice() < 1) { + kakaoAtPrice = sysJoinSetVO.getLongPrice(); + + kakaoVO.setSmsPrice(sysJoinSetVO.getShortPrice()); + kakaoVO.setMmsPrice(sysJoinSetVO.getLongPrice()); + kakaoVO.setKakaoAtPrice(sysJoinSetVO.getKakaoAtPrice()); + }else { + kakaoAtPrice = mberManageVO.getLongPrice(); + + kakaoVO.setSmsPrice(mberManageVO.getShortPrice()); + kakaoVO.setMmsPrice(mberManageVO.getLongPrice()); + + if(mberManageVO.getKakaoAtPrice() < 1) { + kakaoVO.setKakaoAtPrice(sysJoinSetVO.getKakaoAtPrice()); + }else { + kakaoVO.setKakaoAtPrice(mberManageVO.getKakaoAtPrice()); + } + } + }else { + //협의 단가가 없으면 시스템 단가로 지정 + if(mberManageVO.getShortPrice() < 1) { + kakaoAtPrice = sysJoinSetVO.getShortPrice(); + + kakaoVO.setSmsPrice(sysJoinSetVO.getShortPrice()); + kakaoVO.setMmsPrice(sysJoinSetVO.getLongPrice()); + kakaoVO.setKakaoAtPrice(sysJoinSetVO.getKakaoAtPrice()); + }else { + kakaoAtPrice = mberManageVO.getShortPrice(); + + kakaoVO.setSmsPrice(mberManageVO.getShortPrice()); + kakaoVO.setMmsPrice(mberManageVO.getLongPrice()); + if(mberManageVO.getKakaoAtPrice() < 1) { + kakaoVO.setKakaoAtPrice(sysJoinSetVO.getKakaoAtPrice()); + }else { + kakaoVO.setKakaoAtPrice(mberManageVO.getKakaoAtPrice()); + } + } + } + }else { + if(kakaoAtPrice < 1) { //협의 단가가 없으면 시스템 단가로 지정 + kakaoAtPrice = sysJoinSetVO.getKakaoAtPrice(); + + kakaoVO.setSmsPrice(sysJoinSetVO.getShortPrice()); + kakaoVO.setMmsPrice(sysJoinSetVO.getLongPrice()); + kakaoVO.setKakaoAtPrice(sysJoinSetVO.getKakaoAtPrice()); + }else { + kakaoVO.setSmsPrice(mberManageVO.getShortPrice()); + kakaoVO.setMmsPrice(mberManageVO.getLongPrice()); + kakaoVO.setKakaoAtPrice(mberManageVO.getKakaoAtPrice()); + } + } + + /** 전송인원 확인*/ + int totCallCnt = kakaoVO.getCallToList().length; + Float kakaoTotPrice = totCallCnt * kakaoAtPrice; // 총결제 금액 = 총 전송수량 * 카카오 알림톡 단가 + String totPrice = kakaoTotPrice.toString(); + System.out.println("@@@@@@@ : "+kakaoTotPrice +" = "+totCallCnt+" * "+kakaoAtPrice); + + kakaoVO.setEachPrice(kakaoAtPrice.toString()); + kakaoVO.setBefCash(userMoney); // 고객 충전금액 + kakaoVO.setBefPoint(userPoint); // 고객 충전 포인트 + kakaoVO.setTotPrice(totPrice); // 총 카카오 전송 금액 + + return kakaoVO; + } /** * @Method Name : kakaoSendPrice @@ -34,13 +173,11 @@ public class KakaoSendUtil { */ public KakaoVO kakaoSendPrice(KakaoVO kakaoVO) throws Exception { - //사용자 현재 보유 금액 불러오기(문자 발송 금액 차감 이전 금액) - String befCash = kakaoVO.getBefCash(); + System.out.println(" :: kakaoSendPrice :: "); + + //사용자 현재 보유 금액 불러오기(문자 발송 금액 차감 이전 금액) +// String befCash = kakaoVO.getBefCash(); - //VO에서 현재 보유금액이 없으면 디비에서 조회해서 불러옴 - if("".equals(befCash) || befCash == null) { - - } MjonMsgVO mjonMsgVO = new MjonMsgVO(); mjonMsgVO.setUserId(kakaoVO.getUserId()); String userMoney = mjonMsgDataService.selectBeforeCashData(mjonMsgVO); @@ -55,6 +192,7 @@ public class KakaoSendUtil { /** 대체문자 여부 체크(있으면 대체문자 가격으로 없으면 카카오톡 가격으로) */ //대체문자 발송 여부 확인 + System.out.println(" :: kakaoVO.getSubMsgSendYn() :: "+ kakaoVO.getSubMsgSendYn()); if(kakaoVO.getSubMsgSendYn().equals("Y")) { @@ -66,6 +204,8 @@ 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; @@ -401,6 +541,7 @@ public class KakaoSendUtil { varValInfo = kakaoVO.getVarValList().get(count); } String jsonFileName = kakaoApiJsonSave.kakaoApiJsonSave(kakaoVO, varValInfo); +// String jsonFileName = kakaoApiJsonSave.kakaoApiJsonSave_advc(kakaoVO, varValInfo); // String jsonFileName = kakaoApiJsonSave.kakaoApiJsonSave(kakaoVO, kakaoVO.getVarValList().get(count)); setSendMsgVO.setBizJsonName(jsonFileName); //json 파일명 } @@ -509,6 +650,7 @@ public class KakaoSendUtil { public String kakaoSubMagTxtRepl(String tempSubMagTxt, KakaoVO kakaoVO, int count) { + System.out.println("tempSubMagTxt : "+ tempSubMagTxt); // String tempSubMagTxt = kakaoVO.getSubMsgTxt().replace("\r\n", "\n"); // String tempSubMagTxt = msgTxt; @@ -551,6 +693,7 @@ public class KakaoSendUtil { return tempSubMagTxt; } + public String kakaoFTSubMagTxtRepl(String tempSubMagTxt, KakaoVO kakaoVO, int count) throws Exception{ List varValList = kakaoVO.getVarValList(); diff --git a/src/main/java/itn/let/kakao/kakaoComm/KakaoVO.java b/src/main/java/itn/let/kakao/kakaoComm/KakaoVO.java index e6dd28a3..c5192711 100644 --- a/src/main/java/itn/let/kakao/kakaoComm/KakaoVO.java +++ b/src/main/java/itn/let/kakao/kakaoComm/KakaoVO.java @@ -2,8 +2,11 @@ package itn.let.kakao.kakaoComm; import java.util.ArrayList; import java.util.List; +import java.util.Map; import itn.let.mjo.msg.service.MjonMsgVO; +import lombok.Getter; +import lombok.Setter; /** * @FileName : KakaoVO.java @@ -13,6 +16,8 @@ import itn.let.mjo.msg.service.MjonMsgVO; * @프로그램 설명 : 카카오톡 요청 변수 목록 (문자온VO를 상속 받음) */ +@Getter +@Setter public class KakaoVO extends MjonMsgVO{ private static final long serialVersionUID = 536382850588307019L; @@ -247,995 +252,58 @@ public class KakaoVO extends MjonMsgVO{ private String successCntMonth; private String successCntYear; - public String getSuccessDay() { - return successDay; - } - - public void setSuccessDay(String successDay) { - this.successDay = successDay; - } - - public String getSuccessMonth() { - return successMonth; - } - - public void setSuccessMonth(String successMonth) { - this.successMonth = successMonth; - } - - public String getSuccessYear() { - return successYear; - } - - public void setSuccessYear(String successYear) { - this.successYear = successYear; - } - - public String getSuccessCntDay() { - return successCntDay; - } - - public void setSuccessCntDay(String successCntDay) { - this.successCntDay = successCntDay; - } - - public String getSuccessCntMonth() { - return successCntMonth; - } - - public void setSuccessCntMonth(String successCntMonth) { - this.successCntMonth = successCntMonth; - } - - public String getSuccessCntYear() { - return successCntYear; - } - - public void setSuccessCntYear(String successCntYear) { - this.successCntYear = successCntYear; - } - - public static long getSerialversionuid() { - return serialVersionUID; - } - - public String getCategoryDepth() { - return categoryDepth; - } - - public void setCategoryDepth(String categoryDepth) { - this.categoryDepth = categoryDepth; - } - - public String getCategoryType() { - return categoryType; - } - - public void setCategoryType(String categoryType) { - this.categoryType = categoryType; - } - - public String getCategoryCode() { - return categoryCode; - } - - public void setCategoryCode(String categoryCode) { - this.categoryCode = categoryCode; - } - - public String getCategoryGroupName() { - return categoryGroupName; - } - - public void setCategoryGroupName(String categoryGroupName) { - this.categoryGroupName = categoryGroupName; - } - - public String getCategoryName() { - return categoryName; - } - - public void setCategoryName(String categoryName) { - this.categoryName = categoryName; - } - - public String getCategoryInclusion() { - return categoryInclusion; - } - - public void setCategoryInclusion(String categoryInclusion) { - this.categoryInclusion = categoryInclusion; - } - - public String getCategoryExclusion() { - return categoryExclusion; - } - - public void setCategoryExclusion(String categoryExclusion) { - this.categoryExclusion = categoryExclusion; - } - - public String getBizUrl() { - return bizUrl; - } - - public void setBizUrl(String bizUrl) { - this.bizUrl = bizUrl; - } - - 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 getPhoneNumber() { - return phoneNumber; - } - - public void setPhoneNumber(String phoneNumber) { - this.phoneNumber = phoneNumber; - } - - public String getYellowId() { - return yellowId; - } - - public void setYellowId(String yellowId) { - this.yellowId = yellowId; - } - - public String getBizJsonName() { - return bizJsonName; - } - - public void setBizJsonName(String bizJsonName) { - this.bizJsonName = bizJsonName; - } - - public String getToken() { - return token; - } - - public void setToken(String token) { - this.token = token; - } - - public String getSenderKey() { - return senderKey; - } - - public void setSenderKey(String senderKey) { - this.senderKey = senderKey; - } - - public String getProfileId() { - return profileId; - } - - public void setProfileId(String profileId) { - this.profileId = profileId; - } - - public String getUserId() { - return userId; - } - - public void setUserId(String userId) { - this.userId = userId; - } - - public String getImgTitle() { - return imgTitle; - } - - public void setImgTitle(String imgTitle) { - this.imgTitle = imgTitle; - } - - public String getImageType() { - return imageType; - } - - public void setImageType(String imageType) { - this.imageType = imageType; - } - - public String getImgLink() { - return imgLink; - } - - public void setImgLink(String imgLink) { - this.imgLink = imgLink; - } - - public String getTemplateName() { - return templateName; - } - - public void setTemplateName(String templateName) { - this.templateName = templateName; - } - - 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 getTamplateAd() { - return tamplateAd; - } - - public void setTamplateAd(String tamplateAd) { - this.tamplateAd = tamplateAd; - } - - 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 List getButtonVOList() { - return buttonVOList; - } - - public void setButtonVOList(List buttonVOList) { - this.buttonVOList = buttonVOList; - } - - public String getButtonName() { - return buttonName; - } - - public void setButtonName(String buttonName) { - this.buttonName = buttonName; - } - - public String getButtonLinkType() { - return buttonLinkType; - } - - public void setButtonLinkType(String buttonLinkType) { - this.buttonLinkType = buttonLinkType; - } - - public String getButtonLinkAnd() { - return buttonLinkAnd; - } - - public void setButtonLinkAnd(String buttonLinkAnd) { - this.buttonLinkAnd = buttonLinkAnd; - } - - public String getButtonLinkIos() { - return buttonLinkIos; - } - - public void setButtonLinkIos(String buttonLinkIos) { - this.buttonLinkIos = buttonLinkIos; - } - - public String getButtonLinkMo() { - return buttonLinkMo; - } - - public void setButtonLinkMo(String buttonLinkMo) { - this.buttonLinkMo = buttonLinkMo; - } - - public String getButtonLinkPc() { - return buttonLinkPc; - } - - public void setButtonLinkPc(String buttonLinkPc) { - this.buttonLinkPc = buttonLinkPc; - } - - public String getButtonPluginId() { - return buttonPluginId; - } - - public void setButtonPluginId(String buttonPluginId) { - this.buttonPluginId = buttonPluginId; - } - - public String getQuickName() { - return quickName; - } - - public void setQuickName(String quickName) { - this.quickName = quickName; - } - - public String getQuickLinkType() { - return quickLinkType; - } - - public void setQuickLinkType(String quickLinkType) { - this.quickLinkType = quickLinkType; - } - - public String getQuickLinkAnd() { - return quickLinkAnd; - } - - public void setQuickLinkAnd(String quickLinkAnd) { - this.quickLinkAnd = quickLinkAnd; - } - - public String getQuickLinkIos() { - return quickLinkIos; - } - - public void setQuickLinkIos(String quickLinkIos) { - this.quickLinkIos = quickLinkIos; - } - - public String getQuickLinkMo() { - return quickLinkMo; - } - - public void setQuickLinkMo(String quickLinkMo) { - this.quickLinkMo = quickLinkMo; - } - - public String getQuickLinkPc() { - return quickLinkPc; - } - - public void setQuickLinkPc(String quickLinkPc) { - this.quickLinkPc = quickLinkPc; - } - - public String getSenderKeyType() { - return senderKeyType; - } - - public void setSenderKeyType(String senderKeyType) { - this.senderKeyType = senderKeyType; - } - - public String getDeleteYn() { - return deleteYn; - } - - public void setDeleteYn(String deleteYn) { - this.deleteYn = deleteYn; - } - - public String getTemplateCode() { - return templateCode; - } - - public void setTemplateCode(String templateCode) { - this.templateCode = templateCode; - } - - public String getNewTemplateCode() { - return newTemplateCode; - } - - public void setNewTemplateCode(String newTemplateCode) { - this.newTemplateCode = newTemplateCode; - } - - public String[] getArrTemplateCode() { - return arrTemplateCode; - } - - public void setArrTemplateCode(String[] arrTemplateCode) { - this.arrTemplateCode = arrTemplateCode; - } - - public String getTemplateStatus() { - return templateStatus; - } - - public void setTemplateStatus(String templateStatus) { - this.templateStatus = templateStatus; - } - - public String getKeyword() { - return keyword; - } - - public void setKeyword(String keyword) { - this.keyword = keyword; - } - - public String getSendPhone() { - return sendPhone; - } - - public void setSendPhone(String sendPhone) { - this.sendPhone = sendPhone; - } - - public String getDestPhone() { - return destPhone; - } - - public void setDestPhone(String destPhone) { - this.destPhone = destPhone; - } - - public String getSubMsgSendYn() { - return subMsgSendYn; - } - - public void setSubMsgSendYn(String subMsgSendYn) { - this.subMsgSendYn = subMsgSendYn; - } - - public String getCount() { - return count; - } - - public void setCount(String count) { - this.count = count; - } - - public String getPage() { - return page; - } - - public void setPage(String page) { - this.page = page; - } - - public String getBizUmid() { - return bizUmid; - } - - public void setBizUmid(String bizUmid) { - this.bizUmid = bizUmid; - } - - public List getVarNmList() { - return varNmList; - } - - public void setVarNmList(List varNmList) { - this.varNmList = varNmList; - } - - public List getVarValList() { - return varValList; - } - - public void setVarValList(List varValList) { - this.varValList = varValList; - } - - public String getFormListType() { - return formListType; - } - - public void setFormListType(String formListType) { - this.formListType = formListType; - } - - public String getSubMsgTxt() { - return subMsgTxt; - } - - public void setSubMsgTxt(String subMsgTxt) { - this.subMsgTxt = subMsgTxt; - } - - public String getBizJsonYn() { - return bizJsonYn; - } - - public void setBizJsonYn(String bizJsonYn) { - this.bizJsonYn = bizJsonYn; - } - - public String getSendType() { - return sendType; - } - - public void setSendType(String sendType) { - this.sendType = sendType; - } - - public String getAdFlag() { - return adFlag; - } - - public void setAdFlag(String adFlag) { - this.adFlag = adFlag; - } - - public List getKakaoSendList() { - return kakaoSendList; - } - - public void setKakaoSendList(List kakaoSendList) { - this.kakaoSendList = kakaoSendList; - } - - public String getSubMsgTxtReplYn() { - return subMsgTxtReplYn; - } - - public void setSubMsgTxtReplYn(String subMsgTxtReplYn) { - this.subMsgTxtReplYn = subMsgTxtReplYn; - } - - public String getSubMsgType() { - return subMsgType; - } - - public void setSubMsgType(String subMsgType) { - this.subMsgType = subMsgType; - } - public List varValPaser(String[] varValList){ - - List returnVarVal = new ArrayList<>(); - - for(String varVal : varValList) - { - String[] strList = varVal.split("§"); - returnVarVal.add(strList); + private List> varListMap; + + @Override + public String toString() { + String varListMapString = "["; + if (varListMap != null && !varListMap.isEmpty()) { + StringBuilder sb = new StringBuilder(); + for (Map map : varListMap) { + if (sb.length() > 0) + sb.append(", "); + if (map == null) { + sb.append("null"); + } else { + sb.append("{"); + String prefix = ""; + for (Map.Entry entry : map.entrySet()) { + sb.append(prefix).append(entry.getKey()).append("=").append(entry.getValue()); + prefix = ", "; + } + sb.append("}"); + } + } + varListMapString += sb.toString(); } + varListMapString += "]"; - return returnVarVal; - } - - public String getMenuTopTab() { - return menuTopTab; - } - - public void setMenuTopTab(String menuTopTab) { - this.menuTopTab = menuTopTab; - } - - public String getMenuSubTab() { - return menuSubTab; - } - - public void setMenuSubTab(String menuSubTab) { - this.menuSubTab = menuSubTab; - } - - public String getSearchCondition2() { - return searchCondition2; - } - - public void setSearchCondition2(String searchCondition2) { - this.searchCondition2 = searchCondition2; - } - - public String getKakaoResendSuccCount() { - return kakaoResendSuccCount; - } - - public void setKakaoResendSuccCount(String kakaoResendSuccCount) { - this.kakaoResendSuccCount = kakaoResendSuccCount; - } - - public String getKakaoResendFailCount() { - return kakaoResendFailCount; - } - - public void setKakaoResendFailCount(String kakaoResendFailCount) { - this.kakaoResendFailCount = kakaoResendFailCount; - } - - public String getAtSuccessCount() { - return atSuccessCount; - } - - public void setAtSuccessCount(String atSuccessCount) { - this.atSuccessCount = atSuccessCount; - } - - public String getFtSuccessCount() { - return ftSuccessCount; - } - - public void setFtSuccessCount(String ftSuccessCount) { - this.ftSuccessCount = ftSuccessCount; - } - - public String getAtFailCount() { - return atFailCount; - } - - public void setAtFailCount(String atFailCount) { - this.atFailCount = atFailCount; - } - - public String getFtFailCount() { - return ftFailCount; - } - - public void setFtFailCount(String ftFailCount) { - this.ftFailCount = ftFailCount; - } - - public String getAtSuccPrice() { - return atSuccPrice; - } - - public void setAtSuccPrice(String atSuccPrice) { - this.atSuccPrice = atSuccPrice; - } - - public String getFtSuccPrice() { - return ftSuccPrice; - } - - public void setFtSuccPrice(String ftSuccPrice) { - this.ftSuccPrice = ftSuccPrice; - } - - public String getAtFailPrice() { - return atFailPrice; - } - - public void setAtFailPrice(String atFailPrice) { - this.atFailPrice = atFailPrice; - } - - public String getFtFailPrice() { - return ftFailPrice; - } - - public void setFtFailPrice(String ftFailPrice) { - this.ftFailPrice = ftFailPrice; - } - - public String getKakaoResendSuccPrice() { - return kakaoResendSuccPrice; - } - - public void setKakaoResendSuccPrice(String kakaoResendSuccPrice) { - this.kakaoResendSuccPrice = kakaoResendSuccPrice; - } - - public String getKakaoResendFailPrice() { - return kakaoResendFailPrice; - } - - public void setKakaoResendFailPrice(String kakaoResendFailPrice) { - this.kakaoResendFailPrice = kakaoResendFailPrice; - } - - public String getAtSuccCntSum() { - return atSuccCntSum; - } - - public void setAtSuccCntSum(String atSuccCntSum) { - this.atSuccCntSum = atSuccCntSum; - } - - public String getFtSuccCntSum() { - return ftSuccCntSum; - } - - public void setFtSuccCntSum(String ftSuccCntSum) { - this.ftSuccCntSum = ftSuccCntSum; - } - - public String getAtFailCntSum() { - return atFailCntSum; - } - - public void setAtFailCntSum(String atFailCntSum) { - this.atFailCntSum = atFailCntSum; - } - - public String getFtFailCntSum() { - return ftFailCntSum; - } - - public void setFtFailCntSum(String ftFailCntSum) { - this.ftFailCntSum = ftFailCntSum; - } - - public String getKakaoResenSuccSum() { - return kakaoResenSuccSum; - } - - public void setKakaoResenSuccSum(String kakaoResenSuccSum) { - this.kakaoResenSuccSum = kakaoResenSuccSum; - } - - public String getKakaoResenFailSum() { - return kakaoResenFailSum; - } - - public void setKakaoResenFailSum(String kakaoResenFailSum) { - this.kakaoResenFailSum = kakaoResenFailSum; - } - - public String getAtSuccPriceSum() { - return atSuccPriceSum; - } - - public void setAtSuccPriceSum(String atSuccPriceSum) { - this.atSuccPriceSum = atSuccPriceSum; - } - - public String getFtSuccPriceSum() { - return ftSuccPriceSum; - } - - public void setFtSuccPriceSum(String ftSuccPriceSum) { - this.ftSuccPriceSum = ftSuccPriceSum; - } - - public String getAtFailPriceSum() { - return atFailPriceSum; - } - - public void setAtFailPriceSum(String atFailPriceSum) { - this.atFailPriceSum = atFailPriceSum; - } - - public String getFtFailPriceSum() { - return ftFailPriceSum; - } - - public void setFtFailPriceSum(String ftFailPriceSum) { - this.ftFailPriceSum = ftFailPriceSum; - } - - public String getKakaoResendSuccPriceSum() { - return kakaoResendSuccPriceSum; - } - - public void setKakaoResendSuccPriceSum(String kakaoResendSuccPriceSum) { - this.kakaoResendSuccPriceSum = kakaoResendSuccPriceSum; - } - - public String getKakaoResendFailPriceSum() { - return kakaoResendFailPriceSum; - } - - public void setKakaoResendFailPriceSum(String kakaoResendFailPriceSum) { - this.kakaoResendFailPriceSum = kakaoResendFailPriceSum; - } - - public String getFriendId() { - return friendId; - } - - public void setFriendId(String friendId) { - this.friendId = friendId; - } - - public String getImageTitle() { - return imageTitle; - } - - public void setImageTitle(String imageTitle) { - this.imageTitle = imageTitle; - } - - public String getImageLink() { - return imageLink; - } - - public void setImageLink(String imageLink) { - this.imageLink = imageLink; - } - - public String getJsonText() { - return jsonText; - } - - public void setJsonText(String jsonText) { - this.jsonText = jsonText; - } - - public String getImageFileName() { - return imageFileName; - } - - public void setImageFileName(String imageFileName) { - this.imageFileName = imageFileName; - } - - public String getSbscrbDe() { - return sbscrbDe; - } - - public void setSbscrbDe(String sbscrbDe) { - this.sbscrbDe = sbscrbDe; - } - - public String getMoblphonNo() { - return moblphonNo; - } - - public void setMoblphonNo(String moblphonNo) { - this.moblphonNo = moblphonNo; - } - - public String getDept() { - return dept; - } - - public void setDept(String dept) { - this.dept = dept; - } - - public String getAtchFileId() { - return atchFileId; - } - - public void setAtchFileId(String atchFileId) { - this.atchFileId = atchFileId; - } - - public String getWorkAtchFileId() { - return workAtchFileId; - } - - public void setWorkAtchFileId(String workAtchFileId) { - this.workAtchFileId = workAtchFileId; - } - - public String getFileSn() { - return fileSn; - } - - public void setFileSn(String fileSn) { - this.fileSn = fileSn; - } - - public String getFileCn() { - return fileCn; - } - - public void setFileCn(String fileCn) { - this.fileCn = fileCn; - } - - public String getFileStreCours() { - return fileStreCours; - } - - public void setFileStreCours(String fileStreCours) { - this.fileStreCours = fileStreCours; - } - - public String getOrignlFileNm() { - return orignlFileNm; - } - - public void setOrignlFileNm(String orignlFileNm) { - this.orignlFileNm = orignlFileNm; - } - - public String getStreFileNm() { - return streFileNm; - } - - public void setStreFileNm(String streFileNm) { - this.streFileNm = streFileNm; - } - - public String getFileExtsn() { - return fileExtsn; - } - - public void setFileExtsn(String fileExtsn) { - this.fileExtsn = fileExtsn; - } - - public String getFileSize() { - return fileSize; - } - - public void setFileSize(String fileSize) { - this.fileSize = fileSize; - } - - public int getStartCount() { - return startCount; - } - - public void setStartCount(int startCount) { - this.startCount = startCount; - } - - public int getEndCount() { - return endCount; - } - - public void setEndCount(int endCount) { - this.endCount = endCount; - } - - public String getPhmType() { - return phmType; - } - - public void setPhmType(String phmType) { - this.phmType = phmType; - } + return "KakaoSendAdvcVO[" + + "\n senderKey=[" + senderKey + "]" + + "\n , subMsgTxtReplYn=[" + subMsgTxtReplYn + "]" + + "\n , subMsgSendYn=[" + subMsgSendYn + "]" + + "\n , reserveYn=[" + getReserveYn() + "]" + + "\n , divideCnt=[" + getDivideCnt() + "]" + + "\n , bizJsonYn=[" + bizJsonYn + "]" + + "\n , templateEmphasizeType=[" + templateEmphasizeType + "]" + + "\n , templateSubtitle=[" + templateSubtitle + "]" + + "\n , txtReplYn=[" + getTxtReplYn() + "]" + + "\n , callFrom=[" + getCallFrom() + "]" + + "\n , templateCode=[" + templateCode + "]" + + "\n , divideTime=[" + getDivideTime() + "]" + + "\n , reqDate=[" + getReqDate() + "]" + + "\n , atSmishingYn=[" + getAtSmishingYn() + "]" + + "\n , menuTopTab=[" + menuTopTab + "]" + + "\n , templateContent=[" + templateContent + "]" + + "\n , templateTitle=[" + templateTitle + "]" + + "\n , subMsgTxt=[" + subMsgTxt + "]" + + "\n , divideChk=[" + getDivideChk() + "]" + + "\n , sendType=[" + sendType + "]" + + "\n , msgType=[" + getMsgType() + "]" + + "\n , userId=[" + userId + "]" + + "\n , varListMap=[" + varListMapString + "]" + + "\n ]"; + } + + } 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 2312ac1a..1d396889 100644 --- a/src/main/java/itn/let/kakao/kakaoComm/kakaoApi/KakaoApiJsonSave.java +++ b/src/main/java/itn/let/kakao/kakaoComm/kakaoApi/KakaoApiJsonSave.java @@ -32,7 +32,124 @@ public class KakaoApiJsonSave { static String json; - @SuppressWarnings("unchecked") + 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); + + // 버튼리스트 JSON 생성 + JSONArray buttonList = new JSONArray(); + for(KakaoButtonVO buttonInfoVO : templateDetail.getButtonList()) { + JSONObject buttonInfo = new JSONObject(); + + buttonInfo.put("name", buttonInfoVO.getName()); + buttonInfo.put("type", buttonInfoVO.getLinkType()); + + if(buttonInfoVO.getLinkType().equals("WL")) { + buttonInfo.put("url_mobile", buttonInfoVO.getLinkMo()); + buttonInfo.put("url_pc", buttonInfoVO.getLinkPc()); + }else if(buttonInfoVO.getLinkType().equals("AL")) { + buttonInfo.put("scheme_ios", buttonInfoVO.getLinkIos()); + buttonInfo.put("scheme_android", buttonInfoVO.getLinkAnd()); + }else if(buttonInfoVO.getLinkType().equals("BC")) { + // 상담톡 진행시 등록해야함 + }else if(buttonInfoVO.getLinkType().equals("BT")) { + // 봇 전환 시 전달 + } + buttonList.add(buttonInfo); + } + + // 강조유형 JSON 생성 + 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); + } + }else if(emphasizeType.equals("IMAGE")) { + templateDetailInfo.put("msg_type", "ai"); + }else if(emphasizeType.equals("NONE")) { + + } + + + JSONObject jo = new JSONObject(); + + if(buttonList.size() != 0) { + jo.put("button", buttonList); + } + if(templateDetailInfo.size() != 0) { + jo.put("extra", templateDetailInfo); + } + + // 입력 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; + } + public String kakaoApiJsonSave(KakaoVO kakaoVO, String[] varValInfo) { // json파일 저장 @@ -109,12 +226,12 @@ public class KakaoApiJsonSave { 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] , ""); - } - } + if(varValInfo[j] != null) { + templateTitle = templateTitle.replaceAll(varNm[i] , StringUtil.getString(varValInfo[j])); + }else { + templateTitle = templateTitle.replaceAll(varNm[i] , ""); + } + } } } @@ -140,8 +257,8 @@ public class KakaoApiJsonSave { // 입력 json 데이터를 파일로 변경 String jsonStr = jo.toString(); - System.out.println("jsonFileName : "+jsonFileName); - +// System.out.println("jsonFileName : "+jsonFileName); + File outPut = new File(jsonFileName); outPut.createNewFile(); diff --git a/src/main/java/itn/let/kakao/user/kakaoAt/service/KakaoAlimTalkService.java b/src/main/java/itn/let/kakao/user/kakaoAt/service/KakaoAlimTalkService.java index c19695ea..098f9768 100644 --- a/src/main/java/itn/let/kakao/user/kakaoAt/service/KakaoAlimTalkService.java +++ b/src/main/java/itn/let/kakao/user/kakaoAt/service/KakaoAlimTalkService.java @@ -2,7 +2,11 @@ package itn.let.kakao.user.kakaoAt.service; import java.util.List; +import javax.servlet.http.HttpServletRequest; + +import itn.let.kakao.kakaoComm.KakaoSendAdvcVO; import itn.let.kakao.kakaoComm.KakaoVO; +import itn.let.mail.service.StatusResponse; import itn.let.mjo.msgdata.service.MjonMsgReturnVO; public interface KakaoAlimTalkService { @@ -24,5 +28,7 @@ public interface KakaoAlimTalkService { //카카오 친구톡 전송 실패 환불리스트 조회 public void selectKakaoFtSentRefundList() throws Exception; + + StatusResponse insertKakaoAtSandAjax_advc(KakaoVO kakaoVO, HttpServletRequest request) throws Exception; } 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 61f0cd6a..38a0032c 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 @@ -4,16 +4,27 @@ import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; +import java.util.HashMap; import java.util.List; +import java.util.Map; import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; import org.springframework.stereotype.Service; import egovframework.rte.fdl.cmmn.EgovAbstractServiceImpl; import egovframework.rte.fdl.idgnr.EgovIdGnrService; +import egovframework.rte.fdl.security.userdetails.util.EgovUserDetailsHelper; +import itn.com.cmm.LoginVO; +import itn.com.utl.fcc.service.EgovStringUtil; +import itn.let.kakao.kakaoComm.KakaoSendAdvcVO; +import itn.let.kakao.kakaoComm.KakaoSendUtil; import itn.let.kakao.kakaoComm.KakaoVO; import itn.let.kakao.user.kakaoAt.service.KakaoAlimTalkService; +import itn.let.mail.service.StatusResponse; import itn.let.mjo.mjocommon.MjonHolidayApi; import itn.let.mjo.msg.service.MjonMsgVO; import itn.let.mjo.msg.service.impl.MjonMsgDAO; @@ -24,9 +35,13 @@ import itn.let.mjo.msgholiday.service.MsgHolidayVO; import itn.let.mjo.msgholiday.service.impl.MsgHolidayDAO; import itn.let.mjo.pay.service.MjonPayService; import itn.let.mjo.pay.service.MjonPayVO; +import itn.let.module.base.PriceAndPoint; import itn.let.sym.site.service.JoinSettingVO; import itn.let.sym.site.service.impl.SiteManagerDAO; +import itn.let.uss.umt.service.EgovUserManageService; +import lombok.extern.slf4j.Slf4j; +@Slf4j @Service("kakaoAlimTalkService") public class KakaoAlimTalkServiceImpl extends EgovAbstractServiceImpl implements KakaoAlimTalkService{ @@ -53,6 +68,16 @@ public class KakaoAlimTalkServiceImpl extends EgovAbstractServiceImpl implements @Resource(name = "egovMjonCashIdGnrService") private EgovIdGnrService idgenMjonCashId; + + /** userManageService */ + @Resource(name = "userManageService") + private EgovUserManageService userManageService; + + @Autowired + private PriceAndPoint priceAndPoint; + + @Autowired + KakaoSendUtil kakaoSendUtil; //발신프로필 상태값 변경(삭제/복구 기능) @Override @@ -816,4 +841,119 @@ public class KakaoAlimTalkServiceImpl extends EgovAbstractServiceImpl implements } } } + + @Override + public StatusResponse insertKakaoAtSandAjax_advc(KakaoVO kakaoVO, HttpServletRequest request) throws Exception { + +// log.info(" :: [{}]", kakaoVO.toString()); + +// KakaoSendAdvcVO + + Map returnMap = new HashMap<>(); + + LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated() + ? (LoginVO) EgovUserDetailsHelper.getAuthenticatedUser() + : null; + String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId()); + + if (userId.equals("")) { + return new StatusResponse(HttpStatus.BAD_REQUEST, "로그인 후 이용이 가능합니다."); + } + + + /** + * 회원 정지된 상태이면 문자 발송이 안되도록 처리함 현재 로그인 세션도 만료 처리함 + */ + boolean mberSttus = userManageService.selectUserStatusInfo(userId); + if (!mberSttus) { + request.getSession().invalidate(); + // UNAUTHORIZED : 인증되지 않은 사용자가 접근하려고 할 때 + return new StatusResponse(HttpStatus.UNAUTHORIZED, + "현재 고객님께서는 문자온 서비스 이용이 정지된 상태로 알림톡을 발송하실 수 없습니다. 이용정지 해제를 원하시면 고객센터로 연락주시기 바랍니다."); + } + + + StatusResponse statusResponse = new StatusResponse(); + + +/** 카카오톡 전송 기본 설정 -------------------------------------------*/ + kakaoVO.setSendType("AT"); + kakaoVO.setMsgType("8"); + kakaoVO.setUserId(userId); + + +/** 전송금액 설정 --------------------------------------------------*/ +// KakaoVO priceSet = kakaoSendUtil.populateSendLists(kakaoVO, statusResponse); + + + + + + + + + + + + + + + + + + + + + + + +/** 카카오톡 전송 기본 설정 -------------------------------------------*/ + kakaoVO.setSendType("AT"); + kakaoVO.setMsgType("8"); + kakaoVO.setUserId(userId); + + + +// priceAndPoint.getBefCash(userId); + + + + + + return statusResponse; + } + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + } 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 bb32b5d1..4f4b5784 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 @@ -35,9 +35,11 @@ import org.apache.poi.xssf.usermodel.XSSFRow; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; @@ -57,6 +59,7 @@ import itn.com.cmm.util.MJUtil; import itn.com.cmm.util.StringUtil; import itn.com.utl.fcc.service.EgovStringUtil; import itn.let.kakao.kakaoComm.KakaoReturnVO; +import itn.let.kakao.kakaoComm.KakaoSendAdvcVO; import itn.let.kakao.kakaoComm.KakaoSendUtil; import itn.let.kakao.kakaoComm.KakaoVO; import itn.let.kakao.kakaoComm.kakaoApi.KakaoApiJsonSave; @@ -65,6 +68,7 @@ import itn.let.kakao.kakaoComm.kakaoApi.KakaoApiProfileCategory; import itn.let.kakao.kakaoComm.kakaoApi.KakaoApiTemplate; import itn.let.kakao.kakaoComm.kakaoApi.service.KakaoApiService; import itn.let.kakao.user.kakaoAt.service.KakaoAlimTalkService; +import itn.let.mail.service.StatusResponse; import itn.let.mjo.mjocommon.MjonCommon; import itn.let.mjo.mjocommon.MjonHolidayApi; import itn.let.mjo.msgdata.service.MjonMsgDataService; @@ -1057,6 +1061,16 @@ public class KakaoAlimTalkSendController { return modelAndView; } + @RequestMapping(value= {"/web/mjon/kakao/alimtalk/kakaoAlimTalkMsgSendAjax_advc.do"}, method = RequestMethod.POST) + public ResponseEntity kakaoAlimTalkMsgSendAjax_advc( + @RequestBody KakaoVO kakaoVO, + HttpServletRequest request + ) throws Exception { + + System.out.println(" + kakaoAlimTalkMsgSendAjax_advc + "); + return ResponseEntity.ok().body(kakaoAlimTalkService.insertKakaoAtSandAjax_advc(kakaoVO, request)) ; + } + @RequestMapping(value= {"/web/mjon/kakao/alimtalk/kakaoAlimTalkMsgSendAjax.do"}, method = RequestMethod.POST) // @ResponseBody public ModelAndView kakaoAlimTalkMsgSendAjax( @@ -1064,6 +1078,10 @@ public class KakaoAlimTalkSendController { HttpServletRequest request, @ModelAttribute("kakaoVO") KakaoVO kakaoVO ) throws Exception { + // 시작 시간 + long startTime = System.currentTimeMillis(); + + System.out.println(" :: kakaoAlimTalkMsgSendAjax :: "); ModelAndView modelAndView = new ModelAndView(); modelAndView.setViewName("jsonView"); @@ -1109,6 +1127,10 @@ public class KakaoAlimTalkSendController { /** 전송금액 설정 --------------------------------------------------*/ KakaoVO priceSet = kakaoSendUtil.kakaoSendPrice(kakaoVO); + if (true) { + throw new IllegalStateException("배열 크기 초과"); + } + if(priceSet.getResultCode() != null && priceSet.getResultCode().equals("2000")) { @@ -1400,6 +1422,17 @@ public class KakaoAlimTalkSendController { } catch (Exception e) { throw new Exception("++++++++++++++++++++++ getAdminPhoneSendMsgData Error !!! " + e); } + // 종료 시간 + long endTime = System.currentTimeMillis(); + +// 실행 시간 계산 (초 단위) + double executionTimeSeconds = (endTime - startTime) / 1000.0; + + System.out.println("실행 시간: " + String.format("%.3f", executionTimeSeconds) + "초"); + + + String returnTxt = String.format("%.3f", executionTimeSeconds) + "초"; + modelAndView.addObject("seconds", returnTxt); return modelAndView; } 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 391e7a03..c24c7336 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 @@ -550,7 +550,7 @@ function sendTemplateInfo(){ // 초기화 $('.varValList').remove(); - $('#bizForm #varNmList').val(''); +// $('#bizForm #varNmList').val(''); // 대체문자 전송 확인 @@ -613,133 +613,118 @@ function sendTemplateInfo(){ }else{ $('#bizForm #reqDate').val(""); } - + + var dataList = []; // 치환문자 있는 데이터 파씽 if($('#bizForm #txtReplYn').val() === 'Y'){ - fn_excelDataTransParsing(); + // fn_excelDataTransParsing(); // 치환문자 있는 수신자 리스트 - fn_transCallToListParsing(); + dataList = fn_transCallToListParsing(); }else{ - // 치환문자 없는 수신자 리스트 - fn_callToListParsing(); + // 치환문자 없는 수신자 리스트 + dataList = fn_callToListParsing(); } - $('#bizForm #senderKey').val($('#selectKakaoProfileList').val()); - $('#bizForm #templateCode').val($('#selectTemplateList').val()); + + + + // 채널 ID + $('#bizForm #senderKey').val($('#selectKakaoProfileList').val()); + // 채널 > 템플릿 + $('#bizForm #templateCode').val($('#selectTemplateList').val()); // 발신번호 $('#bizForm #callFrom').val(removeDash($('#callFromList option:selected').val())); - if(confirm("알림톡을 발송하시겠습니까?")){ - var spamChk = true; - //2023.09.06 알림톡 스팸체크 기능 제거요청으로 인한 주석처리 - /*var spamChk = false; - var spmData = new FormData(document.bizForm); - $.ajax({ - type: "POST" - , url: "/web/mjon/alimtalk/selectSpamKakaoAlimtalkMsgChkAjax.do" - , data: spmData - , dataType:'json' - , async: false - , processData: false - , contentType: false - , cache: false - , success: function (returnData, status) { - if(status == 'success'){ // status 확인 필요한가. 석세스 안뜨면 에러 가지 않나 - - if("fail" == returnData.result){ - alert(returnData.message); - return false; - }else if("loginFail" == returnData.result){ - alert(returnData.message); - return false; - }else if("spams" == returnData.result){ - alert("전송 내용에 스팸문구가 포함되어 있습니다.") - return false; - }else{ - spamChk = true; - return false; - } - - } else if(status== 'fail'){ - alert(returnData.message); - return false; - } - } - , error: function (e) { - alert("문자 발송에 실패하였습니다."); - console.log("ERROR : ", e); - return false; - } - }); */ - - if(spamChk){ - var data = new FormData(document.bizForm); - $.ajax({ - type: "POST" - , url: "/web/mjon/kakao/alimtalk/kakaoAlimTalkMsgSendAjax.do" - , data: data - , dataType: 'json' - , async: true - , processData: false - , contentType: false - , cache: false - , success: function (returnData, status) { - if(status == 'success'){ - if("loginFail" == returnData.result){ - - alert(returnData.message); - return false; - - }else if('fail' == returnData.result){ - - alert(returnData.message); - return false; - - }else if('authFail' == returnData.result){ - - alert(returnData.message); - location.reload(); - - } else if(status == 'success'){ - - var kakaoSendCnt = returnData.resultSts; - - $('.pop_msg_success').css({'display':'block','opacity':'1','left':'50%','top':'50%','transform':'translate(-50%,-50%)'}); - - //예약발송 건의 경우 결과 팝업 문구 변경 - if(reserYn == 'Y'){ - $('.pop_msg_success .msg_text').html("예약 성공 : "+ kakaoSendCnt + "건의
알림톡이 예약 되었습니다."); - }else{ - $('.pop_msg_success .msg_text').html("발송 성공 : "+ kakaoSendCnt + "건의
알림톡이 발송 되었습니다."); - } - - $('.mask').addClass('on'); - } - } - } - ,beforeSend : function(xmlHttpRequest) { - //로딩창 show - $('.loading_layer').addClass('active'); - } - ,complete : function(xhr, textStatus) { - //로딩창 hide - $('.loading_layer').removeClass('active'); - } - ,error: function (e) { - console.log("ERROR : ", e); - alert("카카오 알림톡 전송에 실패하였습니다."); - } - }); + // 폼 데이터를 배열로 직렬화 + var form = $('#bizForm'); + var formDataArray = form.serializeArray(); + + // 배열을 객체로 변환 + var formData = {}; + $.each(formDataArray, function(index, field) { + formData[field.name] = field.value; + }); + + // 빈 값 제거 (참고 코드 기반) + for (var key in formData) { + if (formData[key] === '' || formData[key] === null || formData[key] === undefined) { + delete formData[key]; } } + +// delete formData['varNmList']; + + // 선택된 데이터 추가 (varListMap) + formData["varListMap"] = dataList; + console.log('formData : ', formData); + + if(confirm("알림톡을 발송하시겠습니까?")){ + + + + $.ajax({ + type: "POST", + url: "/web/mjon/kakao/alimtalk/kakaoAlimTalkMsgSendAjax_advc.do", + data: JSON.stringify(formData), + contentType: 'application/json', + dataType: 'json', + success: function (data) { + console.log('data : ', data); +// if(data == 'success'){ + /* if("loginFail" == returnData.result){ + + alert(returnData.message); + return false; + + }else if('fail' == returnData.result){ + + alert(returnData.message); + return false; + + }else if('authFail' == returnData.result){ + + alert(returnData.message); + location.reload(); + + } else if(status == 'success'){ + + var kakaoSendCnt = returnData.resultSts; + + $('.pop_msg_success').css({'display':'block','opacity':'1','left':'50%','top':'50%','transform':'translate(-50%,-50%)'}); + + //예약발송 건의 경우 결과 팝업 문구 변경 + if(reserYn == 'Y'){ + $('.pop_msg_success .msg_text').html("예약 성공 : "+ kakaoSendCnt + "건의
알림톡이 예약 되었습니다."); + }else{ + $('.pop_msg_success .msg_text').html("발송 성공 : "+ kakaoSendCnt + "건의
알림톡이 발송 되었습니다."); + } + + $('.mask').addClass('on'); + } */ +// } + } + ,beforeSend : function(xmlHttpRequest) { + //로딩창 show + $('.loading_layer').addClass('active'); + } + ,complete : function(xhr, textStatus) { + //로딩창 hide + $('.loading_layer').removeClass('active'); + } + ,error: function (e) { + console.log("ERROR : ", e); + alert("카카오 알림톡 전송에 실패하였습니다."); + } + }); + } } /* * 치환문자 있는 수신자 목록 파씽 */ function fn_transCallToListParsing(){ - var callToList = []; +/* var callToList = []; // excel body $('.excelBody').each(function(indexBody, itemBody){ $(itemBody).find('.list_table_name').each(function(indexRow, itemRow){ @@ -750,7 +735,31 @@ function fn_transCallToListParsing(){ }); }); $('#bizForm #callToList').val(callToList); + */ + var dataList = []; + + var headers = []; + $('#excelHead .list_table_name').each(function() { + headers.push($(this).text().trim()); + }); + + $('.excelBody').each(function() { + var row = {}; + $(this).find('.list_table_name').each(function(index) { + var key = headers[index]; + var value = $(this).text().trim(); + if (index === 0) { + row["callToList"] = value; // 수신번호는 별도로 처리 + } else { + row[key] = value; // + } + }); + console.log(row) + dataList.push(row); + }); + + return dataList; } /* @@ -758,13 +767,25 @@ function fn_transCallToListParsing(){ */ function fn_callToListParsing(){ - var callToList = []; + var dataList = []; + /* var callToList = []; // excel body $('.phoneArea').each(function(index, item){ callToList.push($(item).text().replaceAll('\\t', '')); }); - $('#bizForm #callToList').val(callToList); + $('#bizForm #callToList').val(callToList); */ + + $('.phoneArea').each(function(index, item){ + var row = {}; + var value = $(item).text().replaceAll('\\t', '') + row["callToList"] = value; // 수신번호는 별도로 처리 + dataList.push(row); + }); + + return dataList; + + } @@ -777,9 +798,8 @@ function fn_excelDataTransParsing(){ // title 배열 var varHead = []; // 값 배열 - var varVal = []; +// var varVal = []; - var inputTag = ''; // excel title $('#excelHead').find('div').each(function(index, item){ @@ -803,7 +823,7 @@ function fn_excelDataTransParsing(){ $("#bizForm").append(inputTag.replace('$VAL$',varValTemp ).replace('$INDEX$',index )); }); */ - $('.excelBody').each(function(index, item){ +/* $('.excelBody').each(function(index, item){ var valLeng = $('#excelHead').find('.list_table_name').length-1; varValTemp = ''; @@ -821,7 +841,7 @@ function fn_excelDataTransParsing(){ console.log('varValTemp : ',varValTemp); varVal.push(varValTemp); }); - $('#bizForm #varValList').val(varVal); + $('#bizForm #varValList').val(varVal); */ } @@ -1136,8 +1156,8 @@ function checkNumber(event) { - - + + diff --git a/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/at/KakaoAlimtalkMsgDataView_advcbackup_20250310.jsp b/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/at/KakaoAlimtalkMsgDataView_advcbackup_20250310.jsp new file mode 100644 index 00000000..5825e610 --- /dev/null +++ b/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/at/KakaoAlimtalkMsgDataView_advcbackup_20250310.jsp @@ -0,0 +1,1773 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="ui" uri="http://egovframework.gov/ctl/ui"%> +<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> +<%@ page import="itn.com.cmm.LoginVO" %> + + + + + + + + + + + +
+
+
+
Loading
+
+
+ + +
+ +
+ + + + +
+ + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + +
+ +<%--
--%> + + + + + + +
+ + +
+ + + + + + + + +
+ + + + + + + + + + + + + +
+ + +
+
+ + +
+
+ + +
+
+ +
+ + <%@include file="/WEB-INF/jsp/web/kakao/include/KaKaoAlimtalkTopMenuTap.jsp" %> + + +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
채널ID + + + +
템플릿 + + + +
+
    +
  • * 변수명 설정파일을 다운로드 받으신 후 전송대상과 변수를 입력 후 업로드해주세요.
  • +
  • * 엑셀서식은 반드시 텍스트 서식으로 등록해주세요.
  • +
  • * 한번에 전송가능한 최대 발송건은 500건입니다.
  • +
  • * 배송조회시 운송장 번호는 숫자만 등록해주세요.
  • +
+ + +
+
받는사람 +
+
+ + + +
+ + * 중복번호는 한번만 발송됩니다. + +
+ + * 한번에 전송가능한 최대 발송건은 500건 입니다. + +
+
+
+
+
+ + +
+
+

휴대폰

+ + +
+ + + + + +
+
+
+
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+

휴대폰 번호 입력 시 해당 휴대폰 번호에 대한 형식이 어긋나거나 휴대폰 번호에 오류가 있는지 등을 검사하는 기능

+ (예시) 010-1234-0001(O) / 010-123-0001(X) +
+
+
+
+
+
+ + +
+
+

0건 / 중복 0

+ +
+
+
+
+
+ + + + +
+
+
+ +
+
+
+
+
+
+
+
+
+
+
+

발송금액 :

+ +
+

0.0

+
+
+ +
+ + + + + + +
+
+
+
+
+

대체문자

+ +
+
+ + + + + + + + + + + + + + + + +
발신번호 + + + +
내용 +
+
+ +
    + + + +
    +
    +

    + 0 / + + 90byte +

    + 단문 +
    +
    +
    +
    + + + + + + +
    + +
    + +
    +
    +
    +
    +
    +
    +
    +

    + +
    +
    + 알림톡 도착 +
    +
    +

    템플릿을 선택해 주세요

    +
    +
    + +
    +
    + +
    + +
    +
    +

    ※ 단말기 설정에 따라 다르게 보일 수 있습니다

    +

    +
    +
    +
    +
    +
      +
    • + +
    • +
    • + +
    • +
    +
    +
    + + +
    +
    +
    +
    + 날짜 : +
    + +
    + +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    +
    + + + +
    + +
    + + + +
    + +
    + + + + + +
    +
    + +
    +
    +
    + + + +
    + +
    + + +
    +
    + + +
    From 01bc9c6a7df9831e66f98defeac2457ca3015ee3 Mon Sep 17 00:00:00 2001 From: "hehihoho3@gmail.com" Date: Tue, 11 Mar 2025 15:25:31 +0900 Subject: [PATCH 02/11] =?UTF-8?q?mjonCommon=EC=9C=BC=EB=A1=9C=20=EB=B6=84?= =?UTF-8?q?=EB=A6=AC=20=20idgenMsgCId.getNextStringId(mjonMsgSendVOList.si?= =?UTF-8?q?ze());?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/itn/let/mjo/mjocommon/MjonCommon.java | 13 ++++++++++++- .../service/impl/MjonMsgDataServiceImpl.java | 4 +++- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/main/java/itn/let/mjo/mjocommon/MjonCommon.java b/src/main/java/itn/let/mjo/mjocommon/MjonCommon.java index 5803b62f..ae7092d8 100644 --- a/src/main/java/itn/let/mjo/mjocommon/MjonCommon.java +++ b/src/main/java/itn/let/mjo/mjocommon/MjonCommon.java @@ -18,6 +18,8 @@ import org.springframework.stereotype.Service; import com.mysql.jdbc.StringUtils; +import egovframework.com.idgen.CustomIdGnrService; +import egovframework.rte.fdl.cmmn.exception.FdlException; import itn.com.cmm.MjonMsgSendVO; import itn.com.cmm.OptimalMsgResultDTO; import itn.com.cmm.util.MsgSendUtils; @@ -60,7 +62,10 @@ public class MjonCommon { /** xpedite 솔루션 ID*/ @Value("#{globalSettings['Globals.slack.channel.name']}") private String SLACK_CHANNEL; - + + @Resource(name = "egovMjonMsgIdCGnrService") + private CustomIdGnrService idgenMsgCId; + /** @@ -699,6 +704,12 @@ private int parseIntOrDefault(String value, int defaultValue) { + public List getNextCustomMsgCId (int cnt) throws FdlException { + + List idList = idgenMsgCId.getNextStringId(cnt); + return idList; + + } diff --git a/src/main/java/itn/let/mjo/msgdata/service/impl/MjonMsgDataServiceImpl.java b/src/main/java/itn/let/mjo/msgdata/service/impl/MjonMsgDataServiceImpl.java index a3f1ac0d..ecb7b40e 100644 --- a/src/main/java/itn/let/mjo/msgdata/service/impl/MjonMsgDataServiceImpl.java +++ b/src/main/java/itn/let/mjo/msgdata/service/impl/MjonMsgDataServiceImpl.java @@ -4095,7 +4095,9 @@ public class MjonMsgDataServiceImpl extends EgovAbstractServiceImpl implements M MsgSendUtils.setPriceforVO(mjonMsgVO, mjonMsgSendVOList, sysJoinSetVO, mberManageVO); // msg_id 대량 생성 - List idList = idgenMsgCId.getNextStringId(mjonMsgSendVOList.size()); + +// List idList = idgenMsgCId.getNextStringId(mjonMsgSendVOList.size()); + List idList = mjonCommon.getNextCustomMsgCId(mjonMsgSendVOList.size()); for (int i = 0; i < mjonMsgSendVOList.size(); i++) { mjonMsgSendVOList.get(i).setMsgId(idList.get(i)); } From e2a3d281a6860d5f79a405a945e636ccc5576a73 Mon Sep 17 00:00:00 2001 From: "hehihoho3@gmail.com" Date: Wed, 12 Mar 2025 11:56:17 +0900 Subject: [PATCH 03/11] =?UTF-8?q?getSmsTxtBytes=20=EB=AA=A8=EB=93=88?= =?UTF-8?q?=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/itn/com/cmm/util/MsgSendUtils.java | 23 ++----------------- .../itn/let/mjo/mjocommon/MjonCommon.java | 22 +++++++++++++++++- 2 files changed, 23 insertions(+), 22 deletions(-) diff --git a/src/main/java/itn/com/cmm/util/MsgSendUtils.java b/src/main/java/itn/com/cmm/util/MsgSendUtils.java index 0fdc18b9..518ac60a 100644 --- a/src/main/java/itn/com/cmm/util/MsgSendUtils.java +++ b/src/main/java/itn/com/cmm/util/MsgSendUtils.java @@ -23,6 +23,7 @@ import itn.com.cmm.MjonMsgSendVO; import itn.com.cmm.OptimalMsgResultDTO; import itn.let.mail.service.StatusResponse; import itn.let.mjo.event.service.MjonEventVO; +import itn.let.mjo.mjocommon.MjonCommon; import itn.let.mjo.msg.service.MjonMsgVO; import itn.let.mjo.msgagent.service.MjonMsgAgentStsVO; import itn.let.mjo.spammsg.web.ComGetSpamStringParser; @@ -55,26 +56,6 @@ public final class MsgSendUtils { // 이벤트 최저 잔액 public static final double MIN_EVENT_REMAIN_CASH = 7.5; // 이벤트 최소 잔액 - /** - * @methodName : getSmsTxtBytes - * @author : 이호영 - * @date : 2024.09.23 - * @description : sms 텍스트 바이트 계산 후 return; - * @param smsTxt - * @return - * @throws UnsupportedEncodingException - */ - public static int getSmsTxtBytes(String smsTxt) throws UnsupportedEncodingException { //문자열 길이 체크 해주기 - int smsBytes = 0; - //문자 바이트 계산에 필요한 캐릭터 셋 : 한글 2Byte로 계산 - String charset = "euc-kr"; - if(StringUtils.isNotEmpty(smsTxt)) { - String smsCont = smsTxt.replace("\r\n", "\n"); - smsBytes = smsCont.getBytes(charset).length; - } -// log.info(" + smsBytes :: [{}]", smsBytes); - return smsBytes; - } /** * @methodName : getMsgType @@ -96,7 +77,7 @@ public final class MsgSendUtils { // msgType = "4"; // } - int smsTxtByte = getSmsTxtBytes(p_smsTxt); + int smsTxtByte = MjonCommon.getSmsTxtBytes(p_smsTxt); String msgType = SHORT_MSG_TYPE; // 1. 2000 Byte 초과는 에러 처리 diff --git a/src/main/java/itn/let/mjo/mjocommon/MjonCommon.java b/src/main/java/itn/let/mjo/mjocommon/MjonCommon.java index ae7092d8..85119792 100644 --- a/src/main/java/itn/let/mjo/mjocommon/MjonCommon.java +++ b/src/main/java/itn/let/mjo/mjocommon/MjonCommon.java @@ -1,6 +1,7 @@ package itn.let.mjo.mjocommon; import java.io.IOException; +import java.io.UnsupportedEncodingException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; @@ -712,7 +713,26 @@ private int parseIntOrDefault(String value, int defaultValue) { } - + /** + * @methodName : getSmsTxtBytes + * @author : 이호영 + * @date : 2024.09.23 + * @description : sms 텍스트 바이트 계산 후 return; + * @param smsTxt + * @return + * @throws UnsupportedEncodingException + */ + public static int getSmsTxtBytes(String smsTxt) throws UnsupportedEncodingException { //문자열 길이 체크 해주기 + int smsBytes = 0; + //문자 바이트 계산에 필요한 캐릭터 셋 : 한글 2Byte로 계산 + String charset = "euc-kr"; + if(org.apache.commons.lang3.StringUtils.isNotEmpty(smsTxt)) { + String smsCont = smsTxt.replace("\r\n", "\n"); + smsBytes = smsCont.getBytes(charset).length; + } +// log.info(" + smsBytes :: [{}]", smsBytes); + return smsBytes; + } From 7b7b76b99f11bb957dfc836a7845d1506a71e359 Mon Sep 17 00:00:00 2001 From: "hehihoho3@gmail.com" Date: Wed, 12 Mar 2025 16:02:10 +0900 Subject: [PATCH 04/11] =?UTF-8?q?=EC=B9=B4=EC=B9=B4=EC=98=A4=20=EC=86=8D?= =?UTF-8?q?=EB=8F=84=EA=B0=9C=EC=84=A0=20=EC=A7=84=ED=96=89=EC=A4=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../let/kakao/kakaoComm/KakaoSendAdvcVO.java | 19 +- .../let/kakao/kakaoComm/KakaoSendUtil.java | 271 +++++++++++------- .../impl/KakaoAlimTalkServiceImpl.java | 21 +- .../web/KakaoAlimTalkSendController.java | 6 +- 4 files changed, 205 insertions(+), 112 deletions(-) diff --git a/src/main/java/itn/let/kakao/kakaoComm/KakaoSendAdvcVO.java b/src/main/java/itn/let/kakao/kakaoComm/KakaoSendAdvcVO.java index 686cc621..839a73b3 100644 --- a/src/main/java/itn/let/kakao/kakaoComm/KakaoSendAdvcVO.java +++ b/src/main/java/itn/let/kakao/kakaoComm/KakaoSendAdvcVO.java @@ -24,7 +24,9 @@ public class KakaoSendAdvcVO implements Serializable { * */ private static final long serialVersionUID = 343099046833205405L; - + + // ===== + // Insert 데이터 private String msgId; // 문자ID private String msgGroupId; // 전송그룹ID private String userId; // 사용자ID @@ -41,6 +43,16 @@ public class KakaoSendAdvcVO implements Serializable { private String subMsgType; // 대체문자 타입 private String bizJsonName; // JSON 파일명 private String reqDate; // 예약일시 + + // ===== + // ===== + + private float smsPrice; // sms 단가 + private float mmsPrice; // mms 단가 + private float kakaoAtPrice; // 카카오 알림톡 단가 + + + @Override public String toString() { @@ -61,6 +73,11 @@ public class KakaoSendAdvcVO implements Serializable { "\n , subMsgType=[" + subMsgType + "]" + "\n , bizJsonName=[" + bizJsonName + "]" + "\n , reqDate=[" + reqDate + "]" + + "\n , ==== MJ_MSG_DATA INSERT DATA END =======" + + "\n " + + "\n , smsPrice=[" + smsPrice + "]" + + "\n , mmsPrice=[" + mmsPrice + "]" + + "\n , kakaoAtPrice=[" + kakaoAtPrice + "]" + "\n ]"; } diff --git a/src/main/java/itn/let/kakao/kakaoComm/KakaoSendUtil.java b/src/main/java/itn/let/kakao/kakaoComm/KakaoSendUtil.java index 26825760..9f75de64 100644 --- a/src/main/java/itn/let/kakao/kakaoComm/KakaoSendUtil.java +++ b/src/main/java/itn/let/kakao/kakaoComm/KakaoSendUtil.java @@ -9,18 +9,22 @@ import java.util.Map; import javax.annotation.Resource; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; import org.springframework.stereotype.Component; import itn.com.cmm.util.StringUtil; import itn.let.kakao.kakaoComm.kakaoApi.KakaoApiJsonSave; import itn.let.mail.service.StatusResponse; +import itn.let.mjo.mjocommon.MjonCommon; import itn.let.mjo.msg.service.MjonMsgVO; import itn.let.mjo.msgdata.service.MjonMsgDataService; import itn.let.mjo.spammsg.web.ComGetSpamStringParser; import itn.let.module.base.PriceAndPoint; import itn.let.sym.site.service.JoinSettingVO; import itn.let.uss.umt.service.MberManageVO; +import lombok.extern.slf4j.Slf4j; +@Slf4j @Component public class KakaoSendUtil { @@ -32,6 +36,16 @@ public class KakaoSendUtil { @Autowired private PriceAndPoint priceAndPoint; + + @Autowired + private MjonCommon mjonCommon; + + + + // 단문 메세지 타입 + public static final String SHORT_MSG_TYPE = "SMS"; + // 장문 메세지 타입 + public static final String LONG_MSG_TYPE = "MMS"; /** * @methodName : kakaoSendPrice_advc @@ -45,126 +59,178 @@ public class KakaoSendUtil { * @throws Exception * */ - public KakaoVO populateSendLists(KakaoVO kakaoVO, StatusResponse statusResponse) throws Exception { + public List populateSendLists(KakaoVO kakaoVO, StatusResponse statusResponse) throws Exception { //사용자 현재 보유 금액 불러오기(문자 발송 금액 차감 이전 금액) // String befCash = kakaoVO.getBefCash(); - MjonMsgVO mjonMsgVO = new MjonMsgVO(); - mjonMsgVO.setUserId(kakaoVO.getUserId()); - String userMoney = priceAndPoint.getBefCash(kakaoVO.getUserId()); - String userPoint = priceAndPoint.getBefPoint(kakaoVO.getUserId()); - //1.시스템 기본 단가 정보 불러오기 - JoinSettingVO sysJoinSetVO = mjonMsgDataService.selectJoinSettingInfo(); - //2.사용자 개인 단가 정보 불러오기 - MberManageVO mberManageVO = mjonMsgDataService.selectMberManageInfo(kakaoVO.getUserId()); - Float kakaoAtPrice = mberManageVO.getKakaoAtPrice(); - /** 대체문자 여부 체크(있으면 대체문자 가격으로 없으면 카카오톡 가격으로) */ - //대체문자 발송 여부 확인 - if("Y".equals(kakaoVO.getSubMsgSendYn())) { + log.info(" +kakaoVO.getVarListMap().size() :: [{}]", kakaoVO.getVarListMap().size()); + + List kakaoSendAdvcListVO = new ArrayList<>(); + + + + // Map에 총 갯수가 수신자 갯수와 동일함 + for(Map variables : kakaoVO.getVarListMap()) { -// MsgSendUtils.getSmsTxtBytes + KakaoSendAdvcVO kakaoSendAdvcVO = new KakaoSendAdvcVO(); - String charset = "euc-kr"; //문자 바이트 계산에 필요한 캐릭터 셋 : 한글 2Byte로 계산 - int callToCnt = kakaoVO.getCallToList().length; - String sendType = ""; + + // step1 + // Step 1-1: 값 치환 및 수신번호 셋팅 + String templateContent = kakaoVO.getTemplateContent(); // 알림톡 템플릿 - for(int count =0; count < callToCnt; count++) { - - - String tempSubMagTxt = kakaoVO.getSubMsgTxt().replace("\r\n", "\n"); - - - if(kakaoVO.getSubMsgTxtReplYn().equals("Y")) { - tempSubMagTxt = kakaoSubMagTxtRepl(tempSubMagTxt, kakaoVO, count); + // Step 1-2: 수신자 정보 설정 (callToList는 항상 설정). + if (variables.containsKey("callToList")) { + kakaoSendAdvcVO.setCallTo(variables.get("callToList")); + variables.remove("callToList"); // 사용 후 제거. + } + + // Step 1-3: 템플릿 치환데이터 설정 + // TxtReplYn이 "Y"일 때만 치환 수행 + if ("Y".equals(kakaoVO.getTxtReplYn())) { + templateContent = replaceTemplateVariables(templateContent, variables); + } + kakaoSendAdvcVO.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); } - int bytes = tempSubMagTxt.getBytes(charset).length; + kakaoSendAdvcVO.setSubMsgTxt(subMsgTxt);// 실패 + } + /* + log.info("kakaoSendAdvcVO Details: [callTo={}\n, templateContent=\n{}\n, subMsgTxt=\n{}]\n\n\n\n", + kakaoSendAdvcVO.getCallTo(), + kakaoSendAdvcVO.getTemplateContent(), + kakaoSendAdvcVO.getSubMsgTxt() + ); + */ + + + // 시스템 기본 단가 정보 불러오기 + 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); + + + if("Y".equals(kakaoVO.getSubMsgSendYn())) { + int smsTxtByte = mjonCommon.getSmsTxtBytes(kakaoSendAdvcVO.getSubMsgTxt()); - if(bytes < 2000) { - if(bytes > 90) { - sendType = "MMS"; - break; - }else { - sendType = "SMS"; - } - }else { - kakaoVO.setResultCode("2000"); - return kakaoVO; + String sendType = getMsgType(smsTxtByte); + + 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())); + + + } else { + kakaoAtPrice = getValidPrice(mberManageVO.getKakaoAtPrice(), sysJoinSetVO.getKakaoAtPrice()); + kakaoVO.setKakaoAtPrice(kakaoAtPrice); } - if(sendType.equals("MMS")) { - //협의 단가가 없으면 시스템 단가로 지정 - if(mberManageVO.getLongPrice() < 1) { - kakaoAtPrice = sysJoinSetVO.getLongPrice(); - - kakaoVO.setSmsPrice(sysJoinSetVO.getShortPrice()); - kakaoVO.setMmsPrice(sysJoinSetVO.getLongPrice()); - kakaoVO.setKakaoAtPrice(sysJoinSetVO.getKakaoAtPrice()); - }else { - kakaoAtPrice = mberManageVO.getLongPrice(); - - kakaoVO.setSmsPrice(mberManageVO.getShortPrice()); - kakaoVO.setMmsPrice(mberManageVO.getLongPrice()); - - if(mberManageVO.getKakaoAtPrice() < 1) { - kakaoVO.setKakaoAtPrice(sysJoinSetVO.getKakaoAtPrice()); - }else { - kakaoVO.setKakaoAtPrice(mberManageVO.getKakaoAtPrice()); - } - } - }else { - //협의 단가가 없으면 시스템 단가로 지정 - if(mberManageVO.getShortPrice() < 1) { - kakaoAtPrice = sysJoinSetVO.getShortPrice(); - - kakaoVO.setSmsPrice(sysJoinSetVO.getShortPrice()); - kakaoVO.setMmsPrice(sysJoinSetVO.getLongPrice()); - kakaoVO.setKakaoAtPrice(sysJoinSetVO.getKakaoAtPrice()); - }else { - kakaoAtPrice = mberManageVO.getShortPrice(); - - kakaoVO.setSmsPrice(mberManageVO.getShortPrice()); - kakaoVO.setMmsPrice(mberManageVO.getLongPrice()); - if(mberManageVO.getKakaoAtPrice() < 1) { - kakaoVO.setKakaoAtPrice(sysJoinSetVO.getKakaoAtPrice()); - }else { - kakaoVO.setKakaoAtPrice(mberManageVO.getKakaoAtPrice()); - } - } - } - }else { - if(kakaoAtPrice < 1) { //협의 단가가 없으면 시스템 단가로 지정 - kakaoAtPrice = sysJoinSetVO.getKakaoAtPrice(); - - kakaoVO.setSmsPrice(sysJoinSetVO.getShortPrice()); - kakaoVO.setMmsPrice(sysJoinSetVO.getLongPrice()); - kakaoVO.setKakaoAtPrice(sysJoinSetVO.getKakaoAtPrice()); - }else { - kakaoVO.setSmsPrice(mberManageVO.getShortPrice()); - kakaoVO.setMmsPrice(mberManageVO.getLongPrice()); - kakaoVO.setKakaoAtPrice(mberManageVO.getKakaoAtPrice()); - } + + + // step3 + // 바이트 수 체크 ==> 실패 성공 + + // step4 + // 예약 시간 설정 및 분할 데이터 설정 + + // step5 + // 전송 메세지 설정 kakaoSendMsg 참고 + + + +// kakaoSendAdvcVO.setSendType("AT"); + kakaoSendAdvcVO.setMsgType("8"); + kakaoSendAdvcVO.setUserId(kakaoVO.getUserId()); + + } - /** 전송인원 확인*/ - int totCallCnt = kakaoVO.getCallToList().length; - Float kakaoTotPrice = totCallCnt * kakaoAtPrice; // 총결제 금액 = 총 전송수량 * 카카오 알림톡 단가 - String totPrice = kakaoTotPrice.toString(); - System.out.println("@@@@@@@ : "+kakaoTotPrice +" = "+totCallCnt+" * "+kakaoAtPrice); - kakaoVO.setEachPrice(kakaoAtPrice.toString()); - kakaoVO.setBefCash(userMoney); // 고객 충전금액 - kakaoVO.setBefPoint(userPoint); // 고객 충전 포인트 - kakaoVO.setTotPrice(totPrice); // 총 카카오 전송 금액 - - return kakaoVO; + return kakaoSendAdvcListVO; } + + public Float getValidPrice(Float personalPrice, Float defaultPrice) { + return (personalPrice != null && personalPrice > 0) ? personalPrice : defaultPrice; + } + + + /** + * @methodName : getMsgType + * @author : 이호영 + * @date : 2025. 3. 12. + * @description : 메세지 타입 구하기 + * @return : String + * @param smsTxtByte + * @return + * + */ + private String getMsgType(int smsTxtByte) { + // TODO Auto-generated method stub + + String msgType = SHORT_MSG_TYPE; + + // 1. 2000 Byte 초과는 에러 처리 + if (smsTxtByte > 2000) { + return "INVALID"; + } + + // 2. 문자 길이에 따라 메시지 타입 설정 (90 Byte 초과는 장문) + if (smsTxtByte > 90) { + msgType = LONG_MSG_TYPE; + } + + return msgType; + } + + + /** + * @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; + } + + + /** * @Method Name : kakaoSendPrice * @작성일 : 2023. 2. 14. @@ -847,5 +913,10 @@ public class KakaoSendUtil { //} return ""; } - + + public static void statusResponseSet (StatusResponse statusResponse, HttpStatus httpStatus, String msg ) { + statusResponse.setStatus(httpStatus); + statusResponse.setMessage(msg); + + } } 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 38a0032c..8a67f99c 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 @@ -25,6 +25,7 @@ import itn.let.kakao.kakaoComm.KakaoSendUtil; import itn.let.kakao.kakaoComm.KakaoVO; import itn.let.kakao.user.kakaoAt.service.KakaoAlimTalkService; import itn.let.mail.service.StatusResponse; +import itn.let.mjo.mjocommon.MjonCommon; import itn.let.mjo.mjocommon.MjonHolidayApi; import itn.let.mjo.msg.service.MjonMsgVO; import itn.let.mjo.msg.service.impl.MjonMsgDAO; @@ -74,10 +75,10 @@ public class KakaoAlimTalkServiceImpl extends EgovAbstractServiceImpl implements private EgovUserManageService userManageService; @Autowired - private PriceAndPoint priceAndPoint; + KakaoSendUtil kakaoSendUtil; @Autowired - KakaoSendUtil kakaoSendUtil; + private MjonCommon mjonCommon; //발신프로필 상태값 변경(삭제/복구 기능) @Override @@ -845,7 +846,7 @@ public class KakaoAlimTalkServiceImpl extends EgovAbstractServiceImpl implements @Override public StatusResponse insertKakaoAtSandAjax_advc(KakaoVO kakaoVO, HttpServletRequest request) throws Exception { -// log.info(" :: [{}]", kakaoVO.toString()); + log.info(" :: [{}]", kakaoVO.toString()); // KakaoSendAdvcVO @@ -860,6 +861,7 @@ public class KakaoAlimTalkServiceImpl extends EgovAbstractServiceImpl implements return new StatusResponse(HttpStatus.BAD_REQUEST, "로그인 후 이용이 가능합니다."); } + kakaoVO.setUserId(userId); /** * 회원 정지된 상태이면 문자 발송이 안되도록 처리함 현재 로그인 세션도 만료 처리함 @@ -877,18 +879,23 @@ public class KakaoAlimTalkServiceImpl extends EgovAbstractServiceImpl implements /** 카카오톡 전송 기본 설정 -------------------------------------------*/ - kakaoVO.setSendType("AT"); - kakaoVO.setMsgType("8"); - kakaoVO.setUserId(userId); /** 전송금액 설정 --------------------------------------------------*/ -// KakaoVO priceSet = kakaoSendUtil.populateSendLists(kakaoVO, statusResponse); + List kakaoSendAdvcListVO = kakaoSendUtil.populateSendLists(kakaoVO, statusResponse); + if (statusResponse.getStatus() != null && !statusResponse.getStatus().equals(HttpStatus.OK)) { + log.error(" + populateSendLists 처리 중 오류 발생: {}", statusResponse.getMessage()); + return statusResponse; + } + // step 1 +// List idList = mjonCommon.getNextCustomMsgCId(mjonMsgSendVOList.size()); + + 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 4f4b5784..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 @@ -221,6 +221,8 @@ public class KakaoAlimTalkSendController { } return "web/kakao/msgdata/at/KakaoAlimtalkMsgDataView"; +// return "web/kakao/msgdata/at/KakaoAlimtalkMsgDataView_advcbackup_20250310"; + } @@ -1127,10 +1129,6 @@ public class KakaoAlimTalkSendController { /** 전송금액 설정 --------------------------------------------------*/ KakaoVO priceSet = kakaoSendUtil.kakaoSendPrice(kakaoVO); - if (true) { - throw new IllegalStateException("배열 크기 초과"); - } - if(priceSet.getResultCode() != null && priceSet.getResultCode().equals("2000")) { From a74193673eac7c681a5fe605d213c866d2daa9e8 Mon Sep 17 00:00:00 2001 From: "hehihoho3@gmail.com" Date: Thu, 13 Mar 2025 11:37:28 +0900 Subject: [PATCH 05/11] =?UTF-8?q?=EC=95=8C=EB=A6=BC=ED=86=A1=20=EC=A7=84?= =?UTF-8?q?=ED=96=89=EC=A4=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../let/kakao/kakaoComm/KakaoSendUtil.java | 62 ++++++++++++++++--- .../web/KakaoAlimTalkSendController.java | 4 +- 2 files changed, 54 insertions(+), 12 deletions(-) diff --git a/src/main/java/itn/let/kakao/kakaoComm/KakaoSendUtil.java b/src/main/java/itn/let/kakao/kakaoComm/KakaoSendUtil.java index 9f75de64..48a0eb42 100644 --- a/src/main/java/itn/let/kakao/kakaoComm/KakaoSendUtil.java +++ b/src/main/java/itn/let/kakao/kakaoComm/KakaoSendUtil.java @@ -1,13 +1,17 @@ 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 javax.annotation.Resource; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Component; @@ -71,12 +75,29 @@ public class KakaoSendUtil { List kakaoSendAdvcListVO = new ArrayList<>(); + + // 예약 시간 기본값 설정 + Date now = new Date(); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); + // ReqDate가 비어 있으면 현재 시간으로 설정, 그렇지 않으면 ReqDate로 설정 + // 화면에서 예약문자면 예약시간을 regDate로 설정한다. + Date baseDate; + if (StringUtils.isEmpty(kakaoVO.getReqDate())) { + kakaoVO.setReqDate(sdf.format(now)); // ReqDate에 현재 시간 설정 + baseDate = now; + } else { + baseDate = sdf.parse(kakaoVO.getReqDate()); // ReqDate를 baseDate로 설정 + } + + Calendar calendar = Calendar.getInstance(); + calendar.setTime(baseDate); // calendar에 baseDate 설정 + int counter = 0; // 분할 건수 카운터 // Map에 총 갯수가 수신자 갯수와 동일함 for(Map variables : kakaoVO.getVarListMap()) { - KakaoSendAdvcVO kakaoSendAdvcVO = new KakaoSendAdvcVO(); + KakaoSendAdvcVO sendVO = new KakaoSendAdvcVO(); @@ -86,7 +107,7 @@ public class KakaoSendUtil { // Step 1-2: 수신자 정보 설정 (callToList는 항상 설정). if (variables.containsKey("callToList")) { - kakaoSendAdvcVO.setCallTo(variables.get("callToList")); + sendVO.setCallTo(variables.get("callToList")); variables.remove("callToList"); // 사용 후 제거. } @@ -95,7 +116,7 @@ public class KakaoSendUtil { if ("Y".equals(kakaoVO.getTxtReplYn())) { templateContent = replaceTemplateVariables(templateContent, variables); } - kakaoSendAdvcVO.setTemplateContent(templateContent); + sendVO.setTemplateContent(templateContent); // Step 1-4: 실패 대체 문자 치환데이터 설정 @@ -105,7 +126,7 @@ public class KakaoSendUtil { if ("Y".equals(kakaoVO.getSubMsgTxtReplYn())) { subMsgTxt = replaceTemplateVariables(subMsgTxt, variables); } - kakaoSendAdvcVO.setSubMsgTxt(subMsgTxt);// 실패 + sendVO.setSubMsgTxt(subMsgTxt);// 실패 } /* log.info("kakaoSendAdvcVO Details: [callTo={}\n, templateContent=\n{}\n, subMsgTxt=\n{}]\n\n\n\n", @@ -116,6 +137,10 @@ public class KakaoSendUtil { */ + + // step3 + // 바이트 수 체크 및 금액설정 + // 시스템 기본 단가 정보 불러오기 JoinSettingVO sysJoinSetVO = mjonMsgDataService.selectJoinSettingInfo(); @@ -132,7 +157,7 @@ public class KakaoSendUtil { if("Y".equals(kakaoVO.getSubMsgSendYn())) { - int smsTxtByte = mjonCommon.getSmsTxtBytes(kakaoSendAdvcVO.getSubMsgTxt()); + int smsTxtByte = mjonCommon.getSmsTxtBytes(sendVO.getSubMsgTxt()); String sendType = getMsgType(smsTxtByte); @@ -152,11 +177,28 @@ public class KakaoSendUtil { - // step3 - // 바이트 수 체크 ==> 실패 성공 - // step4 // 예약 시간 설정 및 분할 데이터 설정 + if ("Y".equalsIgnoreCase(kakaoVO.getReserveYn())) { + // 분할 발송일 경우 + if ("on".equalsIgnoreCase(kakaoVO.getDivideChk())) { + if (counter == Integer.parseInt(kakaoVO.getDivideCnt())) { // 지정된 건수마다 간격 추가 + counter = 0; + calendar.add(Calendar.MINUTE, Integer.parseInt(kakaoVO.getDivideTime())); + } + counter++; + } + // 예약 시간 설정 + } + + // 즉시 발송인경우 현재 시간 + // 예약인 경우 위에 설정한 시간 입력 + sendVO.setReqDate(sdf.format(calendar.getTime())); + + + + + // step5 // 전송 메세지 설정 kakaoSendMsg 참고 @@ -164,8 +206,8 @@ public class KakaoSendUtil { // kakaoSendAdvcVO.setSendType("AT"); - kakaoSendAdvcVO.setMsgType("8"); - kakaoSendAdvcVO.setUserId(kakaoVO.getUserId()); + sendVO.setMsgType("8"); + sendVO.setUserId(kakaoVO.getUserId()); } 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 c7f78365..f4cc5897 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"; } From 65a8eb9dc6c8a6b517fc45766ea5d71c44b84946 Mon Sep 17 00:00:00 2001 From: "hehihoho3@gmail.com" Date: Fri, 14 Mar 2025 16:21:28 +0900 Subject: [PATCH 06/11] =?UTF-8?q?=EA=B0=80=EB=A1=9C=EA=B8=B8=EC=9D=B4=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/webapp/js/kakao/at/tabulator.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/webapp/js/kakao/at/tabulator.js b/src/main/webapp/js/kakao/at/tabulator.js index 493c1ba7..f5735d32 100644 --- a/src/main/webapp/js/kakao/at/tabulator.js +++ b/src/main/webapp/js/kakao/at/tabulator.js @@ -99,13 +99,13 @@ $(document).ready(function (){ placeholder:"주소록 그룹을 선택해 주세요.", //fit columns to width of table (optional) resizableColumns:false, columns:[ //Define Table Columns - {formatter:"rowSelection", titleFormatter:"rowSelection",clipboard:false, hozAlign:"center", headerSort:false, cellClick:function(e, cell){ + {formatter:"rowSelection", titleFormatter:"rowSelection",clipboard:false, hozAlign:"center", headerSort:false, width: 50, cellClick:function(e, cell){ cell.getRow().toggleSelect(); } }, - {title:"그룹명", hozAlign:"center", field:"addrGroupNm", editor:"input", width:120, validator:["required","minLength:2", "maxLength:40"]}, - {title:"이름", hozAlign:"center", field:"addrName", editor:"input", width:120, validator:["maxLength:12"]}, - {title:"휴대폰번호", hozAlign:"center", field:"addrPhone", editor:"input", width:120, validator:["required","minLength:10", "maxLength:11"]}, + {title:"그룹명", hozAlign:"center", field:"addrGroupNm", widthGrow: 3, editor:"input", validator:["required","minLength:2", "maxLength:40"]}, + {title:"이름", hozAlign:"center", field:"addrName", widthGrow: 2, editor:"input", validator:["maxLength:12"]}, + {title:"휴대폰번호", hozAlign:"center", field:"addrPhone", widthGrow: 3, editor:"input", validator:["required","minLength:10", "maxLength:11"]}, ], validationFailed:function(cell, value, parameters){ // 유효성 체크 함수 - 아직 잘 모르겠음 From 3afef8e37cd1476f2f6d4224c4d1b75a4f0dc834 Mon Sep 17 00:00:00 2001 From: "hehihoho3@gmail.com" Date: Tue, 18 Mar 2025 12:11:23 +0900 Subject: [PATCH 07/11] =?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 @@