초기소스
This commit is contained in:
@@ -0,0 +1,262 @@
|
||||
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
|
||||
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
|
||||
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
|
||||
<%@ taglib prefix="ui" uri="http://www.winbit.kr/ctl/ui" %>
|
||||
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
|
||||
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
|
||||
<%@ page import="java.util.Date" %>
|
||||
<%--
|
||||
Class Name : MssageLgqyPassivSndngListInqireR.jsp
|
||||
Description : 메시지 대량 발송 내역 조회
|
||||
Modification Information
|
||||
|
||||
수정일 수정자 수정내용
|
||||
------- -------- ---------------------------
|
||||
2024-02-28 리브가 최초 생성
|
||||
2024-04-05 이운산 수정
|
||||
--%>
|
||||
<script>
|
||||
$(document).ready(function () {
|
||||
//문자열 추출 함수
|
||||
const fn_find_td_str = function(tr, num){
|
||||
const tdStr = tr.find("td").eq(num).text().trim();
|
||||
return tdStr;
|
||||
}
|
||||
|
||||
//조건 css
|
||||
$("#basicTab").find("tr").each(function() {
|
||||
let tr = $(this);
|
||||
|
||||
//발송요청시간
|
||||
const sndngReqstDt = fn_find_td_str(tr, 5);
|
||||
|
||||
//발송 상태
|
||||
const sndngSttus = fn_find_td_str(tr, 8);
|
||||
|
||||
const now = new Date();
|
||||
|
||||
const reqstDt = new Date(sndngReqstDt);
|
||||
|
||||
//오늘
|
||||
const reqstMd = new Date(reqstDt.getFullYear(), reqstDt.getMonth(), reqstDt.getDate());
|
||||
const nowMd = new Date(now.getFullYear(), now.getMonth(), now.getDate());
|
||||
const today = (reqstDt.getMonth() == now.getMonth()) == (reqstDt.getDate() == now.getDate());
|
||||
|
||||
// console.log("today %s",today);
|
||||
|
||||
if(today && sndngSttus == "요청") {
|
||||
tr.find("td").css({
|
||||
"background-color": "#7ef1f7"
|
||||
})
|
||||
}
|
||||
|
||||
//지난 요청
|
||||
if((reqstDt < now) && sndngSttus == "요청") {
|
||||
tr.find("td").css({
|
||||
"background-color": "#f7827e"
|
||||
})
|
||||
}
|
||||
|
||||
//입력중
|
||||
if(sndngSttus == "입력") {
|
||||
tr.find("td").css({
|
||||
"background-color": "#e4e4f9"
|
||||
})
|
||||
}
|
||||
|
||||
//처리중
|
||||
if(sndngSttus == "처리중" || sndngSttus == "대기" || sndngSttus == "발송") {
|
||||
tr.find("td").css({
|
||||
"background-color": "#5c97f1"
|
||||
})
|
||||
}
|
||||
|
||||
//입력중
|
||||
if(sndngSttus == "완료") {
|
||||
tr.find("td").css({
|
||||
"background-color": "#edeff3"
|
||||
})
|
||||
}
|
||||
|
||||
})
|
||||
|
||||
//길이 조정
|
||||
$("#basicTab").find("tr").css({
|
||||
"height" : "0px"
|
||||
})
|
||||
|
||||
/************
|
||||
* 탭버튼 클릭 이벤트 해제
|
||||
*************/
|
||||
$(".tab-box__btn").off().css("cursor", "default");
|
||||
|
||||
//전화번호 처리
|
||||
$(".recptnNb").each(function () {
|
||||
const recptnNbStr = $(this).text();
|
||||
const recptnNb = fn_format_mbtlnb(recptnNbStr.replace(/\s+/g, ''));
|
||||
$(this).text(recptnNb);
|
||||
})
|
||||
})
|
||||
</script>
|
||||
<section class="content-section">
|
||||
<form>
|
||||
<input type="hidden" id="srchSmsLgqySndngInnb" name="srchSmsLgqySndngInnb"/>
|
||||
<div class="form-control-container">
|
||||
<div class="left">
|
||||
<div class="search-number">
|
||||
<span class="search-number__text">총
|
||||
<strong>
|
||||
<fmt:formatNumber value="${ resultMap.paginationInfo.totalRecordCount }" pattern="#,###" />
|
||||
</strong>건
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="center">
|
||||
</div>
|
||||
<div class="right">
|
||||
<div class="select-box">
|
||||
<select id="pageUnit" title="페이지당 출력될 목록건수" onchange="fn_select_list(1);">
|
||||
<c:forEach items="${ resultMap.paginationInfo.pageUnitArr }" var="pageUnit" varStatus="pageUnitStatus">
|
||||
<option value="<c:out value="${ pageUnit }"/>" <c:if test="${ resultMap.paginationInfo.recordCountPerPage eq pageUnit}">selected="selected"</c:if>><c:out value="${ pageUnit }"/>개씩</option>
|
||||
</c:forEach>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<hr class="horizontal-line">
|
||||
<div class="form-control-container">
|
||||
<div class="left">
|
||||
<button class="btn gray sm" type="button" onclick="fn_view_calendar();">발송 요청 일정 보기</button>
|
||||
</div>
|
||||
<div class="center">
|
||||
</div>
|
||||
<div class="right">
|
||||
</div>
|
||||
</div>
|
||||
<hr class="spacing">
|
||||
<div class="tab-box">
|
||||
<div class="tab-box__btn" style="color:black;">발송상태:</div>
|
||||
<div class="tab-box__btn" style="background: #f7827e;color:black">요청 일자 지난 요청</div>
|
||||
<div class="tab-box__btn" style="background: #7ef1f7;color:black">
|
||||
<c:set var="today" value="<%=new java.util.Date()%>" />
|
||||
<c:set var="month"><fmt:formatDate value="${today}" pattern="MM" /></c:set>
|
||||
<c:set var="date"><fmt:formatDate value="${today}" pattern="dd" /></c:set>
|
||||
오늘(<c:out value="${month}" />/<c:out value="${date}" />)~ 요청
|
||||
</div>
|
||||
<div class="tab-box__btn" style="background: #e4e4f9;color:black">입력 중</div>
|
||||
<div class="tab-box__btn" style="background: #5c97f1;color:white">발송 처리중</div>
|
||||
<div class="tab-box__btn" style="background: #edeff3;color:black">발송 완료</div>
|
||||
</div>
|
||||
<div class="tab-box__content">
|
||||
<div class="table-wrapper">
|
||||
<table class="table vertical tight">
|
||||
<caption>해당 테이블에 대한 설명</caption>
|
||||
<!-- 각 열 width 설정 -->
|
||||
<colgroup>
|
||||
<col style="width: 1%;">
|
||||
<col style="width: 6%;">
|
||||
<col style="width: 8%;">
|
||||
<col style="width: auto;">
|
||||
<col style="width: 12%;">
|
||||
<col style="width: 12%;">
|
||||
<col style="width: 10%;">
|
||||
<col style="width: 8%;">
|
||||
<col style="width: 8%;">
|
||||
<col style="width: 8%;">
|
||||
</colgroup>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>번호</th>
|
||||
<th>발송번호</th>
|
||||
<th>브랜드</th>
|
||||
<th>발송 제목</th>
|
||||
<th>등록시간</th>
|
||||
<th>발송요청시간</th>
|
||||
<th>발송시간</th>
|
||||
<th>대상건수<br>성공건수</th>
|
||||
<th>발송상태</th>
|
||||
<th>발송통계</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody id="basicTab">
|
||||
<c:if test="${!empty resultMap.boCtrlMap.lgqyMssageSndngList}">
|
||||
<c:forEach var="lgqyMssageSndng" items="${resultMap.boCtrlMap.lgqyMssageSndngList }" varStatus="status">
|
||||
<tr>
|
||||
<td>
|
||||
<c:out value="${ lgqyMssageSndng.rnum }"/>
|
||||
</td>
|
||||
<td>
|
||||
<c:out value="${ lgqyMssageSndng.smsLgqySndngInnb }"/>
|
||||
</td>
|
||||
<td><c:out value="${ lgqyMssageSndng.brandCd }"/></td>
|
||||
<td class="text-left under-line"
|
||||
onclick="fn_move_lgqy_dtl(
|
||||
'<c:out value="${ lgqyMssageSndng.smsLgqySndngInnb }"/>',
|
||||
'<c:out value="${ lgqyMssageSndng.sndngSttus }"/>'
|
||||
);">
|
||||
<c:out value="${ lgqyMssageSndng.sndngSj }"/>
|
||||
</td>
|
||||
<td><c:out value="${ lgqyMssageSndng.registDt }"/></td>
|
||||
<td><c:out value="${ lgqyMssageSndng.sndngReqstDt }"/></td>
|
||||
<td><c:out value="${ lgqyMssageSndng.sndngDt }"/></td>
|
||||
<td>
|
||||
<fmt:formatNumber value="${ lgqyMssageSndng.allCnt }" pattern="#,###"/> 건
|
||||
<br>
|
||||
<fmt:formatNumber value="${ lgqyMssageSndng.succesCnt }" pattern="#,###"/> 건
|
||||
</td>
|
||||
<td>
|
||||
<c:choose>
|
||||
<c:when test = "${lgqyMssageSndng.sndngProcsDvCd eq 'P'}">
|
||||
처리중
|
||||
</c:when>
|
||||
<c:otherwise>
|
||||
<c:if test="${lgqyMssageSndng.sndngSttus eq 'SAVE' || lgqyMssageSndng.sndngSttus eq 'S'}">
|
||||
입력
|
||||
</c:if>
|
||||
<c:if test="${lgqyMssageSndng.sndngSttus eq 'REG' || lgqyMssageSndng.sndngSttus eq 'R'}">
|
||||
요청
|
||||
</c:if>
|
||||
<c:if test="${lgqyMssageSndng.sndngSttus eq 'WAIT' || lgqyMssageSndng.sndngSttus eq 'I'}">
|
||||
대기
|
||||
</c:if>
|
||||
<c:if test="${lgqyMssageSndng.sndngSttus eq 'SEND'}">
|
||||
발송
|
||||
</c:if>
|
||||
<c:if test="${lgqyMssageSndng.sndngSttus eq 'END' || lgqyMssageSndng.sndngSttus eq 'Y'}">
|
||||
완료
|
||||
</c:if>
|
||||
<c:if test="${lgqyMssageSndng.sndngSttus eq 'CAN' || lgqyMssageSndng.sndngSttus eq 'N'}">
|
||||
취소
|
||||
</c:if>
|
||||
</c:otherwise>
|
||||
</c:choose>
|
||||
</td>
|
||||
<td>
|
||||
<c:if test="${lgqyMssageSndng.sndngSttus eq 'END' || lgqyMssageSndng.sndngSttus eq 'Y'}">
|
||||
<a class="under-line blue-7"
|
||||
onclick="fn_open_modal('#mssageLgqySndngStatsPopupDiv','#mssageLgqySndngStatsPopup',
|
||||
'<c:url value="/mngr/ntcn/lgqymssage/selectMssageLgqySndngStats"/>',
|
||||
{
|
||||
'srchSmsLgqySndngInnb' : '<c:out value="${ lgqyMssageSndng.smsLgqySndngInnb }"/>'
|
||||
, 'srchSopmalCd' : '<c:out value="${ lgqyMssageSndng.sopmalCd }"/>'
|
||||
, 'srchSndngRegistDt' : '<c:out value="${lgqyMssageSndng.registDt}"/>'
|
||||
}); return false;"
|
||||
>보기</a>
|
||||
</c:if>
|
||||
</td>
|
||||
</tr>
|
||||
</c:forEach>
|
||||
</c:if>
|
||||
<c:if test="${empty resultMap.boCtrlMap.lgqyMssageSndngList }">
|
||||
<tr>
|
||||
<td class="row-no-data" colspan="12">조회된 데이터가 없습니다.</td>
|
||||
</tr>
|
||||
</c:if>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</section>
|
||||
<div class="pagination__container">
|
||||
<ui:pagination paginationInfo="${resultMap.paginationInfo}" type="image" jsFunction="fn_select_list"/>
|
||||
</div>
|
||||
@@ -0,0 +1,146 @@
|
||||
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
|
||||
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
|
||||
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
|
||||
<%@ taglib prefix="ui" uri="http://www.winbit.kr/ctl/ui" %>
|
||||
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
|
||||
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
|
||||
<%@ page import="java.util.Date" %>
|
||||
<%--
|
||||
Class Name : MssageLgqyPassivSndngListInqireRForm.jsp
|
||||
Description : 메시지 대량 발송 폼
|
||||
Modification Information
|
||||
|
||||
수정일 수정자 수정내용
|
||||
------- -------- ---------------------------
|
||||
2024-02-28 리브가 최초 생성
|
||||
2024-04-05 이운산 수정
|
||||
--%>
|
||||
<script>
|
||||
$(document).ready(function () {
|
||||
$("#info01").hide();
|
||||
|
||||
let pageIndex = '<c:out value="${ resultMap.BOBsnmVO.pageIndex }"/>';
|
||||
let pageUnit = '<c:out value="${ resultMap.BOBsnmVO.pageUnit }"/>';
|
||||
|
||||
//초기 검색일자 지정
|
||||
fn_set_date_init();
|
||||
|
||||
fn_select_list(pageIndex, pageUnit);
|
||||
|
||||
//날짜 선택 버튼 선택 처리
|
||||
$(".dateRange-btnContainer").on("click", ".dateRange-btn", function(){
|
||||
const dateId = $(this).attr("id");
|
||||
$(".dateRange-btn").removeClass('selected');
|
||||
$("#" + dateId).addClass("selected");
|
||||
})
|
||||
|
||||
fn_set_dateRange_function('.dateRange-btnContainer', 'srchStrtRegistDt','srchEndRegistDt');
|
||||
|
||||
//데이트 피커
|
||||
fn_set_niceSelect_datePicker("#listForm");
|
||||
|
||||
//검색 엔터시 리스트 조회
|
||||
$('#listForm').on('keydown', function (event) {
|
||||
console.log(event.keyCode);
|
||||
if (event.keyCode === 13) {
|
||||
event.preventDefault();
|
||||
fn_select_list(1);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
</script>
|
||||
<section class="content-section" id="search-section">
|
||||
<h3 class="content-section__title">대량 SMS 발송 메시지</h3>
|
||||
<form id="listForm">
|
||||
<div class="table-wrapper">
|
||||
<table class="table">
|
||||
<caption>해당 테이블에 대한 설명</caption>
|
||||
<colgroup>
|
||||
<col style="width: 12%;">
|
||||
<col>
|
||||
</colgroup>
|
||||
<tbody>
|
||||
<tr>
|
||||
<th>브랜드선택</th>
|
||||
<td>
|
||||
<div class="td-inner">
|
||||
<div class="select-box">
|
||||
<select title="브랜드 선택" name="srchSopmalCd" id="srchSopmalCd">
|
||||
<option value="">브랜드 선택</option>
|
||||
<c:forEach var="sopmal" items="${resultMap.sopmalList}" varStatus="status">
|
||||
<option value="${sopmal.sopmalCd}" ${sopmal.sopmalCd == resultMap.sopmalCd
|
||||
? 'selected': ''}>
|
||||
${sopmal.sopmalNm}
|
||||
</option>
|
||||
</c:forEach>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>상태</th>
|
||||
<td>
|
||||
<div class="td-inner">
|
||||
<div class="select-box">
|
||||
<select title="상태선택" id="srchSndngSttus" name="srchSndngSttus">
|
||||
<option value="">전체</option>
|
||||
<c:forEach var="sndngSttus" items="${resultMap.sndngSttus}" varStatus="status">
|
||||
<option value="${sndngSttus.cd}">
|
||||
${sndngSttus.cdNm}
|
||||
</option>
|
||||
</c:forEach>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>등록시간</th>
|
||||
<td>
|
||||
<div class="td-inner">
|
||||
<div class="input-container">
|
||||
<input type="text" id="srchStrtRegistDt" class="datepicker" title="시작 날짜 선택" name = "srchStrtRegistDt"
|
||||
autocomplete="off">
|
||||
<span class="tilde">~</span>
|
||||
<input type="text" id="srchEndRegistDt" class="datepicker" title="종료 날짜 선택" name = "srchEndRegistDt"
|
||||
autocomplete="off">
|
||||
</div>
|
||||
<div class="dateRange-btnContainer" id = "searchDateRange">
|
||||
<button type="button" class="dateRange-btn" id="yesterday">어제</button>
|
||||
<button type="button" class="dateRange-btn" id="today" >오늘</button>
|
||||
<button type="button" class="dateRange-btn" id="threeDays">3일간</button>
|
||||
<button type="button" class="dateRange-btn" id="sevenDays">일주일</button>
|
||||
<button type="button" class="dateRange-btn" id="oneMonth" >1개월</button>
|
||||
<button type="button" class="dateRange-btn" id="threeMonth">3개월</button>
|
||||
<button type="button" class="dateRange-btn" id="sixMonth">6개월</button>
|
||||
<button type="button" class="dateRange-btn" id="year">1년</button>
|
||||
<button type="button" class="dateRange-btn" id="allDays">전체</button>
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>발송내용</th>
|
||||
<td>
|
||||
<div class="td-inner">
|
||||
<input class="input-text xl" type="text" title="해당 인풋에 대한 설명" id="srchSndngCn" name="srchSndngCn">
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div class="form-control-container">
|
||||
<div class="left"></div>
|
||||
<div class="center">
|
||||
<button class="btn outline" id="resetBtn" type="button" onclick="fn_reset_form('search-section'); return false;">초기화</button>
|
||||
<button class="btn primary" id="searchBtn" type="button" onclick="fn_select_list(1); return false;">검색</button>
|
||||
</div>
|
||||
<div class="right"></div>
|
||||
</div>
|
||||
</form>
|
||||
</section>
|
||||
<div id="pageDiv">
|
||||
</div>
|
||||
@@ -0,0 +1,256 @@
|
||||
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
|
||||
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
|
||||
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
|
||||
<%@ taglib prefix="ui" uri="http://www.winbit.kr/ctl/ui" %>
|
||||
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
|
||||
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
|
||||
<%@ page import="java.util.Date" %>
|
||||
<%--
|
||||
Class Name : MssageLgqyPassivSndngManage.jsp
|
||||
Description : 메시지 대량 수동 발송 관리 화면
|
||||
Modification Information
|
||||
|
||||
수정일 수정자 수정내용
|
||||
------- -------- ---------------------------
|
||||
2024-02-28 리브가 최초 생성
|
||||
2024-04-05 이운산 수정
|
||||
--%>
|
||||
<!DOCTYPE html>
|
||||
<html lang="ko">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<%-- 공통 include --%>
|
||||
<%@include file ="/WEB-INF/views/comm/mngr/Include.jsp" %>
|
||||
</head>
|
||||
<script>
|
||||
$(document).ready(function () {
|
||||
//리스트 바로가기 기능 처리
|
||||
const selectTab = localStorage.getItem("selectTab");
|
||||
if(selectTab == "selectListInqireFormBtn") {
|
||||
fn_select_listForm();
|
||||
} else {
|
||||
fn_select_Sndng();
|
||||
}
|
||||
});
|
||||
|
||||
/* ********************************************************
|
||||
* sms 대량 발송 등록 TAB
|
||||
******************************************************** */
|
||||
const fn_select_Sndng = function () {
|
||||
|
||||
$("#saveBtn").show();
|
||||
|
||||
$.ajax({
|
||||
type: 'post',
|
||||
url: '/mngr/ntcn/lgqymssage/selectMssageLgqySndngRegistForm',
|
||||
success: function (resultHtml) {
|
||||
$("#selectListInqireFormBtn").removeClass("active");
|
||||
$("#selectListInqireForm").removeClass("active");
|
||||
|
||||
$("#selectSndngBtn").addClass("active");
|
||||
$("#selectSndng").addClass("active");
|
||||
$('#selectSndng').html(resultHtml);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/* ********************************************************
|
||||
* sms 대량 발송 내역 탭 - 검색 폼 TAB
|
||||
******************************************************** */
|
||||
const fn_select_listForm = function () {
|
||||
|
||||
$("#saveBtn").hide();
|
||||
|
||||
$.ajax({
|
||||
type: 'post',
|
||||
url: '/mngr/ntcn/lgqymssage/selectMssageLgqySndngListInqireRForm',
|
||||
success: function (resultHtml) {
|
||||
$("#selectSndngBtn").removeClass("active");
|
||||
$("#selectSndng").removeClass("active");
|
||||
|
||||
$("#selectListInqireFormBtn").addClass("active");
|
||||
$("#selectListInqireForm").addClass("active");
|
||||
$('#selectListInqireForm').html(resultHtml);
|
||||
localStorage.setItem("selectTab", "");
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* ********************************************************
|
||||
* sms 대량 발송 내역 탭 - 검색 폼 - 리스트 조회
|
||||
******************************************************** */
|
||||
const fn_select_list = function(pageIndex, pageUnit) {
|
||||
let dataStr;
|
||||
if(!pageIndex) {
|
||||
$('#pageIndex').val(1);
|
||||
} else {
|
||||
$('#pageIndex').val(pageIndex);
|
||||
}
|
||||
|
||||
pageUnit = $("#pageUnit").val();
|
||||
|
||||
if(!pageUnit) {
|
||||
dataStr = $('#listForm').serialize();
|
||||
} else {
|
||||
if($('#pageUnit').length){
|
||||
$('#pageUnit').val(pageUnit);
|
||||
dataStr = $('#listForm').serialize() + '&pageIndex='+pageIndex +'&pageUnit='+pageUnit;
|
||||
} else {
|
||||
dataStr = $('#listForm').serialize() + '&pageIndex='+pageIndex;
|
||||
}
|
||||
}
|
||||
|
||||
$.ajax({
|
||||
type: "post",
|
||||
url : "<c:url value="/mngr/ntcn/lgqymssage/selectMssageLgqySndngListInqire"/>",
|
||||
data : dataStr,
|
||||
success:function(resultHtml) {
|
||||
$('#pageDiv').html(resultHtml);
|
||||
$('#pageUnit').niceSelect();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************
|
||||
* 발송요청현황 확인하기 토글
|
||||
* *********************************************************/
|
||||
const fn_reserve_toggle = function() {
|
||||
$("#reserveListTitle").toggle();
|
||||
$(".table-wrapper.overflow-y-auto").toggle();
|
||||
}
|
||||
|
||||
|
||||
/* ********************************************************
|
||||
* 발송 요청 일정 달력 보기
|
||||
******************************************************** */
|
||||
const fn_view_calendar = function() {
|
||||
$("#srchStrtRegistDt").val();
|
||||
let dataStr = $("listForm").serialize();
|
||||
|
||||
const srchStrtRegistDt = $("#srchStrtRegistDt").val();
|
||||
const srchEndRegistDt = $("#srchEndRegistDt").val();
|
||||
fn_open_modal(
|
||||
'#mssageLgqySndngReqstCldrPopupDiv',
|
||||
'#mssageLgqySndngReqstCldrPopup',
|
||||
'<c:url value="/mngr/ntcn/lgqymssage/selectMssageLgqySndngReqstCldr"/>',
|
||||
{
|
||||
'srchStrtRegistDt' : srchStrtRegistDt,
|
||||
'srchEndRegistDt' : srchEndRegistDt
|
||||
}
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
/* ********************************************************
|
||||
* 상세화면 조회
|
||||
******************************************************** */
|
||||
const fn_move_lgqy_dtl = function(smsLgqySndngInnb, sndngSttus){
|
||||
//S 입력 상태 -> 수정 화면
|
||||
let url = '<c:url value="/mngr/ntcn/lgqymssage/selectMssageLgqySndngUpdtInqire"/>';
|
||||
|
||||
$('form').attr('action', url);
|
||||
$('form').attr('method', 'post');
|
||||
$('#srchSmsLgqySndngInnb').val(smsLgqySndngInnb);
|
||||
$('form').submit();
|
||||
|
||||
}
|
||||
|
||||
|
||||
/* ********************************************************
|
||||
* 초기 날짜 세팅
|
||||
******************************************************** */
|
||||
const fn_set_date_init = function() {
|
||||
|
||||
const today = new Date();
|
||||
const srchEndRegistDt = today.toISOString().substring(0, 10);
|
||||
|
||||
today.setDate(0);
|
||||
today.setDate(1);
|
||||
const srchStrtRegistDt = today.toISOString().substring(0, 10);
|
||||
|
||||
$("#srchStrtRegistDt").val(srchStrtRegistDt);
|
||||
$("#srchEndRegistDt").val(srchEndRegistDt);
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
</script>
|
||||
<body>
|
||||
<%-- 상단메뉴 공통화 적용 : 2023-11-30 / 박철민 추가 --%>
|
||||
<%@include file ="/WEB-INF/views/comm/mngr/Header.jsp" %>
|
||||
<main class="main">
|
||||
<%-- 좌측메뉴 공통화 적용 : 2023-11-30 / 박철민 추가 --%>
|
||||
<%@include file ="/WEB-INF/views/comm/mngr/Left.jsp" %>
|
||||
<div class="content">
|
||||
<div class="content__inner">
|
||||
<button class="side-nav__fold"><span class="visually-hidden">좌측메뉴 펼치기/닫기</span></button>
|
||||
<div class="page-title">
|
||||
<h2 class="page-title__title">메시지 대량 발송 관리</h2>
|
||||
<div class="page-title__btn-container">
|
||||
<button class="btn primary" type="button" id="saveBtn" onclick="fn_sndng_lgqy_mssage();">저장하기
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="content-tab">
|
||||
<button class="content-tab__btn active" id="selectSndngBtn" onclick="fn_select_Sndng()">메시지 대량 발송 등록</button>
|
||||
<button class="content-tab__btn" id="selectListInqireFormBtn" onclick="fn_select_listForm(1)">메시지 대량 발송 내역</button>
|
||||
</div>
|
||||
<div class="content-tab__content active" id="selectSndng">
|
||||
<%--메시지 대량 발송 등록--%>
|
||||
</div>
|
||||
<div class="content-tab__content" id="selectListInqireForm">
|
||||
<%--메시지 대량 발송 내역--%>
|
||||
</div>
|
||||
<div class="content-tab__content" id="selectUpdateForm">
|
||||
<%--메시지 대량 발송 상세 수정--%>
|
||||
</div>
|
||||
<button class="scroll-to-top"><span class="visually-hidden">위로가기</span></button>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
<!-- 툴팁 클릭 컨텐츠 -->
|
||||
<!-- 버튼의 data-info값과 id를 통일시켜야함 -->
|
||||
<div id="info01" class="mini-info-content" style="width: 280px;">
|
||||
<div class="mini-info-content__header">
|
||||
<h5 class="mini-info-content__title">정보통신망 이용촉진 및 정보보호 등에 관한 법률</h5>
|
||||
<button class="mini-info-content__close"><span class="visually-hidden">닫기</span></button>
|
||||
</div>
|
||||
<div class="mini-info-content__content">
|
||||
<p>
|
||||
<a href="https://www.lawnb.com/lawinfo/contents_view.asp?cid=00EB2355AF5D4259BD60F91473F0232C">제50조 (영리목적의 광고성 정보 전송 제한)</a>
|
||||
<p>
|
||||
<p>
|
||||
<a href="https://www.lawnb.com/lawinfo/contents_view.asp?cid=00EB2355AF5D4259BD60F91473F0232C">제76조 (과태료)</a>
|
||||
</p>
|
||||
</div>
|
||||
<br>
|
||||
<div class="mini-info-content__header">
|
||||
<h5 class="mini-info-content__title">한국인터넷진흥원 (KISA)</h5>
|
||||
</div>
|
||||
<div class="mini-info-content__content">
|
||||
<p>
|
||||
<a href="https://spam.kisa.or.kr/kor/rule/rule03.jsp">광고정보 전송 시 준수사항</a>
|
||||
<p>
|
||||
<p>
|
||||
<a href="https://spam.kisa.or.kr/kor/way/way04.jsp">광고전송가이드</a>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<!-- 메시지 대량발송 달력 보기 모달 -->
|
||||
<div id="mssageLgqySndngReqstCldrPopupDiv"></div>
|
||||
|
||||
<!-- 메시지 대량발송 내역 보기 모달 -->
|
||||
<div id="mssageLgqySndngStatsPopupDiv"></div>
|
||||
|
||||
<!-- 메시지 대량발송 내역 보기 모달 -->
|
||||
<div id="birth-stats-popupDiv"></div>
|
||||
|
||||
<!-- 메시지 대량발송 내역 보기 모달 -->
|
||||
<div id="ordr-stats-popupDiv"></div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,61 @@
|
||||
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
|
||||
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
|
||||
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
|
||||
<%@ taglib prefix="ui" uri="http://www.winbit.kr/ctl/ui" %>
|
||||
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
|
||||
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
|
||||
<%@ page import="java.util.Date" %>
|
||||
<%--
|
||||
Class Name : MssageLgqySndngStatsR.jsp
|
||||
Description : 메시지 대량 발송 내역 상세
|
||||
Modification Information
|
||||
|
||||
수정일 수정자 수정내용
|
||||
------- -------- ---------------------------
|
||||
2024.04.17 이운산 최초 생성
|
||||
--%>
|
||||
|
||||
<script>
|
||||
$(document).ready(function () {
|
||||
|
||||
})
|
||||
|
||||
</script>
|
||||
<style>
|
||||
td.notify {
|
||||
text-align: center;
|
||||
}
|
||||
</style>
|
||||
<div id="birth-stats-popup" class="modal" style="max-width: 1024px;">
|
||||
<div class="modal-header">
|
||||
<h4>메시지 대량 발송 내역 보기 - 통계</h4>
|
||||
</div>
|
||||
<div class="modal-content">
|
||||
<div class="table-wrapper">
|
||||
<table class="table">
|
||||
<caption>해당 테이블에 대한 설명</caption>
|
||||
<%-- <colgroup>--%>
|
||||
<%-- <col style="width: 15%;">--%>
|
||||
<%-- <col style="width: 38%;">--%>
|
||||
<%-- <col style="width: 12%;">--%>
|
||||
<%-- <col style="width: 38%;">--%>
|
||||
<%-- </colgroup>--%>
|
||||
<tbody>
|
||||
<tr>
|
||||
<th>츨생년도</th>
|
||||
<th>성별</th>
|
||||
<th>클릭자 수</th>
|
||||
</tr>
|
||||
<c:forEach items="${ resultMap.clickBirthList}" var="clickBirth">
|
||||
<tr>
|
||||
<td>${clickBirth.birth}</td>
|
||||
<td>${clickBirth.sex}</td>
|
||||
<td>${clickBirth.pcnt}</td>
|
||||
</tr>
|
||||
</c:forEach>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
@@ -0,0 +1,59 @@
|
||||
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
|
||||
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
|
||||
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
|
||||
<%@ taglib prefix="ui" uri="http://www.winbit.kr/ctl/ui" %>
|
||||
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
|
||||
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
|
||||
<%@ page import="java.util.Date" %>
|
||||
<%--
|
||||
Class Name : MssageLgqySndngStatsR.jsp
|
||||
Description : 메시지 대량 발송 내역 상세
|
||||
Modification Information
|
||||
|
||||
수정일 수정자 수정내용
|
||||
------- -------- ---------------------------
|
||||
2024.04.17 이운산 최초 생성
|
||||
--%>
|
||||
|
||||
<script>
|
||||
$(document).ready(function () {
|
||||
|
||||
})
|
||||
|
||||
</script>
|
||||
<style>
|
||||
td.notify {
|
||||
text-align: center;
|
||||
}
|
||||
</style>
|
||||
<div id="ordr-stats-popup" class="modal" style="max-width: 1024px;">
|
||||
<div class="modal-header">
|
||||
<h4>메시지 대량 발송 내역 보기 - 통계</h4>
|
||||
</div>
|
||||
<div class="modal-content">
|
||||
<div class="table-wrapper">
|
||||
<table class="table">
|
||||
<caption>해당 테이블에 대한 설명</caption>
|
||||
<%-- <colgroup>--%>
|
||||
<%-- <col style="width: 15%;">--%>
|
||||
<%-- <col style="width: 38%;">--%>
|
||||
<%-- <col style="width: 12%;">--%>
|
||||
<%-- <col style="width: 38%;">--%>
|
||||
<%-- </colgroup>--%>
|
||||
<tbody>
|
||||
<tr>
|
||||
<th>시간</th>
|
||||
<th>구매자 수</th>
|
||||
</tr>
|
||||
<c:forEach items="${ resultMap.clickOrdrList}" var="clickBirth">
|
||||
<tr>
|
||||
<td>${clickBirth.birth}</td>
|
||||
<td>${clickBirth.sex}</td>
|
||||
</tr>
|
||||
</c:forEach>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
@@ -0,0 +1,874 @@
|
||||
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
|
||||
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
|
||||
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
|
||||
<%@ taglib prefix="ui" uri="http://www.winbit.kr/ctl/ui" %>
|
||||
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
|
||||
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
|
||||
<%@ taglib prefix="f" uri="/WEB-INF/tlds/f.tld" %>
|
||||
<%@ page import="java.util.Date" %>
|
||||
<%--
|
||||
Class Name : MssageLgqySndngRegistC.jsp
|
||||
Description : 이메일 수동 발송 폼
|
||||
Modification Information
|
||||
|
||||
수정일 수정자 수정내용
|
||||
------- -------- ---------------------------
|
||||
2024-02-28 리브가 최초 생성
|
||||
2024-04-05 이운산 수정
|
||||
--%>
|
||||
<script>
|
||||
filesTempArr = []; //파일 배열 초기화
|
||||
$(document).ready(function () {
|
||||
/*나이스셀렉트, 데이트피커*/
|
||||
fn_set_niceSelect_datePicker("#lgqyMssageSndngForm");
|
||||
// 기준일을 현재 날짜로 설정
|
||||
const today = new Date();
|
||||
$('#sndngReqstDate').datepicker().datepicker("setDate", today);
|
||||
//전화번호 포매팅
|
||||
$("#recpntDv").text(fn_format_mbtlnb($("#recpntDv").text().trim()));
|
||||
/********************************************
|
||||
* 대상 추출 관련
|
||||
********************************************/
|
||||
/**
|
||||
* 입력화면 토글
|
||||
*/
|
||||
$(".select-input-trigger").find("select").change(function () {
|
||||
const value = $(this).val();
|
||||
const currentContent = $(".select-input");
|
||||
currentContent.each(function () {
|
||||
if (value == $(this).attr("id")) {
|
||||
$(this).show();
|
||||
} else {
|
||||
$(this).hide();
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
//입력 구분 03 -> 직접 입력 관련
|
||||
//대상 추가 버튼
|
||||
$('#addBtn').on('click', function () {
|
||||
fn_list_up();
|
||||
});
|
||||
|
||||
//전체 삭제 버튼
|
||||
$('#removeOpt').on('click', function () {
|
||||
let directDiv = $('#directDiv');
|
||||
directDiv.find('div').remove();
|
||||
$("#lgqyMssageToList").val("");
|
||||
});
|
||||
|
||||
//삭제 버튼
|
||||
$(document).on("click",".btn_del", function () {
|
||||
const parentDiv = $(this).closest("div");
|
||||
|
||||
// [숫자] 인덱스 추출
|
||||
const text = parentDiv.text();
|
||||
const match = text.match(/^\[(\d+)\]/);
|
||||
|
||||
if (!match) {
|
||||
alert("삭제할 인덱스를 찾을 수 없습니다.");
|
||||
return;
|
||||
}
|
||||
const humanIndex = parseInt(match[1]); // 예: [4]
|
||||
|
||||
// 화면에서 div 제거
|
||||
parentDiv.remove();
|
||||
update_to_list();
|
||||
});
|
||||
|
||||
//입력 구분 04 -> 마케팅 검색 팝업 호출
|
||||
$("#marktSrchBtn").on("click",function(){
|
||||
fn_open_modal("#modalDiv","#marketing-trget-search","/mngr/mbr/selectMarketingTrgetSrchPopupForm");
|
||||
const selectShowTrigger = $(".select-show-trigger").find("select");
|
||||
selectShowTrigger.find("option:eq(0)").prop("selected", true)
|
||||
selectShowTrigger.niceSelect("update")
|
||||
});
|
||||
|
||||
/*********************************************
|
||||
* 문자 내용 관련
|
||||
*********************************************/
|
||||
//문자 내용 키업 이벤트 바인딩
|
||||
$("#sndngCn").keyup(function () {
|
||||
fn_cnt_byte();
|
||||
})
|
||||
|
||||
//고객센터 버튼
|
||||
$('#auto-callback').click(function () {
|
||||
$.ajax({
|
||||
type: "post",
|
||||
url: "<c:url value="/mngr/ntcn/mssage/selectShopNb"/>",
|
||||
success: function (data) {
|
||||
const str = JSON.parse(data.resBody.result);
|
||||
const smsAtmcSndngDsptchNb = str.shopNbMap.smsAtmcSndngDsptchNb;
|
||||
//제목
|
||||
if(fn_is_empty($("#sndngSj").val())){
|
||||
const addTitle = '(광고)' + str.shopNbMap.sopmalNm;
|
||||
$("#sndngSj").val(addTitle);
|
||||
}
|
||||
//내용
|
||||
let sndngCn = $("#sndngCn").val();
|
||||
const strCall = '■ 고객센터 : ' + smsAtmcSndngDsptchNb;
|
||||
const iVal = sndngCn.indexOf(strCall);
|
||||
if (iVal == -1) {
|
||||
sndngCn = sndngCn + '\r\n\r\n' + strCall;
|
||||
}
|
||||
$("#sndngCn").val(sndngCn);
|
||||
}
|
||||
})
|
||||
});
|
||||
|
||||
$('#auto-freedeny').click(function() {
|
||||
$.ajax({
|
||||
type: "post",
|
||||
url : "<c:url value="/mngr/ntcn/mssage/selectShopNb"/>",
|
||||
success:function(data) {
|
||||
const str = JSON.parse(data.resBody.result);
|
||||
const rejectTelnb = str.shopNbMap.rejectTelnb;
|
||||
|
||||
let sndngCn = $("#sndngCn").val();
|
||||
|
||||
const strFreedeny = '무료수신거부 : ' + rejectTelnb;
|
||||
const iVal = sndngCn.indexOf(strFreedeny);
|
||||
if(iVal == -1) {
|
||||
sndngCn = sndngCn + '\r\n\r\n\r\n\r\n' + strFreedeny;
|
||||
}
|
||||
|
||||
$("#sndngCn").val(sndngCn);
|
||||
}
|
||||
})
|
||||
});
|
||||
|
||||
//특수문자 버튼
|
||||
$("#special_cont").click(function(){
|
||||
if($("#special_view").css("display")=='none') $("#special_view").show();
|
||||
else $("#special_view").hide();
|
||||
});
|
||||
|
||||
//특수문자 css
|
||||
$("#special_view").find("td").css({
|
||||
"height" : "0px"
|
||||
})
|
||||
|
||||
//특수문자 입력
|
||||
$(".special_char").click(function(){
|
||||
const str = $("#sndngCn").val();
|
||||
$("#sndngCn").val(str+$(this).attr('conts'));
|
||||
});
|
||||
|
||||
//치환문자 클릭 이벤트
|
||||
$(".substBtn").on("click", function () {
|
||||
fn_set_substituon_in_texatarea(this, "tr", "sndngCn");
|
||||
});
|
||||
|
||||
//링크 클릭 이벤트
|
||||
$(".urlBtn").on("click", function () {
|
||||
let addStr = $(this).text();
|
||||
if (fn_is_empty($(this).closest("div").find(".subst").val())) {
|
||||
alert(addStr + "의 url 주소 값을 넣어주세요.");
|
||||
return false;
|
||||
}
|
||||
let existingVal = $("#sndngCn").val();
|
||||
if(addStr === '랜딩 페이지 URL'){
|
||||
addStr = '#'+"{linkUrl1}";
|
||||
}
|
||||
existingVal = existingVal.replace(/\s+$/, '') + " " + addStr;
|
||||
$("#sndngCn").val(existingVal);
|
||||
});
|
||||
|
||||
$(".message-send").css({
|
||||
"gap" : "100px",
|
||||
"grid-template-columns" : "50% 50%"
|
||||
})
|
||||
|
||||
|
||||
$("#qry-show-btn").on("click", function (){
|
||||
$("#sndngQry").toggle();
|
||||
})
|
||||
});
|
||||
|
||||
/*************************************************
|
||||
대상 추출 관련
|
||||
*************************************************/
|
||||
/* 순서
|
||||
* 1. 데이터 정제 (대상 : 추가 목록)
|
||||
* 2. 화면 조작 (대상 : 대상자 목록)
|
||||
* */
|
||||
if(typeof fn_list_up === 'undefined'){
|
||||
function fn_list_up() {
|
||||
//1.
|
||||
//1-1 데이터 가져오기
|
||||
let input = $('#inputData').val().trim();
|
||||
|
||||
//1-2 \n 구분자로 대상자 배열 생성
|
||||
const lines = input.split('\n').filter(line => $.trim(line) !== /\s/);
|
||||
|
||||
//1-3 JSON 객체 배열 생성
|
||||
let deny = "N";
|
||||
//휴대폰 validation regex
|
||||
const numRegex = /^[0-9]*$/;
|
||||
const jsonArray = lines.map((line, index) => {
|
||||
const parts = line.trim().split('|');
|
||||
parts[0] = parts[0].replaceAll('-', '');
|
||||
//휴대폰 validation
|
||||
//휴대폰 번호가 숫자외 것 들이 있거나, 11자리가 아닐때 추가 x
|
||||
if (!numRegex.test(parts[0]) || parts[0].length != 11) {
|
||||
deny = "Y";
|
||||
return false;
|
||||
} else {
|
||||
return {
|
||||
mbtlnb: parts [0], // 고유 ID (선택 사항)
|
||||
nm: parts[1], // 줄 내용을 객체에 저장
|
||||
mbrId: parts[2], // 줄 내용을 객체에 저장
|
||||
substChr1: parts[3] || '',
|
||||
substChr2: parts[4] || '',
|
||||
substChr3: parts[5] || '',
|
||||
substChr4: parts[6] || '',
|
||||
substChr5: parts[7] || '',
|
||||
};
|
||||
}
|
||||
});
|
||||
|
||||
// 결과 출력
|
||||
if (deny == 'Y') {
|
||||
alert("잘못된 휴대폰 양식이 포함되어있습니다.");
|
||||
return false;
|
||||
} else {
|
||||
|
||||
//2. 화면조작
|
||||
const directDiv = $("#directDiv");
|
||||
|
||||
//2-1중복삭제
|
||||
directDiv.children("div").each(function () {
|
||||
let directTarget = $(this);
|
||||
jsonArray.forEach(function (item) {
|
||||
let format = `\${item.mbtlnb}|\${item.nm}|\${item.mbrId}|\${item.substChr1}|\${item.substChr2}|\${item.substChr3}|\${item.substChr4}|\${item.substChr5}`;
|
||||
if (directTarget.text().trim().indexOf(format) > 0) {
|
||||
directTarget.remove(); //화면 삭제
|
||||
$(this).remove(); //데이터 삭제
|
||||
}
|
||||
})
|
||||
});
|
||||
|
||||
//2-2 대상자 목록 화면 추가
|
||||
jsonArray.forEach((item, index) => {
|
||||
//로우 html 생성
|
||||
const newDiv = $("<div class='trgtDiv'></div>")
|
||||
.text(`[0]\${item.mbtlnb}|\${item.nm || ''}|\${item.mbrId || ''}|`
|
||||
+ `\${item.substChr1 || ''}|\${item.substChr2 || ''}|`
|
||||
+ `\${item.substChr3 || ''}|\${item.substChr4 || ''}|\${item.substChr5 || ''} `);
|
||||
|
||||
const delBtn = $("<button>삭제</button>")
|
||||
.attr("type", "button")
|
||||
.addClass("under_line btn_del")
|
||||
.css("cursor", "pointer")
|
||||
|
||||
newDiv.append(delBtn).append("<br>");
|
||||
|
||||
directDiv.append(newDiv);
|
||||
});
|
||||
|
||||
//2-3 리스트 업데이트
|
||||
update_to_list();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//sms_to 타겟 초기화 함수
|
||||
if (typeof fn_select_target_list === 'undefined') {
|
||||
function fn_select_target_list () {
|
||||
const result = [];
|
||||
$("#directDiv").find("div").each(function () {
|
||||
const text = $(this).text().trim();
|
||||
const cleaned = text.replace(/^\[\d+\]/, '').replace('삭제', '').trim();
|
||||
const parts = cleaned.split('|');
|
||||
|
||||
if (parts.length === 8) {
|
||||
const [mbtlnb, nm, mbrId, substChr1, substChr2, substChr3, substChr4, substChr5] = parts;
|
||||
result.push({mbtlnb, nm, mbrId, substChr1, substChr2, substChr3, substChr4, substChr5});
|
||||
}
|
||||
});
|
||||
|
||||
const jsonString = JSON.stringify(result);
|
||||
|
||||
$("#lgqyMssageToList").val(jsonString);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//인덱스 번호, 총 건 수 갱신
|
||||
if (typeof update_to_list === 'undefined') {
|
||||
function update_to_list() {
|
||||
// 번호 재설정
|
||||
var no = 1;
|
||||
$("#directDiv .trgtDiv").each(function () {
|
||||
const html = $(this).html();
|
||||
const updatedHtml = html.replace(/^\[\d+\]/, "[" + no + "]");
|
||||
$(this).html(updatedHtml);
|
||||
no++;
|
||||
});
|
||||
no = fn_format_comma(no - 1);
|
||||
$("#no").text(no);
|
||||
}
|
||||
}
|
||||
|
||||
/**************************************************************
|
||||
* 바이트 수 체크
|
||||
****************************************************************/
|
||||
if (typeof fn_cnt_byte === 'undefined') {
|
||||
function fn_cnt_byte() {
|
||||
let str = $("#sndngCn").val();
|
||||
let str_len = str.length;
|
||||
//미리보기 입력처리
|
||||
$("#previewCn").val(str);
|
||||
|
||||
let rbyte = 0;
|
||||
let rlen = 0;
|
||||
let one_char = "";
|
||||
//byte수 세기
|
||||
for (let i = 0; i < str_len; i++) {
|
||||
one_char = str.charAt(i);
|
||||
if (escape(one_char).length > 4) {
|
||||
//한글3Byte
|
||||
rbyte += 3;
|
||||
} else {
|
||||
//영문 등 나머지 1Byte
|
||||
rbyte++;
|
||||
}
|
||||
}
|
||||
|
||||
//바이트 표시
|
||||
$('.byteCnt').text(rbyte);
|
||||
|
||||
if (rbyte > 90) {
|
||||
$('.sndng-type').text("(LMS)")
|
||||
} else {
|
||||
$('.sndng-type').text("(SMS)")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/***********************************************************
|
||||
* 발송 등록
|
||||
* *********************************************************/
|
||||
if (typeof fn_sndng_lgqy_mssage === 'undefined') {
|
||||
function fn_sndng_lgqy_mssage () {
|
||||
const sndngDvCd = $("#sndngDvCd").val();
|
||||
|
||||
if (sndngDvCd == "") {
|
||||
alert("발송 구분 선택을 하신 후 등록해주세요.");
|
||||
return false;
|
||||
}
|
||||
|
||||
const brandCd = $("#brandCd").val();
|
||||
|
||||
if (brandCd == "") {
|
||||
alert("브랜드 구분 선택을 하신 후 등록해주세요.");
|
||||
return false;
|
||||
}
|
||||
|
||||
if ($("#sndngDvCd").val() === 'select-input-03') {
|
||||
//대상자 추출
|
||||
fn_select_target_list();
|
||||
const lgqyMssageToList = $("#lgqyMssageToList").val();
|
||||
const parseToList = JSON.parse(lgqyMssageToList);
|
||||
if (parseToList.length === 0) {
|
||||
alert("대상자 입력을 하신 후 등록해주세요.")
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
if (fn_is_empty($("#sndngCndParam").val())) {
|
||||
alert("마케팅 대상 조건을 설정해주세요.");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
const sndngSj = $("#sndngSj").val();
|
||||
|
||||
if (sndngSj == "") {
|
||||
alert("발송 제목을 입력하신 후 등록해주세요.");
|
||||
return false;
|
||||
}
|
||||
|
||||
const sndngCn = $("#sndngCn").val();
|
||||
|
||||
if (sndngCn == "") {
|
||||
alert('문자내용은 필수입니다.');
|
||||
return false;
|
||||
}
|
||||
|
||||
if (sndngCn.indexOf("고객센터") == -1) {
|
||||
alert('문자 내용에 고객센터 번호가 누락되었습니다.\n광고문자 발송시 고객센터 번호는 필수입니다.');
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
if (sndngCn.indexOf("수신거부") == -1) {
|
||||
alert('문자 내용에 수신거부 번호가 누락되었습니다.\n광고문자 발송시 수신거부 번호는 필수입니다.');
|
||||
return false;
|
||||
}
|
||||
|
||||
const requsrNm = $("#requsrNm").val();
|
||||
|
||||
if (requsrNm == "") {
|
||||
alert('요청자 이름을 입력하세요.');
|
||||
$("#requsrNm").focus();
|
||||
return false;
|
||||
}
|
||||
|
||||
//날짜처리
|
||||
const date = $("#sndngReqstDate").val();
|
||||
const hour = $("#sndngReqstHour").val();
|
||||
const min = $("#sndngReqstMin").val();
|
||||
|
||||
if (date == "" || hour == "" || min == "") {
|
||||
alert("발송 시간 설정을 하신 후 등록해주세요.")
|
||||
return false;
|
||||
}
|
||||
|
||||
//발송 가능 시간
|
||||
const bgntme = $("#smsAtmcSndngLmttBgntme").val()
|
||||
const endtme = $("#smsAtmcSndngLmttEndtme").val()
|
||||
|
||||
const bgntmeNum = parseInt(bgntme, 10)
|
||||
const endtmeNum = parseInt(endtme, 10);
|
||||
|
||||
//예약시간
|
||||
const resveTme = (hour < 10 ? '0' : '') + hour
|
||||
+ min;
|
||||
const resveTmeNum = parseInt(resveTme, 10);
|
||||
|
||||
if (resveTmeNum >= bgntmeNum && resveTmeNum <= endtmeNum) {
|
||||
} else {
|
||||
alert("발송 시간이 아닙니다.");
|
||||
return false;
|
||||
}
|
||||
|
||||
const select_date = date + ' ' + hour + ':' + min + ':00';
|
||||
|
||||
$("#sndngReqstDt").val(select_date);
|
||||
|
||||
let dataStr = $("#lgqyMssageSndngForm").serialize();
|
||||
|
||||
if (confirm('발송 정보를 저장하시겠습니까?')) {
|
||||
|
||||
$.ajax({
|
||||
type: "post",
|
||||
url: "<c:url value="/mngr/ntcn/lgqymssage/insertMssageLgqySndngRegist"/>",
|
||||
data: dataStr,
|
||||
success: function (data) {
|
||||
const str = JSON.parse(data.resBody.result);
|
||||
if (str.result == "success") {
|
||||
alert('<spring:message code="success.common.insert"/>');
|
||||
let smsLgqySndngInnb = str.smsLgqySndngInnb;
|
||||
location.href = "/mngr/ntcn/lgqymssage/selectMssageLgqySndngUpdtInqire?srchSmsLgqySndngInnb=" + smsLgqySndngInnb;
|
||||
} else {
|
||||
alert('<spring:message code="fail.common.insert"/>');
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
};
|
||||
}
|
||||
/***********************************************************
|
||||
* 발송요청 날짜 확인
|
||||
* *********************************************************/
|
||||
if (typeof fn_set_res_min === 'undefined') {
|
||||
function fn_set_res_min() {
|
||||
|
||||
const date = $("#sndngReqstDate");
|
||||
const hour = $("#sndngReqstHour");
|
||||
const min = $("#sndngReqstMin");
|
||||
|
||||
if (date.val() == undefined) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (hour.val() == undefined) {
|
||||
return false;
|
||||
}
|
||||
|
||||
const select_date = date.val() + ' ' + hour.val() + ':' + min.val() + ':00';
|
||||
|
||||
$.ajax({
|
||||
type: "post",
|
||||
url: "<c:url value="/mngr/ntcn/lgqymssage/selectMssageLgqySndngReqstDtInqire"/>",
|
||||
data: {srchSndngReqstDt: select_date},
|
||||
success: function (data) {
|
||||
const str = JSON.parse(data.resBody.result);
|
||||
if (str.totCnt > 0) {
|
||||
alert('문자발송이 이미 요청 되어 있습니다. 다른 시간으로 요청해주세요.');
|
||||
$("#sndngReqstMin option:selected").prop("disabled", true);
|
||||
$("#sndngReqstMin option:selected").prop("selected", false);
|
||||
}
|
||||
}
|
||||
})
|
||||
$("#div_item").resizable().draggable();
|
||||
}
|
||||
}
|
||||
</script>
|
||||
<section class="content-section">
|
||||
<form id="lgqyMssageSndngForm">
|
||||
<input type="hidden" id="smsAtmcSndngLmttBgntme" value="<c:out value='${resultMap.shopInfoMap.smsAtmcSndngLmttBgntme}'/>"/>
|
||||
<input type="hidden" id="smsAtmcSndngLmttEndtme" value="<c:out value='${resultMap.shopInfoMap.smsAtmcSndngLmttEndtme}'/>"/>
|
||||
<h3 class="content-section__title">메시지 대량 발송 양식</h3>
|
||||
<div class="table-wrapper">
|
||||
<table class="table">
|
||||
<caption>해당 테이블에 대한 설명</caption>
|
||||
<colgroup>
|
||||
<col style="width: 12%;">
|
||||
<col>
|
||||
</colgroup>
|
||||
<tbody>
|
||||
<tr>
|
||||
<th>발신 번호</th>
|
||||
<td>
|
||||
<input type = "hidden" name = "recpntDv" value = "<c:out value = "${resultMap.shopInfoMap.smsAtmcSndngDsptchNb}"/>"/>
|
||||
<div class="td-inner" id="recpntDv">
|
||||
<c:out value="${resultMap.shopInfoMap.smsAtmcSndngDsptchNb}"/>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>
|
||||
입력구분
|
||||
</th>
|
||||
<td>
|
||||
<div class="select-box select-input-trigger">
|
||||
<select title="발송구분" name="sndngDvCd" id="sndngDvCd">
|
||||
<c:forEach var="sndngDv" items="${resultMap.sndngDvList }" varStatus="status">
|
||||
<option value="select-input-${sndngDv.cd}">${sndngDv.cdNm}</option>
|
||||
</c:forEach>
|
||||
</select>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>대상 추출</th>
|
||||
<td>
|
||||
<div class="td-inner">
|
||||
<div class="select-input" id="select-input-03">
|
||||
<p class="blue-7">대상 양식 : 휴대폰번호('-'없이,필수*)|이름|아이디|치환코드1|치환코드2|치환코드3|치환코드4|치환코드5</p>
|
||||
<div class="board-setting">
|
||||
<div class="board-setting__left">
|
||||
<h5 class="board-setting__title">대상자 추가 목록</h5>
|
||||
<textarea id="inputData" rows="5" cols="25" style="overflow:scroll; width:500px; height:500px;"></textarea>
|
||||
<button type="button" class="btn xsm gray" id="addBtn">대상추가</button>
|
||||
</div>
|
||||
<div class="board-setting__right">
|
||||
<span class="board-setting__title">발송 대상자 목록 : 총 </span><span class="board-setting__title" id="no">0</span><span class="board-setting__title">명</span>
|
||||
<div id="directDiv" style="overflow:scroll; width:500px;
|
||||
height:500px; padding:10px; font-size: 12px;">
|
||||
</div>
|
||||
<input type="hidden" name="lgqyMssageToList" id="lgqyMssageToList" value="[]">
|
||||
<button type="button" class="btn xsm dark" id="removeOpt">전체 삭제</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="select-input " id="select-input-04" style="display: none">
|
||||
<input type="hidden" id="sndngCndParam" name="sndngCndParam"/>
|
||||
<input type="hidden" id="allCnt" name="allCnt"/>
|
||||
<button type="button" id="marktSrchBtn"
|
||||
class="btn xsm primary" title="마케팅 대상 검색">마케팅 대상
|
||||
</button>
|
||||
(예상) <span id="targetMbrCnt">0</span>명
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>발송 제목</th>
|
||||
<td>
|
||||
<div class="td-inner">
|
||||
<input class="input-text xl" type="text" title="발송제목" name="sndngSj" id="sndngSj"
|
||||
placeholder="">
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>문자 내용</th>
|
||||
<td>
|
||||
<div class="td-inner vertical">
|
||||
<div class="message-send">
|
||||
<div class="message-send__left sms-manage">
|
||||
<div class="form-control-container">
|
||||
<div class="left">
|
||||
<h3 class="content-section__inner-title mb-0">내용 입력
|
||||
</h3>
|
||||
</div>
|
||||
<div class="center">
|
||||
</div>
|
||||
<div class="right">
|
||||
<button class="btn xsm outline" id="auto-callback" type="button">고객센터 추가</button>
|
||||
<button class="btn xsm outline" id="auto-freedeny" type="button">수신거부 추가</button>
|
||||
<a href="#subst-pop" rel="modal:open" class="btn sm outline">
|
||||
<i class="icon icon_info"></i>
|
||||
치환 코드
|
||||
</a>
|
||||
<button class="btn xsm gray" id="special_cont" type="button">특수문자</button>
|
||||
<div id="special_view" style="position: absolute; z-index: 100; margin-left: 880px; margin-top: -250px; border: 2px solid rgb(170, 170, 170); padding: 3px; background-color: rgb(255, 255, 255); display: none;">
|
||||
<table cellpadding="5" cellspacing="1" border="0" width="100%">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td align="center"><span class="special_char" conts="#" style="font-size:10px;cursor:pointer;">#</span></td>
|
||||
<td align="center"><span class="special_char" conts="&" style="font-size:10px;cursor:pointer;">&</span></td>
|
||||
<td align="center"><span class="special_char" conts="*" style="font-size:10px;cursor:pointer;">*</span></td>
|
||||
<td align="center"><span class="special_char" conts="@" style="font-size:10px;cursor:pointer;">@</span></td>
|
||||
<td align="center"><span class="special_char" conts="§" style="font-size:10px;cursor:pointer;">§</span></td>
|
||||
<td align="center"><span class="special_char" conts="※" style="font-size:10px;cursor:pointer;">※</span></td>
|
||||
<td align="center"><span class="special_char" conts="☆" style="font-size:10px;cursor:pointer;">☆</span></td>
|
||||
<td align="center"><span class="special_char" conts="★" style="font-size:10px;cursor:pointer;">★</span></td>
|
||||
<td align="center"><span class="special_char" conts="○" style="font-size:10px;cursor:pointer;">○</span></td>
|
||||
<td align="center"><span class="special_char" conts="●" style="font-size:10px;cursor:pointer;">●</span></td>
|
||||
<td align="center"><span class="special_char" conts="◎" style="font-size:10px;cursor:pointer;">◎</span></td>
|
||||
<td align="center"><span class="special_char" conts="◇" style="font-size:10px;cursor:pointer;">◇</span></td>
|
||||
<td align="center"><span class="special_char" conts="◆" style="font-size:10px;cursor:pointer;">◆</span></td>
|
||||
<td align="center"><span class="special_char" conts="□" style="font-size:10px;cursor:pointer;">□</span></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center"><span class="special_char" conts="■" style="font-size:10px;cursor:pointer;">■</span></td>
|
||||
<td align="center"><span class="special_char" conts="△" style="font-size:10px;cursor:pointer;">△</span></td>
|
||||
<td align="center"><span class="special_char" conts="▲" style="font-size:10px;cursor:pointer;">▲</span></td>
|
||||
<td align="center"><span class="special_char" conts="▽" style="font-size:10px;cursor:pointer;">▽</span></td>
|
||||
<td align="center"><span class="special_char" conts="▼" style="font-size:10px;cursor:pointer;">▼</span></td>
|
||||
<td align="center"><span class="special_char" conts="→" style="font-size:10px;cursor:pointer;">→</span></td>
|
||||
<td align="center"><span class="special_char" conts="←" style="font-size:10px;cursor:pointer;">←</span></td>
|
||||
<td align="center"><span class="special_char" conts="↑" style="font-size:10px;cursor:pointer;">↑</span></td>
|
||||
<td align="center"><span class="special_char" conts="↓" style="font-size:10px;cursor:pointer;">↓</span></td>
|
||||
<td align="center"><span class="special_char" conts="↔" style="font-size:10px;cursor:pointer;">↔</span></td>
|
||||
<td align="center"><span class="special_char" conts="〓" style="font-size:10px;cursor:pointer;">〓</span></td>
|
||||
<td align="center"><span class="special_char" conts="◁" style="font-size:10px;cursor:pointer;">◁</span></td>
|
||||
<td align="center"><span class="special_char" conts="◀" style="font-size:10px;cursor:pointer;">◀</span></td>
|
||||
<td align="center"><span class="special_char" conts="▷" style="font-size:10px;cursor:pointer;">▷</span></td>
|
||||
<td align="center"><span class="special_char" conts="▶" style="font-size:10px;cursor:pointer;">▶</span></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center"><span class="special_char" conts="♤" style="font-size:10px;cursor:pointer;">♤</span></td>
|
||||
<td align="center"><span class="special_char" conts="♠" style="font-size:10px;cursor:pointer;">♠</span></td>
|
||||
<td align="center"><span class="special_char" conts="♡" style="font-size:10px;cursor:pointer;">♡</span></td>
|
||||
<td align="center"><span class="special_char" conts="♥" style="font-size:10px;cursor:pointer;">♥</span></td>
|
||||
<td align="center"><span class="special_char" conts="♧" style="font-size:10px;cursor:pointer;">♧</span></td>
|
||||
<td align="center"><span class="special_char" conts="♣" style="font-size:10px;cursor:pointer;">♣</span></td>
|
||||
<td align="center"><span class="special_char" conts="⊙" style="font-size:10px;cursor:pointer;">⊙</span></td>
|
||||
<td align="center"><span class="special_char" conts="◈" style="font-size:10px;cursor:pointer;">◈</span></td>
|
||||
<td align="center"><span class="special_char" conts="▣" style="font-size:10px;cursor:pointer;">▣</span></td>
|
||||
<td align="center"><span class="special_char" conts="◐" style="font-size:10px;cursor:pointer;">◐</span></td>
|
||||
<td align="center"><span class="special_char" conts="◑" style="font-size:10px;cursor:pointer;">◑</span></td>
|
||||
<td align="center"><span class="special_char" conts="▒" style="font-size:10px;cursor:pointer;">▒</span></td>
|
||||
<td align="center"><span class="special_char" conts="▤" style="font-size:10px;cursor:pointer;">▤</span></td>
|
||||
<td align="center"><span class="special_char" conts="▥" style="font-size:10px;cursor:pointer;">▥</span></td>
|
||||
<td align="center"><span class="special_char" conts="▨" style="font-size:10px;cursor:pointer;">▨</span></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center"><span class="special_char" conts="▧" style="font-size:10px;cursor:pointer;">▧</span></td>
|
||||
<td align="center"><span class="special_char" conts="▦" style="font-size:10px;cursor:pointer;">▦</span></td>
|
||||
<td align="center"><span class="special_char" conts="▩" style="font-size:10px;cursor:pointer;">▩</span></td>
|
||||
<td align="center"><span class="special_char" conts="♨" style="font-size:10px;cursor:pointer;">♨</span></td>
|
||||
<td align="center"><span class="special_char" conts="☏" style="font-size:10px;cursor:pointer;">☏</span></td>
|
||||
<td align="center"><span class="special_char" conts="☎" style="font-size:10px;cursor:pointer;">☎</span></td>
|
||||
<td align="center"><span class="special_char" conts="☜" style="font-size:10px;cursor:pointer;">☜</span></td>
|
||||
<td align="center"><span class="special_char" conts="☞" style="font-size:10px;cursor:pointer;">☞</span></td>
|
||||
<td align="center"><span class="special_char" conts="¶" style="font-size:10px;cursor:pointer;">¶</span></td>
|
||||
<td align="center"><span class="special_char" conts="†" style="font-size:10px;cursor:pointer;">†</span></td>
|
||||
<td align="center"><span class="special_char" conts="‡" style="font-size:10px;cursor:pointer;">‡</span></td>
|
||||
<td align="center"><span class="special_char" conts="↕" style="font-size:10px;cursor:pointer;">↕</span></td>
|
||||
<td align="center"><span class="special_char" conts="↗" style="font-size:10px;cursor:pointer;">↗</span></td>
|
||||
<td align="center"><span class="special_char" conts="↙" style="font-size:10px;cursor:pointer;">↙</span></td>
|
||||
<td align="center"><span class="special_char" conts="↖" style="font-size:10px;cursor:pointer;">↖</span></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center"><span class="special_char" conts="↘" style="font-size:10px;cursor:pointer;">↘</span></td>
|
||||
<td align="center"><span class="special_char" conts="♭" style="font-size:10px;cursor:pointer;">♭</span></td>
|
||||
<td align="center"><span class="special_char" conts="♩" style="font-size:10px;cursor:pointer;">♩</span></td>
|
||||
<td align="center"><span class="special_char" conts="♪" style="font-size:10px;cursor:pointer;">♪</span></td>
|
||||
<td align="center"><span class="special_char" conts="♬" style="font-size:10px;cursor:pointer;">♬</span></td>
|
||||
<td align="center"><span class="special_char" conts="㉿" style="font-size:10px;cursor:pointer;">㉿</span></td>
|
||||
<td align="center"><span class="special_char" conts="㈜" style="font-size:10px;cursor:pointer;">㈜</span></td>
|
||||
<td align="center"><span class="special_char" conts="№" style="font-size:10px;cursor:pointer;">№</span></td>
|
||||
<td align="center"><span class="special_char" conts="㏇" style="font-size:10px;cursor:pointer;">㏇</span></td>
|
||||
<td align="center"><span class="special_char" conts="™" style="font-size:10px;cursor:pointer;">™</span></td>
|
||||
<td align="center"><span class="special_char" conts="㏂" style="font-size:10px;cursor:pointer;">㏂</span></td>
|
||||
<td align="center"><span class="special_char" conts="㏘" style="font-size:10px;cursor:pointer;">㏘</span></td>
|
||||
<td align="center"><span class="special_char" conts="℡" style="font-size:10px;cursor:pointer;">℡</span></td>
|
||||
<td align="center"><span class="special_char" conts="?" style="font-size:10px;cursor:pointer;">?</span></td>
|
||||
<td align="center"><span class="special_char" conts="ª" style="font-size:10px;cursor:pointer;">ª</span></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center"><span class="special_char" conts="º" style="font-size:10px;cursor:pointer;">º</span></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<textarea class="textarea" title="에디터 입력" cols="30" id="sndngCn" name="sndngCn" style="height: 230px;"
|
||||
rows="15"></textarea>
|
||||
<div class="sms-manage__byte">
|
||||
<span class="byteCnt">0</span><span> / 2000</span>
|
||||
<span class="gray-10 sndng-type">(SMS)</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<p style="font-weight: bold;">안내사항</p>
|
||||
<p>1) 문자 내용에 고객센터 번호, 무료수신거부 번호는 필수로 입력되어야 합니다.</p>
|
||||
<p>2) 특수문자 사용 : 특수문자 버튼을 클릭하여 작성하셔야 문자깨짐 및 짤림현상을 예방할 수 있습니다.</p>
|
||||
<p>
|
||||
3) 이벤트 페이지 : 대량메세지 이벤트 게시판 내 상세보기에서 URL 주소를 복사해 아래 주소란에 입력합니다.
|
||||
<a class="under-line blue-7" href="/mngr/bbs/gnrlsctt/selectBbscttListInqireForm?bbsId=largeLMS_event" target="_blank">>> 게시판 바로가기</a>
|
||||
</p>
|
||||
<p>4) URL 치환문자 : 적용 필요시 해당 URL버튼을 클릭합니다.</p>
|
||||
<div class="mt-10" style="width:800px;">
|
||||
<button type="button" class="blue-7 urlBtn">#{linkUrl1}</button> :
|
||||
<input class="input-text xl subst" type="text"
|
||||
title="해당 인풋에 대한 설명" placeholder="URL 주소1" name="linkUrl1">
|
||||
</div>
|
||||
<div class="mt-10" style="width:800px;">
|
||||
<button type="button" class="blue-7 urlBtn">#{linkUrl2}</button> :
|
||||
<input class="input-text xl subst" type="text"
|
||||
title="해당 인풋에 대한 설명" placeholder="URL 주소2" name="linkUrl2">
|
||||
</div>
|
||||
<div class="mt-10" style="width:800px;">
|
||||
<button type="button" class="blue-7 urlBtn">#{linkUrl3}</button> :
|
||||
<input class="input-text xl subst" type="text"
|
||||
title="해당 인풋에 대한 설명" placeholder="URL 주소3" name="linkUrl3">
|
||||
</div>
|
||||
<div class="gray-7">
|
||||
<p class="fyi">‘정보통신망이용 촉진 및 정보 보호 등의 관한 법률 및 시행령’에 따라 광고 전송 시 제목에 (광고)를 표시해야 합니다.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>발송 시간</th>
|
||||
<td>
|
||||
<div class="td-inner vertical">
|
||||
<div class="input-container gap-4">
|
||||
<input type="hidden" id="sndngReqstDt" name="sndngReqstDt">
|
||||
<input type="text" id="sndngReqstDate" class="datepicker"
|
||||
title="시작 날짜 선택" autocomplete="off" name="sndngReqstDate">
|
||||
<div class="select-box">
|
||||
<select class="short" title="해당 셀렉트에 대한 설명" id="sndngReqstHour">
|
||||
<option value="">시간</option>
|
||||
<c:forEach var="time" begin="${resultMap.bgntme}"
|
||||
end="${resultMap.endtme}">
|
||||
<c:choose>
|
||||
<c:when test="${time lt 10}">
|
||||
<c:set var="formattedTme" value="0${time}"/>
|
||||
</c:when>
|
||||
<c:otherwise>
|
||||
<c:set var="formattedTme" value="${time}"/>
|
||||
</c:otherwise>
|
||||
</c:choose>
|
||||
<option value="${formattedTme}">
|
||||
${time}시
|
||||
</option>
|
||||
</c:forEach>
|
||||
</select>
|
||||
</div>
|
||||
<div class="select-box">
|
||||
<select class="short" title="해당 셀렉트에 대한 설명" id="sndngReqstMin"
|
||||
onchange="fn_set_res_min();">
|
||||
<option value="">분</option>
|
||||
<option value="00">00분</option>
|
||||
<option value="30">30분</option>
|
||||
<%--<c:forEach var="min" begin="00" end="50" step="10">
|
||||
<c:choose>
|
||||
<c:when test="${min lt 10}">
|
||||
<c:set var="formattedMin" value="0${min}"/>
|
||||
</c:when>
|
||||
<c:otherwise>
|
||||
<c:set var="formattedMin" value="${min}"/>
|
||||
</c:otherwise>
|
||||
</c:choose>
|
||||
<option value="${formattedMin}"
|
||||
${f:setSelected(resultMap.boCtrlMap.sndngReqstMinute, formattedMin)}>
|
||||
${formattedMin}분
|
||||
</option>
|
||||
</c:forEach>--%>
|
||||
</select>
|
||||
</div>
|
||||
<span>부터 순차적으로 발송합니다.</span>
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>요청자</th>
|
||||
<td>
|
||||
<div class="td-inner">
|
||||
<input class="input-text xl" type="text" title="요청자" id="requsrNm" name="requsrNm" value="<c:out value="${resultMap.userNm}"/>"
|
||||
placeholder="">
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</form>
|
||||
</section>
|
||||
<!-- 치환코드 모달 -->
|
||||
<div id="subst-pop" class="modal" style="max-width: 400px;">
|
||||
<div class="modal-header">
|
||||
<h4>사용 가능한 치환코드</h4>
|
||||
</div>
|
||||
<div class="modal-content">
|
||||
<div class="table-wrapper">
|
||||
<table class="table vertical tight">
|
||||
<caption>해당 테이블에 대한 설명</caption>
|
||||
<colgroup>
|
||||
<col style="width: 33%;">
|
||||
<col>
|
||||
</colgroup>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>치환코드</th>
|
||||
<th>설명</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td class="subst">#{nm}</td>
|
||||
<td><button type="button" class="blue-7 substBtn">사용자명</button></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="subst">#{mbrId}</td>
|
||||
<td><button type="button" class="blue-7 substBtn">아이디</button></td>
|
||||
</tr>
|
||||
<tr class="sndngDv">
|
||||
<td class="subst">#{substChr1}</td>
|
||||
<td>
|
||||
<button type="button" class="blue-7 substBtn">치환코드1</button>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="sndngDv">
|
||||
<td class="subst">#{substChr2}</td>
|
||||
<td>
|
||||
<button type="button" class="blue-7 substBtn">치환코드2</button>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="sndngDv">
|
||||
<td class="subst">#{substChr3}</td>
|
||||
<td>
|
||||
<button type="button" class="blue-7 substBtn">치환코드3</button>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="sndngDv">
|
||||
<td class="subst">#{substChr4}</td>
|
||||
<td>
|
||||
<button type="button" class="blue-7 substBtn">치환코드4</button>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="sndngDv">
|
||||
<td class="subst">#{substChr5}</td>
|
||||
<td>
|
||||
<button type="button" class="blue-7 substBtn">치환코드5</button>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="modalDiv"></div>
|
||||
@@ -0,0 +1,71 @@
|
||||
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
|
||||
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
|
||||
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
|
||||
<%@ taglib prefix="ui" uri="http://www.winbit.kr/ctl/ui" %>
|
||||
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
|
||||
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
|
||||
<%@ page import="java.util.Date" %>
|
||||
<%--
|
||||
Class Name : MssageLgqySndngReqstCldrPopupR.jsp
|
||||
Description : 메시지 대량 발송 요청 달력
|
||||
Modification Information
|
||||
|
||||
수정일 수정자 수정내용
|
||||
------- -------- ---------------------------
|
||||
2024.04.17 이운산 최초 생성
|
||||
--%>
|
||||
|
||||
<script>
|
||||
$(document).ready(function () {
|
||||
|
||||
})
|
||||
|
||||
</script>
|
||||
<div id="mssageLgqySndngReqstCldrPopup" class="modal" style="max-width: 500px;">
|
||||
<div class="modal-header">
|
||||
<h4>발송 요청 일정 달력</h4>
|
||||
</div>
|
||||
<div class="modal-content">
|
||||
<div class="table-wrapper">
|
||||
<table class="table vertical">
|
||||
<caption>해당 테이블에 대한 설명</caption>
|
||||
<colgroup>
|
||||
<col style="width: 12%;">
|
||||
<col style="width: 50%;">
|
||||
<col style="width: auto">
|
||||
</colgroup>
|
||||
<tbody>
|
||||
<tr>
|
||||
<th>발송번호</th>
|
||||
<th>요청일시</th>
|
||||
<th>브랜드</th>
|
||||
</tr>
|
||||
<c:choose>
|
||||
<c:when test="${not empty resultMap.sndngReqstCldr.cldrList}">
|
||||
<c:forEach var="sndngReqstCldr" items="${resultMap.sndngReqstCldr.cldrList }" varStatus="status">
|
||||
<tr>
|
||||
<td>
|
||||
<c:out value="${ sndngReqstCldr.smsLgqySndngInnb }"/>
|
||||
</td>
|
||||
<td>
|
||||
<fmt:parseDate value="${sndngReqstCldr.sndngReqstDt}" pattern="yyyy-MM-dd'T'HH:mm" var="date"/>
|
||||
<fmt:formatDate value="${date }" var="formattedDt" pattern="yyyy-MM-dd HH:mm"/>
|
||||
<c:out value="${formattedDt}"/>
|
||||
</td>
|
||||
<td>
|
||||
<c:out value="${ sndngReqstCldr.brandNm}"/>
|
||||
</td>
|
||||
</tr>
|
||||
</c:forEach>
|
||||
</c:when>
|
||||
<c:otherwise>
|
||||
<tr>
|
||||
<td colspan="100%"><spring:message code="common.nodata"/></td>
|
||||
</tr>
|
||||
</c:otherwise>
|
||||
</c:choose>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -0,0 +1,205 @@
|
||||
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
|
||||
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
|
||||
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
|
||||
<%@ taglib prefix="ui" uri="http://www.winbit.kr/ctl/ui" %>
|
||||
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
|
||||
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
|
||||
<%@ page import="java.util.Date" %>
|
||||
<%--
|
||||
Class Name : MssageLgqySndngStatsR.jsp
|
||||
Description : 메시지 대량 발송 내역 상세
|
||||
Modification Information
|
||||
|
||||
수정일 수정자 수정내용
|
||||
------- -------- ---------------------------
|
||||
2024.04.17 이운산 최초 생성
|
||||
--%>
|
||||
|
||||
<script>
|
||||
$(document).ready(function () {
|
||||
//생년별 클릭 통계
|
||||
$("#birth-click").on("click", function () {
|
||||
fn_open_modal('#birth-stats-popupDiv', '#birth-stats-popup',
|
||||
"/mngr/ntcn/lgqymssage/selectMssageLgqySndngClickBirth",
|
||||
{'srchSmsLgqySndngInnb' : '<c:out value="${ resultMap.boCtrlMap.smsLgqySndngInnb }"/>'}
|
||||
);
|
||||
})
|
||||
|
||||
//클릭자중 구매자
|
||||
$("#ordr-click").on("click", function () {
|
||||
fn_open_modal('#ordr-stats-popupDiv', '#ordr-stats-popup',
|
||||
"/mngr/ntcn/lgqymssage/selectMssageLgqySndngClickOrdr",
|
||||
{'srchSmsLgqySndngInnb' : '<c:out value="${ resultMap.boCtrlMap.smsLgqySndngInnb }"/>'}
|
||||
);
|
||||
})
|
||||
})
|
||||
|
||||
</script>
|
||||
<style>
|
||||
td.notify {
|
||||
text-align: center;
|
||||
}
|
||||
</style>
|
||||
<div id="mssageLgqySndngStatsPopup" class="modal" style="max-width: 1024px;">
|
||||
<div class="modal-header">
|
||||
<h4>메시지 대량 발송 내역 보기 - 통계</h4>
|
||||
</div>
|
||||
<div class="modal-content">
|
||||
<div class="table-wrapper">
|
||||
<table class="table">
|
||||
<caption>해당 테이블에 대한 설명</caption>
|
||||
<colgroup>
|
||||
<col style="width: 12%;">
|
||||
<col style="width: 38%;">
|
||||
<col style="width: 12%;">
|
||||
<col style="width: 38%;">
|
||||
</colgroup>
|
||||
<tbody>
|
||||
<tr>
|
||||
<th>발송 번호</th>
|
||||
<td><c:out value="${ resultMap.boCtrlMap.smsLgqySndngInnb }"/></td>
|
||||
<th rowspan="4">발송내용</th>
|
||||
<td rowspan="4">
|
||||
<div class="sms-list-content">
|
||||
<div class="sms-list-content__title">
|
||||
<span><c:out value="${ resultMap.boCtrlMap.sndngSj }"/></span>
|
||||
</div>
|
||||
<div style="height: 280px; width: 500px;" class="sms-list-content__content">
|
||||
<pre><c:out value="${ resultMap.boCtrlMap.sndngCn }"/></pre>
|
||||
</div>
|
||||
<c:if test="${!empty resultMap.boCtrlMap.linkUrl1}">
|
||||
<div>
|
||||
<p class="mt-10">
|
||||
<span>LINK_URL1 : <a class="under-line blue-7"
|
||||
href="<c:out value="${ resultMap.boCtrlMap.linkUrl1 }"/>"><c:out value="${ resultMap.boCtrlMap.linkUrl1 }"/></a></span>
|
||||
</p>
|
||||
<%-- <p class="mt-10">--%>
|
||||
<%-- <span>바로가기 URL1 : <a class="under-line blue-7"--%>
|
||||
<%-- href="">https://naver.com</a></span>--%>
|
||||
<%-- </p>--%>
|
||||
</div>
|
||||
</c:if>
|
||||
<c:if test="${!empty resultMap.boCtrlMap.linkUrl2}">
|
||||
<div>
|
||||
<p class="mt-10">
|
||||
<span>LINK_URL2 : <a class="under-line blue-7"
|
||||
href=""><c:out value="${ resultMap.boCtrlMap.linkUrl2 }"/></a></span>
|
||||
</p>
|
||||
<%-- <p class="mt-10">--%>
|
||||
<%-- <span>바로가기 URL1 : <a class="under-line blue-7"--%>
|
||||
<%-- href="">https://naver.com</a></span>--%>
|
||||
<%-- </p>--%>
|
||||
</div>
|
||||
</c:if>
|
||||
<c:if test="${!empty resultMap.boCtrlMap.linkUrl3}">
|
||||
<div>
|
||||
<p class="mt-10">
|
||||
<span>LINK_URL3 : <a class="under-line blue-7"
|
||||
href=""><c:out value="${ resultMap.boCtrlMap.linkUrl3 }"/></a></span>
|
||||
</p>
|
||||
<%-- <p class="mt-10">--%>
|
||||
<%-- <span>바로가기 URL1 : <a class="under-line blue-7"--%>
|
||||
<%-- href="">https://naver.com</a></span>--%>
|
||||
<%-- </p>--%>
|
||||
</div>
|
||||
</c:if>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>발송 시간</th>
|
||||
<td><c:out value="${ resultMap.boCtrlMap.sndngDt }"/></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>대상 건수</th>
|
||||
<td><c:out value="${ resultMap.boCtrlMap.allCnt }"/>건 (성공 건수 : <c:out value="${ resultMap.boCtrlMap.succesCnt }"/>건)</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>예상 비용</th>
|
||||
<td><c:out value="${ resultMap.boCtrlMap.succesCnt * 23}"/> 원 ( <c:out value="${ resultMap.boCtrlMap.succesCnt }"/> 건 * 23원)</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="notify" colspan="4">
|
||||
<div style="width:500px; margin:0 auto; border:1px solid blue; padding: 10px 0 10px 10px; ">
|
||||
<span style="font-size:13px; color: blue; font-weight: bold;">* 통계 데이터 변동 안내 </span>
|
||||
<div style="text-align: left;">
|
||||
- SKT 통신사의 경우 수신자가 URL을 클릭하지 않아도 자동으로 유입되는 것이 확인 되어 <br>
|
||||
SKT에서 접속하는 건은 통계 수치에서 제외하였습니다. ( 변경 일자 : 2021.07.13 )<br>
|
||||
- 따라서 <span style="padding-left:5px; font-size:13px; color: blue; font-weight: bold;">기존 평균 40~50%였던 클릭율은 평균 4%~5%</span>로 변동되었습니다.
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div class="table-wrapper">
|
||||
<table class="table">
|
||||
<caption>해당 테이블에 대한 설명</caption>
|
||||
<%-- <colgroup>--%>
|
||||
<%-- <col style="width: 15%;">--%>
|
||||
<%-- <col style="width: 38%;">--%>
|
||||
<%-- <col style="width: 12%;">--%>
|
||||
<%-- <col style="width: 38%;">--%>
|
||||
<%-- </colgroup>--%>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>
|
||||
<p>클릭 수 통계</p>
|
||||
- 총 클릭 건 수 : ${resultMap.clickStat.totCnt} 건 / 클릭자 수 : ${resultMap.clickStat.clickCnt} 건
|
||||
/ 클릭율 : <fmt:formatNumber value="${resultMap.clickStat.clickRate}" type="number" maxFractionDigits="0"/>%</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="4"><p>문자 내용 클릭 건수별 클릭자 수</p>
|
||||
<p>URL1 1번 클릭 : ${resultMap.urlClickStat.url1Cnt1} 명 (${resultMap.urlClickStat.url1Cnt1Rt}%)
|
||||
/ 2번 클릭 : ${resultMap.urlClickStat.url1Cnt2} 명 (${resultMap.urlClickStat.url1Cnt2Rt}%)
|
||||
/ 3번 이상 클릭 : ${resultMap.urlClickStat.url1Cnt3}명 (${resultMap.urlClickStat.url1Cnt3Rt}%)</p>
|
||||
<p>URL2 1번 클릭 : ${resultMap.urlClickStat.url2Cnt1} 명 (${resultMap.urlClickStat.url2Cnt1Rt}%)
|
||||
/ 2번 클릭 : ${resultMap.urlClickStat.url2Cnt2} 명 (${resultMap.urlClickStat.url2Cnt2Rt}%)
|
||||
/ 3번 이상 클릭 : ${resultMap.urlClickStat.url2Cnt3}명 (${resultMap.urlClickStat.url2Cnt3Rt}%)</p>
|
||||
<p>URL3 1번 클릭 : ${resultMap.urlClickStat.url3Cnt1} 명 (${resultMap.urlClickStat.url3Cnt1Rt}%)
|
||||
/ 2번 클릭 : ${resultMap.urlClickStat.url3Cnt2} 명 (${resultMap.urlClickStat.url3Cnt2Rt}%)
|
||||
/ 3번 이상 클릭 : ${resultMap.urlClickStat.url3Cnt3}명 (${resultMap.urlClickStat.url3Cnt3Rt}%)</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="4">
|
||||
<p>시간대별 클릭 통계</p>
|
||||
<p>
|
||||
<button class="btn gray xsm" id="birth-click">출생년도별 클릭 통계(자사몰 회원 기준)</button>
|
||||
<button class="btn gray xsm" id="ordr-click">클릭자중 구매자수 통계(자사몰 회원 기준)</button>
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>클릭 일자</th>
|
||||
<th>Hour</th>
|
||||
<th>URL1 클릭건 수</th>
|
||||
<th>URL2 클릭건 수</th>
|
||||
<th>URL3 클릭건 수</th>
|
||||
<th>클릭자 수</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>누적합계</td>
|
||||
<td>-</td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<c:forEach items="${ resultMap.clickList}" var="click">
|
||||
<tr>
|
||||
<td>${click.day}</td>
|
||||
<td>${click.hour}</td>
|
||||
<td>${click.cnt1}</td>
|
||||
<td>${click.cnt2}</td>
|
||||
<td>${click.cnt3}</td>
|
||||
<td>${click.pCnt}</td>
|
||||
</tr>
|
||||
</c:forEach>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user