Преглед на файлове

Merge branch 'develop' into eskim

eskim преди 5 години
родител
ревизия
ed8a49fa6d

+ 9 - 1
src/main/java/com/style24/front/biz/dao/TsfCouponDao.java

@@ -156,7 +156,15 @@ public interface TsfCouponDao {
 	 */
 	CustCoupon getAttendCouponInfo(CustCoupon coupon);
 	
-	
+	/**
+	 * 퀵메뉴 다운가능 쿠폰 리스트
+	 * 
+	 * @param coupon
+	 * @return Collection<Coupon>
+	 * @author sowon
+	 * @since 2021.04.23
+	 */
+	Collection<Coupon> getQuickCouponDownList(Coupon coupon);
 	
 	
 }

+ 65 - 0
src/main/java/com/style24/front/biz/service/TsfCouponService.java

@@ -720,5 +720,70 @@ public class TsfCouponService {
 		return couponDao.getAttendCouponInfo(coupon);
 	}
 	
+	
+	/**
+	 * 퀵메뉴 다운가능 쿠폰 리스트
+	 * 
+	 * @param coupon
+	 * @return Collection<Coupon>
+	 * @author sowon
+	 * @since 2021.04.23
+	 */
+	public Collection<Coupon> getQuickCouponDownList(Coupon coupon){
+		coupon.setSiteCd(TscConstants.Site.STYLE24.value());
+		coupon.setFrontGb(TsfSession.getFrontGb());
+		coupon.setCustGb(TsfSession.getCustGb());
+		coupon.setCustNo(TsfSession.getInfo().getCustNo());
+		coupon.setCustGrade(TsfSession.getInfo().getCustGrade());
+		return couponDao.getQuickCouponDownList(coupon);
+	}
+	
+	/**
+	 * 퀵메뉴 쿠폰 다운
+	 *
+	 * @param coupon - 쿠폰 아이디, 고객번호
+	 * @return int - 결과
+	 * @author sowon
+	 * @since 2021.04.23
+	 */
+	@Transactional("shopTxnManager")
+	public String saveQuickCoupon(Coupon coupon) {
+		//String result = "SUCESS";
+		coupon.setSiteCd(TscConstants.Site.STYLE24.value());
+		coupon.setFrontGb(TsfSession.getFrontGb());
+		coupon.setCustGb(TsfSession.getCustGb());
+		coupon.setCustNo(TsfSession.getInfo().getCustNo());
+		coupon.setCustGrade(TsfSession.getInfo().getCustGrade());
+		Collection<Coupon> quickCouponList = couponDao.getQuickCouponDownList(coupon);
+		
+		String result = "SUCESS";
+
+		if (quickCouponList == null || quickCouponList.isEmpty()) {
+			result = "ERROR_10";
+			return result;
+		}
+		
+		int count = 0;
+		if (coupon.getCpnId() > 0) {
+			for (Coupon quickCoupon : quickCouponList) {
+				if (quickCoupon != null) {
+					CustCoupon custCoupon = new CustCoupon();
+					custCoupon.setCustNo(coupon.getCustNo());
+					custCoupon.setCpnId(quickCoupon.getCpnId());
+					custCoupon.setAvailStdt(quickCoupon.getAvailStdt());
+					custCoupon.setAvailEddt(quickCoupon.getAvailEddt());
+					custCoupon.setPubReason(TscConstants.PubReason.DOWNLOAD.value());
+					custCoupon.setEndAlimSendYn("N");		// 알림 발송 여부(발송되면 Y)
+					custCoupon.setUpdNo(coupon.getCustNo());
+					custCoupon.setRegNo(coupon.getCustNo());
+					coreCouponDao.saveCouponCustPub(custCoupon);
+					count++;
+				}
+			}
+		}
+		//result = Integer.toString(count);	// 다운받은 쿠폰수
+
+		return result;
+	}
 
 }

+ 38 - 24
src/main/java/com/style24/front/biz/web/TsfMypageController.java

@@ -1423,6 +1423,44 @@ public class TsfMypageController extends TsfBaseController {
 		ownCouponList  = couponService.getMypageCouponList(coupon);
 		return ownCouponList;
 	}
+	
+	/**
+	 * 퀵메뉴 다운가능한 쿠폰리스트
+	 * @return
+	 * @author sowon
+	 * @since 2021. 4. 23
+	 */
+	@GetMapping("/quick/down/coupon/list")
+	@ResponseBody
+	public GagaMap getQuickDownCouponList() {
+		GagaMap result = new GagaMap();
+		Coupon coupon = new Coupon();
+		Collection<Coupon> ownCouponList = couponService.getQuickCouponDownList(coupon);
+		result.set("ownCouponList", ownCouponList);
+		result.set("couponCount",couponService.getMypageCouponInfo(coupon));
+		return result;
+	}
+	
+	/**
+	 * 퀵메뉴 쿠폰 다운
+	 * @return
+	 * @author sowon
+	 * @since 2021. 4. 23
+	 */
+	@PostMapping("/quick/coupon/download")
+	@ResponseBody
+	public GagaMap downQuickCoupon(@RequestBody Coupon coupon) {
+		GagaMap result = new GagaMap();
+		String couponResult = couponService.saveQuickCoupon(coupon);
+		if ("ERROR_10".equals(couponResult)) {
+			result.set("message", "발급가능 쿠폰이 없습니다.");
+		}else {
+			result.set("message", "쿠폰이 발급되었습니다.");
+		}
+		result.set("status", "200");
+		return result;
+	}
+
 
 	/**
 	 * 마이페이지 쿠폰 상세보기 팝업
@@ -1556,30 +1594,6 @@ public class TsfMypageController extends TsfBaseController {
 
 		return mav;
 	}
-	
-	/*
-	@GetMapping("/review/create/form/{ordNo}/{ordDtlNo}/{goodsCd}/{reviewStat}")
-	public ModelAndView mypageReviewCreateForm(@PathVariable(value = "ordNo") Integer ordNo, @PathVariable(value = "ordDtlNo") Integer ordDtlNo, @PathVariable(value = "goodsCd") String goodsCd, @PathVariable(value = "reviewStat") String reviewStat, Device device) {
-		Review review = new Review();
-		ModelAndView mav = new ModelAndView();
-
-		review.setCustNo(TsfSession.getInfo().getCustNo());
-		review.setSiteCd(TscConstants.Site.STYLE24.value());
-		review.setOrdNo(ordNo);
-		review.setOrdDtlNo(ordDtlNo);
-		review.setGoodsCd(goodsCd);
-		review.setReviewStat(reviewStat);
-
-		mav.addObject("reviewStat", reviewStat);
-		mav.addObject("reviewInfo", reviewService.getReviewGoodsInfo(review));
-
-		mav.setViewName(super.getDeviceViewName("mypage/MypageReviewCreateForm"));
-
-		return mav;
-	}
-
-	*/
-	
 
 	/**
 	 * 마이페이지 리뷰 저장

+ 5 - 0
src/main/java/com/style24/persistence/domain/GoodsSearch.java

@@ -59,6 +59,11 @@ public class GoodsSearch extends TscBaseDomain {
     private String  filterCd;
     private String  filterNm;
 
+    private String priceHigh;
+    private String priceRow;
+    private String dcrateHigh;
+    private String dcrateRow;
+
     private TscPageRequest pageable;				// 페이징
     private int pageNo = 1;
     private int pageSize = 50;

+ 77 - 22
src/main/java/com/style24/persistence/mybatis/shop/TsfCoupon.xml

@@ -738,27 +738,22 @@
 	<select id="getMypageCouponInfo" resultType="Coupon" parameterType="Coupon">
 		/* TsfCoupon.getMypageCouponInfo*/
 		SELECT COUNT(*) AS ALL_COUPON_CNT
-			,(  SELECT COUNT(*) AS USE_COUPON
-				FROM tb_coupon A INNER JOIN tb_cust_coupon B ON A.CPN_ID = B.CPN_ID 
-				WHERE 1=1
-				  AND A.CPN_ID = B.CPN_ID 
-				  AND B.CUST_NO = #{custNo}
-				  AND A.CPN_STAT = 'G232_11'
-				  AND NOW() BETWEEN A.AVAIL_STDT AND A.AVAIL_EDDT ) AS USE_COUPON_CNT
 		    ,(  SELECT COUNT(*) AS USE_COUPON
-				FROM tb_coupon A INNER JOIN tb_cust_coupon B ON A.CPN_ID = B.CPN_ID 
-				WHERE 1=1
-				  AND A.CPN_ID = B.CPN_ID 
-				  AND B.CUST_NO = #{custNo}
-				  AND A.CPN_STAT = 'G232_11'
-				  AND NOW() BETWEEN A.AVAIL_STDT AND A.AVAIL_EDDT 
-				  AND NOW() BETWEEN DATE_ADD(A.AVAIL_EDDT , INTERVAL -7 DAY) AND A.AVAIL_EDDT ) AS EXPIRE_COUPON_CNT
-		FROM tb_coupon A INNER JOIN tb_cust_coupon B ON A.CPN_ID = B.CPN_ID 
+		        FROM TB_CUST_COUPON 
+		        WHERE 1=1
+		        AND CUST_NO = #{custNo}
+		        AND NOW() BETWEEN AVAIL_STDT AND AVAIL_EDDT 
+		        AND USED_DT IS NULL) AS USE_COUPON_CNT
+		    ,(  SELECT COUNT(*) AS USE_COUPON
+		        FROM TB_CUST_COUPON 
+		        WHERE 1=1
+		        AND CUST_NO = #{custNo}
+		        AND NOW() BETWEEN AVAIL_STDT AND AVAIL_EDDT 
+		        AND NOW() BETWEEN DATE_ADD(AVAIL_EDDT , INTERVAL -7 DAY) AND AVAIL_EDDT ) AS EXPIRE_COUPON_CNT
+		FROM TB_CUST_COUPON 
 		WHERE 1=1
