Pārlūkot izejas kodu

상품타이틀 예약관리 개발중

eskim 5 gadi atpakaļ
vecāks
revīzija
5996f525fa

+ 77 - 0
style24.admin/src/main/java/com/style24/admin/biz/dao/TsaGoodsDao.java

@@ -11,6 +11,7 @@ import com.style24.persistence.domain.GoodsDesc;
 import com.style24.persistence.domain.GoodsHst;
 import com.style24.persistence.domain.GoodsNotiInfo;
 import com.style24.persistence.domain.GoodsSearch;
+import com.style24.persistence.domain.GoodsTnmRes;
 import com.style24.persistence.domain.Itemkind;
 import com.style24.persistence.domain.NotiInfo;
 import com.style24.persistence.domain.Option;
@@ -395,4 +396,80 @@ public interface TsaGoodsDao {
 	 */
 	void createGoodsSequence(Goods goods);
 
+	/**
+	 * 상품 타이틀 관리 목록 건수
+	 *
+	 * @param goodsSearch
+	 * @return
+	 * @author eskim
+	 * @since 2020. 02. 02
+	 */
+	int getGoodsTitleReserveCount(GoodsSearch goodsSearch);
+
+	/**
+	 * 상품 타이틀 관리 목록
+	 *
+	 * @param goodsSearch
+	 * @return
+	 * @author eskim
+	 * @since 2020. 02. 02
+	 */
+	Collection<GoodsTnmRes> getGoodsTitleReserveList(GoodsSearch goodsSearch);
+
+	/**
+	 * 상품 타이틀 조회(기간 체크용)
+	 *
+	 * @param goodsTnmRes
+	 * @return Collection<TsaGoodsTnmRes>
+	 * @author daehyoung
+	 * @since 2020. 06. 16
+	 */
+	Collection<GoodsTnmRes> getGoodsTnm(GoodsTnmRes goodsTnmRes);
+
+	/**
+	 * 상품 타이틀 예약 등록
+	 *
+	 * @param goodsTnmRes
+	 * @author eskim
+	 * @since 2020. 02. 02
+	 */
+	void createGoodTnmRes(GoodsTnmRes goodsTnmRes);
+
+	/**
+	 * 상품 타이틀 수정
+	 *
+	 * @param goods
+	 * @author eskim
+	 * @since 2020. 02. 02
+	 */
+	void updateGoodTnm(Goods goods);
+
+	/**
+	 * 상품 타이틀 예약건 초기화
+	 *
+	 * @param goods
+	 * @author eskim
+	 * @since 2020. 02. 02
+	 */
+	void updateGoodTnmInit(Goods goods);
+
+	/**
+	 * 상품 타이틀 예약 삭제
+	 *
+	 * @param goodsTnmRes
+	 * @author eskim
+	 * @since 2020. 02. 02
+	 */
+	void deleteGoodTnmRes(GoodsTnmRes goodsTnmRes);
+
+	/**
+	 * 상품 타이틀 초기값 조회
+	 *
+	 * @param goods
+	 * @return
+	 * @author eskim
+	 * @since 2020. 02. 04
+	 */
+	Goods getGoodTnmInit(Goods goods);
+
 }

+ 120 - 1
style24.admin/src/main/java/com/style24/admin/biz/service/TsaGoodsService.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.springframework.beans.factory.annotation.Autowired;
@@ -20,12 +21,12 @@ import com.style24.persistence.domain.CodiGoods;
 import com.style24.persistence.domain.Color;
 import com.style24.persistence.domain.CommonCode;
 import com.style24.persistence.domain.Goods;
-import com.style24.persistence.domain.GoodsCategory;
 import com.style24.persistence.domain.GoodsCompose;
 import com.style24.persistence.domain.GoodsDesc;
 import com.style24.persistence.domain.GoodsHst;
 import com.style24.persistence.domain.GoodsNotiInfo;
 import com.style24.persistence.domain.GoodsSearch;
+import com.style24.persistence.domain.GoodsTnmRes;
 import com.style24.persistence.domain.Itemkind;
 import com.style24.persistence.domain.NotiInfo;
 import com.style24.persistence.domain.Option;
@@ -36,6 +37,7 @@ import lombok.extern.slf4j.Slf4j;
 import com.gagaframework.excel.GagaExcelUtil;
 import com.gagaframework.excel.env.GagaExcelConstants;
 import com.gagaframework.web.parameter.GagaMap;
+import com.gagaframework.web.util.GagaDateUtil;
 import com.gagaframework.web.util.GagaFileUtil;
 import com.gagaframework.web.util.GagaStringUtil;
 
@@ -1274,4 +1276,121 @@ public class TsaGoodsService {
 		}
 		return goodsCd;
 	}
