Merge branch 'master' into 4891_발송결과_속도개선

This commit is contained in:
hehihoho3@gmail.com 2025-01-20 12:13:06 +09:00
commit 4353d4939f
25 changed files with 1183 additions and 80 deletions

View File

@ -5,6 +5,7 @@ import java.util.HashMap;
import java.util.Map;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.lang3.StringUtils;
import org.springframework.http.HttpStatus;
@ -158,7 +159,8 @@ public class CertPhoneController {
@RequestMapping(value = {"/cert/phone/sendSysMsgDataAjax.do"})
public ResponseEntity<StatusResponse> sendSysMsgDataAjax(MberCertPhoneVO mberCertPhoneVO) throws Exception {
public ResponseEntity<StatusResponse> sendSysMsgDataAjax(MberCertPhoneVO mberCertPhoneVO,
HttpServletRequest request) throws Exception {
//로그인 권한정보 불러오기
@ -178,7 +180,7 @@ public class CertPhoneController {
MjonMsgVO mjonMsgVO = new MjonMsgVO();
mjonMsgVO.setCallTo(mberCertPhoneVO.getMbtlnum());
MjonMsgReturnVO returnVO = mjonMsgDataService.sendSysMsgData(mjonMsgVO);
MjonMsgReturnVO returnVO = mjonMsgDataService.sendSysMsgData(mjonMsgVO, request);
String resultSts = returnVO.getSendMsgCnt();
String resultBlockSts = returnVO.getSendMsgBlockCnt();

View File

@ -140,6 +140,9 @@ public class KakaoAlimTalkSendController {
@Autowired
KakaoApiJsonSave kakaoApiJsonSave;
@Autowired
private MjonCommon mjonCommon;
@RequestMapping(value= {"/web/mjon/alimtalk/kakaoAlimtalkMsgDataView.do"})
public String KakaoAlimtalkMsgDataView(ModelMap model
@ -1385,8 +1388,7 @@ public class KakaoAlimTalkSendController {
if(!smishingAlarmPassSts) {//평일,주말, 공휴일 알림설정 시간에 포함되지 않는 경우 슬랙 알림 발송
MjonCommon comm = new MjonCommon();
comm.getAdminKakaoAtSandSlack(kakaoVO);
mjonCommon.getAdminKakaoAtSandSlack(kakaoVO);
}

View File

@ -63,16 +63,57 @@ public class MjonCommon {
/**
* @methodName : getAdminSandSlack
* @methodName : getAdminMsgSandSlack
* @author : 이호영
* @date : 2024.12.04
* @description : 기존 메소드 리펙토링
* @param mjonMsgVO
*/
public void getAdminSandSlack(MjonMsgVO mjonMsgVO) {
public void getAdminSandSlack(String smsTxt, String sandName) {
HttpClient client = new HttpClient();
PostMethod post = new PostMethod(SLACK_URL);
try {
// 메시지 내용 설정
// Slack 메시지 생성
JSONObject json = new JSONObject();
json.put("channel", SLACK_CHANNEL);
json.put("text", smsTxt);
json.put("username", sandName);
// Slack 요청
post.addParameter("payload", json.toString());
post.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
// Slack 응답 처리
int responseCode = client.executeMethod(post);
if (responseCode != HttpStatus.SC_OK) {
log.warn("Slack 메시지 전송 실패. Response: {}", post.getResponseBodyAsString());
}
} catch (IllegalArgumentException e) {
log.error("Slack 메시지 전송 중 IllegalArgumentException 발생", e);
} catch (IOException e) {
log.error("Slack 메시지 전송 중 IOException 발생", e);
} catch (Exception e) {
log.error("Slack 메시지 전송 중 Exception 발생", e);
} finally {
post.releaseConnection();
}
}
/**
* @methodName : getAdminMsgSandSlack
* @author : 이호영
* @date : 2024.12.04
* @description : 기존 메소드 리펙토링
* @param mjonMsgVO
*/
public void getAdminMsgSandSlack(MjonMsgVO mjonMsgVO) {
HttpClient client = new HttpClient();
PostMethod post = new PostMethod(SLACK_URL);
@ -116,7 +157,7 @@ public class MjonCommon {
* @작성자 : WYH
* @Method 설명 : slack 메시지 전송
*/
/*public void getAdminSandSlack(MjonMsgVO mjonMsgVO) {
/*public void getAdminMsgSandSlack(MjonMsgVO mjonMsgVO) {
HttpClient client = new HttpClient();
PostMethod post = new PostMethod(url);

View File

@ -30,6 +30,7 @@ import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
@ -185,6 +186,9 @@ public class MjonMsgCampainDataController {
@Resource(name = "MsgHolidayService")
private MsgHolidayService msgHolidayService;
@Autowired
private MjonCommon mjonCommon;
private static final Logger logger = LoggerFactory.getLogger(MjonMsgCampainDataController.class);
/**
@ -3288,9 +3292,11 @@ public class MjonMsgCampainDataController {
if(!smishingAlarmPassSts) {//평일,주말, 공휴일 알림설정 시간에 포함되지 않는 경우 슬랙 알림 발송
/*
MjonCommon comm = new MjonCommon();
comm.getAdminSandSlack(mjonMsgVO);
comm.getAdminMsgSandSlack(mjonMsgVO);
*/
mjonCommon.getAdminMsgSandSlack(mjonMsgVO);
}
}

View File

@ -12,6 +12,7 @@ import java.util.stream.Collectors;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
@ -150,6 +151,9 @@ public class MjonMsgCampainHGDataController {
@Resource(name = "MsgHolidayService")
private MsgHolidayService msgHolidayService;
@Autowired
private MjonCommon mjonCommon;
/**
* 선거 문자 대량 발송 화면
* @param searchVO
@ -1138,10 +1142,11 @@ public class MjonMsgCampainHGDataController {
boolean smishingAlarmPassSts = mjonHolidayApi.getHolidaySmishingPassStatus(resultAlarmList, resultHolidayList);
if(!smishingAlarmPassSts) {//평일,주말, 공휴일 알림설정 시간에 포함되지 않는 경우 슬랙 알림 발송
/*
MjonCommon comm = new MjonCommon();
comm.getAdminSandSlack(mjonMsgVO);
comm.getAdminMsgSandSlack(mjonMsgVO);
*/
mjonCommon.getAdminMsgSandSlack(mjonMsgVO);
}
}

View File

@ -29,6 +29,7 @@ import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
@ -174,6 +175,9 @@ public class MjonMsgCampainTWDataController {
@Resource(name = "MsgHolidayService")
private MsgHolidayService msgHolidayService;
@Autowired
private MjonCommon mjonCommon;
private static final Logger logger = LoggerFactory.getLogger(MjonMsgCampainTWDataController.class);
/**
@ -2122,10 +2126,11 @@ public class MjonMsgCampainTWDataController {
boolean smishingAlarmPassSts = mjonHolidayApi.getHolidaySmishingPassStatus(resultAlarmList, resultHolidayList);
if(!smishingAlarmPassSts) {//평일,주말, 공휴일 알림설정 시간에 포함되지 않는 경우 슬랙 알림 발송
/*
MjonCommon comm = new MjonCommon();
comm.getAdminSandSlack(mjonMsgVO);
comm.getAdminMsgSandSlack(mjonMsgVO);
*/
mjonCommon.getAdminMsgSandSlack(mjonMsgVO);
}
}

View File

@ -188,7 +188,7 @@ public interface MjonMsgDataService {
public StatusResponse sendMsgData_advc(MjonMsgVO mjonMsgVO, HttpServletRequest request) throws Exception;
public MjonMsgReturnVO sendSysMsgData(MjonMsgVO mjonMsgVO) throws Exception;
public MjonMsgReturnVO sendSysMsgData(MjonMsgVO mjonMsgVO, HttpServletRequest request) throws Exception;

View File

@ -2,6 +2,7 @@ package itn.let.mjo.msgdata.service.impl;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.net.URI;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
@ -147,6 +148,7 @@ public class MjonMsgDataServiceImpl extends EgovAbstractServiceImpl implements M
@Autowired
private MjonCommon mjonCommon;
public List<MjonMsgDataVO> selectCcmCmmCodeList() throws Exception {
@ -4172,7 +4174,7 @@ public class MjonMsgDataServiceImpl extends EgovAbstractServiceImpl implements M
if (isNotified) {
System.out.println("스미싱 알림이 처리되었습니다.");
mjonCommon.getAdminSandSlack(mjonMsgVO);
mjonCommon.getAdminMsgSandSlack(mjonMsgVO);
} else if("Y".equalsIgnoreCase(mjonMsgVO.getSpamStatus())){
System.out.println("==알림 예외 시간==");
mjonMsgDAO.insertSpamPassMsgData(mjonMsgVO);
@ -5022,7 +5024,7 @@ public class MjonMsgDataServiceImpl extends EgovAbstractServiceImpl implements M
}
@Override
public MjonMsgReturnVO sendSysMsgData(MjonMsgVO mjonMsgVO) throws Exception {
public MjonMsgReturnVO sendSysMsgData(MjonMsgVO mjonMsgVO,HttpServletRequest request) throws Exception {
@ -5099,6 +5101,22 @@ public class MjonMsgDataServiceImpl extends EgovAbstractServiceImpl implements M
mjonMsgDataService.insertSysMsgLog(sendLogVO);
String fullUrl = request.getRequestURL().toString();
try {
URI uri = new URI(fullUrl);
String domain = uri.getHost(); // www.munjaon.co.kr 반환
if(domain.indexOf("munjaon.co.kr") < 0) {
mjonCommon.getAdminSandSlack(contents, "로그인 인증번호 "+mjonMsgVO.getCallTo());
}
} catch (Exception e) {
}
return returnVO;
}

View File

@ -40,6 +40,7 @@ import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
@ -193,6 +194,9 @@ public class MjonMsgDataController {
@Resource(name = "MsgHolidayService")
private MsgHolidayService msgHolidayService;
@Autowired
private MjonCommon mjonCommon;
private static final Logger logger = LoggerFactory.getLogger(MjonMsgDataController.class);
/**
@ -3447,10 +3451,11 @@ public class MjonMsgDataController {
boolean smishingAlarmPassSts = mjonHolidayApi.getHolidaySmishingPassStatus(resultAlarmList, resultHolidayList);
if(!smishingAlarmPassSts) {//평일,주말, 공휴일 알림 예외설정 시간에 포함되지 않는 경우 슬랙 알림 발송
/*
MjonCommon comm = new MjonCommon();
comm.getAdminSandSlack(mjonMsgVO);
comm.getAdminMsgSandSlack(mjonMsgVO);
*/
mjonCommon.getAdminMsgSandSlack(mjonMsgVO);
}
}

View File

@ -242,6 +242,9 @@ public class TestController {
@Resource(name="MjonMsgDataDAO")
private MjonMsgDataDAO mjonMsgDataDAO;
@Autowired
private MjonCommon mjonCommon;
private static final Logger logger = LoggerFactory.getLogger(TestController.class);
/////////////////////////////////////////////////////////////////////////////////////////
@ -2173,16 +2176,17 @@ public class TestController {
boolean smishingAlarmPassSts = mjonHolidayApi.getHolidaySmishingPassStatus(resultAlarmList, resultHolidayList);
if(!smishingAlarmPassSts) {//평일,주말, 공휴일 알림설정 시간에 포함되지 않는 경우 슬랙 알림 발송
/*
MjonCommon comm = new MjonCommon();
comm.getAdminSandSlack(mjonMsgVO);
comm.getAdminMsgSandSlack(mjonMsgVO);
*/
mjonCommon.getAdminMsgSandSlack(mjonMsgVO);
}
//Slack으로 메세지 전송 처리
/*MjonCommon comm = new MjonCommon();
System.out.println("slack noti");
comm.getAdminSandSlack(mjonMsgVO);*/
comm.getAdminMsgSandSlack(mjonMsgVO);*/
}
}
/*else {//야간스미싱 알림 비활성화인 경우 - 알림일정에 포함되지 않으면 슬랙 발송 처리(알림일정에 포함되면 슬랙발송 X - 알림 비활성화이기 때문에 발송X)
@ -2211,7 +2215,7 @@ public class TestController {
if(!smishingAlarmPassSts) {//평일,주말, 공휴일 알림설정 시간에 포함되지 않는 경우 슬랙 알림 발송
MjonCommon comm = new MjonCommon();
comm.getAdminSandSlack(mjonMsgVO);
comm.getAdminMsgSandSlack(mjonMsgVO);
}

View File

@ -3632,7 +3632,7 @@ public class EgovLoginController {
*/
@RequestMapping(value = { "/web/user/sendSysMsgDataAjax.do" })
public ModelAndView sendSysMsgDataAjax(@ModelAttribute("searchVO") MjonMsgVO mjonMsgVO,
RedirectAttributes redirectAttributes, ModelMap model) throws Exception {
RedirectAttributes redirectAttributes, ModelMap model, HttpServletRequest request) throws Exception {
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("jsonView");
@ -3710,7 +3710,7 @@ public class EgovLoginController {
MjonMsgReturnVO returnVO = mjonMsgDataService.sendSysMsgData(mjonMsgVO);
MjonMsgReturnVO returnVO = mjonMsgDataService.sendSysMsgData(mjonMsgVO, request);
resultSts = returnVO.getSendMsgCnt();
resultBlockSts = returnVO.getSendMsgBlockCnt();

View File

@ -1225,9 +1225,6 @@ public class EgovUserManageController {
vo.setCodeId("ITN024");
model.addAttribute("flowTypeCode", cmmUseService.selectCmmCodeDetail(vo));
vo.setCodeId("ITN056");
model.addAttribute("smsSandCode", cmmUseService.selectCmmCodeDetail(vo));
//최근 발송 문자 내용 불러오기 - 최근 3개 내역만
List<MjonMsgSentVO> mjonMsgSentList = mberManageService.selectMberMsgSentLatestListNew20240320(userId);

View File

@ -21,6 +21,7 @@
<%@ taglib prefix="validator" uri="http://www.springmodules.org/tags/commons-validator" %>
<%@ taglib prefix="double-submit" uri="http://www.egovframe.go.kr/tags/double-submit/jsp" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="ec" uri="/WEB-INF/tld/ecnet_tld.tld"%>
<% pageContext.setAttribute("newLineChar", "\r\n"); %>
<% pageContext.setAttribute("newLineChar2", "\n"); %>
<% String serverName = request.getServerName(); %>
@ -6075,13 +6076,15 @@ function fnInputSmsTxt(){
<li><input type="radio" name="msgKind" id="msgKind3" value="C"/><label for="msgKind3">선거</label></li>
</ul> --%>
<input type="hidden" name="msgKind" id="msgKind" value="N"/>
<select id="inputSmsTxt" onchange="fnInputSmsTxt();">
<ec:select codeId="ITN056" id="inputSmsTxt" script="onchange='fnInputSmsTxt();'"
defaultValue="" defaultText="직접입력" />
<%-- <select id="inputSmsTxt" onchange="fnInputSmsTxt();">
<c:forEach var="result" items="${smsSandCode}" varStatus="status">
<option value="${result.code}">
<c:out value="${result.codeNm}"/>
</option>
</c:forEach>
</select>
</select> --%>
<textarea name="smsTxt" id="smsTxt"></textarea>
<span class="fwMd" id="msgLeng">0 /</span>
<span id="limitLeng">90</span>byte

View File

@ -516,7 +516,7 @@ $(document).ready(function(){
var updatedData = currentData.map(row => {
var newRow = {};
fieldMapping.forEach((field, index) => {
newRow[field] = row[Object.keys(row)[index]] || "";
newRow[field] = row[Object.keys(row)[index]] ?? "";
});
return newRow;
});

View File

@ -501,7 +501,7 @@ function updateTableFields($objTabul) {
var updatedData = currentData.map(row => {
var newRow = {};
fieldMapping.forEach((field, index) => {
newRow[field] = row[Object.keys(row)[index]] || "";
newRow[field] = row[Object.keys(row)[index]] ?? "";
});
return newRow;
});

View File

@ -14,10 +14,40 @@ var msgResendAllFlag = "${msgResendAllFlag}";
var msgResendAllGroupId = "${msgResendAllGroupId}";
var msgResendAllReplaceYn = "${msgResendAllReplaceYn}";
//맞춤제작 내보관함 이미지 선택시 처리
var customImgFlag = '${customImgVO.customImgFlag}';
var customAtchFileId = '${customImgVO.atchFileId1}';
var customFileSn = '${customImgVO.fileSn}';
var customStrImgPath = '${customImgVO.strImgPath}';
//메인화면 그림문자 이미지 선택시 처리
var mainImgFlag = '${mainImgVO.mainImgFlag}';
var mainAtchFileId = '${mainImgVO.atchFileId1}';
var mainFileSn = '${mainImgVO.fileSn}';
var mainStrImgPath = '${mainImgVO.strImgPath}';
//메인화면 인기문자 메세지 선택시 처리
var mainLetterFlag = '${mainLetterVO.mainLetterFlag}';
var mainSmsTxt = '${mainLetterVO.smsTxt}';
//공통 설정
var cateNo = "${cateCodeVO.cateNo}";
var mainLetterTypeFlag = '${searchVO.mainLetterTypeFlag}';
var moreSamFlag = '${moreSampleYn}';
//문자 재전송 처리
var msgResendFlag = '${reSendMsgVO.msgResendFlag}';
var msgSeqList = [];
msgSeqList = '${reSendMsgVO.msgSeqList}';
//주소록에서 주소를 전송한 경우 처리
var moveAddrFlag = '${addrVO.moveAddrFlag}';
var addrIdList = [];
addrIdList = '${addrVO.addrIdList}';
$(document).ready(function(){
console.log('loginVO : ', loginVO);
// 내보관함 리스트 로그인이 완료된 경우에만 로드되도록
if(loginVO != "" && loginVO != null){
//최 하단 내문자함 탭 리스트 내용 불러오기

View File

@ -554,9 +554,10 @@ function updateTableFields($objTabul) {
});
var updatedData = currentData.map(row => {
console.log('row : ', row);
var newRow = {};
fieldMapping.forEach((field, index) => {
newRow[field] = row[Object.keys(row)[index]] || "";
newRow[field] = row[Object.keys(row)[index]] ?? "";
});
return newRow;
});

View File

@ -303,7 +303,9 @@ $(document).ready(function(){
var updatedData = currentData.map(row => {
var newRow = {};
fieldMapping.forEach((field, index) => {
newRow[field] = row[Object.keys(row)[index]] || "";
newRow[field] = row[Object.keys(row)[index]] !== null && row[Object.keys(row)[index]] !== undefined
? row[Object.keys(row)[index]]
: "";
});
return newRow;
});

View File

@ -367,7 +367,9 @@ function updateTableFields(objTabul) {
var updatedData = currentData.map(row => {
var newRow = {};
fieldMapping.forEach((field, index) => {
newRow[field] = row[Object.keys(row)[index]] || "";
newRow[field] = row[Object.keys(row)[index]] !== null && row[Object.keys(row)[index]] !== undefined
? row[Object.keys(row)[index]]
: "";
});
return newRow;
});

View File

@ -364,7 +364,9 @@ $(document).ready(function(){
var updatedData = currentData.map(row => {
var newRow = {};
fieldMapping.forEach((field, index) => {
newRow[field] = row[Object.keys(row)[index]] || "";
newRow[field] = row[Object.keys(row)[index]] !== null && row[Object.keys(row)[index]] !== undefined
? row[Object.keys(row)[index]]
: "";
});
return newRow;
});

View File

@ -225,20 +225,16 @@ function listMsgDataView(){
$('html').animate({scrollTop : offset.top}, 400);
}
}
//메인화면 더많은 샘플보기 버튼 선택시 처리
var moreSamFlag = '${moreSampleYn}';
if(moreSamFlag == 'Y'){
//문자 샘플 탭 활성화 시키기
var mainLetterTypeFlag = '${searchVO.mainLetterTypeFlag}';
// var mainLetterTypeFlag = '${searchVO.mainLetterTypeFlag}';
var letterTab = '0';
var cateNo = "${cateCodeVO.cateNo}";
// var cateNo = "${cateCodeVO.cateNo}";
if(mainLetterTypeFlag == 'P'){
TabType2($('.tabType2 li').eq(1), '2');
}else{
@ -278,10 +274,12 @@ function listMsgDataView(){
//메인화면 그림문자 이미지 선택시 처리
var mainImgFlag = '${mainImgVO.mainImgFlag}';
console.log('메인화면 그림문자 이미지 선택시 처리');
console.log('mainImgFlag : ' + mainImgFlag);
// var mainImgFlag = '${mainImgVO.mainImgFlag}';
if(mainImgFlag == 'Y'){
//카테고리 처리
var cateNo = "${cateCodeVO.cateNo}";
// var cateNo = "${cateCodeVO.cateNo}";
$('.tDep2_cateCode').find('.on').removeClass('on');
$('.tDep2_cateCode a').each(function(index){
if($(this).attr('value') == cateNo){
@ -289,72 +287,84 @@ function listMsgDataView(){
}
})
var atchFileId = '${mainImgVO.atchFileId1}';
var fileSn = '${mainImgVO.fileSn}';
var strImgPath = '${mainImgVO.strImgPath}';
fnCustomImgSendMsg(atchFileId, fileSn, strImgPath);
// var atchFileId = '${mainImgVO.atchFileId1}';
// var fileSn = '${mainImgVO.fileSn}';
// var strImgPath = '${mainImgVO.strImgPath}';
console.log('mainAtchFileId : ' + mainAtchFileId
+ ' / mainFileSn : ' + mainFileSn
+ ' / mainStrImgPath : ' + mainStrImgPath
);
fnCustomImgSendMsg(mainAtchFileId, mainFileSn, mainStrImgPath);
}
//메인화면 인기문자 메세지 선택시 처리
var mainLetterFlag = '${mainLetterVO.mainLetterFlag}';
console.log('메인화면 인기문자 메세지 선택시 처리');
console.log('mainLetterFlag : ' + mainLetterFlag);
// var mainLetterFlag = '${mainLetterVO.mainLetterFlag}';
if(mainLetterFlag == 'Y'){
var letterTab = '0';
//문자샘플 활성화 처리
TabType2($('.tabType2 li').eq(0), '1');
//단문,장문 탭 활성화 처리
var mainLetterTypeFlag = '${searchVO.mainLetterTypeFlag}';
// var mainLetterTypeFlag = '${searchVO.mainLetterTypeFlag}';
if(mainLetterTypeFlag == 'L'){
$('.tDep1_letType a').removeClass('on');
$('.tDep1_letType a').eq(1).addClass('on');
}
//카테고리 활성화 처리
var cateNo = "${cateCodeVO.cateNo}";
// var cateNo = "${cateCodeVO.cateNo}";
$('.tDep1_cateCode').find('.on').removeClass('on');
$('.tDep1_cateCode a').each(function(index){
if($(this).attr('value') == cateNo){
$(this).addClass('on');
}
})
var smsTxt = '${mainLetterVO.smsTxt}';
if(smsTxt != null){
// var smsTxt = '${mainLetterVO.smsTxt}';
if(mainSmsTxt != null){
smsTxt = smsTxt.replaceAll("<br/>", "\n"); //줄발꿈문자 변환하기
$("#smsTxtArea").val(smsTxt);
fnByteString(smsTxt);
mainSmsTxt = mainSmsTxt.replaceAll("<br/>", "\n"); //줄발꿈문자 변환하기
$("#smsTxtArea").val(mainSmsTxt);
fnByteString(mainSmsTxt);
}
}
//맞춤제작 내보관함 이미지 선택시 처리
var customImgFlag = '${customImgVO.customImgFlag}';
// 맞춤제작 내보관함 이미지 선택시 처리
console.log('커스텀 문자정보');
console.log('customImgFlag : ' + customImgFlag);
// var customImgFlag = '${customImgVO.customImgFlag}';
if(customImgFlag == 'Y'){
var atchFileId = '${customImgVO.atchFileId1}';
var fileSn = '${customImgVO.fileSn}';
var strImgPath = '${customImgVO.strImgPath}';
fnCustomImgSendMsg(atchFileId, fileSn, strImgPath);
//var atchFileId = '${customImgVO.atchFileId1}';
//var fileSn = '${customImgVO.fileSn}';
//var strImgPath = '${customImgVO.strImgPath}';
console.log(' customAtchFileId : ' + customAtchFileId
+ ' / customFileSn : ' + customFileSn
+ ' / customStrImgPath : ' + customStrImgPath
);
fnCustomImgSendMsg(customAtchFileId, customFileSn, customStrImgPath);
}
//문자 재전송 처리
var msgResendFlag = '${reSendMsgVO.msgResendFlag}';
var msgSeqList = [];
msgSeqList = '${reSendMsgVO.msgSeqList}';
console.log('문자 재전송 처리');
// var msgResendFlag = '${reSendMsgVO.msgResendFlag}';
// var msgSeqList = [];
// msgSeqList = '${reSendMsgVO.msgSeqList}';
if(msgSeqList.length > 0){
console.log('msgSeqList.length : ' + msgSeqList.length);
fnMsgResend(msgResendFlag, msgSeqList);
}
//주소록에서 주소를 전송한 경우 처리
var moveAddrFlag = '${addrVO.moveAddrFlag}';
var addrIdList = [];
addrIdList = '${addrVO.addrIdList}';
// var moveAddrFlag = '${addrVO.moveAddrFlag}';
// var addrIdList = [];
// addrIdList = '${addrVO.addrIdList}';
console.log('주소록에서 주소를 전송한 경우 처리');
if(addrIdList.length > 0) {
fnAddrSet(moveAddrFlag, addrIdList);
}
@ -377,7 +387,6 @@ function listMsgDataView(){
function fnCustomImgSendMsg(atchFileId, fileSn, filePath){
var imgId = "";
var imgSrc = "";

View File

@ -2353,6 +2353,18 @@ button.check_validity:hover {border: 1px solid #a3a3a3;box-shadow: 0px 0px 5px
.spam_content .spam_conbox .spam_table tbody tr td{text-align: left;}
.spam_content .spam_conbox .spam_table tbody tr td li .conlist8{padding: 0 0 0 18px;}
/*발송결과 수정_2025*/
.price_wrap .table_tab_wrap .tab_btnbox .price_hover{width: 330px;}
.price_wrap .table_tab_wrap .tab_btnbox .price_hover .last{padding: 5px 0 0 0;}
.price_wrap .current .tb_wrap .tType4 tbody tr .result_cont a{height: 16px;}
.price_wrap .current .tb_wrap .tType4 tbody tr .result_cont a:hover{text-decoration: underline;}
.price_wrap .current .tb_wrap .tType4 tbody tr .result_cont .icon_wrap{display: flex; align-items: center;}
.price_wrap .current .tb_wrap .tType4 tbody tr .result_cont .icon_wrap span{padding: 5px 8px; margin: 0 3px; border-radius: 20px; font-size: 14px;}
.price_wrap .current .tb_wrap .tType4 tbody tr .result_cont .icon_wrap .re{background-color: #e8f0ff; color: #2c5dd6;}
.price_wrap .current .tb_wrap .tType4 tbody tr .result_cont .icon_wrap .di{background-color: #e7f5ec; color: #359b59;}
@keyframes rotate-loading {
0% {transform:rotate(0)}
100% {transform:rotate(360deg);}

View File

@ -1234,6 +1234,14 @@
.adr_layer.adr_popup14 .cf_text_ul li{font-size:14px;color:#666;margin:0 0 5px 0;}
.adr_layer.adr_popup14 .cf_text_ul li:last-child{margin:0;}
/* 주소록 대량등록 팝업 헤더 수정 */
.tabulator .tabulator-header .tabulator-col.tabulator-sortable[aria-sort=ascending] .tabulator-col-content .tabulator-col-sorter{z-index: 1;}
.tabulator .tabulator-header .tabulator-col.tabulator-sortable[aria-sort=descending] .tabulator-col-content .tabulator-col-sorter{z-index: 1;}
.tabulator .tabulator-header .tabulator-col.tabulator-sortable[aria-sort=none] .tabulator-col-content .tabulator-col-sorter{z-index: 1;}
.tabulator .tabulator-header .tabulator-col::after{position: absolute; content: " "; width: 100%; height: 14px; background-color: #e5e5e5; bottom: 0; left: 0; z-index: 0;}
.tabulator .tabulator-header .tabulator-col .tabulator-col-content{background-color: #ededed;}
.tabulator .tabulator-header .tabulator-col .tabulator-col-content .tabulator-col-title-holder .tabulator-col-title{position: relative; z-index: 1;}
/* ie */

View File

@ -18,6 +18,7 @@
<!-- <p>***<span class="font1"> (컨텐츠)</span> : 반복적으로 사용 안함</p>
<p>***<span class="font2"> (보드)</span> : 반복적으로 사용</p> -->
<ul class="page">
<li><a href="/publish/textingmsg_2025_list.html">textingmsg_2025_list.html</a>[개선] 발송결과 수정</li>
<li><a href="/publish/service3_spam_2024.html">service3_spam_2024.html</a>불법스팸방지정책 (2024.11.29)</li>
<li><a href="/publish/service1_2024.html">service1_2024.html</a>이용약관 (2024.11.29)</li>
<li><a href="/publish/service1_2023.html">service1_2023.html</a>이용약관 (2023.04.26~2024.11.28)</li>

View File

@ -0,0 +1,948 @@
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>문자온_발송결과</title>
<link href="https://fonts.googleapis.com/css2?family=Noto+Sans+KR:wght@100;300;400;500;700;900&display=swap"
rel="stylesheet">
<link rel="stylesheet" href="/publish/css/reset.css">
<link rel="stylesheet" href="/publish/css/jquery.mCustomScrollbar.css">
<link rel="stylesheet" href="/publish/css/common.css">
<link rel="stylesheet" href="/publish/css/button.css">
<link rel="stylesheet" href="/publish/css/content.css">
<link rel="stylesheet" href="/publish/css/mem.css">
<link rel="stylesheet" href="/publish/css/font.css">
<link rel="stylesheet" href="/publish/css/popupLayer.css">
<link rel="stylesheet" href="/publish/js/datepicker/classic.css">
<link rel="stylesheet" href="/publish/js/datepicker/classic.date.css">
<script src="/publish/js/jquery-3.5.0.js"></script>
<script src="/publish/js/jquery.mCustomScrollbar.concat.min.js"></script>
<script src="/publish/js/common.js"></script>
<script src="/publish/js/content.js"></script>
<script src="/publish/js/popupLayer.js"></script>
<script type="text/javascript" src="/publish/js/datepicker/picker.js"></script>
<script type="text/javascript" src="/publish/js/datepicker/picker.date.js"></script>
<script type="text/javascript" src="/publish/js/datepicker/ko_KR.js"></script>
<script>
$(document).ready(function () {
$(".table_tab_wrap .tab_depth1 a").click(function () {
var tab_num = $(this).index();
$(".table_cont .tb_wrap").eq(tab_num).show();
$(".table_cont .tb_wrap").eq(tab_num).siblings(".tb_wrap").hide();
if($(".table_tab_wrap .tab_depth1 a:visible").length == tab_num+1){
$(this).css("border-radius","0 5px 5px 0");
}else{}
})
});
</script>
</head>
<body>
<div class="mask"></div>
<!-- skip 메뉴 -->
<div class="skip_menu">
<a href="#cont" title="본문 바로가기" class="contGo">본문 바로가기</a>
</div>
<!--// skip 메뉴 -->
<!-- quick 메뉴 -->
<div class="quickMenu">
<div>
<p class="quick_title">QUICK<br>MENU</p>
<p class="quick_title2">QUICK</p>
<ul class="quickMenuIn">
<li>
<a href="/publish/index.html"><i class="quick1"></i><span>이용안내</span></a>
<div class="hover_cont">이용안내</div>
</li>
<li>
<a href="#"><i class="quick2"></i><span>채팅상담</span></a>
<div class="hover_cont">채팅상담</div>
</li>
<li>
<a href="#"><i class="quick3"></i><span>원격지원</span></a>
<div class="hover_cont">원격지원</div>
</li>
<li>
<a href="#"><i class="quick4"></i><span>맞춤제작</span></a>
<div class="hover_cont">맞춤제작</div>
</li>
<li>
<a href="#"><i class="quick5"></i><span>주소록 등록</span></a>
<div class="hover_cont">주소록 등록</div>
</li>
<li>
<a href="#"><i class="quick6"></i><span>엑셀 전송</span></a>
<div class="hover_cont">엑셀 대량전송</div>
</li>
<li>
<a href="#"><i class="quick7"></i><span>견적서</span></a>
<div class="hover_cont">견적서</div>
</li>
<li>
<a href="#"><i class="quick8"></i><span>결제</span></a>
<div class="hover_cont">결제</div>
</li>
<li>
<a href="#"><i class="quick9"></i><span>영수증/계산서</span></a>
<div class="hover_cont">영수증/계산서</div>
</li>
</ul>
<button type="button" class="goTop" title="맨 위로 이동">TOP<i></i></button>
</div>
</div>
<!--// quick 메뉴 -->
<!-- header 영역 -->
<header id="header" class="header">
<!-- header top 영역 -->
<div class="header_top">
<div class="inner">
<ul class="menu_left">
<li><a href="#"><i class="hdTop_fav"></i>즐겨찾기추가</a></li>
<li><a href="#"><i class="hdTop_mypage"></i>마이페이지</a></li>
<li><a href="#"><i class="hdTop_center"></i>고객센터</a></li>
</ul>
<ul class="menu_right">
<li><a href="#">충전하기</a></li>
<li class="SortLine"><a href="#">요금안내</a></li>
<li class="SortLine"><a href="#">이용안내</a></li>
<li class="SortLine"><a href="#">1:1고객상담</a></li>
</ul>
</div>
</div><!-- header top 영역 -->
<!-- header body 영역 -->
<div class="header_body">
<div class="inner table">
<h1 class="logo"><a href="/publish/index.html" alt="문자온 메인 바로가기"><img src="/publish/images/CI.png"
alt="문자온 CI"></a></h1>
<ul class="gnbWrap table_cell">
<li><a href="#">문자발송</a></li>
<li><a href="#">선거문자</a></li>
<li><a href="#">맞춤제작</a></li>
<li><a href="#">비즈톡</a></li>
<li><a href="#">주소록 관리</a></li>
<li><a href="#">발송결과</a></li>
<li><a href="#">예약관리</a></li>
<li><a href="#">결제내역</a></li>
</ul>
<div class="s_menu">
<i class="allSearch_info"><span>문자검색</span></i>
<button type="button" title="전체검색" class="allSearch" onclick="searchToggle();"><img
src="/publish/images/search.png" alt="검색영역 열기" class="allMenu"></button>
<button type="button" title="전체메뉴"><img src="/publish/images/all_menu.png" alt="전체메뉴 열기"></button>
</div>
</div>
<!-- search popup 영역 -->
<div class="pop_search">
<div class="inner">
<div class="area_search">
<select name="" id="">
<option value="">그림문자</option>
<option value="">단문문자</option>
<option value="">장문문자</option>
<option value="">GIF</option>
</select>
<input type="text" placeholder="문자샘플 검색하기">
<button><img src="/publish/images/search02.png" alt=""></button>
</div>
<div class="area_popular">
<p><i></i>인기검색어</p>
<ul class="popular_tag">
<li><a href="#">#정월대보름</a></li>
<li class="on"><a href="#">#추석</a></li>
<li><a href="#">#가을인사</a></li>
<li><a href="#">#좋은하루</a></li>
</ul>
</div>
<button class="btn_close" onclick="searchToggle();"><img src="/publish/images/btn_searchclose.png"
alt=""></button>
</div>
</div>
<!--// search popup 영역 -->
</div>
<!--// header body 영역 -->
<div id="login" class="login">
<div class="inner table">
<div class="login_left table_cell">
<div class="login_put">
<label for="id_text" class="label"></label>
<input type="text" placeholder="아이디를 입력해주세요" id="id_text" class="id_text" maxlength="30"
size="18">
<label for="password_text" class="label"></label>
<input type="password" placeholder="비밀번호를 입력해주세요" id="password_text" class="password_text"
maxlength="30" size="18">
<label for="login_button" class="label"></label>
<button type="submit" class="btnType btnType1" class="login_button">로그인</button>
</div>
<div class="login_save">
<input type="checkbox" id="save_id">
<label for="save_id">아이디 저장</label>
</div>
<div class="login_find">
<a href="#">아이디찾기 /</a>
<a href="#">비밀번호 찾기</a>
</div>
<div>
<button type="button" class="btnType btnType2">회원가입</button>
<button type="button" class="btnType btnType3">둘러보기</button>
</div>
</div>
<div class="login_right">
<span><i></i>이달의 이벤트</span>
<button type="button" class="btnType btnType4">바로가기</button>
</div>
</div>
</div>
<!--// login 영역 -->
</header>
<!--// header 영역 -->
<!-- login 영역 -->
<!-- content 영역 -->
<div id="container" class="cont sub">
<div class="inner">
<!-- send top -->
<div class="send_top">
<!-- 발송결과 화면 -->
<div class="rev_admin_cont serv_content current">
<div class="heading">
<h2>발송결과</h2>
</div>
<div class="pay_tab_wrap">
<!-- tab button -->
<ul class="tabType1">
<li class="tab active"><button type="button" onclick="TabType5(this,'1');return false;">문자</button>
</li>
<li class="tab "><button type="button"
onclick="TabType5(this,'2');return false;">카카오톡</button></li>
</ul>
<!--// tab button -->
</div>
<div class="rev_content" id="tab5_1">
<!-- 발송결과 개선 : 문구추가 -->
<div class="titBox_result">
<p>- 최대 3개월간의 발송내역만 확인하실 수 있습니다.</p>
<p>- 전송내역이 필요한 경우 기간 내에 다운로드하여 주시기 바랍니다.</p>
<p>- 단문문자는 최대 24시간, 장문 및 그림문자는 최대 72시간까지 결과값이 수신되지 않은 경우 실패(비과금) 처리됩니다.</p>
</div>
<!--// 발송결과 개선 : 문구추가 -->
<div class="excel_middle">
<div class="select_btnWrap clearfix">
<div class="btn_left">
<span class="cal_label">기간선택</span>
<div class="calendar_wrap">
<input type="text" class="startDate inp calendar picker__input" title="검색 시작일"
id="startDate" name="startDate" value="" data-datecontrol="true" readonly=""
aria-haspopup="true" aria-expanded="false" aria-readonly="false"
aria-owns="startDate_root">
<span class="dateEtc">~</span>
<input type="text" class="endDate inp calendar picker__input" title="검색 종료일"
id="endDate" name="endDate" value="" data-datecontrol="true" readonly=""
aria-haspopup="true" aria-expanded="false" aria-readonly="false"
aria-owns="endDate_root">
</div>
<button type="button">전월</button>
<button type="button">당월</button>
<button type="button">3개월</button>
<button type="button" class="btnType6">조회</button>
</div>
<div class="btn_right">
<label for="" class="label">발송방식 전체 선택</label>
<select name="" id="" class="selType2 select_all_btn">
<option value="">발송방식 전체</option>
<option value="">WEB</option>
<option value="">API</option>
</select>
<label for="" class="label">발신번호 선택</label>
<select name="" id="" class="selType2 select_btn">
<option value="">발신번호</option>
<option value="">문자내용</option>
</select>
<div class="search">
<label for="id" class="label"></label>
<input class="send_text" type="text" id="id" placeholder="검색어를 입력하세요." onfocus="this.placeholder=''" onblur="this.placeholder='검색어를 입력하세요.'">
<button type="button" class="btnType btnType2">검색</button>
</div>
</div>
</div>
</div>
<div class="rev_admin ">
<div class="rev_admin_in">
<div class="rev_admin_top clearfix">
<p>전체</p>
<p><span>134</span></p>
</div>
<div class="rev_admin_btm">
<dl>
<dt>대기</dt>
<dd><span class="c_002c9a">3</span></dd>
</dl>
<dl>
<dt>성공</dt>
<dd><span class="c_002c9a">115</span></dd>
</dl>
<dl>
<dt>실패</dt>
<dd><span class="c_e40000">16</span></dd>
</dl>
</div>
</div>
<div class="rev_admin_in">
<div class="rev_admin_top clearfix">
<p>단문(SMS)</p>
<p><span>78</span></p>
</div>
<div class="rev_admin_btm">
<dl>
<dt>대기</dt>
<dd><span class="c_002c9a">0</span></dd>
</dl>
<dl>
<dt>성공</dt>
<dd><span class="c_002c9a">75</span></dd>
</dl>
<dl>
<dt>실패</dt>
<dd><span class="c_e40000">3</span></dd>
</dl>
</div>
</div>
<div class="rev_admin_in">
<div class="rev_admin_top clearfix">
<p>장문(LMS)</p>
<p><span>30</span></p>
</div>
<div class="rev_admin_btm">
<dl>
<dt>대기</dt>
<dd><span class="c_002c9a">0</span></dd>
</dl>
<dl>
<dt>성공</dt>
<dd><span class="c_002c9a">23</span></dd>
</dl>
<dl>
<dt>실패</dt>
<dd><span class="c_e40000">7</span></dd>
</dl>
</div>
</div>
<div class="rev_admin_in">
<div class="rev_admin_top clearfix">
<p>그림(MMS)</p>
<p><span>26</span></p>
</div>
<div class="rev_admin_btm">
<dl>
<dt>대기</dt>
<dd><span class="c_002c9a">3</span></dd>
</dl>
<dl>
<dt>성공</dt>
<dd><span class="c_002c9a">17</span></dd>
</dl>
<dl>
<dt>실패</dt>
<dd><span class="c_e40000">6</span></dd>
</dl>
</div>
</div>
</div>
<div class="list_tab_wrap2 type4">
<!-- tab button -->
<ul class="list_tab">
<li class="tab active"><button type="button" onclick="listTab2(this,'1');">전체</button>
</li>
<li class="tab"><button type="button" onclick="listTab2(this,'2');">단문(SMS)</button>
</li>
<li class="tab"><button type="button" onclick="listTab2(this,'3');">장문(LMS)</button>
</li>
<li class="tab"><button type="button" onclick="listTab2(this,'4');">그림(MMS)</button>
</li>
</ul>
<!--// tab button -->
</div>
<!-- 발송관리 -->
<div class="price_history_cont price_wrap" id="listTab_2">
<div class="table_tab_wrap">
<!-- tab button -->
<ul>
<li class="tab active"><button type="button">전체</button></li>
<li class="tab"><button type="button">즉시</button></li>
<li class="tab"><button type="button">예약</button></li>
</ul>
<!--// tab button -->
<!-- 발송화면 개선 : 발송결과 추가-->
<div class="tab_btnbox">
<button type="button" class="btnType btnType14 check_validity">발송결과<i class="qmMark"></i></button>
<div class="info_hover_cont send_hover_cont price_hover">
<dl>
<dt class="c_222">[<span>대기</span>]</dt>
<dd>
발송은 성공하였으며, 수신자측 통신사로부터 수신여부를 확인중인 상태 <br>
<span>※ 예약문자의 경우 실발송 전까지는 “대기”로 표시</span>
</dd>
<dt class="c_002c9a">[<span>성공</span>]</dt>
<dd>발송 및 수신이 완료된 상태</dd>
<dt class="c_e40000">[<span>실패</span>]</dt>
<dd class="last">결번, 일시정지, 전화번호 오류 등의 사유로 발송이
불가한 상태</dd>
</dl>
</div>
</div>
<!--// 발송화면 개선 : 발송결과 추가-->
</div>
<div class="table_cont current">
<div class="list_info">
<p><span class="c_e40000">171</span></p>
<div>
<p class="cf_text c_e40000">※ 예약문자 발송취소는 예약 발송시간 기준 5분 전까지만 가능</p>
<label for="" class="label">카테고리 선택</label>
<label for="" class="label">줄보기 선택</label>
<select id="" class="selType2">
<option>10개보기</option>
<option>20개보기</option>
</select>
</div>
</div>
<!-- 발송화면 개선 : 테이블 수정-->
<div class="tb_wrap">
<table class="tType4">
<colgroup>
<col style="width: 12%;">
<col style="width: 7%;">
<col style="width: auto;">
<col style="width: 8%;">
<col style="width: 8%;">
<col style="width: 8%;">
<col style="width: 8%;">
<col style="width: 10%;">
<col style="width: 10%;">
</colgroup>
<thead>
<tr>
<th rowspan="2">발송일시
<div class="sort_wrap">
<input type="button" class="sort sortBtn" id="sort_reqdate">
</div>
</th>
<th rowspan="2">형태
<div class="sort_wrap">
<input type="button" class="sort sortBtn" id="sort_orderByCode">
</div>
</th>
<th rowspan="2">내용</th>
<th rowspan="2">발송건수
<div class="sort_wrap">
<input type="button" class="sort sortBtn" id="sort_msgGroupCnt">
</div>
</th>
<th colspan="3">발송결과</th>
<th rowspan="2">금액(원)</th>
<th rowspan="2">진행상황</th>
</tr>
<tr>
<th>대기</th>
<th>성공</th>
<th>실패</th>
</tr>
</thead>
<tbody>
<tr>
<td>2024-01-09 17:42</td>
<td>단문</td>
<td class="result_cont">
<div class="icon_wrap">
<span class="re">예약</span>
<span class="di">분할</span>
<a href="#">내용을 클릭하면 상세보기 화면으로 이동합니다.</a>
</div>
</td>
<td>0</td>
<td>
<p class="c_666">0</p>
</td>
<td>
<p class="c_002c9a">0</p>
</td>
<td>
<p class="c_e40000">0</p>
</td>
<td>
8,485,258
</td>
<td>
<p><button class="btnType btnType20">예약취소</button></p>
</td>
</tr>
<tr>
<td>2024-01-09 17:42</td>
<td>단문</td>
<td class="result_cont">
<div class="icon_wrap">
<span class="re">예약</span>
<a href="#">내용을 클릭하면 상세보기 화면으로 이동합니다.</a>
</div>
</td>
<td>0</td>
<td>
<p class="c_666">0</p>
</td>
<td>
<p class="c_002c9a">0</p>
</td>
<td>
<p class="c_e40000">0</p>
</td>
<td>-</td>
<td>예약취소</td>
</tr>
<tr>
<td>2024-01-09 17:42</td>
<td>단문</td>
<td class="result_cont">
<div class="icon_wrap">
<a href="#">내용을 클릭하면 상세보기 화면으로 이동합니다.</a>
</div>
</td>
<td>458,002</td>
<td>
<p class="c_666">1</p>
</td>
<td>
<p class="c_002c9a">458,000</p>
</td>
<td>
<p class="c_e40000">1</p>
</td>
<td>12,580</td>
<td>진행중</td>
</tr>
<tr>
<td>2024-01-09 17:42</td>
<td>단문</td>
<td class="result_cont">
<div class="icon_wrap">
<a href="#">내용을 클릭하면 상세보기 화면으로 이동합니다.</a>
</div>
</td>
<td>458,002</td>
<td>
<p class="c_666">1</p>
</td>
<td>
<p class="c_002c9a">458,000</p>
</td>
<td>
<p class="c_e40000">1</p>
</td>
<td>12,580</td>
<td>완료</td>
</tr>
</tbody>
</table>
</div>
<!--// 발송화면 개선 : 테이블 수정-->
<div class="table_btn clearfix">
<!-- <div class="table_btn_left">
<button type="button" data-tooltip="rev_popup02" class="btnType btnType15"><i class="add_img"></i>그룹등록</button>
<button type="button" class="btnType btnType15" onclick="javascript:fnDeleteAddrNo('groupList'); return false;"><i class="remove_img"></i>주소록에서 번호 삭제</button>
<button type="button" class="btnType btnType15" onclick="javascript:fnAddBlockNo('groupList'); return false;">수신거부번호 등록</button>
</div>
<div class="table_btn_right">
<button type="button" class="excel_btn btnType"><i class="downroad"></i>엑셀
다운로드</button>
<button type="button" class="print_btn btnType"><i class="print_img"></i>발송결과
출력하기</button>
</div>-->
</div>
<!-- pagination -->
<ul class="pagination">
<li class="page_first"><button><img src="/publish/images/content/page_first.png"
alt=""></button></li>
<li class="page_prev"><button><img src="/publish/images/content/page_prev.png"
alt=""></button></li>
<li class="on"><button>1</button></li>
<li><button>2</button></li>
<li><button>3</button></li>
<li><button>4</button></li>
<li><button>5</button></li>
<li><button>6</button></li>
<li><button>7</button></li>
<li><button>8</button></li>
<li><button>9</button></li>
<li><button>10</button></li>
<li class="page_next"><button><img src="/publish/images/content/page_next.png"
alt=""></button></li>
<li class="page_last"><button><img src="/publish/images/content/page_last.png"
alt=""></button></li>
</ul><!-- pagination -->
</div>
</div><!-- // 발송관리 -->
</div>
<div class="rev_content kakao_rev_content" id="tab5_2" style="display: none;">
<!-- 발송결과 개선 : 문구추가 -->
<div class="titBox_result">
<p>- 최대 3개월간의 발송내역만 확인하실 수 있습니다.</p>
<p>- 전송내역이 필요한 경우 기간 내에 다운로드하여 주시기 바랍니다.</p>
<p>- 단문문자는 최대 24시간, 장문 및 그림문자는 최대 72시간까지 결과값이 수신되지 않은 경우 실패(비과금) 처리됩니다.</p>
</div>
<!--// 발송결과 개선 : 문구추가 -->
<div class="excel_middle">
<div class="select_btnWrap clearfix">
<div class="btn_left">
<span class="cal_label">기간선택</span>
<div class="calendar_wrap">
<input type="text" class="startDate inp calendar picker__input" title="검색 시작일"
id="startDate" name="startDate" value="" data-datecontrol="true" readonly=""
aria-haspopup="true" aria-expanded="false" aria-readonly="false"
aria-owns="startDate_root">
<span class="dateEtc">~</span>
<input type="text" class="endDate inp calendar picker__input" title="검색 종료일"
id="endDate" name="endDate" value="" data-datecontrol="true" readonly=""
aria-haspopup="true" aria-expanded="false" aria-readonly="false"
aria-owns="endDate_root">
</div>
<button type="button">전월</button>
<button type="button">당월</button>
<button type="button">3개월</button>
<button type="button" class="btnType6">조회</button>
</div>
<div class="btn_right">
<label for="" class="label">발신번호 선택</label>
<select name="" id="" class="selType2">
<option value="">발신번호</option>
<option value="">발신번호</option>
<option value="">발신번호</option>
</select>
<div class="search">
<label for="id" class="label"></label>
<input type="text" id="id" placeholder="검색어를 입력하세요."
onfocus="this.placeholder=''" onblur="this.placeholder='검색어를 입력하세요.'">
<button type="button" class="btnType btnType2">검색</button>
</div>
</div>
</div>
</div>
<div class="rev_admin">
<div class="rev_admin_in">
<div class="rev_admin_top clearfix">
<p>전체</p>
<p><span>171</span></p>
</div>
<div class="rev_admin_btm">
<dl>
<dt>대기</dt>
<dd><span class="c_002c9a">160</span></dd>
</dl>
<dl>
<dt>성공</dt>
<dd><span class="c_002c9a">160</span></dd>
</dl>
<dl>
<dt>실패</dt>
<dd><span class="c_e40000">0</span></dd>
</dl>
</div>
</div>
<div class="rev_admin_in">
<div class="rev_admin_top clearfix">
<p>알림톡</p>
<p><span>171</span></p>
</div>
<div class="rev_admin_btm">
<dl>
<dt>대기</dt>
<dd><span class="c_002c9a">160</span></dd>
</dl>
<dl>
<dt>성공</dt>
<dd><span class="c_002c9a">160</span></dd>
</dl>
<dl>
<dt>실패</dt>
<dd><span class="c_e40000">0</span></dd>
</dl>
</div>
</div>
<!-- <div class="rev_admin_in">
<div class="rev_admin_top clearfix">
<p>친구톡</p>
<p><span>171</span></p>
</div>
<div class="rev_admin_btm">
<dl>
<dt>대기</dt>
<dd><span class="c_002c9a">160</span></dd>
</dl>
<dl>
<dt>성공</dt>
<dd><span class="c_002c9a">160</span></dd>
</dl>
<dl>
<dt>실패</dt>
<dd><span class="c_e40000">0</span></dd>
</dl>
</div>
</div> -->
</div>
<div class="list_tab_wrap2 type4">
<!-- tab button -->
<ul class="list_tab">
<li class="tab active"><button type="button" onclick="listTab2(this,'1');">전체</button>
</li>
<li class="tab"><button type="button" onclick="listTab2(this,'2');">알림톡</button></li>
<li class="tab"><button type="button" onclick="listTab2(this,'3');">친구톡</button></li>
</ul>
<!--// tab button -->
</div>
<!-- 발송관리 > 전체 -->
<div class="price_history_cont" id="listTab_2">
<div class="table_tab_wrap">
<!-- tab button -->
<ul>
<li class="tab active"><button type="button">전체</button></li>
<li class="tab"><button type="button">대기</button></li>
<li class="tab"><button type="button">성공</button></li>
<li class="tab"><button type="button">실패</button></li>
<li class="tab"><button type="button">예약</button></li>
</ul>
<!--// tab button -->
<!-- 발송화면 개선 : 발송결과 추가-->
<div class="tab_btnbox" style="z-index:999;">
<button type="button" class="btnType btnType14 check_validity" >발송결과<i class="qmMark"></i></button>
<div class="info_hover_cont send_hover_cont">
<dl>
<dt class="c_666">[<span>대기</span>]</dt>
<dd>발송은 성공하였으며, 수신자측 통신사로부터 수신여부를
확인중인 상태</dd>
<dt class="c_002c9a">[<span>성공</span>]</dt>
<dd>발송 및 수신이 완료된 상태</dd>
<dt class="c_e40000">[<span>실패</span>]</dt>
<dd>결번, 일시정지, 전화번호 오류 등의 사유로 발송이
불가한 상태</dd>
<dt class="c_222">[<span>예약</span>]</dt>
<dd>예약 발송 대기 상태</dd>
</dl>
</div>
</div>
<!--// 발송화면 개선 : 발송결과 추가-->
</div>
<div class="table_cont current">
<div class="list_info">
<p>총 발송건수 <span class="c_e40000">171</span></p>
<div>
<p class="cf_text c_e40000">※ 예약문자 발송취소는 예약 발송시간 기준 5분 전까지만 가능</p>
<label for="" class="label">줄보기 선택</label>
<select id="" class="selType2">
<option>10개보기</option>
<option>20개보기</option>
</select>
</div>
</div>
<!-- 발송화면 개선 : 카카오톡 테이블 수정 -->
<div class="tb_wrap">
<table class="tType4">
<colgroup>
<col style="width: 45px;">
<col style="width: 12%;">
<col style="width: 8%;">
<col style="width: auto;">
<col style="width: 8%;">
<col style="width: 6%;">
<col style="width: 6%;">
<col style="width: 6%;">
<col style="width: 6%;">
<col style="width: 6%;">
<col style="width: 6%;">
<col style="width: 9%;">
<col style="width: 11%;">
</colgroup>
<thead>
<tr>
<th rowspan="2">
<label for="" class="label">전체 선택</label>
<input type="checkbox">
</th>
<th rowspan="2">발송일시
<div class="sort_wrap">
<input type="button" class="sort sortBtn" id="sort_reqdate">
</div>
</th>
<th rowspan="2">형태
<div class="sort_wrap">
<input type="button" class="sort sortBtn" id="sort_orderByCode">
</div>
</th>
<th rowspan="2">내용</th>
<th rowspan="2">발송건수
<div class="sort_wrap">
<input type="button" class="sort sortBtn" id="sort_msgGroupCnt">
</div>
</th>
<th colspan="4">카카오톡 결과</th>
<th colspan="2">대체문자 결과</th>
<th rowspan="2">금액</th>
<th rowspan="2">예약관리</th>
</tr>
<tr>
<th>대기</th>
<th>성공</th>
<th>실패</th>
<th>예약</th>
<th>성공</th>
<th>실패</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<label for="" class="label">선택</label>
<input type="checkbox">
</td>
<td>2024-01-09 17:42</td>
<td>단문</td>
<td class="result_cont"><a href="#">내용을 클릭하면 상세보기 화면으로 이동합니다.</a></td>
<td>125,895</td>
<td>
<p class="c_666">0</p>
</td>
<td>
<p class="c_002c9a">0</p>
</td>
<td>
<p class="c_e40000">0</p>
</td>
<td>
<p class="c_002c9a">0</p>
</td>
<td>
<p class="c_002c9a">0</p>
</td>
<td>
<p class="c_e40000">125,895</p>
</td>
<td>
8,485,258원
</td>
<td>
<p><button class="btnType btnType20">예약취소</button></p>
</td>
</tr>
</tbody>
</table>
</div>
<!--// 발송화면 개선 : 카카오톡 테이블 수정 -->
<div class="table_btn clearfix">
<div class="table_btn_left">
<button type="button" data-tooltip="rev_popup02" class="btnType btnType15"><i
class="add_img"></i>그룹등록</button>
<button type="button" class="btnType btnType15"><i class="remove_img"></i>주소록에서
번호 삭제</button>
<button type="button" class="btnType btnType15">수신거부번호 등록</button>
</div>
<div class="table_btn_right">
<button type="button" class="excel_btn btnType"><i class="downroad"></i>엑셀
다운로드</button>
<button type="button" class="print_btn btnType"><i class="print_img"></i>발송결과
출력하기</button>
</div>
</div>
<!-- pagination -->
<ul class="pagination">
<li class="page_first"><button><img src="/publish/images/content/page_first.png"
alt=""></button></li>
<li class="page_prev"><button><img src="/publish/images/content/page_prev.png"
alt=""></button></li>
<li class="on"><button>1</button></li>
<li><button>2</button></li>
<li><button>3</button></li>
<li><button>4</button></li>
<li><button>5</button></li>
<li><button>6</button></li>
<li><button>7</button></li>
<li><button>8</button></li>
<li><button>9</button></li>
<li><button>10</button></li>
<li class="page_next"><button><img src="/publish/images/content/page_next.png"
alt=""></button></li>
<li class="page_last"><button><img src="/publish/images/content/page_last.png"
alt=""></button></li>
</ul><!-- pagination -->
</div>
</div><!-- // 발송관리 > 전체 -->
</div>
</div>
</div>
<!--// send top -->
</div>
</div>
<!--// content 영역 -->
<!-- footer 영역 -->
<footer id="footer" class="footer" style="display:none;">
<div class="footer_top">
<div class="inner table">
<ul class="table_cell">
<li><a href="#">이용약관</a></li>
<li class="SortLine fwRg c_white"><a href="#">개인정보취급방침</a></li>
<li class="SortLine fwRg c_white"><a href="#">스팸관리정책</a></li>
<li class="SortLine"><a href="#">불법스팸예방안내</a></li>
</ul>
</div>
</div>
<div class="footer_body">
<div class="inner table">
<div class="table_cell">
<a href="#" class="footer_logo"><img src="/publish/images/CI_white.png" alt="문자온 CI"></a>
<div class="footer_info">
<p>주소 : 경기도 남양주시 다산중앙로 19번길 21 1027호, 1028호(블루웨일 지식산업센터 1차)</p>
<p>사업자번호 : 653-87-00858 대표 : 유인식 통신판매등록번호 : 제 다산-12345호 문의전화 : 070-4786-0007</p>
<p>Copyright 2020 ⓒ MUNJAON co. Ltd, All rights reserved.</p>
</div>
<div class="footer_service_center">
<i></i>
<div>
<p>고객센터</p>
<span class="footer_service_num">070-4786-0008</span>
<span>E-mail : help@iten.co.kr</span>
</div>
</div>
</div>
</div>
</div>
</footer>
<!--// footer 영역 -->
</body>
</html>