woo 2023-07-11
문자발송 예약 문자 스미싱 및 스팸 발송 딜레이 기능 - 사용자/관리자 기능 추가
 - 사용자/관리자 기능 추가
@ad5685c86d7d693f65bfe74c88436c7ec0f82ebb
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
@@ -426,11 +426,21 @@
 		update("mjonMsgDAO.updateMsgDelaySendRealTimeMsgDataFlag", mjonMsgVO);
 	}
 	
+	// mj_msg_data 테이블 예약 지연 문자 발송 요청시간 수정
+	public void updateMsgDelaySendReserveTimeMsgDataFlag(MjonMsgVO mjonMsgVO) {
+		update("mjonMsgDAO.updateMsgDelaySendReserveTimeMsgDataFlag", mjonMsgVO);
+	}
+	
 	// mj_msg_group_data 테이블 지연 문자  즉시발송 요청시간 수정
 	public void updateMsgDelaySendRealTimeMsgGroupDataFlag(MjonMsgVO mjonMsgVO) {
 		update("mjonMsgDAO.updateMsgDelaySendRealTimeMsgGroupDataFlag", mjonMsgVO);
 	}
 	
+	// mj_msg_group_data 테이블 예약 지연 문자  발송 요청시간 수정
+	public void updateMsgDelaySendReserveTimeMsgGroupDataFlag(MjonMsgVO mjonMsgVO) {
+		update("mjonMsgDAO.updateMsgDelaySendReserveTimeMsgGroupDataFlag", mjonMsgVO);
+	}
+	
 	// mj_msg_data 테이블 지연 알림톡 취소 값 수정
 	public void updateKakaoAtDelayCancelMsgDataFlag(MjonMsgVO mjonMsgVO) {
 		update("mjonMsgDAO.updateKakaoAtDelayCancelMsgDataFlag", mjonMsgVO);
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,7 +2,6 @@
 
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
-import java.util.Calendar;
 import java.util.Date;
 import java.util.List;
 
@@ -18,7 +17,6 @@
 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;
@@ -766,6 +764,10 @@
 			//삭제 문자 건수 MSG_SEQ 번호 받아오기
 			List<MjonResvMsgVO> resultMsgSeqList = mjonReservMsgDAO.selectMsgSeqListByGroupId(mjonResvMsgVO);
 			
+			String reservYn = resultMsgSeqList.get(0).getReserveYn();
+			
+			System.out.println("++++++++++++++++++++++++++++ reservYn ::: "+reservYn);
+			
 			int size = resultMsgSeqList.size();
 			List<String> userDataList = new ArrayList<String>();
 			for(int i=0; i < size; i++) {
@@ -777,8 +779,8 @@
 			
 			mjonResvMsgVO.setUserDataList(userDataList);
 			
-			int ihResult = 0;
-			int imoResult = 0;
+			//int ihResult = 0;
+			//int imoResult = 0;
 			int bizResult = 0;
 			int FHSmsResult = 0;
 			int FHMmsResult = 0;
@@ -787,51 +789,101 @@
 			int JJB01Result = 0;
 			int JJB02Result = 0;
 			
-			
-			//아이하트 딜레이문자 즉시발송 처리
-			//ihResult = mjonReservMsgDAO.deleteIHeartMsgSeqListByMsgSeq(mjonResvMsgVO);
-			ihResult = mjonReservMsgDAO.updateRealTimeIHeartMsgSeqListByMsgSeq(mjonResvMsgVO);
-			
-			//현대퓨처넷 단문 딜레이문자 즉시발송 처리
-			FHSmsResult = mjonReservMsgDAO.updateRealTimeHFNSmsMsgSeqListByMsgSeq(mjonResvMsgVO);
+			//즉시 전송 딜레이건에 대한 즉시 전송 처리 - 아이하트, 아에임오 전송사는 사용 안하기 때문에 주석처리함.
+			if(reservYn.equals("N")) {
+				
+				//아이하트 딜레이문자 즉시발송 처리
+				//ihResult = mjonReservMsgDAO.deleteIHeartMsgSeqListByMsgSeq(mjonResvMsgVO);
+				//ihResult = mjonReservMsgDAO.updateRealTimeIHeartMsgSeqListByMsgSeq(mjonResvMsgVO);
+				
+				//현대퓨처넷 단문 딜레이문자 즉시발송 처리
+				FHSmsResult = mjonReservMsgDAO.updateRealTimeHFNSmsMsgSeqListByMsgSeq(mjonResvMsgVO);
 
-			//현대퓨처넷 장문/그림  딜레이문자 즉시발송 처리
-			FHMmsResult = mjonReservMsgDAO.updateRealTimeHFNMmsMsgSeqListByMsgSeq(mjonResvMsgVO);
+				//현대퓨처넷 장문/그림  딜레이문자 즉시발송 처리
+				FHMmsResult = mjonReservMsgDAO.updateRealTimeHFNMmsMsgSeqListByMsgSeq(mjonResvMsgVO);
+				
+				//아이엠오  딜레이문자 즉시발송 처리
+				//imoResult = mjonReservMsgDAO.updateRealTimeIMOMsgSeqListByMsgSeq(mjonResvMsgVO);
+				
+				//비즈뿌리오  딜레이문자 즉시발송 처리
+				bizResult = mjonReservMsgDAO.updateRealTimeBizMsgSeqListByMsgSeq(mjonResvMsgVO);
+				
+				//제이제이 딜레이문자 즉시발송 처리
+				JJResult = mjonReservMsgDAO.updateRealTimeJJMsgSeqListByMsgSeq(mjonResvMsgVO);
+				
+				//인비토 딜레이문자 즉시발송 처리
+				IVTResult = mjonReservMsgDAO.updateRealTimeIVTMsgSeqListByMsgSeq(mjonResvMsgVO);
+				
+				//제이제이 B01 딜레이문자 즉시발송 처리
+				JJB01Result = mjonReservMsgDAO.updateRealTimeJJB01MsgSeqListByMsgSeq(mjonResvMsgVO);
+				
+				//제이제이 B02 딜레이문자 즉시발송 처리
+				JJB02Result = mjonReservMsgDAO.updateRealTimeJJB02MsgSeqListByMsgSeq(mjonResvMsgVO);
+				
+				//발송 결과 합산
+				resultSts = FHSmsResult + FHMmsResult + bizResult + JJResult + IVTResult + JJB01Result + JJB02Result;
+				
+				System.out.println("++++++++++++++++++++++++++++++ resultSts ::: "+resultSts);
+				
+			}else {//예약문자에 대한 딜레이발송 시간을 원복 처리해준다. - 아이하트, 아이엠오 전송사는 제외해준다.
+				
+				//현대퓨처넷 단문 예약 딜레이문자 발송 처리
+				FHSmsResult = mjonReservMsgDAO.updateReserveTimeHFNSmsMsgSeqListByMsgSeq(mjonResvMsgVO);
+
+				//현대퓨처넷 장문/그림  예약 딜레이문자 발송 처리
+				FHMmsResult = mjonReservMsgDAO.updateReserveTimeHFNMmsMsgSeqListByMsgSeq(mjonResvMsgVO);
+				
+				//비즈뿌리오  예약 딜레이문자 발송 처리
+				bizResult = mjonReservMsgDAO.updateReserveTimeBizMsgSeqListByMsgSeq(mjonResvMsgVO);
+				
+				//제이제이 예약 딜레이문자 발송 처리
+				JJResult = mjonReservMsgDAO.updateReserveTimeJJMsgSeqListByMsgSeq(mjonResvMsgVO);
+				
+				//인비토 예약 딜레이문자 발송 처리
+				IVTResult = mjonReservMsgDAO.updateReserveTimeIVTMsgSeqListByMsgSeq(mjonResvMsgVO);
+				
+				//제이제이 B01 예약 딜레이문자 발송 처리
+				JJB01Result = mjonReservMsgDAO.updateReserveTimeJJB01MsgSeqListByMsgSeq(mjonResvMsgVO);
+				
+				//제이제이 B02 예약 딜레이문자 발송 처리
+				JJB02Result = mjonReservMsgDAO.updateReserveTimeJJB02MsgSeqListByMsgSeq(mjonResvMsgVO);
+				
+				//발송 결과 합산
+				resultSts = FHSmsResult + FHMmsResult + bizResult + JJResult + IVTResult + JJB01Result + JJB02Result;
+				
+				System.out.println("++++++++++++++++++++++++++++++ resultSts ::: "+resultSts);
+				
+				
+			}
 			
-			//아이엠오  딜레이문자 즉시발송 처리
-			imoResult = mjonReservMsgDAO.updateRealTimeIMOMsgSeqListByMsgSeq(mjonResvMsgVO);
-			
-			//비즈뿌리오  딜레이문자 즉시발송 처리
-			bizResult = mjonReservMsgDAO.updateRealTimeBizMsgSeqListByMsgSeq(mjonResvMsgVO);
-			
-			//제이제이 딜레이문자 즉시발송 처리
-			JJResult = mjonReservMsgDAO.updateRealTimeJJMsgSeqListByMsgSeq(mjonResvMsgVO);
-			
-			//제이제이 딜레이문자 즉시발송 처리
-			IVTResult = mjonReservMsgDAO.updateRealTimeIVTMsgSeqListByMsgSeq(mjonResvMsgVO);
-			
-			//제이제이 B01 딜레이문자 즉시발송 처리
-			JJB01Result = mjonReservMsgDAO.updateRealTimeJJB01MsgSeqListByMsgSeq(mjonResvMsgVO);
-			
-			//제이제이 B02 딜레이문자 즉시발송 처리
-			JJB02Result = mjonReservMsgDAO.updateRealTimeJJB02MsgSeqListByMsgSeq(mjonResvMsgVO);
-			
-			//삭제 결과 합산
-			resultSts = ihResult + FHSmsResult + FHMmsResult + imoResult +bizResult + JJResult + IVTResult + JJB01Result + JJB02Result;
-			
-			System.out.println("++++++++++++++++++++++++++++++ resultSts ::: "+resultSts);
 			
 			//예약 취소 환불 처리
 			if(resultSts > 0) {
 				
+				MjonMsgVO mjonMsgVO = new MjonMsgVO();
 				//그룹 데이터 정보 조회하기
-				MjonMsgVO mjonMsgVO = mjonMsgDAO.selectMsgGroupDataByGoupId(mjonResvMsgVO);
+				mjonMsgVO = mjonMsgDAO.selectMsgGroupDataByGoupId(mjonResvMsgVO);
 				
-				//mj_msg_data 테이블 지연 문자 즉시발송 요청 값 수정
-				mjonMsgDAO.updateMsgDelaySendRealTimeMsgDataFlag(mjonMsgVO);
+				if(reservYn.equals("N")) {
+					
+					//mj_msg_data 테이블 지연 문자 즉시발송 요청 값 수정
+					mjonMsgDAO.updateMsgDelaySendRealTimeMsgDataFlag(mjonMsgVO);
+					
+					//mj_msg_group_data 테이블 즉시발송 요청 값 수정
+					mjonMsgDAO.updateMsgDelaySendRealTimeMsgGroupDataFlag(mjonMsgVO);
+					
+				}else {
+					
+					//mj_msg_data 테이블 예약 지연 문자 발송 요청 값 수정
+					mjonMsgDAO.updateMsgDelaySendReserveTimeMsgDataFlag(mjonMsgVO);
+					
+					//mj_msg_group_data 테이블 예약 발송 요청 값 수정
+					mjonMsgDAO.updateMsgDelaySendReserveTimeMsgGroupDataFlag(mjonMsgVO);
+					
+				}
 				
-				//mj_msg_group_data 테이블 즉시발송 요청 값 수정
-				mjonMsgDAO.updateMsgDelaySendRealTimeMsgGroupDataFlag(mjonMsgVO);
+				
+				
 				
 			}
 			
src/main/java/itn/let/mjo/msgdata/service/impl/MjonMsgDataServiceImpl.java
--- src/main/java/itn/let/mjo/msgdata/service/impl/MjonMsgDataServiceImpl.java
+++ src/main/java/itn/let/mjo/msgdata/service/impl/MjonMsgDataServiceImpl.java
@@ -368,6 +368,7 @@
     	//Controller에서 전달 받은 분할 시간 정보 리스트 
     	List<String> dividDayList = mjonMsgVO.getDividDay();
     	
+    	String frstDelayTime = mjonMsgVO.getReqDate();
     	//문자발송 리스트 생성 시작
 		for(int i = 0; i < callToCnt; i++) {
 			
@@ -571,7 +572,7 @@
 					//분할 발송일 경우 Loop을 돌기 때문에 마지막 시간이 reqDate에 들어가기 때문에 첫번째 데이터에서만 시간을 입력해 준다.
 					//mj_group_data 테이블의 reqdate 컬럼 값으로 셋팅 된다.
 					if(i==0) {
-						mjonMsgVO.setReqDate(tempVO.getReqDate());
+						frstDelayTime = tempVO.getReqDate();
 					}
 				}
 				
@@ -771,6 +772,13 @@
 				if(tmpDelayYn == null) {
 					mjonMsgVO.setDelayYn("N");
 				}
+				
+				//예약 문자이고 30분 지연이 된 문자의 Mj_msg_group_data 테이블의 req_date 시간을 첫번째 문자의 지연된 시간으로 셋팅해준다.
+				if(mjonMsgVO.getReserveYn().equals("Y") && (spamStatus.equals("Y") || smishingYn.equals("Y"))) {
+					
+					mjonMsgVO.setReqDate(frstDelayTime);
+					
+				}
 				mjonMsgDAO.insertGroupMsgData(mjonMsgVO);
 				
 			}else {
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
@@ -202,6 +202,18 @@
 	}
 	
 	/**
+	* @Method Name : updateReserveTimeHFNSmsMsgSeqListByMsgSeq
+	* @작성일 : 2023 07. 10.
+	* @작성자 :  우영두
+	* @Method 설명 : 현대퓨처넷 예약문자 지연처리 문자 정상 시간 발송
+	*/
+	public int updateReserveTimeHFNSmsMsgSeqListByMsgSeq(MjonResvMsgVO mjonResvMsgVO) {
+		
+		return update("MjonReservMsgDAO.updateReserveTimeHFNSmsMsgSeqListByMsgSeq", mjonResvMsgVO);
+	}
+	
+	
+	/**
 	* @Method Name : updateRealTimeIHeartMsgSeqListByMsgSeq
 	* @작성일 : 2022. 12. 02.
 	* @작성자 :  WYD
@@ -210,6 +222,17 @@
 	public int updateRealTimeHFNMmsMsgSeqListByMsgSeq(MjonResvMsgVO mjonResvMsgVO) {
 		
 		return update("MjonReservMsgDAO.updateRealTimeHFNMmsMsgSeqListByMsgSeq", mjonResvMsgVO);
+	}
+	
+	/**
+	* @Method Name : updateReserveTimeHFNMmsMsgSeqListByMsgSeq
+	* @작성일 : 2023. 07. 10.
+	* @작성자 :  우영두
+	* @Method 설명 : 현대퓨처넷 예약 장문/그림 지연처리 문자 즉시 발송
+	*/
+	public int updateReserveTimeHFNMmsMsgSeqListByMsgSeq(MjonResvMsgVO mjonResvMsgVO) {
+		
+		return update("MjonReservMsgDAO.updateReserveTimeHFNMmsMsgSeqListByMsgSeq", mjonResvMsgVO);
 	}
 	
 	/**
@@ -246,6 +269,18 @@
 	}
 	
 	/**
+	* @Method Name : updateReserveTimeJJMsgSeqListByMsgSeq
+	* @작성일 : 2023. 7. 10.
+	* @작성자 :  우영두
+	* @Method 설명 : 제이제이 예약 지연처리 문자 정상 발송
+	*/
+	public int updateReserveTimeJJMsgSeqListByMsgSeq(MjonResvMsgVO mjonResvMsgVO) {
+		
+		return update("MjonReservMsgDAO.updateReserveTimeJJMsgSeqListByMsgSeq", mjonResvMsgVO);
+	}
+	
+	
+	/**
 	* @Method Name : updateRealTimeIVTMsgSeqListByMsgSeq
 	* @작성일 : 2023. 05. 16.
 	* @작성자 :  WYH
@@ -254,6 +289,17 @@
 	public int updateRealTimeIVTMsgSeqListByMsgSeq(MjonResvMsgVO mjonResvMsgVO) {
 		
 		return update("MjonReservMsgDAO.updateRealTimeIVTMsgSeqListByMsgSeq", mjonResvMsgVO);
+	}
+	
+	/**
+	* @Method Name : updateReserveTimeIVTMsgSeqListByMsgSeq
+	* @작성일 : 2023. 07. 10.
+	* @작성자 :  우영두
+	* @Method 설명 : 인비토 예약 지연처리 문자 즉시 발송
+	*/
+	public int updateReserveTimeIVTMsgSeqListByMsgSeq(MjonResvMsgVO mjonResvMsgVO) {
+		
+		return update("MjonReservMsgDAO.updateReserveTimeIVTMsgSeqListByMsgSeq", mjonResvMsgVO);
 	}
 	
 	/**
@@ -268,6 +314,17 @@
 	}
 	
 	/**
+	* @Method Name : updateReserveTimeJJB01MsgSeqListByMsgSeq
+	* @작성일 : 2023. 07. 10.
+	* @작성자 :  우영두
+	* @Method 설명 : 제이제이 B01라인 예약 지연처리 문자 발송
+	*/
+	public int updateReserveTimeJJB01MsgSeqListByMsgSeq(MjonResvMsgVO mjonResvMsgVO) {
+		
+		return update("MjonReservMsgDAO.updateReserveTimeJJB01MsgSeqListByMsgSeq", mjonResvMsgVO);
+	}
+	
+	/**
 	* @Method Name : updateRealTimeJJB02MsgSeqListByMsgSeq
 	* @작성일 : 2023. 06. 20.
 	* @작성자 :  WYD
@@ -279,6 +336,17 @@
 	}
 	
 	/**
+	* @Method Name : updateReserveTimeJJB02MsgSeqListByMsgSeq
+	* @작성일 : 2023. 07. 10.
+	* @작성자 :  우영두
+	* @Method 설명 : 제이제이 B02라인 예약 지연처리 문자 발송
+	*/
+	public int updateReserveTimeJJB02MsgSeqListByMsgSeq(MjonResvMsgVO mjonResvMsgVO) {
+		
+		return update("MjonReservMsgDAO.updateReserveTimeJJB02MsgSeqListByMsgSeq", mjonResvMsgVO);
+	}
+	
+	/**
 	* @Method Name : updateReserveTimeBizMsgSeqListByMsgSeq
 	* @작성일 : 2023. 07. 06.
 	* @작성자 :  WYD
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
@@ -2313,6 +2313,7 @@
 			, A.result									AS resultType
 			, MGD.AT_DELAY_YN							AS atDelayYn
 			, MGD.AT_DELAY_COMPLETE_YN					AS atDelayCompleteYn
+			, MGD.RESERVE_YN 			AS reserveYn
 		FROM
 			(SELECT
 				a.MSG_ID			AS msgId
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
@@ -5825,6 +5825,25 @@
 	
 	</update>
 	
+	<!-- mj_msg_data 테이블 예약 지연 문자 발송 요청 값 수정 -->
+	<update id="mjonMsgDAO.updateMsgDelaySendReserveTimeMsgDataFlag" 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 USER_ID = #userId#
+		AND MSG_GROUP_ID = #msgGroupId#
+	
+	</update>
+	
 	<update id="mjonMsgDAO.updateMsgDelaySendRealTimeMsgGroupDataFlag" parameterClass="mjonMsgVO">
 		
 		UPDATE MJ_MSG_GROUP_DATA
@@ -5834,6 +5853,27 @@
 	
 	</update>
 	
+	<!-- mj_msg_group_data 테이블 예약 지연 문자  발송 요청시간 수정 -->
+	<update id="mjonMsgDAO.updateMsgDelaySendReserveTimeMsgGroupDataFlag" 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
+			]]> , 
+			
+			DELAY_COMPLETE_YN = 'Y'
+		WHERE USER_ID = #userId#
+		AND MSG_GROUP_ID = #msgGroupId#
+	
+	</update>
+	
 	<select id="mjonMsgDAO.selectMsgGroupDataReqDateList" parameterClass="mjonMsgResvVO" resultClass="mjonMsgResvVO">
 		
 		SELECT
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
@@ -628,10 +628,32 @@
 	
 	</update>
 	
+	<!-- 현대퓨처넷 예약문자 30분 딜레이 정상 전송 처리 -->
 	<update id="MjonReservMsgDAO.updateRealTimeHFNSmsMsgSeqListByMsgSeq" parameterClass="mjonMsgResvVO">
 		
 		UPDATE SMS_MSG 
 		SET TR_SENDDATE = NOW()
+		WHERE 1=1 
+		<iterate prepend="AND TR_ID IN" open="(" close=")" conjunction="," property="userDataList">
+			#userDataList[]#
+		</iterate>
+	
+	</update>
+	
+	<!-- 현대퓨처넷 예약 단문 지연처리 문자 정상 발송 -->
+	<update id="MjonReservMsgDAO.updateReserveTimeHFNSmsMsgSeqListByMsgSeq" parameterClass="mjonMsgResvVO">
+		
+		UPDATE SMS_MSG 
+		SET TR_SENDDATE =
+		<![CDATA[
+			CASE 
+				WHEN TIMESTAMPDIFF(MINUTE, NOW(), TR_SENDDATE) < 0
+				THEN TR_SENDDATE
+				WHEN TIMESTAMPDIFF(MINUTE, NOW(), TR_SENDDATE) >= 30 
+				THEN DATE_ADD(TR_SENDDATE, INTERVAL -30 MINUTE)
+				ELSE DATE_ADD(TR_SENDDATE, INTERVAL -(TIMESTAMPDIFF(MINUTE, NOW(), TR_SENDDATE)) MINUTE)
+			END
+		]]>
 		WHERE 1=1 
 		<iterate prepend="AND TR_ID IN" open="(" close=")" conjunction="," property="userDataList">
 			#userDataList[]#
@@ -649,6 +671,27 @@
 		</iterate>
 	
 	</update>
+	
+	<!-- 현대퓨처넷 예약 장문/그림 지연처리 문자 정상 발송 -->
+	<update id="MjonReservMsgDAO.updateReserveTimeHFNMmsMsgSeqListByMsgSeq" parameterClass="mjonMsgResvVO">
+		
+		UPDATE MMS_MSG 
+		SET REQDATE =
+		<![CDATA[
+			CASE 
+				WHEN TIMESTAMPDIFF(MINUTE, NOW(), REQDATE) < 0
+				THEN REQDATE
+				WHEN TIMESTAMPDIFF(MINUTE, NOW(), REQDATE) >= 30 
+				THEN DATE_ADD(REQDATE, INTERVAL -30 MINUTE)
+				ELSE DATE_ADD(REQDATE, INTERVAL -(TIMESTAMPDIFF(MINUTE, NOW(), REQDATE)) MINUTE)
+			END
+		]]>
+		WHERE 1=1 
+		<iterate prepend="AND ID IN" open="(" close=")" conjunction="," property="userDataList">
+			#userDataList[]#
+		</iterate>
+	
+	</update>	
 	
 	<update id="MjonReservMsgDAO.updateRealTimeIMOMsgSeqListByMsgSeq" parameterClass="mjonMsgResvVO">
 		
@@ -686,10 +729,61 @@
 	
 	</update>
 	
+	<update id="MjonReservMsgDAO.updateReserveTimeJJMsgSeqListByMsgSeq" parameterClass="mjonMsgResvVO">
+		
+		UPDATE MTMSG_DATA
+		SET    INPUT_DATE = 
+		<![CDATA[
+			CASE 
+				WHEN TIMESTAMPDIFF(MINUTE, NOW(), INPUT_DATE) < 0
+				THEN INPUT_DATE
+				WHEN TIMESTAMPDIFF(MINUTE, NOW(), INPUT_DATE) >= 30 
+				THEN DATE_ADD(INPUT_DATE, INTERVAL -30 MINUTE)
+				ELSE DATE_ADD(INPUT_DATE, INTERVAL -(TIMESTAMPDIFF(MINUTE, NOW(), INPUT_DATE)) MINUTE)
+			END
+		]]>	,
+		       RES_DATE    = 
+		<![CDATA[
+			CASE 
+				WHEN TIMESTAMPDIFF(MINUTE, NOW(), RES_DATE) < 0
+				THEN RES_DATE
+				WHEN TIMESTAMPDIFF(MINUTE, NOW(), RES_DATE) >= 30 
+				THEN DATE_ADD(RES_DATE, INTERVAL -30 MINUTE)
+				ELSE DATE_ADD(RES_DATE, INTERVAL -(TIMESTAMPDIFF(MINUTE, NOW(), RES_DATE)) MINUTE)
+			END
+		]]>
+		WHERE 1=1 
+		<iterate prepend="AND USERDATA IN" open="(" close=")" conjunction="," property="userDataList">
+			#userDataList[]#
+		</iterate>
+	
+	</update>
+	
 	<update id="MjonReservMsgDAO.updateRealTimeIVTMsgSeqListByMsgSeq" parameterClass="mjonMsgResvVO">
 		
 		UPDATE SMSQ_SEND
 		SET    SENDREQ_TIME = NOW() 
+		WHERE 1=1 
+		<iterate prepend="AND USERDATA IN" open="(" close=")" conjunction="," property="userDataList">
+			#userDataList[]#
+		</iterate>
+	
+	</update>
+	
+	<!-- 인비토 예약 지연처리 문자 즉시 발송  -->
+	<update id="MjonReservMsgDAO.updateReserveTimeIVTMsgSeqListByMsgSeq" parameterClass="mjonMsgResvVO">
+		
+		UPDATE SMSQ_SEND
+		SET    SENDREQ_TIME = 
+		<![CDATA[
+			CASE 
+				WHEN TIMESTAMPDIFF(MINUTE, NOW(), SENDREQ_TIME) < 0
+				THEN SENDREQ_TIME
+				WHEN TIMESTAMPDIFF(MINUTE, NOW(), SENDREQ_TIME) >= 30 
+				THEN DATE_ADD(SENDREQ_TIME, INTERVAL -30 MINUTE)
+				ELSE DATE_ADD(SENDREQ_TIME, INTERVAL -(TIMESTAMPDIFF(MINUTE, NOW(), SENDREQ_TIME)) MINUTE)
+			END
+		]]>
 		WHERE 1=1 
 		<iterate prepend="AND USERDATA IN" open="(" close=")" conjunction="," property="userDataList">
 			#userDataList[]#
@@ -709,6 +803,36 @@
 	
 	</update>
 	
+	<update id="MjonReservMsgDAO.updateReserveTimeJJB01MsgSeqListByMsgSeq" parameterClass="mjonMsgResvVO">
+		
+		UPDATE MTMSG_B1_DATA
+		SET    INPUT_DATE = 
+		<![CDATA[
+			CASE 
+				WHEN TIMESTAMPDIFF(MINUTE, NOW(), INPUT_DATE) < 0
+				THEN INPUT_DATE
+				WHEN TIMESTAMPDIFF(MINUTE, NOW(), INPUT_DATE) >= 30 
+				THEN DATE_ADD(INPUT_DATE, INTERVAL -30 MINUTE)
+				ELSE DATE_ADD(INPUT_DATE, INTERVAL -(TIMESTAMPDIFF(MINUTE, NOW(), INPUT_DATE)) MINUTE)
+			END
+		]]> ,
+       RES_DATE    = 
+       <![CDATA[
+			CASE 
+				WHEN TIMESTAMPDIFF(MINUTE, NOW(), RES_DATE) < 0
+				THEN RES_DATE
+				WHEN TIMESTAMPDIFF(MINUTE, NOW(), RES_DATE) >= 30 
+				THEN DATE_ADD(RES_DATE, INTERVAL -30 MINUTE)
+				ELSE DATE_ADD(RES_DATE, INTERVAL -(TIMESTAMPDIFF(MINUTE, NOW(), RES_DATE)) MINUTE)
+			END
+		]]>
+		WHERE 1=1 
+		<iterate prepend="AND USERDATA IN" open="(" close=")" conjunction="," property="userDataList">
+			#userDataList[]#
+		</iterate>
+	
+	</update>
+	
 	<update id="MjonReservMsgDAO.updateRealTimeJJB02MsgSeqListByMsgSeq" parameterClass="mjonMsgResvVO">
 		
 		UPDATE MTMSG_B2_DATA
@@ -721,6 +845,36 @@
 	
 	</update>
 	
+	<update id="MjonReservMsgDAO.updateReserveTimeJJB02MsgSeqListByMsgSeq" parameterClass="mjonMsgResvVO">
+		
+		UPDATE MTMSG_B2_DATA
+		SET    INPUT_DATE =  
+		<![CDATA[
+			CASE 
+				WHEN TIMESTAMPDIFF(MINUTE, NOW(), INPUT_DATE) < 0
+				THEN INPUT_DATE
+				WHEN TIMESTAMPDIFF(MINUTE, NOW(), INPUT_DATE) >= 30 
+				THEN DATE_ADD(INPUT_DATE, INTERVAL -30 MINUTE)
+				ELSE DATE_ADD(INPUT_DATE, INTERVAL -(TIMESTAMPDIFF(MINUTE, NOW(), INPUT_DATE)) MINUTE)
+			END
+		]]> ,
+		RES_DATE    = 
+		<![CDATA[
+			CASE 
+				WHEN TIMESTAMPDIFF(MINUTE, NOW(), RES_DATE) < 0
+				THEN RES_DATE
+				WHEN TIMESTAMPDIFF(MINUTE, NOW(), RES_DATE) >= 30 
+				THEN DATE_ADD(RES_DATE, INTERVAL -30 MINUTE)
+				ELSE DATE_ADD(RES_DATE, INTERVAL -(TIMESTAMPDIFF(MINUTE, NOW(), RES_DATE)) MINUTE)
+			END
+		]]>       
+		WHERE 1=1 
+		<iterate prepend="AND USERDATA IN" open="(" close=")" conjunction="," property="userDataList">
+			#userDataList[]#
+		</iterate>
+	
+	</update>
+	
 	<update id="MjonReservMsgDAO.updateReserveTimeBizMsgSeqListByMsgSeq" parameterClass="mjonMsgResvVO">
 		UPDATE
 			BIZ_MSG
src/main/resources/egovframework/sqlmap/let/uss/umt/EgovMberManage_SQL_Mysql.xml
--- src/main/resources/egovframework/sqlmap/let/uss/umt/EgovMberManage_SQL_Mysql.xml
+++ src/main/resources/egovframework/sqlmap/let/uss/umt/EgovMberManage_SQL_Mysql.xml
@@ -1668,7 +1668,7 @@
 		LEFT JOIN MJ_MSG_GROUP_DATA MGD
 		ON A.msgGroupId = MGD.MSG_GROUP_ID
 		WHERE MGD.USER_ID = #mberId#
-		AND	MGD.RESERVE_YN = 'N'
+		<!-- AND	MGD.RESERVE_YN = 'N' -->
 		AND MGD.RESERVE_C_YN = 'N'
 		AND MGD.DELAY_YN = 'Y'
 		AND MGD.DELAY_COMPLETE_YN = 'N'
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
@@ -4048,6 +4048,9 @@
 													</c:choose>
 												</td>
 												<td>
+													<c:if test="${mjonMsgDelaySentList.reserveYn eq 'Y'}">
+														[예약]
+													</c:if>
 													<c:choose>
 														<c:when test="${not empty mjonMsgDelaySentList.sentDate}">
 															<fmt:formatDate value="${mjonMsgDelaySentList.sentDate}" pattern="yyyy-MM-dd HH:mm"/>
@@ -4513,6 +4516,9 @@
 														</c:choose>
 													</td>
 													<td>
+														<c:if test="${kakaoDelayInfo.reserveYn eq 'Y'}">
+															[예약]
+														</c:if>
 														<c:choose>
 															<c:when test="${not empty kakaoDelayInfo.sentDate}">
 																<fmt:formatDate value="${kakaoDelayInfo.sentDate}" pattern="yyyy-MM-dd HH:mm"/>
Add a comment
List