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

Merge branch 'develop' into eskim

Conflicts:
	src/main/webapp/ux/mo/js/common_m.js
eskim 5 лет назад
Родитель
Сommit
36816f8656
89 измененных файлов с 4900 добавлено и 1343 удалено
  1. 1 10
      src/main/java/com/style24/front/biz/dao/TsfCartDao.java
  2. 10 0
      src/main/java/com/style24/front/biz/dao/TsfCouponDao.java
  3. 31 4
      src/main/java/com/style24/front/biz/dao/TsfDisplayDao.java
  4. 11 1
      src/main/java/com/style24/front/biz/dao/TsfOrderChangeDao.java
  5. 22 5
      src/main/java/com/style24/front/biz/service/TsfCartService.java
  6. 71 21
      src/main/java/com/style24/front/biz/service/TsfCouponService.java
  7. 8 32
      src/main/java/com/style24/front/biz/service/TsfCustomerService.java
  8. 65 0
      src/main/java/com/style24/front/biz/service/TsfDisplayService.java
  9. 41 0
      src/main/java/com/style24/front/biz/service/TsfOrderChangeService.java
  10. 2 2
      src/main/java/com/style24/front/biz/service/TsfOrderService.java
  11. 10 9
      src/main/java/com/style24/front/biz/thirdparty/NiceCertify.java
  12. 1 1
      src/main/java/com/style24/front/biz/web/TsfCartController.java
  13. 5 0
      src/main/java/com/style24/front/biz/web/TsfCommonController.java
  14. 20 7
      src/main/java/com/style24/front/biz/web/TsfCustomerController.java
  15. 106 27
      src/main/java/com/style24/front/biz/web/TsfDisplayController.java
  16. 34 20
      src/main/java/com/style24/front/biz/web/TsfMypageController.java
  17. 38 1
      src/main/java/com/style24/front/biz/web/TsfOrderController.java
  18. 19 6
      src/main/java/com/style24/front/biz/web/TsfPlanningController.java
  19. 2 1
      src/main/java/com/style24/front/biz/web/TsfSocialController.java
  20. 2 1
      src/main/java/com/style24/front/support/security/handler/TsfLoginSuccessHandler.java
  21. 6 0
      src/main/java/com/style24/persistence/domain/BrandGroup.java
  22. 2 1
      src/main/java/com/style24/persistence/domain/Cate4Srch.java
  23. 5 0
      src/main/java/com/style24/persistence/domain/Contents.java
  24. 1 0
      src/main/java/com/style24/persistence/domain/MainLayout.java
  25. 6 0
      src/main/java/com/style24/persistence/domain/Social.java
  26. 15 36
      src/main/java/com/style24/persistence/mybatis/shop/TsfCart.xml
  27. 4 5
      src/main/java/com/style24/persistence/mybatis/shop/TsfCoupon.xml
  28. 4 0
      src/main/java/com/style24/persistence/mybatis/shop/TsfCustomer.xml
  29. 70 1
      src/main/java/com/style24/persistence/mybatis/shop/TsfDisplay.xml
  30. 15 1
      src/main/java/com/style24/persistence/mybatis/shop/TsfOrder.xml
  31. 210 15
      src/main/java/com/style24/persistence/mybatis/shop/TsfOrderChange.xml
  32. 12 3
      src/main/java/com/style24/persistence/mybatis/shop/TsfSocial.xml
  33. 19 10
      src/main/java/com/style24/persistence/mybatis/shop/TsfWishlist.xml
  34. 164 154
      src/main/webapp/WEB-INF/views/mob/SigninFormMob.html
  35. 143 0
      src/main/webapp/WEB-INF/views/mob/SnsCallBackFormMob.html
  36. 6 6
      src/main/webapp/WEB-INF/views/mob/cart/CartChangeOptionPopupMob.html
  37. 527 520
      src/main/webapp/WEB-INF/views/mob/cart/CartListAjaxFormMob.html
  38. 9 0
      src/main/webapp/WEB-INF/views/mob/cart/CartListFormMob.html
  39. 2 0
      src/main/webapp/WEB-INF/views/mob/common/fragments/HeadMob.html
  40. 331 0
      src/main/webapp/WEB-INF/views/mob/customer/IdFindFormMob.html
  41. 32 0
      src/main/webapp/WEB-INF/views/mob/customer/NiceCallbackFormMob.html
  42. 37 0
      src/main/webapp/WEB-INF/views/mob/customer/NiceCellPhoneFormMob.html
  43. 37 0
      src/main/webapp/WEB-INF/views/mob/customer/NiceIpinFormMob.html
  44. 210 0
      src/main/webapp/WEB-INF/views/mob/customer/PasswordFindFormMob.html
  45. 373 0
      src/main/webapp/WEB-INF/views/mob/mypage/MypageGiftcardFormMob.html
  46. 454 0
      src/main/webapp/WEB-INF/views/mob/order/OrderCompleteMob.html
  47. 2 0
      src/main/webapp/WEB-INF/views/mob/order/OrderCustemerInfoMob.html
  48. 3 3
      src/main/webapp/WEB-INF/views/mob/order/OrderDcAmtInfoMob.html
  49. 62 17
      src/main/webapp/WEB-INF/views/mob/order/OrderFormMob.html
  50. 1 1
      src/main/webapp/WEB-INF/views/mob/order/OrderFreegiftInfoMob.html
  51. 57 37
      src/main/webapp/WEB-INF/views/mob/order/OrderListInfoMob.html
  52. 9 2
      src/main/webapp/WEB-INF/views/mob/order/OrderNoMemberMob.html
  53. 32 0
      src/main/webapp/WEB-INF/views/mob/pg/KakaoPaymentRequestMob.html
  54. 32 0
      src/main/webapp/WEB-INF/views/mob/pg/NaverPaymentRequestMob.html
  55. 5 0
      src/main/webapp/WEB-INF/views/mob/popup/DelvAddrAddPopMob.html
  56. 5 0
      src/main/webapp/WEB-INF/views/mob/popup/DelvAddrModifyPopMob.html
  57. 135 0
      src/main/webapp/WEB-INF/views/mob/social/SocialMainFormMob.html
  58. 41 85
      src/main/webapp/WEB-INF/views/web/cart/CartListAjaxFormWeb.html
  59. 19 7
      src/main/webapp/WEB-INF/views/web/common/fragments/BrandGnbWeb.html
  60. 27 4
      src/main/webapp/WEB-INF/views/web/common/fragments/FooterWeb.html
  61. 87 31
      src/main/webapp/WEB-INF/views/web/common/fragments/GnbWeb.html
  62. 11 0
      src/main/webapp/WEB-INF/views/web/customer/IdFindFormWeb.html
  63. 6 0
      src/main/webapp/WEB-INF/views/web/customer/PasswordFindFormWeb.html
  64. 168 0
      src/main/webapp/WEB-INF/views/web/display/AllBrandFormWeb.html
  65. 1 1
      src/main/webapp/WEB-INF/views/web/display/BrandMainFormWeb.html
  66. 20 18
      src/main/webapp/WEB-INF/views/web/display/CategoryGoodsListFormWeb.html
  67. 99 90
      src/main/webapp/WEB-INF/views/web/display/CategoryMainFormWeb.html
  68. 58 3
      src/main/webapp/WEB-INF/views/web/display/MallMainFormWeb.html
  69. 546 0
      src/main/webapp/WEB-INF/views/web/mypage/MypageCreCancelDetailFormWeb.html
  70. 18 4
      src/main/webapp/WEB-INF/views/web/mypage/MypageCreListFormWeb.html
  71. 4 5
      src/main/webapp/WEB-INF/views/web/mypage/MypageGiftcardFormWeb.html
  72. 5 4
      src/main/webapp/WEB-INF/views/web/mypage/MypageOrderDetailFormWeb.html
  73. 4 17
      src/main/webapp/WEB-INF/views/web/order/OrderCompleteWeb.html
  74. 0 3
      src/main/webapp/WEB-INF/views/web/order/OrderCouponApplyPopWeb.html
  75. 2 0
      src/main/webapp/WEB-INF/views/web/order/OrderCustemerInfoWeb.html
  76. 2 2
      src/main/webapp/WEB-INF/views/web/order/OrderDcAmtInfoWeb.html
  77. 29 17
      src/main/webapp/WEB-INF/views/web/order/OrderFormWeb.html
  78. 1 1
      src/main/webapp/WEB-INF/views/web/order/OrderFreegiftInfoWeb.html
  79. 4 0
      src/main/webapp/WEB-INF/views/web/order/OrderNoMemberWeb.html
  80. 18 3
      src/main/webapp/WEB-INF/views/web/planning/PlanningCustGradeBenefitFormWeb.html
  81. 116 66
      src/main/webapp/WEB-INF/views/web/planning/PlanningDetailFormWeb.html
  82. 12 1
      src/main/webapp/WEB-INF/views/web/popup/DelvAddrAddPopWeb.html
  83. 18 1
      src/main/webapp/WEB-INF/views/web/popup/DelvAddrModifyPopWeb.html
  84. 26 6
      src/main/webapp/WEB-INF/views/web/social/SocialMainFormWeb.html
  85. 12 6
      src/main/webapp/biz/goodsSession.js
  86. 1 1
      src/main/webapp/ux/mo/css/layout_m.css
  87. 4 2
      src/main/webapp/ux/pc/css/common.css
  88. 1 1
      src/main/webapp/ux/pc/css/layout.css
  89. 4 4
      src/main/webapp/ux/style24_link.js

+ 1 - 10
src/main/java/com/style24/front/biz/dao/TsfCartDao.java

@@ -71,15 +71,6 @@ public interface TsfCartDao {
 	 */
 	void updateCartInfo(Cart param);
 
-	/**
-	 * 장바구니 수정
-	 * @param param
-	 * @return void
-	 * @author xodud1202
-	 * @since 2021. 03. 01
-	 */
-	void updateCart(Cart param);
-
 	/**
 	 * 장바구니 상세 수정
 	 * @param param
@@ -299,5 +290,5 @@ public interface TsfCartDao {
 	 * @author xodud1202
 	 * @since 2021. 04. 04
 	 */
-	int updateCartGoodsQty(Order param);
+	int updateCartGoodsQty(Cart param);
 }

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

@@ -106,6 +106,16 @@ public interface TsfCouponDao {
 	 */
 	Collection<Coupon> getPlanCouponInfo(Coupon coupon);
 
+	/**
+	 * 등급정책 쿠폰 발급 여부(지급월 1일 ~ 말일)
+	 *
+	 * @param coupon - 쿠폰정보
+	 * @return Coupon
+	 * @author jsshin
+	 * @since 2021.04.08
+	 */
+	int getCustGradePolicyCouponCount(Coupon coupon);
+
 	/**
 	 * 등급정책 쿠폰 정보
 	 *

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

@@ -13,10 +13,10 @@ import com.style24.persistence.domain.Cate4Srch;
 import com.style24.persistence.domain.Cate5;
 import com.style24.persistence.domain.Contents;
 import com.style24.persistence.domain.GnbTab;
+import com.style24.persistence.domain.Goods;
+import com.style24.persistence.domain.GoodsSearch;
 import com.style24.persistence.domain.MainLayout;
 import com.style24.persistence.domain.Popup;
-import com.style24.persistence.domain.GoodsSearch;
-import com.style24.persistence.domain.Goods;
 
 /**
  * 전시 Dao
@@ -125,7 +125,7 @@ public interface TsfDisplayDao {
 	 * @date 2021. 3. 16
 	 */
 	Cate4Srch getCate4srch(Cate4Srch cate4Srch);
-	
+
 	/**
 	 * 팝업 목록
 	 *
@@ -136,7 +136,6 @@ public interface TsfDisplayDao {
 	 */
 	Collection<Popup> getPopupList(Popup popup);
 
-
 	/**
 	 * 몰메인 브랜드픽 조회
 	 * @param
@@ -181,4 +180,32 @@ public interface TsfDisplayDao {
 	 * @date 2021. 4. 8
 	 */
 	Collection<Goods> getCategoryGoodsList(GoodsSearch goodsSearch);
+
+	/**
+	 * 몰메인 BESTITEM 카테고리 목록
+	 * @param
+	 * @return
+	 * @author bin2107
+	 * @date 2021. 4. 9
+	 */
+	Collection<Contents> getBestItemCategoryList(Contents contents);
+
+	/**
+	 * 전체 브랜드
+	 * @param
+	 * @return
+	 * @author bin2107
+	 * @since 2021. 4. 12
+	 */
+	Collection<BrandGroup> getAllBrandList(BrandGroup brandGroup);
+
+	/**
+	 * 브랜드그룹의 기본카테고리여부 조회
+	 * @param brandGroupNo - 브랜드그룹번호
+	 * @return
+	 * @author gagamel
+	 * @date 2021. 4. 12
+	 */
+	String getBrandGroupDefaultCategoryYn(Integer brandGroupNo);
+
 }

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

@@ -112,10 +112,20 @@ public interface TsfOrderChangeDao {
 	 * 마이페이지 교환 상품 옵션 정보 조회
 	 *
 	 * @param OrderChange
-	 * @return Collection<OrderChange>
+	 * @return OrderChange
 	 * @author card007
 	 * @since 2021. 04. 08
 	 */
 	OrderChange getExchangeGoodsOptionInfoList(OrderChange orderChange);
 
+	/**
+	 * 마이페이지 취소 상세 정보 조회
+	 *
+	 * @param OrderChange
+	 * @return Collection<OrderChange>
+	 * @author card007
+	 * @since 2021. 04. 08
+	 */
+	Collection<OrderChange> getCreCancelDetailInfo(OrderChange orderChange);
+
 }

+ 22 - 5
src/main/java/com/style24/front/biz/service/TsfCartService.java

@@ -731,14 +731,18 @@ public class TsfCartService {
 
 		// 업체별 상품 합계 금액 저장
 		int compCnt = 0;
+		String delvYn;
 		Order lastCompCheck = new Order();
 		for (Order delv : delvFeeInfo) {
+			lastCompCheck = null;
 			compCnt = 0;
+			delvYn = "N";
 			for (Order param : params) {
 				if (param.getDelvFeeCd().equals(delv.getDelvFeeCd())) {
 					compCnt++;
 					if("N".equals(param.getSoldoutYn()) && "Y".equals(param.getOrdCanYn()) && param.getGoodsQty() >= param.getMinOrdQty() && param.getGoodsQty() <= param.getMaxOrdQty()) {
 						delv.setCompSumPrice(delv.getCompSumPrice() + param.getCurrPrice());
+						delvYn = "Y";
 					}
 					if (compCnt == 1) {
 						param.setFirstCompYn("Y");
@@ -749,7 +753,15 @@ public class TsfCartService {
 				}
 			}
 
-			lastCompCheck.setAddDelvFeeYn("Y");
+			if(lastCompCheck != null) {
+				// 한 업체의 마지막 상품 체크
+				lastCompCheck.setAddDelvFeeYn("Y");
+
+				// 배송 상품 존재 여부
+				lastCompCheck.setDelvYn(delvYn);
+
+				log.info("CHECK CART_SQ ::: {} / {} / {}", lastCompCheck.getCartSq(), lastCompCheck.getDelvYn(), lastCompCheck.getAddDelvFeeYn());
+			}
 		}
 
 		int wmsSumPrice = 0, wmsMinOrdAmt = 0, wmsDelvFee = 0;
@@ -787,6 +799,11 @@ public class TsfCartService {
 			} else {
 				order.setWmsDelvFee(wmsDelvFee);
 			}
+
+			// 배송 상품 존재 여부
+			if(wmsSumPrice > 0) {
+				order.setDelvYn("Y");
+			}
 		}
 	}
 
@@ -1074,7 +1091,7 @@ public class TsfCartService {
 					cartDao.deleteCartDetail(param);
 				}
 			} else {		// 동일 상품 없을 시 UPDATE
-				cartDao.updateCart(param);						// 장바구니 마스터 정보 저장
+				cartDao.updateCartGoodsQty(param);						// 장바구니 마스터 정보 저장
 				cartDao.insertCartHst(param);					// 장바구니 이력 정보 저장
 				for(int i = 0 ; i < param.getCartDtlSqArr().length ; i++) {
 					param.setItemCd(param.getItemCds()[i]);
@@ -1107,7 +1124,7 @@ public class TsfCartService {
 					cartDao.deleteCartDetail(param);			// 현재 장바구니 삭제
 				}
 			} else {
-				cartDao.updateCart(param);						// 장바구니 마스터 정보 저장
+				cartDao.updateCartGoodsQty(param);						// 장바구니 마스터 정보 저장
 				cartDao.insertCartHst(param);					// 장바구니 수정 이력 저장
 
 				param.setItemCd(param.getItemCds()[0]);
@@ -1177,14 +1194,14 @@ public class TsfCartService {
 	}
 
 	/**
-	 * 장바구니 주문하기 버튼 클릭시 재고 및 상태 체크
+	 * 장바구니 최소/최대 주문 수량으로 변경
 	 * @param Order
 	 * @return Collection<Order>
 	 * @author xodud1202
 	 * @since 2021. 04. 02
 	 */
 	@Transactional("shopTxnManager")
-	public Order updateCartGoodsQty(Order param) {
+	public Order updateCartGoodsQty(Cart param) {
 		if(TsfSession.isLogin()) {
 			param.setCustNo(TsfSession.getInfo().getCustNo());
 			param.setUpdNo(param.getCustNo());

+ 71 - 21
src/main/java/com/style24/front/biz/service/TsfCouponService.java

@@ -1,7 +1,10 @@
 package com.style24.front.biz.service;
 
 import java.util.Collection;
+import java.util.List;
 
+import com.gagaframework.web.util.GagaDateUtil;
+import com.style24.persistence.domain.CustGrade;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -309,6 +312,7 @@ public class TsfCouponService {
 			custCoupon.setEndAlimSendYn("N");		// 알림 발송 여부(발송되면 Y)
 			custCoupon.setUpdNo(coupon.getCustNo());
 			custCoupon.setRegNo(coupon.getCustNo());
+			coreCouponDao.saveCouponCustPub(custCoupon);
 		}
 	}
 
@@ -494,45 +498,91 @@ public class TsfCouponService {
 		return count;
 	}
 
+	/*
+	 * 정책 등급쿠폰 발급
+	 *
+	 * @param  custGrade - 고객번호
+	 * @return int : 받은 쿠폰 수량
+	 * @author jsshin
+	 * @since 2021. 04. 06
+	 */
+	@Transactional("shopTxnManager")
+	public int downloadCustGradeCoupon(Integer custNo) {
+		// 1. 고객정보 조회
+		Customer custInfo = customerService.getCustomerFindByCustNo(custNo);
+
+		// 2. 등급쿠폰 조회
+		CustGrade params = new CustGrade();
+		params.setCustNo(custInfo.getCustNo());
+		params.setSiteCd(custInfo.getSiteCd());
+		params.setGradeCd(custInfo.getCustGrade());
+		List<CustGrade> custGradeCollection = (List<CustGrade>)customerService.getCustGradePolicy(params);
+		CustGrade custGradePolicy = custGradeCollection.get(0);
+
+		// 3.WELCOME 등급 - 첫번째 쿠폰은 회원 가입시 지급
+		if (TscConstants.CustGrade.WELCOME.value().equals(custGradePolicy.getGradeCd())) {
+			custGradePolicy.setGradeCpnId1("0");
+		}
+
+		String frontGb = TsfSession.getFrontGb();
+		// 4. 회원등급 정책 쿠폰1 발급
+		Coupon couponFirst = new Coupon();
+		couponFirst.setCustNo(custNo);
+		couponFirst.setCpnId(Integer.parseInt(custGradePolicy.getGradeCpnId1()));
+		couponFirst.setFrontGb(frontGb);
+		int custGradeCpnFirst = saveCustGradeCoupon(couponFirst);
+
+		// 5. 회원등급 정책 쿠폰2 발급
+		Coupon couponSecond = new Coupon();
+		couponSecond.setCustNo(custNo);
+		couponSecond.setCpnId(Integer.parseInt(custGradePolicy.getGradeCpnId2()));
+		couponSecond.setFrontGb(frontGb);
+		int custGradeCpnSecond = saveCustGradeCoupon(couponSecond);
+
+		// 6. 회원등급 정책 쿠폰3 발급(생일쿠폰)
+		int birthCpn = 0;
+		if (org.apache.commons.lang3.StringUtils.isNotBlank(custInfo.getBirthYmd()) && custInfo.getBirthYmd().length() > 7) {
+			String currentMonth = GagaDateUtil.getToday().substring(4, 6);
+			String birthMonth = custInfo.getBirthYmd().substring(4, 6);
+			log.info("currentMonth ===> {}, birthMonth ===> {}", currentMonth, birthMonth);
+			if (currentMonth.equals(birthMonth)) {
+				Coupon couponThird = new Coupon();
+				couponThird.setCustNo(custNo);
+				couponThird.setCpnId(Integer.parseInt(custGradePolicy.getGradeCpnId3()));
+				couponThird.setFrontGb(frontGb);
+				birthCpn = saveCustGradeCoupon(couponThird);
+			}
+		}
+		return custGradeCpnFirst + custGradeCpnSecond + birthCpn;
+	}
+
 	/**
 	 * 등급쿠폰 발급
 	 *
-	 * @param cpnId - 쿠폰 아이디
+	 * @param coupon - 쿠폰 아이디, 고객번호
 	 * @return int - 결과
 	 * @author jsshin
 	 * @since 2021.04.08
 	 */
-	public int saveCustGradeCoupon(String cpnId) {
+	@Transactional("shopTxnManager")
+	public int saveCustGradeCoupon(Coupon coupon) {
 		int resultCnt = 0;
-		if (org.apache.commons.lang3.StringUtils.isNotBlank(cpnId)) {
-			Coupon params = new Coupon();
-			Coupon custGradeCoupon = couponDao.getCustGradePolicyCoupon(params);
-
+		if (coupon.getCpnId() > 0) {
+			Coupon custGradeCoupon = couponDao.getCustGradePolicyCoupon(coupon);
 			if (custGradeCoupon != null) {
 				CustCoupon custCoupon = new CustCoupon();
+				custCoupon.setCustNo(coupon.getCustNo());
 				custCoupon.setCpnId(custGradeCoupon.getCpnId());
 				custCoupon.setAvailStdt(custGradeCoupon.getAvailStdt());
 				custCoupon.setAvailEddt(custGradeCoupon.getAvailEddt());
 				custCoupon.setPubReason(TscConstants.PubReason.CHANGE_CUSTOMER_GRADE.value());
 				custCoupon.setEndAlimSendYn("N");		// 알림 발송 여부(발송되면 Y)
-				custCoupon.setUpdNo(custGradeCoupon.getCustNo());
-				custCoupon.setRegNo(custGradeCoupon.getCustNo());
+				custCoupon.setUpdNo(coupon.getCustNo());
+				custCoupon.setRegNo(coupon.getCustNo());
+				resultCnt = coreCouponDao.saveCouponCustPub(custCoupon);
 			}
-
-			resultCnt = 1;
 		}
 		return resultCnt;
 	}
 
-	/**
-	 * 생일쿠폰 발급
-	 *
-	 * @param cpnId - 쿠폰 아이디
-	 * @return int - 결과
-	 * @author jsshin
-	 * @since 2021.04.08
-	 */
-	public int saveCustBirthDayCoupon(String cpnId) {
-		return 0;
-	}
 }

+ 8 - 32
src/main/java/com/style24/front/biz/service/TsfCustomerService.java

@@ -7,6 +7,7 @@ import java.util.List;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpSession;
 
+import com.gagaframework.web.util.GagaDateUtil;
 import com.style24.persistence.domain.CustGrade;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -689,6 +690,8 @@ public class TsfCustomerService {
 		GagaMap resultMap = new GagaMap();
 		customer.setRegNo(customer.getCustNo());
 		customer.setUpdNo(customer.getCustNo());
+		customer.setHypenCellPhone();
+		customer.encryptData();
 		boolean isSuccess = false;
 		// CI 유효성 체크
 		Customer custInfo = getCustomerFindByCi(customer.getCi());
@@ -985,42 +988,15 @@ public class TsfCustomerService {
 		return result;
 	}
 
-
 	/*
-	 * 정책 등급쿠폰 발급
+	 * 고객 정책정보
 	 *
 	 * @param  custGrade - 고객번호
-	 * @return CustGrade
+	 * @return Collection<CustGrade>
 	 * @author jsshin
-	 * @since 2021. 04. 06
+	 * @since 2021. 04. 12
 	 */
-	public GagaMap downloadCustGradeCoupon(Integer custNo) {
-		GagaMap result = new GagaMap();
-		Customer custInfo = getCustomerFindByCustNo(custNo);
-		CustGrade params = new CustGrade();
-		params.setCustNo(custInfo.getCustNo());
-		params.setSiteCd(custInfo.getSiteCd());
-		params.setGradeCd(custInfo.getCustGrade());
-		List<CustGrade> custGradeCollection = (List<CustGrade>)customerDao.getCustGradePolicy(params);
-		CustGrade custGrade = custGradeCollection.get(0);
-
-		// WELCOME 등급 첫 번째 쿠폰은 회원가입시 쿠폰
-		if (TscConstants.CustGrade.WELCOME.value().equals(custGrade.getGradeCd())) {
-			custGrade.setGradeCpnId1("");
-			// 1. 회원등급 정책 쿠폰1, 쿠폰2 발급
-			int gradeCpn1 = couponService.saveCustGradeCoupon(custGrade.getGradeCpnId1());
-			int gradeCpn2 = couponService.saveCustGradeCoupon(custGrade.getGradeCpnId2());
-
-			// 2. 생일쿠폰 발급
-			int birthCpn = 0;
-			if (StringUtils.isNotBlank(custInfo.getBirthYmd()) && custInfo.getBirthYmd().length() > 7) {
-				birthCpn = couponService.saveCustBirthDayCoupon(custGrade.getGradeCpnId3());
-			}
-			result.setInt("gradeCpn1", gradeCpn1);
-			result.setInt("gradeCpn2", gradeCpn2);
-			result.setInt("birthCpn", birthCpn);
-
-		}
-		return result;
+	public Collection<CustGrade> getCustGradePolicy(CustGrade custGrade) {
+		return customerDao.getCustGradePolicy(custGrade);
 	}
 }

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

@@ -263,6 +263,36 @@ public class TsfDisplayService {
 		return cate1List;
 	}
 
+	/**
+	 * 브랜드 카테고리 목록
+	 * @param brandGroupNo - 브랜드그룹번호
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 4. 12
+	 */
+	@Cacheable(value = "cate", key = "'brandCate-'.concat(#brandGroupNo)")
+	public Collection<Cate1> getBrandCategoryList(Integer brandGroupNo) {
+		// 브랜드그룹의 기본카테고리여부 조회
+		String defaultCateYn = displayDao.getBrandGroupDefaultCategoryYn(brandGroupNo);
+
+		Cate4Srch cate = new Cate4Srch();
+		cate.setSiteCd(TscConstants.Site.STYLE24.value()); // 사이트코드
+
+		// 카테고리구분
+		if (defaultCateYn.equals("Y")) { // 기본카테고리이면
+			cate.setCateGb(TsfConstants.CateGb.BYITEM.value());
+		} else {
+			cate.setCateGb(TsfConstants.CateGb.BYBRAND.value());
+		}
+
+		cate.setCateType(TsfConstants.CateType.GOODS.value()); // 상품분류카테고리
+		cate.setBrandGroupNo(brandGroupNo);
+		cate.setSoldoutGoodsDispYn(envsetService.getSoldoutGoodsDisplayYn(TscConstants.Site.STYLE24.value()));
+		cate.setDefaultCateYn(defaultCateYn);
+
+		return this.getAllCategoryList(cate);
+	}
+
 	/**
 	 * 메인 레이아웃 목록
 	 * @param cateNo - 카테고리No
@@ -322,7 +352,31 @@ public class TsfDisplayService {
 		log.info("getContentsForGoods contentsList.size()::{}", contentsList.size());
 
 		return contentsList;
+	}
 
+	/**
+	 * 몰메인 BESTITEM 목록
+	 * @param
+	 * @return
+	 * @author bin2107
+	 * @date 2021. 4. 9
+	 */
+	public Collection<Contents> getBestItemForGoods(Contents contents) {
+		contents.setContentsLoc("SCM003");
+		Collection<Contents> contentsList = displayDao.getBestItemCategoryList(contents);
+		Cate4Srch tempCate = new Cate4Srch();
+
+		for (Contents data : contentsList) {
+			tempCate.setContentsLoc(data.getContentsLoc());
+			tempCate.setMaxRow(10);
+			tempCate.setCustNo(TsfSession.isLogin() ? TsfSession.getInfo().getCustNo() : 0);
+			tempCate.setCate1No(data.getCateNo());
+			tempCate.setSiteCd(data.getSiteCd());
+			tempCate.setCateGb(data.getCateGb());
+			data.setGoodsList(goodsDao.getContentsCategoryGoodsList(tempCate));
+		}
+
+		return contentsList;
 	}
 
 	/**
@@ -371,4 +425,15 @@ public class TsfDisplayService {
 		return goodsList;
 	}
 
+	/**
+	 * 전체 브랜드
+	 * @param
+	 * @return
+	 * @author bin2107
+	 * @since 2021. 4. 12
+	 */
+	public Collection<BrandGroup> getAllBrandList(BrandGroup brandGroup){
+		return displayDao.getAllBrandList(brandGroup);
+	}
+
 }

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

@@ -318,4 +318,45 @@ public class TsfOrderChangeService {
 		return map;
 	}
 
+	/**
+	 * 마이페이지 취소 상세 정보 조회
+	 *
+	 * @param OrderChange
+	 * @return Collection<OrderChange>
+	 * @author card007
+	 * @since 2021. 04. 08
+	 */
+	public GagaMap getCreCancelDetailInfo(OrderChange orderChange) {
+		GagaMap map = new GagaMap();
+		Collection<OrderChange> result = new ArrayList<>();
+		List<Integer> ordDtlNoList = new ArrayList<>();
+
+		for (OrderChange tmpOrderChange : orderChangeDao.getCreCancelDetailInfo(orderChange)) {
+			// 세트상품 옵션별 배열로 담기
+			if (tmpOrderChange.getItemNm().contains("!@!")) {
+				tmpOrderChange.setItemNmArr(tmpOrderChange.getItemNm().split("!@!"));
+				tmpOrderChange.setColorNmArr(tmpOrderChange.getColorNm().split(","));
+				tmpOrderChange.setOptCd1Arr(tmpOrderChange.getOptCd1().split(","));
+				tmpOrderChange.setOptCd2Arr(tmpOrderChange.getOptCd2().split(","));
+			} else {
+				String[] arr = {tmpOrderChange.getItemNm()}, arr2 = {tmpOrderChange.getColorNm()}, arr3 = {tmpOrderChange.getOptCd1()}, arr4 = {tmpOrderChange.getOptCd2()};
+				tmpOrderChange.setItemNmArr(arr);
+				tmpOrderChange.setColorNmArr(arr2);
+				tmpOrderChange.setOptCd1Arr(arr3);
+				tmpOrderChange.setOptCd2Arr(arr4);
+			}
+
+			ordDtlNoList.add(tmpOrderChange.getOrdDtlNo());
+			result.add(tmpOrderChange);
+		}
+
+		OrderChange oneData = result.iterator().next();
+		oneData.setOrdDtlNoArr(ordDtlNoList.stream().mapToInt(Integer::intValue).toArray());
+
+		map.set("oneData", oneData);
+		map.set("cancelDetailList", result);
+
+		return map;
+	}
+
 }

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

@@ -331,9 +331,9 @@ public class TsfOrderService {
 				if(TscConstants.PgGb.KCP.value().equals(param.getPgGb()) || TscConstants.PgGb.PAYCO.value().equals(param.getPgGb())) {
 					coreKcpService.kcpPayRollBack(result, request);
 				} else if (TscConstants.PgGb.KAKAO.value().equals(param.getPgGb())) {
-					coreKakaoPayService.cancelKakaoPayment(param);
+					coreKakaoPayService.kakaoPayRollBack(param);
 				} else if (TscConstants.PgGb.NAVER.value().equals(param.getPgGb())) {
-					coreNaverPayService.cancelNaverPayment(param);
+					coreNaverPayService.naverPayRollBack(param);
 				} else {
 					throw new IllegalArgumentException("결제 정보 저장 실패. 새로고침 후 다시 시작해주세요.");
 				}

+ 10 - 9
src/main/java/com/style24/front/biz/thirdparty/NiceCertify.java

@@ -185,11 +185,12 @@ public class NiceCertify {
 
 
 		String sRequestNo = TsfSession.getAttribute("REQ_SEQ");	// 세션에 저장된 요청번호
-		if (!sRequestNo.equals(sRequestNumber)) {
-			sResponseNumber = "";
-			sAuthType = "";
-			throw new IllegalStateException("세션값 불일치 오류 입니다.");
-		}
+		log.info("sRequestNo ===> {}, sRequestNumber ===> {}",sRequestNo ,sRequestNumber);
+//		if (!sRequestNo.equals(sRequestNumber)) {
+//			sResponseNumber = "";
+//			sAuthType = "";
+//			throw new IllegalStateException("세션값 불일치 오류 입니다.");
+//		}
 
 		String sAdult = "";		 // 미성년 : 0, 성인 : 1
 		String sforeignerYn = ""; // 외국인여부(외국인:Y)
@@ -260,7 +261,7 @@ public class NiceCertify {
 
 		GagaMap resultMap = new GagaMap();
 		resultMap.setString("sEncData", ipinClinet.getCipherData());
-
+		resultMap.setString("CPREQUEST", sCPRequestNo);
 		return resultMap;
 	}
 
@@ -319,9 +320,9 @@ public class NiceCertify {
 
 
 		String sCPRequestNo = TsfSession.getAttribute("CPREQUEST");
-		if (!sCPRequestNo.equals(sCPRequestNum)) {
-			throw new IllegalStateException("세션값 불일치 오류 입니다.");
-		}
+//		if (!sCPRequestNo.equals(sCPRequestNum)) {
+//			throw new IllegalStateException("세션값 불일치 오류 입니다.");
+//		}
 
 		String sGender = "";
 		String sAdult = "N"; //미성년자

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

@@ -259,7 +259,7 @@ public class TsfCartController extends TsfBaseController {
 	 */
 	@ResponseBody
 	@PostMapping("/update/goodsQty")
-	public Order updateCartGoodsQty(@RequestBody Order param) {
+	public Order updateCartGoodsQty(@RequestBody Cart param) {
 		return cartService.updateCartGoodsQty(param);
 	}
 

+ 5 - 0
src/main/java/com/style24/front/biz/web/TsfCommonController.java

@@ -262,6 +262,8 @@ public class TsfCommonController extends TsfBaseController {
 			}
 		} 
 		
+		//deliveryAddrInfo.getRecipPhnno();
+		
 		mav.addObject("deliveryAddrInfo", deliveryAddrInfo);						// 배송지정보
 		mav.setViewName(super.getDeviceViewName("popup/DelvAddrModifyPop"));
 		
@@ -286,6 +288,9 @@ public class TsfCommonController extends TsfBaseController {
 			order.setCustNo(0);
 		}
 		
+		// recipPhnno '-' 처리
+		order.setHypenRecipPhone();
+		
 		coreOrderService.updateCustDeliveryAddr(order);
 		
 		return message.getMessage("SUCC_0001");

+ 20 - 7
src/main/java/com/style24/front/biz/web/TsfCustomerController.java

@@ -69,11 +69,15 @@ public class TsfCustomerController extends TsfBaseController {
 	 * @since 2021. 02. 05
 	 */
 	@RequestMapping("/id/find/form")
-	public ModelAndView idFindForm() {
+	public ModelAndView idFindForm(@RequestParam(value = "sEncData", required = false) String sEncData
+			, @RequestParam(value = "authMethod", required = false) String authMethod) {
+
 		ModelAndView mav = new ModelAndView();
 
-		mav.setViewName(super.getDeviceViewName("customer/IdFindForm"));
+		mav.addObject("sEncData", sEncData);
+		mav.addObject("authMethod", authMethod);
 
+		mav.setViewName(super.getDeviceViewName("customer/IdFindForm"));
 		return mav;
 	}
 
@@ -350,7 +354,8 @@ public class TsfCustomerController extends TsfBaseController {
 	 * @since 2021. 02. 09
 	 */
 	@GetMapping("/nice/cellphone/form")
-	public ModelAndView niceCellphoneForm(@RequestParam(value = "redirectUrl", required = false) String redirectUrl, @RequestParam(value = "custparams", required = false) String custparams) {
+	public ModelAndView niceCellphoneForm(@RequestParam(value = "redirectUrl", required = false) String redirectUrl
+			, @RequestParam(value = "custparams", required = false) String custparams) {
 		ModelAndView mav = new ModelAndView();
 		GagaMap result = niceCertify.certifyCellPhone();
 
@@ -389,13 +394,15 @@ public class TsfCustomerController extends TsfBaseController {
 	 * 나이스 인증 콜백
 	 * @param encodeData - 휴대폰인증에서 전달받은 인증결과 암호화 데이터 취득
 	 * @param encData - 아이핀에서 전달받은 인증결과 암호화 데이터 취득
+	 * @param redirectUrl - 모바일은 호출한 URL 암호화 데이터 전달
 	 * @return ModelAndView
 	 * @author jsshin
 	 * @since 2021. 02. 09
 	 */
 	@RequestMapping("/nice/certify/callback")
-	public ModelAndView niceCertifyCallback(
-		@RequestParam(value = "EncodeData", required = false) String encodeData, @RequestParam(value = "enc_data", required = false) String encData, @RequestParam(value = "param_r1", required = false) String redirectUrl) {
+	public ModelAndView niceCertifyCallback(@RequestParam(value = "EncodeData", required = false) String encodeData
+			, @RequestParam(value = "enc_data", required = false) String encData
+			, @RequestParam(value = "param_r1", required = false) String redirectUrl) {
 
 		ModelAndView mav = new ModelAndView();
 		String sEncData = "";
@@ -721,9 +728,15 @@ public class TsfCustomerController extends TsfBaseController {
 		if (StringUtils.isBlank(custNo) || StringUtils.isBlank(customer.getEncData())) {
 			throw new IllegalStateException("로그인 다시 시도해 주세요.");
 		}
-		GagaMap resultInfo = niceCertify.getCertifyCellPhoneResultInfo(customer);
-		customer.setCi(resultInfo.getString("sCi"));
+		GagaMap authInfo = niceCertify.getCertifyCellPhoneResultInfo(customer);
+		customer.setSexGb(authInfo.getString("sGender"));
+		customer.setCustNm(authInfo.getString("sName"));
+		customer.setBirthYmd(authInfo.getString("sBirthDate"));
+		customer.setForeignerYn(authInfo.getString("sforeignerYn"));
+		customer.setCi(authInfo.getString("sCi"));
+		customer.setCellPhnno(authInfo.getString("sMobileNo"));
 		customer.setCustNo(Integer.parseInt(custNo));
+
 		session.removeAttribute("custNo"); // 고객번호 세션 삭제
 		return customerService.saveCertification(customer);
 	}

+ 106 - 27
src/main/java/com/style24/front/biz/web/TsfDisplayController.java

@@ -7,18 +7,6 @@ import java.util.HashMap;
 
 import javax.servlet.http.HttpServletResponse;
 
-import com.style24.persistence.domain.BrandGroup;
-import com.style24.persistence.domain.Cate4Srch;
-import com.style24.persistence.domain.Contents;
-import com.style24.persistence.domain.GnbTab;
-import com.style24.persistence.domain.Goods;
-import com.style24.persistence.domain.GoodsSearch;
-import com.style24.persistence.domain.Lookbook;
-import com.style24.persistence.domain.MainLayout;
-import com.style24.persistence.domain.Plan;
-import com.style24.persistence.domain.Popup;
-import com.style24.persistence.domain.Social;
-import com.style24.persistence.domain.Login;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.mobile.device.Device;
@@ -42,6 +30,19 @@ 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.TscPageRequest;
+import com.style24.persistence.domain.BrandGroup;
+import com.style24.persistence.domain.Cate1;
+import com.style24.persistence.domain.Cate4Srch;
+import com.style24.persistence.domain.Contents;
+import com.style24.persistence.domain.GnbTab;
+import com.style24.persistence.domain.Goods;
+import com.style24.persistence.domain.GoodsSearch;
+import com.style24.persistence.domain.Login;
+import com.style24.persistence.domain.Lookbook;
+import com.style24.persistence.domain.MainLayout;
+import com.style24.persistence.domain.Plan;
+import com.style24.persistence.domain.Popup;
+import com.style24.persistence.domain.Social;
 
 import lombok.extern.slf4j.Slf4j;
 
@@ -91,7 +92,7 @@ public class TsfDisplayController extends TsfBaseController {
 		MainLayout mallMainLayout = new MainLayout();
 		// 로그인 유무 확인 (로그인이 되어 있지 않으면 regNo 를 0으로 장바구니에 저장한다.)
 		Login login = new Login();
-		if(TsfSession.isLogin()) {
+		if (TsfSession.isLogin()) {
 			login = TsfSession.getInfo();
 		} else {
 			login.setCustNo(0);
@@ -144,6 +145,10 @@ public class TsfDisplayController extends TsfBaseController {
 				}
 			}
 
+			if (contentsLoc.equals("SMM004")) {
+				mainLayout.setBestItemList(displayService.getBestItemForGoods(contents));
+			}
+
 			if (contentsLoc.equals("SMM006")) {
 				Social social = new Social();
 				social.setSiteCd("G000_10");
@@ -184,6 +189,22 @@ public class TsfDisplayController extends TsfBaseController {
 		return displayService.getGnbBrandGroupList(contents);
 	}
 
+	/**
+	 * GNB탭 > TOP BANNER 목록
+	 * @param contents - 컨텐츠 정보
+	 * @return
+	 * @throws Exception
+	 * @author bin2107
+	 * @since 2021. 4. 11
+	 */
+	@GetMapping("/gnb/topbanner/list")
+	@ResponseBody
+	public Collection<Contents> getGnbTopBannerList(Contents contents) {
+		contents.setContentsLoc("SGNB001");
+		contents.setMaxRow(1);
+		return displayService.getContentsList(contents);
+	}
+
 //	/**
 //	 * 전체 카테고리 목록
 //	 * @return
@@ -345,21 +366,34 @@ public class TsfDisplayController extends TsfBaseController {
 	public ModelAndView categoryMain(Cate4Srch cate) {
 		ModelAndView mav = new ModelAndView(super.getDeviceViewName("display/CategoryMainForm"));
 
-		// 기획전
-		Contents contents = new Contents();
-		contents.setContentsLoc("SCM001");
-		mav.addObject("planningList", displayService.getContentsList(contents));
-
-		// 신상품
-		cate.setContentsLoc("SCM002");
-		cate.setMaxRow(20);
-		mav.addObject("newGoodsList", goodsService.getContentsCategoryGoodsList(cate));
+		MainLayout mainLayout = new MainLayout();
+		mainLayout.setCateNo(cate.getCate1No());
+		Collection<MainLayout> mainLayoutCollection = displayService.getMainLayout(mainLayout);
+		Collection<MainLayout> cateMainLayoutList = new ArrayList<MainLayout>();
+
+		for (MainLayout cateMain : mainLayoutCollection) {
+			if ("SCM001".equals(cateMain.getContentsLoc())) {
+				// 기획전
+				Contents contents = new Contents();
+				contents.setContentsLoc("SCM001");
+				contents.setCateNo(cate.getCate1No());
+				mav.addObject("planningList", displayService.getContentsList(contents));
+			} else if ("SCM002".equals(cateMain.getContentsLoc())) {
+				// 신상품
+				cate.setContentsLoc("SCM002");
+				cate.setMaxRow(20);
+				mav.addObject("newGoodsList", goodsService.getContentsCategoryGoodsList(cate));
+			} else if ("SCM003".equals(cateMain.getContentsLoc())) {
+				// 베스트품
+				cate.setContentsLoc("SCM003");
+				cate.setMaxRow(20);
+				mav.addObject("bestGoodsList", goodsService.getContentsCategoryGoodsList(cate));
+			}
 
-		// 베스트품
-		cate.setContentsLoc("SCM003");
-		cate.setMaxRow(20);
-		mav.addObject("bestGoodsList", goodsService.getContentsCategoryGoodsList(cate));
+			cateMainLayoutList.add(cateMain);
+		}
 
+		mav.addObject("cateMainLayoutList", cateMainLayoutList);
 		mav.addObject("preview", cate.getPreview());
 		mav.addObject("viewDt", cate.getViewDt());
 		mav.addObject("viewPage", "G037_30");
@@ -489,6 +523,7 @@ public class TsfDisplayController extends TsfBaseController {
 		mav.addObject("filterSeasonList", displayService.getCategoryFilter(cate4Srch, "SEASON"));
 		mav.addObject("filterColorList", displayService.getCategoryFilter(cate4Srch, "COLOR"));
 		mav.addObject("filterBenefitList", displayService.getCategoryFilterBenefit(cate4Srch));
+		mav.addObject("sortGb", "new");
 		mav.addObject("cateInfo", cate4Srch);
 
 		return mav;
@@ -531,11 +566,55 @@ public class TsfDisplayController extends TsfBaseController {
 		log.info("totalCnt::::::::::{}", totalCnt);
 		pageable.setTotalCount(totalCnt);
 		goodsSearch.setPageable(pageable);
-		log.info("getEndRow:::::{}",pageable.getEndRow());
+		log.info("getEndRow:::::{}", pageable.getEndRow());
 		result.set("paging", goodsSearch);
 		result.set("totalCnt", totalCnt);
 		result.set("endRow", pageable.getEndRow());
 		result.set("dataList", displayService.getCategoryGoodsList(goodsSearch));
 		return result;
 	}
+
+	/**
+	 * 전체 브랜드
+	 * @param
+	 * @return
+	 * @author bin2107
+	 * @since 2021. 4. 12
+	 */
+	@GetMapping("/all/brand/form")
+	public ModelAndView allBrandMain(BrandGroup brandGroup) {
+		ModelAndView mav = new ModelAndView(super.getDeviceViewName("display/AllBrandForm"));
+
+		brandGroup.setSelfYn("Y");
+		mav.addObject("mainBrandList", displayService.getAllBrandList(brandGroup));
+
+		return mav;
+	}
+
+	/**
+	 * 전체 브랜드 리스트
+	 * @param
+	 * @return
+	 * @author bin2107
+	 * @since 2021. 4. 12
+	 */
+	@GetMapping("/all/brand/list")
+	@ResponseBody
+	public Collection<BrandGroup> getAllBrandList(BrandGroup brandGroup) {
+		return displayService.getAllBrandList(brandGroup);
+	}
+
+	/**
+	 * 브랜드 카테고리 목록
+	 * @param brandGroupNo - 브랜드그룹번호
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 4. 12
+	 */
+	@GetMapping("/brand/cate/list")
+	@ResponseBody
+	public Collection<Cate1> getBrandCategoryList(Integer brandGroupNo) {
+		return displayService.getBrandCategoryList(brandGroupNo);
+	}
+
 }

+ 34 - 20
src/main/java/com/style24/front/biz/web/TsfMypageController.java

@@ -17,6 +17,9 @@ import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.ResponseBody;
 import org.springframework.web.servlet.ModelAndView;
 
+import com.gagaframework.web.parameter.GagaMap;
+import com.gagaframework.web.rest.server.GagaResponse;
+import com.gagaframework.web.rest.server.GagaResponseStatus;
 import com.style24.core.biz.service.TscCouponService;
 import com.style24.core.biz.service.TscCustomerService;
 import com.style24.core.biz.service.TscKakaoPayService;
@@ -56,10 +59,6 @@ import com.style24.persistence.domain.WishList;
 
 import lombok.extern.slf4j.Slf4j;
 
-import com.gagaframework.web.parameter.GagaMap;
-import com.gagaframework.web.rest.server.GagaResponse;
-import com.gagaframework.web.rest.server.GagaResponseStatus;
-
 /**
  * 마이페이지 Controller
  * 
@@ -819,23 +818,11 @@ public class TsfMypageController extends TsfBaseController {
 	 * @since 2021. 02. 04
 	 */
 	@GetMapping({"/cre/list/form"})
-	public ModelAndView mypageCreListForm(@RequestBody(required = false) OrderChange orderChange) {
+	public ModelAndView mypageCreListForm() {
 		ModelAndView mav = new ModelAndView();
 
-		if (orderChange == null) {
-			orderChange = new OrderChange();
-		}
-
 		// 고객번호 설정
 		int custNo = TsfSession.getInfo().getCustNo();
-		// orderChange.setCustNo(custNo);
-
-		// 고객정보 조회
-		// Customer customer = new Customer();
-		// customer.setSiteCd(TscConstants.Site.STYLE24.value());
-		// customer.setCustNo(custNo);
-		// customer.setCustStat(TscConstants.CustStat.ACTIVE.value());
-		// mav.addObject("customerInfo", coreCustomerService.getCustomerInfo(customer));
 		mav.addObject("custNo", custNo);
 
 		// 주문 상태 별 수량 조회
@@ -844,8 +831,7 @@ public class TsfMypageController extends TsfBaseController {
 		mav.addObject("orderCount", coreOrderService.getOrderStatCount(order));
 
 		// 주문상세상태코드 설정
-		mav.addObject("chgStatList", rendererService.getAvailCommonCodeList("G685"));
-		// mav.addObject("chgStatList", rendererService.getCommonCodeList("G685", "Y", new String[] {"G013_25", "G013_35", "G013_55", "G013_97", "G013_98", "G013_99"}));
+		mav.addObject("chgStatList", rendererService.getCommonCodeList("G685", "Y", new String[] {"G685_10", "G685_11", "G685_19"}));
 
 		mav.setViewName(super.getDeviceViewName("mypage/MypageCreListForm"));
 
@@ -887,6 +873,34 @@ public class TsfMypageController extends TsfBaseController {
 		return map;
 	}
 
+	/**
+	 * 마이페이지 취반교 취소 상세 화면
+	 *
+	 * @return ModelAndView
+	 * @author card007
+	 * @since 2021. 04. 12
+	 */
+	@PostMapping({"/cre/cancel/detail/form"})
+	public ModelAndView mypageCreCancelDetailForm(OrderChange orderChange) {
+		ModelAndView mav = new ModelAndView();
+
+		// 고객번호 설정
+		int custNo = TsfSession.getInfo().getCustNo();
+		mav.addObject("custNo", custNo);
+
+		// 취소상세 데이터 조회
+		mav.addObject("cancelDetailList", orderChangeService.getCreCancelDetailInfo(orderChange));
+
+		// 주문 결제정보 조회
+		Order order = new Order();
+		order.setOrdNo(orderChange.getOrdNo());
+		mav.addObject("paymentInfo", orderService.getPaymentInfoForMypage(order));
+
+		mav.setViewName(super.getDeviceViewName("mypage/MypageCreCancelDetailForm"));
+
+		return mav;
+	}
+
 	/**
 	 * 마이페이지 STYLE24 포인트화면
 	 *
@@ -1082,7 +1096,7 @@ public class TsfMypageController extends TsfBaseController {
 	 * @since 2021. 03. 12
 	 */
 	@GetMapping("/gift/card/form")
-	public ModelAndView mypageGiftcardForm(GiftCard giftcard) {
+	public ModelAndView mypageGiftcardForm(GiftCard giftcard,Device device) {
 		ModelAndView mav = new ModelAndView();
 		// 상품권 기본정보
 		mav.addObject("giftcardInfo", giftcardService.getGiftcardInfo(giftcard));

+ 38 - 1
src/main/java/com/style24/front/biz/web/TsfOrderController.java

@@ -188,7 +188,6 @@ public class TsfOrderController extends TsfBaseController {
 		} else {
 			// 2021.04.08 휴대폰번호 하이픈 처리
 			order.setHypenCellPhone();
-			log.info("order.getCellPhnno() ::: {}", order.getCellPhnno());
 		}
 
 		// 2.1 총알배송여부가 null 이면 Y로 설정
@@ -202,6 +201,12 @@ public class TsfOrderController extends TsfBaseController {
 		// 3.1 즉시할인, 다다익선 할인금액 정보 적용 정보
 		Collection<Order> tmtbGoodsApplyList = cartService.getMoreBetterAmtList(order);
 		
+		// 3.1.1 상품목록이 없으면 장바구니이동 
+		if (tmtbGoodsApplyList.size() < 1) {
+			mav.setViewName("redirect:/cart/list/form");		// 비회원주문서화면
+			return mav;
+		}
+		
 		// 3.2 배송정보조회(장바구니상품목록)
 		GagaMap delvOrderMap = coreOrderService.getCartDelvGoodsCntList(tmtbGoodsApplyList, order);
 		
@@ -277,6 +282,8 @@ public class TsfOrderController extends TsfBaseController {
 			custemerInfo.setCustNm(order.getCustNm());
 			custemerInfo.setCellPhnno(order.getCellPhnno());
 			custemerInfo.setEmail(order.getEmail());
+			custemerInfo.setSexGb(order.getSexGb());
+			custemerInfo.setBirthYmd(order.getBirthYmd());
 		}
 		
 		ModelAndView mav = new ModelAndView();
@@ -443,6 +450,9 @@ public class TsfOrderController extends TsfBaseController {
 
 		// 3.2 배송정보조회(장바구니상품목록)
 		GagaMap delvOrderMap = coreOrderService.getCartDelvGoodsCntList(tmtbGoodsApplyList, order);
+		
+		// 3.3 할인정보조회(상품금액, 선포인트, 다다익선할인금액)
+		GagaMap goodsDcAmtMap = coreOrderService.getGoodsDcAmt(tmtbGoodsApplyList);
 				
 		ModelAndView mav = new ModelAndView();
 		mav.addObject("goodsTotCnt" 		, delvOrderMap.get("goodsTotCnt"));			// 총상품건수
@@ -452,6 +462,14 @@ public class TsfOrderController extends TsfBaseController {
 		mav.addObject("wmsCnt" 				, delvOrderMap.get("wmsCnt"));				// 자사일반상품건수
 		mav.addObject("isLogin"				, TsfSession.isLogin());					// 로그인여부
 		mav.addObject("IMG_PATH"			, env.getProperty("upload.goods.view"));	// 이미지경로
+		mav.addObject("isLogin"				, TsfSession.isLogin());					// 로그인여부
+		
+		// 4.2 할인정보(상품금액, 즉시할인, 다다익선, 선포인트, 적립예정포인트) 
+		mav.addObject("orgGoodsSumAmt"		, goodsDcAmtMap.get("orgGoodsSumAmt"));		// 상품금액합계
+		mav.addObject("cpn1DcSumAmt"		, goodsDcAmtMap.get("cpn1DcSumAmt"));		// 즉시할인금액합계
+		mav.addObject("tmtbDcSumAmt"		, goodsDcAmtMap.get("tmtbDcSumAmt"));		// 다다익선할인금액합계
+		mav.addObject("prePntDcAmt"			, goodsDcAmtMap.get("prePntDcAmt"));		// 선포인트사용가능금액
+		mav.addObject("savePntSumAmt"		, goodsDcAmtMap.get("savePntSumAmt"));		// 적립예정포인트합계
 		mav.setViewName(super.getDeviceViewName("order/OrderListInfo"));
 		
 		return mav;
@@ -666,6 +684,8 @@ public class TsfOrderController extends TsfBaseController {
 		log.info("order.getFreegiftValArr()    ::: {}", order.getFreegiftValArr());
 		log.info("order.getFreegiftValArr()    ::: {}", order.getFreegiftValArr());
 		log.info("order.getFreegiftSqArr()     ::: {}", order.getFreegiftSqArr());
+		log.info("order.getSexGb()             ::: {}", order.getSexGb());
+		log.info("order.getBirthYmd()          ::: {}", order.getBirthYmd());
 		
 		for(int i = 0 ; i < order.getFreegiftGoodsArr().length ; i++) {
 			log.info("order.getFreegiftGoodsArr()  ::: {}", order.getFreegiftGoodsArr()[i]);
@@ -732,11 +752,14 @@ public class TsfOrderController extends TsfBaseController {
 		// TODO 3. 주문정보 업데이트
 		coreOrderService.updateOrderInfo(order);
 		
+		// TODO 4. 보증보험 API 연동
+		
 		// 2021.03.16 주문완료화면이동처리
 		//mav.addObject("payment", param);
 		//mav.setViewName(super.getDeviceViewName("pg/kcpOrder"));
 		
 		mav.setViewName("redirect:/order/complete?ordNo=" + order.getOrdNo());
+		
 		return mav;
 	}
 
@@ -764,6 +787,20 @@ public class TsfOrderController extends TsfBaseController {
 		// 2. 결제완료정보조회
 		GagaMap resultMap = coreOrderService.getOrderCompleteInfo(order);
 		
+		// 2.1 본인회원인 경우 체크
+		Order orderInfo = (Order) resultMap.get("orderInfo");
+		if (orderInfo.getCustNo() != 0) {
+			if (TsfSession.isLogin()) {
+				if (!TsfSession.getInfo().getCustNo().equals(orderInfo.getCustNo())) {
+					mav.setViewName("redirect:/cart/list/form");
+					return mav;
+				}
+			} else {
+				mav.setViewName("redirect:/cart/list/form");
+				return mav;
+			}
+		}
+		
 		// 3. 화면전송변수설정
 		mav.addObject("orderInfo"			, resultMap.get("orderInfo"));			// 주문기본정보
 		mav.addObject("ordSumAmt"			, resultMap.get("ordSumAmt"));			// 주문금액합계

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

@@ -25,6 +25,7 @@ import com.style24.front.biz.service.TsfCouponService;
 import com.style24.front.biz.service.TsfPlanningService;
 import com.style24.front.support.controller.TsfBaseController;
 import com.style24.front.support.security.session.TsfSession;
+import com.style24.persistence.TscPageRequest;
 import com.style24.persistence.domain.Coupon;
 import com.style24.persistence.domain.CustDeliveryAddr;
 import com.style24.persistence.domain.Customer;
@@ -238,17 +239,24 @@ public class TsfPlanningController extends TsfBaseController {
 	 * @author sowon	
 	 * @since 2021. 04. 08
 	 */
-	@GetMapping("/reply/list")
+	@PostMapping("/reply/list")
 	@ResponseBody
-	public GagaMap getReplyList(@RequestParam(value="planSq")Integer planSq) {
+	public GagaMap getReplyList(Plan plan) {
 		GagaMap result = new GagaMap();
-		Plan plan = new Plan();
-		plan.setPlanSq(planSq);
+		plan.setPlanSq(plan.getPlanSq());
 		
 		result.set("replyList",planningService.getReplyList(plan));
 		if (TsfSession.isLogin()) {
 			result.set("custNo",TsfSession.getInfo().getCustNo());
 		}
+		TscPageRequest pageable = new TscPageRequest((plan.getPageNo() > 0 ? plan.getPageNo() - 1 : 0), plan.getPageSize(), plan.getPageUnit());
+		//pageable.setTotalCount(reviewService.getCompleteReviewCount(review));
+		pageable.setTotalCount(10);
+		plan.setPageable(pageable);
+		log.info("pageable: {}", pageable);
+		log.info("totalCount {}", pageable.getTotalCount());
+		
+		result.set("paging", plan);
 		return result;
 	}
 
@@ -513,9 +521,14 @@ public class TsfPlanningController extends TsfBaseController {
 	 * @author jsshin
 	 * @since 2021. 04. 08
 	 */
-	@GetMapping("/event/custgrade/coupon/down")
+	@PostMapping("/event/custgrade/coupon/down")
+	@ResponseBody
 	public GagaMap downCustGradeCoupon() {
-		return customerService.downloadCustGradeCoupon(TsfSession.getInfo().getCustNo());
+		GagaMap result = new GagaMap();
+		int downloadCnt = couponService.downloadCustGradeCoupon(TsfSession.getInfo().getCustNo());
+		boolean isDownload = downloadCnt > 0;
+		result.setBoolean("isDownload", isDownload);
+		return result;
 	}
 
 	

+ 2 - 1
src/main/java/com/style24/front/biz/web/TsfSocialController.java

@@ -1,6 +1,7 @@
 package com.style24.front.biz.web;
 
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.mobile.device.Device;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -35,7 +36,7 @@ public class TsfSocialController extends TsfBaseController {
 	 * @since 2021. 3. 11
 	 */
 	@GetMapping("/main/form")
-	public ModelAndView socialMainForm(Social social) throws Exception {
+	public ModelAndView socialMainForm(Social social, Device device) throws Exception {
 		ModelAndView mav = new ModelAndView();
 		
 		// 디바이스 set

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

@@ -43,7 +43,8 @@ public class TsfLoginSuccessHandler implements AuthenticationSuccessHandler {
 		"/customer/join/form",						// 회원가입
 		"/customer/sns/join/form",					// SNS 회원가입
 		"/customer/id/find/form",					// 아이디찾기
-		"/customer/pwd/find/form",					// 비밀번호찾기
+		"/customer/password/find/form",				// 비밀번호찾기
+		"/customer/password/change/form",			// 비밀번호 변경 화면
 		"/customer/join/complete/form",				// 회원가입완료
 		"/customer/join/type/form",					// 회원가입유형
 		"/customer/dormant/certify/complete/form",	// 휴면해제

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

@@ -22,5 +22,11 @@ public class BrandGroup extends TscBaseDomain {
 	private String logoFileNm;		// 로고파일명
 	private int dispOrd;			// 표시순서
 	private String rgbCd;			// RGB코드(front 브랜드메인 GNB 색상)
+	private String defaultCateYn;	// 기본카테고리여부
+	private Integer brandCateNo;	// 브랜드카테고리번호
 
+	// 브랜드 전체에서 사용
+	private String brandInitial;
+	private String selfYn;
+	private String dispNmLang;
 }

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

@@ -36,6 +36,7 @@ public class Cate4Srch extends TscBaseDomain {
 	private String contentsLoc;
 
 	private Integer brandGroupNo;		// 브랜드그룹번호
+	private String defaultCateYn;		// 기본카테고리여부
 
 	private String soldoutGoodsDispYn;
 
@@ -44,7 +45,7 @@ public class Cate4Srch extends TscBaseDomain {
 	private String custGb;				// 고객구분
 	private int maxRow;					// 최대ROW수
 	private String[] exceptGoodsArr;	// 제외상품배열
-	
+
 	private String dispDt;			// 기획전 기간
 	private String viewDt;			// 미리보기 일시
 	private String preview;			// 미리보기 여부 (Y:미리보기)

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

@@ -60,6 +60,11 @@ public class Contents extends TscBaseDomain {
 	private int planBrandGroupNo;
 	private String planBrandGroupNm;
 
+	// 몰메인 SMM003에서 사용
+	private String siteCd;
+	private String cateGb;
+	private String cateNm;
+
 	//private String contentsTitle;		// 메인 타이틀(md가 설정한)
 
 	private Collection<Cate1> cateList;	// 카테고리목록

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

@@ -34,5 +34,6 @@ public class MainLayout extends TscBaseDomain {
     private Social socialInfo;
     private Collection<Contents> mdPickList;
     private Collection<Contents> brandPickList;
+    private Collection<Contents> bestItemList;
 
 }

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

@@ -61,6 +61,12 @@ public class Social extends TscBaseDomain{
 		private String sysImgNm;	//시스템이미지
 		private String goodsTnm;	//상품타이틀
 		private int stockQtySum;	//상품 재고
+		private int minOrdQty;		//최소주문수량
+		private String afLinkCd;
+		private String optCd;
+		private String goodsType;
+		private String brandGroupNm;	//브랜드 그룹명
+		
 		
 		// 고객
 		private Integer custNo;		//고객번호

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

@@ -174,28 +174,6 @@
 		/* TsfCart.updateCartInfo : 장바구니 UPDATE */
 		UPDATE TB_CART SET
 			  GOODS_QTY = GOODS_QTY + #{goodsQty}
-			, DEAL_GOODS_CD = #{dealGoodsCd}
-			, AF_LINK_CD = #{afLinkCd}
-			, ITHR_CD = #{ithrCd}
-			, CONTENTS_LOC = #{contentsLoc}
-			, PLAN_DTL_SQ = #{planDtlSq}
-			, UPD_NO = #{updNo}
-			, UPD_DT = CURRENT_TIMESTAMP
-		WHERE CART_SQ = #{cartSq}
-		AND   GOODS_CD = #{goodsCd}
-		AND   CUST_NO = #{custNo}
-	</update>
-
-	<!-- 장바구니 UPDATE -->
-	<update id="updateCart" parameterType="Cart">
-		/* TsfCart.updateCart : 장바구니 UPDATE */
-		UPDATE TB_CART SET
-			  GOODS_QTY = #{goodsQty}
-			, DEAL_GOODS_CD = #{dealGoodsCd}
-			, AF_LINK_CD = #{afLinkCd}
-			, ITHR_CD = #{ithrCd}
-			, CONTENTS_LOC = #{contentsLoc}
-			, PLAN_DTL_SQ = #{planDtlSq}
 			, UPD_NO = #{updNo}
 			, UPD_DT = CURRENT_TIMESTAMP
 		WHERE CART_SQ = #{cartSq}
@@ -590,6 +568,8 @@
 		        ON     C.CART_SQ = CD.CART_SQ
 		        INNER  JOIN TB_GOODS G
 		        ON     C.GOODS_CD = G.GOODS_CD
+		        AND    G.SELF_MALL_YN = 'Y'
+		        AND    G.GOODS_STAT <![CDATA[ <> ]]> 'G008_99'
 		        INNER  JOIN TB_BRAND BR
 		        ON     G.BRAND_CD = BR.BRAND_CD
 		        INNER  JOIN TB_DELV_FEE_POLICY DFP
@@ -617,6 +597,7 @@
 		                                ON     C.CART_SQ = CD.CART_SQ
 		                                INNER  JOIN TB_GOODS G
 		                                ON     C.GOODS_CD = G.GOODS_CD
+		                                AND    G.SELF_MALL_YN = 'Y'
 		                                INNER  JOIN TB_GOODS COMP_GOODS
 		                                ON     CD.ITEM_CD = COMP_GOODS.GOODS_CD
 		                                INNER  JOIN TB_GOODS_COMPOSE GC
@@ -627,7 +608,6 @@
 		                                AND    CD.OPT_CD = VS.OPT_CD
 		                                WHERE  1=1
 		                                AND    C.CART_GB = 'G026_BC'
-		                                AND    G.SELF_MALL_YN = 'Y'
 		                                <if test="custNo == 0">
 		                                AND    C.CUST_NO = 0
 		                                AND    C.JSESSION_ID = #{jsessionId}
@@ -650,12 +630,12 @@
 		                                ON     C.CART_SQ = CD.CART_SQ
 		                                INNER  JOIN TB_GOODS G
 		                                ON     C.GOODS_CD = G.GOODS_CD
+		                                AND    G.SELF_MALL_YN = 'Y'
 		                                INNER  JOIN VW_STOCK VS
 		                                ON     C.GOODS_CD = VS.GOODS_CD
 		                                AND    CD.OPT_CD = VS.OPT_CD
 		                                WHERE  1=1
 		                                AND    C.CART_GB = 'G026_BC'
-		                                AND    G.SELF_MALL_YN = 'Y'
 		                                <if test="custNo == 0">
 		                                AND    C.CUST_NO = 0
 		                                AND    C.JSESSION_ID = #{jsessionId}
@@ -669,8 +649,7 @@
 		        ON     C.CART_SQ = STOCK.CART_SQ
 		        LEFT   OUTER JOIN TB_GOODS_QUICK_DELEVERY_SKIP GQDS
 		        ON     G.GOODS_CD = GQDS.GOODS_CD
-		        WHERE  G.SELF_MALL_YN = 'Y'
-		        AND    G.GOODS_STAT <![CDATA[ <> ]]> 'G008_99'
+		        WHERE  1=1
 		        <if test="custNo == 0">
 		        AND    C.CUST_NO = 0
 		        AND    C.JSESSION_ID = #{jsessionId}
@@ -686,30 +665,30 @@
 		        </if>
 		        ORDER BY G.SUPPLY_COMP_CD ) Z
 		WHERE  1=1
-		GROUP  BY Z.CART_SQ
-		     , WISH_CNT
+		GROUP  BY WISH_CNT
+		     , Z.CART_SQ
 		     , Z.GOODS_STAT
 		     , Z.GOODS_CD
-		     , Z.GOODS_QTY
-		     , Z.DELV_RES_DT
-		     , Z.GOODS_TYPE
-		     , Z.SUPPLY_COMP_CD
 		     , Z.GOODS_NM
 		     , Z.BRAND_ENM
 		     , Z.BRAND_KNM
-		     , LIST_PRICE
 		     , Z.SUPPLY_COMP_NM
+		     , Z.GOODS_QTY
+		     , Z.DELV_RES_DT
+		     , Z.GOODS_TYPE
+		     , Z.SUPPLY_COMP_CD
 		     , Z.DELV_FEE_CD
 		     , Z.MIN_ORD_AMT
 		     , Z.DELV_FEE
 		     , Z.CART_DELV_FEE_CD
-		     , CURR_PRICE
 		     , ORD_CAN_YN
 		     , Z.ORD_CAN_QTY
 		     , Z.MIN_ORD_QTY
 		     , Z.MAX_ORD_QTY
-		     , Z.PNT_PRATE
-		     , Z.PNT_MRATE
+		     , CURR_PRICE
+		     , LIST_PRICE
+		     , Z.SOLDOUT_YN
+		     , SAVE_PNT_AMT
 		     , SYS_IMG_NM
 		ORDER  BY Z.DELV_FEE_CD DESC
 		     , Z.GOODS_CD DESC

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

@@ -452,8 +452,8 @@
 				     ,TC.MAX_DC_AMT
 				     ,(CASE TC.PD_GB WHEN 'P' THEN '기간' 
 				     				 WHEN 'D' THEN '일수' END) AS PD_GB
-				     ,DATE_FORMAT(TC.AVAIL_STDT, '%Y-%m-%d') AS AVAIL_STDT
-				     ,DATE_FORMAT(TC.AVAIL_EDDT, '%Y-%m-%d') AS AVAIL_EDDT
+				     ,DATE_FORMAT(A.AVAIL_STDT, '%Y-%m-%d') AS AVAIL_STDT
+				     ,DATE_FORMAT(A.AVAIL_EDDT, '%Y-%m-%d') AS AVAIL_EDDT
 				     ,TC.AVAIL_DAYS
 				     ,TC.CUST_PUB_LIMIT_QTY
 				     ,TC.TOT_PUB_LIMIT_QTY
@@ -520,8 +520,8 @@
 				     ,TC.MAX_DC_AMT
 				     ,(CASE TC.PD_GB WHEN 'P' THEN '기간' 
 				     				 WHEN 'D' THEN '일수' END) AS PD_GB
-				     ,DATE_FORMAT(TC.AVAIL_STDT, '%Y-%m-%d') AS AVAIL_STDT
-				     ,DATE_FORMAT(TC.AVAIL_EDDT, '%Y-%m-%d') AS AVAIL_EDDT
+				     ,DATE_FORMAT(A.AVAIL_STDT, '%Y-%m-%d') AS AVAIL_STDT
+				     ,DATE_FORMAT(A.AVAIL_EDDT, '%Y-%m-%d') AS AVAIL_EDDT
 				     ,TC.AVAIL_DAYS
 				     ,TC.CUST_PUB_LIMIT_QTY
 				     ,TC.TOT_PUB_LIMIT_QTY
@@ -720,7 +720,6 @@
 		     , DATE_FORMAT(CONCAT(LAST_DAY(NOW()), ' 23:59:59'), '%Y%m%d%H%i%S')               AS AVAIL_EDDT
 		FROM  TB_COUPON CP
 		WHERE CP.CPN_ID = #{cpnId}
-		AND   CP.SITE_CD = #{siteCd}
 		AND   NOT EXISTS (
 		                  SELECT 1
 		                  FROM   TB_CUST_COUPON CC

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

@@ -523,6 +523,10 @@
 		/* TsfCustomer.updateCustomerCi */
 		UPDATE TB_CUSTOMER
 		SET    CI = #{ci}
+		     , CUST_NM = #{encodedCustNm}
+		     , CELL_PHNNO = #{encodedCellPhnno}
+		     , SEX_GB = #{encodedSexGb}
+		     , BIRTH_YMD = #{encodedBirthYmd}
 		     , AUTH_DT = NOW()
 		     , UPD_NO = #{updNo}
 		     , UPD_DT = NOW()

+ 70 - 1
src/main/java/com/style24/persistence/mybatis/shop/TsfDisplay.xml

@@ -276,6 +276,12 @@
 		<if test="cate1No != null and cate1No != ''">
 		AND    CATE1_NO = #{cate1No}
 		</if>
+		<if test='defaultCateYn != null and defaultCateYn != "" and defaultCateYn == "N"'> <!-- 별도카테고리이면 -->
+		AND    CATE1_NO = (SELECT BRAND_CATE_NO
+		                   FROM   TB_BRAND_GROUP
+		                   WHERE  BRAND_GROUP_NO = #{brandGroupNo}
+		                  )
+		</if>
 		AND    DISP_YN = 'Y'
 		AND    USE_YN = 'Y'
 		AND    EXISTS (SELECT 1
@@ -289,7 +295,7 @@
 		               AND    FORMAL_GB = #{formalGb}
 		               </if>
 		               <if test='soldoutGoodsDispYn != null and soldoutGoodsDispYn =="N"'>
-		               AND    STOCK_QTY > 0 /*품절상품전시여부:N일 때 재고가 있는 카테고리만*/
+		               AND    STOCK_QTY > 0 /*품절상품전시여부N일 때 재고가 있는 카테고리만*/
 		               </if>
 		              )
 		ORDER  BY DISP_ORD
@@ -855,4 +861,67 @@
 		AND W.CUST_NO = #{custNo}
 		</if>
 	</select>
+	
+	<!-- 몰메인 베스트아이템 조회 -->
+	<select id="getBestItemCategoryList" parameterType="Contents" resultType="Contents">
+		/* TsfDisplay.getBestItemCategoryList */
+		SELECT
+		       SITE_CD
+		     , CATE_GB
+		     , CATE1_NO AS CATE_NO
+			 , CATE1_NM AS CATE_NM
+             , CONTENTS_LOC
+		FROM  TB_CATE_4SRCH
+		WHERE 1=1
+		AND CATE_TYPE = 'G031_20'
+		AND	CONTENTS_LOC = #{contentsLoc}
+	</select>
+
+	<!-- 브랜드 전체 조회 -->
+	<select id="getAllBrandList" parameterType="BrandGroup" resultType="BrandGroup">
+		/* TsfDisplay.getAllBrandList */
+		SELECT	Z.BRAND_GROUP_NO
+		      , FN_GET_BRAND_INITIAL(Z.BRAND_GROUP_NM) AS BRAND_INITIAL
+		      , Z.BRAND_GROUP_NM
+		      , Z.DISP_NM_LANG
+		      , Z.BRAND_GROUP_ENM
+		      , Z.BRAND_GROUP_KNM
+		      , Z.LOGO_FILE_NM
+		FROM (
+		      SELECT  BG.BRAND_GROUP_NO
+		            , (CASE WHEN BG.DISP_NM_LANG = 'EN' THEN BG.BRAND_GROUP_ENM ELSE BG.BRAND_GROUP_KNM END) AS BRAND_GROUP_NM
+		            , BG.DISP_NM_LANG
+		            , BG.BRAND_GROUP_ENM
+		            , BG.BRAND_GROUP_KNM
+		            , BG.LOGO_FILE_NM
+		      FROM	TB_BRAND B
+		      INNER JOIN TB_BRAND_GROUP BG ON B.BRAND_GROUP_NO = BG.BRAND_GROUP_NO
+		      WHERE	1=1
+		      AND	B.USE_YN = 'Y'
+		      AND	BG.USE_YN = 'Y'
+		      <if test='selfYn != null and selfYn == "Y"'>
+		      AND	B.SELF_YN = 'Y'
+		      AND	(BG.LOGO_FILE_NM <![CDATA[<>]]> '' AND BG.LOGO_FILE_NM IS NOT NULL)
+		      </if>
+		      <if test="brandGroupNo != null and brandGroupNo != ''">
+		      AND	B.BRAND_GROUP_NO = #{brandGroupNo}
+		      </if>
+		      <if test="brandGroupNm != null and brandGroupNm != ''">
+		      AND	(BG.BRAND_GROUP_ENM LIKE CONCAT('%',#{brandGroupNm},'%') OR BG.BRAND_GROUP_KNM LIKE CONCAT('%',#{brandGroupNm},'%'))
+		      </if>
+		      GROUP BY BG.BRAND_GROUP_NO
+		) Z
+		WHERE	1=1
+		ORDER BY (CASE  WHEN ASCII(SUBSTRING(Z.BRAND_GROUP_NM,1)) BETWEEN 48 AND 57 THEN 3
+		                WHEN ASCII(SUBSTRING(Z.BRAND_GROUP_NM,1)) <![CDATA[<]]> 128 THEN 2 ELSE 1 END), Z.BRAND_GROUP_NM
+	</select>
+	
+	<!-- 브랜드그룹의 기본카테고리여부 조회 -->
+	<select id="getBrandGroupDefaultCategoryYn" parameterType="Integer" resultType="String">
+		/* TsfDisplay.getBrandGroupDefaultCategoryYn */
+		SELECT DEFAULT_CATE_YN
+		FROM   TB_BRAND_GROUP
+		WHERE  BRAND_GROUP_NO = #{brandGroupNo}
+	</select>
+	
 </mapper>

+ 15 - 1
src/main/java/com/style24/persistence/mybatis/shop/TsfOrder.xml

@@ -281,6 +281,8 @@
 			 , SUM(OD.SAVE_PNT_AMT)     AS SAVE_PNT_AMT
 			 , SUM(DF.DELV_CPN_DC_AMT)  AS DELV_CPN_DC_AMT
 			 , SUM(DF.REAL_DELV_AMT)    AS REAL_DELV_AMT
+			 , SUM(P.PAY_AMT)           AS PAY_AMT
+			 , SUM(P.NPAY_PNT_AMT)      AS NPAY_PNT_AMT
 		  FROM TB_ORDER_DETAIL OD
 		  LEFT OUTER JOIN (
 			  SELECT ORD_NO
@@ -291,8 +293,18 @@
 				 AND DELV_FEE_GB = 'G018_10'
 			   GROUP BY ORD_NO
 		  ) DF
-		  ON OD.ORD_NO = DF.ORD_NO
+		    ON OD.ORD_NO = DF.ORD_NO
+		  LEFT OUTER JOIN (
+		      SELECT ORD_NO
+		           , SUM(PAY_AMT)    AS PAY_AMT
+		           , SUM(NPAY_PNT_AMT)    AS NPAY_PNT_AMT
+		        FROM TB_PAYMENT
+		       WHERE ORD_NO = #{ordNo}
+		       GROUP BY ORD_NO
+		  ) P
+		    ON OD.ORD_NO = P.ORD_NO
 		 WHERE OD.ORD_NO = #{ordNo}
+		   AND OD.ORD_DTL_STAT NOT IN ('G013_00', 'G013_11', 'G013_25', 'G013_97', 'G013_98', 'G013_99')
 	</select>
 
 	<!-- 마이페이지 주문상세 결제정보 조회 -->
@@ -381,6 +393,7 @@
 		 INNER JOIN TB_ORDER_DETAIL OD
 		    ON OD.DELV_ADDR_SQ = DA.DELV_ADDR_SQ
 		   AND OD.ORD_NO = #{ordNo}
+		   AND OD.ORD_EXCH_GB = 'O'
 		<if test="supplyCompCd != null and supplyCompCd != ''">
 		   AND OD.SUPPLY_COMP_CD = #{supplyCompCd}
 		</if>
@@ -392,6 +405,7 @@
 		</if>
 		  LEFT OUTER JOIN TB_DELIVERY_LOC DL
 		    ON OD.DELV_LOC_CD = DL.DELV_LOC_CD
+		   AND DL.USE_YN = 'Y'
 		 LIMIT 1
 	</select>
 

+ 210 - 15
src/main/java/com/style24/persistence/mybatis/shop/TsfOrderChange.xml

@@ -522,7 +522,7 @@
 		  FROM (SELECT OC.ORD_CHG_SQ
 		             , OC.CHG_GB
 		             , OCD.CHG_QTY
-		             , O.ORD_DT
+		             , DATE_FORMAT(O.ORD_DT, '%Y.%m.%d')                                AS ORD_DT
 		             , DATE_FORMAT(OCDH.REG_DT, '%Y.%m.%d')                             AS CHG_DATE
 		             , DATE_FORMAT(OCDH.REG_DT,'%H:%i:%S')                              AS CHG_TIME
 		             , OCD.CHG_ORD_DTL_NO
@@ -586,26 +586,45 @@
 			</otherwise>
 		</choose>
 		<if test="ordChgSq != null and ordChgSq != ''">
-			AND OC.ORD_CHG_SQ = #{ordChgSq}
+		           AND OC.ORD_CHG_SQ = #{ordChgSq}
 		</if>
 		<if test="ordDtlNoArr != null">
-			AND OD.ORD_DTL_NO IN
+		           AND OD.ORD_DTL_NO IN
 			<foreach collection="ordDtlNoArr" item="item" index="index"  open="(" close=")" separator=",">
 				#{item}
 			</foreach>
 		</if>
 		<if test="ordChgSqArr != null">
-			AND OC.ORD_CHG_SQ IN
+		           AND OC.ORD_CHG_SQ IN
 			<foreach collection="ordChgSqArr" item="item" index="index"  open="(" close=")" separator=",">
 				#{item}
 			</foreach>
 		</if>
 		<if test="chgStat != null and chgStat != ''">
-			AND OCD.CHG_STAT = #{chgStat}
+			<choose>
+				<when test="chgStat == 'G685_34'">
+		           AND OCD.CHG_STAT = 'G685_40'
+		           AND EXISTS (SELECT 1
+		                         FROM TB_ORDER_DETAIL OD2
+		                        WHERE OD2.ORD_DTL_NO = OCD.CHG_ORD_DTL_NO
+		                          AND OD2.ORD_DTL_STAT IN ('G013_20', 'G013_30', 'G013_35', 'G013_40', 'G013_50', 'G013_55'))
+				</when>
+				<when test="chgStat == 'G685_40'">
+		           AND OCD.CHG_STAT = 'G685_40'
+		           AND EXISTS (SELECT 1
+		                         FROM TB_ORDER_DETAIL OD2
+		                        WHERE OD2.ORD_DTL_NO = OCD.CHG_ORD_DTL_NO
+		                          AND OD2.ORD_DTL_STAT IN ('G013_60', 'G013_70'))
+				</when>
+				<otherwise>
+		           AND OCD.CHG_STAT = #{chgStat}
+				</otherwise>
+			</choose>
 		</if>
 		  ) Z
 		 GROUP BY Z.ORD_CHG_SQ, Z.CHG_GB, Z.CHG_QTY, Z.ORD_DT, Z.CHG_DATE, Z.CHG_TIME, Z.CHG_ORD_DTL_NO, Z.CHG_STAT, Z.CHG_STAT_NM, Z.ORD_NO, Z.ORD_DTL_NO, Z.GOODS_CD, Z.BRAND_NM
 		        , Z.SHOT_DELV_YN, Z.SELF_GOODS_YN, Z.GOODS_NM, Z.GOODS_TYPE, Z.LIST_PRICE, Z.ADD_PAY_COST, Z.SYS_IMG_NM, Z.GIFT_PACK_YN, Z.REFUND_AMT
+		 ORDER BY Z.ORD_CHG_SQ DESC
 	</select>
 
 	<!-- 마이페이지 취반교 조회 페이징 처리 주문변경번호 수 조회 -->
@@ -613,14 +632,30 @@
 		/* TsfOrderChange.getPagingCreListCount */
 		SELECT COUNT(*) AS CNT
 		  FROM (SELECT OCD.ORD_CHG_SQ
-		          FROM TB_ORDER O
+		          FROM TB_ORDER_CHANGE OC
+		         INNER JOIN TB_ORDER_CHANGE_DETAIL OCD
+		            ON OC.ORD_CHG_SQ = OCD.ORD_CHG_SQ
+		         INNER JOIN TB_ORDER_CHANGE_DETAIL_HST OCDH
+		            ON OCD.ORD_CHG_SQ = OCDH.ORD_CHG_SQ
+		           AND OCD.ORD_DTL_NO = OCDH.ORD_DTL_NO
+		           AND OCD.CHG_STAT = OCDH.CHG_STAT
 		         INNER JOIN TB_ORDER_DETAIL OD
-		            ON O.ORD_NO = OD.ORD_NO
-		          LEFT OUTER JOIN TB_ORDER_CHANGE_DETAIL OCD
-		            ON OD.ORD_DTL_NO = OCD.ORD_DTL_NO
+		            ON OCD.ORD_DTL_NO = OD.ORD_DTL_NO
+		           AND OD.ORD_DTL_STAT NOT IN ('G013_00', 'G013_11', 'G013_25')
+		         INNER JOIN TB_ORDER O
+		            ON OD.ORD_NO = O.ORD_NO
+		         INNER JOIN TB_ORDER_DETAIL_ITEM ODI
+		            ON OD.ORD_NO = ODI.ORD_NO
+		           AND OD.ORD_DTL_NO = ODI.ORD_DTL_NO
+		           AND OD.ORD_DTL_STAT NOT IN ('G013_00', 'G013_11', 'G013_25')
+		         INNER JOIN TB_GOODS G1
+		            ON OD.GOODS_CD = G1.GOODS_CD
+		         INNER JOIN TB_GOODS G2
+		            ON ODI.ITEM_CD = G2.GOODS_CD
+		         INNER JOIN TB_BRAND B
+		            ON G1.BRAND_CD = B.BRAND_CD
 		         WHERE O.CUST_NO = #{custNo}
 		           AND O.DISP_YN = 'Y'
-		           AND OCD.ORD_CHG_SQ IS NOT NULL
 		<if test="stDate != null and stDate != '' and edDate != null and edDate != ''">
 		           AND OCD.REG_DT BETWEEN CONCAT(#{stDate}, ' 00:00:00') AND CONCAT(#{edDate}, ' 23:59:59')
 		</if>
@@ -637,14 +672,30 @@
 		<include refid="selectForPagingHeader"/>
 		SELECT OCD.ORD_CHG_SQ
 		     , RANK() OVER(ORDER BY OCD.ORD_CHG_SQ DESC) AS NUMB
-		  FROM TB_ORDER O
+		  FROM TB_ORDER_CHANGE OC
+		 INNER JOIN TB_ORDER_CHANGE_DETAIL OCD
+		    ON OC.ORD_CHG_SQ = OCD.ORD_CHG_SQ
+		 INNER JOIN TB_ORDER_CHANGE_DETAIL_HST OCDH
+		    ON OCD.ORD_CHG_SQ = OCDH.ORD_CHG_SQ
+		   AND OCD.ORD_DTL_NO = OCDH.ORD_DTL_NO
+		   AND OCD.CHG_STAT = OCDH.CHG_STAT
 		 INNER JOIN TB_ORDER_DETAIL OD
-		    ON O.ORD_NO = OD.ORD_NO
-		  LEFT OUTER JOIN TB_ORDER_CHANGE_DETAIL OCD
-		    ON OD.ORD_DTL_NO = OCD.ORD_DTL_NO
+		    ON OCD.ORD_DTL_NO = OD.ORD_DTL_NO
+		   AND OD.ORD_DTL_STAT NOT IN ('G013_00', 'G013_11', 'G013_25')
+		 INNER JOIN TB_ORDER O
+		    ON OD.ORD_NO = O.ORD_NO
+		 INNER JOIN TB_ORDER_DETAIL_ITEM ODI
+		    ON OD.ORD_NO = ODI.ORD_NO
+		   AND OD.ORD_DTL_NO = ODI.ORD_DTL_NO
+		   AND OD.ORD_DTL_STAT NOT IN ('G013_00', 'G013_11', 'G013_25')
+		 INNER JOIN TB_GOODS G1
+		    ON OD.GOODS_CD = G1.GOODS_CD
+		 INNER JOIN TB_GOODS G2
+		    ON ODI.ITEM_CD = G2.GOODS_CD
+		 INNER JOIN TB_BRAND B
+		    ON G1.BRAND_CD = B.BRAND_CD
 		 WHERE O.CUST_NO = #{custNo}
 		   AND O.DISP_YN = 'Y'
-		   AND OCD.ORD_CHG_SQ IS NOT NULL
 		<if test="stDate != null and stDate != '' and edDate != null and edDate != ''">
 		   AND OCD.REG_DT BETWEEN CONCAT(#{stDate}, ' 00:00:00') AND CONCAT(#{edDate}, ' 23:59:59')
 		</if>
@@ -696,4 +747,148 @@
 		  ) Z
 		 GROUP BY Z.ORD_CHG_SQ, Z.CHG_GB, Z.ORD_DTL_NO, Z.ORG_ORD_DTL_NO, Z.ORD_DTL_STAT
 	</select>
+	
+	<!-- 마이페이지 취소 상세 정보 조회 -->
+	<select id="getCreCancelDetailInfo" parameterType="OrderChange" resultType="OrderChange">
+		/* TsfOrderChange.getCreCancelDetailInfo */
+		SELECT GROUP_CONCAT(Z.ITEM_NM ORDER BY Z.ORD_DTL_ITEM_SQ SEPARATOR '!@!')       AS ITEM_NM
+		     , GROUP_CONCAT(Z.COLOR_NM ORDER BY Z.ORD_DTL_ITEM_SQ)                      AS COLOR_NM
+		     , GROUP_CONCAT(Z.OPT_CD1 ORDER BY Z.ORD_DTL_ITEM_SQ)                       AS OPT_CD1
+		     , GROUP_CONCAT(Z.OPT_CD2 ORDER BY Z.ORD_DTL_ITEM_SQ)                       AS OPT_CD2
+		     , Z.ORD_CHG_SQ
+		     , Z.CHG_GB
+		     , Z.CHG_QTY
+		     , Z.ORD_DT
+		     , Z.CHG_DATE
+		     , Z.CHG_TIME
+		     , Z.CHG_DT
+		     , Z.COMPLETE_DT
+		     , Z.CHG_STAT
+		     , Z.CHG_STAT_NM
+		     , Z.ORD_NO
+		     , Z.ORD_AMT
+		     , Z.ORD_QTY
+		     , Z.CPN1_DC_AMT
+		     , Z.REAL_ORD_AMT
+		     , Z.PNT_DC_AMT
+		     , Z.GFCD_USE_AMT
+		     , Z.ORD_DTL_NO
+		     , Z.GOODS_CD
+		     , Z.BRAND_NM
+		     , Z.SHOT_DELV_YN
+		     , Z.SELF_GOODS_YN
+		     , Z.GOODS_NM
+		     , Z.GOODS_TYPE
+		     , Z.LIST_PRICE
+		     , Z.ADD_PAY_COST
+		     , Z.SYS_IMG_NM
+		     , Z.GIFT_PACK_YN
+		     , Z.REFUND_AMT
+		     , Z.RF_CPN1_AMT
+		     , Z.RF_TMTB1_AMT
+		     , Z.RF_TMTB2_AMT
+		     , Z.RF_GOODS_CPN_AMT
+		     , Z.RF_CART_CPN_AMT
+		     , Z.RF_PNT_AMT
+		     , Z.RF_PRE_PNT_AMT
+		     , Z.RF_GFCD_USE_AMT
+		     , Z.RF_CNCL_AMT
+		     , Z.RF_DELIVERY_FEE
+		     , Z.RF_REAL_CNCL_AMT
+		  FROM (SELECT OC.ORD_CHG_SQ
+		             , OC.CHG_GB
+		             , OCD.CHG_QTY
+		             , DATE_FORMAT(O.ORD_DT, '%Y.%m.%d')                                AS ORD_DT
+		             , DATE_FORMAT(OCDH.REG_DT, '%Y.%m.%d')                             AS CHG_DATE
+		             , DATE_FORMAT(OCDH.REG_DT,'%H:%i:%S')                              AS CHG_TIME
+		             , DATE_FORMAT(OCD.REG_DT, '%Y.%m.%d')                              AS CHG_DT
+		             , DATE_FORMAT(OCD.COMPLETE_DT, '%Y.%m.%d')                         AS COMPLETE_DT
+		             , OCD.CHG_STAT
+		             , FN_GET_CODE_NM('G685', OCD.CHG_STAT)                             AS CHG_STAT_NM
+		             , OD.ORD_NO
+		             , OD.ORD_AMT
+		             , OD.ORD_QTY
+		             , OD.CPN1_DC_AMT
+		             , OD.REAL_ORD_AMT
+		             , OD.PNT_DC_AMT
+		             , OD.GFCD_USE_AMT
+		             , OCD.ORD_DTL_NO
+		             , G1.GOODS_CD
+		             , CONCAT(B.BRAND_ENM, ' ', B.BRAND_KNM)                            AS BRAND_NM
+		             , OD.SHOT_DELV_YN
+		             , G1.SELF_GOODS_YN
+		             , G1.GOODS_NM
+		             , IFNULL(C.COLOR_KNM, ODI.OPT_CD1)                                 AS COLOR_NM
+		             , G2.GOODS_NM                                                      AS ITEM_NM
+		             , G1.GOODS_TYPE
+		             , ODI.ORD_DTL_ITEM_SQ
+		             , ODI.OPT_CD1
+		             , ODI.OPT_CD2
+		             , G1.LIST_PRICE
+		             , OC.ADD_PAY_COST
+		             , CASE WHEN G1.GOODS_TYPE != 'G056_S' AND G1.SELF_GOODS_YN = 'Y' THEN (SELECT MAX(SYS_IMG_NM) FROM TB_GOODS_IMG WHERE GOODS_CD = G1.GOODS_CD AND COLOR_CD = ODI.OPT_CD1 AND DEFAULT_IMG_YN = 'Y')
+		                    ELSE (SELECT MAX(SYS_IMG_NM) FROM TB_GOODS_IMG WHERE GOODS_CD = G1.GOODS_CD AND COLOR_CD = IFNULL(G1.MAIN_COLOR_CD,'XX') AND DEFAULT_IMG_YN = 'Y') END AS SYS_IMG_NM
+		             , OD.GIFT_PACK_YN
+		             , R.REFUND_AMT
+		             , R.RF_CPN1_AMT
+		             , R.RF_TMTB1_AMT
+		             , R.RF_TMTB2_AMT
+		             , R.RF_GOODS_CPN_AMT
+		             , R.RF_CART_CPN_AMT
+		             , R.RF_PNT_AMT
+		             , R.RF_PRE_PNT_AMT
+		             , R.RF_GFCD_USE_AMT
+		             , R.RF_CNCL_AMT
+		             , R.RF_DELIVERY_FEE
+		             , R.RF_REAL_CNCL_AMT
+		          FROM TB_ORDER_CHANGE OC
+		         INNER JOIN TB_ORDER_CHANGE_DETAIL OCD
+		            ON OC.ORD_CHG_SQ = OCD.ORD_CHG_SQ
+		         INNER JOIN TB_ORDER_CHANGE_DETAIL_HST OCDH
+		            ON OCD.ORD_CHG_SQ = OCDH.ORD_CHG_SQ
+		           AND OCD.ORD_DTL_NO = OCDH.ORD_DTL_NO
+		           AND OCD.CHG_STAT = OCDH.CHG_STAT
+		         INNER JOIN TB_ORDER_DETAIL OD
+		            ON OCD.ORD_DTL_NO = OD.ORD_DTL_NO
+		           AND OD.ORD_DTL_STAT NOT IN ('G013_00', 'G013_11', 'G013_25')
+		         INNER JOIN TB_ORDER O
+		            ON OD.ORD_NO = O.ORD_NO
+		         INNER JOIN TB_ORDER_DETAIL_ITEM ODI
+		            ON OD.ORD_NO = ODI.ORD_NO
+		           AND OD.ORD_DTL_NO = ODI.ORD_DTL_NO
+		           AND OD.ORD_DTL_STAT NOT IN ('G013_00', 'G013_11', 'G013_25')
+		         INNER JOIN TB_GOODS G1
+		            ON OD.GOODS_CD = G1.GOODS_CD
+		         INNER JOIN TB_GOODS G2
+		            ON ODI.ITEM_CD = G2.GOODS_CD
+		         INNER JOIN TB_BRAND B
+		            ON G1.BRAND_CD = B.BRAND_CD
+		          LEFT OUTER JOIN TB_COLOR C
+		            ON C.COLOR_CD = IFNULL(NULLIF(ODI.OPT_CD1,'') , G1.MAIN_COLOR_CD)
+		           AND C.USE_YN = 'Y'
+		          LEFT OUTER JOIN TB_REFUND R
+		            ON R.ORD_CHG_SQ = OC.ORD_CHG_SQ
+		         WHERE OCD.DEL_YN = 'N'
+		           AND O.DISP_YN = 'Y'
+		<choose>
+			<when test="custNo != null and custNo != ''">
+		           AND O.CUST_NO = #{custNo}
+			</when>
+			<otherwise>
+		           AND O.ORD_NO = #{ordNo}
+		           AND O.ORD_NM = #{orderNm}
+			</otherwise>
+		</choose>
+		<if test="ordChgSq != null and ordChgSq != ''">
+		           AND OC.ORD_CHG_SQ = #{ordChgSq}
+		</if>
+		  ) Z
+		 GROUP BY Z.ORD_CHG_SQ, Z.CHG_GB, Z.CHG_QTY, Z.ORD_DT, Z.CHG_DATE, Z.CHG_TIME, Z.CHG_DT, Z.COMPLETE_DT, Z.CHG_STAT
+				, Z.CHG_STAT_NM, Z.ORD_NO, Z.ORD_AMT, Z.ORD_QTY, Z.CPN1_DC_AMT, Z.REAL_ORD_AMT, Z.PNT_DC_AMT
+				, Z.GFCD_USE_AMT, Z.ORD_DTL_NO, Z.GOODS_CD, Z.BRAND_NM, Z.SHOT_DELV_YN, Z.SELF_GOODS_YN, Z.GOODS_NM
+				, Z.GOODS_TYPE, Z.LIST_PRICE, Z.ADD_PAY_COST, Z.SYS_IMG_NM, Z.GIFT_PACK_YN, Z.REFUND_AMT, Z.RF_CPN1_AMT, Z.RF_TMTB1_AMT
+				, Z.RF_TMTB2_AMT, Z.RF_GOODS_CPN_AMT, Z.RF_CART_CPN_AMT, Z.RF_PNT_AMT, Z.RF_PRE_PNT_AMT, Z.RF_GFCD_USE_AMT, Z.RF_CNCL_AMT
+				, Z.RF_DELIVERY_FEE, Z.RF_REAL_CNCL_AMT
+		 ORDER BY Z.ORD_CHG_SQ DESC
+	</select>
 </mapper>

+ 12 - 3
src/main/java/com/style24/persistence/mybatis/shop/TsfSocial.xml

@@ -41,11 +41,12 @@
 		         , G.PARALLEL_IMPORT_YN                                      /*병행수입여부*/
 		         , G.ORDER_MADE_YN                                           /*주문제작여부*/
 		         , G.LIST_PRICE                                              /*정상가*/
-		         , SG.CURR_APRICE                          AS CURR_PRICE     /*변경후현재판매가*/
+		         , FN_GET_BENEFIT_PRICE( 'P' /**P*/,G.GOODS_CD,SG.CURR_APRICE, 'G100_10' /**P*/)                     AS CURR_PRICE    /*현재판매가*/
 		         , SG.DC_ARATE                             AS DC_RATE        /*변경후할인율*/
 		         , SG.DISP_ORD                                               /*노출순서*/
 		         , G.GOODS_TYPE                                              /*상품유형*/
 		         , G.GOODS_STAT                                              /*상품상태*/
+		         , G.MIN_ORD_QTY 											 /*최소 주문수량*/
 		         , ROW_NUMBER() OVER(ORDER BY SG.DISP_ORD
 		                                    , SG.GOODS_CD) AS NUMB
 		    FROM   TB_SOCIAL S
@@ -88,6 +89,7 @@
 		, TAB_STOCK AS (
 		    SELECT G.GOODS_CD
 		         , SUM(S.CURR_STOCK_QTY - S.BASE_STOCK_QTY) AS STOCK_QTY_SUM
+		         , MIN(CASE WHEN S.SOLDOUT_YN = 'N' THEN S.OPT_CD ELSE 'XXX' END) AS OPT_CD 
 		    FROM   TAB_GOODS G
 		         , VW_STOCK S
 		    WHERE  G.GOODS_CD = S.GOODS_CD
@@ -97,6 +99,7 @@
 		    UNION ALL 
 		    SELECT G.GOODS_CD
 		         , SUM(S.CURR_STOCK_QTY - S.BASE_STOCK_QTY) AS STOCK_QTY_SUM
+		         , MIN(CASE WHEN S.SOLDOUT_YN = 'N' THEN S.OPT_CD ELSE 'XXX' END) AS OPT_CD 
 		    FROM   TAB_GOODS G
 		         , VW_STOCK_COMPOSE S
 		    WHERE  G.GOODS_CD = S.GOODS_CD
@@ -108,13 +111,19 @@
 		     , G.GOODS_CD
 		     , FN_GET_GOODS_NM(G.GOODS_NM,G.GOODS_GB,G.FOREIGN_BUY_YN,G.PARALLEL_IMPORT_YN,G.ORDER_MADE_YN) AS GOODS_FULL_NM /*상품FULL명*/
 		     , G.GOODS_TNM
+		     , G.GOODS_TYPE
+		     , G.BRAND_GROUP_NM
+		     , G.GOODS_NM
+		     , G.GOODS_TNM
 		     , G.MAIN_COLOR_CD
 		     , G.LIST_PRICE
-		     , G.CURR_PRICE    /*현재판매가*/
-		     , G.DC_RATE
+		     , FN_GET_BENEFIT_PRICE(#{frontGb},G.GOODS_CD,G.CURR_PRICE,#{custGb})                     AS CURR_PRICE    /*현재판매가*/
+		     , 100 - ROUND((G.CURR_PRICE / G.LIST_PRICE) * 100 ,0) AS DC_RATE 
 		     , GI.SYS_IMG_NM
 		     , GI.SYS_IMG_NM2
 		     , S.STOCK_QTY_SUM
+		     , S.OPT_CD
+		     , G.MIN_ORD_QTY 
 		     <choose>
 		         <when test="custNo != null and custNo > 0"> <!-- 로그인 했으면 -->
 		     , IF(W.GOODS_CD IS NULL,'','likeit')                                                           AS LIKE_IT       /*위시리스트담긴상품*/

+ 19 - 10
src/main/java/com/style24/persistence/mybatis/shop/TsfWishlist.xml

@@ -55,18 +55,10 @@
 			         , G.LIST_PRICE                                             /*정상가(최초판매가)*/
 			         , G.CURR_PRICE                                             /*현재판매가*/
 			         , G.MIN_ORD_QTY                                            /*최소주문수량*/  				
-			         , S.OPT_CD
 			         , GS.STOCK_QTY
+			         , MIN(CASE WHEN SOLDOUT_YN = 'N' THEN OPT_CD ELSE 'XXX' END) AS OPT_CD
 			    FROM   TB_WISHlIST W
-			         , TB_GOODS G LEFT OUTER JOIN (SELECT GOODS_CD
-		                                                   , SUM(CASE WHEN SOLDOUT_YN = 'Y' THEN 0
-		                                                                                       ELSE CURR_STOCK_QTY END) AS STOCK_QTY
-		                                                    , MIN(SOLDOUT_YN) AS SOLDOUT_YN
-		                                                    , MIN(CASE WHEN SOLDOUT_YN = 'N' THEN OPT_CD 
-		                                                                                       ELSE 'XXX' END) AS OPT_CD 
-		                                                  FROM VW_STOCK
-		                                                  WHERE DISP_YN = 'Y'
-		                                                  GROUP BY GOODS_CD) S ON G.GOODS_CD = S.GOODS_CD
+			         , TB_GOODS G LEFT OUTER JOIN VW_STOCK VS ON G.GOODS_CD = VS.GOODS_CD 
 			         , TB_GOODS_STOCK GS
 			         , TB_BRAND B
 			         , TB_BRAND_GROUP BG
@@ -80,6 +72,23 @@
 			    AND    BG.USE_YN = 'Y'
 			    AND    W.CUST_NO = #{custNo}
 			    AND    NOW() BETWEEN G.SELL_STDT AND G.SELL_EDDT
+			    GROUP BY W.AF_LINK_CD 
+			          ,W.CONTENTS_LOC 
+			          ,W.CUST_NO 
+			          ,W.REG_DT
+			         , G.GOODS_CD                                               /*상품코드*/
+			         , G.GOODS_NM                                               /*상품명*/
+			         , G.GOODS_GB                                               /*상품구분*/
+			         , G.GOODS_TYPE 											/*상품타입*/
+			         , G.FOREIGN_BUY_YN                                         /*해외구매대행여부*/
+			         , G.PARALLEL_IMPORT_YN                                     /*병행수입여부*/
+			         , G.ORDER_MADE_YN                                          /*주문제작여부*/
+			         , G.GOODS_TNM                                              /*상품타이틀명*/
+			         , G.MAIN_COLOR_CD                                          /*대표색상코드*/
+			         , G.LIST_PRICE                                             /*정상가(최초판매가)*/
+			         , G.CURR_PRICE                                             /*현재판매가*/
+			         , G.MIN_ORD_QTY                                            /*최소주문수량*/  				
+			         , GS.STOCK_QTY
 			)
 			, TAB_GOODS_IMG AS (
 			    SELECT PG.GOODS_CD

+ 164 - 154
src/main/webapp/WEB-INF/views/mob/SigninFormMob.html

@@ -20,19 +20,19 @@
 
 <th:block layout:fragment="content">
 	<main class="container mb">
-		<div class="close">
-			<a href="javascript:history.back(-1);" class="btn_close"><span></span><span></span></a>
-		</div>
-
 		<!-- ★ 컨텐츠 시작 -->
 		<section class="content mb_login">
-
+			<div class="inner">
+				<div class="close"><a href="javascript:history.back(-1);" class="btn_close"><span></span><span></span></a></div>
+			</div>
 			<div class="inner">
 				<h2 class="title">로그인</h2>
 			</div>
 			<div class="inner">
 				<form class="form_wrap form_full" name="loginForm" id="loginForm" th:action="@{/login}" method="post">
-					<div class="form_head"><h3 class="title sr-only">로그인</h3></div>
+					<div class="form_head">
+						<h3 class="title sr-only">로그인</h3>
+					</div>
 					<div class="form_field mt0">
 						<input type="text" name="loginId" placeholder="아이디" class="form_control"minlength="4" maxlength="12" required="required" data-valid-type="alphaNumeric" data-valid-name="아이디"/>
 					</div>
@@ -47,37 +47,23 @@
 						</div>
 						<div class="right">
 							<ul>
-								<li><a href="javascript:void(0)" onclick="cfnGoToPage(_PAGE_CUSTOMER_ID_FIND);">아이디찾기</a></li>
-								<li><a href="javascript:void(0)" onclick="cfnGoToPage(_PAGE_CUSTOMER_PWD_FIND);">비밀번호 찾기</a></li>
+								<li>
+									<a href="javascript:void(0)" onclick="cfnGoToPage(_PAGE_CUSTOMER_ID_FIND);">아이디찾기</a>
+								</li>
+								<li>
+									<a href="javascript:void(0)" onclick="cfnGoToPage(_PAGE_CUSTOMER_PWD_FIND);">비밀번호 찾기</a>
+								</li>
 							</ul>
 						</div>
 					</div>
 					<div class="help_block">
 						<!-- 보안문자 입력시 -->
-						<div>
-							<div class="captcha" style="display: none;"> <!-- 캡차영역 -->
-								<ul>
-									<li class="lap"> <!-- 캡차이미지 -->
-										<div class="captcha_box"> <!-- 캡차이미지 -->
-											<img src="" id="imgCaptcha"/>
-										</div>
-										<div class="captcha_btn_dual">
-											<button type="button" id="play_audio" onclick="fnReloadCaptchaImage();">새로고침</button>
-											<button type="button" id="swap_captcha">음성듣기</button>
-										</div>
-									</li>
-									<li class="captcha_area">
-										<label for="captcha" id="label_captcha_area" class="sr-only">보안문자 입력</label>
-										<input type="text" id="captcha" name="captcha" placeholder="위 보안문자 이미지에 보이는 문자 입력" title="문자입력"/>
-									</li>
-								</ul>
-							</div>
-							<p class="t_err mt10 t_err_login_fail" style="display: none;">
+							<div id="recaptcha" class="g-recaptcha" style="display: none;" data-callback="fnRecaptchaCallback" th:data-sitekey="${sitekey}"></div>
+							<p class="t_err t_err_login_fail" style="display: none;">
 								<span id="err_msg">보안문자 입력을 다시 시도해 주세요.</span><br>
 								(10회 이상 실패하면 180초 동안 로그인이 불가능 합니다.)<br>
 								<span id="login_fail_cnt">4</span>회 실패 / 잔여 : <span id="login_remain_cnt">6</span>회<span id="blockSecs1" style="display: none;"> / <span id="blockSecs2">180</span>초 남음
 							</p>
-						</div>
 						<!-- //보안문자 입력시 -->
 					</div>
 					<div class="ui_row mt20">
@@ -88,128 +74,56 @@
 					<h3 class="sr-only">간편로그인</h3>
 					<ul class="login_utill">
 						<li class="lu_kakao">
-							<a href="javascript:void(0)">
+							<a href="javascript:void(0)" onclick="cfnLoginKakao();">
 								<div class="ico"></div>카카오로<br>시작하기
 							</a>
 						</li>
 						<li class="lu_naver">
-							<a href="javascript:void(0)">
+							<a href="javascript:void(0)" onclick="cfnLoginNaver();">
 								<div class="ico"></div>네이버로<br>시작하기
 							</a>
 						</li>
 						<li class="lu_yes24">
-							<a href="javascript:void(0)">
+							<a href="javascript:void(0)" onclick="cfnLoginYes24();">
 								<div class="ico"></div>YES24로<br>시작하기
 							</a>
 						</li>
 					</ul>
 				</div>
-				<div class="t_c mt30"><botton class="btn_nonMb">비회원 주문조회</botton>
+				<div class="t_c mt30">
+					<botton class="btn_nonMb">비회원 주문조회</botton>
 				</div>
-
+			</div>
 		</section>
-		<!-- ★ 컨텐츠 종료 -->
-
+	<!--  컨텐츠 종료 -->
 	</main>
 
 <script th:inline="javascript">
 /*<![CDATA[*/
 	let ckLoginId = "ckLoginId";
+	let rechaptchCheck = true;
 
-	// 로그인블락시간(초) 설정
-	let fnSetLoginBlockTime = function() {
-		let blockSecs = Number($("#blockSecs2").html()) - 1;
-		$("#blockSecs2").html(blockSecs);
-		if (blockSecs == 0) {
-			clearTimeout(fnSetLoginBlockTime);
-			$('#btnLogin').attr('disabled',false);
-		} else {
-			setTimeout(fnSetLoginBlockTime, 1000);
-		}
-	}
-	
 	// 로그인
 	$('#btnLogin').on('click', function() {
 		if (!gagajf.validation($('#loginForm'))) {
 			return;
 		}
+		if (!rechaptchCheck) {
+			mcxDialog.alert("자동 방지 봇을 확인 한뒤 진행 해 주세요.");
+			return;
+		}
 
-		let params = new Object();
+		let params = {};
 		params.loginId = $('#loginForm input[name=loginId]').val();
 		params.passwd = $('#loginForm input[name=passwd]').val();
-		
+
 		$.post($('#loginForm').prop('action')
 			, $.param(params)
-			, function(result) {
-				if (result.status != 'OK') {
-
-					if (result.status == 'PWD_5WRONG') {
-						// Do nothing
-					} else if (result.status == 'DORMANT_CUST') {
-						// 휴면회원
-						mcxDialog.alertC("휴면 고객님께서는 휴면을<br>해지하신 후 사용하실 수 있습니다.", {
-							sureBtnText: "확인",
-							sureBtnClick: function() {
-								cfnGoToPage(_PAGE_CUSTOMER_DORMANT);
-							}
-						});
-
-						return;
-					} else if (result.status == 'SECEDE_CUST') {
-						// 탈퇴회원
-					} else if (result.status == 'SESSION_EXPIRED') {
-						// 세션만료
-					}
-
-					if (!gagajf.isNull(result.message)) {
-						let loginFailCnt = Number(result.loginFailInfo.loginFailCnt);
-						
-						$("#err_msg").html(result.message);
-						$("#login_fail_cnt").html(loginFailCnt);
-						$("#login_remain_cnt").html(10 - loginFailCnt);
-						$(".t_err_login_fail").show();
-						
-						if (loginFailCnt >= 5 && loginFailCnt < 10) {
-							// 비밀번호 5회 이상 틀린 경우 캡챠 노출
-							$('.captcha').show();
-						} else if (loginFailCnt >= 10) {
-							$('.captcha').hide();
-							
-							// 비밀번호 10회 이상 틀린 경우 로그인 블락
-							let blockSecs = Number(result.loginFailInfo.blockSecs);
-							if (blockSecs > 0) {
-								$("#blockSecs2").html(blockSecs);
-								fnSetLoginBlockTime();
-								$("#blockSecs1").show();
-								$('#btnLogin').attr('disabled',true);
-							}
-						}
-					}
-
-					return; // 정상적으로 로그인 되지 않았으므로 return
-				}
-				
-				document.location.href = result.returnUrl;
-				
-// 				if (gagajf.isNull(result.returnUrl)) {
-// 					cfnGoToPage(_PAGE_MAIN);
-// 				} else {
-// 					if (result.returnUrl.indexOf(_PAGE_DIRECT_BUY) > -1) {
-// 						// 바로주문
-// 						jfOrderByMember();
-// 					} else if (result.returnUrl.indexOf(_PAGE_CUSTOMER_JOIN) > -1 ||
-// 						result.returnUrl.indexOf(_PAGE_CUSTOMER_ID_FIND) > -1 ||
-// 						result.returnUrl.indexOf(_PAGE_CUSTOMER_PW_FIND) > -1 ||
-// 						result.returnUrl.indexOf(_PAGE_CUSTOMER_JOIN_COMPLETE) > -1) {
-// 						cfnGoToPage(_PAGE_MAIN);
-// 					} else {
-// 						document.location.href = result.returnUrl;
-// 					}
-// 				}
-			}
+			, fnReloadAfterLogin
 			, 'json');
 	});
-	
+
+
 	// Save ID
 	$('#chkSaveId').on('click', function() {
 		if ($(this).is(":checked")) {
@@ -222,15 +136,115 @@
 			}
 		}
 	});
-	
-	// 캡챠 이미지 로딩
-	let fnReloadCaptchaImage = function() {
-		$('#imgCaptcha').attr('src', '/common/captcha.do?dummy=' + new Date());
+
+	//엔터키 로그인
+	$('#loginForm input[name=passwd]').keypress(function (event) {
+		if (event.which === 13) {
+			event.preventDefault();
+			$('#btnLogin').trigger('click');
+		}
+	});
+
+	// 로그인 후 처리
+	var fnReloadAfterLogin = function(result) {
+		if (result.status === 'OK') {
+			document.location.href = result.returnUrl;
+		} else {
+			fnFailLoginProcess(result);
+		}
+	};
+
+	// 로그인 실패 후 과정
+	var fnFailLoginProcess = function (result) {
+		// 탈퇴회원
+		if (result.status === 'SECEDE_CUST') {
+			mcxDialog.alert("탈퇴 회원 입니다.");
+			return;
+		}
+		// 휴면회원
+		if (result.status === 'DORMANT_CUST') {
+			mcxDialog.alertC("휴면 고객님께서는 휴면을<br>해지하신 후 사용하실 수 있습니다.", {
+				sureBtnText: "확인",
+				sureBtnClick: function() {
+					cfnGoToPage(_PAGE_CUSTOMER_DORMANT);
+				}
+			});
+			return;
+		}
+		// CI(본인인증)정보 없는 회원
+		if (result.status === 'CI_EMPTY') {
+			// 본인이증 필요한 회원
+			mcxDialog.alertC("본인인증 후 다시 로그인 하시기 바랍니다.", {
+				sureBtnText: "확인",
+				sureBtnClick: function() {
+					cfnGoToPage(_PAGE_CUSTOMER_CERTIFICATION);
+				}
+			});
+			return;
+		}
+		// 비밀번호 틀린 경우
+		if (!gagajf.isNull(result.message)) {
+			grecaptcha.reset(); // 리캡챠 리셋
+			let loginFailCnt = Number(result.loginFailInfo.loginFailCnt);
+			$("#err_msg").html(result.message);
+			$("#login_fail_cnt").html(loginFailCnt);
+			$("#login_remain_cnt").html(10 - loginFailCnt);
+			$(".t_err_login_fail").show();
+
+			// 비밀번호 5회 이상 틀린 경우 캡챠 노출
+			if (loginFailCnt >= 5 && loginFailCnt < 10) {
+				$('#recaptcha').show();
+				rechaptchCheck = false;
+			// 비밀번호 10회 이상 틀린 경우 로그인 블락
+			} else if (loginFailCnt >= 10) {
+				$('#recaptcha').hide();
+				rechaptchCheck = true;
+				let blockSecs = Number(result.loginFailInfo.blockSecs);
+				if (blockSecs > 0) {
+					$("#blockSecs2").html(blockSecs);
+					fnSetLoginBlockTime();
+					$("#blockSecs1").show();
+					$('#btnLogin').attr('disabled',true);
+				}
+			}
+		}
+
+		return; // 정상적으로 로그인 되지 않았으므로 return
 	}
 
-	// SNS 로그인 콜백함수
+
+	// 구글 캡챠 콜백함수
+	var fnRecaptchaCallback = function () {
+		let token = $("#g-recaptcha-response").val();
+		let params = {};
+		params.token = token;
+		gagajf.ajaxSubmit('/verify/recaptcha','', fnVerifyReCaptchaCallback, params);
+	};
+
+	// Token 인증
+	var fnVerifyReCaptchaCallback = function (result) {
+		if (result.success) {
+			rechaptchCheck = true;
+		} else {
+			rechaptchCheck = false;
+		}
+	};
+
+	// 로그인블락시간(초) 설정
+	let fnSetLoginBlockTime = function() {
+		let blockSecs = Number($("#blockSecs2").html()) - 1;
+		$("#blockSecs2").html(blockSecs);
+		if (blockSecs <= 0) {
+			clearTimeout(fnSetLoginBlockTime);
+			$('#btnLogin').attr('disabled',false);
+		} else {
+			setTimeout(fnSetLoginBlockTime, 1000);
+		}
+	}
+
+	// SNS 로그인 콜백함수(네이버, 카카오, YES24)
 	var fnSnsSigninCallback = function(userInfo) {
-		// Ci이 조회 시 없음
+		// 1. CI 정보로 사용자가 없어서 회원가입 프로세스 처리 중 이메일, 휴대전화 중복
 		if (userInfo.custStat === 'DUP_PHONE_CUST') {
 			mcxDialog.alert("이미 사용 중인 휴대전화번호 입니다.");
 			return;
@@ -239,58 +253,54 @@
 			mcxDialog.alert("이미 사용 중인 이메일 입니다.");
 			return;
 		}
-		if (userInfo.custStat === 'EMPTY_PHONE_CUST') {
-			cfnGoToPage(_PAGE_CUSTOMER_SNS_JOIN);
-		}
-		// Ci이 조회 시 있음
+		// 2. SNS 로그인 정보로 탈퇴확인
 		if (userInfo.custStat === 'SECEDE_CUST') {
 			mcxDialog.alert("탈퇴 회원 입니다.");
 			return;
 		}
+		// 3. SNS 로그인 정보로 휴면확인
 		if (userInfo.custStat === 'DORMANT_CUST') {
-			cfnGoToPage(_PAGE_CUSTOMER_DORMANT);
+			mcxDialog.alertC("휴면 고객님께서는 휴면을<br>해지하신 후 사용하실 수 있습니다.", {
+				sureBtnText: "확인",
+				sureBtnClick: function() {
+					cfnGoToPage(_PAGE_CUSTOMER_DORMANT);
+				}
+			});
+			return;
 		}
-		if (userInfo.custStat === 'FAIL_CUST') {
-			mcxDialog.alert("회원가입에 실패 했습니다.<br> 고객센터에 문의 하시기 바랍니다.");
+		// 4. 휴대전화 정보가 없으면 SNS 가입화면 이동
+		if (userInfo.custStat === 'EMPTY_PHONE_CUST') {
+			cfnGoToPage(_PAGE_CUSTOMER_SNS_JOIN);
+		}
+		// 5. YES24 첫 로그인 시도 시 정보동의 페이지 이동
+		if (userInfo.custStat === 'NEED_AGREE_CUST') {
+			cfnConsentUseInfo(userInfo.custNm);
 			return;
 		}
+		// 6. SNS 정보로 가입 성공시 가입완료 페이지 이동
 		if (userInfo.custStat === 'NEW_CUST') {
 			cfnGoToPage(_PAGE_CUSTOMER_JOIN_COMPLETE);
+			return;
 		}
-
-
+		// 7.SNS 정보로 가입 실패시 안내 창 알림
+		if (userInfo.custStat === 'FAIL_CUST') {
+			mcxDialog.alert("회원가입에 실패 했습니다.<br> 고객센터에 문의 하시기 바랍니다.");
+			return;
+		}
+		// 8. SNS 로그인 연동 성공 및 기존 SNS 연동된 회원 로그인 시도
 		if (userInfo.custStat === 'SUCC_CUST') {
 			let params = {};
 			params.snsType = userInfo.snsType;
 			params.snsId = [[${snsLoginPrefix}]] + userInfo.snsId;
 			$.post(_frontUrl + '/login'
 				, $.param(params)
-				, function(result) {
-					fnReloadAfterLogin(result);
-				}
+				,fnReloadAfterLogin
 				, "json");
 		}
-
-
-	};
-
-	var fnReloadAfterLogin = function(result) {
-		if (result.status === 'OK') {
-			document.location.href = result.returnUrl;
-		} else if (result.status === 'EMAIL_DUP') {
-
-		} else if(result.status === 'DORMANT_CUST') {
-			cfnGoToPage(_PAGE_CUSTOMER_DORMANT);
-		} else if(result.status === 'SECEDE_CUST') {
-
-		} else {
-			//cfnGoToPage(_PAGE_CUSTOMER_JOIN_CERTIFY_SNS);
-		}
 	};
 
-
-
 	$(document).ready(function() {
+
 		$('#loginForm input[name=loginId]').val(gagajf.getCookie(ckLoginId));
 		if (gagajf.isNull($('#loginForm input[name=loginId]').val())) {
 			$('#loginForm input[name=loginId]').focus();
@@ -306,4 +316,4 @@
 </th:block>
 
 </body>
-</html>
+</html>

+ 143 - 0
src/main/webapp/WEB-INF/views/mob/SnsCallBackFormMob.html

@@ -0,0 +1,143 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : SigninFormWeb.html
+ * @desc    : 로그인 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.02.15   gagamel     최초 작성
+ *******************************************************************************
+ -->
+<head th:replace="~{mob/common/fragments/HeadMob :: head}"></head>
+<th:block th:replace="~{mob/common/fragments/VariablesMob :: variables}"></th:block>
+<th:block th:replace="~{mob/common/fragments/ScriptsMob :: scripts}"></th:block>
+<body>
+
+
+<script th:inline="javascript">
+/*<![CDATA[*/
+	const resultMap = [[${resultMap}]];
+
+	// SNS 로그인 콜백함수(네이버, 카카오, YES24)
+	var fnSnsSigninCallback = function(userInfo) {
+		// 1. CI 정보로 사용자가 없어서 회원가입 프로세스 처리 중 이메일, 휴대전화 중복
+		if (userInfo.custStat === 'DUP_PHONE_CUST') {
+			mcxDialog.alert("이미 사용 중인 휴대전화번호 입니다.");
+			return;
+		}
+		if (userInfo.custStat === 'DUP_EMAIL_CUST') {
+			mcxDialog.alert("이미 사용 중인 이메일 입니다.");
+			return;
+		}
+		// 2. SNS 로그인 정보로 탈퇴확인
+		if (userInfo.custStat === 'SECEDE_CUST') {
+			mcxDialog.alert("탈퇴 회원 입니다.");
+			return;
+		}
+		// 3. SNS 로그인 정보로 휴면확인
+		if (userInfo.custStat === 'DORMANT_CUST') {
+			mcxDialog.alertC("휴면 고객님께서는 휴면을<br>해지하신 후 사용하실 수 있습니다.", {
+				sureBtnText: "확인",
+				sureBtnClick: function() {
+					cfnGoToPage(_PAGE_CUSTOMER_DORMANT);
+				}
+			});
+			return;
+		}
+		// 4. 휴대전화 정보가 없으면 SNS 가입화면 이동
+		if (userInfo.custStat === 'EMPTY_PHONE_CUST') {
+			cfnGoToPage(_PAGE_CUSTOMER_SNS_JOIN);
+		}
+		// 5. YES24 첫 로그인 시도 시 정보동의 페이지 이동
+		if (userInfo.custStat === 'NEED_AGREE_CUST') {
+			cfnConsentUseInfo(userInfo.custNm);
+			return;
+		}
+		// 6. SNS 정보로 가입 성공시 가입완료 페이지 이동
+		if (userInfo.custStat === 'NEW_CUST') {
+			cfnGoToPage(_PAGE_CUSTOMER_JOIN_COMPLETE);
+			return;
+		}
+		// 7.SNS 정보로 가입 실패시 안내 창 알림
+		if (userInfo.custStat === 'FAIL_CUST') {
+			mcxDialog.alert("회원가입에 실패 했습니다.<br> 고객센터에 문의 하시기 바랍니다.");
+			return;
+		}
+		// 8. SNS 로그인 연동 성공 및 기존 SNS 연동된 회원 로그인 시도
+		if (userInfo.custStat === 'SUCC_CUST') {
+			let params = {};
+			params.snsType = userInfo.snsType;
+			params.snsId = [[${snsLoginPrefix}]] + userInfo.snsId;
+			$.post(_frontUrl + '/login'
+				, $.param(params)
+				,fnReloadAfterLogin
+				, "json");
+		}
+	};
+
+	// 로그인 후 처리
+	var fnReloadAfterLogin = function(result) {
+		if (result.status === 'OK') {
+			document.location.href = result.returnUrl;
+		} else {
+			fnFailLoginProcess(result);
+		}
+	};
+
+	// 로그인 실패 후 과정
+	var fnFailLoginProcess = function (result) {
+		// 탈퇴회원
+		if (result.status === 'SECEDE_CUST') {
+			mcxDialog.alert("탈퇴 회원 입니다.");
+			return;
+		}
+		// 휴면회원
+		if (result.status === 'DORMANT_CUST') {
+			mcxDialog.alertC("휴면 고객님께서는 휴면을<br>해지하신 후 사용하실 수 있습니다.", {
+				sureBtnText: "확인",
+				sureBtnClick: function() {
+					cfnGoToPage(_PAGE_CUSTOMER_DORMANT);
+				}
+			});
+			return;
+		}
+		// CI(본인인증)정보 없는 회원
+		if (result.status === 'CI_EMPTY') {
+			// 본인이증 필요한 회원
+			mcxDialog.alertC("본인인증 후 다시 로그인 하시기 바랍니다.", {
+				sureBtnText: "확인",
+				sureBtnClick: function() {
+					cfnGoToPage(_PAGE_CUSTOMER_CERTIFICATION);
+				}
+			});
+			return;
+		}
+
+		return; // 정상적으로 로그인 되지 않았으므로 return
+	}
+	$(document).ready(function() {
+		if (gagajf.isNull(resultMap.snsId) && gagajf.isNull(resultMap.snsType)){
+			mcxDialog.alertC("인증에 실패하였습니다.<br> 로그인 정보를 확인해주시기 바랍니다.", {
+				sureBtnText: "확인",
+				sureBtnClick: function() {
+					cfnGoToPage(_PAGE_LOGIN);
+				}
+			});
+		} else {
+			fnSnsSigninCallback(resultMap);
+		}
+	});
+
+
+/*]]>*/
+</script>
+
+
+</body>
+</html>

+ 6 - 6
src/main/webapp/WEB-INF/views/mob/cart/CartChangeOptionPopupMob.html

@@ -103,7 +103,7 @@
 						</div>
 						<div class="opt_header">
 							<span class="title">옵션1</span>
-							<span class="color" th:classappend="|chooseColorNm_${comp.goodsCd}|" th:text="${comp.colorNm}"></span>
+							<span class="info" th:classappend="|chooseColorNm_${comp.goodsCd}|" th:text="${comp.colorNm}"></span>
 							<div class="form_field">
 								<input id="od_item_off" type="checkbox"><label for="od_item_off"><span>품절 제외</span></label>
 							</div>
@@ -131,7 +131,7 @@
 						<form class="form_wrap">
 							<div class="form_field">
 								<th:block th:each="color, index : ${comp.cartColorList}">
-									<div class="select_custom item_opt2 sizeList" th:classappend="|${comp.goodsCd}_${color.optCd1} sizeList${comp.goodsCd}|" th:style="${color.cartColorNm != null ? 'display:block' : 'display:none'}">
+									<div class="select_custom item_opt2 sizeList" th:classappend="|${comp.goodsCd}_${color.optCd1} sizeList${comp.goodsCd}|" th:style="${color.cartColorNm != null ? 'display:inline-block' : 'display:none'}">
 										<div class="combo">
 											<div class="select" th:classappend="|size_${comp.goodsCd}_size_nm|" th:text="${comp.optCd2}" th:data="${color.goodsCd}"></div>
 											<ul class="list setSizeSelect" th:classappend="|size_${comp.goodsCd}|" th:data="${comp.goodsCd}">
@@ -160,7 +160,7 @@
 					<div class="opt_select">
 						<div class="opt_header">
 							<span class="title">옵션1</span>
-							<span class="color" th:classappend="|chooseColorNm_${comp.goodsCd}|" th:text="${comp.colorNm}"></span>
+							<span class="info" th:classappend="|chooseColorNm_${comp.goodsCd}|" th:text="${comp.colorNm}"></span>
 							<div class="form_field">
 								<input id="od_item_off" type="checkbox"><label for="od_item_off"><span>품절 제외</span></label>
 							</div>
@@ -183,12 +183,12 @@
 					<div class="opt_select">
 						<div class="opt_header">
 							<span class="title">옵션2</span>
-							<span class="color" th:classappend="|chooseSizeNm_${comp.goodsCd}|" th:text="${comp.optCd2}"></span>
+							<span class="info" th:classappend="|chooseSizeNm_${comp.goodsCd}|" th:text="${comp.optCd2}"></span>
 						</div>
 						<form class="form_wrap">
 							<div class="form_field">
 								<th:block th:each="color, index : ${comp.cartColorList}">
-									<div class="select_custom item_opt2 sizeList" th:classappend="|${comp.goodsCd}_${color.optCd1} sizeList${comp.goodsCd}|" th:style="${color.cartColorNm != null ? 'display:block' : 'display:none'}">
+									<div class="select_custom item_opt2 sizeList" th:classappend="|${comp.goodsCd}_${color.optCd1} sizeList${comp.goodsCd}|" th:style="${color.cartColorNm != null ? 'display:inline-block' : 'display:none'}">
 										<div class="combo">
 											<div class="select" th:classappend="|size_${comp.goodsCd}_size_nm|" th:text="${comp.optCd2}" th:data="${color.goodsCd}"></div>
 											<ul class="list setSizeSelect" th:classappend="|size_${comp.goodsCd}|" th:data="${comp.goodsCd}">
@@ -292,7 +292,7 @@
 					let img = color[i].cartImgList[j];
 					if(optCd1 == img.colorCd) {
 						imgHtml += "<li>\n<span class='thumb'>\n";
-						imgHtml += "<img src='" + cart.imgPath + "/" + img.sysImgNm + "' onerror='this.src='" + [[${@environment.getProperty('domain.uximage')}]] + "/images/pc/thumb/bg_item_none.png' alt='" + img.sysImgNm + "' />\n";
+						imgHtml += "<img src='" + _uploadGoodsUrl + "/" + img.sysImgNm + "' onerror='this.src='" + [[${@environment.getProperty('domain.uximage')}]] + "/images/pc/thumb/bg_item_none.png' alt='" + img.sysImgNm + "' />\n";
 						imgHtml += "</span>\n</li>\n";
 					}
 				}

+ 527 - 520
src/main/webapp/WEB-INF/views/mob/cart/CartListAjaxFormMob.html

@@ -449,7 +449,7 @@
 				</div>
 				<div class="coupon_box">
 					<div class="coupon">
-						<button type="button" class="btn_delete"><span><em class="sr-only">쿠폰닫기</em></span></button>
+						<button type="button" class="btn_delete" onclick="cancelCartCpn()"><span><em class="sr-only">쿠폰닫기</em></span></button>
 						<div>
 							<p class="cp_name"></p>
 							<p class="cp_cont">
@@ -623,604 +623,611 @@
 				<button type="button" id="btn_purchase" class="btn btn_primary"><span>구매하기 (<em class="realOrderQtyText" th:text="${order.totCartCnt}"></em>개)</span></button> <!-- 210406_ID 추가 -->
 			</div>
 		</div>
-	</form>
 
-	<!-- 쿠폰사용안내 팝업 -->
-	<div class="modal fade couponInfo_pop cartCpnInfoModal" id="couponInfoPop" tabindex="-1" role="dialog" aria-labelledby="couponInfoLabel" aria-hidden="true">
-		<div class="modal-dialog" role="document">
-			<div class="modal-content">
-				<div class="modal-header">
-					<h5 class="modal-title" id="couponInfoLabel"></h5>
-				</div>
-				<div class="modal-body">
-					<div class="pop_cont">
-						<dl>
-							<div>
-								<dt>사용조건</dt>
-								<dd class="cpnCondition"></dd>
-							</div>
-							<div class="cartCpnPubLimitQty">
-								<dt>발급수량</dt>
-								<dd class="custPubLimitQtyTxt"></dd>
-							</div>
-							<div>
-								<dt>유효기간</dt>
-								<dd class="availDt"></dd>
-							</div>
-							<div>
-								<dt>대상조건</dt>
-								<dd class="refVal"></dd>
-							</div>
-						</dl>
+		<!-- 쿠폰사용안내 팝업 -->
+		<div class="modal fade couponInfo_pop cartCpnInfoModal" id="couponInfoPop" tabindex="-1" role="dialog" aria-labelledby="couponInfoLabel" aria-hidden="true">
+			<div class="modal-dialog" role="document">
+				<div class="modal-content">
+					<div class="modal-header">
+						<h5 class="modal-title" id="couponInfoLabel"></h5>
+					</div>
+					<div class="modal-body">
+						<div class="pop_cont">
+							<dl>
+								<div>
+									<dt>사용조건</dt>
+									<dd class="cpnCondition"></dd>
+								</div>
+								<div class="cartCpnPubLimitQty">
+									<dt>발급수량</dt>
+									<dd class="custPubLimitQtyTxt"></dd>
+								</div>
+								<div>
+									<dt>유효기간</dt>
+									<dd class="availDt"></dd>
+								</div>
+								<div>
+									<dt>대상조건</dt>
+									<dd class="refVal"></dd>
+								</div>
+							</dl>
+						</div>
 					</div>
 				</div>
 			</div>
+			<a href="#close-modal" rel="modal:close" id="couponInfoPop_close" class="close-modal">Close</a>
 		</div>
-		<a href="#close-modal" rel="modal:close" id="couponInfoPop_close" class="close-modal">Close</a>
-	</div>
-	<!-- //쿠폰사용안내 팝업 -->
-
-	<!-- 옵션변경 팝업 -->
-	<div id="optModifyPop01" class="popup_box optModifyPop optModifyPop01"></div>
-	<!-- //옵션변경 팝업 -->
-
-	<script th:inline="javascript">
-		let sumRealPayAmt = [[${order.sumRealPayAmt + order.totDelvFee}]];
-		let totDcAmt = [[${order.totDcAmt}]];
-		let loginInfo = [[${loginInfo}]];
-		let orderFlag = true;
-
-		$(document).ready(function() {
-			if([[${!order.shotCanYn.equals('Y')}]]) {
-				//$(".shotDelvSelect").hide();
-			}
+		<!-- //쿠폰사용안내 팝업 -->
 
-			$("#cartListForm .area_salecoupon .coupon_box").hide();
+		<!-- 옵션변경 팝업 -->
+		<div id="optModifyPop01" class="popup_box optModifyPop optModifyPop01"></div>
+		<!-- //옵션변경 팝업 -->
 
-			if(!loginInfo || loginInfo.custNo == null || loginInfo.custNo == 0) {
-				$("#cartListForm .area_salecoupon").parent().hide();
-			}
-		});
-
-		function cancelCartCpn() {
-			$("#cartListForm #sumRealPayAmt").text(Number(sumRealPayAmt).toLocaleString());
-			$("#cartListForm #totDcAmt").text(Number(totDcAmt).toLocaleString());
-			$("#cartListForm .area_salecoupon .coupon_box").hide();
-
-			$("#bottomOrderArea .realOrderAmtText").text(Number(sumRealPayAmt).toLocaleString());
-		}
-
-		function serialCpnApply() {
-			let cartArr = [];
-			let currPrices = [];
-			$("#cartListForm input[name=cartSqArr]:checked").each(function(index, item) {
-				cartArr.push($(this).val());
-				currPrices.push($(this).parents(".cartInfo").find("input[name=tmtbDcAmt]").val());
-			});
+		<script th:inline="javascript">
+			let sumRealPayAmt = [[${order.sumRealPayAmt + order.totDelvFee}]];
+			let totDcAmt = [[${order.totDcAmt}]];
+			let loginInfo = [[${loginInfo}]];
+			let orderFlag = true;
 
-			let data = {
-				rdCpnNm : $("#cartListForm #serialCpnNm").val(),
-				cartSqArr : cartArr,
-				currPrices : currPrices
-			}
+			$(document).ready(function() {
+				if([[${!order.shotCanYn.equals('Y')}]]) {
+					//$(".shotDelvSelect").hide();
+				}
 
-			let jsonData = JSON.stringify(data);
-
-			$.ajax( {
-				type: "POST",
-				url : '/cart/list/serialCpnApply',
-				contentType: 'application/json',
-				dataType : 'json',
-				data : jsonData,
-				success : function(result) {
-					if(result.serialCpnInfo.result == "SUCCESS") {
-						let cpnInfo = result.serialCpnInfo;
-						$("#cartListForm .area_salecoupon .coupon_box").show();
-
-						// 합계 금액
-						if(cartArr.length > 0) {
-							$("#cartListForm #sumRealPayAmt").text(Number(sumRealPayAmt - cpnInfo.dcAmt).toLocaleString());
-							$("#cartListForm #totDcAmt").text(Number(totDcAmt - cpnInfo.dcAmt).toLocaleString());
-							$("#bottomOrderArea .realOrderAmtText").text(Number(sumRealPayAmt - cpnInfo.dcAmt).toLocaleString());
-						}
+				$("#cartListForm .area_salecoupon .coupon_box").hide();
 
-						// 쿠폰 정보
-						$("#cartListForm .area_salecoupon .cp_name").text(cpnInfo.cpnNm);
-						$("#cartListForm .area_salecoupon .cp_condition").html(cpnInfo.cpnDesc + "<span><em class='tag'>1장 보유</em></span>");
-						$("#cartListForm .area_salecoupon .availStdt").text(cpnInfo.availStdt);
-						$("#cartListForm .area_salecoupon .availEddt").text(cpnInfo.availEddt);
-						if (cpnInfo.dcWay == "G240_10") {
-							$("#cartListForm .area_salecoupon .cp_dc_val").html("<em>" + Number(cpnInfo.dcVal).toLocaleString() + "</em> 원");
-						} else if (cpnInfo.dcWay == "G240_11") {
-							$("#cartListForm .area_salecoupon .cp_dc_val").html("<em>" + cpnInfo.dcVal + "%</em>");
-						}
+				if(!loginInfo || loginInfo.custNo == null || loginInfo.custNo == 0) {
+					$("#cartListForm .area_salecoupon").parent().hide();
+				}
+			});
 
-						let conditionComment = "", refValComment = "";
+			function cancelCartCpn() {
+				$("#cartListForm #sumRealPayAmt").text(Number(sumRealPayAmt).toLocaleString());
+				$("#cartListForm #totDcAmt").text(Number(totDcAmt).toLocaleString());
+				$("#cartListForm .area_salecoupon .coupon_box").hide();
 
-						if(cpnInfo.buyLimitAmt > 0) { conditionComment += "<span>" + Number(cpnInfo.buyLimitAmt).toLocaleString() + "</span>원 이상 구매 시 "; }
-						if(cpnInfo.maxDcAmt > 0) { conditionComment += "최대 <span>" +  Number(cpnInfo.maxDcAmt).toLocaleString() + "</span>원 할인"; }
+				$("#bottomOrderArea .realOrderAmtText").text(Number(sumRealPayAmt).toLocaleString());
+			}
 
-						if("A" == cpnInfo.applyScope) {
-							refValComment += "전체<br/>";
-						} else {
-							if(cpnInfo.refCateCnt > 0) {
-								refValComment += cpnInfo.refCateNm + " 카테고리";
-								if(cpnInfo.refCateCnt > 1) { refValComment += " 外"; }
-								refValComment += "<br/>";
-							}
-							if(cpnInfo.refSupplyCompCnt > 0) {
-								refValComment += cpnInfo.refSupplyCompNm + " 업체";
-								if(cpnInfo.refSupplyCompCnt > 1) { refValComment += " 外"; }
-								refValComment += "<br/>";
-							}
-							if(cpnInfo.refBrandCnt > 0) {
-								refValComment += cpnInfo.refBrandNm;
-								refValComment += " 브랜드";
-								if(cpnInfo.refBrandCnt > 2) { refValComment += " 外"; }
-								refValComment += "<br/>";
-							}
-							if(cpnInfo.refGoodsCnt > 0) {
-								refValComment += cpnInfo.refGoodsNm + " 상품";
-								if(cpnInfo.refGoodsCnt > 1) { refValComment += " 外"; }
-								refValComment += "<br/>";
-							}
-						}
-						refValComment += "일부상품, 특가상품 제외";
+			function serialCpnApply() {
+				let cartArr = [];
+				let currPrices = [];
+				$("#cartListForm input[name=cartSqArr]:checked").each(function(index, item) {
+					cartArr.push($(this).val());
+					currPrices.push($(this).parents(".cartInfo").find("input[name=tmtbDcAmt]").val());
+				});
 
-						$(".cartCpnInfoModal .modal-header").html('<h5 class="modal-title" id="couponInfoLabel">' + cpnInfo.cpnNm + '</h5>');
+				let data = {
+					rdCpnNm : $("#cartListForm #serialCpnNm").val(),
+					cartSqArr : cartArr,
+					currPrices : currPrices
+				}
 
-						if(conditionComment != "") { $(".cartCpnInfoModal .cpnCondition").html(conditionComment); }
-						else { $(".cartCpnInfoModal .cartCpnCondition").hide(); }
+				let jsonData = JSON.stringify(data);
+
+				$.ajax( {
+					type: "POST",
+					url : '/cart/list/serialCpnApply',
+					contentType: 'application/json',
+					dataType : 'json',
+					data : jsonData,
+					success : function(result) {
+						if(result.serialCpnInfo.result == "SUCCESS") {
+							let cpnInfo = result.serialCpnInfo;
+							$("#cartListForm .area_salecoupon .coupon_box").show();
+
+							// 합계 금액
+							if(cartArr.length > 0) {
+								$("#cartListForm #sumRealPayAmt").text(Number(sumRealPayAmt - cpnInfo.dcAmt).toLocaleString());
+								$("#cartListForm #totDcAmt").text(Number(totDcAmt - cpnInfo.dcAmt).toLocaleString());
+								$("#bottomOrderArea .realOrderAmtText").text(Number(sumRealPayAmt - cpnInfo.dcAmt).toLocaleString());
+							}
 
-						if(cpnInfo.custPubLimitQty > 0) { $(".cartCpnInfoModal .custPubLimitQtyTxt").html("1인 최대 <span>" + Number(cpnInfo.custPubLimitQty).toLocaleString() + "</span>매"); }
-						else { $(".cartCpnInfoModal .cartCpnPubLimitQty").hide(); }
+							// 쿠폰 정보
+							$("#cartListForm .area_salecoupon .cp_name").text(cpnInfo.cpnNm);
+							$("#cartListForm .area_salecoupon .cp_condition").html(cpnInfo.cpnDesc + "<span><em class='tag'>1장 보유</em></span>");
+							$("#cartListForm .area_salecoupon .availStdt").text(cpnInfo.availStdt);
+							$("#cartListForm .area_salecoupon .availEddt").text(cpnInfo.availEddt);
+							if (cpnInfo.dcWay == "G240_10") {
+								$("#cartListForm .area_salecoupon .cp_dc_val").html("<em>" + Number(cpnInfo.dcVal).toLocaleString() + "</em> 원");
+							} else if (cpnInfo.dcWay == "G240_11") {
+								$("#cartListForm .area_salecoupon .cp_dc_val").html("<em>" + cpnInfo.dcVal + "%</em>");
+							}
 
-						$(".cartCpnInfoModal .availDt").html('<span>' + cpnInfo.availStdtTime + "</span> ~ <span>" + cpnInfo.availEddtTime + "</span>");
-						$(".cartCpnInfoModal .refVal").html(refValComment);
-					} else {
-						mcxDialog.alert(result.serialCpnInfo.result);
-					}
-				}
-			});
-		}
+							let conditionComment = "", refValComment = "";
 
-		$("input[name=cartSqArr]").on("change", function(e) {
-			changeCartSqArr();
-		});
+							if(cpnInfo.buyLimitAmt > 0) { conditionComment += "<span>" + Number(cpnInfo.buyLimitAmt).toLocaleString() + "</span>원 이상 구매 시 "; }
+							if(cpnInfo.maxDcAmt > 0) { conditionComment += "최대 <span>" +  Number(cpnInfo.maxDcAmt).toLocaleString() + "</span>원 할인"; }
 
-		function changeCartSqArr() {
-			let cartArr = [];
+							if("A" == cpnInfo.applyScope) {
+								refValComment += "전체<br/>";
+							} else {
+								if(cpnInfo.refCateCnt > 0) {
+									refValComment += cpnInfo.refCateNm + " 카테고리";
+									if(cpnInfo.refCateCnt > 1) { refValComment += " 外"; }
+									refValComment += "<br/>";
+								}
+								if(cpnInfo.refSupplyCompCnt > 0) {
+									refValComment += cpnInfo.refSupplyCompNm + " 업체";
+									if(cpnInfo.refSupplyCompCnt > 1) { refValComment += " 外"; }
+									refValComment += "<br/>";
+								}
+								if(cpnInfo.refBrandCnt > 0) {
+									refValComment += cpnInfo.refBrandNm;
+									refValComment += " 브랜드";
+									if(cpnInfo.refBrandCnt > 2) { refValComment += " 外"; }
+									refValComment += "<br/>";
+								}
+								if(cpnInfo.refGoodsCnt > 0) {
+									refValComment += cpnInfo.refGoodsNm + " 상품";
+									if(cpnInfo.refGoodsCnt > 1) { refValComment += " 外"; }
+									refValComment += "<br/>";
+								}
+							}
+							refValComment += "일부상품, 특가상품 제외";
 
-			// 선택된 장바구니 번호
-			$("#cartListForm input[name=cartSqArr]:checked").each(function () {
-				cartArr.push($(this).val());
-			});
+							$(".cartCpnInfoModal .modal-header").html('<h5 class="modal-title" id="couponInfoLabel">' + cpnInfo.cpnNm + '</h5>');
 
-			// 선택된 장바구니 정보 가공
-			let data = {	cartSqArr : cartArr }
-			let jsonData = JSON.stringify(data);
-
-			$.ajax( {
-				type: "POST",
-				url : '/cart/change/goods/list',
-				contentType: 'application/json',
-				dataType : 'json',
-				data : jsonData,
-				success : function(result) {
-					fnChangeCartListInfo(result);
-				}
-			});
-		}
-
-		function fnChangeCartListInfo(order) {
-			let shotList = order.shotCartList;
-			let wmsList = order.wmsCartList;
-			let delvList = order.delvCartList;
-			let cartList = new Array();
-
-			// 다다익선 정보 숨김
-			$("#cartListForm .applyTmtb").hide();
-			$("#cartListForm .notApplyTmtb").hide();
-
-			// 장바구니 각 상품 가격 정보 할인 전으로 변경
-			$("#cartListForm .cartInfo input[name=cartSq]").each(function() {
-				if($(this).parent().find(".calc_box .price_org").text() != "") {
-					$(this).parent().find(".calc_box .price_sale").text($(this).parent().find(".calc_box .price_org").text());
-					$(this).parent().find(".calc_box .price_org").remove();
-				}
-			});
+							if(conditionComment != "") { $(".cartCpnInfoModal .cpnCondition").html(conditionComment); }
+							else { $(".cartCpnInfoModal .cartCpnCondition").hide(); }
 
-			$("#cartListForm").find(".delvFeeArea").html("<div class='info_dlvr'><span class='dlvr_fee'>배송비 무료</span></div>");
-			for(let i = 0 ; i < shotList.length ; i++) {
-				cartList.push(shotList[i]);
-				$("#cartListForm .shotCartInfo input[name=cartSq]").each(function() {
-					if(shotList[i].cartSq == $(this).val()) {
-						let shot = shotList[i];
-						$(this).parent().find(".od_moresale .applyTmtbNm > ul").html("");
-						$(this).parent().find(".od_moresale .notApplyTmtbNm > ul").html("");
-
-						// 다다익선 적용 정보 생성성
-						if(shot.qtyTmtbSq > 0 && shot.applyQtySectionYn == "Y") {
-							$(this).parent().find(".applyTmtb").show();
-						}
-						if(shot.amtTmtbSq > 0 && shot.applyAmtSectionYn == "Y") {
-							$(this).parent().find(".applyTmtb").show();
-						}
-						if(shot.qtyTmtbSq > 0 && shot.applyQtySectionYn == "N") {
-							$(this).parent().find(".notApplyTmtb").show();
-						}
-						if(shot.amtTmtbSq > 0 && shot.applyAmtSectionYn == "N") {
-							$(this).parent().find(".notApplyTmtb").show();
-						}
+							if(cpnInfo.custPubLimitQty > 0) { $(".cartCpnInfoModal .custPubLimitQtyTxt").html("1인 최대 <span>" + Number(cpnInfo.custPubLimitQty).toLocaleString() + "</span>매"); }
+							else { $(".cartCpnInfoModal .cartCpnPubLimitQty").hide(); }
 
-						// 다다익선 할인가 적용
-						if(shot.tmtbDcAmt < shot.currPrice) {
-							$(this).parent().find(".calc_box .price_sale").text(Number(shot.tmtbDcAmt).toLocaleString() + " 원");
-							$(this).parent().find(".calc_box").prepend("<p><span class='price_org'><em>" + Number(shot.currPrice).toLocaleString() + "</em>원</span></p>");
-							$(this).parent().find("input[name=tmtbDcAmt]").val(shot.tmtbDcAmt);
+							$(".cartCpnInfoModal .availDt").html('<span>' + cpnInfo.availStdtTime + "</span> ~ <span>" + cpnInfo.availEddtTime + "</span>");
+							$(".cartCpnInfoModal .refVal").html(refValComment);
+						} else {
+							mcxDialog.alert(result.serialCpnInfo.result);
 						}
 					}
 				});
 			}
 
-			for(let i = 0 ; i < wmsList.length ; i++) {
-				cartList.push(wmsList[i]);
-				$("#cartListForm .wmsCartInfo input[name=cartSq]").each(function() {
-					if(wmsList[i].cartSq == $(this).val()) {
-						let wms = wmsList[i];
-						$(this).parent().find(".od_moresale .applyTmtbNm > ul").html("");
-						$(this).parent().find(".od_moresale .notApplyTmtbNm > ul").html("");
-
-						// 다다익선 적용 정보 생성성
-						if(wms.qtyTmtbSq > 0 && wms.applyQtySectionYn == "Y") {
-							$(this).parent().find(".applyTmtb").show();
-						}
-						if(wms.amtTmtbSq > 0 && wms.applyAmtSectionYn == "Y") {
-							$(this).parent().find(".applyTmtb").show();
-						}
-						if(wms.qtyTmtbSq > 0 && wms.applyQtySectionYn == "N") {
-							$(this).parent().find(".notApplyTmtb").show();
-						}
-						if(wms.amtTmtbSq > 0 && wms.applyAmtSectionYn == "N") {
-							$(this).parent().find(".notApplyTmtb").show();
-						}
+			$("input[name=cartSqArr]").on("change", function(e) {
+				changeCartSqArr();
+			});
 
-						// 다다익선 할인가 적용
-						if(wms.tmtbDcAmt < wms.currPrice) {
-							$(this).parent().find(".calc_box .price_sale").text(Number(wms.tmtbDcAmt).toLocaleString() + " 원");
-							$(this).parent().find(".calc_box").prepend("<p><span class='price_org'><em>" + Number(wms.currPrice).toLocaleString() + "</em>원</span></p>");
-							$(this).parent().find("input[name=tmtbDcAmt]").val(wms.tmtbDcAmt);
-						}
+			function changeCartSqArr() {
+				let cartArr = [];
+
+				// 선택된 장바구니 번호
+				$("#cartListForm input[name=cartSqArr]:checked").each(function () {
+					cartArr.push($(this).val());
+				});
+
+				// 선택된 장바구니 정보 가공
+				let data = {	cartSqArr : cartArr }
+				let jsonData = JSON.stringify(data);
+
+				$.ajax( {
+					type: "POST",
+					url : '/cart/change/goods/list',
+					contentType: 'application/json',
+					dataType : 'json',
+					data : jsonData,
+					success : function(result) {
+						fnChangeCartListInfo(result);
 					}
 				});
 			}
 
-			// 자사 상품 배송비
-			if(order.wmsDelvFee == 0) {
-				$(".selfGoodsDelv").html("<span class='dlvr_fee'>배송비 무료</span>");
-			} else {
-				let html = "<span class='dlvr_fee'>배송비 <em>" + Number(order.wmsDelvFee).toLocaleString() + "</em> 원</span><a href='#' class='btn_popup_save'>배송비 SAVE 상품 보기</a>";
-				$(".selfGoodsDelv").html(html);
-			}
+			function fnChangeCartListInfo(order) {
+				let shotList = order.shotCartList;
+				let wmsList = order.wmsCartList;
+				let delvList = order.delvCartList;
+				let cartList = new Array();
+
+				// 다다익선 정보 숨김
+				$("#cartListForm .applyTmtb").hide();
+				$("#cartListForm .notApplyTmtb").hide();
+
+				// 장바구니 각 상품 가격 정보 할인 전으로 변경
+				$("#cartListForm .cartInfo input[name=cartSq]").each(function() {
+					if($(this).parent().find(".calc_box .price_org").text() != "") {
+						$(this).parent().find(".calc_box .price_sale").text($(this).parent().find(".calc_box .price_org").text());
+						$(this).parent().find(".calc_box .price_org").remove();
+					}
+				});
 
-			for(let i = 0 ; i < delvList.length ; i++) {
-				cartList.push(delvList[i]);
-				$("#cartListForm .delvList .delvCartInfo input[name=cartSq]").each(function() {
-					if(delvList[i].cartSq == $(this).val()) {
-						let delv = delvList[i];
-						$(this).parent().find(".od_moresale .applyTmtbNm > ul").html("");
-						$(this).parent().find(".od_moresale .notApplyTmtbNm > ul").html("");
-
-						// 다다익선 적용 정보 생성성
-						if(delv.qtyTmtbSq > 0 && delv.applyQtySectionYn == "Y") {
-							$(this).parent().find(".applyTmtb").show();
-						}
-						if(delv.amtTmtbSq > 0 && delv.applyAmtSectionYn == "Y") {
-							$(this).parent().find(".applyTmtb").show();
-						}
-						if(delv.qtyTmtbSq > 0 && delv.applyQtySectionYn == "N") {
-							$(this).parent().find(".notApplyTmtb").show();
-						}
-						if(delv.amtTmtbSq > 0 && delv.applyAmtSectionYn == "N") {
+				$("#cartListForm").find(".delvFeeArea").html("<div class='info_dlvr'><span class='dlvr_fee'>배송비 무료</span></div>");
+				for(let i = 0 ; i < shotList.length ; i++) {
+					cartList.push(shotList[i]);
+					$("#cartListForm .shotCartInfo input[name=cartSq]").each(function() {
+						if(shotList[i].cartSq == $(this).val()) {
+							let shot = shotList[i];
+							$(this).parent().find(".od_moresale .applyTmtbNm > ul").html("");
+							$(this).parent().find(".od_moresale .notApplyTmtbNm > ul").html("");
+
+							// 다다익선 적용 정보 생성성
+							if(shot.qtyTmtbSq > 0 && shot.applyQtySectionYn == "Y") {
+								$(this).parent().find(".applyTmtb").show();
+							}
+							if(shot.amtTmtbSq > 0 && shot.applyAmtSectionYn == "Y") {
+								$(this).parent().find(".applyTmtb").show();
+							}
+							if(shot.qtyTmtbSq > 0 && shot.applyQtySectionYn == "N") {
+								$(this).parent().find(".notApplyTmtb").show();
+							}
+							if(shot.amtTmtbSq > 0 && shot.applyAmtSectionYn == "N") {
+								$(this).parent().find(".notApplyTmtb").show();
+							}
+
+							// 다다익선 할인가 적용
+							if(shot.tmtbDcAmt < shot.currPrice) {
+								$(this).parent().find(".calc_box .price_sale").text(Number(shot.tmtbDcAmt).toLocaleString() + " 원");
+								$(this).parent().find(".calc_box").prepend("<p><span class='price_org'><em>" + Number(shot.currPrice).toLocaleString() + "</em>원</span></p>");
+								$(this).parent().find("input[name=tmtbDcAmt]").val(shot.tmtbDcAmt);
+							}
 						}
+					});
+				}
 
-						// 다다익선 할인가 적용
-						if(delv.tmtbDcAmt < delv.currPrice) {
-							$(this).parent().find(".calc_box .price_sale").text(Number(delv.tmtbDcAmt).toLocaleString() + " 원");
-							$(this).parent().find(".calc_box").prepend("<p><span class='price_org'><em>" + Number(delv.currPrice).toLocaleString() + "</em>원</span></p>");
-							$(this).parent().find("input[name=tmtbDcAmt]").val(delv.tmtbDcAmt);
+				for(let i = 0 ; i < wmsList.length ; i++) {
+					cartList.push(wmsList[i]);
+					$("#cartListForm .wmsCartInfo input[name=cartSq]").each(function() {
+						if(wmsList[i].cartSq == $(this).val()) {
+							let wms = wmsList[i];
+							$(this).parent().find(".od_moresale .applyTmtbNm > ul").html("");
+							$(this).parent().find(".od_moresale .notApplyTmtbNm > ul").html("");
+
+							// 다다익선 적용 정보 생성성
+							if(wms.qtyTmtbSq > 0 && wms.applyQtySectionYn == "Y") {
+								$(this).parent().find(".applyTmtb").show();
+							}
+							if(wms.amtTmtbSq > 0 && wms.applyAmtSectionYn == "Y") {
+								$(this).parent().find(".applyTmtb").show();
+							}
+							if(wms.qtyTmtbSq > 0 && wms.applyQtySectionYn == "N") {
+								$(this).parent().find(".notApplyTmtb").show();
+							}
+							if(wms.amtTmtbSq > 0 && wms.applyAmtSectionYn == "N") {
+								$(this).parent().find(".notApplyTmtb").show();
+							}
+
+							// 다다익선 할인가 적용
+							if(wms.tmtbDcAmt < wms.currPrice) {
+								$(this).parent().find(".calc_box .price_sale").text(Number(wms.tmtbDcAmt).toLocaleString() + " 원");
+								$(this).parent().find(".calc_box").prepend("<p><span class='price_org'><em>" + Number(wms.currPrice).toLocaleString() + "</em>원</span></p>");
+								$(this).parent().find("input[name=tmtbDcAmt]").val(wms.tmtbDcAmt);
+							}
 						}
+					});
+				}
 
-						if(delv.delvFee == 0) {
-							$(".delvList").find(".delv_" + delv.delvFeeCd).html("<span class='dlvr_fee'>배송비 무료</span><span class='dlvr_fee'><em>" + delv.supplyCompNm + "</em> 업체직배송</span>");
-						} else {
-							let html = "<div className='order_delivery'><span class='dlvr_fee'>배송비 <em>" + Number(delv.delvFee).toLocaleString() + "</em>원</span><span class='dlvr_shop'><em>" + delv.supplyCompNm + "</em> 업체직배송</span><a href='#' className='btn_popup_save'>배송비 SAVE 상품 보기</a></div>";
-							$(".delvList").find(".delv_" + delv.delvFeeCd).html(html);
+				// 자사 상품 배송비
+				if(order.wmsDelvFee == 0) {
+					$(".selfGoodsDelv").html("<span class='dlvr_fee'>배송비 무료</span>");
+				} else {
+					let html = "<span class='dlvr_fee'>배송비 <em>" + Number(order.wmsDelvFee).toLocaleString() + "</em> 원</span><a href='#' class='btn_popup_save'>배송비 SAVE 상품 보기</a>";
+					$(".selfGoodsDelv").html(html);
+				}
+
+				for(let i = 0 ; i < delvList.length ; i++) {
+					cartList.push(delvList[i]);
+					$("#cartListForm .delvList .delvCartInfo input[name=cartSq]").each(function() {
+						if(delvList[i].cartSq == $(this).val()) {
+							let delv = delvList[i];
+							$(this).parent().find(".od_moresale .applyTmtbNm > ul").html("");
+							$(this).parent().find(".od_moresale .notApplyTmtbNm > ul").html("");
+
+							// 다다익선 적용 정보 생성성
+							if(delv.qtyTmtbSq > 0 && delv.applyQtySectionYn == "Y") {
+								$(this).parent().find(".applyTmtb").show();
+							}
+							if(delv.amtTmtbSq > 0 && delv.applyAmtSectionYn == "Y") {
+								$(this).parent().find(".applyTmtb").show();
+							}
+							if(delv.qtyTmtbSq > 0 && delv.applyQtySectionYn == "N") {
+								$(this).parent().find(".notApplyTmtb").show();
+							}
+							if(delv.amtTmtbSq > 0 && delv.applyAmtSectionYn == "N") {
+							}
+
+							// 다다익선 할인가 적용
+							if(delv.tmtbDcAmt < delv.currPrice) {
+								$(this).parent().find(".calc_box .price_sale").text(Number(delv.tmtbDcAmt).toLocaleString() + " 원");
+								$(this).parent().find(".calc_box").prepend("<p><span class='price_org'><em>" + Number(delv.currPrice).toLocaleString() + "</em>원</span></p>");
+								$(this).parent().find("input[name=tmtbDcAmt]").val(delv.tmtbDcAmt);
+							}
+
+							if(delv.delvFee == 0) {
+								$(".delvList").find(".delv_" + delv.delvFeeCd).html("<span class='dlvr_fee'>배송비 무료</span><span class='dlvr_fee'><em>" + delv.supplyCompNm + "</em> 업체직배송</span>");
+							} else {
+								let html = "<div className='order_delivery'><span class='dlvr_fee'>배송비 <em>" + Number(delv.delvFee).toLocaleString() + "</em>원</span><span class='dlvr_shop'><em>" + delv.supplyCompNm + "</em> 업체직배송</span><a href='#' className='btn_popup_save'>배송비 SAVE 상품 보기</a></div>";
+								$(".delvList").find(".delv_" + delv.delvFeeCd).html(html);
+							}
 						}
-					}
-				});
-			}
+					});
+				}
 
-			// 결제 총액 영역 수정
-			$("#cartListForm .checkSelectCartListCnt").text(Number(order.totCartCnt).toLocaleString());
-			$("#cartListForm .sumListPrice").text(Number(order.sumListPrice).toLocaleString());
-			$("#cartListForm .totDelvFee").text(Number(order.totDelvFee).toLocaleString());
-			sumRealPayAmt = order.sumRealPayAmt + order.totDelvFee;
-			totDcAmt = order.totDcAmt;
-
-			// 하단 구매하기 버튼 수량 및 금액 변경
-			$("#bottomOrderArea .realOrderQtyText").text(Number(order.totCartCnt).toLocaleString());
-			$("#bottomOrderArea .realOrderAmtText").text(Number(sumRealPayAmt).toLocaleString());
-
-			// 할인코드 쿠폰 금액 재확인
-			if($("#cartListForm #serialCpnNm").val()) {
-				serialCpnApply();
-			} else {
-				$("#cartListForm .totDcAmt").text(Number(totDcAmt).toLocaleString());
-				$("#cartListForm .sumRealPayAmt").text(Number(sumRealPayAmt).toLocaleString());
-				cancelCartCpn();
-			}
-		}
+				// 결제 총액 영역 수정
+				$("#cartListForm .checkSelectCartListCnt").text(Number(order.totCartCnt).toLocaleString());
+				$("#cartListForm .sumListPrice").text(Number(order.sumListPrice).toLocaleString());
+				$("#cartListForm .totDelvFee").text(Number(order.totDelvFee).toLocaleString());
+				sumRealPayAmt = order.sumRealPayAmt + order.totDelvFee;
+				totDcAmt = order.totDcAmt;
+
+				// 하단 구매하기 버튼 수량 및 금액 변경
+				$("#bottomOrderArea .realOrderQtyText").text(Number(order.totCartCnt).toLocaleString());
+				$("#bottomOrderArea .realOrderAmtText").text(Number(sumRealPayAmt).toLocaleString());
 
-		function fnOrderValidation(list, listIndex, cartSqArr, allYn) {
-			// listIndex가 -1이면 (마지막이 지난후)
-			if(listIndex ==  - 1) {
-				if(allYn == "Y" && orderFlag) {
-					$("#cartListForm").submit();
+				// 할인코드 쿠폰 금액 재확인
+				if($("#cartListForm #serialCpnNm").val()) {
+					serialCpnApply();
 				} else {
-					if(orderFlag) {
-						let html	 = "<input type='hidden' name='cartSqArr' value='" + cartSqArr + "' />";
-						html		+= "<input type='hidden' name='shotDelvUseYn' value='" + $("input[name=shotDelvUseYn]:checked").val() + "' />";
-						$("#cartInfoForm").html(html);
-						$("#cartInfoForm").submit();
-					}
+					$("#cartListForm .totDcAmt").text(Number(totDcAmt).toLocaleString());
+					$("#cartListForm .sumRealPayAmt").text(Number(sumRealPayAmt).toLocaleString());
+					cancelCartCpn();
 				}
 			}
 
-			let info = list[listIndex];
-			let removeCartSq = 0, updateCartSq = 0, goodsQty = 0;
-			listIndex++;
-
-			// list[listIndex]가 null이 아니라면
-			if(info != null) {
-				if (info.ordCanYn == "N") {		// 주문 불가
-					let message = info.goodsNm + " 상품은 구매 할 수 없습니다. 제외하고 계속 주문하시겠습니까?";
-					fnRemoveCartSqConfirm(message, cartSqArr, info.cartSq, list, listIndex, allYn);
-				} else if (info.soldoutYn == "Y") {		// 품절
-					if (info.goodsStat == "G008_70" || info.ordCanQty < info.minOrdQty) {		// 상품 상태가 품절이거나 주문 가능 수량이 최소주문수량보다 적을경우
-						let message = info.goodsNm + " 상품은 품절입니다. 제외하고 계속 주문하시겠습니까?";
-						fnRemoveCartSqConfirm(message, cartSqArr, info.cartSq, list, listIndex, allYn)
-					} else if (info.goodsQty < info.ordCanQty) {		// 주문 가능 수량이 0일경우
-						let message = info.goodsNm + "의 " + info.colorNm + " 옵션이 품절되었습니다. 제외하고 계속 주문하시겠습니까?";
-						fnRemoveCartSqConfirm(message, cartSqArr, info.cartSq, list, listIndex, allYn)
+			function fnOrderValidation(list, listIndex, cartSqArr, allYn) {
+				// listIndex가 -1이면 (마지막이 지난후)
+				if(listIndex ==  - 1) {
+					if(allYn == "Y" && orderFlag) {
+						$("#cartListForm").submit();
+					} else {
+						if(orderFlag) {
+							let html	 = "<input type='hidden' name='cartSqArr' value='" + cartSqArr + "' />";
+							html		+= "<input type='hidden' name='shotDelvUseYn' value='" + $("input[name=shotDelvUseYn]:checked").val() + "' />";
+							$("#cartInfoForm").html(html);
+							$("#cartInfoForm").submit();
+						}
+					}
+				}
+
+				let info = list[listIndex];
+				let removeCartSq = 0, updateCartSq = 0, goodsQty = 0;
+				listIndex++;
+
+				// list[listIndex]가 null이 아니라면
+				if(info != null) {
+					if (info.ordCanYn == "N") {		// 주문 불가
+						let message = info.goodsNm + " 상품은 구매 할 수 없습니다. 제외하고 계속 주문하시겠습니까?";
+						fnRemoveCartSqConfirm(message, cartSqArr, info.cartSq, list, listIndex, allYn);
+					} else if (info.soldoutYn == "Y") {		// 품절
+						if (info.goodsStat == "G008_70" || info.ordCanQty < info.minOrdQty) {		// 상품 상태가 품절이거나 주문 가능 수량이 최소주문수량보다 적을경우
+							let message = info.goodsNm + " 상품은 품절입니다. 제외하고 계속 주문하시겠습니까?";
+							fnRemoveCartSqConfirm(message, cartSqArr, info.cartSq, list, listIndex, allYn)
+						} else if (info.goodsQty < info.ordCanQty) {		// 주문 가능 수량이 0일경우
+							let message = info.goodsNm + "의 " + info.colorNm + " 옵션이 품절되었습니다. 제외하고 계속 주문하시겠습니까?";
+							fnRemoveCartSqConfirm(message, cartSqArr, info.cartSq, list, listIndex, allYn)
+						} else if (listIndex < list.length) {
+							// 혹시 else일 경우
+							fnOrderValidation(list, listIndex, cartSqArr, allYn);
+						}
+					} else if (info.ordCanQty < info.goodsQty) {		// 최소 주문 수량보다 장바구니에 적게 들어왔을 경우
+						let message;
+						if ("G056_S" == info.goodsType) {
+							message = info.goodsNm + " 의" + info.itemNm + "/" + info.colorNm + "/" + info.optCd2 + "의 수량이 부족합니다.\n구매가능 수량은 " + info.ordCanQty + "개입니다.\n구매가능 수량만큼 주문하시겠습니까?";
+						} else {
+							message = info.goodsNm + " 의" + info.colorNm + "/" + info.optCd2 + "의 수량이 부족합니다.\n구매가능 수량은 " + info.ordCanQty + "개입니다.\n구매가능 수량만큼 주문하시겠습니까?";
+						}
+
+						fnUpdateConfirmChangeQty(message, info.cartSq, info.minOrdQty, list, listIndex, cartSqArr, allYn);
+					} else if (info.goodsQty < info.minOrdQty) {
+						let message = info.goodsNm + " 의 최소 구매수량은 " + info.minOrdQty + "개입니다.\n최소 구매 수량으로 주문하시겠습니까?";
+						fnUpdateConfirmChangeQty(message, info.cartSq, info.minOrdQty, list, listIndex, cartSqArr, allYn);
+					} else if (info.goodsQty > info.maxOrdQty) {
+						let message = info.goodsNm + " 의 최대 구매 사능 수량은 " + info.maxOrdQty + "개입니다. 최대 구매 가능한 수량으로 주문하시겠습니까?";
+						fnUpdateConfirmChangeQty(message, info.cartSq, info.minOrdQty, list, listIndex, cartSqArr, allYn);
 					} else if (listIndex < list.length) {
-						// 혹시 else일 경우
 						fnOrderValidation(list, listIndex, cartSqArr, allYn);
-					}
-				} else if (info.ordCanQty < info.goodsQty) {		// 최소 주문 수량보다 장바구니에 적게 들어왔을 경우
-					let message;
-					if ("G056_S" == info.goodsType) {
-						message = info.goodsNm + " 의" + info.itemNm + "/" + info.colorNm + "/" + info.optCd2 + "의 수량이 부족합니다.\n구매가능 수량은 " + info.ordCanQty + "개입니다.\n구매가능 수량만큼 주문하시겠습니까?";
 					} else {
-						message = info.goodsNm + " 의" + info.colorNm + "/" + info.optCd2 + "의 수량이 부족합니다.\n구매가능 수량은 " + info.ordCanQty + "개입니다.\n구매가능 수량만큼 주문하시겠습니까?";
+						fnOrderValidation(list, -1, cartSqArr, allYn);
 					}
-
-					fnUpdateConfirmChangeQty(message, info.cartSq, info.minOrdQty, list, listIndex, cartSqArr, allYn);
-				} else if (info.goodsQty < info.minOrdQty) {
-					let message = info.goodsNm + " 의 최소 구매수량은 " + info.minOrdQty + "개입니다.\n최소 구매 수량으로 주문하시겠습니까?";
-					fnUpdateConfirmChangeQty(message, info.cartSq, info.minOrdQty, list, listIndex, cartSqArr, allYn);
-				} else if (info.goodsQty > info.maxOrdQty) {
-					let message = info.goodsNm + " 의 최대 구매 사능 수량은 " + info.maxOrdQty + "개입니다. 최대 구매 가능한 수량으로 주문하시겠습니까?";
-					fnUpdateConfirmChangeQty(message, info.cartSq, info.minOrdQty, list, listIndex, cartSqArr, allYn);
-				} else if (listIndex < list.length) {
-					fnOrderValidation(list, listIndex, cartSqArr, allYn);
 				} else {
 					fnOrderValidation(list, -1, cartSqArr, allYn);
 				}
-			} else {
-				fnOrderValidation(list, -1, cartSqArr, allYn);
 			}
-		}
-
-		function fnUpdateConfirmChangeQty(message, cartSq, goodsQty, list, listIndex, cartSqArr, allYn) {
-			mcxDialog.confirmC(message, { //내용
-				btn     : ["취소", "확인"],
-				btnClick: function (index) {
-					if (index == 1) { //button1 일때 처리문
-						orderFlag = false; return false;
-					} else {	//button2 일때 처리문
-						updateGoodsQty(cartSq, goodsQty);
-						fnOrderValidation(list, listIndex, cartSqArr, allYn);
+
+			function fnUpdateConfirmChangeQty(message, cartSq, goodsQty, list, listIndex, cartSqArr, allYn) {
+				mcxDialog.confirmC(message, { //내용
+					btn     : ["취소", "확인"],
+					btnClick: function (index) {
+						if (index == 1) { //button1 일때 처리문
+							orderFlag = false; return false;
+						} else {	//button2 일때 처리문
+							updateGoodsQty(cartSq, goodsQty);
+							fnOrderValidation(list, listIndex, cartSqArr, allYn);
+						}
 					}
-				}
-			});
-		}
-
-		function fnRemoveCartSqConfirm(message, cartSqArr, cartSq, list, listIndex, allYn) {
-			mcxDialog.confirmC(message, { //내용
-				btn     : ["취소", "확인"],
-				btnClick: function (index) {
-					if (index == 1) { //button1 일때 처리문
-						orderFlag = false; return false;
-					} else {	//button2 일때 처리문
-						fnCheckOffCartSqArr(cartSqArr, info.cartSq);
-						fnOrderValidation(list, listIndex, cartSqArr, allYn);
+				});
+			}
+
+			function fnRemoveCartSqConfirm(message, cartSqArr, cartSq, list, listIndex, allYn) {
+				mcxDialog.confirmC(message, { //내용
+					btn     : ["취소", "확인"],
+					btnClick: function (index) {
+						if (index == 1) { //button1 일때 처리문
+							orderFlag = false; return false;
+						} else {	//button2 일때 처리문
+							fnCheckOffCartSqArr(cartSqArr, info.cartSq);
+							fnOrderValidation(list, listIndex, cartSqArr, allYn);
+						}
 					}
-				}
-			});
-		}
+				});
+			}
 
-		function fnCheckOffCartSqArr(cartSqArr, cartSq) {
-			// 체크박스 해제
-			$("#cartListForm input[name=cartSqArr]").each(function () {
-				if ($(this).val() == cartSq) {
-					$(this).prop("checked", false);
-				}
-			});
+			function fnCheckOffCartSqArr(cartSqArr, cartSq) {
+				// 체크박스 해제
+				$("#cartListForm input[name=cartSqArr]").each(function () {
+					if ($(this).val() == cartSq) {
+						$(this).prop("checked", false);
+					}
+				});
 
-			// 장바구니 선택된것 삭제 > cartSq 0으로 변경
-			for (let i = 0; i < cartSqArr.length; i++) {
-				if (cartSqArr[i] == cartSq) {
-					cartSqArr[i] = 0;
+				// 장바구니 선택된것 삭제 > cartSq 0으로 변경
+				for (let i = 0; i < cartSqArr.length; i++) {
+					if (cartSqArr[i] == cartSq) {
+						cartSqArr[i] = 0;
+					}
 				}
 			}
-		}
 
-		// 주문하기
-		function fnSubmitNoMember(cartSq) {
-			let cartSqArr = [];
-			orderFlag = true;
+			// 주문하기
+			function fnSubmitNoMember(cartSq) {
+				let cartSqArr = [];
+				orderFlag = true;
 
-			if($("#cartListForm input[name=cartSqArr]:checked").length < 1) {
-				mcxDialog.alert("구매하실 상품을 선택해주세요.");
-				return false;
-			}
+				if($("#cartListForm input[name=cartSqArr]:checked").length < 1) {
+					mcxDialog.alert("구매하실 상품을 선택해주세요.");
+					return false;
+				}
 
-			if(loginInfo == null || loginInfo.custNo == null || loginInfo.custNo == 0) {
-				var btn = ["비회원 구매", "로그인 후 구매"];
-				mcxDialog.confirmC("로그인 후 구매 시 다양한 혜택을 받으실 수 있습니다.", { //내용
-					btn: btn,
-					btnClick: function(index){
-						if (index == 1){ //button1 일때 처리문
-							if(cartSq == "all") {
-								// 선택된 장바구니 번호
-								$("#cartListForm input[name=cartSqArr]:checked").each(function () {
-									cartSqArr.push($(this).val());
-								});
-
-								fnOrderCheck(cartSqArr, 0, "Y");
-							} else {
-								fnOrderCheck(cartSq, 0, "N");
+				if(loginInfo == null || loginInfo.custNo == null || loginInfo.custNo == 0) {
+					var btn = ["비회원 구매", "로그인 후 구매"];
+					mcxDialog.confirmC("로그인 후 구매 시 다양한 혜택을 받으실 수 있습니다.", { //내용
+						btn: btn,
+						btnClick: function(index){
+							if (index == 1){ //button1 일때 처리문
+								if(cartSq == "all") {
+									// 선택된 장바구니 번호
+									$("#cartListForm input[name=cartSqArr]:checked").each(function () {
+										cartSqArr.push($(this).val());
+									});
+
+									fnOrderCheck(cartSqArr, 0, "Y");
+								} else {
+									fnOrderCheck(cartSq, 0, "N");
+								}
+							} else {	//button2 일때 처리문
+								location.href="/signin";
 							}
-						} else {	//button2 일때 처리문
-							location.href="/signin";
 						}
-					}
-				});
-			} else {
-				if(cartSq == "all") {
-					// 선택된 장바구니 번호
-					$("#cartListForm input[name=cartSqArr]:checked").each(function () {
-						cartSqArr.push($(this).val());
 					});
-
-					fnOrderCheck(cartSqArr, loginInfo.custNo, "Y");
 				} else {
-					fnOrderCheck(cartSq, loginInfo.custNo, "N");
+					if(cartSq == "all") {
+						// 선택된 장바구니 번호
+						$("#cartListForm input[name=cartSqArr]:checked").each(function () {
+							cartSqArr.push($(this).val());
+						});
+
+						fnOrderCheck(cartSqArr, loginInfo.custNo, "Y");
+					} else {
+						fnOrderCheck(cartSq, loginInfo.custNo, "N");
+					}
 				}
 			}
-		}
 
-		// 주문 데이터 밸리데이션 체크
-		function fnOrderCheck(cartSq, custNo, allYn) {
-			// 선택된 장바구니 정보 가공
-			let data = {	  cartSqArr : cartSq
-				, custNo : custNo
+			// 주문 데이터 밸리데이션 체크
+			function fnOrderCheck(cartSq, custNo, allYn) {
+				// 선택된 장바구니 정보 가공
+				let data = {	  cartSqArr : cartSq
+					, custNo : custNo
+				}
+				let jsonData = JSON.stringify(data);
+
+				$.ajax( {
+					type: "POST",
+					url : '/cart/order/list/check',
+					contentType: 'application/json',
+					dataType : 'json',
+					data : jsonData,
+					success : function(result) {
+						if(result == null || result.length == 0) {
+							mcxDialog.alert("주문 가능한 상품이 존재하지 않습니다. 새로고침 후 다시 시도해주세요.");
+						} else {
+							fnOrderValidation(result, 0, cartSq, allYn);
+						}
+					}
+				});
 			}
-			let jsonData = JSON.stringify(data);
-
-			$.ajax( {
-				type: "POST",
-				url : '/cart/order/list/check',
-				contentType: 'application/json',
-				dataType : 'json',
-				data : jsonData,
-				success : function(result) {
-					if(result == null || result.length == 0) {
-						mcxDialog.alert("주문 가능한 상품이 존재하지 않습니다. 새로고침 후 다시 시도해주세요.");
-					} else {
-						fnOrderValidation(result, 0, cartSq, allYn);
+
+			//옵션변경 팝업열기
+			function fnChangeCartOptCd(cartSq) {
+				$.ajax( {
+					type: "POST",
+					url : '/cart/goods/info',
+					dataType : 'html',
+					data : {cartSq : cartSq},
+					success : function(result) {
+						$("#cartOptionModal").remove();
+						$("#optModifyPop01").html(result);
+						$('#optModifyPop01').show().addClass("active");
+						$("body").css({"overflow":"hidden"});
 					}
+				});
+			}
+
+			// 장바구니 구매 수량 변경
+			function updateGoodsQty(cartSq, goodsQty) {
+				let url = '/cart/update/goodsQty';
+				// 선택된 장바구니 정보 가공
+				let data = {	  cartSq : cartSq
+					, goodsQty : goodsQty
 				}
-			});
-		}
-
-		//옵션변경 팝업열기
-		function fnChangeCartOptCd(cartSq) {
-			$.ajax( {
-				type: "POST",
-				url : '/cart/goods/info',
-				dataType : 'html',
-				data : {cartSq : cartSq},
-				success : function(result) {
-					$("#cartOptionModal").remove();
-					$("#optModifyPop01").html(result);
-					$('#optModifyPop01').show().addClass("active");
-					$("body").css({"overflow":"hidden"});
+				let jsonData = JSON.stringify(data);
+
+				gagajf.ajaxJsonSubmit(url, jsonData, function(result) {
+					//alert(result.changeQty);
+				});
+			}
+
+			// 페이지 이동
+			function fnGoToGoodsDetail(goodsCd) {
+				cfnGoToPage(_PAGE_GOODS_DETAIL + goodsCd);
+			}
+
+			// 전체선택 버튼
+			$("#od_item_all").on("change", function() {
+				if($("#od_item_all").is(":checked")) {
+					$("input[name=cartSqArr]").prop("checked", true);
+					changeCartSqArr();
+				} else {
+					$("input[name=cartSqArr]").prop("checked", false);
+					// 하단 합계금액, 구매하기 수량 변경
+					$("#cartListForm .realOrderAmtText").text("0");
+					$("#cartListForm .realOrderQtyText").text("0");
+					$("#cartListForm .area_order .number").text("0");
+					$("#cartListForm .od_amount_box .sumListPrice").text("0");
+					$("#cartListForm .od_amount_box .totDelvFee").text("0");
+					$("#cartListForm .od_amount_box .totDcAmt").text("0");
+					$("#cartListForm .totalprice_box .sumRealPayAmt").text("0");
 				}
 			});
-		}
-
-		// 장바구니 구매 수량 변경
-		function updateGoodsQty(cartSq, goodsQty) {
-			let url = '/cart/update/goodsQty';
-			// 선택된 장바구니 정보 가공
-			let data = {	  cartSq : cartSq
-				, goodsQty : goodsQty
-			}
-			let jsonData = JSON.stringify(data);
 
-			gagajf.ajaxJsonSubmit(url, jsonData, function(result) {
-				//alert(result.changeQty);
+			//수량조절 이벤트
+			$(document).on('click','.optModifyPop01 .number_count .minus',function(e){
+				var $input = $(this).parent().find('input');
+				var count = parseInt($input.val()) - 1;
+				count = count < 1 ? 1 : count;
+				$input.val(count);
+				$input.change();
+				//수량1개 이하 감소버튼 비활성화
+				if ($input.val() == 1) {
+					$('.optModifyPop01 .number_count .minus').addClass('min_val');
+				}
+				return false;
+			}).on('click','.optModifyPop01 .number_count .plus',function(e){
+				var $input = $(this).parent().find('input');
+				$input.val(parseInt($input.val()) + 1);
+				$input.change();
+				//수량2개 이상부터 감소버튼 활성화
+				$('.optModifyPop01 .number_count .minus').removeClass('min_val');
+				return false;
+			}).on('keyup','.optModifyPop01 .number_count input[type=text]',function(e){
+				//텍스트, 0 입력금지
+				$(this).val($(this).val().replace(/[^1-9]/g,""));
 			});
-		}
 
-		// 페이지 이동
-		function fnGoToGoodsDetail(goodsCd) {
-			cfnGoToPage(_PAGE_GOODS_DETAIL + goodsCd);
-		}
+			/* 팝업 - 옵션변경 > 컬러선택 표기 */
+			$(document).on('click','.optModifyPop .opt_color ul li a',function(e){
+				$(this).parents('.opt_color').find('li a').removeClass('on');
+				$(this).addClass('on');
+				var optColor = $('.optModifyPop .opt_color ul li a.on img').attr('alt');
+				$('.optModify_pop .opt_color .opt_header .color').text(optColor);
+				return false;
+			});
 
-		// 전체선택 버튼
-		$("#od_item_all").on("change", function() {
-			if($("#od_item_all").is(":checked")) {
-				$("input[name=cartSqArr]").prop("checked", true);
-				changeCartSqArr();
-			} else {
-				$("input[name=cartSqArr]").prop("checked", false);
-				// 하단 합계금액, 구매하기 수량 변경
-				$("#cartListForm .realOrderAmtText").text("0");
-				$("#cartListForm .realOrderQtyText").text("0");
-				$("#cartListForm .area_order .number").text("0");
-				$("#cartListForm .od_amount_box .sumListPrice").text("0");
-				$("#cartListForm .od_amount_box .totDelvFee").text("0");
-				$("#cartListForm .od_amount_box .totDcAmt").text("0");
-				$("#cartListForm .totalprice_box .sumRealPayAmt").text("0");
+			/* 쿠폰정보 닫기 */
+			function cancelCartCpn() {
+				$("#cartListForm #sumRealPayAmt").text(Number(sumRealPayAmt).toLocaleString());
+				$("#cartListForm #totDcAmt").text(Number(totDcAmt).toLocaleString());
+				$("#cartListForm .area_salecoupon .coupon_box").hide();
 			}
-		});
-
-		//수량조절 이벤트
-		$(document).on('click','.optModifyPop01 .number_count .minus',function(e){
-			var $input = $(this).parent().find('input');
-			var count = parseInt($input.val()) - 1;
-			count = count < 1 ? 1 : count;
-			$input.val(count);
-			$input.change();
-			//수량1개 이하 감소버튼 비활성화
-			if ($input.val() == 1) {
-				$('.optModifyPop01 .number_count .minus').addClass('min_val');
-			}
-			return false;
-		}).on('click','.optModifyPop01 .number_count .plus',function(e){
-			var $input = $(this).parent().find('input');
-			$input.val(parseInt($input.val()) + 1);
-			$input.change();
-			//수량2개 이상부터 감소버튼 활성화
-			$('.optModifyPop01 .number_count .minus').removeClass('min_val');
-			return false;
-		}).on('keyup','.optModifyPop01 .number_count input[type=text]',function(e){
-			//텍스트, 0 입력금지
-			$(this).val($(this).val().replace(/[^1-9]/g,""));
-		});
-
-		/* 팝업 - 옵션변경 > 컬러선택 표기 */
-		$(document).on('click','.optModifyPop .opt_color ul li a',function(e){
-			$(this).parents('.opt_color').find('li a').removeClass('on');
-			$(this).addClass('on');
-			var optColor = $('.optModifyPop .opt_color ul li a.on img').attr('alt');
-			$('.optModify_pop .opt_color .opt_header .color').text(optColor);
-			return false;
-		});
-	</script>
+		</script>
+	</form>
 </th:block>
 </body>
 </html>

+ 9 - 0
src/main/webapp/WEB-INF/views/mob/cart/CartListFormMob.html

@@ -104,6 +104,15 @@
 		//배송요청사항
 		// var my_deilivery_selecter = new sCombo('.my .ship_request .select_custom');
 
+		//상품옵션변경 팝업 > 컬러선택 표기
+		$(document).on('click','.optModifyPop .opt_color ul li a',function(e){
+			$(this).parents('.opt_color').find('li a').removeClass('on');
+			$(this).addClass('on');
+			var optColor = $(this).find("img").attr('alt');
+			$(this).parent().parent().parent().find(".info").text(optColor);
+			return false;
+		});
+
 		//상품옵션변경 팝업 > 컬러선택 표기
 		$(document).on('change','input[name=shotDelvUseYn]',function(e){
 			let data = {shotDelvUseYn : $("input[name=shotDelvUseYn]:checked").val()};

+ 2 - 0
src/main/webapp/WEB-INF/views/mob/common/fragments/HeadMob.html

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

+ 331 - 0
src/main/webapp/WEB-INF/views/mob/customer/IdFindFormMob.html

@@ -0,0 +1,331 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org"
+	xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
+	layout:decorator="mob/common/layout/LoginLayoutMob">
+<!--
+ *******************************************************************************
+ * @source  : IdFindFormMob.html
+ * @desc    : 아이디 찾기 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.04.12   jsshin     최초 작성
+ *******************************************************************************
+ -->
+<body>
+<th:block layout:fragment="content">
+	<main class="container mb">
+		<!-- ★ 컨텐츠 시작 -->
+		<section class="content mb_idInquiry_1">
+			<div class="inner">
+				<div class="close">
+					<a href="javascript:void(0);" class="btn_close"><span></span><span></span></a>
+				</div>
+			</div>
+			<div class="inner">
+				<h2 class="title">아이디/비밀번호찾기</h2>
+			</div>
+			<div class="inner">
+				<div class="registration_nav">
+					<ul class="tab_btn">
+						<li class="active">
+							<a href="javascript:void(0)" onclick="cfnGoToPage(_PAGE_CUSTOMER_ID_FIND);">아이디찾기</a>
+						</li>
+						<li>
+							<a href="javascript:void(0)" onclick="cfnGoToPage(_PAGE_CUSTOMER_PWD_FIND);">비밀번호 찾기</a>
+						</li>
+					</ul>
+				</div>
+				<div class="registration_tap">
+					<div class="form_group">
+						<!-- 라디오탭 -->
+						<div id="searchDiv" class="radio_nav">
+							<ul class="form_field">
+								<li class="ui_col_4 active">
+									<input type="radio" name="radio1" id="rdi1-1" value="1" checked><label for="rdi1-1"> <span>회원정보인증</span> </label>
+								</li>
+								<li class="ui_col_4">
+									<input type="radio" name="radio1" id="rdi1-2" value="2"><label for="rdi1-2"> <span>휴대폰인증</span> </label>
+								</li>
+								<li class="ui_col_4">
+									<input type="radio" name="radio1" id="rdi1-3" value="3"><label for="rdi1-3"> <span>아이핀인증</span> </label>
+								</li>
+							</ul>
+						</div>
+						<!-- //라디오탭 -->
+						<!-- 라디오탭 -->
+						<div class="radio_tap">
+							<div class="form_group">
+								<form id="searchCustInfo" name="searchCustInfo" class="form_wrap form_full" method="post">
+									<div>
+										<div class="form_field mt0">
+											<input type="text" name="custNm" placeholder="이름" id="custNm" class="form_control" maxlength="30"/>
+										</div>
+										<div class="form_field">
+											<input type="text" name="birthYmd" placeholder="생년월일 8자리 (예:19880912)" id="birthYmd" class="form_control"/>
+										</div>
+										<div class="form_field">
+											<input type="text" name="email" placeholder="이메일" id="email" class="form_control"/>
+										</div>
+										<div class="ui_row mt20">
+											<button type="button" id="btnInfoConfirm" class="btn btn_dark">확인</button>
+										</div>
+									</div>
+								</form>
+							</div>
+							<div class="form_group" style="display: none;">
+								<div class="form_wrap form_full">
+									<div>
+										<div class="txt">
+												회원님의 명의로 등록된 휴대폰으로<br>
+												본인확인을 진행합니다.
+										</div>
+											<div class="ui_row mt20">
+												<button type="button" id="btnCellPhoneCertify" class="btn btn_dark">
+													본인명의 휴대폰으로 인증
+												</button>
+											</div>
+									</div>
+								</div>
+							</div>
+							<div class="form_group hide" style="display: none;">
+								<div class="form_wrap form_full">
+									<div>
+										<div class="txt">
+											아이핀 인증을 통해 찾을 수 있습니다.
+										</div>
+										<div class="ui_row mt20">
+											<button type="button" id="btnIpinCertify" class="btn btn_dark">
+												아이핀 인증
+											</button>
+										</div>
+									</div>
+								</div>
+							</div>
+						</div>
+					</div>
+				</div>
+				<!-- 아이디찾기 결과 -->
+				<div id="succeedCustId" class="form_wrap form_full" style="display: none;">
+					<div class="find_result clear">
+						<div class="form_info">
+							<span class="ico_content_find"></span>
+							<p>아이디 찾기 결과 안내</p>
+						</div>
+						<div class="form_print_bar mt40">
+							<ul>
+								<li>
+									<span class="t_span">아이디</span>
+									<span id="resultId" name="resultId" class="c_primary bold" data-font="lato"></span>
+								</li>
+								<li>
+									<span class="t_span">가입일자</span>
+									<span id="joinDt" name="joinDt" class="bold" data-font="lato"></span>
+								</li>
+								<li id="liJoinPath">
+									<span class="t_span">가입경로</span>
+									<span id="joinPath" name="joinPath" class="bold" data-font="lato"></span>
+								</li>
+							</ul>
+						</div>
+						<div class="ui_row mt20">
+							<button type="button" class="btn btn_dark" onclick="cfnGoToPage(_PAGE_LOGIN);">로그인 하기</button>
+						</div>
+					</div>
+				</div>
+				<!-- //아이디찾기 결과 -->
+				<!-- 회원정보로 아이디찾기 실패일경우 -->
+				<div id="failCustId" class="form_wrap form_full" style="display: none;">
+					<div class="find_result clear">
+						<div class="form_info">
+							<span class="ico_content_none"></span>
+							<p>입력한 정보와 일치하는 아이디가 존재하지 않습니다.</p>
+							<p class="t_info mt10">
+								정확한 확인을 위해 휴대폰 인증/아이핀 인증을 통한<br>아이디 찾기를 진행해 주세요.
+							</p>
+						</div>
+						<div class="btn_group_block btn_group_md ui_row">
+							<div class="ui_col_6">
+								<button type="button" class="btn btn_primary" onclick="cfnGoToPage(_PAGE_CUSTOMER_JOIN);">
+									<span>회원가입</span>
+								</button>
+							</div>
+							<div class="ui_col_6">
+								<button type="button" class="btn btn_dark" onclick="cfnGoToPage(_PAGE_CUSTOMER_ID_FIND);">
+									<span>다시 찾기</span>
+								</button>
+							</div>
+						</div>
+					</div>
+				</div>
+				<!-- //회원정보로 아이디찾기 실패일경우 -->
+				<!-- 휴대폰,아이핀 본인인증으로 아이디찾기 실패일경우 -->
+				<div id="failAuthentication" class="form_wrap form_full" style="display: none;">
+					<div class="find_result clear">
+						<div class="form_info">
+							<span class="ico_content_none"></span>
+							<p>입력한 정보와 일치하는 아이디가 존재하지 않습니다.</p>
+							<p class="t_info mt10">
+								<span class="c_primary">STYLE24의 새로운 가족이 되어 주세요!</span>
+							</p>
+						</div>
+						<div class="btn_group_block btn_group_md ui_row">
+							<div class="ui_col_12">
+								<button type="button" class="btn btn_primary" onclick="cfnGoToPage(_PAGE_CUSTOMER_JOIN);">
+									<span>회원가입</span>
+								</button>
+							</div>
+						</div>
+					</div>
+				</div>
+				<!-- //휴대폰,아이핀 본인인증으로 아이디찾기 실패일경우 -->
+			</div>
+		</section>
+		<!-- ★ 컨텐츠 종료 -->
+	</main>
+<script th:src="@{'/biz/customer.js?v=' + ${#calendars.format(#calendars.createNow(), 'yyyyMMddHHmmss')}}" src="/biz/customer.js"></script>
+<script th:inline="javascript">
+/*<![CDATA[*/
+	const sEncData = [[${sEncData}]];   //인증 후 해당 페이지로 리다이렉트함
+	const authMethod = [[${authMethod}]]; //인증 후 해당 페이지로 리다이렉트함
+
+	// 회원정보로 아이디 찾기
+	$('#btnInfoConfirm').on('click', function() {
+		let custInfo = $('#searchCustInfo').serializeObject();
+
+		if (gagajf.isNull(custInfo.custNm)) {
+			mcxDialog.alert('이름을 형식에 맞게 입력해주세요.');
+			return;
+		}
+
+		if (gagajf.isNull(custInfo.email)) {
+			mcxDialog.alert('이메일을 입력하여 주세요.');
+			return;
+		}
+
+		if (!fnCheckValidationEmail(custInfo.email)) {
+			mcxDialog.alert('이메일 형식에 맞게 입력해주세요.');
+			return;
+		}
+		custInfo.authMethod = 'custInfo';
+
+		let jsonData = JSON.stringify(custInfo);
+		//console.log('jsonData', jsonData);
+		gagajf.ajaxJsonSubmit('/customer/id/find', jsonData, fnInfoConfirmCallBack);
+	});
+
+	// 찾기결과
+	var fnInfoConfirmCallBack = function (result) {
+		$('#btnInfoConfirm').hide();
+		$('#searchDiv').hide();
+		$('.regist_box').hide();
+		$('.form_field').hide();
+		if (result.isFind) {
+			fnGetDisplaySucc(result.authMethod, result);
+		} else {
+			fnGetDisplayFail(result.authMethod);
+		}
+	};
+
+	// 찾기성공
+	var fnGetDisplaySucc = function (authMethod, custInfo) {
+		$('#resultId').text(custInfo.maskingCustId);
+		$('#joinDt').text(fnToDateFormat(custInfo.joinDt));
+		let joinPath = fnSnsJoinPath(custInfo); // 가입경로 : 직접이면 표시 안함, 간편가입 연동 표시
+		if (!gagajf.isNull(joinPath)) {
+			$('#liJoinPath').show();
+			$('#joinPath').text(joinPath);
+		}
+		$('#succeedCustId').show();
+	};
+
+	// 찾기실패
+	var fnGetDisplayFail = function (authMethod) {
+		$('.registration_nav').hide();
+		if (authMethod === 'custInfo') {
+			$('#failCustId').show();
+		}
+		if (authMethod === 'mobile' || authMethod === 'ipin') {
+			$('#failAuthentication').show();
+		}
+	};
+
+	// 가입경로
+	var fnSnsJoinPath = function (custInfo) {
+		let snsType = '';
+		if (!gagajf.isNull(custInfo.ysJoinDt)) {
+			snsType += 'YES24';
+		}
+		if (!gagajf.isNull(custInfo.nvJoinDt)) {
+			if (!gagajf.isNull(snsType)) {
+				snsType += '/'
+			}
+			snsType = 'NAVER'
+		}
+		if (!gagajf.isNull(custInfo.kkJoinDt)) {
+			if (!gagajf.isNull(snsType)) {
+				snsType += '/'
+			}
+			snsType += 'KAKAO';
+		}
+		if (!gagajf.isNull(snsType)) {
+			snsType += ' 연동';
+		} else {
+			snsType += 'STYLE24';
+		}
+		return snsType;
+	};
+
+	// 휴대폰 인증
+	$('#btnCellPhoneCertify').on('click', function () {
+		cfnOpenCellphoneCertify(_PAGE_CUSTOMER_ID_FIND);
+	});
+
+	// 아이핀 인증
+	$('#btnIpinCertify').on('click', function () {
+		cfnOpenIpinCertify(_PAGE_CUSTOMER_ID_FIND);
+	});
+
+	// 나이스 본인인증 후 콜백
+	var fnNiceCallBack = function(encData, authMethod) {
+		if (!gagajf.isNull(encData)) {
+			let custInfo = {};
+			custInfo.encData = encData;
+			custInfo.authMethod = authMethod;
+			let jsonData = JSON.stringify(custInfo);
+			gagajf.ajaxJsonSubmit('/customer/id/find', jsonData, fnInfoConfirmCallBack)
+		}
+	};
+
+	$(document).ready(function () {
+		if (!gagajf.isNull(sEncData)) {
+			fnNiceCallBack(sEncData, authMethod);
+		}
+
+		/* 회원정보인증/휴대폰인증/아이핀인증_taps */
+		$('.radio_tap > .form_group').hide();
+		$('.radio_tap > .form_group').eq(0).show();
+		$('.radio_tap').each(function(){
+			$(this).find('.form_group').hide();
+			$(this).find('.form_group').eq(0).show();
+		});
+
+		$(document).on('click','.radio_nav > ul > li',function(e){
+			$(this).addClass('active').siblings().removeClass('active');
+			$(this).find('input').prop("checked", true);
+			$(this).parent().parent().parent().find('.radio_tap > .form_group').hide();
+			$(this).parent().parent().parent().find('.radio_tap > .form_group').eq($(this).index()).show();
+			return false;
+		});
+	});
+
+/*]]>*/
+</script>
+
+</th:block>
+</body>
+</html>

+ 32 - 0
src/main/webapp/WEB-INF/views/mob/customer/NiceCallbackFormMob.html

@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<html lang="ko"
+	  xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : NiceCallbackFormWeb.html
+ * @desc    : NICE 인증콜백 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2021 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.02.09   jsshin     최초 작성
+ *******************************************************************************
+ -->
+<body>
+	<form name="niceCallbackForm" id="niceCallbackForm" method="post" th:action="${redirectUrl}">
+		<input type="hidden" name="sEncData" th:value="${sEncData}"/>
+		<input type="hidden" name="authMethod" th:value="${authMethod}"/>
+	</form>
+<script th:inline="javascript">
+	/*<![CDATA[*/
+	window.onload = function () {
+		document.niceCallbackForm.submit();
+	}
+
+	/*]]>*/
+</script>
+
+</body>
+</html>

+ 37 - 0
src/main/webapp/WEB-INF/views/mob/customer/NiceCellPhoneFormMob.html

@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<html lang="ko"
+	  xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : NiceCellPhoneFormWeb.html
+ * @desc    : NICE 휴대폰 인증 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2021 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.02.09   jsshin     최초 작성
+ *******************************************************************************
+ -->
+<body>
+
+<form name="niceAuthForm" id="niceAuthForm" method="post" >
+	<input type="hidden" name="m" value="checkplusSerivce" />
+	<input type="hidden" name="EncodeData" th:value="${sEncData}" />
+	<input type="hidden" name="param_r1" th:value="${redirectUrl}"/>
+</form>
+
+<script th:inline="javascript">
+	/*<![CDATA[*/
+
+	window.onload = function () {
+		document.niceAuthForm.action="https://nice.checkplus.co.kr/CheckPlusSafeModel/checkplus.cb";
+		document.niceAuthForm.submit();
+	};
+	/*]]>*/
+</script>
+
+
+</body>
+</html>

+ 37 - 0
src/main/webapp/WEB-INF/views/mob/customer/NiceIpinFormMob.html

@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<html lang="ko"
+	  xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : NiceIpinFormWeb.html
+ * @desc    : NICE 아이핀 인증 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2021 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.02.09   jsshin     최초 작성
+ *******************************************************************************
+ -->
+<body>
+
+<form name="niceAuthForm" id="niceAuthForm" method="post" >
+	<input type="hidden" name="m" value="pubmain" />
+	<input type="hidden" name="enc_data" th:value="${sEncData}" />
+	<input type="hidden" name="param_r1" th:value="${redirectUrl}"/>
+</form>
+
+<script th:inline="javascript">
+	/*<![CDATA[*/
+
+	window.onload = function () {
+		document.niceAuthForm.action="https://cert.vno.co.kr/ipin.cb";
+		document.niceAuthForm.submit();
+	};
+	/*]]>*/
+</script>
+
+
+</body>
+</html>

+ 210 - 0
src/main/webapp/WEB-INF/views/mob/customer/PasswordFindFormMob.html

@@ -0,0 +1,210 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org"
+	xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
+	layout:decorator="mob/common/layout/LoginLayoutMob">
+<!--
+ *******************************************************************************
+ * @source  : PasswordFindFormMob.html
+ * @desc    : 비밀번호 찾기 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.04.12   jsshin     최초 작성
+ *******************************************************************************
+ -->
+<body>
+	<div class="app">
+
+		<a href="#mainCon" class="skipNav">본문바로가기</a>
+		<header></header>
+
+		<main role="" id="" class="container mb">
+			
+			<!-- ★ 컨텐츠 시작 -->
+			<section class="content mb_idInquiry_1">
+				<div class="inner">
+                    <div class="close">
+                        <a href="#none" class="btn_close"><span></span><span></span></a>
+                    </div>
+                </div>
+				<div class="inner">
+					<h2 class="title">아이디/비밀번호찾기</h2>
+				</div>
+				<div class="inner">
+                        <div class="registration_nav">
+                            <ul class="tab_btn">
+                                <li class="active">아이디찾기</li>
+                                <li>비밀번호찾기</li>
+                            </ul>
+                        </div>
+                        <div class="registration_tap">
+                            <div class="form_group">
+                                <!-- 라디오탭 -->
+                                <div class="radio_nav">
+                                    <ul class="form_field">
+                                        <li class="ui_col_4 active">
+                                            <input type="radio" name="radio1" id="rdi1-1" value="1" checked><label for="rdi1-1"> <span>회원정보인증</span> </label>
+                                        </li>
+                                        <li class="ui_col_4">
+                                            <input type="radio" name="radio1" id="rdi1-2" value="2"><label for="rdi1-2"> <span>휴대폰인증</span> </label>
+                                        </li>
+                                        <li class="ui_col_4">
+                                            <input type="radio" name="radio1" id="rdi1-3" value="3"><label for="rdi1-3"> <span>아이핀인증</span> </label> 
+                                        </li>
+                                    </ul>
+                                </div>
+                                 <!-- //라디오탭 -->
+                                  <!-- 라디오탭 -->
+                                <div class="radio_tap">
+                                    <div class="form_group">
+                                        <form class="form_wrap form_full">
+                                            <div>
+                                                <div class="form_field mt0"><input type="text" placeholder="이름" class="form_control"></div>
+                                                <div class="form_field"><input type="password" placeholder="생년월일 8자리(예:19880912)" class="form_control"></div>
+                                                <div class="form_field"><input type="text" placeholder="이메일" class="form_control"></div>
+                                                <div class="ui_row mt20"><button class="btn btn_dark">확인</button></div>
+                                            </div>
+                                        </form>
+                                    </div>
+                                    <div class="form_group">
+                                        <form class="form_wrap form_full">
+                                            <div>
+                                                <div class="txt">
+                                                    회원님의 명의로 등록된 휴대폰으로<br>
+                                                    본인확인을 진행합니다.
+                                                </div>
+                                                <div class="ui_row mt20"><button class="btn btn_dark">본인명의 휴대폰으로 인증</button></div>
+                                            </div>
+                                        </form>
+                                    </div>
+                                    <div class="form_group">
+                                        <form class="form_wrap form_full">
+                                            <div>
+                                                <div class="txt">
+                                                    아이핀 인증을 통해 찾을 수 있습니다.
+                                                </div>
+                                                <div class="ui_row mt20"><button class="btn btn_dark">아이핀 인증</button></div>
+                                            </div>
+                                        </form>
+                                    </div>
+                                </div>
+                                 <!-- //라디오탭 -->
+                                
+                            </div>
+                            <div class="form_group">
+                                <!-- 라디오탭 -->
+                                <div class="radio_nav">
+                                    <ul class="form_field">
+                                        <li class="ui_col_4 active">
+                                            <input type="radio" name="radios" id="rdi-4" value="4" checked><label for="rdi-4"> <span>회원정보인증</span> </label>
+                                        </li>
+                                        <li class="ui_col_4">
+                                            <input type="radio" name="radios" id="rdi-5" value="5"><label for="rdi-5"> <span>휴대폰인증</span> </label>
+                                        </li>
+                                        <li class="ui_col_4">
+                                            <input type="radio" name="radios" id="rdi-6" value="6"><label for="rdi-6"> <span>아이핀인증</span> </label> 
+                                        </li>
+                                    </ul>
+                                </div>
+                                 <!-- //라디오탭 -->
+                                  <!-- 라디오탭 -->
+                                <div class="radio_tap">
+                                    <div class="form_group">
+                                         <form class="form_wrap form_full">
+                                            <div>
+                                                <div class="form_field mt0"><input type="text" placeholder="이름" class="form_control"></div>
+                                                <div class="form_field"><input type="password" placeholder="생년월일 8자리(예:19880912)" class="form_control"></div>
+                                                <div class="form_field"><input type="text" placeholder="이메일" class="form_control"></div>
+                                                <div class="ui_row mt20"><button class="btn btn_dark">확인</button></div>
+                                            </div>
+                                        </form>
+                                    </div>
+                                    <div class="form_group">
+                                        <form class="form_wrap form_full">
+                                            <div>
+                                                <div class="txt">
+                                                    회원님의 명의로 등록된 휴대폰으로<br>
+                                                    본인확인을 진행합니다.
+                                                </div>
+                                                <div class="ui_row mt20"><button class="btn btn_dark">본인명의 휴대폰으로 인증</button></div>
+                                            </div>
+                                        </form>
+                                    </div>
+                                    <div class="form_group">
+                                        <form class="form_wrap form_full">
+                                            <div>
+                                                <div class="txt">
+                                                    아이핀 인증을 통해 찾을 수 있습니다.
+                                                </div>
+                                                <div class="ui_row mt20"><button class="btn btn_dark">아이핀 인증</button></div>
+                                            </div>
+                                        </form>
+                                    </div>
+                                </div>
+                                 <!-- //라디오탭 -->
+                                
+                            </div>
+                        </div>
+
+			</section>
+			<!-- ★ 컨텐츠 종료 -->	
+
+		</main>
+
+		<footer></footer>
+
+	</div>
+
+    <script>
+        $(document).ready(function () {
+            /* 아이디/비밀번호 찾기_taps */
+            $('.registration_tap > .form_group').hide();	
+            $('.registration_tap > .form_group').eq(0).show();
+            $(document).on('click','.registration_nav > ul > li',function(e){
+                $(this).addClass('active').siblings().removeClass('active');
+                $('.registration_tap > .form_group').hide();		
+                $('.registration_tap > .form_group').eq($(this).index()).show();
+                return false;
+            });
+
+            /* 회원정보인증/휴대폰인증/아이핀인증_taps */
+            $('.radio_tap > .form_group').hide();	
+            $('.radio_tap > .form_group').eq(0).show();
+            $('.radio_tap').each(function(){
+                $(this).find('.form_group').hide();
+                $(this).find('.form_group').eq(0).show();
+            });
+
+            $(document).on('click','.radio_nav > ul > li',function(e){
+                $(this).addClass('active').siblings().removeClass('active');
+                $(this).find('input').prop("checked", true);
+                $(this).parent().parent().parent().find('.radio_tap > .form_group').hide();		
+                $(this).parent().parent().parent().find('.radio_tap > .form_group').eq($(this).index()).show();
+                return false;
+            });
+        });
+    </script>
+
+    <script type="text/javascript">
+        $(document).ready(function(){
+            setHtop();
+        });
+
+        function setHtop() {
+            if($('header').hasClass('main')) {
+                $('#htopMain').show();
+                $('#htopSub').hide();
+            } else {
+                $('#htopMain').hide();
+                $('#gnb').hide();
+                $('#htopSub').show();
+            }
+        }
+    </script>
+</body>
+
+</html>

+ 373 - 0
src/main/webapp/WEB-INF/views/mob/mypage/MypageGiftcardFormMob.html

@@ -0,0 +1,373 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org"
+	xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
+	layout:decorator="mob/common/layout/DefaultLayoutMob">
+<!--
+ *******************************************************************************
+ * @source  : MypageGiftcardFormMob.html
+ * @desc    : 마이페이지 > 상품권 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.04.12   sowon     최초 작성
+ *******************************************************************************
+ -->
+<body>
+<!-- 상단헤드 //? -->
+<th:block layout:fragment="content">
+		<main role="" id="" class="container my">
+			<section class="content myVoucher">
+
+				<div class="inner">
+					<div class="highlight_area">
+						<div class="have_amount">
+							<div class="total_amount">
+								보유 금액&nbsp;<span><em th:text="${#numbers.formatInteger(giftcardInfo.useGift,0,'COMMA')}"></em>원</span>
+							</div>
+						</div>
+					</div>
+					<div class="have_amount">
+						<dl>
+							<div>
+								<dt>보유 상품권</dt>
+								<dd><em th:text="${#numbers.formatInteger(giftcardInfo.totalCount,0,'COMMA')}"></em>장</dd>
+							</div>
+						</dl>
+						<dl>
+							<div>
+								<dt>한 달 이내 소멸 예정<span class="tag primary_line">D-<em>30</em></span></dt>
+								<dd><em th:text="${#numbers.formatInteger(giftcardInfo.expireCount,0,'COMMA')}"></em>원</dd>
+							</div>
+						</dl>
+					</div>
+				</div>
+
+				<div class="inner">
+						
+					<div class="ADwrap">
+						<span class="adcopy">상품권 등록</span>
+						<div class="tip_wrap tip1" >
+							<div class="tip_tit">?</div>
+							<div class="tip_contents">
+								<p class="tip_txt">
+									<ul>
+										<li>상품권은 상품 구매 시 현금과 동일하게 사용됩니다.</li>
+										<li>상품권은 등록한 해당 몰에서만  사용이 가능합니다.<br>(YES24와 중복 사용 불가)</li>
+										<li>사용 후 남은 잔액은 상품권 잔액으로 환불되며, 유효 기간 내에 사용가능합니다.</li>
+										<li>유효 기간이 지난 상품권의 잔액은 자동 소멸됩니다.</li>
+										<li>상품권은 현금성 결제 수단에 포함되어 주문시 포인트 적립이 가능합니다.</li>
+										<li>상품권으로 결제한 금액은 마이페이지 &gt; 주문 상세 페이지에서 현금영수증을 발급 받으실 수 있습니다.</li>
+									</ul>
+								</p>
+							</div>
+						</div>
+					</div>
+					<div class="form_field">
+						<div class="input_wrap certi_wrap">
+							<input type="text" class="form_control"  id="gift_input" placeholder="상품권 번호를 입력해주세요.">
+							<button type="button" id="btn_gift_confirm" class="btn btn_dark" onclick="giftcardSave()"><span>등록</span></button> <!-- 210409_추가 : btn_gift_confirm id 추가 -->
+						</div>
+					</div>
+
+				</div>
+
+				<div class="inner wide">
+					<div class="select_box">
+						<div class="form_field">
+							<div class="select_custom month sup">
+								<!-- 210408_ 수정 : 스크립트없는 기본 셀렉터 사용으로 변경 -->
+								<div class="select pure">
+									<select name="month" id="month" onchange='fnChangeDate(this.value)' >
+									</select>
+								</div>
+							</div>
+						</div>
+					</div>
+					<div class="tabWrap">
+						<ul class="tabIndex">
+							<li id="SearchUseGiftcard"><a href="javascript:void(0);" >사용내역</a></li>
+							<li id="SearchOwnGiftcard"><a href="javascript:void(0);" >보유상품권</a></li>
+						</ul>
+						<div class="tabContents">
+							<div class="tab_cont" id="giftcardList">
+								<!-- tab_cont 사용내역 Start -->
+								<ul>
+									<li>
+										<div>
+											<span class="tag deepgray">차감</span>
+											<span class="tag_name">상품구매</span>
+											<span class="txt_content">남성 라그란 소매배색 F67M-TS927A</span>
+											<span class="txt_time">2020.10.06 22:50:14</span>
+										</div>
+										<div>
+											<span class="amount_minus">
+												<em>-10,000</em>원
+											</span>
+										</div>
+									</li>
+								</ul>
+								<!-- // tab_cont End -->
+							</div>
+							<div class="tab_cont ">
+										<div class="voucher">
+											<div>
+												<p class="vch_name">
+													STYLE24 상품권
+												</p>
+												<p class="vch_price">
+													<span class="tag primary_line"><em>300,900</em>원권</span>
+												</p>
+												<p class="vch_remain">
+													잔액<span><em>200,000</em>원</span>
+												</p>
+												<p class="vch_code">
+													1234-ABCD-3342-ADLS
+												</p>
+											</div>
+											<div class="vch_date">
+												~&nbsp;<span>2021.12.30</span>
+											</div>
+										</div>
+
+										<div class="voucher disable">
+											<div>
+												<p class="vch_name">
+													STYLE24 상품권
+												</p>
+												<p class="vch_price">
+													<span class="tag primary_line"><em>300,900</em>원권</span>
+												</p>
+												<p class="vch_remain">
+													전액소진
+												</p>
+												<p class="vch_code">
+													1234-ABCD-3342-ADLS
+												</p>
+											</div>
+											<div class="vch_date">
+												~&nbsp;<span>2021.12.30</span>
+											</div>
+										</div>
+
+								// tab_cont End
+							</div> 
+						</div>
+					</div>
+				</div>
+
+			</section>
+		</main>
+<script th:inline="javascript">
+let date = [[${date}]];
+let year = date[0].year;
+let month = date[0].month;
+
+//동적으로 날짜 년도 append
+function appendYear() {
+	for (var i = 0; i < date.length; i++) {
+		$("#month").append(	"<option value='"+ date[i].year + "" + date[i].month + "'>" + date[i].year	+ "년" + date[i].month + "월 </option>")
+	}
+	//$(".month").append("<option class='selected' value='"+date[0].year+""+date[0].month+"'>"+ date[0].year + "년" + date[0].month + "월 </option>"); // 현재년도 선택 */ 
+}
+appendYear($("#month"));
+
+//사용내역 조회
+$("#SearchUseGiftcard").click(function() {
+	// class제거 추가
+	$("#SearchOwnGiftcard").removeClass("active");
+	$("#SearchUseGiftcard").addClass("active");
+	$("#giftcardList").attr("class", "tab_cont active");
+	$(".select_box").show();
+
+	// 날짜 필드 
+	$("#dateField").css("display", "block");
+
+	let data = {
+		searchDt : year + "" + month,
+		month : month
+	};
+
+	var jsonData = JSON.stringify(data);
+
+	$.ajax({
+		type : "POST",
+		data : jsonData,
+		url : '/mypage/gift/use/list',
+		contentType : 'application/json',
+		dataType : 'json',
+		success : function(result) {
+			useGiftcard(result);
+		}
+	})
+});
+
+function useGiftcard(result) {
+
+	let giftcardUseList = result.giftcardUseList;
+
+	let tmtbHtml = '';
+	
+	tmtbHtml += '<ul>                                                                   ';
+	for (let i = 0; i < giftcardUseList.length; i++) {
+		let useGiftcard = giftcardUseList[i];
+		tmtbHtml += '	<li>                                                               ';
+		tmtbHtml += '		<div>                                                          ';
+		tmtbHtml += '			<span class="tag deepgray">차감</span>                       ';
+		tmtbHtml += '			<span class="tag_name">상품구매</span>                         ';
+		tmtbHtml += '			<span class="txt_content">'	+ useGiftcard.goodsNm + '</span>   ';
+		tmtbHtml += '			<span class="txt_time">'+useGiftcard.regDt+'</span>          ';
+		tmtbHtml += '		</div>                                                         ';
+		tmtbHtml += '		<div>                                                          ';
+		tmtbHtml += '			<span class="amount_minus">                                ';
+		tmtbHtml += '				<em>'+useGiftcard.gfcdAmt.addComma()+'</em>원                                      ';
+		tmtbHtml += '			</span>                                                    ';
+		tmtbHtml += '		</div>                                                         ';
+		tmtbHtml += '	</li>                                                              ';
+	}
+	
+	tmtbHtml += '</ul>                                                                  ';
+
+	$("#giftcardList").html(tmtbHtml);
+}
+
+// 보유상품권 조회
+$("#SearchOwnGiftcard").click(function() {
+	$("#SearchUseGiftcard").removeClass("active");
+	$("#SearchOwnGiftcard").addClass("active");
+	$("#giftcardList").attr("class", "tab_cont active");
+	$(".select_box").hide();
+
+	let data = {};
+
+	var jsonData = JSON.stringify(data);
+
+	$.ajax({
+		type : "POST",
+		data : jsonData,
+		url : '/mypage/gift/own/list',
+		contentType : 'application/json',
+		dataType : 'json',
+		success : function(result) {
+			ownGiftcard(result);
+		}
+	})
+});
+
+function ownGiftcard(result) {
+
+	let giftcardOwnList = result.giftcardOwnList;
+
+	let tmtbHtml2 = "";
+
+	if (giftcardOwnList == null) {
+		tmtbHtml2 += '<div class="nodata">';
+		tmtbHtml2 += '<div class="txt_box">';
+		tmtbHtml2 += '<p>보유한 상품권이 없습니다.<br></p>';
+		tmtbHtml2 += '</div>';
+		tmtbHtml2 += '</div>';
+	} else {
+		
+		for (let i = 0; i < giftcardOwnList.length; i++) {
+			let ownGiftcard = giftcardOwnList[i];
+			if (ownGiftcard.rmGfcdAmt == 0 || ownGiftcard.useYn == 'N') {
+				tmtbHtml2 += '<div class="voucher disable">';
+			} else {
+				tmtbHtml2 += '<div class="voucher">';
+			}
+			tmtbHtml2 += '	<div>';
+			tmtbHtml2 += '		<p class="vch_name">'+ ownGiftcard.gfcdNm +'</p>';
+			tmtbHtml2 += '		<p class="vch_price">';
+			tmtbHtml2 += '			<span class="tag primary_line"><em>'+ ownGiftcard.chgGfcdAmt.addComma()	+ '</em>원권</span>';
+			tmtbHtml2 += '		</p>';
+			if (ownGiftcard.rmGfcdAmt > 0) {
+				tmtbHtml2 += '<p class="vch_remain">잔액<span><em>'+ ownGiftcard.rmGfcdAmt.addComma()+ '</em>원</span></p>';
+			} else {
+				tmtbHtml2 += '<p class="vch_remain">전액소진</p>';
+			}
+			tmtbHtml2 += '		<p class="vch_code">'	+ ownGiftcard.gfcdNo + '</p>';
+			tmtbHtml2 += '	</div>';
+			tmtbHtml2 += '	<div class="vch_date">';
+			tmtbHtml2 += '		~&nbsp;<span>'	+ ownGiftcard.useExpDate + '</span>';
+			tmtbHtml2 += '	</div>';
+			tmtbHtml2 += '</div>';
+		}
+	}
+	$("#giftcardList").html(tmtbHtml2);
+
+}
+
+function fnChangeDate(obj) {
+	console.log(obj);
+	var seletedDate = obj.toString();
+	var splitMonth = seletedDate.substr(4);
+
+	data = {
+		month : splitMonth,
+		searchDt : seletedDate
+	};
+
+	var jsonData = JSON.stringify(data);
+
+	$.ajax({
+		type : "POST",
+		data : jsonData,
+		url : '/mypage/gift/use/list',
+		contentType : 'application/json',
+		dataType : 'json',
+		success : function(result) {
+			useGiftcard(result);
+		}
+	})
+}
+
+//상품권 등록 버튼 누를 시 
+function giftcardSave() {
+	if ($("#gift_input").val() == ""
+			|| $("#gift_input").val() == null) {
+		mcxDialog.alert("상품권 번호를 입력해주세요.");
+		return;
+	}
+
+	data = {
+		gfcdNo : $("#gift_input").val()
+	};
+
+	var jsonData = JSON.stringify(data);
+
+	mcxDialog.confirm("상품권을 등록 하시겠습니까?", {
+		cancelBtnText : "취소",
+		sureBtnText : "확인",
+		sureBtnClick : function() {
+
+			gagajf.ajaxJsonSubmit(
+					'/mypage/gift/use/confirm', jsonData,
+					function() {
+						$("#gift_input").val('');
+						//cfnGoToPage(_PAGE_MYPAGE_GIFTCARD);
+					});
+		}
+	});
+
+}
+
+
+
+/*<![CDATA[*/
+$(document).ready(function() {
+	// 전체내역 표시
+	$("#SearchUseGiftcard").trigger('click');
+	// 셀렉트박스 활성화
+	$('.select').each(function(index) {
+		var selecter01 = new sCombo($(this));
+	});
+});
+/*]]>*/
+</script>
+	</th:block>
+
+</body>
+</html>

+ 454 - 0
src/main/webapp/WEB-INF/views/mob/order/OrderCompleteMob.html

@@ -0,0 +1,454 @@
+<!DOCTYPE html>
+<html lang="ko" xmlns:th="http://www.thymeleaf.org" xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout" layout:decorator="mob/common/layout/SubLayoutMob">
+<!--
+ *******************************************************************************
+ * @source  : OrderCompleteMob.html
+ * @desc    : 주문완료 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.04.12   jsh77b     최초 작성
+ *******************************************************************************
+ -->
+<body>
+<th:block layout:fragment="content">
+<main role="" id="" class="container od">
+	<section class="content completed">
+		<div class="inner wide">
+			<div class="info_complete">
+				<img src="/images/mo/ico_complete_check.png" alt="주문이 완료 되었습니다.">
+				<p class="txt_box">주문이 완료되었습니다.</p>
+				<dl class="report_box">
+					<div>
+						<dt>주문번호</dt>
+						<dd><span th:text="${orderInfo.ordNo}"></span></dd>
+					</div>
+				</dl>
+			</div>
+		</div>
+		<!-- 무통장입금 결제시 -->
+		<th:block th:if="${orderInfo.payMeans} == 'G014_20'">
+			<div class="inner">
+				<div class="tbl_wrap">
+					<div class="tbl_tit"> 
+						<h3>무통장 입금 정보</h3>
+					</div>
+					<div class="tbl type1">
+						<table>
+							<colgroup>
+								<col width="107">
+								<col width="*">
+							</colgroup>   
+							<tbody>
+								<tr>
+									<th>은행명/명의자</th>
+									<td>
+										<div>
+											<span th:text="${orderInfo.cardNm}"></span>/<span th:text="${orderInfo.ordNm}"></span>
+										</div>
+									</td>
+								</tr>
+								<tr>
+									<th>계좌번호</th>
+									<td>
+										<div>
+											<span th:text="${orderInfo.vaNo}"></span>
+										</div>
+									</td>
+								</tr>
+								<tr>
+									<th>입금기한</th>
+									<td>
+										<div>
+											<span th:text="|${orderInfo.vaDeadline}"></span><!-- <span>12:00:00</span> --> 까지
+										</div>
+									</td>
+								</tr>
+							</tbody>
+						</table>
+					</div>
+				</div>
+			</div>
+		</th:block>
+		<div class="inner wide">
+			<!-- 폴딩리스트 -->
+			<div class="ui_row">
+				<div class="foldGroup">
+					<ul>
+						<li class="fold_mbinfo">
+							<div class="fold_head">
+								<a href="javascript:void(0)">
+									<div>
+										<div class="fold_tit">
+											<span th:text="${orderInfo.ordNm}"></span>
+										</div>
+										<div class="data">
+											<span th:text="${orderInfo.ordNm}"></span>
+											<span th:text="${orderInfo.ordPhnno}"></span>
+										</div>
+									</div>
+								</a>
+							</div>
+							<div class="fold_cont">
+								<div class="customer_info">
+									<dl>
+										<div>
+											<dt><span class="sr-only">주문자명</span></dt>
+											<dd th:text="${orderInfo.ordNm}"></dd>
+										</div>
+										<div>
+											<dt><span class="sr-only">이메일</span></dt>
+											<dd th:text="${orderInfo.ordEmail}"></dd>
+										</div>
+										<div>
+											<dt><span class="sr-only">휴대폰 번호</span></dt>
+											<dd th:text="${orderInfo.ordPhnno}"></dd>
+										</div>
+									</dl>
+								</div>
+							</div>
+						</li>
+					</ul>
+				</div>
+			</div>
+			<!-- 폴딩리스트 -->
+		</div>
+		<div class="inner wide">
+			<!-- 폴딩리스트 -->
+			<div class="ui_row">
+				<div class="foldGroup shipfold">
+					<ul>
+						<li class="fold_delivery">
+							<div class="fold_head">
+								<a href="javascript:void(0)">
+									<div>
+										<div class="fold_tit">
+											<span>배송지 정보</span>
+										</div>
+										<div class="data">
+											<span class="recipAddr" th:text="${orderInfo.recipBaseAddr} + '    ' + ${orderInfo.recipDtlAddr}"></span>
+										</div>
+									</div>
+								</a>
+							</div>
+							<div class="fold_cont">
+								<!-- //배송지 정보 변경불가 -->
+								<div class="ship_info">
+									<button type="button" id="btn_adrsChange_pop" class="btn_popup"><span>배송지 변경</span></button>
+									<dl>
+										<div class="company">
+											<dt><span class="sr-only">배송지명</span></dt>
+											<dd id="recipNm" th:text="${orderInfo.recipNm}">
+												<!-- 
+												<span class="icon_tag">
+													<em class="tag_stype1">기본 배송지</em>
+													<em class="tag_stype2">총알배송</em>
+												</span>
+												 -->
+											</dd>
+										</div>
+										<div class="phone">
+											<dt><span class="sr-only">휴대폰 번호</span></dt>
+											<dd id="recipPhnno" th:text="${orderInfo.recipPhnno}"></dd>
+										</div>
+										<div class="addr">
+											<dt><span class="sr-only">배송주소</span></dt>
+											<dd id="recipAddr" th:text="${orderInfo.recipBaseAddr} + '    ' + ${orderInfo.recipDtlAddr}"></dd>
+										</div>
+										<div class="ship_request">
+											<dt>배송요청 사항</dt>
+											<dd id="delvMemo" th:text="${orderInfo.delvMemo}"></dd>
+										</div>
+									</dl>
+								</div>
+								<!-- //배송지 정보 변경불가 -->
+							</div>
+						</li>
+					</ul>
+				</div>
+			</div>
+			<!-- 폴딩리스트 -->
+		</div>
+		<div class="inner">
+			<div class="tbl_wrap pay_wrap">
+				<div class="tbl_tit"> 
+					<h3>결제 정보</h3>
+					<strong class="pay"><span th:text="${#numbers.formatInteger(realOrdSumAmt, 1, 'COMMA')}"></span>원</strong>
+				</div>
+				<div class="tbl type1">
+					<table>
+						<colgroup>
+							<col width="227">
+							<col width="*">
+						</colgroup>   
+						<tr>
+							<td>
+								<dl>
+									<!-- 210330 : 태그 분할 -->
+									<div>
+										<dt>상품금액</dt>
+										<dd>
+											<div><span th:text="${#numbers.formatInteger(goodsSumAmt, 1, 'COMMA')}"></span>원</div>
+										</dd>
+									</div>
+									<div>
+										<dt>배송비</dt>
+										<dd>
+											<div><span th:text="${#numbers.formatInteger(delvFeeSumAmt, 1, 'COMMA')}"></span>원</div>
+										</dd>
+									</div>
+									<!-- //210330 : 태그 분할 -->
+									<div>
+										<dt>상품할인(즉시할인)</dt>
+										<th:block th:if="${cpn1DcSumAmt}>0">
+											<dd><div><span th:text="|- ${#numbers.formatInteger(cpn1DcSumAmt, 1, 'COMMA')}|"></span>원</div></dd>
+										</th:block>
+										<th:block th:if="${cpn1DcSumAmt}<1">
+											<dd><div><span>0</span>원<div></dd>
+										</th:block>
+									</div>
+									<!-- 회원인경우노출 -->
+									<th:block th:if="${isLogin}">
+										<div>
+											<dt>다다익선 할인</dt>
+											<th:block th:if="${tmtbSumAmt}>0">
+												<dd><div><span th:text="|- ${#numbers.formatInteger(tmtbSumAmt, 1, 'COMMA')}|"></span>원</div></dd>
+											</th:block>
+											<th:block th:if="${tmtbSumAmt}<1">
+												<dd><div><span >0</span>원</div></dd>
+											</th:block>
+										</div>
+										<div>
+											<dt>쿠폰할인</dt>
+											<th:block th:if="${cpnDcSumAmt}>0">
+												<dd><div><span th:text="|- ${#numbers.formatInteger(cpnDcSumAmt, 1, 'COMMA')}|"></span>원</div></dd>
+											</th:block>
+											<th:block th:if="${cpnDcSumAmt}<1">
+												<dd><div><em>0</em>원</div></dd>
+											</th:block>
+										</div>
+										<div>
+											<dt>선 포인트 사용</dt>
+											<th:block th:if="${prePntDcSumAmt}>0">
+												<dd><div><em th:text="|- ${#numbers.formatInteger(prePntDcSumAmt, 1, 'COMMA')}|"></em>P</div></dd>
+											</th:block>
+											<th:block th:if="${prePntDcSumAmt}<1">
+												<dd><div><span>0</span>P</div></dd>
+											</th:block>
+										</div>
+										<div>
+											<dt>포인트 사용</dt>
+											<th:block th:if="${pntDcSumAmt}>0">
+												<dd><div><span th:text="|- ${#numbers.formatInteger(pntDcSumAmt, 1, 'COMMA')}|"></span></div>P</dd>
+											</th:block>
+											<th:block th:if="${pntDcSumAmt}<1">
+												<dd><div><span>0</span>P</div></dd>
+											</th:block>
+										</div>
+										<div>
+											<dt>상품권 사용</dt>
+											<th:block th:if="${gfcdUseSumAmt}>0">
+												<dd><div><span th:text="|- ${#numbers.formatInteger(gfcdUseSumAmt, 1, 'COMMA')}|"></span>원</div></dd>
+											</th:block>
+											<th:block th:if="${gfcdUseSumAmt}<1">
+												<dd><div><span>0</span>원</div></dd>
+											</th:block>
+										</div>
+									</th:block>
+									<div>
+										<dt>마일리지 사용</dt>
+										<th:block th:if="${mileageDcAmt}>0">
+											<dd><div><span th:text="|- ${#numbers.formatInteger(mileageDcAmt, 1, 'COMMA')}|"></span>원</div></dd>
+										</th:block>
+										<th:block th:if="${mileageDcAmt}<1">
+											<dd><div><span>0</span>원</div></dd>
+										</th:block>
+									</div>
+									<div>
+										<dt>제휴 할인</dt>
+										<th:block th:if="${allianceDcAmt}>0">
+											<dd><div><span th:text="|- ${#numbers.formatInteger(allianceDcAmt, 1, 'COMMA')}|"></span>원</div></dd>
+										</th:block>
+										<th:block th:if="${allianceDcAmt}<1">
+											<dd><div><span>0</span>원</div></dd>
+										</th:block>
+									</div>
+									<div>
+										<dt>적립예정 포인트</dt>
+										<dd>
+											<div>
+												<span th:text="${#numbers.formatInteger(savePntSumAmt, 1, 'COMMA')}">3000</span>P
+											</div>
+										</dd>
+									</div>
+									<div>
+										<dt>결제방법</dt>
+										<!-- kcp 신용카드 -->
+										<th:block th:if="${orderInfo.payMeans} == 'G014_30'">
+											<!--  체크카드 -->
+											<th:block th:if="${orderInfo.cardType} == 'Y'">
+												<dd><div><span th:text="|체크카드(${orderInfo.cardNm})/${orderInfo.cardMips}|"></span></div></dd>
+											</th:block>
+											<!--  신용카드 -->
+											<th:block th:if="${orderInfo.cardType} == 'N'">
+												<dd><div><span th:text="|체크카드(${orderInfo.cardNm})/${orderInfo.cardMips}|"></span></div></dd>
+											</th:block>
+										</th:block>
+										<th:block th:if="${orderInfo.payMeans} != 'G014_30'">
+											<dd><div><span th:text="${orderInfo.payType}"></span></div></dd>
+										</th:block>
+									</div>
+								</dl>
+							</td>
+						</tr>
+					</table>
+				</div>
+			</div>
+			<div class="btn_group btn_group_flex">
+				<div><button type="button" class="btn btn_gost"><span>주문 상세보기</span></button></div>
+				<div><button type="button" class="btn btn_dark"><span>쇼핑 계속하기</span></button></div>
+			</div>
+		</div>
+	</section>
+</main>
+
+
+<script th:inline="javascript">
+// 배송관련정보 변수선언
+var ordNo			= [[${orderInfo.ordNo}]]		// 배송목록
+var isLogin			= [[${isLogin}]];				// 로그인여부
+var delvAddrSq		= [[${delvAddrSq}]];			// 배송지번호
+
+// 2.1 회원 배송지변경 팝업열기
+$('#btn_adrsChange_pop').on("click", function(){
+	// 회원인경우
+	if (isLogin == true) {
+		$.ajax( {
+			type		: "POST",
+			url 		: '/common/delvAddrChangePop',
+			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) {
+				$("#adrsChangePop .modal-dialog .modal-content").html(result);
+				$("#adrsChangePop").modal("show");
+			}
+		});
+	}
+	// 비회원인경우
+	else {
+		$.ajax( {
+			type		: "POST",
+			url 		: '/common/delvAddrAddPop',
+			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) {
+				$("#adrsAddPop .modal-dialog .modal-content").html(result);
+				$("#adrsAddPop").modal("show");
+			}
+		});	
+	}
+});
+
+// 2.2 배송요청사항 팝업열기
+$("#btn_rqstModify_pop").on("click", function(e){
+	var jsonObj = new Object();
+	jsonObj.delvMemo = $("#delvMemo").text();
+	
+	$.ajax({
+		type		: "POST",
+		url 		: "/common/delvMemoChangePop",
+		data		: JSON.stringify(jsonObj),
+		dataType 	: "html",
+		beforeSend 	: function(xhr, settings) {
+			xhr.setRequestHeader("AJAX"			, "true");
+			xhr.setRequestHeader('Accept'		, 'application/json');
+			xhr.setRequestHeader('Content-Type'	, 'application/json');
+			gagajf.showProgressbar(true);
+		},
+		success 	: function(result) {
+			if (result != null) {
+				$("#rqstModifyPop .modal-dialog .modal-content").html(result);
+				$("#rqstModifyPop").modal("show");
+			}
+		}
+	});
+	
+	return false;
+});
+
+// 1.18 배송지정보 설정
+var delvAddrSet = function(delvObj) {
+	
+	var rtnStr = "";
+	rtnStr += "| recipNm 			::: " + delvObj.recipNm;
+	rtnStr += "| recipPhnno 		::: " + delvObj.recipPhnno;
+	rtnStr += "| recipZipcode 		::: " + delvObj.recipZipcode;
+	rtnStr += "| recipBaseAddr 		::: " + delvObj.recipBaseAddr;
+	rtnStr += "| recipDtlAddr 		::: " + delvObj.recipDtlAddr;
+	rtnStr += "| delvMemo 			::: " + delvObj.delvMemo;
+	
+	$("#recipNm").text(delvObj.recipNm);
+	$("#recipPhnno").text(delvObj.recipPhnno);
+	$("#recipAddr").text(delvObj.recipBaseAddr + '    ' + delvObj.recipDtlAddr);
+	$("#delvMemo").text(delvObj.delvMemo);
+	
+	// 변수값 설정
+	var jsonObj = {
+		"delvAddrSq" 		: delvAddrSq
+		, "recipNm"			: delvObj.recipNm
+		, "recipPhnno"		: delvObj.recipPhnno
+		, "recipZipcode"	: delvObj.recipZipcode
+		, "recipBaseAddr"	: delvObj.recipBaseAddr
+		, "recipDtlAddr"	: delvObj.recipDtlAddr
+		, "delvMemo"		: delvObj.delvMemo
+	}
+	
+	gagajf.ajaxJsonSubmit(
+		"/common/updateDeliverAddr"
+		, JSON.stringify(jsonObj)
+		, function (result) {
+			mcxDialog.alert("수정되었습니다.");
+		}
+	)
+}
+
+// 1.19 배송메모설정
+var delvMemoSet = function(delvMemoObj) {
+	
+	var rtnStr = "";
+	rtnStr += "| delvMemo 			::: " + delvMemoObj.delvMemo;
+
+	// 변수값 설정
+	var jsonObj = {
+		"delvAddrSq" 		: delvAddrSq
+		, "delvMemo"		: delvMemoObj.delvMemo
+	}
+	
+	$("#delvMemo").text(delvMemoObj.delvMemo);
+	
+	gagajf.ajaxJsonSubmit(
+		"/common/updateDeliverAddrDelvMemo"
+		, JSON.stringify(jsonObj)
+		, function (result) {
+			mcxDialog.alert("수정되었습니다.");
+		}
+	)
+}
+
+</script>
+</th:block>
+</body>
+</html>

+ 2 - 0
src/main/webapp/WEB-INF/views/mob/order/OrderCustemerInfoMob.html

@@ -16,6 +16,8 @@
 <input type="hidden" name="custNm" 		th:value="${custemerInfo.custNm}"/>
 <input type="hidden" name="email" 		th:value="${custemerInfo.email}"/>
 <input type="hidden" name="cellPhnno" 	th:value="${custemerInfo.cellPhnno}"/>
+<input type="hidden" name="sexGb" 		th:value="${custemerInfo.sexGb}"/>
+<input type="hidden" name="birthYmd" 	th:value="${custemerInfo.birthYmd}"/>
 	
 <!-- 주문고객 -->
 <div class="foldGroup">

+ 3 - 3
src/main/webapp/WEB-INF/views/mob/order/OrderDcAmtInfoMob.html

@@ -66,7 +66,7 @@
 									</th:block>
 									<div class="form_field">
 										<div class="input_wrap">
-											<input type="text" class="form_control" maxlength="13" placeholder="할인코드를 입력해주세요.">
+											<input type="text" class="form_control" id="serialCpnNm" maxlength="13" placeholder="할인코드를 입력해주세요.">
 											<button type="button" class="btn btn_dark btn_sm" onclick="serialCpnApply()">
 												<span>적용</span>
 											</button>
@@ -178,7 +178,7 @@
 											<!-- 스타일 포인트 3만원 이상 결제시 노출 -->
 											<th:block th:if="${orgGoodsSumAmt} >= 30000">
 												<div class="input_wrap">
-													<input type="text" name="pntDcAmtStr" class="form_control" maxlength="11" placeholder="사용할 포인트를 입력해주세요.">
+													<input type="text" name="pntDcAmtStr" class="form_control" maxlength="11" placeholder="사용할 포인트를 입력해주세요." onkeyup="inputNumberFormat(this);">
 													<button type="button" class="btn btn_dark btn_sm" id="btn_point_apply">
 														<span>적용</span>
 													</button>
@@ -210,7 +210,7 @@
 									<dd>
 										<div class="form_field">
 											<div class="input_wrap">
-												<input type="text" name="gfcdUseAmtStr" class="form_control" maxlength="11" placeholder="사용할 금액을 입력해주세요.">
+												<input type="text" name="gfcdUseAmtStr" class="form_control" maxlength="11" placeholder="사용할 금액을 입력해주세요." onkeyup="inputNumberFormat(this);">
 												<button type="button" class="btn btn_dark btn_sm" id="btn_gfcd_apply">
 													<span>적용</span>
 												</button>

+ 62 - 17
src/main/webapp/WEB-INF/views/mob/order/OrderFormMob.html

@@ -42,6 +42,8 @@
 				<th>recipBaseAddr</th>
 				<th>recipDtlAddr</th>
 				<th>delvMemo</th>
+				<th>sexGb</th>
+				<th>birthYmd</th>
 			</tr>
 			<tr style="height:30px;">
 				<td class="custNm"></td>
@@ -53,6 +55,8 @@
 				<td class="recipBaseAddr"></td>
 				<td class="recipDtlAddr"></td>
 				<td class="delvMemo"></td>
+				<td class="sexGb"></td>
+				<td class="birthYmd"></td>
 			</tr>
 		</tbody>
 	</table>
@@ -290,16 +294,15 @@
 										<dl>
 											<div>
 												<dt>주문금액</dt>
-												<dd><div><span class="orgGoodsSumAmt"></span>원</div></dd>
+												<dd><div><span class="orgGoodsSumAmt" th:text="${#numbers.formatInteger(orgGoodsSumAmt, 1, 'COMMA')}"></span>원</div></dd>
 											</div>
 											<div>
-												<dt>할인금액</dt>
-												<dd><div><span class="dcSumAmt"></span>원</div>
-												</dd>
+												<dt>배송비</dt>
+												<dd><div><span class="delvSumAmt" th:text="${#numbers.formatInteger(sumDelvFee, 1, 'COMMA')}"></span>원</div></dd>
 											</div>
 											<div>
-												<dt>배송비</dt>
-												<dd><div><span class="delvSumAmt"></span>원</div></dd>
+												<dt>할인금액</dt>
+												<dd><div><span class="dcSumAmt disc_amount"></span>원</div></dd>
 											</div>
 										</dl>
 									</td>
@@ -484,6 +487,9 @@ var custemerInfoSet = function() {
 				$("#orderAmtForm .custNm").text($("#orderForm input[name='custNm']").val());
 				$("#orderAmtForm .email").text($("#orderForm input[name='email']").val());
 				$("#orderAmtForm .cellPhnno").text($("#orderForm input[name='cellPhnno']").val());
+				
+				$("#orderAmtForm .sexGb").text($("#orderForm input[name='sexGb']").val());
+				$("#orderAmtForm .birthYmd").text($("#orderForm input[name='birthYmd']").val());
 			}
 			
 			// 1.2 개인통관부호 정보
@@ -958,6 +964,8 @@ var paymentInfoSet = function() {
 						,"recipBaseAddr"		: $("#orderAmtForm .recipBaseAddr").text()
 						,"recipDtlAddr"			: $("#orderAmtForm .recipDtlAddr").text()
 						,"delvMemo"				: $("#orderAmtForm .delvMemo").text()
+						,"sexGb"				: $("#orderAmtForm .sexGb").text()
+						,"birthYmd"				: $("#orderAmtForm .birthYmd").text()
 						,"prePntDcAmtYn"		: prePntDcAmtYn
 						,"orderDetailList"		: orderDetailList
 						,"delvFeeCdList"		: delvFeeCdList
@@ -993,7 +1001,7 @@ var paymentInfoSet = function() {
 							
 							var pgGb = $("#order_info input[name=pgGb]").val();
 							
-							if (pgGb == "NAVFER") {
+							if (pgGb == "NAVER") {
 								fnNaverPaymentReady();
 							} else if (pgGb == "KAKAO") {
 								fnKakaoPaymentReady();
@@ -1148,6 +1156,21 @@ var dcAmtInfoSet = function() {
 								$("#chk-maxdisc").attr("checked", false);
 							}
 						});
+						
+						// 1.8.5 쿠폰 최대할인금액 초기화 버튼 설정
+						$("#chk-maxdisc").on("click", function(){
+							if ($(this).is(":checked")) {
+								// 상품&장바구니쿠폰 초기환
+								custGoodsCpnInit();
+								
+								// 배송비쿠폰 초기환
+								custDelvCpnInit();
+								
+								$("#chk-maxdisc01").attr("checked", true);
+							} else {
+								$("#chk-maxdisc01").attr("checked", false);
+							}
+						});
 					}
 				});
 				
@@ -1181,7 +1204,7 @@ var dcAmtInfoSet = function() {
 				$("#btn_point_apply").on("click", function(){
 					var rmPntAmt 			= parseInt($("#orderForm input[name='rmPntAmt']").val());
 					var freegiftUsePnt 		= parseInt($("#orderAmtForm .freegiftUsePnt").text());
-					var pntDcAmt 			= parseInt($("#orderForm input[name='pntDcAmtStr']").val());
+					var pntDcAmt 			= parseInt(uncomma($("#orderForm input[name='pntDcAmtStr']").val()));
 					var realOrdAmt 			= parseInt($("#orderAmtForm .realOrdSumAmt").text());
 					var applyPntDcAmt 		= (realOrdAmt * 40) / 100;
 					
@@ -1227,7 +1250,7 @@ var dcAmtInfoSet = function() {
 					
 					// 포인트 적용
 					$("#orderAmtForm .pntDcSumAmt").text(pntDcAmt);
-					$("#pntDcAmt").text(getZeroMinusDelAmt(pntDcAmt)+" 원");
+					$("#pntDcAmt").text(getZeroMinusDelAmt(pntDcAmt));
 					
 					// 상품권리렛기능
 					gfcdUseAmtReset();
@@ -1236,7 +1259,7 @@ var dcAmtInfoSet = function() {
 				// 1.8.8 상품권 적용버튼 기능
 				$("#btn_gfcd_apply").on("click", function(){
 					var rmGfcdAmt 		= parseInt($("#orderForm input[name='rmGfcdAmt']").val());
-					var gfcdUseAmt 		= parseInt($("#orderForm input[name='gfcdUseAmtStr']").val());
+					var gfcdUseAmt 		= parseInt(uncomma($("#orderForm input[name='gfcdUseAmtStr']").val()));
 					
 					if (gagajf.isNull($("#orderForm input[name=gfcdUseAmtStr]").val())) {
 						mcxDialog.alert("사용할 금액을 입력해주세요.");
@@ -1271,7 +1294,7 @@ var dcAmtInfoSet = function() {
 					
 					// 상품권 적용
 					$("#orderAmtForm .gfcdUseSumAmt").text(gfcdUseAmt);
-					$("#gfcdUseAmt").text("-"+gfcdUseAmt.addComma()+" 원");
+					$("#gfcdUseAmt").text(getZeroMinusDelAmt(gfcdUseAmt));
 					
 					// 금액전체계산
 					custCpnSumAmtCal();
@@ -1734,7 +1757,7 @@ var prePntDcAmtReset = function() {
 	$("#orderForm input[name='prePntDcAmt']").val(rmPrePntAmt);
 	
 	// 선포인트사용여부 체크 후 적용
-	$("#orderFrom input[name='rdi-beforpoint']").each(function(){
+	$("#orderForm input[name='rdi-beforpoint']").each(function(){
 		// 선포인트 초기 설정 사용함
 		if ($(this).val() == "Y") {
 			$(this).attr("checked", true);
@@ -1746,9 +1769,9 @@ var prePntDcAmtReset = function() {
 			
 			// 선포인트적용
 			if ($(this).val() == "Y") {
-				$("#prePntDcAmt").text("-"+rmPrePntAmt.addComma());
+				$("#prePntDcAmt").text(getZeroMinusDelAmt(rmPrePntAmt)+"원");
 			} else {
-				$("#prePntDcAmt").text("0");
+				$("#prePntDcAmt").text("0");
 			}
 			
 			// 쿠폰할인금액 SUM
@@ -1756,7 +1779,7 @@ var prePntDcAmtReset = function() {
 		});
 	});
 
-	$("#prePntDcAmt").text("-"+rmPrePntAmt.addComma());
+	$("#prePntDcAmt").text(getZeroMinusDelAmt(rmPrePntAmt)+"원");
 	
 	// 포인트기능 리렛
 	pntDcAmtReset();
@@ -1858,6 +1881,8 @@ var custCpnSumAmtCal = function() {
 	var gfcdUseSumAmt 		= parseInt($("#orderAmtForm .gfcdUseSumAmt").text());
 	var realOrdSumAmt		= 0;
 	var savePntSumAmt		= 0;
+	var totDcSumAmt			= 0;
+	
 	
 	$("#orderAmtForm .cartSq").each(function(){
 		var orgCurrPrice 	= parseInt($(this).parent().find(".orgCurrPrice").text());
@@ -1869,8 +1894,8 @@ var custCpnSumAmtCal = function() {
 		var goodsCpnDcAmt	= parseInt($(this).parent().find(".goodsCpnDcAmt").text());
 		var cartCpnDcAmt	= parseInt($(this).parent().find(".cartCpnDcAmt").text());
 		var prePntDcAmt1	= parseInt($(this).parent().find(".prePntDcAmt1").text());
-		var dcSumAmt		= 0;
 		var savePntAmt1		= parseInt($(this).parent().find(".savePntAmt1").text());
+		var dcSumAmt		= 0;
 		
 		// 주문금액 = ((판매가 - 즉시할인가) + 옵션추가금액) * 장바구니수량
 		orgGoodsSumAmt		= orgGoodsSumAmt + (orgCurrPrice + optAddPrice) * goodsQty;
@@ -1894,6 +1919,8 @@ var custCpnSumAmtCal = function() {
 			dcSumAmt		= tmtb1DcAmt + tmtb2DcAmt + goodsCpnDcAmt + cartCpnDcAmt;
 		}
 		
+		totDcSumAmt			= totDcSumAmt + dcSumAmt;
+		
 		// 주문금액설정
 		$(this).parent().find(".ordAmt").text(ordAmt);
 		$(this).parent().find(".dcSumAmt").text(dcSumAmt);
@@ -1919,7 +1946,7 @@ var custCpnSumAmtCal = function() {
 			leftGfcdAmt		= leftGfcdAmt - gfcdUseAmt1;
 		}
 		
-		var realOrdAmt1		= ordAmt - dcSumAmt - (pntDcAmt1 - gfcdUseAmt1);
+		var realOrdAmt1		= ordAmt - dcSumAmt - pntDcAmt1 - gfcdUseAmt1;
 		realOrdSumAmt		= realOrdSumAmt + realOrdAmt1;
 		
 		$(this).parent().find(".pntDcAmt1").text(pntDcAmt1);
@@ -1947,6 +1974,8 @@ var custCpnSumAmtCal = function() {
 	$("#realOrdAmt").text(realOrdSumAmt.addComma()); 					// 총 결제 예정 금액
 	$("#orderForm .realOrdAmt").text(realOrdSumAmt.addComma()); 		// 총 결제 예정 금액
 	$("#orderForm .orgGoodsSumAmt").text(orgGoodsSumAmt.addComma());
+	$("#orderForm #btn_payment").text(realOrdSumAmt.addComma());		// 총 결제 예정 금액
+	$("#orderForm .dcSumAmt").text(totDcSumAmt.addComma());				// 할인금액합계
 	
 	var tempSavePnt			= savePntSumAmt - prePntDcAmt;
 	
@@ -2193,6 +2222,22 @@ var getZeroMinusDelAmt = function(tempAmt) {
 	
 	return rtnAmtStr;
 }
+
+// START ::: 2021.04.09 숫자입려 천단위 찍기
+var inputNumberFormat = function(obj) {
+    obj.value = comma(uncomma(obj.value));
+}
+
+var comma = function(str) {
+    str = String(str);
+    return str.replace(/(\d)(?=(?:\d{3})+(?!\d))/g, '$1,');
+}
+
+var uncomma = function(str) {
+    str = String(str);
+    return str.replace(/[^\d]+/g, '');
+}
+// 2021.04.09 숫자입려 천단위 찍기 ::: END 
 </script>
 
 </th:block>

+ 1 - 1
src/main/webapp/WEB-INF/views/mob/order/OrderFreegiftInfoMob.html

@@ -90,7 +90,7 @@
 										</th:block>
 									</th:block>
 									<div class="gift">
-										<input type="radio" th:name="'rdi-gift'+${i.count}" th:id="${i.count}+'0'" class="chk_img freegiftRdo" value="noSel" usepoint="0" allYn="N"> 
+										<input type="radio" th:name="'rdi-gift'+${i.count}" th:id="${i.count}+'0'" class="chk_img freegiftRdo" value="noSel" usepoint="0" allYn="N" checked> 
 										<label th:for="${i.count}+'0'">
 											<span class="thumb"><img src="/images/pc/thumb/tmp_gift_empty.jpg" width="" alt=""></span>
 											<span class="name">사은품 수령안함</span> <span class="deduct">수령거부</span>

+ 57 - 37
src/main/webapp/WEB-INF/views/mob/order/OrderListInfoMob.html

@@ -117,56 +117,76 @@
 					<dl>
 						<div>
 							<dt>상품금액</dt>
-							<dd><em id="orgGoodsSumAmt"></em>원</dd>
+							<dd><em id="orgGoodsSumAmt" th:text="${#numbers.formatInteger(orgGoodsSumAmt, 1, 'COMMA')}"></em>원</dd>
 						</div>
 						<div>
 							<dt>배송비</dt>
-							<dd><em id="delvSumAmt"></em>원</dd>
+							<dd><em id="delvSumAmt" th:text="${#numbers.formatInteger(sumDelvFee, 1, 'COMMA')}"></em>원</dd>
 						</div>
 						<div>
 							<dt>상품할인(즉시할인)</dt>
-							<dd>
-								<span class="disc_amount"><em id="cpn1DcSumAmt"></em>원</span>
-							</dd>
-						</div>
-						<div>
-							<dt>다다익선할인</dt>
-							<dd>
-								<span class="disc_amount"><em id="tmtbDcSumAmt"></em>원</span>
-							</dd>
-						</div>
-						<div>
-							<dt>쿠폰할인</dt>
-							<dd>
-								<span class="disc_amount"><em id="couponDcSumAmt"></em>원</span>
-							</dd>
-						</div>
-						<div>
-							<dt>선포인트 사용</dt>
-							<dd>
-								<span class="disc_amount"><em id="prePntDcAmt"></em>P</span>
-							</dd>
-						</div>
-						<div>
-							<dt>포인트 사용</dt>
-							<dd>
-								<span class="disc_amount"><em id="pntDcAmt"></em>P</span>
-							</dd>
-						</div>
-						<div>
-							<dt>상품권 사용</dt>
-							<dd>
-								<span class="disc_amount"><em id="gfcdUseAmt"></em>원</span>
-							</dd>
+							<th:block th:if="${cpn1DcSumAmt} > 0">
+								<dd><span class="disc_amount" id="cpn1DcSumAmt" th:text="|-${#numbers.formatInteger(cpn1DcSumAmt, 1, 'COMMA')}원|"></span></dd>
+							</th:block>
+							<th:block th:if="${cpn1DcSumAmt} < 1">
+								<dd><span class="disc_amount" id="cpn1DcSumAmt" th:text="|${#numbers.formatInteger(cpn1DcSumAmt, 1, 'COMMA')}원|"></span></dd>
+							</th:block>
 						</div>
+						
+						<!-- 회원인경우 노출 -->
+						<th:block th:if="${isLogin}">
+							<div>
+								<dt>다다익선할인</dt>
+								<th:block th:if="${tmtbDcSumAmt} > 0">
+									<dd><span class="disc_amount" id="tmtbDcSumAmt" th:text="|-${#numbers.formatInteger(tmtbDcSumAmt, 1, 'COMMA')}원|"></span></dd>
+								</th:block>
+								<th:block th:if="${tmtbDcSumAmt} < 1">
+									<dd><span class="disc_amount" id="tmtbDcSumAmt" th:text="|${#numbers.formatInteger(tmtbDcSumAmt, 1, 'COMMA')}원|"></span></dd>
+								</th:block>
+							</div>
+							<div>
+								<dt>쿠폰할인</dt>
+								<dd>
+									<span class="disc_amount"><em id="couponDcSumAmt"></em>원</span>
+								</dd>
+							</div>
+							<div>
+								<dt>선포인트 사용</dt>
+								<th:block th:if="${prePntDcAmt} > 0">
+									<dd><span class="disc_amount" id="prePntDcAmt" th:text="|-${#numbers.formatInteger(prePntDcAmt, 1, 'COMMA')}원|"></span></dd>
+								</th:block>
+								<th:block th:if="${prePntDcAmt} < 1">
+									<dd><span class="disc_amount" id="prePntDcAmt" th:text="|${#numbers.formatInteger(prePntDcAmt, 1, 'COMMA')}원|"></span></dd>
+								</th:block>
+							</div>
+							<div>
+								<dt>포인트 사용</dt>
+								<dd>
+									<span class="disc_amount"><em id="pntDcAmt"></em>P</span>
+								</dd>
+							</div>
+							<div>
+								<dt>상품권 사용</dt>
+								<dd>
+									<span class="disc_amount"><em id="gfcdUseAmt"></em>원</span>
+								</dd>
+							</div>
+						</th:block>
+						<!-- //회원인경우 노출 -->
 					</dl>
 				</div>
 				<div class="totalprice_box">
 					<dl>
 						<dt>총 결제 예정 금액</dt>
-						<dd data-weight="price" data-font="lato"><span id="savePntSumAmt"></span>원</dd>
+						<dd data-weight="price" data-font="lato"><span id="realOrdAmt"></span>원</dd>
 					</dl>
-					<p class="info_point"><span class="save_point" id="savePntSumAmt">P</span> 적립예정
+					<p class="info_point">
+						<th:blcok th:if="${isLogin}">
+							<span span class="save_point" id="savePntSumAmt" th:text="|${#numbers.formatInteger(savePntSumAmt, 1, 'COMMA')} P|"></span> 적립예정
+						</th:blcok>
+						<th:blcok th:if="!${isLogin}">
+							회원가입 후 구매하면&nbsp;&nbsp;<span span class="save_point" id="savePntSumAmt" th:text="|${#numbers.formatInteger(savePntSumAmt, 1, 'COMMA')} P|"></span> 적립예정
+						</th:blcok>
 					</p>
 					<p class="info_delivery">총 <span id="delvFeeCdCnt" th:text="${delvFeeCdCnt}"></span>건으로 나뉘어 배송 예정</p>
 				</div>

+ 9 - 2
src/main/webapp/WEB-INF/views/mob/order/OrderNoMemberMob.html

@@ -41,6 +41,8 @@
 				
 				<form class="form_wrap form_full" id="orderForm" th:action="@{'/order/form'}" th:method="post">
 					<input type="hidden" name="shotDelvUseYn" th:value="${order.shotDelvUseYn}" />
+					<input type="hidden" name="sexGb" />
+					<input type="hidden" name="birthYmd" />
 					<th:block th:each="cartSq , index : ${order.cartSqArr}">
 						<input type="hidden" name="cartSqArr" th:value="${cartSq}" />
 					</th:block>
@@ -127,7 +129,6 @@ $(document).ready( function() {
 	
 // 주문하기버튼
 $("#btn_order").on("click", function() {
-	/*
 	// TODO 유효성 체크 추가
 	if (gagajf.isNull($("#orderForm input[name=custNm]").val())) {
 		mcxDialog.alert("이름을 입력해주세요.");
@@ -175,7 +176,6 @@ $("#btn_order").on("click", function() {
 		mcxDialog.alert("비회원 개인정보 수집 이용에 동의해주세요.");
 		return false;
 	}
-	*/
 	
 	// 주문서전송
 	$("#orderForm").submit();
@@ -199,6 +199,8 @@ var fnUpdateAuthInfoCallback = function (result) {
 	
 	$('#orderForm input[name=custNm]').val(result.sName);
 	$('#orderForm input[name=cellPhnno]').val(result.sMobileNo);
+	$('#orderForm input[name=sexGb]').val(result.sGender);
+	$('#orderForm input[name=birthYmd]').val(result.sBirthDate);
 }
 
 // 우편번호 DAUM을 이용한 우편번호 팝업 레이어
@@ -212,7 +214,12 @@ var fnOpenDaumAddr = function() {
 			$('#orderForm input[name=recipZipcode]').val(data.zonecode);
 			$('#orderForm input[name=recipBaseAddr]').val(cfnGetDaumRoadAddr(data));
 			$('#orderForm input[name=recipDtlAddr]').focus();
+			
 			cfnCloseDaumAddr();
+			
+			// 2021.04.12 이태영 지원 닫기버튼 기능
+			$(".jquery-modal.blocker.current").hide();
+			$("body").css("overflow", "");
 		},
 		width: '100%'
 	});

+ 32 - 0
src/main/webapp/WEB-INF/views/mob/pg/KakaoPaymentRequestMob.html

@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<html lang="ko" xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : KakaoPaymentRequestMob.html
+ * @desc    : 카카오페이 결제 요청 결과 화면
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2021 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.04.12   card007     최초 작성
+ *******************************************************************************
+ -->
+<head th:replace="~{mob/common/fragments/HeadMob :: head}"></head>
+<th:block th:replace="~{mob/common/fragments/VariablesMob :: variables}"></th:block>
+<th:block th:replace="~{mob/common/fragments/ScriptsMob :: scripts}"></th:block>
+<body>
+
+<script th:inline="javascript">
+	let pgToken = [[${pgToken}]];
+
+	$(document).ready(function() {
+		let result = opener.fnKakaoPaymentRequest(pgToken);
+		if (result) {
+			self.close();
+		}
+	});
+</script>
+</body>
+</html>

+ 32 - 0
src/main/webapp/WEB-INF/views/mob/pg/NaverPaymentRequestMob.html

@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<html lang="ko" xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : NaverPaymentRequestWeb.html
+ * @desc    : 네이버페이 결제 요청 결과 화면
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2021 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.04.12   card007     최초 작성
+ *******************************************************************************
+ -->
+<head th:replace="~{mob/common/fragments/HeadMob :: head}"></head>
+<th:block th:replace="~{mob/common/fragments/VariablesMob :: variables}"></th:block>
+<th:block th:replace="~{mob/common/fragments/ScriptsMob :: scripts}"></th:block>
+<body>
+
+<script th:inline="javascript">
+	let paymentId = [[${paymentId}]];
+
+	$(document).ready(function() {
+		let result = opener.fnNaverPaymentRequest(paymentId);
+		if (result) {
+			self.close();
+		}
+	});
+</script>
+</body>
+</html>

+ 5 - 0
src/main/webapp/WEB-INF/views/mob/popup/DelvAddrAddPopMob.html

@@ -268,6 +268,11 @@ var fnOpenDaumAddr = function() {
 	});
 	cfnOpenDaumAddr(daumZip);
 }
+
+//2021.04.09 하이픈처리
+$(document).on("keyup", "#deliveryAddForm input[name=recipPhnno]", function() { 
+	$(this).val( $(this).val().replace(/[^0-9]/g, "").replace(/(^02|^0505|^1[0-9]{3}|^0[0-9]{2})([0-9]+)?([0-9]{4})$/,"$1-$2-$3").replace("--", "-") ); 
+});
 </script>
 
 

+ 5 - 0
src/main/webapp/WEB-INF/views/mob/popup/DelvAddrModifyPopMob.html

@@ -292,4 +292,9 @@ var fnOpenDaumAddr = function() {
 	
 	cfnOpenDaumAddr(daumZip);
 }
+
+//2021.04.09 하이픈처리
+$(document).on("keyup", "#deliveryModifyForm input[name=recipPhnno]", function() { 
+	$(this).val( $(this).val().replace(/[^0-9]/g, "").replace(/(^02|^0505|^1[0-9]{3}|^0[0-9]{2})([0-9]+)?([0-9]{4})$/,"$1-$2-$3").replace("--", "-") ); 
+});
 </script>

+ 135 - 0
src/main/webapp/WEB-INF/views/mob/social/SocialMainFormMob.html

@@ -0,0 +1,135 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org"
+	xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
+	layout:decorator="mob/common/layout/DefaultLayoutMob">
+<!--
+ *******************************************************************************
+ * @source  : SocialMainFormMob.html
+ * @desc    : 핫딜(소셜) Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.04.12   sowon     최초 작성
+ *******************************************************************************
+ -->
+<body>
+<th:block layout:fragment="content">
+<main role="" id="" class="container dp">
+			<section class="content dp_hotdeal">
+				<div class="inner wide">
+                    <div class="hotdeal">
+                        <div id="countdown">
+                            <span>남은시간 </span>
+                            <span id="h-hours"></span>
+                            <span id="h-minutes"></span>
+                            <span id="h-seconds"></span>
+                        </div>
+                    </div>
+                </div>
+                <div class="inner">
+                    <div class="list_content">
+						<div class="itemsGrp rowtype"><!-- itemsGrp rank hot deal --> <!-- rowtype 추가시 가로형태로 출력 -->
+						<th:block th:each="SocialData, SocialStat : ${socialGoods}">
+							<div class="item_prod" th:class="${SocialData.stockQtySum == 0 ? 'item_prod sold_out' : 'item_prod'}">
+								<div class="item_state">
+									<button type="button" th:class="${SocialData.likeIt == 'likeit'}? 'itemLike likeit' : 'itemLike'" onclick="cfnPutWishList(this);" th:attr="goodsCd=${SocialData.goodsCd}, ithrCd='', contentsLoc='', planDtlSq=''">관심상품 추가</button>
+									 <a href="javascript:void(0);" class="itemLink" th:onclick="cfnGoToGoodsDetail([[${SocialData.goodsCd}]])" >
+										<div class="shape ranker"><span>특가</span></div>
+										<div class="itemPic">
+											<img class="vLHTC pd_img" th:src="${@environment.getProperty('upload.goods.view') + '/' + SocialData.sysImgNm}">
+										</div>
+										<p class="itemBrand" th:text="${SocialData.brandGroupNm}"></p>
+										<div class="itemName" th:text="${SocialData.goodsNm}"></div>
+										<p class="itemPrice">
+											<span class="itemPrice_original" th:text="${#numbers.formatInteger(SocialData.listPrice,0,'COMMA')}"></span>
+											 [[${#numbers.formatInteger(SocialData.currPrice,0,'COMMA')} + 원]]
+											<span class="itemPercent"  th:text="${#numbers.formatDecimal(SocialData.dcRate,1,0)} + '%'"></span>
+										</p>
+										<div class="itemcolorchip">
+											<span class="chip_color35" value="ABM">BEIGE</span>
+											<span class="chip_color54" value="BDS">BLACK</span>
+											<span class="chip_color40" value="YBR">WHITE</span>
+										</div>
+										<p class="itemBadge">
+											<span class="badge13">베스트 </span>
+										</p>
+										<div class="itemComment" th:if="${SocialData.goodsTnm!=null}" th:text="${SocialData.goodsTnm}"></div>
+										<div class="itemEt">
+											<div class="shopBag">
+												<button class="btn btn_default" onclick="socialAddCart(this)" th:attr="goodsCd=${SocialData.goodsCd}, minOrdQty=${SocialData.minOrdQty}, goodsType=${SocialData.goodsType}, optCd=${SocialData.optCd}"><span>쇼핑백담기</span></button>
+											</div>
+									    </div>
+									</a>
+								</div>
+							</div>
+							</th:block>
+						</div>
+                    </div>
+				</div>
+			</section>
+		</main>
+
+<script th:inline="javascript">
+var socialInfo = [[${socialInfo}]];
+var socialAddCart = function (obj) {
+	let btnType = "C";
+	let params = [];
+
+	let cart = new Object();
+    cart.goodsCd = $(obj).attr("goodsCd");
+	cart.optCd = $(obj).attr("optCd");
+	cart.goodsQty = $(obj).attr("minOrdQty");
+	cart.goodsType = $(obj).attr("goodsType");
+	cart.cartGb = btnType;
+	cart.afLinkCd = $(obj).attr("afLinkCd");
+	cart.ithrCd = "";
+	cart.contentsLoc =  "";
+	cart.planDtlSq = "";
+	params.push(cart); 
+	
+	// 장바구니담기
+	if (params.length > 0){
+		cfnAddCart(params);	
+	} 
+}
+
+
+$(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>

+ 41 - 85
src/main/webapp/WEB-INF/views/web/cart/CartListAjaxFormWeb.html

@@ -82,6 +82,7 @@
 								<!-- 주문상품 -->
 								<th:block th:each="cart, status : ${order.shotCartList}">
 									<div class="cartInfo goods_info shotCartInfo">
+										<input type="hidden" name="supplyCompNm" value="WMS" />
 										<input type="hidden" name="applyQtySectionYn" th:value="${cart.applyQtySectionYn}" />
 										<input type="hidden" name="applyAmtSectionYn" th:value="${cart.applyAmtSectionYn}" />
 										<input type="hidden" name="qtyTmtbSq" th:value="${cart.qtyTmtbSq}" />
@@ -197,6 +198,7 @@
 								<!-- 주문상품 -->
 								<th:block th:each="cart, status : ${order.wmsCartList}">
 									<div class="cartInfo goods_info wmsCartInfo">
+										<input type="hidden" name="supplyCompNm" value="WMS" />
 										<input type="hidden" name="applyQtySectionYn" th:value="${cart.applyQtySectionYn}" />
 										<input type="hidden" name="applyAmtSectionYn" th:value="${cart.applyAmtSectionYn}" />
 										<input type="hidden" name="qtyTmtbSq" th:value="${cart.qtyTmtbSq}" />
@@ -299,10 +301,10 @@
 					</div>
 
 					<!-- 자사 배송비 -->
-					<div class="goods_foot" style="margin-top:40px;">
+					<div class="goods_foot" style="margin-top:40px;" th:style="${'Y'.equals(order.delvYn) ? 'display:block' : 'display:none'}">
 						<div class="order_delivery selfGoodsDelv" th:classappend="|delv_${order.cartDelvFeeCd}|">
-							<span class="dlvr_fee" th:if="${order.wmsDelvFee == 0}">배송비 무료</span>
-							<span class="dlvr_fee" th:if="${order.wmsDelvFee > 0}">배송비&nbsp;<em th:text="${#numbers.formatInteger(order.wmsDelvFee, 1, 'COMMA')}"></em>원</span>
+							<span class="dlvr_fee delvFeeArea" th:if="${order.wmsDelvFee == 0}">배송비 무료</span>
+							<span class="dlvr_fee delvFeeArea" th:if="${order.wmsDelvFee > 0}">배송비&nbsp;<em th:text="${#numbers.formatInteger(order.wmsDelvFee, 1, 'COMMA')}"></em>원</span>
 							<a href="#" class="btn_popup_save" th:if="${order.wmsDelvFee > 0}">배송비 SAVE 상품 보기</a>
 						</div>
 					</div>
@@ -317,6 +319,7 @@
 								<div class="goods_cont">
 									<!-- 주문상품 -->
 									<div class="cartInfo goods_info delvCartInfo">
+										<input type="hidden" name="supplyCompNm" th:value="${cart.supplyCompNm}" />
 										<input type="hidden" name="applyQtySectionYn" th:value="${cart.applyQtySectionYn}" />
 										<input type="hidden" name="applyAmtSectionYn" th:value="${cart.applyAmtSectionYn}" />
 										<input type="hidden" name="qtyTmtbSq" th:value="${cart.qtyTmtbSq}" />
@@ -414,11 +417,11 @@
 								</div>
 
 								<!-- 입점업체 배송비 -->
-								<div class="goods_foot" th:if="${'Y'.equals(cart.addDelvFeeYn)}">
+								<div class="goods_foot" th:if="${'Y'.equals(cart.addDelvFeeYn)}" th:style="${'Y'.equals(cart.delvYn) ? 'display:block' : 'display:none'}">
 								<!-- <div class="goods_foot" th:if="${cart.compCnt == status.index + 1}"> -->
 									<div class="order_delivery" th:classappend="|delv_${cart.delvFeeCd}|">
-										<span class="dlvr_fee" th:if="${cart.delvFee == 0}">배송비 무료</span>
-										<span class="dlvr_fee" th:if="${cart.delvFee > 0}">배송비&nbsp;<em th:text="${#numbers.formatInteger(cart.delvFee, 1, 'COMMA')}"></em>원</span>
+										<span class="dlvr_fee delvFeeArea" th:if="${cart.delvFee == 0}">배송비 무료</span>
+										<span class="dlvr_fee delvFeeArea" th:if="${cart.delvFee > 0}">배송비&nbsp;<em th:text="${#numbers.formatInteger(cart.delvFee, 1, 'COMMA')}"></em>원</span>
 										<span class="dlvr_shop"><em th:text="${cart.supplyCompNm}"></em>&nbsp;업체직배송</span>
 										<a href="#" class="btn_popup_save" th:if="${cart.delvFee > 0}">배송비 SAVE 상품 보기</a>
 									</div>
@@ -782,74 +785,6 @@
 			return false;
 		});
 
-		/*function deleteCartAjax(cartArr) {
-			if(cartArr.length < 1) {
-				mcxDialog.alert("삭제하실 상품을 선택해 주세요.");
-				return false;
-			}
-
-			let data = {
-				cartSqArr : cartArr
-			}
-
-			let jsonData = JSON.stringify(data);
-
-			$.ajax( {
-				type: "POST",
-				url : '/cart/deleteCart',
-				contentType: 'application/json',
-				dataType : 'json',
-				data : jsonData,
-				success : function(result) {
-					mcxDialog.alert("삭제 되었습니다.");
-					let data = {shotDelvUseYn : $("input[name=shotDelvUseYn]:checked").val()};
-					getCartList(data);
-				}
-			});
-		}*/
-
-		/*function deleteCart(gbn) {
-			let cartArr = [];
-			let confirmMessage = "";
-			if(gbn == "WMS_SELECT") {
-				$("#cartListForm .wmsList input[name=cartSqArr]:checked").each(function () {
-					cartArr.push($(this).val());
-				});
-
-				confirmMessage = "총 " + cartArr.length + "개의 상품을 삭제합니다.";
-			} else if(gbn == "DELV_SELECT") {
-				$("#cartListForm .delvList input[name=cartSqArr]:checked").each(function () {
-					cartArr.push($(this).val());
-				});
-
-				confirmMessage = "총 " + cartArr.length + "개의 상품을 삭제합니다.";
-			} else if(gbn == "WMS_ALL") {
-				$("#cartListForm .wmsList input[name=cartSqArr]").each(function() {
-					cartArr.push($(this).val());
-				});
-
-				confirmMessage = "총알배송상품을 전부 삭제하시겠습니까?";
-			} else if(gbn == "DELV_ALL") {
-				$("#cartListForm .delvList input[name=cartSqArr]").each(function() {
-					cartArr.push($(this).val());
-				});
-
-				confirmMessage = "업체직배송 상품을 전부 삭제하시겠습니까?";
-			} else {
-				cartArr.push(gbn);
-				deleteCartAjax(cartArr);
-				return false;
-			}
-
-			mcxDialog.confirm(confirmMessage, {
-				cancelBtnText: "취소/닫기",			//취소 또는 닫기 버튼명
-				sureBtnText  : "확인",				//처리문 버튼명
-				sureBtnClick : function () {
-					deleteCartAjax(cartArr);
-				}
-			});
-		}*/
-
 		$("input[name=cartSqArr]").on("change", function(e) {
 			changeCartSqArr();
 		});
@@ -888,6 +823,19 @@
 			$("#cartListForm .applyTmtb").hide();
 			$("#cartListForm .notApplyTmtb").hide();
 
+			// 배송비 정보 0원으로 모두 변경 (체크 되지 않은 업체는 0원처리)
+			$("#cartListForm .goods_foot .delvFeeArea").text("배송비 0원");
+
+			/*$("#cartListForm .goods_foot").each(function() {
+				alert($(this).parent().find("input[name=supplyCompNm]").val());
+				let compNm = $(this).parent().find("input[name=supplyCompNm]").val();
+				let html = "<span class='dlvr_fee delvFeeArea'>배송비 <em>0</em>원</span>";
+				if(compNm != "WMS") {
+					html += "<span class='dlvr_shop'><em>" + compNm + "</em> 업체직배송</span>";
+				};
+				$(this).find(".order_delivery").html(html);
+			});*/
+
 			// 장바구니 각 상품 가격 정보 할인 전으로 변경
 			$("#cartListForm .cartInfo input[name=cartSq]").each(function() {
 				if($(this).parent().find(".calc_box .price_org").text() != "") {
@@ -896,7 +844,7 @@
 				}
 			});
 
-			$("#cartListForm").find(".delvFeeArea").html("<div class='info_dlvr'><span class='dlvr_fee'>배송비 무료</span></div>");
+			// $("#cartListForm").find(".delvFeeArea").html("<div class='info_dlvr'><span class='dlvr_fee'>배송비 무료</span></div>");
 			for(let i = 0 ; i < shotList.length ; i++) {
 				cartList.push(shotList[i]);
 				$("#cartListForm .shotCartInfo input[name=cartSq]").each(function() {
@@ -929,6 +877,16 @@
 				});
 			}
 
+			// 자사 상품 배송비
+			if(order.delvYn == "N" || order.delvYn == null) {
+
+			} else if(order.wmsDelvFee == 0) {
+				$(".selfGoodsDelv").html("<span class='dlvr_fee'>배송비 무료</span>");
+			} else {
+				let html = "<span class='dlvr_fee'>배송비 <em>" + Number(order.wmsDelvFee).toLocaleString() + "</em> 원</span><a href='#' class='btn_popup_save'>배송비 SAVE 상품 보기</a>";
+				$(".selfGoodsDelv").html(html);
+			}
+
 			for(let i = 0 ; i < wmsList.length ; i++) {
 				cartList.push(wmsList[i]);
 				$("#cartListForm .wmsCartInfo input[name=cartSq]").each(function() {
@@ -961,14 +919,6 @@
 				});
 			}
 
-			// 자사 상품 배송비
-			if(order.wmsDelvFee == 0) {
-				$(".selfGoodsDelv").html("<span class='dlvr_fee'>배송비 무료</span>");
-			} else {
-				let html = "<span class='dlvr_fee'>배송비 <em>" + Number(order.wmsDelvFee).toLocaleString() + "</em> 원</span><a href='#' class='btn_popup_save'>배송비 SAVE 상품 보기</a>";
-				$(".selfGoodsDelv").html(html);
-			}
-
 			for(let i = 0 ; i < delvList.length ; i++) {
 				cartList.push(delvList[i]);
 				$("#cartListForm .delvList .delvCartInfo input[name=cartSq]").each(function() {
@@ -997,10 +947,11 @@
 							$(this).parent().find("input[name=tmtbDcAmt]").val(delv.tmtbDcAmt);
 						}
 
+						// 입점업체 배송비 목록
 						if(delv.delvFee == 0) {
-							$(".delvList").find(".delv_" + delv.delvFeeCd).html("<span class='dlvr_fee'>배송비 무료</span><span class='dlvr_fee'><em>" + delv.supplyCompNm + "</em> 업체직배송</span>");
+							$(".delvList").find(".delv_" + delv.delvFeeCd).html("<span class='dlvr_fee delvFeeArea'>배송비 무료</span><span class='dlvr_fee'><em>" + delv.supplyCompNm + "</em> 업체직배송</span>");
 						} else {
-							let html = "<div className='order_delivery'><span class='dlvr_fee'>배송비 <em>" + Number(delv.delvFee).toLocaleString() + "</em>원</span><span class='dlvr_shop'><em>" + delv.supplyCompNm + "</em> 업체직배송</span><a href='#' className='btn_popup_save'>배송비 SAVE 상품 보기</a></div>";
+							let html = "<div className='order_delivery'><span class='dlvr_fee delvFeeArea'>배송비 <em>" + Number(delv.delvFee).toLocaleString() + "</em>원</span><span class='dlvr_shop'><em>" + delv.supplyCompNm + "</em> 업체직배송</span><a href='#' className='btn_popup_save'>배송비 SAVE 상품 보기</a></div>";
 							$(".delvList").find(".delv_" + delv.delvFeeCd).html(html);
 						}
 					}
@@ -1039,6 +990,7 @@
 			});
 		}
 
+		// 주문 정보 체크
 		function fnOrderValidation(list, listIndex, cartSqArr, allYn) {
 			// listIndex가 -1이면 (마지막이 지난후)
 			if(listIndex ==  - 1) {
@@ -1099,6 +1051,7 @@
 			}
 		}
 
+		// 최소, 최대 구매 수량에서 벗어난 상품의 수량 변경 확인
 		function fnUpdateConfirmChangeQty(message, cartSq, goodsQty, list, listIndex, cartSqArr, allYn) {
 			mcxDialog.confirmC(message, { //내용
 				btn     : ["취소", "확인"],
@@ -1113,6 +1066,7 @@
 			});
 		}
 
+		// 품절 및 구매불가 상품 구매 목록에서 제거 확인
 		function fnRemoveCartSqConfirm(message, cartSqArr, cartSq, list, listIndex, allYn) {
 			mcxDialog.confirmC(message, { //내용
 				btn     : ["취소", "확인"],
@@ -1127,6 +1081,7 @@
 			});
 		}
 
+		// 품절, 구매 최소수량, 최대수량, 1일 제한 수량 넘는 상품은 구매내역에서 제외
 		function fnCheckOffCartSqArr(cartSqArr, cartSq) {
 			// 체크박스 해제
 			$("#cartListForm input[name=cartSqArr]").each(function () {
@@ -1188,6 +1143,7 @@
 			}
 		}
 
+		// 주문 정보 validation 체크
 		function fnOrderCheck(cartSq, custNo, allYn) {
 			// 선택된 장바구니 정보 가공
 			let data = {	  cartSqArr : cartSq

+ 19 - 7
src/main/webapp/WEB-INF/views/web/common/fragments/BrandGnbWeb.html

@@ -109,15 +109,24 @@
 		return tag;
 	}
 	
+	// 브랜드 카테고리 생성
+	let fnCreateBrandCategory = function() {
+		$.getJSON('/display/brand/cate/list?brandGroupNo=' + [[${brandGroupInfo.brandGroupNo}]]
+			, function(result, status) {
+				if (status == 'success') {
+					if (result.length > 0) {
+						$('#ulGnbCate').html('');
+						$.each(result, function(idx, item) {
+							let gnbCate = fnGetGnbCategory(item);
+							$('#ulGnbCate').append(gnbCate);
+						});
+					}
+				}
+			});
+	}
+	
 	// GNB탭 생성
 	let fnCreateGnbTab = function() {
-		$('#ulGnbCate').html('');
-		let allCate = [[${allCateList}]];
-		$.each(allCate, function(allCateIdx, allCateItem) {
-			let gnbCate = fnGetGnbCategory(allCateItem);
-			$('#ulGnbCate').append(gnbCate);
-		});
-		
 		$.getJSON('/display/brand/gnb/tab/list?brandGroupNo=' + [[${brandGroupInfo.brandGroupNo}]]
 			, function(result, status) {
 				if (status == 'success') {
@@ -164,6 +173,9 @@
 			$(this).siblings('li').find('> ul').hide();
 		});
 		
+		// 브랜드 카테고리 생성
+		fnCreateBrandCategory();
+		
 		// GNB탭 생성
 		fnCreateGnbTab();
 	});

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

@@ -446,7 +446,7 @@
 					<h3><a href="javascript:void(0);" onclick="cfnGoToPage(_PAGE_MYPAGE_WISHLIST);">위시리스트</a></h3>
 				</div>
 				<div class="quick_body" id="quickMenuWishList"> <!-- 최근 본 상품 없을 시 nodata 클래스 추가 --> <!-- 비로그인 시 need_login 클래스 추가 -->
-					<div class="product_count"><span class='c_primary' id="quickMenuWishListCount">50</span>개의 상품</div>
+<!-- 					<div class="product_count"><span class='c_primary' id="quickMenuWishListCount">50</span>개의 상품</div>
 					<div class="itemsGrp">
 						<div class="item_prod">
 							<div class="item_state">
@@ -484,7 +484,7 @@
 							<p>로그인 후 이용 가능한 서비스입니다.</p>
 							<button type="button" class="btn btn_sm"><span>로그인</span></button>
 						</div>
-					</div>
+					</div> -->
 				</div>
 			</div>
 			<div class="coupon quick_con quick04"> <!-- 퀵메뉴_나의 쿠폰 -->
@@ -1082,7 +1082,7 @@
 							}
 							quickShoppingBagHtml += "			<a href='javascript:fnGoToGoodsDetail(\"" + info.goodsCd + "\")' class='itemLink'>";
 							quickShoppingBagHtml += '				<div class="itemPic">';
-							quickShoppingBagHtml += '					<img alt="BLACK-a" class="vLHTC pd_img" src="' + order.imgPath1 + '/' + info.sysImgNm + '?RS=120"/>';
+							quickShoppingBagHtml += '					<img alt="BLACK-a" class="vLHTC pd_img" src="' + _uploadGoodsUrl + '/' + info.sysImgNm + '?RS=120"/>';
 							quickShoppingBagHtml += '				</div>';
 							quickShoppingBagHtml += '				<p class="itemBrand">' + info.brandEnm + ' ' + info.brandKnm + '</p>';
 							quickShoppingBagHtml += '				<div class="itemName">' + info.goodsNm + '</div>';
@@ -1201,7 +1201,7 @@
 								tag += '			</a>';	
 								tag += '			<div class="hover_con">';
 								if (item.stockQty>0) {
-									tag += '				<button type="button" class="btn btn_sm cart_btn on"><span>쇼핑백 담기</span></button>';
+									tag += '				<button type="button" class="btn btn_sm cart_btn on" afLinkCd="'+item.afLinkCd+'" goodsCd="'+item.goodsCd+'" optCd="'+item.optCd+'" minOrdQty="'+item.minOrdQty+'" goodsType="'+item.goodsType+'" contentsLoc="'+item.contentLoc+'" onclick="wishCardAdd(this)"><span>쇼핑백 담기</span></button>';
 								}
 								tag += '			</div>';	    
 								tag += '		</div>';	    
@@ -1228,6 +1228,29 @@
 		fnGetWishList();
 	}
 	
+	var wishCardAdd = function (obj) {
+		let btnType = "C";
+		let params = [];
+		
+		let cart = new Object();
+	    cart.goodsCd = $(obj).attr("goodsCd");
+		cart.optCd = $(obj).attr("optCd");
+		cart.goodsQty = $(obj).attr("minOrdQty");
+		cart.goodsType = $(obj).attr("goodsType");
+		cart.cartGb = btnType;
+		cart.afLinkCd = $(obj).attr("afLinkCd");
+		cart.ithrCd = $(obj).attr("ithrCd");
+		//cart.contentsLoc = $(obj).attr("contentsLoc");
+		cart.contentsLoc = '';
+		cart.planDtlSq = '';
+		params.push(cart); 
+		
+		// 장바구니담기
+		if (params.length > 0){
+			cfnAddCart(params);	
+		}
+	}
+	
 	// 팝업
 	let fnGetPopup = function(){
 		let data = {viewPage : [[${viewPage}]]

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

@@ -19,37 +19,37 @@
 	<!-- head start -->
 	<div class="common_header">
 		<!-- 프로모션 띠 배너 등록 시 노출 -->
-<!-- 		<div class="hd_top_banner"> -->
-<!-- 			<div class="bnrtype_open" style="background-color:#496ac9;"> -->
-<!-- 				<a href="" target=""> -->
-<!-- 					<img src="/images/pc/thumb/tmp_top_banner2.jpg" alt="">	 -->
-<!-- 					<div class="open_bnr_area"> -->
-<!-- 						<img src="/images/pc/thumb/tmp_top_banner2_open.jpg" alt=""/> -->
-<!-- 					</div> -->
-<!-- 				</a> -->
-<!-- 				<button class="btn_toggle_bnr"><span>열기</span></button> -->
-<!-- 			</div> -->
-<!-- 			<div class="bnrtype_img" style="background-color:#57799d;"> -->
-<!-- 				<a href="" target=""> -->
-<!-- 					<img src="/images/pc/thumb/tmp_top_banner1.jpg" alt=""/> -->
-<!-- 				</a> -->
-<!-- 			</div> -->
-<!-- 			<div class="bnrtype_text" style="background-color:#fd4801;"> -->
-<!-- 				<a href="" target=""> -->
-<!-- 					<div style="color:#fff; font-size:20px; font-weight:300;"> -->
-<!-- 						<span style="font-weight:500">APP</span> 수신동의 하면 <span style="font-weight:500">1</span>만 포인트 증정! -->
-<!-- 					</div> -->
-<!-- 				</a> -->
-<!-- 			</div> -->
-<!-- 			<div class="close_bnr_area"> -->
-<!-- 				<form class="form_wrap"> -->
-<!-- 					<div class="form_field"> -->
-<!-- 						<input id="chk-cookie" type="checkbox"><label for="chk-cookie"><span>오늘 하루 보지 않기</span></label> -->
-<!-- 					</div> -->
-<!-- 				</form> -->
-<!-- 				<button id="btn_close_bnr" class="btn_close"><span>닫기</span></button> -->
-<!-- 			</div> -->
-<!-- 		</div> -->
+ 		<div class="hd_top_banner" id="divTopbanner">
+<!-- 			<div class="bnrtype_open" style="background-color:#496ac9;">-->
+<!-- 				<a href="" target="">-->
+<!-- 					<img src="/images/pc/thumb/tmp_top_banner2.jpg" alt="">-->
+<!-- 					<div class="open_bnr_area">-->
+<!-- 						<img src="/images/pc/thumb/tmp_top_banner2_open.jpg" alt=""/>-->
+<!-- 					</div>-->
+<!-- 				</a>-->
+<!-- 				<button class="btn_toggle_bnr"><span>열기</span></button>-->
+<!-- 			</div>-->
+<!-- 			<div class="bnrtype_img" style="background-color:#57799d;">-->
+<!-- 				<a href="" target="">-->
+<!-- 					<img src="/images/pc/thumb/tmp_top_banner1.jpg" alt=""/>-->
+<!-- 				</a>-->
+<!-- 			</div>-->
+<!-- 			<div class="bnrtype_text" style="background-color:#fd4801;">-->
+<!-- 				<a href="" target="">-->
+<!-- 					<div style="color:#fff; font-size:20px; font-weight:300;">-->
+<!-- 						<span style="font-weight:500">APP</span> 수신동의 하면 <span style="font-weight:500">1</span>만 포인트 증정!-->
+<!-- 					</div>-->
+<!-- 				</a>-->
+<!-- 			</div>-->
+<!-- 			<div class="close_bnr_area">-->
+<!-- 				<form class="form_wrap">-->
+<!-- 					<div class="form_field">-->
+<!-- 						<input id="chk-cookie" type="checkbox"><label for="chk-cookie"><span>오늘 하루 보지 않기</span></label>-->
+<!-- 					</div>-->
+<!-- 				</form>-->
+<!-- 				<button id="btn_close_bnr" class="btn_close"><span>닫기</span></button>-->
+<!-- 			</div>-->
+ 		</div>
 		<!-- //프로모션 띠 배너 등록 시 노출 -->
 
 		<div class="area">
@@ -716,6 +716,59 @@
 		//검색창 호출
 		$(".common_search").addClass('active');
 	});
+
+
+	// 띠배너 조회
+	let fnCreateTopBanner = function (){
+		$.getJSON('/display/gnb/topbanner/list', function (result, status){
+			if(status=='success'){
+				if(result.length>0){
+					var bannerImgUrl = [[${@environment.getProperty('domain.image')}]];
+					$.each(result, function (idx, item) {
+						$('#divTopbanner').html('');
+						let tag = '';
+						if(item.contentsType == 'OPEN'){
+							tag +='<div class="bnrtype_open" style="background-color:#'+item.strVar5+';">';
+							tag +=' 	<a href="'+item.strVar1+'" target="">';
+							tag +=' 		<img src="'+bannerImgUrl+''+item.imgPath1+'" alt="">';
+							tag +=' 		<div class="open_bnr_area">';
+							tag +=' 			<img src="'+bannerImgUrl+''+item.imgPath2+'" alt=""/>';
+							tag +=' 		</div>';
+							tag +=' 	</a>';
+							tag +=' 	<button class="btn_toggle_bnr"><span>열기</span></button>';
+							tag +='</div>';
+							if(item.strVar8=='Y'){
+								tag+='<div class="close_bnr_area">';
+								tag+=' 	<form class="form_wrap">';
+								tag+=' 		<div class="form_field">';
+								tag+=' 			<input id="chk-cookie" type="checkbox"><label for="chk-cookie"><span>오늘 하루 보지 않기</span></label>';
+								tag+=' 		</div>';
+								tag+=' 	</form>';
+								tag+=' 	<button id="btn_close_bnr" class="btn_close"><span>닫기</span></button>';
+								tag+='</div>';
+							}
+						}else if(item.contentsType == 'IMG'){
+							tag+='<div class="bnrtype_img" style="background-color:#'+item.strVar5+';">';
+							tag+=' 	<a href="'+item.strVar1+'" target="">';
+							tag+=' 		<img src="'+bannerImgUrl+''+item.imgPath1+'" alt=""/>';
+							tag+=' 	</a>';
+							tag+='</div>';
+						}else{
+							tag+='<div class="bnrtype_text" style="background-color:#'+item.strVar5+';">';
+							tag+=' 	<a href="'+item.strVar1+'" target="">';
+							tag+=' 		<div style="color:#'+item.strVar6+'; font-size:20px; font-weight:300;">';
+							tag+=' 			<span style="font-weight:500">'+item.strTitle1+'</span>';
+							tag+=' 		</div>';
+							tag+=' 	</a>';
+							tag+='</div>';
+						}
+
+						$('#divTopbanner').html(tag);
+					});
+				}
+			}
+		});
+	}
 	
 	$(document).ready(function() {
 		//TOP BANNER close
@@ -810,6 +863,9 @@
 		
 		// GNB탭 > 브랜드 생성
 		fnCreateGnbBrandGroup();
+
+		// 띠배너 조회
+		fnCreateTopBanner();
 	});
 /*]]>*/
 </script>

+ 11 - 0
src/main/webapp/WEB-INF/views/web/customer/IdFindFormWeb.html

@@ -277,6 +277,7 @@
 
 		// 찾기실패
 		var fnGetDisplayFail = function (authMethod) {
+			$('.registration_nav').hide();
 			if (authMethod === 'custInfo') {
 				$('#failCustId').show();
 			}
@@ -312,6 +313,16 @@
 		};
 
 		$(document).ready( function() {
+			$(document).on('click','.mb .registration_tap > .form_group > .form_field > div',function(e){
+				// form 데이터 리셋
+				$('#searchCustInfo')[0].reset();
+
+				$(this).find('input').prop('checked', true);
+				$(this).parents('.form_group').find('.regist_box').removeClass('on');
+				$(this).parents('.form_group').find('.regist_box').eq($(this).index()).addClass('on');
+				return false;
+			});
+
 			$('#searchCustInfo')[0].reset();
 		});
 

+ 6 - 0
src/main/webapp/WEB-INF/views/web/customer/PasswordFindFormWeb.html

@@ -278,6 +278,12 @@
 		};
 
 		$(document).ready( function() {
+			$(document).on('click','.mb .registration_tap > .form_group >.form_field > div',function(e){
+				$(this).find('input').prop('checked', true);
+				$(this).parents('.form_group').find('.regist_box').removeClass('on');
+				$(this).parents('.form_group').find('.regist_box').eq($(this).index()).addClass('on');
+				return false;
+			});
 			$('#searchCustInfo')[0].reset();
 		});
 

+ 168 - 0
src/main/webapp/WEB-INF/views/web/display/AllBrandFormWeb.html

@@ -0,0 +1,168 @@
+<!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  : AllBrandFormWeb.html
+ * @desc    : 전체브랜드 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.04.12   bin2107     최초 작성
+ *******************************************************************************
+ -->
+<body>
+<th:block layout:fragment="content">
+<div id="container" class="container br">
+	<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 br_sch_result"> <!-- 페이지특정 클래스 = br_sch_result -->
+			<div class="cont_head">
+				<h2 class="displayH t_c">전체 브랜드</h2>
+				<div class="brand_banner_list" th:if="${mainBrandList != null}" th:with="imgUrl=${@environment.getProperty('upload.image.view')}">
+					<ul>
+						<li th:each="item, status : ${mainBrandList}">
+							<a href="javascript:void(0);" th:onClick="cfnGoToBrandMain([[${item.brandGroupNo}]]);" th:style="${'background-image:url('+imgUrl+ item.logoFileNm+');'}">
+								<span><em th:text="${item.brandGroupNm}">BUCKAROO</em></span>
+							</a>
+						</li>
+					</ul>
+				</div>
+			</div>
+			<div class="cont_body">
+				<div class="area_input">
+					<form id="searchBrandForm" name="searchBrandForm">
+						<fieldset>
+							<legend>브랜드명 검색</legend>
+							<input type="text" id="search" name="search" value="" placeholder="브랜드명 입력" class="search_input" title="검색어 입력" maxlength="100">
+							<button type="button" class="sch_btn" onclick="fnSearchBrand();"><span>브랜드 검색</span></button>
+						</fieldset>
+					</form>
+				</div>
+				<div class="area_result">
+					<!-- 브랜드 검색어 입력 전 -->
+					<div class="default_box">
+						<h3 class="sr-only">브랜드 전체 리스트</h3>
+						<div class="brand_list" id="idBrandList">
+							<!--<div class="list_blk">
+								<span class="title_abbr">ㄱ</span>
+								<ul>
+									<li>
+										<a id="#" href="#none">
+											<span class="name_large">가르맨디</span>
+											<span class="name_small">GARMENDI</span>
+										</a>
+									</li>
+									<li>
+										<a id="" href="#none">
+											<span class="name_large">공동구매북</span>
+											<span class="name_small">GONGDONGGUMAEBOOK</span>
+										</a>
+									</li>
+								</ul>
+							</div>-->
+						</div>
+					</div>
+					<!-- //브랜드 검색어 입력 전 -->
+					
+					<!-- 브랜드 검색 결과 없을 시 노출 -->
+					<div class="empty_box" id="idNodata" style="display:none;">
+						<div class="nodata">
+							<div class="txt_box">
+								<p>
+									브랜드 검색 결과가 없습니다.
+								</p>
+							</div>
+							<div class="btn_box">
+								<button class="btn btn_default" onclick="cfnGoToPage(_PAGE_ALL_BRAND);"><span>브랜드 전체보기</span></button>
+							</div>
+						</div>
+					</div>
+					<!-- //브랜드 검색 결과 없을 시 노출 -->
+				</div>
+			</div>
+		</div>
+	</div>
+</div>
+
+<script th:inline="javascript">
+/*<![CDATA[*/
+	$(document).ready(function() {
+		fnCreateAllBrandList();
+	});
+
+	let fnSearchBrand = function(){
+		var searchBrand = $("#searchBrandForm").find("input[name=search]").val();
+		fnCreateAllBrandList(searchBrand);
+	}
+
+	let fnCreateAllBrandList = function (brandGroupNm){
+		let actionUrl = '/display/all/brand/list'
+		if(!gagajf.isNull(brandGroupNm)){
+			actionUrl += '?brandGroupNm='+brandGroupNm;
+		}
+
+		$.getJSON(actionUrl
+			, function(result, status){
+					if(result.length>0){
+						$("#idBrandList").html('');
+						let tag = '';
+						let prevNav = '';
+						$.each(result, function (idx, item){
+							if(prevNav != item.brandInitial){
+								if(idx>0){
+									tag += '	</ul>\n';
+									tag += '</div>\n';
+								}
+								tag += '<div class="list_blk">\n';
+								tag += '	<span class="title_abbr">'+item.brandInitial+'</span>\n';
+								tag += '		<ul>\n';
+								tag += '			<li>\n';
+								tag += '				<a href="javascript:void(0);" onclick="cfnGoToBrandMain('+item.brandGroupNo+');">\n';
+								tag += '					<span class="name_large">'+item.brandGroupNm+'</span>\n';
+								if(item.dispNmLang=='KR'){
+									tag += '					<span class="name_small">'+item.brandGroupEnm+'</span>\n';
+								}else{
+									tag += '					<span class="name_small">'+item.brandGroupKnm+'</span>\n';
+								}
+								tag += '				</a>\n'
+								tag += '			</li>\n';
+							}else{
+								tag += '			<li>\n';
+								tag += '				<a href="javascript:void(0);" onclick="cfnGoToBrandMain('+item.brandGroupNo+');">\n';
+								tag += '					<span class="name_large">'+item.brandGroupNm+'</span>\n';
+								if(item.dispNmLang=='KR'){
+									tag += '					<span class="name_small">'+item.brandGroupEnm+'</span>\n';
+								}else{
+									tag += '					<span class="name_small">'+item.brandGroupKnm+'</span>\n';
+								}
+								tag += '				</a>\n'
+								tag += '			</li>\n';
+							}
+							prevNav = item.brandInitial;
+						});
+						tag += '	</ul>\n';
+						tag += '</div>\n';
+						$("#idBrandList").html(tag);
+					}else{
+						$("#idBrandList").html('');
+						$("#idNodata").show();
+					}
+			});
+	}
+/*]]>*/
+</script>
+
+</th:block>
+</body>
+</html>

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

@@ -336,7 +336,7 @@
 						<div class="cont_body">
 							<div class="itemsGrp">
 								<th:block th:each="goodsData, goodsStat : ${brandMainLayoutData.goodsList}">
-									<div class="item_prod" th:if="${goodsStat.index<5}">
+									<div class="item_prod">
 										<div class="item_state">
 											<a href="javascript:void(0);" class="itemLink" th:onclick="cfnGoToGoodsDetail([[${goodsData.goodsCd}]], '', '', 'SBM013');">
 												<div class="itemPic">

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

@@ -243,7 +243,7 @@
 							</div>
 							<div class="count_wrap">
 								<div>
-									<p><span id="totCntId">9999</span>개의 상품</p>
+									<p><span id="totCntId"></span>개의 상품</p>
 								</div>
 								<div>
 									<ul>
@@ -346,7 +346,7 @@
 
 			fnCreateCategoryList();
 
-			fnGoodsListSearch();
+			//fnGoodsListSearch();
 		});
 
 		var fnGoodsListSearch = function (){
@@ -407,12 +407,13 @@
 		}
 
 		let fnGetCategoryList = function (cate1){
-			var brandGroupNo = [[${brandGroupNo}]];
-			var formalGb = [[${formalGb}]];
-			var cate1No = [[${cate1No}]];
-			var cate2No = [[${cate2No}]];
-			var cate3No = [[${cate3No}]];
-			var cate4No = [[${cate4No}]];
+			var brandGroupNo = [[${cateInfo.brandGroupNo}]];
+			var cateGb =  [[${cateInfo.cateGb}]];
+			var formalGb = [[${cateInfo.formalGb}]];
+			var cate1No = [[${cateInfo.cate1No}]];
+			var cate2No = [[${cateInfo.cate2No}]];
+			var cate3No = [[${cateInfo.cate3No}]];
+			var cate4No = [[${cateInfo.cate4No}]];
 
 			var navNm = "";
 			var formTitle = "";
@@ -424,7 +425,7 @@
 						tag += ' class="on"';
 					}
 				tag += '>\n';
-				tag += '	<a href="javascript:;"';
+				tag += '	<a href="javascript:javascript:void(0);"';
 				if(cate1.cate1No == cate1No){
 					tag += ' class="on"';
 					formTitle = cate1.cate1Nm;
@@ -432,7 +433,7 @@
 					$("#navNm").text(navNm);
 					$("#formTitle").text(formTitle);
 				}
-				tag += '	>' + cate1.cate1Nm + '</a>\n';
+				tag += '	onclick="cfnGoToGoodsList('+brandGroupNo+',\''+cateGb+'\','+cate1.cate1No+');" >' + cate1.cate1Nm + '</a>\n';
 				if (cate1.leafYn == 'N' && cate1.cate2List.length > 0) {
 					tag += '<div class="sub_cate"';
 					if(cate1.cate1No == cate1No){
@@ -446,13 +447,13 @@
 							tag += ' class="on"';
 						}
 						tag += '		>\n';
-						tag += '		<a href="javascript:;" ';
+						tag += '		<a href="javascript:javascript:void(0);" ';
 						if(cate2.cate2No == cate2No){
 							tag += ' class="on"';
 							navNm = navNm +' > ' + cate2.cate2Nm;
 							$("#navNm").text(navNm);
 						}
-						tag += '		>' + cate2.cate2Nm + '</a>\n';
+						tag += '	onclick="cfnGoToGoodsList('+brandGroupNo+',\''+cateGb+'\','+cate1.cate1No+','+cate2.cate2No+');">' + cate2.cate2Nm + '</a>\n';
  						if (cate2.leafYn == 'N' && cate2.cate3List != null && cate2.cate3List.length > 0) {
 							tag += '<div class="sub_cate"';
 							if(cate2.cate2No == cate2No){
@@ -466,13 +467,13 @@
 									tag += ' class="on"';
 								}
 								tag += '>';
-								tag += '<a href="javascript:;"';
+								tag += '		<a href="javascript:javascript:void(0);" ';
 								if(cate3.cate3No == cate3No){
 									tag += ' class="on"';
 									navNm = navNm +' > ' + cate3.cate3Nm;
 									$("#navNm").text(navNm);
 								}
-								tag += '>' + cate3.cate3Nm + '</a>';
+								tag += ' onclick="cfnGoToGoodsList('+brandGroupNo+',\''+cateGb+'\','+cate1.cate1No+','+cate2.cate2No+','+cate3.cate3No+');">' + cate3.cate3Nm + '</a>';
 								tag += '</li>\n';
 							});
 							tag += '	</ul>\n';
@@ -491,7 +492,7 @@
 
 		// 사파리 - event.persisted || 크롬 - window.performance.navigation.type 이 1이면 새로고침, 2면 페이지 이동을 통한 캐쉬페이징
 		$(window).on("pageshow", function(event) {
-			$('#filterForm input[name=brand]:checked').each(function(){
+			/*$('#filterForm input[name=brand]:checked').each(function(){
 				$(this).parent().addClass("active");
 			});
 			$('#filterForm input[name=size]:checked').each(function(){
@@ -499,7 +500,7 @@
 			});
 			$('#filterForm input[name=price]:checked').each(function(){
 				$(this).parent().addClass("active");
-			});
+			});*/
 			if ( (event.originalEvent && event.originalEvent.persisted) || (window.performance && window.performance.navigation.type == 2)) {
 				var historyData = sessionStorage.getItem(document.location.href);
 				if(historyData!=null){
@@ -530,14 +531,15 @@
 				}
 			}else{
 				fnCategoryGoodsInfiniteScrollInit();
-				var sortGb = [[${sortGb}]];
+				/*var sortGb = [[${sortGb}]];
 				if(sortGb=='new' || sortGb=='best'){
 					$("#sortSelect").val(sortGb);
 					$("#sortSelect").parent('div').children('span').text($("#sortSelect option:selected").text())
 					fnSortChange(sortGb);
 				}else{
 					fnGoodsListSearch();
-				}
+				}*/
+				fnGoodsListSearch();
 			}
 		});
 

+ 99 - 90
src/main/webapp/WEB-INF/views/web/display/CategoryMainFormWeb.html

@@ -29,114 +29,123 @@
 	</div>
 
 	<div class="wrap">
-		<div class="content dp_submain"> <!-- 페이지특정 클래스 = dp_list -->
-			<div class="cont_head">
-				<div>
-					<h3 class="cate1Nm">여성</h3>
-				</div>
-			</div>
-			<div class="cont_body" th:if="${planningList != null}">
-				<div class="dp_sum_slide dp_inner">
-					<div class="swiper-container">
-						<div class="swiper-wrapper">
-							<div class="swiper-slide" th:each="item, status : ${planningList}">
-								<a th:href="${item.strVar1}">
-									<div class="img">
-										<img  th:src="${@environment.getProperty('domain.image') + '/' + item.imgPath1}" alt="서브메인 썸네일"/>
-									</div>
-									<div class="txt">
-										<p class="subject" th:text="${item.strTitle1}"></p>
-										<span th:text="${item.subText1}"></span>
+		<th:block th:if="${cateMainLayoutList}" th:each="mainLayoutData, mainStat : ${cateMainLayoutList}" th:with="contentsLoc=${#strings.replace(mainLayoutData.contentsLoc,'SCM','')}">
+			<th:block th:if="${contentsLoc=='001'}">
+				<div class="content dp_submain" > <!-- 페이지특정 클래스 = dp_list -->
+					<div class="cont_head">
+						<div>
+							<h3 class="cate1Nm"></h3>
+						</div>
+					</div>
+					<div class="cont_body" th:if="${planningList != null and !planningList.empty}">
+						<div class="dp_sum_slide dp_inner">
+							<div class="swiper-container">
+								<div class="swiper-wrapper">
+									<div class="swiper-slide" th:each="item, status : ${planningList}">
+										<a th:href="${item.strVar1}">
+											<div class="img">
+												<img  th:src="${@environment.getProperty('domain.image') + '/' + item.imgPath1}" alt="서브메인 썸네일"/>
+											</div>
+											<div class="txt">
+												<p class="subject" th:text="${item.strTitle1}"></p>
+												<span th:text="${item.subText1}"></span>
+											</div>
+										</a>
 									</div>
-								</a>
+								</div>
+								<div class="swiper-controls">
+									<div class="swiper-scrollbar"></div>
+								</div>
 							</div>
-						</div>
-						<div class="swiper-controls">
-							<div class="swiper-scrollbar"></div>
+							<!-- Add Arrows -->
+							<div class="swiper-button-next"></div>
+							<div class="swiper-button-prev"></div>
 						</div>
 					</div>
-					<!-- Add Arrows -->
-					<div class="swiper-button-next"></div>
-					<div class="swiper-button-prev"></div>
 				</div>
-			</div>
-		</div>
-		
-		<div class="content wide dp_category">
-			<div class="cont_head">
-				<h3 class="displayH">카테고리 바로가기</h3>
-			</div>
-			<div class="cont_body">
-				<div class="">
-					<div class="dp_cate_list">
+			</th:block>
+
+			<th:block th:if="${contentsLoc=='004'}">
+				<div class="content wide dp_category">
+					<div class="cont_head">
+						<h3 class="displayH">카테고리 바로가기</h3>
+					</div>
+					<div class="cont_body">
+						<div class="">
+							<div class="dp_cate_list">
+							</div>
+						</div>
 					</div>
 				</div>
-			</div>
-		</div>
-		
-		<!-- 신상품 -->
-		<div class="content wide new_item" th:if="${newGoodsList != null}">
-			<div class="cont_head">
-				<h3 class="displayH">신상품</h3>
-			</div>
-			<div class="cont_body">
-				<div class="swiper-container post-trendy">
-					<div class="swiper-wrapper">
-						<div class="swiper-slide" th:each="item, status : ${newGoodsList}">
-							<div class="item_prod">
-								<div class="item_state">
-									<button type="button" class="itemLike" th:classappend="${item.likeIt}">관심상품 추가</button>
-									<a href="javascript:void(0);" class="itemLink" th:onclick="cfnGoToGoodsDetail([[${item.goodsCd}]], '', '', 'SCM001');">
-										<div class=" itemPic">
-											<img class="vLHTC pd_img" th:src="${@environment.getProperty('upload.goods.view') + '/' + item.sysImgNm}" th:alt="${item.goodsCd}"/>
+			</th:block>
+
+			<th:block th:if="${contentsLoc=='002'}">
+				<!-- 신상품 -->
+				<div class="content wide new_item" th:if="${newGoodsList != null}">
+					<div class="cont_head">
+						<h3 class="displayH">신상품</h3>
+					</div>
+					<div class="cont_body">
+						<div class="swiper-container post-trendy">
+							<div class="swiper-wrapper">
+								<div class="swiper-slide" th:each="item, status : ${newGoodsList}">
+									<div class="item_prod">
+										<div class="item_state">
+											<button type="button" class="itemLike" th:classappend="${item.likeIt}">관심상품 추가</button>
+											<a href="javascript:void(0);" class="itemLink" th:onclick="cfnGoToGoodsDetail([[${item.goodsCd}]], '', '', 'SCM001');">
+												<div class=" itemPic">
+													<img class="vLHTC pd_img" th:src="${@environment.getProperty('upload.goods.view') + '/' + item.sysImgNm}" th:alt="${item.goodsCd}"/>
+												</div>
+												<p class="itemBrand" th:text="${item.brandGroupNm}">BRAND NAME</p>
+												<div class="itemName" th:text="${item.goodsFullNm}">스타 착용 여성 퍼 아플리케 오버핏 투마일 웨어링 점퍼</div>
+												<p class="itemPrice" th:text="${#numbers.formatInteger(item.currPrice,3,'POINT') + '원'}">488,000원</p>
+												<div class="itemComment" th:if="${not #strings.isEmpty(item.goodsTnm)}" th:text="${item.goodsTnm}">#가을느낌 물씬!</div>
+											</a>
 										</div>
-										<p class="itemBrand" th:text="${item.brandGroupNm}">BRAND NAME</p>
-										<div class="itemName" th:text="${item.goodsFullNm}">스타 착용 여성 퍼 아플리케 오버핏 투마일 웨어링 점퍼</div>
-										<p class="itemPrice" th:text="${#numbers.formatInteger(item.currPrice,3,'POINT') + '원'}">488,000원</p>
-										<div class="itemComment" th:if="${not #strings.isEmpty(item.goodsTnm)}" th:text="${item.goodsTnm}">#가을느낌 물씬!</div>
-									</a>
+									</div>
 								</div>
 							</div>
 						</div>
+						<div class="swiper-pagination"></div>
+						<div class="swiper-button-prev"></div>
+						<div class="swiper-button-next"></div>
 					</div>
 				</div>
-				<div class="swiper-pagination"></div>
-				<div class="swiper-button-prev"></div>
-				<div class="swiper-button-next"></div>
-			</div>
-		</div>
-		<!-- //신상품 -->
-		
-		<div class="content dp_best_list" th:if="${bestGoodsList != null}">
-			<div class="cont_head">
-				<h3 class="displayH">베스트</h3>
-			</div>
-			<div class="cont_body">
-				<div class="list_content">
-					<div class="itemsGrp"> <!-- itemsGrp rank hot deal -->
-						<div class="item_prod" th:each="item, status : ${bestGoodsList}">
-							<div class="item_state" >
-								<button type="button" class="itemLike" th:classappend="${item.likeIt}">관심상품 추가</button>
-								<a href="javascript:void(0);" class="itemLink" th:onclick="cfnGoToGoodsDetail([[${item.goodsCd}]], '', '', 'SCM002');">
-									<div class="rank ranker"><span th:text="${status.index+1}">1</span></div>
-									<div class="itemPic">
-										<img class="vLHTC pd_img" th:src="${@environment.getProperty('upload.goods.view') + '/' + item.sysImgNm}" th:alt="${item.goodsCd}"/>
+				<!-- //신상품 -->
+			</th:block>
+			<th:block th:if="${contentsLoc=='003'}">
+				<div class="content dp_best_list" th:if="${bestGoodsList != null}">
+					<div class="cont_head">
+						<h3 class="displayH">베스트</h3>
+					</div>
+					<div class="cont_body">
+						<div class="list_content">
+							<div class="itemsGrp"> <!-- itemsGrp rank hot deal -->
+								<div class="item_prod" th:each="item, status : ${bestGoodsList}">
+									<div class="item_state" >
+										<button type="button" class="itemLike" th:classappend="${item.likeIt}">관심상품 추가</button>
+										<a href="javascript:void(0);" class="itemLink" th:onclick="cfnGoToGoodsDetail([[${item.goodsCd}]], '', '', 'SCM002');">
+											<div class="rank ranker"><span th:text="${status.index+1}">1</span></div>
+											<div class="itemPic">
+												<img class="vLHTC pd_img" th:src="${@environment.getProperty('upload.goods.view') + '/' + item.sysImgNm}" th:alt="${item.goodsCd}"/>
+											</div>
+											<p class="itemBrand" th:text="${item.brandGroupNm}">BRAND NAME</p>
+											<div class="itemName" th:text="${item.goodsFullNm}">남성 헤링본 기모 팬츠 헤링본 기모 팬츠</div>
+											<p class="itemPrice">
+												<span th:text="${#numbers.formatInteger(item.currPrice,3,'POINT') + '원'}">80,100</span>
+												<span class="itemPrice_original" th:if="${item.currPrice != item.listPrice}" th:text="${#numbers.formatInteger(item.listPrice,3,'POINT') + '원'}">89,000</span>
+												<span class="itemPercent" th:if="${item.currPrice != item.listPrice}" th:text="${(item.listPrice == 0 ? 0 : #numbers.formatDecimal((item.listPrice - item.currPrice) / (item.listPrice * 1.0) * 100, 1, 0)) + '%'}">10%</span>
+											</p>
+											<div class="itemComment" th:if="${not #strings.isEmpty(item.goodsTnm)}" th:text="${item.goodsTnm}">#주문 폭주 상품</div>
+										</a>
 									</div>
-									<p class="itemBrand" th:text="${item.brandGroupNm}">BRAND NAME</p>
-									<div class="itemName" th:text="${item.goodsFullNm}">남성 헤링본 기모 팬츠 헤링본 기모 팬츠</div>
-									<p class="itemPrice">
-										<span th:text="${#numbers.formatInteger(item.currPrice,3,'POINT') + '원'}">80,100</span>
-										<span class="itemPrice_original" th:if="${item.currPrice != item.listPrice}" th:text="${#numbers.formatInteger(item.listPrice,3,'POINT') + '원'}">89,000</span>
-										<span class="itemPercent" th:if="${item.currPrice != item.listPrice}" th:text="${(item.listPrice == 0 ? 0 : #numbers.formatDecimal((item.listPrice - item.currPrice) / (item.listPrice * 1.0) * 100, 1, 0)) + '%'}">10%</span>
-									</p>
-									<div class="itemComment" th:if="${not #strings.isEmpty(item.goodsTnm)}" th:text="${item.goodsTnm}">#주문 폭주 상품</div>
-								</a>
+								</div>
 							</div>
 						</div>
 					</div>
 				</div>
-			</div>
-		</div>
+			</th:block>
+		</th:block>
 	</div>
 </div>
 

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

@@ -136,6 +136,53 @@
 					</div>
 				</th:block>
 
+				<!-- 4. 잇 아이템 -->
+				<th:block th:if="${contentsLoc=='004'}">
+					<div class="content main_it">
+						<div class="cont_head">
+							<p class="displayH" th:text="${mainLayoutData.contentsTitle}"></p>
+							<a href="#none"><span>전체보기</span></a>
+						</div>
+						<div class="cont_body">
+							<div class="it_nav">
+								<ul>
+									<th:block th:each="ContentsData, ContentsStat : ${mainLayoutData.BestItemList}">
+										<li><button class="btn btn_link" th:attr="data-tab=${'it'+ContentsStat.count}"><span th:text="${ContentsData.cateNm}"></span></button></li>
+									</th:block>
+								</ul>
+							</div>
+							<th:block th:each="ContentsData, ContentsStat : ${mainLayoutData.BestItemList}">
+								<div class="swiper-container post-it it_item" th:id="${'it'+ContentsStat.count}">
+									<div class="swiper-wrapper">
+										<th:block th:each="bestItemData, bestItemStat : ${ContentsData.goodsList}">
+											<div class="swiper-slide">
+												<div class=" item_prod sUiXc "> <!-- item_prod ranker d_detail -->
+													<div class="item_state"> <!-- item_state AD soldout -->
+														<a href="javascript:void(0);" class="itemLink" th:onclick="cfnGoToGoodsDetail([[${bestItemData.goodsCd}]], '', '', 'SMM004');">
+															<div class="shape ranker"><span th:text="${bestItemStat.count}"></span></div>
+															<div class="itemPic">
+																<img alt="BLACK-a" class=" vLHTC pd_img" th:src="${@environment.getProperty('upload.goods.view') + '/' + bestItemData.sysImgNm}" >
+																<button type="button" class="itemLike" th:classappend="${bestItemData.likeIt == 'likeit'}? 'likeit' : ''"  onclick="cfnPutWishList(this);" th:attr="goodsCd=${bestItemData.goodsCd}, ithrCd='', contentsLoc='SMM004', planDtlSq=''">관심상품 추가</button>
+															</div>
+															<p class=" itemBrand" th:text="${bestItemData.brandGroupNm}">BRAND NAME</p>
+															<div class=" itemName" th:text="${bestItemData.goodsFullNm}">남성 로고 자카드 방풍 패딩 스웨터 가디건 자카드 방풍 패딩 스웨터 가디건 자카드 방풍 패딩 스웨터 가디건</div>
+															<p class="itemPrice">[[${#numbers.formatInteger(bestItemData.currPrice,0,'COMMA')} + 원]]
+																<span class="itemPrice_original" th:if="${bestItemData.currPrice != bestItemData.listPrice}" th:text="${#numbers.formatInteger(bestItemData.listPrice,3,'COMMA')}">89,000</span>
+																<span class=" itemPercent" th:if="${bestItemData.currPrice != bestItemData.listPrice}" th:text="${(bestItemData.listPrice == 0 ? 0 : #numbers.formatDecimal((bestItemData.listPrice - bestItemData.currPrice) / (bestItemData.listPrice * 1.0) * 100, 1, 0)) + '%'}">10%</span>
+															</p>
+															<div class="itemComment" th:text="${bestItemData.goodsTnm}">#데일리웨어로 매일입고싶은</div>
+														</a>
+													</div>
+												</div>
+											</div>
+										</th:block>
+									</div>
+								</div>
+							</th:block>
+						</div>
+					</div>
+				</th:block>
+
 				<!-- 5. 프로모션배너 -->
 				<th:block th:if="${contentsLoc=='005'}">
 					<div class="content main_2stage">
@@ -171,7 +218,7 @@
 				<th:block th:if="${contentsLoc=='006'}">
 					<div class="content wide main_deal" th:if="${mainLayoutData.socialInfo != null}">
 						<div class="cont_head">
-							<p class="displayH" th:text="${mainLayoutData.contentsTitle}">오늘만<br>이 가격에 만나요</p>
+							<p class="displayH" id="id006" th:text="${mainLayoutData.contentsTitle}">오늘만<br>이 가격에 만나요</p>
 							<a href="javascript:void(0);" onclick="cfnGoToPage(_PAGE_SOCIAL_MAIN);"><span>전체보기</span></a>
 							<div class="deal_progress">
 								<div class="bar_current" style="width:33.333%"><span>HERE</span></div>
@@ -212,9 +259,9 @@
 															<p class="itemBrand" th:text="${goodsData.brandEnm}">BRAND NAME</p>
 															<div class="itemName" th:text="${goodsData.goodsNm}">여성 체인 프린트 큐롯 스커트 프린트 큐롯 스커트</div>
 															<p class="itemPrice">
-																[[${#numbers.formatInteger(goodsData.currAprice,0,'COMMA')} + 원]]
+																[[${#numbers.formatInteger(goodsData.currPrice,0,'COMMA')} + 원]]
 																<span class="itemPrice_original" th:text="${#numbers.formatInteger(goodsData.listPrice,0,'COMMA')} + '원'"></span>
-																<span class=" itemPercent" th:text="${#numbers.formatDecimal(goodsData.dcArate,1,0)} + '%'"></span>
+																<span class=" itemPercent" th:text="${#numbers.formatDecimal(goodsData.dcRate,1,0)} + '%'"></span>
 																<!--<span class="itemPercent" th:if="${planningGoods.currPrice != planningGoods.listPrice}" th:text="${(planningGoods.listPrice == 0 ? 0 : #numbers.formatDecimal((planningGoods.listPrice - planningGoods.currPrice) / (planningGoods.listPrice * 1.0) * 100, 1, 0)) + '%'}">10%</span>-->
 															</p>
 															<div class="itemComment" th:text="${goodsData.goodsTnm}">#데일리웨어로 매일입고싶은</div>
@@ -775,6 +822,7 @@ $(document).ready( function() {
 	//$("#header").load("head.html");
 	//$("#footer").load("foot.html");
 	$(".tag_list .btn").eq(0).trigger('click');
+	$(".it_nav .btn").eq(0).trigger('click');
 });
 
 /* SLIDE - MAIN_VISUAL */
@@ -1054,6 +1102,13 @@ var main_tv_slide = new Swiper ('.main_tv .post-tv', {
 		clickable: true,
 	},
 });
+
+	$(document).ready(function() {
+		// $("#id006").text();
+		// var brCheck = "오늘만 <br> 이 가격@".split("<br>");
+		// console.log(brCheck[0]);
+		// console.log(brCheck[1]);
+	});
 /*]]>*/
 </script>
 

+ 546 - 0
src/main/webapp/WEB-INF/views/web/mypage/MypageCreCancelDetailFormWeb.html

@@ -0,0 +1,546 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org"
+	xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
+	layout:decorator="web/common/layout/MypageLayoutWeb">
+<!--
+ *******************************************************************************
+ * @source  : MypageCreCancelDetailFormWeb.html
+ * @desc    : 마이페이지 > 취소/반품/교환내역 > 취소상세 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2021 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.04.12   card007     최초 작성
+ *******************************************************************************
+ -->
+<body>
+
+<th:block layout:fragment="content">
+	<div class="content myOrderView"> <!-- 페이지특정 클래스 = myOrderView -->
+		<div class="cont_body">
+			<!-- CONT-BODY -->
+			<div class="lnb">
+				<div class="lnb_tit">
+					<h2>마이페이지</h2>
+				</div>
+				<div class="lnb_list">
+					<ul id="mypageLnbList"></ul>
+				</div>
+
+			</div>
+			<div class="cont">
+				<div class="sec_head">
+					<h3 class="subH1">취소상세</h3>
+					<span class="order_number">주문번호&nbsp;:&nbsp;<em th:text="${cancelDetailList.oneData.ordNo}"></em></span>
+				</div>
+				<div class="sec_body">
+					<div class="part_goods">
+						<div class="goods_head">
+							<p th:unless="${cancelDetailList.oneData.giftPackYn == 'Y'}">주문일 <span th:text="${cancelDetailList.oneData.ordDt}"></span></p>
+							<p th:if="${cancelDetailList.oneData.giftPackYn == 'Y'}">선물일 <span th:text="${cancelDetailList.oneData.ordDt}"></span></p>
+							<a href="javascript:void(0)" th:attr="ordNo=${cancelDetailList.oneData.ordNo}" onclick="fnGoToOrderDetail(this);">상세보기</a>
+						</div>
+						<div class="goods_cont">
+							<!-- 주문상품 -->
+							<th:block th:if="${cancelDetailList.cancelDetailList}" th:each="cancelDtl, status : ${cancelDetailList.cancelDetailList}" th:with="imageUrl=${@environment.getProperty('upload.goods.view')}">
+								<div class="goods_info">
+									<div class="order_desc">
+										<div class="goods_box">
+											<div class="gd_item">
+												<a href="javascript:void(0)" th:attr="goodsCd=${cancelDtl.goodsCd}" onclick="fnGoToGoodsDetail(this)">
+													<span class="thumb">
+														<img th:src="${imageUrl + '/' + cancelDtl.sysImgNm}" width="100%" alt="">
+													</span>
+													<p>
+														<span class="brand" th:text="${cancelDtl.brandNm}"></span>
+														<span class="tag primary" th:if="${cancelDtl.shotDelvYn == 'Y'}">총알배송</span>
+														<span class="tag" th:if="${cancelDtl.shotDelvYn == 'N' and cancelDtl.selfGoodsYn == 'Y'}">STYLE24 일반배송</span>
+														<span class="tag" th:if="${cancelDtl.selfGoodsYn == 'N'}">업체직배송</span>
+													</p>
+													<p>
+														<span class="name" th:text="${cancelDtl.goodsNm}"></span>
+													</p>
+												</a>
+											</div>
+											<div class="gd_opt">
+												<div class="option_wrap">
+													<span class="title sr-only">주문 옵션</span>
+													<span class="option" th:if="${cancelDtl.goodsType == 'G056_S'}" th:each="option, status : ${cancelDtl.colorNmArr}" th:text="|${cancelDtl.itemNmArr[status.index]} / ${option} / ${cancelDtl.optCd2Arr[status.index]}|"></span>
+													<span class="option" th:unless="${cancelDtl.goodsType == 'G056_S'}" th:text="|${cancelDtl.colorNm} / ${cancelDtl.optCd2}|"></span>
+												</div>
+											</div>
+											<div class="gd_calc">
+												<p>
+													<span class="count"><em th:text="${cancelDtl.chgQty}"></em>개</span>
+												</p>
+												<p>
+													<span class="price_org" th:if="${(cancelDtl.ordAmt - cancelDtl.cnclRtnAmt - cancelDtl.cpn1DcAmt) * (cancelDtl.chgQty / cancelDtl.ordQty) > (cancelDtl.realOrdAmt + cancelDtl.pntDcAmt + cancelDtl.gfcdUseAmt) * (cancelDtl.chgQty / cancelDtl.ordQty)}"><em th:text="${#numbers.formatInteger((ordDtl.ordAmt - ordDtl.cnclRtnAmt - ordDtl.cpn1DcAmt) * (cancelDtl.chgQty / cancelDtl.ordQty), 1, 'COMMA')}"></em>원</span>
+													<span class="price_sale"><em th:text="${#numbers.formatInteger((ordDtl.realOrdAmt + ordDtl.pntDcAmt + ordDtl.gfcdUseAmt) * (cancelDtl.chgQty / cancelDtl.ordQty), 1, 'COMMA')}"></em>원</span>
+												</p>
+											</div>
+										</div>
+										<div class="status_box">
+											<p>
+												<th:block th:text="${cancelDtl.chgStatNm}"></th:block>
+												<span class="date" th:text="${cancelDtl.chgDate}"></span>
+												<span class="time" th:text="${cancelDtl.chgTime}"></span>
+											</p>
+										</div>
+										<div class="button_box">
+											<p th:if="${chgStat == 'G685_20' or chgStat == 'G685_21' or chgStat == 'G685_50' or chgStat == 'G685_51'}"><button type="button" class="btn btn_default btn_sm" th:attr="ordChgSq=${cancelDtl.ordChgSq}" onclick="fnCreCancel(this);"><span>신청취소</span></button></p>
+											<p th:if="${chgStat == 'G685_21' or chgStat == 'G685_32' or chgStat == 'G685_51'}"><button type="button" class="btn btn_default btn_sm" th:attr="ordChgSq=${cancelDtl.ordChgSq}" onclick="fnCrePayAddCost(this);"><span>결제하기</span></button></p>
+											<p><button type="button" class="btn btn_default btn_sm" onclick="cfnGoToPage(_PAGE_ONETOONE_QNA_REG);"><span>1:1 문의</span></button></p>
+										</div>
+									</div>
+									<!-- 결제대기 -->
+									<div class="order_text" th:if="${chgStat == 'G685_21' or (chgGb == 'G680_40' and chgStat == 'G685_32')}"><p th:text="|${cancelDtl.addPayCost}|원 결제 후 교환 가능합니다."></p></div>
+								</div>
+							</th:block>
+							<!-- //주문상품 -->
+						</div>
+					</div>
+					<h4 class="subH3">상세 정보</h4>
+					<div class="tbl type1">
+						<table>
+							<colgroup>
+								<col width="210">
+								<col width="*">
+							</colgroup>
+							<tbody><tr>
+								<th>
+									취소접수 일자
+								</th>
+								<td>
+									2021.01.18
+								</td>
+							</tr>
+							<tr>
+								<th>
+									취소완료 일자
+								</th>
+								<td>
+									2021.01.30
+								</td>
+							</tr>
+							</tbody></table>
+					</div>
+					<h4 class="subH3">환불정보</h4>
+					<div class="tbl type6">
+						<table>
+							<colgroup>
+								<col width="50%">
+								<col width="50%">
+							</colgroup>
+							<tbody><tr>
+								<td>
+									<dl>
+										<div>
+											<dt>환불 예정 금액</dt>
+											<dd>
+												<div class="price">
+													<span class="return_total_price"><em>3,546,200</em>원</span>
+												</div>
+											</dd>
+										</div>
+										<div class="include_item"> <!-- 할인항목 표기 class명 include_item -->
+											<dt>상품 취소 금액</dt>
+											<dd><em>123,456,789</em>원</dd>
+										</div>
+										<div class="include_item">
+											<dt>배송비</dt>
+											<dd><em>-2,500</em>원</dd>
+										</div>
+										<div class="include_item">
+											<dt>할인 금액 차감</dt>
+											<dd><em>-123,456,789</em>원</dd>
+										</div>
+									</dl>
+								</td>
+								<td>
+									<dl>
+										<div>
+											<dt>결제 금액 환불</dt>
+											<dd>
+												<em>123,456,789</em>원
+											</dd>
+										</div>
+										<div>
+											<dt>포인트 환불</dt>
+											<dd>
+												<em>123,456,789P</em>
+											</dd>
+										</div>
+										<div>
+											<dt>상품권 환불</dt>
+											<dd>
+												<em>-123,456,789</em>원
+											</dd>
+										</div>
+										<div>
+											<dt>환불 수단</dt>
+											<dd>
+												신용카드(현대카드) / 일시불
+											</dd>
+										</div>
+										<div>
+											<dt class="sr-only">영수증 확인</dt>
+											<dd>
+												<button type="button" class="btn btn_default btn_sm"><span>취소 전표 보기</span>
+												</button></dd>
+										</div>
+									</dl>
+								</td>
+							</tr>
+							</tbody></table>
+					</div>
+					<div class="txt_info">
+						<ul>
+							<li>
+								카드사로 결제 취소 요청이 전달된 후 환불까지는 평일 기준 3 ~7일이 소요될 수 있습니다.
+							</li>
+						</ul>
+					</div>
+					<div class="btn_footer_area">
+						<button type="button" class="btn btn_dark btn_md"><span>확인</span></button>
+					</div>
+				</div>
+			</div>
+			<!-- // CONT-BODY -->
+		</div>
+	</div>
+<script src="/ux/plugins/gaga/gaga.paging.js"></script>
+<script th:inline="javascript">
+	/*<![CDATA[*/
+	let totalCount = 0;
+	let pageSize = 0;
+
+	$(document).ready(function() {
+		// 마이페이지 LNB 설정
+		fnSetMypageLnbList(2);
+		
+		// 마이페이지 location 설정
+		fnSetMypageLocation('취소/반품/교환내역');
+		
+		// datepicker 설정
+		$('.period_datepicker').datepicker();
+
+		// 셀렉트박스 활성화
+		$('.select_custom.demand_status').each(function(index) {
+			new sCombo($(this));
+		});
+
+		// 주문 검색 기간 설정
+		$('#rdi-month2').click();
+
+		// Initialize a pagination
+		gagaPaging.init('searchForm', fnSearchCallback, 'paging', 5, 10);
+		
+		// Load data
+		gagaPaging.load(1);
+	});
+	
+	// 검색기간 버튼 클릭 이벤트 처리
+	var fnSetSearchPeriod = function(period) {
+		let date = new Date();
+		let edDate = date.getFullYear() + '-' + ('0' + (date.getMonth() + 1)).slice(-2) + '-' + ('0' + (date.getDate() + 1)).slice(-2);
+		date.setMonth(date.getMonth() - period);
+		let stDate = date.getFullYear() + '-' + ('0' + (date.getMonth() + 1)).slice(-2) + '-' + ('0' + (date.getDate() + 1)).slice(-2);
+
+		$('#edDate').val(edDate);
+		$('#searchForm input[name=edDate]').val(edDate);
+		$('#stDate').val(stDate);
+		$('#searchForm input[name=stDate]').val(stDate);
+	}
+
+	// 주문 목록 조회
+	var fnSearchCreList = function() {
+		gagaPaging.load(1);
+	}
+
+	// 주문 목록 조회 콜백
+	var fnSearchCallback = function(result) {
+		$('#creList').html(fnCreateCreList(result));
+
+		// Create pagination
+		gagaPaging.createPagination(result.creInfo.pageable);
+	}
+
+	// 검색기간 설정 체크
+	var fnCheckPeriod = function(param) {
+		let stDate = $('#stDate').val();
+		let edDate = $('#edDate').val();
+
+		let sdt = new Date(stDate);
+		let edt = new Date(edDate);
+		let dateDiff = Math.ceil((edt.getTime() - sdt.getTime()) / (1000 * 3600 * 24));
+
+		if (dateDiff > 366) {
+			let id = $(param).attr('id');
+			mcxDialog.alert('조회기간은 최대 1년을 넘을 수 없습니다.');
+			if (id == 'stDate') {
+				sdt.setFullYear(sdt.getFullYear() + 1);
+				let chgEdDate = sdt.getFullYear() + '-' + ('0' + (sdt.getMonth() + 1)).slice(-2) + '-' + ('0' + (sdt.getDate())).slice(-2);
+
+				$('#edDate').val(chgEdDate);
+				$('#searchForm input[name=edDate]').val(chgEdDate);
+			} else {
+				edt.setFullYear(edt.getFullYear() - 1);
+				let chgStDate = edt.getFullYear() + '-' + ('0' + (edt.getMonth() + 1)).slice(-2) + '-' + ('0' + (edt.getDate())).slice(-2);
+
+				$('#stDate').val(chgStDate);
+				$('#searchForm input[name=stDate]').val(chgStDate);
+			}
+		}
+	}
+
+	// 상태값 별 수량 업데이트 처리
+	var fnReloadStatusCount = function() {
+		let url = '/mypage/status/count';
+		
+		let data = {};
+		data.custNo = customerInfo.custNo;
+		
+		let jsonData = JSON.stringify(data);
+		
+		gagajf.ajaxJsonSubmit(url, jsonData, function(result) {
+			$('#orderReceiptCount').text(result.orderCount.orderReceiptCount);
+			$('#paymentCompleteCount').text(result.orderCount.paymentCompleteCount);
+			$('#goodsPrepareCount').text(result.orderCount.goodsPrepareCount);
+			$('#shipPrepareCount').text(result.orderCount.shipPrepareCount);
+			$('#shippingCount').text(result.orderCount.shippingCount);
+			$('#shipCompleteCount').text(result.orderCount.shipCompleteCount);
+			$('#orderCreCount').text(result.orderCount.cancelCount + result.orderCount.returnCount + result.orderCount.exchangeCount);
+		});
+	}
+
+	// 주문상세상태코드 셀렉트박스 변경 이벤트
+	$('.select_custom.demand_status').find('li').on('click', function() {
+		$('#searchForm input[name=chgStat]').val($(this).attr('code'));
+	});
+
+	// 주문내역 리스트 처리
+	var fnCreateCreList = function(param) {
+		let tag = '';
+		let imageUrl = [[${@environment.getProperty('upload.goods.view')}]];
+
+		if (param.creList != null && param.creList.length > 0) {
+			$.each(param.creList, function (idx, creList) {
+				tag += '						<div class="part_goods">\n';
+				tag += '							<div class="goods_head">\n';
+				if (creList.giftPackYn == 'Y') {
+					tag += '								<p>선물일 <span>' + creList.ordDt + '</span></p>\n';
+				} else {
+					tag += '								<p>주문일 <span>' + creList.ordDt + '</span></p>\n';
+				}
+				tag += '								<a href="javascript:void(0)" ordChgSq="' + creList.ordChgSq + '" chgGb="' + creList.oneData.chgGb + '" onclick="fnGoToCreDetail(this)">상세보기</a>\n';
+				tag += '							</div>\n';
+				tag += '							<div class="goods_cont">\n';
+				$.each(creList.creList, function (index, cre) {
+					tag += '								<!-- 주문상품1 -->\n';
+					tag += '								<div class="goods_info">\n';
+					tag += '									<div class="order_desc">\n';
+					tag += '										<div class="goods_box">\n';
+					tag += '											<div class="gd_item">\n';
+					tag += '												<a href="javascript:void(0)" goodsCd="' + cre.goodsCd + '" onclick="fnGoToGoodsDetail(this)">\n';
+					tag += '													<span class="thumb">\n';
+					tag += '														<img src="' + imageUrl + '/' + cre.sysImgNm + '" width="100%" alt="">\n';
+					tag += '													</span>\n';
+					tag += '													<p>\n';
+					tag += '														<span class="brand">' + cre.brandNm + '</span>\n';
+					// 배송 아이콘 처리
+					if (cre.shotDelvYn == 'Y') {
+						tag += '														<span class="tag primary">총알배송</span>\n';
+					} else if (cre.selfGoodsYn == 'Y') {
+						tag += '														<span class="tag">STYLE24 일반배송</span>\n';
+					} else {
+						tag += '														<span class="tag">업체직배송</span>\n';
+					}
+					tag += '													</p>\n';
+					tag += '													<p>\n';
+					tag += '														<span class="name">' + cre.goodsNm + '</span>\n';
+					tag += '													</p>\n';
+					tag += '												</a>\n';
+					tag += '											</div>\n';
+					tag += '											<div class="gd_opt">\n';
+					tag += '												<div class="option_wrap">\n';
+					tag += '													<span class="title sr-only">주문 옵션</span>\n';
+					// 세트아이템 옵션 처리
+					if (cre.goodsType == 'G056_S') {
+						$.each(cre.colorNmArr, function (index2, option) {
+							tag += '													<span class="option">' + cre.itemNmArr[index2] + ' / ' + option + ' / ' + cre.optCd2Arr[index2] + '</span>\n';
+						});
+					} else {
+						tag += '													<span class="option">' + cre.colorNm + ' / ' + cre.optCd2 + '</span>\n';
+					}
+					tag += '												</div>\n';
+					tag += '											</div>\n';
+					tag += '											<div class="gd_calc">\n';
+					tag += '												<p>\n';
+					tag += '													<span class="count"><em>' + cre.chgQty + '</em>개</span>\n';
+					tag += '												</p>\n';
+					tag += '											</div>\n';
+					tag += '											<div class="gd_opt">\n';
+					tag += '												<div class="option_wrap">\n';
+					// 교환옵션
+					if (cre.chgGb == 'G680_40') {
+						$.each(creList.exchangeOptionList, function(index, exchange) {
+							if (cre.chgOrdDtlNo == exchange.ordDtlNo) {
+								if (cre.goodsType == 'G056_S') {
+									tag += '													<span class="title">교환 옵션</span>';
+									$.each(exchange.colorNmArr, function (index2, option) {
+										tag += '													<span class="option">' + exchange.itemNmArr[index2] + ' / ' + option + ' / ' + exchange.optCd2Arr[index2] + '</span>\n';
+									});
+								} else {
+									tag += '													<span class="option">' + exchange.colorNm + ' / ' + exchange.optCd2 + '</span>\n';
+								}
+							}
+						});
+					}
+					tag += '												</div>\n';
+					tag += '											</div>\n';
+					tag += '										</div>\n';
+					tag += '										<div class="status_box">\n';
+					tag += '											<p>\n';
+					tag += '												' + cre.chgStatNm + '\n';
+					tag += '												<span class="date">' + cre.chgDate + '</span>\n';
+					tag += '												<span class="time">' + cre.chgTime + '</span>\n';
+					tag += '											</p>\n';
+					tag += '										</div>\n';
+					tag += '										<div class="button_box">\n';
+					if (cre.chgStat == 'G685_20' || cre.chgStat == 'G685_21' || cre.chgStat == 'G685_50' || cre.chgStat == 'G685_51') {
+						tag += '											<p><button type="button" class="btn btn_default btn_sm" ordChgSq="' + cre.ordChgSq + '" onclick="fnCreCancel(this);"><span>신청취소</span></button></p>\n';
+					}
+					if (cre.chgStat == 'G685_21' || cre.chgStat == 'G685_51' || cre.chgStat == 'G685_32') {
+						tag += '											<p><button type="button" class="btn btn_default btn_sm" ordChgSq="' + cre.ordChgSq + '" onclick="fnCrePayAddCost(this);"><span>결제하기</span></button></p>\n';
+					}
+					if (cre.chgStat == 'G685_40') {
+						tag += '											<p><button type="button" class="btn btn_default btn_sm" ordDtlNo="' + cre.ordDtlNo + '" onclick="fnGoToDeliveryTrack(this);"><span>배송조회</span></button></p>\n';
+					}
+					tag += '											<p><button type="button" class="btn btn_default btn_sm" onclick="cfnGoToPage(_PAGE_ONETOONE_QNA_REG);"><span>1:1 문의</span></button></p>\n';
+					tag += '										</div>\n';
+					tag += '									</div>\n';
+					//if (cre.chgStat == 'G685_10') {
+					//	tag += '									<div class="order_text"><p>' + cre.addPayCost + '원 결제 후 취소 가능합니다.</p></div>\n';
+					//}
+					// cre.chgGb == 'G680_30' : 반품
+					// cre.chgGb == 'G680_40' : 교환
+					// 교환접수
+					if (cre.chgStat == 'G685_20') {
+						tag += '									<div class="order_text"><p>교환 신청이 접수 되었습니다. 신속하게 처리하여 드리겠습니다.</p></div>\n';
+					}
+					// 교환대기
+					if (cre.chgStat == 'G685_21') {
+						tag += '									<div class="order_text"><p>' + cre.addPayCost.addComma() + '원 결제 후 교환 가능합니다.</p></div>\n';
+					}
+					// 회수요청
+					if (cre.chgStat == 'G685_30') {
+						tag += '									<div class="order_text"><p>고객님이 요청하신 회수지로 상품을 회수 중에 있습니다.</p></div>\n';
+					}
+					// 상품 검수중(교환)
+					if (cre.chgStat == 'G685_31' && cre.chgGb == 'G680_40') {
+						tag += '									<div class="order_text"><p>고객님이 교환하신 상품을 검수 중에 있습니다.</p></div>\n';
+					}
+					// 결제대기(교환)
+					if (cre.chgStat == 'G685_32' && cre.chgGb == 'G680_40') {
+						tag += '									<div class="order_text"><p>' + cre.addPayCost.addComma() + '원 결제 후 교환 가능합니다.</p></div>\n';
+					}
+					// 교환완료
+					if (cre.chgStat == 'G685_40') {
+						$.each(creList.exchangeOptionList, function(index, exchange) {
+							if (cre.chgOrdDtlNo == exchange.ordDtlNo && (exchange.ordDtlStat == 'G013_60' || exchange.ordDtlStat == 'G013_70')) {
+								tag += '									<div class="order_text"><p>교환이 완료되었습니다.</p></div>\n';
+							}
+						});
+					}
+					// 교환철회
+					if (cre.chgStat == 'G685_49') {
+						tag += '									<div class="order_text"><p>요청하신 교환을 취소하였습니다.</p></div>\n';
+					}
+					// 반품접수
+					if (cre.chgStat == 'G685_50') {
+						tag += '									<div class="order_text"><p>반품 신청이 접수 되었습니다. 신속하게 처리하여 드리겠습니다.</p></div>\n';
+					}
+					// 반품대기
+					if (cre.chgStat == 'G685_51') {
+						tag += '									<div class="order_text"><p>' + cre.addPayCost.addComma() + '원 결제 후 반품 가능합니다.</p></div>\n';
+					}
+					// 상품 검수중(반품)
+					if (cre.chgStat == 'G685_31' && cre.chgGb == 'G680_40') {
+						tag += '									<div class="order_text"><p>고객님이 반품하신 상품을 검수 중에 있습니다.</p></div>\n';
+					}
+					// 결제대기(반품)
+					if (cre.chgStat == 'G685_32' && cre.chgGb == 'G680_40') {
+						tag += '									<div class="order_text"><p>' + cre.addPayCost.addComma() + '원 결제 후 반품 가능합니다.</p></div>\n';
+					}
+					// 환불진행중
+					if (cre.chgStat == 'G685_33') {
+						tag += '									<div class="order_text"><p>' + cre.refundAmt.addComma() + '원 환불을 진행하고 있습니다.(영업일 최대 3일 내 환불 예정)</p></div>\n';
+					}
+					// 반품완료
+					if (cre.chgStat == 'G685_60') {
+						tag += '									<div class="order_text"><p>반품이 완료되었습니다.</p></div>\n';
+					}
+					// 반품철회
+					if (cre.chgStat == 'G685_69') {
+						tag += '									<div class="order_text"><p>요청하신 반품을 취소하였습니다.</p></div>\n';
+					}
+					tag += '								</div>\n';
+				});
+				tag += '							</div>\n';
+				tag += '						</div>\n';
+			});
+		} else {
+			// 데이터 없음 표시
+			tag += '						<div class="nodata">';
+			tag += '							<div class="txt_box">';
+			tag += '								<p>';
+			tag += '									취소/반품/교환내역이 없습니다.<br>';
+			tag += '								</p>';
+			tag += '							</div>';
+			tag += '						</div>';
+		}
+
+		return tag;
+	}
+	
+	// 취반교 상세 페이지 이동
+	var fnGoToCreDetail = function(param) {
+		let ordChgSq = $(param).attr('ordChgSq');
+		let chgGb = $(param).attr('chgGb');
+		
+		console.log('ordChgSq : ' + ordChgSq);
+		console.log('chgGb : ' + chgGb);
+		// TODO
+		// 취반교 상세 페이지 이동
+	}
+	
+	// 취반교 신청 취소 버튼 클릭 이벤트
+	var fnCreCancel = function(param) {
+		let ordChgSq = $(param).attr('ordChgSq');
+		// TODO
+		// 취반교 신청 철회 처리
+	}
+	
+	// 취반교 결제하기 버튼 클릭 이벤트
+	var fnCrePayAddCost = function(param) {
+		let ordChgSq = $(param).attr('ordChgSq');
+		// TODO
+		// 취반교 추가 배송비 결제 화면 이동 처리
+	}
+	
+	// 취반교 배송조회 버튼 클릭 이벤트
+	var fnGoToDeliveryTrack = function(param) {
+		let ordDtlNo = $(param).attr('ordDtlNo');
+		// TODO
+		// 최반교 배송조회 페이지 이동 처리
+	}
+/*]]>*/
+</script>
+
+</th:block>
+
+</body>
+</html>

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

@@ -152,6 +152,15 @@
 					<input type="hidden" name="edDate" value="" />
 					<input type="hidden" name="custNo" th:value ="${custNo}"/>
 				</form>
+				<form id="exchangeForm" name="exchangeForm" action="#" th:action="@{'/mypage/cre/exchange/detail/form'}" th:method="post">
+					<input type="hidden" name="ordChgSq"/>
+				</form>
+				<form id="returnForm" name="returnForm" action="#" th:action="@{'/mypage/cre/return/detail/form'}" th:method="post">
+					<input type="hidden" name="ordChgSq"/>
+				</form>
+				<form id="cancelForm" name="cancelForm" th:action="@{'/mypage/cre/cancel/detail/form'}" th:method="post">
+					<input type="hidden" name="ordChgSq"/>
+				</form>
 			</div>
 			<!-- // CONT-BODY -->
 		</div>
@@ -173,7 +182,7 @@
 		$('.period_datepicker').datepicker();
 
 		// 셀렉트박스 활성화
-		$('.select_custom.order_status').each(function(index) {
+		$('.select_custom.demand_status').each(function(index) {
 			new sCombo($(this));
 		});
 
@@ -184,7 +193,7 @@
 		gagaPaging.init('searchForm', fnSearchCallback, 'paging', 5, 10);
 		
 		// Load data
-		//gagaPaging.load(1);
+		gagaPaging.load(1);
 	});
 	
 	// 검색기간 버튼 클릭 이벤트 처리
@@ -262,7 +271,7 @@
 	}
 
 	// 주문상세상태코드 셀렉트박스 변경 이벤트
-	$('.select_custom.order_status').find('li').on('click', function() {
+	$('.select_custom.demand_status').find('li').on('click', function() {
 		$('#searchForm input[name=chgStat]').val($(this).attr('code'));
 	});
 
@@ -280,7 +289,7 @@
 				} else {
 					tag += '								<p>주문일 <span>' + creList.ordDt + '</span></p>\n';
 				}
-				tag += '								<a href="javascript:void(0)" ordChgSq="' + creList.ordChgSq + '" onclick="fnGoToCreDetail(this)">상세보기</a>\n';
+				tag += '								<a href="javascript:void(0)" ordChgSq="' + creList.ordChgSq + '" chgGb="' + creList.oneData.chgGb + '" onclick="fnGoToCreDetail(this)">상세보기</a>\n';
 				tag += '							</div>\n';
 				tag += '							<div class="goods_cont">\n';
 				$.each(creList.creList, function (index, cre) {
@@ -453,6 +462,11 @@
 	
 	// 취반교 상세 페이지 이동
 	var fnGoToCreDetail = function(param) {
+		let ordChgSq = $(param).attr('ordChgSq');
+		let chgGb = $(param).attr('chgGb');
+		
+		console.log('ordChgSq : ' + ordChgSq);
+		console.log('chgGb : ' + chgGb);
 		// TODO
 		// 취반교 상세 페이지 이동
 	}

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

@@ -94,8 +94,7 @@
 								<div>
 									<ul>
 										<li id="SearchUseGiftcard"><a href="javascript:void(0);" >사용내역</a></li>
-										<li id="SearchOwnGiftcard"><a href="javascript:void(0);" >보유
-												상품권</a></li>
+										<li id="SearchOwnGiftcard"><a href="javascript:void(0);" >보유상품권</a></li>
 									</ul>
 								</div>
 							</div>
@@ -208,7 +207,7 @@
 				tmtbHtml += '<div class="txt_content">'	+ useGiftcard.goodsNm + '</div>';
 				tmtbHtml += '</td>';
 				tmtbHtml += '<td><span class="amount_minus"> <em>'
-						+ '-'
+						/* + '-' */
 						+ ' '
 						+ useGiftcard.gfcdAmt.addComma()
 						+ '</em>원';
@@ -280,7 +279,7 @@
 				tmtbHtml2 += '<p class="vch_name">'	+ ownGiftcard.gfcdNm + '</p>';
 				tmtbHtml2 += '<p class="vch_price"><span class="tag primary_line"><em>'	+ ownGiftcard.chgGfcdAmt.addComma()	+ '</em>원권</span></p>';
 				if (ownGiftcard.rmGfcdAmt > 0) {
-					tmtbHtml2 += '<p class="vch_remain">'+ ownGiftcard.rmGfcdAmt.addComma()+ '원</p>';
+					tmtbHtml2 += '<p class="vch_remain">잔액<span><em>'+ ownGiftcard.rmGfcdAmt.addComma()+ '</em></span></p>';
 				} else {
 					tmtbHtml2 += '<p class="vch_remain">전액소진</p>';
 				}
@@ -301,7 +300,7 @@
 	}
 
 	function fnChangeDate(obj) {
-
+		
 		var seletedDate = obj.toString();
 		var splitMonth = seletedDate.substr(4);
 

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

@@ -407,7 +407,7 @@
 											</div>
 											<div class="include_item" th:if="${paymentInfo.npayPntAmt > 0}">
 												<dt>마일리지 사용</dt>
-												<dd><em th:text="|- ${#numbers.formatInteger(paymentInfo.npayPntAmt, 1, 'COMMA')}|"></em>원</dd>
+												<dd><em th:text="|- ${#numbers.formatInteger(orderAmtInfo.npayPntAmt, 1, 'COMMA')}|"></em>원</dd>
 											</div>
 											<div class="include_item" th:if="${paymentInfo.pgCpnAmt > 0}">
 												<dt>제휴할인</dt>
@@ -421,7 +421,7 @@
 												<dt>결제 금액</dt>
 												<dd>
 													<div class="price">
-														<span class="pay_total_price"><em th:text="${#numbers.formatInteger(orderAmtInfo.realOrdAmt + orderAmtInfo.realDelvAmt, 1, 'COMMA')}"></em>원</span>
+														<span class="pay_total_price"><em th:text="${#numbers.formatInteger(orderAmtInfo.payAmt - orderAmtInfo.npayPntAmt, 1, 'COMMA')}"></em>원</span>
 													</div>
 												</dd>
 											</div>
@@ -500,6 +500,7 @@
 	let oneData = [[${oneData}]];
 	let paymentInfo = [[${paymentInfo}]];
 	let orderAmtInfo = [[${orderAmtInfo}]];
+	let deliveryAddrInfo = [[${deliveryAddrInfo}]];
 	let kcpReceiptUrl = [[${@environment.getProperty('pg.kcp.receipt.url')}]];
 	let jsonObj = {};
 
@@ -587,7 +588,7 @@
 
 	// 배송지 정보 설정
 	var delvAddrSet = function(delvObj) {
-		let custDelvAddrSq = delvObj.custDelvAddrSq;
+		let delvAddrSq = deliveryAddrInfo.delvAddrSq;
 		let recipNm = delvObj.recipNm;
 		let recipPhnno = delvObj.recipPhnno;
 		let recipZipcode = delvObj.recipZipcode;
@@ -602,7 +603,7 @@
 		
 		let url = '/mypage/change/delvery/addr';
 		let data = {};
-		data.custDelvAddrSq = custDelvAddrSq;
+		data.delvAddrSq = delvAddrSq;
 		data.recipNm = recipNm;
 		data.recipPhnno = recipPhnno;
 		data.recipZipcode = recipZipcode;

+ 4 - 17
src/main/webapp/WEB-INF/views/web/order/OrderCompleteWeb.html

@@ -48,7 +48,7 @@
 									</div>
 									<div class="closedate">
 										<dt>입금마감</dt>
-										<dd><span  th:text="|${orderInfo.vaDeadline}"></span>까지</dd>
+										<dd><span th:text="|${orderInfo.vaDeadline}"></span>까지</dd>
 									</div>
 								</th:block>
 								<!-- //무통장 입금 결제시 -->
@@ -359,7 +359,8 @@ var delvAddrSet = function(delvObj) {
 	
 	// 변수값 설정
 	var jsonObj = {
-		"delvAddrSq" 		: delvAddrSq
+		"ordNo" 			: ordNo
+		, "delvAddrSq" 		: delvAddrSq
 		, "recipNm"			: delvObj.recipNm
 		, "recipPhnno"		: delvObj.recipPhnno
 		, "recipZipcode"	: delvObj.recipZipcode
@@ -367,14 +368,6 @@ var delvAddrSet = function(delvObj) {
 		, "recipDtlAddr"	: delvObj.recipDtlAddr
 		, "delvMemo"		: delvObj.delvMemo
 	}
-	
-	gagajf.ajaxJsonSubmit(
-		"/common/updateDeliverAddr"
-		, JSON.stringify(jsonObj)
-		, function (result) {
-			mcxDialog.alert("수정되었습니다.");
-		}
-	)
 }
 
 // 1.19 배송메모설정
@@ -391,13 +384,7 @@ var delvMemoSet = function(delvMemoObj) {
 	
 	$("#delvMemo").text(delvMemoObj.delvMemo);
 	
-	gagajf.ajaxJsonSubmit(
-		"/common/updateDeliverAddrDelvMemo"
-		, JSON.stringify(jsonObj)
-		, function (result) {
-			mcxDialog.alert("수정되었습니다.");
-		}
-	)
+	
 }
 
 

+ 0 - 3
src/main/webapp/WEB-INF/views/web/order/OrderCouponApplyPopWeb.html

@@ -148,9 +148,6 @@ $(document).ready( function() {
 		var od_coupon_modify_selecter1 = new sCombo($(this));
 	});
 });
-//팝업 - 할인혜택 > 상품쿠폰변경 선택           
-//var od_coupon_modify_selecter1 = new sCombo('.od_pop.couponModify_pop #item1 .select_custom.coupon_list');
-//var od_coupon_modify_selecter2 = new sCombo('.od_pop.couponModify_pop #item2 .select_custom.coupon_list');
 </script>
 
 </html>

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

@@ -32,6 +32,8 @@
 	<input type="hidden" name="custNm" 		th:value="${custemerInfo.custNm}"/>
 	<input type="hidden" name="email" 		th:value="${custemerInfo.email}"/>
 	<input type="hidden" name="cellPhnno" 	th:value="${custemerInfo.cellPhnno}"/>
+	<input type="hidden" name="sexGb" 		th:value="${custemerInfo.sexGb}"/>
+	<input type="hidden" name="birthYmd" 	th:value="${custemerInfo.birthYmd}"/>
 	
 	<div class="area_mbinfo">
 		<dl>

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

@@ -139,7 +139,7 @@
 								<!-- 스타일 포인트 3만원 이상 결제시 노출 -->
 								<th:block th:if="${orgGoodsSumAmt} >= 30000">
 									<div class="input_wrap">
-										<input type="text" name="pntDcAmtStr" class="form_control" maxlength="11" placeholder="사용할 포인트를 입력해주세요." onkeypress="return checkNumber(event);" onblur="return checkPntDcAmt(event);">
+										<input type="text" name="pntDcAmtStr" class="form_control" maxlength="11" placeholder="사용할 포인트를 입력해주세요." onkeyup="inputNumberFormat(this);">
 										<button type="button" class="btn btn_dark btn_sm" id="btn_point_apply">
 											<span>적용</span>
 										</button>
@@ -174,7 +174,7 @@
 							<div class="form_field">
 								<input type="hidden" name="rmGfcdAmt" th:value="${rmGfcdAmt}"/>
 								<div class="input_wrap">
-									<input type="text" name="gfcdUseAmtStr" class="form_control" maxlength="11" placeholder="사용할 금액을 입력해주세요." onkeypress="return checkNumber(event);" onblur="return checkGfcdAmt(event);">
+									<input type="text" name="gfcdUseAmtStr" class="form_control" maxlength="11" placeholder="사용할 금액을 입력해주세요." onkeyup="inputNumberFormat(this);">
 									<button type="button" class="btn btn_dark btn_sm" id="btn_gfcd_apply">
 										<span>적용</span>
 									</button>

+ 29 - 17
src/main/webapp/WEB-INF/views/web/order/OrderFormWeb.html

@@ -31,6 +31,7 @@
 
 <!-- 주문금액정보표현 -->
 <form id="orderAmtForm" name="orderAmtForm">
+	<!-- 주문자정보 -->
 	<table border="1" style="font-size:10px; text-align:center; margin-top:20px; display:none; width:100%;" name="orderInfo" id="orderInfo">
 		<tbody>
 			<tr style="height:30px;">
@@ -43,6 +44,8 @@
 				<th>recipBaseAddr</th>
 				<th>recipDtlAddr</th>
 				<th>delvMemo</th>
+				<th>sexGb</th>
+				<th>birthYmd</th>
 			</tr>
 			<tr style="height:30px;">
 				<td class="custNm"></td>
@@ -54,9 +57,12 @@
 				<td class="recipBaseAddr"></td>
 				<td class="recipDtlAddr"></td>
 				<td class="delvMemo"></td>
+				<td class="sexGb"></td>
+				<td class="birthYmd"></td>
 			</tr>
 		</tbody>
 	</table>
+	<!-- //주문자정보 -->
 	
 	<!-- 사은품정보 -->
 	<table border="1" style="font-size:10px; text-align:center; margin-top:20px; display:none; width:100%;" name="freegiftInfo">
@@ -73,6 +79,7 @@
 			<td class="freegiftGoodsArr"></td>
 		</tr>
 	</table>
+	<!-- //사은품정보 -->
 	
 	<!-- 주문상세금액 -->
 	<table border="1" style="font-size:10px; text-align:center; margin-top:20px; display:none; width:100%;" name="orderDetailInfo" id="orderDetailInfo">
@@ -165,6 +172,7 @@
 			</th:block>
 		</th:block>
 	</table>
+	<!-- //주문상세금액 -->
 	
 	<!-- 배송단위목록 -->
 	<table border="1" style="font-size:10px; text-align:center;  margin-top:20px; display:none; width:100%;" name="delvFeeCdInfo" id="delvFeeCdInfo">
@@ -185,6 +193,7 @@
 			</tr>
 		</th:block>
 	</table>
+	<!-- //배송단위목록 -->
 	
 	<!-- 주문금액합계 -->
 	<table border="1" style="font-size:10px; text-align:center;  margin-top:20px; display:none; width:100%;" name="orderSumAmtInfo" id="orderSumAmtInfo">
@@ -227,6 +236,7 @@
 			<td class="savePntSumAmt">0</td>
 		</tr>
 	</table>
+	<!-- //주문금액합계 -->
 </form>
 <!-- //주문금액정보표현 -->
 
@@ -585,6 +595,9 @@ var custemerInfoSet = function() {
 				$("#orderAmtForm .custNm").text($("#orderForm input[name='custNm']").val());
 				$("#orderAmtForm .email").text($("#orderForm input[name='email']").val());
 				$("#orderAmtForm .cellPhnno").text($("#orderForm input[name='cellPhnno']").val());
+				
+				$("#orderAmtForm .sexGb").text($("#orderForm input[name='sexGb']").val());
+				$("#orderAmtForm .birthYmd").text($("#orderForm input[name='birthYmd']").val());
 			}
 			// 1.2 배송정보로드
 			deliveryAddrInfoSet(jsonObj, true);
@@ -1036,6 +1049,8 @@ var paymentInfoSet = function() {
 						,"recipBaseAddr"		: $("#orderAmtForm .recipBaseAddr").text()
 						,"recipDtlAddr"			: $("#orderAmtForm .recipDtlAddr").text()
 						,"delvMemo"				: $("#orderAmtForm .delvMemo").text()
+						,"sexGb"				: $("#orderAmtForm .sexGb").text()
+						,"birthYmd"				: $("#orderAmtForm .birthYmd").text()
 						,"prePntDcAmtYn"		: prePntDcAmtYn
 						,"orderDetailList"		: orderDetailList
 						,"delvFeeCdList"		: delvFeeCdList
@@ -1221,7 +1236,7 @@ var dcAmtInfoSet = function() {
 				$("#btn_point_apply").on("click", function(){
 					var rmPntAmt 			= parseInt($("#orderForm input[name='rmPntAmt']").val());
 					var freegiftUsePnt 		= parseInt($("#orderAmtForm .freegiftUsePnt").text());
-					var pntDcAmt 			= parseInt($("#orderForm input[name='pntDcAmtStr']").val());
+					var pntDcAmt 			= parseInt(uncomma($("#orderForm input[name='pntDcAmtStr']").val()));
 					var realOrdAmt 			= parseInt($("#orderAmtForm .realOrdSumAmt").text());
 					var applyPntDcAmt 		= (realOrdAmt * 40) / 100;
 					
@@ -1276,7 +1291,7 @@ var dcAmtInfoSet = function() {
 				// 1.8.8 상품권 적용버튼 기능
 				$("#btn_gfcd_apply").on("click", function(){
 					var rmGfcdAmt 		= parseInt($("#orderForm input[name='rmGfcdAmt']").val());
-					var gfcdUseAmt 		= parseInt($("#orderForm input[name='gfcdUseAmtStr']").val());
+					var gfcdUseAmt 		= parseInt(uncomma($("#orderForm input[name='gfcdUseAmtStr']").val()));
 					
 					if (gagajf.isNull($("#orderForm input[name=gfcdUseAmtStr]").val())) {
 						mcxDialog.alert("사용할 금액을 입력해주세요.");
@@ -1945,7 +1960,7 @@ var custCpnSumAmtCal = function() {
 			leftGfcdAmt		= leftGfcdAmt - gfcdUseAmt1;
 		}
 		
-		var realOrdAmt1		= ordAmt - dcSumAmt - (pntDcAmt1 - gfcdUseAmt1);
+		var realOrdAmt1		= ordAmt - dcSumAmt - pntDcAmt1 - gfcdUseAmt1;
 		realOrdSumAmt		= realOrdSumAmt + realOrdAmt1;
 		
 		$(this).parent().find(".pntDcAmt1").text(pntDcAmt1);
@@ -2222,25 +2237,22 @@ var getZeroMinusDelAmt = function(tempAmt) {
 	return rtnAmtStr;
 }
 
-// 숫자만체크
-var checkNumber = function(event) {
-	if (event.key >= 0 && event.key <= 9) {
-		return true;
-	}
-	return false;
+//START ::: 2021.04.09 숫자입려 천단위 찍기
+var inputNumberFormat = function(obj) {
+    obj.value = comma(uncomma(obj.value));
 }
 
-// 포인트 유효성 체크
-var checkPntDcAmt = function(event) {
-
-	return true;
+var comma = function(str) {
+    str = String(str);
+    return str.replace(/(\d)(?=(?:\d{3})+(?!\d))/g, '$1,');
 }
 
-//포인트 유효성 체크 
-var checkGfcdAmt = function(event) {
-	
-	return true;
+var uncomma = function(str) {
+    str = String(str);
+    return str.replace(/[^\d]+/g, '');
 }
+// 2021.04.09 숫자입려 천단위 찍기 ::: END 
+
 
 </script>
 

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

@@ -75,7 +75,7 @@
 							</th:block>
 						</th:block>
 						<div class="gift">
-							<input type="radio" th:name="'rdi-gift'+${i.count}" th:id="${i.count}+'0'" class="chk_img freegiftRdo" value="noSel" usepoint="0" allYn="N"> 
+							<input type="radio" th:name="'rdi-gift'+${i.count}" th:id="${i.count}+'0'" class="chk_img freegiftRdo" value="noSel" usepoint="0" allYn="N" checked> 
 							<label th:for="${i.count}+'0'">
 								<span class="thumb"><img src="/images/pc/thumb/tmp_gift_empty.jpg" width=""alt=""></span> 
 								<span class="name">사은품 수령안함</span>

+ 4 - 0
src/main/webapp/WEB-INF/views/web/order/OrderNoMemberWeb.html

@@ -46,6 +46,8 @@
 				<div class="cont_body">
 					<form class="form_wrap form_col_c form_full" id="orderForm" th:action="@{'/order/form'}" th:method="post">
 						<input type="hidden" name="shotDelvUseYn" th:value="${order.shotDelvUseYn}" /><!-- 장바구니화면 총알배송사용여부 -->
+						<input type="hidden" name="sexGb" />
+						<input type="hidden" name="birthYmd" />
 						<!-- 장바구니화면 시퀀스 배열 등록 -->
 						<th:block th:each="cartSq , index : ${order.cartSqArr}">
 							<input type="hidden" name="cartSqArr" th:value="${cartSq}" />
@@ -233,6 +235,8 @@ var fnUpdateAuthInfoCallback = function (result) {
 	
 	$('#orderForm input[name=custNm]').val(result.sName);
 	$('#orderForm input[name=cellPhnno]').val(result.sMobileNo);
+	$('#orderForm input[name=sexGb]').val(result.sGender);
+	$('#orderForm input[name=birthYmd]').val(result.sBirthDate);
 }
 
 // 우편번호 DAUM을 이용한 우편번호 팝업 레이어

+ 18 - 3
src/main/webapp/WEB-INF/views/web/planning/PlanningCustGradeBenefitFormWeb.html

@@ -43,7 +43,7 @@
 									이번 달 회원등급은<br />
 									<span class="my_rank" th:text="${customerInfo.custGradeNm}">GOLD</span> 입니다.
 								</p>
-								<button type="button" id="btnDownGradeCoupon" class="btn btn_dark cou_btn" >등급 쿠폰 다운로드</button>
+								<button type="button" id="btnGradeCoupon" class="btn btn_dark cou_btn" >등급 쿠폰 다운로드</button>
 							</div>
 							<!-- 회원 등급 progress바 -->
 							<div class="my_rank_progress">
@@ -359,10 +359,25 @@
 		}
 	}
 
-	$('#btnDownGradeCoupon').on('click', function () {
-		gagajf.ajaxJsonSubmit('')
+	$('#btnGradeCoupon').on('click', function () {
+		let params = JSON.stringify({});
+		gagajf.ajaxJsonSubmit('/planning/event/custgrade/coupon/down', params, fnDownloadCallback)
 	});
 
+ 	var fnDownloadCallback = function (result) {
+ 		let message = '이미 쿠폰을 다운로드하셨습니다.';
+		if (result.isDownload) {
+			message = '모두 다운로드되었습니다. 쿠폰 정보는 마이페이지 > 나의 쿠폰에서 확인하실 수 있습니다.';
+		}
+
+		mcxDialog.alertC(message, {
+			sureBtnText: "확인",
+			sureBtnClick: function () {
+			}
+		});
+
+	}
+
 	$(document).ready(function() {
 
 		fnInit();

+ 116 - 66
src/main/webapp/WEB-INF/views/web/planning/PlanningDetailFormWeb.html

@@ -126,14 +126,16 @@
 								<div class="cmt_thumb">
 									<div class="form_field">
 										<div class="imgUpload">
-											<label for="fileAdd" class="fileAdd" onclick="fnFileAdd()">업로드</label>
-											<input type="file" id="fileAdd" name="files[]" />
-											<input type="hidden" id="orgFileNm" name="orgFileNm">
-											<input type="hidden" id="sysFileNm" name="sysFileNm">
+											<label for="fileAdd" class="fileAdd">업로드</label>
+											<input type="file" id="fileAdd" name="files" />
+											<th:block th:each="num: ${#numbers.sequence(1,10)}">
+											<input type="hidden" th:id="${'orgFileNm' + num}" name="orgFileNm" >
+											<input type="hidden" th:id="${'sysFileNm' + num}" name="sysFileNm">
+											</th:block>
 										</div>
 									</div>
 								</div>
-								<button type="submit" class="btn btn_dark"><span>등록</span></button>
+								<button type="button" class="btn btn_dark" onclick="fnReplySave()"><span>등록</span></button>
 							</form>
 						</div>
 						<div class="cmt_group" id="replyList">
@@ -244,6 +246,11 @@
 <form id="pollListForm" name="pollListForm" th:action="@{'/planning/event/poll/form'}" th:method="post">
 	<input type="hidden" name="planSq" th:value="${planInfo.planSq}"/>
 </form>
+<form id="searchForm" name="searchForm" th:action="@{/planning/reply/list}" th:method="post">
+	<input type="hidden" name="pageNo" value="1" />
+	<input type="hidden" name="planSq" th:value="${planInfo.planSq}" />
+	<input type="hidden" name="pageSize" value="10" />
+</form>
 
 <!-- 댓글 이미지 팝업 -->
 	<div class="modal fade thumb_img_pop" id="thumbImgPop" tabindex="-1" role="dialog" aria-labelledby="thumbImgLabel" aria-hidden="true">
@@ -268,7 +275,7 @@
         </div>        
     </div>
 	<!-- //댓글 이미지 팝업 -->	    
-
+<script src="/ux/plugins/gaga/gaga.paging.js"></script>
 <script th:inline="javascript">
 
 let review = [[${reviewInfo}]];
@@ -743,67 +750,69 @@ var fnTextConfirm = function() {
 	}
 }
 
-// 파일 업로드 확인
-var fnFileAdd = function() {
-	//로그인 확인
-	if (!cfCheckLogin()) {
-		mcxDialog.alert("로그인 후 참여 가능합니다.");
-		$("#replyText").val('');
-		return false;
-	}
+var ajaxReplyList = function () {
+	gagaPaging.init('searchForm', fnSearchCallback, 'paging', 10);
+	gagaPaging.load(1);
+	 /* $.getJSON('/planning/reply/list?planSq='+plan.planSq, function(result, status) { */
+		
+	/*  }); */
 }
 
-var ajaxReplyList = function () {
-	 $.getJSON('/planning/reply/list?planSq='+plan.planSq, function(result, status) {
-		 $("#replyList").html('');
-		 if (status == 'success') {
-			 var html = '';
-			 html += '<div class="cmt_list_tit">';
-			 html += '	<strong>댓글</strong><span class="cnt">('+result.replyList.length.addComma()+')</span>';
-			 html += '</div>';
-			 if (result.replyList.length>0) {
-				 html += '<ul class="cmt_list">';
-				 $.each(result.replyList, function (idx, item) {
-					 html += '	<li>';
-					 html += '		<div class="cmt_top">';
-					 html += '			<span class="writer">'+item.maskingCustId+'</span>';
-					 html += '			<span class="date">'+item.entryDt+'</span>';
-					 html += '		</div>';
-					 html += '		<div class="cmt_cont">';
-					 html += '			<div class="img_wrap clear">';
-					 html += '				<span class="pics"><img class="picsThumbs" src="/images/pc/thumb/ev_list_img01.jpg" alt="썸네일"></span>';
-					 html += '				<span class="pics"><img class="picsThumbs" src="/images/pc/thumb/ev_list_img02.jpg" alt="썸네일"></span>';
-					 html += '				<span class="pics"><img class="picsThumbs" src="/images/pc/thumb/ev_list_img03.jpg" alt="썸네일"></span>';
-					 html += '				<span class="pics"><img class="picsThumbs" src="/images/pc/thumb/ev_list_img04.jpg" alt="썸네일"></span>';
-					 html += '			</div>';
-					 html += '			<p>'+item.entryVal1+'</p>';
-					 if (item.entryCustNo == result.custNo) {
-						 html += '			<button class="btn btn_default btn_del"><span>삭제</span></button>';
-					}
-					 html += '		</div>';
-					 html += '	</li>';
-				 });
-				 html += '</ul>';
-			}else{
-				html += '<div class="nodata" id="replyNoData"> ';
-				html += '	<div class="txt_box">             ';
-				html += '		<p>                           ';
-				html += '			등록된 댓글이 없습니다.             ';
-				html += '		</p>                          ';
-				html += '	</div>                            ';
-				html += '</div>                                ';
-			}
-			 
-		 }
-		 $("#replyList").append(html);
-	 });
+var fnSearchCallback = function (result) {
+	 $("#replyList").html('');
+	 if (result!=null) {
+		 var html = '';
+		 html += '<div class="cmt_list_tit">';
+		 html += '	<strong>댓글</strong><span class="cnt">('+result.replyList.length.addComma()+')</span>';
+		 html += '</div>';
+		 if (result.replyList.length>0) {
+			 html += '<ul class="cmt_list">';
+			 $.each(result.replyList, function (idx, item) {
+				 html += '	<li>';
+				 html += '		<div class="cmt_top">';
+				 html += '			<span class="writer">'+item.maskingCustId+'</span>';
+				 html += '			<span class="date">'+item.entryDt+'</span>';
+				 html += '		</div>';
+				 html += '		<div class="cmt_cont">';
+				 html += '			<div class="img_wrap clear">';
+				 html += '				<span class="pics"><img class="picsThumbs" src="/images/pc/thumb/ev_list_img01.jpg" alt="썸네일"></span>';
+				 html += '				<span class="pics"><img class="picsThumbs" src="/images/pc/thumb/ev_list_img02.jpg" alt="썸네일"></span>';
+				 html += '				<span class="pics"><img class="picsThumbs" src="/images/pc/thumb/ev_list_img03.jpg" alt="썸네일"></span>';
+				 html += '				<span class="pics"><img class="picsThumbs" src="/images/pc/thumb/ev_list_img04.jpg" alt="썸네일"></span>';
+				 html += '			</div>';
+				 html += '			<p>'+item.entryVal1+'</p>';
+				 if (item.entryCustNo == result.custNo) {
+					 html += '			<button class="btn btn_default btn_del"><span>삭제</span></button>';
+				}
+				 html += '		</div>';
+				 html += '	</li>';
+			 });
+			 html += '</ul>';
+		}else{
+			html += '<div class="nodata" id="replyNoData"> ';
+			html += '	<div class="txt_box">             ';
+			html += '		<p>                           ';
+			html += '			등록된 댓글이 없습니다.             ';
+			html += '		</p>                          ';
+			html += '	</div>                            ';
+			html += '</div>                                ';
+		}
+		 
+	 }
+	 $("#replyList").append(html);
+	 
+	// Create pagination
+	gagaPaging.createPagination(result.paging.pageable);
 }
 
 $('#fileAdd').on('change', function() { fnChooseFile(this); });
 
-var fnChooseFile = function(obj) {
+var fnChooseFile = function(obj,fileNo) {
+	console.log($(".pics").length);
 	// multiple 속성이 있으면 files에는 다수의 객체가 할당됨
 	var file = obj.files[0];
+	
+	
 
 	if (!gagajf.isNull(file.name)) {
 		var extension = "\.(jpg|jpeg|png)$";
@@ -811,14 +820,16 @@ var fnChooseFile = function(obj) {
 			mcxDialog.alertC('이미지는 [jpg, jpeg, png] 파일만 가능합니다.', {
 				sureBtnText: "확인",
 				sureBtnClick: function() {
-					$(obj).parent('.imgUpload').finId('.removes').trigger('click');
+					$(obj).parent('.imgUpload').find('.removes').trigger('click');
+					console.log('file.size1', file.size);
 				}
 			});
 			return false;
 		}
 	}
-	
-	if (!gagajf.isNull(file.size) && Number(file.size) > 10 * 1000000) {
+	console.log('file.size2', file.size);
+	// 이거 왜 안먹히지 
+	if (!gagajf.isNull(file.size) && Number(file.size) > (10 * 1000000)) {
 		mcxDialog.alertC('이미지는 최대 10MB 이하 파일만 가능합니다.', {
 			sureBtnText: "확인",
 			sureBtnClick: function() {
@@ -829,14 +840,44 @@ var fnChooseFile = function(obj) {
 	}
 	
 	// 파일 업로드
-	gagajf.ajaxFileUpload('/common/file/upload?subDir=/reply'
+	 gagajf.ajaxFileUpload('/common/file/upload?subDir=/reply'
 			, file
 			, function(result) {
 				// 업로드한 파일명 설정
-				$('input[name=' + obj.name + 'OrgFileNm]').val(result.oldFileName);
-				$('input[name=' + obj.name + 'SysFileNm]').val(result.newFileName);
+				$('#orgFileNm' + fileNo).val(result.oldFileName);
+				$('#sysFileNm' + fileNo).val(result.newFileName);
 			}
-	);
+	); 
+}
+
+
+// 댓글 등록 버튼 클릭 시 
+var fnReplySave = function() {
+	var content = $('#replyText').val();
+	if (content.length < 2){
+		mcxDialog.alert("최소 2자 이상 입력해주세요.");
+		return;
+	}
+	
+	var yokList = new Array('개새끼','개색기','개색끼','개자식','개년','개걸래','개걸레','씨발','씨팔','씨부랄','씨바랄','시발','씹창','씹탱','씨방세','씨방새','씨펄','시펄','십탱','씨박','썅','쌍놈','쌍넘','싸가지','쓰벌','씁얼','상넘이','상놈의','상놈이','상놈을','좆','좃','존나게','존만한','같은년','넣을년','버릴년','부랄년','바랄년','미친년','니기미','니미씹','니미씨','니미럴','니미랄','호로','후레아들','호로새끼','후레자식','후래자식','후라들년','후라들넘','빠구리','병신');
+	if(yokList.indexOf(content)>=0){
+		mcxDialog.alert("입력 불가한 내용을 포함하고 있습니다.");
+		$('#replyText').val('');
+		return;
+	}
+	
+	data = {content : content};
+	var jsonData = JSON.stringify(data);
+
+	mcxDialog.confirm("댓글을 등록 하시겠습니까?", {
+		cancelBtnText : "취소",
+		sureBtnText : "확인",
+		sureBtnClick : function() {
+
+		gagajf.ajaxJsonSubmit('/planning/reply/save', jsonData,function() {
+						
+		});
+	}
 }
 
 
@@ -954,8 +995,17 @@ $(document).ready( function() {
     
 	 // 첨부파일 갯수제한
 	$('.imgUpload .fileAdd').click(function(){
+		if (!cfCheckLogin()) {
+			mcxDialog.alert("로그인 후 참여 가능합니다.");
+			$("#replyText").val('');
+			return false;
+		}
+		
 		var maxFileLength = 10; /* 최대 파일 갯수를 입력해 주세요 */
 		var imgFiles=$('.imgUpload .pics');
+		if (imgFiles.length == 10) {
+			$('#fileAdd').hide();
+		}
 		if (imgFiles.length >= maxFileLength) {
 			alert('이미지는 최대' + maxFileLength +'장 까지 첨부 가능합니다.');
 			$('#fileAdd').attr("disabled",true);

+ 12 - 1
src/main/webapp/WEB-INF/views/web/popup/DelvAddrAddPopWeb.html

@@ -24,7 +24,7 @@
 					<label class="input_label sr-only">휴대폰 번호</label>
 					<div class="ui_col_12">
 						<div class="input_wrap"> 
-							<input type="text" name="recipPhnno" placeholder="휴대폰 번호" class="form_control" minlength="10" maxlength="11" required="required" data-valid-type="numeric" data-valid-name="휴대폰"/>
+							<input type="text" name="recipPhnno" placeholder="휴대폰 번호" class="form_control" minlength="10" maxlength="14"/>
 						</div>
 					</div>
 				</div>
@@ -191,6 +191,12 @@ var deliveryAddFormCheck = function() {
 		return false;
 	}
 	
+	if ($("#deliveryAddForm input[name=recipPhnno]").val().length < 10) {
+		mcxDialog.alert("휴대폰번호를 정확히 입력해주세요.");
+		$('#deliveryAddForm input[name=recipPhnno]').focus();
+		return false;
+	}
+	
 	if (gagajf.isNull($("#deliveryAddForm input[name=recipZipcode]").val())) {
 		mcxDialog.alert("배송주소를 입력해주세요.");
 		$('#deliveryAddForm input[name=recipAddr]').focus();
@@ -226,6 +232,11 @@ var fnOpenDaumAddr = function() {
 	});
 	cfnOpenDaumAddr(daumZip);
 }
+
+// 2021.04.09 하이픈처리
+$(document).on("keyup", "#deliveryAddForm input[name=recipPhnno]", function() { 
+	$(this).val( $(this).val().replace(/[^0-9]/g, "").replace(/(^02|^0505|^1[0-9]{3}|^0[0-9]{2})([0-9]+)?([0-9]{4})$/,"$1-$2-$3").replace("--", "-") ); 
+});
 </script>
 
 

+ 18 - 1
src/main/webapp/WEB-INF/views/web/popup/DelvAddrModifyPopWeb.html

@@ -31,7 +31,7 @@
 					<label class="input_label sr-only">휴대폰 번호</label>
 					<div class="ui_col_12">
 						<div class="input_wrap"> 
-							<input type="text" name="recipPhnno" placeholder="휴대폰 번호" class="form_control" minlength="10" maxlength="11" required="required" data-valid-type="numeric" data-valid-name="휴대폰" th:value="${deliveryAddrInfo.recipPhnno}"/>
+							<input type="text" name="recipPhnno" placeholder="휴대폰 번호" class="form_control" minlength="10" maxlength="14" th:value="${deliveryAddrInfo.recipPhnno}"/>
 						</div>
 					</div>
 				</div>
@@ -214,6 +214,18 @@ var deliveryModifyFormCheck = function() {
 		return false;
 	}
 	
+	if (gagajf.isNull($("#deliveryModifyForm input[name=recipPhnno]").val())) {
+		mcxDialog.alert("휴대폰번호를 입력해주세요.");
+		$('#deliveryAddForm input[name=recipPhnno]').focus();
+		return false;
+	}
+	
+	if ($("#deliveryModifyForm input[name=recipPhnno]").val().length < 10) {
+		mcxDialog.alert("휴대폰번호를 정확히 입력해주세요.");
+		$('#deliveryAddForm input[name=recipPhnno]').focus();
+		return false;
+	}
+	
 	if (gagajf.isNull($("#deliveryModifyForm input[name=recipZipcode]").val())) {
 		mcxDialog.alert("배송주소를 입력해주세요.");
 		$('#deliveryModifyForm input[name=recipAddr]').focus();
@@ -250,4 +262,9 @@ var fnOpenDaumAddr = function() {
 	
 	cfnOpenDaumAddr(daumZip);
 }
+
+// 2021.04.09 하이픈처리
+$(document).on("keyup", "#deliveryModifyForm input[name=recipPhnno]", function() { 
+	$(this).val( $(this).val().replace(/[^0-9]/g, "").replace(/(^02|^0505|^1[0-9]{3}|^0[0-9]{2})([0-9]+)?([0-9]{4})$/,"$1-$2-$3").replace("--", "-") ); 
+});
 </script>

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

@@ -43,25 +43,25 @@
                             <div class="item_prod" th:class="${SocialData.stockQtySum == 0 ? 'item_prod sold_out' : 'item_prod'}">
                                 <div class="item_state"> <!-- item_state AD soldout -->
                                     <button type="button" th:class="${SocialData.likeIt == 'likeit'}? 'itemLike active' : 'itemLike'" onclick="cfnPutWishList(this);" th:attr="goodsCd=${SocialData.goodsCd}, ithrCd='', contentsLoc='', planDtlSq=''">관심상품 추가</button>
-                                    <a href="javascript:void(0);" class="itemLink" th:onclick="cfnGoToGoodsDetail([[${SocialData.goodsCd}]])">
+                                    <a href="javascript:void(0);" class="itemLink" th:onclick="cfnGoToGoodsDetail([[${SocialData.goodsCd}]])" >
                                         <div class="itemPic">
                                             <img alt="BLUE-a" class=" vLHTC pd_img" th:src="${@environment.getProperty('upload.goods.view') + '/' + SocialData.sysImgNm}">
                                         </div>
                                         <div class="itemSpecialPrice"><span>특가</span></div>
-                                        <p class="itemBrand" th:text="${SocialData.brandKnm}"></p>
+                                        <p class="itemBrand" th:text="${SocialData.brandGroupNm}"></p>
                                         <div class="itemName" th:text="${SocialData.goodsNm}"></div>
-                                        <!-- <div class="itemComment">#주문 폭주 상품</div> -->
+                                       <div class="itemComment" th:if="${SocialData.goodsTnm!=null}" th:text="${SocialData.goodsTnm}"></div>
                                         <p class="itemPrice">
                                              [[${#numbers.formatInteger(SocialData.currPrice,0,'COMMA')} + 원]]
                                             <span class="itemPrice_original" th:text="${#numbers.formatInteger(SocialData.listPrice,0,'COMMA')} + '원'"></span>
 											<span class=" itemPercent" th:text="${#numbers.formatDecimal(SocialData.dcRate,1,0)} + '%'"></span>
                                         </p>
-                                        <div class="shopBagBtn">
-                                            <button class="btn btn_defalt" onclick="AddCart(this)">
+                                    </a>
+                                    	 <div class="shopBagBtn">
+                                            <button type="button" class="btn btn_defalt" onclick="socialAddCart(this)" th:attr="goodsCd=${SocialData.goodsCd}, minOrdQty=${SocialData.minOrdQty}, goodsType=${SocialData.goodsType}, optCd=${SocialData.optCd}">
                                                 <span>쇼핑백 담기</span>
                                             </button>
                                         </div>
-                                    </a>
                                 </div>
                             </div>
                             </th:block>
@@ -73,7 +73,27 @@
     </div>   
 <script th:inline="javascript">
 var socialInfo = [[${socialInfo}]];
+var socialAddCart = function (obj) {
+	let btnType = "C";
+	let params = [];
 
+	let cart = new Object();
+    cart.goodsCd = $(obj).attr("goodsCd");
+	cart.optCd = $(obj).attr("optCd");
+	cart.goodsQty = $(obj).attr("minOrdQty");
+	cart.goodsType = $(obj).attr("goodsType");
+	cart.cartGb = btnType;
+	cart.afLinkCd = $(obj).attr("afLinkCd");
+	cart.ithrCd = "";
+	cart.contentsLoc =  "";
+	cart.planDtlSq = "";
+	params.push(cart); 
+	
+	// 장바구니담기
+	if (params.length > 0){
+		cfnAddCart(params);	
+	} 
+}
 $(function(){
        /* 핫딜 countDown */
        function hotdealTimer() {

+ 12 - 6
src/main/webapp/biz/goodsSession.js

@@ -19,15 +19,19 @@ var fnCreateGoodsList = function(result, ithrCd, contentLoc, goodsUrl, lastPage,
 		tag += '	<div class="item_state">';
 		tag += '		<button type="button" class="itemLike">관심상품 추가</button>';
 		tag += '		<a href="#none" class="itemLink">';
-		tag += '			<div class="rank ranker"><span>'+(rank+(idx+1))+'</span></div>';
+		// tag += '			<div class="rank ranker"><span>'+(rank+(idx+1))+'</span></div>';
 		tag += '			<div class="itemPic">';
 		tag += '				<img alt="BLUE-a" class=" vLHTC pd_img" src="'+goodsUrl+'/'+item.sysImgNm+'">';
 		tag += '			</div>';
-		tag += '			<p class="itemBrand">BRAND NAME</p>';
+		tag += '			<p class="itemBrand">'+item.brandGroupNm+'</p>';
 		tag += '			<div class="itemName">'+item.goodsFullNm+'</div>';
-		tag += '			<p class="itemPrice">80,100';
-		tag += '				<span class="itemPrice_original">89,000</span>';
-		tag += '				<span class=" itemPercent">10%</span>';
+		tag += '			<p class="itemPrice">'+item.currPrice.addComma();
+		tag += '				<span class="itemPrice_original">'+item.listPrice.addComma()+'</span>';
+		if(item.currPrice != item.listPrice){
+			if(item.listPrice != 0){
+		tag += '				<span class="itemPercent">'+ Math.round((item.listPrice - item.currPrice) / (item.listPrice * 1.0) * 100) +'%</span>';
+			}
+		}
 		tag += '			</p>';
 		tag += '			<div class="itemcolorchip">';
 		tag += '				<span class="chip_color35" value="ABM">BEIGE</span>';
@@ -37,7 +41,9 @@ var fnCreateGoodsList = function(result, ithrCd, contentLoc, goodsUrl, lastPage,
 		tag += '			<p class="itemBadge">';
 		tag += '				<span class="badge13">베스트 </span>';
 		tag += '			</p>';
-		tag += '			<div class="itemComment">#주문 폭주 상품</div>';
+		if(item.goodsTnm != null){
+			tag += '			<div class="itemComment">'+item.goodsTnm+'</div>';
+		}
 		tag += '		</a>';
 		tag += '	</div>';
 		tag += '</div>';

+ 1 - 1
src/main/webapp/ux/mo/css/layout_m.css

@@ -238,7 +238,7 @@
 .mb .find_result .form_print_bar ul li span.t_span {width:7.5rem; color:#888;}	
 .mb .btn_group_block {float:none; margin-top:3rem; display:flex;}
 .mb [class^="ico_content_"]::before {margin: 0px auto 1.5rem;}
-.ico_content_find::before {width:3.6rem; height:4.6rem; background:url(../images/ico_content_find.png) no-repeat 50% 50%;}
+.ico_content_find::before {width:3.6rem; height:4.6rem; background:url('/images/mo/ico_content_find.png') no-repeat 50% 50%;}
 
 /* mb_login */
 .mb .mb_login .login_check{font-size:1.2rem; line-height:1.8rem;}

+ 4 - 2
src/main/webapp/ux/pc/css/common.css

@@ -755,7 +755,8 @@ content: "〉";font-size: 12px;padding-left: 8px;
 .itemsGrp.rowtype .item_prod .itemBadge,
 .itemsGrp.rowtype .item_prod .itemcolorchip {display: none;}
 .itemsGrp.rowtype .item_prod .item_state {display:table; width:100%; padding:0;}
-.itemsGrp.rowtype .item_prod .itemLink {display:table-cell; position: relative;vertical-align: middle;width: 100%;height: 420px;padding-left: 330px;padding-right: 50px;}
+/* .itemsGrp.rowtype .item_prod .itemLink {display:table-cell; position: relative;vertical-align: middle;width: 100%;height: 420px;padding-left: 330px;padding-right: 50px;} */
+.itemsGrp.rowtype .item_prod .itemLink {display:table-cell; position: relative;vertical-align: middle;width: 100%;height: 338px;padding-left: 330px;padding-right: 50px;}
 .itemsGrp.rowtype .item_prod .itemLike {left:240px; z-index:99;}
 .itemsGrp.rowtype .item_prod .itemPic {position: absolute; top: 0; left: 0; margin-bottom: 0; padding-top: 0; width: 280px; height: 420px;}
 .itemsGrp.rowtype .item_prod .itemPic .shape {z-index: 89;}
@@ -768,7 +769,8 @@ content: "〉";font-size: 12px;padding-left: 8px;
 .itemsGrp.rowtype .item_prod .itemPrice {font-size: 30px; line-height: 1; font-weight:500; margin-left:0; margin-right:0;}
 .itemsGrp.rowtype .item_prod .itemPrice_original {font-size: 20px; font-weight: 200;}
 .itemsGrp.rowtype .item_prod .itemPercent {font-size: 42px; font-weight:300; line-height: 0.8;}
-.itemsGrp.rowtype .item_prod .shopBagBtn {margin-top:30px;}
+/* .itemsGrp.rowtype .item_prod .shopBagBtn {margin-top:30px;} */
+.itemsGrp.rowtype .item_prod .shopBagBtn {margin-top: 0;position: absolute;bottom: -38px;left: 330px;z-index: 50;}
 .itemsGrp.rowtype .item_prod .shopBagBtn .btn {width:178px; height:52px; border-color:#a7a7a7; color:#222; font-weight:300;}
 .itemsGrp.rowtype .item_prod .shopBagBtn .btn span {position:relative; padding-left:25px; line-height:1;}
 .itemsGrp.rowtype .item_prod .shopBagBtn .btn span::before {content:''; position:absolute; left:0; top:50%; transform:translateY(-50%); width:15px; height:18px; background: url('/images/pc/ico_shopbag.png') no-repeat 50% 50%;}

+ 1 - 1
src/main/webapp/ux/pc/css/layout.css

@@ -2843,7 +2843,7 @@ ul.maintabs li [class^='box_depth'] {display:none; position:absolute; left:100%;
 	[class*="pd_descrp"] {width:1200px; margin-top:80px; padding-top:120px}
 	[class*="pd_descrp"] .cont_body {max-height:1100px; overflow:hidden;}
 	[class*="pd_descrp"] .cont_body.on {max-height:none;}
-	[class*="pd_descrp"] .cont_body > div {position:relative; width:1200px; margin-left:auto; margin-right:auto}
+	[class*="pd_descrp"] .cont_body > div {position:relative; margin-left:auto; margin-right:auto} /* width:1200px; */
 	[class*="pd_descrp"] .descrp_box {}
 	[class*="pd_descrp"] .descrp_box > div {margin-top:40px}
 	[class*="pd_descrp"] .descrp_box > div:first-child {margin-top:0;}

+ 4 - 4
src/main/webapp/ux/style24_link.js

@@ -133,7 +133,6 @@ var cfnGoToPage = function(page, ithrCd) {
  *		 MO : redirectUrl 호출하는 페이지에서 넣어줘야됨
  * </pre>
  * @param  redirectUrl - 모바일에서 사용 페이지이동으로 하기 때문에
- * @param  custparams - 회원정보수정 화면에서 사용함
  * @since  : 2021/02/09
  * @author : jsshin
  */
@@ -146,6 +145,7 @@ var cfnOpenCellphoneCertify = function (redirectUrl, custparams) {
 	if ('P' === _frontGb) {
 		window.open(actionUrl, "popupCellphone", "top=" + popupY + ", left=" + popupX + ", width=" + popupWidth + ", height=" + popupHeight + ", fullscreen=no,menubar=no,status=no,toolbar=no,titlebar=yes,location=no,scrollbar=no");
 	} else {
+		console.log('redirectUrl', redirectUrl);
 		if (!gagajf.isNull(redirectUrl)) {
 			actionUrl = actionUrl + "?redirectUrl=" + redirectUrl;
 			if (!gagajf.isNull(custparams)) {
@@ -300,7 +300,7 @@ function cfnAddCart(cartList) {
  *	 cfnLoginNaver();
  *	 호출된 페이지에서
  *	 PC: fnSnsSigninCallback(userInfo) 콜백 함수 생성 후 가지고 호출 처리
- *	 MO :
+ *	 MO : SnsCallBackFormMob.html 해당 페이지 후 처리
  * </pre>
  * @since  : 2021/02/23
  * @author : jsshin
@@ -326,7 +326,7 @@ var cfnLoginNaver = function (requestGb, chkRememberMe) {
  *	 cfnLoginKakao();
  *	 호출된 페이지에서
  *	 PC: fnSnsSigninCallback(userInfo) 콜백 함수 생성 후 가지고 호출 처리
- *	 MO :
+ *	 MO : SnsCallBackFormMob.html 해당 페이지 후 처리
  * </pre>
  * @since  : 2021/02/23
  * @author : jsshin
@@ -352,7 +352,7 @@ var cfnLoginKakao = function (requestGb, chkRememberMe) {
  *	 cfnLoginYes24();
  *	 호출된 페이지에서
  *	 PC: fnSnsSigninCallback(userInfo) 콜백 함수 생성 후 가지고 호출 처리
- *	 MO :
+ *	 MO : SnsCallBackFormMob.html 해당 페이지 후 처리
  * </pre>
  * @since  : 2021/02/23
  * @author : jsshin