ITN_디자인팀 2023-07-10
Merge branch 'master' of http://alfk8281@vcs.iten.co.kr:9999/hylee/mjon_git
@29ed297f10d043d32bde5f2ea29c5440c83758b1
src/main/java/itn/let/kakao/admin/kakaoAt/service/MjonKakaoATService.java
--- src/main/java/itn/let/kakao/admin/kakaoAt/service/MjonKakaoATService.java
+++ src/main/java/itn/let/kakao/admin/kakaoAt/service/MjonKakaoATService.java
@@ -40,5 +40,7 @@
 	//회원 정보 알림톡 상세정보 리스트 팝업 통계 정보
 	KakaoVO selectMjonKakaoStatisticATData(KakaoVO searchVO) throws Exception;
 	
+	//알림톡 지연문자 리스트 조회
+	List<KakaoVO> selectKakaoATDelaySentList(String userId) throws Exception;
 }
 
src/main/java/itn/let/kakao/admin/kakaoAt/service/impl/MjonKakaoATDAO.java
--- src/main/java/itn/let/kakao/admin/kakaoAt/service/impl/MjonKakaoATDAO.java
+++ src/main/java/itn/let/kakao/admin/kakaoAt/service/impl/MjonKakaoATDAO.java
@@ -88,4 +88,8 @@
 		
 		return result;
 	}
+	@SuppressWarnings("unchecked")
+	public List<KakaoVO> selectKakaoATDelaySentList(String userId)  throws Exception{
+		return (List<KakaoVO>)list("mjonKakaoATDAO.selectKakaoATDelaySentList", userId);
+	}
 }
src/main/java/itn/let/kakao/admin/kakaoAt/service/impl/MjonKakaoATServiceImpl.java
--- src/main/java/itn/let/kakao/admin/kakaoAt/service/impl/MjonKakaoATServiceImpl.java
+++ src/main/java/itn/let/kakao/admin/kakaoAt/service/impl/MjonKakaoATServiceImpl.java
@@ -184,4 +184,9 @@
 		
 		return result;
 	}
+
+	@Override
+	public List<KakaoVO> selectKakaoATDelaySentList(String userId) throws Exception {
+		return mjonKakaoATDAO.selectKakaoATDelaySentList(userId);
+	}
 }
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
@@ -157,6 +157,32 @@
 					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();
+					}
+					
+					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);
+				}
+				
 				/**전송시간 설정 (끝)------------------------------------------------*/
 	
 				/**카카오 전송 데이터 추가*/
@@ -231,6 +257,8 @@
 				mjonMsgVO.setBefCash(kakaoVO.getBefCash());
 				mjonMsgVO.setBefPoint(kakaoVO.getBefPoint());
 				mjonMsgVO.setKakaoSubMagOrgnlTxt(kakaoVO.getKakaoSubMagOrgnlTxt());
+				mjonMsgVO.setAtDelayYn(kakaoVO.getAtSmishingYn());
+				
 				
 				if(kakaoVO.getBizJsonYn().equals("Y")) {
 					mjonMsgVO.setFileCnt("1");	
src/main/java/itn/let/kakao/user/kakaoAt/web/KakaoAlimTalkSendController.java
--- src/main/java/itn/let/kakao/user/kakaoAt/web/KakaoAlimTalkSendController.java
+++ src/main/java/itn/let/kakao/user/kakaoAt/web/KakaoAlimTalkSendController.java
@@ -49,11 +49,16 @@
 import itn.let.kakao.kakaoComm.kakaoApi.KakaoApiTemplate;
 import itn.let.kakao.kakaoComm.kakaoApi.service.KakaoApiService;
 import itn.let.kakao.user.kakaoAt.service.KakaoAlimTalkService;
+import itn.let.mjo.mjocommon.MjonCommon;
+import itn.let.mjo.msg.service.MjonMsgVO;
 import itn.let.mjo.msgdata.service.MjonMsgDataService;
 import itn.let.mjo.msgdata.service.MjonMsgDataVO;
 import itn.let.mjo.msgdata.service.MjonMsgReturnVO;
+import itn.let.sym.site.service.EgovSiteManagerService;
 import itn.let.sym.site.service.JoinSettingVO;
+import itn.let.uss.umt.service.EgovUserManageService;
 import itn.let.uss.umt.service.MberManageVO;
+import itn.let.uss.umt.service.UserManageVO;
 
 /**
  * 
@@ -86,10 +91,18 @@
 
 	@Resource(name = "MjonMsgDataService")
 	private MjonMsgDataService mjonMsgDataService;
+
+	/** userManageService */
+	@Resource(name = "userManageService")
+	private EgovUserManageService userManageService;
 	
 	/** EgovMessageSource */
 	@Resource(name="egovMessageSource")
 	EgovMessageSource egovMessageSource;
+	
+	/** 사이트 설정 */ 
+	@Resource(name = "egovSiteManagerService")
+	EgovSiteManagerService egovSiteManagerService;	
 	
 	@Autowired
 	KakaoApiProfile kakaoApiProfile;
@@ -154,6 +167,7 @@
 			
 			mberManageVO = mjonMsgDataService.selectMberManageInfo(userId);
 			
+			model.addAttribute("atSmishingYn", mberManageVO.getAtSmishingYn());
 		}
 		
 		//3.사용자 개인단가 정보가 0이 아니면 개인단가 사용, 없으면 시스템 기본 단가 사용
@@ -479,10 +493,9 @@
 		int resultSts = 0;			//발송결과 건수
 		int resultBlockSts = 0;		//수신거부 등록번호로 발송을 안한 건수
 		
+		LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
+		String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
 		try {
-
-			LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
-			String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
 			
 			if(userId == "") {
 				modelAndView.addObject("message", "로그인 후 이용이 가능합니다.");
@@ -491,7 +504,9 @@
 			}else {
 /** 카카오톡 전송 기본 설정 -------------------------------------------*/
 				kakaoVO.setSendType("AT");
+				kakaoVO.setMsgType("8");
 				kakaoVO.setUserId(userId);
+				
 			}
 			
 /** 전송금액 설정 --------------------------------------------------*/
@@ -709,6 +724,43 @@
 		modelAndView.addObject("result", "success");
 		modelAndView.addObject("resultSts", resultSts);
 		
+		
+/** 카카오톡 발송 내용 법인폰, 알림톡 결과 처리 --------------------------------------------------*/
+		try {
+			String adminSmsNoticeYn = "Y";
+			String spamStatus = kakaoVO.getAtSmishingYn(); // 스미싱 의심으로 체크된 고객 정보
+			
+			UserManageVO userManageVO = new UserManageVO();
+			userManageVO.setMberId(userId);
+			
+			if(!userId.equals("")) {
+				userManageVO = userManageService.selectAdminSmsNoticeYn(userManageVO);
+				adminSmsNoticeYn = userManageVO.getAdminSmsNoticeYn(); 
+			}
+			
+			//법인폰 알림 온 이거나 스미싱의심 문자인 경우 법인폰으로 발송
+			if(adminSmsNoticeYn.equals("Y") || spamStatus.equals("Y")) {
+				
+				if(spamStatus.equals("Y")) {
+					kakaoVO.setAtDelayYn("Y");
+				}
+				
+				// 법인폰 알람여부 체크
+				JoinSettingVO joinSettingVO = new JoinSettingVO();
+				joinSettingVO = egovSiteManagerService.selectAdminNotiDetail();
+				
+				// SLACK 체크
+				if (joinSettingVO != null && joinSettingVO.getSlackNoti().equals("Y")) {
+					//Slack으로 메세지 전송 처리
+					MjonCommon comm = new MjonCommon();
+//					comm.getAdminKakaoAtSandSlack(kakaoVO);
+				}
+			}
+			
+		} catch (Exception e) {
+			throw new Exception("++++++++++++++++++++++ getAdminPhoneSendMsgData Error !!! " + e);
+		}
+		
 		return modelAndView;
 	}
 }
src/main/java/itn/let/mjo/mjocommon/MjonCommon.java
--- src/main/java/itn/let/mjo/mjocommon/MjonCommon.java
+++ src/main/java/itn/let/mjo/mjocommon/MjonCommon.java
@@ -12,6 +12,7 @@
 
 import com.mysql.jdbc.StringUtils;
 
+import itn.let.kakao.kakaoComm.KakaoVO;
 import itn.let.mjo.msg.service.MjonMsgVO;
 
 @Service("MjonCommon")
@@ -242,4 +243,63 @@
 		return mjonMsgVO;
 	}
 	
+	@SuppressWarnings("unchecked")
+	public void getAdminKakaoAtSandSlack(KakaoVO kakaoVO) {
+		
+		HttpClient client = new HttpClient();
+		PostMethod post = new PostMethod(url);
+		JSONObject json = new JSONObject();
+		try {
+			
+			String reserveYn = kakaoVO.getReserveYn();
+			String atDelayYn = kakaoVO.getAtDelayYn();
+			String smsTxt = kakaoVO.getTemplateContent();
+			String reservSmsTxt = "";
+			String smisingSmsTxt = "";
+			//예약문자를 발송하는 경우 문자 내용 앞에 "[예약]" 표시되도록 처리
+			if(reserveYn.equals("Y")) {
+				reservSmsTxt = "[예약]" + smsTxt;
+				smsTxt = reservSmsTxt;
+			}else if(atDelayYn.equals("Y")) {
+				
+				smisingSmsTxt = "[스미싱의심]" + smsTxt;
+				smsTxt = smisingSmsTxt;
+			}
+			
+			String sandName = kakaoVO.getCallFrom();
+			String userId = kakaoVO.getUserId();
+			String msgType = "";
+			
+			if(kakaoVO.getMsgType().equals("8")) {
+				msgType = "[알림톡]";
+			}else if(kakaoVO.getMsgType().equals("9")){
+				
+			}
+			sandName = "[" + userId + "]" + "[" + sandName + "]" + msgType;
+			
+			json.put("channel", "mjon메시지");
+			json.put("text", smsTxt);
+			json.put("username", sandName);
+			
+			
+			post.addParameter("payload", json.toString());
+			// 처음에 utf-8로 content-type안넣어주니까 한글은 깨져서  content-type넣어줌
+			post.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
+			int responseCode = client.executeMethod(post);
+			String response = post.getResponseBodyAsString();
+			if (responseCode != HttpStatus.SC_OK) { 
+				System.out.println("Response: " + response);
+			}
+		} catch (IllegalArgumentException e) {
+			System.out.println("IllegalArgumentException posting to Slack " + e);
+		} catch (IOException e) {
+			System.out.println("IOException posting to Slack " + e);
+		} catch (Exception e) {
+			System.out.println("Exception posting to Slack " + e);
+		} finally {
+			post.releaseConnection();
+		}
+		
+	}
+	
 }
src/main/java/itn/let/mjo/msg/service/MjonMsgService.java
--- src/main/java/itn/let/mjo/msg/service/MjonMsgService.java
+++ src/main/java/itn/let/mjo/msg/service/MjonMsgService.java
@@ -198,6 +198,12 @@
 	//스팸 / 스미싱 지연 문자 즉시 발송처리
 	int updateMsgDelaySendRealTimeData(MjonResvMsgVO mjonResvMsgVO) throws Exception;
 	
+	//스팸 / 스미싱 지연 알림톡 발송 취소 처리
+	int deleteKakaoAtDelaySendCancelData(MjonResvMsgVO mjonResvMsgVO) throws Exception;
+	
+	//스팸 / 스미싱 지연 알림톡 즉시 발송처리
+	int updateKakaoAtDelaySendRealTimeData(MjonResvMsgVO mjonResvMsgVO) throws Exception;
+	
 	//문자 그룹아이디 리스트의 발송일자 정보 불러오기
 	List<MjonResvMsgVO> selectMsgGroupDataReqDateList(MjonResvMsgVO mjonResvMsgVO) throws Exception;
 	
@@ -212,6 +218,7 @@
 	
 	//카카오 발송 횟수
 	List<MjonMsgVO> selectWithKakaoSendTotCnt(MjonMsgVO mjonMsgVO) throws Exception;
+	
 	//문자 발송 횟수
 	List<MjonMsgVO> selectMsgSendTotCnt(MjonMsgVO mjonMsgVO) throws Exception;
 }
src/main/java/itn/let/mjo/msg/service/MjonMsgVO.java
--- src/main/java/itn/let/mjo/msg/service/MjonMsgVO.java
+++ src/main/java/itn/let/mjo/msg/service/MjonMsgVO.java
@@ -354,6 +354,10 @@
 	private String delayYn;			// 문자 30분 지연 처리 유무
 	private String delayCompleteYn; // 문자 30분 지연 처리 완료 유무
 	
+	private String atDelayYn = "N";			// 알림 30분 지연 처리 유무
+	private String atDelayCompleteYn;	// 알림톡 30분 지연 처리 완료 유무
+	private String atSmishingYn;		// 알림톡 스메싱 여부
+	
 	private int totalCallCnt;	//수신자 전체 갯
 	
 	private String bizLogCallStatus;	//다우기술 biz_log 테이블의 발송결과 코드 값.
@@ -1375,5 +1379,22 @@
 	public void setAccessKey(String accessKey) {
 		this.accessKey = accessKey;
 	}
-	
+	public String getAtDelayYn() {
+		return atDelayYn;
+	}
+	public void setAtDelayYn(String atDelayYn) {
+		this.atDelayYn = atDelayYn;
+	}
+	public String getAtDelayCompleteYn() {
+		return atDelayCompleteYn;
+	}
+	public void setAtDelayCompleteYn(String atDelayCompleteYn) {
+		this.atDelayCompleteYn = atDelayCompleteYn;
+	}
+	public String getAtSmishingYn() {
+		return atSmishingYn;
+	}
+	public void setAtSmishingYn(String atSmishingYn) {
+		this.atSmishingYn = atSmishingYn;
+	}
 }
src/main/java/itn/let/mjo/msg/service/impl/MjonMsgDAO.java
--- src/main/java/itn/let/mjo/msg/service/impl/MjonMsgDAO.java
+++ src/main/java/itn/let/mjo/msg/service/impl/MjonMsgDAO.java
@@ -431,6 +431,26 @@
 		update("mjonMsgDAO.updateMsgDelaySendRealTimeMsgGroupDataFlag", mjonMsgVO);
 	}
 	
