Просмотр исходного кода

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

jsh77b 5 лет назад
Родитель
Сommit
4b890e3947
55 измененных файлов с 2562 добавлено и 1391 удалено
  1. 31 1
      src/main/java/com/style24/front/biz/dao/TsfDisplayDao.java
  2. 8 1
      src/main/java/com/style24/front/biz/dao/TsfLoginDao.java
  3. 10 0
      src/main/java/com/style24/front/biz/dao/TsfOrderChangeDao.java
  4. 11 1
      src/main/java/com/style24/front/biz/dao/TsfPlanningDao.java
  5. 28 0
      src/main/java/com/style24/front/biz/service/TsfCartService.java
  6. 55 2
      src/main/java/com/style24/front/biz/service/TsfDisplayService.java
  7. 20 7
      src/main/java/com/style24/front/biz/service/TsfGoodsService.java
  8. 14 0
      src/main/java/com/style24/front/biz/service/TsfLoginService.java
  9. 21 0
      src/main/java/com/style24/front/biz/service/TsfOrderChangeService.java
  10. 30 29
      src/main/java/com/style24/front/biz/service/TsfPlanningService.java
  11. 78 0
      src/main/java/com/style24/front/biz/thirdparty/GoogleReCaptcha.java
  12. 7 7
      src/main/java/com/style24/front/biz/thirdparty/Yes24Login.java
  13. 53 13
      src/main/java/com/style24/front/biz/web/TsfDisplayController.java
  14. 42 6
      src/main/java/com/style24/front/biz/web/TsfIndexController.java
  15. 8 5
      src/main/java/com/style24/front/biz/web/TsfMypageController.java
  16. 24 19
      src/main/java/com/style24/front/biz/web/TsfPlanningController.java
  17. 3 3
      src/main/java/com/style24/front/support/security/TsfAuthenticationProvider.java
  18. 9 1
      src/main/java/com/style24/front/support/security/handler/TsfLoginFailureHandler.java
  19. 1 0
      src/main/java/com/style24/persistence/domain/Cart.java
  20. 4 0
      src/main/java/com/style24/persistence/domain/Cate4Srch.java
  21. 2 0
      src/main/java/com/style24/persistence/domain/Contents.java
  22. 2 1
      src/main/java/com/style24/persistence/domain/Goods.java
  23. 2 0
      src/main/java/com/style24/persistence/domain/MainLayout.java
  24. 5 0
      src/main/java/com/style24/persistence/domain/Plan.java
  25. 43 0
      src/main/java/com/style24/persistence/domain/Popup.java
  26. 2 0
      src/main/java/com/style24/persistence/domain/Review.java
  27. 1 0
      src/main/java/com/style24/persistence/domain/Social.java
  28. 3 0
      src/main/java/com/style24/persistence/domain/WishList.java
  29. 17 36
      src/main/java/com/style24/persistence/mybatis/shop/TsfCart.xml
  30. 106 2
      src/main/java/com/style24/persistence/mybatis/shop/TsfDisplay.xml
  31. 6 8
      src/main/java/com/style24/persistence/mybatis/shop/TsfGiftcard.xml
  32. 71 32
      src/main/java/com/style24/persistence/mybatis/shop/TsfGoods.xml
  33. 26 5
      src/main/java/com/style24/persistence/mybatis/shop/TsfLogin.xml
  34. 63 5
      src/main/java/com/style24/persistence/mybatis/shop/TsfOrderChange.xml
  35. 207 47
      src/main/java/com/style24/persistence/mybatis/shop/TsfPlanning.xml
  36. 6 6
      src/main/java/com/style24/persistence/mybatis/shop/TsfReview.xml
  37. 10 1
      src/main/java/com/style24/persistence/mybatis/shop/TsfSocial.xml
  38. 72 58
      src/main/java/com/style24/persistence/mybatis/shop/TsfWishlist.xml
  39. 7 0
      src/main/resources/config/application.yml
  40. 122 143
      src/main/webapp/WEB-INF/views/web/SigninFormWeb.html
  41. 83 66
      src/main/webapp/WEB-INF/views/web/cart/CartChangeOptionPopupWeb.html
  42. 34 42
      src/main/webapp/WEB-INF/views/web/cart/CartListAjaxFormWeb.html
  43. 113 0
      src/main/webapp/WEB-INF/views/web/common/fragments/FooterWeb.html
  44. 1 0
      src/main/webapp/WEB-INF/views/web/common/fragments/HeadWeb.html
  45. 2 2
      src/main/webapp/WEB-INF/views/web/common/layout/DefaultLayoutWeb.html
  46. 125 1
      src/main/webapp/WEB-INF/views/web/display/MallMainFormWeb.html
  47. 120 183
      src/main/webapp/WEB-INF/views/web/mypage/ChangeOptionPopupFormWeb.html
  48. 1 8
      src/main/webapp/WEB-INF/views/web/mypage/MypageReviewFormWeb.html
  49. 4 4
      src/main/webapp/WEB-INF/views/web/mypage/MypageWishListWeb.html
  50. 566 535
      src/main/webapp/WEB-INF/views/web/planning/PlanningDetailFormWeb.html
  51. 1 1
      src/main/webapp/WEB-INF/views/web/planning/PlanningMainFormWeb.html
  52. 1 1
      src/main/webapp/WEB-INF/views/web/social/SocialMainFormWeb.html
  53. 10 0
      src/main/webapp/biz/mypage.js
  54. 261 102
      src/main/webapp/ux/pc/css/layout.css
  55. 10 7
      src/main/webapp/ux/pc/css/main.css

+ 31 - 1
src/main/java/com/style24/front/biz/dao/TsfDisplayDao.java

@@ -4,7 +4,17 @@ import java.util.Collection;
 import java.util.List;
 
 import com.style24.core.support.annotation.ShopDs;
-import com.style24.persistence.domain.*;
+import com.style24.persistence.domain.BrandGroup;
+import com.style24.persistence.domain.Cate1;
+import com.style24.persistence.domain.Cate2;
+import com.style24.persistence.domain.Cate3;
+import com.style24.persistence.domain.Cate4;
+import com.style24.persistence.domain.Cate4Srch;
+import com.style24.persistence.domain.Cate5;
+import com.style24.persistence.domain.Contents;
+import com.style24.persistence.domain.GnbTab;
+import com.style24.persistence.domain.MainLayout;
+import com.style24.persistence.domain.Popup;
 
 /**
  * 전시 Dao
@@ -113,4 +123,24 @@ public interface TsfDisplayDao {
 	 * @date 2021. 3. 16
 	 */
 	Cate4Srch getCate4srch(Cate4Srch cate4Srch);
+	
+	/**
+	 * 팝업 목록
+	 *
+	 * @param keyword - 키워드정보
+	 * @return
+	 * @author eskim
+	 * @date 2021. 3. 30
+	 */
+	Collection<Popup> getPopupList(Popup popup);
+
+
+	/**
+	 * 몰메인 브랜드픽 조회
+	 * @param
+	 * @return
+	 * @author bin2107
+	 * @date 2021. 3. 31
+	 */
+	Collection<Contents> getContentsBannerList(Contents contents);
 }

+ 8 - 1
src/main/java/com/style24/front/biz/dao/TsfLoginDao.java

@@ -103,6 +103,13 @@ public interface TsfLoginDao {
 	 * @author gagamel
 	 * @since 2020. 6. 17
 	 */
-	void deletePersistentToken(String remembermeToken);
 
+	void deletePersistentToken(String remembermeToken);
+	/**
+	 * 로그인실패 건수가 10회 이상이고 3분 지났으면 실패횟수 초기화
+	 * @param login - 고객ID(=로그인ID)
+	 * @author jsshin
+	 * @since 2021. 03. 31
+	 */
+	void updateLoginFailInfo(Login login);
 }

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

@@ -68,4 +68,14 @@ public interface TsfOrderChangeDao {
 	 */
 	Collection<Order> getRefundPreInfo(OrderChange orderChange);
 
+	/**
+	 * 마이페이지 교환 옵션 정보 조회
+	 *
+	 * @param OrderChange
+	 * @return Collection<OrderChange>
+	 * @author card007
+	 * @since 2021. 03. 31
+	 */
+	Collection<OrderChange> getExchangeOptionInfo(OrderChange orderChange);
+
 }

+ 11 - 1
src/main/java/com/style24/front/biz/dao/TsfPlanningDao.java

@@ -215,7 +215,7 @@ public interface TsfPlanningDao {
 	 * @author sowon
 	 * @date 2021. 3. 23
 	 */
-	Collection<Plan> getPlanGoods1Info(Plan plan);
+	Collection<Plan> getPlanGoodsDisplayList(Plan plan);
 	
 
 	/**
@@ -227,6 +227,16 @@ public interface TsfPlanningDao {
 	 * @date 2021. 3. 30
 	 */
 	Collection<Plan> getPlanCornerList(Plan plan);
+	
+	/**
+	 * 기획전 코너 상품 리스트
+	 *
+	 * @param 
+	 * @return
+	 * @author sowon
+	 * @date 2021. 3. 31
+	 */
+	Collection<Plan> getPlanningCornerGoodsList(Plan plan);
 
 	/**
 	 * 이벤트 갯수 조회

+ 28 - 0
src/main/java/com/style24/front/biz/service/TsfCartService.java

@@ -789,6 +789,15 @@ public class TsfCartService {
 
 		// 장바구니 상품 마스터 정보 조회
 		Cart cart = cartDao.selectCartGoodsInfo(param);
+		if(cart == null) {
+			throw new IllegalArgumentException("장바구니 상품 정보가 없습니다.<br/>새로고침 후 다시 시도해주세요.");
+		}
+
+		if(TscConstants.GoodsStat.SOLDOUT.value().equals(cart.getGoodsStat())) {
+			cart.setSoldoutYn("Y");
+		} else {
+			cart.setSoldoutYn("N");
+		}
 
 		// 세트 상품일 경우
 		if(TscConstants.GoodsType.SET.value().equals(cart.getGoodsType())) {
@@ -796,7 +805,19 @@ public class TsfCartService {
 			for(Cart comp : cart.getCartCompsList()) {
 				comp.setCartSq(cart.getCartSq());
 				comp.setCartColorList(cartDao.selectCartGoodsColorList(comp));
+				if("Y".equals(cart.getSoldoutYn()) || TscConstants.GoodsStat.SOLDOUT.value().equals(comp.getGoodsStat())) {
+					comp.setSoldoutYn("Y");
+				} else {
+					comp.setSoldoutYn("N");
+				}
+
 				for(Cart color : comp.getCartColorList()) {
+					if("Y".equals(comp.getSoldoutYn()) || TscConstants.GoodsStat.SOLDOUT.value().equals(color.getGoodsStat())) {
+						color.setSoldoutYn("Y");
+					} else {
+						color.setSoldoutYn("N");
+					}
+
 					color.setCartSq(comp.getCartSq());
 					color.setCartSizeList(cartDao.selectCartGoodsSizeList(color));
 				}
@@ -807,9 +828,16 @@ public class TsfCartService {
 			cart.getCartCompsList().add(new Cart());
 
 			for(Cart comp : cart.getCartCompsList()) {
+				comp.setSoldoutYn(cart.getSoldoutYn());
 				comp.setCartColorList(cartDao.selectCartGoodsColorList(cart));
 
 				for(Cart color : comp.getCartColorList()) {
+					if("Y".equals(comp.getSoldoutYn()) || TscConstants.GoodsStat.SOLDOUT.value().equals(color.getGoodsStat())) {
+						color.setSoldoutYn("Y");
+					} else {
+						color.setSoldoutYn("N");
+					}
+
 					color.setCartSq(cart.getCartSq());
 					color.setCartImgList(cartDao.selectCartSelfGoodsOptionImgList(color));
 					color.setCartSizeList(cartDao.selectCartGoodsSizeList(color));

+ 55 - 2
src/main/java/com/style24/front/biz/service/TsfDisplayService.java

@@ -2,7 +2,6 @@ package com.style24.front.biz.service;
 
 import java.util.Collection;
 
-import com.style24.persistence.domain.*;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.cache.annotation.Cacheable;
 import org.springframework.stereotype.Service;
@@ -10,10 +9,21 @@ import org.springframework.stereotype.Service;
 import com.style24.core.biz.service.TscEnvsetService;
 import com.style24.core.support.env.TscConstants;
 import com.style24.front.biz.dao.TsfDisplayDao;
+import com.style24.front.biz.dao.TsfGoodsDao;
 import com.style24.front.support.env.TsfConstants;
+import com.style24.front.support.security.session.TsfSession;
+import com.style24.persistence.domain.BrandGroup;
+import com.style24.persistence.domain.Cate1;
+import com.style24.persistence.domain.Cate2;
+import com.style24.persistence.domain.Cate3;
+import com.style24.persistence.domain.Cate4;
+import com.style24.persistence.domain.Cate4Srch;
+import com.style24.persistence.domain.Contents;
+import com.style24.persistence.domain.GnbTab;
+import com.style24.persistence.domain.MainLayout;
+import com.style24.persistence.domain.Popup;
 
 import lombok.extern.slf4j.Slf4j;
-import sun.applet.Main;
 
 /**
  * 전시 Service
@@ -31,6 +41,9 @@ public class TsfDisplayService {
 	@Autowired
 	private TscEnvsetService envsetService;
 
+	@Autowired
+	private TsfGoodsDao goodsDao;
+
 	/**
 	 * GNB 브랜드그룹 목록
 	 * @param contents - 컨텐츠 정보
@@ -269,4 +282,44 @@ public class TsfDisplayService {
 	public Cate4Srch getCate4srch(Cate4Srch cate4Srch){
 		return displayDao.getCate4srch(cate4Srch);
 	}
+	
+	/**
+	 * 팝업 목록
+	 *
+	 * @param popup
+	 * @return
+	 * @author eskim
+	 * @date 2021. 3. 30
+	 */
+	public Collection<Popup> getPopupList(Popup popup) {
+		popup.setSiteCd(TscConstants.Site.STYLE24.value());
+		return displayDao.getPopupList(popup);
+	} 
+
+	/**
+	 * 몰메인 MD PICK 목록
+	 * @param
+	 * @return
+	 * @author bin2107
+	 * @date 2021. 3. 30
+	 */
+	public Collection<Contents> getContentsForGoods(Contents contents){
+		Collection<Contents> contentsList = displayDao.getContentsList(contents);
+		Cate4Srch tempContents = new Cate4Srch();
+		for(Contents data : contentsList){
+			tempContents.setContentsLoc(data.getContentsLoc());
+			tempContents.setDispOrd(data.getDispOrd());
+			tempContents.setMaxRow(20);
+			tempContents.setCustNo(TsfSession.isLogin() ? TsfSession.getInfo().getCustNo() : 0);
+			if("SMM007".equals(data.getContentsLoc())){
+				data.setBannerList(displayDao.getContentsBannerList(data));
+			}
+			data.setGoodsList(goodsDao.getContentsCategoryGoodsList(tempContents));
+		}
+
+		log.info("getContentsForGoods contentsList.size()::{}",contentsList.size());
+
+		return contentsList;
+
+	}
 }

+ 20 - 7
src/main/java/com/style24/front/biz/service/TsfGoodsService.java

@@ -251,6 +251,19 @@ public class TsfGoodsService {
 		}
 
 		if (param.getGoodsType().equals(TscConstants.GoodsType.SET.value())) {		// 세트상품이면 구성 상품코드로 조회
+			Goods compsInfo = new Goods();
+			compsInfo.setGoodsCd(param.getGoodsCd());
+			compsInfo.setCompsGoodsCd(param.getItemCd());
+			compsInfo.setGoodsType(param.getGoodsType());
+
+			compsInfo = goodsDao.getGoodsCompsInfo(compsInfo);						// 구성상품 정보 조회
+
+			if(TscConstants.GoodsStat.SOLDOUT.value().equals(compsInfo.getGoodsStat())) {
+				return compsInfo.getGoodsNm() + " 상품은 품절입니다.";
+			} else if (!TscConstants.GoodsStat.APPR.value().equals(compsInfo.getGoodsStat())) {
+				return compsInfo.getGoodsNm() + " 상품은 구매할 수 없습니다.";
+			}
+
 			GoodsStock stockCheck = new GoodsStock();								// 재고 조회 결과
 			stockCheck.setGoodsCd(param.getItemCd());
 			stockCheck.setOptCd(param.getOptCd());
@@ -261,14 +274,10 @@ public class TsfGoodsService {
 				return "재고체크 실패했습니다. 새로고침 후 다시 시도해주세요.";
 			}
 
-			Goods compsInfo = new Goods();
-			compsInfo.setGoodsCd(param.getGoodsCd());
-			compsInfo.setCompsGoodsCd(param.getItemCd());
-			compsInfo.setGoodsType(param.getGoodsType());
-
-			compsInfo = goodsDao.getGoodsCompsInfo(compsInfo);						// 구성상품 정보 조회
+			if("Y".equals(stockCheck.getSoldoutYn())) {
+				return stockCheck.getOptCd2() + " 옵션은 품절입니다.";
+			}
 
-			// 재고 체크
 			if (param.getGoodsQty() * compsInfo.getQty() > stockCheck.getCurrStockQty()) {
 				return compsInfo.getGoodsNm() + " 옵션의 재고가 충분하지 않습니다.";
 			}
@@ -283,6 +292,10 @@ public class TsfGoodsService {
 				return "재고체크 실패했습니다. 새로고침 후 다시 시도해주세요.";
 			}
 
+			if("Y".equals(stockCheck.getSoldoutYn())) {
+				return stockCheck.getOptCd2() + " 옵션은 품절입니다.";
+			}
+
 			if (param.getGoodsQty() > stockCheck.getCurrStockQty()) {
 				return "옵션의 재고가 충분하지 않습니다.";
 			}

+ 14 - 0
src/main/java/com/style24/front/biz/service/TsfLoginService.java

@@ -116,6 +116,20 @@ public class TsfLoginService {
 		return loginDao.getLoginFailInfo(login);
 	}
 
+	/**
+	 * 로그인실패 건수가 10회 이상이고 3분 지났으면 실패횟수 초기화
+	 * @param custId - 고객ID(=로그인ID)
+	 * @author jsshin
+	 * @since 2021. 03. 31
+	 */
+	public void updateLoginFailInfo(String custId) {
+		Login login = new Login();
+		login.setCustId(custId);
+		login.setIpAddr(TsfSession.getIpAddress());
+		login.setSiteCd(TscConstants.Site.STYLE24.value());
+		loginDao.updateLoginFailInfo(login);
+	}
+
 	/**
 	 * 로그인유지토큰 생성
 	 * @param custNo - 고객번호

+ 21 - 0
src/main/java/com/style24/front/biz/service/TsfOrderChangeService.java

@@ -196,4 +196,25 @@ public class TsfOrderChangeService {
 		return result;
 	}
 
+	/**
+	 * 마이페이지 교환 옵션 정보 조회
+	 *
+	 * @param OrderChange
+	 * @return Collection<OrderChange>
+	 * @author card007
+	 * @since 2021. 03. 31
+	 */
+	public Collection<OrderChange> getExchangeOptionInfo(OrderChange orderChange) {
+		Collection<OrderChange> exchangeOptionInfo = new ArrayList<>(); 
+		for (OrderChange tmpOrderChange : orderChangeDao.getExchangeOptionInfo(orderChange)) {
+			tmpOrderChange.setOptCd2Arr(tmpOrderChange.getChgOptCd2().split(","));
+			tmpOrderChange.setCurrStockQtyArr(tmpOrderChange.getChgCurrStockQty().split(","));
+			tmpOrderChange.setSoldoutYnArr(tmpOrderChange.getChgSoldoutYn().split(","));
+			
+			exchangeOptionInfo.add(tmpOrderChange);
+		}
+		
+		return exchangeOptionInfo;
+	}
+
 }

+ 30 - 29
src/main/java/com/style24/front/biz/service/TsfPlanningService.java

@@ -88,32 +88,18 @@ public class TsfPlanningService {
 	public Collection<Plan> getPlanningList(Plan plan) {
 		return planningDao.getPlanningList(plan);
 	}
+	
+	/**
+	 * 기획전 코너 상품 목록
+	 * @param plan - 기획전 정보
+	 * @return
+	 * @author sowon
+	 * @since 2021. 3. 31
+	 */
+	public Collection<Plan> getPlanningCornerGoodsList(Plan plan) {
+		return planningDao.getPlanningCornerGoodsList(plan);
+	}
 
-//	/**
-//	 * 기획전 목록
-//	 *
-//	 * @param
-//	 * @return
-//	 * @author sowon
-//	 * @since 2021. 3. 8
-//	 */
-//	public Collection<Plan> getPlanList(Plan plan) {
-//		//plan.setSiteCd(TsfConstants.SITE_CD);
-//		return planningDao.getPlanList(plan);
-//	}
-//
-//	/**
-//	 * 기획전 상품 목록
-//	 *
-//	 * @param
-//	 * @return
-//	 * @author sowon
-//	 * @since 2021. 3. 8
-//	 */
-//	public Collection<Plan> getPlanGoodsList(Plan plan) {
-//		//plan.setSiteCd(TsfConstants.SITE_CD);
-//		return planningDao.getPlanGoodsList(plan);
-//	}
 
 	/**
 	 * 접근 불가능한 기획전 메시지 조회
@@ -227,7 +213,10 @@ public class TsfPlanningService {
 	 * @since 2021. 3. 22
 	 */
 	public Collection<Plan> getPlanCouponInfo(Coupon coupon) {
-		coupon.setCustNo(TsfSession.getInfo().getCustNo());
+		if (TsfSession.isLogin()) {
+			coupon.setCustNo(TsfSession.getInfo().getCustNo());
+		}
+		
 		return planningDao.getPlanCouponInfo(coupon);
 	}
 
@@ -244,15 +233,27 @@ public class TsfPlanningService {
 	}
 
 	/**
-	 * 기획전 템플릿 상품1열
+	 * 기획전 템플릿 상품
 	 *
 	 * @param
 	 * @return
 	 * @author sowon
 	 * @since 2021. 3. 22
 	 */
-	public Collection<Plan> getPlanGoods1Info(Plan plan) {
-		return planningDao.getPlanGoods1Info(plan);
+	public Collection<Plan> getPlanGoodsDisplayList(Plan plan) {
+		return planningDao.getPlanGoodsDisplayList(plan);
+	}
+	
+	/**
+	 * 기획전 코너 리스트
+	 *
+	 * @param 기획전 번호
+	 * @return
+	 * @author sowon
+	 * @date 2021. 3. 30
+	 */
+	public Collection<Plan> getPlanCornerList(Plan plan){
+		return planningDao.getPlanCornerList(plan);
 	}
 
 	/**

+ 78 - 0
src/main/java/com/style24/front/biz/thirdparty/GoogleReCaptcha.java

@@ -0,0 +1,78 @@
+package com.style24.front.biz.thirdparty;
+
+import com.gagaframework.web.parameter.GagaMap;
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.env.Environment;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Component;
+import org.springframework.util.LinkedMultiValueMap;
+import org.springframework.util.MultiValueMap;
+import org.springframework.web.client.RestTemplate;
+
+import javax.annotation.PostConstruct;
+import java.net.URI;
+
+@Component
+@Slf4j
+public class GoogleReCaptcha {
+	@Autowired
+	private Environment env;
+
+	@Autowired
+	private RestTemplate restTemplate;
+
+	private String siteKey;
+	private String secretKey;
+	private String verifyUrl;
+
+	@PostConstruct
+	public void init() {
+		siteKey = env.getProperty("google.siteKey");
+		secretKey = env.getProperty("google.secretKey");
+		verifyUrl = env.getProperty("google.recaptchaVerifyUrl");
+
+		log.info("\n\n---- Google initialization started ----");
+		log.info("siteKey: [{}]", siteKey);
+		log.info("secretKey: [{}]", secretKey);
+		log.info("verifyUrl: [{}]", verifyUrl);
+		log.info("\n--- Google initialization completed ----\n");
+	}
+
+	public GagaMap getVerify(String token) {
+		GagaMap resultMap = new GagaMap();
+		try {
+			MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
+			params.add("secret", secretKey);
+			params.add("response", token);
+
+			// Header
+			HttpHeaders headers = new HttpHeaders();
+			headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
+
+			HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<>(params, headers);
+			URI url = URI.create(verifyUrl);
+
+			// POST방식으로 호출
+			ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, request, String.class);
+			log.info("responseEntity.getStatusCode(): {} ", responseEntity.getStatusCode());
+
+			String jsonResult = responseEntity.getBody();
+			log.info("responseEntity.getBody(): {} ", jsonResult);
+
+			Gson gson = new GsonBuilder().create();
+			resultMap = gson.fromJson(jsonResult, GagaMap.class);
+		} catch (Exception e) {
+			log.error(e.getMessage());
+		}
+		return  resultMap;
+	}
+
+
+
+}

+ 7 - 7
src/main/java/com/style24/front/biz/thirdparty/Yes24Login.java

@@ -69,13 +69,13 @@ public class Yes24Login {
 		unlinkUrl = env.getProperty("yes24.unlinkUrl");
 
 		log.debug("\n\n---- YES24 initialization started ----");
-		log.info("id: [{}]", id);
-		log.info("type: [{}]", type);
-		log.info("requestUrl: [{}]", requestUrl);
-		log.info("callBackUrl: [{}]", callBackUrl);
-		log.info("userInfoUrl: [{}]", userInfoUrl);
-		log.info("linkUrl: [{}]", linkUrl);
-		log.info("unlinkUrl: [{}]", unlinkUrl);
+		log.debug("id: [{}]", id);
+		log.debug("type: [{}]", type);
+		log.debug("requestUrl: [{}]", requestUrl);
+		log.debug("callBackUrl: [{}]", callBackUrl);
+		log.debug("userInfoUrl: [{}]", userInfoUrl);
+		log.debug("linkUrl: [{}]", linkUrl);
+		log.debug("unlinkUrl: [{}]", unlinkUrl);
 		log.debug("\n--- YES24 initialization completed ----\n");
 	}
 

+ 53 - 13
src/main/java/com/style24/front/biz/web/TsfDisplayController.java

@@ -7,18 +7,6 @@ import java.util.HashMap;
 
 import javax.servlet.http.HttpServletResponse;
 
-import com.gagaframework.web.parameter.GagaMap;
-import com.style24.core.support.env.TscConstants;
-import com.style24.front.support.security.session.TsfSession;
-import com.style24.persistence.domain.BrandGroup;
-import com.style24.persistence.domain.Cate4Srch;
-import com.style24.persistence.domain.Contents;
-import com.style24.persistence.domain.GnbTab;
-import com.style24.persistence.domain.Goods;
-import com.style24.persistence.domain.Lookbook;
-import com.style24.persistence.domain.MainLayout;
-import com.style24.persistence.domain.Plan;
-import com.style24.persistence.domain.Social;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.mobile.device.Device;
@@ -29,14 +17,25 @@ import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.ResponseBody;
 import org.springframework.web.servlet.ModelAndView;
 
-import com.style24.front.biz.service.TsfSocialService;
 import com.style24.core.biz.service.TscEnvsetService;
 import com.style24.core.biz.service.TscLookbookService;
 import com.style24.core.support.message.TscMessageByLocale;
 import com.style24.front.biz.service.TsfDisplayService;
 import com.style24.front.biz.service.TsfGoodsService;
 import com.style24.front.biz.service.TsfPlanningService;
+import com.style24.front.biz.service.TsfSocialService;
 import com.style24.front.support.controller.TsfBaseController;
+import com.style24.front.support.security.session.TsfSession;
+import com.style24.persistence.domain.BrandGroup;
+import com.style24.persistence.domain.Cate4Srch;
+import com.style24.persistence.domain.Contents;
+import com.style24.persistence.domain.GnbTab;
+import com.style24.persistence.domain.Goods;
+import com.style24.persistence.domain.Lookbook;
+import com.style24.persistence.domain.MainLayout;
+import com.style24.persistence.domain.Plan;
+import com.style24.persistence.domain.Popup;
+import com.style24.persistence.domain.Social;
 
 import lombok.extern.slf4j.Slf4j;
 
@@ -134,6 +133,14 @@ public class TsfDisplayController extends TsfBaseController {
 				mainLayout.setSocialInfo(socialService.getSocialForGoods(social));
 			}
 
+			if(contentsLoc.equals("SMM007")){
+				mainLayout.setBrandPickList(displayService.getContentsForGoods(contents));
+			}
+
+			if(contentsLoc.equals("SMM009")){
+				mainLayout.setMdPickList(displayService.getContentsForGoods(contents));
+			}
+
 			mainLayoutList.add(mainLayout);
 		}
 
@@ -281,6 +288,12 @@ public class TsfDisplayController extends TsfBaseController {
 			}
 			brandMainLayoutList.add(brandMain);
 		}
+		
+		mav.addObject("preview", paramMap.get("preview") );
+		mav.addObject("viewDt", paramMap.get("viewDt"));
+		mav.addObject("viewPage", "G037_31");
+		mav.addObject("popupCateNo", paramMap.get("brandGroupNo"));
+		
 		//log.info("brandMainLayoutList::{}", brandMainLayoutList);
 		mav.addObject("brandMainLayoutList", brandMainLayoutList);
 		mav.setViewName(super.getDeviceViewName("display/BrandMainForm"));
@@ -329,6 +342,11 @@ public class TsfDisplayController extends TsfBaseController {
 		cate.setMaxRow(20);
 		mav.addObject("bestGoodsList", goodsService.getContentsCategoryGoodsList(cate));
 
+		mav.addObject("preview", cate.getPreview() );
+		mav.addObject("viewDt", cate.getViewDt());
+		mav.addObject("viewPage", "G037_30");
+		mav.addObject("popupCateNo", cate.getCate1No());
+		
 		mav.addObject("params", cate);
 
 		return mav;
@@ -362,4 +380,26 @@ public class TsfDisplayController extends TsfBaseController {
 		return coreLookbookService.getLookbookList(lookbook);
 	}
 
+	/**
+	 * 팝업 목록
+	 *
+	 * @return
+	 * @throws Exception
+	 * @author eskim
+	 * @since 2021. 3. 30
+	 */
+	@GetMapping("/popup/list")
+	@ResponseBody
+	public Collection<Popup> getPopupList(@RequestParam HashMap<String, String> paramMap) {
+		Popup popup = new Popup();
+		popup.setFrontGb(TsfSession.getFrontGb());
+		popup.setViewPage(paramMap.get("viewPage"));
+		if (paramMap.get("cateNo") != null && paramMap.get("cateNo") != "") {
+			popup.setCateNo(Integer.parseInt(paramMap.get("cateNo")));
+		}
+		popup.setPlanSq(paramMap.get("planSq"));
+		popup.setPreview(paramMap.get("preview"));
+		popup.setViewDt(paramMap.get("viewDt"));
+		return displayService.getPopupList(popup);
+	}
 }

+ 42 - 6
src/main/java/com/style24/front/biz/web/TsfIndexController.java

@@ -8,13 +8,16 @@ import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import javax.servlet.http.HttpSession;
 
+import com.style24.front.biz.thirdparty.GoogleReCaptcha;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.core.env.Environment;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
 import org.springframework.web.servlet.ModelAndView;
 
 import com.fasterxml.jackson.databind.ObjectMapper;
@@ -61,6 +64,9 @@ public class TsfIndexController extends TsfBaseController {
 	@Autowired
 	private Yes24Login yes24Login;
 
+	@Autowired
+	private GoogleReCaptcha googleReCaptcha;
+
 	@Autowired
 	private ObjectMapper objectMapper;
 
@@ -139,9 +145,10 @@ public class TsfIndexController extends TsfBaseController {
 
 	/**
 	 * 로그인 페이지
-	 * @param error - 로그인 오류 정보
+	 *
+	 * @param isError - 오류여부
 	 * @param session - HttpSession
-	 * @return
+	 * @return ModelAndView
 	 * @author gagamel
 	 * @throws IOException
 	 * @since 2020. 2. 4
@@ -163,6 +170,7 @@ public class TsfIndexController extends TsfBaseController {
 		}
 
 		mav.addObject("front", env.getProperty("domain.front"));
+		mav.addObject("sitekey", env.getProperty("google.sitekey"));
 
 		// 로그인 페이지로
 		mav.setViewName(super.getDeviceViewName("SigninForm"));
@@ -228,7 +236,8 @@ public class TsfIndexController extends TsfBaseController {
 	 * @since 2021. 02. 23
 	 */
 	@GetMapping("/signin/yes24login")
-	public String signinYes24Login(@RequestParam(value = "rememberMe", required = false) String rememberMe, @RequestParam(value = "requestGb", required = false) String requestGb) {
+	public String signinYes24Login(@RequestParam(value = "rememberMe", required = false) String rememberMe
+			, @RequestParam(value = "requestGb", required = false) String requestGb) {
 
 		if (StringUtils.isNotBlank(rememberMe)) {
 			// RememberMe 세션 저장
@@ -246,7 +255,7 @@ public class TsfIndexController extends TsfBaseController {
 	}
 
 	/**
-	 * SNS 로그인
+	 * SNS 로그인 콜백
 	 *
 	 * @param session - HttpSession
 	 * @param snsType - SNS유형(NV:네이버, KK:카카오)
@@ -255,7 +264,9 @@ public class TsfIndexController extends TsfBaseController {
 	 * @since 2021. 02. 23
 	 */
 	@RequestMapping("/signin/snsLoginCallback")
-	public ModelAndView signinSnsLoginCallback(@RequestParam(value = "snsType", required = false) String snsType, HttpSession session, @RequestParam(value = "code", required = false) String code, @RequestParam(value = "state", required = false) String state, @RequestParam(value = "error", required = false) boolean isError, HttpServletRequest request) {
+	public ModelAndView signinSnsLoginCallback(@RequestParam(value = "snsType", required = false) String snsType, HttpSession session
+			, @RequestParam(value = "code", required = false) String code, @RequestParam(value = "state", required = false) String state
+			, @RequestParam(value = "error", required = false) boolean isError, HttpServletRequest request) {
 
 		ModelAndView mav = new ModelAndView();
 
@@ -331,8 +342,17 @@ public class TsfIndexController extends TsfBaseController {
 		return mav;
 	}
 
+	/**
+	 * SNS - YES24 로그인 콜백URL
+	 *
+	 * @param ipin - Yes24넘겨 주는 암호화된 값:날짜|CI
+	 * @param session - Yes24넘겨받은 정보 세션저장
+	 * @return ModelAndView
+	 * @author jsshin
+	 * @since 2021. 02. 23
+	 */
 	@RequestMapping("/signin/yes24LoginCallback")
-	public ModelAndView yes24LoginCallback(@RequestParam("ipin") String ipin, HttpSession session, HttpServletRequest request) {
+	public ModelAndView yes24LoginCallback(@RequestParam("ipin") String ipin, HttpSession session) {
 		ModelAndView mav = new ModelAndView();
 		boolean isSnsLoing = false;
 		GagaMap userInfo = new GagaMap();
@@ -375,4 +395,20 @@ public class TsfIndexController extends TsfBaseController {
 		return mav;
 	}
 
+	/**
+	 * 구글 리캡챠 확인
+	 *
+	 * @param request - HttpServletRequest
+	 * @return GagaMap
+	 * @author jsshin
+	 * @since 2021. 03. 31
+	 */
+	@PostMapping("/verify/recaptcha")
+	@ResponseBody
+	public GagaMap verfyRecaptcha(HttpServletRequest request) {
+		String token = request.getParameter("token");
+		log.info("token {}", token);
+		return googleReCaptcha.getVerify(token);
+	}
+
 }

+ 8 - 5
src/main/java/com/style24/front/biz/web/TsfMypageController.java

@@ -384,20 +384,20 @@ public class TsfMypageController extends TsfBaseController {
 	 */
 	@PostMapping("/change/option/popup/form")
 	@ResponseBody
-	public ModelAndView changeOptionPopupForm(Order order) {
+	public ModelAndView changeOptionPopupForm(OrderChange orderChange) {
 		ModelAndView mav = new ModelAndView();
 
 		// custNo 설정
 		if (TsfSession.isLogin()) {
-			order.setCustNo(TsfSession.getInfo().getCustNo());
+			orderChange.setCustNo(TsfSession.getInfo().getCustNo());
 		} else {
-			order.setCustNo(0);
+			orderChange.setCustNo(0);
 		}
 
 		// 교환 옵션 정보 조회
-		
+		mav.addObject("exchangeOptionInfo", orderChangeService.getExchangeOptionInfo(orderChange));
+		mav.addObject("chgQty", orderChange.getChgQty());
 
-		// mav.addObject("exchangeOptionInfo", );
 		mav.setViewName(super.getDeviceViewName("mypage/ChangeOptionPopupForm"));
 
 		return mav;
@@ -1148,6 +1148,9 @@ public class TsfMypageController extends TsfBaseController {
 	@GetMapping("/wish/list")
 	public ModelAndView mypageWishGoodsList(WishList wishList) {
 		ModelAndView mav = new ModelAndView();
+		wishList.setSiteCd(TscConstants.Site.STYLE24.value());
+		wishList.setFrontGb(TsfSession.getFrontGb());
+		wishList.setCustGb(TsfSession.getCustGb());
 		// 위시리스트 달
 		mav.addObject("wishMonth", wishListService.getWishListMonth(wishList));
 		// 위시리스트 상품목록

+ 24 - 19
src/main/java/com/style24/front/biz/web/TsfPlanningController.java

@@ -124,32 +124,32 @@ public class TsfPlanningController extends TsfBaseController {
 	 * @since 2021. 3. 9
 	 */
 	@GetMapping("/detail/form")
-	@ResponseBody
-	public ModelAndView PlanningDetailForm(@RequestParam(value = "planSq") int planSq) {
+	public ModelAndView PlanningDetailForm(Plan plan) {
 		ModelAndView mav = new ModelAndView();
-
+		
 		// 접근 불가능한 기획전 메시지 조회
-		String inaccessibleMsg = planningService.getInaccessiblePlanningMessage(planSq);
+		String inaccessibleMsg = planningService.getInaccessiblePlanningMessage(plan.getPlanSq());
 		if (StringUtils.isNotBlank(inaccessibleMsg)) {
 			mav.addObject("inaccessibleMsg", inaccessibleMsg);
 			mav.setViewName(super.getDeviceViewName("error/Inaccess"));
 			return mav;
 		}
 
-		Plan plan = new Plan();
 		Review review = new Review();
 		Coupon coupon = new Coupon();
 
 		plan.setSiteCd(TscConstants.Site.STYLE24.value());
 		plan.setFrontGb(TsfSession.getFrontGb());
 		plan.setCustGb(TsfSession.getCustGb());
+		review.setFrontGb(TsfSession.getFrontGb());
+		review.setCustGb(TsfSession.getCustGb());
 		plan.setCustNo(TsfSession.isLogin() ? TsfSession.getInfo().getCustNo() : 0);
 
 		// 기본 set
-		plan.setExceptPlanSq(planSq);
-		plan.setPlanSq(planSq);
-		review.setPlanSq(planSq);
-		coupon.setPlanSq(planSq);
+		plan.setExceptPlanSq(plan.getPlanSq());
+		plan.setPlanSq(plan.getPlanSq());
+		review.setPlanSq(plan.getPlanSq());
+		coupon.setPlanSq(plan.getPlanSq());
 
 		//plan.setSiteCd(TscConstants.Site.STYLE24.value());
 		plan.setFrontGb(TsfSession.getFrontGb());
@@ -178,26 +178,31 @@ public class TsfPlanningController extends TsfBaseController {
 
 		// 이미지
 		mav.addObject("imageInfo", planningService.getPlanImageInfo(plan));
-
+		
+		plan.setFrontGb(TsfSession.getFrontGb());
 		// 상품1열 전시
 		plan.setTmplType("G082_50");
-		mav.addObject("goods1Info", planningService.getPlanGoods1Info(plan));
+		mav.addObject("goods1Info", planningService.getPlanGoodsDisplayList(plan));
 
 		// 상품2열 전시
 		plan.setTmplType("G082_51");
-		mav.addObject("goods2Info", planningService.getPlanGoods1Info(plan));
+		mav.addObject("goods2Info", planningService.getPlanGoodsDisplayList(plan));
 
 		//상품4열 전시
 		plan.setTmplType("G082_52");
-		mav.addObject("goods4Info", planningService.getPlanGoods1Info(plan));
+		mav.addObject("goods4Info", planningService.getPlanGoodsDisplayList(plan));
 
 		// 다른기획전 보기 
+		
 		mav.addObject("planList", planningService.getPlanningList(plan));
 //
 //		mav.addObject("couponList", planningService.getPlusCouponList(plan));
 //
-//		// 기획전 상세 및 코너 목록
-//		mav.addObject("planCornerList", planningService.getPlanCornerList(plan));
+//		// 기획전  코너 목록
+		mav.addObject("planCornerList", planningService.getPlanCornerList(plan));
+		
+		// 기획전 코너 상품
+		mav.addObject("planCornerGoodsList", planningService.getPlanningCornerGoodsList(plan));
 //
 //		// 특가세일 기준
 //		mav.addObject("specialPriceSaleRate", policyService.getSpecialPriceSaleDisplayRate(TsfConstants.SITE_CD));
@@ -209,10 +214,10 @@ public class TsfPlanningController extends TsfBaseController {
 //		}
 
 		// Popup Parameter
-//		mav.addObject("preview", plan.getPreview());
-//		mav.addObject("viewDt", plan.getViewDt());
-//		mav.addObject("viewPage", "40");
-//		mav.addObject("popupPlanSq", plan.getPlanSq());
+		mav.addObject("preview", plan.getPreview());
+		mav.addObject("viewDt", plan.getViewDt());
+		mav.addObject("viewPage", "G037_40");
+		mav.addObject("popupPlanSq", plan.getPlanSq());
 
 		mav.setViewName(super.getDeviceViewName("planning/PlanningDetailForm"));
 		return mav;

+ 3 - 3
src/main/java/com/style24/front/support/security/TsfAuthenticationProvider.java

@@ -86,9 +86,9 @@ public class TsfAuthenticationProvider implements AuthenticationProvider {
 		}
 
 		// 로그인 실패누적건수가 5회 이상이면
-		if (loginInfo.getLoginFailCnt() >= LOGIN_FAIL_COUNT) {
-			throw new TsfLockedAccountException(message.getMessage("LOGN_0005"));
-		}
+//		if (loginInfo.getLoginFailCnt() >= LOGIN_FAIL_COUNT) {
+//			throw new TsfLockedAccountException(message.getMessage("LOGN_0005"));
+//		}
 
 		/// SNS로그인이 아닌 일반로그인 이면
 		if (!loginId.startsWith(TsfConstants.SNSLOGIN_PREFIX)) {

+ 9 - 1
src/main/java/com/style24/front/support/security/handler/TsfLoginFailureHandler.java

@@ -7,6 +7,7 @@ import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
 import com.style24.front.support.exception.TsfNonCertificationAccountException;
+import com.style24.persistence.domain.Login;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.core.AuthenticationException;
 import org.springframework.security.web.authentication.AuthenticationFailureHandler;
@@ -64,8 +65,15 @@ public class TsfLoginFailureHandler implements AuthenticationFailureHandler {
 			result.setString("status", "ETC_ERROR");
 		}
 
+		Login loginFailInfo = loginService.getLoginFailInfo(request.getParameter("loginId"));
+
+		// 실패 횟수 10회 이상이면서 3분 지난경우 초기화 해준다.
+		if (loginFailInfo.getLoginFailCnt() >= 10 && loginFailInfo.getBlockSecs() <= 0) {
+			loginService.updateLoginFailInfo(request.getParameter("loginId"));
+		}
 		// 로그인실패정보 조회
-		result.set("loginFailInfo", loginService.getLoginFailInfo(request.getParameter("loginId")));
+		result.set("loginFailInfo", loginFailInfo);
+
 
 		GagaStringUtil.write(response, result);
 	}

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

@@ -70,6 +70,7 @@ public class Cart extends TscBaseDomain {
 	private String imgPath;			// 상품 이미지 경로
 	private String soldoutYn;		// 옵션
 	private String frontGb;			// 접속 디바이스 정보
+	private String goodsStat;		// 상품상태
 
 	// 장바구니 상품 정보 리스트
 	Collection<Cart> cartCompsList;		// 장바구니 상품 구성 상품리스트

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

@@ -44,5 +44,9 @@ public class Cate4Srch extends TscBaseDomain {
 	private String custGb;				// 고객구분
 	private int maxRow;					// 최대ROW수
 	private String[] exceptGoodsArr;	// 제외상품배열
+	
+	private String dispDt;			// 기획전 기간
+	private String viewDt;			// 미리보기 일시
+	private String preview;			// 미리보기 여부 (Y:미리보기)
 
 }

+ 2 - 0
src/main/java/com/style24/persistence/domain/Contents.java

@@ -64,4 +64,6 @@ public class Contents extends TscBaseDomain {
 
 	private Collection<Cate1> cateList;	// 카테고리목록
 
+	private Collection<Goods> goodsList;	// 카테고리목록
+	private Collection<Contents> bannerList;	// 카테고리목록
 }

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

@@ -71,7 +71,8 @@ public class Goods extends TscBaseDomain {
 	private String newCustOrdYn;		//신규고객 구매가능여부(Y:신규고객만 구매가능)
 	private int costPrice;		//원가
 	private String adultYn;		//성인용품여부
-
+	private String sellStdt;		//판매시작일
+	private String sellEddt;		//판매종료일
 	private String colorCd;		//색상코드
 	private String colorNm;		//색상코드명
 	private String brandNm;		//브랜드명

+ 2 - 0
src/main/java/com/style24/persistence/domain/MainLayout.java

@@ -32,5 +32,7 @@ public class MainLayout extends TscBaseDomain {
     private Collection<Lookbook> lookbookList;
     private Collection<Plan> planningList;
     private Social socialInfo;
+    private Collection<Contents> mdPickList;
+    private Collection<Contents> brandPickList;
 
 }

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

@@ -89,6 +89,9 @@ public class Plan extends TscBaseDomain {
 	private String planDtlStat;		//기획전상세상태(공통코드G044)
 	private String copyBrandCd;		//복사할 브랜드코드
 	private String adminPreview;	// 어드민미리보기 여부 (Y:미리보기)
+	private String dispDt;			// 기획전 기간
+	private String viewDt;			// 미리보기 일시
+	private String preview;			// 미리보기 여부 (Y:미리보기)
 
 	// 기획전 브랜드
 	private Integer brandGroupNo;	//기획전브랜드그룹번호
@@ -104,6 +107,7 @@ public class Plan extends TscBaseDomain {
 	private String cateGb;			// 카테고리구분
 	private String cateNm;			// 카테고리명
 	private Integer cateNo;			// 카테고리번호
+	private String brandGroupNm;	// 브랜드 그룹 이름
 
 	// 고객등급
 	private String custGradeName;	// 접근가능고객 등급 네임
@@ -138,6 +142,7 @@ public class Plan extends TscBaseDomain {
 	private String[] goodsCdArr;		// 상품 코드 배열
 	private String goodsCd;				// 상품 코드
 	private String goodsNm;				// 상품 명
+	private String goodsTnm;			// 상품 타이틀 명
 	private String goodsStat;			// 제품상태
 	private String imgType;				// 이미지 타입
 	private String imgPath1;			// 이미지 경로1

+ 43 - 0
src/main/java/com/style24/persistence/domain/Popup.java

@@ -0,0 +1,43 @@
+package com.style24.persistence.domain;
+
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Data;
+
+/**
+ * 팝업 Domain
+ *
+ * @author eskim
+ * @since 2021.03.30
+ */
+@SuppressWarnings("serial")
+@Data
+public class Popup extends TscBaseDomain {
+
+	private String popupSq;
+	private String siteCd;
+	private String frontGb;
+	private String popupGb;
+	private String imgUrl1;
+	private String linkUrl1;
+	private String imgUrl2;
+	private String linkUrl2;
+	private String imgUrl3;
+	private String linkUrl3;
+	private String imgUrl4;
+	private String linkUrl4;
+	private String imgUrl15;
+	private String linkUrl15;
+	private String viewPage;
+	private Integer cateNo;
+	private String planSq;
+	private Integer dispOrd;
+	private String preview = "N";
+	private String viewDt;
+	private Integer topLoc;
+	private Integer leftLoc;
+	private String popupWidth;
+	private String popupHeight;
+	private Integer unexpDays;
+
+}

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

@@ -49,6 +49,8 @@ public class Review extends TscBaseDomain {
 	private String admRpl;			// 관리자댓글
 	private int admRplRegNo;		// 댓글등록자번호
 	private String admRplDt;		// 관리자댓글등록일시
+	private String frontGb;			
+	private String custGb;
 	
 	private String custId;			// 고객ID
 	private String sysImgNm;		// 상품대표이미지

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

@@ -80,6 +80,7 @@ public class Social extends TscBaseDomain{
 
 		// 몰메인
 		Collection<Social> socialGoodsList;
+		private String likeIt;	// 위시리스트에 담긴 상품
 		
 		// Pagination
 		private TscPageRequest pageable;

+ 3 - 0
src/main/java/com/style24/persistence/domain/WishList.java

@@ -22,6 +22,9 @@ public class WishList extends TscBaseDomain {
 	private String contentsLoc;
 	private Integer planDtlSq;
 	private String regDt;
+	private String siteCd;
+	private String frontGb;
+	private String custGb;
 	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
 	private String[] arrGoodsCd;
 

+ 17 - 36
src/main/java/com/style24/persistence/mybatis/shop/TsfCart.xml

@@ -539,7 +539,6 @@
 		             , G.PNT_PRATE
 		             , G.PNT_MRATE
 		             , STOCK.SOLDOUT_YN
-		             , CASE WHEN STOCK.ORD_CAN_YN = 'N' AND GRADE_YN.ORD_CAN_YN = 'N' THEN 'N' ELSE 'Y' END AS ORD_CAN_YN
 		             , FN_GET_APPLY_CPN1_PRICE(C.GOODS_CD, #{frontGb}) AS CURR_PRICE
 		             , G.LIST_PRICE
 		             , IFNULL(O.ADD_PRICE, 0) AS OPT_ADD_PRICE
@@ -554,6 +553,14 @@
 		             , CASE WHEN GQDS.GOODS_CD IS NULL AND G.SELF_GOODS_YN = 'Y' THEN 'SHOT'
 		                    WHEN G.SELF_GOODS_YN = 'Y' THEN 'WMS'
 		                    ELSE DFP.DELV_FEE_CD END AS CART_DELV_FEE_CD
+		             , CASE WHEN STOCK.ORD_CAN_YN = 'Y' AND (SELECT  CASE WHEN Z.CNT1 = 0 THEN 'Y' ELSE CASE WHEN CNT2 > 0 THEN 'Y'
+		                                                                                                     ELSE 'N' END END
+		                                                     FROM    (SELECT COUNT(1) AS CNT1
+		                                                                   , CASE WHEN GOG.CUST_GRADE = CT.CUST_GRADE THEN 1
+		                                                                          ELSE 0 END AS CNT2
+		                                                              FROM   TB_GOODS_ORDER_GRADE GOG
+		                                                              WHERE  GOG.GOODS_CD = C.GOODS_CD) Z ) = 'Y' THEN 'Y'
+		                    ELSE 'N' END AS ORD_CAN_YN
 		             , CASE WHEN C.CUST_NO > 0 AND (SELECT IFNULL(SUM(OD.ORD_QTY), 0)
 		                                            FROM   TB_ORDER_DETAIL OD
 		                                            INNER  JOIN TB_ORDER O
@@ -580,36 +587,8 @@
 		        INNER  JOIN TB_OPTION O
 		        ON     CD.ITEM_CD = O.GOODS_CD
 		        AND    CD.OPT_CD = O.OPT_CD
-		        LEFT   OUTER JOIN (SELECT A.CART_SQ
-		                                , MAX(A.ORD_CAN_YN) AS ORD_CAN_YN
-		                           FROM   (SELECT A.CART_SQ
-		                                        , CASE WHEN (GOODS_ALL_CNT > 0 AND GOODS_GRADE_CNT = 0) OR (ITEM_ALL_CNT > 0 AND ITEM_GRADE_CNT = 0) THEN 'N'
-		                                               ELSE 'Y' END AS ORD_CAN_YN
-		                                   FROM   (SELECT C.CART_SQ
-		                                                , C.GOODS_CD
-		                                                , CD.ITEM_CD
-		                                                , (SELECT COUNT(1) FROM TB_GOODS_ORDER_GRADE WHERE GOODS_CD = C.GOODS_CD) AS GOODS_ALL_CNT
-		                                                , CASE WHEN C.CUST_NO = 0 THEN 0
-		                                                       ELSE (SELECT COUNT(1) FROM TB_GOODS_ORDER_GRADE GOG INNER JOIN TB_CUSTOMER CT ON GOG.CUST_GRADE = CT.CUST_GRADE WHERE GOODS_CD = C.GOODS_CD AND CT.CUST_NO = C.CUST_NO) END AS GOODS_GRADE_CNT
-		                                                , (SELECT COUNT(1) FROM TB_GOODS_ORDER_GRADE WHERE GOODS_CD = CD.ITEM_CD) AS ITEM_ALL_CNT
-		                                                , CASE WHEN C.CUST_NO = 0 THEN 0
-		                                                       ELSE (SELECT COUNT(1) FROM TB_GOODS_ORDER_GRADE GOG INNER JOIN TB_CUSTOMER CT ON GOG.CUST_GRADE = CT.CUST_GRADE WHERE GOODS_CD = CD.ITEM_CD AND CT.CUST_NO = C.CUST_NO) END AS ITEM_GRADE_CNT
-		                                           FROM   TB_CART C
-		                                           INNER  JOIN TB_CART_DETAIL CD
-		                                           ON     C.CART_SQ = CD.CART_SQ
-		                                           WHERE  1=1
-		                                           <if test="custNo == 0">
-		                                           AND    C.CUST_NO = 0
-		                                           AND    C.JSESSION_ID = #{jsessionId}
-		                                           </if>
-		                                           <if test="custNo != 0">
-		                                           AND    C.CUST_NO = #{custNo}
-		                                           </if>
-		                                           ) A
-		                                  ) A
-		                           GROUP BY A.CART_SQ
-		               ) GRADE_YN
-		        ON     GRADE_YN.CART_SQ = C.CART_SQ
+		        LEFT   OUTER JOIN TB_CUSTOMER CT
+		        ON     C.CUST_NO = CT.CUST_NO
 		        INNER  JOIN (   SELECT A.CART_SQ
 		                             , MAX(A.SOLDOUT_YN) AS SOLDOUT_YN
 		                             , MAX(A.ORD_CAN_YN) AS ORD_CAN_YN
@@ -897,7 +876,7 @@
 		ON     G.BRAND_CD = BR.BRAND_CD
 		WHERE  CA.CART_SQ = #{cartSq}
 		AND    G.SELF_MALL_YN = 'Y'
-		AND    G.GOODS_STAT = 'G008_90'
+		AND    G.GOODS_STAT IN ('G008_90', 'G008_70')
 	</select>
 
 	<!-- 장바구니 세트 구성 상품 정보 조회 -->
@@ -913,6 +892,7 @@
 			 , CD.OPT_CD2
 			 , G.SELF_GOODS_YN
 			 , G.GOODS_NM
+		     , G.GOODS_STAT
 		FROM   TB_CART CA
 		INNER  JOIN TB_CART_DETAIL CD
 		ON     CA.CART_SQ = CD.CART_SQ
@@ -923,7 +903,7 @@
 		ON     GC.COMPS_GOODS_CD = G.GOODS_CD
 		WHERE  1=1
 		AND    G.SELF_MALL_YN = 'Y'
-		AND    G.GOODS_STAT = 'G008_90'
+		AND    G.GOODS_STAT IN ('G008_90', 'G008_70')
 		AND    GC.USE_YN = 'Y'
 		AND    GC.GOODS_CD = #{goodsCd}
 		AND    CA.CART_SQ = #{cartSq}
@@ -943,6 +923,7 @@
 			 , MAX(CD.CART_DTL_SQ) AS CART_DTL_SQ
 			 , MAX(ST.DISP_ORD) AS DISP_ORD
 			 , MAX(CD.OPT_CD1) AS CART_OPT_CD1
+		     , MAX(ST.SOLDOUT_YN) AS SOLDOUT_YN
 			 , IFNULL(MAX( CASE WHEN SELF_GOODS_YN = 'Y' THEN (SELECT COLOR_KNM FROM TB_COLOR WHERE COLOR_CD = CD.OPT_CD1)
 								ELSE CD.OPT_CD1 END), MAX(CD.OPT_CD1)) AS CART_COLOR_NM
 		FROM   TB_GOODS G
@@ -954,7 +935,7 @@
 		AND    CD.CART_SQ = #{cartSq}
 		WHERE  ST.DISP_YN = 'Y'
 		AND    G.SELF_MALL_YN = 'Y'
-		AND    G.GOODS_STAT = 'G008_90'
+		AND    G.GOODS_STAT IN ('G008_90', 'G008_70')
 		AND    G.GOODS_CD = #{goodsCd}
 		GROUP  BY ST.GOODS_CD
 			 , ST.OPT_CD1
@@ -987,7 +968,7 @@
 		</if>
 		AND    ST.DISP_YN = 'Y'
 		AND    G.SELF_MALL_YN = 'Y'
-		AND    G.GOODS_STAT = 'G008_90'
+		AND    G.GOODS_STAT IN ('G008_90', 'G008_70')
 		ORDER  BY ST.DISP_ORD
 	</select>
 
@@ -1017,7 +998,7 @@
 		ON     G.GOODS_CD = GI.GOODS_CD
 		AND    G.MAIN_COLOR_CD = GI.COLOR_CD
 		WHERE  G.SELF_MALL_YN = 'Y'
-		AND    G.GOODS_STAT = 'G008_90'
+		AND    G.GOODS_STAT IN ('G008_90', 'G008_70')
 		AND    GI.GOODS_CD = #{goodsCd}
 		ORDER  BY GI.DISP_ORD
 	</select>

+ 106 - 2
src/main/java/com/style24/persistence/mybatis/shop/TsfDisplay.xml

@@ -179,7 +179,14 @@
 		             , A.SUB_TEXT3                                          /*서브텍스트3*/
 		             , A.SUB_TEXT4                                          /*서브텍스트4*/
 		             , A.BRAND_GROUP_NO                                     /*브랜드그룹번호*/
-		             , A.BRAND_GROUP_IMG                                    /*브랜드그룹이미지경로*/
+		             <choose>
+						 <when test='contentsLoc != null and contentsLoc =="SMM007"'>
+							 , (SELECT LOGO_FILE_NM FROM TB_BRAND_GROUP WHERE 1=1 AND A.BRAND_GROUP_NO = BRAND_GROUP_NO) AS BRAND_GROUP_IMG		/*브랜드그룹이미지경로*/
+						 </when>
+		                 <otherwise>
+							 , A.BRAND_GROUP_IMG	/*브랜드그룹이미지경로*/
+						 </otherwise>
+					 </choose>
 		             , A.MD_TITLE                                           /*MD타이틀*/
 					<if test='contentsLoc != null and contentsLoc =="SMM001"'>
 						, (SELECT count(C.BRAND_GROUP_NO) AS CNT
@@ -483,4 +490,101 @@
 			AND CONTENTS_LOC = #{contentsLoc}
 		</if>
 	</select>
-</mapper>
+	
+	<!-- 팝업 목록 -->
+	<select id="getPopupList" parameterType="PopUp" resultType="PopUp">
+		/* TsfDisplay.getPopupList */
+		SELECT *
+		FROM (
+		    SELECT POPUP_SQ
+		         , POPUP_GB
+		         , IMG_URL1
+		         , LINK_URL1
+		         , UNEXP_DAYS
+		         , ROW_NUMBER() OVER( ORDER BY DISP_ORD, REG_DT DESC) AS RNUM
+		    <choose>
+		         <when test='preview != null and preview == "Y"'>
+		         FROM   TB_POPUP_PREVIEW
+		         </when>
+		         <otherwise>
+		         FROM   TB_POPUP
+		         </otherwise>
+		    </choose>
+		    WHERE  1 = 1
+		    AND ( FRONT_GB = 'A'
+		    <if test='frontGb != null and frontGb !=""'>
+		          OR FRONT_GB = #{frontGb}
+		    </if>
+		         )
+		    AND ( VIEW_PAGE = 'G037_10'
+		    <if test='viewPage != null and viewPage !=""'>
+		          OR ( VIEW_PAGE = #{viewPage}
+		               <if test='cateNo != null and cateNo > 0'>
+		               AND CATE_NO = #{tcateCd}
+		               </if>
+		               <if test='planSq != null and planSq !=""'>
+		               AND PLAN_SQ = #{planSq}
+		               </if>
+		             )
+		    </if>
+		         )
+		    AND USE_YN = 'Y'
+		    AND SITE_CD = #{siteCd}
+		    <choose>
+		    <when test='preview != null and preview == "Y"'>
+		    AND  DISP_STDT <![CDATA[<=]]> STR_TO_DATE(#{viewDt},'%Y%m%d%H%i%S')
+		    AND DISP_EDDT >= STR_TO_DATE(#{viewDt},'%Y%m%d%H%i%S')
+		    </when>
+		    <otherwise>
+		    AND DISP_STDT <![CDATA[ <= ]]> NOW()
+		    AND DISP_EDDT >= NOW()
+		    </otherwise>
+		    </choose>
+		    ORDER BY DISP_ORD, REG_DT DESC
+		) Z 
+	</select>
+	
+
+	<!-- 몰메인 브랜드픽 조회 -->
+	<select id="getContentsBannerList" parameterType="Contents" resultType="Contents">
+		/* TsfDisplay.getContentsBannerList */
+		SELECT   CASE B.M WHEN 1 THEN A.IMG_PATH1
+						  WHEN 2 THEN A.IMG_PATH2
+						  WHEN 3 THEN A.IMG_PATH3
+						  WHEN 4 THEN A.IMG_PATH4
+						  WHEN 5 THEN A.IMG_PATH5 END IMG_PATH1
+			 ,CASE B.M WHEN 1 THEN A.STR_VAR1
+					   WHEN 2 THEN A.STR_VAR2
+					   WHEN 3 THEN A.STR_VAR3
+					   WHEN 4 THEN A.STR_VAR4
+					   WHEN 5 THEN A.STR_VAR5 END STR_VAR1
+			 ,CASE B.M WHEN 1 THEN A.STR_TITLE1
+					   WHEN 2 THEN A.STR_TITLE2
+					   WHEN 3 THEN A.STR_TITLE3
+					   WHEN 4 THEN A.STR_TITLE4
+					   WHEN 5 THEN '' END STR_TITLE1
+			 ,CASE B.M WHEN 1 THEN A.SUB_TEXT1
+					   WHEN 2 THEN A.SUB_TEXT2
+					   WHEN 3 THEN A.SUB_TEXT3
+					   WHEN 4 THEN A.SUB_TEXT4
+					   WHEN 5 THEN '' END SUB_TEXT1
+		FROM (
+			  (SELECT	BRAND_GROUP_NO
+					, IMG_PATH1 , IMG_PATH2 , IMG_PATH3 , IMG_PATH4, IMG_PATH5
+					, STR_VAR1 , STR_VAR2 , STR_VAR3 , STR_VAR4 , STR_VAR5
+					, STR_TITLE1 , STR_TITLE2 , STR_TITLE3 , STR_TITLE4
+					, SUB_TEXT1 , SUB_TEXT2 , SUB_TEXT3 , SUB_TEXT4
+			   FROM	TB_CONTENTS
+			   WHERE	CONTENTS_LOC = #{contentsLoc}
+				 AND		BRAND_GROUP_NO = #{brandGroupNo}
+			  ) A
+				 ,(
+			  SELECT 1 M
+			  UNION ALL SELECT 2
+			  UNION ALL SELECT 3
+			  UNION ALL SELECT 4
+			  UNION ALL SELECT 5
+				 ) B
+				 )
+	</select>
+</mapper>

+ 6 - 8
src/main/java/com/style24/persistence/mybatis/shop/TsfGiftcard.xml

@@ -8,21 +8,19 @@
 		SELECT SUM(CG.RM_GFCD_AMT) AS USE_GIFT/*사용가능한 보유 금액*/
 		      ,(SELECT COUNT(*) 
 		        FROM TB_CUST_GIFTCARD CG2 
-		        WHERE NOW() BETWEEN CG2.USE_ST_DATE AND CG2.USE_EXP_DATE
+		        WHERE DATE_FORMAT(NOW(), '%Y%m%d') BETWEEN CG2.USE_ST_DATE AND CG2.USE_EXP_DATE
 		          AND CUST_NO = #{custNo}
-		          AND CG2.RM_GFCD_AMT <![CDATA[>]]> 0
-		          AND NOW() BETWEEN CG2.USE_ST_DATE AND CG2.USE_EXP_DATE) AS TOTAL_COUNT /*총 상품권 수*/
+		          AND CG2.RM_GFCD_AMT <![CDATA[>]]> 0 ) AS TOTAL_COUNT /*총 상품권 수*/
 		      ,(SELECT SUM(CG3.RM_GFCD_AMT)
 				FROM TB_CUST_GIFTCARD CG3
-				WHERE NOW() BETWEEN CG3.USE_ST_DATE AND CG3.USE_EXP_DATE
-				  AND  NOW() BETWEEN DATE_ADD(CG3.USE_EXP_DATE, INTERVAL -1 MONTH) AND USE_EXP_DATE
+				WHERE DATE_FORMAT(NOW(), '%Y%m%d') BETWEEN CG3.USE_ST_DATE AND CG3.USE_EXP_DATE
+				  AND  DATE_FORMAT(NOW(), '%Y%m%d') BETWEEN DATE_ADD(CG3.USE_EXP_DATE, INTERVAL -1 MONTH) AND USE_EXP_DATE
 				  AND CUST_NO = #{custNo}
-				  AND CG3.RM_GFCD_AMT > 0
-				  AND NOW() BETWEEN CG3.USE_ST_DATE AND CG3.USE_EXP_DATE) AS EXPIRE_COUNT  /*한달 이내 소멸*/
+				  AND CG3.RM_GFCD_AMT > 0 ) AS EXPIRE_COUNT  /*한달 이내 소멸*/
 		FROM TB_CUST_GIFTCARD CG 
 		WHERE 1=1  
 			AND CUST_NO = #{custNo}
-			AND NOW() BETWEEN CG.USE_ST_DATE AND CG.USE_EXP_DATE
+			AND DATE_FORMAT(NOW(), '%Y%m%d') BETWEEN CG.USE_ST_DATE AND CG.USE_EXP_DATE
 	</select>
 	
 	<select id="getGiftcardUseList" parameterType="GiftCard" resultType="GiftCard">

+ 71 - 32
src/main/java/com/style24/persistence/mybatis/shop/TsfGoods.xml

@@ -190,7 +190,7 @@
 		                              AND IFNULL(#{custNo}, 0) = W.CUST_NO
 		LEFT OUTER JOIN TB_GOODS_QUICK_DELEVERY_SKIP DS ON G.GOODS_CD =DS.GOODS_CD
 		WHERE G.GOODS_CD = #{goodsCd}
-		-- AND G.SELF_MALL_YN = 'Y' --자사몰 노출(기획전과 상품상세는 노출)
+		AND NOW() BETWEEN SELL_STDT AND SELL_EDDT	/*판매기간 확인*/
 		<if test='adminYn == null or adminYn != "Y"'>
 		AND G.GOODS_STAT = 'G008_90'
 		</if>
@@ -230,6 +230,7 @@
 		                                 AND B.GOODS_CD = #{goodsCd}
 		                                 AND B.DEL_YN = 'N'
 		    INNER JOIN TB_GOODS C ON B.GOODS_CD = C.GOODS_CD
+		                          AND NOW() BETWEEN C.SELL_STDT AND C.SELL_EDDT           /*판매기간 확인*/
 		    WHERE A.USE_YN = 'Y'
 		    AND A.SITE_CD = #{siteCd}
 		    AND NOW() BETWEEN A.SOCIAL_STDT AND A.SOCIAL_EDDT
@@ -265,6 +266,7 @@
 		                          AND O.OPT_CD = VS.OPT_CD
 		      WHERE G.GOODS_CD =  #{goodsCd}
 		      AND G.GOODS_TYPE = 'G056_N' -- 일반상품
+		      AND NOW() BETWEEN G.SELL_STDT AND G.SELL_EDDT           /*판매기간 확인*/
 		      GROUP BY G.GOODS_CD , G.SELF_GOODS_YN , G.MIN_ORD_QTY, G.MAX_ORD_QTY, O.OPT_CD1
 		) A
 	</select>
@@ -301,6 +303,8 @@
 		      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' -- 일반상품
+		      AND NOW() BETWEEN G.SELL_STDT AND G.SELL_EDDT           /*판매기간 확인*/
 		     ) B
 		ORDER BY DISP_ORD
 	</select>
@@ -335,6 +339,8 @@
 		      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' -- 일반상품
+		      AND NOW() BETWEEN G.SELL_STDT AND G.SELL_EDDT           /*판매기간 확인*/
 		     ) B
 		ORDER BY DISP_ORD
 	</select>
@@ -408,6 +414,8 @@
 		     , G.LIST_PRICE
 		     , G.GOODS_STAT
 		     , G.SELF_GOODS_YN
+		     , DATE_FORMAT(G.SELL_STDT ,'%Y%m%d%H%i%S') AS SELL_STDT
+		     , DATE_FORMAT(G.SELL_EDDT ,'%Y%m%d%H%i%S') AS SELL_EDDT
 		     , FN_GET_BENEFIT_PRICE(#{frontGb},G.GOODS_CD, G.CURR_PRICE,#{custGb}) AS CURR_PRICE
 		     , (CASE WHEN D.DISP_NM_LANG = 'EN' THEN D.BRAND_GROUP_ENM ELSE D.BRAND_GROUP_KNM END) AS BRAND_GROUP_NM
 		     , (SELECT MAX(SYS_IMG_NM) FROM TB_GOODS_IMG WHERE GOODS_CD = G.GOODS_CD AND COLOR_CD = G.MAIN_COLOR_CD AND DEFAULT_IMG_YN = 'Y') AS SYS_IMG_NM
@@ -419,7 +427,7 @@
 		        GROUP BY GOODS_CD 
 		        ) AS STOCK_QTY
 		FROM TB_GOODS_COMPOSE C
-		INNER JOIN TB_GOODS G ON C.COMPS_GOODS_CD = G.GOODS_CD  
+		INNER JOIN TB_GOODS G ON C.COMPS_GOODS_CD = G.GOODS_CD
 		INNER JOIN TB_BRAND B ON G.BRAND_CD = B.BRAND_CD
 		                      AND B.USE_YN = 'Y'
 		INNER JOIN TB_SITE_BRAND SB ON B.BRAND_CD = SB.BRAND_CD
@@ -449,7 +457,6 @@
 		    ON GC.COMPS_GOODS_CD = G.GOODS_CD
 		 WHERE GC.USE_YN = 'Y'
 		   AND G.SELF_MALL_YN = 'Y'							<!-- 자사몰 노출 여부 -->
-		   AND G.GOODS_STAT = 'G008_90'	<!-- 상품 승인완료, 일시품절 (품절도 프론트에서 보여져야함) -->
 		   AND GC.GOODS_TYPE = #{goodsType}
 		   AND GC.GOODS_CD = #{goodsCd}
 		   AND GC.COMPS_GOODS_CD = #{compsGoodsCd}
@@ -651,6 +658,7 @@
 		      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>
@@ -822,6 +830,8 @@
 		     , G.GOODS_STAT
 		     , G.MAIN_COLOR_CD AS COLOR_CD
 		     , G.ITEMKIND_CD
+		     , DATE_FORMAT(G.SELL_STDT ,'%Y%m%d%H%i%S') AS SELL_STDT
+		     , DATE_FORMAT(G.SELL_EDDT ,'%Y%m%d%H%i%S') AS SELL_EDDT
 		     , (SELECT TI.SIZE_GB FROM TB_ITEMKIND TI WHERE TI.ITEMKIND_CD = G.ITEMKIND_CD) AS SIZE_GB
 		FROM TB_GOODS_COMPOSE A
 		INNER JOIN TB_GOODS G ON A.COMPS_GOODS_CD = G.GOODS_CD
@@ -896,44 +906,72 @@
 		                 , ROW_NUMBER() OVER(ORDER BY GS.SELL_WEEK_QTY DESC
 		                                            , G.GOODS_CD) AS NUMB
 		                     </when>
+							 <when test="contentsLoc == 'SMM009' or contentsLoc == 'SMM007'"> <!-- md추천 -->
+						 , ROW_NUMBER() OVER(ORDER BY CTG.DISP_ORD
+								 , G.REG_DT DESC
+								 , G.GOODS_CD) AS NUMB
+							 </when>
 		                     <otherwise>
 		                 , ROW_NUMBER() OVER(ORDER BY CG.DISP_ORD
 		                                            , G.REG_DT DESC
 		                                            , G.GOODS_CD) AS NUMB
 		                     </otherwise>
 		                 </choose>
-		            FROM   TB_CATE_4SRCH C4
-		                 , TB_CATE_GOODS CG
-		                 , TB_GOODS G
-		                 , TB_GOODS_STOCK S
-		                 , TB_BRAND B
-		                 , TB_BRAND_GROUP BG
-		            <if test="contentsLoc == 'SCM002'"> <!-- 베스트 -->
-		                 , TB_GOODS_SUMMARY GS
-		            </if> 
-		            WHERE  C4.LEAF_CATE_NO = CG.CATE_NO
 		            <choose>
-		                <when test="brandGroupNo != null and brandGroupNo != ''">
-		            AND    CG.BRAND_GROUP_NO = #{brandGroupNo}
-		                </when>
-		                <otherwise>
-		            AND    CG.BRAND_GROUP_NO = 0 /*브랜드메인에서 접근한 것이 아니면*/
-		                </otherwise>
-		            </choose>
-		            AND    CG.GOODS_CD = G.GOODS_CD
-		            AND    CG.GOODS_CD = S.GOODS_CD
-		            AND    G.BRAND_CD = B.BRAND_CD
-		            AND    B.BRAND_GROUP_NO = BG.BRAND_GROUP_NO
-		            <if test="contentsLoc == 'SCM002'"> <!-- 베스트 -->
-		            AND    CG.GOODS_CD = GS.GOODS_CD
-		            </if>
-		            AND    C4.SITE_CD = #{siteCd}
-		            AND    C4.CATE_GB = #{cateGb}
-		            AND    C4.CATE_TYPE = 'G031_20' /*컨텐츠카테고리*/
-		            AND    C4.CATE1_NO = #{cate1No}
-		            AND    C4.CONTENTS_LOC = #{contentsLoc}
+						<when test="contentsLoc == 'SMM009' or contentsLoc == 'SMM007'"> <!-- md추천 -->
+							FROM	TB_CONTENTS CT
+							, TMP_CONTENTS_GOODS CTG
+							, TB_GOODS G
+							, TB_GOODS_STOCK S
+							, TB_BRAND B
+							, TB_BRAND_GROUP BG
+							WHERE	CT.CONTENTS_LOC = CTG.CONTENTS_LOC
+							AND 	CT.DISP_ORD = CTG.CONTENTS_SQ
+							AND		CTG.GOODS_CD = G.GOODS_CD
+							AND		CTG.GOODS_CD = S.GOODS_CD
+							AND		G.BRAND_CD = B.BRAND_CD
+							AND     B.BRAND_GROUP_NO = BG.BRAND_GROUP_NO
+							AND		CT.CONTENTS_LOC = #{contentsLoc}
+						    AND 	CTG.CONTENTS_SQ = #{dispOrd}
+							AND		NOW() BETWEEN CT.DISP_STDT AND CT.DISP_EDDT
+						</when>
+		            	<otherwise>
+							FROM   TB_CATE_4SRCH C4
+							, TB_CATE_GOODS CG
+							, TB_GOODS G
+							, TB_GOODS_STOCK S
+							, TB_BRAND B
+							, TB_BRAND_GROUP BG
+							<if test="contentsLoc == 'SCM002'"> <!-- 베스트 -->
+								, TB_GOODS_SUMMARY GS
+							</if>
+							WHERE  C4.LEAF_CATE_NO = CG.CATE_NO
+							<choose>
+								<when test="brandGroupNo != null and brandGroupNo != ''">
+									AND    CG.BRAND_GROUP_NO = #{brandGroupNo}
+								</when>
+								<otherwise>
+									AND    CG.BRAND_GROUP_NO = 0 /*브랜드메인에서 접근한 것이 아니면*/
+								</otherwise>
+							</choose>
+							AND    CG.GOODS_CD = G.GOODS_CD
+							AND    CG.GOODS_CD = S.GOODS_CD
+							AND    G.BRAND_CD = B.BRAND_CD
+							AND    B.BRAND_GROUP_NO = BG.BRAND_GROUP_NO
+							<if test="contentsLoc == 'SCM002'"> <!-- 베스트 -->
+								AND    CG.GOODS_CD = GS.GOODS_CD
+							</if>
+							AND    C4.SITE_CD = #{siteCd}
+							AND    C4.CATE_GB = #{cateGb}
+							AND    C4.CATE_TYPE = 'G031_20' /*컨텐츠카테고리*/
+							AND    C4.CATE1_NO = #{cate1No}
+							AND    C4.CONTENTS_LOC = #{contentsLoc}
+						</otherwise>
+					</choose>
 		            AND    G.GOODS_STAT = 'G008_90' /*승인완료상품*/
 		            AND    G.FORMAL_GB = 'G009_10' /*정상상품*/
+		            AND    G.SELF_MALL_YN = 'Y'   /*몰노출상품*/
+		            AND    NOW() BETWEEN G.SELL_STDT AND G.SELL_EDDT   /*판매기간*/
 		            AND    S.STOCK_QTY <![CDATA[>]]> 0 /*재고있는상품*/
 		            AND    B.USE_YN = 'Y'
 		            AND    BG.USE_YN = 'Y'
@@ -1078,6 +1116,7 @@
 		            AND    G.GOODS_STAT = 'G008_90' /*승인완료상품*/
 		            AND    G.FORMAL_GB = 'G009_10' /*정상상품*/
 		            AND    G.SELF_MALL_YN = 'Y'   /*몰노출상품*/
+		            AND    NOW() BETWEEN G.SELL_STDT AND G.SELL_EDDT   /*판매기간*/
 		            AND    GS.STOCK_QTY <![CDATA[>]]> 0 /*재고있는상품*/
 		            AND    B.USE_YN = 'Y'
 		            AND    BG.USE_YN = 'Y'

+ 26 - 5
src/main/java/com/style24/persistence/mybatis/shop/TsfLogin.xml

@@ -18,7 +18,9 @@
 		     , EMAIL                                                     /*이메일*/
 		     , #{snsType}                              AS SNS_TYPE       /*SNS유형*/
 		     , #{snsId}                                AS SNS_ID         /*SNS가입ID*/
-		     , IFNULL((SELECT LOGIN_FAIL_CNT
+		     , IFNULL((SELECT CASE WHEN LOGIN_FAIL_CNT > 10 THEN 10
+		                           ELSE LOGIN_FAIL_CNT
+		                      END
 		               FROM   TB_LOGIN_FAIL
 		               WHERE  CUST_ID = #{custId}
 		               AND    IP_ADDR = #{ipAddr}
@@ -66,19 +68,26 @@
 		)
 		ON DUPLICATE KEY UPDATE
 		       LOGIN_FAIL_CNT = CASE WHEN #{loginFailYn} = 'Y' THEN
-		                                 CASE WHEN LOGIN_FAIL_CNT = 10 THEN LOGIN_FAIL_CNT
+		                                 CASE WHEN LOGIN_FAIL_CNT = 11 THEN LOGIN_FAIL_CNT
 		                                      ELSE LOGIN_FAIL_CNT + 1
 		                                 END
 		                             ELSE
 		                                 0
 		                        END
-		     , UPD_DT = NOW()
+		     , UPD_DT = CASE WHEN #{loginFailYn} = 'Y' THEN
+		                                 CASE WHEN LOGIN_FAIL_CNT = 11 THEN UPD_DT
+		                                      ELSE NOW()
+		                                 END
+		                     ELSE NOW()
+		                END
 	</insert>
 
 	<!-- 로그인 실패건수 조회 -->
 	<select id="getLoginFailCount" parameterType="Login" resultType="int">
 		/* TsfLogin.getLoginFailCount */
-		SELECT IFNULL((SELECT LOGIN_FAIL_CNT
+		SELECT IFNULL((SELECT CASE WHEN LOGIN_FAIL_CNT > 10 THEN 10
+		                           ELSE LOGIN_FAIL_CNT
+		                      END
 		               FROM   TB_LOGIN_FAIL
 		               WHERE  CUST_ID = #{custId}
 		               AND    IP_ADDR = #{ipAddr}
@@ -90,7 +99,10 @@
 	<!-- 로그인실패정보 조회 -->
 	<select id="getLoginFailInfo" parameterType="Login" resultType="Login">
 		/* TsfLogin.getLoginFailInfo */
-		SELECT LOGIN_FAIL_CNT
+		SELECT CASE WHEN LOGIN_FAIL_CNT > 10 THEN 10
+		            ELSE LOGIN_FAIL_CNT
+
+		        END           AS LOGIN_FAIL_CNT
 		     , CASE WHEN LOGIN_FAIL_CNT <![CDATA[>=]]> 10 THEN
 		                180 - TIMESTAMPDIFF(SECOND,UPD_DT,NOW())
 		            ELSE
@@ -209,4 +221,13 @@
 		WHERE  REMEMBERME_TOKEN = #{remembermeToken}
 	</delete>
 
+	<!-- 로그인 실패횟수 초기화-->
+	<update id="updateLoginFailInfo" parameterType="Login">
+		UPDATE TB_LOGIN_FAIL
+		SET    LOGIN_FAIL_CNT = 0
+		WHERE  CUST_ID = #{custId}
+		AND    IP_ADDR = #{ipAddr}
+		AND    SITE_CD = #{siteCd}
+	</update>
+
 </mapper>

+ 63 - 5
src/main/java/com/style24/persistence/mybatis/shop/TsfOrderChange.xml

@@ -17,7 +17,7 @@
 
 	<!-- 마이페이지 취소 목록 조회 -->
 	<select id="getCancelListForMypage" parameterType="Order" resultType="Order">
-		/* TscOrderChange.getCancelListForMypage */
+		/* TsfOrderChange.getCancelListForMypage */
 		SELECT GROUP_CONCAT(Z.ITEM_NM ORDER BY Z.ORD_DTL_ITEM_SQ SEPARATOR '!@!') AS ITEM_NM
 		     , GROUP_CONCAT(Z.COLOR_NM ORDER BY Z.ORD_DTL_ITEM_SQ) AS COLOR_NM
 		     , GROUP_CONCAT(Z.OPT_CD1 ORDER BY Z.ORD_DTL_ITEM_SQ) AS OPT_CD1
@@ -151,7 +151,7 @@
 
 	<!-- 마이페이지 반품 목록 조회 -->
 	<select id="getReturnListForMypage" parameterType="Order" resultType="Order">
-		/* TscOrderChange.getReturnListForMypage */
+		/* TsfOrderChange.getReturnListForMypage */
 		SELECT GROUP_CONCAT(Z.ITEM_NM ORDER BY Z.ORD_DTL_ITEM_SQ SEPARATOR '!@!') AS ITEM_NM
 		     , GROUP_CONCAT(Z.COLOR_NM ORDER BY Z.ORD_DTL_ITEM_SQ) AS COLOR_NM
 		     , GROUP_CONCAT(Z.OPT_CD1 ORDER BY Z.ORD_DTL_ITEM_SQ) AS OPT_CD1
@@ -289,7 +289,7 @@
 	
 	<!-- 취소/반품 환불 사전 정보 조회 -->
 	<select id="getRefundPreInfo" parameterType="OrderChange" resultType="Order">
-		/* TscOrderChange.getRefundPreInfo */
+		/* TsfOrderChange.getRefundPreInfo */
 		SELECT O.ORD_NO
 		     , OD.ORD_DTL_NO
 		     , OD.GOODS_CD
@@ -382,7 +382,7 @@
 	
 	<!-- 사용 상품권 정보 조회 -->
 	<select id="getUsedGiftcardInfo" parameterType="Order" resultType="GiftCard">
-		/* TscOrderChange.getUsedGiftcardInfo */
+		/* TsfOrderChange.getUsedGiftcardInfo */
 		SELECT CGH.ORD_NO
 			 , CGH.ORD_DTL_NO
 			 , SUM(CGH.GFCD_AMT) AS GFCD_AMT
@@ -405,7 +405,7 @@
 	
 	<!-- 사용 포인트 정보 조회 -->
 	<select id="getUsedPointInfo" parameterType="Order" resultType="Point">
-		/* TscOrderChange.getUsedPointInfo */
+		/* TsfOrderChange.getUsedPointInfo */
 		SELECT CPH.ORD_NO
 			 , CPH.ORD_DTL_NO
 			 , SUM(CPH.PNT_AMT) AS PNT_AMT
@@ -426,4 +426,62 @@
 		 GROUP BY CPH.ORD_NO, CPH.ORD_DTL_NO
 		 ORDER BY CPH.ORD_NO, CPH.ORD_DTL_NO
 	</select>
+	
+	<!-- 교환 옵션 정보 조회 -->
+	<select id="getExchangeOptionInfo" parameterType="OrderChange" resultType="OrderChange">
+		/* TscOrderChange.getExchangeOptionInfo */
+		SELECT Z.ORD_NO
+			 , Z.ORD_DTL_NO
+			 , Z.ORD_DTL_ITEM_SQ
+			 , Z.ITEM_CD
+			 , Z.OPT_CD1
+			 , Z.OPT_CD2
+			 , Z.COLOR_NM
+			 , Z.GOODS_TYPE
+		     , Z.SELF_GOODS_YN
+			 , Z.ITEM_NM
+			 , Z.GOODS_STAT
+			 , GROUP_CONCAT(Z.CHG_OPT_CD2 ORDER BY Z.DISP_ORD SEPARATOR ',') AS CHG_OPT_CD2
+			 , GROUP_CONCAT(Z.CURR_STOCK_QTY ORDER BY Z.DISP_ORD SEPARATOR ',') AS CHG_CURR_STOCK_QTY
+			 , GROUP_CONCAT(Z.SOLDOUT_YN ORDER BY Z.DISP_ORD SEPARATOR ',') AS CHG_SOLDOUT_YN
+		  FROM (SELECT O.ORD_NO
+					 , OD.ORD_DTL_NO
+					 , ODI.ORD_DTL_ITEM_SQ
+					 , ODI.ITEM_CD
+					 , ODI.OPT_CD1
+					 , ODI.OPT_CD2
+					 , IFNULL(C.COLOR_KNM, ODI.OPT_CD1) AS COLOR_NM
+					 , OD.GOODS_TYPE
+		             , G1.SELF_GOODS_YN
+					 , G2.GOODS_NM AS ITEM_NM
+					 , G2.GOODS_STAT
+					 , OP.OPT_CD2 AS CHG_OPT_CD2
+					 , OP.SOLDOUT_YN
+					 , OP.DISP_ORD
+					 , VS.CURR_STOCK_QTY - VS.BASE_STOCK_QTY AS CURR_STOCK_QTY
+				  FROM TB_ORDER O
+				 INNER JOIN TB_ORDER_DETAIL OD
+				    ON O.ORD_NO = OD.ORD_NO
+				 INNER JOIN TB_ORDER_DETAIL_ITEM ODI
+				    ON OD.ORD_NO = ODI.ORD_NO
+				   AND OD.ORD_DTL_NO = ODI.ORD_DTL_NO
+				 INNER JOIN TB_GOODS G1
+				    ON OD.GOODS_CD = G1.GOODS_CD
+				 INNER JOIN TB_GOODS G2
+				    ON ODI.ITEM_CD = G2.GOODS_CD
+				 INNER JOIN TB_OPTION OP
+				    ON ODI.ITEM_CD = OP.GOODS_CD
+				   AND ODI.OPT_CD1 = OP.OPT_CD1
+				 INNER JOIN VW_STOCK VS
+				    ON OP.GOODS_CD = VS.GOODS_CD
+				   AND OP.OPT_CD = VS.OPT_CD
+				  LEFT OUTER JOIN TB_COLOR C
+				    ON C.COLOR_CD = IFNULL(NULLIF(ODI.OPT_CD1, ''), G1.MAIN_COLOR_CD)
+				   AND C.USE_YN = 'Y'
+				 WHERE O.ORD_NO = #{ordNo}
+				   AND OD.ORD_DTL_NO = #{ordDtlNo}
+		  ) Z
+		 GROUP BY Z.ORD_NO, Z.ORD_DTL_NO, Z.ORD_DTL_ITEM_SQ, Z.ITEM_CD, Z.OPT_CD1, Z.OPT_CD2
+				, Z.COLOR_NM, Z.GOODS_TYPE, Z.SELF_GOODS_YN, Z.ITEM_NM, Z.GOODS_STAT
+	</select>
 </mapper>

+ 207 - 47
src/main/java/com/style24/persistence/mybatis/shop/TsfPlanning.xml

@@ -176,6 +176,7 @@
 		    AND    PD.DISP_YN = 'Y' /*전시하는코너*/
 		    AND    PG.DEL_YN = 'N' /*삭제안된상품*/
 		    AND    G.GOODS_STAT = 'G008_90' /*승인완료상품*/
+		    AND    NOW() BETWEEN G.SELL_STDT AND G.SELL_EDDT
 		    AND    G.SELF_MALL_YN = 'Y'   /*몰노출상품*/
 		    AND    GS.STOCK_QTY <![CDATA[>]]> 0 /*재고있는상품*/
 		    AND    B.USE_YN = 'Y'
@@ -480,7 +481,7 @@
 					 ,F.GOODS_TYPE
 					 ,F.TAG_PRICE
 					 ,F.LIST_PRICE
-					 ,F.CURR_PRICE
+					 ,FN_GET_BENEFIT_PRICE(#{frontGb},F.GOODS_CD,F.CURR_PRICE,#{custGb})                              AS CURR_PRICE
 					 ,F.CURR_BPRICE
 					 ,F.PRICE_UPD_DT
 					 ,F.COST_PRICE
@@ -546,7 +547,7 @@
 					 ,G.GOODS_TYPE
 					 ,G.TAG_PRICE
 					 ,G.LIST_PRICE
-					 ,G.CURR_PRICE
+					 ,FN_GET_BENEFIT_PRICE(#{frontGb},G.GOODS_CD,G.CURR_PRICE,#{custGb})                              AS CURR_PRICE
 					 ,G.CURR_BPRICE
 					 ,G.PRICE_UPD_DT
 					 ,G.COST_PRICE
@@ -589,8 +590,10 @@
 	<select id="getPlanCouponInfo" parameterType="Coupon" resultType="Coupon">
 		/* TsfPlanning.templateDispOrdInfo*/
 		SELECT F.*
+		<if test="planSq != null and planSq != ''">
 		      ,(CASE F.CPN_ID WHEN (SELECT CPN_ID FROM TB_CUST_COUPON C WHERE C.CPN_ID = F.CPN_ID AND CUST_NO = #{custNo})THEN '받기완료'
 		        ELSE '쿠폰받기' END ) AS COUPON_STAT
+		</if>
 		FROM
 		(
 			SELECT  PC.PLAN_CONT_SQ 
@@ -637,7 +640,9 @@
 			FROM TB_PLAN_CONTENTS PC INNER JOIN TB_PLAN_CONTENTS_ITEM PCI ON PC.PLAN_CONT_SQ = PCI.PLAN_CONT_SQ 
 			  						 INNER JOIN TB_COUPON TC ON PCI.ITEM_VAL = TC.CPN_ID 
 			WHERE 1=1 
+			<if test="planSq != null and planSq != ''">
 				AND PC.PLAN_SQ = #{planSq}
+			</if>
 				AND PC.TMPL_TYPE = 'G082_20'
 				AND PC.DISP_YN ='Y'
 				AND NOW() BETWEEN TC.AVAIL_STDT AND TC.AVAIL_EDDT
@@ -667,54 +672,101 @@
 		 AND PC.DISP_YN = 'Y'
 	</select>
 	
-	<!-- 기획전 상품 1열 전시 -->
-	<select id="getPlanGoods1Info" parameterType="Plan" resultType="Plan">
-		/* TsfPlanning.getPlanGoods1Info */
+	<!-- 기획전 상품  전시 -->
+	<select id="getPlanGoodsDisplayList" parameterType="Plan" resultType="Plan">
+		/* TsfPlanning.getPlanGoodsDisplayList */
 		SELECT Z.*
-		      , (CASE WHEN Z.GOODS_TYPE = 'G056_N' THEN (SELECT IFNULL(SUM(CURR_STOCK_QTY - BASE_STOCK_QTY),0) FROM VW_STOCK WHERE GOODS_CD = Z.GOODS_CD) 
-					ELSE (SELECT IFNULL(SUM(CURR_STOCK_QTY - BASE_STOCK_QTY),0) FROM VW_STOCK_COMPOSE WHERE GOODS_CD = Z.GOODS_CD) 
-					END) AS STOCK_QTY_SUM
-			  , (SELECT MAX(SYS_IMG_NM) FROM TB_GOODS_IMG  WHERE GOODS_CD = Z.GOODS_CD AND DEFAULT_IMG_YN = 'Y' ) AS SYS_IMG_NM
+		      ,100 - ROUND((Z.CURR_PRICE / Z.LIST_PRICE) * 100 ,0) AS DC_RATE 
 		FROM
 		(
-			SELECT PC.PLAN_CONT_SQ
-			      ,PC.PLAN_SQ
-			      ,PC.TMPL_TYPE
-			      ,PC.TITLE
-			      ,PC.LINK_URL
-			      ,PC.DISP_YN
-			      ,PC.DISP_ORD
-			      ,PCI.PLAN_CONT_ITEM_SQ
-			      ,PCI.ITEM_VAL
-			      ,G.GOODS_CD 
-			      ,G.GOODS_TYPE 
-			      ,G.GOODS_NM 
-			      ,G.LIST_PRICE 
-			      ,G.CURR_PRICE                                                                 
-			      ,G.DC_RATE
-			      ,CASE G.FORMAL_GB WHEN 'G009_20' THEN '이월' ELSE '정상' END AS FORMAL_GB                                                                 
-				  ,G.SEASON_CD       
-				  , (SELECT SUPPLY_COMP_NM
-				 	 FROM   TB_SUPPLY_COMPANY
-				     WHERE  SUPPLY_COMP_CD = G.SUPPLY_COMP_CD
-					) AS SUPPLY_COMP_NM                                                           
-				  ,G.ERP_STOCK_LINK_YN                                                          
-				  ,G.ERP_PRICE_LINK_YN                                                                                                                  
-				  ,G.NEW_CUST_ORD_YN                                                            
-				  ,G.DELV_FEE_CD                                                                
-				  ,G.FRST_CFRM_DT                  
-				  ,G.PRICE_UPD_DT 
-				  ,B.BRAND_ENM 
-		  		  ,B.BRAND_KNM          
-			FROM TB_PLAN_CONTENTS PC INNER JOIN TB_PLAN_CONTENTS_ITEM PCI ON PC.PLAN_CONT_SQ = PCI.PLAN_CONT_SQ 
-									 INNER JOIN TB_GOODS G ON PCI.ITEM_VAL = G.GOODS_CD 
-									 INNER JOIN TB_BRAND B ON G.BRAND_CD = B.BRAND_CD
-                         					AND B.USE_YN = 'Y'	
-			WHERE 1=1
-			 AND PC.TMPL_TYPE = #{tmplType}
-			 AND PC.PLAN_SQ = #{planSq}
-			 AND PC.DISP_YN = 'Y'
-		 )Z
+		WITH TAB_PLAN_GOODS AS (
+		    SELECT P.PLAN_SQ                                                /*기획전번호*/
+		         , PC.LINK_URL 
+		         , PC.DISP_ORD 
+		         , PC.TITLE 
+		         , PC.TMPL_TYPE 
+		         , PC.PLAN_CONT_SQ 		         
+		         , PCI.ITEM_VAL 
+		         , PCI.REVIEW_DISP_EDDT 
+		         , PCI.REVIEW_DISP_STDT 
+		         , 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.FOREIGN_BUY_YN                                         /*해외구매대행여부*/
+		         , G.PARALLEL_IMPORT_YN                                     /*병행수입여부*/
+		         , G.ORDER_MADE_YN                                          /*주문제작여부*/
+		         , G.GOODS_TNM                                              /*상품타이틀명*/
+		         , G.MAIN_COLOR_CD                                          /*대표색상코드*/
+		         , G.LIST_PRICE                                             /*정상가(최초판매가)*/
+		         , G.CURR_PRICE                                             /*현재판매가*/
+		    FROM   TB_PLAN P
+		    	 , TB_PLAN_CONTENTS PC
+		    	 , TB_PLAN_CONTENTS_ITEM PCI
+		         , TB_GOODS G
+		         , TB_GOODS_STOCK GS
+		         , TB_BRAND B
+		         , TB_BRAND_GROUP BG
+		    WHERE  P.PLAN_SQ = PC.PLAN_SQ
+		    AND    PC.PLAN_CONT_SQ = PCI.PLAN_CONT_SQ
+		    AND    PCI.ITEM_VAL = G.GOODS_CD
+		    AND    G.GOODS_CD = GS.GOODS_CD
+		    AND    G.BRAND_CD = B.BRAND_CD
+		    AND    B.BRAND_GROUP_NO = BG.BRAND_GROUP_NO
+		    AND    P.PLAN_SQ =  #{planSq} /**P*/
+		    -- AND    P.PLAN_GB = 'P' /*기획전*/
+		    AND    P.SITE_CD =  #{siteCd} /**P*/
+		    <if test="frontGb != null and frontGb != ''">
+		    AND    P.FRONT_GB LIKE CONCAT('%',#{frontGb},'%')
+		    </if>
+		    AND    NOW() BETWEEN P.DISP_STDT AND P.DISP_EDDT
+		    AND    P.DEL_YN = 'N' /*삭제안된 기획전*/
+		    AND    P.OPEN_YN = 'Y' /*오픈된 기획전*/
+		    AND    PC.TMPL_TYPE = #{tmplType}
+		    AND    PC.DISP_YN = 'Y' /*전시하는템플릿*/
+		    AND    G.GOODS_STAT = 'G008_90' /*승인완료상품*/
+		    AND    G.SELF_MALL_YN = 'Y'   /*몰노출상품*/
+		    AND    GS.STOCK_QTY  >  0 /*재고있는상품*/
+		    AND    B.USE_YN = 'Y'
+		    AND    BG.USE_YN = 'Y'
+		    AND    NOW() BETWEEN G.SELL_STDT AND G.SELL_EDDT
+		)
+		, TAB_GOODS_IMG AS (
+		    /* 상품의 이미지 */
+		    SELECT PG.GOODS_CD
+		         , MAX(CASE WHEN GI.DEFAULT_IMG_YN = 'Y' THEN GI.SYS_IMG_NM ELSE NULL END)   AS SYS_IMG_NM
+		         , MAX(CASE WHEN GI.MOUSEOVER_IMG_YN = 'Y' THEN GI.SYS_IMG_NM ELSE NULL END) AS SYS_IMG_NM2
+		    FROM   TAB_PLAN_GOODS PG
+		         , TB_GOODS_IMG GI
+		    WHERE  PG.GOODS_CD = GI.GOODS_CD
+		    AND    PG.MAIN_COLOR_CD = GI.COLOR_CD
+		    AND    (GI.DEFAULT_IMG_YN = 'Y' OR GI.MOUSEOVER_IMG_YN = 'Y')
+		    GROUP  BY PG.GOODS_CD
+		)
+		SELECT PG.PLAN_SQ
+		     , PG.DISP_ORD
+		     , PG.BRAND_GROUP_NM
+		     , PG.GOODS_CD
+		     , PG.TITLE
+		     , PG.TMPL_TYPE
+		     , PG.LINK_URL
+		     , PG.ITEM_VAL
+		     , PG.PLAN_CONT_SQ
+		     , FN_GET_GOODS_NM(PG.GOODS_NM,PG.GOODS_GB,PG.FOREIGN_BUY_YN,PG.PARALLEL_IMPORT_YN,PG.ORDER_MADE_YN) AS GOODS_FULL_NM /*상품FULL명*/
+		     , PG.GOODS_NM
+		     , PG.GOODS_TNM
+		     , PG.MAIN_COLOR_CD
+		     , PG.LIST_PRICE
+		     , FN_GET_BENEFIT_PRICE(#{frontGb},PG.GOODS_CD,PG.CURR_PRICE,#{custGb})                     AS CURR_PRICE    /*현재판매가*/
+		     , GI.SYS_IMG_NM
+		     , GI.SYS_IMG_NM2
+			FROM   TAB_PLAN_GOODS PG
+		INNER JOIN TAB_GOODS_IMG GI ON PG.GOODS_CD = GI.GOODS_CD
+		)Z
 	</select>
 	
 	<!-- 기획전 코너 목록 -->
@@ -727,11 +779,119 @@
 		FROM TB_PLAN P INNER JOIN TB_PLAN_DETAIL PD ON P.PLAN_SQ = PD.PLAN_SQ
 		 WHERE 1=1
 		  AND P.PLAN_SQ = #{planSq}
+		  AND P.SITE_CD = #{siteCd}
 		  AND PD.DISP_YN = 'Y'
 		  AND NOW() BETWEEN PD.DISP_STDT AND PD.DISP_EDDT 
 		ORDER BY PD.DISP_ORD 
 	</select>
 	
+	<!-- 기획전 상세 상품 목록 -->
+	<select id="getPlanningCornerGoodsList" parameterType="Plan" resultType="Plan">
+		/* TsfPlanning.getPlanningCornerGoodsList */
+		SELECT Z.*
+		      ,100 - ROUND((Z.CURR_PRICE / Z.LIST_PRICE) * 100 ,0) AS DC_RATE 
+		FROM
+		(
+		WITH TAB_PLAN_GOODS AS (
+		    SELECT P.PLAN_SQ                                                /*기획전번호*/
+		         , PD.CORNER_NM                                             /*코너명*/
+		         , PG.DISP_ORD                                              /*상품노출순서*/
+		         , 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.FOREIGN_BUY_YN                                         /*해외구매대행여부*/
+		         , G.PARALLEL_IMPORT_YN                                     /*병행수입여부*/
+		         , G.ORDER_MADE_YN                                          /*주문제작여부*/
+		         , G.GOODS_TNM                                              /*상품타이틀명*/
+		         , G.MAIN_COLOR_CD                                          /*대표색상코드*/
+		         , G.LIST_PRICE                                             /*정상가(최초판매가)*/
+		         , G.CURR_PRICE                                             /*현재판매가*/
+		         , RANK() OVER(PARTITION BY P.PLAN_SQ
+		                       ORDER BY PG.DISP_ORD
+		                              , PG.GOODS_CD)      AS NUMB
+		    FROM   TB_PLAN P
+		         , TB_PLAN_DETAIL PD
+		         , TB_PLAN_GOODS PG
+		         , TB_GOODS G
+		         , TB_GOODS_STOCK GS
+		         , TB_BRAND B
+		         , TB_BRAND_GROUP BG
+		    WHERE  P.PLAN_SQ = PD.PLAN_SQ
+		    AND    PD.PLAN_DTL_SQ = PG.PLAN_DTL_SQ
+		    AND    PG.GOODS_CD = G.GOODS_CD
+		    AND    G.GOODS_CD = GS.GOODS_CD
+		    AND    G.BRAND_CD = B.BRAND_CD
+		    AND    B.BRAND_GROUP_NO = BG.BRAND_GROUP_NO
+		    AND    P.PLAN_SQ = #{planSq}
+		    -- AND    P.PLAN_GB = 'P' /*기획전*/
+		    AND    P.SITE_CD = #{siteCd}
+		    <if test="frontGb != null and frontGb != ''">
+		    AND    P.FRONT_GB LIKE CONCAT('%',#{frontGb},'%')
+		    </if>
+		    AND    NOW() BETWEEN P.DISP_STDT AND P.DISP_EDDT
+		    AND    P.DEL_YN = 'N' /*삭제안된 기획전*/
+		    AND    P.OPEN_YN = 'Y' /*오픈된 기획전*/
+		    AND    NOW() BETWEEN PD.DISP_STDT AND PD.DISP_EDDT
+		    AND    PD.DISP_YN = 'Y' /*전시하는코너*/
+		    AND    PG.DEL_YN = 'N' /*삭제안된상품*/
+		    AND    G.GOODS_STAT = 'G008_90' /*승인완료상품*/
+		    AND    G.SELF_MALL_YN = 'Y'   /*몰노출상품*/
+		    AND    GS.STOCK_QTY <![CDATA[>]]> 0 /*재고있는상품*/
+		    AND    B.USE_YN = 'Y'
+		    AND    BG.USE_YN = 'Y'
+		    AND    NOW() BETWEEN G.SELL_STDT AND G.SELL_EDDT
+		)
+		, TAB_GOODS_IMG AS (
+		    /* 상품의 이미지 */
+		    SELECT PG.GOODS_CD
+		         , MAX(CASE WHEN GI.DEFAULT_IMG_YN = 'Y' THEN GI.SYS_IMG_NM ELSE NULL END)   AS SYS_IMG_NM
+		         , MAX(CASE WHEN GI.MOUSEOVER_IMG_YN = 'Y' THEN GI.SYS_IMG_NM ELSE NULL END) AS SYS_IMG_NM2
+		    FROM   TAB_PLAN_GOODS PG
+		         , TB_GOODS_IMG GI
+		    WHERE  PG.GOODS_CD = GI.GOODS_CD
+		    AND    PG.MAIN_COLOR_CD = GI.COLOR_CD
+		    AND    (GI.DEFAULT_IMG_YN = 'Y' OR GI.MOUSEOVER_IMG_YN = 'Y')
+		    GROUP  BY PG.GOODS_CD
+		)
+		SELECT PG.PLAN_SQ
+		     , PG.CORNER_NM
+		     , PG.DISP_ORD
+		     , PG.BRAND_GROUP_NM
+		     , PG.GOODS_CD
+		     , FN_GET_GOODS_NM(PG.GOODS_NM,PG.GOODS_GB,PG.FOREIGN_BUY_YN,PG.PARALLEL_IMPORT_YN,PG.ORDER_MADE_YN) AS GOODS_FULL_NM /*상품FULL명*/
+		     , PG.GOODS_NM
+		     , PG.GOODS_TNM
+		     , PG.MAIN_COLOR_CD
+		     , PG.LIST_PRICE
+		     , FN_GET_BENEFIT_PRICE(#{frontGb},PG.GOODS_CD,PG.CURR_PRICE,#{custGb})                              AS CURR_PRICE    /*현재판매가*/
+		     , GI.SYS_IMG_NM
+		     , GI.SYS_IMG_NM2
+		     <choose>
+		         <when test="custNo != null and custNo > 0"> <!-- 로그인 했으면 -->
+		     , IF(W.GOODS_CD IS NULL,'','likeit')                                                                AS LIKE_IT       /*위시리스트담긴상품*/
+		         </when>
+		         <otherwise>
+		     , ''                                                                                                AS LIKE_IT       /*위시리스트담긴상품*/
+		         </otherwise>
+		     </choose>
+		     
+		FROM   TAB_PLAN_GOODS PG
+		INNER JOIN TAB_GOODS_IMG GI ON PG.GOODS_CD = GI.GOODS_CD
+		<if test="custNo != null and custNo > 0"> <!-- 로그인 했으면 -->
+		LEFT OUTER JOIN TB_WISHLIST W ON PG.GOODS_CD = W.GOODS_CD
+		                             AND W.CUST_NO = #{custNo}
+		</if>
+		<if test="maxRow != null and maxRow > 0">
+		WHERE  PG.NUMB <![CDATA[<=]]> #{maxRow}
+		</if>
+		)Z
+	</select>
+	
 	<!-- 총알배송 html 소스  -->
 	<select id="getShotDeliveryHtml" parameterType="Plan" resultType="Plan">
 		/* TsfPlanning.getShotDeliveryHtml */

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

@@ -341,10 +341,10 @@
 			      ,I.SIZE_GB 
 			      ,DATEDIFF( DATE_ADD(O.PAY_DT,INTERVAL 90 DAY),NOW()) AS REMAIN_DT -- 남은시간
 			FROM TB_ORDER O INNER JOIN TB_ORDER_DETAIL OD ON O.ORD_NO = OD.ORD_NO 
-								 			 	 AND OD.ORD_DTL_STAT = 'G013_70' -- 구매 확정인것만
+								 			 	 AND OD.ORD_DTL_STAT IN ('G013_70','G013_50','G013_60') -- 구매 확정인것만
 			                INNER JOIN TB_ORDER_DETAIL_ITEM ODI ON OD.ORD_DTL_NO = ODI.ORD_DTL_NO 
 			                  					 AND OD.ORD_DTL_NO = ODI.ORD_DTL_NO
-			                  	                 AND ODI.ORD_DTL_STAT = 'G013_70'
+			                  	                 AND ODI.ORD_DTL_STAT IN ('G013_70','G013_50','G013_60')
 			                INNER JOIN TB_GOODS G ON G.GOODS_CD = OD.GOODS_CD 
 			                INNER JOIN TB_BRAND B ON B.BRAND_CD = G.BRAND_CD
 			                LEFT JOIN TB_ITEMKIND I ON G.ITEMKIND_CD = I.ITEMKIND_CD 
@@ -442,10 +442,10 @@
 				  </if>
 			      ,DATEDIFF( DATE_ADD(O.PAY_DT,INTERVAL 90 DAY),NOW()) AS REMAIN_DT -- 남은시간
 			FROM TB_ORDER O INNER JOIN TB_ORDER_DETAIL OD ON O.ORD_NO = OD.ORD_NO 
-								 			 	 AND OD.ORD_DTL_STAT = 'G013_70' -- 구매 확정인것만
+								 			 	 AND OD.ORD_DTL_STAT IN ('G013_70','G013_50','G013_60') -- 구매 확정인것만
 			                INNER JOIN TB_ORDER_DETAIL_ITEM ODI ON OD.ORD_DTL_NO = ODI.ORD_DTL_NO 
 			                  					 AND OD.ORD_DTL_NO = ODI.ORD_DTL_NO
-			                  	                AND ODI.ORD_DTL_STAT = 'G013_70'
+			                  	                AND ODI.ORD_DTL_STAT IN ('G013_70','G013_50','G013_60')
 			                INNER JOIN TB_GOODS G ON G.GOODS_CD = OD.GOODS_CD 
 			                INNER JOIN TB_BRAND B ON B.BRAND_CD = G.BRAND_CD
 			                LEFT JOIN TB_ITEMKIND I ON G.ITEMKIND_CD = I.ITEMKIND_CD
@@ -508,10 +508,10 @@
 			      ,B.BRAND_ENM 
 			      ,DATEDIFF( DATE_ADD(O.PAY_DT,INTERVAL 90 DAY),NOW()) AS DT -- 남은시간
 			FROM TB_ORDER O INNER JOIN TB_ORDER_DETAIL OD ON O.ORD_NO = OD.ORD_NO 
-								 				 AND OD.ORD_DTL_STAT = 'G013_70'--  구매 확정인것만
+								 				 AND OD.ORD_DTL_STAT IN ('G013_70','G013_50','G013_60') --  구매 확정인것만
 			                INNER JOIN TB_ORDER_DETAIL_ITEM ODI ON OD.ORD_DTL_NO = ODI.ORD_DTL_NO 
 			                  					 AND OD.ORD_DTL_NO = ODI.ORD_DTL_NO
-			                  	                 AND ODI.ORD_DTL_STAT = 'G013_70'
+			                  	                 AND ODI.ORD_DTL_STAT IN ('G013_70','G013_50','G013_60')
 			                INNER JOIN TB_GOODS G ON G.GOODS_CD = OD.GOODS_CD 
 			                INNER JOIN TB_BRAND B ON B.BRAND_CD = G.BRAND_CD
 			WHERE 1=1

+ 10 - 1
src/main/java/com/style24/persistence/mybatis/shop/TsfSocial.xml

@@ -62,7 +62,15 @@
 				     , D.BRAND_ENM 
 				     , W.CUST_NO 
 				     , W.GOODS_CD AS WISH_GOOD
-				FROM TB_SOCIAL A INNER JOIN tb_social_goods B ON A.SOCIAL_SQ = B.SOCIAL_SQ 
+		             <choose>
+			            <when test="custNo != null and custNo > 0"> <!-- 로그인 했으면 -->
+				     , IF(W.GOODS_CD IS NULL,'','likeit')                                                           AS LIKE_IT       /*위시리스트담긴상품*/
+			            </when>
+			            <otherwise>
+				     , ''                                                                                           AS LIKE_IT       /*위시리스트담긴상품*/
+			            </otherwise>
+		             </choose>
+				FROM TB_SOCIAL A INNER JOIN TB_SOCIAL_GOODS B ON A.SOCIAL_SQ = B.SOCIAL_SQ 
 				                 INNER JOIN TB_GOODS C ON B.GOODS_CD = C.GOODS_CD 
 				                 INNER JOIN TB_BRAND D ON C.BRAND_CD = D.BRAND_CD
 				                 LEFT JOIN TB_WISHLIST W ON C.GOODS_CD = W.GOODS_CD
@@ -73,6 +81,7 @@
 				  AND A.APPLY_GB = 'A'					 /*적용구분(P:대기,A:적용,F:종료)*/
 				  AND A.FRONT_GB IN ('A',#{frontGb})	 /*프론트 구분*/
 				  AND B.DEL_YN = 'N'
+				  AND NOW() BETWEEN C.SELL_STDT AND C.SELL_EDDT
 				ORDER BY B.DISP_ORD 
 			)F
 			WHERE F.SOCIAL_SQ = #{socialSq}

+ 72 - 58
src/main/java/com/style24/persistence/mybatis/shop/TsfWishlist.xml

@@ -16,6 +16,7 @@
 	
 	<!-- 위시리스트 월 -->
 	<select id="getWishListMonth" resultType="WishList" parameterType="WishList">
+		/* TsfWishlist.getWishListMonth*/
 		SELECT COUNT(*) AS COUNT
 		      ,DATE_FORMAT(W.REG_DT,'%Y.%m') AS REG_DT 
 		FROM TB_WISHLIST W
@@ -25,65 +26,78 @@
 	
 	<!-- 위시리스트 상품목록 (임시 = 수정예정)-->
 	<select id="getWishListGoodsList" parameterType="WishList" resultType="Goods">
-		/**/
+		/* TsfWishlist.getWishListGoodsList*/
 		SELECT Z.*
-		     , (CASE WHEN Z.GOODS_TYPE = 'G056_N' THEN (SELECT IFNULL(SUM(CURR_STOCK_QTY - BASE_STOCK_QTY),0) FROM VW_STOCK WHERE GOODS_CD = Z.GOODS_CD) 
-		        ELSE (SELECT IFNULL(SUM(CURR_STOCK_QTY - BASE_STOCK_QTY),0) FROM VW_STOCK_COMPOSE WHERE GOODS_CD = Z.GOODS_CD) 
-		       END) AS STOCK_QTY_SUM
-		FROM 
-		      (
-		       SELECT  G.GOODS_CD
-		              ,G.BRAND_CD
-		              ,G.ITEMKIND_CD
-		              ,G.GOODS_NM
-		              ,G.GOODS_TNM
-		              ,G.GOODS_SNM
-		              ,G.GOODS_SNM1
-		              ,G.MAIN_COLOR_CD
-		              ,G.GOODS_NUM
-		              ,G.GOODS_TYPE
-		              ,G.TAG_PRICE
-		              ,G.LIST_PRICE
-		              ,G.CURR_PRICE
-		              ,G.CURR_BPRICE
-		              ,G.PRICE_UPD_DT
-		              ,G.COST_PRICE
-		              ,G.DC_RATE
-		              ,G.GOODS_STAT
-		              ,G.SELF_MALL_YN
-		              ,G.GOODS_GB
-		              ,G.DISTRIBUTION_GB
-		              ,G.SELF_GOODS_YN
-		              ,G.SUPPLY_COMP_CD
-		              ,G.SUPPLY_GOODS_CD
-		              ,G.PNT_PRATE
-		              ,G.PNT_MRATE
-		              ,W.AF_LINK_CD 
-		              ,W.CONTENTS_LOC 
-		              ,W.CUST_NO 
-		              ,W.ITHR_CD 
-		              ,W.PLAN_DTL_SQ 
-		              ,W.REG_DT 
-		              ,BR.BRAND_GROUP_KNM
-		              ,BR.BRAND_KNM
-		       FROM TB_GOODS G INNER JOIN TB_WISHLIST W ON G.GOODS_CD = W.GOODS_CD 
-								LEFT JOIN (
-								            SELECT B.BRAND_CD 
-								                  ,B.BRAND_ENM
-								                  ,B.BRAND_KNM 
-								                  ,B.BRAND_GRP_NM 
-								                  ,B.USE_YN 
-								                  ,BG.BRAND_GROUP_NO 
-								                  ,BG.BRAND_GROUP_ENM 
-								                  ,BG.BRAND_GROUP_KNM 
-								            FROM TB_BRAND B INNER JOIN TB_BRAND_GROUP BG ON B.BRAND_GROUP_NO = BG.BRAND_GROUP_NO
-								             WHERE 1=1
-								               AND B.USE_YN = 'Y'
-								               AND BG.USE_YN = 'Y'
-								         )BR ON G.BRAND_CD = BR.BRAND_CD
-              WHERE 1=1
-	            AND W.CUST_NO = #{custNo}
-           )Z
+			      ,100 - ROUND((Z.CURR_PRICE / Z.LIST_PRICE) * 100 ,0) AS DC_RATE 
+			FROM
+			(
+			WITH TAB_PLAN_GOODS AS (
+			    SELECT W.AF_LINK_CD 
+			          ,W.CONTENTS_LOC 
+			          ,W.CUST_NO 
+			          ,W.REG_DT 
+			          ,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.FOREIGN_BUY_YN                                         /*해외구매대행여부*/
+			         , G.PARALLEL_IMPORT_YN                                     /*병행수입여부*/
+			         , G.ORDER_MADE_YN                                          /*주문제작여부*/
+			         , G.GOODS_TNM                                              /*상품타이틀명*/
+			         , G.MAIN_COLOR_CD                                          /*대표색상코드*/
+			         , G.LIST_PRICE                                             /*정상가(최초판매가)*/
+			         , G.CURR_PRICE                                             /*현재판매가*/
+			    FROM   TB_WISHlIST W
+			         , TB_GOODS G
+			         , TB_GOODS_STOCK GS
+			         , TB_BRAND B
+			         , TB_BRAND_GROUP BG
+			    WHERE  W.GOODS_CD = G.GOODS_CD 
+			    AND    G.GOODS_CD = GS.GOODS_CD
+			    AND    G.BRAND_CD = B.BRAND_CD
+			    AND    B.BRAND_GROUP_NO = BG.BRAND_GROUP_NO
+			    AND    G.GOODS_STAT = 'G008_90' /*승인완료상품*/
+			    AND    G.SELF_MALL_YN = 'Y'   /*몰노출상품*/
+			    AND    GS.STOCK_QTY  >  0 /*재고있는상품*/
+			    AND    B.USE_YN = 'Y'
+			    AND    BG.USE_YN = 'Y'
+			    AND    W.CUST_NO = #{custNo}
+			    AND    NOW() BETWEEN G.SELL_STDT AND G.SELL_EDDT
+			)
+			, TAB_GOODS_IMG AS (
+			    SELECT PG.GOODS_CD
+			         , MAX(CASE WHEN GI.DEFAULT_IMG_YN = 'Y' THEN GI.SYS_IMG_NM ELSE NULL END)   AS SYS_IMG_NM
+			         , MAX(CASE WHEN GI.MOUSEOVER_IMG_YN = 'Y' THEN GI.SYS_IMG_NM ELSE NULL END) AS SYS_IMG_NM2
+			    FROM   TAB_PLAN_GOODS PG
+			         , TB_GOODS_IMG GI
+			    WHERE  PG.GOODS_CD = GI.GOODS_CD
+			    AND    PG.MAIN_COLOR_CD = GI.COLOR_CD
+			    AND    (GI.DEFAULT_IMG_YN = 'Y' OR GI.MOUSEOVER_IMG_YN = 'Y')
+			    GROUP  BY PG.GOODS_CD
+			)
+			SELECT 
+			       PG.BRAND_GROUP_NM
+			     , PG.GOODS_CD
+			     , FN_GET_GOODS_NM(PG.GOODS_NM,PG.GOODS_GB,PG.FOREIGN_BUY_YN,PG.PARALLEL_IMPORT_YN,PG.ORDER_MADE_YN) AS GOODS_FULL_NM /*상품FULL명*/
+			     , PG.GOODS_NM
+			     , PG.GOODS_TNM
+			     , PG.MAIN_COLOR_CD
+			     , PG.LIST_PRICE
+			     , PG.AF_LINK_CD 
+			     , PG.CONTENTS_LOC 
+			     , PG.CUST_NO 
+			     , PG.REG_DT
+			     , FN_GET_BENEFIT_PRICE(#{frontGb},PG.GOODS_CD,PG.CURR_PRICE,#{custGb})                     AS CURR_PRICE    /*현재판매가*/
+			     , GI.SYS_IMG_NM
+			     , GI.SYS_IMG_NM2
+				FROM   TAB_PLAN_GOODS PG
+			INNER JOIN TAB_GOODS_IMG GI ON PG.GOODS_CD = GI.GOODS_CD
+			)Z
+		ORDER BY Z.REG_DT DESC
 	</select>
 	
 

+ 7 - 0
src/main/resources/config/application.yml

@@ -108,6 +108,13 @@ yes24 :
     linkUrl : https://wsyes24.yes24.com/Yes_Mem.asmx/Yes_Partner_Insert
     unlinkUrl : https://wsyes24.yes24.com/Yes_Mem.asmx/Yes_Partner_Remove
 
+google :
+    # 개발정보
+    sitekey : 6LcY_JUaAAAAAIy1nHPE_lTkpIa51ihEd-waJCeO
+    secretKey : 6LcY_JUaAAAAAFux56mVih0a5NUwP3ARq0HUHR9p
+    # 개발정보
+    recaptchaVerifyUrl : https://www.google.com/recaptcha/api/siteverify
+
 
 # SPEEDY Image Upload
 speedy:

+ 122 - 143
src/main/webapp/WEB-INF/views/web/SigninFormWeb.html

@@ -17,7 +17,6 @@
  *******************************************************************************
  -->
 <body>
-
 <th:block layout:fragment="content">
 <div id="container" class="container mb">
 	<div class="wrap">
@@ -52,21 +51,9 @@
 					<div class="help_block">
 						<!-- //회원 아이디 또는 비밀번호가 일치하지 않을때 -->
 						<!-- 보안문자 입력시 -->
-						<div class="captcha mt40" style="display: none;"> <!-- 캡차영역 -->
-							<ul>
-								<li class="captcha_box"> <!-- 캡차이미지 -->
-									<img src="" id="imgCaptcha"/>
-								</li>
-								<li class="captcha_btn_dual">
-									<button type="button" id="play_audio" onclick="fnReloadCaptchaImage();">새로고침</button>
-									<button type="button" id="swap_captcha">음성듣기</button>
-								</li>
-								<li class="captcha_area">
-									<label for="captcha" id="label_captcha_area">보안문자 입력</label>
-									<input type="text" id="captcha" name="captcha" title="문자입력"/>
-								</li>
-							</ul>
-						</div>
+
+						<div id="recaptcha" class="g-recaptcha" style="display: none;" data-callback="fnRecaptchaCallback" th:data-sitekey="${sitekey}"></div>
+
 						<!-- //보안문자 입력시 -->
 						<!-- 회원 아이디 또는 비밀번호가 일치하지 않을때 -->
 						<p class="t_err t_err_login_fail" style="display: none;">
@@ -121,112 +108,31 @@
 		</div>
 	</div>
 </div>
-
 <script th:inline="javascript">
 /*<![CDATA[*/
 	let ckLoginId = "ckLoginId";
+	let rechaptchCheck = true;
 
-	// 로그인블락시간(초) 설정
-	let fnSetLoginBlockTime = function() {
-		let blockSecs = Number($("#blockSecs2").html()) - 1;
-		$("#blockSecs2").html(blockSecs);
-		if (blockSecs == 0) {
-			clearTimeout(fnSetLoginBlockTime);
-			$('#btnLogin').attr('disabled',false);
-		} else {
-			setTimeout(fnSetLoginBlockTime, 1000);
-		}
-	}
-	
 	// 로그인
 	$('#btnLogin').on('click', function() {
 		if (!gagajf.validation($('#loginForm'))) {
 			return;
 		}
+		if (!rechaptchCheck) {
+			mcxDialog.alert("자동 방지 봇을 확인 한뒤 진행 해 주세요.");
+			return;
+		}
 
-		let params = new Object();
+		let params = {};
 		params.loginId = $('#loginForm input[name=loginId]').val();
 		params.passwd = $('#loginForm input[name=passwd]').val();
-		
+
 		$.post($('#loginForm').prop('action')
 			, $.param(params)
-			, function(result) {
-				if (result.status != 'OK') {
-
-					if (result.status == 'PWD_5WRONG') {
-						// Do nothing
-					} else if (result.status == 'DORMANT_CUST') {
-						// 휴면회원
-						mcxDialog.alertC("휴면 고객님께서는 휴면을<br>해지하신 후 사용하실 수 있습니다.", {
-							sureBtnText: "확인",
-							sureBtnClick: function() {
-								cfnGoToPage(_PAGE_CUSTOMER_DORMANT);
-							}
-						});
-						return;
-					} else if (result.status == 'SECEDE_CUST') {
-						// 탈퇴회원
-					} else if (result.status == 'SESSION_EXPIRED') {
-						// 세션만료
-					} else if (result.status == 'CI_EMPTY') {
-						// 본인이증 필요한 회원
-						mcxDialog.alertC("본인인증 후 다시 로그인 하시기 바랍니다.", {
-							sureBtnText: "확인",
-							sureBtnClick: function() {
-								cfnGoToPage(_PAGE_CUSTOMER_CERTIFICATION);
-							}
-						});
-						return;
-					}
-
-					if (!gagajf.isNull(result.message)) {
-						let loginFailCnt = Number(result.loginFailInfo.loginFailCnt);
-						
-						$("#err_msg").html(result.message);
-						$("#login_fail_cnt").html(loginFailCnt);
-						$("#login_remain_cnt").html(10 - loginFailCnt);
-						$(".t_err_login_fail").show();
-						
-						if (loginFailCnt >= 5 && loginFailCnt < 10) {
-							// 비밀번호 5회 이상 틀린 경우 캡챠 노출
-							$('.captcha').show();
-						} else if (loginFailCnt >= 10) {
-							$('.captcha').hide();
-							
-							// 비밀번호 10회 이상 틀린 경우 로그인 블락
-							let blockSecs = Number(result.loginFailInfo.blockSecs);
-							if (blockSecs > 0) {
-								$("#blockSecs2").html(blockSecs);
-								fnSetLoginBlockTime();
-								$("#blockSecs1").show();
-								$('#btnLogin').attr('disabled',true);
-							}
-						}
-					}
-
-					return; // 정상적으로 로그인 되지 않았으므로 return
-				}
-				
-				document.location.href = result.returnUrl;
-				
-// 				if (gagajf.isNull(result.returnUrl)) {
-// 					cfnGoToPage(_PAGE_MAIN);
-// 				} else {
-// 					if (result.returnUrl.indexOf(_PAGE_DIRECT_BUY) > -1) {
-// 						// 바로주문
-// 						jfOrderByMember();
-// 					} else if (result.returnUrl.indexOf(_PAGE_CUSTOMER_JOIN) > -1 ||
-// 						result.returnUrl.indexOf(_PAGE_CUSTOMER_ID_FIND) > -1 ||
-// 						result.returnUrl.indexOf(_PAGE_CUSTOMER_PW_FIND) > -1 ||
-// 						result.returnUrl.indexOf(_PAGE_CUSTOMER_JOIN_COMPLETE) > -1) {
-// 						cfnGoToPage(_PAGE_MAIN);
-// 					} else {
-// 						document.location.href = result.returnUrl;
-// 					}
-// 				}
-			}
+			, fnReloadAfterLogin
 			, 'json');
 	});
+
 	
 	// Save ID
 	$('#chkSaveId').on('click', function() {
@@ -240,10 +146,106 @@
 			}
 		}
 	});
-	
-	// 캡챠 이미지 로딩
-	let fnReloadCaptchaImage = function() {
-		$('#imgCaptcha').attr('src', '/common/captcha.do?dummy=' + new Date());
+
+		//엔터키 로그인
+	$('#loginForm input[name=passwd]').keypress(function (event) {
+		if (event.which === 13) {
+			event.preventDefault();
+			fnValidConfirm();
+		}
+	});
+
+	// 로그인 후 처리
+	var fnReloadAfterLogin = function(result) {
+		if (result.status === 'OK') {
+			document.location.href = result.returnUrl;
+		} else {
+			fnFailLoginProcess(result);
+		}
+	};
+
+	// 로그인 실패 후 과정
+	var fnFailLoginProcess = function (result) {
+		if (result.status === 'SECEDE_CUST') {
+			// 탈퇴회원
+		} else if (result.status === 'SESSION_EXPIRED') {
+			// 세션만료
+		} else if (result.status === 'DORMANT_CUST') {
+			// 휴면회원
+			mcxDialog.alertC("휴면 고객님께서는 휴면을<br>해지하신 후 사용하실 수 있습니다.", {
+				sureBtnText: "확인",
+				sureBtnClick: function() {
+					cfnGoToPage(_PAGE_CUSTOMER_DORMANT);
+				}
+			});
+			return;
+		} else if (result.status === 'CI_EMPTY') {
+			// 본인이증 필요한 회원
+			mcxDialog.alertC("본인인증 후 다시 로그인 하시기 바랍니다.", {
+				sureBtnText: "확인",
+				sureBtnClick: function() {
+					cfnGoToPage(_PAGE_CUSTOMER_CERTIFICATION);
+				}
+			});
+			return;
+		}
+		if (!gagajf.isNull(result.message)) {
+			grecaptcha.reset(); // 리캡챠 리셋
+			let loginFailCnt = Number(result.loginFailInfo.loginFailCnt);
+			$("#err_msg").html(result.message);
+			$("#login_fail_cnt").html(loginFailCnt);
+			$("#login_remain_cnt").html(10 - loginFailCnt);
+			$(".t_err_login_fail").show();
+			if (loginFailCnt >= 5 && loginFailCnt < 10) {
+				// 비밀번호 5회 이상 틀린 경우 캡챠 노출
+				$('#recaptcha').show();
+				rechaptchCheck = false;
+			} else if (loginFailCnt >= 10) {
+				$('#recaptcha').hide();
+				rechaptchCheck = true;
+				// 비밀번호 10회 이상 틀린 경우 로그인 블락
+				let blockSecs = Number(result.loginFailInfo.blockSecs);
+
+				if (blockSecs > 0) {
+					$("#blockSecs2").html(blockSecs);
+					fnSetLoginBlockTime();
+					$("#blockSecs1").show();
+					$('#btnLogin').attr('disabled',true);
+				}
+			}
+		}
+
+		return; // 정상적으로 로그인 되지 않았으므로 return
+	}
+
+
+	// 구글 캡챠 콜백함수
+	var fnRecaptchaCallback = function () {
+		let token = $("#g-recaptcha-response").val();
+		let params = {};
+		params.token = token;
+		gagajf.ajaxSubmit('/verify/recaptcha','', fnVerifyReCaptchaCallback, params);
+	};
+
+	// Token 인증
+	var fnVerifyReCaptchaCallback = function (result) {
+		if (result.success) {
+			rechaptchCheck = true;
+		} else {
+			rechaptchCheck = false;
+		}
+	};
+
+	// 로그인블락시간(초) 설정
+	let fnSetLoginBlockTime = function() {
+		let blockSecs = Number($("#blockSecs2").html()) - 1;
+		$("#blockSecs2").html(blockSecs);
+		if (blockSecs <= 0) {
+			clearTimeout(fnSetLoginBlockTime);
+			$('#btnLogin').attr('disabled',false);
+		} else {
+			setTimeout(fnSetLoginBlockTime, 1000);
+		}
 	}
 
 	// SNS 로그인 콜백함수
@@ -266,60 +268,38 @@
 			return;
 		}
 		if (userInfo.custStat === 'DORMANT_CUST') {
-			cfnGoToPage(_PAGE_CUSTOMER_DORMANT);
+			mcxDialog.alertC("휴면 고객님께서는 휴면을<br>해지하신 후 사용하실 수 있습니다.", {
+				sureBtnText: "확인",
+				sureBtnClick: function() {
+					cfnGoToPage(_PAGE_CUSTOMER_DORMANT);
+				}
+			});
 		}
 		if (userInfo.custStat === 'FAIL_CUST') {
 			mcxDialog.alert("회원가입에 실패 했습니다.<br> 고객센터에 문의 하시기 바랍니다.");
 			return;
 		}
-		if (userInfo.custStat === 'NEW_CUST') {
+		if (userInfo.custStat === 'NEW_CUST') { // 회원가입
 			cfnGoToPage(_PAGE_CUSTOMER_JOIN_COMPLETE);
 		}
 
-		if (userInfo.custStat === 'NEED_AGREE_CUST'){
+		if (userInfo.custStat === 'NEED_AGREE_CUST') { // YES24 로그인 시 동의화면 필요
 			cfnConsentUseInfo(userInfo.custNm);
 		}
 
-
 		if (userInfo.custStat === 'SUCC_CUST') {
 			let params = {};
 			params.snsType = userInfo.snsType;
 			params.snsId = [[${snsLoginPrefix}]] + userInfo.snsId;
 			$.post(_frontUrl + '/login'
 				, $.param(params)
-				, function(result) {
-					fnReloadAfterLogin(result);
-				}
+				,fnReloadAfterLogin
 				, "json");
 		}
-
-
 	};
 
-	var fnReloadAfterLogin = function(result) {
-		if (result.status === 'OK') {
-			document.location.href = result.returnUrl;
-		} else if (result.status === 'EMAIL_DUP') {
-
-		} else if(result.status === 'DORMANT_CUST') {
-			cfnGoToPage(_PAGE_CUSTOMER_DORMANT);
-		} else if(result.status === 'SECEDE_CUST') {
-
-		} else {
-			//cfnGoToPage(_PAGE_CUSTOMER_JOIN_CERTIFY_SNS);
-		}
-	};
-
-	//엔터키 확인
-	$('#loginForm input[name=passwd]').keypress(function (event) {
-		if (event.which === 13) {
-			event.preventDefault();
-			fnValidConfirm();
-		}
-	});
-
-
 	$(document).ready(function() {
+
 		$('#loginForm input[name=loginId]').val(gagajf.getCookie(ckLoginId));
 		if (gagajf.isNull($('#loginForm input[name=loginId]').val())) {
 			$('#loginForm input[name=loginId]').focus();
@@ -331,7 +311,6 @@
 	});
 /*]]>*/
 </script>
-
 </th:block>
 
 </body>

+ 83 - 66
src/main/webapp/WEB-INF/views/web/cart/CartChangeOptionPopupWeb.html

@@ -40,29 +40,26 @@
 						<!-- 세트상품 옵션 -->
 						<th:block th:if="${setType.equals(cart.goodsType)}">
 							<div class="opt_select">
+								<!-- 컬러 변경시 만들어줄 size option -->
+								<span style="display:none;" th:each="color, index : ${comp.cartColorList}">
+									<span th:classappend="|color_${color.goodsCd}_${color.optCd1}|">
+										<th:block th:each="size, i : ${color.cartSizeList}">
+											<th:block th:if="${color.optCd1.equals(size.optCd1)}">
+												<li th:classappend="${i.index == 0} ? selected" th:data="${comp.cartDtlSq}" th:optCd="${size.optCd}" th:value="${size.optCd}" th:text="${size.optCd2}" th:aria-disabled="${color.soldoutYn.equals('Y') or size.soldoutYn.equals('Y') ? true : false}"></li>
+											</th:block>
+										</th:block>
+									</span>
+								</span>
+
 								<div class="opt_header">
 									<span class="title" th:text="${comp.goodsNm}"></span>
 								</div>
 								<div class="opt_header">
 									<span class="title">옵션1</span>
 									<th:block th:each="color, index : ${comp.cartColorList}" th:if="${color.cartColorNm != null}">
-										<span class="text" th:text="${color.cartColorNm}"></span>
+										<span class="text" th:classappend="|chooseColorNm_${comp.goodsCd}|" th:text="${color.cartColorNm}"></span>
 									</th:block>
 								</div>
-
-								<!-- 컬러 변경시 만들어줄 size option -->
-								<th:block th:each="color, index : ${comp.cartColorList}">
-									<span style="display:none;">
-										<select th:classappend="|color_${color.goodsCd}_${color.optCd1}|">
-											<th:block th:each="size, i : ${color.cartSizeList}">
-												<th:block th:if="${color.optCd1.equals(size.optCd1)}">
-													<option th:value="${size.optCd}" th:text="${size.optCd2}"></option>
-												</th:block>
-											</th:block>
-										</select>
-									</span>
-								</th:block>
-
 								<form class="form_wrap">
 									<div class="form_field">
 										<div class="select_custom item_opt1 setColorSelect">
@@ -70,13 +67,10 @@
 												<th:block th:each="color, index : ${comp.cartColorList}" th:if="${color.cartColorNm != null}">
 													<div class="select" th:text="${color.cartColorNm}"></div>
 												</th:block>
-												<ul class="list">
-													<!-- 선택처리 class="selected" / 선택불가 aria-disabled="true" 추가  -->
+												<ul class="list" th:data="${comp.goodsCd}">
 													<th:block th:each="color, index : ${comp.cartColorList}">
-														<li th:classappend="${color.cartColorNm != null} ? selected" th:text="${color.colorNm}"></li>
+														<li th:classappend="${color.cartColorNm != null} ? 'selected addNewScombo'" th:data="${color.optCd1}" th:text="${color.colorNm}" th:aria-disabled="${color.soldoutYn.equals('Y') ? true : false}"></li>
 													</th:block>
-													<!--<li class="selected">카키/95</li>
-													<li aria-disabled="true">옐로우/105</li>-->
 												</ul>
 											</div>
 										</div>
@@ -94,16 +88,16 @@
 								</div>
 								<form class="form_wrap">
 									<div class="form_field">
-										<div class="select_custom item_opt2 setSizeSelect">
+										<div class="select_custom item_opt2 setOption">
 											<div class="combo">
 												<th:block th:each="color, index : ${comp.cartColorList}" th:if="${color.cartColorNm != null}">
 													<th:block th:each="size, i : ${color.cartSizeList}" th:if="${size.cartOptCd != null}">
-														<div class="select" th:classappend="|size_${comp.goodsCd}|" th:text="${size.optCd2}" th:data="${color.goodsCd}"></div>
+														<div class="select" th:classappend="|size_${comp.goodsCd}_size_nm addNewScombo|" th:text="${size.optCd2}" th:data="${color.goodsCd}"></div>
 													</th:block>
-													<ul class="list">
+													<ul class="list setSizeSelect" th:classappend="|size_${comp.goodsCd}|">
 														<th:block th:each="size, i : ${color.cartSizeList}" th:if="${color.optCd1.equals(size.optCd1)}">
 															<!-- 선택처리 class="selected" / 선택불가 aria-disabled="true" 추가  -->
-															<li th:classappend="${size.cartOptCd != null} ? selected" th:data="${comp.cartDtlSq}" th:optCd="${size.optCd}" th:value="${size.optCd}" th:text="${size.optCd2}"></li>
+															<li th:classappend="${size.cartOptCd != null} ? selected" th:data="${comp.cartDtlSq}" th:optCd="${size.optCd}" th:value="${size.optCd}" th:text="${size.optCd2}" th:aria-disabled="${color.soldoutYn.equals('Y') or size.soldoutYn.equals('Y') ? true : false}"></li>
 															<!--<li class="selected">블랙/95</li>
 															<li aria-disabled="true">블랙/105</li>-->
 														</th:block>
@@ -157,26 +151,23 @@
 						<!-- 입점업체 -->
 						<th:block th:if="${!setType.equals(cart.goodsType) and 'N'.equals(cart.selfGoodsYn)}">
 							<div class="opt_select">
+								<!-- 컬러 변경시 만들어줄 size option -->
+								<span style="display:none;" th:each="color, index : ${comp.cartColorList}">
+									<span th:classappend="|color_${color.goodsCd}_${color.optCd1}|">
+										<th:block th:each="size, i : ${color.cartSizeList}">
+											<th:block th:if="${color.optCd1.equals(size.optCd1)}">
+												<li th:classappend="${i.index == 0} ? selected" th:data="${cart.cartDtlSq}" th:optCd="${size.optCd}" th:value="${size.optCd}" th:text="${size.optCd2}" th:aria-disabled="${color.soldoutYn.equals('Y') or size.soldoutYn.equals('Y') ? true : false}"></li>
+											</th:block>
+										</th:block>
+									</span>
+								</span>
+
 								<div class="opt_header">
 									<span class="title">옵션1</span>
 									<th:block th:each="color, index : ${comp.cartColorList}" th:if="${color.cartColorNm != null}">
-										<span class="text" th:text="${color.cartColorNm}"></span>
+										<span class="text" th:classappend="|chooseColorNm_${cart.goodsCd}|" th:text="${color.cartColorNm}"></span>
 									</th:block>
 								</div>
-
-								<!-- 컬러 변경시 만들어줄 size option -->
-								<th:block th:each="color, index : ${comp.cartColorList}">
-									<span style="display:none;">
-										<select th:classappend="|color_${color.goodsCd}_${color.optCd1}|">
-											<th:block th:each="size, i : ${color.cartSizeList}">
-												<th:block th:if="${color.optCd1.equals(size.optCd1)}">
-													<option th:value="${size.optCd}" th:text="${size.optCd2}"></option>
-												</th:block>
-											</th:block>
-										</select>
-									</span>
-								</th:block>
-
 								<form class="form_wrap">
 									<div class="form_field">
 										<div class="select_custom item_opt1 setColorSelect">
@@ -184,13 +175,10 @@
 												<th:block th:each="color, index : ${comp.cartColorList}" th:if="${color.cartColorNm != null}">
 													<div class="select" th:text="${color.cartColorNm}"></div>
 												</th:block>
-												<ul class="list">
-													<!-- 선택처리 class="selected" / 선택불가 aria-disabled="true" 추가  -->
+												<ul class="list" th:data="${cart.goodsCd}">
 													<th:block th:each="color, index : ${comp.cartColorList}">
-														<li th:classappend="${color.cartColorNm != null} ? selected" th:text="${color.colorNm}"></li>
+														<li th:classappend="${color.cartColorNm != null} ? 'selected addNewScombo'" th:data="${color.optCd1}" th:text="${color.colorNm}" th:aria-disabled="${color.soldoutYn.equals('Y') ? true : false}"></li>
 													</th:block>
-													<!--<li class="selected">카키/95</li>
-													<li aria-disabled="true">옐로우/105</li>-->
 												</ul>
 											</div>
 										</div>
@@ -208,18 +196,16 @@
 								</div>
 								<form class="form_wrap">
 									<div class="form_field">
-										<div class="select_custom item_opt2 setSizeSelect">
+										<div class="select_custom item_opt2 setOption">
 											<div class="combo">
 												<th:block th:each="color, index : ${comp.cartColorList}" th:if="${color.cartColorNm != null}">
 													<th:block th:each="size, i : ${color.cartSizeList}" th:if="${size.cartOptCd != null}">
-														<div class="select" th:classappend="|size_${comp.goodsCd}|" th:text="${size.optCd2}" th:data="${color.goodsCd}"></div>
+														<div class="select" th:classappend="|size_${cart.goodsCd}_size_nm addNewScombo|" th:text="${size.optCd2}" th:data="${color.goodsCd}"></div>
+														<input type="hidden" th:if="${size.cartDtlSq > 0}" class="cartDtlSq" th:value="${size.cartDtlSq}" />
 													</th:block>
-													<ul class="list">
+													<ul class="list setSizeSelect" th:classappend="|size_${cart.goodsCd}|">
 														<th:block th:each="size, i : ${color.cartSizeList}" th:if="${color.optCd1.equals(size.optCd1)}">
-															<!-- 선택처리 class="selected" / 선택불가 aria-disabled="true" 추가  -->
-															<li th:classappend="${size.cartOptCd != null} ? selected" th:data="${color.cartDtlSq}" th:optCd="${size.optCd}" th:value="${size.optCd}" th:text="${size.optCd2}"></li>
-															<!--<li class="selected">블랙/95</li>
-															<li aria-disabled="true">블랙/105</li>-->
+															<li th:classappend="${size.cartOptCd != null} ? selected" th:data="${size.cartDtlSq}" th:optCd="${size.optCd}" th:value="${size.optCd}" th:text="${size.optCd2}" th:aria-disabled="${color.soldoutYn.equals('Y') or size.soldoutYn.equals('Y') ? true : false}"></li>
 														</th:block>
 													</ul>
 												</th:block>
@@ -251,7 +237,7 @@
 	<script th:inline="javascript">
 		$(document).ready(function() {
 			$(".select_custom").each(function() {
-				new sCombo(this);
+				new sCombo($(this));
 			});
 		});
 
@@ -262,11 +248,33 @@
 			$('.optModify_pop .number_count .minus').addClass('min_val');
 		}
 
-		// 세트상품 컬러 변경시
-		$(".setColorSelect").on("change", function(e) {
-			let goodsCd = $(this).find("option:checked").attr("data");
+		// 세트상품, 입점업체 상품 컬러 변경시
+		$(".setColorSelect > .combo > .list li").on("click", function(e) {
+			let goodsCd = $(this).parent().attr("data");
+			let firstSize = "";
+
+			$(".chooseColorNm_" + goodsCd).text($(this).text());
+
 			$(".setOption .size_" + goodsCd).html("");
-			$(".setOption .size_" + goodsCd).html($(".color_" + goodsCd + "_" + $(this).val()).html());
+			$(".setOption .size_" + goodsCd).html($(".color_" + goodsCd + "_" + $(this).attr("data")).html());
+
+			$(".setOption .size_" + goodsCd + " li").each(function() {
+				if($(this).hasClass("selected")) {
+					firstSize = $(this).text();
+				}
+			});
+
+			$(".setOption .size_" + goodsCd + "_size_nm").text(firstSize);
+			$(".setOption .size_" + goodsCd + "_size_nm").parent().parent().parent().parent().parent().find(".opt_header .text").text(firstSize);
+			//if(!$(this).hasClass("addNewScombo")) {
+				//new sCombo($(".setOption .size_" + goodsCd).parent().parent());
+			//	$(this).addClass("addNewScombo");
+			//}
+		});
+
+		// 세트상품, 입점업체 상품 사이즈 변경시
+		$(".setOption > .combo > .list li").on("click", function() {
+			$(this).parent().parent().parent().parent().parent().parent().find(".opt_header .text").text($(this).text());
 		});
 
 		// 자사 일반 상품 컬러 선택시
@@ -315,13 +323,13 @@
 
 			if(cart.goodsType == "G056_S") {
 				$(".setSizeSelect").each(function() {
-					$(this).find("ul.list > li").each(function() {
+					$(this).find("li").each(function() {
 						if($(this).hasClass("selected")) {
 							optCds.push($(this).attr("optCd"));
 							cartDtlSqArr.push($(this).attr("data"));
 						}
 					});
-					itemCds.push($(this).find("div.select").attr("data"));
+					itemCds.push($(this).parent().find("div.select").attr("data"));
 				});
 
 				data = {
@@ -334,6 +342,11 @@
 					, goodsQty : $("input[name=goodsQty]").val()
 				}
 			} else if(cart.goodsType != "G056_S" && cart.selfGoodsYn == "Y") {
+				if($(".selfGoodsSize").find("input[name=rdi-optsize]:checked").length < 1) {
+					mcxDialog.alert("옵션을 선택해 주세요.");
+					return false;
+				}
+
 				optCds.push($(".selfGoodsSize").find("input[name=rdi-optsize]:checked").val());
 				itemCds.push(cart.goodsCd);
 				$(".selfGoodsColorSelect").each(function() {
@@ -354,11 +367,13 @@
 			} else {
 				// optCds.push($(".selfGoodsColor").val());
 				itemCds.push(cart.goodsCd);
-				$(".setSizeSelect .selected").each(function() {
-					if($(this).attr("data") > 0) {
-						cartDtlSqArr.push($(this).attr("data"));
-						optCds.push($(this).attr("optCd"));
-					}
+				$(".setSizeSelect").each(function() {
+					$(this).find("li").each(function() {
+						if($(this).hasClass("selected")) {
+							optCds.push($(this).attr("optCd"));
+							cartDtlSqArr.push($(this).attr("data"));
+						}
+					});
 				});
 
 				data = {
@@ -371,7 +386,7 @@
 					, goodsQty : $("input[name=goodsQty]").val()
 				}
 			}
-
+			alert(JSON.stringify(data));
 			$.ajax( {
 				type: "POST",
 				url : '/cart/change/option',
@@ -384,8 +399,10 @@
 				success : function(result) {
 					mcxDialog.alert(result.message);
 					$(".closeCartOptionModal").trigger("click");
-					let data = {shotDelvUseYn : $("input[name=shotDelvUseYn]:checked").val()};
-					getCartList(data);
+					if(result.status == "SUCCESS") {
+						let data = {shotDelvUseYn : $("input[name=shotDelvUseYn]:checked").val()};
+						getCartList(data);
+					}
 				}
 			});
 		}

+ 34 - 42
src/main/webapp/WEB-INF/views/web/cart/CartListAjaxFormWeb.html

@@ -89,9 +89,9 @@
 										<input type="hidden" name="amtTmtbSq" th:value="${cart.amtTmtbSq}" />
 										<input type="hidden" name="amtTmtbNm" th:value="${cart.amtTmtbNm}" />
 										<input type="hidden" name="currPrice" th:value="${cart.currPrice}" />
+										<input type="hidden" name="tmtbDcAmt" th:value="${cart.tmtbDcAmt}" />
 										<input type="hidden" name="soldoutYn" th:value="${cart.soldoutYn}" />
 										<input type="hidden" name="ordCanYn" th:value="${cart.ordCanYn}" />
-										<input type="hidden" name="tmtbDcAmt" th:value="${cart.tmtbDcAmt}" />
 										<input type="hidden" name="cartSq" th:value="${cart.cartSq}" />
 
 										<div class="order_desc">
@@ -166,7 +166,7 @@
 												<p><button type="button" class="btn btn_default btn_sm" th:onclick="|fnChangeCartOptCd(${cart.cartSq})|" th:disabled="${cart.ordCanYn.equals('N')}"><span>옵션 / 수량 변경</span></button></p>
 												<div class="util">
 													<span>
-														<button type="button" class="btn_favorite" th:classappend="${cart.wishCnt > 0} ? active" onclick="cfnPutWishList(this)" th:goodsCd="${cart.goodsCd}" th:ithrCd="${cart.ithrCd}" th:contentsLoc="${cart.contentsLoc}" th:disabled="${cart.soldoutYn.equals('Y')}">
+														<button type="button" class="btn_favorite" th:classappend="${cart.wishCnt > 0} ? active" onclick="cfnPutWishList(this)" th:goodsCd="${cart.goodsCd}" th:ithrCd="${cart.ithrCd}" th:contentsLoc="${cart.contentsLoc}" th:disabled="${cart.ordCanYn.equals('N')}">
 															<span><i class="ico ico_like2"></i><em class="sr-only">관심상품 추가</em></span>
 														</button>
 													</span>
@@ -200,14 +200,15 @@
 										<input type="hidden" name="amtTmtbSq" th:value="${cart.amtTmtbSq}" />
 										<input type="hidden" name="amtTmtbNm" th:value="${cart.amtTmtbNm}" />
 										<input type="hidden" name="currPrice" th:value="${cart.currPrice}" />
-										<input type="hidden" name="soldoutYn" th:value="${cart.soldoutYn}" />
 										<input type="hidden" name="tmtbDcAmt" th:value="${cart.tmtbDcAmt}" />
+										<input type="hidden" name="soldoutYn" th:value="${cart.soldoutYn}" />
+										<input type="hidden" name="ordCanYn" th:value="${cart.ordCanYn}" />
 										<input type="hidden" name="cartSq" th:value="${cart.cartSq}" />
 
 										<div class="order_desc">
 											<div class="form_box">
 												<div class="form_field">
-													<input th:id="|od_item_${cart.cartSq}|" name="cartSqArr" type="checkbox" th:value="${cart.cartSq}" th:checked="${cart.soldoutYn.equals('N')}" th:disabled="${cart.soldoutYn.equals('Y')}">
+													<input th:id="|od_item_${cart.cartSq}|" name="cartSqArr" type="checkbox" th:value="${cart.cartSq}" th:checked="${cart.soldoutYn.equals('N') and cart.ordCanYn.equals('Y')}" th:disabled="${cart.soldoutYn.equals('Y') or cart.ordCanYn.equals('N')}">
 													<label th:for="|od_item_${cart.cartSq}|">
 														<span class="sr-only">상품선택</span>
 													</label>
@@ -244,7 +245,8 @@
 														<p th:if="${cart.qtyTmtbSq > 0 and cart.applyQtySectionYn == 'N'}" class="notApplyTmtb"><a href="" class="btn_moresale"><span class="tag primary">SALE</span>다다익선 상품보기</a></p>
 														<p th:if="${cart.amtTmtbSq > 0 and cart.applyAmtSectionYn == 'Y'}" class="applyTmtb"><span class="tag primary">SALE</span>다다익선 할인 적용</p>
 														<p th:if="${cart.amtTmtbSq > 0 and cart.applyAmtSectionYn == 'N'}" class="notApplyTmtb"><a href="" class="btn_moresale"><span class="tag primary">SALE</span>다다익선 상품보기</a></p>
-														<p th:if="${cart.soldoutYn.equals('Y')}">해당 상품은 구매 불가능한 상품입니다.</p>
+														<p th:if="${cart.soldoutYn.equals('Y')}">품절된 상품입니다.</p>
+														<p th:if="${cart.ordCanYn.equals('N')}">해당 상품은 구매 불가능한 상품입니다.</p>
 													</div>
 												</div>
 											</div>
@@ -263,13 +265,13 @@
 												</p>
 											</div>
 											<div class="button_box">
-												<p th:if="${cart.soldoutYn.equals('Y')}"><button type="button" class="btn btn_dark btn_sm" disabled=""><span>구매 불가</span></button></p>
-												<p th:if="${cart.soldoutYn.equals('N')}"><button type="button" class="btn btn_primary btn_sm" th:onclick="|fnSubmitNoMember(${cart.cartSq})|"><span>바로 구매</span></button></p>
+												<p th:if="${cart.soldoutYn.equals('Y') or cart.ordCanYn.equals('N')}"><button type="button" class="btn btn_dark btn_sm" disabled=""><span>구매 불가</span></button></p>
+												<p th:if="${cart.soldoutYn.equals('N') and cart.ordCanYn.equals('Y')}"><button type="button" class="btn btn_primary btn_sm" th:onclick="|fnSubmitNoMember(${cart.cartSq})|"><span>바로 구매</span></button></p>
 
-												<p><button type="button" class="btn btn_default btn_sm" th:onclick="|fnChangeCartOptCd(${cart.cartSq})|" th:disabled="${cart.soldoutYn.equals('Y')}"><span>옵션 / 수량 변경</span></button></p>
+												<p><button type="button" class="btn btn_default btn_sm" th:onclick="|fnChangeCartOptCd(${cart.cartSq})|" th:disabled="${cart.ordCanYn.equals('N')}"><span>옵션 / 수량 변경</span></button></p>
 												<div class="util">
 													<span>
-														<button type="button" class="btn_favorite" th:classappend="${cart.wishCnt > 0} ? active" onclick="cfnPutWishList(this)" th:goodsCd="${cart.goodsCd}" th:ithrCd="${cart.ithrCd}" th:contentsLoc="${cart.contentsLoc}" th:disabled="${cart.soldoutYn.equals('Y')}">
+														<button type="button" class="btn_favorite" th:classappend="${cart.wishCnt > 0} ? active" onclick="cfnPutWishList(this)" th:goodsCd="${cart.goodsCd}" th:ithrCd="${cart.ithrCd}" th:contentsLoc="${cart.contentsLoc}" th:disabled="${cart.ordCanYn.equals('N')}">
 															<span><i class="ico ico_like2"></i><em class="sr-only">관심상품 추가</em></span>
 														</button>
 													</span>
@@ -315,13 +317,14 @@
 										<input type="hidden" name="amtTmtbNm" th:value="${cart.amtTmtbNm}" />
 										<input type="hidden" name="currPrice" th:value="${cart.currPrice}" />
 										<input type="hidden" name="soldoutYn" th:value="${cart.soldoutYn}" />
+										<input type="hidden" name="ordCanYn" th:value="${cart.ordCanYn}" />
 										<input type="hidden" name="tmtbDcAmt" th:value="${cart.tmtbDcAmt}" />
 										<input type="hidden" name="cartSq" th:value="${cart.cartSq}" />
 
 										<div class="order_desc">
 											<div class="form_box">
 												<div class="form_field">
-													<input th:id="|od_item_${cart.cartSq}|" name="cartSqArr" type="checkbox" th:value="${cart.cartSq}" th:checked="${cart.soldoutYn.equals('N')}" th:disabled="${cart.soldoutYn.equals('Y')}">
+													<input th:id="|od_item_${cart.cartSq}|" name="cartSqArr" type="checkbox" th:value="${cart.cartSq}" th:checked="${cart.soldoutYn.equals('N') and cart.ordCanYn.equals('Y')}" th:disabled="${cart.soldoutYn.equals('Y') or cart.ordCanYn.equals('N')}">
 													<label th:for="|od_item_${cart.cartSq}|">
 														<span class="sr-only">상품선택</span>
 													</label>
@@ -357,7 +360,8 @@
 													<p th:if="${cart.qtyTmtbSq > 0 and cart.applyQtySectionYn == 'N'}" class="notApplyTmtb"><a href="" class="btn_moresale"><span class="tag primary">SALE</span>다다익선 상품보기</a></p>
 													<p th:if="${cart.amtTmtbSq > 0 and cart.applyAmtSectionYn == 'Y'}" class="applyTmtb"><span class="tag primary">SALE</span>다다익선 할인 적용</p>
 													<p th:if="${cart.amtTmtbSq > 0 and cart.applyAmtSectionYn == 'N'}" class="notApplyTmtb"><a href="" class="btn_moresale"><span class="tag primary">SALE</span>다다익선 상품보기</a></p>
-													<p th:if="${cart.soldoutYn.equals('Y')}">해당 상품은 구매 불가능한 상품입니다.</p>
+													<p th:if="${cart.soldoutYn.equals('Y')}">품절된 상품입니다.</p>
+													<p th:if="${cart.ordCanYn.equals('N')}">해당 상품은 구매 불가능한 상품입니다.</p>
 												</div>
 											</div>
 											<div class="calc_box">
@@ -375,13 +379,13 @@
 												</p>
 											</div>
 											<div class="button_box">
-												<p th:if="${cart.soldoutYn.equals('Y')}"><button type="button" class="btn btn_dark btn_sm" disabled=""><span>구매 불가</span></button></p>
-												<p th:if="${cart.soldoutYn.equals('N')}"><button type="button" class="btn btn_primary btn_sm" th:onclick="|fnSubmitNoMember(${cart.cartSq})|"><span>바로 구매</span></button></p>
+												<p th:if="${cart.soldoutYn.equals('Y') or cart.ordCanYn.equals('N')}"><button type="button" class="btn btn_dark btn_sm" disabled=""><span>구매 불가</span></button></p>
+												<p th:if="${cart.soldoutYn.equals('N') and cart.ordCanYn.equals('Y')}"><button type="button" class="btn btn_primary btn_sm" th:onclick="|fnSubmitNoMember(${cart.cartSq})|"><span>바로 구매</span></button></p>
 
-												<p><button type="button" class="btn btn_default btn_sm" th:onclick="|fnChangeCartOptCd(${cart.cartSq})|" th:disabled="${cart.soldoutYn.equals('Y')}"><span>옵션 / 수량 변경</span></button></p>
+												<p><button type="button" class="btn btn_default btn_sm" th:onclick="|fnChangeCartOptCd(${cart.cartSq})|" th:disabled="${cart.ordCanYn.equals('N')}"><span>옵션 / 수량 변경</span></button></p>
 												<div class="util">
 													<span>
-														<button type="button" class="btn_favorite" th:classappend="${cart.wishCnt > 0} ? active" onclick="cfnPutWishList(this)" th:goodsCd="${cart.goodsCd}" th:ithrCd="${cart.ithrCd}" th:contentsLoc="${cart.contentsLoc}" th:disabled="${cart.soldoutYn.equals('Y')}">
+														<button type="button" class="btn_favorite" th:classappend="${cart.wishCnt > 0} ? active" onclick="cfnPutWishList(this)" th:goodsCd="${cart.goodsCd}" th:ithrCd="${cart.ithrCd}" th:contentsLoc="${cart.contentsLoc}" th:disabled="${cart.ordCanYn.equals('N')}">
 															<span><i class="ico ico_like2"></i><em class="sr-only">관심상품 추가</em></span>
 														</button>
 													</span>
@@ -581,40 +585,28 @@
 			/* 세트상품 장바구니 */
 			/*let compsList = [];
 			let temp = new Object;
-			temp.goodsCd = "STYS00000002";
-			temp.itemCd = "CMW1GQJM91";
-			temp.optCd = "10127856-3";
+			temp.goodsCd = "STYS00000005";
+			temp.itemCd = "A83F-DP568S";
+			temp.optCd = "14019445-2";
 			temp.goodsQty = 1;
 			temp.goodsType = "G056_S";
 			temp.cartGb = "C";
-			temp.afLinkCd = "afLinkCd";
-			temp.ithrCd = "G027_ZZZ";
-			temp.contentsLoc = "G028_YYY";
-			temp.planDtlSq = "123";
+			temp.afLinkCd = "aaaa";
+			temp.ithrCd = "12311";
+			temp.contentsLoc = "afasd";
+			temp.planDtlSq = "44";
 			compsList.push(temp);
 			temp = new Object;
-			temp.goodsCd = "STYS00000002";
-			temp.itemCd = "CMW0GQTS53";
-			temp.optCd = "10127620-2";
+			temp.goodsCd = "STYS00000005";
+			temp.itemCd = "A83F-TS517S";
+			temp.optCd = "11867579-2";
 			temp.goodsQty = 1;
 			temp.goodsType = "G056_S";
 			temp.cartGb = "C";
-			temp.afLinkCd = "afLinkCd";
-			temp.ithrCd = "G027_ZZZ";
-			temp.contentsLoc = "G028_YYY";
-			temp.planDtlSq = "123";
-			compsList.push(temp);
-			temp = new Object;
-			temp.goodsCd = "STYS00000002";
-			temp.itemCd = "CNF1GADN51";
-			temp.optCd = "11873201-4";
-			temp.goodsQty = 1;
-			temp.goodsType = "G056_S";
-			temp.cartGb = "C";
-			temp.afLinkCd = "afLinkCd";
-			temp.ithrCd = "G027_ZZZ";
-			temp.contentsLoc = "G028_YYY";
-			temp.planDtlSq = "123";
+			temp.afLinkCd = "aaaa";
+			temp.ithrCd = "12311";
+			temp.contentsLoc = "afasd";
+			temp.planDtlSq = "44";
 			compsList.push(temp);
 
 			cfnAddCart(compsList);*/
@@ -1140,7 +1132,7 @@
 						}
 
 						if(delv.delvFee == 0) {
-							$(".delvList").find(".delv_" + delv.delvFeeCd).html("<span class='dlvr_fee'>배송비 무료</span><span class='dlvr_fee'><em>" + delv.supplyCOmpNm + "</em> 업체직배송</span>");
+							$(".delvList").find(".delv_" + delv.delvFeeCd).html("<span class='dlvr_fee'>배송비 무료</span><span class='dlvr_fee'><em>" + delv.supplyCompNm + "</em> 업체직배송</span>");
 						} else {
 							let html = "<div className='order_delivery'><span class='dlvr_fee'>배송비 <em>" + Number(delv.delvFee).toLocaleString() + "</em>원</span><span class='dlvr_shop'><em>" + delv.supplyCompNm + "</em> 업체직배송</span><a href='#' className='btn_popup_save'>배송비 SAVE 상품 보기</a></div>";
 							$(".delvList").find(".delv_" + delv.delvFeeCd).html(html);

+ 113 - 0
src/main/webapp/WEB-INF/views/web/common/fragments/FooterWeb.html

@@ -985,6 +985,108 @@
 // 	});
 	}
 	
+	// 팝업
+	let fnGetPopup = function(){
+		let data = {viewPage : [[${viewPage}]]
+					,cateNo : [[${popupCateNo}]]
+					,planSq : [[${popupPlanSq}]]
+					,preview : [[${preview}]]
+					,viewDt : [[${viewDt}]]
+		};
+		$.getJSON('/display/popup/list', data, function(result, status) {
+			if (status === 'success') {
+				if(result.length>0){
+					let popupYn = "N";
+					let popupSq = "";
+					let tag = '';
+					tag += '<div id="layer_popup" class="popup_main_notice">\n';
+					tag += '	<div class="popup_content">\n';
+					tag += '		<div class="popup_body">\n';
+					tag += '			<div class="swiper-container">\n';
+					tag += '				<div class="swiper-wrapper">\n';
+					$.each(result, function(idx, item) {
+						if(document.cookie.match('(^|;)?style_popup_'+item.popupSq+'=([^;]*)(;|$)')==null) {
+							tag += '					<div class="swiper-slide">\n';
+							if(!gagajf.isNull(item.linkUrl1) && item.linkUrl1 !== "#"){
+							tag += '						<a href="'+ item.linkUrl1 +'"  target="_blank">\n';	
+							}
+							tag += '						<img src="/images/pc/thumb/img_main_pop1.jpg" width="100%" alt="">\n';
+							if(!gagajf.isNull(item.linkUrl1) && item.linkUrl1 !== "#"){
+							tag += '						</a>\n';
+							}
+							tag += '					</div>\n';
+							popupYn = "Y";
+							popupSq += item.popupSq +"|";
+						}
+					});	
+					tag += '				</div>\n';
+					tag += '				<div class="swiper-button-prev"></div>\n';
+					tag += '				<div class="swiper-button-next"></div>\n';
+					tag += '			</div>\n';
+					tag += '		</div>\n';
+					tag += '		<div class="popup_footer">\n';
+					tag += '			<a href="javascript:void(0);" onclick="fnLayerPopupUnexpDaysClose(\''+popupSq+'\',1);" class="btn_underline"> 하루 보지 않기</a>\n';
+					tag += '			<a href="javascript:void(0);" id="btnPopupClose" onclick="fnLayerPopupClose();" class="btn_popup_close">닫기</a>\n';
+					tag += '		</div>\n';
+					tag += '	</div>\n';
+					tag += '</div>\n';
+					
+					if (popupYn == "Y"){
+						if ($('#layer_popup').length === 0) {
+							$('body').append(tag);
+						}	
+					}
+					
+					/* SLIDE - 메인 공지 팝업 */
+					var popup_main_notice_slide = new Swiper ('.popup_main_notice .swiper-container', {
+						loop: false,
+						slidesPerView:'auto',
+						spaceBetween: 0,
+						speed:200,
+						autoplay: false,
+						navigation: {
+							nextEl: '.popup_main_notice .swiper-button-next',
+							prevEl: '.popup_main_notice .swiper-button-prev',
+						},
+					});	
+
+					/* 메인 공지 팝업 갯수체크 */
+					var popNoticeCont = $('.popup_main_notice .swiper-slide');
+					var popNoticeLength = popNoticeCont.length;
+					if (popNoticeLength == 1) {
+						popNoticeCont.parents('.popup_body').addClass('onlyNotice');
+					} else {
+						popNoticeCont.parents('.popup_body').removeClass('onlyNotice');
+					}
+					
+				}
+			}
+		});
+	}
+
+	let fnLayerPopupUnexpDaysClose = function(seq, unexpDays){
+		let arrSeq = seq.split("|");
+		if (arrSeq.length > 0){
+			let todayDate = new Date();
+			//todayDate = new Date(parseInt(todayDate.getTime() / 86400000) * 86400000 + 54000000);
+			todayDate = new Date(parseInt(todayDate.getTime() / 86400000) * 86400000);	// 당일 자정처리
+			todayDate.setDate(todayDate.getDate() + unexpDays);
+			
+			$.each(arrSeq, function (idx, item) {
+				if (!gagajf.isNull(item)){
+					document.cookie = "style_popup_"+item+"=Y; path=/; expires=" + todayDate.toGMTString() + ";";	
+				}
+			});
+		}
+		
+		fnLayerPopupClose();
+	}
+	// 창 닫기
+	let fnLayerPopupClose = function(){
+		//$('#layer_popup').hide();
+		$('#layer_popup').remove();
+	}
+	
 	$(document).ready( function() {
 		// 퀵메뉴탭 조회
 		fnCreateQuickMenuTab();
@@ -995,6 +1097,9 @@
 		// 최근본상품 조회
 		fnGetRecentlyGoods();
 		
+		// 팝업조회
+		fnGetPopup();
+		
 		// Family Site
 		$('.family_link').on('click','.btn',function(e){
 			e.preventDefault();
@@ -1059,6 +1164,14 @@
 		$(".coupon_pop_btn").click(function() {
 			$(".coupon_popup").modal("show");
 		});
+		
+						
+
+		/* 메인 공지 팝업 닫기 */
+		$(document).on('click','#btnPopupClose',function(e){
+			$('#popupMainNotice').hide();
+			return false;
+		});		
 	});
 /*]]>*/
 </script>

+ 1 - 0
src/main/webapp/WEB-INF/views/web/common/fragments/HeadWeb.html

@@ -71,6 +71,7 @@
 	<script src="/ux/plugins/mcxdialog/mcxdialog_ui.js"></script>
 	
 	<script type="text/javascript" src="https://ssl.daumcdn.net/dmaps/map_js_init/postcode.v2.js"></script>
+	<script src="https://www.google.com/recaptcha/api.js" async defer></script>
 
 	<!-- Global site tag (gtag.js) - Google Analytics -->
 <!-- 	<script async src="https://www.googletagmanager.com/gtag/js?id=UA-168660512-1"></script> -->

+ 2 - 2
src/main/webapp/WEB-INF/views/web/common/layout/DefaultLayoutWeb.html

@@ -15,6 +15,8 @@
 	
 <th:block th:replace="~{web/common/fragments/VariablesWeb :: variables}"></th:block>
 
+<th:block th:replace="~{web/common/fragments/ScriptsWeb :: scripts}"></th:block>
+
 <!-- GNB -->
 <header id="header" th:replace="~{web/common/fragments/GnbWeb :: gnb}"></header>
 <!--// GNB -->
@@ -26,8 +28,6 @@
 <!-- Footer -->
 <footer id="footer" th:replace="~{web/common/fragments/FooterWeb :: footer}"></footer>
 
-<th:block th:replace="~{web/common/fragments/ScriptsWeb :: scripts}"></th:block>
-
 <script th:inline="javascript">
 /*<![CDATA[*/
 	$(document).ready(function() {

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

@@ -206,7 +206,7 @@
 											<div class="swiper-slide">
 												<div class="item_prod">
 													<div class="item_state">
-														<button type="button" class="itemLike">관심상품 추가</button>
+														<button type="button" class="itemLike" th:classappend="${goodsData.likeIt}">관심상품 추가</button>
 														<a href="javascript:void(0);" class="itemLink" th:onclick="cfnGoToGoodsDetail([[${goodsData.goodsCd}]], '', '', 'SMM006');">
 															<div class="itemPic">
 																<img alt="" class="pd_img" th:src="${@environment.getProperty('upload.goods.view') + '/' + goodsData.sysImgNm}">
@@ -233,6 +233,76 @@
 					</div>
 				</th:block>
 
+				<!-- 7. 브랜드픽 -->
+				<th:block th:if="${contentsLoc=='007'}">
+					<div class="content main_pick">
+						<div class="cont_head">
+							<p class="displayH t_c" th:text="${mainLayoutData.contentsTitle}">브랜드 PICK1</p>
+						</div>
+						<div class="cont_body">
+							<div class="swiper-container post-pick-nav">
+								<div class="swiper-wrapper">
+									<th:block th:each="ContentsData, ContentsStat : ${mainLayoutData.ContentsList}">
+										<div class="swiper-slide"><img th:src="${@environment.getProperty('domain.image')+ContentsData.brandGroupImg}"></div>
+									</th:block>
+								</div>
+								<div class="swiper-button-prev "></div>
+								<div class="swiper-button-next "></div>
+							</div>
+						</div>
+						<div class="swiper-container post-pick-for">
+							<div class="swiper-wrapper">
+								<th:block th:each="brandPickData, brandPickStat : ${mainLayoutData.brandPickList}">
+									<div class="swiper-slide">
+										<div class="pick_look">
+											<div class="swiper-container post-lookbook">
+												<div class="swiper-wrapper">
+													<th:block th:each="bannerData, bannerStat : ${brandPickData.BannerList}">
+														<div class="swiper-slide" th:if="${bannerData.imgPath1 != ''}">
+															<div class="text_box">
+																<p class="title" th:text="${bannerData.strTitle1}">BUCKAROO<br> 2020 가을 신상 오픈1</p>
+																<p class="sub_text" th:text="${bannerData.subText1}"> 2020 FALL / WINTER 신상살펴보기1</p>
+															</div>
+															<div class="img_box">
+																<img th:src="${@environment.getProperty('domain.image')+bannerData.imgPath1}" alt="barnd lookbook">
+															</div>
+														</div>
+													</th:block>
+												</div>
+												<div class="swiper-controls">
+													<div class="swiper-pagination"></div>
+												</div>
+											</div>
+										</div>
+										<div class="pick_item">
+											<div class="itemGrp">
+												<th:block th:each="goodsData, goodsStat : ${brandPickData.goodsList}">
+													<div class="item_prod" th:if="${goodsStat.count<4}">
+														<div class="item_state">
+															<button type="button" class="itemLike" tabindex="0">관심상품 추가</button>
+															<a href="javascript:void(0);" class="itemLink" th:onclick="cfnGoToGoodsDetail([[${goodsData.goodsCd}]], '', '', 'SMM007');">
+																<div class="itemPic">
+																	<img alt="BLACK-a" class=" vLHTC pd_img" th:src="${@environment.getProperty('upload.goods.view') + '/' + goodsData.sysImgNm}">
+																</div>
+																<div class=" itemName" th:text="${goodsData.goodsFullNm}">남성 로고 자카드 방풍 패딩 스웨터 가디건 자카드 방풍 패딩 스웨터 가디건 자카드 방풍 패딩 스웨터 가디건</div>
+																<p class="itemPrice" th:text="${#numbers.formatInteger(goodsData.currPrice,1,'COMMA')}">80,100
+																	<span class="itemPrice_original" th:text="${#numbers.formatInteger(goodsData.listPrice,1,'COMMA')}">89,000</span>
+																	<span class=" itemPercent" th:if="${goodsData.currPrice != goodsData.listPrice}" th:text="${(goodsData.listPrice == 0 ? 0 : #numbers.formatDecimal((goodsData.listPrice - goodsData.currPrice) / (goodsData.listPrice * 1.0) * 100, 1, 0)) + '%'}">10%</span>
+																</p>
+																<div class="itemComment">#데일리웨어로 매일입고싶은</div>
+															</a>
+														</div>
+													</div>
+												</th:block>
+											</div>
+										</div>
+									</div>
+								</th:block>
+							</div>
+						</div>
+					</div>
+				</th:block>
+
 				<!-- 8. 가로 긴 배너 슬라이드 -->
 				<!-- bnn_1stage -->
 				<th:block th:if="${contentsLoc=='008'}">
@@ -269,6 +339,60 @@
 						</div>
 					</div>
 				</th:block>
+
+				<!-- 9. MD추천 스타일 -->
+				<th:block th:if="${contentsLoc=='009'}">
+					<div class="content main_recomm" >
+						<div class="cont_head">
+							<p class="displayH t_c" th:text="${mainLayoutData.contentsTitle}"></p>
+						</div>
+						<div class="cont_body">
+							<div class="sec_head">
+								<div class="filter action tag_list">
+									<th:block th:each="titleData, titleStat : ${mainLayoutData.mdPickList}">
+										<button class="btn" th:classappend="${titleStat.count} == 1? active" th:attr="data-tab=${'tag'+titleStat.count}" th:text="${titleData.mdTitle}">따뜻한 무드2</button>
+									</th:block>
+								</div>
+							</div>
+							<div class="sec_body">
+								<th:block th:each="titleData, titleStat : ${mainLayoutData.mdPickList}">
+									<div th:id="${'tag'+titleStat.count}" class="tagitem" th:classappend="${titleStat.count} == 1? active">
+										<div class="swiper-container post-recomm">
+											<div class="swiper-wrapper">
+												<th:block th:each="goodsData, goodsStat : ${titleData.goodsList}">
+													<div class="swiper-slide">
+														<div class="item_prod">
+															<div class="item_state">
+																<button type="button" class="itemLike" th:classappend="${goodsData.likeIt}">관심상품 추가</button>
+																<a href="javascript:void(0);" class="itemLink" th:onclick="cfnGoToGoodsDetail([[${goodsData.goodsCd}]], '', '', 'SMM009');">
+																	<div class="itemPic">
+																		<img alt="" class=" vLHTC pd_img" th:src="${@environment.getProperty('upload.goods.view') + '/' + goodsData.sysImgNm}">
+																	</div>
+																	<p class="itemBrand" th:text="${goodsData.brandGroupNm}">BRAND NAME</p>
+																	<div class=" itemName" th:text="${goodsData.goodsFullNm}">남성 로고 자카드 방풍 패딩 스웨터 가디건 자카드 방풍 패딩 스웨터 가디건 자카드 방풍 패딩 스웨터 가디건</div>
+																	<p class="itemPrice" th:text="${#numbers.formatInteger(goodsData.currPrice,1,'COMMA')}">80,100
+																		<span class="itemPrice_original" th:text="${#numbers.formatInteger(goodsData.listPrice,1,'COMMA')}">89,000</span>
+																		<span class=" itemPercent" th:if="${goodsData.currPrice != goodsData.listPrice}" th:text="${(goodsData.listPrice == 0 ? 0 : #numbers.formatDecimal((goodsData.listPrice - goodsData.currPrice) / (goodsData.listPrice * 1.0) * 100, 1, 0)) + '%'}">10%</span>
+																	</p>
+																	<div class="itemComment">#주문 폭주 상품</div>
+																</a>
+															</div>
+														</div>
+													</div>
+												</th:block>
+											</div>
+											<div class="swiper-controls">
+												<div class="swiper-pagination"></div>
+											</div>
+										</div>
+										<div class="swiper-button-prev"></div>
+										<div class="swiper-button-next"></div>
+									</div>
+								</th:block>
+							</div>
+						</div>
+					</div>
+				</th:block>
 			</th:block>
 		</th:block>
 

+ 120 - 183
src/main/webapp/WEB-INF/views/web/mypage/ChangeOptionPopupFormWeb.html

@@ -8,187 +8,12 @@
 			<div class="select_option_area">
 				<h6>옵션 변경 상품 선택</h6>
 				<div class="form_field">
-					<div>
-						<input id="chk_exchange_item1" name="chk_exchange_item" type="checkbox" checked=""><label for="chk_exchange_item1"><span>슬림핏 체크 네이비컬러 스탠드카라 셋업수트 자켓 / Black</span></label>
-					</div>
-					<div>
-						<input id="chk_exchange_item2" name="chk_exchange_item" type="checkbox"><label for="chk_exchange_item2"><span>베이직 셔츠 / Green</span> </label>
-					</div>
-					<div>
-						<input id="chk_exchange_item3" name="chk_exchange_item" type="checkbox"><label for="chk_exchange_item3"><span>체크 베이직 셔츠 / Green / M</span></label>
+					<div th:if="${exchangeOptionInfo}" th:each="oneData, status : ${exchangeOptionInfo}">
+						<input th:id="|chk_exchange_item_${oneData.ordDtlItemSq}|" th:attr="ordDtlItemSq=${oneData.ordDtlItemSq}" type="checkbox" onclick="fnSelectOptionChange(this);"><label th:for="|chk_exchange_item_${oneData.ordDtlItemSq}|"><span th:text="|${oneData.itemNm} / ${oneData.colorNm} / ${oneData.optCd2}|"></span></label>
 					</div>
 				</div>
 			</div>
-			<div class="modify_option_area">
-				<div class="modify_box">
-					<div class="name_blk">
-						슬림핏 체크 네이비컬러 스탠드카라 셋업수트 자켓 / Black
-					</div>
-					<div class="select_blk">
-						<!-- 옵션교환 라디오 형태 -->
-						<div class="sel_radio">
-							<div class="form_field">
-								<div>
-									<input type="radio" name="rdi-modifysize1" id="rdi-modifysize11" value="" checked="">
-									<label for="rdi-modifysize11"><span>90</span></label>
-								</div>
-								<div>
-									<input type="radio" name="rdi-modifysize1" id="rdi-modifysize12" value="" disabled="">
-									<label for="rdi-modifysize12"><span>95</span></label>
-								</div>
-								<div>
-									<input type="radio" name="rdi-modifysize1" id="rdi-modifysize13" value="">
-									<label for="rdi-modifysize13"><span>100</span></label>
-								</div>
-								<div>
-									<input type="radio" name="rdi-modifysize1" id="rdi-modifysize14" value="">
-									<label for="rdi-modifysize14"><span>105</span></label>
-								</div>
-								<div>
-									<input type="radio" name="rdi-modifysize1" id="rdi-modifysize15" value="">
-									<label for="rdi-modifysize15"><span>110</span></label>
-								</div>
-								<div>
-									<input type="radio" name="rdi-modifysize1" id="rdi-modifysize16" value="">
-									<label for="rdi-modifysize16"><span>115</span></label>
-								</div>
-								<div>
-									<input type="radio" name="rdi-modifysize1" id="rdi-modifysize17" value="">
-									<label for="rdi-modifysize17"><span>free</span></label>
-								</div>
-								<div>
-									<input type="radio" name="rdi-modifysize1" id="rdi-modifysize18" value="">
-									<label for="rdi-modifysize18"><span>size1</span></label>
-								</div>
-								<div>
-									<input type="radio" name="rdi-modifysize1" id="rdi-modifysize19" value="">
-									<label for="rdi-modifysize19"><span>size2</span></label>
-								</div>
-							</div>
-						</div>
-						<!-- //옵션교환 라디오 형태 -->
-						<!-- 옵션교환 셀렉트박스 형태 -->
-						<div class="sel_select">
-							<div class="form_field">
-								<div class="select_custom exchange_option1">
-									<div class="combo">
-										<div class="select">옵션 선택</div>
-										<ul class="list">
-											<!-- 선택처리 class="selected" / 선택불가 aria-disabled="true" / 품절표기 data-soldout="true" 추가  -->
-											<li class="selected">옵션 선택</li>
-											<li>상품옵션01</li>
-											<li>상품옵션02</li>
-											<li>상품옵션03</li>
-											<li aria-disabled="true">상품옵션04</li>
-											<li>상품옵션05</li>
-											<li aria-disabled="true" data-soldout="true">상품옵션06</li>
-										</ul>
-									</div>
-								</div>
-							</div>
-						</div>
-						<!-- //옵션교환 셀렉트박스 형태 -->
-					</div>
-					<div class="allcheck_blk">
-						<div class="form_field">
-							<div>
-								<input id="chk_exchange_all1" name="chk_exchange_all1" type="checkbox" checked=""><label for="chk_exchange_all1"><span>선택 옵션으로 전체 교환</span></label>
-							</div>
-						</div>
-					</div>
-				</div>
-				<div class="modify_box">
-					<div class="name_blk">
-						베이직 셔츠 / Green
-					</div>
-					<div class="select_blk">
-						<!-- 옵션교환 라디오 형태 -->
-						<div class="sel_radio">
-							<div class="form_field">
-								<div>
-									<input type="radio" name="rdi-modifysize2" id="rdi-modifysize21" value="" checked="">
-									<label for="rdi-modifysize21"><span>90</span></label>
-								</div>
-								<div>
-									<input type="radio" name="rdi-modifysize2" id="rdi-modifysize22" value="" disabled="">
-									<label for="rdi-modifysize22"><span>95</span></label>
-								</div>
-								<div>
-									<input type="radio" name="rdi-modifysize2" id="rdi-modifysize23" value="">
-									<label for="rdi-modifysize23"><span>100</span></label>
-								</div>
-								<div>
-									<input type="radio" name="rdi-modifysize2" id="rdi-modifysize24" value="">
-									<label for="rdi-modifysize24"><span>105</span></label>
-								</div>
-								<div>
-									<input type="radio" name="rdi-modifysize2" id="rdi-modifysize25" value="">
-									<label for="rdi-modifysize25"><span>110</span></label>
-								</div>
-								<div>
-									<input type="radio" name="rdi-modifysize2" id="rdi-modifysize26" value="">
-									<label for="rdi-modifysize26"><span>115</span></label>
-								</div>
-								<div>
-									<input type="radio" name="rdi-modifysize2" id="rdi-modifysize27" value="">
-									<label for="rdi-modifysize27"><span>free</span></label>
-								</div>
-								<div>
-									<input type="radio" name="rdi-modifysize2" id="rdi-modifysize28" value="">
-									<label for="rdi-modifysize28"><span>size1</span></label>
-								</div>
-								<div>
-									<input type="radio" name="rdi-modifysize2" id="rdi-modifysize29" value="">
-									<label for="rdi-modifysize29"><span>size2</span></label>
-								</div>
-							</div>
-						</div>
-						<!-- //옵션교환 라디오 형태 -->
-					</div>
-					<div class="allcheck_blk">
-						<div class="form_field">
-							<div>
-								<input id="chk_exchange_all2" name="chk_exchange_all2" type="checkbox" checked=""><label for="chk_exchange_all2"><span>선택 옵션으로 전체 교환</span></label>
-							</div>
-						</div>
-					</div>
-				</div>
-
-				<div class="modify_box">
-					<div class="name_blk">
-						체크 베이직 셔츠 / Green
-					</div>
-					<div class="select_blk">
-						<!-- 옵션교환 셀렉트박스 형태 -->
-						<div class="sel_select">
-							<div class="form_field">
-								<div class="select_custom exchange_option2">
-									<div class="combo">
-										<div class="select">옵션 선택</div>
-										<ul class="list">
-											<!-- 선택처리 class="selected" / 선택불가 aria-disabled="true" / 품절표기 data-soldout="true" 추가  -->
-											<li class="selected">옵션 선택</li>
-											<li>상품옵션01</li>
-											<li>상품옵션02</li>
-											<li>상품옵션03</li>
-											<li aria-disabled="true">상품옵션04</li>
-											<li>상품옵션05</li>
-											<li aria-disabled="true" data-soldout="true">상품옵션06</li>
-										</ul>
-									</div>
-								</div>
-							</div>
-						</div>
-						<!-- //옵션교환 셀렉트박스 형태 -->
-					</div>
-					<div class="allcheck_blk">
-						<div class="form_field">
-							<div>
-								<input id="chk_exchange_all3" name="chk_exchange_all3" type="checkbox" checked=""><label for="chk_exchange_all3"><span>선택 옵션으로 전체 교환</span></label>
-							</div>
-						</div>
-					</div>
-				</div>
+			<div class="modify_option_area" id="modifyOptionArea" style="display:none">
 			</div>
 		</form>
 	</div>
@@ -197,9 +22,121 @@
 	<button type="button" id="" class="btn btn_dark"><span>옵션 저장</span></button>
 </div>
 <script th:inline="javascript">
-//컨텐츠 호출
-$(document).ready( function() {
-	var exchange_option_selecter1 = new sCombo('#exchangePop .select_custom.exchange_option1');
-	var exchange_option_selecter2 = new sCombo('#exchangePop .select_custom.exchange_option2');
-});
+	let exchangeOptionInfo = [[${exchangeOptionInfo}]];
+	let chgQty = [[${chgQty}]];
+	
+	$(document).ready( function() {
+		var exchange_option_selecter1 = new sCombo('#exchangePop .select_custom.exchange_option1');
+		var exchange_option_selecter2 = new sCombo('#exchangePop .select_custom.exchange_option2');
+	
+		//$('.form_field input:checkbox').eq(0).click();
+	});
+	
+	// 
+	var fnSelectOptionChange = function(param) {
+		let ordDtlItemSq = $(param).attr('ordDtlItemSq');
+		let ordDtlItemSqArr = [];
+		let cnt = 0;
+
+		// 체크 수량 조회
+		$.each($('.select_option_area .form_field input:checkbox'), function(idx, item) {
+			if ($(item).is(':checked')) {
+				ordDtlItemSqArr.push(Number($(item).attr('ordDtlItemSq')));
+				cnt++;
+			}
+		});
+
+		// 옵션변경영역 처리
+		if (cnt > 0) {
+			$('#modifyOptionArea').css('display', '');
+		} else {
+			$('#modifyOptionArea').css('display', 'none');
+		}
+
+		if (ordDtlItemSqArr.length > 0) {
+			// TODO
+			// 옵션변경영역 표기
+			$('#modifyOptionArea').css('display', '');
+
+			let html = '';
+			$.each(exchangeOptionInfo, function(idx, item) {
+				console.log(ordDtlItemSqArr);
+				console.log(item.ordDtlItemSq);
+				if (ordDtlItemSqArr.includes(item.ordDtlItemSq)) {
+					html += '				<div class="modify_box">';
+					html += '					<div class="name_blk">' + item.itemNm + ' / ' + item.optCd1 + '</div>';
+					html += '					<div class="select_blk">';
+
+					if (item.selfGoodsYn == 'Y') {
+						html += '						<div class="sel_radio">';
+						html += '							<div class="form_field">';
+						html += '								<input type="hidden" name="chgOptCd2">';
+					} else {
+						html += '						<div class="sel_select">';
+						html += '							<div class="form_field">';
+						html += '								<div class="select_custom exchange_option1">';
+						html += '									<div class="combo">';
+						html += '										<input type="hidden" name="chgOptCd2">';
+						html += '										<div class="select">옵션 선택</div>';
+						html += '										<ul class="list">';
+						html += '											<!-- 선택처리 class="selected" / 선택불가 aria-disabled="true" / 품절표기 data-soldout="true" 추가  -->';
+						html += '											<li class="selected">옵션 선택</li>';
+					}
+
+					$.each(item.optCd2Arr, function(index, option) {
+						let optCd2 = option;
+						let currStockQty = item.currStockQtyArr[index];
+						let soldoutYn = item.soldoutYnArr[index];
+						
+						if (item.selfGoodsYn == 'Y') {
+							html += '								<div>';
+							if (currStockQty <= 0 || soldoutYn == 'Y') {
+								html += '									<input type="radio" name="chgOptCd2" id="' + item.ordDtlItemSq + '_' + optCd2 + '" value="' + optCd2 + '" ordDtlItemSq="' + item.ordDtlItemSq + '" disabled>';
+							} else if (item.optCd2 == option) {
+								html += '									<input type="radio" name="chgOptCd2" id="' + item.ordDtlItemSq + '_' + optCd2 + '" value="' + optCd2 + '" ordDtlItemSq="' + item.ordDtlItemSq + '" checked>';
+							} else {
+								html += '									<input type="radio" name="chgOptCd2" id="' + item.ordDtlItemSq + '_' + optCd2 + '" value="' + optCd2 + '" ordDtlItemSq="' + item.ordDtlItemSq + '">';
+							}
+							html += '									<label for="' + item.ordDtlItemSq + '_' + optCd2 + '"><span>' + optCd2 + '</span></label>';
+							html += '								</div>';
+						} else {
+							if (currStockQty <= 0 || soldoutYn == 'Y') {
+								html += '											<li aria-disabled="true" data-soldout="true">' + option + '</li>';
+							} else {
+								html += '											<li optCd2="' + option + '" onclick="fnSelectOption(this);">' + option + '</li>';
+							}
+						}
+					});
+					
+					if (item.selfGoodsYn != 'Y') {
+						html += '										</ul>';
+						html += '									</div>';
+						html += '								</div>';
+					}
+
+					html += '							</div>';
+					html += '						</div>';
+					html += '					</div>';
+					html += '					<div class="allcheck_blk">';
+					html += '						<div class="form_field">';
+					html += '							<div>';
+					html += '								<input id="chk_exchange_all1" name="chk_exchange_all1" type="checkbox" checked=""><label for="chk_exchange_all1"><span>선택 옵션으로 전체 교환</span></label>';
+					html += '							</div>';
+					html += '						</div>';
+					html += '					</div>';
+					html += '				</div>';
+				}
+
+				$('#modifyOptionArea').html(html);
+				
+				if (item.selfGoodsYn != 'Y') {
+					var exchange_option_selecter1 = new sCombo('#exchangePop .select_custom.exchange_option1');
+				}
+			});
+		} else {
+			// TODO
+			// 옵션변경영역 초기화
+			// 옵션변경영역 히든처리
+		}
+	}
 </script>

+ 1 - 8
src/main/webapp/WEB-INF/views/web/mypage/MypageReviewFormWeb.html

@@ -367,14 +367,7 @@
 		
 	}
 	
-	var fnReviewCreate = function(obj1,obj2,obj3) {
-		let ordNo = obj1;
-		let ordDtlNo = obj2;
-		let goodsCd = obj3;
-		let reviewStat = 'c';
-		
-		cfnGoToPage(_PAGE_MYPAGE_CREATE_REVIEW + ordNo +'/'+ordDtlNo+'/'+goodsCd+'/'+reviewStat);
-	}
+	
 	
 	// 스크롤 이동
 	var fnMove = function(obj) {

+ 4 - 4
src/main/webapp/WEB-INF/views/web/mypage/MypageWishListWeb.html

@@ -18,7 +18,7 @@
  -->
 <!-- 월별 관심상품 -->
 <th:block th:if="${wishMonth != null}" th:each="WishMonth, wishStat : ${wishMonth}">
-<div class="monthly_wish_wrap">
+<div class="monthly_wish_wrap" th:with="frontUrl=${@environment.getProperty('domain.front')}, goodsView=${@environment.getProperty('upload.goods.view')}">
 	<div class="date">
 		<span th:text="${WishMonth.regDt}"></span>
 	</div>
@@ -29,9 +29,9 @@
 				<button type="button" class="itemLike active" th:attr="goodsCd=${WishGoods.goodsCd}, ithrCd='', contentsLoc='', planDtlSq=''" onclick="wishlistDelete(this)">관심상품 추가</button>
 				<a href="javascript:void(0);" class="itemLink" th:onclick="cfnGoToGoodsDetail([[${WishGoods.goodsCd}]])">
 					<div class="itemPic">
-						<img alt="" class=" vLHTC pd_img" src="/images/pc/thumb/prod5.jpg">
+						<img alt="" class=" vLHTC pd_img" th:src="${goodsView + '/' +WishGoods.sysImgNm}">
 					</div>
-					<p class=" itemBrand" th:text="${WishGoods.brandKnm}"></p>
+					<p class=" itemBrand" th:text="${WishGoods.brandGroupNm}"></p>
 					<div class=" itemName" th:text="${WishGoods.goodsNm}"></div>
 					<p class="itemPrice">[[${#numbers.formatInteger(WishGoods.currPrice,3,'POINT') + '원'}]]
 						<span class="itemPrice_original"  th:if="${WishGoods.currPrice != WishGoods.listPrice}" th:text="${#numbers.formatInteger(WishGoods.listPrice,3,'POINT') + '원'}"></span>
@@ -45,7 +45,7 @@
 					 <p class="itemBadge">
 						<span class="badge13">베스트 </span>
 					</p>
-					<div class="itemComment">★ [NEW] 20FW 빅웨이브 단독발매!</div>
+					<div class="itemComment" th:text="${WishGoods.goodsTnm}"></div>
 				</a>
 			</div>
 		</div>

+ 566 - 535
src/main/webapp/WEB-INF/views/web/planning/PlanningDetailFormWeb.html

@@ -5,7 +5,7 @@
 <!--
  *******************************************************************************
  * @source  : PlanningDetailFormWeb.html
- * @desc    : 기획전메인 Page
+ * @desc    : 기획전디테일 Page
  *============================================================================
  * Pastelmall
  * Copyright(C) 2020 TSIT, All rights reserved.
@@ -16,218 +16,178 @@
  *******************************************************************************
  -->
 <body>
-	<th:block layout:fragment="content">
-	<script src="https://developers.kakao.com/sdk/js/kakao.min.js"></script>
-		<!--  container -->
-		<div id="container" class="container dp" th:with="frontUrl=${@environment.getProperty('domain.front')}, goodsView=${@environment.getProperty('upload.goods.view')}, planView=${@environment.getProperty('upload.image.view')}">
-			<div class="breadcrumb">
-				<ul>
-					<li class="bread_home"><a href="javascript:void(0);"
+<th:block layout:fragment="content">
+<script src="https://developers.kakao.com/sdk/js/kakao.min.js"></script>
+<div id="container" class="container dp" th:with="frontUrl=${@environment.getProperty('domain.front')}, goodsView=${@environment.getProperty('upload.goods.view')}, planView=${@environment.getProperty('upload.image.view')}">
+		<div class="breadcrumb"> 
+			<ul>
+                <li class="bread_home"><a href="javascript:void(0);"
 						onclick="cfnGoToPage(_PAGE_MAIN);">홈</a></li>
-					<li class="bread_2depth"><a href="javascript:void(0);"
-						onclick="cfnGoToPage(_PAGE_PLANNING_MAIN);">기획전</a></li>
-					<li class="bread_2depth" th:text="${planInfo.planNm}"></li>
-				</ul>
-			</div>
-			<div class="wrap">
-				<div class="content wide dp_detail_case1">
-					<!-- 풀사이즈 -->
-					<div class="cont_head">
-						<div>
-							<h3 th:text="${planInfo.planNm}"></h3>
-							<div>
-								<div class="shareSet">
-										<button class="btn_share" data-name="openShare">공유하기</button>
-										<div class="shareWrap" th:with="stylelUrl=${@environment.getProperty('domain.front')}, imgGoodsUrl=${@environment.getProperty('upload.goods.view')}">
-										<div id="layerShare" class="setShare open">
-											<span>
-												<button type="button" class="kk" th:attr="onclick=|cfnSendToKakao('${stylelUrl+'/planning/detail/form?planSq='+planInfo.planSq}', '${planInfo.planNm}', '${planView+ '/'+planInfo.mainImg}');|"><span>카카오톡</span></button>
-												<button type="button" class="fb" th:attr="onclick=|sendSns('facebook', '${stylelUrl+'/planning/detail/form?planSq='+planInfo.planSq}', '${planInfo.planNm}', '', '');|"><span>페이스북</span></button>
-												<button type="button" class="tw" th:attr="onclick=|sendSns('twitter', '${stylelUrl+'/planning/detail/form?planSq='+planInfo.planSq}', '${planInfo.planNm+ '#style24몰'}', '', '');|"><span>트위터</span></button>
-												<button type="button" class="url btn_copy"><span>URL</span></button>
-											</span>
-										</div>
-									</div>
+				<li class="bread_2depth"><a href="javascript:void(0);"
+					onclick="cfnGoToPage(_PAGE_PLANNING_MAIN);">기획전</a></li>
+				<li class="bread_2depth" th:text="${planInfo.planNm}"></li>
+			</ul> 
+		</div>
+		<div class="wrap">
+            <!-- 상단 프로모션 배너 -->
+            <div class="content wide dp_detail_visual">
+                <div class="cont_head">
+                    <div>
+                        <h3 th:text="${planInfo.planNm}"></h4>
+                        <div class="shareSet">
+                            <button class="btn_share" data-name="openShare">공유하기</button>
+                            <!-- toggle contents -->
+                            <div id="layerShare" class="setShare open">
+									<span>
+										<button type="button" class="kk" th:attr="onclick=|cfnSendToKakao('${stylelUrl+'/planning/detail/form?planSq='+planInfo.planSq}', '${planInfo.planNm}', '${planView+ '/'+planInfo.mainImg}');|"><span>카카오톡</span></button>
+										<button type="button" class="fb" th:attr="onclick=|sendSns('facebook', '${stylelUrl+'/planning/detail/form?planSq='+planInfo.planSq}', '${planInfo.planNm}', '', '');|"><span>페이스북</span></button>
+										<button type="button" class="tw" th:attr="onclick=|sendSns('twitter', '${stylelUrl+'/planning/detail/form?planSq='+planInfo.planSq}', '${planInfo.planNm+ '#style24몰'}', '', '');|"><span>트위터</span></button>
+										<button type="button" class="url btn_copy"><span>URL</span></button>
+									</span>
 								</div>
 							</div>
-						</div>
-					</div>
-					<div class="cont_body">
-				
-						<div class="coner_content">
-							<div class="coner_front">
-								<div class="promotion_visual" th:if="${fsrcInfoTop != null}" th:utext="${fsrcInfoTop.fsrcPc}"></div>
-								<!-- 상단배너 -->
-							</div>
-							<th:block th:each="a, template : ${templateOrd}">
-							<th:block th:if="${a.tmplType == 'G082_10'}">
-									<div class="coner_item01" th:id="${a.tmplType}"></div>
-								</th:block>
-							<th:block th:if="${a.tmplType == 'G082_20'}">
-									<div class="coner_item01" th:id="${a.tmplType}"></div>
-								</th:block>
-							<th:block th:if="${a.tmplType == 'G082_30'}">
-									<div class="coner_item01" th:id="${a.tmplType}"></div>
-								</th:block>
-							<th:block th:if="${a.tmplType == 'G082_40'}">
-									<div class="coner_item01" th:id="${a.tmplType}"></div>
-								</th:block>
-								<th:block th:if="${a.tmplType == 'G082_50'}">
-									<div class="coner_item01" th:id="${a.tmplType + a.planContSq}"></div>
-								</th:block>
-								<th:block th:if="${a.tmplType == 'G082_51'}">
-									<div class="coner_visual dp_recommend_item" th:id="${a.tmplType + a.planContSq}"></div>
-								</th:block>
-								<th:block th:if="${a.tmplType == 'G082_52'}">
-									<div class="coner_item01" th:id="${a.tmplType + a.planContSq}"></div>
-								</th:block>
-								
-							</th:block>
-							
-		
-							<div class="coner_front">
-								<div class="promotion_visual" th:if="${fsrcInfoBtm != null}" th:utext="${fsrcInfoBtm.fsrcPc}"></div>
-								<!-- 하단배너 -->
-							</div>
-							<br> <br>
-						</div>
-					</div>
+                        </div>                            
+                    </div>
+                </div>
+                <div class="cont_body">
+                    <!-- 프로모션배너 type1 --> 
+                    <div class="promotion_visual type1" th:if="${fsrcInfoTop != null}" th:utext="${#strings.replace(#strings.replace(fsrcInfoTop.fsrcPc,'&amplt;','<'),'&ampgt;','>')}"></div>
+                    <!-- <div class="promotion_visual type2" th:if="${fsrcInfoTop != null}" th:utext="${#strings.replace(#strings.replace(fsrcInfoTop.fsrcPc,'&amplt;','<'),'&ampgt;','>')}"></div> -->           
+                    <!-- 프로모션배너 type1 -->                    
+                    <!-- 프로모션배너 type2 --> 
+               <!-- <div class="promotion_visual type2">
+                        <div class="swiper-container">
+                            <div class="swiper-wrapper ">
+                                <div class="swiper-slide">
+                                    <img alt="" src="/images/pc/thumb/bigbanner_slide01.png">
+                                </div>
+                                <div class="swiper-slide">
+                                    <img alt="" src="/images/pc/thumb/bigbanner_slide02.png"> 
+                                </div>
+                            </div>
+                        </div>
+                        <div class="swiper-button-prev"></div>
+                        <div class="swiper-button-next"></div>
+                        <div class="swiper-pagination"></div>
+                    </div> -->
+                    <!-- 프로모션배너 type2 -->                    
+                </div>
+            <!-- //상단 프로모션 배너 -->
+            
+            <th:block th:each="a, template : ${templateOrd}">
+				<th:block th:if="${a.tmplType == 'G082_10'}">
+						<div class="content wide dp_review" th:id="${a.tmplType}"></div> <!-- //리뷰 -->
+					</th:block>
+				<th:block th:if="${a.tmplType == 'G082_20'}">
+						 <div class="content wide dp_coupon" th:id="${a.tmplType}"></div>  <!-- //할인쿠폰 -->
+					</th:block>
+				<th:block th:if="${a.tmplType == 'G082_30'}">
+						<div class="content dp_mid_banner" th:id="${a.tmplType}"></div> <!-- //이미지-->
+					</th:block>
+				<th:block th:if="${a.tmplType == 'G082_40'}">
+						<div class="coner_item01" th:id="${a.tmplType}"></div>
+					</th:block>
+				<th:block th:if="${a.tmplType == 'G082_50'}">
+						<div class="content dp_special" th:id="${a.tmplType + a.planContSq}"></div>
+				</th:block>
+				<th:block th:if="${a.tmplType == 'G082_51'}">
+						<div class="content dp_special" th:id="${a.tmplType + a.planContSq}"></div>
+				</th:block>
+				<th:block th:if="${a.tmplType == 'G082_52'}">
+						<div class="content dp_special" th:id="${a.tmplType + a.planContSq}"></div>
+				</th:block>
+			</th:block>
+            
+            <!-- 관련상품 리스트 -->
+			<div class="content sticky_nav_list">
+				<div class="cont_head">
+                    <div class="sticky_nav">
+                        <ul>    
+                        	<th:block th:each="cornerData, CornerStat : ${planCornerList}">
+                            <li><a th:href="${'#brand' +CornerStat.index}" th:text="${cornerData.cornerNm}"></a></li> <!-- 섹션이동 -->
+                            </th:block>
+                        </ul>
+                    </div>
 				</div>
-				<!-- //풀사이즈 -->
-				<div class="content dp_detail_list">
-					<div class="cont_head">
-						<div class="bullet_sticky_nav">
-							<ul>
-								<li><a href="#brand01">모이몰른</a></li>
-								<!-- 섹션이동 -->
-								<li><a href="#brand02">컬리수</a></li>
-
-							</ul>
-						</div>
-					</div>
-					<div class="cont_body">
-						<div class="list_content">
-							<div id="brand01">
-								<div class="item_header">
-									<!-- 섹션이동 -->
-									<h4>모이몰른</h4>
-								</div>
-								<div class="itemsGrp">
-									<!-- itemsGrp rank hot deal -->
-									<div class=" item_prod">
-										<!-- item_prod ranker d_detail -->
-										<div class="item_state">
-											<!-- item_state AD soldout -->
-											<a href="#none" class="itemLink">
-												<div class=" itemPic">
-													<img alt="BLUE-a" class=" vLHTC pd_img"
-														src="/images/pc/thumb/prod1.jpg">
-													<button type="button" class="itemLike likeit">관심상품
-														추가</button>
-												</div>
-												<p class="itemBrand">BRAND NAME</p>
-
-												<div class=" itemName">남성 헤링본 기모 팬츠 헤링본 기모 팬츠</div>
-												<p class="itemPrice">
-													488,000
-													<!-- -->
-													원
-												</p>
-												<p class="itemBadge">
-													<span class="badge13">베스트 </span>
-												</p>
-												<div class="itemcolorchip">
-													<span class="chip_color35" value="ABM">BEIGE</span> <span
-														class="chip_color54" value="BDS">BLACK</span> <span
-														class="chip_color40" value="YBR">WHITE</span>
-												</div>
-												<div class="itemComment">#주문 폭주 상품</div>
-											</a>
-										</div>
-									</div>
-								</div>
-							</div>
-							<div id="brand02">
-								<div class="item_header">
-									<!-- 섹션이동 -->
-									<h4>컬리수</h4>
-								</div>
-								<div class="itemsGrp">
-									<!-- itemsGrp rank hot deal -->
-									<div class=" item_prod">
-										<!-- item_prod ranker d_detail -->
-										<div class="item_state">
-											<!-- item_state AD soldout -->
-											<a href="#none" class="itemLink">
-												<div class=" itemPic">
-													<img alt="BLUE-a" class=" vLHTC pd_img"
-														src="/images/pc/thumb/prod1.jpg">
-													<button type="button" class="itemLike likeit">관심상품
-														추가</button>
-												</div>
-												<p class="itemBrand">BRAND NAME</p>
+				<div class="cont_body">
+                    <div class="list_content">
+                    	<th:block th:each="cornerData, CornerStat : ${planCornerList}">
+                        <div th:id="${'brand' +CornerStat.index}">
+                            <div class="item_header"> <!-- 섹션이동 -->
+                                <h4 th:text="${cornerData.cornerNm}"></h4>
+                            </div>
+                            <div class="itemsGrp"> <!-- itemsGrp rank hot deal -->
+                            	<th:block th:each="cornerGoodsData, CornerGoodsStat : ${planCornerGoodsList}" th:if="${cornerGoodsData.cornerNm == cornerData.cornerNm}">
+                       
+                                <div class="item_prod">
+                                    <div class="item_state">
+                                        <button type="button" th:class="${cornerGoodsData.likeIt == 'likeit'}? 'itemLike likeit' : 'itemLike'" onclick="cfnPutWishList(this);" th:attr="goodsCd=${cornerGoodsData.goodsCd}, ithrCd='', contentsLoc='', planDtlSq=''">관심상품 추가</button>
+                                        <a href="javascript:void(0);" th:onclick="cfnGoToGoodsDetail([[${cornerGoodsData.goodsCd}]])" class="itemLink">
+                                            <!-- <div class="rank ranker"><span>1</span></div> -->
+                                            <div class="itemPic">
+                                                <img alt="BLUE-a" class=" vLHTC pd_img" th:src="${goodsView + '/' +cornerGoodsData.sysImgNm}">
+                                            </div>
+                                            <p class="itemBrand" th:text="${cornerGoodsData.brandGroupNm}"></p>
+                                            <div class="itemName" th:text="${cornerGoodsData.goodsNm}"></div>
+                                            <p class="itemPrice">[[${#numbers.formatInteger(cornerGoodsData.currPrice,0,'COMMA')}]]
+                                                <span class="itemPrice_original" th:if="${cornerGoodsData.currPrice != cornerGoodsData.listPrice}" th:text="${#numbers.formatInteger(cornerGoodsData.listPrice,0,'COMMA')}"></span>
+                                                <span class=" itemPercent" th:if="${cornerGoodsData.dcRate != '0'}" th:text="|${#numbers.formatDecimal(cornerGoodsData.dcRate,0,0)}%|"></span>
+                                            </p>
+                                            <div class="itemcolorchip">
+                                                <span class="chip_color35" value="ABM">BEIGE</span>
+                                                <span class="chip_color54" value="BDS">BLACK</span>
+                                                <span class="chip_color40" value="YBR">WHITE</span>
+                                            </div>
+                                            <p class="itemBadge">
+                                                <span class="badge13">베스트 </span>
+                                            </p>
+                                            <div class="itemComment" th:if="${cornerGoodsData.goodsTnm != null}" th:text="${cornerGoodsData.goodsTnm}"></div>
+                                        </a>
+                                    </div>
+                                </div>  
+                                </th:block>          
+                            </div>
+                            </th:block>
+                        </div>                
+                    </div>
+                </div>
+		    </div>
+            <!-- //관련상품 리스트 -->  
 
-												<div class=" itemName">남성 헤링본 기모 팬츠 헤링본 기모 팬츠</div>
-												<p class="itemPrice">
-													488,000
-													<!-- -->
-													원
-												</p>
-												<p class="itemBadge">
-													<span class="badge13">베스트 </span>
-												</p>
-												<div class="itemcolorchip">
-													<span class="chip_color35" value="ABM">BEIGE</span> <span
-														class="chip_color54" value="BDS">BLACK</span> <span
-														class="chip_color40" value="YBR">WHITE</span>
-												</div>
-												<div class="itemComment">#주문 폭주 상품</div>
-											</a>
-										</div>
-									</div>
-								</div>
-							</div>
-						</div>
-					</div>
-				</div>
-				<th:block th:if="${planCount > 0}">
-				<div class="content dp_foot_banner">
-					<div class="cont_head">
-						<div>
-							<p>다른 기획전 보기</p>
-							<a href="javascript:void(0);" onclick="cfnGoToPage(_PAGE_PLANNING_MAIN);">전체보기</a>
-						</div>
-					</div>
-					<div class="cont_body">
-						<div class="foot_banner_slide">
-							<div class="swiper-container">
-								<div class="swiper-wrapper">
-								 <th:block th:each="PlanData, PlanStat : ${planList}">
-									<div class="swiper-slide">
-										<a th:onclick="cfnGoToPlanDetail([[${PlanData.planSq}]])">
-											<div class="thumb">
-												<img th:src="${@environment.getProperty('upload.image.view')+PlanData.mainImg}" alt="${PlanData.planNm}">
-											</div>
-											<div class="txt">
-												<!-- <span class="brand" th:if="${PlanData.cnt > 1}" th:text="${PlanData.brand}+' 외'"></span> -->
-												<p class="tit" th:text="${PlanData.planNm}"></p>
-											</div>
-										</a>
-									</div>
-								</th:block>
-								</div>
-							</div>
-							<div class="swiper-button-prev"></div>
-							<div class="swiper-button-next"></div>
-						</div>
-					</div>
-				</div>
-				</th:block>
-			</div>
-		</div>
-		
-	<div class="modal fade dp_coupon_pop"  id="coupon_modal_02" tabindex="-1" role="dialog"	aria-labelledby="PopupBasicLabel" aria-hidden="true"></div>
-		<!-- // container -->
+            <!-- 다른 기획전 보기 -->
+            <div class="content other_dp_slide">
+                <div class="cont_head">
+                    <div>
+                        <h4>다른 기획전 보기</h4>
+                        <a href="javascript:void(0);" onclick="cfnGoToPage(_PAGE_PLANNING_MAIN);">전체보기</a>
+                    </div>
+                </div>
+                <div class="cont_body">
+                    <div class="swiper-container">
+                        <div class="swiper-wrapper">
+                        	<th:block th:each="PlanData, PlanStat : ${planList}">
+                            <div class="swiper-slide">                   
+                                <a th:onclick="cfnGoToPlanDetail([[${PlanData.planSq}]])">
+                                    <div class="thumb">
+                                        <img th:src="${@environment.getProperty('upload.image.view')+PlanData.mainImg}" alt="${PlanData.planNm}">
+                                    </div>
+                                    <div class="txt">
+                                        <!-- <span class="brand">BUCKAROO</span> -->
+                                        <p class="tit" th:text="${PlanData.planNm}"></p>
+                                    </div>
+                                </a>
+                            </div>
+                            </th:block>   
+                        </div>
+                    </div>
+                    <div class="swiper-button-prev"></div>
+                    <div class="swiper-button-next"></div>
+                </div>
+            </div>
+            <!-- //다른 기획전 보기 -->
+        </div>
+    </div>   
+<div class="modal fade couponInfo_pop" id="couponInfoPop" tabindex="-1" role="dialog" aria-labelledby="couponInfoLabel" aria-hidden="true"></div>
 <script th:inline="javascript">
 let review = [[${reviewInfo}]];
 let coupon = [[${couponInfo}]];
@@ -242,160 +202,85 @@ let goodsView =[[${@environment.getProperty('upload.goods.view')}]]
 let imgUrl=[[${@environment.getProperty('upload.image.view')}]];
 
 if(review != null || review != ''){
-		
-	var html = '';
-	
-	
-	html += '<div class="dp_review_cont">';
-	html += '	<div class="dp_review">';
-	html += '		<h2 class="dp_subtitle">'+review[0].title+'</h2>';
-	html += '		<div class="review_list">';
 	
+	var html = '';
 	
+	html += ' <div class="cont_head">';
+	html += ' 	<div>';
+	html += '		<h4>'+review[0].title+'</h4>';
+	html += ' 	</div>';
+	html += '	<div class="cont_body">';
+	html += ' 		<div class="review_list">';
 	$.each(review, function(idx, item)  {
-		html += '			<div>';
-		html += '				<div class="best_review">';
-		html += '					<a href="javascript:void();" onclick="fnPlanReviewDetail(\''+item.reviewSq+'\');">';
-		html += '						<div class="lap">';
-		html += '							<div class="pic">';
+		html += '		<div class="reviw_box">'
+		html += '			<div class="best_review">';
+		html += '				<a href="javascript:void();" id="btn_pdBestReview_pop" onclick="cfGoodsReviewDetail(\''+item.goodsCd+'\',\'\', \'Y\',\''+item.reviewSq+'\');">';
+		html += '					<div class="pic">';
 		if (item.fileGb == 'M') { 
 			html += '								<span class="thumb mov" style="background-image: url('+ imgUrl +'/'+item.reviewSysImg +');"></span>';	
 		}else{
 			html += '								<span class="thumb" style="background-image: url('+ imgUrl +'/'+item.reviewSysImg +');"></span>';			
 		}
-		html += '							</div>';
-		html += '							<div class="info">';
-		html += '								<div>';
-		html += '									<div class="star_score">';
-		html += '										<span class="star"> <em class="progbar"';
-		html += '											style="width:'+(item.score*20)+'%;"></em> <!-- 평점 style로 표기 -->';
-		html += '										</span>'; 
+		html += '                   </div>';
+		html += '                  <div class="star_score">';
+		html += '                      <span class="star">';
+		html += '                          <em class="progbar" style="width:'+(item.score*20)+'%;"></em> <!-- 평점 style로 표기 -->';
+		html += '                      </span>';
 		if(item.bestYn == 'Y'){
 			html += '<em class="ico ico_besttag"></em>';	
 		}
-		html += '									</div>';
-		html += '									<div class="txt_best_review">';
-		html += '										<p>'+item.reviewContent+'</p>';
-		html += '									</div>';
-		html += '									<div class="writer">';
-		html += '										<span class="wr_id">'+item.maskingCustId+'</span><span';
-		html += '											class="wr_date">'+item.regDt+'</span>';
-		html += '									</div>';
-		html += '								</div>';
-		html += '							</div>';
-		html += '						</div>';
-		html += '					</a>';
-		html += '				</div>';
-		html += '				<div class="product_view">';
-		html += '					<div class="item_prod">';
-		html += '						<div class="item_state">';
-		html += '							<a href="#none" class="itemLink">';
-		html += '								<div class="itemPic">';
-		html += '									<img alt="" class="vLHTC pd_img" src="'+ _imgUrl +'/'+item.sysImgNm +'">';
-		html += '								</div>';
-		html += '								<div class="itemName">'+item.goodsNm+'</div>';
-		html += '								<p class="itemPrice">'+comma(item.currPrice)+'원</p>';
-		html += '							</a>';
-		html += '						</div>';
-		html += '					</div>';
-		html += '				</div>';
-		html += '			</div>';
+		html += '                  </div>';
+		html += '                  <div class="txt_best_review">';
+		html += '                      <p>'+item.reviewContent+'</p>';
+		html += '                  </div>';
+		html += '                  <div class="info_writer">';
+		html += '                      <span class="wr_id">'+item.maskingCustId+'</span>';
+		html += '                      <span class="wr_date">'+item.regDt+'</span>';
+		html += '                  </div>';
+		html += '              </a>';
+		html += '          </div>';
+		html += '          <div class="review_item">';
+		html += '              <div class="item_prod">';
+		html += '                  <div class="item_state">';
+		html += '                      <a href="javascript:void(0)" onclick="cfnGoToGoodsDetail(\'' + item.goodsCd + '\')" class="itemLink">';
+		html += '                          <div class="itemPic">';
+		html += '                            	<img alt="" class="vLHTC pd_img" src="'+ goodsView +'/'+item.sysImgNm +'">';
+		html += '                          </div>';
+		html += '                          <div class="itemName">'+item.goodsNm+'</div>';
+		html += '                          <p class="itemPrice">'+item.currPrice.addComma()+'</p>';
+		html += '                      </a>';
+		html += '                  </div>';
+		html += '              </div>';
+		html += '          </div>';
+		html += '      </div>  ';
 	});
-	html += '			</div>';
-	html += '		</div>';
-	html += '	</div>';
+	html += '       </div>                    ';
+	html += '	 </div>';
 	html += '</div>';
-	
-	$("#G082_10").append(html);
-}
 
-if(coupon != null || coupon != ''){
-	var html = '';
-	 
-	html += '<div class="coner_item02">';
-	html += '	<div class="dp_coupon_wrap">';
-	html += '	<div>';
-	html += '		<p>'+coupon[0].title+'</p>';
-	html += '	</div>';
-	html += '	<div class="coupon_list inner">';
-	html += '		<ul class="clear">';
-	$.each(coupon, function(idx, item) {
-		html += '			<li>';
-		html += '				<div class="coupon">';
-		html += '					<div>';
-		html += '						<p class="cp_name">'+item.cpnNm+'</p>';
-		html += '						<p class="cp_cont">';
-		if (item.dcWay == '할인율') {
-			html += '							<span> <span><em>'+item.dcPval+'%</em></span>';
-		}else{
-			html += '							<span><em>'+comma(item.dcPval)+'</em>원</span>'; 
-		}
-		html += '						</p>';
-		html += '						<p class="cp_condition">'+comma(item.buyLimitAmt)+'원 이상 구매 시 최대 ' +comma(item.maxDcAmt)+'원 할인';
-		if (item.custPubLimitQty != 0) {
-			html += '								<span>1인 최대 '+item.custPubLimitQty+'장</span>';	
-		}
-		
-		html += '						</p>';
-		html += '					</div>';
-		if (item.couponStat == '쿠폰받기') {
-			html += '					<button type="button" id="coupon_" class="btn btn_dark btn_block btn_coupon_down" onclick="fnPlanCouponDown('+item.cpnId+')">';  /* btn_coupon_done */
-			html += '						<span>쿠폰받기</span>';								/* 받기완료  */
-			html += '					</button>';			
-		}else{
-			html += '					<button type="button"';
-			html += '						class="btn btn_dark btn_block btn_coupon_done" disabled>';  
-			html += '						<span>받기완료</span>';								
-			html += '					</button>';			
-		}
-		html += '				</div>';
-		html += '				<button type="button" class="btn_underline"	id="btn_cpinfo_pop" onclick="useInfoCoupon('+item.cpnId+')">';
-		html += '					<span>사용안내</span>';
-		html += '				</button>';
-		html += '			</li>';
-	});
-	html += '		</ul>';
-	html += '	</div>';
-	html += '	<div class="announce_txt inner">';
-	html += '		<div class="note_txt">';
-	html += '			<img src="/images/pc/ico_content_find.png" alt="유의사항">';
-	html += '			<p>유의사항</p>';
-	html += '		</div>';
-	html += '		<div class="announce_list">';
-	html += '			<ul>';
-	html += '				<li>쿠폰 발급 기간 :'+ plan.dispStdt +'~'+ plan.dispEddt +'</li>';
-	html += '				<li>본 쿠폰은 해당 기획전 상품에만 적용 가능합니다.</li>';
-	html += '				<li>본 쿠폰은 해당 기획전 다운로드 버튼을 통해 발급받으실 수 있습니다.</li>';
-	html += '			</ul>';
-	html += '		</div>';
-	html += '	</div>';
-	html += '	<br>';
-	html += '	<br>';
-	html += '</div>';
-	html += '</div>';
-		
-	$("#G082_20").append(html);
+	$("#G082_10").append(html);
 }
 
 if(image != null || image != ''){
 	var html = '';
 	
-	html += '	<div class="coner_item02">';
-	html += '    	<div class="coner_visual">';
-	html += '        	<div class="swiper-container">';
-	html += '            	<div class="swiper-wrapper ">';
-	
+	html += '<div class="cont_body">     ';
+	html += '    <div class="mid_banner">';
+	html += '        <div class="swiper-container">';
+	html += '            <div class="swiper-wrapper">';
 	for (var i = 0; i < image.length; i++) {
 		html += '                	<div class="swiper-slide">';
 		html += '                    	<img alt="" src="'+ imgUrl + image[i].itemVal +'">';
 		html += '                	</div>';
 	}
-	html += '            	</div>';
-	html += '            	<div class="swiper-button-prev "></div>';
-	html += '            	<div class="swiper-button-next "></div>';
-	html += '        	</div>';
+	html += '            </div>';
+	html += '        </div>';
+	html += '        <div class="swiper-button-prev"></div>';
+	html += '        <div class="swiper-button-next"></div>';
 	html += '        <div class="swiper-pagination"></div>';
-	html += '	</div>';
+	html += '    </div>';
+	html += '</div>';
+	
 	
 	$("#G082_30").append(html);
 }
@@ -412,130 +297,270 @@ if(goods1 != null || goods1 != ''){
 	
 	for (var i = 0; i < template.length; i++) {
 		var html = '';
-		
-		if(template[i].tmplType == 'G082_50' && array[0] == template[i].planContSq && typeof array[0] != 'undefined'){
-			html += '<div class="dp_listItems_wrap"> ';
-			html += '    <div>';
+		if(template[i].tmplType == 'G082_50' && array[0] == template[i].planContSq && typeof array[0] != 'undefined') {
+			html += '<div class="cont_head">';
+			html += '	<div>';
+			html += '        <h4>';
 			if (template[i].linkUrl != null || template[i].linkUrl != '') { /* 링크 변경 예정 */
 				html += '        <a href="http://'+template[i].linkUrl+'" target="_blank">'+template[i].title+'</a>';
 			}else{
 				html += '        <a href="javascript:void(0)">'+template[i].title+'</a>';
 			}
-			
+			html += '		</h4>';
 			html += '    </div>';
-			html += '    <div class="dp_listItems_cont">';
+			html += '</div>';
+			html += '<div class="cont_body">';
+			html += '    <div class="dp_listItems_cont type1">';
 			html += '        <ul>';
-			
-			$.each(goods1, function(idx, item)  {
+		$.each(goods1, function(idx, item)  {
+			if (item.planContSq == template[i].planContSq) {
+				html += '            <li>';
+				html += '                <div class="dp_listItems">';
+				html += '                    <div class="dp_listItems_img">';
+				html += '                        <img src="'+ goodsView +'/'+item.sysImgNm +'" alt="">';
+				html += '                    </div>';
+				html += '                    <div class="dp_listItems_info">';
+				html += '                        <div class="dp_listItems_brand">'+item.brandGroupNm+'</div>';
+				html += '                        <div class="dp_listItems_name">'+item.goodsNm+'<br></div>';
+				html += '                        <div class="dp_listItems_price">';
+				html += '                            <span class="price">'+item.currPrice.addComma()+'</span>';
+				if (item.currPrice != item.listPrice) {
+					html += '                            <del>'+item.listPrice.addComma()+'</del>';
+					html += '                            <span class="percent">'+Math.floor(item.dcRate)+'%</span>';
+				}
+				html += '                        </div>';
+				if(item.goodsTnm != null){
+					html += '                        <div class="itemComment">'+item.goodsTnm+'</div>';
+				}
+				html += '                        <div class="ui_row">';
+				html += '                            <button type="button" class="btn btn_default" onclick="cfnGoToGoodsDetail(\'' + item.goodsCd + '\')"><span>자세히 보기</span></button>';
+				html += '                        </div>';
+				html += '                    </div>';
+				html += '                </div>';
+				html += '            </li>';
+			}
+		});
+		html += '        </ul>';
+		html += '    </div>       ';
+		html += '</div>';
+		$("#G082_50" +array[0]).append(html);
+	}
+		if($("#G082_50" +template[i].planContSq).length){
+			array.shift();
+		}
+	}
+}
+
+if(goods2 != null || goods2 != ''){
+	var array = [];
+
+	for (var j = 0; j < template.length; j++) {
+		if(template[j].tmplType == 'G082_51'){
+			array.push(template[j].planContSq);
+		}
+	}	
+	for (var i = 0; i < template.length; i++) {
+		var html = '';
+		
+		if(template[i].tmplType == 'G082_51' && array[0] == template[i].planContSq && typeof array[0] != 'undefined'){
+			html += '<div class="cont_head">';
+			html += '	<div>';
+			html += '        <h4>';
+				if (template[i].linkUrl != null || template[i].linkUrl != ' ' ||typeof template[i].linkUrl != 'undefined') { /* 링크 변경 예정 */
+					html+='            <a href="http://'+template[i].linkUrl+'" target="_blank">'+template[i].title+'</a>';
+				}else{
+					html+='            <a href="javascript:void(0)">'+template[i].title+'</a>';
+				}
+			html += '        </h4>';
+			html += '    </div>';
+			html += '</div>';
+			html += '<div class="cont_body">';
+			html += '    <div class="dp_listItems_cont type2">';
+			html += '        <div class="swiper-container">';
+			html += '            <div class="swiper-wrapper">';
+			$.each(goods2, function(idx, item) {
 				if (item.planContSq == template[i].planContSq) {
-					html += '            <li>';
-					html += '                <div class="dp_listItems">';
-					html += '                    <div class="dp_listItems_img">';
-					html += '                        <img src="'+ goodsView +'/'+item.sysImgNm +'" alt="">';
-					html += '                    </div>';
-					html += '                    <div class="dp_listItems_info">';
-					html += '                        <div class="dp_listItems_brand">'+item.brandKnm+'</div>';
-					html += '                        <div class="dp_listItems_name">'+item.goodsNm+'</div>';
-					html += '                        <div class="dp_listItems_price">';
-					html += '                            <span class="price">'+comma(item.currPrice)+'</span>';
+					html += '                <div class="swiper-slide">';
+					html += '                    <div class="item_prod">';
+					html += '                        <div class="item_state">';
+					html += '                            <a onclick="cfnGoToGoodsDetail(\'' + item.goodsCd + '\')" class="itemLink">';
+					html += '                                <div class="itemPic">';
+					html += '                                    <img alt="BLUE-a" class=" vLHTC pd_img" src="'+ goodsView +'/'+item.sysImgNm +'">';
+					html += '                                </div>';
+					html += '                                <p class="itemBrand">'+item.brandGroupNm+'</p>';
+					html += '                                <div class="itemName">'+item.goodsNm+'</div>';
+					html += '                                <p class="itemPrice">'+item.currPrice.addComma();
 					if (item.currPrice != item.listPrice) {
-						html += '                            <del>'+comma(item.listPrice)+'</del>';
-						html += '                            <span class="percent">'+Math.floor(item.dcRate)+'%</span>';
+						html+='                                    <span class="itemPrice_original">'+item.listPrice.addComma()+'</span>';
+						html+='                                    <span class=" itemPercent">'+Math.floor(item.dcRate)+'%</span>';
 					}
-					
-					html += '                        </div>';
-					//html += '                        <div class="itemComment">#주문 폭주 상품</div>';
-					html += '                        <div class="ui_row">';
-					html += '                            <button type="button" class="btn btn_default" onclick="cfnGoToGoodsDetail(\'' + item.goodsCd + '\'"><span>자세히 보기</span></button>';
+					html += '                                </p>';
+					if(item.goodsTnm != null){
+						html += '                        <div class="itemComment">'+item.goodsTnm+'</div>';
+					}
+					html += '                            </a>';
 					html += '                        </div>';
 					html += '                    </div>';
-					html += '                </div>';
-					html += '            </li>';
-						
+					html += '                </div>           ';
 				}
 			});
-			html += '        </ul>';
-			html += '    </div>';
+			html += '            </div>';
+			html += '        </div>';
+			html += '        <div class="swiper-button-prev"></div>';
+			html += '        <div class="swiper-button-next"></div>';
+			html += '        <div class="swiper-pagination"></div>';
+			html += '    </div>       ';
 			html += '</div>';
-			$("#G082_50" +array[0]).append(html);
+			$("#G082_51" +array[0]).append(html);
 		}
 		
-		if($("#G082_50" +template[i].planContSq).length){
+		if($("#G082_51" +template[i].planContSq).length){
 			array.shift();
 		}
 	}
-
 }
-	
-if(goods2 != null || goods2 != ''){
+
+if(goods4 != null || goods4 != ''){
 	var array = [];
 
 	for (var j = 0; j < template.length; j++) {
-		if(template[j].tmplType == 'G082_51'){
+		if(template[j].tmplType == 'G082_52'){
 			array.push(template[j].planContSq);
 		}
 	}	
 	for (var i = 0; i < template.length; i++) {
 		var html = '';
-		
-		if(template[i].tmplType == 'G082_51' && array[0] == template[i].planContSq && typeof array[0] != 'undefined'){
-			//html+='<div class="coner_visual dp_recommend_item">';
-			html+='    <div class="dp_banner_slide">';
-			html+='        <div class="slide_head">';
-			console.log(template[i].linkUrl);
+		if(template[i].tmplType == 'G082_52' && array[0] == template[i].planContSq && typeof array[0] != 'undefined'){
+			html += '<div class="cont_head">';
+			html += '<div>';
+			html += '        <h4>';
 			if (template[i].linkUrl != null || template[i].linkUrl != ' ' ||typeof template[i].linkUrl != 'undefined') { /* 링크 변경 예정 */
 				html+='            <a href="http://'+template[i].linkUrl+'" target="_blank">'+template[i].title+'</a>';
 			}else{
 				html+='            <a href="javascript:void(0)">'+template[i].title+'</a>';
 			}
-			
-			html+='        </div>';
-			html+='        <div class="swiper-container dp_lookbook_case2">';
-			html+='            <div class="swiper-wrapper ">';
-			
-			$.each(goods2, function(idx, item) {
+			html += '        </h4>';
+			html += '    </div>';
+			html += '</div>';
+			html += '<div class="cont_body">';
+			html += '    <!-- 상품 노출 4열 type3 -->';
+			html += '    <div class="dp_listItems_cont type3">';
+			html += '        <div class="swiper-container">';
+			html += '            <div class="swiper-wrapper">';
+			$.each(goods4, function(idx, item) {
 				if (item.planContSq == template[i].planContSq) {
-					html+='                <div class="swiper-slide">';
-					html+='                    <div class="item_prod">';
-					html+='                        <div class="item_state">';
-					html+='                            <a onclick="cfnGoToGoodsDetail(\'' + item.goodsCd + '\'" class="itemLink">';
-					html+='                                <div class="itemPic">';
-					html+='                                    <img alt="BLUE-a" class=" vLHTC pd_img" src="'+ goodsView +'/'+item.sysImgNm +'">';
-					html+='                                </div>';
-					html+='                                <p class="itemBrand">'+item.brandKnm+'</p>';
-					html+='                                <div class="itemName">'+item.goodsNm+'</div>';
-					html+='                               <p class="itemPrice">'+comma(item.currPrice);
+					html += '                <div class="swiper-slide">';
+					html += '                    <div class="item_prod">';
+					html += '                        <div class="item_state">';
+					html += '                            <a onclick="cfnGoToGoodsDetail(\'' + item.goodsCd + '\')" class="itemLink">';
+					html += '                                <div class="itemPic">';
+					html += '                                    <img alt="BLUE-a" class=" vLHTC pd_img" src="'+ goodsView +'/'+item.sysImgNm +'">';
+					html += '                                </div>';
+					html += '                                <p class="itemBrand">'+item.brandGroupNm+'</p>';
+					html += '                                <div class="itemName">'+item.goodsNm+'</div>';
+					html += '                                <p class="itemPrice">'+item.currPrice.addComma();
 					if (item.currPrice != item.listPrice) {
-						html+='                                    <span class="itemPrice_original">'+comma(item.listPrice)+'</span>';
+						html+='                                    <span class="itemPrice_original">'+item.listPrice.addComma()+'</span>';
 						html+='                                    <span class=" itemPercent">'+Math.floor(item.dcRate)+'%</span>';
 					}
-					
-					html+='                                </p>';
-					//html+='                                <div class="itemComment">#주문 폭주 상품</div>';
-					html+='                            </a>';
-					html+='                        </div>';
-					html+='                    </div>';
-					html+='                </div>                ';
+					html += '                                </p>';
+					if(item.goodsTnm != null){
+						html += '                        <div class="itemComment">'+item.goodsTnm+'</div>';
+					}
+					html += '                            </a>';
+					html += '                        </div>';
+					html += '                    </div>';
+					html += '                </div>';
 				}
 			});
-		 
-			html+='            </div>';
-			html+='        </div>';
-			html+='        <div class="swiper-button-prev "></div>';
-			html+='        <div class="swiper-button-next "></div>';
-			html+='        <div class="swiper-pagination"></div>';
-			html+='    </div>';
-			//html+='</div>';
+			html += '            </div>';
+			html += '        </div>';
+			html += '        <div class="swiper-button-prev"></div>';
+			html += '        <div class="swiper-button-next"></div>';
+			html += '        <div class="swiper-pagination"></div>';
+			html += '    </div>       ';
+			html += '</div>';
+			$("#G082_52" +array[0]).append(html);
 			
-			$("#G082_51" +array[0]).append(html);
 		}
-		
-		if($("#G082_51" +template[i].planContSq).length){
+		if($("#G082_52" +template[i].planContSq).length){
 			array.shift();
 		}
 	}
+}
+
+if(coupon != null || coupon != ''){
+	var html = '';
+	 
+	html += '<div class="cont_head">';
+	html += '	<div>';
+	html += '		<h4>'+coupon[0].title+'</h4>';
+	html += '	</div>';
+	html += '</div>';
+	html += '<div class="cont_body">';
+	html += '	<div class="coupon_list">';
+	html += '		<ul>';
+	$.each(coupon, function(idx, item) {
+		html += '			<li>';
+		html += '				<div class="coupon">';
+		html += '					<div>';
+		html += '						<p class="cp_name">'+item.cpnNm+'</p>';
+		html += '						<p class="cp_cont">';
+		if (item.dcWay == '할인율') {
+			html += '							<span> <span><em>'+item.dcPval+'%</em></span>';
+		}else{
+			html += '							<span><em>'+item.dcPval.addComma()+'</em>원</span>'; 
+		}
+		html += '						</p>';
+		html += '						<p class="cp_condition">'+item.buyLimitAmt.addComma()+'원 이상 구매 시 최대 ' +item.maxDcAmt.addComma()+'원 할인';
 
+		if (item.custPubLimitQty != 0) {
+			html += '								<span>1인 최대 '+item.custPubLimitQty+'장</span>';	
+		}
+		html += '						</p>';
+		html += '					</div>';
+		if(typeof item.couponStat != 'undefined'){
+			if (item.couponStat == '쿠폰받기') {
+				html += '					<button type="button" id="coupon_" class="btn btn_dark btn_block btn_coupon_down" onclick="fnPlanCouponDown('+item.cpnId+')">';  /* btn_coupon_done */
+				html += '						<span>쿠폰받기</span>';								/* 받기완료  */
+				html += '					</button>';			
+			}else{
+				html += '					<button type="button"';
+				html += '						class="btn btn_dark btn_block btn_coupon_done" disabled>';  
+				html += '						<span>받기완료</span>';								
+				html += '					</button>';			
+			}
+		}else{
+			html += '					<button type="button" id="coupon_" class="btn btn_dark btn_block btn_coupon_down" onclick="fnPlanCouponDown('+item.cpnId+')">';  /* btn_coupon_done */
+			html += '						<span>쿠폰받기</span>';								/* 받기완료  */
+			html += '					</button>';		
+		}
 		
+		html += '				</div>';
+		html += '				<button type="button" class="btn_underline"	id="btn_couponInfo_pop" onclick="useInfoCoupon('+item.cpnId+')">';
+		html += '					<span>사용안내</span>';
+		html += '				</button>';
+		html += '			</li>';
+	});
+	html += '		</ul>';
+	html += '	</div>';
+	html += '	<div class="announce_txt">';
+	html += '		<div class="note_txt">';
+	html += '			<img src="/images/pc/ico_content_find.png" alt="유의사항">';
+	html += '			<p>유의사항</p>';
+	html += '		</div>';
+	html += '		<div class="announce_list">';
+	html += '			<ul>';
+	html += '				<li>쿠폰 발급 기간 :'+ plan.dispStdt +'~'+ plan.dispEddt +'</li>';
+	html += '				<li>본 쿠폰은 해당 기획전 상품에만 적용 가능합니다.</li>';
+	html += '				<li>본 쿠폰은 해당 기획전 다운로드 버튼을 통해 발급받으실 수 있습니다.</li>';
+	html += '			</ul>';
+	html += '		</div>';
+	html += '	</div>';
+	html += '</div>';
+	html += '</div>';
+		
+	$("#G082_20").append(html);
 }
 
 //사용안내 모달
@@ -546,144 +571,150 @@ var useInfoCoupon = function (id) {
 		dataType 	: 'html',
 		success 	: function(result) {
 			if (result != null) {
-				$("#coupon_modal_02").html(result);
-				$("#coupon_modal_02").modal("show");
+				$("#couponInfoPop").html(result);
+				$("#couponInfoPop").modal("show");
 			}
 		}
 	});
 	
 	return false; 
 }
+//쿠폰 다운로드
+var fnPlanCouponDown = function(obj){
 
-// 쿠폰 다운로드
-	var fnPlanCouponDown = function(obj){
-	
-		if (!cfCheckLogin()) {
-			cfnGoToPage(_PAGE_LOGIN);
-			return false;
-		}
-		
-		let cpnId = obj;
-		gagajf.ajaxJsonSubmit(_PAGE_PLANNING_CPN_DOWNLOAD, JSON.stringify({cpnId: cpnId}), fnPlanCouponCallBack);
+	if (!cfCheckLogin()) {
+		cfnGoToPage(_PAGE_LOGIN);
+		return false;
 	}
 	
-	// 쿠폰다운로드 콜백
-	var fnPlanCouponCallBack = function(result){
-		
-		// 화면 전환 필요		
-	}
+	let cpnId = obj;
+	gagajf.ajaxJsonSubmit(_PAGE_PLANNING_CPN_DOWNLOAD, JSON.stringify({cpnId: cpnId}), fnPlanCouponCallBack);
+}
 
+// 쿠폰다운로드 콜백
+var fnPlanCouponCallBack = function(result){
 	
-//세번째 자리 콤마찍기 (숫자만 포함, 소수점자리 구분)
-function comma(num){
-	return num.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
+	// 화면 전환 필요		
 }
 
 
-</script>
-		<script type="text/javascript">
-	    // 컨텐츠 호출
-        $(document).ready( function() {
-        	
-        	//공유 버튼 토글 
-    		$("button[data-name=openShare]").on("click", function(){
-    			$(this).toggleClass("on").next(".shareWrap").toggleClass("on");
-    			return false;
-    		});
-    		//영역밖 클릭으로 공유토글 닫기
-    		$("body").on('click', function(e) { 
-    			if(!$(".shareWrap.on").parent().has(e.target).length) {
-    				$("button[data-name=openShare]").removeClass("on");
-    				$(".shareWrap").removeClass("on");
-    			};
-    		});
-    		
-    		$('.btn_copy').bind('click', function() {
-    			copyToClipboard();
-    		});
-    		
-        	
-            $(window).scroll(function(){
-                var navOffset = $('.item_header').offset().top - $('.bullet_sticky_nav').height();
-                var windScroll = $(window).scrollTop();
-                if (windScroll > navOffset){
-                    $(".bullet_sticky_nav").addClass("sticky");
-                }
-                else {
-                    $(".bullet_sticky_nav").removeClass("sticky");
-                }
-                $("#shiping_pop").click(function() {
-                    $("#Bulletship_modal").modal("show");
-                });	
-            });
-            
-            /* SLIDE - WIDE BANNER */
-			var br_bn_slide = new Swiper ('.coner_visual .swiper-container', {
-				loop: true,
-				slidesPerView: 1,
-				speed : 1500,
-				navigation: {
-					nextEl: '.coner_visual .swiper-button-next',
-					prevEl: '.coner_visual .swiper-button-prev',
-				},
-                pagination: {
-					el: '.coner_visual .swiper-pagination',
-					clickable: true,
-				},
-			});
 
-            var dp_foot_banner_slide = new Swiper ('.dp_foot_banner .swiper-container', {
-				loop: false,
-				slidesPerView: 5,
-                spaceBetween: 20,
-				speed : 800,
-				navigation: {
-					nextEl: '.dp_foot_banner .swiper-button-next',
-					prevEl: '.dp_foot_banner .swiper-button-prev',
-				},
-			});
-            var dp_foot_banner_slide = new Swiper ('.dp_foot_banner .swiper-container', {
-                loop: false,
-                slidesPerView: 5,
-                spaceBetween: 20,
-                speed : 800,
-                navigation: {
-                    nextEl: '.dp_foot_banner .swiper-button-next',
-                    prevEl: '.dp_foot_banner .swiper-button-prev',
-                },
-            });
+$(document).ready( function() {
 
-            var dp_foot_banner_slide02 = new Swiper ('.dp_recommend_item .dp_lookbook_case2', {
-                loop: false,
-                slidesPerView: 2,
-                slidesPerGroup: 2,
-                spaceBetween: 0,
-                speed : 800,
-                navigation: {
-                    nextEl: '.dp_recommend_item .swiper-button-next',
-                    prevEl: '.dp_recommend_item .swiper-button-prev',
-                },
-                pagination: {
-                    el: '.dp_recommend_item .swiper-pagination',
-                    clickable: true,
-                },
-            });
-            
-            
-            //내부앵커이동
-            $(".bullet_sticky_nav li a").on("click", function(){
-                var hookHeader = $("header").outerHeight() + 100;
-                var hookHref = $(this).attr("href");
-                var hookPot = $(hookHref == "#" || hookHref == "" ? "body" : hookHref);
-                var hookPos = hookPot.offset().top - hookHeader;
-                $("html, body").animate({ scrollTop: hookPos }, 300);
+	//공유 버튼 토글 
+	$("button[data-name=openShare]").on("click", function(){
+		$(this).toggleClass("on").next(".shareWrap").toggleClass("on");
+		return false;
+	});
+	//영역밖 클릭으로 공유토글 닫기
+	$("body").on('click', function(e) { 
+		if(!$(".shareWrap.on").parent().has(e.target).length) {
+			$("button[data-name=openShare]").removeClass("on");
+			$(".shareWrap").removeClass("on");
+		};
+	});
+	
+	$('.btn_copy').bind('click', function() {
+		copyToClipboard();
+	});
+
+	//팝업 - 쿠폰사용안내
+	$(document).on('click','#btn_couponInfo_pop',function(e){
+		$("#couponInfoPop .modal-content").load("popup_couponInfo.html");
+		$("#couponInfoPop").modal("show");
+		return false;
+	});      
+	$("#couponInfoPop_close").click(function() {
+		$.modal.close();
+	});					
+
+    //팝업 - 상품 베스트 리뷰 (detail)
+    $(document).on('click','#btn_pdBestReview_pop, .area_rv_best .best_review a',function(e){
+        $("#pdBestReviewPop .modal-content").load("pd_bestreviewdetail_pop.html");
+        $("#pdBestReviewPop").modal("show");
+        return false;
+    });      
+    $("#pdBestReviewPop_close").click(function() {
+        $.modal.close();
+    });            
 
-                $('.bullet_sticky_nav li a').removeClass('active');
-                $(this).addClass('active');
-            });
-        });
-    </script>
-	</th:block>
+    /* SLIDE - 상단 프로모션 배너 */
+	var promotion_visual_slide = new Swiper ('.dp_detail_visual .promotion_visual.type2 .swiper-container', {
+		loop: true,
+		slidesPerView: 1,
+		speed : 1500,
+		navigation: {
+			nextEl: '.promotion_visual.type2 .swiper-button-next',
+			prevEl: '.promotion_visual.type2 .swiper-button-prev',
+		},
+        pagination: {
+			el: '.promotion_visual.type2 .swiper-pagination',
+			clickable: true,
+		},
+	}); 
+
+    /* SLIDE - 중간 배너 */
+	var mid_banner_slide = new Swiper ('.dp_mid_banner .mid_banner .swiper-container', {
+		loop: true,
+		slidesPerView: 1,
+		speed : 1500,
+		navigation: {
+			nextEl: '.mid_banner .swiper-button-next',
+			prevEl: '.mid_banner .swiper-button-prev',
+		},
+        pagination: {
+			el: '.mid_banner .swiper-pagination',
+			clickable: true,
+		},
+	});
+
+    /* SLIDE - 대표상품 슬라이드 2열 상품 */
+    var dp_listItems_slide1 = new Swiper ('.dp_listItems_cont.type2 .swiper-container', {
+        loop: false,
+        slidesPerView: 2,
+        slidesPerGroup: 2,
+        spaceBetween: 20,
+        speed : 800,
+        navigation: {
+            nextEl: '.dp_listItems_cont.type2 .swiper-button-next',
+            prevEl: '.dp_listItems_cont.type2 .swiper-button-prev',
+        },
+        pagination: {
+            el: '.dp_listItems_cont.type2 .swiper-pagination',
+            clickable: true,
+        },
+    });
+
+    /* SLIDE - 대표상품 슬라이드 4열 상품 */
+    var dp_listItems_slide2 = new Swiper ('.dp_listItems_cont.type3 .swiper-container', {
+        loop: false,
+        slidesPerView: 4,
+        slidesPerGroup: 4,
+        spaceBetween: 20,
+        speed : 800,
+        navigation: {
+            nextEl: '.dp_listItems_cont.type3 .swiper-button-next',
+            prevEl: '.dp_listItems_cont.type3 .swiper-button-prev',
+        },
+        pagination: {
+            el: '.dp_listItems_cont.type3 .swiper-pagination',
+            clickable: true,
+        },
+    });
+
+    /* SLIDE - 다른 기획전 보기 */
+    var other_dp_slide_slide = new Swiper ('.other_dp_slide .swiper-container', {
+		slidesPerView: 5,
+        spaceBetween: 20,
+		navigation: {
+			nextEl: '.other_dp_slide .swiper-button-next',
+			prevEl: '.other_dp_slide .swiper-button-prev',
+		},
+	});            
+
+});
+</script>
+</th:block>
 
 </body>
 </html>

+ 1 - 1
src/main/webapp/WEB-INF/views/web/planning/PlanningMainFormWeb.html

@@ -134,7 +134,7 @@
 						$.each(result, function(idx, item) {
 							tag += '	<div class="exhi_item">\n';
 							tag += '		<div class="exhi_item_img">\n';
-							tag += '			<a>\n';
+							tag += '			<a onclick="cfnGoToPlanDetail(\'' + item.planSq + '\')">\n';
 							
 							if (item.newYn == 'Y') {
 								tag += '				<div class="shape ranker"><span>NEW</span></div>\n';

+ 1 - 1
src/main/webapp/WEB-INF/views/web/social/SocialMainFormWeb.html

@@ -42,7 +42,7 @@
                             <div class="item_prod" th:class="${SocialData.stockQtySum == 0 ? 'item_prod sold_out' : 'item_prod'}" > 
                                 <div class="item_state"> <!-- item_state AD soldout -->
                                     <button type="button" th:class="${SocialData.wishYn == 'Y'}? 'itemLike active' : 'itemLike'" onclick="cfnPutWishList(this);" th:attr="goodsCd=${SocialData.goodsCd}, ithrCd='', contentsLoc='', planDtlSq=''">관심상품 추가</button>
-                                    <a href="#none" class="itemLink" th:onclick="cfnGoToGoodsDetail([[${SocialData.goodsCd}]])">
+                                    <a href="javascript:void(0);" class="itemLink" th:onclick="cfnGoToGoodsDetail([[${SocialData.goodsCd}]])">
                                         <div class="itemPic">
                                             <img alt="BLUE-a" class=" vLHTC pd_img" th:src="${@environment.getProperty('upload.goods.view') + '/' + SocialData.sysImgNm}">
                                         </div>

+ 10 - 0
src/main/webapp/biz/mypage.js

@@ -369,3 +369,13 @@ var cfnGetTextLength = function(obj, maxLen, dpLoc) {
 	
 	$(dpLoc).text(cByte.addComma());
 }
+
+// 리뷰작성 페이지 이동
+var fnReviewCreate = function(obj1,obj2,obj3) {
+	let ordNo = obj1;
+	let ordDtlNo = obj2;
+	let goodsCd = obj3;
+	let reviewStat = 'c';
+	
+	cfnGoToPage(_PAGE_MYPAGE_CREATE_REVIEW + ordNo +'/'+ordDtlNo+'/'+goodsCd+'/'+reviewStat);
+}

+ 261 - 102
src/main/webapp/ux/pc/css/layout.css

@@ -337,6 +337,9 @@ ul.maintabs li [class^='box_depth'] {display:none; position:absolute; left:100%;
 #quick_menu .quick_con .quick_body::after {display:none;}
 #quick_menu .quick_con .product_count {margin-bottom: 20px; font-size: 16px; color: #888;}
 #quick_menu .quick_con .product_count span {font-weight: 500;}
+#quick_menu .quick_body::-webkit-scrollbar {width:4px;}
+#quick_menu .quick_body::-webkit-scrollbar-thumb {background-color:#222222; border-radius:50px; -webkit-border-radius:50px; background-clip:padding-box; border:1px solid transparent;}
+#quick_menu .quick_body::-webkit-scrollbar-track {background-color:#f8f8f8; border-radius:50px; -webkit-border-radius:50px;}
 #quick_menu.on {position: absolute; bottom: 539px; width: 60px; height: 539px;}
 
 /* 퀵메뉴_최근 본 상품 */
@@ -362,9 +365,6 @@ ul.maintabs li [class^='box_depth'] {display:none; position:absolute; left:100%;
 #quick_menu .shopingbag .quick_body.nodata .itemsGrp.empty .item_prod:last-child {border-bottom: 0; padding-bottom: 0;}
 #quick_menu .shopingbag .quick_body.nodata .purchase_btn {display: none;}
 #quick_menu .shopingbag .quick_body {scrollbar-width: 2px; scrollbar-3dLight-Color: #f8f8f8; scrollbar-arrow-color: #f8f8f8; scrollbar-base-color: #f8f8f8; scrollbar-Face-Color: #888888; scrollbar-Track-Color: #f8f8f8; scrollbar-DarkShadow-Color: #f8f8f8; scrollbar-Highlight-Color: #f8f8f8; scrollbar-Shadow-Color: #f8f8f8}
-#quick_menu .shopingbag .quick_body::-webkit-scrollbar {width: 4px;}
-#quick_menu .shopingbag .quick_body::-webkit-scrollbar-thumb {background-color: #222222;border-radius: 50px;-webkit-border-radius: 50px;background-clip: padding-box;border: 1px solid transparent;}
-#quick_menu .shopingbag .quick_body::-webkit-scrollbar-track {background-color: #f8f8f8;border-radius: 50px;-webkit-border-radius:50px;}
 #quick_menu .shopingbag .itemsGrp .item_prod {width: 100%; overflow: hidden; padding:30px 0; border-bottom: 1px solid #ddd;}
 #quick_menu .shopingbag .itemsGrp .item_prod .delete_btn {position: absolute; top: 30px; right: 0; width: 14px; height: 14px; background: url('/images/pc/ico_close1.png') no-repeat center;}
 #quick_menu .shopingbag .itemsGrp .item_prod:first-child .delete_btn {top: 0;}
@@ -433,7 +433,10 @@ ul.maintabs li [class^='box_depth'] {display:none; position:absolute; left:100%;
 #quick_menu .coupon .coupon_tab a:first-child:after {content:''; position: absolute; top: 0; right: -15px; width: 1px; height: 16px; background: #ddd;}
 #quick_menu .coupon .coupon_tab a.active {font-weight: 300; color:#222;}
 #quick_menu .coupon .more_btn {width: 100%; position: absolute; left: 50%; bottom: 30px; z-index: 90; width: 302px; height: 42px; line-height: 42px; color: #222; font-size: 14px; font-weight: 300; transform: translateX(-50%); text-align: center; border:1px solid #ddd; background:#fff url('/images/pc/ico_more_sm.png') no-repeat left 177px center;}
-#quick_menu .coupon .coupon_area {height:760px; overflow-y:auto;}
+#quick_menu .coupon .coupon_area {height:552px; overflow-y:auto;}
+#quick_menu .coupon .coupon_area::-webkit-scrollbar {width:4px;}
+#quick_menu .coupon .coupon_area::-webkit-scrollbar-thumb {background-color:#222222; border-radius:50px; -webkit-border-radius:50px; background-clip:padding-box; border:1px solid transparent;}
+#quick_menu .coupon .coupon_area::-webkit-scrollbar-track {background-color:#f8f8f8; border-radius:50px; -webkit-border-radius:50px;}
 #quick_menu .coupon #coupon_type01 .coupon_list {line-height:1;}
 #quick_menu .coupon #coupon_type01 .coupon_list li {margin-top:30px}
 #quick_menu .coupon #coupon_type01 .coupon_list li:first-child {margin-top:0}
@@ -525,15 +528,14 @@ ul.maintabs li [class^='box_depth'] {display:none; position:absolute; left:100%;
 .container.main .wrap, .container.dp .wrap {position:relative; width:100%; min-width:auto; max-width:auto; padding-left:0px; padding-right:0px;}
 
 /* .container .wrap.wide {min-width: 100%;} */
-.container .wrap .content {position:relative;  /*max-width: 1460px;*/ margin:0 auto; }
+.container .wrap .content {position:relative;  /*max-width: 1460px; margin:0 auto;*/  margin-left:auto; margin-right:auto;}
 .container .wrap .content:after {content:''; display: block; clear:both;}
-.container.my .wrap .content {max-width:1460px;} /* 마이페이지 서브 레이아웃 */
-.container .wrap .content.wide{width:100%; /*max-width: 1920px;padding: 0px 0px;*/ padding-left: 0px; padding-right: 0px; margin:0 auto;}
+.container .wrap .content.wide{width:100%; /*max-width: 1920px;padding: 0px 0px;*/ padding-left: 0px; padding-right: 0px; /*margin:0 auto;*/ margin-left:auto; margin-right:auto;}
 .container .wrap .content section {/*width: 100%;*/ display:block;}
 
 /* max-width: 1820px; */
 /* min-width: 1350px; */
-@media screen and (max-width:1460px) {}
+@media screen and (max-width:1459px) {}
 
 /* 검색 */
 .fs25 {font-size: 25px;}
@@ -1506,9 +1508,12 @@ ul.maintabs li [class^='box_depth'] {display:none; position:absolute; left:100%;
 	/* dp_list */
 	.dp .select_dress {padding:12px 15px;}
 	.dp .dp_inner {max-width:1780px; margin: 0 auto;}
-	.container .wrap .content.dp_list,.container .wrap .content.dp_hotdeal,.container .wrap .content.dp_Exhibition,.container .wrap .content.dp_Bulletship {max-width: 1780px; overflow: hidden;}
-	.container .wrap .content.wide.dp_detail_case1 {max-width: 1920px;}
-	.container.dp .cont_head > div {position: relative;}
+	/*.container .wrap .content.dp_list,.container .wrap .content.dp_hotdeal,.container .wrap .content.dp_Exhibition,.container .wrap .content.dp_Bulletship {max-width: 1780px; overflow: hidden;}
+	.container .wrap .content.wide.dp_detail_case1 {max-width: 1920px;}*/
+	.dp h4 {color:#222; font-size:30px; font-weight:500; text-align:center;}
+	.dp h4 a {color:#222;}
+	.dp .cont_head h4 {margin-bottom:60px;}
+	.dp .cont_head > div {position:relative;}
 	.container.dp .cont_head > div.item_header {padding: 80px 0 60px;}
 	.container.dp .cont_head > div.item_header h3 {padding: 20px 0 0; font-size: 30px; line-height: 1;}
 	.container.dp .cont_head > div h3 {text-align: center; margin-bottom: 0; padding-bottom: 60px; font-size: 40px; line-height: 1;}
@@ -1991,52 +1996,70 @@ ul.maintabs li [class^='box_depth'] {display:none; position:absolute; left:100%;
 
 	
 	
-	/* dp_Bulletship */
-	.Bulletship {padding-bottom: 120px; max-width:100%; margin:0 auto;}
-	.Bulletship .Bulletship_head {width:100%; height: 550px; background: url(/images/pc/thumb/bullet_bg1.png)no-repeat center center;}
-	.Bulletship .Bulletship_body {text-align: center; padding: 60px 0 72px; max-width:1780px; margin:0 auto;}
-	.Bulletship .Bulletship_body > p {margin-top: 30px;}
-	.Bulletship .Bulletship_body > p:first-child {position: relative; margin-bottom: 26px; padding-top: 38px;}
-	.Bulletship .Bulletship_body > p:first-child::before {position: absolute; content: ''; width:63px; height: 31px; top:0; left:50%; transform: translateX(-50%); background: url(/images/pc/ico_home.png)no-repeat;}
-	.Bulletship .Bulletship_body > p:nth-child(2) {margin-bottom: 46px;}
-	.Bulletship .Bulletship_body > p:nth-child(2) span {color: #fd4802;}
-	.Bulletship .Bulletship_body > p:nth-child(3) {margin-top: 30px;}
-	.Bulletship .Bulletship_foot {max-width:1780px; margin:0 auto; height: 393px; background: url(/images/pc/thumb/bullet_bg2.png)no-repeat center center;}
-	.Bulletship .Bulletship_body .search {position: relative; width:720px; height: 80px; margin: 0 auto; border: 3px solid #fd4802;}
-	.Bulletship .Bulletship_body .search .area,.Bulletship .Bulletship_body .search form,.Bulletship .Bulletship_body .search fieldset{height: 100%;}
-	.Bulletship .Bulletship_body .search .ico_search:before {width:35px; height: 36px; background: url(/images/pc/ico_search_bullet.png)no-repeat;}
-	.Bulletship .Bulletship_body .search input {width:100%; height: 100%; border: none; padding: 22px 30px;}
-	.Bulletship .Bulletship_body .search button {position: absolute; top:20px; right:19px;}
-	.Bulletship .Bulletship_body .bullet_able,.Bulletship .Bulletship_body  .normal_able {width:720px; padding: 26px 112px; margin-bottom: 30px; box-sizing: border-box; background: #f5f5f5;}
-	.Bulletship .Bulletship_body > div {width:720px; margin: 0 auto;}
+	/* dp_bulletship 총알배송 */
+	.dp .dp_Bulletship {}
+	.dp .dp_Bulletship .bulletship {}
+	.bulletship {width:100%;}
+	.bulletship .bulletship_head {width:100%; overflow:hidden;}
+	.bulletship .bulletship_head img {position:relative; left:50%; transform:translateX(-50%);}
+	.bulletship .bulletship_body {text-align:center; padding:0px 70px;}
+	.bulletship .bulletship_body .txt_result {width:720px; margin:0 auto; padding:60px 0;}
+	.bulletship .bulletship_body .txt_result > p:nth-child(1) {position:relative; padding-top:40px; color:#555; font-size:20px; font-weight:300;}
+	.bulletship .bulletship_body .txt_result > p:nth-child(1)::before {content:''; position:absolute; width:65px; height:32px; top:0; left:50%; transform:translateX(-50%); background:url('/images/pc/ico_home.png') no-repeat;}
+	.bulletship .bulletship_body .txt_result > p:nth-child(2) {padding-top:20px; color:#222; font-size:46px; font-weight:700; line-height:60px;}
+	.bulletship .bulletship_body .txt_result > p:nth-child(2) span {color:#fd4802;}
+	.bulletship .bulletship_body .bullet_able,
+	.bulletship .bulletship_body .normal_able {display:block; margin-top:40px; padding:20px 110px; background:#f5f5f5; color:#666; font-size:20px; font-weight:200; line-height:30px; word-break:keep-all;}
+	.bulletship .bulletship_body .bulletshop_btn {}
+	.bulletship .bulletship_body .txt_result > p:nth-child(2) + .bulletshop_btn {margin-top:50px}
+	.bulletship .bulletship_body .bullet_able + .bulletshop_btn,
+	.bulletship .bulletship_body .normal_able + .bulletshop_btn {margin-top:30px}
+	.bulletship .bulletship_body .bulletshop_btn .btn {height:80px; border:1px solid #a7a7a7; color:#222; font-size:22px; font-weight:500;}
+	.bulletship .bulletship_body .bulletshop_btn + P {margin-top:30px; padding-bottom:10px; color:#666; font-size:20px; font-weight:200;}
+	.bulletship .bulletship_foot {margin-left:70px; margin-right:70px; overflow:hidden;}
+	.bulletship .bulletship_foot img {position:relative; left:50%; transform:translateX(-50%);}
+	
+	/*.dp .list_content .item_header {text-align: center; padding: 78px 0 68px;}*/
 	.dp .bullet_sticky_nav {margin-bottom: 0px !important; padding:20px 0; background: #fff; border-top:1px solid #222; border-bottom:1px solid #222; z-index: 20;}
 	.container.dp .bullet_sticky_nav.sticky {position: fixed; width:100%; top: -1px; left: 50%; transform: translateX(-50%); z-index: 100;}
 	.container.dp .bullet_sticky_nav.sticky > ul {max-width: 1780px; margin: 0 auto;}
-	/* .dp .bullet_sticky_nav ul {overflow-x: scroll; white-space: nowrap; -ms-overflow-style: none; cursor: grab;}
-	.dp .bullet_sticky_nav ul::-webkit-scrollbar {display: none;} */
+	 .dp .bullet_sticky_nav ul {overflow-x: scroll; white-space: nowrap; -ms-overflow-style: none; cursor: grab;}
+	.dp .bullet_sticky_nav ul::-webkit-scrollbar {display: none;} 
 	.dp .bullet_sticky_nav ul li {position: relative; display: inline-block; padding: 20px 40px;}
 	.dp .bullet_sticky_nav ul li:last-child::after {display: none;}
 	.dp .bullet_sticky_nav ul li::after {content:''; position: absolute; top:50%; right: 0; transform: translateY(-50%); width:1px; height: 14px; background: #ddd;}
 	.dp .bullet_sticky_nav ul li a {font-weight: 500;}
 	.dp .bullet_sticky_nav ul li a.active {color:#fd4800;}
-	.dp .list_content .item_header {text-align: center; padding: 78px 0 68px;}
-	.dp .Bulletship_list {max-width:1780px; margin:0 auto;}
-	.dp .Bulletship_list .cont_head {display: block;}
+	.dp .bulletship_list {max-width:1780px; margin:0 auto;}
+	.dp .bulletship_list .cont_head {display: block;}
 	
-	/* dp_Bulletship_pop */
-	.modal.ship_pop {padding: 60px; max-width:580px; height: 490px; text-align: center;}
+	/* popup_총알배송 가능여부 팝업  */
+	.modal.bulletShip_pop {width:580px; max-width:none; padding:60px;}
+	.modal.bulletShip_pop .modal-header {display:none;}
+	.modal.bulletShip_pop .modal-body {}
+	.modal.bulletShip_pop .modal-body .pop_cont {}
+	.modal.bulletShip_pop .modal-body .pop_cont .txt_result {text-align:center; line-height:1;}
+	.modal.bulletShip_pop .modal-body .pop_cont .txt_result > p:nth-child(1) {position:relative; padding-top:35px; color:#666; font-size:16px; font-weight:300;}
+	.modal.bulletShip_pop .modal-body .pop_cont .txt_result > p:nth-child(1)::before {content:''; position:absolute; width:52px; height:24px; top:0; left:50%; transform:translateX(-50%); background:url('/images/pc/ico_home.png') no-repeat; background-size:auto 100%;}
+	.modal.bulletShip_pop .modal-body .pop_cont .txt_result > p:nth-child(2) {margin-top:15px; color:#222; font-size:32px; font-weight:700;}
+	.modal.bulletShip_pop .modal-body .pop_cont .txt_result > p:nth-child(2) span {color:#fd4802;}
+	.modal.bulletShip_pop .modal-body .pop_cont .txt_result .address {display:block; margin-top:25px; padding:20px 30px; background:#f5f5f5; color:#666; font-size:16px; font-weight:200; line-height:26px; word-break:keep-all;}
+	.modal.bulletShip_pop .modal-body .pop_cont .txt_result .info {margin-top:30px; color:#888; font-size:14px;}
+	.modal.bulletShip_pop .modal-footer {margin-top:40px}
+	.modal.bulletShip_pop .modal-footer .btn {width:220px; font-size:16px; font-weight:300;}
+	/*.modal.ship_pop {padding: 60px; max-width:580px; height: 490px; text-align: center;}
 	.modal.ship_pop .modal-header {margin-bottom: 30px;}
 	.modal.ship_pop .modal-header p:first-child {position: relative; margin-bottom: 14px; padding-top: 38px;}
 	.modal.ship_pop .modal-header p:first-child::before {position: absolute; content: ''; width:63px; height: 31px; top:0; left:50%; transform: translateX(-50%); background: url(/images/pc/ico_home.png)no-repeat;}
 	.modal.ship_pop .modal-header p span {color:#fd4802;}
 	.modal.ship_pop .modal-body {background: #f5f5f5; padding: 30px 34px;}
 	.modal.ship_pop .modal-footer {margin-top: 30px;}
-	.modal.ship_pop .modal-footer p {margin-bottom: 28px;}
+	.modal.ship_pop .modal-footer p {margin-bottom: 28px;}*/
 	/* dp_Bulletship_pop */
 
-		/* dp_detail_case1 */
-		.dp .wide .cont_head div div.shareSet {position: absolute; width:28px; height: 30px; top:0; right:70px; background: url(/images/pc/ico_sns_share.png)no-repeat;}
-		.dp .wide .cont_head div div.shareSet a {display: inline-block; width:100%; height: 100%; text-indent: -9999px;}
+	/* dp_detail_case1 */
+	.dp .wide .cont_head div div.shareSet {position: absolute; width:28px; height: 30px; top:0; right:70px; background: url(/images/pc/ico_sns_share.png)no-repeat;}
+	.dp .wide .cont_head div div.shareSet a {display: inline-block; width:100%; height: 100%; text-indent: -9999px;}
 	.dp .wide .cont_body .coner_content .coner_front .big_banner {width:100%; height: 1378px; background: url(/images/pc/thumb/detail_case_bg.png)no-repeat; background-size:100%;}
 	.dp .wide .cont_body .coner_content .coner_item01 {padding: 120px 0 60px;}
 	.dp .wide .cont_body .coner_content .coner_item01 .dp_listItems_wrap > div:first-child {margin-bottom: 54px; text-align: center;}
@@ -2067,7 +2090,7 @@ ul.maintabs li [class^='box_depth'] {display:none; position:absolute; left:100%;
 	.dp .wide .cont_body .coner_content .coner_item02 .dp_coupon_wrap > div:first-child p {font-size: 30px; line-height: 1; font-weight: 500;}
 	
 	/* dp_detail_case2 쿠폰 */
-	.dp .coupon_list {margin:0 auto 60px; max-width:1200px;}
+	/*.dp .coupon_list {margin:0 auto 60px; max-width:1200px;}
 	.dp .coupon_list ul {margin:0 -10px;}
 	.dp .coupon_list li {float:left; width: 285px; margin:0 10px 60px;  position: relative; position: relative; overflow: hidden;}
 	.dp .coupon_list li .cp_top {position: relative; overflow: hidden;}
@@ -2086,7 +2109,7 @@ ul.maintabs li [class^='box_depth'] {display:none; position:absolute; left:100%;
 	.dp .coupon_list li.off .cp_date {border:1px solid #aaa; background: #aaa;}
 	.dp .coupon_list li.off .cp_date button span {background:none; padding-right: 0;}
 	.dp .coupon_list li .cp_info {text-align: center; margin-top: 20px;}
-	.dp .coupon_list li .cp_info button span {display: inline-block; border-bottom: 1px solid #888; color: #888;}
+	.dp .coupon_list li .cp_info button span {display: inline-block; border-bottom: 1px solid #888; color: #888;}*/
 	
 	.dp_coupon_list {display: flex; justify-content: center; flex-wrap: wrap; max-width: 1580px; min-width: 1580px; padding: 0 260px 120px; margin: 0 auto; box-sizing: border-box;}
 	.dp_coupon_list .dp_coupon_item {text-align: center;}
@@ -2231,7 +2254,7 @@ ul.maintabs li [class^='box_depth'] {display:none; position:absolute; left:100%;
 	.dp .dp_banner_slide03 .swiper-pagination {width: 100%;}
 	
 	/* 기획전리뷰 */
-	.dp .dp_review {text-align:center; max-width: 1780px; margin: 0 auto;}
+	/*.dp .dp_review {text-align:center; max-width: 1780px; margin: 0 auto;}*/
 	.dp .dp_exhibition .review .swiper-container{overflow: initial;}
 	.riview_box .swiper-pagination {display:inline-block; width:auto; padding:0.2rem 1rem; border-radius:2rem; font-size:1.2rem; color:#fff; background-color:rgba(34,34,34,.5);}
 	.riview_box .area_slider{text-align:center;}
@@ -2246,8 +2269,8 @@ ul.maintabs li [class^='box_depth'] {display:none; position:absolute; left:100%;
 	.dp .ex_review .star_score .score {color:#222; font-size:1.4rem; font-weight:500;}
 	.dp .dp_exhibition .review .swiper-container .swiper-slide > div{border:1px solid #eee;}
 	.dp .review_list:after {content:''; clear:both; display:block;}
-	.dp .dp_review .review_list > div {position:relative; text-align:center; float:left; width: 19%; margin:0 10px;}
-	.dp .best_review:after{content:''; display:block; position:absolute; bottom:0; left:2rem; right:2rem; height:1px; background-color:#eee;}
+	/*.dp .dp_review .review_list > div {position:relative; text-align:center; float:left; width: 19%; margin:0 10px;}*/
+	/*.dp .best_review:after{content:''; display:block; position:absolute; bottom:0; left:2rem; right:2rem; height:1px; background-color:#eee;}
 	.dp .best_review a {display:block; position:relative; background-color:#fff;}
 	.dp .best_review a .star_score .star {display:inline-block; position:relative; width:83px; height:14px; background:#ddd;}
 	.dp .best_review a .star_score .star::after {content:''; position:absolute; left:0; top:0; z-index:3; width:100%; height:14px; background:url('/images/pc/star_empty.png') no-repeat 0 0; background-size:100% 100%; image-rendering:pixelated;}
@@ -2255,9 +2278,9 @@ ul.maintabs li [class^='box_depth'] {display:none; position:absolute; left:100%;
 	.dp .best_review a .star_score .ico {margin-left:10px}
 	.dp .best_review a .star_score .ico::before {vertical-align:inherit;}
 	.dp .best_review a .lap{}
-	.dp .best_review a .lap > div.txt_best_review p{height:5.5rem; overflow:hidden; line-height:1.6; color:#666; font-size:1.3rem; font-weight:200; display:-webkit-box; text-overflow:ellipsis; -webkit-line-clamp:3; -webkit-box-orient:vertical;}
-	.dp .dp_review .ico_besttag::before {width: 46px; height: 22px; background: url(/images/pc/ico_besttag2.png) no-repeat 50% 50%;}
-	.dp .best_review a .star_score{height: 22px;}
+	.dp .best_review a .lap > div.txt_best_review p{height:5.5rem; overflow:hidden; line-height:1.6; color:#666; font-size:1.3rem; font-weight:200; display:-webkit-box; text-overflow:ellipsis; -webkit-line-clamp:3; -webkit-box-orient:vertical;}*/
+	/*.dp .dp_review .ico_besttag::before {width: 46px; height: 22px; background: url(/images/pc/ico_besttag2.png) no-repeat 50% 50%;}*/
+	/*.dp .best_review a .star_score{height: 22px;}
 	.dp .best_review a .star_score .star{vertical-align:top;}
 	.dp .best_review a .txt_best_review p{font-size:1.2rem; color:#666;  display: -webkit-box; text-overflow: ellipsis; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden; white-space: normal; overflow-wrap: break-word;}
 	.dp .best_review a .pic{position:relative;}
@@ -2268,16 +2291,8 @@ ul.maintabs li [class^='box_depth'] {display:none; position:absolute; left:100%;
 	.dp .best_review a .writer span {position:relative; margin-left:1.1rem; padding-left:1.1rem; color:#888; font-size:1.1rem;}
 	.dp .best_review a .writer span::after {content:''; position:absolute; left:0; top:50%; transform:translateY(-50%); height:8px; width:1px; background:#ddd;}
 	.dp .best_review a .writer span:first-child {margin-left:0; padding-left:0}
-	.dp .best_review a .writer span:first-child::after {display:none;}
+	.dp .best_review a .writer span:first-child::after {display:none;}*/
 	.dp .product_view{padding:20px; background-color:#fff;}
-	.dp .dp_review .item_prod {text-align:left; width: 100%;}
-	.dp .dp_review .item_prod .item_state {position: relative; display:table; width:100%; box-sizing: border-box;}
-	.dp .dp_review .item_prod .itemLink{position: relative; display:table-cell; width: 100%; height:60px; padding-left:56px; vertical-align: middle;}
-	.dp .dp_review .item_prod .item_state .itemLink .itemPic {position:absolute; left:0; top:0; padding: 0; width:40px; height:60px; z-index:2;}
-	.dp .dp_review .item_prod .item_state .itemLink .itemBrand {display:block; font-size:1rem; color:#888888; font-weight:300; margin-left:0; margin-right:0;}
-	.dp .dp_review .item_prod .item_state .itemLink .itemName {display:block; margin-top:0.5rem; font-size:1.3rem; max-height: 3.3rem; margin-left:0; margin-right:0; display: -webkit-box; text-overflow: ellipsis; -webkit-line-clamp: 1; -webkit-box-orient: vertical; max-height: 3.3rem; overflow: hidden; white-space: normal; overflow-wrap: break-word;}
-	.dp .dp_review .item_prod .item_state .itemLink .itemPrice{margin-left:0; margin-right:0;}
-	.dp .dp_review .item_prod .item_state .itemLink .itemPrice .itemPrice_sale{font-weight:700;}
 	.dp .dp_exhibition .dp_listItems_slide .swiper-container.item01 .swiper-pagination{position:relative; margin-top:2.4rem; bottom:0;}
 	.dp .dp_exhibition .dp_listItems_slide .swiper-container.item01 .swiper-pagination .swiper-pagination-bullet-active{background-color:#fd4802;}
 	.dp .dp_exhibition .dp_listItems_slide .swiper-container.item03{overflow: initial;}
@@ -2417,6 +2432,93 @@ ul.maintabs li [class^='box_depth'] {display:none; position:absolute; left:100%;
 	.dp .event_list.no_data .list .no_con li span {display: block; margin: 25px 0 40px; font-size: 16px; color: #666; font-weight: 300;}
 	.dp .event_list.no_data .list .no_con li a {display: inline-block; padding: 9px 23px; border:1px solid #a7a7a7; font-size: 14px; color: #222; font-weight: 300;}
 	
+
+	/* dp_sticky_nav_리스트 */
+	.dp .sticky_nav_list {}
+	.dp .sticky_nav_list .sticky_nav {}
+	.dp .sticky_nav_list .cont_head {display:block; margin-bottom:50px}
+	.dp .sticky_nav {margin-bottom: 0px !important; padding:20px 0; background: #fff; border-top:1px solid #222; border-bottom:1px solid #222; z-index: 20;}
+	.dp .sticky_nav.sticky {position: fixed; width:100%; top: -1px; left: 50%; transform: translateX(-50%); z-index: 100;}
+	.dp .sticky_nav.sticky > ul {max-width: 1780px; margin: 0 auto;}
+	.dp .sticky_nav ul li {position: relative; display: inline-block; padding: 20px 40px;}
+	.dp .sticky_nav ul li:last-child::after {display: none;}
+	.dp .sticky_nav ul li::after {content:''; position: absolute; top:50%; right: 0; transform: translateY(-50%); width:1px; height: 14px; background: #ddd;}
+	.dp .sticky_nav ul li a {font-weight: 500;}
+	.dp .sticky_nav ul li a.active {color:#fd4800;}
+	.dp .sticky_nav_list .list_content {}
+	.dp .sticky_nav_list .list_content .item_header {padding-top:50px;}
+	.dp .sticky_nav_list .list_content .item_header h4 {margin-bottom:60px}
+
+	/* dp_기획전상세 : 상단 프로모션 배너 */
+	.dp .dp_detail_visual {}
+	.dp_detail_visual .promotion_visual {position:relative; width:100%;}
+	.dp_detail_visual .promotion_visual.type1 {}
+	.dp_detail_visual .promotion_visual.type1 img {position:relative; left:50%; top:0; transform:translateX(-50%);}
+	.dp_detail_visual .promotion_visual.type2 {}
+	.dp_detail_visual .promotion_visual.type2 .swiper-button-prev {left:70px}
+	.dp_detail_visual .promotion_visual.type2 .swiper-button-next {right:70px;}
+	.dp_detail_visual .promotion_visual.type2 .swiper-pagination {width:100%; bottom:40px;}
+	
+	/* dp_기획전상세 : 할인쿠폰 */	
+	.dp .dp_coupon {padding-top:60px; padding-bottom:60px;}
+	.dp_coupon .coupon_list {max-width:1200px; margin:auto;}
+	.dp_coupon .coupon_list ul {margin-top:-60px}
+	.dp_coupon .coupon_list ul::after {content:''; display:block; clear:both;}
+	.dp_coupon .coupon_list ul li {float:left; width:calc((100% - 60px)/4); margin-left:20px; margin-top:60px}
+	.dp_coupon .coupon_list ul li:nth-child(4n-3) {margin-left:0}
+	.dp_coupon .announce_txt {margin-top:80px}
+
+	/* dp_기획전상세 : 리얼후기 */	
+	.dp .dp_review {padding-top:120px; padding-bottom:120px; background:#f5f5f5;}
+	.dp_review .cont_body {padding-left:70px; padding-right:70px;}
+	.dp_review .review_list {}
+	.dp_review .review_list::after {content:''; display:block; clear:both;}
+	.dp_review .review_list .reviw_box {float:left; width:calc((100% - 80px)/5); margin-left:20px; background:#fff; padding:30px;}
+	.dp_review .review_list .reviw_box:first-child {margin-left:0}
+	.dp_review .review_list .reviw_box .best_review {}
+	.dp_review .review_list .reviw_box .best_review .pic .thumb {display:block; position:relative; width:100%; padding-top:100%; background-repeat:no-repeat; background-position:50% 50%; background-size:cover;}
+	.dp_review .review_list .reviw_box .best_review .pic .thumb.mov::after {content:''; position:absolute; left:0; top:0; width:100%; height:100%; background:rgba(0,0,0,0.3) url('/images/pc/ico_play.png') no-repeat 50% 50%; z-index:2;}
+	.dp_review .review_list .reviw_box .item_prod {text-align:left; width: 100%;}
+	.dp_review .review_list .reviw_box .item_prod .item_state {position:relative; display:table; width:100%; box-sizing: border-box; padding:0}
+
+	/* dp_기획전상세 : 중간 배너 */	
+	.dp .dp_mid_banner {padding-top:60px; padding-bottom:60px;}	
+	.dp .dp_mid_banner .mid_banner .swiper-button-prev {left:70px}
+	.dp .dp_mid_banner .mid_banner .swiper-button-next {right:70px}
+	.dp .dp_mid_banner .mid_banner .swiper-pagination {position:relative; width:100%; margin-top:40px;}
+
+	/* dp_기획전상세 : 대표상품 노출 */	
+	.dp .dp_special {padding-top:60px; padding-bottom:60px;}	
+	.dp .dp_special h4 a {position:relative;}
+	.dp .dp_special h4 a::after {content:''; position:absolute; right:-25px; top:50%; transform:translateY(-50%); width:13px; height:24px; background:url(/images/pc/ico_dp_arrow.png) no-repeat 0 0;}
+	.dp_special .dp_listItems_cont {position:relative;}
+	.dp_special .dp_listItems_cont .item_prod {width:100%;}
+	.dp_special .dp_listItems_cont .item_state {padding:0;}
+	.dp_special .dp_listItems_cont .swiper-pagination {position:relative; width:100%; margin-top:40px;}
+	.dp_special .dp_listItems_cont.type1 {width:850px; margin:auto;}
+	.dp_special .dp_listItems_cont.type1 ul li {margin-top:40px;}
+	.dp_special .dp_listItems_cont.type1 ul li:first-child {margin-top:0}
+	.dp_special .dp_listItems_cont.type1 .dp_listItems::after {content:''; display:block; clear:both;}
+	.dp_special .dp_listItems_cont.type1 .dp_listItems .dp_listItems_img {float:left;}
+	.dp_special .dp_listItems_cont.type1 .dp_listItems .dp_listItems_info {float:left; margin-left:50px; margin-top:150px}
+	.dp_special .dp_listItems_cont.type2 {max-width:950px; margin:auto; padding-left:70px; padding-right:70px;}
+	.dp_special .dp_listItems_cont.type3 {padding-left:70px; padding-right:70px;}
+
+
+	/* dp_기획전상세 : 다른 기획전 보기 */
+	.dp .other_dp_slide {margin-bottom:100px; padding:0 70px;}
+	.dp .other_dp_slide .cont_head {position:relative; margin-bottom:60px;}
+	.dp .other_dp_slide .cont_head h4 {position:relative; margin-bottom:0;}
+	.dp .other_dp_slide .cont_head a {position:absolute; top: 50%; right: 0; transform:translateY(-50%); padding-right: 20px; background: url('/images/pc/ico_more_lg.png') no-repeat right top 1px; font-size: 18px; color:#888;}
+	.dp .other_dp_slide .cont_body {position:relative;}
+	.dp .other_dp_slide .swiper-button-next {right:-70px;}
+	.dp .other_dp_slide .swiper-button-prev {left:-70px;}
+	.dp .other_dp_slide .thumb {margin-bottom: 22px; position: relative; width: 100%; height: auto; padding-top: 100%;}
+	.dp .other_dp_slide .thumb img {position: absolute; top: 50%; left: 50%; transform:translate(-50%, -50%); width: 100%; height: auto;}
+	.dp .other_dp_slide .brand {display: inline-block; font-size: 12px; color:#888; font-weight: 300;}
+	.dp .other_dp_slide .txt {margin:0 6px;}
+	.dp .other_dp_slide .txt .tit {display: -webkit-box; -webkit-line-clamp:2; -webkit-box-orient:vertical; margin: 20px 0 0; min-height:50px; max-height:50px; overflow: hidden; text-overflow: ellipsis; font-size: 18px; line-height: 1.5; color: #222; font-weight: 300; word-break: keep-all;}
+
 	/* od 공통 */
 	.container.od .wrap .content {max-width:1460px;}
 	.od {}
@@ -2613,7 +2715,7 @@ ul.maintabs li [class^='box_depth'] {display:none; position:absolute; left:100%;
 	.od_realtime .swiper-button-prev::after {background-position:0 50%;}
 	.od_realtime .swiper-button-next::after {background-position:100% 50%;}
 	.od_realtime .swiper-container .swiper-pagination {position:relative; display:block; left:auto; right:auto; bottom:auto; margin-top:60px}
-	@media screen and (max-width:1460px) {}
+	@media screen and (max-width:1459px) {}
 
 	/* od_shopping_Bag 추천상품 */
 	.container .wrap .content.od_recommend {position:relative; max-width:1460px; margin-top:120px;}
@@ -2630,7 +2732,7 @@ ul.maintabs li [class^='box_depth'] {display:none; position:absolute; left:100%;
 	.od_recommend .swiper-button-prev::after {background-position:0 50%;}
 	.od_recommend .swiper-button-next::after {background-position:100% 50%;}
 	.od_recommend .swiper-container .swiper-pagination {position:relative; display:block; left:auto; right:auto; bottom:auto; margin-top:60px}
-	@media screen and (max-width:1460px) {}
+	@media screen and (max-width:1459px) {}
 
 	/* od_odPayment */
 	.od .odPayment {}
@@ -3006,6 +3108,7 @@ ul.maintabs li [class^='box_depth'] {display:none; position:absolute; left:100%;
 	.modal .area_slider .swiper-container .item_prod .item_state .btn {margin-top:20px; width:100%; height:34px; padding:10px; font-size:14px; font-weight:300;} 
 	.modal .area_slider .swiper-container .item_prod .item_state .itemPrice {position:relative; padding-top:20px;}
 	.modal .area_slider .swiper-container .item_prod .item_state .itemPrice_original {position:absolute; top:0; left:0; margin:0;}
+	.modal .area_slider .swiper-container .item_prod .item_state .itemPercent {top:auto; bottom:0;}
 	.modal .area_slider .swiper-scrollbar {background:#ddd}
 	.modal .area_slider .swiper-scrollbar-drag {border-radius:0; background:#222;}
 	.modal .area_slider .swiper-container-horizontal>.swiper-scrollbar {position:relative; left:auto; right:auto; bottom:auto; margin-top:60px; width:100%; height:2px; opacity: 1 !important;}
@@ -3058,11 +3161,12 @@ ul.maintabs li [class^='box_depth'] {display:none; position:absolute; left:100%;
 	.modal.optModify_pop .area_order .opt_size .form_field {display:block; width:95%; margin-top:-6px;}
 	.modal.optModify_pop .area_order .opt_size .form_field > div {margin-left:6px; margin-top:6px;}
 	.modal.optModify_pop .area_order .opt_size .form_field > div:nth-child(6n-5) {margin-left:0px;}
-	.modal.optModify_pop .area_order .opt_size .form_field input[type="radio"] + label {display:block; width:50px; height:40px; padding:0; line-height:40px; text-align:center; background:#fff; box-sizing:border-box; border:1px solid #ddd; color:#222; font-weight:200; font-size:14px;}
+	.modal.optModify_pop .area_order .opt_size .form_field input[type="radio"] + label {position:relative; display:block; width:50px; height:40px; padding:0; line-height:40px; text-align:center; background:#fff; box-sizing:border-box; border:1px solid #ddd; color:#222; font-weight:200; font-size:14px;}
 	.modal.optModify_pop .area_order .opt_size .form_field input[type="radio"] + label::before,
 	.modal.optModify_pop .area_order .opt_size .form_field input[type="radio"] + label::after {display:none;}
 	.modal.optModify_pop .area_order .opt_size .form_field input[type="radio"]:checked + label {border:1px solid #fd4802;}
 	.modal.optModify_pop .area_order .opt_size .form_field input[type="radio"]:disabled + label {text-decoration:line-through; background:#f5f5f5; border-color:#f5f5f5; color:#bbb; opacity:1;}
+	.modal.optModify_pop .area_order .opt_size .form_field input[type="radio"] + label span {position:absolute; top:50%; left:0%; width:100%; padding:0 6px; line-height:1.2; transform:translateY(-50%); transform:translateY(-50%); display:-webkit-box; text-overflow:ellipsis; -webkit-line-clamp:2; -webkit-box-orient:vertical; overflow:hidden;}
 	.modal.optModify_pop .area_order .opt_size .form_field > div {float:left; width:auto;}
 	.modal.optModify_pop .area_order .opt_select .select_custom .combo .select {height:42px; padding:15px;}
 	.modal.optModify_pop .area_order .opt_select .select_custom .combo .list > li {height:42px; padding:15px; font-size:14px; line-height:1;}
@@ -3144,7 +3248,7 @@ ul.maintabs li [class^='box_depth'] {display:none; position:absolute; left:100%;
 	.modal.couponInfo_pop dl > div::after {content:''; clear:both; display:block;}
 	.modal.couponInfo_pop dl dt {float:left; position:relative; width:84px; padding-left:15px; color:#222; font-weight:300;}
 	.modal.couponInfo_pop dl dt::before {content:''; position:absolute; left:0; top:5px; width:3px; height:3px; background:#888}
-	.modal.couponInfo_pop dl dd {color:#666; font-weight:200;}
+	.modal.couponInfo_pop dl dd {padding-left:84px; color:#666; font-weight:200;}
 
 	/* 간편결제 팝업 지울것 
 	.modal.qPayAgree_pop {}
@@ -3174,9 +3278,9 @@ ul.maintabs li [class^='box_depth'] {display:none; position:absolute; left:100%;
 	.pd .swiper-button-prev::after,
 	.pd .swiper-button-next::after {content: ''; display:none;}
 	.pd .swiper-button-prev,
-	.pd .swiper-button-next {top:50%; margin:0; display:inline-block; width:40px; height:40px; border:2px solid #a7a7a7; border-width:2px 2px 0 0;}
-	.pd .swiper-button-prev {transform:translateY(-50%) rotate(225deg); -webkit-transform:translateY(-50%) rotate(225deg);}
-	.pd .swiper-button-next {transform:translateY(-50%) rotate(45deg); -webkit-transform:translateY(-50%) rotate(45deg);}
+	.pd .swiper-button-next {top:50%;margin:0;display:inline-block;width: 20px;height: 40px;/* border:2px solid #a7a7a7; */border-width:2px 2px 0 0;}
+	.pd .swiper-button-prev {/* transform:translateY(-50%) rotate(225deg); *//* -webkit-transform:translateY(-50%) rotate(225deg); */}
+	.pd .swiper-button-next {/* transform:translateY(-50%) rotate(45deg); *//* -webkit-transform:translateY(-50%) rotate(45deg); */}
 	.pd .area_slider {position:relative; width:100%; box-sizing:border-box; padding:0px 70px}
 	.pd .area_slider .swiper-button-prev,
 	.pd .area_slider .swiper-button-next {margin-top:-90px}
@@ -3198,6 +3302,11 @@ ul.maintabs li [class^='box_depth'] {display:none; position:absolute; left:100%;
 	.pd_detail .btn_popup {display:inline-block; padding:0px; box-sizing:border-box;}
 	.pd_detail .btn_popup span {color:#888; font-size:12px; font-weight:200; border-bottom:1px solid #888; /*vertical-align:top;*/}
 
+	.video_controls {position:absolute; top:50%; left:50%; transform:translate(-50%,-50%); z-index:2;}
+	.video_controls button {display:inline-block; overflow:hidden; width:60px; height:60px; font-size:1px; text-indent:-999999px;}
+	.video_controls button.btn_video_play {background:url('/images/pc/btn_video_play.png') no-repeat 50% 50%; background-size:100% auto;}
+	.video_controls button.btn_video_pause {background:url('/images/pc/btn_video_pause.png') no-repeat 50% 50%; background-size:100% auto;}
+
 	.pd_detail .item_detail {}
 	.pd_detail .item_detail .area_pic {float:left; position:relative; width:calc(100% - 560px); max-width:1200px; box-sizing:border-box;}
 	.pd_detail .item_detail .area_desc {float:right; /*position:relative;*/ width:500px;}
@@ -3212,7 +3321,7 @@ ul.maintabs li [class^='box_depth'] {display:none; position:absolute; left:100%;
 	.pd_detail .area_pic .thumb_nav_wrap .thumbnav .swiper-container .swiper-slide video {width:100%; box-sizing:border-box;}
 	.pd_detail .area_pic .thumb_nav_wrap .thumbnav .swiper-container .swiper-slide.on a {display:block; border:1px solid #fd4802;}
 	.pd_detail .area_pic .thumb_nav_wrap .thumbnav .swiper-button-prev,
-	.pd_detail .area_pic .thumb_nav_wrap .thumbnav .swiper-button-next {left:50%; right:auto; width:14px; height:14px; border:2px solid #a7a7a7; border-width:2px 2px 0 0;}
+	.pd_detail .area_pic .thumb_nav_wrap .thumbnav .swiper-button-next {left:50%; right:auto; width:14px; height:14px; border:2px solid #a7a7a7; border-width:2px 2px 0 0; background:none;}
 	.pd_detail .area_pic .thumb_nav_wrap .thumbnav .swiper-button-prev {top:4px; bottom:auto; transform:translateX(-50%) rotate(-45deg); -webkit-transform:translateX(-50%) rotate(-45deg);}
 	.pd_detail .area_pic .thumb_nav_wrap .thumbnav .swiper-button-next {top:auto; bottom:4px; transform:translateX(-50%) rotate(135deg); -webkit-transform:translateX(-50%) rotate(135deg);}
 	.pd_detail .area_pic .thumb_list_wrap {width:100%; padding-left:70px; box-sizing:border-box;}
@@ -3222,10 +3331,6 @@ ul.maintabs li [class^='box_depth'] {display:none; position:absolute; left:100%;
 	.pd_detail .area_pic .thumb_list_wrap li:nth-child(even) {margin-left:10px}
 	.pd_detail .area_pic .thumb_list_wrap li a {display:block; cursor:url('/images/pc/cursor_zoom.png') 0 0, zoom-in;}
 	.pd_detail .area_pic .thumb_list_wrap li.on a span img {z-index:2;}
-	.pd_detail .area_pic .thumb_list_wrap li .thumb .video_controls {position:absolute; top:50%; left:50%; transform:translate(-50%,-50%); z-index:2;}
-	.pd_detail .area_pic .thumb_list_wrap li .thumb .video_controls button {display:inline-block; overflow:hidden; width:60px; height:60px; font-size:1px; text-indent:-999999px;}
-	.pd_detail .area_pic .thumb_list_wrap li .thumb .video_controls button.btn_video_play {background:url('/images/pc/btn_video_play.png') no-repeat 50% 50%; background-size:100% auto;}
-	.pd_detail .area_pic .thumb_list_wrap li .thumb .video_controls button.btn_video_pause {background:url('/images/pc/btn_video_pause.png') no-repeat 50% 50%; background-size:100% auto;}
 	.pd_detail .area_pic .thumb_nav_wrap.fixtop {position:fixed; top:90px; bottom:auto;}
 	.pd_detail .area_pic .thumb_nav_wrap.fixbottom {position:absolute; top:auto; bottom:0px;}
 	.pd_detail .area_pic .thumb_nav_wrap .thumbnav.disabled {padding:0;}
@@ -3330,11 +3435,13 @@ ul.maintabs li [class^='box_depth'] {display:none; position:absolute; left:100%;
 	.option_box .opt_size .form_field {display:block; margin-top:-8px;}
 	.option_box .opt_size .form_field > div {margin-left:8px; margin-top:8px;}
 	.option_box .opt_size .form_field > div:nth-child(7n-6) {margin-left:0px;}
-	.option_box .opt_size .form_field input[type="radio"] + label {display:block; width:66px; height:42px; padding:0; line-height:42px; text-align:center; background:#fff; box-sizing:border-box; border:1px solid #ddd; color:#222; font-weight:200; font-size:14px;}
+	.option_box .opt_size .form_field input[type="radio"] + label {display:block; position:relative; width:66px; height:42px; padding:0; /*line-height:42px;*/ text-align:center; background:#fff; box-sizing:border-box; border:1px solid #ddd; color:#222; font-weight:200; font-size:14px;}
 	.option_box .opt_size .form_field input[type="radio"] + label::before,
 	.option_box .opt_size .form_field input[type="radio"] + label::after {display:none;}
 	.option_box .opt_size .form_field input[type="radio"]:checked + label {border:1px solid #fd4802;}
 	.option_box .opt_size .form_field input[type="radio"]:disabled + label {text-decoration:line-through; background:#f5f5f5; border-color:#f5f5f5; color:#bbb; opacity:1;}
+	.option_box .opt_size .form_field input[type="radio"] + label span {position:absolute; top:50%; left:0%; width:100%; padding:0 6px; line-height:1.2; transform:translateY(-50%); transform:translateY(-50%); display:-webkit-box; text-overflow:ellipsis; -webkit-line-clamp:2; -webkit-box-orient:vertical; overflow:hidden;}
+	
 	.option_box .opt_size .form_field > div {float:left; /* width:auto; */ width:calc((100% - 48px) / 7);}
 	
 	
@@ -3343,16 +3450,16 @@ ul.maintabs li [class^='box_depth'] {display:none; position:absolute; left:100%;
 	.option_box [class^="opt_"] .form_field {margin-top:10px;}
 	.option_box [class^="opt_"] .form_field:first-child {margin-top:0}
 	.option_box [class^="opt_"] .select_custom {height:52px;}
-	.option_box [class^="opt_"] .select_custom .select {height:52px; padding:17px 40px 17px 18px; border-bottom-color:#ddd; overflow:hidden;}
+	.option_box [class^="opt_"] .select_custom .select {height:52px; padding:17px 40px 17px 18px; border-bottom-color:#ddd; overflow:hidden; color:#222; font-weight:200;}
 	.option_box [class^="opt_"] .select_custom .select:after {right:20px;}
 	.option_box [class^="opt_"] .select_custom[aria-disabled="true"] .select {color:#bbb; background:#f5f5f5;}
 	.option_box [class^="opt_"] .select_custom .combo .list {top:52px; padding:0}
-	.option_box [class^="opt_"] .select_custom .combo .list > li {padding:18px 18px; line-height:1; color:#666}
+	.option_box [class^="opt_"] .select_custom .combo .list > li {padding:18px 18px; line-height:1; color:#666; font-size:16px; font-weight:200;}
 	.option_box [class^="opt_"] .select_custom .combo .list > li[aria-disabled="true"] {color:#bbb;}
 	.option_box [class^="opt_"] .select_custom .combo .list > li > div {margin-top:5px}
 	.option_box [class^="opt_"] .select_custom .combo .list > li > div:first-child {margin-top:0;}
 	.option_box [class^="opt_"] .select_custom .combo .list > li .opt_name {}
-	.option_box [class^="opt_"] .select_custom .combo .list > li .opt_price {font-size:14px;}
+	.option_box [class^="opt_"] .select_custom .combo .list > li .opt_price {font-size:12px;}
 	.option_box [class^="opt_"] .select_custom .combo .list > li[data-soldout="true"]::after {right:18px; top:50%; bottom:auto; transform:translateY(-50%);}
 	.option_box [class^="opt_"] .select_custom.deal_opt_item,
 	.option_box [class^="opt_"] .select_custom.deal_opt_item .select {height:112px; background:transparent;}
@@ -3401,7 +3508,7 @@ ul.maintabs li [class^='box_depth'] {display:none; position:absolute; left:100%;
 	.option_box .number_count span.max_val {opacity:0.2;}
 	.option_box .number_count .plus::after {content:''; background-position:100% 0;}
 	.option_box .number_count .minus::after {content:''; background-position:0 0;}
-	.option_box .number_count input[type='text'] {width:44px; height:40px; padding:0; text-align:center; color:#222; font-size:15px; font-weight:200; border:none;}
+	.option_box .number_count input[type='text'] {width:44px; height:40px; padding:0; text-align:center; color:#222; font-size:15px; font-weight:200; border:none;  background:#fff;}
 
 	/* pd_deal_가격 폼 */
 	.pd .price_box {}
@@ -3434,8 +3541,9 @@ ul.maintabs li [class^='box_depth'] {display:none; position:absolute; left:100%;
 	.pd_detail .area_desc .desc_wrap .exinfo_box ul li .ex_review .star_score .score {color:#222; font-size:16px; font-weight:200;}
 	.pd_detail .area_desc .desc_wrap .exinfo_box ul li .ex_review .star_score .score em {font-weight:500;}
 	.pd_detail .area_desc .desc_wrap .exinfo_box ul li .best_review {width:500px; margin-bottom:30px;}
-	.pd_detail .area_desc .desc_wrap .exinfo_box ul li .best_review a {display:block; position:relative; height:150px; padding:20px 35px 20px 150px; border:1px solid #eee;}
-	.pd_detail .area_desc .desc_wrap .exinfo_box ul li .best_review a .pic {position:absolute; left:20px; top:20px; width:110px;}
+	.pd_detail .area_desc .desc_wrap .exinfo_box ul li .best_review a {display:block; position:relative; height:150px; padding:20px 35px 20px 20px; border:1px solid #eee;}
+	.pd_detail .area_desc .desc_wrap .exinfo_box ul li .best_review a::after {content:''; clear:both; display:block; width:100%}
+	.pd_detail .area_desc .desc_wrap .exinfo_box ul li .best_review a .pic {float:left; width:110px; margin-right:20px;}
 	.pd_detail .area_desc .desc_wrap .exinfo_box ul li .best_review a .pic .thumb {padding-top:100%; background-repeat:no-repeat; background-position:50% 50%; background-size:cover;}
 	.pd_detail .area_desc .desc_wrap .exinfo_box ul li .best_review a .pic .thumb.mov::after {content:''; position:absolute; left:0; top:0; width:100%; height:100%; background:rgba(0,0,0,0.3) url('/images/pc/ico_play.png') no-repeat 50% 50%; z-index:2;}
 	.pd_detail .area_desc .desc_wrap .exinfo_box ul li .best_review a .star_score {margin-top:10px; height:14px;}
@@ -3450,6 +3558,14 @@ ul.maintabs li [class^='box_depth'] {display:none; position:absolute; left:100%;
 	.pd_detail .area_desc .desc_wrap .exinfo_box ul li .ex_shipping {color:#666; font-size:14px; font-weight:200;}
 	.pd_detail .area_desc .desc_wrap .exinfo_box ul li .ex_shipping span {display:block; margin-top:10px;}
 	.pd_detail .area_desc .desc_wrap .exinfo_box ul li .ex_shipping span:first-child {margin-top:0; margin-bottom:20px;}
+	@media screen and (max-width:1459px) {
+		.pd_detail .area_pic .thumb_nav_wrap.fixtop {position:absolute; top:0; bottom:auto;}
+		.pd_detail .area_pic .thumb_nav_wrap.fixbottom {position:absolute; top:0; bottom:auto;}
+		.pd_detail .area_desc .desc_wrap.fixbottom {position:absolute; top:0; bottom:auto;}
+		.pd_detail .area_desc .desc_wrap.absbottom {position:absolute; top:0; bottom:auto;}
+	}
+
+
 
 	.pd_together {}
 	.pd_together .area_slider {padding:0;}
@@ -3571,6 +3687,7 @@ ul.maintabs li [class^='box_depth'] {display:none; position:absolute; left:100%;
 	.pd.deal .tab_detail_nav ul li {float:left; width:25%}
 	.pd.deal .tab_detail_nav ul li a {display:block; padding:22px 0px 18px; color:#888; font-size:18px; text-align:center; background:#f5f5f5; border:1px solid #f5f5f5; border-bottom-color:#222; box-sizing:border-box;}
 	.pd.deal .tab_detail_nav ul li.active a {border:1px solid #222; border-bottom-color:#fff; color:#222; font-weight:300; background:#fff;}
+	.pd.deal .tab_detail_nav ul li.active a em {color:#666;}
 	.pd.deal .tab_detail_cont {display:none; min-height:1000px;}
 	.pd.deal .pd_clickother {margin-bottom:160px}
 	.pd.deal .pd_detail .area_desc .desc_wrap .descript_box .desc_info {margin-top:20px}
@@ -3608,6 +3725,11 @@ ul.maintabs li [class^='box_depth'] {display:none; position:absolute; left:100%;
 	.pd_desc_wrap .item_descrp .area_option .opt_wrap {width:500px; padding-left:60px; padding-top:30px;}
 	.pd_desc_wrap .item_descrp .area_option .opt_wrap.fixtop {position:fixed; right:70px; top:80px; width:500px}
 	.pd_desc_wrap .item_descrp .area_option .opt_wrap.absbottom {position:absolute; top:auto; bottom:0px; right:0;}
+	@media screen and (max-width:1459px) {
+		.pd.deal .tab_detail_nav.fix ul {position:absolute; left:0; top:0; width:100%; height:60px; z-index:2;}
+		.pd_desc_wrap .item_descrp .area_option .opt_wrap.fixtop,
+		.pd_desc_wrap .item_descrp .area_option .opt_wrap.absbottom {position:relative; top:auto; bottom:auto; right:auto;}
+	}
 
 
 	/* pd_popup */
@@ -3701,6 +3823,13 @@ ul.maintabs li [class^='box_depth'] {display:none; position:absolute; left:100%;
 	.modal.pd_pop.bnf_shopping_pop .benefit_blk .tbl.type1 table tr td {color:#fd4802;}
 	.modal.pd_pop.bnf_shopping_pop .benefit_blk .tbl.type1 table tr td div.th {display:block; text-align:left; color:#222; font-weight:300;}
 	.modal.pd_pop.bnf_shopping_pop .benefit_blk .tbl.type1 table tr td div.td {display:block; margin-top:10px; text-align:left; color:#fd4802; font-weight:200;}
+	.modal.pd_pop.bnf_card_pop .tbl.type1 {padding:0px; font-size:14px;}
+	.modal.pd_pop.bnf_card_pop .tbl.type1 table tr th,
+	.modal.pd_pop.bnf_card_pop .tbl.type1 table tr td {padding:25px 0px; border-top:1px solid #ddd;}
+	.modal.pd_pop.bnf_card_pop .tbl.type1 table tr th {padding-left:20px;}
+	.modal.pd_pop.bnf_card_pop .tbl.type1 table tr:first-child th,
+	.modal.pd_pop.bnf_card_pop .tbl.type1 table tr:first-child td{border-top:none;}
+	.modal.pd_pop.bnf_card_pop .tbl.type1 table tr td:last-child {padding-right:20px;}
 	.modal.pd_pop.bnf_card_pop table .info_card {text-align:left;}
 	.modal.pd_pop.bnf_card_pop table .info_card p {margin-top:10px}
 	.modal.pd_pop.bnf_card_pop table .info_card p:first-child {margin-top:0}
@@ -3800,7 +3929,7 @@ ul.maintabs li [class^='box_depth'] {display:none; position:absolute; left:100%;
 	.pd_pop.pd_lookbook_pop .itemsGrp .item_prod .itemName {margin:0px 0px 25px; font-size: 18px; font-weight: 300; line-height: 28px; height:56px;}
 	.pd_pop.pd_lookbook_pop .itemsGrp .item_prod .itemPrice {font-size: 26px; line-height: 1; font-weight: 500; margin:0;}
 	.pd_pop.pd_lookbook_pop .itemsGrp .item_prod .itemPrice_original {display: inline-block; margin-left:0; margin-bottom:10px; font-size: 20px; font-weight: 200;}
-	.pd_pop.pd_lookbook_pop .itemsGrp .item_prod .itemPercent {font-size: 26px; line-height: 0.8;}
+	.pd_pop.pd_lookbook_pop .itemsGrp .item_prod .itemPercent {position:relative; font-size: 26px; line-height: 0.8;}
 	.pd_pop.pd_lookbook_pop .itemsGrp .item_prod .itemLink .btn {margin-top:40px; border:1px solid #a7a7a7; font-weight:300;}
 
 
@@ -3940,7 +4069,7 @@ ul.maintabs li [class^='box_depth'] {display:none; position:absolute; left:100%;
 
 	/* pd_full_popup */
 	body.lock {overflow:hidden;}
-	.pd_pop.full_pop {display:none; position:fixed; top:0; bottom:0; left:0; right:0; width:100%; height:100%; overflow-y:auto; z-index:110; background:#fff; line-height:1;}
+	.pd_pop.full_pop {display:none; position:fixed; top:0; bottom:0; left:0; right:0; margin-top:160px; width:100%; height:calc(100% - 160px); overflow-y:auto; z-index:110; background:#fff; line-height:1;}
 	.pd_pop.full_pop .info_txt ul li {position:relative; font-size:14px; color:#888; padding-left:15px; margin-bottom:15px; line-height:1;}
 	.pd_pop.full_pop .info_txt ul li:last-child {margin-bottom:0;}
 	.pd_pop.full_pop .info_txt ul li:after {content:''; position: absolute; top:5px; left:0; background:#858585; width:3px; height:3px;}
@@ -3964,24 +4093,29 @@ ul.maintabs li [class^='box_depth'] {display:none; position:absolute; left:100%;
 	.pd_pop .full_popup_wrap .full_pop_header .select_custom .combo .list > li[aria-disabled="true"] {color:#bbb;}
 	.pd_pop .full_popup_wrap .full_pop_header .select_custom .combo .list > li[aria-disabled="true"] a [class^="item"] {color:#bbb; text-decoration:line-through;} 
 	.pd_pop .full_popup_wrap .full_pop_header .select_custom .combo .list > li[aria-disabled="true"] a img {opacity:0.3;}
-	.pd_pop .full_popup_wrap .full_pop_container {position:relative; width:1200px; margin:auto; padding-top:160px; padding-bottom:160px}
+	.pd_pop .full_popup_wrap .full_pop_container {position:relative; width:1200px; margin:auto; /*padding-top:160px;*/ padding-bottom:160px}
 
 	/* pd_pop > 상품썸네일 크게보기 */
-	.pd_pop.full_pop.pd_itemthumb_pop {}
+	.pd_pop.full_pop.pd_itemthumb_pop {margin-top:0; height:100%;}
 	.full_pop.pd_itemthumb_pop .full_pop_container {width:100%; padding:0px;}
-	.full_pop.pd_itemthumb_pop .full_pop_container .scaleview {display:block; text-align:center; margin-top:40px; z-index:1;}
+	.full_pop.pd_itemthumb_pop .full_pop_container .scaleview {position:relative; display:block; text-align:center; margin-top:40px; z-index:1;}
 	.full_pop.pd_itemthumb_pop .full_pop_container .scaleview:first-child {margin-top:0}
 	.full_pop.pd_itemthumb_pop .full_pop_container .scaleview img {max-width:100%; cursor:url('/images/pc/cursor_zoomout.png') 0 0, zoom-out;}
 	
 	/* pd_pop > 개별상품상세 설명 페이지 */
-	.pd_pop.full_pop.pd_descrp_pop {padding:0; margin:0; /*background:none;*/ overflow:hidden;}
+	.pd_pop.full_pop.pd_descrp_pop {height:100%; padding:0; margin:0; /*background:none;*/ overflow:hidden;}
 	.full_pop.pd_descrp_pop .full_popup_wrap  {}
 	.full_pop.pd_descrp_pop .full_popup_wrap .full_pop_container {float:left; /*width:calc(100% - 560px); min-width:1200px;*/ width:69.79%; max-height:780px; background:#fff; margin-top:160px; padding-top:80px; padding-left:70px; padding-right:70px; overflow-y:auto;}
 	.full_pop.pd_descrp_pop .full_pop_container .btn_more_box {display:none;}
 	.full_pop.pd_descrp_pop .full_pop_container .cont_body {max-width:1345px; background:#fff; max-height:none; overflow:visible;}
 	.full_pop.pd_descrp_pop .full_pop_container .cont_body > div {width:auto; max-width:1200px;}
-	.full_pop.pd_descrp_pop .full_pop_fix_r {position:fixed; z-index:2; right:0; top:0; bottom:0; /*width:570px;*/ width:30.21%; padding:160px 70px 0; border-left:1px solid #ddd; box-sizing:border-box; background:#fff;}
+	.full_pop.pd_descrp_pop .full_pop_fix_r {position:fixed; z-index:2; right:0; top:0; bottom:0; /*width:570px;*/ width:30.21%; padding:160px 70px 0; border-left:1px solid #ddd; box-sizing:border-box; background:#fff; overflow-y:auto;}
 	.full_pop.pd_descrp_pop .full_pop_fix_r .option_box {margin-top:30px}
+	.full_pop.pd_descrp_pop .full_pop_fix_r .btn_box {margin-bottom:30px}
+	@media screen and (max-width:1459px) {
+		.full_pop.pd_descrp_pop .full_pop_fix_r {padding-left:20px; padding-right:20px;}
+	}
+
 
 	/* pd_pop > 상품문의 페이지 */
 	.pd_qnalist_pop {}
@@ -4013,6 +4147,15 @@ ul.maintabs li [class^='box_depth'] {display:none; position:absolute; left:100%;
 	.pd_qnalist .qna_list .fold_head .fold_tit .ico {float:left; display:inline-block; width:auto; height:auto; margin-left:12px;}
 	.pd_qnalist .qna_list .fold_head .fold_tit .ico_myqna::after {content:'내문의'; display:inline-block; width:47px; height:22px;  border:1px solid #fd4802; color:#fd4802; font-size:12px; text-align:center; box-sizing:border-box; line-height:20px; margin-top:-3px}
 	.pd_qnalist .qna_list .fold_head .fold_tit .ico_secret::after {content:''; display:inline-block; width:15px; height:16px; background:url('/images/pc/ico_secret.png') no-repeat 50% 50%;}
+	@media screen and (max-width:1459px) {
+		.pd_qnalist .qna_list .fold_head .data {right:40px}
+		.pd_qnalist .qna_list .fold_head::after {right:20px; width:12px; height:6px; background-size:100% auto;}
+		.pd_qnalist .qna_list .fold_head .fold_state {width:100px;}
+		.pd_qnalist .qna_list .case1 .fold_head .fold_tit span {max-width:350px;}
+		.pd_qnalist .qna_list .case1 .fold_detail, 
+		.pd_qnalist .qna_list .case1 .fold_answer {padding-left:100px;}
+		.pd_qnalist .qna_list .case1 .fold_head .data [class^="wr_"] {width:88px;}
+	}
 
 	/* pd_pop > 상품리뷰 페이지 */
 	.pd_review_pop {}
@@ -4023,7 +4166,7 @@ ul.maintabs li [class^='box_depth'] {display:none; position:absolute; left:100%;
 	.pd_review .swiper-pagination .swiper-pagination-bullet:first-child {margin-left:0;} 
 	.pd_review .thumb {display:block; position:relative; width:100%; height:0px; line-height:0; font-size:0; padding-top:150%; background:#f5f5f5; overflow:hidden;}
 	.pd_review .pic .thumb {padding-top:100%; background-repeat:no-repeat; background-position:50% 50%; background-size:cover;}
-	.pd_review .pic .thumb.mov::after {content:''; position:absolute; left:0; top:0; width:100%; height:100%; background:rgba(0,0,0,0.3) url('/images/pc/ico_play.png') no-repeat 50% 50%; z-index:2;}
+	.pd_review .pic .thumb.mov::after {content:''; position:absolute; left:0; top:0; width:100%; height:100%; background:rgba(0,0,0,0.3) url('/images/pc/ico_play.png') no-repeat 50% 50%; z-index:1;}
 	.pd_review dl div,
 	.pd_review dl dt,
 	.pd_review dl dd {float:left;}
@@ -4045,7 +4188,7 @@ ul.maintabs li [class^='box_depth'] {display:none; position:absolute; left:100%;
 	.pd_review .area_rv_empty .btn_box .btn {width:237px; height:60px; margin-top:60px; font-size:18px;}
 
 	.pd_review .area_rv_average {margin-top:60px}
-	.pd_review .area_rv_average .star_score {margin-bottom:30px}
+	.pd_review .area_rv_average .star_score {margin-bottom:30px; height:25px;}
 	.pd_review .area_rv_average .star_score span {display:inline-block; position:relative; color:#fd4802; vertical-align:middle;}
 	.pd_review .area_rv_average .star_score .tit {margin-right:30px; font-size:18px; font-weight:300;}
 	.pd_review .area_rv_average .star_score .score {margin-right:15px; font-size:32px; font-weight:500;}
@@ -4054,20 +4197,20 @@ ul.maintabs li [class^='box_depth'] {display:none; position:absolute; left:100%;
 	.pd_review .area_rv_average .star_score .star::after {content:''; position:absolute; left:0; top:0; z-index:2; width:100%; height:100%; background:url('/images/pc/star_empty_big.png') no-repeat 0 0; background-size:100% 100%; image-rendering:pixelated;}
 
 	.pd_review .area_rv_average .average {margin-bottom:50px;}
-	.pd_review .area_rv_average .average .part_average {float:left; width:255px; width:calc((100% - 180px)/4); margin-left:60px; color:#666; font-size:14px;}
+	.pd_review .area_rv_average .average .part_average {float:left; width:calc((100% - 180px)/4); margin-left:60px; color:#666; font-size:14px;}
 	.pd_review .area_rv_average .average .part_average:first-of-type {margin-left:0px}
 	.pd_review .area_rv_average .average .part_average:first-of-type {margin-left:0px}
-	.pd_review .area_rv_average .average .part_average .tit {display:block; margin-bottom:25px; color:#222; font-weight:300;}
-	.pd_review .area_rv_average .average .part_average dl > div {margin-top:15px;}
+	.pd_review .area_rv_average .average .part_average .tit {display:block; margin-bottom:20px; color:#222; font-weight:300;}
+	.pd_review .area_rv_average .average .part_average dl > div {margin-top:15px; width:100%;}
 	.pd_review .area_rv_average .average .part_average dl > div:first-child {margin-top:0;}
 	.pd_review .area_rv_average .average .part_average dl dt {float:left; width:60px;}
 	.pd_review .area_rv_average .average .part_average dl dd {float:left; width:calc(100% - 60px);}
 	.pd_review .area_rv_average .average .part_average dl dd::after {content:''; clear:both; display:block;}
 	.pd_review .area_rv_average .average .part_average dl dd span {float:left; display:inline-block;}
-	.pd_review .area_rv_average .average .part_average dl dd .ratio {width:145px; height:8px; margin-top:3px; background:#f5f5f5; overflow:hidden;}
+	.pd_review .area_rv_average .average .part_average dl dd .ratio {width:calc(100% - 40px); height:8px; margin-top:3px; background:#f5f5f5; overflow:hidden;}
 	.pd_review .area_rv_average .average .part_average dl dd .ratio .progbar {display:inline-block; position:relative; height:8px; background:#ddd; vertical-align:top; margin-left:0}
 	.pd_review .area_rv_average .average .part_average dl dd .ratio .progbar::after {content:''; position:absolute; right:-8px; top:0; width:0; height:0; border:4px solid #ddd; border-bottom-color:transparent;border-right-color:transparent;}
-	.pd_review .area_rv_average .average .part_average dl dd .percent {margin-left:15px}
+	.pd_review .area_rv_average .average .part_average dl dd .percent {width:40px; text-align:right;}
 	.pd_review .area_rv_average .average .part_average dl div.on dt,
 	.pd_review .area_rv_average .average .part_average dl div.on dd {color:#222; font-weight:300;}
 	.pd_review .area_rv_average .average .part_average dl div.on dd .ratio .progbar {background:#222;}
@@ -4103,10 +4246,11 @@ ul.maintabs li [class^='box_depth'] {display:none; position:absolute; left:100%;
 
 	.pd_review .area_rv_photo {}
 	.pd_review .area_rv_photo .photo_list {position:relative;}
-	.pd_review .area_rv_photo .photo_list ul li {float:left; position:relative; width:162px; height:162px; margin-left:11px}
+	.pd_review .area_rv_photo .photo_list ul li {float:left; position:relative; /*width:162px; height:162px;*/ width:calc((100% - 66px)/7); margin-left:11px; }
 	.pd_review .area_rv_photo .photo_list ul li:first-child {margin-left:0;}
-	.pd_review .area_rv_photo .photo_list button {position:absolute; right:0; top:0; width:162px; height:162px; padding-top:60px; background:rgba(0,0,0,0.6); color:#fff; font-size:14px; z-index:1; text-align:center; box-sizing:border-box; z-index:2;}
-	.pd_review .area_rv_photo .photo_list button::after {content:''; position:absolute; top:45px; left:50%; transform:translateX(-50%); width:40px; height:40px; background:url('/images/pc/ico_plus_white.png') no-repeat 50% 50%; z-index:1;}
+	.pd_review .area_rv_photo .photo_list button {position:absolute; right:0; top:0; width:calc((100% - 66px)/7); padding-top:calc((100% - 66px)/7); background:rgba(0,0,0,0.6); color:#fff; font-size:14px; z-index:1; text-align:center; box-sizing:border-box; z-index:2;}
+	.pd_review .area_rv_photo .photo_list button::after {content:''; position:absolute; left:50%; top:50%; transform:translate(-50%,-50%); margin-top:-15px; width:24%; height:24%; background:url('/images/pc/ico_plus_white.png') no-repeat 50% 50%; background-size:100% auto; z-index:1;}
+	.pd_review .area_rv_photo .photo_list button span {position:absolute; left:50%; top:50%; transform:translate(-50%,-50%); margin-top:25px; font-weight:200;}
 
 	.pd_review .area_rv_all {margin-top:100px}
 	.pd_review .area_rv_all h6 span {display:inline-block; margin-left:5px; color:#666; font-weight:200;}
@@ -4115,9 +4259,9 @@ ul.maintabs li [class^='box_depth'] {display:none; position:absolute; left:100%;
 	.pd_review .area_rv_all .selection .select_custom:first-child {margin-left:0;}
 	.pd_review .area_rv_all .selection .select_custom .combo .select {height:42px; padding:15px 20px; color:#666; font-size:14px;}
 	.pd_review .area_rv_all .selection .select_custom .combo .list {top:42px; max-height:250px; overflow-y:auto;}
-	.pd_review .area_rv_all .selection .select_custom .combo .list::-webkit-scrollbar {width:2px;}
+	/*.pd_review .area_rv_all .selection .select_custom .combo .list::-webkit-scrollbar {width:2px;}
 	.pd_review .area_rv_all .selection .select_custom .combo .list::-webkit-scrollbar-thumb {background-color:#222; border-radius:0px; background-clip:padding-box; border:none;}
-	.pd_review .area_rv_all .selection .select_custom .combo .list::-webkit-scrollbar-track {background-color:#ddd; border-radius:0px; box-shadow:none;}
+	.pd_review .area_rv_all .selection .select_custom .combo .list::-webkit-scrollbar-track {background-color:#ddd; border-radius:0px; box-shadow:none;}*/
 	.pd_review .area_rv_all .selection .select_custom .combo .list li {padding:0 20px; color:#666; font-size:14px; line-height:40px;}
 	.pd_review .area_rv_all .selection .select_custom .star_score {display:inline-block; width:100%;}
 	.pd_review .area_rv_all .selection .select_custom .star_score .score {float:left; font-size:14px; color:#666;}
@@ -4131,7 +4275,7 @@ ul.maintabs li [class^='box_depth'] {display:none; position:absolute; left:100%;
 	.pd_review .area_rv_all .review_list > ul > li .review {}
 	.pd_review .area_rv_all .review_list .review .info_box {}
 	.pd_review .area_rv_all .review_list .review .info_box .star_score {float:left}
-	.pd_review .area_rv_all .review_list .review .info_box .star_score .star {display:inline-block; position:relative; width:101px; height:16px; background:#f5f5f5;}
+	.pd_review .area_rv_all .review_list .review .info_box .star_score .star {display:inline-block; position:relative; width:101px; height:16px; background:#f5f5f5; z-index:1;}
 	.pd_review .area_rv_all .review_list .review .info_box .star_score .star::after {content:''; position:absolute; left:0; top:0; z-index:3; width:100%; height:100%; background:url('/images/pc/star_empty_big.png') no-repeat 0 0; background-size:100% 100%; image-rendering:pixelated;}
 	.pd_review .area_rv_all .review_list .review .info_box .star_score .star .progbar {display:inline-block; height:100%; background:#fd4802}
 	.pd_review .area_rv_all .review_list .review .info_box .writer {float:right;}
@@ -4162,6 +4306,17 @@ ul.maintabs li [class^='box_depth'] {display:none; position:absolute; left:100%;
 	.pd_review .area_rv_all .review_list .review .reply_box .reply .reply_txt {margin-top:20px; color:#666; font-size:14px; line-height:24px;}
 	.pd_review .area_rv_all .nodata {padding-top:120px; border-top:1px solid #ddd; text-align:center;}
 	.pd_review .area_rv_all .ui_row .pageNav {margin-top:50px}
+	@media screen and (max-width:1459px) {
+		.pd_review .area_rv_best .best_review a {height:166px;}
+		.pd_review .area_rv_best .best_review a .pic {width:104px; height:104px;}
+		.pd_review .area_rv_best .best_review a .txt_best_review p {height:72px; -webkit-line-clamp:3;}
+		.pd_review .area_rv_average .average .part_average {width:calc((100% - 90px)/4); margin-left:30px;}
+		.pd_review .area_rv_average .info_review dl {float:left; padding-left:60px; margin-top:15px}
+		.pd_review .area_rv_average .info_review p i.ico_point {margin-top:15px;}
+		.pd_review .area_rv_all .selection {position:relative; top:0; width:100%; margin-bottom:20px;}
+	}
+
+
 
 	/* pd_popup > 배송교환반품 안내 */
 	.pd_pop.full_pop.pd_delivery_pop {}
@@ -4388,14 +4543,14 @@ ul.maintabs li [class^='box_depth'] {display:none; position:absolute; left:100%;
 	.modal.br_pop.lookbook_item_pop .itemsGrp .item_prod .itemName {margin:0px 0px 25px; font-size: 18px; font-weight: 300; line-height: 28px; height:56px;}
 	.modal.br_pop.lookbook_item_pop .itemsGrp .item_prod .itemPrice {font-size: 26px; line-height: 1; font-weight: 500; margin:0;}
 	.modal.br_pop.lookbook_item_pop .itemsGrp .item_prod .itemPrice_original {display: inline-block; margin-left:0; margin-bottom:10px; font-size: 20px; font-weight: 200;}
-	.modal.br_pop.lookbook_item_pop .itemsGrp .item_prod .itemPercent {font-size: 26px; line-height: 0.8;}
+	.modal.br_pop.lookbook_item_pop .itemsGrp .item_prod .itemPercent {position:relative; font-size: 26px; line-height: 0.8;}
 	.modal.br_pop.lookbook_item_pop .itemsGrp .item_prod .itemLink .btn {margin-top:40px; border:1px solid #a7a7a7; font-weight:300;}
 
 
 
 
 	/* my */
-	.container.my .wrap .content {margin-bottom:160px;}
+	.container.my .wrap .content {max-width:1460px; margin-bottom:160px;}
 	.my div:after,
 	.my ul::after {content:''; clear:both; display:block;}
 	.my button span {line-height:1;}
@@ -5017,7 +5172,9 @@ ul.maintabs li [class^='box_depth'] {display:none; position:absolute; left:100%;
 	.ev .cmt_wrap .cmt_group .cmt_list li .cmt_cont .btn_del {display: block; background:transparent url(/images/pc/ico_trash.png) no-repeat left 14px center; padding:7px 14px; padding-left: 33px; margin-top: 20px; font-size: 14px; color: #222; font-weight: 200;}
 	.ev .cmt_wrap .cmt_group .cmt_list li .cmt_cont .btn_del:hover {background:transparent url(/images/pc/ico_trash.png) no-repeat left 14px center;}
 	.ev .cmt_wrap .pageNav > li {display: inline-block; vertical-align: top;}
-	.ev .cmt_wrap .pageNav > li > a, .ev .cmt_wrap .pageNav > li > span, .pageNav > .disabled > a {background: transparent; height: 34px;}
+	.ev .cmt_wrap .pageNav > li > a, 
+	.ev .cmt_wrap .pageNav > li > span, 
+	.ev .cmt_wrap .pageNav > .disabled > a {background: transparent; height: 34px;}
 	.ev .cmt_wrap .pageNav .prev a, .ev .cmt_wrap .pageNav > li:first-child a {background:url('/images/pc/ico_paging.png') no-repeat 0 11px; width: 8px; text-indent: -999em;}
 	.ev .cmt_wrap .pageNav .prev a {background-position: -23px 11px;}
 	.ev .cmt_wrap .pageNav .next a, .ev .cmt_wrap .pageNav > li:last-child a {background: url('/images/pc/ico_paging.png') no-repeat -64px 11px; width: 8px;}
@@ -5051,12 +5208,14 @@ ul.maintabs li [class^='box_depth'] {display:none; position:absolute; left:100%;
 	.ev .other_ev_slide .tit {position: relative; margin-bottom: 60px; text-align: center;}
 	.ev .other_ev_slide .tit h4 {font-size: 30px; font-weight: 500;}
 	.ev .other_ev_slide .tit a {position: absolute; top: 50%; right: 0; transform:translateY(-50%); padding-right: 20px; background: url(/images/pc/ico_more_lg.png) no-repeat right top 1px; font-size: 18px; color:#888;}
+	.ev .other_ev_slide .cont_body {position:relative;}
 	.ev .other_ev_slide .swiper-slide img {width: 100%; height:auto;}
 	.ev .other_ev_slide .swiper-slide .txt {}
 	.ev .other_ev_slide .swiper-slide .txt .subject {margin:20px 0 0; padding:0 7px; font-size: 18px; line-height: 1.5; font-weight: 300; color:#222; min-height:55px; max-height:55px; overflow: hidden; text-overflow: ellipsis; -webkit-line-clamp: 2; -webkit-box-orient: vertical; display: -webkit-box; word-break: keep-all;}
-	.ev .other_ev_slide .swiper-button-next:after, .ev .other_ev_slide .swiper-button-prev:after {content:'';}
-	.ev .other_ev_slide .swiper-button-next {background: url(/images/pc/slide_next.png) no-repeat center; right: 70px; opacity: 0.6; margin-top: -10px;}
-	.ev .other_ev_slide .swiper-button-prev {background: url(/images/pc/slide_prev.png) no-repeat center; left: 70px; opacity: 0.6; margin-top: -10px;}
+	.ev .other_ev_slide .swiper-button-next:after, 
+	.ev .other_ev_slide .swiper-button-prev:after {content:'';}
+	.ev .other_ev_slide .swiper-button-next {background: url('/images/pc/slide_next.png') no-repeat center; right:-70px; opacity:0.6;}
+	.ev .other_ev_slide .swiper-button-prev {background: url('/images/pc/slide_prev.png') no-repeat center; left:-70px; opacity:0.6;}
 
 
 

+ 10 - 7
src/main/webapp/ux/pc/css/main.css

@@ -76,7 +76,7 @@
 
 .main .post-visual .swiper-slide::before{display:none;}
 
-.main_visual::after {content:'';display:block;width:100%;height:110px;height:72px; position:absolute;top:0;left:0;background:#222222;z-index:-1;}
+.main_visual::before {content:'';display:block;width:100%; /*height:72px;*/ height:172px; position:absolute; top:-100px; left:0; background:#222222; z-index:-1;}
 .post-visual .btn {font-weight:300; border:1px solid #a7a7a7;}
 .post-visual .txtWrap{position:absolute; top:auto;bottom:100px;left:90px;right:auto;z-index:1;} 
 .post-visual .txtWrap dl,
@@ -362,11 +362,12 @@
 
 /* main_2stage */
 .main .wrap .content.main_2stage {}
-.main_2stage .cont_body{}
-.main_2stage a {border:0px;}
-.main_2stage img {width:100%; height:auto; /* object-fit:none; */}
-.main_2stage .ui_row {margin-bottom:0;}
-.main_2stage .ui_col_6 {margin-right:0 !important; margin-left:0 !important;}
+.main_2stage .cont_body {}
+.bnnbox_crop {width:100%;}
+.bnnbox_crop::after {content:''; clear:both; display:block;}
+.bnnbox_crop > .bnn_half {float:left; width:50%;}
+.bnnbox_crop > .bnn_half > a {display:block; position:relative; width:100%; height:0%; padding-top:26.0918%; overflow:hidden;}
+.bnnbox_crop > .bnn_half > a img {position:absolute; left:50%; right:0; top:50%; bottom:auto; transform:translate(-50%, -50%); width:auto; height:100%;}
 @media screen and (max-width:1460px) {
 	
 }
@@ -544,6 +545,8 @@
 
 
 /* brand_main */
+header .common_header.br_header::after {content:''; display:block; width:100%; height:585px; position:absolute; bottom:-485px; left:0; background:inherit; z-index:-1;}
+header.minify .common_header.br_header::after {bottom:-565px;}
 .container.brand_main .wrap {position:relative; width:100%; min-width:auto; max-width:auto; padding-left:0px; padding-right:0px;}
 .brand_main .dpnone {display:none;}
 .brand_main .swiper-pagination {margin:0; position:relative;}
@@ -552,7 +555,7 @@
 .brand_main .wrap .content.wide:first-child{/*background:#222222;*/ padding:0px !important;}
 .brand_main .wrap .content .cont_head {color:#222222; font-size:40px; line-height:1; letter-spacing:-.025em;}
 .brand_main .wrap .content .cont_body {position:relative;}
-.brand_main .main_visual::after {content:'';display:block;width:100%; height:485px; position:absolute;top:0;left:0;background:#436564 ;z-index:-1;}
+.brand_main .main_visual::before {display:none;}
 
 .brand_main .swiper-button-next,
 .brand_main .swiper-button-prev {top:50%; transform:translateY(-50%); color:transparent;}