sowon4187 5 anni fa
parent
commit
00a9459619

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

@@ -93,6 +93,7 @@ public class Plan extends TscBaseDomain{
 		private String planDtlStat;			//기획전상세상태(공통코드G044)
 		private String copyBrandCd;	        //복사할 브랜드코드
 		private String adminPreview;	// 어드민미리보기 여부 (Y:미리보기)
+		private String brandCd;
 		// 기획전 브랜드
 		private String brandGroupNo;	//기획전브랜드그룹번호
 		private String DispYn;      	//표시여부           

+ 204 - 2
src/main/java/com/style24/persistence/mybatis/shop/TssPlan.xml

@@ -4,7 +4,7 @@
 
 	<!-- 기획전 리스트 카운트 조회-->
 	<select id="getPlanListCount" parameterType="Plan" resultType="int">
-		/* TsaPlan.getPlanListCount */
+		/* TssPlan.getPlanListCount */
 		SELECT COUNT(1)
 		  FROM TB_PlAN
 		 WHERE 1=1
@@ -13,7 +13,7 @@
 	
 	<!-- 기획전 목록 -->
 	<select id="getPlanList" parameterType="Plan" resultType="Plan">
-		/* TsaPlan.getPlanList */
+		/* TssPlan.getPlanList */
 		 SELECT Z.*
 		 FROM(
 		      SELECT @rownum := @rownum + 1 AS RNUM
@@ -65,6 +65,208 @@
 		     
 	</select>
 	
+	<!-- 기획전 카테고리 목록 -->
+	<select id="getPlanningCategoryList" parameterType="Plan" resultType="Plan">
+		/* TssPlan.getPlanningCategoryList */
+		SELECT C.CATE1_NO AS CATE_NO            /*카테고리번호*/
+		     , C.CATE1_NM AS CATE_NM /*카테고리명*/
+		FROM TB_CATE1 C
+		WHERE 1=1
+		AND    C.SITE_CD = #{siteCd}
+		AND    C.CATE_GB = 'G032_101' /*BYITEM*/
+		AND    C.CATE_TYPE = 'G031_10' /*상품카테고리*/
+		AND    C.DISP_YN = 'Y' /*전시하는 카테고리*/
+	</select>
+	
+	<insert id="createPlanBrand" parameterType="Plan">
+		/* TssPlan.createPlanBrand */
+		INSERT INTO TB_PLAN_BRAND
+		    (
+		        BRAND_GROUP_NO
+		      , PLAN_SQ
+		      , DISP_YN
+		      , REG_NO
+		      , REG_DT
+		      , UPD_NO
+		      , UPD_DT
+		    )
+		VALUES
+		   (
+	          ( SELECT BRAND_GROUP_NO 
+		        FROM TB_BRAND TB 
+		        WHERE BRAND_CD = #{brandGroupNo}
+		      )
+		    , #{planSq}
+		    ,'Y'
+		    , #{regNo}
+		    , CURRENT_TIMESTAMP
+		    , #{updNo}
+		    , CURRENT_TIMESTAMP
+		   )
+	</insert>
+	
+	<!-- 기획전 등록 -->
+	<insert id="createPlanInfo" parameterType="Plan">
+		/* TssPlan.createPlanInfo */
+		<selectKey keyProperty="planSq" resultType="Integer" order="AFTER">
+			SELECT LAST_INSERT_ID()	/* 기획전 일련번호  */
+		</selectKey>
+		INSERT INTO TB_PLAN (
+		       PLAN_SQ               
+		     , PLAN_NM               
+		     , PLAN_GB               
+		     , SITE_CD               
+		     , FRONT_GB              
+		     , DISP_STDT             
+		     , DISP_EDDT             
+		     , MAIN_PIMG             
+		     , MAIN_MIMG             
+		     , DTL_PIMG              
+		     , DTL_MIMG              
+		     , DTL_TITLE1            
+		     , REPLY_YN              
+		     , REPLY_LOC           
+		     , REPLY_IMG           
+		     , REPLY_TITLE1        
+		     , REPLY_TITLE2        
+		     , POLL_SQ       
+		     , NEW_CUST_YN
+		     , CUST_JOIN_STDT
+		     , CUST_JOIN_EDDT     
+		     , DEV_URL             
+		     , CORNER_NM_DISP_YN   
+		     , GOODS_LIMIT_YN      
+		     , GOODS_LIMIT_QTY     
+		     , DEL_YN              
+		     , OPEN_YN             
+		     , DISP_ORD            
+		     , READ_CNT              
+		     , BADGE_NM              
+		     , BADGE_FCOLOR          
+		     , BADGE_BCOLOR          
+		     , REG_NO               
+		     , REG_DT                
+		     , UPD_NO                
+		     , UPD_DT                
+		   ) VALUES (
+		       #{planSq}
+		     , #{planNm}
+		     , #{planGb}
+		     , #{siteCd}
+		     , #{frontGb}
+		     , DATE_FORMAT(#{dispStdt} , '%Y-%m-%d %H:%i:%s')
+		     , DATE_FORMAT(#{dispEddt} , '%Y-%m-%d %H:%i:%s')
+		     , #{mainPimg}
+		     , #{mainMimg}
+		     , #{dtlPimg}
+		     , #{dtlMimg}
+		     , #{dtlTitle1}
+		     , 'N'
+		     , #{replyLoc}
+		     , #{replyImg}
+		     , #{replyTitle1}
+		     , #{replyTitle2}
+		     , #{pollSq}
+		     , 'N'
+		     , #{custJoinStdt}
+		     , #{custJoinEddt}
+		     , #{devUrl}
+		     , #{cornerNmDispYn}
+		     , IFNULL(#{goodsLimitYn}, 'N')
+		     , #{goodsLimitQty}
+		     , 'N'
+		     , #{openYn}
+		     , #{dispOrd}
+		     , 1
+		     , #{badgeNm}
+		     , #{badgeFcolor}
+		     , #{badgeBcolor}
+		     , #{regNo}
+		     , now() 
+		     , #{updNo}
+		     , now()
+		)
+	</insert>
+	
+	<insert id="createPlanCate" parameterType="Plan">
+		/* TssPlan.createPlanCate */
+		INSERT INTO TB_PLAN_CATE
+		(
+			CATE_NO
+		  , PLAN_SQ
+		  , DISP_YN
+		  , REG_NO
+		  , REG_DT
+		  , UPD_NO
+		  , UPD_DT
+		)
+		VALUES(
+		    #{cateNo}
+		  , #{planSq}
+		  , 'Y'
+		  , #{regNo}
+		  , now()
+		  , #{updNo}
+		  , now()
+		)
+	</insert>
+	
+	<insert id="createPlanCustGb" parameterType="Plan">
+		/* TssPlan.createPlanCustGb */
+		INSERT INTO TB_PLAN_CUST_DIVISION
+		                                    (
+		                                        PLAN_SQ
+		                                      , CUST_GB
+		                                      , REG_NO
+		                                      , REG_DT
+		                                    )
+		                             VALUES(
+		                                      #{planSq}
+		                                   ,  #{custGb}
+		                                   ,  #{regNo}
+		                                   , CURRENT_TIMESTAMP
+		                                  )
+	</insert>
+	
+	<select id="getPlanBrandList" parameterType="Plan" resultType="Plan">
+		/* TsaPlan.getPlanBrandList */
+		SELECT TP.PLAN_NM AS PLAN_NM
+		     , TP.PLAN_SQ AS PLAN_SQ
+		     , TB.BRAND_GROUP_ENM AS BRAND_GROUP_ENM
+		     , TB.BRAND_GROUP_NO AS BRAND_GROUP_NO
+		     , TB.BRAND_GROUP_KNM AS BRAND_GROUP_KNM
+		     , B.BRAND_CD
+		FROM TB_PLAN TP  LEFT OUTER JOIN TB_PLAN_BRAND TPB 
+		                    ON TP.PLAN_SQ = TPB.PLAN_SQ 
+		                 LEFT OUTER JOIN  TB_BRAND_GROUP TB
+		                    ON TPB.BRAND_GROUP_NO = TB.BRAND_GROUP_NO 
+		                 INNER JOIN TB_BRAND B
+		                    ON TB.BRAND_GROUP_NO = B.BRAND_GROUP_NO 
+		WHERE 1=1
+		    AND TP.PLAN_SQ = TPB.PLAN_SQ 
+		    AND TP.PLAN_SQ = #{planSq}
+		    AND TP.DEL_YN = 'N'
+	</select>
+	
+	<select id="getPlanCateList" parameterType="Plan" resultType="Plan">
+		/* TsaPlan.getPlanCateList */
+		 SELECT TP.PLAN_NM AS PLAN_NM
+		      , TP.PLAN_SQ AS PLAN_SQ
+		      , TC.CATE1_NM AS CATE_NM
+		      , TC.CATE1_NO AS CATE_NO
+		      , TC.CATE_GB AS CATE_GB
+		      , TP.SITE_CD AS SITE_CD
+		FROM TB_PLAN TP  LEFT OUTER JOIN TB_PLAN_CATE TPC 
+		                       ON TP.PLAN_SQ = TPC.PLAN_SQ 
+		                 LEFT OUTER JOIN  TB_CATE1 TC
+		                       ON TPC.CATE_NO = TC.CATE1_NO 
+		WHERE 1=1
+		    AND TP.PLAN_SQ = TPC.PLAN_SQ 
+		    AND TP.PLAN_SQ = #{planSq}
+		AND TP.DEL_YN = 'N'
+	</select>
+	
+	
 	
 	
 

+ 66 - 0
src/main/java/com/style24/scm/biz/dao/TssPlanDao.java

@@ -35,4 +35,70 @@ public interface TssPlanDao {
 	 */
 	int getPlanListCount(Plan param);
 	
+	/**
+	 * 기획전 카테고리 목록
+	 *
+	 * @param plan
+	 * @return
+	 * @author sowon
+	 * @since 2021. 05. 05
+	 */
+	Collection<Plan> getPlanningCategoryList(Plan param);
+	
+	/**
+	 * 기획전 웹 등록
+	 *
+	 * @param 기획전 등록 정보
+	 * @author rladbwnd5
+	 * @since 2021. 05. 05
+	 */
+	void createPlanInfo(Plan param);
+	
+	/**
+	 * 기획전 브랜드 등록
+	 *
+	 * @param
+	 * @author sowon
+	 * @since 2021. 05. 05
+	 */
+	void createPlanBrand(Plan param);
+	
+	/**
+	 * 기획전 카테고리 등록
+	 *
+	 * @param
+	 * @author sowon
+	 * @since  2021. 05. 05
+	 */
+	void createPlanCate(Plan param);
+	
+
+	/**
+	 * 기획전 회원구분 등록
+	 *
+	 * @param
+	 * @author sowon
+	 * @since 2021. 05. 05
+	 */
+	void createPlanCustGb(Plan param);
+	
+	/**
+	 * 기획전 브랜드 목록
+	 *
+	 * @param 
+	 * @return
+	 * @author sowon
+	 * @since  2021. 05. 05
+	 */
+	Collection<Plan> getPlanBrandList(Plan param);
+	
+	/**
+	 * 기획전 카테고리 목록
+	 *
+	 * @param 
+	 * @return
+	 * @author sowon
+	 * @since 2021. 05. 05
+	 */
+	Collection<Plan> getPlanCateList(Plan param);
 }

+ 172 - 0
src/main/java/com/style24/scm/biz/service/TssPlanService.java

@@ -1,14 +1,21 @@
 package com.style24.scm.biz.service;
 
+import java.io.File;
 import java.util.Collection;
 
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.core.env.Environment;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.StringUtils;
 
 import com.fasterxml.jackson.databind.ObjectMapper;
+import com.gagaframework.web.util.GagaDateUtil;
+import com.gagaframework.web.util.GagaFileUtil;
+import com.gagaframework.web.util.GagaStringUtil;
 import com.style24.persistence.domain.Plan;
 import com.style24.scm.biz.dao.TssPlanDao;
+import com.style24.scm.support.security.session.TssSession;
 
 import lombok.extern.slf4j.Slf4j;
 /**
@@ -50,5 +57,170 @@ public class TssPlanService {
 	public int getPlanListCount(Plan param) {
 		return planDao.getPlanListCount(param);
 	}
+	
+	/**
+	 * 기획전 카테고리 목록
+	 *
+	 * @param plan
+	 * @return
+	 * @author sowon
+	 * @since 2021. 05. 05
+	 */
+	public Collection<Plan> getPlanningCategoryList(Plan param){
+		return planDao.getPlanningCategoryList(param);
+	}
+	
+	/**
+	 * 기획전 웹 등록
+	 *
+	 * @param
+	 * @return
+	 * @author sowon
+	 * @since 2021. 5. 5
+	 */
+	@Transactional("shopTxnManager")
+	public void createPlanInfo(Plan param) {
+		Plan plan = new Plan();
+		// 입점업체담당자는 업체코드 설정
+		if ("G001_B000".equals(TssSession.getInfo().getRoleCd())) {
+			param.setRegNo(TssSession.getInfo().getUserNo());
+			param.setUpdNo(TssSession.getInfo().getUserNo());
+		}
+		int ind = 1;
+		
+		if(param.getMainPimg() != null && !"".equals(param.getMainPimg())){
+			String imgInd = String.valueOf(ind);
+			if (ind < 10) {
+				imgInd = "0" + imgInd;
+			}
+			String planUploadPath = env.getProperty("upload.default.target.path");
+			String yearMonth = GagaDateUtil.getToday().substring(0, 6);
+			planUploadPath = GagaFileUtil.getConcatenationPath(planUploadPath, "/planning");
+			File newFile = new File(GagaFileUtil.getConcatenationPath(planUploadPath, param.getMainPimg()));
+			planUploadPath = GagaFileUtil.getConcatenationPath(planUploadPath, yearMonth);
+			String newFilename = "PLANNING_" + GagaDateUtil.getTodayDateTime() + "_" + imgInd + "." + StringUtils.getFilenameExtension(param.getMainPimg());
+			File uniqueFile = GagaFileUtil.getUniqueFile(new File(GagaFileUtil.getConcatenationPath(planUploadPath, newFilename)));
+			// Rename a file
+			File path = new File(planUploadPath);
+			if (!path.exists()) {
+				path.mkdir();
+			}
+			newFile.renameTo(uniqueFile);
+			param.setMainPimg("/planning/" + yearMonth + "/" + newFilename);
+			param.setMainMimg("/planning/" + yearMonth + "/" + newFilename);
+		}
 
+		planDao.createPlanInfo(param);
+		
+		String[] brand = param.getMultiBrand();
+		// 기획전 브랜드 insert
+		for (int j = 0; j < brand.length; j++) {
+			plan.setBrandGroupNo(brand[j]);
+			plan.setPlanSq(param.getPlanSq());
+			plan.setRegNo(TssSession.getInfo().getUserNo());
+			plan.setUpdNo(TssSession.getInfo().getUserNo());
+			planDao.createPlanBrand(plan);
+		}
+		    
+		String[] cate = param.getMultiCate();
+		// 기획전 카테고리insert
+		for (int j = 0; j < cate.length; j++) {
+			plan.setCateNo(cate[j]);
+			plan.setPlanSq(param.getPlanSq());
+			plan.setRegNo(TssSession.getInfo().getUserNo());
+			plan.setUpdNo(TssSession.getInfo().getUserNo());
+			planDao.createPlanCate(plan);
+		}
+		
+		// 기획전 회원구분 insert
+		String[] custGb = param.getUsableCustGbArr();
+		for (int j = 0; j < custGb.length; j++) {
+			plan.setCustGb(custGb[j]);
+			plan.setPlanSq(param.getPlanSq());
+			plan.setRegNo(TssSession.getInfo().getUserNo());
+			planDao.createPlanCustGb(plan);
+		}
+		
+		// 기획전 회원등급 insert
+//		String[] custGrade = param.getUsableCustGradeArr();
+//		for (int j = 0; j < custGrade.length; j++) {
+//			plan.setCustGrade(custGrade[j]);
+//			plan.setPlanSq(param.getPlanSq());
+//			plan.setRegNo(TsaSession.getInfo().getUserNo());
+//			planDao.createPlanCustGrade(plan);
+//		}
+		
+		log.debug("planSq : {}", param.getPlanSq());
+
+		//기획전 응모이벤트
+//		if (StringUtils.isNotBlank(param.getPrivacyPolicy())) {
+//			int i = 0;
+//			for (String planQtitle : param.getPlanQtitle()) {
+//				PlanQuestAnswer planQuestAnswer = new PlanQuestAnswer();
+//				planQuestAnswer.setPlanSq(param.getPlanSq());
+//				planQuestAnswer.setPlanQtitle(planQtitle);
+//				planQuestAnswer.setAttachYn(param.getAttachYn()[i]);
+//				planQuestAnswer.setQuestNo(i);
+//				planQuestAnswer.setRegNo(param.getRegNo());
+//				planQuestAnswer.setUpdNo(param.getUpdNo());
+//				planDao.savePlanQuestion(planQuestAnswer);
+//				i++;
+//			}
+//		}
+
+	}
+	
+	/**
+	 * 기획전 상세 정보
+	 *
+	 * @param
+	 * @return
+	 * @author sowon
+	 * @since 2021. 5. 5
+	 */
+	public Plan getPlanDetailInfo(Plan param) {
+		Collection<Plan> planList = planDao.getPlanList(param);
+		Plan planInfo = new Plan();
+
+		if (!planList.isEmpty()) {
+			for (Plan plan : planList) {
+				planInfo = plan;
+			}
+		}
+
+		// 날짜 설정
+		String[] stDate = planInfo.getDispStdt().split(" ");
+		planInfo.setStartSearchDate(stDate[0]);
+		planInfo.setStartSearchTime(GagaStringUtil.replace(stDate[1], ":", "").substring(0, 6));
+
+		String[] edDate = planInfo.getDispEddt().split(" ");
+		planInfo.setEndSearchDate(edDate[0]);
+		planInfo.setEndSearchTime(GagaStringUtil.replace(edDate[1], ":", "").substring(0, 6));
+
+		return planInfo;
+	}
+	
+	/**
+	 * 기획전 브랜드 목록
+	 *
+	 * @param 
+	 * @return
+	 * @author sowon
+	 * @since 2021. 5. 5
+	 */
+	public Collection<Plan> getPlanBrandList(Plan param){
+		return planDao.getPlanBrandList(param);
+	}
+
+	/**
+	 * 기획전 카테고리 목록
+	 *
+	 * @param 
+	 * @return
+	 * @author sowon
+	 * @since 2021. 5. 5
+	 */
+	public Collection<Plan> getPlanCateList(Plan param){
+		return planDao.getPlanCateList(param);
+	}
 }

+ 79 - 0
src/main/java/com/style24/scm/biz/web/TssMarketingController.java

@@ -16,6 +16,9 @@ import org.springframework.web.bind.annotation.ResponseBody;
 import org.springframework.web.servlet.ModelAndView;
 
 import com.gagaframework.web.parameter.GagaMap;
+import com.gagaframework.web.rest.server.GagaResponse;
+import com.style24.core.support.env.TscConstants;
+import com.style24.core.support.message.TscMessageByLocale;
 import com.style24.persistence.TscPageRequest;
 import com.style24.persistence.domain.Plan;
 import com.style24.scm.biz.service.TssPlanService;
@@ -36,6 +39,9 @@ import lombok.extern.slf4j.Slf4j;
 @Slf4j
 public class TssMarketingController extends TssBaseController {
 
+	@Autowired
+	private TscMessageByLocale message;
+	
 	@Autowired
 	private TssPlanService planService;
 	
@@ -63,6 +69,10 @@ public class TssMarketingController extends TssBaseController {
 		String supplyCompCd = TssSession.getInfo().getSupplyCompCd();
 		String selfYn = "N";
 		mav.addObject("supplyCompList", rendererService.getSupplyCompanyList(supplyCompCd, selfYn));
+		
+		// 사이트 목록
+		mav.addObject("siteCdList", rendererService.getCommonCodeList("G000"));
+		
 		// 사용여부
 		mav.addObject("useYnList", rendererService.getAvailCommonCodeList("G002"));
 		mav.setViewName("marketing/PlanListForm");
@@ -103,6 +113,75 @@ public class TssMarketingController extends TssBaseController {
 
 		return result;
 	}
+	
+	/**
+	 * 기획전 웹 등록/수정 화면
+	 *
+	 * @return
+	 * @author sowon
+	 * @since 2021. 2. 04
+	 */
+	@GetMapping("/planning/detail/form")
+	public ModelAndView planDetailForm(Plan param) {
+		ModelAndView mav = new ModelAndView();
+		param.setSiteCd(TscConstants.Site.STYLE24.value());
+
+		if (param.getMode().equals("N")) { // 신규 일 때
+			// 기획전 전체 목록
+			//mav.addObject("planList", planService.getPlanAllList(param));
+
+			// 브랜드 목록
+			mav.addObject("brandList", rendererService.getSupplyCompanyBrandList(""));
+
+		} 
+		else if (param.getMode().equals("U")) { // 상세 일 때
+			mav.addObject("planInfo", planService.getPlanDetailInfo(param));
+
+			// 등록했던 브랜드
+			mav.addObject("planBrandList", planService.getPlanBrandList(param));
+
+			// 등록했던 카테고리
+			mav.addObject("planCateList", planService.getPlanCateList(param));
+
+			mav.addObject("brandList", rendererService.getSupplyCompanyBrandList(""));
+
+		}
+
+		// 사이트 목록
+		mav.addObject("siteList", rendererService.getAvailCommonCodeList("G000"));
+		
+		// 카테고리 리스트
+		mav.addObject("cateList", planService.getPlanningCategoryList(param));
+		
+		// 사용가능 고객등급 조회
+		mav.addObject("usableCustGradeList", rendererService.getAvailCommonCodeList("G110"));
+		
+		// 사용여부
+		mav.addObject("useYnList", rendererService.getAvailCommonCodeList("G002"));
+
+		
+		String supplyCompCd = TssSession.getInfo().getSupplyCompCd();
+		String selfYn = "N";
+		mav.addObject("supplyCompList", rendererService.getSupplyCompanyList(supplyCompCd, selfYn));
+
+		mav.addObject("mode", param.getMode());
+		mav.setViewName("marketing/PlanDetailPopupForm");
+		return mav;
+	}
+	
+	/**
+	 * 기획전 등록
+	 *
+	 * @return
+	 * @author sowon
+	 * @since 2021. 2. 4
+	 */
+	@PostMapping("/planning/detail/create")
+	@ResponseBody
+	public GagaResponse createPlanInfo(@RequestBody Plan param) {
+		planService.createPlanInfo(param);
+		return super.ok(message.getMessage("SUCC_0001"));
+	}
 
 
 }

+ 987 - 0
src/main/webapp/WEB-INF/views/marketing/PlanDetailPopupForm.html

@@ -0,0 +1,987 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : PlanDetailForm.html
+ * @desc    : 웹 수정 / 웹 등록 팝업 화면 Page
+ *============================================================================
+ * SISUN
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.05.06   sowon   최초 작성
+ *******************************************************************************
+ -->
+<div class="modalPopup" data-width="1395" id="planRegisterFormDiv">
+	<div class="panelStyle">
+		<div class="panelTitle">
+			<h2 th:text="${'기획전 ' + (mode == 'N' ? '등록' : '수정')}"></h2>
+			<button type="button" class="close" onclick="uifnPopupClose('planRegisterFormDiv')"><i class="fa fa-times"></i></button>
+		</div>
+		
+	<!-- 기획전 웹 수정 -->
+		<div class="panelContent" th:if="${mode == 'U'}">
+		<form th:object="${planInfo}" id="planUpdateForm" name="planUpdateForm" action="#" th:method="post">
+			<input type="hidden" name="pImg" th:value="*{mainPimg}"/>
+			<input type="hidden" name="mImg" th:value="*{mainMimg}"/>
+			<input type="hidden" name="mode" th:value="${mode}"/>
+			<input type="hidden" name="planSq" th:value="*{planSq}"/>
+			<input type="hidden" name="cpnNm">
+
+			<div class="cardArea" style="height: 700px;margin: -5px;">
+				<table class="frmStyle">
+					<colgroup>
+						<col style="width:10%"/>
+						<col style="width:40%;"/>
+						<col style="width:10%;"/>
+						<col style="width:35%;"/>
+						<col/>
+					</colgroup>
+					<tr>
+						<th>사이트</th>
+						<td>
+							<select name="siteCd" th:field="*{siteCd}">
+								<option th:if="${siteList}" th:each="oneData, status : ${siteList}" th:value="${oneData.cd}" th:text="|${oneData.cdNm}|"></option>
+							</select>
+						</td>
+						<th>기획전구분</th>
+						<td>
+							<select name="planGb" id="planGb" th:field="*{planGb}" disabled="disabled">
+								<option value="P">기획전</option>
+							</select>
+						</td>
+					</tr>
+					<tr>
+						<th>프론트 구분</th>
+						<td>
+							<label class="chkBox" >
+								<input type="checkbox" name="frontGb" value="P" th:text="PC웹" checked="checked" disabled="disabled"/>
+							</label>
+							<label class="chkBox" >
+								<input type="checkbox" name="frontGb" value="M" th:text="모바일웹" checked="checked" disabled="disabled"/>
+							</label>
+							<label class="chkBox" >
+								<input type="checkbox" name="frontGb"  value="A" th:text="모바일앱" checked="checked" disabled="disabled"/>
+							</label>
+							
+						</td>
+						<th>카테고리</th>
+						<td>
+							<label class="chkBox" th:if="${cateList}" th:each="oneData, status : ${cateList}">
+								<input type="checkbox" name="cateList" th:value="${oneData.cateNo}" th:text="${oneData.cateNm}"/>
+							</label>
+						</td>
+						
+					</tr>
+					<tr>
+						<th>기획전명<em class="required" title="필수"></em></th>
+						<td>
+							<input type="text" name="planNm" id="planNm" th:field="*{planNm}"/>
+						</td>
+						<th>서브제목<em class="required" title="필수"></em></th>
+						<td>
+							<input type="text" name="dtlTitle1" id="dtlTitle1" th:value="*{dtlTitle1}"/>
+						</td>
+					</tr>
+					<tr>
+						<th>진행기간<em class="required" title="필수"></em></th>
+						<td colspan="3">
+							<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)}">
+								<option th:value="${#numbers.formatInteger(num,2)}"  th:text="|${#numbers.formatInteger(num,2)}시|" th:selected="*{#strings.substring(dispStdt, 11, 13)} == ${#strings.toString(num)} ? 'true'">시간</option>
+								</th:block>
+							</select>
+							<select name="startSearchMin" required="required" data-valid-name="진행기간 시작시간">
+								<th:block th:each="num: ${#numbers.sequence(0,59)}">
+								<option th:value="${#numbers.formatInteger(num,2)}"  th:text="|${#numbers.formatInteger(num,2)}분|" th:selected="*{#strings.substring(dispStdt, 14, 16)} == ${#strings.toString(num)} ? 'true'">분</option>
+								</th:block>
+							</select>
+							~
+							<input type="text" class="schDate w100" name="endSearchDate" maxlength="10" required="required" data-valid-name="노출기간" th:field="*{endSearchDate}"/>
+							<select name="endSearchHour" required="required" data-valid-name="진행기간 종료시간">
+								<th:block th:each="num, index  : ${#numbers.sequence(0,23)}">
+								<option th:value="${#numbers.formatInteger(num,2)}"  th:text="|${#numbers.formatInteger(num,2)}시|" th:selected="*{#strings.substring(dispEddt, 11, 13)} == ${#strings.toString(num)} ? 'true'">시간</option>
+								</th:block>
+							</select>
+							<select name="endSearchMin" required="required" data-valid-name="진행기간 종료시간">
+								<th:block th:each="num: ${#numbers.sequence(0,59)}">
+								<option th:value="${#numbers.formatInteger(num,2)}"  th:text="|${#numbers.formatInteger(num,2)}분|" th:selected="*{#strings.substring(dispEddt, 14, 16)} == ${#strings.toString(num)} ? 'true'">분</option>
+								</th:block>
+							</select>
+							<input type="hidden" name="dispStdt" id="dispStdt"/>
+							<input type="hidden" name="dispEddt" id="dispEddt"/>
+						</td>
+						
+					</tr>
+					<tr>
+						<th>코너명노출 여부</th>
+						<td>
+							<select name="cornerNmDispYn" required="required" data-valid-name="코너명노출 여부" disabled="disabled">
+								<option value="Y">Yes</option>
+							</select>
+						</td>
+						<th>오픈여부<em class="required" title="필수"></em></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>
+					</tr>
+					<tr>
+						<th>사용고객등급구분</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}" checked="checked" disabled="disabled"/>
+							</label>
+						</td>
+						<th>브랜드</th>
+						<td>
+						<select name="supplyCompCd" id="supplyCompCd">
+								<option th:if="${supplyCompList}" th:each="oneData, status : ${supplyCompList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
+							</select>
+							<span id="multiBrand"></span>
+						</td>			
+					</tr>
+					<tr>
+						<th>사용가능고객구분</th>
+						<td  colspan="3">
+							<label class="chkBox">
+								<input type="checkbox" name="usableCustGbArr" value="G100_10" th:text="일반회원" checked="checked" disabled="disabled"/>
+							</label>
+  						</td>
+					</tr>
+					<tr>
+						<th>메인 이미지<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')} + *{mainPimg}" style="max-width:470px;"/>
+							</div>
+						</td>
+						<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>
+								<input type="hidden" name="orgMainPimg" id="orgMainPimg" th:value="*{mainPimg}"/>
+								<input type="hidden" name="mainPimg" id="mainPimg"/>
+							</div>
+						</td>
+					</tr>
+				</tbody>				
+				</table>
+				
+				<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> &nbsp;기획전 &nbsp; 컨텐츠&nbsp;</th>
+										<td>
+											<!-- 수정시 프로모션명 입력 : before -->
+											<div class="padding10"
+												style="display: inline-block; width: 49%;">
+												<!--<span>공급업체 설정</span>-->
+												<div class="padding10 inner-tb-solid">
+													<span class="buttonSpan">
+														<button type="button"
+															class="btn btnRight btn-success btn-lg"
+															onclick="fnPlanTemplatePopup();">기획전 템플릿</button>
+													</span> <br />
+												</div>
+											</div>
+										</td>
+									</tr>
+								</table>
+							</div>
+						</div>
+					</div>
+<!-- 				<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="panelContent">
+							<table class="frmStyle">
+								<colgroup>
+									<col width="10%" />
+									<col width="90%" />
+								</colgroup>
+								<tr>
+									<th>카테고리</th>
+									<td>
+										수정시 프로모션명 입력 : before
+										<div class="padding10"
+											style="display: inline-block; width: 49%;">
+											<span>공급업체 설정</span>
+											<div class="padding10 inner-tb-solid">
+												<span class="buttonSpan">
+													<button type="button"
+														class="btn btnRight btn-success btn-lg"
+														id="btnAddCate">카테고리 추가</button>
+													<button type="button"
+														class="btn btnRight btn-success btn-lg"
+														id="btnDeleteCate">선택삭제</button>
+												</span> <br />
+												<div id="gridFGCateList"
+													style="width: 100%; height: 200px;"
+													class="ag-theme-balham"></div>
+											</div>
+										</div>
+									</td>
+								</tr>
+							</table>
+						</div>
+					</div> -->
+			</div>
+			<div style='margin: 13px;'>
+			<ul class="panelBar">
+				<li class="right" th:if="${mode == 'U'}">
+					<button type="button" class="btn btn-success btn-lg" onclick="fnPlanSave('#planUpdateForm');">저장</button>
+				</li>
+			</ul>
+			</div>
+		</form>
+	</div>
+		
+	
+		<!-- 기획전 웹 등록 -->
+		<div class="panelContent" th:if="${mode == 'N'}">
+			<form id="planRegisterForm" name="planRegisterForm" th:method="post">
+			<input type="hidden" name="mode" th:value="${mode}"/>
+			<div>
+				<table class="frmStyle">
+					<colgroup>
+						<col style="width:12.5%;"/>
+						<col/>
+					</colgroup>
+					<tr>
+						<th>기존 기획전</th>
+						<td>
+							<input type="text" class="w100" name="searchTxt" id="searchTxt" maxlength="20" readonly="readonly"/>
+							<input type="hidden" class="w100" name="planSq_Hideen" id="planSq_Hideen" maxlength="20"/>
+							<button type="button" class="btn icn" id="btnPopupSearchPlan"><i class="fa fa-search"></i></button>
+							<button type="button" class="btn btn-primary btn-lg" onclick="fnPlanCopyPopup();">기획전 복사</button>
+						</td>
+					</tr>
+				</table>
+			</div>
+			<div class="cardArea">
+				<table class="frmStyle">
+					<colgroup>
+						<col style="width:10%"/>
+						<col style="width:40%;"/>
+						<col style="width:10%;"/>
+						<col style="width:35%;"/>
+						<col/>
+					</colgroup>
+					<tr>
+						<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>기획전구분</th>
+						<td>
+							<select name="planGb" required="required" data-valid-name="기획전구분" disabled="disabled">
+								<option value="P">기획전</option>
+							</select>
+						</td>
+					</tr>
+					<tr>
+						<th>프론트 구분</th>
+						<td>
+							<label class="chkBox" >
+								<input type="checkbox" name="frontGb" value="P" th:text="PC웹" checked="checked" disabled="disabled"/>
+							</label>
+							<label class="chkBox" >
+								<input type="checkbox" name="frontGb"  value="M" th:text="모바일웹" checked="checked" disabled="disabled"/>
+							</label>
+							<label class="chkBox" >
+								<input type="checkbox" name="frontGb" value="A" th:text="모바일앱" checked="checked" disabled="disabled"/>
+							</label>
+						</td>
+						<th>카테고리</th>
+						<td>
+							<label class="chkBox" th:if="${cateList}" th:each="oneData, status : ${cateList}">
+								<input type="checkbox" name="cateList" th:value="${oneData.cateNo}" th:text="${oneData.cateNm}"/>
+							</label>
+						</td>
+						
+					</tr>
+					<tr>
+						<th>기획전명<em class="required" title="필수"></em></th>
+						<td>
+							<input type="text" name="planNm" id="planNm" maxlength="50" required="required" data-valid-name="기획전명"/>
+						</td>
+						<th>서브제목</th>
+						<td>
+							<input type="text" name="dtlTitle1" id="dtlTitle1" data-valid-name="서브제목"/>
+						</td>
+					</tr>
+					<tr>
+						<th>진행기간<em class="required" title="필수"></em></th>
+						<td colspan="3">
+							<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)}">
+								<option  th:value="${#numbers.formatInteger(num,2)}" th:text="|${#numbers.formatInteger(num,2)}시|" >시간</option>
+								</th:block>
+							</select>
+							<select name="startSearchMin" required="required" data-valid-name="진행기간 시작시간">
+								<th:block th:each="num: ${#numbers.sequence(0,59)}">
+								<option  th:value="${#numbers.formatInteger(num,2)}"  th:text="|${#numbers.formatInteger(num,2)}분|" >분</option>
+								</th:block>
+							</select>
+							~
+							<input type="text" class="schDate w100" id="viewEndDtNew" name="endSearchDate" maxlength="10" required="required" data-valid-name="노출기간"/>
+							<select name="endSearchHour" required="required" data-valid-name="진행기간 종료시간">
+								<th:block th:each="num, index  : ${#numbers.sequence(0,23)}">
+								<option th:value="${#numbers.formatInteger(num,2)}"  th:text="|${#numbers.formatInteger(num,2)}시|" th:selected="${#numbers.formatInteger(num,2)}==23 ? 'true'">시간</option>
+								</th:block>
+							</select>
+							<select name="endSearchMin" required="required" data-valid-name="진행기간 종료시간">
+								<th:block th:each="num: ${#numbers.sequence(0,59)}">
+								<option th:value="${#numbers.formatInteger(num,2)}"  th:text="|${#numbers.formatInteger(num,2)}분|" th:selected="${#numbers.formatInteger(num,2)}==59 ? 'true'">분</option>
+								</th:block>
+							</select>
+							<input type="hidden" name="dispStdt" id="dispStdt"/>
+							<input type="hidden" name="dispEddt" id="dispEddt"/>
+						</td>
+						
+					</tr>
+					<tr>
+						<th>코너명노출 여부</th>
+						<td>
+							<select name="cornerNmDispYn" required="required" data-valid-name="코너명노출 여부" disabled="disabled">
+								<option value="Y">Yes</option>
+							</select>
+						</td>
+						<th>오픈여부<em class="required" title="필수"></em></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>
+						
+					</tr>
+					<tr>
+						<th>사용고객등급구분</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}" checked="checked" disabled="disabled"/>
+							</label>
+						</td>
+						<th>브랜드</th>
+						<td>
+						<select name="supplyCompCd" id="supplyCompCd">
+								<option th:if="${supplyCompList}" th:each="oneData, status : ${supplyCompList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
+							</select>
+							<span id="multiBrand"></span>
+						</td>						
+					</tr>
+					<tr>
+						<th>사용가능고객구분</th>
+						<td  colspan="3">
+							<label class="chkBox">
+								<input type="checkbox" name="usableCustGbArr" value="G100_10" th:text="일반회원" checked="checked" disabled="disabled"/>
+							</label>
+  						</td>
+					</tr>
+					<tr>
+						<th>메인 이미지<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>
+								<input type="hidden" name="mainPimg" id="mainPimg" value=""/>
+							</div>
+						</td>
+					</tr>
+					
+				</tbody>
+				<tbody>
+				</table>
+<!-- 					<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>
+											수정시 프로모션명 입력 : before
+											<div class="padding10"
+												style="display: inline-block; width: 49%;">
+												<span>공급업체 설정</span>
+												<div class="padding10 inner-tb-solid">
+													<span class="buttonSpan">
+														<button type="button"
+															class="btn btnRight btn-success btn-lg"
+															id="btnAddCate">카테고리 추가</button>
+														<button type="button"
+															class="btn btnRight btn-success btn-lg"
+															id="btnDeleteCate">선택삭제</button>
+													</span> <br />
+													<div id="gridFGCateList"
+														style="width: 100%; height: 200px;"
+														class="ag-theme-balham"></div>
+												</div>
+											</div>
+										</td>
+									</tr>
+								</table>
+							</div>
+						</div>
+					</div> -->
+				</div>
+				<ul class="panelBar">
+					<li class="right" th:if="${mode == 'N'}">
+						<button type="button" class="btn btn-info btn-lg" onclick="fnPlanSave('#planRegisterForm');">저장</button>
+					</li>
+				</ul>
+			</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 mode = [[${mode}]];
+	var planInfo = [[${planInfo}]];
+	var fsrcPc = [[${fsrcPc}]];
+	var fsrcMobile = [[${fsrcMobile}]];
+	var planBrandList = [[${planBrandList}]];
+	var planCateList = [[${planCateList}]];
+	var custGbList = [[${gbList}]];
+	var custGradeList =	[[${gradeList}]]; 
+	var benefitList = [[${benefitList}]];
+	var supplyCompList = [[${supplyCompList}]];
+	var snOptions;
+	var sessRoleCd = [[${sessionInfo.roleCd}]];
+
+	let useYnList = { "Y":"Yes", "N":"No" };
+	let channelName = {"G053_01":"직접","G053_02":"네이버","G053_03":"다음","G053_04":"크리데오","G053_05":"카카오","G053_06":"인스타그램","G053_07":"페이스북","G053_08":"구글"
+			          ,"G053_09":"바이럴","G053_10":"모비온","G053_11":"YES24","G053_12":"한세드림"}
+    
+	if(planCateList.length > 0){
+		var chkboxCnt = $('#planUpdateForm input:checkbox[name=cateList]').length;
+		var dataCnt = planCateList.length;
+		for(var i=0; i<chkboxCnt; i++){
+			for(var j=0; j<dataCnt; j++){
+				var data = planCateList[j].cateNo;
+				if($('#planUpdateForm input:checkbox[name=cateList]').eq(i).val() == data){
+					$('#planUpdateForm input:checkbox[name=cateList]').eq(i).prop('checked', true);
+					$("#planUpdateForm input:checkbox[name=cateList]").eq(i).parent().addClass('checked');
+				}
+			}
+		}
+	}
+	
+	if(planBrandList.length > 0){
+		setTimeout(function(){
+			var chkboxCnt = $('input:checkbox[name=multiBrand]').length;
+			var dataCnt = planBrandList.length;
+			for(var i=0; i<10; i++){
+				for(var j=0; j<dataCnt; j++){
+					var data = planBrandList[j].brandCd;
+					if($('input:checkbox[name=multiBrand]').eq(i).val() == data){
+						$('input:checkbox[name=multiBrand]').eq(i).prop('checked', true);
+						$("input:checkbox[name=multiBrand]").eq(i).parent().addClass('checked');
+					}
+				}
+			}
+		}, 1000);
+		
+	}
+
+
+    
+	// 카테고리 전시 여부
+	var fnCataCheck = function(is, formId) {
+		if (is.checked) {
+			$(formId + ' input[name=cateDispYn]').val('Y');
+			// 추후 카테고리 표시
+		} else {
+			$(formId + ' input[name=cateDispYn]').val('N');
+		}
+	}
+
+	// 상품제한여부
+	var fnGoodsCheck = function(is, formId) {
+		if (is.checked) {
+			$(formId + ' input[name=goodsLimitYn]').val('Y');
+			$(formId + ' input[name=goodsLimitQty]').show();
+			$(formId + ' input[name=goodsLimitQty]').focus();
+			// 추후 카테고리 표시
+		} else {
+			$(formId + ' input[name=goodsLimitYn]').val('N');
+			$(formId + ' input[name=goodsLimitQty]').hide();
+		}
+	}
+	
+	//템플릿 유형 설정
+	var fnPlanTemplatePopup = function () {
+		var actionUrl = "/marketing/planning/detail/template/form?mode=C&planSq=" + planInfo.planSq;
+		cfnOpenModalPopup(actionUrl,'popupPlanTemplate');
+	}
+	
+	// 기존 기획전 조회 선택시
+	$('#btnPopupSearchPlan').on('click', function(result) {
+		cfnOpenPlanPopup('popupPlan');
+		
+	});
+	
+	var popupPlan = function (result) {
+		$("#planSq_Hideen").val(result[0].planSq);
+		$("#searchTxt").val("[" + result[0].planSq + "] " +result[0].planNm);
+		
+	}
+	
+
+	// 기획전 복사
+	var fnPlanCopyPopup = function() {
+		var planSq = $("#planSq_Hideen").val(); 
+
+		if (gagajf.isNull(planSq)) {
+			mcxDialog.alert('복사할 기획전을 선택하세요.');
+			return;
+		}
+
+		mcxDialog.confirm('선택 된 기획전을 복사 하시겠습니까?', {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function() {
+				var actionUrl = '/marketing/planning/copy';
+				var data = {copyPlanSq : planSq};
+				var jsonData = JSON.stringify(data);
+
+				gagajf.ajaxJsonSubmit(actionUrl, jsonData, fnCopyCallback);
+			}
+		});
+	}
+
+	// 기획전 복사 callback
+	var fnCopyCallback = function(result) {
+		uifnPopupClose('planRegisterFormDiv');
+		fnPlanListSearch();
+
+		var actionUrl = "/marketing/planning/detail/form?mode=U&planSq=" + result.planSq;
+		cfnOpenModalPopup(actionUrl,'popupPlan');
+	}
+
+	 var fnPlanSave = function(formId) {
+		/* if (!gagajf.validation(formId))
+			return;  */
+
+		// 날짜 유효성 체크
+		var stDate = $(formId + ' input[name=startSearchDate]').val().replaceAll("-", "");
+		var edDate = $(formId + ' input[name=endSearchDate]').val().replaceAll("-", "");
+		//var stDate2 = $(formId + ' input[name=custJoinStDay]').val().replaceAll("-", "");
+		//var edDate2 = $(formId + ' input[name=custJoinEdDay]').val().replaceAll("-", "");
+		var toDate = _today.replaceAll("-", "");
+
+		if (Number(stDate) > Number(edDate)) {
+			mcxDialog.alert('종료일자는 시작일자 보다 클 수 없습니다.');
+			return;
+		}
+
+		if (Number(stDate) < Number(toDate) && mode == 'N') {
+			mcxDialog.alert('시작일자는 오늘포함 이후로 등록해주세요.');
+			return;
+		}
+
+		if (Number(edDate) < Number(toDate) && mode == 'N') {
+			mcxDialog.alert('종료일자는 오늘포함 이후로 등록해주세요.');
+			return;
+		}
+		
+		/* if (Number(stDate2) > Number(edDate2)) {
+			mcxDialog.alert('신규회원 종료일자는 시작일자 보다 클 수 없습니다.');
+			return;
+		} */
+
+		
+		
+		stDate = $(formId + ' input[name=startSearchDate]').val();
+		edDate = $(formId + ' input[name=endSearchDate]').val();
+		//stDate2 = $(formId + ' input[name=custJoinStDay]').val();
+		//edDate2 = $(formId + ' input[name=custJoinEdDay]').val();
+		$(formId + ' input[name=dispStdt]').val(stDate + ' ' + $(formId + ' select[name=startSearchHour]').val() + ':' + $(formId + ' select[name=startSearchMin]').val() + ':00');
+		$(formId + ' input[name=dispEddt]').val(edDate + ' ' + $(formId + ' select[name=endSearchHour]').val() + ':' + $(formId + ' select[name=endSearchMin]').val() + ':59');
+		//$(formId + ' input[name=custJoinStdt]').val(stDate2 + ' ' + $(formId + ' select[name=startJoinHour]').val() + ':' + $(formId + ' select[name=startJoinMin]').val() + ':00');
+		//$(formId + ' input[name=custJoinEddt]').val(edDate2 + ' ' + $(formId + ' select[name=endJoinHour]').val() + ':' + $(formId + ' select[name=endJoinMin]').val() + ':59');
+
+	
+
+		var privacyPolicy = '';
+		var frontGb = $('#frontGb').val();
+		if (mode =='U') {
+			
+			// 이미지 처리
+			if ((!$('input[name=orgMainPimgDelYn]').is(':checked') ? true : false) &&
+				(gagajf.isNull($(formId + ' input[name=mainPimg]').val()) == true)   ) {
+				$(formId + ' input[name=mainPimg]').val($(formId + ' input[name=orgMainPimg]').val());
+			}
+
+			if ((!$('input[name=orgMainMimgDelYn]').is(':checked') ? true : false) &&
+				(gagajf.isNull($(formId + ' input[name=mainMimg]').val()) == true)  ) {
+				$(formId + ' input[name=mainMimg]').val($(formId + ' input[name=orgMainMimg]').val());
+			}
+
+			if ((!$('input[name=orgDtlPimgDelYn]').is(':checked') ? true : false) &&
+				(gagajf.isNull($(formId + ' input[name=dtlPimg]').val()) == true)  ) {
+				$(formId + ' input[name=dtlPimg]').val($(formId + ' input[name=orgDtlPimg]').val());
+			}
+
+			if ((!$('input[name=orgDtlMimgDelYn]').is(':checked') ? true : false) &&
+				(gagajf.isNull($(formId + ' input[name=dtlMimg]').val()) == true)  ) {
+				$(formId + ' input[name=dtlMimg]').val($(formId + ' input[name=orgDtlMimg]').val());
+			}
+
+			if ((!$('input[name=orgReplyImgDelYn]').is(':checked') ? true : false) &&
+				(gagajf.isNull($(formId + ' input[name=replyImg]').val()) == true) ) {
+				$(formId + ' input[name=replyImg]').val($(formId + ' input[name=orgReplyImg]').val());
+			}
+			
+		} 
+
+		// 기획전 등록
+		if (formId == '#planRegisterForm') {
+			mcxDialog.confirm('등록 하시겠습니까?', {
+				cancelBtnText: "취소",
+				sureBtnText: "확인",
+				sureBtnClick: function() {
+					if(!validationPlanDetail()){
+						return false;
+					}
+					var chkFrontGb = $('#planRegisterForm input:checkbox[name=frontGb]:checked');
+					
+					if(chkFrontGb.length < 1){
+						mcxDialog.alert("프론트구분을 체크해주세요.");
+						return false;
+					}
+					
+					var frontGb = '';
+					for(let i=0; i< chkFrontGb.length; i++){
+						frontGb += chkFrontGb.eq(i).val();
+						if (i != (chkFrontGb.length-1) ) {
+							frontGb += '|';
+						}
+					}
+					
+					var usableCustGbArr = [];
+					var chkCustGb = $('#planRegisterForm input:checkbox[name=usableCustGbArr]:checked');
+					
+					if(chkCustGb.length < 1){
+						mcxDialog.alert("사용가능고객구분을 체크해주세요.");
+						return false;
+					} 
+					
+					for(let i=0; i< chkCustGb.length; i++){
+						usableCustGbArr.push(chkCustGb.eq(i).val());
+					}
+					
+					
+					var chkCate = $('#planRegisterForm input:checkbox[name=cateList]:checked');
+					var allCateData = [];
+					for(let i=0; i< chkCate.length; i++){
+						allCateData.push(chkCate.eq(i).val());
+					}
+					
+					var chkBrand = $('#planRegisterForm input:checkbox[name=multiBrand]:checked');
+					var allBrandData = [];
+					for(let i=0; i< chkBrand.length; i++){
+						allBrandData.push(chkBrand.eq(i).val());
+					}
+					
+					let data = {
+							 multiCate : allCateData
+							,multiBrand : allBrandData
+							//,usableCustGradeArr : usableCustGradeArr
+							,usableCustGbArr : usableCustGbArr
+						    ,mode : $('#planRegisterForm input[name=mode]').val()
+						    ,planSq : $('#planRegisterForm input[name=planSq]').val()
+							,planGb	: $('#planRegisterForm select[name=planGb]').val()
+							,frontGb : frontGb
+							,planNm : $('#planRegisterForm input[name=planNm]').val()
+							,startSearchDate : $('#planRegisterForm input[name=startSearchDate]').val()
+							,endSearchDate : $('#planRegisterForm input[name=endSearchDate]').val()
+							,dispStdt : $('#planRegisterForm input[name=dispStdt]').val()
+							,dispEddt : $('#planRegisterForm input[name=dispEddt]').val()
+							,dtlTitle1 : $('#planRegisterForm input[name=dtlTitle1]').val()
+							,cornerNmDispYn :  $('#planRegisterForm select[name=cornerNmDispYn]').val()
+							,openYn :  $('#planRegisterForm select[name=openYn]').val()
+							,siteCd :$('#planRegisterForm select[name=siteCd]').val()
+							,mainPimg :$('#planRegisterForm input[name=mainPimg]').val()
+							,mainMimg : $('#planRegisterForm input[name=mainMimg]').val()
+							,fsrcPc :  $('#planRegisterForm input[name=fsrcPc]').val()
+							,fsrcMobile : $('#planRegisterForm input[name=fsrcMobile]').val()
+							 
+						}	
+					
+					var jsonData =  JSON.stringify(data);
+					gagajf.ajaxJsonSubmit("/marketing/planning/detail/create", jsonData, fnPlanDetailCallBack); 
+					uifnPopupClose('planRegisterFormDiv');
+					fnPlanListSearch();
+					//fnPlanDetailClose();
+				}
+			});
+		} else { // 기획전 수정
+	
+			mcxDialog.confirm('저장 하시겠습니까?', {
+				cancelBtnText: "취소",
+				sureBtnText: "확인",
+				sureBtnClick: function() {
+					if(!validationPlanDetail()){
+						return false;
+					}
+					
+					var chkFrontGb = $('#planUpdateForm input:checkbox[name=frontGb]:checked');
+					
+					if(chkFrontGb.length < 1){
+						mcxDialog.alert("프론트구분을 체크해주세요.");
+						return false;
+					}
+					
+					var frontGb = '';
+					for(let i=0; i< chkFrontGb.length; i++){
+						frontGb += chkFrontGb.eq(i).val();
+						if (i != (chkFrontGb.length-1) ) {
+							frontGb += '|';
+						}
+					}
+					
+					var usableCustGbArr = [];
+					var chkCustGb = $('#planUpdateForm input:checkbox[name=usableCustGbArr]:checked');
+					
+					if(chkCustGb.length < 1){
+						mcxDialog.alert("사용가능고객구분을 체크해주세요.");
+						return false;
+					}
+					
+					for(let i=0; i< chkCustGb.length; i++){
+						usableCustGbArr.push(chkCustGb.eq(i).val());
+					}
+					let data = {
+							 multiCate : multiCate
+							,CateList : allCateData
+							,usableCustGradeArr : usableCustGradeArr
+							,usableCustGbArr : usableCustGbArr
+						    ,mode : $('#planUpdateForm input[name=mode]').val()
+						    ,planSq : $('#planUpdateForm input[name=planSq]').val()
+							,planGb	: $('#planUpdateForm select[name=planGb]').val()
+							,frontGb : frontGb
+							,planNm : $('#planUpdateForm input[name=planNm]').val()
+							,startSearchDate : $('#planUpdateForm input[name=startSearchDate]').val()
+							,startSearchHour : $('#planUpdateForm input[name=startSearchHour]').val()
+							,startSearchMin : $('#planUpdateForm input[name=startSearchMin]').val()
+							,endSearchDate : $('#planUpdateForm input[name=endSearchDate]').val()
+							,endSearchHour : $('#planUpdateForm input[name=endSearchHour]').val()
+							,endSearchMin : $('#planUpdateForm input[name=endSearchMin]').val()
+							,dispStdt : $('#planUpdateForm input[name=dispStdt]').val()
+							,dispEddt : $('#planUpdateForm input[name=dispEddt]').val()
+							,dtlTitle1 : $('#planUpdateForm input[name=dtlTitle1]').val()
+							,cornerNmDispYn :  $('#planUpdateForm select[name=cornerNmDispYn]').val()
+							,openYn :  $('#planUpdateForm select[name=openYn]').val()
+							,siteCd :$('#planUpdateForm select[name=siteCd]').val()
+							,replyYn : $('#planUpdateForm select[name=replyYn]').val()
+							,mainPimg :$('#planUpdateForm input[name=mainPimg]').val()
+							,mainMimg : $('#planUpdateForm input[name=mainMimg]').val()
+							,fsrcPc :  $('#planUpdateForm input[name=fsrcPc]').val()
+							,fsrcMobile : $('#planUpdateForm input[name=fsrcMobile]').val()
+						}	
+					
+					
+					var actionUrl = '/marketing/plan/detail/update';
+					var jsonData =  JSON.stringify(data);
+					gagajf.ajaxJsonSubmit(actionUrl, jsonData, fnPlanDetailCallBack); 
+						uifnPopupClose('planRegisterFormDiv');
+						fnPlanListSearch();
+						//fnPlanDetailClose();
+				}
+			});
+		}
+	}
+
+	// 이미지 첨부
+	$('input[name=registerMainPimg],input[name=registerMainMimg],input[name=registerDtlPimg],input[name=registerDtlMimg],input[name=registerReplyImg]').on('change', function() {
+		var name = $(this)[0].name;
+
+		var file = this.files[0];
+
+		gagajf.ajaxFileUpload('/common/file/upload?subDir=/planning'
+				, file
+				, function(result) {
+					if (name == 'registerMainPimg'){
+						$('input[name=mainPimg]').val(result.newFileName);
+						$('input[name=pImg]').val(result.newFileName);
+					}
+
+					if (name == 'registerMainMimg'){
+						$('input[name=mainMimg]').val(result.newFileName);
+						$('input[name=mimg]').val(result.newFileName);
+					}
+						
+
+					if (name == 'registerDtlPimg')
+						$('input[name=dtlPimg]').val(result.newFileName);
+
+					if (name == 'registerDtlMimg')
+						$('input[name=dtlMimg]').val(result.newFileName);
+
+					if (name == 'registerReplyImg')
+						$('input[name=replyImg]').val(result.newFileName);
+				}
+				, 'image'
+		);
+	});
+
+	
+
+	var fnAddRow = function(obj){
+		var html = '<div>';
+		html += '<input type="text" class="w200" name="planQtitle"/>';
+		html += '<label class="chkBox"><input type="checkbox" onclick="fnAttachYnClick(this);" />첨부파일</label>';
+		html += '<button type="button" class="btn icn" onclick="fnDeleteRow(this);"><i class="fa fa-times" aria-hidden="true"></i></button>';
+		html += '<input type="hidden" name="attachYn" value="N"/>';
+		html += '</div>';
+		$(obj).closest('td').append(html);
+	}
+
+	var fnDeleteRow = function(obj){
+		$(obj).closest('div').remove();
+	}
+
+	var fnAttachYnClick = function(obj){
+		var val = 'N';
+		if($(obj).prop('checked')){
+			val = 'Y';
+		}
+		$(obj).closest('div').find('input[name="attachYn"]').val(val);
+	}
+
+	var fnPlanDetailCallBack = function() {
+		uifnPopupClose('planRegisterForm');
+		fnPlanListSearch();
+		
+	}
+	
+	 
+	// 업체변경시
+/* 	$('#planRegisterForm select[name=supplyCompCd]').on('change', function() {
+		var actionUrl = '/renderer/supplyCompany/brand/list/' + $(this).val();
+
+		if (sessRoleCd == "G001_B000") {
+			actionUrl = '/renderer/brand/AuthBrandlist';
+		}
+		
+		cfnCreateMultiCombo(actionUrl,"multiBrand",  "[전체]",null, 'Y');
+	});
+	 */
+	// 업체변경시
+/* 	$('#planUpdateForm select[name=supplyCompCd]').on('change', function() {
+		var actionUrl = '/renderer/supplyCompany/brand/list/' + $(this).val();
+
+		if (sessRoleCd == "G001_B000") {
+			actionUrl = '/renderer/brand/AuthBrandlist';
+		}
+		
+		cfnCreateMultiCombo(actionUrl,"multiBrand",  "[전체]",null, 'Y');
+	});
+	 */
+	
+	// validation 체크
+	function validationPlanDetail() {
+		if( $('#planUpdateForm input[name=planNm]').val() == '' || $('#planRegisterForm input[name=planNm]').val() == ''){
+			mcxDialog.alert('기획전명을 입력하세요.');
+			return false;
+		}
+		return true;
+	} 
+	
+	$(document).ready(function() {
+		var actionUrl = '/renderer/supplyCompany/brand/list/' + $(this).val();
+
+		if (sessRoleCd == "G001_B000") {
+			actionUrl = '/renderer/brand/AuthBrandlist';
+		}
+		
+		cfnCreateMultiCombo(actionUrl,"multiBrand",  "[전체]",null, 'Y');
+		snOptions = gagaSn.getToolbarOptions('media');
+		
+		// 썸머노트 그리기
+		gagaSn.createSummernote(snOptions, '#fsrcPcDetail');
+		gagaSn.createSummernote(snOptions, '#fsrcMobileDetail');
+		
+		// 그리드 그리기
+		//gagaAgGrid.createGrid("gridFGCateList", gridOptionsFGCateList);
+		
+		 if (mode =='U') {
+			//gridOptionsFGCateList.api.setRowData(planCateList);
+			
+			
+			if (planInfo.goodsLimitYn == 'N') {
+				$('#planDetailForm input[name=goodsLimitQty]').hide();
+			} else {
+				$('#planDetailForm input[name=goodsLimitQty]').show();
+			}
+
+			if($("#planGb").val()!='E'){
+				$("#questionEventInsert").hide();
+				$("#questionEventUpdate").hide();
+			}else{
+				gagaSn.createSummernote(snOptions, '#privacyPolicyRegister');
+			}
+
+		} else {
+
+			$("#viewStartDtNew").val(_today);
+			$("#viewEndDtNew").val(_today);
+
+			$("#questionEventInsert").hide();
+			$("#questionEventUpdate").hide();
+		} 
+		$('#frontGb').trigger('change');
+	});
+
+/*]]>*/
+</script>
+
+</html>