-		  AND A.CPN_ID = B.CPN_ID 
-		  AND B.CUST_NO = #{custNo}
-		  AND A.CPN_STAT = 'G232_11'
-		  AND NOW() BETWEEN A.AVAIL_STDT AND A.AVAIL_EDDT
+		  AND CUST_NO = #{custNo}
+		  AND NOW() BETWEEN AVAIL_STDT AND AVAIL_EDDT
 	</select>
 	
 	<select id="getCouponDetailInfo" resultType="Coupon" parameterType="Coupon">
@@ -813,9 +808,9 @@
 		                       END)                              AS EXPIRE_YN /*만료여부*/
 		            FROM   TB_CUST_COUPON CC
 		            WHERE  1 = 1
-		            <if test="planCouponStat == null and planCouponStat == ''">
+		          <!--   <if test="planCouponStat == null and planCouponStat == ''"> -->
 		            AND    CC.CUST_NO = #{custNo}
-		            </if>
+		            <!-- </if> -->
 		            AND    CC.USED_DT IS NULL /*사용하지않은쿠폰만*/
 		            AND    CC.AVAIL_EDDT >= DATE_ADD(NOW(), INTERVAL -3 MONTH) /*최근3개월쿠폰만*/
 		            GROUP  BY CC.CPN_ID, DATE_FORMAT(CC.AVAIL_STDT,'%Y.%m.%d %H:%i'), DATE_FORMAT(CC.AVAIL_EDDT,'%Y.%m.%d %H:%i')
@@ -1099,5 +1094,65 @@
 		AND   CP.SITE_CD = #{siteCd}
 		AND   CP.CPN_STAT = 'G232_11'
 	</select>
