rosewiper 2024-01-17
친구톡 발송 처리 1차 개발 완료 - json 파일 생성 제외 전송 부분 완료 - 환불 처리 미 적용
 - json 파일 생성 제외 전송 부분 완료
 - 환불 처리 미 적용
@eb1d385d15aa4946741f95d14c33a79d1465d158
src/main/java/itn/let/kakao/kakaoComm/KakaoSendUtil.java
--- src/main/java/itn/let/kakao/kakaoComm/KakaoSendUtil.java
+++ src/main/java/itn/let/kakao/kakaoComm/KakaoSendUtil.java
@@ -150,6 +150,134 @@
 		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 @@
 		return kakaoVO;
 	}
 	
+	
+	/**
+	* @Method Name : kakaoFTSendMsg
+	* @작성일 : 2024. 1. 17.
+	* @작성자 :  우영두
+	* @Method 설명 : 카카오 친톡 전송 메세지 설정
+	*/
+	public KakaoVO kakaoFTSendMsg(KakaoVO kakaoVO) throws Exception {
+			List<KakaoVO> kakaoSendList = new ArrayList<KakaoVO>();
+			//전체 받는사람 수량만큼 반복 확인
+			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 @@
 		return tempSubMagTxt;
 	}
 	
+	public String kakaoFTSubMagTxtRepl(String tempSubMagTxt, KakaoVO kakaoVO, int count) throws Exception{
+
+		List<String[]> varValList = kakaoVO.getVarValList();
+		
+		tempSubMagTxt = getKakaoFTCntReplace(varValList.get(count)[0], tempSubMagTxt);
+		
+		return tempSubMagTxt;
+	}
+	
 	/*
 	 * 카카오 친구톡 치환 내용에 대한 변환 처리
 	 * 
src/main/java/itn/let/kakao/user/kakaoAt/service/KakaoAlimTalkService.java
--- src/main/java/itn/let/kakao/user/kakaoAt/service/KakaoAlimTalkService.java
+++ src/main/java/itn/let/kakao/user/kakaoAt/service/KakaoAlimTalkService.java
@@ -15,6 +15,9 @@
 	
 	//카카오 알림톡 발신
 	public MjonMsgReturnVO insertKakaoAtSandAjax(KakaoVO kakaoVO) throws Exception;
+
+	//카카오 친구톡 발신
+	public MjonMsgReturnVO insertKakaoFtSendAjax(KakaoVO kakaoVO) throws Exception;
 	
 	//카카오 알림톡 전송 실패 환불리스트 조회
 	public void selectKakaoAtSentRefundList() throws Exception;
src/main/java/itn/let/kakao/user/kakaoAt/service/impl/KakaoAlimTalkServiceImpl.java
--- src/main/java/itn/let/kakao/user/kakaoAt/service/impl/KakaoAlimTalkServiceImpl.java
+++ src/main/java/itn/let/kakao/user/kakaoAt/service/impl/KakaoAlimTalkServiceImpl.java
@@ -331,6 +331,267 @@
 		}
 		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<String> dividDayList = kakaoVO.getDividDay();
+			//String sendTime = kakaoVO.getReqDate();
+			String[] phoneList = kakaoVO.getCallToList();	//받는사람 연락처 리스트
+			
+			//카카오 알림톡 전송 리스트
+			List<KakaoVO> kakaoFtSendList = new ArrayList<KakaoVO>();
+					
+/** 카카오 알림톡 전송  리스트 생성 (시작)-------------------------------------------*/
+			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<KakaoVO> 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 {
src/main/java/itn/let/kakao/user/kakaoFt/web/KakaoFriendsTalkSendController.java
--- src/main/java/itn/let/kakao/user/kakaoFt/web/KakaoFriendsTalkSendController.java
+++ src/main/java/itn/let/kakao/user/kakaoFt/web/KakaoFriendsTalkSendController.java
@@ -4,11 +4,13 @@
 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.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.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;
@@ -51,6 +60,13 @@
 	
 	@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 @@
 				KakaoVO resultTemplateVO = new KakaoVO();
 				
 				if(friendId != null) {
-					
-					System.out.println("+++++++++++++++++++++++ friendId ::: "+friendId);
-					
 					resultTemplateVO = kakaoFtTemplateService.selectKakaoFriendsTemplateDetail(kakaoVO);
-					
 				}
-				
 				model.addAttribute("resultTemplateVO", resultTemplateVO);
 				
 				
@@ -199,33 +210,6 @@
 		}
 		
 		return "web/kakao/msgdata/ft/KakaoFriendsTalkMsgDataView";
-	}
-	
-	
-	@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;
 	}
 	
 	