+ 5 - 4
src/main/webapp/WEB-INF/views/marketing/PlanListForm.html

@@ -33,7 +33,7 @@
 				</colgroup>
 				<tbody>
 					<tr>
-						<th>사이트</th>
+						<th>입점업체</th>
 						<td><select name="selSupplyCompCd" id="selSupplyCompCd" disabled="disabled" class="w70p">
 								<option value="">[선택]</option>
 								<option th:if="${supplyCompList}" th:each="oneData, status : ${supplyCompList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}" th:selected="${sessionInfo.supplyCompCd ==  oneData.cd}"></option>
@@ -125,6 +125,7 @@
 /*<![CDATA[*/
 	
 	var supplyCompCd = [[${supplyCompCd}]];
+	var siteCdList = gagajf.convertToArray([[${siteCdList}]]);
 	var wmGbList = {"A":"모바일APP", "P":"웹PC", "M":"모바일PC", "P|M":"웹PC|모바일PC", "P|A":"웹PC|모바일APP", "M|A":"모바일PC|모바일APP", "P|M|A":"전체"};
 	var templateTypeList = {"H":"HTML", "T":"TEXT"};
 	var planGbList = {"P":"기획전", "E":"이벤트", "S":"총알배송", "C" :"출석체크"};
@@ -142,9 +143,9 @@
 		},
 		{headerName: "사이트"			, field:'siteCd'	, width:100, cellClass: 'text-center',
 			cellEditor: 'agRichSelectCellEditor',
-			/* cellEditorParams: { values: gagaAgGrid.extractValues(supplyCompCd) }, */
-			valueFormatter: function (params) { return gagaAgGrid.lookupValue(supplyCompCd, params.value); },
-			valueParser: function (params) { return gagaAgGrid.lookupKey(supplyCompCd, params.newValue); }
+			cellEditorParams: { values: gagaAgGrid.extractValues(siteCdList) },
+			valueFormatter: function (params) { return gagaAgGrid.lookupValue(siteCdList, params.value); },
+			valueParser: function (params) { return gagaAgGrid.lookupKey(siteCdList, params.newValue); }
 		},
 		{headerName: "프론트구분"	, field:'frontGb'	, width:120, cellClass: 'text-center',
 			cellEditor: 'agRichSelectCellEditor',