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/71] =?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/71] =?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/71] =?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/71] =?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/71] =?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/71] =?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/71] =?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/71] =?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 379cc8fa43c05803530ed8ba7743b075daf49f87 Mon Sep 17 00:00:00 2001 From: JIWOO Date: Thu, 5 Jun 2025 16:41:13 +0900 Subject: [PATCH 17/71] =?UTF-8?q?=EC=9D=B4=EC=A7=80=EC=9A=B0=20-=20?= =?UTF-8?q?=EC=82=AC=EC=9A=A9=EB=82=B4=EC=97=AD=20=EC=A7=84=ED=96=89=20?= =?UTF-8?q?=EC=A4=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../let/mjo/pay/web/MjonPayController.java | 19 +- .../sqlmap/let/msg/MjonMsgData_SQL_mysql.xml | 6 +- .../WEB-INF/jsp/web/pay/PayUserSWList.jsp | 48 ++---- .../WEB-INF/jsp/web/pay/PayUserSWListAjax.jsp | 162 ++++++++---------- 4 files changed, 105 insertions(+), 130 deletions(-) diff --git a/src/main/java/itn/let/mjo/pay/web/MjonPayController.java b/src/main/java/itn/let/mjo/pay/web/MjonPayController.java index 08267bdb..80376b40 100644 --- a/src/main/java/itn/let/mjo/pay/web/MjonPayController.java +++ b/src/main/java/itn/let/mjo/pay/web/MjonPayController.java @@ -2607,7 +2607,7 @@ public class MjonPayController { * @throws Exception */ @RequestMapping(value= {"/web/member/pay/PayUserSWList.do"}) - public String PayUserSWList(@ModelAttribute("mjonMsgVO") MjonMsgVO mjonMsgVO, + public String payUserSWList(@ModelAttribute("mjonMsgVO") MjonMsgVO mjonMsgVO, MjonPayVO mjonPayVO, MberManageVO mberManageVO, RedirectAttributes redirectAttributes, HttpServletRequest request, @@ -2622,6 +2622,14 @@ public class MjonPayController { } String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId()); mjonMsgVO.setUserId(userId); + + + // 비즈니스 로직 부분 +// Map resultMap = mjonPayService.payUserSWList(mjonPayVO); + + + + /* { // 충전캐시 String sumPayMoney = mjonPayService.selectAgentSumPayMoney(userId); @@ -2733,6 +2741,15 @@ public class MjonPayController { model.addAttribute("endDate", DateUtils.getCurrentDate()); } + + + + + + + + + return "/web/pay/PayUserSWList"; } 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..3d6d35b2 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 @@ -3168,6 +3168,7 @@ WHERE 1 = 1 AND pf.SentEA > 0 AND mjf.USER_ID = #userId# + AND mjf.RESERVE_C_YN = 'N' ) AS pay WHERE 1=1 @@ -3277,7 +3278,7 @@ , M.fileName3 AS fileName3 , M.orderByCode AS orderByCode , M.msgId AS msgId - , M.reqDate AS reqDate + , DATE_FORMAT(M.reqDate, '%Y-%m-%d %H:%i') AS reqDate FROM (SELECT DATE_FORMAT(B.REGDATE, '%Y-%m-%d %H:%i' ) AS regDate @@ -3318,7 +3319,7 @@ /*and A.DEL_FLAG = 'N'*/ AND A.USER_ID = #userId# AND B.USER_ID = #userId# - /*AND B.RESERVE_C_YN = 'N'*/ + AND B.RESERVE_C_YN = 'N' ORDER BY 1=1 , msgGroupId DESC , sentDate DESC @@ -3366,6 +3367,7 @@ WHERE 1 = 1 AND pf.SentEA > 0 AND mjf.USER_ID = #userId# + AND mjf.RESERVE_C_YN = 'N' ) AS pay WHERE 1=1 diff --git a/src/main/webapp/WEB-INF/jsp/web/pay/PayUserSWList.jsp b/src/main/webapp/WEB-INF/jsp/web/pay/PayUserSWList.jsp index 1be55030..49b9dbdf 100644 --- a/src/main/webapp/WEB-INF/jsp/web/pay/PayUserSWList.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/pay/PayUserSWList.jsp @@ -47,8 +47,19 @@ $(document).ready(function(){ thisYearStart = date.getFullYear() + "/01/01" ; thisYearEnd = date.getFullYear() + "/12/31" ; + $(document).on('change','#pageUnitS', function(){ + setPageUnit($(this).val()); + + payUserListAjax(1); + + }); + }); +function setPageUnit(val){ + $('#pageUnit').val(val); +} + // 기간 요일 지정 function setCalVal(val,targetObj){ $('input[name='+targetObj+']').val(val) ; @@ -92,42 +103,6 @@ function payUserTab(obj, pageType){ } - - - -function getUsedCashTotList(){ - var sendData = { - "startDate" : $("#startDate").val(), - "endDate" : $("#endDate").val() - }; - - console.log('sendData : ', sendData); -// url: '/web/member/pay/getUsedCashTotList.do', - - $.ajax({ - type:"POST", - url:"", - data: sendData, - dataType:'json', - success:function(data){ - console.log('data :: ', data); - if(data.status == 'OK') { - // 성공 처리 - } else { - // 오류 처리 - } - }, - error: function(jqXHR, textStatus, errorThrown) { - console.error("AJAX Error:", textStatus, errorThrown); - console.error("Response:", jqXHR.responseText); - } - }); -} - - - - - /* 윈도우팝업 열기 */ function infoPop(pageUrl){ document.infoPopForm.pageType.value = pageUrl; @@ -534,6 +509,7 @@ function fnRevDetailPop03(msgGroupId){
      +
      diff --git a/src/main/webapp/WEB-INF/jsp/web/pay/PayUserSWListAjax.jsp b/src/main/webapp/WEB-INF/jsp/web/pay/PayUserSWListAjax.jsp index 2b071585..4fb6b195 100644 --- a/src/main/webapp/WEB-INF/jsp/web/pay/PayUserSWListAjax.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/pay/PayUserSWListAjax.jsp @@ -91,8 +91,39 @@ $(document).ready(function(){ }); -/* 사용내역서 클릭 시 내역서 새창 팝업 오픈 */ +/* 250530 - 거래명세서, 사용내역서 분리 */ function fnShowPrintPopup() { + //만들려는 팝업의 크기 + var url = "printMsgUsageDetailsAjax.do"; + var popup_wid = '790'; + var popup_ht = '800'; + var popup_left = (window.screen.width/2)-(popup_wid/2); + var popup_top =(window.screen.height/2)-(popup_ht/2); + + //날짜 체크 + if(($('#startDate').val() != '' && $('#endDate').val() == '') || ($('#startDate').val() == '' && $('#endDate').val() != '')){ + alert("기간설정을 정상적으로 선택해 주세요."); + return; + } + + if( $('#startDate').val() != '' && $('#endDate').val() != '' ){ + var iChkBeginDe = Number($('#startDate').val().replaceAll("/", "")); + var iChkEndDe = Number($('#endDate').val().replaceAll("/", "")); + if(iChkBeginDe > iChkEndDe || iChkEndDe < iChkBeginDe ){ + alert("기간설정의 시작일자는 종료일자 보다 클수 없습니다."); + return; + } + } + + document.listForm.action = url; + document.listForm.method = "post"; + window.open("about:blank", 'printPop', 'width='+ popup_wid +', height='+ popup_ht +', left=' + popup_left + ', top='+ popup_top + ', fullscreen=no, menubar=no, status=no, toolbar=no, titlebar=yes, location=no, scrollbars=1'); + document.listForm.target = "printPop"; + document.listForm.submit(); +} + +/* 사용내역서 클릭 시 내역서 새창 팝업 오픈 */ +/* function fnShowPrintPopup() { //만들려는 팝업의 크기 var url = ""; var popup_wid = '830'; @@ -131,7 +162,7 @@ function fnShowPrintPopup() { window.open("about:blank", 'printPop', 'width='+ popup_wid +', height='+ popup_ht +', left=' + popup_left + ', top='+ popup_top + ', fullscreen=no, menubar=no, status=no, toolbar=no, titlebar=yes, location=no, scrollbars=1'); document.listForm.target = "printPop"; document.listForm.submit(); -} +} */ /* 사용내역서 클릭 시 내역서 새창 팝업 오픈 */ function fnShowPrintPopup_OLD() { @@ -214,41 +245,48 @@ function fnShowPdfPrintPopup(){
      " /> " /> +

      ${paginationInfo.totalRecordCount}건   ( 원)

      - + + + + + + +
      - <%-- --%> - - - - - -<%-- --%> - <%-- + + - - --%> + + + - <%-- --%> - - - - - - + + - - - - - + + @@ -285,10 +313,6 @@ function fnShowPdfPrintPopup(){ - <%-- --%> @@ -339,11 +363,11 @@ function fnShowPdfPrintPopup(){ (매) - / - <%-- - - () - --%> +

      + +
      - <%-- --%> - - <%-- - - - --%> - <%-- - --%> - @@ -412,7 +390,9 @@ function fnShowPdfPrintPopup(){
      - - - 발송일시
      @@ -256,28 +294,18 @@ function fnShowPdfPrintPopup(){
      - 문자유형 + 형태
      내용발송건수사용발송건수금액(원)
      충전금성공실패
      - - -

      +

      +

      @@ -352,58 +376,12 @@ function fnShowPdfPrintPopup(){

      -

      - - -

      -
      -

      - - -

      -
      -

      - - -

      -
      -

      - - -

      -
      -

      - 0 -

      -
      -

      - - -

      -
      -

      - - -

      -
      + 검색 결과가 없습니다.
      -
      + + + <%--
      @@ -434,7 +414,7 @@ function fnShowPdfPrintPopup(){
      -
      +
      --%> From d0a6292cc591d27e0465d8332a18b7345282574e Mon Sep 17 00:00:00 2001 From: "hehihoho3@gmail.com" Date: Thu, 5 Jun 2025 16:42:21 +0900 Subject: [PATCH 18/71] =?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 0ce04cc12fec38e453b4bada4d71ada110e87cfd Mon Sep 17 00:00:00 2001 From: "hehihoho3@gmail.com" Date: Thu, 5 Jun 2025 17:19:22 +0900 Subject: [PATCH 19/71] =?UTF-8?q?payUserSWList=20=EC=BB=A8=ED=8A=B8?= =?UTF-8?q?=EB=A1=A4=EB=9F=AC->=EC=84=9C=EB=B9=84=EC=8A=A4=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../let/mjo/pay/service/MjonPayService.java | 3 + .../pay/service/impl/MjonPayServiceImpl.java | 101 +++++++++++++ .../let/mjo/pay/web/MjonPayController.java | 139 ++---------------- 3 files changed, 120 insertions(+), 123 deletions(-) diff --git a/src/main/java/itn/let/mjo/pay/service/MjonPayService.java b/src/main/java/itn/let/mjo/pay/service/MjonPayService.java index 2f8dd877..6b8ec71d 100644 --- a/src/main/java/itn/let/mjo/pay/service/MjonPayService.java +++ b/src/main/java/itn/let/mjo/pay/service/MjonPayService.java @@ -1,6 +1,7 @@ package itn.let.mjo.pay.service; import java.util.List; +import java.util.Map; import javax.servlet.http.HttpServletRequest; @@ -140,4 +141,6 @@ public interface MjonPayService { //누적 납부금액 조회 (후불회원이 사용금액을 실 납부한 금액 합산 - 미납 금액 제외한 총 합산 금액) public String selectTotSumPaymentAfterPay(String userId) throws Exception; + Map payUserSWList(MjonPayVO mjonPayVO) throws Exception; + } diff --git a/src/main/java/itn/let/mjo/pay/service/impl/MjonPayServiceImpl.java b/src/main/java/itn/let/mjo/pay/service/impl/MjonPayServiceImpl.java index 60c9e645..c0b3ebe9 100644 --- a/src/main/java/itn/let/mjo/pay/service/impl/MjonPayServiceImpl.java +++ b/src/main/java/itn/let/mjo/pay/service/impl/MjonPayServiceImpl.java @@ -12,6 +12,7 @@ import java.util.Date; import java.util.HashMap; import java.util.Iterator; import java.util.List; +import java.util.Map; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; @@ -25,11 +26,14 @@ import egovframework.rte.fdl.cmmn.EgovAbstractServiceImpl; import egovframework.rte.fdl.idgnr.EgovIdGnrService; import egovframework.rte.fdl.security.userdetails.util.EgovUserDetailsHelper; import itn.com.cmm.LoginVO; +import itn.com.cmm.util.DateUtils; import itn.com.cmm.util.MJUtil; import itn.com.utl.fcc.service.EgovStringUtil; import itn.let.mjo.event.service.MjonEventVO; import itn.let.mjo.event.service.impl.MjonEventDAO; import itn.let.mjo.msg.service.MjonMsgVO; +import itn.let.mjo.msgcampain.service.MjonCandidateVO; +import itn.let.mjo.msgcampain.service.impl.MjonCandidateDAO; import itn.let.mjo.msgdata.service.MjonMsgDataService; import itn.let.mjo.msgdata.service.impl.MjonMsgDataDAO; import itn.let.mjo.pay.service.MjonPayService; @@ -94,6 +98,10 @@ public class MjonPayServiceImpl extends EgovAbstractServiceImpl implements MjonP @Resource(name = "mberGrdService") MberGrdService mberGrdService; + @Resource(name="mjonCandidateDAO") + private MjonCandidateDAO mjonCandidateDAO; + + @Override public List selectPayList(MjonPayVO mjonPayVO) throws Exception { return mjonPayDAO.selectPayList(mjonPayVO); @@ -2839,6 +2847,99 @@ public class MjonPayServiceImpl extends EgovAbstractServiceImpl implements MjonP } + @Override + public Map payUserSWList(MjonPayVO mjonPayVO) throws Exception{ + + + String userId = mjonPayVO.getUserId(); + + // 총 사용금액 + List usedCashTotList = mjonPayDAO.selectUsedCashWithKakaoTotCnt(mjonPayVO); + + // 사용가능한 금액 + // mberManageVO.prePaymentYn 선불 후불 회원 구분으로 인해 select함 + MberManageVO mberManageVO = mjonMsgDataDAO.selectMberManageInfo(userId); + // 선거 후보자 정보 조회 + MjonCandidateVO mjonCandidateVO = new MjonCandidateVO(); + if("p".equals(mberManageVO.getDept())) { //개인회원 선거 후보자 정보 불러오기 + mjonCandidateVO = mjonCandidateDAO.selectCandidateDataInfo(userId); + if(mjonCandidateVO != null) { + mjonCandidateVO.setRegidentNo1(egovCryptoUtil.decrypt(mjonCandidateVO.getRegidentNo1())); + mjonCandidateVO.setRegidentNo2(egovCryptoUtil.decrypt(mjonCandidateVO.getRegidentNo2())); + } + } + + + /** + * 후불제 회원 관련 사용 요금 내역 정보 조회하기 + * 20231228 우영두 추가 + * 누적사용금액, 누적 납부금액, 당월 납부 예상금액 정보 조회 + * + * */ + //누적 사용금액 조회 (캐시 테이블에서 현재까지 사용된 금액 합산 - 캐시 테이블에서 "-"로 사용된 금액만 합산) + String totSumCashAfterPay = mjonPayDAO.selectTotalSumCashForAfterPay(userId); + + //누적 사용 포인트 조회 (포인트 테이블에서 현재까지 사용된 포인트 합산 - 회원 포인트 정보 업데이트시 사용되는 쿼리 이용) + String totSumPointAfterPay = mjonPayDAO.selectTotalSumPointForAfterPay(userId); + + //누적 납부금액 조회 (후불회원이 사용금액을 실 납부한 금액 합산 - 미납 금액 제외한 총 합산 금액) + String totSumPaymentAfterPay = mjonPayDAO.selectTotSumPaymentAfterPay(userId); + + //누적 납부 포인트 조회 ( 누적 납부금액 합산에 대한 2% 포인트 정보 계산) + float p_i_re_point = 0; + JoinSettingVO sysJoinSetVO = mjonMsgDataService.selectJoinSettingInfo(); + if (sysJoinSetVO != null) { + p_i_re_point = sysJoinSetVO.getPointPer(); + } + int paymentPointAfterPay = Math.round((Float.parseFloat(totSumPaymentAfterPay) * p_i_re_point / 100)); + + //당월 납부 예상금액 (누적 사용금액 합산 - 누적 납부금액 합산 정보 계산) + float unPaymentAfterPay = Float.parseFloat(totSumCashAfterPay) - Float.parseFloat(totSumPaymentAfterPay); + + //당월 납부 예상 포인트 (당월 납부 예상 금액에 대한 2% 포인트 정보 계산) + int unPaymentPointAfterPay = Math.round((unPaymentAfterPay * p_i_re_point / 100)); + + /* + * 2024.02.06 후불제 회원 중 협의단가를 사용하는 회원은 포인트 적립이 되지 않아야함. + * 후불제 협의 단가 여부 체크 + * 모든 협의 단가 금액을 합산하여 0보다 크면 협의단가 있음. + * */ + float shortPrice = mberManageVO.getShortPrice(); + float longPrice = mberManageVO.getLongPrice(); + float picturePrice = mberManageVO.getPicturePrice() + mberManageVO.getPicture2Price() + mberManageVO.getPicture3Price(); + float kakaoAtPrice = mberManageVO.getKakaoAtPrice(); + float kakaoFtPrice = mberManageVO.getKakaoFtPrice(); + float totPrice = shortPrice + longPrice + picturePrice + kakaoAtPrice + kakaoFtPrice; + String negoPriceYn = "N"; + + if(totPrice > 0) { + negoPriceYn = "Y"; + } + + + + Map returnData = new HashMap<>(); + + + returnData.put("usedCashTotList", usedCashTotList); + returnData.put("mberManageVO", mberManageVO); + returnData.put("mjonCandidateVO", mjonCandidateVO); + returnData.put("totSumCashAfterPay", totSumCashAfterPay); + returnData.put("totSumPointAfterPay", totSumPointAfterPay); + returnData.put("totSumPaymentAfterPay", totSumPaymentAfterPay); + returnData.put("sumPaymentPointAfterPay", paymentPointAfterPay); + returnData.put("unPaymentAfterPay", unPaymentAfterPay); + returnData.put("unPaymentPointAfterPay", unPaymentPointAfterPay); + returnData.put("negoPriceYn", negoPriceYn); + // 초기 날짜 셋팅 + returnData.put("startDate", DateUtils.getDateMonthsAgo(12)); + returnData.put("endDate", DateUtils.getCurrentDate()); + + + // TODO Auto-generated method stub + return returnData; + } + } diff --git a/src/main/java/itn/let/mjo/pay/web/MjonPayController.java b/src/main/java/itn/let/mjo/pay/web/MjonPayController.java index 80376b40..9d9ee3f0 100644 --- a/src/main/java/itn/let/mjo/pay/web/MjonPayController.java +++ b/src/main/java/itn/let/mjo/pay/web/MjonPayController.java @@ -2612,6 +2612,7 @@ public class MjonPayController { MberManageVO mberManageVO, RedirectAttributes redirectAttributes, HttpServletRequest request, ModelMap model) throws Exception{ + /*LoginVO loginVO = (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser();*/ LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null; @@ -2621,133 +2622,25 @@ public class MjonPayController { return "redirect:/web/user/login/login.do"; } String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId()); - mjonMsgVO.setUserId(userId); + mjonPayVO.setUserId(userId); - // 비즈니스 로직 부분 -// Map resultMap = mjonPayService.payUserSWList(mjonPayVO); - - - - - /* - { // 충전캐시 - String sumPayMoney = mjonPayService.selectAgentSumPayMoney(userId); - model.addAttribute("sumPayMoney", sumPayMoney); - } - - { // 충전포인트 - String sumPoint = mjonPayService.selectSumPoint(userId); - model.addAttribute("sumPoint", sumPoint); - } - */ - - { // 총 사용금액 - mjonPayVO.setUserId(userId); - List usedCashTotList = mjonPayService.selectUsedCashWithKakaoTotCnt(mjonPayVO); - model.addAttribute("usedCashTotList", usedCashTotList); - } - { // 사용가능한 금액 - // mberManageVO.prePaymentYn 선불 후불 회원 구분으로 인해 select함 - mberManageVO = mjonMsgDataService.selectMberManageInfo(userId); - model.addAttribute("mberManageVO", mberManageVO); - } - /* - { // 발송건수 - mjonMsgVO.setReserveYn("N"); - List sendTotList = mjonMsgService.selectWithKakaoSendTotCnt(mjonMsgVO); - model.addAttribute("sendTotList", sendTotList); - } - - { // 예약건수 - mjonMsgVO.setReserveYn("Y"); - List reservToList = mjonMsgService.selectWithKakaoSendTotCnt(mjonMsgVO); - model.addAttribute("reservToList", reservToList); - } - */ - {// 선거 후보자 정보 조회 - MjonCandidateVO mjonCandidateVO = new MjonCandidateVO(); - if("p".equals(mberManageVO.getDept())) { //개인회원 선거 후보자 정보 불러오기 - mjonCandidateVO = mjonCandidateService.selectCandidateDataInfo(userId); - if(mjonCandidateVO != null) { - mjonCandidateVO.setRegidentNo1(egovCryptoUtil.decrypt(mjonCandidateVO.getRegidentNo1())); - mjonCandidateVO.setRegidentNo2(egovCryptoUtil.decrypt(mjonCandidateVO.getRegidentNo2())); - } - } - model.addAttribute("mjonCandidateVO", mjonCandidateVO); - } - - - { - /** - * 후불제 회원 관련 사용 요금 내역 정보 조회하기 - * 20231228 우영두 추가 - * 누적사용금액, 누적 납부금액, 당월 납부 예상금액 정보 조회 - * - * */ - - //누적 사용금액 조회 (캐시 테이블에서 현재까지 사용된 금액 합산 - 캐시 테이블에서 "-"로 사용된 금액만 합산) - String totSumCashAfterPay = mjonPayService.selectTotalSumCashForAfterPay(userId); - model.addAttribute("totSumCashAfterPay", totSumCashAfterPay); - - //누적 사용 포인트 조회 (포인트 테이블에서 현재까지 사용된 포인트 합산 - 회원 포인트 정보 업데이트시 사용되는 쿼리 이용) - String totSumPointAfterPay = mjonPayService.selectTotalSumPointForAfterPay(userId); - model.addAttribute("totSumPointAfterPay", totSumPointAfterPay); - - //누적 납부금액 조회 (후불회원이 사용금액을 실 납부한 금액 합산 - 미납 금액 제외한 총 합산 금액) - String totSumPaymentAfterPay = mjonPayService.selectTotSumPaymentAfterPay(userId); - model.addAttribute("totSumPaymentAfterPay", totSumPaymentAfterPay); - - //누적 납부 포인트 조회 ( 누적 납부금액 합산에 대한 2% 포인트 정보 계산) - float p_i_re_point = 0; - JoinSettingVO sysJoinSetVO = mjonMsgDataService.selectJoinSettingInfo(); - if (sysJoinSetVO != null) { - p_i_re_point = sysJoinSetVO.getPointPer(); - } - int paymentPointAfterPay = Math.round((Float.parseFloat(totSumPaymentAfterPay) * p_i_re_point / 100)); - model.addAttribute("sumPaymentPointAfterPay", paymentPointAfterPay); - - //당월 납부 예상금액 (누적 사용금액 합산 - 누적 납부금액 합산 정보 계산) - - float unPaymentAfterPay = Float.parseFloat(totSumCashAfterPay) - Float.parseFloat(totSumPaymentAfterPay); - model.addAttribute("unPaymentAfterPay", unPaymentAfterPay); - - //당월 납부 예상 포인트 (당월 납부 예상 금액에 대한 2% 포인트 정보 계산) - int unPaymentPointAfterPay = Math.round((unPaymentAfterPay * p_i_re_point / 100)); - model.addAttribute("unPaymentPointAfterPay", unPaymentPointAfterPay); - - /* - * 2024.02.06 후불제 회원 중 협의단가를 사용하는 회원은 포인트 적립이 되지 않아야함. - * 후불제 협의 단가 여부 체크 - * 모든 협의 단가 금액을 합산하여 0보다 크면 협의단가 있음. - * */ - float shortPrice = mberManageVO.getShortPrice(); - float longPrice = mberManageVO.getLongPrice(); - float picturePrice = mberManageVO.getPicturePrice() + mberManageVO.getPicture2Price() + mberManageVO.getPicture3Price(); - float kakaoAtPrice = mberManageVO.getKakaoAtPrice(); - float kakaoFtPrice = mberManageVO.getKakaoFtPrice(); - float totPrice = shortPrice + longPrice + picturePrice + kakaoAtPrice + kakaoFtPrice; - String negoPriceYn = "N"; - - if(totPrice > 0) { - negoPriceYn = "Y"; - } - model.addAttribute("negoPriceYn", negoPriceYn); - - } - { - // 초기 날짜 셋팅 - model.addAttribute("startDate", DateUtils.getDateMonthsAgo(12)); - model.addAttribute("endDate", DateUtils.getCurrentDate()); - } - - - - - - +// // 비즈니스 로직 부분 + Map resultMap = mjonPayService.payUserSWList(mjonPayVO); + model.addAttribute("usedCashTotList", resultMap.get("usedCashTotList")); + model.addAttribute("mjonCandidateVO", resultMap.get("mjonCandidateVO")); + model.addAttribute("mberManageVO", resultMap.get("mberManageVO")); + model.addAttribute("totSumCashAfterPay", resultMap.get("totSumCashAfterPay")); + model.addAttribute("totSumPointAfterPay", resultMap.get("totSumPointAfterPay")); + model.addAttribute("totSumPaymentAfterPay", resultMap.get("totSumPaymentAfterPay")); + model.addAttribute("sumPaymentPointAfterPay", resultMap.get("sumPaymentPointAfterPay")); + model.addAttribute("unPaymentAfterPay", resultMap.get("unPaymentAfterPay")); + model.addAttribute("unPaymentPointAfterPay", resultMap.get("unPaymentPointAfterPay")); + model.addAttribute("negoPriceYn", resultMap.get("negoPriceYn")); + model.addAttribute("startDate", resultMap.get("startDate")); + model.addAttribute("endDate", resultMap.get("endDate")); return "/web/pay/PayUserSWList"; From 2bab96b9a625da47df51b397cf3ff9386702741d Mon Sep 17 00:00:00 2001 From: JIWOO Date: Mon, 9 Jun 2025 16:24:39 +0900 Subject: [PATCH 20/71] =?UTF-8?q?=EC=9D=B4=EC=A7=80=EC=9A=B0=20-=20?= =?UTF-8?q?=EC=9A=94=EA=B8=88=EC=82=AC=EC=9A=A9=EB=82=B4=EC=97=AD=20?= =?UTF-8?q?=EC=9E=91=EC=97=85=20=EC=A4=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../let/mjo/pay/service/MjonPayService.java | 4 + .../pay/service/impl/MjonPayServiceImpl.java | 28 + .../let/mjo/pay/web/MjonPayController.java | 33 +- .../WEB-INF/jsp/web/com/webCommonHeader.jsp | 2 +- .../webapp/WEB-INF/jsp/web/pay/BillPub.jsp | 2 +- .../webapp/WEB-INF/jsp/web/pay/PayGuide.jsp | 1734 ++++++++--------- .../webapp/WEB-INF/jsp/web/pay/PayList.jsp | 2 +- .../WEB-INF/jsp/web/pay/PayUserSWList.jsp | 4 +- .../webapp/WEB-INF/jsp/web/pay/PayView.jsp | 2 +- .../WEB-INF/jsp/web/user/mberInfoIndex.jsp | 2 +- 10 files changed, 914 insertions(+), 899 deletions(-) diff --git a/src/main/java/itn/let/mjo/pay/service/MjonPayService.java b/src/main/java/itn/let/mjo/pay/service/MjonPayService.java index 6b8ec71d..0e1f9e57 100644 --- a/src/main/java/itn/let/mjo/pay/service/MjonPayService.java +++ b/src/main/java/itn/let/mjo/pay/service/MjonPayService.java @@ -5,6 +5,8 @@ import java.util.Map; import javax.servlet.http.HttpServletRequest; +import itn.let.mjo.msg.service.MjonMsgVO; + public interface MjonPayService { List selectPayList(MjonPayVO mjonPayVO) throws Exception; @@ -142,5 +144,7 @@ public interface MjonPayService { public String selectTotSumPaymentAfterPay(String userId) throws Exception; Map payUserSWList(MjonPayVO mjonPayVO) throws Exception; + + Map payUserSWListAjax(MjonMsgVO mjonMsgVO) throws Exception; } diff --git a/src/main/java/itn/let/mjo/pay/service/impl/MjonPayServiceImpl.java b/src/main/java/itn/let/mjo/pay/service/impl/MjonPayServiceImpl.java index c0b3ebe9..0d0c5f9d 100644 --- a/src/main/java/itn/let/mjo/pay/service/impl/MjonPayServiceImpl.java +++ b/src/main/java/itn/let/mjo/pay/service/impl/MjonPayServiceImpl.java @@ -28,6 +28,7 @@ import egovframework.rte.fdl.security.userdetails.util.EgovUserDetailsHelper; import itn.com.cmm.LoginVO; import itn.com.cmm.util.DateUtils; import itn.com.cmm.util.MJUtil; +import itn.com.cmm.util.PayUtils; import itn.com.utl.fcc.service.EgovStringUtil; import itn.let.mjo.event.service.MjonEventVO; import itn.let.mjo.event.service.impl.MjonEventDAO; @@ -2940,6 +2941,33 @@ public class MjonPayServiceImpl extends EgovAbstractServiceImpl implements MjonP return returnData; } + @Override + public Map payUserSWListAjax(MjonMsgVO mjonMsgVO) throws Exception{ + + if("".equals(mjonMsgVO.getSearchSortCnd())){ //최초조회시 최신것 조회List + mjonMsgVO.setSearchSortCnd("regDate"); + mjonMsgVO.setSearchSortOrd("desc"); + } + + Map returnData = new HashMap<>(); + + // 검색 데이터가 없거나 + // 시작일자가 종료일자보다 이후이거나 + // 총 기간이 365일이 넘으면 현재일부터 365일 전 날짜를 넣어서 검색 + if(!DateUtils.dateChkAndValueChk(mjonMsgVO.getStartDate(),mjonMsgVO.getEndDate(), 12 )) { + mjonMsgVO.setStartDate(DateUtils.getDateMonthsAgo(12)); + mjonMsgVO.setEndDate(DateUtils.getCurrentDate()); + + }; + + + List payUserSWList = mjonMsgDataDAO.selectPayUserSWList(mjonMsgVO); + returnData.put("payUserSWList", payUserSWList); + returnData.put("totCnt", payUserSWList.size()> 0 ? payUserSWList.get(0).getTotCnt() : 0); + returnData.put("totSuccSendPrice", payUserSWList.size() > 0 ? PayUtils.getTrimToFirstDecimal(payUserSWList.get(0).getTotSuccSendPrice()) : 0); + + return returnData; + } } diff --git a/src/main/java/itn/let/mjo/pay/web/MjonPayController.java b/src/main/java/itn/let/mjo/pay/web/MjonPayController.java index 9d9ee3f0..52c8c859 100644 --- a/src/main/java/itn/let/mjo/pay/web/MjonPayController.java +++ b/src/main/java/itn/let/mjo/pay/web/MjonPayController.java @@ -2603,10 +2603,10 @@ public class MjonPayController { * 2023.12.22 우영두 * @param mjonMsgVO * @param model - * @return "/web/member/pay/PayUserSWList.do" + * @return "/web/member/pay/payUserSWList.do" * @throws Exception */ - @RequestMapping(value= {"/web/member/pay/PayUserSWList.do"}) + @RequestMapping(value= {"/web/member/pay/payUserSWList.do"}) public String payUserSWList(@ModelAttribute("mjonMsgVO") MjonMsgVO mjonMsgVO, MjonPayVO mjonPayVO, MberManageVO mberManageVO, RedirectAttributes redirectAttributes, @@ -2659,8 +2659,8 @@ public class MjonPayController { * @return "/web/member/pay/PayUserSWListAjax.do" * @throws Exception */ - @RequestMapping(value= {"/web/member/pay/PayUserSWListAjax.do"}) - public String PayUserSWListAjax(@ModelAttribute("searchVO") MjonMsgVO mjonMsgVO, + @RequestMapping(value= {"/web/member/pay/payUserSWListAjax.do"}) + public String payUserSWListAjax(@ModelAttribute("searchVO") MjonMsgVO mjonMsgVO, HttpServletRequest request, ModelMap model) throws Exception{ @@ -2684,29 +2684,12 @@ public class MjonPayController { mjonMsgVO.setLastIndex(paginationInfo.getLastRecordIndex()); mjonMsgVO.setRecordCountPerPage(paginationInfo.getRecordCountPerPage()); - if("".equals(mjonMsgVO.getSearchSortCnd())){ //최초조회시 최신것 조회List - mjonMsgVO.setSearchSortCnd("regDate"); - mjonMsgVO.setSearchSortOrd("desc"); - } + Map resultMap = mjonPayService.payUserSWListAjax(mjonMsgVO); - // 검색 데이터가 없거나 - // 시작일자가 종료일자보다 이후이거나 - // 총 기간이 365일이 넘으면 현재일부터 365일 전 날짜를 넣어서 검색 - if(!DateUtils.dateChkAndValueChk(mjonMsgVO.getStartDate(),mjonMsgVO.getEndDate(), 12 )) { - - mjonMsgVO.setStartDate(DateUtils.getDateMonthsAgo(12)); - mjonMsgVO.setEndDate(DateUtils.getCurrentDate()); - - }; - - List payUserSWList = mjonMsgDataService.selectPayUserSWList(mjonMsgVO); - - paginationInfo.setTotalRecordCount(payUserSWList.size()> 0 ? payUserSWList.get(0).getTotCnt() : 0); + paginationInfo.setTotalRecordCount((int)resultMap.get("totCnt")); model.addAttribute("paginationInfo", paginationInfo); - model.addAttribute("payUserSWList", payUserSWList); - - model.addAttribute("totSuccSendPrice", payUserSWList.size() > 0 ? PayUtils.getTrimToFirstDecimal(payUserSWList.get(0).getTotSuccSendPrice()) : 0); - + model.addAttribute("payUserSWList", resultMap.get("payUserSWList")); + model.addAttribute("totSuccSendPrice", resultMap.get("totSuccSendPrice")); model.addAttribute("mjonMsgVO", mjonMsgVO); diff --git a/src/main/webapp/WEB-INF/jsp/web/com/webCommonHeader.jsp b/src/main/webapp/WEB-INF/jsp/web/com/webCommonHeader.jsp index d5a05e8c..76a77e52 100644 --- a/src/main/webapp/WEB-INF/jsp/web/com/webCommonHeader.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/com/webCommonHeader.jsp @@ -1652,7 +1652,7 @@ function actionLogin_end(){
      • 요금안내/견적내기
      • 결제하기
      • 요금 결제내역
      • -
      • 요금 사용내역
      • +
      • 요금 사용내역
      • <%--
      • 계산서/현금영수증 발행 등록
      • --%>
      • 세금계산서 발행
      • diff --git a/src/main/webapp/WEB-INF/jsp/web/pay/BillPub.jsp b/src/main/webapp/WEB-INF/jsp/web/pay/BillPub.jsp index e0bd2890..5550f43f 100644 --- a/src/main/webapp/WEB-INF/jsp/web/pay/BillPub.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/pay/BillPub.jsp @@ -495,7 +495,7 @@
      • -
      • +
      diff --git a/src/main/webapp/WEB-INF/jsp/web/pay/PayGuide.jsp b/src/main/webapp/WEB-INF/jsp/web/pay/PayGuide.jsp index 7756c219..0cedbb59 100644 --- a/src/main/webapp/WEB-INF/jsp/web/pay/PayGuide.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/pay/PayGuide.jsp @@ -1,867 +1,867 @@ -<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> -<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> - - - - - - - - - - - - - -
      - -
      - -
        -
      • -
      • -
      • -
      • -
      • -
      - - -
      -
      -

      요금안내/견적내기

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

      - 문자이미지 문자 -

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

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

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

      팩스 아이콘 이미지 팩스

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

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

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

      일반정보

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

      품목정보

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

      -
      건수 - - -

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

      요금안내/견적내기

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

      + 문자이미지 문자 +

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

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

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

      팩스 아이콘 이미지 팩스

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

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

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

      일반정보

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

      품목정보

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

      +
      건수 + + +

      +
      + +
      +
      +
      +
      + +
      +
      + +
      + +
      +
      + + +
      +
      품목
      +
      단가(원)
      +
      건수(건)
      +
      공급가액(원)
      +
      세액(부가세)
      +
      금액(원)
      +
      + +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      + +
      + + + + + + + + + + + + + + + + + + + + + + + +
      공급가액세액(부가세)합계비고
      + + + + + + + + +
      +
      + +
      + +
      +
      +
      + +
      +
      + +
      + +
      +
      + +
      diff --git a/src/main/webapp/WEB-INF/jsp/web/pay/PayList.jsp b/src/main/webapp/WEB-INF/jsp/web/pay/PayList.jsp index 2c639a47..20f11eee 100644 --- a/src/main/webapp/WEB-INF/jsp/web/pay/PayList.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/pay/PayList.jsp @@ -176,7 +176,7 @@ function fnShowRefundPrintPopup(){
    • -
    • +
    • diff --git a/src/main/webapp/WEB-INF/jsp/web/pay/PayUserSWList.jsp b/src/main/webapp/WEB-INF/jsp/web/pay/PayUserSWList.jsp index 49b9dbdf..18cb4215 100644 --- a/src/main/webapp/WEB-INF/jsp/web/pay/PayUserSWList.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/pay/PayUserSWList.jsp @@ -75,7 +75,7 @@ function payUserListAjax(pageNo){ document.listForm.pageIndex.value = pageNo; var sendData= $(document.listForm).serializeArray(); - $("#payUserListLoad").load("/web/member/pay/PayUserSWListAjax.do", sendData ,function(response, status, xhr){ + $("#payUserListLoad").load("/web/member/pay/payUserSWListAjax.do", sendData ,function(response, status, xhr){ }); } @@ -85,7 +85,7 @@ function payUserListTabMoveAjax(pageNo){ document.listForm.pageIndex.value = pageNo; var sendData= $(document.listForm).serializeArray(); - $("#payUserListLoad").load("/web/member/pay/PayUserSWListAjax.do", sendData ,function(response, status, xhr){ + $("#payUserListLoad").load("/web/member/pay/payUserSWListAjax.do", sendData ,function(response, status, xhr){ }); } diff --git a/src/main/webapp/WEB-INF/jsp/web/pay/PayView.jsp b/src/main/webapp/WEB-INF/jsp/web/pay/PayView.jsp index 29591d82..cb8a4d4f 100644 --- a/src/main/webapp/WEB-INF/jsp/web/pay/PayView.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/pay/PayView.jsp @@ -817,7 +817,7 @@ function fnShowVaViewPrintPopup() {
    • -
    • +
    • diff --git a/src/main/webapp/WEB-INF/jsp/web/user/mberInfoIndex.jsp b/src/main/webapp/WEB-INF/jsp/web/user/mberInfoIndex.jsp index 4db78d99..908dfcba 100644 --- a/src/main/webapp/WEB-INF/jsp/web/user/mberInfoIndex.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/user/mberInfoIndex.jsp @@ -669,7 +669,7 @@ function callTo() { -
      From 2d824883c8118614505ddd8b88d284f308a7be7b Mon Sep 17 00:00:00 2001 From: "hehihoho3@gmail.com" Date: Thu, 12 Jun 2025 14:54:53 +0900 Subject: [PATCH 21/71] =?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

      '; 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 64/71] =?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 65/71] =?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){ From 47b8d7668a360ed695274d004c289651b21ce5c4 Mon Sep 17 00:00:00 2001 From: JIWOO Date: Thu, 7 Aug 2025 17:12:15 +0900 Subject: [PATCH 66/71] =?UTF-8?q?=EC=9D=B4=EC=A7=80=EC=9A=B0=20-=20?= =?UTF-8?q?=EC=82=AC=EC=9A=A9=EB=82=B4=EC=97=AD=20=EB=82=B4=20=EC=95=8C?= =?UTF-8?q?=EB=A6=BC=ED=86=A1=20=EC=83=81=EC=84=B8=20=ED=8C=9D=EC=97=85=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 --- .../web/kakao/sent/KakaoSentDetailPopAjax.jsp | 123 ++++++++++-------- 1 file changed, 68 insertions(+), 55 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 c79bc2e8..ef53badc 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,53 +21,64 @@
      -

      -
      -
      - +
      + + 발송일시 : + - 알림톡 도착 - 친구톡 도착 + 알림톡 + 친구톡 -
      -
      - - -

      -

      -
      - -
      - -
      -
      -
      - -

      - -

      - - - -

      -
      - -

      -
      -
      - - - - - - - - - - - -
      + +
      +
      +
      +
      + + + 알림톡 도착 + 친구톡 도착 + +
      +
      + + +

      +

      +
      + +
      + +
      +
      +
      + +

      + +

      + + + +

      +
      + +

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

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

      @@ -81,33 +92,35 @@