+	// mj_msg_data 테이블 지연 알림톡 취소 값 수정
+	public void updateKakaoAtDelayCancelMsgDataFlag(MjonMsgVO mjonMsgVO) {
+		update("mjonMsgDAO.updateKakaoAtDelayCancelMsgDataFlag", mjonMsgVO);
+	}
+	
+	// mj_msg_group_data 테이블 지연 알림톡 취소 값 수정
+	public void updateKakaoAtDelayCancelMsgGroupDataFlag(MjonMsgVO mjonMsgVO) {
+		update("mjonMsgDAO.updateKakaoAtDelayCancelMsgGroupDataFlag", mjonMsgVO);
+	}
+	
+	// mj_msg_data 테이블 지연 알림톡 즉시발송 요청시간 수정
+	public void updateKakaoAtDelaySendRealTimeMsgDataFlag(MjonMsgVO mjonMsgVO) {
+		update("mjonMsgDAO.updateKakaoAtDelaySendRealTimeMsgDataFlag", mjonMsgVO);
+	}
+	
+	// mj_msg_group_data 테이블 지연 알림톡  즉시발송 요청시간 수정
+	public void updateKakaoAtDelaySendRealTimeMsgGroupDataFlag(MjonMsgVO mjonMsgVO) {
+		update("mjonMsgDAO.updateKakaoAtDelaySendRealTimeMsgGroupDataFlag", mjonMsgVO);
+	}
+	
 	//문자 그룹아이디 리스트의 발송일자 정보 불러오기
 	@SuppressWarnings("unchecked")
 	public List<MjonResvMsgVO> selectMsgGroupDataReqDateList(MjonResvMsgVO mjonResvMsgVO) throws Exception{
src/main/java/itn/let/mjo/msg/service/impl/MjonMsgServiceImpl.java
--- src/main/java/itn/let/mjo/msg/service/impl/MjonMsgServiceImpl.java
+++ src/main/java/itn/let/mjo/msg/service/impl/MjonMsgServiceImpl.java
@@ -2,6 +2,7 @@
 
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
+import java.util.Calendar;
 import java.util.Date;
 import java.util.List;
 
@@ -17,6 +18,7 @@
 import egovframework.rte.fdl.security.intercept.EgovReloadableFilterInvocationSecurityMetadataSource;
 import egovframework.rte.fdl.security.userdetails.util.EgovUserDetailsHelper;
 import itn.com.cmm.LoginVO;
+import itn.com.cmm.util.MJUtil;
 import itn.com.utl.fcc.service.EgovDateUtil;
 import itn.let.mjo.msg.service.MjPhoneMemberVO;
 import itn.let.mjo.msg.service.MjonMapAddressVO;
@@ -841,6 +843,121 @@
 		return resultSts;
 	}
 	
+	//스팸 / 스미싱 지연 알림톡 발송 취소 처리
+	@Override
+	public int deleteKakaoAtDelaySendCancelData(MjonResvMsgVO mjonResvMsgVO) throws Exception {
+
+		int resultSts = 0;
+		
+		try {
+			
+			System.out.println("++++++++++++++++++ deleteKakaoAtDelaySendCancelData groupId ::: "+mjonResvMsgVO.getMsgGroupId());
+			//삭제 문자 건수 MSG_SEQ 번호 받아오기
+			List<MjonResvMsgVO> resultMsgSeqList = mjonReservMsgDAO.selectMsgSeqListByGroupId(mjonResvMsgVO);
+			
+			int size = resultMsgSeqList.size();
+			List<String> userDataList = new ArrayList<String>();
+			for(int i=0; i < size; i++) {
+				userDataList.add(resultMsgSeqList.get(i).getUserData());
+				System.out.println(resultMsgSeqList.get(i).getUserData());
+			}
+			
+			mjonResvMsgVO.setUserDataList(userDataList);
+			
+			
+			//비즈뿌리오 딜레이 알림톡 삭제
+			resultSts = mjonReservMsgDAO.deleteBizMsgSeqListByMsgSeq(mjonResvMsgVO);
+			
+			System.out.println("++++++++++++++++++++++++++++++ resultSts ::: "+resultSts);
+			
+			//예약 취소 환불 처리
+			if(resultSts > 0) {
+				
+				//그룹 데이터 정보 조회하기
+				MjonMsgVO mjonMsgVO = mjonMsgDAO.selectMsgGroupDataByGoupId(mjonResvMsgVO);
+				
+				//mj_msg_data 테이블 지연 문자 취소 값 수정
+				mjonMsgDAO.updateKakaoAtDelayCancelMsgDataFlag(mjonMsgVO);
+				
+				//mj_msg_group_data 테이블 예약 취소 값 수정
+				mjonMsgDAO.updateKakaoAtDelayCancelMsgGroupDataFlag(mjonMsgVO);
+				
+				
+				//문자 발송 캐시 환불 해주기
+				MjonPayVO mjonPayVO = new MjonPayVO(); 
+				
+				mjonPayVO.setCashId(idgenMjonCashId.getNextStringId());
+				mjonPayVO.setUserId(mjonMsgVO.getUserId());
+				mjonPayVO.setCash(Float.parseFloat(mjonMsgVO.getTotPrice()));
+				mjonPayVO.setFrstRegisterId(mjonMsgVO.getUserId());
+				mjonPayVO.setMemo("스팸/스미싱 지연 알림톡 취소 " + resultSts + "건  환불");
+				mjonPayVO.setMsgGroupId(mjonMsgVO.getMsgGroupId());
+				
+				mjonPayDAO.insertCash(mjonPayVO); //캐시 환불 
+				mjonPayDAO.updateMemberCash(mjonPayVO); //회원정보 업데이트
+				
+			}
+			
+			
+		} catch (Exception e) {
+			System.out.println("+++++++++++++++++++++++++++++++++++ deleteMsgDelaySendCancelData ServiceImpl Error !!!! "+e);
+		}
+		return resultSts;
+		
+	}
+
+	//스팸 / 스미싱 지연 알림톡 즉시 발송처리
+	@Override
+	public int updateKakaoAtDelaySendRealTimeData(MjonResvMsgVO mjonResvMsgVO) throws Exception {
+
+		int resultSts = 0;
+		
+		try {
+			boolean timeType = true;
+			
+			System.out.println("++++++++++++++++++ updateKakaoAtDelaySendRealTimeData groupId ::: "+mjonResvMsgVO.getMsgGroupId());
+			//삭제 문자 건수 MSG_SEQ 번호 받아오기
+			List<MjonResvMsgVO> resultMsgSeqList = mjonReservMsgDAO.selectMsgSeqListByGroupId(mjonResvMsgVO);
+			
+			int size = resultMsgSeqList.size();
+			List<String> userDataList = new ArrayList<String>();
+			for(int i=0; i < size; i++) {
+				userDataList.add(resultMsgSeqList.get(i).getUserData());
+				System.out.println(resultMsgSeqList.get(i).getUserData());
+			}
+			mjonResvMsgVO.setUserDataList(userDataList);
+			
+			if(resultMsgSeqList.get(0).getReserveYn().equals("N")) {
+				// 즉시 발송시
+				//비즈뿌리오  딜레이문자 즉시발송 처리
+				resultSts = mjonReservMsgDAO.updateRealTimeBizMsgSeqListByMsgSeq(mjonResvMsgVO);
+				
+			}else { 
+				// 예약 발송시
+				//비즈뿌리오  딜레이문자 예약발송 처리
+				resultSts = mjonReservMsgDAO.updateReserveTimeBizMsgSeqListByMsgSeq(mjonResvMsgVO);
+			}
+			
+			System.out.println("++++++++++++++++++++++++++++++ resultSts ::: "+resultSts);
+			
+			//발송 시간 수정(mj_msg_data, mj_msg_group_data)
+			if(resultSts > 0) {
+				//그룹 데이터 정보 조회하기
+				MjonMsgVO mjonMsgVO = mjonMsgDAO.selectMsgGroupDataByGoupId(mjonResvMsgVO);
+				//mj_msg_data 테이블 지연 문자 즉시발송 요청 값 수정
+				mjonMsgDAO.updateKakaoAtDelaySendRealTimeMsgDataFlag(mjonMsgVO);
+				//mj_msg_group_data 테이블 즉시발송 요청 값 수정
+				mjonMsgDAO.updateKakaoAtDelaySendRealTimeMsgGroupDataFlag(mjonMsgVO);
+			}
+			
+		} catch (Exception e) {
+			System.out.println("+++++++++++++++++++++++++++++++++++ updateMsgDelaySendRealTimeDataAjax ServiceImpl Error !!!! "+e);
+		}
+		
+		
+		return resultSts;
+	}
+	
 	//문자 그룹아이디 리스트의 발송일자 정보 불러오기
 	@Override
 	public List<MjonResvMsgVO> selectMsgGroupDataReqDateList(MjonResvMsgVO mjonResvMsgVO) throws Exception{
src/main/java/itn/let/mjo/msg/web/MjonMsgController.java
--- src/main/java/itn/let/mjo/msg/web/MjonMsgController.java
+++ src/main/java/itn/let/mjo/msg/web/MjonMsgController.java
@@ -3619,6 +3619,161 @@
     }
     
     /**
+     * 스팸 및 스미싱 30분 지연알림톡 전송 취소 처리
+     * @param mjonMsgVO
+     * @param model
+     * @return	"/uss/ion/msg/deleteKakaoATDelaySendCancelDataAjax.do"
+     * @throws Exception
+     */
+    @RequestMapping(value = {"/uss/ion/msg/deleteKakaoATDelaySendCancelDataAjax.do"})
+   	public ModelAndView deleteKakaoATDelaySendCancelDataAjax(MjonMsgVO mjonMsgVO) throws Exception {
+    	
+       	ModelAndView modelAndView = new ModelAndView();
+       	modelAndView.setViewName("jsonView");
+       	
+       	String isStatus = "";
+		String msg = "";
+		
+		//로그인 정보 획득
+       	LoginVO	loginVO = (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser();
+    	String	userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
+       	
+    	if(userId.equals("")) {
+    		
+    		modelAndView.addObject("isStatus", "loginFail");
+			modelAndView.addObject("msg", "로그인이 필요합니다.");
+			return modelAndView;	
+    		
+    	}
+       	
+       	try {
+       		
+       		MjonResvMsgVO mjonResvMsgVO = new MjonResvMsgVO();
+       		mjonResvMsgVO.setUserId(mjonMsgVO.getUserId());//회원 아이디
+       		
+       		
+       		String[] arrMsgGroupId = mjonMsgVO.getMsgGroupId().split(",");
+       		int resultSts = 0;
+       		
+       		//문자 발송요청일자 체크해주기
+       		boolean compareReqDate = getCompareReqDateList(arrMsgGroupId, mjonMsgVO.getUserId());
+       		
+       		if(!compareReqDate) {
+   				
+   				modelAndView.addObject("isStatus", "dateFail");
+       			modelAndView.addObject("msg", "발송시간이 지난 문자가 있습니다. 문자 발송예정 시간을 확인해 주세요.");
+       			return modelAndView;
+   			}
+       		
+       		for(String temp : arrMsgGroupId) {
+       			
+       			mjonResvMsgVO.setMsgGroupId(temp);//취소 문자 그룹 아이디
+       			int count = mjonMsgService.deleteKakaoAtDelaySendCancelData(mjonResvMsgVO);
+       			
+       			resultSts = resultSts + count;
+       			
+       		}
+       		
+       		if(resultSts > 0) {
+       			
+       			modelAndView.addObject("isStatus", "success");
+       			modelAndView.addObject("msg", "발송취소가 정상적으로 처리되었습니다.");
+       			
+       		}else {
+       			
+       			modelAndView.addObject("isStatus", "fail");
+       			modelAndView.addObject("msg", "발송취소에 오류가 발생하였습니다.");
+       		}
+			
+		} catch (Exception e) {
+			System.out.println("+++++++++++++++++++++++++++++++++++ deleteKakaoATDelaySendCancelDataAjax Controller Error !!!! "+e);
+			modelAndView.addObject("isStatus", "fail");
+			modelAndView.addObject("msg", "오류가 발생하였습니다.");
+			return modelAndView;
+		}
+       	return modelAndView;
+    }
+    
+    
+	/**
+     * 스팸 및 스미싱 30분 지연알림톡 즉시 전송 처리
+     * @param mjonMsgVO
+     * @param model
+     * @return	"/uss/ion/msg/updateKakaoATDelaySendRealTimeDataAjax.do"
+     * @throws Exception
+     */
+    @RequestMapping(value = {"/uss/ion/msg/updateKakaoATDelaySendRealTimeDataAjax.do"})
+   	public ModelAndView updateKakaoATDelaySendRealTimeDataAjax(MjonMsgVO mjonMsgVO) throws Exception {
+    	
+       	ModelAndView modelAndView = new ModelAndView();
+       	modelAndView.setViewName("jsonView");
+       	
+       	String isStatus = "";
+		String msg = "";
+		
+		//로그인 정보 획득
+       	LoginVO	loginVO = (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser();
+    	String	userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
+       	
+    	if(userId.equals("")) {
+    		
+    		modelAndView.addObject("isStatus", "loginFail");
+			modelAndView.addObject("msg", "로그인이 필요합니다.");
+			return modelAndView;	
+    		
+    	}
+       	
+       	try {
+       		
+       		MjonResvMsgVO mjonResvMsgVO = new MjonResvMsgVO();
+       		mjonResvMsgVO.setUserId(mjonMsgVO.getUserId());//회원 아이디
+       		
+       		String[] arrMsgGroupId = mjonMsgVO.getMsgGroupId().split(",");
+       		int resultSts = 0;
+       		
+       		//문자 발송요청일자 체크해주기
+       		boolean compareReqDate = getCompareReqDateList(arrMsgGroupId, mjonMsgVO.getUserId());
+       		
+       		if(!compareReqDate) {
+   				
+   				modelAndView.addObject("isStatus", "dateFail");
+       			modelAndView.addObject("msg", "발송시간이 지난 문자가 있습니다. 문자 발송예정 시간을 확인해 주세요.");
+       			return modelAndView;
+   			}
+       		
+       		for(String temp : arrMsgGroupId) {
+       			
+       			mjonResvMsgVO.setMsgGroupId(temp);//취소 문자 그룹 아이디
+       			
+       			//문자 발송 지연 데이터 즉시 발송처리
+           		int count = mjonMsgService.updateKakaoAtDelaySendRealTimeData(mjonResvMsgVO);
+           		
+           		resultSts = resultSts + count;
+       			
+       		}
+       	
+       		if(resultSts > 0) {
+       			
+       			modelAndView.addObject("isStatus", "success");
+       			modelAndView.addObject("msg", "즉시 발송 처리가 완료되었습니다.");
+       			
+       		}else {
+       			
+       			modelAndView.addObject("isStatus", "fail");
+       			modelAndView.addObject("msg", "즉시 발송 처리에 오류가 발생하였습니다.");
+       		}
+			
+		} catch (Exception e) {
+			System.out.println("+++++++++++++++++++++++++++++++++++ updateKakaoATDelaySendRealTimeDataAjax Controller Error !!!! "+e);
+			modelAndView.addObject("isStatus", "fail");
+			modelAndView.addObject("msg", "오류가 발생하였습니다.");
+			return modelAndView;
+		}
+       	
+       	return modelAndView;
+    }
+    
+    /**
      * 전송사 발송 통계
      * @param 
      * @param 
src/main/java/itn/let/mjo/reservmsg/service/MjonResvMsgVO.java
--- src/main/java/itn/let/mjo/reservmsg/service/MjonResvMsgVO.java
+++ src/main/java/itn/let/mjo/reservmsg/service/MjonResvMsgVO.java
@@ -29,6 +29,7 @@
 	private String fileCnt;			//첨부 이미지 갯수 - 0: 장문, 1 이상은 그림문자
 	private String totMsgCnt;		//전체 전송문자 갯수
 	private String curState;		//전송 처리 결과값
+	private String reserveYn;		//예약 여부
 	private String reserveCYn;		//예약 취소 여부
 	private String filePath1;		//그림 이미지 1
 	private String filePath2;		//그림 이미지 2
@@ -290,5 +291,10 @@
 	public void setStrReqDate(String strReqDate) {
 		this.strReqDate = strReqDate;
 	}
-	
+	public String getReserveYn() {
+		return reserveYn;
+	}
+	public void setReserveYn(String reserveYn) {
+		this.reserveYn = reserveYn;
+	}
 }
src/main/java/itn/let/mjo/reservmsg/service/impl/MjonReservMsgDAO.java
--- src/main/java/itn/let/mjo/reservmsg/service/impl/MjonReservMsgDAO.java
+++ src/main/java/itn/let/mjo/reservmsg/service/impl/MjonReservMsgDAO.java
@@ -277,4 +277,15 @@
 		
 		return update("MjonReservMsgDAO.updateRealTimeJJB02MsgSeqListByMsgSeq", mjonResvMsgVO);
 	}
+	
+	/**
+	* @Method Name : updateReserveTimeBizMsgSeqListByMsgSeq
+	* @작성일 : 2023. 07. 06.
+	* @작성자 :  WYD
+	* @Method 설명 : 비즈뿌리오 지연처리 문자 예약 발송
+	*/
+	public int updateReserveTimeBizMsgSeqListByMsgSeq(MjonResvMsgVO mjonResvMsgVO) {
+		
+		return update("MjonReservMsgDAO.updateReserveTimeBizMsgSeqListByMsgSeq", mjonResvMsgVO);
+	}
 }
src/main/java/itn/let/mjo/test/web/TestController.java
--- src/main/java/itn/let/mjo/test/web/TestController.java
+++ src/main/java/itn/let/mjo/test/web/TestController.java
@@ -1157,21 +1157,10 @@
 				
 		try {
 			
-			LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
-	    	userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
-
-
-	    	// api인지 확인
-    		ApiKeyVO apiKeyVO = new ApiKeyVO();
-    		apiKeyVO.setAccessKey(mjonMsgVO.getAccessKey());
-    		List<ApiKeyVO> resultList = apiKeyMngService.selectCheckApiKeyDup(apiKeyVO);
-    		
-    		if(resultList.size() >= 1) {
-    			userId = resultList.get(0).getMberId();
-    		}
-
+//			LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
+//	    	userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
 	    	
-	    	
+			userId = mjonMsgVO.getMberId();
         	if(userId.equals("")) {
         		
         		modelAndView.addObject("message", "로그인 후 이용이 가능합니다.");
@@ -1388,6 +1377,9 @@
     			
     		}
     		
+    		// 토탈금액 "," 리플레이스 처리
+    		mjonMsgVO.setTotPrice(mjonMsgVO.getTotPrice().replaceAll(",", ""));
+    		
         	float tmpOrgEachPrice = Float.parseFloat(mjonMsgVO.getEachPrice());
         	float tmpOrgTotPrice = Float.parseFloat(mjonMsgVO.getTotPrice());
         	
@@ -1517,8 +1509,6 @@
         		shortMsgVO = mjonMsgVO;
         		longMsgVO = mjonMsgVO;
         		imgMsgVO = mjonMsgVO;
-        		System.out.println("shortMsgVO :: "+ shortMsgVO.getsPrice());
-        		System.out.println("mjonMsgVO :: "+ mjonMsgVO.getsPrice());
         		
         		int shortMsgCnt = Integer.parseInt(mjonMsgVO.getShortMsgCnt());
         		int longMsgCnt = Integer.parseInt(mjonMsgVO.getLongMsgCnt());
@@ -1768,7 +1758,14 @@
         			imgMsgVO.setRep4List(imgRep4);
         			
         			//개별단가 계산하기
-        			String eachPrice = shortMsgVO.getsPrice();
+        			String eachPrice = imgMsgVO.getpPrice();
+        			
+        			//api 서버에서 pPrice 값이 없는 경우가 있어서 오류 방지를위해서 추가
+        			if(eachPrice == null) {
+        				
+        				eachPrice = imgMsgVO.getEachPrice();
+        				
+        			}
         			
         			/**
         			 * 그림문자에 치환 내용이 포함되어 있는 경우 단가 계산하기.
@@ -1813,9 +1810,12 @@
         			
         			//개별단가 계산하기
         			String eachPrice = shortMsgVO.getsPrice();
-        			if(StringUtils.isEmpty(eachPrice))
-        			{
+        			
+        			//api 서버에서 sPrice 값이 없는 경우가 있어서 오류 방지를위해서 추가
+        			if(eachPrice == null) {
+        				
         				eachPrice = shortMsgVO.getEachPrice();
+        				
         			}
         			
         			/**
@@ -1845,7 +1845,6 @@
         				shortMsgVO.setMsgType("4");
         			}
         			
-        			System.out.println("shortMsgVO.getEachPrice() :: "+ shortMsgVO.getEachPrice());
         			//총금액 계산하기
         			Float sTotPrice = Float.parseFloat(shortMsgVO.getEachPrice()) * shortCnt;
         			shortMsgVO.setTotPrice(sTotPrice.toString());
@@ -1870,6 +1869,13 @@
         			 * */
         			
         			String eachPrice = longMsgVO.getmPrice();
+        			
+        			//api 서버에서 mPrice 값이 없는 경우가 있어서 오류 방지를위해서 추가
+        			if(eachPrice == null) {
+        				
+        				eachPrice = longMsgVO.getEachPrice();
+        				
+        			}
         			
         			if(fileCount > 2) {//그림 이미지가 3개
             			
@@ -2001,9 +2007,7 @@
         	}else {
         		
         		//문자발송 함수 호출 - 일괄변환이 없거나, 그림문자 일괄변환의 경우 한번에 전송 처리
-        		System.out.println("???????");
         		modelAndView = fncSendMsg(mjonMsgVO);
-        		System.out.println("!!!!!!!!!!!!");
         		
         	}
         	
@@ -2060,16 +2064,13 @@
 				// 법인폰 알람여부 체크
 				JoinSettingVO joinSettingVO = new JoinSettingVO();
 				joinSettingVO = egovSiteManagerService.selectAdminNotiDetail();
-				// SMS 체크
-				if (joinSettingVO != null && joinSettingVO.getSmsNoti().equals("Y")) {
-//					getAdminPhoneSendMsgData(mjonMsgVO);	
-				}				
 				
 				// SLACK 체크
 				if (joinSettingVO != null && joinSettingVO.getSlackNoti().equals("Y")) {
 					//Slack으로 메세지 전송 처리
 					MjonCommon comm = new MjonCommon();
-					comm.getAdminSandSlack(mjonMsgVO);
+					System.out.println("slack noti");
+//					comm.getAdminSandSlack(mjonMsgVO);
 				}
 			}
 			
@@ -2079,11 +2080,6 @@
 		}
 		
  		return modelAndView;
