Bladeren bron

Merge branch 'develop' into bin2107

bin2107 5 jaren geleden
bovenliggende
commit
76706b49e9

+ 29 - 0
src/main/java/com/style24/admin/biz/dao/TsaPlanDao.java

@@ -251,5 +251,34 @@ public interface TsaPlanDao {
 	 * @since 2021. 2. 17
 	 */
 	void savePlanCornerGoods(Plan param);
+	
+	/**
+	 * 기획전 코너 상품 삭제
+	 *
+	 * @param 기획전 상세번호
+	 * @author sowon
+	 * @since 2021. 2. 18
+	 */
+	void deletePlanCornerGoods(Plan param);
+	
+	/**
+	 * 기획전 코너 복사
+	 *
+	 * @param
+	 * @author sowon
+	 * @since 2021. 2. 18
+	 */
+	void createPlanCornerCopy(Plan param);
+	
+	/**
+	 * 기획전 상품 복사
+	 *
+	 * @param
+	 * @author sowon
+	 * @since 2021. 2. 18
+	 */
+	void createPlanGoodsCopy(Plan param);
+
+
 
 }

+ 130 - 7
src/main/java/com/style24/admin/biz/service/TsaPlanService.java

@@ -1,6 +1,7 @@
 package com.style24.admin.biz.service;
 
 import java.io.IOException;
+import java.util.ArrayList;
 import java.util.Collection;
 
 import org.apache.commons.lang3.StringUtils;
@@ -9,6 +10,8 @@ import org.springframework.core.env.Environment;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.gagaframework.web.parameter.GagaMap;
 import com.gagaframework.web.util.GagaFileUtil;
 import com.gagaframework.web.util.GagaStringUtil;
 import com.style24.admin.biz.dao.TsaPlanDao;
