- 알림톡 발송결과 탭 페이징 이어지도록 수정

- 리스트 쿼리 성능 개선
This commit is contained in:
leejunho 2025-04-28 14:04:05 +09:00
parent 46d63224d0
commit 36290f8dd8
5 changed files with 206 additions and 13 deletions

View File

@ -126,8 +126,13 @@ public class KakaoSentDAO extends EgovAbstractDAO {
} }
//발송 관리 문자발송 내용 상세보기 팝업[그룹] //발송 관리 문자발송 내용 상세보기 팝업[그룹]
public MjonKakaoATVO selectKakaoSentDetailViewPhoneAjax(MjonKakaoATVO KakaoSentVO) throws Exception{ public MjonKakaoATVO selectKakaoSentDetailViewPhoneAjax(MjonKakaoATVO KakaoSentVO) throws Exception{
return (MjonKakaoATVO) select("KakaoSentDAO.selectKakaoSentDetailViewPhoneAjax", KakaoSentVO); 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);
}
} }

View File

@ -302,10 +302,14 @@ public class KakaoSentServiceImpl extends EgovAbstractServiceImpl implements Ka
result.setKakaoResendSuccCount(eachCnt.getKakaoResendSuccCount()); result.setKakaoResendSuccCount(eachCnt.getKakaoResendSuccCount());
result.setKakaoResendFailCount(eachCnt.getKakaoResendFailCount()); result.setKakaoResendFailCount(eachCnt.getKakaoResendFailCount());
result.setMsgGroupCnt(
Integer.valueOf(result.getSuccessCount() + result.getWaitCount() + result.getFailCount()).toString()
);
//완료상태 시작 //완료상태 시작
result = this.codeProc(result); result = this.codeProc(result);
//완료상태 //완료상태
//======================================================= //=======================================================
@ -470,7 +474,7 @@ public class KakaoSentServiceImpl extends EgovAbstractServiceImpl implements Ka
} }
//예약 관리 리스트 불러오기 //예약 관리 리스트 불러오기
List<KakaoSentVO> resultList = kakaoSentDAO.selectAllKakaoSentList_advc(kakaoSentVO); List<KakaoSentVO> resultList = kakaoSentDAO.selectAllKakaoSentListExcel_advc(kakaoSentVO);
// long startTime = System.nanoTime(); // 시작 시간 측정 // long startTime = System.nanoTime(); // 시작 시간 측정
// resultAllSentList = makeDetailFunction(resultAllSentList); // resultAllSentList = makeDetailFunction(resultAllSentList);

View File

@ -1354,6 +1354,111 @@
<!-- 전체 발송결과 조회 (그룹별)--> <!-- 전체 발송결과 조회 (그룹별)-->
<select id="KakaoSentDAO.selectAllKakaoSentList_advc" parameterClass="kakaoSentVO" resultClass="kakaoSentVO"> <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 */ /* KakaoSentDAO.selectAllKakaoSentList_advc */
SELECT t1.totMsgCnt, SELECT t1.totMsgCnt,
t1.userId, t1.userId,
@ -1609,7 +1714,7 @@
WHEN COUNT(DISTINCT t1.REQ_DATE) > 1 THEN 'Y' WHEN COUNT(DISTINCT t1.REQ_DATE) > 1 THEN 'Y'
ELSE 'N' ELSE 'N'
END AS divideYN 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 LEFT OUTER JOIN BIZ_LOG BL1 ON t1.BIZ_UMID = BL1.CMID
WHERE WHERE
t1.DEL_FLAG = 'N' t1.DEL_FLAG = 'N'

View File

@ -900,6 +900,8 @@ function previewPhone(){
<input type="hidden" name="searchCondition" value="<c:out value='${searchVO.searchCondition }' />" /> <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="searchKeyword" value="<c:out value='${searchVO.searchKeyword }' />" />
<input type="hidden" name="pageUnit" value="<c:out value='${searchVO.pageUnit }' />" /> <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> </form>
<!-- 예약 취소 --> <!-- 예약 취소 -->

View File

@ -16,8 +16,83 @@ var thisfuledtlday = ""; //당원 마지막일
var threefulstday = ""; //3개월전 시작일 var threefulstday = ""; //3개월전 시작일
var threefuledday = ""; //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(){ $(document).ready(function(){
firstLodingSet();
//초기 전체 리스트 페이지 보여주기 //초기 전체 리스트 페이지 보여주기
var form = document.searchForm; var form = document.searchForm;
form.listType.value = "groupList"; form.listType.value = "groupList";
@ -417,8 +492,10 @@ function fn_sentDetailView(msgGroupId) {
<input type="hidden" id="msgGroupIdList" name="msgGroupIdList" value=""/> <input type="hidden" id="msgGroupIdList" name="msgGroupIdList" value=""/>
<input type="hidden" name="searchSortCnd" value="<c:out value="${searchVO.searchSortCnd}" />" /> <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" name="searchSortOrd" value="<c:out value="${searchVO.searchSortOrd}" />" />
<input type="hidden" id="tabType" name="tabType" value="all"/><!-- 탭 종류 --> <!-- <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="${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="listType" name="listType" value="groupList"/><!-- 리스트 종류 -->
<input type="hidden" id="addrGrpNm" name="addrGrpNm" value=""/><!-- 주소록 그룹 이름 --> <input type="hidden" id="addrGrpNm" name="addrGrpNm" value=""/><!-- 주소록 그룹 이름 -->
<input type="hidden" id="mberId" name="mberId" value="${LoginVO.id}"/><!-- 주소록 그룹 이름 --> <input type="hidden" id="mberId" name="mberId" value="${LoginVO.id}"/><!-- 주소록 그룹 이름 -->
@ -555,11 +632,11 @@ function fn_sentDetailView(msgGroupId) {
<div class="list_tab_wrap2 type4"> <div class="list_tab_wrap2 type4">
<!-- tab button --> <!-- tab button -->
<ul class="list_tab"> <ul class="list_tab">
<li class="tab active"><button type="button" onclick="fnTabLoad('',0); 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"><button type="button" onclick="fnTabLoad('at', 1); 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' <%-- <c:if test="${pageContext.request.serverName == 'localhost'
|| pageContext.request.serverName == '119.193.215.98'}"> || 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> --%> </c:if> --%>
</ul><!--// tab button --> </ul><!--// tab button -->
</div> </div>
@ -582,7 +659,7 @@ function fn_sentDetailView(msgGroupId) {
<!-- <div class="on_active">받는사람(전송건별)</div> --> <!-- <div class="on_active">받는사람(전송건별)</div> -->
<!-- </div> --> <!-- </div> -->
<ul> <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> <button type="button" onclick="fnListLoad('all','0'); return false;">전체</button>
</li> </li>
<!-- <li class="tab"> <!-- <li class="tab">
@ -594,10 +671,10 @@ function fn_sentDetailView(msgGroupId) {
<li class="tab"> <li class="tab">
<button type="button" onclick="fnListLoad('fail','3'); return false;">수신오류</button> <button type="button" onclick="fnListLoad('fail','3'); return false;">수신오류</button>
</li> --> </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> <button type="button" onclick="fnListLoad('N','1'); return false;">즉시</button>
</li> </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> <button type="button" onclick="fnListLoad('Y','2'); return false;">예약</button>
</li> </li>
</ul> </ul>