초기소스

This commit is contained in:
jazz
2025-10-29 17:08:05 +09:00
parent e531aa9540
commit 439a379a02
7551 changed files with 1234427 additions and 3 deletions

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>