@@ -36,6 +39,9 @@ public class TsaPlanService {
 	@Autowired
 	private Environment env;
 	
+	@Autowired
+	private ObjectMapper mapper;
+	
 	/**
 	 * 기획전 코너 전체 조회
 	 *
@@ -591,14 +597,30 @@ public class TsaPlanService {
 	 *
 	 * @param
 	 * @return
-	 * @author rladbwnd5
-	 * @since 2020. 1. 3
+	 * @author sowon
+	 * @since 2021. 2. 17
 	 */
 	@Transactional("shopTxnManager")
 	public void deletePlanCornerInfo(Collection<Plan> paramList) {
 		for (Plan cornerInfo : paramList) {
 			planDao.deletePlanCornerInfo(cornerInfo);
-			//marketingDao.deletePlanCornerGoods(cornerInfo);
+			planDao.deletePlanCornerGoods(cornerInfo);
+		}
+	}
+	
+
+	/**
+	 * 기획전 코너 상품 삭제 처리
+	 *
+	 * @param
+	 * @return
+	 * @author rladbwnd5
+	 * @since 2021. 2. 18
+	 */
+	@Transactional("shopTxnManager")
+	public void deletePlanCornerGoods(Collection<Plan> paramList) {
+		for (Plan cornerInfo : paramList) {
+			planDao.deletePlanCornerGoods(cornerInfo);
 		}
 	}
 	
@@ -655,12 +677,8 @@ public class TsaPlanService {
 	 */
 	@Transactional("shopTxnManager")
 	public void savePlanGoods(Collection<Plan> paramList) {
-		int disp = 1;
 		for (Plan param : paramList) {
-			param.setDispOrd(disp);
-			param.setPlanDtlSq(param.getPlanDtlSq());
 			savePlanCornerGoods(param);
-			disp++;
 		}
 	}
 
@@ -679,7 +697,112 @@ public class TsaPlanService {
 		plan.setRegNo(TsaSession.getInfo().getUserNo());
 		plan.setUpdNo(TsaSession.getInfo().getUserNo());
 		plan.setGoodsCd(param.getGoodsCd());
+		plan.setPlanDtlSq(param.getPlanDtlSq());
 		planDao.savePlanCornerGoods(plan);
 	}
+	
+	/**
+	 * 기획전 코너 복사
+	 *
+	 * @param
+	 * @return
+	 * @author sowon
+	 * @since 2021. 2. 18
+	 */
+	@Transactional("shopTxnManager")
+	public void copyPlanCorner(Collection<Plan> paramList) {
+		try {
+			for (Plan planInfo : paramList) {
+				planInfo.setRegNo(TsaSession.getInfo().getUserNo());
+				planInfo.setUpdNo(TsaSession.getInfo().getUserNo());
+				planInfo.setPlanDtlSq(planDao.getPlanDtlSq(planInfo));
+				// 코너 복사
+				planDao.createPlanCornerCopy(planInfo);
+				
+				// 상품 복사 시 적용 할 상세일련번호
+				Integer planDtlSq = planInfo.getPlanDtlSq();
+
+				// 상품 조회
+				Plan planSearch = new Plan();
+				planSearch.setPlanDtlSq(planInfo.getCopyPlanDtlSq());
+				Collection<Plan> goodsList = planDao.getPlanGoodsList(planSearch);
+
+				// 상품 복사
+				if (goodsList != null && !goodsList.isEmpty()) {
+					for (Plan goodsInfo : goodsList) {
+						goodsInfo.setPlanDtlSq(planDtlSq);
+						goodsInfo.setRegNo(planInfo.getRegNo());
+						goodsInfo.setUpdNo(planInfo.getUpdNo());
+						planDao.createPlanGoodsCopy(goodsInfo);
+					}
+				}
+			}
+		} catch (Exception e) {
+			log.info("[기획전 복사 중 Error] {}", e.toString());
+			throw new IllegalStateException("기획전 복사 실패");
+		}
+	}
+
+	/**
+	 * 기획전 코너 상품 엑셀 저장
+	 *
+	 * @param
+	 * @return
+	 * @author sowon
+	 * @since 2021. 2. 18
+	 */
+	@Transactional("shopTxnManager")
+	public void createExceluploadGoods(Collection<GagaMap> ecxelGoodsList, Plan param) {
+		String targetPath = env.getProperty("upload.excel.target.path");
+
+		if ((ecxelGoodsList == null || ecxelGoodsList.isEmpty())) {
+			deleteFile(targetPath, param.getExcelFileNm());
+			throw new IllegalStateException("저장 할 데이터가 없습니다.");
+		}
+
+		Collection<Plan> dtlPlan = new ArrayList<>();
+		Collection<Plan> goodsList = new ArrayList<>();
+
+		long tempPlanDtlSq = 0;
+		for (GagaMap gagaMap : ecxelGoodsList) {
+			Plan planGoods = mapper.convertValue(gagaMap, Plan.class);
+			planGoods.setPlanSq(param.getPlanSq());
+
+			String planDtlSq = String.valueOf(planGoods.getPlanDtlSq());
+			if (StringUtils.isBlank(planDtlSq)) {
+				throw new IllegalStateException("상품코드 : " + planGoods.getGoodsCd() + " 기획전 코너 번호가 없습니다.");
+			}
+
+			if (StringUtils.isBlank(planGoods.getGoodsCd())) {
+				throw new IllegalStateException("비어 있는 상품코드가 존재합니다.");
+			}
+
+			// 중복 확인 위한 데이터 적제
+			if (tempPlanDtlSq != planGoods.getPlanDtlSq()) {
+				dtlPlan.add(planGoods);
+			}
+
+			// 상품 데이터 적제
+			goodsList.add(planGoods);
+		}
+
+		// 기획전 유효성 체크
+		for (Plan plan : dtlPlan) {
+			Plan searchCorner = new Plan();
+			searchCorner.setPlanSq(plan.getPlanSq());
+			searchCorner.setPlanDtlSq(plan.getPlanDtlSq());
+
+			Collection<Plan> cornerList = planDao.getPlanCornerList(searchCorner);
+
+			if (cornerList == null || cornerList.isEmpty()) {
+				throw new IllegalStateException("상품코드 : " + plan.getGoodsCd() + "의 " + plan.getPlanDtlSq() + " 기획전 코너가 존재 하지 않습니다.");
+			}
+		}
+
+		// 기획전 상품 저장
+		for (Plan goods : goodsList) {
+			savePlanCornerGoods(goods);
+		}
+	}
 
 }

+ 138 - 0
src/main/java/com/style24/admin/biz/web/TsaMarketingController.java

@@ -61,10 +61,12 @@ import com.style24.persistence.domain.User;
 
 import lombok.extern.slf4j.Slf4j;
 
+import com.gagaframework.excel.GagaExcelUtil;
 import com.gagaframework.web.parameter.GagaMap;
 import com.gagaframework.web.rest.server.GagaResponse;
 import com.gagaframework.web.rest.server.GagaResponseStatus;
 import com.gagaframework.web.util.GagaDateUtil;
+import com.gagaframework.web.util.GagaFileUtil;
 
 /**
  * 마케팅 Controller
@@ -1876,6 +1878,142 @@ public class TsaMarketingController extends TsaBaseController {
 		planService.savePlanGoods(paramList);
 		return super.ok(message.getMessage("SUCC_0001"));
 	}
+	
+	/**
+	 * 기획전 코너 상품 삭제
+	 *
+	 * @return
+	 * @author sowon
+	 * @since 2021. 2. 18
+	 */
+	@PostMapping("/planning/corner/goods/delete")
+	@ResponseBody
+	public GagaResponse deletePlanCornerGoods(@RequestBody Collection<Plan> paramList) {
+		planService.deletePlanCornerGoods(paramList);
+		return super.ok(message.getMessage("SUCC_0003"));
+	}
+	
+	/**
+	 * 기획전 코너 복사
+	 *
+	 * @return
+	 * @author sowon
+	 * @since 2021. 2. 18
+	 */
+	@GetMapping("/planning/corner/copy/list/form")
+	public ModelAndView planCornerCopyForm(Plan param) {
+		ModelAndView mav = new ModelAndView();
+
+		// 코너유형목록
+		mav.addObject("cornerDispTypeCopyList", rendererService.getCommonCodeList("G045", "Y"));
+
+		// 코너유형
+		mav.addObject("planDtlStatCopyList", rendererService.getCommonCodeList("G044", "Y"));
+
+		// 코너 조회
+		mav.addObject("planList", planService.getPlanAllList(param));
+
+		if (param.getCopyMode().equals("CORNER")) { // 코너 복사
+			// 기획전 일련번호
+			mav.addObject("planSq", param.getPlanSq());
+		}
+
+		// 모드
+		mav.addObject("copyMode", param.getCopyMode());
+
+		mav.setViewName("marketing/PlanCornerCopyForm");
+		
+
+		return mav;
+	}
+	
+	/**
+	 * 기획전 코너 복사
+	 *
+	 * @return
+	 * @author sowon
+	 * @since 2021. 2. 18
+	 */
+	@PostMapping("/planning/corner/copy")
+	@ResponseBody
+	public GagaResponse copyPlanCorner(@RequestBody Collection<Plan> paramList) {
+		planService.copyPlanCorner(paramList);
+		return super.ok(message.getMessage("SUCC_0004"));
+	}
+	
+	
+	/**
+	 * 기획전 코너 상품 엑셀상품추가
+	 *
+	 * @return
+	 * @author sowon
+	 * @since 2021. 2. 18
+	 */
+	@PostMapping("/planning/corner/goods/excelupload")
+	@ResponseBody
+	public GagaMap createExceluploadGoods(@RequestBody Plan param) throws Exception {
+		String targetPath = env.getProperty("upload.excel.target.path") + "/excel/";
+		String[] goodsNames = {"planDtlSq", "goodsCd"};
+
+		Collection<GagaMap> ecxelGoodsList = GagaExcelUtil.getList(GagaFileUtil.getConcatenationPath(targetPath, param.getExcelFileNm()), 0, goodsNames, 0);
+
+		try {
+			planService.createExceluploadGoods(ecxelGoodsList, param);
+		} catch (Exception e) {
+			// 파일 삭제
+			GagaFileUtil.deleteFile(GagaFileUtil.getConcatenationPath(targetPath, param.getExcelFileNm()));
+			throw new IllegalStateException(e.getMessage());
+		}
+
+		// 파일 삭제
+		GagaFileUtil.deleteFile(GagaFileUtil.getConcatenationPath(targetPath, param.getExcelFileNm()));
+
+		GagaMap result = new GagaMap();
+		result.set("status", GagaResponseStatus.SUCCESS.getCode()); // 200
+		result.set("message", message.getMessage("SUCC_0001"));
+		return result;
+	}
+	
+	/**
+	 * 기획전 템플릿 팝업
+	 *
+	 * @return
+	 * @author sowon
+	 * @since 2021. 2. 18
+	 */
+	@GetMapping("/planning/webdetail/template/form")
+	public ModelAndView planTemplateForm(Plan param) {
+		ModelAndView mav = new ModelAndView();
+
+		// 신규
+		if(param.getMode().equals("C")) {
+			
+		}
+//		// 코너유형목록
+//		mav.addObject("cornerDispTypeCopyList", rendererService.getCommonCodeList("G045", "Y"));
+//
+//		// 코너유형
+//		mav.addObject("planDtlStatCopyList", rendererService.getCommonCodeList("G044", "Y"));
+//
+//		// 코너 조회
+//		mav.addObject("planList", planService.getPlanAllList(param));
+//
+//		if (param.getCopyMode().equals("CORNER")) { // 코너 복사
+//			// 기획전 일련번호
+//			mav.addObject("planSq", param.getPlanSq());
+//		}
+//
+//		// 모드
+//		mav.addObject("copyMode", param.getCopyMode());
+
+		mav.setViewName("marketing/PlanTemplatePopupForm");
+		
+
+		return mav;
+	}
+
+	
+	
 
 
 }

+ 73 - 19
src/main/java/com/style24/persistence/mybatis/shop/TsaPlan.xml

@@ -644,6 +644,18 @@
 		AND    PLAN_DTL_SQ = #{planDtlSq}
 	</delete>
 	
+	<!-- 기획전 코너 상품 삭제 처리 -->
+	<update id="deletePlanCornerGoods" parameterType="Plan">
+		/* TsaMarketing.deletePlanCornerGoods */
+		UPDATE TB_PLAN_GOODS
+		SET    DEL_YN = 'Y'
+		     , DISP_ORD = 0
+		WHERE  PLAN_DTL_SQ = #{planDtlSq}
+		<if test="goodsCd != null and goodsCd != ''">
+		AND    GOODS_CD = #{goodsCd}
+		</if>
+	</update>
+	
 	<!-- 기획전 코너 저장 -->
 	<insert id="savePlanCornerInfo" parameterType="Plan">
 		/* TsaMarketing.savePlanCornerInfo */
@@ -715,7 +727,7 @@
 			               , G.LIST_PRICE                                                                 
 			               , G.CURR_PRICE                                                                 
 			               , G.DC_RATE                                                                    