-
+	
+	<select id="getQuickCouponDownList"  parameterType="Coupon" resultType="Coupon">
+		/*TsfCoupon.getQuickCouponDownList*/
+		SELECT C.CPN_ID 
+		      ,C.CPN_NM 
+		      ,C.CPN_DESC       
+		      ,C.CPN_TYPE 
+		      ,C.BUY_LIMIT_AMT 
+		      ,C.CUST_PUB_LIMIT_QTY 
+		      ,C.TOT_PUB_LIMIT_QTY
+		      ,C.MAX_DC_AMT 
+		      , CONCAT(CASE WHEN C.BUY_LIMIT_AMT = 0 THEN ''
+		                   ELSE CONCAT(FORMAT(C.BUY_LIMIT_AMT , 0),'원 이상 구매 시 ')
+		              END
+		             ,CASE WHEN C.MAX_DC_AMT = 0 THEN ''
+		                   ELSE CONCAT('최대 ',FORMAT(C.MAX_DC_AMT , 0),'원 할인')
+		              END)     AS USE_CONDITION  /*사용조건*/
+		     , CASE WHEN C.CUST_PUB_LIMIT_QTY = 0 THEN ''
+		            ELSE CONCAT('1인당 최대',C.CUST_PUB_LIMIT_QTY,'매')
+		       END             AS ISSUE_CONDITION /*발급수량*/
+		      ,CASE WHEN #{frontGb} = 'P' THEN C.DC_PVAL
+		            WHEN #{frontGb} = 'M' THEN C.DC_MVAL
+		            WHEN #{frontGb} = 'A' THEN C.DC_AVAL
+		            ELSE C.DC_AVAL
+		            END                                       AS DC_VAL
+		      ,CASE WHEN C.DC_WAY = 'G240_10' THEN '원'
+		                    ELSE '%'
+		                    END                                      AS DC_WAY    /*할인방법*/
+		      ,C.PD_GB 
+		      ,IF (C.PD_GB = 'D', NOW(), C.AVAIL_STDT) AS AVAIL_STDT
+		      ,IF (C.PD_GB = 'D', CONCAT(CURRENT_DATE + INTERVAL C.AVAIL_DAYS DAY, ' 23:59:59'), C.AVAIL_EDDT) AS AVAIL_EDDT
+		FROM TB_COUPON C
+		WHERE 1=1
+		AND C.CPN_STAT = 'G232_11'
+		<if test="cpnId != null and cpnId != ''">
+		AND    C.CPN_ID = #{cpnId}
+		</if>
+		AND C.SITE_CD = #{siteCd}
+		AND C.CPN_TYPE IN ('G230_20','G230_30')
+		AND C.DOWN_ABL_YN = 'N'
+		AND NOW() BETWEEN C.DOWN_STDT AND C.DOWN_EDDT
+		AND NOW()  <![CDATA[<=]]> IF (C.PD_GB = 'D', CONCAT(CURRENT_DATE + INTERVAL C.AVAIL_DAYS DAY, ' 23:59:59'), C.AVAIL_EDDT)
+		AND (CASE WHEN 'P' = 'P' THEN C.DC_PVAL
+		         WHEN 'M' = 'P' THEN C.DC_MVAL
+		     ELSE C.DC_AVAL END) > 0                  -- PC, MOBILE,APP 별로 0 보다 큰 쿠폰
+		AND IF (C.TOT_PUB_LIMIT_QTY = 0, 9999999999,C.TOT_PUB_LIMIT_QTY) > (SELECT COUNT(1) FROM TB_CUST_COUPON WHERE CPN_ID = C.CPN_ID AND CUST_NO= #{custNo}) -- 총발행제한수
+		AND IF (C.CUST_PUB_LIMIT_QTY = 0, 9999999999,C.CUST_PUB_LIMIT_QTY) > (SELECT COUNT(1) FROM TB_CUST_COUPON WHERE CPN_ID = C.CPN_ID AND CUST_NO= #{custNo}) -- 고객당발행제한수량
+		AND (SELECT COUNT(1)
+		     FROM TB_COUPON_CUST_GBN
+		     WHERE CPN_ID = C.CPN_ID
+		     AND USABLE_CUST_GB IN (#{custGb})              -- 사용가능고객구분
+		     ) <![CDATA[>=]]> 1
+		AND (SELECT COUNT(1)
+		     FROM TB_COUPON_CUST_GRADE
+		     WHERE CPN_ID = C.CPN_ID
+		     AND USABLE_CUST_GRADE IN (#{custGrade})              -- 사용가능고객구분
+		     ) <![CDATA[>=]]> 1
+		ORDER BY  C.AVAIL_EDDT,
+		CASE WHEN DC_WAY LIKE '%' THEN DC_VAL END DESC LIMIT 10
+	</select>
+	
 </mapper>

+ 255 - 219
src/main/java/com/style24/persistence/mybatis/shop/TsfDisplay.xml

@@ -83,7 +83,7 @@
 		    </when>
 		    <otherwise>
 		     , GTAB_SQ                                            /*GNB탭일련번호*/
-		     , CASE WHEN CONTENTS_TYPE = 'C' THEN (SELECT CONTENTS_TITLE FROM	TB_MAIN_LAYOUT WHERE CONTENTS_LOC = 'STAB003') ELSE '' END AS GTAB_BANNER_TITLE
+		     , CASE WHEN CONTENTS_TYPE = 'C' OR CONTENTS_TYPE = 'O' THEN (SELECT CONTENTS_TITLE FROM	TB_MAIN_LAYOUT WHERE CONTENTS_LOC = 'STAB003') ELSE '' END AS GTAB_BANNER_TITLE
 		FROM   TB_GNB_TAB A
 		    </otherwise>
 		</choose>
@@ -746,14 +746,30 @@
 		               </when>
 		               <otherwise>
 		           AND    CG.BRAND_GROUP_NO = 0 /*브랜드메인에서 접근한 것이 아니면*/
-		                  </otherwise>
-		              </choose>
-		AND    G.GOODS_STAT = 'G008_90' /*승인완료상품*/
-		AND    G.SELF_MALL_YN = 'Y' /*몰노출상품*/
-		AND    NOW() BETWEEN G.SELL_STDT AND G.SELL_EDDT /*유효한 판매기간*/
-		AND    S.STOCK_QTY > 0 /*재고있는 상품*/
-		AND    B.USE_YN = 'Y' /*사용하는 브랜드*/
-		AND    BG.USE_YN = 'Y' /*사용하는 브랜드그룹*/
+		               </otherwise>
+		           </choose>
+		           <if test="formalGb != null and formalGb !=''">
+		           AND    G.FORMAL_GB = #{formalGb}
+		           </if>
+		           AND    G.GOODS_STAT = 'G008_90' /*승인완료상품*/
+		           AND    G.SELF_MALL_YN = 'Y' /*몰노출상품*/
+		           AND    NOW() BETWEEN G.SELL_STDT AND G.SELL_EDDT /*유효한 판매기간*/
+		           AND    S.STOCK_QTY > 0 /*재고있는 상품*/
+		           AND    B.USE_YN = 'Y' /*사용하는 브랜드*/
+		           AND    BG.USE_YN = 'Y' /*사용하는 브랜드그룹*/
+		           <if test="priceHigh != null and priceHigh != ''">
+		           AND    G.CURR_PRICE <![CDATA[<=]]> #{priceHigh}
+		           </if>
+		           <if test="priceRow != null and priceRow != ''">
+		           AND    G.CURR_PRICE <![CDATA[>=]]> #{priceRow}
+		           </if>
+		           <if test="dcrateHigh != null and dcrateHigh != ''">
+		           AND    G.DC_RATE <![CDATA[<=]]> #{dcrateHigh}
+		           </if>
+		           <if test="dcrateRow != null and dcrateRow != ''">
+		           AND    G.DC_RATE <![CDATA[>=]]> #{dcrateRow}
+		           </if>
+		           <include refid="getCategoryGoodsList_sql"/>
 		) G
 		WHERE  1 = 1
 		)
@@ -823,225 +839,230 @@
 	<select id="getCategoryGoodsList" parameterType="GoodsSearch" resultType="Goods">
 		/* TsfDisplay.getCategoryGoodsList */
 		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 'P' = 'P' AND GBP.CUST_GB = 'G100_20' THEN GBP.STAFF_PC_CURR_PRICE
-		WHEN 'P' = 'M' AND GBP.CUST_GB = 'G100_20' THEN GBP.STAFF_MO_CURR_PRICE
-		WHEN 'P' = 'A' AND GBP.CUST_GB = 'G100_20' THEN GBP.STAFF_APP_CURR_PRICE
-		WHEN 'P' = 'P' AND GBP.CUST_GB != 'G100_20' THEN GBP.PC_CURR_PRICE
-		WHEN 'P' = 'M' AND GBP.CUST_GB != 'G100_20' THEN GBP.MO_CURR_PRICE
-		WHEN 'P' = 'A' AND GBP.CUST_GB != '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_CATE_4SRCH C4
-		INNER JOIN TB_CATE_GOODS CG ON C4.LEAF_CATE_NO = CG.CATE_NO
-		INNER JOIN TB_GOODS G ON CG.GOODS_CD = G.GOODS_CD
-		INNER JOIN TB_GOODS_STOCK S ON CG.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 CG.GOODS_CD = GS.GOODS_CD
-		LEFT OUTER JOIN TB_GOODS_BENEFIT_PRICE GBP ON CG.GOODS_CD = GBP.GOODS_CD
-		WHERE  C4.SITE_CD = 'G000_10'
-		AND    C4.CATE_GB = 'G032_101'
-		AND    C4.CATE_TYPE = 'G031_10' /*상품카테고리*/
-		AND    C4.CATE1_NO = #{cate1No}
-		<if test="cate2No != null and cate2No != ''">
-			AND    C4.CATE2_NO = #{cate2No}
-		</if>
-		<if test="cate3No != null and cate3No != ''">
-			AND    C4.CATE3_NO = #{cate3No}
-		</if>
-		<if test="cate4No != null and cate4No != ''">
-			AND    C4.CATE4_NO = #{cate4No}
-		</if>
-		<if test="cate5No != null and cate5No != ''">
-			AND    C4.CATE5_NO = #{cate5No}
-		</if>
-		<choose>
-			<when test="brandGroupNo != null and brandGroupNo != ''">
-				AND    CG.BRAND_GROUP_NO = #{brandGroupNo}
-			</when>
-			<otherwise>
-				AND    CG.BRAND_GROUP_NO = 0 /*브랜드메인에서 접근한 것이 아니면*/
-			</otherwise>
-		</choose>
-		AND    G.GOODS_STAT = 'G008_90' /*승인완료상품*/
-		AND    G.SELF_MALL_YN = 'Y' /*몰노출상품*/
-		AND    NOW() BETWEEN G.SELL_STDT AND G.SELL_EDDT /*유효한 판매기간*/
-		AND    S.STOCK_QTY > 0 /*재고있는 상품*/
-		AND    B.USE_YN = 'Y' /*사용하는 브랜드*/
-		AND    BG.USE_YN = 'Y' /*사용하는 브랜드그룹*/
-		) G
-		WHERE  1 = 1
+		          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 'P' = 'P' AND GBP.CUST_GB = 'G100_20' THEN GBP.STAFF_PC_CURR_PRICE
+		                         WHEN 'P' = 'M' AND GBP.CUST_GB = 'G100_20' THEN GBP.STAFF_MO_CURR_PRICE
+		                         WHEN 'P' = 'A' AND GBP.CUST_GB = 'G100_20' THEN GBP.STAFF_APP_CURR_PRICE
+		                         WHEN 'P' = 'P' AND GBP.CUST_GB != 'G100_20' THEN GBP.PC_CURR_PRICE
+		                         WHEN 'P' = 'M' AND GBP.CUST_GB != 'G100_20' THEN GBP.MO_CURR_PRICE
+		                         WHEN 'P' = 'A' AND GBP.CUST_GB != '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_CATE_4SRCH C4
+		                    INNER JOIN TB_CATE_GOODS CG ON C4.LEAF_CATE_NO = CG.CATE_NO
+		                    INNER JOIN TB_GOODS G ON CG.GOODS_CD = G.GOODS_CD
+		                    INNER JOIN TB_GOODS_STOCK S ON CG.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 CG.GOODS_CD = GS.GOODS_CD
+		                    LEFT OUTER JOIN TB_GOODS_BENEFIT_PRICE GBP ON CG.GOODS_CD = GBP.GOODS_CD
+		                    WHERE  C4.SITE_CD = 'G000_10'
+		                    AND    C4.CATE_GB = 'G032_101'
+		                    AND    C4.CATE_TYPE = 'G031_10' /*상품카테고리*/
+		                    AND    C4.CATE1_NO = #{cate1No}
+		                <if test="cate2No != null and cate2No != ''">
+		                    AND    C4.CATE2_NO = #{cate2No}
+		                </if>
+		                <if test="cate3No != null and cate3No != ''">AND    C4.CATE3_NO = #{cate3No}
+		                </if>
+		                <if test="cate4No != null and cate4No != ''">
+		                    AND    C4.CATE4_NO = #{cate4No}
+		                </if>
+		                <if test="cate5No != null and cate5No != ''">
+		                    AND    C4.CATE5_NO = #{cate5No}
+		                </if>
+		                <choose>
+		                    <when test="brandGroupNo != null and brandGroupNo != ''">
+		                    AND    CG.BRAND_GROUP_NO = #{brandGroupNo}
+		                    </when>
+		                    <otherwise>
+		                    AND    CG.BRAND_GROUP_NO = 0 /*브랜드메인에서 접근한 것이 아니면*/
+		                    </otherwise>
+		                </choose>
+		                <if test="formalGb != null and formalGb !=''">
+		                    AND    G.FORMAL_GB = #{formalGb}
+		                </if>
+		                    AND    G.GOODS_STAT = 'G008_90' /*승인완료상품*/
+		                    AND    G.SELF_MALL_YN = 'Y' /*몰노출상품*/
+		                    AND    NOW() BETWEEN G.SELL_STDT AND G.SELL_EDDT /*유효한 판매기간*/
+		                    AND    S.STOCK_QTY > 0 /*재고있는 상품*/
+		                    AND    B.USE_YN = 'Y' /*사용하는 브랜드*/
+		                    AND    BG.USE_YN = 'Y' /*사용하는 브랜드그룹*/
+		                <if test="priceHigh != null and priceHigh != ''">
+		                    AND    G.CURR_PRICE <![CDATA[<=]]> #{priceHigh}
+		                </if>
+		                <if test="priceRow != null and priceRow != ''">
+		                    AND    G.CURR_PRICE <![CDATA[>=]]> #{priceRow}
+		                </if>
+		                <if test="dcrateHigh != null and dcrateHigh != ''">
+		                    AND    G.DC_RATE <![CDATA[<=]]> #{dcrateHigh}
+		                </if>
+		                <if test="dcrateRow != null and dcrateRow != ''">
+		                    AND    G.DC_RATE <![CDATA[>=]]> #{dcrateRow}
+		                </if>
+		                <include refid="getCategoryGoodsList_sql"/>
+		                ) G
+		          WHERE  1 = 1
 		)
 		, 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' /*자사상품만*/
