이준호 이준호 2025-04-28
- 알림톡 발송결과 탭 페이징 이어지도록 수정 - 리스트 쿼리 성능 개선
 - 리스트 쿼리 성능 개선
@36290f8dd87c7f04a7beedb6d99fe787d5b91442
src/main/java/itn/let/kakao/user/sent/service/impl/KakaoSentDAO.java
--- src/main/java/itn/let/kakao/user/sent/service/impl/KakaoSentDAO.java
+++ src/main/java/itn/let/kakao/user/sent/service/impl/KakaoSentDAO.java
@@ -126,8 +126,13 @@
 	}
 	
 	//발송 관리 문자발송 내용 상세보기 팝업[그룹]
-		public MjonKakaoATVO selectKakaoSentDetailViewPhoneAjax(MjonKakaoATVO KakaoSentVO) throws Exception{
-			return (MjonKakaoATVO) select("KakaoSentDAO.selectKakaoSentDetailViewPhoneAjax", KakaoSentVO);
-		}	
+	public MjonKakaoATVO selectKakaoSentDetailViewPhoneAjax(MjonKakaoATVO KakaoSentVO) throws Exception{
+		return (MjonKakaoATVO) select("KakaoSentDAO.selectKakaoSentDetailViewPhoneAjax", KakaoSentVO);
+	}	
+		
+	@SuppressWarnings("unchecked")
+	public List<KakaoSentVO> selectAllKakaoSentListExcel_advc(KakaoSentVO kakaoSentVO) throws Exception{
+		return (List<KakaoSentVO>) list("KakaoSentDAO.selectAllKakaoSentListExcel_advc",kakaoSentVO);
+	}
 	
 }
src/main/java/itn/let/kakao/user/sent/service/impl/KakaoSentServiceImpl.java
--- src/main/java/itn/let/kakao/user/sent/service/impl/KakaoSentServiceImpl.java
+++ src/main/java/itn/let/kakao/user/sent/service/impl/KakaoSentServiceImpl.java
@@ -302,9 +302,13 @@
 		result.setKakaoResendSuccCount(eachCnt.getKakaoResendSuccCount());
 		result.setKakaoResendFailCount(eachCnt.getKakaoResendFailCount());
 		
+		result.setMsgGroupCnt(
+				Integer.valueOf(result.getSuccessCount() + result.getWaitCount() + result.getFailCount()).toString()
+				);
 		
 		//완료상태 시작
 		result = this.codeProc(result);
+		
 		
 		//완료상태 끝
 		//=======================================================
@@ -470,7 +474,7 @@
 		}
 		
 		//예약 관리 리스트 불러오기
-		List<KakaoSentVO> resultList = kakaoSentDAO.selectAllKakaoSentList_advc(kakaoSentVO);
+		List<KakaoSentVO> resultList = kakaoSentDAO.selectAllKakaoSentListExcel_advc(kakaoSentVO);
 
 //		long startTime = System.nanoTime(); // 시작 시간 측정
 //		resultAllSentList = makeDetailFunction(resultAllSentList);
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
@@ -1354,6 +1354,111 @@
 	
 	<!-- 전체 발송결과 조회  (그룹별)-->
 	<select id="KakaoSentDAO.selectAllKakaoSentList_advc" parameterClass="kakaoSentVO" resultClass="kakaoSentVO">
