Forráskód Böngészése

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

xodud1202 5 éve
szülő
commit
3760baa3dd
77 módosított fájl, 6892 hozzáadás és 1871 törlés
  1. 14 3
      src/main/java/com/style24/front/biz/dao/TsfCouponDao.java
  2. 29 0
      src/main/java/com/style24/front/biz/dao/TsfCustomerDao.java
  3. 83 0
      src/main/java/com/style24/front/biz/dao/TsfDisplayDao.java
  4. 29 0
      src/main/java/com/style24/front/biz/dao/TsfGiftcardDao.java
  5. 23 1
      src/main/java/com/style24/front/biz/dao/TsfGoodsDao.java
  6. 12 0
      src/main/java/com/style24/front/biz/dao/TsfOrderDao.java
  7. 24 1
      src/main/java/com/style24/front/biz/dao/TsfSocialDao.java
  8. 134 28
      src/main/java/com/style24/front/biz/service/TsfCouponService.java
  9. 128 48
      src/main/java/com/style24/front/biz/service/TsfCustomerService.java
  10. 142 3
      src/main/java/com/style24/front/biz/service/TsfDisplayService.java
  11. 50 0
      src/main/java/com/style24/front/biz/service/TsfGiftcardService.java
  12. 78 6
      src/main/java/com/style24/front/biz/service/TsfGoodsService.java
  13. 4 8
      src/main/java/com/style24/front/biz/service/TsfOrderChangeService.java
  14. 15 3
      src/main/java/com/style24/front/biz/service/TsfOrderService.java
  15. 53 0
      src/main/java/com/style24/front/biz/service/TsfSocialService.java
  16. 96 8
      src/main/java/com/style24/front/biz/web/TsfCustomerController.java
  17. 54 7
      src/main/java/com/style24/front/biz/web/TsfDisplayController.java
  18. 166 44
      src/main/java/com/style24/front/biz/web/TsfGoodsController.java
  19. 61 3
      src/main/java/com/style24/front/biz/web/TsfMypageController.java
  20. 69 177
      src/main/java/com/style24/front/biz/web/TsfOrderController.java
  21. 54 0
      src/main/java/com/style24/front/biz/web/TsfSocialController.java
  22. 30 0
      src/main/java/com/style24/front/support/env/TsfConstants.java
  23. 22 0
      src/main/java/com/style24/front/support/exception/TsfNonCertificationAccountException.java
  24. 16 2
      src/main/java/com/style24/front/support/security/TsfAuthenticationProvider.java
  25. 3 0
      src/main/java/com/style24/front/support/security/handler/TsfLoginFailureHandler.java
  26. 16 1
      src/main/java/com/style24/front/support/security/handler/TsfLoginSuccessHandler.java
  27. 26 0
      src/main/java/com/style24/persistence/domain/BrandGroup.java
  28. 37 0
      src/main/java/com/style24/persistence/domain/Cate1.java
  29. 34 0
      src/main/java/com/style24/persistence/domain/Cate2.java
  30. 35 0
      src/main/java/com/style24/persistence/domain/Cate3.java
  31. 36 0
      src/main/java/com/style24/persistence/domain/Cate4.java
  32. 4 0
      src/main/java/com/style24/persistence/domain/Cate4Srch.java
  33. 33 0
      src/main/java/com/style24/persistence/domain/Cate5.java
  34. 60 0
      src/main/java/com/style24/persistence/domain/Contents.java
  35. 35 0
      src/main/java/com/style24/persistence/domain/GnbTab.java
  36. 5 1
      src/main/java/com/style24/persistence/domain/Goods.java
  37. 4 1
      src/main/java/com/style24/persistence/domain/Login.java
  38. 36 0
      src/main/java/com/style24/persistence/domain/Measurement.java
  39. 29 0
      src/main/java/com/style24/persistence/domain/SizeInfo.java
  40. 9 1
      src/main/java/com/style24/persistence/domain/Social.java
  41. 4 0
      src/main/java/com/style24/persistence/domain/WishList.java
  42. 241 0
      src/main/java/com/style24/persistence/mybatis/shop/TsfCoupon.xml
  43. 78 27
      src/main/java/com/style24/persistence/mybatis/shop/TsfCustomer.xml
  44. 369 0
      src/main/java/com/style24/persistence/mybatis/shop/TsfDisplay.xml
  45. 73 0
      src/main/java/com/style24/persistence/mybatis/shop/TsfGiftcard.xml
  46. 47 5
      src/main/java/com/style24/persistence/mybatis/shop/TsfGoods.xml
  47. 21 17
      src/main/java/com/style24/persistence/mybatis/shop/TsfLogin.xml
  48. 10 0
      src/main/java/com/style24/persistence/mybatis/shop/TsfOrder.xml
  49. 74 0
      src/main/java/com/style24/persistence/mybatis/shop/TsfSocial.xml
  50. 2 1
      src/main/resources/config/application-locd.yml
  51. 1 1
      src/main/resources/config/application-tsit.yml
  52. 2 0
      src/main/resources/i18n/messages/message_ko_KR.properties
  53. 9 1
      src/main/webapp/WEB-INF/views/web/SigninFormWeb.html
  54. 260 75
      src/main/webapp/WEB-INF/views/web/common/fragments/GnbWeb.html
  55. 470 0
      src/main/webapp/WEB-INF/views/web/common/fragments/GnbWeb2.html
  56. 1 1
      src/main/webapp/WEB-INF/views/web/common/layout/MypageLayoutWeb.html
  57. 80 0
      src/main/webapp/WEB-INF/views/web/customer/CertificationFormWeb.html
  58. 5 1
      src/main/webapp/WEB-INF/views/web/customer/DormantCertifyFormWeb.html
  59. 80 0
      src/main/webapp/WEB-INF/views/web/customer/PasswordCampaignFormWeb.html
  60. 10 3
      src/main/webapp/WEB-INF/views/web/customer/PasswordChangeFormWeb.html
  61. 145 29
      src/main/webapp/WEB-INF/views/web/goods/GoodsCouponFormWeb.html
  62. 80 42
      src/main/webapp/WEB-INF/views/web/goods/GoodsDetailFormWeb.html
  63. 40 3
      src/main/webapp/WEB-INF/views/web/goods/GoodsInstockAlarmFormWeb.html
  64. 8 5
      src/main/webapp/WEB-INF/views/web/goods/GoodsShopBenefitFormWeb.html
  65. 55 874
      src/main/webapp/WEB-INF/views/web/goods/GoodsSizeInfoFormWeb.html
  66. 243 0
      src/main/webapp/WEB-INF/views/web/mypage/MypageGiftcardFormWeb.html
  67. 78 56
      src/main/webapp/WEB-INF/views/web/mypage/MypageReturnFormWeb.html
  68. 2032 0
      src/main/webapp/WEB-INF/views/web/order/OrderCompleteWeb.html
  69. 53 281
      src/main/webapp/WEB-INF/views/web/order/OrderFormWeb.html
  70. 18 2
      src/main/webapp/WEB-INF/views/web/order/OrderFreegiftInfoWeb.html
  71. 31 0
      src/main/webapp/WEB-INF/views/web/order/test.html
  72. 119 0
      src/main/webapp/WEB-INF/views/web/social/SocialMainFormWeb.html
  73. BIN
      src/main/webapp/images/pc/thumb/hotdeal_bg.png
  74. 302 93
      src/main/webapp/ux/pc/css/layout.css
  75. 44 6
      src/main/webapp/ux/pc/js/common-ui.js
  76. 0 0
      src/main/webapp/ux/pc/js/mypage.js
  77. 19 2
      src/main/webapp/ux/style24_link.js

+ 14 - 3
src/main/java/com/style24/front/biz/dao/TsfCouponDao.java

@@ -3,8 +3,8 @@ package com.style24.front.biz.dao;
 import java.util.Collection;
 
 import com.style24.core.support.annotation.ShopDs;
-import com.style24.persistence.domain.Cart;
 import com.style24.persistence.domain.Coupon;
+import com.style24.persistence.domain.Goods;
 
 /**
  * 쿠폰 Dao
@@ -41,7 +41,6 @@ public interface TsfCouponDao {
 	 */
 	Collection<Coupon> getCustGradeCouponInfo(Coupon coupon);
 
-
 	/**
 	 * 회원가입 쿠폰
 	 * @param coupon - 쿠폰정보
@@ -50,5 +49,17 @@ public interface TsfCouponDao {
 	 * @since 2021. 03. 03
 	 */
 	Coupon getJoinCoupon(Coupon coupon);
-
+	
+	/**
+	 * 상품 쿠폰 조회
+	 * 
+	 * @param goods
+	 * @return Collection<Coupon>
+	 * @author eskim
+	 * @since 2021.03.11
+	 */
+	Collection<Coupon> getGoodsCouponList(Goods goods);
+	
+	
+	
 }

+ 29 - 0
src/main/java/com/style24/front/biz/dao/TsfCustomerDao.java

@@ -95,4 +95,33 @@ public interface TsfCustomerDao {
 	 * @since 2021. 03. 08
 	 */
 	void deleteWishList(WishList wishList);
+	
+	/**
+	 * 위시리스트 삭제 상품 조회
+	 *
+	 * @param custNo
+	 * @author eskim
+	 * @since 2021. 03. 11
+	 */
+	String  getDeleteGoodsWish(int custNo);
+
+	/**
+	 * 본인인증 처리
+	 *
+	 * @param customer - 고객번호, ci
+	 * @return int - 업데이트 카운트
+	 * @author jsshin
+	 * @since 2021. 03. 11
+	 */
+	int updateCustomerCi(Customer customer);
+
+	/**
+	 * 비밀번호 변경 날짜 업데이트
+	 *
+	 * @param customer - 고객번호
+	 * @return int - 업데이트 카운트
+	 * @author jsshin
+	 * @since 2021. 03. 11
+	 */
+	int updatePasswordDate(Customer customer);
 }

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

@@ -1,6 +1,17 @@
 package com.style24.front.biz.dao;
 
+import java.util.Collection;
+
 import com.style24.core.support.annotation.ShopDs;
+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;
 
 /**
  * 전시 Dao
@@ -11,4 +22,76 @@ import com.style24.core.support.annotation.ShopDs;
 @ShopDs
 public interface TsfDisplayDao {
 
+	/**
+	 * GNB 브랜드그룹 목록
+	 * @param contents - 컨텐츠 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 3. 11
+	 */
+	Collection<BrandGroup> getGnbBrandGroupList(Contents contents);
+
+	/**
+	 * GNB탭 목록
+	 * @param gnbTab - GNB탭 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 3. 11
+	 */
+	Collection<GnbTab> getGnbTabList(GnbTab gnbTab);
+
+	/**
+	 * 컨텐츠 목록
+	 * @param contents - 컨텐츠 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 3. 11
+	 */
+	Collection<Contents> getContentsList(Contents contents);
+
+	/**
+	 * 카테고리1 목록
+	 * @param cate - 카테고리 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 3. 11
+	 */
+	Collection<Cate1> getCategory1List(Cate4Srch cate);
+
+	/**
+	 * 카테고리2 목록
+	 * @param cate - 카테고리 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 3. 11
+	 */
+	Collection<Cate2> getCategory2List(Cate4Srch cate);
+
+	/**
+	 * 카테고리3 목록
+	 * @param cate - 카테고리 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 3. 11
+	 */
+	Collection<Cate3> getCategory3List(Cate4Srch cate);
+
+	/**
+	 * 카테고리4 목록
+	 * @param cate - 카테고리 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 3. 11
+	 */
+	Collection<Cate4> getCategory4List(Cate4Srch cate);
+
+	/**
+	 * 카테고리5 목록
+	 * @param cate - 카테고리 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 3. 11
+	 */
+	Collection<Cate5> getCategory5List(Cate4Srch cate);
+
 }

+ 29 - 0
src/main/java/com/style24/front/biz/dao/TsfGiftcardDao.java

@@ -1,6 +1,9 @@
 package com.style24.front.biz.dao;
 
+import java.util.Collection;
+
 import com.style24.core.support.annotation.ShopDs;
+import com.style24.persistence.domain.GiftCard;
 
 /**
  * 상품권 Dao
@@ -11,4 +14,30 @@ import com.style24.core.support.annotation.ShopDs;
 @ShopDs
 public interface TsfGiftcardDao {
 
+	/**
+	 * 상품권정보 조회
+	 *
+	 * @param GiftCard
+	 * @author sowon
+	 * @since 2021. 3. 12
+	 */	
+	GiftCard getGiftcardInfo(GiftCard giftcard);
+	
+	/**
+	 * 상품권 사용 정보 조회
+	 *
+	 * @param GiftCard
+	 * @author sowon
+	 * @since 2021. 3. 12
+	 */	
+	Collection<GiftCard> getGiftcardUseList(GiftCard giftcard);
+	
+	/**
+	 * 상품권 보유 정보 조회
+	 *
+	 * @param GiftCard
+	 * @author sowon
+	 * @since 2021. 3. 12
+	 */	
+	Collection<GiftCard> getGiftcardOwnList(GiftCard giftcard);
 }

+ 23 - 1
src/main/java/com/style24/front/biz/dao/TsfGoodsDao.java

@@ -14,8 +14,10 @@ import com.style24.persistence.domain.GoodsNotiInfo;
 import com.style24.persistence.domain.GoodsSafeNo;
 import com.style24.persistence.domain.GoodsStock;
 import com.style24.persistence.domain.GoodsViewHst;
+import com.style24.persistence.domain.Measurement;
 import com.style24.persistence.domain.Notice;
 import com.style24.persistence.domain.ReinboundInform;
+import com.style24.persistence.domain.SizeInfo;
 import com.style24.persistence.domain.VideoDisploc;
 
 /**
@@ -253,5 +255,25 @@ public interface TsfGoodsDao {
 	 * @date 2021. 3. 10
 	 */
 	void updateReinboundInform(ReinboundInform reinboundInform);
-
+	
+	/**
+	 * 실측사이즈 조회
+	 *
+	 * @param goods
+	 * @return
+	 * @author eskim
+	 * @date 2021. 3. 10
+	 */
+	Collection<Measurement> getMeasurementList(Goods goods);
+	
+	/**
+	 * 사이즈 정보 조회
+	 *
+	 * @param sizeInfo
+	 * @return
+	 * @author eskim
+	 * @date 2021. 3. 11
+	 */
+	Collection<SizeInfo> getSizeInfoList(SizeInfo sizeInfo);
+	
 }

+ 12 - 0
src/main/java/com/style24/front/biz/dao/TsfOrderDao.java

@@ -3,6 +3,7 @@ package com.style24.front.biz.dao;
 import java.util.Collection;
 
 import com.style24.core.support.annotation.ShopDs;
+import com.style24.persistence.domain.Coupon;
 import com.style24.persistence.domain.Order;
 import com.style24.persistence.domain.Payment;
 
@@ -86,4 +87,15 @@ public interface TsfOrderDao {
 	int updateOrderDisplayYn(Order order);
 
 	int updatePaymentForOrderFinished(Payment param);
+	
+	/**
+	 * 고객 특정기간 첫구매 여부
+	 * 
+	 * @param coupon
+	 * @return int
+	 * @author eskim
+	 * @since 2021.03.12
+	 */
+	int getCustFirstOrderCount(Coupon coupon);
+	
 }

+ 24 - 1
src/main/java/com/style24/front/biz/dao/TsfSocialDao.java

@@ -1,6 +1,9 @@
 package com.style24.front.biz.dao;
 
+import java.util.Collection;
+
 import com.style24.core.support.annotation.ShopDs;
+import com.style24.persistence.domain.Social;
 
 /**
  * 소셜관리(핫딜) Dao
@@ -10,5 +13,25 @@ import com.style24.core.support.annotation.ShopDs;
  */
 @ShopDs
 public interface TsfSocialDao {
-
+	/**
+	 * 소셜(핫딜) 정보
+	 *
+	 * @param 
+	 * @return
+	 * @author sowon
+	 * @date 2021. 3. 11
+	 */
+	Social getSocialInfo(Social social);
+	
+	/**
+	 * 소셜(핫딜) 상품 목록
+	 *
+	 * @param 
+	 * @return
+	 * @author sowon
+	 * @date 2021. 3. 11
+	 */
+	Collection<Social> getSocialGoodsList(Social social);
+	
+	
 }

+ 134 - 28
src/main/java/com/style24/front/biz/service/TsfCouponService.java

@@ -7,15 +7,15 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.thymeleaf.util.StringUtils;
 
-import com.gagaframework.web.parameter.GagaMap;
 import com.style24.core.biz.dao.TscCouponDao;
-import com.style24.core.biz.service.TscCouponService;
 import com.style24.core.biz.service.TscOrderService;
 import com.style24.core.support.env.TscConstants;
 import com.style24.front.biz.dao.TsfCouponDao;
 import com.style24.front.support.security.session.TsfSession;
 import com.style24.persistence.domain.Coupon;
 import com.style24.persistence.domain.CustCoupon;
+import com.style24.persistence.domain.Customer;
+import com.style24.persistence.domain.Goods;
 import com.style24.persistence.domain.Login;
 import com.style24.persistence.domain.Order;
 
@@ -40,6 +40,12 @@ public class TsfCouponService {
 	@Autowired
 	private TscOrderService coreOrderService;
 
+	@Autowired
+	private TsfOrderService orderService;
+
+	@Autowired
+	private TsfCustomerService customerService;
+
 	/**
 	 * 시리얼 쿠폰 지급 정보 조회
 	 * @param param
@@ -59,9 +65,9 @@ public class TsfCouponService {
 	 * @since 2021. 02. 16
 	 */
 	public Coupon serialCpnApplyInfo(Coupon param) {
-		
+
 		// TODO 로그인 정보 입력
-		if(TsfSession.isLogin()) {
+		if (TsfSession.isLogin()) {
 			Login login = TsfSession.getInfo();
 			param.setCustNo(login.getCustNo());
 			param.setRegNo(login.getCustNo());
@@ -74,18 +80,18 @@ public class TsfCouponService {
 		Coupon cpn = couponDao.getSearchSerialCpnInfo(param);
 
 		// 다운로드 받을 수 있는 쿠폰이 있으면
-		if(cpn != null && cpn.getCpnId() > 0) {
+		if (cpn != null && cpn.getCpnId() > 0) {
 			// 다운 받을 수 있는 쿠폰ID를 내가 받은 이력이 있는지 확인
 			cpn.setCustNo(param.getCustNo());
 			Coupon myCpn = couponDao.getSerialCpnUseInfo(cpn);
 
 			// 다운로드 받은 쿠폰이 있는 경우
-			if(myCpn != null && myCpn.getCpnId() > 0) {
+			if (myCpn != null && myCpn.getCpnId() > 0) {
 				// 이미 다운 받았고, 사용 한 쿠폰이 있을 경우 종료
-				if(!StringUtils.isEmpty(myCpn.getUsedDt())) {
+				if (!StringUtils.isEmpty(myCpn.getUsedDt())) {
 					cpn.setResult("해당 쿠폰은 이미 사용하신 쿠폰입니다.");
 					return cpn;
-				} else if("N".equals(myCpn.getAvailYn())) {
+				} else if ("N".equals(myCpn.getAvailYn())) {
 					cpn.setResult("지급 받으신 쿠폰의 유효기간이 아닙니다.");
 					return cpn;
 				}
@@ -109,13 +115,12 @@ public class TsfCouponService {
 
 		// 2021.03.03 장바구니 시퀀스 없음 jsh77b 
 		// 장바구니쿠폰 토탈 할인 금액 계산
-		if (param.getCartSqArr() != null ) {
+		if (param.getCartSqArr() != null) {
 			param.setCpnId(cpn.getCpnId());
 			cpn.setDcAmt(getCartCpnApplyTotalAmt(param));
 		} else {
 			Order order = new Order();
-			
-			
+
 			/*
 			// 3. 할인구간정보조회
 			// 3.2 상품쿠폰, 장바구니쿠폰 목록 조회
@@ -130,15 +135,9 @@ public class TsfCouponService {
 			// 3.2.2 장바구니쿠폰기준 ---> 상품목록
 			cartCpnList = coreOrderService.getCartCpnApplyList(tmtbGoodsApplyList, cartCpnList);
 			*/
-			
-			
-			
-			
-			
+
 		}
-		
-		
-		
+
 		cpn.setResult("SUCCESS");
 
 		return cpn;
@@ -158,11 +157,11 @@ public class TsfCouponService {
 		int totCurrPrice = 0;
 		int maxDcAmt = 0;
 		int buyLimitAmt = 0;
-		if(param != null && param.getCartSqArr().length > 0) {
+		if (param != null && param.getCartSqArr().length > 0) {
 			Collection<Order> serialGoodsList = coreOrderService.getSerialCpnApplyGoodsList(order);
 			for (int i = 0; i < param.getCartSqArr().length; i++) {
 				for (Order cpnInfo : serialGoodsList) {
-					if("A".equals(cpnInfo.getApplyScope()) || param.getCartSqArr()[i] == cpnInfo.getCartSq()) {
+					if ("A".equals(cpnInfo.getApplyScope()) || param.getCartSqArr()[i] == cpnInfo.getCartSq()) {
 						cpnInfo.setCurrPrice(param.getCurrPrices()[i]);
 					}
 				}
@@ -181,7 +180,7 @@ public class TsfCouponService {
 				}
 			}
 
-			if(totCurrPrice < totDcAmt) {
+			if (totCurrPrice < totDcAmt) {
 				totDcAmt = totCurrPrice;
 			}
 
@@ -230,10 +229,10 @@ public class TsfCouponService {
 	@Transactional("shopTxnManager")
 	public int createCustGradeAllCoupon(Coupon coupon) {
 		int count = 0;
-		
+
 		Collection<Coupon> couponList = couponDao.getCustGradeCouponInfo(coupon);
-		
-		for(Coupon tmpCoupon : couponList) {
+
+		for (Coupon tmpCoupon : couponList) {
 			int downloadCnt = tmpCoupon.getDownloadCnt();
 			for (int i = 0; i < downloadCnt; i++) {
 				CustCoupon custCoupon = new CustCoupon();
@@ -242,7 +241,7 @@ public class TsfCouponService {
 				custCoupon.setAvailStdt(tmpCoupon.getAvailStdt());
 				custCoupon.setAvailEddt(tmpCoupon.getAvailEddt());
 				custCoupon.setPubReason(TscConstants.PubReason.DOWNLOAD.value());
-				custCoupon.setEndAlimSendYn(tmpCoupon.getEndAlimYn());
+				custCoupon.setEndAlimSendYn("N");		// 알림 발송 여부(발송되면 Y)
 				custCoupon.setRegNo(tmpCoupon.getCustNo());
 				custCoupon.setUpdNo(tmpCoupon.getCustNo());
 
@@ -251,7 +250,7 @@ public class TsfCouponService {
 				count++;
 			}
 		}
-		
+
 		return count;
 	}
 
@@ -271,9 +270,116 @@ public class TsfCouponService {
 			custCoupon.setAvailStdt(joinCoupon.getAvailStdt());
 			custCoupon.setAvailEddt(joinCoupon.getAvailEddt());
 			custCoupon.setPubReason(TscConstants.PubReason.JOIN.value());
-			custCoupon.setEndAlimSendYn(joinCoupon.getEndAlimYn());
+			custCoupon.setEndAlimSendYn("N");		// 알림 발송 여부(발송되면 Y)
 			custCoupon.setUpdNo(coupon.getCustNo());
 			custCoupon.setRegNo(coupon.getCustNo());
 		}
 	}
+
+	/**
+	 * 상품 쿠폰 조회
+	 * @param goods
+	 * @return
+	 * @author eskim
+	 * @since 2021.03.11
+	 */
+	public Collection<Coupon> getGoodsCouponList(Goods goods) {
+		return couponDao.getGoodsCouponList(goods);
+	}
+
+	/**
+	 * 상품 쿠폰 다운 처리
+	 *
+	 * @param coupon
+	 * @return int
+	 * @author eskim
+	 * @since 2021.03.12
+	 */
+	@Transactional("shopTxnManager")
+	public String createGoodsCoupon(Goods goods) {
+		String result = "SUCESS";
+		int downloadCnt = 1; 	// 쿠폰당 다운 받을수
+
+		log.info("상품쿠폰 발급전 정보 goods {}", goods);
+
+		Collection<Coupon> goodsCouponList = couponDao.getGoodsCouponList(goods);
+		if (goodsCouponList == null || goodsCouponList.isEmpty()) {
+			result = "ERROR_10";
+			return result;
+		}
+
+		Coupon coupon = goodsCouponList.iterator().next();
+		log.info("상품쿠폰 쿠폰정보  coupon {}", coupon);
+
+		// 발급수 확인 -- 필요없나?
+		if (coupon.getTotPubLimitQty() > 0) {
+			if (coupon.getTotPubLimitQty() <= coupon.getCustCouponCnt()) {
+				log.info("상품쿠폰 다운  skip: 쿠폰발급수 : {}, 회원발급수 : {}", coupon.getTotPubLimitQty(), coupon.getCustCouponCnt());
+				result = "ERROR_30";
+				return result;
+			}
+		}
+
+		// 회원정보 확인 - 발급등급,첫구매, 신규회원, 제휴링크
+
+		// 회원등급 USABLE_CUST_GRADE
+		if (coupon.getUsableCustGrade().indexOf(goods.getCustGrade()) < 0) {
+			log.info("상품쿠폰 다운  skip: 쿠폰등급 : {}, 회원등급 : {}", coupon.getUsableCustGrade(), goods.getCustGrade());
+			result = "ERROR_20";
+			return result;
+		}
+
+		// 첫구매여부 (Y:구매이력이없음 | N:구매이력있음) - 구매기간일자 해당기간에 구매이력이 없으면 다운로드 가능
+		if ("Y".equals(coupon.getFirstOrdYn())) {
+			int firstOrdcnt = orderService.getCustFirstOrderCount(coupon);
+			if (firstOrdcnt > 0) {
+				log.info("상품쿠폰 다운  skip: 쿠폰첫구매정보 : {}, {} ~ {} ", coupon.getFirstOrdYn(), coupon.getBuyStdt(), coupon.getBuyEddt());
+				result = "ERROR_20";
+				return result;
+			}
+		}
+
+		// 신규회원 NEW_CUST_YN
+		if ("Y".equals(coupon.getNewCustYn())) {
+			Customer customer = customerService.getCustomerFindByCustNo(goods.getCustNo());
+			if (customer == null || StringUtils.isEmpty(customer.getJoinDt())) {
+				log.info("상품쿠폰 다운  skip: 쿠폰 신규회원정보 : {} 회원정보 없음", coupon.getCustNo());
+				result = "ERROR_20";
+				return result;
+			}
+			log.info("고객정보 customer {}", customer);
+			if (Integer.parseInt(customer.getJoinDt()) < Integer.parseInt(coupon.getCustJoinStdt()) ||
+				Integer.parseInt(customer.getJoinDt()) > Integer.parseInt(coupon.getCustJoinEddt())) {
+				log.info("상품쿠폰 다운  skip: 쿠폰 신규회원정보 : {}, {} ~ {} ", customer.getJoinDt(), coupon.getCustJoinStdt(), coupon.getCustJoinEddt());
+				result = "ERROR_20";
+				return result;
+			}
+		}
+
+		// 제휴링크 나중에 확인하자!!!!!
+
+		int count = 0;
+		for (Coupon tmpCoupon : goodsCouponList) {
+
+			for (int i = 0; i < downloadCnt; i++) {
+				CustCoupon custCoupon = new CustCoupon();
+				custCoupon.setCustNo(TsfSession.getInfo().getCustNo());
+				custCoupon.setCpnId(tmpCoupon.getCpnId());
+				custCoupon.setAvailStdt(tmpCoupon.getAvailStdt());
+				custCoupon.setAvailEddt(tmpCoupon.getAvailEddt());
+				custCoupon.setPubReason(TscConstants.PubReason.DOWNLOAD.value());
+				custCoupon.setEndAlimSendYn("N");		// 알림 발송 여부(발송되면 Y)
+				custCoupon.setRegNo(TsfSession.getInfo().getCustNo());
+				custCoupon.setUpdNo(TsfSession.getInfo().getCustNo());
+
+				log.info("상품쿠폰 고객 다운로드 custCoupon {}", custCoupon);
+				coreCouponDao.saveCouponCustPub(custCoupon);
+
+				count++;
+			}
+		}
+		result = Integer.toString(count);	// 다운받은 쿠폰수
+
+		return result;
+	}
 }

+ 128 - 48
src/main/java/com/style24/front/biz/service/TsfCustomerService.java

@@ -7,6 +7,7 @@ import java.util.List;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpSession;
 
+import com.style24.core.biz.service.TscEnvsetService;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.core.authority.SimpleGrantedAuthority;
@@ -77,7 +78,7 @@ public class TsfCustomerService {
 	}
 
 	/**
-	 * 고객정보찾기 -
+	 * 고객정보찾기
 	 *
 	 * @param custNo - 고객번호
 	 * @return Customer 고객정보
@@ -93,6 +94,23 @@ public class TsfCustomerService {
 		return coreCustomerService.getCustomerInfo(customer);
 	}
 
+	/**
+	 * 휴면고객 정보 찾기
+	 *
+	 * @param custNo - 고객번호
+	 * @return Customer 고객정보
+	 * @author jsshin
+	 * @since 2021. 03. 10
+	 */
+	public Customer getDormantCustomerFindByCustNo(Integer custNo) {
+		Customer customer = new Customer();
+		customer.setCustNo(custNo);
+		customer.setCustStat(TscConstants.CustStat.DORMANT.value());
+		customer.setSiteCd(TscConstants.Site.STYLE24.value());
+		customer.encryptData();
+		return coreCustomerService.getCustomerInfo(customer);
+	}
+
 
 	/**
 	 * 임시비밀번호 조회
@@ -180,7 +198,6 @@ public class TsfCustomerService {
 	 * @since 2021. 02. 15
 	 */
 	public boolean getCustomerFindByCiCount(String ci) {
-		TscSession.setAttribute("maskingYn","Y");
 		Customer customer = new Customer();
 		customer.setCi(ci);
 		customer.setSiteCd(TscConstants.Site.STYLE24.value());
@@ -204,6 +221,7 @@ public class TsfCustomerService {
 		customer.setCi(ci);
 		customer.setSiteCd(TscConstants.Site.STYLE24.value());
 		customer.encryptData();
+
 		return customerDao.getCustomerInfo(customer);
 	}
 
@@ -221,52 +239,8 @@ public class TsfCustomerService {
 		customer.setHypenCellPhone(); // 010-0000-0000
 		customer.setSiteCd(TscConstants.Site.STYLE24.value());
 		customer.encryptData();
-		return customerDao.getCustomerInfo(customer);
-	}
 
-	/**
-	 * 고객 가입 확인
-	 * @param customer - ci, 휴대폰
-	 * @return 가입 수
-	 * @author jsshin
-	 * @since 2021. 02. 18
-	 */
-	public GagaMap getJoinCustomerValidation(Customer customer) {
-		GagaMap result = new GagaMap();
-		TscSession.setAttribute("maskingYn","Y");
-		boolean isFind = false; //가입된 고객이 있으면 true 아니면 false
-		Customer custInfo;
-
-		if (StringUtils.isBlank(customer.getCi())) {
-			throw new IllegalStateException("안심본인인증을 사용할 수 없습니다. 다시 시도해주세요(CI 데이터 없음)");
-		}
-
-		if (StringUtils.isBlank(customer.getCellPhnno())) {
-			throw new IllegalStateException("안심본인인증을 사용할 수 없습니다. 다시 시도해주세요(휴대폰 번호 없음)");
-		}
-
-		// CI로 가입된 고객 있는지 확인
-		custInfo = getCustomerFindByCi(customer.getCi());
-
-		if (custInfo != null) {
-			isFind = true;
-			result.setBoolean("isFind", isFind);
-			result.setString("maskingCustId", custInfo.getMaskingCustId());
-			return result;
-		}
-
-		// 휴대폰 번호로 가입된 고객 있는지 확인
-		custInfo = getCustomerFindByCellPhnno(customer.getCellPhnno());
-
-		if (custInfo != null) {
-			isFind = true;
-			result.setBoolean("isFind", isFind);
-			result.setString("maskingCustId",custInfo.getMaskingCustId());
-			return result;
-		}
-
-		result.setBoolean("isFind", isFind);
-		return result;
+		return customerDao.getCustomerInfo(customer);
 	}
 
 	/**
@@ -279,7 +253,6 @@ public class TsfCustomerService {
 	@Transactional("shopTxnManager")
 	public boolean saveJoinCustomer(Customer customer) {
 		boolean isJoin = true;
-		// 1. validation
 		customer.setHypenCellPhone();
 		customer.encryptData();
 		customer.setEncodedPasswd(passwordEncoder.encodeSha256(customer.getPasswd()));
@@ -561,7 +534,9 @@ public class TsfCustomerService {
 		customer.setSiteCd(TscConstants.Site.STYLE24.value());
 		customer.setCustId(custId);
 		String maskingCustId = customerDao.getCustomerMaxCustId(customer);
+
 		maskingCustId = MaskingUtils.id(maskingCustId);
+
 		return maskingCustId;
 	}
 
@@ -578,7 +553,9 @@ public class TsfCustomerService {
 		customer.setEmail(email);
 		customer.encryptData();
 		String maskingCustId = customerDao.getCustomerMaxCustId(customer);
+
 		maskingCustId = MaskingUtils.id(maskingCustId);
+
 		return maskingCustId;
 	}
 
@@ -594,8 +571,11 @@ public class TsfCustomerService {
 		customer.setSiteCd(TscConstants.Site.STYLE24.value());
 		customer.setCellPhnno(cellPhnno);
 		customer.encryptData();
+
 		String maskingCustId = customerDao.getCustomerMaxCustId(customer);
+
 		maskingCustId = MaskingUtils.id(maskingCustId);
+
 		return maskingCustId;
 	}
 
@@ -611,8 +591,11 @@ public class TsfCustomerService {
 		customer.setSiteCd(TscConstants.Site.STYLE24.value());
 		customer.setCi(ci);
 		customer.encryptData();
+
 		String maskingCustId = customerDao.getCustomerMaxCustId(customer);
+
 		maskingCustId = MaskingUtils.id(maskingCustId);
+
 		return maskingCustId;
 	}
 
@@ -634,6 +617,16 @@ public class TsfCustomerService {
 			wishInfo.setRegNo(TsfSession.getInfo().getCustNo());
 			customerDao.createWishList(wishInfo);
 		}
+		
+		// 위시상품목록 50개만 남게 처리
+		String goodsCd = customerDao.getDeleteGoodsWish(TsfSession.getInfo().getCustNo());
+		WishList delWishInfo = new WishList();
+		delWishInfo.setCustNo(TsfSession.getInfo().getCustNo());
+		if (!StringUtils.isBlank(goodsCd)) {
+			delWishInfo.setArrGoodsCd(goodsCd.split("\\,"));
+			customerDao.deleteWishList(delWishInfo);
+		}
+		
 	}
 
 	/**
@@ -663,10 +656,97 @@ public class TsfCustomerService {
 	 */
 	public GagaMap releaseDormantCustomer(Customer customer) {
 		GagaMap result = new GagaMap();
+
+		Customer custInfo = getDormantCustomerFindByCustNo(customer.getCustNo());
+
+		if (!customer.getCi().equals(custInfo.getCi())) {
+			result.setBoolean("isRelase", false);
+			result.setString("errorType", "DIFFERENT_CI"); // 계정이 등록된 CI랑 인증한 CI가 다를떄
+			return result;
+		}
+
 		customer.setRegNo(customer.getCustNo());
 		customer.setUpdNo(customer.getCustNo());
 		boolean isRelase = coreCustomerService.saveDormantCustomerRelease(customer);
 		result.setBoolean("isRelase", isRelase);
 		return result;
 	}
+
+	/**
+	 * 본인인증 처리
+	 *
+	 * @param customer - 본인인증키
+	 * @return GagaMap - 결과
+	 * @author jsshin
+	 * @since 2021. 03. 11
+	 */
+	public GagaMap saveCertification(Customer customer) {
+		GagaMap resultMap = new GagaMap();
+		customer.setRegNo(customer.getCustNo());
+		customer.setUpdNo(customer.getCustNo());
+		boolean isSuccess = false;
+		// CI 유효성 체크
+		Customer custInfo = getCustomerFindByCi(customer.getCi());
+		if (custInfo != null) {
+			TsfSession.setAttribute("maskingCustId", custInfo.getMaskingCustId());
+			resultMap.setBoolean("isSuccess", isSuccess);
+			return resultMap;
+		}
+
+		// 1.이력 쌓고
+		coreCustomerService.createCustomerHistory(customer);
+		// 2.CI 업데이트
+		int resultCnt = customerDao.updateCustomerCi(customer);
+		if (resultCnt > 0) {
+			isSuccess = true;
+		}
+		resultMap.setBoolean("isSuccess", isSuccess);
+
+		return resultMap;
+	}
+
+	/**
+	 * 비밀번호 변경 날짜 업데이트
+	 *
+	 * @param customer - 고객번호
+	 * @return GagaMap - 결과
+	 * @author jsshin
+	 * @since 2021. 03. 11
+	 */
+	public GagaMap updatePasswordDate(Customer customer) {
+		GagaMap resultMap = new GagaMap();
+		boolean isSuccess = false;
+		customer.setRegNo(customer.getCustNo());
+		customer.setUpdNo(customer.getCustNo());
+		customer.setPwdChangeDay(60); //30일간 안보여야 하기때문에 (오늘날짜 - 60) 처리
+
+		// 1.이력 쌓고
+		coreCustomerService.createCustomerHistory(customer);
+
+		// 2.비밀번호 변경일자 업데이트
+		int resultCnt = customerDao.updatePasswordDate(customer);
+		if (resultCnt > 0) {
+			isSuccess = true;
+		}
+
+		resultMap.setBoolean("isSuccess", isSuccess);
+
+		return resultMap;
+	}
+	
+	/**
+	 * 해당 고객번호로 가입된 정보 확인
+	 * @param custNo - 연계정보
+	 * @return Customer
+	 * @author eskim
+	 * @since 2021. 03. 12
+	 */
+	public Customer getCustomerFindByCustNo(int custNo) {
+		TscSession.setAttribute("maskingYn","Y");
+		Customer customer = new Customer();
+		customer.setCustNo(custNo);
+		customer.setSiteCd(TscConstants.Site.STYLE24.value());
+		customer.encryptData();
+		return customerDao.getCustomerInfo(customer);
+	}
 }

+ 142 - 3
src/main/java/com/style24/front/biz/service/TsfDisplayService.java

@@ -1,11 +1,16 @@
 package com.style24.front.biz.service;
 
+import com.style24.core.support.env.TscConstants;
+import com.style24.front.biz.dao.TsfDisplayDao;
+import com.style24.front.support.env.TsfConstants;
+import com.style24.persistence.domain.*;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cache.annotation.Cacheable;
 import org.springframework.stereotype.Service;
 
-import com.style24.front.biz.dao.TsfDisplayDao;
-
-import lombok.extern.slf4j.Slf4j;
+import java.util.ArrayList;
+import java.util.Collection;
 
 /**
  * 전시 Service
@@ -20,4 +25,138 @@ public class TsfDisplayService {
 	@Autowired
 	private TsfDisplayDao displayDao;
 
+	/**
+	 * GNB 브랜드그룹 목록
+	 * @param contents - 컨텐츠 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 3. 11
+	 */
+	public Collection<BrandGroup> getGnbBrandGroupList(Contents contents) {
+		return displayDao.getGnbBrandGroupList(contents);
+	}
+
+	/**
+	 * GNB 탭 목록
+	 * @param gnbTab - GNB탭 정보
+	 * @return
+	 * @author gagamel
+	 * @date 2021. 3. 11
+	 */
+	public Collection<GnbTab> getGnbTapList(GnbTab gnbTab) {
+		// GNB 탭 목록
+		Collection<GnbTab> tapList = displayDao.getGnbTabList(gnbTab);
+
+		if (tapList != null && !tapList.isEmpty()) {
+			for (GnbTab tab : tapList) {
+				if (tab.getContentsType().equals("C") || tab.getContentsType().equals("O")) { // 컨텐츠유형:카테고리, 아울렛
+					gnbTab.setCateList(this.getCategoryList(TsfConstants.CateGb.BYITEM.value(), tab.getCate1No()));
+				}
+			}
+		}
+
+		return tapList;
+	}
+
+	/**
+	 * 컨텐츠 목록
+	 * @param contents - 컨텐츠 정보
+	 * @return
+	 * @author gagamel
+	 * @date 2021. 3. 11
+	 */
+	public Collection<Contents> getContentsList(Contents contents) {
+		return displayDao.getContentsList(contents);
+	}
+
+	/**
+	 * 카테고리 목록
+	 * @param cateGb - 카테고리구분
+	 * @param cate1No - 카테고리1번호
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 3. 11
+	 */
+	@Cacheable(value = "cate", key = "'cateList-'.concat(#cateGb).concat(#cate1No)")
+	public Collection<Cate1> getCategoryList(String cateGb, Integer cate1No) {
+		Cate4Srch cate = new Cate4Srch();
+		cate.setSiteCd(TscConstants.Site.STYLE24.value()); // 사이트코드
+		cate.setCateGb(cateGb); // 카테고리구분
+		cate.setCateType(TsfConstants.CateType.GOODS.value()); // 상품분류카테고리
+		cate.setCate1No(cate1No);
+
+		return this.getAllCategoryList(cate);
+	}
+
+	/**
+	 * 전체 카테고리 목록
+	 * @param cate - 카테고리 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 3. 11
+	 */
+	public Collection<Cate1> getAllCategoryList(Cate4Srch cate) {
+		Collection<Cate1> fullCateList = new ArrayList<>();
+
+		// 카테고리1 목록
+		Collection<Cate1> cate1List = displayDao.getCategory1List(cate);
+
+		if (cate1List != null && !cate1List.isEmpty()) {
+			for (Cate1 cate1 : cate1List) {
+				if (cate1.getLeafYn().equals("N")) {
+					cate.setCate1No(cate1.getCate1No());
+
+					// 카테고리2 목록
+					Collection<Cate2> cate2List = displayDao.getCategory2List(cate);
+
+					if (cate2List != null && !cate2List.isEmpty()) {
+						for (Cate2 cate2 : cate2List) {
+							if (cate2.getLeafYn().equals("N")) {
+								cate.setCate2No(cate2.getCate2No());
+
+								// 카테고리3 목록
+								Collection<Cate3> cate3List = displayDao.getCategory3List(cate);
+
+								if (cate3List != null && !cate3List.isEmpty()) {
+									for (Cate3 cate3 : cate3List) {
+										if (cate3.getLeafYn().equals("N")) {
+											cate.setCate3No(cate3.getCate3No());
+
+											// 카테고리4 목록
+											Collection<Cate4> cate4List = displayDao.getCategory4List(cate);
+
+											if (cate4List != null && !cate4List.isEmpty()) {
+												for (Cate4 cate4 : cate4List) {
+													if (cate4.getLeafYn().equals("N")) {
+														cate.setCate4No(cate4.getCate4No());
+
+														// 카테고리5 목록 담기
+														cate4.setCate5List(displayDao.getCategory5List(cate));
+													}
+												}
+
+												// 카테고리4 목록 담기
+												cate3.setCate4List(cate4List);
+											}
+										}
+									}
+
+									// 카테고리3 목록 담기
+									cate2.setCate3List(cate3List);
+								}
+							}
+						}
+
+						// 카테고리2 목록 담기
+						cate1.setCate2List(cate2List);
+					}
+				}
+
+				fullCateList.add(cate1);
+			}
+		}
+
+		return fullCateList;
+	}
+
 }

+ 50 - 0
src/main/java/com/style24/front/biz/service/TsfGiftcardService.java

@@ -1,9 +1,13 @@
 package com.style24.front.biz.service;
 
+import java.util.Collection;
+
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import com.style24.front.biz.dao.TsfGiftcardDao;
+import com.style24.front.support.security.session.TsfSession;
+import com.style24.persistence.domain.GiftCard;
 
 import lombok.extern.slf4j.Slf4j;
 
@@ -19,5 +23,51 @@ public class TsfGiftcardService {
 
 	@Autowired
 	private TsfGiftcardDao giftcardDao;
+	
+	/**
+	 * 상품권정보 조회
+	 *
+	 * @param GiftCard
+	 * @author sowon
+	 * @since 2021. 3. 12
+	 */	
+	public GiftCard getGiftcardInfo(GiftCard giftcard) {
+		
+		// 고객번호 설정
+		int custNo = TsfSession.getInfo().getCustNo();
+		giftcard.setCustNo(custNo);
+		
+		return giftcardDao.getGiftcardInfo(giftcard);		
+	}
+	
+	/**
+	 * 상품권 사용 정보 조회
+	 *
+	 * @param GiftCard
+	 * @author sowon
+	 * @since 2021. 3. 12
+	 */	
+	public Collection<GiftCard> getGiftcardUseList(GiftCard giftcard){
+		// 고객번호 설정
+		int custNo = TsfSession.getInfo().getCustNo();
+		giftcard.setCustNo(custNo);
+		
+		return giftcardDao.getGiftcardUseList(giftcard);
+	}
+	
+	/**
+	 * 상품권 보유 조회
+	 *
+	 * @param GiftCard
+	 * @author sowon
+	 * @since 2021. 3. 12
+	 */	
+	public Collection<GiftCard> getGiftcardOwnList(GiftCard giftcard){
+		// 고객번호 설정
+		int custNo = TsfSession.getInfo().getCustNo();
+		giftcard.setCustNo(custNo);
+		
+		return giftcardDao.getGiftcardOwnList(giftcard);
+	}
 
 }

+ 78 - 6
src/main/java/com/style24/front/biz/service/TsfGoodsService.java

@@ -21,8 +21,10 @@ import com.style24.persistence.domain.GoodsNotiInfo;
 import com.style24.persistence.domain.GoodsSafeNo;
 import com.style24.persistence.domain.GoodsStock;
 import com.style24.persistence.domain.GoodsViewHst;
+import com.style24.persistence.domain.Measurement;
 import com.style24.persistence.domain.Notice;
 import com.style24.persistence.domain.ReinboundInform;
+import com.style24.persistence.domain.SizeInfo;
 import com.style24.persistence.domain.VideoDisploc;
 
 import lombok.extern.slf4j.Slf4j;
@@ -40,6 +42,9 @@ public class TsfGoodsService {
 	@Autowired
 	private TsfGoodsDao goodsDao;
 
+	@Autowired
+	private TsfCouponService couponService;
+
 	/**
 	 * 상품뷰이력 생성
 	 *
@@ -409,7 +414,7 @@ public class TsfGoodsService {
 	public GoodsSafeNo getGoodsSafeNo(Goods goods) {
 		return goodsDao.getGoodsSafeNo(goods);
 	}
-	
+
 	/**
 	 * 상품  배송안내정보
 	 * @param goodsCd
@@ -420,7 +425,7 @@ public class TsfGoodsService {
 	public Delivery getGoodsDeliveryInfo(String goodsCd) {
 		return goodsDao.getGoodsDeliveryInfo(goodsCd);
 	}
-	
+
 	/**
 	 * 상품 다다익선 목록
 	 * @param goods
@@ -431,7 +436,7 @@ public class TsfGoodsService {
 	public Collection<Goods> getTmtbGoodsList(Goods goods) {
 		return goodsDao.getTmtbGoodsList(goods);
 	}
-	
+
 	/**
 	 * 재입고 알림 미 알림 조회
 	 * @param goods
@@ -442,7 +447,7 @@ public class TsfGoodsService {
 	public ReinboundInform getNotReinboundInform(ReinboundInform reinboundInform) {
 		return goodsDao.getNotReinboundInform(reinboundInform);
 	}
-	
+
 	/**
 	 * 재입고알림 생성
 	 * @param goods
@@ -454,7 +459,7 @@ public class TsfGoodsService {
 	public void createReinboundInform(ReinboundInform reinboundInform) {
 		goodsDao.createReinboundInform(reinboundInform);
 	}
-	
+
 	/**
 	 * 재입고알림 수정
 	 * @param goods
@@ -466,5 +471,72 @@ public class TsfGoodsService {
 	public void updateReinboundInform(ReinboundInform reinboundInform) {
 		goodsDao.updateReinboundInform(reinboundInform);
 	}
-	
+
+	/**
+	 * 재입고 알림 신청 저장
+	 *
+	 * @param reinboundInform
+	 * @return void
+	 * @author eskim
+	 * @since 2021. 03. 17
+	 */
+	@Transactional("shopTxnManager")
+	public void saveGoodsInstockAlarmForm(ReinboundInform reinboundInform) {
+
+		if (!TsfSession.isLogin()) {
+			throw new IllegalStateException("로그인을 해야합니다.");
+		}
+
+		reinboundInform.setCustNo(TsfSession.getInfo().getCustNo());
+		reinboundInform.setRegNo(TsfSession.getInfo().getCustNo());
+		reinboundInform.setUpdNo(TsfSession.getInfo().getCustNo());
+
+		// 미알림 조회
+		ReinboundInform tmpReinboundInform = goodsDao.getNotReinboundInform(reinboundInform);
+
+		if (tmpReinboundInform == null || tmpReinboundInform.getRinbdInfoSq() <= 0) {
+			goodsDao.createReinboundInform(reinboundInform);
+		} else {
+			reinboundInform.setRinbdInfoSq(tmpReinboundInform.getRinbdInfoSq());
+			goodsDao.updateReinboundInform(reinboundInform);
+		}
+
+	}
+
+	/**
+	 * 실측사이즈 조회
+	 *
+	 * @param goods
+	 * @return
+	 * @author eskim
+	 * @date 2021. 3. 10
+	 */
+	public Collection<Measurement> getMeasurementList(Goods goods) {
+		return goodsDao.getMeasurementList(goods);
+	}
+
+	/**
+	 * 사이즈 정보 조회
+	 *
+	 * @param sizeInfo
+	 * @return
+	 * @author eskim
+	 * @date 2021. 3. 10
+	 */
+	public Collection<SizeInfo> getSizeInfoList(SizeInfo sizeInfo) {
+		return goodsDao.getSizeInfoList(sizeInfo);
+	}
+
+	/**
+	 * 상품 쿠폰 다운 처리
+	 *
+	 * @param coupon
+	 * @return int
+	 * @author eskim
+	 * @since 2021.03.15
+	 */
+	@Transactional("shopTxnManager")
+	public String createGoodsCoupon(Goods goods) {
+		return couponService.createGoodsCoupon(goods);
+	}
 }

+ 4 - 8
src/main/java/com/style24/front/biz/service/TsfOrderChangeService.java

@@ -1,20 +1,13 @@
 package com.style24.front.biz.service;
 
-import java.text.DateFormat;
-import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Calendar;
 import java.util.Collection;
-import java.util.Date;
-import java.util.List;
 
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import com.gagaframework.web.parameter.GagaMap;
-import com.style24.core.support.env.TscConstants;
+import com.style24.core.biz.service.TscOrderChangeService;
 import com.style24.front.biz.dao.TsfOrderChangeDao;
-import com.style24.front.biz.dao.TsfOrderDao;
 import com.style24.persistence.domain.GiftCard;
 import com.style24.persistence.domain.Order;
 import com.style24.persistence.domain.Point;
@@ -34,6 +27,9 @@ public class TsfOrderChangeService {
 	@Autowired
 	private TsfOrderChangeDao orderChangeDao;
 
+	@Autowired
+	private TscOrderChangeService coreOrderChangeService;
+
 	/**
 	 * 마이페이지 취소/반품 목록 조회
 	 *

+ 15 - 3
src/main/java/com/style24/front/biz/service/TsfOrderService.java

@@ -22,9 +22,8 @@ import com.style24.core.biz.service.TscKakaoPayService;
 import com.style24.core.biz.service.TscKcpService;
 import com.style24.core.biz.service.TscNaverPayService;
 import com.style24.core.support.env.TscConstants;
-import com.style24.core.support.session.TscSession;
 import com.style24.front.biz.dao.TsfOrderDao;
-import com.style24.front.support.security.session.TsfSession;
+import com.style24.persistence.domain.Coupon;
 import com.style24.persistence.domain.KakaoPay;
 import com.style24.persistence.domain.NaverPay;
 import com.style24.persistence.domain.Order;
@@ -32,6 +31,8 @@ import com.style24.persistence.domain.Payment;
 
 import lombok.extern.slf4j.Slf4j;
 
+import com.gagaframework.web.parameter.GagaMap;
+
 /**
  * 주문 Service
  *
@@ -352,7 +353,7 @@ public class TsfOrderService {
 	public int updateOrderDisplayYn(Order order) { return orderDao.updateOrderDisplayYn(order); }
 
 	public Payment setPgDataInfo(Order order) {
-		Payment payment = new Payment();
+		Payment payment;
 		if(TscConstants.PgGb.KAKAO.value().equals(order.getPgGb())) {			// 카카오페이
 			KakaoPay kakaoPay = coreKakaoPayService.kakaoPaymentReady(order);
 			payment = coreKakaoPayService.setKakaoOrderData(kakaoPay, order);
@@ -369,4 +370,15 @@ public class TsfOrderService {
 		payment.setPayMeans(order.getPayMeans());
 		return payment;
 	}
+	
+	/**
+	 * 고객 특정기간 첫구매 여부
+	 * 
+	 * @param coupon
+	 * @return int
+	 * @author eskim
+	 * @since 2021.03.12
+	 */
+	public int getCustFirstOrderCount(Coupon coupon) { return orderDao.getCustFirstOrderCount(coupon); }
+	
 }

+ 53 - 0
src/main/java/com/style24/front/biz/service/TsfSocialService.java

@@ -0,0 +1,53 @@
+package com.style24.front.biz.service;
+
+import java.util.Collection;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import com.style24.front.biz.dao.TsfSocialDao;
+import com.style24.persistence.domain.Social;
+
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * 소셜(핫딜) Service
+ *
+ * @author sowon
+ * @since 2021. 3. 11
+ */
+@Service
+@Slf4j
+public class TsfSocialService {
+	
+	@Autowired
+	private TsfSocialDao socialDao;
+	
+	/**
+	 * 소셜(핫딜) 정보
+	 *
+	 * @param
+	 * @return
+	 * @author sowon	
+	 * @since 2021. 3. 11
+	 */
+	public Social getSocialInfo(Social social) {
+		return socialDao.getSocialInfo(social);
+	}
+	
+	/**
+	 * 소셜(핫딜) 상품 리스트
+	 *
+	 * @param
+	 * @return
+	 * @author sowon	
+	 * @since 2021. 3. 11
+	 */
+	public Collection<Social> getSocialGoodsList(Social social) {
+		Social info = new Social();
+		info = socialDao.getSocialInfo(social);
+		social.setSocialSq(info.getSocialSq());
+		return socialDao.getSocialGoodsList(social);
+	}
+
+}

+ 96 - 8
src/main/java/com/style24/front/biz/web/TsfCustomerController.java

@@ -24,9 +24,11 @@ import com.style24.front.support.controller.TsfBaseController;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.support.SessionStatus;
 import org.springframework.web.servlet.ModelAndView;
 
 import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
 
 
 /**
@@ -234,10 +236,18 @@ public class TsfCustomerController extends TsfBaseController {
 	 * @author jsshin
 	 * @since 2021. 02. 17
 	 */
-	@GetMapping("password/change/form")
+	@GetMapping("/password/change/form")
 	public ModelAndView passwrodChangeForm(@RequestParam(value = "pageGb")String pageGb) {
 		ModelAndView mav = new ModelAndView();
-		String custNo = TscSession.getAttribute("custNo");
+		String custNo = "";
+
+		if ("find".equals(pageGb)) { //비밀번호 찾기 사용
+			custNo = TscSession.getAttribute("custNo");
+		}
+
+		if ("temp".equals(pageGb)) { // 비밀번호 변경 캠페인, 임시비밀번호로 로그인시 사용
+			custNo = String.valueOf(TsfSession.getInfo().getCustNo());
+		}
 
 		// 고객번호 없으면 인증화면으로 돌아감
 		if (StringUtils.isBlank(custNo)) {
@@ -252,7 +262,7 @@ public class TsfCustomerController extends TsfBaseController {
 		if (custInfo != null) {
 			mav.addObject("custId", custInfo.getCustId());
 		}
-
+		mav.addObject("pageGb", pageGb);
 		mav.setViewName(super.getDeviceViewName("customer/PasswordChangeForm"));
 		return mav;
 	}
@@ -269,8 +279,14 @@ public class TsfCustomerController extends TsfBaseController {
 	@ResponseBody
 	public GagaMap resetPassword(@RequestBody Customer customer) {
 		GagaMap result = new GagaMap();
-		String custNo = TscSession.getAttribute("custNo");
 		boolean isSuccess = false;
+		String custNo = "";
+		if (TsfSession.isLogin()) {
+			custNo = String.valueOf(TsfSession.getInfo().getCustNo());
+		} else {
+			custNo = TscSession.getAttribute("custNo");
+		}
+
 		if (StringUtils.isBlank(custNo)) {
 			throw new IllegalStateException("고객 정보가 없습니다. 다시 확인 해주세요.");
 		}
@@ -575,18 +591,22 @@ public class TsfCustomerController extends TsfBaseController {
 	 * 가입처리
 	 *
 	 * @param customer - 고객정보
+	 * @param request - 자동로그인
+	 * @param session - 세션 저장된 내용삭제
 	 * @return GagaMap - 결과정보
 	 * @author jsshin
 	 * @since 2021. 02. 18
 	 */
 	@PostMapping("/join/save")
 	@ResponseBody
-	public GagaMap saveJoinCustomer(@RequestBody Customer customer, HttpServletRequest request) {
+	public GagaMap saveJoinCustomer(@RequestBody Customer customer, HttpServletRequest request, HttpSession session) {
 		GagaMap result = new GagaMap();
 
 		// 1.세션에 인코딩된 데이터를 가져온다.
 		String encData = TscSession.getAttribute("encData");
 		customer.setEncData(encData);
+		session.removeAttribute("encData");
+
 		GagaMap authInfo = niceCertify.getCertifyCellPhoneResultInfo(customer);
 
 		// 2.인증통해 받은 데이터 매핑
@@ -687,19 +707,23 @@ public class TsfCustomerController extends TsfBaseController {
 	 */
 	@PostMapping("/dormant/release")
 	@ResponseBody
-	public GagaMap releaseDormantCustomer(@RequestBody Customer customer) {
+	public GagaMap releaseDormantCustomer(@RequestBody Customer customer, HttpSession session) {
 		String custNo = TsfSession.getAttribute("custNo");
 		if (StringUtils.isBlank(custNo) || StringUtils.isBlank(customer.getEncData())) {
-			throw new IllegalStateException("로그인 후 재인증 해주세요.");
+			throw new IllegalStateException("로그인 다시 시도해주세요.");
 		}
+		GagaMap resultInfo = niceCertify.getCertifyCellPhoneResultInfo(customer);
+
+		customer.setCi(resultInfo.getString("sCi"));
 		customer.setCustNo(Integer.parseInt(custNo));
+		session.removeAttribute("custNo"); // 고객번호 세션 삭제
 		return customerService.releaseDormantCustomer(customer);
 	}
 
 	/**
 	 * 휴면해제 완료화면
 	 *
-	 * @return ModelAndView - 가입완료 화면
+	 * @return ModelAndView - 휴면해제 완료화면
 	 * @author jsshin
 	 * @since 2021. 03. 08
 	 */
@@ -712,6 +736,70 @@ public class TsfCustomerController extends TsfBaseController {
 		return mav;
 	}
 
+	/**
+	 * 본인인증 화면
+	 *
+	 * @return ModelAndView - 가입완료 화면
+	 * @author jsshin
+	 * @since 2021. 03. 10
+	 */
+	@GetMapping("/certification/form")
+	public ModelAndView getCertificationForm() {
+		ModelAndView mav = new ModelAndView();
+
+		mav.setViewName(super.getDeviceViewName("customer/CertificationForm"));
+
+		return mav;
+	}
+
+	/**
+	 * 본인인증 처리
+	 *
+	 * @param customer - 본인인증키
+	 * @return GagaMap - 결과
+	 * @author jsshin
+	 * @since 2021. 03. 11
+	 */
+	@PostMapping("/certification/save")
+	@ResponseBody
+	public GagaMap saveCertification(@RequestBody Customer customer, HttpSession session) {
+		String custNo = TsfSession.getAttribute("custNo");
+		if (StringUtils.isBlank(custNo) || StringUtils.isBlank(customer.getEncData())) {
+			throw new IllegalStateException("로그인 다시 시도해 주세요.");
+		}
+		GagaMap resultInfo = niceCertify.getCertifyCellPhoneResultInfo(customer);
+		customer.setCi(resultInfo.getString("sCi"));
+		customer.setCustNo(Integer.parseInt(custNo));
+		session.removeAttribute("custNo"); // 고객번호 세션 삭제
+		return customerService.saveCertification(customer);
+	}
+
+	/**
+	 * 비밀번호 변경 캠페인 화면
+	 *
+	 * @return ModelAndView - 가입완료 화면
+	 * @author jsshin
+	 * @since 2021. 03. 11
+	 */
+	@GetMapping("/password/campaign/form")
+	public ModelAndView getPasswordCampaignnForm() {
+		ModelAndView mav = new ModelAndView();
+
+		mav.setViewName(super.getDeviceViewName("customer/PasswordCampaignForm"));
+
+		return mav;
+	}
+
+	@PostMapping("/password/date/update")
+	@ResponseBody
+	public GagaMap updatePasswordDate(@RequestBody Customer customer) {
+		Integer custNo = TsfSession.getInfo().getCustNo();
+		if (custNo == null) {
+			throw new IllegalStateException("로그인 다시 시도해 주세요.");
+		}
+		customer.setCustNo(custNo);
+		return customerService.updatePasswordDate(customer);
+	}
 
 
 

+ 54 - 7
src/main/java/com/style24/front/biz/web/TsfDisplayController.java

@@ -1,20 +1,23 @@
 package com.style24.front.biz.web;
 
-import java.util.HashMap;
-
+import com.style24.core.support.message.TscMessageByLocale;
+import com.style24.front.biz.service.TsfDisplayService;
+import com.style24.front.support.controller.TsfBaseController;
+import com.style24.persistence.domain.BrandGroup;
+import com.style24.persistence.domain.Contents;
+import com.style24.persistence.domain.GnbTab;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.mobile.device.Device;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.GetMapping;
 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.style24.core.support.message.TscMessageByLocale;
-import com.style24.front.biz.service.TsfDisplayService;
-import com.style24.front.support.controller.TsfBaseController;
-
-import lombok.extern.slf4j.Slf4j;
+import java.util.Collection;
+import java.util.HashMap;
 
 /**
  * 전시 Controller
@@ -48,4 +51,48 @@ public class TsfDisplayController extends TsfBaseController {
 		return mav;
 	}
 
+	/**
+	 * GNB탭 > 브랜드그룹 목록
+	 * @param contents - 컨텐츠 정보
+	 * @return
+	 * @throws Exception
+	 * @author gagamel
+	 * @since 2020. 3. 11
+	 */
+	@GetMapping("/gnb/brand/group/list")
+	@ResponseBody
+	public Collection<BrandGroup> getGnbBrandGroupList(Contents contents) {
+		contents.setContentsLoc("STAB001");
+		return displayService.getGnbBrandGroupList(contents);
+	}
+
+	/**
+	 * GNB 탭 목록
+	 * @param gnbTab - GNB탭 정보
+	 * @return
+	 * @throws Exception
+	 * @author gagamel
+	 * @since 2020. 3. 11
+	 */
+	@GetMapping("/gnb/tap/list")
+	@ResponseBody
+	public Collection<GnbTab> getGnbTapList(GnbTab gnbTab) {
+		gnbTab.setGtabGb("C"); // 공통GNB
+		return displayService.getGnbTapList(gnbTab);
+	}
+
+//	/**
+//	 * 전체 카테고리 목록
+//	 * @return
+//	 * @throws Exception
+//	 * @author gagamel
+//	 * @since 2020. 2. 7
+//	 */
+//	@GetMapping("/all/cate/list")
+//	@ResponseBody
+//	public Collection<Cate4Srch> getAllCategoryList() {
+//		String soldoutGoodsDisplayYn = policyService.getSoldoutGoodsDisplayYn(WfoConstants.SITE_CD);
+//		return displayService.getAllCategoryList(WfoConstants.CATE_GB.BYITEM.value(), soldoutGoodsDisplayYn);
+//	}
+
 }

+ 166 - 44
src/main/java/com/style24/front/biz/web/TsfGoodsController.java

@@ -1,5 +1,8 @@
 package com.style24.front.biz.web;
 
+import java.util.ArrayList;
+import java.util.Collection;
+
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
@@ -17,6 +20,7 @@ import com.style24.core.biz.service.TscLookbookService;
 import com.style24.core.support.env.TscConstants;
 import com.style24.core.support.message.TscMessageByLocale;
 import com.style24.front.biz.service.TsfCounselService;
+import com.style24.front.biz.service.TsfCouponService;
 import com.style24.front.biz.service.TsfGoodsService;
 import com.style24.front.support.controller.TsfBaseController;
 import com.style24.front.support.env.TsfConstants;
@@ -27,10 +31,15 @@ import com.style24.persistence.domain.Counsel;
 import com.style24.persistence.domain.Goods;
 import com.style24.persistence.domain.GoodsStock;
 import com.style24.persistence.domain.Lookbook;
+import com.style24.persistence.domain.Measurement;
+import com.style24.persistence.domain.ReinboundInform;
+import com.style24.persistence.domain.SizeInfo;
 
 import lombok.extern.slf4j.Slf4j;
 
 import com.gagaframework.web.parameter.GagaMap;
+import com.gagaframework.web.rest.server.GagaResponse;
+import com.gagaframework.web.rest.server.GagaResponseStatus;
 import com.gagaframework.web.util.GagaCookieUtil;
 
 /**
@@ -59,6 +68,9 @@ public class TsfGoodsController extends TsfBaseController {
 	@Autowired
 	private TscLookbookService coreLookbookService;
 
+	@Autowired
+	private TsfCouponService couponService;
+
 	@Value("${has-ssl}")
 	private String hasSsl;
 
@@ -116,7 +128,6 @@ public class TsfGoodsController extends TsfBaseController {
 			goods.setSocialSq(socialGoods.getSocialSq());
 			goods.setSocialTnm(socialGoods.getSocialTnm());
 			goods.setSocialEddt(socialGoods.getSocialEddt());
-			goods.setSocialSq(socialGoods.getSocialSq());
 		}
 		// 예약판매정보
 		goods = goodsService.getGoodsResSell(goods);
@@ -150,10 +161,8 @@ public class TsfGoodsController extends TsfBaseController {
 
 //				// 상품 고시정보
 				mav.addObject("goodsNotiList", goodsService.getGoodsNotiList(goods));
-
 				// 상품 안전인증 정보
 				mav.addObject("goodsSafeNo", goodsService.getGoodsSafeNo(goods));
-
 				// 룩북
 				Lookbook lookbook = new Lookbook();
 				lookbook.setGoodsCd(paramsGoods.getGoodsCd());
@@ -163,7 +172,8 @@ public class TsfGoodsController extends TsfBaseController {
 //				mav.addObject("goodsExtendList", goodsService.getGoodsSetExtendList(paramsGoods));
 			}
 			// 상품쿠폰
-//			mav.addObject("goodsCouponList", goodsService.getGoodsCouponList(paramsGoods));
+			paramsGoods.setMaxRownum(1);
+			mav.addObject("goodsCouponList", couponService.getGoodsCouponList(paramsGoods));
 		}
 
 		// 상품 문의건수
@@ -186,8 +196,6 @@ public class TsfGoodsController extends TsfBaseController {
 		mav.addObject("cardInfoList", goodsService.getCardPromotionList(cardPromotion));
 
 		// 쇼핑 혜택
-		// 할인혜택
-
 		// 다다익선
 
 		// 사은품
@@ -227,22 +235,24 @@ public class TsfGoodsController extends TsfBaseController {
 	 * @since 2021. 2. 09.
 	 */
 	private void setGoods(Goods goods) {
-		goods.setFrontGb(TsfSession.getFrontGb());
+		//goods.setFrontGb(TsfSession.getFrontGb());
+		goods.setFrontGb("true".equals(TsfSession.getAttribute("isApp")) ? "A" : TsfSession.getFrontGb());
 		goods.setIsApp(TsfSession.getAttribute("isApp"));	//앱여부 true
 		goods.setSiteCd(TscConstants.Site.STYLE24.value());
 		goods.setAfLinkCd(TsfSession.getAttribute("afLinkCd"));
-//		goods.setSoldoutGoodsDisplayYn(envsetService.getSoldoutGoodsDisplayYn(TscConstants.Site.STYLE24.value())); // 품절상품노출여부
-//		goods.setPointUnit(envsetService.getPointUnit(TscConstants.Site.STYLE24.value())); // 10:원단위절사(int)
-//		goods.setFloorUnit(envsetService.getPointUnit(TscConstants.Site.STYLE24.value()));
+		goods.setSoldoutGoodsDisplayYn(envsetService.getSoldoutGoodsDisplayYn(TscConstants.Site.STYLE24.value())); // 품절상품노출여부
+		goods.setPointUnit(envsetService.getPayUnit(TscConstants.Site.STYLE24.value())); // 10:원단위절사(int)
+		goods.setFloorUnit(envsetService.getPayUnit(TscConstants.Site.STYLE24.value()));
+
 		// 회원 구분
 		if (TsfSession.getInfo() != null) {
 			goods.setCustGb(TsfSession.getInfo().getCustGb());
 			goods.setCustNo(TsfSession.getInfo().getCustNo());
 			goods.setCustGrade(TsfSession.getInfo().getCustGrade());
 		} else {
-			goods.setCustGb("G100_00");
+			goods.setCustGb("G100_10");
 			goods.setCustNo(0);
-			goods.setCustGrade("00"); //?  확인해보자
+			goods.setCustGrade(""); //?  확인해보자
 		}
 	}
 
@@ -349,7 +359,7 @@ public class TsfGoodsController extends TsfBaseController {
 	 * @param counsel - 상담정보
 	 * @return
 	 * @author gagamel
-	 * @since 2020. 12. 28
+	 * @since 2021. 3. 5
 	 */
 	@PostMapping("/qna/list")
 	@ResponseBody
@@ -402,17 +412,17 @@ public class TsfGoodsController extends TsfBaseController {
 		paramsGoods.setGoodsCd(goodsCd);
 		setGoods(paramsGoods);
 		Goods goods = goodsService.getGoodsInfo(paramsGoods);
-		
+
 		// 배송업체명, 반품비, 교환비, 주소
 		mav.addObject("deliveryInfo", goodsService.getGoodsDeliveryInfo(goodsCd));
-		
+
 		// 상품 기본정보
 		mav.addObject("goodsInfo", goods);
 
 		mav.setViewName(super.getDeviceViewName("goods/GoodsDeliveryForm"));
 		return mav;
 	}
-	
+
 	/**
 	 * 상품상세 -  쿠폰 레이어
 	 * @return
@@ -426,10 +436,14 @@ public class TsfGoodsController extends TsfBaseController {
 		Goods paramsGoods = new Goods();
 		paramsGoods.setGoodsCd(goodsCd);
 		setGoods(paramsGoods);
-		Goods goods = goodsService.getGoodsInfo(paramsGoods);
-		
+		// Goods goods = goodsService.getGoodsInfo(paramsGoods);
+
+		// 상품쿠폰정보
+		mav.addObject("goodsCouponList", couponService.getGoodsCouponList(paramsGoods));
 		// 상품 기본정보
-		mav.addObject("goodsInfo", goods);
+		mav.addObject("params", paramsGoods);
+
+		//mav.addObject("goodsInfo", goods);
 
 		mav.setViewName(super.getDeviceViewName("goods/GoodsCouponForm"));
 		return mav;
@@ -449,36 +463,83 @@ public class TsfGoodsController extends TsfBaseController {
 		paramsGoods.setGoodsCd(goodsCd);
 		setGoods(paramsGoods);
 		Goods goods = goodsService.getGoodsInfo(paramsGoods);
-		
-		// 상품 기본정보
-		mav.addObject("goodsInfo", goods);
 
+		// 쿠폰정보
+		paramsGoods.setMaxRownum(1);
+		mav.addObject("goodsCouponList", couponService.getGoodsCouponList(paramsGoods));
+		// 다다익선
+
+		// 사은품
+
+		// 상품 기본정보 --즉시할인정보
+		mav.addObject("goodsInfo", goods);
 		mav.setViewName(super.getDeviceViewName("goods/GoodsShopBenefitForm"));
 		return mav;
 	}
-	
+
 	/**
 	 * 상품상세 -  사이즈 레이어
 	 * @return
 	 * @author eskim
 	 * @since 2021. 3. 8
 	 */
-	@PostMapping("/sizeInfo/layer/{goodsCd}")
-	public ModelAndView goodsSizeInfoForm(@PathVariable String goodsCd) {
+	@PostMapping("/sizeInfo/layer/{goodsCd}/{colorCd}")
+	public ModelAndView goodsSizeInfoForm(@PathVariable String goodsCd, @PathVariable String colorCd) {
 		ModelAndView mav = new ModelAndView();
 		// 상품관련 기본값 설정(회원 등급, 앱, PC/모바일 등)
 		Goods paramsGoods = new Goods();
 		paramsGoods.setGoodsCd(goodsCd);
+		paramsGoods.setColorCd(colorCd);
 		setGoods(paramsGoods);
 		Goods goods = goodsService.getGoodsInfo(paramsGoods);
-		
+
 		// 상품 기본정보
 		mav.addObject("goodsInfo", goods);
 
+		// 실측 사이즈 정보 - 자사상품만
+		String typeCd = "";
+		String typeWith = "";
+		Collection<Measurement> measurementList = new ArrayList<Measurement>();
+		if ("Y".equals(goods.getSelfGoodsYn())) {
+			paramsGoods.setOptCd1(colorCd);
+			measurementList = goodsService.getMeasurementList(paramsGoods);
+			if (measurementList != null && !measurementList.isEmpty()) {
+				typeCd = measurementList.iterator().next().getTypecd();
+				if ("하의".equals(typeCd)) {
+					typeWith = Integer.toString(((int)Math.floor(100 / 6)));
+				}
+			}
+		}
+
+		// 표준사이즈 - 공통
+		SizeInfo sizeInfo = new SizeInfo();
+		sizeInfo.setSizeGb("1"); 	// 사이즈구분정보 1:표준사이즈. 2:측정사이즈
+		sizeInfo.setSizeCate1Cd("00"); 	// 사이즈카테고리1 표준사이즈일경우   공통(00),자사브랜드코드)
+		Collection<SizeInfo> commonSizeInfoList = goodsService.getSizeInfoList(sizeInfo);
+
+		// 표준사이즈 - 자사브랜드
+		Collection<SizeInfo> brandSizeInfoList = new ArrayList<SizeInfo>();
+		if ("Y".equals(goods.getSelfGoodsYn())) {
+			sizeInfo.setSizeCate1Cd(goods.getBrandCd());	// 자사브랜드코드(브랜드그룹코드아님)
+			brandSizeInfoList = goodsService.getSizeInfoList(sizeInfo);
+		}
+
+		// 측정사이즈
+		sizeInfo.setSizeGb("2");
+		sizeInfo.setSizeCate1Cd("");
+		Collection<SizeInfo> measurementSizeInfoList = goodsService.getSizeInfoList(sizeInfo);
+
+		mav.addObject("measurementList", measurementList);
+		mav.addObject("typeCd", typeCd);
+		mav.addObject("typeWith", typeWith);
+		mav.addObject("commonSizeInfoList", commonSizeInfoList);
+		mav.addObject("brandSizeInfoList", brandSizeInfoList);
+		mav.addObject("measurementSizeInfoList", measurementSizeInfoList);
+
 		mav.setViewName(super.getDeviceViewName("goods/GoodsSizeInfoForm"));
 		return mav;
 	}
-	
+
 	/**
 	 * 상품상세 -  재입고 레이어
 	 * @return
@@ -494,17 +555,31 @@ public class TsfGoodsController extends TsfBaseController {
 		paramsGoods.setColorCd(colorCd);
 		setGoods(paramsGoods);
 		Goods goods = goodsService.getGoodsInfo(paramsGoods);
-		
+
 		// 상품 기본정보
 		mav.addObject("goodsInfo", goods);
-		
+
 		// 자사 일반상품- 옵션2(사이즈) 정보
 		mav.addObject("goodsOption2List", goodsService.getGoodsOption2List(paramsGoods));
 
 		mav.setViewName(super.getDeviceViewName("goods/GoodsInstockAlarmForm"));
 		return mav;
 	}
-	
+
+	/**
+	 * 상품상세 -  재입고 등록
+	 * @return
+	 * @author eskim
+	 * @since 2021. 3. 10
+	 */
+	@PostMapping("/instock/alarm/save")
+	@ResponseBody
+	public GagaResponse saveGoodsInstockAlarmForm(@RequestBody ReinboundInform reinboundInform) {
+		log.info("reinboundInform {}", reinboundInform);
+		goodsService.saveGoodsInstockAlarmForm(reinboundInform);
+		return super.ok("재입고 알림 신청이 완료되었습니다. 재입고 시 알림톡이 발송됩니다.");
+	}
+
 	/**
 	 * 상품상세 -  상품평 레이어
 	 * @return
@@ -519,14 +594,14 @@ public class TsfGoodsController extends TsfBaseController {
 		paramsGoods.setGoodsCd(goodsCd);
 		setGoods(paramsGoods);
 		Goods goods = goodsService.getGoodsInfo(paramsGoods);
-		
+
 		// 상품 기본정보
 		mav.addObject("goodsInfo", goods);
 
 		mav.setViewName(super.getDeviceViewName("goods/GoodsReviewForm"));
 		return mav;
 	}
-	
+
 	/**
 	 * 상품상세 -  상품평 - 베스트 레이어
 	 * @return
@@ -541,14 +616,14 @@ public class TsfGoodsController extends TsfBaseController {
 		paramsGoods.setGoodsCd(goodsCd);
 		setGoods(paramsGoods);
 		Goods goods = goodsService.getGoodsInfo(paramsGoods);
-		
+
 		// 상품 기본정보
 		mav.addObject("goodsInfo", goods);
 
 		mav.setViewName(super.getDeviceViewName("goods/GoodsReviewBestForm"));
 		return mav;
 	}
-	
+
 	/**
 	 * 상품상세 -  상품평 - 포토/영상 리스트 레이어
 	 * @return
@@ -563,14 +638,14 @@ public class TsfGoodsController extends TsfBaseController {
 		paramsGoods.setGoodsCd(goodsCd);
 		setGoods(paramsGoods);
 		Goods goods = goodsService.getGoodsInfo(paramsGoods);
-		
+
 		// 상품 기본정보
 		mav.addObject("goodsInfo", goods);
 
 		mav.setViewName(super.getDeviceViewName("goods/GoodsReviewPhotoForm"));
 		return mav;
 	}
-	
+
 	/**
 	 * 상품상세 -  상품평 - 포토/영상 상세 레이어
 	 * @return
@@ -585,14 +660,14 @@ public class TsfGoodsController extends TsfBaseController {
 		paramsGoods.setGoodsCd(goodsCd);
 		setGoods(paramsGoods);
 		Goods goods = goodsService.getGoodsInfo(paramsGoods);
-		
+
 		// 상품 기본정보
 		mav.addObject("goodsInfo", goods);
 
 		mav.setViewName(super.getDeviceViewName("goods/GoodsReviewPhotoDetailForm"));
 		return mav;
 	}
-	
+
 	/**
 	 * 상품상세 - 다다익선 상품
 	 * 
@@ -614,7 +689,7 @@ public class TsfGoodsController extends TsfBaseController {
 		mav.setViewName(super.getDeviceViewName("goods/GoodsOtherForm"));
 		return mav;
 	}
-	
+
 	/**
 	 * 상품상세 - 함께본 상품
 	 * 
@@ -623,7 +698,7 @@ public class TsfGoodsController extends TsfBaseController {
 	 * @since 2021. 3. 8
 	 */
 	@PostMapping("/detail/together/frame")
-	public ModelAndView goodsTogetherForm(Goods goods) {  
+	public ModelAndView goodsTogetherForm(Goods goods) {
 
 		ModelAndView mav = new ModelAndView();
 		// 상품관련 기본값 설정(회원 등급, 앱, PC/모바일 등)
@@ -636,7 +711,7 @@ public class TsfGoodsController extends TsfBaseController {
 		mav.setViewName(super.getDeviceViewName("goods/GoodsOtherForm"));
 		return mav;
 	}
-	
+
 	/**
 	 * 상품상세 - 추천 상품
 	 * 
@@ -645,7 +720,7 @@ public class TsfGoodsController extends TsfBaseController {
 	 * @since 2021. 3. 8
 	 */
 	@PostMapping("/detail/recommend/frame")
-	public ModelAndView goodsRecommendForm(Goods goods) {  
+	public ModelAndView goodsRecommendForm(Goods goods) {
 
 		ModelAndView mav = new ModelAndView();
 		// 상품관련 기본값 설정(회원 등급, 앱, PC/모바일 등)
@@ -658,7 +733,7 @@ public class TsfGoodsController extends TsfBaseController {
 		mav.setViewName(super.getDeviceViewName("goods/GoodsOtherForm"));
 		return mav;
 	}
-	
+
 	/**
 	 * 상품상세 - 비슷한 상품
 	 * 
@@ -667,7 +742,7 @@ public class TsfGoodsController extends TsfBaseController {
 	 * @since 2021. 3. 8
 	 */
 	@PostMapping("/detail/like/frame")
-	public ModelAndView goodsLikeForm(Goods goods) {  
+	public ModelAndView goodsLikeForm(Goods goods) {
 
 		ModelAndView mav = new ModelAndView();
 		// 상품관련 기본값 설정(회원 등급, 앱, PC/모바일 등)
@@ -680,4 +755,51 @@ public class TsfGoodsController extends TsfBaseController {
 		mav.setViewName(super.getDeviceViewName("goods/GoodsOtherForm"));
 		return mav;
 	}
+
+	/**
+	 * 고객의 상품쿠폰 발급. 고객이 상품쿠폰 다운로드 시 발급됨.
+	 *
+	 * @param params
+	 * @return
+	 * @throws Exception
+	 * @author eskim
+	 * @since 2021. 3. 12.
+	 */
+	@PostMapping(value = "/coupon/download")
+	@ResponseBody
+	public GagaMap createGoodsCoupon(@RequestBody Goods goods) throws Exception {
+
+		GagaMap result = new GagaMap();
+
+		// 상품관련 기본값 설정(회원 등급, 앱, PC/모바일 등)
+		setGoods(goods);
+		log.info("createGoodsCoupon  goods {}", goods);
+
+		// 쿠폰발급
+		// ERROR_10: 발급가능 쿠폰없음, 20: 발급완료 쿠폰, 30: 발급받은 쿠폰
+		//죄송합니다. 쿠폰이 모두 소진되었습니다
+		//죄송합니다. 해당 쿠폰은 다운로드가 불가합니다.
+		String couponResult = goodsService.createGoodsCoupon(goods);
+
+		result.set("status", GagaResponseStatus.SUCCESS.getCode());
+
+		if ("ERROR_10".equals(couponResult)) {
+			result.set("message", "발급가능 쿠폰이 없습니다.");
+		} else if ("ERROR_20".equals(couponResult)) {
+			result.set("message", "죄송합니다. 해당 쿠폰은 다운로드가 불가합니다.");
+		} else if ("ERROR_30".equals(couponResult)) {
+			result.set("message", "죄송합니다. 쿠폰이 모두 소진되었습니다.");
+		} else {
+			if (goods.getArrCpnId() != null || goods.getArrCpnId().length > 0) {
+				result.set("message", couponResult + "개 쿠폰이 발급되었습니다.");
+			} else {
+				result.set("message", "쿠폰이 발급되었습니다.");
+			}
+
+		}
+		result.set("status", "200");
+		result.set("params", goods);
+		result.set("goodsCouponList", couponService.getGoodsCouponList(goods));
+		return result;
+	}
 }

+ 61 - 3
src/main/java/com/style24/front/biz/web/TsfMypageController.java

@@ -4,6 +4,7 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
 
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -14,6 +15,8 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.ResponseBody;
 import org.springframework.web.servlet.ModelAndView;
 
+import com.gagaframework.web.parameter.GagaMap;
+import com.gagaframework.web.rest.server.GagaResponseStatus;
 import com.style24.core.biz.service.TscCustomerService;
 import com.style24.core.biz.service.TscKakaoPayService;
 import com.style24.core.biz.service.TscOrderChangeService;
@@ -35,15 +38,13 @@ import com.style24.front.support.security.session.TsfSession;
 import com.style24.persistence.TscPageRequest;
 import com.style24.persistence.domain.Coupon;
 import com.style24.persistence.domain.Customer;
+import com.style24.persistence.domain.GiftCard;
 import com.style24.persistence.domain.Order;
 import com.style24.persistence.domain.Point;
 import com.style24.persistence.domain.WishList;
 
 import lombok.extern.slf4j.Slf4j;
 
-import com.gagaframework.web.parameter.GagaMap;
-import com.gagaframework.web.rest.server.GagaResponseStatus;
-
 /**
  * 마이페이지 Controller
  * 
@@ -500,6 +501,15 @@ public class TsfMypageController extends TsfBaseController {
 	@GetMapping("/point/form")
 	public ModelAndView stylePointForm(Point point) {
 		ModelAndView mav = new ModelAndView();
+
+		// 테스트용 (삭제예정)
+		GagaMap map = new GagaMap();
+		map.setString("custIp", TsfSession.getIpAddress());
+		map.setString("bankNm", "김지철");
+		map.setString("accountNo", "110500288201");
+		map.setString("bankCd", "88");
+		coreOrderService.checkAccount(map);
+		// 테스트용 (삭제예정)
 		
 		int custNo = TsfSession.getInfo().getCustNo();
 		point.setCustNo(custNo);
@@ -629,4 +639,52 @@ public class TsfMypageController extends TsfBaseController {
 
 		return result;
 	}
+	
+	
+	/**
+	 * 마이페이지 상품권화면
+	 *
+	 * @return
+	 * @author sowon	
+	 * @since 2021. 03. 12
+	 */
+	@GetMapping({"/gift/card/form"})
+	public ModelAndView mypageGiftcardForm(GiftCard giftcard) {
+		ModelAndView mav = new ModelAndView();
+		// 상품권 기본정보
+		mav.addObject("giftcardInfo", giftcardService.getGiftcardInfo(giftcard));
+		mav.setViewName(super.getDeviceViewName("mypage/MypageGiftcardForm"));
+
+		return mav;
+	}
+	
+	/**
+	 * 마이페이지 상품권 사용 리스트
+	 *
+	 * @return
+	 * @author sowon	
+	 * @since 2021. 03. 12
+	 */
+	@PostMapping("/gift/use/list")
+	@ResponseBody
+	public GagaMap getGiftcardUseList(@RequestBody GiftCard giftcard) {
+		GagaMap result = new GagaMap();
+		result.set("giftcardUseList",giftcardService.getGiftcardUseList(giftcard));
+		return result;
+	}
+	
+	/**
+	 * 마이페이지 상품권 보유 리스트
+	 *
+	 * @return
+	 * @author sowon	
+	 * @since 2021. 03. 12
+	 */
+	@PostMapping("/gift/own/list")
+	@ResponseBody
+	public GagaMap getGiftcardOwnList(@RequestBody GiftCard giftcard) {
+		GagaMap result = new GagaMap();
+		result.set("giftcardOwnList",giftcardService.getGiftcardOwnList(giftcard));
+		return result;
+	}
 }

+ 69 - 177
src/main/java/com/style24/front/biz/web/TsfOrderController.java

@@ -18,12 +18,10 @@ import org.springframework.web.servlet.ModelAndView;
 import org.springframework.web.servlet.mvc.support.RedirectAttributes;
 
 import com.gagaframework.web.parameter.GagaMap;
-import com.gagaframework.web.rest.server.GagaResponseStatus;
 import com.style24.core.biz.service.TscFreegiftService;
 import com.style24.core.biz.service.TscKakaoPayService;
 import com.style24.core.biz.service.TscNaverPayService;
 import com.style24.core.biz.service.TscOrderService;
-import com.style24.core.support.env.TscConstants;
 import com.style24.core.support.message.TscMessageByLocale;
 import com.style24.front.biz.service.TsfCartService;
 import com.style24.front.biz.service.TsfOrderService;
@@ -339,9 +337,10 @@ public class TsfOrderController extends TsfBaseController {
 		} 
 		
 		ModelAndView mav = new ModelAndView();
-		mav.addObject("freegiftGoodsList"	, resultMap.get("freegiftGoodsList"));		// 사은품상품정보 목록
-		mav.addObject("freegiftList"		, resultMap.get("freegiftList"));			// 사은품정보 목록
-		mav.addObject("order"				, order);									// 파라미터
+		mav.addObject("freegiftApplyAmtList"	, resultMap.get("freegiftApplyAmtList"));	// 사은품장바구니목록
+		mav.addObject("freegiftGoodsList"		, resultMap.get("freegiftGoodsList"));		// 사은품상품정보 목록
+		mav.addObject("freegiftList"			, resultMap.get("freegiftList"));			// 사은품정보 목록
+		mav.addObject("order"					, order);									// 파라미터
 		
 		mav.setViewName(super.getDeviceViewName("order/OrderFreegiftInfo"));
 		
@@ -480,9 +479,23 @@ public class TsfOrderController extends TsfBaseController {
 	@ResponseBody
 	@RequestMapping(value = "/pay/result/response")
 	public ModelAndView payResultResponse(Payment param, HttpServletRequest request, HttpServletResponse response) {
+		
 		ModelAndView mav = new ModelAndView();
-		// 장바구니 시퀀스 배열 : param.getCartSqArr();
-
+		
+		// 1. 로그인체크 후 custNo 설정
+		if (TsfSession.isLogin()) {
+			param.setCustNo(TsfSession.getInfo().getCustNo()); // 고객번호등록
+		} else {
+			param.setCustNo(0);
+		}
+		
+		param.setUpdNo(param.getCustNo());
+		
+		// 7. 결재정보등록(TB_PAYMENT)
+		param = orderService.orderPgPayResult(param, request, response);
+		
+		log.info("param.getOrdNo() ::: {}", param.getOrdNo());
+		
 		// TODO 주문정보 업데이트
 		// 1. 주문상태업데이트
 		// 2. 재고처리
@@ -491,16 +504,38 @@ public class TsfOrderController extends TsfBaseController {
 		// 5. 쿠폰사용처리
 		// 6. 상품권사용처리
 
-		// 테스트용 데이터 세팅
-		param.setPaySq(3);
-		param.setCustNo(TsfSession.getInfo().getCustNo() == null ? 0 : TsfSession.getInfo().getCustNo());
-		param.setUpdNo(param.getCustNo());
+		mav.addObject("payment", param);
+
+		mav.setViewName(super.getDeviceViewName("pg/kcpOrder"));
+		return mav;
+	}
+	
+	/**
+	 * 주문완료페이지
+	 *
+	 * @param
+	 * @return
+	 * @author xodud1202
+	 * @since 2021. 03. 05
+	 */
+	@ResponseBody
+	@RequestMapping(value = "/order/complete")
+	public ModelAndView orderComplete(Order order) {
 		
+		ModelAndView mav = new ModelAndView();
 		
-		// 7. 결재정보등록(TB_PAYMENT)
-		param = orderService.orderPgPayResult(param, request, response);
+		// 1. 로그인체크 후 custNo 설정
+		if (TsfSession.isLogin()) {
+			order.setCustNo(TsfSession.getInfo().getCustNo()); // 고객번호등록
+		} else {
+			order.setCustNo(0);
+		}
+		
+		log.info("order.getOrdNo() ::: {}", order.getOrdNo());
+		
+		// TODO 주문정보조회
 
-		mav.addObject("payment", param);
+		//mav.addObject("payment", order);
 
 		mav.setViewName(super.getDeviceViewName("pg/kcpOrder"));
 		return mav;
@@ -820,6 +855,12 @@ public class TsfOrderController extends TsfBaseController {
 		log.info("order.getOrdNm()             ::: {}", order.getOrdNm());
 		log.info("order.getOrdPhnno()          ::: {}", order.getOrdPhnno());
 		log.info("order.getCustNo()            ::: {}", order.getCustNo());
+		log.info("order.getFreegiftValArr()    ::: {}", order.getFreegiftValArr());
+		log.info("order.getFreegiftValArr()    ::: {}", order.getFreegiftValArr());
+		log.info("order.getFreegiftSqArr()     ::: {}", order.getFreegiftSqArr());
+		for(int i = 0 ; i < order.getFreegiftGoodsArr().length ; i++) {
+			log.info("order.getFreegiftGoodsArr()  ::: {}", order.getFreegiftGoodsArr()[i]);
+		}
 
 		// TODO PG 데이터 세팅 처리 (order)
 		// 필수 데이터
@@ -836,6 +877,7 @@ public class TsfOrderController extends TsfBaseController {
 		payAmt = 결제금액
 		======================
 		*/
+
 		Payment payment = orderService.setPgDataInfo(order);
 
 		mav.addObject("payment", payment);
@@ -848,36 +890,11 @@ public class TsfOrderController extends TsfBaseController {
 		//return super.getDeviceViewName("pg/kcpOrder");
 	}
 
-	/**
-	 * 카카오페이 결제준비 처리
-	 *
-	 * @param Order
-	 * @return KakaoPay
-	 * @author card007
-	 * @since 2021. 03. 03
-	 */
-	@RequestMapping(value = "/kakao/payment/ready")
-	@ResponseBody
-	public GagaMap kakaoPaymentReady(@RequestBody Order order) {
-		GagaMap result = new GagaMap();
-
-		if (TsfSession.getInfo().getCustNo() == null) {
-			order.setCustNo(0);
-		} else {
-			order.setCustNo(TsfSession.getInfo().getCustNo());
-		}
-
-		result.set("kakaoPay", kakaoPayService.kakaoPaymentReady(order));
-		result.set("status", GagaResponseStatus.SUCCESS.getCode());
-
-		return result;
-	}
-
 	/**
 	 * 카카오페이 결제 요청 처리
 	 *
-	 * @param Order
-	 * @return GagaMap
+	 * @param String
+	 * @return ModelAndView
 	 * @author card007
 	 * @since 2021. 03. 04
 	 */
@@ -893,68 +910,11 @@ public class TsfOrderController extends TsfBaseController {
 		return mav;
 	}
 
-	/**
-	 * 카카오페이 결제 승인 처리
-	 *
-	 * @param Order
-	 * @return GagaMap
-	 * @author card007
-	 * @since 2021. 03. 04
-	 */
-	@RequestMapping(value = "/kakao/payment/approve")
-	@ResponseBody
-	public GagaMap approveKakaoPayment(@RequestBody Payment payment) {
-		GagaMap result = new GagaMap();
-
-		result.set("payment", kakaoPayService.approveKakaoPayment(payment));
-		result.set("status", GagaResponseStatus.SUCCESS.getCode());
-
-		return result;
-	}
-
-	/**
-	 * 카카오페이 결제 조회
-	 *
-	 * @param Order
-	 * @return GagaMap
-	 * @author card007
-	 * @since 2021. 03. 04
-	 */
-	@RequestMapping(value = "/kakao/payment/order")
-	@ResponseBody
-	public GagaMap kakaoPaymentOrder(@RequestBody Payment payment) {
-		GagaMap result = new GagaMap();
-
-		result.set("kakaoPay", kakaoPayService.getKakaoPaymentOrder(payment));
-		result.set("status", GagaResponseStatus.SUCCESS.getCode());
-
-		return result;
-	}
-
-	/**
-	 * 카카오페이 결제 취소
-	 *
-	 * @param Order
-	 * @return GagaMap
-	 * @author card007
-	 * @since 2021. 03. 04
-	 */
-	@RequestMapping(value = "/kakao/payment/cancel")
-	@ResponseBody
-	public GagaMap cancelKakaoPayment(@RequestBody Payment payment) {
-		GagaMap result = new GagaMap();
-
-		result.set("kakaoPay", kakaoPayService.cancelKakaoPayment(payment));
-		result.set("status", GagaResponseStatus.SUCCESS.getCode());
-
-		return result;
-	}
-
 	/**
 	 * 네이버페이 결제 요청 처리
 	 *
-	 * @param Order
-	 * @return GagaMap
+	 * @param String
+	 * @return ModelAndView
 	 * @author card007
 	 * @since 2021. 03. 04
 	 */
@@ -971,85 +931,17 @@ public class TsfOrderController extends TsfBaseController {
 	}
 
 	/**
-	 * 네이버페이 결제준비 처리
-	 *
-	 * @param Order
-	 * @return NaverPay
-	 * @author card007
-	 * @since 2021. 03. 07
-	 */
-	@RequestMapping(value = "/naver/payment/ready")
-	@ResponseBody
-	public GagaMap naverPaymentReady(@RequestBody Order order) {
-		GagaMap result = new GagaMap();
-
-		if (TsfSession.getInfo().getCustNo() == null) {
-			order.setCustNo(0);
-		} else {
-			order.setCustNo(TsfSession.getInfo().getCustNo());
-		}
-
-		result.set("naverPay", naverPayService.naverPaymentReady(order));
-		result.set("status", GagaResponseStatus.SUCCESS.getCode());
-
-		return result;
-	}
-
-	/**
-	 * 네이버페이 결제 승인 처리
+	 * 주문 데이터 생성
 	 *
-	 * @param Order
-	 * @return GagaMap
-	 * @author card007
+	 * @param
+	 * @return
+	 * @author xodud1202
 	 * @since 2021. 03. 04
 	 */
-	@RequestMapping(value = "/naver/payment/approve")
-	@ResponseBody
-	public GagaMap approveNaverPayment(@RequestBody Payment payment) {
-		GagaMap result = new GagaMap();
-
-		result.set("payment", naverPayService.approveNaverPayment(payment));
-		result.set("status", GagaResponseStatus.SUCCESS.getCode());
-
-		return result;
-	}
-
-	/**
-	 * 네이버페이 결제 조회
-	 *
-	 * @param Order
-	 * @return GagaMap
-	 * @author card007
-	 * @since 2021. 03. 09
-	 */
-	@RequestMapping(value = "/naver/payment/order")
-	@ResponseBody
-	public GagaMap naverPaymentOrder(@RequestBody Payment payment) {
-		GagaMap result = new GagaMap();
-
-		result.set("naverPay", naverPayService.getNaverPaymentOrder(payment));
-		result.set("status", GagaResponseStatus.SUCCESS.getCode());
-
-		return result;
-	}
-
-	/**
-	 * 네이버페이 결제 취소
-	 *
-	 * @param Order
-	 * @return GagaMap
-	 * @author card007
-	 * @since 2021. 03. 09
-	 */
-	@RequestMapping(value = "/naver/payment/cancel")
-	@ResponseBody
-	public GagaMap cancelNaverPayment(@RequestBody Payment payment) {
-		GagaMap result = new GagaMap();
-
-		result.set("naverPay", naverPayService.cancelNaverPayment(payment));
-		result.set("status", GagaResponseStatus.SUCCESS.getCode());
-
-		return result;
+	@RequestMapping(value = "/test")
+	public ModelAndView test() {
+		ModelAndView mav = new ModelAndView();
+		mav.setViewName("web/order/test");
+		return mav;
 	}
-
 }

+ 54 - 0
src/main/java/com/style24/front/biz/web/TsfSocialController.java

@@ -0,0 +1,54 @@
+package com.style24.front.biz.web;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.servlet.ModelAndView;
+
+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.Social;
+
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * 소셜(핫딜) Controller
+ * 
+ * @author sowon
+ * @since 2021. 3. 11
+ */
+@Controller
+@RequestMapping("/social")
+@Slf4j
+public class TsfSocialController extends TsfBaseController {
+	
+	@Autowired
+	private TsfSocialService socialService;
+	/**
+	 * 소셜(핫딜) 메인 화면
+	 * 
+	 * @return
+	 * @author sowon
+	 * @since 2021. 3. 11
+	 */
+	@GetMapping("/main/form")
+	public ModelAndView socialMainForm(Social social) throws Exception {
+		ModelAndView mav = new ModelAndView();
+		
+		// 디바이스 set
+		social.setFrontGb(TsfSession.getFrontGb());
+		
+		// 소셜(핫딜) 
+		mav.addObject("socialInfo", socialService.getSocialInfo(social));
+		
+		// 소셜(핫딜)-상품목록
+		mav.addObject("socialGoods", socialService.getSocialGoodsList(social));
+	
+		mav.setViewName(super.getDeviceViewName("social/SocialMainForm"));
+		return mav;
+	}
+	
+
+}

+ 30 - 0
src/main/java/com/style24/front/support/env/TsfConstants.java

@@ -22,6 +22,36 @@ public class TsfConstants {
 	// 로그인블락실패건수
 	public static final int LOGIN_BLOCK_FAIL_CNT = 10;
 
+	// 카테고리구분
+	public enum CateGb {
+		BYITEM("G032_101"), BYBRAND("G032_102"), BYOUTLET("G032_103");
+
+		private String value;
+
+		private CateGb(String value) {
+			this.value = value;
+		}
+
+		public String value() {
+			return value;
+		}
+	}
+
+	// 카테고리유형
+	public enum CateType {
+		GOODS("G031_10"), CONTENTS("G031_20");
+
+		private String value;
+
+		private CateType(String value) {
+			this.value = value;
+		}
+
+		public String value() {
+			return value;
+		}
+	}
+
 //	// 카테고리구분
 //	public enum CATE_GB {
 //		BYITEM("101"), BYBRAND("102"), BYOUTLET("103");

+ 22 - 0
src/main/java/com/style24/front/support/exception/TsfNonCertificationAccountException.java

@@ -0,0 +1,22 @@
+package com.style24.front.support.exception;
+
+import org.springframework.security.core.AuthenticationException;
+
+/**
+ * 비인증 고객 로그인시 발생하는 예외
+ *
+ * @author jsshin
+ * @since 2021. 03. 10
+ */
+@SuppressWarnings("serial")
+public class TsfNonCertificationAccountException extends AuthenticationException {
+
+	public TsfNonCertificationAccountException(String msg) {
+		super(msg);
+	}
+
+	public TsfNonCertificationAccountException(String msg, Throwable t) {
+		super(msg, t);
+	}
+
+}

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

@@ -3,8 +3,11 @@ package com.style24.front.support.security;
 import java.util.ArrayList;
 import java.util.List;
 
+import com.gagaframework.web.util.GagaCookieUtil;
+import com.style24.front.support.exception.TsfNonCertificationAccountException;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.security.authentication.AuthenticationProvider;
 import org.springframework.security.authentication.BadCredentialsException;
 import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
@@ -49,6 +52,11 @@ public class TsfAuthenticationProvider implements AuthenticationProvider {
 	@Autowired
 	private GagaPasswordEncoder passwordEncoder;
 
+	@Value("${has-ssl}")
+	private String hasSsl;
+
+	private static final int LOGIN_FAIL_COUNT = 5; // 실패누적건수
+
 	@Override
 	public Authentication authenticate(Authentication authentication) throws AuthenticationException {
 		String loginId = authentication.getName();
@@ -78,7 +86,7 @@ public class TsfAuthenticationProvider implements AuthenticationProvider {
 		}
 
 		// 로그인 실패누적건수가 5회 이상이면
-		if (loginInfo.getLoginFailCnt() >= 5) {
+		if (loginInfo.getLoginFailCnt() >= LOGIN_FAIL_COUNT) {
 			throw new TsfLockedAccountException(message.getMessage("LOGN_0005"));
 		}
 
@@ -93,9 +101,15 @@ public class TsfAuthenticationProvider implements AuthenticationProvider {
 			}
 		}
 
+		// 본인인증이 필요한 회원
+		if (StringUtils.isBlank(loginInfo.getCi())) {
+			TsfSession.setAttribute("custNo", String.valueOf(loginInfo.getCustNo()));
+			throw new TsfNonCertificationAccountException(message.getMessage("LOGN_0009"));
+		}
+
 		if (TscConstants.CustStat.DORMANT.value().equals(loginInfo.getCustStat())) { // 휴면회원
 
-			// 휴면해제를 위한 고객번호 세선저장
+			// 휴면해제를 위한 고객번호 세저장
 			TsfSession.setAttribute("custNo", String.valueOf(loginInfo.getCustNo()));
 			throw new TsfDormantAccountException(message.getMessage("LOGN_0006"));
 

+ 3 - 0
src/main/java/com/style24/front/support/security/handler/TsfLoginFailureHandler.java

@@ -6,6 +6,7 @@ import javax.servlet.ServletException;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
+import com.style24.front.support.exception.TsfNonCertificationAccountException;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.core.AuthenticationException;
 import org.springframework.security.web.authentication.AuthenticationFailureHandler;
@@ -57,6 +58,8 @@ public class TsfLoginFailureHandler implements AuthenticationFailureHandler {
 			result.setString("status", "SESSION_EXPIRED");
 		} else if (exception instanceof TsfEmailDuplicationException) { // SNS용 이메일 중복 시
 			result.setString("status", "EMAIL_DUP");
+		} else if (exception instanceof TsfNonCertificationAccountException){ //본인인증 필요한 회원
+			result.setString("status","CI_EMPTY");
 		} else {
 			result.setString("status", "ETC_ERROR");
 		}

+ 16 - 1
src/main/java/com/style24/front/support/security/handler/TsfLoginSuccessHandler.java

@@ -45,8 +45,12 @@ public class TsfLoginSuccessHandler implements AuthenticationSuccessHandler {
 		"/customer/pwd/find/form",					// 비밀번호찾기
 		"/customer/join/complete/form",				// 회원가입완료
 		"/customer/join/type/form",					// 회원가입유형
-		"/customer/dormant/certify/complete/form"	// 휴면해제
+		"/customer/dormant/certify/complete/form",	// 휴면해제
+		"/customer/certification/form"				// 본인인증화면
 	};
+	private static final int CHANG_PWD_CAMPAIGN_DAY = 90; // 비밀번호 변경 캠페인일자
+
+	private static final String CHANG_TEMP_PWD = "Y";	//임시비밀번호여부
 
 	@Autowired
 	private TsfLoginService loginService;
@@ -112,6 +116,17 @@ public class TsfLoginSuccessHandler implements AuthenticationSuccessHandler {
 		// 로그인 후 장바구니 Update
 		cartService.updateCartToAfterLogin(custNo);
 
+		// 비밀번호 변경 캠페인 일자
+		if (loginDetails.getLoginInfo().getPwdChgDay() >= CHANG_PWD_CAMPAIGN_DAY) {
+			returnUrl ="/customer/password/campaign/form";
+		}
+
+		// 임시비밀번호로 로그인 한 경우
+		if (CHANG_TEMP_PWD.equals(loginDetails.getLoginInfo().getTempPasswdYn())) {
+			returnUrl ="/customer/password/change/form?pageGb=temp";
+		}
+
+
 		GagaMap result = new GagaMap();
 		result.setString("status", "OK");
 		result.setString("returnUrl", returnUrl);

+ 26 - 0
src/main/java/com/style24/persistence/domain/BrandGroup.java

@@ -0,0 +1,26 @@
+package com.style24.persistence.domain;
+
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Data;
+
+/**
+ * 컨텐츠 Domain
+ * 
+ * @author gagamel
+ * @since 2021. 3. 11
+ */
+@SuppressWarnings("serial")
+@Data
+public class BrandGroup extends TscBaseDomain {
+
+	private String title;			// 브랜드그룹타이틀
+	private Integer brandGroupNo;	// 브랜드그룹번호
+	private String brandGroupEnm;	// 브랜드그룹영문명
+	private String brandGroupKnm;	// 브랜드그룹한글명
+	private String brandGroupNm;	// 전시브랜드그룹명
+	private String logoFileNm;		// 로고파일명
+	private int dispOrd;			// 표시순서
+	private String rgbCd;			// RGB코드(front 브랜드메인 GNB 색상)
+
+}

+ 37 - 0
src/main/java/com/style24/persistence/domain/Cate1.java

@@ -0,0 +1,37 @@
+package com.style24.persistence.domain;
+
+import java.util.Collection;
+
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Data;
+
+/**
+ * 카테고리1 Domain
+ *
+ * @author gagamel
+ * @since 2021. 3. 11
+ */
+@SuppressWarnings("serial")
+@Data
+public class Cate1 extends TscBaseDomain {
+
+	private Integer cate1No;
+	private String cate1Nm;
+	private String siteCd;
+	private String cateGb;
+	private String cateType;
+	private String leafYn;
+	private int dispOrd;
+	private String formalGb;
+	private String contentsLoc;
+
+	private String soldoutGoodsDispYn;	// 품절상품전시여부
+
+	// 카테고리2 목록
+	private Collection<Cate2> cate2List;
+
+	// 카테고리1의 배너 목록
+	private Collection<Contents> bannerList;
+
+}

+ 34 - 0
src/main/java/com/style24/persistence/domain/Cate2.java

@@ -0,0 +1,34 @@
+package com.style24.persistence.domain;
+
+import java.util.Collection;
+
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Data;
+
+/**
+ * 카테고리2 Domain
+ *
+ * @author gagamel
+ * @since 2021. 3. 11
+ */
+@SuppressWarnings("serial")
+@Data
+public class Cate2 extends TscBaseDomain {
+
+	private Integer cate2No;
+	private String cate2Nm;
+	private String siteCd;
+	private String cateGb;
+	private Integer cate1No;
+	private String cateType;
+	private String leafYn;
+	private int dispOrd;
+	private String formalGb;
+	private String contentsLoc;
+
+	private String soldoutGoodsDispYn;	// 품절상품전시여부
+
+	private Collection<Cate3> cate3List;
+
+}

+ 35 - 0
src/main/java/com/style24/persistence/domain/Cate3.java

@@ -0,0 +1,35 @@
+package com.style24.persistence.domain;
+
+import java.util.Collection;
+
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Data;
+
+/**
+ * 카테고리3 Domain
+ *
+ * @author gagamel
+ * @since 2021. 3. 11
+ */
+@SuppressWarnings("serial")
+@Data
+public class Cate3 extends TscBaseDomain {
+
+	private Integer cate3No;
+	private String cate3Nm;
+	private String siteCd;
+	private String cateGb;
+	private Integer cate1No;
+	private Integer cate2No;
+	private String cateType;
+	private String leafYn;
+	private int dispOrd;
+	private String formalGb;
+	private String contentsLoc;
+
+	private String soldoutGoodsDispYn;	// 품절상품전시여부
+
+	private Collection<Cate4> cate4List;
+
+}

+ 36 - 0
src/main/java/com/style24/persistence/domain/Cate4.java

@@ -0,0 +1,36 @@
+package com.style24.persistence.domain;
+
+import java.util.Collection;
+
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Data;
+
+/**
+ * 카테고리4 Domain
+ *
+ * @author gagamel
+ * @since 2021. 3. 11
+ */
+@SuppressWarnings("serial")
+@Data
+public class Cate4 extends TscBaseDomain {
+
+	private Integer cate4No;
+	private String cate4Nm;
+	private String siteCd;
+	private String cateGb;
+	private Integer cate1No;
+	private Integer cate2No;
+	private Integer cate3No;
+	private String cateType;
+	private String leafYn;
+	private int dispOrd;
+	private String formalGb;
+	private String contentsLoc;
+
+	private String soldoutGoodsDispYn;	// 품절상품전시여부
+
+	private Collection<Cate5> cate5List;
+
+}

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

@@ -35,4 +35,8 @@ public class Cate4Srch extends TscBaseDomain {
 	private String formalGb;
 	private String contentsLoc;
 
+	private Integer brandGroupNo;	// 브랜드그룹번호
+
+	private String soldoutGoodsDispYn;
+
 }

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

@@ -0,0 +1,33 @@
+package com.style24.persistence.domain;
+
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Data;
+
+/**
+ * 카테고리5 Domain
+ *
+ * @author gagamel
+ * @since 2021. 3. 11
+ */
+@SuppressWarnings("serial")
+@Data
+public class Cate5 extends TscBaseDomain {
+
+	private Integer cate5No;
+	private String cate5Nm;
+	private String siteCd;
+	private String cateGb;
+	private Integer cate1No;
+	private Integer cate2No;
+	private Integer cate3No;
+	private Integer cate4No;
+	private String cateType;
+	private String leafYn;
+	private int dispOrd;
+	private String formalGb;
+	private String contentsLoc;
+
+	private String soldoutGoodsDispYn;	// 품절상품전시여부
+
+}

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

@@ -0,0 +1,60 @@
+package com.style24.persistence.domain;
+
+import com.style24.persistence.TscBaseDomain;
+import lombok.Data;
+
+import java.util.Collection;
+
+/**
+ * 컨텐츠 Domain
+ * 
+ * @author gagamel
+ * @since 2021. 3. 11
+ */
+@SuppressWarnings("serial")
+@Data
+public class Contents extends TscBaseDomain {
+
+	private Integer preContentsSq;	// 컨텐츠미리보기일련번호
+	private Integer contentsSq;		// 컨텐츠일련번호
+	private Integer cateNo;			// 카테고리번호
+	private String contentsLoc;		// 컨텐츠위치
+	private String contentsType;	// 컨텐츠유형
+	private String dispStdt;		// 전시시작일시
+	private String dispEddt;		// 전시종료일시
+	private int dispOrd;			// 표시순서
+	private String imgPath1;		// 이미지경로1
+	private String imgPath2;		// 이미지경로2
+	private String imgPath3;		// 이미지경로3
+	private String imgPath4;		// 이미지경로4
+	private String imgPath5;		// 이미지경로5
+	private String imgPath6;		// 이미지경로6
+	private String imgPath7;		// 이미지경로7
+	private String imgPath8;		// 이미지경로8
+	private String strVar1;			// 링크필드1
+	private String strVar2;			// 링크필드2
+	private String strVar3;			// 링크필드3
+	private String strVar4;			// 링크필드4
+	private String strVar5;			// 링크필드5
+	private String strVar6;			// 링크필드6
+	private String strVar7;			// 링크필드7
+	private String strVar8;			// 링크필드8
+	private String strTitle1;		// 제목필드1
+	private String strTitle2;		// 제목필드2
+	private String strTitle3;		// 제목필드3
+	private String strTitle4;		// 제목필드4
+	private String subText1;		// 서브텍스트1
+	private String subText2;		// 서브텍스트2
+	private String subText3;		// 서브텍스트3
+	private String subText4;		// 서브텍스트4
+	private String brandGroupNo;	// 브랜드그룹번호
+	private String brandGroupImg;	// 브랜드그룹이미지경로
+	private String mdTitle;			// MD타이틀
+
+	private String viewDt;			// 미리보기일시
+	private String preview;			// 미리보기여부
+	private int maxRow;				// 최대ROW
+
+	private Collection<Cate1> cateList;	// 카테고리목록
+
+}

+ 35 - 0
src/main/java/com/style24/persistence/domain/GnbTab.java

@@ -0,0 +1,35 @@
+package com.style24.persistence.domain;
+
+import com.style24.persistence.TscBaseDomain;
+import lombok.Data;
+
+import java.util.Collection;
+
+/**
+ * 컨텐츠 Domain
+ * 
+ * @author gagamel
+ * @since 2021. 3. 11
+ */
+@SuppressWarnings("serial")
+@Data
+public class GnbTab extends TscBaseDomain {
+
+	private Integer preGtabSq;		// GNB탭미리보기일련번호
+	private Integer gtabSq;			// GNB탭일련번호
+	private String gtabGb;			// GNB탭구분(C:공통GNB, B:브랜드GNB)
+	private String gtabNm;			// GNB탭명
+	private String contentsType;	// 컨텐츠유형(C:카테고리, O:아울렛, L:링크)
+	private Integer cate1No;		// 카테고리1번호
+	private Integer brandGroupNo;	// 브랜드그룹번호
+	private String linkUrl;			// 링크URL
+	private String dispStdt;		// 전시시작일시
+	private String dispEddt;		// 전시종료일시
+	private int dispOrd;			// 표시순서
+
+	private String viewDt;			// 미리보기일시
+	private String preview;			// 미리보기여부
+
+	private Collection<Cate1> cateList;	// 카테고리목록
+
+}

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

@@ -1,5 +1,6 @@
 package com.style24.persistence.domain;
 
+import com.fasterxml.jackson.annotation.JsonFormat;
 import com.style24.persistence.TscBaseDomain;
 
 import lombok.Data;
@@ -116,6 +117,7 @@ public class Goods extends TscBaseDomain {
 	private String delvFeeCrite;	//배송비부과기준(공통코드G078)
 
 	private int floorUnit; // 절사단위(1:일원단위절사, 10:십원단위절사, 100:백원단위절사)
+	private Integer cpnId;			// 쿠폰ID
 
 	private String skuModelNo;		// SKUModelNo(WMS)
 	private String compsGoodsCd;	// 세트 구성품 상품번호
@@ -134,7 +136,9 @@ public class Goods extends TscBaseDomain {
 	private String goodsTopDesc;		// 40:상위컨텐츠, 60:상위컨텐츠-모바일
 	private String goodsDownDesc;		// 50:하위컨텐츠, 70:하위컨텐츠-모바일
 	private String goodsDesc;			// 80:상품상세(as-is,입점)
-	
+
 	private String goodsOtherGb;		// tmtb:다다익선상품, together:함께본상품  recommmend:추천상품  like: 비슷한상품
 
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private int[] arrCpnId;				// 쿠폰
 }

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

@@ -9,7 +9,7 @@ import lombok.Data;
 
 /**
  * 고객 Domain
- * 		@JsonSerialize 애노테이션을 지정해야 세션을 레디스에 저장할 수 있다.
+ * @JsonSerialize 애노테이션을 지정해야 세션을 레디스에 저장할 수 있다.
  * @author gagamel
  * @since 2019. 12. 4
  */
@@ -43,6 +43,9 @@ public class Login extends TscBaseDomain {
 	private String loginLdt;		// 최종로그인일시
 	private String loginFailYn;		// 로그인실패여부
 	private String custGrade;		// 고객등급
+	private String tempPasswdYn;	// 임시비밀번호여부
+	private int pwdChgDay;			// 비밀번호변경일자
+	private String ci;				// CI(본인인증여부)
 
 	// 암호화 대상 복호화 처리 =================================================
 	public String getCustNm() {

+ 36 - 0
src/main/java/com/style24/persistence/domain/Measurement.java

@@ -0,0 +1,36 @@
+package com.style24.persistence.domain;
+
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Data;
+
+/**
+ * 실측사이즈 Domain
+ *
+ * @author eskim
+ * @since 2021. 03. 10
+ */
+@SuppressWarnings("serial")
+@Data
+public class Measurement extends TscBaseDomain {
+
+	private String skucode;			// wms옵션번호
+	private Integer productno;		// wms상품번호
+	private Integer productcode;	// wms상품 코드
+	private String typecd;			// 상하의타입 - 상의, 하의
+	private String washingmethod;	// 세탁방법
+	private float value1;			// 치수1
+	private float value2;			// 치수2
+	private float value3;			// 치수3
+	private float value4;			// 치수4
+	private float value5;			// 치수5
+	private String memo;			// 메모
+	private String isuse;			// 사용여부(1: 사용, 0: 미사용)
+	
+	private String optCd;
+	private String optCd1;
+	private String optCd2;
+	private String goodsCd;
+	
+
+}

+ 29 - 0
src/main/java/com/style24/persistence/domain/SizeInfo.java

@@ -0,0 +1,29 @@
+package com.style24.persistence.domain;
+
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Data;
+
+/**
+ * 사이즈정보  Domain
+ *
+ * @author eskim
+ * @since 2021. 01. 26
+ */
+@SuppressWarnings("serial")
+@Data
+public class SizeInfo extends TscBaseDomain {
+
+	private String sizeGb;
+	private String sizeCate1Cd;
+	private String sizeCate1Nm;
+	private String sizeCate2Cd;
+	private String sizeCate2Nm;
+	private String sizeInfo;
+	private int dispOrd;
+	private String useYn;
+
+	private String selfYn;
+	private String brandCd;
+
+}

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

@@ -54,7 +54,15 @@ public class Social extends TscBaseDomain{
 		private float dcRate;			// 할인율
 		private float pntPrate;		// PC 포인트 적립율
 		private float pntMrate;		// MOBILE 포인트 적립율
-
+		private int listPrice;		//정상가
+		private String goodsNm;		// 상품이름
+		private String sysImgNm;	//시스템이미지
+		private String goodsTnm;	//상품타이틀
+		private int stockQtySum;	//상품 재고
+		
+		// 브랜드
+		private String brandKnm;	//브랜드이름(한글)
+		private String brandEnm;	//브랜드이름(영어)
 		
 
 		private String excelFileNm;		// 엑셀파일명

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

@@ -1,5 +1,6 @@
 package com.style24.persistence.domain;
 
+import com.fasterxml.jackson.annotation.JsonFormat;
 import com.style24.persistence.TscBaseDomain;
 
 import lombok.Data;
@@ -20,5 +21,8 @@ public class WishList extends TscBaseDomain {
 	private String ithrCd;
 	private String contentsLoc;
 	private Integer planDtlSq;
+	
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] arrGoodsCd;
 
 }

+ 241 - 0
src/main/java/com/style24/persistence/mybatis/shop/TsfCoupon.xml

@@ -116,6 +116,7 @@
 
 	<!--회원가입 쿠폰-->
 	<select id="getJoinCoupon" parameterType="Coupon" resultType="Coupon">
+		/* TsfCoupon.getJoinCoupon */
 		SELECT CP.CPN_ID
 		     , CP.END_ALIM_YN
 		     , CASE WHEN #{frontGb} = 'P' THEN CP.DC_PVAL
@@ -133,4 +134,244 @@
 		AND   CP.SITE_CD = #{siteCd}
 	</select>
 	
+	<!--상품 쿠폰 조회-->
+	<select id="getGoodsCouponList" parameterType="Goods" resultType="Coupon">
+		/* TsfCoupon.getGoodsCouponList */
+		SELECT A.DC_AMT
+		     , A.DC_VAL
+		     , A.DC_WAY
+		     , A.CPN_ID
+		     , A.CPN_NM
+		     , A.CUST_PUB_LIMIT_QTY
+		     , A.TOT_PUB_LIMIT_QTY
+		     , A.BUY_LIMIT_AMT
+		     , A.MAX_DC_AMT
+		     , A.CPN_TYPE
+		     , A.AVAIL_STDT
+		     , A.AVAIL_EDDT
+		     , A.USABLE_CUST_GRADE
+		     , A.NEW_CUST_YN
+		     , A.CUST_JOIN_STDT 
+		     , A.CUST_JOIN_EDDT
+		     , A.FIRST_ORD_YN
+		     , A.BUY_STDT
+		     , A.BUY_EDDT
+		     , A.CURR_PRICE
+		     , DATE_FORMAT(A.AVAIL_EDDT, '%Y-%m-%d') AS AVAIL_EDDT
+		     , IFNULL((SELECT COUNT(1) FROM TB_CUST_COUPON WHERE CPN_ID = A.CPN_ID AND CUST_NO = #{custNo}),0) AS CUST_COUPON_CNT
+		     , (SELECT COUNT(1) FROM TB_CUST_COUPON WHERE CPN_ID = A.CPN_ID) AS TOT_COUPON_CNT
+		     , RNUM
+		FROM (
+		SELECT   CPN_ID
+		       , CPN_NM
+		       , DC_AMT
+		       , DC_VAL
+		       , DC_WAY
+		       , CUST_PUB_LIMIT_QTY
+		       , TOT_PUB_LIMIT_QTY
+		       , BUY_LIMIT_AMT
+		       , MAX_DC_AMT
+		       , CPN_TYPE
+		       , AVAIL_STDT
+		       , AVAIL_EDDT
+		       , USABLE_CUST_GRADE
+		       , NEW_CUST_YN
+		       , CUST_JOIN_STDT 
+		       , CUST_JOIN_EDDT
+		       , FIRST_ORD_YN
+		       , BUY_STDT
+		       , BUY_EDDT
+		       , CURR_PRICE
+		       , RANK() OVER(ORDER BY DC_AMT DESC)  AS RNUM   -- 할인금액순
+		FROM   (
+		        SELECT CP.CPN_ID                                              -- 쿠폰ID
+		             , CP.CPN_NM                                              -- 쿠폰명
+		             , CP.DC_WAY                                              -- 할인방식
+		             , CP.DC_VAL                                              -- 할인값
+		             , CP.MAX_DC_AMT                                          -- 최대할인금액
+		             , CP.CURR_PRICE                                          -- 즉시쿠폰적용판매가
+		             , CP.CUST_PUB_LIMIT_QTY                                  -- 1인당 발급제한수량
+		             , CP.TOT_PUB_LIMIT_QTY                                   -- 총발행제한수량(0은 무제한)
+		             , CP.BUY_LIMIT_AMT                                       -- 구매제한금액
+		             , CP.CPN_TYPE                                            -- 쿠폰타입
+		             , CP.AVAIL_STDT                                          -- 유효시작일시
+		             , CP.AVAIL_EDDT                                          -- 유효종료일시
+		             , CP.USABLE_CUST_GRADE                                   -- 고객등급(,구분)
+		             , CP.NEW_CUST_YN                                         -- 신규회원여부
+		             , CP.CUST_JOIN_STDT                                      -- 회원가입시작일시(신규회원여부) 
+		             , CP.CUST_JOIN_EDDT                                      -- 회원가입종료일시(신규회원여부)
+		             , CP.FIRST_ORD_YN                                        -- 첫구매여부
+		             , CP.BUY_STDT                                            -- 첫구매시작일시
+		             , CP.BUY_EDDT                                            -- 첫구매종료일시
+		             <![CDATA[
+		             , (CASE WHEN CP.DC_WAY = 'G240_10' THEN
+		                    (CASE WHEN IFNULL(CP.MAX_DC_AMT, 0) >0 AND CP.MAX_DC_AMT < CP.DC_VAL THEN CP.MAX_DC_AMT ELSE CP.DC_VAL END)
+		                ELSE
+		                     (CASE WHEN IFNULL(CP.MAX_DC_AMT, 0) >0 AND CP.MAX_DC_AMT < FLOOR((CP.CURR_PRICE * DC_VAL / 100) / #{pointUnit}) * #{pointUnit} THEN CP.MAX_DC_AMT ELSE FLOOR((CP.CURR_PRICE * CP.DC_VAL / 100) / #{pointUnit}) * #{pointUnit} END)
+		                END) AS DC_AMT
+		              ]]>
+		        FROM   (
+		                SELECT CP.CPN_ID
+		                     , CP.CPN_NM
+		                     , CP.DC_WAY
+		                     , (CASE WHEN 'P' = #{frontGb} THEN CP.DC_PVAL
+		                             WHEN 'M' = #{frontGb} THEN CP.DC_MVAL
+		                             ELSE CP.DC_AVAL END) AS DC_VAL
+		                     , CP.MAX_DC_AMT
+		                     , CP.BUY_LIMIT_AMT
+		                     , CP.CUST_PUB_LIMIT_QTY
+		                     , CP.TOT_PUB_LIMIT_QTY
+		                     , CP.CPN_TYPE
+		                     , CP.NEW_CUST_YN
+		                     , DATE_FORMAT(CP.CUST_JOIN_STDT, '%Y%m%d%H%i%S') AS CUST_JOIN_STDT
+		                     , DATE_FORMAT(CP.CUST_JOIN_EDDT, '%Y%m%d%H%i%S') AS CUST_JOIN_EDDT
+		                     , CP.FIRST_ORD_YN
+		                     , DATE_FORMAT(CP.BUY_STDT, '%Y%m%d%H%i%S') AS BUY_STDT
+		                     , DATE_FORMAT(CP.BUY_EDDT, '%Y%m%d%H%i%S') AS BUY_EDDT
+		                     , IF (CP.PD_GB = 'D', NOW(), CP.AVAIL_STDT) AS AVAIL_STDT
+		                     , IF (CP.PD_GB = 'D', CONCAT(CURRENT_DATE + INTERVAL Cp.AVAIL_DAYS DAY, ' 23:59:59'), CP.AVAIL_EDDT) AS AVAIL_EDDT
+		                     , (SELECT GROUP_CONCAT(USABLE_CUST_GRADE) FROM TB_COUPON_CUST_GRADE WHERE CPN_ID = CP.CPN_ID) AS USABLE_CUST_GRADE
+		                     , G.GOODS_CD
+		                     , FN_GET_BENEFIT_PRICE(#{frontGb},G.GOODS_CD, G.CURR_PRICE,#{custGb}) AS CURR_PRICE
+		                FROM   TB_GOODS G
+		                     , TB_COUPON CP
+		                WHERE  G.GOODS_CD = #{goodsCd}
+		                <if test="cpnId != null and cpnId != ''">
+		                AND    CP.CPN_ID = #{cpnId}
+		                </if>
+		                <if test="arrCpnId != null and arrCpnId != ''">
+		                AND    CP.CPN_ID IN
+		                <foreach collection="arrCpnId" item="item" index="index"  open="(" close=")" separator=",">
+		                UPPER(#{item})
+		                </foreach>
+		                </if>
+		                AND    CP.SITE_CD = #{siteCd}
+		                AND    CP.CPN_STAT = 'G232_11'   -- 쿠폰인 진행중인 쿠폰만
+		                <![CDATA[
+		                AND    NOW() <= IF (CP.PD_GB = 'D', CONCAT(CURRENT_DATE + INTERVAL Cp.AVAIL_DAYS DAY, ' 23:59:59'), CP.AVAIL_EDDT)
+		                ]]>
+		                AND    NOW() BETWEEN CP.DOWN_STDT AND CP.DOWN_EDDT
+		                AND    CP.DOWN_ABL_YN = 'Y'                            -- 다운 가능 쿠폰 
+		                AND    CP.CPN_TYPE IN ('G230_11','G230_20','G230_30')  --  상품쿠폰, 주문서쿠폰, 배송비쿠폰
+		                AND    CP.DC_CD_GB = 'G233_00'                         -- 일반유형(할인쿠폰구분)
+		                AND    (CASE WHEN 'P' = #{frontGb} THEN CP.DC_PVAL
+		                             WHEN 'M' = #{frontGb} THEN CP.DC_MVAL
+		                             ELSE CP.DC_AVAL END) > 0                  -- PC, MOBILE,APP 별로 0 보다 큰 쿠폰
+		                AND    (SELECT COUNT(1)
+		                        FROM TB_COUPON_CUST_GBN
+		                        WHERE CPN_ID = CP.CPN_ID
+		                        AND USABLE_CUST_GB IN (#{custGb})              -- 사용가능고객구분
+		                       ) >= 1
+		                AND    IF (CP.TOT_PUB_LIMIT_QTY = 0, 9999999999,CP.TOT_PUB_LIMIT_QTY) > (SELECT COUNT(1) FROM TB_CUST_COUPON WHERE CPN_ID = CP.CPN_ID) -- 총발행제한수
+		                AND   (
+		                        (CP.APPLY_SCOPE = 'A' ) 
+		                        OR  /* 적용대상:상품*/
+		                        (CP.APPLY_SCOPE = 'I' AND (SELECT COUNT(1) FROM TB_COUPON_REFVAL
+		                                                   WHERE CPN_ID = CP.CPN_ID
+		                                                   AND CPN_TARGET = 'G260_10'
+		                                                   AND DEL_YN = 'N'
+		                                                   AND REF_VAL = G.GOODS_CD
+		                                                   ) > 0
+		                        ) 
+		                        OR /* 적용대상:카테고리*/
+		                        (CP.APPLY_SCOPE = 'I' AND (SELECT COUNT(1) FROM TB_COUPON_REFVAL
+		                                                   WHERE CPN_ID = CP.CPN_ID
+		                                                   AND CPN_TARGET = 'G260_11' 
+		                                                   AND DEL_YN = 'N'
+		                                                   AND IFNULL(REF_FORMAL_GB,G.FORMAL_GB) = G.FORMAL_GB
+		                                                   AND IFNULL(REF_BRAND_CD,G.BRAND_CD) = G.BRAND_CD
+		                                                   AND REF_VAL IN (SELECT DISTINCT X.CATE_NO 
+		                                                                   FROM 
+		                                                                        (SELECT LEAF_CATE_NO 
+		                                                                              , CATE_LVL 
+		                                                                              , CATE_NO
+		                                                                         FROM (
+		                                                                               SELECT LEAF_CATE_NO ,
+		                                                                                      CASE WHEN X = 1 THEN 'CATE1_NO'  -- 컬럼과 매핑(컬럼명)
+		                                                                                           WHEN X = 2 THEN 'CATE2_NO'
+		                                                                                           WHEN X = 3 THEN 'CATE3_NO'
+		                                                                                           WHEN X = 4 THEN 'CATE4_NO'
+		                                                                                           ELSE  'CATE5_NO' 
+		                                                                                      END CATE_LVL,
+		                                                                                      CASE WHEN X = 1 THEN CATE1_NO  -- 컬럼과 매핑(컬럼 데이터)
+		                                                                                           WHEN X = 2 THEN CATE2_NO
+		                                                                                           WHEN X = 3 THEN CATE3_NO
+		                                                                                           WHEN X = 4 THEN CATE4_NO
+		                                                                                           ELSE  CATE5_NO 
+		                                                                                      END CATE_NO
+		                                                                               FROM (
+		                                                                                      ( SELECT LEAF_CATE_NO
+		                                                                                             , CATE1_NO
+		                                                                                             , CATE2_NO
+		                                                                                             , CATE3_NO
+		                                                                                             , CATE4_NO
+		                                                                                             , CATE5_NO
+		                                                                                        FROM  TB_CATE_4SRCH
+		                                                                                        WHERE SITE_CD = 'G000_10'
+		                                                                                        AND CATE_TYPE = 'G031_10') A, -- 상품타입
+		                                                                                      (SELECT 1 AS X                  -- UNPIVOT 컬럼 수 만큼 선언
+		                                                                                       UNION ALL SELECT 2 AS X
+		                                                                                       UNION ALL SELECT 3 AS X
+		                                                                                       UNION ALL SELECT 4 AS X
+		                                                                                       UNION ALL SELECT 5 AS X
+		                                                                                     ) B
+		                                                                                    )  
+		                                                                               ORDER BY LEAF_CATE_NO, CATE_LVL
+		                                                                              ) K
+		                                                                              WHERE CATE_NO IS NOT NULL
+		                                                                        ) X, 
+		                                                                        (
+		                                                                         SELECT A.CATE_NO, A.GOODS_CD
+		                                                                         FROM TB_CATE_GOODS A
+		                                                                         WHERE GOODS_CD = G.GOODS_CD
+		                                                                        ) Y 
+		                                                                        WHERE X.LEAF_CATE_NO = Y.CATE_NO
+		                                                                  )
+		                                                  ) >0
+		                        ) 
+		                        OR /* 적용대상:브랜드*/
+		                        (CP.APPLY_SCOPE = 'I' AND (SELECT COUNT(1) FROM TB_COUPON_REFVAL
+		                                                   WHERE CPN_ID = CP.CPN_ID
+		                                                   AND CPN_TARGET = 'G260_12' 
+		                                                   AND DEL_YN = 'N'
+		                                                   AND REF_VAL = G.BRAND_CD
+		                                                   AND IFNULL(REF_FORMAL_GB,G.FORMAL_GB) = G.FORMAL_GB
+		                                                  ) >0
+		                        ) 
+		                        OR /* 적용대상:공급업체*/
+		                        (CP.APPLY_SCOPE = 'I' AND (SELECT COUNT(1) FROM TB_COUPON_REFVAL
+		                                                   WHERE CPN_ID = CP.CPN_ID
+		                                                   AND CPN_TARGET = 'G260_13' 
+		                                                   AND DEL_YN = 'N'
+		                                                   AND REF_VAL = G.SUPPLY_COMP_CD
+		                                                  ) >0
+		                        )
+		                      )
+		                AND NOT EXISTS (
+		                                SELECT 1
+		                                FROM   TB_COUPON_REFVAL SCPR
+		                                WHERE  SCPR.CPN_ID = CP.CPN_ID
+		                                AND    SCPR.REF_VAL = G.GOODS_CD
+		                                AND    SCPR.DEL_YN = 'N'      -- 삭제안된넘
+		                                AND    SCPR.CPN_TARGET = '40' -- 제외상품
+		                               )
+		                AND NOT EXISTS (
+		                                 SELECT 1
+		                                FROM TB_COUPON_BAN_GOODS
+		                                WHERE GOODS_CD = G.GOODS_CD
+		                                AND DEL_YN = 'N'
+		                               )
+		               ) CP
+		               WHERE 1 = 1
+		               <![CDATA[
+		               AND CP.BUY_LIMIT_AMT <= CP.CURR_PRICE  -- 최소주문금액
+		               ]]>
+		       ) Y
+		) A
+		WHERE 1 = 1
+		<if test="maxRownum != null and maxRownum > 0">
+		LIMIT #{maxRownum}
+		</if> 
+	</select>
+	
 </mapper>

+ 78 - 27
src/main/java/com/style24/persistence/mybatis/shop/TsfCustomer.xml

@@ -111,14 +111,17 @@
 		     <if test="ci != null and ci != ''">
 		      AND    CI = #{ci}
 		     </if>
+		     <if test="custNo != null and custNo != ''">
+		      AND    CUST_NO = #{custNo}
+		     </if>
 		     <if test="encodedCellPhnno != null and encodedCellPhnno != ''" >
 		      AND    CELL_PHNNO = #{encodedCellPhnno}
 		     </if>
 
 		      UNION ALL
 		      
-		      SELECT CUST_ID
-		           , CUST_NO
+		      SELECT CUST_NO
+		           , CUST_ID
 		           , EMAIL
 		           , CELL_PHNNO
 		           , CUST_STAT
@@ -130,14 +133,17 @@
 		      <if test="ci != null and ci != ''">
 		      AND    CI = #{ci}
 		      </if>
+		      <if test="custNo != null and custNo != ''">
+		      AND    CUST_NO = #{custNo}
+		     </if>
 		      <if test="encodedCellPhnno != null and encodedCellPhnno != ''" >
 		      AND    CELL_PHNNO = #{encodedCellPhnno}
 		      </if>
 
 		      UNION ALL
 
-		      SELECT CUST_ID
-		           , CUST_NO
+		      SELECT CUST_NO
+		           , CUST_ID
 		           , EMAIL
 		           , CELL_PHNNO
 		           , CUST_STAT
@@ -149,6 +155,9 @@
 		      <if test="ci != null and ci != ''">
 		      AND    CI = #{ci}
 		      </if>
+		      <if test="custNo != null and custNo != ''">
+		      AND    CUST_NO = #{custNo}
+		      </if>
 		      <if test="encodedCellPhnno != null and encodedCellPhnno != ''" >
 		      AND    CELL_PHNNO = #{encodedCellPhnno}
 		      </if>
@@ -445,28 +454,27 @@
 	<!-- 위시리스트 등록 -->
 	<insert id="createWishList" parameterType="WishList">
 		/* TsfCustomer.createWishList */
-		INSERT INTO TB_WISHLIST
-		(
-		            CUST_NO
-		          , GOODS_CD
-		          , AF_LINK_CD
-		          , ITHR_CD
-		          , CONTENTS_LOC
-		          , PLAN_DTL_SQ
-		          , REG_NO
-		          , REG_DT
-		         ) VALUES (
-		            #{custNo}
-		          , #{goodsCd}
-		          , #{afLinkCd}
-		          , #{ithrCd}
-		          , #{contentsLoc}
-		          , #{planDtlSq}
-		          , #{regNo}
-		          , NOW()
-		         )
+		INSERT INTO TB_WISHLIST (
+		       CUST_NO
+		     , GOODS_CD
+		     , AF_LINK_CD
+		     , ITHR_CD
+		     , CONTENTS_LOC
+		     , PLAN_DTL_SQ
+		     , REG_NO
+		     , REG_DT
+		) VALUES (
+		       #{custNo}
+		     , #{goodsCd}
+		     , #{afLinkCd}
+		     , #{ithrCd}
+		     , #{contentsLoc}
+		     , #{planDtlSq}
+		     , #{regNo}
+		     , NOW()
+		)
 		ON DUPLICATE KEY UPDATE
-		         REG_DT = NOW()
+		       REG_DT = NOW()
 	</insert>
 
 	<!-- 위시리스트 삭제 -->
@@ -474,8 +482,51 @@
 		/* TsfCustomer.deleteWishInfo */
 		DELETE FROM TB_WISHLIST
 		WHERE  CUST_NO = #{custNo}
-		<if test="goodsCd != null and goodsCd != ''">
+		<choose>
+		<when test="arrGoodsCd != null and arrGoodsCd.length>0">
+		AND UPPER(GOODS_CD) IN
+		    <foreach collection="arrGoodsCd" item="item" index="index"  open="(" close=")" separator=",">
+		UPPER(#{item})
+		    </foreach>
+		</when>
+		<otherwise>
 		AND    GOODS_CD = #{goodsCd}
-		</if>
+		</otherwise>
+		</choose>
 	</delete>
+
+	<!-- 위시리스트 삭제 상품 조회 -->
+	<select id="getDeleteGoodsWish" parameterType="int" resultType="String">
+		/* TsfCustomer.getDeleteGoodsWish */
+		SELECT GROUP_CONCAT(GOODS_CD) AS GOODS_CD
+		FROM (
+		      SELECT GOODS_CD , REG_DT
+		           , RANK() OVER(ORDER BY REG_DT DESC) AS RNUM
+		      FROM TB_WISHLIST
+		      WHERE CUST_NO = #{custNo}
+		     ) Z
+		WHERE RNUM > 50
+	</select>
+
+
+	<!--본인인증처리-->
+	<update id="updateCustomerCi" parameterType="Customer">
+		/* TsfCustomer.updateCustomerCi */
+		UPDATE TB_CUSTOMER
+		SET    CI = #{ci}
+		     , AUTH_DT = NOW()
+		     , UPD_NO = #{updNo}
+		     , UPD_DT = NOW()
+		WHERE  CUST_NO = #{custNo}
+	</update>
+
+	<!--비밀번호 변경 날짜 업데이트-->
+	<update id="updatePasswordDate" parameterType="Customer">
+		UPDATE TB_CUSTOMER
+		SET    PASSWD_CHG_DT = DATE_ADD(NOW(), INTERVAL -#{pwdChangeDay} DAY )
+		     , UPD_NO = #{updNo}
+		     , UPD_DT = NOW()
+		WHERE  CUST_NO = #{custNo}
+	</update>
+
 </mapper>

+ 369 - 0
src/main/java/com/style24/persistence/mybatis/shop/TsfDisplay.xml

@@ -13,7 +13,376 @@
 		       ) ORIGINAL
 		WHERE  NUMB BETWEEN #{pageable.startRow} AND #{pageable.endRow}
 	</sql>
+
+	<!-- GNB 브랜드그룹 목록 -->
+	<select id="getGnbBrandGroupList" parameterType="Contents" resultType="BrandGroup">
+		/* TsfDisplay.getGnbBrandGroupList */
+		SELECT B.STR_TITLE1     AS TITLE
+		     , A.BRAND_GROUP_NO
+		     , CASE WHEN A.DISP_NM_LANG = 'EN' THEN A.BRAND_GROUP_ENM
+		            ELSE A.BRAND_GROUP_KNM
+		       END              AS BRAND_GROUP_NM
+		     , A.LOGO_FILE_NM
+		     , B.DISP_ORD
+		FROM   TB_BRAND_GROUP A
+		<choose>
+		    <when test='preview != null and preview == "Y"'>
+		     , TB_CONTENTS_PREVIEW B
+		    </when>
+		    <otherwise>
+		     , TB_CONTENTS B
+		    </otherwise>
+		</choose>
+		WHERE  A.BRAND_GROUP_NO = B.STR_VAR1
+		AND    A.USE_YN = 'Y'
+		AND    B.CONTENTS_LOC = #{contentsLoc}
+		<choose>
+		    <when test='preview != null and preview == "Y"'>
+		AND    B.DISP_STDT <![CDATA[<=]]> STR_TO_DATE(#{viewDt},'%Y%m%d%H%i%S')
+		AND    B.DISP_EDDT <![CDATA[>=]]> STR_TO_DATE(#{viewDt},'%Y%m%d%H%i%S')
+		ORDER  BY B.DISP_ORD, B.PRE_CONTENTS_SQ
+		    </when>
+		    <otherwise>
+		AND    B.DISP_STDT <![CDATA[<=]]> NOW()
+		AND    B.DISP_EDDT <![CDATA[>=]]> NOW()
+		ORDER  BY B.DISP_ORD, B.CONTENTS_SQ
+		    </otherwise>
+		</choose>
+	</select>
+	
+	<!-- GNB탭 목록 -->
+	<select id="getGnbTabList" parameterType="GnbTab" resultType="GnbTab">
+		/* TsfDisplay.getGnbTabList */
+		SELECT GTAB_GB                                            /*GNB탭구분*/
+		     , GTAB_NM                                            /*GNB탭명*/
+		     , CONTENTS_TYPE                                      /*컨텐츠유형*/
+		     , CATE1_NO                                           /*카테고리1번호*/
+		     , BRAND_GROUP_NO                                     /*브랜드그룹번호*/
+		     , LINK_URL                                           /*링크URL*/
+		     , DATE_FORMAT(DISP_STDT,'%Y%m%d%H%i%S') AS DISP_STDT /*전시시작일시*/
+		     , DATE_FORMAT(DISP_EDDT,'%Y%m%d%H%i%S') AS DISP_EDDT /*전시종료일시*/
+		     , DISP_ORD                                           /*표시순서*/
+		<choose>
+		    <when test='preview != null and preview == "Y"'>
+		     , PRE_GTAB_SQ                           AS GTAB_SQ   /*GNB탭일련번호*/
+		FROM   TB_GNB_TAB_PREVIEW A
+		    </when>
+		    <otherwise>
+		     , GTAB_SQ                                            /*GNB탭일련번호*/
+		FROM   TB_GNB_TAB A
+		    </otherwise>
+		</choose>
+		WHERE  GTAB_GB = #{gtabGb}
+		AND    USE_YN = 'Y'
+		<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 <![CDATA[>=]]> STR_TO_DATE(#{viewDt},'%Y%m%d%H%i%S')
+		ORDER  BY DISP_ORD, PRE_GTAB_SQ
+		    </when>
+		    <otherwise>
+		AND    DISP_STDT <![CDATA[<=]]> NOW()
+		AND    DISP_EDDT <![CDATA[>=]]> NOW()
+		ORDER  BY DISP_ORD, GTAB_SQ
+		    </otherwise>
+		</choose>
+	</select>
+	
+	<!-- 컨텐츠 목록 -->
+	<select id="getContentsList" parameterType="Contents" resultType="Contents">
+		/* TsfDisplay.getContentsList */
+		SELECT CONTENTS_SQ     /*컨텐츠일련번호*/
+		     , CATE_NO         /*카테고리번호*/
+		     , CONTENTS_LOC    /*컨텐츠위치*/
+		     , CONTENTS_TYPE   /*컨텐츠유형*/
+		     , DISP_STDT       /*전시시작일시*/
+		     , DISP_EDDT       /*전시종료일시*/
+		     , DISP_ORD        /*표시순서*/
+		     , IMG_PATH1       /*이미지경로1*/
+		     , IMG_PATH2       /*이미지경로2*/
+		     , IMG_PATH3       /*이미지경로3*/
+		     , IMG_PATH4       /*이미지경로4*/
+		     , IMG_PATH5       /*이미지경로5*/
+		     , IMG_PATH6       /*이미지경로6*/
+		     , IMG_PATH7       /*이미지경로7*/
+		     , IMG_PATH8       /*이미지경로8*/
+		     , STR_VAR1        /*링크필드1*/
+		     , STR_VAR2        /*링크필드2*/
+		     , STR_VAR3        /*링크필드3*/
+		     , STR_VAR4        /*링크필드4*/
+		     , STR_VAR5        /*링크필드5*/
+		     , STR_VAR6        /*링크필드6*/
+		     , STR_VAR7        /*링크필드7*/
+		     , STR_VAR8        /*링크필드8*/
+		     , STR_TITLE1      /*제목필드1*/
+		     , STR_TITLE2      /*제목필드2*/
+		     , STR_TITLE3      /*제목필드3*/
+		     , STR_TITLE4      /*제목필드4*/
+		     , SUB_TEXT1       /*서브텍스트1*/
+		     , SUB_TEXT2       /*서브텍스트2*/
+		     , SUB_TEXT3       /*서브텍스트3*/
+		     , SUB_TEXT4       /*서브텍스트4*/
+		     , BRAND_GROUP_NO  /*브랜드그룹번호*/
+		     , BRAND_GROUP_IMG /*브랜드그룹이미지경로*/
+		     , MD_TITLE        /*MD타이틀*/
+		FROM   (
+		        SELECT CATE_NO                                            /*카테고리번호*/
+		             , CONTENTS_LOC                                       /*컨텐츠위치*/
+		             , CONTENTS_TYPE                                      /*컨텐츠유형*/
+		             , DATE_FORMAT(DISP_STDT,'%Y%m%d%H%i%S') AS DISP_STDT /*전시시작일시*/
+		             , DATE_FORMAT(DISP_EDDT,'%Y%m%d%H%i%S') AS DISP_EDDT /*전시종료일시*/
+		             , DISP_ORD                                           /*표시순서*/
+		             , IMG_PATH1                                          /*이미지경로1*/
+		             , IMG_PATH2                                          /*이미지경로2*/
+		             , IMG_PATH3                                          /*이미지경로3*/
+		             , IMG_PATH4                                          /*이미지경로4*/
+		             , IMG_PATH5                                          /*이미지경로5*/
+		             , IMG_PATH6                                          /*이미지경로6*/
+		             , IMG_PATH7                                          /*이미지경로7*/
+		             , IMG_PATH8                                          /*이미지경로8*/
+		             , STR_VAR1                                           /*링크필드1*/
+		             , STR_VAR2                                           /*링크필드2*/
+		             , STR_VAR3                                           /*링크필드3*/
+		             , STR_VAR4                                           /*링크필드4*/
+		             , STR_VAR5                                           /*링크필드5*/
+		             , STR_VAR6                                           /*링크필드6*/
+		             , STR_VAR7                                           /*링크필드7*/
+		             , STR_VAR8                                           /*링크필드8*/
+		             , STR_TITLE1                                         /*제목필드1*/
+		             , STR_TITLE2                                         /*제목필드2*/
+		             , STR_TITLE3                                         /*제목필드3*/
+		             , STR_TITLE4                                         /*제목필드4*/
+		             , SUB_TEXT1                                          /*서브텍스트1*/
+		             , SUB_TEXT2                                          /*서브텍스트2*/
+		             , SUB_TEXT3                                          /*서브텍스트3*/
+		             , SUB_TEXT4                                          /*서브텍스트4*/
+		             , BRAND_GROUP_NO                                     /*브랜드그룹번호*/
+		             , BRAND_GROUP_IMG                                    /*브랜드그룹이미지경로*/
+		             , MD_TITLE                                           /*MD타이틀*/
+		        <choose>
+		            <when test='preview != null and preview == "Y"'>
+		             , PRE_CONTENTS_SQ                       AS CONTENTS_SQ /*컨텐츠일련번호*/
+		             -- , RANK() OVER(PARTITION BY CATE_NO, CONTENTS_LOC
+		             --               ORDER BY CATE_NO, DISP_ORD, PRE_CONTENTS_SQ) AS NUMB
+		        FROM   TB_CONTENTS_PREVIEW A
+		            </when>
+		            <otherwise>
+		             , CONTENTS_SQ
+		             -- , RANK() OVER (PARTITION BY CATE_NO, CONTENTS_LOC
+		             --               ORDER BY CATE_NO, DISP_ORD, CONTENTS_SQ) AS NUMB
+		        FROM   TB_CONTENTS A
+		            </otherwise>
+		        </choose>
+		        WHERE  CONTENTS_LOC = #{contentsLoc}
+		        AND    USE_YN = 'Y'
+		        <if test="cateNo != null and cateNo != ''">
+		        AND    CATE_NO = #{cateNo}
+		        </if>
+		        <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 <![CDATA[>=]]> STR_TO_DATE(#{viewDt},'%Y%m%d%H%i%S')
+		        AND    IFNULL((SELECT DISP_EDDT
+		                       FROM   TB_PLAN
+		                       WHERE  PLAN_SQ = CASE WHEN INSTR(A.STR_VAR1,'/planning/detail/form') > 0 AND INSTR(A.STR_VAR1,'planSq=') > 0 THEN
+		                                                 (SUBSTR(A.STR_VAR1,INSTR(A.STR_VAR1,'planSq=') + 7,LENGTH(A.STR_VAR1) + 1))
+		                                             ELSE
+		                                                 NULL
+		                                        END
+		                      ),STR_TO_DATE(#{viewDt},'%Y%m%d%H%i%S')
+		                     ) <![CDATA[>=]]> STR_TO_DATE(#{viewDt},'%Y%m%d%H%i%S')
+		        AND    IFNULL((SELECT DISP_STDT
+		                       FROM   TB_PLAN
+		                       WHERE  PLAN_SQ = CASE WHEN INSTR(A.STR_VAR1,'/planning/detail/form') > 0 AND INSTR(A.STR_VAR1,'planSq=') > 0 THEN
+		                                                 (SUBSTR(A.STR_VAR1,INSTR(A.STR_VAR1,'planSq=') + 7,LENGTH(A.STR_VAR1) + 1))
+		                                             ELSE
+		                                                 NULL
+		                                        END
+		                      ),STR_TO_DATE(#{viewDt},'%Y%m%d%H%i%S')
+		                     ) <![CDATA[<=]]> STR_TO_DATE(#{viewDt},'%Y%m%d%H%i%S')
+		        ORDER  BY CONTENTS_LOC, DISP_ORD, PRE_CONTENTS_SQ
+		            </when>
+		            <otherwise>
+		        AND    DISP_STDT <![CDATA[<=]]> NOW()
+		        AND    DISP_EDDT <![CDATA[>=]]> NOW()
+		        AND    IFNULL((SELECT DISP_EDDT
+		                       FROM   TB_PLAN
+		                       WHERE  PLAN_SQ = CASE WHEN INSTR(A.STR_VAR1,'/planning/detail/form') > 0 AND INSTR(A.STR_VAR1,'planSq=') > 0 THEN
+		                                                 (SUBSTR(A.STR_VAR1,INSTR(A.STR_VAR1,'planSq=') + 7,LENGTH(A.STR_VAR1) + 1))
+		                                             ELSE
+		                                                 NULL
+		                                        END
+		                      ),NOW()
+		                     ) <![CDATA[>=]]> NOW()
+		        AND    IFNULL((SELECT DISP_STDT
+		                       FROM   TB_PLAN
+		                       WHERE  PLAN_SQ = CASE WHEN INSTR(A.STR_VAR1,'/planning/detail/form') > 0 AND INSTR(A.STR_VAR1,'planSq=') > 0 THEN
+		                                                 (SUBSTR(A.STR_VAR1,INSTR(A.STR_VAR1,'planSq=') + 7,LENGTH(A.STR_VAR1) + 1))
+		                                             ELSE
+		                                                 NULL
+		                                        END
+		                      ),NOW()
+		                     ) <![CDATA[<=]]> NOW()
+		        ORDER  BY CONTENTS_LOC, DISP_ORD, CONTENTS_SQ
+		            </otherwise>
+		        </choose>
+		       )
+		<if test="maxRow != null and maxRow > 0">
+		LIMIT #{maxRow}
+		</if>
+	</select>
+
+	<!-- 카테고리1 목록 -->
+	<select id="getCategory1List" parameterType="Cate4Srch" resultType="Cate1">
+		/* TsfDisplay.getCategory1List */
+		SELECT SITE_CD
+		     , CATE_GB
+		     , CATE1_NO
+		     , CATE1_NM
+		     , LEAF_YN
+		FROM   TB_CATE1 A
+		WHERE  SITE_CD = #{siteCd} /*사이트코드*/
+		AND    CATE_GB = #{cateGb} /*카테고리구분*/
+		AND    CATE_TYPE = #{cateType} /*카테고리유형*/
+		<if test="cate1No != null and cate1No != ''">
+		AND    CATE1_NO = #{cate1No}
+		</if>
+		AND    DISP_YN = 'Y'
+		AND    USE_YN = 'Y'
+		AND    EXISTS (SELECT 1
+		               FROM   TB_CATE_STOCK
+		               WHERE  CATE_GB = A.CATE_GB
+		               AND    BRAND_GROUP_NO = CASE WHEN A.CATE_GB = 'G032_102' THEN #{brandGroupNo} ELSE 0 END
+		               AND    CATE_NO = A.CATE1_NO
+		               <if test='soldoutGoodsDispYn != null and soldoutGoodsDispYn =="N"'>
+		               AND    STOCK_QTY > 0 /*품절상품전시여부:N일 때 재고가 있는 카테고리만*/
+		               </if>
+		              )
+		ORDER  BY DISP_ORD
+	</select>
+	
+	<!-- 카테고리2 목록 -->
+	<select id="getCategory2List" parameterType="Cate4Srch" resultType="Cate2">
+		/* TsfDisplay.getCategory2List */
+		SELECT SITE_CD
+		     , CATE_GB
+		     , CATE1_NO
+		     , CATE2_NO
+		     , CATE2_NM
+		     , LEAF_YN
+		FROM   TB_CATE2 A
+		WHERE  SITE_CD = #{siteCd} /*사이트코드*/
+		AND    CATE_GB = #{cateGb} /*카테고리구분*/
+		AND    CATE_TYPE = #{cateType} /*카테고리유형*/
+		AND    CATE1_NO = #{cate1No} /*카테고리1번호*/
+		AND    DISP_YN = 'Y'
+		AND    USE_YN = 'Y'
+		AND    EXISTS (SELECT 1
+		               FROM   TB_CATE_STOCK
+		               WHERE  CATE_GB = A.CATE_GB
+		               AND    BRAND_GROUP_NO = CASE WHEN A.CATE_GB = 'G032_102' THEN #{brandGroupNo} ELSE 0 END
+		               AND    CATE_NO = A.CATE2_NO
+		               <if test='soldoutGoodsDispYn != null and soldoutGoodsDispYn =="N"'>
+		               AND    STOCK_QTY > 0 /*품절상품전시여부:N일 때 재고가 있는 카테고리만*/
+		               </if>
+		              )
+		ORDER  BY DISP_ORD
+	</select>
+	
+	<!-- 카테고리3 목록 -->
+	<select id="getCategory3List" parameterType="Cate4Srch" resultType="Cate3">
+		/* TsfDisplay.getCategory3List */
+		SELECT SITE_CD
+		     , CATE_GB
+		     , CATE1_NO
+		     , CATE2_NO
+		     , CATE3_NO
+		     , CATE3_NM
+		     , LEAF_YN
+		FROM   TB_CATE3 A
+		WHERE  SITE_CD = #{siteCd} /*사이트코드*/
+		AND    CATE_GB = #{cateGb} /*카테고리구분*/
+		AND    CATE_TYPE = #{cateType} /*카테고리유형*/
+		AND    CATE1_NO = #{cate1No} /*카테고리1번호*/
+		AND    CATE2_NO = #{cate2No} /*카테고리2번호*/
+		AND    DISP_YN = 'Y'
+		AND    USE_YN = 'Y'
+		AND    EXISTS (SELECT 1
+		               FROM   TB_CATE_STOCK
+		               WHERE  CATE_GB = A.CATE_GB
+		               AND    BRAND_GROUP_NO = CASE WHEN A.CATE_GB = 'G032_102' THEN #{brandGroupNo} ELSE 0 END
+		               AND    CATE_NO = A.CATE3_NO
+		               <if test='soldoutGoodsDispYn != null and soldoutGoodsDispYn =="N"'>
+		               AND    STOCK_QTY > 0 /*품절상품전시여부:N일 때 재고가 있는 카테고리만*/
+		               </if>
+		              )
+		ORDER  BY DISP_ORD
+	</select>
 	
+	<!-- 카테고리4 목록 -->
+	<select id="getCategory4List" parameterType="Cate4Srch" resultType="Cate4">
+		/* TsfDisplay.getCategory4List */
+		SELECT SITE_CD
+		     , CATE_GB
+		     , CATE1_NO
+		     , CATE2_NO
+		     , CATE3_NO
+		     , CATE4_NO
+		     , CATE4_NM
+		     , LEAF_YN
+		FROM   TB_CATE4 A
+		WHERE  SITE_CD = #{siteCd} /*사이트코드*/
+		AND    CATE_GB = #{cateGb} /*카테고리구분*/
+		AND    CATE_TYPE = #{cateType} /*카테고리유형*/
+		AND    CATE1_NO = #{cate1No} /*카테고리1번호*/
+		AND    CATE2_NO = #{cate2No} /*카테고리2번호*/
+		AND    CATE3_NO = #{cate3No} /*카테고리3번호*/
+		AND    DISP_YN = 'Y'
+		AND    USE_YN = 'Y'
+		AND    EXISTS (SELECT 1
+		               FROM   TB_CATE_STOCK
+		               WHERE  CATE_GB = A.CATE_GB
+		               AND    BRAND_GROUP_NO = CASE WHEN A.CATE_GB = 'G032_102' THEN #{brandGroupNo} ELSE 0 END
+		               AND    CATE_NO = A.CATE4_NO
+		               <if test='soldoutGoodsDispYn != null and soldoutGoodsDispYn =="N"'>
+		               AND    STOCK_QTY > 0 /*품절상품전시여부:N일 때 재고가 있는 카테고리만*/
+		               </if>
+		              )
+		ORDER  BY DISP_ORD
+	</select>
 	
+	<!-- 카테고리5 목록 -->
+	<select id="getCategory5List" parameterType="Cate4Srch" resultType="Cate5">
+		/* TsfDisplay.getCategory5List */
+		SELECT SITE_CD
+		     , CATE_GB
+		     , CATE1_NO
+		     , CATE2_NO
+		     , CATE3_NO
+		     , CATE4_NO
+		     , CATE5_NM
+		     , CATE5_NM
+		     , LEAF_YN
+		FROM   TB_CATE5 A
+		WHERE  SITE_CD = #{siteCd} /*사이트코드*/
+		AND    CATE_GB = #{cateGb} /*카테고리구분*/
+		AND    CATE_TYPE = #{cateType} /*카테고리유형*/
+		AND    CATE1_NO = #{cate1No} /*카테고리1번호*/
+		AND    CATE2_NO = #{cate2No} /*카테고리2번호*/
+		AND    CATE3_NO = #{cate3No} /*카테고리3번호*/
+		AND    CATE4_NO = #{cate4No} /*카테고리4번호*/
+		AND    DISP_YN = 'Y'
+		AND    USE_YN = 'Y'
+		AND    EXISTS (SELECT 1
+		               FROM   TB_CATE_STOCK
+		               WHERE  CATE_GB = A.CATE_GB
+		               AND    BRAND_GROUP_NO = CASE WHEN A.CATE_GB = 'G032_102' THEN #{brandGroupNo} ELSE 0 END
+		               AND    CATE_NO = A.CATE5_NO
+		               <if test='soldoutGoodsDispYn != null and soldoutGoodsDispYn =="N"'>
+		               AND    STOCK_QTY > 0 /*품절상품전시여부:N일 때 재고가 있는 카테고리만*/
+		               </if>
+		              )
+		ORDER  BY DISP_ORD
+	</select>
 
 </mapper>

+ 73 - 0
src/main/java/com/style24/persistence/mybatis/shop/TsfGiftcard.xml

@@ -2,6 +2,79 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.style24.front.biz.dao.TsfGiftcardDao">
 
+	<!-- 상품권 기본정보  -->
+	<select id="getGiftcardInfo" parameterType="GiftCard" resultType="GiftCard">
+		<!-- TsfGiftcard.getGiftcardInfo -->
+		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
+		          AND CUST_NO = #{custNo}) AS TOTAL_COUNT 		/*총 상품권 수*/
+		      ,(SELECT COUNT(*)
+				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
+				  AND CUST_NO = #{custNo}) 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
+	</select>
+	
+	<select id="getGiftcardUseList" parameterType="GiftCard" resultType="GiftCard">
+		<!-- TsfGiftcard.getGiftcardUseList -->
+		SELECT A.* 
+		      ,(CASE A.OCCUR_GB WHEN 'G074_11'THEN '+' 
+		                        WHEN 'G074_12'THEN '-'
+		                        WHEN 'G074_13'THEN '+'
+		                        WHEN 'G074_14'THEN '-'
+		                        WHEN 'G074_15'THEN '-'
+		                        WHEN 'G074_16'THEN '-'
+		                        WHEN 'G074_17'THEN '+'
+		                        WHEN 'G074_18'THEN '+'
+		                        WHEN 'G074_19'THEN '-'
+		       END) AS BALANCE
+		      ,(CASE A.OCCUR_GB WHEN 'G074_11'THEN '상품권 등록'        
+                         WHEN 'G074_12'THEN '상품권 사용'       
+                         WHEN 'G074_13'THEN '상품권 사용취소'     
+                         WHEN 'G074_14'THEN '상품권 유효기간만료'   
+                         WHEN 'G074_15'THEN '상품권 파기'       
+                         WHEN 'G074_16'THEN '상품권 현금전환'     
+                         WHEN 'G074_17'THEN '결품으로 인한 기간 연장'
+                         WHEN 'G074_18'THEN '오환불로 인한 금액추가' 
+                         WHEN 'G074_19'THEN '오환불로 인한 금액차감' 
+               END) AS BALANCE_NAME
+		      ,B.GOODS_CD 
+		      ,D.GOODS_NM 
+		FROM TB_CUST_GIFTCARD_HST A LEFT JOIN TB_ORDER_DETAIL B ON A.ORD_DTL_NO = B.ORD_DTL_NO AND A.ORD_NO = B.ORD_NO
+									LEFT JOIN TB_CUST_GIFTCARD C ON A.CUST_GFCD_SQ =C.CUST_GFCD_SQ 
+									LEFT JOIN TB_GOODS D ON B.GOODS_CD = D.GOODS_CD 
+		WHERE 1=1
+		 AND A.CUST_NO = #{custNo}
+		ORDER BY A.REG_DT DESC
+	</select>
+	
+	<select id="getGiftcardOwnList" parameterType="GiftCard" resultType="GiftCard">
+		<!-- TsfGiftcard.getGiftcardOwnList -->
+		 SELECT  CUST_GFCD_SQ
+				 , CUST_NO
+				 , GFCD_NO
+				 , GFCD_NM
+				 , CHG_GFCD_AMT
+				 , US_GFCD_AMT
+				 , RM_GFCD_AMT
+				 , DATE_FORMAT(USE_ST_DATE,'%Y-%m-%d') AS USE_ST_DATE
+		         , DATE_FORMAT(USE_EXP_DATE,'%Y-%m-%d') AS USE_EXP_DATE
+				 , REG_NO
+				 , REG_DT
+				 , UPD_NO
+				 , UPD_DT
+		 FROM TB_CUST_GIFTCARD CG 
+		 WHERE 1=1 
+		  AND CUST_NO = #{custNo}
+	</select>
+	
+	
 	<!-- 페이징을 위한 select절 상단 -->
 	<sql id="selectForPagingHeader">
 		SELECT *

+ 47 - 5
src/main/java/com/style24/persistence/mybatis/shop/TsfGoods.xml

@@ -196,7 +196,7 @@
 		         , IFNULL(B.DC_ARATE, C.DC_RATE) AS DC_RATE
 		         , (CASE WHEN #{frontGb} = 'P' THEN IFNULL(B.PNT_APRATE, C.PNT_PRATE) ELSE IFNULL(B.PNT_AMRATE,C.PNT_MRATE) END ) AS PNT_RATE
 		         , DATE_FORMAT(A.SOCIAL_STDT, '%Y%m%d%H%i%S')  AS SOCIAL_STDT
-		         , DATE_FORMAT(A.SOCIAL_EDDT, '%Y%m%d%H%i%S')  AS SOCIAL_EDDT
+		         , DATE_FORMAT(A.SOCIAL_EDDT, '%Y-%m-%dT%H:%i:%S')  AS SOCIAL_EDDT
 		    FROM TB_SOCIAL A
 		    INNER JOIN TB_SOCIAL_GOODS B ON A.SOCIAL_SQ = B.SOCIAL_SQ
 		                                 AND B.GOODS_CD = #{goodsCd}
@@ -735,10 +735,12 @@
 		    , INFORM_DT
 		FROM TB_REINBOUND_INFORM
 		WHERE CUST_NO = #{custNo}
-		AND GOODS_CD = #{GOODS_CD}
+		AND GOODS_CD = #{goodsCd}
 		AND OPT_CD = #{optCd}
-		AND INFORM_DT IS NOT NULL  -- 미알림
-		AND DATE_FORMAT(NOW(), '%Y%m%d' ) > DATE_FORMAT(DATE_ADD(A.REQ_DT, INTERVAL 15 DAY),'%Y%m%d')   -- 요청일기준15일경과
+		AND INFORM_DT IS NULL  -- 미알림
+		<![CDATA[
+		AND DATE_FORMAT(NOW(), '%Y%m%d' ) < DATE_FORMAT(DATE_ADD(REQ_DT, INTERVAL 15 DAY),'%Y%m%d')   -- 요청일기준15일경과
+		]]>
 		ORDER BY  RINBD_INFO_SQ DESC 
 		LIMIT 1
 	</select>
@@ -760,7 +762,7 @@
 		  , UPD_NO
 		  , UPD_DT
 		    )
-		VALUS(
+		VALUES(
 		    NULL
 		  , #{custNo}
 		  , #{goodsCd}
@@ -785,4 +787,44 @@
 		WHERE RINBD_INFO_SQ = #{rinbdInfoSq}
 	</update>
 	
+	<!-- 실측사이즈 조회 -->
+	<select id="getMeasurementList" parameterType="Goods" resultType="Measurement">
+		/* TsfGoods.getMeasurementList */
+		SELECT A.GOODS_CD 
+		     , A.OPT_CD 
+		     , A.OPT_CD1 
+		     , A.OPT_CD2 
+		     , B.TYPECD 
+		     , B.VALUE1 
+		     , B.VALUE2
+		     , B.VALUE3
+		     , B.VALUE4
+		     , B.VALUE5
+		FROM TB_OPTION A
+		INNER JOIN TB_IF_MEASUREMENT B ON A.OPT_CD = B.SKUCODE 
+		AND B.ISUSE = '1'                                               -- 사용
+		WHERE A.GOODS_CD  =  #{goodsCd}
+		AND A.OPT_CD1 = #{optCd1}
+	</select>
+	
+	<!-- 사이즈 정보 조회 -->
+	<select id="getSizeInfoList" parameterType="SizeInfo" resultType="SizeInfo">
+		/* TsfGoods.getSizeInfoList */
+		SELECT A.SIZE_GB
+		     , A.SIZE_CATE1_CD
+		     , A.SIZE_CATE1_NM
+		     , A.SIZE_CATE2_CD
+		     , A.SIZE_CATE2_NM
+		     , A.SIZE_INFO
+		     , A.DISP_ORD
+		     , A.USE_YN
+		FROM TB_SIZE_INFO A
+		WHERE A.USE_YN = 'Y' 
+		AND A.SIZE_GB = #{sizeGb}
+		<if test="sizeCate1Cd != null and sizeCate1Cd != ''">
+		AND A.SIZE_CATE1_CD = #{sizeCate1Cd}
+		</if>
+		ORDER BY A.SIZE_GB, A.DISP_ORD
+	</select>
+	
 </mapper>

+ 21 - 17
src/main/java/com/style24/persistence/mybatis/shop/TsfLogin.xml

@@ -5,33 +5,37 @@
 	<!-- 로그인체크 정보 조회 -->
 	<select id="getLoginCheckInfo" parameterType="Login" resultType="Login">
 		/* TsfLogin.getLoginCheckInfo */
-		SELECT CUST_NO                                          /*고객번호*/
-		     , CUST_ID                                          /*고객ID*/
-		     , CUST_NM                                          /*고객명*/
-		     , PASSWD                                           /*비밀번호*/
-		     , CUST_GB                                          /*고객구분*/
-		     , FN_GET_CODE_NM('G100',CUST_GB) AS CUST_GB_NM     /*고객구분명*/
-		     , CUST_STAT                                        /*회원상태*/
-		     , CELL_PHNNO                                       /*휴대전화번호*/
-		     , EMAIL                                            /*이메일*/
-		     , #{snsType}                     AS SNS_TYPE       /*SNS유형*/
-		     , #{snsId}                       AS SNS_ID         /*SNS가입ID*/
+		SELECT CUST_NO                                                 /*고객번호*/
+		     , CUST_ID                                                 /*고객ID*/
+		     , CUST_NM                                                 /*고객명*/
+		     , PASSWD                                                  /*비밀번호*/
+		     , CUST_GB                                                 /*고객구분*/
+		     , CUST_GRADE                                              /*고객등급*/
+		     , FN_GET_CODE_NM('G100',CUST_GB) AS CUST_GB_NM            /*고객구분명*/
+		     , CUST_STAT                                               /*회원상태*/
+		     , CELL_PHNNO                                              /*휴대전화번호*/
+		     , EMAIL                                                   /*이메일*/
+		     , #{snsType}                     AS SNS_TYPE              /*SNS유형*/
+		     , #{snsId}                       AS SNS_ID                /*SNS가입ID*/
 		     , IFNULL((SELECT LOGIN_FAIL_CNT
 		               FROM   TB_LOGIN_FAIL
 		               WHERE  CUST_ID = #{custId}
 		               AND    IP_ADDR = #{ipAddr}
 		               AND    SITE_CD = #{siteCd}
-		              ),0)                    AS LOGIN_FAIL_CNT /*로그인실패건수*/
+		              ),0)                    AS LOGIN_FAIL_CNT         /*로그인실패건수*/
+		     , TEMP_PASSWD_YN                                           /*임시비밀번호여부*/
+		     , IFNULL(DATEDIFF(NOW(), PASSWD_CHG_DT), 0) AS PWD_CHG_DAY /*비밀번호변경일자*/
+		     , CI                                                       /*CI본인인증여부*/
 		FROM   TB_CUSTOMER A
 		WHERE  1 = 1
 		<choose>
 		    <when test="snsType != null and snsType != ''"> <!-- SNS 로그인  -->
 		AND    CUST_NO = (
-		               SELECT CUST_NO
-		               FROM TB_CUSTOMER_SNS
-		               WHERE SNS_TYPE = #{snsType}
-		               AND   SNS_ID = #{snsId}
-		               )
+		                  SELECT CUST_NO
+		                  FROM   TB_CUSTOMER_SNS
+		                  WHERE  SNS_TYPE = #{snsType}
+		                  AND    SNS_ID = #{snsId}
+		                 )
 		    </when>
 		    <when test="custNo != null and custNo != ''">
 		AND    CUST_NO = #{custNo}

+ 10 - 0
src/main/java/com/style24/persistence/mybatis/shop/TsfOrder.xml

@@ -349,4 +349,14 @@
 		WHERE PAY_SQ = #{paySq}
 		  AND ORD_NO = #{ordNo}
 	</update>
+	
+	<!-- 고객 특정기간 구매 건수 -->
+	<select id="getCustFirstOrderCount" parameterType="Coupon" resultType="int">
+		/* TscOrder.getCustFirstOrderCount */
+		SELECT COUNT(*) 
+		FROM TB_ORDER
+		WHERE CUST_NO = #{custNo}
+		AND ORD_DT BETWEEN CONCAT(#{buyStdt}, '000000') and CONCAT(#{buyEddt}, '235959')
+	</select>
+	
 </mapper>

+ 74 - 0
src/main/java/com/style24/persistence/mybatis/shop/TsfSocial.xml

@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.style24.front.biz.dao.TsfSocialDao">
+	<select id="getSocialInfo" resultType="Social" parameterType="Social">
+		<!-- TsfSocial.getSocialInfo -->
+		SELECT A.SOCIAL_SQ
+		     , A.SOCIAL_NM
+		     , A.SOCIAL_TYPE
+		     , A.SITE_CD
+		     , A.FRONT_GB
+		     , A.SOCIAL_STDT
+		     , A.SOCIAL_EDDT
+		     , A.SOCIAL_TNM
+		     , A.USE_YN
+		     , A.APPLY_GB
+		FROM TB_SOCIAL A 
+		WHERE 1=1
+		  AND NOW() BETWEEN A.SOCIAL_STDT AND A.SOCIAL_EDDT 
+		  AND A.USE_YN = 'Y'			     		/*사용여부*/
+		  AND A.APPLY_GB = 'A'						 /*적용구분(P:대기,A:적용,F:종료)*/
+		  AND A.FRONT_GB IN ('A',#{frontGb}) 		 /*프론트 구분*/
+		<!-- ORDER BY A.REG_DT DESC LIMIT 1 -->
+	</select>
+	
+	<select id="getSocialGoodsList" resultType="Social" parameterType="Social">
+		SELECT F.* 
+			 ,  (CASE WHEN F.GOODS_TYPE = 'G056_N' THEN (SELECT IFNULL(SUM(CURR_STOCK_QTY - BASE_STOCK_QTY),0) FROM VW_STOCK WHERE GOODS_CD = F.GOODS_CD) 
+			    ELSE (SELECT IFNULL(SUM(CURR_STOCK_QTY - BASE_STOCK_QTY),0) FROM VW_STOCK_COMPOSE WHERE GOODS_CD = F.GOODS_CD) 
+			    END) AS STOCK_QTY_SUM
+			 , (SELECT MAX(SYS_IMG_NM) FROM TB_GOODS_IMG  WHERE GOODS_CD = F.GOODS_CD AND COLOR_CD = F.MAIN_COLOR_CD AND DEFAULT_IMG_YN = 'Y' ) AS SYS_IMG_NM
+			 , CASE IFNULL((SELECT COUNT(SYS_IMG_NM) FROM TB_GOODS_IMG  WHERE GOODS_CD = F.GOODS_CD AND COLOR_CD = F.MAIN_COLOR_CD AND DEFAULT_IMG_YN = 'Y' ),0) 
+			            WHEN 0 THEN 'N'
+			            ELSE 'Y' END AS GOODS_IMAGE_YN
+			FROM
+			(   
+				 SELECT A.SOCIAL_SQ
+				     , A.SOCIAL_NM
+				     , A.SOCIAL_TYPE
+				     , A.SITE_CD
+				     , A.FRONT_GB
+				     , A.SOCIAL_STDT
+				     , A.SOCIAL_EDDT
+				     , A.SOCIAL_TNM
+				     , A.USE_YN
+				     , A.APPLY_GB
+				     , A.REG_DT 
+				     , B.GOODS_CD 
+				     , B.CURR_BPRICE 
+				     , B.CURR_APRICE 
+				     , B.DC_BRATE 
+				     , B.DC_ARATE 
+				     , B.DEL_YN 
+				     , B.DISP_ORD 
+				     , C.GOODS_NM 
+				     , C.GOODS_TYPE 
+				     , C.GOODS_TNM 
+				     , C.LIST_PRICE
+				     , C.MAIN_COLOR_CD 
+				     , D.BRAND_KNM 
+				     , D.BRAND_ENM 
+				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
+				WHERE 1=1
+				  AND NOW() BETWEEN A.SOCIAL_STDT AND A.SOCIAL_EDDT 
+				  AND A.USE_YN = 'Y'		    		 /*사용여부*/
+				  AND A.APPLY_GB = 'A'					 /*적용구분(P:대기,A:적용,F:종료)*/
+				  AND A.FRONT_GB IN ('A',#{frontGb})	 /*프론트 구분*/
+				  AND B.DEL_YN = 'N'
+				ORDER BY B.DISP_ORD 
+			)F
+			WHERE F.SOCIAL_SQ = #{socialSq}
+	</select>
+</mapper>

+ 2 - 1
src/main/resources/config/application-locd.yml

@@ -57,7 +57,8 @@ download.path: /WIDE/workspace/files/data
 # PG
 pg:
     kcp:
-        log.dir: D:\\WIDE\\workspace\\files\\data\\style24\\logs\\front
+#        log.dir: D:\\WIDE\\workspace\\files\\data\\style24\\logs\\front
+        log.dir: /WIDE/workspace/files/data/style24/logs/front
         gw:
             url: testpaygw.kcp.co.kr
             port: 8090

+ 1 - 1
src/main/resources/config/application-tsit.yml

@@ -20,7 +20,7 @@ logging:
 
 domain:
     admin: //tdadmin.style24.com
-    front: //http://ts5000.ipdisk.co.kr/
+    front: //ts5000.ipdisk.co.kr
     style24: //tdfront.style24.com
     image: //tdimage.style24.com
     cdnimage: //tdimage.style24.com

+ 2 - 0
src/main/resources/i18n/messages/message_ko_KR.properties

@@ -32,6 +32,8 @@ LOGN_0005=\uBE44\uBC00\uBC88\uD638\uAC00 5\uD68C \uC774\uC0C1 \uD2C0\uB824 \uACC
 LOGN_0006=\uD734\uBA74 \uD68C\uC6D0\uC785\uB2C8\uB2E4.
 LOGN_0007=\uD0C8\uD1F4 \uD68C\uC6D0\uC785\uB2C8\uB2E4.
 LOGN_0008=\uC774\uBBF8 \uAC00\uC785\uD558\uC2E0 \uC774\uBA54\uC77C\uC774 \uC874\uC7AC\uD569\uB2C8\uB2E4.
+LOGN_0009=\uBCF8\uC778\uC778\uC99D\uC774 \uD544\uC694\uD55C \uD68C\uC6D0\uC785\uB2C8\uB2E4.
+
 
 ##\uC7A5\uBC14\uAD6C\uB2C8
 CART_0001=\uC7A5\uBC14\uAD6C\uB2C8\uC5D0 \uB2F4\uACBC\uC2B5\uB2C8\uB2E4.

+ 9 - 1
src/main/webapp/WEB-INF/views/web/SigninFormWeb.html

@@ -163,12 +163,20 @@
 								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)) {

+ 260 - 75
src/main/webapp/WEB-INF/views/web/common/fragments/GnbWeb.html

@@ -1,6 +1,6 @@
 <!DOCTYPE html>
 <html lang="ko"
-	xmlns:th="http://www.thymeleaf.org">
+	  xmlns:th="http://www.thymeleaf.org">
 <!--
  *******************************************************************************
  * @source  : GnbWeb.html
@@ -18,28 +18,14 @@
 
 	<!-- head start -->
 	<div class="common_header">
+		<!-- 프로모션 띠 배너 등록 시 노출 -->
 		<div class="hd_top_banner" style="background-color:#fd4801;">
 			<a href="" class="t_bnr">
 				<span style="margin:0 auto;height:60px;line-height:60px;font-size: 20px;font-weight: 600;letter-spacing: -.025em; color:#fff;">APP 수신동의 하면 1만 포인트 증정!</span>
-				<!--<img src="ABC.jpg" alt="프로모션">-->
+				<!--<img src="ABC.jpg" alt="프로모션"/>-->
 			</a>
 		</div>
-	
-<!-- 		<div class="quick_menu_group"> -->
-<!-- 			<div class="area"> -->
-<!-- 				<div> -->
-<!-- 					<span><a href="" title="바로가기">위치테스트1</a></span> -->
-<!-- 					<span><a href="" title="바로가기">위치테스트2</a></span> -->
-<!-- 				</div> -->
-<!-- 				<div class="inr"> -->
-<!-- 					<span><a href="" title="바로가기">로그인</a></span> -->
-<!-- 					<span><a href="" title="바로가기">회원가입</a></span> -->
-<!-- 					<span><a href="" title="바로가기">마이페이지</a></span> -->
-<!-- 					<span><a href="" title="바로가기">고객센터</a></span> -->
-<!-- 					<span><a href="" onclick="AppDownloadPopup();" title="바로가기">앱다운로드</a></span> -->
-<!-- 				</div> -->
-<!-- 			</div> -->
-<!-- 		</div> -->
+		<!-- //프로모션 띠 배너 등록 시 노출 -->
 
 		<div class="area">
 			<div class="logo">
@@ -57,62 +43,50 @@
 				<span><a href="javascript:void(0);" onclick="cfnGoToPage(_PAGE_MYPAGE);" title="마이페이지 바로가기">마이페이지</a></span>
 			</div>
 		</div>
-		
+
 		<div class="gnb">
 			<!-- nav -->
-			<div class="nav" id="header_area_01">
-				<ul class="bundle" id="nav1" >
-					<!-- [D] 전체메뉴 열림 닫힘 구분 클래스 on -->
-					<li class="all_menu">
-						<a href="#">브랜드</a>
-						<div class="depth_menu">
-							<div style="background:#333; max-width: 1780px;   margin: 0 auto;">
-								<p>브랜드</p>
-								<div class="step1">
-									<ul>
-										<li><a href="#" title="바로가기">1차_1</a></li>
-										<li><a href="#" title="바로가기">1차_2</a></li>
-									</ul>
+			<div class="nav">
+				<ul class="bundle btn_home">
+					<li><a href="javascript:void(0);" onclick="cfnGoToPage(_PAGE_MAIN);" class="">홈</a></li>
+				</ul>
+
+				<ul class="bundle">
+					<li class="has_depth">
+						<a href="javascript:void(0);" onclick="cfnGoToPage(_PAGE_ALL_BRAND);">브랜드</a>
+						<!-- 브랜드_depth -->
+						<div class="depth_menu brand">
+							<div class="head_category">
+								<div class="tit">
+									<p>브랜드</p>
+									<a href="javascript:void(0);" onclick="cfnGoToPage(_PAGE_ALL_BRAND);" class="more">전체보기</a>
 								</div>
-								<div class="step2">
-									<ul>
-										<li><a href="#" title="바로가기">2차_1</a></li>
-									</ul>
-									<ul>
-										<li><a href="" title="바로가기">3차_1</a></li>
-										<li><a href="" title="바로가기">3차_2</a></li>
-									</ul>
+								<div class="menu" id="divGnbBrandGrp">
 								</div>
 							</div>
 						</div>
 					</li>
 				</ul>
-				<ul class="bundle" id="nav2" >
-					<li><a href="#">여성</a></li>
-					<li><a href="#">남성</a></li>
-					<li><a href="#">유아동</a></li>
-					<li><a href="#">골프</a></li>
-					<li><a href="#">라이프</a></li>
-				</ul>
-				<ul class="bundle" id="nav3">
-					<li class="active" ><a href="#">베스트</a></li>
-					<li><a href="#">핫딜</a></li>
-					<li><a href="javascript:void(0);" onclick="cfnGoToPage(_PAGE_PLANNING_MAIN);" title="기획전 바로가기">기획전</a></li>
-					<li><a href="#">총알배송</a></li>
-					<li><a href="#">아울렛</a></li>
-					<li><a href="#">룩북</a></li>
-					<li><a href="javascript:void(0);" onclick="cfnGoToPage(_PAGE_EVENT_MAIN);" title="기획전 바로가기">이벤트/혜택</a></li>
+				<ul class="bundle" id="divGnbTab">
 				</ul>
 			</div>
 			<!-- // nav -->
 
+			<div class="more_category">
+				<a href="" class="btn_more_cate">더보기</a>
+				<div class="cate_list">
+					<ul id="ulGnbTab">
+					</ul>
+				</div>
+			</div>
+
 			<!-- search -->
 			<div class="search">
 				<div class="area">
 					<form id="searchMainForm" name="searchMainForm">
-						<fieldset>  
+						<fieldset>
 							<legend>통합검색</legend>
-							<input type="text" id="search" name="search" value="" placeholder="모이몰론, 남들보다 빠르게! 신상 check" class="search_input" title="검색어 입력" maxlength="100">								
+							<input type="text" id="search" name="search" value="" placeholder="모이몰론, 남들보다 빠르게! 신상 check" class="search_input" title="검색어 입력" maxlength="100">
 							<div class="search_group" id="ark" style="display: none;">
 								<div id="ark_down" style="position: absolute; display: block; cursor: pointer; top: 3px; left: 366px;"></div>
 								<div id="ark_up" style="position: absolute; display: none; cursor: pointer; top: 3px; left: 366px;"></div>
@@ -185,33 +159,244 @@
 				</div>
 
 				<a href="#" class="btn_ico btn_cart" title="장바구니 바로가기"><i class="ico ico_bag"></i><span class="circle_count">99+</span></a>
-				
+
 			</div>
 			<!-- // search -->
 		</div>
 	</div>
 	<!-- head end -->
 
-<script th:inline="javascript">
-/*<![CDATA[*/
-	/* header minify */
-	$(function(){
-		$(window).scroll(function(){
-			var scroll = $(this).scrollTop();
-			var headerH =  $("#header").height();
-			if ($(window).scrollTop() > headerH){
-				$("#header").addClass("minify");
-				return false;
+	<script th:inline="javascript">
+		/*<![CDATA[*/
+		// GNB탭 > 카테고리
+		let fnGetGnbCategory = function(cateList) {
+			let tag = '';
+
+			if (cateList.length > 0) {
+				$.each(cateList, function(idx1, cate1) {
+					tag += '<li class="has_depth">\n'; //depth_menu 있을 시 has_depth 클래스 추가
+					tag += '	<a href="javascript:void(0);" onclick="cfnGoToCategory(' + cate1.cate1Nm + ');">' + cate1.cate1Nm + '</a>\n';
+					tag += '	<div class="depth_menu category">\n';
+					tag += '		<div class="head_category">\n';
+					tag += '			<div class="tit">\n';
+					tag += '				<p>' + cate1.cate1Nm + '</p>\n';
+					tag += '				<a href="javascript:void(0);" onclick="cfnGoToCategory(' + cate1.cate1No + ');" class="more">전체보기</a>\n';
+					tag += '			</div>\n';
+
+					if (cate1.leafYn == 'N' && cate1.cate2List.length > 0) {
+						tag += '			<div class="menu">\n';
+						tag += '				<ul class="maintabs">\n';
+
+						$.each(cate1.cate2List, function(idx2, cate2) {
+							tag += '					<li>\n';
+							tag += '						<a href="javascript:void(0);" onclick="cfnGoToCategoryMain(\'' + cate2.cateGb + '\',\'' + cate2.cate1No + '\',\'' + cate2.cate2No + '\');">' + cate2.cate2Nm + '</a>\n';
+
+							if (cate2.leafYn == 'N' && cate2.cate3List.length > 0) {
+								tag += '						<ul class="box_depth2">\n';
+
+								$.each(cate2.cate3List, function(idx3, cate3) {
+									tag += '							<li>\n';
+									tag += '								<a href="javascript:void(0);" onclick="cfnGoToCategoryMain(\'' + cate3.cateGb + '\',\'' + cate3.cate1No + '\',\'' + cate3.cate2No + '\',\'' + cate3.cate3No + '\');">' + cate3.cate3Nm + '</a>\n';
+
+									if (cate3.leafYn == 'N' && cate3.cate4List.length > 0) {
+										tag += '								<ul class="box_depth3">\n';
+
+										$.each(cate3.cate4List, function(idx4, cate4) {
+											tag += '									<li><a href="javascript:void(0);" onclick="cfnGoToCategoryMain(\'' + cate4.cateGb + '\',\'' + cate4.cate1No + '\',\'' + cate4.cate2No + '\',\'' + cate4.cate3No + '\',\'' + cate4.cate4No + '\');">' + cate4.cate4Nm + '</a></li>\n';
+										});
+
+										tag += '								</ul>\n';
+									}
+
+									tag += '							</li>\n';
+								});
+
+								tag += '						</ul>\n';
+							}
+
+							tag += '					</li>\n';
+						});
+
+						tag += '				</ul>\n';
+						tag += '			</div>\n';
+						tag += '		</div>\n';
+						tag += '	</div>\n';
+					}
+
+					// if (cate1.bannerList.length > 0) {
+					// 	tag += '	<div class="head_banner">\n';
+					// 	tag += '		<div class="tit">\n';
+					// 	tag += '			<p>가을의 신상 만나기</p>\n';
+					// 	tag += '		</div>\n';
+					// 	tag += '		<div class="list">\n';
+					// 	tag += '			<ul class="clear event_con">\n';
+					// 	tag += '				<li>\n';
+					// 	tag += '					<a href="">\n';
+					// 	tag += '						<div class="ev_img"><img src="/images/pc/thumb/ev_list_img01.jpg" alt="ATTENTION! 20FW HOLIDAY TBJ 주목할 홀리데이 TBJ 컬렉션"></div>\n';
+					// 	tag += '						<div class="txt">\n';
+					// 	tag += '							<p class="tit">2020 FALL COLLECTION 가을에는 이 컬러 2020 FALL COLLECTION 가을에는 이 컬러</p>\n';
+					// 	tag += '						</div>\n';
+					// 	tag += '					</a>\n';
+					// 	tag += '				</li>\n';
+					// 	tag += '				<li>\n';
+					// 	tag += '					<a href="">\n';
+					// 	tag += '						<div class="ev_img"><img src="/images/pc/thumb/ev_list_img02.jpg" alt="단 48시간, 퓨어캐시미어 최대 80%세일 PURE CASHMERE 48H POP-UP"></div>\n';
+					// 	tag += '						<div class="txt">\n';
+					// 	tag += '							<p class="tit">FALL NEW ARRIVAL</p>\n';
+					// 	tag += '						</div>\n';
+					// 	tag += '					</a>\n';
+					// 	tag += '				</li>\n';
+					// 	tag += '			</ul>\n';
+					// 	tag += '		</div>\n';
+					// 	tag += '	</div>\n';
+					// }
+
+					tag += '</li>\n';
+				});
 			}
-			else {
-				$("#header").removeClass("minify");
+
+			return tag;
+		}
+
+		// GNB탭 생성
+		let fnCreateGnbTap = function() {
+			$.getJSON('/display/gnb/tap/list'
+				, function(result, status) {
+					if (status == 'success') {
+						if (result.length > 0) {
+							$('#divGnbTab').html('');
+							$('#ulGnbTab').html('');
+
+							$.each(result, function(idx, item) {
+								if (item.contentsType == 'C' || item.contentsType == 'O') { // 컨텐츠유형:카테고리, 아울렛
+									let gnbCate = fnGetGnbCategory(item.cateList);
+									$('#divGnbTab').append(gnbCate);
+									$('#ulGnbTab').append(gnbCate);
+								} else if (item.contentsType == 'L') { // 컨텐츠유형:링크
+									$('#divGnbTab').append('<li><a href="' + item.linkUrl + '">' + item.title + '</a></li>');
+									$('#ulGnbTab').append('<li><a href="' + item.linkUrl + '">' + item.title + '</a></li>');
+								}
+							});
+						}
+					}
+				});
+		}
+
+		// GNB탭 > 브랜드 생성
+		let fnCreateGnbBrandGroup = function() {
+			$.getJSON('/display/gnb/brand/group/list'
+				, function(result, status) {
+					if (status == 'success') {
+						if (result.length > 0) {
+							$('#divGnbBrandGrp').html('');
+							let tag = '';
+							let prevTitle = '';
+
+							$.each(result, function (idx, item) {
+								if (prevTitle != item.title) {
+									if (idx > 0) {
+										tag += '		</ul>\n';
+										tag += '	</div>\n';
+										tag += '</div>\n';
+									}
+
+									tag += '<div class="row">\n';
+									tag += '	<p>' + item.title + '</p>\n';
+									tag += '	<div class="brand_list swiper-container">\n';
+									tag += '		<ul class="clear swiper-wrapper">\n';
+								} else {
+									tag += '			<li class="swiper-slide">\n';
+									tag += '				<a href="javascript:void(0);" onclick="cfnGoToBrandMain(' + item.brandGroupNo + ');">\n';
+									tag += '					<img src="' + _uploadDefaultUrl + item.logoFileNm + '" alt=""/>\n';
+									tag += '					<span><em>' + item.brandGroupNm + '</em></span>\n';
+									tag += '				</a>\n';
+									tag += '			</li>\n';
+								}
+
+								prevTitle = item.title;
+							});
+
+							tag += '		</ul>\n';
+							tag += '	</div>\n';
+							tag += '</div>\n';
+
+							$('#divGnbBrandGrp').html(tag);
+						}
+
+						fnCreateGnbTap();
+					}
+			});
+		}
+
+		$(document).ready(function() {
+			//검색창 호출
+			$(".common_search").load("sch_layer_pop.html");
+
+			// GNB toggle
+			$(document).on('mouseenter','.common_header .gnb .nav > ul > li',function(e){
+				if(!$(this).hasClass('has_depth')){
+					$('.black_screen').hide();
+					$('.common_header .gnb .depth_menu').hide();
+				} else if($(this).hasClass('has_depth')){
+					$('.black_screen').show();
+					$(this).find('.depth_menu').show();
+					$(this).parents('ul').siblings('ul').find('li.has_depth .depth_menu').hide();
+					$(this).siblings('li.has_depth').find('.depth_menu').hide();
+				}
+			}).on('mouseleave','.common_header .gnb',function(e){
+				$('.black_screen').hide();
+				$('.common_header .gnb .depth_menu').hide();
+			});
+
+			// GNB 하위메뉴
+			$(document).on('mouseenter','.common_header .maintabs li',function(e){
+				if($(this).find('> ul').length > 0){
+					$(this).addClass('on');
+				}
+				$(this).find('> ul').show();
+				$(this).siblings('li').find('> ul').hide();
+			});
+
+			// GNB 더보기
+			$(document).on('click','.more_category .btn_more_cate',function(e){
+				$(this).parent('.more_category').toggleClass('on');
+				$(this).parent('.more_category').find('.cate_list').toggle();
 				return false;
-			}
+			});
+
+			// GNB - 슬라이드 > 브랜드_GNB
+			var brand_gnb_slide = new Swiper('#header .gnb .brand_list', {
+				observer: true,
+				observeParents: true,
+				centeredSlides: false,
+				slidesPerView: 'auto',
+				freeMode:true,
+			});
+
+			//통합검색 - 슬라이드 > 지금 고객님들이 많이 보고 있어요
+			var realtimeItemSwiper = new Swiper('.common_search .realtime_slider .swiper-container', {
+				observer: true,
+				observeParents: true,
+				slidesPerView: 5,
+				spaceBetween: 20,
+				autoplay: {
+					delay: 2500,
+					disableOnInteraction:false,
+				},
+				navigation: {
+					nextEl: '.common_search .realtime_slider .swiper-button-next',
+					prevEl: '.common_search .realtime_slider .swiper-button-prev',
+				},
+				pagination: {
+					el: '.common_search .realtime_slider .swiper-pagination',
+					clickable: true,
+				},
+			});
+
+			fnCreateGnbBrandGroup();
 		});
-	});
-	/* //header minify */
-/*]]>*/
-</script>
+		/*]]>*/
+	</script>
 
 </header>
 

+ 470 - 0
src/main/webapp/WEB-INF/views/web/common/fragments/GnbWeb2.html

@@ -0,0 +1,470 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : GnbWeb.html
+ * @desc    : GNB
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.01.28   gagamel     최초 작성
+ *******************************************************************************
+ -->
+<header id="header" th:fragment="gnb">
+
+	<!-- head start -->
+	<div class="common_header">
+		<!-- 프로모션 띠 배너 등록 시 노출 -->
+		<div class="hd_top_banner" style="background-color:#fd4801;">
+			<a href="" class="t_bnr">
+				<span style="margin:0 auto;height:60px;line-height:60px;font-size: 20px;font-weight: 600;letter-spacing: -.025em; color:#fff;">APP 수신동의 하면 1만 포인트 증정!</span>
+				<!--<img src="ABC.jpg" alt="프로모션"/>-->
+			</a>
+		</div>
+		<!-- //프로모션 띠 배너 등록 시 노출 -->
+	
+		<div class="area">
+			<div class="logo">
+				<a href="javascript:void(0);" onclick="cfnGoToPage(_PAGE_MAIN);">
+					<h1>
+						<i class="ico ico_logo"></i>
+						<em class="blind">STYLE24</em>
+					</h1>
+				</a>
+			</div>
+			<div class="util_group">
+				<span th:if="${sessionInfo == null}"><a href="javascript:void(0);" onclick="cfnGoToPage(_PAGE_LOGIN);" title="로그인 바로가기">로그인</a></span>
+				<span th:if="${sessionInfo != null}"><a href="javascript:void(0);" onclick="cfnGoToPage(_PAGE_LOGOUT);" title="로그아웃">로그아웃</a></span>
+				<span th:if="${sessionInfo == null}"><a href="javascript:void(0);" onclick="cfnGoToPage(_PAGE_CUSTOMER_JOIN_TYPE);" title="회원가입 바로가기">회원가입</a></span>
+				<span><a href="javascript:void(0);" onclick="cfnGoToPage(_PAGE_MYPAGE);" title="마이페이지 바로가기">마이페이지</a></span>
+			</div>
+		</div>
+		
+		<div class="gnb">
+			<!-- nav -->
+			<div class="nav">
+				<ul class="bundle btn_home">
+					<li><a href="javascript:void(0);" onclick="cfnGoToPage(_PAGE_MAIN);" class="">홈</a></li>
+				</ul>
+			
+				<ul class="bundle">
+					<li class="has_depth">
+						<a href="javascript:void(0);" onclick="cfnGoToPage(_PAGE_ALL_BRAND);">브랜드</a>
+						<!-- 브랜드_depth -->
+						<div class="depth_menu brand">
+							<div class="head_category">
+								<div class="tit">
+									<p>브랜드</p>
+									<a href="javascript:void(0);" onclick="cfnGoToPage(_PAGE_ALL_BRAND);" class="more">전체보기</a>
+								</div>
+								<div class="menu" id="divBrandGrp">
+								</div>
+							</div>
+						</div>
+					</li>
+				</ul>
+				
+				<ul class="bundle" id="divCate">
+				</ul>
+				
+				<ul class="bundle" id="category3">
+					<li class="active" ><a href="#">베스트</a></li>
+				<li><a href="#">핫딜</a></li>
+				<li><a href="#">기획전</a></li>
+				<li><a href="#">총알배송</a></li>
+				<li class="has_depth">
+					<a href="#">아울렛</a>
+					<!-- depth_menu start -->
+					<div class="depth_menu category">
+						<div class="head_category">
+							<div class="tit">
+								<p>아울렛</p>
+								<a href="" class="more">전체보기</a>
+							</div>
+							<div class="menu">
+								<ul class="maintabs">
+									<li><a href="javascript:;">티셔츠/셔츠</a></li>
+									<li>
+										<a href="javascript:;">여성</a>
+										<!-- 2depth -->
+										<ul class="box_depth2">
+											<li>
+												<a href="/">상의</a>
+											</li>
+											<li>
+												<a href="/">하의</a>
+												<!-- 3depth -->
+												<ul class="box_depth3">
+													<li><a href="/">상의</a></li>
+													<li><a href="/">하의</a></li>
+													<li><a href="/">세트</a></li>
+													<li><a href="/">시즌스포츠의류</a></li>
+													<li>
+														<a href="/">스포츠잡화</a>
+														<!-- 4depth -->
+														<ul class="box_depth4">
+															<li><a href="/">운동화/등산화</a></li>
+															<li><a href="/">가방/모자/잡화</a></li>
+														</ul> 
+													</li>
+												</ul>                
+											</li>
+											<li>
+												<a href="/">세트</a>
+											</li>
+											<li>
+												<a href="/">시즌스포츠의류</a>
+											</li>
+											<li>
+												<a href="javascript:;">스포츠잡화</a>
+											</li>
+										</ul>    
+									</li>
+									<li>
+										<a href="">원피스/스커트</a>
+									</li>
+									<li><a href="">팬츠/레깅스</a></li>
+									<li><a href="">데님</a></li>
+									<li><a href="">자켓/점퍼/코트</a></li>
+									<li><a href="">트레이닝/스포츠</a></li>
+									<li><a href="">여성잡화</a></li>
+									<li><a href="">언더웨어</a></li>
+								</ul>   
+							</div>
+						</div>
+						<div class="head_banner">
+							<div class="tit">
+								<p>가을의 신상 만나기</p>
+							</div>
+							<div class="list">
+								<ul class="clear event_con">
+									<li>
+										<a href="">
+											<div class="ev_img"><img src="/images/pc/thumb/ev_list_img01.jpg" alt="ATTENTION! 20FW HOLIDAY TBJ 주목할 홀리데이 TBJ 컬렉션"></div>
+											<div class="txt">
+												<p class="tit">2020 FALL COLLECTION 가을에는 이 컬러 2020 FALL COLLECTION 가을에는 이 컬러</p>
+											</div>
+										</a>
+									</li>
+									<li>
+										<a href="">
+											<div class="ev_img"><img src="/images/pc/thumb/ev_list_img02.jpg" alt="단 48시간, 퓨어캐시미어 최대 80%세일 PURE CASHMERE 48H POP-UP">
+											</div>
+											<div class="txt">
+												<p class="tit">FALL NEW ARRIVAL</p>
+											</div>
+										</a>
+									</li>
+								</ul>
+							</div>
+						</div>
+					</div>
+					<!-- //depth_menu end -->
+				</li>
+				<li><a href="#">룩북</a></li>
+				<li><a href="#">이벤트/혜택</a></li>
+				</ul>
+			</div>
+			<!-- // nav -->
+
+			<div class="search">
+				<div class="area">
+					<form id="searchMainForm" name="searchMainForm">
+						<fieldset>  
+							<legend>통합검색</legend>
+							<input type="text" id="search" name="search" value="" placeholder="모이몰론, 남들보다 빠르게! 신상 check" class="search_input" title="검색어 입력" maxlength="100">								
+							<div class="search_group" id="ark" style="display: none;">
+								<div id="ark_down" style="position: absolute; display: block; cursor: pointer; top: 3px; left: 366px;"></div>
+								<div id="ark_up" style="position: absolute; display: none; cursor: pointer; top: 3px; left: 366px;"></div>
+								<div class="area">
+									<p class="blind">연관검색</p>
+									<div class="search_list">
+										<div id="ark_content_list" style="width: 410px;"></div>
+										<div id="ark_category_list" class="category"></div>
+										<div id="ark_event_list" class="exhibition"></div>
+										<div id="ark_powerdeal_list"></div>
+									</div>
+									<div class="close">
+										<a href="#" class="search_close">닫기<i class="ico ico_search_close_gray"><em>닫기</em></i></a>
+									</div>
+								</div>
+							</div>
+							<!-- 검색어 입력전 -->
+							<div id="mykeyword" class="my_search_group sch_auto" style="display: none;">
+								<p class="blind">인기 검색어 &amp; 최근 검색어</p>
+								<div class="area">
+									<div class="hot_search_list" id="popkeyword">
+										<p>인기 검색어</p>
+										<ul>
+											<li>
+												<a href="#"><span>1</span>나이키</a>
+											</li>
+											<li>
+												<a href="#"><span>2</span>tamiya</a>
+											</li>
+											<li>
+												<a href="#"><span>3</span>니콘 z6</a>
+											</li>
+											<li>
+												<a href="#"><span>4</span>갤럭시 자켓</a>
+											</li>
+											<li>
+												<a href="#"><span>5</span>아동운동화</a>
+											</li>
+											<li>
+												<a href="#"><span>6</span>타미야</a>
+											</li>
+											<li>
+												<a href="#"><span>7</span>널디</a>
+											</li>
+											<li>
+												<a href="#"><span>8</span>호박목걸이</a>
+											</li>
+											<li>
+												<a href="#"><span>9</span>제시뉴욕</a>
+											</li>
+											<li>
+												<a href="#"><span>10</span>뉴에라</a>
+											</li>
+										</ul>
+									</div>
+									<div class="my_search_list" id="searchkeyword">
+										<p>최근 검색어</p>
+										<button type="button" onclick="removeMyKeyword();">최근 검색어 전체삭제<i class="ico ico_mysearch_delete"></i></button>
+									</div>
+								</div>
+								<div class="close">
+									<a href="#" class="search_close">닫기<i class="ico ico_search_close_gray"><em>닫기</em></i></a>
+								</div>
+							</div>
+							<!-- // 검색어 입력전 -->
+							<button type="button" class="close"><i class="ico ico_search_close"><em>닫기</em></i></button>
+							<button type="button" class="sch_btn" onclick="goSearch();"><i class="ico ico_search"><em>검색</em></i></button>
+						</fieldset>
+					</form>
+				</div>
+
+				<a href="#" class="btn_ico btn_cart" title="장바구니 바로가기"><i class="ico ico_bag"></i><span class="circle_count">99+</span></a>
+				
+			</div>
+			<!-- // search -->
+		</div>
+	</div>
+	<!-- head end -->
+
+<script th:inline="javascript">
+/*<![CDATA[*/
+	// 탭 > 브랜드 생성
+	let fnCreateBrandGroup = function(brandGrpList) {
+		let tag = '';
+		
+		if (brandGrpList.length > 0) {
+			tag += '<div class="row">\n';
+			tag += '	<p>캐주얼</p>\n';
+			tag += '	<div class="brand_list swiper-container">\n';
+			tag += '		<ul class="clear swiper-wrapper">\n';
+			
+			$.each(brandGrpList, function(idx, item) {
+				tag += '			<li class="swiper-slide">\n';
+				tag += '				<a href="javascript:void(0);" onclick="cfnGoToBrandMain(' + item.brandGroupNo + ');">\n';
+				tag += '					<img src="' + _uploadDefaultUrl + item.logoFileNm + '" alt=""/>\n';
+				tag += '					<span><em>' + item.brandGroupNm + '</em></span>\n';
+				tag += '				</a>\n';
+				tag += '			</li>\n';
+			});
+			
+			tag += '		</ul>\n';
+			tag += '	</div>\n';
+			tag += '</div>\n';
+		}
+		
+		return tag;
+	}
+	
+	// 탭 > 카테고리 생성
+	let fnCreateCategory = function(cateList) {
+		let tag = '';
+		
+		if (cateList.length > 0) {
+			$.each(cateList, function(idx1, cate1) {
+				tag += '<li class="has_depth">\n'; //depth_menu 있을 시 has_depth 클래스 추가
+				tag += '	<a href="javascript:void(0);" onclick="cfnGoToCategory(' + cate1.cate1Nm + ');">' + cate1.cate1Nm + '</a>\n';
+				tag += '	<div class="depth_menu category">\n';
+				tag += '		<div class="head_category">\n';
+				tag += '			<div class="tit">\n';
+				tag += '				<p>' + cate1.cate1Nm + '</p>\n';
+				tag += '				<a href="javascript:void(0);" onclick="cfnGoToCategory(' + cate1.cate1No + ');" class="more">전체보기</a>\n';
+				tag += '			</div>\n';
+				
+				if (cate1.leafYn == 'N' && cate1.cate2List.length > 0) {
+					tag += '			<div class="menu">\n';
+					tag += '				<ul class="maintabs">\n';
+					
+					$.each(cate1.cate2List, function(idx2, cate2) {
+						tag += '					<li>\n';
+						tag += '						<a href="javascript:void(0);" onclick="cfnGoToCategoryMain(\'' + cate2.cateGb + '\',\'' + cate2.cate1No + '\',\'' + cate2.cate2No + '\');">' + cate2.cate2Nm + '</a>\n';
+						
+						if (cate2.leafYn == 'N' && cate2.cate3List.length > 0) {
+							tag += '						<ul class="box_depth2">\n';
+							
+							$.each(cate2.cate3List, function(idx3, cate3) {
+								tag += '							<li>\n';
+								tag += '								<a href="javascript:void(0);" onclick="cfnGoToCategoryMain(\'' + cate3.cateGb + '\',\'' + cate3.cate1No + '\',\'' + cate3.cate2No + '\',\'' + cate3.cate3No + '\');">' + cate3.cate3Nm + '</a>\n';
+								
+								if (cate3.leafYn == 'N' && cate3.cate4List.length > 0) {
+									tag += '								<ul class="box_depth3">\n';
+								
+									$.each(cate3.cate4List, function(idx4, cate4) {
+										tag += '									<li><a href="javascript:void(0);" onclick="cfnGoToCategoryMain(\'' + cate4.cateGb + '\',\'' + cate4.cate1No + '\',\'' + cate4.cate2No + '\',\'' + cate4.cate3No + '\',\'' + cate4.cate4No + '\');">' + cate4.cate4Nm + '</a></li>\n';
+									});
+									
+									tag += '								</ul>\n';
+								}
+								
+								tag += '							</li>\n';
+							});
+							
+							tag += '						</ul>\n';
+						}
+						
+						tag += '					</li>\n';
+					});
+					
+					tag += '				</ul>\n';
+					tag += '			</div>\n';
+					tag += '		</div>\n';
+					tag += '	</div>\n';
+				}
+				
+				if (cate1.bannerList.length > 0) {
+					tag += '	<div class="head_banner">\n';
+					tag += '		<div class="tit">\n';
+					tag += '			<p>가을의 신상 만나기</p>\n';
+					tag += '		</div>\n';
+					tag += '		<div class="list">\n';
+					tag += '			<ul class="clear event_con">\n';
+					tag += '				<li>\n';
+					tag += '					<a href="">\n';
+					tag += '						<div class="ev_img"><img src="/images/pc/thumb/ev_list_img01.jpg" alt="ATTENTION! 20FW HOLIDAY TBJ 주목할 홀리데이 TBJ 컬렉션"></div>\n';
+					tag += '						<div class="txt">\n';
+					tag += '							<p class="tit">2020 FALL COLLECTION 가을에는 이 컬러 2020 FALL COLLECTION 가을에는 이 컬러</p>\n';
+					tag += '						</div>\n';
+					tag += '					</a>\n';
+					tag += '				</li>\n';
+					tag += '				<li>\n';
+					tag += '					<a href="">\n';
+					tag += '						<div class="ev_img"><img src="/images/pc/thumb/ev_list_img02.jpg" alt="단 48시간, 퓨어캐시미어 최대 80%세일 PURE CASHMERE 48H POP-UP"></div>\n';
+					tag += '						<div class="txt">\n';
+					tag += '							<p class="tit">FALL NEW ARRIVAL</p>\n';
+					tag += '						</div>\n';
+					tag += '					</a>\n';
+					tag += '				</li>\n';
+					tag += '			</ul>\n';
+					tag += '		</div>\n';
+					tag += '	</div>\n';
+				}
+				
+				tag += '</li>\n';
+			});
+		}
+		
+		return tag;
+	}
+	
+	// 탭 목록
+	let fnTapList = function() {
+		$.getJSON('/display/tap/list'
+			, function(result, status) {
+				if (status == 'success') {
+					$.each(result, function(idx, item) {
+						if (item.contentsType == 'B') { // 컨텐츠유형:브랜드
+							$('#divBrandGrp').html('');
+							$('#divBrandGrp').append(fnCreateBrandGroup(item.casualBrandGroupList));
+							$('#divBrandGrp').append(fnCreateBrandGroup(item.golfBrandGroupList));
+							$('#divBrandGrp').append(fnCreateBrandGroup(item.kidsBrandGroupList));
+						} else if (item.contentsType == 'C') { // 컨텐츠유형:카테고리
+							$('#divCate').html('');
+							$('#divCate').append(fnCreateCategory(item.cateList));
+						}
+					});
+				}
+			});
+	}
+	
+	$(document).ready(function() {
+		//검색창 호출
+		$(".common_search").load("sch_layer_pop.html");
+		
+		// GNB toggle
+		$(document).on('mouseenter','.common_header .gnb .nav > ul > li',function(e){
+			if(!$(this).hasClass('has_depth')){
+				$('.black_screen').hide();
+				$('.common_header .gnb .depth_menu').hide();
+			} else if($(this).hasClass('has_depth')){
+				$('.black_screen').show();
+				$(this).find('.depth_menu').show();
+				$(this).parents('ul').siblings('ul').find('li.has_depth .depth_menu').hide();
+				$(this).siblings('li.has_depth').find('.depth_menu').hide();
+			}
+		}).on('mouseleave','.common_header .gnb',function(e){
+			$('.black_screen').hide();
+			$('.common_header .gnb .depth_menu').hide();
+		});
+
+		// GNB 하위메뉴
+		$(document).on('mouseenter','.common_header .maintabs li',function(e){
+			if($(this).find('> ul').length > 0){
+				$(this).addClass('on');
+			}
+			$(this).find('> ul').show();
+			$(this).siblings('li').find('> ul').hide();
+		});
+
+		// GNB 더보기
+		$(document).on('click','.more_category .btn_more_cate',function(e){
+			$(this).parent('.more_category').toggleClass('on');
+			$(this).parent('.more_category').find('.cate_list').toggle();
+			return false;
+		});
+
+		// GNB - 슬라이드 > 브랜드_GNB
+		var brand_gnb_slide = new Swiper('#header .gnb .brand_list', {
+			observer: true,
+			observeParents: true,
+			centeredSlides: false,
+			slidesPerView: 'auto',
+			freeMode:true,
+		});
+
+		//통합검색 - 슬라이드 > 지금 고객님들이 많이 보고 있어요 
+		var realtimeItemSwiper = new Swiper('.common_search .realtime_slider .swiper-container', {
+			observer: true,
+			observeParents: true,
+			slidesPerView: 5,
+			spaceBetween: 20,
+			autoplay: {
+				delay: 2500,
+				disableOnInteraction:false,
+			},
+			navigation: {
+				nextEl: '.common_search .realtime_slider .swiper-button-next',
+				prevEl: '.common_search .realtime_slider .swiper-button-prev',
+			},
+			pagination: {
+				el: '.common_search .realtime_slider .swiper-pagination',
+				clickable: true,
+			},
+		});
+		
+		fnTapList();
+	});
+/*]]>*/
+</script>
+
+</header>
+
+</html>

+ 1 - 1
src/main/webapp/WEB-INF/views/web/common/layout/MypageLayoutWeb.html

@@ -65,7 +65,7 @@
 <th:block th:replace="~{web/common/fragments/ScriptsWeb :: scripts}"></th:block>
 <!-- <th:block th:replace="~{web/common/fragments/MarketingScripts :: mscripts}"></th:block> -->
 
-<script th:src="@{'/ux/pc/js/cart.js?v=' + ${#calendars.format(#calendars.createNow(), 'yyyyMMddHHmmss')}}" src="/ux/pc/js/cart.js"></script>
+<script th:src="@{'/ux/pc/js/mypage.js?v=' + ${#calendars.format(#calendars.createNow(), 'yyyyMMddHHmmss')}}" src="/ux/pc/js/mypage.js"></script>
 
 <script th:inline="javascript">
 /*<![CDATA[*/

+ 80 - 0
src/main/webapp/WEB-INF/views/web/customer/CertificationFormWeb.html

@@ -0,0 +1,80 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org"
+	xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
+	layout:decorator="web/common/layout/DefaultLayoutWeb">
+<!--
+ *******************************************************************************
+ * @source  : DormantCertifyFormWeb.html
+ * @desc    : 휴면회원 본인인증 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2021 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.02.05   jsshin     최초 작성
+ *******************************************************************************
+ -->
+<body>
+
+<th:block layout:fragment="content">
+<div id="container" class="container mb">
+	<div class="wrap">
+		<div class="content dormant"> <!-- 페이지특정 클래스 = dormant -->
+			<div class="cont_head">
+				<h4>본인인증</h4>
+			</div>
+			<div class="cont_body">
+				<form class="form_wrap form_col_c form_full" role="form">
+					<div class="form_info">
+						<span class="ico_content_dormant"></span>
+						<p class="c_primary">본인인증이 필요한 고객이므로 본인인증 해주시기 바랍니다.</p>
+					</div>
+					<div class="btn_group_block">
+						<div class="ui_row">
+							<div class="ui_col_12">
+								<button type="button" class="btn btn_default btn_block" onclick="cfnOpenCellphoneCertify();">
+									<span><i class="ico ico_phone"></i>휴대폰인증</span>
+								</button>
+							</div>
+						</div>
+					</div>
+				</form>
+			</div>
+		</div>
+	</div>
+</div>
+
+<script th:inline="javascript">
+/*<![CDATA[*/
+	// 나이스 본인인증 후 콜백
+	var fnNiceCallBack = function(encData) {
+		if (!gagajf.isNull(encData)) {
+			let custInfo = {};
+			custInfo.encData = encData;
+			let jsonData = JSON.stringify(custInfo);
+			gagajf.ajaxJsonSubmit('/customer/certification/save', jsonData, fnCertificationCallback);
+		}
+	};
+
+	var fnCertificationCallback = function (result) {
+		if (result.isSuccess) { //인증 성공시 다시 로그인 페이지
+			mcxDialog.alertC("본인인증 완료 되었습니다.", {
+				sureBtnText: "확인",
+				sureBtnClick: function() {
+					cfnGoToPage(_PAGE_MAIN);
+				}
+			});
+			return;
+		} else { // 이미 가입된 이력이 있는 경우 완료 페이지
+			cfnGoToPage(_PAGE_CUSTOMER_JOIN_COMPLETE);
+		}
+	}
+/*]]>*/
+</script>
+
+</th:block>
+
+</body>
+</html>

+ 5 - 1
src/main/webapp/WEB-INF/views/web/customer/DormantCertifyFormWeb.html

@@ -74,7 +74,11 @@
 		if (result.isRelase) {
 			cfnGoToPage(_PAGE_CUSTOMER_DORMANT_COMPLETE);
 		} else {
-			mcxDialog.alert("휴면해제 실패하였습니다. <br> 고객센터에 문의 하시기 바랍니다.");
+			let msg = "휴면 해제 실패하였습니다. <br> 고객센터에 문의하시기 바랍니다.";
+			if (result.errorType === 'DIFFERENT_CI') {
+				msg = "등록된 본인인증 정보와 다릅니다. <br> 고객센터에 문의하시기 바랍니다.";
+			}
+			mcxDialog.alert(msg);
 			return;
 		}
 	}

+ 80 - 0
src/main/webapp/WEB-INF/views/web/customer/PasswordCampaignFormWeb.html

@@ -0,0 +1,80 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org"
+	xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
+	layout:decorator="web/common/layout/DefaultLayoutWeb">
+<!--
+ *******************************************************************************
+ * @source  : PasswordCampaignFormWeb.html
+ * @desc    : 비밀번호 캠페인 화면 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2021 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.03.11   jsshin     최초 작성
+ *******************************************************************************
+ -->
+<body>
+
+<th:block layout:fragment="content">
+<div id="container" class="container mb">
+	<div class="wrap">
+		<div class="content campaign"> <!-- 페이지특정 클래스 = campaign -->
+			<div class="cont_head">
+				<h4>비밀번호 변경 캠페인</h4>
+			</div>
+			<div class="cont_body">
+				<form class="form_wrap form_col_c" role="form">
+					<div class="form_info">
+						<span class="ico_content_security"></span>
+						<p class="">고객님! <span class="c_primary">비밀번호 변경</span>으로 <br>소중한 개인정보를 지켜주세요!</p>
+						<p class="c_primary mt5">고객님은 3개월동안 비밀번호를 변경하지 않으셨습니다!</p>
+					</div>
+					<div class="form_summary t_c">
+						<p class="t_info mt10">장기간 비밀번호를 변경하지 않고 동일한 비밀번호를 사용중인 경우,
+							<br> 개인정보를 안전하게 보호하고, 개인정보 도용으로 인한 피해를 방지하기 위해
+							<br>주기적으로 비밀번호를 변경하도록 안내해드리고 있습니다.
+						</p>
+						<p class="t_info mt10">고객님의 소중한 정보 보호를 위해 적극적인 참여 부탁 드립니다.</p>
+					</div>
+					<div class="btn_group_block btn_group_md ui_row">
+						<div class="ui_col_6">
+							<button type="button" class="btn btn_primary btn_block" onclick="cfnGoToPage(_PAGE_CUSTOMER_PWD_CHANGE_TEMP)">
+								<span>변경하기</span>
+							</button>
+						</div>
+						<div class="ui_col_6">
+							<button type="button" class="btn btn_dark btn_block" id="btnPwdNext">
+								<span>30일간 보지않기</span>
+							</button>
+						</div>
+					</div>
+				</form>
+			</div>
+		</div>
+	</div>
+</div>
+
+
+<script th:inline="javascript">
+/*<![CDATA[*/
+
+	// 30일간 보지 않기
+	$('#btnPwdNext').on('click', function () {
+		let jsonData = JSON.stringify({});
+		gagajf.ajaxJsonSubmit('/customer/password/date/update', jsonData, fnPwdDateUpdateCallback);
+	});
+
+	var fnPwdDateUpdateCallback = function (result) {
+		cfnGoToPage(_PAGE_MAIN);
+	}
+
+/*]]>*/
+</script>
+
+</th:block>
+
+</body>
+</html>

+ 10 - 3
src/main/webapp/WEB-INF/views/web/customer/PasswordChangeFormWeb.html

@@ -23,7 +23,8 @@
 	<div class="wrap">
 		<div class="content find">
 			<div class="cont_head">
-				<h4>아이디&#47;비밀번호 찾기</h4>
+				<h4 th:if="${pageGb == 'find'}">아이디&#47;비밀번호 찾기</h4>
+				<h4 th:if="${pageGb == 'temp'}">비밀번호 변경</h4>
 			</div>
 			<div class="cont_body show">
 				<form id="resetPasswordForm" name="resetPasswordForm" class="form_wrap form_col_c" role="form" method="post">
@@ -89,7 +90,8 @@
 						<div class="btn_group_block btn_group_md ui_row">
 							<div class="ui_col_12">
 								<button type="button" id="btnSavePassword" class="btn btn_dark btn_block" disabled="disabled">
-									<span>변경 후 다시 로그인</span>
+									<span th:if="${pageGb == 'find'}">변경 후 다시 로그인</span>
+									<span th:if="${pageGb == 'temp'}">변경하기</span>
 								</button>
 							</div>
 						</div>
@@ -104,6 +106,7 @@
 <script th:src="@{'/biz/customer.js?v=' + ${#calendars.format(#calendars.createNow(), 'yyyyMMddHHmmss')}}" src="/biz/customer.js"></script>
 <script th:inline="javascript">
 /*<![CDATA[*/
+	const pageGb = [[${pageGb}]];
 
 	// 비밀번호 입력
 	$('#resetPasswordForm input[name=passwd]').on('focusout keyup keydown', function () {
@@ -226,7 +229,11 @@
 		mcxDialog.alertC('비밀번호 변경이 완료 되었습니다.', {
 			sureBtnText: "확인",
 			sureBtnClick: function() {
-				cfnGoToPage(_PAGE_LOGIN);
+				if (pageGb === 'find') {
+					cfnGoToPage(_PAGE_LOGIN);
+				} else if (pageGb === 'temp') {
+					cfnGoToPage(_PAGE_MAIN);
+				}
 			}
 		});
 		} else {

+ 145 - 29
src/main/webapp/WEB-INF/views/web/goods/GoodsCouponFormWeb.html

@@ -11,60 +11,176 @@
  *============================================================================
  * VER  DATE         AUTHOR      DESCRIPTION
  * ===  ===========  ==========  =============================================
- * 1.0  2021.03.02   eskim        최초 작성
+ * 1.0  2021.03.11   eskim        최초 작성
  *******************************************************************************
  -->
-<div class="modal-dialog" role="document">
+<div class="modal-dialog" role="document" th:if="${goodsCouponList != null and !goodsCouponList.empty}">
 	<div class="modal-content">
 		<div class="modal-header">
 			<h5 class="modal-title" id="saleCouponLabel">할인쿠폰 받기</h5>
 		</div>
 		<div class="modal-body">
+		<form name="goodsCouponForm" id="goodsCouponForm" method="post">
+		<input type="hidden" name="goodsCd" th:value="${params.goodsCd}"/>
 			<div class="pop_cont">
 				<ul class="coupon_list">
-					<li>
-						<div class="coupon">
+					<li th:each="goodsCoupon, status : ${goodsCouponList}">
+						<div class="coupon" >
 							<div>
-								<p class="cp_name">
+								<p class="cp_name" th:text="${goodsCoupon.cpnNm}">
 									TBJ 시즌오프 20% 할인쿠폰
 								</p>
 								<p class="cp_cont">
-									<span><em>12,399,900</em>원</span>
-									<span><em>40%</em></span>
+									<span th:if="${goodsCoupon.dcWay == 'G240_10'}"><em th:text="${#numbers.formatInteger(goodsCoupon.dcVal, 0,'COMMA')}">12,399,900</em>원</span>
+									<span th:unless="${goodsCoupon.dcWay == 'G240_10'}"><em th:text="|${goodsCoupon.dcVal}%|">40%</em></span>
 								</p>
 								<p class="cp_condition">
-									500,000원 이상 구매 시 최대 50,000원 할인
-									<span>1인 최대 90장</span>
+									<th:block th:text="${#numbers.formatInteger(goodsCoupon.buyLimitAmt, 0,'COMMA')}"></th:block>원 이상 구매 시 최대 <th:block th:text="${#numbers.formatInteger(goodsCoupon.maxDcAmt, 0,'COMMA')}"></th:block>원 할인
+									<span>1인 최대 <th:block th:text="${(goodsCoupon.custPubLimitQty > 0) ? #numbers.formatInteger(goodsCoupon.custPubLimitQty, 0,'COMMA') +'장' : '무제한'}"></span>
 								</p>
 							</div>
-							<button type="button" class="btn btn_dark btn_block btn_coupon_down"><span>쿠폰받기</span></button>
+							<th:block th:if="${goodsCoupon.custPubLimitQty > 0 and goodsCoupon.custPubLimitQty <= goodsCoupon.custCouponCnt}">
+							<button type="button" class="btn btn_dark btn_block btn_coupon_down"   disabled="disabled"><span>받기완료</span></button>
+							</th:block>
+							<th:block th:unless="${goodsCoupon.custPubLimitQty > 0 and goodsCoupon.custPubLimitQty <= goodsCoupon.custCouponCnt}">
+							<button type="button" class="btn btn_dark btn_block btn_coupon_down" th:attr="cpnId=${goodsCoupon.cpnId}" th:id="${'coupon_'+goodsCoupon.cpnId}" onclick="jfGoodsCouponDown(this);"><span>쿠폰받기</span></button>
+							</th:block>
 						</div>
 					</li>
-					<li>
-						<div class="coupon">
-							<div>
-								<p class="cp_name">
-									신규가입 40% 할인쿠폰
-								</p>
-								<p class="cp_cont">
-									<span><em>12,399,900</em>원</span>
-									<span><em>40%</em></span>
-								</p>
-								<p class="cp_condition">
-									500,000원 이상 구매 시 최대 50,000원 할인
-									<span>1인 최대 90장</span>
-								</p>
-							</div>
-							<button type="button" class="btn btn_dark btn_block btn_coupon_done" disabled=""><span>받기완료</span></button>
-						</div>
-					</li>						
 				</ul>
 			</div>
+		</form>	
 		</div>
 		<div class="modal-footer">
-			<button type="button" id="" class="btn btn_primary btn_all_cpdown"><span>쿠폰 모두 받기</span></button>
+			<button type="button" class="btn btn_primary btn_all_cpdown" onclick="jfGoodsCouponDownAll();"><span>쿠폰 모두 받기</span></button>
 		</div>
 	</div>
 </div>
 <a href="javascript:void(0);" rel="modal:close" onclick="cfCloseLayer('layer_goods_coupon')" class="close-modal">Close</a>
+<script th:inline="javascript">
+/*<![CDATA[*/
+
+	// 쿠폰 다운로드
+	var jfGoodsCouponDown = function(obj){
+	
+		if (!cfCheckLogin()) {
+			cfnGoToPage(_PAGE_LOGIN);
+			return false;
+		}
+		
+		var $obj = $(obj);
+		var cpnId = $obj.attr('cpnId');
+		var goodsCd = $('#goodsCouponForm input[name=goodsCd]').val();
+		
+		 gagajf.ajaxJsonSubmit(_PAGE_GOODS_CPN_DOWNLOAD, JSON.stringify({goodsCd: goodsCd, cpnId: cpnId}), jfGoodsCouponCallBack);
+		 
+	//쿠폰이 발급되었습니다
+	//죄송합니다. 쿠폰이 모두 소진되었습니다
+	//죄송합니다. 해당 쿠폰은 다운로드가 불가합니다.
+	}
+	
+	// 쿠폰다운로드 콜백
+	var jfGoodsCouponCallBack = function(result){
+		if (result.status == "200"){
+			var cpnId = result.params.cpnId;
+			if (result.goodsCouponList == null) return;
+			var list = result.goodsCouponList;
+
+			list.forEach(function(coupon){
+				if (coupon.cpnId == cpnId){
+					if (Number(coupon.custPubLimitQty) > 0){
+						if (Number(coupon.custPubLimitQty) <= Number(coupon.custCouponCnt)){
+							$('#coupon_'+ coupon.cpnId).html('<span>받기완료</span>');
+							$('#coupon_'+ coupon.cpnId).attr('disabled', true);
+						}
+					}
+					if (Number(coupon.TotPubLimitQty) > 0){
+						if (Number(coupon.TotPubLimitQty) <= Number(coupon.CustCouponCnt)){
+							$('#coupon_'+ coupon.cpnId).html('<span>받기완료</span>');
+							$('#coupon_'+ coupon.cpnId).attr('disabled', true);
+						}
+					}
+				}
+			});
+		}
+		jfCouponCheck();
+	}
+	
+	
+	// 쿠폰 전체 다운로드
+	var jfGoodsCouponDownAll = function(){
+		//00개 쿠폰이 발급되었습니다.
+		var couponDownAbleYn = "N";
+		var arrCpnId = [];
+		$('.btn_coupon_down').each(function(){
+			if (!$(this).attr('disabled')){
+				couponDownAbleYn = "Y";
+				arrCpnId.push($(this).attr('cpnId'));
+			}
+		});	
+		
+		if ("N" == couponDownAbleYn){
+			mcxDialog.alert("다운 받을 쿠폰이 없습니다.");
+			return false;
+		}
+		var goodsCd = $('#goodsCouponForm input[name=goodsCd]').val();
+		gagajf.ajaxJsonSubmit(_PAGE_GOODS_CPN_DOWNLOAD, JSON.stringify({goodsCd: goodsCd, arrCpnId: arrCpnId}), jfGoodsCouponDownAllBack);
+		
+	}
+	
+	// 쿠폰 전체 다운로드 콜백
+	var jfGoodsCouponDownAllBack = function(result){
+		if (result.status == "200"){
+			if (result.goodsCouponList == null) return;
+			var list = result.goodsCouponList;
+
+			list.forEach(function(coupon){
+				$('.btn_coupon_down').each(function(){
+					if (!$(this).attr('disabled')){
+						var cpnId = $(this).attr('cpnId');
+						if (coupon.cpnId == cpnId){
+							if (Number(coupon.custPubLimitQty) > 0){
+								if (Number(coupon.custPubLimitQty) <= Number(coupon.custCouponCnt)){
+									$('#coupon_'+ coupon.cpnId).html('<span>받기완료</span>');
+									$('#coupon_'+ coupon.cpnId).attr('disabled', true);
+								}
+							}
+							if (Number(coupon.TotPubLimitQty) > 0){
+								if (Number(coupon.TotPubLimitQty) <= Number(coupon.CustCouponCnt)){
+									$('#coupon_'+ coupon.cpnId).html('<span>받기완료</span>');
+									$('#coupon_'+ coupon.cpnId).attr('disabled', true);
+								}
+							}
+						}
+					}
+				});	
+			});
+		}
+		jfCouponCheck();
+	}
+	
+	
+	var jfCouponCheck = function(){
+		var couponDownAbleYn = "N";
+		$('.btn_coupon_down').each(function(){
+			if (!$(this).attr('disabled')){
+				couponDownAbleYn = "Y";
+			}
+		});	
+		
+		if(couponDownAbleYn == "N"){
+			$('.btn_all_cpdown').addClass('btn_coupon_done');
+			$('.btn_all_cpdown').attr('disabled', true);
+			$('.btn_all_cpdown').find('span').text('쿠폰 모두 받기 완료');
+		}
+	}	
+	
+	$(document).ready(function() {
+		
+		jfCouponCheck();
+	});
+	
+	
+/*]]>*/
+</script>
 </html>

+ 80 - 42
src/main/webapp/WEB-INF/views/web/goods/GoodsDetailFormWeb.html

@@ -80,14 +80,14 @@
 					<input type="hidden" name="selfGoodsYn" th:value="${goodsInfo.selfGoodsYn}"/>
 					<div class="area_desc">
 						<div class="desc_wrap">
-							<div class="timer_box">
+							<div class="timer_box" style="display:none;">
 								<p>
 									<span class="tit">남은시간</span>
 									<span class="timer">
-										<em id="d-days">27</em>
-										<em id="d-hours">21</em>
-										<em id="d-minutes">21</em>
-										<em id="d-seconds">07</em>
+										<em id="d-days">0</em>
+										<em id="d-hours">0</em>
+										<em id="d-minutes">0</em>
+										<em id="d-seconds">0</em>
 									</span>
 								</p>
 							</div>
@@ -122,20 +122,28 @@
 										<span class="save_point">
 											스타일포인트 <th:block th:text="${#numbers.formatInteger(goodsInfo.pntAmt, 0,'COMMA')}"></th:block>P 적립예정
 										</span>
-										<button type="button" id="btn_saleCoupon_pop" class="btn btn_primary btn_sm btn_coupon" th:onclick="cfGoodsCouponInfo([[${goodsInfo.goodsCd}]])"><span>쿠폰받기</span></button>
+										<button type="button" id="btn_saleCoupon_pop" class="btn btn_primary btn_sm btn_coupon"  th:if="${goodsCouponList != null and !goodsCouponList.empty}" th:onclick="cfGoodsCouponInfo([[${goodsInfo.goodsCd}]])"><span>쿠폰받기</span></button>
 									</div>
 								</div>
-								<div class="desc_status">
-									<p>예약판매 상품 -2020.12.30 출고예정</p>
+								<div class="desc_status" th:if="${not #strings.isEmpty(goodsInfo.delvResDt) }">
+									<p>예약판매 상품 - <th:block th:text="${goodsInfo.delvResDt}"></th:block> 출고예정</p>
 								</div>
 							</div>
-							<div class="benefit_box" th:if="${cardInfoList != null and !cardInfoList.empty}" >
+							<div class="benefit_box" th:if="${(cardInfoList != null and !cardInfoList.empty) or
+																(goodsCouponList != null and !goodsCouponList.empty)
+															}" >
 								<dl>
-									<div class="bnf_shopping">
+									<div class="bnf_shopping" th:if="${goodsCouponList != null and !goodsCouponList.empty}">
 										<dt>쇼핑혜택</dt>
-											<!------------ 색상 강조 텍스트 영역 <em class="c_primary"></em> 사용요청 ------------>
 											<dd>
-												<span>최대 <em class="c_primary">15%</em> 쿠폰 할인</span> 
+												<span th:if="${goodsCouponList != null and !goodsCouponList.empty}">
+												<th:block th:each="goodsCoupon, status : ${goodsCouponList}" th:if="${status.first}">
+												최대 <em class="c_primary" >
+													<th:block th:if="${goodsCoupon.dcWay == 'G240_10'}" th:text="|${#numbers.formatInteger(goodsCoupon.dcVal, 0,'COMMA')}원|"></th:block>
+													<th:block th:unless="${goodsCoupon.dcWay == 'G240_10'}" th:text="|${goodsCoupon.dcVal}%|"></th:block>
+												</em> 쿠폰 할인
+												</th:block>
+												</span> 
 												<span><em class="c_primary">99개</em> 이상 구매 시 <em class="c_primary">9,999,999원</em> 할인</span>
 												<span>미니언즈 우산 증정</span>
 												<button type="button" id="btn_bnfShopping_pop" class="btn_popup" th:onclick="cfGoodsShopBenefitInfo([[${goodsInfo.goodsCd}]])"><span>자세히</span></button>
@@ -176,13 +184,13 @@
 											<em id="selectOptCd1"></em>
 											<em id="selectOptCd1addPrice"></em>
 										</span>
-										<button type="button" id="btn_infoSize_pop" class="btn_popup" th:onclick="cfGoodsSizeInfo([[${goodsInfo.goodsCd}]])"><span>사이즈정보</span></button>
+										<button type="button" id="btn_infoSize_pop" class="btn_popup" th:onclick="cfGoodsSizeInfo([[${goodsInfo.goodsCd}]],[[${goodsInfo.colorCd}]] )"><span>사이즈정보</span></button>
 									</div>
 									<div class="form_field">
 										<div  th:each="goodsOption2, status : ${goodsOption2List}">
-											<input type="radio" name="opt"  th:id="${'size'+goodsOption2.optCd}" th:disabled="${goodsOption2.soldoutYn == 'Y' or goodsOption2.stockQty <= 0}" 
+											<input type="radio" name="opt"  th:id="${goodsOption2.optCd}" th:disabled="${goodsOption2.soldoutYn == 'Y' or goodsOption2.stockQty <= 0}" 
 													th:attr="addPrice=${goodsOption2.addPrice}, optCd1=${goodsOption2.optCd1}, optCd=${goodsOption2.optCd}">
-											<label th:for="${goodsInfo.goodsCd + '-'+ goodsInfo.colorCd + '-' +goodsOption2.optCd2}"><span th:text="${goodsOption2.optCd2}" th:onclick="jfViewStock(this, [[${goodsInfo.goodsCd}]],[[${goodsOption2.optCd1}]],[[${goodsOption2.optCd2}]],[[${goodsInfo.minOrdQty}]], [[${goodsInfo.maxOrdQty}]] )">100</span></label>
+											<label th:for="${goodsOption2.optCd}"><span th:text="${goodsOption2.optCd2}" th:onclick="jfViewStock(this, [[${goodsInfo.goodsCd}]],[[${goodsOption2.optCd1}]],[[${goodsOption2.optCd2}]],[[${goodsInfo.minOrdQty}]], [[${goodsInfo.maxOrdQty}]] )">100</span></label>
 										</div>
 									</div>
 								</div>
@@ -718,8 +726,6 @@
 	
 	//사이즈 클릭시
 	var jfViewStock = function(obj, goodsCd, optCd1, optCd2,  minOrdQty, maxOrdQty) {
-		debugger;
-		alert(optCd);
 		var $obj = $(obj);
 
 		var $target = $obj.parent().parent().children('input[name="opt"]');
@@ -872,6 +878,25 @@
 	
 	//장바구니담기
 	var jfAddCart = function(btnType){
+		
+		// 바로구매는 로그인여부 확인
+		if (btnType == "O" && !cfCheckLogin()) {
+			
+			var btn = ["비회원 구매", "로그인후 구매"]; //버튼명[좌,우]
+			mcxDialog.confirmC("로그인 후 구매 시 다양한 혜택을 받으실 수 있습니다.", { //내용
+				btn: btn,
+				btnClick: function(index){
+					if (index == 1){ //button1 일때 처리문
+						// 비회원 URL
+						ALERT('비회원');
+					} else {	//button2 일때 처리문
+						cfnGoToPage(_PAGE_LOGIN);
+					}
+				}
+			});
+			return false;
+		}
+		
 		var params = [];
 		var goodsType = $("#cartForm  input[name=goodsType]").val();
 
@@ -891,7 +916,7 @@
 			obj.afLinkCd =$("#cartForm  input[name=afLinkCd]").val();
 			obj.ithrCd =$("#cartForm  input[name=ithrCd]").val();
 			obj.contentsLoc =$("#cartForm  input[name=contentsLoc]").val();
-			obj.planDtlSq = $("#cartForm  input[name=planDtlSq]").val();;
+			obj.planDtlSq = $("#cartForm  input[name=planDtlSq]").val();
 			params.push(obj);
 
 		}else if (goodsType == 'G056_S'){  //수정요
@@ -921,6 +946,10 @@
 
 			}); */
 		}
+		
+		
+
+		
 		// 장바구니담기
 		cfnAddCart(params);
 	}
@@ -980,6 +1009,8 @@
 	
 	$(document).ready( function() {
 		
+		$('.timer_box').css('display', 'none');
+		
 		var params = new Object();
 		params.goodsCd = [[${params.goodsCd}]];
 		params.viewDt = [[${params.viewDt}]];
@@ -1101,31 +1132,38 @@
 			return false;
 		});
 		
-		/* 행사 남은시간 */
-		function promotionTimer() {
-			var endTime = new Date('30 March 2021 9:56:00 GMT+0900'); // 남은시간 지정		
-				endTime = (Date.parse(endTime) / 1000);
-
-				var now = new Date();
-				now = (Date.parse(now) / 1000);
-
-				var timeLeft = endTime - now;
-
-				var days = Math.floor(timeLeft / 86400); 
-				var hours = Math.floor((timeLeft - (days * 86400)) / 3600);
-				var minutes = Math.floor((timeLeft - (days * 86400) - (hours * 3600 )) / 60);
-				var seconds = Math.floor((timeLeft - (days * 86400) - (hours * 3600) - (minutes * 60)));
-
-				if (hours < '10') { hours = '0' + hours; }
-				if (minutes < '10') { minutes = '0' + minutes; }
-				if (seconds < '10') { seconds = '0' + seconds; }
-
-				$('#d-days').html(days);
-				$('#d-hours').html(hours);
-				$('#d-minutes').html(minutes);
-				$('#d-seconds').html(seconds);		
+		if (!gagajf.isNull([[${goodsInfo.socialSq}]])){
+			$('.timer_box').css('display', 'block');
+			/* 행사 남은시간 */
+			function promotionTimer() {
+				var endTime = new Date([[${goodsInfo.socialEddt}]]); // 남은시간 지정	30 March 2021 9:56:00 GMT+0900	
+					endTime = (Date.parse(endTime) / 1000);
+	
+					var now = new Date();
+					now = (Date.parse(now) / 1000);
+	
+					var timeLeft = endTime - now;
+	
+					var days = Math.floor(timeLeft / 86400); 
+					var hours = Math.floor((timeLeft - (days * 86400)) / 3600);
+					var minutes = Math.floor((timeLeft - (days * 86400) - (hours * 3600 )) / 60);
+					var seconds = Math.floor((timeLeft - (days * 86400) - (hours * 3600) - (minutes * 60)));
+	
+					if (hours < '10') { hours = '0' + hours; }
+					if (minutes < '10') { minutes = '0' + minutes; }
+					if (seconds < '10') { seconds = '0' + seconds; }
+	
+					if (Number(days) > 0 ){
+						$('#d-days').html(days);	
+					}else{
+						$('#d-days').css('display','none');
+					}
+					$('#d-hours').html(hours);
+					$('#d-minutes').html(minutes);
+					$('#d-seconds').html(seconds);		
+			}
+			setInterval(function() { promotionTimer(); }, 1000);
 		}
-		setInterval(function() { promotionTimer(); }, 1000);
 
 		/* 상품옵션변경 팝업 > 수량조절 */
 //		

+ 40 - 3
src/main/webapp/WEB-INF/views/web/goods/GoodsInstockAlarmFormWeb.html

@@ -21,6 +21,10 @@
 		</div>
 		<div class="modal-body">
 			<form name="goodsInstockAlarmForm" id="goodsInstockAlarmForm" method="post">
+			<input type="hidden" name="goodsCd" th:value="${goodsInfo.goodsCd}"/>
+			<input type="hidden" name="optCd1" th:value="${goodsInfo.colorCd}"/>
+			<input type="hidden" name="optCd" />
+			<input type="hidden" name="optCd2" />
 			<div class="pop_cont">
 				<div class="item_blk">
 					<div class="item_prod" th:with="imgGoodsUrl=${@environment.getProperty('upload.goods.view')}, uxImgUrl=${@environment.getProperty('domain.uximage')}">
@@ -46,8 +50,8 @@
 						<div class="form_field">
 							<div th:each="goodsOption2, status : ${goodsOption2List}">
 								<th:block th:if="${goodsOption2.soldoutYn == 'Y' or goodsOption2.stockQty <= 0}" >
-								<input type="radio" name="opt" th:id="${'size'+goodsOption2.optCd}" th:value="${goodsOption2.optCd}">
-								<label th:for="${'size'+goodsOption2.optCd}"><span th:text="${goodsOption2.optCd2}" >90</span></label>
+								<input type="radio" name="opt" th:id="${'alarmSize'+goodsOption2.optCd}" th:value="${goodsOption2.optCd2}" th:attr="optCd=${goodsOption2.optCd}" >
+								<label th:for="${'alarmSize'+goodsOption2.optCd}"><span th:text="${goodsOption2.optCd2}" >90</span></label>
 								</th:block>
 							</div>
 						</div>
@@ -115,9 +119,42 @@
 			</form>
 		</div>
 		<div class="modal-footer">
-			<button type="button"  class="btn btn_dark" onclick=""><span>신청</span></button>
+			<button type="button"  class="btn btn_dark" onclick="jfInstockAlarm();"><span>신청</span></button>
 		</div>
 	</div>
 </div>
 <a href="javascript:void(0);" rel="modal:close" onclick="cfCloseLayer('layer_instock_alarm')" class="close-modal">Close</a>
+<script th:inline="javascript">
+/*<![CDATA[*/
+	
+	
+	var jfInstockAlarm = function(){
+	
+		var optCd2 = "";
+		var optCd = "";
+		$("#goodsInstockAlarmForm input:radio[name=opt]").each(function(){
+			if ($(this).is(':checked')){
+				optCd2 = $(this).val();
+				optCd = $(this).attr('optCd');
+			}
+		});
+
+		if (gagajf.isNull(optCd2)){
+			mcxDialog.alert("사이즈를 선택해주세요.");
+			return false;
+		}
+		$("#goodsInstockAlarmForm input[name=optCd]").val(optCd);
+		$("#goodsInstockAlarmForm input[name=optCd2]").val(optCd2);
+		
+		
+		gagajf.ajaxFormSubmit('/goods/instock/alarm/save'
+				, $('#goodsInstockAlarmForm')
+				, function() {
+					cfCloseLayer('layer_instock_alarm');
+				}
+		);
+	}
+/*]]>*/
+</script>
+
 </html>

+ 8 - 5
src/main/webapp/WEB-INF/views/web/goods/GoodsShopBenefitFormWeb.html

@@ -21,7 +21,7 @@
 		</div>
 		<div class="modal-body">
 			<div class="pop_cont">
-				<div class="benefit_blk">
+				<div class="benefit_blk" th:if="${(goodsCouponList != null and !goodsCouponList.empty) or (goodsInfo.prePntUsableYn == 'Y')}">
 					<h6>할인혜택</h6>
 					<div class="tbl type1">
 						<table>
@@ -30,13 +30,16 @@
 								<col width="*">
 							</colgroup>
 							<tbody>
-								<tr>
+								<tr th:if="${(goodsInfo.prePntUsableYn == 'Y')}">
 									<th>즉시 할인</th>
-									<td>50% 할인</td>
+									<td th:text="|${#numbers.formatInteger(goodsInfo.pntAmt, 0,'COMMA')}원 할인|">50% 할인</td>
 								</tr>
-								<tr>
+								<tr th:if="${(goodsCouponList != null and !goodsCouponList.empty)}">
 									<th>쿠폰할인</th>
-									<td>최대 10% 할인</td>
+									<td th:each="goodsCoupon, status : ${goodsCouponList}" th:if="${status.first}">최대
+									<th:block th:if="${goodsCoupon.dcWay == 'G240_10'}" th:text="|${#numbers.formatInteger(goodsCoupon.dcVal, 0,'COMMA')}원|"></th:block>
+									<th:block th:unless="${goodsCoupon.dcWay == 'G240_10'}" th:text="|${goodsCoupon.dcVal}%|"></th:block>
+									 할인</td>
 								</tr>
 							</tbody>
 						</table>

+ 55 - 874
src/main/webapp/WEB-INF/views/web/goods/GoodsSizeInfoFormWeb.html

@@ -23,17 +23,17 @@
 			<div class="pop_cont">
 				<div class="tab_nav">
 					<ul>
-						<li class="active"><a href="javascript:void(0)">실측 사이즈</a></li>
-						<li><a href="javascript:void(0)">표준 사이즈</a></li>
-						<li><a href="javascript:void(0)">측정 사이즈</a></li>
+						<li th:if="${measurementList != null and !measurementList.empty}" th:class="${(measurementList != null and !measurementList.empty) ? 'active': ''}"><a href="javascript:void(0);" >실측 사이즈</a></li>
+						<li th:if="${(commonSizeInfoList != null and !commonSizeInfoList.empty) or (brandSizeInfoList != null and !brandSizeInfoList.empty)}" th:class="${(measurementList == null or measurementList.empty) ? 'active': ''}"><a href="javascript:void(0);" >표준 사이즈</a></li>
+						<li th:if="${measurementSizeInfoList != null and !measurementSizeInfoList.empty}"><a href="javascript:void(0);" >측정 사이즈</a></li>
 					</ul>
 				</div>
 				<div class="tab_cont_wrap">
-					<div class="tab_cont">
+					<div class="tab_cont" th:if="${measurementList != null and !measurementList.empty}">
 						<!-- 실측 사이즈 -->
 						<div class="size_head">
-							<span class="tit_sub">TBJ</span>
-							<span class="tit_header">남성 테이퍼드 핏 겨울 기모면 스판 올 밴딩 팬츠</span>
+							<span class="tit_sub" th:text="${goodsInfo.brandGroupNm}">TBJ</span>
+							<span class="tit_header" th:text="${goodsInfo.goodsNm}">남성 테이퍼드 핏 겨울 기모면 스판 올 밴딩 팬츠</span>
 						</div>
 						<div class="size_cont">
 							<div class="size_tbl_box">
@@ -41,49 +41,41 @@
 								<div class="tbl type2">
 									<table>
 										<colgroup>
-											<col width="20%">
-											<col width="20%">
-											<col width="20%">
-											<col width="20%">
-											<col width="20%">
+											<col/>
+											<col th:attr="width=${typeWith+'%'}">
+											<col th:attr="width=${typeWith+'%'}">
+											<col th:attr="width=${typeWith+'%'}">
+											<col th:attr="width=${typeWith+'%'}">
+											<th:block th:if="${typeCd == '하의'}">
+											<col th:attr="width=${typeWith+'%'}">
+											</th:block>
 										</colgroup>
 										<thead>
 											<tr>
 												<th scope="col">&nbsp;</th>
-												<th scope="col">M</th>
-												<th scope="col">L</th>
-												<th scope="col">XL</th>
-												<th scope="col">XXL</th>
-											</tr>
-										</thead>
-										<tbody>
-											<tr>
+												<th:block th:if="${typeCd == '상의'}">
 												<th scope="col">가슴둘레</th>
-												<td>95</td>
-												<td>100</td>
-												<td>105</td>
-												<td>110</td>
-											</tr>
-											<tr>
 												<th scope="col">어깨너비</th>
-												<td>95</td>
-												<td>100</td>
-												<td>105</td>
-												<td>110</td>
-											</tr>
-											<tr>
 												<th scope="col">팔길이</th>
-												<td>95</td>
-												<td>100</td>
-												<td>105</td>
-												<td>110</td>
-											</tr>
-											<tr>
 												<th scope="col">총길이</th>
-												<td>95</td>
-												<td>100</td>
-												<td>105</td>
-												<td>110</td>
+												</th:block>
+												<th:block th:unless="${typeCd == '상의'}">
+												<th scope="col">허리둘레</th>
+												<th scope="col">밑위</th>
+												<th scope="col">엉덩이둘레</th>
+												<th scope="col">허벅지둘레</th>
+												<th scope="col">총길이</th>
+												</th:block>
+											</tr>
+										</thead>
+										<tbody>
+											<tr th:each="measurement, status : ${measurementList}">
+												<th scope="col" th:text="${measurement.optCd2}"></th>
+												<td th:text="${measurement.value1}">95</td>
+												<td th:text="${measurement.value2}">100</td>
+												<td th:text="${measurement.value3}">105</td>
+												<td th:text="${measurement.value4}">110</td>
+												<td th:text="${measurement.value5}" th:if="${typeCd == '하의'}">110</td>
 											</tr>
 										</tbody>
 									</table>
@@ -92,711 +84,40 @@
 						</div>
 						<!-- //실측 사이즈 -->
 					</div>
-					<div class="tab_cont">
+					<div class="tab_cont" th:if="${(commonSizeInfoList != null and !commonSizeInfoList.empty) or (brandSizeInfoList != null and !brandSizeInfoList.empty)}">
 						<!-- 표준 사이즈 카테고리 구분일때 -->
+						<th:block th:if="${(commonSizeInfoList != null and !commonSizeInfoList.empty) and (brandSizeInfoList == null or brandSizeInfoList.empty)}">
 						<div class="size_head">
 							<!-- 표준 사이즈 > 카테고리 선택 -->
 							<div class="sub_tab_nav">
 								<ul>
-									<li class="active"><a href="javascript:void(0)">여성</a></li>
-									<li><a href="javascript:void(0)">남성</a></li>
-									<li><a href="javascript:void(0)">캐주얼</a></li>
-									<li><a href="javascript:void(0)">유아동</a></li>
-									<li><a href="javascript:void(0)">신발</a></li>
-									<li><a href="javascript:void(0)">언더웨어</a></li>
+									<li th:each="commonSizeInfo, status : ${commonSizeInfoList}"  th:class="${status.first}? 'active' : ''" ><a href="javascript:void(0)" th:text="${commonSizeInfo.sizeCate2Nm}">여성</a></li>
 								</ul>
 							</div>
 							<!-- //표준 사이즈 > 카테고리 선택 -->
 						</div>
 						<div class="size_cont">
 							<div class="sub_tab_cont_wrap">
-								<!-- 표준 사이즈 > 카테고리 내용(여성) -->
-								<div class="sub_tab_cont">
-									<div class="size_tbl_box">
-										<h6>여성 상의</h6>
-										<p class="size_unit">단위 : cm</p>
-										<div class="tbl type2">
-											<table>
-												<colgroup>
-													<col width="20%">
-													<col width="20%">
-													<col width="20%">
-													<col width="20%">
-													<col width="20%">
-												</colgroup>
-												<thead>
-													<tr>
-														<th scope="col">&nbsp;</th>
-														<th scope="col">XS/44/85</th>
-														<th scope="col">S/55/90</th>
-														<th scope="col">M/66/95</th>
-														<th scope="col">L/77/100</th>
-													</tr>
-												</thead>
-												<tbody>
-													<tr>
-														<th scope="col">가슴둘레</th>
-														<td>95</td>
-														<td>100</td>
-														<td>105</td>
-														<td>110</td>
-													</tr>
-													<tr>
-														<th scope="col">허리둘레</th>
-														<td>95</td>
-														<td>100</td>
-														<td>105</td>
-														<td>110</td>
-													</tr> 
-													<tr>
-														<th scope="col">신장</th>
-														<td>95</td>
-														<td>100</td>
-														<td>105</td>
-														<td>110</td>
-													</tr>											   
-												</tbody>
-											</table>
-										</div>
-									</div>
-									<div class="size_tbl_box">
-										<h6>여성 하의</h6>
-										<p class="size_unit">단위 : cm</p>
-										<div class="tbl type2">
-											<table>
-												<colgroup>
-													<col width="20%">
-													<col width="10%">
-													<col width="10%">
-													<col width="10%">
-													<col width="10%">
-													<col width="10%">
-													<col width="10%">
-													<col width="10%">
-													<col width="10%">
-												</colgroup>
-												<thead>
-													<tr>
-														<th scope="col">&nbsp;</th>
-														<th scope="col">27</th>
-														<th scope="col">28</th>
-														<th scope="col">29</th>
-														<th scope="col">30</th>
-														<th scope="col">32</th>
-														<th scope="col">34</th>
-														<th scope="col">36</th>
-														<th scope="col">38</th>
-													</tr>
-												</thead>
-												<tbody>
-													<tr>
-														<th scope="col">허리둘레</th>
-														<td>69</td>
-														<td>71</td>
-														<td>74</td>
-														<td>76</td>
-														<td>81</td>
-														<td>86</td>
-														<td>91</td>
-														<td>97</td>
-													</tr>									
-												</tbody>
-											</table>
-										</div>
-									</div>
-								</div>	
-								<!-- //표준 사이즈 > 카테고리 내용(여성) --> 
-								<!-- 표준 사이즈 > 카테고리 내용(남성) -->
-								<div class="sub_tab_cont">
-									<div class="size_tbl_box">
-										<h6>남성 상의</h6>
-										<p class="size_unit">단위 : cm</p>
-										<div class="tbl type2">
-											<table>
-												<colgroup>
-													<col width="20%">
-													<col width="20%">
-													<col width="20%">
-													<col width="20%">
-													<col width="20%">
-												</colgroup>
-												<thead>
-													<tr>
-														<th scope="col">&nbsp;</th>
-														<th scope="col">XS/44/85</th>
-														<th scope="col">S/55/90</th>
-														<th scope="col">M/66/95</th>
-														<th scope="col">L/77/100</th>
-													</tr>
-												</thead>
-												<tbody>
-													<tr>
-														<th scope="col">가슴둘레</th>
-														<td>95</td>
-														<td>100</td>
-														<td>105</td>
-														<td>110</td>
-													</tr>
-													<tr>
-														<th scope="col">허리둘레</th>
-														<td>95</td>
-														<td>100</td>
-														<td>105</td>
-														<td>110</td>
-													</tr> 
-													<tr>
-														<th scope="col">신장</th>
-														<td>95</td>
-														<td>100</td>
-														<td>105</td>
-														<td>110</td>
-													</tr>											   
-												</tbody>
-											</table>
-										</div>
-									</div>
-									<div class="size_tbl_box">
-										<h6>남성 하의</h6>
-										<p class="size_unit">단위 : cm</p>
-										<div class="tbl type2">
-											<table>
-												<colgroup>
-													<col width="20%">
-													<col width="10%">
-													<col width="10%">
-													<col width="10%">
-													<col width="10%">
-													<col width="10%">
-													<col width="10%">
-													<col width="10%">
-													<col width="10%">
-												</colgroup>
-												<thead>
-													<tr>
-														<th scope="col">&nbsp;</th>
-														<th scope="col">27</th>
-														<th scope="col">28</th>
-														<th scope="col">29</th>
-														<th scope="col">30</th>
-														<th scope="col">32</th>
-														<th scope="col">34</th>
-														<th scope="col">36</th>
-														<th scope="col">38</th>
-													</tr>
-												</thead>
-												<tbody>
-													<tr>
-														<th scope="col">허리둘레</th>
-														<td>69</td>
-														<td>71</td>
-														<td>74</td>
-														<td>76</td>
-														<td>81</td>
-														<td>86</td>
-														<td>91</td>
-														<td>97</td>
-													</tr>									
-												</tbody>
-											</table>
-										</div>
-									</div>
-								</div>	
-								<!-- //표준 사이즈 > 카테고리 내용(남성) -->
-								<!-- 표준 사이즈 > 카테고리 내용(캐주얼) -->
-								<div class="sub_tab_cont">
-									<div class="size_tbl_box">
-										<h6>캐주얼 상의</h6>
-										<p class="size_unit">단위 : cm</p>
-										<div class="tbl type2">
-											<table>
-												<colgroup>
-													<col width="20%">
-													<col width="20%">
-													<col width="20%">
-													<col width="20%">
-													<col width="20%">
-												</colgroup>
-												<thead>
-													<tr>
-														<th scope="col">&nbsp;</th>
-														<th scope="col">XS/44/85</th>
-														<th scope="col">S/55/90</th>
-														<th scope="col">M/66/95</th>
-														<th scope="col">L/77/100</th>
-													</tr>
-												</thead>
-												<tbody>
-													<tr>
-														<th scope="col">가슴둘레</th>
-														<td>95</td>
-														<td>100</td>
-														<td>105</td>
-														<td>110</td>
-													</tr>
-													<tr>
-														<th scope="col">허리둘레</th>
-														<td>95</td>
-														<td>100</td>
-														<td>105</td>
-														<td>110</td>
-													</tr> 
-													<tr>
-														<th scope="col">신장</th>
-														<td>95</td>
-														<td>100</td>
-														<td>105</td>
-														<td>110</td>
-													</tr>											   
-												</tbody>
-											</table>
-										</div>
-									</div>
-									<div class="size_tbl_box">
-										<h6>캐주얼 하의</h6>
-										<p class="size_unit">단위 : cm</p>
-										<div class="tbl type2">
-											<table>
-												<colgroup>
-													<col width="20%">
-													<col width="10%">
-													<col width="10%">
-													<col width="10%">
-													<col width="10%">
-													<col width="10%">
-													<col width="10%">
-													<col width="10%">
-													<col width="10%">
-												</colgroup>
-												<thead>
-													<tr>
-														<th scope="col">&nbsp;</th>
-														<th scope="col">27</th>
-														<th scope="col">28</th>
-														<th scope="col">29</th>
-														<th scope="col">30</th>
-														<th scope="col">32</th>
-														<th scope="col">34</th>
-														<th scope="col">36</th>
-														<th scope="col">38</th>
-													</tr>
-												</thead>
-												<tbody>
-													<tr>
-														<th scope="col">허리둘레</th>
-														<td>69</td>
-														<td>71</td>
-														<td>74</td>
-														<td>76</td>
-														<td>81</td>
-														<td>86</td>
-														<td>91</td>
-														<td>97</td>
-													</tr>									
-												</tbody>
-											</table>
-										</div>
-									</div>
-								</div>	
-								<!-- //표준 사이즈 > 카테고리 내용(캐주얼) -->
-								<!-- 표준 사이즈 > 카테고리 내용(유아동) -->
-								<div class="sub_tab_cont">
-									<div class="size_tbl_box">
-										<h6>유아동 상의</h6>
-										<p class="size_unit">단위 : cm</p>
-										<div class="tbl type2">
-											<table>
-												<colgroup>
-													<col width="20%">
-													<col width="20%">
-													<col width="20%">
-													<col width="20%">
-													<col width="20%">
-												</colgroup>
-												<thead>
-													<tr>
-														<th scope="col">&nbsp;</th>
-														<th scope="col">XS/44/85</th>
-														<th scope="col">S/55/90</th>
-														<th scope="col">M/66/95</th>
-														<th scope="col">L/77/100</th>
-													</tr>
-												</thead>
-												<tbody>
-													<tr>
-														<th scope="col">가슴둘레</th>
-														<td>95</td>
-														<td>100</td>
-														<td>105</td>
-														<td>110</td>
-													</tr>
-													<tr>
-														<th scope="col">허리둘레</th>
-														<td>95</td>
-														<td>100</td>
-														<td>105</td>
-														<td>110</td>
-													</tr> 
-													<tr>
-														<th scope="col">신장</th>
-														<td>95</td>
-														<td>100</td>
-														<td>105</td>
-														<td>110</td>
-													</tr>											   
-												</tbody>
-											</table>
-										</div>
-									</div>
-									<div class="size_tbl_box">
-										<h6>유아동 하의</h6>
-										<p class="size_unit">단위 : cm</p>
-										<div class="tbl type2">
-											<table>
-												<colgroup>
-													<col width="20%">
-													<col width="10%">
-													<col width="10%">
-													<col width="10%">
-													<col width="10%">
-													<col width="10%">
-													<col width="10%">
-													<col width="10%">
-													<col width="10%">
-												</colgroup>
-												<thead>
-													<tr>
-														<th scope="col">&nbsp;</th>
-														<th scope="col">27</th>
-														<th scope="col">28</th>
-														<th scope="col">29</th>
-														<th scope="col">30</th>
-														<th scope="col">32</th>
-														<th scope="col">34</th>
-														<th scope="col">36</th>
-														<th scope="col">38</th>
-													</tr>
-												</thead>
-												<tbody>
-													<tr>
-														<th scope="col">허리둘레</th>
-														<td>69</td>
-														<td>71</td>
-														<td>74</td>
-														<td>76</td>
-														<td>81</td>
-														<td>86</td>
-														<td>91</td>
-														<td>97</td>
-													</tr>									
-												</tbody>
-											</table>
-										</div>
-									</div>
-								</div>	
-								<!-- //표준 사이즈 > 카테고리 내용(유아동) -->	 
-								<!-- 표준 사이즈 > 카테고리 내용(신발) -->
-								<div class="sub_tab_cont">
-									<div class="size_tbl_box">
-										<h6>신발 상의</h6>
-										<p class="size_unit">단위 : cm</p>
-										<div class="tbl type2">
-											<table>
-												<colgroup>
-													<col width="20%">
-													<col width="20%">
-													<col width="20%">
-													<col width="20%">
-													<col width="20%">
-												</colgroup>
-												<thead>
-													<tr>
-														<th scope="col">&nbsp;</th>
-														<th scope="col">XS/44/85</th>
-														<th scope="col">S/55/90</th>
-														<th scope="col">M/66/95</th>
-														<th scope="col">L/77/100</th>
-													</tr>
-												</thead>
-												<tbody>
-													<tr>
-														<th scope="col">가슴둘레</th>
-														<td>95</td>
-														<td>100</td>
-														<td>105</td>
-														<td>110</td>
-													</tr>
-													<tr>
-														<th scope="col">허리둘레</th>
-														<td>95</td>
-														<td>100</td>
-														<td>105</td>
-														<td>110</td>
-													</tr> 
-													<tr>
-														<th scope="col">신장</th>
-														<td>95</td>
-														<td>100</td>
-														<td>105</td>
-														<td>110</td>
-													</tr>											   
-												</tbody>
-											</table>
-										</div>
-									</div>
-									<div class="size_tbl_box">
-										<h6>신발 하의</h6>
-										<p class="size_unit">단위 : cm</p>
-										<div class="tbl type2">
-											<table>
-												<colgroup>
-													<col width="20%">
-													<col width="10%">
-													<col width="10%">
-													<col width="10%">
-													<col width="10%">
-													<col width="10%">
-													<col width="10%">
-													<col width="10%">
-													<col width="10%">
-												</colgroup>
-												<thead>
-													<tr>
-														<th scope="col">&nbsp;</th>
-														<th scope="col">27</th>
-														<th scope="col">28</th>
-														<th scope="col">29</th>
-														<th scope="col">30</th>
-														<th scope="col">32</th>
-														<th scope="col">34</th>
-														<th scope="col">36</th>
-														<th scope="col">38</th>
-													</tr>
-												</thead>
-												<tbody>
-													<tr>
-														<th scope="col">허리둘레</th>
-														<td>69</td>
-														<td>71</td>
-														<td>74</td>
-														<td>76</td>
-														<td>81</td>
-														<td>86</td>
-														<td>91</td>
-														<td>97</td>
-													</tr>									
-												</tbody>
-											</table>
-										</div>
-									</div>
-								</div>	
-								<!-- //표준 사이즈 > 카테고리 내용(신발) -->	  
-								<!-- 표준 사이즈 > 카테고리 내용(언더웨어) -->
-								<div class="sub_tab_cont">
-									<div class="size_tbl_box">
-										<h6>언더웨어 상의</h6>
-										<p class="size_unit">단위 : cm</p>
-										<div class="tbl type2">
-											<table>
-												<colgroup>
-													<col width="20%">
-													<col width="20%">
-													<col width="20%">
-													<col width="20%">
-													<col width="20%">
-												</colgroup>
-												<thead>
-													<tr>
-														<th scope="col">&nbsp;</th>
-														<th scope="col">XS/44/85</th>
-														<th scope="col">S/55/90</th>
-														<th scope="col">M/66/95</th>
-														<th scope="col">L/77/100</th>
-													</tr>
-												</thead>
-												<tbody>
-													<tr>
-														<th scope="col">가슴둘레</th>
-														<td>95</td>
-														<td>100</td>
-														<td>105</td>
-														<td>110</td>
-													</tr>
-													<tr>
-														<th scope="col">허리둘레</th>
-														<td>95</td>
-														<td>100</td>
-														<td>105</td>
-														<td>110</td>
-													</tr> 
-													<tr>
-														<th scope="col">신장</th>
-														<td>95</td>
-														<td>100</td>
-														<td>105</td>
-														<td>110</td>
-													</tr>											   
-												</tbody>
-											</table>
-										</div>
-									</div>
-									<div class="size_tbl_box">
-										<h6>언더웨어 하의</h6>
-										<p class="size_unit">단위 : cm</p>
-										<div class="tbl type2">
-											<table>
-												<colgroup>
-													<col width="20%">
-													<col width="10%">
-													<col width="10%">
-													<col width="10%">
-													<col width="10%">
-													<col width="10%">
-													<col width="10%">
-													<col width="10%">
-													<col width="10%">
-												</colgroup>
-												<thead>
-													<tr>
-														<th scope="col">&nbsp;</th>
-														<th scope="col">27</th>
-														<th scope="col">28</th>
-														<th scope="col">29</th>
-														<th scope="col">30</th>
-														<th scope="col">32</th>
-														<th scope="col">34</th>
-														<th scope="col">36</th>
-														<th scope="col">38</th>
-													</tr>
-												</thead>
-												<tbody>
-													<tr>
-														<th scope="col">허리둘레</th>
-														<td>69</td>
-														<td>71</td>
-														<td>74</td>
-														<td>76</td>
-														<td>81</td>
-														<td>86</td>
-														<td>91</td>
-														<td>97</td>
-													</tr>									
-												</tbody>
-											</table>
-										</div>
-									</div>
-								</div>	
-								<!-- //표준 사이즈 > 카테고리 내용(언더웨어) -->
-							</div>															   
-						</div>
-						<div class="size_footer">
-							<div class="info_txt">
-								<ul>
-									<li>본 사이즈 조견표는 표준 가이드로, 각 제품마다 다소간의 차이는 있을 수 있습니다.</li>
-									<li>보다 자세한 사이즈는 각 상품 별 상품설명을 참조해주시기 바랍니다.</li>
-								</ul>
+								<th:block th:each="commonSizeInfo, status : ${commonSizeInfoList}" th:utext="${#strings.unescapeJava(#strings.escapeJava(commonSizeInfo.sizeInfo))}"></th:block>
 							</div>
 						</div>
-						<!-- //표준 사이즈 카테고리별 구분일때 -->
+						</th:block>
+						<th:block th:if="${brandSizeInfoList != null and !brandSizeInfoList.empty}">
 						<!-- 표준 사이즈 브랜드별 구분일때 -->
 						<div class="size_head">
-							<span class="tit_header">
-								페르지노몬티 FERGINO MONTI
-							</span>
+							<span class="tit_sub" th:text="${goodsInfo.brandGroupNm}">페르지노몬티 FERGINO MONTI</span>
+							<div class="sub_tab_nav">
+								<ul>
+									<li th:each="brandSizeInfo, status : ${brandSizeInfoList}"  th:class="${status.first}? 'active' : ''" ><a href="javascript:void(0)" th:text="${brandSizeInfo.sizeCate2Nm}">여성</a></li>
+								</ul>
+							</div>
 						</div>
 						<div class="size_cont">
-							<div class="size_tbl_box">
-								<h6>남성 상의</h6>
-								<p class="size_unit">단위 : cm</p>
-								<div class="tbl type2">
-									<table>
-										<colgroup>
-											<col width="20%">
-											<col width="20%">
-											<col width="20%">
-											<col width="20%">
-											<col width="20%">
-										</colgroup>
-										<thead>
-											<tr>
-												<th scope="col">&nbsp;</th>
-												<th scope="col">XS/44/85</th>
-												<th scope="col">S/55/90</th>
-												<th scope="col">M/66/95</th>
-												<th scope="col">L/77/100</th>
-											</tr>
-										</thead>
-										<tbody>
-											<tr>
-												<th scope="col">가슴둘레</th>
-												<td>95</td>
-												<td>100</td>
-												<td>105</td>
-												<td>110</td>
-											</tr>
-											<tr>
-												<th scope="col">허리둘레</th>
-												<td>95</td>
-												<td>100</td>
-												<td>105</td>
-												<td>110</td>
-											</tr> 
-											<tr>
-												<th scope="col">신장</th>
-												<td>95</td>
-												<td>100</td>
-												<td>105</td>
-												<td>110</td>
-											</tr>											   
-										</tbody>
-									</table>
-								</div>
+							<div class="sub_tab_cont_wrap">
+								<th:block th:each="brandSizeInfo, status : ${brandSizeInfoList}" th:utext="${#strings.unescapeJava(#strings.escapeJava(brandSizeInfo.sizeInfo))}"></th:block>
 							</div>
-							<div class="size_tbl_box">
-								<h6>남성 하의</h6>
-								<p class="size_unit">단위 : cm</p>
-								<div class="tbl type2">
-									<table>
-										<colgroup>
-											<col width="20%">
-											<col width="10%">
-											<col width="10%">
-											<col width="10%">
-											<col width="10%">
-											<col width="10%">
-											<col width="10%">
-											<col width="10%">
-											<col width="10%">
-										</colgroup>
-										<thead>
-											<tr>
-												<th scope="col">&nbsp;</th>
-												<th scope="col">27</th>
-												<th scope="col">28</th>
-												<th scope="col">29</th>
-												<th scope="col">30</th>
-												<th scope="col">32</th>
-												<th scope="col">34</th>
-												<th scope="col">36</th>
-												<th scope="col">38</th>
-											</tr>
-										</thead>
-										<tbody>
-											<tr>
-												<th scope="col">허리둘레</th>
-												<td>69</td>
-												<td>71</td>
-												<td>74</td>
-												<td>76</td>
-												<td>81</td>
-												<td>86</td>
-												<td>91</td>
-												<td>97</td>
-											</tr>									
-										</tbody>
-									</table>
-								</div>
-							</div>													  
 						</div>
+						</th:block>
 						<div class="size_footer">
 							<div class="info_txt">
 								<ul>
@@ -805,165 +126,25 @@
 								</ul>
 							</div>
 						</div>
-						<!-- //표준 사이즈 브랜드 구분일때 -->							
-					</div>   
-					<div class="tab_cont">
+					</div>
+					<div class="tab_cont" th:if="${measurementSizeInfoList != null and !measurementSizeInfoList.empty}">
 						<!-- 측정 사이즈 -->
 						<div class="size_head">
 							<!-- 측정 사이즈 > 카테고리 선택 -->
 							<div class="sub_tab_nav">
 								<ul>
-									<li class="active"><a href="javascript:void(0)">상의</a></li>
-									<li><a href="javascript:void(0)">하의</a></li>
-									<li><a href="javascript:void(0)">가방</a></li>
-									<li><a href="javascript:void(0)">신발</a></li>
-									<li><a href="javascript:void(0)">언더웨어</a></li>
+									<li th:each="measurementSizeInfo, status : ${measurementSizeInfoList}"  th:class="${status.first}? 'active' : ''" ><a href="javascript:void(0)" th:text="${measurementSizeInfo.sizeCate2Nm}">여성</a></li>
 								</ul>
 							</div>
 							<!-- //측정 사이즈 > 카테고리 선택 -->
 						</div>
 						<div class="size_cont">
 							<div class="sub_tab_cont_wrap">
-								<!-- 측정 사이즈 > 카테고리 내용(상의) -->
-								<div class="sub_tab_cont">
-									<span class="img_sizeinfo">
-										<img src="/images/pc/info_size_top.jpg" alt="상의 측정 사이즈">
-									</span>
-									<dl>
-										<div>
-											<dt>가슴둘레</dt>
-											<dd>양쪽 겨드랑이 밑선 단면을 잰 길이x2</dd>
-										</div>
-										<div>
-											<dt>어깨너비</dt>
-											<dd>좌측어깨에서 우측어깨끝 봉제선 단면을 잰 길이 (어깨봉제선이 없을경우 어깨길이와 팔길이는 측정 안함)</dd>
-										</div>
-										<div>
-											<dt>팔길이</dt>
-											<dd>어깨 봉제선부터 소매 끝까지 잰 길</dd>
-										</div>
-										<div>
-											<dt>총길이</dt>
-											<dd>카라부분(혹은 후드)를 제외 한 지점부터 밑단 끝까지 잰 길이 (라운드티셔츠의 경우 목라인을 포함 해 네크라인부터 밑단 끝까지의 길이를 측정)</dd>
-										</div>
-									</dl>
-								</div>	
-								<!-- //측정 사이즈 > 카테고리 내용(상의) -->
-								<!-- 측정 사이즈 > 카테고리 내용(하의) -->
-								<div class="sub_tab_cont">
-									<span class="img_sizeinfo">
-										<img src="/images/pc/info_size_pants.jpg" alt="하의 측정 사이즈">
-									</span>
-									<dl>
-										<div>
-											<dt>허리둘레</dt>
-											<dd>허리선을 일자로 맞추고 한쪽의 허리끝단부터 반대편 끝까지 단면을 잰 길이x2</dd>
-										</div>
-										<div>
-											<dt>밑위</dt>
-											<dd>허리부터 가랑이 끝점까지 잰 길이</dd>
-										</div>
-										<div>
-											<dt>엉덩이둘레</dt>
-											<dd>밑위 중간부분 단면을 잰 길이x2</dd>
-										</div>
-										<div>
-											<dt>허벅지둘레</dt>
-											<dd>가랑이 부분부터 바깥쪽 허벅지 끝나는 지점까지의 단면을 잰 길이x2</dd>
-										</div>
-										<div>
-											<dt>총길이</dt>
-											<dd>허리끝선부터 바지밑단 끝선 까지 잰 길이</dd>
-										</div>
-									</dl>
-								</div>	
-								<!-- //측정 사이즈 > 카테고리 내용(하의) -->	  
-								<!-- 측정 사이즈 > 카테고리 내용(가방) -->
-								<div class="sub_tab_cont">
-									<span class="img_sizeinfo">
-										<img src="/images/pc/info_size_bag.jpg" alt="가방 측정 사이즈">
-									</span>
-									<dl>
-										<div>
-											<dt>가로</dt>
-											<dd>가장 넓은 부분의 수평 길이</dd>
-										</div>
-										<div>
-											<dt>세로</dt>
-											<dd>바닥부터 가방의 가로 중앙지점까지 수직 길이</dd>
-										</div>
-										<div>
-											<dt>끈길이</dt>
-											<dd>가방 끝의 전체 길이(길이 조절이 가능한 경우 최소~최대 길이 표기)</dd>
-										</div>
-										<div>
-											<dt>손잡이높이</dt>
-											<dd>가방의 가로 가운데 지점부터 손잡이를 세웠을 때의 가장 높은 부분까지의 높이</dd>
-										</div>
-										<div>
-											<dt>끈폭</dt>
-											<dd>가방 끈의 수평폭</dd>
-										</div>
-										<div>
-											<dt>폭</dt>
-											<dd>가방 옆 부분의 두께</dd>
-										</div>
-									</dl>
-								</div> 
-								<!-- //측정 사이즈 > 카테고리 내용(가방) -->
-								<!-- 측정 사이즈 > 카테고리 내용(신발) -->
-								<div class="sub_tab_cont">
-									<span class="img_sizeinfo">
-										<img src="/images/pc/info_size_shoe.jpg" alt="신발 측정 사이즈">
-									</span>
-									<dl>
-										<div>
-											<dt>굽높이</dt>
-											<dd>설명 필요</dd>
-										</div>
-										<div>
-											<dt>볼너비</dt>
-											<dd>설명 필요</dd>
-										</div>
-										<div>
-											<dt>총길이</dt>
-											<dd>설명 필요</dd>
-										</div>
-									</dl>
-									<!--<div class="info_txt">
-										<ul>
-											<li>
-												국내 브랜드는 브랜드, 스타일마다 사이즈가 다르게 전개될 수 있으니, 개별 상품 상세페이지에 기재된 상세 사이즈안내를 참조하세요.
-											</li>
-										</ul>
-									</div>-->
-								</div> 
-								<!-- //측정 사이즈 > 카테고리 내용(신발) --> 
-								<!-- 측정 사이즈 > 카테고리 내용(언더웨어) -->
-								<div class="sub_tab_cont">
-									<span class="img_sizeinfo">
-										<img src="/images/pc/info_size_underwear.jpg" alt="속옷 측정 사이즈">
-									</span>
-									<dl>
-										<div>
-											<dt>밑가슴둘레</dt>
-											<dd>유방의 바로 밑을 수평으로 잰 길이</dd>
-										</div>
-										<div>
-											<dt>컵</dt>
-											<dd>밑가슴둘레와 가슴둘레의 차이</dd>
-										</div>
-										<div>
-											<dt>가슴둘레</dt>
-											<dd>유방을중심으로 수평으로 잰길이</dd>
-										</div>
-									</dl>
-								</div> 
-								<!-- //측정 사이즈 > 카테고리 내용(언더웨어) -->																					
-							</div>															   
-						</div>							
+								<th:block th:each="measurementSizeInfo, status : ${measurementSizeInfoList}" th:utext="${#strings.unescapeJava(#strings.escapeJava(measurementSizeInfo.sizeInfo))}"></th:block>
+							</div>
+						</div>
 						<!-- //측정 사이즈 -->
-					</div>						 
+					</div>
 				</div>
 			</div>
 		</div>

+ 243 - 0
src/main/webapp/WEB-INF/views/web/mypage/MypageGiftcardFormWeb.html

@@ -0,0 +1,243 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org"
+	xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
+	layout:decorator="web/common/layout/MypageLayoutWeb">
+<!--
+ *******************************************************************************
+ * @source  : MypagePointForm.html
+ * @desc    : 마이페이지 > STYLE24포인트 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2021 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.02.25   csh9191     최초 작성
+ *******************************************************************************
+ -->
+<body>
+
+<th:block layout:fragment="content">
+<!--  container -->
+	<div class="my_cont">
+		<div class="sec_head">
+			<h3>STYLE24 상품권</h3>
+		</div>
+		<div class="sec_body">
+			<div class="save_area mypage_coupon">
+				<p>사용 가능한 보유 금액<strong th:text="${#numbers.formatInteger(giftcardInfo.useGift,0,'COMMA')}"></strong>원</p>
+				<ul>
+					<li>보유 상품권 <span th:text="${#numbers.formatInteger(giftcardInfo.totalCount,0,'COMMA')} + '장'"></span></li>
+					<li>한달 이내 소멸 예정 <span th:text="${#numbers.formatInteger(giftcardInfo.expireCount,0,'COMMA')} + '장'"></span></li>
+				</ul>
+			</div>
+			<div class="gift_search">
+				<div class="gift_sea_wrap clear">
+					<label for="gift_input">상품권 등록</label>
+					<input type="text" id="gift_input" placeholder="상품권 번호를 입력해주세요.">
+					<button type="button" class="btn btn_dark">등록</button>
+				</div>
+			</div>
+			<div class="com_info_txt">
+				<p class="tit">상품권 등록 안내</p>
+				<ul>
+					<li>상품권은 상품 구매시 현금과 동일하게 사용됩니다.</li>
+					<li>상품권은 등록한 해당 몰에서만 사용이 가능합니다.</li>
+					<li>사용 후 남은 잔액은 상품권 잔액으로 환불되며,유효기간 내에 사용 가능합니다.</li>
+					<li>유효기간이 지난 상품권의 잔액은 자동 소멸됩니다.</li>
+					<li>상품권은 현금성 결제 수단에 포함되어 주문시 포인트 적립이 가능합니다.</li>
+					<li>상품권으로 결제한 금액은 마이페이지>주문상세페이지에서 현금영수증을 발급 받으실 수 있습니다.</li>
+				</ul>
+			</div>
+			<div class="my_tab coupon_tab">
+				<ul>
+					<li><a href="javascript:void(0);" id="SearchUseGiftcard">사용내역</a></li>
+					<li><a href="javascript:void(0);" id="SearchOwnGiftcard">보유 상품권</a></li>
+				</ul>
+				<div class="form_field" id="dateField">
+					<select id="searchDt">
+						
+					</select> 
+				</div>
+			</div>
+			<div id="giftcardList">
+			</div>
+		</div>
+	</div>
+<!-- // CONT-BODY -->					
+<script th:inline="javascript">
+//동적으로 날짜 년도 append
+function appendYear(){
+ 
+    var date = new Date();
+    var year = date.getFullYear();
+    var month = date.getMonth()+1;
+  
+    for(var i=year; i<=year; i++){
+       	for (var j= 1; j <=month; j++) {
+       		$("#searchDt").prepend("<option value='"+year+"-"+j+"'>"+i+"년"+ j +"월 </option>");
+		}
+    }
+	$("#searchDt").find("option:eq(0)").prop("selected", true); // 현재년도 선택
+}
+ 
+appendYear($("#searchDt"));
+
+// 사용내역 조회
+$("#SearchUseGiftcard").click(function(){
+	// class제거 추가
+	$("#SearchOwnGiftcard").removeClass("on");
+	$("#SearchUseGiftcard").addClass("on");
+	$("#giftcardList").attr("class","order_list");
+	
+	// 날짜 필드 
+	$("#dateField").css("display","block");
+	
+	let data = {};
+	
+	var jsonData = JSON.stringify(data);
+	
+	$.ajax(
+			{
+				type 	 : "POST",
+				data	 : jsonData,
+				url 	 : '/mypage/gift/use/list',
+				contentType: 'application/json',
+					dataType : 'json',
+				success  : function(result){
+					useGiftcard(result);
+				}
+			}
+	)
+});
+
+function useGiftcard(result) {
+	
+	let giftcardUseList = result.giftcardUseList;
+	
+	let tmtbHtml = "";
+	
+	tmtbHtml += '<section class="order_row mt30">';
+	tmtbHtml += '<div class="tbl track_tbl type2">';
+	tmtbHtml += '<table>';
+	tmtbHtml += '<colgroup>';
+	tmtbHtml += '<col width="750px">';
+	tmtbHtml += '<col width="150px">';
+	tmtbHtml += '<col width="*">';
+	tmtbHtml += '</colgroup>';
+	tmtbHtml += '<thead>';
+	tmtbHtml += '<tr>';
+	tmtbHtml +=	'<th>내용</th>';
+	tmtbHtml += '<th>증감/차감</th>';
+	tmtbHtml += '<th>일자</th>';
+	tmtbHtml += '</tr>';
+	tmtbHtml += '</thead>';
+	tmtbHtml += '<tbody>';
+	
+	
+	for(let i=0; i<giftcardUseList.length; i++){
+		let useGiftcard = giftcardUseList[i];
+		tmtbHtml +='<tr>';
+		if(useGiftcard.goodsNm != null){
+			tmtbHtml +='<td class="t_l pl40">'+ useGiftcard.goodsNm + '</td>';	
+		}else{
+			tmtbHtml +='<td class="t_l pl40">'+ useGiftcard.balanceName + '</td>';	
+		}
+		tmtbHtml += '<td class="c_primary">'+ useGiftcard.balance + ' ' + useGiftcard.gfcdAmt.addComma() + '</td>';
+		tmtbHtml += '<td>'+ useGiftcard.regDt + '</td>';
+		tmtbHtml += '</tr>';
+	}
+	
+	tmtbHtml += '</tbody>';
+	tmtbHtml += '</table>';
+	tmtbHtml += '</div>';
+	tmtbHtml += '</section>';
+	
+	$("#giftcardList").html(tmtbHtml);
+}
+
+// 보유상품권 조회
+$("#SearchOwnGiftcard").click(function(){
+	$("#SearchUseGiftcard").removeClass("on");
+	$("#SearchOwnGiftcard").addClass("on");
+	$("#giftcardList").attr("class","gift_list");
+	
+	// 날짜 필드 
+	$("#dateField").css("display","none");
+	let data = {};
+	
+	var jsonData = JSON.stringify(data);
+	
+	$.ajax(
+			{
+				type 	 : "POST",
+				data	 : jsonData,
+				url 	 : '/mypage/gift/own/list',
+				contentType: 'application/json',
+					dataType : 'json',
+				success  : function(result){
+					ownGiftcard(result);
+				}
+			}
+	)
+});
+
+function ownGiftcard(result) {
+	
+	let giftcardOwnList = result.giftcardOwnList;
+	
+	let tmtbHtml2 = "";
+	
+
+	tmtbHtml2 += '<ul class="clear">';
+
+	for(let i=0; i<giftcardOwnList.length; i++){
+		let ownGiftcard = giftcardOwnList[i];
+
+		if(ownGiftcard.rmGfcdAmt > 0){
+			tmtbHtml2 += '<li>';
+		}else{
+			tmtbHtml2 += '<li class="off">';
+		}	
+		tmtbHtml2 += '<div class="gift_shape">';
+		tmtbHtml2 += '<strong>' + ownGiftcard.gfcdNm + '</strong>';
+		tmtbHtml2 += '<div class="gift_price01">' +ownGiftcard.chgGfcdAmt.addComma() + ' 원권' +'</div>';
+		tmtbHtml2 += '<div class="gift_price02">';
+		tmtbHtml2 += '<span class="pr_t">잔액</span><span class="pr_num">'+ownGiftcard.rmGfcdAmt.addComma()+'</span>원'
+		tmtbHtml2 += '<div>';
+		tmtbHtml2 += '<div class="gift_price03">' +ownGiftcard.gfcdNo + '</div>';
+		tmtbHtml2 += '</div>';
+		tmtbHtml2 += '<div class="gift_date">';
+		tmtbHtml2 += '~ <span>' +ownGiftcard.useExpDate + '</span>';
+		tmtbHtml2 += '</div>';
+		tmtbHtml2 += '</li>';
+	}
+	
+	tmtbHtml2 += '</ul>';		
+		
+	$("#giftcardList").html(tmtbHtml2);
+
+}
+
+function fnChangeDate(obj) {
+	console.log(obj);
+}
+
+$(document).ready(function() {
+
+	// 마이페이지 LNB 설정
+	fnSetMypageLnbList(6);
+	
+	// 마이페이지 location 설정
+	fnSetMypageLocation('상품권', '_PAGE_MYPAGE_GIFTCARD');
+	
+	// 전체내역 표시
+	$("#SearchUseGiftcard").trigger('click');
+
+});
+</script>
+</th:block>
+
+</body>
+</html>

+ 78 - 56
src/main/webapp/WEB-INF/views/web/mypage/MypageReturnFormWeb.html

@@ -87,7 +87,7 @@
 												<div class="form_field">
 													<div class="select_custom type1">
 														<div class="combo">
-<!--															<input type="hidden" name="chgQty" value="0" th:attr="ordDtlNo=${return.ordDtlNo}, ordCanChgQty=${return.ordCanChgQty}"/>-->
+															<input type="hidden" name="chgQty" value="0" th:attr="ordDtlNo=${return.ordDtlNo}, ordCanChgQty=${return.ordCanChgQty}"/>
 															<div class="select">선택</div>
 															<ul class="list" style="width:100px; margin:0 auto">
 																<li class="selected" value="0">선택</li>
@@ -126,7 +126,8 @@
 										<div class="form_field">
 											<div class="select_custom type1">
 												<div class="combo">
-													<div class="select" name="chgReason">반품 사유를 선택하세요</div>
+													<input type="hidden" name="chgReason"/>
+													<div class="select">반품 사유를 선택하세요</div>
 													<ul class="list" style="width:400px">
 														<li class="selected" value="">반품 사유를 선택하세요</li>
 														<li th:if="${returnReason}" th:each="oneData, status : ${returnReason}" th:value="${oneData.cd}" th:text="${oneData.cdNm}" onclick="fnChangeReason(this);"></li>
@@ -146,7 +147,7 @@
 							</table>
 						</div>
 					</section>
-					<section class="order_row">
+					<section class="order_row" id="wdGb">
 						<div class="order_tit">
 							<h3 class="subH3">반품 방식 선택</h3>
 						</div>
@@ -160,11 +161,11 @@
 									<td>
 										<div class="form_field radio_field">
 											<div class="">
-												<input type="radio" name="wdGb" id="withdraw" value="W" onclick="fnChangeWdGb();" checked>
+												<input type="radio" name="wdGb" id="withdraw" value="W" checked>
 												<label for="withdraw"><span>방문회수 <b class="c_primary">택배사에서 방문하여 회수</b></span></label>
 											</div>
 											<div class="">
-												<input type="radio" name="wdGb" id="direct" value="D" onclick="fnChangeWdGb();">
+												<input type="radio" name="wdGb" id="direct" value="D">
 												<label for="direct"><span>직접반송 <b class="c_primary">고객이 직접 반송처리</b></span></label>
 											</div>
 										</div>
@@ -316,6 +317,7 @@
 <script src="/ux/plugins/gaga/gaga.paging.js"></script>
 <script th:inline="javascript">
 	let returnList = [[${returnList.returnList}]];
+	let oneData = [[${returnList.oneData}]];
 	let usedGiftCardInfo = [[${usedGiftCardInfo}]];
 	let usedPointInfo = [[${usedPointInfo}]];
 	let refundPoint = 0;
@@ -332,6 +334,12 @@
 		$('.select_custom.type1').each(function(index) {
 			var selecter01 = new sCombo($(this));
 		});
+
+		// 입점업체의 경우 회수방식 직접배송 처리
+		if (oneData.selfGoodsYn == 'Y') {
+			$('#direct').click();
+			$('#wdGb').css('display','none');
+		}
 	});
 	
 	// 반품 처리
@@ -343,10 +351,14 @@
 	// 반품 수량 변경 이벤트 처리
 	var fnChangeQty = function(param) {
 		let url = '/mypage/cancel/refund/amt/calculate';
-		$(param).parent().parent().find('input[name=chgQty]').val($(param).val());
-		$(param).val();
-		let chgReason = $('div[name=chgReason]').parent().find('li.selected').attr('value');
-		
+
+		if (param != null) {
+			$(param).parent().parent().find('input[name=chgQty]').val($(param).val());
+		}
+
+		let chgReason = $('input[name=chgReason]').val();
+
+		console.log(chgReason);
 		if (!gagajf.isNull(chgReason)) {
 			let returnRequestList = [];
 
@@ -354,71 +366,81 @@
 			let chgQtyArr = [];
 			let ordDtlNoArr = [];
 			let ordCanChgQtyArr = [];
+			let chgQtyChk = 0;
 			$.each($('input[name=chgQty]'), function(idx, item) {
 				let chgQty = $(item).val();
 				let ordDtlNo = $(item).attr('ordDtlNo');
 				let ordCanChgQty = $(item).attr('ordCanChgQty');
-				
-				console.log('chgQty >>> '+chgQty);
-				console.log('ordDtlNo >>> '+ordDtlNo);
-				console.log('ordCanChgQty >>> '+ordCanChgQty);
 
 				chgQtyArr.push(Number(chgQty));
 				ordDtlNoArr.push(Number(ordDtlNo));
 				ordCanChgQtyArr.push(Number(ordCanChgQty));
+				
+				chgQtyChk += Number(chgQty);
 			});
-			
-			// 환불포인트, 환불상품권 금액 계산
-			let refundPoint = fnCalculatePoint(chgQtyArr, ordDtlNoArr, ordCanChgQtyArr);
-			let refundGiftCard = fnCalculateGiftCard(chgQtyArr, ordDtlNoArr, ordCanChgQtyArr);
-
-			$.each(returnList, function(idx, item) {
-				let index = ordDtlNoArr.indexOf(item.ordDtlNo);
-				item.ordCanChgQty = chgQtyArr[index];
 
-				returnRequestList.push(item);
-			})
-			
-			let jsonData = JSON.stringify(returnRequestList);
-			
-			gagajf.ajaxJsonSubmit(url, jsonData, function(result) {
-				let spanCnclRtnAmt = Number(result.spanCnclRtnAmt);
-				let sumDeliveryFee = Number(result.sumDeliveryFee);
-				let spanTotDeliveryFee = Number(result.spanTotDeliveryFee);
-				let spanCpnDcAmt = Number(result.spanCpnDcAmt);
-				let spanTmtbDcAmt = Number(result.spanTmtbDcAmt);
-				let spanPrePntDcAmt = Number(result.spanPrePntDcAmt);
-				let spanRefundAmt = Number(result.spanRefundAmt);
+			if (chgQtyChk > 0) {
+				// 환불포인트, 환불상품권 금액 계산
+				let refundPoint = fnCalculatePoint(chgQtyArr, ordDtlNoArr, ordCanChgQtyArr);
+				let refundGiftCard = fnCalculateGiftCard(chgQtyArr, ordDtlNoArr, ordCanChgQtyArr);
 				
-				let goodsCancelAmt = spanCnclRtnAmt;										// 상품취소금액
-				let deliveryFee = sumDeliveryFee - spanTotDeliveryFee;						// 배송비
-				let deductDcAmt = 0 - spanCpnDcAmt - spanTmtbDcAmt - spanPrePntDcAmt;		// 할인금액 차감(쿠폰+다다익선+선포인트)
-				let refundPayAmt = spanRefundAmt;											// 결제금액 환불
-				let returnAmt = refundPayAmt + refundPoint + refundGiftCard;				// 환불예정금액
-
-				// 금액 설정
-				$('#returnAmt').text(returnAmt.addComma());
-				$('#goodsCancelAmt').text(goodsCancelAmt.addComma());
-				$('#deliveryFee').text(deliveryFee.addComma());
-				$('#deductDcAmt').text(deductDcAmt.addComma());
-				$('#refundPayAmt').text(refundPayAmt.addComma());
-				$('#refundPoint').text(refundPoint.addComma());
-				$('#refundGiftCard').text(refundGiftCard.addComma());
-				console.log(result);
-			})
+				$.each(returnList, function (idx, item) {
+					let index = ordDtlNoArr.indexOf(item.ordDtlNo);
+					item.ordCanChgQty = chgQtyArr[index];
+					
+					returnRequestList.push(item);
+				})
+				
+				let jsonData = JSON.stringify(returnRequestList);
+				
+				gagajf.ajaxJsonSubmit(url, jsonData, function (result) {
+					let spanCnclRtnAmt = Number(result.spanCnclRtnAmt);
+					let sumDeliveryFee = Number(result.sumDeliveryFee);
+					let spanTotDeliveryFee = Number(result.spanTotDeliveryFee);
+					let spanCpnDcAmt = Number(result.spanCpnDcAmt);
+					let spanTmtbDcAmt = Number(result.spanTmtbDcAmt);
+					let spanPrePntDcAmt = Number(result.spanPrePntDcAmt);
+					let spanRefundAmt = Number(result.spanRefundAmt);
+					
+					let goodsCancelAmt = spanCnclRtnAmt;										// 상품취소금액
+					let deliveryFee = sumDeliveryFee - spanTotDeliveryFee;						// 배송비
+					let deductDcAmt = 0 - spanCpnDcAmt - spanTmtbDcAmt - spanPrePntDcAmt;		// 할인금액 차감(쿠폰+다다익선+선포인트)
+					let refundPayAmt = spanRefundAmt;											// 결제금액 환불
+					let returnAmt = refundPayAmt + refundPoint + refundGiftCard;				// 환불예정금액
+					
+					// 금액 설정
+					$('#returnAmt').text(returnAmt.addComma());
+					$('#goodsCancelAmt').text(goodsCancelAmt.addComma());
+					$('#deliveryFee').text(deliveryFee.addComma());
+					$('#deductDcAmt').text(deductDcAmt.addComma());
+					$('#refundPayAmt').text(refundPayAmt.addComma());
+					$('#refundPoint').text(refundPoint.addComma());
+					$('#refundGiftCard').text(refundGiftCard.addComma());
+					console.log(result);
+				});
+			}
 		}
 	}
+
+	// 반품 방식 변경 이벤트
+	$('input[name=wdGb]').on('change', function() {
+		let wdGb = $('input[name=wdGb]:radio:checked').val();
+
+		if (wdGb == 'W') {
+			$('#chgerLocation').css('display', '');
+			$('#returnLocation').css('display', 'none');
+		} else {
+			$('#chgerLocation').css('display', 'none');
+			$('#returnLocation').css('display', '');
+		}
+	});
 	
 	// 반품 사유 변경 이벤트
 	var fnChangeReason = function(param) {
 		// TODO
 		// 반품 사유 변경 처리
-	}
-	
-	// 반품 방식 선택 이벤트
-	var fnChangeWdGb = function() {
-		let wdGb = $('input[name=wdGb]:radio:checked').val();
-		console.log(wdGb);
+		$(param).parent().parent().find('input[name=chgReason]').val($(param).val());
+		fnChangeQty();
 	}
 
 	// 환불 포인트 계산

+ 2032 - 0
src/main/webapp/WEB-INF/views/web/order/OrderCompleteWeb.html

@@ -0,0 +1,2032 @@
+<!DOCTYPE html>
+<html lang="ko" xmlns:th="http://www.thymeleaf.org"
+	xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
+	layout:decorator="web/common/layout/DefaultLayoutWeb">
+<!--
+ *******************************************************************************
+ * @source  : OrderFormWeb.html
+ * @desc    : 주문/결제 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.02.01   jsh77b     최초 작성
+ *******************************************************************************
+ -->
+<body>
+<th:block layout:fragment="content">
+
+<link rel="stylesheet" type="text/css" href="/ux/pc/css/swiper.min.css">
+<script type="text/javascript" src="/ux/pc/js/swiper.min.js"></script>
+<script type="text/javascript" src="/ux/pc/js/slick.min.js"></script>
+<script type="text/javascript" src="/ux/pc/js/jquery-ui.js"></script>
+
+<!-- payment.js -->
+<script type="text/javascript" th:src="${@environment.getProperty('pg.kcp.js.url')}" src=""></script>
+<script type="text/javascript" src="/ux/pc/js/payment.js"></script>
+	<script type="text/javascript">
+		$(document).on("click", "#buyBtn", function() {
+			$.ajax({
+				type: "POST",
+				url : '/order/create/preOrder',
+				dataType : 'html',
+				data : {
+					  pgGb		: "KCP"
+					, payMeans	: "G014_30"
+					, ordNo		: "5"
+					, goodsNm	: "상품 테스트"
+					, payAmt	: "1233"
+					, ordNm		: "이태영"
+					, ordEmail	: "xodud1202@naver.com"
+					, ordTelno	: "02-0000-0000"
+					, ordPhnno	: "010-7111-0000"
+				},
+				error : function(e) {
+					alert(3);
+				},
+				success : function(result) {
+					$("#order_info").html(result);
+					jsf__pay(document.order_info);
+				}
+			});
+		});
+	</script>
+	
+	
+
+	<form id="order_info" name="order_info" method="post" action="/order/pay/result/response" ></form>
+	
+	<div style="margin:20px;">
+		<input type="button" id="buyBtn" value="KCP테스트버튼" style="width:200px; height:70px; background-color: #fd4801; color: white; border: unset;"/>
+		<input type="button" id="kakaoBtn" value="카카오테스트버튼" style="width:200px; height:70px; background-color: #fffa00; color: black; border: unset;"/>
+		<input type="button" id="naverBtn" value="네이버테스트버튼" style="width:200px; height:70px; background-color: lawngreen; color: black; border: unset;"/>
+	</div>
+<!-- // xodud1202 -->
+
+
+<!-- card007 -->
+	<script th:inline="javascript">
+		$(document).on("click", "#kakaoBtn", function() {
+			$.ajax({
+				type: "POST",
+				url : '/order/create/preOrder',
+				dataType : 'html',
+				data : {
+					pgGb			: "KAKAO"
+					, custNo		: [[${sessionInfo.custNo}]]
+					, ordNo			: 1000
+					, goodsNm		: "상품 테스트"
+					, payAmt		: 30000
+					, ordGoodsQty	: [[${goodsTotCnt}]]
+				},
+				error : function(e) {
+					console.log(e.responseText);
+				},
+				success : function(result) {
+					$("#order_info").html(result);
+					fnKakaoPaymentReady();
+				}
+			});
+			//let url = '/order/create/preOrder';
+			//let data = {};
+			//data.pgGb = 'KAKAO';
+			//data.ordNo = 1000;
+			//data.custNo = [[${sessionInfo.custNo}]];
+			//data.goodsNm = '상품 테스트';
+			//data.ordGoodsQty = [[${goodsTotCnt}]];
+			//data.payAmt = 30000;
+			//
+			//let jsonData = JSON.stringify(data);
+			//
+			//gagajf.ajaxJsonSubmit(url, jsonData, function(result) {
+			//	$("#order_info").html(result);
+			//	console.log(result);
+			//	fnKakaoPaymentReady();
+			//});
+		});
+
+		// 카카오페이 결제준비 처리
+		var fnKakaoPaymentReady = function() {
+			let nextRedirectUrl = $('#order_info input[name=nextRedirectPcUrl]').val();
+			let option = 'width=420, height=520';
+
+			window.open(nextRedirectUrl, 'kakaoPaymentPopup', option);
+		}
+
+		// 카카오페이 결제 승인 요청
+		var fnKakaoPaymentRequest = function(pgToken) {
+			$('#order_info input[name=pgToken]').val(pgToken);
+
+			// TODO
+			// formSubmit
+
+			// 테스트용 호출
+			let url = '/order/kakao/payment/approve';
+			let data = {};
+			data.pgTid = $('#order_info input[name=pgTid]').val();
+			data.partnerOrderId = $('#order_info input[name=partnerOrderId]').val();
+			data.partnerUserId = $('#order_info input[name=partnerUserId]').val();
+			data.pgToken = $('#order_info input[name=pgToken]').val();
+
+			let jsonData = JSON.stringify(data);
+
+			gagajf.ajaxJsonSubmit(url, jsonData, function(result) {
+				console.log('====== kakaoPaymentRequest ======');
+				console.log(result.payment);
+				console.log(' ');
+				fnKakaoPaymentOrder();
+			});
+
+			return true;
+		}
+
+		// 카카오페이 결제 정보 조회 (테스트용 호출)
+		var fnKakaoPaymentOrder = function() {
+			let url = '/order/kakao/payment/order';
+			let data = {};
+			data.pgTid = $('#order_info input[name=pgTid]').val();
+
+			let jsonData = JSON.stringify(data);
+
+			gagajf.ajaxJsonSubmit(url, jsonData, function(result) {
+				console.log('====== kakaoPaymentOrder ======');
+				console.log(result.kakaoPay);
+				console.log(' ');
+				fnCancelKakaoPayment();
+			});
+
+			return true;
+		}
+
+		// 카카오페이 결제 취소 (테스트용 호출)
+		var fnCancelKakaoPayment = function() {
+			let url = '/order/kakao/payment/cancel';
+			let data = {};
+			data.pgTid = $('#order_info input[name=pgTid]').val();
+			data.payAmt = 1000;
+
+			let jsonData = JSON.stringify(data);
+
+			gagajf.ajaxJsonSubmit(url, jsonData, function(result) {
+				console.log('====== kakaoPaymentCancel ======');
+				console.log(result.kakaoPay);
+				console.log(' ');
+
+			});
+		}
+
+	</script>
+
+	<!-- =========== 네이버페이 ============= -->
+	<script th:inline="javascript">
+		$(document).on("click", "#naverBtn", function() {
+			$.ajax({
+				type: "POST",
+				url : '/order/create/preOrder',
+				dataType : 'html',
+				data : {
+					pgGb			: "NAVER"
+					, custNo		: [[${sessionInfo.custNo}]]
+					, ordNo			: 1000
+					, goodsNm		: "상품 테스트"
+					, payAmt		: 1000
+					, ordGoodsQty	: [[${goodsTotCnt}]]
+				},
+				error : function(e) {
+					mcxDialog.alert(e.responseText);
+				},
+				success : function(result) {
+					$("#order_info").html(result);
+					fnNaverPaymentReady();
+				}
+			});
+			//let url = '/order/create/preOrder';
+			//let data = {};
+			//data.pgGb = 'NAVER';
+			//data.ordNo = 1000;
+			//data.custNo = [[${sessionInfo.custNo}]];
+			//data.goodsNm = "상품 테스트";
+			//data.ordGoodsQty = [[${goodsTotCnt}]];
+			//data.payAmt = 30000;
+			//
+			//let jsonData = JSON.stringify(data);
+			//
+			//gagajf.ajaxJsonSubmit(url, jsonData, function(result) {
+			//	$("#order_info").html(result);
+			//	fnNaverPaymentReady();
+			//});
+		});
+		
+		// 네이버페이 결제준비 처리
+		var fnNaverPaymentReady = function() {
+			let naverPayUrl = 'https://' + [[${@environment.getProperty('naverPay.payUrl.web')}]];
+			let reserveId = $('#order_info input[name=reserveId]').val();
+			let url = naverPayUrl + '/payments/' + reserveId;
+			console.log(url);
+			let option = 'width=750, height=' + $(window).height();
+			
+			window.open(url, 'naverPaymentPopup', option);
+		}
+
+		// 네이버페이 결제 승인 요청
+		var fnNaverPaymentRequest = function(paymentId) {
+			$('#order_info input[name=pgTid]').val(paymentId);
+			
+			// TODO
+			// formSubmit
+			
+			// 테스트용 호출
+			let url = '/order/naver/payment/approve';
+			let data = {};
+			data.pgTid = $('#order_info input[name=pgTid]').val();
+			data.paySq = 1234;
+			data.custNo = [[${sessionInfo.custNo}]];
+			data.updNo = [[${sessionInfo.custNo}]];
+
+			let jsonData = JSON.stringify(data);
+
+			gagajf.ajaxJsonSubmit(url, jsonData, function(result) {
+				console.log('====== naverPaymentRequest ======');
+				console.log(result.payment);
+				console.log(' ');
+				fnNaverPaymentOrder();
+			});
+
+			return true;
+		}
+		
+		// 네이버페이 결제 정보 조회 (테스트용 호출)
+		var fnNaverPaymentOrder = function() {
+			let url = '/order/naver/payment/order';
+			let data = {};
+			data.pgTid = $('#order_info input[name=pgTid]').val();
+			
+			let jsonData = JSON.stringify(data);
+			
+			gagajf.ajaxJsonSubmit(url, jsonData, function(result) {
+				console.log('====== naverPaymentOrder ======');
+				console.log(result.naverPay);
+				console.log(' ');
+				fnCancelNaverPayment();
+			});
+			
+			return true;
+		}
+
+		// 네이버페이 결제 취소 (테스트용 호출)
+		var fnCancelNaverPayment = function() {
+			let url = '/order/naver/payment/cancel';
+			let data = {};
+			data.pgTid = $('#order_info input[name=pgTid]').val();
+			data.cancelRequester = '1';
+			data.chgReasonNm = '고객변심';
+			data.payAmt = 1000;
+			data.paySq = 1234;
+			data.custNo = [[${sessionInfo.custNo}]];
+			data.updNo = [[${sessionInfo.custNo}]];
+
+			let jsonData = JSON.stringify(data);
+
+			gagajf.ajaxJsonSubmit(url, jsonData, function(result) {
+				console.log('====== naverPaymentCancel ======');
+				console.log(result.naverPay);
+				console.log(' ');
+			});
+		}
+
+	</script>
+<!-- // card007 -->
+
+
+
+
+
+
+
+
+
+<!--  container -->
+<form id="payForm" name="payForm">
+
+	<!-- 주문고객정보 -->
+	<table border="1" style="font-size:10px; text-align:center; margin-top:20px; display:none;" name="orderInfo">
+		<tbody>
+			<tr style="height:30px;">
+				<th>custNm</th>
+				<th>email</th>
+				<th>cellPhnno</th>
+				<th>recipZipcode</th>
+				<th>recipBaseAddr</th>
+				<th>recipDtlAddr</th>
+				<th>delvMemo</th>
+				<th>foreignBuyYn</th>
+				<th>orderMadeYn</th>
+			</tr>
+			<tr style="height:30px;">
+				<td class="custNm"></td>
+				<td class="email"></td>
+				<td class="cellPhnno"></td>
+				<td class="recipZipcode"></td>
+				<td class="recipBaseAddr"></td>
+				<td class="recipDtlAddr"></td>
+				<td class="delvMemo"></td>
+				<td class="foreignBuyYn"></td>
+				<td class="orderMadeYn"></td>
+			</tr>
+		</tbody>
+	</table>
+
+	<!-- 사은품정보 -->
+	<table border="1" style="font-size:10px; text-align:center; margin-top:20px; display:none;" name="freegiftInfo">
+		<tr style="height:30px;">
+			<th>freegiftValArr</th>
+			<th>freegiftUsePointArr</th>
+		</tr>
+		<tr style="height:30px;">
+			<td class="freegiftValArr"></td>
+			<td class="freegiftUsePointArr"></td>
+		</tr>
+	</table>
+
+	<!-- 주문상세금액 -->
+	<table border="1" style="font-size:10px; text-align:center; margin-top:20px; display:none;" name="orderDetailInfo">
+		<tr style="height:30px;">
+			<th>cartSq</th>
+			<th style="display:none">goodsNm</th>
+			<th>orgCurrPrice</th>
+			<th>cpn1DcSq</th>
+			<th>cpn1DcAmt</th>
+			<th>optAddPrice</th>
+			<th>goodsQty</th>
+			<th>ordAmt</th>
+			<th>tmtb1Sq</th>
+			<th>tmtb1DcAmt</th>
+			<th>tmtb2Sq</th>
+			<th>tmtb2DcAmt</th>
+			<th>goodsCpnSq</th>
+			<th>goodsCpnDcAmt</th>
+			<th>cartCpnSq</th>
+			<th>cartCpnDcAmt</th>
+			<th>prePntDcAmt1</th>
+			<th>dcSumAmt</th>
+			<th>pntDcAmt1</th>
+			<th>gfcdUseAmt1</th>
+			<th>realOrdAmt1</th>
+			<th>savePntAmt1</th>
+			<th>shotDelvYn</th>
+			<th>foreignYn</th>
+			<th>orderMadeYn</th>
+			<th>delvFeeCd</th>
+		</tr>
+		<th:block th:each="delvAllCart, index : ${delvAllCartList}">
+			<th:block th:if="${delvAllCart != null and #lists.size(delvAllCart) > 0}">
+				<th:block th:each="goods, i : ${delvAllCart}">
+					<tr style="height:30px;">
+						<td class="cartSq" 			th:text="${goods.cartSq}"></td>
+						<td class="goodsNm" 		th:text="${goods.goodsNm}" style="display:none"></td>
+						<td class="orgCurrPrice" 	th:text="${goods.orgCurrPrice}"></td>
+						<td class="cpn1CpnSq" 		th:text="${goods.cpn1CpnSq}"></td>
+						<td class="cpn1DcAmt" 		th:text="${goods.orgCurrPrice} - ${goods.currPrice}"></td>
+						<td class="optAddPrice" 	th:text="${goods.optAddPrice}"></td>
+						<td class="goodsQty" 		th:text="${goods.goodsQty}"></td>
+						<td class="ordAmt">0</td>
+						<th:block th:if="${goods.applyQtySectionYn} == 'Y' and ${goods.qtyTmtbSq} > 0">
+							<td class="tmtb1Sq" 	th:text="${goods.qtyTmtbSq}"></td>
+							<td class="tmtb1DcAmt" 	th:text="${goods.tmtb1DcAmt}"></td>
+						</th:block>
+						<th:block th:if="${goods.applyQtySectionYn} != 'Y'">
+							<td class="tmtb1Sq">0</td>
+							<td class="tmtb1DcAmt">0</td>
+						</th:block>
+						<th:block th:if="${goods.applyAmtSectionYn} == 'Y' and ${goods.amtTmtbSq} > 0">
+							<td class="tmtb2Sq" 	th:text="${goods.amtTmtbSq}"></td>
+							<td class="tmtb2DcAmt" 	th:text="${goods.tmtb2DcAmt}"></td>
+						</th:block>
+						<th:block th:if="${goods.applyAmtSectionYn} != 'Y'">
+							<td class="tmtb2Sq" >0</td>
+							<td class="tmtb2DcAmt" >0</td>
+						</th:block>
+						<td class="goodsCpnSq">0</td>
+						<td class="goodsCpnDcAmt">0</td>
+						<td class="cartCpnSq">0</td>
+						<td class="cartCpnDcAmt">0</td>
+						<td class="prePntDcAmt1" 	th:text="${goods.prePntDcAmt}"></td>
+						<td class="dcSumAmt">0</td>
+						<td class="pntDcAmt1">0</td>
+						<td class="gfcdUseAmt1">0</td>
+						<td class="realOrdAmt1">0</td>
+						<td class="savePntAmt1" 	th:text="${goods.savePntAmt}"></td>
+						<td class="shotDelvYn" 		th:text="${goods.shotDelvYn}"></td>
+						<td class="foreignBuyYn" 	th:text="${goods.foreignBuyYn}"></td>
+						<td class="orderMadeYn" 	th:text="${goods.orderMadeYn}"></td>
+						<td class="delvFeeCd" 		th:text="${goods.delvFeeCd}"></td>
+					</tr>
+				</th:block>
+			</th:block>
+		</th:block>
+	</table>
+
+	<!-- 배송단위목록 -->
+	<table border="1" style="font-size:10px; text-align:center;  margin-top:20px; display:none;" name="delvFeeCdInfo">
+		<tr style="height:30px;">
+			<th>supplyCompCd</th>
+			<th>delvFeeCd</th>
+			<th>delvFee</th>
+			<th>delvCpnSq</th>
+			<th>delvCpnDcAmt</th>
+		</tr>
+		<th:block th:each="delvFeeCd, index : ${delvFeeCdList}">
+			<tr style="height:30px;">
+				<td class="supplyCompCd" th:text="${delvFeeCd.supplyCompCd}"></td>
+				<td class="delvFeeCd" th:text="${delvFeeCd.delvFeeCd}"></td>
+				<td class="delvFee" th:text="${delvFeeCd.delvFee}"></td>
+				<td class="delvCpnSq">0</td>
+				<td class="delvCpnDcAmt">0</td>
+			</tr>
+		</th:block>
+	</table>
+
+	<!-- 주문금액합계 -->
+	<table border="1" style="font-size:10px; text-align:center;  margin-top:20px; display:none;" name="orderSumAmtInfo">
+		<tr style="height:30px;">
+			<th>orgGoodsSumAmt</th>
+			<th>delvSumAmt</th>
+			<th>freegiftUsePnt</th>
+			<th>cpn1DcSumAmt</th>
+			<th>ordSumAmt</th>
+			<th>tmtb1DcSumAmt</th>
+			<th>tmtb2DcSumAmt</th>
+			<th>tmtbDcSumAmt</th>
+			<th>goodsCpnDcSumAmt</th>
+			<th>cartCpnDcSumAmt</th>
+			<th>delvCpnDcSumAmt</th>
+			<th>cpnDcSumAmt</th>
+			<th>prePntDcAmt</th>
+			<th>pntDcSumAmt</th>
+			<th>gfcdUseSumAmt</th>
+			<th>realOrdSumAmt</th>
+			<th>savePntSumAmt</th>
+		</tr>
+		<tr style="height:30px;">
+			<td class="orgGoodsSumAmt">0</td>
+			<td class="delvSumAmt" th:text="${sumDelvFee}"></td>
+			<td class="freegiftUsePnt">0</td>
+			<td class="cpn1DcSumAmt">0</td>
+			<td class="ordSumAmt">0</td>
+			<td class="tmtb1DcSumAmt">0</td>
+			<td class="tmtb2DcSumAmt">0</td>
+			<td class="tmtbDcSumAmt">0</td>
+			<td class="goodsCpnDcSumAmt">0</td>
+			<td class="cartCpnDcSumAmt">0</td>
+			<td class="delvCpnDcSumAmt">0</td>
+			<td class="cpnDcSumAmt">0</td>
+			<td class="prePntDcSumAmt">0</td>
+			<td class="pntDcSumAmt">0</td>
+			<td class="gfcdUseSumAmt">0</td>
+			<td class="realOrdSumAmt">0</td>
+			<td class="savePntSumAmt">0</td>
+		</tr>
+	</table>
+
+	<div id="container" class="container od">
+		<div class="wrap">
+			<div class="content odPayment">
+				<!-- 페이지특정 클래스 = odPayment -->
+				<div class="cont_head">
+					<h2>주문&#47;결제</h2>
+					<div class="oder_steps">
+						<ul>
+							<li>01 쇼핑백</li>
+							<li class="on">02 주문/결제</li>
+							<li>03 주문완료</li>
+						</ul>
+					</div>
+				</div>
+				
+				<div class="cont_body">
+					<!-- CONT-BODY -->
+					<form class="form_wrap">
+						<div class="od_cont">
+							<div class="sec_head">
+								<div class="tbl type4">
+									<table>
+										<colgroup>
+											<col width="240">
+											<col width="*">
+										</colgroup>
+										<tbody>
+											<tr>
+												<th>총 <span class="c_primary bold" th:text="${delvFeeCdCnt}"></span> 건으로 나뉘어 배송 예정</th>
+												<td class="t_l">
+													<span>총알배송<em class="c_primary bold" th:text="${shotCnt}" id="shotCnt"></em>건</span>
+													<span>STYLE24<em class="c_primary bold" th:text="${wmsCnt}" id="wmsCnt"></em>건</span>
+													<span>업체직배송<em class="c_primary bold" th:text="${delvCnt}"></em>건</span>
+													<span>예약배송<em class="c_primary bold" th:text="${resCnt}"></em>건</span>
+												</td>
+											</tr>
+										</tbody>
+									</table>
+								</div>
+							</div>
+							
+							<div class="sec_body">
+								<div class="foldGroup">
+									<ul>
+										<!-- 주문고객정보 -->
+										<li class="fold_mbinfo" id="custemerInfo" style="display:none"></li>
+										<!-- //주문고객정보 -->
+										
+										<!-- 배송지정보 -->
+										<li class="fold_mbinfo" id="deliveryAddrInfo" style="display:none"></li>
+										<!-- //배송지정보 -->
+										
+										<!-- 사은품선택 -->
+										<li id="freegiftInfo" style="display:none"></li>
+										<!-- //사은품선택 -->
+										
+										<!-- 할인/혜택 사용 -->
+										<li id="dcAmtInfo" style="display:none"></li>
+										<!-- //할인/혜택 사용 -->
+										
+										<!-- 결제수단 선택 -->
+										<li class="fold_paymethod" id="paymentInfo" style="display:none"></li>
+										<!-- //결제수단 선택 -->
+									</ul>
+								</div>
+							</div>
+						</div>
+						
+						<div class="od_side">
+							<div class="area_order">
+								<div class="tit_box">
+									<h3 class="subH2">주문내역</h3>
+									<span> <em class="number" th:text="${goodsTotCnt}"></em>개의 상품</span>
+								</div>
+								
+								<div id="orderListInfo" style="display:none">
+								</div>
+								
+								<div class="od_amount_box">
+									<dl>
+										<div>
+											<dt>상품금액</dt>
+											<dd id="orgGoodsSumAmt" th:text="|${#numbers.formatInteger(orgGoodsSumAmt, 1, 'COMMA')}원|"></dd>
+										</div>
+										<div>
+											<dt>배송비</dt>
+											<dd id="delvSumAmt" th:text="|${#numbers.formatInteger(sumDelvFee, 1, 'COMMA')}원|"></dd>
+										</div>
+										<div>
+											<dt>할인금액</dt>
+											<th:block th:if="${cpn1DcSumAmt} > 0">
+												<dd><span class="disc_amount" id="cpn1DcSumAmt" th:text="|-${#numbers.formatInteger(cpn1DcSumAmt, 1, 'COMMA')}원|"></span></dd>
+											</th:block>
+											<th:block th:if="${cpn1DcSumAmt} < 1">
+												<dd><span class="disc_amount" id="cpn1DcSumAmt" th:text="|${#numbers.formatInteger(cpn1DcSumAmt, 1, 'COMMA')}원|"></span></dd>
+											</th:block>
+										</div>
+										<div>
+											<dt>다다익선할인금액</dt>
+											<th:block th:if="${tmtbDcSumAmt} > 0">
+												<dd><span class="disc_amount" id="tmtbDcSumAmt" th:text="|-${#numbers.formatInteger(tmtbDcSumAmt, 1, 'COMMA')}원|"></span></dd>
+											</th:block>
+											<th:block th:if="${tmtbDcSumAmt} < 1">
+												<dd><span class="disc_amount" id="tmtbDcSumAmt" th:text="|${#numbers.formatInteger(tmtbDcSumAmt, 1, 'COMMA')}원|"></span></dd>
+											</th:block>
+										</div>
+										<div>
+											<dt>쿠폰할인금액</dt>
+											<dd><span class="disc_amount" id="couponDcSumAmt"></span></dd>
+										</div>
+										<div>
+											<dt>선포인트 사용</dt>
+											<th:block th:if="${prePntDcAmt} > 0">
+												<dd><span class="disc_amount" id="prePntDcAmt" th:text="|-${#numbers.formatInteger(prePntDcAmt, 1, 'COMMA')}원|"></span></dd>
+											</th:block>
+											<th:block th:if="${prePntDcAmt} < 1">
+												<dd><span class="disc_amount" id="prePntDcAmt" th:text="|${#numbers.formatInteger(prePntDcAmt, 1, 'COMMA')}원|"></span></dd>
+											</th:block>
+										</div>
+										<div>
+											
+											<dt>포인트 사용</dt>
+											<dd><span class="disc_amount" id="pntDcAmt">0원</span></dd>
+										</div>
+										<div>
+											
+											<dt>상품권 사용</dt>
+											<dd><span class="disc_amount" id="gfcdUseAmt">0원</span></dd>
+										</div>
+									</dl>
+								</div>
+								
+								<div class="totalprice_box">
+									<dl>
+										<dt>총 결제 예정 금액</dt>
+										<dd data-weight="price" data-font="lato">
+											<span id="realOrdAmt"></span>원
+										</dd>
+									</dl>
+									<p class="info_point">스타일 포인트 
+										<span class="save_point" id="savePntSumAmt" th:text="|${#numbers.formatInteger(savePntSumAmt, 1, 'COMMA')}P|"></span> 적립예정
+									</p>
+								</div>
+								
+							</div>
+						</div>
+					</form>
+					<!-- // CONT-BODY -->
+				</div>
+			</div>
+		</div>
+	</div>
+</form>
+
+<!-- // container -->
+<footer id="footer"></footer>
+
+<!-- 배송지변경팝업 -->
+<div class="modal fade od_pop adrsChange_pop" id="adrsChangePop" tabindex="-1" role="dialog" aria-labelledby="adrsChangeLabel" aria-hidden="true"></div>
+
+<!-- 배송지수정팝업 -->
+<div class="modal fade od_pop adrsModify_pop" id="adrsModifyPop" tabindex="-1" role="dialog" aria-labelledby="adrsModifyLabel" aria-hidden="true"></div>
+
+<!-- 배송지추가팝업 -->
+<div class="modal fade od_pop adrsAdd_pop" id="adrsAddPop" tabindex="-1" role="dialog" aria-labelledby="adrsAddLabel" aria-hidden="true"></div>
+
+<!-- 배송요청사항수정 팝업 -->
+<div class="modal fade od_pop rqstModify_pop" id="rqstModifyPop" tabindex="-1" role="dialog" aria-labelledby="rqstModifyLabel" aria-hidden="true"></div>
+
+<!-- 사은품지급안내 팝업 -->
+<div class="modal fade od_pop infoGift_pop" id="infoGiftPop" tabindex="-1" role="dialog" aria-labelledby="infoGiftLabel" aria-hidden="true"></div>
+
+<script th:inline="javascript">
+// 배송관련정보 변수선언
+var cartGoodsList		= [[${cartGoodsList}]]			// 배송목록
+var shotCnt 			= [[${shotCnt}]];				// 자사 총알 배송건수
+var wmsCnt 				= [[${wmsCnt}]];				// 자사 일반 배송건수
+var shotWmsCnt 			= [[${shotWmsCnt}]];			// 자사 총알,일반 배송건수
+var resCnt 				= [[${resCnt}]];				// 자사 예약 배송건수
+var delvCnt 			= [[${delvCnt}]];				// 입점 일반 배송건수
+var orgSumDelvFee		= [[${sumDelvFee}]];			// 최초배송비합계
+var prePntDcAmt			= [[${prePntDcAmt}]];			// 선포인트사용가능금액
+
+var custNm				= [[${order.custNm}]];			// 주문자명
+var cellPhnno			= [[${order.cellPhnno}]];		// 핸드폰번호
+var email				= [[${order.email}]];			// 이메일
+var recipZipcode		= [[${order.recipZipcode}]];	// 우편번호
+var recipBaseAddr		= [[${order.recipBaseAddr}]];	// 기본주소
+var recipDtlAddr		= [[${order.recipDtlAddr}]];	// 상세주소
+var cartSqArr			= [[${order.cartSqArr}]];		// 장바구니시퀀스 목록
+var shotDelvUseYn		= [[${order.shotDelvUseYn}]];	// 총알배송사용여부(장바구니)
+var shotDelvYn			= [[${order.shotDelvUseYn}]];	// 총알배송사용여부(장바구니)
+
+var foreignBuyYn		= [[${foreignBuyYn}]];			// 해외구매대행여부
+var orderMadeYn			= [[${orderMadeYn}]];			// 주문제작상품여부
+
+var custCpnSq 			= 0;
+var cpnIndex			= 0;
+var cpnApplyTemp		= false;
+
+//AJAX 로드를 위한 변수 설정
+var jsonObj 			= {};
+var jsonData			= null;
+
+// 컨텐츠 호출
+$(document).ready( function() {
+	
+	// 장바구니시퀀스 배열 변환
+	cartSqArr = String(cartSqArr).split(",");
+	
+	// AJAX 로드를 위한 변수 설정
+	jsonObj = {
+		"custNm" 			: custNm
+		, "cellPhnno" 		: cellPhnno
+		, "email" 			: email
+		, "recipZipcode" 	: recipZipcode
+		, "recipBaseAddr" 	: recipBaseAddr
+		, "recipDtlAddr" 	: recipDtlAddr
+		, "cartSqArr"		: cartSqArr
+		, "dispYn"			: "N"
+		, "shotDelvYn"		: shotDelvUseYn
+		, "foreignBuyYn"	: foreignBuyYn
+		, "orderMadeYn"		: orderMadeYn
+	}
+	
+	jsonData = JSON.stringify(jsonObj);
+
+	// 1. AJAX 정보(회원정보로드)
+	custemerInfoSet(jsonData);
+	
+	// 999. 개발화면정보설정
+	var devTemp = false;
+	var arr = []
+	arr[0] = "orderInfo";
+	arr[1] = "freegiftInfo";
+	arr[2] = "orderDetailInfo";
+	arr[3] = "delvFeeCdInfo";
+	arr[4] = "orderSumAmtInfo";
+	
+	if (devTemp) {
+		$("table").each(function(){
+			var name = $(this).attr("name");
+			for (i=0 ; i<arr.length ; i++) {
+				if (name == arr[i]) {
+					$(this).show();
+				}
+			}
+		});
+	}
+	
+});
+
+// 1. 함수기능 정의
+// 1.1 고객정보로드
+var custemerInfoSet = function(jsonData) {
+	$.ajax( {
+		type		: "POST",
+		url 		: '/order/custemerInfo',
+		data		: jsonData,
+		dataType 	: 'html',
+		beforeSend : function(xhr, settings) {
+			xhr.setRequestHeader("AJAX"			, "true");
+			xhr.setRequestHeader('Accept'		, 'application/json');
+			xhr.setRequestHeader('Content-Type'	, 'application/json');
+			gagajf.showProgressbar(true);
+		},
+		success 	: function(result) {
+			if (result != null) {
+				$("#custemerInfo").css("display", "block");
+				$("#custemerInfo").html(result);
+
+				// 고객정보설정
+				$(".custNm").text($("input[name='custNm'").val());
+				$(".email").text($("input[name='email'").val());
+				$(".cellPhnno").text($("input[name='cellPhnno'").val());
+			}
+			// 1.2 배송정보로드
+			deliveryAddrInfoSet(jsonData);
+		}
+	});
+}
+
+// 1.2 배송정보로드
+var deliveryAddrInfoSet = function(jsonData) {
+	$.ajax( {
+		type		: "POST",
+		url 		: '/order/deliveryAddrInfo',
+		data		: jsonData,
+		dataType 	: 'html',
+		beforeSend : function(xhr, settings) {
+			xhr.setRequestHeader("AJAX"			, "true");
+			xhr.setRequestHeader('Accept'		, 'application/json');
+			xhr.setRequestHeader('Content-Type'	, 'application/json');
+			gagajf.showProgressbar(true);
+		},
+		success 	: function(result) {
+			if (result != null) {
+				$("#deliveryAddrInfo").css("display", "block");
+				$("#deliveryAddrInfo").html(result);
+				
+				// 배송정보설정
+				$(".recipZipcode").text($("input[name='recipZipcode'").val());
+				$(".recipBaseAddr").text($("input[name='recipBaseAddr'").val());
+				$(".recipDtlAddr").text($("input[name='recipDtlAddr'").val());
+				$(".delvMemo").text($("input[name='delvMemo'").val());
+				$(".foreignBuyYn").text($("input[name='foreignBuyYn'").val());
+				$(".orderMadeYn").text($("input[name='orderMadeYn'").val());
+			}
+			
+			// 1.3 총알배송가능 지역, 총알배송 가능 시간 체크(초기로드정보)
+			fnGetDailyDeliveryCheck(true);
+		}
+	});
+}
+
+// 1.3 총알배송가능 지역, 총알배송 가능 시간 체크
+var fnGetDailyDeliveryCheck = function (temp) {
+	
+	// 장바구니 총알배송 사용여부 체크 N
+	if (shotDelvUseYn == "N") {
+		// 초기에 한번 데이타 로드
+		if (temp) {
+			// 1.4 주문상품목록로드
+			orderListInfoSet(jsonData, temp);
+		}
+	} else {
+		// 배송지 우편번호 체크
+		var zipcode		= $("input[name='recipZipcode']").val();
+	
+		// 총알배송여부 체크 배송지정보 존재여부 체크
+		if (zipcode == null || zipcode == '') {
+			//alert("배송지정보가 없습니다. 기본 총알배송 가능지역으로 설정 합니다.");
+			zipcode = "04320"; // 기본 서울역 우편번호로 설정
+		}
+		
+		// TODO
+		var shotDelvObj 	= {"zipNo" : zipcode};
+	
+		gagajf.ajaxJsonSubmit(
+			"/order/getDailyDeliveryCheck"
+			, JSON.stringify(shotDelvObj)
+			, function (result) {
+				// 총알배송여부체크
+				var tempShotDelvYn = "N";
+				
+				if (parseInt(result) > 0) {
+					tempShotDelvYn = "Y";
+				}
+				
+				// json 값 설정
+				var orderListObj 		= {"cartSqArr":cartSqArr, "shotDelvYn":tempShotDelvYn};
+				var orderListJsonData 	= JSON.stringify(orderListObj);
+				
+				if (temp) {
+					// 1.3 주문상품목록로드
+					orderListInfoSet(orderListJsonData, temp);
+				} else {
+					if (tempShotDelvYn != shotDelvYn) {
+						orderListInfoSet(orderListJsonData, temp);
+					}
+				}
+				
+				shotDelvYn = tempShotDelvYn;
+			}
+		)
+	}
+}
+
+// 1.4 주문상품목록로드
+var orderListInfoSet = function(orderListJsonData, temp) {
+	$.ajax( {
+		type		: "POST",
+		url 		: '/order/orderListInfo',
+		data		: orderListJsonData,
+		dataType 	: 'html',
+		beforeSend : function(xhr, settings) {
+			xhr.setRequestHeader("AJAX"			, "true");
+			xhr.setRequestHeader('Accept'		, 'application/json');
+			xhr.setRequestHeader('Content-Type'	, 'application/json');
+			gagajf.showProgressbar(true);
+		},
+		success 	: function(result) {
+			if (result != null) {
+				$("#orderListInfo").css("display", "block");
+				$("#orderListInfo").html(result);
+			}
+			
+			// 1.5 사은품정보로드
+			if (temp) {
+				freegiftInfoSet(jsonData);
+			}
+		}
+	});
+}
+
+// 1.5 사은품정보로드
+var freegiftInfoSet = function(jsonData) {
+	
+	$.ajax( {
+		type		: "POST",
+		url 		: '/order/freegiftInfo',
+		data		: jsonData,
+		dataType 	: 'html',
+		beforeSend : function(xhr, settings) {
+			xhr.setRequestHeader("AJAX"			, "true");
+			xhr.setRequestHeader('Accept'		, 'application/json');
+			xhr.setRequestHeader('Content-Type'	, 'application/json');
+			gagajf.showProgressbar(true);
+		},
+		success 	: function(result) {
+			if (result != null) {
+				$("#freegiftInfo").html(result);
+				
+				var total_gift 		= 0;
+				var total_deduct 	= 0;
+				
+				// 2.2 사은품선택 라디오 버튼 기능
+				$(".freegiftRdo").on("click", function() {
+					total_gift 		= 0;
+					total_deduct 	= 0;
+					
+					$(".freegiftRdo").each(function(){
+						if ($(this).attr("allYn") == "Y" ) {
+							total_gift 		+= 1;
+						}
+						
+						// 라디오버튼 사은품 체크
+						if ($(this).is(":checked")) {
+							// 수령거부가 아닐때 체크
+							if ($(this).val() != "noSel") {
+								total_gift 		+= 1;
+								total_deduct 	+= parseInt($(this).attr("usepoint"));
+							}
+						}
+					});
+					
+					$(".total_gift").text(total_gift);							// 사은품총선택개수
+					$(".total_deduct").text(total_deduct.addComma());			// 사은품총사용포인트
+					$(".freegiftUsePnt").text(total_deduct);
+					
+					// 포인트초기화기능
+					pntDcAmtReset();
+				});
+				
+				// 사은품테이블 그리기
+				$(".gift_box").each(function(){
+					$(this).find(".freegiftRdo").each(function(){
+						if ($(this).attr("allYn") == "Y" ) {
+							total_gift += 1;
+						}
+						$(".total_gift").text(total_gift);							// 사은품총선택개수
+					});
+				});
+			}
+			
+			// 1.6 결제타입로드
+			paymentInfoSet(jsonData);
+		}
+	});
+}
+
+// 1.6 결제타입로드 (결제버튼기능구현)
+var paymentInfoSet = function(jsonData) {
+	$.ajax( {
+		type		: "POST",
+		url 		: '/order/paymentInfo',
+		data		: jsonData,
+		dataType 	: 'html',
+		beforeSend : function(xhr, settings) {
+			xhr.setRequestHeader("AJAX"			, "true");
+			xhr.setRequestHeader('Accept'		, 'application/json');
+			xhr.setRequestHeader('Content-Type'	, 'application/json');
+			gagajf.showProgressbar(true);
+		},
+		success 	: function(result) {
+			if (result != null) {
+				$("#paymentInfo").css("display", "block");
+				$("#paymentInfo").html(result);
+				
+				// 결재하기
+				$("#btn_payment").on("click", function(){
+					// 사은품정보
+					var freegiftValArr 		= $(".freegiftValArr").text().split(",");
+					var prePntDcAmtYn		= $("input[name='rdi-beforpoint']:checked").val();
+					var orderDetailList		= [];
+					var delvFeeCdList		= [];
+					var ordGoodsQty			= 0;
+					var goodsNm				= "";
+
+					// 주문상세데이타 생성
+					$(".cartSq").each(function(){
+						var orderDetailData = {
+							"cartSq"			: $(this).text()
+							,"currPrice"		: $(this).parent().find(".orgCurrPrice").text()
+							,"optAddPrice"		: $(this).parent().find(".optAddPrice").text()
+							,"ordAmt"			: $(this).parent().find(".ordAmt").text()
+							,"cpn1DcSq"			: $(this).parent().find(".cpn1DcSq").text()
+							,"cpn1DcAmt"		: $(this).parent().find(".cpn1DcAmt").text()
+							,"goodsQty"			: $(this).parent().find(".goodsQty").text()
+							,"tmtb1Sq"			: $(this).parent().find(".tmtb1Sq").text()
+							,"tmtb1DcAmt"		: $(this).parent().find(".tmtb1DcAmt").text()
+							,"tmtb2Sq"			: $(this).parent().find(".tmtb2Sq").text()
+							,"tmtb2DcAmt"		: $(this).parent().find(".tmtb2DcAmt").text()
+							,"goodsCpnSq"		: $(this).parent().find(".goodsCpnSq").text()
+							,"goodsCpnDcAmt"	: $(this).parent().find(".goodsCpnDcAmt").text()
+							,"cartCpnSq"		: $(this).parent().find(".cartCpnSq").text()
+							,"cartCpnDcAmt"		: $(this).parent().find(".cartCpnDcAmt").text()
+							,"prePntDcAmt"		: $(this).parent().find(".prePntDcAmt1").text()
+							,"pntDcAmt"			: $(this).parent().find(".pntDcAmt1").text()
+							,"gfcdUseAmt"		: $(this).parent().find(".gfcdUseAmt1").text()
+							,"realOrdAmt"		: $(this).parent().find(".realOrdAmt1").text()
+							,"savePntAmt"		: $(this).parent().find(".savePntAmt1").text()
+							,"shotDelvYn"		: $(this).parent().find(".shotDelvYn").text()
+							,"foreignBuyYn"		: $(this).parent().find(".foreignYn").text()
+							,"makeGoodsYn"		: $(this).parent().find(".orderMadeYn").text()
+							,"delvFeeCd"		: $(this).parent().find(".delvFeeCd").text()
+						}
+						
+						// 상품수
+						ordGoodsQty++;
+						
+						orderDetailList.push(orderDetailData);
+					});
+					
+					// 주문배송업체정보 생성
+					$(".delvFeeCd").each(function(){
+						var delvFeeCdData = {
+							"delvFeeCd"			: $(this).text()
+							,"supplyCompCd"		: $(this).parent().find(".supplyCompCd").text()
+							,"delvFee"			: $(this).parent().find(".delvFee").text()
+							,"delvCpnSq"		: $(this).parent().find(".delvCpnSq").text()
+							,"delvCpnDcAmt"		: $(this).parent().find(".delvCpnDcAmt").text()
+						}
+						
+						delvFeeCdList.push(delvFeeCdData);
+					});
+					
+					// 주문데이타 생성
+					var orderData = {
+						"custNm"				: $(".custNm").text()
+						,"email"				: $(".email").text()
+						,"recipPhnno"			: $(".cellPhnno").text()
+						,"recipZipcode"			: $(".recipZipcode").text()
+						,"recipBaseAddr"		: $(".recipBaseAddr").text()
+						,"recipDtlAddr"			: $(".recipDtlAddr").text()
+						,"delvMemo"				: $(".delvMemo").text()
+						,"freegiftValArr"		: freegiftValArr
+						,"prePntDcAmtYn"		: prePntDcAmtYn
+						,"orderDetailList"		: orderDetailList
+						,"delvFeeCdList"		: delvFeeCdList
+						,"shotDelvYn"			: shotDelvYn
+						,"entryNo"				: $("input[name='entryNo']").val()
+						,"pgGb"					: "KCP"
+						,"payMeans"				: "G014_30"
+						,"payAmt"				: $(".realOrdSumAmt").text()
+						,"ordNm"				: $(".custNm").text()
+						,"ordPhnno"				: $(".cellPhnno").text()
+						,"goodsNm"				: $(".goodsNm").eq(0).text()
+						,"ordGoodsQty"			: ordGoodsQty
+					};
+					
+					var orderData = JSON.stringify(orderData);
+					
+					$.ajax( {
+						type		: "POST",
+						url 		: '/order/create/preOrder',
+						data		: orderData,
+						dataType 	: 'html',
+						beforeSend : function(xhr, settings) {
+							xhr.setRequestHeader("AJAX"			, "true");
+							xhr.setRequestHeader('Accept'		, 'application/json');
+							xhr.setRequestHeader('Content-Type'	, 'application/json');
+							gagajf.showProgressbar(true);
+						},
+						success 	: function(result) {
+							// 결재정보로드
+							$("#order_info").html(result);
+							jsf__pay(document.order_info);
+						}
+					});
+				});
+
+				// 1.8 할인영역 설정
+				dcAmtInfoSet(jsonData);
+			}
+		}
+	});
+}
+
+// 1.7 프로모션 쿠폰 적용 함수
+var serialCpnApply = function(){
+	let data = {
+		rdCpnNm : $("#payForm #serialCpnNm").val()
+	}
+
+	let jsonData = JSON.stringify(data);
+
+	$.ajax( {
+		type			: "POST",
+		url 			: '/cart/list/serialCpnApply',
+		contentType		: 'application/json',
+		dataType 		: 'json',
+		data 			: jsonData,
+		success 		: function(result) {
+			var jsonObj 	= {"cartSqArr" : cartSqArr,"dispYn" : "Y"};
+			var jsonData 	= JSON.stringify(jsonObj);
+
+			// 성공일때는 쿠폰정보 및 포인트 정보 reset
+			if (result.serialCpnInfo.result == "SUCCESS") {
+				// 1.8 할인영역 재로드
+				dcAmtInfoSet(jsonData);
+			} else {
+				alert(result.serialCpnInfo.result);
+			}
+		}
+	});
+}
+
+// 1.8 할인영역 설정 (쿠폰, 선포인트, 포인트, 상품권)
+var dcAmtInfoSet = function(jsonData) {
+	// 1.8.1 할인정보로드
+	$.ajax( {
+		type		: "POST",
+		url 		: '/order/dcAmtInfo',
+		data		: jsonData,
+		dataType 	: 'html',
+		beforeSend : function(xhr, settings) {
+			xhr.setRequestHeader("AJAX"			, "true");
+			xhr.setRequestHeader('Accept'		, 'application/json');
+			xhr.setRequestHeader('Content-Type'	, 'application/json');
+			gagajf.showProgressbar(true);
+		},
+		success 	: function(result) {
+			if (result != null) {
+				$("#dcAmtInfo").css("display", "block");
+				$("#dcAmtInfo").html(result);
+				
+				// 1.8.2 쿠폰적용초기화(할인율최고)
+				custCpnInit();
+				
+				// 1.8.3 쿠폰 SELECT BOX 기능 설정(js적용)
+				$('.select_custom.type1').each(function(index){
+					var selecter01 	= new sCombo($(this));
+					
+					// 선택박스 버튼기능 구현
+					$(this).find("ul li").each(function(i){
+						
+						// SELECT BOX 버튼 기능 설정
+						$(this).on("click", function(){
+							// 쿠폰 선택없음
+							if ($(this).prop("value") == 0) {
+								// 쿠폰 선택없음
+								cpnApplyDel($(this));
+							}
+							// 쿠폰선택
+							else {
+								// 쿠폰중복체크 후 적용
+								if (custCpnDuplicationCheck($(this).prop("value"), index)) {
+									// 쿠폰적용
+									custCpnApply($(this));
+								} else {
+									alert("이미 적용된 쿠폰 입니다.");
+									
+									// 쿠폰적용불가
+									custCpnNotApply($(this));
+								}
+								
+								// 쿠폰할인금액 SUM
+								custCpnSumAmtCal();
+								
+								// 최대할인혜택적용 체크해제
+								if ($("#chk-maxdisc").is(":checked")) {
+									$("#chk-maxdisc").attr("checked", false);
+								}
+							}
+						});
+					});
+				});
+				
+				// 1.8.4 쿠폰 최대할인금액 초기화 버튼 설정
+				$("#chk-maxdisc").on("click", function(){
+					if ($(this).is(":checked")) {
+						custCpnInit();
+					}
+				});
+
+				// 1.8.5 쿠폰할인적용 삭제 버튼
+				$(".btn_del_coupon").on("click", function(){
+					//선택없음선택
+					$(this).parent().parent().find("ul li").each(function(i){
+						if (i == 0) {
+							cpnApplyDel($(this)); // 쿠폰 선택없음
+						}
+					});
+				});
+				
+				// 1.8.6 선포인트 적용 버튼 기능
+				$("input[name='rdi-beforpoint']").each(function(){
+					// 선포인트 초기 설정 사용함
+					if ($(this).val() == "Y") {
+						$(this).attr("checked", true);
+					}
+					
+					// 버튼기능 구현
+					$(this).on("click", function(){
+						var rmPrePntAmt 		= parseInt($("input[name='rmPrePntAmt']").val());
+						
+						// 선포인트적용
+						if ($(this).val() == "Y") {
+							$("#prePntDcAmt").text("-"+rmPrePntAmt.addComma()+"원");
+						} else {
+							$("#prePntDcAmt").text("0원");
+						}
+						
+						// 쿠폰할인금액 SUM
+						custCpnSumAmtCal();
+					});
+				});
+				
+				// 1.8.7 포인트 적용버튼 기능
+				$("#btn_point_apply").on("click", function(){
+					var rmPntAmt 			= parseInt($("input[name='rmPntAmt']").val());
+					var freegiftUsePnt 		= parseInt($(".freegiftUsePnt").text());
+					var pntDcAmt 			= parseInt($("input[name='pntDcAmtStr']").val());
+					var realOrdAmt 			= parseInt($(".realOrdSumAmt").text());
+					var applyPntDcAmt 		= (realOrdAmt * 40) / 100;
+					
+					rmPntAmt				= rmPntAmt - freegiftUsePnt;
+					
+					// 입력여부체크
+					if (pntDcAmt < 1) {
+						alert("사용할 포인트를 입력해주세요");
+						// 포인트리셋기능
+						pntDcAmtReset();
+						return false;
+					}
+					
+					// 보유포인트보다 초과 사용 불가
+					if (pntDcAmt > rmPntAmt) {
+						alert("보유포인트 보다 초과 사용 할 수 없습니다.");
+						// 포인트리셋기능
+						pntDcAmtReset();
+						return false;
+					}
+
+					// TODO 포인트 사용금액 1000P 이상 사용
+					if (pntDcAmt < 1000) {
+						alert("포인트는 최소 1,000P이상 사용해야 합니다.");
+						// 포인트리셋기능
+						pntDcAmtReset();
+						return false;
+					}
+					
+					// 실결제금액보다 크게 적용 되었을때 적용 불가능
+					if (pntDcAmt > applyPntDcAmt) {
+						alert("결제금액의 최대 40%를 초과 사용 할 수 없습니다.");
+						// 포인트리셋기능
+						pntDcAmtReset();
+						return false;
+					}
+					
+					// 포인트 적용
+					$(".pntDcSumAmt").text(pntDcAmt);
+					$("#pntDcAmt").text("-"+pntDcAmt.addComma()+"원");
+					
+					// 상품권리렛기능
+					gfcdUseAmtReset();
+				});
+				
+				// 1.8.8 상품권 적용버튼 기능
+				$("#btn_gfcd_apply").on("click", function(){
+					var rmGfcdAmt 		= parseInt($("input[name='rmGfcdAmt']").val());
+					var gfcdUseAmt 		= parseInt($("input[name='gfcdUseAmtStr']").val());
+					
+					// 입력여부체크
+					if (gfcdUseAmt < 1 || $("input[name='gfcdUseAmtStr']").val() == "") {
+						alert("사용할 금액을 입력해주세요");
+						// 상품권리셋기능
+						gfcdUseAmtReset();
+						return false;
+					}
+					
+					// 보유금액보다 초과 사용 불가
+					if (gfcdUseAmt > rmGfcdAmt) {
+						alert("보유금액 보다 초과 사용 할 수 없습니다.");
+						// 상품권리셋기능
+						gfcdUseAmtReset();
+						return false;
+					}
+
+					// TODO 포인트 사용금액 1000원 이상 사용
+					if (gfcdUseAmt < 1000) {
+						alert("상품권 사용금액은 최소 1,000원 이상 사용해야 합니다.");
+						// 상품권리셋기능
+						gfcdUseAmtReset();
+						return false;
+					}
+					
+					// 상품권 적용
+					$(".gfcdUseSumAmt").text(gfcdUseAmt);
+					$("#gfcdUseAmt").text("-"+gfcdUseAmt.addComma()+"원");
+					
+					// 금액전체계산
+					custCpnSumAmtCal();
+				});
+				
+				// 금액계산초기화
+				custCpnSumAmtCal();
+			}
+		}
+	});
+}
+
+// 1.9 쿠폰 최대할인율 쿠폰적용
+var custCpnInit = function() {
+	
+	// 쿠폰적용없음적용
+	$(".select_custom.type1").each(function(index){
+		// select box 쿠폰 적용
+		var cpnCartSq = $(this).find("input[name='cpnCartSq']").val();
+		
+		// 장바구니시퀀스 체크
+		$(".cartSq").each(function(){
+			if (cpnCartSq == $(this).text()) {
+				$(this).parent().find(".goodsCpnSq").text("0");			// 상품쿠폰시퀀스
+				$(this).parent().find(".goodsCpnDcAmt").text("0");		// 상품쿠폰할인금액
+			}
+		});
+		
+		$(this).find("input[name='custCpnSq']").val("0");
+		$(this).find("input[name='cpnDcAmt']").val("0");
+		
+		$(this).find(".select").text("선택없음");
+		$(this).find(".cp_discount").css("display", "none");
+	});
+	
+	// 최대할인율 쿠폰적용
+	$('.select_custom.type1').each(function(index){
+		cpnIndex 		= 0;
+		cpnApplyTemp 	= false;
+		
+		// select 박스 반복문 실행
+		$(this).find("ul li").each(function(i){
+			cpnIndex++;
+			
+			// 1이상부터 중복 체크
+			if (cpnApplyTemp == false) {
+				if (cpnIndex > 1) {
+					if (custCpnDuplicationCheck($(this).prop("value"), index)) {
+						// 쿠폰적용
+						custCpnApply($(this));
+						// 쿠폰할인적용
+						cpnApplyTemp = true;
+					}
+				}
+			}
+		});
+	});
+	
+	// 포인트기능 리렛
+	pntDcAmtReset();
+}
+
+// 1.10 쿠폰중복사용체크
+var custCpnDuplicationCheck = function(custCpnSq, index) {
+	var selCustSq 	= 0;
+	var cnt 		= 0;
+
+	// 쿠폰중본사용체크
+	$("input[name='custCpnSq']").each(function(i){
+		if (index != i) {
+			selCustSq = $(this).val();
+			if (selCustSq == custCpnSq) {
+				cnt++;
+			}
+		}
+	});
+	
+	// 쿠폰적용불가
+	if (cnt > 0) {
+		return false;
+	}
+	// 쿠폰적용가능
+	else {
+		return true;
+	}
+}
+
+// 1.11 쿠폰중복체크 후 적용가능
+var custCpnApply = function(obj) {
+	// select box 쿠폰 적용
+	var cpnType 	= obj.parent().parent().find("input[name='cpnType']").val();
+	
+	// 상품쿠폰적용
+	if (cpnType == "goodsCpn") {
+		// 적용된 할인금액 text 설정 
+		var dcAmtStr = "- " + parseInt(obj.attr("data")).addComma() + " 원 할인적용";
+		obj.parent().parent().parent().parent().parent().find(".cp_amount").text(dcAmtStr);
+		
+		var cpnCartSq 	= obj.parent().parent().find("input[name='cpnCartSq']").val();
+		
+		// 장바구니시퀀스 체크
+		$(".cartSq").each(function(){
+			if (cpnCartSq == $(this).text()) {
+				$(this).parent().find(".goodsCpnSq").text(obj.prop("value"));			// 상품쿠폰시퀀스
+				$(this).parent().find(".goodsCpnDcAmt").text(obj.attr("data"));			// 상품쿠폰할인금액
+			}
+		});
+		
+		obj.parent().parent().find("input[name='cpnDcAmt']").val(obj.attr("data"));
+	} 
+	// 장바구니쿠폰적용
+	else if (cpnType == "cartCpn") {
+		var dcWay 				= obj.parent().find("input[name='dcWay']").val();
+		var dcVal 				= obj.parent().find("input[name='dcVal']").val();
+		var cartCpnDcSumAmt		= 0;
+		var tempSumAmt			= 0;
+		var cartSqLen			= $(".cartSq").length;
+		var leftAmt				= 0;
+		var index				= 1;
+		
+		// 장바구니쿠폰 해당 장바구니상품들 할인가 적용
+		obj.find("input[name='cartCpnCartSq']").each(function(){
+			var cartCpnCartSq 		= $(this).val();
+			var cartCpnDcAmt		= 0;
+			
+			// 장바구니시퀀스 체크
+			$(".cartSq").each(function(){
+				if (cartCpnCartSq == $(this).text()) {
+					var orgCurrPrice 	= parseInt($(this).parent().find(".orgCurrPrice").text());
+					var tmtb1DcAmt 		= parseInt($(this).parent().find(".tmtb1DcAmt").text());
+					var tmtb2DcAmt 		= parseInt($(this).parent().find(".tmtb2DcAmt").text());
+					var goodsCpnDcAmt 	= parseInt($(this).parent().find(".goodsCpnDcAmt").text());
+					
+					var tempAmt 		= orgCurrPrice - tmtb1DcAmt - tmtb2DcAmt - goodsCpnDcAmt;
+					tempSumAmt			= tempSumAmt + tempAmt; 
+					
+					// 할인율일때 할인금액 
+					if (dcWay == "G240_20") {
+						cartCpnDcAmt = (tempAmt * dcVal) / 100;
+						cartCpnDcSumAmt = cartCpnDcSumAmt + cartCpnDcAmt;
+						
+						$(this).parent().find(".cartCpnSq").val(obj.prop("value"));
+						$(this).parent().find(".cartCpnDcAmt").val(cartCpnDcAmt);
+					}
+				}
+			});
+		});
+		
+		// 금액일때 할인금액 적용
+		if (dcWay == "G240_10") {
+			cartCpnDcSumAmt = dcVal;
+			leftAmt			= dcVal;
+			index = 1;
+			
+			// 장바구니쿠폰 해당 장바구니상품들 할인가 적용
+			obj.find("input[name='cartCpnCartSq']").each(function(){
+				var cartCpnCartSq 		= $(this).val();
+				var cartCpnDcAmt		= 0;
+									
+				// 장바구니시퀀스 체크
+				$(".cartSq").each(function(){
+					if (cartCpnCartSq == $(this).text()) {
+						var orgCurrPrice 	= parseInt($(this).parent().find(".orgCurrPrice").text());
+						var tmtb1DcAmt 		= parseInt($(this).parent().find(".tmtb1DcAmt").text());
+						var tmtb2DcAmt 		= parseInt($(this).parent().find(".tmtb2DcAmt").text());
+						var goodsCpnDcAmt 	= parseInt($(this).parent().find(".goodsCpnDcAmt").text());
+						
+						var tempAmt 		= orgCurrPrice - tmtb1DcAmt - tmtb2DcAmt - goodsCpnDcAmt;
+						var tempDiv 		= parseInt((tempAmt / tempSumAmt) * 100);
+						var cartCpnDcAmt	= 0;
+				
+						if (index == cartSqLen) {
+							cartCpnDcAmt 	= leftAmt;
+						} else {
+							cartCpnDcAmt	= parseInt((cartCpnDcSumAmt * tempDiv) / 100);
+							leftAmt 		= leftAmt - cartCpnDcAmt;
+						}
+						
+						$(this).parent().find(".cartCpnSq").text(obj.prop("value"));
+						$(this).parent().find(".cartCpnDcAmt").text(cartCpnDcAmt);
+						
+						index++;
+					}
+				});
+			});
+		} 
+		
+		obj.parent().parent().find("input[name='cpnDcAmt']").val(cartCpnDcSumAmt);
+		
+		var dcAmtStr = "- " + cartCpnDcSumAmt.addComma() + " 원 할인적용";
+		obj.parent().parent().parent().parent().parent().find(".cp_amount").text(dcAmtStr);
+	}
+	// 배송비쿠폰적용
+	else if (cpnType == "delvCpn") {
+		var delvFee 		= parseInt(obj.attr("delvfee"));
+		var delvCpnDcAmt 	= parseInt(obj.attr("data"));
+		var delvFeeCd 		= obj.attr("delvfeecd");
+		
+		// 배송비가 배송비쿠폰할인금액보다 클경우 배송비 - 배송비쿠폰할인금액을 적용
+		if (delvFee > delvCpnDcAmt) {
+			cpnDcAmt = delvFee - delvCpnDcAmt;
+		} else {
+			cpnDcAmt = delvFee;
+		}
+		
+		// 적용된 할인금액 text 설정 
+		var dcAmtStr = "- " + cpnDcAmt.addComma() + " 원 할인적용";
+		
+		obj.parent().parent().parent().parent().parent().find(".cp_amount").text(dcAmtStr);
+		
+		obj.parent().parent().find("input[name='cpnDcAmt']").val(cpnDcAmt);
+		obj.parent().parent().find("input[name='delvFeeCd']").val(obj.attr("delvfeecd"));
+		
+		$(".delvCpnDcSumAmt").text(obj.attr("data"));
+				
+		// 배송비쿠폰 테이블 적용
+		
+		$(".delvFeeCd").each(function(){
+			if ($(this).text() == delvFeeCd) {
+				$(this).parent().find(".delvCpnSq").text(obj.prop("value"));
+				$(this).parent().find(".delvCpnDcAmt").text(obj.attr("data"));
+			}
+		});
+	}
+	
+	// select box 쿠폰 적용 (공통적용)
+	obj.parent().parent().find("input[name='custCpnSq']").val(obj.prop("value"));
+	obj.parent().parent().find(".select").text(obj.text());
+	
+	// 선택된 할인금액 노출
+	obj.parent().parent().parent().parent().parent().find(".cp_discount").css("display", "block");
+	
+	// 포인트기능 리렛
+	pntDcAmtReset();
+}
+
+// 1.12 쿠폰중복체크 후 적용불가
+var custCpnNotApply = function(obj) {
+	// 이전에 등록된 쿠폰시퀀스  
+	var custCpnSq = obj.parent().parent().find("input[name='custCpnSq']").val();
+
+	// 이전에 등록된 쿠폰시퀀스 비교후 데이타 원복
+	obj.parent().find("li").each(function(){
+		if ($(this).prop("value") == custCpnSq) {
+			$(this).parent().parent().find(".select").text($(this).text());
+			
+			if (custCpnSq == 0) {
+				$(this).parent().parent().parent().parent().parent().find(".cp_discount").css("display", "none");
+			} else {
+				$(this).parent().parent().parent().parent().parent().find(".cp_discount").css("display", "block");
+			}
+		}
+	});
+	
+	// 포인트기능 리렛
+	pntDcAmtReset();
+}
+
+// 1.13 쿠폰 선택없음 기능 구현
+var cpnApplyDel = function(obj) {
+	// 쿠폰타입(상품쿠폰, 장바구니쿠폰, 배송비쿠폰)
+	var cpnType = obj.parent().parent().find("input[name='cpnType']").val();
+	
+	// 상품쿠폰적용
+	if (cpnType == "goodsCpn") {
+		// select box 쿠폰 적용
+		var cpnCartSq = obj.parent().parent().find("input[name='cpnCartSq']").val();
+		
+		// 장바구니시퀀스 체크
+		$(".cartSq").each(function(){
+			if (cpnCartSq == $(this).text()) {
+				$(this).parent().find(".goodsCpnSq").text("0");			// 상품쿠폰시퀀스
+				$(this).parent().find(".goodsCpnDcAmt").text("0");		// 상품쿠폰할인금액
+			}
+		});
+	}
+	// 장바구니쿠폰적용
+	else if (cpnType == "cartCpn") {
+		// 장바구니쿠폰 시퀀스 0, 장바구니할인금액 0
+		$(".cartSq").each(function(){
+			$(this).parent().find(".cartCpnSq").text("0");
+			$(this).parent().find(".cartCpnDcAmt").text("0");
+		});
+	}
+	// 배송비쿠폰적용
+	else if (cpnType == "delvCpn") {
+		// 장바구니쿠폰 시퀀스 0, 장바구니할인금액 0
+		//$("input[name='custCpnSq']").each(function(){
+			//$(this).parent().find("input[name='delvFeeCd']").val("0");
+		//});
+		
+		obj.parent().parent().find("input[name='delvFeeCd']").val("0");
+		$(".delvCpnSq").text("0");
+	}
+	
+	obj.parent().parent().find("input[name='custCpnSq']").val("0");
+	obj.parent().parent().find("input[name='cpnDcAmt']").val("0");
+
+	obj.parent().parent().find(".select").text("선택없음");
+	obj.parent().parent().parent().parent().parent().find(".cp_discount").css("display", "none");
+	
+	// 포인트기능 리렛
+	pntDcAmtReset();
+	
+	// 최대할인혜택적용 체크해제
+	if ($("#chk-maxdisc").is(":checked")) {
+		$("#chk-maxdisc").attr("checked", false);
+	}
+}
+
+// 1.14 선포인트리셋기능 (사용안함)
+var prePntDcAmtReset = function() {
+	var rmPrePntAmt = parseInt($("input[name='rmPrePntAmt']").val());
+	$("input[name='prePntDcAmt']").val(rmPrePntAmt);
+	
+	// 선포인트사용여부 체크 후 적용
+	$("input[name='rdi-beforpoint']").each(function(){
+		// 선포인트 초기 설정 사용함
+		if ($(this).val() == "Y") {
+			$(this).attr("checked", true);
+		}
+	});
+
+	$("#prePntDcAmt").text("-"+rmPrePntAmt.addComma()+"원");
+	
+	// 포인트기능 리렛
+	pntDcAmtReset();
+}
+
+// 1.15 포인트리셋기능
+var pntDcAmtReset = function() {
+	$(".pntDcSumAmt").text("0");
+	$("input[name='pntDcAmtStr']").val("");
+	$("#pntDcAmt").text("0원");
+	
+	// 상품권리셋기능
+	gfcdUseAmtReset();
+}
+
+// 1.16 상품권리셋기능
+var gfcdUseAmtReset = function() {
+	$(".gfcdUseSumAmt").text("0");
+	$("input[name='gfcdUseAmtStr']").val("");
+	$("#gfcdUseAmt").text("0원");
+	
+	// 금액전체계산
+	custCpnSumAmtCal();
+}
+
+// 1.17 쿠폰할인금액합계설정(금액전체계산)
+var custCpnSumAmtCal = function() {
+	var cpnDcSumAmt = 0;
+	var cpnApplyCnt = 0;
+	
+	$("input[name='cpnDcAmt']").each(function(){
+		cpnDcSumAmt = cpnDcSumAmt + parseInt($(this).val());
+		
+		// 적용된 쿠폰 수량
+		if (parseInt($(this).val()) > 0) {
+			cpnApplyCnt++;
+		}
+	});
+	
+	// 쿠폰영역
+	$(".maxdisc_amount").text("(-" + cpnDcSumAmt.addComma() + "원)"); // 쿠폰할인금액합계
+	$("#cpnApplyCnt").text(cpnApplyCnt + "장");
+	
+	// 상품목록영역
+	$("#couponDcSumAmt").text("-" + cpnDcSumAmt.addComma() + "원"); // 쿠폰할인금액합계
+	$(".cpnDcSumAmt").text(cpnDcSumAmt);
+	
+	// 배송비할인적용
+	$("input[name='cpnType']").each(function(){
+		if ($(this).val() == "delvCpn") {
+			var delvSumAmt = parseInt(orgSumDelvFee) - parseInt($(this).parent().find("input[name='cpnDcAmt']").val());
+			
+			// 최종배송비
+			$("#delvSumAmt").text(delvSumAmt.addComma() + "원");
+			$(".delvSumAmt").text(delvSumAmt);
+		}
+	});
+	
+	// 2021.03.06 주문상세 테이블 적용
+	// 포인트금액 상품상세에 포인트금액 분배 작업
+	var prePntDcAmtYn 		= $("input[name='rdi-beforpoint']:checked").val();
+	var leftPntAmt			= parseInt($(".pntDcSumAmt").text());
+	var leftGfcdAmt			= parseInt($(".gfcdUseSumAmt").text());
+	var cartSqLenght		= $(".cartSq").length; 
+	var index				= 1;
+	
+	var orgGoodsSumAmt		= 0;
+	var cpn1DcSumAmt		= 0;
+	var ordSumAmt			= 0;
+	var tmtb1DcSumAmt		= 0;
+	var tmtb2DcSumAmt		= 0;
+	var tmtbDcSumAmt		= 0;
+	var goodsCpnDcSumAmt	= 0;
+	var cartCpnDcSumAmt		= 0;
+	var delvCpnDcSumAmt		= 0;
+	var cpnDcSumAmt			= 0;
+	var prePntDcSumAmt		= 0;
+	var pntDcSumAmt 		= parseInt($(".pntDcSumAmt").text());
+	var gfcdUseSumAmt 		= parseInt($(".gfcdUseSumAmt").text());
+	var realOrdSumAmt		= 0;
+	var savePntSumAmt		= 0;
+	
+	$(".cartSq").each(function(){
+		var orgCurrPrice 	= parseInt($(this).parent().find(".orgCurrPrice").text());
+		var cpn1DcAmt		= parseInt($(this).parent().find(".cpn1DcAmt").text());
+		var optAddPrice 	= parseInt($(this).parent().find(".optAddPrice").text());
+		var goodsQty 		= parseInt($(this).parent().find(".goodsQty").text());
+		var tmtb1DcAmt		= parseInt($(this).parent().find(".tmtb1DcAmt").text());
+		var tmtb2DcAmt		= parseInt($(this).parent().find(".tmtb2DcAmt").text());
+		var goodsCpnDcAmt	= parseInt($(this).parent().find(".goodsCpnDcAmt").text());
+		var cartCpnDcAmt	= parseInt($(this).parent().find(".cartCpnDcAmt").text());
+		var prePntDcAmt1	= parseInt($(this).parent().find(".prePntDcAmt1").text());
+		var dcSumAmt		= 0;
+		var savePntAmt1		= parseInt($(this).parent().find(".savePntAmt1").text());
+		
+		// 주문금액 = ((판매가 - 즉시할인가) + 옵션추가금액) * 장바구니수량
+		orgGoodsSumAmt		= orgGoodsSumAmt + (orgCurrPrice + optAddPrice) * goodsQty;
+		cpn1DcSumAmt		= cpn1DcSumAmt + cpn1DcAmt;
+		tmtb1DcSumAmt		= tmtb1DcSumAmt + tmtb1DcAmt;
+		tmtb2DcSumAmt		= tmtb2DcSumAmt + tmtb2DcAmt;
+		tmtbDcSumAmt		= tmtbDcSumAmt + (tmtb1DcAmt + tmtb2DcAmt);
+		goodsCpnDcSumAmt	= goodsCpnDcSumAmt + goodsCpnDcAmt;
+		cartCpnDcSumAmt		= cartCpnDcSumAmt + cartCpnDcAmt;
+		cpnDcSumAmt			= cpnDcSumAmt + (goodsCpnDcAmt + cartCpnDcAmt);
+		prePntDcSumAmt		= prePntDcSumAmt + prePntDcAmt1;
+		
+		var ordAmt			= ((orgCurrPrice +  - cpn1DcAmt) + optAddPrice) * goodsQty;
+		ordSumAmt			= ordSumAmt + ordAmt;
+		
+		// 선포인트사용여부
+		// 할인금액합계 = 다다익선수량금액 + 다다익선금액금액 + 상품쿠폰금액 + 장바구니금액 + 선포인트금액
+		if (prePntDcAmtYn == "Y") {
+			dcSumAmt		= tmtb1DcAmt + tmtb2DcAmt + goodsCpnDcAmt + cartCpnDcAmt + prePntDcAmt1;
+		} else {
+			dcSumAmt		= tmtb1DcAmt + tmtb2DcAmt + goodsCpnDcAmt + cartCpnDcAmt;
+		}
+		
+		// 주문금액설정
+		$(this).parent().find(".ordAmt").text(ordAmt);
+		$(this).parent().find(".dcSumAmt").text(dcSumAmt);
+		
+		savePntSumAmt		= savePntSumAmt + savePntAmt1;
+	});
+	
+	// 포인트, 상품권 금액 분배
+	$(".cartSq").each(function(){
+		var ordAmt 			= parseInt($(this).parent().find(".ordAmt").text());
+		var dcSumAmt		= parseInt($(this).parent().find(".dcSumAmt").text()); 
+		var tempDiv 		= parseInt((ordAmt / ordSumAmt) * 100);
+		var pntDcAmt1 		= 0;
+		var gfcdUseAmt1		= 0;
+		
+		if (index == cartSqLenght) {
+			pntDcAmt1 		= leftPntAmt;
+			gfcdUseAmt1		= leftGfcdAmt;
+		} else {
+			pntDcAmt1 		= parseInt((pntDcSumAmt * tempDiv) / 100);
+			gfcdUseAmt1		= parseInt((gfcdUseSumAmt * tempDiv) / 100);
+			leftPntAmt		= leftPntAmt - pntDcAmt1;
+			leftGfcdAmt		= leftGfcdAmt - gfcdUseAmt1;
+		}
+		
+		var realOrdAmt1		= ordAmt - dcSumAmt - (pntDcAmt1 - gfcdUseAmt1);
+		realOrdSumAmt		= realOrdSumAmt + realOrdAmt1;
+		
+		$(this).parent().find(".pntDcAmt1").text(pntDcAmt1);
+		$(this).parent().find(".gfcdUseAmt1").text(gfcdUseAmt1);
+		$(this).parent().find(".realOrdAmt1").text(realOrdAmt1);
+		
+		index++;
+	});
+	
+	$(".orgGoodsSumAmt").text(orgGoodsSumAmt);
+	$(".cpn1DcSumAmt").text(cpn1DcSumAmt);
+	$(".ordSumAmt").text(ordSumAmt);
+	$(".tmtb1DcSumAmt").text(tmtb1DcSumAmt);
+	$(".tmtb2DcSumAmt").text(tmtb2DcSumAmt);
+	$(".tmtbDcSumAmt").text(tmtbDcSumAmt);
+	$(".goodsCpnDcSumAmt").text(goodsCpnDcSumAmt);
+	$(".cartCpnDcSumAmt").text(cartCpnDcSumAmt);
+	$(".cpnDcSumAmt").text(cpnDcSumAmt);
+	$(".prePntDcSumAmt").text(prePntDcSumAmt);
+	$(".realOrdSumAmt").text(realOrdSumAmt);
+	$(".savePntSumAmt").text(savePntSumAmt);
+	
+	$("#realOrdAmt").text(realOrdSumAmt.addComma() + "원"); // 총 결제 예정 금액
+	
+	var tempSavePnt			= savePntSumAmt - prePntDcAmt;
+	
+	// 사은품사용 후 보유포인트	
+	var rmPntAmt 			= parseInt($("input[name='rmPntAmt']").val());
+	var freegiftUsePnt 		= parseInt($(".freegiftUsePnt").text());
+	rmPntAmt 				= rmPntAmt - freegiftUsePnt; 
+	$(".rmPntAmt").text("보유 : " + rmPntAmt.addComma() + "P");
+	
+	// 걸제영역
+	$("#btn_payment").text("동의 후 "+realOrdSumAmt.addComma()+"원 결제하기");
+	
+	// 적립포인트
+	$("#savePntSumAmt").text(savePntSumAmt.addComma()+"P");
+	
+	// 사은품정보 설정
+	var freegiftValArr 			= [];
+	var freegiftUsePointArr 	= [];
+		
+	$(".gift_box").each(function(){
+		$(this).find(".freegiftRdo").each(function(){
+			// 사은품필수
+			if ($(this).attr("allYn") == "Y" ) {
+				freegiftValArr.push($(this).val());
+				freegiftUsePointArr.push($(this).attr("usepoint"));
+			}
+			
+			// 라디오버튼 선택 사은품 체크
+			if ($(this).is(":checked")) {
+				// 수령거부가 아닐때 체크
+				if ($(this).val() != "noSel") {
+					freegiftValArr.push($(this).val());
+					freegiftUsePointArr.push($(this).attr("usepoint"));
+				}
+			}
+		});
+	});
+	
+	$(".freegiftValArr").text(freegiftValArr);				// 사은품시퀀스배열
+	$(".freegiftUsePointArr").text(freegiftUsePointArr);	// 사은품사용포인트배열
+};
+
+
+</script>
+
+<script th:inline="javascript">
+// 화면준비상태
+$(document).ready( function() {
+	// 배송지변경 팝업열기
+	$(document).on('click','#btn_adrsChange_pop',function(e){
+		$.ajax( {
+			type		: "POST",
+			url 		: '/order/delvAddrChangePop',
+			dataType 	: 'html',
+			success 	: function(result) {
+				if (result != null) {
+					$("#adrsChangePop").html(result);
+					$("#adrsChangePop").modal("show");
+				}
+			}
+		});
+		
+		return false;
+	});
+
+	// 배송지추가 팝업열기
+	$(document).on('click','#btn_addrAdd_pop',function(e){
+		$.ajax( {
+			type		: "POST",
+			url 		: '/order/delvAddrAddPop',
+			dataType 	: 'html',
+			success 	: function(result) {
+				if (result != null) {
+					$("#adrsAddPop").html(result);
+					$("#adrsAddPop").modal("show");
+				}
+			}
+		});
+		
+		return false;
+	});
+
+	// 배송지수정 팝업열기
+	$("#btn_addrModify_pop").on("click", function(e){
+		$.ajax( {
+			type		: "POST",
+			url 		: '/order/delvAddrModifyPop',
+			dataType 	: 'html',
+			success 	: function(result) {
+				if (result != null) {
+					$("#adrsModifyPop").html(result);
+					$("#adrsModifyPop").modal("show");
+				}
+			}
+		});
+		
+		return false;
+	});
+
+	// 배송요청사항 팝업열기
+	$("#btn_rqstModify_pop").on("click", function(e){
+		var jsonObj = new Object();
+		jsonObj.delvMemo = $("input[name='delvMemo']").val();
+		
+		$.ajax({
+			type		: "POST",
+			url 		: "/order/delvMemoChangePop",
+			data		: jsonObj,
+			dataType 	: "html",
+			success 	: function(result) {
+				if (result != null) {
+					$("#rqstModifyPop").html(result);
+					$("#rqstModifyPop").modal("show");
+				}
+			}
+		});
+		
+		return false;
+	});
+	
+	// 해외배송 입력
+	$(document).on('change','.odPayment .area_overseas #rdi-overs1', function(e){
+		$('.info_box.overs2').hide();
+		$('.info_box.overs1').show();
+		return false;
+	}).on('change','.odPayment .area_overseas #rdi-overs2', function(e){
+		$('.info_box.overs1').hide();
+		$('.info_box.overs2').show();
+		return false;
+	});
+
+	// 사은품지급안내 팝업열기
+	$("#btn_infoGift_pop").on("click",function(e){
+		$.ajax({
+			type		: "POST",
+			url 		: "/order/freegiftInfoPop",
+			dataType 	: "html",
+			success 	: function(result) {
+				if (result != null) {
+					$("#infoGiftPop").html(result);
+					$("#infoGiftPop").modal("show");
+				}
+			}
+		});
+		
+		return false;
+	});
+
+	// 할인쿠폰 확인
+	$(document).on('click','.odPayment .area_seldiscount .btn_coupon_toggle',function(e){
+		$('.coupon_list').toggle();
+		$(this).toggleClass('on');
+		return false;
+	});
+
+	// 결제수단 선택
+	$(document).on('change','.odPayment .area_paymethod .paymethod_radio input',function(e){
+		$('.radio_blk').removeClass('on');
+		$(this).parents('.radio_blk').addClass('on');
+		$(this).parents('.radio_blk').find('.paymethod_box').show();
+		$(this).parents('.radio_blk').siblings('div').find('.paymethod_box').hide();
+	
+		var paymethodlabel =  $(this).prop('labels');
+		$(this).parents('li').find('.fold_head .data span').text($(paymethodlabel).text());
+	
+		// 간편결제 카드추가 슬라이드
+		var swiper = new Swiper('.paymethod_box .card_quickpay .list_card', {
+			slidesPerView: 'auto',
+			spaceBetween: 160,
+			centeredSlides: true,
+			navigation: {
+				nextEl: '.list_card .swiper-button-next',
+				prevEl: '.list_card .swiper-button-prev',
+			},
+		});
+		return false;
+	});
+
+	// STYLE24 간편결제 배너닫기
+	$(document).on('click','.odPayment .area_paymethod .quickpay_bnr .btn_close_bnr',function(e){
+		$('.quickpay_bnr').hide();
+	});
+
+	// 결제수단 선택 > 즐겨찾기 추가시 
+	$(document).on('click','.odPayment .area_paymethod .paymethod_box .card .etc .btn_favorcard',function(e){
+		$(this).toggleClass('active');
+		return false;
+	});
+
+	// 결제수단 > 일반결제> 실시간계좌이체 선택시            
+	$(document).on('change','.odPayment input:radio[name=rdi-paynormal]',function(e){
+		var paynormalValue = $(this).attr('id');
+		
+		if (paynormalValue == 'rdi-paynormal2') {
+			$('.area_paymethod .agree_insurance').show();
+		} else {
+			$('.area_paymethod .agree_insurance').hide();
+		}
+		return false;
+	});
+
+	// 개인정보동의 열고닫기
+	$(document).on('click','.area_paymentinfo .payinfo_blk a',function(e){		
+		e.preventDefault();
+		$(this).parents('.payinfo_blk').toggleClass('on');
+		var privacyToggle = $(this).find('span');
+		$(privacyToggle).text($(privacyToggle).text() == '보기' ? '닫기' : '보기');
+		return false;
+	});
+
+	// 간편결제등록 > STEP1.이용약관 팝업열기
+	$(document).on('click','.btn_addcard',function(e){
+		$("#qPayAgree_pop").modal("show");
+		return false;
+	});
+
+	// 간편결제등록 > STEP1.이용약관 체크
+	$(document).on('click','.area_QpayCk .agr_select button',function(e){
+		$(this).parents('.area_QpayCk').find('.info_agrQpay').toggle();
+		var payagrToggle = $(this).find('span');
+		$(payagrToggle).text($(payagrToggle).text() == '약관열기' ? '약관닫기' : '약관열기');
+		return false;
+	});
+
+	// 간편결제등록 > STEP1.이용약관 체크박스 전체선택
+	$(document).on('click','#chk-Qpay-agrAll',function(e){
+		$(this).parents(".qPayAgree_pop").find('.agree_Qpay input').prop("checked", $(this).is(":checked"));
+	});
+
+	// 간편결제등록 > STEP1.이용약관 체크박스 개별선택
+	$(document).on("click", ".agree_Qpay input",function(e){
+		var is_checked = true;
+		$(".agree_Qpay input").each(function(){
+			is_checked = is_checked && $(this).is(":checked");
+		});
+		$("#chk-Qpay-agrAll").prop("checked", is_checked);
+	});
+
+	// 간편결제등록 > 본인인증 팝업열기
+	$(document).on('click','#btn_qPayidConfirm_pop',function(e){
+		$("#qPayidConfirm_pop").modal("show");
+		return false;
+	});
+});
+</script>
+
+</th:block>
+</body>
+</html>

+ 53 - 281
src/main/webapp/WEB-INF/views/web/order/OrderFormWeb.html

@@ -26,286 +26,9 @@
 <!-- payment.js -->
 <script type="text/javascript" th:src="${@environment.getProperty('pg.kcp.js.url')}" src=""></script>
 <script type="text/javascript" src="/ux/pc/js/payment.js"></script>
-	<script type="text/javascript">
-		$(document).on("click", "#buyBtn", function() {
-			$.ajax({
-				type: "POST",
-				url : '/order/create/preOrder',
-				dataType : 'html',
-				data : {
-					  pgGb		: "KCP"
-					, payMeans	: "G014_30"
-					, ordNo		: "5"
-					, goodsNm	: "상품 테스트"
-					, payAmt	: "1233"
-					, ordNm		: "이태영"
-					, ordEmail	: "xodud1202@naver.com"
-					, ordTelno	: "02-0000-0000"
-					, ordPhnno	: "010-7111-0000"
-				},
-				error : function(e) {
-					alert(3);
-				},
-				success : function(result) {
-					$("#order_info").html(result);
-					jsf__pay(document.order_info);
-				}
-			});
-		});
-	</script>
-	
-	
-
-	<form id="order_info" name="order_info" method="post" action="/order/pay/result/response" ></form>
-	
-	<div style="margin:20px;">
-		<input type="button" id="buyBtn" value="KCP테스트버튼" style="width:200px; height:70px; background-color: #fd4801; color: white; border: unset;"/>
-		<input type="button" id="kakaoBtn" value="카카오테스트버튼" style="width:200px; height:70px; background-color: #fffa00; color: black; border: unset;"/>
-		<input type="button" id="naverBtn" value="네이버테스트버튼" style="width:200px; height:70px; background-color: lawngreen; color: black; border: unset;"/>
-	</div>
-<!-- // xodud1202 -->
-
-
-<!-- card007 -->
-	<script th:inline="javascript">
-		$(document).on("click", "#kakaoBtn", function() {
-			$.ajax({
-				type: "POST",
-				url : '/order/create/preOrder',
-				dataType : 'html',
-				data : {
-					pgGb			: "KAKAO"
-					, custNo		: [[${sessionInfo.custNo}]]
-					, ordNo			: 1000
-					, goodsNm		: "상품 테스트"
-					, payAmt		: 30000
-					, ordGoodsQty	: [[${goodsTotCnt}]]
-				},
-				error : function(e) {
-					console.log(e.responseText);
-				},
-				success : function(result) {
-					$("#order_info").html(result);
-					fnKakaoPaymentReady();
-				}
-			});
-			//let url = '/order/create/preOrder';
-			//let data = {};
-			//data.pgGb = 'KAKAO';
-			//data.ordNo = 1000;
-			//data.custNo = [[${sessionInfo.custNo}]];
-			//data.goodsNm = '상품 테스트';
-			//data.ordGoodsQty = [[${goodsTotCnt}]];
-			//data.payAmt = 30000;
-			//
-			//let jsonData = JSON.stringify(data);
-			//
-			//gagajf.ajaxJsonSubmit(url, jsonData, function(result) {
-			//	$("#order_info").html(result);
-			//	console.log(result);
-			//	fnKakaoPaymentReady();
-			//});
-		});
-
-		// 카카오페이 결제준비 처리
-		var fnKakaoPaymentReady = function() {
-			let nextRedirectUrl = $('#order_info input[name=nextRedirectPcUrl]').val();
-			let option = 'width=420, height=520';
-
-			window.open(nextRedirectUrl, 'kakaoPaymentPopup', option);
-		}
-
-		// 카카오페이 결제 승인 요청
-		var fnKakaoPaymentRequest = function(pgToken) {
-			$('#order_info input[name=pgToken]').val(pgToken);
-
-			// TODO
-			// formSubmit
-
-			// 테스트용 호출
-			let url = '/order/kakao/payment/approve';
-			let data = {};
-			data.pgTid = $('#order_info input[name=pgTid]').val();
-			data.partnerOrderId = $('#order_info input[name=partnerOrderId]').val();
-			data.partnerUserId = $('#order_info input[name=partnerUserId]').val();
-			data.pgToken = $('#order_info input[name=pgToken]').val();
-
-			let jsonData = JSON.stringify(data);
-
-			gagajf.ajaxJsonSubmit(url, jsonData, function(result) {
-				console.log('====== kakaoPaymentRequest ======');
-				console.log(result.payment);
-				console.log(' ');
-				fnKakaoPaymentOrder();
-			});
-
-			return true;
-		}
-
-		// 카카오페이 결제 정보 조회 (테스트용 호출)
-		var fnKakaoPaymentOrder = function() {
-			let url = '/order/kakao/payment/order';
-			let data = {};
-			data.pgTid = $('#order_info input[name=pgTid]').val();
-
-			let jsonData = JSON.stringify(data);
-
-			gagajf.ajaxJsonSubmit(url, jsonData, function(result) {
-				console.log('====== kakaoPaymentOrder ======');
-				console.log(result.kakaoPay);
-				console.log(' ');
-				fnCancelKakaoPayment();
-			});
-
-			return true;
-		}
-
-		// 카카오페이 결제 취소 (테스트용 호출)
-		var fnCancelKakaoPayment = function() {
-			let url = '/order/kakao/payment/cancel';
-			let data = {};
-			data.pgTid = $('#order_info input[name=pgTid]').val();
-			data.payAmt = 1000;
-
-			let jsonData = JSON.stringify(data);
-
-			gagajf.ajaxJsonSubmit(url, jsonData, function(result) {
-				console.log('====== kakaoPaymentCancel ======');
-				console.log(result.kakaoPay);
-				console.log(' ');
-
-			});
-		}
-
-	</script>
-
-	<!-- =========== 네이버페이 ============= -->
-	<script th:inline="javascript">
-		$(document).on("click", "#naverBtn", function() {
-			$.ajax({
-				type: "POST",
-				url : '/order/create/preOrder',
-				dataType : 'html',
-				data : {
-					pgGb			: "NAVER"
-					, custNo		: [[${sessionInfo.custNo}]]
-					, ordNo			: 1000
-					, goodsNm		: "상품 테스트"
-					, payAmt		: 1000
-					, ordGoodsQty	: [[${goodsTotCnt}]]
-				},
-				error : function(e) {
-					mcxDialog.alert(e.responseText);
-				},
-				success : function(result) {
-					$("#order_info").html(result);
-					fnNaverPaymentReady();
-				}
-			});
-			//let url = '/order/create/preOrder';
-			//let data = {};
-			//data.pgGb = 'NAVER';
-			//data.ordNo = 1000;
-			//data.custNo = [[${sessionInfo.custNo}]];
-			//data.goodsNm = "상품 테스트";
-			//data.ordGoodsQty = [[${goodsTotCnt}]];
-			//data.payAmt = 30000;
-			//
-			//let jsonData = JSON.stringify(data);
-			//
-			//gagajf.ajaxJsonSubmit(url, jsonData, function(result) {
-			//	$("#order_info").html(result);
-			//	fnNaverPaymentReady();
-			//});
-		});
-		
-		// 네이버페이 결제준비 처리
-		var fnNaverPaymentReady = function() {
-			let naverPayUrl = 'https://' + [[${@environment.getProperty('naverPay.payUrl.web')}]];
-			let reserveId = $('#order_info input[name=reserveId]').val();
-			let url = naverPayUrl + '/payments/' + reserveId;
-			console.log(url);
-			let option = 'width=750, height=' + $(window).height();
-			
-			window.open(url, 'naverPaymentPopup', option);
-		}
-
-		// 네이버페이 결제 승인 요청
-		var fnNaverPaymentRequest = function(paymentId) {
-			$('#order_info input[name=pgTid]').val(paymentId);
-			
-			// TODO
-			// formSubmit
-			
-			// 테스트용 호출
-			let url = '/order/naver/payment/approve';
-			let data = {};
-			data.pgTid = $('#order_info input[name=pgTid]').val();
-			data.paySq = 1234;
-			data.custNo = [[${sessionInfo.custNo}]];
-			data.updNo = [[${sessionInfo.custNo}]];
-
-			let jsonData = JSON.stringify(data);
-
-			gagajf.ajaxJsonSubmit(url, jsonData, function(result) {
-				console.log('====== naverPaymentRequest ======');
-				console.log(result.payment);
-				console.log(' ');
-				fnNaverPaymentOrder();
-			});
-
-			return true;
-		}
-		
-		// 네이버페이 결제 정보 조회 (테스트용 호출)
-		var fnNaverPaymentOrder = function() {
-			let url = '/order/naver/payment/order';
-			let data = {};
-			data.pgTid = $('#order_info input[name=pgTid]').val();
-			
-			let jsonData = JSON.stringify(data);
-			
-			gagajf.ajaxJsonSubmit(url, jsonData, function(result) {
-				console.log('====== naverPaymentOrder ======');
-				console.log(result.naverPay);
-				console.log(' ');
-				fnCancelNaverPayment();
-			});
-			
-			return true;
-		}
-
-		// 네이버페이 결제 취소 (테스트용 호출)
-		var fnCancelNaverPayment = function() {
-			let url = '/order/naver/payment/cancel';
-			let data = {};
-			data.pgTid = $('#order_info input[name=pgTid]').val();
-			data.cancelRequester = '1';
-			data.chgReasonNm = '고객변심';
-			data.payAmt = 1000;
-			data.paySq = 1234;
-			data.custNo = [[${sessionInfo.custNo}]];
-			data.updNo = [[${sessionInfo.custNo}]];
-
-			let jsonData = JSON.stringify(data);
-
-			gagajf.ajaxJsonSubmit(url, jsonData, function(result) {
-				console.log('====== naverPaymentCancel ======');
-				console.log(result.naverPay);
-				console.log(' ');
-			});
-		}
-
-	</script>
-<!-- // card007 -->
-
-
-
-
-
-
 
 
+<form id="order_info" name="order_info" method="post" action="/order/pay/result/response" ></form>
 
 <!--  container -->
 <form id="payForm" name="payForm">
@@ -343,10 +66,14 @@
 		<tr style="height:30px;">
 			<th>freegiftValArr</th>
 			<th>freegiftUsePointArr</th>
+			<th>freegiftSqArr</th>
+			<th>freegiftGoodsArr</th>
 		</tr>
 		<tr style="height:30px;">
 			<td class="freegiftValArr"></td>
 			<td class="freegiftUsePointArr"></td>
+			<td class="freegiftSqArr"></td>
+			<td class="freegiftGoodsArr"></td>
 		</tr>
 	</table>
 
@@ -721,7 +448,7 @@ $(document).ready( function() {
 	custemerInfoSet(jsonData);
 	
 	// 999. 개발화면정보설정
-	var devTemp = false;
+	var devTemp = true;
 	var arr = []
 	arr[0] = "orderInfo";
 	arr[1] = "freegiftInfo";
@@ -940,7 +667,7 @@ var freegiftInfoSet = function(jsonData) {
 						if ($(this).attr("allYn") == "Y" ) {
 							total_gift += 1;
 						}
-						$(".total_gift").text(total_gift);							// 사은품총선택개수
+						$(".total_gift").text(total_gift);						// 사은품총선택개수
 					});
 				});
 			}
@@ -1049,6 +776,9 @@ var paymentInfoSet = function(jsonData) {
 						,"ordPhnno"				: $(".cellPhnno").text()
 						,"goodsNm"				: $(".goodsNm").eq(0).text()
 						,"ordGoodsQty"			: ordGoodsQty
+						,"freegiftValArr"		: $(".freegiftValArr").text().split(",")
+						,"freegiftSqArr"		: $(".freegiftSqArr").text().split(",")
+						,"freegiftGoodsArr"		: $(".freegiftGoodsArr").text().split(",")
 					};
 					
 					var orderData = JSON.stringify(orderData);
@@ -1068,6 +798,8 @@ var paymentInfoSet = function(jsonData) {
 							// 결재정보로드
 							$("#order_info").html(result);
 							jsf__pay(document.order_info);
+							//fnKakaoPaymentReady();
+							//fnNaverPaymentReady();
 						}
 					});
 				});
@@ -1780,7 +1512,7 @@ var custCpnSumAmtCal = function() {
 	$(".realOrdSumAmt").text(realOrdSumAmt);
 	$(".savePntSumAmt").text(savePntSumAmt);
 	
-	$("#realOrdAmt").text(realOrdSumAmt.addComma() + "원"); // 총 결제 예정 금액
+	$("#realOrdAmt").text(realOrdSumAmt.addComma()); // 총 결제 예정 금액
 	
 	var tempSavePnt			= savePntSumAmt - prePntDcAmt;
 	
@@ -2024,6 +1756,46 @@ $(document).ready( function() {
 		$("#qPayidConfirm_pop").modal("show");
 		return false;
 	});
+
+	// 카카오페이 결제준비 처리
+	var fnKakaoPaymentReady = function() {
+		let nextRedirectUrl = $('#order_info input[name=nextRedirectPcUrl]').val();
+		let option = 'width=420, height=520';
+		
+		window.open(nextRedirectUrl, 'kakaoPaymentPopup', option);
+	}
+
+	// 카카오페이 결제 승인 요청
+	var fnKakaoPaymentRequest = function(pgToken) {
+		// Token 값 설정
+		$('#order_info input[name=pgToken]').val(pgToken);
+		
+		// Form Submit
+		document.order_info.submit();
+		
+		return true;
+	}
+	
+	// 네이버페이 결제준비 처리
+	var fnNaverPaymentReady = function() {
+		let naverPayUrl = 'https://' + [[${@environment.getProperty('naverPay.payUrl.web')}]];
+		let reserveId = $('#order_info input[name=reserveId]').val();
+		let url = naverPayUrl + '/payments/' + reserveId;
+		let option = 'width=750, height=' + $(window).height();
+		
+		window.open(url, 'naverPaymentPopup', option);
+	}
+	
+	// 네이버페이 결제 승인 요청
+	var fnNaverPaymentRequest = function(paymentId) {
+		// TID 설정
+		$('#order_info input[name=pgTid]').val(paymentId);
+
+		// Form Submit
+		document.order_info.submit();
+
+		return true;
+	}
 });
 </script>
 

+ 18 - 2
src/main/webapp/WEB-INF/views/web/order/OrderFreegiftInfoWeb.html

@@ -103,8 +103,9 @@
 
 <script th:inline="javascript">
 //할인관련정보 변수선언
-var freegiftList		= [[${freegiftList}]];			// 사은품 프로모션 목록
-var freegiftGoodsList	= [[${freegiftGoodsList}]];		// 사은품 프로모션 상품 목록
+var freegiftApplyAmtList	= [[${freegiftApplyAmtList}]];		// 사은품장바구니목록
+var freegiftList			= [[${freegiftList}]];				// 사은품 프로모션 목록
+var freegiftGoodsList		= [[${freegiftGoodsList}]];			// 사은품 프로모션 상품 목록
 
 //컨텐츠 호출
 $(document).ready( function() {
@@ -114,6 +115,21 @@ $(document).ready( function() {
 	} else {
 		$("#freegiftInfo").css("display", "block");
 	}
+	
+	// 사은품시퀀스배열, 
+	var freegiftSqArr 		= [];
+	var freegiftGoodsArr 	= [];
+	
+	// 사은품 장바구니 상품 뿌리기
+	for (i=0 ; i<freegiftApplyAmtList.length ; i++) {
+		var obj = freegiftApplyAmtList[i];
+		freegiftSqArr.push(obj.freegiftSq);
+		freegiftGoodsArr.push(obj.goodsCd);
+	}
+	
+	$(".freegiftSqArr").text(freegiftSqArr);
+	$(".freegiftGoodsArr").text(freegiftGoodsArr);
+	
 });
 </script>
 </th:block>

+ 31 - 0
src/main/webapp/WEB-INF/views/web/order/test.html

@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<html lang="ko" xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : OrderFormWeb.html
+ * @desc    : 주문/결제 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.02.01   jsh77b     최초 작성
+ *******************************************************************************
+ -->
+<body>
+<form action="https://dev-tracking-api.sweettracker.net/add_invoice" method="post">
+<input name="num" value="1234567890">
+<input name="code" value="04">
+<input name="fid" value="100000123">
+<input name="callback_url" value="http://www.naver.com">
+<input name="tier" value="istyle24">
+<input name="key" value="0C48PI6KnOVVKGHWXyggMA">
+<input name="type" value="json">
+<button>Send</button>
+</form>
+
+<script>
+</script>
+</body>
+</html>

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

@@ -0,0 +1,119 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org"
+	xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
+	layout:decorator="web/common/layout/DefaultLayoutWeb">
+<!--
+ *******************************************************************************
+ * @source  : SocialMainFormWeb.html
+ * @desc    : 소셜메인(핫딜메인) Page
+ *============================================================================
+ * Pastelmall
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.3.11     sowon     최초 작성
+ *******************************************************************************
+ -->
+<body>
+<th:block layout:fragment="content">
+	<!--  container -->
+	<div id="container" class="container dp">
+		<div class="breadcrumb"> 
+			<ul>
+				<li class="bread_home"><a href="javascript:void(0);" onclick="cfnGoToPage(_PAGE_MAIN);">홈</a></li>
+				<li class="bread_2depth">핫딜</li>
+			</ul> 
+		</div>
+		<div class="wrap">
+			<div class="content dp_hotdeal"> <!-- 페이지특정 클래스 = dp_hotdeal -->
+				<div class="cont_head">
+					<div>
+                        <h3>[[${socialInfo.socialNm}]]</h3>
+                    </div>
+				</div>
+				<div class="cont_body">
+                    <div class="hotdeal">
+                        <div id="countdown">
+                            <span id="h-hours"></span>
+                            <span id="h-minutes"></span>
+                            <span id="h-seconds"></span>
+                        </div>
+                    </div>  
+                    <div class="list_content">
+                        <div class="itemsGrp rowtype"> <!-- itemsGrp rank hot deal --> <!-- rowtype 추가시 가로형태로 출력 -->
+                        <th:block th:each="SocialData, SocialStat : ${socialGoods}">
+                            <div th:class="${SocialData.stockQtySum == 0 ? 'item_prod sold_out' : 'item_prod'}" > 
+                                <div class="item_state"> <!-- item_state AD soldout -->
+                                    <a href="#none" class="itemLink">
+                                        <div class="itemPic">
+                                            <div class="shape ranker"><span>특가</span></div>
+                                            <img alt="BLUE-a" class=" vLHTC pd_img" th:src="${@environment.getProperty('upload.goods.view') + '/' + SocialData.sysImgNm}">
+                                            <button type="button" class="itemLike active">관심상품 추가</button>
+                                        </div>
+                                        <p class="itemBrand" th:text="${SocialData.brandKnm}"></p>
+                                        <div class="itemName" th:text="${SocialData.goodsNm}" style="font-size: 18px;"></div>
+                                        <p class="itemPrice" >
+                                         [[${#numbers.formatInteger(SocialData.currAprice,0,'COMMA')} + 원]]
+                                            <!-- [[${SocialData.currAprice}]]원 -->
+                                            <span class="itemPrice_original" th:text="${#numbers.formatInteger(SocialData.listPrice,0,'COMMA')} + '원'"></span>
+											<span class=" itemPercent" th:text="${#numbers.formatDecimal(SocialData.dcArate,1,0)} + '%'"></span>
+                                        </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" th:text="${SocialData.goodsTnm}"></div>
+                                    </a>
+                                </div>
+                            </div>
+                              </th:block>
+                        </div>
+                    </div>
+                </div>
+		    </div>
+        </div>
+    </div>   
+
+<script th:inline="javascript">
+var socialInfo = [[${socialInfo}]];
+
+$(function(){
+       /* 핫딜 countDown */
+       function hotdealTimer() {
+           var endTime = new Date(socialInfo.socialEddt); // 남은시간 지정
+
+               endTime = (Date.parse(endTime) / 1000);
+
+               var now = new Date();
+               now = (Date.parse(now) / 1000);
+
+               var timeLeft = endTime - now;
+
+               var days = Math.floor(timeLeft / 86400); 
+               var hours = Math.floor((timeLeft - (days * 86400)) / 3600);
+               var minutes = Math.floor((timeLeft - (days * 86400) - (hours * 3600 )) / 60);
+               var seconds = Math.floor((timeLeft - (days * 86400) - (hours * 3600) - (minutes * 60)));
+
+               if (hours < '10') { hours = '0' + hours; }
+               if (minutes < '10') { minutes = '0' + minutes; }
+               if (seconds < '10') { seconds = '0' + seconds; }
+
+               //$('#d-days').html(days);
+               $('#h-hours').html(hours);
+               $('#h-minutes').html(minutes);
+               $('#h-seconds').html(seconds);		
+       }
+       setInterval(function() { hotdealTimer(); }, 1000);
+       /* countDown */
+});
+</script>
+</th:block>
+
+</body>
+</html>

BIN
src/main/webapp/images/pc/thumb/hotdeal_bg.png


+ 302 - 93
src/main/webapp/ux/pc/css/layout.css

@@ -647,7 +647,7 @@ ul.maintabs li [class^='box_depth'] {display:none; position:absolute; left:100%;
 .tbl.type2 table td {position:relative; padding:20px 0; border-bottom:1px solid #ddd; font-weight:200; font-size:16px; letter-spacing:-0.025em; text-align:center;}
 .tbl.type2 table th {font-weight:300;}
 
-/* 테이블 type3 - 결제정보 */
+/* 테이블 type3 - 결제정보 (구 버전) */
 .tbl.type3 {padding:0; border:1px solid #000;} 
 .tbl.type3 table {word-break:keep-all;}
 .tbl.type3 table th,
@@ -662,6 +662,15 @@ ul.maintabs li [class^='box_depth'] {display:none; position:absolute; left:100%;
 .tbl.type4 table th {background:#f5f5f5; color:#222; font-weight:300;}
 .tbl.type4 table td {position:relative; font-weight:200;}
 
+/* 테이블 type5 - 수직형 행,열별, th구분선 있음 */
+.tbl.type5 {padding:0; border-top:1px solid #000;} 
+.tbl.type5 table {word-break:keep-all;}
+.tbl.type5 table th,
+.tbl.type5 table td {position:relative; padding:20px 0; font-size:16px; letter-spacing:-0.025em; text-align:center;}
+.tbl.type5 table td {border-bottom:1px solid #ddd; font-weight:200;}
+.tbl.type5 table th {border-bottom:1px solid #000; font-weight:300;}
+
+
 /* 안내 */
 .com_info_txt {padding:40px; border:1px solid #ddd; line-height:1.2;}
 .com_info_txt .tit {position: relative; font-size: 16px; color: #666; padding-left: 30px; margin-bottom: 30px; font-weight:300;}
@@ -739,6 +748,111 @@ ul.maintabs li [class^='box_depth'] {display:none; position:absolute; left:100%;
 .part_deliver table .info_item.unable .info_unable {display:block; padding:20px 0 0 0; color:#fd4802; font-size:14px;}
 .part_deliver table .info_item.unable .info_calc .btn {opacity:1; background-color:#aaa; color:#fff; border-color:#aaa;}
 
+/* 주문내역 테이블 리스트 _ new */
+.part_goods {display:block; position:relative; border:1px solid #ddd;}
+.part_goods::after,
+.part_goods div::after {content:''; display:block; clear:both;}
+.part_goods .goods_head {padding:20px 40px; background:#f5f5f5}
+.part_goods .goods_head p {float:left; color:#888; font-size:18px; font-weight:300;}
+.part_goods .goods_head p span {margin-left:15px; color:#222; font-weight:500;}
+.part_goods .goods_head a.btn_detail_view {float:right; height:16px; padding-right:16px; color:#888; font-size:16px; font-weight:300; background:url('/images/pc/ico_more_sm.png') no-repeat 100% 2px;}
+.part_goods .goods_cont {padding:40px;}
+.part_goods .goods_cont .goods_info {margin-top:40px; padding-top:40px; border-top:1px dashed #ddd}
+.part_goods .goods_cont .goods_info:first-child {margin-top:0; padding-top:0; border-top:none}
+.part_goods .goods_cont .goods_info .oder_desc .goods_box {vertical-align:top;}
+.part_goods .goods_cont .goods_info .oder_desc .goods_box .gd_item .thumb {position:absolute; top:0; transform:translateY(0);}
+.part_goods .goods_foot {}
+.part_goods .goods_foot .oder_gift {display:block; position:relative; padding:30px 40px 30px 170px; border-top:1px solid #ddd}
+.goods_foot .oder_gift .title {display:inline-block; position:absolute; left:57px; top:50%; transform:translateY(-50%); padding-left:25px; background:url(/images/pc/ico_giftbox.png) no-repeat 0 0; font-size:16px; font-weight:300; line-height:20px;}
+.goods_foot .oder_gift ul li {margin-top:10px; padding-left: 15px; background:url(/images/pc/ico_bracket.png) no-repeat 0 2px; color:#222; font-size:16px; font-weight:200;}
+.goods_foot .oder_gift ul li span {color:#fd4802}
+.goods_foot .order_delivery {padding:25px 40px; background:#f5f5f5; text-align:center; font-size:16px; font-weight:300;}
+.goods_foot .order_delivery .dlvr_fee {}
+.goods_foot .order_delivery .dlvr_shop {}
+.goods_foot .order_delivery a.btn_popup_save {float:right; display:inline-block; padding-right:20px; color:#fd4802; font-size:12px; font-weight:200; line-height:14px; text-decoration:underline; background:url('/images/pc/ico_go_save.png') no-repeat 100% 50%;}
+
+.goods_info {display:block; position:relative; width:100%;}
+.goods_info .tag {display:inline-block; height:22px; padding:5px 8px; background:#fff; border:1px solid #ddd; color:#666; font-size:11px; font-weight:300; text-align:center;}
+.goods_info .tag.primary {background:#fd4802; border-color:#fd4802; color:#fff;}
+.goods_info .tag.primary_line {background:#fff3f2; border-color:#fd4802; color:#fd4802;}
+.goods_info .price_org {position:relative; color:#888; font-weight:200;}
+.goods_info .price_org:after{content: ''; display:inline-block; width:100%; height:1px; background:rgb(204, 204, 204); position:absolute; top:50%; left:0; bottom:auto; right:auto; transform:translateY(-50%);}
+.goods_info .price_sale {color:#222; font-weight:500;}
+.goods_info .point {padding-left:22px; color:#888; font-weight:200; background:url('/images/pc/ico_point.png') no-repeat 0 50%;}
+.goods_info .point strong {font-weight:300;}
+.goods_info .oder_desc {display:table; width:100%; height:150px;}
+.goods_info .oder_desc [class*="_box"] {display:table-cell; vertical-align:middle;}
+.goods_info .oder_desc .form_box {width:40px; padding-right:20px;}
+.goods_info .oder_desc .goods_box {padding-left:130px;}
+.goods_info .oder_desc .goods_box [class^="gd_"] {max-width:550px;}
+.goods_info .oder_desc .goods_box .gd_date {}
+.goods_info .oder_desc .goods_box .gd_item {position:relative;}
+.goods_info .oder_desc .goods_box .gd_item a {display:block;}
+.goods_info .oder_desc .goods_box .gd_item p::after {content:''; display:block; clear:both;}
+.goods_info .oder_desc .goods_box .gd_item .thumb {position:absolute; left:-130px; top:50%; transform:translateY(-50%); width:100px; height:150px; background:#f5f5f5;}
+.goods_info .oder_desc .goods_box .gd_item .thumb img {position:relative; width:100%; top:50%; transform:translateY(-50%);}
+.goods_info .oder_desc .goods_box .gd_item .buy_date {display:block; margin-bottom:16px; color:#222; font-size:16px; font-weight:300;}
+.goods_info .oder_desc .goods_box .gd_item .name {float:none; display:block; display:-webkit-box; width:100%; height:auto; max-height:40px; margin-top:15px; color:#222; font-size:16px; font-weight:300; line-height:20px; overflow:hidden; text-overflow:ellipsis; -webkit-line-clamp:2; -webkit-box-orient:vertical;}
+.goods_info .oder_desc .goods_box .gd_item .brand {float:left; display:inline-block; margin-right:10px; color:#888; font-size:14px; font-weight:200;}
+.goods_info .oder_desc .goods_box .gd_item .tag {float:left; margin-right:6px; margin-top:-5px;}
+.goods_info .oder_desc .goods_box .gd_opt {margin-top:15px;}
+.goods_info .oder_desc .goods_box .gd_opt .option_wrap {margin-top:15px}
+.goods_info .oder_desc .goods_box .gd_opt .option_wrap:first-child {margin-top:0;}
+.goods_info .oder_desc .goods_box .gd_opt .option_wrap .title {margin-bottom:10px; color:#fd4802; font-size:14px; font-weight:300;}
+.goods_info .oder_desc .goods_box .gd_opt .option_wrap .option {display:block; display:-webkit-box; width:100%; height:auto; max-height:40px; overflow:hidden; margin-top:5px; color:#666; font-size:14px; font-weight:200; line-height:20px; text-overflow:ellipsis; -webkit-line-clamp:2; -webkit-box-orient:vertical;}
+.goods_info .oder_desc .goods_box .gd_calc {margin-top:15px}
+.goods_info .oder_desc .goods_box .gd_calc p {float:left; position:relative; padding:0px 12px}
+.goods_info .oder_desc .goods_box .gd_calc p::before {content:''; position:absolute; left:0; top:50%; transform:translateY(-50%); width:1px; height:13px; background:#ddd;}
+.goods_info .oder_desc .goods_box .gd_calc p:first-child {padding-left:0;}
+.goods_info .oder_desc .goods_box .gd_calc p:first-child::before {display:none;}
+.goods_info .oder_desc .goods_box .gd_calc p span {display:inline-block; font-size:15px;}
+.goods_info .oder_desc .goods_box .gd_calc p span em {font-size:16px;}
+.goods_info .oder_desc .goods_box .gd_calc p span.count {color:#666}
+.goods_info .oder_desc .goods_box .gd_calc p span.price_sale {margin-left:5px}
+.goods_info .oder_desc .goods_box .gd_exinfo,
+.goods_info .oder_desc .goods_box .gd_exinfo a {color:#fd4802; font-size:14px;}
+.goods_info .oder_desc .goods_box .gd_exinfo {margin-top:20px}
+.goods_info .oder_desc .goods_box .gd_exinfo p {margin-top:6px}
+.goods_info .oder_desc .goods_box .gd_exinfo p:first-child {margin-top:0;}
+.goods_info .oder_desc .goods_box .gd_exinfo .tag {margin-right:10px}
+.goods_info .oder_desc .status_box {width:130px; color:#222; font-size:18px; font-weight:300; text-align:center;}
+.goods_info .oder_desc .status_box p {margin-top:10px;}
+.goods_info .oder_desc .status_box p:first-child {margin-top:0}
+.goods_info .oder_desc .status_box .date, 
+.goods_info .oder_desc .status_box .time {display:block; margin-top:10px; color:#888; font-size:14px;}
+.goods_info .oder_desc .status_box .date {margin-top:12px;}
+.goods_info .oder_desc .calc_box {width:150px; text-align:center;}
+.goods_info .oder_desc .calc_box .price_org {display:inline-block; margin-bottom:10px; font-size:14px; font-weight:300;}
+.goods_info .oder_desc .calc_box .price_sale {display:inline-block; font-size:20px; font-weight:500;}
+.goods_info .oder_desc .calc_box .point {display:inline-block; margin-top:13px; font-size:14px; line-height:18px;}
+.goods_info .oder_desc .button_box {width:220px; padding-left:90px; text-align:center;}
+.goods_info .oder_desc .button_box p {margin-top:10px;}
+.goods_info .oder_desc .button_box p:first-child {margin-top:0}
+.goods_info .oder_desc .button_box .btn {display:block; width:100%; height:42px; font-size:14px;}
+.goods_info .oder_desc .button_box .util {margin-top:12px}
+.goods_info .oder_desc .button_box .util span {position:relative; display:inline-block; margin-left:24px;}
+.goods_info .oder_desc .button_box .util span::before {content:''; position:absolute; left:-13px; top:50%; transform:translateY(-50%); width:1px; height:10px; background-color:#ddd;}
+.goods_info .oder_desc .button_box .util span:first-child {margin-left:0;}
+.goods_info .oder_desc .button_box .util span:first-child::before {display:none;}
+.goods_info .oder_desc .button_box .count_modify {}
+.goods_info .oder_desc .button_box .count_modify .txt {display:block; margin-bottom:8px; color:#222; font-size:16px; font-weight:300;}
+.goods_info .oder_desc .button_box .count_modify .select_custom.select_count {margin-bottom:10px; font-size:14px; text-align:left;}
+.goods_info .oder_desc .button_box .count_modify .select_custom.select_count .combo .select {padding:14px 15px; color:#666; font-size:14px;}
+.goods_info .oder_desc .button_box .count_modify .select_custom.select_count .combo .list > li {padding:0 15px;}
+.goods_info .oder_text {display:block; width:100%; margin-top:20px; padding:20px 30px; background-color:#fff6f2;}
+.goods_info .oder_text p {margin-top:10px; padding-left:20px; color:#222; font-size:14px; font-weight:300; line-height:1; background:url('/images/pc/ico_primary_check.png') no-repeat 0 50%;}
+.goods_info .oder_text p:first-child {margin-top:0}
+
+.area_part {border-top:1px solid #ddd}
+.area_part .part_goods {border:none}
+.area_part .part_goods .goods_cont {padding:40px 0}
+.area_part .part_goods .goods_cont .oder_desc .button_box {width:260px; padding-right:40px;}
+.area_part .part_goods .goods_cont .oder_desc .goods_box .gd_item {position:static;}
+.area_part .part_goods .goods_cont .goods_info .oder_desc .goods_box {position:relative; vertical-align:middle;}
+.area_part .part_goods .goods_cont .goods_info .oder_desc .goods_box .gd_item .thumb {left:0}
+.area_part .part_goods .goods_foot {}
+
+
 /* 주문결제정보 */
 .order_amount {}
 .order_amount dl::after,
@@ -919,7 +1033,7 @@ ul.maintabs li [class^='box_depth'] {display:none; position:absolute; left:100%;
 	/* mb_login */
 
 	/* cs_공통 */
-	.cs {font-family:'LATO','Noto Sans CJK kr','Noto Sans kr',sans-serif; line-height:1.2; padding-bottom:150px;}
+	.cs {line-height:1.2; padding-bottom:150px;}
 	.cs .wrap .content {max-width:1460px;}
 	.cs .foldGroup {margin-top: 60px;}
 	.cs .history_wrap {width: 100%; height: 173px; padding: 50px; box-sizing: border-box;  background: #f5f5f5;}
@@ -2183,7 +2297,7 @@ ul.maintabs li [class^='box_depth'] {display:none; position:absolute; left:100%;
 	.odPayment .card_quickpay .list_card .card .name {margin-top:10px; height:20px; text-align:center; font-size:14px; line-height:20px; color:#c9dbff}
 	.odPayment .card_quickpay .list_card .card .number {margin-top:10px; text-align:center; font-size:24px; font-weight:300;}
 	.odPayment .card_quickpay .list_card .card .number span {padding:0px 5px; letter-spacing:2px;}
-	.odPayment .card_quickpay .list_card .card .select  {position:absolute; left:20px; right:20px; bottom:20px; width:auto; z-index:2;}
+	.odPayment .card_quickpay .list_card .card .select  {/* position:absolute; *//* left:20px; *//* right:20px; *//* bottom:20px; */width: 100%;z-index:2;}
 	.odPayment .card_quickpay .list_card .card .select .select_dress {padding:13px 20px; background:#3259a8; color:#fff; font-size:14px; border:none;}
 	.odPayment .card_quickpay .list_card .card .select .select_dress:after {top:15px; border-color:#fff transparent transparent transparent;}
 	.odPayment .card_quickpay .list_card .card .select .select_dress.active:after {top:9px; border-color:transparent transparent #fff transparent}
@@ -2357,22 +2471,29 @@ ul.maintabs li [class^='box_depth'] {display:none; position:absolute; left:100%;
 	.pd .swiper-pagination .swiper-pagination-bullet:first-child {margin-left:0;} 
 	.pd .swiper-button-prev::after,
 	.pd .swiper-button-next::after {content: ''; display:none;}
-	/*.pd .swiper-button-prev,
-	.pd .swiper-button-next {top:50%; transform:translateY(-50%); margin:0; display:inline-block; width:27.5px; height:50px; background:url(/images/pc/ico_arr_lg.png) no-repeat;}
-	.pd .swiper-button-prev {left:0; background-position:0 50%;}
-	.pd .swiper-button-next {right:0; background-position:100% 50%;}*/
 	.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 .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}
 	.pd .area_slider .swiper-container .item_prod {width:100%;}
 	.pd .area_slider .swiper-container .item_prod .item_state {padding:0}
 
 	/* pd  */
-	.pd {}
+	.star_score {position:relative; height:14px;}
+	.star_score .star {display:inline-block; position:relative; width:95px; height:14px; background:#f5f5f5;}
+	.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;}
+	.star_score .star .progbar {display:inline-block; height:14px; background:#fd4802}
+	.star_score .score {color:#222; font-size:16px; font-weight:200; line-height:1;}
+	.star_score .score em {font-weight:500;}
+
+	.pd {padding-top:70px}
 	.pd .item_picker {position:absolute; z-index:2; transform:translate(-50%,-50%);}
 	.pd .item_picker .pick_descr {display:none; position:absolute; background:#fff; z-index:2;}
+	.pd_pop .select_custom .combo .list > li:hover {background:none;}
+	.pd_detail .select_custom .combo .list > li:hover {background:none;}
 
 	/* pd_detail */
 	.pd_detail {}
@@ -2453,7 +2574,7 @@ ul.maintabs li [class^='box_depth'] {display:none; position:absolute; left:100%;
 	.pd_detail .area_desc .desc_wrap .descript_box .desc_info .price_blk::after {content:''; clear:both; display:block;}
 	.pd_detail .area_desc .desc_wrap .descript_box .desc_info .price_blk > span {float:left; }
 	.pd_detail .area_desc .desc_wrap .descript_box .desc_info .price_blk .sale_percent {display:block; width:100%; margin-bottom:20px; color:#fd4802; font-size:20px; font-weight:300;}
-	.pd_detail .area_desc .desc_wrap .descript_box .desc_info .price_blk .sale_price {color:#222; font-size:24px; font-weight:600;}
+	.pd_detail .area_desc .desc_wrap .descript_box .desc_info .price_blk .sale_price {color:#222; font-size:24px; font-weight:700;}
 	.pd_detail .area_desc .desc_wrap .descript_box .desc_info .price_blk .sale_price em {font-size:30px; font-weight:700;}
 	.pd_detail .area_desc .desc_wrap .descript_box .desc_info .price_blk del.org_price {position:relative; display:inline-block; margin-left:18px; margin-top:6px; color:#888; font-size:18px; font-weight:200; text-decoration:none;}
 	.pd_detail .area_desc .desc_wrap .descript_box .desc_info .price_blk del.org_price::after {content:''; position:absolute; left:0; right:0; top:50%; width:100%; height:1px; background:#888; z-index:2;}
@@ -2489,23 +2610,37 @@ ul.maintabs li [class^='box_depth'] {display:none; position:absolute; left:100%;
 	.pd_detail .area_desc .desc_wrap .option_box .opt_select {}
 	.pd_detail .area_desc .desc_wrap .option_box .opt_select .form_field {margin-top:10px;}
 	.pd_detail .area_desc .desc_wrap .option_box .opt_select .select_custom {height:52px;}
-	.pd_detail .area_desc .desc_wrap .option_box .opt_select .select_custom .select {height:52px; padding:18px 40px 18px 18px;}
-	.pd_detail .area_desc .desc_wrap .option_box .opt_select .select_custom .select:after {top:22px; right:20px}
+	.pd_detail .area_desc .desc_wrap .option_box .opt_select .select_custom .select {height:52px; padding:19px 40px 19px 18px; border-bottom-color:#ddd;}
+	.pd_detail .area_desc .desc_wrap .option_box .opt_select .select_custom .select:after {top:50%; right:20px; transform:translateY(-50%); margin-top:5px;}
+	.pd_detail .area_desc .desc_wrap .option_box .opt_select .select_custom.on .select:after {margin-top:-2px}
 	.pd_detail .area_desc .desc_wrap .option_box .opt_select .select_custom[aria-disabled="true"] .select {color:#bbb; background:#f5f5f5;}
-	.pd_detail .area_desc .desc_wrap .option_box .opt_select .select_custom .combo .list {top:50px; padding:0}
-	.pd_detail .area_desc .desc_wrap .option_box .opt_select .select_custom .combo .list > li {padding:18px 18px; line-height:1;}
+	.pd_detail .area_desc .desc_wrap .option_box .opt_select .select_custom .combo .list {top:52px; padding:0}
+	.pd_detail .area_desc .desc_wrap .option_box .opt_select .select_custom .combo .list > li {padding:18px 18px; line-height:1; color:#666}
+	.pd_detail .area_desc .desc_wrap .option_box .opt_select .select_custom .combo .list > li[aria-disabled="true"] {color:#bbb;}
 	.pd_detail .area_desc .desc_wrap .option_box .opt_select .select_custom .combo .list > li > div {margin-top:5px}
 	.pd_detail .area_desc .desc_wrap .option_box .opt_select .select_custom .combo .list > li > div:first-child {margin-top:0;}
+	.pd_detail .area_desc .desc_wrap .option_box .opt_select .select_custom .combo .list > li .opt_name {}
+	.pd_detail .area_desc .desc_wrap .option_box .opt_select .select_custom .combo .list > li .opt_price {font-size:14px;}
 	.pd_detail .area_desc .desc_wrap .option_box .opt_select .select_custom .combo .list > li[data-soldout="true"]::after {right:18px; top:50%; bottom:auto; transform:translateY(-50%);}
 
 	/**/
 	.pd_detail .area_desc .desc_wrap .option_box .opt_select .select_custom.deal_opt_item,
-	.pd_detail .area_desc .desc_wrap .option_box .opt_select .select_custom.deal_opt_item .select {height:110px}
-	.pd_detail .area_desc .desc_wrap .option_box .opt_select .select_custom.deal_opt_item .item_prod {width:100%;}
-	.pd_detail .area_desc .desc_wrap .option_box .opt_select .select_custom.deal_opt_item .item_prod .item_state {padding:0; margin:0}
-	.pd_detail .area_desc .desc_wrap .option_box .opt_select .select_custom.deal_opt_item .item_prod .item_state a {position:relative; padding-left:70px}
-	.pd_detail .area_desc .desc_wrap .option_box .opt_select .select_custom.deal_opt_item .item_prod .item_state a .itemPic {position:absolute; left:0; top:0; width:50px; height:70px; padding:0;}
-	.pd_detail .area_desc .desc_wrap .option_box .opt_select .select_custom.deal_opt_item .combo .list {top:109px}
+	.pd_detail .area_desc .desc_wrap .option_box .opt_select .select_custom.deal_opt_item .select {height:110px; background:transparent;}
+	.pd_detail .area_desc .desc_wrap .option_box .opt_select .select_custom.deal_opt_item .item_prod {width:100%; z-index:-1;}
+	.pd_detail .area_desc .desc_wrap .option_box .opt_select .select_custom.deal_opt_item .item_prod .item_state {display:table; width:100%; height:70px; padding:0; margin:0}
+	.pd_detail .area_desc .desc_wrap .option_box .opt_select .select_custom.deal_opt_item .item_prod .item_state a {display:table-cell; position:relative; width:100%; height:70px; padding-left:70px; padding-right:40px; vertical-align:middle;}
+	.pd_detail .area_desc .desc_wrap .option_box .opt_select .select_custom.deal_opt_item .item_prod .item_state a .itemPic {position:absolute; left:0; top:0; width:50px; height:70px; padding:0; margin:0}
+	.pd_detail .area_desc .desc_wrap .option_box .opt_select .select_custom.deal_opt_item .item_prod .item_state a .itemName {max-width:100%; height:20px; margin-bottom:0px; line-height:20px; font-size:14px; -webkit-line-clamp:1;}
+	.pd_detail .area_desc .desc_wrap .option_box .opt_select .select_custom.deal_opt_item .item_prod .item_state a .itemName .tit_option {font-weight:500;}
+	.pd_detail .area_desc .desc_wrap .option_box .opt_select .select_custom.deal_opt_item .item_prod .item_state a .itemPrice {margin-top:13px}
+	.pd_detail .area_desc .desc_wrap .option_box .opt_select .select_custom.deal_opt_item .item_prod .item_state a .itemPercent {position:relative;}
+	.pd_detail .area_desc .desc_wrap .option_box .opt_select .select_custom.deal_opt_item .item_prod .item_state a .itemPrice_original {margin-right:0;}
+	.pd_detail .area_desc .desc_wrap .option_box .opt_select .select_custom.deal_opt_item .item_prod .item_state a .itemPercent {margin-right:0;}
+	.pd_detail .area_desc .desc_wrap .option_box .opt_select .select_custom.deal_opt_item .item_prod .item_state a > [class^="item"] {margin-left:0; margin-right:0;} 
+	.pd_detail .area_desc .desc_wrap .option_box .opt_select .select_custom.deal_opt_item .combo .list {top:110px}
+	.pd_detail .area_desc .desc_wrap .option_box .opt_select .select_custom.deal_opt_item .combo .list > li {border-bottom:1px solid #eee;}
+	.pd_detail .area_desc .desc_wrap .option_box .opt_select .select_custom.deal_opt_item .combo .list > li[aria-disabled="true"] a [class^="item"] {color:#bbb; text-decoration:line-through;} 
+	.pd_detail .area_desc .desc_wrap .option_box .opt_select .select_custom.deal_opt_item .combo .list > li[aria-disabled="true"] a img {opacity:0.3;}
 
 	.pd.deal .tab_detail_cont .select_custom.deal_opt_item,
 	.pd.deal .tab_detail_cont .select_custom.deal_opt_item .select {height:110px}
@@ -2546,9 +2681,11 @@ ul.maintabs li [class^='box_depth'] {display:none; position:absolute; left:100%;
 	.pd_detail .area_desc .desc_wrap .option_box .number_count input[type='text']{float:left;}
 	.pd_detail .area_desc .desc_wrap .option_box .number_count span {cursor:pointer; position:relative; display:inline-block; width:40px; height:40px; text-align:center;}
 	.pd_detail .area_desc .desc_wrap .option_box .number_count span::after {content:''; position:absolute; left:50%; top:50%; transform: translate(-50%, -50%);; width:12px; height:12px; background:url('/images/pc/btn_count.png') no-repeat 100% 0; image-rendering:pixelated;}
+	.pd_detail .area_desc .desc_wrap .option_box .number_count span.min_val,
+	.pd_detail .area_desc .desc_wrap .option_box .number_count span.max_val {opacity:0.2;}
 	.pd_detail .area_desc .desc_wrap .option_box .number_count .plus::after {content:''; background-position:100% 0;}
 	.pd_detail .area_desc .desc_wrap .option_box .number_count .minus::after {content:''; background-position:0 0;}
-	.pd_detail .area_desc .desc_wrap .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; font-family:'LATO','Noto Sans CJK kr','Noto Sans kr',sans-serif;}
+	.pd_detail .area_desc .desc_wrap .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;}
 	.pd_detail .area_desc .desc_wrap .price_box {padding:30px 0 40px; border-top:1px solid #222;}
 	.pd_detail .area_desc .desc_wrap .price_box::after {content:''; clear:both; display:block;}
 	.pd_detail .area_desc .desc_wrap .price_box .number {float:left; color:#666; font-size:14px; font-weight:200; margin-top:8px}
@@ -2569,7 +2706,7 @@ ul.maintabs li [class^='box_depth'] {display:none; position:absolute; left:100%;
 	.pd_detail .area_desc .desc_wrap .exinfo_box ul li [class^="ex_"] > a .tit em.number {margin-left:4px; color:#666; font-weight:200;}
 	.pd_detail .area_desc .desc_wrap .exinfo_box ul li .ex_review {}
 	.pd_detail .area_desc .desc_wrap .exinfo_box ul li .ex_review .star_score {float:right; margin-right:48px; height:14px;}
-	.pd_detail .area_desc .desc_wrap .exinfo_box ul li .ex_review .star_score .star {display:inline-block; position:relative; width:95px; height:14px; background:#ddd;}
+	.pd_detail .area_desc .desc_wrap .exinfo_box ul li .ex_review .star_score .star {display:inline-block; position:relative; width:95px; height:14px; background:#f5f5f5;}
 	.pd_detail .area_desc .desc_wrap .exinfo_box ul li .ex_review .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;}
 	.pd_detail .area_desc .desc_wrap .exinfo_box ul li .ex_review .star_score .star .progbar {display:inline-block; height:14px; background:#fd4802}
 	.pd_detail .area_desc .desc_wrap .exinfo_box ul li .ex_review .star_score .score {color:#222; font-size:16px; font-weight:200;}
@@ -2580,7 +2717,7 @@ ul.maintabs li [class^='box_depth'] {display:none; position:absolute; left:100%;
 	.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;}
-	.pd_detail .area_desc .desc_wrap .exinfo_box ul li .best_review a .star_score .star {display:inline-block; position:relative; width:83px; height:14px; background:#ddd;}
+	.pd_detail .area_desc .desc_wrap .exinfo_box ul li .best_review a .star_score .star {display:inline-block; position:relative; width:83px; height:14px; background:#f5f5f5;}
 	.pd_detail .area_desc .desc_wrap .exinfo_box ul li .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;}
 	.pd_detail .area_desc .desc_wrap .exinfo_box ul li .best_review a .star_score .star .progbar {display:inline-block; height:14px; background:#fd4802}
 	.pd_detail .area_desc .desc_wrap .exinfo_box ul li .best_review a .star_score .ico {margin-left:10px}
@@ -2674,12 +2811,13 @@ ul.maintabs li [class^='box_depth'] {display:none; position:absolute; left:100%;
 	.pd_recommend .area_slider .page .item_wrap .item_area .li_item ul li .item_prod.unable {opacity:0.4}
 	.pd_recommend .area_slider .page .item_wrap .item_area .li_item ul li .item_prod.unable * {color:#bbb; text-decoration:line-through;}
 	.pd_recommend .item_area .itemBrand {}
-	.pd_recommend .item_area .itemName {}
+	.pd_recommend .item_area .itemName {height:20px;}
 	.pd_recommend .item_area .itemPrice {}
 	.pd_recommend .item_area .itemPrice .itemPrice_original {}
 	.pd_recommend .item_area .itemPrice .itemPercent {position:relative;}
 	.pd_recommend .area_slider .page .item_wrap .item_area .btn {margin-top:30px; border-color:#fd4802; color:#fd4802;}
 	.pd_recommend .area_slider .page .item_wrap .item_area .btn span {font-weight:500;}
+	.pd_recommend .swiper-pagination {margin-top:40px}
 
 	.pd_relate {}
 	.pd_relate .area_slider {margin-bottom:230px;}
@@ -2720,6 +2858,7 @@ ul.maintabs li [class^='box_depth'] {display:none; position:absolute; left:100%;
 
 
 	/* pd_popup */
+	.modal.pd_pop a.close-modal:last-child {display: none;}
 	.modal.pd_pop dl div,
 	.modal.pd_pop dl dt,
 	.modal.pd_pop dl dd {float:left;}
@@ -2734,10 +2873,13 @@ ul.maintabs li [class^='box_depth'] {display:none; position:absolute; left:100%;
 	.modal.pd_pop .swiper-button-prev:after {content:''; display:block; position:absolute; top:0px; left:0; width:34px; height:34px; border:2px solid #a7a7a7; border-width:2px 2px 0 0; transform:rotate(-135deg); -webkit-transform:rotate(-135deg);}
 	.modal.pd_pop .swiper-button-next:after {content:''; display:block; position:absolute; top:0px; right:0; width:34px; height:34px; border:2px solid #a7a7a7; border-width:2px 2px 0 0; transform:rotate(45deg); -webkit-transform:rotate(45deg);}
 	.modal.pd_pop .modal-body .pop_cont {max-height:none;}
-	.modal.pd_pop .modal-header h5.modal-title {display:inline-block; margin:0; font-size:24px; font-weight:300;}
+	.modal.pd_pop .modal-header h5.modal-title {display:inline-block; margin:0; font-size:24px; font-weight:500;}
 	.modal.pd_pop .modal-header .txt {margin-top:20px; color:#666; font-size:16px; font-weight:300;}
 	.modal.pd_pop .modal-body .pop_cont {line-height:1;}
 	.modal.pd_pop .modal-footer {margin-top:40px}
+	.modal.pd_pop .form_field input[type="checkbox"] + label {line-height:1;}
+	.modal.pd_pop .form_field input[type="checkbox"] + label:before,
+	.modal.pd_pop .form_field input[type="checkbox"]:checked + label:after {top:50%; transform:translateY(-50%);}
 	.modal.pd_pop .info_txt ul li {position:relative; font-size:14px; color:#888; padding-left:15px; margin-bottom:10px; line-height:1;}
 	.modal.pd_pop .info_txt ul li:last-child {margin-bottom:0;}
 	.modal.pd_pop .info_txt ul li:after {content:''; position: absolute; top:5px; left:0; background:#858585; width:3px; height:3px;}
@@ -2751,28 +2893,35 @@ ul.maintabs li [class^='box_depth'] {display:none; position:absolute; left:100%;
 	.modal.pd_pop .opt_select .select_custom .combo .list > li > div {margin-top:5px}
 	.modal.pd_pop .opt_select .select_custom .combo .list > li > div:first-child {margin-top:0;}
 	.modal.pd_pop .opt_select .select_custom .combo .list > li[data-soldout="true"]::after {right:18px; top:50%; bottom:auto; transform:translateY(-50%);}
+	.modal.pd_pop .btn_post_wrap {position:absolute; top:50%; transform:translateY(-50%); height:0; left:-70px; right:-70px; margin-top:-30px; z-index:3;}
+	.modal.pd_pop .btn_post_wrap::after {content:''; clear:both; display:block;}
+	.modal.pd_pop .btn_post_wrap a {display:block; width:34px; height:34px; border:2px solid #a7a7a7; border-width:2px 2px 0 0; font-size:1px; text-indent:-9999px; overflow:hidden; opacity:1;}
+	.modal.pd_pop .btn_post_wrap a.no_more {opacity:0.3;}
+	.modal.pd_pop .btn_post_wrap .btn_prev_post {float:left; transform:rotate(-135deg); -webkit-transform:rotate(-135deg);}
+	.modal.pd_pop .btn_post_wrap .btn_next_post {float:right; transform:rotate(45deg); -webkit-transform:rotate(45deg);}
 
 
 	/* pd_popup > EP채널쿠폰 */
 	.modal.pd_pop.epcoupon_pop {max-width:none; width:620px; padding:60px 60px;}
-	.pd_pop.epcoupon_pop .ep_coupon {position:relative; width:300px; margin:auto; border:1px solid #ddd;  background:#f5f5f5; padding:44px 0; text-align:center; line-height:1;}
+	.pd_pop.epcoupon_pop .ep_coupon {position:relative; width:300px; margin:auto; border:1px solid #ddd; background:#fff; padding:40px 0 35px; text-align:center; line-height:1;}
 	.pd_pop.epcoupon_pop .ep_coupon > div {position:relative;}
 	.pd_pop.epcoupon_pop .ep_coupon > div::after {content:''; position:absolute; top:50%; right:-1px; transform:translateY(-50%); width:15px; height:30px; background:#fff; z-index:2; border:1px solid #ddd; border-right:none; border-top-left-radius:15px; border-bottom-left-radius:15px; overflow:hidden;}
-	.pd_pop.epcoupon_pop .ep_coupon > div .cp_title {color:#222; font-size:16px; font-weight:600; letter-spacing:4px;}
-	.pd_pop.epcoupon_pop .ep_coupon > div .cp_cont {margin-top:20px;}
+	.pd_pop.epcoupon_pop .ep_coupon > div .cp_title {color:#222; font-size:16px; font-weight:700; letter-spacing:4px;}
+	.pd_pop.epcoupon_pop .ep_coupon > div .cp_cont {margin-top:15px;}
 	.pd_pop.epcoupon_pop .ep_coupon > div .cp_cont span {display:block; color:#222;}
-	.pd_pop.epcoupon_pop .ep_coupon > div .cp_cont span em.number {font-size:62px; font-weight:600;}
-	.pd_pop.epcoupon_pop .ep_coupon > div .cp_cont span em.unit {font-size:32px; font-weight:500;}
+	.pd_pop.epcoupon_pop .ep_coupon > div .cp_cont span em.number {margin-left:4px; font-size:62px; font-weight:700;}
+	.pd_pop.epcoupon_pop .ep_coupon > div .cp_cont span em.unit {font-size:32px; font-weight:700;}
 	.pd_pop.epcoupon_pop .ep_coupon > div .cp_cont span.unit_won {}
 	.pd_pop.epcoupon_pop .ep_coupon > div .cp_cont span.unit_percent {font-size:16px; font-weight:500;}
 	.pd_pop.epcoupon_pop .info_txt {margin-top:30px;}
 	.pd_pop.epcoupon_pop .modal-footer button {width:220px}
 
 	/* pd_popup > 할인쿠폰 */
-	.modal.pd_pop.salecoupon_pop {max-width:none; width:480px; padding:40px 60px;}
-	.pd_pop.salecoupon_pop .coupon_list {line-height:1;}
-	.pd_pop.salecoupon_pop .coupon_list li {margin-top:30px}
-	.pd_pop.salecoupon_pop .coupon_list li:first-child {margin-top:0}
+	.modal.pd_pop.salecoupon_pop {max-width:none; width:480px; padding:40px 60px 0;}
+	.modal.pd_pop.salecoupon_pop .pop_cont {max-height:510px; margin-left:-20px; margin-right:-20px; padding:0 20px; overflow-y:auto;} 
+	.modal.pd_pop.salecoupon_pop .modal-footer {margin-top:0; margin-left:-60px; margin-right:-60px;}
+	.pd_pop.salecoupon_pop .coupon_list {width:360px; margin:auto; line-height:1;}
+	.pd_pop.salecoupon_pop .coupon_list li {margin-bottom:30px}
 	.pd_pop.salecoupon_pop .coupon_list li .coupon {position:relative; border:1px solid #ddd; box-sizing:border-box; background:#fff;}
 	.pd_pop.salecoupon_pop .coupon_list li .coupon > div {position:relative;}
 	.pd_pop.salecoupon_pop .coupon_list li .coupon > div::after {content:''; position:absolute; top:50%; right:-1px; transform:translateY(-50%); width:15px; height:30px; background:#fff; z-index:2; border:1px solid #ddd; border-right:none; border-top-left-radius:15px; border-bottom-left-radius:15px; overflow:hidden;}
@@ -2780,32 +2929,36 @@ ul.maintabs li [class^='box_depth'] {display:none; position:absolute; left:100%;
 	.pd_pop.salecoupon_pop .coupon_list li .coupon .cp_name {padding-top:30px; color:#222; font-size:14px; font-weight:300;}
 	.pd_pop.salecoupon_pop .coupon_list li .coupon .cp_cont {margin-top:10px;}
 	.pd_pop.salecoupon_pop .coupon_list li .coupon .cp_cont span {color:#fd4802; font-size:22px; font-weight:500;}
-	.pd_pop.salecoupon_pop .coupon_list li .coupon .cp_cont span em {font-size:28px; font-weight:600;}
+	.pd_pop.salecoupon_pop .coupon_list li .coupon .cp_cont span em {font-size:28px; font-weight:700;}
 	.pd_pop.salecoupon_pop .coupon_list li .coupon .cp_condition {margin-top:16px; padding-bottom:30px; color:#888; font-size:12px; font-weight:300;}
 	.pd_pop.salecoupon_pop .coupon_list li .coupon .cp_condition span {display:block; margin-top:5px}
 	.pd_pop.salecoupon_pop .coupon_list li .coupon .btn_coupon_down {}
 	.pd_pop.salecoupon_pop .coupon_list li .coupon .btn_coupon_down span {position:relative; display:inline-block; padding-right:24px;}
 	.pd_pop.salecoupon_pop .coupon_list li .coupon .btn_coupon_down span::after {content:''; position:absolute; right:0; top:50%; transform:translateY(-50%); width:14px; height:15px; margin-left:10px; background:url('/images/pc/ico_cp_down.png') no-repeat 0 0;}
-	.pd_pop.salecoupon_pop .coupon_list li .coupon .btn_coupon_done:disabled{background:#aaa; border-color:#aaa; opacity:1;}
+	.pd_pop.salecoupon_pop .btn_coupon_done:disabled{background:#aaa; border-color:#aaa; color:#fff; opacity:1;}
 
 	/* pd_popup > 쇼핑혜택, 카드혜택 */
 	.modal.pd_pop[class*="bnf_"] {max-width:none; width:650px; padding:60px 60px;}
 	.modal.pd_pop[class*="bnf_"] h6 {margin-bottom:20px}
 	.modal.pd_pop[class*="bnf_"] .benefit_blk {margin-top:40px}
 	.modal.pd_pop[class*="bnf_"] .benefit_blk:first-child {margin-top:0}
-	.modal.pd_pop[class*="bnf_"] .tbl.type1 {padding:20px 0; font-size:14px;}
+	.modal.pd_pop[class*="bnf_"] .tbl.type1 {padding:20px 20px; font-size:14px;}
 	.modal.pd_pop[class*="bnf_"] .tbl.type1 table tr th,
-	.modal.pd_pop[class*="bnf_"] .tbl.type1 table tr td {font-size:14px; line-height:1; vertical-align:top;}
-	.modal.pd_pop[class*="bnf_"] .tbl.type1 table tr th {padding:10px 0px 10px 20px; color:#222; text-align:left;}
-	.modal.pd_pop[class*="bnf_"] .tbl.type1 table tr td {padding:10px 0px; color:#222;}
-	.modal.pd_pop[class*="bnf_"] .tbl.type1 table tr td:last-child {padding:10px 20px 10px 0px; text-align:right;}
-	.modal.pd_pop.bnf_shopping_pop .tbl.type1 table tr td {color:#fd4802;}
+	.modal.pd_pop[class*="bnf_"] .tbl.type1 table tr td {padding:10px 0px; font-size:14px; line-height:1; vertical-align:top;}
+	.modal.pd_pop[class*="bnf_"] .tbl.type1 table tr th {color:#222; text-align:left;}
+	.modal.pd_pop[class*="bnf_"] .tbl.type1 table tr td {color:#222;}
+	.modal.pd_pop[class*="bnf_"] .tbl.type1 table tr td:last-child {text-align:right;}
+	.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 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}
 	.modal.pd_pop.bnf_card_pop table a.btn_more {display:inline-block; position:relative; padding-right:15px; color:#888; font-size:14px;}
 	.modal.pd_pop.bnf_card_pop table a.btn_more:after {content:''; display:block; position:absolute; top:1px; right:0; width:8px; height:8px; border:1px solid #888; border-width:1px 1px 0 0; transform:rotate(45deg); -webkit-transform:rotate(45deg);}
 	.modal.pd_pop.bnf_card_pop .info_txt {margin-top:20px;}
+	.modal.pd_pop.bnf_card_pop .pop_cont {max-height:560px; margin-left:-20px; margin-right:-20px; padding:0 20px; overflow-y:auto;} 
+
 
 	/* pd_popup > 사이즈정보 */
 	.modal.pd_pop.info_size_pop {max-width:none; width:840px; padding:60px;}
@@ -2814,14 +2967,18 @@ ul.maintabs li [class^='box_depth'] {display:none; position:absolute; left:100%;
 	.pd_pop.info_size_pop .size_head .tit_sub {display:block; margin-bottom:20px; font-size:14px; font-weight:200;}
 	.pd_pop.info_size_pop .size_head .tit_header {display:block; color:#222; font-size:18px; font-weight:300;}
 	.pd_pop.info_size_pop .size_cont {}
-	.pd_pop.info_size_pop .size_cont .size_tbl_box {margin-top:40px; position:relative;}
+	.pd_pop.info_size_pop .size_cont .size_tbl_box {padding-top:35px; margin-top:40px; position:relative;}
 	.pd_pop.info_size_pop .size_cont .size_tbl_box:first-of-type {margin-top:0;}
-	.pd_pop.info_size_pop .size_cont .size_tbl_box h6 {margin-bottom:20px;}
-	.pd_pop.info_size_pop .size_cont .size_tbl_box .size_unit {position:absolute; right:0; top:2px; color:#888; font-size:14px;}
+	.pd_pop.info_size_pop .size_cont .size_tbl_box h6 {position:absolute; left:0; top:0; margin-bottom:20px;}
+	.pd_pop.info_size_pop .size_cont .size_tbl_box .size_unit {position:absolute; right:0; top:0px; color:#888; font-size:14px;}
+	.pd_pop.info_size_pop .size_cont .size_tbl_box .tbl table th {color:#222;}
+	.pd_pop.info_size_pop .size_cont .size_tbl_box .tbl table thead th {border-bottom:1px solid #222;}
+	.pd_pop.info_size_pop .size_cont .size_tbl_box .tbl table th,
+	.pd_pop.info_size_pop .size_cont .size_tbl_box .tbl table td {font-size:14px;}
 	.pd_pop.info_size_pop .size_footer {margin-top:20px}
 	.pd_pop.info_size_pop .tab_nav {}
 	.pd_pop.info_size_pop .tab_nav ul::after {content:''; clear:both; display:block;}
-	.pd_pop.info_size_pop .tab_nav ul li {float:left; width:calc((100%-2px)*1/3); text-align:center; background:#f5f5f5; border-bottom:1px solid #222; border-top:1px solid #f5f5f5;}
+	.pd_pop.info_size_pop .tab_nav ul li {float:left; width:calc((100% - 2px) * 1/3); text-align:center; background:#f5f5f5; border-bottom:1px solid #222; border-top:1px solid #f5f5f5;}
 	.pd_pop.info_size_pop .tab_nav ul li.active {background:#fff; border:1px solid #222; border-bottom:1px solid #fff}
 	.pd_pop.info_size_pop .tab_nav ul li a {display:block; color:#888; font-size:18px; font-weight:200; padding:20px 0;}
 	.pd_pop.info_size_pop .tab_nav ul li.active a {color:#222; font-weight:300;}
@@ -2837,31 +2994,33 @@ ul.maintabs li [class^='box_depth'] {display:none; position:absolute; left:100%;
 	.pd_pop.info_size_pop .sub_tab_nav ul li {float:left; margin-left:30px; text-align:center;}
 	.pd_pop.info_size_pop .sub_tab_nav ul li:first-child {margin-left:0}
 	.pd_pop.info_size_pop .sub_tab_nav ul li a {display:inline-block; color:#888; font-size:16px; font-weight:200;}
-	.pd_pop.info_size_pop .sub_tab_nav ul li.active a {color:#222; font-weight:300; border-bottom:1px solid #222}
+	.pd_pop.info_size_pop .sub_tab_nav ul li.active a {color:#222; font-weight:500; border-bottom:1px solid #222}
 	.pd_pop.info_size_pop .sub_tab_cont_wrap {display:block; margin-top:40px}
 	.pd_pop.info_size_pop .sub_tab_cont_wrap .sub_tab_cont {display:none; position:relative;}
 	.pd_pop.info_size_pop .sub_tab_cont_wrap .sub_tab_cont::after {content:''; clear:both; display:block;}
 	.pd_pop.info_size_pop .sub_tab_cont_wrap .sub_tab_cont:first-of-type {display:block}
 	.pd_pop.info_size_pop .sub_tab_cont_wrap .sub_tab_cont .img_sizeinfo {float:left;}
-	.pd_pop.info_size_pop .sub_tab_cont_wrap .sub_tab_cont dl {float:right; width:344px; text-align:left; margin-top:10px; font-size:14px; line-height:1.4; word-break:keep-all;}
-	.pd_pop.info_size_pop .sub_tab_cont_wrap .sub_tab_cont dl div {padding:0 0 30px;}
-	.pd_pop.info_size_pop .sub_tab_cont_wrap .sub_tab_cont dl div dt {margin-bottom:10px; color:#222; font-weight:300;}
+	.pd_pop.info_size_pop .sub_tab_cont_wrap .sub_tab_cont dl {float:right; width:344px; text-align:left; margin-top:10px; font-size:14px; line-height:24px; word-break:keep-all;}
+	.pd_pop.info_size_pop .sub_tab_cont_wrap .sub_tab_cont dl div {float:none; padding:0 0 20px;}
+	.pd_pop.info_size_pop .sub_tab_cont_wrap .sub_tab_cont dl div dt {float:none; color:#222; font-weight:300;}
 	.pd_pop.info_size_pop .sub_tab_cont_wrap .sub_tab_cont dl div dd {color:#666;}
+	.pd_pop.info_size_pop .sub_tab_cont_wrap .sub_tab_cont dl div dd .info_txt ul li {line-height:inherit;}
+	.pd_pop.info_size_pop .sub_tab_cont_wrap .sub_tab_cont dl div dd .info_txt ul li:after {top:7px}
 
 	/* pd_popup > 재입고 알림 신청 */
 	.modal.pd_pop.push_restock_pop {max-width:none; width:630px; padding:60px;}
-	.pd_pop.push_restock_pop .pop_cont {overflow:initial;}
-	.pd_pop.push_restock_pop .item_blk {}
+	.pd_pop.push_restock_pop .pop_cont {margin-left:-10px; margin-right:-10px; padding-left:10px; padding-right:10px;}
+	.pd_pop.push_restock_pop .item_blk {width:510px;}
 	.pd_pop.push_restock_pop .item_blk .item_prod {width:100%; display:block;}
-	.pd_pop.push_restock_pop .item_blk .item_prod .item_state {padding:0;}
+	.pd_pop.push_restock_pop .item_blk .item_prod .item_state {display:table; width:100%; padding:0;}
 	.pd_pop.push_restock_pop .item_blk .item_prod .item_state .itemLink {display:table-cell; width:100%; height:120px; padding-left:100px; vertical-align:middle;}
 	.pd_pop.push_restock_pop .item_blk .item_prod .item_state .itemLink .itemPic {position:absolute; left:0; top:0; width:80px; height:120px; padding:0; margin-bottom:0; z-index:2;}
-	.pd_pop.push_restock_pop .item_blk .item_prod .item_state .itemLink .itemBrand {display:block; margin:0;}
-	.pd_pop.push_restock_pop .item_blk .item_prod .item_state .itemLink .itemName {display:block; margin:0;}
+	.pd_pop.push_restock_pop .item_blk .item_prod .item_state .itemLink .itemBrand {display:block; margin-left:0;}
+	.pd_pop.push_restock_pop .item_blk .item_prod .item_state .itemLink .itemName {max-width:100%; margin-left:0; margin-bottom:13px; height:auto; max-height:40px;}
 	.pd_pop.push_restock_pop .item_blk .item_prod .item_state .itemLink .itemPrice {margin:0;}
 	.pd_pop.push_restock_pop .item_blk .item_prod .item_state .itemLink .itemPrice .itemPrice_original {}
 	.pd_pop.push_restock_pop .item_blk .item_prod .item_state .itemLink .itemPrice .itemPercent {position:relative;}
-	.pd_pop.push_restock_pop .select_blk {margin-top:40px;}
+	.pd_pop.push_restock_pop .select_blk {width:510px; margin-top:40px;}
 	.pd_pop.push_restock_pop .select_blk h6 {margin-bottom:20px}
 	.pd_pop.push_restock_pop .select_blk .opt_size .form_field {display:block; margin-top:-8px;}
 	.pd_pop.push_restock_pop .select_blk .opt_size .form_field > div {margin-left:8px; margin-top:8px;}
@@ -2869,13 +3028,32 @@ ul.maintabs li [class^='box_depth'] {display:none; position:absolute; left:100%;
 	.pd_pop.push_restock_pop .select_blk .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;}
 	.pd_pop.push_restock_pop .select_blk .opt_size .form_field input[type="radio"] + label::before,
 	.pd_pop.push_restock_pop .select_blk .opt_size .form_field input[type="radio"] + label::after {display:none;}
-	.pd_pop.push_restock_pop .select_blk .opt_size .form_field input[type="radio"]:checked + label {border:1px solid #222;}
+	.pd_pop.push_restock_pop .select_blk .opt_size .form_field input[type="radio"]:checked + label {border: 1px solid #fd4802;}
 	.pd_pop.push_restock_pop .select_blk .opt_size .form_field input[type="radio"]:disabled + label {text-decoration:line-through; background:#f5f5f5; border-color:#f5f5f5; color:#bbb; opacity:1;}
 	.pd_pop.push_restock_pop .select_blk .opt_size .form_field > div {float:left; width:auto;}
 	.pd_pop.push_restock_pop .select_blk .opt_select .select_blk {display:block; max-height:300px; overflow-y:scroll;}
 	.pd_pop.push_restock_pop .modal-footer {margin-top:40px; padding-top:40px; border-top:1px solid #ddd;}
 	.pd_pop.push_restock_pop .modal-footer button {width:220px;}
 
+
+	/* pd_popup > 스타일링 추천 */
+	.modal.pd_pop.pd_lookbook_pop {max-width:585px; min-height:390px; padding:0;}
+	.pd_pop.pd_lookbook_pop .item_prod {width:100%;}
+	.pd_pop.pd_lookbook_pop .modal-header {margin:0;}
+	.pd_pop.pd_lookbook_pop .itemsGrp {margin-bottom:0;}
+	.pd_pop.pd_lookbook_pop .itemsGrp .item_prod {width: 100%; overflow: hidden;}
+	.pd_pop.pd_lookbook_pop .itemsGrp .item_prod .item_state {display: table; padding-left: 310px; padding-right: 55px; padding-bottom: 0; width: 100%; min-height:390px;}
+	.pd_pop.pd_lookbook_pop .itemsGrp .item_prod .itemLink {display: table-cell; position: static; vertical-align: middle;}
+	.pd_pop.pd_lookbook_pop .itemsGrp .item_prod .itemPic {position: absolute; top: 0; left: 0; margin-bottom: 0; width: 260px; height:390px; padding:0; background: #f5f5f5;}
+	.pd_pop.pd_lookbook_pop .itemsGrp .item_prod.sold_out .itemPic:before {content:'SOLD OUT'; position: absolute; top: 50%; left: 50%; font-size: 20px; color:#fff; background: rgba(0,0,0,.5); width: 100%; height: 100%; transform:translate(-50%, -50%); line-height: 420px; z-index: 99; text-align: center;}
+	.pd_pop.pd_lookbook_pop .itemsGrp .item_prod .itemBrand {margin:0px 0px 15px; font-size: 14px; font-weight: 300;}
+	.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 .itemLink .btn {margin-top:40px; border:1px solid #a7a7a7; font-weight:300;}
+
+
 	/* pd_popup > 베스트 리뷰 & 포토영상 리뷰 자세히보기 공통 */
 	.modal.pd_pop[class*="reviewdetail_pop"] {max-width:none; width:1080px; padding:60px;}
     .pd_pop[class*="reviewdetail_pop"] .pic .thumb {display:block; padding-top:100%; background-repeat:no-repeat; background-position:50% 50%; background-size:cover;}
@@ -2890,7 +3068,7 @@ ul.maintabs li [class^='box_depth'] {display:none; position:absolute; left:100%;
 	.pd_pop[class*="reviewdetail_pop"] .detail .review .review_cont .box_wrap [class*="_box"] {margin-top:25px;}
     .pd_pop[class*="reviewdetail_pop"] .detail .review .review_cont .star_box {margin-top:0}
 	.pd_pop[class*="reviewdetail_pop"] .detail .review .review_cont .star_box .star_score {height:17px;}
-	.pd_pop[class*="reviewdetail_pop"] .detail .review .review_cont .star_box .star {display:inline-block; position:relative; width:102px; height:17px; background:#ddd;}
+	.pd_pop[class*="reviewdetail_pop"] .detail .review .review_cont .star_box .star {display:inline-block; position:relative; width:102px; height:17px; background:#f5f5f5;}
 	.pd_pop[class*="reviewdetail_pop"] .detail .review .review_cont .star_box .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_pop[class*="reviewdetail_pop"] .detail .review .review_cont .star_box .star .progbar {display:inline-block; height:100%; background:#fd4802}
     .pd_pop[class*="reviewdetail_pop"] .detail .review .review_cont .response_box {}
@@ -2917,13 +3095,28 @@ ul.maintabs li [class^='box_depth'] {display:none; position:absolute; left:100%;
     .pd_pop[class*="reviewdetail_pop"] .detail .review .review_cont .reply_box .reply .reply_writer .wr_date {padding-left:20px; margin-left:20px; color:#888; font-size:200;}
     .pd_pop[class*="reviewdetail_pop"] .detail .review .review_cont .reply_box .reply .reply_writer .wr_date::after {content:''; position:absolute; left:0; top:50%; transform:translateY(-50%); height:12px; width:1px; background:#ddd;}
     .pd_pop[class*="reviewdetail_pop"] .detail .review .review_cont .reply_box .reply .reply_txt {margin-top:20px; color:#666; line-height:24px;}
-    .pd_pop[class*="reviewdetail_pop"] .thumblist {position:absolute; right:60px; bottom:60px; max-width:365px; padding-bottom:10px;}
+
+	.pd_pop[class*="reviewdetail_pop"] .detail .review.empty_photo {}
+	.pd_pop[class*="reviewdetail_pop"] .detail .review.empty_photo .review_cont .box_wrap {height:545px;}
+    .pd_pop[class*="reviewdetail_pop"] .detail .review.empty_photo .pic .thumb::before {content:''; position:absolute; left:0; right:0; top:0; bottom:0; z-index:2; background:rgba(0,0,0,0.5);}
+	.pd_pop[class*="reviewdetail_pop"] .detail .review.empty_photo .pic .thumb::after {content:'리뷰에 등록된 이미지가 없습니다.'; position:absolute; left:50%; top:50%; transform:translate(-50%,-50%); z-index:2; color:#fff; font-size:16px;}
+
+	
+	.pd_pop[class*="reviewdetail_pop"] .thumblist {position:absolute; right:0px; bottom:0px; width:365px; overflow-x:auto; white-space:nowrap; padding-bottom:10px;}
+	.pd_pop[class*="reviewdetail_pop"] .thumblist .pic {position:relative; width:50px; height:50px; cursor:pointer; z-index:2;}
+	.pd_pop[class*="reviewdetail_pop"] .thumblist .pic.active {border:2px solid #fd4802;}
 	.pd_pop[class*="reviewdetail_pop"] .thumblist .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_pop[class*="reviewdetail_pop"] .thumblist .swiper-slide {width:auto;}
     .pd_pop[class*="reviewdetail_pop"] .thumblist .swiper-slide .pic {position:relative; width:50px; height:50px; cursor:pointer; z-index:2;}
     .pd_pop[class*="reviewdetail_pop"] .thumblist .swiper-slide.swiper-slide-thumb-active .pic {border:2px solid #fd4802;}
 	.pd_pop[class*="reviewdetail_pop"] .thumblist .swiper-scrollbar {left:0; width:100%; height:2px; background:#ddd; border-radius:0; opacity:1;}
 	.pd_pop[class*="reviewdetail_pop"] .thumblist .swiper-scrollbar-drag {background:#222; opacity:1;}
+	
+	.pd_pop[class*="reviewdetail_pop"] .detail .review .thumblist {}
+	.pd_pop[class*="reviewdetail_pop"] .detail .review .thumblist ul {height:50px; width:max-content;}
+	.pd_pop[class*="reviewdetail_pop"] .detail .review .thumblist ul::after {content:''; clear:both; display:;}
+	.pd_pop[class*="reviewdetail_pop"] .detail .review .thumblist li {float:left; margin-right:8px;}
+    .pd_pop[class*="reviewdetail_pop"] .detail .review .thumblist li .pic {position:relative; width:50px; height:50px; cursor:pointer; z-index:2;}
 
 	/* pd_popup > 베스트  리뷰 자세히 보기 */
 	.modal.pd_pop.pd_bestreviewdetail_pop {}
@@ -2967,11 +3160,14 @@ ul.maintabs li [class^='box_depth'] {display:none; position:absolute; left:100%;
 	.modal.pd_pop.pd_qnawrite_pop .info_txt ul li:after {top:10px;}
 	.pd_qnawrite_pop .modal-body .pop_cont {max-height:none;}
 	.pd_qnawrite_pop .modal-footer {margin-top:40px; padding-top:40px; border-top:1px solid #ddd;}
+	.pd_qnawrite_pop .modal-footer .btn {width:220px;}
 	.pd_qnawrite_pop .form_field {display:block;}
-	.pd_qnawrite_pop .input_box {margin-top:40px}
+	.pd_qnawrite_pop .input_box {margin-top:35px}
 	.pd_qnawrite_pop .input_box textarea {display:block; width:100%; height:220px; padding:20px 20px; box-sizing:border-box; color:#222; font-size:16px;}
-	.pd_qnawrite_pop .input_box .txt_cnt {display:block; width:100%; margin-top:10px; z-index:1;}
+	.pd_qnawrite_pop .input_box .txt_cnt {display:block; width:100%; margin-top:14px; font-size:14px; z-index:1;}
+	.pd_qnawrite_pop .input_box .txt_cnt .itemqna_cnt em {font-weight:500;}
 	.pd_qnawrite_pop .secret_box {position:absolute; left:0; bottom:0; z-index:2;}
+	.pd_qnawrite_pop .form_field .secret_box input[type="checkbox"] + label {color:#222; font-size:16px; font-weight:200;}
 	.pd_qnawrite_pop .push_box {margin-top:40px}
 	.pd_qnawrite_pop .push_box dl {color:#222; font-size:16px;}
 	.pd_qnawrite_pop .push_box dl dt {height:24px; margin-right:40px; line-height:24px; font-weight:300;}
@@ -2981,7 +3177,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 .info_txt ul li {position:relative; font-size:14px; color:#888; padding-left:15px; margin-bottom:10px; 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;}
 	.pd_pop .full_popup_wrap {}
@@ -2993,7 +3189,7 @@ ul.maintabs li [class^='box_depth'] {display:none; position:absolute; left:100%;
 	.pd_pop .full_popup_wrap .full_pop_header .item_prod .item_state a.itemLink {display:table-cell; height:120px; padding:0 0 0 110px; vertical-align:middle;}
 	.pd_pop .full_popup_wrap .full_pop_header .item_prod .item_state .itemPic {position:absolute; left:0; top:0; width:80px; height:120px; padding:0; margin:0}
 	.pd_pop .full_popup_wrap .full_pop_header .item_prod .item_state .itemBrand {margin:0}
-	.pd_pop .full_popup_wrap .full_pop_header .item_prod .item_state .itemName {margin:15px 0 0}
+	.pd_pop .full_popup_wrap .full_pop_header .item_prod .item_state .itemName {height:14px; line-height:14px; margin:15px 0 0}
 	.pd_pop .full_popup_wrap .full_pop_header .item_prod .item_state .itemPrice {margin:20px 0 0}
 	.pd_pop .full_popup_wrap .full_pop_header .item_prod .item_state .itemPercent {position:relative; top:auto; right:auto;}
 	.pd_pop .full_popup_wrap .full_pop_header .select_custom {width:50%; height:auto;}
@@ -3001,7 +3197,12 @@ ul.maintabs li [class^='box_depth'] {display:none; position:absolute; left:100%;
 	.pd_pop .full_popup_wrap .full_pop_header .select_custom .combo .list {top:120px}
 	.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 .full_pop_container {width:100%; padding:0px;}
+	.pd_pop.full_pop.pd_itemthumb_pop .full_pop_container .scaleview {display:block; text-align:center; margin-top:40px;}
+	.pd_pop.full_pop.pd_itemthumb_pop .full_pop_container .scaleview:first-child {margin-top:0}
+	.pd_pop.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;}
@@ -3020,24 +3221,26 @@ ul.maintabs li [class^='box_depth'] {display:none; position:absolute; left:100%;
 	.pd_qnalist .info_txt ul li:last-child {margin-bottom:0;}
 	.pd_qnalist .info_txt ul li:after {content:''; position: absolute; top:5px; left:0; background:#858585; width:3px; height:3px;}
 	.pd_qnalist .info_txt .btn_box {float:right;}
-	.qna_list {margin-top:80px}
-	.qna_list .ui_row {margin-top:20px}
-	.qna_list .nodata {padding-top:120px; border-top:1px solid #222; text-align:center;}
-	.qna_list .nodata .txt_box {color:#666; font-size:16px; font-weight:300; line-height:26px;}
-	.qna_list .nodata .txt_box::before {content:''; display:block; width:36px; height:46px; margin:0 auto 24px; background:url('/images/pc/ico_content_none.png') no-repeat;}
-	.qna_list .form_field input[type="checkbox"] + label {line-height:1;}
-	.qna_list .form_field input[type="checkbox"] + label:before,
-	.qna_list .form_field input[type="checkbox"] + label:after {top:50%; transform:translateY(-50%);}
-	.qna_list .case1 .fold_head .fold_tit span {float:left; display:inline-block; position:relative; width:auto; max-width:600px;}
-	.qna_list .case1 .fold_head .data [class^="wr_"] {display:inline-block; width:100px; text-align:center;}
-	.qna_list .fold_cont .img_group .thumb_pic {background:#fff;}
-	.qna_list .fold_cont .img_group .thumb_pic img{position:absolute; left:50%; right:0; top:50%; bottom:auto; transform:translate(-50%, -50%); width:auto; height:auto; max-height:100%; max-width:100%; margin:auto 0; cursor:pointer;}
-	.qna_list .case1 .my_qna .fold_head,
-	.qna_list .case1 .my_qna .fold_head.on,
-	.qna_list .case1 .my_qna .fold_detail {background:#fff6f2;}
-	.qna_list .fold_head .fold_tit .ico {float:left; display:inline-block; width:auto; height:auto; margin-left:12px;}
-	.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}
-	.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%;}
+	.pd_qnalist .info_txt .btn_box button {height:42px; padding-left:24px; padding-right:24px; font-size:14px;}
+	.pd_qnalist .info_txt .btn_box button span {display:inline-block; line-height:1;}
+	.pd_qnalist .qna_list {margin-top:80px}
+	.pd_qnalist .qna_list .ui_row {margin-top:20px}
+	.pd_qnalist .qna_list .nodata {padding-top:120px; border-top:1px solid #222; text-align:center;}
+	.pd_qnalist .qna_list .nodata .txt_box {color:#666; font-size:16px; font-weight:300; line-height:26px;}
+	.pd_qnalist .qna_list .nodata .txt_box::before {content:''; display:block; width:36px; height:46px; margin:0 auto 24px; background:url('/images/pc/ico_content_none.png') no-repeat;}
+	.pd_qnalist .qna_list .form_field input[type="checkbox"] + label {line-height:1;}
+	.pd_qnalist .qna_list .form_field input[type="checkbox"] + label:before,
+	.pd_qnalist .qna_list .form_field input[type="checkbox"]:checked + label:after {top:50%; transform:translateY(-50%);}
+	.pd_qnalist .qna_list .case1 .fold_head .fold_tit span {float:left; display:inline-block; position:relative; width:auto; max-width:600px;}
+	.pd_qnalist .qna_list .case1 .fold_head .data [class^="wr_"] {display:inline-block; width:100px; text-align:center;}
+	.pd_qnalist .qna_list .fold_cont .img_group .thumb_pic {background:#fff;}
+	.pd_qnalist .qna_list .fold_cont .img_group .thumb_pic img{position:absolute; left:50%; right:0; top:50%; bottom:auto; transform:translate(-50%, -50%); width:auto; height:auto; max-height:100%; max-width:100%; margin:auto 0; cursor:pointer;}
+	.pd_qnalist .qna_list .case1 .my_qna .fold_head,
+	.pd_qnalist .qna_list .case1 .my_qna .fold_head.on,
+	.pd_qnalist .qna_list .case1 .my_qna .fold_detail {background:#fff6f2;}
+	.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%;}
 
 	/* pd_pop > 상품리뷰 페이지 */
 	.pd_review_pop {}
@@ -3074,7 +3277,7 @@ ul.maintabs li [class^='box_depth'] {display:none; position:absolute; left:100%;
 	.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;}
-	.pd_review .area_rv_average .star_score .star {width:152px; height:24px; background:#ddd;}
+	.pd_review .area_rv_average .star_score .star {width:152px; height:24px; background:#f5f5f5;}
 	.pd_review .area_rv_average .star_score .star .progbar {display:inline-block; height:100%; background-color:#fd4802;}
 	.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;}
 
@@ -3120,7 +3323,7 @@ ul.maintabs li [class^='box_depth'] {display:none; position:absolute; left:100%;
 	.pd_review .area_rv_best .best_review a {display:block;position:relative;height:222px;padding:30px 30px 30px 215px;padding: 30px;border:1px solid #eee;}
 	.pd_review .area_rv_best .best_review a .pic {position: relative;float: left;width:162px;height: 162px;margin-right: 23px;}
 	.pd_review .area_rv_best .best_review a .star_score {margin-top:7px; height:14px;}
-	.pd_review .area_rv_best .best_review a .star_score .star {display:inline-block; position:relative; width:102px; height:17px; background:#ddd;}
+	.pd_review .area_rv_best .best_review a .star_score .star {display:inline-block; position:relative; width:102px; height:17px; background:#f5f5f5;}
 	.pd_review .area_rv_best .best_review a .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_best .best_review a .star_score .star .progbar {display:inline-block; height:100%; background:#fd4802}
 	.pd_review .area_rv_best .best_review a .star_score .ico {margin-left:10px}
@@ -3137,20 +3340,28 @@ ul.maintabs li [class^='box_depth'] {display:none; position:absolute; left:100%;
 
 	.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;}
-	.pd_review .area_rv_all .selection {position:absolute; right:0; top:-16px; width:800px; z-index:2;}
-	.pd_review .area_rv_all .selection .select_custom {margin-left:10px;}
+	.pd_review .area_rv_all .selection {position:absolute; right:0; top:-16px; width:750px; z-index:2;}
+	.pd_review .area_rv_all .selection .select_custom {height:42px; margin-left:10px;}
+	.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 {max-height:250px; overflow-y:auto;}
+	.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-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 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;}
+	.pd_review .area_rv_all .selection .select_custom .star_score .star {float:left; margin-left:8px;}
+	.pd_review .area_rv_all .selection .select_custom .star_score .star .progbar {float:left;}
+	.pd_review .area_rv_all .selection .select_custom .combo .select .star_score .star {margin-top:-2px;}
+	.pd_review .area_rv_all .selection .select_custom.on .combo .select {border-bottom:1px solid #ddd}
+
 	.pd_review .area_rv_all .review_list {border-top:1px solid #ddd;}
 	.pd_review .area_rv_all .review_list > ul > li {padding:30px 0; border-bottom:1px solid #ddd; }
 	.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:#ddd;}
+	.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::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;}
@@ -3384,8 +3595,7 @@ ul.maintabs li [class^='box_depth'] {display:none; position:absolute; left:100%;
 	.container.my .wrap .content .cont_body {margin-bottom: 150px;}
 	.my .lnb_list::after {display: none;}
 	.my .subH2 {margin-bottom: 25px; font-size: 26px;}
-	.my .cont .sec_head h3,
-	.my .my_cont .sec_head h3 {display: inline-block; font-size:32px; font-weight:500;}
+	.my .cont .sec_head h3 {display: inline-block; font-size:32px; font-weight:500;}
 	.my .btn.btn_sm {font-size: 14px;}
 	.my .select {font-size: 14px;}
 	.my .select_dress {padding:12px 20px;}
@@ -3396,10 +3606,9 @@ ul.maintabs li [class^='box_depth'] {display:none; position:absolute; left:100%;
 	.my .radio_field input[type="radio"] + label:before {background-position: 0 0;}
 	.my .radio_field input[type="radio"]:checked + label:after {background-position: -20px 0;}
 
-	.my .sec_head {position: relative; font-size: 0;}
-	.my .sec_head h3 {display: inline-block; font-size:30px; font-weight:500; margin-bottom: 0; vertical-align: middle;}
-	.my .sec_head .mem_name {margin-bottom: 30px; font-weight: 200; color: #898989;}
-	.my .sec_head .mem_name strong {color: #000; font-weight: 500;}
+	.my .sec_head {position: relative;}
+	.my .sec_head .mem_name {margin-bottom:30px; color:#666; font-size:30px; font-weight:200; vertical-align:bottom;}
+	.my .sec_head .mem_name strong {display:inline-block; color:#000; font-weight:500;}
 	.my .sec_head .od_detail {display: inline-block; margin:0 10px; font-size: 24px; font-weight: 200; color:#888; vertical-align: middle;}
 	.my .sec_head .od_del_btn {padding:6px 14px; background:#f5f5f5; border:none; color:#222; font-size:14px; vertical-align: middle;}
 	

+ 44 - 6
src/main/webapp/ux/pc/js/common-ui.js

@@ -54,6 +54,40 @@ $(document).ready(function(){
 		history.back()
 	});
 
+	//통합검색 - 레이어 열고닫기
+	$(document).on('click','.common_header .search .promotion_search, .common_header .search .btn_open_search',function(e){
+		$('body').addClass('lock');
+		$("#header .common_search").addClass('active'); 
+		return false;
+	}).on('click','.common_search .btn_close_search',function(e){
+		$("#header .common_search").removeClass('active'); 
+		$('body').removeClass('lock');
+		return false;
+	});		
+
+	//통합검색 - 검색어 입력 시 
+	$(document).on('keyup','.common_search .area_input input',function(e){
+		var searchValue = $(this).val();
+		if(searchValue.length > 0) {
+			$('.common_search .area_result .default_box').hide();	
+			$('.common_search .area_result .searching_box').show();	
+		} else if (searchValue.length == 0) {
+			$('.common_search .area_result .searching_box').hide();	
+			$('.common_search .area_result .default_box').show();	
+		}
+	});
+
+	//통합검색 - 슬라이드 컨트롤러 > 지금 고객님들이 많이 보고 있어요 
+	$(document).on('click','.common_search .realtime_slider .btn_pause',function(e){
+		realtimeItemSwiper.autoplay.stop();
+		$(this).hide();
+		$('.common_search .realtime_slider .btn_play').show();
+	}).on('click','.common_search .realtime_slider .btn_play',function(e){
+		realtimeItemSwiper.autoplay.start();
+		$(this).hide();
+		$('.common_search .realtime_slider .btn_pause').show();
+	});
+
 });
 /* * * * * * * * * * * * * * * * * * * * * * * 
 
@@ -116,7 +150,6 @@ $(document).ready(function() {
 	}
 });
 
-
 // check-All
 $( document ).ready(function() {
 	var $chkAll = $('.check-all');
@@ -225,7 +258,8 @@ function sCombo(selector){
 	sCombo.prototype.listSelect = function($target){
 		$target.addClass('selected').siblings('li').removeClass('selected');
 		this.$selectBox.removeClass('on');
-		this.$select.text($target.text());
+		//this.$select.text($target.text());
+		this.$select.html($target.html());
 		this.$list.css('display', 'none');
 	}
 	sCombo.prototype.listOff = function($target){
@@ -308,12 +342,16 @@ $(document).ready( function() {
 	});
 
 	/* 상품상세 > 상품문의 _accordion */
-	$(document).on('click','.pd_qnalist_pop .foldGroup .fold_head',function(e){
-		$(this).parents('.foldGroup li').find('.fold_cont').slideToggle(100);
-		$(this).toggleClass('on');
-		return false;
+	$(document).on('click','.pd_qnalist .foldGroup .fold_head',function(e){
+		if($(this).parent().hasClass('secret_qna')){
+			alert('비밀글은 열람하실 수 없습니다.');
+		}else {
+			$(this).parents('.foldGroup li').find('.fold_cont').slideToggle(100);
+			$(this).toggleClass('on');
+		}
 	});
 	
+	
 	/* 아이디/비밀번호 찾기_accordion:open */
 	$(document).on('click','.mb .foldGroup.checkcase .fold_head',function(e){	
 		$(this).parents('.foldGroup li').find('.fold_cont').slideDown(100);

+ 0 - 0
src/main/webapp/ux/pc/js/cart.js → src/main/webapp/ux/pc/js/mypage.js


+ 19 - 2
src/main/webapp/ux/style24_link.js

@@ -6,6 +6,7 @@ const _PAGE_LOGOUT = _frontUrl + "/logout";	// GNB > 로그아웃
 
 //== 메인 ==/
 const _PAGE_MAIN = _frontUrl + "/display/mall/main/form";	// 몰메인
+const _PAGE_ALL_BRAND = _frontUrl + "/display/all/brand/form";	// 전체 브랜드
 
 //== 고객 ==/
 const _PAGE_CUSTOMER_JOIN_TYPE = _frontUrl + "/customer/join/type/form";							// 고객 > 회원가입 유형
@@ -18,6 +19,7 @@ const _PAGE_CUSTOMER_PWD_CHANGE_FIND = _frontUrl + "/customer/password/change/fo
 const _PAGE_CUSTOMER_PWD_CHANGE_TEMP = _frontUrl + "/customer/password/change/form?pageGb=temp";	// 고객 > 임시비밀번호 로그인 > 비밀번호 변경 화면
 const _PAGE_CUSTOMER_DORMANT = _frontUrl + "/customer/dormant/certify/form";						// 고객 > 휴면회원
 const _PAGE_CUSTOMER_DORMANT_COMPLETE = _frontUrl + "/customer/dormant/certify/complete/form";		// 고객 > 휴면회원 > 완료페이지
+const _PAGE_CUSTOMER_CERTIFICATION = "/customer/certification/form"									// 고객 > 본인인증화면
 
 //== 상품상세 ==/
 const _PAGE_GOODS_DETAIL = _frontUrl + "/goods/detail/form?goodsCd=";								// 상품 상세
@@ -33,6 +35,7 @@ const _PAGE_GOODS_REVIEW_LAYER = _frontUrl + "/goods/review/layer/";								// 
 const _PAGE_GOODS_REVIEW_BEST_LAYER = _frontUrl + "/goods/review/best/layer/";						// 상품평- 베스트 리뷰 (list)
 const _PAGE_GOODS_REVIEW_PHOTO_LAYER = _frontUrl + "/goods/review/photo/layer/";					// 상품평- 포토/영상 리뷰 (list)
 const _PAGE_GOODS_REVIEW_PHOTO_DETAIL_LAYER = _frontUrl + "/goods/review/photo/detail/layer/";		// 상품평- 포토/영상 리뷰 (detail)
+const _PAGE_GOODS_CPN_DOWNLOAD = "/goods/coupon/download";											// 상품쿠폰다운로드
 
 //== 장바구니 ==/
 
@@ -62,6 +65,8 @@ const _PAGE_WISHLIST_DEL = _frontUrl + "/mypage/wish/list/delete";				// 위시
 const _PAGE_PLANNING_MAIN = _frontUrl + "/planning/main/form"; 					// 기획전 메인
 const _PAGE_PLANNING_DETAIL = _frontUrl + "/planning/detail/form";				// 기획전 상세
 
+//== 핫딜==/
+const _PAGE_SOCIAL_MAIN = _frontUrl + "/social/main/form";						// 소설(핫딜) 메인
 
 //== 이벤트 ==/
 const _PAGE_EVENT_MAIN = _frontUrl + "/planning/event/main/form"; 					// 이벤트 메인
@@ -416,6 +421,12 @@ function cfCardInfo() {
 * </pre>
 */
 function cfGoodsCouponInfo(goodsCd) {
+	
+	if (!cfCheckLogin()) {
+		cfnGoToPage(_PAGE_LOGIN);
+		return false;
+	}
+	
 	var str = '<div class="modal fade pd_pop salecoupon_pop" id="layer_goods_coupon" tabindex="-1" role="dialog" aria-labelledby="saleCouponLabel" aria-hidden="true">';
 
 	if ($('#layer_goods_coupon').length == 0) {
@@ -451,14 +462,14 @@ function cfGoodsShopBenefitInfo(goodsCd) {
 *		cfGoodsSizeInfo(goodsCd);
 * </pre>
 */
-function cfGoodsSizeInfo(goodsCd) {
+function cfGoodsSizeInfo(goodsCd, colorCd) {
 	var str = '<div class="modal fade pd_pop info_size_pop" id="layer_size_info" tabindex="-1" role="dialog" aria-labelledby="infoSizeLabel" aria-hidden="true">';
 
 	if ($('#layer_size_info').length == 0) {
 		$('body').append(str);
 	}
 
-	cfOpenLayer(_PAGE_GOODS_SIZEINFO_LAYER+goodsCd, 'layer_size_info');
+	cfOpenLayer(_PAGE_GOODS_SIZEINFO_LAYER+goodsCd +'/'+colorCd, 'layer_size_info');
 }
 
 /**
@@ -470,6 +481,12 @@ function cfGoodsSizeInfo(goodsCd) {
 * </pre>
 */
 function cfGoodsInstockAlarmInfo(goodsCd, colorCd) {
+
+	if (!cfCheckLogin()) {
+		cfnGoToPage(_PAGE_LOGIN);
+		return false;
+	}
+	
 	var str = '<div class="modal fade pd_pop push_restock_pop" id="layer_instock_alarm" tabindex="-1" role="dialog" aria-labelledby="pushRestockLabel" aria-hidden="true">';
 
 	if ($('#layer_instock_alarm').length == 0) {