-		AND    O.DISP_YN = 'N'
-		GROUP  BY O.GOODS_CD, O.OPT_CD1
+		          /* 자사상품 색상 목록 */
+		          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' /*자사상품만*/
+		          AND    O.DISP_YN = 'N'
+		          GROUP  BY O.GOODS_CD, O.OPT_CD1
 		)
 		, TAB_ALL_GOODS AS (
-		SELECT *
-		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
-		, RANK() OVER(ORDER BY G.FORMAL_GB
-		, G.REG_DT DESC
-		, G.GOODS_CD) AS NUMB
-		FROM TAB_GOODS G
-		LEFT OUTER 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>
-		<if test="maxRow != null and maxRow !=''">
-			AND  NUMB <![CDATA[<=]]> #{maxRow}
-		</if>
+		        SELECT *
+		        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
+		                 , RANK() OVER(ORDER BY G.FORMAL_GB
+		                 , G.REG_DT DESC
+		                 , G.GOODS_CD) AS NUMB
+		                 FROM TAB_GOODS G
+		                 LEFT OUTER 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>
+		        <if test="maxRow != null and maxRow !=''">
+		        	AND  NUMB <![CDATA[<=]]> #{maxRow}
+		        </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 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 VIDEO_VAL
-		, (
-		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 '사은품'
-		       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 ICON
-		, FORMAL_GB
-		, REG_DT
-		, NUMB
+		     , 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 VIDEO_VAL
+		     , (
+		           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 '사은품'
+		                       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 ICON
+		     , FORMAL_GB
+		     , REG_DT
+		     , 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>
+		    <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
@@ -1136,6 +1157,21 @@
 		             AND O.GOODS_CD = G.GOODS_CD
 		     )
 		</if>
+		<if test='seasonSearch != null and seasonSearch.length > 0'>
+		     AND G.SEASON_CD IN
+		    <foreach collection="seasonSearch" item="item" index="index"  open="(" close=")" separator=",">
+		         #{item}
+		    </foreach>
+		</if>
+		<if test='benefitSearch != null and benefitSearch.length > 0'>
+			AND EXISTS ( SELECT 1 FROM TB_GOODS_BENEFIT
+			WHERE GOODS_CD = G.GOODS_CD
+			AND BENEFIT_GB IN
+			<foreach collection="benefitSearch" item="item" index="index" open="(" close=")" separator=",">
+				#{item}
+			</foreach>
+			)
+		</if>
 	</sql>
 
 	<!-- 카테고리별 상품 총 리스트 -->

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

@@ -665,7 +665,6 @@
 					AND O.ORD_NO NOT IN (SELECT R.ORD_NO FROM TB_REVIEW R WHERE R.DEL_YN = 'N' AND DISP_YN = 'Y')
 					</otherwise>
 				</choose>
-				AND O.ORD_NO NOT IN (SELECT R.ORD_NO FROM TB_REVIEW R WHERE R.DEL_YN = 'N' AND DISP_YN = 'Y')
 				AND O.CUST_NO = #{custNo}
 				AND O.DISP_YN = 'Y'
 			 	AND O.SITE_CD = 'G000_10'
@@ -1058,4 +1057,35 @@
 		   ,RPL_CFM_DT = NOW()
 		WHERE CUST_NO = #{custNo}
 	</update>
+	
+	<insert id="saveReviewAttach" parameterType="ReviewAttach">
+		/* TsfReivew.saveReviewAttach */	
+		INSERT INTO TB_REVIEW_ATTACH
+		(
+		  REVIEW_SQ
+		, FILE_GB
+		, ORG_FILE_NM
+		, SYS_FILE_NM
+		, KMC_KEY
+		, KUF_KEY
+		, DEL_YN
+		, REG_NO
+		, REG_DT
+		, UPD_NO
+		, UPD_DT
+		)
+		VALUES(
+		  #{reviewSq}
+		, #{fileGb}
+		, #{orgFileNm}
+		, #{sysFileNm}
+		, #{kmcKey}
+		, #{kufKey}
+		, #{delYn}
+		, #{custNo}
+		, CURRENT_TIMESTAMP
+		, #{custNo}
+		, CURRENT_TIMESTAMP
+		)
+	</insert>
 </mapper>

+ 70 - 4
src/main/webapp/WEB-INF/views/web/common/fragments/FooterWeb.html

@@ -1248,7 +1248,49 @@
 			$('#couponList').addClass('need_login');
 			return false;
 		}else{
-			
+			$.getJSON('/mypage/quick/down/coupon/list'
+					, function(result, status) {
+						if (status == 'success'){
+							$('#quick04').find('span').html(result.ownCouponList.length + result.couponCount.useCouponCnt);
+							let tag = '';
+							if(result.ownCouponList.length>0){
+								tag += '<ul class="coupon_list">';
+								$.each(result.ownCouponList, function (idx, item) {
+									tag += '	<li>';
+									tag += '		<div class="coupon">';
+									tag += '			<div>';
+									tag += '				<p class="cp_name">'+item.cpnNm+'</p>';
+									tag += '				<p class="cp_cont">';
+									if (item.dcWay == '%') {
+										tag += '					<span><em>'+item.dcVal.addComma()+'</em>%</span>';
+									}else{
+										tag += '					<span><em>'+item.dcVal.addComma()+'</em>원</span>';
+									}
+									
+									
+									tag += '				</p>';
+									if(item.custPubLimitQty == 0){
+										tag += '				<p class="cp_condition">'+item.useCondition+'<span></span>';
+									}else{
+										tag += '				<p class="cp_condition">'+item.useCondition+'<span>1인 최대'+item.custPubLimitQty.addComma()+'장</span>';
+									}
+									
+									tag += '				</p>';
+									tag += '			</div>';
+									tag += '			<button type="button" class="btn btn_dark btn_block btn_coupon_down" onclick="fnQuickCouponDown('+item.cpnId+')"><span>쿠폰받기</span></button>';
+									tag += '		</div>';
+									tag += '	</li>';
+								});
+								tag += '</ul>';
+							}else{
+								tag += '<div class="no_item">';
+								tag += 	'다운 가능한 쿠폰이 없습니다.';
+								tag += '</div>';
+								
+							}
+							$('#issueCoupon').html(tag);
+						}
+				});
 		}
 	}
 	
@@ -1257,8 +1299,8 @@
 		$.getJSON('/mypage/quick/own/coupon/list'
 				, function(result, status) {
 					if (status == 'success') {
+						let tag = '';
 						if (result.length > 0) {
-							let tag = '';
 							tag += '<ul class="clear">';
 							$.each(result, function (idx, item) {
 								tag += '	<li>';
@@ -1286,14 +1328,38 @@
 							});
 							tag += '<ul>';
 							
-							$('#ownCoupon').html(tag);
 						} else {
-							$('#ownCoupon').addClass('nodata');
+							tag += '<div class="no_item">';
+							tag += 	'보유한 쿠폰이 없습니다.';
+							tag += '</div>';
 						}
+						
+						$('#ownCoupon').html(tag);
 					}
 			});
 	}
 	
