초기소스
This commit is contained in:
@@ -0,0 +1,337 @@
|
||||
<%@ 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 : AtmcSndngListR.jsp
|
||||
Description : 자동 발송 관리 > 자동 발송 관리
|
||||
Modification Information
|
||||
|
||||
수정일 수정자 수정내용
|
||||
------- -------- ---------------------------
|
||||
2024-02-28 리브가 최초 생성
|
||||
2024-05-01 이대환 내용 수정
|
||||
--%>
|
||||
<style>
|
||||
.nice-select {
|
||||
max-width: 128px !important;
|
||||
min-width: 10px !important;
|
||||
}
|
||||
|
||||
option {
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.td-inner{
|
||||
justify-content: flex-start;
|
||||
}
|
||||
|
||||
.td-inner .item1 {
|
||||
text-align: left;
|
||||
flex-basis: 100%;
|
||||
}
|
||||
|
||||
</style>
|
||||
<script>
|
||||
$(document).ready(function () {
|
||||
//알림톡, 문자 체크박스 라디오버튼처럼 처리
|
||||
$(".radio-checkbox").each(function () {
|
||||
$(this).on("change", function () {
|
||||
if($(this).is(":checked")) {
|
||||
//선택 체크박스
|
||||
const checkBox = $(this).closest("tr").find(".radio-checkbox");
|
||||
//선택 체크박스 Y 처리
|
||||
checkBox.find('.useAtChk').val("Y");
|
||||
//선택하지 않은 체크박스
|
||||
const otherCheckBox = checkBox.not(this);
|
||||
//체크 해제
|
||||
otherCheckBox.prop("checked", false);
|
||||
//선택하지 않은 체크박스 N 처리
|
||||
otherCheckBox.closest('td').find('.useAtChk').val("N")
|
||||
|
||||
}
|
||||
})
|
||||
})
|
||||
|
||||
/* 자동발송 사용여부 체크박스 */
|
||||
const checkboxContainers = $('.b-checkbox-container');
|
||||
|
||||
checkboxContainers.each(function() {
|
||||
const checkbox = $(this).find('input[type="checkbox"]');
|
||||
const checkboxVal = $(this).prev('input[type="hidden"]');
|
||||
|
||||
checkbox.change(function() {
|
||||
if ($(this).prop('checked')) {
|
||||
checkboxVal.val('Y');
|
||||
} else {
|
||||
checkboxVal.val('N');
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
$("#atmcTable tr").each(function () {
|
||||
let content9 = $(this).find("td:eq(9)").text().trim();
|
||||
let content7 = $(this).find("td:eq(7)").text().trim();
|
||||
content7 = content7.replace(/\n/g, '<br>'); // \n을 <br>로 변환
|
||||
content9 = content9.replace(/\n/g, '<br>'); // \n을 <br>로 변환
|
||||
$(this).find("td:eq(7)").html(content7);
|
||||
$(this).find("td:eq(9)").html(content9);
|
||||
})
|
||||
|
||||
});
|
||||
|
||||
|
||||
$(".select-box > select").niceSelect();
|
||||
|
||||
|
||||
// 마케팅 사용 체크에 따른 화면 처리
|
||||
$(".marktAt").each(function(){
|
||||
const checkboxVal = $(this);
|
||||
checkboxVal.change(function(){
|
||||
const isChecked = $(this).is(':checked') ? 'Y' : 'N';
|
||||
|
||||
// 체크박스에서 가장 가까운 <label>을 찾고, 그 다음에 오는 <input>을 선택
|
||||
const outerInput = $(this).closest('label').next('input');
|
||||
|
||||
// 외부 입력 필드의 값을 'Y' 또는 'N'으로 설정
|
||||
outerInput.val(isChecked);
|
||||
|
||||
})
|
||||
|
||||
});
|
||||
|
||||
// 모든 select 요소에 대해 disabled 속성 다시 적용
|
||||
$('select:disabled').each(function() {
|
||||
$(this).next('.nice-select').addClass('disabled');
|
||||
});
|
||||
|
||||
|
||||
|
||||
</script>
|
||||
<section class="content-section">
|
||||
<h3 class="content-section__title">자동 발송 관리</h3>
|
||||
<div class="table-wrapper">
|
||||
<table class="table vertical" id="atmcTable">
|
||||
<caption>해당 테이블에 대한 설명</caption>
|
||||
<!-- 각 열 width 설정 -->
|
||||
<colgroup>
|
||||
<col style="width: 5%;">
|
||||
<col style="width: 8%;">
|
||||
<col style="width: 2%;">
|
||||
<col style="width: 2%;">
|
||||
<col style="width: 2%;">
|
||||
<col style="width: 2%;">
|
||||
<col style="width: 1%;">
|
||||
<col style="width: 10%;">
|
||||
<col style="width: 2%;">
|
||||
<col style="width: 6%;">
|
||||
<col style="width: 1%;">
|
||||
<col style="width: 1%;">
|
||||
<col style="width: 2%;">
|
||||
</colgroup>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>양식구분</th>
|
||||
<th>종류</th>
|
||||
<th>사용 여부</th>
|
||||
<th>알림톡</th>
|
||||
<th>문자</th>
|
||||
<th>이메일</th>
|
||||
<th>마케팅</th>
|
||||
<th>수집기간</th>
|
||||
<th>기준일</th>
|
||||
<th>충족기준</th>
|
||||
<th>중복발송</th>
|
||||
<th>발송일</th>
|
||||
<th>발송시간</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<input type="hidden" id="atmcSndngList" name="atmcSndngList" value=''>
|
||||
<input type="hidden" name="pageIndex" value='0'>
|
||||
<c:choose>
|
||||
<c:when test="${ not empty resultListMap}">
|
||||
<c:forEach items="${ resultListMap }" var="list" varStatus="status">
|
||||
<tr>
|
||||
<td>
|
||||
<c:out value="${list.groupCdNm}"/>
|
||||
<input type="hidden" id="formDvCd" name="formDvCd" value='<c:out value="${list.formDvCd}"/>'>
|
||||
</td>
|
||||
<td>
|
||||
<c:out value="${list.cdNm}"/>
|
||||
<input type="hidden" id="formDtlDvCd" name="formDtlDvCd" value='<c:out value="${list.formDtlDvCd}"/>'>
|
||||
</td>
|
||||
<td class="text-center">
|
||||
<div class="input-container">
|
||||
<div class="select-box">
|
||||
<select class="" name="useAt" title="해당 셀렉트에 대한 설명">
|
||||
<option value="Y" <c:if test="${list.useAt eq 'Y'}">selected</c:if>>사용함</option>
|
||||
<option value="N" <c:if test="${list.useAt ne 'Y'}">selected</c:if>>사용안함</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
<td class="text-center">
|
||||
<div class="manage-btn-container gap-10">
|
||||
<input type="hidden" class="useAtChk" name="ntcntalkUseAt" value="<c:out value="${list.ntcntalkUseAt}"/>">
|
||||
<c:if test="${not empty list.ntcntalkSndngFormInnb}">
|
||||
<div class="b-checkbox-container">
|
||||
<label class="b-checkbox checkbox">
|
||||
<input type="checkbox" class="radio-checkbox" value="" <c:if test="${list.ntcntalkUseAt eq 'Y'}">checked</c:if>>
|
||||
<span class="check"></span>
|
||||
<span class="control-label">발송</span>
|
||||
</label>
|
||||
</div>
|
||||
<a href="/mngr/ntcn/tmplt/selectAtmcSndngTmplatManage?ntcntalkChange=${list.formDvCd}" class="btn xsm gray">보기</a>
|
||||
</c:if>
|
||||
<c:if test="${empty list.ntcntalkSndngFormInnb}">
|
||||
<div class="b-checkbox-container">
|
||||
<label class="b-checkbox checkbox">
|
||||
<input type="checkbox" value="" onclick="fn_click_NoTemplate()" <c:if test="${list.ntcntalkUseAt eq 'Y'}">checked</c:if>>
|
||||
<span class="check"></span>
|
||||
<span class="control-label">발송</span>
|
||||
</label>
|
||||
</div>
|
||||
<span class="btn xsm" style="border: 1px solid;">미정</span>
|
||||
</c:if>
|
||||
</div>
|
||||
</td>
|
||||
<td>
|
||||
<div class="manage-btn-container gap-10">
|
||||
<input type="hidden" class="useAtChk" name="smsUseAt" value="<c:out value="${list.smsUseAt}"/>">
|
||||
<c:if test="${not empty list.smsSndngFormInnb}">
|
||||
<div class="b-checkbox-container">
|
||||
<label class="b-checkbox checkbox">
|
||||
<input type="checkbox" class="radio-checkbox" value="" <c:if test="${list.smsUseAt eq 'Y'}">checked</c:if>>
|
||||
<span class="check"></span>
|
||||
<span class="control-label">발송</span>
|
||||
</label>
|
||||
</div>
|
||||
<a href="/mngr/ntcn/tmplt/selectAtmcSndngTmplatManage?mssageChange=${list.formDvCd}" class="btn xsm gray">보기</a>
|
||||
</c:if>
|
||||
<c:if test="${empty list.smsSndngFormInnb}">
|
||||
<div class="b-checkbox-container">
|
||||
<label class="b-checkbox checkbox">
|
||||
<input type="checkbox" value="" onclick="fn_click_NoTemplate()" <c:if test="${list.smsUseAt eq 'Y'}">checked</c:if>>
|
||||
<span class="check"></span>
|
||||
<span class="control-label">발송</span>
|
||||
</label>
|
||||
</div>
|
||||
<span class="btn xsm" style="border: 1px solid;">미정</span>
|
||||
</c:if>
|
||||
</div>
|
||||
</td>
|
||||
<td>
|
||||
<div class="manage-btn-container gap-10">
|
||||
<input type="hidden" name="emailUseAt" value="<c:out value="${list.emailUseAt}"/>">
|
||||
<c:if test="${not empty list.emailSndngFormInnb}">
|
||||
<div class="b-checkbox-container">
|
||||
<label class="b-checkbox checkbox">
|
||||
<input type="checkbox" value="" <c:if test="${list.emailUseAt eq 'Y'}">checked</c:if>>
|
||||
<span class="check"></span>
|
||||
<span class="control-label">발송</span>
|
||||
</label>
|
||||
</div>
|
||||
<a href="/mngr/ntcn/tmplt/selectAtmcSndngTmplatManage?emailChange=${list.formDvCd}%26${list.formDtlDvCd}" class="btn xsm gray">보기</a>
|
||||
</c:if>
|
||||
<c:if test="${empty list.emailSndngFormInnb}">
|
||||
<div class="b-checkbox-container">
|
||||
<label class="b-checkbox checkbox">
|
||||
<input type="checkbox" value="" onclick="fn_click_NoTemplate()" <c:if test="${list.emailUseAt eq 'Y'}">checked</c:if>>
|
||||
<span class="check"></span>
|
||||
<span class="control-label">발송</span>
|
||||
</label>
|
||||
</div>
|
||||
<span class="btn xsm" style="border: 1px solid;">미정</span>
|
||||
</c:if>
|
||||
</div>
|
||||
</td>
|
||||
<td class="">
|
||||
<label class="b-checkbox checkbox is-medium">
|
||||
<input type="checkbox" class="marktAt" value=""
|
||||
<c:if test="${list.marktAt == 'Y'}">
|
||||
checked
|
||||
</c:if>
|
||||
onclick="return false;"
|
||||
>
|
||||
<span class="check"></span>
|
||||
</label>
|
||||
<input type="hidden" name="marktAt" value="<c:out value="${list.marktAt}"/>">
|
||||
</td>
|
||||
<td class="text-center">
|
||||
<c:out value="${list.colctPd}"/>
|
||||
</td>
|
||||
<td>
|
||||
<c:choose>
|
||||
<c:when test="${not empty list.sndngStdrDe}">
|
||||
<div class="input-container">
|
||||
<div class="select-box">
|
||||
<select name="sndngStdrDe" title="발송기준일자">
|
||||
<c:forEach var="i" begin="0"
|
||||
end="30">
|
||||
<option value="<fmt:formatNumber value="${i}" pattern="0"/>"
|
||||
<c:if test="${list.sndngStdrDe eq i}">selected</c:if>>
|
||||
<fmt:formatNumber value="${i}" pattern="0"/>
|
||||
</option>
|
||||
</c:forEach>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</c:when>
|
||||
<c:otherwise>
|
||||
</c:otherwise>
|
||||
</c:choose>
|
||||
</td>
|
||||
<td class=text-center">
|
||||
<c:out value="${list.suffcnStdr}"/>
|
||||
</td>
|
||||
<td class="text-center">
|
||||
<c:choose>
|
||||
<c:when test="${list.dplctSndngAt eq 'N'}">
|
||||
불가
|
||||
</c:when>
|
||||
<c:otherwise>
|
||||
가능
|
||||
</c:otherwise>
|
||||
</c:choose>
|
||||
</td>
|
||||
<td class="text-center">
|
||||
<c:out value="${list.sndngDc}"/>
|
||||
</td>
|
||||
<td class="text-center">
|
||||
<c:choose>
|
||||
<c:when test="${list.marktAt == 'Y'}">
|
||||
<div class="input-container">
|
||||
<div class="select-box">
|
||||
<select name="sndngStdrTme" title="발송시간">
|
||||
<c:forEach var="i" begin="${shopAtmcSndntTme.smsAtmcSndngLmttBgntme}"
|
||||
end="${shopAtmcSndntTme.smsAtmcSndngLmttEndtme}">
|
||||
<option value="<fmt:formatNumber value="${i}" pattern="00"/>"
|
||||
<c:if test="${list.sndngStdrTme eq i}">selected</c:if>>
|
||||
<fmt:formatNumber value="${i}" pattern="00"/>
|
||||
</option>
|
||||
</c:forEach>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</c:when>
|
||||
<c:otherwise>
|
||||
</c:otherwise>
|
||||
</c:choose>
|
||||
</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>
|
||||
</section>
|
||||
@@ -0,0 +1,357 @@
|
||||
<%@ 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 : AtmcSndngManage.jsp
|
||||
Description : 자동 발송 관리
|
||||
Modification Information
|
||||
|
||||
수정일 수정자 수정내용
|
||||
------- -------- ---------------------------
|
||||
2024-03-04 리브가 최초 생성
|
||||
2024-05-01 이대환 내용 수정
|
||||
--%>
|
||||
<!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 () {
|
||||
fn_select_AtmcSndng() ;
|
||||
|
||||
$('#listForm').on('keydown', function(e) {
|
||||
if (e.keyCode == 13) {
|
||||
e.preventDefault();
|
||||
$('#searchBtn').click();
|
||||
}
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
/* ********************************************************
|
||||
* 자동 발송 관리 TAB
|
||||
******************************************************** */
|
||||
const fn_select_AtmcSndng = function () {
|
||||
|
||||
$.ajax({
|
||||
type: 'post',
|
||||
url: '/mngr/ntcn/atmcsndng/selectAtmcSndngManageListInqire',
|
||||
success: function (resultHtml) {
|
||||
$("#selectMssageAtmcSndngBtn").removeClass("active");
|
||||
$("#selectEmailAtmcSndngBtn").removeClass("active");
|
||||
$("#selectNtcntalkAtmcSndngBtn").removeClass("active");
|
||||
$("#selectListInqireForm").removeClass("active");
|
||||
|
||||
$("#selectAtmcSndngBtn").addClass("active");
|
||||
$("#selectAtmcSndng").addClass("active");
|
||||
$('#selectAtmcSndng').html(resultHtml);
|
||||
|
||||
$("#atmcSndngUpdateBtn").css("display" ,"block");
|
||||
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/* ********************************************************
|
||||
* 자동 발송 템플릿 미존재 알림
|
||||
******************************************************** */
|
||||
const fn_click_NoTemplate = function () {
|
||||
event.preventDefault();
|
||||
alert('정의되지 않은 템플릿입니다.');
|
||||
}
|
||||
|
||||
/**********************************************
|
||||
* 자동 발송 관리 수정
|
||||
***********************************************/
|
||||
const fn_update_AtmcSndng = function() {
|
||||
|
||||
if (confirm('자동 발송 관리를 <spring:message code="confirm.common.update"/>')) {
|
||||
|
||||
let dataArr = [];
|
||||
$("tr").each(function () {
|
||||
let dataObj = {};
|
||||
$(this).find("input, select").each(function(){
|
||||
const name = $(this).attr("name");
|
||||
const value = $(this).val();
|
||||
|
||||
if(name) {
|
||||
dataObj[name] = value;
|
||||
}
|
||||
dataArr.push(dataObj);
|
||||
})
|
||||
|
||||
})
|
||||
|
||||
const atmcSndngList = JSON.stringify(dataArr);
|
||||
|
||||
$("#atmcSndngList").val(atmcSndngList);
|
||||
|
||||
$.ajax({
|
||||
type : 'post',
|
||||
url : '/mngr/ntcn/atmcsndng/updateAtmcSndngManageUpdt',
|
||||
data : $('form').serialize(),
|
||||
// dataType: 'text',
|
||||
success : function(data) {
|
||||
const str = JSON.parse(data.resBody.result);
|
||||
if (str.status === '0') {
|
||||
alert('<spring:message code="success.common.update"/>');
|
||||
} else {
|
||||
alert('<spring:message code="fail.common.update"/>');
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
/* ********************************************************
|
||||
* 메시지 발송 내역 TAB
|
||||
******************************************************** */
|
||||
const fn_select_MssageAtmcSndng = function () {
|
||||
|
||||
$.ajax({
|
||||
type: 'post',
|
||||
url: '/mngr/ntcn/atmcsndng/selectMssageAtmcSndngListInqireRForm',
|
||||
success: function (resultHtml) {
|
||||
$("#selectAtmcSndngBtn").removeClass("active");
|
||||
$("#selectEmailAtmcSndngBtn").removeClass("active");
|
||||
$("#selectNtcntalkAtmcSndngBtn").removeClass("active");
|
||||
$("#selectAtmcSndng").removeClass("active");
|
||||
|
||||
$("#selectMssageAtmcSndngBtn").addClass("active");
|
||||
$("#selectListInqireForm").addClass("active");
|
||||
$('#selectListInqireForm').html(resultHtml);
|
||||
|
||||
$("#atmcSndngUpdateBtn").css("display" ,"none");
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/* ********************************************************
|
||||
* 이메일 발송 내역 TAB
|
||||
******************************************************** */
|
||||
const fn_select_EmailAtmcSndng = function () {
|
||||
|
||||
$.ajax({
|
||||
type: 'post',
|
||||
url: '/mngr/ntcn/atmcsndng/selectEmailAtmcSndngListInqireRForm',
|
||||
success: function (resultHtml) {
|
||||
$("#selectAtmcSndngBtn").removeClass("active");
|
||||
$("#selectMssageAtmcSndngBtn").removeClass("active");
|
||||
$("#selectNtcntalkAtmcSndngBtn").removeClass("active");
|
||||
$("#selectAtmcSndng").removeClass("active");
|
||||
|
||||
$("#selectEmailAtmcSndngBtn").addClass("active");
|
||||
$("#selectListInqireForm").addClass("active");
|
||||
$('#selectListInqireForm').html(resultHtml);
|
||||
|
||||
$("#atmcSndngUpdateBtn").css("display" ,"none");
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/* ********************************************************
|
||||
* 이메일 발송 상세조회
|
||||
******************************************************** */
|
||||
const fn_move_dtl_page = function(emailLogInnb) {
|
||||
$.ajax({
|
||||
type: "post",
|
||||
url : '/admin/ntcn/email/selectEmailSndngDtlPopup',
|
||||
data : {emailLogInnb : emailLogInnb},
|
||||
success:function(resultHtml) {
|
||||
fn_close_modal('email-check-pop');
|
||||
$('#EmailAtmcSndngDtlDiv').html(resultHtml);
|
||||
//form메소드에서 pageIndex, pageUnit 갖고옴
|
||||
let pageIndex = '<c:out value="${ resultListMapMbr.bOMaEmailSrchVO.pageIndex }"/>';
|
||||
let pageUnit = '<c:out value="${ resultListMapMbr.bOMaEmailSrchVO.pageUnit }"/>';
|
||||
fn_select_mbrInfo(pageIndex,pageUnit,emailLogInnb);
|
||||
$('#email-check-pop').modal();
|
||||
}
|
||||
});
|
||||
}
|
||||
/* ********************************************************
|
||||
* 이메일 발송 상세조회 발신조회
|
||||
******************************************************** */
|
||||
const fn_select_mbrInfo = function(pageIndex, pageUnit,emailLogInnb) {
|
||||
let dataStr;
|
||||
if(!pageIndex) {
|
||||
$('#mbrPageIndex').val(1);
|
||||
} else {
|
||||
$('#mbrPageIndex').val(pageIndex);
|
||||
}
|
||||
|
||||
if(!pageUnit) {
|
||||
dataStr = $('#popupForm').serialize();
|
||||
} else {
|
||||
if($('#mbrPageUnit').length){
|
||||
$('#mbrPageUnit').val(pageUnit);
|
||||
dataStr = $('#popupForm').serialize();
|
||||
} else {
|
||||
dataStr = $('#popupForm').serialize()+'&pageUnit='+pageUnit;
|
||||
}
|
||||
}
|
||||
/* dataStr = dataStr+'&emailLogInnb='+emailLogInnb
|
||||
$.ajax({
|
||||
type: "post",
|
||||
url : "<c:url value="/admin/ntcn/email/selectEmailSndngDtlPopupMbrTb"/>",
|
||||
data : dataStr,
|
||||
success:function(resultHtml) {
|
||||
$('#mbrInfoDiv').html(resultHtml);
|
||||
$('#mbrPageUnit').niceSelect();
|
||||
}
|
||||
}); */
|
||||
}
|
||||
|
||||
/* ********************************************************
|
||||
* 알림톡 자동 발송 내역 TAB
|
||||
******************************************************** */
|
||||
const fn_select_NtcntalkAtmcSndng = function () {
|
||||
|
||||
$.ajax({
|
||||
type: 'post',
|
||||
url: '/mngr/ntcn/atmcsndng/selectNtcntalkAtmcSndngListInqireRForm',
|
||||
success: function (resultHtml) {
|
||||
$("#selectAtmcSndngBtn").removeClass("active");
|
||||
$("#selectMssageAtmcSndngBtn").removeClass("active");
|
||||
$("#selectEmailAtmcSndngBtn").removeClass("active");
|
||||
$("#selectAtmcSndng").removeClass("active");
|
||||
|
||||
$("#selectNtcntalkAtmcSndngBtn").addClass("active");
|
||||
$("#selectListInqireForm").addClass("active");
|
||||
$('#selectListInqireForm').html(resultHtml);
|
||||
|
||||
$("#atmcSndngUpdateBtn").css("display" ,"none");
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/* ********************************************************
|
||||
* 자동 발송 내역 TAB _ 리스트 조회
|
||||
******************************************************** */
|
||||
const fn_select_list = function(pageIndex, pageUnit) {
|
||||
let dataStr;
|
||||
let url;
|
||||
if(!pageIndex) {
|
||||
$('#pageIndex').val(1);
|
||||
} else {
|
||||
$('#pageIndex').val(pageIndex);
|
||||
}
|
||||
|
||||
if(!pageUnit) {
|
||||
dataStr = $('#listForm').serialize();
|
||||
} else {
|
||||
if($('#pageUnit').length){
|
||||
$('#pageUnit').val(pageUnit);
|
||||
dataStr = $('#listForm').serialize();
|
||||
} else {
|
||||
dataStr = $('#listForm').serialize()+'&pageUnit='+pageUnit;
|
||||
}
|
||||
}
|
||||
|
||||
if ($('#selectMssageAtmcSndngBtn').hasClass('active')) {
|
||||
url = '/mngr/ntcn/atmcsndng/selectMssageAtmcSndngListInqire';
|
||||
fn_show_list(url, dataStr);
|
||||
} else if ($('#selectEmailAtmcSndngBtn').hasClass('active')) {
|
||||
url = '/mngr/ntcn/atmcsndng/selectEmailAtmcSndngListInqire';
|
||||
fn_show_list(url, dataStr);
|
||||
} else if ($('#selectNtcntalkAtmcSndngBtn').hasClass('active')) {
|
||||
url = '/mngr/ntcn/atmcsndng/selectNtcntalkAtmcSndngListInqire';
|
||||
if(fn_limit_ntcntalk()){
|
||||
fn_show_list(url, dataStr);
|
||||
}
|
||||
}
|
||||
}
|
||||
const fn_show_list = function(url, dataStr) {
|
||||
$.ajax({
|
||||
type: 'post',
|
||||
url : url,
|
||||
data : dataStr,
|
||||
success:function(resultHtml) {
|
||||
$('#pageDiv').html(resultHtml);
|
||||
$('#pageUnit').niceSelect();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**********************************************************
|
||||
* 알림톡 조회 기간 최근 1년 이내, 검색 기간 3개월 제한
|
||||
***********************************************************/
|
||||
const fn_limit_ntcntalk = function(){
|
||||
var strtDate = new Date($("#srchStrtSndngDt").val());
|
||||
var endDate = new Date($("#srchEndSndngDt").val());
|
||||
|
||||
if (strtDate !== "" && endDate !== "") {
|
||||
var strtDate3M = new Date(strtDate);
|
||||
strtDate3M.setMonth(strtDate.getMonth() + 3);
|
||||
if(strtDate3M < endDate){
|
||||
alert('최대 검색기간은 3개월입니다.');
|
||||
return false;
|
||||
}
|
||||
|
||||
var strtDate1Y = new Date(strtDate);
|
||||
var today = new Date();
|
||||
strtDate1Y.setFullYear(strtDate.getFullYear() + 1);
|
||||
if(strtDate1Y < new Date(today.getFullYear(), today.getMonth(), today.getDate())){
|
||||
alert('최근 1년 이내만 검색가능합니다.');
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**********************************************************
|
||||
* 검색 조건 이벤트 설정(날짜 전체 클릭 시 날짜 설정 초기화)
|
||||
***********************************************************/
|
||||
const fn_reset_date = function(strtDate,endDate){
|
||||
$('#'+strtDate).datepicker().datepicker("setDate",'');
|
||||
$('#'+endDate).datepicker().datepicker("setDate",'');
|
||||
}
|
||||
</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" onclick="fn_update_AtmcSndng()" id="atmcSndngUpdateBtn">저장하기
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="content-tab">
|
||||
<button class="content-tab__btn active" id="selectAtmcSndngBtn" onclick="fn_select_AtmcSndng()">자동 발송 관리</button>
|
||||
<button class="content-tab__btn" id="selectMssageAtmcSndngBtn" onclick="fn_select_MssageAtmcSndng()">메시지 발송 내역</button>
|
||||
<button class="content-tab__btn" id="selectEmailAtmcSndngBtn" onclick="fn_select_EmailAtmcSndng()">이메일 발송 내역</button>
|
||||
<button class="content-tab__btn" id="selectNtcntalkAtmcSndngBtn" onclick="fn_select_NtcntalkAtmcSndng()">알림톡 발송 내역</button>
|
||||
</div>
|
||||
<form>
|
||||
<div class="content-tab__content active" id="selectAtmcSndng">
|
||||
<%--자동 발송 관리--%>
|
||||
</div>
|
||||
</form>
|
||||
<form id='listForm' name="listForm">
|
||||
<input type="hidden" id="pageIndex" name="pageIndex"/>
|
||||
<div class="content-tab__content" id="selectListInqireForm">
|
||||
<%--자동 발송 내역--%>
|
||||
</div>
|
||||
</form>
|
||||
<button class="scroll-to-top"><span class="visually-hidden">위로가기</span></button>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
<div id="MessageAtmcSndngDtlDiv"></div>
|
||||
<div id="EmailAtmcSndngDtlDiv"></div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,112 @@
|
||||
<%@ 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 : EmailAtmcSndngListR.jsp
|
||||
Description : 자동 발송 관리 > 이메일 발송 내역 - 리스트
|
||||
Modification Information
|
||||
|
||||
수정일 수정자 수정내용
|
||||
------- -------- ---------------------------
|
||||
2024-02-28 리브가 최초 생성
|
||||
2024-05-03 이대환 내용 수정
|
||||
--%>
|
||||
<section class="content-section">
|
||||
<div class="form-control-container">
|
||||
<div class="left">
|
||||
<div class="search-number">
|
||||
<span class="search-number__text">
|
||||
총 <strong><c:out value="${ resultListMap.paginationInfo.totalRecordCount }"/></strong>건
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="center">
|
||||
</div>
|
||||
<div class="right">
|
||||
<div class="select-box">
|
||||
<select id="pageUnit" name="pageUnit" title="페이지당 출력될 목록건수" onchange="fn_select_list(1);">
|
||||
<c:forEach items="${ resultListMap.paginationInfo.pageUnitArr }" var="pageUnit" varStatus="pageUnitStatus">
|
||||
<option value="<c:out value="${ pageUnit }"/>" <c:if test="${ resultListMap.paginationInfo.recordCountPerPage eq pageUnit}">selected="selected"</c:if>><c:out value="${ pageUnit }"/>개씩</option>
|
||||
</c:forEach>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<hr class="spacing">
|
||||
<div class="table-wrapper">
|
||||
<table class="table vertical tight">
|
||||
<caption>해당 테이블에 대한 설명</caption>
|
||||
<!-- 각 열 width 설정 -->
|
||||
<colgroup>
|
||||
<col style="width: 6%;">
|
||||
<%-- <col style="width: 14%;"> --%>
|
||||
<col style="width: auto;">
|
||||
<col style="width: 12%;">
|
||||
<col style="width: 12%;">
|
||||
<col style="width: 12%;">
|
||||
</colgroup>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>번호</th>
|
||||
<!-- <th>발송 상황</th> -->
|
||||
<th>이메일 제목</th>
|
||||
<th>수신 이메일</th>
|
||||
<th>전송 결과</th>
|
||||
<th>발송일시</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<c:choose>
|
||||
<c:when test="${ not empty resultListMap.boCtrlMap}">
|
||||
<c:forEach items="${ resultListMap.boCtrlMap }" var="list" varStatus="status">
|
||||
<tr>
|
||||
<td><c:out value = "${resultListMap.paginationInfo.totalRecordCount - list.rnum + 1 }"/></td>
|
||||
<td class="text-left">
|
||||
<a class="under-line blue-7" onclick = "fn_move_dtl_page(<c:out value = "${list.emailLogInnb}"/>)">
|
||||
<c:out value = "${list.sj}"/>
|
||||
</a>
|
||||
</td>
|
||||
<td><c:out value = "${list.sndngEmail}"/></td>
|
||||
<td>
|
||||
<c:choose>
|
||||
<c:when test="${list.sttus eq 'REG'}">
|
||||
등록
|
||||
</c:when>
|
||||
<c:when test="${list.sttus eq 'BAD'}">
|
||||
불량
|
||||
</c:when>
|
||||
<c:when test="${list.sttus eq 'WAIT'}">
|
||||
대기
|
||||
</c:when>
|
||||
<c:when test="${list.sttus eq 'SEND'}">
|
||||
전송
|
||||
</c:when>
|
||||
<c:when test="${list.sttus eq 'FAIL'}">
|
||||
실패
|
||||
</c:when>
|
||||
<c:when test="${list.sttus eq 'OK'}">
|
||||
성공
|
||||
</c:when>
|
||||
</c:choose>
|
||||
</td>
|
||||
<td><c:out value = "${list.registDt}"/></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>
|
||||
</section>
|
||||
<div class="pagination__container">
|
||||
<ui:pagination paginationInfo="${resultListMap.paginationInfo}" type="image" jsFunction="fn_select_list"/>
|
||||
</div>
|
||||
@@ -0,0 +1,133 @@
|
||||
<%@ 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 : EmailAtmcSndngListRForm.jsp
|
||||
Description : 자동 발송 관리 > 이메일 발송 내역 폼
|
||||
Modification Information
|
||||
|
||||
수정일 수정자 수정내용
|
||||
------- -------- ---------------------------
|
||||
2024-02-28 리브가 최초 생성
|
||||
2024-05-03 이대환 내용 수정
|
||||
--%>
|
||||
<script>
|
||||
$(document).ready(function () {
|
||||
//form메소드에서 pageIndex, pageUnit 갖고옴
|
||||
let pageIndex = '<c:out value="${ resultListMap.bOEmailSrchVO.pageIndex }"/>';
|
||||
let pageUnit = '<c:out value="${ resultListMap.bOEmailSrchVO.pageUnit }"/>';
|
||||
|
||||
fn_select_list(pageIndex, pageUnit);
|
||||
//지정일
|
||||
fn_set_date('srchStrtSndngDt','srchEndSndngDt','srchEndSndngDㄴt');
|
||||
|
||||
//날짜 선택 버튼 선택 처리
|
||||
$(".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', 'srchStrtSndngDt','srchEndSndngDt');
|
||||
fn_set_niceSelect_datePicker("#listForm");
|
||||
});
|
||||
</script>
|
||||
<section class="content-section" id="search-section">
|
||||
<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 = "srchType">
|
||||
<option value="">전체</option>
|
||||
<option value="SJ" <c:if test="${ resultSrchMap.bOMaEmailSrchVO.srchType == 'SJ'}">selected="selected"</c:if> >이메일 제목</option>
|
||||
<option value="sndEml" <c:if test="${ resultSrchMap.bOMaEmailSrchVO.srchType == 'sndEml'}">selected="selected"</c:if>>발송주소</option>
|
||||
<option value="rcvEml" <c:if test="${ resultSrchMap.bOMaEmailSrchVO.srchType == 'rcvEml'}">selected="selected"</c:if>>수신주소</option>
|
||||
</select>
|
||||
</div>
|
||||
<input class="input-text xl" type="text" title="검색어" name = "srchStr">
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>발송일</th>
|
||||
<td>
|
||||
<div class="td-inner">
|
||||
<div class="input-container">
|
||||
<input type="text" id="srchStrtSndngDt" class="datepicker"
|
||||
title="시작 날짜 선택" name="srchStrtSndngDt"
|
||||
autocomplete="off">
|
||||
<span class="tilde">~</span>
|
||||
<input type="text" id="srchEndSndngDt" class="datepicker"
|
||||
title="종료 날짜 선택" name="srchEndSndngDt"
|
||||
autocomplete="off">
|
||||
</div>
|
||||
<div class="dateRange-btnContainer" id="searchDateRange">
|
||||
<button type="button" class="dateRange-btn" id="yesterday"
|
||||
onclick="fn_set_date('srchStrtSndngDt','srchEndSndngDt','srchEndSndngDt','1D')">
|
||||
어제
|
||||
</button>
|
||||
<button type="button" class="dateRange-btn" id="today"
|
||||
onclick="fn_set_date('srchStrtSndngDt','srchEndSndngDt','srchEndSndngDt','0')">
|
||||
오늘
|
||||
</button>
|
||||
<button type="button" class="dateRange-btn" id="threeDays"
|
||||
onclick="fn_set_date('srchStrtSndngDt','srchEndSndngDt','srchEndSndngDt','3D')">
|
||||
3일간
|
||||
</button>
|
||||
<button type="button" class="dateRange-btn" id="sevenDays"
|
||||
onclick="fn_set_date('srchStrtSndngDt','srchEndSndngDt','srchEndSndngDt','7D')">
|
||||
일주일
|
||||
</button>
|
||||
<button type="button" class="dateRange-btn" id="oneMonth"
|
||||
onclick="fn_set_date('srchStrtSndngDt','srchEndSndngDt','srchEndSndngDt','1M')">
|
||||
1개월
|
||||
</button>
|
||||
<button type="button" class="dateRange-btn" id="threeMonth"
|
||||
onclick="fn_set_date('srchStrtSndngDt','srchEndSndngDt','srchEndSndngDt','3M')">
|
||||
3개월
|
||||
</button>
|
||||
<button type="button" class="dateRange-btn" id="sixMonth"
|
||||
onclick="fn_set_date('srchStrtSndngDt','srchEndSndngDt','srchEndSndngDt','6M')">
|
||||
6개월
|
||||
</button>
|
||||
<button type="button" class="dateRange-btn" id="year"
|
||||
onclick="fn_set_date('srchStrtSndngDt','srchEndSndngDt','srchEndSndngDt','1Y')">
|
||||
1년
|
||||
</button>
|
||||
<button type="button" class="dateRange-btn"
|
||||
onclick="fn_reset_date('srchStrtSndngDt','srchEndSndngDt')">
|
||||
전체
|
||||
</button>
|
||||
</div>
|
||||
</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>
|
||||
</section>
|
||||
<div id="pageDiv">
|
||||
</div>
|
||||
@@ -0,0 +1,92 @@
|
||||
<%@ 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="spring" uri="http://www.springframework.org/tags" %>
|
||||
<%--
|
||||
Class Name : MessageAtmcSndngDtlPopupR.jsp
|
||||
Description : 문자 발송 정보 팝업
|
||||
Modification Information
|
||||
|
||||
수정일 수정자 수정내용
|
||||
------- -------- ---------------------------
|
||||
2024.03.04 리브가 최초 생성
|
||||
2024.04.04 이운산 수정
|
||||
2024.05.20 이대환 수정
|
||||
--%>
|
||||
<style>
|
||||
pre {
|
||||
white-space: pre-wrap; /* 줄바꿈 허용 */
|
||||
word-wrap: break-word; /* 긴 단어도 줄바꿈 처리 */
|
||||
}
|
||||
</style>
|
||||
<div id="MessageAtmcSndngDtlPopup" class="modal" style="max-width: 580px;">
|
||||
<div class="modal-header">
|
||||
<h4>문자 발송 정보</h4>
|
||||
</div>
|
||||
<div class="modal-content">
|
||||
<div class="table-wrapper">
|
||||
<table class="table">
|
||||
<caption>해당 테이블에 대한 설명</caption>
|
||||
<colgroup>
|
||||
<col style="width: 25%;">
|
||||
<col>
|
||||
</colgroup>
|
||||
<tbody>
|
||||
<tr>
|
||||
<th>발송 유형</th>
|
||||
<td><c:out value="${resultMap.boCtrlMap.dv }"/></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>현재 상태</th>
|
||||
<td>
|
||||
<c:choose>
|
||||
<c:when test="${resultMap.boCtrlMap.sttus eq 'OK'}">
|
||||
성공
|
||||
</c:when>
|
||||
<c:when test="${resultMap.boCtrlMap.sttus eq 'FAIL'}">
|
||||
실패
|
||||
</c:when>
|
||||
<c:when test="${resultMap.boCtrlMap.sttus eq 'REG'}">
|
||||
등록
|
||||
</c:when>
|
||||
<c:when test="${resultMap.boCtrlMap.sttus eq 'WAIT'}">
|
||||
대기
|
||||
</c:when>
|
||||
<c:when test="${resultMap.boCtrlMap.sttus eq 'SEND'}">
|
||||
전송
|
||||
</c:when>
|
||||
<c:when test="${resultMap.boCtrlMap.sttus eq 'BAD'}">
|
||||
불량
|
||||
</c:when>
|
||||
</c:choose>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>발송요청시간</th>
|
||||
<td><c:out value="${resultMap.boCtrlMap.registDt }"/></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>실제발송시간</th>
|
||||
<td><c:out value="${resultMap.boCtrlMap.sndngDt }"/></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>수신번호</th>
|
||||
<td><c:out value="${resultMap.boCtrlMap.recptnNb }"/></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>회신번호</th>
|
||||
<td><c:out value="${resultMap.boCtrlMap.sndngNb }"/></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>발송내용</th>
|
||||
<td>
|
||||
<div style="height: 200px; width: 400px;" class="send-content">
|
||||
<pre><c:out value="${resultMap.boCtrlMap.cn }"/></pre>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -0,0 +1,155 @@
|
||||
<%@ 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 : MssageAtmcSndngListR.jsp
|
||||
Description : 자동 발송 관리 > 메시지 발송 내역 - 리스트
|
||||
Modification Information
|
||||
|
||||
수정일 수정자 수정내용
|
||||
------- -------- ---------------------------
|
||||
2024-02-28 리브가 최초 생성
|
||||
2024-05-08 이대환 내용 수정
|
||||
--%>
|
||||
<style>
|
||||
.table.vertical th.left, .table.vertical td.left {
|
||||
white-space: normal;
|
||||
max-width: 400px;
|
||||
word-wrap: break-word;
|
||||
}
|
||||
</style>
|
||||
<script>
|
||||
$(document).ready(function () {
|
||||
//전화번호 처리
|
||||
$(".recptnNb").each(function () {
|
||||
const recptnNbStr = $(this).text();
|
||||
const recptnNb = fn_format_mbtlnb(recptnNbStr.replace(/\s+/g, ''));
|
||||
$(this).text(recptnNb);
|
||||
})
|
||||
});
|
||||
</script>
|
||||
<section class="content-section">
|
||||
<div class="form-control-container">
|
||||
<div class="left">
|
||||
<div class="search-number">
|
||||
<span class="search-number__text">
|
||||
총
|
||||
<strong>
|
||||
<fmt:formatNumber value="${ resultListMap.paginationInfo.totalRecordCount }" pattern="#,###" />
|
||||
</strong> 건
|
||||
<span>
|
||||
(성공
|
||||
<em>
|
||||
<c:if test="${empty resultListMap.boCtrlMap.rsltOkCnt.okcnt}">0</c:if>
|
||||
<fmt:formatNumber value="${ resultListMap.boCtrlMap.rsltOkCnt.okcnt }" pattern="#,###" />건
|
||||
</em>,
|
||||
실패
|
||||
<em>
|
||||
<c:if test="${empty resultListMap.boCtrlMap.rsltFailCnt.failcnt}">0</c:if>
|
||||
<fmt:formatNumber value="${ resultListMap.boCtrlMap.rsltFailCnt.failcnt }" pattern="#,###" />건
|
||||
</em>)
|
||||
</span>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="center">
|
||||
</div>
|
||||
<div class="right">
|
||||
<div class="select-box">
|
||||
<select id="pageUnit" name="pageUnit" title="페이지당 출력될 목록건수" onchange="fn_select_list(1);">
|
||||
<c:forEach items="${ resultListMap.paginationInfo.pageUnitArr }" var="pageUnit" varStatus="pageUnitStatus">
|
||||
<option value="<c:out value="${ pageUnit }"/>" <c:if test="${ resultListMap.paginationInfo.recordCountPerPage eq pageUnit}">selected="selected"</c:if>><c:out value="${ pageUnit }"/>개씩</option>
|
||||
</c:forEach>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<hr class="spacing">
|
||||
<div class="table-wrapper">
|
||||
<table class="table vertical tight">
|
||||
<caption>해당 테이블에 대한 설명</caption>
|
||||
<!-- 각 열 width 설정 -->
|
||||
<colgroup>
|
||||
<col style="width: 5%;">
|
||||
<%-- <col style="width: 14%;"> --%>
|
||||
<col style="width: 25%;">
|
||||
<col style="width: 5%;">
|
||||
<col style="width: 5%;">
|
||||
<col style="width: 4%;">
|
||||
</colgroup>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>번호</th>
|
||||
<!-- <th>발송 상황</th> -->
|
||||
<th>발송 내용</th>
|
||||
<th>수신번호</th>
|
||||
<th>현재상태</th>
|
||||
<th>
|
||||
등록일시
|
||||
<br>
|
||||
발송일시
|
||||
</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<c:choose>
|
||||
<c:when test="${ not empty resultListMap.boCtrlMap.smsSndngList }">
|
||||
<c:forEach items="${ resultListMap.boCtrlMap.smsSndngList }" var="list" varStatus="status">
|
||||
<tr>
|
||||
<td><c:out value="${list.rnum}"/></td>
|
||||
<td class="left"><c:out value="${list.cn }"/></td>
|
||||
<td class="recptnNb"><c:out value="${list.recptnNb }"/></td>
|
||||
<td>
|
||||
<a class="under-line blue-7" onclick="fn_open_modal('#MessageAtmcSndngDtlDiv',
|
||||
'#MessageAtmcSndngDtlPopup',
|
||||
'/mngr/ntcn/atmcsndng/selectMssageAtmcSndngDtlPopup',
|
||||
{'srchSopmalCd' : '<c:out value="${ list.sopmalCd }"/>',
|
||||
'srchSmsInnb' : '<c:out value="${ list.smsInnb }"/>',
|
||||
'srchSmsToInnb' : '<c:out value="${ list.smsToInnb}"/>',
|
||||
'srchRecptnNb' : '<c:out value="${ list.recptnNb }"/>'}); return false;">
|
||||
<c:choose>
|
||||
<c:when test="${list.sttus eq 'REG'}">
|
||||
등록
|
||||
</c:when>
|
||||
<c:when test="${list.sttus eq 'BAD'}">
|
||||
불량
|
||||
</c:when>
|
||||
<c:when test="${list.sttus eq 'WAIT'}">
|
||||
대기
|
||||
</c:when>
|
||||
<c:when test="${list.sttus eq 'SEND'}">
|
||||
전송
|
||||
</c:when>
|
||||
<c:when test="${list.sttus eq 'FAIL'}">
|
||||
실패
|
||||
</c:when>
|
||||
<c:when test="${list.sttus eq 'OK'}">
|
||||
성공
|
||||
</c:when>
|
||||
</c:choose>
|
||||
</a>
|
||||
</td>
|
||||
<td>
|
||||
<c:out value="${list.registDt }"/>
|
||||
<c:out value="${list.sndngDt }"/>
|
||||
</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>
|
||||
</section>
|
||||
<div class="pagination__container">
|
||||
<ui:pagination paginationInfo="${resultListMap.paginationInfo}" type="image" jsFunction="fn_select_list"/>
|
||||
</div>
|
||||
@@ -0,0 +1,260 @@
|
||||
<%@ 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 : MssageAtmcSndngListRForm.jsp
|
||||
Description : 자동 발송 관리 > 메시지 발송 내역 폼
|
||||
Modification Information
|
||||
|
||||
수정일 수정자 수정내용
|
||||
------- -------- ---------------------------
|
||||
2024-02-28 리브가 최초 생성
|
||||
2024-05-08 이대환 내용 수정
|
||||
--%>
|
||||
<script>
|
||||
$(document).ready(function () {
|
||||
//form메소드에서 pageIndex, pageUnit 갖고옴
|
||||
let pageIndex = '<c:out value="${ resultListMap.bOEmailSrchVO.pageIndex }"/>';
|
||||
let pageUnit = '<c:out value="${ resultListMap.bOEmailSrchVO.pageUnit }"/>';
|
||||
|
||||
//초기 날짜 세팅
|
||||
const date = new Date(); // 현재 날짜
|
||||
const formattedDate = date.toISOString().split('T')[0];
|
||||
$('#srchStrtSndngDt').val(formattedDate);
|
||||
$('#srchEndSndngDt').val(formattedDate);
|
||||
$('#today').addClass("selected")
|
||||
|
||||
fn_select_list(pageIndex, pageUnit);
|
||||
//지정일
|
||||
fn_set_date('srchStrtSndngDt','srchEndSndngDt','srchEndSndngDt');
|
||||
|
||||
//날짜 선택 버튼 선택 처리
|
||||
$(".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', 'srchStrtSndngDt','srchEndSndngDt');
|
||||
fn_set_niceSelect_datePicker("#listForm");
|
||||
|
||||
//검색 조건 종류 항목 체크 여부에 따른 체크 해제
|
||||
$(".kindChk").on("click",function(){
|
||||
fn_ctr_pCheckbox("#kindChkAll",".kindChk");
|
||||
});
|
||||
//검색 조건 상태 항목 체크 여부에 따른 체크 해제
|
||||
$(".sttusChk").on("click",function(){
|
||||
fn_ctr_pCheckbox("#sttusChkAll",".sttusChk");
|
||||
});
|
||||
|
||||
|
||||
/* ********************************************************
|
||||
* 카테고리 체크버튼 이벤트
|
||||
******************************************************** */
|
||||
|
||||
// "전체 선택" 체크박스를 클릭했을 때
|
||||
$('#kindChkAll').on('click', function() {
|
||||
// 현재 체크 상태를 가져옴
|
||||
const isChecked = $(this).is(':checked');
|
||||
|
||||
// 다른 체크박스들을 모두 체크 또는 해제
|
||||
$('.kindChk').prop('checked', isChecked);
|
||||
});
|
||||
|
||||
// 개별 체크박스를 클릭했을 때 "전체 선택" 체크박스 상태를 동기화
|
||||
$('.kindChk').on('click', function() {
|
||||
const total = $('.kindChk').length;
|
||||
const checked = $('.kindChk:checked').length;
|
||||
|
||||
// 모든 항목이 체크되었으면 "전체 선택"도 체크, 그렇지 않으면 해제
|
||||
$('#kindChkAll').prop('checked', total === checked);
|
||||
});
|
||||
|
||||
|
||||
// "전체 선택" 체크박스를 클릭했을 때
|
||||
$('#sttusChkAll').on('click', function() {
|
||||
// 현재 체크 상태를 가져옴
|
||||
const isChecked = $(this).is(':checked');
|
||||
|
||||
// 다른 체크박스들을 모두 체크 또는 해제
|
||||
$('.sttusChk').prop('checked', isChecked);
|
||||
});
|
||||
|
||||
// 개별 체크박스를 클릭했을 때 "전체 선택" 체크박스 상태를 동기화
|
||||
$('.sttusChk').on('click', function() {
|
||||
const total = $('.sttusChk').length;
|
||||
const checked = $('.sttusChk:checked').length;
|
||||
|
||||
// 모든 항목이 체크되었으면 "전체 선택"도 체크, 그렇지 않으면 해제
|
||||
$('#sttusChkAll').prop('checked', total === checked);
|
||||
});
|
||||
|
||||
|
||||
|
||||
});
|
||||
</script>
|
||||
<section class="content-section" id="search-section">
|
||||
<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 colspan="3">
|
||||
<div class="td-inner">
|
||||
<div class="select-box">
|
||||
<select title="검색내용조건" id="srchNbDv" name="srchNbDv">
|
||||
<option value="cn">발송 내용
|
||||
</option>
|
||||
<option value="recpntNb">수신 번호
|
||||
</option>
|
||||
<option value="sndngNb">회신 번호
|
||||
</option>
|
||||
<option value="cstmrIdnb">수신자명
|
||||
</option>
|
||||
</select>
|
||||
</div>
|
||||
<input class="input-text xl" type="text" title="검색어" name="srchStr"
|
||||
placeholder="">
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>조회 기간</th>
|
||||
<td colspan="3">
|
||||
<div class="td-inner">
|
||||
<div class="select-box">
|
||||
<select title="조회기간조건" name="srchDtDv" id="srchDtDv">
|
||||
<option value="sndngDt">발송일
|
||||
</option>
|
||||
<option value="registDt">등록일
|
||||
</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="input-container">
|
||||
<input type="text" id="srchStrtSndngDt" class="datepicker"
|
||||
title="시작 날짜 선택" autocomplete="off" name="srchStrtSndngDt">
|
||||
<span class="tilde">~</span>
|
||||
<input type="text" id="srchEndSndngDt" class="datepicker"
|
||||
title="종료 날짜 선택" autocomplete="off" name="srchEndSndngDt">
|
||||
</div>
|
||||
<div class="dateRange-btnContainer" id="searchDateRange">
|
||||
<button type="button" class="dateRange-btn" id="yesterday"
|
||||
onclick="fn_set_date('srchStrtSndngDt','srchEndSndngDt','srchEndSndngDt','1D')">
|
||||
어제
|
||||
</button>
|
||||
<button type="button" class="dateRange-btn" id="today"
|
||||
onclick="fn_set_date('srchStrtSndngDt','srchEndSndngDt','srchEndSndngDt','0')">
|
||||
오늘
|
||||
</button>
|
||||
<button type="button" class="dateRange-btn" id="threeDays"
|
||||
onclick="fn_set_date('srchStrtSndngDt','srchEndSndngDt','srchEndSndngDt','3D')">
|
||||
3일간
|
||||
</button>
|
||||
<button type="button" class="dateRange-btn" id="sevenDays"
|
||||
onclick="fn_set_date('srchStrtSndngDt','srchEndSndngDt','srchEndSndngDt','7D')">
|
||||
일주일
|
||||
</button>
|
||||
<button type="button" class="dateRange-btn" id="oneMonth"
|
||||
onclick="fn_set_date('srchStrtSndngDt','srchEndSndngDt','srchEndSndngDt','1M')">
|
||||
1개월
|
||||
</button>
|
||||
<button type="button" class="dateRange-btn" id="threeMonth"
|
||||
onclick="fn_set_date('srchStrtSndngDt','srchEndSndngDt','srchEndSndngDt','3M')">
|
||||
3개월
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>종류</th>
|
||||
<td>
|
||||
<div class="td-inner">
|
||||
<div class="b-checkbox-container">
|
||||
<label class="b-checkbox checkbox check-all">
|
||||
<input type="checkbox" value="" id = "kindChkAll">
|
||||
<span class="check"></span>
|
||||
<span class="control-label">전체</span>
|
||||
</label>
|
||||
<label class="b-checkbox checkbox">
|
||||
<input type="checkbox" value="SMS" class = "kindChk" name="srchDv">
|
||||
<span class="check"></span>
|
||||
<span class="control-label">SMS</span>
|
||||
</label>
|
||||
<label class="b-checkbox checkbox">
|
||||
<input type="checkbox" value="LMS" class = "kindChk" name="srchDv">
|
||||
<span class="check"></span>
|
||||
<span class="control-label">LMS/MMS</span>
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
<th>발송상태</th>
|
||||
<td>
|
||||
<div class="td-inner">
|
||||
<div class="b-checkbox-container">
|
||||
<label class="b-checkbox checkbox check-all">
|
||||
<input type="checkbox" value="" id = "sttusChkAll">
|
||||
<span class="check"></span>
|
||||
<span class="control-label">전체</span>
|
||||
</label>
|
||||
<label class="b-checkbox checkbox">
|
||||
<input type="checkbox" class="sttusChk" name="srchSttus" value="OK">
|
||||
<span class="check"></span>
|
||||
<span class="control-label">성공</span>
|
||||
</label>
|
||||
<label class="b-checkbox checkbox">
|
||||
<input type="checkbox" class="sttusChk" name="srchSttus" value="FAIL">
|
||||
<span class="check"></span>
|
||||
<span class="control-label">실패</span>
|
||||
</label>
|
||||
<label class="b-checkbox checkbox">
|
||||
<input type="checkbox" class="sttusChk" name="srchSttus" value="REG">
|
||||
<span class="check"></span>
|
||||
<span class="control-label">등록</span>
|
||||
</label>
|
||||
<label class="b-checkbox checkbox">
|
||||
<input type="checkbox" class="sttusChk" name="srchSttus" value="WAIT">
|
||||
<span class="check"></span>
|
||||
<span class="control-label">대기</span>
|
||||
</label>
|
||||
<label class="b-checkbox checkbox">
|
||||
<input type="checkbox" class="sttusChk" name="srchSttus" value="SEND">
|
||||
<span class="check"></span>
|
||||
<span class="control-label">전송</span>
|
||||
</label>
|
||||
<label class="b-checkbox checkbox">
|
||||
<input type="checkbox" class="sttusChk" name="srchSttus" value="BAD">
|
||||
<span class="check"></span>
|
||||
<span class="control-label">불량</span>
|
||||
</label>
|
||||
</div>
|
||||
</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>
|
||||
</section>
|
||||
<div id="pageDiv">
|
||||
</div>
|
||||
@@ -0,0 +1,145 @@
|
||||
<%@ 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 : NtcntalkAtmcSndngListR.jsp
|
||||
Description : 자동 발송 관리 > 알림톡 발송 내역 - 리스트
|
||||
Modification Information
|
||||
|
||||
수정일 수정자 수정내용
|
||||
------- -------- ---------------------------
|
||||
2024-02-28 리브가 최초 생성
|
||||
2024-05-08 이대환 내용 수정
|
||||
--%>
|
||||
<style>
|
||||
.table.vertical th.left, .table.vertical td.left {
|
||||
white-space: normal;
|
||||
max-width: 400px;
|
||||
word-wrap: break-word;
|
||||
}
|
||||
</style>
|
||||
<script>
|
||||
$(document).ready(function () {
|
||||
//전화번호 처리
|
||||
$(".recptnNb").each(function () {
|
||||
const recptnNbStr = $(this).text();
|
||||
const recptnNb = fn_format_mbtlnb(recptnNbStr.replace(/\s+/g, ''));
|
||||
$(this).text(recptnNb);
|
||||
})
|
||||
});
|
||||
</script>
|
||||
<section class="content-section">
|
||||
<div class="form-control-container">
|
||||
<div class="left">
|
||||
<div class="search-number">
|
||||
<span class="search-number__text">
|
||||
총
|
||||
<strong>
|
||||
<fmt:formatNumber value="${ resultListMap.paginationInfo.totalRecordCount }" pattern="#,###" />
|
||||
</strong> 건
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="center">
|
||||
</div>
|
||||
<div class="right">
|
||||
<div class="select-box">
|
||||
<select id="pageUnit" name="pageUnit" title="페이지당 출력될 목록건수" onchange="fn_select_list(1);">
|
||||
<c:forEach items="${ resultListMap.paginationInfo.pageUnitArr }" var="pageUnit" varStatus="pageUnitStatus">
|
||||
<option value="<c:out value="${ pageUnit }"/>" <c:if test="${ resultListMap.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">
|
||||
</div>
|
||||
<div class="center">
|
||||
</div>
|
||||
<div class="right">
|
||||
<p class="fyi blue-7">최근 1년 이내의 내역만 조회 가능, 검색 기간 최대 3개월</p>
|
||||
</div>
|
||||
</div>
|
||||
<hr class="spacing">
|
||||
<div class="table-wrapper">
|
||||
<table class="table vertical tight">
|
||||
<caption>해당 테이블에 대한 설명</caption>
|
||||
<!-- 각 열 width 설정 -->
|
||||
<colgroup>
|
||||
<col style="width: 5%;">
|
||||
<%-- <col style="width: 14%;"> --%>
|
||||
<col style="width: 25%; max-width: 850px;">
|
||||
<col style="width: 5%;">
|
||||
<col style="width: 5%;">
|
||||
<col style="width: 4%;">
|
||||
</colgroup>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>번호</th>
|
||||
<!-- <th>발송 상황</th> -->
|
||||
<th>발송 내용</th>
|
||||
<th>수신번호</th>
|
||||
<th>전송 결과</th>
|
||||
<th>
|
||||
등록일시
|
||||
<br>
|
||||
발송일시
|
||||
</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<c:choose>
|
||||
<c:when test="${ not empty resultListMap.boCtrlMap.smsSndngList }">
|
||||
<c:forEach items="${ resultListMap.boCtrlMap.smsSndngList }" var="list" varStatus="status">
|
||||
<tr>
|
||||
<td><c:out value="${list.rnum}"/></td>
|
||||
<td class="left"><c:out value="${list.cn }"/></td>
|
||||
<td class="recptnNb"><c:out value="${list.recptnNb }"/></td>
|
||||
<td>
|
||||
<c:choose>
|
||||
<c:when test="${list.sttus eq 'REG'}">
|
||||
등록
|
||||
</c:when>
|
||||
<c:when test="${list.sttus eq 'BAD'}">
|
||||
불량
|
||||
</c:when>
|
||||
<c:when test="${list.sttus eq 'WAIT'}">
|
||||
대기
|
||||
</c:when>
|
||||
<c:when test="${list.sttus eq 'SEND'}">
|
||||
전송
|
||||
</c:when>
|
||||
<c:when test="${list.sttus eq 'FAIL'}">
|
||||
실패
|
||||
</c:when>
|
||||
<c:when test="${list.sttus eq 'OK'}">
|
||||
성공
|
||||
</c:when>
|
||||
</c:choose>
|
||||
</td>
|
||||
<td>
|
||||
<c:out value="${list.registDt }"/>
|
||||
<c:out value="${list.sndngDt }"/>
|
||||
</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>
|
||||
</section>
|
||||
<div class="pagination__container">
|
||||
<ui:pagination paginationInfo="${resultListMap.paginationInfo}" type="image" jsFunction="fn_select_list"/>
|
||||
</div>
|
||||
@@ -0,0 +1,207 @@
|
||||
<%@ 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 : NtcntalkAtmcSndngListRForm.jsp
|
||||
Description : 자동 발송 관리 > 알림톡 발송 내역 폼
|
||||
Modification Information
|
||||
|
||||
수정일 수정자 수정내용
|
||||
------- -------- ---------------------------
|
||||
2024-02-28 리브가 최초 생성
|
||||
2024-05-08 이대환 내용 수정
|
||||
--%>
|
||||
<script>
|
||||
$(document).ready(function () {
|
||||
//form메소드에서 pageIndex, pageUnit 갖고옴
|
||||
let pageIndex = '<c:out value="${ resultListMap.bOEmailSrchVO.pageIndex }"/>';
|
||||
let pageUnit = '<c:out value="${ resultListMap.bOEmailSrchVO.pageUnit }"/>';
|
||||
|
||||
//초기 날짜 세팅
|
||||
const date = new Date(); // 현재 날짜
|
||||
const formattedDate = date.toISOString().split('T')[0];
|
||||
$('#srchStrtSndngDt').val(formattedDate);
|
||||
$('#srchEndSndngDt').val(formattedDate);
|
||||
$('#today').addClass("selected")
|
||||
|
||||
fn_select_list(pageIndex, pageUnit);
|
||||
//지정일
|
||||
fn_set_date('srchStrtSndngDt','srchEndSndngDt','srchEndSndngDt');
|
||||
|
||||
//날짜 선택 버튼 선택 처리
|
||||
$(".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', 'srchStrtSndngDt','srchEndSndngDt');
|
||||
fn_set_niceSelect_datePicker("#listForm");
|
||||
|
||||
//검색 조건 상태 항목 체크 여부에 따른 체크 해제
|
||||
$(".sttusChk").on("click",function(){
|
||||
fn_ctr_pCheckbox("#sttusChkAll",".sttusChk");
|
||||
});
|
||||
|
||||
|
||||
// "전체 선택" 체크박스를 클릭했을 때
|
||||
$('#sttusChkAll').on('click', function() {
|
||||
// 현재 체크 상태를 가져옴
|
||||
const isChecked = $(this).is(':checked');
|
||||
|
||||
// 다른 체크박스들을 모두 체크 또는 해제
|
||||
$('.sttusChk').prop('checked', isChecked);
|
||||
});
|
||||
|
||||
// 개별 체크박스를 클릭했을 때 "전체 선택" 체크박스 상태를 동기화
|
||||
$('.sttusChk').on('click', function() {
|
||||
const total = $('.sttusChk').length;
|
||||
const checked = $('.sttusChk:checked').length;
|
||||
|
||||
// 모든 항목이 체크되었으면 "전체 선택"도 체크, 그렇지 않으면 해제
|
||||
$('#sttusChkAll').prop('checked', total === checked);
|
||||
});
|
||||
|
||||
|
||||
});
|
||||
</script>
|
||||
<section class="content-section" id="search-section">
|
||||
<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="검색내용조건" id="srchNbDv" name="srchNbDv">
|
||||
<option value="cn">발송 내용
|
||||
</option>
|
||||
<option value="recpntNb">수신 번호
|
||||
</option>
|
||||
<option value="sndngNb">회신 번호
|
||||
</option>
|
||||
<option value="cstmrIdnb">수신자명
|
||||
</option>
|
||||
</select>
|
||||
</div>
|
||||
<input class="input-text xl" type="text" title="검색어" name="srchStr"
|
||||
placeholder="">
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>조회 기간</th>
|
||||
<td>
|
||||
<div class="td-inner">
|
||||
<div class="select-box">
|
||||
<select title="조회기간조건" name="srchDtDv" id="srchDtDv">
|
||||
<option value="sndngDt">발송일
|
||||
</option>
|
||||
<option value="registDt">등록일
|
||||
</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="input-container">
|
||||
<input type="text" id="srchStrtSndngDt" class="datepicker"
|
||||
title="시작 날짜 선택" autocomplete="off" name="srchStrtSndngDt">
|
||||
<span class="tilde">~</span>
|
||||
<input type="text" id="srchEndSndngDt" class="datepicker"
|
||||
title="종료 날짜 선택" autocomplete="off" name="srchEndSndngDt">
|
||||
</div>
|
||||
<div class="dateRange-btnContainer" id="searchDateRange">
|
||||
<button type="button" class="dateRange-btn" id="yesterday"
|
||||
onclick="fn_set_date('srchStrtSndngDt','srchEndSndngDt','srchEndSndngDt','1D')">
|
||||
어제
|
||||
</button>
|
||||
<button type="button" class="dateRange-btn" id="today"
|
||||
onclick="fn_set_date('srchStrtSndngDt','srchEndSndngDt','srchEndSndngDt','0')">
|
||||
오늘
|
||||
</button>
|
||||
<button type="button" class="dateRange-btn" id="threeDays"
|
||||
onclick="fn_set_date('srchStrtSndngDt','srchEndSndngDt','srchEndSndngDt','3D')">
|
||||
3일간
|
||||
</button>
|
||||
<button type="button" class="dateRange-btn" id="sevenDays"
|
||||
onclick="fn_set_date('srchStrtSndngDt','srchEndSndngDt','srchEndSndngDt','7D')">
|
||||
일주일
|
||||
</button>
|
||||
<button type="button" class="dateRange-btn" id="oneMonth"
|
||||
onclick="fn_set_date('srchStrtSndngDt','srchEndSndngDt','srchEndSndngDt','1M')">
|
||||
1개월
|
||||
</button>
|
||||
<button type="button" class="dateRange-btn" id="threeMonth"
|
||||
onclick="fn_set_date('srchStrtSndngDt','srchEndSndngDt','srchEndSndngDt','3M')">
|
||||
3개월
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>발송상태</th>
|
||||
<td>
|
||||
<div class="td-inner">
|
||||
<div class="b-checkbox-container">
|
||||
<label class="b-checkbox checkbox check-all">
|
||||
<input type="checkbox" value="" id = "sttusChkAll">
|
||||
<span class="check"></span>
|
||||
<span class="control-label">전체</span>
|
||||
</label>
|
||||
<label class="b-checkbox checkbox">
|
||||
<input type="checkbox" class="sttusChk" name="srchSttus" value="OK">
|
||||
<span class="check"></span>
|
||||
<span class="control-label">성공</span>
|
||||
</label>
|
||||
<label class="b-checkbox checkbox">
|
||||
<input type="checkbox" class="sttusChk" name="srchSttus" value="FAIL">
|
||||
<span class="check"></span>
|
||||
<span class="control-label">실패</span>
|
||||
</label>
|
||||
<label class="b-checkbox checkbox">
|
||||
<input type="checkbox" class="sttusChk" name="srchSttus" value="REG">
|
||||
<span class="check"></span>
|
||||
<span class="control-label">등록</span>
|
||||
</label>
|
||||
<label class="b-checkbox checkbox">
|
||||
<input type="checkbox" class="sttusChk" name="srchSttus" value="WAIT">
|
||||
<span class="check"></span>
|
||||
<span class="control-label">대기</span>
|
||||
</label>
|
||||
<label class="b-checkbox checkbox">
|
||||
<input type="checkbox" class="sttusChk" name="srchSttus" value="SEND">
|
||||
<span class="check"></span>
|
||||
<span class="control-label">전송</span>
|
||||
</label>
|
||||
<label class="b-checkbox checkbox">
|
||||
<input type="checkbox" class="sttusChk" name="srchSttus" value="BAD">
|
||||
<span class="check"></span>
|
||||
<span class="control-label">불량</span>
|
||||
</label>
|
||||
</div>
|
||||
</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>
|
||||
</section>
|
||||
<div id="pageDiv">
|
||||
</div>
|
||||
@@ -0,0 +1,384 @@
|
||||
<%@ 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 : MarktMbrSrchPopupR.jsp
|
||||
Description : 이메일 수동 발송
|
||||
Modification Information
|
||||
|
||||
수정일 수정자 수정내용
|
||||
------- -------- ---------------------------
|
||||
2024-01-23 김혜인 최초 생성
|
||||
--%>
|
||||
<!DOCTYPE html>
|
||||
<html lang="ko">
|
||||
<div id="member-search" class="modal" style="max-width: 1200px;">
|
||||
<div class="modal-header">
|
||||
<h4 id="title">회원 검색</h4>
|
||||
</div>
|
||||
<div class="modal-content">
|
||||
<form id="listForm">
|
||||
<section class="content-section" id="mbrSrchSection">
|
||||
<span>
|
||||
<c:choose>
|
||||
<c:when test="${not empty mbrSrchVO.actionDv}">
|
||||
<c:choose>
|
||||
<c:when test="${ mbrSrchVO.actionDv eq 'sms'}"><%--sms인 경우--%>
|
||||
<span class="red-7">광고 수신 및 SMS 수신에 동의한 회원만 검색됩니다.</span>
|
||||
</c:when>
|
||||
<c:otherwise>
|
||||
<span class="red-7">광고 수신 및 이메일 수신에 동의한 회원만 검색됩니다.</span><%--email인 경우--%>
|
||||
</c:otherwise>
|
||||
</c:choose>
|
||||
<span class="red-7">(검색어는 정확하게 입력해주세요.)</span>
|
||||
</c:when>
|
||||
<c:otherwise><%--쿠폰인 경우--%>
|
||||
<span class="red-7">검색어는 정확하게 입력해주세요.</span>
|
||||
</c:otherwise>
|
||||
</c:choose>
|
||||
</span>
|
||||
<div class="table-wrapper">
|
||||
<table class="table">
|
||||
<caption>회원 검색</caption>
|
||||
<colgroup>
|
||||
<col style="width: 12%;">
|
||||
<col>
|
||||
</colgroup>
|
||||
<tr>
|
||||
<th>이름</th>
|
||||
<td>
|
||||
<div class="td-inner">
|
||||
<input class="input-text xl" type="text" title="검색 키워드"
|
||||
name="srchMbrNm" placeholder="이름">
|
||||
</div>
|
||||
</td>
|
||||
<th>아이디</th>
|
||||
<td>
|
||||
<div class="td-inner">
|
||||
<input class="input-text xl" type="text" title="검색 키워드"
|
||||
name="srchKywordID" placeholder="아이디">
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>이메일</th>
|
||||
<td>
|
||||
<div class="td-inner">
|
||||
<input class="input-text xl" type="text" title="검색 키워드"
|
||||
name="srchKywordEmail" placeholder="이메일">
|
||||
</div>
|
||||
</td>
|
||||
<th>휴대폰번호</th>
|
||||
<td>
|
||||
<div class="td-inner">
|
||||
<input class="input-text xl" type="text" title="검색 키워드" id="srchKywordMb"
|
||||
name="srchKywordMb" placeholder="휴대폰번호('-'없이 입력)">
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
<div class="form-control-container">
|
||||
<div class="center">
|
||||
<button type="button" class="btn outline" id="btnResetForm"><spring:message
|
||||
code="button.init"/></button>
|
||||
<button type="button" class="btn primary" id="srchBtn"><spring:message
|
||||
code="button.search"/></button>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
<input type = "hidden" id = "actionDv" name = "actionDv" value = "<c:out value = '${resultMap.vo.actionDv}'/>"/>
|
||||
<div id="pageDiv">
|
||||
<%--임시 section--%>
|
||||
<section class="content-section">
|
||||
<div class="form-control-container">
|
||||
<div class="left">
|
||||
<div class="search-number">
|
||||
<span class="search-number__text">
|
||||
총 <strong><c:out value="${ resultMap.paginationInfo.totalRecordCount }"/></strong>건
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="center">
|
||||
</div>
|
||||
<div class="right">
|
||||
<div class="select-box">
|
||||
<select title="정렬순">
|
||||
<option>최근 가입순</option>
|
||||
<option>마일리지 많은순</option>
|
||||
<option>마일리지 적은순</option>
|
||||
</select>
|
||||
</div>
|
||||
<!-- 코드 사용 -->
|
||||
<div class="select-box">
|
||||
<select title="페이지당 출력될 목록건수" name="pageUnit" id="pageUnit"
|
||||
onchange="fn_select_list(1);return false;">
|
||||
<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">
|
||||
<hr class="spacing">
|
||||
<div class="table-wrapper">
|
||||
<table class="table vertical" id="mbrList">
|
||||
<caption>회원 목록</caption>
|
||||
<!-- 각 열 width 설정 -->
|
||||
<colgroup>
|
||||
<col style="width: 4%;">
|
||||
<col style="width: 6%;">
|
||||
<col style="width: 10%;">
|
||||
<col style="width: 8%;">
|
||||
<col style="width: auto">
|
||||
<col style="width: auto;">
|
||||
<col style="width: 6%;">
|
||||
<col style="width: 6%;">
|
||||
${resultMap.shopInfo.ordrSetupInfo.cashAt eq 'Y' ? '<col style="width: 6%;">' : ''}
|
||||
<col style="width: 10%;">
|
||||
<col style="width: 10%">
|
||||
</colgroup>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>
|
||||
<label class="b-checkbox checkbox is-medium check-all">
|
||||
<input type="checkbox" value="" id="chkA">
|
||||
<span class="check"></span>
|
||||
</label>
|
||||
</th>
|
||||
<th>번호</th>
|
||||
<th>아이디</th>
|
||||
<th>이름</th>
|
||||
<th>이메일</th>
|
||||
<th>핸드폰번호</th>
|
||||
<th>등급</th>
|
||||
<th>마일리지</th>
|
||||
${resultMap.shopInfo.ordrSetupInfo.cashAt eq 'Y' ? '<th>GC머니</th>' : ''}
|
||||
<th>가입일</th>
|
||||
<th>최종방문 일시</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td colspan="100%"><spring:message code="common.nodata"/></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<div id="modalDv">
|
||||
</div>
|
||||
<hr class="spacing">
|
||||
<hr class="spacing">
|
||||
<div class="form-control-container">
|
||||
<div class="left"></div>
|
||||
<div class="center">
|
||||
</div>
|
||||
<div class="right">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button type = "button" class="btn primary" id="selectMbrBtn">선택한 회원 <spring:message code="button.apply"/> </button>
|
||||
<button type = "button" class="btn primary" id="srchMbrBtn">검색한 회원 <spring:message code="button.apply"/></button>
|
||||
<a rel="modal:close" class="btn outline"><spring:message code="button.close"/></a>
|
||||
</div>
|
||||
</div>
|
||||
<script>
|
||||
/*******************************************
|
||||
검색 조건 이벤트 설정
|
||||
********************************************/
|
||||
/*niceSelector먹이기*/
|
||||
fn_set_niceSelect_datePicker("#pageDiv");
|
||||
|
||||
/*검색조건 > 초기화 버튼 클릭 이벤트*/
|
||||
$('#btnResetForm').on('click', function(){
|
||||
fn_reset_form('mbrSrchSection');
|
||||
});
|
||||
|
||||
|
||||
/*검색 버튼(검색어 지정 안할 시 검색 안됨)*/
|
||||
$("#srchBtn").on('click',function(){
|
||||
let valList = [];
|
||||
|
||||
$('#mbrSrchSection').find('input').each(function(){
|
||||
let value = $(this).val();
|
||||
if(value !== ''){
|
||||
valList.push(value);
|
||||
}
|
||||
});
|
||||
if(valList.length === 0) {
|
||||
alert("검색어를 입력해주세요");
|
||||
}else{
|
||||
fn_select_list(1);
|
||||
}
|
||||
});
|
||||
|
||||
$('#listForm').on('keydown', function(e) {
|
||||
if (e.keyCode == 13) {
|
||||
e.preventDefault();
|
||||
$('#srchBtn').click();
|
||||
}
|
||||
});
|
||||
|
||||
/*검색어 휴대폰 번호 숫자만허용*/
|
||||
$("#srchKywordMb").on('input',function(){
|
||||
$("#srchKywordMb").val($("#srchKywordMb").val().replace(/[^0-9]/g, ""));
|
||||
});
|
||||
|
||||
/*선택 회원 적용 클릭*/
|
||||
$("#selectMbrBtn").on("click",function(){
|
||||
const chkedMbrInnb = $("input[name='mbrInnb']:checked");
|
||||
if (chkedMbrInnb.length > 0) {
|
||||
/*sms,이메일,쿠폰 구분*/
|
||||
const actionDv = $("#actionDv").val();
|
||||
/*결과를 저장할 배열*/
|
||||
let resultArr = [];
|
||||
|
||||
// 회원 고유 번호(공통)
|
||||
const mbrInnbArr = [];
|
||||
chkedMbrInnb.each(function() {
|
||||
mbrInnbArr.push($(this).val());
|
||||
});
|
||||
|
||||
if(actionDv){//이메일,sms 회원 검색 시
|
||||
// 회원 명
|
||||
const recpntNmArr = [];
|
||||
chkedMbrInnb.closest("td").find(".recpntNm").each(function () {
|
||||
recpntNmArr.push($(this).val());
|
||||
});
|
||||
|
||||
// 해당 필요 정보(이메일주소 혹은 전화번호)
|
||||
const sndngInfoArr = [];
|
||||
chkedMbrInnb.closest("td").find(".sndngInfo").each(function () {
|
||||
sndngInfoArr.push($(this).val());
|
||||
});
|
||||
|
||||
// 배열을 순회하며 객체로 변환
|
||||
for (let i = 0; i < mbrInnbArr.length; i++) {
|
||||
resultArr.push({
|
||||
mbrInnb: mbrInnbArr[i],
|
||||
recpntNm: recpntNmArr[i],
|
||||
sndngInfo: sndngInfoArr[i]
|
||||
});
|
||||
}
|
||||
$(".srchMbrCnt").text(resultArr.length+" 명");
|
||||
}else{ //쿠폰 회원 검색시
|
||||
//회원구분코드
|
||||
const mbrDvCdArr = [];
|
||||
chkedMbrInnb.closest("td").find(".mbrDvCd").each(function () {
|
||||
mbrDvCdArr.push($(this).val());
|
||||
});
|
||||
|
||||
// 배열을 순회하며 객체로 변환
|
||||
for (let i = 0; i < mbrInnbArr.length; i++) {
|
||||
resultArr.push({
|
||||
mbrInnb: mbrInnbArr[i],
|
||||
mbrDvCD: mbrDvCdArr[i],
|
||||
});
|
||||
}
|
||||
}
|
||||
$(".mbrInfo").val(JSON.stringify(resultArr));
|
||||
fn_close_modal("member-search");
|
||||
} else {
|
||||
//회원이 체크되지 않으면 안내 문구 호출
|
||||
alert("적용할 회원이 없습니다.");
|
||||
}
|
||||
});
|
||||
|
||||
/*검색 회원 적용 클릭*/
|
||||
$("#srchMbrBtn").on("click", function () {
|
||||
let valList = [];
|
||||
/*검색어 값 여부 */
|
||||
$('#mbrSrchSection').find('input').each(function () {
|
||||
let value = $(this).val();
|
||||
if (value !== '') {
|
||||
valList.push(value);
|
||||
}
|
||||
});
|
||||
/*검색어 입력 여부에 따른 분기 처 리*/
|
||||
if (valList.length > 0) {
|
||||
let dataStr = $("#mbrSrchSection").find("input").serialize();
|
||||
|
||||
const actionDv = $("#actionDv").val();
|
||||
|
||||
if(actionDv){
|
||||
dataStr = dataStr+"&actionDv="+actionDv;
|
||||
}
|
||||
|
||||
$.ajax({
|
||||
type: "post",
|
||||
url: "<c:url value='/mngr/mbr/selectSndngTargtMbr'/>",
|
||||
data: dataStr,
|
||||
success: function (data) {
|
||||
let resultArr = data.resBody.result;
|
||||
resultArr = JSON.parse(resultArr);
|
||||
let tot = resultArr.result.mbrInfoCnt;
|
||||
resultArr = resultArr.result.mbrInfo;
|
||||
// 결과 출력
|
||||
const actionDv = $("#actionDv").val();
|
||||
if(actionDv){//sms, email인 경우
|
||||
$(".srchMbrCnt").text(tot+" 명");
|
||||
}
|
||||
$(".mbrInfo").val(resultArr);
|
||||
|
||||
fn_close_modal("member-search");
|
||||
}
|
||||
});
|
||||
} else {
|
||||
alert("적용할 회원이 없습니다.");
|
||||
}
|
||||
});
|
||||
|
||||
/* ********************************************************
|
||||
* 목록 조회 function
|
||||
******************************************************** */
|
||||
//회원 목록 조회(ajax)
|
||||
if(typeof fn_select_list === 'undefined'){
|
||||
function fn_select_list (pageIndex, pageUnit) {
|
||||
let dataStr;
|
||||
if(!pageIndex) {
|
||||
$('#pageIndex').val(1);
|
||||
} else {
|
||||
$('#pageIndex').val(pageIndex);
|
||||
}
|
||||
|
||||
if(!pageUnit) {
|
||||
dataStr = $('#listForm').serialize();
|
||||
} else {
|
||||
if($('#pageUnit').length){
|
||||
$('#pageUnit').val(pageUnit);
|
||||
dataStr = $('#listForm').serialize();
|
||||
} else {
|
||||
dataStr = $('#listForm').serialize()+'&pageUnit='+pageUnit;
|
||||
}
|
||||
}
|
||||
$.ajax({
|
||||
type: "post",
|
||||
url : "<c:url value='/mngr/mbr/selectMbrSrchPopupRInqire'/>",
|
||||
data : dataStr,
|
||||
success:function(resultHtml) {
|
||||
$('#pageDiv').html(resultHtml);
|
||||
fn_set_niceSelect_datePicker('#pageDiv');
|
||||
$(".mbtlnb").each(function(){
|
||||
let mbtlnb = $(this).text().replace(/\s+/g, '');
|
||||
mbtlnb = fn_format_mbtlnb(mbtlnb);
|
||||
$(this).text(mbtlnb);
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
</script>
|
||||
</html>
|
||||
@@ -0,0 +1,231 @@
|
||||
<%@ 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 : EmailPassivSndngC.jsp
|
||||
Description : 이메일 수동 발송 폼
|
||||
Modification Information
|
||||
|
||||
수정일 수정자 수정내용
|
||||
------- -------- ---------------------------
|
||||
2024-02-28 리브가 최초 생성
|
||||
2024-04-04 이대환 sndng>email 분리
|
||||
--%>
|
||||
<script>
|
||||
$(document).ready(function () {
|
||||
$('.rjctCopy').hide();
|
||||
|
||||
var urlParams = new URLSearchParams(window.location.search);
|
||||
|
||||
if (urlParams.has('mbrInfo')) {
|
||||
$('.mbrInfo').val(urlParams.get('mbrInfo'));
|
||||
$('.srchMbrCnt').html(urlParams.get('sndngCnt')+' 명');
|
||||
}
|
||||
});
|
||||
|
||||
/**********************************************
|
||||
* 이메일 수신거부 링크 입력 이벤트
|
||||
***********************************************/
|
||||
$("input[name='recptnRjctUrl']").change(function() {
|
||||
$('.rjctCopy').hide();
|
||||
});
|
||||
|
||||
|
||||
/**********************************************
|
||||
* ? 버튼 처리
|
||||
***********************************************/
|
||||
$(".mini-info-btn").on("click", function (event){
|
||||
event.preventDefault();
|
||||
const info = $(this).data("info");
|
||||
|
||||
$("#" + info).css({
|
||||
top: $(this).offset().top,
|
||||
left: $(this).offset().left,
|
||||
});
|
||||
|
||||
if ($(this).offset().left > 1000) {
|
||||
$("#" + info).css({
|
||||
left: $(this).offset().left - $("#" + info).width() - 10,
|
||||
});
|
||||
}
|
||||
|
||||
$("#" + info).show();
|
||||
})
|
||||
|
||||
fn_set_niceSelect_datePicker("#tx_editor_form");
|
||||
</script>
|
||||
<form id='tx_editor_form' name="tx_editor_form">
|
||||
<section class="content-section">
|
||||
<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>
|
||||
<div class="td-inner">
|
||||
<input class="input-text xl" type="text" title="해당 인풋에 대한 설명" name="sndrEmail" id="sndrEmail"
|
||||
placeholder="메일 주소 입력">
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>받는 사람 (검색 입력)</th>
|
||||
<td>
|
||||
<div class="td-inner">
|
||||
<input type="hidden" class="input-text mbrInfo" name="mbrInfo"/>
|
||||
<span class="fw-500 fs-15 ml-5 srchMbrCnt">0 명</span>
|
||||
<button type="button" id="mbrSrchBtn"
|
||||
class="btn xsm primary" title="회원 검색 새창열림" onclick="fn_open_modal('#modalDiv',
|
||||
'#member-search',
|
||||
'/mngr/ntcn/email/selectMbrSrchPopupRForm',
|
||||
{'actionDv' : 'email'}); return false;">
|
||||
회원검색
|
||||
</button>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>받는 사람 (직접 입력)</th>
|
||||
<td>
|
||||
<div class="td-inner">
|
||||
<input class="input-text xl" type="text" title="해당 인풋에 대한 설명" name="recpntEmail" id="recpntEmail"
|
||||
placeholder="메일 주소는 ,(콤마)로 구분하여 입력">
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<%-- <tr>
|
||||
<th>받는 사람 (엑셀 입력)</th>
|
||||
<td>
|
||||
<div class="td-inner">
|
||||
<div class="table-wrapper" style="width: 600px;">
|
||||
<table class="table vertical">
|
||||
<caption>해당 테이블에 대한 설명</caption>
|
||||
<colgroup>
|
||||
<col>
|
||||
<col style="width:20%;">
|
||||
</colgroup>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>엑셀 파일 업로드</th>
|
||||
<th>
|
||||
<button class="circle-btn add"><span
|
||||
class="visually-hidden">추가</span></button>
|
||||
</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>
|
||||
<input class="input-text md" type="text"
|
||||
title="해당 인풋에 대한 설명" placeholder=""
|
||||
value="111">
|
||||
<div class="input-file">
|
||||
<input type="file" id="f-1">
|
||||
<label for="f-1">첨부 파일</label>
|
||||
</div>
|
||||
</td>
|
||||
<td>
|
||||
<button class="circle-btn delete"><span
|
||||
class="visually-hidden">삭제</span></button>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
</tr> --%>
|
||||
<tr>
|
||||
<th>최근 이메일 불러오기</th>
|
||||
<td>
|
||||
<div class="td-inner">
|
||||
<div class="select-box">
|
||||
<select class="lg" onchange="fn_apply_rcntEmail(this.value)" title="해당 셀렉트에 대한 설명">
|
||||
<option value="">최근 발송한 이메일 선택</option>
|
||||
<c:forEach items="${ resultListMap.boCtrlMap }" var="list" varStatus="status">
|
||||
<option value="${list.emailLogInnb}">
|
||||
[<c:out value="${list.registDt}"/>] <c:out value="${list.sj}"/>
|
||||
</option>
|
||||
</c:forEach>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>제목</th>
|
||||
<td>
|
||||
<div class="td-inner vertical">
|
||||
<input class="input-text xl" type="text" title="제목" id="sj" name="sj"
|
||||
placeholder="메일 제목을 입력하세요.">
|
||||
<div class="gray-7">
|
||||
<p class="fyi">‘정보통신망이용 촉진 및 정보 보호 등의 관한 법률 및 시행령’에 따라 광고 전송 시 제목에 (광고)를 표시해주세요.</p>
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>내용</th>
|
||||
<td>
|
||||
<div class="td-inner">
|
||||
<%@ include file="EmailPassivSndngEditor.jsp" %>
|
||||
<textarea class="textarea" id="cn" name="cn" style="display: none"></textarea>
|
||||
<div class="gray-7">
|
||||
<p class="fyi">‘정보통신망이용 촉진 및 정보보호등에 관한 법률 및 시행령’에 규정된 광고 전송 사업자의 의무사항을 준수하세요.
|
||||
<button type="button" class="mini-info-btn mb-3" data-info="info01">?</button>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<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>수신 거부 링크
|
||||
<button type="button" class="mini-info-btn mb-3" data-info="info02">?</button>
|
||||
</th>
|
||||
<td>
|
||||
<div class="td-inner">
|
||||
https://
|
||||
<input class="input-text md" type="text" title="해당 인풋에 대한 설명" name="recptnRjctUrl" value="/mngr/ntcn/email/updateMarktRecptnArgeAt">
|
||||
?mbrInnb={mbrInnb}
|
||||
<div class="manage-btn-container">
|
||||
<button type="button" class="btn xsm outline rjctCopy" onclick="recptnRjct('ko')">한글 복사</button>
|
||||
<button type="button" class="btn xsm outline rjctCopy" onclick="recptnRjct('en')">영문 복사</button>
|
||||
<button type="button" class="btn xsm gray" onclick="recptnRjct()">정상 여부 확인</button>
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div class="b-checkbox-container justify-center fs-16 mt-30">
|
||||
<label class="b-checkbox checkbox">
|
||||
<input type="checkbox" id="legalResp">
|
||||
<span class="check"></span>
|
||||
<span class="control-label">‘정보통신망이용 촉진 및 정보보호등에 관한 법률 및 시행령’ 위반에 따른 책임은 당사에게 있음에 동의합니다.</span>
|
||||
</label>
|
||||
</div>
|
||||
</section>
|
||||
</form>
|
||||
@@ -0,0 +1,413 @@
|
||||
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
|
||||
<%-- <link rel="stylesheet" href="<c:url value='/daumeditor/css/content_view.css'/>"> --%>
|
||||
<%-- <link rel="stylesheet" href="<c:url value='/daumeditor/css/content_wysiwyg.css'/>"> --%>
|
||||
<%-- <link rel="stylesheet" href="<c:url value='/daumeditor/css/editor.css'/>"> --%>
|
||||
<%-- <link rel="stylesheet" href="<c:url value='/daumeditor/css/popup.css'/>"> --%>
|
||||
<style>
|
||||
#tx_horizontalrule_menu a{
|
||||
width: 150px; height: 29px;
|
||||
}
|
||||
</style>
|
||||
<!-- <div class="body"> -->
|
||||
<!-- 에디터 시작 -->
|
||||
<!--
|
||||
@decsription
|
||||
등록하기 위한 Form으로 상황에 맞게 수정하여 사용한다. Form 이름은 에디터를 생성할 때 설정값으로 설정한다.
|
||||
-->
|
||||
<!-- <form name="tx_editor_form" id="tx_editor_form" action="http://posttestserver.com/post.php" method="post" accept-charset="utf-8"> -->
|
||||
<!-- 에디터 컨테이너 시작 -->
|
||||
<div id="tx_trex_container" class="tx-editor-container" style="width: 100%">
|
||||
|
||||
<!-- 툴바 - 기본 시작 -->
|
||||
<!--
|
||||
@decsription
|
||||
툴바 버튼의 그룹핑의 변경이 필요할 때는 위치(왼쪽, 가운데, 오른쪽) 에 따라 <li> 아래의 <div>의 클래스명을 변경하면 된다.
|
||||
tx-btn-lbg: 왼쪽, tx-btn-bg: 가운데, tx-btn-rbg: 오른쪽, tx-btn-lrbg: 독립적인 그룹
|
||||
|
||||
드롭다운 버튼의 크기를 변경하고자 할 경우에는 넓이에 따라 <li> 아래의 <div>의 클래스명을 변경하면 된다.
|
||||
tx-slt-70bg, tx-slt-59bg, tx-slt-42bg, tx-btn-43lrbg, tx-btn-52lrbg, tx-btn-57lrbg, tx-btn-71lrbg
|
||||
tx-btn-48lbg, tx-btn-48rbg, tx-btn-30lrbg, tx-btn-46lrbg, tx-btn-67lrbg, tx-btn-49lbg, tx-btn-58bg, tx-btn-46bg, tx-btn-49rbg
|
||||
-->
|
||||
<div id="tx_toolbar_basic" class="tx-toolbar tx-toolbar-basic"><div class="tx-toolbar-boundary">
|
||||
<ul class="tx-bar tx-bar-left">
|
||||
<li class="tx-list">
|
||||
<div id="tx_fontfamily" unselectable="on" class="tx-slt-70bg tx-fontfamily">
|
||||
<a href="javascript:;" title="글꼴">굴림</a>
|
||||
</div>
|
||||
<div id="tx_fontfamily_menu" class="tx-fontfamily-menu tx-menu" unselectable="on"></div>
|
||||
</li>
|
||||
</ul>
|
||||
<ul class="tx-bar tx-bar-left">
|
||||
<li class="tx-list">
|
||||
<div unselectable="on" class="tx-slt-42bg tx-fontsize" id="tx_fontsize">
|
||||
<a href="javascript:;" title="글자크기">9pt</a>
|
||||
</div>
|
||||
<div id="tx_fontsize_menu" class="tx-fontsize-menu tx-menu" unselectable="on"></div>
|
||||
</li>
|
||||
</ul>
|
||||
<ul class="tx-bar tx-bar-left tx-group-font">
|
||||
|
||||
<li class="tx-list">
|
||||
<div unselectable="on" class=" tx-btn-lbg tx-bold" id="tx_bold">
|
||||
<a href="javascript:;" class="tx-icon" title="굵게 (Ctrl+B)">굵게</a>
|
||||
</div>
|
||||
</li>
|
||||
<li class="tx-list">
|
||||
<div unselectable="on" class=" tx-btn-bg tx-underline" id="tx_underline">
|
||||
<a href="javascript:;" class="tx-icon" title="밑줄 (Ctrl+U)">밑줄</a>
|
||||
</div>
|
||||
</li>
|
||||
<li class="tx-list">
|
||||
<div unselectable="on" class=" tx-btn-bg tx-italic" id="tx_italic">
|
||||
<a href="javascript:;" class="tx-icon" title="기울임 (Ctrl+I)">기울임</a>
|
||||
</div>
|
||||
</li>
|
||||
<li class="tx-list">
|
||||
<div unselectable="on" class=" tx-btn-bg tx-strike" id="tx_strike">
|
||||
<a href="javascript:;" class="tx-icon" title="취소선 (Ctrl+D)">취소선</a>
|
||||
</div>
|
||||
</li>
|
||||
<li class="tx-list">
|
||||
<div unselectable="on" class=" tx-slt-tbg tx-forecolor" id="tx_forecolor">
|
||||
<a href="javascript:;" class="tx-icon" title="글자색">글자색</a>
|
||||
<a href="javascript:;" class="tx-arrow" title="글자색 선택">글자색 선택</a>
|
||||
</div>
|
||||
<div id="tx_forecolor_menu" class="tx-menu tx-forecolor-menu tx-colorpallete"
|
||||
unselectable="on"></div>
|
||||
</li>
|
||||
<li class="tx-list">
|
||||
<div unselectable="on" class=" tx-slt-brbg tx-backcolor" id="tx_backcolor">
|
||||
<a href="javascript:;" class="tx-icon" title="글자 배경색">글자 배경색</a>
|
||||
<a href="javascript:;" class="tx-arrow" title="글자 배경색 선택">글자 배경색 선택</a>
|
||||
</div>
|
||||
<div id="tx_backcolor_menu" class="tx-menu tx-backcolor-menu tx-colorpallete"
|
||||
unselectable="on"></div>
|
||||
</li>
|
||||
</ul>
|
||||
<ul class="tx-bar tx-bar-left tx-group-align">
|
||||
<li class="tx-list">
|
||||
<div unselectable="on" class=" tx-btn-lbg tx-alignleft" id="tx_alignleft">
|
||||
<a href="javascript:;" class="tx-icon" title="왼쪽정렬 (Ctrl+,)">왼쪽정렬</a>
|
||||
</div>
|
||||
</li>
|
||||
<li class="tx-list">
|
||||
<div unselectable="on" class=" tx-btn-bg tx-aligncenter" id="tx_aligncenter">
|
||||
<a href="javascript:;" class="tx-icon" title="가운데정렬 (Ctrl+.)">가운데정렬</a>
|
||||
</div>
|
||||
</li>
|
||||
<li class="tx-list">
|
||||
<div unselectable="on" class=" tx-btn-bg tx-alignright" id="tx_alignright">
|
||||
<a href="javascript:;" class="tx-icon" title="오른쪽정렬 (Ctrl+/)">오른쪽정렬</a>
|
||||
</div>
|
||||
</li>
|
||||
<li class="tx-list">
|
||||
<div unselectable="on" class=" tx-btn-rbg tx-alignfull" id="tx_alignfull">
|
||||
<a href="javascript:;" class="tx-icon" title="양쪽정렬">양쪽정렬</a>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
<ul class="tx-bar tx-bar-left tx-group-tab">
|
||||
<li class="tx-list">
|
||||
<div unselectable="on" class=" tx-btn-lbg tx-indent" id="tx_indent">
|
||||
<a href="javascript:;" title="들여쓰기 (Tab)" class="tx-icon">들여쓰기</a>
|
||||
</div>
|
||||
</li>
|
||||
<li class="tx-list">
|
||||
<div unselectable="on" class=" tx-btn-rbg tx-outdent" id="tx_outdent">
|
||||
<a href="javascript:;" title="내어쓰기 (Shift+Tab)" class="tx-icon">내어쓰기</a>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
<ul class="tx-bar tx-bar-left tx-group-list">
|
||||
<li class="tx-list">
|
||||
<div unselectable="on" class="tx-slt-31lbg tx-lineheight" id="tx_lineheight">
|
||||
<a href="javascript:;" class="tx-icon" title="줄간격">줄간격</a>
|
||||
<a href="javascript:;" class="tx-arrow" title="줄간격">줄간격 선택</a>
|
||||
</div>
|
||||
<div id="tx_lineheight_menu" class="tx-lineheight-menu tx-menu" unselectable="on"></div>
|
||||
</li>
|
||||
<li class="tx-list">
|
||||
<div unselectable="on" class="tx-slt-31rbg tx-styledlist" id="tx_styledlist">
|
||||
<a href="javascript:;" class="tx-icon" title="리스트">리스트</a>
|
||||
<a href="javascript:;" class="tx-arrow" title="리스트">리스트 선택</a>
|
||||
</div>
|
||||
<div id="tx_styledlist_menu" class="tx-styledlist-menu tx-menu" unselectable="on"></div>
|
||||
</li>
|
||||
</ul>
|
||||
<ul class="tx-bar tx-bar-left tx-group-etc">
|
||||
<li class="tx-list">
|
||||
<div unselectable="on" class=" tx-btn-lbg tx-emoticon" id="tx_emoticon">
|
||||
<a href="javascript:;" class="tx-icon" title="이모티콘">이모티콘</a>
|
||||
</div>
|
||||
<div id="tx_emoticon_menu" class="tx-emoticon-menu tx-menu" unselectable="on"></div>
|
||||
</li>
|
||||
<li class="tx-list">
|
||||
<div unselectable="on" class=" tx-btn-bg tx-link" id="tx_link">
|
||||
<a href="javascript:;" class="tx-icon" title="링크 (Ctrl+K)">링크</a>
|
||||
</div>
|
||||
<div id="tx_link_menu" class="tx-link-menu tx-menu"></div>
|
||||
</li>
|
||||
<li class="tx-list">
|
||||
<div unselectable="on" class=" tx-btn-bg tx-specialchar" id="tx_specialchar">
|
||||
<a href="javascript:;" class="tx-icon" title="특수문자">특수문자</a>
|
||||
</div>
|
||||
<div id="tx_specialchar_menu" class="tx-specialchar-menu tx-menu"></div>
|
||||
</li>
|
||||
<li class="tx-list">
|
||||
<div unselectable="on" class=" tx-btn-bg tx-table" id="tx_table">
|
||||
<a href="javascript:;" class="tx-icon" title="표만들기">표만들기</a>
|
||||
</div>
|
||||
<div id="tx_table_menu" class="tx-table-menu tx-menu" unselectable="on">
|
||||
<div class="tx-menu-inner">
|
||||
<div class="tx-menu-preview"></div>
|
||||
<div class="tx-menu-rowcol"></div>
|
||||
<div class="tx-menu-deco"></div>
|
||||
<div class="tx-menu-enter"></div>
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
<li class="tx-list">
|
||||
<div unselectable="on" class=" tx-btn-rbg tx-horizontalrule" id="tx_horizontalrule">
|
||||
<a href="javascript:;" class="tx-icon" title="구분선">구분선</a>
|
||||
</div>
|
||||
<div id="tx_horizontalrule_menu" class="tx-horizontalrule-menu tx-menu" unselectable="on"></div>
|
||||
</li>
|
||||
</ul>
|
||||
<ul class="tx-bar tx-bar-left">
|
||||
<li class="tx-list">
|
||||
<div unselectable="on" class=" tx-btn-lbg tx-richtextbox" id="tx_richtextbox">
|
||||
<a href="javascript:;" class="tx-icon" title="글상자">글상자</a>
|
||||
</div>
|
||||
<div id="tx_richtextbox_menu" class="tx-richtextbox-menu tx-menu">
|
||||
<div class="tx-menu-header">
|
||||
<div class="tx-menu-preview-area">
|
||||
<div class="tx-menu-preview"></div>
|
||||
</div>
|
||||
<div class="tx-menu-switch">
|
||||
<div class="tx-menu-simple tx-selected"><a><span>간단 선택</span></a></div>
|
||||
<div class="tx-menu-advanced"><a><span>직접 선택</span></a></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="tx-menu-inner">
|
||||
</div>
|
||||
<div class="tx-menu-footer">
|
||||
<img class="tx-menu-confirm"
|
||||
src="/daumeditor/images/icon/editor/btn_confirm.gif?rv=1.0.1" alt=""/>
|
||||
<img class="tx-menu-cancel" hspace="3"
|
||||
src="/daumeditor/images/icon/editor/btn_cancel.gif?rv=1.0.1" alt=""/>
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
<li class="tx-list">
|
||||
<div unselectable="on" class=" tx-btn-bg tx-quote" id="tx_quote">
|
||||
<a href="javascript:;" class="tx-icon" title="인용구 (Ctrl+Q)">인용구</a>
|
||||
</div>
|
||||
<div id="tx_quote_menu" class="tx-quote-menu tx-menu" unselectable="on"></div>
|
||||
</li>
|
||||
<li class="tx-list">
|
||||
<div unselectable="on" class=" tx-btn-bg tx-background" id="tx_background">
|
||||
<a href="javascript:;" class="tx-icon" title="배경색">배경색</a>
|
||||
</div>
|
||||
<div id="tx_background_menu" class="tx-menu tx-background-menu tx-colorpallete"
|
||||
unselectable="on"></div>
|
||||
</li>
|
||||
<li class="tx-list">
|
||||
<div unselectable="on" class=" tx-btn-rbg tx-dictionary" id="tx_dictionary">
|
||||
<a href="javascript:;" class="tx-icon" title="사전">사전</a>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
<ul class="tx-bar tx-bar-left tx-group-undo">
|
||||
<li class="tx-list">
|
||||
<div unselectable="on" class=" tx-btn-lbg tx-undo" id="tx_undo">
|
||||
<a href="javascript:;" class="tx-icon" title="실행취소 (Ctrl+Z)">실행취소</a>
|
||||
</div>
|
||||
</li>
|
||||
<li class="tx-list">
|
||||
<div unselectable="on" class=" tx-btn-rbg tx-redo" id="tx_redo">
|
||||
<a href="javascript:;" class="tx-icon" title="다시실행 (Ctrl+Y)">다시실행</a>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
<ul class="tx-bar tx-bar-left">
|
||||
<li class="tx-list">
|
||||
<div unselectable="on" id="tx_image" class="tx-image tx-btn-trans">
|
||||
<a href="javascript:;" title="사진" class="tx-text">사진</a>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
<ul class="tx-bar tx-bar-right">
|
||||
<li class="tx-list">
|
||||
<div unselectable="on" class="tx-btn-nlrbg tx-advanced" id="tx_advanced">
|
||||
<a href="javascript:;" class="tx-icon" title="툴바 더보기">툴바 더보기</a>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
<ul class="tx-bar tx-bar-right">
|
||||
<li class="tx-list">
|
||||
<div unselectable="on" class="tx-btn-lrbg tx-fullscreen" id="tx_fullscreen">
|
||||
<a href="javascript:;" class="tx-icon" title="넓게쓰기 (Ctrl+M)">넓게쓰기</a>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
<ul class="tx-bar tx-bar-right">
|
||||
<li class="tx-list" style="padding-top: 0">
|
||||
<div unselectable="on" class="tx-switchtoggle" id="tx_switchertoggle">
|
||||
<a href="javascript:;" title="에디터 타입">에디터</a>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
</div></div>
|
||||
<!-- 툴바 - 기본 끝 -->
|
||||
<!-- 툴바 - 더보기 시작 -->
|
||||
<div id="tx_toolbar_advanced" class="tx-toolbar tx-toolbar-advanced"><div class="tx-toolbar-boundary">
|
||||
<ul class="tx-bar tx-bar-left">
|
||||
<li class="tx-list">
|
||||
<div class="tx-tableedit-title"></div>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<ul class="tx-bar tx-bar-left tx-group-align">
|
||||
<li class="tx-list">
|
||||
<div unselectable="on" class="tx-btn-lbg tx-mergecells" id="tx_mergecells">
|
||||
<a href="javascript:;" class="tx-icon2" title="병합">병합</a>
|
||||
</div>
|
||||
<div id="tx_mergecells_menu" class="tx-mergecells-menu tx-menu" unselectable="on"></div>
|
||||
</li>
|
||||
<li class="tx-list">
|
||||
<div unselectable="on" class="tx-btn-bg tx-insertcells" id="tx_insertcells">
|
||||
<a href="javascript:;" class="tx-icon2" title="삽입">삽입</a>
|
||||
</div>
|
||||
<div id="tx_insertcells_menu" class="tx-insertcells-menu tx-menu" unselectable="on"></div>
|
||||
</li>
|
||||
<li class="tx-list">
|
||||
<div unselectable="on" class="tx-btn-rbg tx-deletecells" id="tx_deletecells">
|
||||
<a href="javascript:;" class="tx-icon2" title="삭제">삭제</a>
|
||||
</div>
|
||||
<div id="tx_deletecells_menu" class="tx-deletecells-menu tx-menu" unselectable="on"></div>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<ul class="tx-bar tx-bar-left tx-group-align">
|
||||
<li class="tx-list">
|
||||
<div id="tx_cellslinepreview" unselectable="on" class="tx-slt-70lbg tx-cellslinepreview">
|
||||
<a href="javascript:;" title="선 미리보기"></a>
|
||||
</div>
|
||||
<div id="tx_cellslinepreview_menu" class="tx-cellslinepreview-menu tx-menu"
|
||||
unselectable="on"></div>
|
||||
</li>
|
||||
<li class="tx-list">
|
||||
<div id="tx_cellslinecolor" unselectable="on" class="tx-slt-tbg tx-cellslinecolor">
|
||||
<a href="javascript:;" class="tx-icon2" title="선색">선색</a>
|
||||
|
||||
<div class="tx-colorpallete" unselectable="on"></div>
|
||||
</div>
|
||||
<div id="tx_cellslinecolor_menu" class="tx-cellslinecolor-menu tx-menu tx-colorpallete"
|
||||
unselectable="on"></div>
|
||||
</li>
|
||||
<li class="tx-list">
|
||||
<div id="tx_cellslineheight" unselectable="on" class="tx-btn-bg tx-cellslineheight">
|
||||
<a href="javascript:;" class="tx-icon2" title="두께">두께</a>
|
||||
|
||||
</div>
|
||||
<div id="tx_cellslineheight_menu" class="tx-cellslineheight-menu tx-menu"
|
||||
unselectable="on"></div>
|
||||
</li>
|
||||
<li class="tx-list">
|
||||
<div id="tx_cellslinestyle" unselectable="on" class="tx-btn-bg tx-cellslinestyle">
|
||||
<a href="javascript:;" class="tx-icon2" title="스타일">스타일</a>
|
||||
</div>
|
||||
<div id="tx_cellslinestyle_menu" class="tx-cellslinestyle-menu tx-menu" unselectable="on"></div>
|
||||
</li>
|
||||
<li class="tx-list">
|
||||
<div id="tx_cellsoutline" unselectable="on" class="tx-btn-rbg tx-cellsoutline">
|
||||
<a href="javascript:;" class="tx-icon2" title="테두리">테두리</a>
|
||||
|
||||
</div>
|
||||
<div id="tx_cellsoutline_menu" class="tx-cellsoutline-menu tx-menu" unselectable="on"></div>
|
||||
</li>
|
||||
</ul>
|
||||
<ul class="tx-bar tx-bar-left">
|
||||
<li class="tx-list">
|
||||
<div id="tx_tablebackcolor" unselectable="on" class="tx-btn-lrbg tx-tablebackcolor"
|
||||
style="background-color:#9aa5ea;">
|
||||
<a href="javascript:;" class="tx-icon2" title="테이블 배경색">테이블 배경색</a>
|
||||
</div>
|
||||
<div id="tx_tablebackcolor_menu" class="tx-tablebackcolor-menu tx-menu tx-colorpallete"
|
||||
unselectable="on"></div>
|
||||
</li>
|
||||
</ul>
|
||||
<ul class="tx-bar tx-bar-left">
|
||||
<li class="tx-list">
|
||||
<div id="tx_tabletemplate" unselectable="on" class="tx-btn-lrbg tx-tabletemplate">
|
||||
<a href="javascript:;" class="tx-icon2" title="테이블 서식">테이블 서식</a>
|
||||
</div>
|
||||
<div id="tx_tabletemplate_menu" class="tx-tabletemplate-menu tx-menu tx-colorpallete"
|
||||
unselectable="on"></div>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
</div></div>
|
||||
<!-- 툴바 - 더보기 끝 -->
|
||||
<!-- 편집영역 시작 -->
|
||||
<!-- 에디터 Start -->
|
||||
<div id="tx_canvas" class="tx-canvas">
|
||||
<div id="tx_loading" class="tx-loading"><div><img src="/daumeditor/images/icon/editor/loading2.png" width="113" height="21" align="absmiddle"/></div></div>
|
||||
<div id="tx_canvas_wysiwyg_holder" class="tx-holder" style="display:block;">
|
||||
<iframe id="tx_canvas_wysiwyg" name="tx_canvas_wysiwyg" allowtransparency="true" frameborder="0"></iframe>
|
||||
</div>
|
||||
<div class="tx-source-deco">
|
||||
<div id="tx_canvas_source_holder" class="tx-holder">
|
||||
<textarea id="tx_canvas_source" rows="30" cols="30"></textarea>
|
||||
</div>
|
||||
</div>
|
||||
<div id="tx_canvas_text_holder" class="tx-holder">
|
||||
<textarea id="tx_canvas_text" rows="30" cols="30"></textarea>
|
||||
</div>
|
||||
</div>
|
||||
<!-- 높이조절 Start -->
|
||||
<div id="tx_resizer" class="tx-resize-bar">
|
||||
<div class="tx-resize-bar-bg"></div>
|
||||
<img id="tx_resize_holder" src="/daumeditor/images/icon/editor/skin/01/btn_drag01.gif" width="58" height="12" unselectable="on" alt="" />
|
||||
</div>
|
||||
<!-- 편집영역 끝 -->
|
||||
<!-- 첨부박스 시작 -->
|
||||
<!-- 파일첨부박스 Start -->
|
||||
<div id="tx_attach_div" class="tx-attach-div">
|
||||
<div id="tx_attach_txt" class="tx-attach-txt">파일 첨부</div>
|
||||
<div id="tx_attach_box" class="tx-attach-box">
|
||||
<div class="tx-attach-box-inner">
|
||||
<div id="tx_attach_preview" class="tx-attach-preview"><p></p><img src="/daumeditor/images/icon/editor/pn_preview.gif" width="147" height="108" unselectable="on"/></div>
|
||||
<div class="tx-attach-main">
|
||||
<div id="tx_upload_progress" class="tx-upload-progress"><div>0%</div><p>파일을 업로드하는 중입니다.</p></div>
|
||||
<ul class="tx-attach-top">
|
||||
<li id="tx_attach_delete" class="tx-attach-delete"><a>전체삭제</a></li>
|
||||
<li id="tx_attach_size" class="tx-attach-size">
|
||||
파일: <span id="tx_attach_up_size" class="tx-attach-size-up"></span>/<span id="tx_attach_max_size"></span>
|
||||
</li>
|
||||
<li id="tx_attach_tools" class="tx-attach-tools">
|
||||
</li>
|
||||
</ul>
|
||||
<ul id="tx_attach_list" class="tx-attach-list"></ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- 첨부박스 끝 -->
|
||||
</div>
|
||||
<!-- 에디터 컨테이너 끝 -->
|
||||
<!-- </form> -->
|
||||
<!-- </div> -->
|
||||
<!-- 에디터 끝 -->
|
||||
<script src="/daumeditor/js/editor_default_set.js">
|
||||
// Editor.modify({
|
||||
// "attachments": function () { /* 저장된 첨부가 있을 경우 배열로 넘김, 위의 부분을 수정하고 아래 부분은 수정없이 사용 */
|
||||
// var allattachments = [];
|
||||
// for (var i in attachments) {
|
||||
// allattachments = allattachments.concat(attachments[i]);
|
||||
// }
|
||||
// return allattachments;
|
||||
// }(),
|
||||
// "content": document.getElementById("sample_contents_source") /* 내용 문자열, 주어진 필드(textarea) 엘리먼트 */
|
||||
// });
|
||||
</script>
|
||||
@@ -0,0 +1,122 @@
|
||||
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
|
||||
<!DOCTYPE html>
|
||||
<html lang="ko">
|
||||
<head>
|
||||
<%-- 공통 include --%>
|
||||
<%@include file ="/WEB-INF/views/comm/mngr/Include.jsp" %>
|
||||
<script src="<c:url value='/js/fileupload_comm.js'/>"></script>
|
||||
<link rel="stylesheet" href="<c:url value='/daumeditor/css/popup.css'/>">
|
||||
<script src="<c:url value='/daumeditor/js/popup.js'/>"></script>
|
||||
</head>
|
||||
<script>
|
||||
$(document).ready(function () {
|
||||
$("input[name='file']").change(function(){
|
||||
filesTempArr.length = 0;
|
||||
Array.from($("input[name='file']")[0].files).forEach(function(file) {
|
||||
if (file.size > 20000000) {
|
||||
alert("20MB 이하 파일만 첨부 가능합니다.");
|
||||
$("input[name='file']").val('');
|
||||
return;
|
||||
}
|
||||
|
||||
if (!file.type.startsWith("image/")) {
|
||||
alert("이미지 파일만 첨부 가능합니다.");
|
||||
$("input[name='file']").val('');
|
||||
return;
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
$("#fileUpload").change(function(event) {
|
||||
addFiles(event, 0);
|
||||
});
|
||||
});
|
||||
|
||||
function done() {
|
||||
$("#fileUpload").click();
|
||||
|
||||
let formData = new FormData();
|
||||
$.each(filesTempArr, function(i, file){
|
||||
if(file.upload != 'disable'){
|
||||
formData.append('files', file);
|
||||
}
|
||||
});
|
||||
|
||||
$.ajax({
|
||||
type: 'post',
|
||||
url: '<c:url value="/mngr/ntcn/email/insertEmailImage"/>',
|
||||
data: formData,
|
||||
processData: false,
|
||||
contentType: false,
|
||||
success: function (result) {
|
||||
|
||||
if (typeof(execAttach) == 'undefined') {
|
||||
return;
|
||||
}
|
||||
|
||||
result.forEach(function(fileInfo) {
|
||||
var filePath = fileInfo.filePath.replace(/\\/g, '/');
|
||||
var fileId = fileInfo.fileId;
|
||||
var fileName = fileInfo.fileName;
|
||||
var fileSize = fileInfo.fileSize;
|
||||
var base64Image = fileInfo.base64Image;
|
||||
|
||||
var _mockdata = {
|
||||
// 'imageurl': 'data:image/png;base64,'+base64Image,
|
||||
'imageurl': $('#cdnurl').val() + filePath + '/' + fileId,
|
||||
'filename': fileName,
|
||||
'filesize': fileSize,
|
||||
'originalurl': $('#cdnurl').val() + filePath + '/' + fileId,
|
||||
'imagealign': 'C'
|
||||
};
|
||||
|
||||
execAttach(_mockdata);
|
||||
});
|
||||
|
||||
closeWindow();
|
||||
}, error:function() {
|
||||
|
||||
console.log("error");
|
||||
closeWindow();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function initUploader(){
|
||||
var _opener = PopupUtil.getOpener();
|
||||
if (!_opener) {
|
||||
alert('잘못된 경로로 접근하셨습니다.');
|
||||
return;
|
||||
}
|
||||
|
||||
var _attacher = getAttacher('image', _opener);
|
||||
registerAction(_attacher);
|
||||
}
|
||||
</script>
|
||||
<body onload="initUploader();">
|
||||
<div class="wrapper">
|
||||
<div class="pop-header">
|
||||
<h1>사진 첨부</h1>
|
||||
<spring:eval expression="@environment.getProperty('mngrfo.common.fileupload.cdnurl')" var="cdnurl"/>
|
||||
<input type="hidden" id="cdnurl" value="${cdnurl}"/>
|
||||
</div>
|
||||
<div class="pop-body">
|
||||
<dl class="alert">
|
||||
<dt>사진 첨부 확인</dt>
|
||||
<dd>
|
||||
<input type="file" id="fileUpload" name="file" title="아이콘 파일" multiple="multiple">
|
||||
<label for="fileUpload">파일 선택</label>
|
||||
<%-- <ul class="file-list" id="fileList"></ul>--%>
|
||||
</dd>
|
||||
</dl>
|
||||
</div>
|
||||
<div class="pop-footer">
|
||||
<p><a href="#" onclick="closeWindow();" title="닫기" class="close">닫기</a></p>
|
||||
<ul style="margin: 0 auto;">
|
||||
<li class="submit"><a onclick="done();" title="등록" class="btnlink">등록</a></li>
|
||||
<li class="cancel"><a onclick="closeWindow();" title="취소" class="btnlink">취소</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,104 @@
|
||||
<%@ 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 : EmailPassivSndngListInqireR.jsp
|
||||
Description : 이메일 발송 내역 리스트
|
||||
Modification Information
|
||||
|
||||
수정일 수정자 수정내용
|
||||
------- -------- ---------------------------
|
||||
2024-02-28 리브가 최초 생성
|
||||
2024-04-04 이대환 sndng>email 분리
|
||||
--%>
|
||||
<section class="content-section">
|
||||
<div class="form-control-container">
|
||||
<div class="left">
|
||||
<div class="search-number">
|
||||
<span class="search-number__text">총 <strong><c:out value="${ resultListMap.paginationInfo.totalRecordCount }"/></strong>건</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="center">
|
||||
</div>
|
||||
<div class="right">
|
||||
<!-- <div class="select-box">
|
||||
<select title="해당 셀렉트에 대한 설명">
|
||||
<option value="">최근 등록순</option>
|
||||
<option value="">이벤트명순</option>
|
||||
<option value="">페이지뷰 오름차순</option>
|
||||
<option value="">페이지뷰 내림차순</option>
|
||||
</select>
|
||||
</div> -->
|
||||
<div class="select-box">
|
||||
<select id="emailPageUnit" name="pageUnit" title="페이지당 출력될 목록건수" onchange="fn_select_emailList(1);">
|
||||
<c:forEach items="${ resultListMap.paginationInfo.pageUnitArr }" var="pageUnit" varStatus="pageUnitStatus">
|
||||
<option value="<c:out value="${ pageUnit }"/>" <c:if test="${ resultListMap.paginationInfo.recordCountPerPage eq pageUnit}">selected="selected"</c:if>><c:out value="${ pageUnit }"/>개씩</option>
|
||||
</c:forEach>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<hr class="spacing">
|
||||
<div class="table-wrapper">
|
||||
<table class="table vertical">
|
||||
<caption>해당 테이블에 대한 설명</caption>
|
||||
<!-- 각 열 width 설정 -->
|
||||
<colgroup>
|
||||
<col style="width: 7%;">
|
||||
<col style="width: auto;">
|
||||
<col style="width: 18%;">
|
||||
<col style="width: 18%;">
|
||||
<col style="width: 8%;">
|
||||
</colgroup>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>번호</th>
|
||||
<th>이메일 제목</th>
|
||||
<th>수신 이메일</th>
|
||||
<th>발송일시</th>
|
||||
<th>본문</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<c:choose>
|
||||
<c:when test="${ not empty resultListMap.boCtrlMap}">
|
||||
<c:forEach items="${ resultListMap.boCtrlMap }" var="list" varStatus="status">
|
||||
<tr>
|
||||
<td><c:out value="${resultListMap.paginationInfo.totalRecordCount - list.rnum + 1 }" /></td>
|
||||
<td class = "left">
|
||||
<span class="table-ellipsis">
|
||||
<c:out value = "${list.sj}"/>
|
||||
</span>
|
||||
</td>
|
||||
<td>
|
||||
<c:out value = "${list.sndngEmail}"/>
|
||||
</td>
|
||||
<td>
|
||||
<c:out value = "${list.registDt}"/>
|
||||
</td>
|
||||
<td>
|
||||
<div class="manage-btn-container">
|
||||
<button type = "button" class="btn xsm primary outline" onclick = "fn_move_dtl_page(<c:out value = "${list.emailLogInnb}"/>)">
|
||||
조회
|
||||
</button>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</c:forEach>
|
||||
</c:when>
|
||||
<c:otherwise>
|
||||
<tr>
|
||||
<td colspan="100%"><spring:message code="common.nodata"/></td>
|
||||
</tr>
|
||||
</c:otherwise>
|
||||
</c:choose>
|
||||
</table>
|
||||
</div>
|
||||
</section>
|
||||
<div class="pagination__container">
|
||||
<ui:pagination paginationInfo="${resultListMap.paginationInfo}" type="image" jsFunction="fn_select_emailList"/>
|
||||
</div>
|
||||
@@ -0,0 +1,148 @@
|
||||
<%@ 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 : EmailPassivSndngListInqireRForm.jsp
|
||||
Description : 이메일 발송 내역 폼
|
||||
Modification Information
|
||||
|
||||
수정일 수정자 수정내용
|
||||
------- -------- ---------------------------
|
||||
2024-02-28 리브가 최초 생성
|
||||
2024-04-04 이대환 sndng>email 분리
|
||||
--%>
|
||||
<script>
|
||||
$(document).ready(function () {
|
||||
//form메소드에서 pageIndex, pageUnit 갖고옴
|
||||
let pageIndex = '<c:out value="${ resultListMap.bOEmailSrchVO.pageIndex }"/>';
|
||||
let pageUnit = '<c:out value="${ resultListMap.bOEmailSrchVO.pageUnit }"/>';
|
||||
|
||||
fn_select_emailList(pageIndex, pageUnit);
|
||||
//지정일
|
||||
fn_set_date('srchStrtSndngDt','srchEndSndngDt','srchEndSndngDt');
|
||||
|
||||
//날짜 선택 버튼 선택 처리
|
||||
$(".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', 'srchStrtSndngDt','srchEndSndngDt');
|
||||
fn_set_niceSelect_datePicker("#emailListForm");
|
||||
|
||||
$('#emailListForm').on('keydown', function(e) {
|
||||
if (e.keyCode == 13) {
|
||||
e.preventDefault();
|
||||
$('#searchBtn').click();
|
||||
}
|
||||
});
|
||||
|
||||
// 페이징 제자리 새로고침(Submit) 방지
|
||||
$('body').on('click', 'button.pagination__item.active', function(event) {
|
||||
event.preventDefault();
|
||||
});
|
||||
});
|
||||
</script>
|
||||
<form id='emailListForm' name="emailListForm">
|
||||
<section class="content-section" id="search-section">
|
||||
<input type="hidden" id="emailPageIndex" name="pageIndex"/>
|
||||
<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 = "srchType">
|
||||
<option value="">전체</option>
|
||||
<option value="SJ" <c:if test="${ resultSrchMap.bOMaEmailSrchVO.srchType == 'SJ'}">selected="selected"</c:if> >이메일 제목</option>
|
||||
<option value="sndEml" <c:if test="${ resultSrchMap.bOMaEmailSrchVO.srchType == 'sndEml'}">selected="selected"</c:if>>발송주소</option>
|
||||
<option value="rcvEml" <c:if test="${ resultSrchMap.bOMaEmailSrchVO.srchType == 'rcvEml'}">selected="selected"</c:if>>수신주소</option>
|
||||
</select>
|
||||
</div>
|
||||
<input class="input-text xl" type="text" title="검색어" name = "srchStr">
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>발송일</th>
|
||||
<td>
|
||||
<div class="td-inner">
|
||||
<div class="input-container">
|
||||
<input type="text" id="srchStrtSndngDt" class="datepicker"
|
||||
title="시작 날짜 선택" name="srchStrtSndngDt"
|
||||
autocomplete="off">
|
||||
<span class="tilde">~</span>
|
||||
<input type="text" id="srchEndSndngDt" class="datepicker"
|
||||
title="종료 날짜 선택" name="srchEndSndngDt"
|
||||
autocomplete="off">
|
||||
</div>
|
||||
<div class="dateRange-btnContainer" id="searchDateRange">
|
||||
<button type="button" class="dateRange-btn" id="yesterday"
|
||||
onclick="fn_set_date('srchStrtSndngDt','srchEndSndngDt','srchEndSndngDt','1D')">
|
||||
어제
|
||||
</button>
|
||||
<button type="button" class="dateRange-btn" id="today"
|
||||
onclick="fn_set_date('srchStrtSndngDt','srchEndSndngDt','srchEndSndngDt','0')">
|
||||
오늘
|
||||
</button>
|
||||
<button type="button" class="dateRange-btn" id="threeDays"
|
||||
onclick="fn_set_date('srchStrtSndngDt','srchEndSndngDt','srchEndSndngDt','3D')">
|
||||
3일간
|
||||
</button>
|
||||
<button type="button" class="dateRange-btn" id="sevenDays"
|
||||
onclick="fn_set_date('srchStrtSndngDt','srchEndSndngDt','srchEndSndngDt','7D')">
|
||||
일주일
|
||||
</button>
|
||||
<button type="button" class="dateRange-btn" id="oneMonth"
|
||||
onclick="fn_set_date('srchStrtSndngDt','srchEndSndngDt','srchEndSndngDt','1M')">
|
||||
1개월
|
||||
</button>
|
||||
<button type="button" class="dateRange-btn" id="threeMonth"
|
||||
onclick="fn_set_date('srchStrtSndngDt','srchEndSndngDt','srchEndSndngDt','3M')">
|
||||
3개월
|
||||
</button>
|
||||
<button type="button" class="dateRange-btn" id="sixMonth"
|
||||
onclick="fn_set_date('srchStrtSndngDt','srchEndSndngDt','srchEndSndngDt','6M')">
|
||||
6개월
|
||||
</button>
|
||||
<button type="button" class="dateRange-btn" id="year"
|
||||
onclick="fn_set_date('srchStrtSndngDt','srchEndSndngDt','srchEndSndngDt','1Y')">
|
||||
1년
|
||||
</button>
|
||||
<button type="button" class="dateRange-btn"
|
||||
onclick="fn_reset_date('srchStrtSndngDt','srchEndSndngDt')">
|
||||
전체
|
||||
</button>
|
||||
</div>
|
||||
</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_emailList(1); return false;">검색
|
||||
</button>
|
||||
</div>
|
||||
<div class="right"></div>
|
||||
</div>
|
||||
</section>
|
||||
<div id="emailPageDiv">
|
||||
</div>
|
||||
</form>
|
||||
@@ -0,0 +1,411 @@
|
||||
<%@ 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 : EmailPassivSndngManage.jsp
|
||||
Description : 이메일 발송 관리
|
||||
Modification Information
|
||||
|
||||
수정일 수정자 수정내용
|
||||
------- -------- ---------------------------
|
||||
2024-02-28 리브가 최초 생성
|
||||
2024-04-04 이대환 sndng>email 분리
|
||||
--%>
|
||||
<!DOCTYPE html>
|
||||
<html lang="ko">
|
||||
<head>
|
||||
<%-- 공통 include --%>
|
||||
<%@include file ="/WEB-INF/views/comm/mngr/Include.jsp" %>
|
||||
<link rel="stylesheet" href="<c:url value='/daumeditor/css/editor.css'/>">
|
||||
<script src="<c:url value='/daumeditor/js/editor_loader.js?environment=development'/>"></script>
|
||||
</head>
|
||||
<script>
|
||||
$(document).ready(function () {
|
||||
fn_select_Sndng();
|
||||
});
|
||||
|
||||
/* ********************************************************
|
||||
* 이메일 수동 발송 TAB
|
||||
******************************************************** */
|
||||
const fn_select_Sndng = function () {
|
||||
|
||||
$.ajax({
|
||||
type: 'post',
|
||||
url: '/mngr/ntcn/email/selectEmailPassivSndng',
|
||||
success: function (resultHtml) {
|
||||
$("#selectListInqireFormBtn").removeClass("active");
|
||||
$("#selectListInqireForm").removeClass("active");
|
||||
|
||||
$("#selectSndngBtn").addClass("active");
|
||||
$("#selectSndng").addClass("active");
|
||||
$('#selectSndng').html(resultHtml);
|
||||
|
||||
$("#emailSndngBtn").css("display" ,"block");
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/* ********************************************************
|
||||
* 이메일 수동 발송 TAB _ 받는 사람 콤보박스
|
||||
******************************************************** */
|
||||
const fn_clear_recpntEmail = function() {
|
||||
$('#recpntEmail').val('');
|
||||
$('.mbrInfo').val('');
|
||||
$('.srchMbrCnt').html('0 명');
|
||||
}
|
||||
|
||||
/* ********************************************************
|
||||
* 이메일 수동 발송 TAB _ 최근 발송한 이메일
|
||||
******************************************************** */
|
||||
const fn_apply_rcntEmail = function(getvalue) {
|
||||
if(!getvalue){
|
||||
fn_reset_form('selectSndng');
|
||||
Editor.modify({
|
||||
"content": " "
|
||||
});
|
||||
}else{
|
||||
$.ajax({
|
||||
type: 'post',
|
||||
url: '/mngr/ntcn/email/selectEmailSndngDtl',
|
||||
data: 'emailLogInnb='+getvalue,
|
||||
success: function (result) {
|
||||
Editor.modify({
|
||||
"content": result.boCtrlMap.cn
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
/* ********************************************************
|
||||
* 이메일 발송 내역 TAB
|
||||
******************************************************** */
|
||||
const fn_select_listForm = function () {
|
||||
|
||||
$.ajax({
|
||||
type: 'post',
|
||||
url: '/mngr/ntcn/email/selectEmailPassivSndngListInqireRForm',
|
||||
success: function (resultHtml) {
|
||||
$("#selectSndngBtn").removeClass("active");
|
||||
$("#selectSndng").removeClass("active");
|
||||
|
||||
$("#selectListInqireFormBtn").addClass("active");
|
||||
$("#selectListInqireForm").addClass("active");
|
||||
$('#selectListInqireForm').html(resultHtml);
|
||||
|
||||
$("#emailSndngBtn").css("display" ,"none");
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/* ********************************************************
|
||||
* 이메일 발송 내역 TAB _ 리스트 조회
|
||||
******************************************************** */
|
||||
const fn_select_emailList = function(pageIndex, pageUnit) {
|
||||
let dataStr;
|
||||
if(!pageIndex) {
|
||||
$('#emailPageIndex').val(1);
|
||||
} else {
|
||||
$('#emailPageIndex').val(pageIndex);
|
||||
}
|
||||
|
||||
if(!pageUnit) {
|
||||
dataStr = $('#emailListForm').serialize();
|
||||
} else {
|
||||
if($('#emailPageUnit').length){
|
||||
$('#emailPageUnit').val(pageUnit);
|
||||
dataStr = $('#emailListForm').serialize();
|
||||
} else {
|
||||
dataStr = $('#emailListForm').serialize()+'&pageUnit='+pageUnit;
|
||||
}
|
||||
}
|
||||
|
||||
$.ajax({
|
||||
type: 'post',
|
||||
url : '/mngr/ntcn/email/selectEmailPassivSndngListInqire',
|
||||
data : dataStr,
|
||||
success:function(resultHtml) {
|
||||
$('#emailPageDiv').html(resultHtml);
|
||||
$('#emailPageUnit').niceSelect();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/* ********************************************************
|
||||
* 이메일 발송 상세조회
|
||||
******************************************************** */
|
||||
const fn_move_dtl_page = function(emailLogInnb) {
|
||||
$.ajax({
|
||||
type: 'post',
|
||||
url : '/admin/ntcn/email/selectEmailSndngDtlPopup',
|
||||
data : {emailLogInnb : emailLogInnb},
|
||||
success:function(resultHtml) {
|
||||
fn_close_modal('email-check-pop');
|
||||
$('#modalDiv').html(resultHtml);
|
||||
//form메소드에서 pageIndex, pageUnit 갖고옴
|
||||
let pageIndex = '<c:out value="${ resultListMapMbr.bOMaEmailSrchVO.pageIndex }"/>';
|
||||
let pageUnit = '<c:out value="${ resultListMapMbr.bOMaEmailSrchVO.pageUnit }"/>';
|
||||
//fn_select_mbrInfo(pageIndex,pageUnit,emailLogInnb);
|
||||
$('#email-check-pop').modal();
|
||||
}
|
||||
});
|
||||
}
|
||||
/* ********************************************************
|
||||
* 이메일 발송 상세조회 발신조회
|
||||
******************************************************** */
|
||||
// const fn_select_mbrInfo = function(pageIndex, pageUnit, emailLogInnb) {
|
||||
// let dataStr;
|
||||
// if(!pageIndex) {
|
||||
// $('#mbrPageIndex').val(1);
|
||||
// } else {
|
||||
// $('#mbrPageIndex').val(pageIndex);
|
||||
// }
|
||||
//
|
||||
// if(!pageUnit) {
|
||||
// dataStr = $('#popupForm').serialize();
|
||||
// } else {
|
||||
// if($('#mbrPageUnit').length){
|
||||
// $('#mbrPageUnit').val(pageUnit);
|
||||
// dataStr = $('#popupForm').serialize();
|
||||
// } else {
|
||||
// dataStr = $('#popupForm').serialize()+'&pageUnit='+pageUnit;
|
||||
// }
|
||||
// }
|
||||
// dataStr = dataStr+'&emailLogInnb='+emailLogInnb
|
||||
// $.ajax({
|
||||
// type: 'post',
|
||||
// url : '/admin/ntcn/email/selectEmailSndngDtlPopupMbrTb',
|
||||
// data : dataStr,
|
||||
// success:function(resultHtml) {
|
||||
// $('#mbrInfoDiv').html(resultHtml);
|
||||
// $('#mbrPageUnit').niceSelect();
|
||||
// }
|
||||
// });
|
||||
// }
|
||||
|
||||
/**********************************************
|
||||
* 이메일 수신거부 링크 처리
|
||||
***********************************************/
|
||||
const recptnRjct = function(lang) {
|
||||
var rjctInput = $('input[name="recptnRjctUrl"]');
|
||||
let recptnRjctUrl = rjctInput.val();
|
||||
const urlParams = new URLSearchParams(recptnRjctUrl.split('?')[1]);
|
||||
|
||||
let langInner;
|
||||
switch (lang) {
|
||||
case 'ko':
|
||||
langInner = '수신거부';
|
||||
break;
|
||||
case 'en':
|
||||
langInner = 'Click here';
|
||||
break;
|
||||
default :
|
||||
$.ajax({
|
||||
type: 'get',
|
||||
// url: 'http://'+recptnRjctUrl+'?mbrInnb={mbrInnb}',
|
||||
url: recptnRjctUrl+'?mbrInnb=',
|
||||
dataType: 'text',
|
||||
error : function(request, status, error) {
|
||||
//loadingStop();
|
||||
alert("잘못된 URL입니다.");
|
||||
$(".rjctCopy").hide();
|
||||
} ,
|
||||
success: function(data, status, request) {
|
||||
//loadingStop();
|
||||
alert('정상 URL입니다.');
|
||||
$('.rjctCopy').show();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
if(lang){
|
||||
let recptnRjctTag = '<a href="https://' + recptnRjctUrl + '?mbrInnb={mbrInnb}">' + langInner + '</a>';
|
||||
|
||||
prompt('복사되었습니다.',recptnRjctTag)
|
||||
}
|
||||
}
|
||||
|
||||
/**********************************************
|
||||
* 이메일 수동 발송 등록
|
||||
***********************************************/
|
||||
const fn_regist_Email = function() {
|
||||
$("#cn").val(Editor.getContent());
|
||||
if(validateEmail($('#sndrEmail'), $('#recpntEmail'), $('.mbrInfo'), $('#sj'), $('#cn'), $('#legalResp'))){
|
||||
if (confirm('이메일 수동 발송을 <spring:message code="confirm.common.save"/>')) {
|
||||
$.ajax({
|
||||
type : 'post',
|
||||
url : '/mngr/ntcn/email/insertEmailSndng',
|
||||
data : $('form').serialize(),
|
||||
dataType: 'text',
|
||||
success : function(data) {
|
||||
alert('<spring:message code="success.common.insert"/>');
|
||||
location.replace('/mngr/ntcn/email/selectEmailPassivSndngManage');
|
||||
},
|
||||
error : function(request, status, error) {
|
||||
console.log(error)
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**********************************************
|
||||
* 이메일 형식 유효성 체크 (올바른 이메일 형식일 때 True)
|
||||
***********************************************/
|
||||
const emailCheck = function(email_address) {
|
||||
email_regex = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/i;
|
||||
if(email_regex.test(email_address)){
|
||||
return true;
|
||||
}else{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**********************************************
|
||||
* 이메일 발송 유효성 체크
|
||||
***********************************************/
|
||||
const validateEmail = function(sndrEmail, recpntEmail, mbrInfo, sj, cn, legalResp) {
|
||||
if (sndrEmail.val().trim() === '') {
|
||||
alert('보내는 사람 이메일을 입력하십시오');
|
||||
sndrEmail.focus();
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!emailCheck(sndrEmail.val())) {
|
||||
alert('올바른 이메일 형식이 아닙니다(보내는 사람)');
|
||||
sndrEmail.focus();
|
||||
return false;
|
||||
}
|
||||
|
||||
const recpntEmailValue = recpntEmail.val().trim();
|
||||
const mbrInfoValue = mbrInfo.val().trim();
|
||||
|
||||
if (!recpntEmailValue && !mbrInfoValue) {
|
||||
alert('받는 사람 이메일을 입력하십시오');
|
||||
recpntEmail.focus();
|
||||
return false;
|
||||
}
|
||||
|
||||
if(recpntEmailValue){
|
||||
if (recpntEmailValue.indexOf(',') === -1 && !emailCheck(recpntEmailValue)) {
|
||||
alert('올바른 이메일 형식이 아닙니다(받는 사람 - 직접 입력)');
|
||||
recpntEmail.focus();
|
||||
return false;
|
||||
}
|
||||
|
||||
if (recpntEmailValue.indexOf(',') !== -1) {
|
||||
const parts = recpntEmailValue.split(',').map(part => part.trim());
|
||||
for (let index = 0; index < parts.length; index++) {
|
||||
if (!emailCheck(parts[index])) {
|
||||
alert('올바른 이메일 형식이 아닙니다(받는 사람 : '+(index+1)+'번째)');
|
||||
recpntEmail.focus();
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (sj.val().trim() === '') {
|
||||
alert('이메일 제목을 입력하십시오');
|
||||
sj.focus();
|
||||
return false;
|
||||
}
|
||||
|
||||
if (cn.val().trim() === '') {
|
||||
alert('이메일 내용을 입력하십시오');
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!legalResp.prop('checked')) {
|
||||
alert('정보통신망이용 촉진 및 정보보호등에 관한 법률 및 시행령’ 위반에 따른 책임은 당사에게 있음에 동의하십시오');
|
||||
legalResp.focus();
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**********************************************************
|
||||
* 검색 조건 이벤트 설정(날짜 전체 클릭 시 날짜 설정 초기화)
|
||||
***********************************************************/
|
||||
const fn_reset_date = function(strtDate,endDate){
|
||||
$('#'+strtDate).datepicker().datepicker("setDate",'');
|
||||
$('#'+endDate).datepicker().datepicker("setDate",'');
|
||||
}
|
||||
</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" onclick="fn_regist_Email()" id="emailSndngBtn">발송하기</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>
|
||||
<button class="scroll-to-top"><span class="visually-hidden">위로가기</span></button>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
<div id="modalDiv">
|
||||
</div>
|
||||
<!-- 툴팁 클릭 컨텐츠 -->
|
||||
<!-- 버튼의 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="info02" 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>‘정보통신망이용 촉진 및 정보보호등의 관한 법률 및 시행령’에 따라 수신거부 링크 주소를 알려 드립니다.<p>
|
||||
<p style="color : red">반드시 링크 주소는 정상 동작 여부를 확인하신 후에 복사하여 이용하시기 바랍니다.</p>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,440 @@
|
||||
<%@ 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 : EmailPassivSndngC.jsp
|
||||
Description : 이메일 수동 발송 폼
|
||||
Modification Information
|
||||
|
||||
수정일 수정자 수정내용
|
||||
------- -------- ---------------------------
|
||||
2024-05-22 이대환 최초 생성
|
||||
--%>
|
||||
<!DOCTYPE html>
|
||||
<html lang="ko">
|
||||
<head>
|
||||
<%-- 공통 include --%>
|
||||
<%@include file ="/WEB-INF/views/comm/mngr/Include.jsp" %>
|
||||
<link rel="stylesheet" href="<c:url value='/daumeditor/css/editor.css'/>">
|
||||
<script src="<c:url value='/daumeditor/js/editor_loader.js?environment=development'/>"></script>
|
||||
<style type="text/css">
|
||||
.page-title.fixed { left: 0;}
|
||||
</style>
|
||||
</head>
|
||||
<script>
|
||||
$(document).ready(function () {
|
||||
$('.rjctCopy').hide();
|
||||
|
||||
/**********************************************
|
||||
* 이메일 수신거부 링크 입력 이벤트
|
||||
***********************************************/
|
||||
$("input[name='recptnRjctUrl']").change(function() {
|
||||
$('.rjctCopy').hide();
|
||||
});
|
||||
|
||||
var urlParams = new URLSearchParams(window.location.search);
|
||||
|
||||
if (urlParams.has('mbrInfo')) {
|
||||
$('.mbrInfo').val(urlParams.get('mbrInfo'));
|
||||
$('.srchMbrCnt').html(urlParams.get('sndngCnt')+' 명');
|
||||
}
|
||||
});
|
||||
|
||||
/* ********************************************************
|
||||
* 이메일 수동 발송 TAB _ 받는 사람 콤보박스
|
||||
******************************************************** */
|
||||
const fn_clear_recpntEmail = function() {
|
||||
$('#recpntEmail').val('');
|
||||
$('.mbrInfo').val('');
|
||||
$('.srchMbrCnt').html('0 명');
|
||||
}
|
||||
|
||||
/* ********************************************************
|
||||
* 이메일 수동 발송 TAB _ 최근 발송한 이메일
|
||||
******************************************************** */
|
||||
const fn_apply_rcntEmail = function(getvalue) {
|
||||
if(!getvalue){
|
||||
fn_reset_form('selectSndng');
|
||||
Editor.modify({
|
||||
"content": " "
|
||||
});
|
||||
}else{
|
||||
$.ajax({
|
||||
type: 'post',
|
||||
url: '/mngr/ntcn/email/selectEmailSndngDtl',
|
||||
data: 'emailLogInnb='+getvalue,
|
||||
success: function (result) {
|
||||
Editor.modify({
|
||||
"content": result.boCtrlMap.cn
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
/**********************************************
|
||||
* 이메일 수신거부 링크 처리
|
||||
***********************************************/
|
||||
const recptnRjct = function(lang) {
|
||||
var rjctInput = $('input[name="recptnRjctUrl"]');
|
||||
let recptnRjctUrl = rjctInput.val();
|
||||
const urlParams = new URLSearchParams(recptnRjctUrl.split('?')[1]);
|
||||
|
||||
let langInner;
|
||||
switch (lang) {
|
||||
case 'ko':
|
||||
langInner = '수신거부';
|
||||
break;
|
||||
case 'en':
|
||||
langInner = 'Click here';
|
||||
break;
|
||||
default :
|
||||
$.ajax({
|
||||
type: 'get',
|
||||
// url: 'http://'+recptnRjctUrl+'?mbrInnb={mbrInnb}',
|
||||
url: recptnRjctUrl+'?mbrInnb=',
|
||||
dataType: 'text',
|
||||
error : function(request, status, error) {
|
||||
//loadingStop();
|
||||
alert("잘못된 URL입니다.");
|
||||
$(".rjctCopy").hide();
|
||||
} ,
|
||||
success: function(data, status, request) {
|
||||
//loadingStop();
|
||||
alert('정상 URL입니다.');
|
||||
$('.rjctCopy').show();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
if(lang){
|
||||
let recptnRjctTag = '<a href="https://' + recptnRjctUrl + '?mbrInnb={mbrInnb}">' + langInner + '</a>';
|
||||
|
||||
prompt('복사되었습니다.',recptnRjctTag)
|
||||
}
|
||||
}
|
||||
|
||||
/**********************************************
|
||||
* 이메일 수동 발송 등록
|
||||
***********************************************/
|
||||
const fn_regist_Email = function() {
|
||||
$("#cn").val(Editor.getContent());
|
||||
if(validateEmail($('#sndrEmail'), $('#recpntEmail'), $('.mbrInfo'), $('#sj'), $('#cn'), $('#legalResp'))){
|
||||
if (confirm('이메일 수동 발송을 <spring:message code="confirm.common.save"/>')) {
|
||||
$.ajax({
|
||||
type : 'post',
|
||||
url : '/mngr/ntcn/email/insertEmailSndng',
|
||||
data : $('form').serialize(),
|
||||
dataType: 'text',
|
||||
success : function(data) {
|
||||
alert('<spring:message code="success.common.insert"/>');
|
||||
location.replace('/mngr/ntcn/email/selectEmailPassivSndngManage');
|
||||
},
|
||||
error : function(request, status, error) {
|
||||
console.log(error)
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**********************************************
|
||||
* 이메일 형식 유효성 체크 (올바른 이메일 형식이 아닐 때 True)
|
||||
***********************************************/
|
||||
const emailCheck = function(email_address) {
|
||||
email_regex = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/i;
|
||||
if(email_regex.test(email_address)){
|
||||
return false;
|
||||
}else{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
/**********************************************
|
||||
* 이메일 발송 유효성 체크
|
||||
***********************************************/
|
||||
const validateEmail = function(sndrEmail, recpntEmail, mbrInfo, sj, cn, legalResp) {
|
||||
if (sndrEmail.val().trim() === '') {
|
||||
alert('보내는 사람 이메일을 입력하십시오');
|
||||
sndrEmail.focus();
|
||||
return false;
|
||||
}
|
||||
|
||||
if (emailCheck(sndrEmail.val())) {
|
||||
alert('올바른 이메일 형식이 아닙니다(보내는 사람)');
|
||||
sndrEmail.focus();
|
||||
return false;
|
||||
}
|
||||
|
||||
const recpntEmailValue = recpntEmail.val().trim();
|
||||
const mbrInfoValue = mbrInfo.val().trim();
|
||||
|
||||
if (!recpntEmailValue && !mbrInfoValue) {
|
||||
alert('받는 사람 이메일을 입력하십시오');
|
||||
recpntEmail.focus();
|
||||
return false;
|
||||
}
|
||||
|
||||
if(recpntEmailValue){
|
||||
if (recpntEmailValue.indexOf(',') === -1 && emailCheck(recpntEmailValue)) {
|
||||
alert('올바른 이메일 형식이 아닙니다(받는 사람 - 직접 입력)');
|
||||
recpntEmail.focus();
|
||||
return false;
|
||||
}
|
||||
|
||||
if (recpntEmailValue.indexOf(',') !== -1) {
|
||||
const parts = recpntEmailValue.split(',').map(part => part.trim());
|
||||
for (let index = 0; index < parts.length; index++) {
|
||||
if (emailCheck(parts[index])) {
|
||||
alert('올바른 이메일 형식이 아닙니다(받는 사람 : '+(index+1)+'번째)');
|
||||
recpntEmail.focus();
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (sj.val().trim() === '') {
|
||||
alert('이메일 제목을 입력하십시오');
|
||||
sj.focus();
|
||||
return false;
|
||||
}
|
||||
|
||||
if (cn.val().trim() === '') {
|
||||
alert('이메일 내용을 입력하십시오');
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!legalResp.prop('checked')) {
|
||||
alert('정보통신망이용 촉진 및 정보보호등에 관한 법률 및 시행령’ 위반에 따른 책임은 당사에게 있음에 동의하십시오');
|
||||
legalResp.focus();
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
</script>
|
||||
<body>
|
||||
<form id='tx_editor_form' name="tx_editor_form">
|
||||
<section class="content-section">
|
||||
<div class="page-title">
|
||||
<h2 class="page-title__title">이메일</h2>
|
||||
<div class="page-title__btn-container">
|
||||
<button type="button" class="btn primary" onclick="fn_regist_Email()" id="emailSndngBtn">발송하기</button>
|
||||
</div>
|
||||
</div>
|
||||
<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">
|
||||
<input class="input-text xl" type="text" title="해당 인풋에 대한 설명" name="sndrEmail" id="sndrEmail"
|
||||
placeholder="메일 주소 입력">
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>받는 사람 (검색 입력)</th>
|
||||
<td>
|
||||
<div class="td-inner">
|
||||
<input type="hidden" class="input-text mbrInfo" name="mbrInfo"/>
|
||||
<span class="fw-500 fs-15 ml-5 srchMbrCnt">0 명</span>
|
||||
<button type="button" id="mbrSrchBtn"
|
||||
class="btn xsm primary" title="회원 검색 새창열림" onclick="fn_open_modal('#modalDiv',
|
||||
'#member-search',
|
||||
'/mngr/ntcn/email/selectMbrSrchPopupRForm',
|
||||
{'actionDv' : 'email'}); return false;">
|
||||
회원검색
|
||||
</button>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>받는 사람 (직접 입력)</th>
|
||||
<td>
|
||||
<div class="td-inner">
|
||||
<input class="input-text xl" type="text" title="해당 인풋에 대한 설명" name="recpntEmail" id="recpntEmail"
|
||||
placeholder="메일 주소는 ,(콤마)로 구분하여 입력">
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<%-- <tr>
|
||||
<th>받는 사람 (엑셀 입력)</th>
|
||||
<td>
|
||||
<div class="td-inner">
|
||||
<div class="table-wrapper" style="width: 600px;">
|
||||
<table class="table vertical">
|
||||
<caption>해당 테이블에 대한 설명</caption>
|
||||
<colgroup>
|
||||
<col>
|
||||
<col style="width:20%;">
|
||||
</colgroup>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>엑셀 파일 업로드</th>
|
||||
<th>
|
||||
<button class="circle-btn add"><span
|
||||
class="visually-hidden">추가</span></button>
|
||||
</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>
|
||||
<input class="input-text md" type="text"
|
||||
title="해당 인풋에 대한 설명" placeholder=""
|
||||
value="111">
|
||||
<div class="input-file">
|
||||
<input type="file" id="f-1">
|
||||
<label for="f-1">첨부 파일</label>
|
||||
</div>
|
||||
</td>
|
||||
<td>
|
||||
<button class="circle-btn delete"><span
|
||||
class="visually-hidden">삭제</span></button>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
</tr> --%>
|
||||
<tr>
|
||||
<th>최근 이메일 불러오기</th>
|
||||
<td>
|
||||
<div class="td-inner">
|
||||
<div class="select-box">
|
||||
<select class="lg" onchange="fn_apply_rcntEmail(this.value)" title="해당 셀렉트에 대한 설명">
|
||||
<option value="">최근 발송한 이메일 선택</option>
|
||||
<c:forEach items="${ resultListMap.boCtrlMap }" var="list" varStatus="status">
|
||||
<option value="${list.emailLogInnb}">
|
||||
[<c:out value="${list.registDt}"/>] <c:out value="${list.sj}"/>
|
||||
</option>
|
||||
</c:forEach>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>제목</th>
|
||||
<td>
|
||||
<div class="td-inner vertical">
|
||||
<input class="input-text xl" type="text" title="제목" id="sj" name="sj"
|
||||
placeholder="메일 제목을 입력하세요.">
|
||||
<div class="gray-7">
|
||||
<p class="fyi">‘정보통신망이용 촉진 및 정보 보호 등의 관한 법률 및 시행령’에 따라 광고 전송 시 제목에 (광고)를 표시해주세요.</p>
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>내용</th>
|
||||
<td>
|
||||
<div class="td-inner">
|
||||
<%@ include file="EmailPassivSndngEditor.jsp" %>
|
||||
<textarea class="textarea" id="cn" name="cn" style="display: none"></textarea>
|
||||
<div class="gray-7">
|
||||
<p class="fyi">‘정보통신망이용 촉진 및 정보보호등에 관한 법률 및 시행령’에 규정된 광고 전송 사업자의 의무사항을 준수하세요.
|
||||
<button type="button" class="mini-info-btn mb-3" data-info="info01">?</button>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<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>수신 거부 링크
|
||||
<button type="button" class="mini-info-btn mb-3" data-info="info02">?</button>
|
||||
</th>
|
||||
<td>
|
||||
<div class="td-inner">
|
||||
https://
|
||||
<input class="input-text md" type="text" title="해당 인풋에 대한 설명" name="recptnRjctUrl" value="/mngr/ntcn/email/updateMarktRecptnArgeAt">
|
||||
?mbrInnb={mbrInnb}
|
||||
<div class="manage-btn-container">
|
||||
<button type="button" class="btn xsm outline rjctCopy" onclick="recptnRjct('ko')">한글 복사</button>
|
||||
<button type="button" class="btn xsm outline rjctCopy" onclick="recptnRjct('en')">영문 복사</button>
|
||||
<button type="button" class="btn xsm gray" onclick="recptnRjct()">정상 여부 확인</button>
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div class="b-checkbox-container justify-center fs-16 mt-30">
|
||||
<label class="b-checkbox checkbox">
|
||||
<input type="checkbox" id="legalResp">
|
||||
<span class="check"></span>
|
||||
<span class="control-label">‘정보통신망이용 촉진 및 정보보호등에 관한 법률 및 시행령’ 위반에 따른 책임은 당사에게 있음에 동의합니다.</span>
|
||||
</label>
|
||||
</div>
|
||||
</section>
|
||||
</form>
|
||||
<!-- <button class="btn primary" style="display: block; margin: 0 auto;" onclick="fn_regist_Email()" id="emailSndngBtn">발송하기</button> -->
|
||||
<div id="modalDiv">
|
||||
</div>
|
||||
<!-- 툴팁 클릭 컨텐츠 -->
|
||||
<!-- 버튼의 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="info02" 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>‘정보통신망이용 촉진 및 정보보호등의 관한 법률 및 시행령’에 따라 수신거부 링크 주소를 알려 드립니다.<p>
|
||||
<p style="color : red">반드시 링크 주소는 정상 동작 여부를 확인하신 후에 복사하여 이용하시기 바랍니다.</p>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -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
@@ -0,0 +1,184 @@
|
||||
<%@ 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 : MssageAditPopupC.jsp
|
||||
Description : SMS 추가 팝업
|
||||
Modification Information
|
||||
|
||||
수정일 수정자 수정내용
|
||||
------- -------- ---------------------------
|
||||
2024.04.04 이운산 최초 생성
|
||||
--%>
|
||||
<script>
|
||||
$(document).ready(function() {
|
||||
/**********************************
|
||||
* 바이트 계산
|
||||
**********************************/
|
||||
fn_count_byte("#addMsg", ".number", 2000);
|
||||
|
||||
/**********************************
|
||||
* 나이스 셀렉트
|
||||
**********************************/
|
||||
$("select").niceSelect();
|
||||
|
||||
|
||||
/**************************************************************
|
||||
* 자주쓰는 메시지 등록
|
||||
****************************************************************/
|
||||
$("#insertBtn").on("click", function() {
|
||||
const ctgy = $("[name=category]").val();
|
||||
const newCtgy = $("#addCtgyNm").val();
|
||||
console.log(ctgy, newCtgy);
|
||||
if(ctgy == "" && newCtgy == "") {
|
||||
alert("카테고리가 선택되지 않았습니다.")
|
||||
return false;
|
||||
}
|
||||
|
||||
if($("[name=msg]").val() == "") {
|
||||
alert("메세지가 작성되지 않았습니다.")
|
||||
return false;
|
||||
}
|
||||
|
||||
const dataStr = $("#mssageAditForm").serializeArray();
|
||||
|
||||
//카테고리 추가입력 여부 확인
|
||||
const isAddInput = $("#addCtgy").css("display") !== 'none';
|
||||
|
||||
$.each(dataStr, function(index, item){
|
||||
if(($("#addCtgyNm").val() != "" || $("#addCtgyNm").val() != null)
|
||||
&& isAddInput && item.name == "category") {
|
||||
item.value = $("#addCtgyNm").val();
|
||||
}
|
||||
})
|
||||
|
||||
$.ajax({
|
||||
type: "post",
|
||||
url: "<c:url value="/mngr/ntcn/mssage/insertMssageAditRegist"/>",
|
||||
data: dataStr,
|
||||
success:function(data) {
|
||||
const str = JSON.parse(data.resBody.result);
|
||||
if(str.result == "success") {
|
||||
alert('<spring:message code="success.common.insert"/>');
|
||||
fn_close_modal("mssageAditPopup");
|
||||
if(!newCtgy == '') {
|
||||
fn_select_album(newCtgy);
|
||||
} else {
|
||||
fn_select_album(ctgy);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
})
|
||||
|
||||
|
||||
/**************************************************************
|
||||
* 카테고리 추가
|
||||
****************************************************************/
|
||||
$("#addCtgyBtn").on("click", function(){
|
||||
if($("#addCtgy").css("display") == 'none') {
|
||||
$("#addCtgy").show();
|
||||
} else {
|
||||
$("#addCtgy").hide();
|
||||
}
|
||||
})
|
||||
|
||||
/**************************************************************
|
||||
* 카테고리 삭제
|
||||
****************************************************************/
|
||||
$("#delCtgyBtn").on("click", function(){
|
||||
if($("[name=category]").val() != null) {
|
||||
const category = $("[name=category]").val();
|
||||
console.log(category)
|
||||
$.ajax({
|
||||
type: "post",
|
||||
url: "<c:url value="/mngr/ntcn/mssage/deleteMssageAditCtgy"/>",
|
||||
data: { category },
|
||||
success:function(data) {
|
||||
const str = JSON.parse(data.resBody.result);
|
||||
if(str.result == "success") {
|
||||
alert('<spring:message code="success.common.insert"/>');
|
||||
fn_close_modal("mssageAditPopup");
|
||||
fn_select_album();
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
}
|
||||
})
|
||||
|
||||
/**************************************************************
|
||||
* 초기화
|
||||
****************************************************************/
|
||||
$("#resetAddBtn").on("click", function(){
|
||||
$("[name=category]").val("");
|
||||
$("[name=category]").niceSelect("update");
|
||||
$("#addMsg").val("");
|
||||
})
|
||||
|
||||
|
||||
})
|
||||
|
||||
|
||||
</script>
|
||||
<div id="mssageAditPopup" class="modal" style="max-width: 380px;">
|
||||
<div class="modal-header">
|
||||
<h4>SMS 추가</h4>
|
||||
</div>
|
||||
<div class="modal-content">
|
||||
<div class="tab-box__content">
|
||||
<form id="mssageAditForm">
|
||||
<div class="">
|
||||
<div class="template-message">
|
||||
<div class="template-message__header">
|
||||
<div class="select-box">
|
||||
<select class="short" title="카테고리" name="category">
|
||||
<option value="">선택</option>
|
||||
<c:forEach var="list" items="${resultMap.boAlbumMap.ctgyList}" varStatus="status">
|
||||
<option value="${list.category}"><c:out value="${list.category}"/></option>
|
||||
</c:forEach>
|
||||
</select>
|
||||
</div>
|
||||
<div id="addCtgy" class="mb-10" style="display:none">
|
||||
<input class="input-text" type="text" title="해당 인풋에 대한 설명" placeholder="" id="addCtgyNm">
|
||||
</div>
|
||||
<div>
|
||||
<button class="btn sm dark" id="addCtgyBtn" type="button">
|
||||
카테고리 추가
|
||||
</button>
|
||||
<button class="btn sm dark" id="delCtgyBtn" type="button">
|
||||
카테고리 삭제
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="template-message__body">
|
||||
<div class="sms-manage">
|
||||
<textarea class="textarea" title="sms 입력" id="addMsg" name="msg"></textarea>
|
||||
<div class="sms-manage__byte">
|
||||
<span class="number">0</span>
|
||||
<span class="text">byte</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<div class="table-wrapper">
|
||||
<div class="form-control-container mt-10">
|
||||
<div class="left"></div>
|
||||
<div class="center">
|
||||
<button class="btn outline" id="resetAddBtn" type="button">초기화</button>
|
||||
<button class="btn primary" id="insertBtn" type="button">적용</button>
|
||||
</div>
|
||||
<div class="right"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -0,0 +1,404 @@
|
||||
<%@ 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 : MssageMbrSrchPopupRForm.jsp
|
||||
Description : 메시지 발송 회원 조회 화면
|
||||
Modification Information
|
||||
|
||||
수정일 수정자 수정내용
|
||||
------- -------- ---------------------------
|
||||
2024-07-01 이운산 최초 생성
|
||||
--%>
|
||||
<!DOCTYPE html>
|
||||
<html lang="ko">
|
||||
<div id="member-search" class="modal" style="max-width: 1200px;">
|
||||
<div class="modal-header">
|
||||
<h4 id="title">회원 검색</h4>
|
||||
</div>
|
||||
<div class="modal-content">
|
||||
<form id="mbrSrchForm">
|
||||
<section class="content-section" id="mbrSrchSection">
|
||||
<span>
|
||||
<c:choose>
|
||||
<c:when test="${not empty mbrSrchVO.actionDv}">
|
||||
<c:choose>
|
||||
<c:when test="${ mbrSrchVO.actionDv eq 'sms'}"><%--sms인 경우--%>
|
||||
<span class="red-7">광고 수신 및 SMS 수신에 동의한 회원만 검색됩니다.</span>
|
||||
</c:when>
|
||||
<c:otherwise>
|
||||
<span class="red-7">광고 수신 및 이메일 수신에 동의한 회원만 검색됩니다.</span><%--email인 경우--%>
|
||||
</c:otherwise>
|
||||
</c:choose>
|
||||
<span class="red-7">(검색어는 정확하게 입력해주세요.)</span>
|
||||
</c:when>
|
||||
<c:otherwise><%--쿠폰인 경우--%>
|
||||
<span class="red-7">검색어는 정확하게 입력해주세요.</span>
|
||||
</c:otherwise>
|
||||
</c:choose>
|
||||
</span>
|
||||
<div class="table-wrapper">
|
||||
<table class="table">
|
||||
<caption>회원 검색</caption>
|
||||
<colgroup>
|
||||
<col style="width: 12%;">
|
||||
<col>
|
||||
</colgroup>
|
||||
<tr>
|
||||
<th>이름</th>
|
||||
<td>
|
||||
<div class="td-inner">
|
||||
<input class="input-text xl" type="text" title="검색 키워드"
|
||||
name="srchMbrNm" placeholder="이름">
|
||||
</div>
|
||||
</td>
|
||||
<th>아이디</th>
|
||||
<td>
|
||||
<div class="td-inner">
|
||||
<input class="input-text xl" type="text" title="검색 키워드"
|
||||
name="srchKywordID" placeholder="아이디">
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>이메일</th>
|
||||
<td>
|
||||
<div class="td-inner">
|
||||
<input class="input-text xl" type="text" title="검색 키워드"
|
||||
name="srchKywordEmail" placeholder="이메일">
|
||||
</div>
|
||||
</td>
|
||||
<th>휴대폰번호</th>
|
||||
<td>
|
||||
<div class="td-inner">
|
||||
<input class="input-text xl" type="text" title="검색 키워드" id="srchKywordMb"
|
||||
name="srchKywordMb" placeholder="휴대폰번호('-'없이 입력)">
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
<div class="form-control-container">
|
||||
<div class="center">
|
||||
<button type="button" class="btn outline" id="btnResetForm"><spring:message
|
||||
code="button.init"/></button>
|
||||
<button type="button" class="btn primary" id="srchBtn"><spring:message
|
||||
code="button.search"/></button>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
<input type = "hidden" id = "actionDv" name = "actionDv" value = "<c:out value = '${resultMap.boMbrSrchVO.actionDv}'/>"/>
|
||||
<div id="mbrListDiv">
|
||||
<%--임시 section--%>
|
||||
<section class="content-section">
|
||||
<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 title="정렬순">
|
||||
<option>최근 가입순</option>
|
||||
<option>마일리지 많은순</option>
|
||||
<option>마일리지 적은순</option>
|
||||
</select>
|
||||
</div>
|
||||
<!-- 코드 사용 -->
|
||||
<div class="select-box">
|
||||
<select title="페이지당 출력될 목록건수" name="pageUnit" id="pageUnit"
|
||||
onchange="fn_select_list(1);return false;">
|
||||
<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">
|
||||
<hr class="spacing">
|
||||
<div class="table-wrapper">
|
||||
<table class="table vertical" id="mbrList">
|
||||
<caption>회원 목록</caption>
|
||||
<!-- 각 열 width 설정 -->
|
||||
<colgroup>
|
||||
<col style="width: 4%;">
|
||||
<col style="width: 6%;">
|
||||
<col style="width: 10%;">
|
||||
<col style="width: 8%;">
|
||||
<col style="width: auto">
|
||||
<col style="width: auto;">
|
||||
<col style="width: 6%;">
|
||||
<col style="width: 6%;">
|
||||
${resultMap.shopInfo.ordrSetupInfo.cashAt eq 'Y' ? '<col style="width: 6%;">' : ''}
|
||||
<col style="width: 10%;">
|
||||
<col style="width: 10%">
|
||||
</colgroup>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>
|
||||
<label class="b-checkbox checkbox is-medium check-all">
|
||||
<input type="checkbox" value="" id="chkA">
|
||||
<span class="check"></span>
|
||||
</label>
|
||||
</th>
|
||||
<th>번호</th>
|
||||
<th>아이디</th>
|
||||
<th>이름</th>
|
||||
<th>이메일</th>
|
||||
<th>핸드폰번호</th>
|
||||
<th>등급</th>
|
||||
<th>마일리지</th>
|
||||
${resultMap.shopInfo.ordrSetupInfo.cashAt eq 'Y' ? '<th>GC머니</th>' : ''}
|
||||
<th>가입일</th>
|
||||
<th>최종방문 일시</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td colspan="100%"><spring:message code="common.nodata"/></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<div id="modalDv">
|
||||
</div>
|
||||
<hr class="spacing">
|
||||
<hr class="spacing">
|
||||
<div class="form-control-container">
|
||||
<div class="left"></div>
|
||||
<div class="center">
|
||||
</div>
|
||||
<div class="right">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button type = "button" class="btn primary" id="selectMbrBtn">선택한 회원 <spring:message code="button.apply"/> </button>
|
||||
<button type = "button" class="btn primary" id="srchMbrBtn">검색한 회원 <spring:message code="button.apply"/></button>
|
||||
<a rel="modal:close" class="btn outline"><spring:message code="button.close"/></a>
|
||||
</div>
|
||||
</div>
|
||||
<script>
|
||||
|
||||
$(document).ready(function(){
|
||||
$(document).on('keydown', function(event) {
|
||||
// Enter 키(13)를 감지하여 동작을 막음
|
||||
if(event.keyCode === 13) {
|
||||
event.preventDefault();
|
||||
$("#srchBtn").click();
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
/*******************************************
|
||||
검색 조건 이벤트 설정
|
||||
********************************************/
|
||||
/*niceSelector먹이기*/
|
||||
fn_set_niceSelect_datePicker("#mbrListDiv");
|
||||
|
||||
/*검색조건 > 초기화 버튼 클릭 이벤트*/
|
||||
$('#btnResetForm').on('click', function(){
|
||||
fn_reset_form('mbrSrchSection');
|
||||
});
|
||||
|
||||
|
||||
/*검색 버튼(검색어 지정 안할 시 검색 안됨)*/
|
||||
$("#srchBtn").on('click',function(){
|
||||
let valList = [];
|
||||
|
||||
$('#mbrSrchSection').find('input').each(function(){
|
||||
let value = $(this).val();
|
||||
if(value !== ''){
|
||||
valList.push(value);
|
||||
}
|
||||
});
|
||||
if(valList.length === 0) {
|
||||
alert("검색어를 입력해주세요");
|
||||
}else{
|
||||
fn_select_mbr_list(1);
|
||||
}
|
||||
});
|
||||
|
||||
/*검색어 휴대폰 번호 숫자만허용*/
|
||||
$("#srchKywordMb").on('input',function(){
|
||||
$("#srchKywordMb").val($("#srchKywordMb").val().replace(/[^0-9]/g, ""));
|
||||
});
|
||||
|
||||
/*선택 회원 적용 클릭*/
|
||||
$("#selectMbrBtn").on("click",function(){
|
||||
if ($('input[name=mbrInnb]:checked').length > 0) {
|
||||
|
||||
// 회원 고유 번호
|
||||
const mbrInnbArr = [];
|
||||
$('input[name=mbrInnb]:checked').each(function() {
|
||||
mbrInnbArr.push($(this).val());
|
||||
});
|
||||
|
||||
// 회원 구분 코드
|
||||
const mbrDvCdArr = [];
|
||||
$('input[name=mbrInnb]:checked').closest("td").find(".mbrDvCd").each(function() {
|
||||
mbrDvCdArr.push($(this).val());
|
||||
});
|
||||
|
||||
// 회원명
|
||||
const mbrNmArr = [];
|
||||
$('input[name=mbrInnb]:checked').closest("tr").find('td:nth-of-type(4)').each(function() {
|
||||
mbrNmArr.push($(this).text().replace(/[\n\t\r]+/g, '').trim());
|
||||
});
|
||||
|
||||
// 회원 전화 번호
|
||||
const mbtlnbArr = [];
|
||||
$('input[name=mbrInnb]:checked').closest("td").siblings(".mbtlnb").each(function() {
|
||||
mbtlnbArr.push($(this).text());
|
||||
});
|
||||
|
||||
// 결과를 저장할 배열
|
||||
let resultArr = [];
|
||||
|
||||
// 두 배열을 순회하며 객체로 변환
|
||||
for (let i = 0; i < mbrInnbArr.length; i++) {
|
||||
resultArr.push({
|
||||
mbrInnb: mbrInnbArr[i],
|
||||
mbrDvCd: mbrDvCdArr[i],
|
||||
mbrNm: mbrNmArr[i],
|
||||
recptnNb: mbtlnbArr[i]
|
||||
});
|
||||
}
|
||||
|
||||
// 결과 출력
|
||||
const actionDv = $("#actionDv").val();
|
||||
if(actionDv){//sms, email인 경우
|
||||
const srchMbrCnt = parseInt($(".srchMbrCnt").text()) + resultArr.length;
|
||||
$(".srchMbrCnt").text(srchMbrCnt);
|
||||
}
|
||||
|
||||
$(".mbrInfo").val(JSON.stringify(resultArr)).trigger('change');
|
||||
fn_close_modal("member-search");
|
||||
} else {
|
||||
//회원이 체크되지 않으면 안내 문구 호출
|
||||
alert("적용할 회원이 없습니다.");
|
||||
}
|
||||
});
|
||||
|
||||
/*검색 회원 적용 클릭*/
|
||||
$("#srchMbrBtn").on("click", function () {
|
||||
let valList = [];
|
||||
/*검색어 값 여부 */
|
||||
$('#mbrSrchSection').find('input').each(function () {
|
||||
let value = $(this).val();
|
||||
if (value !== '') {
|
||||
valList.push(value);
|
||||
}
|
||||
});
|
||||
|
||||
/*검색어 입력 여부에 따른 분기 처 리*/
|
||||
if (valList.length > 0) {
|
||||
|
||||
let dataStr = $("#mbrSrchSection").find("input").serialize();
|
||||
|
||||
const actionDv = $("#actionDv").val();
|
||||
|
||||
if(actionDv){
|
||||
dataStr = dataStr+"&actionDv="+actionDv;
|
||||
}
|
||||
|
||||
$.ajax({
|
||||
type: "post",
|
||||
url: "<c:url value='/mngr/mbr/selectSndngTargtMbr'/>",
|
||||
data: dataStr,
|
||||
success: function (data) {
|
||||
|
||||
let resultArr = data.resBody.result;
|
||||
resultArr = JSON.parse(resultArr);
|
||||
let tot = resultArr.result.mbrInfoCnt;
|
||||
resultArr = resultArr.result.mbrInfo;
|
||||
// 결과 출력
|
||||
const actionDv = $("#actionDv").val();
|
||||
|
||||
// 결과를 저장할 배열
|
||||
let resultTotArr = [];
|
||||
let tempResultArr = JSON.parse(resultArr);
|
||||
|
||||
$.each(tempResultArr, function(index, item) {
|
||||
resultTotArr.push({
|
||||
mbrInnb:item.mbrInnb,
|
||||
mbrNm: item.recpntNm,
|
||||
recptnNb: item.sndngInfo
|
||||
})
|
||||
});
|
||||
|
||||
if(actionDv){//sms, email인 경우
|
||||
$(".srchMbrCnt").text(tot+" 명");
|
||||
}
|
||||
|
||||
$(".mbrInfo").val(JSON.stringify(resultTotArr)).trigger('change');
|
||||
|
||||
fn_close_modal("member-search");
|
||||
}
|
||||
});
|
||||
} else {
|
||||
alert("적용할 회원이 없습니다.");
|
||||
}
|
||||
});
|
||||
|
||||
/* ********************************************************
|
||||
* 목록 조회 function
|
||||
******************************************************** */
|
||||
//회원 목록 조회(ajax)
|
||||
if(typeof fn_select_mbr_list === 'undefined'){
|
||||
function fn_select_mbr_list (pageIndex, pageUnit) {
|
||||
let dataStr;
|
||||
if(!pageIndex) {
|
||||
$('#pageIndex').val(1);
|
||||
} else {
|
||||
$('#pageIndex').val(pageIndex);
|
||||
}
|
||||
|
||||
if(!pageUnit) {
|
||||
dataStr = $('#mbrSrchForm').serialize();
|
||||
} else {
|
||||
if($('#pageUnit').length){
|
||||
$('#pageUnit').val(pageUnit);
|
||||
dataStr = $('#mbrSrchForm').serialize();
|
||||
} else {
|
||||
dataStr = $('#mbrSrchForm').serialize()+'&pageUnit='+pageUnit;
|
||||
}
|
||||
}
|
||||
$.ajax({
|
||||
type: "post",
|
||||
url : "<c:url value='/mngr/mbr/selectMbrSrchPopupRInqire'/>",
|
||||
data : dataStr,
|
||||
success:function(resultHtml) {
|
||||
$('#mbrListDiv').html(resultHtml);
|
||||
fn_set_niceSelect_datePicker('#mbrListDiv');
|
||||
$(".mbtlnb").each(function(){
|
||||
let mbtlnb = $(this).text().replace(/\s+/g, '');
|
||||
mbtlnb = fn_format_mbtlnb(mbtlnb);
|
||||
$(this).text(mbtlnb);
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
</script>
|
||||
</html>
|
||||
@@ -0,0 +1,789 @@
|
||||
<%@ 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 : MssagePassivSndngC.jsp
|
||||
Description : 메시지 수동 발송 폼
|
||||
Modification Information
|
||||
|
||||
수정일 수정자 수정내용
|
||||
------- -------- ---------------------------
|
||||
2024-02-28 리브가 최초 생성
|
||||
2024-04-04 이운산 수정
|
||||
--%>
|
||||
<script>
|
||||
$(document).ready(function () {
|
||||
|
||||
//url 정보
|
||||
const urlParams = new URLSearchParams(window.location.search);
|
||||
|
||||
if (urlParams.has('mbrInfo')) {
|
||||
$('.mbrInfo').val(urlParams.get('mbrInfo')).trigger("change");
|
||||
const srchMbrCnt = parseInt($('.srchMbrCnt').text()) + parseInt(urlParams.get('sndngCnt'));
|
||||
$('.srchMbrCnt').text(srchMbrCnt)
|
||||
|
||||
const mbrInfo = JSON.parse($(".mbrInfo").val());
|
||||
|
||||
const directDiv = $("#directDiv");
|
||||
|
||||
mbrInfo.forEach((item, index) => {
|
||||
const divCnt = directDiv.children("div").length + 1;
|
||||
|
||||
const newDiv = $("<div></div>")
|
||||
.text(`[\${divCnt}] \${item.mbtlnb} \${item.mbrNm}`);
|
||||
|
||||
|
||||
const delBtn = $("<button>삭제</button>")
|
||||
.attr("type", "button")
|
||||
.addClass("btn xsm gray btn_del")
|
||||
.on("click", function () {
|
||||
$(this).parent().remove();
|
||||
});
|
||||
|
||||
newDiv.append(delBtn).append("<br>");
|
||||
|
||||
// Append the new div to directDiv
|
||||
directDiv.append(newDiv);
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
|
||||
//나이스 셀렉터 설정
|
||||
$('.select-box select').niceSelect();
|
||||
|
||||
//데이트 피커
|
||||
fn_set_datepicker("#datepicker_1");
|
||||
|
||||
|
||||
//? 버튼 처리
|
||||
$(".mini-info-btn").on("click", function (event){
|
||||
event.preventDefault();
|
||||
const info = $(this).data("info");
|
||||
|
||||
$("#" + info).css({
|
||||
top: $(this).offset().top,
|
||||
left: $(this).offset().left,
|
||||
});
|
||||
|
||||
if ($(this).offset().left > 1000) {
|
||||
$("#" + info).css({
|
||||
left: $(this).offset().left - $("#" + info).width() - 10,
|
||||
});
|
||||
}
|
||||
|
||||
$("#" + info).show();
|
||||
})
|
||||
|
||||
|
||||
$('input').on('keydown', function(e) {
|
||||
if (e.keyCode == 13) {
|
||||
e.preventDefault();
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
|
||||
fn_preview();
|
||||
/**************************************************************
|
||||
* 바이트 수 체크
|
||||
****************************************************************/
|
||||
$("#cn, #head, #tail").on("keyup change", function(){
|
||||
const headStr = $("#head").val();
|
||||
const cnStr= $("#cn").val();
|
||||
const tailStr = $("#tail").val();
|
||||
|
||||
const str = headStr + cnStr + tailStr;
|
||||
const str_len = headStr.length + cnStr.length + tailStr.length;
|
||||
|
||||
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)")
|
||||
}
|
||||
});
|
||||
|
||||
//고객센터 버튼
|
||||
$('#auto-callback').click(function() {
|
||||
const selectedBrand = "<c:out value='${ resultMap.shopInfoMap.sopmalCd }'/>";
|
||||
|
||||
if ( !selectedBrand) {
|
||||
alert('브랜드를 먼저 선택하세요.');
|
||||
$("[name=brandCd]").focus();
|
||||
|
||||
} else {
|
||||
|
||||
const sopmalCd = selectedBrand
|
||||
|
||||
$.ajax({
|
||||
type: "post",
|
||||
url : "<c:url value="/mngr/ntcn/mssage/selectShopNb"/>",
|
||||
data :{ sopmalCd },
|
||||
success:function(data) {
|
||||
const str = JSON.parse(data.resBody.result);
|
||||
const smsAtmcSndngDsptchNb = str.shopNbMap.smsAtmcSndngDsptchNb;
|
||||
//제목
|
||||
const addTitle = '(광고)' + selectedBrand;
|
||||
$("#head").val(addTitle).trigger("change");
|
||||
//내용
|
||||
let sndngCn = $("#cn").val();
|
||||
const strCall = '■ 고객센터 : ' + smsAtmcSndngDsptchNb;
|
||||
const iVal = sndngCn.indexOf(strCall);
|
||||
|
||||
if(iVal == -1) {
|
||||
sndngCn = sndngCn + '\r\n\r\n' + strCall;
|
||||
}
|
||||
|
||||
$("#cn").val(sndngCn).trigger("change");
|
||||
}
|
||||
})
|
||||
|
||||
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
$('#auto-freedeny').click(function() {
|
||||
const selectedBrand = "<c:out value='${ resultMap.shopInfoMap.sopmalCd }'/>";
|
||||
if ( !selectedBrand) {
|
||||
alert('브랜드를 먼저 선택하세요.');
|
||||
$("[name=brandCd]").focus();
|
||||
} else {
|
||||
|
||||
const sopmalCd = selectedBrand
|
||||
|
||||
$.ajax({
|
||||
type: "post",
|
||||
url : "<c:url value="/mngr/ntcn/mssage/selectShopNb"/>",
|
||||
data :{ sopmalCd },
|
||||
success:function(data) {
|
||||
const str = JSON.parse(data.resBody.result);
|
||||
const rejectTelnb = str.shopNbMap.rejectTelnb;
|
||||
|
||||
let tail = $("#tail").val();
|
||||
|
||||
const strFreedeny = '무료수신거부 : ' + rejectTelnb;
|
||||
const iVal = tail.indexOf(strFreedeny);
|
||||
if(iVal == -1) {
|
||||
$("#tail").val(strFreedeny).trigger("change");
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
}
|
||||
});
|
||||
|
||||
//특수문자 버튼
|
||||
$("#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 = $("#cn").val();
|
||||
$("#cn").val(str+$(this).attr('conts'));
|
||||
});
|
||||
|
||||
|
||||
/* ********************************************************
|
||||
* 회원검색 윈도우
|
||||
*********************************************************/
|
||||
|
||||
$("#mbrSrchBtn").on("click",function(){
|
||||
fn_open_modal("#modalDiv","#member-search","/mngr/ntcn/mssage/selectMbrSrchPopupRForm", {"actionDv":"sms"});
|
||||
});
|
||||
|
||||
$(".mbrInfo").on("change", function(){
|
||||
const mbrInfo = JSON.parse($(this).val());
|
||||
|
||||
const directDiv = $("#directDiv");
|
||||
|
||||
mbrInfo.forEach((item, index) => {
|
||||
|
||||
const divCnt = directDiv.children("div").length + 1;
|
||||
|
||||
const newDiv = $("<div></div>")
|
||||
.text(`[\${divCnt}] \${item.recptnNb} \${item.mbrNm}`);
|
||||
|
||||
|
||||
const delBtn = $("<button>삭제</button>")
|
||||
.attr("type", "button")
|
||||
.addClass("btn xsm gray btn_del")
|
||||
.on("click", function () {
|
||||
$(this).parent().remove();
|
||||
});
|
||||
|
||||
newDiv.append(delBtn).append("<br>");
|
||||
|
||||
directDiv.append(newDiv);
|
||||
});
|
||||
|
||||
|
||||
//건수 설정
|
||||
reset_to_list();
|
||||
});
|
||||
|
||||
$('#addBtn').on('click', function () {
|
||||
// 텍스트에어리어에서 데이터 가져오기
|
||||
const input = $('#inputData').val();
|
||||
|
||||
// 줄 바꿈으로 나누기
|
||||
const lines = input.split('\n').filter(line => $.trim(line) !== '');
|
||||
|
||||
// JSON 객체 배열 생성
|
||||
const jsonArray = lines.map((line, index) => {
|
||||
const parts = line.trim().split(/\s+/);
|
||||
return {
|
||||
to: parts [0], // 고유 ID (선택 사항)
|
||||
name: parts[1] // 줄 내용을 객체에 저장
|
||||
};
|
||||
});
|
||||
|
||||
// 결과 출력
|
||||
const result = JSON.stringify(jsonArray, null, 4);
|
||||
|
||||
const directDiv = $("#directDiv");
|
||||
|
||||
//중복확인
|
||||
let isDuplicate = false;
|
||||
directDiv.children("div").each(function (){
|
||||
let currentText = $(this).text().trim();
|
||||
jsonArray.forEach(function (item){
|
||||
if(currentText.includes(item.to)) {
|
||||
isDuplicate = true;
|
||||
return false;
|
||||
}
|
||||
})
|
||||
|
||||
});
|
||||
|
||||
if(isDuplicate) {
|
||||
alert("전화번호가 이미 입력되어 있습니다.")
|
||||
return ;
|
||||
}
|
||||
|
||||
jsonArray.forEach((item, index) => {
|
||||
|
||||
const divCnt = directDiv.children("div").length + 1;
|
||||
|
||||
const newDiv = $("<div></div>")
|
||||
.text(`[\${divCnt}] \${item.to} \${item.name}`);
|
||||
|
||||
|
||||
const delBtn = $("<button>삭제</button>")
|
||||
.attr("type", "button")
|
||||
.addClass("btn xsm gray btn_del")
|
||||
.on("click", function () {
|
||||
$(this).parent().remove();
|
||||
});
|
||||
|
||||
newDiv.append(delBtn).append("<br>");
|
||||
|
||||
directDiv.append(newDiv);
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
|
||||
|
||||
});
|
||||
/* ********************************************************
|
||||
*alert + focus
|
||||
******************************************************** */
|
||||
function af(msg, obj){
|
||||
if(msg != "")
|
||||
alert(msg);
|
||||
|
||||
if(obj != "" && obj != undefined)
|
||||
obj.focus();
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/* ********************************************************
|
||||
*전화번호 형식
|
||||
******************************************************** */
|
||||
function get_str_to(to, hide){
|
||||
|
||||
if (to == "" || to == undefined || to == null){
|
||||
return "";
|
||||
}
|
||||
|
||||
to = to.replace(/[^0-9]/gi, '');
|
||||
var len = to.length;
|
||||
if(len < 10 || len > 11)
|
||||
return "";
|
||||
|
||||
if(hide == "Y")
|
||||
|
||||
to = to.substr(0, 3) + "-" + "*" + to.substr(3,len - 8) + "-**" + to.substr(-2);
|
||||
else
|
||||
to = to.substr(0, 3) + "-" + to.substr(3, len - 7) + "-" + to.substr(-4);
|
||||
|
||||
return to;
|
||||
}
|
||||
|
||||
/* ********************************************************
|
||||
* 대상 추가
|
||||
******************************************************** */
|
||||
// 대상 추가
|
||||
function add_to(row, hp_list, multi){
|
||||
|
||||
let last_seq = 0;
|
||||
let to_data = {};
|
||||
if(row.r_to == "") return;
|
||||
let r_to = get_str_to(row.r_to, "");
|
||||
row.r_to = r_to;
|
||||
|
||||
if(r_to.length < 13 || r_to.length > 14)
|
||||
return;
|
||||
|
||||
// 중복 검사
|
||||
if(hp_list.includes(r_to)) {
|
||||
if(multi != "Y")
|
||||
alert(r_to+" 이미 추가되어 있는 휴대폰번호입니다.");
|
||||
return;
|
||||
} else {
|
||||
hp_list[r_to] = true;
|
||||
}
|
||||
|
||||
let obj = "";
|
||||
if(!row.r_useq){
|
||||
// 직접 입력은 위에 추가
|
||||
$("#div_to_list ul").append($("#temp_to").html());
|
||||
obj = $("#div_to_list ul li").last();
|
||||
}
|
||||
else{
|
||||
// 검색 목록은 아래에 추가
|
||||
$("#div_to_list ul").append($("#temp_to").html());
|
||||
obj = $("#div_to_list ul li").last();
|
||||
}
|
||||
|
||||
|
||||
let to_seq = hp_list.length + 1;
|
||||
to_data[to_seq] = row;
|
||||
/*
|
||||
if(row.r_status == undefined){
|
||||
row.r_status = "ADD";
|
||||
row.str_status = "추가";
|
||||
}
|
||||
*/
|
||||
let str_to = get_str_to(r_to, "");
|
||||
//var str_name = (row.r_name == "" || row.r_name == undefined) ? "" : row.r_name.substr(0, 1) + '*' + row.r_name.substr(row.r_name.length -1);
|
||||
let str_name = "";
|
||||
|
||||
if(row.r_name == "" || row.r_name == undefined) {
|
||||
str_name = "";
|
||||
}else{
|
||||
str_name = row.r_name;
|
||||
/* let r_name_middle = "*";
|
||||
|
||||
for(let i=0; i < row.r_name.length-3; i++) {
|
||||
r_name_middle += '*';
|
||||
}
|
||||
|
||||
str_name = row.r_name.substr(0, 1) + r_name_middle + row.r_name.substr(row.r_name.length -1);
|
||||
*/
|
||||
}
|
||||
|
||||
const newLi = $("<li></li>");
|
||||
const mbrInnb = row.r_useq;
|
||||
const mbrDvCd = row.mbrDvCd;
|
||||
$("<span class='str_no'></span").text("[" + to_seq + "]")
|
||||
.css({"margin":"5px"}).appendTo(newLi);
|
||||
$("<span class='str_status'></span").text(row.str_status).appendTo(newLi);
|
||||
$("<span class='str_to'></span").text(str_to)
|
||||
.css({"margin":"5px"}).appendTo(newLi);
|
||||
$("<span class='str_name'></span").text(str_name).appendTo(newLi);
|
||||
$("<span class='mbrInnb' hidden></span").text(mbrInnb).appendTo(newLi);
|
||||
$("<span class='mbrDvCd' hidden></span").text(mbrDvCd).appendTo(newLi);
|
||||
$("<span class='btn_del'></span").text("X")
|
||||
.css({"margin":"5px"}).appendTo(newLi);
|
||||
|
||||
$("#div_to_list ul").append(newLi);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/* ********************************************************
|
||||
* 대상 정보 정리
|
||||
******************************************************** */
|
||||
function reset_to_list(){
|
||||
// 번호 재설정
|
||||
var no = 1;
|
||||
$("#div_to_list li .str_no").each(function(){
|
||||
$(this).html("["+no+"]");
|
||||
no++;
|
||||
});
|
||||
|
||||
// 건 수
|
||||
// $("#str_cnt").html($("#div_to_list li").length+"건");
|
||||
$("#r_to_cnt").html($("#div_to_list li").length);
|
||||
$(".srchMbrCnt").text($("#div_to_list li").length)
|
||||
}
|
||||
|
||||
/**
|
||||
* 직접 입력 삭제
|
||||
*/
|
||||
$(".btn_del").css("cursor", "pointer");
|
||||
$("#div_to_list").on("click", ".btn_del", function(){
|
||||
$(this).closest("li").remove();
|
||||
reset_to_list();
|
||||
})
|
||||
|
||||
/**
|
||||
* css 조절
|
||||
*/
|
||||
|
||||
/**
|
||||
* 이미지 최대 높이
|
||||
*/
|
||||
$(".img img").css("max-height", "100px");
|
||||
|
||||
/**
|
||||
* 텍스트 에어리어 최대 넓이
|
||||
*/
|
||||
$("#cn").css("max-width", "600px");
|
||||
|
||||
</script>
|
||||
<section class="content-section">
|
||||
<form id="passiveMssageSndngForm">
|
||||
<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>
|
||||
<div class="td-inner" id="sndngNb">
|
||||
<c:out value="${ resultMap.shopInfoMap.smsAtmcSndngDsptchNb }"/>
|
||||
<input type="hidden" name="sndngNb" value="${ resultMap.shopInfoMap.smsAtmcSndngDsptchNb }"/>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>받는 사람(검색)</th>
|
||||
<td>
|
||||
<div class="td-inner">
|
||||
<div class="" id="srchInput">
|
||||
<span class="fw-500 fs-15 ml-5 srchMbrCnt">0</span> 명
|
||||
<input type="hidden" class="mbrInfo"/>
|
||||
<button type="button"id="mbrSrchBtn"
|
||||
class="btn xsm primary" title="회원 검색 새창열림">회원검색
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>받는 사람</th>
|
||||
<td>
|
||||
<textarea id="inputData" rows="5" cols="30" style="overflow:scroll; width:500px;"></textarea>
|
||||
<button type="button" class="btn xsm gray" id="addBtn">대상추가</button>
|
||||
</td>
|
||||
</tr>
|
||||
<%-- <tr>--%>
|
||||
<%-- <th>받는 사람(직접)</th>--%>
|
||||
<%-- <td>--%>
|
||||
<%-- <div class="td-inner">--%>
|
||||
<%-- <div class="">--%>
|
||||
<%-- <input class="input-text m" type="text" title="휴대전화번호" id="inputTo"--%>
|
||||
<%-- placeholder="휴대전화번호">--%>
|
||||
<%-- <input class="input-text m" type="text" title="이름" id="inputName"--%>
|
||||
<%-- placeholder="이름">--%>
|
||||
<%-- <button type="button" class="btn xsm gray" onclick="fn_add_num();">추가</button>--%>
|
||||
<%-- </div>--%>
|
||||
<%-- </div>--%>
|
||||
<%-- </td>--%>
|
||||
<%-- </tr>--%>
|
||||
<tr>
|
||||
<th>대상</th>
|
||||
<td>
|
||||
<div class="td-inner">
|
||||
<div id="directDiv" style="overflow:scroll; width:500px; height:150px; padding:10px; font-size: 12px;">
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<th>첨부이미지</th>
|
||||
<td>
|
||||
<div class="td-inner">
|
||||
<div class="">
|
||||
<button type="button" class="btn xsm primary" title="이미지첨부"
|
||||
onclick="fn_open_modal('#mssagePassivSndngImgPopupDiv',
|
||||
'#mssagePassivSndngImgPopup',
|
||||
'<c:url value="/mngr/ntcn/mssage/selectMssagePassivSndngImgPopupForm"/>',
|
||||
{'providerSeq' : '<c:out value="${ resultMap.providerSeq }"/>'
|
||||
, 'sopmalCd' : '<c:out value="${ resultMap.sopmalCd}"/>'}); return false;"
|
||||
>이미지첨부
|
||||
</button>
|
||||
</div>
|
||||
<ul id="add_file_list" style="display: block;">
|
||||
</ul>
|
||||
<!-- <div class="atcnImg">
|
||||
<div id="sndngImg">
|
||||
<img src=""/>
|
||||
</div>
|
||||
<div id="imgFileNm"></div>
|
||||
</div> -->
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>내용</th>
|
||||
<td>
|
||||
<div class="td-inner">
|
||||
<div class="message-send">
|
||||
<div class="message-send__left">
|
||||
<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 type="button" class="btn xsm outline" id="auto-callback" type="button">고객센터 추가</button>
|
||||
<button type="button" class="btn xsm outline" id="auto-freedeny" type="button">수신거부 추가</button>
|
||||
<button class="btn xsm gray" id="special_cont" type="button">특수문자</button>
|
||||
<button type="button" class="btn xsm primary outline" onclick="fn_open_modal('#registMssagePopupDiv','#registMssagePopup','<c:url value="/mngr/ntcn/mssage/selectRegistMssagePopup"/>'); return false;">SMS
|
||||
불러오기</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>
|
||||
<input type="text" class="input-text xl" name="head" id="head"/>
|
||||
<textarea class="textarea" title="에디터 입력" cols="30" id="cn" name="cn"
|
||||
rows="10"></textarea>
|
||||
<input type="text" class="input-text xl" name="tail" id="tail"/>
|
||||
<div class="sms-manage__byte">
|
||||
<span class="byteCnt">0</span><span> / 2000</span>
|
||||
<span class="gray-10 sndng-type">(SMS)</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="message-send__right">
|
||||
<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">
|
||||
</div>
|
||||
</div>
|
||||
<textarea class="textarea" title="에디터 입력" cols="30" rows="10" id="previewCn"
|
||||
readonly></textarea>
|
||||
</div>
|
||||
</div>
|
||||
<div class="gray-7">
|
||||
<p class="fyi">‘정보통신망이용 촉진 및 정보 보호 등의 관한 법률 및 시행령’에 따라 광고 전송
|
||||
시
|
||||
제목에 (광고)를 표시해주세요.
|
||||
<button type="button" class="mini-info-btn mb-3" data-info="info01">?</button>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<!-- <div class="gray-7 mt-5">
|
||||
<p class="fyi">받는 사람이 1,000명 이상 시 받는 사람을 엑셀로 다운로드 받아 대량 SMS 발송 기능으로 SMS를 보내주세요.
|
||||
</p>
|
||||
</div> -->
|
||||
</div>
|
||||
<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>발송 시간 설정
|
||||
<button type="button" class="mini-info-btn mb-3" data-info="info01">?</button>
|
||||
</th>
|
||||
<td>
|
||||
<div class="td-inner">
|
||||
<div class="custom-radio-container">
|
||||
<div class="custom-radio">
|
||||
<input type="radio" id="imdtl" name="sndngDtDv" value="imdtl">
|
||||
<label for="imdtl">즉시 발송
|
||||
</label>
|
||||
</div>
|
||||
<div class="custom-radio inner-input">
|
||||
<input type="radio" id="resve" name="sndngDtDv" value="resve">
|
||||
<label for="resve">예약 발송
|
||||
</label>
|
||||
<div class="input-container gap-4 ml-10">
|
||||
<input type="text" id="datepicker_1" class="datepicker"
|
||||
title="시작 날짜 선택" autocomplete="off">
|
||||
<input type="hidden" id="resveDt" name="resveDt"/>
|
||||
<div class="select-box">
|
||||
<select class="short" title="시" id="resveHour">
|
||||
<option value="8">8시</option>
|
||||
<option value="9">9시</option>
|
||||
<option value="10">10시</option>
|
||||
<option value="11">11시</option>
|
||||
<option value="12">12시</option>
|
||||
<option value="13">13시</option>
|
||||
<option value="14">14시</option>
|
||||
<option value="15">15시</option>
|
||||
<option value="16">16시</option>
|
||||
<option value="17">17시</option>
|
||||
<option value="18">18시</option>
|
||||
<option value="19">19시</option>
|
||||
<option value="20">20시</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="select-box">
|
||||
<select class="short" title="분" id="resveMinute">
|
||||
<option value="00">00분</option>
|
||||
<option value="10">10분</option>
|
||||
<option value="20">20분</option>
|
||||
<option value="30">30분</option>
|
||||
<option value="40">40분</option>
|
||||
<option value="50">50분</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</form>
|
||||
</section>
|
||||
<div id="modalDiv"></div>
|
||||
@@ -0,0 +1,111 @@
|
||||
<%@ 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 : MssagePassivSndngDtlPopupR.jsp
|
||||
Description : 메시지 수동 발송 내역 상세
|
||||
Modification Information
|
||||
|
||||
수정일 수정자 수정내용
|
||||
------- -------- ---------------------------
|
||||
2024.02.27 리브가 최초 생성
|
||||
2024.04.04 이운산 수정
|
||||
--%>
|
||||
<div id="mssagePassivSndngDtlPopup" class="modal" style="max-width: 680px;">
|
||||
<div class="modal-header">
|
||||
<h4>문자 발송 정보</h4>
|
||||
</div>
|
||||
<div class="modal-content">
|
||||
<div class="table-wrapper">
|
||||
<table class="table">
|
||||
<caption>해당 테이블에 대한 설명</caption>
|
||||
<colgroup>
|
||||
<col style="width: 25%;">
|
||||
<col>
|
||||
</colgroup>
|
||||
<tbody>
|
||||
<tr>
|
||||
<th>발송 유형</th>
|
||||
<td>
|
||||
<c:out value="${resultMap.boCtrlMap.dv }"/>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>현재 상태</th>
|
||||
<td>
|
||||
<c:choose>
|
||||
<c:when test="${resultMap.boCtrlMap.sttus eq 'REG'}">
|
||||
등록
|
||||
</c:when>
|
||||
<c:when test="${resultMap.boCtrlMap.sttus eq 'BAD'}">
|
||||
불량
|
||||
</c:when>
|
||||
<c:when test="${resultMap.boCtrlMap.sttus eq 'WAIT'}">
|
||||
대기
|
||||
</c:when>
|
||||
<c:when test="${resultMap.boCtrlMap.sttus eq 'SEND'}">
|
||||
전송
|
||||
</c:when>
|
||||
<c:when test="${resultMap.boCtrlMap.sttus eq 'CAN'}">
|
||||
취소
|
||||
</c:when>
|
||||
<c:when test="${resultMap.boCtrlMap.sttus eq 'FAIL'}">
|
||||
실패
|
||||
</c:when>
|
||||
<c:when test="${resultMap.boCtrlMap.sttus eq 'OK'}">
|
||||
성공
|
||||
</c:when>
|
||||
</c:choose>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>발송요청시간</th>
|
||||
<td>
|
||||
<c:out value="${ resultMap.boCtrlMap.registDt }"/>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>실제발송시간</th>
|
||||
<td>
|
||||
<c:out value="${ resultMap.boCtrlMap.sndngDt }"/>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>수신번호</th>
|
||||
<td><c:out value="${resultMap.boCtrlMap.recptnNb }"/></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>회신번호</th>
|
||||
<td><c:out value="${resultMap.boCtrlMap.sndngNb }"/></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>발송내용</th>
|
||||
<td>
|
||||
<div style="height: 200px; width: 100%;" class="send-content">
|
||||
<c:if test="${ !empty resultMap.boCtrlMap.head }">
|
||||
<div>
|
||||
<c:out value="${resultMap.boCtrlMap.head }"/>
|
||||
</div>
|
||||
</c:if>
|
||||
<c:if test="${ !empty resultMap.boCtrlMap.cn }">
|
||||
<div style="white-space: pre-line;">
|
||||
<c:out value="${resultMap.boCtrlMap.cn }"/>
|
||||
</div>
|
||||
</c:if>
|
||||
<c:if test="${ !empty resultMap.boCtrlMap.tail }">
|
||||
<div style="white-space: pre-line;">
|
||||
<c:out value="${resultMap.boCtrlMap.tail }"/>
|
||||
</div>
|
||||
</c:if>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -0,0 +1,318 @@
|
||||
<%@ 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 : MssagePassivSndngImgPopupC.jsp
|
||||
Description : 메시지 수동 발송 이미지 첨부
|
||||
Modification Information
|
||||
|
||||
수정일 수정자 수정내용
|
||||
------- -------- ---------------------------
|
||||
2024.02.27 리브가 최초 생성
|
||||
2024.04.04 이운산 수정
|
||||
--%>
|
||||
<script>
|
||||
$(document).ready(function () {
|
||||
/* ********************************************************
|
||||
* 첨부파일 발송 화면에 입력
|
||||
******************************************************** */
|
||||
const fn_select_file = function() {
|
||||
const selectFile = $("[name=fSeq]:checked");
|
||||
|
||||
if(selecFile == undefined || selecFile == null) {
|
||||
alert("목록에서 이미지를 선택해주세요!");
|
||||
return false;
|
||||
}
|
||||
|
||||
const tr = selectFile.closet("tr");
|
||||
const fileName = tr.find("td.fileName").text();
|
||||
const src = tr.find("img").attr("src");
|
||||
|
||||
$("#sndngImg img").attr("src", src);
|
||||
$("#imgFileNm").text(fileName);
|
||||
}
|
||||
|
||||
/* ********************************************************
|
||||
* 첨부파일 발송 화면에 입력
|
||||
******************************************************** */
|
||||
$("#selectFileBtn").on("click", function(){
|
||||
const fSeq = $("[name=selectedImg]:checked").val();
|
||||
console.log(fSeq);
|
||||
|
||||
if(fSeq == "" || fSeq == undefined) {
|
||||
alert("목록에서 이미지를 선택해주세요!");
|
||||
return false;
|
||||
}
|
||||
|
||||
const selectedTr = $("[name=selectedImg]:checked").closest("tr");
|
||||
|
||||
const img = selectedTr.find("img");
|
||||
const fileName = selectedTr.find(".fileName").text();
|
||||
//TODO:추후 소스 위치 변경 필요
|
||||
const imgDiv = $("<div>").addClass("img").append($("<img>").attr("src", img[0].src));
|
||||
|
||||
const imgNameDiv = $("<div>").append($("<span>").text(fileName));
|
||||
const btnDiv = $("<div>").append($("<button>")
|
||||
.addClass("btn xsm primary")
|
||||
.attr("type", "button")
|
||||
.attr("name", "imgDelBtn")
|
||||
.text("삭제"));
|
||||
|
||||
const fSeqInput = $("<input>").attr("type", "hidden")
|
||||
.attr("name", "fSeq")
|
||||
.attr("value", fSeq);
|
||||
|
||||
const newAddDiv = $("<div>").append(imgDiv)
|
||||
.append(imgNameDiv)
|
||||
.append(btnDiv)
|
||||
.append(fSeqInput);
|
||||
const newAddLi = $("<li>").append(newAddDiv);
|
||||
|
||||
$("#add_file_list").append(newAddLi)
|
||||
|
||||
alert("추가되었습니다.");
|
||||
})
|
||||
|
||||
/* ********************************************************
|
||||
* 파일 이미지 등록
|
||||
******************************************************** */
|
||||
$("#fileRegBtn").on("click", function(){
|
||||
|
||||
const formData = new FormData($("#itrntSmsFileForm")[0]);
|
||||
|
||||
const files = $("#fileUpload")[0].files;
|
||||
|
||||
$.each(files, function(i, file) {
|
||||
//이미지 너비 및 높이 구하기
|
||||
const img = $('<img>', { src: URL.createObjectURL(file), style: 'display:none;' });
|
||||
img.on('load', function() {
|
||||
const width = this.width;
|
||||
const height = this.height;
|
||||
|
||||
formData.append("fWidth", width);
|
||||
formData.append("fHeight", height);
|
||||
|
||||
URL.revokeObjectURL(this.src); // 메모리 해제
|
||||
$(this).remove();
|
||||
console.log(file.name)
|
||||
$.ajax({
|
||||
type :"post",
|
||||
url : "<c:url value="/mngr/ntcn/mssage/insertIntrntSndngImg"/>",
|
||||
data: formData,
|
||||
processData: false,
|
||||
contentType: false,
|
||||
success:function(data) {
|
||||
console.log(data);
|
||||
const str = JSON.parse(data.resBody.result);
|
||||
console.log(str);
|
||||
if (str.result == 'success') {
|
||||
alert('<spring:message code="success.common.insert"/>');
|
||||
//새행 추가
|
||||
const newRow = $("<tr>").attr("data-fseq", str.fSeq);
|
||||
//인풋 추가
|
||||
const newInput = $("<input>").attr("type", "radio")
|
||||
.attr("id", str.fSeq)
|
||||
.attr("name", "selectedImg")
|
||||
.attr("value" , str.fSeq);
|
||||
//레이블 추가
|
||||
const newLabel = $("<label>").attr("for", str.fSeq);
|
||||
//div 추가
|
||||
const newRadioDiv = $("<div>").addClass("custom-radio")
|
||||
.append(newInput)
|
||||
.append(newLabel);
|
||||
//td 추가
|
||||
const newRadioTd = $("<td>").append(newRadioDiv);
|
||||
//행에 td 추가
|
||||
newRow.append(newRadioTd);
|
||||
|
||||
const newImg = $("<img>").attr("id", "registImg")
|
||||
.attr("src", str.fCourse);
|
||||
newRow.append($("<td>").append(newImg));
|
||||
newRow.append($("<td>").addClass("fileName").text(file.name));
|
||||
|
||||
//버튼추가
|
||||
const newBtn = $("<button>").addClass("btn xsm primary")
|
||||
.attr("type", "button")
|
||||
.attr("name", "itrntImgDelBtn")
|
||||
.text("삭제");
|
||||
//행에 버튼 추가
|
||||
newRow.append($("<td>").append(newBtn));
|
||||
|
||||
$("#itrntImgTable tbody").append(newRow);
|
||||
}
|
||||
}
|
||||
})
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
|
||||
// })
|
||||
//
|
||||
// const fn_add_file_mbrGradNm = (mode, targetFilListId, index) => {
|
||||
// console.log("파일 추가 진입 ");
|
||||
// let target = $(event.target);
|
||||
// let inputContainer = target.closest('.manage-btn-container').find("input[name='filUploadAt']");
|
||||
// inputContainer.val("1");
|
||||
//
|
||||
// if (!($(event.target).is('[multiple]'))) filesTempArr.splice(0, filesTempArr.length);
|
||||
//
|
||||
// let files = event.target.files;
|
||||
// let filesArr = Array.prototype.slice.call(files); //file객체 array추가
|
||||
// let filesArrLen = filesArr.length;
|
||||
// let filesTempArrSize = filesTempArr.length * 1;
|
||||
//
|
||||
// if (mode === 1 && $(targetFilListId + ' li').length > 0) {
|
||||
// alert("파일은 한개만 첨부할 수 있습니다.");
|
||||
// return false;
|
||||
// }
|
||||
//
|
||||
// let templist = '';
|
||||
// for (let i = 0; i < filesArrLen; i++) {
|
||||
// filesTempArr.push(filesArr[i]); // 임시 배열에 저장
|
||||
// let file = filesArr[i];
|
||||
// let reader = new FileReader();
|
||||
//
|
||||
// reader.onload = function (e) {
|
||||
// templist = `<li id="temp\${index}" class="fileLi">
|
||||
// <a class="file-list__item">
|
||||
// <span class="file-list__item-title">
|
||||
// <img src="\${e.target.result}"
|
||||
// onerror="this.src='/admin/images/image_placeholder.png'; this.style.width='60px'; this.style.height='60px';"
|
||||
// style="width: 60px; height: 60px; margin-right: 16px;"/>
|
||||
// </span>
|
||||
// </a>
|
||||
// <a class="file-list__delete fileDel" style="cursor:pointer;">
|
||||
// <span class="visually-hidden">파일 삭제</span>
|
||||
// </a>
|
||||
// </li>`;
|
||||
// $("#" + targetFilListId).append(templist);
|
||||
// };
|
||||
// reader.readAsDataURL(file);
|
||||
// //파일선택 영역 hide 처리
|
||||
// target.closest('.manage-btn-container').find(".input-file").hide();
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// const fn_show_fileUpload = (length) => {
|
||||
// $(".input-file").eq(length).show();
|
||||
// $(".manage-btn-container").eq(length).find("input[name='filUploadAt']").val("0");
|
||||
// }
|
||||
|
||||
|
||||
|
||||
// //파일 삭제시 아이콘 컬럼값 삭제
|
||||
// const fn_delete_file = (index) => {
|
||||
// $(".mbrGradIconCours").eq(index).val("x");
|
||||
// $("input[name='filUploadAt']").eq(index).val("0");
|
||||
// $('.input-file').eq(index).show();
|
||||
// }
|
||||
|
||||
/* ********************************************************
|
||||
* 파일 이미지 삭제
|
||||
******************************************************** */
|
||||
|
||||
|
||||
$("#itrntImgTable").on("click", "[name=itrntImgDelBtn]",function(){
|
||||
if (confirm("파일을 삭제하시겠습니까?")) {
|
||||
const row = $(this).closest("tr");
|
||||
const fileKey = row.data("fseq");
|
||||
const menuGb = "SMSI";
|
||||
const shopCd = "<c:out value='${resultMap.sopmalCd}'/>"
|
||||
|
||||
ajaxFileDelete('', fileKey, shopCd, menuGb, 1, null, row);
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
|
||||
/* ********************************************************
|
||||
* 메인페이지 - 첨부이미지 삭제 (화면만 삭제함)
|
||||
******************************************************** */
|
||||
$("#add_file_list").on("click", "[name=imgDelBtn]", function(){
|
||||
const li = $(this).closest("li");
|
||||
li.remove();
|
||||
|
||||
})
|
||||
|
||||
|
||||
});
|
||||
</script>
|
||||
<div id="mssagePassivSndngImgPopup" class="modal" style="max-width: 480px;">
|
||||
<div class="modal-header">
|
||||
<h4>MMS 이미지 추가</h4>
|
||||
</div>
|
||||
<div class="modal-content">
|
||||
<div class="table-wrapper">
|
||||
<p>■ 등록된 이미지목록 - 항목을 선택하여 MMS로 첨부합니다.</p>
|
||||
<table class="table vertical" id="itrntImgTable">
|
||||
<caption>해당 테이블에 대한 설명</caption>
|
||||
<colgroup>
|
||||
<col style="width: 25%;">
|
||||
<col>
|
||||
</colgroup>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>선택</th>
|
||||
<th>이미지</th>
|
||||
<th>파일명</th>
|
||||
<th>관리</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<c:forEach var="itrntImg" items="${resultMap.itrntFileList}" varStatus="status">
|
||||
<tr data-fseq="${itrntImg.fSeq}">
|
||||
<td>
|
||||
<div class="custom-radio">
|
||||
<input type="radio" id="${itrntImg.fSeq}" name="selectedImg" value="${itrntImg.fSeq}">
|
||||
<label for="${itrntImg.fSeq}"></label>
|
||||
</div>
|
||||
</td>
|
||||
<td>
|
||||
<spring:eval expression="@environment.getProperty('mngrfo.common.fileupload.cdnurl')" var="cdnurl"/>
|
||||
<img class="registImg" src="<c:out value="${cdnurl}${itrntImg.fCourse}${itrntImg.fName}"/>"
|
||||
onerror="this.src='<c:url value="/mngr/images/image_placeholder.png"/>'"
|
||||
alt="${itrntImg.fName}" width="65" height="65">
|
||||
</td>
|
||||
<td class="fileName"><c:out value="${itrntImg.fNameOrg}"/></td>
|
||||
<td><button type="button" class="btn xsm primary" name="itrntImgDelBtn">삭제</button></td>
|
||||
</tr>
|
||||
</c:forEach>
|
||||
</tbody>
|
||||
</table>
|
||||
<div class="mt-10">
|
||||
<button type="button" class="btn xsm primary" title="" id="selectFileBtn">
|
||||
선택항목 MMS 이미지로 첨부하기
|
||||
</button>
|
||||
</div>
|
||||
<div class="mt-10">
|
||||
<p>■ 이미지등록 - 새로운 이미지를 목록에 추가합니다.</p>
|
||||
<div class="info">
|
||||
<div style="background-color:#eee; border:dashed 1px #ddd; padding:5px;">
|
||||
<h2>※이미지등록 시 유의사항</h2>
|
||||
<ul>
|
||||
<li><strong>이미지 형식 : </strong>.jpg 파일만 가능</li>
|
||||
<li><strong>해상도 (가로 x 세로) : </strong>1000px x 1000px 이하</li>
|
||||
<li><strong>파일용량 : </strong>300kb 이하 권장</li>
|
||||
<li><strong>파일이름 : </strong>30자 이내, (공백, 영문, 숫자, 한글, -, _) 이 외에 특수문자는 되도록 넣지 말아주세요!</li>
|
||||
</ul>
|
||||
<p>※MMS 발송전 테스트를 먼저 해보시기 바랍니다.</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mt-10">
|
||||
<form id="itrntSmsFileForm" enctype="multipart/form-data">
|
||||
<spring:eval expression="@environment.getProperty('mngrfo.common.fileupload.extensions.images')" var="acceptFileExtensions"/>
|
||||
<input type="file" accept="<c:out value="${acceptFileExtensions}"/>" name="files" id="fileUpload"
|
||||
multiple="multiple" onchange="addFiles(event, 1);">
|
||||
<%-- <input type="hidden" name="sopmalCd" value="<c:out value="${ resultMap.sopmalCd }"/>"/>--%>
|
||||
<button type="button" class="btn xsm primary" title="" id="fileRegBtn">등록</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -0,0 +1,221 @@
|
||||
<%@ 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 : MssagePassivSndngListInqireR.jsp
|
||||
Description : 메시지 발송 내역 리스트
|
||||
Modification Information
|
||||
|
||||
수정일 수정자 수정내용
|
||||
------- -------- ---------------------------
|
||||
2024-02-28 리브가 최초 생성
|
||||
2024-04-04 이운산 수정
|
||||
--%>
|
||||
<script>
|
||||
$(document).ready(function () {
|
||||
//전화번호 처리
|
||||
$(".recptnNb").each(function () {
|
||||
const recptnNbStr = $(this).text();
|
||||
const recptnNb = fn_format_mbtlnb(recptnNbStr.replace(/\s+/g, ''));
|
||||
$(this).text(recptnNb);
|
||||
})
|
||||
});
|
||||
|
||||
function fn_resve_cancel(smsInnb, smsToInnb) {
|
||||
// alert("파라미터 값 : "+smsInnb+" : "+smsToInnb);
|
||||
|
||||
url = "<c:url value='/mngr/ntcn/mssage/mssageSndngCancel'/>"
|
||||
if(confirm("해당 예약발송을 취소하시겠습니까?")){
|
||||
$.ajax({
|
||||
type: "post",
|
||||
url : url,
|
||||
data : {
|
||||
smsInnb : smsInnb
|
||||
,smsToInnb : smsToInnb
|
||||
,cancelDvCd : 'SMSTO'
|
||||
},
|
||||
success:function(resultHtml) {
|
||||
alert("정상적으로 처리되었습니다.");
|
||||
fn_select_list_mssage($("#msssagePageIndex").val(),$("#mssagePageUnit").val());
|
||||
}
|
||||
});
|
||||
} else if(confirm("해당 예약발송 그룹을 취소하시겠습니까?")){
|
||||
$.ajax({
|
||||
type: "post",
|
||||
url : url,
|
||||
data : {
|
||||
smsInnb : smsInnb
|
||||
,smsToInnb : smsToInnb
|
||||
,cancelDvCd : 'SMS'
|
||||
},
|
||||
success:function(resultHtml) {
|
||||
alert("정상적으로 처리되었습니다.");
|
||||
fn_select_list_mssage($("#msssagePageIndex").val(),$("#mssagePageUnit").val());
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
</script>
|
||||
<section class="content-section">
|
||||
<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>
|
||||
(성공
|
||||
<em>
|
||||
<c:if test="${empty resultMap.boCtrlMap.rsltSttusCnt.okcnt}">0</c:if>
|
||||
<fmt:formatNumber value="${ resultMap.boCtrlMap.rsltSttusCnt.okcnt }" pattern="#,###" />건
|
||||
</em>,
|
||||
실패
|
||||
<em>
|
||||
<c:if test="${empty resultMap.boCtrlMap.rsltSttusCnt.failcnt}">0</c:if>
|
||||
<fmt:formatNumber value="${ resultMap.boCtrlMap.rsltSttusCnt.failcnt }" pattern="#,###" />건
|
||||
</em>)
|
||||
</span>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="center">
|
||||
</div>
|
||||
<div class="right">
|
||||
<div class="select-box">
|
||||
<select id="mssagePageUnit" name="pageUnit" title="페이지당 출력될 목록건수" onchange="fn_select_list_mssage(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="spacing">
|
||||
<div class="table-wrapper">
|
||||
<table class="table vertical">
|
||||
<caption>해당 테이블에 대한 설명</caption>
|
||||
<!-- 각 열 width 설정 -->
|
||||
<colgroup>
|
||||
<col style="width: 6%;">
|
||||
<col style="width: 6%;">
|
||||
<col style="width: 12%;">
|
||||
<col style="width: 12%;">
|
||||
<col style="width: 6%;">
|
||||
<col style="width: 10%;">
|
||||
<col style="width: auto;">
|
||||
<col style="width: 6%;">
|
||||
<col style="width: 6%;">
|
||||
</colgroup>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>번호</th>
|
||||
<th>유형</th>
|
||||
<th>등록시간</th>
|
||||
<th>(예약)발송시간</th>
|
||||
<th>발송구분</th>
|
||||
<th>수신번호</th>
|
||||
<th>발송내용</th>
|
||||
<th>현재상태</th>
|
||||
<th>예약취소</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<c:if test="${!empty resultMap.boCtrlMap.smsSndngList}">
|
||||
<c:forEach var="smsSndlng" items="${resultMap.boCtrlMap.smsSndngList }" varStatus="status">
|
||||
<tr>
|
||||
<td><c:out value="${smsSndlng.rnum }"/></td>
|
||||
<td>
|
||||
<c:if test="${smsSndlng.dv eq 'SMS'}">
|
||||
SMS
|
||||
</c:if>
|
||||
<c:if test="${smsSndlng.dv eq 'LMS'}">
|
||||
LMS/MMS
|
||||
</c:if>
|
||||
</td>
|
||||
<td>
|
||||
<c:out value="${smsSndlng.registDt }"/>
|
||||
</td>
|
||||
<td>
|
||||
<c:out value="${smsSndlng.sndngDt }"/>
|
||||
</td>
|
||||
<td>
|
||||
<c:out value="${smsSndlng.sndngType }"/>
|
||||
</td>
|
||||
<td class="recptnNb">
|
||||
<c:out value="${smsSndlng.recptnNb }"/>
|
||||
</td>
|
||||
<td class="left">
|
||||
<c:out value="${smsSndlng.head }"/>
|
||||
<c:out value="${smsSndlng.cn }"/>
|
||||
<c:out value="${smsSndlng.tail }"/>
|
||||
</td>
|
||||
<td>
|
||||
<a class="under-line blue-7" onclick="fn_open_modal('#mssagePassivSndngDtlPopupDiv',
|
||||
'#mssagePassivSndngDtlPopup',
|
||||
'<c:url value="/mngr/ntcn/mssage/selectMssagePassivSndngDtlPopupInqire"/>',
|
||||
{'srchSopmalCd' : '<c:out value="${ smsSndlng.sopmalCd }"/>',
|
||||
'srchSmsInnb' : '<c:out value="${ smsSndlng.smsInnb }"/>',
|
||||
'srchRecptnNb' : '<c:out value="${ smsSndlng.recptnNb }"/>'}); return false;">
|
||||
<c:choose>
|
||||
<c:when test="${smsSndlng.sttus eq 'REG'}">
|
||||
등록
|
||||
</c:when>
|
||||
<c:when test="${smsSndlng.sttus eq 'BAD'}">
|
||||
불량
|
||||
</c:when>
|
||||
<c:when test="${smsSndlng.sttus eq 'WAIT'}">
|
||||
대기
|
||||
</c:when>
|
||||
<c:when test="${smsSndlng.sttus eq 'SEND'}">
|
||||
전송
|
||||
</c:when>
|
||||
<c:when test="${smsSndlng.sttus eq 'CAN'}">
|
||||
취소
|
||||
</c:when>
|
||||
<c:when test="${smsSndlng.sttus eq 'FAIL'}">
|
||||
실패
|
||||
</c:when>
|
||||
<c:when test="${smsSndlng.sttus eq 'OK'}">
|
||||
성공
|
||||
</c:when>
|
||||
</c:choose>
|
||||
</a>
|
||||
</td>
|
||||
<td>
|
||||
<c:choose>
|
||||
<c:when test="${smsSndlng.sndngType eq '예약'}">
|
||||
<c:if test="${smsSndlng.sttus != 'CAN'}">
|
||||
<c:set var="today" value="<%=new java.util.Date()%>" />
|
||||
<c:set var="date"><fmt:formatDate value="${today}" pattern="yyyy-MM-dd HH:mm:ss" /></c:set>
|
||||
<c:if test="${smsSndlng.resveCancelDt > date }">
|
||||
<div class="manage-btn-container">
|
||||
<a href="#" class="btn xsm primary outline" onclick="fn_resve_cancel('${smsSndlng.smsInnb }','${smsSndlng.smsToInnb }');"><c:out value="예약취소" /></a>
|
||||
</div>
|
||||
</c:if>
|
||||
</c:if>
|
||||
</c:when>
|
||||
<c:otherwise>
|
||||
</c:otherwise>
|
||||
</c:choose>
|
||||
</td>
|
||||
</tr>
|
||||
</c:forEach>
|
||||
</c:if>
|
||||
<c:if test="${empty resultMap.boCtrlMap.smsSndngList }">
|
||||
<tr>
|
||||
<td class="row-no-data" colspan="12">조회된 데이터가 없습니다.</td>
|
||||
</tr>
|
||||
</c:if>
|
||||
</table>
|
||||
</div>
|
||||
</section>
|
||||
<div class="pagination__container">
|
||||
<input type="hidden" id="msssagePageIndex" name="pageIndex" value="${ resultMap.bOMssageSrchVO.pageIndex }"/>
|
||||
<ui:pagination paginationInfo="${resultMap.paginationInfo}" type="image" jsFunction="fn_select_list_mssage"/>
|
||||
</div>
|
||||
@@ -0,0 +1,244 @@
|
||||
<%@ 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 : MssagePassivSndngListInqireRForm.jsp
|
||||
Description : 메시지 발송 내역 폼
|
||||
Modification Information
|
||||
|
||||
수정일 수정자 수정내용
|
||||
------- -------- ---------------------------
|
||||
2024-02-28 리브가 최초 생성
|
||||
2024-04-04 이운산 수정
|
||||
--%>
|
||||
<script>
|
||||
$(document).ready(function () {
|
||||
$("#info01").hide();
|
||||
|
||||
let pageIndex = '<c:out value="${ resultMap.pageIndex }"/>';
|
||||
let pageUnit = '<c:out value="${ resultMap.pageUnit }"/>';
|
||||
|
||||
//url 정보
|
||||
const urlParams = new URLSearchParams(window.location.search);
|
||||
|
||||
if(urlParams.has("mbrInfo")) {
|
||||
const mbrInfo = JSON.parse($(".mbrInfo").val());
|
||||
$("#srchRecptnNb").val(mbrInfo[0].sndngInfo);
|
||||
$("#srchMbrInnb").val(mbrInfo[0].mbrInnb)
|
||||
|
||||
}
|
||||
|
||||
//초기 날짜 세팅
|
||||
const date = new Date(); // 현재 날짜
|
||||
const formattedDate = date.toISOString().split('T')[0];
|
||||
$('#srchStrtSndngDt').val(formattedDate);
|
||||
$('#srchEndSndngDt').val(formattedDate);
|
||||
$('#today').addClass("selected")
|
||||
|
||||
fn_select_list_mssage(pageIndex, pageUnit);
|
||||
|
||||
//데이트 피커
|
||||
fn_set_niceSelect_datePicker("#listForm");
|
||||
|
||||
//날짜 선택 버튼 선택 처리
|
||||
$(".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', 'srchStrtSndngDt','srchEndSndngDt');
|
||||
|
||||
//검색 조건 종류 항목 체크 여부에 따른 체크 해제
|
||||
$(".kindChk").on("click",function(){
|
||||
fn_ctr_pCheckbox("#kindChkAll",".kindChk");
|
||||
});
|
||||
//검색 조건 상태 항목 체크 여부에 따른 체크 해제
|
||||
$(".sttusChk").on("click",function(){
|
||||
fn_ctr_pCheckbox("#sttusChkAll",".sttusChk");
|
||||
});
|
||||
|
||||
/* ********************************************************
|
||||
* 카테고리 체크버튼 이벤트
|
||||
******************************************************** */
|
||||
|
||||
// "전체 선택" 체크박스를 클릭했을 때
|
||||
$('#kindChkAll').on('click', function() {
|
||||
// 현재 체크 상태를 가져옴
|
||||
const isChecked = $(this).is(':checked');
|
||||
|
||||
// 다른 체크박스들을 모두 체크 또는 해제
|
||||
$('.kindChk').prop('checked', isChecked);
|
||||
});
|
||||
|
||||
// 개별 체크박스를 클릭했을 때 "전체 선택" 체크박스 상태를 동기화
|
||||
$('.kindChk').on('click', function() {
|
||||
const total = $('.kindChk').length;
|
||||
const checked = $('.kindChk:checked').length;
|
||||
|
||||
// 모든 항목이 체크되었으면 "전체 선택"도 체크, 그렇지 않으면 해제
|
||||
$('#kindChkAll').prop('checked', total === checked);
|
||||
});
|
||||
|
||||
|
||||
// "전체 선택" 체크박스를 클릭했을 때
|
||||
$('#sttusChkAll').on('click', function() {
|
||||
// 현재 체크 상태를 가져옴
|
||||
const isChecked = $(this).is(':checked');
|
||||
|
||||
// 다른 체크박스들을 모두 체크 또는 해제
|
||||
$('.sttusChk').prop('checked', isChecked);
|
||||
});
|
||||
|
||||
// 개별 체크박스를 클릭했을 때 "전체 선택" 체크박스 상태를 동기화
|
||||
$('.sttusChk').on('click', function() {
|
||||
const total = $('.sttusChk').length;
|
||||
const checked = $('.sttusChk:checked').length;
|
||||
|
||||
// 모든 항목이 체크되었으면 "전체 선택"도 체크, 그렇지 않으면 해제
|
||||
$('#sttusChkAll').prop('checked', total === checked);
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
</script>
|
||||
<section class="content-section" id="search-section">
|
||||
<h3 class="content-section__title">SMS 발송 메시지</h3>
|
||||
<form id="listForm">
|
||||
<input type="hidden" value="" name="srchRecptnNb" id="srchRecptnNb">
|
||||
<input type="hidden" value="" name="srchMbrInnb" id="srchMbrInnb">
|
||||
<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 colspan="3">
|
||||
<div class="td-inner">
|
||||
<div class="select-box">
|
||||
<select title="검색내용조건" id="srchType" name="srchType">
|
||||
<!-- <select title="검색내용조건" id="srchNbDv" name="srchNbDv"> -->
|
||||
<option value="cn">발송 내용
|
||||
</option>
|
||||
<option value="recpntNb">수신 번호
|
||||
</option>
|
||||
<option value="sndngNb">회신 번호
|
||||
</option>
|
||||
<option value="cstmrIdnb">수신자명
|
||||
</option>
|
||||
</select>
|
||||
</div>
|
||||
<input class="input-text xl" type="text" title="검색어" id="srchStr" name="srchStr">
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>조회 기간</th>
|
||||
<td colspan="3">
|
||||
<div class="td-inner">
|
||||
<div class="select-box">
|
||||
<select title="조회기간조건" name="srchDtDv" id="srchDtDv">
|
||||
<option value="sndngDt">발송일
|
||||
</option>
|
||||
<option value="registDt">등록일
|
||||
</option>
|
||||
<!-- <option value="senttime">발송일
|
||||
</option>
|
||||
<option value="intime">등록일
|
||||
</option> -->
|
||||
</select>
|
||||
</div>
|
||||
<div class="input-container">
|
||||
<input type="text" id="srchStrtSndngDt" name="srchStrtSndngDt" class="datepicker"
|
||||
title="시작 날짜 선택" autocomplete="off">
|
||||
<span class="tilde">~</span>
|
||||
<input type="text" id="srchEndSndngDt" name="srchEndSndngDt" class="datepicker"
|
||||
title="종료 날짜 선택" autocomplete="off">
|
||||
</div>
|
||||
<div class="dateRange-btnContainer">
|
||||
<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>
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>종류</th>
|
||||
<td>
|
||||
<div class="td-inner">
|
||||
<div class="b-checkbox-container">
|
||||
<label class="b-checkbox checkbox check-all">
|
||||
<input type="checkbox" value="" id = "kindChkAll">
|
||||
<span class="check"></span>
|
||||
<span class="control-label">전체</span>
|
||||
</label>
|
||||
<label class="b-checkbox checkbox">
|
||||
<input type="checkbox" value="SMS" class = "kindChk" name="srchDv">
|
||||
<!-- <input type="checkbox" value="S" class = "kindChk" name="srchDv"> -->
|
||||
<span class="check"></span>
|
||||
<span class="control-label">SMS</span>
|
||||
</label>
|
||||
<label class="b-checkbox checkbox">
|
||||
<input type="checkbox" value="LMS" class = "kindChk" name="srchDv">
|
||||
<!-- <input type="checkbox" value="M" class = "kindChk" name="srchDv"> -->
|
||||
<span class="check"></span>
|
||||
<span class="control-label">LMS/MMS</span>
|
||||
</label>
|
||||
<!-- <label class="b-checkbox checkbox">
|
||||
<input type="checkbox" value="AT" class = "kindChk" name="srchDv">
|
||||
<span class="check"></span>
|
||||
<span class="control-label">알림톡</span>
|
||||
</label> -->
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
<th>발송상태</th>
|
||||
<td>
|
||||
<div class="td-inner">
|
||||
<div class="b-checkbox-container">
|
||||
<label class="b-checkbox checkbox check-all">
|
||||
<input type="checkbox" value="" id = "sttusChkAll">
|
||||
<span class="check"></span>
|
||||
<span class="control-label">전체</span>
|
||||
</label>
|
||||
<c:forEach items="${ resultMap.sttus }" var="sttus"
|
||||
varStatus="status">
|
||||
<label class="b-checkbox checkbox">
|
||||
<input type="checkbox" class="sttusChk" name="srchSttus" value="<c:out value="${ sttus.cd }"/>">
|
||||
<span class="check"></span>
|
||||
<span class="control-label"><c:out value="${ sttus.cdNm }"/></span>
|
||||
</label>
|
||||
</c:forEach>
|
||||
</div>
|
||||
</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_mssage(1); return false;">검색</button>
|
||||
</div>
|
||||
<div class="right"></div>
|
||||
</div>
|
||||
</section>
|
||||
<div id="pageDiv">
|
||||
</div>
|
||||
</form>
|
||||
@@ -0,0 +1,487 @@
|
||||
<%@ 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 : MessagePassivSndngManage.jsp
|
||||
Description : 메시지 발송 관리
|
||||
Modification Information
|
||||
|
||||
수정일 수정자 수정내용
|
||||
------- -------- ---------------------------
|
||||
2024-02-28 리브가 최초 생성
|
||||
--%>
|
||||
<!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" %>
|
||||
<script src="<c:url value='/js/fileupload_comm.js'/>"></script>
|
||||
</head>
|
||||
<script>
|
||||
$(document).ready(function () {
|
||||
/**********************
|
||||
* 엔터 키 입력 처리
|
||||
***********************/
|
||||
$("input").keydown(function(event) {
|
||||
if(event.key === "Enter" || event.keyCode === 13) {
|
||||
event.preventDefault();
|
||||
}
|
||||
})
|
||||
|
||||
fn_select_Sndng();
|
||||
|
||||
});
|
||||
|
||||
|
||||
/* ********************************************************
|
||||
* 메시지 수동 발송 TAB
|
||||
******************************************************** */
|
||||
const fn_select_Sndng = function () {
|
||||
|
||||
$.ajax({
|
||||
type: 'post',
|
||||
url: '/mngr/ntcn/mssage/selectMssagePassivSndng',
|
||||
success: function (resultHtml) {
|
||||
$("#selectListInqireFormBtn").removeClass("active");
|
||||
$("#selectListInqireForm").removeClass("active");
|
||||
$(".page-title__btn-container").show();
|
||||
$("#selectSndngBtn").addClass("active");
|
||||
$("#selectSndng").addClass("active");
|
||||
$('#selectSndng').html(resultHtml);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/* ********************************************************
|
||||
* 메시지 발송 내역 TAB
|
||||
******************************************************** */
|
||||
const fn_select_listForm = function () {
|
||||
|
||||
$.ajax({
|
||||
type: 'post',
|
||||
url: '/mngr/ntcn/mssage/selectMssagePassivSndngListInqireRForm',
|
||||
success: function (resultHtml) {
|
||||
$("#selectSndngBtn").removeClass("active");
|
||||
$("#selectSndng").removeClass("active");
|
||||
$(".page-title__btn-container").hide();
|
||||
$("#selectListInqireFormBtn").addClass("active");
|
||||
$("#selectListInqireForm").addClass("active");
|
||||
$('#selectListInqireForm').html(resultHtml);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/* ********************************************************
|
||||
* 메시지 발송 내역 TAB _ 리스트 조회
|
||||
******************************************************** */
|
||||
const fn_select_list_mssage = function(pageIndex, pageUnit) {
|
||||
let dataStr = null;
|
||||
|
||||
if(!pageIndex || pageIndex === '') {
|
||||
$('#mssagePageIndex').val(1);
|
||||
} else {
|
||||
$('#mssagePageIndex').val(pageIndex);
|
||||
}
|
||||
|
||||
pageUnit = $("#mssagePageUnit").val();
|
||||
|
||||
if(!pageUnit) {
|
||||
dataStr = $('#listForm').serialize();
|
||||
} else {
|
||||
if($('#mssagePageUnit').length){
|
||||
$('#mssagePageUnit').val(pageUnit);
|
||||
dataStr = $('#listForm').serialize() + '&pageIndex=' + pageIndex + '&pageUnit='+pageUnit;
|
||||
} else {
|
||||
dataStr = $('#listForm').serialize() + '&pageIndex=' + pageIndex;
|
||||
}
|
||||
}
|
||||
|
||||
$.ajax({
|
||||
type: "post",
|
||||
url : "<c:url value="/mngr/ntcn/mssage/selectMssagePassivSndngListInqire"/>",
|
||||
data : dataStr,
|
||||
success:function(resultHtml) {
|
||||
$('#pageDiv').html(resultHtml);
|
||||
$('#mssagePageUnit').niceSelect();
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
const isEmptyObject = function (obj) {
|
||||
// null인지 먼저 체크
|
||||
if (obj === null || obj === undefined) {
|
||||
return true;
|
||||
}
|
||||
// 비어있는 객체인지 확인
|
||||
return Object.keys(obj).length === 0;
|
||||
}
|
||||
|
||||
/* ********************************************************
|
||||
* 메시지 발송
|
||||
******************************************************** */
|
||||
const fn_sndng_sms = function() {
|
||||
|
||||
let to_arr = [];
|
||||
let name_arr = [];
|
||||
let recptnTrgtList = [];
|
||||
|
||||
|
||||
const directDiv = $("#directDiv");
|
||||
directDiv.children("div").each(function (){
|
||||
const line = $(this).text();
|
||||
const parts = line.trim().split(' ');
|
||||
|
||||
let item = {
|
||||
recptnNb : parts[1] || '',
|
||||
mbrNm : parts[2] || '',
|
||||
// mbrInnb : mbrInnb,
|
||||
// mbrDvCd : mbrDvCd
|
||||
}
|
||||
recptnTrgtList.push(item);
|
||||
});
|
||||
|
||||
|
||||
if(recptnTrgtList.length == 0) {
|
||||
alert("발송 대상이 지정되지 않았습니다.");
|
||||
return false;
|
||||
}
|
||||
|
||||
if($("#cn").val() == "") {
|
||||
alert("내용을 입력해 주세요.")
|
||||
return false;
|
||||
}
|
||||
|
||||
if($("[name=sndngDtDv]:checked").val() == null) {
|
||||
alert("발송시간을 설정해주세요.");
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
const now = new Date();
|
||||
|
||||
const currentHour = now.getHours();
|
||||
const currentMinute = now.getMinutes();
|
||||
//현재 시간
|
||||
const currentTme = (currentHour < 10 ? '0' : '') + currentHour
|
||||
+ (currentMinute < 10 ? '0' : '') + currentMinute;
|
||||
|
||||
//발송 가능 시간
|
||||
const bgntme = $("#smsAtmcSndngLmttBgntme").val()
|
||||
const endtme = $("#smsAtmcSndngLmttEndtme").val()
|
||||
|
||||
const bgntmeNum = parseInt(bgntme, 10)
|
||||
const endtmeNum = parseInt(endtme, 10);
|
||||
|
||||
if($("#resve").is(":checked")) {
|
||||
|
||||
const resveHour = $("#resveHour").val();
|
||||
|
||||
const resveMinute = $("#resveMinute").val();
|
||||
|
||||
//예약시간
|
||||
const resveTme = (resveHour < 10 ? '0' : '') + resveHour
|
||||
+ resveMinute;
|
||||
const resveTmeNum = parseInt(resveTme, 10);
|
||||
|
||||
|
||||
if(resveTmeNum >= bgntmeNum && resveTmeNum <= endtmeNum) {
|
||||
} else {
|
||||
alert("발송 시간이 아닙니다.");
|
||||
return false;
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
const currentTmeNum = parseInt(currentTme, 10);
|
||||
|
||||
if(currentTmeNum >= bgntmeNum && currentTmeNum <= endtmeNum) {
|
||||
} else {
|
||||
alert("발송 시간이 아닙니다.");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
let formData = $("#passiveMssageSndngForm").serializeArray();
|
||||
|
||||
let filteredForm;
|
||||
//즉시 발송인 경우 예약날짜 제거
|
||||
if($("[name=sndngDtDv]:checked").val() == "imdtl") {
|
||||
filteredForm = formData.filter(item => item.name !== "resveDt");
|
||||
} else {
|
||||
filteredForm = formData;
|
||||
}
|
||||
|
||||
$.each(filteredForm, function(index, item){
|
||||
if(item.name === 'resveDt') {
|
||||
const resveDate = $("#datepicker_1").val();
|
||||
const resveHour = $("#resveHour").val();
|
||||
const resveMin = $("#resveMinute").val();
|
||||
$("#resveDt").val(resveDate + " " + resveHour + ":" + resveMin + ":00");
|
||||
const date = new Date($("#resveDt").val());
|
||||
item.value = date;
|
||||
}
|
||||
})
|
||||
|
||||
filteredForm.push({name:'recptnTrgtList', value: JSON.stringify(recptnTrgtList)})
|
||||
const dataStr = $.param(filteredForm);
|
||||
|
||||
$.ajax({
|
||||
type: "post",
|
||||
url : "<c:url value="/mngr/ntcn/mssage/insertMssageSndng"/>",
|
||||
data : dataStr,
|
||||
success:function(data) {
|
||||
const str = JSON.parse(data.resBody.result);
|
||||
const smsRslt = isEmptyObject(str.messageRslt);
|
||||
const sureRlst = isEmptyObject(str.messageSureInsert);
|
||||
const lotteRlst = isEmptyObject(str.mssageLotteInsert);
|
||||
//발송, 대상 등록 실패시
|
||||
if(!smsRslt && str.messageRslt.status == "1") {
|
||||
alert('<spring:message code="fail.common.insert"/>');
|
||||
return false;
|
||||
}
|
||||
|
||||
if(!sureRlst) {
|
||||
//슈어 등록 실패시
|
||||
if(str.messageSureInsert.status == "1") {
|
||||
alert('<spring:message code="fail.common.insert"/>');
|
||||
return false;
|
||||
} else {
|
||||
//슈어 등록 성공시
|
||||
alert('<spring:message code="success.common.insert"/>');
|
||||
}
|
||||
}
|
||||
|
||||
if(!lotteRlst > 0) {
|
||||
//롯데 등록 실패시
|
||||
if(str.mssageLotteInsert.status == "1") {
|
||||
alert('<spring:message code="fail.common.insert"/>');
|
||||
return false;
|
||||
} else {
|
||||
//롯데 등록 성공시
|
||||
alert('<spring:message code="success.common.insert"/>');
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
|
||||
/* ********************************************************
|
||||
* 직접 수신번호 입력
|
||||
******************************************************** */
|
||||
const fn_add_num = function() {
|
||||
const to = $("#inputTo").val();
|
||||
const name = $("#inputName").val();
|
||||
|
||||
if(to == "") {
|
||||
return af("추가하실 휴대전화번호를 입력하세요.", $("#inputTo"));
|
||||
}
|
||||
|
||||
if(get_str_to(to) == "") {
|
||||
return af("휴대전화번호가 올바르지 않습니다.", $(".input_to"));
|
||||
}
|
||||
|
||||
if(name == "") {
|
||||
return af("추가하실 이름을 입력하세요.", $("#inputName"));
|
||||
}
|
||||
|
||||
//목록 배열
|
||||
let hp_list = [];
|
||||
|
||||
//기존 목록 조회후 배열에 입력
|
||||
$("#div_to_list li").each(function () {
|
||||
const to_seq = $(this).attr("to_seq");
|
||||
const r_to = $(this).find(".str_to").text();
|
||||
const r_name = $(this).find(".str_name").text();
|
||||
hp_list.push(r_to);
|
||||
});
|
||||
|
||||
//입력
|
||||
add_to({r_useq:'', r_to:to, r_name:name}, hp_list,"N");
|
||||
|
||||
//입력값 초기화
|
||||
$("#inputTo").val("").focus();
|
||||
$("#inputName").val("");
|
||||
|
||||
//건수 설정
|
||||
reset_to_list();
|
||||
}
|
||||
|
||||
|
||||
/* ********************************************************
|
||||
* 동의여부 체크
|
||||
******************************************************** */
|
||||
const agree_yn_check = function (){
|
||||
const agree_text = "";
|
||||
if($("input[name='agree_yn']").attr("checked")){
|
||||
agree_text= "위 내용에 대하여 {=date('Y년m월d일 H시i분s초')}에 {managerInfo.mname}({managerInfo.manager_id})께서 동의하셨습니다.";
|
||||
$("#agree_text").show();
|
||||
}else{
|
||||
$("#agree_text").hide();
|
||||
}
|
||||
|
||||
$("#agree_text").html(agree_text);
|
||||
}
|
||||
|
||||
/***********************************************************
|
||||
* 미리보기
|
||||
* *********************************************************/
|
||||
const fn_preview = function() {
|
||||
//keyup 이벤트
|
||||
$("#cn, #head, #tail").keyup(function() {
|
||||
const str = $("#head").val() + '\n\n' + $("#cn").val() + '\n\n' + $("#tail").val();
|
||||
$("#previewCn").html(str);
|
||||
});
|
||||
|
||||
//change 이벤트
|
||||
$("#cn, #head, #tail").on("change", function() {
|
||||
const str = $("#head").val() + '\n\n' + $("#cn").val() + '\n\n' + $("#tail").val();
|
||||
$("#previewCn").html(str);
|
||||
});
|
||||
}
|
||||
|
||||
/* ********************************************************
|
||||
* 모달 이벤트 시작
|
||||
******************************************************** */
|
||||
|
||||
/**************************************************************
|
||||
* 바이트 수 체크
|
||||
****************************************************************/
|
||||
const fn_count_btye_show = function() {
|
||||
let numberArr = [];
|
||||
|
||||
$(".sms-manage .textarea").each(function() {
|
||||
const msgStr = $(this).val();
|
||||
const msgStrLen = msgStr.length;
|
||||
let rbyte = 0;
|
||||
let rlen = 0;
|
||||
let one_char = "";
|
||||
|
||||
for (let i = 0; i < msgStrLen; i++) {
|
||||
one_char = msgStr.charAt(i);
|
||||
if (escape(one_char).length > 4) {
|
||||
//한글3Byte
|
||||
rbyte += 3;
|
||||
} else {
|
||||
//영문 등 나머지 1Byte
|
||||
rbyte++;
|
||||
}
|
||||
|
||||
}
|
||||
numberArr.push(rbyte);
|
||||
})
|
||||
|
||||
$(".number").each(function(){
|
||||
$(this).text(numberArr.shift());
|
||||
|
||||
})
|
||||
|
||||
|
||||
}
|
||||
|
||||
/* ********************************************************
|
||||
* 자주쓰는 메시지 조회
|
||||
******************************************************** */
|
||||
const fn_select_album = function(category) {
|
||||
|
||||
if(category == undefined) {
|
||||
category = "";
|
||||
}
|
||||
|
||||
$.ajax({
|
||||
type: "post",
|
||||
url: "<c:url value='/mngr/ntcn/mssage/selectRegistMssagePopup'/>",
|
||||
data: { category },
|
||||
success:function(data) {
|
||||
const tabBox = $(data).find(".tab-box");
|
||||
const templateList = $(data).find(".template-message__container");
|
||||
$(".tab-box").html(tabBox.html());
|
||||
$(".template-message__container").html(templateList.html());
|
||||
fn_count_btye_show();
|
||||
$(".tab-box__btn").removeClass("current");
|
||||
$(".tab-box__btn").each(function(){
|
||||
if($(this).text().trim() === category) {
|
||||
$(this).addClass("current");
|
||||
}
|
||||
})
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
</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" onclick="fn_sndng_sms()">발송하기</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()">메시지 발송 내역</button>
|
||||
</div>
|
||||
<div class="content-tab__content active" id="selectSndng">
|
||||
<%--메시지 수동 발송--%>
|
||||
</div>
|
||||
<div class="content-tab__content" id="selectListInqireForm">
|
||||
<%--메시지 발송 내역--%>
|
||||
</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>
|
||||
<!-- 메세지 수동 발송 - sms 불러오기 팝업 -->
|
||||
<div id="registMssagePopupDiv"></div>
|
||||
<!-- 메세지 수동 발송 - sms 불러오기 - sms 추가 팝업 -->
|
||||
<div id="mssageAditPopupDiv"></div>
|
||||
<!-- 메세지 발송 내역 - 상세 조회 팝업 -->
|
||||
<div id="mssagePassivSndngDtlPopupDiv"></div>
|
||||
<!--이미지 첨부 -->
|
||||
<div id="mssagePassivSndngImgPopupDiv"></div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,472 @@
|
||||
<%@ 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 : MssageSndngPopupC.jsp
|
||||
Description : 메시지 발송 관리 팝업
|
||||
Modification Information
|
||||
|
||||
수정일 수정자 수정내용
|
||||
------- -------- ---------------------------
|
||||
2024-04-24 이운산 최초 생성
|
||||
--%>
|
||||
<!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 () {
|
||||
|
||||
fn_preview();
|
||||
fn_select_Sndng();
|
||||
|
||||
//특수문자 버튼
|
||||
$("#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'));
|
||||
});
|
||||
|
||||
//팝업 윈도우 사이드바 공백 제거 처리
|
||||
$(".content").css({
|
||||
"padding-left":"0px"
|
||||
})
|
||||
|
||||
});
|
||||
|
||||
/* ********************************************************
|
||||
* 메시지 수동 발송 TAB
|
||||
******************************************************** */
|
||||
const fn_select_Sndng = function () {
|
||||
|
||||
$.ajax({
|
||||
type: 'post',
|
||||
url: '/mngr/ntcn/mssage/selectMssagePassivSndng',
|
||||
success: function (resultHtml) {
|
||||
$("#selectListInqireFormBtn").removeClass("active");
|
||||
$("#selectListInqireForm").removeClass("active");
|
||||
$(".page-title__btn-container").show();
|
||||
$("#selectSndngBtn").addClass("active");
|
||||
$("#selectSndng").addClass("active");
|
||||
$('#selectSndng').html(resultHtml);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/* ********************************************************
|
||||
* 메시지 발송 내역 TAB
|
||||
******************************************************** */
|
||||
const fn_select_listForm = function () {
|
||||
|
||||
$.ajax({
|
||||
type: 'post',
|
||||
url: '/mngr/ntcn/mssage/selectMssagePassivSndngListInqireRForm',
|
||||
success: function (resultHtml) {
|
||||
$("#selectSndngBtn").removeClass("active");
|
||||
$("#selectSndng").removeClass("active");
|
||||
$(".page-title__btn-container").hide();
|
||||
$("#selectListInqireFormBtn").addClass("active");
|
||||
$("#selectListInqireForm").addClass("active");
|
||||
$('#selectListInqireForm').html(resultHtml);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/* ********************************************************
|
||||
* 메시지 발송 내역 TAB _ 리스트 조회
|
||||
******************************************************** */
|
||||
const fn_select_list_mssage = 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){
|
||||
dataStr = $('#listForm').serialize() + '&pageIndex='+pageIndex +'&pageUnit='+pageUnit;
|
||||
} else {
|
||||
dataStr = $('#listForm').serialize() + '&pageIndex='+pageIndex;
|
||||
}
|
||||
}
|
||||
|
||||
$.ajax({
|
||||
type: "post",
|
||||
url : "<c:url value="/mngr/ntcn/mssage/selectMssagePassivSndngListInqire"/>",
|
||||
data : dataStr,
|
||||
success:function(resultHtml) {
|
||||
$('#pageDiv').html(resultHtml);
|
||||
$('#pageUnit').niceSelect();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
const isEmptyObject = function (obj) {
|
||||
// null인지 먼저 체크
|
||||
if (obj === null || obj === undefined) {
|
||||
return true;
|
||||
}
|
||||
// 비어있는 객체인지 확인
|
||||
return Object.keys(obj).length === 0;
|
||||
}
|
||||
|
||||
|
||||
/* ********************************************************
|
||||
* 메시지 발송
|
||||
******************************************************** */
|
||||
const fn_sndng_sms = function() {
|
||||
|
||||
let to_arr = [];
|
||||
let name_arr = [];
|
||||
let recptnTrgtList = [];
|
||||
const directDiv = $("#directDiv");
|
||||
directDiv.children("div").each(function (){
|
||||
const line = $(this).text();
|
||||
const parts = line.trim().split(' ');
|
||||
|
||||
let item = {
|
||||
recptnNb : parts[1] || '',
|
||||
mbrNm : parts[2] || '',
|
||||
// mbrInnb : mbrInnb,
|
||||
// mbrDvCd : mbrDvCd
|
||||
}
|
||||
recptnTrgtList.push(item);
|
||||
});
|
||||
|
||||
|
||||
if(recptnTrgtList.length == 0) {
|
||||
alert("발송 대상이 지정되지 않았습니다.");
|
||||
return false;
|
||||
}
|
||||
|
||||
if($("#cn").val() == "") {
|
||||
alert("내용을 입력해 주세요.")
|
||||
return false;
|
||||
}
|
||||
|
||||
if($("[name=sndngDtDv]:checked").val() == null) {
|
||||
alert("발송시간을 설정해주세요.");
|
||||
return false;
|
||||
}
|
||||
|
||||
const now = new Date();
|
||||
|
||||
const currentHour = now.getHours();
|
||||
const currentMinute = now.getMinutes();
|
||||
//현재 시간
|
||||
const currentTme = (currentHour < 10 ? '0' : '') + currentHour
|
||||
+ (currentMinute < 10 ? '0' : '') + currentMinute;
|
||||
|
||||
//발송 가능 시간
|
||||
const bgntme = $("#smsAtmcSndngLmttBgntme").val()
|
||||
const endtme = $("#smsAtmcSndngLmttEndtme").val()
|
||||
|
||||
const bgntmeNum = parseInt(bgntme, 10)
|
||||
const endtmeNum = parseInt(endtme, 10);
|
||||
|
||||
if($("#resve").is(":checked")) {
|
||||
|
||||
const resveHour = $("#resveHour").val();
|
||||
const resveMinute = $("#resveMinute").val();
|
||||
//예약시간
|
||||
const resveTme = (resveHour < 10 ? '0' : '') + resveHour
|
||||
+ resveMinute;
|
||||
|
||||
const resveTmeNum = parseInt(resveTme, 10);
|
||||
|
||||
if(resveTmeNum >= bgntmeNum && resveTmeNum <= endtmeNum) {
|
||||
} else {
|
||||
alert("발송 시간이 아닙니다.");
|
||||
return false;
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
const currentTmeNum = parseInt(currentTme, 10);
|
||||
|
||||
if(currentTmeNum >= bgntmeNum && currentTmeNum <= endtmeNum) {
|
||||
} else {
|
||||
alert("발송 시간이 아닙니다.");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
let formData = $("#passiveMssageSndngForm").serializeArray();
|
||||
|
||||
let filteredForm;
|
||||
//즉시 발송인 경우 예약날짜 제거
|
||||
if($("[name=sndngDtDv]:checked").val() == "imdtl") {
|
||||
filteredForm = formData.filter(item => item.name !== "resveDt");
|
||||
} else {
|
||||
filteredForm = formData;
|
||||
}
|
||||
|
||||
$.each(filteredForm, function(index, item){
|
||||
if(item.name === 'resveDt') {
|
||||
const resveDate = $("#datepicker_1").val();
|
||||
const resveHour = $("#resveHour").val();
|
||||
const resveMin = $("#resveMinute").val();
|
||||
$("#resveDt").val(resveDate + " " + resveHour + ":" + resveMin + ":00");
|
||||
const date = new Date($("#resveDt").val());
|
||||
item.value = date;
|
||||
}
|
||||
})
|
||||
|
||||
filteredForm.push({name:'recptnTrgtList', value: JSON.stringify(recptnTrgtList)})
|
||||
const dataStr = $.param(filteredForm);
|
||||
|
||||
$.ajax({
|
||||
type: "post",
|
||||
url : "<c:url value="/mngr/ntcn/mssage/insertMssageSndng"/>",
|
||||
data : dataStr,
|
||||
success:function(data) {
|
||||
const str = JSON.parse(data.resBody.result);
|
||||
const smsRslt = isEmptyObject(str.messageRslt);
|
||||
const sureRlst = isEmptyObject(str.messageSureInsert);
|
||||
const lotteRlst = isEmptyObject(str.mssageLotteInsert);
|
||||
//발송, 대상 등록 실패시
|
||||
if(!smsRslt && str.messageRslt.status == "1") {
|
||||
alert('<spring:message code="fail.common.insert"/>');
|
||||
return false;
|
||||
}
|
||||
|
||||
if(!sureRlst) {
|
||||
//슈어 등록 실패시
|
||||
if(str.messageSureInsert.status == "1") {
|
||||
alert('<spring:message code="fail.common.insert"/>');
|
||||
return false;
|
||||
} else {
|
||||
//슈어 등록 성공시
|
||||
alert('<spring:message code="success.common.insert"/>');
|
||||
}
|
||||
}
|
||||
|
||||
if(!lotteRlst > 0) {
|
||||
//롯데 등록 실패시
|
||||
if(str.mssageLotteInsert.status == "1") {
|
||||
alert('<spring:message code="fail.common.insert"/>');
|
||||
return false;
|
||||
} else {
|
||||
//롯데 등록 성공시
|
||||
alert('<spring:message code="success.common.insert"/>');
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
/* ********************************************************
|
||||
* 직접 수신번호 입력
|
||||
******************************************************** */
|
||||
const fn_add_num = function() {
|
||||
const to = $("#inputTo").val();
|
||||
const name = $("#inputName").val();
|
||||
|
||||
if(to == "") {
|
||||
return af("추가하실 휴대전화번호를 입력하세요.", $("#inputTo"));
|
||||
}
|
||||
|
||||
if(get_str_to(to) == "") {
|
||||
return af("휴대전화번호가 올바르지 않습니다.", $(".input_to"));
|
||||
}
|
||||
|
||||
if(name == "") {
|
||||
return af("추가하실 이름을 입력하세요.", $("#inputName"));
|
||||
}
|
||||
|
||||
let hp_list = [];
|
||||
|
||||
$("#div_to_list li").each(function () {
|
||||
const to_seq = $(this).attr("to_seq");
|
||||
|
||||
const r_to = $(this).find(".str_to").text();
|
||||
const r_name = $(this).find(".str_name").text();
|
||||
hp_list.push(r_to);
|
||||
});
|
||||
|
||||
add_to({r_useq:'', r_to:to, r_name:name}, hp_list,"N");
|
||||
|
||||
$("#inputTo").val("").focus();
|
||||
$("#inputName").val("");
|
||||
reset_to_list();
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************
|
||||
* 미리보기
|
||||
* *********************************************************/
|
||||
const fn_preview = function() {
|
||||
//keyup 이벤트
|
||||
$("#cn, #head, #tail").keyup(function() {
|
||||
const str = $("#head").val() + '\n\n' + $("#cn").val() + '\n\n' + $("#tail").val();
|
||||
$("#previewCn").html(str);
|
||||
});
|
||||
|
||||
//change 이벤트
|
||||
$("#cn, #head, #tail").on("change", function() {
|
||||
const str = $("#head").val() + '\n\n' + $("#cn").val() + '\n\n' + $("#tail").val();
|
||||
$("#previewCn").html(str);
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
/***********************************************************
|
||||
* 추가 팝업 닫기
|
||||
* *********************************************************/
|
||||
|
||||
/* ********************************************************
|
||||
* 모달 이벤트 시작
|
||||
******************************************************** */
|
||||
|
||||
/**************************************************************
|
||||
* 바이트 수 체크
|
||||
****************************************************************/
|
||||
const fn_count_btye_show = function() {
|
||||
let numberArr = [];
|
||||
|
||||
$(".sms-manage .textarea").each(function() {
|
||||
const msgStr = $(this).val();
|
||||
const msgStrLen = msgStr.length;
|
||||
let rbyte = 0;
|
||||
let rlen = 0;
|
||||
let one_char = "";
|
||||
|
||||
for (let i = 0; i < msgStrLen; i++) {
|
||||
one_char = msgStr.charAt(i);
|
||||
if (escape(one_char).length > 4) {
|
||||
//한글3Byte
|
||||
rbyte += 3;
|
||||
} else {
|
||||
//영문 등 나머지 1Byte
|
||||
rbyte++;
|
||||
}
|
||||
}
|
||||
numberArr.push(rbyte);
|
||||
})
|
||||
|
||||
$(".number").each(function(){
|
||||
$(this).text(numberArr.shift());
|
||||
})
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
/* ********************************************************
|
||||
* 자주쓰는 메시지 조회
|
||||
******************************************************** */
|
||||
const fn_select_album = function(category) {
|
||||
|
||||
if(category == undefined) {
|
||||
category = "공통";
|
||||
}
|
||||
|
||||
$.ajax({
|
||||
type: "post",
|
||||
url: "<c:url value='/mngr/ntcn/mssage/selectRegistMssagePopup'/>",
|
||||
data: { category },
|
||||
success:function(data) {
|
||||
const tabBox = $(data).find(".tab-box");
|
||||
const templateList = $(data).find(".template-message__container");
|
||||
$(".tab-box").html(tabBox.html());
|
||||
$(".template-message__container").html(templateList.html());
|
||||
fn_count_btye_show();
|
||||
$(".tab-box__btn").removeClass("current");
|
||||
$(".tab-box__btn").each(function(){
|
||||
if($(this).text().trim() === category) {
|
||||
$(this).addClass("current");
|
||||
}
|
||||
})
|
||||
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
</script>
|
||||
<body>
|
||||
<main class="main">
|
||||
<div class="content">
|
||||
<div class="content__inner">
|
||||
<div class="page-title">
|
||||
<h2 class="page-title__title">메시지 발송 관리</h2>
|
||||
<div class="page-title__btn-container">
|
||||
<button class="btn primary" type="button" id="sndngBtn" onclick="fn_sndng_sms()">발송하기</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()">메시지 발송 내역</button>
|
||||
</div>
|
||||
<div class="content-tab__content active" id="selectSndng">
|
||||
<%--메시지 수동 발송--%>
|
||||
</div>
|
||||
<div class="content-tab__content" id="selectListInqireForm">
|
||||
<%--메시지 발송 내역--%>
|
||||
</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>
|
||||
<!-- 메세지 수동 발송 - sms 불러오기 팝업 -->
|
||||
<div id="registMssagePopupDiv"></div>
|
||||
<!-- 메세지 수동 발송 - sms 불러오기 - sms 추가 팝업 -->
|
||||
<div id="mssageAditPopupDiv"></div>
|
||||
<!-- 메세지 발송 내역 - 상세 조회 팝업 -->
|
||||
<div id="mssagePassivSndngDtlPopupDiv"></div>
|
||||
<!--이미지 첨부 -->
|
||||
<div id="mssagePassivSndngImgPopupDiv"></div>
|
||||
</body>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,93 @@
|
||||
<%@ 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 : MssageStlR.jsp
|
||||
Description : 문자 정산 페이지
|
||||
Modification Information
|
||||
|
||||
수정일 수정자 수정내용
|
||||
------- -------- ---------------------------
|
||||
2024-05-10 이운산 최초 생성
|
||||
--%>
|
||||
<script>
|
||||
$(document).ready(function () {
|
||||
}
|
||||
</script>
|
||||
<section class="content-section">
|
||||
<hr class="spacing">
|
||||
<div class="table-wrapper">
|
||||
<table class="table vertical tight">
|
||||
<caption>해당 테이블에 대한 설명</caption>
|
||||
<!-- 각 열 width 설정 -->
|
||||
<colgroup>
|
||||
<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>SMS(단문)</th>
|
||||
<th>LMS(장문)</th>
|
||||
<th>MMS(LMS+IMG)</th>
|
||||
<th>알림톡</th>
|
||||
<th>친구톡(TXT)</th>
|
||||
<th>친구톡(TXT+IMG)</th>
|
||||
<th>금액</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody id="basicTab">
|
||||
<c:if test="${!empty resultMap.stlResult.stlList}">
|
||||
<c:forEach var="suremStl" items="${resultMap.stlResult.stlList }" varStatus="status">
|
||||
<tr>
|
||||
<td>
|
||||
</td>
|
||||
<td>
|
||||
</td>
|
||||
<td>
|
||||
</td>
|
||||
<td>
|
||||
</td>
|
||||
<td>
|
||||
</td>
|
||||
</tr>
|
||||
</c:forEach>
|
||||
<tr>
|
||||
<td colspan="3">합계</td>
|
||||
<td><c:out value="${resultMap.stlResult.sumSms }"/></td>
|
||||
<td><c:out value="${resultMap.stlResult.sumLms }"/></td>
|
||||
<td><c:out value="${resultMap.stlResult.sumMms }"/></td>
|
||||
<td><c:out value="${resultMap.stlResult.sumAt }"/></td>
|
||||
<td><c:out value="${resultMap.stlResult.sumFt }"/></td>
|
||||
<td><c:out value="${resultMap.stlResult.sumFti }"/></td>
|
||||
<td><c:out value="${resultMap.stlResult.sumCost }"/></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="3">요금합계</td>
|
||||
<td><c:out value="${resultMap.stlResult.sumCost }"/></td>
|
||||
<td><c:out value="${resultMap.stlResult.vat }"/></td>
|
||||
<td><c:out value="${resultMap.stlResult.totalCost }"/></td>
|
||||
</tr>
|
||||
</c:if>
|
||||
<c:if test="${empty resultMap.stlResult.stlList }">
|
||||
<tr>
|
||||
<td class="row-no-data" colspan="10">조회된 데이터가 없습니다.</td>
|
||||
</tr>
|
||||
</c:if>
|
||||
</table>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
@@ -0,0 +1,251 @@
|
||||
<%@ 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 : MssageStlListInqireRForm.jsp
|
||||
Description : 정산 내역 폼
|
||||
Modification Information
|
||||
|
||||
수정일 수정자 수정내용
|
||||
------- -------- ---------------------------
|
||||
2024-07-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 fn_select_stl_list = function(pageIndex, pageUnit) {
|
||||
let dataStr = null;
|
||||
console.log(pageIndex);
|
||||
if(!pageIndex || pageIndex === '') {
|
||||
$('#pageIndex').val(1);
|
||||
} else {
|
||||
$('#pageIndex').val(pageIndex);
|
||||
}
|
||||
pageUnit = $("#pageUnit").val();
|
||||
console.log(pageUnit);
|
||||
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/mssage/selectMssageStlListInqire"/>",
|
||||
data : dataStr,
|
||||
success:function(resultHtml) {
|
||||
$('#pageDiv').html(resultHtml);
|
||||
$('#pageUnit').niceSelect();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
let pageIndex = '<c:out value="${ resultMap.pageIndex }"/>';
|
||||
let pageUnit = '<c:out value="${ resultMap.pageUnit }"/>';
|
||||
fn_select_stl_list(pageIndex, pageUnit);
|
||||
fn_set_dateRange_function('.dateRange-btnContainer', 'srchStrtSndngDt','srchEndSndngDt');
|
||||
|
||||
//검색 조건 종류 항목 체크 여부에 따른 체크 해제
|
||||
$(".kindChk").on("click",function(){
|
||||
fn_ctr_pCheckbox("#kindChkAll",".kindChk");
|
||||
});
|
||||
//검색 조건 상태 항목 체크 여부에 따른 체크 해제
|
||||
$(".sttusChk").on("click",function(){
|
||||
fn_ctr_pCheckbox("#sttusChkAll",".sttusChk");
|
||||
});
|
||||
|
||||
/**********************
|
||||
* 엔터 키 입력 처리
|
||||
***********************/
|
||||
$("input").keydown(function(event) {
|
||||
if(event.key === "Enter" || event.keyCode === 13) {
|
||||
event.preventDefault();
|
||||
fn_select_list_mssage(1);
|
||||
}
|
||||
})
|
||||
});
|
||||
</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>
|
||||
<section class="content-section" id="search-section">
|
||||
<h3 class="content-section__title">메시지 정산</h3>
|
||||
<form id="listForm">
|
||||
<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 colspan="3">
|
||||
<div class="td-inner">
|
||||
<div class="select-box">
|
||||
<select title="검색내용조건" id="srchType" name="srchType">
|
||||
<!-- <select title="검색내용조건" id="srchNbDv" name="srchNbDv"> -->
|
||||
<option value="cn">발송 내용
|
||||
</option>
|
||||
<option value="recpntNb">수신 번호
|
||||
</option>
|
||||
<option value="sndngNb">회신 번호
|
||||
</option>
|
||||
<option value="cstmrIdnb">수신자명
|
||||
</option>
|
||||
</select>
|
||||
</div>
|
||||
<input class="input-text xl" type="text" title="검색어" id="srchStr" name="srchStr">
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>조회 기간</th>
|
||||
<td colspan="3">
|
||||
<div class="td-inner">
|
||||
<div class="select-box">
|
||||
<select title="조회기간조건" name="srchDtDv" id="srchDtDv">
|
||||
<option value="sndngDt">발송일
|
||||
</option>
|
||||
<option value="registDt">등록일
|
||||
</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="input-container">
|
||||
<input type="text" id="srchStrtSndngDt" name="srchStrtSndngDt" class="datepicker"
|
||||
title="시작 날짜 선택" autocomplete="off">
|
||||
<span class="tilde">~</span>
|
||||
<input type="text" id="srchEndSndngDt" name="srchEndSndngDt" class="datepicker"
|
||||
title="종료 날짜 선택" autocomplete="off">
|
||||
</div>
|
||||
<div class="dateRange-btnContainer">
|
||||
<button class="dateRange-btn" id="yesterday">어제</button>
|
||||
<button class="dateRange-btn" id="today" >오늘</button>
|
||||
<button class="dateRange-btn" id="threeDays">3일간</button>
|
||||
<button class="dateRange-btn" id="sevenDays">일주일</button>
|
||||
<button class="dateRange-btn" id="oneMonth" >1개월</button>
|
||||
<button class="dateRange-btn" id="threeMonth">3개월</button>
|
||||
<button class="dateRange-btn" id="sixMonth">6개월</button>
|
||||
<button class="dateRange-btn" id="year">1년</button>
|
||||
<button class="dateRange-btn" id="allDays">전체</button>
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>종류</th>
|
||||
<td>
|
||||
<div class="td-inner">
|
||||
<div class="b-checkbox-container">
|
||||
<label class="b-checkbox checkbox check-all">
|
||||
<input type="checkbox" value="" id = "kindChkAll">
|
||||
<span class="check"></span>
|
||||
<span class="control-label">전체</span>
|
||||
</label>
|
||||
<label class="b-checkbox checkbox">
|
||||
<input type="checkbox" value="SMS" class = "kindChk" name="srchDv">
|
||||
<span class="check"></span>
|
||||
<span class="control-label">SMS</span>
|
||||
</label>
|
||||
<label class="b-checkbox checkbox">
|
||||
<input type="checkbox" value="LMS" class = "kindChk" name="srchDv">
|
||||
<span class="check"></span>
|
||||
<span class="control-label">LMS/MMS</span>
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
<th>발송상태</th>
|
||||
<td>
|
||||
<div class="td-inner">
|
||||
<div class="b-checkbox-container">
|
||||
<label class="b-checkbox checkbox check-all">
|
||||
<input type="checkbox" value="" id = "sttusChkAll">
|
||||
<span class="check"></span>
|
||||
<span class="control-label">전체</span>
|
||||
</label>
|
||||
<label class="b-checkbox checkbox">
|
||||
<input type="checkbox" class="sttusChk" name="srchSttus" value="OK">
|
||||
<span class="check"></span>
|
||||
<span class="control-label">성공</span>
|
||||
</label>
|
||||
<label class="b-checkbox checkbox">
|
||||
<input type="checkbox" class="sttusChk" name="srchSttus" value="FAIL">
|
||||
<span class="check"></span>
|
||||
<span class="control-label">실패</span>
|
||||
</label>
|
||||
<label class="b-checkbox checkbox">
|
||||
<input type="checkbox" class="sttusChk" name="srchSttus" value="REG">
|
||||
<span class="check"></span>
|
||||
<span class="control-label">등록</span>
|
||||
</label>
|
||||
<label class="b-checkbox checkbox">
|
||||
<input type="checkbox" class="sttusChk" name="srchSttus" value="WAIT">
|
||||
<span class="check"></span>
|
||||
<span class="control-label">대기</span>
|
||||
</label>
|
||||
<label class="b-checkbox checkbox">
|
||||
<input type="checkbox" class="sttusChk" name="srchSttus" value="SEND">
|
||||
<span class="check"></span>
|
||||
<span class="control-label">전송</span>
|
||||
</label>
|
||||
<label class="b-checkbox checkbox">
|
||||
<input type="checkbox" class="sttusChk" name="srchSttus" value="BAD">
|
||||
<span class="check"></span>
|
||||
<span class="control-label">불량</span>
|
||||
</label>
|
||||
</div>
|
||||
</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_stl_list(1); return false;">검색</button>
|
||||
</div>
|
||||
<div class="right"></div>
|
||||
</div>
|
||||
</section>
|
||||
<div id="pageDiv">
|
||||
</div>
|
||||
</form>
|
||||
<button class="scroll-to-top"><span class="visually-hidden">위로가기</span></button>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
@@ -0,0 +1,281 @@
|
||||
<%@ 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 : RegistMssagePopupR.jsp
|
||||
Description : SMS 불러오기 팝업
|
||||
Modification Information
|
||||
|
||||
수정일 수정자 수정내용
|
||||
------- -------- ---------------------------
|
||||
2024.04.04 이운산 최초 생성
|
||||
--%>
|
||||
<script>
|
||||
|
||||
$(document).ready(function() {
|
||||
const tabBoxBtn = $(".tab-box__btn");
|
||||
tabBoxBtn.eq(0).addClass("current");
|
||||
const firstBtn = tabBoxBtn.eq(0).text().trim()
|
||||
fn_select_album(firstBtn);
|
||||
|
||||
/**************************************************************
|
||||
* 단일 바이트 수 체크
|
||||
****************************************************************/
|
||||
const fn_count_byte_one = function(msgStr){
|
||||
let number = 0;
|
||||
const msgStrLen = msgStr.length;
|
||||
let rbyte = 0;
|
||||
let rlen = 0;
|
||||
let one_char = "";
|
||||
|
||||
for (let i = 0; i < msgStrLen; i++) {
|
||||
one_char = msgStr.charAt(i);
|
||||
if (escape(one_char).length > 4) {
|
||||
//한글3Byte
|
||||
rbyte += 3;
|
||||
} else {
|
||||
//영문 등 나머지 1Byte
|
||||
rbyte++;
|
||||
}
|
||||
|
||||
}
|
||||
//numberArr.push(rbyte);
|
||||
|
||||
return rbyte;
|
||||
}
|
||||
|
||||
|
||||
/**************************************************************
|
||||
* 선택 메시지 내용 모달 -> 본화면
|
||||
****************************************************************/
|
||||
let textStr = null;
|
||||
|
||||
$(".template-message__container").on("focus", ".textarea", function(){
|
||||
textStr =$(this).select();
|
||||
})
|
||||
|
||||
$("#applyBtn").on("click", function(){
|
||||
if(textStr == null) {
|
||||
alert("메시지가 선택되지 않았습니다.")
|
||||
} else {
|
||||
$("#cn").val(textStr.text());
|
||||
fn_close_modal("registMssagePopup")
|
||||
}
|
||||
})
|
||||
|
||||
/**************************************************************
|
||||
* 텍스트 바이트 계산
|
||||
****************************************************************/
|
||||
$(".template-message__container").on("focus", ".textarea", function(){
|
||||
$(this).on("keyup", function(){
|
||||
let byteNum = fn_count_byte_one($(this).val());
|
||||
$(this).next("div").find(".number").text(byteNum);
|
||||
})
|
||||
})
|
||||
|
||||
/**************************************************************
|
||||
* 검색하기
|
||||
****************************************************************/
|
||||
// 공통 검색 처리
|
||||
const srchAlbum = function(){
|
||||
const msg = $("#srchStr").val();
|
||||
|
||||
if(msg === '') {
|
||||
const tabBoxBtn = $(".tab-box__btn");
|
||||
const firstBtn = tabBoxBtn.eq(0).text().trim()
|
||||
fn_select_album(firstBtn);
|
||||
return false;
|
||||
}
|
||||
|
||||
$.ajax({
|
||||
type: "post",
|
||||
url: "<c:url value='/mngr/ntcn/mssage/selectRegistMssagePopup'/>",
|
||||
data: { msg },
|
||||
success:function(data) {
|
||||
|
||||
const templateList = $(data).find(".template-message__container");
|
||||
$(".template-message__container").html(templateList.html());
|
||||
fn_count_btye_show();
|
||||
$(".tab-box__btn").removeClass("current")
|
||||
}
|
||||
})
|
||||
|
||||
}
|
||||
|
||||
|
||||
$("#srchBtn").on("click", function(){
|
||||
srchAlbum();
|
||||
})
|
||||
|
||||
|
||||
/**********************
|
||||
* 검색 엔터 키 입력 처리
|
||||
***********************/
|
||||
$("#srchStr").keydown(function(event) {
|
||||
if(event.key === "Enter" || event.keyCode === 13) {
|
||||
event.preventDefault();
|
||||
srchAlbum();
|
||||
}
|
||||
})
|
||||
|
||||
|
||||
/**********************
|
||||
* 탭 ui
|
||||
***********************/
|
||||
const tab_Box = $(".tab-box");
|
||||
const tab_BoxBtn = $(".tab-box__btn");
|
||||
|
||||
|
||||
tab_Box.on("click", ".tab-box__btn", function (e) {
|
||||
e.preventDefault();
|
||||
const index = $(this).index();
|
||||
$(this).closest(tab_Box).find(tab_BoxBtn).removeClass("current");
|
||||
$(this).addClass("current");
|
||||
let category = $(this).text().trim();
|
||||
fn_select_album(category);
|
||||
});
|
||||
|
||||
/**************************************************************
|
||||
* 자주쓰는 메시지 삭제
|
||||
****************************************************************/
|
||||
$(".template-message__container").on("click" , "[name=delBtn]", function(){
|
||||
const target = $(event.target);
|
||||
const btn = target;
|
||||
const btnCon = btn.closest('.template-message__footer');
|
||||
const textBody = btnCon.siblings('.template-message__body');
|
||||
const smsAlbumInnb = textBody.find("[name=smsAlbumInnb]").val();
|
||||
const currentTabTxt = $(".tab-box__btn.current").text().trim();
|
||||
|
||||
$.ajax({
|
||||
type: "post",
|
||||
url: "<c:url value='/mngr/ntcn/mssage/deleteMssageAdit'/>",
|
||||
data: { smsAlbumInnb },
|
||||
success:function(data) {
|
||||
const str = JSON.parse(data.resBody.result);
|
||||
if(str.result == "success") {
|
||||
alert('<spring:message code="success.common.delete"/>');
|
||||
const remainMsgCnt = $(".template-message__container").find(".template-message").length;
|
||||
let tabTxt = null;
|
||||
//삭제 시 남아있던 메시지가 1개였을 경우
|
||||
if(remainMsgCnt == 1) {
|
||||
$(".tab-box__btn.current").remove();
|
||||
tabTxt = "공통";
|
||||
} else {
|
||||
tabTxt = currentTabTxt;
|
||||
}
|
||||
|
||||
fn_select_album(tabTxt);
|
||||
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
})
|
||||
|
||||
});
|
||||
|
||||
|
||||
/**************************************************************
|
||||
* 자주쓰는 메시지 수정
|
||||
****************************************************************/
|
||||
$(".template-message__container").on("click" , "[name=updtBtn]", function(){
|
||||
const target = $(event.target);
|
||||
const btn = target;
|
||||
const btnCon = btn.closest('.template-message__footer');
|
||||
const textBody = btnCon.siblings('.template-message__body');
|
||||
const smsAlbumInnb = textBody.find("[name=smsAlbumInnb]").val();
|
||||
const msg = textBody.find('.textarea').val();
|
||||
|
||||
$.ajax({
|
||||
type: "post",
|
||||
url: "<c:url value='/mngr/ntcn/mssage/updateMssageAditUpdt'/>",
|
||||
data: { smsAlbumInnb, msg },
|
||||
success:function(data) {
|
||||
const str = JSON.parse(data.resBody.result);
|
||||
if(str.result == "success") {
|
||||
alert('<spring:message code="success.common.update"/>');
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
})
|
||||
|
||||
|
||||
|
||||
</script>
|
||||
<div id="registMssagePopup" class="modal" style="max-width: 800px;">
|
||||
<div class="modal-header">
|
||||
<h4>SMS 불러오기</h4>
|
||||
</div>
|
||||
<div class="modal-content">
|
||||
<div class="form-control-container">
|
||||
<div class="left">
|
||||
<input class="input-text" type="text" title="검색어" id="srchStr" name="srchStr">
|
||||
<button class="btn xsm primary" type="button" id="srchBtn">검색하기</button>
|
||||
</div>
|
||||
<div class="center"></div>
|
||||
<div class="right">
|
||||
<button class="btn xsm primary" type="button" onclick="fn_open_modal('#mssageAditPopupDiv','#mssageAditPopup','<c:url value="/mngr/ntcn/mssage/selectMssageAditPopupForm"/>'); return false;">
|
||||
SMS 추가
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="tab-box mt-10">
|
||||
<c:forEach var="category" items="${resultMap.boCtrlMap.albumCtgyList}" varStatus="status">
|
||||
<button class="tab-box__btn" type="button">
|
||||
<c:out value="${category.category}"/>
|
||||
</button>
|
||||
</c:forEach>
|
||||
</div>
|
||||
<div class="tab-box__content">
|
||||
<div class="template-message__container">
|
||||
<c:if test="${!empty resultMap.boCtrlMap.registMssageList}">
|
||||
<c:forEach var="album" items="${resultMap.boCtrlMap.registMssageList}" varStatus="status">
|
||||
<div class="template-message">
|
||||
<!-- <div class="template-message__header">
|
||||
SMS 충전 안내
|
||||
<span class="btn gray ml-2 xxsm">알림톡 X</span>
|
||||
</div> -->
|
||||
<div class="template-message__body">
|
||||
<div class="sms-manage">
|
||||
<input type="hidden" name="smsAlbumInnb" value="${ album.smsAlbumInnb }">
|
||||
<textarea class="textarea" title="sms 입력" id="msg${ status.index }" name="msg"><c:out value="${album.msg}"/></textarea>
|
||||
<div class="sms-manage__byte">
|
||||
<span class="number">0</span>
|
||||
<span class="text">byte</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="template-message__footer">
|
||||
<div class="manage-btn-container">
|
||||
<button class="btn sm dark" type="button" name="updtBtn">
|
||||
수정
|
||||
</button>
|
||||
<button class="btn sm dark" type="button" name="delBtn">
|
||||
삭제
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</c:forEach>
|
||||
</c:if>
|
||||
<c:if test="${empty resultMap.boCtrlMap.registMssageList }">
|
||||
<p>조회된 데이터가 없습니다.</p>
|
||||
</c:if>
|
||||
</div>
|
||||
</div>
|
||||
<div class="table-wrapper">
|
||||
<div class="form-control-container mt-10">
|
||||
<div class="left"></div>
|
||||
<div class="center">
|
||||
<button class="btn primary" id="applyBtn" type="button">적용</button>
|
||||
</div>
|
||||
<div class="right"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -0,0 +1,726 @@
|
||||
<%@ 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 : AtmcSndngTmplatManage.jsp
|
||||
Description : 자동발송 템플릿 관리
|
||||
Modification Information
|
||||
|
||||
수정일 수정자 수정내용
|
||||
------- -------- ---------------------------
|
||||
2024-02-21 리브가 최초 생성
|
||||
2024-04-17 이대환 Email>Manage 분리
|
||||
--%>
|
||||
<!DOCTYPE html>
|
||||
<html lang="ko">
|
||||
<head>
|
||||
<%-- 공통 include --%>
|
||||
<%@include file ="/WEB-INF/views/comm/mngr/Include.jsp" %>
|
||||
<link rel="stylesheet" href="<c:url value='/daumeditor/css/editor.css'/>">
|
||||
<script src="<c:url value='/daumeditor/js/editor_loader.js?environment=development'/>"></script>
|
||||
</head>
|
||||
<script>
|
||||
//회원 검색 윈도우 팝업 화면중앙 열기
|
||||
/* function PopupCenter(url, title, w, h) {
|
||||
const dualScreenLeft = window.screenLeft != undefined ? window.screenLeft : screen.left;
|
||||
const dualScreenTop = window.screenTop != undefined ? window.screenTop : screen.top;
|
||||
|
||||
width = window.innerWidth ? window.innerWidth : document.documentElement.clientWidth ? document.documentElement.clientWidth : screen.width;
|
||||
height = window.innerHeight ? window.innerHeight : document.documentElement.clientHeight ? document.documentElement.clientHeight : screen.height;
|
||||
|
||||
const left = ((width / 2) - (w / 2)) + dualScreenLeft;
|
||||
const top = ((height / 2) - (h / 2)) + dualScreenTop;
|
||||
const newWindow = window.open(url, title, 'scrollbars=yes, width=' + w + ', height=' + h + ', top=' + top + ', left=' + left);
|
||||
|
||||
if (window.focus) {
|
||||
newWindow.focus();
|
||||
}
|
||||
} */
|
||||
|
||||
$(document).ready(function () {
|
||||
var urlParams = new URLSearchParams(window.location.search);
|
||||
|
||||
/* 자동발송관리 URL 파라미터 체크 */
|
||||
if (urlParams.has('emailChange')) {
|
||||
var paramValue = urlParams.get('emailChange');
|
||||
fn_select_EmailTmplatForm(paramValue);
|
||||
} else if (urlParams.has('mssageChange')) {
|
||||
var paramValue = urlParams.get('mssageChange');
|
||||
fn_select_MssageTmplatForm(paramValue);
|
||||
} else if (urlParams.has('ntcntalkChange')) {
|
||||
var paramValue = urlParams.get('ntcntalkChange');
|
||||
fn_select_NtcntalkTmplatForm(paramValue);
|
||||
} else {
|
||||
fn_select_EmailTmplatForm('FORM_DV_BBS&01');
|
||||
}
|
||||
|
||||
fn_swith_CommonSubModal();
|
||||
|
||||
$('form').on('keydown', function(e) {
|
||||
if (e.keyCode == 13) {
|
||||
e.preventDefault();
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
/* ********************************************************
|
||||
* 이메일 템플릿 목록 TAB
|
||||
******************************************************** */
|
||||
let emailfirst = 0;
|
||||
const fn_select_EmailTmplatForm = function (templatIndex) {
|
||||
$("#selectMssageTmplatBtn").removeClass("active");
|
||||
$("#selectNtcntalkTmplatBtn").removeClass("active");
|
||||
$("#selectMssageTmplat").removeClass("active");
|
||||
$("#selectNtcntalkTmplat").removeClass("active");
|
||||
|
||||
$("#selectEmailTmplatBtn").addClass("active");
|
||||
$("#selectEmailTmplat").addClass("active");
|
||||
|
||||
$("#tmpltUpdateBtn").css("display" ,"block");
|
||||
if(!emailfirst){
|
||||
fn_select_AtmcSndngTmplat(templatIndex);
|
||||
emailfirst = 1;
|
||||
}else{
|
||||
$('#formDvCd').val(templatIndex);
|
||||
fn_select_EmailTmplat(templatIndex);
|
||||
}
|
||||
}
|
||||
|
||||
/* ********************************************************
|
||||
* 메시지 템플릿 목록 TAB
|
||||
******************************************************** */
|
||||
const fn_select_MssageTmplatForm = function (templatDv) {
|
||||
$("#selectEmailTmplatBtn").removeClass("active");
|
||||
$("#selectNtcntalkTmplatBtn").removeClass("active");
|
||||
$("#selectEmailTmplat").removeClass("active");
|
||||
$("#selectNtcntalkTmplat").removeClass("active");
|
||||
|
||||
$("#selectMssageTmplatBtn").addClass("active");
|
||||
$("#selectMssageTmplat").addClass("active");
|
||||
|
||||
$("#tmpltUpdateBtn").css("display" ,"block");
|
||||
fn_select_AtmcSndngTmplat(templatDv);
|
||||
}
|
||||
|
||||
/* ********************************************************
|
||||
* 알림톡 템플릿 목록 TAB
|
||||
******************************************************** */
|
||||
const fn_select_NtcntalkTmplatForm = function (templatDv) {
|
||||
$("#selectEmailTmplatBtn").removeClass("active");
|
||||
$("#selectMssageTmplatBtn").removeClass("active");
|
||||
$("#selectEmailTmplat").removeClass("active");
|
||||
$("#selectMssageTmplat").removeClass("active");
|
||||
|
||||
$("#selectNtcntalkTmplatBtn").addClass("active");
|
||||
$("#selectNtcntalkTmplat").addClass("active");
|
||||
|
||||
$("#tmpltUpdateBtn").css("display" ,"none");
|
||||
fn_select_AtmcSndngTmplat(templatDv);
|
||||
}
|
||||
|
||||
/* ********************************************************
|
||||
* 자동발송 템플릿 목록 조회
|
||||
******************************************************** */
|
||||
const fn_select_AtmcSndngTmplat = function(templatIndex) {
|
||||
let dataStr;
|
||||
let url;
|
||||
let target;
|
||||
|
||||
$('#formDvCd').val(templatIndex);
|
||||
dataStr = $('#formDvCd').serialize();
|
||||
|
||||
if ($('#selectEmailTmplat').hasClass('active')) {
|
||||
//이메일 템플릿의 경우 단건 조회
|
||||
url = '/mngr/ntcn/tmplt/selectEmailAtmcSndngTmplatOneInqireForm';
|
||||
target = $('#selectEmailTmplat');
|
||||
} else if ($('#selectMssageTmplat').hasClass('active')) {
|
||||
url = '/mngr/ntcn/tmplt/selectMssageAtmcSndngTmplatInqireForm';
|
||||
target = $('#selectMssageTmplat');
|
||||
} else if ($('#selectNtcntalkTmplat').hasClass('active')) {
|
||||
url = '/mngr/ntcn/tmplt/selectNtcntalkAtmcSndngTmplatInqireForm';
|
||||
target = $('#selectNtcntalkTmplat');
|
||||
}
|
||||
|
||||
$.ajax({
|
||||
type: 'post',
|
||||
url : url,
|
||||
data: dataStr,
|
||||
success : function (resultHtml) {
|
||||
target.html(resultHtml);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**********************************************
|
||||
* 자동발송 템플릿 수정
|
||||
***********************************************/
|
||||
const fn_update_AtmcSndngTmplatForm = function(formId) {
|
||||
let confirmation;
|
||||
let url;
|
||||
let dataStr;
|
||||
let dataArr = [];
|
||||
let tmplatList = null;
|
||||
if ($('#selectEmailTmplat').hasClass('active')) {
|
||||
$("#emailCn").val(Editor.getContent());
|
||||
confirmation = confirm('이메일 자동 발송 템플릿을 <spring:message code="confirm.common.update"/>');
|
||||
url = '/mngr/ntcn/tmplt/updateEmailAtmcSndngTmplatUpdt';
|
||||
} else if ($('#selectMssageTmplat').hasClass('active')) {
|
||||
confirmation = confirm('메시지 자동 발송 템플릿을 <spring:message code="confirm.common.update"/>');
|
||||
url = '/mngr/ntcn/tmplt/updateMssageAtmcSndngTmplatUpdt';
|
||||
|
||||
$(".sms-manage").each(function () {
|
||||
let dataObj = {};
|
||||
$(this).find("input, .textarea").each(function(){
|
||||
const name = $(this).attr("name");
|
||||
const value = $(this).val();
|
||||
|
||||
if(name) {
|
||||
dataObj[name] = value;
|
||||
}
|
||||
|
||||
})
|
||||
dataArr.push(dataObj);
|
||||
})
|
||||
|
||||
|
||||
tmplatList = JSON.stringify(dataArr);
|
||||
|
||||
$("#tmplatList").val(tmplatList);
|
||||
} else if ($('#selectNtcntalkTmplat').hasClass('active')) {
|
||||
confirmation = confirm('알림톡 자동 발송 템플릿을 <spring:message code="confirm.common.update"/>');
|
||||
url = '/mngr/ntcn/tmplt/updateNtcntalkAtmcSndngTmplatUpdt';
|
||||
|
||||
$("#ntcntalkPopup").each(function () {
|
||||
let dataObj = {};
|
||||
$(this).find("input, .textarea, select").each(function(){
|
||||
const name = $(this).attr("name");
|
||||
const value = $(this).val();
|
||||
|
||||
if(name) {
|
||||
dataObj[name] = value;
|
||||
}
|
||||
|
||||
})
|
||||
dataArr.push(dataObj);
|
||||
})
|
||||
|
||||
|
||||
tmplatList = JSON.stringify(dataArr);
|
||||
$("#ntcntalkPopup").find("#ntcnTmplatList").val(tmplatList);
|
||||
|
||||
}
|
||||
|
||||
dataStr = formId ? $('#' + formId).serialize() : $('form').serialize();
|
||||
if (confirmation) {
|
||||
$.ajax({
|
||||
type : 'post',
|
||||
url : url,
|
||||
data : dataStr,
|
||||
success : function(data) {
|
||||
alert('<spring:message code="success.common.update"/>');
|
||||
if(formId){
|
||||
location.replace('/mngr/ntcn/tmplt/selectAtmcSndngTmplatManage?ntcntalkChange='+$('#formDvCd').val());
|
||||
}
|
||||
},
|
||||
error : function(request, status, error) {
|
||||
console.log(error)
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/* ********************************************************
|
||||
* 치환코드 팝업 내용 수정
|
||||
******************************************************** */
|
||||
const fn_swith_SubModal = function (substitutionList) {
|
||||
$.each(substitutionList, function(index, value) {
|
||||
switch (value) {
|
||||
/* 템플릿 개별 치환코드(빈도 높음) */
|
||||
case "sopmalCd":
|
||||
substitutionList[index] = {cd : "{"+substitutionList[index]+"}", nm : "쇼핑몰코드"};
|
||||
break;
|
||||
case "shopName":
|
||||
substitutionList[index] = {cd : "{"+substitutionList[index]+"}", nm : "쇼핑몰명"};
|
||||
break;
|
||||
case "bbsNm":
|
||||
substitutionList[index] = {cd : "{"+substitutionList[index]+"}", nm : "게시판명"};
|
||||
break;
|
||||
case "userid":
|
||||
substitutionList[index] = {cd : "{"+substitutionList[index]+"}", nm : "회원id"};
|
||||
break;
|
||||
case "user_name":
|
||||
substitutionList[index] = {cd : "{"+substitutionList[index]+"}", nm : "회원명"};
|
||||
break;
|
||||
case "coupon_count":
|
||||
substitutionList[index] = {cd : "{"+substitutionList[index]+"}", nm : "만료쿠폰 종수"};
|
||||
break;
|
||||
case "mypage_short_url":
|
||||
substitutionList[index] = {cd : "{"+substitutionList[index]+"}", nm : "마이페이지 바로가기URL"};
|
||||
break;
|
||||
case "mileage_rest":
|
||||
substitutionList[index] = {cd : "{"+substitutionList[index]+"}", nm : "소멸예정마일리지"};
|
||||
break;
|
||||
case "goodsNm":
|
||||
substitutionList[index] = {cd : "{"+substitutionList[index]+"}", nm : "장바구니상품명 <br>→ 여러건일 경우 + \"외 xxx건\""};
|
||||
break;
|
||||
case "cscTelnb":
|
||||
substitutionList[index] = {cd : "{"+substitutionList[index]+"}", nm : "고객센터전화번호"};
|
||||
break;
|
||||
case "rejectTelnb":
|
||||
substitutionList[index] = {cd : "{"+substitutionList[index]+"}", nm : "수신거부전화번호"};
|
||||
break;
|
||||
case "ordrInnb":
|
||||
substitutionList[index] = {cd : "{"+substitutionList[index]+"}", nm : "주문번호"};
|
||||
break;
|
||||
case "mbrgradNm":
|
||||
substitutionList[index] = {cd : "{"+substitutionList[index]+"}", nm : "회원등급명"};
|
||||
break;
|
||||
case "coupNm":
|
||||
substitutionList[index] = {cd : "{"+substitutionList[index]+"}", nm : "쿠폰명"};
|
||||
break;
|
||||
case "validpdBgnDt":
|
||||
substitutionList[index] = {cd : "{"+substitutionList[index]+"}", nm : "쿠폰유효기간 시작일"};
|
||||
break;
|
||||
case "validpdEndDt":
|
||||
substitutionList[index] = {cd : "{"+substitutionList[index]+"}", nm : "쿠폰유효기간 종료일"};
|
||||
break;
|
||||
case "shopDomain":
|
||||
substitutionList[index] = {cd : "{"+substitutionList[index]+"}", nm : "도메인주소"};
|
||||
break;
|
||||
case "marktRecptnAgreAt":
|
||||
substitutionList[index] = {cd : "{"+substitutionList[index]+"}", nm : "수신동의상태 (광고수신동의여부)"};
|
||||
break;
|
||||
case "marktRecptnAgreUpdtDt":
|
||||
substitutionList[index] = {cd : "{"+substitutionList[index]+"}", nm : "수신동의일 (광고수신동의변경일시)"};
|
||||
break;
|
||||
case "Nm":
|
||||
substitutionList[index] = {cd : "{"+substitutionList[index]+"}", nm : "이름"};
|
||||
break;
|
||||
case "agree_short_url":
|
||||
substitutionList[index] = {cd : "{"+substitutionList[index]+"}", nm : "수신동의 URL"};
|
||||
break;
|
||||
case "ordno":
|
||||
substitutionList[index] = {cd : "{"+substitutionList[index]+"}", nm : "주문번호"};
|
||||
break;
|
||||
case "go_Item":
|
||||
substitutionList[index] = {cd : "{"+substitutionList[index]+"}", nm : "주문한 상품명 <br>→ 여러건일 경우 + \"외 xxx건\""};
|
||||
break;
|
||||
case "delivery_company":
|
||||
substitutionList[index] = {cd : "{"+substitutionList[index]+"}", nm : "배송회사"};
|
||||
break;
|
||||
case "delivery_number":
|
||||
substitutionList[index] = {cd : "{"+substitutionList[index]+"}", nm : "운송장번호"};
|
||||
break;
|
||||
case "order_user":
|
||||
substitutionList[index] = {cd : "{"+substitutionList[index]+"}", nm : "주문자"};
|
||||
break;
|
||||
case "recipient_user":
|
||||
substitutionList[index] = {cd : "{"+substitutionList[index]+"}", nm : "배송받는자"};
|
||||
break;
|
||||
case "passsword":
|
||||
substitutionList[index] = {cd : "{"+substitutionList[index]+"}", nm : "비밀번호"};
|
||||
break;
|
||||
case "authnum":
|
||||
substitutionList[index] = {cd : "{"+substitutionList[index]+"}", nm : "인증번호"};
|
||||
break;
|
||||
case "ord_Item":
|
||||
substitutionList[index] = {cd : "{"+substitutionList[index]+"}", nm : "주문한 상품명 <br>→ 여러건일 경우 + \"외 xxx건\""};
|
||||
break;
|
||||
case "bank_Account":
|
||||
substitutionList[index] = {cd : "{"+substitutionList[index]+"}", nm : "은행명+계좌번호+예금주명"};
|
||||
break;
|
||||
case "settleprice":
|
||||
substitutionList[index] = {cd : "{"+substitutionList[index]+"}", nm : "결제금액"};
|
||||
break;
|
||||
case "orderUser":
|
||||
substitutionList[index] = {cd : "{"+substitutionList[index]+"}", nm : "주문자"};
|
||||
break;
|
||||
case "ordDate":
|
||||
substitutionList[index] = {cd : "{"+substitutionList[index]+"}", nm : "주문일"};
|
||||
break;
|
||||
case "ordPrice":
|
||||
substitutionList[index] = {cd : "{"+substitutionList[index]+"}", nm : "결제금액"};
|
||||
break;
|
||||
case "withdrawalDt":
|
||||
substitutionList[index] = {cd : "{"+substitutionList[index]+"}", nm : "탈퇴일시"};
|
||||
break;
|
||||
|
||||
case "NONE":
|
||||
substitutionList[index] = {cd : "{"+substitutionList[index]+"}", nm : "치환코드 미사용"};
|
||||
break;
|
||||
default:
|
||||
if (!substitutionList[index].cd) {
|
||||
substitutionList[index] = {cd : "{"+substitutionList[index]+"}" ,nm : "치환 내용"};
|
||||
}
|
||||
break;
|
||||
}
|
||||
});
|
||||
|
||||
var tableBody = $('#substitution-pop .modal-content .table-wrapper table tbody');
|
||||
tableBody.empty();
|
||||
|
||||
if(substitutionList.length == 0){
|
||||
var row = $('<tr></tr>');
|
||||
row.append($('<td></td>').text('정의되지 않음'));
|
||||
row.append($('<td></td>').text('치환코드 추가 예정'));
|
||||
tableBody.append(row);
|
||||
}else {
|
||||
$.each(substitutionList, function(index, substitution) {
|
||||
var row = $('<tr></tr>');
|
||||
row.append($('<td></td>').text(substitution.cd));
|
||||
row.append($('<td></td>').html(substitution.nm));
|
||||
tableBody.append(row);
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/* ********************************************************
|
||||
* 공통치환코드 팝업 내용 수정
|
||||
******************************************************** */
|
||||
const fn_swith_CommonSubModal = function () {
|
||||
|
||||
let commonSubstitutionList = [];
|
||||
/* 템플릿 공통 치환코드(빈도 낮음) */
|
||||
commonSubstitutionList.push({cd : "{reprsntTelnb}", nm : "대표전화번호"});
|
||||
commonSubstitutionList.push({cd : "{shopName}", nm : "쇼핑몰 이름"});
|
||||
commonSubstitutionList.push({cd : "{shopDomain}", nm : "쇼핑몰 도메인"});
|
||||
commonSubstitutionList.push({cd : "{reprsntEmail}", nm : "대표 이메일"});
|
||||
commonSubstitutionList.push({cd : "{ascEntrpsNm}", nm : "AS센터 업체명"});
|
||||
commonSubstitutionList.push({cd : "{ascWkdayWorkTme}", nm : "AS센터 평일근무시간"});
|
||||
commonSubstitutionList.push({cd : "{ascLunchTme}", nm : "AS센터 점심시간"});
|
||||
commonSubstitutionList.push({cd : "{ascZip}", nm : "AS센터 우편번호"});
|
||||
commonSubstitutionList.push({cd : "{ascAdres}", nm : "AS센터 주소"});
|
||||
commonSubstitutionList.push({cd : "{ascDtlAdres}", nm : "AS센터 상세 주소"});
|
||||
commonSubstitutionList.push({cd : "{cscWkdayWorkTme}", nm : "고객센터 평일 근무시간"});
|
||||
commonSubstitutionList.push({cd : "{cscLunchTme}", nm : "고객센터 점심시간"});
|
||||
commonSubstitutionList.push({cd : "{cscRstde}", nm : "고객센터 휴무일"});
|
||||
commonSubstitutionList.push({cd : "{cscTelnb}", nm : "고객센터 전화번호"});
|
||||
commonSubstitutionList.push({cd : "{sleBsnmNm}", nm : "판매사 사업자명"});
|
||||
commonSubstitutionList.push({cd : "{sleBizrnb}", nm : "판매사 사업자 등록번호"});
|
||||
commonSubstitutionList.push({cd : "{sleMobDclNb}", nm : "판매사 통신판매업신고번호"});
|
||||
commonSubstitutionList.push({cd : "{sleReprsntvnm}", nm : "판매사 대표자명"});
|
||||
commonSubstitutionList.push({cd : "{sleIndvdlinfoPrtcRspnberNm}", nm : "판매사 개인정보보호책임자명"});
|
||||
commonSubstitutionList.push({cd : "{sleTelnb}", nm : "판매사 전화번호"});
|
||||
commonSubstitutionList.push({cd : "{sleFxnb}", nm : "판매사 팩스번호"});
|
||||
commonSubstitutionList.push({cd : "{sleEmail}", nm : "판매사 이메일"});
|
||||
commonSubstitutionList.push({cd : "{sleBsnDclNb}", nm : "판매사 영업신고번호"});
|
||||
commonSubstitutionList.push({cd : "{sleZip}", nm : "판매사 우편번호"});
|
||||
commonSubstitutionList.push({cd : "{sleLnbAdres}", nm : "판매사 지번주소"});
|
||||
commonSubstitutionList.push({cd : "{sleRnmAdres}", nm : "판매사 도로명주소"});
|
||||
commonSubstitutionList.push({cd : "{sleDtlAdres}", nm : "판매사 상세주소"});
|
||||
commonSubstitutionList.push({cd : "{operBsnmNm}", nm : "운영사 사업자명"});
|
||||
commonSubstitutionList.push({cd : "{operBizrnb}", nm : "운영사 사업자 등록번호"});
|
||||
commonSubstitutionList.push({cd : "{operMobDclNb}", nm : "운영사 통신판매업신고번호"});
|
||||
commonSubstitutionList.push({cd : "{operReprsntvnm}", nm : "운영사 대표자명"});
|
||||
commonSubstitutionList.push({cd : "{operIndvdlinfoPrtcRspnberNm}", nm : "운영사 개인정보보호책임자명"});
|
||||
commonSubstitutionList.push({cd : "{operTelnb}", nm : "운영사 전화번호"});
|
||||
commonSubstitutionList.push({cd : "{operFxnb}", nm : "운영사 팩스번호"});
|
||||
commonSubstitutionList.push({cd : "{operEmail}", nm : "운영사 이메일"});
|
||||
commonSubstitutionList.push({cd : "{operBsnDclNb}", nm : "운영사 영업신고번호"});
|
||||
commonSubstitutionList.push({cd : "{operZip}", nm : "운영사 우편번호"});
|
||||
commonSubstitutionList.push({cd : "{operLnbAdres}", nm : "운영사 지번주소"});
|
||||
commonSubstitutionList.push({cd : "{operRnmAdres}", nm : "운영사 도로명주소"});
|
||||
commonSubstitutionList.push({cd : "{operDtlAdres}", nm : "운영사 상세주소"});
|
||||
|
||||
var tableBody = $('#common-substitution-pop .modal-content .table-wrapper table tbody');
|
||||
|
||||
$.each(commonSubstitutionList, function(index, commonSubstitution) {
|
||||
var row = $('<tr></tr>');
|
||||
row.append($('<td></td>').text(commonSubstitution.cd));
|
||||
row.append($('<td></td>').html(commonSubstitution.nm));
|
||||
tableBody.append(row);
|
||||
});
|
||||
}
|
||||
|
||||
/**********************************************
|
||||
* 문자 기본 메시지
|
||||
***********************************************/
|
||||
const fn_set_defaultMessage = function(button, defaultText) {
|
||||
var smsManage = $(button).closest('.template-message').find('.sms-manage');
|
||||
smsManage.find('textarea[name="smsCn"]').val(defaultText);
|
||||
smsManage.find('.number').text(byteCount(defaultText));
|
||||
}
|
||||
|
||||
/**********************************************
|
||||
* 알림톡 대체문자 사용여부
|
||||
***********************************************/
|
||||
const fn_switch_smsRplcAt = function(button) {
|
||||
var ntcnTmplt = $(button).parent().parent();
|
||||
var smsRplcAt = ntcnTmplt.find('input[name="smsRplcAt"]');
|
||||
var smsRplcDiv = ntcnTmplt.find('.smsRplc');
|
||||
|
||||
if ($(button).hasClass('primary')) {
|
||||
$(button).removeClass('primary').addClass('dark').text('문자 OFF');
|
||||
smsRplcAt.val('N');
|
||||
smsRplcDiv.css('background-color', '#f8f9fa');
|
||||
} else {
|
||||
$(button).removeClass('dark').addClass('primary').text('문자 ON');
|
||||
smsRplcAt.val('Y');
|
||||
smsRplcDiv.css('background-color', '');
|
||||
}
|
||||
|
||||
var smsRplcCn = ntcnTmplt.find('textarea[name="smsRplcCn"]');
|
||||
smsRplcCn.prop('readonly', !smsRplcCn.prop('readonly'));
|
||||
smsRplcCn.css('cursor', smsRplcCn.css('cursor') === 'not-allowed' ? '' : 'not-allowed');
|
||||
}
|
||||
|
||||
/**********************************************
|
||||
* 알림톡 팝업 - 버튼 추가
|
||||
***********************************************/
|
||||
const fn_add_buttonRow = function() {
|
||||
if($('.modal .message-edit__wrapper .talk-edit-row').length == 0){
|
||||
var script = document.createElement('script');
|
||||
script.src = '/mngr/js/script.js';
|
||||
document.body.appendChild(script);
|
||||
}
|
||||
if($('.modal .message-edit__wrapper .talk-edit-row').length < 5){
|
||||
let rowLength = $('.modal .message-edit__wrapper .talk-edit-row').length + 1;
|
||||
$('.modal .message-edit__wrapper .message-edit-preview__footer').append($('<a href="#" class="message-edit-preview__footer-item">버튼 링크</a>'));
|
||||
$('.modal .message-edit__wrapper tbody').append($(
|
||||
'<tr><td><div class="talk-edit-row">' +
|
||||
'<div class="select-box select-show-trigger">' +
|
||||
'<select name="btnType" title="해당 셀렉트에 대한 설명" style="display: none;">' +
|
||||
'<option value="WL" selected="">버튼 링크</option>' +
|
||||
'<option value="DS">배송 조회</option>' +
|
||||
'</select>' +
|
||||
'<div class="nice-select">' +
|
||||
'<span class="current">버튼 링크</span>' +
|
||||
'<ul class="list">' +
|
||||
'<li data-value="WL" class="option selected">버튼 링크</li>' +
|
||||
'<li data-value="DS" class="option">배송 조회</li>' +
|
||||
'</ul>' +
|
||||
'</div>' +
|
||||
'</div>' +
|
||||
'<input class="WL input-text" type="text" name="btnNm" title="해당 인풋에 대한 설명" placeholder="버튼명(최대 28자)" maxlength="28">' +
|
||||
'<input class="WL input-text xl" type="text" name="btnPcUrl" title="해당 인풋에 대한 설명" placeholder="링크주소">' +
|
||||
'<input class="WL input-text xl" type="text" name="btnMUrl" title="해당 인풋에 대한 설명" placeholder="모바일 링크주소">' +
|
||||
'<span class="DS w-full" style="display: none;">배송조회는 버튼 링크를 포함하지 않습니다.</span>' +
|
||||
'<button class="circle-btn delete" onclick="fn_remove_buttonRow(this)">' +
|
||||
'<span class="visually-hidden">삭제</span>' +
|
||||
'</button>' +
|
||||
'</div></td></tr>'));
|
||||
}else{
|
||||
alert('버튼은 최대 5개까지 사용 가능합니다.');
|
||||
}
|
||||
}
|
||||
|
||||
/**********************************************
|
||||
* 알림톡 팝업 - 버튼 타입 변경
|
||||
***********************************************/
|
||||
$(document).on('change', 'select[name="btnType"]', function() {
|
||||
var count = 0;
|
||||
$("select[name='btnType']").each(function() {
|
||||
$(this).val()=='DS' ? count++ : count;
|
||||
});
|
||||
|
||||
var tr = $(this).closest('tr');
|
||||
if(count > 1){
|
||||
alert('배송조회 버튼은 메세지당 한개만 가능합니다.');
|
||||
$(this).val('WL');
|
||||
tr.find('span.current').html('버튼 링크');
|
||||
tr.find('li[data-value="WL"]').addClass('selected');
|
||||
tr.find('li[data-value="DS"]').removeClass('selected');
|
||||
}else{
|
||||
var btnRow = $(this).closest('.talk-edit-row');
|
||||
btnRow.find('.WL, .DS').hide();
|
||||
btnRow.find('.' + $(this).val()).show();
|
||||
|
||||
var index = tr.index()-2;
|
||||
var previewBtn = $('.modal .message-edit__wrapper .message-edit-preview__footer-item');
|
||||
var btnNm = btnRow.find('input[name="btnNm"]').val();
|
||||
previewBtn.eq(index).html($(this).val() == 'DS' ? '배송 조회' : (btnNm?btnNm:'버튼 링크'));
|
||||
}
|
||||
});
|
||||
|
||||
/**********************************************
|
||||
* 알림톡 팝업 - 버튼 이름 변경(미리보기)
|
||||
***********************************************/
|
||||
$(document).on('change', 'input[name="btnNm"]', function() {
|
||||
var btnNm = $(this).val();
|
||||
var index = $(this).closest('tr').index()-2;
|
||||
var previewBtn = $('.modal .message-edit__wrapper .message-edit-preview__footer-item');
|
||||
previewBtn.eq(index).html(btnNm || " ");
|
||||
});
|
||||
|
||||
/**********************************************
|
||||
* 알림톡 팝업 - 버튼 삭제(미리보기)
|
||||
***********************************************/
|
||||
const fn_remove_buttonRow = function(button) {
|
||||
var index = $(button).closest('tr').index()-2;
|
||||
var previewBtn = $('.modal .message-edit__wrapper .message-edit-preview__footer-item');
|
||||
previewBtn.eq(index).remove();
|
||||
}
|
||||
|
||||
/**********************************************
|
||||
* 알림톡 미리보기 반영
|
||||
***********************************************/
|
||||
const updatePreview = function() {
|
||||
$(".message-edit-preview__content textarea").val($(this).val());
|
||||
};
|
||||
|
||||
/**********************************************
|
||||
* 데이터 크기(byte) 계산
|
||||
***********************************************/
|
||||
const byteCount = function(text) {
|
||||
return encodeURI(text).split(/%..|./).length - 1;
|
||||
}
|
||||
|
||||
/**********************************************
|
||||
* 데이터 크기(byte) 반영
|
||||
***********************************************/
|
||||
const updateByteCount = function() {
|
||||
$(this).closest('.sms-manage').find('.number').text(byteCount($(this).val()));
|
||||
if ($('#selectNtcntalkTmplat').hasClass('active')) {
|
||||
//알림톡 수정 팝업화면의 경우 글자수 반영
|
||||
$(this).closest('.sms-manage').find('.count').text($(this).val().length);
|
||||
}
|
||||
};
|
||||
</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" onclick="fn_update_AtmcSndngTmplatForm()" id="tmpltUpdateBtn">저장하기</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="content-tab">
|
||||
<button class="content-tab__btn active" id="selectEmailTmplatBtn" onclick="fn_select_EmailTmplatForm('FORM_DV_BBS&01')">이메일</button>
|
||||
<button class="content-tab__btn" id="selectMssageTmplatBtn" onclick="fn_select_MssageTmplatForm('FORM_DV_BBS')">메시지</button>
|
||||
<button class="content-tab__btn" id="selectNtcntalkTmplatBtn" onclick="fn_select_NtcntalkTmplatForm('FORM_DV_BBS')">알림톡</button>
|
||||
</div>
|
||||
<form id='tx_editor_form' name="tx_editor_form">
|
||||
<input type="hidden" id="tmplatList" name="tmplatList">
|
||||
<input type="hidden" id="formDvCd" name="formDvCd">
|
||||
<div class="content-tab__content active" id="selectEmailTmplat">
|
||||
<%--이메일 자동발송 템플릿--%>
|
||||
</div>
|
||||
<div class="content-tab__content" id="selectMssageTmplat">
|
||||
<%--메시지 자동발송 템플릿--%>
|
||||
</div>
|
||||
<div class="content-tab__content" id="selectNtcntalkTmplat">
|
||||
<%--알림톡 자동발송 템플릿--%>
|
||||
</div>
|
||||
</form>
|
||||
<button class="scroll-to-top"><span class="visually-hidden">위로가기</span></button>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
<!-- 치환코드 모달 -->
|
||||
<div id="substitution-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>
|
||||
<!-- 치환코드 내용 삽입 -->
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- 공통치환코드 모달 -->
|
||||
<div id="common-substitution-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>
|
||||
<!-- 치환코드 내용 삽입 -->
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- 알림톡 메시지 수정 모달 -->
|
||||
<div id="ntcntalkAtmcSndngTmplatUpdtPopupDiv">
|
||||
</div>
|
||||
<!-- 알림톡 치환코드 모달(모달속 모달) -->
|
||||
<div id="substitution-talk-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>
|
||||
<!-- 치환코드 내용 삽입 -->
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<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>버튼명은 '배송 조회하기'로 자동 노출 됩니다.<p>
|
||||
<p>알림톡 메시지 파싱을 통해 배송조회 링크가 자동 생성 됩니다.</p>
|
||||
<p>지원 택배사 : CJ대한통운, FedEx, GTX로지스, KG로지스, 경동택배, 로젠택배, 우체국택배, 일양로지스, 한진택배, 합동택배, 롯데택배</p>
|
||||
</div>
|
||||
</div>
|
||||
<div id="info02" class="modal" style="width: 280px;">
|
||||
<div class="mini-info-content__header">
|
||||
<h5 class="mini-info-content__title">버튼 안내</h5>
|
||||
<a href="#" rel="modal:close" class="mini-info-content__close"><span class="visually-hidden">닫기</span></a>
|
||||
</div>
|
||||
<div class="mini-info-content__content">
|
||||
<p>버튼명은 '배송 조회하기'로 자동 노출 됩니다.<p>
|
||||
<p>알림톡 메시지 파싱을 통해 배송조회 링크가 자동 생성 됩니다.</p>
|
||||
<p>지원 택배사 : CJ대한통운, FedEx, GTX로지스, KG로지스, 경동택배, 로젠택배, 우체국택배, 일양로지스, 한진택배, 합동택배, 롯데택배</p>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -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 : EmailAtmcSndngTmplatU.jsp
|
||||
Description : 이메일 템플릿 관리
|
||||
Modification Information
|
||||
|
||||
수정일 수정자 수정내용
|
||||
------- -------- ---------------------------
|
||||
2024-02-21 리브가 최초 생성
|
||||
2024-04-17 이대환 Email>Email 분리
|
||||
--%>
|
||||
<script>
|
||||
$(document).ready(function () {
|
||||
fn_select_EmailTmplat($("#formDvCd").val());
|
||||
|
||||
/* 치환코드 하드코딩 */
|
||||
var modalLink = $('a[href="#substitution-pop"]');
|
||||
modalLink.click(function() {
|
||||
var formDvCdValue = $("#formDvCd").val();
|
||||
var formDtlDvCd = parseInt(formDvCdValue.split("&")[1]);
|
||||
|
||||
switch(formDvCdValue.split("&")[0]){
|
||||
case "FORM_DV_BBS":
|
||||
fn_swith_SubModal(substitutionList[formDtlDvCdLength[0]+formDtlDvCd-1]);
|
||||
break;
|
||||
case "FORM_DV_CMMN":
|
||||
fn_swith_SubModal(substitutionList[formDtlDvCdLength[1]+formDtlDvCd-1]);
|
||||
break;
|
||||
case "FORM_DV_DLVY":
|
||||
fn_swith_SubModal(substitutionList[formDtlDvCdLength[2]+formDtlDvCd-1]);
|
||||
break;
|
||||
case "FORM_DV_MBR":
|
||||
fn_swith_SubModal(substitutionList[formDtlDvCdLength[3]+formDtlDvCd-1]);
|
||||
break;
|
||||
case "FORM_DV_ORDR":
|
||||
fn_swith_SubModal(substitutionList[formDtlDvCdLength[4]+formDtlDvCd-1]);
|
||||
break;
|
||||
case "FORM_DV_REMND":
|
||||
fn_swith_SubModal(substitutionList[formDtlDvCdLength[5]+formDtlDvCd-1]);
|
||||
break;
|
||||
}
|
||||
});
|
||||
|
||||
let substitutionList = [];
|
||||
let formDtlDvCdLength = [];
|
||||
|
||||
/*게시판(FORM_DV_BBS)*/
|
||||
formDtlDvCdLength.push(substitutionList.length);
|
||||
//게시글 등록(01)
|
||||
substitutionList.push(["sopmalCd", "shopName", "bbsNm"]);
|
||||
//게시글 답변(02)
|
||||
substitutionList.push(["sopmalCd", "shopName", "bbsNm"]);
|
||||
|
||||
/*공통(FORM_DV_CMMN)*/
|
||||
formDtlDvCdLength.push(substitutionList.length);
|
||||
//혜택 정보 수신동의 여부 확인(01)
|
||||
substitutionList.push(["sopmalCd", "shopName", "shopDomain", "user_name", "marktRecptnAgreAt", "marktRecptnAgreUpdtDt", "cscTelnb", "rejectTelnb"]);
|
||||
//혜택 정보 수신동의 변경 결과(02)
|
||||
substitutionList.push(["sopmalCd", "shopName", "shopDomain", "user_name", "marktRecptnAgreAt", "marktRecptnAgreUpdtDt", "cscTelnb", "rejectTelnb"]);
|
||||
//(비회원 구매자) 혜택 정보 수신동의 요청(03)
|
||||
substitutionList.push(["sopmalCd", "shopName", "shopDomain", "Nm", "agree_short_url"]);
|
||||
//(비회원 구매자) 혜택 정보 수신동의 결과(04)
|
||||
substitutionList.push(["NONE"]);
|
||||
|
||||
/*배송(FORM_DV_DLVY)*/
|
||||
formDtlDvCdLength.push(substitutionList.length);
|
||||
//출고 완료(주문자)(01)
|
||||
substitutionList.push(["sopmalCd", "shopName", "ordno", "go_Item", "delivery_company", "delivery_number", "order_user", "recipient_user"]);
|
||||
//배송완료(주문자)(02)
|
||||
substitutionList.push(["sopmalCd", "shopName", "ordno", "go_Item", "delivery_company", "delivery_number", "order_user", "recipient_user"]);
|
||||
//출고 완료(받는분)(03)
|
||||
substitutionList.push(["sopmalCd", "shopName", "ordno", "go_Item", "delivery_company", "delivery_number", "order_user", "recipient_user"]);
|
||||
//배송완료(받는분)(04)
|
||||
substitutionList.push(["sopmalCd", "shopName", "ordno", "go_Item", "delivery_company", "delivery_number", "order_user", "recipient_user"]);
|
||||
|
||||
/*회원(FORM_DV_MBR)*/
|
||||
formDtlDvCdLength.push(substitutionList.length);
|
||||
//회원 가입(01)
|
||||
substitutionList.push(["sopmalCd", "shopName", "user_name", "userid"]);
|
||||
//회원 탈퇴(02)
|
||||
substitutionList.push(["sopmalCd", "shopName", "userid", "withdrawalDt"]);
|
||||
//아이디 찾기(03)
|
||||
substitutionList.push(["sopmalCd", "shopName", "userid"]);
|
||||
//비밀번호 찾기(04)
|
||||
substitutionList.push(["sopmalCd", "shopName", "passsword"]);
|
||||
//개인인증번호 확인(05)
|
||||
substitutionList.push(["sopmalCd", "shopName", "authnum"]);
|
||||
//장기 미구매 고객 대상 쿠폰(06)
|
||||
substitutionList.push(["NONE"]);
|
||||
//생일 쿠폰(07)
|
||||
substitutionList.push(["NONE"]);
|
||||
|
||||
/*주문(FORM_DV_ORDR)*/
|
||||
formDtlDvCdLength.push(substitutionList.length);
|
||||
//주문 접수(01)
|
||||
substitutionList.push(["sopmalCd", "shopName", "ord_Item", "ordno", "bank_Account", "settleprice"]);
|
||||
//결제 확인(02)
|
||||
substitutionList.push(["sopmalCd", "shopName", "orderUser", "ord_Item", "ordno", "ordDate", "ordPrice"]);
|
||||
//환불 완료(취소)(03)
|
||||
substitutionList.push(["sopmalCd", "shopName"]);
|
||||
//환불 완료(반품)(04)
|
||||
substitutionList.push(["sopmalCd", "shopName"]);
|
||||
//입금 요청(05)
|
||||
substitutionList.push(["sopmalCd", "shopName", "ord_Item", "ordno", "bank_Account", "settleprice"]);
|
||||
//선물하기 안내(06)
|
||||
substitutionList.push(["NONE"]);
|
||||
|
||||
/*고객리마인드(FORM_DV_REMND)*/
|
||||
formDtlDvCdLength.push(substitutionList.length);
|
||||
//회원 멤버쉽 등급변경(01)
|
||||
substitutionList.push(["shopName", "user_name", "mbrgradNm", "mypage_short_url", "cscTelnb", "rejectTelnb"]);
|
||||
//상품 리뷰 작성 유도(02)
|
||||
substitutionList.push(["shopName", "user_name", "ordrInnb", "goodsNm", "mypage_short_url", "cscTelnb", "rejectTelnb"]);
|
||||
//만료 쿠폰(03)
|
||||
substitutionList.push(["shopName", "userid", "user_name", "coupon_count", "mypage_short_url"]);
|
||||
//소멸 예정 마일리지(04)
|
||||
substitutionList.push(["shopName", "user_name", "mileage_rest", "mypage_short_url"]);
|
||||
//생일 축하(05)
|
||||
substitutionList.push(["shopName", "user_name", "coupNm", "validpdBgnDt", "validpdEndDt", "mypage_short_url", "cscTelnb", "rejectTelnb"]);
|
||||
//장바구니 상품(06)
|
||||
substitutionList.push(["shopName", "user_name", "goodsNm", "mypage_short_url", "cscTelnb", "rejectTelnb"]);
|
||||
//정수기 필터 교체 알림(07)
|
||||
substitutionList.push(["NONE"]);
|
||||
//장바구니 타임세일(08)
|
||||
substitutionList.push(["shopName", "user_name", "goodsNm", "mypage_short_url", "cscTelnb", "rejectTelnb"]);
|
||||
});
|
||||
|
||||
const fn_select_EmailTmplat = function (templatIndex) {
|
||||
$('#formDvCd').val(templatIndex);
|
||||
|
||||
/* 라디오버튼 임시방편 */
|
||||
var radioButtons = $("input[name='r-group01']");
|
||||
|
||||
radioButtons.each(function() {
|
||||
if ($(this).val() === $("#formDvCd").val()) {
|
||||
$(this).prop("checked", true);
|
||||
}
|
||||
});
|
||||
|
||||
$.ajax({
|
||||
type: 'post',
|
||||
url : '/mngr/ntcn/tmplt/selectEmailAtmcSndngTmplatOne',
|
||||
data: $('#formDvCd').serialize(),
|
||||
success : function (Data) {
|
||||
let boCtrlMap = JSON.parse(Data.resBody.result).boCtrlMap;
|
||||
|
||||
$('#emailSj').val(boCtrlMap.emailSj);
|
||||
$('#emailCn').val((boCtrlMap.emailCn != null && boCtrlMap.emailCn.trim() != '') ? boCtrlMap.emailCn : ' ');
|
||||
|
||||
Editor.modify({
|
||||
"content": document.getElementById("emailCn")
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
</script>
|
||||
<section class="content-section">
|
||||
<h3 class="content-section__title">이메일</h3>
|
||||
<div class="table-wrapper">
|
||||
<table class="table">
|
||||
<caption>해당 테이블에 대한 설명</caption>
|
||||
<colgroup>
|
||||
<col style="width: 12%;">
|
||||
<col style="width: 12%;">
|
||||
<col>
|
||||
</colgroup>
|
||||
<tbody>
|
||||
<c:choose>
|
||||
<c:when test="${ not empty resultListMap.groupCd}">
|
||||
<c:forEach items="${ resultListMap.groupCd }" var="list" varStatus="status">
|
||||
<c:set var = "index" scope = "session" value = "${status.index}"/>
|
||||
<tr>
|
||||
<c:if test="${status.index == 0}">
|
||||
<th rowspan="<c:out value="${fn:length(resultListMap.groupCd)}"/>" class="border-right">이메일 선택</th>
|
||||
</c:if>
|
||||
<c:if test="${list.groupCd eq 'FORM_DV'}">
|
||||
<c:set var = "groupDtl" scope = "session" value = "${list.groupCd}_${list.cd}"/>
|
||||
<th>
|
||||
<c:out value="${list.cdNm}"/>
|
||||
</th>
|
||||
<td>
|
||||
<div class="td-inner">
|
||||
<div class="custom-radio-container">
|
||||
<c:forEach items="${ resultListMap.formDvCd }" var="list" varStatus="status">
|
||||
<c:if test="${list.groupCd eq groupDtl}">
|
||||
<div class="custom-radio">
|
||||
<input type="radio" id="r-${status.index}" name="r-group01" value="<c:out value="${list.groupCd}"/>&<c:out value="${list.cd}"/>" onchange="fn_select_EmailTmplat(this.value)">
|
||||
<label for="r-${status.index}"><c:out value="${list.cdNm}"/></label>
|
||||
</div>
|
||||
</c:if>
|
||||
</c:forEach>
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
</c:if>
|
||||
</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>
|
||||
<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>
|
||||
<div class="td-inner">
|
||||
<c:out value = "${resultListMap.dsptchAdres}"/>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>제목</th>
|
||||
<td>
|
||||
<div class="td-inner">
|
||||
<input class="input-text xl" type="text" title="이메일제목" id="emailSj" name="emailSj"
|
||||
placeholder="" value="<c:out value = "${resultListMap.boCtrlMap.emailSj}"/>">
|
||||
<a href="#substitution-pop" rel="modal:open"
|
||||
class="btn sm outline">
|
||||
<i class="icon icon_info"></i>
|
||||
치환 코드
|
||||
</a>
|
||||
<a href="#common-substitution-pop" rel="modal:open"
|
||||
class="btn sm outline">
|
||||
<i class="icon icon_info"></i>
|
||||
공통 치환 코드
|
||||
</a>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<h3 class="content-section__title">내용</h3>
|
||||
<%@ include file="../email/EmailPassivSndngEditor.jsp" %>
|
||||
<textarea class="textarea" id="emailCn" name="emailCn" style="display: none"><c:out value = "${resultListMap.boCtrlMap.emailCn}"/></textarea>
|
||||
</section>
|
||||
@@ -0,0 +1,277 @@
|
||||
<%@ 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 : MssageAtmcSndngTmplatU.jsp
|
||||
Description : 메시지 템플릿 관리
|
||||
Modification Information
|
||||
|
||||
수정일 수정자 수정내용
|
||||
------- -------- ---------------------------
|
||||
2024-02-21 리브가 최초 생성
|
||||
2024-04-17 이대환 Email>Mssage 분리
|
||||
--%>
|
||||
<script>
|
||||
$(document).ready(function() {
|
||||
$('.textarea').each(updateByteCount);
|
||||
|
||||
/* 탭 박스 임시방편 */
|
||||
var formDvCd = $("#formDvCd").val();
|
||||
var radioButtons = $(".tab-box__btn");
|
||||
|
||||
radioButtons.each(function() {
|
||||
if ($(this).val() === formDvCd) {
|
||||
$(this).addClass("current")
|
||||
}else{
|
||||
$(this).removeClass("current")
|
||||
}
|
||||
});
|
||||
|
||||
/* 치환코드 하드코딩 */
|
||||
var modalLink = $('a[href="#substitution-pop"]');
|
||||
modalLink.click(function() {
|
||||
var formDtlDvCd = parseInt($(this).data('value'));
|
||||
|
||||
switch(formDvCd){
|
||||
case "FORM_DV_BBS":
|
||||
fn_swith_SubModal(substitutionList[formDtlDvCdLength[0]+formDtlDvCd-1]);
|
||||
break;
|
||||
case "FORM_DV_CMMN":
|
||||
fn_swith_SubModal(substitutionList[formDtlDvCdLength[1]+formDtlDvCd-1]);
|
||||
break;
|
||||
case "FORM_DV_DLVY":
|
||||
fn_swith_SubModal(substitutionList[formDtlDvCdLength[2]+formDtlDvCd-1]);
|
||||
break;
|
||||
case "FORM_DV_MBR":
|
||||
fn_swith_SubModal(substitutionList[formDtlDvCdLength[3]+formDtlDvCd-1]);
|
||||
break;
|
||||
case "FORM_DV_ORDR":
|
||||
fn_swith_SubModal(substitutionList[formDtlDvCdLength[4]+formDtlDvCd-1]);
|
||||
break;
|
||||
case "FORM_DV_REMND":
|
||||
fn_swith_SubModal(substitutionList[formDtlDvCdLength[5]+formDtlDvCd-1]);
|
||||
break;
|
||||
}
|
||||
});
|
||||
|
||||
/* 기본 메시지 버튼 */
|
||||
var defaultButton = $('.template-message__footer .manage-btn-container button');
|
||||
defaultButton.click(function() {
|
||||
var formDtlDvCd = parseInt($(this).data('value'));
|
||||
|
||||
switch(formDvCd){
|
||||
case "FORM_DV_BBS":
|
||||
fn_set_defaultMessage($(this), defaultMsgList[formDtlDvCdLength[0]+formDtlDvCd-1]);
|
||||
break;
|
||||
case "FORM_DV_CMMN":
|
||||
fn_set_defaultMessage($(this), defaultMsgList[formDtlDvCdLength[1]+formDtlDvCd-1]);
|
||||
break;
|
||||
case "FORM_DV_DLVY":
|
||||
fn_set_defaultMessage($(this), defaultMsgList[formDtlDvCdLength[2]+formDtlDvCd-1]);
|
||||
break;
|
||||
case "FORM_DV_MBR":
|
||||
fn_set_defaultMessage($(this), defaultMsgList[formDtlDvCdLength[3]+formDtlDvCd-1]);
|
||||
break;
|
||||
case "FORM_DV_ORDR":
|
||||
fn_set_defaultMessage($(this), defaultMsgList[formDtlDvCdLength[4]+formDtlDvCd-1]);
|
||||
break;
|
||||
case "FORM_DV_REMND":
|
||||
fn_set_defaultMessage($(this), defaultMsgList[formDtlDvCdLength[5]+formDtlDvCd-1]);
|
||||
break;
|
||||
}
|
||||
});
|
||||
|
||||
let substitutionList = [];
|
||||
let defaultMsgList = [];
|
||||
let formDtlDvCdLength = [];
|
||||
|
||||
/*게시판(FORM_DV_BBS)*/
|
||||
formDtlDvCdLength.push(substitutionList.length);
|
||||
//게시글 등록(01)
|
||||
substitutionList.push(["sopmalCd", "shopName", "bbsNm"]);
|
||||
defaultMsgList.push("기본 메시지 정의되지 않음");
|
||||
//게시글 답변(02)
|
||||
substitutionList.push(["sopmalCd", "shopName", "bbsNm"]);
|
||||
defaultMsgList.push("기본 메시지 정의되지 않음");
|
||||
|
||||
/*공통(FORM_DV_CMMN)*/
|
||||
formDtlDvCdLength.push(substitutionList.length);
|
||||
//혜택 정보 수신동의 여부 확인(01)
|
||||
substitutionList.push(["sopmalCd", "shopName", "shopDomain", "user_name", "marktRecptnAgreAt", "marktRecptnAgreUpdtDt", "cscTelnb", "rejectTelnb"]);
|
||||
defaultMsgList.push("기본 메시지 정의되지 않음");
|
||||
//혜택 정보 수신동의 변경 결과(02)
|
||||
substitutionList.push(["sopmalCd", "shopName", "shopDomain", "user_name", "marktRecptnAgreAt", "marktRecptnAgreUpdtDt", "cscTelnb", "rejectTelnb"]);
|
||||
defaultMsgList.push("기본 메시지 정의되지 않음");
|
||||
//(비회원 구매자) 혜택 정보 수신동의 요청(03)
|
||||
substitutionList.push(["sopmalCd", "shopName", "shopDomain", "Nm", "agree_short_url"]);
|
||||
defaultMsgList.push("기본 메시지 정의되지 않음");
|
||||
//(비회원 구매자) 혜택 정보 수신동의 결과(04)
|
||||
substitutionList.push(["NONE"]);
|
||||
defaultMsgList.push("기본 메시지 정의되지 않음");
|
||||
|
||||
/*배송(FORM_DV_DLVY)*/
|
||||
formDtlDvCdLength.push(substitutionList.length);
|
||||
//출고 완료(주문자)(01)
|
||||
substitutionList.push(["sopmalCd", "shopName", "ordno", "go_Item", "delivery_company", "delivery_number", "order_user", "recipient_user"]);
|
||||
defaultMsgList.push("[{shopName}] 주문({ordno})하신 상품({go_item})이 발송({delivery_company} {delivery_number})되었습니다.");
|
||||
//배송완료(주문자)(02)
|
||||
substitutionList.push(["sopmalCd", "shopName", "ordno", "go_Item", "delivery_company", "delivery_number", "order_user", "recipient_user"]);
|
||||
defaultMsgList.push("[{shopName}] 주문({ordno})하신 상품({go_item})이 배송되었습니다.");
|
||||
//출고 완료(받는분)(03)
|
||||
substitutionList.push(["sopmalCd", "shopName", "ordno", "go_Item", "delivery_company", "delivery_number", "order_user", "recipient_user"]);
|
||||
defaultMsgList.push("[{shopName}]에서 {order_user}님이 {recipient_user}에게 주문한 상품이 발송되었습니다.");
|
||||
//배송완료(받는분)(04)
|
||||
substitutionList.push(["sopmalCd", "shopName", "ordno", "go_Item", "delivery_company", "delivery_number", "order_user", "recipient_user"]);
|
||||
defaultMsgList.push("[{shopName}]에서 {order_user}님이 {recipient_user}에게 주문한 상품이 배송완료되었습니다.");
|
||||
|
||||
/*회원(FORM_DV_MBR)*/
|
||||
formDtlDvCdLength.push(substitutionList.length);
|
||||
//회원 가입(01)
|
||||
substitutionList.push(["sopmalCd", "shopName", "user_name"]);
|
||||
defaultMsgList.push("[{shopName}] 회원 가입을 환영합니다.");
|
||||
//회원 탈퇴(02)
|
||||
substitutionList.push(["sopmalCd", "shopName", "userid", "withdrawalDt"]);
|
||||
defaultMsgList.push("[{shopName}] 회원 탈퇴가 처리되었습니다.");
|
||||
//아이디 찾기(03)
|
||||
substitutionList.push(["sopmalCd", "shopName", "userid"]);
|
||||
defaultMsgList.push("[{shopName}] 문의하신 아이디는 {userid} 입니다.");
|
||||
//비밀번호 찾기(04)
|
||||
substitutionList.push(["sopmalCd", "shopName", "passsword"]);
|
||||
defaultMsgList.push("[{shopName}] 요청하신 임시 비밀번호는 {password} 입니다.");
|
||||
//개인인증번호 확인(05)
|
||||
substitutionList.push(["sopmalCd", "shopName", "authnum"]);
|
||||
defaultMsgList.push("기본 메시지 정의되지 않음");
|
||||
//장기 미구매 고객 대상 쿠폰(06)
|
||||
substitutionList.push(["NONE"]);
|
||||
defaultMsgList.push("기본 메시지 정의되지 않음");
|
||||
//생일 쿠폰(07)
|
||||
substitutionList.push(["NONE"]);
|
||||
defaultMsgList.push("기본 메시지 정의되지 않음");
|
||||
|
||||
/*주문(FORM_DV_ORDR)*/
|
||||
formDtlDvCdLength.push(substitutionList.length);
|
||||
//주문 접수(01)
|
||||
substitutionList.push(["sopmalCd", "shopName", "ord_Item", "ordno", "bank_Account", "settleprice"]);
|
||||
defaultMsgList.push("[{shopName}] {ord_item}의 주문({ordno})이 접수되었습니다."+"\n입금안내 : {bank_account} {settleprice}");
|
||||
//결제 확인(02)
|
||||
substitutionList.push(["sopmalCd", "shopName", "orderUser", "ord_Item", "ordno", "ordDate", "ordPrice"]);
|
||||
defaultMsgList.push("[{shopName}] {ord_item}의 주문({ordno})이 결제확인({settle_kind} {settleprice})되었습니다.");
|
||||
//환불 완료(취소)(03)
|
||||
substitutionList.push(["sopmalCd", "shopName"]);
|
||||
defaultMsgList.push("[{shopName}] 결제취소 상품({repay_item})이 취소되었습니다.");
|
||||
//환불 완료(반품)(04)
|
||||
substitutionList.push(["sopmalCd", "shopName"]);
|
||||
defaultMsgList.push("[{shopName}] 반품 상품({repay_item})이 환불되었습니다.");
|
||||
//입금 요청(05)
|
||||
substitutionList.push(["sopmalCd", "shopName", "ord_Item", "ordno", "bank_Account", "settleprice"]);
|
||||
defaultMsgList.push("기본 메시지 정의되지 않음");
|
||||
//선물하기 안내(06)
|
||||
substitutionList.push(["NONE"]);
|
||||
defaultMsgList.push("기본 메시지 정의되지 않음");
|
||||
|
||||
/*고객리마인드(FORM_DV_REMND)*/
|
||||
formDtlDvCdLength.push(substitutionList.length);
|
||||
//회원 멤버쉽 등급변경(01)
|
||||
substitutionList.push(["shopName", "user_name", "mbrgradNm", "mypage_short_url", "cscTelnb", "rejectTelnb"]);
|
||||
defaultMsgList.push("기본 메시지 정의되지 않음");
|
||||
//상품 리뷰 작성 유도(02)
|
||||
substitutionList.push(["shopName", "user_name", "ordrInnb", "goodsNm", "mypage_short_url", "cscTelnb", "rejectTelnb"]);
|
||||
defaultMsgList.push("기본 메시지 정의되지 않음");
|
||||
//만료 쿠폰(03)
|
||||
substitutionList.push(["shopName", "userid", "user_name", "coupon_count", "mypage_short_url"]);
|
||||
defaultMsgList.push("기본 메시지 정의되지 않음");
|
||||
//소멸 예정 마일리지(04)
|
||||
substitutionList.push(["shopName", "user_name", "mileage_rest", "mypage_short_url"]);
|
||||
defaultMsgList.push("기본 메시지 정의되지 않음");
|
||||
//생일 축하(05)
|
||||
substitutionList.push(["shopName", "user_name", "coupNm", "validpdBgnDt", "validpdEndDt", "mypage_short_url", "cscTelnb", "rejectTelnb"]);
|
||||
defaultMsgList.push("기본 메시지 정의되지 않음");
|
||||
//장바구니 상품(06)
|
||||
substitutionList.push(["shopName", "user_name", "goodsNm", "mypage_short_url", "cscTelnb", "rejectTelnb"]);
|
||||
defaultMsgList.push("기본 메시지 정의되지 않음");
|
||||
//정수기 필터 교체 알림(07)
|
||||
substitutionList.push(["NONE"]);
|
||||
defaultMsgList.push("기본 메시지 정의되지 않음");
|
||||
//장바구니 타임세일(08)
|
||||
substitutionList.push(["shopName", "user_name", "goodsNm", "mypage_short_url", "cscTelnb", "rejectTelnb"]);
|
||||
defaultMsgList.push("기본 메시지 정의되지 않음");
|
||||
});
|
||||
|
||||
$('.textarea').on('input', updateByteCount);
|
||||
</script>
|
||||
<section class="content-section">
|
||||
<div class="tab-box">
|
||||
<c:choose>
|
||||
<c:when test="${ not empty resultListMap.groupCd}">
|
||||
<c:forEach items="${ resultListMap.groupCd }" var="list" varStatus="status">
|
||||
<button type="button" class="tab-box__btn" onclick="fn_select_AtmcSndngTmplat(this.value)" value="<c:out value="${list.groupCd}"/>_<c:out value="${list.cd}"/>"><c:out value="${list.cdNm}"/></button>
|
||||
</c:forEach>
|
||||
</c:when>
|
||||
<c:otherwise>
|
||||
<tr>
|
||||
<td colspan="100%"><spring:message code="common.nodata"/></td>
|
||||
</tr>
|
||||
</c:otherwise>
|
||||
</c:choose>
|
||||
<a href="#common-substitution-pop" rel="modal:open"
|
||||
class="btn sm outline" style="margin-left: auto;">
|
||||
<i class="icon icon_info"></i>
|
||||
공통 치환 코드
|
||||
</a>
|
||||
</div>
|
||||
<div class="tab-box__content">
|
||||
<div class="template-message__container">
|
||||
<c:choose>
|
||||
<c:when test="${ not empty resultListMap.boCtrlMap}">
|
||||
<c:forEach items="${ resultListMap.boCtrlMap }" var="list" varStatus="status">
|
||||
<div class="template-message">
|
||||
<div class="template-message__header">
|
||||
<c:out value="${list.cdNm}"/>
|
||||
<!-- <span class="btn gray ml-2 xxsm">알림톡 X</span> -->
|
||||
</div>
|
||||
<div class="template-message__body">
|
||||
<div class="sms-manage">
|
||||
<input type="hidden" name="formDtlDvCd" value="<c:out value="${list.formDtlDvCd}"/>">
|
||||
<input type="hidden" name="formDvCd" value="<c:out value="${list.formDvCd}"/>">
|
||||
<textarea class="default" title="sms 기본 메시지" style="display : none"><c:out value="${list.smsCn}"/></textarea>
|
||||
<textarea class="textarea" title="sms 입력" name="smsCn"><c:out value="${list.smsCn}"/></textarea>
|
||||
<div class="sms-manage__byte">
|
||||
<span class="number">0</span>
|
||||
<span class="text">byte</span>
|
||||
</div>
|
||||
</div>
|
||||
<!-- <div class="b-checkbox-container justify-end mt-8 mb-5 mr-2">
|
||||
<label class="b-checkbox checkbox">
|
||||
<input type="checkbox" value="">
|
||||
<span class="check"></span>
|
||||
<span class="control-label">고객</span>
|
||||
</label>
|
||||
</div> -->
|
||||
</div>
|
||||
<div class="template-message__footer">
|
||||
<div class="manage-btn-container">
|
||||
<a href="#substitution-pop" rel="modal:open" class="btn sm outline" data-value="<c:out value="${list.formDtlDvCd}"/>">
|
||||
<i class="icon icon_info"></i>
|
||||
치환 코드
|
||||
</a>
|
||||
<button type="button" class="btn sm dark" data-value="<c:out value="${list.formDtlDvCd}"/>">
|
||||
기본 메시지
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</c:forEach>
|
||||
</c:when>
|
||||
<c:otherwise>
|
||||
<tr>
|
||||
<td colspan="100%"><spring:message code="common.nodata"/></td>
|
||||
</tr>
|
||||
</c:otherwise>
|
||||
</c:choose>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
@@ -0,0 +1,104 @@
|
||||
<%@ 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 : NtcntalkAtmcSndngTmplatU.jsp
|
||||
Description : 알림톡 템플릿 관리
|
||||
Modification Information
|
||||
|
||||
수정일 수정자 수정내용
|
||||
------- -------- ---------------------------
|
||||
2024-02-21 리브가 최초 생성
|
||||
2024-05-07 이대환 Email>Ntcntalk 분리
|
||||
--%>
|
||||
<script>
|
||||
$(document).ready(function() {
|
||||
$('.textarea').each(updateByteCount);
|
||||
|
||||
/* 탭 박스 임시방편 */
|
||||
var formDvCd = $("#formDvCd").val();
|
||||
var radioButtons = $(".tab-box__btn");
|
||||
|
||||
radioButtons.each(function() {
|
||||
if ($(this).val() === formDvCd) {
|
||||
$(this).addClass("current")
|
||||
}else{
|
||||
$(this).removeClass("current")
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
$('.textarea').on('input', updateByteCount);
|
||||
</script>
|
||||
<section class="content-section">
|
||||
<div class="tab-box">
|
||||
<c:choose>
|
||||
<c:when test="${ not empty resultListMap.groupCd}">
|
||||
<c:forEach items="${ resultListMap.groupCd }" var="list" varStatus="status">
|
||||
<button type="button" class="tab-box__btn" onclick="fn_select_AtmcSndngTmplat(this.value)" value="<c:out value="${list.groupCd}"/>_<c:out value="${list.cd}"/>"><c:out value="${list.cdNm}"/></button>
|
||||
</c:forEach>
|
||||
</c:when>
|
||||
<c:otherwise>
|
||||
<tr>
|
||||
<td colspan="100%"><spring:message code="common.nodata"/></td>
|
||||
</tr>
|
||||
</c:otherwise>
|
||||
</c:choose>
|
||||
</div>
|
||||
<div class="tab-box__content">
|
||||
<div class="template-message__container">
|
||||
<c:choose>
|
||||
<c:when test="${ not empty resultListMap.boCtrlMap}">
|
||||
<c:forEach items="${ resultListMap.boCtrlMap }" var="list" varStatus="status">
|
||||
<div class="template-message">
|
||||
<div class="template-message__header">
|
||||
<c:out value="${list.cdNm}"/>
|
||||
<%-- <c:if test="${list.smsRplcAt eq 'Y'}"><button type="button" class="btn primary outline ml-2 xxsm" onclick="fn_switch_smsRplcAt(this)">문자 ON</button></c:if>
|
||||
<c:if test="${list.smsRplcAt ne 'Y'}"><button type="button" class="btn dark outline ml-2 xxsm" onclick="fn_switch_smsRplcAt(this)">문자 OFF</button></c:if> --%>
|
||||
<c:if test="${list.smsRplcAt eq 'Y'}"><span class="btn primary outline ml-2 xxsm">문자 ON</span></c:if>
|
||||
<c:if test="${list.smsRplcAt ne 'Y'}"><span class="btn dark outline ml-2 xxsm">문자 OFF</span></c:if>
|
||||
</div>
|
||||
<div class="template-message__body">
|
||||
<div class="sms-manage">
|
||||
<%-- <textarea class="textarea" title="알림톡 입력" name="msg"><c:out value="${list.msg}"/></textarea> --%>
|
||||
<textarea class="textarea" title="알림톡 입력" name="msg" readonly><c:out value="${list.msg}"/></textarea>
|
||||
</div>
|
||||
<br>
|
||||
알림톡 실패시 대체 SMS 사용
|
||||
<%-- <div class="sms-manage smsRplc" <c:if test="${list.smsRplcAt ne 'Y'}">style="background-color : #f8f9fa"</c:if>> --%>
|
||||
<div class="sms-manage smsRplc">
|
||||
<%-- <textarea class="textarea" title="대체문자 입력" name="smsRplcCn" <c:if test="${list.smsRplcAt ne 'Y'}">style="cursor: not-allowed" readonly</c:if>><c:out value="${list.smsCn}"/></textarea> --%>
|
||||
<textarea class="textarea" title="대체문자 입력" name="smsRplcCn" readonly><c:out value="${list.smsCn}"/></textarea>
|
||||
<div class="sms-manage__byte">
|
||||
<span class="number">0</span>
|
||||
<span class="text">byte</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="template-message__footer">
|
||||
<div class="manage-btn-container">
|
||||
<a class="btn sm dark" onclick="fn_open_modal('#ntcntalkAtmcSndngTmplatUpdtPopupDiv',
|
||||
'#ntcntalkAtmcSndngTmplatUpdtPopup',
|
||||
'/mngr/ntcn/tmplt/selectNtcntalkAtmcSndngTmplatUpdtPopupForm',
|
||||
'formDvCd=${list.formDvCd}&formDtlDvCd=${list.formDtlDvCd}'); return false;" style="cursor : pointer;">
|
||||
<i class="icon icon_pencil"></i>
|
||||
메시지 수정
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</c:forEach>
|
||||
</c:when>
|
||||
<c:otherwise>
|
||||
<tr>
|
||||
<td colspan="100%"><spring:message code="common.nodata"/></td>
|
||||
</tr>
|
||||
</c:otherwise>
|
||||
</c:choose>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
@@ -0,0 +1,315 @@
|
||||
<%@ 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 : NtcntalkAtmcSndngTmplatUpdtPopupU.jsp
|
||||
Description : 메시지 자동 발송 상세
|
||||
Modification Information
|
||||
|
||||
수정일 수정자 수정내용
|
||||
------- -------- ---------------------------
|
||||
2024.05.16 이대환 최초 생성
|
||||
--%>
|
||||
<script src="<c:url value='/mngr/js/script.js'/>" defer></script> <!-- MNGR 스크립트 함수 -->
|
||||
<script src="<c:url value='/js/gcone.js'/>"></script> <!-- 공통 스크립트 함수 -->
|
||||
<script>
|
||||
$(document).ready(function() {
|
||||
$('.textarea').each(updateByteCount);
|
||||
$('textarea[name="msg"]').each(updatePreview);
|
||||
|
||||
/* 알림톡 대체문자 사용여부 체크박스 */
|
||||
var checkboxContainer = $('.modal .b-checkbox-container');
|
||||
var checkbox = checkboxContainer.find('input[type="checkbox"]');
|
||||
var checkboxVal = checkboxContainer.find('input[type="hidden"]');
|
||||
var smsRplcDiv = checkboxContainer.parent().find('.smsRplc');
|
||||
|
||||
checkbox.change(function() {
|
||||
if ($(this).prop('checked')) {
|
||||
checkboxVal.val('Y');
|
||||
smsRplcDiv.css('background-color', '');
|
||||
} else {
|
||||
checkboxVal.val('N');
|
||||
smsRplcDiv.css('background-color', '#f8f9fa');
|
||||
}
|
||||
|
||||
var smsRplcCn = smsRplcDiv.find('textarea[name="smsCn"]');
|
||||
smsRplcCn.prop('readonly', !smsRplcCn.prop('readonly'));
|
||||
smsRplcCn.css('cursor', smsRplcCn.css('cursor') === 'not-allowed' ? '' : 'not-allowed');
|
||||
});
|
||||
|
||||
/* 치환코드 하드코딩 */
|
||||
var modalLink = $('a[href="#substitution-pop"]');
|
||||
modalLink.click(function() {
|
||||
var formDtlDvCd = parseInt($(this).data('value'));
|
||||
|
||||
switch($("#formDvCd").val()){
|
||||
case "FORM_DV_BBS":
|
||||
fn_swith_SubModal(substitutionList[formDtlDvCdLength[0]+formDtlDvCd-1]);
|
||||
break;
|
||||
case "FORM_DV_CMMN":
|
||||
fn_swith_SubModal(substitutionList[formDtlDvCdLength[1]+formDtlDvCd-1]);
|
||||
break;
|
||||
case "FORM_DV_DLVY":
|
||||
fn_swith_SubModal(substitutionList[formDtlDvCdLength[2]+formDtlDvCd-1]);
|
||||
break;
|
||||
case "FORM_DV_MBR":
|
||||
fn_swith_SubModal(substitutionList[formDtlDvCdLength[3]+formDtlDvCd-1]);
|
||||
break;
|
||||
case "FORM_DV_ORDR":
|
||||
fn_swith_SubModal(substitutionList[formDtlDvCdLength[4]+formDtlDvCd-1]);
|
||||
break;
|
||||
case "FORM_DV_REMND":
|
||||
fn_swith_SubModal(substitutionList[formDtlDvCdLength[5]+formDtlDvCd-1]);
|
||||
break;
|
||||
}
|
||||
});
|
||||
|
||||
let substitutionList = [];
|
||||
let formDtlDvCdLength = [];
|
||||
|
||||
/*게시판(FORM_DV_BBS)*/
|
||||
formDtlDvCdLength.push(substitutionList.length);
|
||||
//게시글 등록(01)
|
||||
substitutionList.push(["sopmalCd", "shopName", "bbsNm"]);
|
||||
//게시글 답변(02)
|
||||
substitutionList.push(["sopmalCd", "shopName", "bbsNm"]);
|
||||
|
||||
/*공통(FORM_DV_CMMN)*/
|
||||
formDtlDvCdLength.push(substitutionList.length);
|
||||
//혜택 정보 수신동의 여부 확인(01)
|
||||
substitutionList.push(["sopmalCd", "shopName", "shopDomain", "user_name", "marktRecptnAgreAt", "marktRecptnAgreUpdtDt", "cscTelnb", "rejectTelnb"]);
|
||||
//혜택 정보 수신동의 변경 결과(02)
|
||||
substitutionList.push(["sopmalCd", "shopName", "shopDomain", "user_name", "marktRecptnAgreAt", "marktRecptnAgreUpdtDt", "cscTelnb", "rejectTelnb"]);
|
||||
//(비회원 구매자) 혜택 정보 수신동의 요청(03)
|
||||
substitutionList.push(["sopmalCd", "shopName", "shopDomain", "Nm", "agree_short_url"]);
|
||||
//(비회원 구매자) 혜택 정보 수신동의 결과(04)
|
||||
substitutionList.push(["NONE"]);
|
||||
|
||||
/*배송(FORM_DV_DLVY)*/
|
||||
formDtlDvCdLength.push(substitutionList.length);
|
||||
//출고 완료(주문자)(01)
|
||||
substitutionList.push(["sopmalCd", "shopName", "ordno", "go_Item", "delivery_company", "delivery_number", "order_user", "recipient_user"]);
|
||||
//배송완료(주문자)(02)
|
||||
substitutionList.push(["sopmalCd", "shopName", "ordno", "go_Item", "delivery_company", "delivery_number", "order_user", "recipient_user"]);
|
||||
//출고 완료(받는분)(03)
|
||||
substitutionList.push(["sopmalCd", "shopName", "ordno", "go_Item", "delivery_company", "delivery_number", "order_user", "recipient_user"]);
|
||||
//배송완료(받는분)(04)
|
||||
substitutionList.push(["sopmalCd", "shopName", "ordno", "go_Item", "delivery_company", "delivery_number", "order_user", "recipient_user"]);
|
||||
|
||||
/*회원(FORM_DV_MBR)*/
|
||||
formDtlDvCdLength.push(substitutionList.length);
|
||||
//회원 가입(01)
|
||||
substitutionList.push(["sopmalCd", "shopName", "user_name"]);
|
||||
//회원 탈퇴(02)
|
||||
substitutionList.push(["sopmalCd", "shopName", "userid", "withdrawalDt"]);
|
||||
//아이디 찾기(03)
|
||||
substitutionList.push(["sopmalCd", "shopName", "userid"]);
|
||||
//비밀번호 찾기(04)
|
||||
substitutionList.push(["sopmalCd", "shopName", "passsword"]);
|
||||
//개인인증번호 확인(05)
|
||||
substitutionList.push(["sopmalCd", "shopName", "authnum"]);
|
||||
//장기 미구매 고객 대상 쿠폰(06)
|
||||
substitutionList.push(["NONE"]);
|
||||
//생일 쿠폰(07)
|
||||
substitutionList.push(["NONE"]);
|
||||
|
||||
/*주문(FORM_DV_ORDR)*/
|
||||
formDtlDvCdLength.push(substitutionList.length);
|
||||
//주문 접수(01)
|
||||
substitutionList.push(["sopmalCd", "shopName", "ord_Item", "ordno", "bank_Account", "settleprice"]);
|
||||
//결제 확인(02)
|
||||
substitutionList.push(["sopmalCd", "shopName", "orderUser", "ord_Item", "ordno", "ordDate", "ordPrice"]);
|
||||
//환불 완료(취소)(03)
|
||||
substitutionList.push(["sopmalCd", "shopName"]);
|
||||
//환불 완료(반품)(04)
|
||||
substitutionList.push(["sopmalCd", "shopName"]);
|
||||
//입금 요청(05)
|
||||
substitutionList.push(["sopmalCd", "shopName", "ord_Item", "ordno", "bank_Account", "settleprice"]);
|
||||
//선물하기 안내(06)
|
||||
substitutionList.push(["NONE"]);
|
||||
|
||||
/*고객리마인드(FORM_DV_REMND)*/
|
||||
formDtlDvCdLength.push(substitutionList.length);
|
||||
//회원 멤버쉽 등급변경(01)
|
||||
substitutionList.push(["shopName", "user_name", "mbrgradNm", "mypage_short_url", "cscTelnb", "rejectTelnb"]);
|
||||
//상품 리뷰 작성 유도(02)
|
||||
substitutionList.push(["shopName", "user_name", "ordrInnb", "goodsNm", "mypage_short_url", "cscTelnb", "rejectTelnb"]);
|
||||
//만료 쿠폰(03)
|
||||
substitutionList.push(["shopName", "userid", "user_name", "coupon_count", "mypage_short_url"]);
|
||||
//소멸 예정 마일리지(04)
|
||||
substitutionList.push(["shopName", "user_name", "mileage_rest", "mypage_short_url"]);
|
||||
//생일 축하(05)
|
||||
substitutionList.push(["shopName", "user_name", "coupNm", "validpdBgnDt", "validpdEndDt", "mypage_short_url", "cscTelnb", "rejectTelnb"]);
|
||||
//장바구니 상품(06)
|
||||
substitutionList.push(["shopName", "user_name", "goodsNm", "mypage_short_url", "cscTelnb", "rejectTelnb"]);
|
||||
//정수기 필터 교체 알림(07)
|
||||
substitutionList.push(["NONE"]);
|
||||
//장바구니 타임세일(08)
|
||||
substitutionList.push(["shopName", "user_name", "goodsNm", "mypage_short_url", "cscTelnb", "rejectTelnb"]);
|
||||
});
|
||||
|
||||
$('.textarea').on('input', updateByteCount);
|
||||
$('textarea[name="msg"]').on('input', updatePreview);
|
||||
$('select[name="btnType"]').trigger('change');
|
||||
</script>
|
||||
<div id="ntcntalkAtmcSndngTmplatUpdtPopup" class="modal" style="max-width: 960px;">
|
||||
<div class="modal-header">
|
||||
<h4>알림톡 메시지 수정</h4>
|
||||
</div>
|
||||
<div class="modal-content">
|
||||
<div class="message-edit__wrapper">
|
||||
<div class="table-wrapper">
|
||||
<form id="ntcntalkPopup">
|
||||
<input type="hidden" name="tmplatList" id="ntcnTmplatList" value=""/>
|
||||
<input type="hidden" name="formDvCd" value="<c:out value="${resultMap.bOTmpltVO.formDvCd}"/>">
|
||||
<input type="hidden" name="formDtlDvCd" value="<c:out value="${resultMap.bOTmpltVO.formDtlDvCd}"/>">
|
||||
<table class="table vertical">
|
||||
<caption>해당 테이블에 대한 설명</caption>
|
||||
<colgroup>
|
||||
<col>
|
||||
</colgroup>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>
|
||||
<c:set var="boCtrlMap" value="${resultMap.boCtrlMap}"/>
|
||||
<c:out value="${boCtrlMap.cdNm}"/>
|
||||
</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>
|
||||
<div class="form-control-container mb-5">
|
||||
<div class="left">
|
||||
<h3 class="content-section__inner-title mb-0">내용</h3>
|
||||
</div>
|
||||
<div class="center">
|
||||
</div>
|
||||
<div class="right">
|
||||
<a href="#substitution-pop" rel="modal:open" class="btn sm outline" data-value="<c:out value="${resultMap.bOTmpltVO.formDtlDvCd}"/>">
|
||||
<i class="icon icon_info"></i>
|
||||
치환 코드
|
||||
</a>
|
||||
<a href="#common-substitution-pop" rel="modal:open"
|
||||
class="btn sm outline">
|
||||
<i class="icon icon_info"></i>
|
||||
공통 치환 코드
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="sms-manage">
|
||||
<textarea class="textarea" title="sms 입력" name="msg"><c:out value="${boCtrlMap.msg}"/></textarea>
|
||||
<div class="d-flex justify-end gray-7">
|
||||
<span class="count">0</span>
|
||||
<span class="mx-4">/</span>
|
||||
<span>1000</span>
|
||||
<span class="ml-4">자</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="b-checkbox-container mt-8 ml-2">
|
||||
<label class="b-checkbox checkbox">
|
||||
<input type="checkbox" value="" <c:if test="${boCtrlMap.smsRplcAt eq 'Y'}">checked</c:if>>
|
||||
<span class="check"></span>
|
||||
<span class="control-label">알림톡 실패시 대체 SMS 사용</span>
|
||||
</label>
|
||||
<input type="hidden" name="smsRplcAt" value="<c:out value="${boCtrlMap.smsRplcAt}"/>">
|
||||
</div>
|
||||
<div class="sms-manage smsRplc" <c:if test="${boCtrlMap.smsRplcAt ne 'Y'}">style="background-color : #f8f9fa"</c:if>>
|
||||
<textarea class="textarea" title="대체문자 입력" name="smsCn" <c:if test="${boCtrlMap.smsRplcAt ne 'Y'}">style="cursor: not-allowed" readonly</c:if>><c:out value="${boCtrlMap.smsCn}"/></textarea>
|
||||
<div class="sms-manage__byte">
|
||||
<span class="number">0</span>
|
||||
<span class="text">byte</span>
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="100%">
|
||||
<div style="float : left; display: inline-block;">
|
||||
<span>버튼은 최대 5개까지 사용 가능합니다.</span>
|
||||
<!-- (modal:
|
||||
<a href="#info02" rel="modal:open">
|
||||
<i class="mini-info-btn mb-3" style="font-style: normal;">?</i>
|
||||
</a>
|
||||
info:
|
||||
<button class="mini-info-btn mb-3" data-info="info01">?</button>
|
||||
버튼안내 팝업 삭제) -->
|
||||
</div>
|
||||
<div style="float:right; display: inline-block;">
|
||||
<button type="button" class="circle-btn add" onclick="fn_add_buttonRow()"><span class="visually-hidden">추가</span></button>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<c:forEach var="i" begin="1" end="5">
|
||||
<c:set var="btnType" value="btnType0${i}"/>
|
||||
<c:set var="btnNm" value="btnNm0${i}"/>
|
||||
<c:set var="btnUrl01" value="btn0${i}Url01"/>
|
||||
<c:set var="btnUrl02" value="btn0${i}Url02"/>
|
||||
<c:if test="${not empty boCtrlMap[btnType]}">
|
||||
<tr>
|
||||
<td>
|
||||
<div class="talk-edit-row">
|
||||
<div class="select-box select-show-trigger">
|
||||
<select name="btnType" title="해당 셀렉트에 대한 설명">
|
||||
<option value="WL" <c:if test="${boCtrlMap[btnType] eq 'WL'}">selected</c:if>>버튼 링크</option>
|
||||
<option value="DS" <c:if test="${boCtrlMap[btnType] eq 'DS'}">selected</c:if>>배송 조회</option>
|
||||
</select>
|
||||
</div>
|
||||
<input class="WL input-text" type="text" name="btnNm" title="해당 인풋에 대한 설명" placeholder="버튼명(최대 28자)" maxlength="28"
|
||||
value="<c:out value="${boCtrlMap[btnNm]}"/>" <c:if test="${boCtrlMap[btnType] eq 'DS'}">style="display: none;"</c:if>>
|
||||
<input class="WL input-text xl" type="text" name="btnPcUrl" title="해당 인풋에 대한 설명" placeholder="링크주소"
|
||||
value="<c:out value="${boCtrlMap[btnUrl02]}"/>" <c:if test="${boCtrlMap[btnType] eq 'DS'}">style="display: none;"</c:if>>
|
||||
<input class="WL input-text xl" type="text" name="btnMUrl" title="해당 인풋에 대한 설명" placeholder="모바일 링크주소"
|
||||
value="<c:out value="${boCtrlMap[btnUrl01]}"/>" <c:if test="${boCtrlMap[btnType] eq 'DS'}">style="display: none;"</c:if>>
|
||||
<span class="DS w-full" <c:if test="${boCtrlMap[btnType] eq 'WL'}">style="display: none;"</c:if>>배송조회는 버튼 링크를 포함하지 않습니다.</span>
|
||||
<button class="circle-btn delete" onclick="fn_remove_buttonRow(this)"><span class="visually-hidden">삭제</span></button>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</c:if>
|
||||
</c:forEach>
|
||||
</tbody>
|
||||
</table>
|
||||
</form>
|
||||
</div>
|
||||
<div class="message-edit__right">
|
||||
<div class="message-edit-preview">
|
||||
<div class="message-edit-preview__image">
|
||||
<img src="/mngr/images/image_talk.jpg" alt="">
|
||||
</div>
|
||||
<div class="message-edit-preview__content">
|
||||
<div class="message-edit-preview__header">알림톡 도착</div>
|
||||
<div class="message-edit-preview__body">
|
||||
<textarea title="알림톡 내용" readonly></textarea>
|
||||
</div>
|
||||
<div class="message-edit-preview__footer">
|
||||
<c:forEach var="i" begin="1" end="5">
|
||||
<c:set var="btnType" value="btnType0${i}"/>
|
||||
<c:set var="btnNm" value="btnNm0${i}"/>
|
||||
<c:if test="${not empty boCtrlMap[btnType]}">
|
||||
<a href="#" class="message-edit-preview__footer-item">
|
||||
<c:if test="${boCtrlMap[btnType] eq 'WL'}">
|
||||
<c:if test="${not empty boCtrlMap[btnNm]}">
|
||||
<c:out value="${boCtrlMap[btnNm]}"/>
|
||||
</c:if>
|
||||
<c:if test="${empty boCtrlMap[btnNm]}">버튼 링크</c:if>
|
||||
</c:if>
|
||||
<c:if test="${boCtrlMap[btnType] eq 'DS'}">배송 조회</c:if>
|
||||
</a>
|
||||
</c:if>
|
||||
</c:forEach>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<a href="#" rel="modal:close" class="btn outline">취소</a>
|
||||
<button class="btn primary" onclick="fn_update_AtmcSndngTmplatForm('ntcntalkPopup')">저장하기</button>
|
||||
</div>
|
||||
</div>
|
||||
Reference in New Issue
Block a user