-			               , G.FORMAL_GB                                                                  
+			               , CASE G.FORMAL_GB WHEN 'G009_20' THEN '이월' ELSE '정상' END AS FORMAL_GB                                                                 
 			               , G.SEASON_CD       
 			               , (SELECT SUPPLY_COMP_NM
                  				FROM   TB_SUPPLY_COMPANY
@@ -735,13 +747,15 @@
 			               , TG.REG_NO                                                                    
 			               , TG.REG_DT                              
 			               , TG.UPD_NO                                                                    
-			               , TG.UPD_DT                              
+			               , TG.UPD_DT     
+			               , TG.PLAN_DTL_SQ                          
 			         FROM TB_GOODS G
 					        JOIN ( SELECT @rownum := 0) R
 					        INNER JOIN TB_BRAND B ON G.BRAND_CD = B.BRAND_CD
 					        INNER JOIN TB_PLAN_GOODS TG ON G.GOODS_CD = TG.GOODS_CD 
 			         WHERE 1=1
 			         	 AND TG.PLAN_DTL_SQ = #{planDtlSq}
+			         	 AND TG.DEL_YN = 'N'
 			         ORDER BY G.REG_DT DESC, G.GOODS_CD
 		<include refid="getListPagingCondition_sql"/>
 		)Q
@@ -787,10 +801,11 @@
 		        INNER JOIN TB_PLAN_GOODS TG ON G.GOODS_CD = TG.GOODS_CD 
 		        WHERE 1=1
 		        AND TG.PLAN_DTL_SQ = #{planDtlSq}
+	            AND TG.DEL_YN = 'N'
 		    ) CNT
 	</select>
 	
-	<!-- 기획전 코너 저장 -->
+	<!-- 기획전 코너 상품저장 -->
 	<insert id="savePlanCornerGoods" parameterType="Plan">
 		/* TsaMarketing.savePlanCornerGoods */
 		INSERT INTO
