Merge branch 'jiwoo'

This commit is contained in:
JIWOO 2025-09-24 14:31:45 +09:00
commit 416a7b8273
7 changed files with 246 additions and 246 deletions

View File

@ -284,7 +284,6 @@ public class MjonMsgVO extends ComDefaultVO{
private String totFWPriceSum; private String totFWPriceSum;
private String resultLogUpdtPnttm; private String resultLogUpdtPnttm;
private int successCount; // 문자발송 성공건수
private int callRejectionCount; // 번호도용 문자차단 서비스로 착신거절 오류 private int callRejectionCount; // 번호도용 문자차단 서비스로 착신거절 오류
private String callbackYn; // 번호도용 문자차단 서비스로 인한 발송실패 문자알림 여부(N:미알림, Y:알림) private String callbackYn; // 번호도용 문자차단 서비스로 인한 발송실패 문자알림 여부(N:미알림, Y:알림)
private String userCallbackYn; private String userCallbackYn;
@ -316,4 +315,17 @@ public class MjonMsgVO extends ComDefaultVO{
private String rsltCodeMsgTxt; //전송사 결과 코드 내용 private String rsltCodeMsgTxt; //전송사 결과 코드 내용
private int waitCount; //대기 건수
private int successCount; // 문자발송 성공건수
private int failCount; //실패 건수
private int kakaoResendWaitCount; //대체문자 대기 건수
private int kakaoResendSuccCount; //대체문자 성공 건수
private int kakaoResendFailCount; //대체문자 실패 건수
private String[] msgTypeList; //발송 타입 리스트
private String selectType; //조회 타입 ex) complete : 전송완료
private String yellowId; //채널아이디
private String yellowIdYn; //채널아이디 여부
} }

View File

@ -190,7 +190,8 @@ public interface MjonMsgDataService {
public MjonMsgReturnVO sendSysMsgData(MjonMsgVO mjonMsgVO, HttpServletRequest request) throws Exception; public MjonMsgReturnVO sendSysMsgData(MjonMsgVO mjonMsgVO, HttpServletRequest request) throws Exception;
//mj_msg_data 테이블의 msg_result 컬럼을 이용한 발송건수 조회 쿼리
public List<MjonMsgVO> selectSendListByResultCode(MjonMsgVO mjonMsgVO) throws Exception;
} }

View File

@ -462,7 +462,10 @@ public class MjonMsgDataDAO extends EgovAbstractDAO {
return totalInsertedCount; // 처리된 전체 데이터 반환 return totalInsertedCount; // 처리된 전체 데이터 반환
} }
@SuppressWarnings("unchecked")
public List<MjonMsgVO> selectSendListByResultCode(MjonMsgVO mjonMsgVO) throws Exception{
return (List<MjonMsgVO>) list("mjonMsgDAO.selectSendListByResultCode",mjonMsgVO);
}
public Timestamp convertToTimestamp(String reqDate) { public Timestamp convertToTimestamp(String reqDate) {
try { try {

View File

@ -5148,4 +5148,9 @@ public class MjonMsgDataServiceImpl extends EgovAbstractServiceImpl implements M
return returnVO; return returnVO;
} }
@Override
public List<MjonMsgVO> selectSendListByResultCode(MjonMsgVO mjonMsgVO) throws Exception {
return mjonMsgDataDAO.selectSendListByResultCode(mjonMsgVO);
}
} }

View File