@@ -325,9 +309,281 @@
 	*/
 	@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<String[]> tempVarValList = new ArrayList<String[]>();	//임시 변수 리스트 저장용
+				
+				String[] phoneList = kakaoVO.getCallToList();
+				List<String[]> 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<String> dividDayList = new ArrayList<String>();
+				
+				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<String> arrPhoneList = new ArrayList<String>();
+							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<String> arrPhoneList = new ArrayList<String>();
+							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());
@@ -386,6 +642,8 @@
 		
 		System.out.println("++++++++++++++++ 예약 시간 ::: "+kakaoVO.getReqDate());
 		
+		System.out.println("++++++++++++++++ json 필요 유무 ::: "+kakaoVO.getBizJsonYn());
+		
 		
 		
 		modelAndView.addObject("result", "success");
src/main/webapp/WEB-INF/jsp/web/kakao/include/KaKaoAlimtalkTopMenuTap.jsp
--- src/main/webapp/WEB-INF/jsp/web/kakao/include/KaKaoAlimtalkTopMenuTap.jsp
+++ src/main/webapp/WEB-INF/jsp/web/kakao/include/KaKaoAlimtalkTopMenuTap.jsp
@@ -58,8 +58,6 @@
 		
 	}else if(tabInfo == 'tabFriend'){
 		
-		/* alert("친구톡 메뉴는 현재 개발이 진행 중입니다."); */
-		$("input[name=friendId]").val("");
 		url = "<c:url value='/web/mjon/kakao/friendstalk/kakaoFriendsTalkMsgDataView.do'/>";
 		
 	}else if(tabInfo == 'tabAlimtalkIntrd'){
@@ -68,8 +66,10 @@
 		
 	}
 	
-	form.action =url;
-	form.submit();
+	//form.action =url;
+	//form.submit();
+	//메뉴 선택시 폼 데이터로 인한 오류 발생하여 location으로 변경 - 20240117 우영두
+	location.href=url;
 	
 }
 
src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/ft/KakaoFriendsTalkMsgDataView.jsp
--- src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/ft/KakaoFriendsTalkMsgDataView.jsp
+++ src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/ft/KakaoFriendsTalkMsgDataView.jsp
@@ -761,6 +761,19 @@
 //친구톡 데이터 전송 처리
 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 @@
 		
 		$("#imageType").val(imgChk);
 		
+		//json 파일 필요 유무 셋팅
+		$("#bizJsonYn").val("Y");
+	}
+	
+	//템플릿 버튼 갯수 체크 
+	var buttonCnt = $(".btn_kakao_type").length;
+
+	if(buttonCnt > 0){
+		//json 파일 필요 유무 셋팅
+		$("#bizJsonYn").val("Y");
 	}
 	
 	//친구톡 내용 체크
@@ -814,7 +837,6 @@
 		alert("입력하신 문구 중 \" " + rtnStr + " \" 는 일부 휴대폰에서 표기되지 않을 수 있습니다.");
 		
 	}
-	
 	
 
 	//수신번호 리스트 체크하기
@@ -1308,7 +1330,42 @@
 		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 @@
 				
 				<!-- 스팸 문구 유무 -->
 				<input type="hidden" id="spamStatus" name="spamStatus" value="N"/>
+				<input type="hidden" id="atSmishingYn" name="atSmishingYn" value="<c:out value='${atSmishingYn}' />"/>
 				
 				<!-- 오류 체크 -->
 				<input type="hidden" id="errorChk" name="errorChk" value="N"/>
@@ -1432,7 +1490,8 @@
 				<!-- 대체문자 여부 -->
 				<input type="hidden" id="subMsgSendYn" name="subMsgSendYn" value="N"/>
 				<input type="hidden" id="subMsgType" name="subMsgType" value="SMS"/>
-				
+				<input type="hidden" id="subMsgTxtReplYn" name="subMsgTxtReplYn" value="N"/>
+				<input type="hidden" id="subMsgTxt" name="subMsgTxt" value=""/>
 				
 				<!-- 발신번호정보 -->
 				<input type="hidden" id="callFrom" name="callFrom" value=""/>
@@ -1442,6 +1501,10 @@
 				<input type="hidden" id="eachPrice" name="eachPrice" value=""/>
 				<input type="hidden" id="totPrice" name="totalPrice" value=""/>
 				
+				<!-- 친구톡 발송 json 파일 필요 유무 -->
+				<input type="hidden" id="bizJsonYn" name="bizJsonYn" value="N"/>
+				
+				
 				<div class="send_general friend_talk_wrap kakao_wrap">
 					<div class="send_left">
 						<table class="tType1">
Add a comment
List