From 385bd551c6737ee9160980221895bfe16145f907 Mon Sep 17 00:00:00 2001 From: JIWOO Date: Thu, 28 Aug 2025 16:40:25 +0900 Subject: [PATCH] =?UTF-8?q?=EC=9D=B4=EC=A7=80=EC=9A=B0=20-=20=EA=B4=80?= =?UTF-8?q?=EB=A6=AC=EC=9E=90=20>=20=EC=B9=B4=EC=B9=B4=EC=98=A4=ED=86=A1?= =?UTF-8?q?=20=EC=A0=84=EC=86=A1=EB=A6=AC=EC=8A=A4=ED=8A=B8=20>=20?= =?UTF-8?q?=EC=B9=9C=EA=B5=AC=ED=86=A1=20=EC=83=81=EC=84=B8=ED=99=94?= =?UTF-8?q?=EB=A9=B4=20>=20=EB=AF=B8=EB=A6=AC=EB=B3=B4=EA=B8=B0=20?= =?UTF-8?q?=ED=8C=9D=EC=97=85=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/kakaoAt/service/MjonKakaoATVO.java | 23 +- .../kakaoFt/web/MjonKakaoFTController.java | 162 +++++- .../let/kakao/kakaoComm/KakaoButtonVO.java | 1 + .../let/kakao/kakaoComm/KakaoReturnVO.java | 2 + .../let/mjo/kakao/KakaoSent_SQL_Mysql.xml | 4 + .../uss/ion/kakaoat/SendKakaoATDetailList.jsp | 6 +- .../jsp/uss/ion/kakaoat/SendKakaoATModify.jsp | 57 +- .../popup/KakaoFTTemplateDetailPop.jsp | 501 ++++++++++++++++++ 8 files changed, 729 insertions(+), 27 deletions(-) create mode 100644 src/main/webapp/WEB-INF/jsp/uss/ion/kakaoft/popup/KakaoFTTemplateDetailPop.jsp 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 712e0b9..013a5b9 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 @@ -30,6 +30,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; // '카카오 알림톡에 등록된 사용자 고유키', @@ -153,6 +154,9 @@ public class MjonKakaoATVO extends ComDefaultVO{ private String yellowId; private String bizKakaoResendTypeCnt; + private String adFlag; + + private String senderKey = ""; // 발신프로필 키 public String getMsgDiv() { return msgDiv; @@ -1287,7 +1291,24 @@ public class MjonKakaoATVO extends ComDefaultVO{ public void setBizKakaoResendTypeCnt(String bizKakaoResendTypeCnt) { this.bizKakaoResendTypeCnt = bizKakaoResendTypeCnt; } - + public String getContents() { + return contents; + } + public void setContents(String contents) { + this.contents = contents; + } + public String getSenderKey() { + return senderKey; + } + public void setSenderKey(String senderKey) { + this.senderKey = senderKey; + } + public String getAdFlag() { + return adFlag; + } + public void setAdFlag(String adFlag) { + this.adFlag = adFlag; + } } diff --git a/src/main/java/itn/let/kakao/admin/kakaoFt/web/MjonKakaoFTController.java b/src/main/java/itn/let/kakao/admin/kakaoFt/web/MjonKakaoFTController.java index e2498ee..c89eb47 100644 --- a/src/main/java/itn/let/kakao/admin/kakaoFt/web/MjonKakaoFTController.java +++ b/src/main/java/itn/let/kakao/admin/kakaoFt/web/MjonKakaoFTController.java @@ -6,6 +6,9 @@ import java.util.List; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; +import org.json.simple.JSONArray; +import org.json.simple.JSONObject; +import org.json.simple.parser.JSONParser; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.ui.ModelMap; @@ -18,12 +21,17 @@ import egovframework.rte.ptl.mvc.tags.ui.pagination.PaginationInfo; import itn.com.cmm.LoginVO; import itn.com.cmm.service.FileVO; import itn.com.cmm.util.StringUtil; +import itn.com.cmm.util.StringUtil2; import itn.let.kakao.admin.kakaoAt.service.ChannelIDVO; +import itn.let.kakao.admin.kakaoAt.service.MjonKakaoATVO; import itn.let.kakao.admin.kakaoFt.service.MjonKakaoFTService; import itn.let.kakao.admin.kakaoFt.service.MjonKakaoFTVO; +import itn.let.kakao.kakaoComm.KakaoButtonVO; +import itn.let.kakao.kakaoComm.KakaoReturnVO; import itn.let.kakao.kakaoComm.KakaoVO; import itn.let.kakao.kakaoComm.kakaoApi.service.KakaoApiService; import itn.let.kakao.user.kakaoFt.service.KakaoFriendsTalkTemplateService; +import itn.let.kakao.user.sent.service.KakaoSentService; import itn.let.mjo.msg.service.MjonMsgResultCodeVO; import itn.let.mjo.msg.service.MjonMsgService; import itn.let.mjo.reservmsg.service.MjonReservMsgService; @@ -65,6 +73,8 @@ public class MjonKakaoFTController { @Resource(name = "kakaoApiService") private KakaoApiService kakaoApiService; + @Resource(name = "KakaoSentService") + private KakaoSentService kakaoSentService; /* @Resource(name = "EgovCmmUseService") private EgovCmmUseService cmmUseService; @@ -814,7 +824,40 @@ public class MjonKakaoFTController { } */ - + /** + * MSG_IG별 친구톡 템플릿 상세내용 팝업화면 관리자페이지 + * @param ChannelIDVO + * @param request + * @param model + * @return + * @throws Exception + */ + @RequestMapping("/uss/ion/kakaoft/KakaoFTTemplateDetailPopupAjax.do") + public String KakaoFTTemplateDetailPopupAjax(@ModelAttribute("searchVO") MjonKakaoATVO mjonKakaoATVO, + HttpServletRequest request , + ModelMap model) throws Exception { + + + try { + + LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null; + String id = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId()); + if(id == "") { + return "redirect:/uat/uia/EgovLoginUsr.do"; + } + MjonKakaoATVO mjonKakaoATResultVO = kakaoSentService.selectKakaoSentDetailDataAjax(mjonKakaoATVO); + mjonKakaoATResultVO.setSmsTxt(StringUtil2.replaceBR(mjonKakaoATResultVO.getSmsTxt())); + model.addAttribute("resultMsgDetail", mjonKakaoATResultVO); + + KakaoReturnVO kakaoTemplateInfo = getKakaoFTSendTemplateInfo(mjonKakaoATResultVO); + model.addAttribute("kakaoTemplateInfo", kakaoTemplateInfo); + + } catch (Exception e) { + System.out.println("KakaoFTTemplateDetailPopupAjax Contrller Error ::: " + e); + } + + return "uss/ion/kakaoft/popup/KakaoFTTemplateDetailPop"; + } //파일 이름을 이용하여 첨부파일 아이디(atchFileId), 첨부파일 순번(fileExtsn)을 찾는 함수 private FileVO getFilePathToAtchFileId(String filePath) throws Exception{ @@ -837,4 +880,121 @@ public class MjonKakaoFTController { return returnFileVO; } + + public KakaoReturnVO getKakaoFTSendTemplateInfo(MjonKakaoATVO kakaoATVO) throws Exception { + + KakaoReturnVO returnVO = new KakaoReturnVO(); + try { + + String jsonContents = kakaoATVO.getContents(); + + //친구톡 이미지 또는 버튼 정보가 있다면 실행 + if(jsonContents != null && jsonContents.length() > 0) { + + /*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(jsonContents); + JSONObject object = (JSONObject) obj; + + String image = (object.get("image") == null) ? null : object.get("image").toString(); + String button = (object.get("button") == null) ? null : object.get("button").toString(); + + if(image != null) { + + Object imagObj = parser.parse(image); + JSONObject jsonImgObj = (JSONObject) imagObj; + + System.out.println(jsonImgObj.toJSONString()); + + String imgUrl = (jsonImgObj.get("img_url") == null) ? null : jsonImgObj.get("img_url").toString(); + String imgLink = (jsonImgObj.get("img_link") == null) ? null : jsonImgObj.get("img_link").toString(); + + System.out.println(imgUrl); + + returnVO.setTemplateEmphasizeType("IMAGE"); + returnVO.setTemplateImageUrl(imgUrl); + returnVO.setTemplateImageLink(imgLink); + + } + + if(button != null) { + + JSONArray buttonJsonList = (JSONArray) object.get("button"); + + System.out.println(buttonJsonList.size()); + + List buttonList = new ArrayList(); + + for(int i=0; i < buttonJsonList.size(); i++) { + + JSONObject itemInfo = (JSONObject)buttonJsonList.get(i); + + String name = itemInfo.get("name").toString(); + + System.out.println(name); + + KakaoButtonVO buttonVO = new KakaoButtonVO(); + + buttonVO.setName(name); + + + //버튼 링크 처리 + String type = (String) itemInfo.get("type"); + String link = ""; + + switch(type) { + case "WL": //웹링크 + link = (String) itemInfo.get("url_mobile"); + if (link == null || link.isEmpty()) { + link = (String) itemInfo.get("url_pc"); + } + break; + case "AL": //앱링크 + link = (String) itemInfo.get("scheme_android"); + if (link == null || link.isEmpty()) { + link = (String) itemInfo.get("scheme_ios"); + } + break; + default: + break; + } + + if(link != null && !link.isEmpty()) { + buttonVO.setLink(link); + + } + buttonList.add(buttonVO); + + } + + + returnVO.setButtonList(buttonList); + + for(KakaoButtonVO butVO : returnVO.getButtonList()) { + + System.out.println("+++++++++++++ btn name ::: "+butVO.getName()); + + } + + } + + } + + //친구톡 내용 셋팅 + returnVO.setTemplateContent(kakaoATVO.getSmsTxt()); + + } catch (Exception e) { + e.printStackTrace(); + } + + return returnVO; + + } } \ No newline at end of file diff --git a/src/main/java/itn/let/kakao/kakaoComm/KakaoButtonVO.java b/src/main/java/itn/let/kakao/kakaoComm/KakaoButtonVO.java index 759f341..cfd4838 100644 --- a/src/main/java/itn/let/kakao/kakaoComm/KakaoButtonVO.java +++ b/src/main/java/itn/let/kakao/kakaoComm/KakaoButtonVO.java @@ -24,5 +24,6 @@ public class KakaoButtonVO { private String linkMo = ""; // 모바일 웹 링크 주소 (WL 사용시 필수) private String linkPc = ""; // PC 웹 링크 주소 (WL 사용시 선택) private String pluginId = ""; // 플러그인 ID (P1, P2, P3 사용시 필수) + private String link = ""; // 링크 통합 처리 } diff --git a/src/main/java/itn/let/kakao/kakaoComm/KakaoReturnVO.java b/src/main/java/itn/let/kakao/kakaoComm/KakaoReturnVO.java index 05cba63..81ff5ab 100644 --- a/src/main/java/itn/let/kakao/kakaoComm/KakaoReturnVO.java +++ b/src/main/java/itn/let/kakao/kakaoComm/KakaoReturnVO.java @@ -83,6 +83,8 @@ public class KakaoReturnVO extends ComDefaultVO{ private String templateImageUrl = ""; // 템플릿 이미지 링크 - templateEmphasizeType “IMAGE” 선택 시 필수 + private String templateImageLink = ""; // 템플릿 이미지 클릭 링크 + private String templateTitle = ""; // 템플릿 내용 중 강조 표기할 핵심 정보 - templateEmphasizeType “TEXT” 선택 시 필수 private String templateSubtitle = ""; // 템플릿 강조 표기 보조 문 - templateEmphasizeType “TEXT” 선택 시 필수 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 22b1420..0ddadde 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 @@ -934,9 +934,13 @@ , MD.BIZ_KAKAO_RESEND_DATA as bizKakaoResendData /* 대체 문자 (치환O) */ , MGD.BIZ_KAKAO_RESEND_ORGNL_TXT as bizKakaoResendOrgnlTxt /* 대체 문자( 치환X ) */ , MD.BIZ_KAKAO_JSON_FILE as bizKakaoJsonFile /* Json 파일 경로 */ + , BA.CONTENTS as contents + , MGD.AD_FLAG as adFlag FROM MJ_MSG_GROUP_DATA MGD INNER JOIN MJ_MSG_DATA MD ON MGD.MSG_GROUP_ID = MD.MSG_GROUP_ID + LEFT JOIN BIZ_ATTACHMENTS BA + ON MD.BIZ_KAKAO_JSON_FILE = BA.MSG_KEY AND MGD.USER_ID = MD.USER_ID WHERE MGD.USER_ID = #userId# diff --git a/src/main/webapp/WEB-INF/jsp/uss/ion/kakaoat/SendKakaoATDetailList.jsp b/src/main/webapp/WEB-INF/jsp/uss/ion/kakaoat/SendKakaoATDetailList.jsp index f813c8e..e3f7dc3 100644 --- a/src/main/webapp/WEB-INF/jsp/uss/ion/kakaoat/SendKakaoATDetailList.jsp +++ b/src/main/webapp/WEB-INF/jsp/uss/ion/kakaoat/SendKakaoATDetailList.jsp @@ -28,7 +28,7 @@ -알림톡전송리스트(상세) +카톡전송리스트(상세) + + + + + + + + + + + + + + + +
+ +
+ +
+ +
+
+

카카오 친구톡 상세보기

+
+
+
+ + + +
+ <%--
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
채널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" %> + +
+
+
+ +
+
+ + +
+
+
버튼 + + +
+ + + +
+
배송조회
+
+ + +

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

+
+
+ +
+
+
+ + + +
+
웹링크
+
+
    +
  • + + +
  • +
  • + +
  • +
  • + +
  • +
+
+
+ +
+
+
+ + + +
+
앱링크
+
+
    +
  • + + +
  • +
  • + +
  • +
  • + +
  • +
+
+
+ +
+
+
+ + + +
+
봇키워드
+
+ + +
+
+ +
+
+
+ + + +
+
메시지전달
+
+ + +
+
+ +
+
+
+ + + +
+
상담톡전환
+
+ + +
+
+ +
+
+
+ + + +
+
챗봇전환
+
+ + +
+
+ +
+
+
+
+
+
+
--%> +
+
+
+

+ +

+ +
+

+ + (광고) + +

+ + +

+

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

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

수신거부 : 홈 > 채널차단

+
+ +
+ +
+

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

+

+
+
+
+
+
+ +
+ + \ No newline at end of file