@ -1471,61 +1471,32 @@ public class EgovUserManageController {
model.addAttribute("channelIdCnt", channelIdCnt); model.addAttribute("channelIdCnt", channelIdCnt);
model.addAttribute("resultKakaoChannelIDList", resultKakaoChannelIDList); model.addAttribute("resultKakaoChannelIDList", resultKakaoChannelIDList);
/* /* 카카오 전송 완료, 예약 조회 */
* 알림톡/친구톡 최근 발송내역 리스트 불러오기 /* 전송완료, 예약 공통 set */
*/ MjonMsgVO kakaoListVO = new MjonMsgVO();
kakaoListVO.setUserId(reqMberManageVO.getMberId());
KakaoVO sendKakaoVO = new KakaoVO(); kakaoListVO.setReserveCYn("N");
//sendKakaoVO.setSearchCondition2("N");//예약건은 제외하기 kakaoListVO.setRecordCountPerPage(3);
sendKakaoVO.setReserveCYn("N");//예약취소건은 제외하기 kakaoListVO.setFirstIndex(0);
sendKakaoVO.setUserId(reqMberManageVO.getMberId()); kakaoListVO.setYellowIdYn("Y");
// 문자발송 완료건은 모두 보이도록 처리 String[] msgTypeList = {"8","9"};
//kakaoVO.setMsgType("8"); kakaoListVO.setMsgTypeList(msgTypeList);
sendKakaoVO.setSearchSortCnd("reqDate");
sendKakaoVO.setSearchSortOrd("desc");
sendKakaoVO.setFirstIndex(0);
sendKakaoVO.setPageType("sand");
List<KakaoVO> kakaoResultList = new ArrayList<KakaoVO>();
//kakaoResultList = mjonKakaoATService.selectMjonKakaoATGroupCompleteByUserList(sendKakaoVO);
/*250620 - 회원 정보 팝업 최근 알림톡/친구톡 전송 내역을 조회하는 임시 쿼리
* 기존 쿼리 성능으로 인하여 회원 정보 팝업 오픈 간헐적으로 에러 발생
* 임시 쿼리는 화면에 필요한 최소한의 정보만 조회하며, USER_ID를 제외한 조건은 하드코딩 처리
* DB 개선 작업 이후 알림톡/친구톡 관련 조회 공통 쿼리 생성 예정
* */
sendKakaoVO.setReserveYn("N");
kakaoResultList = mjonKakaoATService.selectMjonKakaoATGroupCompleteByUserListTemp(sendKakaoVO);
/* 전송완료 set*/
kakaoListVO.setSelectType("reqDateLast3M"); //발송일시가 지금부터 지난 3개월
kakaoListVO.setSearchSortCnd("REQ_DATE");
kakaoListVO.setSearchSortOrd("DESC");
List<MjonMsgVO> kakaoResultList = mjonMsgDataService.selectSendListByResultCode(kakaoListVO);
model.addAttribute("kakaoResultList", kakaoResultList); model.addAttribute("kakaoResultList", kakaoResultList);
/* /* 예약 set */
* 알림톡/친구톡 예약발송 리스트 불러오기 kakaoListVO.setReserveYn("Y");
*/ kakaoListVO.setSelectType("reqDateNext3M"); //발송일시가 지금부터 다음 3개월
kakaoListVO.setSearchSortCnd("REQ_DATE");
KakaoVO reserveKakaoVO = new KakaoVO(); kakaoListVO.setSearchSortOrd("ASC");
reserveKakaoVO.setReserveYn("Y"); //예약건만 조회 List<MjonMsgVO> kakaoReserveList = mjonMsgDataService.selectSendListByResultCode(kakaoListVO);
reserveKakaoVO.setSearchCondition2("Y");//예약건만 불러오기
reserveKakaoVO.setReserveCYn("N");//예약취소건은 제외하기
reserveKakaoVO.setUserId(reqMberManageVO.getMberId());
// 문자발송 완료건은 모두 보이도록 처리
//kakaoVO.setMsgType("8");
reserveKakaoVO.setSearchSortCnd("reqDate");
reserveKakaoVO.setSearchSortOrd("desc");
reserveKakaoVO.setFirstIndex(0);
reserveKakaoVO.setPageType("sand");
List<KakaoVO> kakaoReserveList = new ArrayList<KakaoVO>();
//kakaoReserveList = mjonKakaoATService.selectReserveMjonKakaoATGroupList(reserveKakaoVO);
/*250620 - 회원 정보 팝업 최근 알림톡/친구톡 전송 내역을 조회하는 임시 쿼리
* 기존 쿼리 성능으로 인하여 회원 정보 팝업 오픈 간헐적으로 에러 발생
* 임시 쿼리는 화면에 필요한 최소한의 정보만 조회하며, USER_ID를 제외한 조건은 하드코딩 처리
* DB 개선 작업 이후 알림톡/친구톡 관련 조회 공통 쿼리 생성 예정
* */
sendKakaoVO.setReserveYn("Y");
kakaoReserveList = mjonKakaoATService.selectMjonKakaoATGroupCompleteByUserListTemp(sendKakaoVO);
model.addAttribute("kakaoReserveList", kakaoReserveList); model.addAttribute("kakaoReserveList", kakaoReserveList);
/* /*
* 알림톡 지연처리 알림톡 내용 불러오기(30분 지연처리된 알림톡 내역 불러오기) * 알림톡 지연처리 알림톡 내용 불러오기(30분 지연처리된 알림톡 내역 불러오기)
*/ */

View File

@ -8689,6 +8689,112 @@
order by M.reqDate desc order by M.reqDate desc
</select> </select>
<select id="mjonMsgDAO.selectSendListByResultCode" parameterClass="mjonMsgVO" resultClass="mjonMsgVO">
SELECT
MMGD.USER_ID AS userId
, MMGD.MSG_GROUP_ID AS msgGroupId
, MMGD.MSG_TYPE AS msgType
, MMGD.REGDATE AS regDate
, MMGD.REQ_DATE AS reqDate
, MMGD.SMS_TXT AS smsTxt
, MMGD.MSG_GROUP_CNT AS msgGroupCnt
, MMGD.RESERVE_YN AS reserveYn
, MMGD.RESERVE_C_YN AS reserveCYn
, MMGD.CANCELDATE AS cancelDate
, MMGD.DELAY_YN AS delayYn
, MMGD.DELAY_COMPLETE_YN AS delayCompleteYn
, MMGD.AT_DELAY_YN AS atDelayYn
, MMGD.AT_DELAY_COMPLETE_YN AS atDelayCompleteYn
, MMD.waitCount AS waitCount
, MMD.successCount AS successCount
, MMD.failCount AS failCount
, MMD.kakaoResendWaitCount AS kakaoResendWaitCount
, MMD.kakaoResendSuccCount AS kakaoResendSuccCount
, MMD.kakaoResendFailCount AS kakaoResendFailCount
<isEqual property="yellowIdYn" compareValue="Y">
, MKPI.YELLOW_ID AS yellowId
</isEqual>
FROM
(
SELECT
USER_ID
, MSG_GROUP_ID
, MSG_TYPE
, REGDATE
, REQ_DATE
, SMS_TXT
, MSG_GROUP_CNT
, RESERVE_YN
, RESERVE_C_YN
, CANCELDATE
, DELAY_YN
, DELAY_COMPLETE_YN
, AT_DELAY_YN
, AT_DELAY_COMPLETE_YN
FROM
MJ_MSG_GROUP_DATA
WHERE 1=1
<isNotEmpty property="userId">
AND USER_ID = #userId#
</isNotEmpty>
<isNotEmpty property="msgType">
AND MSG_TYPE = #msgType#
</isNotEmpty>
<isNotEmpty property="msgTypeList">
AND MSG_TYPE IN
<iterate property="msgTypeList" open="(" close=")" conjunction=",">
#msgTypeList[]#
</iterate>
</isNotEmpty>
<isNotEmpty property="reserveYn">
AND RESERVE_YN = #reserveYn#
</isNotEmpty>
<isNotEmpty property="reserveCYn">
AND RESERVE_C_YN = #reserveCYn#
</isNotEmpty>
<isNotEmpty property="selectType">
<!-- 조회 타입 ex) last3M : 지난 3개월간 -->
<isEqual property="selectType" compareValue="reqDateLast3M">
and (REQ_DATE BETWEEN DATE_SUB(NOW(), INTERVAL 3 MONTH) AND NOW())
</isEqual>
<!-- 조회 타입 ex) next3M : 다음 3개월간 -->
<isEqual property="selectType" compareValue="reqDateNext3M">
AND (REQ_DATE BETWEEN NOW() AND DATE_ADD(NOW(), INTERVAL 3 MONTH))
</isEqual>
</isNotEmpty>
ORDER BY 1=1
<isNotEmpty property="searchSortCnd">
,$searchSortCnd$
</isNotEmpty>
<isNotEmpty property="searchSortOrd">
$searchSortOrd$
</isNotEmpty>
LIMIT #recordCountPerPage# OFFSET #firstIndex#
) MMGD
JOIN (
SELECT
MSG_GROUP_ID
, MSG_NOTICETALK_SENDER_KEY
, SUM(CASE WHEN MSG_RESULT = '00' THEN 1 ELSE 0 END) AS waitCount
, SUM(CASE WHEN MSG_RESULT = '10' THEN 1 ELSE 0 END) AS successCount
, SUM(CASE WHEN MSG_RESULT = '20' THEN 1 ELSE 0 END) AS failCount
, SUM(CASE WHEN MSG_RESULT = '30' THEN 1 ELSE 0 END) AS kakaoResendWaitCount
, SUM(CASE WHEN MSG_RESULT = '40' THEN 1 ELSE 0 END) AS kakaoResendSuccCount
, SUM(CASE WHEN MSG_RESULT = '50' THEN 1 ELSE 0 END) AS kakaoResendFailCount
FROM
MJ_MSG_DATA
GROUP BY
MSG_GROUP_ID
) MMD
ON MMGD.MSG_GROUP_ID = MMD.MSG_GROUP_ID
<isEqual property="yellowIdYn" compareValue="Y">
LEFT JOIN
MJ_KAKAO_PROFILE_INFO MKPI
ON MKPI.SENDER_KEY = MMD.MSG_NOTICETALK_SENDER_KEY
AND MKPI.USER_ID = MMGD.USER_ID
</isEqual>
</select>
</sqlMap> </sqlMap>