@@ -807,14 +822,7 @@
 			   VALUES (
 			    	    #{planDtlSq}
 			          , #{goodsCd}
-			          <choose>
-				          <when test="dispOrd != null and dispOrd != ''">
-				          , #{dispOrd}
-				          </when>
-				          <otherwise>
-				          ,1
-				          </otherwise>
-			          </choose>
+			          , 0
 			          , 'N'
 			          , #{regNo}
 			          , now()
@@ -825,18 +833,64 @@
 			      DUPLICATE KEY
 			   UPDATE
 			        DEL_YN = 'N'
-		          <choose>
-			          <when test="dispOrd != null and dispOrd != ''">
-			          , DISP_ORD = #{dispOrd}
-			          </when>
-			           <otherwise>
-			          ,DISP_ORD = 1
-			          </otherwise>
-		          </choose>
 		          , UPD_DT = now()
 		          , UPD_NO = #{updNo}                                  
 	</insert>
 	
+	<!-- 기획전 코너 복사 -->
+	<insert id="createPlanCornerCopy" parameterType="Plan">
+		/* TsaMarketing.createPlanCornerCopy */
+		INSERT INTO TB_PLAN_DETAIL (
+		            PLAN_DTL_SQ						          
+		          , PLAN_SQ                              
+		          , CORNER_DISP_TYPE                       
+		          , CORNER_NM                              
+		          , DISP_STDT                       
+		          , DISP_EDDT                              
+		          , DISP_ORD                                  
+		          , REG_NO                                    
+		          , REG_DT                                    
+		          , UPD_NO                                    
+		          , UPD_DT
+		      ) SELECT #{planDtlSq}
+		             , #{planSq}
+		             , CORNER_DISP_TYPE
+		             , CORNER_NM
+		             , DISP_STDT
+		             , DISP_EDDT
+		             , DISP_ORD
+		             , #{regNo}
+		             , now()
+		             , #{updNo}
+		             , now()
+		        FROM   TB_PLAN_DETAIL
+		        WHERE  PLAN_DTL_SQ = #{copyPlanDtlSq}
+	</insert>
+	
+	<!-- 기획전 상품 복사 -->
+	<insert id="createPlanGoodsCopy" parameterType="Plan">
+		/* TsaMarketing.createPlanGoodsCopy */
+		INSERT INTO TB_PLAN_GOODS (
+		            PLAN_DTL_SQ				 
+		          , GOODS_CD                 
+		          , DISP_ORD                 
+		          , DEL_YN                   
+		          , REG_NO                   
+		          , REG_DT                   
+		          , UPD_NO                   
+		          , UPD_DT                   
+		      ) VALUES (
+		            #{planDtlSq}
+		          , #{goodsCd}
+		          , #{dispOrd}
+		          , 'N'
+		          , #{regNo}
+		          , now()
+		          , #{updNo}
+		          , now()
+		       )
+	</insert>
+	
 	
 	
 </mapper>

+ 249 - 0
src/main/webapp/WEB-INF/views/marketing/PlanCornerCopyForm.html

@@ -0,0 +1,249 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : PlanCornerCopyForm.html
+ * @desc    : 기획전 코너 복사 화면 Page
+ *============================================================================
+ * SISUN
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.02.18   sowon   최초 작성
+ *******************************************************************************
+ -->
+<div class="modalPopup" data-width="1200" data-height="800"	id="popupCornerCopy">
+	<div class="panelStyle" style="height: 750px;">
+		<div class="panelTitle">
+			<strong>기획전 복사</strong>
+			<button type="button" class="close"	onclick="uifnPopupClose('popupCornerCopy')">
+				<i class="fa fa-times"></i>
+			</button>
+		</div>
+
+
+		<div class="panelContent">
+			<input type="hidden" name="planSq" id="OrdPlanSq" th:value="${planSq}" />
+			<form id="planCornerCopyForm" name="planCornerCopyForm" action="#" th:action="@{'/marketing/planning/corner/list'}" th:method="post">
+				<input type="hidden" name="copyMode" id="copyMode" th:value="${copyMode}" />
+				<table class="frmStyle">
+					<colgroup>
+						<col style="width: 10%" />
+						<col style="width: 40%;" />
+						<col />
+					</colgroup>
+					<tr>
+						<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>
+							</select>
+						</td>
+					</tr>
+				</table>
+
+				<ul class="panelBar">
+					<li class="right" style="margin-right: -19px; margin-top: 10px;">
+						<span class="btnRight">
+							<button type="button" class="btn btn-default btn-lg" onclick="fnPlanCornerCopy();">복사</button>
+						</span>
+					</li>
+				</ul>
+
+				<ul class="boxContent">
+					<li>
+						<div id="gridListCornerCopy" style="width: 100%; height: 200px;" class="ag-theme-balham"></div>
+					</li>
+				</ul>
+			</form>
+		</div>
+
+		<div class="panelContent">
+			<div>
+				<h4>
+					코너명 : <label id="cornerNmCopy"></label>
+				</h4>
+			</div>
+			<div id="gridListGoodsCopy" style="width: 100%; height: 300px;"	class="ag-theme-balham"></div>
+		</div>
+
+	</div>
+</div>
+
+<script th:inline="javascript">
+/*<![CDATA[*/
+
+	var copyMode = [[${copyMode}]]
+	var cornerList = [[${cornerList}]];
+	var cornerDispTypeCopyList =  gagajf.convertToArray([[${cornerDispTypeCopyList}]]);
+	var planDtlStatCopyList =  gagajf.convertToArray([[${planDtlStatCopyList}]]);
+
+	var columnDefsCorner = [
+		{width: 40, minWidth: 40, cellClass: 'text-center', headerCheckboxSelection: true, checkboxSelection: true, filter: false},
+		{headerName: "코너번호"		, field:'planDtlSq'			, width:120, cellClass: 'text-left', editable: false },
+		{headerName: "코너명"			, field:'cornerNm'			, width:350, 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:130, cellClass: 'text-left',
+			cellEditor: 'agRichSelectCellEditor',
+			cellEditorParams: { values: gagaAgGrid.extractValues(cornerDispTypeCopyList) , maxlength: 50, required: true },
+			valueFormatter: function (params) { return gagaAgGrid.lookupValue(cornerDispTypeCopyList, params.value); },
+			valueParser: function (params) { return gagaAgGrid.lookupKey(cornerDispTypeCopyList, params.newValue); }
+		},
+		{headerName: "전시순서"		, field:'dispOrd'				, width:100, cellClass: 'text-right',
+			cellEditor: 'textCellEditor',
+			cellEditorParams: { maxlength: 3, required: true }
+		},
+		{headerName: "상태"			, field:'planDtlStat'			, width:100, cellClass: 'text-left',
+			cellEditor: 'agRichSelectCellEditor',
+			cellEditorParams: { values: gagaAgGrid.extractValues(planDtlStatCopyList) , maxlength: 50, required: true },
+			valueFormatter: function (params) { return gagaAgGrid.lookupValue(planDtlStatCopyList, params.value); },
+			valueParser: function (params) { return gagaAgGrid.lookupKey(planDtlStatCopyList, params.newValue); }
+		},
+		{headerName: "기획전 일련번호"	, field:'planSq'	, width:90, cellClass: 'text-left', hide: true},
+		{headerName: "시작일"			, field:'startSearchDate'	, width:110, cellClass: 'text-left',
+			cellEditor: 'textCellEditor',
+			cellEditorParams: { maxlength: 10, required: true }
+		},
+		{headerName: "시작시간"		, field:'startSearchTime'	, width:110, cellClass: 'text-center',
+			cellEditor: 'textCellEditor',
+			cellEditorParams: { maxlength: 6, required: true }
+		},
+		{headerName: "종료일"			, field:'endSearchDate'		, width:110, cellClass: 'text-left',
+			cellEditor: 'textCellEditor',
+			cellEditorParams: { maxlength: 10, required: true }
+		},
+		{headerName: "종료시간"		, field:'endSearchTime'		, width:110, cellClass: 'text-center',
+			cellEditor: 'textCellEditor',
+			cellEditorParams: { maxlength: 6, required: true }
+		},
+		{headerName: "등록자"			, field:'regId'				, width:120, cellClass: 'text-center'},
+		{headerName: "수정자"			, field:'updId'				, width:120, cellClass: 'text-center'}
+	];
+
+	var gridOptionsCornerCopy = gagaAgGrid.getGridOptions(columnDefsCorner);
+	gridOptionsCornerCopy.defaultColDef.editable = true;
+	gridOptionsCornerCopy.rowSelection = 'multiple';
+
+	
+
+	// 기획전명 변경 시
+	$('#planCornerCopyForm select[name=planSq]').on('change', function() {
+		fnCornerSearchCopy();
+	});
+
+	// 코너 셀 클릭 이벤트
+	gridOptionsCornerCopy.onCellClicked = function(event) {
+		var field = event.colDef.field;
+		if (field != 'cornerNm') return;
+
+		fnCornerGoodsSearchCopy(event.data);
+	}
+
+	// 코너 상품 조회
+	var fnCornerGoodsSearchCopy = function(data) {
+		if (!gagajf.isNull(data.cornerNm)) {
+
+			var data = {planDtlSq : data.planDtlSq};
+			var jsonData = JSON.stringify(data);
+			
+			gagajf.ajaxJsonSubmit('/marketing/planning/corner/goods/list', jsonData, function(result) {
+				gridOptionsGoodsCopy.api.setRowData(result.planGoodsList);
+			})
+			$('#cornerNmCopy').html(data.cornerNm);
+		}
+	}
+
+	// 코너 조회
+	var fnCornerSearchCopy = function() {
+		var formId = '#planCornerCopyForm';
+		gagaAgGrid.fetch($(formId).prop('action'), gridOptionsCornerCopy, formId
+						, function() {
+								if (gridOptionsCornerCopy.api.getDisplayedRowCount() >= 1) {
+									gridOptionsCornerCopy.api.getRowNode(0).setSelected(true);
+									fnCornerGoodsSearchCopy(gridOptionsCornerCopy.api.getRowNode(0).data);
+								} else {
+									$('#gridListGoodsCopy').html('');
+									$('#cornerNmCopy').html('');
+									gagaAgGrid.createGrid('gridListGoodsCopy', gridOptionsGoodsCopy);
+								}
+				});
+	}
+
+	// 코너 복사
+	var fnPlanCornerCopy = function() {
+		var selectData = gagaAgGrid.selectedRowData(gridOptionsCornerCopy);
+
+		if (selectData.length < 1) {
+			mcxDialog.alert('선택 된 코너가 없습니다.');
+			return;
+		}
+
+		$(selectData).each(function(idx, data) {
+			console.log(copyMode);
+			if (copyMode == 'CORNER') {
+				data.planSq = $('#OrdPlanSq').val(); // 코너 복사 시 선택 된 기획전 번호
+				console.log(data.planSq);
+			} else {
+				data.copyPlanSq = $('#planCornerCopyForm select[name=planSq]').val(); // 기획전 복사 시 복사 될 기획전 번호
+			}
+			data.copyPlanDtlSq = data.planDtlSq;
+			data.copyMode = $('#copyMode').val();
+		});
+
+		mcxDialog.confirm('선택된 코너를 복사하시겠습니까?',{
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function() {
+				var jsonData = JSON.stringify(selectData);
+
+				gagajf.ajaxJsonSubmit('/marketing/planning/corner/copy', jsonData, function() {
+					if (copyMode == 'CORNER') {
+						fnCornerSearch();
+					} else {
+						fnSearch();						
+						uifnPopupClose('popupEventWebDetail');
+					}
+					uifnPopupClose('popupCornerCopy')
+				});
+			}
+		});
+	}
+
+	var columnDefsGoodsCopy = [
+		{headerName: "상품코드"	, field:'goodsCd'		, width:150, cellClass: 'text-left'},
+		{headerName: "상품명"		, field:'goodsNm'		, width:350, cellClass: 'text-left'},
+		/* {headerName: "전시순서"	, field:'dispOrd'		, width:80 , cellClass: 'text-right'}, */
+		{headerName: "가용재고"	, field:'stockQtySum'	, width:80 , cellClass: 'text-right',
+			cellRenderer: function(params) {return !gagajf.isNull(params.value) ? params.value : '0'; }
+		},
+		{headerName: "할인율"		, field:'dcRate'		, width:80 , cellClass: 'text-right'},
+		{headerName: "정상가"		, field:'listPrice'		, width:100, cellClass: 'text-right'
+			, valueFormatter: function(params) { return params.value.addComma(); }
+		},
+		{headerName: "판매가"		, field:'currPrice'		, width:100, cellClass: 'text-right'
+			, valueFormatter: function(params) { return params.value.addComma(); }
+		},
+		{headerName: "업체"		, field:'supplyCompNm'	, width:150, cellClass: 'text-left'},
+		{headerName: "기획전상세"	, field:'planDtlSq'		, width:150, 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") : ''; }
+		},
+		{headerName: "정상/이월여부", field:'formalGb'		, width:150, cellClass: 'text-left'}
+	];
+
+	var gridOptionsGoodsCopy = gagaAgGrid.getGridOptions(columnDefsGoodsCopy);
+	
+	$(document).ready(function() {
+		gagaAgGrid.createGrid('gridListCornerCopy', gridOptionsCornerCopy);
+		gagaAgGrid.createGrid('gridListGoodsCopy', gridOptionsGoodsCopy);
+	});
+
+/*]]>*/
+</script>
+</html>

+ 29 - 20
src/main/webapp/WEB-INF/views/marketing/PlanCornerListForm.html

@@ -29,6 +29,7 @@
 				name="planCornerListForm" action="#"
 				th:action="@{'/marketing/planning/corner/list'}" th:method="post">
 				<input type="hidden" th:field="*{planSq}" />
+				<input type="hidden" th:field="*{planDtlSq}" />
 				<table class="frmStyle" style="margin-bottom: 10px;">
 					<colgroup>
 						<col style="width: 10%;" />
@@ -191,13 +192,12 @@
 								$('#cornerNm').html('');
 								gagaAgGrid.createGrid('gridListGoods', gridOptionsGoods);
 				});
