From eb1d385d15aa4946741f95d14c33a79d1465d158 Mon Sep 17 00:00:00 2001 From: rosewiper Date: Wed, 17 Jan 2024 16:09:32 +0900 Subject: [PATCH] =?UTF-8?q?=EC=B9=9C=EA=B5=AC=ED=86=A1=20=EB=B0=9C?= =?UTF-8?q?=EC=86=A1=20=EC=B2=98=EB=A6=AC=201=EC=B0=A8=20=EA=B0=9C?= =?UTF-8?q?=EB=B0=9C=20=EC=99=84=EB=A3=8C=20=20-=20json=20=ED=8C=8C?= =?UTF-8?q?=EC=9D=BC=20=EC=83=9D=EC=84=B1=20=EC=A0=9C=EC=99=B8=20=EC=A0=84?= =?UTF-8?q?=EC=86=A1=20=EB=B6=80=EB=B6=84=20=EC=99=84=EB=A3=8C=20=20-=20?= =?UTF-8?q?=ED=99=98=EB=B6=88=20=EC=B2=98=EB=A6=AC=20=EB=AF=B8=20=EC=A0=81?= =?UTF-8?q?=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../let/kakao/kakaoComm/KakaoSendUtil.java | 215 ++++++++++++ .../kakaoAt/service/KakaoAlimTalkService.java | 3 + .../impl/KakaoAlimTalkServiceImpl.java | 261 ++++++++++++++ .../web/KakaoFriendsTalkSendController.java | 322 ++++++++++++++++-- .../kakao/include/KaKaoAlimtalkTopMenuTap.jsp | 8 +- .../ft/KakaoFriendsTalkMsgDataView.jsp | 67 +++- 6 files changed, 838 insertions(+), 38 deletions(-) diff --git a/src/main/java/itn/let/kakao/kakaoComm/KakaoSendUtil.java b/src/main/java/itn/let/kakao/kakaoComm/KakaoSendUtil.java index fd701f62..c48c9030 100644 --- a/src/main/java/itn/let/kakao/kakaoComm/KakaoSendUtil.java +++ b/src/main/java/itn/let/kakao/kakaoComm/KakaoSendUtil.java @@ -150,6 +150,134 @@ public class KakaoSendUtil { return kakaoVO; } + + /** + * @Method Name : kakaoFTSendPrice + * @작성일 : 2024. 1. 17. + * @작성자 : WYH + * @Method 설명 : 카카오 친구톡 전송 가격 설정 + */ + public KakaoVO kakaoFTSendPrice(KakaoVO kakaoVO) throws Exception { + + //사용자 현재 보유 금액 불러오기(문자 발송 금액 차감 이전 금액) + String befCash = kakaoVO.getBefCash(); + + //VO에서 현재 보유금액이 없으면 디비에서 조회해서 불러옴 + if("".equals(befCash) || befCash == null) { + + } + MjonMsgVO mjonMsgVO = new MjonMsgVO(); + mjonMsgVO.setUserId(kakaoVO.getUserId()); + String userMoney = mjonMsgDataService.selectBeforeCashData(mjonMsgVO); + String userPoint = mjonMsgDataService.selectBeforePointData(mjonMsgVO); + + //1.시스템 기본 단가 정보 불러오기 + JoinSettingVO sysJoinSetVO = mjonMsgDataService.selectJoinSettingInfo(); + + //2.사용자 개인 단가 정보 불러오기 + MberManageVO mberManageVO = mjonMsgDataService.selectMberManageInfo(kakaoVO.getUserId()); + Float kakaoFtPrice = mberManageVO.getKakaoFtPrice(); + + /** 대체문자 여부 체크(있으면 대체문자 가격으로 없으면 카카오톡 가격으로) */ + //대체문자 발송 여부 확인 + if(kakaoVO.getSubMsgSendYn().equals("Y")) { + + + String charset = "euc-kr"; //문자 바이트 계산에 필요한 캐릭터 셋 : 한글 2Byte로 계산 + int callToCnt = kakaoVO.getCallToList().length; + String sendType = ""; + + for(int count =0; count < callToCnt; count++) { + String tempSubMagTxt = kakaoVO.getSubMsgTxt().replace("\r\n", "\n"); + if(kakaoVO.getSubMsgTxtReplYn().equals("Y")) { + tempSubMagTxt = kakaoFTSubMagTxtRepl(tempSubMagTxt, kakaoVO, count); + } + int bytes = tempSubMagTxt.getBytes(charset).length; + + if(bytes < 2000) { + if(bytes > 90) { + sendType = "MMS"; + break; + }else { + sendType = "SMS"; + } + }else { + kakaoVO.setResultCode("2000"); + return kakaoVO; + } + } + + if(sendType.equals("MMS")) { + //협의 단가가 없으면 시스템 단가로 지정 + if(mberManageVO.getLongPrice() < 1) { + kakaoFtPrice = sysJoinSetVO.getLongPrice(); + + kakaoVO.setSmsPrice(sysJoinSetVO.getShortPrice()); + kakaoVO.setMmsPrice(sysJoinSetVO.getLongPrice()); + kakaoVO.setKakaoFtPrice(sysJoinSetVO.getKakaoFtPrice()); + }else { + kakaoFtPrice = mberManageVO.getLongPrice(); + + kakaoVO.setSmsPrice(mberManageVO.getShortPrice()); + kakaoVO.setMmsPrice(mberManageVO.getLongPrice()); + + if(mberManageVO.getKakaoFtPrice() < 1) { + kakaoVO.setKakaoFtPrice(sysJoinSetVO.getKakaoFtPrice()); + }else { + kakaoVO.setKakaoFtPrice(mberManageVO.getKakaoFtPrice()); + } + } + }else { + //협의 단가가 없으면 시스템 단가로 지정 + if(mberManageVO.getShortPrice() < 1) { + kakaoFtPrice = sysJoinSetVO.getShortPrice(); + + kakaoVO.setSmsPrice(sysJoinSetVO.getShortPrice()); + kakaoVO.setMmsPrice(sysJoinSetVO.getLongPrice()); + kakaoVO.setKakaoFtPrice(sysJoinSetVO.getKakaoFtPrice()); + }else { + kakaoFtPrice = mberManageVO.getShortPrice(); + + kakaoVO.setSmsPrice(mberManageVO.getShortPrice()); + kakaoVO.setMmsPrice(mberManageVO.getLongPrice()); + + if(mberManageVO.getKakaoFtPrice() < 1) { + kakaoVO.setKakaoFtPrice(sysJoinSetVO.getKakaoFtPrice()); + }else { + kakaoVO.setKakaoFtPrice(mberManageVO.getKakaoFtPrice()); + } + } + } + }else { + + if(kakaoFtPrice < 1) { //협의 단가가 없으면 시스템 단가로 지정 + kakaoFtPrice = sysJoinSetVO.getKakaoFtPrice(); + + kakaoVO.setSmsPrice(sysJoinSetVO.getShortPrice()); + kakaoVO.setMmsPrice(sysJoinSetVO.getLongPrice()); + kakaoVO.setKakaoFtPrice(sysJoinSetVO.getKakaoFtPrice()); + }else { + kakaoVO.setSmsPrice(mberManageVO.getShortPrice()); + kakaoVO.setMmsPrice(mberManageVO.getLongPrice()); + kakaoVO.setKakaoFtPrice(mberManageVO.getKakaoFtPrice()); + } + } + + /** 전송인원 확인*/ + int totCallCnt = kakaoVO.getCallToList().length; + Float kakaoTotPrice = totCallCnt * kakaoFtPrice; // 총결제 금액 = 총 전송수량 * 카카오 친구톡 단가 + String totPrice = kakaoTotPrice.toString(); + System.out.println("@@@@@@@ : "+kakaoTotPrice +" = "+totCallCnt+" * "+kakaoFtPrice); + + kakaoVO.setEachPrice(kakaoFtPrice.toString()); + kakaoVO.setBefCash(userMoney); // 고객 충전금액 + kakaoVO.setBefPoint(userPoint); // 고객 충전 포인트 + kakaoVO.setTotPrice(totPrice); // 총 카카오 전송 금액 + + return kakaoVO; + } + + /** * @methodName : selectSendPriceOfKakaoAtAndSmsAndMms * @author : 이호영 @@ -287,6 +415,84 @@ public class KakaoSendUtil { return kakaoVO; } + + /** + * @Method Name : kakaoFTSendMsg + * @작성일 : 2024. 1. 17. + * @작성자 : 우영두 + * @Method 설명 : 카카오 친톡 전송 메세지 설정 + */ + public KakaoVO kakaoFTSendMsg(KakaoVO kakaoVO) throws Exception { + List kakaoSendList = new ArrayList(); + //전체 받는사람 수량만큼 반복 확인 + int callToCnt = kakaoVO.getCallToList().length; + try { + for(int count =0; count < callToCnt; count++) { + + KakaoVO setSendMsgVO = new KakaoVO(); + + setSendMsgVO.setDestPhone(kakaoVO.getCallToList()[count]); // 수신 번호 + // 카카오 전송내용 설정 + // 변환문자 포함(Y), 미포함(N) + if(kakaoVO.getTxtReplYn().equals("Y")) { + + String templateContent = kakaoFTSubMagTxtRepl(kakaoVO.getTemplateContent(), kakaoVO, count); + setSendMsgVO.setTemplateContent(templateContent); + + }else { + + // 템플릿 내용 설정 + setSendMsgVO.setTemplateContent(kakaoVO.getTemplateContent()); + } + + //대체문자 포함(Y), 미포함(N) + if(kakaoVO.getSubMsgSendYn().equals("Y")) { + + String charset = "euc-kr"; //문자 바이트 계산에 필요한 캐릭터 셋 : 한글 2Byte로 계산 + + String tempSubMagTxt = kakaoVO.getSubMsgTxt().replace("\r\n", "\n"); + kakaoVO.setKakaoSubMagOrgnlTxt(tempSubMagTxt); + if(kakaoVO.getSubMsgTxtReplYn().equals("Y")) { + tempSubMagTxt = kakaoFTSubMagTxtRepl(tempSubMagTxt, kakaoVO, count); + } + + setSendMsgVO.setSubMsgTxt(tempSubMagTxt); + + int FrBytes = tempSubMagTxt.getBytes(charset).length; + + //메세지 길이가 90Byte가 초과시 MMS + if(FrBytes > 90) { + setSendMsgVO.setSubMsgType("MMS"); + }else {// 아니면 SMS + setSendMsgVO.setSubMsgType("SMS"); + } + } + + if(kakaoVO.getBizJsonYn().equals("Y")) { + kakaoVO.setDestPhone(kakaoVO.getCallToList()[count]); // 수신 번호 + + String[] varValInfo = null; + if( kakaoVO.getVarValList().size() != 0) { + varValInfo = kakaoVO.getVarValList().get(count); + } + String jsonFileName = kakaoApiJsonSave.kakaoApiJsonSave(kakaoVO, varValInfo); +// String jsonFileName = kakaoApiJsonSave.kakaoApiJsonSave(kakaoVO, kakaoVO.getVarValList().get(count)); + setSendMsgVO.setBizJsonName(jsonFileName); //json 파일명 + } + + kakaoSendList.add(setSendMsgVO); + } + kakaoVO.setKakaoSendList(kakaoSendList); + + } catch (Exception e) { + System.out.println(e.toString()); + e.printStackTrace(); + } + + return kakaoVO; + } + + public String kakaoSendMsgTest(KakaoVO kakaoVO) throws Exception { String templateContent = ""; try { @@ -343,6 +549,15 @@ public class KakaoSendUtil { return tempSubMagTxt; } + public String kakaoFTSubMagTxtRepl(String tempSubMagTxt, KakaoVO kakaoVO, int count) throws Exception{ + + List varValList = kakaoVO.getVarValList(); + + tempSubMagTxt = getKakaoFTCntReplace(varValList.get(count)[0], tempSubMagTxt); + + return tempSubMagTxt; + } + /* * 카카오 친구톡 치환 내용에 대한 변환 처리 * diff --git a/src/main/java/itn/let/kakao/user/kakaoAt/service/KakaoAlimTalkService.java b/src/main/java/itn/let/kakao/user/kakaoAt/service/KakaoAlimTalkService.java index eb69d483..95a8160d 100644 --- a/src/main/java/itn/let/kakao/user/kakaoAt/service/KakaoAlimTalkService.java +++ b/src/main/java/itn/let/kakao/user/kakaoAt/service/KakaoAlimTalkService.java @@ -15,6 +15,9 @@ public interface KakaoAlimTalkService { //카카오 알림톡 발신 public MjonMsgReturnVO insertKakaoAtSandAjax(KakaoVO kakaoVO) throws Exception; + + //카카오 친구톡 발신 + public MjonMsgReturnVO insertKakaoFtSendAjax(KakaoVO kakaoVO) throws Exception; //카카오 알림톡 전송 실패 환불리스트 조회 public void selectKakaoAtSentRefundList() throws Exception; 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 a05f3b9f..13a1e918 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 @@ -331,6 +331,267 @@ public class KakaoAlimTalkServiceImpl extends EgovAbstractServiceImpl implements } return returnVO; } + + + + //카카오 친구톡 발신 + @Override + public MjonMsgReturnVO insertKakaoFtSendAjax(KakaoVO kakaoVO) throws Exception { + + MjonMsgReturnVO returnVO = new MjonMsgReturnVO(); + try { + String agentCode = "04"; // 다우기술 agent 코드 고정 + String msgType = "9"; // 카카오 알림톡 전송 코드 : 8번 + + int totCnt = 1; // 문자 리스트 추가 수량 + int resultCnt = 0; // 최종전송 수량 + int callToCnt = kakaoVO.getCallToList().length; // 전체 받는사람 건수 + + //Controller에서 전달 받은 분할 시간 정보 리스트 + List dividDayList = kakaoVO.getDividDay(); + //String sendTime = kakaoVO.getReqDate(); + String[] phoneList = kakaoVO.getCallToList(); //받는사람 연락처 리스트 + + //카카오 알림톡 전송 리스트 + List kakaoFtSendList = new ArrayList(); + +/** 카카오 알림톡 전송 리스트 생성 (시작)-------------------------------------------*/ + for(int i = 0; i < callToCnt; i++) { + + KakaoVO kakaoSandInfo = new KakaoVO(); // 전송설정VO + + kakaoSandInfo.setMsgId(idgenMsgId.getNextStringId()); // 문자 Id 설정 + kakaoSandInfo.setMsgGroupId(kakaoVO.getMsgGroupId()); // 문자 그룹ID 설정 + kakaoSandInfo.setUserId(kakaoVO.getUserId()); // 사용자 ID + kakaoSandInfo.setAgentCode(agentCode); // 전송 agent 설정 + + kakaoSandInfo.setSenderKey(kakaoVO.getSenderKey()); + kakaoSandInfo.setTemplateCode(kakaoVO.getTemplateCode()); + + + kakaoSandInfo.setCallTo(phoneList[i]); // 받는사람 전화번호 + kakaoSandInfo.setCallFrom(kakaoVO.getCallFrom()); // 보내는사람 전화전호 + kakaoSandInfo.setMsgType(msgType); // 문자전송 타입 설정 + + + List kakaoSendMsgList = kakaoVO.getKakaoSendList(); + /**문자내용 치환 처리 (시작) --------------------------------------------*/ + kakaoSandInfo.setTemplateContent(kakaoSendMsgList.get(i).getTemplateContent()); //템플릿 내용 또는 치환 템플릿 내용 + /**문자내용 치환 처리 (끝) ---------------------------------------------*/ + + kakaoSandInfo.setTemplateTitle(kakaoSendMsgList.get(i).getTemplateTitle()); + + /**json파일 여부 (시작) --------------------------------------------*/ + kakaoSandInfo.setBizJsonYn(kakaoVO.getBizJsonYn()); + if(kakaoVO.getBizJsonYn().equals("Y")){ + kakaoSandInfo.setBizJsonName(kakaoSendMsgList.get(i).getBizJsonName()); + } + /**json파일 여부 (끝) ---------------------------------------------*/ + + /**대체문자 처리 (시작) --------------------------------------------*/ + kakaoSandInfo.setSubMsgSendYn(kakaoVO.getSubMsgSendYn()); // 대체문자 전송여부 설정 + if(kakaoVO.getSubMsgSendYn().equals("Y")) { + kakaoSandInfo.setSubMsgType(kakaoSendMsgList.get(i).getSubMsgType()); // 대체문자 전송 타입 + kakaoSandInfo.setSubMsgTxt(kakaoSendMsgList.get(i).getSubMsgTxt()); // 대체문자 전송 내용 + } + /**대체문자 처리 (끝) ---------------------------------------------*/ + + /**전송시간 설정 (시작)------------------------------------------------*/ + if(!kakaoVO.getReserveYn().equals("N")) { + /** 예약 발송 설정 */ + //분할 발송을 체크 한 경우 + if(kakaoVO.getDivideChk().equals("Y")) { + + kakaoSandInfo.setReqDate(dividDayList.get(i)); //분할 문자 예약 시간 입력해주기 + + }else { + + kakaoSandInfo.setReqDate(kakaoVO.getReqDate()); + + } + }else { + /** 즉시 발송 설정 */ + Date now = new Date(); + SimpleDateFormat sdFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); + kakaoVO.setReqDate(sdFormat.format(now)); + kakaoSandInfo.setReqDate(sdFormat.format(now)); + + } + + if(kakaoVO.getAtSmishingYn().equals("Y")) { + String sandDate = ""; + + if(kakaoVO.getDivideChk().equals("Y")) { + //분할 문자 예약 시간 입력해주기 + sandDate = dividDayList.get(i); + }else { + //예약 시간 입력해주기 + sandDate = kakaoVO.getReqDate(); + } + + if(!kakaoVO.getReserveYn().equals("N")) { + /** 예약 발송 설정 */ + if (i == 0) { + SimpleDateFormat sdFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); + Date date = sdFormat.parse(sandDate); + + Calendar cal1 = Calendar.getInstance(); + cal1.setTime(date); // 시간 설정 + cal1.add(Calendar.MINUTE, 30); // 30분 연산 + + String reqDate = sdFormat.format(cal1.getTime()); + + System.out.println("@@@@@@@@@@@@@@ reqDate : "+reqDate); + kakaoVO.setReqDate(reqDate); + kakaoSandInfo.setReqDate(reqDate); + } + else { + if(kakaoVO.getDivideChk().equals("Y")) { + SimpleDateFormat sdFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); + Date date = sdFormat.parse(sandDate); + + Calendar cal1 = Calendar.getInstance(); + cal1.setTime(date); // 시간 설정 + cal1.add(Calendar.MINUTE, 30); // 30분 연산 + + String reqDate = sdFormat.format(cal1.getTime()); + + System.out.println("@@@@@@@@@@@@@@ reqDate : "+reqDate); + kakaoVO.setReqDate(reqDate); + kakaoSandInfo.setReqDate(reqDate); + } + } + }else { + /** 즉시 발송 설정 */ + SimpleDateFormat sdFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); + Date date = sdFormat.parse(sandDate); + + Calendar cal1 = Calendar.getInstance(); + cal1.setTime(date); // 시간 설정 + cal1.add(Calendar.MINUTE, 30); // 30분 연산 + + String reqDate = sdFormat.format(cal1.getTime()); + + System.out.println("@@@@@@@@@@@@@@ reqDate : "+reqDate); + kakaoVO.setReqDate(reqDate); + kakaoSandInfo.setReqDate(reqDate); + } + } + + /**전송시간 설정 (끝)------------------------------------------------*/ + + /**카카오 전송 데이터 추가*/ + kakaoFtSendList.add(kakaoSandInfo); + + + int instCnt = 0; // DB등록 완료 수량 + //지금까지 루프 돌아간 것이 전체 수신자 갯수와 같으면 추가가 완료된 것으로 판단 되어 전송 해줌 + if(totCnt == callToCnt) { + + if(kakaoFtSendList.size() > 0) { + instCnt = kakaoAlimTalkDAO.insertKakaoAtDataInfo(kakaoFtSendList); + } + //총 디비 입력 건수 저장하기 + resultCnt = resultCnt + instCnt; + + }else { + + } + totCnt++; + + } +/** 카카오 알림톡 전송 리스트 (종료)-------------------------------------------*/ + +/** + * 1. 문자 발송 캐시 차감 ---------------------------------------------- + * 2. 문자 그룹 테이블 등록 -------------------------------------------- + */ + + //문자 발송 캐시 차감 해주기 + MjonPayVO mjonPayVO = new MjonPayVO(); + + MjonMsgVO mjonMsgVO = new MjonMsgVO(); + + //1건 이상 발송이 있는 경우만 캐쉬를 차감 시킨다. + //문자 발송 그룹 데이블에 추가 + if(resultCnt > 0) { + + +/** 발송 캐시 차감---------------------------------------------*/ + + + int totSendCnt = kakaoVO.getCallToList().length; + Float eachPrice = Float.parseFloat(kakaoVO.getEachPrice()); + Float totPrice = eachPrice * resultCnt; + String strTotPrice = String.format("%.1f", totPrice); + + mjonMsgVO.setTotPrice(strTotPrice);//현재 합산 금액 셋팅 + mjonPayVO.setCashId(idgenMjonCashId.getNextStringId()); + mjonPayVO.setUserId(kakaoVO.getUserId()); + mjonPayVO.setCash(-Float.parseFloat(strTotPrice)); + mjonPayVO.setFrstRegisterId(kakaoVO.getUserId()); + mjonPayVO.setMemo("카카오 친구톡 총 "+totSendCnt+"건 중 " + resultCnt + "건 발송"); + mjonPayVO.setMsgGroupId(kakaoVO.getMsgGroupId()); + + + mjonPayService.insertCash(mjonPayVO); //캐시차감 + mjonPayService.updateMemberCash(mjonPayVO); //회원정보 업데이트 + +/** 그룹 테이블 등록-------------------------------------------*/ + + mjonMsgVO.setUserId(kakaoVO.getUserId()); + mjonMsgVO.setMsgGroupId(kakaoVO.getMsgGroupId()); + mjonMsgVO.setCallFrom(kakaoVO.getCallFrom()); + mjonMsgVO.setSmsTxt(kakaoVO.getTemplateContent()); + mjonMsgVO.setReqDate(kakaoVO.getReqDate()); + mjonMsgVO.setMsgGroupCnt(Integer.toString(resultCnt)); + mjonMsgVO.setMsgType(msgType); + mjonMsgVO.setAgentCode(agentCode); + mjonMsgVO.setEachPrice(kakaoVO.getEachPrice()); + mjonMsgVO.setReserveYn(kakaoVO.getReserveYn()); + mjonMsgVO.setBefCash(kakaoVO.getBefCash()); + mjonMsgVO.setBefPoint(kakaoVO.getBefPoint()); + mjonMsgVO.setKakaoSubMagOrgnlTxt(kakaoVO.getKakaoSubMagOrgnlTxt()); + mjonMsgVO.setAtDelayYn(kakaoVO.getAtSmishingYn()); + + + if(kakaoVO.getBizJsonYn().equals("Y")) { + mjonMsgVO.setFileCnt("1"); + }else { + mjonMsgVO.setFileCnt("0"); + } + + mjonMsgVO.setDelayYn(kakaoVO.getDelayYn()); + + // 등록되어있는 그룹데이터가 있는지 조회 + int msgGroupDataCnt = mjonMsgDAO.selectMsgGroupDataCntByGroupId(mjonMsgVO); + + // 등록되어 있는 그룹데이터가 없으면 insert, 있으면 update를 진행한다. + if(msgGroupDataCnt < 1) { + mjonMsgDAO.insertGroupMsgData(mjonMsgVO); + kakaoAlimTalkDAO.insertKakaoSendPrice(kakaoVO); + }else { + mjonMsgDAO.updateMsgGroupDataForTotCntSum(mjonMsgVO); + } + } + + returnVO.setSendMsgCnt(Integer.toString(resultCnt)); + + } catch (Exception e) { + // 실패 + returnVO.setSendMsgCnt(Integer.toString(0)); //발송 건수 저장 + returnVO.setSendMsgBlockCnt(Integer.toString(0)); //수신차단 건수 저장 + returnVO.setAgentCode("01"); + + System.out.println("========================================================================="); + System.out.println("+++++++++++++++++++++++++++++ 문자발송 ==> insertMsgDataInfo ERROR !!! : " + e); + System.out.println("========================================================================="); + return returnVO; + } + return returnVO; + } + + @Override public void selectKakaoAtSentRefundList() throws Exception { 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 5d13a94a..79d41766 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 @@ -4,11 +4,13 @@ import java.math.BigDecimal; import java.math.RoundingMode; import java.text.SimpleDateFormat; import java.util.ArrayList; +import java.util.Arrays; import java.util.Calendar; import java.util.Date; import java.util.List; import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; @@ -17,6 +19,7 @@ import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; +import egovframework.rte.fdl.idgnr.EgovIdGnrService; import egovframework.rte.fdl.security.userdetails.util.EgovUserDetailsHelper; import itn.com.cmm.EgovMessageSource; import itn.com.cmm.LoginVO; @@ -26,16 +29,22 @@ import itn.let.kakao.kakaoComm.KakaoButtonVO; 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.KakaoFriendsTalkTemplateService; import itn.let.mjo.msgdata.service.MjonMsgDataService; import itn.let.mjo.msgdata.service.MjonMsgDataVO; +import itn.let.mjo.msgdata.service.MjonMsgReturnVO; import itn.let.mjo.symbol.service.MjonSymbolService; import itn.let.mjo.symbol.service.MjonSymbolVO; +import itn.let.uss.umt.service.EgovUserManageService; import itn.let.uss.umt.service.MberManageVO; @Controller public class KakaoFriendsTalkSendController { + @Resource(name = "egovMjonMsgGroupIdGnrService") + private EgovIdGnrService idgenMjonMsgGroupId; + /** EgovMessageSource */ @Resource(name="egovMessageSource") EgovMessageSource egovMessageSource; @@ -52,6 +61,13 @@ public class KakaoFriendsTalkSendController { @Resource(name = "kakaoFriendsTalkTemplateService") private KakaoFriendsTalkTemplateService kakaoFtTemplateService; + /** userManageService */ + @Resource(name = "userManageService") + private EgovUserManageService userManageService; + + @Resource(name = "kakaoAlimTalkService") + private KakaoAlimTalkService kakaoAlimTalkService; + @Autowired KakaoSendUtil kakaoSendUtil; @@ -148,13 +164,8 @@ public class KakaoFriendsTalkSendController { KakaoVO resultTemplateVO = new KakaoVO(); if(friendId != null) { - - System.out.println("+++++++++++++++++++++++ friendId ::: "+friendId); - resultTemplateVO = kakaoFtTemplateService.selectKakaoFriendsTemplateDetail(kakaoVO); - } - model.addAttribute("resultTemplateVO", resultTemplateVO); @@ -202,33 +213,6 @@ public class KakaoFriendsTalkSendController { } - @RequestMapping(value= {"/web/mjon/kakao/friendstalk/kakaoFriendsTalkMsgSendAjax.do"}) - public ModelAndView kakaoFriendsTalkMsgSendAjax( - @ModelAttribute("kakaoVO") KakaoVO kakaoVO - ) throws Exception { - ModelAndView modelAndView = new ModelAndView(); - modelAndView.setViewName("jsonView"); - - int sendCount = 0; //발송결과 건수 - try { - - /** 카카오톡 전송 기본 설정 -------------------------------------------*/ - /** 카카오톡 전송 금액 설정 -------------------------------------------*/ - /** 카카오톡 전송 분할 설정 -------------------------------------------*/ - /** 카카오톡 예약 전송 설정 -------------------------------------------*/ - /** 카카오톡 전송 메시지 설정 ------------------------------------------*/ - /** 카카오톡 발송 처리 -----------------------------------------------*/ - - }catch (Exception e) { - System.out.println(" kakaoFriendsTalkMsgSendAjax Error ::: " + e); - modelAndView.addObject("message", egovMessageSource.getMessage("fail.common.update")); - modelAndView.addObject("result", "fail"); - return modelAndView; - } - return modelAndView; - } - - /** * @Method Name : selectSpamKakaoFriendsTalkMsgChkAjax * @작성일 : 2024. 1. 15. @@ -325,10 +309,282 @@ public class KakaoFriendsTalkSendController { */ @RequestMapping(value= {"/web/mjon/kakao/friendstalk/kakaoFriendsTalkMsgSendAjax.do"}) public ModelAndView kakaoFriendsTalkMsgSendAjax(ModelMap model + , HttpServletRequest request , @ModelAttribute("kakaoVO") KakaoVO kakaoVO) throws Exception { ModelAndView modelAndView = new ModelAndView(); modelAndView.setViewName("jsonView"); + + int resultSts = 0; //발송결과 건수 + int resultBlockSts = 0; //수신거부 등록번호로 발송을 안한 건수 + + LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null; + String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId()); + + try { + + if(userId == "") { + modelAndView.addObject("message", "로그인 후 이용이 가능합니다."); + modelAndView.addObject("result", "loginFail"); + return modelAndView; + }else { + + /** + * 회원 정지된 상태이면 알림톡 발송이 안되도록 처리함 + * 현재 로그인 세션도 만료 처리함 + * */ + boolean mberSttus = userManageService.selectUserStatusInfo(userId); + + if(!mberSttus) { + + modelAndView.addObject("message", "현재 고객님께서는 문자온 서비스 이용이 정지된 상태로 알림톡을 발송하실 수 없습니다. 이용정지 해제를 원하시면 고객센터로 연락주시기 바랍니다."); + modelAndView.addObject("result", "authFail"); + + request.getSession().invalidate(); + + return modelAndView; + + } + } + +/** 카카오톡 전송 기본 설정 -------------------------------------------*/ + kakaoVO.setSendType("FT"); + kakaoVO.setMsgType("9"); + kakaoVO.setUserId(userId); + + +/** 전송금액 설정 --------------------------------------------------*/ + KakaoVO priceSet = kakaoSendUtil.kakaoFTSendPrice(kakaoVO); + + if(priceSet.getResultCode() != null && priceSet.getResultCode().equals("2000")) { + + modelAndView.addObject("message", "대체문자 치환 후 전송 문자 길이를 초과하였습니다."); + modelAndView.addObject("result", "fail"); + return modelAndView; + } + + BigDecimal befCash = new BigDecimal(priceSet.getBefCash()).setScale(2, RoundingMode.HALF_EVEN); + BigDecimal totMsgPrice = new BigDecimal(priceSet.getTotPrice()).setScale(2, RoundingMode.HALF_EVEN); + + kakaoVO.setEachPrice(priceSet.getEachPrice()); + kakaoVO.setBefCash(befCash.toString()); + kakaoVO.setTotPrice(totMsgPrice.toString()); + + //현재 보유 금액이 발송 문자 총 금액보다 클 경우만 문자 발송 + //BigDecimal 비교 연산 + // befCash(현재 보유금액) 값이 totMsgPrice(문자전송 금액) 보다 많으면 문자 전송 + if(befCash.compareTo(totMsgPrice) != -1) { // -1 : befCash < totMsgPrice, 0 : befCash = totMsgPrice, 1 : befCash > totMsgPrice, + + kakaoVO.setMsgGroupId(idgenMjonMsgGroupId.getNextStringId()); // 문자 그룹ID 설정 + +/** 카카오톡 전송 분할 설정 ----------------------------------------------*/ + + String[] tempPhoneList = new String[200]; //임시 수신번호 리스트 저장용 배열 + List tempVarValList = new ArrayList(); //임시 변수 리스트 저장용 + + String[] phoneList = kakaoVO.getCallToList(); + List varValList = null; + + + //치환문자 포함 여부 + if(kakaoVO.getTxtReplYn().equals("Y")) { + varValList = kakaoVO.getVarValList(); + } + + System.out.println("+++++++++++++++++ 회원 스미싱 의심 온/오프 ::: "+kakaoVO.getAtSmishingYn()); + + //스팸 스미싱 여부 - 내용에 스팸 문자열 유무 체크 + if(kakaoVO.getSpamStatus().equals("Y") || kakaoVO.getAtSmishingYn().equals("Y")) { + kakaoVO.setAtSmishingYn("Y"); + }else { + kakaoVO.setAtSmishingYn("N"); + } + + //스미싱 의심이 아니면 delayYn 값 셋팅 + if(kakaoVO.getAtSmishingYn().equals("N")) { + kakaoVO.setDelayYn("N"); + }else { + kakaoVO.setDelayYn("Y"); + } + + //분할발송 여부 - 친구톡은 분할 발송이 없기애 N으로 픽스 + kakaoVO.setDivideChk("N"); + + int callToListCnt = kakaoVO.getCallToList().length; + kakaoVO.setTotalCallCnt(callToListCnt); + +/** 예약 문자인 경우 설정 ----------------------------------------------*/ + //분할문자 시간에 간격시간 더해주기 + String dividDay = null; + Calendar cal = Calendar.getInstance(); + + //예약시간 변환 + SimpleDateFormat transFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); + + int turmMin = 0; + int totalCallCnt = 0; // 수신자 전체 갯수 + int divideCnt = 0; + int count = 1; //분할 카운트 + + if(!kakaoVO.getReserveYn().equals("N")) {//예약문자인 경우 시간 셋팅 + + Date toDate = transFormat.parse(kakaoVO.getReqDate()); + cal.setTime(toDate); //예약 시간 캘린터 변수에 입력 + + //turmMin = Integer.parseInt(kakaoVO.getDivideTime()); //분할발송 시간 간격 + //dividDay = transFormat.format(cal.getTime()); + + totalCallCnt = kakaoVO.getCallToList().length; // 수신자 전체 갯수 + //divideCnt = Integer.parseInt(kakaoVO.getDivideCnt()); //분할 발송 갯수 + + } + + //분할 예약 시간 저장 리스트 생성 + List dividDayList = new ArrayList(); + + if(callToListCnt > 200) { + + int sendCnt = 0; + /** 카카오톡 전송 200개 이상일때 ----------------------------------------------*/ + for(int i =0; i < callToListCnt; i++) { + + //분할 발송을 체크 한 경우 + /*if(kakaoVO.getDivideChk().equals("Y")) { + if(count > divideCnt) { + count = 1; + cal.add(Calendar.MINUTE, turmMin); //분할 시간 간격을 증가시켜 준다. + dividDay = transFormat.format(cal.getTime()); + dividDayList.add(dividDay); + count++; + }else { + dividDayList.add(dividDay); + count++; + } + }*/ + + + if((i < callToListCnt -1) && sendCnt == 199) { + + tempPhoneList[sendCnt] = phoneList[i]; + + if(varValList != null) { + tempVarValList.add(varValList.get(i)); + } + + List arrPhoneList = new ArrayList(); + for(String temp : tempPhoneList) { + if(temp != null) { + arrPhoneList.add(temp); + } + } + + String[] sendPhoneList = new String[arrPhoneList.size()]; + for(int j=0; j< arrPhoneList.size(); j++) { + sendPhoneList[j] = arrPhoneList.get(j); + } + +/** 카카오톡 전송 메시지 설정 ----------------------------------------------*/ + kakaoVO.setCallToList(sendPhoneList); + kakaoVO.setVarValList(tempVarValList); + KakaoVO kakaoSendMsgSet = kakaoSendUtil.kakaoFTSendMsg(kakaoVO); + kakaoVO.setKakaoSendList(kakaoSendMsgSet.getKakaoSendList()); + +/** 카카오톡 발송 처리 --------------------------------------------------*/ + kakaoVO.setDividDay(dividDayList); + MjonMsgReturnVO returnVO = kakaoAlimTalkService.insertKakaoFtSendAjax(kakaoVO); + resultSts = resultSts + Integer.parseInt(returnVO.getSendMsgCnt()); + //전송 초기화 + sendCnt = 0; + Arrays.fill(tempPhoneList, null); + tempVarValList.clear(); + dividDayList.clear(); + + }else if((i == callToListCnt -1) && sendCnt < 200){//200개의 마지막일 경우 처리 + + tempPhoneList[sendCnt] = phoneList[i]; + + if(varValList != null) { + + tempVarValList.add(varValList.get(i)); + + } + + List arrPhoneList = new ArrayList(); + for(String temp : tempPhoneList) { + if(temp != null) { + arrPhoneList.add(temp); + } + } + + String[] sendPhoneList = new String[arrPhoneList.size()]; + for(int j=0; j< arrPhoneList.size(); j++) { + sendPhoneList[j] = arrPhoneList.get(j); + } + +/** 카카오톡 전송 메시지 설정 ----------------------------------------------*/ + kakaoVO.setCallToList(sendPhoneList); + kakaoVO.setVarValList(tempVarValList); + KakaoVO kakaoSendMsgSet = kakaoSendUtil.kakaoFTSendMsg(kakaoVO); + kakaoVO.setKakaoSendList(kakaoSendMsgSet.getKakaoSendList()); + kakaoVO.setKakaoSubMagOrgnlTxt(kakaoSendMsgSet.getKakaoSubMagOrgnlTxt()); +/** 카카오톡 발송 처리 --------------------------------------------------*/ + kakaoVO.setDividDay(dividDayList); + MjonMsgReturnVO returnVO = kakaoAlimTalkService.insertKakaoFtSendAjax(kakaoVO); + resultSts = resultSts + Integer.parseInt(returnVO.getSendMsgCnt()); + }else {//198개가 될때까지 배열에 데이터를 쌓는다 + + tempPhoneList[sendCnt] = phoneList[i]; + + if(varValList != null && varValList.get(i).length > 0) { + tempVarValList.add(varValList.get(i)); + } + + sendCnt++; + } + } + }else { + /** 카카오톡 전송 200개 미만일때 ----------------------------------------------*/ + //분할 발송을 체크 한 경우 + /*if(kakaoVO.getDivideChk().equals("Y")) { + for(int i =0; i < callToListCnt; i++) { + if(count > divideCnt) { + count = 1; + cal.add(Calendar.MINUTE, turmMin); //분할 시간 간격을 증가시켜 준다. + dividDay = transFormat.format(cal.getTime()); + dividDayList.add(dividDay); + count++; + }else { + dividDayList.add(dividDay); + count++; + } + } + }*/ + + + +/** 카카오톡 전송 메시지 설정 ----------------------------------------------*/ + KakaoVO kakaoSendMsgSet = kakaoSendUtil.kakaoFTSendMsg(kakaoVO); + kakaoVO.setKakaoSendList(kakaoSendMsgSet.getKakaoSendList()); + kakaoVO.setKakaoSubMagOrgnlTxt(kakaoSendMsgSet.getKakaoSubMagOrgnlTxt()); + +/** 카카오톡 발송 처리 --------------------------------------------------*/ + kakaoVO.setDividDay(dividDayList); + MjonMsgReturnVO returnVO = kakaoAlimTalkService.insertKakaoFtSendAjax(kakaoVO); + resultSts = Integer.parseInt(returnVO.getSendMsgCnt()); + + } + +/** 카카오톡 결과 처리 --------------------------------------------------*/ + }else { + modelAndView.addObject("message", "친구톡 발송에 필요한 보유 잔액이 부족 합니다."); + modelAndView.addObject("result", "fail"); + return modelAndView; + } + + } catch (Exception e) { + System.out.println("kakaoFriendsTalkMsgSendAjax Controller Error !!!! "+e); + } + System.out.println("++++++++++++++++++++++ senderKey ::: "+kakaoVO.getSenderKey()); System.out.println("++++++++++++++++++++++ imageType ::: "+kakaoVO.getImageType()); System.out.println("++++++++++++++++++++++ imageTitle ::: "+kakaoVO.getImageTitle()); @@ -386,6 +642,8 @@ public class KakaoFriendsTalkSendController { System.out.println("++++++++++++++++ 예약 시간 ::: "+kakaoVO.getReqDate()); + System.out.println("++++++++++++++++ json 필요 유무 ::: "+kakaoVO.getBizJsonYn()); + modelAndView.addObject("result", "success"); diff --git a/src/main/webapp/WEB-INF/jsp/web/kakao/include/KaKaoAlimtalkTopMenuTap.jsp b/src/main/webapp/WEB-INF/jsp/web/kakao/include/KaKaoAlimtalkTopMenuTap.jsp index 691c2830..b978ecdd 100644 --- a/src/main/webapp/WEB-INF/jsp/web/kakao/include/KaKaoAlimtalkTopMenuTap.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/kakao/include/KaKaoAlimtalkTopMenuTap.jsp @@ -58,8 +58,6 @@ function fnLinkPageTopTab(tabInfo){ }else if(tabInfo == 'tabFriend'){ - /* alert("친구톡 메뉴는 현재 개발이 진행 중입니다."); */ - $("input[name=friendId]").val(""); url = ""; }else if(tabInfo == 'tabAlimtalkIntrd'){ @@ -68,8 +66,10 @@ function fnLinkPageTopTab(tabInfo){ } - form.action =url; - form.submit(); + //form.action =url; + //form.submit(); + //메뉴 선택시 폼 데이터로 인한 오류 발생하여 location으로 변경 - 20240117 우영두 + location.href=url; } 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 a31025cb..3d2df583 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 @@ -761,6 +761,19 @@ function fn_noTimeSend(){ //친구톡 데이터 전송 처리 function fn_sendMsgData(){ + var senderKey = $("#selectAgentCode option:checked").val(); + + if(senderKey == ''){ + + alert("채널ID를 선택해 주세요."); + return false; + + }else{ + + $("#inputSenderKey").val(senderKey); + + } + //이미지 첨부 체크 var imgChk = $("input[name=img_file_add]:checked").val(); if(imgChk == 'I' || imgChk == 'W'){ @@ -792,6 +805,16 @@ function fn_sendMsgData(){ $("#imageType").val(imgChk); + //json 파일 필요 유무 셋팅 + $("#bizJsonYn").val("Y"); + } + + //템플릿 버튼 갯수 체크 + var buttonCnt = $(".btn_kakao_type").length; + + if(buttonCnt > 0){ + //json 파일 필요 유무 셋팅 + $("#bizJsonYn").val("Y"); } //친구톡 내용 체크 @@ -815,7 +838,6 @@ function fn_sendMsgData(){ } - //수신번호 리스트 체크하기 var numCnt = 0; @@ -1308,8 +1330,43 @@ function fn_subMsgCheck(){ 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; } @@ -1425,6 +1482,7 @@ function msgSuccessClose(obj){ + @@ -1432,7 +1490,8 @@ function msgSuccessClose(obj){ - + + @@ -1442,6 +1501,10 @@ function msgSuccessClose(obj){ + + + +