초기소스
This commit is contained in:
477
src/main/webapp/WEB-INF/views/mngr/goods/prsnt/PrsntDtlU.jsp
Normal file
477
src/main/webapp/WEB-INF/views/mngr/goods/prsnt/PrsntDtlU.jsp
Normal file
@@ -0,0 +1,477 @@
|
||||
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
|
||||
<%@ page import="java.util.Date" %>
|
||||
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
|
||||
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
|
||||
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
|
||||
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
|
||||
<%@ taglib prefix="ui" uri="http://www.winbit.kr/ctl/ui" %>
|
||||
<%--
|
||||
Class Name : PrsntDtlU.jsp
|
||||
Description : 사은품 상세 조회 화면
|
||||
Modification Information
|
||||
|
||||
수정일 수정자 수정내용
|
||||
------- -------- ---------------------------
|
||||
since : 2024.04.15 리브가 최초 생성
|
||||
--%>
|
||||
<!DOCTYPE html>
|
||||
<html lang="ko">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>GC ONE 관리자</title>
|
||||
<%-- 공통 include --%>
|
||||
<%@ include file="/WEB-INF/views/comm/mngr/Include.jsp"%>
|
||||
|
||||
<%--등록한 사진 순서 변경 관련 --%>
|
||||
<script defer src="https://code.jquery.com/ui/1.12.1/jquery-ui.min.js"></script>
|
||||
<style>
|
||||
#sortable {
|
||||
display: flex;
|
||||
list-style-type: none;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
overflow: hidden;
|
||||
}
|
||||
#sortable div.file-preview__container {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
margin-right: 10px;
|
||||
cursor: move;
|
||||
transition: transform 0.2s ease;
|
||||
user-select: none;
|
||||
}
|
||||
</style>
|
||||
|
||||
</head>
|
||||
<script>
|
||||
$(document).ready(function () {
|
||||
|
||||
// // 등록한 사진 순서 변경 관련
|
||||
$("#sortable").sortable({
|
||||
axis: "x"
|
||||
});
|
||||
$("#sortable").disableSelection();
|
||||
|
||||
});
|
||||
|
||||
/* ********************************************************
|
||||
* 수정 AJAX
|
||||
******************************************************** */
|
||||
const fn_regist = function () {
|
||||
const url = '<c:url value="/mngr/goods/prsnt/updatePrsntDtl"/>';
|
||||
|
||||
if(fn_is_empty($('#goodsNm').val())){
|
||||
$('#goodsNm').focus()
|
||||
alert('상품명을 입력해 주세요.')
|
||||
return;
|
||||
}
|
||||
|
||||
if(fn_is_empty($('input[name="goodsCd"]').val())){
|
||||
$('input[name="goodsCd"]').focus()
|
||||
alert('상품코드를 입력해 주세요.')
|
||||
return;
|
||||
}
|
||||
|
||||
const invntryPolicyCd = $('input[name="invntryPolicyCd"]:checked').val()
|
||||
|
||||
if(invntryPolicyCd ==='01' && fn_is_empty($('#invntryQy').val())){
|
||||
$('#invntryQy').focus()
|
||||
alert('재고수량을 입력해 주세요')
|
||||
return;
|
||||
|
||||
}
|
||||
|
||||
const formData = new FormData();
|
||||
const listForm = document.getElementById('listForm')
|
||||
|
||||
// '#invntryQy' 입력란에서 콤마 제거
|
||||
let invntryQyValue = $('#invntryQy').val();
|
||||
$('#invntryQy').val(invntryQyValue.replace(/,/g, ''));
|
||||
|
||||
// '#cnsmrpric' 입력란에서 콤마 제거
|
||||
let cnsmrpricValue = $('#cnsmrpric').val();
|
||||
$('#cnsmrpric').val(cnsmrpricValue.replace(/,/g, ''));
|
||||
|
||||
|
||||
|
||||
//선택한 재고정책
|
||||
const choiceInvntryPolicyCd = $('input[name="invntryPolicyCd"]:checked').val()
|
||||
const prevInvntryPolicyCd = $('#invntryPolicyCdAsIs').val()
|
||||
|
||||
//재고에 따른 판매(재고정책)가 수정되었을 경우
|
||||
if(choiceInvntryPolicyCd !== prevInvntryPolicyCd){
|
||||
alert('재고정책 변경에 따라 판매가능재고수량을 초기화합니다.')
|
||||
fn_create_input('hidden', 'usefulInvntryQyInit','Y', listForm)
|
||||
}
|
||||
|
||||
|
||||
//추가한 이미지 정보
|
||||
// 파일데이터 , 이미지 append
|
||||
var myDropzone = Dropzone.forElement("#my-dropzone");
|
||||
|
||||
let fileAt = 'N';
|
||||
myDropzone.files.forEach(function (file) {
|
||||
if(!fn_is_empty(file)){
|
||||
fileAt='Y'
|
||||
}
|
||||
});
|
||||
|
||||
//등록된 사진이 없거나 이미지삭제가 아닌경우
|
||||
if(fn_is_empty($('#hiddenForm_del_img')) && fn_is_empty($('#sortable div.file-preview__container')) && fileAt==='N'){
|
||||
alert('사은품 이미지를 등록해주세요');
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
|
||||
//삭제 이미지 정보
|
||||
let deleteImgId = $('#hiddenForm_del_img').find('input[name="deleteImgId"]');
|
||||
let cutNb = $('#hiddenForm_del_img').find('input[name="cutNb"]');
|
||||
|
||||
deleteImgId.each(function (idx) {
|
||||
fn_create_input('hidden', 'delGoodsImageVOList['+idx+'].delGoodsImgInnb', deleteImgId.eq(idx).val(), listForm)
|
||||
fn_create_input('hidden', 'delGoodsImageVOList['+idx+'].cutNb', cutNb.eq(idx).val(), listForm)
|
||||
fn_create_input('hidden', 'delGoodsImageVOList['+idx+'].goodsInnb', parseInt($('#goodsInnb').val()) , listForm)
|
||||
fn_create_input('hidden', 'delGoodsImageVOList['+idx+'].sopmalCd', $('#sopmalCd').val(), listForm)
|
||||
})
|
||||
|
||||
//등록된 이미지
|
||||
$('#sortable div.file-preview__container').each(function (idx) {
|
||||
|
||||
fn_create_input('hidden', 'goodsImageVOList['+idx+'].goodsImgInnb', $(this).find('input[name="goodsImgInnb"]').val(), listForm)
|
||||
fn_create_input('hidden', 'goodsImageVOList['+idx+'].cutNb', $(this).find('input[name="cutNb"]').val(), listForm)
|
||||
})
|
||||
|
||||
//파일데이터
|
||||
if(fileAt==='Y'){
|
||||
myDropzone.files.forEach(function (file) {
|
||||
formData.append('files', file); // 서버에서 파일을 받을 때 'files'라는 이름으로 전송
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
$('#listForm').serializeArray().forEach(function (item) {
|
||||
formData.append(item.name, item.value);
|
||||
});
|
||||
|
||||
|
||||
if (confirm('사은품을 <spring:message code="confirm.common.update"/>')) {
|
||||
$.ajax({
|
||||
type: 'post',
|
||||
enctype: 'multipart/form-data',
|
||||
url: url,
|
||||
data: formData,
|
||||
contentType: false,
|
||||
processData: false,
|
||||
success: function (data) {
|
||||
let str = JSON.parse(data.resBody.result);
|
||||
|
||||
if (str.result == 'success') {
|
||||
alert('<spring:message code="success.common.update"/>');
|
||||
window.location.reload();
|
||||
} else {
|
||||
alert('<spring:message code="fail.common.update"/>');
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
/* ********************************************************
|
||||
* 수정폼 이동
|
||||
******************************************************** */
|
||||
const fn_move_dtl_uptpage = function (Innb) {
|
||||
const url = '<c:url value="/mngr/goods/prsnt/selectPrsntDtlForm"/>';
|
||||
|
||||
$('#listForm').attr('action', url);
|
||||
$('#listForm').attr('method', 'get');
|
||||
$('#pageIndex').val(1);
|
||||
$('#goodsInnb').val(Innb);
|
||||
$('#listForm').submit();
|
||||
}
|
||||
|
||||
/* ********************************************************
|
||||
* 목록 조회
|
||||
******************************************************** */
|
||||
const fn_select_list = function () {
|
||||
const url = '<c:url value="/mngr/goods/prsnt/selectPrsntListForm"/>';
|
||||
|
||||
// '#invntryQy' 입력란에서 콤마 제거
|
||||
let invntryQyValue = $('#invntryQy').val();
|
||||
$('#invntryQy').val(invntryQyValue.replace(/,/g, ''));
|
||||
|
||||
// '#cnsmrpric' 입력란에서 콤마 제거
|
||||
let cnsmrpricValue = $('#cnsmrpric').val();
|
||||
$('#cnsmrpric').val(cnsmrpricValue.replace(/,/g, ''));
|
||||
|
||||
$('#listForm').attr('action', url);
|
||||
$('#listForm').attr('method', 'post');
|
||||
$('#listForm').submit();
|
||||
};
|
||||
|
||||
|
||||
//삭제된 이미지 번호 저장 폼
|
||||
let hiddenForm_del_img = document.createElement('form');
|
||||
hiddenForm_del_img.name = 'hiddenForm_del_img';
|
||||
hiddenForm_del_img.id = 'hiddenForm_del_img';
|
||||
hiddenForm_del_img.method = 'post';
|
||||
hiddenForm_del_img.action = '';
|
||||
|
||||
|
||||
//삭제 상품이미지 정보
|
||||
const deleteFileImg = function (obj) {
|
||||
|
||||
|
||||
const rmImg = $(obj).siblings('div.file-preview__image')
|
||||
const rmImgId = rmImg.children('input[name="goodsImgInnb"]').val()
|
||||
const cutNb = rmImg.children('input[name="cutNb"]').val()
|
||||
|
||||
|
||||
|
||||
fn_create_input('hidden', "deleteImgId", rmImgId, hiddenForm_del_img);
|
||||
fn_create_input('hidden', "cutNb", cutNb, hiddenForm_del_img);
|
||||
|
||||
document.body.append(hiddenForm_del_img);
|
||||
$(obj).parent('div.file-preview').parent('div.file-preview__container').remove()
|
||||
}
|
||||
|
||||
const fn_create_input = function (type, name, value, tgtForm) {
|
||||
const input = document.createElement('input');
|
||||
input.setAttribute("type", type);
|
||||
input.setAttribute("name", name);
|
||||
input.setAttribute("value", value);
|
||||
tgtForm.appendChild(input);
|
||||
}
|
||||
|
||||
</script>
|
||||
<body>
|
||||
<%@ include file="/WEB-INF/views/comm/mngr/Header.jsp"%>
|
||||
<main class="main">
|
||||
<%@ 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 onclick="fn_select_list()" onkeypress="this.onclick" class="btn outline"><spring:message
|
||||
code="button.list"/></button>
|
||||
<button class="btn primary" onclick="fn_regist();"><spring:message code="button.update"/></button>
|
||||
</div>
|
||||
</div>
|
||||
<form id="listForm" method="post" action="" enctype="multipart/form-data">
|
||||
<spring:eval expression="@environment.getProperty('spring.servlet.multipart.max-file-size')" var="maxFileSize"/>
|
||||
<spring:eval expression="@environment.getProperty('mngrfo.common.fileupload.extensions.images')" var="acceptFileExtensions"/>
|
||||
<section class="content-section content-scroll-detect content-fold">
|
||||
<input type="hidden" id="goodsInnb" name="goodsInnb" value="${resultMap.list.goodsInnb}"/>
|
||||
<input type="hidden" id="goodsOptnInnb" name="goodsOptnInnb" value="${resultMap.list.goodsOptnInnb}"/>
|
||||
<input type="hidden" id="sopmalCd" name="sopmalCd" value="${resultMap.list.sopmalCd}"/>
|
||||
<input type="hidden" id="optnVal1" name="optnVal1" value="${resultMap.list.optnVal1}"/>
|
||||
<input type="hidden" id="optnCd1" name="optnCd1" value="${resultMap.list.optnCd1}"/>
|
||||
<spring:eval expression="@environment.getProperty('mngrfo.common.fileupload.cdnurl')" var="cdnurl"/>
|
||||
<div class="content-fold__header">
|
||||
<h3 class="content-section__title">기본정보</h3>
|
||||
<button class="content-fold__btn"><span class="visually-hidden">접기</span></button>
|
||||
</div>
|
||||
<div class="content-fold__content">
|
||||
<div class="table-wrapper">
|
||||
<table class="table">
|
||||
<caption>사은품</caption>
|
||||
<colgroup>
|
||||
<col style="width: 12%;">
|
||||
<col style="width: 38%;">
|
||||
<col style="width: 12%;">
|
||||
<col style="width: 38%;">
|
||||
</colgroup>
|
||||
<tbody>
|
||||
<tr>
|
||||
<th>상품 명<span class="red-7">*</span></th>
|
||||
<td>
|
||||
<div class="td-inner">
|
||||
<input class="input-text lg" type="text" id="goodsNm" name="goodsNm"
|
||||
title="상품 명" maxlength="35" value="${resultMap.list.goodsNm}">
|
||||
</div>
|
||||
</td>
|
||||
<th>판매 상태</th>
|
||||
<td colspan="2">
|
||||
<div class="td-inner">
|
||||
<div class="custom-radio-container">
|
||||
<c:forEach items="${resultMap.goodsDftinfoSttusList}"
|
||||
var="goodsDftinfoSttus" varStatus="status">
|
||||
<div class="custom-radio">
|
||||
<input type="radio" id="${goodsDftinfoSttus.cd}"
|
||||
name="goodsSttusCd" value="${goodsDftinfoSttus.cd}"
|
||||
<c:if test="${goodsDftinfoSttus.cd eq resultMap.list.goodsSttusCd}">checked</c:if>>
|
||||
<label for="${goodsDftinfoSttus.cd}">${goodsDftinfoSttus.cdNm}</label>
|
||||
</div>
|
||||
</c:forEach>
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>재고에 따른 판매</th>
|
||||
<td colspan="3">
|
||||
<div class="td-inner">
|
||||
<div class="custom-radio-container">
|
||||
<c:forEach items="${resultMap.goodsDftinfoInvntryPolicyList}"
|
||||
var="goodsDftinfoInvntryPolicy" varStatus="status">
|
||||
<div class="custom-radio">
|
||||
<input type="radio"
|
||||
id="goodsDftinfoInvntryPolicy${status.count}"
|
||||
name="invntryPolicyCd"
|
||||
value="${goodsDftinfoInvntryPolicy.cd}"
|
||||
<c:if test="${goodsDftinfoInvntryPolicy.cd eq resultMap.list.invntryPolicyCd}">checked</c:if>>
|
||||
<label for="goodsDftinfoInvntryPolicy${status.count}">${goodsDftinfoInvntryPolicy.cdNm}</label>
|
||||
<input type="hidden" id="invntryPolicyCdAsIs" value="${resultMap.list.invntryPolicyCd}"/>
|
||||
</div>
|
||||
</c:forEach>
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div class="table-wrapper">
|
||||
<table class="table vertical draggable">
|
||||
<colgroup>
|
||||
<col style="width: auto;">
|
||||
<col style="width: 20%;">
|
||||
<col style="width: 20%;">
|
||||
<col style="width: 20%;">
|
||||
<col style="width: 20%;">
|
||||
</colgroup>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>상품코드<span class="red-7">*</span></th>
|
||||
<th>재고</th>
|
||||
<th>가용 재고</th>
|
||||
<th>정가</th>
|
||||
<th>판매가</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>
|
||||
<input class="input-text full" type="text" id="goodsCd" name="goodsCd" value="${resultMap.list.goodsCd}" />
|
||||
</td>
|
||||
<td>
|
||||
<input class="input-text number full" type="text" id="invntryQy" name="invntryQy" title="재고" maxlength="10" value="${resultMap.list.invntryQy}">
|
||||
</td>
|
||||
<td>
|
||||
<input class="input-text full" type="text" title="가용 재고" maxlength="10" value="${resultMap.list.ableQy}" readonly>
|
||||
</td>
|
||||
<td>
|
||||
<input class="input-text number full" type="text" id="cnsmrpric" name="cnsmrpric" title="정가" maxlength="10" value="${resultMap.list.cnsmrpric}">
|
||||
</td>
|
||||
<td>
|
||||
<input class="input-text full" type="text" name="" title="판매가" maxlength="20" disabled>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</section>
|
||||
|
||||
<section class="content-section content-scroll-detect content-fold">
|
||||
<div class="content-fold__header">
|
||||
<h3 class="content-section__title">상품 사진</h3>
|
||||
<button class="content-fold__btn"><span class="visually-hidden">접기</span></button>
|
||||
</div>
|
||||
<div class="content-fold__content">
|
||||
<div class="table-wrapper">
|
||||
<table class="table">
|
||||
<caption>해당 테이블에 대한 설명</caption>
|
||||
<colgroup>
|
||||
<col style="width: 12%;">
|
||||
<col>
|
||||
</colgroup>
|
||||
<tbody>
|
||||
<tr>
|
||||
<th>사진 등록<span class="red-7">*</span></th>
|
||||
<td>
|
||||
<div class="td-inner vertical">
|
||||
<div class="dropzone-wrapper">
|
||||
<spring:eval expression="@environment.getProperty('mngrfo.common.fileupload.extensions.images')" var="acceptFileExtensions"/>
|
||||
<div class="dropzone" id="my-dropzone">
|
||||
</div>
|
||||
<p class="fyi gray-7 mt-15">여러 개의 이미지를 한 번에 등록 가능합니다.</p>
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>등록한 사진</th>
|
||||
<td>
|
||||
<div class="td-inner" id="sortable">
|
||||
<c:if test="${not empty resultMap.imglist}">
|
||||
<c:forEach items="${resultMap.imglist}" var="img" varStatus="status">
|
||||
<c:if test="${img.imgKnd eq '02'}">
|
||||
<div class="file-preview__container">
|
||||
<div class="file-preview">
|
||||
<span class="file-preview__number"></span>
|
||||
<button class="file-preview__delete" id="file-preview__delete" onclick="deleteFileImg(this)">
|
||||
<span class="visually-hidden">삭제</span></button>
|
||||
<div class="file-preview__image">
|
||||
<img src="<c:out value="${cdnurl}${img.img}"/>" alt="상품 이미지" onerror="this.src='/mngr/images/image_placeholder.png'" >
|
||||
<input type="hidden" name="goodsImgInnb" value="${img.goodsImgInnb}"/>
|
||||
<input type="hidden" name="imgKnd" value="${img.imgKnd}"/>
|
||||
<input type="hidden" name="cutNb" value="${img.cutNb}"/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</c:if>
|
||||
</c:forEach>
|
||||
</c:if>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
|
||||
<section class="content-section content-scroll-detect content-fold">
|
||||
<div class="content-fold__header">
|
||||
<h3 class="content-section__title">변경 내역</h3>
|
||||
<button class="content-fold__btn"><span class="visually-hidden">접기</span></button>
|
||||
</div>
|
||||
<div class="content-fold__content">
|
||||
<div class="change-log">
|
||||
<c:if test="${not empty resultMap.list}">
|
||||
<p class="change-log__list" align="left">
|
||||
<span class="change-log__date"><c:out value="${resultMap.list.updtDt}"/></span>
|
||||
<span class="change-log__description">관리자 <c:out
|
||||
value="${resultMap.list.mngrNm}"/>님 (이)가 </span> 사은품의 정보를 수정하였습니다.
|
||||
</p>
|
||||
</c:if>
|
||||
<c:if test="${ empty resultMap.list}">
|
||||
<p class="change-log__list">변경 내역이 없습니다.</p>
|
||||
</c:if>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
<!--검색 조건 , 페이징 조건 -->
|
||||
<input type="hidden" id="srchType" name="srchType" title="검색타입" value="<c:out value="${ resultMap.BOGoodsVO.srchType }"/>">
|
||||
<input type="hidden" id="srchStr" name="srchStr" title="검색어" value="<c:out value="${ resultMap.BOGoodsVO.srchStr }"/>">
|
||||
<input type="hidden" id="dateDv" name="dateDv" title="검색날짜" value="<c:out value="${ resultMap.BOGoodsVO.dateDv }"/>">
|
||||
<input type="hidden" id="startDate" name="startDate" title="검색날짜" value="<c:out value="${ resultMap.BOGoodsVO.startDate }"/>">
|
||||
<input type="hidden" id="endDate" name="endDate" title="검색날짜" value="<c:out value="${ resultMap.BOGoodsVO.endDate }"/>">
|
||||
<input type="hidden" id="pageIndex" name="pageIndex" value="<c:out value="${ resultMap.BOGoodsVO.pageIndex }"/>"/>
|
||||
<input type="hidden" id="pageUnit" name="pageUnit" value="<c:out value="${ resultMap.BOGoodsVO.pageUnit }"/>"/>
|
||||
</form>
|
||||
<button class="scroll-to-top"><span class="visually-hidden">위로가기</span></button>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
Reference in New Issue
Block a user