+		
+		uifnPopupClose('fnCreateGoods');
 	}
 	// 행추가
 	$('#btnAddRow').on('click', function() {
 		var allData = gagaAgGrid.getAllRowData(gridOptionsCorner);
-		console.log(allData.length);
-		console.log(allData[0]);
-		console.log(allData[0].crud);
 		var planSq = $('#planCornerListForm input[name=planSq]').val();
 		var stdt = planInfo.dispStdt.split(" ");
 		var eddt = planInfo.dispEddt.split(" ");
@@ -345,11 +345,13 @@
 		});
 	}
 
+	// 코너 복사
 	var fnCornerCopyPopup = function() {
-		var actionUrl = '/marketing/plan/corner/copy/list/form?planSq=' + planInfo.planSq;
+		var actionUrl = '/marketing/planning/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},
@@ -371,10 +373,10 @@
 				return '<img width="60" src="'+imgPath.replace('1000', '100')+'" onerror="this.src=\''+_uximgUrl+'/image/no.gif\';">';
 			}
 		},
-		{headerName: "전시순서"	, field:'dispOrd'		, width:80 , cellClass: 'text-center'
+		/* {headerName: "전시순서"	, field:'dispOrd'		, width:80 , cellClass: 'text-center'
 			, editable : true, cellEditor: 'numericCellEditor'
 			, valueFormatter: function(params) { return params.value.addComma(); }
-		},
+		}, */
 		{headerName: "재고"		, field:'stockQtySum'			, width:80 , cellClass: 'text-center'
 			, cellRenderer: function(params) {return !gagajf.isNull(params.value) ? params.value : '0'; }
 		},
@@ -425,8 +427,6 @@
 	// 상품 선택삭제
 	var fnDeleteGoods = function() {
 		var removedData = gagaAgGrid.removeRowData(gridOptionsGoods);
-// 		var data = new Object();
-		_planDtlSq = removedData[0].planDtlSq;
 
 		if (removedData.length == 0) {
 			mcxDialog.alert('선택된 행이 없습니다.');
@@ -439,9 +439,8 @@
 			sureBtnClick: function() {
 				var jsonData = JSON.stringify(removedData);
 
-				gagajf.ajaxJsonSubmit('/marketing/plan/corner/goods/delete', jsonData, function() {
+				gagajf.ajaxJsonSubmit('/marketing/planning/corner/goods/delete', jsonData, function() {
 					fnCornerSearch();
-//	 				fnCornerGoodsSearch(data);
 				});
 			}
 		});
@@ -464,10 +463,20 @@
 	}
 
 	var fnOpenGoodsPopup = function() {
-		if (gagaAgGrid.getAllRowData(gridOptionsCorner).length < 1 ) {
+		var allData = gagaAgGrid.getAllRowData(gridOptionsCorner);
+		if (allData.length < 1 ) {
 			mcxDialog.alert('기획전 코너가 존재 하지 않습니다.');
 			return;
 		}
+		if (allData[0].regNm == '' || allData[0].regNm == null) {
+			mcxDialog.alert('추가 된 코너를 저장 후 코너를 추가하세요.');
+			return;
+		}
+
+		if ($("#cornerNm").text() == null || $("#cornerNm").text()=='') {
+			mcxDialog.alert('코너를 선택해주세요.');
+			return;
+		}
 		cfnOpenGoodsPopup('fnCreateGoods');
 	}
 
@@ -502,16 +511,16 @@
 							  goodsCd : result[disp].goodsCd };
 				oldGoodsList.unshift(goods);
 			}
+			
+			mcxDialog.confirm('선택하신 상품을 추가 하시겠습니까?', {
+				cancelBtnText: "취소",
+				sureBtnText: "확인",
+				sureBtnClick: function() {
+					var jsonData = JSON.stringify(oldGoodsList);
+					gagajf.ajaxJsonSubmit('/marketing/planning/corner/goods/save', jsonData, fnCornerSearch);
+				}
+			});
 		}
-
-		mcxDialog.confirm('선택하신 상품을 추가 하시겠습니까?', {
-			cancelBtnText: "취소",
-			sureBtnText: "확인",
-			sureBtnClick: function() {
-				var jsonData = JSON.stringify(oldGoodsList);
-				gagajf.ajaxJsonSubmit('/marketing/planning/corner/goods/save', jsonData, fnCornerSearch);
-			}
-		});
 	}
 
 	// 순셔 변경 팝업

+ 109 - 118
src/main/webapp/WEB-INF/views/marketing/PlanListForm.html

@@ -14,36 +14,37 @@
  * 1.0  2021.02.03   sowon        최초 작성
  *******************************************************************************
  -->
-	<div id="main">
-		<div class="main-title">
-		</div>
+<div id="main">
+	<div class="main-title"></div>
 
-		<div class="panelStyle">
-			<form id="planListSearchForm" name="planListSearchForm" action="#" th:action="@{'/marketing/planning/list'}" onsubmit="$('#btnSearch').trigger('click'); return false;">
-				<table class="frmStyle">
-					<colgroup>
-						<col style="width:5%;"/>
-						<col style="width:20%;"/>
-						<col style="width:5%;"/>
-						<col style="width:20%;"/>
-						<col style="width:5%;"/>
-						<col style="width:10%;"/>
-						<col style="width:5%;"/>
-						<col style="width:10%;"/>
-						<col/>
-					</colgroup>
-					<tbody>
-						<tr>
-							<th>사이트</th>
-							<td>
-								<select name="siteCd">
-									<option value="">전체</option>
-									<th:block th:if="${siteCdList}" th:each="oneData, status : ${siteCdList}" >
-										<option th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
-									</th:block>
-								</select>
-							</td>
-							<!-- <th>기획전명</th>
+	<div class="panelStyle">
+		<form id="planListSearchForm" name="planListSearchForm" action="#"
+			th:action="@{'/marketing/planning/list'}"
+			onsubmit="$('#btnSearch').trigger('click'); return false;">
+			<table class="frmStyle">
+				<colgroup>
+					<col style="width: 5%;" />
+					<col style="width: 20%;" />
+					<col style="width: 5%;" />
+					<col style="width: 20%;" />
+					<col style="width: 5%;" />
+					<col style="width: 10%;" />
+					<col style="width: 5%;" />
+					<col style="width: 10%;" />
+					<col />
+				</colgroup>
+				<tbody>
+					<tr>
+						<th>사이트</th>
+						<td><select name="siteCd">
+								<option value="">전체</option>
+								<th:block th:if="${siteCdList}"
+									th:each="oneData, status : ${siteCdList}">
+									<option th:value="${oneData.cd}"
+										th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
+								</th:block>
+						</select></td>
+						<!-- <th>기획전명</th>
 							<td>
 								<input type="text" name="planNm" id="planNm"/>
 							</td>