-	
-		
-		
-		
-		
 	}
 	/**
 	 * 문자발송시 치환문자가 있거나 단문, 장문 일경우 타는 로직
src/main/java/itn/let/uss/umt/web/EgovUserManageController.java
--- src/main/java/itn/let/uss/umt/web/EgovUserManageController.java
+++ src/main/java/itn/let/uss/umt/web/EgovUserManageController.java
@@ -1366,7 +1366,7 @@
 			
 			/*
 			 * 알림톡/친구톡 최근 발송내역 리스트 불러오기
-			 * */
+			 */
 			
 			KakaoVO sendKakaoVO = new KakaoVO();
 			sendKakaoVO.setSearchCondition2("N");//예약건은 제외하기
@@ -1380,35 +1380,38 @@
 			List<KakaoVO> kakaoResultList = new ArrayList<KakaoVO>();
 			kakaoResultList = mjonKakaoATService.selectMjonKakaoATGroupCompleteByUserList(sendKakaoVO);
 			
-	        model.addAttribute("kakaoResultList", kakaoResultList);
+			model.addAttribute("kakaoResultList", kakaoResultList);
 			
 			/*
 			 * 알림톡/친구톡 예약발송 리스트 불러오기
-			 * */
-	        
-	        KakaoVO reserveKakaoVO = new KakaoVO();
-	        reserveKakaoVO.setSearchCondition2("Y");//예약건만 불러오기
-	        reserveKakaoVO.setReserveCYn("N");//예약취소건은 제외하기
-	        reserveKakaoVO.setUserId(reqMberManageVO.getMberId());
+			 */
+			
+			KakaoVO reserveKakaoVO = new KakaoVO();
+			reserveKakaoVO.setSearchCondition2("Y");//예약건만 불러오기
+			reserveKakaoVO.setReserveCYn("N");//예약취소건은 제외하기
+			reserveKakaoVO.setUserId(reqMberManageVO.getMberId());
 			// 문자발송 완료건은 모두 보이도록 처리
 			//kakaoVO.setMsgType("8");
-	        reserveKakaoVO.setSearchSortCnd("reqDate");
-	        reserveKakaoVO.setSearchSortOrd("desc");
-	        reserveKakaoVO.setFirstIndex(0);
+			reserveKakaoVO.setSearchSortCnd("reqDate");
+			reserveKakaoVO.setSearchSortOrd("desc");
+			reserveKakaoVO.setFirstIndex(0);
 			List<KakaoVO> kakaoReserveList = new ArrayList<KakaoVO>();
 			kakaoReserveList = mjonKakaoATService.selectReserveMjonKakaoATGroupList(reserveKakaoVO);
 			
