Browse Source

기획전 코너중간커밋

sowon4187 5 years ago
parent
commit
ee18bf0f91

+ 13 - 3
src/main/java/com/style24/admin/biz/dao/TsaPlanDao.java

@@ -146,7 +146,7 @@ public interface TsaPlanDao {
 	 * @author sowon
 	 * @since 2021. 2. 15
 	 */
-	void createPlanCorner(Plan param);
+	void createPlanCate(Plan param);
 	
 	/**
 	 * 기획전 코너 목록
@@ -156,7 +156,7 @@ public interface TsaPlanDao {
 	 * @author sowon
 	 * @since 2021. 2. 15
 	 */
-	Collection<Plan> getPlanCornerList(Plan param);
+	Collection<Plan> getPlanCateList(Plan param);
 	
 	/**
 	 * 기획전 코너 복사
@@ -165,6 +165,16 @@ public interface TsaPlanDao {
 	 * @author sowon
 	 * @since 2021. 2. 15
 	 */
-	void createPlanCornerCopy(Plan param);
+	void createPlanCateCopy(Plan param);
+	
+	/**
+	 * 기획전 코너 시퀀스 조회 
+	 *
+	 * @param 기획전 일련번호
+	 * @return
+	 * @author sowon
+	 * @since 2021. 2. 16
+	 */
+	Integer getPlanDtlSq(Plan param);
 
 }

+ 23 - 11
src/main/java/com/style24/admin/biz/service/TsaPlanService.java

@@ -73,14 +73,14 @@ public class TsaPlanService {
 			planDao.createPlanBrand(plan);
 		}
 		    
