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/MJUtil.java b/src/main/java/itn/com/cmm/util/MJUtil.java index a0dc9411..7029522a 100644 --- a/src/main/java/itn/com/cmm/util/MJUtil.java +++ b/src/main/java/itn/com/cmm/util/MJUtil.java @@ -318,4 +318,17 @@ public final class MJUtil { return dupliBlockList; } + /** + * 사업자등록번호 대시('-') 추가 + * 대시 유무 상관없음 + * 유효성 맞지 않을시 변환안됨. + */ + public static String bizNoAddDash(String str) { + if(str == null) { + return str; + } + String regExp = "(\\d{3})(\\d{2})(\\d{5})$"; + String chgf = "$1-$2-$3"; + return str.replaceFirst(regExp, chgf); + } } diff --git a/src/main/java/itn/com/cmm/util/MsgSendUtils.java b/src/main/java/itn/com/cmm/util/MsgSendUtils.java index 03f5f426..e7409a87 100644 --- a/src/main/java/itn/com/cmm/util/MsgSendUtils.java +++ b/src/main/java/itn/com/cmm/util/MsgSendUtils.java @@ -466,7 +466,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 b7c3758a..ccb4fe8c 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:미사용) private String sendKind; //문자전송 타입(H:홈페이지, A:API) // ===== @@ -54,6 +60,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 단가 @@ -63,6 +70,9 @@ public class KakaoSendAdvcVO implements Serializable { private String atDelayYn; // 카카오 알림톡 단가 private String bizKakaoResendOrgnlTxt; // 카카오 알림톡 단가 private String bizKakaoResendType; // 카카오 알림톡 단가 + private String filePath1; // 대체문자 이미지 + private String fileCnt; // 파일 카운트 + private String bizKakaoImageType; // 파일 카운트 @@ -84,7 +94,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 + "]" + @@ -105,6 +115,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 653dc996..fbf2e915 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("#\\{[^}]+\\}"); @@ -141,7 +158,7 @@ public class KakaoSendUtil { log.info(""); /** @공통 기본값 */ - KakaoSendAdvcVO sendVO = createSendVO(kakaoVO); + KakaoSendAdvcVO sendVO = createATSendVO(kakaoVO); String msgId = idList.get(i); sendVO.setMsgId(msgId); @@ -284,19 +301,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 설정 @@ -310,6 +574,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 : 이호영 @@ -320,14 +609,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; } @@ -389,7 +709,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; } @@ -703,6 +1023,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 인경우 @@ -714,7 +1038,9 @@ public class KakaoSendUtil { // 사용자 개인 단가가 없으면 시스템 단가로 if(mberManageVO.getLongPrice() == 0.0f) mberManageVO.setLongPrice(sysJoinSetVO.getLongPrice()); - + + if(mberManageVO.getPicturePrice() == 0.0f) + mberManageVO.setPicturePrice(sysJoinSetVO.getPicturePrice()); return mberManageVO; } @@ -1213,4 +1539,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 d3457c58..700f3b09 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 { @@ -921,7 +995,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, "문자 발송에 필요한 보유 잔액이 부족 합니다.", "STAT_1060"); } @@ -929,7 +1003,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() @@ -959,7 +1034,7 @@ public class KakaoAlimTalkServiceImpl extends EgovAbstractServiceImpl implements ? apiMsgType + "," + kakaoSendAdvcListVO.get(0).getMsgType() : kakaoSendAdvcListVO.get(0).getMsgType(); // 발송 데이터 삽입 - int instCnt = this.insertKakaoData_advc(groupedMsgList); + int instCnt = kakaoSendUtil.insertKakaoData_advc(groupedMsgList); // int instCnt = 6; if(instCnt > 0) { @@ -969,7 +1044,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 (대체문자 환불관련 테이블)*/ @@ -1056,8 +1131,6 @@ public class KakaoAlimTalkServiceImpl extends EgovAbstractServiceImpl implements return statusResponse; } - - private void insertKakaoAtDataJsonInfo_advc(List kakaoSendAdvcListVO) { @@ -1207,29 +1280,4 @@ public class KakaoAlimTalkServiceImpl extends EgovAbstractServiceImpl implements - - - - - - - - - - - - - - - - - - - - - - - - - } 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 d501a3c1..9ac2fa88 100644 --- a/src/main/java/itn/let/mail/service/StatusResponse.java +++ b/src/main/java/itn/let/mail/service/StatusResponse.java @@ -7,6 +7,7 @@ import java.util.Map; 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/event/service/MjonEventVO.java b/src/main/java/itn/let/mjo/event/service/MjonEventVO.java index 0a1d3ae5..6731d38b 100644 --- a/src/main/java/itn/let/mjo/event/service/MjonEventVO.java +++ b/src/main/java/itn/let/mjo/event/service/MjonEventVO.java @@ -38,5 +38,5 @@ public class MjonEventVO { private String point; //사용자 포인트 정보 private String userId; //사용자 아이디 private String frstRegisterId; //등록자 아이디 - + } 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 f724add8..92f2e106 100644 --- a/src/main/java/itn/let/mjo/msg/service/MjonMsgVO.java +++ b/src/main/java/itn/let/mjo/msg/service/MjonMsgVO.java @@ -167,6 +167,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;// 카카오 이미지 단가 @@ -303,6 +304,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/MjonPayService.java b/src/main/java/itn/let/mjo/pay/service/MjonPayService.java index 2f8dd877..ab4db0a4 100644 --- a/src/main/java/itn/let/mjo/pay/service/MjonPayService.java +++ b/src/main/java/itn/let/mjo/pay/service/MjonPayService.java @@ -1,9 +1,12 @@ package itn.let.mjo.pay.service; import java.util.List; +import java.util.Map; import javax.servlet.http.HttpServletRequest; +import itn.let.mjo.msg.service.MjonMsgVO; + public interface MjonPayService { List selectPayList(MjonPayVO mjonPayVO) throws Exception; @@ -140,4 +143,11 @@ public interface MjonPayService { //누적 납부금액 조회 (후불회원이 사용금액을 실 납부한 금액 합산 - 미납 금액 제외한 총 합산 금액) public String selectTotSumPaymentAfterPay(String userId) throws Exception; + Map payUserSWList(MjonPayVO mjonPayVO) throws Exception; + + Map payUserSWListAjax(MjonMsgVO mjonMsgVO) throws Exception; + + //거래명세서 상세 조회 + MjonPayVO selectPayDetail(MjonPayVO mjonPayVO) throws Exception; + } 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..f6a39f41 100644 --- a/src/main/java/itn/let/mjo/pay/service/MjonPayVO.java +++ b/src/main/java/itn/let/mjo/pay/service/MjonPayVO.java @@ -236,8 +236,16 @@ public class MjonPayVO extends ComDefaultVO{ private int remainPoint; + private String userData; + private String totChgPay; // 간편결제분류 + // 거래명세서 내용 + private String bizNo; // 사업자등록번호 + private String managerNm; // 담당자명 + private String prePaymentYn; // 선불결제여부 N:후불제고객 + private String dept; // 회원종류 p:개인 c:기업 + } 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..d82c45e8 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{ @@ -353,5 +358,8 @@ public class MjonPayDAO extends EgovAbstractDAO { return result; } - + + public MjonPayVO selectPayDetail(MjonPayVO mjonPayVO) throws Exception{ + return (MjonPayVO)select("mjonPayDAO.selectPayDetail", mjonPayVO); + } } diff --git a/src/main/java/itn/let/mjo/pay/service/impl/MjonPayServiceImpl.java b/src/main/java/itn/let/mjo/pay/service/impl/MjonPayServiceImpl.java index 60c9e645..14ab7f39 100644 --- a/src/main/java/itn/let/mjo/pay/service/impl/MjonPayServiceImpl.java +++ b/src/main/java/itn/let/mjo/pay/service/impl/MjonPayServiceImpl.java @@ -7,11 +7,16 @@ import java.net.HttpURLConnection; import java.net.URL; import java.net.URLEncoder; import java.security.MessageDigest; +import java.sql.Timestamp; import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; import java.util.Date; import java.util.HashMap; import java.util.Iterator; import java.util.List; +import java.util.Map; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; @@ -25,11 +30,15 @@ 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.cmm.util.DateUtils; import itn.com.cmm.util.MJUtil; +import itn.com.cmm.util.PayUtils; import itn.com.utl.fcc.service.EgovStringUtil; 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.msgcampain.service.MjonCandidateVO; +import itn.let.mjo.msgcampain.service.impl.MjonCandidateDAO; import itn.let.mjo.msgdata.service.MjonMsgDataService; import itn.let.mjo.msgdata.service.impl.MjonMsgDataDAO; import itn.let.mjo.pay.service.MjonPayService; @@ -94,6 +103,10 @@ public class MjonPayServiceImpl extends EgovAbstractServiceImpl implements MjonP @Resource(name = "mberGrdService") MberGrdService mberGrdService; + @Resource(name="mjonCandidateDAO") + private MjonCandidateDAO mjonCandidateDAO; + + @Override public List selectPayList(MjonPayVO mjonPayVO) throws Exception { return mjonPayDAO.selectPayList(mjonPayVO); @@ -2839,6 +2852,144 @@ public class MjonPayServiceImpl extends EgovAbstractServiceImpl implements MjonP } - + @Override + public Map payUserSWList(MjonPayVO mjonPayVO) throws Exception{ + + + String userId = mjonPayVO.getUserId(); + // 총 사용금액 + List usedCashTotList = mjonPayDAO.selectUsedCashWithKakaoTotCnt(mjonPayVO); + + // 사용가능한 금액 + // mberManageVO.prePaymentYn 선불 후불 회원 구분으로 인해 select함 + MberManageVO mberManageVO = mjonMsgDataDAO.selectMberManageInfo(userId); + // 선거 후보자 정보 조회 + MjonCandidateVO mjonCandidateVO = new MjonCandidateVO(); + if("p".equals(mberManageVO.getDept())) { //개인회원 선거 후보자 정보 불러오기 + mjonCandidateVO = mjonCandidateDAO.selectCandidateDataInfo(userId); + if(mjonCandidateVO != null) { + mjonCandidateVO.setRegidentNo1(egovCryptoUtil.decrypt(mjonCandidateVO.getRegidentNo1())); + mjonCandidateVO.setRegidentNo2(egovCryptoUtil.decrypt(mjonCandidateVO.getRegidentNo2())); + } + } + + + /** + * 후불제 회원 관련 사용 요금 내역 정보 조회하기 + * 20231228 우영두 추가 + * 누적사용금액, 누적 납부금액, 당월 납부 예상금액 정보 조회 + * + * */ + //누적 사용금액 조회 (캐시 테이블에서 현재까지 사용된 금액 합산 - 캐시 테이블에서 "-"로 사용된 금액만 합산) + String totSumCashAfterPay = mjonPayDAO.selectTotalSumCashForAfterPay(userId); + + //누적 사용 포인트 조회 (포인트 테이블에서 현재까지 사용된 포인트 합산 - 회원 포인트 정보 업데이트시 사용되는 쿼리 이용) + String totSumPointAfterPay = mjonPayDAO.selectTotalSumPointForAfterPay(userId); + + //누적 납부금액 조회 (후불회원이 사용금액을 실 납부한 금액 합산 - 미납 금액 제외한 총 합산 금액) + String totSumPaymentAfterPay = mjonPayDAO.selectTotSumPaymentAfterPay(userId); + + //누적 납부 포인트 조회 ( 누적 납부금액 합산에 대한 2% 포인트 정보 계산) + float p_i_re_point = 0; + JoinSettingVO sysJoinSetVO = mjonMsgDataService.selectJoinSettingInfo(); + if (sysJoinSetVO != null) { + p_i_re_point = sysJoinSetVO.getPointPer(); + } + int paymentPointAfterPay = Math.round((Float.parseFloat(totSumPaymentAfterPay) * p_i_re_point / 100)); + + //당월 납부 예상금액 (누적 사용금액 합산 - 누적 납부금액 합산 정보 계산) + float unPaymentAfterPay = Float.parseFloat(totSumCashAfterPay) - Float.parseFloat(totSumPaymentAfterPay); + + //당월 납부 예상 포인트 (당월 납부 예상 금액에 대한 2% 포인트 정보 계산) + int unPaymentPointAfterPay = Math.round((unPaymentAfterPay * p_i_re_point / 100)); + + /* + * 2024.02.06 후불제 회원 중 협의단가를 사용하는 회원은 포인트 적립이 되지 않아야함. + * 후불제 협의 단가 여부 체크 + * 모든 협의 단가 금액을 합산하여 0보다 크면 협의단가 있음. + * */ + float shortPrice = mberManageVO.getShortPrice(); + float longPrice = mberManageVO.getLongPrice(); + float picturePrice = mberManageVO.getPicturePrice() + mberManageVO.getPicture2Price() + mberManageVO.getPicture3Price(); + float kakaoAtPrice = mberManageVO.getKakaoAtPrice(); + float kakaoFtPrice = mberManageVO.getKakaoFtPrice(); + float totPrice = shortPrice + longPrice + picturePrice + kakaoAtPrice + kakaoFtPrice; + String negoPriceYn = "N"; + + if(totPrice > 0) { + negoPriceYn = "Y"; + } + + + + Map returnData = new HashMap<>(); + + + returnData.put("usedCashTotList", usedCashTotList); + returnData.put("mberManageVO", mberManageVO); + returnData.put("mjonCandidateVO", mjonCandidateVO); + returnData.put("totSumCashAfterPay", totSumCashAfterPay); + returnData.put("totSumPointAfterPay", totSumPointAfterPay); + returnData.put("totSumPaymentAfterPay", totSumPaymentAfterPay); + returnData.put("sumPaymentPointAfterPay", paymentPointAfterPay); + returnData.put("unPaymentAfterPay", unPaymentAfterPay); + returnData.put("unPaymentPointAfterPay", unPaymentPointAfterPay); + returnData.put("negoPriceYn", negoPriceYn); + // 초기 날짜 셋팅 + returnData.put("startDate", DateUtils.getDateMonthsAgo(1)); + returnData.put("endDate", DateUtils.getCurrentDate()); + + + // TODO Auto-generated method stub + return returnData; + } + + @Override + public Map payUserSWListAjax(MjonMsgVO mjonMsgVO) throws Exception{ + + if("".equals(mjonMsgVO.getSearchSortCnd())){ //최초조회시 최신것 조회List + mjonMsgVO.setSearchSortCnd("regDate"); + mjonMsgVO.setSearchSortOrd("desc"); + } + + Map returnData = new HashMap<>(); + + // 검색 데이터가 없거나 + // 시작일자가 종료일자보다 이후이거나 + // 총 기간이 365일이 넘으면 현재일부터 365일 전 날짜를 넣어서 검색 + if(!DateUtils.dateChkAndValueChk(mjonMsgVO.getStartDate(),mjonMsgVO.getEndDate(), 12 )) { + + mjonMsgVO.setStartDate(DateUtils.getDateMonthsAgo(12)); + mjonMsgVO.setEndDate(DateUtils.getCurrentDate()); + + }; + + + List payUserSWList = mjonMsgDataDAO.selectPayUserSWList(mjonMsgVO); + returnData.put("payUserSWList", payUserSWList); + returnData.put("totCnt", payUserSWList.size()> 0 ? payUserSWList.get(0).getTotCnt() : 0); + returnData.put("totSuccSendPrice", payUserSWList.size() > 0 ? PayUtils.getTrimToFirstDecimal(payUserSWList.get(0).getTotSuccSendPrice()) : 0); + + return returnData; + } + + @Override + public MjonPayVO selectPayDetail(MjonPayVO mjonPayVO) throws Exception { + + MjonPayVO result = mjonPayDAO.selectPayDetail(mjonPayVO); + /* 후불제 고객의 사용기한 조회(결제일의 전달 1일 ~ 말일) */ + if("N".equals(result.getPrePaymentYn())) { + String regDateStr = result.getRegDate(); + LocalDateTime regDate = Timestamp.valueOf(regDateStr).toLocalDateTime(); + + LocalDate lastMonth = regDate.toLocalDate().withDayOfMonth(1).minusMonths(1); + LocalDate startDate = lastMonth.withDayOfMonth(1); + LocalDate endDate = lastMonth.withDayOfMonth(lastMonth.lengthOfMonth()); + + result.setStartDate(startDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))); + result.setEndDate(endDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))); + } + return result; + } } diff --git a/src/main/java/itn/let/mjo/pay/web/MjonPayController.java b/src/main/java/itn/let/mjo/pay/web/MjonPayController.java index 08267bdb..e4a4e305 100644 --- a/src/main/java/itn/let/mjo/pay/web/MjonPayController.java +++ b/src/main/java/itn/let/mjo/pay/web/MjonPayController.java @@ -2603,15 +2603,16 @@ public class MjonPayController { * 2023.12.22 우영두 * @param mjonMsgVO * @param model - * @return "/web/member/pay/PayUserSWList.do" + * @return "/web/member/pay/payUserSWList.do" * @throws Exception */ - @RequestMapping(value= {"/web/member/pay/PayUserSWList.do"}) - public String PayUserSWList(@ModelAttribute("mjonMsgVO") MjonMsgVO mjonMsgVO, + @RequestMapping(value= {"/web/member/pay/payUserSWList.do"}) + public String payUserSWList(@ModelAttribute("mjonMsgVO") MjonMsgVO mjonMsgVO, MjonPayVO mjonPayVO, MberManageVO mberManageVO, RedirectAttributes redirectAttributes, HttpServletRequest request, ModelMap model) throws Exception{ + /*LoginVO loginVO = (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser();*/ LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null; @@ -2621,117 +2622,26 @@ public class MjonPayController { return "redirect:/web/user/login/login.do"; } String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId()); - mjonMsgVO.setUserId(userId); - /* - { // 충전캐시 - String sumPayMoney = mjonPayService.selectAgentSumPayMoney(userId); - model.addAttribute("sumPayMoney", sumPayMoney); - } + mjonPayVO.setUserId(userId); - { // 충전포인트 - String sumPoint = mjonPayService.selectSumPoint(userId); - model.addAttribute("sumPoint", sumPoint); - } - */ - - { // 총 사용금액 - mjonPayVO.setUserId(userId); - List usedCashTotList = mjonPayService.selectUsedCashWithKakaoTotCnt(mjonPayVO); - model.addAttribute("usedCashTotList", usedCashTotList); - } - { // 사용가능한 금액 - // mberManageVO.prePaymentYn 선불 후불 회원 구분으로 인해 select함 - mberManageVO = mjonMsgDataService.selectMberManageInfo(userId); - model.addAttribute("mberManageVO", mberManageVO); - } - /* - { // 발송건수 - mjonMsgVO.setReserveYn("N"); - List sendTotList = mjonMsgService.selectWithKakaoSendTotCnt(mjonMsgVO); - model.addAttribute("sendTotList", sendTotList); - } - - { // 예약건수 - mjonMsgVO.setReserveYn("Y"); - List reservToList = mjonMsgService.selectWithKakaoSendTotCnt(mjonMsgVO); - model.addAttribute("reservToList", reservToList); - } - */ - {// 선거 후보자 정보 조회 - MjonCandidateVO mjonCandidateVO = new MjonCandidateVO(); - if("p".equals(mberManageVO.getDept())) { //개인회원 선거 후보자 정보 불러오기 - mjonCandidateVO = mjonCandidateService.selectCandidateDataInfo(userId); - if(mjonCandidateVO != null) { - mjonCandidateVO.setRegidentNo1(egovCryptoUtil.decrypt(mjonCandidateVO.getRegidentNo1())); - mjonCandidateVO.setRegidentNo2(egovCryptoUtil.decrypt(mjonCandidateVO.getRegidentNo2())); - } - } - model.addAttribute("mjonCandidateVO", mjonCandidateVO); - } - - - { - /** - * 후불제 회원 관련 사용 요금 내역 정보 조회하기 - * 20231228 우영두 추가 - * 누적사용금액, 누적 납부금액, 당월 납부 예상금액 정보 조회 - * - * */ - - //누적 사용금액 조회 (캐시 테이블에서 현재까지 사용된 금액 합산 - 캐시 테이블에서 "-"로 사용된 금액만 합산) - String totSumCashAfterPay = mjonPayService.selectTotalSumCashForAfterPay(userId); - model.addAttribute("totSumCashAfterPay", totSumCashAfterPay); - - //누적 사용 포인트 조회 (포인트 테이블에서 현재까지 사용된 포인트 합산 - 회원 포인트 정보 업데이트시 사용되는 쿼리 이용) - String totSumPointAfterPay = mjonPayService.selectTotalSumPointForAfterPay(userId); - model.addAttribute("totSumPointAfterPay", totSumPointAfterPay); - - //누적 납부금액 조회 (후불회원이 사용금액을 실 납부한 금액 합산 - 미납 금액 제외한 총 합산 금액) - String totSumPaymentAfterPay = mjonPayService.selectTotSumPaymentAfterPay(userId); - model.addAttribute("totSumPaymentAfterPay", totSumPaymentAfterPay); - - //누적 납부 포인트 조회 ( 누적 납부금액 합산에 대한 2% 포인트 정보 계산) - float p_i_re_point = 0; - JoinSettingVO sysJoinSetVO = mjonMsgDataService.selectJoinSettingInfo(); - if (sysJoinSetVO != null) { - p_i_re_point = sysJoinSetVO.getPointPer(); - } - int paymentPointAfterPay = Math.round((Float.parseFloat(totSumPaymentAfterPay) * p_i_re_point / 100)); - model.addAttribute("sumPaymentPointAfterPay", paymentPointAfterPay); - - //당월 납부 예상금액 (누적 사용금액 합산 - 누적 납부금액 합산 정보 계산) - - float unPaymentAfterPay = Float.parseFloat(totSumCashAfterPay) - Float.parseFloat(totSumPaymentAfterPay); - model.addAttribute("unPaymentAfterPay", unPaymentAfterPay); - - //당월 납부 예상 포인트 (당월 납부 예상 금액에 대한 2% 포인트 정보 계산) - int unPaymentPointAfterPay = Math.round((unPaymentAfterPay * p_i_re_point / 100)); - model.addAttribute("unPaymentPointAfterPay", unPaymentPointAfterPay); - - /* - * 2024.02.06 후불제 회원 중 협의단가를 사용하는 회원은 포인트 적립이 되지 않아야함. - * 후불제 협의 단가 여부 체크 - * 모든 협의 단가 금액을 합산하여 0보다 크면 협의단가 있음. - * */ - float shortPrice = mberManageVO.getShortPrice(); - float longPrice = mberManageVO.getLongPrice(); - float picturePrice = mberManageVO.getPicturePrice() + mberManageVO.getPicture2Price() + mberManageVO.getPicture3Price(); - float kakaoAtPrice = mberManageVO.getKakaoAtPrice(); - float kakaoFtPrice = mberManageVO.getKakaoFtPrice(); - float totPrice = shortPrice + longPrice + picturePrice + kakaoAtPrice + kakaoFtPrice; - String negoPriceYn = "N"; - if(totPrice > 0) { - negoPriceYn = "Y"; - } - model.addAttribute("negoPriceYn", negoPriceYn); - - } - { - // 초기 날짜 셋팅 - model.addAttribute("startDate", DateUtils.getDateMonthsAgo(12)); - model.addAttribute("endDate", DateUtils.getCurrentDate()); - } +// // 비즈니스 로직 부분 + Map resultMap = mjonPayService.payUserSWList(mjonPayVO); + + + model.addAttribute("usedCashTotList", resultMap.get("usedCashTotList")); + model.addAttribute("mjonCandidateVO", resultMap.get("mjonCandidateVO")); + model.addAttribute("mberManageVO", resultMap.get("mberManageVO")); + model.addAttribute("totSumCashAfterPay", resultMap.get("totSumCashAfterPay")); + model.addAttribute("totSumPointAfterPay", resultMap.get("totSumPointAfterPay")); + model.addAttribute("totSumPaymentAfterPay", resultMap.get("totSumPaymentAfterPay")); + model.addAttribute("sumPaymentPointAfterPay", resultMap.get("sumPaymentPointAfterPay")); + model.addAttribute("unPaymentAfterPay", resultMap.get("unPaymentAfterPay")); + model.addAttribute("unPaymentPointAfterPay", resultMap.get("unPaymentPointAfterPay")); + model.addAttribute("negoPriceYn", resultMap.get("negoPriceYn")); + model.addAttribute("startDate", resultMap.get("startDate")); + model.addAttribute("endDate", resultMap.get("endDate")); + return "/web/pay/PayUserSWList"; } @@ -2749,8 +2659,8 @@ public class MjonPayController { * @return "/web/member/pay/PayUserSWListAjax.do" * @throws Exception */ - @RequestMapping(value= {"/web/member/pay/PayUserSWListAjax.do"}) - public String PayUserSWListAjax(@ModelAttribute("searchVO") MjonMsgVO mjonMsgVO, + @RequestMapping(value= {"/web/member/pay/payUserSWListAjax.do"}) + public String payUserSWListAjax(@ModelAttribute("searchVO") MjonMsgVO mjonMsgVO, HttpServletRequest request, ModelMap model) throws Exception{ @@ -2774,29 +2684,12 @@ public class MjonPayController { mjonMsgVO.setLastIndex(paginationInfo.getLastRecordIndex()); mjonMsgVO.setRecordCountPerPage(paginationInfo.getRecordCountPerPage()); - if("".equals(mjonMsgVO.getSearchSortCnd())){ //최초조회시 최신것 조회List - mjonMsgVO.setSearchSortCnd("regDate"); - mjonMsgVO.setSearchSortOrd("desc"); - } + Map resultMap = mjonPayService.payUserSWListAjax(mjonMsgVO); - // 검색 데이터가 없거나 - // 시작일자가 종료일자보다 이후이거나 - // 총 기간이 365일이 넘으면 현재일부터 365일 전 날짜를 넣어서 검색 - if(!DateUtils.dateChkAndValueChk(mjonMsgVO.getStartDate(),mjonMsgVO.getEndDate(), 12 )) { - - mjonMsgVO.setStartDate(DateUtils.getDateMonthsAgo(12)); - mjonMsgVO.setEndDate(DateUtils.getCurrentDate()); - - }; - - List payUserSWList = mjonMsgDataService.selectPayUserSWList(mjonMsgVO); - - paginationInfo.setTotalRecordCount(payUserSWList.size()> 0 ? payUserSWList.get(0).getTotCnt() : 0); + paginationInfo.setTotalRecordCount((int)resultMap.get("totCnt")); model.addAttribute("paginationInfo", paginationInfo); - model.addAttribute("payUserSWList", payUserSWList); - - model.addAttribute("totSuccSendPrice", payUserSWList.size() > 0 ? PayUtils.getTrimToFirstDecimal(payUserSWList.get(0).getTotSuccSendPrice()) : 0); - + model.addAttribute("payUserSWList", resultMap.get("payUserSWList")); + model.addAttribute("totSuccSendPrice", resultMap.get("totSuccSendPrice")); model.addAttribute("mjonMsgVO", mjonMsgVO); @@ -2878,7 +2771,7 @@ public class MjonPayController { font.setBoldweight(Font.BOLDWEIGHT_BOLD); //글씨 bold sheet.setColumnWidth(1, 5000); // 칼럼의 폭 조절 - sheet.setColumnWidth(4, 10000); // 칼럼의 폭 조절 + sheet.setColumnWidth(3, 10000); // 칼럼의 폭 조절 try{ @@ -2903,6 +2796,7 @@ public class MjonPayController { sheet.addMergedRegion(new CellRangeAddress(0,1,1,1)); //셀병합 sheet.addMergedRegion(new CellRangeAddress(0,1,2,2)); //셀병합 sheet.addMergedRegion(new CellRangeAddress(0,1,3,3)); //셀병합 + sheet.addMergedRegion(new CellRangeAddress(0,1,6,6)); //셀병합 cell = row.createCell(0); @@ -2910,46 +2804,29 @@ public class MjonPayController { cell.setCellStyle(style); cell = row.createCell(1); - cell.setCellValue("날짜"); + cell.setCellValue("발송일시"); cell.setCellStyle(style); cell = row.createCell(2); - cell.setCellValue("문자유형"); + cell.setCellValue("형태"); cell.setCellStyle(style); cell = row.createCell(3); - cell.setCellValue("발송건수"); - cell.setCellStyle(style); - - cell = row.createCell(4); cell.setCellValue("내용"); cell.setCellStyle(style); - /*cell = row.createCell(5); - cell.setCellValue("충전"); - sheet.addMergedRegion(new CellRangeAddress(0,0,5,6)); //셀병합 + cell = row.createCell(4); + cell.setCellValue("발송건수"); + sheet.addMergedRegion(new CellRangeAddress(0,0,4,5)); //셀병합 cell.setCellStyle(style); - - cell = row.createCell(6); - cell.setCellStyle(style);*/ - + cell = row.createCell(5); - cell.setCellValue("사용"); - sheet.addMergedRegion(new CellRangeAddress(0,0,5,6)); //셀병합 cell.setCellStyle(style); cell = row.createCell(6); + cell.setCellValue("금액(원)"); cell.setCellStyle(style); - - /*cell = row.createCell(9); - cell.setCellValue("잔액"); - sheet.addMergedRegion(new CellRangeAddress(0,0,9,10)); //셀병합 - cell.setCellStyle(style); - - cell = row.createCell(10); - cell.setCellStyle(style);*/ - row = sheet.createRow(1); cell = row.createCell(0); @@ -2965,32 +2842,16 @@ public class MjonPayController { cell.setCellStyle(style); cell = row.createCell(4); + cell.setCellValue("성공"); cell.setCellStyle(style); - /*cell = row.createCell(5); - cell.setCellValue("충전금"); - cell.setCellStyle(style); - - cell = row.createCell(6); - cell.setCellValue("포인트"); - cell.setCellStyle(style);*/ - cell = row.createCell(5); - cell.setCellValue("충전금"); + cell.setCellValue("실패"); cell.setCellStyle(style); cell = row.createCell(6); - cell.setCellValue("포인트"); cell.setCellStyle(style); - /*cell = row.createCell(9); - cell.setCellValue("충전금"); - cell.setCellStyle(style); - - cell = row.createCell(10); - cell.setCellValue("포인트"); - cell.setCellStyle(style);*/ - DecimalFormat formatter = new DecimalFormat("###,###.##"); String befCash = ""; String befPoint = ""; @@ -3033,15 +2894,11 @@ public class MjonPayController { if(j==0) cell.setCellValue(i+1); //번호 if(j==1) cell.setCellValue(((MjonMsgVO)payUserList.get(i)).getRegDate()); //결제일시 if(j==2) cell.setCellValue(msgType); //문자유형 - if(j==3) cell.setCellValue(((MjonMsgVO)payUserList.get(i)).getSuccSendCnt()); //발송건수 - if(j==4) cell.setCellValue(((MjonMsgVO)payUserList.get(i)).getSmsTxt()); //내용 - if(j==5) cell.setCellValue(((MjonMsgVO)payUserList.get(i)).getSuccSendPrice()); //충전 - 충전금 - if(j==6) cell.setCellValue(0); //충전 - 포인트 - /*if(j==7) cell.setCellValue(totPrice); //사용 - 충전금 - if(j==8) cell.setCellValue(0); //사용 - 포인트 - if(j==9) cell.setCellValue(thisPoint); //잔액 - 충전금 - if(j==10) cell.setCellValue(befPoint); //잔액 - 포인트 -*/ } + if(j==3) cell.setCellValue(((MjonMsgVO)payUserList.get(i)).getSmsTxt()); //내용 + if(j==4) cell.setCellValue(((MjonMsgVO)payUserList.get(i)).getSuccSendCnt()); //성공건수 + if(j==5) cell.setCellValue(((MjonMsgVO)payUserList.get(i)).getFailSendCnt()); //실패건수 + if(j==6) cell.setCellValue(((MjonMsgVO)payUserList.get(i)).getSuccSendPrice()); //금액 + } } } response.setHeader("Set-Cookie", "fileDownload=true; path=/"); @@ -5051,28 +4908,11 @@ public class MjonPayController { model.addAttribute("resultList", payUserSumList); // 수신자 정보 - String mberNm = ""; // 회사명 - String managerNm = ""; // 담당자명 - String moblphonNo = ""; // 연락처 - MberManageVO mberManageVO = new MberManageVO(); - mberManageVO = mjonMsgDataService.selectMberManageInfo(userId); - if (mberManageVO != null) { - // 회원종류 p-개인 c-기업 - if (mberManageVO.getDept().equals("c")) { - mberNm = mberManageVO.getMberNm(); - managerNm = mberManageVO.getManagerNm(); - moblphonNo = mberManageVO.getMoblphonNo(); - } - else { - mberNm = mberManageVO.getMberNm(); - managerNm = mberManageVO.getMberNm(); - moblphonNo = mberManageVO.getMoblphonNo(); - } - } - - model.addAttribute("mberNm", mberNm); - model.addAttribute("managerNm", managerNm); - model.addAttribute("moblphonNo", moblphonNo); + MJUtil mjUtil = new MJUtil(); + MberManageVO mberManageVO = mjonMsgDataService.selectMberManageInfo(userId); + mberManageVO.setMoblphonNo(mjUtil.addDash(mberManageVO.getMoblphonNo())); + mberManageVO.setBizNo(mjUtil.bizNoAddDash(mberManageVO.getBizNo())); + model.addAttribute("mberManageVO", mberManageVO); //부가세 포함 가격 정보 계산 double addTax = Math.round(totalSumPrice * 0.1); @@ -6190,7 +6030,42 @@ public class MjonPayController { return "/uss/ion/pay/cashPointSendList"; } - + + /** + * * 거래명세서 팝업 + * @param searchVO + * @param model + * @return "/web/member/pay/payInvoicePopupAjax.do" + * @throws Exception + */ + @RequestMapping(value= {"/web/member/pay/payInvoicePopupAjax.do"}) + public String printInvoiceAjax( + @ModelAttribute("searchVO") MjonPayVO mjonPayVO + , RedirectAttributes redirectAttributes + , ModelMap model) throws Exception { + + + + //로그인 권한정보 불러오기 + LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null; + String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId()); + + if(loginVO == null) { + //redirectAttributes.addFlashAttribute("message", "문자온 서비스는 로그인 후 이용 가능합니다."); + return "redirect:/web/user/login/login.do"; + } + + mjonPayVO.setUserId(userId); + + //결제 정보 불러오기 + MJUtil mjUtil = new MJUtil(); + MjonPayVO result = mjonPayService.selectPayDetail(mjonPayVO); + result.setMbtlNum(mjUtil.addDash(result.getMbtlNum())); + result.setBizNo(mjUtil.bizNoAddDash(result.getBizNo())); + model.addAttribute("result", result); + + return "web/pay/payInvoicePrintPopup"; + } /** * @param p_pattern * @param p_mjonPayVO diff --git a/src/main/java/itn/let/mjo/pay/web/MjonPayV2Controller.java b/src/main/java/itn/let/mjo/pay/web/MjonPayV2Controller.java index 7907a32d..7dfff842 100644 --- a/src/main/java/itn/let/mjo/pay/web/MjonPayV2Controller.java +++ b/src/main/java/itn/let/mjo/pay/web/MjonPayV2Controller.java @@ -278,6 +278,8 @@ public class MjonPayV2Controller { try { // 다음 결제시 결제수단 SELECT nextPayMethod = userManageService.selectNextPayMethod(userId); + // 실제 마지막 결제 방식 - + } catch(Exception e) { isSuccess = false; @@ -1640,6 +1642,45 @@ public class MjonPayV2Controller { return "web/cop/kgmV2/bankOkUrl"; } + /** + * 마지막 결제수단 SELECT + * @throws Exception + */ + @RequestMapping(value = "/web/member/pay/selectLastPayMethodAjax.do") + public ModelAndView selectLastPayMethodAjax(MjonPayVO mjonPayVO, + HttpServletRequest request ) throws Exception { + + ModelAndView modelAndView = new ModelAndView(); + modelAndView.setViewName("jsonView"); + + boolean isSuccess = true; + String msg = ""; + String nextPayMethod = ""; + + LoginVO loginVO = (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser(); + String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId()); + + if(userId == null) { + isSuccess = false; + msg = "로그인이 필요합니다."; + } + + try { + // 다음 결제시 결제수단 SELECT + nextPayMethod = userManageService.selectLastPayMethod(userId); + } + catch(Exception e) { + isSuccess = false; + msg = e.getMessage(); + } + + modelAndView.addObject("isSuccess", isSuccess); + modelAndView.addObject("msg", msg); + modelAndView.addObject("nextPayMethod", nextPayMethod); + + return modelAndView; + } + // Get Server Path public static String getKgServerPath(HttpServletRequest request) { String kgmPath = request.getScheme() + "://" + request.getServerName() +":" + request.getServerPort(); 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/java/itn/let/uat/uia/service/impl/EgovMberManageServiceImpl.java b/src/main/java/itn/let/uat/uia/service/impl/EgovMberManageServiceImpl.java index 52caee34..20f997f3 100644 --- a/src/main/java/itn/let/uat/uia/service/impl/EgovMberManageServiceImpl.java +++ b/src/main/java/itn/let/uat/uia/service/impl/EgovMberManageServiceImpl.java @@ -1,5 +1,10 @@ package itn.let.uat.uia.service.impl; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; import java.util.List; import javax.annotation.Resource; @@ -11,14 +16,16 @@ import org.springframework.web.context.request.ServletRequestAttributes; import egovframework.rte.fdl.cmmn.EgovAbstractServiceImpl; import egovframework.rte.fdl.idgnr.EgovIdGnrService; +import itn.com.cmm.util.StringUtil; import itn.com.uss.olh.hpc.service.HackIpService; import itn.com.uss.olh.hpc.service.HackIpVO; import itn.com.utl.fcc.service.EgovStringUtil; -import itn.let.mjo.cert.service.CertVO; +import itn.let.mjo.msgdata.service.MjonMsgDataService; import itn.let.mjo.msgsent.service.MjonMsgSentVO; import itn.let.mjo.pay.service.KmcVO; import itn.let.sec.rgm.service.AuthorGroup; import itn.let.sec.rgm.service.EgovAuthorGroupService; +import itn.let.sym.site.service.JoinSettingVO; import itn.let.uat.uia.service.AuthCertVO; import itn.let.uss.umt.service.AdmProcHstryVO; import itn.let.uss.umt.service.EgovMberManageService; @@ -82,6 +89,10 @@ public class EgovMberManageServiceImpl extends EgovAbstractServiceImpl implement @Resource(name = "hackIpService") private HackIpService hackIpService; + /* MjonMsgDataService */ + @Resource(name = "MjonMsgDataService") + private MjonMsgDataService mjonMsgDataService; + @Override public int insertMber(MberManageVO mberManageVO) throws Exception { @@ -621,4 +632,71 @@ public class EgovMberManageServiceImpl extends EgovAbstractServiceImpl implement return mberManageDAO.findTopByregDateFromCertLog(authCertVO); } + public MberManageVO selectMberHeaderInfo(String mberId) throws Exception { + //회원 단가, 이벤트 단가, 이벤트 종료일 등 조회 + MberManageVO headerInfo = mberManageDAO.selectMberHeaderInfo(mberId); + //기본 단가 조회 + JoinSettingVO sysPrice = mjonMsgDataService.selectJoinSettingInfo(); + + //이벤트 종료까지 남은 일 수 계산 + long eventLeftDay = calculateEventLeftDay(headerInfo.getEventEndDate()); + headerInfo.setEventLeftDay(String.valueOf(eventLeftDay)); + + //이벤트 유무에 따라 이벤트 잔액 or 잔액 사용 + boolean isEventActive = eventLeftDay > 0; + double money = isEventActive ? headerInfo.getEventRemainCash() : headerInfo.getUserMoney(); + + //이벤트, 회원 단가가 0일 시 기본 단가 사용 + setPrices(headerInfo, sysPrice, isEventActive); + + //발송가능 건수 조회 + calculateAvailableCounts(headerInfo, money); + + return headerInfo; + } + + private long calculateEventLeftDay(String eventEndDateStr) { + if (StringUtil.isEmpty(eventEndDateStr)) return 0; + LocalDate today = LocalDate.now(); + LocalDate eventEndDate = LocalDate.parse(eventEndDateStr, DateTimeFormatter.ofPattern("yyyy-MM-dd")); + return ChronoUnit.DAYS.between(today, eventEndDate); + } + + private void setPrices(MberManageVO headerInfo, JoinSettingVO sysPrice, boolean isEventActive) { + if (isEventActive) { + headerInfo.setHeaderShortPrice(priceChk(headerInfo.getEventShortPrice(), sysPrice.getShortPrice())); + headerInfo.setHeaderLongPrice(priceChk(headerInfo.getEventLongPrice(), sysPrice.getLongPrice())); + headerInfo.setHeaderPicturePrice(priceChk(headerInfo.getEventPicturePrice(), sysPrice.getPicturePrice())); + headerInfo.setHeaderPicture2Price(priceChk(headerInfo.getEventPicture2Price(), sysPrice.getPicture2Price())); + headerInfo.setHeaderPicture3Price(priceChk(headerInfo.getEventPicture3Price(), sysPrice.getPicture3Price())); + } else { + headerInfo.setHeaderShortPrice(priceChk(headerInfo.getShortPrice(), sysPrice.getShortPrice())); + headerInfo.setHeaderLongPrice(priceChk(headerInfo.getLongPrice(), sysPrice.getLongPrice())); + headerInfo.setHeaderPicturePrice(priceChk(headerInfo.getPicturePrice(), sysPrice.getPicturePrice())); + headerInfo.setHeaderPicture2Price(priceChk(headerInfo.getPicture2Price(), sysPrice.getPicture2Price())); + headerInfo.setHeaderPicture3Price(priceChk(headerInfo.getPicture3Price(), sysPrice.getPicture3Price())); + } + // 카카오, 팩스 단가는 기본 단가 고정 + headerInfo.setHeaderKakaoAtPrice(sysPrice.getKakaoAtPrice()); + headerInfo.setHeaderFaxPrice(sysPrice.getFaxPrice()); + } + + private float priceChk(float price, float sysPrice) { + return price > 0 ? price : sysPrice; + } + + private void calculateAvailableCounts(MberManageVO headerInfo, double money) { + headerInfo.setHeaderShortCnt(calcCount(money, headerInfo.getHeaderShortPrice())); + headerInfo.setHeaderLongCnt(calcCount(money, headerInfo.getHeaderLongPrice())); + headerInfo.setHeaderPictureCnt(calcCount(money, headerInfo.getHeaderPicturePrice())); + headerInfo.setHeaderPicture2Cnt(calcCount(money, headerInfo.getHeaderPicture2Price())); + headerInfo.setHeaderPicture3Cnt(calcCount(money, headerInfo.getHeaderPicture3Price())); + headerInfo.setHeaderKakaoAtCnt(calcCount(money, headerInfo.getHeaderKakaoAtPrice())); + headerInfo.setHeaderFaxCnt(calcCount(money, headerInfo.getHeaderFaxPrice())); + } + + private int calcCount(double money, double price) { + if (price <= 0) return 0; + return (int) Math.floor(money / price); + } } \ No newline at end of file diff --git a/src/main/java/itn/let/uat/uia/service/impl/MberManageDAO.java b/src/main/java/itn/let/uat/uia/service/impl/MberManageDAO.java index 2418dce9..54338300 100644 --- a/src/main/java/itn/let/uat/uia/service/impl/MberManageDAO.java +++ b/src/main/java/itn/let/uat/uia/service/impl/MberManageDAO.java @@ -345,5 +345,8 @@ public class MberManageDAO extends EgovComAbstractDAO{ public String findTopByregDateFromCertLog(AuthCertVO authCertVO) { return (String)select("mberManageDAO.findTopByregDateFromCertLog", authCertVO); } - + + public MberManageVO selectMberHeaderInfo(String mberId) { + return (MberManageVO) select("mberManageDAO.selectMberHeaderInfo", mberId); + } } \ No newline at end of file diff --git a/src/main/java/itn/let/uss/umt/service/EgovMberManageService.java b/src/main/java/itn/let/uss/umt/service/EgovMberManageService.java index 1bc0877c..a9c224b7 100644 --- a/src/main/java/itn/let/uss/umt/service/EgovMberManageService.java +++ b/src/main/java/itn/let/uss/umt/service/EgovMberManageService.java @@ -251,4 +251,6 @@ public interface EgovMberManageService { public String findTopByregDateFromCertLog(AuthCertVO authCertVO); + //사용자 헤더 정보(단가, 이벤트 활성화 기간) + public MberManageVO selectMberHeaderInfo(String mberId) throws Exception; } \ No newline at end of file diff --git a/src/main/java/itn/let/uss/umt/service/EgovUserManageService.java b/src/main/java/itn/let/uss/umt/service/EgovUserManageService.java index 8cf39d58..41888bb0 100644 --- a/src/main/java/itn/let/uss/umt/service/EgovUserManageService.java +++ b/src/main/java/itn/let/uss/umt/service/EgovUserManageService.java @@ -220,4 +220,6 @@ public interface EgovUserManageService { public Map selectFaxSendList(FaxGroupDataVO faxGroupDataVO); + // 마지막 결제수단 조회 + public String selectLastPayMethod(String mberId) throws Exception; } \ No newline at end of file diff --git a/src/main/java/itn/let/uss/umt/service/MberManageVO.java b/src/main/java/itn/let/uss/umt/service/MberManageVO.java index 42194719..955fa1c3 100644 --- a/src/main/java/itn/let/uss/umt/service/MberManageVO.java +++ b/src/main/java/itn/let/uss/umt/service/MberManageVO.java @@ -512,6 +512,39 @@ public class MberManageVO extends UserDefaultVO{ */ private String secuLoginFlag; + + /** + * 회원 이벤트 정보 + */ + private String eventEndDate; //회원 이벤트 종료일자 + private double eventRemainCash; //이벤트 차감 후 남은 Cash + private float eventShortPrice; //이벤트 단문 가격 + private float eventLongPrice; //이벤트 장문 가격 + private float eventPicturePrice; //이벤트 그림 1장 가격 + private float eventPicture2Price; //이벤트 그림 2장 가격 + private float eventPicture3Price; //이벤트 그림 3장 가격 + private String eventLeftDay; //이벤트 남은 기간 + + /** + * 헤더 영역 정보(단가, 발송가능 건수) + */ + private float headerShortPrice; + private float headerLongPrice; + private float headerPicturePrice; + private float headerPicture2Price; + private float headerPicture3Price; + private float headerKakaoAtPrice; + private float headerKakaoFtPrice; + private float headerFaxPrice; + private int headerShortCnt; + private int headerLongCnt; + private int headerPictureCnt; + private int headerPicture2Cnt; + private int headerPicture3Cnt; + private int headerKakaoAtCnt; + private int headerKakaoFtCnt; + private int headerFaxCnt; + public String getSmsCode() { return smsCode; } @@ -1804,6 +1837,150 @@ public class MberManageVO extends UserDefaultVO{ public void setSecuLoginFlag(String secuLoginFlag) { this.secuLoginFlag = secuLoginFlag; } + public String getEventEndDate() { + return eventEndDate; + } + public void setEventEndDate(String eventEndDate) { + this.eventEndDate = eventEndDate; + } + public double getEventRemainCash() { + return eventRemainCash; + } + public void setEventRemainCash(double eventRemainCash) { + this.eventRemainCash = eventRemainCash; + } + public float getEventShortPrice() { + return eventShortPrice; + } + public void setEventShortPrice(float eventShortPrice) { + this.eventShortPrice = eventShortPrice; + } + public float getEventLongPrice() { + return eventLongPrice; + } + public void setEventLongPrice(float eventLongPrice) { + this.eventLongPrice = eventLongPrice; + } + public float getEventPicturePrice() { + return eventPicturePrice; + } + public void setEventPicturePrice(float eventPicturePrice) { + this.eventPicturePrice = eventPicturePrice; + } + public float getEventPicture2Price() { + return eventPicture2Price; + } + public void setEventPicture2Price(float eventPicture2Price) { + this.eventPicture2Price = eventPicture2Price; + } + public float getEventPicture3Price() { + return eventPicture3Price; + } + public void setEventPicture3Price(float eventPicture3Price) { + this.eventPicture3Price = eventPicture3Price; + } + public String getEventLeftDay() { + return eventLeftDay; + } + public void setEventLeftDay(String eventLeftDay) { + this.eventLeftDay = eventLeftDay; + } + public float getHeaderShortPrice() { + return headerShortPrice; + } + public void setHeaderShortPrice(float headerShortPrice) { + this.headerShortPrice = headerShortPrice; + } + public float getHeaderLongPrice() { + return headerLongPrice; + } + public void setHeaderLongPrice(float headerLongPrice) { + this.headerLongPrice = headerLongPrice; + } + public float getHeaderPicturePrice() { + return headerPicturePrice; + } + public void setHeaderPicturePrice(float headerPicturePrice) { + this.headerPicturePrice = headerPicturePrice; + } + public float getHeaderPicture2Price() { + return headerPicture2Price; + } + public void setHeaderPicture2Price(float headerPicture2Price) { + this.headerPicture2Price = headerPicture2Price; + } + public float getHeaderPicture3Price() { + return headerPicture3Price; + } + public void setHeaderPicture3Price(float headerPicture3Price) { + this.headerPicture3Price = headerPicture3Price; + } + public int getHeaderShortCnt() { + return headerShortCnt; + } + public void setHeaderShortCnt(int headerShortCnt) { + this.headerShortCnt = headerShortCnt; + } + public int getHeaderLongCnt() { + return headerLongCnt; + } + public void setHeaderLongCnt(int headerLongCnt) { + this.headerLongCnt = headerLongCnt; + } + public int getHeaderPictureCnt() { + return headerPictureCnt; + } + public void setHeaderPictureCnt(int headerPictureCnt) { + this.headerPictureCnt = headerPictureCnt; + } + public int getHeaderPicture2Cnt() { + return headerPicture2Cnt; + } + public void setHeaderPicture2Cnt(int headerPicture2Cnt) { + this.headerPicture2Cnt = headerPicture2Cnt; + } + public int getHeaderPicture3Cnt() { + return headerPicture3Cnt; + } + public void setHeaderPicture3Cnt(int headerPicture3Cnt) { + this.headerPicture3Cnt = headerPicture3Cnt; + } + public float getHeaderKakaoAtPrice() { + return headerKakaoAtPrice; + } + public void setHeaderKakaoAtPrice(float headerKakaoAtPrice) { + this.headerKakaoAtPrice = headerKakaoAtPrice; + } + public float getHeaderKakaoFtPrice() { + return headerKakaoFtPrice; + } + public void setHeaderKakaoFtPrice(float headerKakaoFtPrice) { + this.headerKakaoFtPrice = headerKakaoFtPrice; + } + public float getHeaderFaxPrice() { + return headerFaxPrice; + } + public void setHeaderFaxPrice(float headerFaxPrice) { + this.headerFaxPrice = headerFaxPrice; + } + public int getHeaderKakaoAtCnt() { + return headerKakaoAtCnt; + } + public void setHeaderKakaoAtCnt(int headerKakaoAtCnt) { + this.headerKakaoAtCnt = headerKakaoAtCnt; + } + public int getHeaderKakaoFtCnt() { + return headerKakaoFtCnt; + } + public void setHeaderKakaoFtCnt(int headerKakaoFtCnt) { + this.headerKakaoFtCnt = headerKakaoFtCnt; + } + public int getHeaderFaxCnt() { + return headerFaxCnt; + } + public void setHeaderFaxCnt(int headerFaxCnt) { + this.headerFaxCnt = headerFaxCnt; + } } \ No newline at end of file diff --git a/src/main/java/itn/let/uss/umt/service/impl/EgovUserManageServiceImpl.java b/src/main/java/itn/let/uss/umt/service/impl/EgovUserManageServiceImpl.java index aa136dad..94786594 100644 --- a/src/main/java/itn/let/uss/umt/service/impl/EgovUserManageServiceImpl.java +++ b/src/main/java/itn/let/uss/umt/service/impl/EgovUserManageServiceImpl.java @@ -882,5 +882,11 @@ public class EgovUserManageServiceImpl extends EgovAbstractServiceImpl implement return resultMap; } + + // 마지막 결제수단 SELECT + @Override + public String selectLastPayMethod(String mberId) throws Exception { + return userManageDAO.selectLastPayMethod(mberId); + } } \ No newline at end of file diff --git a/src/main/java/itn/let/uss/umt/service/impl/UserManageDAO.java b/src/main/java/itn/let/uss/umt/service/impl/UserManageDAO.java index 8e5285f0..4b836fe3 100644 --- a/src/main/java/itn/let/uss/umt/service/impl/UserManageDAO.java +++ b/src/main/java/itn/let/uss/umt/service/impl/UserManageDAO.java @@ -320,5 +320,9 @@ public class UserManageDAO extends EgovAbstractDAO{ public int selectUserPrePaymentPGdataCount(String userId) throws Exception{ return (int) select("userManageDAO.selectUserPrePaymentPGdataCount", userId); } - + + // 마지막 결제수단 SELECT + public String selectLastPayMethod(String mberId) throws Exception{ + return (String) select("userManageDAO.selectLastPayMethod", mberId); + } } \ No newline at end of file diff --git a/src/main/java/itn/web/MainController.java b/src/main/java/itn/web/MainController.java index cfaf8028..359b8c28 100644 --- a/src/main/java/itn/web/MainController.java +++ b/src/main/java/itn/web/MainController.java @@ -12,6 +12,9 @@ import java.security.PrivateKey; import java.security.PublicKey; import java.security.spec.RSAPublicKeySpec; import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -106,6 +109,7 @@ import itn.let.lett.service.LetterVO; import itn.let.mjo.addr.service.AddrTransHistService; import itn.let.mjo.addr.service.AddrTransHistVO; import itn.let.mjo.event.service.MjonEventService; +import itn.let.mjo.event.service.MjonEventVO; import itn.let.mjo.kisa.service.KisaService; import itn.let.mjo.kisa.service.KisaVO; import itn.let.mjo.mjocommon.MjonForienIpChk; @@ -130,6 +134,7 @@ import itn.let.sym.mnu.mpm.service.MenuManageVO; import itn.let.sym.prm.service.EgovProgrmManageService; import itn.let.sym.prm.service.ProgrmManageVO; import itn.let.sym.site.service.EgovSiteManagerService; +import itn.let.sym.site.service.JoinSettingVO; import itn.let.sym.site.service.MetaTagVO; import itn.let.sym.site.service.SiteManagerVO; import itn.let.uss.umt.service.EgovMberManageService; @@ -1256,6 +1261,16 @@ public class MainController { model.addAttribute("mberManageVO", userManageService.selectUserInfo(mberManageVO)); } + /* + * 회원별 단가, 기본 단가, 이벤트 정보 조회 + * 2025.07.25 이지우 추가 + * */ + MberManageVO mberHeaderInfoVO = new MberManageVO(); + if(loginVO != null) { + mberHeaderInfoVO = mberManageService.selectMberHeaderInfo(loginVO.getId()); + } + model.addAttribute("mberHeaderInfoVO", mberHeaderInfoVO); + return "web/com/webCommonHeader"; } diff --git a/src/main/resources/egovframework/sqlmap/let/mjo/addr/Addr_SQL_Mysql.xml b/src/main/resources/egovframework/sqlmap/let/mjo/addr/Addr_SQL_Mysql.xml index a20ea414..e2447cef 100644 --- a/src/main/resources/egovframework/sqlmap/let/mjo/addr/Addr_SQL_Mysql.xml +++ b/src/main/resources/egovframework/sqlmap/let/mjo/addr/Addr_SQL_Mysql.xml @@ -569,10 +569,8 @@ on A.ADDR_GRP_ID = mag.ADDR_GRP_ID WHERE A.MBER_ID = #mberId# - AND (A.RECV_STATUS = 'Y' - or A.RECV_STATUS = 'S' - or A.RECV_STATUS is null) - AND mag.DELETE_YN = 'N' + AND (A.RECV_STATUS IN ('Y', 'S') OR A.RECV_STATUS IS NULL) + AND (A.ADDR_GRP_ID IS NULL OR MAG.DELETE_YN = 'N') @@ -1354,34 +1352,32 @@ , BOOKMARK , RECV_STATUS ) - SELECT - ADDR_GRP_ID - , MBER_ID - , ADDR_NM - , ADDR_PHONE_NO - , ADDR_INFO1 - , ADDR_INFO2 - , ADDR_INFO3 - , ADDR_INFO4 - , ADDR_COMMENT - , FRST_REGIST_PNTTM - , FRST_REGISTER_ID - , LAST_UPDT_PNTTM - , LAST_UPDUSR_ID - , DELETE_YN - , BOOKMARK - , RECV_STATUS - FROM TEMP_MJ_ADDR - WHERE MBER_ID = #mberId# - AND ADDR_GRP_ID = #addrGrpId# - AND BOOKMARK = #bookmark# - AND ADDR_PHONE_NO NOT IN - ( - SELECT ADDR_PHONE_NO FROM MJ_ADDR - WHERE MBER_ID = #mberId# - AND ADDR_GRP_ID = #addrGrpId# - AND BOOKMARK = #bookmark# - ) + SELECT t.ADDR_GRP_ID, + t.MBER_ID, + t.ADDR_NM, + FN_GETHYPHEN(t.ADDR_PHONE_NO), + t.ADDR_INFO1, + t.ADDR_INFO2, + t.ADDR_INFO3, + t.ADDR_INFO4, + t.ADDR_COMMENT, + t.FRST_REGIST_PNTTM, + t.FRST_REGISTER_ID, + t.LAST_UPDT_PNTTM, + t.LAST_UPDUSR_ID, + t.DELETE_YN, + t.BOOKMARK, + t.RECV_STATUS + FROM TEMP_MJ_ADDR AS t + LEFT JOIN MJ_ADDR AS m + ON m.MBER_ID = t.MBER_ID + AND m.ADDR_GRP_ID = t.ADDR_GRP_ID + AND m.BOOKMARK = t.BOOKMARK + AND replace(m.ADDR_PHONE_NO, '-', '') = replace(t.ADDR_PHONE_NO, '-', '') + WHERE t.MBER_ID = #mberId# + AND t.ADDR_GRP_ID = #addrGrpId# + AND t.BOOKMARK = #bookmark# + AND m.MBER_ID IS NULL 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 130ca67e..60483daf 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, @@ -143,7 +152,8 @@ AT_DELAY_YN, BIZ_KAKAO_RESEND_ORGNL_TXT, - BIZ_KAKAO_RESEND_TYPE + BIZ_KAKAO_RESEND_TYPE, + BIZ_KAKAO_IMAGE_TYPE )VALUES ( #msgGroupId#, @@ -154,6 +164,7 @@ #reqDate#, #msgGroupCnt#, #msgType#, + #adFlag#, #agentCode#, #eachPrice#, @@ -166,7 +177,8 @@ #atDelayYn#, #bizKakaoResendOrgnlTxt#, - #bizKakaoResendType# + #bizKakaoResendType#, + #bizKakaoImageType# ) @@ -180,6 +192,7 @@ , BIZ_KAKAO_FT_WIDE_IMG_PRICE , BIZ_SMS_PRICE , BIZ_MMS_PRICE + , BIZ_PICTURE_PRICE ) VALUES ( @@ -190,6 +203,7 @@ ,#kakaoFtWideImgPrice# ,#smsPrice# ,#mmsPrice# + ,#picturePrice# ) @@ -224,6 +238,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 @@ -233,11 +249,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' @@ -254,6 +273,15 @@ AND USERDATA = #userData# + + {call kakaoAt_Send(#userId#, #msgGroupId#, #userData#)} @@ -273,7 +301,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 2821631d..c9777d91 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 @@ -2180,6 +2184,8 @@ , BLINE_CODE AS blineCode , AT_SMISHING_YN AS atSmishingYn , PRE_PAYMENT_YN AS prePaymentYn + , BIZ_NO AS bizNo + , MBER_EMAIL_ADRES AS mberEmailAdres FROM LETTNGNRLMBER WHERE MBER_ID = #userId# @@ -3170,6 +3176,7 @@ WHERE 1 = 1 AND pf.SentEA > 0 AND mjf.USER_ID = #userId# + AND mjf.RESERVE_C_YN = 'N' ) AS pay WHERE 1=1 @@ -3279,7 +3286,7 @@ , M.fileName3 AS fileName3 , M.orderByCode AS orderByCode , M.msgId AS msgId - , M.reqDate AS reqDate + , DATE_FORMAT(M.reqDate, '%Y-%m-%d %H:%i') AS reqDate FROM (SELECT DATE_FORMAT(B.REGDATE, '%Y-%m-%d %H:%i' ) AS regDate @@ -3320,7 +3327,7 @@ /*and A.DEL_FLAG = 'N'*/ AND A.USER_ID = #userId# AND B.USER_ID = #userId# - /*AND B.RESERVE_C_YN = 'N'*/ + AND B.RESERVE_C_YN = 'N' ORDER BY 1=1 , msgGroupId DESC , sentDate DESC @@ -3368,6 +3375,7 @@ WHERE 1 = 1 AND pf.SentEA > 0 AND mjf.USER_ID = #userId# + AND mjf.RESERVE_C_YN = 'N' ) AS pay WHERE 1=1 @@ -3593,9 +3601,9 @@ , MIN(DATE_FORMAT(M.REQ_DATE, '%Y-%m-%d' )) AS minRegDate , M.msgTypeName , M.orderByCode - , SUM(IF(M.msgTypeName = '단문(SMS)', 1, 0)) AS shtSendCount - , SUM(IF(M.msgTypeName = '장문(LMS)', 1, 0)) AS longSendCount - , SUM(IF(M.msgTypeName = '그림(MMS)', 1, 0)) AS pictSendCount + , SUM(IF(M.msgTypeName = '단문', 1, 0)) AS shtSendCount + , SUM(IF(M.msgTypeName = '장문', 1, 0)) AS longSendCount + , SUM(IF(M.msgTypeName = '그림', 1, 0)) AS pictSendCount , SUM(IF(M.msgTypeName = '알림톡', 1, 0)) AS atSendCount , SUM(IF(M.msgTypeName = '친구톡', 1, 0)) AS ftSendCount @@ -3614,14 +3622,14 @@ , B.MSG_TYPE , CASE WHEN B.MSG_TYPE = '6' AND B.FILE_CNT > 0 - THEN '그림(MMS)' + THEN '그림' WHEN B.MSG_TYPE = '6' AND B.FILE_CNT = 0 - THEN '장문(LMS)' + THEN '장문' WHEN B.MSG_TYPE = '8' THEN '알림톡' WHEN B.MSG_TYPE = '9' THEN '친구톡' - ELSE '단문(SMS)' + ELSE '단문' END msgTypeName , CASE WHEN B.MSG_TYPE = '6' AND B.FILE_CNT > 0 @@ -7433,6 +7441,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..66b242c2 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 신명섭 --> - + + @@ -100,6 +101,7 @@ , D.CODE_NM AS rcptTypeTxt , E.CONFIRM_YN AS confirmYn , E.RCPT_TYPE AS rcptType + , E.CONFIRM_DATE AS confirmDate , IFNULL(MP.POINT, '0') AS point , EMI.EVENT_PG_MOID AS eventMoid , mber.SMISHING_YN AS smishingYn @@ -148,6 +150,7 @@ MOID , CONFIRM_YN , RCPT_TYPE + , CONFIRM_DATE FROM MJ_TAX WHERE 1=1 @@ -606,6 +609,7 @@ MEMO, ORDER_ID, MSG_GROUP_ID + )VALUES ( #userId#, @@ -624,6 +628,22 @@ + + + + INSERT INTO MJ_PG ( @@ -2355,4 +2375,27 @@ + + \ No newline at end of file diff --git a/src/main/resources/egovframework/sqlmap/let/uss/umt/EgovMberManage_SQL_Mysql.xml b/src/main/resources/egovframework/sqlmap/let/uss/umt/EgovMberManage_SQL_Mysql.xml index aedf797a..11fd56b9 100644 --- a/src/main/resources/egovframework/sqlmap/let/uss/umt/EgovMberManage_SQL_Mysql.xml +++ b/src/main/resources/egovframework/sqlmap/let/uss/umt/EgovMberManage_SQL_Mysql.xml @@ -2142,4 +2142,38 @@ + diff --git a/src/main/resources/egovframework/sqlmap/let/uss/umt/EgovUserManage_SQL_Mysql.xml b/src/main/resources/egovframework/sqlmap/let/uss/umt/EgovUserManage_SQL_Mysql.xml index eb97a567..75e0c297 100644 --- a/src/main/resources/egovframework/sqlmap/let/uss/umt/EgovUserManage_SQL_Mysql.xml +++ b/src/main/resources/egovframework/sqlmap/let/uss/umt/EgovUserManage_SQL_Mysql.xml @@ -1458,5 +1458,15 @@ AND MONTH(REG_DATE) = MONTH(CURRENT_DATE) - + + + + diff --git a/src/main/webapp/publish/kmc/kmcis_web_sample_step01.jsp b/src/main/webapp/WEB-INF/jsp/sample/kmc/kmcis_web_sample_step01.jsp similarity index 100% rename from src/main/webapp/publish/kmc/kmcis_web_sample_step01.jsp rename to src/main/webapp/WEB-INF/jsp/sample/kmc/kmcis_web_sample_step01.jsp diff --git a/src/main/webapp/publish/kmc/kmcis_web_sample_step02.jsp b/src/main/webapp/WEB-INF/jsp/sample/kmc/kmcis_web_sample_step02.jsp similarity index 100% rename from src/main/webapp/publish/kmc/kmcis_web_sample_step02.jsp rename to src/main/webapp/WEB-INF/jsp/sample/kmc/kmcis_web_sample_step02.jsp diff --git a/src/main/webapp/publish/kmc/kmcis_web_sample_step03.jsp b/src/main/webapp/WEB-INF/jsp/sample/kmc/kmcis_web_sample_step03.jsp similarity index 100% rename from src/main/webapp/publish/kmc/kmcis_web_sample_step03.jsp rename to src/main/webapp/WEB-INF/jsp/sample/kmc/kmcis_web_sample_step03.jsp diff --git a/src/main/webapp/publish/kmc/kmcis_web_sample_step04.jsp b/src/main/webapp/WEB-INF/jsp/sample/kmc/kmcis_web_sample_step04.jsp similarity index 100% rename from src/main/webapp/publish/kmc/kmcis_web_sample_step04.jsp rename to src/main/webapp/WEB-INF/jsp/sample/kmc/kmcis_web_sample_step04.jsp diff --git a/src/main/webapp/publish/nicepay/cancelRequest.jsp b/src/main/webapp/WEB-INF/jsp/sample/nicepay/cancelRequest.jsp similarity index 100% rename from src/main/webapp/publish/nicepay/cancelRequest.jsp rename to src/main/webapp/WEB-INF/jsp/sample/nicepay/cancelRequest.jsp diff --git a/src/main/webapp/publish/nicepay/cancelRequest_utf.jsp b/src/main/webapp/WEB-INF/jsp/sample/nicepay/cancelRequest_utf.jsp similarity index 100% rename from src/main/webapp/publish/nicepay/cancelRequest_utf.jsp rename to src/main/webapp/WEB-INF/jsp/sample/nicepay/cancelRequest_utf.jsp diff --git a/src/main/webapp/publish/nicepay/cancelResult.jsp b/src/main/webapp/WEB-INF/jsp/sample/nicepay/cancelResult.jsp similarity index 100% rename from src/main/webapp/publish/nicepay/cancelResult.jsp rename to src/main/webapp/WEB-INF/jsp/sample/nicepay/cancelResult.jsp diff --git a/src/main/webapp/publish/nicepay/cancelResult_utf.jsp b/src/main/webapp/WEB-INF/jsp/sample/nicepay/cancelResult_utf.jsp similarity index 100% rename from src/main/webapp/publish/nicepay/cancelResult_utf.jsp rename to src/main/webapp/WEB-INF/jsp/sample/nicepay/cancelResult_utf.jsp diff --git a/src/main/webapp/publish/nicepay/payRequest.jsp b/src/main/webapp/WEB-INF/jsp/sample/nicepay/payRequest.jsp similarity index 100% rename from src/main/webapp/publish/nicepay/payRequest.jsp rename to src/main/webapp/WEB-INF/jsp/sample/nicepay/payRequest.jsp diff --git a/src/main/webapp/publish/nicepay/payRequest.jsp_back b/src/main/webapp/WEB-INF/jsp/sample/nicepay/payRequest.jsp_back similarity index 100% rename from src/main/webapp/publish/nicepay/payRequest.jsp_back rename to src/main/webapp/WEB-INF/jsp/sample/nicepay/payRequest.jsp_back diff --git a/src/main/webapp/publish/nicepay/payRequest_utf.jsp b/src/main/webapp/WEB-INF/jsp/sample/nicepay/payRequest_utf.jsp similarity index 100% rename from src/main/webapp/publish/nicepay/payRequest_utf.jsp rename to src/main/webapp/WEB-INF/jsp/sample/nicepay/payRequest_utf.jsp diff --git a/src/main/webapp/publish/nicepay/payResult.jsp b/src/main/webapp/WEB-INF/jsp/sample/nicepay/payResult.jsp similarity index 100% rename from src/main/webapp/publish/nicepay/payResult.jsp rename to src/main/webapp/WEB-INF/jsp/sample/nicepay/payResult.jsp diff --git a/src/main/webapp/publish/nicepay/payResultAjax.jsp b/src/main/webapp/WEB-INF/jsp/sample/nicepay/payResultAjax.jsp similarity index 100% rename from src/main/webapp/publish/nicepay/payResultAjax.jsp rename to src/main/webapp/WEB-INF/jsp/sample/nicepay/payResultAjax.jsp diff --git a/src/main/webapp/publish/nicepay/payResult_utf.jsp b/src/main/webapp/WEB-INF/jsp/sample/nicepay/payResult_utf.jsp similarity index 100% rename from src/main/webapp/publish/nicepay/payResult_utf.jsp rename to src/main/webapp/WEB-INF/jsp/sample/nicepay/payResult_utf.jsp diff --git a/src/main/webapp/WEB-INF/jsp/web/addr/AddrList.jsp b/src/main/webapp/WEB-INF/jsp/web/addr/AddrList.jsp index a6d05299..47b8716c 100644 --- a/src/main/webapp/WEB-INF/jsp/web/addr/AddrList.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/addr/AddrList.jsp @@ -112,16 +112,17 @@ function insertAddrAjax() { // return; //} - if(!checkHpNum(form.addrPhoneNo.value)){//휴대폰 유효성 검사 - if(!checkNorPhoneNum(form.addrPhoneNo.value)){//일반전화 유효성 검사 - + if(!isValidPhoneNumber(form.addrPhoneNo.value)){//일반전화 유효성 검사 + const formattedNumber =formatPhoneNumber(form.addrPhoneNo.value); // 번호 표준화 + if(!isValidPhoneNumber(formattedNumber)){ alert("잘못된 휴대폰번호 또는 일반전화 번호 입니다."); return false; - } - } + //휴대폰번호 포맷 맞추기 + form.addrPhoneNo.value = formatPhoneNumber(form.addrPhoneNo.value); + var data = new FormData(form); $.ajax({ diff --git a/src/main/webapp/WEB-INF/jsp/web/com/webCommonHeader.jsp b/src/main/webapp/WEB-INF/jsp/web/com/webCommonHeader.jsp index a01c6164..7ec4848e 100644 --- a/src/main/webapp/WEB-INF/jsp/web/com/webCommonHeader.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/com/webCommonHeader.jsp @@ -1398,14 +1398,14 @@ function actionLogin_end(){ @@ -1638,7 +1638,9 @@ function actionLogin_end(){
  • -
    마이페이지
    + <%-- 250724 마이페이지 대시보드 삭제 --%> + <%--
    마이페이지
    --%> +
    마이페이지
    @@ -1663,7 +1665,7 @@ function actionLogin_end(){
  • 요금안내/견적내기
  • 결제하기
  • 요금 결제내역
  • -
  • 요금 사용내역
  • +
  • 요금 사용내역
  • <%--
  • 계산서/현금영수증 발행 등록
  • --%>
  • 세금계산서 발행
  • @@ -1755,8 +1757,9 @@ function actionLogin_end(){
    - <%--
    +

    친구톡

    -

    +

    0

    대기
    -
    +
    0
    성공
    -
    +
    0
    실패
    -
    +
    0
    -
    --%> +
      -
    • active">
    • -
    • active">
    • - <%-- -
    • active">
    • -
      --%> +
    • +
    • + +
    • +
    diff --git a/src/main/webapp/WEB-INF/jsp/web/kakao/template/ft/KakaoFriendstalkTemplateList.jsp b/src/main/webapp/WEB-INF/jsp/web/kakao/template/ft/KakaoFriendstalkTemplateList.jsp index 5e6bf1a3..3f03b04a 100644 --- a/src/main/webapp/WEB-INF/jsp/web/kakao/template/ft/KakaoFriendstalkTemplateList.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/kakao/template/ft/KakaoFriendstalkTemplateList.jsp @@ -400,7 +400,8 @@ function fnGoSampleTemplate(){

    카카오톡 설정

    - + +
    @@ -436,7 +437,7 @@ function fnGoSampleTemplate(){
    - +
    diff --git a/src/main/webapp/WEB-INF/jsp/web/kakao/template/ft/KakaoFriendstalkTemplateListAjax.jsp b/src/main/webapp/WEB-INF/jsp/web/kakao/template/ft/KakaoFriendstalkTemplateListAjax.jsp index cdefd3a5..6615ecb6 100644 --- a/src/main/webapp/WEB-INF/jsp/web/kakao/template/ft/KakaoFriendstalkTemplateListAjax.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/kakao/template/ft/KakaoFriendstalkTemplateListAjax.jsp @@ -132,7 +132,7 @@ $(function(){
    등록일
    - +<%-- --%>
    diff --git a/src/main/webapp/WEB-INF/jsp/web/login/loginRestrictionUse.jsp b/src/main/webapp/WEB-INF/jsp/web/login/loginRestrictionUse.jsp index 6964b613..100ebbde 100644 --- a/src/main/webapp/WEB-INF/jsp/web/login/loginRestrictionUse.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/login/loginRestrictionUse.jsp @@ -273,7 +273,7 @@ $(document).ready(function(){
    - + <%--
    회원님의 아이디로 발송된 정보통신망법 제50조 위반 문자내용
    @@ -323,7 +323,7 @@ $(document).ready(function(){
    - + --%> diff --git a/src/main/webapp/WEB-INF/jsp/web/msgdata/include/msgDataIncludeExcel.jsp b/src/main/webapp/WEB-INF/jsp/web/msgdata/include/msgDataIncludeExcel.jsp index 7561e7df..8ea20ea4 100644 --- a/src/main/webapp/WEB-INF/jsp/web/msgdata/include/msgDataIncludeExcel.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/msgdata/include/msgDataIncludeExcel.jsp @@ -943,19 +943,6 @@ $(document).on('click', '#errorExcelBtn', function() {
    - diff --git a/src/main/webapp/WEB-INF/jsp/web/pay/BillPub.jsp b/src/main/webapp/WEB-INF/jsp/web/pay/BillPub.jsp index e0bd2890..5550f43f 100644 --- a/src/main/webapp/WEB-INF/jsp/web/pay/BillPub.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/pay/BillPub.jsp @@ -495,7 +495,7 @@
  • -
  • +
  • diff --git a/src/main/webapp/WEB-INF/jsp/web/pay/MsgPrintUsageDetailsPopUp.jsp b/src/main/webapp/WEB-INF/jsp/web/pay/MsgPrintUsageDetailsPopUp.jsp index 9238f78c..abe09cb8 100644 --- a/src/main/webapp/WEB-INF/jsp/web/pay/MsgPrintUsageDetailsPopUp.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/pay/MsgPrintUsageDetailsPopUp.jsp @@ -68,22 +68,60 @@ function f_print(){ - 수신 - ${mberNm} + 등록번호 + + + + + + + - + + + - 참조 - 담당자 ${managerNm} 님 + 상호 + + + + + + + - + + + - 거래일자 - ${startDate}~${endDate} + 성명 + + + + + + + + + + + + + 전화번호 + + + + 이 메 일 + + + + 님의 사용내역(~)을 아래와 같이 확인합니다. -
    + <%--

    총 사용금액

    @@ -93,24 +131,22 @@ function f_print(){

    ${addTaxSumPrice} 원(VAT 포함)

    -
    +
    --%>

    (단위 : 원, 건)

    - - - + + - + - - + @@ -120,15 +156,15 @@ function f_print(){ -
    품목, 발송건수, 공급가액, 부가세, 금액 정보를 제공하는 표
    품목문자유형 발송건수공급가액금액사용금액
    ${result.msgTypeName} - + - + - + @@ -144,10 +180,6 @@ function f_print(){ <%-- --%> - - - @@ -188,52 +220,13 @@ function f_print(){ -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    공급가액, 총 결제금액에 대한 표
    공급가액${supplySumPrice}
    총 사용금액${totalSumPrice}
    세액(부가세)${addTax}
    총 사용금액${addTaxSumPrice}
    - 사용내역이 없습니다. -
    +
    +

    총 사용금액 (VAT 별도)

    +

    + +

    +

    ${year} 년  ${month} 월  ${day}

    diff --git a/src/main/webapp/WEB-INF/jsp/web/pay/PayGuide.jsp b/src/main/webapp/WEB-INF/jsp/web/pay/PayGuide.jsp index 7756c219..0cedbb59 100644 --- a/src/main/webapp/WEB-INF/jsp/web/pay/PayGuide.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/pay/PayGuide.jsp @@ -1,867 +1,867 @@ -<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> -<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> - - - - - - -
    - - - - - - -
    - -
    - -
      -
    • -
    • -
    • -
    • -
    • -
    - - -
    -
    -

    요금안내/견적내기

    - -
    - -
    -
      -
    • - -
    • -
    • - -
    • -
    -
    - - -
    -
    -

    - 문자이미지 문자 -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    구분특징가격
    단문(SMS)90Byte 이하 단문 메시지(이미지 첨부 불가)${shortPrice}
    장문(LMS)91~2,000Byte 이하 장문메시지(이미지 첨부 불가)${longPrice}
    그림문자(MMS)2,000Byte 이하 문자 및 이미지를 포함하는그림메시지(이미지 최대 3장 첨부 가능) 1장 : ${picturePrice}원 / 2장 : ${picturePrice2}원/ 3장 : ${picturePrice3}
    - * 텍스트 용량(Byte)에 대한 안내 : 한글2Byte, 영문·숫자 1Byte를 차지. - - - - - -

    알림톡 아이콘 이미지 알림톡

    - - - - - - - - - - - - - - - - - - - - -
    구분특징가격
    알림톡카카오톡을 통해 친구 추가 여부와 관계 없이 휴대폰 번호로 발송이 가능한 정보성 메시지
    (1,000자 이하의 텍스트 및 이미지 중 카카오 사전 승인 건에 한하여 발송 가능)
    1장 : ${kakaoAtPrice}
    - * 텍스트 용량(Byte)에 대한 안내 : 한글2Byte, 영문·숫자 1Byte를 차지. - -

    팩스 아이콘 이미지 팩스

    - - - - - - - - - - - - - - - - - - - - -
    구분특징(전송가능확장자)가격
    팩스전송 가능 파일(hwp, pdf, ppt, xls, xlsx, doc, jpg, jpeg, bmp, txt, gif, hwpml, tif, gul)1매 : ${faxPrice}
    - -

    그림문자 맞춤제작 이미지 그림문자 맞춤제작

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    구분가격
    문자온 샘플 수정(글자, 색상, 폰트 등)${customSamplePrice}
    이미지 편집(첨부이미지 1장)${customEditPrice}
    이미지 편집(첨부이미지 3장이하)${customEdit3Price}
    텍스트 단순수정${customTextPrice}
    - * 텍스트 단순수정 요청은 맞춤제작이 완료된 그림문자의 수정 시에만 가능합니다. - - -
    -
    - - - -
    -
      -
    • -
      -
      - 요금안내 - -
      -
      -
      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      요금 안내
      구분특징금액
      단문(SMS)90Byte 이하 단문 메시지(이미지 첨부 불가)${shortPrice}
      장문(LMS)91~2,000Byte 이하 장문메시지(이미지 첨부 불가)${longPrice}
      그림문자(MMS)2,000Byte 이하 문자 및 이미지를 포함하는 그림메시지(이미지 최대 3장 첨부 가능)1장 : ${picturePrice}원 / 2장 : ${picturePrice2}원 / 3장 : ${picturePrice3}
      카카오(알림톡)카카오톡을 통해 친구 추가 여부와 관계 없이 휴대폰 번호로 발송이 가능한 정보성 메시지(1,000자 이하의 텍스트 및 이미지 중 카카오 사전 승인 건에 한하여 발송 가능)${kakaoAtPrice}
      팩스전송 가능 파일(hwp, pdf, ppt, xls, xlsx, doc, jpg, jpeg, bmp, txt, gif, hwpml, tif, htm, html, gul)${faxPrice}
      맞춤제작문자온 샘플 수정(글자, 색상, 폰트 등)${customSamplePrice}
      맞춤제작이미지 편집(첨부이미지 1장)${customEditPrice}
      맞춤제작이미지 편집(첨부이미지 3장이하)${customEdit3Price}
      맞춤제작텍스트 단순수정${customTextPrice}
      -
      -
    • -
    -
    -

    일반정보

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    제목 - - -
    수신자(기업명) - - -
    담당자(성명) - - -
    연락처 - - -
    발행일 -
    - -
    -
    - -

    품목정보

    - - - - - - - - - - - - - - - - - - - - -
    구분 - - - - -

    -
    건수 - - -

    -
    - -
    -
    -
    -
    - -
    -
    - -
    - -
    -
    - - -
    -
    품목
    -
    단가(원)
    -
    건수(건)
    -
    공급가액(원)
    -
    세액(부가세)
    -
    금액(원)
    -
    - -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - -
    - - - - - - - - - - - - - - - - - - - - - - - -
    공급가액세액(부가세)합계비고
    - - - - - - - - -
    -
    - -
    - -
    -
    -
    - -
    -
    - -
    - -
    -
    - -
    +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> + + + + + + +
    + + + + + + +
    + +
    + +
      +
    • +
    • +
    • +
    • +
    • +
    + + +
    +
    +

    요금안내/견적내기

    + +
    + +
    +
      +
    • + +
    • +
    • + +
    • +
    +
    + + +
    +
    +

    + 문자이미지 문자 +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    구분특징가격
    단문(SMS)90Byte 이하 단문 메시지(이미지 첨부 불가)${shortPrice}
    장문(LMS)91~2,000Byte 이하 장문메시지(이미지 첨부 불가)${longPrice}
    그림문자(MMS)2,000Byte 이하 문자 및 이미지를 포함하는그림메시지(이미지 최대 3장 첨부 가능) 1장 : ${picturePrice}원 / 2장 : ${picturePrice2}원/ 3장 : ${picturePrice3}
    + * 텍스트 용량(Byte)에 대한 안내 : 한글2Byte, 영문·숫자 1Byte를 차지. + + + + + +

    알림톡 아이콘 이미지 알림톡

    + + + + + + + + + + + + + + + + + + + + +
    구분특징가격
    알림톡카카오톡을 통해 친구 추가 여부와 관계 없이 휴대폰 번호로 발송이 가능한 정보성 메시지
    (1,000자 이하의 텍스트 및 이미지 중 카카오 사전 승인 건에 한하여 발송 가능)
    1장 : ${kakaoAtPrice}
    + * 텍스트 용량(Byte)에 대한 안내 : 한글2Byte, 영문·숫자 1Byte를 차지. + +

    팩스 아이콘 이미지 팩스

    + + + + + + + + + + + + + + + + + + + + +
    구분특징(전송가능확장자)가격
    팩스전송 가능 파일(hwp, pdf, ppt, xls, xlsx, doc, jpg, jpeg, bmp, txt, gif, hwpml, tif, gul)1매 : ${faxPrice}
    + +

    그림문자 맞춤제작 이미지 그림문자 맞춤제작

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    구분가격
    문자온 샘플 수정(글자, 색상, 폰트 등)${customSamplePrice}
    이미지 편집(첨부이미지 1장)${customEditPrice}
    이미지 편집(첨부이미지 3장이하)${customEdit3Price}
    텍스트 단순수정${customTextPrice}
    + * 텍스트 단순수정 요청은 맞춤제작이 완료된 그림문자의 수정 시에만 가능합니다. + + +
    +
    + + + +
    +
      +
    • +
      +
      + 요금안내 + +
      +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      요금 안내
      구분특징금액
      단문(SMS)90Byte 이하 단문 메시지(이미지 첨부 불가)${shortPrice}
      장문(LMS)91~2,000Byte 이하 장문메시지(이미지 첨부 불가)${longPrice}
      그림문자(MMS)2,000Byte 이하 문자 및 이미지를 포함하는 그림메시지(이미지 최대 3장 첨부 가능)1장 : ${picturePrice}원 / 2장 : ${picturePrice2}원 / 3장 : ${picturePrice3}
      카카오(알림톡)카카오톡을 통해 친구 추가 여부와 관계 없이 휴대폰 번호로 발송이 가능한 정보성 메시지(1,000자 이하의 텍스트 및 이미지 중 카카오 사전 승인 건에 한하여 발송 가능)${kakaoAtPrice}
      팩스전송 가능 파일(hwp, pdf, ppt, xls, xlsx, doc, jpg, jpeg, bmp, txt, gif, hwpml, tif, htm, html, gul)${faxPrice}
      맞춤제작문자온 샘플 수정(글자, 색상, 폰트 등)${customSamplePrice}
      맞춤제작이미지 편집(첨부이미지 1장)${customEditPrice}
      맞춤제작이미지 편집(첨부이미지 3장이하)${customEdit3Price}
      맞춤제작텍스트 단순수정${customTextPrice}
      +
      +
    • +
    +
    +

    일반정보

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    제목 + + +
    수신자(기업명) + + +
    담당자(성명) + + +
    연락처 + + +
    발행일 +
    + +
    +
    + +

    품목정보

    + + + + + + + + + + + + + + + + + + + + +
    구분 + + + + +

    +
    건수 + + +

    +
    + +
    +
    +
    +
    + +
    +
    + +
    + +
    +
    + + +
    +
    품목
    +
    단가(원)
    +
    건수(건)
    +
    공급가액(원)
    +
    세액(부가세)
    +
    금액(원)
    +
    + +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + +
    공급가액세액(부가세)합계비고
    + + + + + + + + +
    +
    + +
    + +
    +
    +
    + +
    +
    + +
    + +
    +
    + +
    diff --git a/src/main/webapp/WEB-INF/jsp/web/pay/PayList.jsp b/src/main/webapp/WEB-INF/jsp/web/pay/PayList.jsp index 2c639a47..c34425c3 100644 --- a/src/main/webapp/WEB-INF/jsp/web/pay/PayList.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/pay/PayList.jsp @@ -141,21 +141,11 @@ function fnShowPointPrintPopup(){ } //환불요청 내역 프린트 출력 팝업 -function fnShowRefundPrintPopup(){ - - //날자 체크 - if( $('#startDate').val() != '' && $('#endDate').val() != '' ){ - var iChkBeginDe = Number($('#startDate').val().replaceAll("/", "")); - var iChkEndDe = Number($('#endDate').val().replaceAll("/", "")); - if(iChkBeginDe > iChkEndDe || iChkEndDe < iChkBeginDe ){ - alert("기간설정의 시작일자는 종료일자 보다 클수 없습니다."); - return; - } - } +function fnShowRefundPrintPopup(moid){ //만들려는 팝업의 크기 - var popup_wid = '840'; - var popup_ht = '900'; + var popup_wid = '790'; + var popup_ht = '800'; var popup_left = (window.screen.width / 2) - (popup_wid / 2); var popup_top =(window.screen.height / 2) - (popup_ht / 2); @@ -165,6 +155,23 @@ function fnShowRefundPrintPopup(){ $("#listForm").attr({"action":"/web/member/pay/PayPrintRefundListPopUpAjax.do", "method":"post"}).submit(); } +//거래명세서 팝업 +function fnShowPayInvoicePrintPopup(moid){ + + + //만들려는 팝업의 크기 + var popup_wid = '790'; + var popup_ht = '800'; + + var popup_left = (window.screen.width / 2) - (popup_wid / 2); + var popup_top =(window.screen.height / 2) - (popup_ht / 2); + + document.invoiceForm.moid.value = moid; + + $("#invoiceForm").attr("target","invoicePrint"); + window.open('', 'invoicePrint', 'width='+ popup_wid +', height='+ popup_ht +', left=' + popup_left + ', top='+ popup_top +',scrollbars=1'); + $("#invoiceForm").attr({"action":"/web/member/pay/payInvoicePopupAjax.do", "method":"post"}).submit(); +} @@ -176,7 +183,7 @@ function fnShowRefundPrintPopup(){
  • -
  • +
  • diff --git a/src/main/webapp/WEB-INF/jsp/web/pay/PayListAllAjax.jsp b/src/main/webapp/WEB-INF/jsp/web/pay/PayListAllAjax.jsp index 19b1cd14..3c51657c 100644 --- a/src/main/webapp/WEB-INF/jsp/web/pay/PayListAllAjax.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/pay/PayListAllAjax.jsp @@ -409,13 +409,13 @@ function getMberGrdChk() {
    -
    +
    ※ 요금 결제내역은 결제일을 기준으로 최대 6개월까지만 조회가능합니다.
    - ※ 간편결제 영수증은 결제하신 서비스를 통해 제공됩니다. + ※ 간편결제 영수증은 결제하신 서비스를 통해 제공됩니다.
    ※ 후불제 고객의 사용금액 결제수단은 계좌이체만 가능합니다.
    @@ -423,6 +423,7 @@ function getMberGrdChk() {

    -입금은행:우리은행-입금계좌:1005-904-154328-받는사람:주식회사 아이티앤

    + ※ 거래명세서는 세금계산서 발행일로부터 30일 이내에만 출력 가능합니다.
  • -
  • +
  • diff --git a/src/main/webapp/WEB-INF/jsp/web/pay/payInvoicePrintPopup.jsp b/src/main/webapp/WEB-INF/jsp/web/pay/payInvoicePrintPopup.jsp new file mode 100644 index 00000000..9e3d35c5 --- /dev/null +++ b/src/main/webapp/WEB-INF/jsp/web/pay/payInvoicePrintPopup.jsp @@ -0,0 +1,384 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="ui" uri="http://egovframework.gov/ctl/ui"%> +<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> +<%@ page import="itn.com.cmm.LoginVO" %> + + + + + + 거래명세서 + + + + + + + + + + +
    +
    +
    + 문자온 CI +
    +

    (12248) 경기도 남양주시 다산순환로 20, A동 735호(다산동, 현대프리미어캠퍼스)

    +

    TEL 1551-8011

    +
    +
    +
    +

    거래명세서(공급받는자 보관용)

    +
    +
    +

    공급받는 자

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    등록번호, 상호, 성명, 전화번호, 이메일 정보 제공
    등록번호 + + + + + + - + + + +
    상     호 + + + + + + - + + +
    성     명 + + + + + + + + +
    전화번호 + +
    이 메 일 + +
    +
    +
    +

    공급자

    + 도장 + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    등록번호, 상호, 성명, 전화번호, 이메일 정보 제공
    등록번호653-87-00858
    상     호주식회사 아이티앤
    성     명유인식
    전화번호1551-8011
    이 메 일help@iten.co.kr
    +
    +
    +
    + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    작성일자, 공급가액, 세액, 비고 정보를 제공하는 표
    작성일자공급가액세액
    비고 + + + 사용기간(${result.startDate} ~ ${result.endDate}) + + + - + + + +
    +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    월, 일, 품목, 규격, 수량, 단가, 공급가액, 세액, 비고 정보를 제공하는 표
    품목규격수량단가공급가액세액비고
    문자온 메시징 서비스 이용료-
    합계금액전잔액입금액현잔액 + + + + 이 금액을 [청 구]함 + + + 이 금액을 [영 수]함 + + +
    + + -- + +
    +
    +
    + + + +
    +
    + +
    +
    +
    + + + diff --git a/src/main/webapp/WEB-INF/jsp/web/pop/kakaoFtPop.jsp b/src/main/webapp/WEB-INF/jsp/web/pop/kakaoFtPop.jsp new file mode 100644 index 00000000..b8a993da --- /dev/null +++ b/src/main/webapp/WEB-INF/jsp/web/pop/kakaoFtPop.jsp @@ -0,0 +1,30 @@ + +<%@ page contentType="text/html; charset=utf-8"%> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="ui" uri="http://egovframework.gov/ctl/ui"%> +<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%> +<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%> +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> +<%@ taglib prefix="ec" uri="/WEB-INF/tld/ecnet_tld.tld"%> + + + +
    + +
    +
      + +
    • 친구톡은 알림톡과 달리 별도의 템플릿 심사가 필요하지 않습니다.
    • +
    • 등록된 템플릿은 자유롭게 삭제가 가능합니다.
    • +
    • 문자온이 제공하지 않는 이모티콘, 이모지를 포함하여 템플릿을 등록할 경우, 친구톡 발송이 불가합니다.
    • +
    +
    +
    + \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/jsp/web/user/mberCompanyInfoChange.jsp b/src/main/webapp/WEB-INF/jsp/web/user/mberCompanyInfoChange.jsp index bed33f22..87e70649 100644 --- a/src/main/webapp/WEB-INF/jsp/web/user/mberCompanyInfoChange.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/user/mberCompanyInfoChange.jsp @@ -242,25 +242,17 @@ function updateUserInfo(){ $("#receivemail").val("N"); } - if($("#emailId").val() == ""){ - alert("이메일을 입력해주세요."); + if($("#emailId").val().trim() == "" || $("#emailAdd").val().trim() == ""){ + alert("이메일은 필수 입력 항목입니다.") return false; - } - - if($("#emailId").val() != ""|| $("#emailAdd").val() != ""){ - if($("#emailAdd").val() != ""){ - var email = $("#emailId").val() + "@" + $("#emailAdd").val(); - var taxExptext = /^[0-9a-zA-Z]([-_.]?[0-9a-zA-Z])*@[0-9a-zA-Z]([-_.]?[0-9a-zA-Z])*.[a-zA-Z]{2,3}$/i; - if(taxExptext.test(email)==false){ - alert("이메일주소 형식이 올바르지 않습니다."); - return false; - } - - $("#mberEmailAdres").val(email); - }else{ - alert("이메일 주소를 확인해 주세요"); + }else { + var email = $("#emailId").val() + "@" + $("#emailAdd").val(); + var taxExptext = /^[0-9a-zA-Z]([-_.]?[0-9a-zA-Z])*@[0-9a-zA-Z]([-_.]?[0-9a-zA-Z])*.[a-zA-Z]{2,3}$/i; + if(taxExptext.test(email)==false){ + alert("이메일주소 형식이 올바르지 않습니다."); return false; } + $("#mberEmailAdres").val(email); } if("${cmpPhoneChangeManageVO.hstSttus}" == '03'){ @@ -678,7 +670,7 @@ function changeValueWork(obj){
    -
    *이메일
    +
    이메일