Ver código fonte

Merge branch 'develop' of http://112.172.147.34:4936/style24/style24.front.git into develop

gagamel 5 anos atrás
pai
commit
dcbd72cab7
46 arquivos alterados com 1741 adições e 1156 exclusões
  1. 29 0
      src/main/java/com/style24/front/biz/dao/TsfCustomerDao.java
  2. 23 1
      src/main/java/com/style24/front/biz/dao/TsfGoodsDao.java
  3. 24 1
      src/main/java/com/style24/front/biz/dao/TsfSocialDao.java
  4. 81 43
      src/main/java/com/style24/front/biz/service/TsfCartService.java
  5. 99 1
      src/main/java/com/style24/front/biz/service/TsfCustomerService.java
  6. 57 0
      src/main/java/com/style24/front/biz/service/TsfGoodsService.java
  7. 2 2
      src/main/java/com/style24/front/biz/service/TsfOrderService.java
  8. 53 0
      src/main/java/com/style24/front/biz/service/TsfSocialService.java
  9. 3 0
      src/main/java/com/style24/front/biz/web/TsfCartController.java
  10. 91 7
      src/main/java/com/style24/front/biz/web/TsfCustomerController.java
  11. 65 3
      src/main/java/com/style24/front/biz/web/TsfGoodsController.java
  12. 20 6
      src/main/java/com/style24/front/biz/web/TsfOrderController.java
  13. 54 0
      src/main/java/com/style24/front/biz/web/TsfSocialController.java
  14. 22 0
      src/main/java/com/style24/front/support/exception/TsfNonCertificationAccountException.java
  15. 16 2
      src/main/java/com/style24/front/support/security/TsfAuthenticationProvider.java
  16. 3 0
      src/main/java/com/style24/front/support/security/handler/TsfLoginFailureHandler.java
  17. 16 1
      src/main/java/com/style24/front/support/security/handler/TsfLoginSuccessHandler.java
  18. 4 1
      src/main/java/com/style24/persistence/domain/Login.java
  19. 36 0
      src/main/java/com/style24/persistence/domain/Measurement.java
  20. 29 0
      src/main/java/com/style24/persistence/domain/SizeInfo.java
  21. 9 1
      src/main/java/com/style24/persistence/domain/Social.java
  22. 4 0
      src/main/java/com/style24/persistence/domain/WishList.java
  23. 15 5
      src/main/java/com/style24/persistence/mybatis/shop/TsfCart.xml
  24. 65 23
      src/main/java/com/style24/persistence/mybatis/shop/TsfCustomer.xml
  25. 47 5
      src/main/java/com/style24/persistence/mybatis/shop/TsfGoods.xml
  26. 20 17
      src/main/java/com/style24/persistence/mybatis/shop/TsfLogin.xml
  27. 74 0
      src/main/java/com/style24/persistence/mybatis/shop/TsfSocial.xml
  28. 2 0
      src/main/resources/i18n/messages/message_ko_KR.properties
  29. 9 1
      src/main/webapp/WEB-INF/views/web/SigninFormWeb.html
  30. 10 4
      src/main/webapp/WEB-INF/views/web/cart/cartChangeOptionPopupWeb.html
  31. 89 55
      src/main/webapp/WEB-INF/views/web/cart/cartListAjaxFormWeb.html
  32. 1 1
      src/main/webapp/WEB-INF/views/web/common/fragments/GnbWeb.html
  33. 80 0
      src/main/webapp/WEB-INF/views/web/customer/CertificationFormWeb.html
  34. 5 1
      src/main/webapp/WEB-INF/views/web/customer/DormantCertifyFormWeb.html
  35. 80 0
      src/main/webapp/WEB-INF/views/web/customer/PasswordCampaignFormWeb.html
  36. 10 3
      src/main/webapp/WEB-INF/views/web/customer/PasswordChangeFormWeb.html
  37. 43 36
      src/main/webapp/WEB-INF/views/web/goods/GoodsDetailFormWeb.html
  38. 40 3
      src/main/webapp/WEB-INF/views/web/goods/GoodsInstockAlarmFormWeb.html
  39. 55 874
      src/main/webapp/WEB-INF/views/web/goods/GoodsSizeInfoFormWeb.html
  40. 2 2
      src/main/webapp/WEB-INF/views/web/mypage/MypageReturnFormWeb.html
  41. 1 1
      src/main/webapp/WEB-INF/views/web/order/OrderDcAmtInfoWeb.html
  42. 211 53
      src/main/webapp/WEB-INF/views/web/order/OrderFormWeb.html
  43. 2 0
      src/main/webapp/WEB-INF/views/web/order/OrderPaymentInfoWeb.html
  44. 120 0
      src/main/webapp/WEB-INF/views/web/social/SocialMainFormWeb.html
  45. BIN
      src/main/webapp/images/pc/thumb/hotdeal_bg.png
  46. 20 3
      src/main/webapp/ux/style24_link.js

+ 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);
 }

+ 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);
+	
 }

+ 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);
+	
+	
 }

+ 81 - 43
src/main/java/com/style24/front/biz/service/TsfCartService.java