-		String[] corner = param.getMultiCorner();
-		// 기획전 코너insert
-		for (int j = 0; j < corner.length; j++) {
-			plan.setCateNo(corner[j]);
+		String[] cate = param.getMultiCate();
+		// 기획전 카테고리insert
+		for (int j = 0; j < cate.length; j++) {
+			plan.setCateNo(cate[j]);
 			plan.setPlanSq(param.getPlanSq());
 			plan.setRegNo(TsaSession.getInfo().getUserNo());
 			plan.setUpdNo(TsaSession.getInfo().getUserNo());
-			planDao.createPlanCorner(plan);
+			planDao.createPlanCate(plan);
 		}
 
 		log.debug("planSq : {}", param.getPlanSq());
@@ -435,13 +435,13 @@ public class TsaPlanService {
 		
 		// 02. 기획전 브랜드 복사
 		plan.setPlanSq(param.getCopyPlanSq());
-		Collection <Plan> cornerList = planDao.getPlanCornerList(plan);
+		Collection <Plan> cateList = planDao.getPlanCateList(plan);
 		
-		for(Plan cateNo : cornerList){
+		for(Plan cateNo : cateList){
 			plan.setPlanSq(param.getPlanSq());
 			plan.setCateNo(cateNo.getCateNo());
 			plan.setCopyPlanSq(param.getCopyPlanSq()); 
-			planDao.createPlanCornerCopy(plan);
+			planDao.createPlanCateCopy(plan);
 		}
 		
 		
@@ -507,15 +507,27 @@ public class TsaPlanService {
 	}
 	
 	/**
-	 * 기획전 코너 목록
+	 * 기획전 카테고리 목록
 	 *
 	 * @param 
 	 * @return
 	 * @author sowon
 	 * @since 2021. 2. 15
 	 */
-	public Collection<Plan> getPlanCornerList(Plan param){
-		return planDao.getPlanCornerList(param);
+	public Collection<Plan> getPlanCateList(Plan param){
+		return planDao.getPlanCateList(param);
+	}
+	
+	/**
+	 * 기획전 코너 시퀀스 조회
+	 *
+	 * @param
+	 * @return
+	 * @author sowon
+	 * @since 2021. 2. 15
+	 */
+	public Integer getPlanDtlSq(Plan param) {
+		return planDao.getPlanDtlSq(param);
 	}
 
 }

+ 76 - 2
src/main/java/com/style24/admin/biz/web/TsaMarketingController.java

@@ -1560,6 +1560,12 @@ public class TsaMarketingController extends TsaBaseController {
 			
 			// 브랜드 목록
 			mav.addObject("brandList", rendererService.getSupplyCompanyBrandList(""));
+			
+			// 사용가능고객구분 목록
+			mav.addObject("usableCustGbList", rendererService.getAvailCommonCodeList("G100"));
+			
+			// 상위제휴채널 조회
+			mav.addObject("upperAfLinkCdList", rendererService.getCommonCodeList("G053"));
 
 		} else if(param.getMode().equals("U")){ // 상세 일 때
 			mav.addObject("planInfo", planService.getPlanWebDetailInfo(param));
@@ -1571,10 +1577,16 @@ public class TsaMarketingController extends TsaBaseController {
 			// 등록했던 브랜드
 			mav.addObject("planBrandList", planService.getPlanBrandList(param));
 			
-			// 등록했던 코너
-			mav.addObject("planCornerList", planService.getPlanCornerList(param));
+			// 등록했던 카테고리
+			mav.addObject("planCateList", planService.getPlanCateList(param));
 			
 			mav.addObject("brandList", rendererService.getSupplyCompanyBrandList(""));
+			
+			// 사용가능고객구분 목록
+			mav.addObject("usableCustGbList", rendererService.getAvailCommonCodeList("G100"));
+						
+			// 상위제휴채널 조회
+			mav.addObject("upperAfLinkCdList", rendererService.getCommonCodeList("G053"));
 
 			//mav.addObject("planQuestionList", planService.getPlanQuestionList(param));
 
@@ -1734,5 +1746,67 @@ public class TsaMarketingController extends TsaBaseController {
 		
 		return mav;
 	}
+	
+	/**
+	 * 기획전 코너 팝업 화면
+	 *
+	 * @return
+	 * @author sowon
+	 * @since 2021. 2. 16
+	 */
+	@GetMapping("/planning/corner/list/form")
+	public ModelAndView planCornerListForm(Plan param) {
+		ModelAndView mav = new ModelAndView();
+
+		// 코너유형목록
+		mav.addObject("cornerDispTypeList", rendererService.getCommonCodeList("G045", "Y"));
+
+		// 코너유형
+		mav.addObject("planDtlStatList", rendererService.getCommonCodeList("G044", "Y"));
+
+		// 상품상태
+		mav.addObject("goodsStatList", rendererService.getCommonCodeList("G008", "Y"));
+
+		// 기획전 상세 정보
+		mav.addObject("planInfo", planService.getPlanWebDetailInfo(param));
+
+		mav.setViewName("marketing/PlanCornerListForm");
+
+		return mav;
+	}
+	
+	/**
+	 * 기획전 코너 상품 조회
+	 *
+	 * @return
+	 * @author sowon
+	 * @since 2021. 2. 16
+	 */
+//	@PostMapping("/planning/corner/goods/list")
+//	@ResponseBody
+//	public GagaMap getPlanGoodsList(@RequestBody Plan plan) {
+//		GagaMap result = new GagaMap();
+//		if ("Y".equals(plan.getPageYn())) {
+//			plan.setPageable(new TscPageRequest(plan.getPageNo() - 1, plan.getPageSize()));
+//			plan.getPageable().setTotalCount(planService.getPlanGoodsListCount(plan));
+//		}
+//		result.set("pageing", plan);
+//		result.set("planGoodsList", planService.getPlanGoodsList(plan));
+//		return result;
+//	}
+	
+	/**
+	 * 기획전 코너 시퀀스 번호
+	 *
+	 * @return
+	 * @author sowon
+	 * @since 2021. 2. 16
+	 */
+	@GetMapping("/planning/corner/plandtlsq")
+	@ResponseBody
+	public long getPlanDtlSq(Plan param) {
+		return planService.getPlanDtlSq(param);
+	}
+
 
 }

+ 1 - 1
src/main/java/com/style24/persistence/domain/Plan.java

@@ -92,7 +92,7 @@ public class Plan extends TscBaseDomain{
 		/* Multi CheckBox 항목*/
 		@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
 		private String[] multiBrand;
-		private String[] multiCorner;
+		private String[] multiCate;
 		
 		// 코너
 		private String cateGb;		// 카테고리구분

+ 44 - 6
src/main/java/com/style24/persistence/mybatis/shop/TsaPlan.xml

@@ -520,8 +520,8 @@
 	        	     AND BRAND_CD = #{brandCd}
 	</insert>
 	
-	<insert id="createPlanCorner" parameterType="Plan">
-		/* TsaMarketing.createPlanCorner */
+	<insert id="createPlanCate" parameterType="Plan">
+		/* TsaMarketing.createPlanCate */
 		INSERT INTO TB_PLAN_CATE
 		(
 			CATE_NO
@@ -544,8 +544,8 @@
 	
 	</insert>
 	
-	<select id="getPlanCornerList" parameterType="Plan" resultType="Plan">
-		/* TsaMarketing.getPlanCornerList */
+	<select id="getPlanCateList" parameterType="Plan" resultType="Plan">
+		/* TsaMarketing.getPlanCateList */
 		 SELECT TP.PLAN_NM AS PLAN_NM
 				     , TP.PLAN_SQ AS PLAN_SQ
 				     , TC.CATE1_NM AS CATE_NM
@@ -562,8 +562,8 @@
 		AND TP.DEL_YN = 'N'
 	</select>
 	
-	<insert id="createPlanCornerCopy" parameterType="Plan">
-		/* TsaMarketing.createPlanCornerCopy */
+	<insert id="createPlanCateCopy" parameterType="Plan">
+		/* TsaMarketing.createPlanCateCopy */
 			INSERT INTO
 					 TB_PLAN_CATE
 					 (
@@ -587,6 +587,44 @@
 					 AND PLAN_SQ = #{copyPlanSq}
 	        	     AND CATE_NO = #{cateNo}
 	</insert>
+	
+	<!-- 기획전 코너 상품 목록 조회 건수 -->
+	<select id="getPlanGoodsListCount" parameterType="Plan" resultType="int">
+		/* TsaMarketing.getPlanGoodsListCount */
+		SELECT COUNT(*) AS TOTCNT
+		FROM ( SELECT A.PLAN_DTL_SQ     
+		            , A.GOODS_CD        
+		            , B.GOODS_NM        
+		            , B.DC_RATE         
+		            , B.LIST_PRICE      
+		            , B.CURR_PRICE      
+		            , B.SUPPLY_COMP_CD  
+		            , DECODE(B.FORMAL_GB, 10, '정상', 20, '이월') AS FORMAL_GB  
+		            , C.IMG_TYPE        
+		            , C.IMG_PATH1       
+		            , A.DISP_ORD        
+		            , A.DEL_YN          
+		            , B.GOODS_STAT      
+		            , A.REG_ID          
+		            , A.REG_DT          
+		            , A.UPD_ID          
+		            , A.UPD_DT          
+		       FROM   TB_PLAN_GOODS A
+		            , TB_GOODS B
+		            , TB_GOODS_IMG C
+		       WHERE  A.GOODS_CD = B.GOODS_CD
+		       AND    A.GOODS_CD = C.GOODS_CD(+)
+		       AND    A.PLAN_DTL_SQ = #{planDtlSq}
+		       AND    A.DEL_YN = 'N'
+		       ORDER  BY DISP_ORD
+		)
+	</select>
+	
+	<!-- 기획전 코너 시퀀스 조회 -->
+	<select id="getPlanDtlSq" parameterType="Plan" resultType="Integer">
+		/* TsaMarketing.getPlanDtlSq */
+		SELECT LAST_INSERT_ID()	
+	</select>
 </mapper>
 
 

+ 523 - 0
src/main/webapp/WEB-INF/views/marketing/PlanCornerListForm.html

@@ -0,0 +1,523 @@
+<!DOCTYPE html>
+<html lang="ko" xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : PlanCornerListForm.html
+ * @desc    : 기획전 코너 관리 화면 Page
+ *============================================================================
+ * SISUN
+ * Copyright(C) 2019 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2019.12.30   rladbwnd5   최초 작성
+ *******************************************************************************
+ -->
+
+<div class="modalPopup" data-width="1200" data-height="800" id="popupPlanCorner">
+
+	<div class="panelStyle" style="height: 750px;">
+		<div class="panelTitle">
+			<strong>기획전 관리</strong>
+			<button type="button" class="close"	onclick="uifnPopupClose('popupPlanCorner')">
+				<i class="fa fa-times"></i>
+			</button>
+		</div>
+
+		<div class="panelContent">
+			<form th:object="${planInfo}" id="planCornerListForm"
+				name="planCornerListForm" action="#"
+				th:action="@{'/marketing/planning/corner/list'}" th:method="post">
+				<input type="hidden" th:field="*{planSq}" />
+				<table class="frmStyle" style="margin-bottom: 10px;">
+					<colgroup>
+						<col style="width: 10%;" />
+						<col style="width: 10%;" />
+						<col style="width: 10%;" />
+						<col style="width: 20%;" />
+						<col style="width: 10%;" />
+						<col style="width: 15%;" />
+						<col style="width: 10%;" />
+						<col style="width: 15%;" />
+					</colgroup>
+					<tr>
+						<th>기획전번호</th>
+						<td><label th:text="*{planSq}" id="planSq"></label></td>
+						<th>기획전명</th>
+						<td><label th:text="*{planNm}" id="planNm"></label></td>
+						<th>기획전시작일</th>
+						<td><label th:text="*{dispStdt}" id="dispStdt"></label></td>
+						<th>기획전종료일</th>
+						<td><label th:text="*{dispEddt}" id="dispEddt"></label></td>
+					</tr>
+				</table>
+
+				<div class="panelContent">
+					<ul class="panelBar">
+						<li class="boxContentBtnT" style="margin-left: -20px; margin-right: -23px;">
+							<span class="btnLeft">
+								<button type="button" class="btn btn-warning btn-sm" id="btnAddRow">행추가</button>
+								<button type="button" class="btn btn-danger btn-sm" id="btnDeleteRow">행삭제</button>
+							</span> 
+						</li>
+						<li class="right">
+							<span class="btnRight"> 
+								<button type="button" class="btn btn-default btn-lg" onclick="fnCornerCopyPopup();">코너복사</button>
+								<button type="button" class="btn btn-success btn-lg" onclick="fnPlanCornerSave();">저장</button>
+						   </span>
+					   </li>
+					</ul>
+					<div id="gridListCorner" style="width: 100%; max-height: 230px; height: 230px;" 	class="ag-theme-balham"></div>
+				</div>
+			</form>
+		</div>
+
+		<div class="panelContent">
+			<div>
+				<h4>
+					코너명 : <label id="cornerNm"></label>
+				</h4>
+				<div class="aR" style="float: right; margin-top: 10px;">
+					<button type="button" class="btn btn-Right btn-default btn-lg"onclick="fnGoodsExcelUpload();">엑셀상품추가</button>
+					<button type="button" class="btn btn-default btn-lg" onclick="cfnDownloadSampleFile('SF012');">엑셀상품추가 양식 다운로드</button>
+					<button type="button" class="btn btn-default btn-lg" onclick="fnOpenGoodsPopup();">상품추가</button>
+					<!-- 상품조회 팝업 -->
+					<button type="button" class="btn btn-default btn-lg"onclick="fnDispOrdChange();">순서변경</button>
+					<!-- 전시후관리 순서변경 -->
+					<button type="button" class="btn btn-danger btn-lg"	onclick="fnDeleteGoods();">선택삭제</button>
+				</div>
+			</div>
+
+			<div id="gridListGoods"	style="width: 100%; max-height: 350px; height: 350px;" class="ag-theme-balham lh60"></div>
+		</div>
+
+	</div>
+</div>
+
+	<script th:inline="javascript">
+/*<![CDATA[*/
+
+	var planInfo = [[${planInfo}]];
+	var cornerDispTypeList = gagajf.convertToArray([[${cornerDispTypeList}]]);
+	var planDtlStatList = gagajf.convertToArray([[${planDtlStatList}]]);
+	var goodsStatList =gagajf.convertToArray([[${goodsStatList}]]);
+	var uploadGoodsUrl = [[${@environment.getProperty('upload.goods.view')}]];
+
+	var columnDefsCorner = [
+		{width: 40, minWidth: 40, cellClass: 'text-center', headerCheckboxSelection: true, checkboxSelection: true, filter: false},
+		{headerName: "코너번호"		, field:'planDtlSq'			, width:120, cellClass: 'text-center', editable: false },
+		{headerName: "코너명"			, field:'cornerNm'			, width:400, cellClass: 'text-left',
+			cellRenderer: function(params) {return '<a href="javascript:void(0);">' + params.value + '</a>'; },
+			cellEditor: 'textCellEditor',
+			cellEditorParams: { maxlength: 50, required: true }
+		},
+		{headerName: "코너유형"		, field:'cornerDispType'		, width:180, cellClass: 'text-center',
+			cellEditor: 'agRichSelectCellEditor',
+			cellEditorParams: { values: gagaAgGrid.extractValues(cornerDispTypeList) },
+			valueFormatter: function (params) { return gagaAgGrid.lookupValue(cornerDispTypeList, params.value); },
+			valueParser: function (params) { return gagaAgGrid.lookupKey(cornerDispTypeList, params.newValue); }
+		},
+		{headerName: "전시순서"		, field:'dispOrd'				, width:100, cellClass: 'text-right',
+			cellEditor: 'textCellEditor',
+			cellEditorParams: { maxlength: 3, required: true }
+		},
+		{headerName: "기획전 일련번호"	, field:'planSq'	, width:90, cellClass: 'text-left', hide: true},
+		{headerName: "시작일"			, field:'startSearchDate'	, width:110, cellClass: 'text-center',
+			cellEditor: 'datePicker',
+			cellEditorParams: { maxlength: 10, required: true },
+		},
+		{headerName: "시작시간"		, field:'startSearchTime'	, width:150, cellClass: 'text-center',
+			cellEditor: 'dateTimer',
+			cellEditorParams: { maxlength: 8, required: true },
+		},
+		{headerName: "종료일"			, field:'endSearchDate'		, width:110, cellClass: 'text-center',
+			cellEditor: 'datePicker',
+			cellEditorParams: { maxlength: 10, required: true }
+		},
+		{headerName: "종료시간"		, field:'endSearchTime'		, width:150, cellClass: 'text-center',
+			cellEditor: 'dateTimer',
+			cellEditorParams: { maxlength: 8, required: true },
+		},
+		{headerName: "등록자"			, field:'regId'				, width:120, cellClass: 'text-center', editable: false },
+		{headerName: "수정자"			, field:'updId'				, width:120, cellClass: 'text-center', editable: false }
+	];
+
+	var gridOptionsCorner = gagaAgGrid.getGridOptions(columnDefsCorner);
+	gridOptionsCorner.suppressRowClickSelection = true;
+	gridOptionsCorner.stopEditingWhenGridLosesFocus = true;
+	gridOptionsCorner.defaultColDef.editable = true;
+	gridOptionsCorner.rowSelection = 'multiple';
+
+	
+	// 코너 셀 클릭 이벤트
+	gridOptionsCorner.onCellClicked = function(event) {
+		var field = event.colDef.field;
+		if (field != 'cornerNm') return;
+
+		fnBindSearch(event.data);
+	}
+
+	// 코너 상품 조회 바인딩
+	var fnBindSearch = function(data) {
+		if (!gagajf.isNull(data.cornerNm)) {
+
+			$('#cornerNm').html(data.cornerNm);
+			_planDtlSq = data.planDtlSq;
+
+			fnConnerGoodsSearch();
+		}
+	}
+
+	// 코너 상품 조회
+	var fnConnerGoodsSearch = function() {
+		var actionUrl = '/marketing/planning/corner/goods/list';
+		var data = {planDtlSq:_planDtlSq};
+		var jsonData = JSON.stringify(data);
+
+		gagajf.ajaxJsonSubmit(actionUrl, jsonData, function(data) {
+			gridOptionsGoods.api.setRowData(data.planGoodsList);
+		});
+	}
+
+	// 코너 조회
+	var fnCornerSearch = function() {
+		var formId = '#planCornerListForm';
+		gagaAgGrid.fetch($(formId).prop('action'), gridOptionsCorner, formId
+						, function() {
+								$('#gridListGoods').html('');
+								$('#cornerNm').html('');
+								gagaAgGrid.createGrid('gridListGoods', gridOptionsGoods);
+				});
+	}
+	// 행추가
+	$('#btnAddRow').on('click', function() {
+		var allData = gagaAgGrid.getAllRowData(gridOptionsCorner);
+		var planSq = $('#planCornerListForm input[name=planSq]').val();
+		var stdt = planInfo.dispStdt.split(" ");
+		var eddt = planInfo.dispEddt.split(" ");
+
+		if (allData.length > 0 && typeof allData[0].crud != 'undefined') {
+			mcxDialog.alert('추가 된 코너를 저장 후 코너를 추가하세요.');
+			return;
+		} else {
+			var actionUrl = '/marketing/planning/corner/plandtlsq?planSq=' + planSq;
+			$.get(actionUrl
+						, function(planDtlSq) {
+								var data = { planDtlSq: planDtlSq, planSq:planSq, cornerNm:'',cornerDispType: 4, startSearchDate: _today, startSearchTime: stdt[1], endSearchDate: eddt[0], endSearchTime: eddt[1]};
+								gagaAgGrid.addRowData(gridOptionsCorner, data, "planDtlSq");
+					});
+		}
+
+	});
+
+	// 행삭제
+	$('#btnDeleteRow').on('click', function() {
+		var selectData = gagaAgGrid.selectedRowData(gridOptionsCorner);
+
+		if (selectData.length == 0) {
+			mcxDialog.alert('선택된 행이 없습니다.');
+			return;
+		}
+
+		mcxDialog.confirm('선택된 코너를 삭제하시겠습니까?', {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function() {
+				var jsonData = JSON.stringify(selectData);
+
+				gagajf.ajaxJsonSubmit('/marketing/plan/corner/delete', jsonData, fnCornerSearch);
+			}
+		});
+	});
+
+	// 코너승인
+	var fnCornerConfirm = function() {
+		var selectData = gagaAgGrid.selectedRowData(gridOptionsCorner);
+		if (selectData.length < 1) {
+			mcxDialog.alert('승인 할 코너가 없습니다.');
+			return;
+		}
+
+		if (selectData.length == 1) {
+			if (gagajf.isNull(selectData[0].planDtlStat)) {
+				mcxDialog.alert('승인할 코너가 없습니다.');
+				return;
+			}
+		}
+
+		var Msg = '';
+		$(selectData).each(function(idx, data) {
+			if (data.planDtlStat == '90') {
+				Msg = '승인상태가 삭제인 코너가 존재합니다.<br/>선택한 코너를 승인 하시겠습니까?';
+			}
+			if (data.planDtlStat != '20') {
+				data.planDtlStat = '20'; // 승인
+			}
+		});
+
+		Msg = !gagajf.isNull(Msg) ? Msg : '선택 된 코너를 승인 하시겠습니까?';
+		mcxDialog.confirm(Msg, {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function() {
+				var jsonData = JSON.stringify(selectData);
+				gagajf.ajaxJsonSubmit('/marketing/plan/corner/confirm', jsonData, fnCornerSearch);
+			}
+		});
+	}
+
+	// 코너 저장
+	var fnPlanCornerSave = function() {
+		var changeData = gagaAgGrid.getChangedData(gridOptionsCorner);
+
+		if (changeData.length < 1) {
+			mcxDialog.alert('변경 된 코너가 없습니다.');
+			return;
+		}
+
+		// Validation
+		if (!gagaAgGrid.validation(gridOptionsCorner, changeData))
+			return;
+
+		var result = true;
+		$(changeData).each(function(idx, data) {
+			var stdt = planInfo.dispStdt.split(" ");
+			var eddt = planInfo.dispEddt.split(" ");
+
+			// 날짜 유효성 체크
+			if (Number(stdt[0]) > Number(data.startSearchDate)) {
+				mcxDialog.alert('코너의 시작일이 유효하지 않습니다.');
+				result = false;
+			}
+
+			if (Number(eddt[0]) < Number(data.endSearchDate)) {
+				mcxDialog.alert('코너의 종료일이 유효하지 않습니다.');
+				result = false;
+			}
+
+			if (Number(data.startSearchDate.replaceAll("-", "")) > Number(data.endSearchDate.replaceAll("-", ""))) {
+				mcxDialog.alert('진행기간 시작일자는 종료일자보다 클 수 없습니다.');
+				result = false;
+			}
+
+			if (Number(data.startSearchDate.replaceAll("-", "")) < Number(_today.replaceAll("-", "")) && data.crud == 'C') {
+				mcxDialog.alert('시작일자는 오늘포함 이후로 등록해주세요.');
+				result = false;
+			}
+
+			if (Number(data.endSearchDate.replaceAll("-", "")) < Number(_today.replaceAll("-", "")) && data.crud == 'C') {
+				mcxDialog.alert('종료일자는 오늘포함 이후로 등록해주세요.');
+				result = false;
+			}
+
+			// 기획전 시작종료일과 코너 시작종료일 체크
+			if (stdt[0].replaceAll("-", "") > data.startSearchDate.replaceAll("-", "")) {
+				mcxDialog.alert("기획전 시작일보다 코너시작일이 작을 수 없습니다.");
+				result = false;
+			}
+
+			if (eddt[0].replaceAll("-", "") < data.endSearchDate.replaceAll("-", "")) {
+				mcxDialog.alert("기획전 종료일보다 코너종료일이 클 수 없습니다.");
+				result = false;
+			}
+
+			if (result) {
+				data.dispStdt = data.startSearchDate + ' ' + data.startSearchTime;
+				data.dispEddt = data.endSearchDate + ' ' + data.endSearchTime;
+			}
+		});
+
+		if (!result) return;
+
+		mcxDialog.confirm('저장 하시겠습니까?', {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function() {
+				var jsonData = JSON.stringify(changeData);
+				gagajf.ajaxJsonSubmit('/marketing/plan/corner/save', jsonData, fnCornerSearch);
+			}
+		});
+	}
+
+	var fnCornerCopyPopup = function() {
+		var actionUrl = '/marketing/plan/corner/copy/list/form?planSq=' + planInfo.planSq;
+		actionUrl += '&copyMode=CORNER';
+		cfnOpenModalPopup(actionUrl,'popupCornerCopy');
+	}
+	var uploadGoodsUrl = [[${@environment.getProperty('upload.goods.view')}]];
+	var columnDefsGoods = [
+		{width: 40, minWidth: 40, cellClass: 'text-center', headerCheckboxSelection: true, checkboxSelection: true, filter: false},
+		{headerName: "상품코드"	, field:'goodsCd'		, width:150, cellClass: 'text-left'
+			, cellRenderer: function(params) {return '<a href="javascript:void(0);">' + params.value + '</a>'; }
+		},
+		{headerName: "상품명"		, field:'goodsNm'		, width:300, cellClass: 'text-left'},
+		{headerName: "이미지"		, field:'imgPath6'		, width:100 , height:60, cellClass: 'text-right'
+			, cellRenderer: function(params) {
+				var imgPath = '';
+				if (params.data.imgType == "A"){
+					imgPath = uploadGoodsUrl;
+				}
+				if(typeof params.value!='undefined' && params.value!='' && params.value!=null){
+					imgPath = imgPath + params.value;
+				}else{
+					imgPath = imgPath + params.data.imgPath1;
+				}
+				return '<img width="60" src="'+imgPath.replace('1000', '100')+'" onerror="this.src=\''+_uximgUrl+'/image/no.gif\';">';
+			}
+		},
+		{headerName: "전시순서"	, field:'dispOrd'		, width:80 , cellClass: 'text-center'
+			, editable : true, cellEditor: 'numericCellEditor'
+			, valueFormatter: function(params) { return params.value.addComma(); }
+		},
+		{headerName: "재고"		, field:'currStockQty'			, width:80 , cellClass: 'text-center'
+			, cellRenderer: function(params) {return !gagajf.isNull(params.value) ? params.value : '0'; }
+		},
+		{headerName: "할인율(%)"		, field:'dcRate'		, width:80 , cellClass: 'text-center'},
+		{headerName: "TAG가"		, field:'tagPrice'		, width:100, cellClass: 'text-right'
+			, valueFormatter: function(params) { return params.value.addComma(); }
+		},
+		{headerName: "정상가"		, field:'listPrice'		, width:100, cellClass: 'text-right' , hide : true
+			, valueFormatter: function(params) { return params.value.addComma(); }
+		},
+		{headerName: "판매가"		, field:'currPrice'		, width:100, cellClass: 'text-right'
+			, valueFormatter: function(params) { return params.value.addComma(); }
+		},
+		{headerName: "정상/이월여부", field:'formalGb'		, width:120, cellClass: 'text-center'},
+		{headerName: "상품상태"	, field:'goodsStat'		, width:100, cellClass: 'text-center'
+			, valueFormatter: function(params) { return gagaAgGrid.lookupValue(goodsStatList, params.value); }
+		},
+		{headerName: "업체"		, field:'supplyCompNm'	, width:150, cellClass: 'text-left'},
+		{headerName: "기획전상세"	, field:'planDtlSq'		, width:200, cellClass: 'text-left', hide: true},
+		{headerName: "등록일"		, field:'regDt'			, width:100,  cellClass: 'text-left'
+			, cellRenderer: function(params) { return !gagajf.isNull(params.value) ? params.value.toDate("YYYY-MM-DD HH:MM:SS").format("YYYY-MM-DD") : ''; }
+		},
+	];
+
+	var gridOptionsGoods = gagaAgGrid.getGridOptions(columnDefsGoods);
+	gridOptionsGoods.rowSelection = 'multiple';
+	gridOptionsGoods.rowHeight = 60; //이미지가 있을경우 높이 지정해야함.
+	gridOptionsGoods.suppressRowClickSelection = true;
+
+	gridOptionsGoods.onCellClicked = function(event) {
+		if (event.colDef.field == 'goodsCd') {
+			// 상품 상세 팝업
+			cfnOpenGoodsDetailPopup('U',event.data.goodsCd);
+		}
+
+// 		if (event.colDef.field == 'imgPath1') {
+// 			// 이미지 팝업
+// 			cfnOpenImagePreViewPopup('planGoodsDetail', event.data.imgPath1);
+// 		}
+	}
+
+	// 상품 선택삭제
+	var fnDeleteGoods = function() {
+		var removedData = gagaAgGrid.removeRowData(gridOptionsGoods);
+// 		var data = new Object();
+		_planDtlSq = removedData[0].planDtlSq;
+
+		if (removedData.length == 0) {
+			mcxDialog.alert('선택된 행이 없습니다.');
+			return;
+		}
+
+		mcxDialog.confirm('선택된 상품을 삭제하시겠습니까?', {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function() {
+				var jsonData = JSON.stringify(removedData);
+
+				gagajf.ajaxJsonSubmit('/marketing/plan/corner/goods/delete', jsonData, function() {
+					fnCornerSearch();
+//	 				fnCornerGoodsSearch(data);
+				});
+			}
+		});
+	}
+
+	// 기획전 상세일련번호 전역 변수
+	var _planDtlSq = '';
+
+	// 엑셀상품추가
+	var fnGoodsExcelUpload = function() {
+		cfnExcelUploadPopup('createGoods', 'fnCreatePlanGoodsExcel');
+	}
+
+	var fnCreatePlanGoodsExcel = function(result) {
+		var data = {planSq : planInfo.planSq
+					,excelFileNm : result.excelFileNm
+					};
+		var jsonData = JSON.stringify(data);
+		gagajf.ajaxJsonSubmit('/marketing/plan/corner/goods/excelupload', jsonData, fnCornerSearch);
+	}
+
+	var fnOpenGoodsPopup = function() {
+		if (gagaAgGrid.getAllRowData(gridOptionsCorner).length < 1 ) {
+			mcxDialog.alert('기획전 코너가 존재 하지 않습니다.');
+			return;
+		}
+		cfnOpenGoodsPopup('fnCreateGoods');
+	}
+
+	// 상품추가
+	var fnCreateGoods = function(result) {
+		if (result.length < 1) return;
+
+		// 기존상품
+		var oldGoodsList = gagaAgGrid.getAllRowData(gridOptionsGoods);
+
+		// 중복체크
+		var check = true;
+		var checkData = [];
+		$(oldGoodsList).each(function(idx) {
+
+			$(result).each(function(newIdx) {
+
+				if (oldGoodsList[idx].goodsCd == result[newIdx].goodsCd) {
+					check = false;
+					checkData.push(result[newIdx].goodsCd);
+				}
+			});
+		});
+
+		if (!check) {
+			mcxDialog.alert('아래 중복상품이 존재 합니다.<br/>' + checkData.join(","));
+			return;
+
+		} else {
+			for (var disp = 0; disp < result.length; disp++) {
+				var goods = { planDtlSq : _planDtlSq ,
+							  goodsCd : result[disp].goodsCd };
+				oldGoodsList.unshift(goods);
+			}
+		}
+
+		mcxDialog.confirm('선택하신 상품을 추가 하시겠습니까?', {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function() {
+				var jsonData = JSON.stringify(oldGoodsList);
+				gagajf.ajaxJsonSubmit('/marketing/plan/corner/goods/save', jsonData, fnCornerSearch);
+			}
+		});
+	}
+
+	// 순셔 변경 팝업
+	var fnDispOrdChange = function(result) {
+		var selectData = gagaAgGrid.selectedRowData(gridOptionsCorner);
+		var params = 'planDtlSq='+ _planDtlSq;
+
+		cfnOpenGoodsDispOrdChangePopup('fnConnerGoodsSearch', params);
+	}
+	
+	$(document).ready(function() {
+		gagaAgGrid.createGrid('gridListCorner', gridOptionsCorner);
+		gagaAgGrid.createGrid('gridListGoods', gridOptionsGoods);
+
+		//fnCornerSearch();
+	});
+
+
+/*]]>*/
+</script>
+</html>

+ 6 - 0
src/main/webapp/WEB-INF/views/marketing/PlanListForm.html

@@ -272,6 +272,12 @@
 		$("#planListSearchForm input[name=pageNo]").val('1');
 		fnPlanListSearch();
 	});
+	
+	// 이벤트 코너 관리 팝업
+	var fnEventCornerPopup = function(planSq) {
+		var actionUrl = "/marketing/planning/corner/list/form?planSq=" + planSq;
+		cfnOpenModalPopup(actionUrl, 'popupCorner');
+	}
 
 	// 조회
 	var fnPlanListSearch = function() {

+ 131 - 294
src/main/webapp/WEB-INF/views/marketing/PlanWebDetailPopupForm.html

@@ -37,53 +37,38 @@
 						<col/>
 					</colgroup>
 					<tr>
-						<th class="dashR">기획전구분<i class="star"></i></th>
-						<td class="dashR">
+						<th>기획전구분<i class="star"></i></th>
+						<td>
 							<select name="planGb" id="planGb" th:field="*{planGb}" onchange="fnChangePlanGb(this);">
 								<option value="P">기획전</option>
 								<option value="E">이벤트</option>
 							</select>
 						</td>
-						<th class="dashR">기획전탬플릿유형<i class="star"></i></th>
-						<td class="dashR" colspan="3">
+						<th>기획전탬플릿유형<i class="star"></i></th>
+						<td colspan="3">
 							<select name="templateType" th:field="*{templateType}">
 								<option value="H">HTML</option>
 								<option value="T">TEXT</option>
 							</select>
 						</td>
 					</tr>
-					<!-- <tr>
-						<th class="dashR">회원구분<i class="star"></i></th>
-						<td class="dashR">
-							<select name="custGb" required="required" data-valid-name="회원구분" th:field="*{custGb}">
-								<option th:if="${custGbList}" th:each="oneData, status : ${custGbList}" th:value="${oneData.cd}" th:selected="${oneData.cd} == 'Y'" th:text="|${oneData.cdNm}|"></option>
-							</select>
-						</td>
-						<th class="dashR">회원등급<i class="star"></i></th>
-						<td class="dashR" colspan="3">
-							<select name="custGrade" required="required" data-valid-name="회원등급" th:field="*{custGrade}">
-								<option value="0">전체</option>
-								<option th:if="${custGradeList}" th:each="oneData, status : ${custGradeList}" th:value="${oneData.cd}" th:selected="${oneData.cd} == 'Y'" th:text="|${oneData.cdNm}|"></option>
-							</select>
-						</td>
-					</tr> -->
 					<tr>
-						<th class="dashR">프론트 구분<i class="star"></i></th>
-						<td class="dashR">
+						<th>프론트 구분<i class="star"></i></th>
+						<td>
 							<select name="frontGb" id="frontGb" th:field="*{frontGb}">
 								<option value="A">전체</option>
 								<option value="P">웹</option>
 								<option value="M">모바일</option>
 							</select>
 						</td>
-						<th class="dashR">기획전명<i class="star"></i></th>
-						<td class="dashR" colspan="3">
+						<th>기획전명<i class="star"></i></th>
+						<td colspan="3">
 							<input type="text" name="planNm" id="planNm" th:field="*{planNm}"/>
 						</td>
 					</tr>
 					<tr>
-						<th class="dashR">진행기간<i class="star"></i></th>
-						<td class="dashR">
+						<th>진행기간<i class="star"></i></th>
+						<td>
 							<input type="text" class="schDate w100" name="startSearchDate" maxlength="10" required="required" data-valid-name="노출기간" th:field="*{startSearchDate}"/>
 							<select name="startSearchHour" required="required" data-valid-name="진행기간 시작시간">
 								<th:block th:each="num, index  : ${#numbers.sequence(0,23)}">
@@ -110,81 +95,75 @@
 							<input type="hidden" name="dispStdt" id="dispStdt"/>
 							<input type="hidden" name="dispEddt" id="dispEddt"/>
 						</td>
-						<th class="dashR">서브제목</th>
-						<td class="dashR" colspan="3">
+						<th>서브제목</th>
+						<td colspan="3">
 							<input type="text" name="dtlTitle1" id="dtlTitle1" th:value="*{dtlTitle1}"/>
 						</td>
 					</tr>
 					<tr>
-						<th class="dashR">코너명노출 여부<i class="star"></i></th>
-						<td class="dashR">
+						<th>코너명노출 여부<i class="star"></i></th>
+						<td>
 							<select name="cornerNmDispYn" th:field="*{cornerNmDispYn}">
 								<option th:if="${useYnList}" th:each="oneData, status : ${useYnList}" th:value="${oneData.cd}" th:selected="${oneData.cd} == 'Y'" th:text="|${oneData.cdNm}|"></option>
 							</select>
 						</td>
-						<th class="dashR">오픈여부<i class="star"></i></th>
-						<td class="dashR">
+						<th>오픈여부<i class="star"></i></th>
+						<td>
 							<select name="openYn" th:field="*{openYn}">
 								<option th:if="${useYnList}" th:each="oneData, status : ${useYnList}" th:value="${oneData.cd}" th:selected="${oneData.cd} == 'Y'" th:text="|${oneData.cdNm}|"></option>
 							</select>
 						</td>
 					</tr>
 					<tr>
-						<th class="dashR">사이트<i class="star"></i></th>
-						<td class="dashR">
+						<th>사이트<i class="star"></i></th>
+						<td>
 							<select name="siteCd" th:field="*{siteCd}">
 								<option value="">선택</option>
 								<option th:if="${siteList}" th:each="oneData, status : ${siteList}" th:value="${oneData.cd}" th:text="|${oneData.cdNm}|"></option>
 							</select>
 						</td>
-						<th class="dashR">전시순서</th>
-						<td class="dashR">
+						<th>전시순서</th>
+						<td>
 							<input type="text" name="dispOrd" class="w100 aR" th:value="*{dispOrd}"/>
 						</td>
-						<!-- <th class="dashR">삭제여부<i class="star"></i></th>
-						<td class="dashR">
-							<select name="delYn" th:field="*{delYn}" required="required" data-valid-name="삭제여부">
-								<option th:if="${useYnList}" th:each="oneData, status : ${useYnList}" th:value="${oneData.cd}" th:selected="${oneData.cd} == 'N'" th:text="|${oneData.cdNm}|"></option>
-							</select>
-						</td> -->
 					</tr>
 					<tr>
-						<th class="dashR">사용고객등급구분<em class="required" title="필수"></em></th>
-						<td class="dashR">
+						<th>사용고객등급구분<em class="required" title="필수"></em></th>
+						<td>
 							<label class="chkBox" th:if="${usableCustGradeList}" th:each="oneData, status : ${usableCustGradeList}">
 								<input type="checkbox" name="usableCustGradeArr" th:value="${oneData.cd}" th:text="${oneData.cdNm}"/>
 							</label>
 						</td>
-						<th class="dashR">댓글여부</th>
-						<td class="dashR">
+						<th>사용가능고객구분<em class="required" title="필수"></em></th>
+						<td>
+							<label class="chkBox" th:if="${usableCustGbList}" th:each="oneData, status : ${usableCustGbList}">
+								<input type="checkbox" name="usableCustGbArr" th:value="${oneData.cd}" th:text="${oneData.cdNm}"/>
+							</label>
+  						</td>
+					</tr>
+					<tr>
+						<th>제휴채널<em class="required" title="필수"></em></th>
+						<td>
+							<label class="chkBox" th:if="${upperAfLinkCdList}" th:each="oneData, status : ${upperAfLinkCdList}">
+								<input type="checkbox" name="upperAfLinkCdArr" th:value="${oneData.cd}" th:text="${oneData.cdNm}"/>
+							</label>
+  						</td>
+						<th>댓글여부</th>
+						<td>
 							<select name="replyYn" th:field="*{replyYn}">
 								<option value="">선택</option>
 								<option th:if="${useYnList}" th:each="oneData, status : ${useYnList}" th:value="${oneData.cd}" th:text="|${oneData.cdNm}|"></option>
 							</select>
 						</td>
 					</tr>
-					<!-- <tr>
-						<th class="dashR">뱃지 타이틀</th>
-						<td class="dashR" colspan="3">
-							<input type="text" name="badgeNm" th:value="*{badgeNm}"/>
-						</td>
-						<th class="dashR">뱃지 배경색상</th>
-						<td class="dashR">
-							<input type="text" name="badgeBcolor" th:value="*{badgeBcolor}"/>
-						</td>
-						<th class="dashR">뱃지 글자색상</th>
-						<td class="dashR" colspan="3">
-							<input type="text" name="badgeFcolor" th:value="*{badgeFcolor}"/>
-						</td>
-					</tr> -->
 					<tr>
-						<th class="dashR">PC 메인 이미지<i id="pMimgStar"></i><br/>[삭제여부<label class="chkBox"><input type="checkbox" name="orgMainPimgDelYn" value="Y"/></label>]</th>
-						<td class="dashR">
+						<th>PC 메인 이미지<i id="pMimgStar"></i><br/>[삭제여부<label class="chkBox"><input type="checkbox" name="orgMainPimgDelYn" value="Y"/></label>]</th>
+						<td>
 							<div th:if=*{mainPimg} id="mainPimgView" style="float:left;">
 								<img id="PreMainPimgUrl" th:src="${@environment.getProperty('upload.image.view') + '/planning/'} + *{mainPimg}" style="max-width:720px;"/>
 							</div>
 						</td>
-						<td class="dashR" colspan="4">
+						<td colspan="4">
 							<div class="uFile w400">
 								<input id="registerMainPimg" name="registerMainPimg" type="file" accept="image/*" class="uFileInput w400"/>
 								<label for="registerMainPimg" class="uFileLabel w400">파일선택</label>
@@ -194,13 +173,13 @@
 						</td>
 					</tr>
 					<tr>
-						<th class="dashR">모바일 메인 이미지<i id="mMimgStar"></i><br/>[삭제여부<label class="chkBox"><input type="checkbox" name="orgMainMimgDelYn" value="Y"/></label>]</th>
-						<td class="dashR">
+						<th>모바일 메인 이미지<i id="mMimgStar"></i><br/>[삭제여부<label class="chkBox"><input type="checkbox" name="orgMainMimgDelYn" value="Y"/></label>]</th>
+						<td>
 							<div th:if=*{mainMimg} id="imgFileView" style="float:left;">
 								<img id="PreMainMimgUrl" th:src="${@environment.getProperty('upload.image.view') + '/planning/'} + *{mainMimg}" style="max-width:720px;"/>
 							</div>
 						</td>
-						<td class="dashR" colspan="4">
+						<td colspan="4">
 							<div class="uFile w400">
 								<input id="registerMainMimg" name="registerMainMimg" type="file" accept="image/*" class="uFileInput w400"/>
 								<label for="registerMainMimg" class="uFileLabel w400">파일선택</label>
@@ -209,105 +188,26 @@
 							</div>
 						</td>
 					</tr>
-					<!-- <tr>
-						<th class="dashR">웹 상세 이미지<br/>[삭제여부<label><input type="checkbox" name="orgDtlPimgDelYn" value="Y"/></label>]</th>
-						<td class="dashR">
-							<div th:if=*{dtlPimg} id="DtlPimgView" style="float:left;">
-								<img id="PreDtlPimgUrl" th:src="${@environment.getProperty('upload.image.view') + '/plan/'} + *{dtlPimg}" style="width:100%;"/>
-							</div>
-						</td>
-						<td class="dashR" colspan="4">
-							<div class="uFile w400">
-								<input id="registerDtlPimg" name="registerDtlPimg" type="file" accept="image/*" class="uFileInput w400"/>
-								<label for="registerDtlPimg" class="uFileLabel w400">파일선택</label>
-								<input type="hidden" name="orgDtlPimg" id="orgDtlPimg" th:value="*{dtlPimg}"/>
-								<input type="hidden" name="dtlPimg" id="dtlPimg"/>
-							</div>
-						</td>
-					</tr>
-					<tr>
-						<th class="dashR">모바일 상세 이미지<br/>[삭제여부<label><input type="checkbox" name="orgDtlMimgDelYn" value="Y"/></label>]</th>
-						<td class="dashR">
-							<div th:if=*{dtlMimg} id="DtlMimgView" style="float:left;">
-								<img id="PredtlMimgUrl" th:src="${@environment.getProperty('upload.image.view') + '/plan/'} + *{dtlMimg}" style="width:100%;"/>
-							</div>
-						</td>
-						<td class="dashR" colspan="4">
-							<div class="uFile w400">
-								<input id="registerDtlMimg" name="registerDtlMimg" type="file" accept="image/*" class="uFileInput w400"/>
-								<label for="registerDtlMimg" class="uFileLabel w400">파일선택</label>
-								<input type="hidden" name="orgDtlMimg" id="orgDtlMimg" th:value="*{dtlMimg}"/>
-								<input type="hidden" name="dtlMimg" id="dtlMimg"/>
-							</div>
-						</td>
-					</tr> -->
 				</tbody>
-				<!-- <tbody id="questionEventUpdate">
-					<tr>
-						<th class="dashR">개인정보 수집동의</th>
-						<td class="dashR">
-							<div style="margin-top:5px;">
-								<textarea name="privacyPolicy" id="privacyPolicyDetail" style="width:720px;">[[*{privacyPolicy}]]</textarea>
-							</div>
-						</td>
-						<th class="dashR">입력항목<div><button type="button" class="btn btn-primary btn-lg" th:onclick="'cfnOpenPlanAnswerPopup('+*{planSq}+');'">참여자</button></div></th>
-						<td class="dashR">
-							<th:bock th:if="${planQuestionList != null and !planQuestionList.empty}" th:each="oneData, status : ${planQuestionList}">
-								<div>
-									<input type="text" class="w200" name="planQtitle" th:value="${oneData.planQtitle}"/>
-									<label class="chkBox"><input type="checkbox" th:checked="${oneData.attachYn}=='Y'" onclick="fnAttachYnClick(this);" />첨부파일</label>
-									<th:block th:if="${status.first}">
-										<button type="button" class="btn btn-base btn-lg" onclick="fnAddRow(this);">추가</button>
-									</th:block>
-									<th:block th:unless="${status.first}">
-										<button type="button" class="btn icn" onclick="fnDeleteRow(this);"><i class="fa fa-times" aria-hidden="true"></i></button>
-									</th:block>
-									<input type="hidden" name="attachYn" th:value="${oneData.attachYn}"/>
-								</div>
-							</th:bock>
-							<th:block th:unless="${planQuestionList != null and !planQuestionList.empty}">
-								<div>
-									<input type="text" class="w200" name="planQtitle" />
-									<label><input type="checkbox" onclick="fnAttachYnClick(this);" />첨부파일</label>
-									<button type="button" class="btn btn-base btn-lg" onclick="fnAddRow(this);">추가</button>
-									<input type="hidden" name="attachYn" th:value="N"/>
-								</div>
-							</th:block>
-						</td>
-					</tr>
-				</tbody> -->
 				<tbody>
 					<!-- <tr>
-						<th class="dashR">댓글여부</th>
-						<td class="dashR" colspan="5">
-							<select name="replyYn" th:field="*{replyYn}">
-								<option value="">선택</option>
-								<option th:if="${useYnList}" th:each="oneData, status : ${useYnList}" th:value="${oneData.cd}" th:text="|${oneData.cdNm}|"></option>
-							</select>
-						</td>
-						<th class="dashR">DEV URL</th>
-						<td class="dashR" colspan="4">
-							<input type="text" name="devUrl" id="devUrl" th:value="*{devUrl}"/>
-						</td>
-					</tr> -->
-					<tr>
-						<th class="dashR">웹용소스</th>
-						<td class="dashR" colspan="5">
+						<th>웹용소스</th>
+						<td colspan="5">
 							<div style="margin-top:5px;">
 								<textarea name="fsrcPc" id="fsrcPcDetail" rows="15" cols="95" style="width:1280px;"></textarea>
 							</div>
 						</td>
 					</tr>
 					<tr>
-						<th class="dashR">모바일용소스</th>
-						<td class="dashR" colspan="5">
+						<th>모바일용소스</th>
+						<td colspan="5">
 							<div style="margin-top:5px;">
 								<textarea name="fsrcMobile" id="fsrcMobileDetail" rows="15" cols="95" style="width:1280px;"></textarea>
 							</div>
 						</td>
-					</tr>
+					</tr> -->
 				</table>
-									<div class="panelStyle" style="margin: unset;">
+				<div class="panelStyle" style="margin: unset;">
 						<!-- TITLE -->
 						<div class="panelTitle">
 							<h2>카테고리 / 브랜드 등록</h2>
@@ -334,12 +234,12 @@
 													<span class="buttonSpan">
 														<button type="button"
 															class="btn btnRight btn-success btn-lg"
-															id="btnAddCorner">코너 추가</button>
+															id="btnAddCate">카테고리 추가</button>
 														<button type="button"
 															class="btn btnRight btn-success btn-lg"
-															id="btnDeleteCorner">선택삭제</button>
+															id="btnDeleteCate">선택삭제</button>
 													</span> <br />
-													<div id="gridFGCornerList"
+													<div id="gridFGCateList"
 														style="width: 100%; height: 200px;"
 														class="ag-theme-balham"></div>
 												</div>
@@ -390,8 +290,8 @@
 						<col/>
 					</colgroup>
 					<tr>
-						<th class="dashR">기존 기획전</th>
-						<td class="dashR">
+						<th>기존 기획전</th>
+						<td>
 							<select name="planSq" id="planSq">
 								<option value="">선택</option>
 								<option th:if="${planList}" th:each="oneData, status : ${planList}" th:value="${oneData.planSq}" th:text="|[${oneData.planSq}]  ${oneData.planNm}|"></option>
@@ -411,53 +311,38 @@
 						<col/>
 					</colgroup>
 					<tr>
-						<th class="dashR">기획전구분<i class="star"></i></th>
-						<td class="dashR">
+						<th>기획전구분<i class="star"></i></th>
+						<td>
 							<select name="planGb" required="required" data-valid-name="기획전구분" onchange="fnChangePlanGb(this);">
 								<option value="P">기획전</option>
 								<option value="E">이벤트</option>
 							</select>
 						</td>
-						<th class="dashR">기획전탬플릿유형<i class="star"></i></th>
-						<td class="dashR" colspan="3">
+						<th>기획전탬플릿유형<i class="star"></i></th>
+						<td colspan="3">
 							<select name="templateType" required="required" data-valid-name="기획전탬플릿유형">
 								<option value="H">HTML</option>
 								<option value="T">TEXT</option>
 							</select>
 						</td>
 					</tr>
-				<!-- 	<tr>
-						<th class="dashR">회원구분<i class="star"></i></th>
-						<td class="dashR">
-							<select name="custGb" required="required" data-valid-name="회원구분">
-								<option th:if="${custGbList}" th:each="oneData, status : ${custGbList}" th:value="${oneData.cd}" th:selected="${oneData.cd} == 'Y'" th:text="|${oneData.cdNm}|"></option>
-							</select>
-						</td>
-						<th class="dashR">회원등급<i class="star"></i></th>
-						<td class="dashR" colspan="3">
-							<select name="custGrade" required="required" data-valid-name="회원등급">
-								<option value="0">전체</option>
-								<option th:if="${custGradeList}" th:each="oneData, status : ${custGradeList}" th:value="${oneData.cd}" th:selected="${oneData.cd} == 'Y'" th:text="|${oneData.cdNm}|"></option>
-							</select>
-						</td>
-					</tr> -->
 					<tr>
-						<th class="dashR">프론트 구분<i class="star"></i></th>
-						<td class="dashR">
+						<th>프론트 구분<i class="star"></i></th>
+						<td>
 							<select name="frontGb" id="frontGb" required="required" data-valid-name="프론트 구분">
 								<option value="A">전체</option>
 								<option value="P">웹</option>
 								<option value="M">모바일</option>
 							</select>
 						</td>
-						<th class="dashR">기획전명<i class="star"></i></th>
-						<td class="dashR" colspan="3">
+						<th>기획전명<i class="star"></i></th>
+						<td colspan="3">
 							<input type="text" name="planNm" id="planNm" maxlength="50" required="required" data-valid-name="기획전명"/>
 						</td>
 					</tr>
 					<tr>
-						<th class="dashR">진행기간<i class="star"></i></th>
-						<td class="dashR">
+						<th>진행기간<i class="star"></i></th>
+						<td>
 							<input type="text" class="schDate w100" id="viewStartDtNew" name="startSearchDate" maxlength="10" required="required" data-valid-name="노출기간" />
 							<select name="startSearchHour" required="required" data-valid-name="진행기간 시작시간">
 								<th:block th:each="num, index  : ${#numbers.sequence(0,23)}">
@@ -484,77 +369,68 @@
 							<input type="hidden" name="dispStdt" id="dispStdt"/>
 							<input type="hidden" name="dispEddt" id="dispEddt"/>
 						</td>
-						<th class="dashR">서브제목</th>
-						<td class="dashR" colspan="3">
+						<th>서브제목</th>
+						<td colspan="3">
 							<input type="text" name="dtlTitle1" id="dtlTitle1"/>
 						</td>
 					</tr>
 					<tr>
-						<th class="dashR">코너명노출 여부<i class="star"></i></th>
-						<td class="dashR">
+						<th>코너명노출 여부<i class="star"></i></th>
+						<td>
 							<select name="cornerNmDispYn" required="required" data-valid-name="코너명노출 여부">
 								<option th:if="${useYnList}" th:each="oneData, status : ${useYnList}" th:value="${oneData.cd}" th:selected="${oneData.cd} == 'Y'" th:text="|${oneData.cdNm}|"></option>
 							</select>
 						</td>
-						<th class="dashR">오픈여부<i class="star"></i></th>
-						<td class="dashR" colspan="3">
+						<th>오픈여부<i class="star"></i></th>
+						<td colspan="3">
 							<select name="openYn" required="required" data-valid-name="오픈여부">
 								<option th:if="${useYnList}" th:each="oneData, status : ${useYnList}" th:value="${oneData.cd}" th:selected="${oneData.cd} == 'Y'" th:text="|${oneData.cdNm}|"></option>
 							</select>
 						</td>
 					</tr>
 					<tr>
-						<th class="dashR">사이트<i class="star"></i></th>
-						<td class="dashR">
+						<th>사이트<i class="star"></i></th>
+						<td>
 							<select name="siteCd" required="required" data-valid-name="사이트">
 								<option th:if="${siteList}" th:each="oneData, status : ${siteList}" th:value="${oneData.cd}" th:text="|${oneData.cdNm}|"></option>
 							</select>
 						</td>
-						<th class="dashR">전시순서</th>
-						<td class="dashR" colspan="3">
+						<th>전시순서</th>
+						<td colspan="3">
 							<input type="text" class="w100 aR" name="dispOrd"/>
 						</td>
 					</tr>
-					<!-- <tr>
-						<th class="dashR">뱃지 타이틀</th>
-						<td class="dashR">
-							<input type="text" class="w500" name="badgeNm"/>
-						</td>
-
-						<th class="dashR">뱃지 배경색상</th>
-						<td class="dashR">
-							<input type="text" class="w100" name="badgeBcolor"/>
-						</td>
-
-						<th class="dashR">뱃지 글자색상</th>
-						<td class="dashR">
-							<input type="text" class="w100" name="badgeFcolor"/>
-						</td>
-					</tr> -->
 					<tr>
-						<th class="dashR">사용고객등급구분<em class="required" title="필수"></em></th>
-						<td class="dashR">
+						<th>사용고객등급구분<em class="required" title="필수"></em></th>
+						<td>
 							<label class="chkBox" th:if="${usableCustGradeList}" th:each="oneData, status : ${usableCustGradeList}">
 								<input type="checkbox" name="usableCustGradeArr" th:value="${oneData.cd}" th:text="${oneData.cdNm}"/>
 							</label>
 						</td>
-						<th class="dashR">댓글여부</th>
-						<td class="dashR" colspan="5">
+						<th>사용가능고객구분<em class="required" title="필수"></em></th>
+						<td>
+							<label class="chkBox" th:if="${usableCustGbList}" th:each="oneData, status : ${usableCustGbList}">
+								<input type="checkbox" name="usableCustGbArr" th:value="${oneData.cd}" th:text="${oneData.cdNm}"/>
+							</label>
+  						</td>
+					</tr>
+					<tr>
+						<th>제휴채널<em class="required" title="필수"></em></th>
+						<td>
+							<label class="chkBox" th:if="${upperAfLinkCdList}" th:each="oneData, status : ${upperAfLinkCdList}">
+								<input type="checkbox" name="upperAfLinkCdArr" th:value="${oneData.cd}" th:text="${oneData.cdNm}"/>
+							</label>
+  						</td>
+						<th>댓글여부</th>
+						<td colspan="5">
 							<select name="replyYn">
 								<option th:if="${useYnList}" th:each="oneData, status : ${useYnList}" th:value="${oneData.cd}" th:selected="${oneData.cd} == 'N'" th:text="|${oneData.cdNm}|"></option>
 							</select>
 						</td>
 					</tr>
-					<!--<tr>
-					
-						 <th class="dashR">DEV URL</th>
-						<td class="dashR" colspan="3">
-							<input type="text" name="devUrl" id="devUrl"/>
-						</td> 
-					</tr>-->
 					<tr>
-						<th class="dashR">PC 메인 이미지<i id="pMimgStar"></i></th>
-						<td class="dashR" colspan="5">
+						<th>PC 메인 이미지<i id="pMimgStar"></i></th>
+						<td colspan="5">
 							<div class="uFile w400">
 								<input id="registerMainPimg" name="registerMainPimg" type="file" accept="image/*" class="uFileInput w400"/>
 								<label for="registerMainPimg" class="uFileLabel w400">파일선택</label>
@@ -563,8 +439,8 @@
 						</td>
 					</tr>
 					<tr>
-						<th class="dashR">모바일 메인 이미지<i id="mMimgStar"></i></th>
-						<td class="dashR" colspan="5">
+						<th>모바일 메인 이미지<i id="mMimgStar"></i></th>
+						<td colspan="5">
 							<div class="uFile w400">
 								<input id="registerMainMimg" name="registerMainMimg" type="file" accept="image/*" class="uFileInput w400"/>
 								<label for="registerMainMimg" class="uFileLabel w400">파일선택</label>
@@ -572,65 +448,26 @@
 							</div>
 						</td>
 					</tr>
-					<!-- <tr>
-						<th class="dashR">PC 상세 이미지</th>
-						<td class="dashR" colspan="5">
-							<div class="uFile w400">
-								<input id="registerDtlPimg" name="registerDtlPimg" type="file" accept="image/*" class="uFileInput w400"/>
-								<label for="registerDtlPimg" class="uFileLabel w400">파일선택</label>
-								<input type="hidden" name="dtlPimg" value=""/>
-							</div>
-						</td>
-					</tr>
-					<tr>
-						<th class="dashR">모바일 상세 이미지</th>
-						<td class="dashR" colspan="5">
-							<div class="uFile w400">
-								<input id="registerDtlMimg" name="registerDtlMimg" type="file" accept="image/*" class="uFileInput w400"/>
-								<label for="registerDtlMimg" class="uFileLabel w400">파일선택</label>
-								<input type="hidden" name="dtlMimg" value=""/>
-							</div>
-						</td>
-					</tr> -->
 				</tbody>
-				<!-- <tbody id="questionEventInsert">
-					<tr>
-						<th class="dashR">개인정보 수집동의</th>
-						<td class="dashR" >
-							<div style="margin-top:5px;">
-								<textarea name="textareaR4" id="privacyPolicyRegister" style="width:720px;"></textarea>
-							</div>
-						</td>
-						<th class="dashR">입력항목</th>
-						<td class="dashR" colspan="5">
-							<div>
-								<input type="text" class="w200" name="planQtitle"/>
-								<label><input type="checkbox" onclick="fnAttachYnClick(this);" />첨부파일</label>
-								<button type="button" class="btn btn-base btn-lg" onclick="fnAddRow(this);">추가</button>
-								<input type="hidden" name="attachYn" value="N"/>
-							</div>
-						</td>
-					</tr>
-				</tbody> -->
 				<tbody>
-					<tr>
-						<th class="dashR">웹용소스</th>
-						<td class="dashR" colspan="5">
+					<!-- <tr>
+						<th>웹용소스</th>
+						<td colspan="5">
 							<div style="margin-top:5px;">
-								<!-- <textarea name="fsrcPc" id="fsrcPcRegister" rows="15" cols="95" style="width:1280px;"></textarea> -->
+								<textarea name="fsrcPc" id="fsrcPcRegister" rows="15" cols="95" style="width:1280px;"></textarea>
 								<textarea class="textareaR4" id="fsrcPcDetail" name="fsrcPc"></textarea>
 							</div>
 						</td>
 					</tr>
 					<tr>
-						<th class="dashR">모바일용소스</th>
-						<td class="dashR" colspan="5">
+						<th>모바일용소스</th>
+						<td colspan="5">
 							<div style="margin-top:5px;">
-								<!-- <textarea name="fsrcMobile" id="fsrcMobileRegister" rows="15" cols="95" style="width:1280px;"></textarea> -->
+								<textarea name="fsrcMobile" id="fsrcMobileRegister" rows="15" cols="95" style="width:1280px;"></textarea>
 								<textarea class="textareaR4" id="fsrcMobileDetail" name="fsrcMobile"></textarea>
 							</div>
 						</td>
-					</tr>
+					</tr> -->
 				</table>
 					<div class="panelStyle" style="margin: unset;">
 						<!-- TITLE -->
@@ -659,12 +496,12 @@
 													<span class="buttonSpan">
 														<button type="button"
 															class="btn btnRight btn-success btn-lg"
-															id="btnAddCorner">코너 추가</button>
+															id="btnAddCate">카테고리 추가</button>
 														<button type="button"
 															class="btn btnRight btn-success btn-lg"
-															id="btnDeleteCorner">선택삭제</button>
+															id="btnDeleteCate">선택삭제</button>
 													</span> <br />
-													<div id="gridFGCornerList"
+													<div id="gridFGCateList"
 														style="width: 100%; height: 200px;"
 														class="ag-theme-balham"></div>
 												</div>
@@ -714,7 +551,7 @@
 	var fsrcPc = [[${fsrcPc}]];
 	var fsrcMobile = [[${fsrcMobile}]];
 	var planBrandList = [[${planBrandList}]];
-	var planCornerList = [[${planCornerList}]];
+	var planCateList = [[${planCateList}]];
 	var snOptions;
 
 	// 카테고리 전시 여부
@@ -874,18 +711,18 @@
 			multiBrand.push(item.brandCd);
 		});
 		
-		let allCornerData = gagaAgGrid.getAllRowData(gridOptionsFGCornerList);
-		var multiCorner = [];
-		$.each(allCornerData, function(idx, item) {
-			multiCorner.push(item.cateNo);
+		let allCateData = gagaAgGrid.getAllRowData(gridOptionsFGCateList);
+		var multiCate = [];
+		$.each(allCateData, function(idx, item) {
+			multiCate.push(item.cateNo);
 		});
 		
 		
 		let data = {
 				 multiBrand : multiBrand
 				,brandList : allBrandData
-				,multiCorner : multiCorner
-				,CornerList : allCornerData
+				,multiCate : multiCate
+				,CateList : allCateData
 			    ,mode : $('#planWebRegisterForm input[name=mode]').val()
 			    ,planSq : $('#planWebRegisterForm input[name=planSq]').val()
 				,planGb	: $('#planWebRegisterForm select[name=planGb]').val()
@@ -1061,31 +898,31 @@
 		}
 	};
 	
-	// 코너 리스트 설정
-	var columnCornerList = [
+	// 카테고리 리스트 설정
+	var columnCateList = [
 		{width: 40, minWidth: 40, cellClass: 'text-center', headerCheckboxSelection: true, checkboxSelection: true, filter: false},
 		{headerName: "사이트", field: "siteCd", width: 120, cellClass: 'text-center'},
-		{headerName: "코너 구분", field: "cateGb", width: 110, cellClass: 'text-center'},
-		{headerName: "코너", field: "cateNm", width: 120, cellClass: 'text-center'},
-		{headerName: "코너", field: "cateNo", width: 150, cellClass: 'text-center', hide: true},
+		{headerName: "카테고리 구분", field: "cateGb", width: 110, cellClass: 'text-center'},
+		{headerName: "카테고리 이름", field: "cateNm", width: 120, cellClass: 'text-center'},
+		{headerName: "번호", field: "cateNo", width: 150, cellClass: 'text-center', hide: true},
 		/* {headerName: "시퀀스", field: "tmtbGoodsSq", width: 150, cellClass: 'text-center', hide: true},
 		{headerName: "삭제여부", field: "delYn", width: 150, cellClass: 'text-center', hide: true}  */
 	];
 	
 	// 카테고리 그리드 설정
-	var gridOptionsFGCornerList = gagaAgGrid.getGridOptions(columnCornerList);
-	gridOptionsFGCornerList.rowSelection = "multiple";
-	gridOptionsFGCornerList.suppressRowClickSelection = true;
+	var gridOptionsFGCateList = gagaAgGrid.getGridOptions(columnCateList);
+	gridOptionsFGCateList.rowSelection = "multiple";
+	gridOptionsFGCateList.suppressRowClickSelection = true;
 	
 	// 브랜드 설정 선택삭제 버튼 클릭시
-    $('#btnDeleteCorner').on('click', function() {
-    	gridOptionsFGCornerList.api.updateRowData({remove:gagaAgGrid.selectedRowData(gridOptionsFGCornerList)});
+    $('#btnDeleteCate').on('click', function() {
+    	gridOptionsFGCateList.api.updateRowData({remove:gagaAgGrid.selectedRowData(gridOptionsFGCateList)});
     });
 	
 	
 	
-	// 코너추가(카테고리 추가)
-	$('#btnAddCorner').on('click' , function () {
+	// 카테고리 추가
+	$('#btnAddCate').on('click' , function () {
 		cfnOpenCategoryPopup("fnSetPopupCategoryInfo");
 	});
 	
@@ -1093,7 +930,7 @@
 	var fnSetPopupCategoryInfo = function (result) {
 		// 기존 리스트 데이터 for
 		for(let i = 0 ; i < result.length ; i++) {
-			let addChk = true, gridListValue = gagaAgGrid.getAllRowData(gridOptionsFGCornerList);		// 받아온 모든 데이터
+			let addChk = true, gridListValue = gagaAgGrid.getAllRowData(gridOptionsFGCateList);		// 받아온 모든 데이터
 
 			// 받아온 data for
 			for(let j = 0 ; j < gridListValue.length ; j++) {
@@ -1108,7 +945,7 @@
 					mcxDialog.alert('카테고리1에서 선택하세요.');
 					return;
 				}
-				gagaAgGrid.addRowData(gridOptionsFGCornerList, {"siteCd":result[i].siteCd , "cateGb":result[i].cateGb, "cateNm":result[i].cateNm, "cateNo":result[i].cateNo});
+				gagaAgGrid.addRowData(gridOptionsFGCateList, {"siteCd":result[i].siteCd , "cateGb":result[i].cateGb, "cateNm":result[i].cateNm, "cateNo":result[i].cateNo});
 			}
 		}
 	}
@@ -1125,7 +962,7 @@
 		
 		// 그리드 그리기
 		gagaAgGrid.createGrid("gridFGBrandList", gridOptionsFGBrandList);
-		gagaAgGrid.createGrid("gridFGCornerList", gridOptionsFGCornerList);
+		gagaAgGrid.createGrid("gridFGCateList", gridOptionsFGCateList);
 		
 		 if (mode =='U') {
 			/* $('#planWebDetailForm input[name=badgeFcolor]').spectrum({
@@ -1141,7 +978,7 @@
 			}); */
 			
 			gridOptionsFGBrandList.api.setRowData(planBrandList);
-			gridOptionsFGCornerList.api.setRowData(planCornerList);
+			gridOptionsFGCateList.api.setRowData(planCateList);
 
 			if (planInfo.goodsLimitYn == 'N') {
 				$('#planWebDetailForm input[name=goodsLimitQty]').hide();