-	        model.addAttribute("kakaoReserveList", kakaoReserveList);
+			model.addAttribute("kakaoReserveList", kakaoReserveList);
+			
 			
 			/*
-			 * 팩스 발송 내역 리스트 불러오기
-			 * */
-
+			 * 알림톡 지연처리 알림톡 내용 불러오기(30분 지연처리된 알림톡 내역 불러오기)
+			 */
+			List<KakaoVO> kakaoATDelaySentList = mjonKakaoATService.selectKakaoATDelaySentList(reqMberManageVO.getMberId());
+			
+			model.addAttribute("kakaoATDelaySentList", kakaoATDelaySentList);
+		}
+		
+		{//팩스 발송 내역 리스트 불러오기
 			List<FaxGroupDataVO> faxSendListVO = faxService.selectFaxMainList(new FaxGroupDataVO(reqMberManageVO.getMberId()));
 			model.addAttribute("faxSendListVO", faxSendListVO);
-				
-			//}
-			
 		}
 		
 		{//사용중인 전송사 정보 조회하기 - 사용자 전용 전송사 리스트 표시용
src/main/resources/egovframework/sqlmap/let/kakao/MjonKakaoATData_SQL_mysql.xml
--- src/main/resources/egovframework/sqlmap/let/kakao/MjonKakaoATData_SQL_mysql.xml
+++ src/main/resources/egovframework/sqlmap/let/kakao/MjonKakaoATData_SQL_mysql.xml
@@ -348,6 +348,8 @@
         M2.yellowId ,
         M2.userNm ,
         M2.atSmishingYn ,
+        M2.atDelayCompleteYn,
+        M2.atDelayYn,
 		( SELECT COUNT(0) 
 			FROM    MJ_MSG_DATA C
 			WHERE   C.DEL_FLAG     = 'N'
@@ -451,46 +453,49 @@
 	        MSG_NOTICETALK_TMP_KEY               AS msgNoticetalkTmpKey ,
 	        MKPI.YELLOW_ID                       AS yellowId ,
 	        LTM.MBER_NM                          AS userNm ,
-	        LTM.AT_SMISHING_YN					 AS atSmishingYn,
+	        LTM.AT_SMISHING_YN						AS atSmishingYn,
 			BIZ_UMID                              AS bizUmid,
 			BL.CALL_STATUS                        AS callStatus,
-			M.BIZ_KAKAO_RESEND_YN                 AS bizKakaoResendYn
-		FROM ( 
-				SELECT MG.USER_ID ,
-				MG.MSG_GROUP_ID ,
-				MG.MSG_GROUP_CNT ,
-				MG.SMS_TXT ,
-				MG.SUBJECT ,
-				MG.REGDATE ,
-				MG.REQ_DATE ,
-				MD.RSLT_DATE ,
-				MG.CALL_FROM ,
-				MG.TOT_PRICE ,
-				MG.EACH_PRICE ,
-				MG.DEL_FLAG ,
-				MG.MSG_TYPE ,
-				MG.FILE_CNT ,
-				MG.AGENT_CODE ,
-				MG.RESERVE_YN ,
-				MG.RESERVE_C_YN ,
-				MG.CANCELDATE ,
-				MD.MSG_SEQ ,
-				MD.CALL_TO ,
-				MD.CUR_STATE ,
-				MD.RSLT_CODE ,
-				MD.RSLT_CODE2 ,
-				CASE
+			M.BIZ_KAKAO_RESEND_YN                 AS bizKakaoResendYn,
+			M.AT_DELAY_COMPLETE_YN					AS atDelayCompleteYn,
+			M.AT_DELAY_YN							AS atDelayYn
+		FROM
+			(SELECT
+				MG.USER_ID
+				, MG.MSG_GROUP_ID
+				, MG.MSG_GROUP_CNT
+				, MG.SMS_TXT
+				, MG.SUBJECT
+				, MG.REGDATE
+				, MG.REQ_DATE
+				, MD.RSLT_DATE
+				, MG.CALL_FROM
+				, MG.TOT_PRICE
+				, MG.EACH_PRICE
+				, MG.DEL_FLAG
+				, MG.MSG_TYPE
+				, MG.FILE_CNT
+				, MG.AGENT_CODE
+				, MG.RESERVE_YN
+				, MG.RESERVE_C_YN
+				, MG.CANCELDATE
+				, MD.MSG_SEQ
+				, MD.CALL_TO
+				, MD.CUR_STATE
+				, MD.RSLT_CODE
+				, MD.RSLT_CODE2
+				, CASE
 					 WHEN MG.MSG_TYPE = '8'
 					 THEN '알림톡'
 					 WHEN MG.MSG_TYPE = '9'
 					 THEN '친구톡'
-				END msgTypeName ,
-				CASE
+				END msgTypeName
+				, CASE
 					WHEN MG.MSG_TYPE = '8'
 					THEN '1'
 					ELSE '2'
-				END orderByCode , 
-				(
+				END orderByCode
+				, (
 					CASE
 						WHEN MD.RSLT_CODE = '7000'
 						THEN 'S'
@@ -498,18 +503,24 @@
 						THEN 'W'
 						ELSE 'F'
 					END 
-				) AS result ,
-				MSG_NOTICETALK_SENDER_KEY ,
-				MSG_NOTICETALK_TMP_KEY,
-				MD.BIZ_UMID,
-				MD.BIZ_KAKAO_RESEND_YN
-			FROM    MJ_MSG_DATA MD ,
-					MJ_MSG_GROUP_DATA MG
-			WHERE	MD.MSG_GROUP_ID = MG.MSG_GROUP_ID
+				) AS result
+				, MSG_NOTICETALK_SENDER_KEY
+				, MSG_NOTICETALK_TMP_KEY
+				, MD.BIZ_UMID
+				, MD.BIZ_KAKAO_RESEND_YN
+				, MG.AT_DELAY_COMPLETE_YN
+				, MG.AT_DELAY_YN
+			FROM
+				MJ_MSG_DATA MD
+				, MJ_MSG_GROUP_DATA MG
+			WHERE 1=1
+				AND MD.MSG_GROUP_ID = MG.MSG_GROUP_ID
 				AND IFNULL(MG.DEL_FLAG, 'N') = 'N'
 				AND MD.DEL_FLAG = 'N'
 				<!-- JSPark 2023.03.24 알림톡 전송완료 목록은 (즉시 + 예약 발송완료) 노출 -->
-				<![CDATA[ AND MG.REQ_DATE <= NOW() ]]>
+				<![CDATA[
+				AND MG.REQ_DATE <= DATE_ADD(NOW(), INTERVAL 60 MINUTE) 
+				]]>
 				<isNotEmpty property="userId">
 				AND MG.USER_ID = #userId#
 				</isNotEmpty>
@@ -1058,6 +1069,9 @@
 			M2.msgNoticetalkTmpKey ,
 			M2.yellowId ,
 			M2.userNm ,
+			M2.atSmishingYn,
+			M2.atDelayCompleteYn,
+			M2.atDelayYn,
 			( SELECT COUNT(0) 
 				FROM    MJ_MSG_DATA C
 				WHERE   C.DEL_FLAG     = 'N'
@@ -1158,12 +1172,15 @@
 				orderByCode                           AS orderByCode ,
 				RESULT                                AS msgResult ,
 				MSG_NOTICETALK_SENDER_KEY            AS msgNoticetalkSenderKey ,
-		        MSG_NOTICETALK_TMP_KEY               AS msgNoticetalkTmpKey ,
-		        MKPI.YELLOW_ID                       AS yellowId ,
-		        LTM.MBER_NM                          AS userNm ,
+				MSG_NOTICETALK_TMP_KEY               AS msgNoticetalkTmpKey ,
+				MKPI.YELLOW_ID                       AS yellowId ,
+				LTM.MBER_NM                          AS userNm ,
+				LTM.AT_SMISHING_YN					AS atSmishingYn,
 				BIZ_UMID                              AS bizUmid,
 				BL.CALL_STATUS                        AS callStatus,
-				M.BIZ_KAKAO_RESEND_YN                 AS bizKakaoResendYn
+				M.BIZ_KAKAO_RESEND_YN                 AS bizKakaoResendYn,
+				M.AT_DELAY_COMPLETE_YN					AS atDelayCompleteYn,
+				M.AT_DELAY_YN							AS atDelayYn
 			FROM ( 
 					SELECT MG.USER_ID ,
 					MG.MSG_GROUP_ID ,
@@ -1207,16 +1224,19 @@
 							THEN 'W'
 							ELSE 'F'
 						END 
-					) AS result ,
-					MSG_NOTICETALK_SENDER_KEY ,
-					MSG_NOTICETALK_TMP_KEY,
-					MD.BIZ_UMID,
-					MD.BIZ_KAKAO_RESEND_YN
+					) AS result
+					, MSG_NOTICETALK_SENDER_KEY
+					, MSG_NOTICETALK_TMP_KEY
+					, MD.BIZ_UMID
+					, MD.BIZ_KAKAO_RESEND_YN
+					, MG.AT_DELAY_COMPLETE_YN
+					, MG.AT_DELAY_YN
 				FROM    MJ_MSG_DATA MD ,
 						MJ_MSG_GROUP_DATA MG
 				WHERE	MD.MSG_GROUP_ID = MG.MSG_GROUP_ID
 					AND IFNULL(MG.DEL_FLAG, 'N') = 'N'
 					AND MD.DEL_FLAG = 'N'
+					
 				<isNotEmpty property="userId">
 					AND MG.USER_ID = #userId#
 				</isNotEmpty>
@@ -1386,7 +1406,7 @@
 				, B.SMS_TXT
 				, B.SUBJECT
 				, B.REGDATE
-				, B.REQ_DATE
+				, A.REQ_DATE
 				, A.RSLT_DATE
 				, B.CALL_FROM
 				, B.TOT_PRICE
@@ -2252,10 +2272,101 @@
 
 	</select>	
 	
-	
-	
-	
-	
-	
-	
+	<select id="mjonKakaoATDAO.selectKakaoATDelaySentList" parameterClass="String" resultClass="KakaoVO">
+		SELECT
+			A.msgId						AS msgId
+			, A.msgGroupId				AS msgGroupId
+			, A.userId					AS userId
+			, MGD.TOT_PRICE				AS totPrice
+			, MGD.EACH_PRICE			AS eachPrice
+			, MGD.MSG_GROUP_CNT			AS msgGroupCnt
+			, MGD.MSG_TYPE				AS msgType
+			, CASE
+				WHEN MGD.MSG_TYPE = '8'
+				THEN '알림톡'
+				WHEN MGD.MSG_TYPE = '9'
+				THEN '친구톡'
+			END msgTypeName
+			, (SELECT COUNT(0) FROM MJ_MSG_DATA A
+				WHERE 1=1
+				AND A.DEL_FLAG = 'N'
+				AND A.MSG_GROUP_ID = A.msgGroupId
+				AND (CASE
+						WHEN A.AGENT_CODE   = '04' AND A.RSLT_CODE = '7000'
+						THEN 'S'
+						WHEN (A.RSLT_CODE  IS NULL
+							AND A.RSLT_CODE2 IS NULL
+							AND A.SENT_DATE  IS NULL
+							AND A.RSLT_DATE  IS NULL
+							)
+						THEN 'W'
+						ELSE 'F'
+					END ) = 'S'
+				)				AS successCnt
+			, MGD.SMS_TXT		AS smsTxt
+			, A.userdata
+			, A.curState
+			, MKPI.YELLOW_ID	AS yellowId 
+			, DATE_FORMAT(A.sentDate, '%Y-%m-%d %T')	AS sentDate
+			, DATE_FORMAT(A.reqDate, '%Y-%m-%d %T')		AS reqdate
+			, DATE_FORMAT(MGD.REGDATE, '%Y-%m-%d %T')	AS regdate
+			, A.result									AS resultType
+			, MGD.AT_DELAY_YN							AS atDelayYn
+			, MGD.AT_DELAY_COMPLETE_YN					AS atDelayCompleteYn
+		FROM
+			(SELECT
+				a.MSG_ID			AS msgId
+				, a.MSG_GROUP_ID	AS msgGroupId
+				, a.USER_ID			AS userId
+				, a.USERDATA		AS userdata
+				, a.CUR_STATE		AS curState
+				, a.SENT_DATE		AS sentDate
+				, a.REQ_DATE		AS reqDate
+				, (CASE
+					WHEN A.AGENT_CODE = '04' AND (A.RSLT_CODE = '7000')
+					THEN 'S'
+					WHEN( A.RSLT_CODE  IS NULL
+						AND A.RSLT_CODE2 IS NULL
+						AND A.SENT_DATE  IS NULL
+						AND A.RSLT_DATE  IS NULL
+					)THEN 'W'
+					ELSE 'F'
+				END) AS result
+				, A.RSLT_CODE			AS rsltCode 
+				, A.RSLT_CODE2			AS rsltCode2
+				, A.RSLT_NET			AS rsltNet
+				, A.CALL_FROM			AS callFrom
+				, A.CALL_TO				AS callTo
+				, A.SMS_TXT				AS smsTxt
+				, A.MSG_TYPE			AS msgType
+				, A.AGENT_CODE			AS agentCode
+				, A.DEL_FLAG			AS delFlag
+				, A.NEO_TYPE			AS neoType
+				, A.RESERVE_C_YN		AS reserveCYn
+				, A.REFUND_YN			AS refundYn
+				, A.MSG_NOTICETALK_SENDER_KEY
+				, A.MSG_NOTICETALK_TMP_KEY
+			FROM
+				MJ_MSG_DATA A
+			WHERE 1=1
+				AND A.USER_ID = #userId#
+				AND A.MSG_TYPE IN (8)
+			GROUP BY A.MSG_GROUP_ID
+			)A
+			LEFT JOIN MJ_MSG_GROUP_DATA MGD
+				ON A.msgGroupId = MGD.MSG_GROUP_ID
+			LEFT JOIN MJ_KAKAO_PROFILE_INFO MKPI
+				ON A.MSG_NOTICETALK_SENDER_KEY = MKPI.SENDER_KEY
+			AND MKPI.USER_ID = A.userId
+		WHERE 1=1
+			AND MGD.USER_ID = #userId#
+			AND MGD.AT_DELAY_YN = 'Y'
+			AND MGD.AT_DELAY_COMPLETE_YN = 'N'
+			AND MGD.CANCELDATE IS NULL
+			AND A.curState = '0'
+			AND A.refundYn = 'N'
+		ORDER BY 
+			reqDate DESC 
+			,sentDate DESC
+	</select>
 </sqlMap>
(No newline at end of file)
src/main/resources/egovframework/sqlmap/let/mjo/kakao/KakaoSent_SQL_Mysql.xml
--- src/main/resources/egovframework/sqlmap/let/mjo/kakao/KakaoSent_SQL_Mysql.xml
+++ src/main/resources/egovframework/sqlmap/let/mjo/kakao/KakaoSent_SQL_Mysql.xml
@@ -375,7 +375,9 @@
 					AND MG.DEL_FLAG ='N'
 					/* JSPark 2023.03.23 => 예약건중 발송완료건도 발송결과에 노출되도록 수정 */
 					/* AND MG.RESERVE_YN = 'N' */
-					<![CDATA[ AND MG.REQ_DATE <= NOW() ]]>
+					<![CDATA[
+					AND MG.REQ_DATE <= DATE_ADD(NOW(), INTERVAL 60 MINUTE)
+					]]>
 					
 				<isNotEmpty property="reserveCYn">
 					AND MG.RESERVE_C_YN = #reserveCYn#
src/main/resources/egovframework/sqlmap/let/msg/MjonMsgData_SQL_mysql.xml
--- src/main/resources/egovframework/sqlmap/let/msg/MjonMsgData_SQL_mysql.xml
+++ src/main/resources/egovframework/sqlmap/let/msg/MjonMsgData_SQL_mysql.xml
@@ -2055,23 +2055,24 @@
 	<select id="mjonMsgDAO.selectMberManageInfo" parameterClass="String" resultClass="mberManageVO">
 	
 		SELECT
-			MBER_ID				AS mberId
-			, MBER_NM			AS mberNm
-			, SHORT_PRICE		AS shortPrice
-			, LONG_PRICE		AS longPrice
-			, PICTURE_PRICE		AS picturePrice
-			, PICTURE2_PRICE	AS picture2Price
-			, PICTURE3_PRICE	AS picture3Price
-			, KAKAO_AT_PRICE	AS kakaoAtPrice
-			, FAX_PRICE			AS faxPrice
-			, USER_MONEY		AS userMoney
-			, USER_POINT		AS userPoint
-			, DEPT				AS dept
-			, MBTLNUM			AS moblphonNo
-			, MANAGER_NM		AS managerNm
-			, EXCEPT_SPAM_YN	AS exceptSpamYn
-			, HOTLINE_AGENT_CODE AS hotlineAgentCode
-			, BLINE_CODE		AS blineCode
+			MBER_ID					AS mberId
+			, MBER_NM				AS mberNm
+			, SHORT_PRICE			AS shortPrice
+			, LONG_PRICE			AS longPrice
+			, PICTURE_PRICE			AS picturePrice
+			, PICTURE2_PRICE		AS picture2Price
+			, PICTURE3_PRICE		AS picture3Price
+			, KAKAO_AT_PRICE		AS kakaoAtPrice
+			, FAX_PRICE				AS faxPrice
+			, USER_MONEY			AS userMoney
+			, USER_POINT			AS userPoint
+			, DEPT					AS dept
+			, MBTLNUM				AS moblphonNo
+			, MANAGER_NM			AS managerNm
+			, EXCEPT_SPAM_YN		AS exceptSpamYn
+			, HOTLINE_AGENT_CODE	AS hotlineAgentCode
+			, BLINE_CODE			AS blineCode
+			, AT_SMISHING_YN		AS atSmishingYn
 		FROM   LETTNGNRLMBER
 		WHERE  MBER_ID = #userId#
 	
@@ -2208,8 +2209,9 @@
            FILE_CNT,
            TOT_PRICE,
            EVENT_YN,
-           DELAY_YN
-           , BIZ_KAKAO_RESEND_ORGNL_TXT
+           DELAY_YN,
+           AT_DELAY_YN,
+            BIZ_KAKAO_RESEND_ORGNL_TXT
        )
        VALUES
        
@@ -2233,8 +2235,9 @@
            #fileCnt#,
            #totPrice#,
            #eventYn#,
-           #delayYn#
-           , #kakaoSubMagOrgnlTxt#
+           #delayYn#,
+           #atDelayYn#,
+           #kakaoSubMagOrgnlTxt#
        )
 	</insert>
 	
@@ -5773,15 +5776,18 @@
 	
 	<select id="mjonMsgDAO.selectMsgGroupDataByGoupId" parameterClass="mjonResvMsgVO" resultClass="mjonMsgVO">
 		
-		SELECT MSG_GROUP_ID AS msgGroupId,
-		       USER_ID AS userId,
-		       SMS_TXT AS smsTxt,
-		       EACH_PRICE AS eachPrice,
-		       TOT_PRICE AS totPrice,
-		       MSG_GROUP_CNT AS msgGroupCnt
-		FROM   MJ_MSG_GROUP_DATA
-		WHERE  USER_ID      = #userId#
-		AND    MSG_GROUP_ID = #msgGroupId#
+		SELECT
+			MSG_GROUP_ID		AS msgGroupId
+			, USER_ID			AS userId
+			, SMS_TXT			AS smsTxt
+			, EACH_PRICE		AS eachPrice
+			, TOT_PRICE			AS totPrice
+			, MSG_GROUP_CNT		AS msgGroupCnt
+		FROM
+			MJ_MSG_GROUP_DATA
+		WHERE 1=1
+			AND USER_ID      = #userId#
+			AND MSG_GROUP_ID = #msgGroupId#
 		ORDER BY MSG_GROUP_ID DESC
 		LIMIT 1
 	
@@ -5830,10 +5836,12 @@
 	
 	<select id="mjonMsgDAO.selectMsgGroupDataReqDateList" parameterClass="mjonMsgResvVO" resultClass="mjonMsgResvVO">
 		
-		SELECT   DATE_FORMAT(REQ_DATE, '%Y-%m-%d %T' ) AS strReqDate
-		FROM     MJ_MSG_GROUP_DATA
+		SELECT
+			DATE_FORMAT(REQ_DATE, '%Y-%m-%d %T' ) AS strReqDate
+		FROM
+			MJ_MSG_GROUP_DATA
 		WHERE 1=1 
-		AND USER_ID      = #userId#
+			AND USER_ID      = #userId#
 		<iterate prepend="AND MSG_GROUP_ID IN" open="(" close=")" conjunction="," property="msgGroupIdList">
 			#msgGroupIdList[]#
 		</iterate>
@@ -6563,5 +6571,74 @@
 		ORDER BY M.orderByCode	
 	</select>
 	
+	<update id="mjonMsgDAO.updateKakaoAtDelayCancelMsgDataFlag" parameterClass="mjonMsgVO">
+		
+		UPDATE
+			MJ_MSG_DATA
+		SET
+			REFUND_YN = 'Y'
+			, REQ_DATE = NOW()
+			, RESULT_LOG_UPDT_PNTTM = NOW()
+			, CUR_STATE = '3'
+			, RSLT_CODE = '7300'
+		WHERE 1=1
+			AND USER_ID = #userId#
+			AND MSG_GROUP_ID = #msgGroupId#
+	
+	</update>
+	
+	<update id="mjonMsgDAO.updateKakaoAtDelayCancelMsgGroupDataFlag" parameterClass="mjonMsgVO">
+		
+		UPDATE
+			MJ_MSG_GROUP_DATA
+		SET
+			CANCELDATE = NOW()
+			, REQ_DATE = NOW()
+			, AT_DELAY_COMPLETE_YN = 'Y'
+		WHERE 1=1
+			AND USER_ID = #userId#
+			AND MSG_GROUP_ID = #msgGroupId#
+	
+	</update>
+	
+	<update id="mjonMsgDAO.updateKakaoAtDelaySendRealTimeMsgDataFlag" parameterClass="mjonMsgVO">
+		UPDATE
+			MJ_MSG_DATA
+		SET
+			REQ_DATE =
+			<![CDATA[
+			CASE 
+				WHEN TIMESTAMPDIFF(MINUTE, NOW(), REQ_DATE) < 0
+				THEN REQ_DATE
+				WHEN TIMESTAMPDIFF(MINUTE, NOW(), REQ_DATE) >= 30 
+				THEN DATE_ADD(REQ_DATE, INTERVAL -30 MINUTE)
+				ELSE DATE_ADD(REQ_DATE, INTERVAL -(TIMESTAMPDIFF(MINUTE, NOW(), REQ_DATE)) MINUTE)
+			END
+			]]>
+		WHERE 1=1
+			AND USER_ID = #userId#
+			AND MSG_GROUP_ID = #msgGroupId#
+	</update>
+	
+	<update id="mjonMsgDAO.updateKakaoAtDelaySendRealTimeMsgGroupDataFlag" parameterClass="mjonMsgVO">
+		UPDATE
+			MJ_MSG_GROUP_DATA
+		SET
+			REQ_DATE =
+			<![CDATA[
+			CASE
+				WHEN TIMESTAMPDIFF(MINUTE, NOW(), REQ_DATE) < 0
+				THEN REQ_DATE
+				WHEN TIMESTAMPDIFF(MINUTE, NOW(), REQ_DATE) >= 30 
+				THEN DATE_ADD(REQ_DATE, INTERVAL -30 MINUTE)
+				ELSE DATE_ADD(REQ_DATE, INTERVAL -(TIMESTAMPDIFF(MINUTE, NOW(), REQ_DATE)) MINUTE)
+			END
+			]]>
+			, AT_DELAY_COMPLETE_YN = 'Y'
+		WHERE 1=1
+			AND USER_ID = #userId#
+			AND MSG_GROUP_ID = #msgGroupId#
+	</update>
+	
 </sqlMap>
 
src/main/resources/egovframework/sqlmap/let/msg/MjonMsgResv_SQL_mysql.xml
--- src/main/resources/egovframework/sqlmap/let/msg/MjonMsgResv_SQL_mysql.xml
+++ src/main/resources/egovframework/sqlmap/let/msg/MjonMsgResv_SQL_mysql.xml
@@ -445,12 +445,17 @@
 	</select>
 	
 	<select id="MjonReservMsgDAO.selectMsgSeqListByGroupId" parameterClass="mjonMsgResvVO" resultClass="mjonMsgResvVO">
-		
-		SELECT USERDATA AS userData
-		FROM   MJ_MSG_DATA
-		WHERE  USER_ID      = #userId#
-		AND    MSG_GROUP_ID = #msgGroupId#
-	
+		SELECT
+			A.USERDATA		AS userData
+			, DATE_FORMAT(A.REQ_DATE, '%Y-%m-%d %T' ) AS reqdate
+			, B.RESERVE_YN	AS reserveYn
+		FROM
+			MJ_MSG_DATA A
+			, MJ_MSG_GROUP_DATA B
+		WHERE A.MSG_GROUP_ID	= B.MSG_GROUP_ID
+			AND A.USER_ID		= #userId#
+			AND A.MSG_GROUP_ID	= #msgGroupId#
+		ORDER BY A.REQ_DATE ASC
 	</select>
 	
 	<select id="MjonReservMsgDAO.selectMjonMsgGroupData" parameterClass="mjonMsgResvVO" resultClass="mjonMsgVO">
@@ -681,7 +686,6 @@
 	
 	</update>
 	
-	
 	<update id="MjonReservMsgDAO.updateRealTimeIVTMsgSeqListByMsgSeq" parameterClass="mjonMsgResvVO">
 		
 		UPDATE SMSQ_SEND
@@ -717,6 +721,27 @@
 	
 	</update>
 	
+	<update id="MjonReservMsgDAO.updateReserveTimeBizMsgSeqListByMsgSeq" parameterClass="mjonMsgResvVO">
+		UPDATE
+			BIZ_MSG
+		SET
+			REQUEST_TIME = 
+			<![CDATA[
+			CASE 
+				WHEN TIMESTAMPDIFF(MINUTE, NOW(), REQUEST_TIME) < 0
+				THEN REQUEST_TIME
+				WHEN TIMESTAMPDIFF(MINUTE, NOW(), REQUEST_TIME) >= 30 
+				THEN DATE_ADD(REQUEST_TIME, INTERVAL -30 MINUTE)
+				ELSE DATE_ADD(REQUEST_TIME, INTERVAL -(TIMESTAMPDIFF(MINUTE, NOW(), REQUEST_TIME)) MINUTE)
+			END
+			]]>
+		WHERE 1=1 
+		<iterate prepend="AND USER_KEY IN" open="(" close=")" conjunction="," property="userDataList">
+			#userDataList[]#
+		</iterate>
+	
+	</update>
+	
 </sqlMap>  
 
 
src/main/resources/egovframework/sqlmap/let/uss/umt/EgovUserManage_SQL_Mysql.xml
--- src/main/resources/egovframework/sqlmap/let/uss/umt/EgovUserManage_SQL_Mysql.xml
+++ src/main/resources/egovframework/sqlmap/let/uss/umt/EgovUserManage_SQL_Mysql.xml
@@ -1290,15 +1290,17 @@
     </select>
 	
     <select id="userManageDAO.selectAdminSmsNoticeYn" parameterClass="userVO" resultClass="userVO">
-	  	SELECT 
-    		ADMIN_SMS_NOTICE_YN AS adminSmsNoticeYn,
-    		PRE_PAYMENT_YN	AS prePaymentYn,
-    		SMISHING_YN AS smishingYn,
-			AUTO_CASH AS autoCash,
-			IFNULL(BLINE_CODE, 'N') AS blineCode,
-			IFNULL(RECOMMEND_ID, '') AS recommendId
-		FROM   LETTNGNRLMBER
-		WHERE  MBER_ID = #mberId#
+		SELECT 
+			ADMIN_SMS_NOTICE_YN 		AS adminSmsNoticeYn
+			,PRE_PAYMENT_YN				AS prePaymentYn
+			,SMISHING_YN				AS smishingYn
+			,AUTO_CASH					AS autoCash
+			,IFNULL(BLINE_CODE, 'N')	AS blineCode
+			,IFNULL(RECOMMEND_ID, '')	AS recommendId
+		FROM
+			LETTNGNRLMBER
+		WHERE
+			MBER_ID = #mberId#
     </select> 
 
 	<update id="userManageDAO.updateUserAdminSmsNoticeYn" parameterClass="userVO">
src/main/webapp/WEB-INF/jsp/cmm/uss/umt/EgovGnrlUserSelectUpdt.jsp
--- src/main/webapp/WEB-INF/jsp/cmm/uss/umt/EgovGnrlUserSelectUpdt.jsp
+++ src/main/webapp/WEB-INF/jsp/cmm/uss/umt/EgovGnrlUserSelectUpdt.jsp
@@ -1183,44 +1183,6 @@
 	
 }
 
-//알림톡 스미싱의심 여부
-function fnMberAtSmishingYn(){
-	var form = document.mberManageVO;
-	var atSmishingYn = form.atSmishingYn.value;
-	
-	if(confirm("알림톡 스미싱의심 여부를 변경하시겠습니까?")){
-		
-		$.ajax({
-	        type: "POST",
-	        url: "/uss/umt/user/EgovGnrlUpdateUserAtSmishingAjax.do",
-	        data: {"atSmishingYn" : atSmishingYn, "mberId" : "${mberManageVO.mberId}"},
-	        dataType:'json',
-	        async: false,
-	        success: function (data, status) {
-				if (data.isSuccess) {
-					alert("변경 완료했습니다.");
-				}
-				else {
-					alert(data.msg);
-				}
-			},
-	        beforeSend: function () {
-	        	//로딩창 show
-	        	$('.loading_layer').addClass('active');
-	        }, 
-	        complete: function () {
-	        	//로딩창 hide
-	        	$('.loading_layer').removeClass('active');
-	        },
-	        error: function (e) { 
-	        	alert("에러가 발생했습니다."); console.log("ERROR : ", e); 
-	        }
-	    });
-		
-	}
-	
-}
-
 // VIP 여부
 function fnMberVIPYn(){
 	var form = document.mberManageVO;
@@ -2422,6 +2384,331 @@
 	
 }
 
+//알림톡 지연 기능추가 -------------------------------------------------------
+
+//알림톡 스미싱의심 여부
+function fnMberAtSmishingYn(){
+	var form = document.mberManageVO;
+	var atSmishingYn = form.atSmishingYn.value;
+	
+	if(confirm("알림톡 스미싱의심 여부를 변경하시겠습니까?")){
+		
+		$.ajax({
+	        type: "POST",
+	        url: "/uss/umt/user/EgovGnrlUpdateUserAtSmishingAjax.do",
+	        data: {"atSmishingYn" : atSmishingYn, "mberId" : "${mberManageVO.mberId}"},
+	        dataType:'json',
+	        async: false,
+	        success: function (data, status) {
+				if (data.isSuccess) {
+					alert("변경 완료했습니다.");
+				}
+				else {
+					alert(data.msg);
+				}
+			},
+	        beforeSend: function () {
+	        	//로딩창 show
+	        	$('.loading_layer').addClass('active');
+	        }, 
+	        complete: function () {
+	        	//로딩창 hide
+	        	$('.loading_layer').removeClass('active');
+	        },
+	        error: function (e) { 
+	        	alert("에러가 발생했습니다."); console.log("ERROR : ", e); 
+	        }
+	    });
+		
+	}
+}
+
+//지연 알림톡 전체선택
+function kakaoATDelayCheckAll(){
+	var checkField = document.kakaoATDelayForm.kakaoATCheckDelayField;
+	
+	if(document.kakaoATDelayForm.kakaoATCheckAll.checked) {
+		if(checkField) {
+			if(checkField.length > 1) {
+				for(var i=0; i < checkField.length; i++) {
+					checkField[i].checked = true;
+				}
+			} else {
+				checkField.checked = true;
+			}
+		}
+	} else {
+		if(checkField) {
+			if(checkField.length > 1) {
+				for(var j=0; j < checkField.length; j++) {
+					checkField[j].checked = false;
+				}
+			} else {
+				checkField.checked = false;
+			}
+		}
+	}
+}
+
+//지연 알림톡 즉시 발송 리스트
+function kakaoATDelaySendArray(){
+	
+	var userId = document.modiForm.mberId.value; //사용자 회원 아이디
+	var form = document.kakaoATDelayForm;
+	
+	if($("input:checkbox[name='kakaoATCheckDelayField']").is(":checked")==false){
+		alert("선택된 알림톡이 없습니다.");
+		return;
+	}
+	var checkField = form.kakaoATCheckDelayField;
+	var id = form.kakaoATCheckDelayId;
+	var checkedIds = "";
+	var checkedCount = 0;
+	if(checkField) {
+		if(checkField.length > 1) {
+			for(var i=0; i < checkField.length; i++) {
+				if(checkField[i].checked) {
+					checkedIds += ((checkedCount==0? "" : ",") + id[i].value);
+					checkedCount++;
+				}
+			}
+		} else {
+			if(checkField.checked) {
+				checkedIds = id.value;
+			}
+		}
+	}
+	
+	var msgGroupId = checkedIds;
+	
+	var msg = "";
+	var url = "/uss/ion/msg/updateKakaoATDelaySendRealTimeDataAjax.do";
+	var json = {"msgGroupId" : msgGroupId, "userId" : userId}; 
+	
+	if(confirm("해당 지연 알림톡을 즉시 발송 하시겠습니까?")){
+		$.ajax({
+			type: "POST"
+			, url: url
+			, data: json
+			, dataType:'json'
+			, async: false
+			, success: function (data, status) {
+				var result = data.isStatus;
+				var msg = data.msg;
+				if (result == 'loginFail') {
+					alert(msg);
+					location.reload();
+				}else if(result == 'dateFail'){
+					alert(msg);
+					location.reload();
+				}else if(result == 'fail'){
+					alert(msg);
+					return false;
+				}else{
+					alert(msg);
+					location.reload();
+				}
+			}
+			, beforeSend: function () {
+				//로딩창 show
+				$('.loading_layer').addClass('active');
+			}
+			, complete: function () {
+				//로딩창 hide
+				$('.loading_layer').removeClass('active');
+			}
+			, error: function (e) { 
+				alert("에러가 발생했습니다."); console.log("ERROR : ", e); 
+			}
+		});
+	}
+}
+
+//지연 알림톡 즉시 발송 
+function kakaoATDelaySend(msgGroupId){
+	
+	var userId = document.modiForm.mberId.value; //사용자 회원 아이디
+	
+	var msg = "";
+	var url = "/uss/ion/msg/updateKakaoATDelaySendRealTimeDataAjax.do";
+	var json = {"msgGroupId" : msgGroupId, "userId" : userId}; 
+	
+	if(confirm("해당 지연 알림톡을 즉시 발송 하시겠습니까?")){
+		$.ajax({
+			type: "POST"
+			, url: url
+			, data: json
+			, dataType:'json'
+			, async: false
+			, success: function (data, status) {
+				var result = data.isStatus;
+				var msg = data.msg;
+				if (result == 'loginFail') {
+					alert(msg);
+					location.reload();
+				}else if(result == 'dateFail'){
+					alert(msg);
+					location.reload();
+				}else if(result == 'fail'){
+					alert(msg);
+					return false;
+				}else{
+					alert(msg);
+					location.reload();
+				}
+			}
+			, beforeSend: function () {
+				//로딩창 show
+				$('.loading_layer').addClass('active');
+			}
+			, complete: function () {
+				//로딩창 hide
+				$('.loading_layer').removeClass('active');
+			}
+			, error: function (e) { 
+				alert("에러가 발생했습니다."); console.log("ERROR : ", e); 
+			}
+		});
+	}
+}
+
+//지연 알림톡 발송취소 리스트
+function kakaoATDelayCancelArray(){
+	
+	var userId = document.modiForm.mberId.value; //사용자 회원 아이디
+	var form = document.kakaoATDelayForm;
+	
+	if($("input:checkbox[name='kakaoATCheckDelayField']").is(":checked")==false){
+		alert("선택된 알림톡이 없습니다.");
+		return;
+	}
+	var checkField = form.kakaoATCheckDelayField;
+	var id = form.kakaoATCheckDelayId;
+	var checkedIds = "";
+	var checkedCount = 0;
+	if(checkField) {
+		if(checkField.length > 1) {
+			for(var i=0; i < checkField.length; i++) {
+				if(checkField[i].checked) {
+					checkedIds += ((checkedCount==0? "" : ",") + id[i].value);
+					checkedCount++;
+				}
+			}
+		} else {
+			if(checkField.checked) {
+				checkedIds = id.value;
+			}
+		}
+	}
+	
+	var msgGroupId = checkedIds;
+	
+	var msg = "";
+	var url = "/uss/ion/msg/deleteKakaoATDelaySendCancelDataAjax.do";
+	var json = {"msgGroupId" : msgGroupId, "userId" : userId}; 
+	
+	if(confirm("해당 지연 알림톡을 발송취소 하시겠습니까?")){
+		$.ajax({
+			type: "POST"
+			, url: url
+			, data: json
+			, dataType:'json'
+			, async: false
+			, success: function (data, status) {
+				var result = data.isStatus;
+				var msg = data.msg;
+				
+				if (result == 'loginFail') {
+					alert(msg);
+					location.reload();
+				}else if(result == 'dateFail'){
+					
+					alert(msg);
+					location.reload();
+					
+				}else if(result == 'fail'){
+					alert(msg);
+					return false;
+				}else{
+					
+					alert(msg);
+					
+					//회원 이용정지 처리하기
+					//fn_updateMberSttus(msgGroupId);
+					fn_MsgDelayCancel_after();
+					
+				}
+			}
+			, beforeSend: function () {
+				//로딩창 show
+				$('.loading_layer').addClass('active');
+			}
+			, complete: function () {
+				//로딩창 hide
+				$('.loading_layer').removeClass('active');
+			}
+			, error: function (e) { 
+				alert("에러가 발생했습니다."); console.log("ERROR : ", e); 
+			}
+		});
+	}
+}
+
+//지연 알림톡 발송취소
+function kakaoATDelayCancel(msgGroupId){
+	
+	var userId = document.modiForm.mberId.value; //사용자 회원 아이디
+	
+	var msg = "";
+	var url = "/uss/ion/msg/deleteKakaoATDelaySendCancelDataAjax.do";
+	var json = {"msgGroupId" : msgGroupId, "userId" : userId}; 
+	
+	if(confirm("해당 지연 알림톡을 발송취소 하시겠습니까?")){
+		$.ajax({
+			type: "POST"
+			, url: url
+			, data: json
+			, dataType:'json'
+			, async: false
+			, success: function (data, status) {
+				var result = data.isStatus;
+				var msg = data.msg;
+				
+				if (result == 'loginFail') {
+					alert(msg);
+					location.reload();
+				}else if(result == 'dateFail'){
+					
+					alert(msg);
+					location.reload();
+					
+				}else if(result == 'fail'){
+					alert(msg);
+					return false;
+				}else{
+					
+					alert(msg);
+					
+					//회원 이용정지 처리하기
+					//fn_updateMberSttus(msgGroupId);
+					fn_MsgDelayCancel_after();
+					
+				}
+			}
+			, beforeSend: function () {
+				//로딩창 show
+				$('.loading_layer').addClass('active');
+			}
+			, complete: function () {
+				//로딩창 hide
+				$('.loading_layer').removeClass('active');
+			}
+			, error: function (e) { 
+				alert("에러가 발생했습니다."); console.log("ERROR : ", e); 
+			}
+		});
+	}
+}
 </script>
 <style>
 	.fileView {border-bottom: inherit !important;}
@@ -2574,7 +2861,6 @@
 												</select>
 											</td>											
 										</tr>
-										<%-- 
 										<tr>
 											<th>스미싱 의심(카톡)</th>
 											<td>
@@ -2585,9 +2871,8 @@
 											</td>
 											<th></th>
 											<td>
-											</td>											
+											</td>
 										</tr>
-										--%>																				
 										<tr>
 											<th>전용 전송사</th>
 											<td>
@@ -3022,7 +3307,6 @@
 												</select>
 											</td>											
 										</tr>
-										<%-- 
 										<tr>
 											<th>스미싱 의심(카톡)</th>
 											<td>
@@ -3035,7 +3319,6 @@
 											<td>
 											</td>											
 										</tr>
-										--%>										
 										<tr>
 											<th>전용 전송사</th>
 											<td>
@@ -3406,7 +3689,7 @@
 																	<c:otherwise>
 																		그림문자
 																	</c:otherwise>
-																</c:choose>	
+																</c:choose>
 																<div class="sms_detail_hover">
 																	<c:if test="${not empty fn:split(mjonMsgSentList.atchFiles, '^')[0]}">
 																		<img class="MyMsgImg1" src="/cmm/fms/getImage2.do?atchFileId=${fn:split(mjonMsgSentList.atchFiles, '^')[0]}&fileSn=0" style="width: 110px;">
@@ -3602,7 +3885,7 @@
 																	<c:otherwise>
 																		그림문자
 																	</c:otherwise>
-																</c:choose>	
+																</c:choose>
 																<div class="sms_detail_hover">
 																	<c:if test="${not empty fn:split(mjonMsgSentList.atchFiles, '^')[0]}">
 																		<img class="MyMsgImg1" src="/cmm/fms/getImage2.do?atchFileId=${fn:split(mjonMsgSentList.atchFiles, '^')[0]}&fileSn=0" style="width: 110px;">
@@ -3800,14 +4083,7 @@
 													
 													<c:choose>
 														<c:when test="${empty mjonMsgDelaySentList.smsTxt}">
-															<c:choose>
-																<c:when test="${mjonMsgDelaySentList.msgType eq '4'}">
-																	내용없음
-																</c:when>
-																<c:otherwise>
-																	그림문자
-																</c:otherwise>
-															</c:choose>	
+															그림문자
 															<div class="sms_detail_hover">
 																<c:if test="${not empty fn:split(mjonMsgDelaySentList.atchFiles, '^')[0]}">
 																	<img class="MyMsgImg1" src="/cmm/fms/getImage2.do?atchFileId=${fn:split(mjonMsgDelaySentList.atchFiles, '^')[0]}&fileSn=0" style="width: 120px;">
@@ -4126,23 +4402,23 @@
 																		<c:otherwise>
 																			-
 																		</c:otherwise>
-																	</c:choose>											
+																	</c:choose>
 																</c:otherwise>
-															</c:choose>													
+															</c:choose>
 														</td>
 														</td>
 														<td><c:out value="${kakaoReserveList.yellowId}"/></td>
 														<td class="sms_detail" style="text-align: left;">
 															<c:choose>
 																<c:when test="${empty kakaoReserveList.smsTxt}">
-																	-												
+																	-
 																</c:when>
 																<c:otherwise>
 																	<div class="ellipsis_line">
 																		<c:out value="${kakaoReserveList.smsTxt}"/>
 																	</div>
 																</c:otherwise>
-															</c:choose>											
+															</c:choose>
 														</td>
 														<td><fmt:formatNumber value="${kakaoReserveList.msgGroupCnt}" type="number" /></td>
 														<td><fmt:formatNumber value="${kakaoReserveList.successCount}" type="number" /></td>
@@ -4164,7 +4440,138 @@
 						</div>
 					</div>
 					
-					<!-- 최근 카카오톡 전송 내역 -->
+					<!-- 최근 알림톡 지연 내역 -->
+					<form id="kakaoATDelayForm" name="kakaoATDelayForm" mehoth="post">
+						<div class="title_box">
+							<p>최근 알림톡 지연 내역</p>
+							<div class="button_box">
+								<button type="button" onclick="kakaoATDelaySendArray(); return false;" class="fillBlue">발송승인</button>
+								<button type="button" onclick="kakaoATDelayCancelArray(); return false;" class="fillRed">발송취소</button>
+							</div>
+						</div>
+						<table class="user_table_col">
+							<colgroup>
+								<col style="width:5%;">
+								<col style="width:9%;">
+								<col style="width:13%;">
+								<col style="width:15%;">
+								<col style="width:auto;">
+								<col style="width:8%;">
+								<col style="width:8%;">
+								<col style="width:8%;">
+								<col style="width:8%;">
+							</colgroup>
+							<thead>
+								<tr>
+									<th>
+										<input type="checkbox" name="kakaoATCheckAll" id="kakaoATCheckAll" onclick="kakaoATDelayCheckAll();" />
+										<label for="kakaoATCheckAll"></label>
+									</th>
+									<th>종류</th>
+									<th>등록일시</th>
+									<th>전송일시</th>
+									<th>채널ID</th>
+									<th>내용</th>
+									<th>건수</th>
+									<th>발송</th>
+									<th>취소</th>
+								</tr>	
+							</thead>
+							<tbody>
+								<c:choose>
+									<c:when test="${not empty kakaoATDelaySentList}">
+										<c:forEach var="kakaoDelayInfo" items="${kakaoATDelaySentList}" varStatus="status">
+											<c:if test="${status.count < 4}">
+												<tr>
+													<td>
+														<input name="kakaoATCheckDelayField" id="<c:out value='${kakaoDelayInfo.msgGroupId}'/>" title="Check <c:out value="${status.count}"/>" type="checkbox"/>
+														<label for="<c:out value="${result.uniqId}"/>"></label>
+														<input name="kakaoATCheckDelayId" type="hidden" class="${result.userId}" value="<c:out value='${kakaoDelayInfo.msgGroupId}'/>"/>
+													</td>
+													<td>
+														<c:choose>
+															<c:when test="${kakaoDelayInfo.msgType == '8'}">
+																알림톡
+															</c:when>
+															<c:when test="${kakaoDelayInfo.msgType == '9'}">
+																친구톡
+															</c:when>
+															<c:otherwise>
+																-
+															</c:otherwise>
+														</c:choose>
+													</td>
+													<td>
+														<c:choose>
+															<c:when test="${not empty kakaoDelayInfo.regDate}">
+																<fmt:parseDate value="${kakaoDelayInfo.regDate}" var="kakaoDelayRegdate" pattern="yyyy-MM-dd HH:mm:ss"/>
+																<fmt:formatDate value="${kakaoDelayRegdate}" pattern="MM-dd HH:mm"/>
+															</c:when>
+															<c:otherwise>
+																-
+															</c:otherwise>
+														</c:choose>
+													</td>
+													<td>
+														<c:choose>
+															<c:when test="${not empty kakaoDelayInfo.sentDate}">
+																<fmt:formatDate value="${kakaoDelayInfo.sentDate}" pattern="yyyy-MM-dd HH:mm"/>
+															</c:when>
+															<c:otherwise>
+																<c:choose>
+																	<c:when test="${kakaoDelayInfo.atDelayYn eq 'Y'}">
+																		[스미싱의심]
+																		<fmt:parseDate value="${kakaoDelayInfo.reqDate}" var="kakaoDelayReqDate" pattern="yyyy-MM-dd HH:mm:ss"/>
+																		<fmt:formatDate value="${kakaoDelayReqDate}" pattern="MM-dd HH:mm"/>
+																	</c:when>
+																	<c:otherwise>
+																		-
+																	</c:otherwise>
+																</c:choose>
+															</c:otherwise>
+														</c:choose>
+													</td>
+													<td>
+														<c:out value="${kakaoDelayInfo.yellowId}"/>
+													</td>
+													<td class="sms_detail" style="text-align: left;">
+														<c:choose>
+															<c:when test="${empty kakaoDelayInfo.smsTxt}">
+																-
+															</c:when>
+															<c:otherwise>
+																<div class="ellipsis_line">
+																	<c:out value="${kakaoDelayInfo.smsTxt}"/>
+																</div>
+															</c:otherwise>
+														</c:choose>
+													</td>
+													<td>
+														<fmt:formatNumber value="${kakaoDelayInfo.msgGroupCnt}" type="number" />
+													</td>
+													<td>
+														<button type="button" class="thinfill" id="kakaoATDelaySend${status.count}" name="msgDelaySend"
+															onclick="kakaoATDelaySend('<c:out value="${kakaoDelayInfo.msgGroupId}"/>'); return false;">승인</button>
+													</td>
+													<td>
+														<button type="button" class="thinfill" id="kakaoATDelayCancel${status.count}" name="msgDelayCancel"
+														onclick="kakaoATDelayCancel('<c:out value="${kakaoDelayInfo.msgGroupId}"/>'); return false;">취소</button>
+													</td>
+												</tr>
+											</c:if>
+										</c:forEach>
+									</c:when>
+									<c:otherwise>
+										<tr>
+											<td colspan="9">카카오톡 발송 내역이 없습니다.</td>
+										</tr>
+									</c:otherwise>
+								</c:choose>
+							</tbody>
+						</table>
+					</form>
+					
+					<!-- 최근 팩스 전송 내역 -->
 					<div class="title_box">
 						<p>최근 팩스 전송 내역</p>
 						<div class="button_box">
@@ -4225,8 +4632,8 @@
 							<col style="width:calc(100%/2);">
 							<col style="width:calc(100%/2);">
 							<col style="width:calc(100%/2);">
-							<col style="width:calc(100%/2);">							
-							<col style="width:calc(100%/2);">							
+							<col style="width:calc(100%/2);">
+							<col style="width:calc(100%/2);">
 						</colgroup>
 						<thead>
 							<tr>
@@ -4273,7 +4680,7 @@
 														<span class="c_999999">발신번호 차단</span>
 													</c:otherwise>
 												</c:choose>
-											</td>											
+											</td>
 										</tr>
 									</c:forEach>
 								</c:when>
@@ -4391,7 +4798,7 @@
 									<c:set var="userPriceL" value="${longPrice}"/>
 									<c:set var="userPriceP" value="${picturePrice}"/>
 									<c:set var="userPriceP2" value="${picture2Price}"/>
-									<c:set var="userPriceP3" value="${picture3Price}"/>								
+									<c:set var="userPriceP3" value="${picture3Price}"/>
 									<tr>
 										<td>고객단가</td>
 										<td>
@@ -4532,7 +4939,7 @@
 														</c:otherwise>
 													</c:choose>
 												</div>
-											</td>											
+											</td>
 											<td>
 												<c:choose>
 													<c:when test="${userLogin.loginYn == 'Y'}">
src/main/webapp/WEB-INF/jsp/uss/ion/kakaoat/ReserveKakaoATDetailList.jsp
--- src/main/webapp/WEB-INF/jsp/uss/ion/kakaoat/ReserveKakaoATDetailList.jsp
+++ src/main/webapp/WEB-INF/jsp/uss/ion/kakaoat/ReserveKakaoATDetailList.jsp
@@ -150,6 +150,7 @@
 	<input type="hidden" name="detailType" value="<c:out value="${searchVO.detailType}" />" />
 	<input type="hidden" name="ntceBgnde" id="ntceBgnde"  value="">
 	<input type="hidden" name="ntceEndde" id="ntceEndde"  value="">
+	<input type="hidden" name="userId" id="userId" value="<c:out value="${searchVO.userId}" />" />
 	
 	<div class="contWrap">
 		<div class="pageTitle">
src/main/webapp/WEB-INF/jsp/uss/ion/kakaoat/ReserveKakaoATList.jsp
--- src/main/webapp/WEB-INF/jsp/uss/ion/kakaoat/ReserveKakaoATList.jsp
+++ src/main/webapp/WEB-INF/jsp/uss/ion/kakaoat/ReserveKakaoATList.jsp
@@ -351,10 +351,10 @@
     if(checkedIds.length > 0) {
     	var msg = "";
 		if(flag == 'on') {
-			document.listForm.smishingYn.value='Y';
+			document.listForm.atSmishingYn.value='Y';
 			msg = "선택하신 사용자의 스미싱의심을 On 하시겠습니까?";
 		} else {
-			document.listForm.smishingYn.value='N';
+			document.listForm.atSmishingYn.value='N';
 			msg = "선택하신 사용자의 스미싱의심을 Off 하시겠습니까?";
 		}
         if(confirm(msg)){
@@ -398,7 +398,7 @@
 	<input type="hidden" name="ntceEndde" id="ntceEndde"  value="">
 	<input type="hidden" name="adminSmsNoticeYn" value=""/>
 	<input name="checkedIdForDel" type="hidden" />
-	<input type="hidden" name="smishingYn" value=""/>
+	<input type="hidden" name="atSmishingYn" value=""/>
 	
 	<div class="contWrap">
 		<div class="pageTitle">
@@ -484,9 +484,8 @@
 						<col style="width: 5%">
 						<col style="width: 13%">
 						<col style="width: 13%">
-						<%-- <col style="width: 10%"> --%>
 						<col style="width: 10%">
-						<%-- <col style="width: 10%"> --%>
+						<col style="width: 10%">
 						<col style="width: 10%">
 						<col style="width: 5%">
 						<col style="width: auto">
@@ -498,15 +497,12 @@
 							<th>번호<input type="button" class="sort sortBtn" id="sort_msgGroupId"></th>
 							<th>아이디<input type="button" class="sort sortBtn" id="sort_userId"></th>
 							<th>채널ID<input type="button" class="sort sortBtn" id="sort_yellowId"></th>
-							<!-- <th>qkf<input type="button" class="sort sortBtn" id="sort_callFrom"></th> -->
 							<th>발송건수<input type="button" class="sort sortBtn" id="sort_msgGroupCnt"></th>
-							<!-- <th>스미싱의심</th> -->
+							<th>스미싱의심</th>
 							<th>요청시간<input type="button" class="sort sortBtn" id="sort_reqDate"></th>
 							<th>예약<input type="button" class="sort sortBtn" id="sort_reserveYn"></th>
 							<th>내용<input type="button" class="sort sortBtn" id="sort_smsTxt"></th>
 							<th>타입<input type="button" class="sort sortBtn" id="sort_msgType"></th>
-							<!-- <th>전송사<input type="button" class="sort sortBtn" id="sort_agentCodeTxt"></th> -->
-							<!-- <th>통신사<input type="button" class="sort sortBtn" id="sort_rsltNet"></th> -->
 						</tr>
 					</thead>
 					<tbody>
@@ -516,7 +512,7 @@
 								<input name="checkField" id="<c:out value="${result.userId}"/>" title="Check <c:out value="${status.count}"/>" type="checkbox"/><label for="<c:out value="${result.userId}"/>"></label>
 								<input name="checkId" type="hidden" class="${result.userId}" value="<c:out value='${result.userId}'/>:<c:out value='${result.userId}'/>"/>								
 							</td>						
-							<td>
+							<td <c:if test="${result.atSmishingYn eq 'Y'}">class="smishing"</c:if>>
 								<c:if test="${searchVO.searchSortOrd eq 'desc' }">
 		                			<c:out value="${ ( paginationInfo.totalRecordCount - ((paginationInfo.currentPageNo -1)*paginationInfo.recordCountPerPage) ) - status.index }"/>
 			                	</c:if>
@@ -524,23 +520,17 @@
 									<c:out value="${(paginationInfo.currentPageNo - 1) * paginationInfo.recordCountPerPage + status.count}"/>                   		
 			                	</c:if>
 							</td>
-							<td>
+							<td <c:if test="${result.atSmishingYn eq 'Y'}">class="smishing"</c:if>>
 								<div class="id_box  <c:if test='${result.vipYn eq "Y" }'>vip</c:if>">
 									<a href="#" onclick="javascript:fnSelectMber('<c:out value="${result.userId}"/>'); return false;">
 										<c:out value="${result.userId}"/>(<c:out value="${result.userNm}"/>)
 									</a>
 								</div>
 							</td>
-							
-							<td onclick="fn_detail_list('<c:out value="${result.msgGroupId}"/>', '<c:out value="${result.userId}"/>'); return false;" style="cursor:pointer;">
-								<c:out value="${result.yellowId}"/>							
-		                    </td>				
-							
-							<%-- <td onclick="fn_detail_list('${result.msgGroupId}'); return false;" <c:if test="${result.smishingYn eq 'Y'}">class="smishing" style="cursor:pointer;"</c:if><c:if test="${result.smishingYn eq 'N'}">style="cursor:pointer;"</c:if>>
-								<c:out value="${result.callFrom}"/>
-							</td> --%>
-								
-							<td  onclick="fn_detail_list('<c:out value="${result.msgGroupId}"/>', '<c:out value="${result.userId}"/>'); return false;" style="cursor:pointer;line-height:30px;text-align:right;">
+							<td onclick="fn_detail_list('<c:out value="${result.msgGroupId}"/>', '<c:out value="${result.userId}"/>'); return false;" style="cursor:pointer;" <c:if test="${result.atSmishingYn eq 'Y'}">class="smishing"</c:if>>
+								<c:out value="${result.yellowId}"/>
+							</td>
+							<td  onclick="fn_detail_list('<c:out value="${result.msgGroupId}"/>', '<c:out value="${result.userId}"/>'); return false;" style="cursor:pointer;line-height:30px;text-align:right;"  <c:if test="${result.atSmishingYn eq 'Y'}">class="smishing"</c:if>>
 								<c:choose>
 									<c:when test="${result.successCount > 0}">
 										<c:out value="${result.msgGroupCnt}"/>(<fmt:formatNumber value="${(result.successCount / result.msgGroupCnt) * 100}" pattern="#,###" />%)
@@ -549,20 +539,50 @@
 										<span style="color: #0000FF;">
 											<c:out value="${result.msgGroupCnt}"/>(<fmt:formatNumber value="${(result.successCount / result.msgGroupCnt) * 100}" pattern="#,###" />%)
 											<c:if test="${result.msgGroupCnt eq result.callRejectionCount && result.callbackYn eq 'N' && result.userCallbackYn eq 'N' }">
-					                			<%-- <input type="button" style="margin-left:3px;margin-right:0;vertical-align:top;" class="btnType1" onclick="fn_sendMsgData('<c:out value="${result.msgGroupId}"/>','<c:out value="${result.callFrom}"/>','<c:out value="${result.userId}"/>');" value="문자" /> --%>	
-						                	</c:if>
+												<%-- <input type="button" style="margin-left:3px;margin-right:0;vertical-align:top;" class="btnType1" onclick="fn_sendMsgData('<c:out value="${result.msgGroupId}"/>','<c:out value="${result.callFrom}"/>','<c:out value="${result.userId}"/>');" value="문자" /> --%>	
+											</c:if>
 											<c:if test="${result.callbackYn eq 'Y' }">
-					                			<span style="color: #0000FF;" title="번호도용 문자차단 안내문자 발송완료">안내완료</span>
-						                	</c:if>						                												
+												<span style="color: #0000FF;" title="번호도용 문자차단 안내문자 발송완료">안내완료</span>
+											</c:if>
 										</span>
 									</c:otherwise>
-								</c:choose>								
+								</c:choose>
 							</td>
-							<td onclick="fn_detail_list('<c:out value="${result.msgGroupId}"/>', '<c:out value="${result.userId}"/>'); return false;" style="cursor:pointer;" title="<c:out value="${result.rsltDate}"/>">
+							<td <c:if test="${result.atSmishingYn eq 'Y'}">class="smishing"</c:if>>
+								<c:choose>
+									<c:when test="${result.atDelayYn eq 'Y'}">
+										<c:choose>
+											<c:when test="${result.atDelayCompleteYn eq 'Y' && not empty result.cancelDate}">
+												<span style="color: #0000FF;">
+													<c:if test="${result.smishingYn eq 'Y'}">온</c:if><c:if test="${result.smishingYn eq 'N'}">오프</c:if>[이용정지]
+													<span style="overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:block;margin-top:3px;" title="<c:out value="${result.cancelDate}"/>">
+														<fmt:parseDate value="${result.cancelDate}" var="cancelDateValue" pattern="yyyy-MM-dd HH:mm"/>
+														<fmt:formatDate value="${cancelDateValue}" pattern="MM-dd HH:mm"/>														
+													</span>
+												</span>
+											</c:when>
+											<c:when test="${result.atDelayCompleteYn eq 'N'}">
+												<c:if test="${result.atSmishingYn eq 'Y'}">온</c:if>
+												<c:if test="${result.atSmishingYn eq 'N'}">오프</c:if>[미처리]
+											</c:when>
+											<c:otherwise>
+												<span style="color: #0000FF;">
+													<c:if test="${result.atSmishingYn eq 'Y'}">온</c:if>
+													<c:if test="${result.atSmishingYn eq 'N'}">오프</c:if>[승인]
+												</span>
+											</c:otherwise>
+										</c:choose>
+									</c:when>
+									<c:otherwise>
+										-
+									</c:otherwise>
+								</c:choose>
+							</td>
+							<td onclick="fn_detail_list('<c:out value="${result.msgGroupId}"/>', '<c:out value="${result.userId}"/>'); return false;" style="cursor:pointer;" title="<c:out value="${result.rsltDate}"/>" <c:if test="${result.atSmishingYn eq 'Y'}">class="smishing"</c:if>>
 								<fmt:parseDate value="${result.reqDate}" var="reqDateValue" pattern="yyyy-MM-dd HH:mm"/>
-								<fmt:formatDate value="${reqDateValue}" pattern="MM-dd HH:mm"/>								
+								<fmt:formatDate value="${reqDateValue}" pattern="MM-dd HH:mm"/>
 							</td>
-							<td onclick="fn_detail_list('${result.msgGroupId}'); return false;" style="cursor:pointer;">
+							<td onclick="fn_detail_list('${result.msgGroupId}'); return false;" style="cursor:pointer;" <c:if test="${result.atSmishingYn eq 'Y'}">class="smishing"</c:if>>
 								<c:choose>
 									<c:when test="${result.reserveYn eq 'Y'}">
 										예약
@@ -572,25 +592,20 @@
 									</c:otherwise>
 								</c:choose>
 							</td>							
-							<td class="sms_detail left" onclick="fn_detail_list('<c:out value="${result.msgGroupId}"/>', '<c:out value="${result.userId}"/>'); return false;" style="cursor:pointer;">
+							<td class="sms_detail left <c:if test="${result.atSmishingYn eq 'Y'}">smishing</c:if>" onclick="fn_detail_list('<c:out value="${result.msgGroupId}"/>', '<c:out value="${result.userId}"/>'); return false;" style="cursor:pointer;">
 								<p><c:out value="${result.smsTxt}"/></p>
 								<div class="sms_detail_hover">
 									<c:out value="${fn:replace(fn:replace(result.smsTxt, newLineChar, '<br/>'), newLineChar2, '<br/>')}" escapeXml="false"/>
 								</div>
 							</td>
-							<td onclick="fn_detail_list('<c:out value="${result.msgGroupId}"/>', '<c:out value="${result.userId}"/>'); return false;" style="cursor:pointer;">
+							<td onclick="fn_detail_list('<c:out value="${result.msgGroupId}"/>', '<c:out value="${result.userId}"/>'); return false;" style="cursor:pointer;" <c:if test="${result.atSmishingYn eq 'Y'}">class="smishing"</c:if>>
 								<c:out value="${result.msgTypeName}"/>
 							</td>
-							<%-- <td><c:out value="${result.conectMthdTxt}"/></td> --%>
-							<%-- <td <c:if test="${result.smishingYn eq 'Y'}">class="smishing"</c:if>>
-								<c:out value="${result.agentCodeTxt}"/>
-							</td> --%>
-							<%-- <td><c:out value="${result.rsltNet}"/></td> --%>
 						</tr>
 						</c:forEach>
 						<c:if test="${empty resultList}">
-		         			<tr><td colspan="8"><spring:message code="common.nodata.msg" /></td></tr>
-		         		</c:if>    
+							<tr><td colspan="10"><spring:message code="common.nodata.msg" /></td></tr>
+						</c:if>
 					</tbody>
 				</table>
 			</div>
src/main/webapp/WEB-INF/jsp/uss/ion/kakaoat/SendKakaoATList.jsp
--- src/main/webapp/WEB-INF/jsp/uss/ion/kakaoat/SendKakaoATList.jsp
+++ src/main/webapp/WEB-INF/jsp/uss/ion/kakaoat/SendKakaoATList.jsp
@@ -456,7 +456,7 @@
 						<col style="width: 13%">
 						<%-- <col style="width: 10%"> --%>
 						<col style="width: 10%">
-						<%-- <col style="width: 10%"> --%>
+						<col style="width: 10%">
 						<col style="width: 10%">
 						<col style="width: 5%">
 						<col style="width: auto">
@@ -468,15 +468,12 @@
 							<th>번호<input type="button" class="sort sortBtn" id="sort_msgGroupId"></th>
 							<th>아이디<input type="button" class="sort sortBtn" id="sort_userId"></th>
 							<th>채널ID<input type="button" class="sort sortBtn" id="sort_yellowId"></th>
-							<!-- <th>qkf<input type="button" class="sort sortBtn" id="sort_callFrom"></th> -->
 							<th>발송건수<input type="button" class="sort sortBtn" id="sort_msgGroupCnt"></th>
-							<!-- <th>스미싱의심</th> -->
+							<th>스미싱의심</th>
 							<th>요청시간<input type="button" class="sort sortBtn" id="sort_reqDate"></th>
 							<th>예약<input type="button" class="sort sortBtn" id="sort_reserveYn"></th>
 							<th>내용<input type="button" class="sort sortBtn" id="sort_smsTxt"></th>
 							<th>타입<input type="button" class="sort sortBtn" id="sort_msgType"></th>
-							<!-- <th>전송사<input type="button" class="sort sortBtn" id="sort_agentCodeTxt"></th> -->
-							<!-- <th>통신사<input type="button" class="sort sortBtn" id="sort_rsltNet"></th> -->
 						</tr>
 					</thead>
 					<tbody>
@@ -486,7 +483,7 @@
 								<input name="checkField" id="<c:out value="${result.userId}"/>" title="Check <c:out value="${status.count}"/>" type="checkbox"/><label for="<c:out value="${result.userId}"/>"></label>
 								<input name="checkId" type="hidden" class="${result.userId}" value="<c:out value='${result.userId}'/>:<c:out value='${result.userId}'/>"/>								
 							</td>						
-							<td>
+							<td  <c:if test="${result.atSmishingYn eq 'Y'}">class="smishing"</c:if>>
 								<c:if test="${searchVO.searchSortOrd eq 'desc' }">
 		                			<c:out value="${ ( paginationInfo.totalRecordCount - ((paginationInfo.currentPageNo -1)*paginationInfo.recordCountPerPage) ) - status.index }"/>
 			                	</c:if>
@@ -494,23 +491,17 @@
 									<c:out value="${(paginationInfo.currentPageNo - 1) * paginationInfo.recordCountPerPage + status.count}"/>                   		
 			                	</c:if>
 							</td>
-							<td>
+							<td <c:if test="${result.atSmishingYn eq 'Y'}">class="smishing"</c:if>>
 								<div class="id_box  <c:if test='${result.vipYn eq "Y" }'>vip</c:if>">
 									<a href="#" onclick="javascript:fnSelectMber('<c:out value="${result.userId}"/>'); return false;">
 										<c:out value="${result.userId}"/>(<c:out value="${result.userNm}"/>)
 									</a>
 								</div>
 							</td>
-							
-							<td onclick="fn_detail_list('<c:out value="${result.msgGroupId}"/>', '<c:out value="${result.userId}"/>'); return false;" style="cursor:pointer;">
+							<td onclick="fn_detail_list('<c:out value="${result.msgGroupId}"/>', '<c:out value="${result.userId}"/>'); return false;" <c:if test="${result.atSmishingYn eq 'Y'}">class="smishing"</c:if>>
 								<c:out value="${result.yellowId}"/>							
-		                    </td>				
-							
-							<%-- <td onclick="fn_detail_list('${result.msgGroupId}'); return false;" <c:if test="${result.atSmishingYn eq 'Y'}">class="atSmishingYn" style="cursor:pointer;"</c:if><c:if test="${result.atSmishingYn eq 'N'}">style="cursor:pointer;"</c:if>>
-								<c:out value="${result.callFrom}"/>
-							</td> --%>
-								
-							<td  onclick="fn_detail_list('<c:out value="${result.msgGroupId}"/>', '<c:out value="${result.userId}"/>'); return false;" style="cursor:pointer;line-height:30px;text-align:right;">
+							</td>
+							<td onclick="fn_detail_list('<c:out value="${result.msgGroupId}"/>', '<c:out value="${result.userId}"/>'); return false;" <c:if test="${result.atSmishingYn eq 'Y'}">class="smishing"</c:if>>
 								<c:choose>
 									<c:when test="${result.successCount > 0}">
 										<c:out value="${result.msgGroupCnt}"/>(<fmt:formatNumber value="${(result.successCount / result.msgGroupCnt) * 100}" pattern="#,###" />%)
@@ -519,20 +510,51 @@
 										<span style="color: #0000FF;">
 											<c:out value="${result.msgGroupCnt}"/>(<fmt:formatNumber value="${(result.successCount / result.msgGroupCnt) * 100}" pattern="#,###" />%)
 											<c:if test="${result.msgGroupCnt eq result.callRejectionCount && result.callbackYn eq 'N' && result.userCallbackYn eq 'N' }">
-					                			<%-- <input type="button" style="margin-left:3px;margin-right:0;vertical-align:top;" class="btnType1" onclick="fn_sendMsgData('<c:out value="${result.msgGroupId}"/>','<c:out value="${result.callFrom}"/>','<c:out value="${result.userId}"/>');" value="문자" /> --%>	
-						                	</c:if>
+	
+											</c:if>
 											<c:if test="${result.callbackYn eq 'Y' }">
-					                			<span style="color: #0000FF;" title="번호도용 문자차단 안내문자 발송완료">안내완료</span>
-						                	</c:if>						                												
+												<span style="color: #0000FF;" title="번호도용 문자차단 안내문자 발송완료">안내완료</span>
+											</c:if>
 										</span>
 									</c:otherwise>
 								</c:choose>								
 							</td>
-							<td onclick="fn_detail_list('<c:out value="${result.msgGroupId}"/>', '<c:out value="${result.userId}"/>'); return false;" style="cursor:pointer;" title="<c:out value="${result.rsltDate}"/>">
+							<td <c:if test="${result.atSmishingYn eq 'Y'}">class="smishing"</c:if>>
+								<c:choose>
+									<c:when test="${result.atDelayYn eq 'Y'}">
+										<c:choose>
+											<c:when test="${result.atDelayCompleteYn eq 'Y' && not empty result.cancelDate}">
+												<span style="color: #0000FF;">
+													<c:if test="${result.atSmishingYn eq 'Y'}">온</c:if>
+													<c:if test="${result.atSmishingYn eq 'N'}">오프</c:if>[이용정지]
+													<span style="overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:block;margin-top:3px;" title="<c:out value="${result.cancelDate}"/>">
+														<fmt:parseDate value="${result.cancelDate}" var="cancelDateValue" pattern="yyyy-MM-dd HH:mm"/>
+														<fmt:formatDate value="${cancelDateValue}" pattern="MM-dd HH:mm"/>
+													</span>
+												</span>
+											</c:when>
+											<c:when test="${result.atDelayCompleteYn eq 'N'}">
+												<c:if test="${result.atSmishingYn eq 'Y'}">온</c:if>
+												<c:if test="${result.atSmishingYn eq 'N'}">오프</c:if>[미처리]
+											</c:when>
+											<c:otherwise>
+												<span style="color: #0000FF;">
+													<c:if test="${result.atSmishingYn eq 'Y'}">온</c:if>
+													<c:if test="${result.atSmishingYn eq 'N'}">오프</c:if>[승인]
+												</span>
+											</c:otherwise>
+										</c:choose>
+									</c:when>
+									<c:otherwise>
+										-
+									</c:otherwise>
+								</c:choose>
+							</td>
+							<td onclick="fn_detail_list('<c:out value="${result.msgGroupId}"/>', '<c:out value="${result.userId}"/>'); return false;" title="<c:out value="${result.rsltDate}"/>" <c:if test="${result.atSmishingYn eq 'Y'}">class="smishing"</c:if>>
 								<fmt:parseDate value="${result.reqDate}" var="reqDateValue" pattern="yyyy-MM-dd HH:mm"/>
 								<fmt:formatDate value="${reqDateValue}" pattern="MM-dd HH:mm"/>								
 							</td>
-							<td onclick="fn_detail_list('${result.msgGroupId}', '<c:out value="${result.userId}"/>'); return false;" style="cursor:pointer;">
+							<td onclick="fn_detail_list('${result.msgGroupId}', '<c:out value="${result.userId}"/>'); return false;" <c:if test="${result.atSmishingYn eq 'Y'}">class="smishing"</c:if>>
 								<c:choose>
 									<c:when test="${result.reserveYn eq 'Y'}">
 										예약
@@ -542,20 +564,15 @@
 									</c:otherwise>
 								</c:choose>
 							</td>							
-							<td class="sms_detail left" onclick="fn_detail_list('<c:out value="${result.msgGroupId}"/>', '<c:out value="${result.userId}"/>'); return false;" style="cursor:pointer;">
+							<td class="sms_detail left <c:if test="${result.atSmishingYn eq 'Y'}">smishing</c:if>" onclick="fn_detail_list('<c:out value="${result.msgGroupId}"/>', '<c:out value="${result.userId}"/>'); return false;" style="cursor:pointer;">
 								<p><c:out value="${result.smsTxt}"/></p>
 								<div class="sms_detail_hover">
 									<c:out value="${fn:replace(fn:replace(result.smsTxt, newLineChar, '<br/>'), newLineChar2, '<br/>')}" escapeXml="false"/>
 								</div>
 							</td>
-							<td onclick="fn_detail_list('<c:out value="${result.msgGroupId}"/>', '<c:out value="${result.userId}"/>'); return false;" style="cursor:pointer;">
+							<td onclick="fn_detail_list('<c:out value="${result.msgGroupId}"/>', '<c:out value="${result.userId}"/>'); return false;" style="cursor:pointer;" <c:if test="${result.atSmishingYn eq 'Y'}">class="smishing"</c:if>>
 								<c:out value="${result.msgTypeName}"/>
 							</td>
-							<%-- <td><c:out value="${result.conectMthdTxt}"/></td> --%>
-							<%-- <td <c:if test="${result.atSmishingYn eq 'Y'}">class="atSmishingYn"</c:if>>
-								<c:out value="${result.agentCodeTxt}"/>
-							</td> --%>
-							<%-- <td><c:out value="${result.rsltNet}"/></td> --%>
 						</tr>
 						</c:forEach>
 						<c:if test="${empty resultList}">
src/main/webapp/WEB-INF/jsp/web/fax/faxDataView.jsp
--- src/main/webapp/WEB-INF/jsp/web/fax/faxDataView.jsp
+++ src/main/webapp/WEB-INF/jsp/web/fax/faxDataView.jsp
@@ -51,6 +51,11 @@
 				return false;
 			}
 			
+			if(!moneyChk()){
+				return false;
+			}
+			
+			
 			if(!valueChk()){
 				return false;
 			}
@@ -152,6 +157,19 @@
 		
 	}
 	
+	function moneyChk(){
+		
+		//회원 보유 잔액 비교
+		var totPriceOnly = stringReplaceAll($('#totalPriceTxt').text() , ",", "");
+		var userMoneyOnly = stringReplaceAll($('#hdUserMoney').text(), ",", "");
+		
+		if(parseFloat(userMoneyOnly) < parseFloat(totPriceOnly)){
+			alert("팩스 발송에 필요한 회원님의 보유 잔액이 부족 합니다.");
+			return false;
+		}
+	}
+	
+	
 	function valueChk(){
 		if($('#title').val() == ''){
 			alert('제목을 입력해 주세요.');
src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/at/KakaoAlimtalkMsgDataView.jsp
--- src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/at/KakaoAlimtalkMsgDataView.jsp
+++ src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/at/KakaoAlimtalkMsgDataView.jsp
@@ -1055,6 +1055,8 @@
 		<input type="hidden" id="callToList" name="callToList" value="">				<!--완  받는사람 리스트-->
 		<input type="hidden" id="varNmList" name="varNmList" value="">					<!--완  변수 이름  리스트-->
 		<input type="hidden" id="varValList" name="varValList" value="">				<!--완  변수 리스트-->
+		
+		<input type="hidden" id="atSmishingYn" name="atSmishingYn" value="${atSmishingYn}">		<!--알림톡 스미싱 여부-->
 	</form>
 
 	<form id="excelForm" name="excelForm" action="<c:url value='/web/mjon/alimtalk/kakaoApiNotityTalkSampleExcelDownload.do'/>">
Add a comment
List