@@ -51,102 +52,92 @@
 							<td colspan="3">
 								<input type="text" name="planSq" id="planSq"/>
 							</td> -->
-							<th>오픈여부</th>
-							<td>
-								<select name="openYn">
-									<option value="">전체</option>
-									<option th:if="${useYnList}" th:each="oneData, status : ${useYnList}" th:value="${oneData.cd}" th:text="|[${oneData.cd}] ${oneData.cdNm}|"></option>
-								</select>
-							</td>
-							<th>등록자</th>
-							<td>
-								<input type="text" name="regId" id="regId"/>
-							</td>
-							<th rowspan="3">키워드</th>
-							<td rowspan="3">
-								<select name="search" id="search">
-									<option value="searchPlanNm">기획전명</option>
-									<option value="searchPlanSq">기획전번호</option>
-								</select> 
-								<textarea class="textareaR3 w70p" name="condition" id="condition"></textarea>
-							</td>
-						</tr>
-						<tr>
-							<th>PC/모바일구분</th>
-							<td>
-								<select name="frontGb">
-									<option value="">ALL</option>
-									<option value="P">웹</option>
-									<option value="M">모바일</option>
-								</select>
-							</td>
+						<th>오픈여부</th>
+						<td><select name="openYn">
+								<option value="">전체</option>
+								<option th:if="${useYnList}"
+									th:each="oneData, status : ${useYnList}"
+									th:value="${oneData.cd}"
+									th:text="|[${oneData.cd}] ${oneData.cdNm}|"></option>
+						</select></td>
+						<th>등록자</th>
+						<td><input type="text" name="regId" id="regId" /></td>
+						<th rowspan="3">키워드</th>
+						<td rowspan="3"><select name="search" id="search">
+								<option value="searchPlanNm">기획전명</option>
+								<option value="searchPlanSq">기획전번호</option>
+						</select> <textarea class="textareaR3 w70p" name="condition" id="condition"></textarea>
+						</td>
+					</tr>
+					<tr>
+						<th>PC/모바일구분</th>
+						<td><select name="frontGb">
+								<option value="">ALL</option>
+								<option value="P">웹</option>
+								<option value="M">모바일</option>
+						</select></td>
 
-							<th>기획전구분</th>
-							<td>
-								<select name="planGb">
-									<option value="">전체</option>
-									<option value="P">기획전</option>
-									<option value="E">이벤트</option>
-								</select>
-							</td>
-							<th>기획전템플릿유형</th>
-							<td colspan="1">
-								<select name="templateType">
-									<option value="">전체</option>
-									<option value="H">HTML</option>
-									<option value="T">TEXT</option>
-								</select>
-							</td>
-						</tr>
+						<th>기획전구분</th>
+						<td><select name="planGb">
+								<option value="">전체</option>
+								<option value="P">기획전</option>
+								<option value="E">이벤트</option>
+						</select></td>
+						<th>기획전템플릿유형</th>
+						<td colspan="1"><select name="templateType">
+								<option value="">전체</option>
+								<option value="H">HTML</option>
+								<option value="T">TEXT</option>
+						</select></td>
+					</tr>
 
-						<tr>
-							<th>진행기간</th>
-							<td colspan="6" id="sellTerms"></td>
-						</tr>
-					</tbody>
-				</table>
-				
-				<ul class="panelBar">
-					<li class="center">
-					<input type="button" value="초기화" class="btn btn-gray btn-lg" id="btnInit"/>
-					<input type="button" value="조회" class="btn btn-base btn-lg" id="btnSearch"/>
-					</li>
-				</ul>
-				
+					<tr>
+						<th>진행기간</th>
+						<td colspan="6" id="sellTerms"></td>
+					</tr>
+				</tbody>
+			</table>
 
-	<div class="panelStyle">
-			<!-- 검색결과 영역 -->
-			<!-- 상단버튼 영역  -->
-			<ul class="panelBar">
-				<li>
-					<button type="button" class="btn btn-danger btn-lg" onclick="fnSelectedDelete();">삭제</button>
-				</li>
-				<li class="right">
-					<button type="button" class="btn btn-primary btn-lg" onclick="fnPlanWebRegisterPopup();">등록</button>
-					검색결과 : <strong><span id="gridRowTotalCount">0</span> 건</strong>&nbsp;
-					
-					쪽번호 <span id="pgNo">0</span>/ <strong id="endPgNo">0</strong>&nbsp;&nbsp;
-					<select id="pageSize" name="pageSize">
-						<option value="50" selected="selected">50개씩 보기</option>
-						<option value="100">100개씩 보기</option>
-						<option value="500">500개씩 보기</option>
-						<option value="1000">1000개씩 보기</option>
-					</select>
-					<input type="hidden" name="pageNo" id="pageNo" value ="1"/>
-				</li>
-			</ul>
-			
-			<div id="gridList" style="width: 100%; height: 500px;" class="ag-theme-balham"></div>
 			<ul class="panelBar">
-				<li class="center">
-					<div class="tablePaging" id="planListPagination"></div>
-				</li>
+				<li class="center"><input type="button" value="초기화"
+					class="btn btn-gray btn-lg" id="btnInit" /> <input type="button"
+					value="조회" class="btn btn-base btn-lg" id="btnSearch" /></li>
 			</ul>
 		</div>
-			</form>
-		</div>
 
-	</div>
+			<div class="panelStyle">
+				<!-- 검색결과 영역 -->
+				<!-- 상단버튼 영역  -->
+				<ul class="panelBar">
+					<li>
+						<button type="button" class="btn btn-danger btn-lg"
+							onclick="fnSelectedDelete();">삭제</button>
+					</li>
+					<li class="right">
+						<button type="button" class="btn btn-primary btn-lg"
+							onclick="fnPlanWebRegisterPopup();">등록</button> 검색결과 : <strong><span
+							id="gridRowTotalCount">0</span> 건</strong>&nbsp; 쪽번호 <span id="pgNo">0</span>/
+						<strong id="endPgNo">0</strong>&nbsp;&nbsp; <select id="pageSize"
+						name="pageSize">
+							<option value="50" selected="selected">50개씩 보기</option>
+							<option value="100">100개씩 보기</option>
+							<option value="500">500개씩 보기</option>
+							<option value="1000">1000개씩 보기</option>
+					</select> <input type="hidden" name="pageNo" id="pageNo" value="1" />
+					</li>
+				</ul>
+
+				<div id="gridList" style="width: 100%; height: 500px;"
+					class="ag-theme-balham"></div>
+				<ul class="panelBar">
+					<li class="center">
+						<div class="tablePaging" id="planListPagination"></div>
+					</li>
+				</ul>
+			</div>
+
+	</form>
+</div>
 
 <!-- 컬러 피커 -->
 <!-- <script src='https://bgrins.github.io/spectrum/spectrum.js'></script> -->

+ 393 - 0
src/main/webapp/WEB-INF/views/marketing/PlanTemplatePopupForm.html