View File

@ -4728,7 +4728,6 @@ function fnInputSmsTxt(){
<c:choose> <c:choose>
<c:when test="${not empty kakaoResultList}"> <c:when test="${not empty kakaoResultList}">
<c:forEach var="kakaoResultList" items="${kakaoResultList}" varStatus="status"> <c:forEach var="kakaoResultList" items="${kakaoResultList}" varStatus="status">
<c:if test="${status.count < 4}">
<tr> <tr>
<td><c:out value="${status.count}"/></td> <td><c:out value="${status.count}"/></td>
<td> <td>
@ -4745,85 +4744,43 @@ function fnInputSmsTxt(){
</c:choose> </c:choose>
</td> </td>
<td> <td>
<c:choose>
<c:when test="${not empty kakaoResultList.regDate}">
<%-- ${fnc:setStrToDataFormatter(kakaoResultList.regDate, 'MM-dd HH:mm') } --%>
<fmt:parseDate value="${kakaoResultList.regDate}" var="dateValue" pattern="yyyy-MM-dd HH:mm:ss"/> <fmt:parseDate value="${kakaoResultList.regDate}" var="dateValue" pattern="yyyy-MM-dd HH:mm:ss"/>
<fmt:formatDate value="${dateValue}" pattern="MM-dd HH:mm"/> <fmt:formatDate value="${dateValue}" pattern="MM-dd HH:mm"/>
</c:when>
<c:otherwise>
-
</c:otherwise>
</c:choose>
</td> </td>
<td> <td>
<c:choose>
<c:when test="${not empty kakaoResultList.rsltDate}">
<c:if test="${kakaoResultList.reserveYn eq 'Y'}"> <c:if test="${kakaoResultList.reserveYn eq 'Y'}">
[예약]<br /> [예약]<br/>
</c:if> </c:if>
<fmt:parseDate value="${kakaoResultList.rsltDate}" var="dateValue" pattern="yyyy-MM-dd HH:mm:ss"/> <c:if test="${kakaoResultList.atDelayYn eq 'Y'
<fmt:formatDate value="${dateValue}" pattern="MM-dd HH:mm"/> and kakaoResultList.atDelayCompleteYn eq 'Y'
</c:when> and not empty kakaoResultList.cancelDate}">
<c:otherwise>
<c:choose>
<c:when test="${kakaoResultList.atDelayYn eq 'Y' && kakaoResultList.atDelayCompleteYn eq 'Y' && not empty kakaoResultList.cancelDate}">
<span style="color: red;"> <span style="color: red;">
[발송취소]<br /> [발송취소]
<c:if test="${kakaoResultList.reserveYn eq 'Y'}">
[예약]<br />
</c:if>
<fmt:parseDate value="${kakaoResultList.cancelDate}" var="cancelDateValue" pattern="yyyy-MM-dd HH:mm"/>
<fmt:formatDate value="${cancelDateValue}" pattern="MM-dd HH:mm"/>
</span> </span>
</c:when> </c:if>
<c:when test="${kakaoResultList.reserveCYn eq 'Y'}">
[예약취소]<br />
<fmt:parseDate value="${kakaoResultList.cancelDate}" var="dateValue" pattern="yyyy-MM-dd HH:mm:ss"/>
<fmt:formatDate value="${dateValue}" pattern="MM-dd HH:mm"/>
</c:when>
<c:when test="${kakaoResultList.reserveYn eq 'Y' && kakaoResultList.reserveCYn eq 'N'}">
[예약]<br />
<fmt:parseDate value="${kakaoResultList.reqDate}" var="dateValue" pattern="yyyy-MM-dd HH:mm:ss"/> <fmt:parseDate value="${kakaoResultList.reqDate}" var="dateValue" pattern="yyyy-MM-dd HH:mm:ss"/>
<fmt:formatDate value="${dateValue}" pattern="MM-dd HH:mm"/> <fmt:formatDate value="${dateValue}" pattern="MM-dd HH:mm"/>
</c:when>
<c:otherwise>
-
</c:otherwise>
</c:choose>
</c:otherwise>
</c:choose>
</td> </td>
<td><c:out value="${kakaoResultList.yellowId}"/></td> <td><c:out value="${kakaoResultList.yellowId}"/></td>
<td class="sms_detail" style="text-align: left;"> <td class="sms_detail" style="text-align: left;">
<c:choose>
<c:when test="${empty kakaoResultList.smsTxt}">
-
</c:when>
<c:otherwise>
<div class="ellipsis_line"> <div class="ellipsis_line">
<c:out value="${kakaoResultList.smsTxt}"/> <c:out value="${kakaoResultList.smsTxt}"/>
<div class="kakao_detail_hover"> <div class="kakao_detail_hover">
<c:out value="${kakaoResultList.smsTxt}"/> <c:out value="${kakaoResultList.smsTxt}"/>
</div> </div>
</div> </div>
</c:otherwise>
</c:choose>
</td> </td>
<td><fmt:formatNumber value="${kakaoResultList.msgGroupCnt}" type="number" /></td> <td><fmt:formatNumber value="${kakaoResultList.msgGroupCnt}" type="number" /></td>
<td><fmt:formatNumber value="${kakaoResultList.successCount}" type="number" /></td> <td><fmt:formatNumber value="${kakaoResultList.successCount}" type="number" /></td>
<td><fmt:formatNumber value="${kakaoResultList.kakaoResendSuccCount + kakaoResultList.kakaoResendFailCount}" type="number" /></td> <td><fmt:formatNumber value="${kakaoResultList.kakaoResendSuccCount + kakaoResultList.kakaoResendFailCount + kakaoResultList.kakaoResendWaitCount}" type="number" /></td>
<td><fmt:formatNumber value="${kakaoResultList.kakaoResendSuccCount}" type="number" /></td> <td><fmt:formatNumber value="${kakaoResultList.kakaoResendSuccCount}" type="number" /></td>
<td><fmt:formatNumber value="${(kakaoResultList.successCount / kakaoResultList.msgGroupCnt) * 100}" pattern="#,###" />%</td> <td><fmt:formatNumber value="${(kakaoResultList.successCount / kakaoResultList.msgGroupCnt) * 100}" pattern="#,###" />%</td>
</tr> </tr>
</c:if>
</c:forEach> </c:forEach>
</c:when> </c:when>
<c:otherwise> <c:otherwise>
<tr> <tr>
<td colspan="11">카카오톡 송 내역이 없습니다.</td> <td colspan="11">카카오톡 송 내역이 없습니다.</td>
</tr> </tr>
</c:otherwise> </c:otherwise>
</c:choose> </c:choose>
@ -4846,10 +4803,6 @@ function fnInputSmsTxt(){
<col style="width:15%;"> <col style="width:15%;">
<col style="width:auto;"> <col style="width:auto;">
<col style="width:8%;"> <col style="width:8%;">
<col style="width:8%;">
<col style="width:8%;">
<col style="width:8%;">
<col style="width:8%;">
</colgroup> </colgroup>
<thead> <thead>
<tr> <tr>
@ -4860,17 +4813,12 @@ function fnInputSmsTxt(){
<th>채널ID</th> <th>채널ID</th>
<th>내용</th> <th>내용</th>
<th>발송</th> <th>발송</th>
<th>성공</th>
<th>발송(대)</th>
<th>성공(대)</th>
<th>성공율</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
<c:choose> <c:choose>
<c:when test="${not empty kakaoReserveList}"> <c:when test="${not empty kakaoReserveList}">
<c:forEach var="kakaoReserveList" items="${kakaoReserveList}" varStatus="status"> <c:forEach var="kakaoReserveList" items="${kakaoReserveList}" varStatus="status">
<c:if test="${status.count < 4}">
<tr> <tr>
<td><c:out value="${status.count}"/></td> <td><c:out value="${status.count}"/></td>
<td> <td>
@ -4887,85 +4835,39 @@ function fnInputSmsTxt(){
</c:choose> </c:choose>
</td> </td>
<td> <td>
<c:choose>
<c:when test="${not empty kakaoReserveList.regDate}">
<%-- ${fnc:setStrToDataFormatter(kakaoReserveList.regDate, 'MM-dd HH:mm') } --%>
<fmt:parseDate value="${kakaoReserveList.regDate}" var="dateValue" pattern="yyyy-MM-dd HH:mm:ss"/> <fmt:parseDate value="${kakaoReserveList.regDate}" var="dateValue" pattern="yyyy-MM-dd HH:mm:ss"/>
<fmt:formatDate value="${dateValue}" pattern="MM-dd HH:mm"/> <fmt:formatDate value="${dateValue}" pattern="MM-dd HH:mm"/>
</c:when>
<c:otherwise>
-
</c:otherwise>
</c:choose>
</td> </td>
<td> <td>
<c:choose>
<c:when test="${not empty kakaoReserveList.rsltDate}">
<c:if test="${kakaoReserveList.reserveYn eq 'Y'}"> <c:if test="${kakaoReserveList.reserveYn eq 'Y'}">
[예약]<br /> [예약]<br/>
</c:if> </c:if>
<fmt:parseDate value="${kakaoReserveList.rsltDate}" var="dateValue" pattern="yyyy-MM-dd HH:mm:ss"/> <c:if test="${kakaoReserveList.atDelayYn eq 'Y'
<fmt:formatDate value="${dateValue}" pattern="MM-dd HH:mm"/> and kakaoReserveList.atDelayCompleteYn eq 'Y'
</c:when> and not empty kakaoReserveList.cancelDate}">
<c:otherwise>
<c:choose>
<c:when test="${kakaoReserveList.atDelayYn eq 'Y' && kakaoReserveList.atDelayCompleteYn eq 'Y' && not empty kakaoReserveList.cancelDate}">
<span style="color: red;"> <span style="color: red;">
[발송취소]<br /> [발송취소]
<c:if test="${kakaoReserveList.reserveYn eq 'Y'}">
[예약]<br />
</c:if>
<fmt:parseDate value="${kakaoReserveList.cancelDate}" var="cancelDateValue" pattern="yyyy-MM-dd HH:mm"/>
<fmt:formatDate value="${cancelDateValue}" pattern="MM-dd HH:mm"/>
</span> </span>
</c:when> </c:if>
<c:when test="${kakaoReserveList.reserveCYn eq 'Y'}">
[예약취소]<br />
<fmt:parseDate value="${kakaoReserveList.cancelDate}" var="dateValue" pattern="yyyy-MM-dd HH:mm:ss"/>
<fmt:formatDate value="${dateValue}" pattern="MM-dd HH:mm"/>
</c:when>
<c:when test="${kakaoReserveList.reserveYn eq 'Y' && kakaoReserveList.reserveCYn eq 'N'}">
[예약]<br />
<fmt:parseDate value="${kakaoReserveList.reqDate}" var="dateValue" pattern="yyyy-MM-dd HH:mm:ss"/> <fmt:parseDate value="${kakaoReserveList.reqDate}" var="dateValue" pattern="yyyy-MM-dd HH:mm:ss"/>
<fmt:formatDate value="${dateValue}" pattern="MM-dd HH:mm"/> <fmt:formatDate value="${dateValue}" pattern="MM-dd HH:mm"/>
</c:when>
<c:otherwise>
-
</c:otherwise>
</c:choose>
</c:otherwise>
</c:choose>
</td>
</td> </td>
<td><c:out value="${kakaoReserveList.yellowId}"/></td> <td><c:out value="${kakaoReserveList.yellowId}"/></td>
<td class="sms_detail" style="text-align: left;"> <td class="sms_detail" style="text-align: left;">
<c:choose>
<c:when test="${empty kakaoReserveList.smsTxt}">
-
</c:when>
<c:otherwise>
<div class="ellipsis_line"> <div class="ellipsis_line">
<c:out value="${kakaoReserveList.smsTxt}"/> <c:out value="${kakaoReserveList.smsTxt}"/>
<div class="kakao_detail_hover"> <div class="kakao_detail_hover">
<c:out value="${kakaoReserveList.smsTxt}"/> <c:out value="${kakaoReserveList.smsTxt}"/>
</div> </div>
</div> </div>
</c:otherwise>
</c:choose>
</td> </td>
<td><fmt:formatNumber value="${kakaoReserveList.msgGroupCnt}" type="number" /></td> <td><fmt:formatNumber value="${kakaoReserveList.msgGroupCnt}" type="number" /></td>
<td><fmt:formatNumber value="${kakaoReserveList.successCount}" type="number" /></td>
<td><fmt:formatNumber value="${kakaoReserveList.kakaoResendSuccCount + kakaoReserveList.kakaoResendFailCount}" type="number" /></td>
<td><fmt:formatNumber value="${kakaoReserveList.kakaoResendSuccCount}" type="number" /></td>
<td><fmt:formatNumber value="${(kakaoReserveList.successCount / kakaoReserveList.msgGroupCnt) * 100}" pattern="#,###" />%</td>
</tr> </tr>
</c:if>
</c:forEach> </c:forEach>
</c:when> </c:when>
<c:otherwise> <c:otherwise>
<tr> <tr>
<td colspan="11">카카오톡 발송 내역이 없습니다.</td> <td colspan="7">카카오톡 예약 내역이 없습니다.</td>
</tr> </tr>
</c:otherwise> </c:otherwise>
</c:choose> </c:choose>