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

Merge remote-tracking branch 'origin/develop' into order

card007 5 роки тому
батько
коміт
7618433877

+ 10 - 0
src/main/java/com/style24/front/biz/dao/TsfGoodsDao.java

@@ -237,6 +237,16 @@ public interface TsfGoodsDao {
 	 * @date 2021. 3. 8
 	 */
 	Collection<Goods> getTmtbGoodsList(Goods goods);
+	
+	/**
+	 * 상품 추천상품 목록
+	 *
+	 * @param goods
+	 * @return
+	 * @author eskim
+	 * @date 2021. 3. 8
+	 */
+	Collection<Goods> getRecommendGoodsList(Goods goods);
 
 	/**
 	 * 재입고 알림 미 알림 조회

+ 12 - 0
src/main/java/com/style24/front/biz/service/TsfGoodsService.java

@@ -547,6 +547,18 @@ public class TsfGoodsService {
 	public Collection<Goods> getTmtbGoodsList(Goods goods) {
 		return goodsDao.getTmtbGoodsList(goods);
 	}
+	
+	/**
+	 * 상품 추천상품 목록
+	 * @param goods
+	 * @return
+	 * @author eskim
+	 * @date 2021. 3. 8
+	 */
+	public Collection<Goods> getRecommendGoodsList(Goods goods) {
+		return goodsDao.getRecommendGoodsList(goods);
+	}
+	
 
 	/**
 	 * 재입고 알림 미 알림 조회

+ 113 - 4
src/main/java/com/style24/front/biz/web/TsfGoodsController.java

@@ -896,7 +896,42 @@ public class TsfGoodsController extends TsfBaseController {
 		// 상품관련 기본값 설정(회원 등급, 앱, PC/모바일 등)
 		setGoods(goods);
 		goods.setMaxRownum(15);
-		mav.addObject("goodsList", goodsService.getTmtbGoodsList(goods));
+		String [] arrGoodsCd= {"10813855",
+			"L171TJ561P",
+			"B172SH710P",
+			"B192DO995P",
+			"L191TJ571P",
+			"L191WB304P",
+			"B192DO996P",
+			"L191WB305P",
+			"B192SH720P",
+			"L191WB703P",
+			"10813858",
+			"10813859",
+			"L171JP121P",
+			"10813860",
+			"L171JP721P",
+			"10813862",
+			"L171TJ501P",
+			"10814432",
+			"B192SH730P"};
+		
+		StringBuilder sql = new StringBuilder();
+		if (arrGoodsCd.length > 0) {
+			int idx = 1;
+			for (String goodsCd : arrGoodsCd) {
+				if (!StringUtils.isBlank(goodsCd)) {
+					if (idx > 1) {
+						sql.append("UNION ALL ");
+					}
+					sql.append("SELECT '").append(goodsCd).append("' AS GOODS_CD, ").append(idx++).append(" AS DISP_ORD FROM DUAL\r\n");
+				}
+			}
+			goods.setGoodsSql(sql.toString());
+		}	
+		
+		goods.setArrGoodsCd(arrGoodsCd);
+		mav.addObject("goodsList", goodsService.getRecommendGoodsList(goods));
 		//log.info("goodsTogetherForm = goods{}", goods);
 		mav.addObject("params", goods);
 
@@ -918,7 +953,44 @@ public class TsfGoodsController extends TsfBaseController {
 		// 상품관련 기본값 설정(회원 등급, 앱, PC/모바일 등)
 		setGoods(goods);
 		goods.setMaxRownum(15);
-		mav.addObject("goodsList", goodsService.getTmtbGoodsList(goods));
+		
+		String [] arrGoodsCd= {"10813855",
+			"L171TJ561P",
+			"B172SH710P",
+			"B192DO995P",
+			"L191TJ571P",
+			"L191WB304P",
+			"B192DO996P",
+			"L191WB305P",
+			"B192SH720P",
+			"L191WB703P",
+			"10813858",
+			"10813859",
+			"L171JP121P",
+			"10813860",
+			"L171JP721P",
+			"10813862",
+			"L171TJ501P",
+			"10814432",
+			"B192SH730P"};
+		
+		StringBuilder sql = new StringBuilder();
+		if (arrGoodsCd.length > 0) {
+			int idx = 1;
+			for (String goodsCd : arrGoodsCd) {
+				if (!StringUtils.isBlank(goodsCd)) {
+					if (idx > 1) {
+						sql.append("UNION ALL ");
+					}
+					sql.append("SELECT '").append(goodsCd).append("' AS GOODS_CD, ").append(idx++).append(" AS DISP_ORD FROM DUAL\r\n");
+				}
+			}
+			goods.setGoodsSql(sql.toString());
+		}	
+		
+		goods.setArrGoodsCd(arrGoodsCd);
+		
+		mav.addObject("goodsList", goodsService.getRecommendGoodsList(goods));
 		//log.info("goodsRecommendForm = goods{}", goods);
 		mav.addObject("params", goods);
 
@@ -940,7 +1012,44 @@ public class TsfGoodsController extends TsfBaseController {
 		// 상품관련 기본값 설정(회원 등급, 앱, PC/모바일 등)
 		setGoods(goods);
 		goods.setMaxRownum(15);
-		mav.addObject("goodsList", goodsService.getTmtbGoodsList(goods));
+		
+		String [] arrGoodsCd= {"10813855",
+			"L171TJ561P",
+			"B172SH710P",
+			"B192DO995P",
+			"L191TJ571P",
+			"L191WB304P",
+			"B192DO996P",
+			"L191WB305P",
+			"B192SH720P",
+			"L191WB703P",
+			"10813858",
+			"10813859",
+			"L171JP121P",
+			"10813860",
+			"L171JP721P",
+			"10813862",
+			"L171TJ501P",
+			"10814432",
+			"B192SH730P"};
+		
+		StringBuilder sql = new StringBuilder();
+		if (arrGoodsCd.length > 0) {
+			int idx = 1;
+			for (String goodsCd : arrGoodsCd) {
+				if (!StringUtils.isBlank(goodsCd)) {
+					if (idx > 1) {
+						sql.append("UNION ALL ");
+					}
+					sql.append("SELECT '").append(goodsCd).append("' AS GOODS_CD, ").append(idx++).append(" AS DISP_ORD FROM DUAL\r\n");
+				}
+			}
+			goods.setGoodsSql(sql.toString());
+		}	
+		
+		goods.setArrGoodsCd(arrGoodsCd);
+		
+		mav.addObject("goodsList", goodsService.getRecommendGoodsList(goods));
 		//log.info("goodsLikeForm = goods{}", goods);
 		mav.addObject("params", goods);
 
@@ -1057,7 +1166,7 @@ public class TsfGoodsController extends TsfBaseController {
 						sql.append("SELECT '").append(goodsCd).append("' AS GOODS_CD, ").append(idx++).append(" AS DISP_ORD FROM DUAL\r\n");
 					}
 				}
-				goods.setTodayGoodsSql(sql.toString());
+				goods.setGoodsSql(sql.toString());
 				recentlyGoodsList = goodsService.getRecentlyGoodsList(goods);
 			}
 		}

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

@@ -193,7 +193,7 @@ public class Goods extends TscBaseDomain {
 	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
 	private String[] arrGoodsCd;			// 상품코드
 
-	private String todayGoodsSql;	// 오늘본상품SQL
+	private String goodsSql;	// 오늘본상품SQL
 
 	private String likeIt;			// 위시리스트에담긴상품
 

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

@@ -65,6 +65,7 @@ public class Review extends TscBaseDomain {
 	private String photoYn;			// 포토상품평유무
 	private String goodsType;		// 상품유형
 	private String selfGoodsYn;		// 자사상품여부
+	private int iscore;				// 구매평점(상품상세용)
 	private int rownum;
 	
 	private String reviewScore;		// 상품평 검색조건 평점

+ 10 - 7
src/main/java/com/style24/persistence/domain/ReviewAttach.java

@@ -14,11 +14,14 @@ import lombok.Data;
 @Data
 public class ReviewAttach extends TscBaseDomain {
 
-	private Integer rvAtcSq; 	//상품평첨부파일일련번호
-	private Integer reviewSq; 	//상품평일련번호
-	private String fileGb;		//첨부파일종류(M:동영상,I:이미지)
-	private String orgFileNm;	//원본파일명
-	private String sysFileNm;	//시스템파일명
-	private String delYn;		//삭제여부
-	
+	// 상품평 첨부파일
+	private Integer rvAtcSq;	// 상품평첨부파일일련번호
+	private Integer reviewSq;	// 상품평일련번호
+	private String fileGb;		// 첨부파일종류(M:동영상,I:이미지)
+	private String orgFileNm;	// 원본파일명
+	private String sysFileNm;	// 시스템파일명
+	private String kufKey;		// Kollus업로드파일키
+	private String kmcKey;		// Kollus미디어컨텐츠키
+	private String delYn;		// 삭제여부
+
 }

+ 184 - 108
src/main/java/com/style24/persistence/mybatis/shop/TsfGoods.xml

@@ -267,7 +267,7 @@
 		      FROM TB_GOODS G
 		      INNER JOIN TB_OPTION O ON G.GOODS_CD = O.GOODS_CD
 		                             AND O.DISP_YN = 'Y'
-		       INNER JOIN VW_STOCK VS ON O.GOODS_CD = VS.GOODS_CD
+		      INNER JOIN VW_STOCK VS ON O.GOODS_CD = VS.GOODS_CD
 		                          AND O.OPT_CD = VS.OPT_CD
 		      WHERE G.GOODS_CD =  #{goodsCd}
 		      AND G.GOODS_TYPE = 'G056_N' -- 일반상품
@@ -401,6 +401,7 @@
 		FROM TB_GOODS_VIDEO A
 		WHERE A.GOODS_CD = #{goodsCd} 
 		AND A.DISP_YN = 'Y'
+		AND A.KMC_KEY IS NOT NULL
 		ORDER BY A.VIDEO_SQ DESC
 		<if test="maxRownum != null and maxRownum > 0">
 		LIMIT #{maxRownum}
@@ -671,97 +672,178 @@
 	<!-- 상품 다다익선 목록 -->
 	<select id="getTmtbGoodsList" parameterType="Goods" resultType="Goods">
 		/* TsfGoods.getTmtbGoodsList */
+		WITH  TAB_MASTER_GOODS AS (
+		SELECT  Z.*
+		FROM (
+		    SELECT @rownum := @rownum + 1 AS RNUM
+		         , B.GOODS_CD
+		         , G.GOODS_NM
+		         , G.GOODS_GB
+		         , G.FOREIGN_BUY_YN
+		         , G.PARALLEL_IMPORT_YN
+		         , G.ORDER_MADE_YN
+		         , G.GOODS_STAT
+		         , G.GOODS_TYPE
+		         , G.MAIN_COLOR_CD
+		         , G.MIN_ORD_QTY
+		         , (CASE WHEN E.DISP_NM_LANG = 'EN' THEN E.BRAND_GROUP_ENM ELSE E.BRAND_GROUP_KNM END) AS BRAND_GROUP_NM
+		         , G.LIST_PRICE
+		         , G.CURR_PRICE
+		         , GS.STOCK_QTY
+		    FROM TB_TMTB A
+		    JOIN ( SELECT @rownum := 0) R
+		    INNER JOIN TB_TMTB_APPLY_GOODS B ON A.TMTB_SQ  = B.TMTB_SQ
+		                                     AND B.DEL_YN = 'N'
+		                                     AND B.GOODS_GB IN ( 'G800_10', 'G800_20')  -- 기본과 적용상품
+		    LEFT OUTER JOIN TB_TMTB_APPLY_GOODS BB ON B.TMTB_SQ  = BB.TMTB_SQ
+		                                     AND BB.DEL_YN = 'N'
+		                                     AND B.GOODS_CD = BB.GOODS_CD
+		                                     AND BB.GOODS_GB = 'G800_30'  -- 제외상품
+		                                     AND BB.GOODS_CD IS NULL
+		    INNER JOIN TB_GOODS G ON B.GOODS_CD = G.GOODS_CD
+		                          AND G.GOODS_STAT = 'G008_90'
+		                          AND G.SELF_MALL_YN = 'Y'
+		                          AND NOW() BETWEEN G.SELL_STDT AND G.SELL_EDDT
+		                          <![CDATA[
+		                          AND B.GOODS_CD <> #{goodsCd}  -- 자기상품은 제외
+		                          ]]>
+		    INNER JOIN TB_BRAND D ON G.BRAND_CD = D.BRAND_CD
+		                  AND D.USE_YN = 'Y'
+		    INNER JOIN TB_SITE_BRAND SB ON D.BRAND_CD  = SB.BRAND_CD
+		                          AND SB.USE_YN = 'Y'
+		                          AND SB.SITE_CD = #{siteCd}
+		    INNER JOIN TB_BRAND_GROUP E ON D.BRAND_GROUP_NO = E.BRAND_GROUP_NO
+		                          AND E.USE_YN = 'Y'
+		    INNER JOIN TB_GOODS_STOCK GS ON G.GOODS_CD = GS.GOODS_CD
+		                                 AND GS.STOCK_QTY > 0
+		    WHERE NOW() BETWEEN A.TMTB_ST_DT AND A.TMTB_ED_DT
+		    AND A.TMTB_STAT ='G232_11'
+		     <![CDATA[
+		    AND A.TMTB_SQ IN (SELECT TMTB_SQ FROM TB_TMTB_APPLY_GOODS WHERE GOODS_CD = #{goodsCd} AND DEL_YN = 'N' AND GOODS_GB IN ( 'G800_10', 'G800_20')) -- 기본과 적용상품
+		    AND A.TMTB_SQ NOT IN (SELECT TMTB_SQ FROM TB_TMTB_APPLY_GOODS WHERE GOODS_CD = #{goodsCd} AND DEL_YN = 'N' AND GOODS_GB = 'G800_30') -- 제외상품
+		     ]]>
+		    ORDER BY A.TMTB_SQ DESC
+		    ) Z
+		WHERE RNUM <![CDATA[<= ]]>#{maxRownum}
+		)
+		, TAB_GOODS AS (
+		    SELECT G.GOODS_CD
+		         , G.GOODS_NM
+		         , FN_GET_GOODS_NM(GOODS_NM,GOODS_GB,FOREIGN_BUY_YN,PARALLEL_IMPORT_YN,ORDER_MADE_YN) AS GOODS_FULL_NM /*상품FULL명*/
+		         -- , G.GOODS_GB
+		         -- , G.FOREIGN_BUY_YN
+		         -- , G.PARALLEL_IMPORT_YN
+		         -- , G.ORDER_MADE_YN
+		         , G.GOODS_STAT
+		         , G.GOODS_TYPE
+		         , G.MAIN_COLOR_CD
+		         , G.MIN_ORD_QTY
+		         , G.BRAND_GROUP_NM
+		         , G.LIST_PRICE
+		         , G.STOCK_QTY
+		         , FN_GET_BENEFIT_PRICE(#{frontGb},G.GOODS_CD, G.CURR_PRICE,#{custGb}) AS CURR_PRICE
+		         , (SELECT MAX(SYS_IMG_NM) FROM TB_GOODS_IMG WHERE GOODS_CD = G.GOODS_CD AND COLOR_CD = IFNULL(G.MAIN_COLOR_CD,'XX') AND DEFAULT_IMG_YN = 'Y') AS SYS_IMG_NM
+		         , (SELECT MAX(SYS_IMG_NM) FROM TB_GOODS_IMG WHERE GOODS_CD = G.GOODS_CD AND COLOR_CD = IFNULL(G.MAIN_COLOR_CD,'XX') AND MOUSEOVER_IMG_YN = 'Y') AS SYS_IMG_NM2
+		         , (CASE WHEN G.GOODS_CD IS NULL THEN 'N' ELSE 'Y' END) AS WISH_YN
+		    FROM TAB_MASTER_GOODS G
+		    LEFT OUTER JOIN TB_WISHLIST W ON G.GOODS_CD = W.GOODS_CD
+		                                  AND IFNULL(#{custNo}, 0) = W.CUST_NO
+		)
 		SELECT Z.*
 		     , 100 - ROUND((CURR_PRICE / LIST_PRICE) * 100 ,0) AS DC_RATE
-		     , FN_GET_GOODS_NM(GOODS_NM,GOODS_GB,FOREIGN_BUY_YN,PARALLEL_IMPORT_YN,ORDER_MADE_YN) AS GOODS_FULL_NM /*상품FULL명*/
-		     , (SELECT MAX(SYS_IMG_NM) FROM TB_GOODS_IMG WHERE GOODS_CD = Z.GOODS_CD AND COLOR_CD = IFNULL(Z.MAIN_COLOR_CD,'XX') AND DEFAULT_IMG_YN = 'Y') AS SYS_IMG_NM
-		     , (SELECT MAX(SYS_IMG_NM) FROM TB_GOODS_IMG WHERE GOODS_CD = Z.GOODS_CD AND COLOR_CD = IFNULL(Z.MAIN_COLOR_CD,'XX') AND MOUSEOVER_IMG_YN = 'Y') AS SYS_IMG_NM2
-		     , V.VIDEO_GB_M
-		     , V.VIDEO_VAL_M
-		     , V.VIDEO_GB_S
-		     , V.VIDEO_VAL_S
-		     , (CASE WHEN W.GOODS_CD IS NULL THEN 'N' ELSE 'Y' END) AS WISH_YN
+		--     , V.VIDEO_GB_M
+		--     , V.VIDEO_VAL_M
+		--     , V.VIDEO_GB_S
+		--     , V.VIDEO_VAL_S
+		FROM TAB_GOODS Z
+		-- LEFT OUTER JOIN (SELECT MAX(GOODS_CD) AS GOODS_CD
+		--                       , MAX(CASE WHEN  RNUM = 1 THEN  VIDEO_GB END) AS  VIDEO_GB_M
+		--                       , MAX(CASE WHEN  RNUM = 1 THEN  KMC_KEY END) AS  VIDEO_VAL_M
+		--                       , MAX(CASE WHEN  RNUM = 2 THEN  VIDEO_GB END) AS  VIDEO_GB_S
+		--                       , MAX(CASE WHEN  RNUM = 2 THEN  KMC_KEY END) AS  VIDEO_VAL_S
+		--                 FROM (
+		--                       SELECT A.GOODS_CD
+		--                            , A.VIDEO_GB
+		--                            , A.KMC_KEY
+		--                            , A.REG_DT
+		--                            , RANK() OVER(PARTITION BY A.GOODS_CD ORDER BY A.REG_DT, A.KMC_KEY ) RNUM
+		--                       FROM TAB_GOODS G
+		--                       INNER JOIN TB_GOODS_VIDEO A ON G.GOODS_CD = A.GOODS_CD
+		--                       WHERE A.DISP_YN = 'Y'
+		--                       AND A.KMC_KEY IS NOT NULL
+		--                      ) V
+		--                 ) V ON Z.GOODS_CD = V.GOODS_CD
+	</select>
+	
+	<!--  추천상품 목록 -->
+	<select id="getRecommendGoodsList" parameterType="Goods" resultType="Goods">
+		/* TsfGoods.getRecommendGoodsList */
+		WITH  TAB_MASTER_GOODS AS (
+		SELECT  Z.*
 		FROM (
-		      SELECT B.GOODS_CD 
-		           , G.GOODS_NM
-		           , G.GOODS_GB
-		           , G.FOREIGN_BUY_YN
-		           , G.PARALLEL_IMPORT_YN
-		           , G.ORDER_MADE_YN
-		           , G.GOODS_STAT
-		           , G.GOODS_TYPE
-		           , G.MAIN_COLOR_CD
-		           , G.MIN_ORD_QTY 
-		           , (CASE WHEN E.DISP_NM_LANG = 'EN' THEN E.BRAND_GROUP_ENM ELSE E.BRAND_GROUP_KNM END) AS BRAND_GROUP_NM
-		           , G.LIST_PRICE
-		           , FN_GET_BENEFIT_PRICE(#{frontGb},G.GOODS_CD, G.CURR_PRICE,#{custGb}) AS CURR_PRICE
-		           , S.STOCK_QTY
-		           , S.SOLDOUT_YN
-		           , S.OPT_CD
-		      FROM TB_TMTB A
-		      INNER JOIN TB_TMTB_APPLY_GOODS B ON A.TMTB_SQ  = B.TMTB_SQ
-		                                       AND B.DEL_YN = 'N'
-		                                       AND B.GOODS_GB IN ( 'G800_10', 'G800_20')  -- 기본과 적용상품
-		      LEFT OUTER JOIN TB_TMTB_APPLY_GOODS BB ON B.TMTB_SQ  = BB.TMTB_SQ
-		                                       AND BB.DEL_YN = 'N'
-		                                       AND B.GOODS_CD = BB.GOODS_CD
-		                                       AND BB.GOODS_GB = 'G800_30'  -- 제외상품
-		                                       AND BB.GOODS_CD IS NULL
-		      INNER JOIN TB_GOODS G ON B.GOODS_CD = G.GOODS_CD
-		                            AND G.GOODS_STAT = 'G008_90'
-		                            AND G.SELF_MALL_YN = 'Y'
-		                            AND NOW() BETWEEN G.SELL_STDT AND G.SELL_EDDT
-		                            <if test='adminYn == null or adminYn != "Y"'>
-		                            AND G.GOODS_STAT = 'G008_90'
-		                            </if>
-		                            <![CDATA[
-		                            AND B.GOODS_CD <> #{goodsCd}  -- 자기상품은 제외
-		                            ]]>
+		    SELECT  @rownum := @rownum + 1 AS RNUM
+		         , G.GOODS_CD
+		         , G.GOODS_NM
+		         , G.GOODS_GB
+		         , G.FOREIGN_BUY_YN
+		         , G.PARALLEL_IMPORT_YN
+		         , G.ORDER_MADE_YN
+		         , G.GOODS_STAT
+		         , G.GOODS_TYPE
+		         , G.MAIN_COLOR_CD
+		         , G.MIN_ORD_QTY
+		         , (CASE WHEN E.DISP_NM_LANG = 'EN' THEN E.BRAND_GROUP_ENM ELSE E.BRAND_GROUP_KNM END) AS BRAND_GROUP_NM
+		         , G.LIST_PRICE
+		         , G.CURR_PRICE
+		         , GS.STOCK_QTY
+		         , A.DISP_ORD
+		    FROM (
+		             ${goodsSql}
+		           ) A
+		      JOIN ( SELECT @rownum := 0) R     
+		      INNER JOIN TB_GOODS G ON A.GOODS_CD = G.GOODS_CD
 		      INNER JOIN TB_BRAND D ON G.BRAND_CD = D.BRAND_CD
-		                    AND D.USE_YN = 'Y'
+		                            AND D.USE_YN = 'Y'
 		      INNER JOIN TB_SITE_BRAND SB ON D.BRAND_CD  = SB.BRAND_CD
-		                            AND SB.USE_YN = 'Y'
-		                            AND SB.SITE_CD = #{siteCd}
+		                                  AND SB.USE_YN = 'Y'
+		                                  AND SB.SITE_CD = #{siteCd}
 		      INNER JOIN TB_BRAND_GROUP E ON D.BRAND_GROUP_NO = E.BRAND_GROUP_NO
-		                            AND E.USE_YN = 'Y'
-		      LEFT OUTER JOIN (SELECT GOODS_CD
-		                            , SUM(CASE WHEN SOLDOUT_YN = 'Y' THEN 0
-		                                       ELSE CURR_STOCK_QTY END) AS STOCK_QTY
-		                            , MIN(SOLDOUT_YN) AS SOLDOUT_YN
-		                            , MIN(CASE WHEN SOLDOUT_YN = 'N' THEN OPT_CD 
-		                                       ELSE 'XXX' END) AS OPT_CD 
-		                       FROM VW_STOCK
-		                       WHERE DISP_YN = 'Y'
-		                       GROUP BY GOODS_CD) S ON G.GOODS_CD = S.GOODS_CD
-		      WHERE NOW() BETWEEN A.TMTB_ST_DT AND A.TMTB_ED_DT
-		      AND A.TMTB_STAT ='G232_11'
-		       <![CDATA[
-		      AND A.TMTB_SQ IN (SELECT TMTB_SQ FROM TB_TMTB_APPLY_GOODS WHERE GOODS_CD = #{goodsCd} AND DEL_YN = 'N' AND GOODS_GB IN ( 'G800_10', 'G800_20')) -- 기본과 적용상품
-		      AND A.TMTB_SQ NOT IN (SELECT TMTB_SQ FROM TB_TMTB_APPLY_GOODS WHERE GOODS_CD = #{goodsCd} AND DEL_YN = 'N' AND GOODS_GB = 'G800_30') -- 제외상품
-		       ]]>
-		      ORDER BY A.TMTB_SQ 
-		) Z
-		LEFT OUTER JOIN (SELECT MAX(GOODS_CD) AS GOODS_CD 
-		                       , MAX(CASE WHEN  RNUM = 1 THEN  VIDEO_GB END) AS  VIDEO_GB_M
-		                       , MAX(CASE WHEN  RNUM = 1 THEN  VIDEO_VAL END) AS  VIDEO_VAL_M
-		                       , MAX(CASE WHEN  RNUM = 2 THEN  VIDEO_GB END) AS  VIDEO_GB_S
-		                       , MAX(CASE WHEN  RNUM = 2 THEN  VIDEO_VAL END) AS  VIDEO_VAL_S
-		                 FROM (
-		                       SELECT A.DISPLOC_VAL AS GOODS_CD
-		                            , B.VIDEO_GB 
-		                            , B.VIDEO_VAL 
-		                            , A.REG_DT 
-		                            , RANK() OVER(PARTITION BY A.DISPLOC_VAL ORDER BY A.REG_DT ) RNUM 
-		                       FROM TB_VIDEO_DISPLOC  A
-		                       INNER JOIN  TB_VIDEO B ON A.VIDEO_SQ = B.VIDEO_SQ 
-		                                              AND B.DISP_YN ='Y'
-		                       WHERE A.DISPLOC_GB ='G'
-		                       AND A.DISP_YN = 'Y'
-		                      ) V
-		                 ) V ON Z.GOODS_CD = V.GOODS_CD
-		LEFT OUTER JOIN TB_WISHLIST W ON Z.GOODS_CD = W.GOODS_CD
-		                        AND IFNULL(#{custNo}, 0) = W.CUST_NO
-		LIMIT #{maxRownum}
+		                                  AND E.USE_YN = 'Y'
+		      INNER JOIN TB_GOODS_STOCK GS ON G.GOODS_CD = GS.GOODS_CD
+		                                   AND GS.STOCK_QTY > 0
+		     WHERE G.GOODS_STAT = 'G008_90'
+		      AND G.SELF_MALL_YN = 'Y'
+		      AND NOW() BETWEEN G.SELL_STDT AND G.SELL_EDDT
+		      <![CDATA[
+		      AND G.GOODS_CD <> #{goodsCd}  -- 자기상품은 제외
+		      ]]>
+		    ) Z
+		WHERE RNUM <![CDATA[<= ]]>#{maxRownum}
+		)
+		, TAB_GOODS AS (
+		    SELECT G.GOODS_CD
+		         , G.GOODS_NM
+		         , FN_GET_GOODS_NM(GOODS_NM,GOODS_GB,FOREIGN_BUY_YN,PARALLEL_IMPORT_YN,ORDER_MADE_YN) AS GOODS_FULL_NM /*상품FULL명*/
+		         , G.GOODS_STAT
+		         , G.GOODS_TYPE
+		         , G.MAIN_COLOR_CD
+		         , G.MIN_ORD_QTY
+		         , G.BRAND_GROUP_NM
+		         , G.LIST_PRICE
+		         , G.STOCK_QTY
+		         , G.DISP_ORD
+		         , FN_GET_BENEFIT_PRICE(#{frontGb},G.GOODS_CD, G.CURR_PRICE,#{custGb}) AS CURR_PRICE
+		         , (SELECT MAX(SYS_IMG_NM) FROM TB_GOODS_IMG WHERE GOODS_CD = G.GOODS_CD AND COLOR_CD = IFNULL(G.MAIN_COLOR_CD,'XX') AND DEFAULT_IMG_YN = 'Y') AS SYS_IMG_NM
+		         , (SELECT MAX(SYS_IMG_NM) FROM TB_GOODS_IMG WHERE GOODS_CD = G.GOODS_CD AND COLOR_CD = IFNULL(G.MAIN_COLOR_CD,'XX') AND MOUSEOVER_IMG_YN = 'Y') AS SYS_IMG_NM2
+		         , (CASE WHEN G.GOODS_CD IS NULL THEN 'N' ELSE 'Y' END) AS WISH_YN
+		    FROM TAB_MASTER_GOODS G
+		    LEFT OUTER JOIN TB_WISHLIST W ON G.GOODS_CD = W.GOODS_CD
+		                                  AND IFNULL(#{custNo}, 0) = W.CUST_NO
+		)
+		SELECT Z.*
+		     , 100 - ROUND((CURR_PRICE / LIST_PRICE) * 100 ,0) AS DC_RATE
+		FROM TAB_GOODS Z
+		ORDER BY DISP_ORD
 	</select>
 	
 	<!-- 재입고 알림 미 알림 조회 -->
@@ -911,7 +993,7 @@
 		     , G.MAIN_COLOR_CD
 		     , GI.SYS_IMG_NM
 		FROM   (
-		        ${todayGoodsSql}
+		        ${goodsSql}
 		       ) A
 		     , TB_GOODS G
 		     , TB_GOODS_IMG GI
@@ -986,7 +1068,7 @@
 		                                   AND C.DEL_YN = 'N'
 		                                   AND C.LEFT_QTY > 0    -- 사은품 잔여수량
 		      INNER JOIN TB_FREE_GOODS F ON F.PRODUCT_NO = C.PRODUCT_NO
-                           AND F.USE_YN = 'Y'
+		                                 AND F.USE_YN = 'Y'
 		      INNER JOIN TB_FREEGIFT_GOODS D ON A.FREEGIFT_SQ = D.FREEGIFT_SQ
 		                                   AND D.GOODS_GB  IN ( 'G800_10',  'G800_20')
 		                                   AND D.TARGET_GB = 'G260_10'
@@ -1144,23 +1226,20 @@
 		    /* 상품의 동영상 목록 */
 		    SELECT GOODS_CD
 		         , MAX(CASE WHEN RNUM = 1 THEN VIDEO_GB END)  AS VIDEO_GB_M
-		         , MAX(CASE WHEN RNUM = 1 THEN VIDEO_VAL END) AS VIDEO_VAL_M
+		         , MAX(CASE WHEN RNUM = 1 THEN KMC_KEY END) AS VIDEO_VAL_M
 		         , MAX(CASE WHEN RNUM = 2 THEN VIDEO_GB END)  AS VIDEO_GB_S
-		         , MAX(CASE WHEN RNUM = 2 THEN VIDEO_VAL END) AS VIDEO_VAL_S
+		         , MAX(CASE WHEN RNUM = 2 THEN KMC_KEY END) AS VIDEO_VAL_S
 		    FROM   (
 		            SELECT G.GOODS_CD
-		                 , V.VIDEO_GB
-		                 , V.VIDEO_VAL
+		                 , VD.VIDEO_GB
+		                 , VD.KMC_KEY
 		                 , VD.REG_DT
 		                 , RANK() OVER(PARTITION BY G.GOODS_CD ORDER BY VD.REG_DT) AS RNUM
 		            FROM   TAB_GOODS G
-		                 , TB_VIDEO_DISPLOC VD
-		                 , TB_VIDEO V
-		            WHERE  G.GOODS_CD = VD.DISPLOC_VAL
-		            AND    VD.VIDEO_SQ = V.VIDEO_SQ
-		            AND    VD.DISPLOC_GB = 'G' /*상품*/
+		                 , TB_GOODS_VIDEO VD
+		            WHERE  G.GOODS_CD = VD.GOODS_CD
 		            AND    VD.DISP_YN = 'Y'
-		            AND    V.DISP_YN ='Y'
+		            AND    VD.KMC_KEY IS NOT NULL
 		           ) Z
 		    GROUP  BY GOODS_CD
 		)
@@ -1297,23 +1376,20 @@
 		    /* 상품의 동영상 목록 */
 		    SELECT GOODS_CD
 		         , MAX(CASE WHEN RNUM = 1 THEN VIDEO_GB END)  AS VIDEO_GB_M
-		         , MAX(CASE WHEN RNUM = 1 THEN VIDEO_VAL END) AS VIDEO_VAL_M
+		         , MAX(CASE WHEN RNUM = 1 THEN KMC_KEY END) AS VIDEO_VAL_M
 		         , MAX(CASE WHEN RNUM = 2 THEN VIDEO_GB END)  AS VIDEO_GB_S
-		         , MAX(CASE WHEN RNUM = 2 THEN VIDEO_VAL END) AS VIDEO_VAL_S
+		         , MAX(CASE WHEN RNUM = 2 THEN KMC_KEY END) AS VIDEO_VAL_S
 		    FROM   (
 		            SELECT G.GOODS_CD
-		                 , V.VIDEO_GB
-		                 , V.VIDEO_VAL
+		                 , VD.VIDEO_GB
+		                 , VD.KMC_KEY
 		                 , VD.REG_DT
 		                 , RANK() OVER(PARTITION BY G.GOODS_CD ORDER BY VD.REG_DT) AS RNUM
 		            FROM   TAB_GOODS G
-		                 , TB_VIDEO_DISPLOC VD
-		                 , TB_VIDEO V
-		            WHERE  G.GOODS_CD = VD.DISPLOC_VAL
-		            AND    VD.VIDEO_SQ = V.VIDEO_SQ
-		            AND    VD.DISPLOC_GB = 'G' /*상품*/
+		                 , TB_GOODS_VIDEO VD
+		            WHERE  G.GOODS_CD = VD.GOODS_CD
 		            AND    VD.DISP_YN = 'Y'
-		            AND    V.DISP_YN ='Y'
+		            AND    VD.KMC_KEY IS NOT NULL
 		           ) Z
 		    GROUP  BY GOODS_CD
 		)

+ 4 - 4
src/main/java/com/style24/persistence/mybatis/shop/TsfReview.xml

@@ -113,6 +113,7 @@
 		     , R.REVIEW_TITLE
 		     , R.REVIEW_CONTENT
 		     , R.SCORE
+		     , CAST(R.SCORE AS UNSIGNED) AS ISCORE
 		     , R.HEIGHT
 		     , R.WEIGHT
 		     , R.SCORE_SIZE
@@ -145,7 +146,6 @@
 		     , C.CUST_ID 
 		     , (SELECT MAX(SYS_IMG_NM) FROM TB_GOODS_IMG WHERE GOODS_CD = G.GOODS_CD AND COLOR_CD = IFNULL(G.MAIN_COLOR_CD,'XX') AND DEFAULT_IMG_YN = 'Y') AS SYS_IMG_NM
 		     , (SELECT TI.SIZE_GB FROM TB_ITEMKIND TI WHERE TI.ITEMKIND_CD = G.ITEMKIND_CD) AS SIZE_GB
-		     
 		     , (SELECT MAX(REVIEW_SQ) 
 		        FROM TB_REVIEW R
 		        WHERE REVIEW_SQ <![CDATA[<]]> #{reviewSq} 
@@ -186,7 +186,6 @@
 		                    )
 		        </if>
 		        ) AS NEXT_REVIEW_SQ
-		     
 		     , RANK() OVER(ORDER BY R.REVIEW_SQ DESC) AS RNUM
 		FROM TB_REVIEW R 
 		INNER JOIN TB_GOODS G ON R.GOODS_CD = G.GOODS_CD
@@ -209,7 +208,7 @@
 		            AND REVIEW_SQ = R.REVIEW_SQ
 		            AND (FILE_GB  = 'I'
 		                 OR
-		                 FILE_GB = 'M' AND R.CONFIRM_YN = 'Y'
+		                 FILE_GB = 'M' AND R.CONFIRM_YN = 'Y' AND  KMC_EKY IS NOT NULL
 		                )
 		            )
 		</if>
@@ -264,6 +263,7 @@
 		     , A.REVIEW_SQ
 		     , A.FILE_GB
 		     , A.SYS_FILE_NM
+		     , A.KMC_KEY
 		     , A.DEL_YN 
 		     , RANK() OVER(ORDER BY a.FILE_GB DESC) AS NUMB
 		FROM  TB_REVIEW R
@@ -274,7 +274,7 @@
 		AND R.REVIEW_SQ = #{reviewSq}
 		AND (A.FILE_GB  = 'I'
 		     OR
-		     A.FILE_GB = 'M' AND R.CONFIRM_YN = 'Y'
+		     A.FILE_GB = 'M' AND R.CONFIRM_YN = 'Y' AND  A.KMC_EKY IS NOT NULL
 		    )
 	</select>
 	

+ 1 - 1
src/main/webapp/WEB-INF/views/mob/goods/GoodsDetailFormMob.html

@@ -498,7 +498,7 @@
 								<!-- 베스트 리뷰 등록시 노출 -->
 								<div class="best_review">
 									<a href="javascript:void(0);" th:onclick="cfGoodsReviewDetail([[${goodsInfo.goodsCd}]],'Y', '',[[${bestReview.reviewSq}]])">
-										<div class="star_score" th:with="starScore=${#numbers.formatDecimal((bestReview.score*100/5), 0,0)}">
+										<div class="star_score" th:with="starScore=${#numbers.formatDecimal((bestReview.iscore*100/5), 0,0)}">
 											<span class="star">
 												<em class="progbar" th:style="${'width:'+starScore+'%;' }"></em> <!-- 평점 style로 표기 -->
 											</span>

+ 1 - 1
src/main/webapp/WEB-INF/views/mob/goods/GoodsDetailReviewFormMob.html

@@ -415,7 +415,7 @@
 						<div class="swiper-slide" th:each="bestReview, status : ${bestReviewList}">
 							<div class="best_review">
 								<a href="javascript:void(0);">
-									<div class="star_score" th:with="starScore=${#numbers.formatDecimal((bestReview.score*100/5), 0,0)}">
+									<div class="star_score" th:with="starScore=${#numbers.formatDecimal((bestReview.iscore*100/5), 0,0)}">
 										<span class="star">
 											<em class="progbar" th:style="${'width:'+starScore+'%;' }"></em> <!-- 평점 style로 표기 -->
 										</span>

+ 1 - 1
src/main/webapp/WEB-INF/views/mob/goods/GoodsReviewDetailFormMob.html

@@ -67,7 +67,7 @@
 								<li>
 									<div class="review">
 										<div class="info_box">
-											<div class="star_score" h:with="starScore=${#numbers.formatDecimal((review.score*100/5), 0,0)}">
+											<div class="star_score" th:with="starScore=${#numbers.formatDecimal((review.iscore*100/5), 0,0)}">
 												<span class="star">
 													<em class="progbar" th:style="${'width:'+starScore+'%;' }"></em> <!-- 평점 style로 표기 -->
 												</span>

+ 5 - 2
src/main/webapp/WEB-INF/views/web/goods/GoodsDetailFormWeb.html

@@ -45,6 +45,7 @@
 												<img th:src="${'https://img.youtube.com/vi/'+goodsVideo.kmcKey+'/default.jpg'}" alt="" th:onerror="'this.src=\''+@{${uxImgUrl}+ '/images/pc/thumb/bg_item_none.png'}+'\';'">
 												</th:block>
 												<th:block th:unless="${goodsVideo.videoGb == 'Y'}">
+												<iframe width="100%" height="100%" th:src="${kollusMediaUrl+'/'+goodsVideo.kmcKey +'?player_version=html5'}" frameborder="0" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe>
 												</th:block>
 												</span>
 											</a>
@@ -57,7 +58,8 @@
 																		or #strings.contains(goodsImg.sysImgNm,'_L2.'))}">
 											<a th:href="${'#navLocate'+ count}">
 												<span class="thumb">
-												<img th:src="${imgGoodsUrl+'/'+goodsImg.sysImgNm+'?RS=48'}" alt="" th:onerror="'this.src=\''+@{${uxImgUrl}+ '/images/pc/thumb/bg_item_none.png'}+'\';'"></span>
+												<img th:src="${imgGoodsUrl+'/'+goodsImg.sysImgNm+'?RS=48'}" alt="" th:onerror="'this.src=\''+@{${uxImgUrl}+ '/images/pc/thumb/bg_item_none.png'}+'\';'">
+												</span>
 											</a>
 										</div>
 									</th:block>	
@@ -76,6 +78,7 @@
 										<iframe width="100%" height="100%" th:src="${'https://www.youtube.com/embed/'+goodsVideo.kmcKey+'?rel=0&autoplay=1&mute=1'}" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
 										</th:block>
 										<th:block th:unless="${goodsVideo.videoGb == 'Y'}">
+										<iframe width="100%" height="100%" th:src="${kollusMediaUrl+'/'+goodsVideo.kmcKey +'?player_version=html5'}" frameborder="0" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe>
 										</th:block>
 									</div>
 								</li>
@@ -394,7 +397,7 @@
 													<span class="thumb" th:classAppend="${(reviewAttach.fileGb == 'M') ? 'mov' :''}" th:style="${'background-image:url('+imgUrl+ reviewAttach.sysFileNm+');'}"></span><!-- 동영상의 썸네일일 경우 mov 클래스 추가 -->
 													</th:block>
 												</div>
-												<div class="star_score" th:with="starScore=${#numbers.formatDecimal((bestReview.score*100/5), 0,0)}">
+												<div class="star_score" th:with="starScore=${#numbers.formatDecimal((bestReview.iscore*100/5), 0,0)}">
 													<span class="star">
 														<em class="progbar" th:style="${'width:'+starScore+'%;' }"></em> <!-- 평점 style로 표기 -->
 													</span>

+ 2 - 2
src/main/webapp/WEB-INF/views/web/goods/GoodsDetailReviewFormWeb.html

@@ -307,7 +307,7 @@
 								<span class="thumb" th:style="${'background-image:url('+imgGoodsUrl+ '/'+goodsInfo.sysImgNm+'?RS=365);'}">
 								</span>
 							</div>
-							<div class="star_score" th:with="starScore=${#numbers.formatDecimal((bestReview.score*100/5), 0,0)}">
+							<div class="star_score" th:with="starScore=${#numbers.formatDecimal((bestReview.iscore*100/5), 0,0)}">
 								<span class="star">
 									<em class="progbar" th:style="${'width:'+starScore+'%;' }"></em> <!-- 평점 style로 표기 -->
 								</span>
@@ -461,7 +461,7 @@
 			$('#goodsReviewForm  input[name="secretYn"]').val('N');
 		} */
 		// Initialize a pagination
-		gagaPaging.init('goodsReviewForm', fnGetListCallback, 'pageNav', 1);
+		gagaPaging.init('goodsReviewForm', fnGetListCallback, 'pageNav', 20);
 
 		// Load data
 		gagaPaging.load(1);

+ 1 - 1
src/main/webapp/WEB-INF/views/web/goods/GoodsReviewDetailFormWeb.html

@@ -56,7 +56,7 @@
 								<div class="review_cont">
 									<div class="box_wrap">
 										<div class="star_box">
-											<div class="star_score" th:with="starScore=${#numbers.formatDecimal((review.score*100/5), 0,0)}">
+											<div class="star_score" th:with="starScore=${#numbers.formatDecimal((review.iscore*100/5), 0,0)}">
 												<span class="star">
 													<em class="progbar" th:style="${'width:'+starScore+'%;' }"></em> <!-- 평점 style로 표기 -->
 												</span>