@@ -0,0 +1,393 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : PlanCornerCopyForm.html
+ * @desc    : 기획전 템플릿  화면 Page
+ *============================================================================
+ * SISUN
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.02.18   sowon 		  최초 작성
+ *******************************************************************************
+ -->
+<div class="modalPopup" data-width="1200" data-height="800" id="popupPlanTemplate">
+	<div class="panelStyle" style="height: 750px;">
+		<div class="panelTitle">
+			<strong>기획전 템플릿</strong>
+			<button type="button" class="close"
+				onclick="uifnPopupClose('popupPlanTemplate')">
+				<i class="fa fa-times"></i>
+			</button>
+		</div>
+		
+	<div class="cardArea" style="height: 700px;margin: 3px;">
+		<form id="planTemplateForm" name="planTemplateForm" action="#" th:action="@{'/marketing/planning/corner/list'}" th:method="post">
+			<div class="panelContent">
+				<div class="panelStyle" style="margin: unset;">
+					<!-- TITLE -->
+					<div class="panelTitle">
+						<h2>리뷰 구간</h2>
+						<span class="panelControl"> 
+							<i class="fa inner-fa-chevron-up"></i> <!-- 열림/닫힘 화살표 -->
+						</span>
+					</div>
+					<!-- //TITLE -->
+					<div class="inner-panelContent">
+						<div class="panelContent">
+							<table class="frmStyle">
+								<colgroup>
+									<col width="10%" />
+									<col width="90%" />
+								</colgroup>
+								<tr>
+									<th>리뷰</th>
+									<td>
+										<div class="padding10">
+											<span class="buttonSpan">
+												<button type="button" class="btn btnRight btn-success btn-lg" id="">리뷰조회</button>
+												<button type="button" class="btn btnRight btn-success btn-lg" id="">행삭제</button>
+											</span> <br />
+											<div id="gridListPlanReview" style="width: 100%; height: 200px;" class="ag-theme-balham"></div>
+										</div>
+									</td>
+									
+									<th>전시순서</th>
+									<td><input type="text" value="" placeholder="1" class="w100 aR"></td>
+								</tr>
+							</table>
+						</div>
+					</div>
+				</div>
+			</div>
+
+			<div class="panelContent">
+				<div class="panelStyle" style="margin: unset;">
+					<!-- TITLE -->
+					<div class="panelTitle">
+						<h2>쿠폰 조회</h2>
+						<span class="panelControl"> 
+							<i class="fa inner-fa-chevron-up"></i> <!-- 열림/닫힘 화살표 -->
+						</span>
+					</div>
+					<!-- //TITLE -->
+					<div class="inner-panelContent">
+						<div class="panelContent">
+							<table class="frmStyle">
+								<colgroup>
+									<col width="10%" />
+									<col width="90%" />
+								</colgroup>
+								<tr>
+									<th>쿠폰</th>
+									<td>
+										<div class="padding10">
+											<span class="buttonSpan">
+												<button type="button" class="btn btnRight btn-success btn-lg" id="">쿠폰 조회</button>
+												<button type="button" class="btn btnRight btn-success btn-lg" id="">행 삭제</button>
+											</span> <br />
+											<div id="gridListPlanCoupon" style="width: 100%; height: 200px;" class="ag-theme-balham"></div>
+										</div>
+									</td>
+									
+									<th>전시순서</th>
+									<td><input type="text" value="" placeholder="2" class="w100 aR"></td>
+								</tr>
+							</table>
+						</div>
+					</div>
+				</div>
+			</div>
+			
+			<div class="panelContent">
+				<div class="panelStyle" style="margin: unset;">
+					<!-- TITLE -->
+					<div class="panelTitle">
+						<h2>이미지 첨부</h2>
+						<span class="panelControl"> 
+							<i class="fa inner-fa-chevron-up"></i> <!-- 열림/닫힘 화살표 -->
+						</span>
+					</div>
+					<!-- //TITLE -->
+					<div class="inner-panelContent">
+						<div class="panelContent">
+							<table class="frmStyle">
+								<colgroup>
+									<col width="10%" />
+									<col width="90%" />
+								</colgroup>
+								<tr>
+									<th>파일첨부</th>
+									<td colspan="5">
+										<div id="registeredFile"></div>
+										<div style="display: block">
+											<select name="fileCnt" id="fileCnt">
+												<th:block th:each="num: ${#numbers.sequence(1,5)}">
+													<option th:value="${num}" th:text="${num}"></option>
+												</th:block>
+											</select>* 파일 개수 선택(5개까지 가능)
+										</div>
+										<th:block th:each="num: ${#numbers.sequence(1,5)}">
+											<div>
+												<div class="uFile w500">
+													<input type="file" th:id="${'file' + num}" th:name="${'file' + num}" class="uFileInput w500"/>
+													<label th:for="${'file' + num}" class="uFileLabel">파일선택</label>
+													<input type="hidden" name="orgFileNms" th:id="${'orgFileNm' + num}"/>
+													<input type="hidden" name="sysFileNms" th:id="${'sysFileNm' + num}"/>
+												</div>
+												<br/>
+											</div>
+										</th:block>
+									</td>
+									
+									<th>전시순서</th>
+									<td><input type="text" value="" placeholder="3" class="w100 aR"></td>
+								</tr>
+							</table>
+						</div>
+					</div>
+				</div>
+			</div>
+			
+			<div class="panelContent">
+				<div class="panelStyle" style="margin: unset;">
+					<!-- TITLE -->
+					<div class="panelTitle">
+						<h2>HTML</h2>
+						<select>
+							<option>상단</option>
+							<option>하단</option>
+						</select>
+						<span class="panelControl"> 
+							<i class="fa inner-fa-chevron-up"></i> <!-- 열림/닫힘 화살표 -->
+						</span>
+					</div>
+					<!-- //TITLE -->
+					<div class="inner-panelContent">
+						<div class="panelContent">
+							<table class="frmStyle">
+								<colgroup>
+									<col width="10%" />
+									<col width="90%" />
+								</colgroup>
+								<tr>
+									<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>모바일용소스</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>
+									<th colspan="2">전시순서</th>
+									<td><input type="text" value="" placeholder="4" class="w100 aR"></td>
+								</tr>
+							</table>
+						</div>
+					</div>
+				</div>
+			</div>
+			
+			<div class="panelContent">
+				<div class="panelStyle" style="margin: unset;">
+					<!-- TITLE -->
+					<div class="panelTitle">
+						<h2>상품</h2>
+						<button type="button" class="btn btnRight btn-success btn-lg" id="">추가</button><br>
+						<span class="panelControl"> 
+							<i class="fa inner-fa-chevron-up"></i> <!-- 열림/닫힘 화살표 -->
+						</span>
+					</div>
+					<!-- //TITLE -->
+					<div class="inner-panelContent">
+						<div class="panelContent">
+						<strong>화면 구성:</strong>
+							<select>
+								<option>1</option>
+								<option>2</option>
+								<option>4</option>
+							</select><br>
+							<table class="frmStyle">
+								<colgroup>
+									<col width="10%" />
+									<col width="90%" />
+								</colgroup>
+								<tr>
+									<th>상품</th>
+									<td>
+										<div class="padding10">
+											<ul class="panelBar">
+											<li class="right">
+												<button type="button" class="btn btn-base btn-lg" id="">상품 조회</button>
+												<button type="button" class="btn btn-danger btn-lg" id="">행 삭제</button>
+											</li>
+											</ul><br />
+												<table class="frmStyle">
+													<colgroup>
+														<col width="10%" />
+														<col width="90%" />
+													</colgroup>
+													<tr>
+														<th>상품이름</th>
+														<td colspan="5">
+															<div style="margin-top: 5px;">
+
+															</div>
+														</td>
+														<th>재고</th>
+														<td colspan="5">
+															<div style="margin-top: 5px;">
+
+															</div>
+														</td>
+													</tr>
+												</table>
+											</div>
+									</td>
+									
+									<th>전시순서</th>
+									<td><input type="text" value="" placeholder="5" class="w100 aR"></td>
+								</tr>
+							</table>
+						</div>
+					</div>
+				</div>
+			</div>
+			
+			
+		</form>
+	</div>
+</div>
+</div>
+
+<script type="text/javascript" src="/ux/plugins/summernote/summernote.js?v=2020103001"></script>
+<script type="text/javascript" src="/ux/plugins/gaga/gaga.summernote.js?v=2020103001"></script>
+<script th:inline="javascript">
+/*<![CDATA[*/
+	// 리뷰 리스트 설정
+	var columnReviewList = [
+		{width: 40, minWidth: 40, cellClass: 'text-center', headerCheckboxSelection: true, checkboxSelection: true, filter: false},
+		{headerName: "리뷰ID", field: "", width: 110, cellClass: 'text-center'},
+		{headerName: "", field: "", width: 120, cellClass: 'text-center'},
+		{headerName: "", field: "", width: 150, cellClass: 'text-center'},
+	];
+	
+	// 쿠폰 리스트 설정
+	var columnCouponList = [
+		{width: 40, minWidth: 40, cellClass: 'text-center', headerCheckboxSelection: true, checkboxSelection: true, filter: false},
+		{headerName: "쿠폰ID", field: "", width: 110, cellClass: 'text-center'},
+		{headerName: "", field: "", width: 120, cellClass: 'text-center'},
+		{headerName: "", field: "", width: 150, cellClass: 'text-center'},
+	];
+	
+	// 상품 리스트 설정
+	//var columnGoodsList = [
+	//	{width: 40, minWidth: 40, cellClass: 'text-center', headerCheckboxSelection: true, checkboxSelection: true, filter: false},
+	//	{headerName: "상품ID", field: "", width: 110, cellClass: 'text-center'},
+	//	{headerName: "", field: "", width: 120, cellClass: 'text-center'},
+	//	{headerName: "", field: "", width: 150, cellClass: 'text-center'},
+	//];
+	
+	
+	// 리뷰 그리드 설정
+	var gridOptionsPlanReviewList = gagaAgGrid.getGridOptions(columnReviewList);
+	gridOptionsPlanReviewList.rowSelection = "single";
+	gridOptionsPlanReviewList.suppressRowClickSelection = true;
+	
+	// 리뷰 그리드 설정
+	var gridOptionsPlanCouponeList = gagaAgGrid.getGridOptions(columnCouponList);
+	gridOptionsPlanCouponeList.rowSelection = "single";
+	gridOptionsPlanCouponeList.suppressRowClickSelection = true;
+	
+	// 상품 그리드 설정
+	//var gridOptionsPlanGoodsList = gagaAgGrid.getGridOptions(columnGoodsList);
+	//gridOptionsPlanGoodsList.rowSelection = "single";
+	//gridOptionsPlanGoodsList.suppressRowClickSelection = true;
+	
+	
+	
+	
+	// 첨부파일 삭제
+	var fnDeleteFile = function(obj, noticeSq, seq, sysFileNm) {
+		mcxDialog.confirm('정말 삭제하시겠습니까?', {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function(){
+				var params = new Object();
+				params.noticeSq = noticeSq;
+				params.seq = seq;
+				params.sysFileNm = sysFileNm;
+
+				var jsonData = JSON.stringify(params);
+				gagajf.ajaxJsonSubmit('/board/notice/file/delete', jsonData, function() {
+					$(obj).parent().remove();
+				});
+			}
+		});
+	}
+	
+	
+	// 첨부파일 개수 선택시
+	$("#fileCnt").on("change", function() {
+		for (var i = 1; i <= 5; i++) {
+			$('#file' + i).parent().parent().show();
+		}
+
+		var fileCnt = $(this).val();
+		for (var i = 5; i > fileCnt; i--) {
+			$('#file' + i).parent().parent().hide();
+		}
+	});
+
+	// 파일첨부 선택 시
+	$('#file1').on('change', function() { fnChooseFile(this, 1); });
+	$('#file2').on('change', function() { fnChooseFile(this, 2); });
+	$('#file3').on('change', function() { fnChooseFile(this, 3); });
+	$('#file4').on('change', function() { fnChooseFile(this, 4); });
+	$('#file5').on('change', function() { fnChooseFile(this, 5); });
+
+	var fnChooseFile = function(obj, fileNo) {
+		// multiple 속성이 있으면 files에는 다수의 객체가 할당됨
+		var file = obj.files[0];
+
+		// 파일 업로드
+		gagajf.ajaxFileUpload('/common/file/upload?subDir=/planning'
+				, file
+				, function(result) {
+					// 업로드한 파일명 설정
+					$('#orgFileNm' + fileNo).val(result.oldFileName);
+					$('#sysFileNm' + fileNo).val(result.newFileName);
+				}
+		);
+	}
+	
+$(document).ready(function() {
+		
+		
+		// 썸머노트 그리기
+		gagaSn.createSummernote(snOptions, '#fsrcPcDetail');
+		gagaSn.createSummernote(snOptions, '#fsrcMobileDetail');
+		
+		// 그리드 그리기
+		gagaAgGrid.createGrid("gridListPlanReview", gridOptionsPlanReviewList);
+		gagaAgGrid.createGrid("gridListPlanCoupon", gridOptionsPlanCouponeList);
+		//gagaAgGrid.createGrid("gridListPlanGoods", gridOptionsPlanGoodsList);
+		
+		$("#fileCnt").trigger('change');
+		
+});
+
+/*]]>*/
+</script>
+</html>