+	//쿠폰 다운로드
+	var fnQuickCouponDown = function(obj){
+
+		if (!cfCheckLogin()) {
+			cfnGoToPage(_PAGE_LOGIN);
+			return false;
+		}
+		let cpnId = obj;
+		gagajf.ajaxJsonSubmit('/mypage/quick/coupon/download', JSON.stringify({cpnId: cpnId}), fnQuickCouponCallBack);
+	}
+
+	// 쿠폰다운로드 콜백
+	var fnQuickCouponCallBack = function(result){
+		if (result.status == "200"){
+			//mcxDialog.alert(result.message);
+		}			
+		issueCouponBtn();
+		
+	}
+
+	
 	// 소유한 쿠폰 사용안내 모달
 	var useInfoCoupon = function (id) {
 		var data = {cpnId : id};

+ 11 - 10
src/main/webapp/WEB-INF/views/web/common/fragments/GnbWeb.html

@@ -572,6 +572,7 @@
 	// GNB탭 > 카테고리
 	let fnGetGnbCategory = function(cate1) {
 		let tag = '';
+		let formalGb = 'G009_10';
 		if (cate1 != null) {
 			tag += '<li class="has_depth">\n'; //depth_menu 있을 시 has_depth 클래스 추가
 			tag += '	<a href="javascript:void(0);" onclick="cfnGoToCategoryMain(\'' + cate1.cateGb + '\',' + cate1.cate1No + ');">' + cate1.cate1Nm + '</a>\n';
@@ -579,23 +580,23 @@
 			tag += '		<div class="head_category">\n';
 			tag += '			<div class="tit">\n';
 			tag += '				<p>' + cate1.cate1Nm + '</p>\n';
-			tag += '				<a href="javascript:void(0);" onclick="cfnGoToGoodsList(0,\'' + cate1.cateGb + '\',' + cate1.cate1No + ');" class="more">전체보기</a>\n';
+			tag += '				<a href="javascript:void(0);" onclick="cfnGoToGoodsList(0,\'' + cate1.cateGb + '\',' + cate1.cate1No + ',\'\',\'\',\'\',\'\',\'' + formalGb + '\');" class="more">전체보기</a>\n';
 			tag += '			</div>\n';
 			if (cate1.leafYn == 'N' && cate1.cate2List.length > 0) {
 				tag += '			<div class="menu">\n';
 				tag += '				<ul class="maintabs">\n';
 				$.each(cate1.cate2List, function(idx2, cate2) {
 					tag += '					<li>\n';
-					tag += '						<a href="javascript:void(0);" onclick="cfnGoToGoodsList(0,\'' + cate2.cateGb + '\',' + cate2.cate1No + ',' + cate2.cate2No + ');">' + cate2.cate2Nm + '</a>\n';
+					tag += '						<a href="javascript:void(0);" onclick="cfnGoToGoodsList(0,\'' + cate2.cateGb + '\',' + cate2.cate1No + ',' + cate2.cate2No + ',\'\',\'\',\'\',\'' + formalGb + '\');">' + cate2.cate2Nm + '</a>\n';
 					if (cate2.leafYn == 'N' && cate2.cate3List != null && cate2.cate3List.length > 0) {
 						tag += '						<ul class="box_depth2">\n';
 						$.each(cate2.cate3List, function(idx3, cate3) {
 							tag += '							<li>\n';
-							tag += '								<a href="javascript:void(0);" onclick="cfnGoToGoodsList(0,\'' + cate3.cateGb + '\',' + cate3.cate1No + ',' + cate3.cate2No + ',' + cate3.cate3No + ');">' + cate3.cate3Nm + '</a>\n';
+							tag += '								<a href="javascript:void(0);" onclick="cfnGoToGoodsList(0,\'' + cate3.cateGb + '\',' + cate3.cate1No + ',' + cate3.cate2No + ',' + cate3.cate3No + ',\'\',\'\',\'' + formalGb + '\');">' + cate3.cate3Nm + '</a>\n';
 							if (cate3.leafYn == 'N' && cate3.cate4List != null && cate3.cate4List.length > 0) {
 								tag += '								<ul class="box_depth3">\n';
 								$.each(cate3.cate4List, function(idx4, cate4) {
-									tag += '									<li><a href="javascript:void(0);" onclick="cfnGoToGoodsList(0,\'' + cate4.cateGb + '\',' + cate4.cate1No + ',' + cate4.cate2No + ',' + cate4.cate3No + ',' + cate4.cate4No + ');">' + cate4.cate4Nm + '</a></li>\n';
+									tag += '									<li><a href="javascript:void(0);" onclick="cfnGoToGoodsList(0,\'' + cate4.cateGb + '\',' + cate4.cate1No + ',' + cate4.cate2No + ',' + cate4.cate3No + ',' + cate4.cate4No + ',\'\',\'' + formalGb + '\');">' + cate4.cate4Nm + '</a></li>\n';
 								});
 								tag += '								</ul>\n';
 							}
@@ -677,11 +678,11 @@
 								});
 							} else if(item.contentsType == 'O'){
 								let outletCate = fnGetOutletCategory(item.gtabNm);
-
 								$('#divGnbTab').append(outletCate);
 								// $('#divGnbTab').append('<li><a href="' + item.linkUrl + '">' + item.gtabNm + '</a></li>');
 								$('#ulGnbTab').append('<li><a href="' + item.linkUrl + '">' + item.gtabNm + '</a></li>');
 								fnGetOutletLeafCategory();
+								fnGetGnbBanner('3000',item.gtabBannerTitle);
 							} else if (item.contentsType == 'L') { // 컨텐츠유형:링크
 								$('#divGnbTab').append('<li><a href="' + item.linkUrl + '">' + item.gtabNm + '</a></li>');
 								$('#ulGnbTab').append('<li><a href="' + item.linkUrl + '">' + item.gtabNm + '</a></li>');
@@ -714,7 +715,7 @@
 		tag += '				</ul>\n';
 		tag += '			</div>\n';
 		tag += '		</div>\n';
-		tag += '	<div class="head_banner" id="outlet'+allCateItem.cate1No+'">\n';
+		tag += '	<div class="head_banner" id="id3000">\n';
 		tag += '	</div>';
 		tag += '	</div>\n';
 		tag += '</li>\n';
@@ -731,22 +732,22 @@
 
 	var fnGetOutletLeafData= function (idx, cate1){
 		let tag2 = '';
-
+		let formalGb = 'G009_20';
 		if (cate1 != null) {
 			if (cate1.leafYn == 'N' && cate1.cate2List.length > 0) {
 				tag2 += '<ul class="box_depth2">';
 				$.each(cate1.cate2List, function(idx2, cate2) {
 					tag2 += '					<li>\n';
-					tag2 += '						<a href="javascript:void(0);" onclick="cfnGoToGoodsList(0,\'' + cate2.cateGb + '\',' + cate2.cate1No + ',' + cate2.cate2No + ');">' + cate2.cate2Nm + '</a>\n';
+					tag2 += '						<a href="javascript:void(0);" onclick="cfnGoToGoodsList(0,\'' + cate2.cateGb + '\',' + cate2.cate1No + ',' + cate2.cate2No + ',\'\',\'\',\'\',\'' + formalGb + '\');">' + cate2.cate2Nm + '</a>\n';
 					if (cate2.leafYn == 'N' && cate2.cate3List != null && cate2.cate3List.length > 0) {
 						tag2 += '						<ul class="box_depth2">\n';
 						$.each(cate2.cate3List, function(idx3, cate3) {
 							tag2 += '							<li>\n';
-							tag2 += '								<a href="javascript:void(0);" onclick="cfnGoToGoodsList(0,\'' + cate3.cateGb + '\',' + cate3.cate1No + ',' + cate3.cate2No + ',' + cate3.cate3No + ');">' + cate3.cate3Nm + '</a>\n';
+							tag2 += '								<a href="javascript:void(0);" onclick="cfnGoToGoodsList(0,\'' + cate3.cateGb + '\',' + cate3.cate1No + ',' + cate3.cate2No + ',' + cate3.cate3No + ',\'\',\'\',\'' + formalGb + '\');">' + cate3.cate3Nm + '</a>\n';
 							if (cate3.leafYn == 'N' && cate3.cate4List != null && cate3.cate4List.length > 0) {
 								tag2 += '								<ul class="box_depth3">\n';
 								$.each(cate3.cate4List, function(idx4, cate4) {
-									tag2 += '									<li><a href="javascript:void(0);" onclick="cfnGoToGoodsList(0,\'' + cate4.cateGb + '\',' + cate4.cate1No + ',' + cate4.cate2No + ',' + cate4.cate3No + ',' + cate4.cate4No + ');">' + cate4.cate4Nm + '</a></li>\n';
+									tag2 += '									<li><a href="javascript:void(0);" onclick="cfnGoToGoodsList(0,\'' + cate4.cateGb + '\',' + cate4.cate1No + ',' + cate4.cate2No + ',' + cate4.cate3No + ',' + cate4.cate4No + ',\'\',\'' + formalGb + '\');">' + cate4.cate4Nm + '</a></li>\n';
 								});
 								tag2 += '								</ul>\n';
 							}

+ 78 - 20
src/main/webapp/WEB-INF/views/web/display/CategoryGoodsListFormWeb.html

@@ -113,7 +113,7 @@
 											<strong>하의</strong>
 											<th:block th:each="filterSizeData, filterSizeStat : ${filterSizeList}" th:if="${filterSizeData.filterCd == 'B'}">
 												<label class="size_btn">
-													<input type="checkbox" group="filterValue" th:id="${'chkFilterBSize'+filterSizeStat.count}" name="size2" th:vale="${filterSizeData.filterNm}" th:data-id="${filterSizeData.filterNm}" onclick="filterSel(this,'size','off','2');"><span th:text="${filterSizeData.filterNm}">80</span>
+													<input type="checkbox" group="filterValue" th:id="${'chkFilterBSize'+filterSizeStat.count}" name="size" th:vale="${filterSizeData.filterNm}" th:data-id="${filterSizeData.filterNm}" onclick="filterSel(this,'size','off','2');"><span th:text="${filterSizeData.filterNm}">80</span>
 												</label>
 											</th:block>
 										</li>
@@ -121,7 +121,7 @@
 											<strong>신발</strong>
 											<th:block th:each="filterSizeData, filterSizeStat : ${filterSizeList}" th:if="${filterSizeData.filterCd == 'S'}">
 												<label class="size_btn">
-													<input type="checkbox" group="filterValue" th:id="${'chkFilterSSize'+filterSizeStat.count}" name="size3" th:vale="${filterSizeData.filterNm}" th:data-id="${filterSizeData.filterNm}" onclick="filterSel(this,'size','off','3');"><span th:text="${filterSizeData.filterNm}">80</span>
+													<input type="checkbox" group="filterValue" th:id="${'chkFilterSSize'+filterSizeStat.count}" name="size" th:vale="${filterSizeData.filterNm}" th:data-id="${filterSizeData.filterNm}" onclick="filterSel(this,'size','off','3');"><span th:text="${filterSizeData.filterNm}">80</span>
 												</label>
 											</th:block>
 										</li>
@@ -132,7 +132,9 @@
 								<!-- 가격 -->
 								<div class="sort tap04" id="priceFilterDiv">
 									<div class="range">
-										<input type="text" class="js-range-slider01" name="my_range01" value="" />
+										<input type="text" class="js-range-slider01" name="" value="" />
+										<input type="hidden" id="price_input_from" value="0"/>
+										<input type="hidden" id="price_input_to" value="0"/>
 									</div>
 									<a href="javascript:void(0)" class="tap_close">delete-btn</a>
 								</div>
@@ -152,7 +154,9 @@
 										<li><input type="checkbox" id="percent10" name="range" value="100"><label for="percent10"><span></span><span>100%</span></label></li>
 									</ul>
 									<div class="range">
-										<input type="text" class="js-range-slider02" name="my_range02" value="" />
+										<input type="text" class="js-range-slider02" name="" value="" />
+										<input type="hidden" id="dcrate_input_from" value="0"/>
+										<input type="hidden" id="dcrate_input_to" value="0"/>
 									</div>
 									<a href="javascript:void(0)" class="tap_close">delete-btn</a>
 								</div>
@@ -229,7 +233,7 @@
 										<!--										</span>-->
 										<!-- 컬러 표시 -->
 									</div>
-									<button class="fillter_reset" onclick="fnFilterReset();"><span>전체 초기화</span></button>
+									<button type="button" class="fillter_reset" onclick="fnFilterReset();"><span>전체 초기화</span></button>
 								</div>
 								<!-- //필터 -->
 							</div>
@@ -299,13 +303,17 @@
 	<script th:inline="javascript">
 		/*<![CDATA[*/
 		var filterPriceList = [[${filterPriceList}]];
+		var custom_values = [];
+		var custom_values02  = [];
+		var currUrl = document.location.href;
+		console.log('currUrl>>'+currUrl);
 
 		// 컨텐츠 호출
 		$(document).ready( function() {
 			//가격 슬라이드
 			//var custom_values = ['9,000원', '230,000원', '487,000원', '700,000원', '1,360,000원', '1,799,000원'];
 			if(!gagajf.isNull(filterPriceList)){
-				var custom_values = [];
+
 				$.each(filterPriceList, function (priceIdx, priceItem){
 					custom_values[priceIdx] = priceItem.filterNm;
 				});
@@ -314,7 +322,6 @@
 				var my_to = custom_values.indexOf(custom_values[5]); //custom_values.indexOf('230,000원');
 				var minValue = custom_values[0];
 				var maxValue = custom_values[5];
-				console.log('my_from>>'+my_from);
 
 				$(".dp .js-range-slider01, .sch_result .js-range-slider01").ionRangeSlider({
 					type: "double",
@@ -326,14 +333,22 @@
 					skin: "round",
 					postfix: "원",
 					prettify_separator: ",",
-					values: custom_values
+					values: custom_values,
+					// onStart : function(data){
+					// 	fnCheckPrice(data);
+					// },
+					// onChange : fnCheckPrice,
+					onFinish : function(data){
+						fnCheckPrice(data);
+					}
 				});
 			}
 
 			//할인율
-			var custom_values02 = ['0%', '10%', '20%', '30%', '40%', '50%', '60%', '70%', '80%', '90%', '100%'];
+			custom_values02 = ['0%', '10%', '20%', '30%', '40%', '50%', '60%', '70%', '80%', '90%', '100%'];
 			var my_from02 = custom_values02.indexOf('0%');
-			var my_to02 = custom_values02.indexOf('10%');
+			var my_to02 = custom_values02.indexOf('100%');
+
 			$(".dp .js-range-slider02, .sch_result .js-range-slider02").ionRangeSlider({
 				type: "double",
 				min: 0,
@@ -344,22 +359,60 @@
 				skin: "round",
 				postfix: "%",
 				prettify_separator: ",",
-				values: custom_values02
+				values: custom_values02,
+				// onStart : function(data){
+				// 	fnCheckDcRate(data);
+				// },
+				// onChange : fnCheckDcRate,
+				onFinish : function (data){
+					fnCheckDcRate(data);
+				}
 			});
 
 			fnCreateCategoryList();
-
-			//fnGoodsListSearch();
 		});
 
+		// 필터 가격 확인
+		var fnCheckPrice = function (data){
+			$("#priceSpan").remove();
+			$("#searchGoodsForm input:hidden[name=priceRow]").remove();
+			$("#searchGoodsForm input:hidden[name=priceHigh]").remove();
+			let min = data.from;
+			let max = data.to;
+			// console.log('Price from>>'+custom_values[min]);
+			// console.log('Price to>>'+custom_values[max]);
+			$("#price_input_from").val(custom_values[0]);
+			$("#price_input_to").val(custom_values[5]);
+
+			fnFilterSlider('price' , custom_values[min], custom_values[max]);
+		}
+
+		// 필터 할인율 확인
+		var fnCheckDcRate = function (data){
+			$("#dcrateSpan").remove();
+			$("#searchGoodsForm input:hidden[name=dcrateRow]").remove();
+			$("#searchGoodsForm input:hidden[name=dcrateHigh]").remove();
+			let min = data.from;
+			let max = data.to;
+			console.log('DcRate from>>'+custom_values02[min].replace('%',''));
+			console.log('DcRate to>>'+custom_values02[max].replace('%',''));
+			$("#price_input_from").val(0);
+			$("#price_input_to").val(100);
+
+			fnFilterSlider('dcrate' , custom_values02[min].replace('%',''), custom_values02[max].replace('%',''));
+		}
+
 		var fnFilterReset = function (){
-			$("#searchGoodsForm input:hidden[name=brandSearch]").remove();
-			$("#searchGoodsForm input:hidden[name=sizeSearch]").remove();
-			$("#searchGoodsForm input:hidden[name=priceSearch]").remove();
-			$("#searchGoodsForm input:hidden[name=dcrateSearch]").remove();
-			$("#searchGoodsForm input:hidden[name=seasonSearch]").remove();
-			$("#searchGoodsForm input:hidden[name=colorSearch]").remove();
-			$("#searchGoodsForm input:hidden[name=benefitSearch]").remove();
+			document.location.href = currUrl;
+			// $("#searchGoodsForm input:hidden[name=brandSearch]").remove();
+			// $("#searchGoodsForm input:hidden[name=sizeSearch]").remove();
+			// $("#searchGoodsForm input:hidden[name=priceRow]").remove();
+			// $("#searchGoodsForm input:hidden[name=priceHigh]").remove();
+			// $("#searchGoodsForm input:hidden[name=dcrateRow]").remove();
+			// $("#searchGoodsForm input:hidden[name=dcrateHigh]").remove();
+			// $("#searchGoodsForm input:hidden[name=seasonSearch]").remove();
+			// $("#searchGoodsForm input:hidden[name=colorSearch]").remove();
+			// $("#searchGoodsForm input:hidden[name=benefitSearch]").remove();
 		}
 
 		var fnGoodsListSearch = function (){
@@ -380,6 +433,8 @@
 			var ithrCd = '';
 			var contentLoc = '';
 			if (result.dataList != null && result.dataList.length > 0) {
+				$('.list_content .list_defult').hide();
+				$('.list_content .count_wrap').show();
 				var goodsUrl = [[${@environment.getProperty('upload.goods.view')}]];;
 				let lastPage = result.paging.pageable.pageNo;
 				let endRow = result.endRow - result.paging.pageable.pageSize;
@@ -389,6 +444,9 @@
 			}else {
 				if($("#searchForm input[name=pageNo]").val()==1){
 					$('#listBox').html('<li class="none">상품정보가 존재하지 않습니다.</li>');
+				}else{
+					$('.list_content .list_defult').show();
+					$('.list_content .count_wrap').hide();
 				}
 				gagaInfiniteScroll.draw('not');
 			}

+ 1 - 1
src/main/webapp/WEB-INF/views/web/display/MallMainFormWeb.html

@@ -474,7 +474,7 @@
 										<div class="swiper-slide">
 											<div class="movbox">
 												<iframe th:if="${item.strVar1=='Y'}" width="100%" height="100%" th:src="${'https://www.youtube.com/embed/'+item.strVar2+'?rel=0'}" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
-												<iframe th:if="${item.strVar1=='M'}" width="100%" height="100%" th:src="${'http://v.kr.kollus.com/'+item.strVar2}" ></iframe>
+												<iframe th:if="${item.strVar1=='M'}" class="pd_mov"  th:src="${'http://v.kr.kollus.com/'+item.strVar2+'?enable_initialize_focus=false'}" allowfullscreen></iframe>
 											</div>
 										</div>
 									</th:block>

+ 1 - 2
src/main/webapp/WEB-INF/views/web/mypage/MypageGiftcardFormWeb.html

@@ -265,8 +265,7 @@
 		let giftcardOwnList = result.giftcardOwnList;
 
 		let tmtbHtml2 = "";
-
-		if (giftcardOwnList == null) {
+		if (giftcardOwnList.length <=0) {
 			tmtbHtml2 += '<div class="nodata">';
 			tmtbHtml2 += '<div class="txt_box">';
 			tmtbHtml2 += '<p>보유한 상품권이 없습니다.<br></p>';

+ 32 - 14
src/main/webapp/WEB-INF/views/web/mypage/MypageReviewCreateFormWeb.html

@@ -353,6 +353,11 @@
 														<li>
 															최대 10개까지 등록 가능
 														</li>
+														<!-- 210419_수정 : 텍스트 추가 -->
+														<li>
+															동영상 첨부 시 관리자 승인이 필요하여 바로 노출이 되지 않을 수 있습니다.
+														</li>
+														<!-- //210419_수정 : 텍스트 추가 -->
 													</ul>
 												</div>
 											</td>
@@ -371,7 +376,7 @@
 					<!-- // CONT-BODY -->					
 				</div>
 			</div>
-
+<script type="text/javascript" src="/ux/plugins/gaga/gaga.kollus.js"></script>
 <script src="/ux/plugins/gaga/gaga.paging.js"></script>
 <script th:inline="javascript">
 let reviewList = [[${reviewInfo}]];
@@ -558,8 +563,21 @@ var fnChooseFile = function(obj) {
 
 	if (!gagajf.isNull(file.name)) {
 		var extension = "\.(jpg|jpeg|png)$";
-		if (!(new RegExp(extension, "i")).test(file.name)) {
-			mcxDialog.alertC('이미지는 [jpg, jpeg, png] 파일만 가능합니다.', {
+		if ((new RegExp(extension, "i")).test(file.name)) {
+			 gagajf.ajaxFileUpload('/common/file/upload?subDir=/review'
+						, file
+						, function(result) {
+							// 업로드한 파일명 설정
+							$(".pics").children().eq(0).append("<input type='hidden' name='orgFileNmArr' id='orgFileNm"+(picLength+1)+"' value='"+result.oldFileName+"'>");
+							$(".pics").children().eq(0).append("<input type='hidden' name='sysFileNmArr' id='sysFileNm"+(picLength+1)+"' value='"+result.newFileName+"'>");
+						}
+				); 
+		}else if((new RegExp("mp4", "i")).test(file.name)){
+			$(".pics").eq(0).find('removes').append("<input type='hidden' name='kufKey' id='kufKey"+(picLength+1)+"'>");
+			$(".pics").eq(0).find('removes').append("<input type='hidden' name='kmcKey' id='kmcKey"+(picLength+1)+"'>");
+			//gagaKollus.upload('Review', file, $('#kufKey'+(picLength+1)));
+		}else{
+			mcxDialog.alertC('첨부할 수 없는 파일 형식입니다.', {
 				sureBtnText: "확인",
 				sureBtnClick: function() {
 					$(obj).parent('.imgUpload').find('.removes').trigger('click');
@@ -569,25 +587,25 @@ var fnChooseFile = function(obj) {
 		}
 	}
 	// 이거 왜 안먹히지 
-	if (!gagajf.isNull(file.size) && Number(file.size) > (10 * 1000000)) {
-		mcxDialog.alertC('이미지는 최대 10MB 이하 파일만 가능합니다.', {
-			sureBtnText: "확인",
-			sureBtnClick: function() {
-				$(obj).parent('.imgUpload').find('.removes').trigger('click');
-			}
-		});
-		return false;
-	}
+//	if (!gagajf.isNull(file.size) && Number(file.size) > (10 * 1000000)) {
+//		mcxDialog.alertC('이미지는 최대 10MB 이하 파일만 가능합니다.', {
+//			sureBtnText: "확인",
+//			sureBtnClick: function() {
+//				$(obj).parent('.imgUpload').find('.removes').trigger('click');
+//			}
+//		});
+//		return false;
+//	} 
 	
 	// 파일 업로드
-	 gagajf.ajaxFileUpload('/common/file/upload?subDir=/review'
+/* 	 gagajf.ajaxFileUpload('/common/file/upload?subDir=/review'
 			, file
 			, function(result) {
 				// 업로드한 파일명 설정
 				$(".pics").children().eq(0).append("<input type='hidden' name='orgFileNmArr' id='orgFileNm"+(picLength+1)+"' value='"+result.oldFileName+"'>");
 				$(".pics").children().eq(0).append("<input type='hidden' name='sysFileNmArr' id='sysFileNm"+(picLength+1)+"' value='"+result.newFileName+"'>");
 			}
-	); 
+	);   */
 }
 
 

+ 99 - 5
src/main/webapp/biz/goods.js

@@ -172,9 +172,14 @@ var fnCreateGoodsList = function(result, ithrCd, contentLoc, goodsUrl, lastPage,
 
 		tag += '<div class="item_prod">';
 		tag += '	<div class="item_state">';
-		tag += '		<button type="button" class="itemLike">관심상품 추가</button>';
-		tag += '		<a href="#none" class="itemLink">';
-		// tag += '			<div class="rank ranker"><span>'+(rank+(idx+1))+'</span></div>';
+		tag += '		<button type="button" class="itemLike"';
+		if(item.likeIt == 'likeit'){
+			tag += 'classappend="likeit"';
+		}else{
+			tag += 'classappend=""';
+		}
+		tag += ' onClick="cfnPutWishList(this);" goodsCd=\''+item.goodsCd+'\', ithrCd=\'\', contentsLoc=\'\', planDtlSq=\'\'>관심상품 추가</button>';
+		tag += '<a href="javascript:void(0);" class="itemLink" onclick="cfnGoToGoodsDetail(\''+item.goodsCd+'\');">';
 		tag += '			<div class="itemPic">';
 		if(!gagajf.isNull(item.videoVal)){
 			var videoArr = item.videoVal.split(",");
@@ -188,11 +193,11 @@ var fnCreateGoodsList = function(result, ithrCd, contentLoc, goodsUrl, lastPage,
 			if(videoGb=='Y'){
 				tag += '<iframe id="child" class="pd_mov" src="https://www.youtube.com/embed/'+videoUrl+'"></iframe>';
 			}else{
-				tag += '<iframe id="child" class="pd_mov" src="http://v.kr.kollus.com/'+videoUrl+'"></iframe>';
+				tag += '<iframe id="child" class="pd_mov" src="http://v.kr.kollus.com/'+videoUrl+'?enable_initialize_focus=false&autoplay=true" frameborder="0" allowfullscreen></iframe>';
 			}
 		}
 		tag += '		<img class=" vLHTC pd_img" src="'+goodsUrl+'/'+item.sysImgNm+'" data-img="'+goodsUrl+'/'+item.sysImgNm2+'">';
-		if(!gagajf.isNull(item.sizes)){
+		if(!gagajf.isNull(item.sizes) && gagajf.isNull(item.videoVal)){
 			var sizeArr = item.sizes.split(",");
 			var minSize;
 			var maxSize;
@@ -399,4 +404,93 @@ var fnDeleteFilter = function (obj, gubun, staus, sizeGb){
 	$(obj).closest("span").remove();
 }
 
+var fnFilterSlider = function (gubun, min, max){
+	let tag = '';
+	let oriMin = '';
+	let oriMax = '';
+	if(gubun=='price'){
+		oriMin = $("#price_input_from").val();
+		oriMax = $("#price_input_to").val();
+	}else{
+		oriMin = $("#dcrate_input_from").val();
+		oriMax = $("#dcrate_input_to").val();
+	}
+
+	if(gubun=='price'){
+		if(min!=max){
+			tag += '<span id="priceSpan">'+ min +'원~'+max+'원';
+		}else{
+			tag += '<span id="priceSpan">'+max+'원';
+		}
+	}else{
+		if(min!=max){
+			tag += '<span id="dcrateSpan">'+ min +'~'+max+'%';
+		}else{
+			tag += '<span id="dcrateSpan">'+max+'%';
+		}
+	}
+	tag += '<a href="javascript:void(0);" class="filter_delete" onclick="fnDeleteFilterSlider(this,\''+gubun+'\', '+oriMin+', '+oriMax+');"></a >';
+	tag += '</span>';
+
+	$("#filterData").append(tag);
+
+	var tag2 = '';
+	if(gubun=='price'){
+		tag2 += '<input type="hidden" name="priceRow" value="'+min+'"/>\n';
+		tag2 += '<input type="hidden" name="priceHigh" value="'+max+'"/>\n';
+		$("#searchGoodsForm").append(tag2);
+		fnCategoryGoodsInfiniteScrollInit();
+	}else{
+		tag2 += '<input type="hidden" name="dcrateRow" value="'+min+'"/>\n';
+		tag2 += '<input type="hidden" name="dcrateHigh" value="'+max+'"/>\n';
+		$("#searchGoodsForm").append(tag2);
+		fnCategoryGoodsInfiniteScrollInit();
+	}
+
+	fnGoodsListSearch();
+}
+
+var fnDeleteFilterSlider = function (obj, gubun, minVal, maxVal){
+	if(gubun=='price'){
+		var $range = $(".dp .js-range-slider01, .sch_result .js-range-slider01");
+		var $inputFrom = $("#price_input_from");
+		var $inputTo = $("#price_input_to");
+		var instance;
+
+		instance = $range.data("ionRangeSlider");
+		instance.update({
+			from: 0
+		});
+		$inputFrom.val(minVal);
+
+		instance.update({
+			to: 5
+		});
+		$inputTo.prop("value",maxVal);
+		$("#searchGoodsForm input:hidden[name=priceRow]").remove();
+		$("#searchGoodsForm input:hidden[name=priceHigh]").remove();
+	}else{
+		var $range = $(".dp .js-range-slider02, .sch_result .js-range-slider02");
+		var $inputFrom = $("#dcrate_input_from");
+		var $inputTo = $("#dcrate_input_to");
+		var instance;
+
+		instance = $range.data("ionRangeSlider");
+		instance.update({
+			from: 0
+		});
+		$inputFrom.prop("value",minVal);
+
+		instance.update({
+			to: 10
+		});
+		$inputTo.prop("value",maxVal);
+		$("#searchGoodsForm input:hidden[name=dcrateRow]").remove();
+		$("#searchGoodsForm input:hidden[name=dcrateHigh]").remove();
+	}
+	$(obj).closest("span").remove();
+	fnCategoryGoodsInfiniteScrollInit();
+	fnGoodsListSearch();
+}
+
 //****************상품리스트  end **********************************

+ 0 - 1
src/main/webapp/ux/mo/css/common_m.css

@@ -1304,7 +1304,6 @@ button.alertCls {-webkit-appearance: none;padding: 0;cursor: pointer;background:
 /*alert confirm*/
 .dialog-mobile {
 	padding: 0;
-	margin-left: -45%;
 	text-align:center;
 	position: fixed;
 	top: 50%;

+ 115 - 0
src/main/webapp/ux/plugins/gaga/gaga.kollus.js

@@ -0,0 +1,115 @@
+/*
+ * Kollus video upload (https://support.catenoid.net/) Common Java Script written by gagamel.
+ *
+ * Copyright (c) 2021 gagamel
+ * Dual licensed under GPL (GPL-LICENSE.txt) licenses.
+ *
+ * $Date: 2021-04-16 $
+ * 
+ * 사용 예)
+ * 		// Kollus 동영상 업로드는 다음과 같이 처리된다.
+ * 		// 1. 동영상 업로드 URL를 조회
+ * 		//    조회 한 데이터 중에 upload_file_key 값이 나오며,
+ * 		//    DB 처리를 위해 이 값을 input hidden 변수(예, kufKey)를 만들어 설정한다.
+ * 		// 2. 동영상 업로드 URL의 upload_url로 실제 업로드가 수행된다. (uploadVideo 함수)
+ *		// 3. Kollus 어드민에 등록된 채널별 콜백URL로 업로드 결과가 보내지면, 그 데이터를 가지고 DB 처리를 한다.
+ * 		<input type="hidden" name="kufKey"/>
+ * 
+ * 		// Import할 자바스크립트 파일
+ * 		<script type="text/javascript" src="/ux/plugins/gaga/gaga.kollus.js"></script>
+ * 
+ * 		<script type="text/javascript">
+ * 			// 동영상파일 선택 시
+ * 			$('#detailForm input[name=file]').on('change', function() {
+ * 				var file = this.files[0];
+ * 				gagaKollus.upload('Goods', file, $('input[name=kufKey]'));
+ * 			});
+ *		</script>
+ */
+
+var gagaKollus = {
+	
+	/**
+	 * 업로드
+	 * @param cateNm - 카테고리명(상품:Goods, 리뷰:Review, 전시:Display). 필수
+	 * @param file - 업로드할 파일. 필수
+	 * @param callback - 콜백함수. 필수
+	 * @author gagamel
+	 * @since 2021. 4. 19
+	 */
+	upload : function(cateNm, file, tgt) {
+		// 업로드 URL 정보 얻기
+		$.ajax({
+			url: '/kollus/video/upload/url/' + cateNm,
+			method: 'POST',
+			ContentType: 'application/x-www-forurlencoded',
+		}).always(function (data, status, xhr) {
+			// Do nothing
+		}).done(function (data) {
+//			console.log('====================== RESPONSE =======================\n');
+//			console.log(JSON.stringify(data, null, 4) + '\n');
+			
+			// 업로드파일키 설정
+			$(tgt).val(data.result['upload_file_key']);
+			
+			// 동영상 업로드
+			gagaKollus.uploadVideo(data, file);
+		}).fail(function (xhr, status, err) {
+			console.log('====================== Fail =======================\n');
+			console.log('xhr: ', xhr + '\n');
+			console.log('status: ', status);
+			console.log('err: ', err);
+		});
+	},
+	
+	/**
+	 * 동영상 업로드
+	 * @param uploadUrlInfo - 업로드 URL 정보
+	 * @param file - 업로드할 파일
+	 * @author gagamel
+	 * @since 2021. 4. 19
+	 */
+	uploadVideo : function(uploadUrlInfo, file) {
+		var uploadUrl = uploadUrlInfo.result['upload_url'];
+		
+		var uploadData = new FormData();
+		uploadData.append("upload-file", file);
+		uploadData.append('disable_alert', '1'); // 결과 메시지를 alert 미출력
+		uploadData.append('redirection_scope', 'no'); // 업로드 완료 후 redirect할 domain scope을 지정(outer → window.top.location을 이용, inner → window.location을 이용, no → redirect 하지 않음)
+		uploadData.append('accept', 'application/json');
+
+		$.ajax({
+			url: uploadUrl,
+			method: 'POST',
+			mimeType: 'multipart/form-data',
+			cache: false,
+			contentType: false,
+			processData: false,
+			data: uploadData,
+			timeout: 0
+		}).always(function (data, status, xhr) {
+			// Do nothing
+		}).done(function (data) {
+			console.log('====================== RESPONSE =======================\n');
+			console.log(JSON.stringify(data, null, 4) + '\n');
+		}).fail(function (xhr, status, err) {
+			console.log('====================== Fail =======================\n');
+			console.log('xhr: ', xhr + '\n');
+			console.log('status: ', status);
+			console.log('err: ', err);
+		});
+		
+		// 진행상태 확인
+//		let progressUrl = uploadUrlInfo.result['progress_url'];
+//		let uploadInterval = setInterval(function() {
+//			$.get(progressUrl, function (data) {
+//				console.log(data);
+//				$('.progress-bar').css('width', data.result.progress + '%');
+//				if (data.result.progress >= 100) {
+//					clearInterval(uploadInterval);
+//				}
+//			});
+//		}, 1000);
+	}
+	
+}

+ 3 - 1
src/main/webapp/ux/style24_link.js

@@ -1055,15 +1055,17 @@ var cfnGoToOutletMain = function(cateGb, cate1No) {
  * @param  : cate3No - 카테고리3번호. 옵션
  * @param  : cate4No - 카테고리4번호. 옵션
  * @param  : cate5No - 카테고리5번호. 옵션
+ * @param  : formalGb - 정상이월구분. 옵션
  * @since  : 2021/03/22
  * @author : gagamel
  */
-var cfnGoToGoodsList = function(brandGroupNo, cateGb, cate1No, cate2No, cate3No, cate4No, cate5No) {
+var cfnGoToGoodsList = function(brandGroupNo, cateGb, cate1No, cate2No, cate3No, cate4No, cate5No, formalGb) {
 	var params = '?brandGroupNo=' + brandGroupNo + '&cateGb=' + cateGb + '&cate1No=' + cate1No;
 	if (typeof (cate2No) != 'undefined') params += '&cate2No=' + cate2No;
 	if (typeof (cate3No) != 'undefined') params += '&cate3No=' + cate3No;
 	if (typeof (cate4No) != 'undefined') params += '&cate4No=' + cate4No;
 	if (typeof (cate5No) != 'undefined') params += '&cate5No=' + cate5No;
+	if (typeof (formalGb) != 'undefined') params += '&formalGb=' + formalGb;
 	cfnGoToPage(_PAGE_CATE_GOODS_LIST + params);
 }