@@ -58,7 +58,7 @@ public class TsfCartService {
 	 * @param params
 	 */
 	public void saveCartInfo(Collection<Cart> params) {
-		Cart cart = new Cart();
+		String goodsType = "";
 
 		// 로그인 유무 확인 (로그인이 되어 있지 않으면 regNo 를 0으로 장바구니에 저장한다.)
 		Login login = new Login();
@@ -70,10 +70,6 @@ public class TsfCartService {
 
 		// 장바구니 상품 및 재고 가능 여부 체크
 		for (Cart param : params) {
-			cart.setJsessionId(TscSession.getSessionId());
-			cart.setRegNo(login.getCustNo());
-			cart.setUpdNo(login.getCustNo());
-			cart.setCustNo(login.getCustNo());
 
 			// 상품 마스터 정보 확인
 			Goods goods = new Goods();
@@ -102,24 +98,22 @@ public class TsfCartService {
 				throw new IllegalArgumentException(stockResult);
 			}
 
-			cart.setGoodsCd(param.getGoodsCd());
-
 			// 장바구니에 있는 같은 상품(옵션이 상이해도 같은 상품이므로 상품 전체 조회)
 			int goodsCartCnt = cartDao.getHasGoodsCartCnt(param);
 			if (param.getGoodsQty() + goodsCartCnt > goods.getDayMaxOrdQty()) {
 				throw new IllegalArgumentException("1일 구매한도 수량이 초과되었습니다.");
 			}
 
-			cart = param;
+			goodsType = param.getGoodsType();
 		}
 
 		// 장바구니 정보 수정
-		if (cart.getGoodsType().equals(TscConstants.GoodsType.SET.value())) {
+		if (goodsType.equals(TscConstants.GoodsType.SET.value())) {
 			// 세트상품일 경우
 			saveSetTypeCartInfo(params);
 		} else {
 			// 세트 상품이 아닐 경우
-			saveNormalDealCartInfo(params.iterator().next());
+			saveNormalDealCartInfo(params);
 		}
 	}
 
@@ -169,8 +163,12 @@ public class TsfCartService {
 		cart.setGoodsType(params.iterator().next().getGoodsType());
 		cart.setItemCdSql(sb.toString());
 
+		Collection<Cart> cartSqList = null;
+
 		if (!StringUtils.isEmpty(params.iterator().next().getCartGb()) && "C".equals(params.iterator().next().getCartGb())) {
 			cart.setCartGb(TscConstants.CartGb.CART.value());
+			cartSqList = cartDao.selectHasSetItemCartList(cart);
+			// 같은 장바구니 상품 확인
 		} else if (!StringUtils.isEmpty(params.iterator().next().getCartGb()) && "O".equals(params.iterator().next().getCartGb())) {
 			if ("P".equals(TsfSession.getFrontGb())) {
 				cart.setCartGb(TscConstants.CartGb.PC_ORDER.value());
@@ -181,9 +179,6 @@ public class TsfCartService {
 			cart.setCartGb(TscConstants.CartGb.CREATE_ORDER.value());
 		}
 
-		// 같은 장바구니 상품 확인
-		Collection<Cart> cartSqList = cartDao.selectHasSetItemCartList(cart);
-
 		if (cartSqList != null && cartSqList.size() > 0) {		// 장바구니 기존재
 			if (cartSqList.size() > 1) {						// 장바구니 조회 결과 이상시 insert or select 수정 필요
 				throw new IllegalArgumentException("장바구니 조회에 실패하였습니다. 관리자에게 문의해주세요.");
@@ -195,6 +190,9 @@ public class TsfCartService {
 		} else {
 			cartDao.insertCartInfo(cart);					// 장바구니 마스터 정보 저장
 			cartDao.insertCartHst(cart);                    // 장바구니 이력 정보 저장
+
+			TsfSession.setAttribute("cartSqArr", cart.getCartSq()+"");
+
 			for (Cart param : params) {
 				param.setCartSq(cart.getCartSq());
 				param.setRegNo(cart.getRegNo());
@@ -203,55 +201,81 @@ public class TsfCartService {
 
 				cartDao.insertCartDetailInfo(param);		// 장바구니 상세 저장
 				cartDao.insertCartDetailHst(param);         // 장바구니 상세 이력 저장
+
+				log.info("CHECK INFO PARAM :::: {}", param.toString());
 			}
 		}
 	}
 
 	@Transactional("shopTxnManager")
-	public void saveNormalDealCartInfo(Cart param) {
+	public void saveNormalDealCartInfo(Collection<Cart> params) {
+		Cart cart = new Cart();
 		// 로그인 정보
 		if(TsfSession.isLogin()) {
 			Login login = TsfSession.getInfo();
-			param.setRegNo(login.getCustNo());
-			param.setCustNo(login.getCustNo());
-			param.setUpdNo(login.getCustNo());
+			cart.setCustNo(login.getCustNo());
 		} else {
-			param.setCustNo(0);
-			param.setRegNo(0);
-			param.setUpdNo(0);
+			cart.setCustNo(0);
 		}
-		param.setJsessionId(TscSession.getSessionId());
-
+		cart.setJsessionId(TscSession.getSessionId());
 
-		if ("C".equals(param.getCartGb())) {
-			param.setCartGb(TscConstants.CartGb.CART.value());
-		} else if ("O".equals(param.getCartGb())) {
+		if (!StringUtils.isEmpty(params.iterator().next().getCartGb()) && "C".equals(params.iterator().next().getCartGb())) {
+			cart.setCartGb(TscConstants.CartGb.CART.value());
+		} else if (!StringUtils.isEmpty(params.iterator().next().getCartGb()) && "O".equals(params.iterator().next().getCartGb())) {
 			if ("P".equals(TsfSession.getFrontGb())) {
-				param.setCartGb(TscConstants.CartGb.PC_ORDER.value());
+				cart.setCartGb(TscConstants.CartGb.PC_ORDER.value());
 			} else {
-				param.setCartGb(TscConstants.CartGb.MOB_ORDER.value());
+				cart.setCartGb(TscConstants.CartGb.MOB_ORDER.value());
 			}
 		} else {
-			param.setCartGb(TscConstants.CartGb.CREATE_ORDER.value());
+			cart.setCartGb(TscConstants.CartGb.CREATE_ORDER.value());
 		}
 
-		// 같은 장바구니 상품 확인
-		Collection<Integer> cartSqList = cartDao.selectHasNormalDealItemCartList(param);
+		// 세션 추가용 변수
+		List<String> sendCartSqList = new ArrayList<String>();
+		for(Cart item : params) {
+			item.setCartGb(cart.getCartGb());
+			item.setCustNo(cart.getCustNo());
+			item.setRegNo(cart.getCustNo());
+			item.setUpdNo(cart.getCustNo());
+			item.setJsessionId(cart.getJsessionId());
 
-		if (cartSqList != null && cartSqList.size() > 0) {		// 장바구니 기존재
-			if (cartSqList.size() > 1) {							// 장바구니 조회 결과 이상시 insert or select 수정 필요
-				throw new IllegalArgumentException("장바구니 조회에 실패하였습니다. 관리자에게 문의해주세요.");
+			// 같은 장바구니 상품 확인
+			Collection<Integer> cartSqList = null;
+			if(TscConstants.CartGb.CART.value().equals(cart.getCartGb())) {
+				cartSqList = cartDao.selectHasNormalDealItemCartList(item);
+			}
+
+			if (cartSqList != null && cartSqList.size() > 0) {			// 장바구니 기존재
+				if (cartSqList.size() > 1) {							// 장바구니 조회 결과 이상시 insert or select 수정 필요
+					throw new IllegalArgumentException("장바구니 조회에 실패하였습니다. 관리자에게 문의해주세요.");
+				} else {
+					item.setCartSq(cartSqList.iterator().next());
+					cartDao.updateCartInfo(item);
+					cartDao.insertCartHst(item);                // 장바구니 수정 이력 저장
+				}
 			} else {
-				param.setCartSq(cartSqList.iterator().next());
-				cartDao.updateCartInfo(param);
-				cartDao.insertCartHst(param);                // 장바구니 수정 이력 저장
+				cartDao.insertCartInfo(item);					// 장바구니 마스터 정보 저장
+				cartDao.insertCartHst(item);					// 장바구니 수정 이력 저장
+				cartDao.insertCartDetailInfo(item);				// 장바구니 상세 저장
+				cartDao.insertCartDetailHst(item);				// 장바구니 수정 이력 저장
+
+				sendCartSqList.add(item.getCartSq() + "");
 			}
-		} else {
-			cartDao.insertCartInfo(param);					// 장바구니 마스터 정보 저장
-			cartDao.insertCartHst(param);                   // 장바구니 수정 이력 저장
-			cartDao.insertCartDetailInfo(param);			// 장바구니 상세 저장
-			cartDao.insertCartDetailHst(param);             // 장바구니 수정 이력 저장
 		}
+
+		StringBuilder cartSqComma = new StringBuilder();
+
+		int i = 0;
+		for(String cartSq : sendCartSqList) {
+			if(i > 0) {
+				cartSqComma.append(",");
+			}
+			cartSqComma.append(cartSq);
+			i++;
+		}
+
+		TsfSession.setAttribute("cartSqArr", cartSqComma.toString());
 	}
 
 	// 장바구니 상품 리스트 조회 서비스
@@ -863,8 +887,22 @@ public class TsfCartService {
 				}
 			}
 		} else {
-			// TODO 세트가 아닐 경우 처리
-			int a = 0;
+			param.setCartGb(TscConstants.CartGb.CART.value());
+			Collection<Integer> cartSqList = cartDao.selectHasNormalDealItemCartList(param);
+			if (cartSqList != null && cartSqList.size() > 0) {			// 장바구니 기존재
+				if (cartSqList.size() > 1) {							// 장바구니 조회 결과 이상시 insert or select 수정 필요
+					throw new IllegalArgumentException("장바구니 조회에 실패하였습니다. 관리자에게 문의해주세요.");
+				} else {
+					param.setCartSq(cartSqList.iterator().next());
+					cartDao.updateCartInfo(param);
+					cartDao.insertCartHst(param);                // 장바구니 수정 이력 저장
+				}
+			} else {
+				/*cartDao.insertCartInfo(param);					// 장바구니 마스터 정보 저장
+				cartDao.insertCartHst(param);                   // 장바구니 수정 이력 저장
+				cartDao.insertCartDetailInfo(param);			// 장바구니 상세 저장
+				cartDao.insertCartDetailHst(param);             // 장바구니 수정 이력 저장*/
+			}
 		}
 	}
 }

+ 99 - 1
src/main/java/com/style24/front/biz/service/TsfCustomerService.java

@@ -77,7 +77,7 @@ public class TsfCustomerService {
 	}
 
 	/**
-	 * 고객정보찾기 -
+	 * 고객정보찾기
 	 *
 	 * @param custNo - 고객번호
 	 * @return Customer 고객정보
@@ -93,6 +93,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);
+	}
+
 
 	/**
 	 * 임시비밀번호 조회
@@ -634,6 +651,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 +690,81 @@ 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;
+	}
 }

+ 57 - 0
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;
@@ -467,4 +469,59 @@ public class TsfGoodsService {
 		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);
+	}
+	
 }

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

@@ -249,7 +249,7 @@ public class TsfOrderService {
 			} else if (TscConstants.PgGb.KAKAO.value().equals(param.getPgGb())) {
 				result = coreKakaoPayService.approveKakaoPayment(param);
 			} else if (TscConstants.PgGb.NAVER.value().equals(param.getPgGb())) {
-				result = null;
+				result = coreNaverPayService.approveNaverPayment(param);
 			} else {
 				throw new IllegalArgumentException("결제 수단이 잘못 입력되었습니다. 새로고침 후 다시 시도해주세요.");
 			}
@@ -265,7 +265,7 @@ public class TsfOrderService {
 				} else if (TscConstants.PgGb.KAKAO.value().equals(param.getPgGb())) {
 					coreKakaoPayService.cancelKakaoPayment(param);
 				} else if (TscConstants.PgGb.NAVER.value().equals(param.getPgGb())) {
-					result = null;
+					coreNaverPayService.cancelNaverPayment(param);
 				} else {
 					throw new IllegalArgumentException("결제 정보 저장 실패. 새로고침 후 다시 시작해주세요.");
 				}

+ 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);
+	}
+
+}

+ 3 - 0
src/main/java/com/style24/front/biz/web/TsfCartController.java

@@ -78,6 +78,7 @@ public class TsfCartController extends TsfBaseController {
 	 * 장바구니 등록
 	 * @param param
 	 * goodsCd : 상품코드 (세트 : 세트상품코드, 딜상품 : 원상품코드, 일반상품 : 상품코드)
+	 * dealGoodsCd : 딜상품코드
 	 * itemCd : 구성상품코드 (세트. 세트 아닐 경우 입력X)
 	 * optCd : 옵션코드
 	 * goodsType : 상품타입 (공통코드 G026)
@@ -132,6 +133,8 @@ public class TsfCartController extends TsfBaseController {
 		model.addAttribute("delvCartList", order.getDelvCartList());
 		model.addAttribute("IMG_PATH", env.getProperty("upload.goods.view"));
 
+		log.info("CHECK SESSION CARTSQARR INFO ::: {}", TsfSession.getAttribute("cartSqArr"));
+
 		return super.getDeviceViewName("cart/cartListAjaxForm");
 	}
 

+ 91 - 7
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("고객 정보가 없습니다. 다시 확인 해주세요.");
 		}
@@ -687,19 +703,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 +732,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);
+	}
 
 
 

+ 65 - 3
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;
@@ -27,10 +30,14 @@ 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.util.GagaCookieUtil;
 
 /**
@@ -349,7 +356,7 @@ public class TsfGoodsController extends TsfBaseController {
 	 * @param counsel - 상담정보
 	 * @return
 	 * @author gagamel
-	 * @since 2020. 12. 28
+	 * @since 2021. 3. 5
 	 */
 	@PostMapping("/qna/list")
 	@ResponseBody
@@ -463,17 +470,58 @@ public class TsfGoodsController extends TsfBaseController {
 	 * @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;
@@ -505,6 +553,20 @@ public class TsfGoodsController extends TsfBaseController {
 		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

+ 20 - 6
src/main/java/com/style24/front/biz/web/TsfOrderController.java

@@ -166,7 +166,7 @@ public class TsfOrderController extends TsfBaseController {
 		
 		mav.addObject("goodsTotCnt" 		, delvOrderMap.get("goodsTotCnt"));			// 총상품건수
 		mav.addObject("delvAllCartList" 	, delvOrderMap.get("delvAllCartList"));		// 전체배송목록
-		mav.addObject("delvCartGoodsList" 	, delvOrderMap.get("delvCartGoodsList"));	// 장바구니상품목록 sort
+		mav.addObject("delvFeeCdList" 		, delvOrderMap.get("delvFeeCdList"));		// 배송단위목록
 		mav.addObject("sumDelvFee" 			, delvOrderMap.get("sumDelvFee"));			// 배송비합계
 
 		// 4.2 할인정보(상품금액, 즉시할인, 다다익선, 선포인트, 적립예정포인트) 
@@ -775,12 +775,25 @@ public class TsfOrderController extends TsfBaseController {
 	 * @since 2021. 03. 04
 	 */
 	@PostMapping("/create/preOrder")
-	public ModelAndView createOrder(Order order) {
+	@ResponseBody
+	public ModelAndView createOrder(@RequestBody Order order) {
 		ModelAndView mav = new ModelAndView();
-		// TODO 주문 시작 데이터 처리
-
-
-
+		
+		// TODO 주문 시작 데이터 처리 
+		// 2021.03.09 주문데이타 등록 
+		// 1. 로그인체크 후 custNo 설정
+		if (TsfSession.isLogin()) {
+			order.setCustNo(TsfSession.getInfo().getCustNo());
+		} else {
+			order.setCustNo(0);
+		}
+		
+		order.setFrontGb(TsfSession.getFrontGb());
+		
+		// 2. 주문기본정보등록
+		coreOrderService.createPreOrder(order);
+		
+		
 
 
 
@@ -805,6 +818,7 @@ public class TsfOrderController extends TsfBaseController {
 		//model.addAttribute("payment", payment);
 
 		mav.setViewName(super.getDeviceViewName("pg/kcpOrder"));
+
 		return mav;
 		//return super.getDeviceViewName("pg/kcpOrder");
 	}

+ 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;
+	}
+	
+
+}

+ 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);

+ 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;
 
 }

+ 15 - 5
src/main/java/com/style24/persistence/mybatis/shop/TsfCart.xml

@@ -66,11 +66,19 @@
 	<select id="selectHasNormalDealItemCartList" parameterType="Cart" resultType="int">
 		/* TsfCart.selectHasNormalDealItemCartList : 장바구니 등록 일반 or 딜 상품 확인 */
 		SELECT C.CART_SQ
-		  FROM TB_CART C
-		 WHERE 1=1
-		   AND C.CUST_NO = #{custNo}
-		   AND C.JSESSION_ID = #{jsessionId}
-		   AND C.GOODS_CD = #{goodsCd}
+		FROM   TB_CART C
+		INNER  JOIN TB_CART_DETAIL CD
+		ON     C.CART_SQ = CD.CART_SQ
+		WHERE  1=1
+		<if test="custNo != null and custNo > 0">
+		AND    C.CUST_NO = #{custNo}
+		</if>
+		<if test="custNo == null or custNo == 0">
+		AND    C.JSESSION_ID = #{jsessionId}
+		</if>
+		AND    C.GOODS_CD = #{goodsCd}
+		AND    C.CART_GB = #{cartGb}
+		AND    CD.OPT_CD = #{optCd}
 	</select>
 
 	<!-- 장바구니 신규 등록 -->
@@ -122,6 +130,7 @@
 				, PRODUCT_NO
 				, PRODUCT_CODE
 				, ITEM_QTY
+				, ITEM_PRICE
 				, DISP_ORD
 				, REG_NO
 				, REG_DT
@@ -137,6 +146,7 @@
 			 , O.PRODUCT_NO
 			 , O.PRODUCT_CODE
 			 , IFNULL(GC.QTY, 1)
+			 , IFNULL(GC.COMPS_CURR_PRICE, G.CURR_PRICE)
 			 , IFNULL(GC.DISP_ORD, 1)						<!-- TB_GOODS_COMPOSE DISP_ORD 따라 CART_DETAIL도 동일하게 진행 -->
 			 , #{regNo}
 			 , CURRENT_TIMESTAMP

+ 65 - 23
src/main/java/com/style24/persistence/mybatis/shop/TsfCustomer.xml

@@ -445,28 +445,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 +473,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>

+ 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>

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

@@ -5,33 +5,36 @@
 	<!-- 로그인체크 정보 조회 -->
 	<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                                                 /*고객구분*/
+		     , 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}

+ 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 - 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)) {

+ 10 - 4
src/main/webapp/WEB-INF/views/web/cart/cartChangeOptionPopupWeb.html

@@ -108,7 +108,7 @@
 												<th:block th:if="${color.cartColorNm != null}">
 													<th:block th:each="size, index : ${color.cartSizeList}">
 														<div>
-															<input type="radio" name="rdi-optsize" th:id="|${'rdi-optsize' + size.goodsCd + '-' + size.optCd}|" th:value="${size.optCd}" th:checked="${size.cartOptCd != null}" th:disabled="${size.soldoutYn == 'Y' or cart.goodsQty < size.currStockQty}">
+															<input type="radio" name="rdi-optsize" th:id="|${'rdi-optsize' + size.goodsCd + '-' + size.optCd}|" th:value="${size.optCd}" th:checked="${size.cartOptCd != null}" th:disabled="${size.soldoutYn == 'Y' or cart.goodsQty > size.currStockQty}">
 															<label th:for="|${'rdi-optsize' + size.goodsCd + '-' + size.optCd}|"><span th:text="${size.optCd2}"></span></label>
 														</div>
 													</th:block>
@@ -217,12 +217,18 @@
 				, goodsQty : $("input[name=goodsQty]").val()
 			}
 		} else if(cart.goodsType != "G056_S" && cart.selfGoodsYn == "Y") {
-			alert("자사 일반");
+			data = {
+				  cartSq : cart.cartSq
+				, goodsCd : cart.goodsCd
+				, goodsType : cart.goodsType
+				, optCd : $(".selfGoodsSize").find("input[name=rdi-optsize]:checked").val()
+				, goodsQty : $("input[name=goodsQty]").val()
+			}
 		} else {
 			alert("입점업체");
 		}
 
-		$.ajax( {
+		/*$.ajax( {
 			type: "POST",
 			url : '/cart/change/option',
 			contentType: 'application/json',
@@ -233,7 +239,7 @@
 				$(".closeCartOptionModal").trigger("click");
 				getCartList();
 			}
-		});
+		});*/
 	}
 
 	$(".closeCartOptionModal").on("click", function() {

+ 89 - 55
src/main/webapp/WEB-INF/views/web/cart/cartListAjaxFormWeb.html

@@ -142,12 +142,17 @@
 												<button th:if="${cart.soldoutYn.equals('N')}" type="button" class="btn btn_primary btn_sm"><span>즉시구매</span></button>
 											</p>
 											<p class="util">
-                                        <span>
-                                            <button type="button" class="btn_favorite" th:classappend="${cart.wishCnt > 0} ? active"><span><i class="ico ico_like2"></i><em class="sr-only">관심상품 추가</em></span></button>
-                                        </span>
+										<span>
+											<button type="button" class="btn_favorite" th:classappend="${cart.wishCnt > 0} ? active" onclick="cfnPutWishList(this)" th:goodsCd="${cart.goodsCd}" th:ithrCd="${cart.ithrCd}" th:contentsLoc="${cart.contentsLoc}">
 												<span>
-                                            <button type="button" class="btn_delete" th:onclick="|deleteCart(${cart.cartSq})|"><span><i class="ico ico_trash"></i><em class="sr-only">상품삭제</em></span></button>
-                                        </span>
+													<i class="ico ico_like2"></i>
+													<em class="sr-only">관심상품 추가</em>
+												</span>
+											</button>
+										</span>
+												<span>
+											<button type="button" class="btn_delete" th:onclick="|deleteCart(${cart.cartSq})|"><span><i class="ico ico_trash"></i><em class="sr-only">상품삭제</em></span></button>
+										</span>
 											</p>
 										</div>
 									</div>
@@ -272,12 +277,12 @@
 												<button th:if="${cart.soldoutYn.equals('N')}" type="button" class="btn btn_primary btn_sm"><span>즉시구매</span></button>
 											</p>
 											<p class="util">
-                                        <span>
-                                            <button type="button" class="btn_favorite"><span><i class="ico ico_like2"></i><em class="sr-only">관심상품 추가</em></span></button>
-                                        </span>
+										<span>
+											<button type="button" class="btn_favorite" th:classappend="${cart.wishCnt > 0} ? active" onclick="cfnPutWishList(this)" th:goodsCd="${cart.goodsCd}" th:ithrCd="${cart.ithrCd}" th:contentsLoc="${cart.contentsLoc}"><span><i class="ico ico_like2"></i><em class="sr-only">관심상품 추가</em></span></button>
+										</span>
 												<span>
-                                            <button type="button" class="btn_delete" th:onclick="|deleteCart(${cart.cartSq})|"><span><i class="ico ico_trash"></i><em class="sr-only">상품삭제</em></span></button>
-                                        </span>
+											<button type="button" class="btn_delete" th:onclick="|deleteCart(${cart.cartSq})|"><span><i class="ico ico_trash"></i><em class="sr-only">상품삭제</em></span></button>
+										</span>
 											</p>
 										</div>
 									</div>
@@ -308,8 +313,8 @@
 			<div class="tit_box">
 				<h3>결제 정보</h3>
 				<span>
-                <em class="number" th:text="${order.totCartCnt}"></em>개의 상품
-            </span>
+				<em class="number" th:text="${order.totCartCnt}"></em>개의 상품
+			</span>
 			</div>
 			<div class="od_amount_box">
 				<dl>
@@ -364,10 +369,10 @@
 						<span class="availStdt"></span>&nbsp;~&nbsp;<span class="availEddt"></span>
 					</p>
 					<button type="button" class="btn_close_code" onClick="cancelCartCpn()">
-                    <span>
-                        <i class="ico ico_close1"></i>
-                        <em class="sr-only">닫기</em>
-                    </span>
+					<span>
+						<i class="ico ico_close1"></i>
+						<em class="sr-only">닫기</em>
+					</span>
 					</button>
 				</div>
 				<div class="info_coupon">
@@ -421,45 +426,74 @@
 		notApplyTmtbAreaList();
 
 		/* 세트상품 장바구니 */
-		/* let compsList = [];
+		/*let compsList = [];
 		let temp = new Object;
 		temp.goodsCd = "STYS00000042";
 		temp.itemCd = "14373746";
 		temp.optCd = "베이지110";
 		temp.goodsQty = 1;
 		temp.goodsType = "G056_S";
-		temp.cartGb = "C";
+		temp.cartGb = "O";
 		temp.afLinkCd = "afLinkCd";
 		temp.ithrCd = "G027_ZZZ";
 		temp.contentsLoc = "G028_YYY";
 		temp.planDtlSq = "123";
 		compsList.push(temp);
-
+		temp = new Object;
 		temp.goodsCd = "STYS00000042";
 		temp.itemCd = "14373769";
 		temp.optCd = "블루110";
 		temp.goodsQty = 1;
 		temp.goodsType = "G056_S";
-		temp.cartGb = "C";
+		temp.cartGb = "O";
 		temp.afLinkCd = "afLinkCd";
 		temp.ithrCd = "G027_ZZZ";
 		temp.contentsLoc = "G028_YYY";
 		temp.planDtlSq = "123";
 		compsList.push(temp);
-
+		temp = new Object;
 		temp.goodsCd = "STYS00000042";
 		temp.itemCd = "14373770";
 		temp.optCd = "아이보리110";
 		temp.goodsQty = 1;
 		temp.goodsType = "G056_S";
-		temp.cartGb = "C";
+		temp.cartGb = "O";
+		temp.afLinkCd = "afLinkCd";
+		temp.ithrCd = "G027_ZZZ";
+		temp.contentsLoc = "G028_YYY";
+		temp.planDtlSq = "123";
+		compsList.push(temp);
+
+		cfnAddCart(compsList);*/
+
+		/*let compsList = [];
+		let temp = new Object;
+		temp.goodsCd = "14373686";
+		temp.optCd = "챠콜그레이150";
+		temp.goodsQty = 2;
+		temp.goodsType = "G056_D";
+		temp.dealGoodsCd = "STYD000000025"
+		temp.cartGb = "O";
+		temp.afLinkCd = "afLinkCd";
+		temp.ithrCd = "G027_ZZZ";
+		temp.contentsLoc = "G028_YYY";
+		temp.planDtlSq = "123";
+		compsList.push(temp);
+
+		temp = new Object;
+		temp.goodsCd = "14373710";
+		temp.optCd = "L핑크130";
+		temp.goodsQty = 3;
+		temp.goodsType = "G056_D";
+		temp.dealGoodsCd = "STYD000000025"
+		temp.cartGb = "O";
 		temp.afLinkCd = "afLinkCd";
 		temp.ithrCd = "G027_ZZZ";
 		temp.contentsLoc = "G028_YYY";
 		temp.planDtlSq = "123";
 		compsList.push(temp);
 
-		cfnAddCart(compsList); */
+		cfnAddCart(compsList);*/
 	});
 
 	function notApplyTmtbAreaList() {
@@ -480,7 +514,7 @@
 				notApplyQtyTmtbList.push(obj);
 			}
 
-			if($(this).parent().find("input[name=applyAmtSectionYn]").val() == "N") {       // 다다익선 금액은 기본상품만 가져오면됨 (N은 기본상품에 걸려있음)
+			if($(this).parent().find("input[name=applyAmtSectionYn]").val() == "N") {	   // 다다익선 금액은 기본상품만 가져오면됨 (N은 기본상품에 걸려있음)
 				let obj = new Object();
 				obj.tmtbSq = $(this).parent().find("input[name=amtTmtbSq]").val();
 				obj.tmtbNm = $(this).parent().find("input[name=amtTmtbNm]").val();
@@ -548,41 +582,41 @@
 			for(let j = 0 ; j < tmtb.goodsList.length ; j++) {
 				let goods = tmtb.goodsList[j];
 				tmtbHtml += '<div class="item_gd">\n' +
-					'                <figure>\n' +
-					'                    <a href="">\n' +
-					'                        <span class="thumb"><img src="';
+					'				<figure>\n' +
+					'					<a href="">\n' +
+					'						<span class="thumb"><img src="';
 				tmtbHtml += goods.imgPath;
 				tmtbHtml += '" alt=""></span>\n' +
-					'                    </a>\n' +
-					'                    <figcaption>\n' +
-					'                        <a href="">\n' +
-					'                            <div class="brand">';
+					'					</a>\n' +
+					'					<figcaption>\n' +
+					'						<a href="">\n' +
+					'							<div class="brand">';
 				tmtbHtml += goods.brandNm;
 				tmtbHtml += '</div>\n' +
-					'                            <div class="name">';
+					'							<div class="name">';
 				tmtbHtml += goods.goodsNm;
 				tmtbHtml += '</div>\n' +
-					'                            <div class="price">\n' +
-					'                                <span class="selling_price">';
+					'							<div class="price">\n' +
+					'								<span class="selling_price">';
 				tmtbHtml += Number(goods.currPrice).toLocaleString();
 				tmtbHtml += '</span>\n' +
-					'                            </div>\n' +
-					'                        </a>\n' +
-					'                    </figcaption>\n' +
-					'                </figure>\n' +
-					'            </div>';
+					'							</div>\n' +
+					'						</a>\n' +
+					'					</figcaption>\n' +
+					'				</figure>\n' +
+					'			</div>';
 			}
 
 			tmtbHtml += '<div class="txt">\n' +
-				'                <a href="">\n' +
-				'                    <i class="ico ico_saletag"></i>\n' +
-				'                    <input type="hidden" name="tmtbSq" value="' + tmtb.tmtbSq + '" />' +
-				'                    <span>\n';
+				'				<a href="">\n' +
+				'					<i class="ico ico_saletag"></i>\n' +
+				'					<input type="hidden" name="tmtbSq" value="' + tmtb.tmtbSq + '" />' +
+				'					<span>\n';
 			tmtbHtml += tmtb.tmtbNm;
 			tmtbHtml += '</span>\n' +
-				'                </a>\n' +
-				'            </div>\n' +
-				'        </div>';
+				'				</a>\n' +
+				'			</div>\n' +
+				'		</div>';
 		}
 
 		// 금액 다다익선 정보 HTML 작성
@@ -590,16 +624,16 @@
 			if (notApplyAmtTmtbList[i].tmtbSq != 0) {
 				let tmtb = notApplyAmtTmtbList[i];
 				tmtbHtml += '<div class="more_sale amtNotApplyTmtbList">\n' +
-					'            <div class="txt">\n' +
-					'                <a href="">\n' +
-					'                    <i class="ico ico_saletag"></i>\n' +
-					'                    <input type="hidden" name="tmtbSq" value="' + tmtb.tmtbSq + '" />' +
-					'                    <span>';
+					'			<div class="txt">\n' +
+					'				<a href="">\n' +
+					'					<i class="ico ico_saletag"></i>\n' +
+					'					<input type="hidden" name="tmtbSq" value="' + tmtb.tmtbSq + '" />' +
+					'					<span>';
 				tmtbHtml += tmtb.tmtbNm;
 				tmtbHtml += '</span>\n' +
-					'                </a>\n' +
-					'            </div>\n' +
-					'        </div>';
+					'				</a>\n' +
+					'			</div>\n' +
+					'		</div>';
 			}
 		}
 
@@ -754,7 +788,7 @@
 		});
 
 		// 선택된 장바구니 정보 가공
-		let data = {    cartSqArr : cartArr }
+		let data = {	cartSqArr : cartArr }
 		let jsonData = JSON.stringify(data);
 
 		$.ajax( {

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

@@ -96,7 +96,7 @@
 				</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_SOCIAL_MAIN);" title="핫딜 바로가기">핫딜</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>

+ 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 {

+ 43 - 36
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>
@@ -125,8 +125,8 @@
 										<button type="button" id="btn_saleCoupon_pop" class="btn btn_primary btn_sm btn_coupon" 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}" >
@@ -176,13 +176,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 +718,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"]');
@@ -980,6 +978,8 @@
 	
 	$(document).ready( function() {
 		
+		$('.timer_box').css('display', 'none');
+		
 		var params = new Object();
 		params.goodsCd = [[${params.goodsCd}]];
 		params.viewDt = [[${params.viewDt}]];
@@ -1101,31 +1101,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>

+ 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 class="active"><a href="javascript:void(0);" th:if="${measurementList != null and !measurementList.empty}">실측 사이즈</a></li>
+						<li><a href="javascript:void(0);" th:if="${(commonSizeInfoList != null and !commonSizeInfoList.empty) or (brandSizeInfoList != null and !brandSizeInfoList.empty)}">표준 사이즈</a></li>
+						<li><a href="javascript:void(0);" th:if="${measurementSizeInfoList != null and !measurementSizeInfoList.empty}">측정 사이즈</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>

+ 2 - 2
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>
@@ -344,7 +344,7 @@
 	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 (!gagajf.isNull(chgReason)) {

+ 1 - 1
src/main/webapp/WEB-INF/views/web/order/OrderDcAmtInfoWeb.html

@@ -155,7 +155,7 @@
 													<ul class="list">
 														<li value="0">선택없음</li>
 														<th:block th:each="delvCpn, k : ${delvCpnList}">
-															<li th:value="${delvCpn.custCpnSq}" th:data="${delvCpn.cpnDcAmt}" th:delvfeecd="${delvCpn.delvFeeCd}" th:text="${delvCpn.cpnNm}"></li>
+															<li th:value="${delvCpn.custCpnSq}" th:data="${delvCpn.dcVal}" th:delvfeecd="${delvCpn.delvFeeCd}" th:delvfee="${delvCpn.delvFee}" th:text="${delvCpn.cpnNm}"></li>
 														</th:block>
 													</ul>
 												</div>

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

@@ -33,7 +33,7 @@
 				url : '/order/create/preOrder',
 				dataType : 'html',
 				data : {
-					  pgGb		: "PAYCO"
+					  pgGb		: "KCP"
 					, payMeans	: "G014_30"
 					, ordNo		: "5"
 					, goodsNm	: "상품 테스트"
@@ -58,9 +58,11 @@
 
 	<form id="order_info" name="order_info" method="post" action="/order/pay/result/response" ></form>
 	
-	
-	<input type="button" id="buyBtn" value="테스트버튼" style="width:200px; height:200px;"/>
-
+	<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 -->
 
 
@@ -189,11 +191,11 @@
 					, custNo		: [[${sessionInfo.custNo}]]
 					, ordNo			: 1000
 					, goodsNm		: "상품 테스트"
-					, payAmt		: 10
+					, payAmt		: 1000
 					, ordGoodsQty	: [[${goodsTotCnt}]]
 				},
 				error : function(e) {
-					console.log(e.responseText);
+					mcxDialog.alert(e.responseText);
 				},
 				success : function(result) {
 					$("#order_info").html(result);
@@ -239,6 +241,9 @@
 			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);
 
@@ -248,7 +253,7 @@
 				console.log(' ');
 				fnNaverPaymentOrder();
 			});
-			
+
 			return true;
 		}
 		
@@ -262,7 +267,7 @@
 			
 			gagajf.ajaxJsonSubmit(url, jsonData, function(result) {
 				console.log('====== naverPaymentOrder ======');
-				console.log(result.kakaoPay);
+				console.log(result.naverPay);
 				console.log(' ');
 				fnCancelNaverPayment();
 			});
@@ -277,20 +282,21 @@
 			data.pgTid = $('#order_info input[name=pgTid]').val();
 			data.cancelRequester = '1';
 			data.chgReasonNm = '고객변심';
-			data.payAmt = 5;
+			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.kakaoPay);
+				console.log(result.naverPay);
 				console.log(' ');
 			});
 		}
-	</script>
 
-	<input type="button" id="kakaoBtn" value="카카오테스트버튼" style="width:200px; height:200px;"/>
-	<input type="button" id="naverBtn" value="네이버테스트버튼" style="width:200px; height:200px;"/>
+	</script>
 <!-- // card007 -->
 
 
@@ -303,36 +309,37 @@
 
 <!--  container -->
 <form id="payForm" name="payForm">
-	<br>
+
 	<!-- 주문고객정보 -->
-	<table border="1" style="font-size:10px; text-align:center;">
-		<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>
+	<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>
-	
-	<br>
+
 	<!-- 사은품정보 -->
-	<table border="1" style="font-size:10px; text-align:center;">
+	<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>
@@ -342,10 +349,9 @@
 			<td class="freegiftUsePointArr"></td>
 		</tr>
 	</table>
-	
-	<br>
+
 	<!-- 주문상세금액 -->
-	<table border="1" style="font-size:10px; text-align:center;">
+	<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>orgCurrPrice</th>
@@ -368,11 +374,12 @@
 			<th>gfcdUseAmt1</th>
 			<th>realOrdAmt1</th>
 			<th>savePntAmt1</th>
-			<th>shoDelvYn</th>
+			<th>shotDelvYn</th>
 			<th>foreignYn</th>
 			<th>orderMadeYn</th>
+			<th>delvFeeCd</th>
 		</tr>
-		<th:block th:each="delvAllCart, index : ${delvCartGoodsList}">
+		<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;">
@@ -412,15 +419,35 @@
 						<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>
-	
-	<br>
+
+	<!-- 배송단위목록 -->
+	<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;">
+	<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>
@@ -690,6 +717,27 @@ $(document).ready( function() {
 
 	// 1. AJAX 정보(회원정보로드)
 	custemerInfoSet(jsonData);
+	
+	// 999. 개발화면정보설정
+	var devTemp = true;
+	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. 함수기능 정의
@@ -901,7 +949,7 @@ var freegiftInfoSet = function(jsonData) {
 	});
 }
 
-// 1.6 결제타입로드
+// 1.6 결제타입로드 (결제버튼기능구현)
 var paymentInfoSet = function(jsonData) {
 	$.ajax( {
 		type		: "POST",
@@ -919,6 +967,96 @@ var paymentInfoSet = function(jsonData) {
 				$("#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		= [];
+
+					// 주문상세데이타 생성
+					$(".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()
+							,"carrtCpnDCAmt"	: $(this).parent().find(".cartCpnDCAmt").text()
+							,"prePntDcAmt"		: $(this).parent().find(".prePntDcAmt1").text()
+							,"pntDcAmt"			: $(this).parent().find(".pntDcAmt1").text()
+							,"gfcdUseAmt"		: $(this).parent().find(".gfcdUseAmt1").text()
+							,"savePntAmt"		: $(this).parent().find(".savePntAmt1").text()
+							,"shotDelvYn"		: $(this).parent().find(".shotDelvYn").text()
+							,"foreignBuyYn"		: $(this).parent().find(".foreignYn").text()
+							,"orderMadeYn"		: $(this).parent().find(".orderMadeYn").text()
+							,"delvFeeCd"		: $(this).parent().find(".delvFeeCd").text()
+						}
+						
+						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
+					};
+					
+					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);
 			}
@@ -1329,16 +1467,35 @@ var custCpnApply = function(obj) {
 	}
 	// 배송비쿠폰적용
 	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 = "- " + parseInt(obj.attr("data")).addComma() + " 원 할인적용";
-		obj.parent().parent().parent().parent().parent().find(".cp_amount").text(dcAmtStr);
+		var dcAmtStr = "- " + cpnDcAmt.addComma() + " 원 할인적용";
 		
-		var cpnCartSq 	= obj.parent().parent().find("input[name='cpnCartSq']").val();
+		obj.parent().parent().parent().parent().parent().find(".cp_amount").text(dcAmtStr);
 		
-		obj.parent().parent().find("input[name='cpnDcAmt']").val(obj.attr("data"));
+		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 쿠폰 적용 (공통적용)
@@ -1408,6 +1565,7 @@ var cpnApplyDel = function(obj) {
 		//});
 		
 		obj.parent().parent().find("input[name='delvFeeCd']").val("0");
+		$(".delvCpnSq").text("0");
 	}
 	
 	obj.parent().parent().find("input[name='custCpnSq']").val("0");

+ 2 - 0
src/main/webapp/WEB-INF/views/web/order/OrderPaymentInfoWeb.html

@@ -270,6 +270,8 @@ var dispYn = [[${order.dispYn}]]; // 노출여부
 
 //컨텐츠 호출
 $(document).ready( function() {
+	dispYn = "Y";
+	
 	// 화면펼침
 	if (dispYn == "Y") {
 		$("#paymentInfo .fold_head").addClass("on");

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

@@ -0,0 +1,120 @@
+<!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}]];
+console.log(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


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

@@ -18,6 +18,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=";								// 상품 상세
@@ -62,6 +63,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"; 					// 이벤트 메인
@@ -211,7 +214,15 @@ function cfnAddCart(cartList) {
 		contentType: 'application/json',
 		dataType : 'text',
 		success : function(result) {
-			alert(result);
+			if(cartList[0].cartGb == "C") {
+				mcxDialog.confirm("<div class="+"dialog-title"+">"+"상품이 쇼핑백에 추가되었습니다.</div><p>쇼핑백으로 이동하시겠습니까?</p>", {
+					cancelBtnText: "계속 쇼핑하기",
+					sureBtnText: "쇼핑백 가기",
+					sureBtnClick: function(){
+						location.href='/cart/list/form'; 	//내 쇼핑백 이동url
+					}
+				});
+			}
 		}
 	});
 }
@@ -443,14 +454,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');
 }
 
 /**
@@ -462,6 +473,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) {