+
+	/**
+	 * 상품 타이틀 관리 목록 건수
+	 *
+	 * @param goodsSearch
+	 * @return
+	 * @author eskim
+	 * @since 2020. 02 .02
+	 */
+	public int getGoodsTitleReserveCount(GoodsSearch goodsSearch) {
+		return goodsDao.getGoodsTitleReserveCount(goodsSearch);
+	}
+
+	/**
+	 * 상품 타이틀 관리 목록
+	 *
+	 * @param goodsSearch
+	 * @return
+	 * @author eskim
+	 * @since 2020. 02 .02
+	 */
+	public Collection<GoodsTnmRes> getGoodsTitleReserveList(GoodsSearch goodsSearch) {
+		return goodsDao.getGoodsTitleReserveList(goodsSearch);
+	}
+
+	/**
+	 * 상품 타이틀 예약 등록
+	 *
+	 * @param goodsTnmRes
+	 * @author eskim
+	 * @since 2020. 02 .02
+	 */
+	@Transactional("shopTxnManager")
+	public void saveGoodsRsvtTnm(GoodsTnmRes goodsTnmRes) {
+		if (goodsTnmRes.getArrGoodsCd().length <= 0) {
+			throw new IllegalStateException(message.getMessage("FAIL_1001"));
+		}
+
+		goodsTnmRes.setGoodsTnm(GagaStringUtil.replace(GagaStringUtil.replace(goodsTnmRes.getGoodsTnm(), "&lt;", "<"), "&gt;", ">"));
+
+		for (String goodsCd : goodsTnmRes.getArrGoodsCd()) {
+
+			goodsTnmRes.setGoodsCd(goodsCd);
+			goodsTnmRes.setRegNo(TsaSession.getInfo().getUserNo());
+			goodsTnmRes.setUpdNo(TsaSession.getInfo().getUserNo());
+
+			ArrayList<GoodsTnmRes> arrTnmRes = (ArrayList<GoodsTnmRes>)goodsDao.getGoodsTnm(goodsTnmRes);
+			int newStdt = Integer.valueOf(goodsTnmRes.getApplyStdt().substring(2, 10));
+			int newEddt = Integer.valueOf(goodsTnmRes.getApplyEddt().substring(2, 10));
+			for (GoodsTnmRes oneTnmRes : arrTnmRes) {
+				int oldStdt = Integer.valueOf(oneTnmRes.getApplyStdt().substring(2, 10));
+				int oldEddt = Integer.valueOf(oneTnmRes.getApplyEddt().substring(2, 10));
+				if ((oldStdt >= newStdt && oldStdt <= newEddt) || (oldEddt >= newStdt && oldEddt <= newEddt)) {
+					throw new IllegalStateException("이미 등록된 상품 타이틀예약이 등록하려는 예약기간내에 존재합니다. \n(상품코드 : " + goodsCd + ")");
+				}
+			}
+
+			goodsDao.createGoodTnmRes(goodsTnmRes);
+
+			// 현재일자가 예약기간에 포함되어 있으면 바로 적용한다.
+			String toDaytime = GagaDateUtil.getTodayDateTime();
+			if (Long.parseLong(toDaytime) >= Long.parseLong(goodsTnmRes.getApplyStdt()) && Long.parseLong(toDaytime) <= Long.parseLong(goodsTnmRes.getApplyEddt())) {
+
+				// 이력생성 및 상품타이틀 수정
+				Goods goods = new Goods();
+				goods.setGoodsCd(goodsCd);
+				goods.setGoodsTnm(goodsTnmRes.getGoodsTnm());
+				goods.setRegNo(TsaSession.getInfo().getUserNo());
+				goods.setUpdNo(TsaSession.getInfo().getUserNo());
+
+				goodsDao.createGoodsHst(goods);
+				goodsDao.updateGoodTnm(goods);
+			}
+
+		}
+	}
+
+	/**
+	 * 상품 타이틀 예약 삭제
+	 *
+	 * @param goodsTnmRes
+	 * @author eskim
+	 * @since 2020. 02 .03
+	 */
+	@Transactional("shopTxnManager")
+	public void deleteGoodsRsvtTnm(GoodsTnmRes goodsTnmRes) {
+		if (goodsTnmRes.getArrGoodsCd().length <= 0) {
+			throw new IllegalStateException(message.getMessage("FAIL_1001"));
+		}
+
+		int idx = 0;
+		for (String goodsCd : goodsTnmRes.getArrGoodsCd()) {
+
+			// 상품 타이틀 예약 삭제
+			goodsTnmRes.setGoodsTnmResSq(goodsTnmRes.getArrGoodsTnmResSq()[idx]);
+			goodsDao.deleteGoodTnmRes(goodsTnmRes);
+
+			// 상품 타이틀 예약건 초기화
+			Goods goods = new Goods();
+			goods.setGoodsCd(goodsCd);
+			goods = goodsDao.getGoodTnmInit(goods);
+			goods.setRegNo(TsaSession.getInfo().getUserNo());
+			goods.setUpdNo(TsaSession.getInfo().getUserNo());
+
+			if (!StringUtils.isEmpty(goods.getGoodsTnm()) && !goods.getGoodsTnm().equals(goods.getGoodTnmInit())) {
+
+				// 상품이력 먼저 쌓기
+				goodsDao.createGoodsHst(goods);
+				// 정보수정
+				goods.setGoodsTnm(goods.getGoodTnmInit());
+				goodsDao.updateGoodTnm(goods);
+
+			}
+			idx++;
+		}
+	}
+
 }

+ 115 - 6
style24.admin/src/main/java/com/style24/admin/biz/web/TsaGoodsController.java

@@ -33,6 +33,7 @@ import com.style24.persistence.domain.GoodsCompose;
 import com.style24.persistence.domain.GoodsHst;
 import com.style24.persistence.domain.GoodsNotiInfo;
 import com.style24.persistence.domain.GoodsSearch;
+import com.style24.persistence.domain.GoodsTnmRes;
 import com.style24.persistence.domain.Itemkind;
 import com.style24.persistence.domain.NotiInfo;
 