+ 11 - 3
src/main/webapp/WEB-INF/views/marketing/PlanWebDetailPopupForm.html

@@ -296,7 +296,7 @@
 								<option value="">선택</option>
 								<option th:if="${planList}" th:each="oneData, status : ${planList}" th:value="${oneData.planSq}" th:text="|[${oneData.planSq}]  ${oneData.planNm}|"></option>
 							</select>
-							<button type="button" class="btn btn-default btn-lg" onclick="fnPlanCopyPopup();">기획전복사</button>
+							<button type="button" class="btn btn-default btn-lg" onclick="fnPlanCopyPopup();">기획전 복사</button>
 						</td>
 					</tr>
 				</table>
@@ -320,10 +320,11 @@
 						</td>
 						<th>기획전탬플릿유형<i class="star"></i></th>
 						<td colspan="3">
-							<select name="templateType" required="required" data-valid-name="기획전탬플릿유형">
+							<button type="button" class="btn btn-default btn-lg" onclick="fnPlanTemplatePopup();">템플릿</button>
+							<!-- <select name="templateType" required="required" data-valid-name="기획전탬플릿유형">
 								<option value="H">HTML</option>
 								<option value="T">TEXT</option>
-							</select>
+							</select> -->
 						</td>
 					</tr>
 					<tr>
@@ -576,6 +577,13 @@
 			$(formId + ' input[name=goodsLimitQty]').hide();
 		}
 	}
+	
+	//템플릿 유형 설정
+	var fnPlanTemplatePopup = function () {
+		var actionUrl = "/marketing/planning/webdetail/template/form?mode=C";
+		cfnOpenModalPopup(actionUrl,'popupPlanTemplate');
+	}
+	
 
 	// 기획전 복사
 	var fnPlanCopyPopup = function() {