Переглянути джерело

상품검색화면 서버 모듈 구현

gagamel 5 роки тому
батько
коміт
6c1a79e1e7

+ 9 - 0
src/main/java/com/style24/front/biz/dao/TsfDisplayDao.java

@@ -155,6 +155,15 @@ public interface TsfDisplayDao {
 	 */
 	Collection<Filter> getGoodsListCategoryFilterList(SearchEngine searchEngine);
 
+	/**
+	 * 검색키워드를 통한 검색상품리스트 카테고리별 필터 목록
+	 * @param searchEngine - 검색엔진 정보
+	 * @return
+	 * @author gagamel
+	 * @date 2021. 5. 3
+	 */
+	Collection<Filter> getSearchGoodsListCategoryFilterList(SearchEngine searchEngine);
+
 	/**
 	 * 상품카테고리 필터 목록
 	 * @param

+ 22 - 3
src/main/java/com/style24/front/biz/dao/TsfGoodsDao.java

@@ -238,7 +238,7 @@ public interface TsfGoodsDao {
 	 * @date 2021. 3. 8
 	 */
 	Collection<Goods> getTmtbGoodsList(Goods goods);
-	
+
 	/**
 	 * 상품 추천상품 목록
 	 *
@@ -327,7 +327,7 @@ public interface TsfGoodsDao {
 	 * @date 2021. 4. 11
 	 */
 	Collection<Tmtb> getTmtbList(Goods goods);
-	
+
 	/**
 	 * 상품의 사은품 목록 
 	 *
@@ -337,7 +337,7 @@ public interface TsfGoodsDao {
 	 * @date 2021. 4. 13
 	 */
 	Collection<Freegift> getFreeGoodsList(Goods goods);
-	
+
 	/**
 	 * 컨텐츠카테고리상품 목록
 	 * @param cate - 카테고리 정보
@@ -382,4 +382,23 @@ public interface TsfGoodsDao {
 	 * @date 2021. 4. 8
 	 */
 	Collection<SearchEngine> getCategoryGoodsList(SearchEngine params);
+
+	/**
+	 * 검색상품 총건수
+	 * @param params - 검색엔진 정보
+	 * @return
+	 * @author gagamel
+	 * @date 2021. 5. 6
+	 */
+	int getSearchGoodsCount(SearchEngine params);
+
+	/**
+	 * 검색상품 목록
+	 * @param params - 검색엔진 정보
+	 * @return
+	 * @author gagamel
+	 * @date 2021. 5. 6
+	 */
+	Collection<SearchEngine> getSearchGoodsList(SearchEngine params);
+
 }

+ 90 - 0
src/main/java/com/style24/front/biz/service/TsfDisplayService.java

@@ -486,6 +486,20 @@ public class TsfDisplayService {
 		return displayDao.getGoodsListCategoryFilterList(params);
 	}
 
+	/**
+	 * 검색키워드를 통한 검색상품리스트 카테고리별 필터 목록
+	 * @param params - 검색엔진 정보
+	 * @return
+	 * @author gagamel
+	 * @date 2021. 5. 3
+	 */
+	public Collection<Filter> getSearchGoodsListCategoryFilterList(SearchEngine params) {
+		params.setSiteCd(TscConstants.Site.STYLE24.value());
+		params.setCateGb(TsfConstants.CateGb.BYITEM.value());
+		params.setFormalGb("G009_10");
+		return displayDao.getSearchGoodsListCategoryFilterList(params);
+	}
+
 	/**
 	 * 카테고리별 필터 목록
 	 * @param filterList - 필터 목록
@@ -561,4 +575,80 @@ public class TsfDisplayService {
 		return contentsList;
 	}
 
+	/**
+	 * 상품검색키워드 카테고리 목록
+	 * @param keyword - 상품검색키워드
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 5. 6
+	 */
+	public Collection<Cate1> getKeywordCategoryList(String keyword) {
+		Cate4Srch cate = new Cate4Srch();
+		cate.setSiteCd(TscConstants.Site.STYLE24.value()); // 사이트코드
+		cate.setCateGb(TsfConstants.CateGb.BYITEM.value()); // 카테고리구분
+		cate.setCateType(TsfConstants.CateType.GOODS.value()); // 상품분류카테고리
+		cate.setSoldoutGoodsDispYn(envsetService.getSoldoutGoodsDisplayYn(TscConstants.Site.STYLE24.value()));
+		cate.setKeyword(keyword);
+
+		// 카테고리1 목록
+		Collection<Cate1> cate1List = displayDao.getCategory1List(cate);
+
+		if (cate1List != null && !cate1List.isEmpty()) {
+			for (Cate1 cate1 : cate1List) {
+				if (cate1.getLeafYn().equals("N")) {
+					cate.setCate1No(cate1.getCate1No());
+
+					// 카테고리2 목록
+					Collection<Cate2> cate2List = displayDao.getCategory2List(cate);
+
+					if (cate2List != null && !cate2List.isEmpty()) {
+						for (Cate2 cate2 : cate2List) {
+							if (cate2.getLeafYn().equals("N")) {
+								cate.setCate2No(cate2.getCate2No());
+
+								// 카테고리3 목록
+								Collection<Cate3> cate3List = displayDao.getCategory3List(cate);
+
+								if (cate3List != null && !cate3List.isEmpty()) {
+									for (Cate3 cate3 : cate3List) {
+										if (cate3.getLeafYn().equals("N")) {
+											cate.setCate3No(cate3.getCate3No());
+
+											// 카테고리4 목록
+											Collection<Cate4> cate4List = displayDao.getCategory4List(cate);
+
+											if (cate4List != null && !cate4List.isEmpty()) {
+												for (Cate4 cate4 : cate4List) {
+													if (cate4.getLeafYn().equals("N")) {
+														cate.setCate4No(cate4.getCate4No());
+
+														// 카테고리5 목록 담기
+														cate4.setCate5List(displayDao.getCategory5List(cate));
+													}
+												}
+
+												log.info("cate4List: {}", cate4List);
+
+												// 카테고리4 목록 담기
+												cate3.setCate4List(cate4List);
+											}
+										}
+									}
+
+									// 카테고리3 목록 담기
+									cate2.setCate3List(cate3List);
+								}
+							}
+						}
+
+						// 카테고리2 목록 담기
+						cate1.setCate2List(cate2List);
+					}
+				}
+			}
+		}
+
+		return cate1List;
+	}
+
 }

