diff --git a/src/main/java/itn/com/cmm/MjonFTSendVO.java b/src/main/java/itn/com/cmm/MjonFTSendVO.java new file mode 100644 index 00000000..edc815dc --- /dev/null +++ b/src/main/java/itn/com/cmm/MjonFTSendVO.java @@ -0,0 +1,130 @@ +package itn.com.cmm; + +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; + +@Getter +@Setter +@ToString +public class MjonFTSendVO{ + + + /** + * @description : 수신자번호 + */ + private String phone; + + /** + * @description : [*이름*] - 치환문자 + */ + private String name; + + /** + * @description : [*1*] - 치환문자 + */ + private String rep1; + + /** + * @description : [*2*] - 치환문자 + */ + private String rep2; + + /** + * @description : [*3*] - 치환문자 + */ + private String rep3; + + /** + * @description : [*4*] - 치환문자 + */ + private String rep4; + + /** + * @description : 문자ID + */ + private String msgId; + + /** + * @description : 전송그룹ID (대량문자의 경우 하나의 그룹으로 세팅) + */ + private String msgGroupId; + + /** + * @description : 문자온 일반회원ID + */ + private String userId; + + /** + * @description : 발신번호 (하이픈 등의 문자를 제외한 12byte이하의 숫자로 입력한다.) + */ + private String callFrom; + /** + * @description : 수신번호 (하이픈 등의 문자를 제외한 12byte이하의 숫자로 입력한다.) + */ + private String callTo; + /** + * @description : 예약 발송일시 + */ + private String reqDate; + /** + * @description :전송사(04:다우, 05:JJ, 07:IVT, 01:아이하트 , 02:현대퓨처넷, 03:아이엠오) + */ + private String agentCode; + + /** + * @description : MMS용 메시지제목 + */ + private String subject; + + /** + * @description : SMS용 메시지본문 + */ + private String smsTxt; + + /** + * @description : 메세지타입(4: SMS 전송, 5: URL 전송, 6: MMS전송, 7: BARCODE전송, 8: 카카오 알림톡 전송) + */ + private String msgType; + + + /** + * @description : 첨부파일 갯수 + */ + private String fileCnt; + + /** + * @description : 파일이름1 + */ + private String filePath1; + + /** + * @description : 파일이름2 + */ + private String filePath2; + + /** + * @description : 파일이름3 + */ + private String filePath3; + + + + /** + * @description : event 여부 / group tb에 넣는 용도 / 기본값 N + */ + private String eventYn="N"; + + + + /** + * @description : 개별단가 + */ + private String eachPrice; + + + + + + +} diff --git a/src/main/java/itn/com/cmm/util/MsgSendUtils.java b/src/main/java/itn/com/cmm/util/MsgSendUtils.java index 339137e9..74ba0866 100644 --- a/src/main/java/itn/com/cmm/util/MsgSendUtils.java +++ b/src/main/java/itn/com/cmm/util/MsgSendUtils.java @@ -463,7 +463,7 @@ public final class MsgSendUtils { } } - private static Boolean getReplaceYN(String smsTxtTemplate) {// 여러 치환 구문이 포함된 정규식 패턴 + public static Boolean getReplaceYN(String smsTxtTemplate) {// 여러 치환 구문이 포함된 정규식 패턴 if (smsTxtTemplate == null) { return false; // null일 경우 false 반환 diff --git a/src/main/java/itn/let/kakao/admin/kakaoAt/service/MjonKakaoATVO.java b/src/main/java/itn/let/kakao/admin/kakaoAt/service/MjonKakaoATVO.java index 712e0b91..1792b097 100644 --- a/src/main/java/itn/let/kakao/admin/kakaoAt/service/MjonKakaoATVO.java +++ b/src/main/java/itn/let/kakao/admin/kakaoAt/service/MjonKakaoATVO.java @@ -3,7 +3,11 @@ package itn.let.kakao.admin.kakaoAt.service; import java.util.List; import itn.com.cmm.ComDefaultVO; +import lombok.Getter; +import lombok.Setter; +@Getter +@Setter public class MjonKakaoATVO extends ComDefaultVO{ private static final long serialVersionUID = 1L; @@ -30,6 +34,7 @@ public class MjonKakaoATVO extends ComDefaultVO{ private String msgKind; // '문자 종류 일반:N, 광고:A, 선거:C', private String msgPayCode; // '재전송 기능에 의한 최종전송콘텐트 종류 저장', private String contSeq; // COMMENT 'MMS의 콘텐츠 Key(MMS_CONTENTS_INFO의 CONT_SEQ)', + private String contents; // BIZ_ATTACHMENTS -> COMMENT private String msgTypeResend; // '재전송할 문자 타입. 값이 있으면 재전송. 없으면 단 건 전송', private String centerSeqResend; // '재전송할 센터. NPro 내부적으로 사용함.', private String msgNoticetalkSenderKey; // '카카오 알림톡에 등록된 사용자 고유키', @@ -154,88 +159,8 @@ public class MjonKakaoATVO extends ComDefaultVO{ private String yellowId; private String bizKakaoResendTypeCnt; - public String getMsgDiv() { - return msgDiv; - } - public void setMsgDiv(String msgDiv) { - this.msgDiv = msgDiv; - } - public Float getAgentPrice() { - return agentPrice; - } - public void setAgentPrice(Float agentPrice) { - this.agentPrice = agentPrice; - } private String registPnttm; //통계등록일시 - public String getNowDate() { - return nowDate; - } - public void setNowDate(String nowDate) { - this.nowDate = nowDate; - } - public String getTodayYn() { - return todayYn; - } - public void setTodayYn(String todayYn) { - this.todayYn = todayYn; - } - public String getReserveType() { - return reserveType; - } - public void setReserveType(String reserveType) { - this.reserveType = reserveType; - } - public String getAtchFiles() { - return atchFiles; - } - public void setAtchFiles(String atchFiles) { - this.atchFiles = atchFiles; - } - public String getApprovalPnttm() { - return approvalPnttm; - } - public void setApprovalPnttm(String approvalPnttm) { - this.approvalPnttm = approvalPnttm; - } - public String getPayCnt() { - return payCnt; - } - public void setPayCnt(String payCnt) { - this.payCnt = payCnt; - } - public String getPayPct() { - return payPct; - } - public void setPayPct(String payPct) { - this.payPct = payPct; - } - public String getAdminSmsNoticeYn() { - return adminSmsNoticeYn; - } - public void setAdminSmsNoticeYn(String adminSmsNoticeYn) { - this.adminSmsNoticeYn = adminSmsNoticeYn; - } - - public String getSearchAdminSmsNoticeYn() { - return searchAdminSmsNoticeYn; - } - public void setSearchAdminSmsNoticeYn(String searchAdminSmsNoticeYn) { - this.searchAdminSmsNoticeYn = searchAdminSmsNoticeYn; - } - - public String getMaxRegDate() { - return maxRegDate; - } - public void setMaxRegDate(String maxRegDate) { - this.maxRegDate = maxRegDate; - } - public String getMinRegDate() { - return minRegDate; - } - public void setMinRegDate(String minRegDate) { - this.minRegDate = minRegDate; - } private String resultCode; //문자 결과 코드 정보 @@ -288,1005 +213,12 @@ public class MjonKakaoATVO extends ComDefaultVO{ private int totalCallCnt; //수신자 전체 갯 - public String getUserCallbackYn() { - return userCallbackYn; - } - public void setUserCallbackYn(String userCallbackYn) { - this.userCallbackYn = userCallbackYn; - } - - public String getCallbackYn() { - return callbackYn; - } - public void setCallbackYn(String callbackYn) { - this.callbackYn = callbackYn; - } - - public int getCallRejectionCount() { - return callRejectionCount; - } - public void setCallRejectionCount(int callRejectionCount) { - this.callRejectionCount = callRejectionCount; - } - public int getSuccessCount() { - return successCount; - } - public void setSuccessCount(int successCount) { - this.successCount = successCount; - } - - private int regCount; - public int getRegCount() { - return regCount; - } - public void setRegCount(int regCount) { - this.regCount = regCount; - } - public int getRegComCount() { - return regComCount; - } - public void setRegComCount(int regComCount) { - this.regComCount = regComCount; - } - - private int regComCount; - - public String getAddrGrpId() { - return addrGrpId; - } - public void setAddrGrpId(String addrGrpId) { - this.addrGrpId = addrGrpId; - } - public String getAddrGrpNm() { - return addrGrpNm; - } - public void setAddrGrpNm(String addrGrpNm) { - this.addrGrpNm = addrGrpNm; - } - - private int orderByCode; // 문자타입 정렬번호 private String detailType; + private String adFlag; - public int getOrderByCode() { - return orderByCode; - } - public void setOrderByCode(int orderByCode) { - this.orderByCode = orderByCode; - } - public String getRegDate() { - return regDate; - } - public void setRegDate(String regDate) { - this.regDate = regDate; - } - public String getMsgId() { - return msgId; - } - public void setMsgId(String msgId) { - this.msgId = msgId; - } - public String getUserId() { - return userId; - } - public void setUserId(String userId) { - this.userId = userId; - } - public String getAgentFlag() { - return agentFlag; - } - public void setAgentFlag(String agentFlag) { - this.agentFlag = agentFlag; - } - public String getUserData() { - return userData; - } - public void setUserData(String userData) { - this.userData = userData; - } - public String getMsgSeq() { - return msgSeq; - } - public void setMsgSeq(String msgSeq) { - this.msgSeq = msgSeq; - } - public String getCurState() { - return curState; - } - public void setCurState(String curState) { - this.curState = curState; - } - public String getSentDate() { - return sentDate; - } - public void setSentDate(String sentDate) { - this.sentDate = sentDate; - } - public String getRsltDate() { - return rsltDate; - } - public void setRsltDate(String rsltDate) { - this.rsltDate = rsltDate; - } - public String getReportDate() { - return reportDate; - } - public void setReportDate(String reportDate) { - this.reportDate = reportDate; - } - public String getReqDate() { - return reqDate; - } - public void setReqDate(String reqDate) { - this.reqDate = reqDate; - } - public String getRsltCode() { - return rsltCode; - } - public void setRsltCode(String rsltCode) { - this.rsltCode = rsltCode; - } - public String getRsltCode2() { - return rsltCode2; - } - public void setRsltCode2(String rsltCode2) { - this.rsltCode2 = rsltCode2; - } - public String getRsltNet() { - return rsltNet; - } - public void setRsltNet(String rsltNet) { - this.rsltNet = rsltNet; - } - public String getCallTo() { - return callTo; - } - public void setCallTo(String callTo) { - this.callTo = callTo; - } - public String getCallFrom() { - return callFrom; - } - public void setCallFrom(String callFrom) { - this.callFrom = callFrom; - } - public String getSmsTxt() { - return smsTxt; - } - public void setSmsTxt(String smsTxt) { - this.smsTxt = smsTxt; - } - public String getSmsTxtArea() { - return smsTxtArea; - } - public void setSmsTxtArea(String smsTxtArea) { - this.smsTxtArea = smsTxtArea; - } - public String getMsgType() { - return msgType; - } - public void setMsgType(String msgType) { - this.msgType = msgType; - } - public String getMsgKind() { - return msgKind; - } - public void setMsgKind(String msgKind) { - this.msgKind = msgKind; - } - public String getMsgPayCode() { - return msgPayCode; - } - public void setMsgPayCode(String msgPayCode) { - this.msgPayCode = msgPayCode; - } - public String getContSeq() { - return contSeq; - } - public void setContSeq(String contSeq) { - this.contSeq = contSeq; - } - public String getMsgTypeResend() { - return msgTypeResend; - } - public void setMsgTypeResend(String msgTypeResend) { - this.msgTypeResend = msgTypeResend; - } - public String getCenterSeqResend() { - return centerSeqResend; - } - public void setCenterSeqResend(String centerSeqResend) { - this.centerSeqResend = centerSeqResend; - } - public String getMsgNoticetalkSenderKey() { - return msgNoticetalkSenderKey; - } - public void setMsgNoticetalkSenderKey(String msgNoticetalkSenderKey) { - this.msgNoticetalkSenderKey = msgNoticetalkSenderKey; - } - public String getMsgNoticetalkTmpKey() { - return msgNoticetalkTmpKey; - } - public void setMsgNoticetalkTmpKey(String msgNoticetalkTmpKey) { - this.msgNoticetalkTmpKey = msgNoticetalkTmpKey; - } - public String getMsgResendCount() { - return msgResendCount; - } - public void setMsgResendCount(String msgResendCount) { - this.msgResendCount = msgResendCount; - } - public String getMsgResenddate() { - return msgResenddate; - } - public void setMsgResenddate(String msgResenddate) { - this.msgResenddate = msgResenddate; - } - public String getSentDatePre() { - return sentDatePre; - } - public void setSentDatePre(String sentDatePre) { - this.sentDatePre = sentDatePre; - } - public String getRsltDatePre() { - return rsltDatePre; - } - public void setRsltDatePre(String rsltDatePre) { - this.rsltDatePre = rsltDatePre; - } - public String getReportDatePre() { - return reportDatePre; - } - public void setReportDatePre(String reportDatePre) { - this.reportDatePre = reportDatePre; - } - public String getRsltCodePre() { - return rsltCodePre; - } - public void setRsltCodePre(String rsltCodePre) { - this.rsltCodePre = rsltCodePre; - } - public String getRsltCode2Pre() { - return rsltCode2Pre; - } - public void setRsltCode2Pre(String rsltCode2Pre) { - this.rsltCode2Pre = rsltCode2Pre; - } - public String getRsltNetPre() { - return rsltNetPre; - } - public void setRsltNetPre(String rsltNetPre) { - this.rsltNetPre = rsltNetPre; - } - public String getConectMthd() { - return conectMthd; - } - public void setConectMthd(String conectMthd) { - this.conectMthd = conectMthd; - } - - public String getAgentCode() { - return agentCode; - } - public void setAgentCode(String agentCode) { - this.agentCode = agentCode; - } - public String getConectMthdTxt() { - return conectMthdTxt; - } - public void setConectMthdTxt(String conectMthdTxt) { - this.conectMthdTxt = conectMthdTxt; - } - public String getAgentCodeTxt() { - return agentCodeTxt; - } - public void setAgentCodeTxt(String agentCodeTxt) { - this.agentCodeTxt = agentCodeTxt; - } - public String getCurStateTxt() { - return curStateTxt; - } - public void setCurStateTxt(String curStateTxt) { - this.curStateTxt = curStateTxt; - } - public String getMsgTypeTxt() { - return msgTypeTxt; - } - public void setMsgTypeTxt(String msgTypeTxt) { - this.msgTypeTxt = msgTypeTxt; - } - public String getSentDateTxt() { - return sentDateTxt; - } - public void setSentDateTxt(String sentDateTxt) { - this.sentDateTxt = sentDateTxt; - } - public String getSearchCondition2() { - return searchCondition2; - } - public void setSearchCondition2(String searchCondition2) { - this.searchCondition2 = searchCondition2; - } - public String getDelFlag() { - return delFlag; - } - public void setDelFlag(String delFlag) { - this.delFlag = delFlag; - } - public String getDelFlagTxt() { - return delFlagTxt; - } - public void setDelFlagTxt(String delFlagTxt) { - this.delFlagTxt = delFlagTxt; - } - public String getSearchCondition3() { - return searchCondition3; - } - public void setSearchCondition3(String searchCondition3) { - this.searchCondition3 = searchCondition3; - } - public String getSearchCondition4() { - return searchCondition4; - } - public void setSearchCondition4(String searchCondition4) { - this.searchCondition4 = searchCondition4; - } - public String getMmsSubject() { - return mmsSubject; - } - public void setMmsSubject(String mmsSubject) { - this.mmsSubject = mmsSubject; - } - public String getFileCnt() { - return fileCnt; - } - public void setFileCnt(String fileCnt) { - this.fileCnt = fileCnt; - } - public String getFileType1() { - return fileType1; - } - public void setFileType1(String fileType1) { - this.fileType1 = fileType1; - } - public String getFileName1() { - return fileName1; - } - public void setFileName1(String fileName1) { - this.fileName1 = fileName1; - } - public String getFileType2() { - return fileType2; - } - public void setFileType2(String fileType2) { - this.fileType2 = fileType2; - } - public String getFileName2() { - return fileName2; - } - public void setFileName2(String fileName2) { - this.fileName2 = fileName2; - } - public String getFileType3() { - return fileType3; - } - public void setFileType3(String fileType3) { - this.fileType3 = fileType3; - } - public String getFileName3() { - return fileName3; - } - public void setFileName3(String fileName3) { - this.fileName3 = fileName3; - } - public String getSubject() { - return subject; - } - public void setSubject(String subject) { - this.subject = subject; - } - public String getMsgGroupId() { - return msgGroupId; - } - public void setMsgGroupId(String msgGroupId) { - this.msgGroupId = msgGroupId; - } - public String getMsgGroupCnt() { - return msgGroupCnt; - } - public void setMsgGroupCnt(String msgGroupCnt) { - this.msgGroupCnt = msgGroupCnt; - } - public String[] getCallToList() { - return callToList; - } - public void setCallToList(String[] strings) { - this.callToList = strings; - } - public String[] getImgFilePath() { - return imgFilePath; - } - public void setImgFilePath(String[] imgFilePath) { - this.imgFilePath = imgFilePath; - } - public String getNeoType() { - return neoType; - } - public void setNeoType(String neoType) { - this.neoType = neoType; - } - public int getMsgCnt() { - return msgCnt; - } - public void setMsgCnt(int msgCnt) { - this.msgCnt = msgCnt; - } - public String getSearchCondition5() { - return searchCondition5; - } - public void setSearchCondition5(String searchCondition5) { - this.searchCondition5 = searchCondition5; - } - public String getNtceBgnde() { - return ntceBgnde; - } - public void setNtceBgnde(String ntceBgnde) { - this.ntceBgnde = ntceBgnde; - } - public String getEachPrice() { - return eachPrice; - } - public void setEachPrice(String eachPrice) { - this.eachPrice = eachPrice; - } - public String getTotPrice() { - return totPrice; - } - public void setTotPrice(String totPrice) { - this.totPrice = totPrice; - } - public String getBeforeUrl() { - return beforeUrl; - } - public void setBeforeUrl(String beforeUrl) { - this.beforeUrl = beforeUrl; - } - public String getReserveYn() { - return reserveYn; - } - public void setReserveYn(String reserveYn) { - this.reserveYn = reserveYn; - } - public String getReserveCYn() { - return reserveCYn; - } - public void setReserveCYn(String reserveCYn) { - this.reserveCYn = reserveCYn; - } - public String getCancelDate() { - return cancelDate; - } - public void setCancelDate(String cancelDate) { - this.cancelDate = cancelDate; - } - public String[] getImgFileId() { - return imgFileId; - } - public void setImgFileId(String[] imgFileId) { - this.imgFileId = imgFileId; - } - public String[] getTemplateYn() { - return templateYn; - } - public void setTemplateYn(String[] templateYn) { - this.templateYn = templateYn; - } - public String getNtceEndde() { - return ntceEndde; - } - public void setNtceEndde(String ntceEndde) { - this.ntceEndde = ntceEndde; - } - public static long getSerialversionuid() { - return serialVersionUID; - } - public String getSendRate() { - return sendRate; - } - public void setSendRate(String sendRate) { - this.sendRate = sendRate; - } - public float getSendRateInfo() { - return sendRateInfo; - } - public void setSendRateInfo(float sendRateInfo) { - this.sendRateInfo = sendRateInfo; - } - public String getDivideChk() { - return divideChk; - } - public void setDivideChk(String divideChk) { - this.divideChk = divideChk; - } - public String getDivideCnt() { - return divideCnt; - } - public void setDivideCnt(String divideCnt) { - this.divideCnt = divideCnt; - } - public String getDivideTime() { - return divideTime; - } - public void setDivideTime(String divideTime) { - this.divideTime = divideTime; - } - public String getBefCash() { - return befCash; - } - public void setBefCash(String befCash) { - this.befCash = befCash; - } - public String getRecommId() { - return recommId; - } - public void setRecommId(String recommId) { - this.recommId = recommId; - } - public String getBefPoint() { - return befPoint; - } - public void setBefPoint(String befPoint) { - this.befPoint = befPoint; - } - public String[] getNameList() { - return nameList; - } - public void setNameList(String[] nameList) { - this.nameList = nameList; - } - public String[] getRep1List() { - return rep1List; - } - public void setRep1List(String[] rep1List) { - this.rep1List = rep1List; - } - public String[] getRep2List() { - return rep2List; - } - public void setRep2List(String[] rep2List) { - this.rep2List = rep2List; - } - public String[] getRep3List() { - return rep3List; - } - public void setRep3List(String[] rep3List) { - this.rep3List = rep3List; - } - public String[] getRep4List() { - return rep4List; - } - public void setRep4List(String[] rep4List) { - this.rep4List = rep4List; - } - public String getThisPoint() { - return thisPoint; - } - public void setThisPoint(String thisPoint) { - this.thisPoint = thisPoint; - } - public String getEndDate() { - return endDate; - } - public void setEndDate(String endDate) { - this.endDate = endDate; - } - public String getStartDate() { - return startDate; - } - public void setStartDate(String startDate) { - this.startDate = startDate; - } - public int getPhoneNumberCnt() { - return phoneNumberCnt; - } - public void setPhoneNumberCnt(int phoneNumberCnt) { - this.phoneNumberCnt = phoneNumberCnt; - } - public String getPhmAuthType() { - return phmAuthType; - } - public void setPhmAuthType(String phmAuthType) { - this.phmAuthType = phmAuthType; - } - public String getRefundYn() { - return refundYn; - } - public void setRefundYn(String refundYn) { - this.refundYn = refundYn; - } - public String getFilePath1() { - return filePath1; - } - public void setFilePath1(String filePath1) { - this.filePath1 = filePath1; - } - public String getFilePath2() { - return filePath2; - } - public void setFilePath2(String filePath2) { - this.filePath2 = filePath2; - } - public String getFilePath3() { - return filePath3; - } - public void setFilePath3(String filePath3) { - this.filePath3 = filePath3; - } - public String getResultCodeTxt() { - return resultCodeTxt; - } - public void setResultCodeTxt(String resultCodeTxt) { - this.resultCodeTxt = resultCodeTxt; - } - public String getTxtReplYn() { - return txtReplYn; - } - public void setTxtReplYn(String txtReplYn) { - this.txtReplYn = txtReplYn; - } - public String getsPrice() { - return sPrice; - } - public void setsPrice(String sPrice) { - this.sPrice = sPrice; - } - public String getmPrice() { - return mPrice; - } - public void setmPrice(String mPrice) { - this.mPrice = mPrice; - } - public String getpPrice() { - return pPrice; - } - public void setpPrice(String pPrice) { - this.pPrice = pPrice; - } - public String getP2Price() { - return p2Price; - } - public void setP2Price(String p2Price) { - this.p2Price = p2Price; - } - public String getP3Price() { - return p3Price; - } - public void setP3Price(String p3Price) { - this.p3Price = p3Price; - } - public String getShortMsgCnt() { - return shortMsgCnt; - } - public void setShortMsgCnt(String shortMsgCnt) { - this.shortMsgCnt = shortMsgCnt; - } - public String getLongMsgCnt() { - return longMsgCnt; - } - public void setLongMsgCnt(String longMsgCnt) { - this.longMsgCnt = longMsgCnt; - } - public String getAtchFileId1() { - return atchFileId1; - } - public void setAtchFileId1(String atchFileId1) { - this.atchFileId1 = atchFileId1; - } - public String getAtchFileId2() { - return atchFileId2; - } - public void setAtchFileId2(String atchFileId2) { - this.atchFileId2 = atchFileId2; - } - public String getAtchFileId3() { - return atchFileId3; - } - public void setAtchFileId3(String atchFileId3) { - this.atchFileId3 = atchFileId3; - } - public String getAtchFileSn1() { - return atchFileSn1; - } - public void setAtchFileSn1(String atchFileSn1) { - this.atchFileSn1 = atchFileSn1; - } - public String getAtchFileSn2() { - return atchFileSn2; - } - public void setAtchFileSn2(String atchFileSn2) { - this.atchFileSn2 = atchFileSn2; - } - public String getAtchFileSn3() { - return atchFileSn3; - } - public void setAtchFileSn3(String atchFileSn3) { - this.atchFileSn3 = atchFileSn3; - } - - public String getMsgTypeName() { - return msgTypeName; - } - public void setMsgTypeName(String msgTypeName) { - this.msgTypeName = msgTypeName; - } - public int getSendCount() { - return sendCount; - } - public void setSendCount(int sendCount) { - this.sendCount = sendCount; - } - public double getSupplyPrice() { - return supplyPrice; - } - public void setSupplyPrice(double supplyPrice) { - this.supplyPrice = supplyPrice; - } - public double getVatPrice() { - return vatPrice; - } - public void setVatPrice(double vatPrice) { - this.vatPrice = vatPrice; - } - public double getTotalPrice() { - return totalPrice; - } - public void setTotalPrice(double totalPrice) { - this.totalPrice = totalPrice; - } - public String getDetailType() { - return detailType; - } - public void setDetailType(String detailType) { - this.detailType = detailType; - } - public String getMsgGroupSCnt() { - return msgGroupSCnt; - } - public void setMsgGroupSCnt(String msgGroupSCnt) { - this.msgGroupSCnt = msgGroupSCnt; - } - public String getMsgGroupFWCnt() { - return MsgGroupFWCnt; - } - public void setMsgGroupFWCnt(String msgGroupFWCnt) { - MsgGroupFWCnt = msgGroupFWCnt; - } - public String getTotSPrice() { - return totSPrice; - } - public void setTotSPrice(String totSPrice) { - this.totSPrice = totSPrice; - } - public String getTotFWPrice() { - return totFWPrice; - } - public void setTotFWPrice(String totFWPrice) { - this.totFWPrice = totFWPrice; - } - public String getMsgGroupSCntSum() { - return msgGroupSCntSum; - } - public void setMsgGroupSCntSum(String msgGroupSCntSum) { - this.msgGroupSCntSum = msgGroupSCntSum; - } - public String getMsgGroupFWCntSum() { - return MsgGroupFWCntSum; - } - public void setMsgGroupFWCntSum(String msgGroupFWCntSum) { - MsgGroupFWCntSum = msgGroupFWCntSum; - } - public String getTotSPriceSum() { - return totSPriceSum; - } - public void setTotSPriceSum(String totSPriceSum) { - this.totSPriceSum = totSPriceSum; - } - public String getTotFWPriceSum() { - return totFWPriceSum; - } - public void setTotFWPriceSum(String totFWPriceSum) { - this.totFWPriceSum = totFWPriceSum; - } - public String getSmiId() { - return smiId; - } - public void setSmiId(String smiId) { - this.smiId = smiId; - } - public List getDividDay() { - return dividDay; - } - public void setDividDay(List dividDay) { - this.dividDay = dividDay; - } - public String getUserNm() { - return userNm; - } - public void setUserNm(String userNm) { - this.userNm = userNm; - } - public String getMbtlnum() { - return mbtlnum; - } - public void setMbtlnum(String mbtlnum) { - this.mbtlnum = mbtlnum; - } - public String getEmailAdres() { - return emailAdres; - } - public void setEmailAdres(String emailAdres) { - this.emailAdres = emailAdres; - } - public String getAuthorCode() { - return authorCode; - } - public void setAuthorCode(String authorCode) { - this.authorCode = authorCode; - } - public String getResultLogUpdtPnttm() { - return resultLogUpdtPnttm; - } - public void setResultLogUpdtPnttm(String resultLogUpdtPnttm) { - this.resultLogUpdtPnttm = resultLogUpdtPnttm; - } - public String getRepAgent() { - return repAgent; - } - public void setRepAgent(String repAgent) { - this.repAgent = repAgent; - } - public String getEventYn() { - return eventYn; - } - public void setEventYn(String eventYn) { - this.eventYn = eventYn; - } - - public String getSpamKeyword() { - return spamKeyword; - } - public void setSpamKeyword(String spamKeyword) { - this.spamKeyword = spamKeyword; - } - public String getSpamMsgGroupId() { - return spamMsgGroupId; - } - public void setSpamMsgGroupId(String spamMsgGroupId) { - this.spamMsgGroupId = spamMsgGroupId; - } - public String getSpamStatus() { - return spamStatus; - } - public void setSpamStatus(String spamStatus) { - this.spamStatus = spamStatus; - } - - public String getSmishingYn() { - return smishingYn; - } - public void setSmishingYn(String smishingYn) { - this.smishingYn = smishingYn; - } - public int getTotalCallCnt() { - return totalCallCnt; - } - public void setTotalCallCnt(int totalCallCnt) { - this.totalCallCnt = totalCallCnt; - } - public String getDelayYn() { - return delayYn; - } - public void setDelayYn(String delayYn) { - this.delayYn = delayYn; - } - public String getDelayCompleteYn() { - return delayCompleteYn; - } - public void setDelayCompleteYn(String delayCompleteYn) { - this.delayCompleteYn = delayCompleteYn; - } - public String getVipYn() { - return vipYn; - } - public void setVipYn(String vipYn) { - this.vipYn = vipYn; - } - public String getResultCode() { - return resultCode; - } - public void setResultCode(String resultCode) { - this.resultCode = resultCode; - } - public String getResultCode2() { - return resultCode2; - } - public void setResultCode2(String resultCode2) { - this.resultCode2 = resultCode2; - } - public String getRegistPnttm() { - return registPnttm; - } - public void setRegistPnttm(String registPnttm) { - this.registPnttm = registPnttm; - } - public String getBizKakaoResendData() { - return bizKakaoResendData; - } - public void setBizKakaoResendData(String bizKakaoResendData) { - this.bizKakaoResendData = bizKakaoResendData; - } - public String getBizKakaoTitle() { - return bizKakaoTitle; - } - public void setBizKakaoTitle(String bizKakaoTitle) { - this.bizKakaoTitle = bizKakaoTitle; - } - public String getSmsTxtTrans() { - return smsTxtTrans; - } - public void setSmsTxtTrans(String smsTxtTrans) { - this.smsTxtTrans = smsTxtTrans; - } - public String getBizKakaoTitle01() { - return bizKakaoTitle01; - } - public void setBizKakaoTitle01(String bizKakaoTitle01) { - this.bizKakaoTitle01 = bizKakaoTitle01; - } - public String getBizKakaoTitle02() { - return bizKakaoTitle02; - } - public void setBizKakaoTitle02(String bizKakaoTitle02) { - this.bizKakaoTitle02 = bizKakaoTitle02; - } - public String getBizKakaoResendOrgnlTxt() { - return bizKakaoResendOrgnlTxt; - } - public void setBizKakaoResendOrgnlTxt(String bizKakaoResendOrgnlTxt) { - this.bizKakaoResendOrgnlTxt = bizKakaoResendOrgnlTxt; - } - public String getBizKakaoResendYn() { - return bizKakaoResendYn; - } - public void setBizKakaoResendYn(String bizKakaoResendYn) { - this.bizKakaoResendYn = bizKakaoResendYn; - } - public String getBizKakaoResendType() { - return bizKakaoResendType; - } - public void setBizKakaoResendType(String bizKakaoResendType) { - this.bizKakaoResendType = bizKakaoResendType; - } - public String getBizKakaoJsonFile() { - return bizKakaoJsonFile; - } - public void setBizKakaoJsonFile(String bizKakaoJsonFile) { - this.bizKakaoJsonFile = bizKakaoJsonFile; - } - public String getYellowId() { - return yellowId; - } - public void setYellowId(String yellowId) { - this.yellowId = yellowId; - } - public String getBizKakaoResendTypeCnt() { - return bizKakaoResendTypeCnt; - } - public void setBizKakaoResendTypeCnt(String bizKakaoResendTypeCnt) { - this.bizKakaoResendTypeCnt = bizKakaoResendTypeCnt; - } diff --git a/src/main/java/itn/let/kakao/admin/kakaoAt/web/MjonKakaoATController.java b/src/main/java/itn/let/kakao/admin/kakaoAt/web/MjonKakaoATController.java index b4513d7a..ef3278b4 100644 --- a/src/main/java/itn/let/kakao/admin/kakaoAt/web/MjonKakaoATController.java +++ b/src/main/java/itn/let/kakao/admin/kakaoAt/web/MjonKakaoATController.java @@ -796,9 +796,16 @@ public class MjonKakaoATController { String lastUpdtPnttm = resultChannelList.get(i).getLastUpdtPnttm(); kakaoProfileVO.setSenderKey(senderKey); kakaoProfileVO.setProfileId(profileId); - - KakaoReturnVO tmpProfileVO = kakaoApiProfile.kakaoApiProfileList(kakaoProfileVO); - + KakaoReturnVO tmpProfileVO = null; +// try { +// +// tmpProfileVO = kakaoApiProfile.kakaoApiProfileList(kakaoProfileVO); +// } catch (Exception e) { +// e.printStackTrace(); +// // TODO: handle exception +// } + + tmpProfileVO = kakaoApiProfile.kakaoApiProfileList(kakaoProfileVO); ChannelIDVO returnChannelVO = new ChannelIDVO(); returnChannelVO.setSenderKey(tmpProfileVO.getSenderKey()); diff --git a/src/main/java/itn/let/kakao/kakaoComm/BizKakaoPriceVO.java b/src/main/java/itn/let/kakao/kakaoComm/BizKakaoPriceVO.java new file mode 100644 index 00000000..3eebffc5 --- /dev/null +++ b/src/main/java/itn/let/kakao/kakaoComm/BizKakaoPriceVO.java @@ -0,0 +1,34 @@ +package itn.let.kakao.kakaoComm; + +import java.math.BigDecimal; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; + +/** + * @ BIZ_KAKAO_PRICE 테이블 관련 + */ +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@ToString +public class BizKakaoPriceVO { + + private Long bizKakaoPriceId; + + private String bizKakaoAtPrice; // 알림톡 단가 + private String bizKakaoFtPrice; // 친구톡 단가 + private String bizKakaoFtImgPrice; // 친구톡 이미지 단가 + private String bizKakaoFtWideImgPrice; // 친구톡 와이드 이미지 단가 + private String bizSmsPrice; // SMS 단가 + private String bizMmsPrice; // MMS 단가 + + private String msgGroupId; // 메시지 그룹 ID + + + // getters and setters 생략 +} \ No newline at end of file diff --git a/src/main/java/itn/let/kakao/kakaoComm/KakaoSendAdvcVO.java b/src/main/java/itn/let/kakao/kakaoComm/KakaoSendAdvcVO.java index 480cf85a..791fb0b9 100644 --- a/src/main/java/itn/let/kakao/kakaoComm/KakaoSendAdvcVO.java +++ b/src/main/java/itn/let/kakao/kakaoComm/KakaoSendAdvcVO.java @@ -45,7 +45,13 @@ public class KakaoSendAdvcVO implements Serializable { private String subMsgType; // 대체문자 타입 private String reqDate; // 예약일시 + private String msgKind; // 예약일시 + private String jsonStr; // jsonStr + + + + private String adFlag; //친구톡 광고성 정보 사용 유무(Y:사용 , N:미사용) // ===== // ===== @@ -53,6 +59,7 @@ public class KakaoSendAdvcVO implements Serializable { private String eachPrice; // sms 단가 private String smsPrice; // sms 단가 private String mmsPrice; // mms 단가 + private String picturePrice; // mms 단가 private String totPrice; // mms 단가 private String befCash; // mms 단가 private String befPoint; // mms 단가 @@ -62,6 +69,9 @@ public class KakaoSendAdvcVO implements Serializable { private String atDelayYn; // 카카오 알림톡 단가 private String bizKakaoResendOrgnlTxt; // 카카오 알림톡 단가 private String bizKakaoResendType; // 카카오 알림톡 단가 + private String filePath1; // 대체문자 이미지 + private String fileCnt; // 파일 카운트 + private String bizKakaoImageType; // 파일 카운트 @@ -83,7 +93,7 @@ public class KakaoSendAdvcVO implements Serializable { "\n , msgType=[" + msgType + "]" + "\n , templateContent=[" + templateContent + "]" + "\n , templateTitle=[" + templateTitle + "]" + - "\n , buttonList=[" + buttonList.toString() + "]" + + "\n , buttonList=[" + (buttonList != null ? buttonList.toString() : "") + "]" + "\n , subMsgSendYn=[" + subMsgSendYn + "]" + "\n , subMsgTxt=[" + subMsgTxt + "]" + "\n , subMsgType=[" + subMsgType + "]" + @@ -103,6 +113,8 @@ public class KakaoSendAdvcVO implements Serializable { "\n , atDelayYn=[" + atDelayYn + "]" + "\n , bizKakaoResendOrgnlTxt=[" + bizKakaoResendOrgnlTxt + "]" + "\n , bizKakaoResendType=[" + bizKakaoResendType + "]" + + "\n , filePath1=[" + filePath1 + "]" + + "\n , bizKakaoImageType=[" + bizKakaoImageType + "]" + "\n ]"; } diff --git a/src/main/java/itn/let/kakao/kakaoComm/KakaoSendUtil.java b/src/main/java/itn/let/kakao/kakaoComm/KakaoSendUtil.java index bbe859e2..1ba2fb3a 100644 --- a/src/main/java/itn/let/kakao/kakaoComm/KakaoSendUtil.java +++ b/src/main/java/itn/let/kakao/kakaoComm/KakaoSendUtil.java @@ -1,12 +1,17 @@ package itn.let.kakao.kakaoComm; +import java.io.UnsupportedEncodingException; +import java.math.BigDecimal; +import java.math.RoundingMode; import java.text.ParseException; 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 java.util.function.Function; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -19,12 +24,17 @@ import org.springframework.http.HttpStatus; import org.springframework.stereotype.Component; import egovframework.rte.fdl.idgnr.EgovIdGnrService; +import itn.com.cmm.MjonFTSendVO; +import itn.com.cmm.MjonMsgSendVO; +import itn.com.cmm.util.MsgSendUtils; import itn.com.cmm.util.StringUtil; import itn.let.kakao.kakaoComm.kakaoApi.KakaoApiJsonSave; import itn.let.kakao.kakaoComm.kakaoApi.KakaoApiTemplate; +import itn.let.kakao.user.kakaoAt.service.impl.KakaoAlimTalkDAO; import itn.let.mail.service.StatusResponse; import itn.let.mjo.mjocommon.MjonCommon; import itn.let.mjo.msg.service.MjonMsgVO; +import itn.let.mjo.msg.service.impl.MjonMsgDAO; import itn.let.mjo.msgdata.service.MjonMsgDataService; import itn.let.mjo.spammsg.web.ComGetSpamStringParser; import itn.let.module.base.PriceAndPoint; @@ -38,9 +48,15 @@ public class KakaoSendUtil { @Autowired KakaoApiJsonSave kakaoApiJsonSave; + + @Resource(name="kakaoAlimTalkDAO") + private KakaoAlimTalkDAO kakaoAlimTalkDAO; @Resource(name = "MjonMsgDataService") private MjonMsgDataService mjonMsgDataService; + + @Resource(name = "mjonMsgDAO") + private MjonMsgDAO mjonMsgDAO; @Autowired KakaoApiTemplate kakaoApiTemplate; @@ -51,6 +67,7 @@ public class KakaoSendUtil { @Autowired private MjonCommon mjonCommon; + // 클래스 수준에서 정적 Pattern 정의 (성능 최적화) private static final Pattern REPLACEMENT_PATTERN = Pattern.compile("#\\{[^}]+\\}"); @@ -138,7 +155,7 @@ public class KakaoSendUtil { log.info(""); /** @공통 기본값 */ - KakaoSendAdvcVO sendVO = createSendVO(kakaoVO); + KakaoSendAdvcVO sendVO = createATSendVO(kakaoVO); String msgId = idList.get(i); sendVO.setMsgId(msgId); @@ -273,19 +290,266 @@ public class KakaoSendUtil { return kakaoSendAdvcListVO; } - private Calendar setupBaseDate(KakaoVO kakaoVO, boolean isNotified) throws ParseException { - // 예약 시간 기본값 설정 - Date now = new Date(); - // ReqDate가 비어 있으면 현재 시간으로 설정, 그렇지 않으면 ReqDate로 설정 - // 화면에서 예약문자면 예약시간을 regDate로 설정한다. - Date baseDate; - if (StringUtils.isEmpty(kakaoVO.getReqDate())) { - kakaoVO.setReqDate(DATE_FORMATTER.format(now)); // ReqDate에 현재 시간 설정 - baseDate = now; - } else { - baseDate = DATE_FORMATTER.parse(kakaoVO.getReqDate()); // ReqDate를 baseDate로 설정 + /** + * @methodName : populateSendListsFT + * @author : 이호영 + * @date : 2025. 4. 18. + * @description : + * @return : List + * @param kakaoVO + * @param isNotified + * @param statusResponse + * @return + * @throws Exception + * + */ + public List populateSendListsFT(KakaoVO kakaoVO, boolean isNotified, StatusResponse statusResponse) throws Exception { + + //사용자 현재 보유 금액 불러오기(문자 발송 금액 차감 이전 금액) +// String befCash = kakaoVO.getBefCash(); + + log.info("kakaoVO.ftToString() :: [{}]", kakaoVO.ftToString()); + + List kakaoSendAdvcListVO = new ArrayList<>(); + Calendar calendar = setupBaseDate(kakaoVO, isNotified); + + + // 친구톡 내용 + String templateContent = kakaoVO.getTemplateContent(); + // 실패 대체 문자 + String subMsgTxt = kakaoVO.getSubMsgTxt(); + log.info(" + StringUtils.isNotEmpty(subMsgTxt) :: [{}]", StringUtils.isNotEmpty(subMsgTxt)); + if(StringUtils.isNotEmpty(subMsgTxt)) { + kakaoVO.setSubMsgSendYn("Y"); + + // 광고문자면 처리 - 광고 Y + if ("Y".equals(kakaoVO.getAdFlag())) { + subMsgTxt = "(광고)" + subMsgTxt + "\n" + "무료거부 0808800858"; + } + } + + + // 사용자 개인 단가 정보 불러오기 + MberManageVO mberManageVO = mjonMsgDataService.selectMberManageInfo(kakaoVO.getUserId()); + // 시스템 기본 단가 정보 불러오기 + JoinSettingVO sysJoinSetVO = mjonMsgDataService.selectJoinSettingInfo(); + + + // 치환 문구가 있는지 확인 + Boolean replaceYN = MsgSendUtils.getReplaceYN(templateContent); + Boolean replaceSubYN = MsgSendUtils.getReplaceYN(subMsgTxt); + + + /** @MSGID KEY값 */ + List idList = mjonCommon.getNextCustomMsgCId(kakaoVO.getMjonFTSendVOList().size()); + + + Map> placeholders = new HashMap<>(); + placeholders.put("[*이름*]", MjonFTSendVO::getName); + placeholders.put("[*1*]", MjonFTSendVO::getRep1); + placeholders.put("[*2*]", MjonFTSendVO::getRep2); + placeholders.put("[*3*]", MjonFTSendVO::getRep3); + placeholders.put("[*4*]", MjonFTSendVO::getRep4); + + String imageType = kakaoVO.getImageType(); + // 개인단가 + Float kakaoMemberFtPrice = + imageType == null ? mberManageVO.getKakaoFtPrice() : + "I".equals(imageType) ? mberManageVO.getKakaoFtImgPrice() : + "W".equals(imageType) ? mberManageVO.getKakaoFtWideImgPrice() : + mberManageVO.getKakaoFtPrice(); + + // 시스템단가 + Float kakaoSysJoinFtPrice = + imageType == null ? sysJoinSetVO.getKakaoFtPrice() : + "I".equals(imageType) ? sysJoinSetVO.getKakaoFtImgPrice() : + "W".equals(imageType) ? sysJoinSetVO.getKakaoFtWideImgPrice() : + sysJoinSetVO.getKakaoFtPrice(); + + Float kakaoFtPrice = + getValidPrice(kakaoMemberFtPrice, kakaoSysJoinFtPrice); + + // 대체문자가 있을경우 사용 + float shortPrice = getValidPrice(mberManageVO.getShortPrice(), sysJoinSetVO.getShortPrice()); + float longPrice = getValidPrice(mberManageVO.getLongPrice(), sysJoinSetVO.getLongPrice()); + float picturePrice = getValidPrice(mberManageVO.getPicturePrice(), sysJoinSetVO.getPicturePrice()); +// String shortPStr = Float.toString(shortPrice); +// String mmsPStr = Float.toString(longPrice); +// String imgPrice = Float.toString(picturePrice); + + + String imgFilePath = ""; + if(StringUtils.isNotEmpty(kakaoVO.getAtchFileId()) && + ("I".equals(imageType) || "W".equals(imageType))) { + + + imgFilePath = mjonMsgDAO.selectPhotoImgFileRealPath(kakaoVO.getAtchFileId()); + + } + + + + /** @jsonStr 필요유무 */ + boolean hasButtons = CollectionUtils.isNotEmpty(kakaoVO.getButtonVOList()); + String sharedJsonStr = null; + + + + List mjonFTSendVOList = kakaoVO.getMjonFTSendVOList(); + + for (int i = 0; i < mjonFTSendVOList.size(); i++) { + MjonFTSendVO mjonFTSendVO = mjonFTSendVOList.get(i); + + KakaoSendAdvcVO sendVO = createFTSendVO(kakaoVO, calendar); + // 공통 가격 설정 + sendVO.setSmsPrice(Float.toString(shortPrice)); + sendVO.setMmsPrice(Float.toString(longPrice)); + sendVO.setPicturePrice(Float.toString(picturePrice)); + + sendVO.setCallTo(mjonFTSendVO.getPhone()); + sendVO.setMsgId(idList.get(i)); + + String smsTxt = templateContent; + // 치환 문자면 + if(replaceYN) { + + // 각 치환 구문을 확인하고 치환할 값이 없으면 오류 반환 + for (Map.Entry> entry : placeholders.entrySet()) { + String placeholder = entry.getKey(); + String value = entry.getValue().apply(mjonFTSendVO); + if (smsTxt.contains(placeholder)) { + if (StringUtils.isEmpty(value)) { + statusResponseSet(statusResponse, HttpStatus.BAD_REQUEST, "치환 문구중 " + placeholder + " 데이터가 없습니다."); + return null; + } + smsTxt = smsTxt.replace(placeholder, value); + } + } + } + sendVO.setTemplateContent(smsTxt); + + + + String subMsgTxtTemp = null; + + if(StringUtils.isNotEmpty(subMsgTxt)) { + subMsgTxtTemp = subMsgTxt; + + if(replaceSubYN) { + // 각 치환 구문을 확인하고 치환할 값이 없으면 오류 반환 + for (Map.Entry> entry : placeholders.entrySet()) { + String placeholder = entry.getKey(); + String value = entry.getValue().apply(mjonFTSendVO); + if (subMsgTxtTemp.contains(placeholder)) { + if (StringUtils.isEmpty(value)) { + statusResponseSet(statusResponse, HttpStatus.BAD_REQUEST, "치환 문구중 " + placeholder + " 데이터가 없습니다."); + return null; + } + subMsgTxtTemp = subMsgTxtTemp.replace(placeholder, value); + } + } + } + } + sendVO.setSubMsgTxt(subMsgTxtTemp); + + + //대체문자가 있으면 + // Step 1-4: 실패 대체 문자 치환데이터 설정 + if(StringUtils.isNotEmpty(subMsgTxtTemp)) { // 대체문자가 있나? + + String sendType = "MMS"; + if(StringUtils.isEmpty(imgFilePath)) { + int smsTxtByte = mjonCommon.getSmsTxtBytes(subMsgTxtTemp); // 문자 byte 수 계산 + sendType = getMsgType(smsTxtByte); // 문자 타입(SHORT / MMS) 판별 + } + sendVO.setSubMsgType(sendType); // 실패 대체 문자 타입 설정 + + if ("INVALID".equals(sendType)) { + // INVALID 타입이면 길이 초과 에러 응답 후 리턴 + statusResponseSet(statusResponse, HttpStatus.BAD_REQUEST, "전송 문자 길이를 초과하였습니다."); + return kakaoSendAdvcListVO; + } + + float chosenPrice = 0f; + + if(StringUtils.isNotEmpty(imgFilePath)) { + chosenPrice = Math.max(picturePrice, kakaoFtPrice); + sendVO.setFilePath1(imgFilePath); + sendVO.setFileCnt("1"); + + }else if ("MMS".equals(sendType)) { + // MMS 타입일 경우: longPrice(장문 가격)와 카카오톡 단가 중 큰 값을 선택 + chosenPrice = Math.max(longPrice, kakaoFtPrice); + } else { + // SHORT 타입일 경우: shortPrice(단문 가격)와 카카오톡 단가 중 큰 값을 선택 + chosenPrice = Math.max(shortPrice, kakaoFtPrice); + } + sendVO.setEachPrice(Float.toString(chosenPrice)); // 선택된 단가 설정 + + + }else { + // 대체문자가 없으면 카카오톡 단가 그대로 사용 + sendVO.setEachPrice( Float.toString(kakaoFtPrice) ); + } + + + // 타이틀과 버튼이 있고 + if(hasButtons || StringUtils.isNotEmpty(kakaoVO.getTemplateImageUrl())) { + // + if (StringUtils.isEmpty(sharedJsonStr)) { + // 치환 데이터가 없고 아직 생성되지 않았으면 한 번만 생성 + sharedJsonStr = kakaoApiJsonSave.kakaoApiFTJsonSave_advc(kakaoVO); + sendVO.setJsonStr(sharedJsonStr); + } + sendVO.setBizJsonName(idList.get(0)); + + } + + kakaoSendAdvcListVO.add(sendVO); + log.info(" sendVO.toString() :: [{}]",sendVO.toString()); + } + + + return kakaoSendAdvcListVO; + } + + public static String getMsgTypeWithByteValidation(MjonFTSendVO sendVO, String p_smsTxt) throws UnsupportedEncodingException { + + + // // 내문자저장함에 저장 후 문자를 발송하는 경우 문자 타입이 숫자가 아닌 문자로 넘어와서 변경 처리함 + // if ("P".equals(msgType) || "L".equals(msgType)) { + // msgType = "6"; + // } else if ("S".equals(msgType)) { + // msgType = "4"; + // } + + int smsTxtByte = MjonCommon.getSmsTxtBytes(p_smsTxt); + String msgType = SHORT_MSG_TYPE; + + // 1. 2000 Byte 초과는 에러 처리 + if (smsTxtByte > 2000) { + return "INVALID"; + } + + // 2. 첨부파일 여부 확인 (첨부파일이 있으면 장문으로 설정) + if (StringUtils.isNotEmpty(sendVO.getFilePath1())) { + msgType = LONG_MSG_TYPE; + } + // 3. 문자 길이에 따라 메시지 타입 설정 (90 Byte 초과는 장문) + else if (smsTxtByte > 90) { + msgType = LONG_MSG_TYPE; + } + return msgType; + } + + + private Calendar setupBaseDate(KakaoVO kakaoVO, boolean isNotified) throws ParseException { + + // baseDate 추출 + Date baseDate = resolveBaseDate(kakaoVO); + // 시간 성정 Calendar calendar = Calendar.getInstance(); calendar.setTime(baseDate); // calendar에 baseDate 설정 @@ -299,6 +563,31 @@ public class KakaoSendUtil { return calendar; } + public Date resolveBaseDate(KakaoVO kakaoVO) throws ParseException { + Date now = new Date(); + + if (StringUtils.isEmpty(kakaoVO.getReqDate())) { + kakaoVO.setReqDate(DATE_FORMATTER.format(now)); + return now; + } + return DATE_FORMATTER.parse(kakaoVO.getReqDate()); + } + + // 2. 친구톡 발송 제한 시간인지 확인 + public boolean isRestrictedFriendTalkTime(Date baseDate) { + Calendar cal = Calendar.getInstance(); + cal.setTime(baseDate); + + int hour = cal.get(Calendar.HOUR_OF_DAY); + int minute = cal.get(Calendar.MINUTE); + + // 20:50 이후 ~ 익일 08:00 이전은 제한 + if ((hour == 20 && minute >= 50) || hour > 20 || hour < 8) { + return true; + } + return false; + } + /** * @methodName : createSendVO * @author : 이호영 @@ -309,14 +598,45 @@ public class KakaoSendUtil { * @return * */ - private KakaoSendAdvcVO createSendVO(KakaoVO kakaoVO) { + private KakaoSendAdvcVO createATSendVO(KakaoVO kakaoVO) { KakaoSendAdvcVO sendVO = new KakaoSendAdvcVO(); sendVO.setMsgType("8"); + sendVO.setAgentCode("04"); sendVO.setSenderKey(kakaoVO.getSenderKey()); sendVO.setTemplateCode(kakaoVO.getTemplateCode()); sendVO.setUserId(kakaoVO.getUserId()); sendVO.setCallFrom(kakaoVO.getCallFrom()); + return sendVO; + } + + + /** + * @methodName : createFTSendVO + * @author : 이호영 + * @date : 2025. 4. 23. + * @description : + * @return : KakaoSendAdvcVO + * @param kakaoVO + * @return + * + */ + private KakaoSendAdvcVO createFTSendVO(KakaoVO kakaoVO, Calendar calendar) { + KakaoSendAdvcVO sendVO = new KakaoSendAdvcVO(); + + sendVO.setMsgType("9"); // 알림톡 8 친구톡 9 sendVO.setAgentCode("04"); + // 발송시간 : 친구톡은 분할 발송이 없어 처음 vo 생성 시 입력 + sendVO.setReqDate(DATE_FORMATTER.format(calendar.getTime())); + + sendVO.setSenderKey(kakaoVO.getSenderKey()); + sendVO.setTemplateCode(kakaoVO.getTemplateCode()); + sendVO.setUserId(kakaoVO.getUserId()); + sendVO.setCallFrom(kakaoVO.getCallFrom()); + sendVO.setSubMsgSendYn(kakaoVO.getSubMsgSendYn()); + + sendVO.setAdFlag(kakaoVO.getAdFlag()); + + return sendVO; } @@ -378,7 +698,7 @@ public class KakaoSendUtil { } - public Float getValidPrice(Float personalPrice, Float defaultPrice) { + public static Float getValidPrice(Float personalPrice, Float defaultPrice) { return (personalPrice != null && personalPrice > 0) ? personalPrice : defaultPrice; } @@ -692,6 +1012,10 @@ public class KakaoSendUtil { //카카오 친구톡 개인 단가가 없는 경우 시스템 단가로 if(mberManageVO.getKakaoFtPrice() == 0.0f) mberManageVO.setKakaoFtPrice(sysJoinSetVO.getKakaoFtPrice()); + if(mberManageVO.getKakaoFtImgPrice() == 0.0f) + mberManageVO.setKakaoFtImgPrice(sysJoinSetVO.getKakaoFtImgPrice()); + if(mberManageVO.getKakaoFtWideImgPrice() == 0.0f) + mberManageVO.setKakaoFtWideImgPrice(sysJoinSetVO.getKakaoFtWideImgPrice()); // SMS 인경우 @@ -703,7 +1027,9 @@ public class KakaoSendUtil { // 사용자 개인 단가가 없으면 시스템 단가로 if(mberManageVO.getLongPrice() == 0.0f) mberManageVO.setLongPrice(sysJoinSetVO.getLongPrice()); - + + if(mberManageVO.getPicturePrice() == 0.0f) + mberManageVO.setPicturePrice(sysJoinSetVO.getPicturePrice()); return mberManageVO; } @@ -1202,4 +1528,175 @@ public class KakaoSendUtil { statusResponse.setMessage(msg); } + + + // 보유 금액이 충분한지 확인하는 메서드 + public 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); + log.info(" + userMoney :: [{}]", userMoney); + log.info(" + befCash :: [{}]", befCash); + + + // 총 메시지 금액 계산 (HALF_EVEN 적용) + BigDecimal totalEachPrice = kakaoSendAdvcListVO.stream() + .map(msg -> new BigDecimal(String.valueOf(msg.getEachPrice()))) // 변환 오류 방지 + .reduce(BigDecimal.ZERO, BigDecimal::add) + .setScale(2, RoundingMode.HALF_EVEN); // 일관성 유지 + + log.info(" + totalEachPrice :: [{}]", totalEachPrice); + // 비교 수행 + return befCash.compareTo(totalEachPrice) >= 0; + } + + + + /** + * @methodName : insertKakaoAtDataJsonInfo_advc + * @author : 이호영 + * @date : 2025. 4. 24. + * @description : INSERT INTO BIZ_ATTACHMENTS + * @return : void + * @param kakaoSendAdvcListVO + * + */ + public void insertKakaoAtDataJsonInfo_advc(List kakaoSendAdvcListVO) { + + List jsonInfoData = new ArrayList<>(kakaoSendAdvcListVO); + jsonInfoData.removeIf(t -> StringUtils.isBlank(t.getJsonStr())); + log.info(" + jsonInfoData Insert :: [{}]", jsonInfoData.size()); + if(jsonInfoData.size() > 0) { + kakaoAlimTalkDAO.insertKakaoAtDataJsonInfo_advc(jsonInfoData); + } + + } + + + + /** + * @methodName : insertKakaoData_advc + * @author : 이호영 + * @date : 2025. 3. 20. + * @description : 카카오 batch 발송 => mj_msg_data + * @return : int + * @param kakaoSendAdvcVOList + * @param parentLoopCount + * @param isJsonNotEmpty + * @param isJsonNameAllSame + * @return + * + */ + public int insertKakaoData_advc(List kakaoSendAdvcVOList) { + + + // 시작 시간 측정 + long totalStartTime = System.currentTimeMillis(); + + int totalSize = kakaoSendAdvcVOList.size(); // 총 데이터 개수 + // Batch 크기 설정 (고정값) +// int batchSize = 10000; 465 + int batchSize = 50000; // 9분 18초 + + log.info("총 데이터 개수 :: [{}] ", totalSize); + log.info("설정된 Batch 크기 :: [{}] ", batchSize); + + // 총 insert 카운트 + int instCnt = 0; + int batchCount = 0; + + // 각 배치별 실행 시간 기록 + List batchExecutionTimes = new ArrayList<>(); + + + // 첫 번째 배치에서만 삽입했는지 추적하는 플래그 + for (int i = 0; i < totalSize; i += batchSize) { + // Batch 시작 시간 측정 + long batchStartTime = System.currentTimeMillis(); + + // Batch 리스트 생성 + List batchList = kakaoSendAdvcVOList.subList(i, Math.min(i + batchSize, totalSize)); + System.out.println("Batch 시작 인덱스: " + i); + + // mj_msg_data 테이블 insert + int insertedCount = kakaoAlimTalkDAO.insertKakaoAtDataInfo_advc(batchList); + + /** @kakaoSendUtil.populateSendLists + * 하단에서 + * getJsonStr 데이터 처리 후 활용 + * */ + instCnt += insertedCount; + + // Batch 종료 시간 측정 및 실행 시간 계산 + long batchEndTime = System.currentTimeMillis(); + double batchExecutionTimeInSeconds = (batchEndTime - batchStartTime) / 1000.0; + + // 실행 시간 기록 + batchExecutionTimes.add(batchExecutionTimeInSeconds); + batchCount++; + } + + // 종료 시간 측정 + long totalEndTime = System.currentTimeMillis(); + + // 총 실행 시간 계산 (밀리초 -> 초로 변환) + double totalExecutionTimeInSeconds = (totalEndTime - totalStartTime) / 1000.0; + + // 실행 시간 출력 + log.info("총 배치 실행 횟수 :: [{}] ", batchCount); + log.info("batchSize :: [{}] ", batchSize); + log.info("총 실행 시간 :: [{}] ", totalExecutionTimeInSeconds + "초"); + log.info("총 삽입 건수 :: [{}] ", instCnt); + + // 각 배치별 실행 시간 출력 + for (int k = 0; k < batchExecutionTimes.size(); k++) { + System.out.println("배치 " + (k + 1) + " 실행 시간 :: " + batchExecutionTimes.get(k) + "초"); + } + + return instCnt; + + } + + + + + + + public void insertKakaoGroupDataTb_advc(int instCnt, KakaoVO kakaoVO, KakaoSendAdvcVO sendVO) throws Exception { + // TODO Auto-generated method stub + +// log.info(" + insertKakaoGroupDataTb_advc kakaoVO :: \n[{}]", kakaoVO.toString());; +// log.info(" + insertKakaoGroupDataTb_advc kakaoSendAdvcVOList :: \n[{}]", sendVO.toString()); + + + + sendVO.setTemplateContent(kakaoVO.getTemplateContent()); + sendVO.setMsgGroupCnt(Integer.toString(instCnt)); + sendVO.setReserveYn(kakaoVO.getReserveYn()); + sendVO.setBefCash(priceAndPoint.getBefCash(sendVO.getUserId())); + sendVO.setBefPoint(priceAndPoint.getBefPoint(sendVO.getUserId())); + sendVO.setAdFlag(kakaoVO.getAdFlag()); + + Float eachPrice = Float.parseFloat(sendVO.getEachPrice()); + + Float totPrice = eachPrice * instCnt; + sendVO.setTotPrice(String.format("%.1f", totPrice)); + + sendVO.setAtDelayYn(kakaoVO.getAtSmishingYn()); + sendVO.setBizKakaoResendOrgnlTxt(kakaoVO.getSubMsgTxt()); + sendVO.setBizKakaoResendType(sendVO.getSubMsgType()); + sendVO.setBizKakaoImageType(kakaoVO.getImageType()); + + kakaoAlimTalkDAO.insertKakaoGroupDataTb_advc(sendVO); + + } + + + } diff --git a/src/main/java/itn/let/kakao/kakaoComm/KakaoVO.java b/src/main/java/itn/let/kakao/kakaoComm/KakaoVO.java index 527f146f..f6802249 100644 --- a/src/main/java/itn/let/kakao/kakaoComm/KakaoVO.java +++ b/src/main/java/itn/let/kakao/kakaoComm/KakaoVO.java @@ -4,6 +4,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; +import itn.com.cmm.MjonFTSendVO; import itn.let.mjo.msg.service.MjonMsgVO; import lombok.Getter; import lombok.Setter; @@ -259,9 +260,14 @@ public class KakaoVO extends MjonMsgVO{ private String msgResendAllGroupId; private String msgResendAllTmpKey; private String msgResendAllYellowId; + + private String bizKakaoResendType; + private String fileCnt; private List> varListMap; + private List mjonFTSendVOList = new ArrayList<>(); + @Override public String toString() { String varListMapString = "["; @@ -286,6 +292,18 @@ public class KakaoVO extends MjonMsgVO{ } varListMapString += "]"; + + StringBuilder mjonFTListSb = new StringBuilder("["); + if (mjonFTSendVOList != null && !mjonFTSendVOList.isEmpty()) { + String prefix = ""; + for (MjonFTSendVO vo : mjonFTSendVOList) { + mjonFTListSb.append(prefix).append(vo == null ? "null" : vo.toString()); + prefix = ", "; + } + } + mjonFTListSb.append("]"); + + return "KakaoSendAdvcVO[" + "\n senderKey=[" + senderKey + "]" + "\n , subMsgTxtReplYn=[" + subMsgTxtReplYn + "]" + @@ -312,8 +330,61 @@ public class KakaoVO extends MjonMsgVO{ "\n , varListMap=[" + varListMapString + "]" + "\n , befCash=[" + getBefCash() + "]" + "\n , befPoint=[" + getBefPoint() + "]" + + "\n , mjonFTSendVOList=" + mjonFTListSb.toString() + "\n ]"; } + public String ftToString() { + StringBuilder sb = new StringBuilder("KakaoFTSendVO["); + sb.append("\n senderKey=[").append(senderKey).append("]"); + sb.append("\n , imageFileName=[").append(imageFileName).append("]"); + sb.append("\n , imageType=[").append(imageType).append("]"); + sb.append("\n , imgTitle=[").append(imgTitle).append("]"); + sb.append("\n , imgLink=[").append(imgLink).append("]"); + sb.append("\n , templateContent=[").append(templateContent).append("]"); + sb.append("\n , templateImageUrl=[").append(templateImageUrl).append("]"); + sb.append("\n , smsTxtArea=[").append(getSubMsgTxt()).append("]"); + sb.append("\n , subMsgSendYn=[").append(subMsgSendYn).append("]"); + sb.append("\n , subMsgTxtReplYn=[").append(subMsgTxtReplYn).append("]"); + sb.append("\n , subMsgType=[").append(subMsgType).append("]"); + sb.append("\n , subMsgTxt=[").append(subMsgTxt).append("]"); + sb.append("\n , reserveYn=[").append(getReserveYn()).append("]"); + sb.append("\n , menuTopTab=[").append(menuTopTab).append("]"); + sb.append("\n , bizJsonYn=[").append(bizJsonYn).append("]"); + sb.append("\n , senderKey=[").append(senderKey).append("]"); + sb.append("\n , callFrom=[").append(getCallFrom()).append("]"); + sb.append("\n , kakaoFtPrice=[").append(getEachPrice()).append("]"); + sb.append("\n , reqDate=[").append(getReqDate()).append("]"); + sb.append("\n , spamStatus=[").append(getSpamStatus()).append("]"); + sb.append("\n , txtReplYn=[").append(getTxtReplYn()).append("]"); + sb.append("\n , atSmishingYn=[").append(getAtSmishingYn()).append("]"); +// sb.append("\n , tmpBtnSelect=[").append(getTmpBtnSelect()).append("]"); + StringBuilder btnListSb = new StringBuilder("["); + if (buttonVOList != null && !buttonVOList.isEmpty()) { + String prefix = ""; + for (KakaoButtonVO btn : buttonVOList) { + btnListSb.append(prefix).append(btn == null ? "null" : btn.toString()); + prefix = ", "; + } + } + btnListSb.append("]"); + sb.append("\n , buttonVOList=").append(btnListSb); + + + // mjonFTSendVOList 내용 + StringBuilder ftList = new StringBuilder("["); + if (mjonFTSendVOList != null && !mjonFTSendVOList.isEmpty()) { + String prefix = ""; + for (MjonFTSendVO vo : mjonFTSendVOList) { + ftList.append(prefix).append(vo == null ? "null" : vo.toString()); + prefix = ", "; + } + } + ftList.append("]"); + sb.append("\n , mjonFTSendVOList=").append(ftList); + + sb.append("\n]"); + return sb.toString(); + } } diff --git a/src/main/java/itn/let/kakao/kakaoComm/kakaoApi/KakaoApiImageUpload.java b/src/main/java/itn/let/kakao/kakaoComm/kakaoApi/KakaoApiImageUpload.java index 6b090627..13394aeb 100644 --- a/src/main/java/itn/let/kakao/kakaoComm/kakaoApi/KakaoApiImageUpload.java +++ b/src/main/java/itn/let/kakao/kakaoComm/kakaoApi/KakaoApiImageUpload.java @@ -5,7 +5,10 @@ import java.awt.image.BufferedImage; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; +import java.text.SimpleDateFormat; +import java.time.LocalDateTime; import java.util.ArrayList; +import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.ListIterator; @@ -15,6 +18,8 @@ import javax.annotation.Resource; import javax.imageio.ImageIO; import javax.swing.ImageIcon; +import org.apache.commons.io.FilenameUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; @@ -30,16 +35,21 @@ import org.apache.http.util.EntityUtils; import org.json.simple.JSONObject; import org.json.simple.parser.JSONParser; import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.HttpStatus; import org.springframework.stereotype.Component; import org.springframework.web.multipart.MultipartFile; import egovframework.rte.fdl.property.EgovPropertyService; +import itn.com.cmm.service.EgovFileMngService; import itn.com.cmm.service.EgovFileMngUtil; import itn.com.cmm.service.FileVO; import itn.let.kakao.kakaoComm.KakaoReturnVO; import itn.let.kakao.kakaoComm.KakaoVO; +import itn.let.mail.service.StatusResponse; import itn.let.utl.fcc.service.EgovStringUtil; +import lombok.extern.slf4j.Slf4j; +@Slf4j @Component("kakaoApiImageUpload") public class KakaoApiImageUpload { @@ -57,7 +67,17 @@ public class KakaoApiImageUpload { @Resource(name = "propertiesService") protected EgovPropertyService propertyService; - + + /** 첨부파일 저장경로 */ + @Value("#{globalSettings['Globals.file.saveDir']}") + private String fileSaveDir; + + @Resource(name="EgovFileMngUtil") + private EgovFileMngUtil fileUtil; + + + @Resource(name="EgovFileMngService") + private EgovFileMngService fileMngService; /** * @Method Name : kakaoApiImageUpload @@ -219,13 +239,13 @@ public class KakaoApiImageUpload { .addTextBody("bizId", mjonBizId) .addTextBody("apiKey", mjonBizKakaoApiKey) .addTextBody("imageType", kakaoVO.getImageType()) - .addTextBody("title", kakaoVO.getImgTitle()) - .addTextBody("link", kakaoVO.getImgLink()) + .addTextBody("title", "test") + .addTextBody("link", "https://maaa.com") .addTextBody("senderKey", kakaoVO.getSenderKey()) .addBinaryBody("image", new File(filePath),ContentType.MULTIPART_FORM_DATA,fullFileName) .build(); - httpPost.setEntity(httpEntity); + httpPost.setEntity(httpEntity); CloseableHttpResponse response = httpClient.execute(httpPost); @@ -245,6 +265,7 @@ public class KakaoApiImageUpload { String msg = object.get("message").toString(); String imgUrl = ""; + log.info(" : code :: [{}]", code); if(code.equals("200")) { imgUrl = object.get("image").toString(); } @@ -273,6 +294,174 @@ public class KakaoApiImageUpload { } + + + /** + * @methodName : kakaoApiImageUpload_advc + * @author : 이호영 + * @date : 2025. 6. 4. + * @description : kakaoApiImageUpload 수정 + * @return : StatusResponse + * @param kakaoVO + * @param files + * @param i + * @return + * @throws Exception + * + */ + public StatusResponse kakaoApiImageUpload_advc(KakaoVO kakaoVO, Map files, int fileKeyParam) throws Exception { +// try { + String storePathString = propertyService.getString("Globals.fileStorePath"); + File saveFolder = new File(storePathString); + if (!saveFolder.exists()) saveFolder.mkdirs(); + +// for (MultipartFile file : files.values()) { + MultipartFile file = files.values().stream().findFirst().orElse(null); + if (file == null || file.isEmpty()) { + return new StatusResponse(HttpStatus.BAD_REQUEST, "유효한 이미지 파일이 없습니다.", LocalDateTime.now()); + } + + + String originalName = file.getOriginalFilename(); + if (originalName == null || originalName.isEmpty()) { + return new StatusResponse(HttpStatus.BAD_REQUEST, "파일명이 비어 있습니다.", LocalDateTime.now()); + } + + String ext = FilenameUtils.getExtension(originalName).toLowerCase(); + if (!ext.matches("jpg|jpeg|png")) { + return new StatusResponse(HttpStatus.BAD_REQUEST, "지원하지 않는 이미지 형식입니다."); + } + + long size = file.getSize(); + if (size > 5 * 1024 * 1024) { + return new StatusResponse(HttpStatus.BAD_REQUEST, "이미지 용량은 5MB 이내여야 합니다."); + } + + BufferedImage image = ImageIO.read(file.getInputStream()); + if (image == null) { + return new StatusResponse(HttpStatus.BAD_REQUEST, "이미지를 읽을 수 없습니다."); + } + + int width = image.getWidth(); + int height = image.getHeight(); + String type = kakaoVO.getImageType(); + + if ("W".equals(type)) { + if (width != 800 || height != 600) { + return new StatusResponse(HttpStatus.BAD_REQUEST, "와이드 이미지는 800x600 사이즈만 허용됩니다."); + } + } else { + float ratio = width / (float) height; +// log.info("width : [{}], ",width); +// log.info("height : [{}], ",height); +// log.info("ratio : [{}], ",ratio); + if (width < 500 || ratio < 0.75 || ratio > 2.0) { + return new StatusResponse(HttpStatus.BAD_REQUEST, "일반 이미지는 가로 500px 이상, 비율 2:1 이상 또는 3:4 이하만 허용됩니다."); + } + } + + String atchFileId = this.saveImgFile(files); + + + + + + String newName = EgovStringUtil.getTimeStamp() + fileKeyParam; + String filePath = storePathString + File.separator + newName + "." + ext; + file.transferTo(new File(filePath)); + + // 카카오 API 호출 + CloseableHttpClient httpClient = HttpClients.createDefault(); + String apiUrl = mjonBizUrl + "/v3/kakao/image/upload"; + + HttpPost httpPost = new HttpPost(apiUrl); + /*HttpEntity httpEntity = MultipartEntityBuilder.create() + .addTextBody("bizId", mjonBizId) + .addTextBody("apiKey", mjonBizKakaoApiKey) + .addTextBody("imageType", kakaoVO.getImageType()) + .addTextBody("title", kakaoVO.getImgTitle()) + .addTextBody("link", kakaoVO.getImgLink()) + .addTextBody("senderKey", kakaoVO.getSenderKey()) + .addBinaryBody("image", new File(filePath), ContentType.MULTIPART_FORM_DATA, newName + "." + ext) + .build(); + */ + + HttpEntity httpEntity = MultipartEntityBuilder.create() + .addTextBody("bizId", mjonBizId) + .addTextBody("apiKey", mjonBizKakaoApiKey) + .addTextBody("imageType", kakaoVO.getImageType()) + .addTextBody("title", originalName) + .addTextBody("link", StringUtils.isEmpty(kakaoVO.getImgLink()) ? "https://" : kakaoVO.getImgLink()) + .addTextBody("senderKey", kakaoVO.getSenderKey()) + .addBinaryBody("image", new File(filePath), ContentType.MULTIPART_FORM_DATA, newName + "." + ext) + .build(); + + httpPost.setEntity(httpEntity); + + + + CloseableHttpResponse response = httpClient.execute(httpPost); + int statusCode = response.getStatusLine().getStatusCode(); + + if (statusCode == 200) { + String result = EntityUtils.toString(response.getEntity(), "UTF-8"); + JSONParser parser = new JSONParser(); + JSONObject object = (JSONObject) parser.parse(result); + + String code = object.get("code").toString(); + if ("200".equals(code)) { + Map returnMap = new HashMap<>(); + returnMap.put("imgUrl", object.get("image").toString()); + returnMap.put("fileName", originalName); + returnMap.put("atchFileId", atchFileId); + + return new StatusResponse(HttpStatus.OK, "이미지 등록이 완료 되었습니다.", returnMap); + } else { + return new StatusResponse(HttpStatus.BAD_REQUEST, object.get("message").toString(), LocalDateTime.now()); + } + } else { + return new StatusResponse(HttpStatus.BAD_REQUEST, "카카오 API 요청 실패", LocalDateTime.now()); + } +// } +// } catch (Exception e) { +// log.error("kakaoApiImageUpload_advc API Error", e); +// return new StatusResponse(HttpStatus.BAD_REQUEST, "친구톡 이미지 등록에 실패했습니다.", LocalDateTime.now()); +// } + } + + + + private String saveImgFile(Map files) throws Exception { + + + + String atchFileId = ""; + String isThumbFile = ""; + String imagePath = ""; + String KeyStr = "CANVASIMG_"; + + + Date now = new Date(); + SimpleDateFormat formatDate = new SimpleDateFormat("yyyyMMdd"); + String fdlDate = formatDate.format(now); + + + imagePath = fileSaveDir+"/file/MMS/" + fdlDate; + + + + if (!files.isEmpty()) { + List result = fileUtil.parseImageFileInf(files, KeyStr, 0, atchFileId, imagePath, isThumbFile); + atchFileId = fileMngService.insertFileInfs(result); + } + + + return atchFileId; + } + + + + /** * @Method Name : kakaoApiTemplateImageUpload * @작성일 : 2023. 2. 16. @@ -488,17 +677,20 @@ public class KakaoApiImageUpload { jsonObject.put("apiKey", mjonBizKakaoApiKey); jsonObject.put("imageUrl", kakaoVO.getTemplateImageUrl()); + log.info("kakaoVO.getTemplateImageUrl() :: [{}]", kakaoVO.getTemplateImageUrl()); + HttpClient httpClient = HttpClientBuilder.create().build(); HttpPost httpPost = new HttpPost(sendUrl); httpPost.setEntity(new StringEntity(jsonObject.toString(), "UTF-8")); httpPost.addHeader("Content-type", "application/json"); - httpPost.addHeader("Accept", "application/json"); + httpPost.addHeader("Accept", "application/json"); HttpResponse response = httpClient.execute(httpPost); String result = ""; String statusCode = Integer.toString(response.getStatusLine().getStatusCode()); + log.info(" + statusCode :: [{}]", statusCode); if(statusCode.equals("200")) { result = EntityUtils.toString(response.getEntity()); @@ -528,5 +720,7 @@ public class KakaoApiImageUpload { return kakaoReturnVO; } + + } 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 bbdd8f81..64dfd984 100644 --- a/src/main/java/itn/let/kakao/kakaoComm/kakaoApi/KakaoApiJsonSave.java +++ b/src/main/java/itn/let/kakao/kakaoComm/kakaoApi/KakaoApiJsonSave.java @@ -10,12 +10,18 @@ import java.util.Date; import java.util.List; import java.util.Map; +import org.apache.commons.lang3.StringUtils; import org.json.simple.JSONArray; import org.json.simple.JSONObject; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.node.ArrayNode; +import com.fasterxml.jackson.databind.node.ObjectNode; + import itn.com.cmm.util.StringUtil; import itn.let.kakao.kakaoComm.KakaoButtonVO; import itn.let.kakao.kakaoComm.KakaoReturnVO; @@ -208,6 +214,139 @@ public class KakaoApiJsonSave { return jsonFileName; } + /* + * 친구톡 발송시 이미지, 버튼 추가에 따른 Json 파일 생성 + * 2025.04.18 + * 우영두 + * 파일은 하나만 생성해서 동일하게 사용함. + * + * */ + public String kakaoApiFTJsonSave_advc(KakaoVO kakaoVO) throws JsonProcessingException { + // json파일 저장 + + + ObjectMapper mapper = new ObjectMapper(); + ObjectNode jo = mapper.createObjectNode(); + + + + // 버튼 + if (kakaoVO.getButtonVOList() != null && !kakaoVO.getButtonVOList().isEmpty()) { + ArrayNode buttonList = mapper.createArrayNode(); + + for (KakaoButtonVO buttonInfoVO : kakaoVO.getButtonVOList()) { + ObjectNode button = mapper.createObjectNode(); + button.put("name", buttonInfoVO.getName()); + button.put("type", buttonInfoVO.getLinkType()); + + switch (buttonInfoVO.getLinkType()) { + case "WL": + button.put("url_mobile", buttonInfoVO.getLinkMo()); + button.put("url_pc", buttonInfoVO.getLinkPc()); + break; + case "AL": + button.put("scheme_ios", buttonInfoVO.getLinkIos()); + button.put("scheme_android", buttonInfoVO.getLinkAnd()); + break; + case "BC": + // 상담톡 + break; + case "BT": + // 봇 전환 + break; + } + buttonList.add(button); + } + jo.set("button", buttonList); + } + + + // 이미지 + String imageType = kakaoVO.getImageType(); + if (StringUtils.isNotEmpty(imageType)) { + ObjectNode image = mapper.createObjectNode(); + image.put("img_url", kakaoVO.getTemplateImageUrl()); + image.put("img_link", StringUtils.isNotEmpty(kakaoVO.getImgLink()) ? kakaoVO.getImgLink() : kakaoVO.getTemplateImageUrl()); + jo.set("image", image); + + // wide 여부 + if ("W".equals(imageType)) { + ObjectNode extra = mapper.createObjectNode(); + extra.put("wide", "Y"); + jo.set("extra", extra); + } + + } + + + // 문자열로 변환 (이스케이프 없음) + return mapper.writeValueAsString(jo); + + + + /* + + + // 버튼리스트 JSON 생성 + JSONArray buttonList = new JSONArray(); + for(KakaoButtonVO buttonInfoVO : kakaoVO.getButtonVOList()) { + 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 templateImageInfo = new JSONObject(); + JSONObject templateImageExtInfo = new JSONObject(); + String imageType = kakaoVO.getImageType(); + + if(StringUtils.isNotEmpty(imageType)) { + templateImageInfo.put("img_url", kakaoVO.getTemplateImageUrl()); + templateImageInfo.put("img_link", StringUtils.isNotEmpty(kakaoVO.getImgLink()) ? kakaoVO.getImgLink() : kakaoVO.getTemplateImageUrl() ); + } + + // wide 여부 + if ("W".equals(imageType)) { + ObjectNode extra = mapper.createObjectNode(); + extra.put("wide", "Y"); + jo.set("extra", extra); + } + + + JSONObject jo = new JSONObject(); + + if(buttonList.size() != 0) { + jo.put("button", buttonList); + } + + if(templateImageInfo.size() != 0) { + jo.put("image", templateImageInfo); + } + + if(templateImageExtInfo.size() != 0) { + jo.put("extra", templateImageExtInfo); + } + + // 입력 json 데이터를 파일로 변경 + String jsonStr = jo.toString(); + + return jsonStr;*/ + } + /* * 친구톡 발송시 이미지, 버튼 추가에 따른 Json 파일 생성 * 2024.01.17 @@ -298,7 +437,7 @@ public class KakaoApiJsonSave { // 입력 json 데이터를 파일로 변경 String jsonStr = jo.toString(); System.out.println("jsonFileName : "+jsonFileName); - + File outPut = new File(jsonFileName); outPut.createNewFile(); diff --git a/src/main/java/itn/let/kakao/kakaoComm/kakaoApi/KakaoApiProfile.java b/src/main/java/itn/let/kakao/kakaoComm/kakaoApi/KakaoApiProfile.java index 76583507..01d434b7 100644 --- a/src/main/java/itn/let/kakao/kakaoComm/kakaoApi/KakaoApiProfile.java +++ b/src/main/java/itn/let/kakao/kakaoComm/kakaoApi/KakaoApiProfile.java @@ -230,7 +230,8 @@ public class KakaoApiProfile { if(code.equals("200")) { JSONObject templateProfile = (JSONObject) object.get("data"); - + System.out.println("templateProfile = " + templateProfile.toJSONString()); + String senderKey = getStringValue(templateProfile, "senderKey"); //발신프로필키 String uuid = getStringValue(templateProfile, "uuid"); //카카오톡 채널 String name = getStringValue(templateProfile, "name"); //카카오톡 채널 발신프로필 명 diff --git a/src/main/java/itn/let/kakao/kakaoComm/kakaoApi/KakaoFTJsonSave.java b/src/main/java/itn/let/kakao/kakaoComm/kakaoApi/KakaoFTJsonSave.java index 4f9472ef..536a557a 100644 --- a/src/main/java/itn/let/kakao/kakaoComm/kakaoApi/KakaoFTJsonSave.java +++ b/src/main/java/itn/let/kakao/kakaoComm/kakaoApi/KakaoFTJsonSave.java @@ -30,115 +30,6 @@ public class KakaoFTJsonSave { static String json; - @SuppressWarnings("unchecked") - public String kakaoApiJsonSave(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"; - - try { - - 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); - } - - - - - // Image JSON 생성 - JSONObject imageJson = new JSONObject(); - // img형과 wide 형인경우만 등록 (if문으로 제어) - imageJson.put("img_url", "등록된 이미지 URL"); - imageJson.put("img_link", "이동 페이지 URL"); - - - // Wide JSON 생성 - JSONObject wideJson = new JSONObject(); - // wide 형인경우만 등록(if문으로 제어) - wideJson.put("wide", "Y"); - - - - - JSONObject jo = new JSONObject(); - - if(imageJson.size() != 0) { - jo.put("image", imageJson); - } - if(wideJson.size() != 0) { - jo.put("extra", wideJson); - } - - if(buttonList.size() != 0) { - jo.put("button", buttonList); - } - - - - - // 입력 json 데이터를 파일로 변경 - String jsonStr = jo.toString(); - System.out.println("jsonFileName : "+jsonFileName); - - File outPut = new File(jsonFileName); - outPut.createNewFile(); - - BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outPut), "euc-kr")); - bw.write(jsonStr); - bw.close(); - - } catch (IOException e) { - System.out.println("json 생성 실패"); - e.printStackTrace(); - } - return jsonFileName; - } - @SuppressWarnings("unchecked") public String kakaoApiJsonSave(KakaoVO kakaoVO) { diff --git a/src/main/java/itn/let/kakao/user/kakaoAt/service/impl/KakaoAlimTalkDAO.java b/src/main/java/itn/let/kakao/user/kakaoAt/service/impl/KakaoAlimTalkDAO.java index fe3cd77b..46520d26 100644 --- a/src/main/java/itn/let/kakao/user/kakaoAt/service/impl/KakaoAlimTalkDAO.java +++ b/src/main/java/itn/let/kakao/user/kakaoAt/service/impl/KakaoAlimTalkDAO.java @@ -108,4 +108,9 @@ public class KakaoAlimTalkDAO extends EgovAbstractDAO { public void insertKakaoGroupDataTb_advc(KakaoSendAdvcVO sendVO) { insert("kakaoAlimTalkDAO.insertKakaoGroupDataTb_advc", sendVO); } + + public KakaoVO selectBizLog(String bizUmid) { + return (KakaoVO) select("kakaoAlimTalkDAO.selectBizLog", bizUmid); +// return (KakaoVO) select("kakaoAlimTalkDAO.selectKakaoAtUmid", bizUmid); + } } 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 21ca4b50..33ab5fd6 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 @@ -29,6 +29,7 @@ import egovframework.rte.fdl.security.userdetails.util.EgovUserDetailsHelper; import itn.com.cmm.LoginVO; import itn.com.cmm.MjonMsgSendVO; import itn.com.utl.fcc.service.EgovStringUtil; +import itn.let.kakao.kakaoComm.BizKakaoPriceVO; import itn.let.kakao.kakaoComm.KakaoSendAdvcVO; import itn.let.kakao.kakaoComm.KakaoSendUtil; import itn.let.kakao.kakaoComm.KakaoVO; @@ -45,6 +46,7 @@ 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.mjo.pay.service.impl.MjonPayDAO; import itn.let.module.base.PriceAndPoint; import itn.let.sym.site.service.JoinSettingVO; import itn.let.sym.site.service.impl.SiteManagerDAO; @@ -86,6 +88,9 @@ public class KakaoAlimTalkServiceImpl extends EgovAbstractServiceImpl implements /** userManageService */ @Resource(name = "userManageService") private EgovUserManageService userManageService; + + @Autowired + private MjonPayDAO mjonPayDAO; @Autowired KakaoSendUtil kakaoSendUtil; @@ -95,6 +100,11 @@ public class KakaoAlimTalkServiceImpl extends EgovAbstractServiceImpl implements @Autowired private PriceAndPoint priceAndPoint; + + final String KAKAO_SUCCESS_CODE = "7000"; + final String RESEND_YN_YES = "Y"; + final String SMS_SUCCESS_CODE = "4100"; // SMS 성공 코드 + final String MMS_SUCCESS_CODE = "6600"; // MMS 성공 코드 //발신프로필 상태값 변경(삭제/복구 기능) @Override @@ -819,45 +829,109 @@ public class KakaoAlimTalkServiceImpl extends EgovAbstractServiceImpl implements } - /* - * 카카오 친구톡 발송 실패에 따른 금액 환불 처리 - * 카카오 친구톡 대체문자 선택에 대해 성공시 친구톡과 문자 간 금액 차액의 환불도 처리 됨. - * */ + /** + * @ 카카오 친구톡 환불 + */ @Override public void selectKakaoFtSentRefundList() throws Exception { - /** - * 1. 카카오 FT 전송성공 확인 - * 2. 카카오 FT 전송실패, 대채문자 전송확인 - * 3. 카카오 FT 전송 실패 확인 - */ List kakaoFtSentRefundList = kakaoAlimTalkDAO.selectKakaoFtSentRefundList(); - for(KakaoVO vo : kakaoFtSentRefundList) { - System.out.println(vo.getMsgGroupId() +"________결과 : " +vo.getRsltCode() +" 대체문자 전송 : "+vo.getSubMsgSendYn()); + for(KakaoVO kakaoVO : kakaoFtSentRefundList) { + System.out.println(kakaoVO.getMsgGroupId() +"________결과 : " +kakaoVO.getRsltCode() +" 대체문자 전송 : "+kakaoVO.getSubMsgSendYn()); - if(vo.getRsltCode().equals("7000")) {//친구톡 발송 성공시 + if(KAKAO_SUCCESS_CODE.equals(kakaoVO.getRsltCode())) {//친구톡 발송 성공시 - kakaoAlimTalkDAO.updateKakaoFtSend(vo); + processFtSendCharge(kakaoVO); - }else if(vo.getSubMsgSendYn().equals("Y")) {//친구톡 발송 실패 했을 경우 - - //대체문자 발송 UMID 번호 조회 - 알림톡 쿼리 동일하게 사용 - KakaoVO info = kakaoAlimTalkDAO.selectKakaoAtUmid(vo); - - System.out.println("대체문자 전송 : " + info.getBizUmid()); - - if (info.getBizUmid() != null) {//대체문자 발송 완료인 경우 - kakaoAlimTalkDAO.updateKakaoAtSubMsgSend(vo); - }else { - kakaoAlimTalkDAO.updateKakaoFtNotSend(vo); - } + }else if(RESEND_YN_YES.equals(kakaoVO.getSubMsgSendYn())) { + //친구톡 발송 실패 했고, 대체문자 발송 했을 경우 + handleAlternativeMessageScenario(kakaoVO); }else { - kakaoAlimTalkDAO.updateKakaoFtNotSend(vo); + handleRefund(kakaoVO, "카카오 친구톡 전송 실패로 인한 결재 금액 환불"); } } } + + + private void processFtSendCharge(KakaoVO kakaoVO) throws Exception { + + + if(RESEND_YN_YES.equals(kakaoVO.getSubMsgSendYn())) { + + BizKakaoPriceVO bizKakaoPriceVO = mjonPayDAO.selectBizKakaoPrice(kakaoVO.getMsgGroupId()); + + BigDecimal sendPrice = null; + if(StringUtils.isEmpty(kakaoVO.getBizKakaoImageType())){ + sendPrice = new BigDecimal(bizKakaoPriceVO.getBizKakaoFtPrice()); + }else if("I".equals(kakaoVO.getBizKakaoImageType())){ + sendPrice = new BigDecimal(bizKakaoPriceVO.getBizKakaoFtImgPrice()); + }else if("W".equals(kakaoVO.getBizKakaoImageType())){ + sendPrice = new BigDecimal(bizKakaoPriceVO.getBizKakaoFtWideImgPrice()); + } + + // 예시: 각 건당 가격이 이미 String 형태라면 변환 + BigDecimal eachPrice = new BigDecimal(kakaoVO.getEachPrice()); + + // 차이 계산 + BigDecimal diffPrice = eachPrice.subtract(sendPrice); + + + if (diffPrice.compareTo(BigDecimal.ZERO) > 0) { + String result = diffPrice.toString(); + kakaoVO.setEachPrice(result); + + handleRefund(kakaoVO, "카카오 친구톡 전송으로 인한 결재 차액 환불"); + } + + }else { + mjonMsgDAO.updateRefundY(kakaoVO); + + } + // TODO Auto-generated method stub + + } + + private void handleAlternativeMessageScenario(KakaoVO kakaoVO) throws Exception { + KakaoVO bizLogVO = kakaoAlimTalkDAO.selectBizLog(kakaoVO.getBizUmid()); + log.info("대체문자 전송 UMID: {}", kakaoVO.getBizUmid()); + + // 대체문자가 성공적으로 발송되었는지 확인 (SMS 또는 MMS 성공) + boolean isAlternativeMessageSuccessful = false; + if (bizLogVO != null && StringUtils.isNotEmpty(bizLogVO.getBizLogCallStatus())) { + if (SMS_SUCCESS_CODE.equals(bizLogVO.getBizLogCallStatus()) + || MMS_SUCCESS_CODE.equals(bizLogVO.getBizLogCallStatus())) { + isAlternativeMessageSuccessful = true; + } + } + + log.info("bizLogVO.getBizLogCallStatus() :: [{}]", bizLogVO.getBizLogCallStatus()); + log.info("isAlternativeMessageSuccessful :: [{}]", isAlternativeMessageSuccessful); + + // 대체문자 성공이면 환불 완료처리면 한다. + if (isAlternativeMessageSuccessful) { + mjonMsgDAO.updateRefundY(kakaoVO); + } else { + // 대체문자 발송 실패 된 경우 (친구톡 비용 환불 필요) + handleRefund(kakaoVO, "카카오 친구톡 전송 실패로 인한 결재 금액 환불"); + } + } + + private void handleRefund(KakaoVO vo, String msg) throws Exception { + // mj_cash 테이블에 환불 내역 추가 및 회원 금액 업데이트 + // eachPrice는 환불될 금액이므로 양수여야 합니다. + priceAndPoint.insertCashAndPoint( + vo.getUserId(), + Float.parseFloat(vo.getEachPrice()), // 환불 금액은 양수 + msg, + vo.getMsgGroupId(), + vo.getUserData() + ); + + // 해당 row 환불 처리 (mj_msg_data.REFUND_YN = 'Y') + mjonMsgDAO.updateRefundY(vo); + } @Override public StatusResponse insertKakaoAtSandAjax_advc(KakaoVO kakaoVO, HttpServletRequest request) throws Exception { @@ -913,7 +987,7 @@ public class KakaoAlimTalkServiceImpl extends EgovAbstractServiceImpl implements /** @전송금액 확인 --------------------------------------------------*/ - if (!isCashSufficient(userId, kakaoSendAdvcListVO)) { + if (!kakaoSendUtil.isCashSufficient(userId, kakaoSendAdvcListVO)) { log.error("Insufficient balance for message sending."); return new StatusResponse(HttpStatus.BAD_REQUEST, "문자 발송에 필요한 보유 잔액이 부족 합니다."); } @@ -921,7 +995,8 @@ public class KakaoAlimTalkServiceImpl extends EgovAbstractServiceImpl implements /** @json파일이 있을 떄 biz_attachments insert */ - this.insertKakaoAtDataJsonInfo_advc(kakaoSendAdvcListVO); + kakaoSendUtil.insertKakaoAtDataJsonInfo_advc(kakaoSendAdvcListVO); +// this.insertKakaoAtDataJsonInfo_advc(kakaoSendAdvcListVO); Map> priceGroupedMessages = kakaoSendAdvcListVO.stream() @@ -941,7 +1016,7 @@ public class KakaoAlimTalkServiceImpl extends EgovAbstractServiceImpl implements // 발송 데이터 삽입 - int instCnt = this.insertKakaoData_advc(groupedMsgList); + int instCnt = kakaoSendUtil.insertKakaoData_advc(groupedMsgList); // int instCnt = 6; if(instCnt > 0) { @@ -951,7 +1026,7 @@ public class KakaoAlimTalkServiceImpl extends EgovAbstractServiceImpl implements KakaoSendAdvcVO sendVO = groupedMsgList.get(0); /** @groupData 테이블 insert */ - this.insertKakaoGroupDataTb_advc(instCnt, kakaoVO, sendVO); + kakaoSendUtil.insertKakaoGroupDataTb_advc(instCnt, kakaoVO, sendVO); /** @biz_kakao_price에 insert (대체문자 환불관련 테이블)*/ @@ -1032,146 +1107,26 @@ public class KakaoAlimTalkServiceImpl extends EgovAbstractServiceImpl implements - private void insertKakaoAtDataJsonInfo_advc(List kakaoSendAdvcListVO) { - // TODO Auto-generated method stub - - // 측정할 메소드 호출 전 시간 기록 - List jsonInfoData = new ArrayList<>(kakaoSendAdvcListVO); - jsonInfoData.removeIf(t -> StringUtils.isBlank(t.getJsonStr())); - log.info(" + jsonInfoData Insert :: [{}]", jsonInfoData.size()); - if(jsonInfoData.size() > 0) { - kakaoAlimTalkDAO.insertKakaoAtDataJsonInfo_advc(jsonInfoData); - } - - } - - private void insertKakaoGroupDataTb_advc(int instCnt, KakaoVO kakaoVO, KakaoSendAdvcVO sendVO) throws Exception { - // TODO Auto-generated method stub - -// log.info(" + insertKakaoGroupDataTb_advc kakaoVO :: \n[{}]", kakaoVO.toString());; -// log.info(" + insertKakaoGroupDataTb_advc kakaoSendAdvcVOList :: \n[{}]", sendVO.toString()); - - sendVO.setMsgGroupCnt(Integer.toString(instCnt)); - sendVO.setReserveYn(kakaoVO.getReserveYn()); - sendVO.setBefCash(priceAndPoint.getBefCash(sendVO.getUserId())); - sendVO.setBefPoint(priceAndPoint.getBefPoint(sendVO.getUserId())); - - Float eachPrice = Float.parseFloat(sendVO.getEachPrice()); - - Float totPrice = eachPrice * instCnt; - sendVO.setTotPrice(String.format("%.1f", totPrice)); - - sendVO.setAtDelayYn(kakaoVO.getAtSmishingYn()); - sendVO.setBizKakaoResendOrgnlTxt(kakaoVO.getSubMsgTxt()); - sendVO.setBizKakaoResendType(sendVO.getSubMsgType()); - - kakaoAlimTalkDAO.insertKakaoGroupDataTb_advc(sendVO); - - } - - /** - * @methodName : insertKakaoData_advc - * @author : 이호영 - * @date : 2025. 3. 20. - * @description : 카카오 batch 발송 => mj_msg_data - * @return : int - * @param kakaoSendAdvcVOList - * @param parentLoopCount - * @param isJsonNotEmpty - * @param isJsonNameAllSame - * @return - * - */ - private int insertKakaoData_advc(List kakaoSendAdvcVOList) { - - - // 시작 시간 측정 - long totalStartTime = System.currentTimeMillis(); - - int totalSize = kakaoSendAdvcVOList.size(); // 총 데이터 개수 - // Batch 크기 설정 (고정값) -// int batchSize = 10000; 465 - int batchSize = 50000; // 9분 18초 - - log.info("총 데이터 개수 :: [{}] ", totalSize); - log.info("설정된 Batch 크기 :: [{}] ", batchSize); - - // 총 insert 카운트 - int instCnt = 0; - int batchCount = 0; - - // 각 배치별 실행 시간 기록 - List batchExecutionTimes = new ArrayList<>(); - - - // 첫 번째 배치에서만 삽입했는지 추적하는 플래그 - for (int i = 0; i < totalSize; i += batchSize) { - // Batch 시작 시간 측정 - long batchStartTime = System.currentTimeMillis(); - - // Batch 리스트 생성 - List batchList = kakaoSendAdvcVOList.subList(i, Math.min(i + batchSize, totalSize)); - System.out.println("Batch 시작 인덱스: " + i); - - // mj_msg_data 테이블 insert - int insertedCount = kakaoAlimTalkDAO.insertKakaoAtDataInfo_advc(batchList); - - /** @kakaoSendUtil.populateSendLists - * 하단에서 - * getJsonStr 데이터 처리 후 활용 - * */ - instCnt += insertedCount; - - // Batch 종료 시간 측정 및 실행 시간 계산 - long batchEndTime = System.currentTimeMillis(); - double batchExecutionTimeInSeconds = (batchEndTime - batchStartTime) / 1000.0; - - // 실행 시간 기록 - batchExecutionTimes.add(batchExecutionTimeInSeconds); - batchCount++; - } - - // 종료 시간 측정 - long totalEndTime = System.currentTimeMillis(); - - // 총 실행 시간 계산 (밀리초 -> 초로 변환) - double totalExecutionTimeInSeconds = (totalEndTime - totalStartTime) / 1000.0; - - // 실행 시간 출력 - log.info("총 배치 실행 횟수 :: [{}] ", batchCount); - log.info("batchSize :: [{}] ", batchSize); - log.info("총 실행 시간 :: [{}] ", totalExecutionTimeInSeconds + "초"); - log.info("총 삽입 건수 :: [{}] ", instCnt); - - // 각 배치별 실행 시간 출력 - for (int k = 0; k < batchExecutionTimes.size(); k++) { - System.out.println("배치 " + (k + 1) + " 실행 시간 :: " + batchExecutionTimes.get(k) + "초"); - } - - return instCnt; - - } - - // 보유 금액이 충분한지 확인하는 메서드 - 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.getEachPrice()))) // 변환 오류 방지 - .reduce(BigDecimal.ZERO, BigDecimal::add) - .setScale(2, RoundingMode.HALF_EVEN); // 일관성 유지 - - // 비교 수행 - return befCash.compareTo(totalEachPrice) >= 0; - } +// // 보유 금액이 충분한지 확인하는 메서드 +// 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.getEachPrice()))) // 변환 오류 방지 +// .reduce(BigDecimal.ZERO, BigDecimal::add) +// .setScale(2, RoundingMode.HALF_EVEN); // 일관성 유지 +// +// // 비교 수행 +// return befCash.compareTo(totalEachPrice) >= 0; +// } diff --git a/src/main/java/itn/let/kakao/user/kakaoFt/service/KakaoFriendsTalkService.java b/src/main/java/itn/let/kakao/user/kakaoFt/service/KakaoFriendsTalkService.java new file mode 100644 index 00000000..d9392550 --- /dev/null +++ b/src/main/java/itn/let/kakao/user/kakaoFt/service/KakaoFriendsTalkService.java @@ -0,0 +1,12 @@ +package itn.let.kakao.user.kakaoFt.service; + +import javax.servlet.http.HttpServletRequest; + +import itn.let.kakao.kakaoComm.KakaoVO; +import itn.let.mail.service.StatusResponse; + +public interface KakaoFriendsTalkService { + + StatusResponse insertKakaoFtSandAjax_advc(KakaoVO kakaoVO, HttpServletRequest request) throws Exception; + +} diff --git a/src/main/java/itn/let/kakao/user/kakaoFt/service/impl/KakaoFriendsTalkServiceImpl.java b/src/main/java/itn/let/kakao/user/kakaoFt/service/impl/KakaoFriendsTalkServiceImpl.java new file mode 100644 index 00000000..77378891 --- /dev/null +++ b/src/main/java/itn/let/kakao/user/kakaoFt/service/impl/KakaoFriendsTalkServiceImpl.java @@ -0,0 +1,249 @@ +package itn.let.kakao.user.kakaoFt.service.impl; + +import java.time.Duration; +import java.time.Instant; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +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.impl.KakaoAlimTalkDAO; +import itn.let.kakao.user.kakaoFt.service.KakaoFriendsTalkService; +import itn.let.mail.service.StatusResponse; +import itn.let.mjo.mjocommon.MjonCommon; +import itn.let.mjo.msg.service.MjonMsgVO; +import itn.let.mjo.msg.service.impl.MjonMsgDAO; +import itn.let.module.base.PriceAndPoint; +import itn.let.uss.umt.service.EgovUserManageService; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@Service("KakaoFriendsTalkService") +public class KakaoFriendsTalkServiceImpl extends EgovAbstractServiceImpl implements KakaoFriendsTalkService{ + + @Resource(name = "egovFriendstalkTemplateIdService") + private EgovIdGnrService idgenFriendTalkTmpId; + + @Resource(name="kakaoFriendsTalkTemplateDAO") + private KakaoFriendsTalkTemplateDAO kakaoFriendsTalkTemplateDAO; + + @Resource(name="mjonMsgDAO") + private MjonMsgDAO mjonMsgDAO; + + /** userManageService */ + @Resource(name = "userManageService") + private EgovUserManageService userManageService; + + @Resource(name = "egovMjonMsgGroupIdGnrService") + private EgovIdGnrService idgenMjonMsgGroupId; + + + @Resource(name="kakaoAlimTalkDAO") + private KakaoAlimTalkDAO kakaoAlimTalkDAO; + + @Autowired + KakaoSendUtil kakaoSendUtil; + + @Autowired + private MjonCommon mjonCommon; + + @Autowired + private PriceAndPoint priceAndPoint; + + @Override + public StatusResponse insertKakaoFtSandAjax_advc(KakaoVO kakaoVO, HttpServletRequest request) throws Exception { + StatusResponse statusResponse = new StatusResponse(); + + log.info(" + kakaoVO.toString() :: [{}]", kakaoVO.toString()); + + log.info(" + kakaoVO.toString() :: [{}]", kakaoVO.ftToString()); + + + + // 측정할 메소드 호출 전 시간 기록 + Instant start = Instant.now(); +// 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, "로그인 후 이용이 가능합니다."); + } + + kakaoVO.setUserId(userId); + + /** + * 회원 정지된 상태이면 문자 발송이 안되도록 처리함 현재 로그인 세션도 만료 처리함 + */ + boolean mberSttus = userManageService.selectUserStatusInfo(userId); + if (!mberSttus) { + request.getSession().invalidate(); + // UNAUTHORIZED : 인증되지 않은 사용자가 접근하려고 할 때 + return new StatusResponse(HttpStatus.UNAUTHORIZED, + "현재 고객님께서는 문자온 서비스 이용이 정지된 상태로 친구톡을 발송하실 수 없습니다. 이용정지 해제를 원하시면 고객센터로 연락주시기 바랍니다."); + } + + + /** + * 친구톡은 발송 시간 제약이 있음 + */ + if(kakaoSendUtil.isRestrictedFriendTalkTime(kakaoSendUtil.resolveBaseDate(kakaoVO))) { + // UNAUTHORIZED : 인증되지 않은 사용자가 접근하려고 할 때 + return new StatusResponse(HttpStatus.BAD_REQUEST, + "친구톡은 20시 50분부터 익일 08시까지 발송이 제한됩니다."); + } + + +/** @isHolidayNotified + * @false : 알림 X + * @true : 알림 O */ + boolean isNotified = mjonCommon.processUserAndCheckAT(kakaoVO); + + + +/** @카카오톡 전송 list 셋팅 -------------------------------------------*/ + List kakaoSendAdvcListVO = kakaoSendUtil.populateSendListsFT(kakaoVO, isNotified, statusResponse); + if (statusResponse.getStatus() != null && !statusResponse.getStatus().equals(HttpStatus.OK)) { + log.error(" + populateSendLists 처리 중 오류 발생: {}", statusResponse.getMessage()); + return statusResponse; + } + + + +/** @전송금액 확인 --------------------------------------------------*/ + if (!kakaoSendUtil.isCashSufficient(userId, kakaoSendAdvcListVO)) { + log.error("Insufficient balance for message sending."); + return new StatusResponse(HttpStatus.BAD_REQUEST, "문자 발송에 필요한 보유 잔액이 부족 합니다."); + } + + +/** @json파일이 있을 떄 biz_attachments insert */ + kakaoSendUtil.insertKakaoAtDataJsonInfo_advc(kakaoSendAdvcListVO); + + + + Map> priceGroupedMessages = kakaoSendAdvcListVO.stream() + .collect(Collectors.groupingBy(KakaoSendAdvcVO::getEachPrice)); + // instTotalCnt : 화면에서 보여줄 총 발송건수 + int instTotalCnt = 0; + + + // 임시 + List nextMsgGroupIdA = new ArrayList<>(); + // 대안: entrySet() 직접 사용 + for (Map.Entry> entry : priceGroupedMessages.entrySet()) { + // entry 사용 + + List groupedMsgList = entry.getValue(); // 해당 가격의 메시지 리스트 + + String nextMsgGroupId = idgenMjonMsgGroupId.getNextStringId(); + groupedMsgList.forEach(t -> t.setMsgGroupId(nextMsgGroupId)); + + + // 발송 데이터 삽입 + int instCnt = kakaoSendUtil.insertKakaoData_advc(groupedMsgList); +// int instCnt = 6; + + if(instCnt > 0) { + + instTotalCnt += instCnt; + + KakaoSendAdvcVO sendVO = groupedMsgList.get(0); + +/** @groupData 테이블 insert */ + kakaoSendUtil.insertKakaoGroupDataTb_advc(instCnt, kakaoVO, sendVO); + + + +/** @biz_kakao_price에 insert (대체문자 환불관련 테이블)*/ + priceAndPoint.insertBizFtKakaoPrice(kakaoVO.getUserId(), sendVO.getMsgGroupId()); + + + priceAndPoint.insertCashAndPoint(kakaoVO.getUserId() + , -Float.parseFloat(sendVO.getTotPrice()) + , "카카오 친구톡 총 "+groupedMsgList.size()+"건 중 " + instCnt + "건 발송" + , nextMsgGroupId + ); + + +/** @SLACK발송 */ + /** @발송조건이되면 발송 */ + if(isNotified) { + mjonCommon.getAdminKakaoAtSendSlack(sendVO); + }else if("Y".equals(kakaoVO.getAtSmishingYn())){ + /** @발송조건이 안되면 DB INSERT */ + mjonMsgDAO.insertSpamPassMsgData(MjonMsgVO.builder() + .msgGroupId(nextMsgGroupId) + .userId(kakaoVO.getUserId()) + .reqDate(kakaoVO.getReqDate()) + .smsTxt(groupedMsgList.get(0).getTemplateContent()) + .totalCallCnt(instCnt) + .callFrom(kakaoVO.getCallFrom()) + .msgType("8") + .reserveYn(kakaoVO.getReserveYn()) + .build() + ); + } + + nextMsgGroupIdA.add(nextMsgGroupId); + + } + + } + + returnMap.put("resultSts", instTotalCnt); + returnMap.put("reserYn", kakaoVO.getReserveYn()); + returnMap.put("groupIds", nextMsgGroupIdA); + + + // 측정할 메소드 호출 후 시간 기록 + Instant end = Instant.now(); + + log.info(" + start :: [{}]", start); + // 실행 시간 계산 (나노초, 밀리초, 초) + long seconds = Duration.between(start, end).getSeconds(); + log.info("메소드 실행 시간 (초): {} s", seconds); + double minutes = seconds / 60.0; // 소수점 포함을 위해 60.0으로 나눔 + + returnMap.put("second", seconds+" s"); + returnMap.put("minutes", minutes+" min"); + + +// System.out.println("메소드 실행 시간 (분): " + minutes + " min"); + + + + +// priceAndPoint.getBefCash(userId); + + + + + statusResponse.setStatus(HttpStatus.OK); + statusResponse.setObject(returnMap); + + return statusResponse; + } + +} diff --git a/src/main/java/itn/let/kakao/user/kakaoFt/web/KakaoFriendsTalkSendController.java b/src/main/java/itn/let/kakao/user/kakaoFt/web/KakaoFriendsTalkSendController.java index 0dc23c11..2edcb887 100644 --- a/src/main/java/itn/let/kakao/user/kakaoFt/web/KakaoFriendsTalkSendController.java +++ b/src/main/java/itn/let/kakao/user/kakaoFt/web/KakaoFriendsTalkSendController.java @@ -13,9 +13,11 @@ import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; 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.servlet.ModelAndView; @@ -29,7 +31,9 @@ import itn.let.kakao.kakaoComm.KakaoSendUtil; import itn.let.kakao.kakaoComm.KakaoVO; import itn.let.kakao.kakaoComm.kakaoApi.service.KakaoApiService; import itn.let.kakao.user.kakaoAt.service.KakaoAlimTalkService; +import itn.let.kakao.user.kakaoFt.service.KakaoFriendsTalkService; import itn.let.kakao.user.kakaoFt.service.KakaoFriendsTalkTemplateService; +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; @@ -68,6 +72,9 @@ public class KakaoFriendsTalkSendController { @Resource(name = "kakaoFriendsTalkTemplateService") private KakaoFriendsTalkTemplateService kakaoFtTemplateService; + @Resource(name = "KakaoFriendsTalkService") + private KakaoFriendsTalkService kakaoFriendsTalkService; + /** userManageService */ @Resource(name = "userManageService") private EgovUserManageService userManageService; @@ -113,114 +120,109 @@ public class KakaoFriendsTalkSendController { model.addAttribute("loginVO", loginVO); - try { - if(!userId.equals("") && !author.equals("ROLE_ADMIN")) { + if(!"".equals(userId) && !"ROLE_ADMIN".equals(author)) { + + //사용자 등록 발신프로필 정보 조회해오기 + kakaoVO.setUserId(userId); + List resultProfileList = kakaoApiService.selectKakaoProfileList(kakaoVO); + model.addAttribute("resultProfileList", resultProfileList); - //사용자 등록 발신프로필 정보 조회해오기 - kakaoVO.setUserId(userId); - List resultProfileList = kakaoApiService.selectKakaoProfileList(kakaoVO); - model.addAttribute("resultProfileList", resultProfileList); - - // 특수문자 리스트 불러오기 - MjonSymbolVO symbolVO = new MjonSymbolVO(); - List symbolList = mjonSymbolService.selectMjonSymbolList(symbolVO); - model.addAttribute("symbolList", symbolList); - - //아이디 발신번호 리스트 불러오기. - List resultSendPhonList = mjonMsgDataService.selectSendPhonNumList(userId); - List resultPhonList = new ArrayList(); - MJUtil mjUtil = new MJUtil(); - for(String phone : resultSendPhonList) { - resultPhonList.add(mjUtil.addDash(phone)); - } - model.addAttribute("resultPhonList", resultPhonList); - - - MberManageVO mberManageVO = mjonMsgDataService.selectMberManageInfo(userId); - - model.addAttribute("atSmishingYn", mberManageVO.getAtSmishingYn()); - - //3.사용자 개인단가 정보가 0이 아니면 개인단가 사용, 없으면 시스템 기본 단가 사용 - /*Float shortPrice = mberManageVO.getShortPrice(); - Float longPrice = mberManageVO.getLongPrice(); - Float picturePrice = mberManageVO.getPicturePrice(); - Float picture2Price = mberManageVO.getPicture2Price(); - Float picture3Price = mberManageVO.getPicture3Price();*/ - BigDecimal userMoney = new BigDecimal(mberManageVO.getUserMoney()).setScale(2, RoundingMode.HALF_EVEN); - - model.addAttribute("userMoney", userMoney); - - - ////////////////////////////////////////////////////////////////// - - //최근 전송 내역 - MjonMsgDataVO searchVO = new MjonMsgDataVO(); - Calendar cal = Calendar.getInstance(); - Date now = new Date(); - SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd"); - cal.setTime(now); - cal.add(Calendar.DATE, -3); - String chkDate = format.format(cal.getTime()); - searchVO.setUserId(userId); - searchVO.setMyMsgStDt(chkDate); //검색 시작일 저장 - 현재날짜로 부터 3일 이전 날짜로 시작 - model.addAttribute("resultLatestMsgList", mjonMsgDataService.selectLatestMsgList(searchVO)); - - //자주보내는 번호 - model.addAttribute("resultBookMarkMsgList", mjonMsgDataService.selectBookMarkMsgList(searchVO)); - - // 사용자 정의 단가 정보 불러오기(시스템 단가 혹은 협의 단가) - model.addAttribute("sendPrice", kakaoSendUtil.selectSendPriceOfKakaoAtAndSmsAndMms(userId)); - - - //사용자 템플릿 정보 조회 - String friendId = kakaoVO.getFriendId(); - KakaoVO resultTemplateVO = new KakaoVO(); - - if(friendId != null) { - resultTemplateVO = kakaoFtTemplateService.selectKakaoFriendsTemplateDetail(kakaoVO); - } - model.addAttribute("resultTemplateVO", resultTemplateVO); - - - //친구톡 발송시간 체크 하기 - 20:50 ~ 익일 08:00 사이에는 발송 금지 - - SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - - Date nows = new Date(); - String nowDate = sdf1.format(nows); - cal.setTime(nows); - - int hours = cal.get(Calendar.HOUR_OF_DAY); - int minuts = cal.get(Calendar.MINUTE); + // 특수문자 리스트 불러오기 + MjonSymbolVO symbolVO = new MjonSymbolVO(); + List symbolList = mjonSymbolService.selectMjonSymbolList(symbolVO); + model.addAttribute("symbolList", symbolList); + + //아이디 발신번호 리스트 불러오기. + List resultSendPhonList = mjonMsgDataService.selectSendPhonNumList(userId); + List resultPhonList = new ArrayList(); + MJUtil mjUtil = new MJUtil(); + for(String phone : resultSendPhonList) { + resultPhonList.add(mjUtil.addDash(phone)); + } + model.addAttribute("resultPhonList", resultPhonList); + + + MberManageVO mberManageVO = mjonMsgDataService.selectMberManageInfo(userId); + + model.addAttribute("atSmishingYn", mberManageVO.getAtSmishingYn()); + + //3.사용자 개인단가 정보가 0이 아니면 개인단가 사용, 없으면 시스템 기본 단가 사용 + /*Float shortPrice = mberManageVO.getShortPrice(); + Float longPrice = mberManageVO.getLongPrice(); + Float picturePrice = mberManageVO.getPicturePrice(); + Float picture2Price = mberManageVO.getPicture2Price(); + Float picture3Price = mberManageVO.getPicture3Price();*/ + BigDecimal userMoney = new BigDecimal(mberManageVO.getUserMoney()).setScale(2, RoundingMode.HALF_EVEN); + + model.addAttribute("userMoney", userMoney); + + + ////////////////////////////////////////////////////////////////// + + //최근 전송 내역 + MjonMsgDataVO searchVO = new MjonMsgDataVO(); + Calendar cal = Calendar.getInstance(); + Date now = new Date(); + SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd"); + cal.setTime(now); + cal.add(Calendar.DATE, -3); + String chkDate = format.format(cal.getTime()); + searchVO.setUserId(userId); + searchVO.setMyMsgStDt(chkDate); //검색 시작일 저장 - 현재날짜로 부터 3일 이전 날짜로 시작 +// model.addAttribute("resultLatestMsgList", mjonMsgDataService.selectLatestMsgList(searchVO)); + + //자주보내는 번호 +// model.addAttribute("resultBookMarkMsgList", mjonMsgDataService.selectBookMarkMsgList(searchVO)); + + // 사용자 정의 단가 정보 불러오기(시스템 단가 혹은 협의 단가) + model.addAttribute("sendPrice", kakaoSendUtil.selectSendPriceOfKakaoAtAndSmsAndMms(userId)); + + + //사용자 템플릿 정보 조회 + String friendId = kakaoVO.getFriendId(); + KakaoVO resultTemplateVO = new KakaoVO(); + + if(friendId != null) { + resultTemplateVO = kakaoFtTemplateService.selectKakaoFriendsTemplateDetail(kakaoVO); + } + model.addAttribute("resultTemplateVO", resultTemplateVO); + + + //친구톡 발송시간 체크 하기 - 20:50 ~ 익일 08:00 사이에는 발송 금지 + + SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + + Date nows = new Date(); + String nowDate = sdf1.format(nows); + cal.setTime(nows); + + int hours = cal.get(Calendar.HOUR_OF_DAY); + int minuts = cal.get(Calendar.MINUTE); - boolean sendStatus = true; + boolean sendStatus = true; + + if(hours >= 20) { - if(hours >= 20) { + if(minuts >= 50) { - if(minuts >= 50) { - - System.out.println("발송금지 시간" + hours + ":" + minuts); - sendStatus = false; - - } - - } - - if(hours < 8) { - - System.out.println("발송금지 시간" + hours + ":" + minuts); + System.out.println("발송금지 시간" + hours + ":" + minuts); sendStatus = false; } - System.out.println("발송상태는 ::: "+sendStatus); - model.addAttribute("sendStatus", sendStatus); - } - } catch (Exception e) { - System.out.println(" kakaoFriendsTalkMsgDataViewDataRegist Error ::: " + e); + if(hours < 8) { + + System.out.println("발송금지 시간" + hours + ":" + minuts); + sendStatus = false; + + } + + System.out.println("발송상태는 ::: "+sendStatus); + model.addAttribute("sendStatus", sendStatus); + } return "web/kakao/msgdata/ft/KakaoFriendsTalkMsgDataView"; @@ -313,7 +315,29 @@ public class KakaoFriendsTalkSendController { return modelAndView; } - + + /** + * @methodName : sendMsgData_ft_advc + * @author : 이호영 + * @date : 2025. 4. 17. + * @description : 친구톡 발송기능 + * @return : ResponseEntity + * @param kakaoVO + * @param request + * @param model + * @return + * @throws Exception + * + */ + @RequestMapping(value = "/web/mjon/kakao/friendstalk/kakaoFriendsTalkMsgSendAjax_advc.do") + public ResponseEntity kakaoFriendsTalkMsgSendAjax_advc( + @RequestBody KakaoVO kakaoVO, + HttpServletRequest request + ) throws Exception { + System.out.println(" :: sendMsgData_ft_advc :: "); + return ResponseEntity.ok().body(kakaoFriendsTalkService.insertKakaoFtSandAjax_advc(kakaoVO, request)) ; + + } /** * @Method Name : kakaoFriendsTalkMsgSendAjax diff --git a/src/main/java/itn/let/kakao/user/kakaoFt/web/KakaoFriendsTalkTemplateController.java b/src/main/java/itn/let/kakao/user/kakaoFt/web/KakaoFriendsTalkTemplateController.java index 9b9540bd..8bf45081 100644 --- a/src/main/java/itn/let/kakao/user/kakaoFt/web/KakaoFriendsTalkTemplateController.java +++ b/src/main/java/itn/let/kakao/user/kakaoFt/web/KakaoFriendsTalkTemplateController.java @@ -1,5 +1,6 @@ package itn.let.kakao.user.kakaoFt.web; +import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -8,11 +9,16 @@ import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartHttpServletRequest; import org.springframework.web.servlet.ModelAndView; @@ -21,6 +27,7 @@ import egovframework.rte.fdl.security.userdetails.util.EgovUserDetailsHelper; import egovframework.rte.ptl.mvc.tags.ui.pagination.PaginationInfo; import itn.com.cmm.EgovMessageSource; import itn.com.cmm.LoginVO; +import itn.com.cmm.RestResponse; import itn.com.cmm.service.EgovCmmUseService; import itn.com.utl.fcc.service.EgovStringUtil; import itn.let.kakao.kakaoComm.KakaoReturnVO; @@ -32,10 +39,14 @@ import itn.let.kakao.kakaoComm.kakaoApi.KakaoApiTemplate; import itn.let.kakao.kakaoComm.kakaoApi.KakaoFTJsonSave; import itn.let.kakao.kakaoComm.kakaoApi.service.KakaoApiService; import itn.let.kakao.user.kakaoFt.service.KakaoFriendsTalkTemplateService; +import itn.let.mail.service.StatusResponse; import itn.let.mjo.symbol.service.MjonSymbolService; import itn.let.mjo.symbol.service.MjonSymbolVO; +import itn.let.uss.ion.cnt.service.CntManageVO; import itn.let.uss.umt.service.EgovUserManageService; +import lombok.extern.slf4j.Slf4j; +@Slf4j @Controller public class KakaoFriendsTalkTemplateController { @@ -170,6 +181,63 @@ public class KakaoFriendsTalkTemplateController { return modelAndView; } + + + @RequestMapping(value="/web/pop/ft/kakaoTemplatePop.do") + public String siteContentIntro(@ModelAttribute CntManageVO cntManageVO, HttpServletRequest request, Model model) throws Exception { + + return "/web/pop/kakaoFtPop"; + } + + @ResponseBody + @RequestMapping(value= {"/web/mjon/kakao/template/sendKakaoFriendsTemplateImageUploadAjax_advc.do"}) + public ResponseEntity sendKakaoFriendsTemplateImageUploadAjax_advc( + @ModelAttribute("kakaoVO") KakaoVO kakaoVO + , final MultipartHttpServletRequest multiRequest + ) throws Exception { + ModelAndView modelAndView = new ModelAndView(); + modelAndView.setViewName("jsonView"); + + try { + LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null; + String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId()); + + if(StringUtils.isEmpty(userId)) { //KISA 보안취약점 조치 (2018-12-10, 이정은) + return ResponseEntity.ok( + new StatusResponse(HttpStatus.UNAUTHORIZED + , "로그인을 하셔야 이용 가능합니다." + , LocalDateTime.now() + ) + ); + } + + + + final Map files = multiRequest.getFileMap(); + /* if (!files.isEmpty()){ + + Map resultMap = kakaoApiImageUpload.kakaoApiImageUpload(kakaoVO, files, 0); + + //테스트 용 + modelAndView.addObject("code", resultMap.get("code")); + modelAndView.addObject("msg", resultMap.get("msg")); + modelAndView.addObject("imgUrl", resultMap.get("imgUrl")); + } + + modelAndView.addObject("result", "success");*/ + + return ResponseEntity.ok().body(kakaoApiImageUpload.kakaoApiImageUpload_advc(kakaoVO, files, 0)); + } catch (Exception e) { + e.printStackTrace(); + // TODO: handle exception + return ResponseEntity.ok().body(new StatusResponse( + HttpStatus.BAD_REQUEST + , "오류가 발생하였습니다." + , "" + )); + } + + } // 카카오 친구톡 템플릿 등록요청 @@ -189,9 +257,13 @@ public class KakaoFriendsTalkTemplateController { @ModelAttribute("kakaoVO") KakaoVO kakaoVO , final MultipartHttpServletRequest multiRequest ) throws Exception { + + ModelAndView modelAndView = new ModelAndView(); modelAndView.setViewName("jsonView"); +// log.info(" + kakaoVO.getAdFlag() :: [{}]", kakaoVO.getAdFlag()); + log.info(" + ImgLink :: [{}]", kakaoVO.getImgLink()); try { LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null; String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId()); @@ -207,16 +279,18 @@ public class KakaoFriendsTalkTemplateController { kakaoVO.setLastUpdusrId(userId); kakaoVO.setSendType("FT"); + /* String imgUrl = kakaoVO.getTemplateImageUrl(); int buttonSize = kakaoVO.getButtonVOList().size(); if(!imgUrl.equals("") || buttonSize > 0) { - + + log.info(" + kakaoVO.getAdFlag() :: [{}]", kakaoVO.getAdFlag()); //json 파일 생성 처리 String resultJsonPath = kakaoFTJsonSave.kakaoApiJsonSave(kakaoVO); kakaoVO.setBizJsonName(resultJsonPath); - } + }*/ int result = kakaoFtTemplateService.insertKakaoFriendsTemplateData(kakaoVO); diff --git a/src/main/java/itn/let/kakao/user/sent/service/KakaoSentVO.java b/src/main/java/itn/let/kakao/user/sent/service/KakaoSentVO.java index 1a2e7682..66a8cc27 100644 --- a/src/main/java/itn/let/kakao/user/sent/service/KakaoSentVO.java +++ b/src/main/java/itn/let/kakao/user/sent/service/KakaoSentVO.java @@ -6,9 +6,11 @@ import java.util.List; import itn.let.uss.umt.service.UserDefaultVO; import lombok.Getter; import lombok.Setter; +import lombok.ToString; @Getter @Setter +@ToString public class KakaoSentVO extends UserDefaultVO{ private static final long serialVersionUID = 1L; @@ -90,7 +92,7 @@ public class KakaoSentVO extends UserDefaultVO{ private String bizKakaoFtPrice; private String bizSmsPrice; private String bizMmsPrice; - + private int successCount; private int waitCount; private int failCount; @@ -112,6 +114,7 @@ public class KakaoSentVO extends UserDefaultVO{ private String successPrice; private String kakaoResendSuccPrice; + private String bizKakaoImageType; private String divideYn; @@ -119,4 +122,6 @@ public class KakaoSentVO extends UserDefaultVO{ private String yellowId; + private String adFlag; + } diff --git a/src/main/java/itn/let/kakao/user/sent/service/impl/KakaoSentServiceImpl.java b/src/main/java/itn/let/kakao/user/sent/service/impl/KakaoSentServiceImpl.java index 7f4e1e1e..0e29d6a9 100644 --- a/src/main/java/itn/let/kakao/user/sent/service/impl/KakaoSentServiceImpl.java +++ b/src/main/java/itn/let/kakao/user/sent/service/impl/KakaoSentServiceImpl.java @@ -39,7 +39,9 @@ import itn.let.kakao.user.sent.service.KakaoSentDetailVO; import itn.let.kakao.user.sent.service.KakaoSentService; import itn.let.kakao.user.sent.service.KakaoSentVO; import itn.let.mjo.msgsent.service.MjonMsgSentVO; +import lombok.extern.slf4j.Slf4j; +@Slf4j @Service("KakaoSentService") public class KakaoSentServiceImpl extends EgovAbstractServiceImpl implements KakaoSentService{ @@ -140,6 +142,9 @@ public class KakaoSentServiceImpl extends EgovAbstractServiceImpl implements Ka List resultList = new ArrayList(); resultList = kakaoSentDAO.selectAllKakaoSentList_advc(kakaoSentVO); + + System.out.println("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); + //totPrice 계산 및 상태코드 set resultList = resultList.stream().map(t -> setPriceNCode(t)).collect(Collectors.toList()); @@ -287,15 +292,27 @@ public class KakaoSentServiceImpl extends EgovAbstractServiceImpl implements Ka * */ private KakaoSentVO setPriceNCode(KakaoSentVO result) { + log.info("=============================== setPriceNCode ================================"); + //성공 건수 세팅 KakaoSentVO eachCnt = new KakaoSentVO(); eachCnt.setMsgGroupId(result.getMsgGroupId()); eachCnt.setBizKakaoResendYn("Y".equals(result.getBizKakaoResendYn()) ? "Y" : "N"); + eachCnt.setMsgType(result.getMsgType()); + eachCnt.setBizKakaoImageType(result.getBizKakaoImageType()); + eachCnt.setBizKakaoResendType(result.getBizKakaoResendType()); + try { + log.info("eachCnt.getMsgType() :: [{}]", eachCnt.getMsgType()); + log.info("eachCnt.getBizKakaoImageType() :: [{}]", eachCnt.getBizKakaoImageType()); + log.info("eachCnt.getBizKakaoResendType() :: [{}]", eachCnt.getBizKakaoResendType()); + eachCnt = kakaoSentDAO.selectKakaoSentCntEachCnt_advc(eachCnt); } catch (Exception e) { System.out.println("setPriceNCode error!!"); } + log.info(" + eachCnt.toString() :: [{}]", eachCnt.toString()); +// log.info(" + eachCnt.getSuccessPrice() :: [{}]", eachCnt.getSuccessPrice()); result.setSuccessCount(eachCnt.getSuccessCount()); result.setWaitCount(eachCnt.getWaitCount()); @@ -328,9 +345,9 @@ public class KakaoSentServiceImpl extends EgovAbstractServiceImpl implements Ka //총금액 시작 //======================================================= - // TotPrice : 성공건수에 대한 금액 곱하기 - BigDecimal atPrice = new BigDecimal(successPrice); - BigDecimal kakaoResendPrice = new BigDecimal(kakaoResendSuccPrice); + // TotPrice : 성공건수에 대한 금액 곱하기 ? : null 처리 + BigDecimal atPrice = successPrice != null ? new BigDecimal(successPrice) : BigDecimal.ZERO; + BigDecimal kakaoResendPrice = kakaoResendSuccPrice != null ? new BigDecimal(kakaoResendSuccPrice) : BigDecimal.ZERO; BigDecimal totalPrice = atPrice.add(kakaoResendPrice); // 소수점 한 자리로 설정 (반올림)// totalPrice 값을 소수점 한 자리까지 반올림하여 roundedTotalPrice에 저장 // RoundingMode.HALF_UP: 반올림 방식으로, 소수점 기준 5 이상이면 올림, 그렇지 않으면 내림 diff --git a/src/main/java/itn/let/kakao/user/sent/web/KakaoSentController.java b/src/main/java/itn/let/kakao/user/sent/web/KakaoSentController.java index 5dc1b8a4..f797391b 100644 --- a/src/main/java/itn/let/kakao/user/sent/web/KakaoSentController.java +++ b/src/main/java/itn/let/kakao/user/sent/web/KakaoSentController.java @@ -2,6 +2,7 @@ package itn.let.kakao.user.sent.web; import java.io.FileReader; +import org.apache.commons.io.FilenameUtils; import org.apache.commons.lang3.StringUtils; import itn.com.cmm.util.DateUtils; import java.text.SimpleDateFormat; @@ -38,6 +39,7 @@ import itn.com.cmm.LoginVO; import itn.com.cmm.util.StringUtil; import itn.com.cmm.util.StringUtil2; import itn.com.utl.fcc.service.EgovStringUtil; +import itn.let.cmm.vo.FileInfoVO; import itn.let.kakao.admin.kakaoAt.service.MjonKakaoATVO; import itn.let.kakao.kakaoComm.KakaoButtonVO; import itn.let.kakao.kakaoComm.KakaoReturnVO; @@ -46,13 +48,20 @@ import itn.let.kakao.kakaoComm.kakaoApi.KakaoApiTemplate; import itn.let.kakao.user.sent.service.KakaoSentDetailVO; import itn.let.kakao.user.sent.service.KakaoSentService; import itn.let.kakao.user.sent.service.KakaoSentVO; +import itn.let.mjo.msgsent.service.MjonMsgSentVO; +import itn.let.mjo.msgsent.service.impl.MjonMsgSentDAO; +import lombok.extern.slf4j.Slf4j; +@Slf4j @Controller public class KakaoSentController { @Resource(name = "KakaoSentService") private KakaoSentService kakaoSentService; + @Resource(name="MjonMsgSentDAO") + private MjonMsgSentDAO mjonMsgSentDAO; + @Autowired KakaoApiTemplate kakaoApiTemplate; @@ -182,7 +191,7 @@ public class KakaoSentController { //전체 발송 리스트 불러오기 List resultAllSentList = kakaoSentService.selectAllKakaoSentList(kakaoSentVO); - System.out.println("??"); + model.addAttribute("resultAllSentList", resultAllSentList); // model.addAttribute("resultAllSentCnt", resultAllSentList.size()); @@ -890,22 +899,21 @@ public class KakaoSentController { KakaoReturnVO returnVO = new KakaoReturnVO(); try { - String tmpContent = kakaoATVO.getSmsTxtTrans(); - String jsonFilePath = kakaoATVO.getBizKakaoJsonFile(); + String jsonContents = kakaoATVO.getContents(); //친구톡 이미지 또는 버튼 정보가 있다면 실행 - if(jsonFilePath != null && jsonFilePath.length() > 0) { + if(jsonContents != null && jsonContents.length() > 0) { - FileReader reader = new FileReader(jsonFilePath); + /*FileReader reader = new FileReader(jsonFilePath); int ch; String resultStr = ""; while ((ch = reader.read()) != -1) { resultStr = resultStr + (char)ch; } - + */ JSONParser parser = new JSONParser(); - Object obj = parser.parse(resultStr); + Object obj = parser.parse(jsonContents); JSONObject object = (JSONObject) obj; String image = (object.get("image") == null) ? null : object.get("image").toString(); @@ -964,7 +972,7 @@ public class KakaoSentController { } //친구톡 내용 셋팅 - returnVO.setTemplateContent(tmpContent); + returnVO.setTemplateContent(kakaoATVO.getSmsTxt()); } catch (Exception e) { e.printStackTrace(); @@ -1037,42 +1045,70 @@ public class KakaoSentController { - //발송 관리 문자발송 내용 상세보기 팝업 => 문자내용(MJ_MSG_DATA) - MjonKakaoATVO mjonKakaoATResultVO = kakaoSentService.selectKakaoSentDetailDataAjax(mjonKakaoATVO); - // 대체문자 엔터키 치환 - mjonKakaoATResultVO.setSmsTxt(StringUtil2.replaceBR(mjonKakaoATResultVO.getSmsTxt())); - model.addAttribute("resultMsgDetail", mjonKakaoATResultVO); + try { - String msgType = mjonKakaoATResultVO.getMsgType(); + //발송 관리 문자발송 내용 상세보기 팝업 => 문자내용(MJ_MSG_DATA) + MjonKakaoATVO mjonKakaoATResultVO = kakaoSentService.selectKakaoSentDetailDataAjax(mjonKakaoATVO); + // 대체문자 엔터키 치환 + if(StringUtils.isNotEmpty(mjonKakaoATResultVO.getSmsTxt())) { + mjonKakaoATResultVO.setSmsTxt(StringUtil2.replaceBR(mjonKakaoATResultVO.getSmsTxt())); + } + model.addAttribute("resultMsgDetail", mjonKakaoATResultVO); + + String msgType = mjonKakaoATResultVO.getMsgType(); + + if(msgType.equals("8")) {//카카오 알림톡인 경우 상세정보 처리 + + // 템플릿 api 가져오기 + KakaoVO kakaoVO = new KakaoVO(); + kakaoVO.setSenderKey(mjonKakaoATResultVO.getMsgNoticetalkSenderKey()); + kakaoVO.setTemplateCode(mjonKakaoATResultVO.getMsgNoticetalkTmpKey()); + + KakaoReturnVO kakaoTemplateInfo =kakaoApiTemplate.selectKakaoApiTemplateDetail(kakaoVO); + + model.addAttribute("kakaoTemplateInfo", kakaoTemplateInfo); + // //템플릿 api 가져오기 + + }else if(msgType.equals("9")) {//카카오 친구톡인 경우 상세정보 처리 + + //String smsTxt = mjonKakaoATResultVO.getSmsTxt(); + + KakaoReturnVO kakaoTemplateInfo = getKakaoFTSendTemplateInfo(mjonKakaoATResultVO); + model.addAttribute("kakaoTemplateInfo", kakaoTemplateInfo); + + if(StringUtils.isNotEmpty( mjonKakaoATResultVO.getFilePath1() )) { + List fileInfos = new ArrayList<>(); + + + // 확장자 제외한 파일명 + String fileId = FilenameUtils.getBaseName(mjonKakaoATResultVO.getFilePath1()); + + // 파일 정보 조회 + MjonMsgSentVO info = mjonMsgSentDAO.selectFileInfo(fileId); + + // FileInfo 객체 생성 및 추가 + FileInfoVO fileInfo = new FileInfoVO(); + fileInfo.setAtchFileId(info.getAtchFileId()); + fileInfo.setFileSn(info.getFileSn()); + + fileInfos.add(fileInfo); + model.addAttribute("fileInfos", fileInfos); + } + //kakaoTemplateInfo.setTemplateContent(smsTxt); + + + }else { + + model.addAttribute("kakaoTemplateInfo", ""); + + } + model.addAttribute("msgType", msgType); - if(msgType.equals("8")) {//카카오 알림톡인 경우 상세정보 처리 - - // 템플릿 api 가져오기 - KakaoVO kakaoVO = new KakaoVO(); - kakaoVO.setSenderKey(mjonKakaoATResultVO.getMsgNoticetalkSenderKey()); - kakaoVO.setTemplateCode(mjonKakaoATResultVO.getMsgNoticetalkTmpKey()); - - KakaoReturnVO kakaoTemplateInfo =kakaoApiTemplate.selectKakaoApiTemplateDetail(kakaoVO); - - model.addAttribute("kakaoTemplateInfo", kakaoTemplateInfo); - // //템플릿 api 가져오기 - - }else if(msgType.equals("9")) {//카카오 친구톡인 경우 상세정보 처리 - - //String smsTxt = mjonKakaoATResultVO.getSmsTxt(); - - KakaoReturnVO kakaoTemplateInfo = getKakaoFTSendTemplateInfo(mjonKakaoATResultVO); - //kakaoTemplateInfo.setTemplateContent(smsTxt); - - model.addAttribute("kakaoTemplateInfo", kakaoTemplateInfo); - - }else { - - model.addAttribute("kakaoTemplateInfo", ""); + } catch (Exception e) { + e.printStackTrace(); + // TODO: handle exception } - - model.addAttribute("msgType", msgType); return "web/kakao/sent/KakaoSentDetailPopAjax"; } } diff --git a/src/main/java/itn/let/mail/service/StatusResponse.java b/src/main/java/itn/let/mail/service/StatusResponse.java index 50649c95..91844fda 100644 --- a/src/main/java/itn/let/mail/service/StatusResponse.java +++ b/src/main/java/itn/let/mail/service/StatusResponse.java @@ -5,6 +5,7 @@ import java.time.LocalDateTime; import org.springframework.http.HttpStatus; import itn.let.mjo.pay.service.RefundVO; +import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; diff --git a/src/main/java/itn/let/mjo/msg/service/MjonMsgVO.java b/src/main/java/itn/let/mjo/msg/service/MjonMsgVO.java index 0e93135a..1dcfb200 100644 --- a/src/main/java/itn/let/mjo/msg/service/MjonMsgVO.java +++ b/src/main/java/itn/let/mjo/msg/service/MjonMsgVO.java @@ -165,6 +165,7 @@ public class MjonMsgVO extends ComDefaultVO{ private float smsPrice; // sms 단가 private float mmsPrice; // mms 단가 + private float picturePrice; // mms 단가 private float kakaoAtPrice; // 카카오 알림톡 단가 private float kakaoFtPrice; // 카카오 친구톡 단가 private float kakaoFtImgPrice;// 카카오 이미지 단가 @@ -301,6 +302,8 @@ public class MjonMsgVO extends ComDefaultVO{ private String bizLogCallStatusCode; //다우기술 biz_log 테이블의 발송결과 코드 값 성공/실패/대기 코드값 변환(성공:S, 대기:W, 실패:F). private String bizLogCallStatusTxt; //다우기술 biz_log 테이블의 발송결과 내용 텍스트. private String bizLogStatus; //다우기술 biz_log 테이블의 전송상태값 + + private String bizKakaoImageType; // 비즈 발송 img 값 private String accessKey; // 'API Key', diff --git a/src/main/java/itn/let/mjo/msg/service/impl/MjonMsgDAO.java b/src/main/java/itn/let/mjo/msg/service/impl/MjonMsgDAO.java index 5108b0ac..0c688dd0 100644 --- a/src/main/java/itn/let/mjo/msg/service/impl/MjonMsgDAO.java +++ b/src/main/java/itn/let/mjo/msg/service/impl/MjonMsgDAO.java @@ -455,6 +455,11 @@ public class MjonMsgDAO extends EgovAbstractDAO { update("mjonMsgDAO.updateKakaoAtDelayCancelMsgDataFlag", mjonMsgVO); } + // mj_msg_data 테이블 지연 알림톡 취소 값 수정 + public void updateRefundY(MjonMsgVO mjonMsgVO) { + update("mjonMsgDAO.updateRefundY", mjonMsgVO); + } + // mj_msg_group_data 테이블 지연 알림톡 취소 값 수정 public void updateKakaoAtDelayCancelMsgGroupDataFlag(MjonMsgVO mjonMsgVO) { update("mjonMsgDAO.updateKakaoAtDelayCancelMsgGroupDataFlag", mjonMsgVO); diff --git a/src/main/java/itn/let/mjo/msgsent/service/MjonMsgDetailSentDTO.java b/src/main/java/itn/let/mjo/msgsent/service/MjonMsgDetailSentDTO.java new file mode 100644 index 00000000..f37e7961 --- /dev/null +++ b/src/main/java/itn/let/mjo/msgsent/service/MjonMsgDetailSentDTO.java @@ -0,0 +1,22 @@ +package itn.let.mjo.msgsent.service; + +import java.util.List; + +import itn.let.cmm.vo.FileInfoVO; +import itn.let.uss.umt.service.UserDefaultVO; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class MjonMsgDetailSentDTO extends UserDefaultVO{ + + private static final long serialVersionUID = 1L; + + + private String userId; + private String callTo; + private String statusTxt; + + +} diff --git a/src/main/java/itn/let/mjo/msgsent/service/MjonMsgSentService.java b/src/main/java/itn/let/mjo/msgsent/service/MjonMsgSentService.java index ca2dbe0f..1e989d85 100644 --- a/src/main/java/itn/let/mjo/msgsent/service/MjonMsgSentService.java +++ b/src/main/java/itn/let/mjo/msgsent/service/MjonMsgSentService.java @@ -65,7 +65,7 @@ public interface MjonMsgSentService { public Map selectAllMsgSentDetailView(MjonMsgDetailSentVO mjonMsgDetailSentVO) throws Exception; - public List findByMsgDetailListAjax(MjonMsgDetailSentVO mjonMsgDetailSentVO); + public List findByMsgDetailListAjax(MjonMsgDetailSentVO mjonMsgDetailSentVO); public void msgSentExcelDownLoad(MjonMsgSentVO mjonMsgSentVO, HttpServletResponse response) throws IOException, Exception; diff --git a/src/main/java/itn/let/mjo/msgsent/service/impl/MjonMsgSentDAO.java b/src/main/java/itn/let/mjo/msgsent/service/impl/MjonMsgSentDAO.java index 7e1e84ae..3c1bfe6d 100644 --- a/src/main/java/itn/let/mjo/msgsent/service/impl/MjonMsgSentDAO.java +++ b/src/main/java/itn/let/mjo/msgsent/service/impl/MjonMsgSentDAO.java @@ -9,6 +9,7 @@ import egovframework.rte.psl.dataaccess.EgovAbstractDAO; import itn.let.fax.addr.service.FaxAddrGroupVO; import itn.let.mjo.addr.service.AddrGroupVO; import itn.let.mjo.block.service.MjonBlockVO; +import itn.let.mjo.msgsent.service.MjonMsgDetailSentDTO; import itn.let.mjo.msgsent.service.MjonMsgDetailSentVO; import itn.let.mjo.msgsent.service.MjonMsgSWFDTO; import itn.let.mjo.msgsent.service.MjonMsgSentVO; @@ -182,9 +183,9 @@ public class MjonMsgSentDAO extends EgovAbstractDAO { return (MjonMsgDetailSentVO) select("MjonMsgSentDAO.selectAllMsgSentDetailView", mjonMsgDetailSentVO); } - public List findByMsgDetailListAjax(MjonMsgDetailSentVO mjonMsgDetailSentVO) { + public List findByMsgDetailListAjax(MjonMsgDetailSentVO mjonMsgDetailSentVO) { - return (List) list("MjonMsgSentDAO.findByMsgDetailListAjax", mjonMsgDetailSentVO); + return (List) list("MjonMsgSentDAO.findByMsgDetailListAjax", mjonMsgDetailSentVO); } public List findByReqDateWhereMsgGroupId(String msgGroupId) { diff --git a/src/main/java/itn/let/mjo/msgsent/service/impl/MjonMsgSentServiceImpl.java b/src/main/java/itn/let/mjo/msgsent/service/impl/MjonMsgSentServiceImpl.java index 037f6548..d25a9490 100644 --- a/src/main/java/itn/let/mjo/msgsent/service/impl/MjonMsgSentServiceImpl.java +++ b/src/main/java/itn/let/mjo/msgsent/service/impl/MjonMsgSentServiceImpl.java @@ -39,6 +39,7 @@ import itn.let.cmm.vo.FileInfoVO; import itn.let.fax.addr.service.FaxAddrGroupVO; import itn.let.mjo.addr.service.AddrGroupVO; import itn.let.mjo.block.service.MjonBlockVO; +import itn.let.mjo.msgsent.service.MjonMsgDetailSentDTO; import itn.let.mjo.msgsent.service.MjonMsgDetailSentVO; import itn.let.mjo.msgsent.service.MjonMsgSWFDTO; import itn.let.mjo.msgsent.service.MjonMsgSentService; @@ -474,9 +475,9 @@ public class MjonMsgSentServiceImpl extends EgovAbstractServiceImpl implements } @Override - public List findByMsgDetailListAjax(MjonMsgDetailSentVO mjonMsgDetailSentVO) { + public List findByMsgDetailListAjax(MjonMsgDetailSentVO mjonMsgDetailSentVO) { - List list = mjonMsgSentDAO.findByMsgDetailListAjax(mjonMsgDetailSentVO); + List list = mjonMsgSentDAO.findByMsgDetailListAjax(mjonMsgDetailSentVO); list.stream().forEach(t->{ t.setCallTo(StringUtil2.formatPhone(t.getCallTo())); }); diff --git a/src/main/java/itn/let/mjo/msgsent/web/MjonMsgSentController.java b/src/main/java/itn/let/mjo/msgsent/web/MjonMsgSentController.java index c33fe418..fbe0e39a 100644 --- a/src/main/java/itn/let/mjo/msgsent/web/MjonMsgSentController.java +++ b/src/main/java/itn/let/mjo/msgsent/web/MjonMsgSentController.java @@ -50,6 +50,7 @@ import itn.let.mjo.addr.service.AddrService; import itn.let.mjo.addr.service.AddrVO; import itn.let.mjo.apikey.service.ApiKeyMngService; import itn.let.mjo.apikey.service.ApiKeyVO; +import itn.let.mjo.msgsent.service.MjonMsgDetailSentDTO; import itn.let.mjo.msgsent.service.MjonMsgDetailSentVO; import itn.let.mjo.msgsent.service.MjonMsgSentCntVO; import itn.let.mjo.msgsent.service.MjonMsgSentService; @@ -191,7 +192,17 @@ private static final Logger logger = LoggerFactory.getLogger(MjonMsgSentControll public ResponseEntity findByMsgDetailListAjax(MjonMsgDetailSentVO mjonMsgDetailSentVO) throws Exception { - List resultList = mjonMsgSentService.findByMsgDetailListAjax(mjonMsgDetailSentVO); + List resultList = new ArrayList<>(); + try { + + resultList = mjonMsgSentService.findByMsgDetailListAjax(mjonMsgDetailSentVO); + } catch (Exception e) { + e.printStackTrace(); + // TODO: handle exception + } + log.info("resultList :: [{}]", resultList.size()); +// resultList = resultList.subList(0, 275000); +// log.info("resultList :: [{}]", resultList.size()); return ResponseEntity.ok().body(new StatusResponse(HttpStatus.OK, "", resultList)); diff --git a/src/main/java/itn/let/mjo/pay/service/MjonPayVO.java b/src/main/java/itn/let/mjo/pay/service/MjonPayVO.java index a1de761d..5846e56e 100644 --- a/src/main/java/itn/let/mjo/pay/service/MjonPayVO.java +++ b/src/main/java/itn/let/mjo/pay/service/MjonPayVO.java @@ -236,6 +236,8 @@ public class MjonPayVO extends ComDefaultVO{ private int remainPoint; + private String userData; + private String totChgPay; // 간편결제분류 diff --git a/src/main/java/itn/let/mjo/pay/service/impl/MjonPayDAO.java b/src/main/java/itn/let/mjo/pay/service/impl/MjonPayDAO.java index 795495b7..ea5b7a39 100644 --- a/src/main/java/itn/let/mjo/pay/service/impl/MjonPayDAO.java +++ b/src/main/java/itn/let/mjo/pay/service/impl/MjonPayDAO.java @@ -5,6 +5,7 @@ import java.util.List; import org.springframework.stereotype.Repository; import egovframework.rte.psl.dataaccess.EgovAbstractDAO; +import itn.let.kakao.kakaoComm.BizKakaoPriceVO; import itn.let.mjo.pay.service.MjonPayVO; import itn.let.mjo.pay.service.MjonVaMsgLogVO; import itn.let.mjo.pay.service.RefundVO; @@ -45,6 +46,10 @@ public class MjonPayDAO extends EgovAbstractDAO { public MjonPayVO selectCashVO(MjonPayVO mjonPayVO) throws Exception{ return (MjonPayVO)select("mjonPayDAO.selectCashVO", mjonPayVO); } + + public BizKakaoPriceVO selectBizKakaoPrice(String msgGroupId) throws Exception{ + return (BizKakaoPriceVO)select("mjonPayDAO.selectBizKakaoPrice", msgGroupId); + } public void insertCash(MjonPayVO mjonPayVO) throws Exception{ diff --git a/src/main/java/itn/let/module/base/PriceAndPoint.java b/src/main/java/itn/let/module/base/PriceAndPoint.java index d4f190f1..f640732f 100644 --- a/src/main/java/itn/let/module/base/PriceAndPoint.java +++ b/src/main/java/itn/let/module/base/PriceAndPoint.java @@ -5,18 +5,27 @@ import java.math.RoundingMode; import javax.annotation.Resource; +import org.apache.commons.lang.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import egovframework.rte.fdl.cmmn.exception.FdlException; import egovframework.rte.fdl.idgnr.EgovIdGnrService; +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.impl.KakaoAlimTalkDAO; import itn.let.mjo.event.service.MjonEventService; import itn.let.mjo.event.service.MjonEventVO; import itn.let.mjo.event.service.impl.MjonEventDAO; import itn.let.mjo.msg.service.MjonMsgVO; +import itn.let.mjo.msgdata.service.MjonMsgDataService; import itn.let.mjo.msgdata.service.impl.MjonMsgDataDAO; import itn.let.mjo.pay.service.MjonPayVO; import itn.let.mjo.pay.service.impl.MjonPayDAO; +import itn.let.sym.site.service.JoinSettingVO; import itn.let.uss.umt.service.MberManageVO; +import lombok.extern.slf4j.Slf4j; /** * @@ -32,6 +41,7 @@ import itn.let.uss.umt.service.MberManageVO; * * */ +@Slf4j @Component public class PriceAndPoint { @@ -46,6 +56,11 @@ public class PriceAndPoint { @Resource(name = "egovMjonCashIdGnrService") private EgovIdGnrService idgenMjonCashId; + + @Resource(name="kakaoAlimTalkDAO") + private KakaoAlimTalkDAO kakaoAlimTalkDAO; + + /** * @methodName : getBefCash @@ -114,19 +129,90 @@ public class PriceAndPoint { , String msgGroupId ) throws Exception { - MjonPayVO mjonPayVO = new MjonPayVO(); - mjonPayVO.setCashId(idgenMjonCashId.getNextStringId()); - mjonPayVO.setUserId(userId); - System.out.println(" + totPrice :: "+ totPrice); - mjonPayVO.setCash(totPrice); - mjonPayVO.setFrstRegisterId(userId); - mjonPayVO.setMemo(memo); - mjonPayVO.setMsgGroupId(msgGroupId); +// MjonPayVO mjonPayVO = new MjonPayVO(); +// mjonPayVO.setCashId(idgenMjonCashId.getNextStringId()); +// mjonPayVO.setUserId(userId); +// System.out.println(" + totPrice :: "+ totPrice); +// mjonPayVO.setCash(totPrice); +// mjonPayVO.setFrstRegisterId(userId); +// mjonPayVO.setMemo(memo); +// mjonPayVO.setMsgGroupId(msgGroupId); + insertCashAndPoint(userId, totPrice, memo, msgGroupId, null); + +// mjonPayDAO.insertCash(mjonPayVO); //캐시 +// mjonPayDAO.updateMemberCash(mjonPayVO); //회원정보 업데이트 + + } + /** + * @methodName : insertCashAndPoint + * @author : 이호영 + * @date : 2025. 7. 17. + * @description : insertCashAndPoint 에서 환불으로 인해 userData 추가 + * @return : void + * @param userId + * @param totPrice + * @param memo + * @param msgGroupId + * @param userData + * @throws Exception + * + */ + public void insertCashAndPoint( + String userId + , float totPrice + , String memo + , String msgGroupId + , String userData + ) throws Exception { + + MjonPayVO mjonPayVO = buildPayVO(userId, totPrice, memo, msgGroupId); + +// 환불로 인해 userData가 추후 사용될 경우 여기에 처리 + if (StringUtils.isNotEmpty(userData)) { mjonPayVO.setOrderId(userData); } + mjonPayDAO.insertCash(mjonPayVO); //캐시 mjonPayDAO.updateMemberCash(mjonPayVO); //회원정보 업데이트 } + + private MjonPayVO buildPayVO(String userId, float totPrice, String memo, String msgGroupId) throws FdlException { + MjonPayVO vo = new MjonPayVO(); + vo.setCashId(idgenMjonCashId.getNextStringId()); + vo.setUserId(userId); + vo.setCash(totPrice); + vo.setFrstRegisterId(userId); + vo.setMemo(memo); + vo.setMsgGroupId(msgGroupId); + System.out.println(" + totPrice :: " + totPrice); + return vo; + } + + public void insertBizFtKakaoPrice(String userId, String msgGroupId) throws Exception { + KakaoVO kakaoVO = new KakaoVO(); + + System.out.println("======================="); + // 사용자 개인 단가 정보 불러오기 + MberManageVO mberManageVO = mjonMsgDataDAO.selectMberManageInfo(userId); + // 시스템 기본 단가 정보 불러오기 + JoinSettingVO sysJoinSetVO = mjonMsgDataDAO.selectJoinSettingInfo(); + KakaoSendUtil.getValidPrice(mberManageVO.getShortPrice(), sysJoinSetVO.getShortPrice()); + // TODO Auto-generated method stub + kakaoVO.setMsgGroupId(msgGroupId); + + kakaoVO.setSmsPrice(KakaoSendUtil.getValidPrice(mberManageVO.getShortPrice(), sysJoinSetVO.getShortPrice())); + kakaoVO.setMmsPrice(KakaoSendUtil.getValidPrice(mberManageVO.getLongPrice(), sysJoinSetVO.getLongPrice())); + kakaoVO.setPicturePrice(KakaoSendUtil.getValidPrice(mberManageVO.getPicturePrice(), sysJoinSetVO.getPicturePrice())); + + kakaoVO.setKakaoFtPrice(KakaoSendUtil.getValidPrice(mberManageVO.getKakaoFtPrice(), sysJoinSetVO.getKakaoFtPrice())); + kakaoVO.setKakaoFtImgPrice(KakaoSendUtil.getValidPrice(mberManageVO.getKakaoFtImgPrice(), sysJoinSetVO.getKakaoFtImgPrice())); + kakaoVO.setKakaoFtWideImgPrice(KakaoSendUtil.getValidPrice(mberManageVO.getKakaoFtWideImgPrice(), sysJoinSetVO.getKakaoFtWideImgPrice())); + + + + kakaoAlimTalkDAO.insertKakaoSendPrice(kakaoVO); + + } } \ No newline at end of file diff --git a/src/main/java/itn/let/schdlr/service/impl/SchdlrManageServiceImpl.java b/src/main/java/itn/let/schdlr/service/impl/SchdlrManageServiceImpl.java index ada754d1..aa1757ad 100644 --- a/src/main/java/itn/let/schdlr/service/impl/SchdlrManageServiceImpl.java +++ b/src/main/java/itn/let/schdlr/service/impl/SchdlrManageServiceImpl.java @@ -444,7 +444,7 @@ public class SchdlrManageServiceImpl extends EgovAbstractServiceImpl implements kakaoAlimTalkService.selectKakaoAtSentRefundList(); // 카카오 친구톡 환불 처리 -// kakaoAlimTalkService.selectKakaoFtSentRefundList(); + kakaoAlimTalkService.selectKakaoFtSentRefundList(); } diff --git a/src/main/java/itn/let/sym/site/service/JoinSettingVO.java b/src/main/java/itn/let/sym/site/service/JoinSettingVO.java index a76eca53..f64ba44f 100644 --- a/src/main/java/itn/let/sym/site/service/JoinSettingVO.java +++ b/src/main/java/itn/let/sym/site/service/JoinSettingVO.java @@ -1,5 +1,12 @@ package itn.let.sym.site.service; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; + /** * 로그인정책에 대한 VO 클래스를 정의한다. * 로그인정책정보의 목록 항목을 관리한다. @@ -18,13 +25,18 @@ package itn.let.sym.site.service; * * */ + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@Builder +@ToString public class JoinSettingVO { /** * serialVersionUID */ - @SuppressWarnings("unused") - private static final long serialVersionUID = 1L; private float shortPrice; // 단문 단가 private float longPrice; //장문 단가 @@ -37,6 +49,9 @@ public class JoinSettingVO { private float customTextPrice; // 텍스트 단순수정 private float kakaoAtPrice; // 카카오 알림톡 단가 private float kakaoFtPrice; // 카카오 친구톡 단가 + private float kakaoFtImgPrice; // 카카오 친구톡 이미지 단가 + private float kakaoFtWideImgPrice; // 카카오 친구톡 와이드 단가 + private float faxPrice; // 팩스 단가 private float refundPer; //환불 비율 @@ -51,188 +66,5 @@ public class JoinSettingVO { private String smishingNoti; //첫결제(카드제외) 스미싱의심 알림 여부 private String holiSmishingNoti; //야간 스미싱알림 여부 - public String getSmishingNoti() { - return smishingNoti; - } - - public void setSmishingNoti(String smishingNoti) { - this.smishingNoti = smishingNoti; - } - - public float getShortPrice() { - return shortPrice; - } - - public void setShortPrice(float shortPrice) { - this.shortPrice = shortPrice; - } - - public float getLongPrice() { - return longPrice; - } - - public void setLongPrice(float longPrice) { - this.longPrice = longPrice; - } - - public float getPicturePrice() { - return picturePrice; - } - - public void setPicturePrice(float picturePrice) { - this.picturePrice = picturePrice; - } - - public float getPicture2Price() { - return picture2Price; - } - - public void setPicture2Price(float picture2Price) { - this.picture2Price = picture2Price; - } - - public float getPicture3Price() { - return picture3Price; - } - - public void setPicture3Price(float picture3Price) { - this.picture3Price = picture3Price; - } - - public float getCustomSamplePrice() { - return customSamplePrice; - } - - public void setCustomSamplePrice(float customSamplePrice) { - this.customSamplePrice = customSamplePrice; - } - - public float getCustomEditPrice() { - return customEditPrice; - } - - public void setCustomEditPrice(float customEditPrice) { - this.customEditPrice = customEditPrice; - } - - public float getCustomEdit3Price() { - return customEdit3Price; - } - - public void setCustomEdit3Price(float customEdit3Price) { - this.customEdit3Price = customEdit3Price; - } - - public float getCustomTextPrice() { - return customTextPrice; - } - - public void setCustomTextPrice(float customTextPrice) { - this.customTextPrice = customTextPrice; - } - - public float getRefundPer() { - return refundPer; - } - - public void setRefundPer(float refundPer) { - this.refundPer = refundPer; - } - - public float getJoinCash() { - return joinCash; - } - - public void setJoinCash(float joinCash) { - this.joinCash = joinCash; - } - - public float getPointPer() { - return pointPer; - } - - public void setPointPer(float pointPer) { - this.pointPer = pointPer; - } - - public String getLasUpdusrId() { - return lasUpdusrId; - } - - public void setLasUpdusrId(String lasUpdusrId) { - this.lasUpdusrId = lasUpdusrId; - } - - public String getLastUpdtPnttm() { - return lastUpdtPnttm; - } - - public void setLastUpdtPnttm(String lastUpdtPnttm) { - this.lastUpdtPnttm = lastUpdtPnttm; - } - - public String getJoinCertType() { - return joinCertType; - } - - public void setJoinCertType(String joinCertType) { - this.joinCertType = joinCertType; - } - - public String getSmsNoti() { - return smsNoti; - } - - public void setSmsNoti(String smsNoti) { - this.smsNoti = smsNoti; - } - - public String getEmailNoti() { - return emailNoti; - } - - public void setEmailNoti(String emailNoti) { - this.emailNoti = emailNoti; - } - - public String getSlackNoti() { - return slackNoti; - } - - public void setSlackNoti(String slackNoti) { - this.slackNoti = slackNoti; - } - - public float getKakaoAtPrice() { - return kakaoAtPrice; - } - - public void setKakaoAtPrice(float kakaoAtPrice) { - this.kakaoAtPrice = kakaoAtPrice; - } - - public float getKakaoFtPrice() { - return kakaoFtPrice; - } - - public void setKakaoFtPrice(float kakaoFtPrice) { - this.kakaoFtPrice = kakaoFtPrice; - } - - public float getFaxPrice() { - return faxPrice; - } - - public void setFaxPrice(float faxPrice) { - this.faxPrice = faxPrice; - } - - public String getHoliSmishingNoti() { - return holiSmishingNoti; - } - - public void setHoliSmishingNoti(String holiSmishingNoti) { - this.holiSmishingNoti = holiSmishingNoti; - } } diff --git a/src/main/resources/egovframework/sqlmap/let/mjo/kakao/KakaoSent_SQL_Mysql.xml b/src/main/resources/egovframework/sqlmap/let/mjo/kakao/KakaoSent_SQL_Mysql.xml index c8930144..c5119e08 100644 --- a/src/main/resources/egovframework/sqlmap/let/mjo/kakao/KakaoSent_SQL_Mysql.xml +++ b/src/main/resources/egovframework/sqlmap/let/mjo/kakao/KakaoSent_SQL_Mysql.xml @@ -909,7 +909,7 @@ + /* KakaoSentDAO.selectKakaoSentDetailViewPhoneAjax */ SELECT MGD.MSG_GROUP_ID as msgGroupId diff --git a/src/main/resources/egovframework/sqlmap/let/mjo/kakao/Kakao_AT_SQL_Mysql.xml b/src/main/resources/egovframework/sqlmap/let/mjo/kakao/Kakao_AT_SQL_Mysql.xml index 4f1cfa20..0864e4f6 100644 --- a/src/main/resources/egovframework/sqlmap/let/mjo/kakao/Kakao_AT_SQL_Mysql.xml +++ b/src/main/resources/egovframework/sqlmap/let/mjo/kakao/Kakao_AT_SQL_Mysql.xml @@ -72,12 +72,16 @@ , SMS_TXT , BIZ_KAKAO_TITLE + , AD_FLAG + , FILE_PATH1 , BIZ_KAKAO_RESEND_YN , BIZ_KAKAO_RESEND_DATA , BIZ_KAKAO_RESEND_TYPE , BIZ_KAKAO_JSON_FILE , REQ_DATE + + , FILE_CNT )VALUES ( @@ -95,12 +99,16 @@ , #[].templateContent# , #[].templateTitle# + , #[].adFlag# + , #[].filePath1# , #[].subMsgSendYn# , #[].subMsgTxt# , #[].subMsgType# , #[].bizJsonName# , #[].reqDate# + + , #[].fileCnt# ) @@ -131,6 +139,7 @@ REQ_DATE, MSG_GROUP_CNT, MSG_TYPE, + AD_FLAG, AGENT_CODE, EACH_PRICE, @@ -142,7 +151,8 @@ AT_DELAY_YN, BIZ_KAKAO_RESEND_ORGNL_TXT, - BIZ_KAKAO_RESEND_TYPE + BIZ_KAKAO_RESEND_TYPE, + BIZ_KAKAO_IMAGE_TYPE )VALUES ( #msgGroupId#, @@ -153,6 +163,7 @@ #reqDate#, #msgGroupCnt#, #msgType#, + #adFlag#, #agentCode#, #eachPrice#, @@ -164,7 +175,8 @@ #atDelayYn#, #bizKakaoResendOrgnlTxt#, - #bizKakaoResendType# + #bizKakaoResendType#, + #bizKakaoImageType# ) @@ -178,6 +190,7 @@ , BIZ_KAKAO_FT_WIDE_IMG_PRICE , BIZ_SMS_PRICE , BIZ_MMS_PRICE + , BIZ_PICTURE_PRICE ) VALUES ( @@ -188,6 +201,7 @@ ,#kakaoFtWideImgPrice# ,#smsPrice# ,#mmsPrice# + ,#picturePrice# ) @@ -222,6 +236,8 @@ MMD.USER_ID AS userId , MMD.MSG_GROUP_ID AS msgGroupId , MMD.MSG_SEQ AS msgSeq + , MMGD.BIZ_KAKAO_IMAGE_TYPE AS bizKakaoImageType + , MMGD.EACH_PRICE AS eachPrice , MMD.USERDATA AS userData , MMD.REFUND_YN AS refundYn , MMD.RSLT_CODE AS rsltCode @@ -231,11 +247,14 @@ , DATE_FORMAT(MMD.RSLT_DATE,'%Y-%m-%d %T') AS rsltDate , MMD.BIZ_KAKAO_RESEND_YN AS subMsgSendYn , MMD.BIZ_KAKAO_RESEND_TYPE AS subMsgType - + , MMD.FILE_CNT AS fileCnt + , MMD.BIZ_UMID AS bizUmid FROM MJ_MSG_DATA MMD INNER JOIN LETTNGNRLMBER MB ON MMD.USER_ID = MB.MBER_ID + INNER JOIN mj_msg_group_data MMGD + on MMD.MSG_GROUP_ID = MMGD.MSG_GROUP_ID WHERE 1=1 AND MMD.CUR_STATE = '3' AND MMD.REFUND_YN = 'N' @@ -252,6 +271,15 @@ AND USERDATA = #userData# + + {call kakaoAt_Send(#userId#, #msgGroupId#, #userData#)} @@ -271,7 +299,7 @@ - {call kakaoFt_Send(#userId#, #msgGroupId#, #userData#)} + {call kakaoFt_Send(#userId#, #msgGroupId#, #userData#, #fileCnt#, #bizKakaoResendType#, #bizKakaoImageType#)} diff --git a/src/main/resources/egovframework/sqlmap/let/mjo/kakao/Kakao_FT_SQL_Mysql.xml b/src/main/resources/egovframework/sqlmap/let/mjo/kakao/Kakao_FT_SQL_Mysql.xml index e2a3a345..1f9a1186 100644 --- a/src/main/resources/egovframework/sqlmap/let/mjo/kakao/Kakao_FT_SQL_Mysql.xml +++ b/src/main/resources/egovframework/sqlmap/let/mjo/kakao/Kakao_FT_SQL_Mysql.xml @@ -37,7 +37,7 @@ VALUES ( #friendId# , #userId# - , #bizJsonName# + , #atchFileId# , #templateName# , #imageFileName# , #templateImageUrl# @@ -200,6 +200,7 @@ A.IMAGE_TYPE AS imageType, A.IMAGE_TITLE AS imgTitle, A.IMAGE_LINK AS imgLink, + A.ATCH_FILE_ID AS atchFileId, A.TEMPLATE_CONTENTS AS templateContent, A.AD_FLAG AS adFlag, DATE_FORMAT(A.FRST_REGIST_PNTTM, '%Y-%m-%d %T') AS frstRegistPnttm, @@ -215,6 +216,7 @@ KFT.IMAGE_TYPE, KFT.IMAGE_TITLE, KFT.IMAGE_LINK, + KFT.ATCH_FILE_ID, KFT.TEMPLATE_CONTENTS, KFT.AD_FLAG, KFT.FRST_REGIST_PNTTM, diff --git a/src/main/resources/egovframework/sqlmap/let/msg/MjonMsgData_SQL_mysql.xml b/src/main/resources/egovframework/sqlmap/let/msg/MjonMsgData_SQL_mysql.xml index e924647a..d441861d 100644 --- a/src/main/resources/egovframework/sqlmap/let/msg/MjonMsgData_SQL_mysql.xml +++ b/src/main/resources/egovframework/sqlmap/let/msg/MjonMsgData_SQL_mysql.xml @@ -2151,6 +2151,8 @@ , POINT_PER AS pointPer , KAKAO_AT_PRICE AS kakaoAtPrice , KAKAO_FT_PRICE AS kakaoFtPrice + , KAKAO_FT_IMG_PRICE AS kakaoFtImgPrice + , KAKAO_FT_WIDE_IMG_PRICE AS kakaoFtWideImgPrice , FAX_PRICE AS faxPrice FROM MJ_MBER_SETTING @@ -2169,6 +2171,8 @@ , PICTURE3_PRICE AS picture3Price , KAKAO_AT_PRICE AS kakaoAtPrice , KAKAO_FT_PRICE AS kakaoFtPrice + , KAKAO_FT_IMG_PRICE AS kakaoFtImgPrice + , KAKAO_FT_WIDE_IMG_PRICE AS kakaoFtWideImgPrice , FAX_PRICE AS faxPrice , USER_MONEY AS userMoney , USER_POINT AS userPoint @@ -7431,6 +7435,17 @@ + + + UPDATE MJ_MSG_DATA + SET REFUND_YN = 'Y' + WHERE + USER_ID = #userId# + AND USERDATA = #userData# + AND MSG_GROUP_ID = #msgGroupId# + + + UPDATE diff --git a/src/main/resources/egovframework/sqlmap/let/msg/MjonMsgSent_SQL_mysql.xml b/src/main/resources/egovframework/sqlmap/let/msg/MjonMsgSent_SQL_mysql.xml index 752eec93..b93540e7 100644 --- a/src/main/resources/egovframework/sqlmap/let/msg/MjonMsgSent_SQL_mysql.xml +++ b/src/main/resources/egovframework/sqlmap/let/msg/MjonMsgSent_SQL_mysql.xml @@ -7,6 +7,7 @@ + @@ -389,7 +390,7 @@ - /* MjonMsgSentDAO.findByMsgDetailListAjax*/ SELECT diff --git a/src/main/resources/egovframework/sqlmap/let/pay/MjonPay_SQL_mysql.xml b/src/main/resources/egovframework/sqlmap/let/pay/MjonPay_SQL_mysql.xml index 01e0bdb8..f22eb8fd 100644 --- a/src/main/resources/egovframework/sqlmap/let/pay/MjonPay_SQL_mysql.xml +++ b/src/main/resources/egovframework/sqlmap/let/pay/MjonPay_SQL_mysql.xml @@ -3,10 +3,11 @@ ========= ======= ================================================= 2021.03.01 신명섭 --> - + + @@ -606,6 +607,7 @@ MEMO, ORDER_ID, MSG_GROUP_ID + )VALUES ( #userId#, @@ -624,6 +626,22 @@ + + + + INSERT INTO MJ_PG ( diff --git a/src/main/webapp/WEB-INF/jsp/web/kakao/include/KaKaoAlimtalkSubMenuTap.jsp b/src/main/webapp/WEB-INF/jsp/web/kakao/include/KaKaoAlimtalkSubMenuTap.jsp index 57fc628d..391fbd4e 100644 --- a/src/main/webapp/WEB-INF/jsp/web/kakao/include/KaKaoAlimtalkSubMenuTap.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/kakao/include/KaKaoAlimtalkSubMenuTap.jsp @@ -90,6 +90,6 @@ function fnLinkPageTab(tabInfo){
  • -
  • +
  • \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/jsp/web/kakao/include/KaKaoAlimtalkTopMenuTap.jsp b/src/main/webapp/WEB-INF/jsp/web/kakao/include/KaKaoAlimtalkTopMenuTap.jsp index d0e25dd8..f107beaf 100644 --- a/src/main/webapp/WEB-INF/jsp/web/kakao/include/KaKaoAlimtalkTopMenuTap.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/kakao/include/KaKaoAlimtalkTopMenuTap.jsp @@ -143,7 +143,9 @@ function cntntBtnInfo(stepInfo){
    • + || pageContext.request.serverName == '119.193.215.98' + || pageContext.request.serverName == '192.168.0.176' + }">
    • 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 d5b2e0da..754529ff 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 @@ -762,7 +762,7 @@ function sendTemplateInfo(){ // $('.loading_layer').removeClass('active'); // 프로그래스 바 종료 - progressComplete();; + progressComplete(); } ,error: function (e) { console.log("ERROR : ", e); diff --git a/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/ft/KakaoFriendsTalkMsgDataView.jsp b/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/ft/KakaoFriendsTalkMsgDataView.jsp index ab93209a..968da1ce 100644 --- a/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/ft/KakaoFriendsTalkMsgDataView.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/ft/KakaoFriendsTalkMsgDataView.jsp @@ -5,15 +5,17 @@ <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> <%@ taglib prefix="ec" uri="/WEB-INF/tld/ecnet_tld.tld"%> <%@ page import="itn.com.cmm.LoginVO" %> - + - + - + + + @@ -1695,6 +1666,19 @@ function msgResultLink(){ + +
      +
      +

      0%

      +
      + +
      +
      +
      +
      + +
      +
      @@ -1702,8 +1686,9 @@ function msgResultLink(){
      -

      친구톡 전송

      - +

      친구톡 전송

      + +
      @@ -1711,8 +1696,12 @@ function msgResultLink(){ + + + +
      @@ -1722,9 +1711,12 @@ function msgResultLink(){ - + + + + @@ -1753,9 +1745,8 @@ function msgResultLink(){ - - - + + @@ -1786,63 +1777,76 @@ function msgResultLink(){ 템플릿명 - -

      최대 50자, 템플릿 관리용

      +
      + + + + + + +
      이미지 첨부 -
      - checked > - checked > - checked > -
      -

      * 이미지 첨부 안내

      -
        -
      • - 권장사이즈 : 720px * 720px
      • + + + + + + + +
        +

        * 이미지 첨부 안내

        +
          +
        • - 권장사이즈 : 800px * 400px
        • - 제한사이즈 : 가로 500px 미만, 가로:세로 비율이 2:1 미만 또는 3:4 초과시 업로드 불가
        • -
        • - 파일형식 : jpg, png (최대 500kb)
        • -
        • - 이미지 첨부시 메시지 내용은 최대 400자까지 입력할 수 있습니다.
        • -
        -
        -
        -

        * 와이드 이미지 첨부 안내

        -
          -
        • - 권장사이즈 : 800px * 600px
        • - -
        • - 파일형식 : jpg, png (최대 2mb)
        • -
        • - 와이드 이미지 첨부시 메시지 내용은 최대 76자, 버튼 1개까지 입력할 수 있습니다.
        • -
        -
        -
      -
      -
        -
      • -

        이미지 제목

        - -
      • -
      • -

        이미지 클릭시 이동할 URL

        - -
      • -
      • -

        첨부파일 이미지

        - -
      • +
      • - 파일형식 : jpg, png (최대 5MB)
      • +
      • - 이미지 첨부 시 메시지 내용은 최대 400자, 버튼 5개까지 입력할 수 있습니다.
      - -
      +
      +

      * 와이드 이미지 첨부 안내

      +
        +
      • - 권장사이즈 : 800px * 600px
      • +
      • - 파일형식 : jpg, png (최대 5MB)
      • +
      • - 와이드 이미지 첨부시 메시지 내용은 최대 76자, 버튼 1개까지 입력할 수 있습니다.
      • +
      + + +
      +
        +
      • + + +
        +

        이미지 없음

        + +
        +
      • +
      • +

        이미지 클릭시 이동할 URL

        + +
      • +
      + 광고포함 여부 - checked > - <%-- checked > --%> + + @@ -1850,14 +1854,14 @@ function msgResultLink(){
      -
      -

      (광고) 채널ID

      +
      +

      (광고) 채널ID

      -
      -

      수신거부 : 홈 > 채널차단

      +
      +

      수신거부 : 홈 > 채널차단

      0 /1000

      @@ -1960,13 +1964,13 @@ function msgResultLink(){

      주소록, 엑셀에 입력된 내용을 이용해 수신자마다 다른 내용의 메시지를 발송하는 기능

      - +
      - - - - + + + +
      @@ -1980,25 +1984,16 @@ function msgResultLink(){
      - - - - - - - -
      - - - - - - - - - +
      @@ -2009,16 +2004,13 @@ function msgResultLink(){ -

      - * 버튼 타입중 봇키워드, 메시지전달카카오톡 채널 관리자센터(https://center-pf.kakao.com)에서 설정을 직접 한 후 이용하셔야 동작합니다. (최대 5개까지 등록가능) -

      -
      +
      @@ -2153,7 +2145,7 @@ function msgResultLink(){
      - + * 중복번호는 한번만 발송됩니다.
      @@ -2183,7 +2175,7 @@ function msgResultLink(){
      - +
      @@ -2191,13 +2183,13 @@ function msgResultLink(){
      -
      +
      @@ -2280,11 +2272,26 @@ function msgResultLink(){
      -
        - +
          + + +
        - + +
        +

        (광고)

        +
        +
        +
        +

        무료거부 0808800858

        +

        0 / @@ -2296,7 +2303,7 @@ function msgResultLink(){

        - +
        @@ -2310,7 +2317,7 @@ function msgResultLink(){
        -
        +

        @@ -2318,9 +2325,9 @@ function msgResultLink(){

        -

        - (광고) - 채널ID +

        + + (광고)