@@ -778,13 +779,12 @@ public class TsaGoodsController extends TsaBaseController {
 		// 시즌
 		mav.addObject("seasonList", rendererService.getAvailCommonCodeList("G006"));
 		// 스타일년도
-		mav.addObject("styleYearList", rendererService.getAvailCommonCodeList("G023"));
+		int toYear = Integer.parseInt(GagaDateUtil.getToday("yyyy")) - 4;
+		mav.addObject("styleYearList", rendererService.getYearList(toYear,0,5));
 		// 매입유형
 		mav.addObject("buyingTypeList", rendererService.getAvailCommonCodeList("G035"));
 		// 상품상태
-		// mav.addObject("goodsStatList",
-		// rendererService.getAvailCommonCodeList("G008"));
-		String[] exceptCds = {"00"};
+		String[] exceptCds = {"G008_00"};
 		mav.addObject("goodsStatList", rendererService.getCommonCodeList("G008", "Y", exceptCds));
 
 		mav.addObject("params", goods);
@@ -829,7 +829,8 @@ public class TsaGoodsController extends TsaBaseController {
 		// 시즌
 		mav.addObject("seasonList", rendererService.getAvailCommonCodeList("G006"));
 		// 스타일년도
-		mav.addObject("styleYearList", rendererService.getAvailCommonCodeList("G023"));
+		int toYear = Integer.parseInt(GagaDateUtil.getToday("yyyy")) - 4;
+		mav.addObject("styleYearList", rendererService.getYearList(toYear,0,5));
 		// 매입유형
 		mav.addObject("buyingTypeList", rendererService.getAvailCommonCodeList("G035"));
 		// 색상
@@ -966,17 +967,125 @@ public class TsaGoodsController extends TsaBaseController {
 	 *
 	 * @return
 	 * @author eskim
-	 * @since 2020. 10. 16
+	 * @since 2020. 10. 30
 	 */
 	@GetMapping("/title/reserve/form")
 	public ModelAndView titleReserveForm() {
 		ModelAndView mav = new ModelAndView();
 
+		// 사이트
+		mav.addObject("siteList", rendererService.getAvailCommonCodeList("G000"));
+		String supplyCompCd = "";
+		if ("G001_B000".equals(TsaSession.getInfo().getRoleCd())) {
+			supplyCompCd = TsaSession.getInfo().getSupplyCompCd();
+		}
+		// 공급업체
+		mav.addObject("supplyCompList", rendererService.getSupplyCompanyList(supplyCompCd));
+		// 상품상태
+		// mav.addObject("goodsStatList",
+		// rendererService.getAvailCommonCodeList("G008"));
+		String[] exceptCds = {"G008_00"};
+		mav.addObject("goodsStatList", rendererService.getCommonCodeList("G008", "Y", exceptCds));
+		// 정상이월
+		mav.addObject("formalGbList", rendererService.getAvailCommonCodeList("G009"));
+		// 시즌
+		mav.addObject("seasonList", rendererService.getAvailCommonCodeList("G006"));
+		// 스타일년도
+		int toYear = Integer.parseInt(GagaDateUtil.getToday("yyyy")) - 4;
+		mav.addObject("styleYearList", rendererService.getYearList(toYear,0,5));
+		// 사용여부
+		mav.addObject("useYnList", rendererService.getAvailCommonCodeList("G002"));
+		// 품목
+		mav.addObject("itemkindList", rendererService.getAllItemkindList());
+		// MD
+		mav.addObject("brandMdList", rendererService.getBrandMdList());
+
 		mav.setViewName("goods/GoodsTitleReserveForm");
 
 		return mav;
 	}
 
+	/**
+	 * 상품 타이틀 관리 조회
+	 *
+	 * @return
+	 * @author eskim
+	 * @since 2020. 10. 30
+	 */
+	@PostMapping("/title/reserve/list")
+	@ResponseBody
+	public GagaMap goodsTitleReserveList(@RequestBody GoodsSearch goodsSearch) {
+
+		GagaMap result = new GagaMap();
+
+		// 입점업체담당자는 업체코드 설정
+		if ("G001_B000".equals(TsaSession.getInfo().getRoleCd())) {
+			goodsSearch.setSupplyCompCd(TsaSession.getInfo().getSupplyCompCd());
+			goodsSearch.setMdId(TsaSession.getInfo().getUserId());
+		}
+
+		// multi row 검색관련 처리
+		if (!StringUtils.isEmpty(goodsSearch.getCondition())) {
+			goodsSearch.setConditionList(goodsSearch.getCondition().replaceAll("\r", "").split("\n"));
+		}
+
+		goodsSearch.setRegNo(TsaSession.getInfo().getUserNo()); // 엑셀조회시 로그인 사용자의 엑셀 상품조회시 사용
+		goodsSearch.setPageable(new TsaPageRequest(goodsSearch.getPageNo() - 1, goodsSearch.getPageSize()));
+		goodsSearch.getPageable().setTotalCount(goodsService.getGoodsTitleReserveCount(goodsSearch));
+
+		result.set("pageing", goodsSearch);
+		result.set("goodsTnmList", goodsService.getGoodsTitleReserveList(goodsSearch));
+
+		return result;
+	}
+
+	/**
+	 * 상품등록 타이틀 예약등록 화면
+	 *
+	 * @return
+	 * @author eskim
+	 * @since 2019. 12. 23
+	 */
+	@GetMapping("/rsvt/tnm/list/form")
+	@ResponseBody
+	public ModelAndView goodsRsvtTnmListForm(GoodsTnmRes goodsTnmRes) {
+		ModelAndView mav = new ModelAndView();
+
+		mav.setViewName("goods/GoodsRsvtTnmListForm");
+		return mav;
+	}
+
+	/**
+	 * 상품 타이틀 예약 저장
+	 *
+	 * @param goodsTnmRes
+	 * @return
+	 * @author eskim
+	 * @since 2020. 02. 02
+	 */
+	@PostMapping("/rsvt/tnm/save")
+	@ResponseBody
+	public GagaResponse saveGoodsRsvtTnm(@RequestBody GoodsTnmRes goodsTnmRes) {
+		goodsService.saveGoodsRsvtTnm(goodsTnmRes);
+		return super.ok(message.getMessage("SUCC_0001"));
+	}
+
+	/**
+	 * 상품 타이틀 예약 삭제
+	 *
+	 * @param goodsTnmRes
+	 * @return
+	 * @author eskim
+	 * @since 2020. 02. 02
+	 */
+	@PostMapping("/rsvt/tnm/delete")
+	@ResponseBody
+	public GagaResponse deleteGoodsRsvtTnm(@RequestBody GoodsTnmRes goodsTnmRes) {
+		goodsService.deleteGoodsRsvtTnm(goodsTnmRes);
+		return super.ok(message.getMessage("SUCC_0001"));
+	}
+
+
 	/**
 	 * 상품 동영상관리 화면
 	 *

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

@@ -96,6 +96,7 @@ public class Goods extends TscBaseDomain {
 	private String imgPath6;
 	private String niClsfNm;
 	private String goodsTypeNm;
+	private String goodTnmInit;
 //
 //	private String goodsRegMsg;
 	private String procJob;

+ 37 - 0
style24.admin/src/main/java/com/style24/persistence/domain/GoodsTnmRes.java

@@ -0,0 +1,37 @@
+package com.style24.persistence.domain;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Data;
+
+/**
+ * 상품타이틀예약 Domain
+ *
+ * @author eskim
+ * @since 2020. 10. 30
+ */
+@SuppressWarnings("serial")
+@Data
+public class GoodsTnmRes extends TscBaseDomain {
+
+	private int goodsTnmResSq;
+	private String goodsCd;
+	private String goodsTnm;
+	private String applyStdt;
+	private String applyEddt;
+	private String applycYn;
+
+	private String regGoodsTnm;
+	private String goodsNm;
+	private String supplyGoodsCd;
+	private String brandGrpNm;
+	private String goodsStat;
+
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] arrGoodsCd;
+
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private int[] arrGoodsTnmResSq;
+
+}

+ 353 - 1
style24.admin/src/main/java/com/style24/persistence/mybatis/shop/TsaGoods.xml

@@ -1597,7 +1597,359 @@
 		<selectKey keyProperty="goodsSq" resultType="int" order="BEFORE">
 		SELECT GOODS_SQ FROM TB_GOODS_SEQUENCE
 		</selectKey>
-		INSERT INTO TB_GOODS_SEQUENCE (GOODS_SQ) VALUES (NULL) ;
+		INSERT INTO TB_GOODS_SEQUENCE (GOODS_SQ) VALUES (NULL)
 	</insert>
 
+	<!-- 상품 타이틀 예약관리 목록 건수 -->
+	<select id="getGoodsTitleReserveCount" parameterType="GoodsSearch" resultType="int">
+		/* TsaGoods.getGoodsTitleReserveCount */
+		SELECT COUNT(*) AS TOTCNT
+		FROM TB_BRAND B
+		   , TB_SUPPLY_COMPANY S
+		   <if test="searchGb == null or searchGb =='BASIC'">
+		   , TB_GOODS G
+		       <if test="siteCd != null and siteCd != ''">
+		   , (SELECT DISTINCT B.GOODS_CD, A.SITE_CD  
+		      FROM TB_CATEGORY_4SRCH A
+		         , TB_CATEGORY_GOODS B
+		      WHERE A.LEAF_CATE_CD = B.CATE_CD
+		      AND A.CATE_GB = B.CATE_GB
+		      AND A.SITE_CD IN 
+		      <foreach collection="siteCd" item="item" index="index"  open="(" close=")" separator=",">
+		       #{item}
+		      </foreach>
+		      ) D
+		       </if>
+		   </if>
+		   <if test="searchGb != null and searchGb =='EXCEL'">
+		   , (SELECT P.* 
+		           , TMP_DISP_ORD
+		      FROM TB_GOODS P
+		         , (SELECT SEARCH_CD, MIN(DISP_ORD) AS TMP_DISP_ORD
+		            FROM TB_SEARCH_DATA
+		            WHERE REG_ID = #{regId}
+		            GROUP BY SEARCH_CD) T
+		      WHERE P.GOODS_CD LIKE T.SEARCH_CD||'%'
+		      OR P.SUPPLY_GOODS_CD LIKE T.SEARCH_CD||'%'
+		      <if test="mdId != null and mdId != ''">
+		      AND P.BRAND_CD IN (
+		                         SELECT DISTINCT BRAND_CD
+		                         FROM TB_BRAND_MD
+		                         WHERE  MD_ID = #{mdId}
+		                         )
+		      </if>
+		      ) G
+		   </if>
+		   , TB_GOODS_TNM_RES GR
+		WHERE 1=1
+		AND G.BRAND_CD = B.BRAND_CD
+		AND G.SUPPLY_COMP_CD = S.SUPPLY_COMP_CD
+		AND G.GOODS_CD = GR.GOODS_CD
+		<if test="searchGb == null or searchGb =='BASIC'">
+		    <if test="siteCd != null and siteCd != ''">
+		AND G.GOODS_CD = D.GOODS_CD
+		    </if>
+		    <if test="applyStdt != null and applyStdt != ''">
+		AND GR.APPLY_EDDT >= TO_DATE(#{applyStdt}, 'YYYY-MM-DD')
+		    </if>
+		    <if test="applyEddt != null and applyEddt != ''">
+		<![CDATA[
+		AND GR.APPLY_STDT <= TO_DATE(#{applyEddt}, 'YYYY-MM-DD')  + 0.99999
+		]]>
+		    </if>
+		    <if test='beforSkipFlag != null and beforSkipFlag == "Y"'>
+		AND SYSDATE <![CDATA[<=]]> GR.APPLY_EDDT
+		    </if>
+		    <if test='goodsTnm != null and goodsTnm != ""'>
+		AND UPPER(GR.GOODS_TNM) LIKE UPPER('%'|| #{goodsTnm} || '%')
+		    </if>
+		    <if test="supplyCompCd != null and supplyCompCd != ''">
+		AND G.SUPPLY_COMP_CD = #{supplyCompCd}
+		    </if>
+		    <if test="brandCd != null and brandCd != ''">
+		AND G.BRAND_CD = UPPER(#{brandCd})
+		    </if>
+		    <if test="multiBrand != null and multiBrand != ''">
+		AND G.BRAND_CD IN
+		        <foreach collection="multiBrand" item="item" index="index"  open="(" close=")" separator=",">
+		#{item}
+		        </foreach>
+		    </if>
+		    <if test='conditionList != null and conditionList.length>0'>
+		        <choose>
+		              <when test='search != null and search == "searchGoodsCd"'>
+		        AND (
+		              <foreach collection="conditionList" item="item" index="index" separator="or">
+		               REGEXP_LIKE(UPPER(G.GOODS_CD), UPPER(#{item}))
+		              </foreach>
+		             )
+		              </when>
+		              <when test='search != null and search == "searchGoodsNum"'>
+		        AND (
+		              <foreach collection="conditionList" item="item" index="index" separator="or">
+		               REGEXP_LIKE(UPPER(G.GOODS_NUM), UPPER(#{item}))
+		              </foreach>
+		             )
+		              </when>
+		              <when test='search != null and search == "searchSupplyGoodsCd"'>
+		        AND (
+		              <foreach collection="conditionList" item="item" index="index" separator="or">
+		               REGEXP_LIKE(UPPER(G.SUPPLY_GOODS_CD), UPPER(#{item}))
+		              </foreach>
+		             )
+		              </when>
+		        </choose>
+		    </if>
+		    <if test="multiStyleYear != null and multiStyleYear != ''">
+		AND G.STYLE_YEAR IN (SELECT CD_NM
+		                     FROM TB_COMMON_CODE
+		                     WHERE CD_GB='G023'
+		                     AND CD IN
+		        <foreach collection="multiStyleYear" item="item" index="index"  open="(" close=")" separator=",">
+		                     #{item}
+		        </foreach>
+		                    )
+		    </if>
+		    <if test="multiSeasonCd != null and multiSeasonCd != ''">
+		AND G.SEASON_CD IN
+		        <foreach collection="multiSeasonCd" item="item" index="index"  open="(" close=")" separator=",">
+		#{item}
+		        </foreach>
+		    </if>
+		</if>
+	</select>
+
+	<!-- 상품 타이틀 예약관리 목록 -->
+	<select id="getGoodsTitleReserveList" parameterType="GoodsSearch" resultType="GoodsTnmRes">
+		/* TsaGoods.getGoodsTitleReserveList */
+		SELECT Z.*
+		FROM (
+		    SELECT A.*, ROWNUM RNUM FROM (
+		        SELECT
+		                G.GOODS_CD
+		              , B.BRAND_ENM
+		              , B.BRAND_GRP_NM
+		              , G.BRAND_CD
+		              , G.SUPPLY_COMP_CD
+		              , G.SUPPLY_GOODS_CD
+		              , G.GOODS_NM
+		              , G.GOODS_TNM
+		              , G.SELF_GOODS_YN
+		              , G.GOODS_STAT
+		              , GR.GOODS_TNM_RES_SQ
+		              , GR.GOODS_TNM AS REG_GOODS_TNM
+		              , TO_CHAR(GR.APPLY_STDT,'YYYYMMDDHH24MISS') AS APPLY_STDT
+		              , TO_CHAR(GR.APPLY_EDDT,'YYYYMMDDHH24MISS') AS APPLY_EDDT
+		              , GR.REG_ID
+		              , TO_CHAR(GR.REG_DT,'YYYYMMDDHH24MISS') AS REG_DT
+		        FROM TB_BRAND B
+		           , TB_SUPPLY_COMPANY S
+		           <if test="searchGb == null or searchGb =='BASIC'">
+		           , TB_GOODS G
+		               <if test="siteCd != null and siteCd != ''">
+		           , (SELECT DISTINCT B.GOODS_CD, A.SITE_CD  
+		              FROM TB_CATEGORY_4SRCH A
+		                 , TB_CATEGORY_GOODS B
+		              WHERE A.LEAF_CATE_CD = B.CATE_CD
+		              AND A.CATE_GB = B.CATE_GB
+		              AND A.SITE_CD IN 
+		              <foreach collection="siteCd" item="item" index="index"  open="(" close=")" separator=",">
+		               #{item}
+		              </foreach>
+		              ) D
+		               </if>
+		           </if>
+		           <if test="searchGb != null and searchGb =='EXCEL'">
+		           , (SELECT P.* 
+		                   , TMP_DISP_ORD
+		              FROM TB_GOODS P
+		                 , (SELECT SEARCH_CD, MIN(DISP_ORD) AS TMP_DISP_ORD
+		                    FROM TB_SEARCH_DATA
+		                    WHERE REG_ID = #{regId}
+		                    GROUP BY SEARCH_CD) T
+		              WHERE P.GOODS_CD LIKE T.SEARCH_CD||'%'
+		              OR P.SUPPLY_GOODS_CD LIKE T.SEARCH_CD||'%'
+		              <if test="mdId != null and mdId != ''">
+		              AND P.BRAND_CD IN (
+		                                 SELECT DISTINCT BRAND_CD
+		                                 FROM TB_BRAND_MD
+		                                 WHERE  MD_ID = #{mdId}
+		                                )
+		              </if>
+		              ) G
+		           </if>
+		           , TB_GOODS_TNM_RES GR
+		        WHERE 1=1
+		        AND G.BRAND_CD = B.BRAND_CD
+		        AND G.SUPPLY_COMP_CD = S.SUPPLY_COMP_CD
+		        AND G.GOODS_CD = GR.GOODS_CD
+		        <if test="searchGb == null or searchGb =='BASIC'">
+		            <if test="siteCd != null and siteCd != ''">
+		        AND G.GOODS_CD = D.GOODS_CD
+		            </if>
+		            <if test="applyStdt != null and applyStdt != ''">
+		        AND GR.APPLY_EDDT >= TO_DATE(#{applyStdt}, 'YYYY-MM-DD')
+		            </if>
+		            <if test="applyEddt != null and applyEddt != ''">
+		            <![CDATA[
+		        AND GR.APPLY_STDT <= TO_DATE(#{applyEddt}, 'YYYY-MM-DD')  + 0.99999
+		            ]]>
+		            </if>
+		            <if test='beforSkipFlag != null and beforSkipFlag == "Y"'>
+		        AND SYSDATE <![CDATA[<=]]> GR.APPLY_EDDT(+)
+		            </if>
+		            <if test='goodsTnm != null and goodsTnm != ""'>
+		        AND UPPER(GR.GOODS_TNM) LIKE UPPER('%'|| #{goodsTnm} || '%')
+		            </if>
+		            <if test="supplyCompCd != null and supplyCompCd != ''">
+		        AND G.SUPPLY_COMP_CD = #{supplyCompCd}
+		            </if>
+		            <if test="multiBrand != null and multiBrand != ''">
+		        AND G.BRAND_CD IN
+		            <foreach collection="multiBrand" item="item" index="index"  open="(" close=")" separator=",">
+		        #{item}
+		            </foreach>
+		            </if>
+		            <if test='conditionList != null and conditionList.length>0'>
+		            <choose>
+		              <when test='search != null and search == "searchGoodsCd"'>
+		        AND (
+		              <foreach collection="conditionList" item="item" index="index" separator="or">
+		               REGEXP_LIKE(UPPER(G.GOODS_CD), UPPER(#{item}))
+		              </foreach>
+		             )
+		              </when>
+		              <when test='search != null and search == "searchGoodsNum"'>
+		        AND (
+		              <foreach collection="conditionList" item="item" index="index" separator="or">
+		               REGEXP_LIKE(UPPER(G.GOODS_NUM), UPPER(#{item}))
+		              </foreach>
+		             )
+		              </when>
+		              <when test='search != null and search == "searchSupplyGoodsCd"'>
+		        AND (
+		              <foreach collection="conditionList" item="item" index="index" separator="or">
+		               REGEXP_LIKE(UPPER(G.SUPPLY_GOODS_CD), UPPER(#{item}))
+		              </foreach>
+		             )
+		              </when>
+		            </choose>
+		            </if>
+		            <if test="multiStyleYear != null and multiStyleYear != ''">
+		        AND G.STYLE_YEAR IN (SELECT CD_NM
+		                             FROM TB_COMMON_CODE
+		                             WHERE CD_GB='G023'
+		                             AND CD IN
+		                <foreach collection="multiStyleYear" item="item" index="index"  open="(" close=")" separator=",">
+		                             #{item}
+		                </foreach>
+		                            )
+		            </if>
+		            <if test="multiSeasonCd != null and multiSeasonCd != ''">
+		        AND G.SEASON_CD IN
+		                <foreach collection="multiSeasonCd" item="item" index="index"  open="(" close=")" separator=",">
+		        #{item}
+		            </foreach>
+		            </if>
+		        ORDER BY GR.APPLY_STDT DESC, GR.APPLY_EDDT DESC, G.GOODS_CD, GR.GOODS_TNM_RES_SQ
+		        </if>
+		<include refid="getListPagingContion_sql"/>
+	</select>
+
+	<!-- 상품 타이틀 예약조회(기간 체크용) -->
+	<select id="getGoodsTnm" parameterType="GoodsTnmRes" resultType="GoodsTnmRes">
+		/* TsaGoods.getGoodsTnm */
+		SELECT GOODS_CD
+		, TO_CHAR(APPLY_STDT, 'YYYYMMDDHH24MISS') AS APPLY_STDT
+		, TO_CHAR(APPLY_EDDT, 'YYYYMMDDHH24MISS') AS APPLY_EDDT
+		FROM TB_GOODS_TNM_RES
+		WHERE 1=1
+		AND GOODS_CD = #{goodsCd}
+	</select>
+	
+	<!-- 상품 타이틀 예약 등록 -->
+	<insert id="createGoodTnmRes" parameterType="GoodsTnmRes">
+		/* TsaGoods.createGoodTnmRes */
+		INSERT INTO TB_GOODS_TNM_RES (
+		    GOODS_TNM_RES_SQ
+		  , GOODS_CD
+		  , GOODS_TNM
+		  , APPLY_STDT
+		  , APPLY_EDDT
+		  , REG_ID
+		  , REG_DT
+		  , UPD_ID
+		  , UPD_DT
+		)
+		VALUES(
+		    SEQ_GOODS_TNM_RES.NEXTVAL
+		  , #{goodsCd}
+		  , #{goodsTnm}
+		  , TO_DATE(#{applyStdt},'YYYYMMDDHH24MISS')
+		  , TO_DATE(#{applyEddt},'YYYYMMDDHH24MISS')
+		  , #{regId}
+		  , SYSDATE
+		  , #{updId}
+		  , SYSDATE
+		)
+	</insert>
+	
+	<!-- 상품 타이틀 수정 -->
+	<update id="updateGoodTnm" parameterType="Goods">
+		/* TsaGoods.updateGoodTnm */
+		UPDATE TB_GOODS
+		SET GOODS_TNM = #{goodsTnm}
+		  , UPD_ID = #{updId} 
+		  , UPD_DT = SYSDATE
+		WHERE GOODS_CD = #{goodsCd}
+	</update >
+	
+	<!-- 상품 타이틀 예약 삭제 -->
+	<delete id="deleteGoodTnmRes" parameterType="GoodsTnmRes">
+		/* TsaGoods.deleteGoodTnmRes */
+		DELETE TB_GOODS_TNM_RES 
+		WHERE GOODS_TNM_RES_SQ = #{goodsTnmResSq}
+	</delete>
+	
+	<!-- 상품 타이틀 예약건 초기화 -->
+	<update id="updateGoodTnmInit" parameterType="Goods">
+		/* TsaGoods.updateGoodTnmInit */
+		UPDATE TB_GOODS
+		SET UPD_ID = #{updId} 
+		  , UPD_DT = SYSDATE
+		  , GOODS_TNM = (SELECT S.GOODS_TNM
+		                 FROM (
+		                       SELECT GT.GOODS_CD
+		                            , GT.GOODS_TNM
+		                            , RANK() OVER(PARTITION BY GT.GOODS_CD ORDER BY GT.GOODS_TNM_RES_SQ DESC) RANK 
+		                       FROM TB_GOODS_TNM_RES GT
+		                       WHERE GT.APPLYC_YN = 'N'
+		                       AND SYSDATE BETWEEN GT.APPLY_STDT AND GT.APPLY_EDDT
+		                       AND GT.GOODS_CD  = #{goodsCd}
+		                      ) S
+		                 WHERE S.RANK = 1
+		                 )
+		WHERE GOODS_CD = #{goodsCd}
+	</update >
+	
+	<!-- 상품 타이틀 예약건 초기화 조회 -->
+	<select id="getGoodTnmInit" parameterType="Goods"  resultType="Goods">
+		/* TsaGoods.getGoodTnmInit */
+		SELECT GOODS_CD
+		     , GOODS_TNM
+		     , (SELECT S.GOODS_TNM
+		        FROM (
+		              SELECT GT.GOODS_CD
+		                   , GT.GOODS_TNM
+		                   , RANK() OVER(PARTITION BY GT.GOODS_CD ORDER BY GT.GOODS_TNM_RES_SQ DESC) RANK 
+		              FROM TB_GOODS_TNM_RES GT
+		              WHERE GT.APPLYC_YN = 'N'
+		              AND SYSDATE BETWEEN GT.APPLY_STDT AND GT.APPLY_EDDT
+		              AND GT.GOODS_CD  = #{goodsCd}
+		             ) S
+		        WHERE S.RANK = 1
+		        ) AS GOOD_TNM_INIT
+		FROM TB_GOODS
+		WHERE GOODS_CD = #{goodsCd}
+	</select >
 </mapper>

+ 446 - 0
style24.admin/src/main/webapp/WEB-INF/views/goods/GoodsTitleReserveForm.html

@@ -0,0 +1,446 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : GoodsTitleReserveForm.html
+ * @desc    : 상품 타이틀 예약관리
+ *============================================================================
+ * PASTEL
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2020.10.30   eskim       최초 작성
+ *******************************************************************************
+ -->
+	<div id="main">
+		<!-- 메인타이틀 영역 -->
+		<div class="main-title">
+		</div>
+		<!-- //메인타이틀 영역 -->
+		<!-- 메뉴 설명 -->
+		<div class="infoBox menu-desc">
+		</div>
+		<form id="goodsTnmListForm" name="goodsTnmListForm" action="#" th:action="@{'/goods/title/reserve/list'}">
+		<input type="hidden" id="searchGb" name="searchGb" />
+		<input type="hidden" id="arrGoodsCd" name="arrGoodsCd" />
+ 		<!-- 패널 영역1 -->
+		<div class="panelStyle" >
+			<!-- TITLE -->
+			<div class="panelTitle">
+				<h3><i class="fa fa-info-circle"></i>아래 검색조건 중 하나를 꼭 입력해 주세요.</h3>
+			</div>
+			<!-- //TITLE -->
+			<div class="panelContent">
+				<table class="frmStyle">
+					<colgroup>
+						<col width="8%"/>
+						<col width="10%"/>
+						<col width="8%"/>
+						<col width="10%"/>
+						<col width="8%"/>
+						<col width="20%"/>
+						<col width="8%"/>
+						<col/>
+					</colgroup>
+					<tr>
+						<th>업체/브랜드</th>
+						<td colspan="5">
+							<select name="supplyCompCd" id="supplyCompCd">
+								<option value="" th:if="${sessionInfo.roleCd} != 'G001_B000'">[전체]</option>
+								<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>
+						<th rowspan="2">키워드</th>
+						<td rowspan="2">
+							<select name="search" id="search">
+								<option value="searchGoodsCd">상품코드</option>
+								<option value="searchGoodsNum">품번</option>
+								<option value="searchSupplyGoodsCd">업체상품코드</option>
+							</select>
+							<textarea class="textareaR2 w50p" name="condition" id="condition"></textarea>
+						</td>
+					</tr>
+					<tr>
+						<th>상품명</th>
+						<td>
+							<input type="text" class="w200" name="goodsTnm11" id="goodsTnm111" maxlength="50"/>
+						</td>
+						<th>예약타이틀</th>
+						<td>
+							<input type="text" class="w200" name="goodsTnm" id="goodsTnm" maxlength="50"/>
+						</td>
+						<th>시즌/년도</th>
+						<td>
+							<select  name="styleYear" id="styleYear">
+								<option value="">[전체]</option>
+								<option th:if="${styleYearList}" th:each="oneData, status : ${styleYearList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
+							</select>
+							<select  name="seasonCd" id="seasonCd">
+								<option value="">[전체]</option>
+								<option th:if="${seasonList}" th:each="oneData, status : ${seasonList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
+							</select>
+						</td>
+					</tr>
+					<tr>
+						<th>예약일</th>
+						<td colspan="7" id="sellTerms"></td>
+					</tr>
+				</table>
+				<ul class="panelBar">
+					<li class="center">
+						<button type="button" class="btn btn-gray btn-lg" id="btnInit" >초기화</button>
+						<button type="button" class="btn btn-info btn-lg" id="btnSearch" >조회</button>
+					</li>
+				</ul>	
+			</div>
+			<!-- //검색조건 영역 -->
+		</div>
+		<!-- 패널 영역1 -->
+		<div class="panelStyle">
+			<!-- 검색결과 영역 -->
+			<!-- 상단버튼 영역  -->
+			<ul class="panelBar">
+				<li>
+					<button type="button" class="btn btn-default btn-lg" onclick="cfnDownloadSampleFile('SF003');">상품엑셀조회 양식 다운로드</button>
+					<button type="button" class="btn btn-base btn-lg" id="btnGoodsExcelUpLoad">엑셀조회</button>
+					<button type="button" class="btn btn-success  btn-lg" id="btnGoodsTnmResSave">예약등록</button>
+					<button type="button" class="btn btn-danger btn-lg" id="btnGoodsTnmResDelete">예약삭제</button>
+				</li>
+				<li class="right">
+					검색결과 : <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: 550px;" class="ag-theme-balham"></div>
+			<ul class="panelBar">
+				<li class="center">
+					<div class="tablePaging" id="goodsListPagination"></div>
+				</li>
+			</ul>
+			<!-- 검색결과 영역 -->
+		</div>
+		</form>
+		<!-- //패널 영역2 -->
+	</div>
+<script type="text/javascript" src="/ux/plugins/gaga/gaga.paging.js?v=2019072202"></script>
+<script th:inline="javascript">
+/*<![CDATA[*/
+	var sessRoleCd = [[${sessionInfo.roleCd}]];
+	var goodsStatList = gagajf.convertToArray([[${goodsStatList}]]);
+	var formalGbList = gagajf.convertToArray([[${formalGbList}]]);
+
+	var columnDefs = [
+		{width: 40, minWidth: 40, cellClass: 'text-right', headerCheckboxSelection: true, checkboxSelection: true, filter: false},
+		{headerName: 'No', width: 60, cellClass: 'text-center',
+			valueGetter: function(params) { return cfnGridNumner('goodsTnmListForm',params.node.rowIndex, 'A');}
+		},
+		{headerName: "브랜드명", field: "brandGrpNm", width: 130, cellClass: 'text-center'},
+		{headerName: "상품코드", field: "goodsCd", width: 140, cellClass: 'text-center'},
+		{headerName: "상품명", field: "goodsNm", width: 180, cellClass: 'text-left'
+			,cellRenderer: function(params) {
+				return '<a href="javascript:void(0);">' + params.value + '</a>';
+			}
+		},
+		{headerName: "상품타이틀", field: "goodsTnm", width: 200, cellClass: 'text-left'},
+		{headerName: "예약상품타이틀", field: "regGoodsTnm", width: 200, cellClass: 'text-left'},
+		{headerName: "예약시작일시", field: "applyStdt", width: 150, cellClass: 'text-center',
+			cellRenderer: function(params) {
+				return !gagajf.isNull(params.value) ? params.value.toDate("YYYYMMDDHHmmss").format("YYYY-MM-DD HH:mm:ss") : '';
+			}
+		},
+		{headerName: "예약종료일시", field: "applyEddt", width: 150, cellClass: 'text-center',
+			cellRenderer: function(params) {
+				return !gagajf.isNull(params.value) ? params.value.toDate("YYYYMMDDHHmmss").format("YYYY-MM-DD HH:mm:ss") : '';
+			}
+		},
+		{headerName: "상품상태", field: "goodsStat" , width: 100, cellClass: 'text-center',
+			cellEditorParams: { values: gagaAgGrid.extractValues(goodsStatList) },
+			valueFormatter: function (params) { return gagaAgGrid.lookupValue(goodsStatList, params.value); },
+			valueParser: function (params) { return gagaAgGrid.lookupKey(goodsStatList, params.newValue); }
+		},
+		{headerName: "등록종료일시", field: "regDt", width: 150, cellClass: 'text-center',
+			cellRenderer: function(params) {
+				return !gagajf.isNull(params.value) ? params.value.toDate("YYYYMMDDHHmmss").format("YYYY-MM-DD HH:mm:ss") : '';
+			}
+		},
+		{headerName: "등록자", field: "regId", width: 100, cellClass: 'text-center'},
+		{headerName: "상품타이틀예약순번", field: "goodsTnmResSq", hide: true}
+		/* {headerName: "사이트", field: "siteCd" , width: 120, cellClass: 'text-center',
+			cellEditorParams: { values: gagaAgGrid.extractValues(siteList) },
+			valueFormatter: function (params) { return gagaAgGrid.lookupValue(siteList, params.value); },
+			valueParser: function (params) { return gagaAgGrid.lookupKey(siteList, params.newValue); }
+		} */
+	];
+	
+	// Get GridOptions
+	var gridOptions = gagaAgGrid.getGridOptions(columnDefs);
+
+	// 중복 선택 가능
+	gridOptions.rowSelection = 'multiple';
+	gridOptions.suppressRowClickSelection = true;
+	//gridOptions.rowHeight = 60; //이미지가 있을경우 높이 지정해야함.
+
+	// Row Click
+	gridOptions.onCellClicked = function(event) {
+		var goodsCd = event.data.goodsCd;
+		if (event.colDef.field == "goodsNm"){
+			cfnOpenGoodsDetailPopup('U',goodsCd);
+		}else if (event.colDef.field == "goodsCd"){
+			
+		}
+	}
+
+	// 초기화 클릭시
+	$('#btnInit').on('click', function() {
+		fnInit();
+	});
+	
+	var fnInit = function(){
+		$("#goodsTnmListForm input[name=siteCd]").prop("disabled", true);
+		$("#goodsTnmListForm input[name=siteCd]").addClass("formControl");
+		
+		$('#goodsTnmListForm')[0].reset();
+		//$("#goodsTnmListForm input[type=radio]").removeClass("checked");
+		$("#goodsTnmListForm input[type=checkbox]").removeClass("checked");
+		//$("#goodsTnmListForm input[type=radio]").parent("label").removeClass("checked");
+		$("#goodsTnmListForm input[type=checkbox]").parent("label").removeClass("checked");
+		$("#goodsTnmListForm input[type=radio][checked]").parent("label").addClass("checked");
+		$("#multiBrand").empty();
+	}
+	
+	// 조회클릭시
+	$('#btnSearch').on('click', function() {
+		$("#goodsTnmListForm input[name=pageNo]").val('1');
+		fnGoodsTnmListSearch('BASIC');
+	});
+
+	// 조회
+	var fnGoodsTnmListSearch = function(gbn) {
+		
+		if (typeof(gbn) != 'undefined' &&  gbn == 'EXCEL'){
+			$("#goodsTnmListForm input[name=searchGb]").val("EXCEL");
+		}else{
+			$("#goodsTnmListForm input[name=searchGb]").val("BASIC");
+		}
+		
+		if(!fnConditionCheck()) return;
+		
+		gagaPaging.init('goodsTnmListForm', fnSearchCallBack, 'goodsListPagination', $('#goodsTnmListForm').find('#pageSize').val());
+		gagaPaging.load($("#goodsTnmListForm input[name=pageNo]").val());
+	}
+
+	// 조회 (등록 창 닫을 때)
+	var fnGoodsRsvtTnmListSearch = function(gbn) {
+
+		if (typeof(gbn) != 'undefined' &&  gbn == 'EXCEL'){
+			$("#goodsTnmListForm input[name=searchGb]").val("EXCEL");
+		}else{
+			$("#goodsTnmListForm input[name=searchGb]").val("BASIC");
+		}
+
+		gagaPaging.init('goodsTnmListForm', fnSearchCallBack, 'goodsListPagination', $('#goodsTnmListForm').find('#pageSize').val());
+		gagaPaging.load($("#goodsTnmListForm input[name=pageNo]").val());
+	}
+
+	//검색 조건 확인
+	var fnConditionCheck = function(){
+		var formId = '#goodsTnmListForm';
+		var form = document.goodsTnmListForm;
+
+		if($("#goodsTnmListForm input[name=searchGb]").val() == "EXCEL") return true;
+		
+		var searchFlag = false;
+		var cnt = 0;
+
+		/* if( !gagajf.isNull($("#goodsTnmListForm select[name=supplyCompCd]").val())
+				|| !gagajf.isNull($("#goodsTnmListForm input[name=condition]").val())
+				|| (!gagajf.isNull($("#goodsTnmListForm input[name=stDate]").val()) && !gagajf.isNull($("#goodsTnmListForm input[name=edDate]").val()))
+			){
+			searchFlag = true;
+		}else{ */
+			for (i = 0; i < form.elements.length; i++ ) {
+				var el = form.elements[i];
+				console.log("TEST DATA1 : " + $(el).prop("type"));
+				console.log("TEST DATA2 : " + el.name);
+				if ($(el).prop("type") == "text" || $(el).prop("type") == "textarea" || ($(el).prop("type") == "select-one" && el.name != "search" && el.name != "pageSize") || ($(el).prop("type") == "checkbox" && el.name != "multiStyleYear" && el.name != "multiSeasonCd")) {
+					console.log("::IN TEST DATA1 : " + $(el).prop("type"));
+					console.log("::IN TEST DATA2 : " + el.name);
+					if (!(el.value == null || el.value == "")) {
+						cnt++;
+					}
+				}
+			}
+			
+			if(cnt > 0) searchFlag = true;
+			
+		/* } */
+		
+		if(searchFlag == false){
+			mcxDialog.alert("검색조건을 입력하세요.");
+			return false;
+		}
+		
+		var fromDate = $('#goodsTnmListForm input[name=stDate]').val();
+		var toDate = $('#goodsTnmListForm input[name=edDate]').val();
+		
+		if (!gagajf.isNull(fromDate) || !gagajf.isNull(toDate)) {
+			
+			if (gagajf.isNull(fromDate) || gagajf.isNull(toDate)) {
+				mcxDialog.alertC("등록일 조회시 시작일자와 종료일자를 입력하세요.", {
+					sureBtnText: "확인",
+					sureBtnClick: function() {
+						$('#goodsTnmListForm input[name=stDate]').focus();
+					}
+				});
+				return false;
+			}
+
+			if (fromDate > toDate) {
+				mcxDialog.alert("노출기간 시작일자는 종료일자 보다 클 수 없습니다.", {
+					sureBtnText: "확인",
+					sureBtnClick: function() {
+						$('#goodsTnmListForm input[name=stDate]').focus();
+					}
+				});
+				return false;
+			} 
+		}
+
+		return true;
+	}
+	
+	var fnSearchCallBack = function(result){
+
+		$('#goodsTnmListForm').find('#gridRowTotalCount').html(result.pageing.pageable.totalCount.addComma());
+		$('#goodsTnmListForm').find('#pageNo').val(result.pageing.pageable.pageNo.addComma());
+		$('#goodsTnmListForm').find('#pgNo').html(result.pageing.pageable.pageNo.addComma());
+		$('#goodsTnmListForm').find('#endPgNo').html(result.pageing.pageable.totalPage.addComma());
+		gridOptions.api.setRowData(result.goodsTnmList);
+		gagaPaging.createPagination(result.pageing.pageable);
+	}
+	
+	//페이징 
+	$('#goodsTnmListForm select[name=pageSize]').on('change', function() {
+		$("#goodsTnmListForm input[name=pageNo]").val('1');
+		fnGoodsTnmListSearch($("#goodsTnmListForm input[name=searchGb]").val());
+	});
+	
+	//업체변경시
+	$('#goodsTnmListForm 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');
+	});
+	
+	//엑셀 상품 조회
+	$('#btnGoodsExcelUpLoad').on('click', function() {
+		cfnExcelUploadPopup('goodsTnmExcelUpload', 'goodsTnmExcelUpload');
+	});
+	
+	var goodsTnmExcelUpload = function(result){
+		var data = {procJob : result.procJob
+					,excelFileNm : result.excelFileNm
+					};
+		var jsonData = JSON.stringify(data);
+		gagajf.ajaxJsonSubmit('/goods/search/excelupload/save', jsonData, fnGoodsTnmExcelUploadCallBack);
+	}
+	
+	var fnGoodsTnmExcelUploadCallBack = function(result){
+		fnGoodsTnmListSearch("EXCEL");
+	}
+	
+	//예약등록
+	$('#btnGoodsTnmResSave').click(function(e) {
+		var actionUrl = "/goods/rsvt/tnm/list/form";
+		cfnOpenModalPopup(actionUrl, 'popupGoodsRsvtList');
+	});
+	
+	//예약삭제
+	$('#btnGoodsTnmResDelete').click(function(e) {
+		//상품선택여부 확인처리 추가
+		var selectedData = gridOptions.api.getSelectedRows();
+
+		if (selectedData.length == 0) {
+			mcxDialog.alert('선택된 행이 없습니다.');
+			return false;
+		}
+		
+		var arrGoodsCd = [];
+		var arrGoodsTnmResSq = [];
+		var chkFlag = false;
+		//selectedData = gagaAgGrid.getAllRowData(gridOptions);
+		$.each(selectedData, function(idx, item) {
+			
+			if (gagajf.isNull(item.goodsTnmResSq) || item.goodsTnmResSq == "0"){
+				chkFlag = true;
+				mcxDialog.alert(item.goodsCd +"상품은 상품타이틀이 예약된 상품이 아닙니다.");
+				return false;
+			}
+			
+			var toDateStr = new Date().format("YYYYMMDDHHmmss");
+			if (toDateStr > item.applyEddt){
+				chkFlag = true;
+				mcxDialog.alertC("종료된 예약 상품은 삭제할 수 없습니다.", {
+					sureBtnText: "확인",
+					sureBtnClick: function() {
+						$('#goodsRsvtTnmForm input[name=applyEdYMD]').focus();
+					}
+				});
+				return false;
+			}
+		
+			arrGoodsCd.push(item.goodsCd);
+			arrGoodsTnmResSq.push(item.goodsTnmResSq);
+		});
+
+		if (chkFlag){
+			return;
+		}
+		
+		mcxDialog.confirm('삭제하시겠습니까?',  {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function(){
+				var data = {arrGoodsCd : arrGoodsCd
+						,arrGoodsTnmResSq : arrGoodsTnmResSq
+			};
+			
+			var jsonData = JSON.stringify(data);
+			gagajf.ajaxJsonSubmit('/goods/rsvt/tnm/delete', jsonData, fnGoodsTnmResDeleteCollBack);
+			}
+		});
+	});
+	
+	var fnGoodsTnmResDeleteCollBack = function(){
+		//fnGoodsRsvtTnmListSearch($("#goodsTnmListForm input[name=searchGb]").val());
+	}
+	
+	$(document).ready(function() {
+
+		cfnCreateCalendar('#sellTerms', 'applyStdt', 'applyEddt', true, '예약일', 'X');
+		var chkBeforSkipFlag = '&nbsp;&nbsp;<label class="chkBox"><input type="checkbox" name="beforSkipFlag" value="Y" >이전데이터 제외</label>';
+		$("#goodsTnmListForm").find('#sellTerms').append(chkBeforSkipFlag);
+		
+		// Create a agGrid
+		gagaAgGrid.createGrid('gridList', gridOptions);
+
+	});
+
+/*]]>*/
+</script>
+ 	
+</html>