eskim 5 роки тому
батько
коміт
177a7875dc

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

@@ -10,6 +10,7 @@ import com.style24.persistence.domain.GoodsDesc;
 import com.style24.persistence.domain.GoodsEpSkip;
 import com.style24.persistence.domain.GoodsHst;
 import com.style24.persistence.domain.GoodsNotiInfo;
+import com.style24.persistence.domain.GoodsResSell;
 import com.style24.persistence.domain.GoodsSearch;
 import com.style24.persistence.domain.GoodsTnmRes;
 import com.style24.persistence.domain.Itemkind;
@@ -448,6 +449,65 @@ public interface TsaGoodsDao {
 	 */
 	Goods getGoodTnmInit(Goods goods);
 
+	/**
+	 * 상품예약판매 목록 건수
+	 *
+	 * @param goodsSearch
+	 * @return Integer
+	 * @author eskim
+	 * @since 2020. 11. 12
+	 */
+	int getGoodsResSellCount(GoodsSearch goodsSearch);
+
+	/**
+	 * 상품예약판매 목록
+	 *
+	 * @param goodsSearch
+	 * @return Collection<TsaGoodsResSell>
+	 * @author eskim
+	 * @since 2020. 11. 12
+	 */
+	Collection<GoodsResSell> getGoodsResSellList(GoodsSearch goodsSearch);
+
+	/**
+	 * 상품예약판매 조회(기간 체크용)
+	 *
+	 * @param goodsResSell
+	 * @return int
+	 * @author eskim
+	 * @since 2020. 11. 12
+	 */
+	int getGoodsResSellDupChkCount(GoodsResSell goodsResSell);
+
+	/**
+	 * 상품예약판매 등록
+	 *
+	 * @param goodsResSell
+	 * @return void
+	 * @author eskim
+	 * @since 2020. 11. 12
+	 */
+	void createGoodResSell(GoodsResSell goodsResSell);
+
+	/**
+	 * 상품예약판매 등록 시 재고연동 비활성화
+	 *
+	 * @param goods
+	 * @author eskim
+	 * @since 2020. 11. 12
+	 */
+	void updateGoodsErpStockLinkYn(Goods goods);
+
+	/**
+	 * 상품예약판매 삭제
+	 *
+	 * @param goodsResSell
+	 * @return void
+	 * @author eskim
+	 * @since 2020. 11. 12
+	 */
+	void deleteGoodResSell(GoodsResSell goodsResSell);
+
 	/**
 	 * 네이버 EP 제외 상품 목록 건수
 	 *

+ 89 - 5
style24.admin/src/main/java/com/style24/admin/biz/service/TsaGoodsService.java

@@ -23,6 +23,7 @@ import com.style24.persistence.domain.GoodsDesc;
 import com.style24.persistence.domain.GoodsEpSkip;
 import com.style24.persistence.domain.GoodsHst;
 import com.style24.persistence.domain.GoodsNotiInfo;
+import com.style24.persistence.domain.GoodsResSell;
 import com.style24.persistence.domain.GoodsSearch;
 import com.style24.persistence.domain.GoodsTnmRes;
 import com.style24.persistence.domain.Itemkind;
@@ -1085,7 +1086,7 @@ public class TsaGoodsService {
 		regGoods.setSeasonCd(goods.getSeasonCd());
 		regGoods.setSexGb(goods.getSexGb());
 		regGoods.setMainColorCd("Y");
-		regGoods.setMakeOriginCd(goods.getMakeOriginCd());
+		regGoods.setOriginCd(goods.getOriginCd());
 		regGoods.setMakeYmd(goods.getMakeYmd());
 		regGoods.setSelfMallYn(goods.getSelfMallYn());
 		regGoods.setGoodsStat("G008_20"); // 정보부족
@@ -1160,7 +1161,7 @@ public class TsaGoodsService {
 		regGoods.setSeasonCd(goods.getSeasonCd());
 		regGoods.setSexGb(goods.getSexGb());
 		regGoods.setMainColorCd("Y");   /// 수정
-		regGoods.setMakeOriginCd(goods.getMakeOriginCd());
+		regGoods.setOriginCd(goods.getOriginCd());
 		regGoods.setMakeYmd(goods.getMakeYmd());
 		regGoods.setSelfMallYn(goods.getSelfMallYn());
 		regGoods.setGoodsStat("G008_20"); // 정보부족
@@ -1452,7 +1453,7 @@ public class TsaGoodsService {
 	 *
 	 * @param goodsSearch
 	 * @return Collection<TsaGoodsEpSkip>
-	 * @author daehyoung
+	 * @author eskim
 	 * @since 2020. 11. 03
 	 */
 	public Collection<GoodsEpSkip> getGoodsEpSkipList(GoodsSearch goodsSearch) {
@@ -1464,7 +1465,7 @@ public class TsaGoodsService {
 	 *
 	 * @param goodsEpSkip
 	 * @return void
-	 * @author daehyoung
+	 * @author eskim
 	 * @since 2020. 11. 03
 	 */
 	@Transactional("shopTxnManager")
@@ -1491,7 +1492,7 @@ public class TsaGoodsService {
 	 *
 	 * @param goodsEpSkip
 	 * @return void
-	 * @author daehyoung
+	 * @author eskim
 	 * @since 2020. 11. 03
 	 */
 	@Transactional("shopTxnManager")
@@ -1507,6 +1508,89 @@ public class TsaGoodsService {
 		}
 	}
 
+	/**
+	 * 상품예약판매 목록 건수
+	 *
+	 * @param goodsSearch
+	 * @return Integer
+	 * @author eskim
+	 * @since 2020. 11. 12
+	 */
+	public int getGoodsResSellCount(GoodsSearch goodsSearch) {
+		return goodsDao.getGoodsResSellCount(goodsSearch);
+	}
+
+	/**
+	 * 상품예약판매 목록
+	 *
+	 * @param goodsSearch
+	 * @return Collection<TsaGoodsResSell>
+	 * @author eskim
+	 * @since 2020. 11. 12
+	 */
+	public Collection<GoodsResSell> getGoodsResSellList(GoodsSearch goodsSearch) {
+		return goodsDao.getGoodsResSellList(goodsSearch);
+	}
+
+	/**
+	 * 상품예약판매 등록
+	 *
+	 * @param goodsResSell
+	 * @return void
+	 * @author eskim
+	 * @since 2020. 11. 12
+	 */
+	@Transactional("shopTxnManager")
+	public void saveGoodsResSell(GoodsResSell goodsResSell) {
+		if (goodsResSell.getArrGoodsCd().length <= 0) {
+			throw new IllegalStateException(message.getMessage("FAIL_1001"));
+		}
+
+		for (String goodsCd : goodsResSell.getArrGoodsCd()) {
+
+			goodsResSell.setGoodsCd(goodsCd);
+			goodsResSell.setRegNo(TsaSession.getInfo().getUserNo());
+			goodsResSell.setUpdNo(TsaSession.getInfo().getUserNo());
+
+			if(goodsDao.getGoodsResSellDupChkCount(goodsResSell) > 0 ) {
+				throw new IllegalStateException("이미 등록된 상품예약판매가 존재합니다. \n(상품코드 : " + goodsCd + ")");
+			}
+
+			goodsDao.createGoodResSell(goodsResSell);
+
+			Goods goods = new Goods();
+			goods.setRegNo(TsaSession.getInfo().getUserNo());
+			goods.setUpdNo(TsaSession.getInfo().getUserNo());
+			goods.setGoodsCd(goodsResSell.getGoodsCd());
+
+			// 재고연동 비활성화
+			goodsDao.createGoodsHst(goods);
+			goodsDao.updateGoodsErpStockLinkYn(goods);
+
+		}
+	}
+
+	/**
+	 * 상품예약판매 삭제
+	 *
+	 * @param goodsResSell
+	 * @return void
+	 * @author eskim
+	 * @since 2020. 11. 12
+	 */
+	@Transactional("shopTxnManager")
+	public void deleteGoodsResSell(GoodsResSell goodsResSell) {
+		if (goodsResSell.getArrGoodsCd().length <= 0) {
+			throw new IllegalStateException(message.getMessage("FAIL_1001"));
+		}
+		int idx = 0;
+		for (String goodsCd : goodsResSell.getArrGoodsCd()) {
+			goodsResSell.setGoodsResSellSq(goodsResSell.getArrGoodsResSellSq()[idx]);
+			goodsDao.deleteGoodResSell(goodsResSell);
+			idx++;
+		}
+	}
+
 	/**
 	 * 상품 상세공지 목록
 	 *

+ 102 - 0
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.GoodsEpSkip;
 import com.style24.persistence.domain.GoodsHst;
 import com.style24.persistence.domain.GoodsNotiInfo;
+import com.style24.persistence.domain.GoodsResSell;
 import com.style24.persistence.domain.GoodsSearch;
 import com.style24.persistence.domain.GoodsTnmRes;
 import com.style24.persistence.domain.Itemkind;
@@ -1261,11 +1262,112 @@ public class TsaGoodsController extends TsaBaseController {
 	public ModelAndView reserveSellForm() {
 		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));
+		// 상품상태
+		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/GoodsReserveSellForm");
 
 		return mav;
 	}
 
+	/**
+	 * 상품예약판매 목록 조회
+	 *
+	 * @param goodsSearch
+	 * @return GagaMap
+	 * @author eskim
+	 * @since 2020. 11. 12
+	 */
+	@PostMapping("/reserve/sell/list")
+	@ResponseBody
+	public GagaMap goodsReserveSellList(@RequestBody GoodsSearch goodsSearch) {
+
+		GagaMap result = new GagaMap();
+
+		// 입점업체담당자는 업체코드 설정
+		if ("G001-B000".equals(TsaSession.getInfo().getRoleCd())) {
+			goodsSearch.setSupplyCompCd(TsaSession.getInfo().getSupplyCompCd());
+			goodsSearch.setMdNo(TsaSession.getInfo().getUserNo());
+		}
+
+		goodsSearch.setRegNo(TsaSession.getInfo().getUserNo()); // 엑셀조회시 로그인 사용자의 엑셀 상품조회시 사용
+		goodsSearch.setPageable(new TsaPageRequest(goodsSearch.getPageNo() - 1, goodsSearch.getPageSize()));
+		goodsSearch.getPageable().setTotalCount(goodsService.getGoodsResSellCount(goodsSearch));
+
+		result.set("pageing", goodsSearch);
+		result.set("goodsResSellList", goodsService.getGoodsResSellList(goodsSearch));
+
+		return result;
+	}
+
+	/**
+	 * 상품예약판매 등록 화면
+	 *
+	 * @return
+	 * @author eskim
+	 * @since 2020. 11. 12
+	 */
+	@GetMapping("/reserve/sell/regist/form")
+	@ResponseBody
+	public ModelAndView goodsReserveSellRegistForm() {
+		ModelAndView mav = new ModelAndView();
+
+		mav.setViewName("goods/GoodsReserveSellPopupForm");
+		return mav;
+	}
+
+	/**
+	 * 상품예약판매 저장
+	 *
+	 * @param goodsResSell
+	 * @return GagaResponse
+	 * @author eskim
+	 * @since 2020. 11. 12
+	 */
+	@PostMapping("/reserve/sell/regist/save")
+	@ResponseBody
+	public GagaResponse saveGoodsResSell(@RequestBody GoodsResSell goodsResSell) {
+		goodsService.saveGoodsResSell(goodsResSell);
+		return super.ok(message.getMessage("SUCC_0001"));
+	}
+
+	/**
+	 * 상품예약판매 삭제
+	 *
+	 * @param goodsResSell
+	 * @return GagaResponse
+	 * @author eskim
+	 * @since 2020. 11. 12
+	 */
+	@PostMapping("/reserve/sell/delete")
+	@ResponseBody
+	public GagaResponse deleteGoodsResSell(@RequestBody GoodsResSell goodsResSell) {
+		goodsService.deleteGoodsResSell(goodsResSell);
+		return super.ok(message.getMessage("SUCC_0001"));
+	}
+
 	/**
 	 * 상품 상세공지 화면
 	 *

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

@@ -61,8 +61,7 @@ public class Goods extends TscBaseDomain {
 	private int maxOrdQty;		//최대주문수량
 	private int dayMaxOrdQty;		//ID당1일최대구매수량
 	private String frstCfrmDt;		//최초승인일시
-	//private String makeNm;		//제조국(원산지)
-	private String makeOriginCd;		//제조국(원산지)
+	private String originCd;		//제조국(원산지)
 	private String makeYmd;		//제조연월일
 	private String taxGb;		//과세구분(10:과세, 20:비과세)
 	private String erpPriceLinkYn;		//ERP가격연계여부(자사상품만 사용. Y:연계)

+ 33 - 0
style24.admin/src/main/java/com/style24/persistence/domain/GoodsResSell.java

@@ -0,0 +1,33 @@
+package com.style24.persistence.domain;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Data;
+
+/**
+ * 상품 예약판매 Domain
+ *
+ * @author eskim
+ * @since 2020. 11. 12
+ */
+@SuppressWarnings("serial")
+@Data
+public class GoodsResSell extends TscBaseDomain {
+
+	private Integer goodsResSellSq;
+	private String goodsCd;
+	private String delvResDt;
+	private String useYn;
+
+	private String brandEnm;
+	private String goodsNm;
+	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[] arrGoodsResSellSq;
+
+}

+ 180 - 6
style24.admin/src/main/java/com/style24/persistence/mybatis/shop/TsaGoods.xml

@@ -725,8 +725,8 @@
 		     , G.DAY_MAX_ORD_QTY
 		     , G.ERP_STOCK_LINK_YN
 		     , G.ERP_PRICE_LINK_YN
-		     , FN_GET_CODE_NM('G076', G.MAKE_ORIGIN_CD) AS MAKE_NM
-		     , G.MAKE_ORIGIN_CD
+		     , FN_GET_CODE_NM('G076', G.ORIGIN_CD) AS MAKE_NM
+		     , G.ORIGIN_CD
 		     , G.MAKE_YMD
 		     , G.TAX_GB
 		     , G.GOODS_TYPE
@@ -845,7 +845,7 @@
 		      , MAX_ORD_QTY
 		      , DAY_MAX_ORD_QTY
 		      , FRST_CFRM_DT
-		      , MAKE_ORIGIN_CD
+		      , ORIGIN_CD
 		      , MAKE_YMD
 		      , TAX_GB
 		      , ERP_PRICE_LINK_YN
@@ -897,7 +897,7 @@
 		     , MAX_ORD_QTY         
 		     , DAY_MAX_ORD_QTY     
 		     , FRST_CFRM_DT        
-		     , MAKE_ORIGIN_CD             
+		     , ORIGIN_CD             
 		     , MAKE_YMD            
 		     , TAX_GB              
 		     , ERP_PRICE_LINK_YN   
@@ -1256,7 +1256,7 @@
 		  , PNT_MRATE
 		  , SELL_FEE_RATE
 		  , FORMAL_GB
-		  , MAKE_ORIGIN_CD
+		  , ORIGIN_CD
 		  , MAKE_YMD
 		  , TAX_GB
 		  , ERP_STOCK_LINK_YN
@@ -1296,7 +1296,7 @@
 		  , #{pntMrate}
 		  , #{sellFeeRate}
 		  , #{formalGb}
-		  , #{makeOriginCd}
+		  , #{mriginCd}
 		  , #{makeYmd}
 		  , #{taxGb}
 		  , NVL(#{erpStockLinkYn},'N')
@@ -1762,6 +1762,180 @@
 		WHERE GOODS_CD = #{goodsCd}
 	</select>
 	
+	<!-- 상품예약판매 목록 건수 -->
+	<select id="getGoodsResSellCount" parameterType="GoodsSearch" resultType="int">
+		/* TsaGoods.getGoodsResSellCount */
+		SELECT COUNT(*) AS TOTCNT
+		FROM TB_GOODS G
+		INNER JOIN TB_BRAND B ON G.BRAND_CD = B.BRAND_CD
+		INNER JOIN TB_SUPPLY_COMPANY S ON G.SUPPLY_COMP_CD = S.SUPPLY_COMP_CD
+		INNER JOIN TB_GOODS_RES_SELL GR ON G.GOODS_CD = GR.GOODS_CD
+		<if test="searchGb == null or searchGb =='BASIC'" >
+		    <if test="applyStdt != null and applyStdt != ''">
+		AND GR.DELV_RES_DT >= DATE_FORMAT(#{applyStdt}, '%Y-%m-%d %H:%i:%S')
+		    </if>
+		    <if test="applyEddt != null and applyEddt != ''">
+		    <![CDATA[
+		AND GR.DELV_RES_DT < DATE_FORMAT(DATE_ADD(#{applyEddt}, INTERVAL 1 DAY), '%Y-%m-%d %H:%i:%S')
+		    ]]>
+		    </if>
+		    <if test='beforSkipFlag != null and beforSkipFlag == "Y"'>
+		   AND GR.DELV_RES_DT >= NOW() 
+		    </if>
+		</if>
+		<if test="searchGb != null and searchGb =='EXCEL'">
+		INNER JOIN (
+		            SELECT SEARCH_CD
+		                 , TMP_DISP_ORD
+		            FROM (
+		                  SELECT SEARCH_CD
+		                       , MIN(DISP_ORD) AS TMP_DISP_ORD
+		                  FROM TB_SEARCH_DATA
+		                  WHERE REG_NO = #{regNo}
+		                  GROUP BY SEARCH_CD) T
+		         ) SD
+		         ON ( (G.GOODS_CD LIKE CONCAT(SD.SEARCH_CD,'%')
+		               OR G.SUPPLY_GOODS_CD LIKE CONCAT(SD.SEARCH_CD,'%')) 
+		               <if test="mdNo != null and mdNo > 0">
+		               AND G.BRAND_CD IN (
+		                                  SELECT DISTINCT BRAND_CD
+		                                  FROM TB_BRAND_MD
+		                                  WHERE MD_NO = #{mdNo}
+		                                  )
+		              </if>
+		           )
+		</if>
+		WHERE 1=1
+		<if test="searchGb == null or searchGb =='BASIC'" >
+		    <include refid="getGoodsListCondition_sql"/>
+		</if>
+	</select>
+
+	<!-- 상품예약판매 목록 -->
+	<select id="getGoodsResSellList" parameterType="GoodsSearch" resultType="GoodsResSell">
+		/* TsaGoods.getGoodsResSellList */
+		SELECT Z.*
+		FROM (
+		      SELECT A.*, @rownum := @rownum + 1 AS RNUM
+		      FROM (
+		            SELECT
+		                   G.GOODS_CD
+		                   , B.BRAND_ENM
+		                   , G.BRAND_CD
+		                   , G.SUPPLY_COMP_CD
+		                   , G.SUPPLY_GOODS_CD
+		                   , G.GOODS_NM
+		                   , G.GOODS_STAT
+		                   , GR.GOODS_RES_SELL_SQ
+		                   , GR.USE_YN
+		                   , DATE_FORMAT(GR.DELV_RES_DT,'%Y%m%d%H%i%S') AS DELV_RES_DT
+		                   , GR.REG_NO
+		                   , FN_GET_USER_NM(GR.REG_NO) AS REG_NM
+		                   , DATE_FORMAT(GR.REG_DT,'%Y%m%d%H%i%S') AS REG_DT
+		                   , GR.UPD_NO
+		                   , FN_GET_USER_NM(GR.UPD_NO) AS UPD_NM
+		                   , DATE_FORMAT(GR.UPD_DT,'%Y%m%d%H%i%S') AS UPD_DT
+		            FROM TB_GOODS G
+		            JOIN ( SELECT @rownum := 0) R
+		            INNER JOIN TB_BRAND B ON G.BRAND_CD = B.BRAND_CD
+		            INNER JOIN TB_SUPPLY_COMPANY S ON G.SUPPLY_COMP_CD = S.SUPPLY_COMP_CD
+		            INNER JOIN TB_GOODS_RES_SELL GR ON G.GOODS_CD = GR.GOODS_CD
+		            <if test="searchGb == null or searchGb =='BASIC'" >
+		                <if test="applyStdt != null and applyStdt != ''">
+		            AND GR.DELV_RES_DT >= DATE_FORMAT(#{applyStdt}, '%Y-%m-%d %H:%i:%S')
+		                </if>
+		                <if test="applyEddt != null and applyEddt != ''">
+		                <![CDATA[
+		            AND GR.DELV_RES_DT < DATE_FORMAT(DATE_ADD(#{applyEddt}, INTERVAL 1 DAY), '%Y-%m-%d %H:%i:%S')
+		                ]]>
+		                </if>
+		                <if test='beforSkipFlag != null and beforSkipFlag == "Y"'>
+		            AND GR.DELV_RES_DT >= NOW() 
+		                </if>
+		            </if>
+		            <if test="searchGb != null and searchGb =='EXCEL'">
+		            INNER JOIN (
+		                        SELECT SEARCH_CD
+		                             , TMP_DISP_ORD
+		                        FROM (
+		                              SELECT SEARCH_CD
+		                                   , MIN(DISP_ORD) AS TMP_DISP_ORD
+		                              FROM TB_SEARCH_DATA
+		                              WHERE REG_NO = #{regNo}
+		                              GROUP BY SEARCH_CD) T
+		                     ) SD
+		                     ON ( (G.GOODS_CD LIKE CONCAT(SD.SEARCH_CD,'%')
+		                           OR G.SUPPLY_GOODS_CD LIKE CONCAT(SD.SEARCH_CD,'%')) 
+		                           <if test="mdNo != null and mdNo > 0">
+		                           AND G.BRAND_CD IN (
+		                                              SELECT DISTINCT BRAND_CD
+		                                              FROM TB_BRAND_MD
+		                                              WHERE MD_NO = #{mdNo}
+		                                              )
+		                          </if>
+		                       )
+		            </if>
+		            WHERE 1=1
+		            <if test="searchGb == null or searchGb =='BASIC'" >
+		            <include refid="getGoodsListCondition_sql"/>
+		            ORDER BY  GR.DELV_RES_DT DESC, G.GOODS_CD, GR.GOODS_RES_SELL_SQ
+		            </if>
+		            <if test="searchGb != null and searchGb =='EXCEL'">
+		            ORDER BY SD.TMP_DISP_ORD
+		            </if>
+		<include refid="getListPagingCondition_sql"/>
+	</select>
+
+	<!-- 상품예약판매 조회(기간 체크용) -->
+	<select id="getGoodsResSellDupChkCount" parameterType="GoodsResSell" resultType="int">
+		/* TsaGoods.getGoodsResSellDupChkCount */
+		SELECT COUNT(GOODS_CD)
+		FROM TB_GOODS_RES_SELL
+		WHERE 1=1
+		AND GOODS_CD = #{goodsCd}
+		AND DELV_RES_DT > NOW()
+	</select>
+
+	<!-- 상품예약판매 등록 -->
+	<insert id="createGoodResSell" parameterType="GoodsResSell">
+		/* TsaGoods.createGoodResSell */
+		INSERT INTO TB_GOODS_RES_SELL (
+		  GOODS_RES_SELL_SQ
+		, GOODS_CD
+		, DELV_RES_DT
+		, REG_NO
+		, REG_DT
+		, UPD_NO
+		, UPD_DT
+		)
+		VALUES(
+		  NULL
+		, #{goodsCd}
+		, STR_TO_DATE(#{delvResDt},'%Y%m%d%H%i%S')
+		, #{regNo}
+		, NOW()
+		, #{updNo}
+		, NOW()
+		)
+	</insert>
+
+	<!-- 상품예약판매 등록 시 재고연동 비활성화 -->
+	<update id="updateGoodsErpStockLinkYn" parameterType="GoodsResSell">
+		/* TsaGoods.updateGoodsErpStockLinkYn */
+		UPDATE TB_GOODS
+		SET ERP_STOCK_LINK_YN = 'N'
+		    , UPD_NO = #{updNo}
+		    , UPD_DT =NOW()
+		WHERE GOODS_CD = #{goodsCd}
+	</update>
+
+	<!-- 상품예약판매 삭제 -->
+	<delete id="deleteGoodResSell" parameterType="GoodsResSell">
+		/* TsaGoods.deleteGoodResSell */
+		DELETE FROM TB_GOODS_RES_SELL
+		WHERE GOODS_RES_SELL_SQ = #{goodsResSellSq}
+	</delete>
+	
 	<!-- 네이버 EP 제외 상품 목록 건수 -->
 	<select id="getGoodsEpSkipCount" parameterType="GoodsSearch" resultType="int">
 		/* TsaGoods.getGoodsEpSkipCount */

+ 397 - 0
style24.admin/src/main/webapp/WEB-INF/views/goods/GoodsReserveSellForm.html

@@ -0,0 +1,397 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : GoodsReserveSellForm.html
+ * @desc    : 상품예약판매관리
+ *============================================================================
+ * PASTEL
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2020.11.12   eskim   최초 작성
+ *******************************************************************************
+ -->
+	<div id="main">
+		<!-- 메인타이틀 영역 -->
+		<div class="main-title">
+		</div>
+		<!-- //메인타이틀 영역 -->
+		<!-- 메뉴 설명 -->
+		<div class="infoBox menu-desc">
+		</div>
+		<form id="goodsResSellListForm" name="goodsResSellListForm" action="#" th:action="@{'/goods/reserve/sell/list'}">
+		<input type="hidden" id="searchGb" name="searchGb" />
+		<input type="hidden" id="arrGoodsCd" name="arrGoodsCd" />
+ 		<!-- 패널 영역1 -->
+		<div class="panelStyle" >
+			<div class="panelTitle">
+				<h3><i class="fa fa-info-circle"></i>아래 검색조건 중 하나를 꼭 입력해 주세요.</h3>
+			</div>
+			<div class="panelContent">
+				<table class="frmStyle">
+					<colgroup>
+						<col width="8%"/>
+						<col width="25%"/>
+						<col width="8%"/>
+						<col/>
+					</colgroup>
+					<tr>
+						<th>업체/브랜드</th>
+						<td>
+							<select name="supplyCompCd" id="supplyCompCd">
+								<option value="" th:if="${sessionInfo.roleCd} != 'B000'">[전체]</option>
+								<option th:if="${supplyCompList}" th:each="oneData, status : ${supplyCompList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
+							</select>
+							<select name="brandCd" id="brandCd">
+								<option value="">[전체]</option>
+							</select>
+						</td>
+						<th>키워드</th>
+						<td>
+							<select name="search" id="search">
+								<option value="searchGoodsCd">상품코드</option>
+								<option value="searchGoodsNm">상품명</option>
+								<option value="searchGoodsNum">품번</option>
+								<option value="searchSupplyGoodsCd">업체상품코드</option>
+								<option value="searchRegId">등록자</option>
+							</select>
+							<input type="text" class="w50p" name="condition" id="condition" maxlength="50"/>
+						</td>
+					</tr>
+					<tr>
+						<th>출고예정일</th>
+						<td colspan="3" 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 class="left">
+					<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="btnGoodsResSellSave">예약판매등록</button>
+					<button type="button" class="btn btn-danger btn-lg" id="btnGoodsResSellDelete">예약판매삭제</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: 500px;" class="ag-theme-balham"></div>
+			<ul class="panelBar">
+				<!-- Paging -->
+				<li class="center">
+					<div class="tablePaging" id="goodsListPagination"></div>
+				</li>
+				<!-- //Paging -->
+			</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 uploadGoodsUrl = [[${@environment.getProperty('upload.goods.view')}]];
+	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('goodsResSellListForm',params.node.rowIndex, 'A');}
+		},
+		{headerName: "브랜드명", field: "brandEnm", width: 130, cellClass: 'text-center'},
+		{headerName: "상품코드", field: "goodsCd", width: 140, cellClass: 'text-center'},
+		{headerName: "상품명", field: "goodsNm", width: 250, cellClass: 'text-left'
+			,cellRenderer: function(params) {
+				return '<a href="javascript:void(0);">' + params.value + '</a>';
+			}
+		},
+		{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: "delvResDt", width: 150, cellClass: 'text-center',
+			cellRenderer: function(params) {
+				return !gagajf.isNull(params.value) ? params.value.toDate("YYYYMMDDHHmmss").format("YYYY-MM-DD") : '';
+			}
+		},
+/*		{headerName: "사용여부", field: "useYn", width: 140, cellClass: 'text-center'},*/
+		{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: "regNm", width: 100, cellClass: 'text-center'},
+		{headerName: "수정일시", field: "updDt", 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: "updNm", width: 100, cellClass: 'text-center'}
+	];
+	
+	// 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(){
+		$('#goodsResSellListForm')[0].reset();
+		$("#goodsResSellListForm input[type=checkbox]").removeClass("checked");
+		$("#goodsResSellListForm input[type=checkbox]").parent("label").removeClass("checked");
+		$("#goodsResSellListForm input[type=radio][checked]").parent("label").addClass("checked");
+	}
+	
+	// 조회클릭시
+	$('#btnSearch').on('click', function() {
+		$("#goodsResSellListForm input[name=pageNo]").val('1');
+		fnGoodsResSellListSearch('BASIC');
+	});
+
+	// 조회
+	var fnGoodsResSellListSearch = function(gbn) {
+		
+		if (typeof(gbn) != 'undefined' &&  gbn == 'EXCEL'){
+			$("#goodsResSellListForm input[name=searchGb]").val("EXCEL");
+		}else{
+			$("#goodsResSellListForm input[name=searchGb]").val("BASIC");
+		}
+		
+		if(!fnConditionCheck()) return;
+		
+		gagaPaging.init('goodsResSellListForm', fnSearchCallBack, 'goodsListPagination', $('#goodsResSellListForm').find('#pageSize').val());
+		gagaPaging.load($("#goodsResSellListForm input[name=pageNo]").val());
+	}
+
+	// 조회 (등록 창 닫을 때)
+	var fnGoodsResSellRegistListSearch = function(gbn) {
+
+		if (typeof(gbn) != 'undefined' &&  gbn == 'EXCEL'){
+			$("#goodsResSellListForm input[name=searchGb]").val("EXCEL");
+		}else{
+			$("#goodsResSellListForm input[name=searchGb]").val("BASIC");
+		}
+
+		gagaPaging.init('goodsResSellListForm', fnSearchCallBack, 'goodsListPagination', $('#goodsResSellListForm').find('#pageSize').val());
+		gagaPaging.load($("#goodsResSellListForm input[name=pageNo]").val());
+	}
+
+	//검색 조건 확인
+	var fnConditionCheck = function(){
+		var formId = '#goodsResSellListForm';
+		var form = document.goodsResSellListForm;
+
+		if($("#goodsResSellListForm input[name=searchGb]").val() == "EXCEL") return true;
+		
+		var searchFlag = false;
+		var cnt = 0;
+
+		for (i = 0; i < form.elements.length; i++ ) {
+			var el = form.elements[i];
+
+			if ($(el).prop("type") == "text" || ($(el).prop("type") == "select-one" && el.name != "search" && el.name != "pageSize")) {
+				if (!(el.value == null || el.value == "")) {
+					cnt++;
+				}
+			}
+		}
+			
+		if(cnt > 0) searchFlag = true;
+
+		if(searchFlag == false){
+			mcxDialog.alert("검색조건을 입력하세요.");
+			return false;
+		}
+		
+		var fromDate = $('#goodsResSellListForm input[name=stDate]').val();
+		var toDate = $('#goodsResSellListForm input[name=edDate]').val();
+		
+		if (!gagajf.isNull(fromDate) || !gagajf.isNull(toDate)) {
+			
+			if (gagajf.isNull(fromDate) || gagajf.isNull(toDate)) {
+				mcxDialog.alertC("등록일 조회시 시작일자와 종료일자를 입력하세요.", {
+					sureBtnText: "확인",
+					sureBtnClick: function(){
+						$('#goodsResSellListForm input[name=stDate]').focus();
+					}
+				});
+				return false;
+			}
+
+			if (fromDate > toDate) {
+				mcxDialog.alertC("출고예정 시작일자는 종료일자 보다 클 수 없습니다.", {
+					sureBtnText: "확인",
+					sureBtnClick: function(){
+						$('#goodsResSellListForm input[name=stDate]').focus();
+					}
+				});
+				return false;
+			} 
+		}
+
+		return true;
+	}
+	
+	var fnSearchCallBack = function(result){
+
+		$('#goodsResSellListForm').find('#gridRowTotalCount').html(result.pageing.pageable.totalCount.addComma());
+		$('#goodsResSellListForm').find('#pageNo').val(result.pageing.pageable.pageNo.addComma());
+		$('#goodsResSellListForm').find('#pgNo').html(result.pageing.pageable.pageNo.addComma());
+		$('#goodsResSellListForm').find('#endPgNo').html(result.pageing.pageable.totalPage.addComma());
+		gridOptions.api.setRowData(result.goodsResSellList);
+		gagaPaging.createPagination(result.pageing.pageable);
+	}
+	
+	//페이징 
+	$('#goodsResSellListForm select[name=pageSize]').on('change', function() {
+		$("#goodsResSellListForm input[name=pageNo]").val('1');
+		fnGoodsResSellListSearch($("#goodsResSellListForm input[name=searchGb]").val());
+	});
+	
+	//업체변경시
+	$('#goodsResSellListForm select[name=supplyCompCd]').on('change', function() {
+		var actionUrl = '/renderer/supplyCompany/brand/list/' + $(this).val();
+
+		if(sessRoleCd == "B000"){
+			actionUrl = '/renderer/brand/AuthBrandlist';
+		}
+		$("#goodsResSellListForm select[name=brandCd] option:gt(0)").remove();
+
+		cfnCreateCombo(actionUrl, $('#goodsResSellListForm select[name=brandCd]'), "[전체]", "");
+	});
+	
+	//엑셀 상품 조회
+	$('#btnGoodsExcelUpLoad').on('click', function() {
+		cfnExcelUploadPopup('goodsResSellExcelUpload', 'goodsResSellExcelUpload');
+	});
+	
+	var goodsResSellExcelUpload = function(result){
+		var data = {procJob : result.procJob
+					,excelFileNm : result.excelFileNm
+					};
+		var jsonData = JSON.stringify(data);
+		gagajf.ajaxJsonSubmit('/goods/search/excelupload/save', jsonData, fngoodsResSellExcelUploadCallBack);
+	}
+	
+	var fngoodsResSellExcelUploadCallBack = function(result){
+		fnGoodsResSellListSearch("EXCEL");
+	}
+	
+	//예약등록
+	$('#btnGoodsResSellSave').click(function(e) {
+		var actionUrl = "/goods/reserve/sell/regist/form";
+		cfnOpenModalPopup(actionUrl, 'popupGoodsRsvtList');
+	});
+	
+	//예약삭제
+	$('#btnGoodsResSellDelete').click(function(e) {
+		//상품선택여부 확인처리 추가
+		var selectedData = gridOptions.api.getSelectedRows();
+
+		if (selectedData.length == 0) {
+			mcxDialog.alert('선택된 행이 없습니다.');
+			return false;
+		}
+		
+		var arrGoodsCd = [];
+		var arrGoodsResSellSq = [];
+		var chkFlag = false;
+		$.each(selectedData, function(idx, item) {
+			
+			var toDateStr = new Date().format("YYYYMMDDHHmmss");
+			if (toDateStr > item.delvResDt){
+				chkFlag = true;
+				mcxDialog.alertC("출고예정일이 지난 상품예약판매는 삭제할 수 없습니다.", {
+					sureBtnText: "확인",
+					sureBtnClick: function(){
+						$('#goodsResSellForm input[name=applyEdYMD]').focus();
+					}
+				});
+				return false;
+			}
+		
+			arrGoodsCd.push(item.goodsCd);
+			arrGoodsResSellSq.push(item.goodsResSellSq);
+		});
+
+		if (chkFlag){
+			return;
+		}
+		mcxDialog.confirm('삭제하시겠습니까?', {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function(){
+				var data = {arrGoodsCd : arrGoodsCd
+						,arrGoodsResSellSq : arrGoodsResSellSq
+			};
+			
+			var jsonData = JSON.stringify(data);
+			gagajf.ajaxJsonSubmit('/goods/reserve/sell/delete', jsonData, fnGoodsResSellDeleteCallBack);
+			}
+		});
+		
+	});
+	
+	var fnGoodsResSellDeleteCallBack = function(){
+		//fnGoodsResSellRegistListSearch($("#goodsResSellListForm 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>';
+		$("#goodsResSellListForm").find('#sellTerms').append(chkBeforSkipFlag);
+		
+		// Create a agGrid
+		gagaAgGrid.createGrid('gridList', gridOptions);
+
+	});
+
+/*]]>*/
+</script>
+ 	
+</html>

+ 219 - 0
style24.admin/src/main/webapp/WEB-INF/views/goods/GoodsReserveSellPopupForm.html

@@ -0,0 +1,219 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : GoodsReserveSellPopupForm.html
+ * @desc    : 상품예약판매 등록 화면
+ *============================================================================
+ * PASTEL
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2020.11.12   eskim       최초 작성
+ *******************************************************************************
+ -->	
+	<div class="modalPopup"   data-width="700" >
+		<div class="panelStyle">
+			<div class="panelTitle">
+				<h2>예약판매등록</h2>
+				<button type="button" class="close" onclick="uifnPopupClose('popupGoodsRsvtList')"><i class="fa fa-times"></i></button>
+			</div>
+			<form id="goodsResSellRegisterForm" name="goodsResSellRegisterForm" >
+			<div class="panelContent">
+				<table class="frmStyle">
+					<colgroup>
+						<col style="width:10%;"/>
+						<col/>
+					</colgroup>
+					<tr>
+						<th>출고예정일<em class="required" title="필수"></em></th>
+						<td>
+							<input name="delvResDt" id="delvResDt" type="text" class="w80 schDate" maxlength="10" required="required" data-valid-name="출고예정일" />
+						</td>
+					</tr>
+				</table>
+			</div>	
+				<ul class="panelBar">
+					<li class="left">
+						<button type="button" class="btn btn-danger btn-lg" id="btnDeleteGoodsResSell">상품삭제</button>
+					</li>
+					<li class="right">
+						<button type="button" class="btn btn-base btn-lg" id="btnSearchExcel">엑셀조회</button>
+						<button type="button" class="btn btn-info btn-lg" id="btnSearchGoods">상품조회</button>
+					</li>
+				</ul>
+				<div id="gridGoodsResSellRegisterList" style="width: 100%; height: 500px;" class="ag-theme-balham"></div>
+				<ul class="panelBar">
+					<li class="right">
+						<button type="button" class="btnRight btn btn-base btn-lg" id=btnSaveGoodsResSell>저장</button>
+					</li>
+				</ul>
+			</form>
+		</div>
+	</div>
+<script th:inline="javascript">
+/*<![CDATA[*/
+	var goodsResSellRegisterColumnDefs = [
+		{width: 40, minWidth: 40, cellClass: 'text-center', headerCheckboxSelection: true, checkboxSelection: true, filter: false},
+		{headerName: 'No', width: 60, cellClass: 'text-center',valueGetter: function(params) { return params.node.rowIndex+1}},
+		{headerName: "브랜드명", field: "brandEnm", width: 140, cellClass: 'text-center'},
+		{headerName: "상품코드", field: "goodsCd", width: 140, cellClass: 'text-center'},
+		{headerName: "상품명", field: "goodsNm", width: 250, cellClass: 'text-left'}
+	];
+	
+	// Get GridOptions
+	var goodsResSellRegisterGridOptions = gagaAgGrid.getGridOptions(goodsResSellRegisterColumnDefs);
+
+	// 중복 선택 가능
+	goodsResSellRegisterGridOptions.rowSelection = 'multiple';
+	goodsResSellRegisterGridOptions.suppressRowClickSelection = true;
+
+	// 상품 조회 클릭 시
+	$('#btnSearchGoods').on('click', function() {
+		cfnOpenGoodsPopup('fnSearchGoods');
+	});
+
+	// 상품 조회 콜백함수
+	var fnSearchGoods = function(result) {
+		if (result.length < 1) return;
+		var oldData = gagaAgGrid.getAllRowData(goodsResSellRegisterGridOptions);
+		$.each(result, function(idx, item) {
+			if(item.goodsType != 'G056_N'){
+				return true;
+			}
+			var isInvalid = false;
+			if (oldData != null && oldData.length != 0){
+				oldData.forEach(function(oneData){
+					if(oneData.goodsCd == item.goodsCd){
+						isInvalid = true;
+						return true;
+					}
+				});
+				if(isInvalid){
+					return isInvalid;
+				}
+			}
+			gagaAgGrid.addRowData(goodsResSellRegisterGridOptions, {"goodsCd" : item.goodsCd, "goodsNm" : item.goodsNm, "brandEnm" : item.brandEnm});
+		});
+		//uifnPopupClose('popupGoods');
+		return;
+	};
+
+	// 저장 클릭 시
+	$('#btnSaveGoodsResSell').on('click', function() {
+		var delvResDt = $('#goodsResSellRegisterForm input[name=delvResDt]').val();
+
+		if (gagajf.isNull(delvResDt)) {
+			mcxDialog.alertC("출고예정일을 입력하세요.", {
+				sureBtnText: "확인",
+				sureBtnClick: function() {
+					$('#goodsResSellRegisterForm input[name=delvResDt]').focus();
+				}
+			});
+			return false;
+		}
+
+		delvResDt = $('#goodsResSellRegisterForm input[name=delvResDt]').val().replaceAll("-","");
+
+		var toDateStr = new Date().format("YYYYMMDD");
+
+		if (toDateStr >= delvResDt){
+			mcxDialog.alertC("출고예정일은 현재일시 보다 작거나 같을 수 없습니다.", {
+				sureBtnText: "확인",
+				sureBtnClick: function() {
+					$('#goodsResSellRegisterForm input[name=delvResDt]').focus();
+				}
+			});
+			return false;
+		}
+
+		mcxDialog.confirm('저장하시겠습니까?', {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function(){
+				var arrGoodsCd = [];
+				var allRowData = gagaAgGrid.getAllRowData(goodsResSellRegisterGridOptions);
+				allRowData.forEach(function(item, index) {
+					arrGoodsCd.push(item.goodsCd);
+				});
+
+				var data = {delvResDt : delvResDt
+						, arrGoodsCd : arrGoodsCd
+				};
+				
+				var jsonData = JSON.stringify(data);
+				gagajf.ajaxJsonSubmit('/goods/reserve/sell/regist/save', jsonData, fnGoodsResSellRegisterFormClose);
+			}
+		});
+	});
+
+	//엑셀 상품 조회
+	$('#btnSearchExcel').on('click', function() {
+		cfnExcelUploadPopup('goodsResSellRegistExcelUpload', 'goodsResSellRegistExcelUpload');
+	});
+
+	var goodsResSellRegistExcelUpload = function(result){
+		var data = {procJob : result.procJob
+			,excelFileNm : result.excelFileNm
+		};
+		var jsonData = JSON.stringify(data);
+		gagajf.ajaxJsonSubmit('/goods/search/excelupload/save', jsonData, fnGoodsResSellExcelUploadCallBack);
+	}
+
+	var fnGoodsResSellExcelUploadCallBack = function(result){
+		gagajf.ajaxJsonSubmit('/goods/excel/upload/goods/list', '', fnExcelSearchCallBack);
+	}
+
+	var fnExcelSearchCallBack = function(result){
+		if (result.goodsExcelList.length < 1) return;
+		var oldData = gagaAgGrid.getAllRowData(goodsResSellRegisterGridOptions);
+		$.each(result.goodsExcelList, function(idx, item) {
+			if(item.goodsType != 'G056_N'){
+				return true;
+			}
+			var isInvalid = false;
+			if (oldData != null && oldData.length != 0){
+				oldData.forEach(function(oneData){
+					if(oneData.goodsCd == item.goodsCd){
+						isInvalid = true;
+						return true;
+					}
+				});
+				if(isInvalid){
+					return isInvalid;
+				}
+			}
+			gagaAgGrid.addRowData(goodsResSellRegisterGridOptions, {"goodsCd" : item.goodsCd, "goodsNm" : item.goodsNm, "brandEnm" : item.brandEnm});
+		});
+
+		return;
+	}
+	
+	// 조회상품 삭제
+	$('#btnDeleteGoodsResSell').on('click', function() {
+		var selectedData = goodsResSellRegisterGridOptions.api.getSelectedRows();
+		if (selectedData.length == 0) {
+			mcxDialog.alert('선택된 행이 없습니다.');
+			return;
+		}
+
+		//화면에서 삭제
+		var removedData = gagaAgGrid.removeRowData(goodsResSellRegisterGridOptions, false);
+	});
+	
+	//창종료
+	var fnGoodsResSellRegisterFormClose = function(){
+		uifnPopupClose('popupGoodsRsvtList');
+		fnGoodsResSellDeleteCallBack();
+	}
+
+	$(document).ready(function() {
+		// Create a agGrid
+		gagaAgGrid.createGrid('gridGoodsResSellRegisterList', goodsResSellRegisterGridOptions);
+	});
+
+/*]]>*/
+</script>
+</html>