From 69e592478f603ef6b6420027db15bbfc85611483 Mon Sep 17 00:00:00 2001 From: "hehihoho3@gmail.com" Date: Tue, 15 Apr 2025 11:45:56 +0900 Subject: [PATCH 01/48] =?UTF-8?q?=EC=B9=9C=EA=B5=AC=ED=86=A1=20=EC=A7=84?= =?UTF-8?q?=ED=96=89=EC=A4=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/KakaoFriendsTalkService.java | 12 + .../impl/KakaoFriendsTalkServiceImpl.java | 37 + .../web/KakaoFriendsTalkSendController.java | 30 + .../ft/KakaoFriendsTalkMsgDataView.jsp | 11 +- ...ndsTalkMsgDataView_advcbackup_20250414.jsp | 2549 +++++++++++++++++ 5 files changed, 2636 insertions(+), 3 deletions(-) create mode 100644 src/main/java/itn/let/kakao/user/kakaoFt/service/KakaoFriendsTalkService.java create mode 100644 src/main/java/itn/let/kakao/user/kakaoFt/service/impl/KakaoFriendsTalkServiceImpl.java create mode 100644 src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/ft/KakaoFriendsTalkMsgDataView_advcbackup_20250414.jsp 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..3be81d80 --- /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); + +} 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..93bee0d0 --- /dev/null +++ b/src/main/java/itn/let/kakao/user/kakaoFt/service/impl/KakaoFriendsTalkServiceImpl.java @@ -0,0 +1,37 @@ +package itn.let.kakao.user.kakaoFt.service.impl; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; + +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Service; + +import egovframework.rte.fdl.cmmn.EgovAbstractServiceImpl; +import egovframework.rte.fdl.idgnr.EgovIdGnrService; +import itn.let.kakao.kakaoComm.KakaoVO; +import itn.let.kakao.user.kakaoFt.service.KakaoFriendsTalkService; +import itn.let.mail.service.StatusResponse; + +@Service("kakaoFriendsTalkTemplateService") +public class KakaoFriendsTalkServiceImpl extends EgovAbstractServiceImpl implements KakaoFriendsTalkService{ + + @Resource(name = "egovFriendstalkTemplateIdService") + private EgovIdGnrService idgenFriendTalkTmpId; + + @Resource(name="kakaoFriendsTalkTemplateDAO") + private KakaoFriendsTalkTemplateDAO kakaoFriendsTalkTemplateDAO; + + @Override + public StatusResponse insertKakaoFtSandAjax_advc(KakaoVO kakaoVO, HttpServletRequest request) { + StatusResponse statusResponse = new StatusResponse(); + + + + + + 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..9e094be8 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; @@ -313,7 +320,30 @@ public class KakaoFriendsTalkSendController { return modelAndView; } + + /** + * 문자 발송 기능 + * @param searchVO + * @param model + * @return "/web/mjon/msgdata/sendMsgDataAjax.do" + * @throws Exception + */ + @RequestMapping(value = "/web/mjon/kakao/friendstalk/kakaoFriendsTalkMsgSendAjax_advc.do") + public ResponseEntity sendMsgData_ft_advc( + @RequestBody KakaoVO kakaoVO, + HttpServletRequest request, + ModelMap model) throws Exception { + System.out.println(" :: sendMsgData_ft_advc :: "); + + + // 디버깅 출력 +// System.out.println("mjonMsgVO : " + mjonMsgVO.getMjonMsgSendVOList().toString()); +// System.out.println("mjonMsgVO : " + mjonMsgVO.getMjonMsgSendVOList().size()); + + return ResponseEntity.ok().body(kakaoFriendsTalkService.insertKakaoFtSandAjax_advc(kakaoVO, request)) ; + + } /** * @Method Name : kakaoFriendsTalkMsgSendAjax diff --git a/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/ft/KakaoFriendsTalkMsgDataView.jsp b/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/ft/KakaoFriendsTalkMsgDataView.jsp index ab93209a..10496420 100644 --- a/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/ft/KakaoFriendsTalkMsgDataView.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/ft/KakaoFriendsTalkMsgDataView.jsp @@ -1191,14 +1191,19 @@ function fn_sendMsgData(){ var data = new FormData(document.bizForm); $.ajax({ type: "POST" - , url: "/web/mjon/kakao/friendstalk/kakaoFriendsTalkMsgSendAjax.do" +// , url: "/web/mjon/kakao/friendstalk/kakaoFriendsTalkMsgSendAjax.do" + , url: "/web/mjon/kakao/friendstalk/kakaoFriendsTalkMsgSendAjax_advc.do" , data: data , dataType: 'json' , async: true , processData: false , contentType: false , cache: false - , success: function (returnData, status) { + , success: function (returnData) { + + console.log('returnData : ', returnData); + + /* if(status == 'success'){ if("loginFail" == returnData.result){ @@ -1230,7 +1235,7 @@ function fn_sendMsgData(){ $('.mask').addClass('on'); } - } + } */ } ,beforeSend : function(xmlHttpRequest) { //로딩창 show diff --git a/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/ft/KakaoFriendsTalkMsgDataView_advcbackup_20250414.jsp b/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/ft/KakaoFriendsTalkMsgDataView_advcbackup_20250414.jsp new file mode 100644 index 00000000..ab93209a --- /dev/null +++ b/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/ft/KakaoFriendsTalkMsgDataView_advcbackup_20250414.jsp @@ -0,0 +1,2549 @@ +<%@ 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="fn" uri="http://java.sun.com/jsp/jstl/functions"%> +<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> +<%@ taglib prefix="ec" uri="/WEB-INF/tld/ecnet_tld.tld"%> +<%@ page import="itn.com.cmm.LoginVO" %> + + + + + + + + + + + + + + +
+
+
+
Loading
+
+
+ +
+
+ + <%@include file="/WEB-INF/jsp/web/kakao/include/KaKaoAlimtalkTopMenuTap.jsp" %> + +
+
+

친구톡 전송

+ +
+ + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
채널ID + + +
템플릿명 + +

최대 50자, 템플릿 관리용

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

* 이미지 첨부 안내

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

* 와이드 이미지 첨부 안내

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

    이미지 제목

    + +
  • +
  • +

    이미지 클릭시 이동할 URL

    + +
  • +
  • +

    첨부파일 이미지

    + +
  • +
+ + +
+
광고포함 여부 + checked > + <%-- checked > --%> +
내용 +
+
+
+

(광고) 채널ID

+
+ + +
+
+

수신거부 : 홈 > 채널차단

+
+
+

0 /1000

+
+
+
+
+
+
+ +
+ + +
+
+ + + + + +
+
+ + + +
+
+ + + ${symbolList.symbol} + + +
+
+ + + +
+
+ + + ${symbolList.symbol} + + +
+
+ + + +
+
+ + + ${symbolList.symbol} + + +
+
+ + + +
+
+ + + ${symbolList.symbol} + + +
+
+ + + +
+
+ + + ${symbolList.symbol} + + +
+
+ + +
+
+
+ +
+
+
+ 특정문구 일괄변환이란? +

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

+
+
+ +
+
+ + + + +
+
+ +
+
+
+ +
+ <%@include file="/WEB-INF/jsp/web/kakao/include/KakaoSentImoticonInfo.jsp" %> + +
+
+
+ + + + + + + + +
+
+ + + + + + + + + + +
+
+
버튼 + + +

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

+
+ + + + +
+
배송조회
+
+ + +

*이용가능 택배사 : KG로지스, 우체국택배,일양로지스, GTX로지스, FedEx, 경동택배, 합동택배, 롯데택배

+
+
+ +
+
+
+ + + +
+
웹링크
+
+
    +
  • + + +
  • +
  • + +
  • +
  • + +
  • +
+
+
+ +
+
+
+ + + +
+
앱링크
+
+
    +
  • + + +
  • +
  • + +
  • +
  • + +
  • +
+
+
+ +
+
+
+ + + +
+
봇키워드
+
+ + +
+
+
+
+ + + +
+
메시지전달
+
+ + +
+
+ +
+
+
+ + + +
+
상담톡전환
+
+ + +
+
+ +
+
+
+ + + +
+
챗봇전환
+
+ + +
+
+ +
+
+
+
+
+
받는사람 +
+
+ + + + * 중복번호는 한번만 발송됩니다. +
+
+
+
+
+ + +
+
+

휴대폰

+ + +
+
+

이름

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

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

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

0건 / 중복 0

+ +
+
+
+
+
+
+
+

발송금액 :

+ +
+

0

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

대체문자

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

    + 0 / + 90byte +

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

    + + @채널ID +

    + +
    +

    + (광고) + 채널ID +

    +
    + +

    내용 미리보기

    +
    + + + +
    +
    +

    수신거부 : 홈 > 채널차단

    +
    + +
    +

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

    +

    +
    +
    +
    +
    +
      +
    • + +
    • +
    • + +
    • +
    +
    +
    + <%-- 친구톡 발송시간 체크 하기 - 20:50 ~ 익일 08:00 사이에는 발송 금지 --%> + + + + + + + + + +
    +
    +
    +
    + 날짜 : +
    + +
    +
    + + + + +
    +
    + <%--
    + + + + + + +
    --%> +
    +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    + + +
    + +
    + + + +
    +
    + +
    +
    + +
    + +
    \ No newline at end of file From 995aef6f4b152b2411b576b0d83c033244797b13 Mon Sep 17 00:00:00 2001 From: "hehihoho3@gmail.com" Date: Tue, 15 Apr 2025 17:55:48 +0900 Subject: [PATCH 02/48] =?UTF-8?q?=EC=B9=9C=EA=B5=AC=ED=86=A1=20ajax?= =?UTF-8?q?=EC=A7=84=ED=96=89=EC=A4=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ft/KakaoFriendsTalkMsgDataView.jsp | 42 +++++++++++++++---- 1 file changed, 34 insertions(+), 8 deletions(-) diff --git a/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/ft/KakaoFriendsTalkMsgDataView.jsp b/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/ft/KakaoFriendsTalkMsgDataView.jsp index 10496420..4c51d097 100644 --- a/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/ft/KakaoFriendsTalkMsgDataView.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/ft/KakaoFriendsTalkMsgDataView.jsp @@ -1188,10 +1188,32 @@ function fn_sendMsgData(){ }); if(spamChk){ - var data = new FormData(document.bizForm); + + + // 타블레이터 호출 + var $selectedData = tableL.getData(); // 데이터 가져오기 + + var data = $('#bizForm'); + var formDataArray = data.serializeArray(); + + // 배열을 객체로 변환 + var formData = {}; + $.each(formDataArray, function(index, field) { + formData[field.name] = field.value; + }); + + // 빈 값 제거 + removeEmptyValues(formData); + // 선택된 데이터 추가 + formData["mjonFtSendVOList"] = $selectedData; + // JSON 데이터 확인 + console.log("최종 formData:", JSON.stringify(formData)); + + + + $.ajax({ type: "POST" -// , url: "/web/mjon/kakao/friendstalk/kakaoFriendsTalkMsgSendAjax.do" , url: "/web/mjon/kakao/friendstalk/kakaoFriendsTalkMsgSendAjax_advc.do" , data: data , dataType: 'json' @@ -1199,11 +1221,7 @@ function fn_sendMsgData(){ , processData: false , contentType: false , cache: false - , success: function (returnData) { - - console.log('returnData : ', returnData); - - /* + , success: function (returnData, status) { if(status == 'success'){ if("loginFail" == returnData.result){ @@ -1235,7 +1253,7 @@ function fn_sendMsgData(){ $('.mask').addClass('on'); } - } */ + } } ,beforeSend : function(xmlHttpRequest) { //로딩창 show @@ -1254,6 +1272,14 @@ function fn_sendMsgData(){ } +//빈 값이나 null 값을 제거하는 함수 +function removeEmptyValues(obj) { + Object.keys(obj).forEach(function(key) { + if (obj[key] === null || obj[key] === '') { + delete obj[key]; + } + }); +} /** * @description 대체문자 오류체크 funciton From f22a5850e1daab8419b214dd7992823c83c26b19 Mon Sep 17 00:00:00 2001 From: "hehihoho3@gmail.com" Date: Wed, 16 Apr 2025 15:23:55 +0900 Subject: [PATCH 03/48] =?UTF-8?q?=EC=B9=9C=EA=B5=AC=ED=86=A1=20=EB=B0=9C?= =?UTF-8?q?=EC=86=A1=20=EC=97=91=EC=85=80=20=EB=B6=88=EB=9F=AC=EC=98=A4?= =?UTF-8?q?=EA=B8=B0=20=EB=8C=80=EB=9F=89=EC=9C=BC=EB=A1=9C=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/itn/com/cmm/MjonFTSendVO.java | 129 +++ .../java/itn/let/kakao/kakaoComm/KakaoVO.java | 16 + .../impl/KakaoFriendsTalkServiceImpl.java | 10 +- .../web/KakaoFriendsTalkSendController.java | 2 +- .../ft/KakaoFriendsTalkMsgDataView.jsp | 67 +- .../msgdata/include/ftDataIncludeExcel.jsp | 957 ++++++++++++++++++ .../msgdata/include/msgDataIncludeExcel.jsp | 13 - src/main/webapp/js/kakao/ft/ftPriceClclt.js | 14 +- src/main/webapp/js/kakao/ft/ftTabulator.js | 12 +- 9 files changed, 1182 insertions(+), 38 deletions(-) create mode 100644 src/main/java/itn/com/cmm/MjonFTSendVO.java create mode 100644 src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/include/ftDataIncludeExcel.jsp 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..59aac5ba --- /dev/null +++ b/src/main/java/itn/com/cmm/MjonFTSendVO.java @@ -0,0 +1,129 @@ +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/let/kakao/kakaoComm/KakaoVO.java b/src/main/java/itn/let/kakao/kakaoComm/KakaoVO.java index 527f146f..277cbf01 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; @@ -262,6 +263,8 @@ public class KakaoVO extends MjonMsgVO{ private List> varListMap; + private List mjonFTSendVOList = new ArrayList<>(); + @Override public String toString() { String varListMapString = "["; @@ -286,6 +289,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,6 +327,7 @@ public class KakaoVO extends MjonMsgVO{ "\n , varListMap=[" + varListMapString + "]" + "\n , befCash=[" + getBefCash() + "]" + "\n , befPoint=[" + getBefPoint() + "]" + + "\n , mjonFTSendVOList=" + mjonFTListSb.toString() + "\n ]"; } 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 index 93bee0d0..91113dfd 100644 --- 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 @@ -11,8 +11,10 @@ import egovframework.rte.fdl.idgnr.EgovIdGnrService; import itn.let.kakao.kakaoComm.KakaoVO; import itn.let.kakao.user.kakaoFt.service.KakaoFriendsTalkService; import itn.let.mail.service.StatusResponse; +import lombok.extern.slf4j.Slf4j; -@Service("kakaoFriendsTalkTemplateService") +@Slf4j +@Service("KakaoFriendsTalkService") public class KakaoFriendsTalkServiceImpl extends EgovAbstractServiceImpl implements KakaoFriendsTalkService{ @Resource(name = "egovFriendstalkTemplateIdService") @@ -25,7 +27,13 @@ public class KakaoFriendsTalkServiceImpl extends EgovAbstractServiceImpl implem public StatusResponse insertKakaoFtSandAjax_advc(KakaoVO kakaoVO, HttpServletRequest request) { StatusResponse statusResponse = new StatusResponse(); + log.info(" + kakaoVO.toString() :: [{}]", kakaoVO.toString()); + + + + + // KakaoSendAdvcVO 발송 VO 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 9e094be8..982e49f4 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 @@ -72,7 +72,7 @@ public class KakaoFriendsTalkSendController { @Resource(name = "kakaoFriendsTalkTemplateService") private KakaoFriendsTalkTemplateService kakaoFtTemplateService; - @Resource(name = "kakaoFriendsTalkService") + @Resource(name = "KakaoFriendsTalkService") private KakaoFriendsTalkService kakaoFriendsTalkService; /** userManageService */ diff --git a/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/ft/KakaoFriendsTalkMsgDataView.jsp b/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/ft/KakaoFriendsTalkMsgDataView.jsp index 4c51d097..21af948c 100644 --- a/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/ft/KakaoFriendsTalkMsgDataView.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/ft/KakaoFriendsTalkMsgDataView.jsp @@ -14,6 +14,8 @@ + + @@ -2214,7 +2246,7 @@ function msgResultLink(){
    - +
    @@ -2539,22 +2571,25 @@ function msgResultLink(){ -
    +
    - -->
    diff --git a/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/include/ftDataIncludeExcel.jsp b/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/include/ftDataIncludeExcel.jsp new file mode 100644 index 00000000..2a1ea27e --- /dev/null +++ b/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/include/ftDataIncludeExcel.jsp @@ -0,0 +1,957 @@ +<%@ 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" %> + + + + + + +
    + +
    + + + +
    + +
    + + + +
    + + + + + + + + + +
    +
    +

    - 주소록은 한 번에 최대 30만건까지 등록(EXCEL파일, 최대용량 20MB) 가능합니다.

    +

    - 엑셀 파일에 비밀번호 설정, 제한된 보기, 수식 등이 설정되어 있는 경우 업로드가 불가합니다.

    +

    - 구분선(|), 역슬래시(\, ₩), 큰따옴표("), 이모지(이모티콘) 등 발송불가 특수문자는 저장되지 않습니다.

    +

    - 이름 200byte, [*1*]~[*4*] 200byte, 메모 250byte까지 입력 가능합니다.

    +

    - 주소록 등록이 어려우신 경우에는 주소록 입력대행 메뉴를 이용하실 수 있습니다.

    +
    +
    + +
    +
    + + +
    + + + + + + + + + + + + +
    엑셀입력 표
    +
    +
    +

    파일 붙여넣기마우스로 엑셀파일을 여기에 끌어다 놓으세요

    +
    + + +
    +
    +
    + + +
    +

    + 총 0건 + / 중복 0건 + / 오류 0건 + +

    + + + + +

    + +
    + + + +
    + + +
    +
    +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    +
    + +
    + +
    +
    +
    +
    + + +
    + +
    +
    + + + + + + + + + + + + + +
    \ No newline at end of file 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/js/kakao/ft/ftPriceClclt.js b/src/main/webapp/js/kakao/ft/ftPriceClclt.js index 6a55e149..69bfb496 100644 --- a/src/main/webapp/js/kakao/ft/ftPriceClclt.js +++ b/src/main/webapp/js/kakao/ft/ftPriceClclt.js @@ -93,6 +93,9 @@ function totalFtPriceSum(totRows){ var KAKAO_FT_PRICE = ''; var SHORT_PRICE = ''; var LONG_PRICE = ''; +KAKAO_FT_PRICE = $('#kakaoFtPrice').val(); +SHORT_PRICE = $('#shortPrice').val(); +LONG_PRICE = $('#longPrice').val(); /*$(document).ready(function(){ @@ -153,14 +156,16 @@ var LONG_PRICE = ''; /** * @description 금액 계산 function */ -function fn_priceClclt(){ +function fn_priceClclt(phoneSu = 0){ // 미리보기 텍스트 var templateHtml = $('#smsTxtArea').val(); // var templateHtml = $('.template_text').html(); // 수신 번호 개수 - var phoneSu = $('.phoneArea').length; + if(phoneSu == 0){ + phoneSu = $('.phoneArea').length; + } // 대체문자 있는지 확인 var isSendFailChecked = $("#send_fail_check").is(":checked"); // 치환문자 여부 확인 @@ -183,6 +188,7 @@ function fn_priceClclt(){ * 카카오 금액 * 수신자 수 계산 */ function fn_sendFailUnChecked(phoneSu){ + console.log('phoneSu; ', phoneSu); // 카카오 금액 * 수신자 수 // fn_writePriceText() 첫 파라미터가 null이면 카카오 전송으로 인식 @@ -279,9 +285,9 @@ function fn_writePriceText(msgTypeText, phoneSu){ msgTypeText = msgTypeText.trim(); if(msgTypeText == '단문') price = SHORT_PRICE * phoneSu; else if(msgTypeText == '장문') price = LONG_PRICE * phoneSu; - else price = KAKAO_AT_PRICE * phoneSu; // 카카오 + else price = KAKAO_FT_PRICE * phoneSu; // 카카오 - $('#totalPriceTxt').text((price).toFixed(1)); + $('#totalPriceTxt').text(numberWithCommas((price).toFixed(1))); } diff --git a/src/main/webapp/js/kakao/ft/ftTabulator.js b/src/main/webapp/js/kakao/ft/ftTabulator.js index 537eef95..6fd5279f 100644 --- a/src/main/webapp/js/kakao/ft/ftTabulator.js +++ b/src/main/webapp/js/kakao/ft/ftTabulator.js @@ -29,10 +29,16 @@ $(document).ready(function (){ //clipboardPasteAction:"insert", // insert, update, replace placeholder:"복사(Ctrl+C)한 내용을 여기에 붙여넣기(Ctrl+V) 해주세요.", //fit columns to width of table (optional) resizableColumns:false, + columnDefaults:{ // 공통설정 + hozAlign: "center", + headerHozAlign: "center", + editor: "input", + editor: false + }, columns:[ //Define Table Columns - {formatter:"rowSelection", titleFormatter:"rowSelection",clipboard:false, hozAlign:"center", headerSort:false, cellClick:function(e, cell){ - cell.getRow().toggleSelect(); - }}, + {formatter:"rowSelection", headerHozAlign:"center", titleFormatter:"rowSelection",clipboard:false, hozAlign:"center", width:5, headerSort:false, cellClick:function(e, cell){ + cell.getRow().toggleSelect(); + }}, {title:"이름", hozAlign:"center", field:"name", editor:"input", validator:["maxLength:12"], cellEdited:function(cell){ //cell - cell component fnReplCell(); From 69717924d58c23192a5cf71c8bd3897d6658a638 Mon Sep 17 00:00:00 2001 From: "hehihoho3@gmail.com" Date: Mon, 21 Apr 2025 11:10:01 +0900 Subject: [PATCH 04/48] =?UTF-8?q?=EC=B9=9C=EA=B5=AC=ED=86=A1=20=EC=A7=84?= =?UTF-8?q?=ED=96=89=EC=A4=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../let/kakao/kakaoComm/KakaoSendUtil.java | 209 ++++++++++ .../java/itn/let/kakao/kakaoComm/KakaoVO.java | 51 +++ .../kakaoComm/kakaoApi/KakaoApiJsonSave.java | 70 +++- .../kakaoComm/kakaoApi/KakaoFTJsonSave.java | 109 ----- .../service/KakaoFriendsTalkService.java | 2 +- .../impl/KakaoFriendsTalkServiceImpl.java | 91 ++++- .../ft/KakaoFriendsTalkMsgDataView.jsp | 375 ++---------------- 7 files changed, 450 insertions(+), 457 deletions(-) diff --git a/src/main/java/itn/let/kakao/kakaoComm/KakaoSendUtil.java b/src/main/java/itn/let/kakao/kakaoComm/KakaoSendUtil.java index edf92d05..31e0dcbd 100644 --- a/src/main/java/itn/let/kakao/kakaoComm/KakaoSendUtil.java +++ b/src/main/java/itn/let/kakao/kakaoComm/KakaoSendUtil.java @@ -269,6 +269,215 @@ public class KakaoSendUtil { return kakaoSendAdvcListVO; } + /** + * @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(); + + + + List kakaoSendAdvcListVO = new ArrayList<>(); + Calendar calendar = setupBaseDate(kakaoVO, isNotified); + + + + KakaoReturnVO templateDetail = kakaoApiTemplate.selectKakaoApiTemplateDetail(kakaoVO); + String templateContent = templateDetail.getTemplateContent(); // 알림톡 템플릿 + kakaoVO.setTemplateContent(templateContent); + String templateTitle = templateDetail.getTemplateTitle(); + + +// log.info(" + templateDetail :: [{}]", templateDetail); +// templateDetail.getButtonList().forEach(t->log.info(" + ButtonList :: [{}]", t.toString())); + + Boolean hasContentReplacement = this.replBooleanStrChecker(templateContent); + Boolean hasTitleReplacement = this.replBooleanStrChecker(templateTitle); + Boolean hasButtonReplacement = this.needsButtonReplacement(templateDetail.getButtonList()); + + /** @jsonStr 필요유무 */ + boolean hasTitleOrButtons = StringUtils.isNotEmpty(templateTitle) + || CollectionUtils.isNotEmpty(templateDetail.getButtonList()); + + /** @jsonStr 반복유무 */ + boolean needsJsonReplacement = hasTitleReplacement || hasButtonReplacement; + String sharedJsonStr = null; + + String subMsgTxt = kakaoVO.getSubMsgTxt(); // 실패 대체 문자 + + // 시스템 기본 단가 정보 불러오기 + JoinSettingVO sysJoinSetVO = mjonMsgDataService.selectJoinSettingInfo(); + // 사용자 개인 단가 정보 불러오기 + MberManageVO mberManageVO = mjonMsgDataService.selectMberManageInfo(kakaoVO.getUserId()); + + + + + /** @MSGID KEY값 */ + List idList = mjonCommon.getNextCustomMsgCId(kakaoVO.getVarListMap().size()); +// for (int i = 0; i < kakaoSendAdvcListVO.size(); i++) { +// kakaoSendAdvcListVO.get(i).setMsgId(idList.get(i)); +// kakaoSendAdvcListVO.get(i).setBizJsonName(idList.get(i)); +// } + + + + // 분할 건수 카운터 + int counter = 0; + /** @Map에 총 갯수가 수신자 갯수와 동일함 */ + List> varList = kakaoVO.getVarListMap(); + for (int i = 0; i < varList.size(); i++) { + // for(Map variables : kakaoVO.getVarListMap()) { + // 치환 데이터 + Map variables = varList.get(i); + log.info(""); + + /** @공통 기본값 */ + KakaoSendAdvcVO sendVO = createSendVO(kakaoVO); + String msgId = idList.get(i); + sendVO.setMsgId(msgId); + + // step1 + // Step 1-1: 값 치환 및 수신번호 셋팅 + // Step 1-2: 수신자 정보 설정 (callToList는 항상 설정). + if (variables.containsKey("callToList")) { + sendVO.setCallTo(variables.get("callToList")); + variables.remove("callToList"); // 사용 후 제거. + } + + /** @Step1-3: 템플릿 치환데이터 설정 */ + String templateContentTemp = templateContent; + String templateTitleTemp = templateTitle; + if (hasContentReplacement) { + templateContentTemp = mjonCommon.ATReplaceTemplateVariables(templateContent, variables); + if(hasTitleReplacement) { + templateTitleTemp = mjonCommon.ATReplaceTemplateVariables(templateTitle, variables); + } + } + /** @버튼 치환 */ // 버튼 리스트가 있으면 치환 수행, 항상 sendVO에 설정 + List buttonList = templateDetail.getButtonList(); + if(hasButtonReplacement) { + buttonList = replaceButtonLinks(buttonList, variables); + } + sendVO.setButtonList(buttonList); + + sendVO.setTemplateTitle(templateTitleTemp); + sendVO.setTemplateContent(templateContentTemp); + + + // Step 1-4: 실패 대체 문자 치환데이터 설정 + if("Y".equals(kakaoVO.getSubMsgSendYn())) { // 대체문자가 있나? + if ("Y".equals(kakaoVO.getSubMsgTxtReplYn())) { // 치환데이터가 있나? + subMsgTxt = mjonCommon.ATReplaceTemplateVariables(subMsgTxt, variables); + } + sendVO.setSubMsgTxt(subMsgTxt);// 실패 + } + sendVO.setSubMsgSendYn(kakaoVO.getSubMsgSendYn()); + + + /* + log.info("kakaoSendAdvcVO Details: [callTo={}\n, templateContent=\n{}\n, subMsgTxt=\n{}]\n\n\n\n", + kakaoSendAdvcVO.getCallTo(), + kakaoSendAdvcVO.getTemplateContent(), + kakaoSendAdvcVO.getSubMsgTxt() + ); + */ + + // Step1 END + + +// step3 +// 바이트 수 체크 및 금액설정 + + + Float kakaoAtPrice = mberManageVO.getKakaoAtPrice(); + // 유효한 단가 계산 + float shortPrice = getValidPrice(mberManageVO.getShortPrice(), sysJoinSetVO.getShortPrice()); + float longPrice = getValidPrice(mberManageVO.getLongPrice(), sysJoinSetVO.getLongPrice()); + + + String shortPStr = Float.toString(shortPrice); + String mmsPStr = Float.toString(longPrice); + + // 공통 가격 설정 + sendVO.setSmsPrice(shortPStr); + sendVO.setMmsPrice(mmsPStr); + + + if("Y".equals(kakaoVO.getSubMsgSendYn())) { + int smsTxtByte = mjonCommon.getSmsTxtBytes(sendVO.getSubMsgTxt()); + String sendType = getMsgType(smsTxtByte); + sendVO.setSubMsgType(sendType); + + if ("INVALID".equals(sendType)) { + statusResponseSet(statusResponse, HttpStatus.BAD_REQUEST, "전송 문자 길이를 초과하였습니다.");return kakaoSendAdvcListVO; + } + + boolean isMms = "MMS".equals(sendType); + sendVO.setEachPrice(isMms ? mmsPStr : shortPStr); + + + } else { + kakaoAtPrice = getValidPrice(mberManageVO.getKakaoAtPrice(), sysJoinSetVO.getKakaoAtPrice()); + sendVO.setEachPrice( Float.toString(kakaoAtPrice) ); + } + + + + // step4 + // 예약 시간 설정 및 분할 데이터 설정 + if ("Y".equalsIgnoreCase(kakaoVO.getReserveYn()) + && "Y".equalsIgnoreCase(kakaoVO.getDivideChk()) + && counter == Integer.parseInt(kakaoVO.getDivideCnt())) + { + counter = 0; + calendar.add(Calendar.MINUTE, Integer.parseInt(kakaoVO.getDivideTime())); + } + counter++; + // 즉시 발송인경우 현재 시간 + // 예약인 경우 위에 설정한 시간 입력 + sendVO.setReqDate(DATE_FORMATTER.format(calendar.getTime())); + + + + /** @step5 전송 메세지 설정 json파일 만들기*/ + // 타이틀과 버튼이 있고 + if(hasTitleOrButtons) { + // 버튼과 타이틀에 치환데이터가 있으면 json String을 계속 생성 + if(needsJsonReplacement) { + sharedJsonStr = kakaoApiJsonSave.kakaoApiJsonSave_advc(sendVO, templateDetail); + sendVO.setBizJsonName(msgId); + sendVO.setJsonStr(sharedJsonStr); + } else if (StringUtils.isEmpty(sharedJsonStr)) { + // 치환 데이터가 없고 아직 생성되지 않았으면 한 번만 생성 + sharedJsonStr = kakaoApiJsonSave.kakaoApiJsonSave_advc(sendVO, templateDetail); + sendVO.setBizJsonName(idList.get(0)); + sendVO.setJsonStr(sharedJsonStr); + }else { + sendVO.setBizJsonName(idList.get(0)); + } + + } + log.info(" sendVO :: [{}]", sendVO); + kakaoSendAdvcListVO.add(sendVO); + } + + + return kakaoSendAdvcListVO; + } + private Calendar setupBaseDate(KakaoVO kakaoVO, boolean isNotified) throws ParseException { // 예약 시간 기본값 설정 Date now = new Date(); diff --git a/src/main/java/itn/let/kakao/kakaoComm/KakaoVO.java b/src/main/java/itn/let/kakao/kakaoComm/KakaoVO.java index 277cbf01..5b742f52 100644 --- a/src/main/java/itn/let/kakao/kakaoComm/KakaoVO.java +++ b/src/main/java/itn/let/kakao/kakaoComm/KakaoVO.java @@ -331,5 +331,56 @@ public class KakaoVO extends MjonMsgVO{ "\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 , 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/KakaoApiJsonSave.java b/src/main/java/itn/let/kakao/kakaoComm/kakaoApi/KakaoApiJsonSave.java index bbdd8f81..a1127285 100644 --- a/src/main/java/itn/let/kakao/kakaoComm/kakaoApi/KakaoApiJsonSave.java +++ b/src/main/java/itn/let/kakao/kakaoComm/kakaoApi/KakaoApiJsonSave.java @@ -208,6 +208,74 @@ public class KakaoApiJsonSave { return jsonFileName; } + /* + * 친구톡 발송시 이미지, 버튼 추가에 따른 Json 파일 생성 + * 2025.04.18 + * 우영두 + * 파일은 하나만 생성해서 동일하게 사용함. + * + * */ + public String kakaoApiFTJsonSave_advc(KakaoVO kakaoVO) { + // json파일 저장 + + + // 버튼리스트 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(!imageType.equals("")) { + templateImageInfo.put("img_url", kakaoVO.getTemplateImageUrl()); + templateImageInfo.put("img_link", kakaoVO.getImgLink()); + } + + if(imageType.equals("W")) { + templateImageExtInfo.put("wide", "Y"); + } + + + 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 +366,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/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/kakaoFt/service/KakaoFriendsTalkService.java b/src/main/java/itn/let/kakao/user/kakaoFt/service/KakaoFriendsTalkService.java index 3be81d80..d9392550 100644 --- a/src/main/java/itn/let/kakao/user/kakaoFt/service/KakaoFriendsTalkService.java +++ b/src/main/java/itn/let/kakao/user/kakaoFt/service/KakaoFriendsTalkService.java @@ -7,6 +7,6 @@ import itn.let.mail.service.StatusResponse; public interface KakaoFriendsTalkService { - StatusResponse insertKakaoFtSandAjax_advc(KakaoVO kakaoVO, HttpServletRequest request); + 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 index 91113dfd..89e0f1e7 100644 --- 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 @@ -1,16 +1,29 @@ package itn.let.kakao.user.kakaoFt.service.impl; +import java.time.Instant; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Service; import egovframework.rte.fdl.cmmn.EgovAbstractServiceImpl; import egovframework.rte.fdl.idgnr.EgovIdGnrService; +import egovframework.rte.fdl.security.userdetails.util.EgovUserDetailsHelper; +import itn.com.cmm.LoginVO; +import itn.com.utl.fcc.service.EgovStringUtil; +import itn.let.kakao.kakaoComm.KakaoSendAdvcVO; +import itn.let.kakao.kakaoComm.KakaoSendUtil; import itn.let.kakao.kakaoComm.KakaoVO; import itn.let.kakao.user.kakaoFt.service.KakaoFriendsTalkService; import itn.let.mail.service.StatusResponse; +import itn.let.mjo.mjocommon.MjonCommon; +import itn.let.uss.umt.service.EgovUserManageService; import lombok.extern.slf4j.Slf4j; @Slf4j @@ -23,11 +36,85 @@ public class KakaoFriendsTalkServiceImpl extends EgovAbstractServiceImpl implem @Resource(name="kakaoFriendsTalkTemplateDAO") private KakaoFriendsTalkTemplateDAO kakaoFriendsTalkTemplateDAO; + /** userManageService */ + @Resource(name = "userManageService") + private EgovUserManageService userManageService; + + @Autowired + private MjonCommon mjonCommon; + + + @Autowired + KakaoSendUtil kakaoSendUtil; + @Override - public StatusResponse insertKakaoFtSandAjax_advc(KakaoVO kakaoVO, HttpServletRequest request) { + 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.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, + "현재 고객님께서는 문자온 서비스 이용이 정지된 상태로 알림톡을 발송하실 수 없습니다. 이용정지 해제를 원하시면 고객센터로 연락주시기 바랍니다."); + } + + + +/** @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; + } + + + + + + + + + + + + + + + diff --git a/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/ft/KakaoFriendsTalkMsgDataView.jsp b/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/ft/KakaoFriendsTalkMsgDataView.jsp index dad98330..d377e429 100644 --- a/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/ft/KakaoFriendsTalkMsgDataView.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/ft/KakaoFriendsTalkMsgDataView.jsp @@ -234,7 +234,7 @@ function initFormChk(){ setContentsLengForFriends(tmpContents); //초기 광고포함 여부 처리 - var adFlagVal = $("input[name=ad_flag]:checked").val(); + var adFlagVal = $("input[name=adFlag]:checked").val(); advTextChange(adFlagVal); var reserYn = $("input[name=reserYn]:checked").val(); @@ -373,18 +373,16 @@ function getTemplateImagUrl(){ } - var url = ""; - if(fileExt == "jpg" || fileExt == "jpeg" || fileExt == "png"){ - - url = "/web/mjon/kakao/template/sendKakaoFriendsTemplateImageUploadAjax.do"; - - }else{ - - alert('jpg, jpeg 파일만 업로드 할수 있습니다.'); - return; - +// if(fileExt == "jpg" || fileExt == "jpeg" || fileExt == "png"){ + console.log('fileExt : ', fileExt); + if(fileExt != null && fileExt !== "jpg" && fileExt !== "jpeg" && fileExt !== "png"){ + alert("jpg, jpeg, png 파일만 업로드 할 수 있습니다."); + return; } + + + var url = url = "/web/mjon/kakao/template/sendKakaoFriendsTemplateImageUploadAjax.do"; $.ajax({ type : 'POST' @@ -396,7 +394,9 @@ function getTemplateImagUrl(){ , processData: false , contentType: false , cache : false - , success : function(returnData, status){ + , success : function(returnData){ + console.log('returnData : ', returnData); + if(returnData.result == "success") { var code = returnData.code; @@ -602,7 +602,7 @@ function myTemplateSave(){ var imageType = $("input[name=img_file_add]:checked").val(); // 첨부 이미지 종류(없음, 일반, 와이드 이미지) var imageTitle = $("#imgTitle").val(); //첨부이미지 제목 var imageLink = $("#imgLink").val(); //첨부이미지 클릭시 이동 링크 주소 - var inputTemplateAd = $("input[name=ad_flag]:checked").val(); // 광고성메시지 선택 여부 + var inputTemplateAd = $("input[name=adFlag]:checked").val(); // 광고성메시지 선택 여부 var inputTemplateContent = $("#inputTemplateContent").val(); // 템플릿 내용 var inputTemplateImageName = $("#templateImageName").val(); // 템플릿 이미지 파일명 @@ -842,236 +842,14 @@ function fn_sendMsgData(){ } - //수신번호 리스트 체크하기 - var numCnt = 0; - var nameList = []; //치환문자 이름 - var phoneNum = []; //받는사람 - var rep1List = []; //치환문자1 - var rep2List = []; //치환문자2 - var rep3List = []; //치환문자3 - var rep4List = []; //치환문자4 - - var varValList = []; //치환문자 연결시킬 변수 셋팅 var selectedData = tableL.getRows(); - var varValStatus = true; //치환분자 데이터 체크용 - if(selectedData == "" || selectedData == null){ alert("받는사람 주소를 한 건 이상 입력해주세요."); return false; - }else{ // 선택한 Row '-' 문자 삭제하기 - - var txtReplYn = $("#txtReplYn").val(); - - if(txtReplYn == 'Y'){//치환문자가 있는 경우 변수 치환 처리 - - for(var i=0; i < selectedData.length; i++){ - - var nmStatus = false; - var rep1Status = false; - var rep2Status = false; - var rep3Status = false; - var rep4Status = false; - - - if(tmpContents.indexOf("\#{이름}") > -1){ - - nmStatus = true; - } - - if(tmpContents.indexOf("\#{1}") > -1){ - - rep1Status = true; - } - - if(tmpContents.indexOf("\#{2}") > -1){ - - rep2Status = true; - } - - if(tmpContents.indexOf("\#{3}") > -1){ - - rep3Status = true; - } - - if(tmpContents.indexOf("\#{4}") > -1){ - - rep4Status = true; - } - - //일괄변환 문자에 콤마(,)가 들어가있으면 배열로 넘길때 문제가 발생하여 특수문자(§)로 치환하여 넘겨주도록 한다. - var name = tableL.getRows()[i].getData().name; - var phone = removeDash(tableL.getRows()[i].getData().phone); - var rep1 = tableL.getRows()[i].getData().rep1; - var rep2 = tableL.getRows()[i].getData().rep2; - var rep3 = tableL.getRows()[i].getData().rep3; - var rep4 = tableL.getRows()[i].getData().rep4; - var varValStr = ""; //¶ 구분자 - - if(phone == ""){ - - alert("수신 목록에 핸드폰 번호가 없는 항목이 있습니다."); - return false; - - }else if(!checkHpNum(phone)){ - - alert("수신 목록에 잘 못된 핸드폰 번호가 있습니다. 핸드폰 번호 : " + phone + " 입니다."); - return false; - - }else{ - - if(typeof(name) != 'undefined' && name != null && name !=""){ - if(!emojiCheck(name)){//이모지 체크 해주기 - return false; - } - - //이름 치환변수가 있으면 저장 - if(nmStatus){ - //nameList[i] = name.replaceAll(",","§"); - if(varValStr == ''){ - - varValStr = name.replaceAll(",","§"); - }else{ - - varValStr = varValStr + "¶" + name.replaceAll(",","§"); - - } - } - }else{ - if(nmStatus){ - varValStatus = false; - } - } - - - if(phone != '' && phone != null){ - //연락처 변수 저장하기 - phoneNum[i] = phone; - if(varValStr == ''){ - varValStr = phone; - }else{ - varValStr = varValStr + "¶" + phone; - } - }else{ - varValStatus = false; - } - - if(typeof(rep1) != 'undefined' && rep1 != null && rep1 !=""){ - if(!emojiCheck(rep1)){//이모지 체크 해주기 - return false; - } - - if(rep1Status){ - - if(varValStr == ''){ - //rep1List[i] = rep1.replaceAll(",","§"); - varValStr = rep1.replaceAll(",","§"); - }else{ - //rep1List[i] = rep1.replaceAll(",","§"); - varValStr = varValStr + "¶" + rep1.replaceAll(",","§"); - } - } - }else{ - if(rep1Status){ - varValStatus = false; - } - } - - if(typeof(rep2) != 'undefined' && rep2 != null && rep2 !=""){ - if(!emojiCheck(rep2)){//이모지 체크 해주기 - return false; - } - - if(rep2Status){ - - if(varValStr == ''){ - varValStr = rep2.replaceAll(",","§"); - }else{ - //rep2List[i] = rep2.replaceAll(",","§"); - varValStr = varValStr + "¶" + rep2.replaceAll(",","§"); - } - } - }else{ - if(rep2Status){ - varValStatus = false; - } - } - - - if(typeof(rep3) != 'undefined' && rep3 != null && rep3 !=""){ - if(!emojiCheck(rep3)){//이모지 체크 해주기 - return false; - } - - if(rep3Status){ - - if(varValStr == ''){ - varValStr = rep3.replaceAll(",","§"); - }else{ - //rep3List[i] = rep3.replaceAll(",","§"); - varValStr = varValStr + "¶" + rep3.replaceAll(",","§"); - } - } - }else{ - if(rep3Status){ - varValStatus = false; - } - } - - - if(typeof(rep4) != 'undefined' && rep4 != null && rep4 !=""){ - if(!emojiCheck(rep4)){//이모지 체크 해주기 - return false; - } - - if(rep4Status){ - - if(varValStr == ''){ - varValStr = rep4.replaceAll(",","§"); - }else{ - //rep4List[i] = rep4.replaceAll(",","§"); - varValStr = varValStr + "¶" + rep4.replaceAll(",","§"); - } - } - }else{ - if(rep4Status){ - varValStatus = false; - } - } - - } - - varValList[i] = varValStr; - - } - - }else{//치환문자가 없는 경우 휴대폰 번호만 입력 - - for(var i=0; i < selectedData.length; i++){ - - //일괄변환 문자에 콤마(,)가 들어가있으면 배열로 넘길때 문제가 발생하여 특수문자(§)로 치환하여 넘겨주도록 한다. - var phone = removeDash(tableL.getRows()[i].getData().phone); - - if(phone == ""){ - - alert("수신 목록에 핸드폰 번호가 없는 항목이 있습니다."); - return false; - - }else if(!checkHpNum(phone)){ - - alert("수신 목록에 잘 못된 핸드폰 번호가 있습니다. 핸드폰 번호 : " + phone + " 입니다."); - return false; - - }else{ - - phoneNum[i] = phone; - - } - } - } } //예약문자 시간 체크 @@ -1111,51 +889,22 @@ function fn_sendMsgData(){ //대체문자 선택 및 내용 체크 var subMsgSendYn = "N"; - if($("#send_fail_check").is(":checked")){ - - subMsgSendYn = "Y"; - $("#subMsgSendYn").val("Y"); - - //대체문자 체크사항 함수 호출 - if(!fn_subMsgCheck()){ - - /* $("#send_fail_check").prop("checked", false); - $(".replace_send_wrap").slideUp(400); - // 초기화 버튼 클릭 - $('#failCheckInit').click(); - $('.send_top .send_right .phone').css({'top': '0','transition': 'top .4s linear'}); */ - return false; - - } - - }else{ - - subMsgSendYn = "N"; - $("#subMsgSendYn").val("N"); - + subMsgSendYn = 'Y' } + $("#subMsgSendYn").val(subMsgSendYn); + - //수신전화번호 목록 - $("#callToList").val(phoneNum); - //치환변수 데이터 정보 목록(수신번호 포함, tabulator 정보 모두 ) - $("#varValList").val(varValList); - //템플릿 내용 입력 $("#templateContent").val(tmpContents); //광고포함 여부 - var adFlag = $("input[name=ad_flag]:checked").val(); + var adFlag = $("input[name=adFlag]:checked").val(); $("#adFlag").val(adFlag); +/* var adFlag = $("input[name=adFlag]:checked").val(); + $("#adFlag").val(adFlag); */ - //치환문자에 대한 데이터 누락 체크 - if(!varValStatus){ - - alert("특정문구 일괄변환에 대한 일부 데이터가 누락된 부분이 있습니다. 데이터를 확인해 주세요."); - return false; - - } if(!confirm("친구톡을 발송하시겠습니까?")){ @@ -1241,13 +990,19 @@ function fn_sendMsgData(){ // 3. formData에 배열로 추가 formData["buttonVOList"] = buttonList; - // ✅ 4. 기존의 buttonVOList[0].xxx 형태 제거 + // 4. 기존의 buttonVOList[0].xxx 형태 제거 Object.keys(formData).forEach(function(key) { - if (/^buttonVOList\[\d+\]\./.test(key)) { - delete formData[key]; - } + if (/^buttonVOList\[\d+\]\./.test(key)) { + delete formData[key]; + } }); + // VO에 정의되어있지 않는 필요없는 값은 제거 + ["adFlag", "img_file_add", "userMoney", "callToList"].forEach(function(key) { + delete formData[key]; + }); + + // 빈 값 제거 removeEmptyValues(formData); // 선택된 데이터 추가 @@ -1363,74 +1118,6 @@ function fn_insertErrorYN(val){ $('#errorChk').val(val); } -/* - *대체문자 필수 항목 체크 - * - **/ - -function fn_subMsgCheck(){ - - if($('#callFromList').val() === ''){ - - if(confirm('대체문자 전송을 위한 발신번호가 등록되지 않았습니다. \n대체문자 발신번호를 지금 등록하시겠습니까?')){ - window.location=""; - } - $("#send_fail_check").prop("checked", false); - - return false; - - }else{ - - //발신번호 입력 처리 - $("#callFrom").val(removeDash($('#callFromList').val())); - - } - - if($("#smsTxtArea").val() === ''){ - - alert("대체문자 내용을 입력해 주세요."); - return false; - - }else{//대체문자에 치환문자 여부 체크 - - var smsTxtArea = $("#smsTxtArea").val(); - var replStatus = false; - - if(smsTxtArea.indexOf("\#{이름}") > -1){ - replStatus = true; - } - - if(smsTxtArea.indexOf("\#{1}") > -1){ - replStatus = true; - } - - if(smsTxtArea.indexOf("\#{2}") > -1){ - replStatus = true; - } - - if(smsTxtArea.indexOf("\#{3}") > -1){ - replStatus = true; - } - - if(smsTxtArea.indexOf("\#{4}") > -1){ - replStatus = true; - } - - if(replStatus){ - $("#subMsgTxtReplYn").val("Y"); - }else{ - $("#subMsgTxtReplYn").val("N"); - } - - $("#subMsgTxt").val(smsTxtArea); - - } - - - - return true; - -} //문자 바이트수 계산하기 함수 function thisFnByteString(contents){ @@ -1924,8 +1611,8 @@ function updateButtons(){ 광고포함 여부 -<%-- checked > --%> - checked > + checked > +<%-- checked > --%> From 81a027740b663cfc7402ca0c5ebfdce3be9f3852 Mon Sep 17 00:00:00 2001 From: "hehihoho3@gmail.com" Date: Mon, 21 Apr 2025 17:59:36 +0900 Subject: [PATCH 05/48] =?UTF-8?q?=EC=B9=9C=EA=B5=AC=ED=86=A1=20=EC=A7=84?= =?UTF-8?q?=ED=96=89=EC=A4=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/itn/com/cmm/util/MsgSendUtils.java | 2 +- .../let/kakao/kakaoComm/KakaoSendUtil.java | 256 +++++++++--------- 2 files changed, 126 insertions(+), 132 deletions(-) diff --git a/src/main/java/itn/com/cmm/util/MsgSendUtils.java b/src/main/java/itn/com/cmm/util/MsgSendUtils.java index 339137e9..74ba0866 100644 --- a/src/main/java/itn/com/cmm/util/MsgSendUtils.java +++ b/src/main/java/itn/com/cmm/util/MsgSendUtils.java @@ -463,7 +463,7 @@ public final class MsgSendUtils { } } - private static Boolean getReplaceYN(String smsTxtTemplate) {// 여러 치환 구문이 포함된 정규식 패턴 + public static Boolean getReplaceYN(String smsTxtTemplate) {// 여러 치환 구문이 포함된 정규식 패턴 if (smsTxtTemplate == null) { return false; // null일 경우 false 반환 diff --git a/src/main/java/itn/let/kakao/kakaoComm/KakaoSendUtil.java b/src/main/java/itn/let/kakao/kakaoComm/KakaoSendUtil.java index 31e0dcbd..b3e10af4 100644 --- a/src/main/java/itn/let/kakao/kakaoComm/KakaoSendUtil.java +++ b/src/main/java/itn/let/kakao/kakaoComm/KakaoSendUtil.java @@ -1,12 +1,15 @@ package itn.let.kakao.kakaoComm; +import java.io.UnsupportedEncodingException; 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,6 +22,9 @@ 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; @@ -294,25 +300,23 @@ public class KakaoSendUtil { - KakaoReturnVO templateDetail = kakaoApiTemplate.selectKakaoApiTemplateDetail(kakaoVO); - String templateContent = templateDetail.getTemplateContent(); // 알림톡 템플릿 - kakaoVO.setTemplateContent(templateContent); - String templateTitle = templateDetail.getTemplateTitle(); + String templateContent = kakaoVO.getTemplateContent(); // 친구톡 내용 +// kakaoVO.setTemplateContent(templateContent); +// String templateTitle = templateDetail.getTemplateTitle(); // log.info(" + templateDetail :: [{}]", templateDetail); // templateDetail.getButtonList().forEach(t->log.info(" + ButtonList :: [{}]", t.toString())); Boolean hasContentReplacement = this.replBooleanStrChecker(templateContent); - Boolean hasTitleReplacement = this.replBooleanStrChecker(templateTitle); - Boolean hasButtonReplacement = this.needsButtonReplacement(templateDetail.getButtonList()); +// Boolean hasTitleReplacement = this.replBooleanStrChecker(templateTitle); +// Boolean hasButtonReplacement = this.needsButtonReplacement(templateDetail.getButtonList()); /** @jsonStr 필요유무 */ - boolean hasTitleOrButtons = StringUtils.isNotEmpty(templateTitle) - || CollectionUtils.isNotEmpty(templateDetail.getButtonList()); + boolean hasTitleOrButtons = CollectionUtils.isNotEmpty(kakaoVO.getButtonVOList()); /** @jsonStr 반복유무 */ - boolean needsJsonReplacement = hasTitleReplacement || hasButtonReplacement; +// boolean needsJsonReplacement = hasTitleReplacement || hasButtonReplacement; String sharedJsonStr = null; String subMsgTxt = kakaoVO.getSubMsgTxt(); // 실패 대체 문자 @@ -322,125 +326,105 @@ public class KakaoSendUtil { // 사용자 개인 단가 정보 불러오기 MberManageVO mberManageVO = mjonMsgDataService.selectMberManageInfo(kakaoVO.getUserId()); - + + String smsTxtTemp = templateContent; + Boolean replaceYN = MsgSendUtils.getReplaceYN(templateContent); + + boolean hasPerformedMsgType = false; // 치환 문자가 없는 경우, 스팸 체크가 한 번만 수행되도록 제어 /** @MSGID KEY값 */ List idList = mjonCommon.getNextCustomMsgCId(kakaoVO.getVarListMap().size()); -// for (int i = 0; i < kakaoSendAdvcListVO.size(); i++) { -// kakaoSendAdvcListVO.get(i).setMsgId(idList.get(i)); -// kakaoSendAdvcListVO.get(i).setBizJsonName(idList.get(i)); -// } - - + + + 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 msgTypeResult = null; + List mjonFTSendVOList = kakaoVO.getMjonFTSendVOList(); + // 분할 건수 카운터 int counter = 0; - /** @Map에 총 갯수가 수신자 갯수와 동일함 */ - List> varList = kakaoVO.getVarListMap(); - for (int i = 0; i < varList.size(); i++) { - // for(Map variables : kakaoVO.getVarListMap()) { - // 치환 데이터 - Map variables = varList.get(i); - log.info(""); + for (MjonFTSendVO sendVO : mjonFTSendVOList) { + KakaoSendAdvcVO kakaoSendAdvcVO = new KakaoSendAdvcVO(); - /** @공통 기본값 */ - KakaoSendAdvcVO sendVO = createSendVO(kakaoVO); - String msgId = idList.get(i); - sendVO.setMsgId(msgId); - - // step1 - // Step 1-1: 값 치환 및 수신번호 셋팅 - // Step 1-2: 수신자 정보 설정 (callToList는 항상 설정). - if (variables.containsKey("callToList")) { - sendVO.setCallTo(variables.get("callToList")); - variables.remove("callToList"); // 사용 후 제거. - } - - /** @Step1-3: 템플릿 치환데이터 설정 */ - String templateContentTemp = templateContent; - String templateTitleTemp = templateTitle; - if (hasContentReplacement) { - templateContentTemp = mjonCommon.ATReplaceTemplateVariables(templateContent, variables); - if(hasTitleReplacement) { - templateTitleTemp = mjonCommon.ATReplaceTemplateVariables(templateTitle, variables); + kakaoSendAdvcVO.setCallFrom(kakaoVO.getCallFrom()); + kakaoSendAdvcVO.setCallTo(sendVO.getPhone()); + kakaoSendAdvcVO.setUserId(kakaoVO.getUserId()); + + String smsTxt = smsTxtTemp; + // 치환 문자면 + if(replaceYN) { + + // 각 치환 구문을 확인하고 치환할 값이 없으면 오류 반환 + for (Map.Entry> entry : placeholders.entrySet()) { + String placeholder = entry.getKey(); + String value = entry.getValue().apply(sendVO); +// log.info(" + smsTxtTemp [{}]", smsTxtTemp); +// log.info(" + placeholder [{}]", placeholder); +// log.info(" + value [{}]", value); +// log.info(" + smsTxtTemp.contains(placeholder) [{}]", smsTxtTemp.contains(placeholder)); + if (smsTxt.contains(placeholder)) { + if (StringUtils.isEmpty(value)) { + statusResponseSet(statusResponse, HttpStatus.BAD_REQUEST, "치환 문구중 " + placeholder + " 데이터가 없습니다."); + return false; + } + smsTxt = smsTxt.replace(placeholder, value); +// log.info(" + smsTxt [{}]", smsTxt); + + } } } - /** @버튼 치환 */ // 버튼 리스트가 있으면 치환 수행, 항상 sendVO에 설정 - List buttonList = templateDetail.getButtonList(); - if(hasButtonReplacement) { - buttonList = replaceButtonLinks(buttonList, variables); + + String smsSpamChkTxt = smsTxt; + if(StringUtils.isNotEmpty(smsTxt)) { + smsSpamChkTxt = smsTxt.replaceAll(String.valueOf((char) 13), ""); } - sendVO.setButtonList(buttonList); - - sendVO.setTemplateTitle(templateTitleTemp); - sendVO.setTemplateContent(templateContentTemp); + - // Step 1-4: 실패 대체 문자 치환데이터 설정 - if("Y".equals(kakaoVO.getSubMsgSendYn())) { // 대체문자가 있나? - if ("Y".equals(kakaoVO.getSubMsgTxtReplYn())) { // 치환데이터가 있나? - subMsgTxt = mjonCommon.ATReplaceTemplateVariables(subMsgTxt, variables); + // == 치환 여부에 따라 처리 로직 분기 == + // 치환 문자가 아닌 경우 + if (!replaceYN) { + if (!hasPerformedMsgType) { + msgTypeResult = getMsgTypeWithByteValidation(sendVO, smsTxt); + if ("INVALID".equals(msgTypeResult)) { + statusResponseSet(statusResponse, HttpStatus.BAD_REQUEST, "문자 치환 후 전송 문자 길이를 초과하였습니다."); + return null; + } + hasPerformedMsgType = true; } - sendVO.setSubMsgTxt(subMsgTxt);// 실패 - } - sendVO.setSubMsgSendYn(kakaoVO.getSubMsgSendYn()); - - - /* - log.info("kakaoSendAdvcVO Details: [callTo={}\n, templateContent=\n{}\n, subMsgTxt=\n{}]\n\n\n\n", - kakaoSendAdvcVO.getCallTo(), - kakaoSendAdvcVO.getTemplateContent(), - kakaoSendAdvcVO.getSubMsgTxt() - ); - */ - - // Step1 END - - -// step3 -// 바이트 수 체크 및 금액설정 - - - Float kakaoAtPrice = mberManageVO.getKakaoAtPrice(); - // 유효한 단가 계산 - float shortPrice = getValidPrice(mberManageVO.getShortPrice(), sysJoinSetVO.getShortPrice()); - float longPrice = getValidPrice(mberManageVO.getLongPrice(), sysJoinSetVO.getLongPrice()); - - - String shortPStr = Float.toString(shortPrice); - String mmsPStr = Float.toString(longPrice); - - // 공통 가격 설정 - sendVO.setSmsPrice(shortPStr); - sendVO.setMmsPrice(mmsPStr); - - - if("Y".equals(kakaoVO.getSubMsgSendYn())) { - int smsTxtByte = mjonCommon.getSmsTxtBytes(sendVO.getSubMsgTxt()); - String sendType = getMsgType(smsTxtByte); - sendVO.setSubMsgType(sendType); - - if ("INVALID".equals(sendType)) { - statusResponseSet(statusResponse, HttpStatus.BAD_REQUEST, "전송 문자 길이를 초과하였습니다.");return kakaoSendAdvcListVO; + } + else + {// 치환 문자인 경우 + + // 메시지 타입 체크는 매번 수행 + msgTypeResult = getMsgTypeWithByteValidation(sendVO, smsTxt); + if ("INVALID".equals(msgTypeResult)) { + statusResponseSet(statusResponse, HttpStatus.BAD_REQUEST, "문자 치환 후 전송 문자 길이를 초과하였습니다."); + return null; } - - boolean isMms = "MMS".equals(sendType); - sendVO.setEachPrice(isMms ? mmsPStr : shortPStr); - - - } else { - kakaoAtPrice = getValidPrice(mberManageVO.getKakaoAtPrice(), sysJoinSetVO.getKakaoAtPrice()); - sendVO.setEachPrice( Float.toString(kakaoAtPrice) ); } - // step4 - // 예약 시간 설정 및 분할 데이터 설정 + + kakaoSendAdvcVO.setTemplateContent(smsTxt); + kakaoSendAdvcVO.setMsgType(msgTypeResult); + + + + + // 예약 여부 확인 if ("Y".equalsIgnoreCase(kakaoVO.getReserveYn()) - && "Y".equalsIgnoreCase(kakaoVO.getDivideChk()) - && counter == Integer.parseInt(kakaoVO.getDivideCnt())) + && "Y".equalsIgnoreCase(kakaoVO.getDivideChk()) + && counter == Integer.parseInt(kakaoVO.getDivideCnt())) { counter = 0; calendar.add(Calendar.MINUTE, Integer.parseInt(kakaoVO.getDivideTime())); @@ -448,36 +432,46 @@ public class KakaoSendUtil { counter++; // 즉시 발송인경우 현재 시간 // 예약인 경우 위에 설정한 시간 입력 - sendVO.setReqDate(DATE_FORMATTER.format(calendar.getTime())); + kakaoSendAdvcVO.setReqDate(DATE_FORMATTER.format(calendar.getTime())); + + kakaoSendAdvcListVO.add(kakaoSendAdvcVO); - - - /** @step5 전송 메세지 설정 json파일 만들기*/ - // 타이틀과 버튼이 있고 - if(hasTitleOrButtons) { - // 버튼과 타이틀에 치환데이터가 있으면 json String을 계속 생성 - if(needsJsonReplacement) { - sharedJsonStr = kakaoApiJsonSave.kakaoApiJsonSave_advc(sendVO, templateDetail); - sendVO.setBizJsonName(msgId); - sendVO.setJsonStr(sharedJsonStr); - } else if (StringUtils.isEmpty(sharedJsonStr)) { - // 치환 데이터가 없고 아직 생성되지 않았으면 한 번만 생성 - sharedJsonStr = kakaoApiJsonSave.kakaoApiJsonSave_advc(sendVO, templateDetail); - sendVO.setBizJsonName(idList.get(0)); - sendVO.setJsonStr(sharedJsonStr); - }else { - sendVO.setBizJsonName(idList.get(0)); - } - - } - log.info(" sendVO :: [{}]", sendVO); - kakaoSendAdvcListVO.add(sendVO); } 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 { // 예약 시간 기본값 설정 Date now = new Date(); From 81d31fc55f0c554306ece85c544c50b752c8bca5 Mon Sep 17 00:00:00 2001 From: "hehihoho3@gmail.com" Date: Fri, 25 Apr 2025 11:24:29 +0900 Subject: [PATCH 06/48] =?UTF-8?q?=EC=B9=9C=EA=B5=AC=ED=86=A1=20=EB=B0=9C?= =?UTF-8?q?=EC=86=A1=20=EC=86=8D=EB=8F=84=20=EA=B0=9C=EC=84=A0=EC=A4=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kakaoAt/web/MjonKakaoATController.java | 13 +- .../let/kakao/kakaoComm/KakaoSendAdvcVO.java | 2 +- .../let/kakao/kakaoComm/KakaoSendUtil.java | 367 +++++++++++---- .../java/itn/let/kakao/kakaoComm/KakaoVO.java | 1 + .../kakaoComm/kakaoApi/KakaoApiJsonSave.java | 5 +- .../impl/KakaoAlimTalkServiceImpl.java | 169 +------ .../impl/KakaoFriendsTalkServiceImpl.java | 152 +++++- .../msgdata/at/KakaoAlimtalkMsgDataView.jsp | 4 +- .../ft/KakaoFriendsTalkMsgDataView.jsp | 445 +++++------------- .../jsp/web/kakao/sent/KakaoSentView.jsp | 4 +- 10 files changed, 582 insertions(+), 580 deletions(-) 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/KakaoSendAdvcVO.java b/src/main/java/itn/let/kakao/kakaoComm/KakaoSendAdvcVO.java index 480cf85a..54a7331e 100644 --- a/src/main/java/itn/let/kakao/kakaoComm/KakaoSendAdvcVO.java +++ b/src/main/java/itn/let/kakao/kakaoComm/KakaoSendAdvcVO.java @@ -83,7 +83,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 + "]" + diff --git a/src/main/java/itn/let/kakao/kakaoComm/KakaoSendUtil.java b/src/main/java/itn/let/kakao/kakaoComm/KakaoSendUtil.java index b3e10af4..e2387ece 100644 --- a/src/main/java/itn/let/kakao/kakaoComm/KakaoSendUtil.java +++ b/src/main/java/itn/let/kakao/kakaoComm/KakaoSendUtil.java @@ -1,6 +1,8 @@ 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; @@ -28,6 +30,7 @@ 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; @@ -44,6 +47,9 @@ public class KakaoSendUtil { @Autowired KakaoApiJsonSave kakaoApiJsonSave; + + @Resource(name="kakaoAlimTalkDAO") + private KakaoAlimTalkDAO kakaoAlimTalkDAO; @Resource(name = "MjonMsgDataService") private MjonMsgDataService mjonMsgDataService; @@ -57,6 +63,7 @@ public class KakaoSendUtil { @Autowired private MjonCommon mjonCommon; + // 클래스 수준에서 정적 Pattern 정의 (성능 최적화) private static final Pattern REPLACEMENT_PATTERN = Pattern.compile("#\\{[^}]+\\}"); @@ -142,7 +149,7 @@ public class KakaoSendUtil { log.info(""); /** @공통 기본값 */ - KakaoSendAdvcVO sendVO = createSendVO(kakaoVO); + KakaoSendAdvcVO sendVO = createATSendVO(kakaoVO); String msgId = idList.get(i); sendVO.setMsgId(msgId); @@ -293,33 +300,16 @@ public class KakaoSendUtil { //사용자 현재 보유 금액 불러오기(문자 발송 금액 차감 이전 금액) // String befCash = kakaoVO.getBefCash(); - + log.info(" [{}]", kakaoVO.ftToString()); List kakaoSendAdvcListVO = new ArrayList<>(); Calendar calendar = setupBaseDate(kakaoVO, isNotified); - - String templateContent = kakaoVO.getTemplateContent(); // 친구톡 내용 -// kakaoVO.setTemplateContent(templateContent); -// String templateTitle = templateDetail.getTemplateTitle(); - - -// log.info(" + templateDetail :: [{}]", templateDetail); -// templateDetail.getButtonList().forEach(t->log.info(" + ButtonList :: [{}]", t.toString())); - - Boolean hasContentReplacement = this.replBooleanStrChecker(templateContent); -// Boolean hasTitleReplacement = this.replBooleanStrChecker(templateTitle); -// Boolean hasButtonReplacement = this.needsButtonReplacement(templateDetail.getButtonList()); - - /** @jsonStr 필요유무 */ - boolean hasTitleOrButtons = CollectionUtils.isNotEmpty(kakaoVO.getButtonVOList()); - - /** @jsonStr 반복유무 */ -// boolean needsJsonReplacement = hasTitleReplacement || hasButtonReplacement; - String sharedJsonStr = null; - - String subMsgTxt = kakaoVO.getSubMsgTxt(); // 실패 대체 문자 + // 친구톡 내용 + String templateContent = kakaoVO.getTemplateContent(); + // 실패 대체 문자 + String subMsgTxt = kakaoVO.getSubMsgTxt(); // 시스템 기본 단가 정보 불러오기 JoinSettingVO sysJoinSetVO = mjonMsgDataService.selectJoinSettingInfo(); @@ -327,14 +317,15 @@ public class KakaoSendUtil { MberManageVO mberManageVO = mjonMsgDataService.selectMberManageInfo(kakaoVO.getUserId()); - String smsTxtTemp = templateContent; + // 치환 문구가 있는지 확인 Boolean replaceYN = MsgSendUtils.getReplaceYN(templateContent); + Boolean replaceSubYN = MsgSendUtils.getReplaceYN(subMsgTxt); boolean hasPerformedMsgType = false; // 치환 문자가 없는 경우, 스팸 체크가 한 번만 수행되도록 제어 /** @MSGID KEY값 */ - List idList = mjonCommon.getNextCustomMsgCId(kakaoVO.getVarListMap().size()); + List idList = mjonCommon.getNextCustomMsgCId(kakaoVO.getMjonFTSendVOList().size()); Map> placeholders = new HashMap<>(); @@ -345,97 +336,114 @@ public class KakaoSendUtil { placeholders.put("[*4*]", MjonFTSendVO::getRep4); + // 친구통 금액 + Float kakaoFtPrice = mberManageVO.getKakaoFtPrice(); + + // 대체문자가 있을경우 사용 + float shortPrice = getValidPrice(mberManageVO.getShortPrice(), sysJoinSetVO.getShortPrice()); + float longPrice = getValidPrice(mberManageVO.getLongPrice(), sysJoinSetVO.getLongPrice()); + + String shortPStr = Float.toString(shortPrice); + String mmsPStr = Float.toString(longPrice); + + + /** @jsonStr 필요유무 */ + boolean hasTitleOrButtons = CollectionUtils.isNotEmpty(kakaoVO.getButtonVOList()); + String sharedJsonStr = null; + + - String msgTypeResult = null; List mjonFTSendVOList = kakaoVO.getMjonFTSendVOList(); // 분할 건수 카운터 int counter = 0; - for (MjonFTSendVO sendVO : mjonFTSendVOList) { - KakaoSendAdvcVO kakaoSendAdvcVO = new KakaoSendAdvcVO(); - - kakaoSendAdvcVO.setCallFrom(kakaoVO.getCallFrom()); - kakaoSendAdvcVO.setCallTo(sendVO.getPhone()); - kakaoSendAdvcVO.setUserId(kakaoVO.getUserId()); + for (int i = 0; i < mjonFTSendVOList.size(); i++) { + MjonFTSendVO mjonFTSendVO = mjonFTSendVOList.get(i); - String smsTxt = smsTxtTemp; + KakaoSendAdvcVO sendVO = createFTSendVO(kakaoVO, calendar); + // 공통 가격 설정 + sendVO.setSmsPrice(shortPStr); + sendVO.setMmsPrice(mmsPStr); + + 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(sendVO); -// log.info(" + smsTxtTemp [{}]", smsTxtTemp); -// log.info(" + placeholder [{}]", placeholder); -// log.info(" + value [{}]", value); -// log.info(" + smsTxtTemp.contains(placeholder) [{}]", smsTxtTemp.contains(placeholder)); + String value = entry.getValue().apply(mjonFTSendVO); if (smsTxt.contains(placeholder)) { if (StringUtils.isEmpty(value)) { statusResponseSet(statusResponse, HttpStatus.BAD_REQUEST, "치환 문구중 " + placeholder + " 데이터가 없습니다."); - return false; + return null; } smsTxt = smsTxt.replace(placeholder, value); -// log.info(" + smsTxt [{}]", smsTxt); - } } } - - String smsSpamChkTxt = smsTxt; - if(StringUtils.isNotEmpty(smsTxt)) { - smsSpamChkTxt = smsTxt.replaceAll(String.valueOf((char) 13), ""); - } - + sendVO.setTemplateContent(smsTxt); - // == 치환 여부에 따라 처리 로직 분기 == - // 치환 문자가 아닌 경우 - if (!replaceYN) { - if (!hasPerformedMsgType) { - msgTypeResult = getMsgTypeWithByteValidation(sendVO, smsTxt); - if ("INVALID".equals(msgTypeResult)) { - statusResponseSet(statusResponse, HttpStatus.BAD_REQUEST, "문자 치환 후 전송 문자 길이를 초과하였습니다."); - return null; + + String subMsgTxtTemp = null; + + if(StringUtils.isNotEmpty(subMsgTxt)) { + subMsgTxtTemp = subMsgTxt; + + // 각 치환 구문을 확인하고 치환할 값이 없으면 오류 반환 + 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); } - hasPerformedMsgType = true; - } - } - else - {// 치환 문자인 경우 - - // 메시지 타입 체크는 매번 수행 - msgTypeResult = getMsgTypeWithByteValidation(sendVO, smsTxt); - if ("INVALID".equals(msgTypeResult)) { - statusResponseSet(statusResponse, HttpStatus.BAD_REQUEST, "문자 치환 후 전송 문자 길이를 초과하였습니다."); - return null; } } + sendVO.setSubMsgTxt(subMsgTxtTemp); - - - kakaoSendAdvcVO.setTemplateContent(smsTxt); - kakaoSendAdvcVO.setMsgType(msgTypeResult); - - + //대체문자가 있으면 + // Step 1-4: 실패 대체 문자 치환데이터 설정 + if(StringUtils.isNotEmpty(subMsgTxtTemp)) { // 대체문자가 있나? + int smsTxtByte = mjonCommon.getSmsTxtBytes(subMsgTxtTemp); + String sendType = getMsgType(smsTxtByte); + sendVO.setSubMsgType(sendType); - - // 예약 여부 확인 - if ("Y".equalsIgnoreCase(kakaoVO.getReserveYn()) - && "Y".equalsIgnoreCase(kakaoVO.getDivideChk()) - && counter == Integer.parseInt(kakaoVO.getDivideCnt())) - { - counter = 0; - calendar.add(Calendar.MINUTE, Integer.parseInt(kakaoVO.getDivideTime())); + if ("INVALID".equals(sendType)) { + statusResponseSet(statusResponse, HttpStatus.BAD_REQUEST, "전송 문자 길이를 초과하였습니다.");return kakaoSendAdvcListVO; + } + + boolean isMms = "MMS".equals(sendType); + sendVO.setEachPrice(isMms ? mmsPStr : shortPStr); + sendVO.setSubMsgTxt(subMsgTxt);// 실패 + }else { + kakaoFtPrice = getValidPrice(mberManageVO.getKakaoAtPrice(), sysJoinSetVO.getKakaoAtPrice()); + sendVO.setEachPrice( Float.toString(kakaoFtPrice) ); } - counter++; - // 즉시 발송인경우 현재 시간 - // 예약인 경우 위에 설정한 시간 입력 - kakaoSendAdvcVO.setReqDate(DATE_FORMATTER.format(calendar.getTime())); - kakaoSendAdvcListVO.add(kakaoSendAdvcVO); + + // 타이틀과 버튼이 있고 + if(hasTitleOrButtons) { + // + 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()); } @@ -508,14 +516,40 @@ 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()); return sendVO; } @@ -1401,4 +1435,165 @@ 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); + + // 총 메시지 금액 계산 (HALF_EVEN 적용) + BigDecimal totalEachPrice = kakaoSendAdvcListVO.stream() + .map(msg -> new BigDecimal(String.valueOf(msg.getEachPrice()))) // 변환 오류 방지 + .reduce(BigDecimal.ZERO, BigDecimal::add) + .setScale(2, RoundingMode.HALF_EVEN); // 일관성 유지 + + // 비교 수행 + return befCash.compareTo(totalEachPrice) >= 0; + } + + + + /** + * @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.setMsgGroupCnt(Integer.toString(instCnt)); + sendVO.setReserveYn(kakaoVO.getReserveYn()); + sendVO.setBefCash(priceAndPoint.getBefCash(sendVO.getUserId())); + sendVO.setBefPoint(priceAndPoint.getBefPoint(sendVO.getUserId())); + + Float eachPrice = Float.parseFloat(sendVO.getEachPrice()); + + Float totPrice = eachPrice * instCnt; + sendVO.setTotPrice(String.format("%.1f", totPrice)); + + sendVO.setAtDelayYn(kakaoVO.getAtSmishingYn()); + sendVO.setBizKakaoResendOrgnlTxt(kakaoVO.getSubMsgTxt()); + sendVO.setBizKakaoResendType(sendVO.getSubMsgType()); + + kakaoAlimTalkDAO.insertKakaoGroupDataTb_advc(sendVO); + + } + + + } diff --git a/src/main/java/itn/let/kakao/kakaoComm/KakaoVO.java b/src/main/java/itn/let/kakao/kakaoComm/KakaoVO.java index 5b742f52..db393fb5 100644 --- a/src/main/java/itn/let/kakao/kakaoComm/KakaoVO.java +++ b/src/main/java/itn/let/kakao/kakaoComm/KakaoVO.java @@ -344,6 +344,7 @@ public class KakaoVO extends MjonMsgVO{ 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("]"); 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 a1127285..bc505002 100644 --- a/src/main/java/itn/let/kakao/kakaoComm/kakaoApi/KakaoApiJsonSave.java +++ b/src/main/java/itn/let/kakao/kakaoComm/kakaoApi/KakaoApiJsonSave.java @@ -10,6 +10,7 @@ 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; @@ -246,12 +247,12 @@ public class KakaoApiJsonSave { JSONObject templateImageExtInfo = new JSONObject(); String imageType = kakaoVO.getImageType(); - if(!imageType.equals("")) { + if(StringUtils.isNotEmpty(imageType)) { templateImageInfo.put("img_url", kakaoVO.getTemplateImageUrl()); templateImageInfo.put("img_link", kakaoVO.getImgLink()); } - if(imageType.equals("W")) { + if("W".equals(imageType)) { templateImageExtInfo.put("wide", "Y"); } 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 cef9cf34..4d62cb43 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 @@ -913,7 +913,7 @@ public class KakaoAlimTalkServiceImpl extends EgovAbstractServiceImpl implements /** @전송금액 확인 --------------------------------------------------*/ - if (!isCashSufficient(userId, kakaoSendAdvcListVO)) { + if (!kakaoSendUtil.isCashSufficient(userId, kakaoSendAdvcListVO)) { log.error("Insufficient balance for message sending."); return new StatusResponse(HttpStatus.BAD_REQUEST, "문자 발송에 필요한 보유 잔액이 부족 합니다."); } @@ -921,7 +921,8 @@ public class KakaoAlimTalkServiceImpl extends EgovAbstractServiceImpl implements /** @json파일이 있을 떄 biz_attachments insert */ - this.insertKakaoAtDataJsonInfo_advc(kakaoSendAdvcListVO); + kakaoSendUtil.insertKakaoAtDataJsonInfo_advc(kakaoSendAdvcListVO); +// this.insertKakaoAtDataJsonInfo_advc(kakaoSendAdvcListVO); Map> priceGroupedMessages = kakaoSendAdvcListVO.stream() @@ -941,7 +942,7 @@ public class KakaoAlimTalkServiceImpl extends EgovAbstractServiceImpl implements // 발송 데이터 삽입 - int instCnt = this.insertKakaoData_advc(groupedMsgList); + int instCnt = kakaoSendUtil.insertKakaoData_advc(groupedMsgList); // int instCnt = 6; if(instCnt > 0) { @@ -951,7 +952,7 @@ public class KakaoAlimTalkServiceImpl extends EgovAbstractServiceImpl implements KakaoSendAdvcVO sendVO = groupedMsgList.get(0); /** @groupData 테이블 insert */ - this.insertKakaoGroupDataTb_advc(instCnt, kakaoVO, sendVO); + kakaoSendUtil.insertKakaoGroupDataTb_advc(instCnt, kakaoVO, sendVO); /** @biz_kakao_price에 insert (대체문자 환불관련 테이블)*/ @@ -1032,146 +1033,26 @@ public class KakaoAlimTalkServiceImpl extends EgovAbstractServiceImpl implements - private void insertKakaoAtDataJsonInfo_advc(List kakaoSendAdvcListVO) { - // TODO Auto-generated method stub - - // 측정할 메소드 호출 전 시간 기록 - List jsonInfoData = new ArrayList<>(kakaoSendAdvcListVO); - jsonInfoData.removeIf(t -> StringUtils.isBlank(t.getJsonStr())); - log.info(" + jsonInfoData Insert :: [{}]", jsonInfoData.size()); - if(jsonInfoData.size() > 0) { - kakaoAlimTalkDAO.insertKakaoAtDataJsonInfo_advc(jsonInfoData); - } - - } - - private void insertKakaoGroupDataTb_advc(int instCnt, KakaoVO kakaoVO, KakaoSendAdvcVO sendVO) throws Exception { - // TODO Auto-generated method stub - -// log.info(" + insertKakaoGroupDataTb_advc kakaoVO :: \n[{}]", kakaoVO.toString());; -// log.info(" + insertKakaoGroupDataTb_advc kakaoSendAdvcVOList :: \n[{}]", sendVO.toString()); - - sendVO.setMsgGroupCnt(Integer.toString(instCnt)); - sendVO.setReserveYn(kakaoVO.getReserveYn()); - sendVO.setBefCash(priceAndPoint.getBefCash(sendVO.getUserId())); - sendVO.setBefPoint(priceAndPoint.getBefPoint(sendVO.getUserId())); - - Float eachPrice = Float.parseFloat(sendVO.getEachPrice()); - - Float totPrice = eachPrice * instCnt; - sendVO.setTotPrice(String.format("%.1f", totPrice)); - - sendVO.setAtDelayYn(kakaoVO.getAtSmishingYn()); - sendVO.setBizKakaoResendOrgnlTxt(kakaoVO.getSubMsgTxt()); - sendVO.setBizKakaoResendType(sendVO.getSubMsgType()); - - kakaoAlimTalkDAO.insertKakaoGroupDataTb_advc(sendVO); - - } - - /** - * @methodName : insertKakaoData_advc - * @author : 이호영 - * @date : 2025. 3. 20. - * @description : 카카오 batch 발송 => mj_msg_data - * @return : int - * @param kakaoSendAdvcVOList - * @param parentLoopCount - * @param isJsonNotEmpty - * @param isJsonNameAllSame - * @return - * - */ - private int insertKakaoData_advc(List kakaoSendAdvcVOList) { - - - // 시작 시간 측정 - long totalStartTime = System.currentTimeMillis(); - - int totalSize = kakaoSendAdvcVOList.size(); // 총 데이터 개수 - // Batch 크기 설정 (고정값) -// int batchSize = 10000; 465 - int batchSize = 50000; // 9분 18초 - - log.info("총 데이터 개수 :: [{}] ", totalSize); - log.info("설정된 Batch 크기 :: [{}] ", batchSize); - - // 총 insert 카운트 - int instCnt = 0; - int batchCount = 0; - - // 각 배치별 실행 시간 기록 - List batchExecutionTimes = new ArrayList<>(); - - - // 첫 번째 배치에서만 삽입했는지 추적하는 플래그 - for (int i = 0; i < totalSize; i += batchSize) { - // Batch 시작 시간 측정 - long batchStartTime = System.currentTimeMillis(); - - // Batch 리스트 생성 - List batchList = kakaoSendAdvcVOList.subList(i, Math.min(i + batchSize, totalSize)); - System.out.println("Batch 시작 인덱스: " + i); - - // mj_msg_data 테이블 insert - int insertedCount = kakaoAlimTalkDAO.insertKakaoAtDataInfo_advc(batchList); - - /** @kakaoSendUtil.populateSendLists - * 하단에서 - * getJsonStr 데이터 처리 후 활용 - * */ - instCnt += insertedCount; - - // Batch 종료 시간 측정 및 실행 시간 계산 - long batchEndTime = System.currentTimeMillis(); - double batchExecutionTimeInSeconds = (batchEndTime - batchStartTime) / 1000.0; - - // 실행 시간 기록 - batchExecutionTimes.add(batchExecutionTimeInSeconds); - batchCount++; - } - - // 종료 시간 측정 - long totalEndTime = System.currentTimeMillis(); - - // 총 실행 시간 계산 (밀리초 -> 초로 변환) - double totalExecutionTimeInSeconds = (totalEndTime - totalStartTime) / 1000.0; - - // 실행 시간 출력 - log.info("총 배치 실행 횟수 :: [{}] ", batchCount); - log.info("batchSize :: [{}] ", batchSize); - log.info("총 실행 시간 :: [{}] ", totalExecutionTimeInSeconds + "초"); - log.info("총 삽입 건수 :: [{}] ", instCnt); - - // 각 배치별 실행 시간 출력 - for (int k = 0; k < batchExecutionTimes.size(); k++) { - System.out.println("배치 " + (k + 1) + " 실행 시간 :: " + batchExecutionTimes.get(k) + "초"); - } - - return instCnt; - - } - - // 보유 금액이 충분한지 확인하는 메서드 - private boolean isCashSufficient(String userId, List kakaoSendAdvcListVO) throws Exception { - - - String userMoney = priceAndPoint.getBefCash(userId); - // 쉼표 제거 - userMoney = userMoney.replace(",", ""); - - // 사용자 보유 금액 BigDecimal 변환 (HALF_EVEN 적용) - BigDecimal befCash = new BigDecimal(userMoney).setScale(2, RoundingMode.HALF_EVEN); - - // 총 메시지 금액 계산 (HALF_EVEN 적용) - BigDecimal totalEachPrice = kakaoSendAdvcListVO.stream() - .map(msg -> new BigDecimal(String.valueOf(msg.getEachPrice()))) // 변환 오류 방지 - .reduce(BigDecimal.ZERO, BigDecimal::add) - .setScale(2, RoundingMode.HALF_EVEN); // 일관성 유지 - - // 비교 수행 - return befCash.compareTo(totalEachPrice) >= 0; - } +// // 보유 금액이 충분한지 확인하는 메서드 +// private boolean isCashSufficient(String userId, List kakaoSendAdvcListVO) throws Exception { +// +// +// String userMoney = priceAndPoint.getBefCash(userId); +// // 쉼표 제거 +// userMoney = userMoney.replace(",", ""); +// +// // 사용자 보유 금액 BigDecimal 변환 (HALF_EVEN 적용) +// BigDecimal befCash = new BigDecimal(userMoney).setScale(2, RoundingMode.HALF_EVEN); +// +// // 총 메시지 금액 계산 (HALF_EVEN 적용) +// BigDecimal totalEachPrice = kakaoSendAdvcListVO.stream() +// .map(msg -> new BigDecimal(String.valueOf(msg.getEachPrice()))) // 변환 오류 방지 +// .reduce(BigDecimal.ZERO, BigDecimal::add) +// .setScale(2, RoundingMode.HALF_EVEN); // 일관성 유지 +// +// // 비교 수행 +// return befCash.compareTo(totalEachPrice) >= 0; +// } diff --git a/src/main/java/itn/let/kakao/user/kakaoFt/service/impl/KakaoFriendsTalkServiceImpl.java b/src/main/java/itn/let/kakao/user/kakaoFt/service/impl/KakaoFriendsTalkServiceImpl.java index 89e0f1e7..8d118f6b 100644 --- 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 @@ -1,9 +1,12 @@ 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; @@ -20,9 +23,13 @@ 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; @@ -36,17 +43,29 @@ public class KakaoFriendsTalkServiceImpl extends EgovAbstractServiceImpl implem @Resource(name="kakaoFriendsTalkTemplateDAO") private KakaoFriendsTalkTemplateDAO kakaoFriendsTalkTemplateDAO; + @Resource(name="mjonMsgDAO") + private MjonMsgDAO mjonMsgDAO; + /** userManageService */ @Resource(name = "userManageService") private EgovUserManageService userManageService; - @Autowired - private MjonCommon mjonCommon; + @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(); @@ -103,29 +122,122 @@ public class KakaoFriendsTalkServiceImpl extends EgovAbstractServiceImpl implem +/** @전송금액 확인 --------------------------------------------------*/ + if (!kakaoSendUtil.isCashSufficient(userId, kakaoSendAdvcListVO)) { + log.error("Insufficient balance for message sending."); + return new StatusResponse(HttpStatus.BAD_REQUEST, "문자 발송에 필요한 보유 잔액이 부족 합니다."); + } - - - - - - - - - - - - - - - - - // KakaoSendAdvcVO 발송 VO +/** @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 (대체문자 환불관련 테이블)*/ + kakaoVO.setMsgGroupId(sendVO.getMsgGroupId()); + kakaoVO.setKakaoAtPrice(Float.parseFloat(sendVO.getEachPrice())); + kakaoVO.setSmsPrice(Float.parseFloat(sendVO.getSmsPrice())); + kakaoVO.setMmsPrice(Float.parseFloat(sendVO.getMmsPrice())); + + kakaoAlimTalkDAO.insertKakaoSendPrice(kakaoVO); + + + 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); + statusResponse.setObject(returnMap); + return statusResponse; } diff --git a/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/at/KakaoAlimtalkMsgDataView.jsp b/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/at/KakaoAlimtalkMsgDataView.jsp index d5b2e0da..c21ea04b 100644 --- a/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/at/KakaoAlimtalkMsgDataView.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/at/KakaoAlimtalkMsgDataView.jsp @@ -700,7 +700,7 @@ function sendTemplateInfo(){ success: function (data) { console.log('data : ', data); - var status = data.status; + /* var status = data.status; if("OK" == status){ var resultSts = data.object.resultSts; var reserYn = data.object.reserYn; @@ -715,7 +715,7 @@ function sendTemplateInfo(){ }else{ alert(data.message); return false; - } + } */ // if(data == 'success'){ diff --git a/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/ft/KakaoFriendsTalkMsgDataView.jsp b/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/ft/KakaoFriendsTalkMsgDataView.jsp index d377e429..52ea868b 100644 --- a/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/ft/KakaoFriendsTalkMsgDataView.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/ft/KakaoFriendsTalkMsgDataView.jsp @@ -313,17 +313,12 @@ function upImgClick(){ alert("이미지 클릭시 이동할 URL 주소를 http:// 또는 https:// 포함하여 입력해 주세요."); return false; - }else{ - - if(link.search("http://") == -1 && link.search("https://") == -1){ - - $("#imgNm").text(""); - $("#imgFile").val(""); - alert("이미지 URL 주소에는 http:// 또는 https://를 포함하여 입력해야 합니다."); - return false; - - } - + }else if(link.search("http://") == -1 && link.search("https://") == -1){ + + $("#imgNm").text(""); + $("#imgFile").val(""); + alert("이미지 URL 주소에는 http:// 또는 https://를 포함하여 입력해야 합니다."); + return false; } //첨부파일 선택 팝업 호출해주기 @@ -891,8 +886,10 @@ function fn_sendMsgData(){ var subMsgSendYn = "N"; if($("#send_fail_check").is(":checked")){ subMsgSendYn = 'Y' + $('#callFrom').val($('#callFromList').val()) } $("#subMsgSendYn").val(subMsgSendYn); + $("#subMsgTxt").val( $('#smsTxtArea').val()); @@ -912,166 +909,120 @@ function fn_sendMsgData(){ } - var spamChk = true; + + + // 타블레이터 호출 + var $selectedData = tableL.getData(); // 데이터 가져오기 - var spmData = new FormData(document.bizForm); - $.ajax({ - type: "POST" - , url: "/web/mjon/kakao/friendstalk/selectSpamKakaoFriendsTalkMsgChkAjax.do" - , data: spmData - , dataType:'json' - , async: false - , processData: false - , contentType: false - , cache: false - , success: function (returnData, status) { - if(status == 'success'){ // status 확인 필요한가. 석세스 안뜨면 에러 가지 않나 - - if("fail" == returnData.result){ - alert(returnData.message); - spamChk = false; - return false; - }else if("loginFail" == returnData.result){ - alert(returnData.message); - spamChk = false; - return false; - }else if("spams" == returnData.result){ - //alert("전송 내용에 스팸문구가 포함되어 있습니다.") - $("#spamStatus").val("Y"); - return false; - }else{ - spamChk = true; - return false; - } - - } else if(status== 'fail'){ - alert(returnData.message); - return false; - } - } - , error: function (e) { - alert("문자 발송에 실패하였습니다."); - console.log("ERROR : ", e); - return false; + var data = $('#bizForm'); + var formDataArray = data.serializeArray(); + + // 배열을 객체로 변환 + var formData = {}; + $.each(formDataArray, function(index, field) { + formData[field.name] = field.value; + }); + + // 2. buttonVOList 수동으로 수집 + var buttonList = []; + $('input[name^="buttonVOList"]').each(function() { + let nameAttr = $(this).attr('name'); + let match = nameAttr.match(/buttonVOList\[(\d+)\]\.(\w+)/); + + if (match) { + let index = parseInt(match[1]); + let key = match[2]; + let value = $(this).val(); + + if (!buttonList[index]) buttonList[index] = {}; + buttonList[index][key] = value; + } + }); + + // 3. formData에 배열로 추가 + formData["buttonVOList"] = buttonList; + + // 4. 기존의 buttonVOList[0].xxx 형태 제거 + Object.keys(formData).forEach(function(key) { + if (/^buttonVOList\[\d+\]\./.test(key)) { + delete formData[key]; } }); - if(spamChk){ - + // VO에 정의되어있지 않는 필요없는 값은 제거 + ["adFlag", "img_file_add", "userMoney", "callToList"].forEach(function(key) { + delete formData[key]; + }); - // 타블레이터 호출 - var $selectedData = tableL.getData(); // 데이터 가져오기 - - var data = $('#bizForm'); - var formDataArray = data.serializeArray(); - - // 배열을 객체로 변환 - var formData = {}; - $.each(formDataArray, function(index, field) { - formData[field.name] = field.value; - }); - - // 2. buttonVOList 수동으로 수집 - var buttonList = []; - $('input[name^="buttonVOList"]').each(function() { - let nameAttr = $(this).attr('name'); - let match = nameAttr.match(/buttonVOList\[(\d+)\]\.(\w+)/); - - if (match) { - let index = parseInt(match[1]); - let key = match[2]; - let value = $(this).val(); - - if (!buttonList[index]) buttonList[index] = {}; - buttonList[index][key] = value; - } - }); - - // 3. formData에 배열로 추가 - formData["buttonVOList"] = buttonList; - - // 4. 기존의 buttonVOList[0].xxx 형태 제거 - Object.keys(formData).forEach(function(key) { - if (/^buttonVOList\[\d+\]\./.test(key)) { - delete formData[key]; - } - }); - - // VO에 정의되어있지 않는 필요없는 값은 제거 - ["adFlag", "img_file_add", "userMoney", "callToList"].forEach(function(key) { - delete formData[key]; - }); - - - // 빈 값 제거 - removeEmptyValues(formData); - // 선택된 데이터 추가 - formData["mjonFTSendVOList"] = $selectedData; - // JSON 데이터 확인 - console.log("최종 formData:", JSON.stringify(formData)); - - - - - $.ajax({ - type: "POST" - , url: "/web/mjon/kakao/friendstalk/kakaoFriendsTalkMsgSendAjax_advc.do" - , data: JSON.stringify(formData) - , contentType: 'application/json' - , dataType: 'json' - , success: function (returnData) { - - console.log('returnData : ', returnData); - - - /* - if(status == 'success'){ - if("loginFail" == returnData.result){ - - alert(returnData.message); - return false; - - }else if('fail' == returnData.result){ - - alert(returnData.message); - return false; - - }else if('authFail' == returnData.result){ - - alert(returnData.message); - location.reload(); - - } else if(status == 'success'){ - - var kakaoSendCnt = returnData.resultSts; - - $('.pop_msg_success').css({'display':'block','opacity':'1','left':'50%','top':'50%','transform':'translate(-50%,-50%)'}); - - //예약발송 건의 경우 결과 팝업 문구 변경 - if(reserYn == 'Y'){ - $('.pop_msg_success .msg_text').html("예약 성공 : "+ kakaoSendCnt + "건의
    친구톡이 예약 되었습니다."); - }else{ - $('.pop_msg_success .msg_text').html("발송 성공 : "+ kakaoSendCnt + "건의
    친구톡이 발송 되었습니다."); - } - - $('.mask').addClass('on'); + + // 빈 값 제거 + removeEmptyValues(formData); + // 선택된 데이터 추가 + formData["mjonFTSendVOList"] = $selectedData; + // JSON 데이터 확인 + console.log("최종 formData:", JSON.stringify(formData)); + + + + + $.ajax({ + type: "POST" + , url: "/web/mjon/kakao/friendstalk/kakaoFriendsTalkMsgSendAjax_advc.do" + , data: JSON.stringify(formData) + , contentType: 'application/json' + , dataType: 'json' + , success: function (returnData) { + + console.log('returnData : ', returnData); + + + /* + if(status == 'success'){ + if("loginFail" == returnData.result){ + + alert(returnData.message); + return false; + + }else if('fail' == returnData.result){ + + alert(returnData.message); + return false; + + }else if('authFail' == returnData.result){ + + alert(returnData.message); + location.reload(); + + } else if(status == 'success'){ + + var kakaoSendCnt = returnData.resultSts; + + $('.pop_msg_success').css({'display':'block','opacity':'1','left':'50%','top':'50%','transform':'translate(-50%,-50%)'}); + + //예약발송 건의 경우 결과 팝업 문구 변경 + if(reserYn == 'Y'){ + $('.pop_msg_success .msg_text').html("예약 성공 : "+ kakaoSendCnt + "건의
    친구톡이 예약 되었습니다."); + }else{ + $('.pop_msg_success .msg_text').html("발송 성공 : "+ kakaoSendCnt + "건의
    친구톡이 발송 되었습니다."); } - } */ - } - ,beforeSend : function(xmlHttpRequest) { - //로딩창 show - $('.loading_layer').addClass('active'); - } - ,complete : function(xhr, textStatus) { - //로딩창 hide - $('.loading_layer').removeClass('active'); - } - ,error: function (e) { - console.log("ERROR : ", e); - alert("카카오 친구톡 전송에 실패하였습니다."); - } - }); - } + + $('.mask').addClass('on'); + } + } */ + } + ,beforeSend : function(xmlHttpRequest) { + //로딩창 show + $('.loading_layer').addClass('active'); + } + ,complete : function(xhr, textStatus) { + //로딩창 hide + $('.loading_layer').removeClass('active'); + } + ,error: function (e) { + console.log("ERROR : ", e); + alert("카카오 친구톡 전송에 실패하였습니다."); + } + }); } @@ -1119,6 +1070,8 @@ function fn_insertErrorYN(val){ } + + //문자 바이트수 계산하기 함수 function thisFnByteString(contents){ var totalByte = 0; @@ -1282,154 +1235,6 @@ function goToKakaoTestPopUp(){ alert("받는사람 주소를 한 건 이상 입력해주세요."); return false; - - }else{ - - //치환문구 변환 - var txtReplYn = $("#txtReplYn").val(); - - if(txtReplYn == 'Y'){ - - var name = tableL.getRows()[0].getData().name; - var phone = removeDash(tableL.getRows()[0].getData().phone); - var rep1 = tableL.getRows()[0].getData().rep1; - var rep2 = tableL.getRows()[0].getData().rep2; - var rep3 = tableL.getRows()[0].getData().rep3; - var rep4 = tableL.getRows()[0].getData().rep4; - - var varValList = []; //치환문자 연결시킬 변수 셋팅 - - - var nmStatus = false; - var rep1Status = false; - var rep2Status = false; - var rep3Status = false; - var rep4Status = false; - - var varValStr = ""; - var varValStatus = true; - - - if(tmpContents.indexOf("\#{이름}") > -1){ - nmStatus = true; - } - - if(tmpContents.indexOf("\#{1}") > -1){ - rep1Status = true; - } - - if(tmpContents.indexOf("\#{2}") > -1){ - rep2Status = true; - } - - if(tmpContents.indexOf("\#{3}") > -1){ - rep3Status = true; - } - - if(tmpContents.indexOf("\#{4}") > -1){ - rep4Status = true; - } - - - if(nmStatus && (typeof(name) != 'undefined' && name != null && name !="")){ - - if(varValStr == ''){ - varValStr = name.replaceAll(",","§"); - }else{ - varValStr = varValStr + "¶" + name.replaceAll(",","§"); - } - - }else{ - - if(nmStatus){ - varValStatus = false; - } - - } - - if(varValStr == ''){ - varValStr = phone; - }else{ - varValStr = varValStr + "¶" + phone; - } - - if(rep1Status && (typeof(rep1) != 'undefined' && rep1 != null && rep1 !="")){ - - if(varValStr == ''){ - varValStr = rep1.replaceAll(",","§"); - }else{ - varValStr = varValStr + "¶" + rep1.replaceAll(",","§"); - } - - }else{ - - if(rep1Status){ - varValStatus = false; - } - - } - - - if(rep2Status && (typeof(rep2) != 'undefined' && rep2 != null && rep2 !="")){ - - if(varValStr == ''){ - varValStr = rep2.replaceAll(",","§"); - }else{ - varValStr = varValStr + "¶" + rep2.replaceAll(",","§"); - } - - }else{ - - if(rep2Status){ - varValStatus = false; - } - - } - - if(rep3Status && (typeof(rep3) != 'undefined' && rep3 != null && rep3 !="")){ - - if(varValStr == ''){ - varValStr = rep3.replaceAll(",","§"); - }else{ - varValStr = varValStr + "¶" + rep3.replaceAll(",","§"); - } - - }else{ - - if(rep3Status){ - varValStatus = false; - } - - } - - if(rep4Status && (typeof(rep4) != 'undefined' && rep4 != null && rep4 !="")){ - - if(varValStr == ''){ - varValStr = rep4.replaceAll(",","§"); - }else{ - varValStr = varValStr + "¶" + rep4.replaceAll(",","§"); - } - - }else{ - - if(rep4Status){ - varValStatus = false; - } - - } - - if(!varValStatus){ - - alert("특정문구 일괄변환에 대한 일부 데이터가 누락된 부분이 있습니다. 데이터를 확인해 주세요."); - return false; - - } - - varValList[0] = varValStr; - - $("#varValList").val(varValList); - } - } form.method = "post"; @@ -1730,13 +1535,13 @@ function updateButtons(){

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

    - +
    - - - - + + + +
    @@ -2053,7 +1858,7 @@ function updateButtons(){
      - +

      @@ -2066,7 +1871,7 @@ function updateButtons(){

      - +
      diff --git a/src/main/webapp/WEB-INF/jsp/web/kakao/sent/KakaoSentView.jsp b/src/main/webapp/WEB-INF/jsp/web/kakao/sent/KakaoSentView.jsp index 4a85e26b..5e869392 100644 --- a/src/main/webapp/WEB-INF/jsp/web/kakao/sent/KakaoSentView.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/kakao/sent/KakaoSentView.jsp @@ -557,10 +557,10 @@ function fn_sentDetailView(msgGroupId) {
      • - <%--
      • -
        --%> +
      From d730bdd76eb1f5bfe772124c1eb27c729ffab955 Mon Sep 17 00:00:00 2001 From: "hehihoho3@gmail.com" Date: Fri, 25 Apr 2025 16:59:38 +0900 Subject: [PATCH 07/48] =?UTF-8?q?=EC=B9=9C=EA=B5=AC=ED=86=A1=20=EB=B0=9C?= =?UTF-8?q?=EC=86=A1=EC=86=8D=EB=8F=84=20=EB=B0=8F=20=EB=B0=9C=EC=86=A1?= =?UTF-8?q?=EA=B2=B0=EA=B3=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/kakaoAt/service/MjonKakaoATVO.java | 1079 +---------------- .../let/kakao/kakaoComm/KakaoSendUtil.java | 39 +- .../user/sent/web/KakaoSentController.java | 88 +- .../let/mjo/kakao/KakaoSent_SQL_Mysql.xml | 5 +- 4 files changed, 78 insertions(+), 1133 deletions(-) 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..a7baa76d 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,11 @@ 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; - 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/kakaoComm/KakaoSendUtil.java b/src/main/java/itn/let/kakao/kakaoComm/KakaoSendUtil.java index e2387ece..2eedf39d 100644 --- a/src/main/java/itn/let/kakao/kakaoComm/KakaoSendUtil.java +++ b/src/main/java/itn/let/kakao/kakaoComm/KakaoSendUtil.java @@ -300,7 +300,7 @@ public class KakaoSendUtil { //사용자 현재 보유 금액 불러오기(문자 발송 금액 차감 이전 금액) // String befCash = kakaoVO.getBefCash(); - log.info(" [{}]", kakaoVO.ftToString()); + log.info("kakaoVO.ftToString() :: [{}]", kakaoVO.ftToString()); List kakaoSendAdvcListVO = new ArrayList<>(); Calendar calendar = setupBaseDate(kakaoVO, isNotified); @@ -310,6 +310,10 @@ public class KakaoSendUtil { String templateContent = kakaoVO.getTemplateContent(); // 실패 대체 문자 String subMsgTxt = kakaoVO.getSubMsgTxt(); + log.info(" + StringUtils.isNotEmpty(subMsgTxt) :: [{}]", StringUtils.isNotEmpty(subMsgTxt)); + if(StringUtils.isNotEmpty(subMsgTxt)) { + kakaoVO.setSubMsgSendYn("Y"); + } // 시스템 기본 단가 정보 불러오기 JoinSettingVO sysJoinSetVO = mjonMsgDataService.selectJoinSettingInfo(); @@ -321,8 +325,6 @@ public class KakaoSendUtil { Boolean replaceYN = MsgSendUtils.getReplaceYN(templateContent); Boolean replaceSubYN = MsgSendUtils.getReplaceYN(subMsgTxt); - boolean hasPerformedMsgType = false; // 치환 문자가 없는 경우, 스팸 체크가 한 번만 수행되도록 제어 - /** @MSGID KEY값 */ List idList = mjonCommon.getNextCustomMsgCId(kakaoVO.getMjonFTSendVOList().size()); @@ -348,15 +350,13 @@ public class KakaoSendUtil { /** @jsonStr 필요유무 */ - boolean hasTitleOrButtons = CollectionUtils.isNotEmpty(kakaoVO.getButtonVOList()); + boolean hasButtons = CollectionUtils.isNotEmpty(kakaoVO.getButtonVOList()); String sharedJsonStr = null; List mjonFTSendVOList = kakaoVO.getMjonFTSendVOList(); - // 분할 건수 카운터 - int counter = 0; for (int i = 0; i < mjonFTSendVOList.size(); i++) { MjonFTSendVO mjonFTSendVO = mjonFTSendVOList.get(i); @@ -394,16 +394,18 @@ public class KakaoSendUtil { if(StringUtils.isNotEmpty(subMsgTxt)) { subMsgTxtTemp = subMsgTxt; - // 각 치환 구문을 확인하고 치환할 값이 없으면 오류 반환 - 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; + 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); } - subMsgTxtTemp = subMsgTxtTemp.replace(placeholder, value); } } } @@ -423,7 +425,6 @@ public class KakaoSendUtil { boolean isMms = "MMS".equals(sendType); sendVO.setEachPrice(isMms ? mmsPStr : shortPStr); - sendVO.setSubMsgTxt(subMsgTxt);// 실패 }else { kakaoFtPrice = getValidPrice(mberManageVO.getKakaoAtPrice(), sysJoinSetVO.getKakaoAtPrice()); sendVO.setEachPrice( Float.toString(kakaoFtPrice) ); @@ -431,7 +432,7 @@ public class KakaoSendUtil { // 타이틀과 버튼이 있고 - if(hasTitleOrButtons) { + if(hasButtons) { // if (StringUtils.isEmpty(sharedJsonStr)) { // 치환 데이터가 없고 아직 생성되지 않았으면 한 번만 생성 @@ -550,6 +551,7 @@ public class KakaoSendUtil { sendVO.setTemplateCode(kakaoVO.getTemplateCode()); sendVO.setUserId(kakaoVO.getUserId()); sendVO.setCallFrom(kakaoVO.getCallFrom()); + sendVO.setSubMsgSendYn(kakaoVO.getSubMsgSendYn()); return sendVO; } @@ -1576,6 +1578,9 @@ public class KakaoSendUtil { // 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())); 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..7347f228 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 @@ -182,7 +182,6 @@ public class KakaoSentController { //전체 발송 리스트 불러오기 List resultAllSentList = kakaoSentService.selectAllKakaoSentList(kakaoSentVO); - System.out.println("??"); model.addAttribute("resultAllSentList", resultAllSentList); // model.addAttribute("resultAllSentCnt", resultAllSentList.size()); @@ -890,22 +889,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 +962,7 @@ public class KakaoSentController { } //친구톡 내용 셋팅 - returnVO.setTemplateContent(tmpContent); + returnVO.setTemplateContent(kakaoATVO.getSmsTxt()); } catch (Exception e) { e.printStackTrace(); @@ -1037,42 +1035,50 @@ 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); + //kakaoTemplateInfo.setTemplateContent(smsTxt); + + model.addAttribute("kakaoTemplateInfo", kakaoTemplateInfo); + + }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/resources/egovframework/sqlmap/let/mjo/kakao/KakaoSent_SQL_Mysql.xml b/src/main/resources/egovframework/sqlmap/let/mjo/kakao/KakaoSent_SQL_Mysql.xml index 5c376ef3..a586f753 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 @@
      From eb3f3876f1b356a84a9aaa019842d4af8f458c16 Mon Sep 17 00:00:00 2001 From: "hehihoho3@gmail.com" Date: Mon, 28 Apr 2025 15:16:06 +0900 Subject: [PATCH 11/48] =?UTF-8?q?=EC=B9=9C=EA=B5=AC=ED=86=A1=20=EB=B0=9C?= =?UTF-8?q?=EC=86=A1=20>=20=EC=A3=BC=EC=86=8C=EB=A1=9D=20=EB=B6=88?= =?UTF-8?q?=EB=9F=AC=EC=98=A4=EA=B8=B0=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ft/KakaoFriendsTalkMsgDataView.jsp | 84 ++- src/main/webapp/js/kakao/at/addr.js | 72 +-- src/main/webapp/js/kakao/ft/addr.js | 536 ++++++++++++++++++ src/main/webapp/js/kakao/ft/ftPriceClclt.js | 20 +- src/main/webapp/js/kakao/ft/ftTabulator.js | 58 +- 5 files changed, 699 insertions(+), 71 deletions(-) create mode 100644 src/main/webapp/js/kakao/ft/addr.js diff --git a/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/ft/KakaoFriendsTalkMsgDataView.jsp b/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/ft/KakaoFriendsTalkMsgDataView.jsp index d6a9e43d..75a79abd 100644 --- a/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/ft/KakaoFriendsTalkMsgDataView.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/ft/KakaoFriendsTalkMsgDataView.jsp @@ -9,9 +9,9 @@ - + - + @@ -2112,62 +2112,86 @@ function updateButtons(){
      -
      - + <%-- - + --%> +
      - + <%-- - + - + - - + --%> +
      @@ -1788,15 +1805,12 @@ function updateButtons(){ -

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

      From d0a6292cc591d27e0465d8332a18b7345282574e Mon Sep 17 00:00:00 2001 From: "hehihoho3@gmail.com" Date: Thu, 5 Jun 2025 16:42:21 +0900 Subject: [PATCH 17/48] =?UTF-8?q?=EC=B9=9C=EA=B5=AC=ED=86=A1=20=EC=A7=84?= =?UTF-8?q?=ED=96=89=EC=A4=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kakaoApi/KakaoApiImageUpload.java | 122 ++++++++++++++- .../KakaoFriendsTalkTemplateController.java | 57 +++++++ .../itn/let/mail/service/StatusResponse.java | 1 + .../ft/KakaoFriendsTalkMsgDataView.jsp | 147 ++++++++++++------ src/main/webapp/publish/css/content.css | 24 +-- src/main/webapp/publish/js/content.js | 6 +- .../webapp/publish/kakao_friendtalk_send.html | 1 + 7 files changed, 296 insertions(+), 62 deletions(-) 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..1f119e31 100644 --- a/src/main/java/itn/let/kakao/kakaoComm/kakaoApi/KakaoApiImageUpload.java +++ b/src/main/java/itn/let/kakao/kakaoComm/kakaoApi/KakaoApiImageUpload.java @@ -5,6 +5,7 @@ import java.awt.image.BufferedImage; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; +import java.time.LocalDateTime; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -15,6 +16,7 @@ import javax.annotation.Resource; import javax.imageio.ImageIO; import javax.swing.ImageIcon; +import org.apache.commons.io.FilenameUtils; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; @@ -30,6 +32,7 @@ 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; @@ -38,8 +41,11 @@ 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 { @@ -219,13 +225,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 +251,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 +280,113 @@ public class KakaoApiImageUpload { } + + + /** + * @methodName : kakaoApiImageUpload_advc + * @author : 이호영 + * @date : 2025. 6. 4. + * @description : kakaoApiImageUpload 수정 + * @return : StatusResponse + * @param kakaoVO + * @param files + * @param i + * @return + * + */ + public StatusResponse kakaoApiImageUpload_advc(KakaoVO kakaoVO, Map files, int fileKeyParam) { + try { + String storePathString = propertyService.getString("Globals.fileStorePath"); + File saveFolder = new File(storePathString); + if (!saveFolder.exists()) saveFolder.mkdirs(); + + for (MultipartFile file : files.values()) { + if (file.isEmpty()) continue; + + String originalName = file.getOriginalFilename(); + if (originalName == null || originalName.isEmpty()) continue; + + 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; + if (width < 500 || ratio < 0.5 || ratio > 0.75) { + return new StatusResponse(HttpStatus.BAD_REQUEST, "일반 이미지 조건 위반: 가로 500px 이상, 비율 2:1 미만 및 3:4 초과 불가"); + } + } + + 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(); + 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); + + 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()); + } + return new StatusResponse(HttpStatus.BAD_REQUEST, "유효한 이미지 파일이 없습니다.", LocalDateTime.now()); + } + + + /** * @Method Name : kakaoApiTemplateImageUpload * @작성일 : 2023. 2. 16. @@ -528,5 +642,7 @@ public class KakaoApiImageUpload { return kakaoReturnVO; } + + } 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..869c7120 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,15 @@ 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.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 +26,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,6 +38,7 @@ 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.umt.service.EgovUserManageService; @@ -170,6 +177,56 @@ public class KakaoFriendsTalkTemplateController { return modelAndView; } + + @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 + , "오류가 발생하였습니다." + , "" + )); + } + + } // 카카오 친구톡 템플릿 등록요청 diff --git a/src/main/java/itn/let/mail/service/StatusResponse.java b/src/main/java/itn/let/mail/service/StatusResponse.java index 50649c95..91844fda 100644 --- a/src/main/java/itn/let/mail/service/StatusResponse.java +++ b/src/main/java/itn/let/mail/service/StatusResponse.java @@ -5,6 +5,7 @@ import java.time.LocalDateTime; import org.springframework.http.HttpStatus; import itn.let.mjo.pay.service.RefundVO; +import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; diff --git a/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/ft/KakaoFriendsTalkMsgDataView.jsp b/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/ft/KakaoFriendsTalkMsgDataView.jsp index 69310d90..7ec599e4 100644 --- a/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/ft/KakaoFriendsTalkMsgDataView.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/ft/KakaoFriendsTalkMsgDataView.jsp @@ -414,7 +414,7 @@ function upImgClick(){ } //이미지 선택시 링크 정보 및 url 패턴 검사 - if(link == ''){ + /* if(link == ''){ $("#imgNm").text(""); $("#imgFile").val(""); @@ -427,7 +427,7 @@ function upImgClick(){ $("#imgFile").val(""); alert("이미지 URL 주소에는 http:// 또는 https://를 포함하여 입력해야 합니다."); return false; - } + } */ //첨부파일 선택 팝업 호출해주기 $("#imgFile").click(); @@ -485,6 +485,7 @@ function getTemplateImagUrl(){ } +// var url = url = "/web/mjon/kakao/template/sendKakaoFriendsTemplateImageUploadAjax_advc.do"; var url = url = "/web/mjon/kakao/template/sendKakaoFriendsTemplateImageUploadAjax.do"; $.ajax({ @@ -500,7 +501,32 @@ function getTemplateImagUrl(){ , success : function(returnData){ console.log('returnData : ', returnData); - if(returnData.result == "success") { + + + if (returnData.status === 'OK' || returnData.status === 200) { + alert(returnData.message); + + $("#templateImageName").val(fileName); + $("#imageFileName").val(fileName); + + // imgUrl은 object에 포함된 경우만 처리 + if (returnData.object) { + $("#templateImageUrl").val(returnData.object); + $(".kakao_image").css("display", "block"); + $("#kakaoImg").attr("src", returnData.object); + } + + } else { + alert(returnData.message || "이미지 등록 중 오류가 발생하였습니다."); + + // 첨부파일 정보 초기화 + $("#imgFile").val(""); + $("#imgNm").text(""); + return false; + } + }, + + /* if(returnData.result == "success") { var code = returnData.code; var msg = returnData.msg; @@ -549,7 +575,7 @@ function getTemplateImagUrl(){ alert("이미지 등록 중 오류가 발생하였습니다.!!!"); return false; } - }, + }, */ beforeSend : function(xmlHttpRequest) { //로딩창 show $('.loading_layer').addClass('active'); @@ -1574,49 +1600,82 @@ function updateButtons(){ 이미지 첨부 -
      - checked > - checked > - checked > -
      -

      * 이미지 첨부 안내

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

        * 이미지 첨부 안내

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

        * 와이드 이미지 첨부 안내

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

        이미지 제목

        - -
      • -
      • -

        이미지 클릭시 이동할 URL

        - -
      • -
      • -

        첨부파일 이미지

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

      * 와이드 이미지 첨부 안내

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

        이미지 없음

        + +
        +
      • +
      • +

        이미지 클릭시 이동할 URL

        +
      • +
      + + + <%--
        +
      • +

        이미지 제목

        + +
      • +
      • +

        이미지 클릭시 이동할 URL

        + +
      • +
      • +

        첨부파일 이미지

        + +
      • +
      + + --%> diff --git a/src/main/webapp/publish/css/content.css b/src/main/webapp/publish/css/content.css index 7e4477d5..9fbd61ef 100644 --- a/src/main/webapp/publish/css/content.css +++ b/src/main/webapp/publish/css/content.css @@ -1649,18 +1649,18 @@ button.check_validity:hover {border: 1px solid #a3a3a3;box-shadow: 0px 0px 5px .kakao_wrap .img_add_info_wrap .info_text{font-size: 15px; color: #555;} .kakao_wrap .img_add_info_wrap .info_text li{margin: 3px 0 0 0;} .kakao_wrap .img_file_add_wrap .info_title_text{font-weight: 500;margin:0 0 5px 0;} -.kakao_wrap .img_file_add_wrap .btn_img_upload{width: 251px;} -.kakao_wrap .img_file_add_wrap .img_file_info_wrap{width: 100%; max-width: 623px; border: 1px solid #e5e5e5; border-radius: 5px;} -.kakao_wrap .img_file_add_wrap .img_file_info_wrap li{display: flex;min-height: 60px;padding: 10px 20px; border-bottom: 1px solid #e5e5e5;justify-content: space-between; align-items: center; box-sizing: border-box;} -.kakao_wrap .img_file_add_wrap .img_file_info_wrap li:last-child{border-bottom: 0;} -.kakao_wrap .img_file_add_wrap .file_name{font-size: 16px; font-weight: 500;} -.kakao_wrap .img_file_add_wrap .btn_del{width: 30px;height: 30px;border: 1px solid #002c9a;border-radius: 5px;} -.kakao_wrap .img_file_add_wrap .img_url{width: calc(100% - 190px);} -.kakao_wrap .img_file_add_wrap .info_text{margin:0 0 10px 0;} -.kakao_wrap .img_file_add_wrap .info_text li{list-style:1.4;} -.kakao_wrap .img_file_add_wrap .img_file_wrap{display:inline-flex;width:calc(100% - 200px);} -.kakao_wrap .img_file_add_wrap .img_file_wrap .file_name{width:calc(100% - 28px);} -.kakao_wrap .img_file_add_wrap .img_file_wrap .file_name.file_none{color:#666;font-weight:300;line-height:1.8;} +.kakao_wrap .img_file_info_wrap .btn_img_upload{width: 251px;} +.kakao_wrap .img_file_info_wrap{display:none;width: 100%; max-width: 623px; border: 1px solid #e5e5e5; border-radius: 5px;margin:15px 0 0 0;} +.kakao_wrap .img_file_info_wrap li{display: flex;min-height: 60px;padding: 10px 20px; border-bottom: 1px solid #e5e5e5;justify-content: space-between; align-items: center; box-sizing: border-box;} +.kakao_wrap .img_file_info_wrap li:last-child{border-bottom: 0;} +.kakao_wrap .img_file_info_wrap .file_name{font-size: 16px; font-weight: 500;} +.kakao_wrap .img_file_info_wrap .btn_del{width: 30px;height: 30px;border: 1px solid #002c9a;border-radius: 5px;} +.kakao_wrap .img_file_info_wrap .img_url{width: calc(100% - 190px);} +.kakao_wrap .img_file_info_wrap .info_text{margin:0 0 10px 0;} +.kakao_wrap .img_file_info_wrap .info_text li{list-style:1.4;} +.kakao_wrap .img_file_info_wrap .img_file_wrap{display:inline-flex;width:calc(100% - 200px);} +.kakao_wrap .img_file_info_wrap .img_file_wrap .file_name{width:calc(100% - 28px);} +.kakao_wrap .img_file_info_wrap .img_file_wrap .file_name.file_none{color:#666;font-weight:300;line-height:1.8;} .kakaotalkset_cont .kakao_wrap .template_category{width: 270px;} .kakaotalkset_cont .kakao_wrap .emphasis_select{width: 250px;} diff --git a/src/main/webapp/publish/js/content.js b/src/main/webapp/publish/js/content.js index 3bb20dad..3367a936 100644 --- a/src/main/webapp/publish/js/content.js +++ b/src/main/webapp/publish/js/content.js @@ -522,15 +522,15 @@ $(document).ready(function () { $("input[name='img_file_add']").change(function () { if ($("input[name='img_file_add']:checked").attr("id") == "img_file_1") { $(".basic_img_add_wrap").show().siblings(".wide_img_add_wrap").hide(); - //$(".img_file_add_wrap").show(); + $(".img_file_info_wrap").show(); $(".kakao_image img").show().attr("src", "/publish/images/content/kakao_img_basic.jpg"); } else if ($("input[name='img_file_add']:checked").attr("id") == "img_file_2") { $(".wide_img_add_wrap").show().siblings(".basic_img_add_wrap").hide(); $(".kakao_image img").show().attr("src", "/publish/images/content/kakao_img_wide.jpg"); - //$(".img_file_add_wrap").show(); + $(".img_file_info_wrap").show(); } else { $(".img_add_info_wrap, .img_file_add_wrap").hide(); - $(".kakao_image img").hide(); + $(".kakao_image img, .img_file_info_wrap").hide(); } }); diff --git a/src/main/webapp/publish/kakao_friendtalk_send.html b/src/main/webapp/publish/kakao_friendtalk_send.html index 020f8c32..26f467ec 100644 --- a/src/main/webapp/publish/kakao_friendtalk_send.html +++ b/src/main/webapp/publish/kakao_friendtalk_send.html @@ -101,6 +101,7 @@ +

      * 이미지 첨부 안내

        From 2d824883c8118614505ddd8b88d284f308a7be7b Mon Sep 17 00:00:00 2001 From: "hehihoho3@gmail.com" Date: Thu, 12 Jun 2025 14:54:53 +0900 Subject: [PATCH 18/48] =?UTF-8?q?=EC=B9=9C=EA=B5=AC=ED=86=A1=EA=B0=9C?= =?UTF-8?q?=EC=84=A0=EC=A4=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kakaoApi/KakaoApiImageUpload.java | 24 +- .../KakaoFriendsTalkTemplateController.java | 6 +- .../ft/KakaoFriendsTalkMsgDataView.jsp | 358 +++++++++--------- 3 files changed, 213 insertions(+), 175 deletions(-) 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 1f119e31..cdd99c85 100644 --- a/src/main/java/itn/let/kakao/kakaoComm/kakaoApi/KakaoApiImageUpload.java +++ b/src/main/java/itn/let/kakao/kakaoComm/kakaoApi/KakaoApiImageUpload.java @@ -17,6 +17,7 @@ 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; @@ -331,8 +332,11 @@ public class KakaoApiImageUpload { } } else { float ratio = width / (float) height; - if (width < 500 || ratio < 0.5 || ratio > 0.75) { - return new StatusResponse(HttpStatus.BAD_REQUEST, "일반 이미지 조건 위반: 가로 500px 이상, 비율 2:1 미만 및 3:4 초과 불가"); +// 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 이하만 허용됩니다."); } } @@ -345,7 +349,7 @@ public class KakaoApiImageUpload { String apiUrl = mjonBizUrl + "/v3/kakao/image/upload"; HttpPost httpPost = new HttpPost(apiUrl); - HttpEntity httpEntity = MultipartEntityBuilder.create() + /*HttpEntity httpEntity = MultipartEntityBuilder.create() .addTextBody("bizId", mjonBizId) .addTextBody("apiKey", mjonBizKakaoApiKey) .addTextBody("imageType", kakaoVO.getImageType()) @@ -354,7 +358,21 @@ public class KakaoApiImageUpload { .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(); 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 869c7120..b3ce3a9b 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 @@ -42,7 +42,9 @@ import itn.let.mail.service.StatusResponse; import itn.let.mjo.symbol.service.MjonSymbolService; import itn.let.mjo.symbol.service.MjonSymbolVO; import itn.let.uss.umt.service.EgovUserManageService; +import lombok.extern.slf4j.Slf4j; +@Slf4j @Controller public class KakaoFriendsTalkTemplateController { @@ -249,6 +251,7 @@ public class KakaoFriendsTalkTemplateController { ModelAndView modelAndView = new ModelAndView(); modelAndView.setViewName("jsonView"); + log.info(" + kakaoVO.getAdFlag() :: [{}]", kakaoVO.getAdFlag()); try { LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null; String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId()); @@ -268,7 +271,8 @@ public class KakaoFriendsTalkTemplateController { 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); diff --git a/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/ft/KakaoFriendsTalkMsgDataView.jsp b/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/ft/KakaoFriendsTalkMsgDataView.jsp index 7ec599e4..5507e51e 100644 --- a/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/ft/KakaoFriendsTalkMsgDataView.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/ft/KakaoFriendsTalkMsgDataView.jsp @@ -29,11 +29,12 @@ var excelAddr = []; //엑셀 불러오기에서 내용 저장하는 배열 변 var KAKAO_FT_PRICE = $('#kakaoFtPrice').val(); $(document).ready(function (){ + KAKAO_FT_PRICE = $('#kakaoFtPrice').val(); //화면 초기 로딩시 화면 처리해주기 - 템플릿 불러오기 했을 경우를 위함 initFormChk(); - //이모티콘 삽입 기능 처리 + //특수문자, 일괄변화문구 삽입 기능 처리 $(".symbolButton, .changeWord").on('click', function(){ // 커서 위치에 삽입 @@ -43,18 +44,12 @@ $(document).ready(function (){ //즉시 발송 라디오 버튼 선택시 숨김처리 - $("#reserYnN").on('click', function(){ - $('.rev_selected').hide(); - $('.send_rev .send_content').css('padding-bottom','108px'); - $('.send_btn .btnType:first-child').html('발송하기'); - $('#bizForm #reserveYn').val($(this).val()); - }); - - //예약 발송 라디오 버튼 선택시 숨김 해제처리 - $("#reserYnY").on('click', function(){ - $('.rev_selected').show(); - $('.send_rev .send_content').css('padding-bottom','0'); - $('.send_btn .btnType:first-child').html('예약하기'); + $('input[name="reserYn"]').on('change', function() { + const isReserve = $(this).val() === 'Y'; + + $('.rev_selected').toggle(isReserve); + $('.send_rev .send_content').css('padding-bottom', isReserve ? '0' : '108px'); + $('.send_btn .btnType:first-child').html(isReserve ? '예약하기' : '발송하기'); $('#bizForm #reserveYn').val($(this).val()); }); @@ -65,28 +60,13 @@ $(document).ready(function (){ setContentsLengForFriends(contents); }); - - $("#excelAdd").click(function(){ - - if(excelAddr.length > 0){ - - //첨부파일로 불러온 데이터를 받는사람 목록에 추가해 준다. - addPhoneInfo(excelAddr); - - //첨부파일 초기화 시켜주기 - $("#excelFile").val(""); - $("#excelNm").val(""); - - }else{ - - alert("추가 엑셀 데이터가 없습니다."); - return false; - + + $(".friend_talk_wrap #ad_Y").click(function () { + if ($(this).is(":checked") == true) { + + fnAgentCodeChg(); } - }); - - $("#send_fail_check").change(function(){ if($("#send_fail_check").is(":checked")){ @@ -161,34 +141,28 @@ $(document).ready(function (){ }); - - - - - - //치환문자 있는 엑섹불러오기 버튼 클릭시 파일 첨부 실행 - $('.c3').click(function(){ // 엑셀파일 불러오기 선택 시 - - $("#excelFile").click(); - - }); - $("#excelFile").on("change", function(event) { - var fileInfo = event.target.files; - if(fileInfo.length > 0){ - excelFileChange(fileInfo[0]); - } else { - fn_loadRemoveActive(); // 파일이 선택되지 않은 경우 로딩 상태 제거 - setTimeout(() => { $(this).val(''); }, 0); // 파일 선택 초기화 - } - }); - - - // 최근 전송내역 - resultLatestMsgList(); - //자주보내는 번호 - resultBookMarkMsgList(); - + $("input[name='img_file_add']").change(function () { + console.log('$(this).attr("id") :: ', $(this).attr("id")); + /* if ($("input[name='img_file_add']:checked").attr("id") == "img_file_1") { + $(".basic_img_add_wrap").show().siblings(".wide_img_add_wrap").hide(); + $(".img_file_info_wrap").show(); + $(".kakao_image img").show().attr("src", "/publish/images/content/kakao_img_basic.jpg"); + } else if ($("input[name='img_file_add']:checked").attr("id") == "img_file_2") { + $(".wide_img_add_wrap").show().siblings(".basic_img_add_wrap").hide(); + $(".kakao_image img").show().attr("src", "/publish/images/content/kakao_img_wide.jpg"); + $(".img_file_info_wrap").show(); + } else { + $(".img_add_info_wrap, .img_file_add_wrap").hide(); + $(".kakao_image img, .img_file_info_wrap").hide(); + } */ + }); + + // 최근 전송내역 + resultLatestMsgList(); + //자주보내는 번호 + resultBookMarkMsgList(); + }); @@ -294,43 +268,36 @@ function resultBookMarkMsgList(){ function initFormChk(){ - //첫로딩시 우측 미리보기 화면 숨김처리 - $('.emphasis_title_text').hide(); //강조유형 타이틀 - $('.emphasis_side_text').hide(); //강조유형 보조문구 - //$('.template_text').hide(); //내용 미리보기 - $('.side_info_text').hide(); //부가정보 내용 - $('.channel_info_text').hide(); //채널추가 텍스트 내용 - $('.btnAd').hide(); //샘플 채널추가 버튼 - //$('.btnEmpty').hide(); //샘플 버튼 - //채널ID 정보 미리보기에 표시해주기 fnAgentCodeChg(); //템플릿 등록 이미지가 있는 경우 이미지 정보 표시해 주기 - var imgType = $("input[name=img_file_add]:checked").val(); - - if(!imgType == ''){ + var imgType = $('#imageType').val(); + + $("#img_file_0").prop('checked',true); + if(imgType){ - if($("input[name='img_file_add']:checked").attr("id")=="img_file_1"){ - $(".basic_img_add_wrap").show().siblings(".img_add_info_wrap").hide(); - $(".img_file_add_wrap").show(); - }else if($("input[name='img_file_add']:checked").attr("id")=="img_file_2"){ - $(".wide_img_add_wrap").show().siblings(".img_add_info_wrap").hide(); - $(".img_file_add_wrap").show(); - } else{ + if(imgType == 'I'){ + + $('#img_file_1').click(); + + }else if(imgType == 'W'){ + $('#img_file_2').click(); + } + + // 이미지명 입력 + $('#imgTitle').removeClass('file_none') + .text($('#imageFileName').val()); + $('#imgLink').prop('disabled', true); // 회색 처리 + 입력 불가 + // 이미지 URL은 해당 input에 있음. + + /* else{ $(".img_add_info_wrap, .img_file_add_wrap").hide(); - } - - }else{ - - $("#img_file_0").prop('checked',true); + } */ } - var imageFileName = '${resultTemplateVO.imageFileName}'; - $("#imgNm").text(imageFileName); - //미리보기에 이미지 표시해주기 - var imgUrl = '${resultTemplateVO.templateImageUrl}'; + var imgUrl = $('#templateImageUrl').val(); if(imgUrl != ''){ $('.kakao_image').css("display", "block"); @@ -342,8 +309,8 @@ function initFormChk(){ setContentsLengForFriends(tmpContents); //초기 광고포함 여부 처리 - var adFlagVal = $("input[name=adFlag]:checked").val(); - advTextChange(adFlagVal); +// var adFlagVal = $("#ad_Y").is(":checked") ? "Y" : "N"; +// advTextChange(adFlagVal); var reserYn = $("input[name=reserYn]:checked").val(); if(reserYn == 'N'){ @@ -362,16 +329,38 @@ function fnAgentCodeChg(){ var yellowIdVal = $("#selectAgentCode option:checked").val(); var yellowId = $("#selectAgentCode option:checked").text(); var yellowIdAt = yellowId.replaceAll('@',''); + + // 체크 여부에 따라 채널ID 문구 설정 + if(yellowIdVal != ''){ - $('#spnYellowid').text(yellowId); //미리보기화면 채널ID - $('#spnYellowidAt').text(yellowIdAt); //미리보기화면 채널ID @제거 - $('#yellowIdCon').text(yellowIdAt); //내용 입력 부분 채널ID + $('#spnYellowid').text(yellowId); // 미리보기화면 최상단 채널ID + + var cleanYellowId = yellowId.replace(/^@/, ""); // 앞에 @ 기호 제거 + if ($("#ad_Y").is(":checked")) { + + $("#adTxt").show(); // 내용 + $("#adTxt p").html("(광고) " + cleanYellowId + ""); // 내용 + + $("#talkTitle").html("(광고) " + cleanYellowId); // 미리보기 화면 상단 + } + }else{ - $('#spnYellowid').text("채널ID"); //미리보기화면 채널ID - $('#spnYellowidAt').text("채널ID"); //미리보기화면 채널ID @제거 - $('#yellowIdCon').text("채널ID"); //내용 입력 부분 채널ID + var channelId = "채널ID"; + + $('#spnYellowid').text(channelId); // 미리보기화면 최상단 채널ID + + if ($("#ad_Y").is(":checked")) { + + $("#adTxt").show(); // 내용 + $("#adTxt p").html("(광고) " + channelId + ""); // 내용 + + $("#talkTitle").html("(광고) " + channelId); // 미리보기 화면 상단 + } else { + $("#adTxt").hide(); // 내용 + $("#talkTitle").html(channelId); // 미리보기 화면 상단 + } } } @@ -379,12 +368,12 @@ function fnAgentCodeChg(){ function upImgClick(){ var selectChennelID = $("select[name='selectAgentCode']").val(); //채널ID 정보 var imageType = $("input[name=img_file_add]:checked").val(); //이미지 종류 정보(일반, 와이드) - var title = $("#imgTitle").val(); + var title = $("#imgTitle").text(); var link = $("#imgLink").val(); if(selectChennelID == ''){ - $("#imgNm").text(""); + $("#imgTitle").text(""); $("#imgFile").val(""); alert("채널ID를 선택해 주세요."); return false; @@ -397,38 +386,43 @@ function upImgClick(){ }else{ - $("#imgNm").text(""); + $("#imgTitle").text(""); $("#imgFile").val(""); alert("이미지 종류를 선택해 주세요."); return false; } - + /* if(title == ''){ - $("#imgNm").text(""); + $("#imgTitle").text(""); $("#imgFile").val(""); alert("이미지 제목을 입력해 주세요."); return false; - } + } */ //이미지 선택시 링크 정보 및 url 패턴 검사 - /* if(link == ''){ + console.log('link: ', link); + if (!link) { - $("#imgNm").text(""); - $("#imgFile").val(""); - alert("이미지 클릭시 이동할 URL 주소를 http:// 또는 https:// 포함하여 입력해 주세요."); - return false; - - }else if(link.search("http://") == -1 && link.search("https://") == -1){ - $("#imgNm").text(""); + if(!confirm("URL먼저 등록을 안하면 이미지에 url 저장이 안됩니다.\n계속하시겠습니까?")){ + return false; + } + + + + } + /* + else if(link.search("http://") == -1 && link.search("https://") == -1){ + + $("#imgTitle").text(""); $("#imgFile").val(""); alert("이미지 URL 주소에는 http:// 또는 https://를 포함하여 입력해야 합니다."); return false; - } */ - + } + */ //첨부파일 선택 팝업 호출해주기 $("#imgFile").click(); } @@ -447,7 +441,7 @@ function imgResizeInfo(event){ return false; } - $("#imgNm").text(fileName); + $("#imgTitle").text(fileName); } //알림톡 이미지 등록 요청하기 @@ -485,8 +479,8 @@ function getTemplateImagUrl(){ } -// var url = url = "/web/mjon/kakao/template/sendKakaoFriendsTemplateImageUploadAjax_advc.do"; - var url = url = "/web/mjon/kakao/template/sendKakaoFriendsTemplateImageUploadAjax.do"; + var url = url = "/web/mjon/kakao/template/sendKakaoFriendsTemplateImageUploadAjax_advc.do"; +// var url = url = "/web/mjon/kakao/template/sendKakaoFriendsTemplateImageUploadAjax.do"; $.ajax({ type : 'POST' @@ -505,15 +499,21 @@ function getTemplateImagUrl(){ if (returnData.status === 'OK' || returnData.status === 200) { alert(returnData.message); + + $('#imgTitle').removeClass('file_none') + .text(fileName); + $('#imgLink').prop('disabled', true); // 회색 처리 + 입력 불가 + - $("#templateImageName").val(fileName); $("#imageFileName").val(fileName); + + // imgUrl은 object에 포함된 경우만 처리 if (returnData.object) { - $("#templateImageUrl").val(returnData.object); + $("#templateImageUrl").val(returnData.object.imgUrl); $(".kakao_image").css("display", "block"); - $("#kakaoImg").attr("src", returnData.object); + $("#kakaoImg").attr("src", returnData.object.imgUrl); } } else { @@ -521,7 +521,9 @@ function getTemplateImagUrl(){ // 첨부파일 정보 초기화 $("#imgFile").val(""); - $("#imgNm").text(""); + + $('#imgTitle').addClass('file_none') + .text("이미지 없음"); return false; } }, @@ -547,7 +549,7 @@ function getTemplateImagUrl(){ //첨부파일 정보를 지워준다. $("#imgFile").val(""); - $("#imgNm").text(""); + $("#imgTitle").text(""); return false; }else if(code == "405"){ @@ -556,7 +558,7 @@ function getTemplateImagUrl(){ //첨부파일 정보를 지워준다. $("#imgFile").val(""); - $("#imgNm").text(""); + $("#imgTitle").text(""); return false; }else{ @@ -565,7 +567,7 @@ function getTemplateImagUrl(){ //첨부파일 정보를 지워준다. $("#imgFile").val(""); - $("#imgNm").text(""); + $("#imgTitle").text(""); return false; } @@ -595,11 +597,16 @@ function getTemplateImagUrl(){ function fnImageDel(){ - var selectAgentCode = $("select[name='selectAgentCode']").val(); // 선택 채널ID var imageUrl = $("#templateImageUrl").val(); var bizForm = document.bizForm; - bizForm.senderKey.value = selectAgentCode; + bizForm.senderKey.value = $("select[name='selectAgentCode']").val(); // 선택 채널ID + + + $('#imgTitle').addClass('file_none') + .text("이미지 없음"); + $('#imgLink').prop('disabled', false); // 회색 처리 + 입력 불가 + if(imageUrl == ''){ @@ -643,10 +650,11 @@ function fnImageDel(){ if(code == "200"){ alert("등록된 이미지가 삭제되었습니다."); - $("#imgTitle").val(""); $("#imgLink").val(""); $("#imgFile").val(""); - $("#imgNm").text("첨부파일 이미지"); + + $('#imgTitle').addClass('file_none') + .text("이미지 없음"); $("#templateImageUrl").val(""); $('.kakao_image').css("display", "none"); $("#kakaoImg").attr("src", ""); @@ -691,16 +699,9 @@ function myTemplateSelect(ftId){ } -//광고성 정보 포함 선택에 따른 텍스트 표시 부분 처리 -$(document).on('change', '.inputAdFlag', function(){ - - var adFlagVal = $(this).val(); - advTextChange(adFlagVal); - -}); - +/* function advTextChange(adFlagVal){ - + console.log('adFlagVal : ', adFlagVal); if(typeof adFlagVal == "undefined" || adFlagVal == null || adFlagVal == ""){ $("#ad_Y").prop('checked',true); @@ -709,18 +710,16 @@ function advTextChange(adFlagVal){ $('.adFlag').hide(); $('.kakao_block_text').hide(); - $('#adFlagFront').hide(); $('.adFlagAfter').hide(); }else{ $('.adFlag').show(); $('.kakao_block_text').show(); - $('#adFlagFront').show(); $('.adFlagAfter').show(); } } - + */ //친구톡 내용 템플릿으로 저장하기 - 내용 저장하기 function myTemplateSave(){ @@ -729,9 +728,9 @@ function myTemplateSave(){ var yellowId = $("select[name='selectAgentCode'] option:selected").text().replaceAll('@',''); // 선택 채널명 var inputTemplateName = $("#inputTemplateName").val(); // 입력 템플릿 이름 var imageType = $("input[name=img_file_add]:checked").val(); // 첨부 이미지 종류(없음, 일반, 와이드 이미지) - var imageTitle = $("#imgTitle").val(); //첨부이미지 제목 + var imageTitle = $("#imgTitle").text(); //첨부이미지 제목 var imageLink = $("#imgLink").val(); //첨부이미지 클릭시 이동 링크 주소 - var inputTemplateAd = $("input[name=adFlag]:checked").val(); // 광고성메시지 선택 여부 + var inputTemplateAd = $("#ad_Y:checked").val(); // 광고성메시지 선택 여부 var inputTemplateContent = $("#inputTemplateContent").val(); // 템플릿 내용 var inputTemplateImageName = $("#templateImageName").val(); // 템플릿 이미지 파일명 @@ -758,7 +757,7 @@ function myTemplateSave(){ } - if(imageLink == ''){ + /* if(imageLink == ''){ alert("이미지 클릭시 이동할 URL을 입력해 주세요."); return false; @@ -772,7 +771,7 @@ function myTemplateSave(){ } - } + } */ if(inputTemplateImageUrl == ''){ @@ -794,7 +793,6 @@ function myTemplateSave(){ //bizForm.yellowId.value = yellowId; bizForm.templateName.value = inputTemplateName; //bizForm.imageType.value = imageType; - //bizForm.imgTitle.value = imageTitle; //bizForm.imgLink.value = imageLink; bizForm.adFlag.value = inputTemplateAd; bizForm.templateContent.value = inputTemplateContent; @@ -1033,7 +1031,7 @@ function fn_sendMsgData(){ $("#templateContent").val(tmpContents); //광고포함 여부 - var adFlag = $("input[name=adFlag]:checked").val(); + var adFlag = $("#ad_Y:checked").val(); $("#adFlag").val(adFlag); /* var adFlag = $("input[name=adFlag]:checked").val(); $("#adFlag").val(adFlag); */ @@ -1351,16 +1349,9 @@ function getFtImageType(imgChk){ if(imgChk == 'I' || imgChk == 'W'){ - var imgTitle = $("#imgTitle").val(); var imgLink = $("#imgLink").val(); var imgFileName = $("#imageFileName").val(); - if(imgTitle == ''){ - - alert("친구톡 이미지 제목정보를 입력해 주세요."); - return false; - - } if(imgLink == ''){ @@ -1470,7 +1461,7 @@ function goToKakaoTestPopUp(){ function msgResultLink(){ var reserYn = $("input[name=reserYn]:checked").val(); // 예약 발송 여부 확인 - location.href="/web/kakao/sent/selectKakaoSentView.do"; + location.href="/web/kakao/sent/selectKakaoSentView.do"; } function updateButtons(){ @@ -1508,7 +1499,8 @@ function updateButtons(){

        친구톡 전송

        - + +
        @@ -1527,7 +1519,7 @@ function updateButtons(){ - + @@ -1593,20 +1585,39 @@ function updateButtons(){
        - + + + + +
        이미지 첨부 + + + + + + + + <%-- checked > checked > checked > - + --%>

        * 이미지 첨부 안내

          @@ -1646,14 +1657,15 @@ function updateButtons(){
          -

          이미지 없음

          +

          이미지 없음

        • -

          이미지 클릭시 이동할 URL

          +

          이미지 클릭시 이동할 URL

          +
        @@ -1680,9 +1692,14 @@ function updateButtons(){ 광고포함 여부 - + <%-- checked > -<%-- checked > --%> + checked > + --%> + +<%-- checked value="Y"> --%> + + @@ -1690,14 +1707,14 @@ function updateButtons(){
        -
        -

        (광고) 채널ID

        +
        +

        (광고) 채널ID

        -
        -

        수신거부 : 홈 > 채널차단

        +
        +

        수신거부 : 홈 > 채널차단

        0 /1000

        @@ -1828,14 +1845,14 @@ function updateButtons(){ --%> - + --%>
        <%-- @@ -2162,7 +2179,7 @@ function updateButtons(){
        -
        +

        @@ -2170,9 +2187,8 @@ function updateButtons(){

        -

        - (광고) - 채널ID +

        + (광고) 채널ID

      \ No newline at end of file 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..bae4a8e8 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/pop/kakaoFtPop.jsp b/src/main/webapp/WEB-INF/jsp/web/pop/kakaoFtPop.jsp new file mode 100644 index 00000000..2dc478b0 --- /dev/null +++ b/src/main/webapp/WEB-INF/jsp/web/pop/kakaoFtPop.jsp @@ -0,0 +1,28 @@ + +<%@ 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"%> + + + +
      + +
      +
        +
      • 친구톡 텍스트형은 최대 1,000자까지 작성 가능 (이미지형 400자, 와이드 이미지형 76자)
      • +
      • 변수는 [*이름*], [*1*]~[*4*]까지 입력하실 수 있습니다.
      • +
      • 광고성 정보 포함 시, 자동으로 (광고) 표시와 080무료수신거부번호가 메시지 내용에 표시됩니다.
      • +
      • (광고) 표기 사용 여부는 선택 가능하나, (광고) 표기 해제에 따른 법규 의무사항 미준수 시, 메시지 발송이 중단될 수 있습니다.
      • +
      • 예약 메시지는 수정 가능하며, 예약 발송시간 5분전까지만 취소·삭제 가능합니다.
      • + +
      • 안심번호는 임시번호로 전송이 불가합니다.
      • +
      +
      +
      + \ No newline at end of file From 78fd333caba83c90a2382f83c93567fd9ac916bc Mon Sep 17 00:00:00 2001 From: "hehihoho3@gmail.com" Date: Thu, 26 Jun 2025 14:43:39 +0900 Subject: [PATCH 24/48] =?UTF-8?q?=EC=B9=9C=EA=B5=AC=ED=86=A1=20=EC=82=AC?= =?UTF-8?q?=EC=9A=A9=EC=95=88=EB=82=B4=20=ED=85=8D=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kakao/template/ft/KakaoFriendstalkTemplateList.jsp | 2 +- src/main/webapp/WEB-INF/jsp/web/pop/kakaoFtPop.jsp | 8 +++++--- 2 files changed, 6 insertions(+), 4 deletions(-) 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 bae4a8e8..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,7 @@ function fnGoSampleTemplate(){

      카카오톡 설정

      - +
      diff --git a/src/main/webapp/WEB-INF/jsp/web/pop/kakaoFtPop.jsp b/src/main/webapp/WEB-INF/jsp/web/pop/kakaoFtPop.jsp index 2dc478b0..b8a993da 100644 --- a/src/main/webapp/WEB-INF/jsp/web/pop/kakaoFtPop.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/pop/kakaoFtPop.jsp @@ -15,13 +15,15 @@
        -
      • 친구톡 텍스트형은 최대 1,000자까지 작성 가능 (이미지형 400자, 와이드 이미지형 76자)
      • + -
      • 안심번호는 임시번호로 전송이 불가합니다.
      • + --> +
      • 친구톡은 알림톡과 달리 별도의 템플릿 심사가 필요하지 않습니다.
      • +
      • 등록된 템플릿은 자유롭게 삭제가 가능합니다.
      • +
      • 문자온이 제공하지 않는 이모티콘, 이모지를 포함하여 템플릿을 등록할 경우, 친구톡 발송이 불가합니다.
      From 3c9c72848f83d244fe14ab0af1ea9b0b3d0dcb75 Mon Sep 17 00:00:00 2001 From: "hehihoho3@gmail.com" Date: Thu, 3 Jul 2025 16:25:39 +0900 Subject: [PATCH 25/48] =?UTF-8?q?=EC=B9=9C=EA=B5=AC=ED=86=A1=20=EC=A7=84?= =?UTF-8?q?=ED=96=89=EC=A4=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../let/kakao/kakaoComm/KakaoSendUtil.java | 30 ++- .../impl/KakaoFriendsTalkServiceImpl.java | 8 +- .../let/sym/site/service/JoinSettingVO.java | 202 ++---------------- .../sqlmap/let/msg/MjonMsgData_SQL_mysql.xml | 4 + src/main/webapp/js/kakao/ft/ftPriceClclt.js | 2 +- src/main/webapp/js/kakao/ft/ftTabulator.js | 3 + 6 files changed, 51 insertions(+), 198 deletions(-) diff --git a/src/main/java/itn/let/kakao/kakaoComm/KakaoSendUtil.java b/src/main/java/itn/let/kakao/kakaoComm/KakaoSendUtil.java index 6bf9d267..551a1e66 100644 --- a/src/main/java/itn/let/kakao/kakaoComm/KakaoSendUtil.java +++ b/src/main/java/itn/let/kakao/kakaoComm/KakaoSendUtil.java @@ -326,12 +326,11 @@ public class KakaoSendUtil { } - - - // 시스템 기본 단가 정보 불러오기 - JoinSettingVO sysJoinSetVO = mjonMsgDataService.selectJoinSettingInfo(); + // 사용자 개인 단가 정보 불러오기 MberManageVO mberManageVO = mjonMsgDataService.selectMberManageInfo(kakaoVO.getUserId()); + // 시스템 기본 단가 정보 불러오기 + JoinSettingVO sysJoinSetVO = mjonMsgDataService.selectJoinSettingInfo(); // 치환 문구가 있는지 확인 @@ -349,15 +348,31 @@ public class KakaoSendUtil { 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); + +// imageType // 친구통 금액 - Float kakaoFtPrice = mberManageVO.getKakaoFtPrice(); // 대체문자가 있을경우 사용 float shortPrice = getValidPrice(mberManageVO.getShortPrice(), sysJoinSetVO.getShortPrice()); float longPrice = getValidPrice(mberManageVO.getLongPrice(), sysJoinSetVO.getLongPrice()); - String shortPStr = Float.toString(shortPrice); String mmsPStr = Float.toString(longPrice); @@ -439,7 +454,6 @@ public class KakaoSendUtil { boolean isMms = "MMS".equals(sendType); sendVO.setEachPrice(isMms ? mmsPStr : shortPStr); }else { - kakaoFtPrice = getValidPrice(mberManageVO.getKakaoAtPrice(), sysJoinSetVO.getKakaoAtPrice()); sendVO.setEachPrice( Float.toString(kakaoFtPrice) ); } 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 index 0d28cd6e..671f38cf 100644 --- 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 @@ -70,9 +70,9 @@ public class KakaoFriendsTalkServiceImpl extends EgovAbstractServiceImpl implem 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.toString()); -// log.info(" + kakaoVO.toString() :: [{}]", kakaoVO.ftToString()); + log.info(" + kakaoVO.toString() :: [{}]", kakaoVO.ftToString()); @@ -101,7 +101,7 @@ public class KakaoFriendsTalkServiceImpl extends EgovAbstractServiceImpl implem request.getSession().invalidate(); // UNAUTHORIZED : 인증되지 않은 사용자가 접근하려고 할 때 return new StatusResponse(HttpStatus.UNAUTHORIZED, - "현재 고객님께서는 문자온 서비스 이용이 정지된 상태로 알림톡을 발송하실 수 없습니다. 이용정지 해제를 원하시면 고객센터로 연락주시기 바랍니다."); + "현재 고객님께서는 문자온 서비스 이용이 정지된 상태로 친구톡을 발송하실 수 없습니다. 이용정지 해제를 원하시면 고객센터로 연락주시기 바랍니다."); } @@ -177,7 +177,7 @@ public class KakaoFriendsTalkServiceImpl extends EgovAbstractServiceImpl implem /** @biz_kakao_price에 insert (대체문자 환불관련 테이블)*/ kakaoVO.setMsgGroupId(sendVO.getMsgGroupId()); - kakaoVO.setKakaoAtPrice(Float.parseFloat(sendVO.getEachPrice())); + kakaoVO.setKakaoFtPrice(Float.parseFloat(sendVO.getEachPrice())); kakaoVO.setSmsPrice(Float.parseFloat(sendVO.getSmsPrice())); kakaoVO.setMmsPrice(Float.parseFloat(sendVO.getMmsPrice())); diff --git a/src/main/java/itn/let/sym/site/service/JoinSettingVO.java b/src/main/java/itn/let/sym/site/service/JoinSettingVO.java index a76eca53..f64ba44f 100644 --- a/src/main/java/itn/let/sym/site/service/JoinSettingVO.java +++ b/src/main/java/itn/let/sym/site/service/JoinSettingVO.java @@ -1,5 +1,12 @@ package itn.let.sym.site.service; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; + /** * 로그인정책에 대한 VO 클래스를 정의한다. * 로그인정책정보의 목록 항목을 관리한다. @@ -18,13 +25,18 @@ package itn.let.sym.site.service; * * */ + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@Builder +@ToString public class JoinSettingVO { /** * serialVersionUID */ - @SuppressWarnings("unused") - private static final long serialVersionUID = 1L; private float shortPrice; // 단문 단가 private float longPrice; //장문 단가 @@ -37,6 +49,9 @@ public class JoinSettingVO { private float customTextPrice; // 텍스트 단순수정 private float kakaoAtPrice; // 카카오 알림톡 단가 private float kakaoFtPrice; // 카카오 친구톡 단가 + private float kakaoFtImgPrice; // 카카오 친구톡 이미지 단가 + private float kakaoFtWideImgPrice; // 카카오 친구톡 와이드 단가 + private float faxPrice; // 팩스 단가 private float refundPer; //환불 비율 @@ -51,188 +66,5 @@ public class JoinSettingVO { private String smishingNoti; //첫결제(카드제외) 스미싱의심 알림 여부 private String holiSmishingNoti; //야간 스미싱알림 여부 - public String getSmishingNoti() { - return smishingNoti; - } - - public void setSmishingNoti(String smishingNoti) { - this.smishingNoti = smishingNoti; - } - - public float getShortPrice() { - return shortPrice; - } - - public void setShortPrice(float shortPrice) { - this.shortPrice = shortPrice; - } - - public float getLongPrice() { - return longPrice; - } - - public void setLongPrice(float longPrice) { - this.longPrice = longPrice; - } - - public float getPicturePrice() { - return picturePrice; - } - - public void setPicturePrice(float picturePrice) { - this.picturePrice = picturePrice; - } - - public float getPicture2Price() { - return picture2Price; - } - - public void setPicture2Price(float picture2Price) { - this.picture2Price = picture2Price; - } - - public float getPicture3Price() { - return picture3Price; - } - - public void setPicture3Price(float picture3Price) { - this.picture3Price = picture3Price; - } - - public float getCustomSamplePrice() { - return customSamplePrice; - } - - public void setCustomSamplePrice(float customSamplePrice) { - this.customSamplePrice = customSamplePrice; - } - - public float getCustomEditPrice() { - return customEditPrice; - } - - public void setCustomEditPrice(float customEditPrice) { - this.customEditPrice = customEditPrice; - } - - public float getCustomEdit3Price() { - return customEdit3Price; - } - - public void setCustomEdit3Price(float customEdit3Price) { - this.customEdit3Price = customEdit3Price; - } - - public float getCustomTextPrice() { - return customTextPrice; - } - - public void setCustomTextPrice(float customTextPrice) { - this.customTextPrice = customTextPrice; - } - - public float getRefundPer() { - return refundPer; - } - - public void setRefundPer(float refundPer) { - this.refundPer = refundPer; - } - - public float getJoinCash() { - return joinCash; - } - - public void setJoinCash(float joinCash) { - this.joinCash = joinCash; - } - - public float getPointPer() { - return pointPer; - } - - public void setPointPer(float pointPer) { - this.pointPer = pointPer; - } - - public String getLasUpdusrId() { - return lasUpdusrId; - } - - public void setLasUpdusrId(String lasUpdusrId) { - this.lasUpdusrId = lasUpdusrId; - } - - public String getLastUpdtPnttm() { - return lastUpdtPnttm; - } - - public void setLastUpdtPnttm(String lastUpdtPnttm) { - this.lastUpdtPnttm = lastUpdtPnttm; - } - - public String getJoinCertType() { - return joinCertType; - } - - public void setJoinCertType(String joinCertType) { - this.joinCertType = joinCertType; - } - - public String getSmsNoti() { - return smsNoti; - } - - public void setSmsNoti(String smsNoti) { - this.smsNoti = smsNoti; - } - - public String getEmailNoti() { - return emailNoti; - } - - public void setEmailNoti(String emailNoti) { - this.emailNoti = emailNoti; - } - - public String getSlackNoti() { - return slackNoti; - } - - public void setSlackNoti(String slackNoti) { - this.slackNoti = slackNoti; - } - - public float getKakaoAtPrice() { - return kakaoAtPrice; - } - - public void setKakaoAtPrice(float kakaoAtPrice) { - this.kakaoAtPrice = kakaoAtPrice; - } - - public float getKakaoFtPrice() { - return kakaoFtPrice; - } - - public void setKakaoFtPrice(float kakaoFtPrice) { - this.kakaoFtPrice = kakaoFtPrice; - } - - public float getFaxPrice() { - return faxPrice; - } - - public void setFaxPrice(float faxPrice) { - this.faxPrice = faxPrice; - } - - public String getHoliSmishingNoti() { - return holiSmishingNoti; - } - - public void setHoliSmishingNoti(String holiSmishingNoti) { - this.holiSmishingNoti = holiSmishingNoti; - } } diff --git a/src/main/resources/egovframework/sqlmap/let/msg/MjonMsgData_SQL_mysql.xml b/src/main/resources/egovframework/sqlmap/let/msg/MjonMsgData_SQL_mysql.xml index e924647a..dabc5761 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 diff --git a/src/main/webapp/js/kakao/ft/ftPriceClclt.js b/src/main/webapp/js/kakao/ft/ftPriceClclt.js index 889e12d0..c15d7130 100644 --- a/src/main/webapp/js/kakao/ft/ftPriceClclt.js +++ b/src/main/webapp/js/kakao/ft/ftPriceClclt.js @@ -200,7 +200,7 @@ function fn_sendFailUnChecked(phoneSu){ // fn_writePriceText() 첫 파라미터가 null이면 카카오 전송으로 인식 fn_writePriceText('', phoneSu); // $('#totalPriceTxt').text((KAKAO_AT_PRICE * phoneSu).toFixed(1)); - fn_priceText('알림톡', phoneSu); + fn_priceText('친구톡', phoneSu); } /** diff --git a/src/main/webapp/js/kakao/ft/ftTabulator.js b/src/main/webapp/js/kakao/ft/ftTabulator.js index 7e35e719..0552351a 100644 --- a/src/main/webapp/js/kakao/ft/ftTabulator.js +++ b/src/main/webapp/js/kakao/ft/ftTabulator.js @@ -241,6 +241,9 @@ $(document).ready(function (){ addPhoneInfo(tabledata); $('#callTo').val(""); + + + fn_priceText('친구톡', tableL.getDataCount()); } From cf249034a604484640c44e95c29e552dbf3b08d5 Mon Sep 17 00:00:00 2001 From: "hehihoho3@gmail.com" Date: Thu, 3 Jul 2025 18:06:38 +0900 Subject: [PATCH 26/48] =?UTF-8?q?=ED=99=98=EB=B6=88=20=EA=B8=88=EC=95=A1?= =?UTF-8?q?=20=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../user/kakaoAt/service/impl/KakaoAlimTalkServiceImpl.java | 2 +- .../user/kakaoFt/service/impl/KakaoFriendsTalkServiceImpl.java | 2 +- .../itn/let/schdlr/service/impl/SchdlrManageServiceImpl.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) 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 3a9cfab2..94198336 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 @@ -848,7 +848,7 @@ public class KakaoAlimTalkServiceImpl extends EgovAbstractServiceImpl implements System.out.println("대체문자 전송 : " + info.getBizUmid()); if (info.getBizUmid() != null) {//대체문자 발송 완료인 경우 - kakaoAlimTalkDAO.updateKakaoAtSubMsgSend(vo); + kakaoAlimTalkDAO.updateKakaoFtSubMsgSend(vo); }else { kakaoAlimTalkDAO.updateKakaoFtNotSend(vo); } 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 index 671f38cf..35c66554 100644 --- 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 @@ -177,7 +177,7 @@ public class KakaoFriendsTalkServiceImpl extends EgovAbstractServiceImpl implem /** @biz_kakao_price에 insert (대체문자 환불관련 테이블)*/ kakaoVO.setMsgGroupId(sendVO.getMsgGroupId()); - kakaoVO.setKakaoFtPrice(Float.parseFloat(sendVO.getEachPrice())); + kakaoVO.setKakaoAtPrice(Float.parseFloat(sendVO.getEachPrice())); kakaoVO.setSmsPrice(Float.parseFloat(sendVO.getSmsPrice())); kakaoVO.setMmsPrice(Float.parseFloat(sendVO.getMmsPrice())); 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(); } From 667df023dbda6dd345377ebbc24e83f74b28cf27 Mon Sep 17 00:00:00 2001 From: "hehihoho3@gmail.com" Date: Fri, 4 Jul 2025 14:25:27 +0900 Subject: [PATCH 27/48] =?UTF-8?q?=EC=B9=9C=EA=B5=AC=ED=86=A1=20=EB=B0=9C?= =?UTF-8?q?=EC=86=A1=EA=B8=88=EC=95=A1=20=EC=B2=98=EB=A6=AC=20=EC=99=84?= =?UTF-8?q?=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../let/kakao/kakaoComm/KakaoSendUtil.java | 4 + .../web/KakaoFriendsTalkSendController.java | 185 +++++++++--------- .../ft/KakaoFriendsTalkMsgDataView.jsp | 13 +- src/main/webapp/js/kakao/ft/ftPriceClclt.js | 13 +- 4 files changed, 117 insertions(+), 98 deletions(-) diff --git a/src/main/java/itn/let/kakao/kakaoComm/KakaoSendUtil.java b/src/main/java/itn/let/kakao/kakaoComm/KakaoSendUtil.java index 551a1e66..801ecfdb 100644 --- a/src/main/java/itn/let/kakao/kakaoComm/KakaoSendUtil.java +++ b/src/main/java/itn/let/kakao/kakaoComm/KakaoSendUtil.java @@ -975,6 +975,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 인경우 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 fddd7e39..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 @@ -120,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일 이전 날짜로 시작 + // 특수문자 리스트 불러오기 + 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); + + // 사용자 정의 단가 정보 불러오기(시스템 단가 혹은 협의 단가) + 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"; diff --git a/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/ft/KakaoFriendsTalkMsgDataView.jsp b/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/ft/KakaoFriendsTalkMsgDataView.jsp index f2af9aff..1062d3d8 100644 --- a/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/ft/KakaoFriendsTalkMsgDataView.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/ft/KakaoFriendsTalkMsgDataView.jsp @@ -27,10 +27,14 @@ var _fileForm2 = new Array(); var fileExt = ""; // 첨부파일 확장자 var excelAddr = []; //엑셀 불러오기에서 내용 저장하는 배열 변수 -var KAKAO_FT_PRICE = $('#kakaoFtPrice').val(); +var KAKAO_FT_PRICE; +var KAKAO_FT_IMG_PRICE; +var KAKAO_FT_WIDE_IMG_PRICE; $(document).ready(function (){ KAKAO_FT_PRICE = $('#kakaoFtPrice').val(); + KAKAO_FT_IMG_PRICE = $('#kakaoFtImgPrice').val(); + KAKAO_FT_WIDE_IMG_PRICE = $('#kakaoFtWideImgPrice').val(); //화면 초기 로딩시 화면 처리해주기 - 템플릿 불러오기 했을 경우를 위함 initFormChk(); @@ -170,6 +174,10 @@ $(document).ready(function (){ $("input[name='img_file_add']").change(function () { imageInit(); + + + //결제 금액 구하기 + totalFtPriceSum(tableL.getRows().length); }); // 최근 전송내역 @@ -1594,6 +1602,8 @@ function updateButtons(){ + + @@ -1636,7 +1646,6 @@ function updateButtons(){ - diff --git a/src/main/webapp/js/kakao/ft/ftPriceClclt.js b/src/main/webapp/js/kakao/ft/ftPriceClclt.js index c15d7130..600c514a 100644 --- a/src/main/webapp/js/kakao/ft/ftPriceClclt.js +++ b/src/main/webapp/js/kakao/ft/ftPriceClclt.js @@ -36,7 +36,18 @@ $('document').ready(function(){ function totalFtPriceSum(totRows){ var collNumCnt = parseInt(totRows); //받는사람 건수 - var price = $("#kakaoFtPrice").val(); //개별 건수 금액 + var price; + + + if ($("input[name='img_file_add']:checked").attr("id") == "img_file_1") { + price = KAKAO_FT_IMG_PRICE; + } else if ($("input[name='img_file_add']:checked").attr("id") == "img_file_2") { + price = KAKAO_FT_WIDE_IMG_PRICE; + } else { + price = KAKAO_FT_PRICE; //개별 건수 금액 + } + + var totalPrice = 0; //전체 금액 var totalStr = "0"; //전체 합계 금액 var userMoney = $('#hdUserMoney').text(); //헤더 영역 보유 금액 불러오기 From d19eddc0e40140dd03d75fdf88d2c4e08fad9d2c Mon Sep 17 00:00:00 2001 From: "hehihoho3@gmail.com" Date: Fri, 4 Jul 2025 14:49:27 +0900 Subject: [PATCH 28/48] =?UTF-8?q?=ED=98=B8=EB=82=98=EB=B6=88=20equals=20?= =?UTF-8?q?=EC=98=A4=EB=A5=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kakaoAt/service/impl/KakaoAlimTalkServiceImpl.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) 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 94198336..d62d1c7a 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 @@ -836,18 +836,19 @@ public class KakaoAlimTalkServiceImpl extends EgovAbstractServiceImpl implements for(KakaoVO vo : kakaoFtSentRefundList) { System.out.println(vo.getMsgGroupId() +"________결과 : " +vo.getRsltCode() +" 대체문자 전송 : "+vo.getSubMsgSendYn()); - if(vo.getRsltCode().equals("7000")) {//친구톡 발송 성공시 + if("7000".equals(vo.getRsltCode())) {//친구톡 발송 성공시 kakaoAlimTalkDAO.updateKakaoFtSend(vo); - }else if(vo.getSubMsgSendYn().equals("Y")) {//친구톡 발송 실패 했을 경우 + }else if("Y".equals(vo.getSubMsgSendYn())) {//친구톡 발송 실패 했을 경우 //대체문자 발송 UMID 번호 조회 - 알림톡 쿼리 동일하게 사용 KakaoVO info = kakaoAlimTalkDAO.selectKakaoAtUmid(vo); System.out.println("대체문자 전송 : " + info.getBizUmid()); - if (info.getBizUmid() != null) {//대체문자 발송 완료인 경우 +// if (info.getBizUmid() != null) {//대체문자 발송 완료인 경우 + if (StringUtils.isNotEmpty(info.getBizUmid())) {//대체문자 발송 완료인 경우 kakaoAlimTalkDAO.updateKakaoFtSubMsgSend(vo); }else { kakaoAlimTalkDAO.updateKakaoFtNotSend(vo); From c7731c44d4525ca5e87a2610441acb3257da5aaf Mon Sep 17 00:00:00 2001 From: "hehihoho3@gmail.com" Date: Fri, 11 Jul 2025 18:29:03 +0900 Subject: [PATCH 29/48] =?UTF-8?q?=EC=B9=9C=EA=B5=AC=ED=86=A1=20=EB=8C=80?= =?UTF-8?q?=EC=B2=B4=EB=AC=B8=EC=9E=90=20=ED=8F=AC=ED=86=A0=EB=AC=B8?= =?UTF-8?q?=EC=9E=90=EB=A1=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + .../ft/KakaoFriendsTalkMsgDataView.jsp | 24 ++++++++++++++++++- .../msgdata/include/ftDataIncludeExcel.jsp | 4 +++- src/main/webapp/js/kakao/ft/addr.js | 4 +++- 4 files changed, 30 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index 3d148367..5512880c 100644 --- a/.gitignore +++ b/.gitignore @@ -201,3 +201,4 @@ fabric.properties rebel.xml /mvnw /mvnw.cmd +/.gemini.zip diff --git a/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/ft/KakaoFriendsTalkMsgDataView.jsp b/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/ft/KakaoFriendsTalkMsgDataView.jsp index 1062d3d8..61e44523 100644 --- a/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/ft/KakaoFriendsTalkMsgDataView.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/ft/KakaoFriendsTalkMsgDataView.jsp @@ -176,6 +176,15 @@ $(document).ready(function (){ imageInit(); + // 첨부가 없으면 + if ($('#sendFailImgSrc').attr('src') != null) { + $('#sendFailImg').hide(); + $('#sendFailImgSrc').attr('src', ''); + } + + + + //결제 금액 구하기 totalFtPriceSum(tableL.getRows().length); }); @@ -589,6 +598,10 @@ function getTemplateImagUrl(){ $("#templateImageUrl").val(returnData.object.imgUrl); $(".kakao_image").css("display", "block"); $("#kakaoImg").attr("src", returnData.object.imgUrl); + + // 대체문자 + $('#sendFailImg').show(); + $('#sendFailImgSrc').attr('src', returnData.object.imgUrl); } } else { @@ -2244,7 +2257,16 @@ function updateButtons(){
      -
        +
          + + +

        (광고)

        diff --git a/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/include/ftDataIncludeExcel.jsp b/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/include/ftDataIncludeExcel.jsp index 2a1ea27e..987a23bd 100644 --- a/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/include/ftDataIncludeExcel.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/include/ftDataIncludeExcel.jsp @@ -283,7 +283,9 @@ $(document).ready(function(){ // 6. 수량/가격 계산 setAllCntData(result); - fn_priceClclt(result.uniqueCount); + // fn_priceClclt(result.uniqueCount); + //결제 금액 구하기 + totalFtPriceSum(tableL.getRows().length); $('#closeBtn').click(); diff --git a/src/main/webapp/js/kakao/ft/addr.js b/src/main/webapp/js/kakao/ft/addr.js index f02cc8f5..2962a0e8 100644 --- a/src/main/webapp/js/kakao/ft/addr.js +++ b/src/main/webapp/js/kakao/ft/addr.js @@ -203,7 +203,9 @@ function addrToList_advc(type){ $(".closeAddr").trigger("click"); //주소록 레이어 팝업의 Tabulator 데이터 지워주기 tableAddr.clearData(); - fn_priceClclt(result.uniqueCount); + //결제 금액 구하기 + totalFtPriceSum(tableL.getRows().length); + // fn_priceClclt(result.uniqueCount); } function loadAddrList(){ From 1f0c38b791ef287a2897937b64294d9e52e6997c Mon Sep 17 00:00:00 2001 From: "hehihoho3@gmail.com" Date: Wed, 16 Jul 2025 11:33:05 +0900 Subject: [PATCH 30/48] =?UTF-8?q?=EC=B9=9C=EA=B5=AC=ED=86=A1=20=ED=99=98?= =?UTF-8?q?=EB=B6=88=EB=A1=9C=EC=A7=81=20=EC=A7=84=ED=96=89=EC=A4=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../let/kakao/kakaoComm/KakaoSendAdvcVO.java | 4 + .../let/kakao/kakaoComm/KakaoSendUtil.java | 69 +++-- .../java/itn/let/kakao/kakaoComm/KakaoVO.java | 3 + .../kakaoApi/KakaoApiImageUpload.java | 247 +++++++++++------- .../impl/KakaoFriendsTalkServiceImpl.java | 3 +- .../itn/let/mjo/msg/service/MjonMsgVO.java | 1 + .../let/mjo/kakao/Kakao_AT_SQL_Mysql.xml | 16 +- .../ft/KakaoFriendsTalkMsgDataView.jsp | 8 + src/main/webapp/js/kakao/ft/ftPriceClclt.js | 100 +++---- 9 files changed, 271 insertions(+), 180 deletions(-) diff --git a/src/main/java/itn/let/kakao/kakaoComm/KakaoSendAdvcVO.java b/src/main/java/itn/let/kakao/kakaoComm/KakaoSendAdvcVO.java index 20366d92..6b2d21c9 100644 --- a/src/main/java/itn/let/kakao/kakaoComm/KakaoSendAdvcVO.java +++ b/src/main/java/itn/let/kakao/kakaoComm/KakaoSendAdvcVO.java @@ -59,6 +59,7 @@ public class KakaoSendAdvcVO implements Serializable { private String eachPrice; // sms 단가 private String smsPrice; // sms 단가 private String mmsPrice; // mms 단가 + private String picturePrice; // mms 단가 private String totPrice; // mms 단가 private String befCash; // mms 단가 private String befPoint; // mms 단가 @@ -68,6 +69,8 @@ public class KakaoSendAdvcVO implements Serializable { private String atDelayYn; // 카카오 알림톡 단가 private String bizKakaoResendOrgnlTxt; // 카카오 알림톡 단가 private String bizKakaoResendType; // 카카오 알림톡 단가 + private String filePath1; // 대체문자 이미지 + private String fileCnt; // 파일 카운트 @@ -109,6 +112,7 @@ public class KakaoSendAdvcVO implements Serializable { "\n , atDelayYn=[" + atDelayYn + "]" + "\n , bizKakaoResendOrgnlTxt=[" + bizKakaoResendOrgnlTxt + "]" + "\n , bizKakaoResendType=[" + bizKakaoResendType + "]" + + "\n , filePath1=[" + filePath1 + "]" + "\n ]"; } diff --git a/src/main/java/itn/let/kakao/kakaoComm/KakaoSendUtil.java b/src/main/java/itn/let/kakao/kakaoComm/KakaoSendUtil.java index 801ecfdb..aca6d2dd 100644 --- a/src/main/java/itn/let/kakao/kakaoComm/KakaoSendUtil.java +++ b/src/main/java/itn/let/kakao/kakaoComm/KakaoSendUtil.java @@ -34,6 +34,7 @@ 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; @@ -53,6 +54,9 @@ public class KakaoSendUtil { @Resource(name = "MjonMsgDataService") private MjonMsgDataService mjonMsgDataService; + + @Resource(name = "mjonMsgDAO") + private MjonMsgDAO mjonMsgDAO; @Autowired KakaoApiTemplate kakaoApiTemplate; @@ -367,15 +371,25 @@ public class KakaoSendUtil { Float kakaoFtPrice = getValidPrice(kakaoMemberFtPrice, kakaoSysJoinFtPrice); -// imageType - // 친구통 금액 - // 대체문자가 있을경우 사용 float shortPrice = getValidPrice(mberManageVO.getShortPrice(), sysJoinSetVO.getShortPrice()); float longPrice = getValidPrice(mberManageVO.getLongPrice(), sysJoinSetVO.getLongPrice()); - String shortPStr = Float.toString(shortPrice); - String mmsPStr = Float.toString(longPrice); + 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()); @@ -390,8 +404,9 @@ public class KakaoSendUtil { KakaoSendAdvcVO sendVO = createFTSendVO(kakaoVO, calendar); // 공통 가격 설정 - sendVO.setSmsPrice(shortPStr); - sendVO.setMmsPrice(mmsPStr); + sendVO.setSmsPrice(Float.toString(shortPrice)); + sendVO.setMmsPrice(Float.toString(longPrice)); + sendVO.setPicturePrice(Float.toString(picturePrice)); sendVO.setCallTo(mjonFTSendVO.getPhone()); sendVO.setMsgId(idList.get(i)); @@ -443,17 +458,39 @@ public class KakaoSendUtil { //대체문자가 있으면 // Step 1-4: 실패 대체 문자 치환데이터 설정 if(StringUtils.isNotEmpty(subMsgTxtTemp)) { // 대체문자가 있나? - int smsTxtByte = mjonCommon.getSmsTxtBytes(subMsgTxtTemp); - String sendType = getMsgType(smsTxtByte); - sendVO.setSubMsgType(sendType); + + 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)) { - statusResponseSet(statusResponse, HttpStatus.BAD_REQUEST, "전송 문자 길이를 초과하였습니다.");return kakaoSendAdvcListVO; + // INVALID 타입이면 길이 초과 에러 응답 후 리턴 + statusResponseSet(statusResponse, HttpStatus.BAD_REQUEST, "전송 문자 길이를 초과하였습니다."); + return kakaoSendAdvcListVO; } - - boolean isMms = "MMS".equals(sendType); - sendVO.setEachPrice(isMms ? mmsPStr : shortPStr); + + 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) ); } @@ -990,7 +1027,9 @@ public class KakaoSendUtil { // 사용자 개인 단가가 없으면 시스템 단가로 if(mberManageVO.getLongPrice() == 0.0f) mberManageVO.setLongPrice(sysJoinSetVO.getLongPrice()); - + + if(mberManageVO.getPicturePrice() == 0.0f) + mberManageVO.setPicturePrice(sysJoinSetVO.getPicturePrice()); return mberManageVO; } diff --git a/src/main/java/itn/let/kakao/kakaoComm/KakaoVO.java b/src/main/java/itn/let/kakao/kakaoComm/KakaoVO.java index db393fb5..f6802249 100644 --- a/src/main/java/itn/let/kakao/kakaoComm/KakaoVO.java +++ b/src/main/java/itn/let/kakao/kakaoComm/KakaoVO.java @@ -260,6 +260,9 @@ public class KakaoVO extends MjonMsgVO{ private String msgResendAllGroupId; private String msgResendAllTmpKey; private String msgResendAllYellowId; + + private String bizKakaoResendType; + private String fileCnt; private List> varListMap; 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 f97d495d..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,8 +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; @@ -38,6 +40,7 @@ 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; @@ -64,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 @@ -293,118 +306,162 @@ public class KakaoApiImageUpload { * @param files * @param i * @return + * @throws Exception * */ - public StatusResponse kakaoApiImageUpload_advc(KakaoVO kakaoVO, Map files, int fileKeyParam) { - try { + 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()) { - if (file.isEmpty()) continue; +// 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()) continue; + 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, "지원하지 않는 이미지 형식입니다."); + } - 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 사이즈만 허용됩니다."); } - - 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; + } 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 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); - - 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()); + if (width < 500 || ratio < 0.75 || ratio > 2.0) { + return new StatusResponse(HttpStatus.BAD_REQUEST, "일반 이미지는 가로 500px 이상, 비율 2:1 이상 또는 3:4 이하만 허용됩니다."); } } - } catch (Exception e) { - log.error("kakaoApiImageUpload_advc API Error", e); - return new StatusResponse(HttpStatus.BAD_REQUEST, "친구톡 이미지 등록에 실패했습니다.", LocalDateTime.now()); - } - return new StatusResponse(HttpStatus.BAD_REQUEST, "유효한 이미지 파일이 없습니다.", LocalDateTime.now()); + + 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. 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 index 35c66554..fd2deb14 100644 --- 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 @@ -177,9 +177,10 @@ public class KakaoFriendsTalkServiceImpl extends EgovAbstractServiceImpl implem /** @biz_kakao_price에 insert (대체문자 환불관련 테이블)*/ kakaoVO.setMsgGroupId(sendVO.getMsgGroupId()); - kakaoVO.setKakaoAtPrice(Float.parseFloat(sendVO.getEachPrice())); + kakaoVO.setKakaoFtPrice(Float.parseFloat(sendVO.getEachPrice())); kakaoVO.setSmsPrice(Float.parseFloat(sendVO.getSmsPrice())); kakaoVO.setMmsPrice(Float.parseFloat(sendVO.getMmsPrice())); + kakaoVO.setPicturePrice(Float.parseFloat(sendVO.getPicturePrice())); kakaoAlimTalkDAO.insertKakaoSendPrice(kakaoVO); diff --git a/src/main/java/itn/let/mjo/msg/service/MjonMsgVO.java b/src/main/java/itn/let/mjo/msg/service/MjonMsgVO.java index 0e93135a..27c621bd 100644 --- a/src/main/java/itn/let/mjo/msg/service/MjonMsgVO.java +++ b/src/main/java/itn/let/mjo/msg/service/MjonMsgVO.java @@ -165,6 +165,7 @@ public class MjonMsgVO extends ComDefaultVO{ private float smsPrice; // sms 단가 private float mmsPrice; // mms 단가 + private float picturePrice; // mms 단가 private float kakaoAtPrice; // 카카오 알림톡 단가 private float kakaoFtPrice; // 카카오 친구톡 단가 private float kakaoFtImgPrice;// 카카오 이미지 단가 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 e6b4efcd..7d4ce04c 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 @@ -73,12 +73,15 @@ , 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 ( @@ -97,12 +100,15 @@ , #[].templateContent# , #[].templateTitle# , #[].adFlag# + , #[].filePath1# , #[].subMsgSendYn# , #[].subMsgTxt# , #[].subMsgType# , #[].bizJsonName# , #[].reqDate# + + , #[].fileCnt# ) @@ -178,20 +184,18 @@ MSG_GROUP_ID , BIZ_KAKAO_AT_PRICE , BIZ_KAKAO_FT_PRICE - , BIZ_KAKAO_FT_IMG_PRICE - , BIZ_KAKAO_FT_WIDE_IMG_PRICE , BIZ_SMS_PRICE , BIZ_MMS_PRICE + , BIZ_PICTURE_PRICE ) VALUES ( #msgGroupId# ,#kakaoAtPrice# ,#kakaoFtPrice# - ,#kakaoFtImgPrice# - ,#kakaoFtWideImgPrice# ,#smsPrice# ,#mmsPrice# + ,#picturePrice# ) @@ -235,6 +239,8 @@ , 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_KAKAO_RESEND_TYPE AS bizKakaoResendType FROM MJ_MSG_DATA MMD @@ -275,7 +281,7 @@ - {call kakaoFt_Send(#userId#, #msgGroupId#, #userData#)} + {call kakaoFt_Send(#userId#, #msgGroupId#, #userData#, #fileCnt#, #bizKakaoResendType#)} diff --git a/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/ft/KakaoFriendsTalkMsgDataView.jsp b/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/ft/KakaoFriendsTalkMsgDataView.jsp index 61e44523..d0e72712 100644 --- a/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/ft/KakaoFriendsTalkMsgDataView.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/ft/KakaoFriendsTalkMsgDataView.jsp @@ -180,6 +180,7 @@ $(document).ready(function (){ if ($('#sendFailImgSrc').attr('src') != null) { $('#sendFailImg').hide(); $('#sendFailImgSrc').attr('src', ''); + $('#atchFileId').val(''); } @@ -599,6 +600,9 @@ function getTemplateImagUrl(){ $(".kakao_image").css("display", "block"); $("#kakaoImg").attr("src", returnData.object.imgUrl); + + // 대체문자 이미지 + $("#atchFileId").val(returnData.object.atchFileId); // 대체문자 $('#sendFailImg').show(); $('#sendFailImgSrc').attr('src', returnData.object.imgUrl); @@ -1619,6 +1623,7 @@ function updateButtons(){ +
        @@ -1631,6 +1636,9 @@ function updateButtons(){ + + + diff --git a/src/main/webapp/js/kakao/ft/ftPriceClclt.js b/src/main/webapp/js/kakao/ft/ftPriceClclt.js index 600c514a..4eb395f0 100644 --- a/src/main/webapp/js/kakao/ft/ftPriceClclt.js +++ b/src/main/webapp/js/kakao/ft/ftPriceClclt.js @@ -33,80 +33,52 @@ $('document').ready(function(){ * 대체 문자 X * 카카오 금액 * 수신자 수 계산 */ -function totalFtPriceSum(totRows){ - - var collNumCnt = parseInt(totRows); //받는사람 건수 - var price; - +function totalFtPriceSum(totRows) { + // 수신자 수 계산 + var count = parseInt(totRows); - if ($("input[name='img_file_add']:checked").attr("id") == "img_file_1") { - price = KAKAO_FT_IMG_PRICE; - } else if ($("input[name='img_file_add']:checked").attr("id") == "img_file_2") { - price = KAKAO_FT_WIDE_IMG_PRICE; - } else { - price = KAKAO_FT_PRICE; //개별 건수 금액 - } - - - var totalPrice = 0; //전체 금액 - var totalStr = "0"; //전체 합계 금액 - var userMoney = $('#hdUserMoney').text(); //헤더 영역 보유 금액 불러오기 - - if(!userMoney > 0){ - - userMoney = 0; - - } - //헤더 영역 보유 금액 콤마 문자 제거 - if(userMoney != ''){ - - userMoney = userMoney.replaceAll("," , ""); - - } - - //대체문자가 있는 경우 대체문자의 단/장문에 따른 금액 계산 - var subMsgSts = $("#send_fail_check").is(":checked"); - - if(subMsgSts){ - - var conLeng = conByteLeng($('#smsTxtArea').val()); // 내용 문자 입력 바이트 수 계산하기 - if(conLeng > 90){ - price = $("#longPrice").val(); - }else{ - price = $("#shortPrice").val(); + // 기본 단가는 일반 친구톡 이미지 없는 가격 + var price = KAKAO_FT_PRICE; + + // 선택된 이미지 유형에 따라 단가 변경 + var imgTypeId = $("input[name='img_file_add']:checked").attr("id"); + if (imgTypeId === "img_file_1") price = KAKAO_FT_IMG_PRICE; + else if (imgTypeId === "img_file_2") price = KAKAO_FT_WIDE_IMG_PRICE; + + // 대체문자 발송 옵션이 체크된 경우, 메시지 종류별로 단가 재계산 + if ($("#send_fail_check").is(":checked")) { + if (imgTypeId === "img_file_0") { + // 장문/단문 여부에 따라 가격 비교 후 더 큰 값으로 설정 + var len = conByteLeng($('#smsTxtArea').val()); + var long = parseFloat($("#longPrice").val()); + var short = parseFloat($("#shortPrice").val()); + price = Math.max(price, len > 90 ? long : short); + } else { + // 이미지 대체문자의 경우 별도 이미지 가격과 비교 + var picture = parseFloat($('#picturePrice').val()); + price = Math.max(price, picture); } - } - - totalPrice = price * collNumCnt; - - // 소수점 첫째자리 까지 표시 - totalPrice = totalPrice.toFixed(1); - - if(totalPrice > 0){ - - //totalStr = totalPrice.toFixed(2); - totalStr = totalPrice; - - } - - //개별 문자 단가 파라미터에 입력 + + // 총 금액 계산 (단가 * 수신자 수) + var totalPrice = (price * count).toFixed(1); + var totalStr = totalPrice > 0 ? totalPrice : "0"; + + // 사용자 보유 금액 텍스트에서 콤마 제거 (표시 용도일 뿐 실제 계산엔 안 씀) + var userMoney = $('#hdUserMoney').text().replaceAll(",", "") || 0; + + // 개별 단가, 총 금액을 input/화면에 반영 $('#eachPrice').val(numberWithCommas(price)); - - //결제금액 합계 파라이터에 입력 $('#totPrice').val(numberWithCommas(totalStr)); - - //결제금액 합계 화면에 표시 $('#totalPriceTxt').text(numberWithCommas(totalStr)); - - $('#repPriceTxt').hide(); - - return totalStr; - + $('#repPriceTxt').hide(); // 기존 합계 표시 숨김 + + return totalStr; // 계산된 총 금액 반환 } + /* * ====================================================================================================================== * From ffd779dd668bcf141b86bdd89ac93682b23e7b4d Mon Sep 17 00:00:00 2001 From: "hehihoho3@gmail.com" Date: Wed, 16 Jul 2025 14:23:28 +0900 Subject: [PATCH 31/48] =?UTF-8?q?=EC=B9=9C=EA=B5=AC=ED=86=A1=20=ED=99=98?= =?UTF-8?q?=EB=B6=88=EB=A1=9C=EC=A7=81=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../let/kakao/kakaoComm/KakaoSendAdvcVO.java | 2 + .../let/kakao/kakaoComm/KakaoSendUtil.java | 3 +- .../impl/KakaoFriendsTalkServiceImpl.java | 9 +---- .../itn/let/mjo/msg/service/MjonMsgVO.java | 2 + .../itn/let/module/base/PriceAndPoint.java | 38 +++++++++++++++++++ .../let/mjo/kakao/Kakao_AT_SQL_Mysql.xml | 12 ++++-- 6 files changed, 54 insertions(+), 12 deletions(-) diff --git a/src/main/java/itn/let/kakao/kakaoComm/KakaoSendAdvcVO.java b/src/main/java/itn/let/kakao/kakaoComm/KakaoSendAdvcVO.java index 6b2d21c9..791fb0b9 100644 --- a/src/main/java/itn/let/kakao/kakaoComm/KakaoSendAdvcVO.java +++ b/src/main/java/itn/let/kakao/kakaoComm/KakaoSendAdvcVO.java @@ -71,6 +71,7 @@ public class KakaoSendAdvcVO implements Serializable { private String bizKakaoResendType; // 카카오 알림톡 단가 private String filePath1; // 대체문자 이미지 private String fileCnt; // 파일 카운트 + private String bizKakaoImageType; // 파일 카운트 @@ -113,6 +114,7 @@ public class KakaoSendAdvcVO implements Serializable { "\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 aca6d2dd..1ba2fb3a 100644 --- a/src/main/java/itn/let/kakao/kakaoComm/KakaoSendUtil.java +++ b/src/main/java/itn/let/kakao/kakaoComm/KakaoSendUtil.java @@ -698,7 +698,7 @@ public class KakaoSendUtil { } - public Float getValidPrice(Float personalPrice, Float defaultPrice) { + public static Float getValidPrice(Float personalPrice, Float defaultPrice) { return (personalPrice != null && personalPrice > 0) ? personalPrice : defaultPrice; } @@ -1691,6 +1691,7 @@ public class KakaoSendUtil { 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/user/kakaoFt/service/impl/KakaoFriendsTalkServiceImpl.java b/src/main/java/itn/let/kakao/user/kakaoFt/service/impl/KakaoFriendsTalkServiceImpl.java index fd2deb14..77378891 100644 --- 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 @@ -175,14 +175,9 @@ public class KakaoFriendsTalkServiceImpl extends EgovAbstractServiceImpl implem kakaoSendUtil.insertKakaoGroupDataTb_advc(instCnt, kakaoVO, sendVO); -/** @biz_kakao_price에 insert (대체문자 환불관련 테이블)*/ - kakaoVO.setMsgGroupId(sendVO.getMsgGroupId()); - kakaoVO.setKakaoFtPrice(Float.parseFloat(sendVO.getEachPrice())); - kakaoVO.setSmsPrice(Float.parseFloat(sendVO.getSmsPrice())); - kakaoVO.setMmsPrice(Float.parseFloat(sendVO.getMmsPrice())); - kakaoVO.setPicturePrice(Float.parseFloat(sendVO.getPicturePrice())); - kakaoAlimTalkDAO.insertKakaoSendPrice(kakaoVO); +/** @biz_kakao_price에 insert (대체문자 환불관련 테이블)*/ + priceAndPoint.insertBizFtKakaoPrice(kakaoVO.getUserId(), sendVO.getMsgGroupId()); priceAndPoint.insertCashAndPoint(kakaoVO.getUserId() 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 27c621bd..1dcfb200 100644 --- a/src/main/java/itn/let/mjo/msg/service/MjonMsgVO.java +++ b/src/main/java/itn/let/mjo/msg/service/MjonMsgVO.java @@ -302,6 +302,8 @@ public class MjonMsgVO extends ComDefaultVO{ private String bizLogCallStatusCode; //다우기술 biz_log 테이블의 발송결과 코드 값 성공/실패/대기 코드값 변환(성공:S, 대기:W, 실패:F). private String bizLogCallStatusTxt; //다우기술 biz_log 테이블의 발송결과 내용 텍스트. private String bizLogStatus; //다우기술 biz_log 테이블의 전송상태값 + + private String bizKakaoImageType; // 비즈 발송 img 값 private String accessKey; // 'API Key', diff --git a/src/main/java/itn/let/module/base/PriceAndPoint.java b/src/main/java/itn/let/module/base/PriceAndPoint.java index d4f190f1..bb7f15a3 100644 --- a/src/main/java/itn/let/module/base/PriceAndPoint.java +++ b/src/main/java/itn/let/module/base/PriceAndPoint.java @@ -9,14 +9,21 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; 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 +39,7 @@ import itn.let.uss.umt.service.MberManageVO; * * */ +@Slf4j @Component public class PriceAndPoint { @@ -46,6 +54,11 @@ public class PriceAndPoint { @Resource(name = "egovMjonCashIdGnrService") private EgovIdGnrService idgenMjonCashId; + + @Resource(name="kakaoAlimTalkDAO") + private KakaoAlimTalkDAO kakaoAlimTalkDAO; + + /** * @methodName : getBefCash @@ -127,6 +140,31 @@ public class PriceAndPoint { mjonPayDAO.updateMemberCash(mjonPayVO); //회원정보 업데이트 } + + public void insertBizFtKakaoPrice(String userId, String msgGroupId) throws Exception { + KakaoVO kakaoVO = new KakaoVO(); + + // 사용자 개인 단가 정보 불러오기 + 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/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 7d4ce04c..16f4575d 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 @@ -151,7 +151,8 @@ AT_DELAY_YN, BIZ_KAKAO_RESEND_ORGNL_TXT, - BIZ_KAKAO_RESEND_TYPE + BIZ_KAKAO_RESEND_TYPE, + BIZ_KAKAO_IMAGE_TYPE )VALUES ( #msgGroupId#, @@ -174,7 +175,8 @@ #atDelayYn#, #bizKakaoResendOrgnlTxt#, - #bizKakaoResendType# + #bizKakaoResendType#, + #bizKakaoImageType# ) @@ -230,6 +232,7 @@ MMD.USER_ID AS userId , MMD.MSG_GROUP_ID AS msgGroupId , MMD.MSG_SEQ AS msgSeq + , MMGD.BIZ_KAKAO_IMAGE_TYPE AS bizKakaoImageType , MMD.USERDATA AS userData , MMD.REFUND_YN AS refundYn , MMD.RSLT_CODE AS rsltCode @@ -241,11 +244,12 @@ , MMD.BIZ_KAKAO_RESEND_TYPE AS subMsgType , MMD.FILE_CNT AS fileCnt , MMD.BIZ_KAKAO_RESEND_TYPE AS bizKakaoResendType - 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' @@ -281,7 +285,7 @@ - {call kakaoFt_Send(#userId#, #msgGroupId#, #userData#, #fileCnt#, #bizKakaoResendType#)} + {call kakaoFt_Send(#userId#, #msgGroupId#, #userData#, #fileCnt#, #bizKakaoResendType#, #bizKakaoImageType#)} From 936f413ac0aa74d397c335f611fef8cd4e67f681 Mon Sep 17 00:00:00 2001 From: "hehihoho3@gmail.com" Date: Fri, 18 Jul 2025 09:33:09 +0900 Subject: [PATCH 32/48] =?UTF-8?q?=EC=B9=9C=EA=B5=AC=ED=86=A1=20=ED=99=98?= =?UTF-8?q?=EB=B6=88=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../let/kakao/kakaoComm/BizKakaoPriceVO.java | 34 ++++++ .../service/impl/KakaoAlimTalkDAO.java | 5 + .../impl/KakaoAlimTalkServiceImpl.java | 112 +++++++++++++++--- .../kakao/user/sent/service/KakaoSentVO.java | 3 +- .../let/mjo/msg/service/impl/MjonMsgDAO.java | 5 + .../itn/let/mjo/pay/service/MjonPayVO.java | 2 + .../let/mjo/pay/service/impl/MjonPayDAO.java | 5 + .../itn/let/module/base/PriceAndPoint.java | 64 ++++++++-- .../let/mjo/kakao/KakaoSent_SQL_Mysql.xml | 1 + .../let/mjo/kakao/Kakao_AT_SQL_Mysql.xml | 16 ++- .../sqlmap/let/msg/MjonMsgData_SQL_mysql.xml | 11 ++ .../sqlmap/let/pay/MjonPay_SQL_mysql.xml | 20 +++- .../ft/KakaoFriendsTalkMsgDataView.jsp | 6 +- src/main/webapp/js/kakao/ft/ftPriceClclt.js | 12 +- 14 files changed, 263 insertions(+), 33 deletions(-) create mode 100644 src/main/java/itn/let/kakao/kakaoComm/BizKakaoPriceVO.java 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/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 d62d1c7a..73c2a230 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 @@ -833,32 +843,98 @@ public class KakaoAlimTalkServiceImpl extends EgovAbstractServiceImpl implements */ 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("7000".equals(vo.getRsltCode())) {//친구톡 발송 성공시 + if(KAKAO_SUCCESS_CODE.equals(kakaoVO.getRsltCode())) {//친구톡 발송 성공시 - kakaoAlimTalkDAO.updateKakaoFtSend(vo); + processFtSendCharge(kakaoVO); - }else if("Y".equals(vo.getSubMsgSendYn())) {//친구톡 발송 실패 했을 경우 - - //대체문자 발송 UMID 번호 조회 - 알림톡 쿼리 동일하게 사용 - KakaoVO info = kakaoAlimTalkDAO.selectKakaoAtUmid(vo); - - System.out.println("대체문자 전송 : " + info.getBizUmid()); - -// if (info.getBizUmid() != null) {//대체문자 발송 완료인 경우 - if (StringUtils.isNotEmpty(info.getBizUmid())) {//대체문자 발송 완료인 경우 - kakaoAlimTalkDAO.updateKakaoFtSubMsgSend(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; + } + } + + // 대체문자 성공이면 환불 완료처리면 한다. + 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 { 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 5429c61d..b89b08e2 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 @@ -90,7 +90,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 +112,7 @@ public class KakaoSentVO extends UserDefaultVO{ private String successPrice; private String kakaoResendSuccPrice; + private String bizKakaoImageType; private String divideYn; 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/pay/service/MjonPayVO.java b/src/main/java/itn/let/mjo/pay/service/MjonPayVO.java index a1de761d..5846e56e 100644 --- a/src/main/java/itn/let/mjo/pay/service/MjonPayVO.java +++ b/src/main/java/itn/let/mjo/pay/service/MjonPayVO.java @@ -236,6 +236,8 @@ public class MjonPayVO extends ComDefaultVO{ private int remainPoint; + private String userData; + private String totChgPay; // 간편결제분류 diff --git a/src/main/java/itn/let/mjo/pay/service/impl/MjonPayDAO.java b/src/main/java/itn/let/mjo/pay/service/impl/MjonPayDAO.java index 795495b7..ea5b7a39 100644 --- a/src/main/java/itn/let/mjo/pay/service/impl/MjonPayDAO.java +++ b/src/main/java/itn/let/mjo/pay/service/impl/MjonPayDAO.java @@ -5,6 +5,7 @@ import java.util.List; import org.springframework.stereotype.Repository; import egovframework.rte.psl.dataaccess.EgovAbstractDAO; +import itn.let.kakao.kakaoComm.BizKakaoPriceVO; import itn.let.mjo.pay.service.MjonPayVO; import itn.let.mjo.pay.service.MjonVaMsgLogVO; import itn.let.mjo.pay.service.RefundVO; @@ -45,6 +46,10 @@ public class MjonPayDAO extends EgovAbstractDAO { public MjonPayVO selectCashVO(MjonPayVO mjonPayVO) throws Exception{ return (MjonPayVO)select("mjonPayDAO.selectCashVO", mjonPayVO); } + + public BizKakaoPriceVO selectBizKakaoPrice(String msgGroupId) throws Exception{ + return (BizKakaoPriceVO)select("mjonPayDAO.selectBizKakaoPrice", msgGroupId); + } public void insertCash(MjonPayVO mjonPayVO) throws Exception{ diff --git a/src/main/java/itn/let/module/base/PriceAndPoint.java b/src/main/java/itn/let/module/base/PriceAndPoint.java index bb7f15a3..f640732f 100644 --- a/src/main/java/itn/let/module/base/PriceAndPoint.java +++ b/src/main/java/itn/let/module/base/PriceAndPoint.java @@ -5,9 +5,11 @@ 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; @@ -127,23 +129,69 @@ 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); // 시스템 기본 단가 정보 불러오기 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 1f37609c..a5c693e0 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 @@ -1398,6 +1398,7 @@ A.BIZ_KAKAO_RESEND_YN AS bizKakaoResendYn, A.BIZ_KAKAO_RESEND_DATA as bizKakaoResendData, B.AD_FLAG as adFlag , + B.BIZ_KAKAO_IMAGE_TYPE as bizKakaoImageType , CASE WHEN B.AT_DELAY_YN = 'Y' AND B.AT_DELAY_COMPLETE_YN = 'N' THEN DATE_ADD(B.REQ_DATE, INTERVAL -30 MINUTE) 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 16f4575d..328b50e9 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 @@ -186,6 +186,8 @@ MSG_GROUP_ID , BIZ_KAKAO_AT_PRICE , BIZ_KAKAO_FT_PRICE + , BIZ_KAKAO_FT_IMG_PRICE + , BIZ_KAKAO_FT_WIDE_IMG_PRICE , BIZ_SMS_PRICE , BIZ_MMS_PRICE , BIZ_PICTURE_PRICE @@ -195,6 +197,8 @@ #msgGroupId# ,#kakaoAtPrice# ,#kakaoFtPrice# + ,#kakaoFtImgPrice# + ,#kakaoFtWideImgPrice# ,#smsPrice# ,#mmsPrice# ,#picturePrice# @@ -233,6 +237,7 @@ , 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 @@ -243,7 +248,7 @@ , MMD.BIZ_KAKAO_RESEND_YN AS subMsgSendYn , MMD.BIZ_KAKAO_RESEND_TYPE AS subMsgType , MMD.FILE_CNT AS fileCnt - , MMD.BIZ_KAKAO_RESEND_TYPE AS bizKakaoResendType + , MMD.BIZ_UMID AS bizUmid FROM MJ_MSG_DATA MMD INNER JOIN LETTNGNRLMBER MB @@ -266,6 +271,15 @@ AND USERDATA = #userData# + + {call kakaoAt_Send(#userId#, #msgGroupId#, #userData#)} 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 dabc5761..d441861d 100644 --- a/src/main/resources/egovframework/sqlmap/let/msg/MjonMsgData_SQL_mysql.xml +++ b/src/main/resources/egovframework/sqlmap/let/msg/MjonMsgData_SQL_mysql.xml @@ -7435,6 +7435,17 @@ + + + UPDATE MJ_MSG_DATA + SET REFUND_YN = 'Y' + WHERE + USER_ID = #userId# + AND USERDATA = #userData# + AND MSG_GROUP_ID = #msgGroupId# + + + UPDATE diff --git a/src/main/resources/egovframework/sqlmap/let/pay/MjonPay_SQL_mysql.xml b/src/main/resources/egovframework/sqlmap/let/pay/MjonPay_SQL_mysql.xml index 01e0bdb8..f22eb8fd 100644 --- a/src/main/resources/egovframework/sqlmap/let/pay/MjonPay_SQL_mysql.xml +++ b/src/main/resources/egovframework/sqlmap/let/pay/MjonPay_SQL_mysql.xml @@ -3,10 +3,11 @@ ========= ======= ================================================= 2021.03.01 신명섭 --> - + + @@ -606,6 +607,7 @@ MEMO, ORDER_ID, MSG_GROUP_ID + )VALUES ( #userId#, @@ -624,6 +626,22 @@ + + + + INSERT INTO MJ_PG ( diff --git a/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/ft/KakaoFriendsTalkMsgDataView.jsp b/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/ft/KakaoFriendsTalkMsgDataView.jsp index d0e72712..0251a926 100644 --- a/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/ft/KakaoFriendsTalkMsgDataView.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/ft/KakaoFriendsTalkMsgDataView.jsp @@ -1407,9 +1407,10 @@ function thisFnByteString(contents){ $('#msgLeng').html(""); $('#limitLeng').html(""); - if ($("#ad_Y").is(":checked")) { + /* if ($("#ad_Y").is(":checked")) { contents = "(광고)"+contents+"\n무료거부 0808800858" - } + } */ + contents = adYChkAndMakeContents(contents); console.log(contents); var conLeng = conByteLeng(contents); // 내용 문자 입력 바이트 수 계산하기 @@ -1444,6 +1445,7 @@ function thisFnByteString(contents){ $("#subMsgType").val("SMS"); } + totalFtPriceSum(tableL.getRows().length); } diff --git a/src/main/webapp/js/kakao/ft/ftPriceClclt.js b/src/main/webapp/js/kakao/ft/ftPriceClclt.js index 4eb395f0..25ded2aa 100644 --- a/src/main/webapp/js/kakao/ft/ftPriceClclt.js +++ b/src/main/webapp/js/kakao/ft/ftPriceClclt.js @@ -49,7 +49,10 @@ function totalFtPriceSum(totRows) { if ($("#send_fail_check").is(":checked")) { if (imgTypeId === "img_file_0") { // 장문/단문 여부에 따라 가격 비교 후 더 큰 값으로 설정 - var len = conByteLeng($('#smsTxtArea').val()); + + var contents = adYChkAndMakeContents($('#smsTxtArea').val()); + + var len = conByteLeng(contents); var long = parseFloat($("#longPrice").val()); var short = parseFloat($("#shortPrice").val()); price = Math.max(price, len > 90 ? long : short); @@ -76,7 +79,12 @@ function totalFtPriceSum(totRows) { return totalStr; // 계산된 총 금액 반환 } - +function adYChkAndMakeContents(contents){ + if ($("#ad_Y").is(":checked")) { + contents = "(광고)"+contents+"\n무료거부 0808800858" + } + return contents; +} /* From 336ddd8e765358e7e55ee931a2e6e03dd06f3755 Mon Sep 17 00:00:00 2001 From: "hehihoho3@gmail.com" Date: Fri, 18 Jul 2025 11:48:32 +0900 Subject: [PATCH 33/48] =?UTF-8?q?=EB=B0=9C=EC=86=A1=EA=B2=B0=EA=B3=BC=20?= =?UTF-8?q?=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kakao/user/sent/service/KakaoSentVO.java | 2 + .../service/impl/KakaoSentServiceImpl.java | 20 +++- .../let/mjo/kakao/KakaoSent_SQL_Mysql.xml | 106 +++++++++++++++--- 3 files changed, 109 insertions(+), 19 deletions(-) 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 b89b08e2..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; 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 2930037d..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{ @@ -290,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()); @@ -331,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/resources/egovframework/sqlmap/let/mjo/kakao/KakaoSent_SQL_Mysql.xml b/src/main/resources/egovframework/sqlmap/let/mjo/kakao/KakaoSent_SQL_Mysql.xml index a5c693e0..f0d64209 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 @@ -1399,6 +1399,7 @@ A.BIZ_KAKAO_RESEND_DATA as bizKakaoResendData, B.AD_FLAG as adFlag , B.BIZ_KAKAO_IMAGE_TYPE as bizKakaoImageType , + B.BIZ_KAKAO_RESEND_TYPE as bizKakaoResendType , CASE WHEN B.AT_DELAY_YN = 'Y' AND B.AT_DELAY_COMPLETE_YN = 'N' THEN DATE_ADD(B.REQ_DATE, INTERVAL -30 MINUTE) @@ -1670,23 +1671,96 @@ From 92cd6c40417681b7bf9fac846599c7fb9f66c032 Mon Sep 17 00:00:00 2001 From: "hehihoho3@gmail.com" Date: Fri, 18 Jul 2025 15:16:38 +0900 Subject: [PATCH 35/48] =?UTF-8?q?=EC=B9=9C=EA=B5=AC=ED=86=A1=20=EB=B6=99?= =?UTF-8?q?=EC=97=AC=EB=84=A3=EA=B8=B0=20=EA=B8=88=EC=95=A1=20=EA=B5=AC?= =?UTF-8?q?=ED=95=98=EB=8A=94=20=ED=95=A8=EC=88=98=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/webapp/js/kakao/ft/ftPriceClclt.js | 1 + src/main/webapp/js/kakao/ft/ftTabulator.js | 7 +++++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/webapp/js/kakao/ft/ftPriceClclt.js b/src/main/webapp/js/kakao/ft/ftPriceClclt.js index 25ded2aa..a55d9c00 100644 --- a/src/main/webapp/js/kakao/ft/ftPriceClclt.js +++ b/src/main/webapp/js/kakao/ft/ftPriceClclt.js @@ -34,6 +34,7 @@ $('document').ready(function(){ * 카카오 금액 * 수신자 수 계산 */ function totalFtPriceSum(totRows) { + console.log(' :totalFtPriceSum: '); // 수신자 수 계산 var count = parseInt(totRows); diff --git a/src/main/webapp/js/kakao/ft/ftTabulator.js b/src/main/webapp/js/kakao/ft/ftTabulator.js index 0552351a..763ba41e 100644 --- a/src/main/webapp/js/kakao/ft/ftTabulator.js +++ b/src/main/webapp/js/kakao/ft/ftTabulator.js @@ -728,7 +728,9 @@ $(document).ready(function (){ fnReplCell_advc(); }else{ //결제 금액 구하기 - totalPriceSum(totRows); +// totalPriceSum(totRows); + // 붙여넣기 했을때 금액 구하는 함수 + totalFtPriceSum(totRows); } if (tableErrorData.length > 0) { @@ -737,7 +739,8 @@ $(document).ready(function (){ // 미리보기 버튼 활성화 - updateButtons(0); +// updateButtons(0); + } From 6c83b341c25a168c725ce520a27880233f8218b2 Mon Sep 17 00:00:00 2001 From: "hehihoho3@gmail.com" Date: Tue, 22 Jul 2025 16:32:19 +0900 Subject: [PATCH 36/48] =?UTF-8?q?=EC=A3=BC=EC=84=9D=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ft/KakaoFriendsTalkMsgDataView.jsp | 71 ------------------- 1 file changed, 71 deletions(-) diff --git a/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/ft/KakaoFriendsTalkMsgDataView.jsp b/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/ft/KakaoFriendsTalkMsgDataView.jsp index 0251a926..52b59017 100644 --- a/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/ft/KakaoFriendsTalkMsgDataView.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/ft/KakaoFriendsTalkMsgDataView.jsp @@ -1728,14 +1728,6 @@ function updateButtons(){ - <%-- - checked > - - checked > - - checked > - - --%>

        * 이미지 첨부 안내

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

        * 와이드 이미지 첨부 안내

        @@ -1787,35 +1764,11 @@ function updateButtons(){ - - <%--
          -
        • -

          이미지 제목

          - -
        • -
        • -

          이미지 클릭시 이동할 URL

          - -
        • -
        • -

          첨부파일 이미지

          - -
        • -
        - - --%> 광고포함 여부 - <%-- - checked > - checked > - --%> -<%-- checked value="Y"> --%> @@ -1955,32 +1908,8 @@ function updateButtons(){
        - <%-- - - - - - - - --%> - <%-- --%>
        - <%-- - - - - - - - --%>
        -->
        + +
        + +
        + &fileSn=" alt="발송된 그림문자 미리보기" style="width: 100%"> +
        +
        +
        +
        From a2468cb18b99aee416f6bb0364a4c9f751a8e50d Mon Sep 17 00:00:00 2001 From: "hehihoho3@gmail.com" Date: Mon, 28 Jul 2025 15:51:08 +0900 Subject: [PATCH 39/48] =?UTF-8?q?=EC=B9=9C=EA=B5=AC=ED=86=A1=20json=20?= =?UTF-8?q?=EB=AC=B8=EC=9E=90=EC=97=B4=20=EC=83=9D=EC=84=B1=20=EA=B0=9C?= =?UTF-8?q?=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kakaoComm/kakaoApi/KakaoApiJsonSave.java | 72 +++++++++++++++++-- 1 file changed, 67 insertions(+), 5 deletions(-) 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 bc505002..75faba76 100644 --- a/src/main/java/itn/let/kakao/kakaoComm/kakaoApi/KakaoApiJsonSave.java +++ b/src/main/java/itn/let/kakao/kakaoComm/kakaoApi/KakaoApiJsonSave.java @@ -17,6 +17,11 @@ 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; @@ -216,9 +221,63 @@ public class KakaoApiJsonSave { * 파일은 하나만 생성해서 동일하게 사용함. * * */ - public String kakaoApiFTJsonSave_advc(KakaoVO kakaoVO) { + 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); + } + + + // 문자열로 변환 (이스케이프 없음) + return mapper.writeValueAsString(jo); + + + + /* + // 버튼리스트 JSON 생성 JSONArray buttonList = new JSONArray(); @@ -249,11 +308,14 @@ public class KakaoApiJsonSave { if(StringUtils.isNotEmpty(imageType)) { templateImageInfo.put("img_url", kakaoVO.getTemplateImageUrl()); - templateImageInfo.put("img_link", kakaoVO.getImgLink()); + templateImageInfo.put("img_link", StringUtils.isNotEmpty(kakaoVO.getImgLink()) ? kakaoVO.getImgLink() : kakaoVO.getTemplateImageUrl() ); } - if("W".equals(imageType)) { - templateImageExtInfo.put("wide", "Y"); + // wide 여부 + if ("W".equals(imageType)) { + ObjectNode extra = mapper.createObjectNode(); + extra.put("wide", "Y"); + jo.set("extra", extra); } @@ -274,7 +336,7 @@ public class KakaoApiJsonSave { // 입력 json 데이터를 파일로 변경 String jsonStr = jo.toString(); - return jsonStr; + return jsonStr;*/ } /* From f82f1776ab2aa2557a5bbffb06abd2584f9542a8 Mon Sep 17 00:00:00 2001 From: "hehihoho3@gmail.com" Date: Mon, 28 Jul 2025 15:52:49 +0900 Subject: [PATCH 40/48] =?UTF-8?q?json=EB=AC=B8=EC=9E=90=EC=97=B4=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../let/kakao/kakaoComm/kakaoApi/KakaoApiJsonSave.java | 8 ++++++++ 1 file changed, 8 insertions(+) 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 75faba76..64dfd984 100644 --- a/src/main/java/itn/let/kakao/kakaoComm/kakaoApi/KakaoApiJsonSave.java +++ b/src/main/java/itn/let/kakao/kakaoComm/kakaoApi/KakaoApiJsonSave.java @@ -268,6 +268,14 @@ public class KakaoApiJsonSave { 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); + } + } From b891d82ad19c081114816ec8423b8f769e3fc125 Mon Sep 17 00:00:00 2001 From: "hehihoho3@gmail.com" Date: Mon, 28 Jul 2025 17:47:14 +0900 Subject: [PATCH 41/48] =?UTF-8?q?=EC=B9=9C=EA=B5=AC=ED=86=A1=20,=20?= =?UTF-8?q?=EB=B2=84=ED=8A=BC=20,=20=EC=9D=B4=EB=AF=B8=EC=A7=80=20?= =?UTF-8?q?=EB=A7=81=ED=81=AC=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ft/KakaoFriendsTalkMsgDataView.jsp | 95 +++++++++++++++++-- src/main/webapp/publish/js/content.js | 30 ++++-- 2 files changed, 108 insertions(+), 17 deletions(-) diff --git a/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/ft/KakaoFriendsTalkMsgDataView.jsp b/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/ft/KakaoFriendsTalkMsgDataView.jsp index cbe7e702..bdb0a03e 100644 --- a/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/ft/KakaoFriendsTalkMsgDataView.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/ft/KakaoFriendsTalkMsgDataView.jsp @@ -206,13 +206,18 @@ function imageInit(){ $("#imageFileName").val(""); //이미지 파일명 삭제 } - +/* function validateButtons() { var isValid = true; - + + console.log($('#buttonAddWrap').html()); + var val = ''; // button_add_wrap 하위 input들 중에서 비어있는 항목이 있는지 확인 $('#buttonAddWrap').find('input[type="text"]').each(function() { - if ($(this).val().trim() === '') { + + var val = $(this).val().trim(); + if (val === '') { + console.log($(this).prop('outerHTML')); isValid = false; return false; // .each 루프 중단 } @@ -221,9 +226,55 @@ function validateButtons() { if (!isValid) { alert('버튼명 및 링크를 입력해주세요.'); return false; + }else if (!val.startsWith('http://') && !val.startsWith('https://') ) { + alert('버튼의 링크는 http:// 또는 https:// 형식으로 입력해주세요.'); + $(this).focus(); + return false; } return true; +} */ + +function validateButtons() { + var isValid = true; + + $('.kakaoBtnNmList').each(function() { + var val = $(this).val().trim(); + + // 빈 값 체크 + if (val === '') { + alert('버튼명을 모두 입력해주세요.'); + $(this).focus(); + isValid = false; + return false; // .each 루프 중단 + } + + }); + + if(isValid){ + $('.kakaoBtnList').each(function() { + var val = $(this).val().trim(); + + // 빈 값 체크 + if (val === '') { + alert('링크를 모두 입력해주세요.'); + $(this).focus(); + isValid = false; + return false; // .each 루프 중단 + } + + // http 형식 체크 + if (!val.startsWith('http://') && !val.startsWith('https://')) { + alert('버튼의 링크는 http:// 또는 https:// 형식으로 입력해주세요.'); + $(this).focus(); + isValid = false; + return false; // .each 루프 중단 + } + }); + } + + + return isValid; } //최근 전송내역 @@ -483,14 +534,12 @@ function upImgClick(){ //이미지 선택시 링크 정보 및 url 패턴 검사 console.log('link: ', link); if (!link) { - - if(!confirm("먼저 URL을 입력하지 않으면 이미지에 URL이 저장되지 않습니다. 계속하시겠습니까?")){ return false; } - - - + }else if(!link.startsWith('http://') && !link.startsWith('https://')){ + alert('이동할 URL은 http:// 또는 https:// 형식으로 입력해주세요.'); + return false; } /* else if(link.search("http://") == -1 && link.search("https://") == -1){ @@ -969,6 +1018,12 @@ function fn_noTimeSend(){ //친구톡 데이터 전송 처리 function fn_sendMsgData(){ + // 유효성 검사 실패 시 저장 동작 중단 +/* if (!validateLinks()) { + return false; + } + */ + var senderKey = $("#selectAgentCode option:checked").val(); if(senderKey == ''){ @@ -1343,6 +1398,28 @@ function fn_insertErrorYN(val){ $('#errorChk').val(val); } +//링크 유효성 검증 함수 +function validateLinks() { + + console.log('검사 대상 수:', $('.kakaoBtnList').length); + + let isValid = true; + + $('.kakaoBtnList').each(function () { + const val = $(this).val().trim(); + + console.log('val : ', val); + if (val !== '' && !val.startsWith('http://') && !val.startsWith('https://')) { + alert(`"${val}" 은(는) http:// 또는 https:// 로 시작해야 합니다.`); + $(this).focus(); + isValid = false; + return false; // each 루프 중단 + } + }); + + return isValid; +} + @@ -2020,7 +2097,7 @@ function updateButtons(){
        - + * 중복번호는 한번만 발송됩니다.
        diff --git a/src/main/webapp/publish/js/content.js b/src/main/webapp/publish/js/content.js index a0f9a6ae..ca6804ea 100644 --- a/src/main/webapp/publish/js/content.js +++ b/src/main/webapp/publish/js/content.js @@ -1662,27 +1662,41 @@ function friendTemplateButtonAdd() { } var buttonText; var buttonView; - //템플릿 버튼은 buttonVO의 buttonVOList 변수에 셋팅해서 넘겨주게 만들었음 + //템플릿 버튼은 buttonVO의 buttonVOList 변수에 셋팅해서 넘겨주게 만들었음 if (buttonType == "button_type_1") { - buttonText = '
        배송조회

        *이용가능 택배사 : KG로지스, 우체국택배,일양로지스, GTX로지스, FedEx, 경동택배, 합동택배, 롯데택배

        '; + buttonText = '
        배송조회
        ' + +'' + +'

        *이용가능 택배사 : KG로지스, 우체국택배,일양로지스, GTX로지스, FedEx, 경동택배, 합동택배, 롯데택배

        '; buttonView = ''; } else if (buttonType == "button_type_2") { - buttonText = '
        웹링크
        '; + buttonText = '
        웹링크
        ' + +'
        • ' + +'
        • ' + +'
        • ' + +'
        '; buttonView = ''; } else if (buttonType == "button_type_3") { - buttonText = '
        앱링크
        '; + buttonText = '
        앱링크
        ' + +'
        • ' + +'
        • ' + +'
        • ' + +'
        '; buttonView = ''; } else if (buttonType == "button_type_4") { - buttonText = '
        봇키워드
        '; + buttonText = '
        봇키워드
        ' + +'
        '; buttonView = ''; } else if (buttonType == "button_type_5") { - buttonText = '
        메시지전달
        '; + buttonText = '
        메시지전달
        ' + +'
        '; buttonView = ''; } else if (buttonType == "button_type_6") { - buttonText = '
        상담톡전환
        '; + buttonText = '
        상담톡전환
        ' + +'
        '; buttonView = ''; } else if (buttonType == "button_type_7") { - buttonText = '
        챗봇전환
        '; + buttonText = '
        챗봇전환
        ' + +'
        '; buttonView = ''; } else {} $(".button_add_wrap").prepend(buttonText); From cec731273a10c62e742ebff1ac62435e2070ff00 Mon Sep 17 00:00:00 2001 From: "hehihoho3@gmail.com" Date: Tue, 29 Jul 2025 18:12:57 +0900 Subject: [PATCH 42/48] =?UTF-8?q?=EC=B9=9C=EA=B5=AC=ED=86=A1=20=EB=B0=9C?= =?UTF-8?q?=EC=86=A1=EC=83=81=EC=84=B8=20=EC=9D=B4=EB=AF=B8=EC=A7=80=20?= =?UTF-8?q?=EA=B0=84=EA=B2=A9=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../WEB-INF/jsp/web/kakao/sent/KakaoSentDetailPopAjax.jsp | 2 +- src/main/webapp/publish/textingmsg_detail_friendtalk.html | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/webapp/WEB-INF/jsp/web/kakao/sent/KakaoSentDetailPopAjax.jsp b/src/main/webapp/WEB-INF/jsp/web/kakao/sent/KakaoSentDetailPopAjax.jsp index b3a4a308..a292a4fb 100644 --- a/src/main/webapp/WEB-INF/jsp/web/kakao/sent/KakaoSentDetailPopAjax.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/kakao/sent/KakaoSentDetailPopAjax.jsp @@ -21,7 +21,7 @@
        -
        +

        diff --git a/src/main/webapp/publish/textingmsg_detail_friendtalk.html b/src/main/webapp/publish/textingmsg_detail_friendtalk.html index 7b4383b6..2a9d56b4 100644 --- a/src/main/webapp/publish/textingmsg_detail_friendtalk.html +++ b/src/main/webapp/publish/textingmsg_detail_friendtalk.html @@ -732,11 +732,13 @@

        (광고)

        -
        + +

        홍길동 고객님 안녕하세요. 문자온입니다. 문자온에서는 재결제 고객님들께 다양한 이벤트를 준비하였으니, 방문하셔서 혜택 놓치지 마세요.

        +

        수신거부 : 홈 > 채널차단

        From 49d01ac119ca6f760408b74e248fb002e101458a Mon Sep 17 00:00:00 2001 From: "hehihoho3@gmail.com" Date: Wed, 30 Jul 2025 09:33:57 +0900 Subject: [PATCH 43/48] =?UTF-8?q?Merge=20branch=20'master'=20into=205102?= =?UTF-8?q?=5F=EC=B9=9C=EA=B5=AC=ED=86=A1=5F=EB=B0=9C=EC=86=A1=EC=86=8D?= =?UTF-8?q?=EB=8F=84=5F=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jsp/web/kakao/msgdata/ft/KakaoFriendsTalkMsgDataView.jsp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/ft/KakaoFriendsTalkMsgDataView.jsp b/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/ft/KakaoFriendsTalkMsgDataView.jsp index bdb0a03e..96d36050 100644 --- a/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/ft/KakaoFriendsTalkMsgDataView.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/ft/KakaoFriendsTalkMsgDataView.jsp @@ -2234,14 +2234,14 @@ function updateButtons(){ +

        (광고)

        -
        -
        +

        무료거부 0808800858

        From d1e1244cd50a3acbc137bd9b28e211f4452627c5 Mon Sep 17 00:00:00 2001 From: "hehihoho3@gmail.com" Date: Wed, 30 Jul 2025 09:55:45 +0900 Subject: [PATCH 44/48] =?UTF-8?q?=EC=B9=9C=EA=B5=AC=ED=86=A1=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EB=B2=88=ED=98=B8=20=EC=82=AD=EC=A0=9C=20?= =?UTF-8?q?=EB=B0=8F=20imgLink=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ft/KakaoFriendsTalkMsgDataView.jsp | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/ft/KakaoFriendsTalkMsgDataView.jsp b/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/ft/KakaoFriendsTalkMsgDataView.jsp index 96d36050..aad8d05d 100644 --- a/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/ft/KakaoFriendsTalkMsgDataView.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/ft/KakaoFriendsTalkMsgDataView.jsp @@ -629,6 +629,7 @@ function getTemplateImagUrl(){ $('#imgTitle').removeClass('file_none') .text(fileName); + $('#imgLinkTemp').val($('#imgLink').val()); // 회색 처리 + 입력 불가 $('#imgLink').prop('disabled', true); // 회색 처리 + 입력 불가 @@ -1146,9 +1147,7 @@ function fn_sendMsgData(){ if(!confirm("친구톡을 발송하시겠습니까?")){ - return false; - } @@ -1168,21 +1167,21 @@ function fn_sendMsgData(){ // 2. buttonVOList 수동으로 수집 var buttonList = []; $('input[name^="buttonVOList"]').each(function() { - let nameAttr = $(this).attr('name'); - let match = nameAttr.match(/buttonVOList\[(\d+)\]\.(\w+)/); - - if (match) { - let index = parseInt(match[1]); - let key = match[2]; - let value = $(this).val(); - - if (!buttonList[index]) buttonList[index] = {}; - buttonList[index][key] = value; - } + let nameAttr = $(this).attr('name'); + let match = nameAttr.match(/buttonVOList\[(\d+)\]\.(\w+)/); + if (match) { + let index = parseInt(match[1]); + let key = match[2]; + let value = $(this).val(); + + if (!buttonList[index]) buttonList[index] = {}; + buttonList[index][key] = value; + } }); // 3. formData에 배열로 추가 formData["buttonVOList"] = buttonList; + // 회색 처리 + 입력 불가 // 4. 기존의 buttonVOList[0].xxx 형태 제거 Object.keys(formData).forEach(function(key) { @@ -1196,14 +1195,15 @@ function fn_sendMsgData(){ delete formData[key]; }); - + formData["imgLink"] = $('#imgLinkTemp').val(); + // 빈 값 제거 removeEmptyValues(formData); // 선택된 데이터 추가 formData["mjonFTSendVOList"] = $selectedData; // JSON 데이터 확인 console.log("최종 formData:", JSON.stringify(formData)); - + // 프로그래스파 시간을 위한 계산 var estimtedTime = calculateEstimatedTime(tableL.getRows().length); @@ -2097,7 +2097,7 @@ function updateButtons(){
        - + * 중복번호는 한번만 발송됩니다.
        From 5639c5e910cfa1772bba86fd984bbdb25713148c Mon Sep 17 00:00:00 2001 From: "hehihoho3@gmail.com" Date: Wed, 6 Aug 2025 09:50:59 +0900 Subject: [PATCH 45/48] =?UTF-8?q?=EB=8C=80=EC=B2=B4=EB=AC=B8=EC=9E=90=20?= =?UTF-8?q?=ED=83=80=EC=9E=85=EB=B3=84=20=ED=99=94=EB=A9=B4=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ft/KakaoFriendsTalkMsgDataView.jsp | 53 +++++++++++++++++-- 1 file changed, 50 insertions(+), 3 deletions(-) diff --git a/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/ft/KakaoFriendsTalkMsgDataView.jsp b/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/ft/KakaoFriendsTalkMsgDataView.jsp index aad8d05d..16b0ae09 100644 --- a/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/ft/KakaoFriendsTalkMsgDataView.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/ft/KakaoFriendsTalkMsgDataView.jsp @@ -166,6 +166,7 @@ $(document).ready(function (){ $('#sendFailImg').hide(); $('#sendFailImgSrc').attr('src', ''); $('#atchFileId').val(''); + thisFnByteString($('#smsTxtArea').val()); } @@ -180,6 +181,19 @@ $(document).ready(function (){ //자주보내는 번호 resultBookMarkMsgList(); + + + + // 대체문자 초기화 + $('#failCheckInit').on('click', function(){ + console.log('::failCheckInit::'); + $('#smsTxtArea').val(''); + thisFnByteString(''); + + }); + + + }); function imageInit(){ @@ -649,6 +663,11 @@ function getTemplateImagUrl(){ // 대체문자 $('#sendFailImg').show(); $('#sendFailImgSrc').attr('src', returnData.object.imgUrl); + // 대체문자 포토형으로 수정 +// $('.put_left').removeClass("short"); //내용 입력 박스 클래스 삭제 +// $('.put_left').removeClass("long"); //내용 입력 박스 클래스 삭제 +// $('.put_left').addClass('photo'); + setSendFailTemplate('P') } } else { @@ -679,6 +698,25 @@ function getTemplateImagUrl(){ $("#imgFile").val(""); } +function setSendFailTemplate(p_type){ + if(p_type == 'P'){ + // 대체문자 포토형으로 수정 + $('.put_left').removeClass("short"); //내용 입력 박스 클래스 삭제 + $('.put_left').removeClass("long"); //내용 입력 박스 클래스 삭제 + $('.put_left').addClass('photo'); + + $('.msg_com').removeClass("msg_short"); //단문 클래스 삭제하고 + $('.msg_com').removeClass("msg_long"); //단문 클래스 삭제하고 + $('.msg_com').addClass("msg_photo"); //단문 클래스 삭제하고 + + + $('#limitLeng').html("2000"); + $('.msg_com').html("그림"); + + } + +} + function fnImageDel(){ if(confirm("등록된 이미지를 삭제하시겠습니까?")){ @@ -1447,31 +1485,40 @@ function thisFnByteString(contents){ //문자 길이 변수에 저장해주기 // $('#smsLen').val(conLeng); + var imgType = $('#sendFailImgSrc').attr('src'); - if(conLeng > 90){ + + if(imgType != null && "" != imgType){ + + setSendFailTemplate('P') + } + else if(conLeng > 90){ - $('#msgLeng').html(conLeng + " / "); $('#limitLeng').html("2000"); $('.msg_com').html("장문"); $('#msgType').val("6"); // 메세지 타입 설정 $('.msg_com').removeClass("msg_short"); //단문 클래스 삭제하고 $('.put_left').removeClass("short"); //내용 입력 박스 클래스 삭제 + $('.put_left').removeClass("photo"); //내용 입력 박스 클래스 삭제 $('.msg_com').addClass("msg_long"); // 장문 클래스 삽입 $("#subMsgType").val("LMS"); }else{ - $('#msgLeng').html(conLeng + " / "); $('#limitLeng').html("90"); $('.msg_com').html("단문"); $('#msgType').val("4"); // 메세지 타입 설정 + $('.msg_com').removeClass("msg_long"); //단문 클래스 삭제하고 $('.put_left').removeClass("long"); //내용 입력 박스 클래스 삭제 + $('.put_left').removeClass("photo"); //내용 입력 박스 클래스 삭제 $('.msg_com').addClass("msg_short"); // 장문 클래스 삽입 $("#subMsgType").val("SMS"); } + + $('#msgLeng').html(conLeng + " / "); totalFtPriceSum(tableL.getRows().length); } From 8c3e518410a5fce52d50be333811fbca2b89d16a Mon Sep 17 00:00:00 2001 From: "hehihoho3@gmail.com" Date: Thu, 7 Aug 2025 12:11:23 +0900 Subject: [PATCH 46/48] =?UTF-8?q?=EC=B9=9C=EA=B5=AC=ED=86=A1=20=EB=B2=84?= =?UTF-8?q?=ED=8A=BC=EB=AA=85=20=EC=88=9C=EC=B0=A8=EC=A0=81=EC=9A=A9=20?= =?UTF-8?q?=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ft/KakaoFriendsTalkMsgDataView.jsp | 25 +++++++++---------- src/main/webapp/publish/js/content.js | 4 +-- 2 files changed, 14 insertions(+), 15 deletions(-) diff --git a/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/ft/KakaoFriendsTalkMsgDataView.jsp b/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/ft/KakaoFriendsTalkMsgDataView.jsp index 16b0ae09..12a4454b 100644 --- a/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/ft/KakaoFriendsTalkMsgDataView.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/ft/KakaoFriendsTalkMsgDataView.jsp @@ -65,21 +65,20 @@ $(document).ready(function (){ }); - //웹링크 버튼명 +// 웹링크 버튼명 변경 시 미리보기에도 적용 (여러 개일 때 정확하게) $(document).on('keyup', '#btnNmWeb', function(){ - var inputTxt = $(this).val(); - if(!inputTxt){ - inputTxt = '웹링크'; - } - $('#btnViewWL').text(inputTxt); + var inputTxt = $(this).val() || '웹링크'; + // 웹링크용 인풋만 골라서 현재 인덱스를 구함 + var $webNmInputs = $('input#btnNmWeb'); + var idx = $webNmInputs.index(this); + // 미리보기 영역의 웹링크 버튼들 중, 동일한 인덱스의 버튼 텍스트를 바꿔줌 + $('.btnViewArea .btn_kakao_type.btnEmpty[id^=btnViewWL]').eq(idx).text(inputTxt); }); - //앱링크 버튼명 $(document).on('keyup', '#btnNmApp', function(){ - var inputTxt = $(this).val(); - if(!inputTxt){ - inputTxt = '앱링크'; - } - $('#btnViewAL').text(inputTxt); + var inputTxt = $(this).val() || '앱링크'; + var $appNmInputs = $('input#btnNmApp'); + var idx = $appNmInputs.index(this); + $('.btnViewArea .btn_kakao_type.btnEmpty[id^=btnViewAL]').eq(idx).text(inputTxt); }); $(".friend_talk_wrap #ad_Y").click(function () { @@ -1685,7 +1684,7 @@ function updateButtons(){
        -

        친구톡 전송

        +

        친구톡 전송

        diff --git a/src/main/webapp/publish/js/content.js b/src/main/webapp/publish/js/content.js index ca6804ea..6062e5d0 100644 --- a/src/main/webapp/publish/js/content.js +++ b/src/main/webapp/publish/js/content.js @@ -1699,8 +1699,8 @@ function friendTemplateButtonAdd() { +'
        '; buttonView = ''; } else {} - $(".button_add_wrap").prepend(buttonText); - $(".btnViewArea").prepend(buttonView); + $(".button_add_wrap").append(buttonText); + $(".btnViewArea").append(buttonView); } //관리자 카카오톡 알림톡 샘플 템플릿 등록 - 버튼 추가 From acd01e5651b5de72ed65f78cc87f7a417b767463 Mon Sep 17 00:00:00 2001 From: ijunho Date: Thu, 7 Aug 2025 12:32:45 +0900 Subject: [PATCH 47/48] =?UTF-8?q?=EC=B9=9C=EA=B5=AC=ED=86=A1=20>=20?= =?UTF-8?q?=EB=B0=9C=EC=86=A1=EA=B2=B0=EA=B3=BC=20=EC=83=81=EC=84=B8=20=20?= =?UTF-8?q?=20-=20=EC=B9=9C=EA=B5=AC=ED=86=A1=20=EB=B0=9C=EC=86=A1?= =?UTF-8?q?=EC=9A=94=EA=B8=88=EC=9D=B4=20=EB=A6=AC=EC=8A=A4=ED=8A=B8?= =?UTF-8?q?=EC=99=80=20=EC=83=81=EC=9D=B4=ED=95=9C=20=EC=98=A4=EB=A5=98=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=20=20=20-=20=EB=8C=80=EC=B2=B4=EB=AC=B8?= =?UTF-8?q?=EC=9E=90=20=EB=B0=9C=EC=86=A1=EC=9A=94=EA=B8=88=EC=9D=B4=20?= =?UTF-8?q?=EB=A6=AC=EC=8A=A4=ED=8A=B8=EC=99=80=20=EC=83=81=EC=9D=B4?= =?UTF-8?q?=ED=95=9C=20=EC=98=A4=EB=A5=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sqlmap/let/mjo/kakao/KakaoSent_SQL_Mysql.xml | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) 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 7d65c091..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 @@ -1820,8 +1820,19 @@ , a.failCount , a.kakaoResendSuccCount , a.kakaoResendFailCount - , a.successCount * bkp.BIZ_KAKAO_AT_PRICE AS successPrice - , (a.smsCnt * bkp.BIZ_SMS_PRICE) + (a.mmsCnt * bkp.BIZ_MMS_PRICE) AS kakaoResendSuccPrice + + ,case + when a.msgType = '8' then a.successCount * bkp.BIZ_KAKAO_AT_PRICE + when a.msgType = '9' and a.bizKakaoImageType = 'I' then a.successCount * bkp.BIZ_KAKAO_FT_IMG_PRICE + when a.msgType = '9' and a.bizKakaoImageType = 'W' then a.successCount * bkp.BIZ_KAKAO_FT_WIDE_IMG_PRICE + when a.msgType = '9' and a.bizKakaoImageType != 'I' and a.bizKakaoImageType != 'W' then a.successCount * bkp.BIZ_KAKAO_FT_PRICE + end successPrice + + ,case + when a.msgType = '8' then (a.smsCnt * bkp.BIZ_SMS_PRICE) + (a.mmsCnt * bkp.BIZ_MMS_PRICE) + when a.msgType = '9' and (a.bizKakaoImageType = 'I' or a.bizKakaoImageType = 'W') then a.mmsCnt * bkp.BIZ_PICTURE_PRICE + when a.msgType = '9' and a.bizKakaoImageType != 'I' and a.bizKakaoImageType != 'W' then (a.smsCnt * bkp.BIZ_SMS_PRICE) + (a.mmsCnt * bkp.BIZ_MMS_PRICE) + end kakaoResendSuccPrice , a.divideYn , a.bizKakaoResendYn , MKPI.YELLOW_ID AS yellowId @@ -1947,6 +1958,7 @@ , MD.BIZ_KAKAO_RESEND_YN as bizKakaoResendYn , MD.MSG_NOTICETALK_SENDER_KEY , MD.MSG_NOTICETALK_TMP_KEY + , MGD.BIZ_KAKAO_IMAGE_TYPE as bizKakaoImageType FROM MJ_MSG_DATA MD inner join MJ_MSG_GROUP_DATA MGD on MGD.MSG_GROUP_ID = MD.MSG_GROUP_ID From d9f34eee53cbeb4fa5ca42c03f91d992d9e53a11 Mon Sep 17 00:00:00 2001 From: "hehihoho3@gmail.com" Date: Thu, 7 Aug 2025 12:50:53 +0900 Subject: [PATCH 48/48] =?UTF-8?q?=EC=B9=9C=EA=B5=AC=ED=86=A1=20=ED=85=9C?= =?UTF-8?q?=ED=94=8C=EB=A6=BF=20=EB=B6=88=EB=9F=AC=EC=98=A4=EA=B8=B0=20?= =?UTF-8?q?=ED=9B=84=20=EC=83=88=EA=B3=A0=EA=B3=A0=EC=B9=A8=20->=20?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=A7=80=20=EC=9D=B4=EB=8F=99=20=EC=B9=9C?= =?UTF-8?q?=EA=B5=AC=ED=86=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web/kakao/msgdata/ft/KakaoFriendsTalkMsgDataView.jsp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/ft/KakaoFriendsTalkMsgDataView.jsp b/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/ft/KakaoFriendsTalkMsgDataView.jsp index 12a4454b..968da1ce 100644 --- a/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/ft/KakaoFriendsTalkMsgDataView.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/ft/KakaoFriendsTalkMsgDataView.jsp @@ -1523,9 +1523,11 @@ function thisFnByteString(contents){ } function msgSuccessClose(obj){ - $(obj).closest('.pop_msg_success').attr('style',''); - location.reload(true); - $('html').scrollTop(0); +// $(obj).closest('.pop_msg_success').attr('style',''); +// location.reload(true); +// $('html').scrollTop(0); + + location.href = '/web/mjon/kakao/friendstalk/kakaoFriendsTalkMsgDataView.do'; } function getFtImageType(imgChk){