+ 25 - 3
src/main/java/com/style24/front/biz/service/TsfGoodsService.java

@@ -3,7 +3,6 @@ package com.style24.front.biz.service;
 import java.util.ArrayList;
 import java.util.Collection;
 
-import com.style24.persistence.domain.searchengine.SearchEngine;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -31,6 +30,7 @@ import com.style24.persistence.domain.Notice;
 import com.style24.persistence.domain.ReinboundInform;
 import com.style24.persistence.domain.SizeInfo;
 import com.style24.persistence.domain.Tmtb;
+import com.style24.persistence.domain.searchengine.SearchEngine;
 
 import lombok.extern.slf4j.Slf4j;
 
@@ -779,7 +779,7 @@ public class TsfGoodsService {
 				maxRow = maxRow - goodsList.size();
 				cate.setMaxRow(maxRow);
 				cate.setCateGb("G032_101");
-				if(cate.getContentsLoc().equals("SBM003")){
+				if (cate.getContentsLoc().equals("SBM003")) {
 					cate.setCate1No(null);
 				}
 
@@ -811,7 +811,7 @@ public class TsfGoodsService {
 //			goodsSearch.setMaxRow(cate.getMaxRow());
 //			goodsSearch.setContentsLoc(cate.getContentsLoc());
 //			goodsList = displayDao.getCategoryGoodsList(goodsSearch);
-			log.info("SBM013 goodsList cate>>>{}",cate);
+			log.info("SBM013 goodsList cate>>>{}", cate);
 			goodsList = goodsDao.getContentsCategoryGoodsList(cate);
 
 			for (Goods temp : goodsList) {
@@ -867,4 +867,26 @@ public class TsfGoodsService {
 		return goodsDao.getCategoryGoodsList(params);
 	}
 
+	/**
+	 * 검색상품 총건수
+	 * @param params - 검색엔진 정보
+	 * @return
+	 * @author gagamel
+	 * @date 2021. 5. 6
+	 */
+	public int getSearchGoodsCount(SearchEngine params) {
+		return goodsDao.getSearchGoodsCount(params);
+	}
+
+	/**
+	 * 검색상품 목록
+	 * @param params - 검색엔진 정보
+	 * @return
+	 * @author gagamel
+	 * @date 2021. 5. 6
+	 */
+	public Collection<SearchEngine> getSearchGoodsList(SearchEngine params) {
+		return goodsDao.getSearchGoodsList(params);
+	}
+
 }

+ 60 - 0
src/main/java/com/style24/front/biz/web/TsfDisplayController.java

@@ -846,4 +846,64 @@ public class TsfDisplayController extends TsfBaseController {
 		return mav;
 	}
 
+	/**
+	 * 검색상품 목록 화면
+	 * @param params - 검색엔진 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 5. 6
+	 */
+	@GetMapping("/search/goods/list/form")
+	public ModelAndView searchGoodsListForm(SearchEngine params) {
+		ModelAndView mav = new ModelAndView(super.getDeviceViewName("display/SearchGoodsListForm"));
+
+		mav.addObject("cateInfo", params);
+
+		// 상품검색키워드 카테고리 목록
+		mav.addObject("cateList", displayService.getKeywordCategoryList(params.getKeyword()));
+
+		// 상품리스트 카테고리별 필터 목록
+		Collection<Filter> filterList = displayService.getSearchGoodsListCategoryFilterList(params);
+
+		// 필터 설정
+		mav.addObject("filterBrandList", displayService.getCategoryFilterList(filterList, "BRAND"));
+		mav.addObject("filterSizeList", displayService.getCategoryFilterList(filterList, "SIZE"));
+		mav.addObject("filterPriceList", displayService.getCategoryFilterList(filterList, "PRICE"));
+		mav.addObject("filterAgeList", displayService.getCategoryFilterList(filterList, "AGE"));
+		mav.addObject("filterSeasonList", displayService.getCategoryFilterList(filterList, "SEASON"));
+		mav.addObject("filterColorList", displayService.getCategoryFilterList(filterList, "COLOR"));
+		mav.addObject("filterBenefitList", displayService.getCategoryFilterList(filterList, "BENEFIT"));
+
+		return mav;
+	}
+
+	/**
+	 * 검색상품 리스트 조회
+	 * @param params - 검색엔진 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 5. 6
+	 */
+	@PostMapping("/search/goods/list")
+	@ResponseBody
+	public GagaMap getSearchGoodsList(@RequestBody SearchEngine params) {
+		GagaMap result = new GagaMap();
+
+		TscPageRequest pageable = new TscPageRequest((params.getPageNo() > 0 ? params.getPageNo() - 1 : 0), params.getPageSize(), params.getPageUnit());
+
+		if (TsfSession.isLogin()) {
+			params.setCustNo(TsfSession.getInfo().getCustNo());
+		}
+
+		params.setFrontGb(TsfSession.getFrontGb());
+		params.setCustGb(TsfSession.getCustGb());
+
+		pageable.setTotalCount(goodsService.getSearchGoodsCount(params));
+		params.setPageable(pageable);
+		result.set("paging", pageable);
+		result.set("dataList", goodsService.getSearchGoodsList(params));
+
+		return result;
+	}
+
 }

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

@@ -1,8 +1,8 @@
 package com.style24.persistence.domain;
 
 import com.style24.persistence.TscBaseDomain;
-
 import com.style24.persistence.TscPageRequest;
+
 import lombok.Data;
 
 /**
@@ -58,4 +58,7 @@ public class Cate4Srch extends TscBaseDomain {
 	private int pageNo = 1;
 	private int pageSize = 50;
 	private int pageUnit = 10;
+
+	private String keyword;		// 상품검색키워드
+
 }

+ 83 - 8
src/main/java/com/style24/persistence/mybatis/shop/TsfDisplay.xml

@@ -318,6 +318,36 @@
 		               AND    STOCK_QTY > 0 /*품절상품전시여부가 N일 때 재고가 있는 카테고리만*/
 		               </if>
 		              )
+		<if test="keyword != null and keyword != ''"> <!-- 상품검색키워드 -->
+		AND    CATE1_NO IN (SELECT DISTINCT C4.CATE1_NO
+		                    FROM   TB_CATE_4SRCH C4
+		                         , TB_CATE_GOODS CG
+		                         , TB_GOODS G
+		                         , TB_GOODS_STOCK S
+		                         , TB_BRAND B
+		                    WHERE  C4.LEAF_CATE_NO = CG.CATE_NO
+		                    AND    CG.GOODS_CD = G.GOODS_CD
+		                    AND    CG.GOODS_CD = S.GOODS_CD
+		                    AND    G.BRAND_CD = B.BRAND_CD
+		                    AND    C4.SITE_CD = #{siteCd}
+		                    AND    C4.CATE_GB = #{cateGb}
+		                    AND    C4.CATE_TYPE = 'G031_10' /*상품카테고리*/
+		                    AND    (
+		                            G.GOODS_NUM LIKE CONCAT('%',UPPER(#{keyword}),'%')
+		                            OR
+		                            G.GOODS_CD LIKE CONCAT('%',UPPER(#{keyword}),'%')
+		                            OR
+		                            UPPER(G.GOODS_NM) LIKE CONCAT('%',UPPER(#{keyword}),'%')
+		                            OR
+		                            UPPER(B.BRAND_ENM) LIKE CONCAT('%',UPPER(#{keyword}),'%')
+		                            OR
+		                            UPPER(B.BRAND_KNM) LIKE CONCAT('%',UPPER(#{keyword}),'%')
+		                           )
+		                    AND    G.GOODS_STAT = 'G008_90' /*승인완료상품*/
+		                    AND    G.SELF_MALL_YN = 'Y' /*몰노출상품*/
+		                    AND    NOW() BETWEEN G.SELL_STDT AND G.SELL_EDDT /*유효한 판매기간*/
+		                   )
+		</if>
 		ORDER  BY DISP_ORD
 	</select>
 	
@@ -621,14 +651,11 @@
 	<select id="getGoodsListCategoryFilterList" parameterType="SearchEngine" resultType="Filter">
 		/* TsfDisplay.getGoodsListCategoryFilterList */
 		SELECT FILTER_GB
-		       <choose>
-		           <when test="filterGb != null and filterGb == 'SIZE'">
-		     , SUBSTRING_INDEX(FILTER_CD,'|',1) AS FILTER_CD
-		           </when>
-		           <otherwise>
-		     , FILTER_CD
-		           </otherwise>
-		       </choose>
+		     , CASE WHEN FILTER_GB = 'SIZE' THEN
+		                SUBSTRING_INDEX(FILTER_CD,'|',1) AS FILTER_CD
+		            ELSE
+		                FILTER_CD
+		       END       AS FILTER_CD
 		     , FILTER_NM
 		FROM   TB_CATE_FILTER
 		WHERE  SITE_CD = #{siteCd}
@@ -651,6 +678,53 @@
 		ORDER  BY FILTER_GB, DISP_ORD
 	</select>
 	
+	<!-- 검색상품리스트 카테고리별 필터 목록 -->
+	<select id="getSearchGoodsListCategoryFilterList" parameterType="SearchEngine" resultType="Filter">
+		/* TsfDisplay.getSearchGoodsListCategoryFilterList */
+		SELECT DISTINCT
+		       FILTER_GB
+		     , CASE WHEN FILTER_GB = 'SIZE' THEN
+		                SUBSTRING_INDEX(FILTER_CD,'|',1) AS FILTER_CD
+		            ELSE
+		                FILTER_CD
+		       END       AS FILTER_CD
+		     , FILTER_NM
+		FROM   TB_CATE_FILTER
+		WHERE  SITE_CD = #{siteCd}
+		AND    CATE_GB = #{cateGb}
+		AND    FORMAL_GB = #{formalGb}
+		AND    BRAND_GROUP_NO = #{brandGroupNo}
+		AND    CATE_NO IN (SELECT DISTINCT C4.LEAF_CATE_NO
+		                   FROM   TB_CATE_4SRCH C4
+		                        , TB_CATE_GOODS CG
+		                        , TB_GOODS G
+		                        , TB_GOODS_STOCK S
+		                        , TB_BRAND B
+		                   WHERE  C4.LEAF_CATE_NO = CG.CATE_NO
+		                   AND    CG.GOODS_CD = G.GOODS_CD
+		                   AND    CG.GOODS_CD = S.GOODS_CD
+		                   AND    G.BRAND_CD = B.BRAND_CD
+		                   AND    C4.SITE_CD = #{siteCd}
+		                   AND    C4.CATE_GB = #{cateGb}
+		                   AND    C4.CATE_TYPE = 'G031_10' /*상품카테고리*/
+		                   AND    (
+		                           G.GOODS_NUM LIKE CONCAT('%',UPPER(#{keyword}),'%')
+		                           OR
+		                           G.GOODS_CD LIKE CONCAT('%',UPPER(#{keyword}),'%')
+		                           OR
+		                           UPPER(G.GOODS_NM) LIKE CONCAT('%',UPPER(#{keyword}),'%')
+		                           OR
+		                           UPPER(B.BRAND_ENM) LIKE CONCAT('%',UPPER(#{keyword}),'%')
+		                           OR
+		                           UPPER(B.BRAND_KNM) LIKE CONCAT('%',UPPER(#{keyword}),'%')
+		                          )
+		                   AND    G.GOODS_STAT = 'G008_90' /*승인완료상품*/
+		                   AND    G.SELF_MALL_YN = 'Y' /*몰노출상품*/
+		                   AND    NOW() BETWEEN G.SELL_STDT AND G.SELL_EDDT /*유효한 판매기간*/
+		                  )
+		ORDER  BY FILTER_GB, DISP_ORD
+	</select>
+	
 	<!-- 상품 카테고리 필터 -->
 	<select id="getCategoryFilter" parameterType="Cate4srch" resultType="GoodsSearch">
 		/* TsfDisplay.getCategoryFilter */
@@ -923,4 +997,5 @@
 		        ) Z
 		LIMIT 2
 	</select>
+	
 </mapper>

+ 424 - 2
src/main/java/com/style24/persistence/mybatis/shop/TsfGoods.xml

@@ -1566,7 +1566,7 @@
 
 	<!-- 카테고리별 상품 총건수 -->
 	<select id="getCategoryGoodsCount" parameterType="SearchEngine" resultType="int">
-		/* TsfDisplay.getCategoryGoodsCount */
+		/* TsfGoods.getCategoryGoodsCount */
 		SELECT COUNT(*)
 		FROM   (
 		    SELECT CASE WHEN BG.DISP_NM_LANG = 'EN' THEN
@@ -1712,7 +1712,7 @@
 
 	<!-- 카테고리별 상품 목록 -->
 	<select id="getCategoryGoodsList" parameterType="SearchEngine" resultType="SearchEngine">
-		/* TsfDisplay.getCategoryGoodsList */
+		/* TsfGoods.getCategoryGoodsList */
 		WITH TAB_GOODS AS (
 		      SELECT G.BRAND_GROUP_NM     /*브랜드그룹명*/
 		           , G.GOODS_CD           /*상품코드*/
@@ -2026,4 +2026,426 @@
 		</if>
 	</select>
 	
+	<!-- 검색상품 총건수 -->
+	<select id="getSearchGoodsCount" parameterType="SearchEngine" resultType="int">
+		/* TsfGoods.getSearchGoodsCount */
+		SELECT COUNT(*)
+		FROM   (
+		        SELECT CASE WHEN BG.DISP_NM_LANG = 'EN' THEN
+		                        BG.BRAND_GROUP_ENM
+		                    ELSE
+		                        BG.BRAND_GROUP_KNM
+		               END                  AS BRAND_GROUP_NM /*브랜드그룹명*/
+		             , G.GOODS_CD                             /*상품코드*/
+		             , G.GOODS_NM                             /*상품명*/
+		             , G.GOODS_GB                             /*상품구분*/
+		             , G.SELF_GOODS_YN                        /*자사상품여부*/
+		             , G.FOREIGN_BUY_YN                       /*해외구매대행여부*/
+		             , G.PARALLEL_IMPORT_YN                   /*병행수입여부*/
+		             , G.ORDER_MADE_YN                        /*주문제작여부*/
+		             , G.GOODS_TNM                            /*상품타이틀명*/
+		             , G.MAIN_COLOR_CD                        /*대표색상코드*/
+		             , G.LIST_PRICE                           /*정상가(최초판매가)*/
+		             , CASE WHEN #{frontGb} = 'P' AND #{custGb} = 'G100_20' THEN GBP.STAFF_PC_CURR_PRICE
+		                    WHEN #{frontGb} = 'M' AND #{custGb} = 'G100_20' THEN GBP.STAFF_MO_CURR_PRICE
+		                    WHEN #{frontGb} = 'A' AND #{custGb} = 'G100_20' THEN GBP.STAFF_APP_CURR_PRICE
+		                    WHEN #{frontGb} = 'P' AND #{custGb} != 'G100_20' THEN GBP.PC_CURR_PRICE
+		                    WHEN #{frontGb} = 'M' AND #{custGb} != 'G100_20' THEN GBP.MO_CURR_PRICE
+		                    WHEN #{frontGb} = 'A' AND #{custGb} != 'G100_20' THEN GBP.APP_CURR_PRICE
+		                    ELSE G.CURR_PRICE
+		               END                  AS CURR_PRICE     /*현재판매가*/
+		             , G.MIN_ORD_AMT                          /*최소주문금액*/
+		             , G.FORMAL_GB                            /*정상이월구분*/
+		             , G.REG_DT                               /*등록일시*/
+		             , GS.SELL_WEEK_QTY                       /*주간판매수량*/
+		             , GS.REVIEW_REG_CNT                      /*리뷰등록건수*/
+		        FROM   TB_GOODS G
+		        INNER JOIN TB_GOODS_STOCK S ON G.GOODS_CD = S.GOODS_CD
+		        INNER JOIN TB_BRAND B ON G.BRAND_CD = B.BRAND_CD
+		        INNER JOIN TB_BRAND_GROUP BG ON B.BRAND_GROUP_NO = BG.BRAND_GROUP_NO
+		        INNER JOIN TB_GOODS_SUMMARY GS ON G.GOODS_CD = GS.GOODS_CD
+		        LEFT OUTER JOIN TB_GOODS_BENEFIT_PRICE GBP ON G.GOODS_CD = GBP.GOODS_CD
+		        WHERE  (
+		                G.GOODS_NUM LIKE CONCAT('%',UPPER(#{keyword}),'%')
+		                OR
+		                G.GOODS_CD LIKE CONCAT('%',UPPER(#{keyword}),'%')
+		                OR
+		                UPPER(G.GOODS_NM) LIKE CONCAT('%',UPPER(#{keyword}),'%')
+		                OR
+		                UPPER(B.BRAND_ENM) LIKE CONCAT('%',UPPER(#{keyword}),'%')
+		                OR
+		                UPPER(B.BRAND_KNM) LIKE CONCAT('%',UPPER(#{keyword}),'%')
+		               )
+		        AND    G.GOODS_STAT = 'G008_90' /*승인완료상품*/
+		        AND    G.SELF_MALL_YN = 'Y' /*몰노출상품*/
+		        AND    NOW() BETWEEN G.SELL_STDT AND G.SELL_EDDT /*유효한 판매기간*/
+		        <if test="ageArr != null and ageArr.length > 0"> <!-- 연령대 -->
+		        AND    G.AGE_GRP_CD IN
+		            <foreach collection="agesArr" item="item" index="index"  open="(" close=")" separator=",">
+		            #{item}
+		            </foreach>
+		        </if>
+		        <if test="seasonArr != null and seasonArr.length > 0"> <!-- 시즌 -->
+		        AND    G.SEASON_CD IN
+		            <foreach collection="seasonArr" item="item" index="index"  open="(" close=")" separator=",">
+		            #{item}
+		            </foreach>
+		        </if>
+		        AND    S.STOCK_QTY > 0 /*재고있는 상품*/
+		        AND    B.USE_YN = 'Y' /*사용하는 브랜드*/
+		        AND    BG.USE_YN = 'Y' /*사용하는 브랜드그룹*/
+		        <if test="brandGroupArr != null and brandGroupArr.length > 0">
+		        AND    BG.BRAND_GROUP_NO IN
+		            <foreach collection="brandGroupArr" item="item" index="index"  open="(" close=")" separator=",">
+		            #{item}
+		            </foreach>
+		        </if>
+		        <if test="unisex != null and unisex != ''">
+		        AND    G.SEX_GB = #{unisex}
+		        </if>
+		        <if test='sizeArr != null and sizeArr.length > 0'>
+		        AND    EXISTS (SELECT 1
+		                       FROM   TB_OPTION
+		                       WHERE  GOODS_CD = G.GOODS_CD
+		                       AND    OPT_CD2 IN
+		                       <foreach collection="sizeArr" item="item" index="index"  open="(" close=")" separator=",">
+		                       #{item}
+		                       </foreach>
+		                       AND    DISP_YN = 'Y'
+		                      )
+		        </if>
+		        <if test="colorArr != null and colorArr.length > 0">
+		        AND    EXISTS (SELECT 1
+		                       FROM   TB_OPTION O
+		                            , TB_COLOR C
+		                       WHERE  O.GOODS_CD = G.GOODS_CD
+		                       AND    O.OPT_CD1 = C.COLOR_CD
+		                       AND    O.DISP_YN = 'Y'
+		                       AND    C.COLOR_GRP_CD IN
+		                       <foreach collection="colorArr" item="item" index="index"  open="(" close=")" separator=",">
+		                       #{item}
+		                       </foreach>
+		                       AND    C.USE_YN = 'Y' /*사용하는색상*/
+		                       AND    G.SELF_GOODS_YN = 'Y' /*자사상품만*/
+		                      )
+		        </if>
+		        <if test="newGoods != null and newGoods != ''">
+		        AND    EXISTS (SELECT 1
+		                       FROM   TB_GOODS_BENEFIT
+		                       WHERE  GOODS_CD = G.GOODS_CD
+		                       AND    BENEFIT_GB = #{newGoods}
+		                      )
+		        </if>
+		       ) G
+		WHERE  1 = 1
+		<if test="priceFrom != null and priceFrom != ''">
+		AND    G.CURR_PRICE <![CDATA[>=]]> #{priceFrom}
+		</if>
+		<if test="priceTo != null and priceTo != ''">
+		AND    G.CURR_PRICE <![CDATA[<=]]> #{priceTo}
+		</if>
+		<if test="dcRateFrom != null and dcRateFrom != ''">
+		AND    ((IF(G.LIST_PRICE = 0,0,G.LIST_PRICE) - G.CURR_PRICE) / IF(G.LIST_PRICE = 0,0,G.LIST_PRICE) * 100) <![CDATA[>=]]> #{dcRateFrom}
+		</if>
+		<if test="dcRateTo != null and dcRateTo != ''">
+		AND    ((IF(G.LIST_PRICE = 0,0,G.LIST_PRICE) - G.CURR_PRICE) / IF(G.LIST_PRICE = 0,0,G.LIST_PRICE) * 100) <![CDATA[<=]]> #{dcRateTo}
+		</if>
+	</select>
+	
+	<!-- 검색 상품 목록 -->
+	<select id="getSearchGoodsList" parameterType="SearchEngine" resultType="SearchEngine">
+		/* TsfGoods.getSearchGoodsList */
+		WITH TAB_GOODS AS (
+		    SELECT G.BRAND_GROUP_NM     /*브랜드그룹명*/
+		         , G.GOODS_CD           /*상품코드*/
+		         , G.GOODS_NM           /*상품명*/
+		         , G.GOODS_GB           /*상품구분*/
+		         , G.SELF_GOODS_YN      /*자사상품여부*/
+		         , G.FOREIGN_BUY_YN     /*해외구매대행여부*/
+		         , G.PARALLEL_IMPORT_YN /*병행수입여부*/
+		         , G.ORDER_MADE_YN      /*주문제작여부*/
+		         , G.GOODS_TNM          /*상품타이틀명*/
+		         , G.MAIN_COLOR_CD      /*대표색상코드*/
+		         , G.LIST_PRICE         /*정상가(최초판매가)*/
+		         , G.CURR_PRICE         /*현재판매가*/
+		         , G.FORMAL_GB          /*정상이월구분*/
+		         , G.REG_DT             /*등록일시*/
+		         , G.SELL_WEEK_QTY      /*주간판매수량*/
+		         , G.REVIEW_REG_CNT     /*리뷰등록건수*/
+		    FROM   (
+		            SELECT CASE WHEN BG.DISP_NM_LANG = 'EN' THEN
+		                            BG.BRAND_GROUP_ENM
+		                        ELSE
+		                            BG.BRAND_GROUP_KNM
+		                   END                   AS BRAND_GROUP_NM /*브랜드그룹명*/
+		                 , G.GOODS_CD                              /*상품코드*/
+		                 , G.GOODS_NM                              /*상품명*/
+		                 , G.GOODS_GB                              /*상품구분*/
+		                 , G.SELF_GOODS_YN                         /*자사상품여부*/
+		                 , G.FOREIGN_BUY_YN                        /*해외구매대행여부*/
+		                 , G.PARALLEL_IMPORT_YN                    /*병행수입여부*/
+		                 , G.ORDER_MADE_YN                         /*주문제작여부*/
+		                 , G.GOODS_TNM                             /*상품타이틀명*/
+		                 , G.MAIN_COLOR_CD                         /*대표색상코드*/
+		                 , G.LIST_PRICE                            /*정상가(최초판매가)*/
+		                 , CASE WHEN #{frontGb} = 'P' AND #{custGb} = 'G100_20' THEN GBP.STAFF_PC_CURR_PRICE
+		                        WHEN #{frontGb} = 'M' AND #{custGb} = 'G100_20' THEN GBP.STAFF_MO_CURR_PRICE
+		                        WHEN #{frontGb} = 'A' AND #{custGb} = 'G100_20' THEN GBP.STAFF_APP_CURR_PRICE
+		                        WHEN #{frontGb} = 'P' AND #{custGb} != 'G100_20' THEN GBP.PC_CURR_PRICE
+		                        WHEN #{frontGb} = 'M' AND #{custGb} != 'G100_20' THEN GBP.MO_CURR_PRICE
+		                        WHEN #{frontGb} = 'A' AND #{custGb} != 'G100_20' THEN GBP.APP_CURR_PRICE
+		                        ELSE G.CURR_PRICE
+		                  END                   AS CURR_PRICE     /*현재판매가*/
+		                 , G.MIN_ORD_AMT                           /*최소주문금액*/
+		                 , G.FORMAL_GB                             /*정상이월구분*/
+		                 , G.REG_DT                                /*등록일시*/
+		                 , GS.SELL_WEEK_QTY                        /*주간판매수량*/
+		                 , GS.REVIEW_REG_CNT                       /*리뷰등록건수*/
+		            FROM   TB_GOODS G
+		            INNER JOIN TB_GOODS_STOCK S ON G.GOODS_CD = S.GOODS_CD
+		            INNER JOIN TB_BRAND B ON G.BRAND_CD = B.BRAND_CD
+		            INNER JOIN TB_BRAND_GROUP BG ON B.BRAND_GROUP_NO = BG.BRAND_GROUP_NO
+		            INNER JOIN TB_GOODS_SUMMARY GS ON G.GOODS_CD = GS.GOODS_CD
+		            LEFT OUTER JOIN TB_GOODS_BENEFIT_PRICE GBP ON G.GOODS_CD = GBP.GOODS_CD
+		            WHERE  (
+		                    G.GOODS_NUM LIKE CONCAT('%',UPPER(#{keyword}),'%')
+		                    OR
+		                    G.GOODS_CD LIKE CONCAT('%',UPPER(#{keyword}),'%')
+		                    OR
+		                    UPPER(G.GOODS_NM) LIKE CONCAT('%',UPPER(#{keyword}),'%')
+		                    OR
+		                    UPPER(B.BRAND_ENM) LIKE CONCAT('%',UPPER(#{keyword}),'%')
+		                    OR
+		                    UPPER(B.BRAND_KNM) LIKE CONCAT('%',UPPER(#{keyword}),'%')
+		                   )
+		            AND    G.GOODS_STAT = 'G008_90' /*승인완료상품*/
+		            AND    G.SELF_MALL_YN = 'Y' /*몰노출상품*/
+		            AND    NOW() BETWEEN G.SELL_STDT AND G.SELL_EDDT /*유효한 판매기간*/
+		            <if test="ageArr != null and ageArr.length > 0"> <!-- 연령대 -->
+		            AND    G.AGE_GRP_CD IN
+		                <foreach collection="agesArr" item="item" index="index"  open="(" close=")" separator=",">
+		                #{item}
+		                </foreach>
+		            </if>
+		            <if test="seasonArr != null and seasonArr.length > 0"> <!-- 시즌 -->
+		            AND    G.SEASON_CD IN
+		                <foreach collection="seasonArr" item="item" index="index"  open="(" close=")" separator=",">
+		                #{item}
+		                </foreach>
+		            </if>
+		            AND    S.STOCK_QTY > 0 /*재고있는 상품*/
+		            AND    B.USE_YN = 'Y' /*사용하는 브랜드*/
+		            AND    BG.USE_YN = 'Y' /*사용하는 브랜드그룹*/
+		            <if test="brandGroupArr != null and brandGroupArr.length > 0">
+		            AND    BG.BRAND_GROUP_NO IN
+		                <foreach collection="brandGroupArr" item="item" index="index"  open="(" close=")" separator=",">
+		                #{item}
+		                </foreach>
+		            </if>
+		            <if test="unisex != null and unisex != ''">
+		            AND    G.SEX_GB = #{unisex}
+		            </if>
+		            <if test='sizeArr != null and sizeArr.length > 0'>
+		            AND    EXISTS (SELECT 1
+		                           FROM   TB_OPTION
+		                           WHERE  GOODS_CD = G.GOODS_CD
+		                           AND    OPT_CD2 IN
+		                           <foreach collection="sizeArr" item="item" index="index"  open="(" close=")" separator=",">
+		                           #{item}
+		                           </foreach>
+		                           AND    DISP_YN = 'Y'
+		                        )
+		            </if>
+		            <if test="newGoods != null and newGoods != ''">
+		            AND    EXISTS (SELECT 1
+		                           FROM   TB_GOODS_BENEFIT
+		                           WHERE  GOODS_CD = G.GOODS_CD
+		                           AND    BENEFIT_GB = #{newGoods}
+		                         )
+		            </if>
+		           ) G
+		    WHERE  1 = 1
+		    <if test="priceFrom != null and priceFrom != ''">
+		    AND    G.CURR_PRICE <![CDATA[>=]]> #{priceFrom}
+		    </if>
+		    <if test="priceTo != null and priceTo != ''">
+		    AND    G.CURR_PRICE <![CDATA[<=]]> #{priceTo}
+		    </if>
+		    <if test="dcRateFrom != null and dcRateFrom != ''">
+		    AND    ((IF(G.LIST_PRICE = 0,0,G.LIST_PRICE) - G.CURR_PRICE) / IF(G.LIST_PRICE = 0,0,G.LIST_PRICE) * 100) <![CDATA[>=]]> #{dcRateFrom}
+		    </if>
+		    <if test="dcRateTo != null and dcRateTo != ''">
+		    AND    ((IF(G.LIST_PRICE = 0,0,G.LIST_PRICE) - G.CURR_PRICE) / IF(G.LIST_PRICE = 0,0,G.LIST_PRICE) * 100) <![CDATA[<=]]> #{dcRateTo}
+		    </if>
+		)
+		, TAB_OPTION AS (
+		    /* 자사상품 색상 목록 */
+		    SELECT O.GOODS_CD
+		         , O.OPT_CD1  AS MAIN_COLOR_CD
+		    FROM   TAB_GOODS G
+		         , TB_OPTION O
+		    WHERE  G.GOODS_CD = O.GOODS_CD
+		    AND    G.SELF_GOODS_YN = 'Y' /*자사상품만*/
+		    <if test="colorArr != null and colorArr.length > 0"> <!-- 색상 -->
+		    AND    O.OPT_CD1 IN (SELECT COLOR_CD
+		                         FROM   TB_COLOR
+		                         WHERE  1 = 1
+		                         AND    COLOR_GRP_CD IN
+		                         <foreach collection="colorArr" item="item" index="index"  open="(" close=")" separator=",">
+		                         #{item}
+		                         </foreach>
+		                         AND    USE_YN = 'Y' /*사용하는색상*/
+		                        )
+		    </if>
+		    AND    O.DISP_YN = 'Y'
+		    GROUP  BY O.GOODS_CD, O.OPT_CD1
+		)
+		, TAB_ALL_GOODS AS (
+		    SELECT BRAND_GROUP_NM     /*브랜드그룹명*/
+		         , GOODS_CD           /*상품코드*/
+		         , GOODS_NM           /*상품명*/
+		         , GOODS_GB           /*상품구분*/
+		         , SELF_GOODS_YN      /*자사상품여부*/
+		         , FOREIGN_BUY_YN     /*해외구매대행여부*/
+		         , PARALLEL_IMPORT_YN /*병행수입여부*/
+		         , ORDER_MADE_YN      /*주문제작여부*/
+		         , GOODS_TNM          /*상품타이틀명*/
+		         , MAIN_COLOR_CD      /*대표색상코드*/
+		         , LIST_PRICE         /*정상가(최초판매가)*/
+		         , CURR_PRICE         /*현재판매가*/
+		         , FORMAL_GB          /*정상이월구분*/
+		         , REG_DT             /*등록일시*/
+		         , SELL_WEEK_QTY      /*주간판매수량*/
+		         , REVIEW_REG_CNT     /*리뷰등록건수*/
+		         , NUMB
+		    FROM   (
+		            SELECT G.BRAND_GROUP_NM                                         /*브랜드그룹명*/
+		                 , G.GOODS_CD                                               /*상품코드*/
+		                 , G.GOODS_NM                                               /*상품명*/
+		                 , G.GOODS_GB                                               /*상품구분*/
+		                 , G.SELF_GOODS_YN                                          /*자사상품여부*/
+		                 , G.FOREIGN_BUY_YN                                         /*해외구매대행여부*/
+		                 , G.PARALLEL_IMPORT_YN                                     /*병행수입여부*/
+		                 , G.ORDER_MADE_YN                                          /*주문제작여부*/
+		                 , G.GOODS_TNM                                              /*상품타이틀명*/
+		                 , IFNULL(O.MAIN_COLOR_CD,G.MAIN_COLOR_CD) AS MAIN_COLOR_CD /*대표색상코드*/
+		                 , G.LIST_PRICE                                             /*정상가(최초판매가)*/
+		                 , G.CURR_PRICE                                             /*현재판매가*/
+		                 , G.FORMAL_GB                                              /*정상이월구분*/
+		                 , G.REG_DT                                                 /*등록일시*/
+		                 , G.SELL_WEEK_QTY                                          /*주간판매수량*/
+		                 , G.REVIEW_REG_CNT                                         /*리뷰등록건수*/
+		                 <choose>
+		                     <when test="sortingType == 'BEST'"> <!-- 인기상품순 -->
+		                 , ROW_NUMBER() OVER(ORDER BY G.SELL_WEEK_QTY DESC, G.GOODS_CD) AS NUMB
+		                     </when>
+		                     <when test="sortingType == 'REVIEW'"> <!-- 리뷰많은순 -->
+		                 , ROW_NUMBER() OVER(ORDER BY G.REVIEW_REG_CNT DESC, G.GOODS_CD) AS NUMB
+		                     </when>
+		                     <otherwise> <!-- 최신상품순 -->
+		                 , ROW_NUMBER() OVER(ORDER BY G.REG_DT DESC, G.GOODS_CD) AS NUMB
+		                     </otherwise>
+		                 </choose>
+		            FROM   TAB_GOODS G
+		            INNER JOIN TAB_OPTION O ON G.GOODS_CD = O.GOODS_CD
+		           ) ORIGINAL
+		    WHERE  1 = 1
+		    <if test="pageable != null and pageable.endRow != null and pageable.endRow > 0">
+		    AND    NUMB BETWEEN #{pageable.startRow} AND #{pageable.endRow}
+		    </if>
+		)
+		, TAB_GOODS_IMG AS (
+		    /* 상품의 이미지 */
+		    SELECT GOODS_CD
+		         , MAX(SYS_IMG_NM)  AS SYS_IMG_NM
+		         , MAX(SYS_IMG_NM2) AS SYS_IMG_NM2
+		    FROM   (
+		            SELECT G.GOODS_CD
+		                 , CASE WHEN GI.DEFAULT_IMG_YN = 'Y' THEN GI.SYS_IMG_NM ELSE NULL END   AS SYS_IMG_NM
+		                 , CASE WHEN GI.MOUSEOVER_IMG_YN = 'Y' THEN GI.SYS_IMG_NM ELSE NULL END AS SYS_IMG_NM2
+		            FROM   TAB_ALL_GOODS G
+		                 , TB_GOODS_IMG GI
+		            WHERE  G.GOODS_CD = GI.GOODS_CD
+		            AND    G.MAIN_COLOR_CD = GI.COLOR_CD
+		           ) Z
+		    GROUP  BY GOODS_CD
+		)
+		SELECT G.BRAND_GROUP_NM
+		     , G.GOODS_CD
+		     , FN_GET_GOODS_NM(G.GOODS_NM,G.GOODS_GB,G.FOREIGN_BUY_YN,G.PARALLEL_IMPORT_YN,G.ORDER_MADE_YN) AS GOODS_FULL_NM /*상품FULL명*/
+		     , G.GOODS_TNM
+		     , G.MAIN_COLOR_CD
+		     , G.LIST_PRICE
+		     , G.CURR_PRICE
+		     , GI.SYS_IMG_NM
+		     , GI.SYS_IMG_NM2
+		     , (
+		        SELECT GROUP_CONCAT(CONCAT(VIDEO_GB,':',KMC_KEY) ORDER BY NUMB SEPARATOR ',')
+		        FROM   (
+		                SELECT GV.VIDEO_GB
+		                     , GV.KMC_KEY
+		                     , GV.REG_DT
+		                     , RANK() OVER(ORDER BY GV.REG_DT, GV.KMC_KEY) AS NUMB
+		                FROM   TB_GOODS_VIDEO GV
+		                WHERE  GV.GOODS_CD = G.GOODS_CD
+		                AND    GV.DISP_YN = 'Y'
+		                AND    GV.KMC_KEY IS NOT NULL
+		               ) Z
+		        WHERE  NUMB <![CDATA[<=]]> 2
+		       ) AS VIDEOS
+		     , (
+		        SELECT GROUP_CONCAT(DISTINCT CONCAT(C.COLOR_CD,':',CC.CD_DESC) ORDER BY CC.DISP_ORD SEPARATOR ',') AS COLOR_CHIPS
+		        FROM   TB_OPTION O
+		             , TB_COLOR C
+		             , TB_COMMON_CODE CC
+		        WHERE  O.OPT_CD1 = C.COLOR_CD
+		        AND    C.COLOR_GRP_CD = CC.CD
+		        AND    O.GOODS_CD = G.GOODS_CD
+		        AND    O.DISP_YN = 'Y'
+		        AND    C.USE_YN = 'Y'
+		        AND    CC.USE_YN = 'Y'
+		       ) AS COLOR_CHIPS /*컬러칩*/
+		     , (
+		        SELECT GROUP_CONCAT(DISTINCT CONCAT(OPT_CD2 ,':' ,CASE WHEN SOLDOUT_YN = 'Y' THEN 'Y'
+		                                                               ELSE CASE WHEN CURR_STOCK_QTY - BASE_STOCK_QTY > 0 THEN 'N' ELSE 'Y' END
+		                                                          END) ORDER BY DISP_ORD SEPARATOR ',') AS SIZES
+		        FROM   VW_STOCK
+		        WHERE  GOODS_CD = G.GOODS_CD
+		        AND    OPT_CD1 = G.MAIN_COLOR_CD
+		        AND    DISP_YN = 'Y'
+		       ) AS SIZES /*사이즈*/
+		     , (
+		        SELECT GROUP_CONCAT(CONCAT(BENEFIT_GB,':',BENEFIT_NM) ORDER BY NUMB SEPARATOR ',')
+		        FROM   (
+		                SELECT GB.BENEFIT_GB
+		                     , CASE WHEN GB.BENEFIT_GB = '10' THEN '쿠폰할인'
+		                            WHEN GB.BENEFIT_GB = '20' THEN '무료배송'
+		                            WHEN GB.BENEFIT_GB = '30' THEN '사은품'
+		                            WHEN GB.BENEFIT_GB = '40' THEN '신상'
+		                            ELSE '총알배송'
+		                       END                                              AS BENEFIT_NM
+		                     , RANK() OVER(ORDER BY GB.BENEFIT_GB, GB.GOODS_CD) AS NUMB
+		                FROM   TB_GOODS_BENEFIT GB
+		                WHERE  GB.GOODS_CD = G.GOODS_CD
+		               ) Z
+		       ) AS BENEFITS
+		     , G.FORMAL_GB
+		     , G.REG_DT
+		     , G.NUMB
+		     <choose>
+		         <when test="custNo != null and custNo > 0"> <!-- 로그인 했으면 -->
+		     , IF(W.GOODS_CD IS NULL,'','likeit')                                                           AS LIKE_IT       /*위시리스트담긴상품*/
+		         </when>
+		         <otherwise>
+		     , ''                                                                                           AS LIKE_IT       /*위시리스트담긴상품*/
+		         </otherwise>
+		     </choose>
+		FROM   TAB_ALL_GOODS G
+		LEFT OUTER JOIN TAB_GOODS_IMG GI ON G.GOODS_CD = GI.GOODS_CD
+		<if test="custNo != null and custNo > 0"> <!-- 로그인 했으면 -->
+		LEFT OUTER JOIN TB_WISHLIST W ON G.GOODS_CD = W.GOODS_CD
+		                             AND W.CUST_NO = #{custNo}
+		</if>
+	</select>
+	
 </mapper>