+			/*	KakaoSentDAO.selectAllKakaoSentList_advc	*/
+			
+				SELECT COUNT(B.USER_ID) OVER ()    AS totMsgCnt,
+				       B.USER_ID                   AS userId,
+				       B.MSG_GROUP_ID              AS msgGroupId,
+				       B.SMS_TXT                   AS smsTxt,
+				       B.SUBJECT                   AS subject,
+				       B.SUBJECT_CHK_YN            AS subjectChkYn,
+				       B.REGDATE                   AS regDate,
+				       B.REQ_DATE                  AS reqDate,
+				       CASE
+				           WHEN B.DELAY_YN = 'Y' AND B.DELAY_COMPLETE_YN = 'N'
+				               THEN DATE_ADD(B.REQ_DATE, INTERVAL -30 MINUTE)
+				           ELSE B.REQ_DATE
+				           END                     AS delayOrgTime,
+				       B.CALL_FROM                 AS callFrom,
+				       B.TOT_PRICE                 AS totPrice,
+				       B.EACH_PRICE                AS eachPrice,
+				       B.MSG_TYPE                  AS msgType,
+				       B.FILE_CNT                  AS fileCnt,
+				       B.AGENT_CODE                AS agentCode,
+				       B.CANCELDATE                AS canceldate,
+				       B.DEL_FLAG                  AS delFlag,
+				       B.SEND_KIND                 AS sendKind,
+				       B.MSG_KIND                  AS msgKind,
+				       B.DELAY_YN                  AS delayYn,
+				       B.DELAY_COMPLETE_YN         AS delayCompleteYn,
+				       B.RESERVE_YN                AS reserveYn,
+				       B.RESERVE_C_YN              AS reserveCYn,
+				       TIMESTAMPDIFF(
+				               MINUTE,
+				               CAST(DATE_FORMAT(B.REQ_DATE, '%Y-%m-%d %H:%i') AS CHAR),
+				               DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i')
+				       )                           AS diffMin,
+				       B.AT_DELAY_YN               AS atDelayYn,
+				       B.AT_DELAY_COMPLETE_YN      AS atDelayCompleteYn,
+				       A.MSG_NOTICETALK_SENDER_KEY AS msgNoticetalkSenderKey,
+				       A.BIZ_KAKAO_RESEND_YN       AS bizKakaoResendYn,
+				       CASE
+				           WHEN B.AT_DELAY_YN = 'Y' AND B.AT_DELAY_COMPLETE_YN = 'N'
+				               THEN DATE_ADD(B.REQ_DATE, INTERVAL -30 MINUTE)
+				           ELSE B.REQ_DATE
+				           END                     AS atDelayOrgTime,
+				       C.YELLOW_ID                 AS yellowId
+				FROM MJ_MSG_GROUP_DATA B
+			         INNER JOIN (
+					         select MSG_GROUP_ID, MSG_TYPE, DEL_FLAG, MSG_NOTICETALK_SENDER_KEY, BIZ_KAKAO_RESEND_YN
+						      from MJ_MSG_DATA
+						      where DEL_FLAG = 'N'
+						        <isNotEmpty property="tabType">
+									<isEqual property="tabType" compareValue="at">
+										AND MSG_TYPE = '8'
+									</isEqual>
+									<isEqual property="tabType" compareValue="ft">
+										AND MSG_TYPE = '9'
+									</isEqual>
+									<isEqual property="tabType" compareValue="all">
+										AND MSG_TYPE  IN ('8','9')
+									</isEqual>
+								</isNotEmpty>
+								<isEmpty property="tabType">
+										AND MSG_TYPE IN ('8','9')
+								</isEmpty>
+						      group by MSG_GROUP_ID) A
+				     	ON A.MSG_GROUP_ID = B.MSG_GROUP_ID
+				     LEFT JOIN MJ_KAKAO_PROFILE_INFO C
+				     	ON A.MSG_NOTICETALK_SENDER_KEY = C.SENDER_KEY
+				WHERE    (
+				                  B.DEL_FLAG = 'N' OR B.DEL_FLAG IS NULL
+				         )
+				AND      B.USER_ID                           = #userId#
+				<isNotEmpty property="startDate">
+					AND      DATE_FORMAT(B.REGDATE, '%Y-%m-%d') <![CDATA[ >= ]]> DATE_FORMAT(#startDate#, '%Y-%m-%d')
+				</isNotEmpty>
+				<isNotEmpty property="endDate">
+					AND      DATE_FORMAT(B.REGDATE, '%Y-%m-%d') <![CDATA[ <= ]]> DATE_FORMAT(#endDate#, '%Y-%m-%d')
+				</isNotEmpty>
+				<isNotEmpty property="stateType">
+					<isEqual property="stateType" compareValue="Y">
+						AND B.RESERVE_YN  = 'Y'
+					</isEqual>
+					<isEqual property="stateType" compareValue="N">
+						AND B.RESERVE_YN  = 'N'
+					</isEqual>
+				</isNotEmpty>
+				<isNotEmpty property="searchKeyword">
+					<isEqual property="searchCondition" compareValue="3">
+						AND  B.SMS_TXT like CONCAT('%', #searchKeyword#, '%')
+					</isEqual>
+				</isNotEmpty>
+				GROUP BY B.MSG_GROUP_ID
+				ORDER BY 1=1
+				<isNotEmpty property="searchSortCnd">
+					,$searchSortCnd$
+				</isNotEmpty>
+				<isNotEmpty property="searchSortOrd">
+					$searchSortOrd$
+				</isNotEmpty>
+				LIMIT    #recordCountPerPage#
+				OFFSET   #firstIndex#
+
+		</select>
+	
+	<!-- 전체 발송결과 조회  (그룹별)-->
+	<select id="KakaoSentDAO.selectAllKakaoSentListExcel_advc" parameterClass="kakaoSentVO" resultClass="kakaoSentVO">
 		/*	KakaoSentDAO.selectAllKakaoSentList_advc	*/
 		SELECT t1.totMsgCnt,
 		       t1.userId,
@@ -1609,7 +1714,7 @@
 		            WHEN COUNT(DISTINCT t1.REQ_DATE) > 1 THEN 'Y'
 		            ELSE 'N'
 		        END AS divideYN
-		    FROM mj_msg_data t1
+		    FROM mj_msg_data t1 FORCE INDEX (idx_msgdata_groupid_delfalg_msgtype_curstate)
 		    LEFT OUTER JOIN BIZ_LOG BL1 ON t1.BIZ_UMID = BL1.CMID
 		    WHERE 
 		        t1.DEL_FLAG = 'N'
src/main/webapp/WEB-INF/jsp/web/kakao/sent/KakaoSentDetailView.jsp
--- src/main/webapp/WEB-INF/jsp/web/kakao/sent/KakaoSentDetailView.jsp
+++ src/main/webapp/WEB-INF/jsp/web/kakao/sent/KakaoSentDetailView.jsp
@@ -900,6 +900,8 @@
 		<input type="hidden" name="searchCondition" value="<c:out value='${searchVO.searchCondition }' />" />
 		<input type="hidden" name="searchKeyword" value="<c:out value='${searchVO.searchKeyword }' />" />
 		<input type="hidden" name="pageUnit" value="<c:out value='${searchVO.pageUnit }' />" />
+		<input type="hidden" name="tabType" value="<c:out value='${searchVO.tabType }' />" />
+		<input type="hidden" name="stateType" value="<c:out value='${searchVO.stateType }' />" />
 	</form>
 	
 	<!-- 예약 취소 -->
src/main/webapp/WEB-INF/jsp/web/kakao/sent/KakaoSentView.jsp
--- src/main/webapp/WEB-INF/jsp/web/kakao/sent/KakaoSentView.jsp
+++ src/main/webapp/WEB-INF/jsp/web/kakao/sent/KakaoSentView.jsp
@@ -16,7 +16,82 @@
 var threefulstday = "";		//3개월전 시작일
 var threefuledday = "";		//3개월전 마지막일
 
+function firstLodingSet(){
+	var html = "";
+	html += '<div class="list_info">';
+	html += '    <p>총 발송건수 <span class="c_e40000">0</span>건</p>';
+	html += '    <div>';
+	html += '        <p class="cf_text c_e40000">※ 예약 발송취소는 예약 발송시간 기준 5분 전까지만 가능</p>';
+	html += '        <label for="pageUnit" class="label">줄보기 선택</label>';
+	html += '        <select id="pageUnit" name="pageUnit" class="selType2">';
+	html += '            <option value="10" selected>10개보기</option>';
+	html += '        </select>';
+	html += '    </div>';
+	html += '</div>';
+	html += '<div class="tb_wrap">';
+	html += '    <table class="tType4">';
+	html += '        <colgroup>';
+	html += '            <col style="width: 45px;">';
+	html += '            <col style="width: 12%;">';
+	html += '            <col style="width: 7%;">';
+	html += '            <col style="width: auto;">';
+	html += '            <col style="width: 7%;">';
+	html += '            <col style="width: 6%;">';
+	html += '            <col style="width: 6%;">';
+	html += '            <col style="width: 6%;">';
+	html += '            <col style="width: 6%;">';
+	html += '            <col style="width: 6%;">';
+	html += '            <col style="width: 8%;">';
+	html += '            <col style="width: 8%;">';
+	html += '        </colgroup>';
+	html += '        <thead>';
+	html += '            <tr>';
+	html += '                <th rowspan="2">';
+	html += '                    <label for="" class="label">전체 선택</label>';
+	html += '                    <input type="checkbox" id="allCheck" name="allCheck">';
+	html += '                </th>';
+	html += '                <th rowspan="2">발송일시';
+	html += '                    <div class="sort_wrap">';
+	html += '                        <input type="button" class="sort sortBtn" id="sort_reqdate">';
+	html += '                    </div>';
+	html += '                </th>';
+	html += '                <th rowspan="2">형태';
+	html += '                    <div class="sort_wrap">';
+	html += '                        <input type="button" class="sort sortBtn" id="sort_orderByCode">';
+	html += '                    </div>';
+	html += '                </th>';
+	html += '                <th rowspan="2">내용</th>';
+	html += '                <th rowspan="2">발송건수';
+	html += '                    <div class="sort_wrap">';
+	html += '                        <input type="button" class="sort sortBtn" id="sort_msgGroupCnt">';
+	html += '                    </div>';
+	html += '                </th>';
+	html += '                <th rowspan="2">대기</th>';												
+	html += '                <th colspan="2">카카오톡결과</th>';
+	html += '                <th colspan="2">대체문자결과</th>';
+	html += '                <th rowspan="2">금액(원)</th>';
+	html += '                <th rowspan="2">진행상황</th>';
+	html += '            </tr>';
+	html += '            <tr>';
+	html += '                <th>성공</th>';
+	html += '                <th>실패</th>';
+	html += '                <th>성공</th>';
+	html += '                <th>실패</th>';
+	html += '            </tr>';
+	html += '        </thead>';
+	html += '        <tbody>';
+	html += '            <tr><td colspan="12">LOADING...</td></tr>';
+	html += '        </tbody>';
+	html += '    </table>';
+	html += '</div>';
+	
+	$(".msgSentAllLoad").html(html);
+}
+
+
 $(document).ready(function(){
+	
+	firstLodingSet();
 	
 	//초기 전체 리스트 페이지 보여주기
 	var form = document.searchForm;
@@ -417,8 +492,10 @@
 					<input type="hidden" id="msgGroupIdList" name="msgGroupIdList" value=""/>
 					<input type="hidden" name="searchSortCnd" value="<c:out value="${searchVO.searchSortCnd}" />" />
 					<input type="hidden" name="searchSortOrd" value="<c:out value="${searchVO.searchSortOrd}" />" />
-					<input type="hidden" id="tabType" name="tabType" value="all"/><!-- 탭 종류 -->
-					<input type="hidden" id="stateType" name="stateType" value="all"/><!-- 발송상태 종류 -->
+					<!-- <input type="hidden" id="tabType" name="tabType" value="all"/>탭 종류 -->
+					<input type="hidden" id="tabType" name="tabType" value="${searchVO.tabType}"/><!-- 탭 종류 -->
+					<!-- <input type="hidden" id="stateType" name="stateType" value="all"/>발송상태 종류 -->
+					<input type="hidden" id="stateType" name="stateType" value="${searchVO.stateType}"/><!-- 발송상태 종류 -->
 					<input type="hidden" id="listType" name="listType" value="groupList"/><!-- 리스트 종류 -->
 					<input type="hidden" id="addrGrpNm" name="addrGrpNm" value=""/><!-- 주소록 그룹 이름 -->
 					<input type="hidden" id="mberId" name="mberId" value="${LoginVO.id}"/><!-- 주소록 그룹 이름 -->
@@ -555,11 +632,11 @@
 				<div class="list_tab_wrap2 type4">
 					<!-- tab button -->
 					<ul class="list_tab">
-						<li class="tab active"><button type="button" onclick="fnTabLoad('',0); return false;">전체</button></li>
-						<li class="tab"><button type="button" onclick="fnTabLoad('at', 1); return false;">알림톡</button></li>
+						<li class="tab <c:if test="${searchVO.tabType eq '' || searchVO.tabType eq 'all' || empty searchVO.tabType}">active</c:if>"><button type="button" onclick="fnTabLoad('',0); return false;">전체</button></li>
+						<li class="tab <c:if test="${searchVO.tabType eq 'at'}">active</c:if>"><button type="button" onclick="fnTabLoad('at', 1); return false;">알림톡</button></li>
 						<%-- <c:if test="${pageContext.request.serverName == 'localhost' 
 						            || pageContext.request.serverName == '119.193.215.98'}">
-							<li class="tab"><button type="button" onclick="fnTabLoad('ft', 2); return false;">친구톡</button></li>
+							<li class="tab <c:if test="${searchVO.tabType eq 'ft'}">active</c:if>"><button type="button" onclick="fnTabLoad('ft', 2); return false;">친구톡</button></li>
 				        </c:if> --%>
 					</ul><!--// tab button -->
 				</div>
@@ -582,7 +659,7 @@
 <!-- 								<div class="on_active">받는사람(전송건별)</div> -->
 <!-- 							</div> -->
 							<ul>
-								<li class="tab active">
+								<li class="tab <c:if test="${searchVO.stateType eq 'all' || searchVO.stateType eq '' || empty searchVO.stateType}">active</c:if>">
 									<button type="button" onclick="fnListLoad('all','0'); return false;">전체</button>
 								</li>
 								<!-- <li class="tab">
@@ -594,10 +671,10 @@
 								<li class="tab">
 									<button type="button" onclick="fnListLoad('fail','3'); return false;">수신오류</button>
 								</li> -->
-								<li class="tab">
+								<li class="tab <c:if test="${searchVO.stateType eq 'N'}">active</c:if>">
 									<button type="button" onclick="fnListLoad('N','1'); return false;">즉시</button>
 								</li>
-								<li class="tab">
+								<li class="tab" <c:if test="${searchVO.stateType eq 'Y'}">active</c:if>>
 									<button type="button" onclick="fnListLoad('Y','2'); return false;">예약</button>
 								</li>
 							</ul>
Add a comment
List