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

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

gagamel 5 лет назад
Родитель
Сommit
a14cec7db8
80 измененных файлов с 2763 добавлено и 3019 удалено
  1. 17 0
      src/main/java/com/style24/front/biz/dao/TsfCartDao.java
  2. 16 0
      src/main/java/com/style24/front/biz/dao/TsfGiftcardDao.java
  3. 20 0
      src/main/java/com/style24/front/biz/service/TsfCartService.java
  4. 0 1
      src/main/java/com/style24/front/biz/service/TsfCouponService.java
  5. 10 2
      src/main/java/com/style24/front/biz/service/TsfGiftcardService.java
  6. 3 0
      src/main/java/com/style24/front/biz/service/TsfOrderChangeService.java
  7. 1 2
      src/main/java/com/style24/front/biz/service/TsfOrderService.java
  8. 7 3
      src/main/java/com/style24/front/biz/thirdparty/Yes24Login.java
  9. 1 1
      src/main/java/com/style24/front/biz/web/TsfCallcenterController.java
  10. 19 8
      src/main/java/com/style24/front/biz/web/TsfCustomerController.java
  11. 18 0
      src/main/java/com/style24/front/biz/web/TsfDisplayController.java
  12. 14 2
      src/main/java/com/style24/front/biz/web/TsfGoodsController.java
  13. 6 3
      src/main/java/com/style24/front/biz/web/TsfIndexController.java
  14. 47 31
      src/main/java/com/style24/front/biz/web/TsfMypageController.java
  15. 160 0
      src/main/java/com/style24/front/biz/web/TsfOrderController.java
  16. 3 4
      src/main/java/com/style24/front/biz/web/TsfPlanningController.java
  17. 1 0
      src/main/java/com/style24/persistence/domain/Goods.java
  18. 22 0
      src/main/java/com/style24/persistence/domain/GoodsSearch.java
  19. 1 0
      src/main/java/com/style24/persistence/domain/Plan.java
  20. 1 1
      src/main/java/com/style24/persistence/domain/Review.java
  21. 37 0
      src/main/java/com/style24/persistence/mybatis/shop/TsfCart.xml
  22. 36 0
      src/main/java/com/style24/persistence/mybatis/shop/TsfDisplay.xml
  23. 38 1
      src/main/java/com/style24/persistence/mybatis/shop/TsfGiftcard.xml
  24. 3 0
      src/main/java/com/style24/persistence/mybatis/shop/TsfGoods.xml
  25. 12 3
      src/main/java/com/style24/persistence/mybatis/shop/TsfOrderChange.xml
  26. 5 1
      src/main/java/com/style24/persistence/mybatis/shop/TsfPlanning.xml
  27. 23 3
      src/main/java/com/style24/persistence/mybatis/shop/TsfPoint.xml
  28. 1 1
      src/main/resources/config/application-locd.yml
  29. 3 1
      src/main/resources/config/application.yml
  30. 3 3
      src/main/webapp/WEB-INF/views/mob/SnsCallBackFormMob.html
  31. 0 2
      src/main/webapp/WEB-INF/views/mob/cart/CartChangeOptionPopupMob.html
  32. 1 4
      src/main/webapp/WEB-INF/views/mob/cart/CartListAjaxFormMob.html
  33. 21 3
      src/main/webapp/WEB-INF/views/mob/cart/CartListFormMob.html
  34. 95 0
      src/main/webapp/WEB-INF/views/mob/customer/JoinCompleteFormMob.html
  35. 492 0
      src/main/webapp/WEB-INF/views/mob/customer/JoinFormMob.html
  36. 45 46
      src/main/webapp/WEB-INF/views/mob/customer/JoinTypeFormMob.html
  37. 1 0
      src/main/webapp/WEB-INF/views/mob/customer/NiceCallbackFormMob.html
  38. 1 0
      src/main/webapp/WEB-INF/views/mob/customer/NiceCellPhoneFormMob.html
  39. 15 1
      src/main/webapp/WEB-INF/views/mob/customer/PasswordFindFormMob.html
  40. 3 3
      src/main/webapp/WEB-INF/views/mob/goods/CardPrmtFormMob.html
  41. 1 2019
      src/main/webapp/WEB-INF/views/mob/goods/GoodsDealDetailFormMob.html
  42. 1 1
      src/main/webapp/WEB-INF/views/mob/goods/GoodsDetailDeliveryFormMob.html
  43. 17 15
      src/main/webapp/WEB-INF/views/mob/goods/GoodsDetailFormMob.html
  44. 31 52
      src/main/webapp/WEB-INF/views/mob/goods/GoodsDetailQnaFormMob.html
  45. 274 33
      src/main/webapp/WEB-INF/views/mob/goods/GoodsIncludeFormMob.html
  46. 1 1
      src/main/webapp/WEB-INF/views/mob/goods/GoodsQnaFormMob.html
  47. 2 2
      src/main/webapp/WEB-INF/views/mob/goods/GoodsReviewPhotoFormMob.html
  48. 17 5
      src/main/webapp/WEB-INF/views/mob/mypage/MypageGiftcardFormMob.html
  49. 220 0
      src/main/webapp/WEB-INF/views/mob/mypage/MypagePointFormMob.html
  50. 1 1
      src/main/webapp/WEB-INF/views/web/SnsCallBackFormWeb.html
  51. 2 0
      src/main/webapp/WEB-INF/views/web/cart/CartChangeOptionPopupWeb.html
  52. 3 3
      src/main/webapp/WEB-INF/views/web/cart/CartListAjaxFormWeb.html
  53. 19 6
      src/main/webapp/WEB-INF/views/web/cart/CartListFormWeb.html
  54. 1 1
      src/main/webapp/WEB-INF/views/web/customer/ConsentUseInfoFormWeb.html
  55. 22 3
      src/main/webapp/WEB-INF/views/web/display/BrandMainFormWeb.html
  56. 243 221
      src/main/webapp/WEB-INF/views/web/display/CategoryGoodsListFormWeb.html
  57. 13 7
      src/main/webapp/WEB-INF/views/web/display/LookbookDetailFormWeb.html
  58. 6 3
      src/main/webapp/WEB-INF/views/web/display/LookbookMainFormWeb.html
  59. 1 1
      src/main/webapp/WEB-INF/views/web/display/MallMainFormWeb.html
  60. 3 3
      src/main/webapp/WEB-INF/views/web/goods/CardPrmtFormWeb.html
  61. 7 6
      src/main/webapp/WEB-INF/views/web/goods/GoodsDealDetailFormWeb.html
  62. 1 1
      src/main/webapp/WEB-INF/views/web/goods/GoodsDetailDeliveryFormWeb.html
  63. 48 31
      src/main/webapp/WEB-INF/views/web/goods/GoodsDetailFormWeb.html
  64. 4 1
      src/main/webapp/WEB-INF/views/web/goods/GoodsDetailQnaFormWeb.html
  65. 3 1
      src/main/webapp/WEB-INF/views/web/goods/GoodsDetailReviewFormWeb.html
  66. 13 19
      src/main/webapp/WEB-INF/views/web/goods/GoodsIncludeFormWeb.html
  67. 1 3
      src/main/webapp/WEB-INF/views/web/goods/GoodsQnaDetailFormWeb.html
  68. 2 0
      src/main/webapp/WEB-INF/views/web/mypage/MypageCreCancelDetailFormWeb.html
  69. 14 3
      src/main/webapp/WEB-INF/views/web/mypage/MypageGiftcardFormWeb.html
  70. 1 0
      src/main/webapp/WEB-INF/views/web/mypage/MypageOrderDetailFormWeb.html
  71. 0 277
      src/main/webapp/WEB-INF/views/web/mypage/MypagePointForm2Web.html
  72. 169 127
      src/main/webapp/WEB-INF/views/web/mypage/MypagePointFormWeb.html
  73. 92 0
      src/main/webapp/WEB-INF/views/web/order/OrderAddPaymentCompleteWeb.html
  74. 100 23
      src/main/webapp/WEB-INF/views/web/order/OrderAddPaymentFormWeb.html
  75. 25 7
      src/main/webapp/WEB-INF/views/web/planning/PlanningDetailFormWeb.html
  76. 175 1
      src/main/webapp/biz/goods.js
  77. 8 1
      src/main/webapp/biz/mypage.js
  78. 1 1
      src/main/webapp/ux/mo/css/common_m.css
  79. 5 3
      src/main/webapp/ux/pc/css/layout.css
  80. 14 7
      src/main/webapp/ux/style24_link.js

+ 17 - 0
src/main/java/com/style24/front/biz/dao/TsfCartDao.java

@@ -291,4 +291,21 @@ public interface TsfCartDao {
 	 * @since 2021. 04. 04
 	 */
 	int updateCartGoodsQty(Cart param);
+
+	/**
+	 * 최근 등록된 상품 100개를 제외한 장바구니 제거
+	 * @param Cart
+	 * @return void
+	 * @author xodud1202
+	 * @since 2021. 04. 16
+	 */
+	void deleteOldCart(Cart param);
+
+	/**
+	 * 장바구니에 없는 장바구니 상세 데이터 삭제
+	 * @return void
+	 * @author xodud1202
+	 * @since 2021. 04. 16
+	 */
+	void deleteCartDetailFromEmptyCart();
 }

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

@@ -68,5 +68,21 @@ public interface TsfGiftcardDao {
 	 */
 	 Collection<GiftCard> getRecentlyDate();
 	 
+	 /**
+	 * 상품권 CUST_GFCD_SQ
+	 *
+	 * @param 
+	 * @author sowon
+	 * @since 2021. 4. 19
+	 */
+	 int getCustGiftCardSq(String gfcdNo);
 	 
+	 /**
+	 * 상품권 hst insert
+	 *
+	 * @param 
+	 * @author sowon
+	 * @since 2021. 4. 19
+	 */
+	 void createCustGiftcardHistory(GiftCard giftcard);
 }

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

@@ -214,6 +214,11 @@ public class TsfCartService {
 			}
 		}
 
+		// 100개 이상 저장된 장바구니 삭제
+		if("C".equals(cartGb) || cartGb.equals(TscConstants.CartGb.CART.value())) {
+			deleteOldCart();
+		}
+
 		result.put("cartSqList", cartSqList);
 		result.put("goodsType", goodsType);
 		result.put("cartGb", cartGb);
@@ -223,6 +228,21 @@ public class TsfCartService {
 		return result;
 	}
 
+	@Transactional("shopTxnManager")
+	public void deleteOldCart() {
+		Cart deleteCart = new Cart();
+		if(TsfSession.isLogin()) {
+			deleteCart.setCustNo(TsfSession.getInfo().getCustNo());
+		} else {
+			deleteCart.setCustNo(0);
+		}
+
+		deleteCart.setJsessionId(TsfSession.getSessionId());
+
+		cartDao.deleteOldCart(deleteCart);
+		cartDao.deleteCartDetailFromEmptyCart();
+	}
+
 	@Transactional("shopTxnManager")
 	public void saveSetTypeCartInfo(Collection<Cart> params, List<Integer> cartSqs) {
 		Cart cart = new Cart();

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

@@ -682,7 +682,6 @@ public class TsfCouponService {
 
 		int count = 0;
 		for (Coupon tmpCoupon : goodsCouponList) {
-
 			for (int i = 0; i < downloadCnt; i++) {
 				CustCoupon custCoupon = new CustCoupon();
 				custCoupon.setCustNo(TsfSession.getInfo().getCustNo());

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

@@ -132,8 +132,16 @@ public class TsfGiftcardService {
 			giftcard.setRmGfcdAmt(Integer.parseInt(param[1])); // 승인금액
 			giftcard.setUseStDate(param2[0]);
 			giftcard.setUseExpDate(param3[0]);
-			
 			giftcardDao.getGiftcardUseConfirm(giftcard);
+			
+			int custGfcdSq = giftcardDao.getCustGiftCardSq(pubNo);
+			giftcard.setCustGfcdSq(custGfcdSq);
+			giftcard.setOccurGb("G074_11");
+			giftcard.setOccurDtlDesc("상품권등록");
+			giftcard.setGfcdAmt(Integer.parseInt(param[1]));
+			
+			giftcardDao.createCustGiftcardHistory(giftcard);
+			
 		}
 
 	}
@@ -148,5 +156,5 @@ public class TsfGiftcardService {
 	 public Collection<GiftCard> getRecentlyDate(){
 		 return giftcardDao.getRecentlyDate();
 	 }
-
+	 
 }

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

@@ -216,6 +216,9 @@ public class TsfOrderChangeService {
 		result.setString("allCanYn", allCanYn);									// 전체 취소 여부
 		result.setString("allLastCanYn", allLastCanYn);							// 전체 마지막 취소 여부
 		result.setString("allCanYnBeforePayment", allCanYnBeforePayment);		// 무통장입금전 전체 취소 여부
+		result.setString("pgTid", cnclRtn.getPgTid());							// PG거래ID
+		result.setString("payMeans", cnclRtn.getPayMeans());					// 결제수단
+		result.setString("pgGb", cnclRtn.getPgGb());							// PG구분
 		result.set("cnclReqList", cnclReqList);									// 취소신청목록
 
 		return result;

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

@@ -332,8 +332,7 @@ public class TsfOrderService {
 			// TB_PAYMENT 등록. 실패시 PG 환불.
 			if(coreOrderDao.insertPayment(result) < 1) {
 				if(TscConstants.PgGb.KCP.value().equals(param.getPgGb()) || TscConstants.PgGb.PAYCO.value().equals(param.getPgGb())) {
-					result.setIpAddress(request.getRemoteAddr());
-					coreKcpService.kcpPayRollBack(result);
+					coreKcpService.kcpCancel(result);
 				} else if (TscConstants.PgGb.KAKAO.value().equals(param.getPgGb())) {
 					coreKakaoPayService.kakaoPayRollBack(param);
 				} else if (TscConstants.PgGb.NAVER.value().equals(param.getPgGb())) {

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

@@ -52,7 +52,8 @@ public class Yes24Login {
 
 	private String id;
 	private String type;
-	private String requestUrl;
+	private String webRequestUrl;
+	private String mobRequestUrl;
 	private String callBackUrl;
 	private String userInfoUrl;
 	private String linkUrl;
@@ -62,7 +63,8 @@ public class Yes24Login {
 	public void init() {
 		id = env.getProperty("yes24.id");
 		type = env.getProperty("yes24.type");
-		requestUrl = env.getProperty("yes24.login.requestUrl");
+		webRequestUrl = env.getProperty("yes24.login.web.requestUrl");
+		mobRequestUrl = env.getProperty("yes24.login.mob.requestUrl");
 		callBackUrl = env.getProperty("yes24.login.callbackUrl");
 		userInfoUrl = env.getProperty("yes24.userInfoUrl");
 		linkUrl = env.getProperty("yes24.linkUrl");
@@ -71,7 +73,8 @@ public class Yes24Login {
 		log.debug("\n\n---- YES24 initialization started ----");
 		log.debug("id: [{}]", id);
 		log.debug("type: [{}]", type);
-		log.debug("requestUrl: [{}]", requestUrl);
+		log.debug("webRequestUrl: [{}]", webRequestUrl);
+		log.debug("mobRequestUrl: [{}]", mobRequestUrl);
 		log.debug("callBackUrl: [{}]", callBackUrl);
 		log.debug("userInfoUrl: [{}]", userInfoUrl);
 		log.debug("linkUrl: [{}]", linkUrl);
@@ -88,6 +91,7 @@ public class Yes24Login {
 	 */
 	public String getAuthorizeUrl(String state) {
 		String idGb = TsfSession.getFrontGb().equals("P") ? "PID" : "MID";
+		String requestUrl = TsfSession.getFrontGb().equals("P") ? webRequestUrl : mobRequestUrl;
 		StringBuilder apiUrlBuilder = new StringBuilder();
 		String redirectUri = GagaFileUtil.getConcatenationPath(PROTOCOL + TsfSession.getHttpServletRequest().getServerName(), callBackUrl);
 		apiUrlBuilder.append(requestUrl)

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

@@ -326,7 +326,7 @@ public class TsfCallcenterController extends TsfBaseController {
 	public GagaResponse createGoodsQna(@RequestBody Counsel counsel) {
 		log.info("createGoodsQna counsel = {}", counsel);
 		counselService.createGoodsQna(counsel);
-		return super.ok(message.getMessage("SUCC_0001"));
+		return super.ok("상품 문의가 등록되었습니다. 빠른 시일 내에 답변드리겠습니다.");
 	}
 
 	/**

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

@@ -324,7 +324,7 @@ public class TsfCustomerController extends TsfBaseController {
 	 * @since 2021. 03. 02
 	 */
 	@GetMapping("/join/type/form")
-	public ModelAndView getJoinWayForm() {
+	public ModelAndView getJoinTypeForm() {
 		ModelAndView mav = new ModelAndView();
 
 		mav.setViewName(super.getDeviceViewName("customer/JoinTypeForm"));
@@ -339,10 +339,17 @@ public class TsfCustomerController extends TsfBaseController {
 	 * @author jsshin
 	 * @since 2021. 02. 05
 	 */
-	@GetMapping("/join/form")
-	public ModelAndView getJoinForm() {
+	@RequestMapping("/join/form")
+	public ModelAndView getJoinForm(@RequestParam(value = "sEncData", required = false) String sEncData
+			, @RequestParam(value = "authMethod", required = false) String authMethod
+			, @RequestParam(value = "custParams", required = false) String custParams) {
+
 		ModelAndView mav = new ModelAndView();
 
+		mav.addObject("sEncData", sEncData);
+		mav.addObject("authMethod", authMethod);
+		mav.addObject("custParams", custParams);
+
 		mav.setViewName(super.getDeviceViewName("customer/JoinForm"));
 
 		return mav;
@@ -351,19 +358,20 @@ public class TsfCustomerController extends TsfBaseController {
 	/**
 	 * 휴대폰 인증 화면
 	 * @param redirectUrl - 모바일사용
-	 * @param custparams - 회원정보 수정시 사용
+	 * @param custParams - 회원정보 수정시 사용
 	 * @return ModelAndView
 	 * @author jsshin
 	 * @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) {
+			, @RequestParam(value = "custParams", required = false) String custParams) {
 		ModelAndView mav = new ModelAndView();
 		GagaMap result = niceCertify.certifyCellPhone();
 
 		if (TscConstants.FrontGb.MOB.value().equals(TsfSession.getFrontGb())) {
 			mav.addObject("redirectUrl", redirectUrl); // 모바일만 사용
+			mav.addObject("custParams", custParams); // 모바일만 사용
 		}
 
 		mav.addObject("sEncData", result.getString("sEncData"));
@@ -405,7 +413,8 @@ public class TsfCustomerController extends TsfBaseController {
 	@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) {
+			, @RequestParam(value = "param_r1", required = false) String redirectUrl
+			, @RequestParam(value = "param_r2", required = false) String custParams) {
 
 		ModelAndView mav = new ModelAndView();
 		String sEncData = "";
@@ -421,6 +430,7 @@ public class TsfCustomerController extends TsfBaseController {
 
 		if (TscConstants.FrontGb.MOB.value().equals(TsfSession.getFrontGb())) {
 			mav.addObject("redirectUrl", redirectUrl);
+			mav.addObject("custParams", custParams);
 		}
 
 		mav.addObject("sEncData", sEncData);
@@ -817,12 +827,13 @@ public class TsfCustomerController extends TsfBaseController {
 	 * @since 2021. 03. 25
 	 */
 	@PostMapping("/consent/useinfo/form")
-	public ModelAndView cnstentUseInfoForm(@RequestBody Customer customer) {
+	public ModelAndView cnstentUseInfoForm(Customer customer) {
 		ModelAndView mav = new ModelAndView();
 
 		mav.addObject("custNm", customer.getCustNm());
 
-		mav.setViewName(super.getDeviceViewName("customer/ConsentUseInfoForm"));
+//		mav.setViewName(super.getDeviceViewName("customer/ConsentUseInfoForm"));
+		mav.setViewName("web/customer/ConsentUseInfoFormWeb");
 
 		return mav;
 	}

+ 18 - 0
src/main/java/com/style24/front/biz/web/TsfDisplayController.java

@@ -415,6 +415,16 @@ public class TsfDisplayController extends TsfBaseController {
 	@GetMapping("/lookbook/main/form")
 	public ModelAndView lookbookMain(Lookbook lookbook) {
 		ModelAndView mav = new ModelAndView(super.getDeviceViewName("display/LookbookMainForm"));
+		// 브랜드그룹 정보 : 브랜드메인 링크에 설정된 기획전으로 들어올때 GNB 변경때문에 사용
+		if(lookbook.getBrandGroupNo() != null && !lookbook.getBrandGroupNo().equals("")){
+			lookbook.setBrandCd(lookbook.getBrandGroupNo().toString());
+			lookbook.setLookbookGb("BL");
+			mav.addObject("brandGroupInfo", displayService.getGnbBrandGroup(lookbook.getBrandGroupNo()));
+		}else{
+			lookbook.setLookbookGb("B");
+			mav.addObject("brandGroupInfo", null);
+		}
+
 		mav.addObject("lbInfo", lookbook);
 		return mav;
 	}
@@ -460,6 +470,8 @@ public class TsfDisplayController extends TsfBaseController {
 		mav.addObject("lookbookDetailList", lookbookList);
 		mav.addObject("otherLookbookList", coreLookbookService.getOtherLookbookList(lookbook));
 		mav.addObject("lookbookInfo", lookbook);
+		// 브랜드그룹 정보 : 브랜드메인 링크에 설정된 기획전으로 들어올때 GNB 변경때문에 사용
+		mav.addObject("brandGroupInfo", displayService.getGnbBrandGroup(lookbook.getBrandGroupNo()));
 
 		mav.setViewName(super.getDeviceViewName("display/LookbookDetailForm"));
 		return mav;
@@ -525,6 +537,12 @@ public class TsfDisplayController extends TsfBaseController {
 		mav.addObject("filterColorList", displayService.getCategoryFilter(cate4Srch, "COLOR"));
 		mav.addObject("filterBenefitList", displayService.getCategoryFilterBenefit(cate4Srch));
 		mav.addObject("sortGb", "new");
+		// 브랜드그룹 정보 : 브랜드메인 링크에 설정된 기획전으로 들어올때 GNB 변경때문에 사용
+		if(cate4Srch.getBrandGroupNo() != null && !cate4Srch.getBrandGroupNo().equals("") && !cate4Srch.getBrandGroupNo().equals(0)){
+			mav.addObject("brandGroupInfo", displayService.getGnbBrandGroup(cate4Srch.getBrandGroupNo()));
+		}else{
+			mav.addObject("brandGroupInfo", null);
+		}
 		mav.addObject("cateInfo", cate4Srch);
 
 		return mav;

+ 14 - 2
src/main/java/com/style24/front/biz/web/TsfGoodsController.java

@@ -3,6 +3,7 @@ package com.style24.front.biz.web;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
+import java.util.HashMap;
 
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -13,6 +14,7 @@ import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.ResponseBody;
 import org.springframework.web.servlet.ModelAndView;
 
@@ -209,6 +211,7 @@ public class TsfGoodsController extends TsfBaseController {
 				// 상품 옵션1(색상) 정보
 				mav.addObject("goodsOption1List", goodsService.getGoodsOption1List(paramsGoods));
 				// 상품 옵션2(사이즈) 정보
+				if (StringUtils.isEmpty(paramsGoods.getMastrGoodsCd())) paramsGoods.setMastrGoodsCd(goods.getGoodsCd());
 				mav.addObject("goodsOption2List", goodsService.getGoodsOption2List(paramsGoods));
 //				} else {
 //					mav.addObject("goodsOptionList", goodsService.getGoodsOptionList(paramsGoods));
@@ -256,7 +259,7 @@ public class TsfGoodsController extends TsfBaseController {
 			}
 			
 		}
-
+		
 		// 상품 문의건수
 		Counsel counsel = new Counsel();
 		counsel.setRelGoodsCd(goods.getGoodsCd());
@@ -283,6 +286,8 @@ public class TsfGoodsController extends TsfBaseController {
 		setTodayGoodsCd(paramsGoods);
 		
 		mav.addObject("params", paramsGoods);
+		mav.addObject("afLinkCd", afLinkCd);	// 파라미터 제휴코드
+		
 
 		if (TscConstants.GoodsType.DEAL.value().equals(goods.getGoodsType())) {
 			if ("Y".equals(mobileYn)) {
@@ -661,6 +666,7 @@ public class TsfGoodsController extends TsfBaseController {
 
 		// 자사 일반상품- 옵션2(사이즈) 정보
 		paramsGoods.setOptCd1(colorCd);
+		if (StringUtils.isEmpty(paramsGoods.getMastrGoodsCd())) paramsGoods.setMastrGoodsCd(goods.getGoodsCd());
 		mav.addObject("goodsOption2List", goodsService.getGoodsOption2List(paramsGoods));
 
 		mav.setViewName(super.getDeviceViewName("goods/GoodsInstockAlarmForm"));
@@ -1285,9 +1291,15 @@ public class TsfGoodsController extends TsfBaseController {
 	 */
 	@GetMapping("/epCoupon/list")
 	@ResponseBody
-	public Collection<Coupon> getEpGouponList(Goods paramsGoods) {
+	public Collection<Coupon> getEpGouponList(@RequestParam HashMap<String, String> paramMap) {
 		// 상품관련 기본값 설정(회원 등급, 앱, PC/모바일 등)
+		Goods paramsGoods = new Goods();
 		setGoods(paramsGoods);
+		
+		// 순서중요 setGoods 이후에 설정
+		paramsGoods.setAfLinkCd(paramMap.get("afLinkCd"));
+		paramsGoods.setGoodsCd(paramMap.get("goodsCd"));
+		paramsGoods.setMaxRownum(Integer.parseInt(paramMap.get("maxRownum")));
 		return couponService.getGoodsEpCouponList(paramsGoods);
 	}
 

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

@@ -16,6 +16,7 @@ import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.ResponseBody;
 import org.springframework.web.servlet.ModelAndView;
@@ -351,12 +352,14 @@ public class TsfIndexController extends TsfBaseController {
 	 * @author jsshin
 	 * @since 2021. 02. 23
 	 */
-	@RequestMapping("/signin/yes24LoginCallback")
-	public ModelAndView yes24LoginCallback(@RequestParam("ipin") String ipin, HttpSession session) {
+	@RequestMapping( "/signin/yes24LoginCallback")
+	public ModelAndView yes24LoginCallback(@RequestParam(value = "ipin", required = false) String ipin
+			, @RequestParam(value = "ipn", required = false) String ipn, HttpSession session) {
 		ModelAndView mav = new ModelAndView();
 		boolean isSnsLoing = false;
 		GagaMap userInfo = new GagaMap();
-
+		log.info("ipn {}", ipn);
+		log.info("ipin {}", ipin);
 		if (StringUtils.isNotBlank(ipin)) {
 			userInfo = yes24Login.getUserInfo(ipin);
 			userInfo.setString("snsType", TscConstants.SnsType.YES24.value());

+ 47 - 31
src/main/java/com/style24/front/biz/web/TsfMypageController.java

@@ -725,6 +725,7 @@ public class TsfMypageController extends TsfBaseController {
 		// @ 결품취소로직 추가
 		// @ 주문취소시 상태값 체크
 		// @ 취소, 반품시 배송비 체크 로직 (선결제 로직)
+		GagaMap result = new GagaMap();
 
 		// 1. 세션회원조회
 		int custNo = TsfSession.getInfo().getCustNo();
@@ -737,36 +738,50 @@ public class TsfMypageController extends TsfBaseController {
 		String allLastCanYn = refundPreInfo.getString("allLastCanYn");
 		String allCanYnBeforePayment = refundPreInfo.getString("allCanYnBeforePayment");
 
-		// 3. 환불금액계산
-		// 2021.01.19 취소신청정보를 목록 (주문상세번호, 취소/반품수량) 으로 표현
-		GagaMap result = coreOrderRefundService.cnclRtnRefundAmt(cnclReqList);
-
-		// 4. 주문변경 기본정보 설정
-		result.set("ordNo", orderChange.getOrdNo());				// 주문번호
-		result.set("ordChgSq", orderChange.getOrdChgSq());			// 주문변경번호
-		result.set("chgReason", orderChange.getChgReason());		// 변경사유
-		result.set("chgMemo", orderChange.getChgMemo());			// 변경메모
-
-		result.set("accountNo", orderChange.getAccountNo());		// 환불계좌번호
-		result.set("accountNm", orderChange.getAccountNm());		// 환불계좌예금주명
-		result.set("bankCd", orderChange.getBankCd());				// 환불계좌은행코드
-
-		result.set("allCanYnBeforePayment", allCanYnBeforePayment);	// 무통장입금전 전체취소 여부
-		result.set("allCanYn", allCanYn);							// 전체취소 여부
-		result.set("allLastCanYn", allLastCanYn);					// 전체 마지막 취소 여부
-		result.set("isCustomer", orderChange.getIsCustomer());		// 변경사유 (고객, 회사)
-
-		// 5. 주문변경 회수지정보 추가
-		// result.set("chgerNm", orderChange.getChgerNm());				// 변경자명
-		// result.set("chgerEmail", orderChange.getChgerEmail());		// 변경자이메일주소
-		// result.set("chgerPhnno", orderChange.getChgerPhnno());		// 변경자핸드폰번호
-		// result.set("chgerTelno", orderChange.getChgerTelno());		// 변경자전화번호
-
-		result.set("reqGbn", orderChange.getReqGbn());				// 신청구분
-		result.set("ipAddress", TsfSession.getIpAddress());			// IP주소
-
-		// 6. 주문변경 DB 등록 (TB_ORDER_CHANGE, TB_ORDER_CHANGE_DETAIL)
-		coreOrderChangeService.cnclComplete(result, custNo);
+		// 전체취소, 부분취소 구분 처리 진행 
+		if ("Y".equals(allCanYn)) {
+			orderChange.setChgGb(TscConstants.OrderChangeGb.CANCEL.value());
+			orderChange.setIpAddress(TsfSession.getIpAddress());
+			orderChange.setRegNo(custNo);
+			orderChange.setUpdNo(custNo);
+			
+			coreOrderChangeService.allCnclComplete(orderChange);
+		} else {
+			// 3. 환불금액계산
+			// 2021.01.19 취소신청정보를 목록 (주문상세번호, 취소/반품수량) 으로 표현
+			result = coreOrderRefundService.cnclRtnRefundAmt(cnclReqList);
+
+			// 4. 주문변경 기본정보 설정
+			result.setInt("ordNo", orderChange.getOrdNo());						// 주문번호
+			result.setInt("ordChgSq", orderChange.getOrdChgSq());				// 주문변경번호
+			result.setString("chgReason", orderChange.getChgReason());			// 변경사유
+			result.setString("chgMemo", orderChange.getChgMemo());				// 변경메모
+
+			result.setString("accountNo", orderChange.getAccountNo());			// 환불계좌번호
+			result.setString("accountNm", orderChange.getAccountNm());			// 환불계좌예금주명
+			result.setString("bankCd", orderChange.getBankCd());				// 환불계좌은행코드
+
+			result.setString("allCanYnBeforePayment", allCanYnBeforePayment);	// 무통장입금전 전체취소 여부
+			result.setString("allCanYn", allCanYn);								// 전체취소 여부
+			result.setString("allLastCanYn", allLastCanYn);						// 전체 마지막 취소 여부
+			result.setString("isCustomer", orderChange.getIsCustomer());		// 변경사유 (고객, 회사)
+
+			// 5. 주문변경 회수지정보 추가
+			// result.setString("chgerNm", orderChange.getChgerNm());				// 변경자명
+			// result.setString("chgerEmail", orderChange.getChgerEmail());			// 변경자이메일주소
+			// result.setString("chgerPhnno", orderChange.getChgerPhnno());			// 변경자핸드폰번호
+			// result.setString("chgerTelno", orderChange.getChgerTelno());			// 변경자전화번호
+
+			result.setString("reqGbn", orderChange.getReqGbn());				// 신청구분
+			result.setString("ipAddress", TsfSession.getIpAddress());			// IP주소
+			result.setInt("custNo", custNo);									// 고객번호
+			result.setString("pgTid", refundPreInfo.getString("pgTid"));		// PG거래ID
+			result.setString("payMeans", refundPreInfo.getString("payMeans"));	// 결제수단
+			result.setString("pgGb", refundPreInfo.getString("pgGb"));			// PG구분
+
+			// 6. 주문변경 DB 등록 (TB_ORDER_CHANGE, TB_ORDER_CHANGE_DETAIL)
+			coreOrderChangeService.cnclComplete(result, custNo);
+		}
 
 		result.set("status", GagaResponseStatus.SUCCESS.getCode());
 		result.set("message", message.getMessage("CANCEL_0001"));
@@ -899,6 +914,7 @@ public class TsfMypageController extends TsfBaseController {
 		OrderChange oneData = (OrderChange) map.get("oneData");
 		mav.addObject("cancelDetailList", map);
 		mav.addObject("oneData", oneData);
+		mav.addObject("refundYn", map.getString("refundYn"));
 
 		// 주문 결제정보 조회
 		Order order = new Order();
@@ -1003,7 +1019,7 @@ public class TsfMypageController extends TsfBaseController {
 		mav.addObject("usePointList", pointService.getUsePointList(point));
 		// 최근 12개월
 		mav.addObject("date", pointService.getRecentlyDate());
-		mav.setViewName(super.getDeviceViewName("mypage/MypagePointForm2"));
+		mav.setViewName(super.getDeviceViewName("mypage/MypagePointForm"));
 		return mav;
 	}
 

+ 160 - 0
src/main/java/com/style24/front/biz/web/TsfOrderController.java

@@ -1138,4 +1138,164 @@ public class TsfOrderController extends TsfBaseController {
 		mav.setViewName("web/order/test");
 		return mav;
 	}
+	
+	/**
+	 * 취소,반품,교환 추가결제화면
+	 *
+	 * @param : ordChgSq
+	 * @return
+	 * @author jsh77b
+	 * @since 2021. 04. 16
+	 */
+	@ResponseBody
+	@RequestMapping(value = "/addPaymentForm")
+	public ModelAndView orderAddPaymentForm(Order order) {
+		
+		ModelAndView mav = new ModelAndView();
+		
+		// 1. 주문번호 체크
+		if (order.getOrdChgSq() == null) {
+			mav.setViewName("redirect:/");
+			return mav;
+		}
+				
+		// 2. 추가결제 상품목록
+		GagaMap resultMap = coreOrderService.getAddPayOrderListInfo(order);
+		
+		// 추가결제 목록이 없으면 메인으로 이동
+		@SuppressWarnings("unchecked")
+		Collection<Order> orderAddPayGoodsList = (Collection<Order>) resultMap.get("orderAddPayGoodsList");
+		
+		if (orderAddPayGoodsList.size() < 1) {
+			mav.setViewName("redirect:/");
+			return mav;
+		}
+		
+		// TODO 주문정보 알림톡전송
+		
+		// 3. 화면전송변수설정
+		mav.addObject("orderAddPayGoodsList"	, orderAddPayGoodsList);					// 주문목록정보
+		mav.addObject("refundAmt"				, resultMap.get("refundAmt"));				// 상품환불금액
+		mav.addObject("addPayCost"				, resultMap.get("addPayCost"));				// 추가결제금액
+		mav.addObject("ordChgSq"				, resultMap.get("ordChgSq"));				// 주문취소신청번호
+		
+		mav.addObject("chgGb"					, resultMap.get("chgGb"));					// 변경구분
+		mav.addObject("chgerNm"					, resultMap.get("chgerNm"));				// 변경신청인
+		mav.addObject("chgerPhnno"				, resultMap.get("chgerPhnno"));				// 변경신청핸드폰번호
+		mav.addObject("goodsNm"					, resultMap.get("goodsNm"));				// 상품명
+		mav.setViewName(super.getDeviceViewName("order/OrderAddPaymentForm"));
+		
+		return mav;
+	}
+	
+	/**
+	 * 추가결제실행
+	 *
+	 * @param
+	 * @return
+	 * @author xodud1202
+	 * @since 2021. 03. 04
+	 */
+	@PostMapping("/addPayment")
+	@ResponseBody
+	public ModelAndView orderAddPayment(@RequestBody Order order) {
+		ModelAndView mav = new ModelAndView();
+		
+		// 1. 로그인체크 후 custNo 설정
+		if (TsfSession.isLogin()) {
+			order.setCustNo(TsfSession.getInfo().getCustNo()); // 고객번호등록
+		} else {
+			order.setJsessionId(TsfSession.getSessionId());
+			order.setCustNo(0);
+		}
+		
+		log.info("order.getPgGb()              ::: {}", order.getPgGb());
+		log.info("order.getPayMeans()          ::: {}", order.getPayMeans());
+		log.info("order.getOrdChgSq()          ::: {}", order.getOrdChgSq());
+		log.info("order.getGoodsNm()           ::: {}", order.getGoodsNm());
+		log.info("order.getAddPayCost()        ::: {}", order.getAddPayCost());
+		log.info("order.getChgerNm()           ::: {}", order.getChgerNm());
+		log.info("order.getChgerPhnno()        ::: {}", order.getChgerPhnno());
+		
+		order.setOrdNo(order.getOrdChgSq());
+		order.setPayAmt(order.getAddPayCost());
+		order.setOrdNm(order.getChgerNm());
+		order.setOrdPhnno(order.getChgerPhnno());
+
+		// 필수 데이터
+		// pgGb = 결제타입, payMeans = 결제수단, ordNo = 주문번호, goodsNm = 상품명, payAmt = 실결제금액, ordNm = 주문자명, ordPhnno = 휴대폰번호, custNo = 고객번호
+		// 선택 데이터
+		// ordEmail = 주문자메일, ordTelno = 전화번호
+		
+		/* 
+		=== 카카오페이 & 네이버페이 파라메터 ===
+		ordNo = 주문번호
+		custNo = 고객번호
+		goodsNm = 상품명
+		ordGoodsQty = 주문상품수량
+		payAmt = 결제금액
+		======================
+		*/
+
+		Payment payment = orderService.setPgDataInfo(order);
+		mav.addObject("payment"	, payment);
+		mav.setViewName(super.getDeviceViewName("pg/kcpOrder"));
+
+		return mav;
+	}
+	
+	/**
+	 * 결제 PG 요청 완료
+	 *
+	 * @param
+	 * @return
+	 * @author xodud1202
+	 * @since 2021. 03. 05
+	 */
+	@ResponseBody
+	@RequestMapping(value = "/addPay/result/response")
+	public ModelAndView addPayResultResponse(Payment param, HttpServletRequest request, HttpServletResponse response) {
+		
+		ModelAndView mav = new ModelAndView();
+		
+		Order order = new Order();
+		
+		// 1. 로그인체크 후 custNo 설정
+		if (TsfSession.isLogin()) {
+			param.setCustNo(TsfSession.getInfo().getCustNo()); // 고객번호등록
+			order.setCustNo(TsfSession.getInfo().getCustNo());
+			order.setRegNo(TsfSession.getInfo().getCustNo());
+			order.setUpdNo(TsfSession.getInfo().getCustNo());
+		} else {
+			param.setCustNo(0);
+			order.setCustNo(0);
+			order.setRegNo(0);
+			order.setUpdNo(0);
+		}
+		
+		param.setUpdNo(param.getCustNo());
+		
+		// 2. 결재정보등록(TB_PAYMENT)
+		param = orderService.orderPgPayResult(param, request, response);
+		
+		order.setOrdChgSq(param.getOrdNo());
+		
+		// 3. 추가결제 상품목록
+		GagaMap resultMap = coreOrderService.getAddPayOrderListInfo(order);
+		
+		// 4. 화면전송변수설정
+		mav.addObject("refundAmt"				, resultMap.get("refundAmt"));				// 상품환불금액
+		mav.addObject("addPayCost"				, resultMap.get("addPayCost"));				// 추가결제금액
+		mav.addObject("ordChgSq"				, resultMap.get("ordChgSq"));				// 주문취소신청번호
+		mav.addObject("chgerNm"					, resultMap.get("chgerNm"));				// 변경신청인
+		mav.addObject("chgerPhnno"				, resultMap.get("chgerPhnno"));				// 변경신청핸드폰번호
+
+		// TODO 3. 주문정보 업데이트
+		coreOrderService.updateOrderChangeDetail(order);
+		
+		// 2021.03.16 주문완료화면이동처리
+		mav.setViewName(super.getDeviceViewName("order/OrderAddPaymentComplete"));
+		
+		return mav;
+	}
 }

+ 3 - 4
src/main/java/com/style24/front/biz/web/TsfPlanningController.java

@@ -171,7 +171,9 @@ public class TsfPlanningController extends TsfBaseController {
 		mav.addObject("planInfo", planInfo);
 
 		mav.addObject("planCount", planningService.getPlanAllCount(plan));
-
+		// 템플릿 순서
+		mav.addObject("templateOrd", planningService.templateDispOrdInfo(plan));
+		
 		// 상단소스
 		plan.setFrontGb("T");
 		mav.addObject("fsrcInfoTop", planningService.getPlanFsrcInfo(plan));
@@ -180,9 +182,6 @@ public class TsfPlanningController extends TsfBaseController {
 		plan.setFrontGb("B");
 		mav.addObject("fsrcInfoBtm", planningService.getPlanFsrcInfo(plan));
 
-		// 템플릿 순서
-		mav.addObject("templateOrd", planningService.templateDispOrdInfo(plan));
-
 		// 리뷰
 		mav.addObject("reviewInfo", planningService.getPlanReviewInfo(review));
 

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

@@ -150,6 +150,7 @@ public class Goods extends TscBaseDomain {
 	private String goodsStatNm;
 	private String regDtMonth;
 	
+	private int goodsQnaCnt;	// 상품문의건수
 
 	private String sizeGb;		// 사이즈구분(T:상의, B:하의, S:신발)
 	private String optionSoldoutSkip; 	//품절제외 Y, N

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

@@ -1,5 +1,6 @@
 package com.style24.persistence.domain;
 
+import com.fasterxml.jackson.annotation.JsonFormat;
 import com.style24.persistence.TscBaseDomain;
 import com.style24.persistence.TscPageRequest;
 import lombok.Data;
@@ -66,4 +67,25 @@ public class GoodsSearch extends TscBaseDomain {
 
     private String contentsLoc;
     private int maxRow;
+
+    @JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+    private String[] brandSearch;
+
+    @JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+    private String[] sizeSearch;
+
+    @JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+    private String[] priceSearch;
+
+    @JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+    private String[] dcrateSearch;
+
+    @JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+    private String[] seasonSearch;
+
+    @JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+    private String[] colorSearch;
+
+    @JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+    private String[] benefitSearch;
 }

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

@@ -181,6 +181,7 @@ public class Plan extends TscBaseDomain {
 	private String itemVal;				//아이템값(상품코드, 이미지파일명 등)
 	private String reviewDispStdt;		//리뷰노출시작일시
 	private String reviewDispEddt;		//리뷰노툴종료일시
+	private String linkOpenGb;			//링크 본창 새창
 
 	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
 	private String[] multiPlanReview;		//리뷰상품목록

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

@@ -28,7 +28,7 @@ public class Review extends TscBaseDomain {
 	private Integer ordDtlNo;		// 주문상세번호
 	private String reviewTitle;		// 상품평제목
 	private String reviewContent;	// 상품평내용
-	private float score;			// 구매평점
+	private String score;			// 구매평점
 	private int height;				// 키
 	private int weight;				// 몸무게
 	private String scoreSize;		// 사이즈점수(공통코드G040)

+ 37 - 0
src/main/java/com/style24/persistence/mybatis/shop/TsfCart.xml

@@ -1136,4 +1136,41 @@
 		WHERE CART_SQ = #{cartSq}
 		AND   CUST_NO = #{custNo}
 	</update>
+
+	<!-- 최근 등록된 상품 100개를 제외한 장바구니 제거 -->
+	<delete id="deleteOldCart" parameterType="Cart">
+		/* TsfCart.deleteOldCart : 최근 등록된 상품 100개를 제외한 장바구니 제거 */
+		DELETE FROM TB_CART C
+		WHERE  C.CART_GB = 'G026_BC'
+		<if test="custNo != null and custNo > 0">
+		AND    C.CUST_NO = #{custNo}
+		</if>
+		<if test="custNo == null or custNo == 0">
+		AND    C.CUST_NO = 0
+		AND    C.JSESSION_ID = #{jsessionId}
+		</if>
+		AND    C.CART_SQ NOT IN (SELECT A.CART_SQ
+		                         FROM   (SELECT CART_SQ
+		                                      , ROW_NUMBER() OVER() AS RNUM
+										 FROM   TB_CART
+										 WHERE  CART_GB = 'G026_BC'
+										 <if test="custNo != null and custNo > 0">
+										 AND    CUST_NO = #{custNo}
+										 </if>
+										 <if test="custNo == null or custNo == 0">
+										 AND    CUST_NO = 0
+										 AND    JSESSION_ID = #{jsessionId}
+										 </if>
+										 ORDER  BY REG_DT DESC
+										 LIMIT  100 ) A
+		                         WHERE   A.RNUM BETWEEN 1 AND 100 )
+	</delete>
+
+	<!-- 장바구니에 없는 장바구니 상세 데이터 삭제 -->
+	<delete id="deleteCartDetailFromEmptyCart">
+		/* TsfCart.deleteCartDetailFromEmptyCart : 장바구니에 없는 장바구니 상세 데이터 삭제 */
+		DELETE FROM TB_CART_DETAIL CD
+		WHERE  CD.CART_SQ NOT IN (SELECT CART_SQ
+								  FROM   TB_CART CA)
+	</delete>
 </mapper>

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

@@ -698,8 +698,43 @@
 		  AND G.SELF_MALL_YN = 'Y' /*몰노출상품*/
 		  AND NOW() BETWEEN G.SELL_STDT AND G.SELL_EDDT /*판매기간*/
 		  AND S.STOCK_QTY > 0 /*재고있는상품*/
+		<include refid="getCategoryGoodsList_sql"/>
 	</select>
 
+	<!-- 카테고리 상품별  목록 필터 조건 -->
+	<sql id="getCategoryGoodsList_sql">
+		<if test='brandSearch != null and brandSearch.length > 0'>
+		     AND EXISTS ( SELECT 1 FROM TB_BRAND
+		     WHERE BRAND_CD = G.BRAND_CD
+		     AND BRAND_GROUP_NO IN
+		     <foreach collection="brandSearch" item="item" index="index" open="(" close=")" separator=",">
+		        #{item}
+		     </foreach>
+		     )
+		</if>
+		<if test='sizeSearch != null and sizeSearch.length > 0'>
+		     AND G.GOODS_CD IN (
+		          SELECT GOODS_CD
+		          FROM VW_STOCK
+		          WHERE OPT_CD2 IN
+		     <foreach collection="sizeSearch" item="item" index="index"  open="(" close=")" separator=",">
+		         #{item}
+		     </foreach>
+		     )
+		</if>
+		<if test='colorSearch != null and colorSearch.length > 0'>
+		     AND G.MAIN_COLOR_CD IN (
+		          SELECT OPT_CD1
+		          FROM TB_OPTION
+		          WHERE GOODS_CD = G.GOODS_CD
+		          AND  OPT_CD1 IN
+		     <foreach collection="colorSearch" item="item" index="index"  open="(" close=")" separator=",">
+		     	#{item}
+		     </foreach>
+		     )
+		</if>
+	</sql>
+
 	<!-- 카테고리별 상품 총 리스트 -->
 	<select id="getCategoryGoodsList" parameterType="GoodsSearch" resultType="Goods">
 		/* TsfDisplay.getCategoryGoodsList */
@@ -784,6 +819,7 @@
 		          AND G.SELF_MALL_YN = 'Y' /*몰노출상품*/
 		          AND NOW() BETWEEN G.SELL_STDT AND G.SELL_EDDT /*판매기간*/
 		          AND S.STOCK_QTY > 0 /*재고있는상품*/
+		          <include refid="getCategoryGoodsList_sql"/>
 		          <if test="contentsLoc == 'SBM013'">
 		          GROUP BY G.GOODS_CD
 		          </if>

+ 38 - 1
src/main/java/com/style24/persistence/mybatis/shop/TsfGiftcard.xml

@@ -14,7 +14,7 @@
 		      ,(SELECT SUM(CG3.RM_GFCD_AMT)
 				FROM TB_CUST_GIFTCARD CG3
 				WHERE DATE_FORMAT(NOW(), '%Y%m%d') BETWEEN CG3.USE_ST_DATE AND CG3.USE_EXP_DATE
-				  AND  DATE_FORMAT(NOW(), '%Y%m%d') BETWEEN DATE_ADD(CG3.USE_EXP_DATE, INTERVAL -1 MONTH) AND USE_EXP_DATE
+				  AND  NOW() BETWEEN DATE_ADD(DATE_FORMAT(CG3.USE_EXP_DATE,'%Y-%m-%d'), INTERVAL -30 DAY) AND USE_EXP_DATE
 				  AND CUST_NO = #{custNo}
 				  AND CG3.RM_GFCD_AMT > 0 ) AS EXPIRE_COUNT  /*한달 이내 소멸*/
 		FROM TB_CUST_GIFTCARD CG 
@@ -135,6 +135,7 @@
 	</insert>
 	
 	<select id="getRecentlyDate" resultType="GiftCard">
+		/*TsfGiftcard.getRecentlyDate*/  
 		SELECT A.*
 		FROM
 		    (		
@@ -164,6 +165,42 @@
 		    )A	
 	</select>
 	
+	<select id="getCustGiftCardSq" parameterType="GiftCard" resultType="int">
+		/*TsfGiftcard.getCustGiftCardSq*/  
+		SELECT CUST_GFCD_SQ 
+		FROM TB_CUST_GIFTCARD 
+		WHERE GFCD_NO = #{gfcdNo}
+	</select>
+	
+	<insert id="createCustGiftcardHistory"  parameterType="GiftCard" >
+		/* TsfGiftcard.createCustGiftcardHistorys */
+		INSERT INTO TB_CUST_GIFTCARD_HST ( 
+		      CUST_NO
+		    , OCCUR_GB
+		    , OCCUR_DTL_DESC
+		    , GFCD_AMT
+		    , CUST_GFCD_SQ
+		    , ORD_NO
+		    , ORD_DTL_NO
+		    , REG_NO
+		    , REG_DT
+		    , UPD_NO
+		    , UPD_DT
+		) VALUES (
+		      #{custNo}
+		    , #{occurGb}
+		    , #{occurDtlDesc}
+		    , #{gfcdAmt}
+		    , #{custGfcdSq}
+		    , #{ordNo}
+		    , #{ordDtlNo}
+		    , #{custNo}
+		    , NOW()
+		    , #{custNo}
+		    , NOW()
+		)	
+	</insert>
+	
 	<!-- 페이징을 위한 select절 상단 -->
 	<sql id="selectForPagingHeader">
 		SELECT *

+ 3 - 0
src/main/java/com/style24/persistence/mybatis/shop/TsfGoods.xml

@@ -454,8 +454,11 @@
 		        WHERE GOODS_CD = G.GOODS_CD
 		        GROUP BY GOODS_CD 
 		        ) AS STOCK_QTY
+		     , GS.REVIEW_REG_CNT
+		     , GS.GOODS_QNA_CNT
 		FROM TB_GOODS_COMPOSE C
 		INNER JOIN TB_GOODS G ON C.COMPS_GOODS_CD = G.GOODS_CD
+		INNER JOIN TB_GOODS_SUMMARY GS ON G.GOODS_CD = GS.GOODS_CD
 		INNER JOIN TB_BRAND B ON G.BRAND_CD = B.BRAND_CD
 		                      AND B.USE_YN = 'Y'
 		INNER JOIN TB_SITE_BRAND SB ON B.BRAND_CD = SB.BRAND_CD

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

@@ -330,6 +330,8 @@
 		     , DFP.DELV_FEE + DFP.RTN_DELV_FEE                    AS EXC_DELV_FEE
 		     , DFP.SUPPLY_COMP_CD
 		     , IF(G1.SELF_GOODS_YN = 'Y', 'WMS', DFP.DELV_FEE_CD) AS DELV_FEE_CD
+		     , P.PG_TID
+		     , P.PAY_MEANS
 		     , P.PAY_STAT
 		     , CASE WHEN NULLIF(OD.INVOICE_NO, '') IS NULL THEN 'N'
 		            ELSE 'Y'
@@ -798,6 +800,7 @@
 		     , Z.RF_CNCL_AMT
 		     , Z.RF_DELIVERY_FEE
 		     , Z.RF_REAL_CNCL_AMT
+		     , Z.PG_TID
 		     , Z.PG_GB
 		     , Z.PAY_MEANS
 		     , Z.PAY_MEANS_NM
@@ -832,8 +835,8 @@
 		             , ODI.ORD_DTL_ITEM_SQ
 		             , ODI.OPT_CD1
 		             , ODI.OPT_CD2
-		             , ((OD.ORD_AMT - OD.CNCL_RTN_AMT - OD.CPN1_DC_AMT) * (OCD.CHG_QTY / (OD.ORD_QTY - OD.CNCL_RTN_QTY))) AS PRICE_ORG
-		             , ((OD.REAL_ORD_AMT + OD.PNT_DC_AMT + OD.GFCD_USE_AMT) * (OCD.CHG_QTY / (OD.ORD_QTY - OD.CNCL_RTN_QTY))) AS PRICE_SALE
+		             , ((ODH.ORD_AMT - ODH.CPN1_DC_AMT) * (OCD.CHG_QTY / ODH.ORD_QTY)) AS PRICE_ORG
+		             , ((ODH.REAL_ORD_AMT + ODH.PNT_DC_AMT + ODH.GFCD_USE_AMT) * (OCD.CHG_QTY / OD.ORD_QTY)) AS PRICE_SALE
 		             , 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
@@ -850,6 +853,7 @@
 		             , R.RF_CNCL_AMT
 		             , R.RF_DELIVERY_FEE
 		             , R.RF_REAL_CNCL_AMT
+		             , P.PG_TID
 		             , P.PG_GB
 		             , P.PAY_MEANS
 		             , FN_GET_CODE_NM('G014', P.PAY_MEANS)                              AS PAY_MEANS_NM
@@ -869,6 +873,9 @@
 		            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_ORDER_DETAIL_HST ODH
+		            ON OD.ORD_DTL_NO = ODH.ORD_DTL_NO
+		           AND ODH.ORD_DTL_STAT = 'G013_00'
 		         INNER JOIN TB_GOODS G1
 		            ON OD.GOODS_CD = G1.GOODS_CD
 		         INNER JOIN TB_GOODS G2
@@ -883,6 +890,7 @@
 		         INNER JOIN TB_PAYMENT P
 		            ON P.ORD_NO = O.ORD_NO
 		           AND P.PAY_GB = 'O'
+		           AND P.PAY_STAT = 'G016_30'
 		         WHERE OCD.DEL_YN = 'N'
 		           AND O.DISP_YN = 'Y'
 		<choose>
@@ -903,7 +911,7 @@
 				, 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.PRICE_ORG, Z.PRICE_SALE, 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, Z.PG_GB, Z.PAY_MEANS, Z.PAY_MEANS_NM
+				, Z.RF_DELIVERY_FEE, Z.RF_REAL_CNCL_AMT, Z.PG_TID, Z.PG_GB, Z.PAY_MEANS, Z.PAY_MEANS_NM
 		 ORDER BY Z.ORD_CHG_SQ DESC
 	</select>
 
@@ -1062,6 +1070,7 @@
 		         INNER JOIN TB_PAYMENT P
 		            ON P.ORD_NO = O.ORD_NO
 		           AND P.PAY_GB = 'O'
+		           AND P.PAY_STAT = 'G016_30'
 		         WHERE OCD.DEL_YN = 'N'
 		           AND O.DISP_YN = 'Y'
 		<choose>

+ 5 - 1
src/main/java/com/style24/persistence/mybatis/shop/TsfPlanning.xml

@@ -436,6 +436,7 @@
 		     , PLAN_CONT_SQ
 		     ,TITLE 
 		     ,LINK_URL
+		     ,LINK_OPEN_GB
 		     ,NOTE 
 		     ,DISP_YN 
 		FROM TB_PLAN_CONTENTS TPC 
@@ -667,11 +668,12 @@
 		      ,PC.PLAN_SQ
 		      ,PC.TMPL_TYPE
 		      ,PC.TITLE
-		      ,PC.LINK_URL
 		      ,PC.DISP_YN
 		      ,PC.DISP_ORD
 		      ,PCI.PLAN_CONT_ITEM_SQ
 		      ,PCI.ITEM_VAL
+		      ,PCI.LINK_URL
+		      ,PCI.LINK_OPEN_GB
 		      ,PCI.DISP_ORD
 		      ,PCI.REVIEW_DISP_STDT
 		      ,PCI.REVIEW_DISP_EDDT
@@ -692,6 +694,7 @@
 		WITH TAB_PLAN_GOODS AS (
 		    SELECT P.PLAN_SQ                                                /*기획전번호*/
 		         , PC.LINK_URL 
+		         , PC.LINK_OPEN_GB
 		         , PC.DISP_ORD 
 		         , PC.TITLE 
 		         , PC.TMPL_TYPE 
@@ -764,6 +767,7 @@
 		     , PG.TITLE
 		     , PG.TMPL_TYPE
 		     , PG.LINK_URL
+		     , PG.LINK_OPEN_GB
 		     , PG.ITEM_VAL
 		     , PG.PLAN_CONT_SQ
 		     , FN_GET_GOODS_NM(PG.GOODS_NM,PG.GOODS_GB,PG.FOREIGN_BUY_YN,PG.PARALLEL_IMPORT_YN,PG.ORDER_MADE_YN) AS GOODS_FULL_NM /*상품FULL명*/

+ 23 - 3
src/main/java/com/style24/persistence/mybatis/shop/TsfPoint.xml

@@ -65,12 +65,22 @@
 		            WHEN 'G069_12' THEN '상품구매'
 		            WHEN 'G069_20' THEN '리뷰'
 		            WHEN 'G069_30' THEN '이벤트'
+		            WHEN 'G069_31' THEN '회원가입'
+		            WHEN 'G069_32' THEN '생일축하'
+		            WHEN 'G069_35' THEN 'APP다운'
+		            WHEN 'G069_36' THEN '사은품구매'
+		            WHEN 'G069_37' THEN '출석체크'
 		            WHEN 'G069_90' THEN '관리자'
 		       END                                          AS OCCUR_GB
 		     , CASE TCHP.OCCUR_GB
 		            WHEN 'G069_12' THEN TG.GOODS_NM
 		            WHEN 'G069_20' THEN TG.GOODS_NM
 		            WHEN 'G069_30' THEN TCHP.OCCUR_DTL_DESC
+		            WHEN 'G069_31' THEN TCHP.OCCUR_DTL_DESC
+		            WHEN 'G069_32' THEN TCHP.OCCUR_DTL_DESC
+		            WHEN 'G069_35' THEN TCHP.OCCUR_DTL_DESC
+		            WHEN 'G069_36' THEN TCHP.OCCUR_DTL_DESC
+		            WHEN 'G069_37' THEN TCHP.OCCUR_DTL_DESC
 		            WHEN 'G069_90' THEN TCHP.OCCUR_DTL_DESC
 		       END                                          AS  OCCUR_DTL_DESC
 		      , TCHP.PNT_AMT                                AS PNT_AMT
@@ -96,7 +106,7 @@
 		AND CASE WHEN NULLIF(TCHP.REVIEW_SQ, 0) IS NULL THEN 1
 		         WHEN NULLIF(TCHP.REVIEW_SQ, 0) IS NOT NULL AND NULLIF(TR.REVIEW_SQ, 0) IS NOT NULL THEN 1 /* 상품평조건 */
 		    END > 0
-		AND TCHP.OCCUR_GB IN ('G069_12','G069_20','G069_30','G069_90')
+		AND TCHP.OCCUR_GB IN ('G069_12','G069_20','G069_30','G069_31','G069_32','G069_35','G069_36','G069_37','G069_90')
 		AND TCHP.PNT_UPLOAD_STAT = 'G070_30'														/* 공통코드 : 반영완료 */
 		AND TCHP.PNT_AMT <![CDATA[>]]> 0
 		AND DATE_FORMAT(TCHP.UPD_DT,'%Y%m') = #{searchDt}
@@ -150,6 +160,11 @@
 		WHEN   'G069_13' THEN '구매 취소'
 		WHEN   'G069_20' THEN '리뷰'	
 		WHEN   'G069_30' THEN '이벤트'
+		WHEN   'G069_31' THEN '회원가입'
+		WHEN   'G069_32' THEN '생일축하'
+		WHEN   'G069_35' THEN 'APP다운'
+		WHEN   'G069_36' THEN '사은품구매'
+		WHEN   'G069_37' THEN '출석체크'
 		WHEN   'G069_40' THEN '구매 사용'
 		WHEN   'G069_42' THEN '사은품'
 		WHEN   'G069_90' THEN '관리자'
@@ -158,8 +173,13 @@
 		CASE   TCHP.OCCUR_GB
 		WHEN   'G069_12' THEN TG.GOODS_NM 
 		WHEN   'G069_13' THEN TG.GOODS_NM 
-		WHEN   'G069_20' THEN TG.GOODS_NM 
+		WHEN   'G069_20' THEN TG.GOODS_NM
 		WHEN   'G069_30' THEN TCHP.OCCUR_DTL_DESC
+		WHEN   'G069_31' THEN TCHP.OCCUR_DTL_DESC
+		WHEN   'G069_32' THEN TCHP.OCCUR_DTL_DESC
+		WHEN   'G069_35' THEN TCHP.OCCUR_DTL_DESC
+		WHEN   'G069_36' THEN TCHP.OCCUR_DTL_DESC
+		WHEN   'G069_37' THEN TCHP.OCCUR_DTL_DESC
 		WHEN   'G069_40' THEN TG.GOODS_NM 
 		WHEN   'G069_42' THEN TG.GOODS_NM
 		WHEN   'G069_90' THEN TCHP.OCCUR_DTL_DESC
@@ -191,7 +211,7 @@
 			WHEN NULLIF(TCHP.REVIEW_SQ, 0) IS NULL THEN 1
 			WHEN NULLIF(TCHP.REVIEW_SQ, 0) IS NOT NULL AND NULLIF(TR.REVIEW_SQ, 0) IS NOT NULL THEN 1
 		END <![CDATA[>]]> 0		
-		AND TCHP.OCCUR_GB IN ('G069_12','G069_13','G069_20','G069_30','G069_40','G069_42','G069_90','G069_99')
+		AND TCHP.OCCUR_GB IN  ('G069_12','G069_13','G069_20','G069_30','G069_31','G069_32','G069_35','G069_36','G069_37','G069_40','G069_42','G069_90','G069_99')
 		AND TCHP.PNT_UPLOAD_STAT = 'G070_30'
 		AND DATE_FORMAT(TCHP.UPD_DT,'%Y%m') = #{searchDt}
 		GROUP BY TCHP.REVIEW_SQ, TCHP.OCCUR_GB, PNT_AMT, GOODS_NM, TCHP.OCCUR_DTL_DESC, TCHP.UPD_DT

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

@@ -66,7 +66,7 @@ pg:
         site:
             cd: T0000
             key: 3grptw1.zW0GSo4PQdaGvsF__
-            name: KCP TEST SHOP
+            name: ISTYLE TEST
         log.level: 3
         module.type: 01
         tx.mode: 0

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

@@ -102,7 +102,9 @@ kakao:
 yes24 :
     id : 101582
     type : ISTYLE
-    login.requestUrl: https://www.yes24.com/Templates/FTLoginPartner.aspx
+    login :
+           web.requestUrl : https://www.yes24.com/Templates/FTLoginPartner.aspx
+           mob.requestUrl : https://m.yes24.com/Momo/Templates/FTLogin.aspx
     login.callbackUrl: /signin/yes24LoginCallback
     userInfoUrl : https://wsyes24.yes24.com/Yes_Mem.asmx/Yes_Mem_Search_By_CI
     linkUrl : https://wsyes24.yes24.com/Yes_Mem.asmx/Yes_Partner_Insert

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

@@ -3,15 +3,15 @@
 	xmlns:th="http://www.thymeleaf.org">
 <!--
  *******************************************************************************
- * @source  : SigninFormWeb.html
- * @desc    : 로그인 Page
+ * @source  : SnsCallBackFormMob.html
+ * @desc    : SNS 콜백 화면 Page
  *============================================================================
  * STYLE24
  * Copyright(C) 2020 TSIT, All rights reserved.
  *============================================================================
  * VER  DATE         AUTHOR      DESCRIPTION
  * ===  ===========  ==========  =============================================
- * 1.0  2021.02.15   gagamel     최초 작성
+ * 1.0  2021.02.15   jsshin     최초 작성
  *******************************************************************************
  -->
 <head th:replace="~{mob/common/fragments/HeadMob :: head}"></head>

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

@@ -137,8 +137,6 @@
 					<div class="opt_select">
 						<div class="opt_header">
 							<span class="title">옵션2</span>
-							<!--<span th:text="${size.optCd2}"></span>
-							<span th:if="${size.addPrice > 0}">(+<em th:text="${#numbers.formatInteger(size.addPrice, 1, 'COMMA')}"></em>)원</span>-->
 							<span class="info color" th:classappend="|chooseSizeNm_${comp.goodsCd}|" th:text="${comp.optCd2}"></span>
 						</div>
 						<form class="form_wrap">

+ 1 - 4
src/main/webapp/WEB-INF/views/mob/cart/CartListAjaxFormMob.html

@@ -18,6 +18,7 @@
 	<!-- 즉시구매 form -->
 	<form id="cartInfoForm" method="post" action="/order/noMember"></form>
 
+	<!-- 장바구니 화면 -->
 	<form id="cartListForm" method="post" action="/order/noMember" th:with="imgGoodsUrl=${@environment.getProperty('upload.goods.view')}, uxImgUrl=${@environment.getProperty('domain.uximage')}, imgUrl=${@environment.getProperty('upload.image.view')}">
 		<div class="inner shotDelvSelect">
 			<div class="od_method">
@@ -668,10 +669,6 @@
 		</div>
 		<!-- //쿠폰사용안내 팝업 -->
 
-		<!-- 옵션변경 팝업 -->
-		<div id="optModifyPop01" class="popup_box optModifyPop optModifyPop01"></div>
-		<!-- //옵션변경 팝업 -->
-
 		<script th:inline="javascript">
 			var sumRealPayAmt = [[${order.sumRealPayAmt + order.totDelvFee}]];
 			var totDcAmt = [[${order.totDcAmt}]];

+ 21 - 3
src/main/webapp/WEB-INF/views/mob/cart/CartListFormMob.html

@@ -81,6 +81,10 @@
 			</div>
 		</div>
 		<!-- //배송비 SAVE_팝업 -->
+
+		<!-- 옵션변경 팝업 -->
+		<div id="optModifyPop01" class="popup_box optModifyPop optModifyPop01"></div>
+		<!-- //옵션변경 팝업 -->
 	</main>
 
 	<script src="/ux/mo/js/swiper.min.js"></script>
@@ -179,6 +183,7 @@
 			count = count > maxOrdQty ? maxOrdQty : count;
 			$input.val(count);
 			$input.change();
+
 			//주문 최대 수량 이상 증가버튼 비활성화
 			if ($input.val() == maxOrdQty) {
 				$('.optModifyPop01 .number_count .plus').addClass('min_val');
@@ -188,8 +193,21 @@
 
 			return false;
 		}).on('keyup','.optModifyPop01 .number_count input[type=text]',function(e){
-			//텍스트, 0 입력금지
-			$(this).val($(this).val().replace(/[^1-9]/g,""));
+			var minOrdQty = $(this).parent().parent().find(".minOrdQty").val();
+			var maxOrdQty = $(this).parent().parent().find(".maxOrdQty").val();
+
+			$(this).val($(this).val().replace(/[^0-9]/g,""));
+
+			if(Number($(this).val()) < Number(minOrdQty)) {
+				$(this).val(minOrdQty);
+				$('.optModifyPop01 .number_count .minus').addClass('min_val');
+				$('.optModifyPop01 .number_count .plus').removeClass('min_val');
+			}
+			if(Number($(this).val()) > Number(maxOrdQty)) {
+				$(this).val(maxOrdQty);
+				$('.optModifyPop01 .number_count .plus').addClass('min_val');
+				$('.optModifyPop01 .number_count .minus').removeClass('min_val');
+			}
 		});
 
 		//팝업 - 쿠폰사용안내
@@ -198,7 +216,7 @@
 			$("#couponInfoPop").modal("show");
 			return false;
 		});
-		$("#couponInfoPop_close").click(function() {
+		$("#couponInfoPop_close").on("click", function() {
 			$("#couponInfoPop").modal("hide");
 		});
 

+ 95 - 0
src/main/webapp/WEB-INF/views/mob/customer/JoinCompleteFormMob.html

@@ -0,0 +1,95 @@
+<!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  : JoinCompleteFormMob.html
+ * @desc    : 회원 가입완료 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2021 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.04.19   jsshin     최초 작성
+ *******************************************************************************
+ -->
+
+<body>
+<th:block layout:fragment="content">
+	<main class="container mb">
+		<section th:if="${maskingCustId != ''}" class="content mb_join_3">
+			<div class="inner">
+				<div class="close">
+					<a href="javascript:void(0)" class="btn_close" onclick="cfnGoToPage(_PAGE_MAIN);"><span></span><span></span></a>
+				</div>
+			</div>
+			<div class="inner">
+				<h2 class="title">회원가입</h2>
+			</div>
+			<div class="inner">
+				<form class="form_wrap form_full" role="form">
+					<div class="form_head">
+						<h3 class="title sr-only">회원가입</h3>
+					</div>
+					<div class="form_info">
+						<span class="ico_content_find"></span>
+						<p>이미 가입된 아이디가 있습니다.</p>
+						<p class="t_info mt15">
+							아래의 아이디로 로그인 하시거나<br>
+							잊으신 경우 ID 찾기를 통해 이용 가능합니다.
+						</p>
+					</div>
+					<div class="print_bar mt30">
+						<p class="c_primary bold" data-font="lato" th:text="${maskingCustId}"></p>
+					</div>
+					<!-- 210415_수정 : 버튼 형식 변경. -->
+					<div class="btn_group_flex btn_group_md">
+						<div>
+							<button id="btn_login" class="btn btn_dark" onclick="cfnGoToPage(_PAGE_LOGIN);">
+								<span>로그인</span>
+							</button>
+						</div>
+						<div>
+							<button id="btn_id_find" class="btn btn_default" onclick="cfnGoToPage(_PAGE_CUSTOMER_ID_FIND);">
+								<span>아이디 찾기</span>
+							</button>
+						</div>
+					</div>
+					<!-- //210415_수정 : 버튼 형식 변경. -->
+				</form>
+			</div>
+		</section>
+		<!-- ★ 컨텐츠 시작 -->
+		<section th:unless="${maskingCustId != ''}" class="content mb_join_1">
+			<div class="inner">
+				<div class="close">
+					<a href="javascript:void(0)" class="btn_close" onclick="cfnGoToPage(_PAGE_MAIN);"><span></span><span></span></a>
+				</div>
+			</div>
+			<div class="inner">
+				<h2 class="title">신규회원 혜택 안내</h2>
+			</div>
+			<div class="inner">
+				<form class="form_wrap form_full" role="form">
+					<div class="form_head">
+						<h3 class="title sr-only">신규회원 혜택 안내</h3>
+					</div>
+					<img src="/images/mo/img_mb_join_done.jpg" width="100%" alt="신규회원 혜택안내 내용">
+					<div class="btn_group_flex">
+						<div>
+							<button type="button" class="btn btn_primary btn_block" onclick="cfnGoToPage(_PAGE_MAIN);">
+								<span>쇼핑하러 가기</span>
+							</button>
+						</div>
+					</div>
+				</form>
+			</div>
+		</section>
+		<!-- ★ 컨텐츠 종료 -->
+	</main>
+</th:block>
+</body>
+</html>

+ 492 - 0
src/main/webapp/WEB-INF/views/mob/customer/JoinFormMob.html

@@ -0,0 +1,492 @@
+<!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  : JoinTypeFormMob.html
+ * @desc    : 회원정보 입력 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2021 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.04.16   jsshin     최초 작성
+ *******************************************************************************
+ -->
+<body>
+<th:block layout:fragment="content">
+<style>
+	.show{display:block}
+	.hide{display:none}
+</style>
+<main class="container mb">
+	<!-- ★ 컨텐츠 시작 -->
+	<section class="content mb_join_2">
+		<div class="inner">
+			<div class="close">
+				<a href="javascript:void(0)" class="btn_close" onclick="cfnGoToPage(_PAGE_MAIN);"><span></span><span></span></a>
+			</div>
+		</div>
+		<div class="inner">
+			<h2 class="title">회원정보 입력</h2>
+		</div>
+		<div class="inner">
+			<form id="joinForm" name="joinForm" class="form_wrap form_full" role="form">
+				<div class="form_head">
+					<h2 class="title sr-only">회원정보 입력</h2>
+				</div>
+				<!-- 아이디 사용가능시 -->
+				<div class="form_field">
+					<label class="input_label sr-only">아이디</label>
+					<div class="input_wrap form_full">
+						<input type="text" id="custId" name="custId" placeholder="아이디" class="form_control" required="required" data-valid-type="alphaNumeric" data-valid-name="아이디" minlength="4" maxlength="12"/>
+						<span class="usable" style="display:block;"></span>
+					</div>
+					<div id="dupCustIdDiv" class="help_block hide">
+						<p class="t_err">이미 가입된 아이디입니다.다른 아이디를 입력하여 주세요.</p>
+					</div>
+				</div>
+				<!-- //아이디 사용가능시 -->
+				<!-- 오류시 부모 div에서 제어 -->
+				<div class="form_field">
+					<label class="input_label sr-only">비밀번호</label>
+					<div class="input_wrap form_full">
+						<input type="password" id="passwd" name="passwd" placeholder="비밀번호 (8~20자 영문, 숫자, 특수문자 중 2가지 이상 조합)" class="form_control" minlength="8" maxlength="20" required="required" data-valid-name="비밀번호"/><!-- 잘못기입된 경우 class "err" 추가 -->
+						<!-- case (사용불가 비밀번호일경우,사용가능한 비밀번호일경우) -->
+						<div class="help_block">
+							<!-- 사용불가 비밀번호일경우 -->
+							<p class="mt10">
+								<span id="firstFailed" class="c_gray">
+									<i class="ico ico_check gray mr5"></i>영문(대/소문자), 숫자, 특수문자 중 2가지 이상 조합(8~20자)<br>
+								</span>
+								<span id="secondFailed" class="c_gray">
+									<i class="ico ico_check gray mr5"></i>4개이상 연속되거나 동일한 문자/숫자 제외<br>
+								</span>
+								<span id="thirdFailed" class="c_gray">
+									<i class="ico ico_check gray mr5"></i>아이디 제외
+								</span>
+							</p>
+							<!-- //사용불가 비밀번호일경우 -->
+							<!-- 사용가능한 비밀번호일경우 -->
+							<p id="avlPwd" class="mt10 hide">
+								<span class="c_black2">
+									<i class="ico ico_check black mr5"></i>사용 가능한 비밀번호입니다
+								</span>
+							</p>
+							<!-- //사용가능한 비밀번호일경우 -->
+						</div>
+						<!-- //case (사용불가 비밀번호일경우,사용가능한 비밀번호일경우) -->
+					</div>
+				</div>
+				<!-- //오류시 부모 div에서 제어 -->
+				<div class="form_field">
+					<label class="input_label sr-only">비밀번호 확인</label>
+					<div class="input_wrap form_full">
+						<input type="password" id="confirmPassword" name="confirmPassword" placeholder="비밀번호 확인" class="form_control" minlength="8" maxlength="20" required="required" data-valid-name="비밀번호"/><!-- 잘못기입된 경우 class "err" 추가 -->
+						<!-- case (비밀번호확인 틀렸을경우,비밀번호 일치할경우) -->
+						<div class="help_block">
+							<!-- 비밀번호확인 틀렸을경우 -->
+							<p id="misPwd" class="t_err hide">
+								비밀번호가 일치하지 않습니다.
+							</p>
+							<!-- //비밀번호확인 틀렸을경우 -->
+							<!-- 비밀번호 일치할경우 -->
+							<p id="avlConPwd"  class="mt10 hide">
+								<span class="c_black2">
+									<i class="ico ico_check black mr5"></i>비밀번호가 일치합니다.
+								</span>
+							</p>
+							<!-- //비밀번호 일치할경우 -->
+						</div>
+						<!-- //case (비밀번호확인 틀렸을경우,비밀번호 일치할경우) -->
+					</div>
+				</div>
+				<div class="form_field">
+					<label class="input_label sr-only">이메일</label>
+					<div class="input_wrap form_full">
+						<input type="text" id="email" name="email" placeholder="이메일" class="form_control" required="required" data-valid-name="이메일" maxlength="30"/><!-- 잘못기입된 경우 class "err" 추가 -->
+						<!-- case (이메일 형식이 바르지않을경우,이미 가입되어있는 이메일인경우) -->
+						<div class="help_block">
+							<!-- 이메일 형식이 바르지않을경우 -->
+							<p id="failEmail" class="t_err hide">
+								이메일 형식이 올바르지 않습니다.
+							</p>
+							<!-- //이메일 형식이 바르지않을경우 -->
+							<!-- 이미 가입되어있는 이메일인경우 -->
+							<p id="dupEmail" class="t_err hide">
+								이미 가입된 이메일 주소입니다. 다른 이메일 주소를 입력하여 주세요.
+							</p>
+							<div id="dupEmailDiv" class="mt20 hide">
+								<button type="button" class="btn btn_default btn_sm mini" onclick="cfnGoToPage(_PAGE_LOGIN);">
+									<span>로그인</span>
+								</button>
+								<button type="button" class="btn btn_default btn_sm mini" onclick="cfnGoToPage(_PAGE_CUSTOMER_ID_FIND);">
+									<span>아이디 찾기</span>
+								</button>
+							</div>
+							<!-- //이미 가입되어있는 이메일인경우 -->
+						</div>
+						<!-- //case (이메일 형식이 바르지않을경우,이미 가입되어있는 이메일인경우) -->
+					</div>
+				</div>
+				<!-- 210415_수정 : 휴대폰 인증 수정 -->
+				<div class="form_field">
+					<label class="input_label sr-only">휴대폰번호</label>
+					<!-- 휴대폰 인증 입력 전 -->
+					<div class="input_wrap form_full">
+						<input type="text" id="cellPhnno" name="cellPhnno" placeholder="휴대폰 인증 해주세요." class="form_control" minlength="10" maxlength="11" required="required" data-valid-type="numeric" data-valid-name="휴대폰" readonly="readonly"/>
+						<button type="button" id="btnCellPhoneCertify" class="btn btn_dark btn_hp_certi">
+							<span>본인인증</span>
+						</button>
+					</div>
+					<!-- //휴대폰 인증 입력 전 -->
+
+					<!-- case (휴대폰번호 형식이 맞지 않을경우,이미 가입되어있는 핸드폰번호일경우) -->
+					<div class="help_block">
+						<p id="failPhnno" class="t_err hide">휴대폰번호를 형식에 맞게 정확히 입력해주세요</p>
+						<p id="dupPhnno" class="t_err hide">I***D로 가입된 핸드폰 번호 입니다.</p>
+						<div id="dupPhnnoDiv" class="mt20 hide">
+							<button type="button" class="btn btn_default btn_sm mini" onclick="cfnGoToPage(_PAGE_LOGIN);">
+								<span>로그인</span>
+							</button>
+							<button type="button" class="btn btn_default btn_sm mini" onclick="cfnGoToPage(_PAGE_CUSTOMER_ID_FIND);">
+								<span>아이디 찾기</span>
+							</button>
+						</div>
+					</div>
+				</div>
+				<div class="btn_group_flex">
+					<div>
+						<button type="button" id="btnJoin" class="btn btn_primary btn_block" disabled="disabled">
+							<span>동의하고 가입하기</span>
+						</button>
+					</div>
+				</div>
+				<!-- //210415_수정 : 버튼 형식 변경. -->
+				<div class="desc_wrap t_c mt20">
+					<p>
+						본인은&nbsp;만 14세 이상이며&nbsp;<a href="javascript:void(0)" onclick="cfnUseTermsLayer();">STYLE24이용약관<i class="ico ico_blank ml5"></i></a>,<br>
+						<a href="javascript:void(0)" onclick="cfnPrivacyPolicyLayer();">개인정보 수집 및 이용<i class="ico ico_blank ml5"></i></a>,
+						<a href="javascript:void(0)" onclick="cfnPrivacyTrustLayer();">개인정보 취급 위탁<i class="ico ico_blank ml5"></i></a><br>
+						내용을 확인 하였으며,동의합니다.
+					</p>
+				</div>
+			</form>
+		</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}]]; //인증 후 해당 페이지로 리다이렉트함
+	let custParams = [[${custParams}]];
+
+	let custIdCheck = false;
+	let passwdCheck = false;
+	let emailCheck = false;
+	let authCheck = false;
+
+	// 아이디 확인
+	$('#custId').on('blur', function () {
+		let custId = $(this).val();
+		if(!gagajf.isNull(custId)) {
+			if (custId.length > 3) {
+				let custInfo = {};
+				custInfo.custId = custId;
+				let jsonData = JSON.stringify(custInfo);
+				gagajf.ajaxJsonSubmit('/customer/join/id/check', jsonData, fnIdConfirmCallBack);
+			}
+		}
+	});
+
+	// 아이디 결과
+	var fnIdConfirmCallBack = function (result) {
+		const $dupCustIdDiv = $('#dupCustIdDiv');
+		const $custId = $('#custId');
+		const $usable = $('span > .usable');
+
+		if (result.isFind) { // 중복된 아이디가 존재
+			$custId.addClass('err');
+			$custId.removeClass('usable');
+			$dupCustIdDiv.show();
+			$usable.hide();
+			custIdCheck = false;
+		} else {
+			$custId.removeClass('err');
+			$custId.addClass('usable');
+			$dupCustIdDiv.hide();
+			$usable.show();
+			custIdCheck = true;
+		}
+		fnPossibleJoin();
+	};
+
+	// 비밀번호 입력
+	$('#joinForm input[name=passwd]').on('focusout keyup keydown', function () {
+		fnCheckPassword();
+	});
+
+	// 비밀번호 확인 입력
+	$('#joinForm input[name=confirmPassword]').on('focusout keyup keydown', function () {
+		fnCheckConfirmPassword();
+	});
+
+	// 비밀번호 확인
+	var fnCheckPassword = function () {
+		const $firstFailed = $('#firstFailed');
+		const $secondFailed = $('#secondFailed');
+		const $thirdFailed = $('#thirdFailed');
+		const $avlPwd = $('#avlPwd');
+		const red = 'c_red2';
+		const gray = 'c_gray';
+
+		let custId = $('#joinForm input[name=custId]').val();
+		let password = $('#joinForm input[name=passwd]').val();
+		let confirmPassword = $('#joinForm input[name=confirmPassword]').val();
+		let pwdCheck = true;
+
+
+		// 영문, 숫자, 특수문자 2종 이상 혼용 || 길이
+		if (fnValidtaionPwdMixedWord(password) || fnValidationPwdLength(password)) {
+			pwdCheck = false;
+			$firstFailed.removeClass(gray);
+			$firstFailed.addClass(red);
+		} else {
+			$firstFailed.removeClass(red);
+			$firstFailed.addClass(gray);
+		}
+
+		// 동일한 문자/숫자 4자이상 || 연속된 문자가 4자이상
+		if (fnValidationPwdSameWord(password) || fnValidtaionPwdCntnsWord(password)) {
+			pwdCheck = false;
+			$secondFailed.removeClass(gray);
+			$secondFailed.addClass(red);
+		} else {
+			$secondFailed.removeClass(red);
+			$secondFailed.addClass(gray);
+		}
+
+		// 아이디 포함
+		if (!gagajf.isNull(custId)) {
+			if (fnValidationPwdSameId(password, custId)) {
+				pwdCheck = false;
+				$thirdFailed.removeClass(gray);
+				$thirdFailed.addClass(red);
+			} else {
+				$thirdFailed.removeClass(red);
+				$thirdFailed.addClass(gray);
+			}
+		}
+
+		if (pwdCheck) {
+			$firstFailed.hide();
+			$secondFailed.hide();
+			$thirdFailed.hide();
+			$avlPwd.show();
+		} else {
+			$firstFailed.show();
+			$secondFailed.show();
+			$thirdFailed.show();
+			$avlPwd.hide();
+		}
+
+		if (!gagajf.isNull(confirmPassword)) {
+			fnCheckConfirmPassword();
+		}
+
+	};
+
+	// 비밀번호 확인
+	var fnCheckConfirmPassword = function () {
+		const $misPwd = $('#misPwd');
+		const $avlConPwd = $('#avlConPwd');
+		let password = $('#joinForm input[name=passwd]').val();
+		let confirmPassword = $('#joinForm input[name=confirmPassword]').val();
+		let sameConfirmPwd = fnValidationPwdSameConfirmPwd(password, confirmPassword);
+
+		if (sameConfirmPwd) {
+			$avlConPwd.show();
+			$misPwd.hide()
+			passwdCheck = true;
+		} else {
+			$misPwd.show();
+			$avlConPwd.hide();
+			passwdCheck = false;
+		}
+		fnPossibleJoin();
+
+	};
+
+	//	이메일 확인
+	$('#email').on('blur', function () {
+		const $failEmail = $('#failEmail');
+		const $dupEmail = $('#dupEmail');
+		const $dupEmailDiv = $('#dupEmailDiv');
+		$failEmail.hide();
+		$dupEmail.hide();
+		$dupEmailDiv.hide();
+
+		let email = $(this).val();
+		let validation;
+
+		if(!gagajf.isNull(email)) {
+			if (!fnCheckValidationEmail(email)) {
+				$failEmail.show();
+				emailCheck = false;
+				validation = false;
+			} else {
+				validation = true;
+				$failEmail.hide();
+			}
+			if (validation) {
+				let custInfo = {};
+				custInfo.email = email;
+				let jsonData = JSON.stringify(custInfo);
+				gagajf.ajaxJsonSubmit('/customer/email/check', jsonData, fnEmailConfirmCallBack);
+			}
+		}
+	});
+
+	// 이메일 확인 결과
+	var fnEmailConfirmCallBack = function (result) {
+		const $dupEmail = $('#dupEmail');
+		const $dupEmailDiv = $('#dupEmailDiv');
+		if (result.isFind) { // 중복된 아이디가 존재
+			$dupEmail.show();
+			$dupEmailDiv.show();
+			emailCheck = false;
+		} else {
+			$dupEmail.hide();
+			$dupEmailDiv.hide();
+			emailCheck = true;
+		}
+		fnPossibleJoin();
+	};
+
+	//휴대폰 인증
+	$('#btnCellPhoneCertify').on('click', function () {
+		let joinForm = $('#joinForm').serializeObject();
+		let custParams = joinForm.custId +','+ joinForm.passwd +','+ joinForm.confirmPassword +','+ joinForm.email;
+		cfnOpenCellphoneCertify(_PAGE_CUSTOMER_JOIN, custParams);
+	});
+
+	// 나이스 본인인증 후 콜백
+	var fnNiceCallBack = function(encData) {
+		if (!gagajf.isNull(encData)) {
+			let custInfo = {};
+			custInfo.encData = encData;
+			let jsonData = JSON.stringify(custInfo);
+			gagajf.ajaxJsonSubmit('/customer/authentication/check', jsonData, fnInfoConfirmCallBack);
+		}
+	};
+
+	// 본인인증 후 결과
+	var fnInfoConfirmCallBack = function (result) {
+		const $cellPhnno = $('#cellPhnno');
+		const $dupPhnno = $('#dupPhnno');
+		const $dupPhnnoDiv = $('#dupPhnnoDiv');
+		const $btnCellPhoneCertify = $('#btnCellPhoneCertify');
+		$cellPhnno.val(result.cellPhnno);
+
+		if (result.isFind) { // 가입된 고객 정보가 있으면
+			let msg = '';
+			if (result.custStat === 'G104_30') {
+				msg = "탈퇴한 회원입니다. 탈퇴 후 60일 동안 재가입이 불가능합니다.";
+			} else {
+				msg = result.maskingCustId+"로 가입된 이력이 있습니다.";
+			}
+			$dupPhnno.html(msg);
+			$dupPhnno.show();
+			$dupPhnnoDiv.show();
+			authCheck = false;
+		} else {
+			$dupPhnno.hide();
+			$dupPhnnoDiv.hide();
+			authCheck = true;
+		}
+		$btnCellPhoneCertify.find('span').text('인증완료');
+		$btnCellPhoneCertify.attr('disabled', true);
+		fnPossibleJoin();
+	};
+
+	// 저장
+	$('#btnJoin').on('click', function () {
+		mcxDialog.confirm("회원가입을 하시겠습니까?", {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function() {
+				$('#btnJoin').attr('disabled', true);
+				let jsonData = JSON.stringify($('#joinForm').serializeObject());
+				gagajf.ajaxJsonSubmit('/customer/join/save', jsonData, fnJoinSaveCallback);
+			}
+		});
+	});
+
+	var fnJoinSaveCallback = function (result) {
+		cfnGoToPage(_PAGE_CUSTOMER_JOIN_COMPLETE);
+	};
+
+
+	// 가입 가능한지 확인
+	var fnPossibleJoin = function () {
+		const $btnJoin = $('#btnJoin');
+		if (custIdCheck && passwdCheck && emailCheck && authCheck ) {
+			$btnJoin.attr('disabled', false);
+		} else {
+			$btnJoin.attr('disabled', true);
+		}
+	};
+
+	// 본인인증 후 데이터 입력 값 셋팅
+	var fnDataSet = function (custParams) {
+		const $custId = $('#joinForm input[name=custId]');
+		const $passwd = $('#joinForm input[name=passwd]');
+		const $confirmPassword = $('#joinForm input[name=confirmPassword]');
+		const $email = $('#joinForm input[name=email]');
+
+		let arrayParams = custParams.split(',');
+		//[0]아이디/[1]비밀번호/[2]비밀번호확인/[3]이메일
+		let custId = arrayParams[0];
+		let passwd = arrayParams[1];
+		let confirmPassword = arrayParams[2];
+		let email = arrayParams[3];
+
+		// console.log(arrayParams);
+		if (!gagajf.isNull(custId)) {
+			$custId.val(custId);
+			$custId.trigger('blur');
+		}
+		if (!gagajf.isNull(passwd)) {
+			$passwd.val(passwd);
+			$passwd.trigger('blur');
+		}
+		if (!gagajf.isNull(confirmPassword)) {
+			$confirmPassword.val(confirmPassword);
+			$confirmPassword.trigger('blur');
+		}
+		if (!gagajf.isNull(email)) {
+			$email.val(email);
+			$email.trigger('blur');
+		}
+	};
+
+	$(document).ready(function () {
+		if (!gagajf.isNull(custParams)) {
+			fnDataSet(custParams);
+		}
+		if (!gagajf.isNull(sEncData)) {
+			fnNiceCallBack(sEncData, authMethod);
+		}
+	});
+
+	/*]]>*/
+</script>
+</th:block>
+</body>
+</html>

+ 45 - 46
src/main/webapp/WEB-INF/views/mob/customer/JoinTypeFormMob.html

@@ -19,55 +19,54 @@
 
 <body>
 <th:block layout:fragment="content">
-	<main class="container mb">
-		<!-- ★ 컨텐츠 시작 -->
-		<section class="content mb_join_1">
-			<div class="inner">
-				<div class="close">
-					<a href="javascript:void(0);" class="btn_close" onclick="cfnGoToPage(_PAGE_MAIN);"><span></span><span></span></a>
-				</div>
-			</div>
-			<div class="inner">
-				<h2 class="title">회원가입</h2>
+<main class="container mb">
+	<!-- ★ 컨텐츠 시작 -->
+	<section class="content mb_join_1">
+		<div class="inner">
+			<div class="close">
+				<a href="javascript:void(0);" class="btn_close" onclick="cfnGoToPage(_PAGE_MAIN);"><span></span><span></span></a>
 			</div>
-			<div class="inner">
-					<form class="form_wrap form_full" role="form">
-						<div class="form_head">
-							<h3 class="title sr-only">본인인증</h3>
-						</div>
-						<div class="form_sign_up">
-							<p class="c_primary t_c">STYLE24 회원으로 가입</p>
-							<p class="t_c mt10">신규 가입 시 할인 쿠폰 등<br> 다양한 혜택을 받으실 수 있습니다.</p>
-						</div>
-					   <div class="ui_row mt20">
-						   <button type="button" class="btn btn_primary" onclick="cfnGoToPage(_PAGE_CUSTOMER_JOIN);">회원가입</button>
-					   </div>
-					</form>
-					<div class="t_c sns_wrap">
-						<h3 class="sr-only">간편로그인</h3>
-						<ul class="login_utill">
-							<li class="lu_kakao">
-								<a href="javascript:void(0);" onclick="cfnLoginKakao();">
-									<div class="ico"></div>카카오로<br>시작하기
-								</a>
-							</li>
-							<li class="lu_naver">
-								<a href="javascript:void(0);" onclick="cfnLoginNaver();">
-									<div class="ico"></div>네이버로<br>시작하기
-								</a>
-							</li>
-							<li class="lu_yes24">
-								<a href="javascript:void(0);" onclick="cfnLoginYes24();">
-									<div class="ico"></div>YES24로<br>시작하기
-								</a>
-							</li>
-						</ul>
+		</div>
+		<div class="inner">
+			<h2 class="title">회원가입</h2>
+		</div>
+		<div class="inner">
+				<form class="form_wrap form_full" role="form">
+					<div class="form_head">
+						<h3 class="title sr-only">본인인증</h3>
 					</div>
-			</div>
-
-		</section>
-		<!-- ★ 컨텐츠 종료 -->
+					<div class="form_sign_up">
+						<p class="c_primary t_c">STYLE24 회원으로 가입</p>
+						<p class="t_c mt10">신규 가입 시 할인 쿠폰 등<br> 다양한 혜택을 받으실 수 있습니다.</p>
+					</div>
+				   <div class="btn_group_flex">
+					   <button type="button" class="btn btn_primary btn_block" onclick="cfnGoToPage(_PAGE_CUSTOMER_JOIN);">동의하고 가입하기</button>
+				   </div>
+				</form>
+				<div class="t_c sns_wrap">
+					<h5>간편하게 시작하기</h5>
+					<ul class="login_utill">
+						<li class="lu_kakao">
+							<a href="javascript:void(0);" onclick="cfnLoginKakao();">
+								<div class="ico"></div>카카오로<br>시작하기
+							</a>
+						</li>
+						<li class="lu_naver">
+							<a href="javascript:void(0);" onclick="cfnLoginNaver();">
+								<div class="ico"></div>네이버로<br>시작하기
+							</a>
+						</li>
+						<li class="lu_yes24">
+							<a href="javascript:void(0);" onclick="cfnLoginYes24();">
+								<div class="ico"></div>YES24로<br>시작하기
+							</a>
+						</li>
+					</ul>
+				</div>
+		</div>
 
+	</section>
+	<!-- ★ 컨텐츠 종료 -->
 </main>
 
 <script th:inline="javascript">

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

@@ -18,6 +18,7 @@
 	<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}"/>
+		<input type="hidden" name="custParams" th:value="${custParams}"/>
 	</form>
 <script th:inline="javascript">
 	/*<![CDATA[*/

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

@@ -20,6 +20,7 @@
 	<input type="hidden" name="m" value="checkplusSerivce" />
 	<input type="hidden" name="EncodeData" th:value="${sEncData}" />
 	<input type="hidden" name="param_r1" th:value="${redirectUrl}"/>
+	<input type="hidden" name="param_r2" th:value="${custParams}"/>
 </form>
 
 <script th:inline="javascript">

+ 15 - 1
src/main/webapp/WEB-INF/views/mob/customer/PasswordFindFormMob.html

@@ -140,7 +140,7 @@
                                 </button>
                             </div>
                             <div class="ui_col_6">
-                                <button type="button" class="btn btn_dark" onclick="cfnGoToPage(_PAGE_CUSTOMER_ID_FIND);">
+                                <button type="button" class="btn btn_dark" onclick="cfnGoToPage(_PAGE_CUSTOMER_PWD_FIND);">
                                     <span>다시 찾기</span>
                                 </button>
                             </div>
@@ -242,6 +242,20 @@
         }
     };
 
+
+	// 찾기실패
+	var fnGetDisplayFail = function (authMethod) {
+		$('.form_head').hide();
+		$('.registration_nav').hide();
+		if (authMethod === 'custInfo') {
+			$('#failCustId').show();
+		}
+		if (authMethod === 'mobile' || authMethod === 'ipin') {
+			$('#failAuthentication').show();
+		}
+
+	};
+
     // 나이스 본인인증 후 콜백
     var fnNiceCallBack = function(encData, authMethod) {
         if (!gagajf.isNull(encData)) {

+ 3 - 3
src/main/webapp/WEB-INF/views/mob/goods/CardPrmtFormMob.html

@@ -77,18 +77,18 @@
 				</th:block>
 				<th:block th:each="cardInfo, status : ${cardInfoList}" >
 				<div class="benefit_blk"  th:if="${cardInfo.prmtGb == 'B' and not #strings.isEmpty(cardInfo.note) and cardInfo.rownum ==  1}">
-					<th:block >
 					<h6>부분 무이자 할부</h6>
 					<th:block th:utext="${#strings.unescapeJava(#strings.escapeJava(cardInfo.note))}"></th:block>
+				</div>
+				</th:block>
+				<div class="benefit_blk" >
 					<div class="info_txt">
 						<ul>
 							<li>무이자할부는 행사기간 동안 실 결제금액 기준으로 가능</li>
 							<li>법인, 체크, 기프트 카드는 부분 무이자 할부 제외</li>
 						</ul>
 					</div>
-					</th:block>
 				</div>
-				</th:block>
 			</div>
 		</div>
 	</div>

Разница между файлами не показана из-за своего большого размера
+ 1 - 2019
src/main/webapp/WEB-INF/views/mob/goods/GoodsDealDetailFormMob.html


+ 1 - 1
src/main/webapp/WEB-INF/views/mob/goods/GoodsDetailDeliveryFormMob.html

@@ -27,7 +27,7 @@
 				<h3>배송비</h3>
 				<p class="dot">
 					<th:block th:if="${goodsInfo.delvFee <= 0}">무료배송</th:block>
-					<th:block th:if="${goodsInfo.delvFee > 0}" th:text="${#numbers.formatInteger(goodsInfo.delvFee, 0,'COMMA')}" ></th:block>
+					<th:block th:if="${goodsInfo.delvFee > 0}" th:text="|${#numbers.formatInteger(goodsInfo.delvFee, 0,'COMMA')}원|" ></th:block>
 					<th:block th:if="${goodsInfo.minOrdAmt > 0}">(<th:block th:text="${#numbers.formatInteger(goodsInfo.minOrdAmt, 0,'COMMA')}" ></th:block>원 이상 무료배송)</th:block>
 				</p>
 			</div>

+ 17 - 15
src/main/webapp/WEB-INF/views/mob/goods/GoodsDetailFormMob.html

@@ -724,7 +724,7 @@
 											</div>
 										</div>
 										<div class="form_field"> 
-											<div class="select_custom item_opt2 item_opt2_1" th:classappend="${goodsInfo.goodsCd}"  disabled>
+											<div class="select_custom item_opt2 item_opt2_1" th:classappend="${goodsInfo.goodsCd}"  disabled th:attr="qty=${goodsInfo.minOrdQty}">
 												<div class="combo">
 													<div class="select">선택</div>
 													<ul class="list" th:id="|goodsOpt2${goodsInfo.goodsCd}|" >
@@ -795,10 +795,13 @@
 						<button class="gift">
 							<span><span>선물해보세요!</span></span>
 						</button>
-						<th:block  th:if="${goodsInfo.stockQty > 0}">
+						<th:block  th:if="${goodsInfo.stockQty > 0 and goodsInfo.goodsStat == 'G008_90'}">
 							<button type="button" class="cart" id="btnGoodsWish" onclick="fnAddCart('C');"><span>쇼핑백</span></button>
 							<button type="button" class="buyNow" id="btnGoodsCart" onclick="fnAddCart('O');"><span>바로구매</span></button>
 						</th:block>
+						<th:block  th:unless="${goodsInfo.stockQty > 0 and goodsInfo.goodsStat == 'G008_90'}">
+						<button class="cantbuying" style="display:block;">SOLD OUT</button>
+						</th:block>
 					</div>
 				</div>
 			</div>
@@ -817,11 +820,11 @@
 					th:attr="goodsCd=${params.goodsCd}, ithrCd=${params.ithrCd}, contentsLoc=${params.contentsLoc}, planDtlSq=${params.planDtlSq}">위시리스트</button>
 		</div>
 		<div class="prd_buy">
-			<th:block  th:if="${goodsInfo.stockQty > 0}">
+			<th:block  th:if="${goodsInfo.stockQty > 0 and goodsInfo.goodsStat == 'G008_90'}">
 			<button type="button" class="buying btPop_auto">구매하기</button>
 			</th:block>
-			<th:block  th:unless="${goodsInfo.stockQty > 0}">
-			<button type="button" class="cantbuying">SOLD OUT</button>
+			<th:block  th:unless="${goodsInfo.stockQty > 0 and goodsInfo.goodsStat == 'G008_90'}">
+			<button type="button" class="cantbuying" style="display:block;">SOLD OUT</button>
 			</th:block>
 		</div>
 	</div>
@@ -1242,7 +1245,7 @@
 			if (result.dataList != null && result.dataList.length > 0) {
 				let tag = "";
 				let $obj = null;
-				
+				let qty = 0; // 구성수량
 				if (selfGoodsYn == "Y"){
 					if (ridx == 1){
 						$obj = $('.pop_option_select .select_custom.item_opt2.item_opt2_1');	
@@ -1255,13 +1258,12 @@
 					}else{
 						$obj = $('.pop_option_select .select_custom.item_opt2.item_opt2_5');
 					}
-					
+					qty = $obj.parent().parent().find('.select_custom').attr('qty'); // 구성수량
 				}else{
 					$obj = $('.pop_option_select .select_custom.item_opt2.item_opt2_1');
+					qty = $obj.attr('qty'); // 구성수량
 				}	
 				
-				let qty = $obj.parent().parent().find('.select_custom').attr('qty'); // 구성수량
-				
 				$.each(result.dataList, function(idx, item) {
 					if (idx == 0){
 						//$obj = $('#goodsOpt2'+item.goodsCd);
@@ -1333,7 +1335,7 @@
 		let maxOrdQty = 0;
 		if ("Y" == $("#cartForm  input[name=selfGoodsYn]").val() && "G056_N" == $("#cartForm  input[name=goodsType]").val()){
 			if(gagajf.isNull($("#cartForm  input[name=optCd2]").val())){
-				mcxDialog.alert("사이즈를 선택세요.");
+				mcxDialog.alert("사이즈를 선택해 주세요.");
 				return false;
 			}
 			minOrdQty = parseInt($("#cartForm  input[name=minOrdQty]").val());
@@ -1371,7 +1373,7 @@
 		let maxOrdQty = parseInt($("#cartForm  input[name=maxOrdQty]").val());
 		if ("Y" == $("#cartForm  input[name=selfGoodsYn]").val() && "G056_N" == $("#cartForm  input[name=goodsType]").val()){
 			if(gagajf.isNull($("#cartForm  input[name=optCd2]").val())){
-				mcxDialog.alert("사이즈를 선택세요.");
+				mcxDialog.alert("사이즈를 선택해 주세요.");
 				return false;
 			}
 		}else{
@@ -1384,12 +1386,12 @@
 		let alertMsg = '';
 		
 		if (ea < minOrdQty) {
-			alertMsg ="최소 주문 가능 수량은 "+minOrdQty+"개 입니다.";
+			alertMsg = minOrdQty+"개 부터 구매 가능합니다.";;
 			ea = minOrdQty;
 		}
 
 		if (ea > maxOrdQty) {
-			alertMsg = "최대 주문 가능 수량은 "+maxOrdQty+"개 입니다.";
+			alertMsg = maxOrdQty+"개 까지만 구매 가능합니다.";
 			ea = maxOrdQty;
 		}
 		
@@ -1472,7 +1474,7 @@
 
 		if (goodsType == 'G056_N' && selfGoodsYn == 'Y' ){
 			if (gagajf.isNull($("#cartForm  input[name=optCd2]").val())) {
-				mcxDialog.alert("사이즈를 선택세요.");
+				mcxDialog.alert("사이즈를 선택해 주세요.");
 				return;
 			}
 		
@@ -1871,7 +1873,7 @@
 		$("meta[property='eg:etc1']").attr('content', [[${goodsInfo.selfGoodsYn}]]);
 		
 		// ep 쿠폰확인
-		fnEpCouponDown([[${params.afLinkCd}]], [[${params.goodsCd}]], 1);
+		fnEpCouponDown([[${afLinkCd}]], [[${params.goodsCd}]], 1);
 	});
 	
 /*]]>*/

+ 31 - 52
src/main/webapp/WEB-INF/views/mob/goods/GoodsDetailQnaFormMob.html

@@ -17,7 +17,7 @@
 <!-- 상품문의 리스트 내용 -->
 <form id="goodsQnaForm" name="goodsQnaForm" action="#" th:action="@{'/goods/qna/list'}">
 <input type="hidden" name="pageNo"  value ="1"/>
-<input type="hidden" name="pageSize" value ="20"/>
+<input type="hidden" name="pageSize" value ="3"/>
 <input type="hidden" name="relGoodsCd" th:value ="${goodsInfo.goodsCd}"/>
 <div class="pd_qnalist">
 	<div class="info_txt">
@@ -36,10 +36,10 @@
 				<input id="except_secret" type="checkbox"><label for="except_secret" onclick="fnGetList();"><span>비밀글제외</span></label>
 				<input  type="hidden" name="secretYn" >
 			</div>
-			<div class="ui_row" id="infiniteContainer">
-				<div class="foldGroup case2" id="listBoxOuter">
+			<div class="ui_row">
+				<div class="foldGroup case2" >
 					<!-- list2 -->
-					<ul  id="listBox">
+					<ul  id="ulGoodsQna">
 					</ul>
 					<!-- //list2 -->
 				</div>
@@ -55,55 +55,37 @@
 			</div>
 		</div>
 		<!-- //나열조건결과 없을 때 노출 내용 -->
+		<div class="btn_group_flex"  style="display:none;">
+			<div>
+				<button type="button" class="btn btn_default" id="btnMore">
+					<span>더보기</span>
+				</button>
+			</div>
+		</div>
 	</div>
 	<div class="btn_group_flex">
 		<div><button type="button" class="btn btn_dark" id="btn_pdQnaWrite_pop" th:onclick="cfGoodsQngCreate([[${goodsInfo.goodsCd}]] )"><span>상품 문의하기</span></button></div>
 	</div>
 </div>
 </form>
-<script src="/ux/plugins/jquery/jquery.history.min.js"></script>
-<script src="/ux/plugins/gaga/gaga.infinite.scrollLayer.js"></script>
 <script th:inline="javascript">
 /*<![CDATA[*/
 	
-	$(function() { gagaInfiniteScroll.getHistory(); });
-	
-	// 상품 검색
-	var fnGetInfiniteScrollDataList = function(pageNum) {
-	
+	var fnGoodsQnaListSearch = function() {
+
 		$('#goodsQnaForm  input[name="secretYn"]').val('');
 		if ($("#goodsQnaForm input:checkbox[name=except_secret]").is(':checked')){
 			$('#goodsQnaForm  input[name="secretYn"]').val('N');
 		}
 		
-		$("#goodsQnaForm input[name=pageNo]").val(pageNum+1);
-		// 콜백함수인 gagaInfiniteScroll.jsonToHtml 에서는 fnDrawInfiniteScrollData 함수를 호출한다.
-		gagajf.ajaxFormSubmit("/goods/qna/list", document.goodsQnaForm,  gagaInfiniteScroll.jsonToHtml);
-	}
-	
-	var fnDrawInfiniteScrollData = function(result, pageNum){
-
-		if (result.dataList != null && result.dataList.length > 0) {
-			var htm = fnCreateGoodsQnaList(result);
-			gagaInfiniteScroll.draw(htm);
-		}else {
-			if($("#goodsQnaForm input[name=pageNo]").val()==1){
-				$('#goodsQnaForm').find('.nodata').show();
-			}
-			gagaInfiniteScroll.draw('not');
-		}
+		gagajf.ajaxFormSubmit($('#goodsQnaForm').prop('action'), '#goodsQnaForm', fnGetListCallback);
 	}
 
-	var fnGoodsQnaListSearch = function() {
-		fnGoodsQnaInfiniteScrollInit();
-		gagaInfiniteScroll.getHistory();
-	}
+	var fnGetListCallback = function(result) {
 
-	var fnCreateGoodsQnaList = function(result) {
-
-		let tag = '';
 		$.each(result.dataList, function(idx, item) {
 			$('#goodsQnaForm').find('.nodata').hide();
+			let tag = '';
 			tag += '<li class="';  // <!-- 내가 쓴 글에 클래스 my_qna 추가 -->
 			if (item.selfGb == 1){
 				tag += ' my_qna';	
@@ -151,29 +133,26 @@
 			tag += '	</div>\n';
 			tag += '</li>\n';
 			
+			$('#ulGoodsQna').append(tag);
 		});
-		return tag;
-	}
-
-	// 인피니트 스크롤 초기화
-	var fnGoodsQnaInfiniteScrollInit = function(){
-		// sessionStorage.removeItem(document.location.href);
-		History.replaceState(null, null);
-		gagaInfiniteScroll.pageStatus = {
-				  pageNum : []      // [0,1,2...] 로드된 페이지 (Array)
-				, loadPage : 0      // 로드할 페이지
-				, loadAlign : 'not' // 로드 상태(prev, next, not)
-				, historyScroll : 0 //
-				, nowPage : null    // 현재 페이지
-				, pageUrl : {       // page url
-				}
+		
+		if (result.paging.pageable.totalPage > result.paging.pageable.pageNo) {
+			$('#btnMore').parent().parent().show();
+			$('#goodsQnaForm input[name=pageNo]').val(result.paging.pageable.pageNo + 1);
+		} else {
+			$('.nodata').show();
+			$('#btnMore').parent().parent().hide();
 		}
-		//History 초기화
-		$("#listBox").html("");
 	}
 	
+	// 더보기
+	$('#btnMore').on('click', function() {
+		fnGoodsQnaListSearch();
+	});
+	
+	
 	$(document).ready( function() {
-		//fnGoodsQnaListSearch();
+		fnGoodsQnaListSearch();
 	});
 	
 	

+ 274 - 33
src/main/webapp/WEB-INF/views/mob/goods/GoodsIncludeFormMob.html

@@ -75,26 +75,19 @@
 					<div class="item_blk">
 						<div class="item_prod">
 							<div class="item_state">
-								<a href="#none" class="itemLink">
-									<div class="itemPic">
-										<img alt="" class="vLHTC pd_img" src="/images/pc/thumb/tmp_pdDetail1.jpg">
-									</div>
-									<p class="itemBrand">NBA 키즈</p>
-									<div class="itemName">
-										<span class="tit_option">[상품1]</span>
-										유니 삼단블록 플리스 집업 유니 삼단블록 플리스 집업 유니 삼단블록 플리스 집업
-									</div>
-									<p class="itemText">
-										<span class="tx1">(리뷰 9,999+)</span>
-									</p>
-								</a>
+								<a href="javascript:void(0)" class="itemLink">
+								<div class="itemPic">
+									<img alt="" class="vLHTC pd_img" th:src="${imgGoodsUrl+'/'+goodsInfo.sysImgNm+'?RS=80'}" th:onerror="'this.src=\''+@{${uxImgUrl}+ '/images/pc/thumb/bg_item_none.png'}+'\';'">
+								</div>
+								<div class="itemName">선택</div>
+							</a>
 							</div>
 						</div>
 					</div>
 					<!-- //아이템 -->
 				</div>
 			</div>
-			<div class="cont_body"></div>
+			<div class="cont_body" id="goodsDealReview"></div>
 		</div>
 		<!-- //상품리뷰 리스트 -->
 		<!-- 상품문의 리스트 -->
@@ -106,18 +99,11 @@
 				<div class="item_blk">
 					<div class="item_prod">
 						<div class="item_state">
-							<a href="#none" class="itemLink">
+							<a href="javascript:void(0)" class="itemLink">
 								<div class="itemPic">
-									<img alt="" class="vLHTC pd_img" src="/images/pc/thumb/tmp_pdDetail1.jpg">
+									<img alt="" class="vLHTC pd_img" th:src="${imgGoodsUrl+'/'+goodsInfo.sysImgNm+'?RS=80'}" th:onerror="'this.src=\''+@{${uxImgUrl}+ '/images/pc/thumb/bg_item_none.png'}+'\';'">
 								</div>
-								<p class="itemBrand">NBA 키즈</p>
-								<div class="itemName">
-									<span class="tit_option">[상품1]</span>
-									유니 삼단블록 플리스 집업 유니 삼단블록 플리스 집업 유니 삼단블록 플리스 집업
-								</div>
-								<p class="itemText">
-									<span class="tx1">(문의 9,999+)</span>
-								</p>
+								<div class="itemName">선택</div>
 							</a>
 						</div>
 					</div>
@@ -125,7 +111,7 @@
 				<!-- //아이템 -->
 			</div>
 			</div>
-		<div class="cont_body"></div>
+		<div class="cont_body"  id="goodsDealQna"></div>
 		</div>
 		<!-- //상품문의 리스트 -->
 		<!-- 배송/교환/반품 정보 -->
@@ -137,15 +123,11 @@
 				<div class="item_blk">
 					<div class="item_prod">
 						<div class="item_state">
-							<a href="#none" class="itemLink">
+							<a href="javascript:void(0)" class="itemLink">
 								<div class="itemPic">
-									<img alt="" class="vLHTC pd_img" src="/images/pc/thumb/tmp_pdDetail1.jpg">
-								</div>
-								<p class="itemBrand">NBA 키즈</p>
-								<div class="itemName">
-									<span class="tit_option">[상품1]</span>
-									유니 삼단블록 플리스 집업 유니 삼단블록 플리스 집업 유니 삼단블록 플리스 집업
+									<img alt="" class="vLHTC pd_img" th:src="${imgGoodsUrl+'/'+goodsInfo.sysImgNm+'?RS=80'}" th:onerror="'this.src=\''+@{${uxImgUrl}+ '/images/pc/thumb/bg_item_none.png'}+'\';'">
 								</div>
+								<div class="itemName">선택</div>
 							</a>
 						</div>
 					</div>
@@ -153,15 +135,274 @@
 				<!-- //아이템 -->
 			</div>
 			</div>
-		<div class="cont_body"></div>
+		<div class="cont_body" id="goodsDealDelivery" ></div>
 		</div>
 		<!-- //배송/교환/반품 정보 -->
 	</div>
 </div>
+
+<!-- 딜리뷰제품리스트팝업 -->
+<div class="pd_pop list_pop pd_pop pd_listReview_pop" id="listReviewPop">
+	<div class="modal_content">
+		<div class="close">닫기</div>
+		<div class="listpop_body">
+			<!-- 아이템선택 -->
+			<div class="deal_list_select">
+				<ul class="list">
+					<li th:each="goodsInfo, status : ${goodsDealComposeList}" 
+						th:attr="aria-disabled=${(goodsInfo.goodsStat != 'G008_90' or goodsInfo.stockQty <= 0)? 'true':''}, data-soldout=${(goodsInfo.stockQty <= 0)? 'true':''}"
+						th:onclick="fnSelGoodsDealReview([[${goodsInfo.compsGoodsCd}]])">
+						<div class="item_prod" th:attr="goodsCd=${goodsInfo.compsGoodsCd}">
+							<div class="item_state active">
+								<a href="javascript:void(0);" class="itemLink">
+									<div class="itemPic">
+										<img alt="" class="vLHTC pd_img" th:src="${imgGoodsUrl+'/'+goodsInfo.sysImgNm+'?RS=331'}" th:onerror="'this.src=\''+@{${uxImgUrl}+ '/images/pc/thumb/bg_item_none.png'}+'\';'">
+									</div>
+									<p class="itemBrand" th:text="${goodsInfo.brandGroupNm}">BRAND NAME1</p>
+									<div class="itemName" th:text="${goodsInfo.goodsFullNm}">남성 </div>
+									<div class="itemText">
+										<span class="tx1">(리뷰 <th:block  th:text="${(goodsInfo.reviewRegCnt <= 9999) ? #numbers.formatInteger(goodsInfo.reviewRegCnt, 0,'COMMA')  : '9,999+'}"></th:block>)</span>
+									</div>
+								</a>
+								<input type="hidden" name="selectGoods" th:value="${goodsInfo.compsGoodsCd}" />
+							</div>
+						</div>
+					</li> 
+				</ul>
+			</div>
+			<!-- //아이템선택 -->
+		</div>
+	</div>
+</div>
+<!-- //딜리뷰제품리스트팝업 -->
+
+<!-- 딜문의제품리스트팝업 -->
+<div class="pd_pop list_pop pd_pop pd_listQna_pop" id="listQnaPop">
+	<div class="modal_content">
+		<div class="close">닫기</div>
+		<div class="listpop_body">
+			<!-- 아이템선택 -->
+			<div class="deal_list_select">
+				<ul class="list">
+					<li th:each="goodsInfo, status : ${goodsDealComposeList}" 
+						th:attr="aria-disabled=${(goodsInfo.goodsStat != 'G008_90' or goodsInfo.stockQty <= 0)? 'true':''}, data-soldout=${(goodsInfo.stockQty <= 0)? 'true':''}"
+						th:onclick="fnSelGoodsDealQna([[${goodsInfo.compsGoodsCd}]])">
+						<div class="item_prod" th:attr="goodsCd=${goodsInfo.compsGoodsCd}">
+							<div class="item_state active">
+								<a href="javascript:void(0);" class="itemLink">
+									<div class="itemPic">
+										<img alt="" class="vLHTC pd_img" th:src="${imgGoodsUrl+'/'+goodsInfo.sysImgNm+'?RS=331'}" th:onerror="'this.src=\''+@{${uxImgUrl}+ '/images/pc/thumb/bg_item_none.png'}+'\';'">
+									</div>
+									<p class="itemBrand" th:text="${goodsInfo.brandGroupNm}">BRAND NAME1</p>
+									<div class="itemName" th:text="${goodsInfo.goodsFullNm}">남성 </div>
+									<p class="itemText">
+										<span class="tx1">(문의 9,999+)</span>
+									</p>
+									<div class="itemText">
+										<span class="tx1">(문의 <th:block  th:text="${(goodsInfo.goodsQnaCnt <= 9999) ? #numbers.formatInteger(goodsInfo.goodsQnaCnt, 0,'COMMA')  : '9,999+'}"></th:block>)</span>
+									</div>
+								</a>
+								<input type="hidden" name="selectGoods" th:value="${goodsInfo.compsGoodsCd}" />
+							</div>
+						</div>
+					</li>  
+				</ul>
+			</div>
+			<!-- //아이템선택 -->
+		</div>
+	</div>
+</div>
+<!-- //딜문의제품리스트팝업 -->
+
+<!-- 딜배송제품리스트팝업 -->
+<div class="pd_pop list_pop pd_pop pd_listDelivery_pop" id="listDeliveryPop">
+	<div class="modal_content">
+		<div class="close">닫기</div>
+		<div class="listpop_body">
+			<!-- 아이템선택 -->
+			<div class="deal_list_select">
+				<ul class="list">
+					<li th:each="goodsInfo, status : ${goodsDealComposeList}" 
+						th:attr="aria-disabled=${(goodsInfo.goodsStat != 'G008_90' or goodsInfo.stockQty <= 0)? 'true':''}, data-soldout=${(goodsInfo.stockQty <= 0)? 'true':''}"
+						th:onclick="fnSelGoodsDealDelivery([[${goodsInfo.compsGoodsCd}]])">
+						<div class="item_prod" th:attr="goodsCd=${goodsInfo.compsGoodsCd}">
+							<div class="item_state active">
+								<a href="javascript:void(0);" class="itemLink">
+									<div class="itemPic">
+										<img alt="" class="vLHTC pd_img" th:src="${imgGoodsUrl+'/'+goodsInfo.sysImgNm+'?RS=331'}" th:onerror="'this.src=\''+@{${uxImgUrl}+ '/images/pc/thumb/bg_item_none.png'}+'\';'">
+									</div>
+									<p class="itemBrand" th:text="${goodsInfo.brandGroupNm}">BRAND NAME1</p>
+									<div class="itemName" th:text="${goodsInfo.goodsFullNm}">남성 </div>
+								</a>
+								<input type="hidden" name="selectGoods" th:value="${goodsInfo.compsGoodsCd}" />
+							</div>
+						</div>
+					</li> 
+				</ul>
+			</div>
+			<!-- //아이템선택 -->
+		</div>
+	</div>
+</div>
+<!-- //딜배송제품리스트팝업 -->
+
+
 <script th:inline="javascript">
 /*<![CDATA[*/
 	
+	
+	// 구성 상품 상세 상품평
+	var fnGoodsDetailReview = function(params) {
+		gagajf.ajaxSubmit("/goods/detail/review/frame", "html", "goodsDealReview", params);
+	}
+	
+	// 상품평 상품선택시
+	var fnSelGoodsDealReview = function(goodsCd){
+		var params = new Object();
+		params.goodsCd = goodsCd;
+		fnGoodsDetailReview(params);  // ajax html
+		
+		$('.pd_pop.pd_listReview_pop').find('.deal_list_select .list li').each(function() { 
+			
+			if (goodsCd == $(this).find('input[name=selectGoods]').val()){
+				let tag = $(this).parent().parent().find('.item_prod').parent().html();
+				$('.tab_detail_cont.pd_review .item_blk').html(tag);
+			}
+		});
 
+	}
+	
+	// 구성 상품 상세 문의
+	var fnGoodsDetailQna = function(params) {
+		gagajf.ajaxSubmit("/goods/detail/qna/frame", "html", "goodsDealQna", params);
+	}
+	
+	// 문의 상품선택시
+	var fnSelGoodsDealQna = function(goodsCd){
+		var params = new Object();
+		params.goodsCd = goodsCd;
+		fnGoodsDetailQna(params);  // ajax html
+		
+		$('.pd_pop.pd_listQna_pop').find('.deal_list_select .list li').each(function() { 
+			if (goodsCd == $(this).find('input[name=selectGoods]').val()){
+				$('.pd_pop.pd_listQna_pop').find('.deal_list_select .list li').removeClass('selected');
+				$(this).addClass('selected');
+				let tag = $(this).html();
+				$('.tab_detail_cont.pd_qnalist .item_blk').html(tag);
+			}
+		});
+
+	}
+	
+	// 구성 상품 상세 배송정보
+	var fnGoodsDetailDelivery = function(params) {
+		
+		gagajf.ajaxSubmit("/goods/detail/delivery/frame", "html", "goodsDealDelivery", params);
+	}
+	
+	// 배송정보 상품선택시
+	var fnSelGoodsDealDelivery = function(goodsCd){
+		var params = new Object();
+		params.goodsCd = goodsCd;
+		fnGoodsDetailDelivery(params);  // ajax html
+		
+		$('.pd_pop.pd_listDelivery_pop').find('.deal_list_select .list li').each(function() { 
+			
+			if (goodsCd == $(this).find('input[name=selectGoods]').val()){
+				$('.pd_pop.pd_listDelivery_pop').find('.deal_list_select .list li').removeClass('selected');
+				$(this).addClass('selected');
+				let tag = $(this).html();
+				$('.tab_detail_cont.pd_delivery .item_blk').html(tag);
+			}
+		});
+		
+	}
+	
+	
+	// 상품선택시 상품상세내용 변경
+	var fnOpenGoodsDealDetail = function(goodsCd, compsGoodsCd){
+		
+		/* // 콤보박스 선택 처리
+		let $selObj = $('#layer_goods_deal_detail').find('.select_custom.deal_opt_item');
+		
+		// 탭별 선택시 기본 상품 설정
+		let selIdx = 0;
+		let selfGoodsYn = '';
+		let currPrice = 0;
+		let soldoutYn = "N";
+		$selObj.find('.combo .list li').each(function() { 
+			if ($(this).find('input[name=selectGoods]').val() == compsGoodsCd){
+				selfGoodsYn = $(this).find('input[name=selectGoods]').attr('selfGoodsYn');
+				currPrice = $(this).find('input[name=selectGoods]').attr('currPrice');
+				if ($(this).find('.item_prod').hasClass('soldout')) soldoutYn = "Y";
+				return false;
+			}
+			selIdx ++;
+		});
+		
+		$selObj.find('.combo .list li').eq(selIdx).trigger("click"); */
+		
+		// 상세노출
+		fnGoodsDealDesc(compsGoodsCd);
+/* 		
+		if (!soldout){
+			// 옵션1 처리
+			fnOption1("layer", compsGoodsCd, currPrice, selfGoodsYn);	
+		}
+ */		
+		
+	/* 	let $obj = $('.pd_detail .opt_result'); 
+		let $taget = $('.full_pop_fix_r .opt_result');
+		$taget.html($obj.html());
+		
+		fnSetTotalPrice();
+		
+		$('body').addClass('lock');
+		$("#layer_goods_deal_detail").show();  */
+		
+	}
+	
+	// 상세 레이어 창닫기
+	var fnCloseGoodsDealDetail = function(){
+		// 선택값 본창에 넘기기
+		/* let $obj = $('.full_pop_fix_r .opt_result');
+		let $taget = $('.pd_detail .opt_result');
+		$taget.html($obj.html());
+		
+		fnSetTotalPrice();
+		
+		$('body').removeClass('lock');
+		$('#goodsDealDetail').html('');
+		$("#layer_goods_deal_detail").hide(); */
+	}
+	
+	// 구성 상품 상세 
+	var fnGoodsDealDetail2 = function(params) {
+		
+		var Param = new Object();
+		var str = '<div class="modal pop_full fade pd_pop pd_descrp_pop" id="layer_goods_deal_desc" tabindex="-1" role="dialog" aria-labelledby="exampleFullLabel" aria-hidden="true"></div>';
+
+		if ($('#layer_goods_deal_desc').length == 0) {
+			$('body').append(str);
+		}
+
+		cfOpenLayer(_'/goods/deal/detail/info/frame', 'layer_goods_deal_desc' ,params );
+	
+	}
+
+	
+	// 레이어에서 상품선택시
+	var fnGoodsDealDesc = function(goodsCd){
+		var params = new Object();
+		params.goodsCd = goodsCd;
+		params.adminYn = "Y";
+		fnGoodsDealDetail2(params);  // ajax html
+	}
+	
+	$(document).ready( function() {
+		
+	});
+	
 	
 /*]]>*/
 </script>

+ 1 - 1
src/main/webapp/WEB-INF/views/mob/goods/GoodsQnaFormMob.html

@@ -33,7 +33,7 @@
 			</div>
 			<!-- //해당상품 -->
 		</div>
-		<div class="modal-body" id="goodsDealQna" data-id="layer_infinite_item" >
+		<div class="modal-body" id="goodsDealQna">
 		</div>
 		<div class="modal-footer">
 			

+ 2 - 2
src/main/webapp/WEB-INF/views/mob/goods/GoodsReviewPhotoFormMob.html

@@ -83,11 +83,11 @@
 		}
 		
 		if (result.paging.pageable.totalPage > result.paging.pageable.pageNo) {
-			$('#btnMore').parent().show();
+			$('#btnMore').parent().parent().show();
 			$('#goodsReviewPhotoForm input[name=pageNo]').val(result.paging.pageable.pageNo + 1);
 		} else {
 			$('.review_last').show();
-			$('#btnMore').parent().hide();
+			$('#btnMore').parent().parent().hide();
 		}
 	}
 	

+ 17 - 5
src/main/webapp/WEB-INF/views/mob/mypage/MypageGiftcardFormMob.html

@@ -216,15 +216,27 @@ function useGiftcard(result) {
 		let useGiftcard = giftcardUseList[i];
 		tmtbHtml += '	<li>                                                               ';
 		tmtbHtml += '		<div>                                                          ';
-		tmtbHtml += '			<span class="tag deepgray">차감</span>                       ';
-		tmtbHtml += '			<span class="tag_name">상품구매</span>                         ';
+		if (useGiftcard.gfcdAmt<0) {
+			tmtbHtml += '			<span class="tag deepgray">차감</span>                       ';
+		}else{
+			tmtbHtml += '		    <span class="tag primary">적립</span>';
+		}
+		
+		tmtbHtml += '			<span class="tag_name">'+useGiftcard.occurDtlDesc+'</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>                                                    ';
+		if (useGiftcard.gfcdAmt<0) {
+			tmtbHtml += '			<span class="amount_minus">                                ';
+			tmtbHtml += '				<em>'+useGiftcard.gfcdAmt.addComma()+'</em>원                                      ';
+			tmtbHtml += '			</span>                                                    ';
+		}else{
+			tmtbHtml += '			<span class="amount_plus">                                ';
+			tmtbHtml += '				<em>'+useGiftcard.gfcdAmt.addComma()+'</em>원                                      ';
+			tmtbHtml += '			</span>                                                    ';
+		}
+		
 		tmtbHtml += '		</div>                                                         ';
 		tmtbHtml += '	</li>                                                              ';
 	}

+ 220 - 0
src/main/webapp/WEB-INF/views/mob/mypage/MypagePointFormMob.html

@@ -0,0 +1,220 @@
+<!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/MypageLayoutMob">
+<!--
+ *******************************************************************************
+ * @source  : MypagePointFormMob.html
+ * @desc    : 마이페이지 > 포인트 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.04.19   sowon     최초 작성
+ *******************************************************************************
+ -->
+<body>
+<th:block layout:fragment="content">
+<main role="" id="" class="container my">
+			<section class="content point">
+
+				<div class="inner">
+					<div class="highlight_area">
+						<div class="have_amount">
+							<div class="total_amount">
+								보유 포인트&nbsp;<span><em th:text="${#numbers.formatDecimal(rmPntAmt, 0, 'COMMA', 0, 'POINT')}"></em>P</span>
+							</div>
+						</div>
+					</div>
+					<div class="have_amount">
+						<dl>
+							<div>
+								<dt>적립 예정 포인트</dt>
+								<dd><em th:text="${#numbers.formatDecimal(expectedPntAmt, 0, 'COMMA', 0, 'POINT')}"></em>P</dd>
+							</div>
+						</dl>
+						<dl>
+							<div>
+								<dt>한 달 이내 소멸 예정<span class="tag primary_line">D-<em>30</em></span></dt>
+								<dd><em th:text="${#numbers.formatDecimal(expectedExpirePntAmt, 0, 'COMMA', 0, 'POINT')}"></em>P</dd>
+							</div>
+						</dl>
+					</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="allPointList"><a href="javascript:void(0);">전체 내역</a></li>
+							<li id="accumulatePointList"><a href="javascript:void(0);">적립 내역</a></li>
+							<li id="usePointList"><a href="javascript:void(0);">사용 내역</a></li>
+						</ul>
+						<div class="tabContents">
+							<div class="tab_cont active" id="pointAjaxList">
+	
+								<!-- // tab_cont End -->
+							</div>
+						</div>
+					</div>
+				</div>
+
+			</section>
+		</main>
+<script th:inline="javascript">
+let accumulatePointList = [[${accumulatePointList}]];
+let usePointList = [[${usePointList}]];
+let allPointList = [[${allPointList}]];
+let date = [[${date}]];
+var year = date[0].year;
+var 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"));
+
+//날짜변경 이벤트
+var fnChangeDate = function(param) {
+	let url = '/mypage/allpoint/list';
+	
+	
+	//$(param).parent().parent().find('input[name=pointDate]').val($(param).val());
+	//var pointData = $(param).parent().parent().find('input[name=pointDate]').val();
+	
+	// 포인트화면 로딩시 이번달 설정 리스트 표시하기 위함
+	let data = {
+		searchDt : year + "" + month,
+		month : month
+	};
+	var jsonData = JSON.stringify(data);
+	
+	gagajf.ajaxJsonSubmit('/mypage/allpoint/list', jsonData, function(result){
+
+			accumulatePointList = result.accumulatePointList;
+			usePointList = result.usePointList;
+			allPointList = result.allPointList;
+			// 클릭상태 확인
+			if($("#accumulatePointList").hasClass("active")){
+				$("#accumulatePointList").click();
+				// 첫화면 전체내역 조회
+				fnGetPointTableInfo(result.accumulatePointList);
+			}else if($("#usePointList").hasClass("active")){
+				$("#usePointList").click();
+				fnGetPointTableInfo(usePointList);
+			}else if($("#allPointList").hasClass("active")) {
+				$("#allPointList").click();
+				fnGetPointTableInfo(allPointList);
+			}
+	});
+}
+
+// HTML 그리기
+var fnGetPointTableInfo = function(param) {
+	let tag = "";
+	if(param != null && param.length > 0){
+		$.each(param, function(idx,item){
+			tag += '<ul>';
+			tag += ' <li>';
+			tag += ' 	<div>';
+			if(item.pntAmt > 0){
+				tag += '		<span class="tag primary">적립</span>';
+			}else{
+				tag += ' 		<span class="tag deepgray">차감</span>';
+			}
+			
+			tag += ' 		<span class="tag_name">'+item.occurGb+'</span>';
+			tag += ' 		<span class="txt_content">'+ item.occurDtlDesc + '</span>';
+			tag += ' 		<span class="txt_time">'+item.pntUploadDt+'</span>';
+			tag += ' 	</div>';
+			tag += ' 	<div>';
+			if(item.pntAmt > 0){
+				tag += '		<span class="amount_plus">';
+				tag += '			<em>'+item.pntAmt.addComma()+'</em>P';
+				tag += '		</span>';
+			}else{
+				tag += '		<span class="c_primary">';
+				tag += '			<em>'+item.pntAmt.addComma()+'</em>P';
+				tag += '		</span>';
+			}
+			tag += ' 	</div>';
+			tag += ' </li>';
+			tag += '</ul>';
+		});
+		$("#pointAjaxList").html(tag);
+	}
+}
+
+// 전체내역 조회
+$("#allPointList").click(function(){
+
+		$("#accumulatePointList").removeClass("active");
+		$("#usePointList").removeClass("active");
+		
+		$("#allPointList").addClass("active");
+		//$("#plusMinus").text("증감/차감");
+		
+		fnGetPointTableInfo(allPointList);
+});
+
+// 적립내역 조회
+$("#accumulatePointList").click(function(){
+
+		$("#allPointList").removeClass("active");
+		$("#usePointList").removeClass("active");
+		
+		$("#accumulatePointList").addClass("active");
+		//$("#plusMinus").text("증감");
+	
+		fnGetPointTableInfo(accumulatePointList);
+});
+
+// 사용내역 조회
+$("#usePointList").click(function(){
+	
+	$("#accumulatePointList").removeClass("active");
+	$("#allPointList").removeClass("active");
+	
+	$("#usePointList").addClass("active");
+	//$("#plusMinus").text("차감");
+	
+	fnGetPointTableInfo(usePointList);
+});
+
+$(document).ready(function() {
+	// 전체내역 표시
+	$("#allPointList").trigger("click");
+	
+
+	// 셀렉트박스 활성화
+	$('.select_custom').each(function(index) {
+		var selecter01 = new sCombo($(this));
+	});
+
+	// 셀렉트박스 데이터 설정
+	fnChangeDate();
+
+});
+
+</script>
+	</th:block>
+
+</body>
+</html>

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

@@ -3,7 +3,7 @@
 	xmlns:th="http://www.thymeleaf.org">
 <!--
  *******************************************************************************
- * @source  : SigninFormWeb.html
+ * @source  : SnsCallBackFormWeb.html
  * @desc    : 로그인 Page
  *============================================================================
  * STYLE24

+ 2 - 0
src/main/webapp/WEB-INF/views/web/cart/CartChangeOptionPopupWeb.html

@@ -187,6 +187,8 @@
 						</th:block>
 					</th:block>
 					<div class="opt_count">
+						<input type="hidden" class="minOrdQty" th:value="${cart.minOrdQty}" />
+						<input type="hidden" class="maxOrdQty" th:value="${cart.maxOrdQty}" />
 						<div class="opt_header">
 							<span class="title">수량</span>
 						</div>

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

@@ -572,19 +572,19 @@
 			temp.optCd 			= "13256848-2";
 			temp.goodsQty 		= 3;
 			temp.goodsType 		= "G056_N";
-			temp.cartGb 		= "G";
+			temp.cartGb 		= "C";
 			temp.afLinkCd 		= "afLinkCd";
 			temp.ithrCd 		= "G027_ZZZ";
 			temp.contentsLoc 	= "G028_YYY";
 			temp.planDtlSq 		= "123";
 			compsList.push(temp);
 
-			temp 			= new Object;
+			temp 				= new Object;
 			temp.goodsCd 		= "AOW13QDM76";
 			temp.optCd 			= "13256848-6";
 			temp.goodsQty 		= 3;
 			temp.goodsType 		= "G056_N";
-			temp.cartGb 		= "G";
+			temp.cartGb 		= "C";
 			temp.afLinkCd 		= "afLinkCd";
 			temp.ithrCd 		= "G027_ZZZ";
 			temp.contentsLoc 	= "G028_YYY";

+ 19 - 6
src/main/webapp/WEB-INF/views/web/cart/CartListFormWeb.html

@@ -301,24 +301,37 @@
 	$(document).on('click','.optModify_pop .number_count .minus',function(e){
 		var $input = $(this).parent().find('input');
 		var count = parseInt($input.val()) - 1;
-		count = count < 1 ? 1 : count;
+		var minOrdQty = $(this).parent().parent().find(".minOrdQty").val();
+
+		count = count < minOrdQty ? minOrdQty : count;
 		$input.val(count);
 		$input.change();
 		//수량1개 이하 감소버튼 비활성화
-		if ($input.val() == 1) {
+		if ($input.val() == minOrdQty) {
 			$('.optModify_pop .number_count .minus').addClass('min_val');
 		}
+
+		$('.optModify_pop .number_count .plus').removeClass('min_val');
+
 		return false;
 	}).on('click','.optModify_pop .number_count .plus',function(e){
 		var $input = $(this).parent().find('input');
-		$input.val(parseInt($input.val()) + 1);
+		var count = parseInt($input.val()) + 1;
+		var maxOrdQty = $(this).parent().parent().find(".maxOrdQty").val();
+
+		count = count > maxOrdQty ? maxOrdQty : count;
+		$input.val(count);
 		$input.change();
-		//수량2개 이상부터 감소버튼 활성화
+
+		//주문 최대 수량 이상 증가버튼 비활성화
+		if ($input.val() == maxOrdQty) {
+			$('.optModify_pop .number_count .plus').addClass('min_val');
+		}
+
 		$('.optModify_pop .number_count .minus').removeClass('min_val');
 		return false;
 	}).on('keyup','.optModify_pop .number_count input[type=text]',function(e){
-		//텍스트, 0 입력금지
-		$(this).val($(this).val().replace(/[^1-9]/g,""));
+		$(this).val($(this).val().replace(/[^0-9]/g,""));
 	});
 
     //상품옵션변경 팝업 > 컬러선택 표기

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

@@ -26,7 +26,7 @@
 					<p>계정 연동 시, STYLE24 휴면계정은 휴면해제 후 이용 가능합니다.</p>
 					<div class="info_txt">
 						<ul>
-							<li>“<span class="mb_name">회원명</span>” 님의 <em>CI, 이름, 성별, 생년월일, 핸드폰번호, 이메일 정보</em>를 로그인 연동을 위해 아이스타일24에 제공합니다.</li>
+							<li>“<span class="mb_name" th:text="${custNm}">회원명</span>” 님의 <em>CI, 이름, 성별, 생년월일, 핸드폰번호, 이메일 정보</em>를 로그인 연동을 위해 아이스타일24에 제공합니다.</li>
 							<li>정보제공 동의 시 YES24 계정으로 로그인 가능하며, 간편하게 회원가입이 가능합니다.</li>
 						</ul>
 					</div>

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

@@ -37,10 +37,13 @@
 											<th:block th:if="${ContentsData.imgPath1!=null && ContentsData.imgPath1!=''}">
 												<div class="txtWrap">
 													<dl class="w">
-														<dd th:text="${ContentsData.strTitle1}"></dd>
+														<dd class="bMainTitle">
+															<input type="hidden" name="mainTitle" th:value="${ContentsData.strTitle1}"/>
+														</dd>
 														<dd class="txt_xs" th:text="${ContentsData.subText1}"></dd>
 													</dl>
-													<button type="button" class="btn" th:onclick="cfnGoToPage([[${ContentsData.strVar1}]]);"><span>VIEW MORE</span></button>
+													<button type="button" th:if="${ContentsData.contentsType=='SELF'}" class="btn" th:onclick="cfnGoToPage([[${ContentsData.strVar1}]]);"><span>VIEW MORE</span></button>
+													<button type="button" th:unless="${ContentsData.contentsType=='SELF'}" class="btn" th:onclick="window.open(_frontUrl+[[${ContentsData.strVar1}]], '_blank','width=1180,height=800,toolbars=no,scrollbars=no'); return false;"><span>VIEW MORE</span></button>
 												</div>
 												<img th:src="${@environment.getProperty('domain.image')+ContentsData.imgPath1}">
 											</th:block>
@@ -70,7 +73,8 @@
 							<div class="cont_body clear">
 								<div class="brand_tit">
 									<p th:text="${contentsTitle}"></p>
-									<a th:href="${ContentsData.strVar1}">브랜드 사이트</a>
+									<a th:if="${ContentsData.contentsType=='SELF'}" th:href="${ContentsData.strVar1}" target="_self">브랜드 사이트</a>
+									<a th:unless="${ContentsData.contentsType=='SELF'}" th:href="${ContentsData.strVar1}" target="_blank">브랜드 사이트</a>
 								</div>
 								<div class="brand_desc">
 									<p class="cate" th:text="${ContentsData.strTitle1}"></p>
@@ -697,6 +701,21 @@ $(document).ready( function() {
 		},
 	});
 
+	// 브랜드메인 배너 <br> 처리
+	$('.bMainTitle').each(function (){
+		let tag = '';
+		var brText = $(this).find("input[name=mainTitle]").val();
+
+		if(brText.indexOf('<br>') > -1){
+			var reText = brText.split("<br>");
+			tag += reText[0];
+			tag += '<br>';
+			tag += reText[1];
+		}else{
+			tag += brText;
+		}
+		$(this).append(tag);
+	});
 });
 /*]]>*/
 </script>

+ 243 - 221
src/main/webapp/WEB-INF/views/web/display/CategoryGoodsListFormWeb.html

@@ -2,7 +2,7 @@
 <html lang="ko"
 	  xmlns:th="http://www.thymeleaf.org"
 	  xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
-	  layout:decorator="web/common/layout/DefaultLayoutWeb">
+	  layout:decorator="web/common/layout/PlanningLayoutWeb">
 <!--
  *******************************************************************************
  * @source  : CategoryGoodsListFormWeb.html
@@ -21,8 +21,8 @@
 <th:block layout:fragment="content">
 	<div id="container" class="container dp">
 		<div class="breadcrumb">
-			<ul>
-				<li class="bread_home"><a href="index.html">홈</a></li>
+			<ul id="navArea">
+				<li class="bread_home"><a href="javascript:void(0);" id="navHome">홈</a></li>
 				<li class="bread_2depth" id="navNm">여성</li>
 			</ul>
 		</div>
@@ -44,235 +44,237 @@
 					</div>
 				</div>
 				<div class="cont">
-					<div class="cont_body">
-						<div class="filter_list">
-							<!-- 1depth -->
-							<ul>
-								<li data-id="tap02" th:if="${filterBrandList!=null and !filterBrandList.empty}">
-									<a href="javascript:void(0)">브랜드</a>
-								</li>
-								<li data-id="tap03" th:if="${filterSizeList!=null and !filterSizeList.empty}">
-									<a href="javascript:void(0)">사이즈</a>
-								</li>
-								<li data-id="tap04" th:if="${filterPriceList!=null and !filterPriceList.empty}">
-									<a href="javascript:void(0)">가격</a>
-								</li>
-								<li data-id="tap05">
-									<a href="javascript:void(0)">할인율</a>
-								</li>
-								<li data-id="tap06" th:if="${filterAgeList!=null and !filterAgeList.empty}">
-									<a href="javascript:void(0)">연령</a>
-								</li>
-								<li data-id="tap07" th:if="${filterSeasonList!=null and !filterSeasonList.empty}">
-									<a href="javascript:void(0)">시즌</a>
-								</li>
-								<li data-id="tap08" th:if="${filterColorList!=null and !filterColorList.empty}">
-									<a href="javascript:void(0)">컬러</a>
-								</li>
-								<li data-id="tap09" th:if="${filterBenefitList!=null and !filterBenefitList.empty}">
-									<a href="javascript:void(0)">혜택</a>
-								</li>
-							</ul>
-							<div class="form_field">
-								<div>
-									<input id="price" type="checkbox" ><label for="price"> <span>남여 공용만 보기</span> </label>
-								</div>
-								<div>
-									<input id="chk-2" type="checkbox" checked=""><label for="chk-2"> <span>신상품만 보기</span> </label>
-								</div>
-							</div>
-						</div>
-						<div class="filter_content">
-							<!-- 브랜드 -->
-							<div class="sort tap02" th:if="${filterBrandList!=null and !filterBrandList.empty}">
+					<form id="filterForm">
+						<div class="cont_body">
+							<div class="filter_list">
+								<!-- 1depth -->
 								<ul>
-									<th:block th:each="filterBrandData, filterBrandStat : ${filterBrandList}">
-									<li>
-										<label class="brand_btn" onclick="filterSel();">
-											<input type="checkbox" group="filterValue" th:id="${'chkFilterBrand'+filterBrandStat.count}" name="filterBrandCds" th:value="${filterBrandData.filterCd}"><span th:text="${filterBrandData.filterNm}"></span>
-										</label>
+									<li data-id="tap02" th:if="${filterBrandList!=null and !filterBrandList.empty}">
+										<a href="javascript:void(0)">브랜드</a>
 									</li>
-									</th:block>
-								</ul>
-								<a href="javascript:void(0)" class="tap_close">delete-btn</a>
-							</div>
-							<!-- //브랜드 -->
-							<!-- 사이즈 -->
-							<div class="sort tap03" th:if="${filterSizeList!=null and !filterSizeList.empty}">
-								<ul>
-									<li>
-										<strong>상의</strong>
-										<th:block th:each="filterSizeData, filterSizeStat : ${filterSizeList}" th:if="${filterSizeData.filterCd == 'T'}">
-											<label class="size_btn" onclick="filterSel();">
-												<input type="checkbox" group="filterValue" th:id="${'chkFilterTSize'+filterSizeStat.count}" name="filterSizeCds" th:vale="${filterSizeData.filterNm}"><span th:text="${filterSizeData.filterNm}">80</span>
-											</label>
-										</th:block>
+									<li data-id="tap03" th:if="${filterSizeList!=null and !filterSizeList.empty}">
+										<a href="javascript:void(0)">사이즈</a>
 									</li>
-									<li>
-										<strong>하의</strong>
-										<th:block th:each="filterSizeData, filterSizeStat : ${filterSizeList}" th:if="${filterSizeData.filterCd == 'B'}">
-											<label class="size_btn" onclick="filterSel();">
-												<input type="checkbox" group="filterValue" th:id="${'chkFilterBSize'+filterSizeStat.count}" name="filterSizeCds" th:vale="${filterSizeData.filterNm}"><span th:text="${filterSizeData.filterNm}">80</span>
-											</label>
-										</th:block>
+									<li data-id="tap04" th:if="${filterPriceList!=null and !filterPriceList.empty}">
+										<a href="javascript:void(0)">가격</a>
 									</li>
-									<li>
-										<strong>신발</strong>
-										<th:block th:each="filterSizeData, filterSizeStat : ${filterSizeList}" th:if="${filterSizeData.filterCd == 'S'}">
-											<label class="size_btn" onclick="filterSel();">
-												<input type="checkbox" group="filterValue" th:id="${'chkFilterSSize'+filterSizeStat.count}" name="filterSizeCds" th:vale="${filterSizeData.filterNm}"><span th:text="${filterSizeData.filterNm}">80</span>
-											</label>
-										</th:block>
+									<li data-id="tap05">
+										<a href="javascript:void(0)">할인율</a>
+									</li>
+									<li data-id="tap06" th:if="${filterAgeList!=null and !filterAgeList.empty}">
+										<a href="javascript:void(0)">연령</a>
+									</li>
+									<li data-id="tap07" th:if="${filterSeasonList!=null and !filterSeasonList.empty}">
+										<a href="javascript:void(0)">시즌</a>
+									</li>
+									<li data-id="tap08" th:if="${filterColorList!=null and !filterColorList.empty}">
+										<a href="javascript:void(0)">컬러</a>
+									</li>
+									<li data-id="tap09" th:if="${filterBenefitList!=null and !filterBenefitList.empty}">
+										<a href="javascript:void(0)">혜택</a>
 									</li>
 								</ul>
-								<a href="javascript:void(0)" class="tap_close">delete-btn</a>
-							</div>
-							<!-- //사이즈 -->
-							<!-- 가격 -->
-							<div class="sort tap04">
-								<div class="range">
-									<input type="text" class="js-range-slider01" name="my_range01" value="" />
-								</div>
-								<a href="javascript:void(0)" class="tap_close">delete-btn</a>
-							</div>
-							<!-- //가격 -->
-							<!-- 할인율 -->
-							<div class="sort tap05">
-								<ul style="display:none;">
-									<li><input type="checkbox" id="percent01" name="range" value="0"><label for="percent01"><span></span><span>0%</span></label></li>
-									<li><input type="checkbox" id="percent02" name="range" value="10"><label for="percent02"><span></span><span>10%</span></label></li>
-									<li><input type="checkbox" id="percent03" name="range" value="20"><label for="percent03"><span></span><span>20%</span></label></li>
-									<li><input type="checkbox" id="percent04" name="range" value="30"><label for="percent04"><span></span><span>30%</span></label></li>
-									<li><input type="checkbox" id="percent05" name="range" value="40"><label for="percent05"><span></span><span>40%</span></label></li>
-									<li><input type="checkbox" id="percent06" name="range" value="50"><label for="percent06"><span></span><span>50%</span></label></li>
-									<li><input type="checkbox" id="percent07" name="range" value="60"><label for="percent07"><span></span><span>60%</span></label></li>
-									<li><input type="checkbox" id="percent08" name="range" value="70"><label for="percent08"><span></span><span>70%</span></label></li>
-									<li><input type="checkbox" id="percent09" name="range" value="80"><label for="percent09"><span></span><span>80%</span></label></li>
-									<li><input type="checkbox" id="percent10" name="range" value="100"><label for="percent10"><span></span><span>100%</span></label></li>
-								</ul>
-								<div class="range">
-									<input type="text" class="js-range-slider02" name="my_range02" value="" />
+								<div class="form_field">
+									<div>
+										<input id="price" type="checkbox" ><label for="price"> <span>남여 공용만 보기</span> </label>
+									</div>
+									<div>
+										<input id="chk-2" type="checkbox" checked=""><label for="chk-2"> <span>신상품만 보기</span> </label>
+									</div>
 								</div>
-								<a href="javascript:void(0)" class="tap_close">delete-btn</a>
 							</div>
-							<!-- //할인율 -->
-							<!-- 연령 -->
-							<div class="sort tap06" th:if="${filterAgeList!=null and !filterAgeList.empty}">
-								<ul>
-									<th:block th:each="filterAgeData, filterAgeStat : ${filterAgeList}">
+							<div class="filter_content">
+								<!-- 브랜드 -->
+								<div class="sort tap02" th:if="${filterBrandList!=null and !filterBrandList.empty}" id="brandFilterDiv">
+									<ul>
+										<th:block th:each="filterBrandData, filterBrandStat : ${filterBrandList}">
 										<li>
-											<label class="Age_btn" onclick="filterSel();">
-												<input type="checkbox" group="filterValue" th:id="${'chkFilterAge'+filterAgeStat.count}" name="filterAgeCds" th:value="${filterAgeData.filterCd}"><span th:text="${filterAgeData.filterNm}">베이비(0~18개월)</span>
+											<label class="brand_btn">
+												<input type="checkbox" group="filterValue" th:id="${'chkFilterBrand'+filterBrandStat.count}" name="brand" th:value="${filterBrandData.filterCd}" th:data-id="${filterBrandData.filterNm}" onclick="filterSel(this,'brand','off');"><span th:text="${filterBrandData.filterNm}"></span>
 											</label>
 										</li>
-									</th:block>
-								</ul>
-								<a href="javascript:void(0)" class="tap_close">delete-btn</a>
-							</div>
-							<!-- //연령 -->
-							<!-- 시즌 -->
-							<div class="sort tap07" th:if="${filterSeasonList!=null and !filterSeasonList.empty}">
-								<ul>
-									<th:block th:each="filterSeasonData, filterSeasonStat : ${filterSeasonList}">
-										<li>
-											<label class="Season_btn" onclick="filterSel();">
-												<input type="checkbox" group="filterValue"  th:id="${'chkFilterSeason'+filterSeasonStat.count}" name="filterSeasonCds" th:value="${filterSeasonData.filterCd}"><span th:text="${filterSeasonData.filterNm}">봄</span>
-											</label>
+										</th:block>
+									</ul>
+									<a href="javascript:void(0)" class="tap_close">delete-btn</a>
+								</div>
+								<!-- //브랜드 -->
+								<!-- 사이즈 -->
+								<div class="sort tap03" th:if="${filterSizeList!=null and !filterSizeList.empty}" id="sizeFilterDiv">
+									<ul>
+										<li id="sizeLi1">
+											<strong>상의</strong>
+											<th:block th:each="filterSizeData, filterSizeStat : ${filterSizeList}" th:if="${filterSizeData.filterCd == 'T'}">
+												<label class="size_btn">
+													<input type="checkbox" group="filterValue" th:id="${'chkFilterTSize'+filterSizeStat.count}" name="size" th:vale="${filterSizeData.filterNm}" th:data-id="${filterSizeData.filterNm}" onclick="filterSel(this,'size','off','1');"><span th:text="${filterSizeData.filterNm}">80</span>
+												</label>
+											</th:block>
 										</li>
-									</th:block>
-								</ul>
-								<a href="javascript:void(0)" class="tap_close">delete-btn</a>
-							</div>
-							<!-- //시즌 -->
-							<!-- 컬러 -->
-							<div class="sort tap08" th:if="${filterColorList!=null and !filterColorList.empty}">
-								<ul>
-									<th:block th:each="filterColorData, filterColorStat : ${filterColorList}">
-										<li>
-											<label class="color-check" onclick="filterSel();">
-												<input type="checkbox" group="filterValue" th:id="${'chkFilterColor'+filterColorStat.count}" name="filterColorCds" th:value="${filterColorData.filterNm}" >
-												<span class="pdColor-color" th:if="${filterColorData.filterNm=='#FFFFFF'}" th:style="${'background-color:'+filterColorData.filterNm+';'+' border:1px solid #aaa;'}"></span>
-												<span class="pdColor-color" th:if="${filterColorData.filterNm!='#FFFFFF'}" th:style="${'background-color:'+filterColorData.filterNm}"></span>
-											</label>
+										<li id="sizeLi2">
+											<strong>하의</strong>
+											<th:block th:each="filterSizeData, filterSizeStat : ${filterSizeList}" th:if="${filterSizeData.filterCd == 'B'}">
+												<label class="size_btn">
+													<input type="checkbox" group="filterValue" th:id="${'chkFilterBSize'+filterSizeStat.count}" name="size2" th:vale="${filterSizeData.filterNm}" th:data-id="${filterSizeData.filterNm}" onclick="filterSel(this,'size','off','2');"><span th:text="${filterSizeData.filterNm}">80</span>
+												</label>
+											</th:block>
 										</li>
-									</th:block>
-								</ul>
-								<a href="javascript:void(0)" class="tap_close">delete-btn</a>
-							</div>
-							<!-- //컬러 -->
-							<!-- 혜택 -->
-							<div class="sort tap09" th:if="${filterBenefitList!=null and !filterBenefitList.empty}">
-								<ul>
-									<th:block th:each="filterBenefitData, filterBenefitStat : ${filterBenefitList}">
-										<li>
-											<label class="Benefits_btn" onclick="filterSel();">
-												<input type="checkbox" group="filterValue" th:id="${'chkFilterBenefits'+filterBenefitStat.count}" name="filterBenefitsCds" th:value="${filterBenefitData.filterCd}"><span th:text="${filterBenefitData.filterNm}"></span>
-											</label>
+										<li id="sizeLi3">
+											<strong>신발</strong>
+											<th:block th:each="filterSizeData, filterSizeStat : ${filterSizeList}" th:if="${filterSizeData.filterCd == 'S'}">
+												<label class="size_btn">
+													<input type="checkbox" group="filterValue" th:id="${'chkFilterSSize'+filterSizeStat.count}" name="size3" th:vale="${filterSizeData.filterNm}" th:data-id="${filterSizeData.filterNm}" onclick="filterSel(this,'size','off','3');"><span th:text="${filterSizeData.filterNm}">80</span>
+												</label>
+											</th:block>
 										</li>
-									</th:block>
-								</ul>
-								<a href="javascript:void(0)" class="tap_close">delete-btn</a>
-							</div>
-							<!-- //혜택 -->
-							<!-- 필터 -->
-							<div class="fillter">
-								<div class="fillter_box">
-                                    <span>
-                                        모이몰른
-                                        <a href="javascript:;" class="filter_delete"></a >
-                                    </span>
-									<!-- 컬러 표시 -->
-									<span>
-                                        <span class="pdColor-color12"></span>
-                                        <a href="javascript:;" class="filter_delete"></a >
-                                    </span>
-									<!-- 컬러 표시 -->
+									</ul>
+									<a href="javascript:void(0)" class="tap_close">delete-btn</a>
 								</div>
-								<button class="fillter_reset"><span>전체 초기화</span></button>
-							</div>
-							<!-- //필터 -->
-						</div>
-						<div class="list_content"> <!-- 데이터 없을시 클래스 nodata 추가 -->
-							<div class="list_defult">
-								<div>
-									<p>선택하신 조건에 맞는 상품이 없습니다.<br>필터를 변경해 보세요.</p>
+								<!-- //사이즈 -->
+								<!-- 가격 -->
+								<div class="sort tap04" id="priceFilterDiv">
+									<div class="range">
+										<input type="text" class="js-range-slider01" name="my_range01" value="" />
+									</div>
+									<a href="javascript:void(0)" class="tap_close">delete-btn</a>
 								</div>
-								<div class="ui_row">
-									<button type="button" class="btn btn_default btn_md"><span>선택한 필터 초기화</span></button>
+								<!-- //가격 -->
+								<!-- 할인율 -->
+								<div class="sort tap05" id="dcrateFilterDiv">
+									<ul style="display:none;">
+										<li><input type="checkbox" id="percent01" name="range" value="0"><label for="percent01"><span></span><span>0%</span></label></li>
+										<li><input type="checkbox" id="percent02" name="range" value="10"><label for="percent02"><span></span><span>10%</span></label></li>
+										<li><input type="checkbox" id="percent03" name="range" value="20"><label for="percent03"><span></span><span>20%</span></label></li>
+										<li><input type="checkbox" id="percent04" name="range" value="30"><label for="percent04"><span></span><span>30%</span></label></li>
+										<li><input type="checkbox" id="percent05" name="range" value="40"><label for="percent05"><span></span><span>40%</span></label></li>
+										<li><input type="checkbox" id="percent06" name="range" value="50"><label for="percent06"><span></span><span>50%</span></label></li>
+										<li><input type="checkbox" id="percent07" name="range" value="60"><label for="percent07"><span></span><span>60%</span></label></li>
+										<li><input type="checkbox" id="percent08" name="range" value="70"><label for="percent08"><span></span><span>70%</span></label></li>
+										<li><input type="checkbox" id="percent09" name="range" value="80"><label for="percent09"><span></span><span>80%</span></label></li>
+										<li><input type="checkbox" id="percent10" name="range" value="100"><label for="percent10"><span></span><span>100%</span></label></li>
+									</ul>
+									<div class="range">
+										<input type="text" class="js-range-slider02" name="my_range02" value="" />
+									</div>
+									<a href="javascript:void(0)" class="tap_close">delete-btn</a>
 								</div>
-							</div>
-							<div class="count_wrap">
-								<div>
-									<p><span id="totCntId"></span>개의 상품</p>
+								<!-- //할인율 -->
+								<!-- 연령 -->
+								<div class="sort tap06" th:if="${filterAgeList!=null and !filterAgeList.empty}" id="ageFilterDiv">
+									<ul>
+										<th:block th:each="filterAgeData, filterAgeStat : ${filterAgeList}">
+											<li>
+												<label class="Age_btn">
+													<input type="checkbox" group="filterValue" th:id="${'chkFilterAge'+filterAgeStat.count}" name="age" th:value="${filterAgeData.filterCd}" th:data-id="${filterAgeData.filterNm}" onclick="filterSel(this,'age','off');"><span th:text="${filterAgeData.filterNm}">베이비(0~18개월)</span>
+												</label>
+											</li>
+										</th:block>
+									</ul>
+									<a href="javascript:void(0)" class="tap_close">delete-btn</a>
 								</div>
-								<div>
+								<!-- //연령 -->
+								<!-- 시즌 -->
+								<div class="sort tap07" th:if="${filterSeasonList!=null and !filterSeasonList.empty}" id="seasonFilterDiv">
 									<ul>
-										<li>
-											<a href="" class="on">최신상품순</a>
-										</li>
-										<li>
-											<a href="">인기상품순</a>
-										</li>
-										<li>
-											<a href="">리뷰 많은순</a>
-										</li>
+										<th:block th:each="filterSeasonData, filterSeasonStat : ${filterSeasonList}">
+											<li>
+												<label class="Season_btn">
+													<input type="checkbox" group="filterValue"  th:id="${'chkFilterSeason'+filterSeasonStat.count}" name="season" th:value="${filterSeasonData.filterCd}" th:data-id="${filterSeasonData.filterNm}" onclick="filterSel(this,'season','off');"><span th:text="${filterSeasonData.filterNm}">봄</span>
+												</label>
+											</li>
+										</th:block>
 									</ul>
+									<a href="javascript:void(0)" class="tap_close">delete-btn</a>
 								</div>
-							</div>
-
-							<div id="infiniteContainer">
-								<div id="listBoxOuter" class="itemsGrp">
-									<ul class="productlist quarter" >
+								<!-- //시즌 -->
+								<!-- 컬러 -->
+								<div class="sort tap08" th:if="${filterColorList!=null and !filterColorList.empty}" id="colorFilterDiv">
+									<ul>
+										<th:block th:each="filterColorData, filterColorStat : ${filterColorList}">
+											<li>
+												<label class="color-check">
+													<input type="checkbox" group="filterValue" th:id="${'chkFilterColor'+filterColorStat.count}" name="color" th:value="${filterColorData.filterNm}" th:data-id="${filterColorData.filterNm.replace('#','')}" onclick="filterSel(this,'color','off');">
+													<span class="pdColor-color" th:if="${filterColorData.filterNm=='#FFFFFF'}" th:style="${'background-color:'+filterColorData.filterNm+';'+' border:1px solid #aaa;'}" th:value="${filterColorData.filterNm}"></span>
+													<span class="pdColor-color" th:if="${filterColorData.filterNm!='#FFFFFF'}" th:style="${'background-color:'+filterColorData.filterNm}" th:value="${filterColorData.filterNm}"></span>
+												</label>
+											</li>
+										</th:block>
+									</ul>
+									<a href="javascript:void(0)" class="tap_close">delete-btn</a>
+								</div>
+								<!-- //컬러 -->
+								<!-- 혜택 -->
+								<div class="sort tap09" th:if="${filterBenefitList!=null and !filterBenefitList.empty}" id="benefitFilterDiv">
+									<ul>
+										<th:block th:each="filterBenefitData, filterBenefitStat : ${filterBenefitList}">
+											<li>
+												<label class="Benefits_btn">
+													<input type="checkbox" group="filterValue" th:id="${'chkFilterBenefits'+filterBenefitStat.count}" name="benefit" th:value="${filterBenefitData.filterCd}" th:data-id="${filterBenefitData.filterNm}" onclick="filterSel(this,'benefit','off');"><span th:text="${filterBenefitData.filterNm}"></span>
+												</label>
+											</li>
+										</th:block>
 									</ul>
+									<a href="javascript:void(0)" class="tap_close">delete-btn</a>
 								</div>
+								<!-- //혜택 -->
+								<!-- 필터 -->
+								<div class="fillter">
+									<div class="fillter_box" id="filterData">
+<!--										<span>-->
+<!--											모이몰른-->
+<!--											<a href="javascript:;" class="filter_delete"></a >-->
+<!--										</span>-->
+										<!-- 컬러 표시 -->
+<!--										<span>-->
+<!--											<span class="pdColor-color12"></span>-->
+<!--											<a href="javascript:;" class="filter_delete"></a >-->
+<!--										</span>-->
+										<!-- 컬러 표시 -->
+									</div>
+									<button class="fillter_reset" onclick="fnFilterReset();"><span>전체 초기화</span></button>
+								</div>
+								<!-- //필터 -->
 							</div>
+							<div class="list_content"> <!-- 데이터 없을시 클래스 nodata 추가 -->
+								<div class="list_defult">
+									<div>
+										<p>선택하신 조건에 맞는 상품이 없습니다.<br>필터를 변경해 보세요.</p>
+									</div>
+									<div class="ui_row">
+										<button type="button" class="btn btn_default btn_md"><span>선택한 필터 초기화</span></button>
+									</div>
+								</div>
+								<div class="count_wrap">
+									<div>
+										<p><span id="totCntId"></span>개의 상품</p>
+									</div>
+									<div>
+										<ul>
+											<li>
+												<a href="" class="on">최신상품순</a>
+											</li>
+											<li>
+												<a href="">인기상품순</a>
+											</li>
+											<li>
+												<a href="">리뷰 많은순</a>
+											</li>
+										</ul>
+									</div>
+								</div>
 
-							<div class="itemsGrp" id="listBox">
+								<div id="infiniteContainer">
+									<div id="listBoxOuter" class="itemsGrp">
+										<ul class="productlist quarter" >
+										</ul>
+									</div>
+								</div>
 
-							</div>
+								<div class="itemsGrp" id="listBox">
 
+								</div>
+
+							</div>
 						</div>
-					</div>
+					</form>
 				</div>
 			</div>
 		</div>
@@ -293,7 +295,7 @@
 
 	<script src="/ux/plugins/gaga/gaga.infinite.scrollSession.js"></script>
 	<script src="/ux/plugins/jquery/jquery.history.min.js"></script>
-	<script th:src="@{'/biz/goodsSession.js?v=' + ${#calendars.format(#calendars.createNow(), 'yyyyMMddHHmmss')}}" src="/biz/goodsSession.js"></script>
+	<script th:src="@{'/biz/goods.js?v=' + ${#calendars.format(#calendars.createNow(), 'yyyyMMddHHmmss')}}" src="/biz/goods.js"></script>
 	<script th:inline="javascript">
 		/*<![CDATA[*/
 		var filterPriceList = [[${filterPriceList}]];
@@ -312,6 +314,7 @@
 				var my_to = custom_values.indexOf(custom_values[5]); //custom_values.indexOf('230,000원');
 				var minValue = custom_values[0];
 				var maxValue = custom_values[5];
+				console.log('my_from>>'+my_from);
 
 				$(".dp .js-range-slider01, .sch_result .js-range-slider01").ionRangeSlider({
 					type: "double",
@@ -330,7 +333,7 @@
 			//할인율
 			var custom_values02 = ['0%', '10%', '20%', '30%', '40%', '50%', '60%', '70%', '80%', '90%', '100%'];
 			var my_from02 = custom_values02.indexOf('0%');
-			var my_to02 = custom_values02.indexOf('100%');
+			var my_to02 = custom_values02.indexOf('10%');
 			$(".dp .js-range-slider02, .sch_result .js-range-slider02").ionRangeSlider({
 				type: "double",
 				min: 0,
@@ -349,13 +352,25 @@
 			//fnGoodsListSearch();
 		});
 
+		var fnFilterReset = function (){
+			$("#searchGoodsForm input:hidden[name=brandSearch]").remove();
+			$("#searchGoodsForm input:hidden[name=sizeSearch]").remove();
+			$("#searchGoodsForm input:hidden[name=priceSearch]").remove();
+			$("#searchGoodsForm input:hidden[name=dcrateSearch]").remove();
+			$("#searchGoodsForm input:hidden[name=seasonSearch]").remove();
+			$("#searchGoodsForm input:hidden[name=colorSearch]").remove();
+			$("#searchGoodsForm input:hidden[name=benefitSearch]").remove();
+		}
+
 		var fnGoodsListSearch = function (){
+			console.log('1');
 			gagaInfiniteScroll.getHistory();
+			console.log('2');
 		}
 
 		// 상품 검색
 		var fnGetInfiniteScrollDataList = function (pageNum){
-			console.log('pageNum:::'+pageNum);
+			console.log('3');
 			$("#searchGoodsForm input[name=pageNo]").val(pageNum+1);
 			gagajf.ajaxFormSubmit("/display/category/goods/list", document.searchGoodsForm,  gagaInfiniteScroll.jsonToHtml);
 		}
@@ -417,6 +432,7 @@
 			var formTitle = "";
 
 			let tag = '';
+
 			if (cate1 != null) {
 				tag += '<li';
 					if(cate1.cate1No == cate1No){
@@ -424,12 +440,17 @@
 					}
 				tag += '>\n';
 				tag += '	<a href="javascript:javascript:void(0);"';
-				if(cate1.cate1No == cate1No){
+				if(cate1.cate1No == cate1No && cate2No == null){
 					tag += ' class="on"';
 					formTitle = cate1.cate1Nm;
-					navNm = cate1.cate1Nm;
-					$("#navNm").text(navNm);
 					$("#formTitle").text(formTitle);
+					if(brandGroupNo==0){
+						$("#navHome").attr('href', '/');
+						$("#navNm").text(cate1.cate1Nm);
+					}else{
+						$("#navHome").attr('onclick', 'cfnGoToBrandMain('+brandGroupNo+');');
+						$("#navNm").text(cate1.cate1Nm);
+					}
 				}
 				tag += '	onclick="cfnGoToGoodsList('+brandGroupNo+',\''+cateGb+'\','+cate1.cate1No+');" >' + cate1.cate1Nm + '</a>\n';
 				if (cate1.leafYn == 'N' && cate1.cate2List.length > 0) {
@@ -441,15 +462,16 @@
 					tag += '	<ul>\n';
 					$.each(cate1.cate2List, function(idx2, cate2) {
 						tag += '		<li';
-						if(cate2.cate2No == cate2No){
+						if(cate2.cate2No == cate2No && cate3No == null){
 							tag += ' class="on"';
 						}
 						tag += '		>\n';
 						tag += '		<a href="javascript:javascript:void(0);" ';
-						if(cate2.cate2No == cate2No){
+						if(cate2.cate2No == cate2No && cate3No == null){
 							tag += ' class="on"';
-							navNm = navNm +' > ' + cate2.cate2Nm;
-							$("#navNm").text(navNm);
+							navNm = '<li class="bread_2depth" id="navNm2">'+cate2.cate2Nm+'</li>';
+							$("#navArea").append(navNm);
+							$("#formTitle").text(cate2.cate2Nm);
 						}
 						tag += '	onclick="cfnGoToGoodsList('+brandGroupNo+',\''+cateGb+'\','+cate1.cate1No+','+cate2.cate2No+');">' + cate2.cate2Nm + '</a>\n';
  						if (cate2.leafYn == 'N' && cate2.cate3List != null && cate2.cate3List.length > 0) {
@@ -461,15 +483,16 @@
 							tag += '	<ul>\n';
 							$.each(cate2.cate3List, function (idx3, cate3){
 								tag += '<li';
-								if(cate3.cate3No == cate3No){
+								if(cate3.cate3No == cate3No && cate4No == null){
 									tag += ' class="on"';
 								}
 								tag += '>';
 								tag += '		<a href="javascript:javascript:void(0);" ';
-								if(cate3.cate3No == cate3No){
+								if(cate3.cate3No == cate3No && cate4No == null){
 									tag += ' class="on"';
-									navNm = navNm +' > ' + cate3.cate3Nm;
-									$("#navNm").text(navNm);
+									navNm = '<li class="bread_2depth" id="navNm2">'+cate2.cate2Nm+'</li><li class="bread_2depth" id="navNm3">'+cate3.cate3Nm+'</li>';
+									$("#navArea").append(navNm);
+									$("#formTitle").text(cate3.cate3Nm);
 								}
 								tag += ' onclick="cfnGoToGoodsList('+brandGroupNo+',\''+cateGb+'\','+cate1.cate1No+','+cate2.cate2No+','+cate3.cate3No+');">' + cate3.cate3Nm + '</a>';
 								tag += '</li>\n';
@@ -484,13 +507,12 @@
 				}
 				tag += '</li>\n';
 			}
-
 			return tag;
 		}
 
 		// 사파리 - 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(){
@@ -498,7 +520,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){

+ 13 - 7
src/main/webapp/WEB-INF/views/web/display/LookbookDetailFormWeb.html

@@ -2,7 +2,7 @@
 <html lang="ko"
 	xmlns:th="http://www.thymeleaf.org"
 	xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
-	layout:decorator="web/common/layout/DefaultLayoutWeb">
+	layout:decorator="web/common/layout/PlanningLayoutWeb">
 <!--
  *******************************************************************************
  * @source  : LookbookDetailFormWeb.html
@@ -22,7 +22,7 @@
 	<div id="container" class="container br">
 		<div class="breadcrumb">
 			<ul>
-				<li class="bread_home"><a href="index.html">홈</a></li>
+				<li class="bread_home"><a href="javascript:void(0);" id="navHome">홈</a></li>
 				<li class="bread_2depth" th:text="${lookbookInfo.brandNm}">TBJ</li>
 				<li class="bread_3depth">룩북</li>
 			</ul>
@@ -284,9 +284,9 @@
 
 	<script th:inline="javascript">
 /*<![CDATA[*/
-	var fnTest = function (){
-		console.log('18');
-	}
+	var lookbookGb = [[${lookbookInfo.lookbookGb}]];
+	var brandCd = [[${lookbookInfo.brandCd}]];
+
 	var goodsImgUrl = [[${@environment.getProperty('upload.goods.view')}]];
 	var fnLookbookGoodsPopup = function(obj1,obj2,obj3,obj4,obj5,obj6,obj7){
 	$("#lookbookItemPop").modal("show");
@@ -297,7 +297,7 @@
 	$("#lookbookItemPop").find(".itemPrice").text(obj5);
 	$("#lookbookItemPop").find(".itemPercent").text(obj6+'%');
 	$("#lookbookItemPop").find(".btn_default").attr('onclick','cfnGoToPage(_PAGE_GOODS_DETAIL+"'+obj7+'");');
-}
+	}
 	// 컨텐츠 호출
 	$(document).ready( function() {
 		/* 슬라이드 - 상단_LOOKBOOK */
@@ -318,7 +318,7 @@
 				el: '.br_lookbook_view.cont_visual .swiper-pagination',
 				clickable: true,
 			},
-		}, fnTest());
+		});
 
 		/* 슬라이드 - 룩북 속 상품 */
 		var togetherItemSwiper = new Swiper('.br_lookbook_view.cont_items .swiper-container', {
@@ -345,6 +345,12 @@
 			$("#lookbookItemPop").modal("show");
 			return false;
 		});
+
+		if(lookbookGb=='BL'){
+			$("#navHome").attr('onclick', 'cfnGoToBrandMain('+brandCd+');');
+		}else{
+			$("#navHome").attr('href', '/');
+		}
 	});
 
 /*]]>*/

+ 6 - 3
src/main/webapp/WEB-INF/views/web/display/LookbookMainFormWeb.html

@@ -2,7 +2,7 @@
 <html lang="ko"
 	xmlns:th="http://www.thymeleaf.org"
 	xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
-	layout:decorator="web/common/layout/DefaultLayoutWeb">
+	layout:decorator="web/common/layout/PlanningLayoutWeb">
 <!--
  *******************************************************************************
  * @source  : LookbookMainFormWeb.html
@@ -22,7 +22,7 @@
 	<div id="container" class="container dp">
 		<div class="breadcrumb">
 			<ul>
-				<li class="bread_home"><a href="javascript:void(0);" onclick="cfnGoToPage(_PAGE_MAIN);">홈</a></li>
+				<li class="bread_home"><a href="javascript:void(0);" id="navHome">홈</a></li>
 				<li class="bread_home" id="brandLi" style="display: none;"></li>
 				<li class="bread_2depth">룩북</li>
 			</ul>
@@ -115,7 +115,7 @@
 						tag2 += '<ul class="clear event_con" id="lookbookArea" style="display: block;">';
 						$.each(result, function(idx, item) {
 							tag2 += '<li>';
-							tag2 += '	<a href="javascript:void(0);" onclick="cfnGoToLookbookDetail('+item.lookbookSq+','+item.brandCd+')">';
+							tag2 += '	<a href="javascript:void(0);" onclick="cfnGoToLookbookDetail(\''+lookbookGb+'\','+item.lookbookSq+','+item.brandCd+')">';
 							tag2 += '		<div class="ev_img">';
 							tag2 += '			<img src="' + _imgUrl + item.orgTnfileNm + '" alt="" style="height:100%">';
 							tag2 += '		</div>';
@@ -161,6 +161,9 @@
 		if(lookbookGb=='BL'){
 			$("#brandBox").hide();
 			$("#brandLi").show();
+			$("#navHome").attr('onclick', 'cfnGoToBrandMain('+brandCd+');');
+		}else{
+			$("#navHome").attr('href', '/');
 		}
 	});
 

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

@@ -165,11 +165,11 @@
 											<div class="swiper-slide">
 												<div class=" item_prod sUiXc "> <!-- item_prod ranker d_detail -->
 													<div class="item_state"> <!-- item_state AD soldout -->
+														<button type="button" class="itemLike" th:classappend="${bestItemData.likeIt == 'likeit'}? 'likeit' : ''"  onclick="cfnPutWishList(this);" th:attr="goodsCd=${bestItemData.goodsCd}, ithrCd='', contentsLoc='SMM004', planDtlSq=''">관심상품 추가</button>
 														<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>

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

@@ -84,18 +84,18 @@
 				</th:block>
 				<th:block th:each="cardInfo, status : ${cardInfoList}" >
 				<div class="benefit_blk"  th:if="${cardInfo.prmtGb == 'B' and not #strings.isEmpty(cardInfo.note) and cardInfo.rownum ==  1}">
-					<th:block >
 					<h6>부분 무이자 할부</h6>
 					<th:block th:utext="${#strings.unescapeJava(#strings.escapeJava(cardInfo.note))}"></th:block>
+				</div>
+				</th:block>
+				<div class="benefit_blk" >
 					<div class="info_txt">
 						<ul>
 							<li>무이자할부는 행사기간 동안 실 결제금액 기준으로 가능</li>
 							<li>법인, 체크, 기프트 카드는 부분 무이자 할부 제외</li>
 						</ul>
 					</div>
-					</th:block>
 				</div>
-				</th:block>
 			</div>
 		</div>
 	</div>

+ 7 - 6
src/main/webapp/WEB-INF/views/web/goods/GoodsDealDetailFormWeb.html

@@ -195,7 +195,7 @@
 									<div class="form_field">
 										<div class="select_custom deal_opt1" disabled>
 											<div class="combo">
-												<div class="select">선택</div>
+												<div class="select">옵션1</div>
 												<ul class="list" id="goodsDealOptUp1">
 													<!--  옵션 1 -->
 												</ul>
@@ -205,7 +205,7 @@
 									<div class="form_field">
 										<div class="select_custom deal_opt2" disabled>
 											<div class="combo">
-												<div class="select">선택</div>
+												<div class="select">옵션2</div>
 												<ul class="list" id="goodsDealOptUp2">
 													<!--  옵션 2 -->
 												</ul>
@@ -228,7 +228,7 @@
 							</div>
 							<div class="btn_box">
 								<div class="btn_group_block ui_row">
-								<th:block  th:if="${goodsInfo.stockQty > 0}">
+								<th:block  th:if="${goodsInfo.stockQty > 0 and goodsInfo.goodsStat == 'G008_90'}">
 									<div class="ui_col_6">
 										<button type="button" class="btn btn_dark btn_block" id="btnGoodsWish" onclick="fnAddCart('C');"><span>쇼핑백</span></button>
 									</div>
@@ -236,7 +236,7 @@
 										<button type="button" class="btn btn_primary btn_block" id="btnGoodsCart" onclick="fnAddCart('O');"><span>바로구매</span></button>
 									</div>
 								</th:block>
-								<th:block  th:unless="${goodsInfo.stockQty > 0}">
+								<th:block  th:unless="${goodsInfo.stockQty > 0 and goodsInfo.goodsStat == 'G008_90'}">
 									<div class="ui_col_12">
 										<button type="button" class="btn btn_dark btn_block" disabled=""><span>SOLD OUT</span></button>
 									</div>
@@ -657,12 +657,12 @@
 		let optCd =  $(obj).attr('optCd');
 		let alertMsg = '';
 		if (ea < minOrdQty) {
-			mcxDialog.alert("최소 주문 가능 수량은 "+minOrdQty+"개 입니다.");
+			alertMsg = minOrdQty+"개 부터 구매 가능합니다.";
 			ea = minOrdQty;
 		}
 
 		if (ea > maxOrdQty) {
-			mcxDialog.alert("최대 주문 가능 수량은 "+maxOrdQty+"개 입니다.");
+			alertMsg = maxOrdQty+"개 까지만 구매 가능합니다.";
 			ea = maxOrdQty;
 		}
 
@@ -779,6 +779,7 @@
 		
 		var params = new Object();
 		params.goodsCd = [[${params.goodsCd}]];
+		params.colorCd = [[${params.colorCd}]];
 		params.viewDt = [[${params.viewDt}]];
 		params.preview = [[${params.preview}]];
 		params.adminYn = [[${params.adminYn}]];

+ 1 - 1
src/main/webapp/WEB-INF/views/web/goods/GoodsDetailDeliveryFormWeb.html

@@ -39,7 +39,7 @@
 						</th>
 						<td>
 							<th:block th:if="${goodsInfo.delvFee <= 0}">무료배송</th:block>
-							<th:block th:if="${goodsInfo.delvFee > 0}" th:text="${#numbers.formatInteger(goodsInfo.delvFee, 0,'COMMA')}" ></th:block>
+							<th:block th:if="${goodsInfo.delvFee > 0}" th:text="|${#numbers.formatInteger(goodsInfo.delvFee, 0,'COMMA')}원|" ></th:block>
 							<th:block th:if="${goodsInfo.minOrdAmt > 0}">(<th:block th:text="${#numbers.formatInteger(goodsInfo.minOrdAmt, 0,'COMMA')}" ></th:block>원 이상 무료배송)</th:block>
 						</td>
 					</tr>

+ 48 - 31
src/main/webapp/WEB-INF/views/web/goods/GoodsDetailFormWeb.html

@@ -222,7 +222,7 @@
 										<div class="select_custom item_opt1"  th:classappend="${'item_opt1_'+status.count +' '+goodsCompose.compsGoodsCd}" 
 																			th:if="${goodsCompose.goodsOption1List != null and !goodsCompose.goodsOption1List.empty}" >
 											<div class="combo">
-												<div class="select">선택</div>
+												<div class="select">옵션1</div>
 												<ul class="list">
 													<th:block th:each="goodsOption, optionStatus : ${goodsCompose.goodsOption1List}" >
 													<li class="selected" th:id="|selfGoodsOpt1${goodsCompose.compsGoodsCd}|" th:if=${optionStatus.first}>선택</li> 
@@ -241,7 +241,7 @@
 									<div class="form_field">
 										<div class="select_custom item_opt2" th:classappend="${'item_opt2_'+status.count +' '+goodsCompose.compsGoodsCd}"  disabled>
 											<div class="combo">
-												<div class="select">선택</div>
+												<div class="select">옵션2</div>
 												<ul class="list" th:id="|goodsOpt2${goodsCompose.compsGoodsCd}|" >
 													<!-- 옵션2 -->
 												</ul>
@@ -262,7 +262,7 @@
 									<div class="form_field">
 										<div class="select_custom item_opt1 item_opt1_1" th:classappend="${goodsInfo.goodsCd}" >
 											<div class="combo">
-												<div class="select">선택</div>
+												<div class="select">옵션1</div>
 												<ul class="list">
 													<li class="selected" th:id="|selfGoodsOpt1${goodsInfo.goodsCd}|" >선택</li> 
 													<th:block th:each="goodsOption, optionStatus : ${goodsOption1List}" >
@@ -279,7 +279,7 @@
 									<div class="form_field">
 										<div class="select_custom item_opt2 item_opt2_1" th:classappend="${goodsInfo.goodsCd}"  disabled>
 											<div class="combo">
-												<div class="select">선택</div>
+												<div class="select">옵션2</div>
 												<ul class="list" th:id="|goodsOpt2${goodsInfo.goodsCd}|" >
 													<!-- 옵션2 -->
 												</ul>
@@ -298,14 +298,14 @@
 										<span class="title">수량</span>
 									</div>
 									<div class="number_count">
-										<span class="minus" onclick="fnAdjustOrderEa(this);" adjust="-"><em class="sr-only">감소</em></span>
-										<input type="text" name="cea" maxlength="3" style="ime-mode:disabled" th:value="${goodsInfo.minOrdQty}" onblur="fnChangeOrderEa(this)" data-valid-type="numeric">
+										<span class="minus min_val" onclick="fnAdjustOrderEa(this);" adjust="-"><em class="sr-only">감소</em></span>
+										<input type="text" name="cea" maxlength="3" style="ime-mode:disabled" th:value="${goodsInfo.minOrdQty}" readonly >
 										<input type="hidden" name="coption" value=""   th:attr="price=${goodsInfo.currPrice}">
 										<span class="plus" onclick="fnAdjustOrderEa(this);" adjust="+"><em class="sr-only">추가</em></span>
 									</div>
 								</div>
 							</div>
-							<div class="price_box">
+							<div class="price_box" style="display:none;">
 								<p class="number">
 									총&nbsp;<span id="goodsTotalQty">0</span>개
 								</p>
@@ -317,7 +317,7 @@
 							</div>
 							<div class="btn_box">
 								<div class="btn_group_block ui_row">
-								<th:block  th:if="${goodsInfo.stockQty > 0}">
+								<th:block  th:if="${goodsInfo.stockQty > 0 and goodsInfo.goodsStat == 'G008_90'}">
 									<div class="ui_col_6">
 										<button type="button" class="btn btn_dark btn_block" id="btnGoodsWish" onclick="fnAddCart('C');"><span>쇼핑백</span></button>
 									</div>
@@ -325,14 +325,14 @@
 										<button type="button" class="btn btn_primary btn_block" id="btnGoodsCart" onclick="fnAddCart('O');"><span>바로구매</span></button>
 									</div>
 								</th:block>
-								<th:block  th:unless="${goodsInfo.stockQty > 0}">
+								<th:block  th:unless="${goodsInfo.stockQty > 0 and goodsInfo.goodsStat == 'G008_90'}">
 									<div class="ui_col_12">
 										<button type="button" class="btn btn_dark btn_block" disabled=""><span>SOLD OUT</span></button>
 									</div>
 								</th:block>
 								</div>
 							</div>
-							<div class="npay_box">
+							<div class="npay_box" style="display:none;">
 								<a href="">네이버id로 간편구매~</a>
 							</div>
 							<div class="exinfo_box">
@@ -423,8 +423,8 @@
 					</div>
 					<div class="desc_character" th:if="${goodsInfo.goodsSpecialDesc != null  and !goodsInfo.goodsSpecialDesc.empty}"> <!-- 상품특징 -->
 						<span class="tit_desc">상품특징</span>
-						<p class="ptxt01" th:utext="${#strings.unescapeJava(#strings.escapeJava(goodsInfo.goodsSpecialDesc))}">
-							- 지퍼플러 장식을 더해 완성도를 높여줌
+						<p class="ptxt01">
+							<th:block th:utext="${#strings.unescapeJava(#strings.escapeJava(goodsInfo.goodsSpecialDesc))}"></th:block>
 						</p>
 					</div>
 				</div>
@@ -803,6 +803,7 @@
 				$("#cartForm  input[name=cea]").attr("readonly",false);
 				$("#cartForm  input[name=stock]").val(itemCnt);
 	
+				$('.price_box').show();
 				fnSetTotalPrice();
 			}); 
 		}
@@ -811,9 +812,9 @@
 	// 수량 변경 클릭
 	var fnAdjustOrderEa = function(obj) {
 
-		if("G056_N" == $("#cartForm  input[name=goodsType]").val()){
+		if("G056_N" == $("#cartForm  input[name=goodsType]").val() && "Y" == $("#cartForm  input[name=selfGoodsYn]").val()){
 			if(gagajf.isNull($("#cartForm  input[name=optCd2]").val())){
-				mcxDialog.alert("사이즈를 선택세요.");
+				mcxDialog.alert("사이즈를 선택해 주세요.");
 				return false;
 			}
 		}else{
@@ -827,7 +828,7 @@
 			});
 			
 			if (targetSize != itemSize){
-				mcxDialog.alert("구성상품들의 옵션을 선택하세요.");
+				mcxDialog.alert("옵션을 선택해 주세요.");
 				return false;
 			}
 		}
@@ -854,9 +855,9 @@
 	//옵션 갯수 변경
 	var fnChangeOrderEa = function() {
 
-		if("G056_N" == $("#cartForm  input[name=goodsType]").val()){
+		if("G056_N" == $("#cartForm  input[name=goodsType]").val() && "Y" == $("#cartForm  input[name=selfGoodsYn]").val()){
 			if(gagajf.isNull($("#cartForm  input[name=optCd2]").val())){
-				mcxDialog.alert("사이즈를 선택세요.");
+				mcxDialog.alert("사이즈를 선택해 주세요.");
 				return false;
 			}
 		}else{
@@ -871,7 +872,7 @@
 			});
 			
 			if (targetSize != itemSize){
-				mcxDialog.alert("구성상품들의 옵션을 선택하세요.");
+				mcxDialog.alert("옵션을 선택해 주세요.");
 				return false;
 			}
 		}
@@ -882,12 +883,12 @@
 		let buymax = parseInt($("#cartForm  input[name=maxOrdQty]").val());
 		let alertMsg = '';
 		if (ea < buymin) {
-			alertMsg ="최소 주문 가능 수량은 "+buymin+"개 입니다.";
+			alertMsg = buymin+"개 부터 구매 가능합니다.";
 			ea = buymin;
 		}
 
 		if (ea > buymax) {
-			alertMsg = "최대 주문 가능 수량은 "+buymax+"개 입니다.";
+			alertMsg = buymax+"개 까지만 구매 가능합니다.";
 			ea = buymax;
 		}
 
@@ -918,13 +919,23 @@
 		$('input[name="cea"]').each(function() {
 			let ea = parseInt($(this).val());
 			let addPrice = 0;
-			let target=$('.select_custom.item_opt2');
-			target.each(function() {
-				if (typeof ($(this).find('input[name=opt2]').val()) != 'undefined' && !gagajf.isNull($(this).find('input[name=opt2]').val())){
-					addPrice += Number($(this).find('input[name=opt2]').attr('addPrice'));	
-				}
-			});	
 			
+			if("G056_N" == $("#cartForm  input[name=goodsType]").val() && "Y" == $("#cartForm  input[name=selfGoodsYn]").val()){
+				let target=$('.opt_size').find('input[name=opt]');
+				target.each(function() {
+					if ($(this).is(":checked")){
+						addPrice += Number($(this).attr('addPrice'));	
+					}
+				});	
+			}else{
+			
+				let target=$('.select_custom.item_opt2');
+				target.each(function() {
+					if (typeof ($(this).find('input[name=opt2]').val()) != 'undefined' && !gagajf.isNull($(this).find('input[name=opt2]').val())){
+						addPrice += Number($(this).find('input[name=opt2]').attr('addPrice'));	
+					}
+				});	
+			}
 			let goodsPrice = parseInt($(this).parent().find('input[name="coption"]').attr('price'));
 
 			totalEa += ea;
@@ -945,8 +956,14 @@
 
 		if (goodsType == 'G056_N'){
 			if (gagajf.isNull($("#cartForm  input[name=optCd2]").val())) {
-				mcxDialog.alert("사이즈를 선택하세요.");
-				return;
+				if("Y" == $("#cartForm  input[name=selfGoodsYn]").val()){
+					mcxDialog.alert("사이즈를 선택해 주세요.");
+					return false;	
+				}else{
+					mcxDialog.alert("옵션을 선택해 주세요.");
+					return false;
+				}
+				
 			}
 		
 			let compsList = [];
@@ -977,7 +994,7 @@
 			});
 			
 			if (targetSize != itemSize){
-				mcxDialog.alert("구성상품들의 옵션을 선택하세요.");
+				mcxDialog.alert("옵션을 선택해 주세요.");
 				return false;
 			}
 			
@@ -1149,7 +1166,7 @@
 					}
 					
 				}else{
-					var opt_selecter02 = new sCombo('.opt_select .select_custom.item_opt2.item_opt2_1');
+					var opt_selecter02 = new sCombo('.opt_select .select_custom.item_opt2.item_opt2_1'); 
 				}	
 			}
 			
@@ -1514,7 +1531,7 @@
 		$("meta[property='eg:etc1']").attr('content', [[${goodsInfo.selfGoodsYn}]]);
 		
 		// ep 쿠폰확인
-		fnEpCouponDown([[${params.afLinkCd}]], [[${params.goodsCd}]], 1);
+		fnEpCouponDown([[${afLinkCd}]], [[${params.goodsCd}]], 1);
 	});
 	
 	// 상품평 레이어 호출후 콜백에서 호출하므로 여기에 있어야함

+ 4 - 1
src/main/webapp/WEB-INF/views/web/goods/GoodsDetailQnaFormWeb.html

@@ -66,7 +66,10 @@
 /*<![CDATA[*/
 	
 	var fnGetList = function() {
-
+		
+		// 상품문의창 닫기
+		cfCloseLayer('layer_goods_qna_reg')
+	
 		$('#goodsQnaForm  input[name="secretYn"]').val('');
 		if ($("#goodsQnaForm input:checkbox[name=except_secret]").is(':checked')){
 			$('#goodsQnaForm  input[name="secretYn"]').val('N');

+ 3 - 1
src/main/webapp/WEB-INF/views/web/goods/GoodsDetailReviewFormWeb.html

@@ -582,7 +582,9 @@
 				$('#ulGoodsReview').append(tag);
 			});
 		} else {
-			$('#goodsReviewForm').find('.nodata').show();
+			if ([[${reviewCount}]] > 0){
+				$('#goodsReviewForm').find('.nodata').show();	
+			}
 			$('#goodsReviewForm').find('.ui_row').hide();
 		}
 

+ 13 - 19
src/main/webapp/WEB-INF/views/web/goods/GoodsIncludeFormWeb.html

@@ -3,12 +3,12 @@
 <!--
  *******************************************************************************
  * @source  : GoodsIncludeFormWeb.html
- * @desc    : 상품상세 Include Page - 공용
+ * @desc	: 상품상세 Include Page - 공용
  *============================================================================
  * STYLE24
  * Copyright(C) 2020 TSIT, All rights reserved.
  *============================================================================
- * VER  DATE         AUTHOR      DESCRIPTION
+ * VER  DATE		 AUTHOR	  DESCRIPTION
  * ===  ===========  ==========  =============================================
  * 1.0  2021.03.02   eskim	   최초 작성
  *******************************************************************************
@@ -144,16 +144,15 @@
 											th:onclick="fnSelGoodsDealReview([[${goodsInfo.compsGoodsCd}]])" >
 											<div class="item_prod">
 												<div class="item_state">
-													<a href="#none" class="itemLink">
+													<a href="javascript:void(0);" class="itemLink">
 														<div class="itemPic">
 															<img alt="" class="vLHTC pd_img" th:src="${imgGoodsUrl+'/'+goodsInfo.sysImgNm+'?RS=80'}" th:onerror="'this.src=\''+@{${uxImgUrl}+ '/images/pc/thumb/bg_item_none.png'}+'\';'">
 														</div>
 														<p class="itemBrand" th:text="${goodsInfo.brandGroupNm}">BRAND NAME1</p>
 														<div class="itemName" th:text="${goodsInfo.goodsFullNm}">남성 </div>
-														<p class="itemPrice"><th:block th:text="${#numbers.formatInteger(goodsInfo.currPrice, 0,'COMMA')}"> 134,100</th:block>
-															<span class="itemPrice_original" th:if="${goodsInfo.listPrice > goodsInfo.currPrice}" th:text="${#numbers.formatInteger(goodsInfo.listPrice, 0,'COMMA')}">149,000</span>
-															<span class="itemPercent" th:if="${goodsInfo.dcRate > 0}" th:text="|${#numbers.formatDecimal(goodsInfo.dcRate,0,0)}%|">30%</span>
-														</p>
+														 <div class="itemPostCount">
+															 (리뷰 <span><th:block  th:text="${(goodsInfo.reviewRegCnt <= 9999) ? #numbers.formatInteger(goodsInfo.reviewRegCnt, 0,'COMMA')  : '9,999+'}"></th:block></span>)
+														 </div>
 													</a>
 													<input type="hidden" name="selectGoods" th:value="${goodsInfo.compsGoodsCd}"  th:attr="currPrice=${goodsInfo.currPrice}, selfGoodsYn=${goodsInfo.selfGoodsYn}"/>
 												</div>
@@ -195,16 +194,15 @@
 											th:onclick="fnSelGoodsDealQna([[${goodsInfo.compsGoodsCd}]])" >
 											<div class="item_prod">
 												<div class="item_state">
-													<a href="#none" class="itemLink">
+													<a href="javascript:void(0);" class="itemLink">
 														<div class="itemPic">
 															<img alt="" class="vLHTC pd_img" th:src="${imgGoodsUrl+'/'+goodsInfo.sysImgNm+'?RS=80'}" th:onerror="'this.src=\''+@{${uxImgUrl}+ '/images/pc/thumb/bg_item_none.png'}+'\';'">
 														</div>
 														<p class="itemBrand" th:text="${goodsInfo.brandGroupNm}">BRAND NAME1</p>
 														<div class="itemName" th:text="${goodsInfo.goodsFullNm}">남성 </div>
-														<p class="itemPrice"><th:block th:text="${#numbers.formatInteger(goodsInfo.currPrice, 0,'COMMA')}"> 134,100</th:block>
-															<span class="itemPrice_original" th:if="${goodsInfo.listPrice > goodsInfo.currPrice}" th:text="${#numbers.formatInteger(goodsInfo.listPrice, 0,'COMMA')}">149,000</span>
-															<span class="itemPercent" th:if="${goodsInfo.dcRate > 0}" th:text="|${#numbers.formatDecimal(goodsInfo.dcRate,0,0)}%|">30%</span>
-														</p>
+														<div class="itemPostCount">
+															(문의 <span><th:block  th:text="${(goodsInfo.goodsQnaCnt <= 9999) ? #numbers.formatInteger(goodsInfo.goodsQnaCnt, 0,'COMMA')  : '9,999+'}"></th:block></span>)
+														</div>
 													</a>
 													<input type="hidden" name="selectGoods" th:value="${goodsInfo.compsGoodsCd}" />
 												</div>
@@ -246,16 +244,12 @@
 											th:onclick="fnSelGoodsDealDelivery([[${goodsInfo.compsGoodsCd}]])" >
 											<div class="item_prod">
 												<div class="item_state">
-													<a href="#none" class="itemLink">
+													<a href="javascript:void(0);" class="itemLink">
 														<div class="itemPic">
 															<img alt="" class="vLHTC pd_img" th:src="${imgGoodsUrl+'/'+goodsInfo.sysImgNm+'?RS=80'}" th:onerror="'this.src=\''+@{${uxImgUrl}+ '/images/pc/thumb/bg_item_none.png'}+'\';'">
 														</div>
 														<p class="itemBrand" th:text="${goodsInfo.brandGroupNm}">BRAND NAME1</p>
 														<div class="itemName" th:text="${goodsInfo.goodsFullNm}">남성 </div>
-														<p class="itemPrice"><th:block th:text="${#numbers.formatInteger(goodsInfo.currPrice, 0,'COMMA')}"> 134,100</th:block>
-															<span class="itemPrice_original" th:if="${goodsInfo.listPrice > goodsInfo.currPrice}" th:text="${#numbers.formatInteger(goodsInfo.listPrice, 0,'COMMA')}">149,000</span>
-															<span class="itemPercent" th:if="${goodsInfo.dcRate > 0}" th:text="|${#numbers.formatDecimal(goodsInfo.dcRate,0,0)}%|">30%</span>
-														</p>
 													</a>
 													<input type="hidden" name="selectGoods" th:value="${goodsInfo.compsGoodsCd}" />
 												</div>
@@ -353,7 +347,7 @@
 					</div>
 					<div class="btn_box">
 						<div class="btn_group_block ui_row">
-						<th:block  th:if="${goodsInfo.stockQty > 0}">
+						<th:block  th:if="${goodsInfo.stockQty > 0 and goodsInfo.goodsStat == 'G008_90'}">
 							<div class="ui_col_6">
 								<button type="button" class="btn btn_dark btn_block" id="btnGoodsWish" onclick="fnAddCart('C');"><span>쇼핑백</span></button>
 							</div>
@@ -361,7 +355,7 @@
 								<button type="button" class="btn btn_primary btn_block" id="btnGoodsCart" onclick="fnAddCart('O');"><span>바로구매</span></button>
 							</div>
 						</th:block>
-						<th:block  th:unless="${goodsInfo.stockQty > 0}">
+						<th:block  th:unless="${goodsInfo.stockQty > 0 and goodsInfo.goodsStat == 'G008_90'}">
 							<div class="ui_col_12">
 								<button type="button" class="btn btn_dark btn_block" disabled=""><span>SOLD OUT</span></button>
 							</div>

+ 1 - 3
src/main/webapp/WEB-INF/views/web/goods/GoodsQnaDetailFormWeb.html

@@ -106,9 +106,7 @@
 			sureBtnClick: function() {
 				gagajf.ajaxFormSubmit($('#goodsQnaDetailForm').prop('action')
 						, $('#goodsQnaDetailForm')
-						, function() {
-							mcxDialog.alert("상품 문의가 등록되었습니다. 빠른 시일 내에 답변드리겠습니다.");
-						}
+						, fnGetList()
 				);
 			}
 		});

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

@@ -206,6 +206,8 @@
 <script th:inline="javascript">
 	/*<![CDATA[*/
 	let oneData = [[${oneData}]];
+	let kcpReceiptUrl = [[${@environment.getProperty('pg.kcp.receipt.url')}]];
+	let refundYn = [[${refundYn}]];
 
 	$(document).ready(function() {
 		// 마이페이지 LNB 설정

+ 14 - 3
src/main/webapp/WEB-INF/views/web/mypage/MypageGiftcardFormWeb.html

@@ -202,15 +202,26 @@
 			for (let i = 0; i < giftcardUseList.length; i++) {
 				let useGiftcard = giftcardUseList[i];
 				tmtbHtml += '<tr>';
-				tmtbHtml += '<td><span class="tag deepgray">차감</span></td>';
+				if(useGiftcard.gfcdAmt > 0){
+					tmtbHtml += '		<td><span class="tag primary">적립</span></td>';
+				}else{
+					tmtbHtml += '		<td><span class="tag deepgray">차감</span></td>';
+				}
 				tmtbHtml += '<td>';
 				tmtbHtml += '<div class="txt_content">'	+ useGiftcard.goodsNm + '</div>';
 				tmtbHtml += '</td>';
-				tmtbHtml += '<td><span class="amount_minus"> <em>'
-						/* + '-' */
+				if(useGiftcard.gfcdAmt<0){
+					tmtbHtml += '<td><span class="amount_minus"> <em>'
 						+ ' '
 						+ useGiftcard.gfcdAmt.addComma()
 						+ '</em>원';
+				}else{
+					tmtbHtml += '<td><span class="amount_plus"> <em>'
+						+ ' '
+						+ useGiftcard.gfcdAmt.addComma()
+						+ '</em>원';
+				}
+				
 				tmtbHtml += '</span></td>';
 				tmtbHtml += '<td>' + useGiftcard.regDt
 						+ '</td>';

+ 1 - 0
src/main/webapp/WEB-INF/views/web/mypage/MypageOrderDetailFormWeb.html

@@ -569,6 +569,7 @@
 				let data = {};
 				data.ordNo = ordNo;
 				data.chgReason = 'G686_10';
+				data.chgReasonNm = '고객변심';
 				data.accountNo = accountNo;
 				data.accountNm = accountNm;
 				data.bankCd = bankCd;

+ 0 - 277
src/main/webapp/WEB-INF/views/web/mypage/MypagePointForm2Web.html

@@ -1,277 +0,0 @@
-<!DOCTYPE html>
-<html lang="ko"
-	xmlns:th="http://www.thymeleaf.org"
-	xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
-	layout:decorator="web/common/layout/MypageLayoutWeb">
-<!--
- *******************************************************************************
- * @source  : MypagePointForm.html
- * @desc    : 마이페이지 > STYLE24포인트 Page
- *============================================================================
- * STYLE24
- * Copyright(C) 2021 TSIT, All rights reserved.
- *============================================================================
- * VER  DATE         AUTHOR      DESCRIPTION
- * ===  ===========  ==========  =============================================
- * 1.0  2021.02.26   csh9191     최초 작성
- *******************************************************************************
- -->
-<body>
-
-<th:block layout:fragment="content">
-<div class="content myPoint"> <!-- 페이지특정 클래스 = myPoint -->
-		<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">STYLE 포인트</h3>
-				</div>
-				<div class="sec_body">
-					<div class="highlight_area">
-						<div class="have_amount">
-							<div class="total_amount">
-								나의 보유 포인트&nbsp;<span><em th:text="${#numbers.formatDecimal(rmPntAmt, 0, 'COMMA', 0, 'POINT')}"></em>P</span>
-							</div>
-							<dl>
-								<div>
-									<dt>적립 예정 포인트</dt>
-									<dd><em th:text="${#numbers.formatDecimal(expectedPntAmt, 0, 'COMMA', 0, 'POINT')}"></em>P</dd>
-								</div>
-								<div>
-									<dt><span class="tag primary_line">D-<em >30</em></span>한 달 이내 소멸 예정</dt>
-									<dd><em th:text="${#numbers.formatDecimal(expectedExpirePntAmt, 0, 'COMMA', 0, 'POINT')}"></em>P</dd>
-								</div>
-							</dl>
-						</div>
-					</div>
-					<div class="content_area">
-						<div class="taps">
-							<div>
-								<ul>
-									<li id="allPointList"><a href="javascript:void(0);">전체내역</a></li>
-									<li id="accumulatePointList"><a href="javascript:void(0);">적립내역</a></li>
-									<li id="usePointList"><a href="javascript:void(0);">사용내역</a></li>
-								</ul>
-							</div>
-						</div>
-						<div class="select_box">
-							<div class="form_field">
-								<div class="select_custom month">
-									<div class="combo">
-										<input type="hidden" name="pointDate" value="0" id="pointDate"/>
-										<div class="select"></div>
-										<ul id="searchDt" class="list">
-											
-										</ul>
-									</div>
-								</div>
-							</div>
-						</div>
-						<!-- 데이터 있을 시 -->
-						<div class="list_box">
-							<div class="tbl type5">
-								<table>
-									<colgroup>
-										<col width="10%">
-										<col width="12%">
-										<col width="42%">
-										<col width="18%">
-										<col width="18%">
-									</colgroup>
-									<thead>
-										<tr>
-											<th scope="col"><span class="sr-only">증감여부</span></th>
-											<th scope="col">사유</th>
-											<th scope="col">내용</th>
-											<th scope="col">포인트</th>
-											<th scope="col">일자</th>
-										</tr>
-									</thead>
-									<tbody id="pointAjaxList">
-															
-									</tbody>
-								</table>
-							</div>
-						</div>
-						<!-- //데이터 있을 시 -->
-						<!-- 데이터 없을 시 -->
-						 <div class="nodata">
-							<div class="txt_box">
-								<p>
-									STYLE 포인트 적립/사용내역이 없습니다.<br>
-	
-								</p>
-							</div>
-						</div> 
-						<!-- //데이터 없을 시 -->	
-					</div>
-				</div>
-			</div>
-		</div>
-	</div>
-<script th:inline="javascript">
-	let accumulatePointList = [[${accumulatePointList}]];
-	let usePointList = [[${usePointList}]];
-	let allPointList = [[${allPointList}]];
-	let date = [[${date}]];
-	var year = date[0].year;
-	var month = date[0].month;
-	// TODO - 퍼블확정시
-	
-	// 이번년도
-	//동적으로 날짜 년도 append
-	function appendYear() {
-		for (var i = 0; i < date.length; i++) {
-			$("#searchDt").append(	"<li onclick='fnChangeDate(this.value)' value='"+ date[i].year + "" + date[i].month + "'>" + date[i].year	+ "년" + date[i].month + "월 </li>")
-		}
-		$(".select").append("<li class='selected' value='"+date[0].year+""+date[0].month+"'>"+ date[0].year + "년" + date[0].month + "월 </li>"); // 현재년도 선택 */ 
-	}
-	appendYear($("#searchDt"));
-
-	// 날짜변경 이벤트
-	var fnChangeDate = function(param) {
-		let url = '/mypage/allpoint/list';
-		
-		
- 		//$(param).parent().parent().find('input[name=pointDate]').val($(param).val());
- 		//var pointData = $(param).parent().parent().find('input[name=pointDate]').val();
- 		
- 		// 포인트화면 로딩시 이번달 설정 리스트 표시하기 위함
- 		var data = {};
- 		if(typeof param == 'undefined'){
- 			data.searchDt = year.toString() + "" + month.toString();
- 		}else{
- 			data.searchDt = param;
- 		}
-		var jsonData = JSON.stringify(data);
-		
-		gagajf.ajaxJsonSubmit('/mypage/allpoint/list', jsonData, function(result){
-						accumulatePointList = result.accumulatePointList;
-						usePointList = result.usePointList;
-						allPointList = result.allPointList;
-						
-						// 클릭상태 확인
-						if($("#accumulatePointList").hasClass("on")){
-							$("#accumulatePointList").click();
-						}else if($("#usePointList").hasClass("on")){
-							$("#usePointList").click();
-						}else if($("#allPointList").hasClass("on")) {
-							$("#allPointList").click();
-						}
-						// 첫화면 전체내역 조회
-						fnGetPointTableInfo();
-		});
-	}
-	
-	// HTML 그리기
-	var fnGetPointTableInfo = function(param) {
-		$('.nodata').hide();
-		let tag = "";
-		if(param != null && param.length > 0){
-			$.each(param, function(idx,item){
-				tag += '<tr>';
-				tag += '	<td>';
-				if(item.pntAmt > 0){
-					tag += '		<span class="tag primary">적립</span>';
-				}else{
-					tag += '		<span class="tag deepgray">차감</span>';
-				}
-				
-				tag += '	</td>';
-				tag += '	<td>'+item.occurGb+'</td>';
-				tag += '	<td>';
-				tag += '		<div class="txt_content">'+ item.occurDtlDesc + '</div>';
-				tag += '	</td>';
-				tag += '	<td>';
-				if(item.pntAmt > 0){
-					tag += '		<span class="amount_plus">';
-					tag += '			<em>'+item.pntAmt+'</em>P';
-					tag += '		</span>';
-				}else{
-					tag += '		<span class="c_primary">';
-					tag += '			<em>'+item.pntAmt+'</em>P';
-					tag += '		</span>';
-				}
-				
-				tag += '	</td>';
-				tag += '	<td>'+item.pntUploadDt;
-				tag += '	</td>';
-				tag += '</tr>		';
-			});
-		}else{
-			$('.nodata').show();
-			
-		}
-		
-		$("#pointAjaxList").html(tag);
-	}
-	
-	// 전체내역 조회
-	$("#allPointList").click(function(){
-
- 		$("#accumulatePointList").removeClass("active");
- 		$("#usePointList").removeClass("active");
- 		
- 		$("#allPointList").addClass("active");
- 		//$("#plusMinus").text("증감/차감");
- 		
- 		fnGetPointTableInfo(allPointList);
-	});
-	
-	// 적립내역 조회
-	$("#accumulatePointList").click(function(){
-
- 		$("#allPointList").removeClass("active");
- 		$("#usePointList").removeClass("active");
- 		
- 		$("#accumulatePointList").addClass("active");
- 		//$("#plusMinus").text("증감");
-		
- 		fnGetPointTableInfo(accumulatePointList);
-	});
-	
-	// 사용내역 조회
-	$("#usePointList").click(function(){
-		
-		$("#accumulatePointList").removeClass("active");
-		$("#allPointList").removeClass("active");
-		
-		$("#usePointList").addClass("active");
-		//$("#plusMinus").text("차감");
-		
-		fnGetPointTableInfo(usePointList);
-	});
-	
-	$(document).ready(function() {
-		// 마이페이지 LNB 설정
-		fnSetMypageLnbList(5);
-		
-		// 마이페이지 location 설정
-		fnSetMypageLocation('STYLE24 포인트', '_PAGE_MYPAGE_POINT');
-		
-		// 전체내역 표시
- 		$("#allPointList").trigger('click');
-
-		// 셀렉트박스 활성화
-		$('.select_custom').each(function(index) {
-			var selecter01 = new sCombo($(this));
-		});
-
-		// 셀렉트박스 데이터 설정
-		fnChangeDate();
-
-	});
-
-</script>
-</th:block>
-
-</body>
-</html>

+ 169 - 127
src/main/webapp/WEB-INF/views/web/mypage/MypagePointFormWeb.html

@@ -19,171 +19,212 @@
 <body>
 
 <th:block layout:fragment="content">
-	<div class="my_cont">
-		<div class="sec_head">
-			<h3>STYLE24 포인트</h3>
-		</div>
-		<div class="sec_body">
-			<div class="save_area mypage_coupon">
-				<p>사용 가능한 보유 포인트<strong th:text="${#numbers.formatDecimal(rmPntAmt, 0, 'COMMA', 0, 'POINT')}"></strong>P</p>
-				<ul>
-					<li>적립 예정 포인트 <span>
-						<th:block th:text="${#numbers.formatDecimal(expectedPntAmt, 0, 'COMMA', 0, 'POINT')}"></th:block>P
-					</span></li>
-					<li>한달 이내 소멸 예정 <span>
-						<th:block th:text="${#numbers.formatDecimal(expectedExpirePntAmt, 0, 'COMMA', 0, 'POINT')}"></th:block>P
-					</span></li>
-				</ul>
+<div class="content myPoint"> <!-- 페이지특정 클래스 = myPoint -->
+		<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="my_tab coupon_tab">
-				<ul>
-					<li><a href="javascript:void(0);" id="allPointList">전체내역</a></li>
-					<li><a href="javascript:void(0);" id="accumulatePointList">적립내역</a></li>
-					<li><a href="javascript:void(0);" id="usePointList">사용내역</a></li>
-				</ul>
-	<!-- 								<div class="form_field"> -->
-	<!-- 									<select id="searchDt" name="searchDt" onchange="fnSearchDate(this);"> -->
-	<!-- 									</select>  -->
-	<!-- 								</div> -->
-				<div class="form_field">
-					<div class="select_custom type1">
-						<div class="combo">
-							<input type="hidden" name="pointDate" value="0"/>
-							<div class="select"></div> <!-- 셀렉박스 -->
-								<ul id="searchDt" class="list" style="width:200px; margin:0 auto">
+			<div class="cont">
+				<div class="sec_head">
+					<h3 class="subH1">STYLE 포인트</h3>
+				</div>
+				<div class="sec_body">
+					<div class="highlight_area">
+						<div class="have_amount">
+							<div class="total_amount">
+								나의 보유 포인트&nbsp;<span><em th:text="${#numbers.formatDecimal(rmPntAmt, 0, 'COMMA', 0, 'POINT')}"></em>P</span>
+							</div>
+							<dl>
+								<div>
+									<dt>적립 예정 포인트</dt>
+									<dd><em th:text="${#numbers.formatDecimal(expectedPntAmt, 0, 'COMMA', 0, 'POINT')}"></em>P</dd>
+								</div>
+								<div>
+									<dt><span class="tag primary_line">D-<em >30</em></span>한 달 이내 소멸 예정</dt>
+									<dd><em th:text="${#numbers.formatDecimal(expectedExpirePntAmt, 0, 'COMMA', 0, 'POINT')}"></em>P</dd>
+								</div>
+							</dl>
+						</div>
+					</div>
+					<div class="content_area">
+						<div class="taps">
+							<div>
+								<ul>
+									<li id="allPointList"><a href="javascript:void(0);">전체내역</a></li>
+									<li id="accumulatePointList"><a href="javascript:void(0);">적립내역</a></li>
+									<li id="usePointList"><a href="javascript:void(0);">사용내역</a></li>
 								</ul>
+							</div>
+						</div>
+						<div class="select_box">
+							<div class="form_field">
+								<div class="select_custom month">
+									<div class="combo">
+										<input type="hidden" name="pointDate" value="0" id="pointDate"/>
+										<div class="select"></div>
+										<ul id="searchDt" class="list">
+											
+										</ul>
+									</div>
+								</div>
+							</div>
+						</div>
+						<!-- 데이터 있을 시 -->
+						<div class="list_box">
+							<div class="tbl type5">
+								<table>
+									<colgroup>
+										<col width="10%">
+										<col width="12%">
+										<col width="42%">
+										<col width="18%">
+										<col width="18%">
+									</colgroup>
+									<thead>
+										<tr>
+											<th scope="col"><span class="sr-only">증감여부</span></th>
+											<th scope="col">사유</th>
+											<th scope="col">내용</th>
+											<th scope="col">포인트</th>
+											<th scope="col">일자</th>
+										</tr>
+									</thead>
+									<tbody id="pointAjaxList">
+															
+									</tbody>
+								</table>
+							</div>
 						</div>
+						<!-- //데이터 있을 시 -->
+						<!-- 데이터 없을 시 -->
+						 <div class="nodata">
+							<div class="txt_box">
+								<p>
+									STYLE 포인트 적립/사용내역이 없습니다.<br>
+	
+								</p>
+							</div>
+						</div> 
+						<!-- //데이터 없을 시 -->	
 					</div>
 				</div>
 			</div>
-			<div class="order_list">
-				<section class="order_row">
-					<div class="tbl point_tbl track_tbl type2">
-						<table>
-							<colgroup>
-								<col width="150px">
-								<col width="660px">
-								<col width="*">
-								<col width="200px">
-							</colgroup>
-							<thead>
-								<tr>
-									<th>사유</th>
-									<th>내용</th>
-									<th id="plusMinus"></th>
-									<th>일자</th>
-								</tr>
-							</thead>
-							<tbody id="pointAjaxList">
-							</tbody>
-						</table>
-					</div>
-				</section>
-			</div>
 		</div>
 	</div>
 <script th:inline="javascript">
 	let accumulatePointList = [[${accumulatePointList}]];
 	let usePointList = [[${usePointList}]];
 	let allPointList = [[${allPointList}]];
-
-	// select 날짜 생성
-	var date = new Date();
-	var year = date.getFullYear();
-	var month = date.getMonth() +1;
-
+	let date = [[${date}]];
+	var year = date[0].year;
+	var month = date[0].month;
 	// TODO - 퍼블확정시
-	var oneYearAgo = year -1;
-	var twoYearAgo = year -2;
 	
 	// 이번년도
-	for(var i = 1;i <= 12; i++){
-		if(i < 10 && i != month){
-			$("#searchDt").append("<li onclick='fnChangeDate(this);' class='selected' value='"+ year + "" + 0 + i +"'>"+ year + "년" + " " + i + "월" +"</li>");
-		}
-		else if(i < 10 && i == month){
-			//셀렉트박스 이번 달 표시설정
-			$('.select').append("<li style='pointer-events: none' onclick='fnChangeDate(this);' class='selected' value='"+ year + "" + 0 + i +"'>" + year + "년" + " " + i + "월" +"</li>");
-			$("#searchDt").append("<li onclick='fnChangeDate(this);' class='selected' value='"+ year + "" + 0 + i +"'>" + year + "년" + " " + i + "월" +"</li>");
-		}
-		else if(i > 9 && i != month){
-			$("#searchDt").append("<li onclick='fnChangeDate(this);' class='selected' value='"+ year + "" + i +"'>"+ year + "년" + " " + i + "월" +"</li>");
-		}
-		else if(i > 9 && i == month){
-			$('.select').append("<li onclick='fnChangeDate(this);' class='selected' value='"+ year + ""  + i +"'>" + year + "년" + " " + i + "월" +"</li>");
-			$("#searchDt").append("<li onclick='fnChangeDate(this);' class='selected' value='"+ year + "" + i +"'>"+ year + "년" + " " + i + "월" +"</li>");
+	//동적으로 날짜 년도 append
+	function appendYear() {
+		for (var i = 0; i < date.length; i++) {
+			$("#searchDt").append(	"<li onclick='fnChangeDate(this.value)' value='"+ date[i].year + "" + date[i].month + "'>" + date[i].year	+ "년" + date[i].month + "월 </li>")
 		}
+		$(".select").append("<li class='selected' value='"+date[0].year+""+date[0].month+"'>"+ date[0].year + "년" + date[0].month + "월 </li>"); // 현재년도 선택 */ 
 	}
+	appendYear($("#searchDt"));
 
 	// 날짜변경 이벤트
 	var fnChangeDate = function(param) {
 		let url = '/mypage/allpoint/list';
 		
- 		$(param).parent().parent().find('input[name=pointDate]').val($(param).val());
- 		var pointData = $(param).parent().parent().find('input[name=pointDate]').val();
- 		
- 		if(10 > month){
- 			month = "0" + month;
- 		}
+		
+ 		//$(param).parent().parent().find('input[name=pointDate]').val($(param).val());
+ 		//var pointData = $(param).parent().parent().find('input[name=pointDate]').val();
  		
  		// 포인트화면 로딩시 이번달 설정 리스트 표시하기 위함
- 		if(pointData == null){
- 			pointData = year + "" + month;
+ 		var data = {};
+ 		if(typeof param == 'undefined'){
+ 			data.searchDt = year.toString() + "" + month.toString();
+ 		}else{
+ 			data.searchDt = param;
  		}
- 		
-		let data = {};
-		
-		data.searchDt = pointData;
-		
- 		console.log(data);
-		
 		var jsonData = JSON.stringify(data);
 		
 		gagajf.ajaxJsonSubmit('/mypage/allpoint/list', jsonData, function(result){
+
 						accumulatePointList = result.accumulatePointList;
 						usePointList = result.usePointList;
 						allPointList = result.allPointList;
-						
 						// 클릭상태 확인
-						if($("#accumulatePointList").hasClass("on")){
+						if($("#accumulatePointList").hasClass("active")){
 							$("#accumulatePointList").click();
-						}else if($("#usePointList").hasClass("on")){
+							// 첫화면 전체내역 조회
+							fnGetPointTableInfo(result.accumulatePointList);
+						}else if($("#usePointList").hasClass("active")){
 							$("#usePointList").click();
-						}else if($("#allPointList").hasClass("on")) {
+							fnGetPointTableInfo(usePointList);
+						}else if($("#allPointList").hasClass("active")) {
 							$("#allPointList").click();
+							fnGetPointTableInfo(allPointList);
 						}
-						// 첫화면 전체내역 조회
-						fnGetPointTableInfo();
+						
 		});
 	}
 	
 	// HTML 그리기
 	var fnGetPointTableInfo = function(param) {
+		$('.nodata').hide();
 		let tag = "";
-		$.each(param, function(idx,item){
-			tag +='<tr>';
-			tag +='<td>'+ item.occurGb + '</td>';
-			tag += '<td class="t_l pl40">'+ item.occurDtlDesc + '</td>';
-			// 증감 : 파랑, 차감 : 빨강으로 표시
-			if(item.pntAmt > 0){
-				tag += '<td class="c_blue">'+ item.pntAmt + '</td>';
-			}else{
-				tag += '<td class="c_primary">'+ item.pntAmt + '</td>';
-			}
-			tag += '<td>'+ item.pntUploadDt + '</td>';
-			tag += '</tr>';
-		});
+		if(param != null && param.length > 0){
+			$.each(param, function(idx,item){
+				tag += '<tr>';
+				tag += '	<td>';
+				if(item.pntAmt > 0){
+					tag += '		<span class="tag primary">적립</span>';
+				}else{
+					tag += '		<span class="tag deepgray">차감</span>';
+				}
+				
+				tag += '	</td>';
+				tag += '	<td>'+item.occurGb+'</td>';
+				tag += '	<td>';
+				tag += '		<div class="txt_content">'+ item.occurDtlDesc + '</div>';
+				tag += '	</td>';
+				tag += '	<td>';
+				if(item.pntAmt > 0){
+					tag += '		<span class="amount_plus">';
+					tag += '			<em>'+item.pntAmt.addComma()+'</em>P';
+					tag += '		</span>';
+				}else{
+					tag += '		<span class="c_primary">';
+					tag += '			<em>'+item.pntAmt+'</em>P';
+					tag += '		</span>';
+				}
+				
+				tag += '	</td>';
+				tag += '	<td>'+item.pntUploadDt;
+				tag += '	</td>';
+				tag += '</tr>		';
+			});
+		}else{
+			$('.nodata').show();
+			
+		}
+		
 		$("#pointAjaxList").html(tag);
 	}
 	
 	// 전체내역 조회
 	$("#allPointList").click(function(){
 
- 		$("#accumulatePointList").removeClass("on");
- 		$("#usePointList").removeClass("on");
+ 		$("#accumulatePointList").removeClass("active");
+ 		$("#usePointList").removeClass("active");
  		
- 		$("#allPointList").addClass("on");
- 		$("#plusMinus").text("증감/차감");
+ 		$("#allPointList").addClass("active");
+ 		//$("#plusMinus").text("증감/차감");
  		
  		fnGetPointTableInfo(allPointList);
 	});
@@ -191,11 +232,11 @@
 	// 적립내역 조회
 	$("#accumulatePointList").click(function(){
 
- 		$("#allPointList").removeClass("on");
- 		$("#usePointList").removeClass("on");
+ 		$("#allPointList").removeClass("active");
+ 		$("#usePointList").removeClass("active");
  		
- 		$("#accumulatePointList").addClass("on");
- 		$("#plusMinus").text("증감");
+ 		$("#accumulatePointList").addClass("active");
+ 		//$("#plusMinus").text("증감");
 		
  		fnGetPointTableInfo(accumulatePointList);
 	});
@@ -203,27 +244,28 @@
 	// 사용내역 조회
 	$("#usePointList").click(function(){
 		
-		$("#accumulatePointList").removeClass("on");
-		$("#allPointList").removeClass("on");
+		$("#accumulatePointList").removeClass("active");
+		$("#allPointList").removeClass("active");
 		
-		$("#usePointList").addClass("on");
-		$("#plusMinus").text("차감");
+		$("#usePointList").addClass("active");
+		//$("#plusMinus").text("차감");
 		
 		fnGetPointTableInfo(usePointList);
 	});
 	
 	$(document).ready(function() {
+		// 전체내역 표시
+ 		$("#allPointList").trigger("click");
 		// 마이페이지 LNB 설정
 		fnSetMypageLnbList(5);
 		
 		// 마이페이지 location 설정
 		fnSetMypageLocation('STYLE24 포인트', '_PAGE_MYPAGE_POINT');
 		
-		// 전체내역 표시
- 		$("#allPointList").trigger('click');
+		
 
 		// 셀렉트박스 활성화
-		$('.select_custom.type1').each(function(index) {
+		$('.select_custom').each(function(index) {
 			var selecter01 = new sCombo($(this));
 		});
 

+ 92 - 0
src/main/webapp/WEB-INF/views/web/order/OrderAddPaymentCompleteWeb.html

@@ -0,0 +1,92 @@
+<!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  : OrderAddPaymentWeb.html
+ * @desc    : 추가결제화면 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.04.13   jsh77b     최초 작성
+ *******************************************************************************
+ -->
+<body>
+<th:block layout:fragment="content">
+
+<div id="container" class="container od">
+	<div class="wrap">
+		<div class="content completed">
+			<div class="cont_head">
+				<h2>결제완료</h2>
+			</div>
+			<div class="cont_body">
+				<!-- CONT-BODY -->
+				<div class="od_cont">
+					<div class="sec_head">
+						<div class="info_complete">
+							<p class="txt_box">감사합니다. <span th:text="${chgerNm}"></span> 고객님의 결제가 완료되었습니다.</p>
+						</div>
+					</div>
+					<div class="sec_body">
+						<div class="area_payinfo">
+							<h3>결제정보</h3>
+							<div class="tbl type6">
+								<table>
+									<colgroup>
+										<col width="50%">
+										<col width="50%">
+									</colgroup>   
+									<tr>
+										<td>
+											<dl>
+												<div>
+													<dt>반품/교환 배송비</dt>
+													<dd><em th:text="|${#numbers.formatInteger(addPayCost, 1, 'COMMA')}|"></em>원</dd>	
+												</div>
+											</dl>
+										</td>
+										<td>
+											<dl>
+												<div>
+													<dt>결제 금액</dt>
+													<dd>
+														<div class="price">
+															<span class="pay_total_price">
+																<em th:text="|${#numbers.formatInteger(addPayCost, 1, 'COMMA')}|">3,546,200</em>원
+															</span>
+														</div>
+													</dd>
+												</div>
+												<!-- 신용카드 일때 -->
+												<div>
+													<dt class="sr-only">결제방법</dt>
+													<dd>신용카드</dd>
+												</div>
+												<!-- //신용카드 일때 -->
+											</dl>
+										</td>
+									</tr>
+								</table>
+							</div>
+						</div>
+					</div>
+					<div class="sec_foot">
+						<div class="btn_group_md">
+							<button type="button" class="btn btn_dark btn_md"><span>쇼핑 계속하기</span></button>
+						</div>
+					</div>
+				</div>
+				<!-- //CONT-BODY -->
+			</div>
+		</div>
+	</div>
+</div>
+
+<script th:inline="javascript">
+</script>
+</th:block>
+</body>
+</html>

+ 100 - 23
src/main/webapp/WEB-INF/views/web/order/OrderAddPaymentWeb.html → src/main/webapp/WEB-INF/views/web/order/OrderAddPaymentFormWeb.html

@@ -15,10 +15,27 @@
  -->
 <body>
 <th:block layout:fragment="content">
-<form class="form_wrap">
 
-<!--  container -->
-<div id="container" class="container od">
+<!-- payment.js -->
+<script type="text/javascript" th:src="${@environment.getProperty('pg.kcp.js.url')}" src=""></script>
+<script type="text/javascript" src="/biz/payment.js"></script>
+
+<!-- 주문정보form -->
+<form id="order_info" name="order_info" method="post" action="/order/addPay/result/response" style="display:none"></form>
+<!-- //주문정보form -->
+
+<form class="form_wrap" name="addPayForm" id="addPayForm">
+	<input type="hidden" name="refundAmt" th:value="${refundAmt}">
+	<input type="hidden" name="addPayCost" th:value="${addPayCost}">
+	<input type="hidden" name="ordChgSq" th:value="${ordChgSq}">
+	
+	<input type="hidden" name="chgGb" th:value="${chgGb}">
+	<input type="hidden" name="chgerPhnno" th:value="${chgerPhnno}">
+	<input type="hidden" name="chgerNm" th:value="${chgerNm}">
+	<input type="hidden" name="goodsNm" th:value="${goodsNm}"> 
+	
+	<!--  container -->
+	<div id="container" class="container od">
 		<div class="wrap">
 			<div class="content odPayment"> <!-- 페이지특정 클래스 = odPayment 클래스 추가 -->
 				<div class="cont_head">
@@ -37,11 +54,11 @@
 											<div class="paymethod_box">
 												<ul class="sel_method">
 													<li>
-														<input type="radio" name="rdi-paynormal" id="payCreditCard" value="" checked="checked">
+														<input type="radio" name="rdi-paynormal" id="payCreditCard" class="KCP" value="KCP|G014_30" checked="checked">
 														<label for="payCreditCard"><span>신용카드</span></label>
 													</li>
 													<li>
-														<input type="radio" name="rdi-paynormal" id="payCellphone" value="">
+														<input type="radio" name="rdi-paynormal" id="payCellphone" class="KCP" value="KCP|G014_60">
 														<label for="payCellphone"><span>휴대폰 결제</span></label>
 													</li>
 												</ul>
@@ -52,13 +69,13 @@
 								<div class="area_paymentinfo">
 									<div class="paymentinfo">
 										<div class="payinfo_blk">
-											<a href="">개인정보 제공에 대한 동의<span>보기</span></a>
+											<a href="javascript:void(0);">개인정보 제공에 대한 동의<span>보기</span></a>
 											<div class="infotxt">
 												개인정보제공에 대한 동의 내용입니다.개인정보제공에 대한 동의 내용입니다.개인정보제공에 대한 동의 내용입니다.개인정보제공에 대한 동의 내용입니다.개인정보제공에 대한 동의 내용입니다.개인정보제공에 대한 동의 내용입니다.개인정보제공에 대한 동의 내용입니다.개인정보제공에 대한 동의 내용입니다.개인정보제공에 대한 동의 내용입니다.개인정보제공에 대한 동의 내용입니다.개인정보제공에 대한 동의 내용입니다.개인정보제공에 대한 동의 내용입니다.개인정보제공에 대한 동의 내용입니다.개인정보제공에 대한 동의 내용입니다.개인정보제공에 대한 동의 내용입니다.개인정보제공에 대한 동의 내용입니다.개인정보제공에 대한 동의 내용입니다.개인정보제공에 대한 동의 내용입니다.개인정보제공에 대한 동의 내용입니다.개인정보제공에 대한 동의 내용입니다.개인정보제공에 대한 동의 내용입니다.개인정보제공에 대한 동의 내용입니다.개인정보제공에 대한 동의 내용입니다.개인정보제공에 대한 동의 내용입니다.개인정보제공에 대한 동의 내용입니다.개인정보제공에 대한 동의 내용입니다.개인정보제공에 대한 동의 내용입니다.개인정보제공에 대한 동의 내용입니다.개인정보제공에 대한 동의 내용입니다.개인정보제공에 대한 동의 내용입니다.개인정보제공에 대한 동의 내용입니다.개인정보제공에 대한 동의 내용입니다.개인정보제공에 대한 동의 내용입니다.개인정보제공에 대한 동의 내용입니다.개인정보제공에 대한 동의 내용입니다.개인정보제공에 대한 동의 내용입니다.
 											</div>
 										</div>
 										<div class="payinfo_blk">
-											<a href="">결제대행 서비스 약관 동의<span>보기</span></a>
+											<a href="javascript:void(0);">결제대행 서비스 약관 동의<span>보기</span></a>
 											<div class="infotxt">
 												결제대행서비스 약관 동의 내용입니다.결제대행서비스 약관 동의 내용입니다.결제대행서비스 약관 동의 내용입니다.결제대행서비스 약관 동의 내용입니다.결제대행서비스 약관 동의 내용입니다.결제대행서비스 약관 동의 내용입니다.결제대행서비스 약관 동의 내용입니다.결제대행서비스 약관 동의 내용입니다.결제대행서비스 약관 동의 내용입니다.결제대행서비스 약관 동의 내용입니다.결제대행서비스 약관 동의 내용입니다.결제대행서비스 약관 동의 내용입니다.결제대행서비스 약관 동의 내용입니다.결제대행서비스 약관 동의 내용입니다.결제대행서비스 약관 동의 내용입니다.결제대행서비스 약관 동의 내용입니다.결제대행서비스 약관 동의 내용입니다.결제대행서비스 약관 동의 내용입니다.결제대행서비스 약관 동의 내용입니다.결제대행서비스 약관 동의 내용입니다.결제대행서비스 약관 동의 내용입니다.결제대행서비스 약관 동의 내용입니다.결제대행서비스 약관 동의 내용입니다.결제대행서비스 약관 동의 내용입니다.결제대행서비스 약관 동의 내용입니다.결제대행서비스 약관 동의 내용입니다.결제대행서비스 약관 동의 내용입니다.결제대행서비스 약관 동의 내용입니다.결제대행서비스 약관 동의 내용입니다.결제대행서비스 약관 동의 내용입니다.결제대행서비스 약관 동의 내용입니다.결제대행서비스 약관 동의 내용입니다.결제대행서비스 약관 동의 내용입니다.결제대행서비스 약관 동의 내용입니다.결제대행서비스 약관 동의 내용입니다.결제대행서비스 약관 동의 내용입니다.
 										</div>
@@ -70,7 +87,9 @@
 							</div>
 							<div class="area_paybtn">
 								<div class="form_field">
-									<button type="button" class="btn btn_primary btn_block"><span>동의 후 <em>123,456,789원</em> 결제하기</span></button>
+									<button type="button" class="btn btn_primary btn_block" id="btn_payment">
+										<span>동의 후 <em th:text="|${#numbers.formatInteger(addPayCost, 1, 'COMMA')}원|"></em> 결제하기</span>
+									</button>
 								</div>
 							</div>
 						</div>
@@ -81,46 +100,58 @@
 							<div class="od_item_box">
 								<!-- 반품상품 내역 -->
 								<div class="part_dlvr">
-									<h4 class="sr-only">반품상품</h4>
+									<th:block th:if="${chGb} == 'G680_20'">
+										<h4 class="sr-only">반품상품</h4>
+									</th:block>
+									<th:block th:if="${chGb} == 'G680_30'">
+										<h4 class="sr-only">반품상품</h4>
+									</th:block>
+									<th:block th:if="${chGb} == 'G680_40'">
+										<h4 class="sr-only">교환상품</h4>
+									</th:block>
 									<div class="gd_list">
+										<th:block th:each="goods, i : ${orderAddPayGoodsList}" th:with="imageUrl=${@environment.getProperty('upload.goods.view')}">
 										<div class="item_gd">
 											<figure>
-												<span class="thumb"><img src="/images/pc/thumb/tmp_odSide1.jpg" alt=""></span>
+												<span class="thumb">
+													<img th:src="${imageUrl + '/' + goods.sysImgNm}" src="/" width="100%" alt="">
+												</span>
 												<figcaption>
-													<div class="brand">CURLYSUE 컬리수</div>
-													<div class="name">[★2020 겨울신상★] 리버시블 경량점퍼 CPW0XQJM51 [겨울] 리버시블 경량점퍼 CPW0XQJM51 [겨울]</div>
+													<div class="brand" th:text="${goods.brandEnm} + ' ' + ${goods.brandKnm}"></div>
+													<div class="name goodsNm" th:text="${goods.goodsNm}"></div>
+													<div class="option" th:each="colorNm, index : ${goods.colorNmArr}">
+														<span th:text="${colorNm}+'/'+${goods.optCd2Arr[index.index]}"></span> 
+													</div>
 													<div class="option">
-														<span>01_루돌프융기모상하복_D오렌지/110</span>
-														<span>울핸드메이드 벨티드재킷 SWHJKJ42010 / BROWN</span>
-														<span>BLACK / XXL</span>
-														<span>수량&nbsp;<em>99</em>개</span>
+														<span>수량:<em th:text="${goods.chgQty}"></em>개</span>
 													</div>
 													<div class="price">
-														<span class="selling_price">1,000,000</span>
+														<span class="selling_price" th:text="${#numbers.formatInteger((goods.currPrice + goods.optAddPrice) * goods.chgQty, 1, 'COMMA')}"></span>
 													</div>
 												</figcaption>
 											</figure>
 										</div>
-									</div>              
+										</th:block>
+									</div>
 								</div>
-								<!-- //반품상품 내역 -->                   
+								<!-- //반품상품 내역 -->
 							</div>
 							<div class="od_amount_box">
 								<dl>
 									<div>
 										<dt>환불 상품금액</dt>
-										<dd><em>1,590,000</em>원</dd>
+										<dd><em th:text="|${#numbers.formatInteger(refundAmt, 1, 'COMMA')}|"></em>원</dd>
 									</div>
 									<div>
 										<dt>반품/교환 배송비</dt>
-										<dd><em>0원</em></dd>
+										<dd><em th:text="|${#numbers.formatInteger(addPayCost, 1, 'COMMA')}|"></em></dd>
 									</div>
 								</dl>
 							</div>
 							<div class="totalprice_box">
 								<dl>
 									<dt>총 결제 예정 금액</dt>
-									<dd><span>3,546,200</span>원</dd>
+									<dd><span th:text="|${#numbers.formatInteger(addPayCost, 1, 'COMMA')}|"></span>원</dd>
 								</dl>
 								<p class="info_extra">
 									환불할 상품금액이 반품/교환 배송비보다 적을<br>
@@ -130,7 +161,7 @@
 							</div>
 						</div>
 					</div>
-					<!-- // CONT-BODY -->					
+					<!-- // CONT-BODY -->
 				</div>
 			</div>
 		</div>
@@ -139,6 +170,52 @@
 </form>
 
 <script th:inline="javascript">
+//결재하기
+$("#btn_payment").on("click", function(){
+	var paynormal			= $("input[name='rdi-paynormal']:checked").val();
+	var paynormalArr		= paynormal.split("|");
+	var pgGb				= paynormalArr[0];
+	var payMeans			= paynormalArr[1];
+	
+	// 주문데이타 생성
+	var orderData = {
+		"pgGb"					: pgGb
+		,"payMeans"				: payMeans // 네이버페이, 카카오페이
+		,"addPayCost"			: $("#addPayForm input[name=addPayCost]").val()
+		,"ordChgSq"				: $("#addPayForm input[name=ordChgSq]").val()
+		,"chgGb"				: $("#addPayForm input[name=chgGb]").val()
+		,"chgerPhnno"			: $("#addPayForm input[name=chgerPhnno]").val()
+		,"chgerNm"				: $("#addPayForm input[name=chgerNm]").val()
+		,"goodsNm"				: $("#addPayForm input[name=goodsNm]").val()
+	};
+	
+	$.ajax( {
+		type		: "POST",
+		url 		: '/order/addPayment',
+		data		: JSON.stringify(orderData),
+		dataType 	: 'html',
+		beforeSend : function(xhr, settings) {
+			xhr.setRequestHeader("AJAX"			, "true");
+			xhr.setRequestHeader('Accept'		, 'application/json');
+			xhr.setRequestHeader('Content-Type'	, 'application/json');
+			gagajf.showProgressbar(true);
+		},
+		success 	: function(result) {
+			// 결재정보로드
+			$("#order_info").html(result);
+			
+			var pgGb = $("#order_info input[name=pgGb]").val();
+			
+			if (pgGb == "NAVER") {
+				fnNaverPaymentReady();
+			} else if (pgGb == "KAKAO") {
+				fnKakaoPaymentReady();
+			} else if (pgGb == "KCP" || pgGb == "PAYCO") {
+				jsf__pay(document.order_info);
+			}
+		}
+	});
+});
 
 </script>
 </th:block>

+ 25 - 7
src/main/webapp/WEB-INF/views/web/planning/PlanningDetailFormWeb.html

@@ -98,9 +98,6 @@
 				<th:block th:if="${a.tmplType == 'G082_30'}">
 						<div class="content dp_mid_banner" th:id="${a.tmplType}"></div> <!-- //이미지-->
 					</th:block>
-				<th:block th:if="${a.tmplType == 'G082_40'}">
-						<div class="coner_item01" th:id="${a.tmplType}"></div>
-					</th:block>
 				<th:block th:if="${a.tmplType == 'G082_50'}">
 						<div class="content dp_special" th:id="${a.tmplType + a.planContSq}"></div>
 				</th:block>
@@ -111,6 +108,7 @@
 						<div class="content dp_special" th:id="${a.tmplType + a.planContSq}"></div>
 				</th:block>
 			</th:block>
+			<div class="coner_item01" th:utext="${#strings.replace(#strings.replace(fsrcInfoBtm.fsrcPc,'&amplt;','<'),'&ampgt;','>')}"></div>
 			
 			 <!-- 댓글리스트 -->
 			<th:block th:if="${planInfo.replyYn == 'Y'}">
@@ -374,7 +372,12 @@ if(image.length>0){
 	html += '            <div class="swiper-wrapper">';
 	for (var i = 0; i < image.length; i++) {
 		html += '                	<div class="swiper-slide">';
-		html += '                    	<img alt="" src="'+ imgUrl + image[i].itemVal +'">';
+		if (image[i].linkOpenGb == 'M') {
+			html += '                    	<a href="http://'+image[i].linkUrl+'" target="_self">><img alt="" src="'+ imgUrl + image[i].itemVal +'"></a>';
+		}else{
+			html += '                    	<a href="http://'+image[i].linkUrl+'" target="_blank">><img alt="" src="'+ imgUrl + image[i].itemVal +'"></a>';
+		}
+		
 		html += '                	</div>';
 	}
 	html += '            </div>';
@@ -406,7 +409,13 @@ if(goods1.length>0){
 			html += '	<div>';
 			html += '        <h4>';
 			if (template[i].linkUrl != null && template[i].linkUrl != '') { /* 링크 변경 예정 */
-				html += '        <a href="http://'+template[i].linkUrl+'" target="_blank">'+template[i].title+' <i class="ico_arrow"></i></a>';
+				console.log("template[i].linkOpenGb"+ template[i].linkOpenGb);
+				if (template[i].linkOpenGb == 'M') { //본창
+					html += '        <a href="http://'+template[i].linkUrl+'" target="_self">'+template[i].title+' <i class="ico_arrow"></i></a>';
+				}else{
+					html += '        <a href="http://'+template[i].linkUrl+'" target="_blank">'+template[i].title+' <i class="ico_arrow"></i></a>';
+				}
+				
 			}else{
 				html += '        <a href="javascript:void(0)">'+template[i].title+'</a>';
 			}
@@ -471,7 +480,11 @@ if(goods2.length>0){
 			html += '	<div>';
 			html += '        <h4>';
 				if (template[i].linkUrl != null && template[i].linkUrl != '') { /* 링크 변경 예정 */
-					html+='            <a href="http://'+template[i].linkUrl+'" target="_blank">'+template[i].title+'<i class="ico_arrow"></i></a>';
+					if (template[i].linkOpenGb == 'M') { //본창
+						html += '        <a href="http://'+template[i].linkUrl+'" target="_self">'+template[i].title+' <i class="ico_arrow"></i></a>';
+					}else{
+						html += '        <a href="http://'+template[i].linkUrl+'" target="_blank">'+template[i].title+' <i class="ico_arrow"></i></a>';
+					}
 				}else{
 					html+='            <a href="javascript:void(0)">'+template[i].title+'</a>';
 				}
@@ -538,8 +551,13 @@ if(goods4.length>0){
 			html += '<div class="cont_head">';
 			html += '<div>';
 			html += '        <h4>';
+			console.log(template[i].linkOpenGb );
 			if (template[i].linkUrl != null && template[i].linkUrl != '') { /* 링크 변경 예정 */
-				html+='            <a href="http://'+template[i].linkUrl+'" target="_blank">'+template[i].title+' <i class="ico_arrow"></i></a>';
+				if (template[i].linkOpenGb == "M") { //본창
+					html += '        <a href="http://'+template[i].linkUrl+'" target="_self">'+template[i].title+' <i class="ico_arrow"></i></a>';
+				}else{
+					html += '        <a href="http://'+template[i].linkUrl+'" target="_blank">'+template[i].title+' <i class="ico_arrow"></i></a>';
+				}
 			}else{
 				html+='            <a href="javascript:void(0)">'+template[i].title+'</a>';
 			}

+ 175 - 1
src/main/webapp/biz/goods.js

@@ -61,6 +61,7 @@ var fnViewStock = function(obj, goodsCd, optCd, optCd1, optCd2,  minOrdQty, maxO
 			$("#cartForm  input[name=cea]").attr("readonly",false);
 			$("#cartForm  input[name=stock]").val(itemCnt);
 
+			$('.price_box').show();
 			fnSetTotalPrice();
 			
 			// 모바일에서 작업해야함
@@ -77,6 +78,10 @@ var fnViewStock = function(obj, goodsCd, optCd, optCd1, optCd2,  minOrdQty, maxO
 
 // EP 쿠폰조회
 var fnEpCouponDown = function(afLinkCd, goodsCd, maxRownum){
+	if (typeof (afLinkCd) == 'undefined' || gagajf.isNull(afLinkCd)){
+		return false;
+	}
+	
 	let data = {afLinkCd : afLinkCd
 				, goodsCd : goodsCd
 				, maxRownum : maxRownum
@@ -86,7 +91,7 @@ var fnEpCouponDown = function(afLinkCd, goodsCd, maxRownum){
 			if(result.length>0){
 				let coupon = result[0];
 				let tag = '';
-				tag += '<div class="modal fade pd_pop epcoupon_pop" id="epCouponPop" tabindex="-1" role="dialog" aria-labelledby="epCouponLabel" aria-hidden="true" style="display:block;">\n';
+				tag += '<div class="modal fade pd_pop epcoupon_pop" id="epCouponPop" tabindex="-1" role="dialog" aria-labelledby="epCouponLabel" aria-hidden="true">\n';
 				tag += '	<div class="modal-dialog" role="document">\n';
 				tag += '	  <div class="modal-content">\n';
 				tag += '		<div class="modal-header">\n';
@@ -148,3 +153,172 @@ var fnEpCouponDownCallBack = function(){
 }
 
 //****************상품상세  end **********************************
+
+//****************상품리스트  start **********************************
+var categoryGoodsList = [];
+var cnt = 1;
+var email = '';
+var fnCreateGoodsList = function(result, ithrCd, contentLoc, goodsUrl, lastPage, endRow) {
+	var tag = '';
+	var rank = 0;
+	if(lastPage!='1'){
+		rank = endRow;
+	}
+	$.each(result.dataList, function(idx, item) {
+		if (idx < 4) {
+			categoryGoodsList.push(item.goodsCd);
+		}
+
+		tag += '<div class="item_prod">';
+		tag += '	<div class="item_state">';
+		tag += '		<button type="button" class="itemLike">관심상품 추가</button>';
+		tag += '		<a href="#none" class="itemLink">';
+		// tag += '			<div class="rank ranker"><span>'+(rank+(idx+1))+'</span></div>';
+		tag += '			<div class="itemPic">';
+		tag += '				<img alt="BLUE-a" class=" vLHTC pd_img" src="'+goodsUrl+'/'+item.sysImgNm+'">';
+		tag += '			</div>';
+		tag += '			<p class="itemBrand">'+item.brandGroupNm+'</p>';
+		tag += '			<div class="itemName">'+item.goodsFullNm+'</div>';
+		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>';
+		tag += '				<span class="chip_color54" value="BDS">BLACK</span>';
+		tag += '				<span class="chip_color40" value="YBR">WHITE</span>';
+		tag += '			</div>';
+		tag += '			<p class="itemBadge">';
+		tag += '				<span class="badge13">베스트 </span>';
+		tag += '			</p>';
+		if(item.goodsTnm != null){
+			tag += '			<div class="itemComment">'+item.goodsTnm+'</div>';
+		}
+		tag += '		</a>';
+		tag += '	</div>';
+		tag += '</div>';
+	});
+
+	if (cnt == 1) {
+		// <!-- Criteo 카테고리/리스팅 태그 -->
+		window.criteo_q = window.criteo_q || [];
+		var deviceType = /iPad/.test(navigator.userAgent) ? "t" : /Mobile|iP(hone|od)|Android|BlackBerry|IEMobile|Silk/.test(navigator.userAgent) ? "m" : "d";
+		window.criteo_q.push(
+			{event: "setAccount", account: 26073}, // 이 라인은 업데이트하면 안됩니다
+			{event: "setEmail", email: email}, // 유저가 로그인이 안되 있는 경우 빈 문자열을 전달
+			{event: "setSiteType", type: deviceType},
+			{event: "viewList", item: categoryGoodsList} // 가장 위에있는 3개의 상품 ID를 전달
+		);
+		// <!-- END 카테고리/리스팅 태그 -->
+		cnt++;
+	}
+
+	return tag;
+}
+
+
+// 인피니트 스크롤 초기화
+var fnCategoryGoodsInfiniteScrollInit = function(){
+	sessionStorage.removeItem(document.location.href);
+	//History 초기화
+	$("#listBox").html("");
+}
+
+var filterHtml = '';
+var filterStatHtml = '';
+
+// 상품상세 필터 조회
+var filterSel = function (obj, gubun, staus, sizeGb){
+	let $obj = $(obj);
+	if(staus=='on'){
+		$(obj).attr('onclick','filterSel(this,\''+gubun+'\',\'off\',\'\');');
+		$("#filterData").find('span').each(function(idx,item) {
+			if(gubun=='color'){
+				if($obj.attr('data-id').replace('#','').trim() == $(this).closest("span").attr('id')) {
+					$(this).closest("span").remove();
+				}
+			}else{
+				if($obj.attr('data-id') == $(this).closest("span").text()) {
+					$(this).closest("span").remove();
+				}
+			}
+		});
+	}else{
+		$(obj).attr('onclick','filterSel(this,\''+gubun+'\',\'on\',\'\');');
+
+		let tag = '';
+		if(gubun=='color'){
+			tag += '<span id="'+$obj.attr('data-id').replace('#','')+'">';
+			if($obj.attr('data-id')=='#FFFFFF'){
+				tag += '	<span class="pdColor-color" style="background-color: #'+$obj.attr('data-id')+';border:1px solid #aaa;" value="'+$obj.attr('data-id')+'"></span>';
+			}else{
+				tag += '	<span class="pdColor-color" style="background-color: #'+$obj.attr('data-id')+'" value="'+$obj.attr('data-id')+'"></span>';
+			}
+			tag += '	<a href="javascript:void(0);" class="filter_delete" onclick="fnDeleteFilter(this,\''+gubun+'\');"></a >';
+			tag += '</span>';
+		}else{
+			tag += '<span>'+$obj.attr('data-id');
+			if(!gagajf.isNull(sizeGb)){
+				tag += '<a href="javascript:void(0);" class="filter_delete" onclick="fnDeleteFilter(this,\''+gubun+'\',\'on\',\''+sizeGb+'\');"></a >';
+			}else{
+				tag += '<a href="javascript:void(0);" class="filter_delete" onclick="fnDeleteFilter(this,\''+gubun+'\',\'on\',\'\');"></a >';
+			}
+			tag += '</span>';
+		}
+
+		$("#filterData").append(tag);
+	}
+
+	fnFilterSet(gubun, sizeGb);
+}
+
+var fnFilterSet = function (searchId, sizeGb){
+	fnCategoryGoodsInfiniteScrollInit();
+	$("#searchGoodsForm input:hidden[name="+searchId+"Search]").remove();
+	var tag = '';
+	if(searchId=='size'){
+		//$('#filterForm #sizeLi'+sizeGb).find('input[name='+searchId+']:checked').each(function(idx,item){
+		$('#filterForm input[name='+searchId+']:checked').each(function(){
+			//console.log('idx::::'+item);
+			tag = '<input type="hidden" name="'+searchId+'Search" value="'+$(this).val()+'"/>\n';
+			$("#searchGoodsForm").append(tag);
+		});
+	}else{
+		$('#filterForm input[name='+searchId+']:checked').each(function(){
+			tag = '<input type="hidden" name="'+searchId+'Search" value="'+$(this).val()+'"/>\n';
+			$("#searchGoodsForm").append(tag);
+		});
+	}
+
+
+	fnGoodsListSearch();
+}
+
+// 상품상세 필터 삭제
+var fnDeleteFilter = function (obj, gubun, sizeGb){
+	$("#"+gubun+"FilterDiv > ul > li").each(function(idx,item) {
+		if(gubun == 'size'){
+			$("#sizeLi"+sizeGb+" .size_btn").each(function (){
+				if($(obj).closest("span").text() == $(this).find('input').attr('data-id')){
+					$(this).find('input').click();
+				}
+			});
+		}else if(gubun == 'color'){
+			if($(obj).closest("span").attr('id') == $(this).find('input').attr('data-id').trim()){
+				$(this).find('input').click();
+			}
+		}else{
+			if($(obj).closest("span").text() == $(this).find('input').attr('data-id')){
+				$(this).find('input').click();
+			}
+		}
+	});
+
+	$(obj).closest("span").remove();
+}
+
+//****************상품리스트  end **********************************

+ 8 - 1
src/main/webapp/biz/mypage.js

@@ -290,13 +290,20 @@ var fnReceipt = function(param) {
 		// 팝업 크기 설정
 		option = 'width=370, height=625';
 	} else if (param == 'cancel') {
-		if (param.refunYn == 'Y') {
+		if (refundYn == 'Y') {
 			// TODO
 			// 취소전표 확인 처리
+			//receiptWin += '?cmd=card_bill';
+			//receiptWin += '&tno=' + oneData.pgTid;
+			//receiptWin += '&order_no=' + oneData.ordNo;
+			//receiptWin += '&trade_mony=' + oneData.refundAmt;
 		} else {
 			mcxDialog.alert('아직 전표생성이 되지 않았습니다.');
 			return false;
 		}
+		
+		// 팝업 크기 설정
+		option = 'width=455, height=815';
 	} else if (param == 'delivery') {
 		// URL 설정
 		receiptWin += '?cmd=card_bill';

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

@@ -1997,7 +1997,7 @@ button.alertCls {-webkit-appearance: none;padding: 0;cursor: pointer;background:
 .app-only .guidance:after{content: '';position: absolute;top: 0;bottom: 15px;left: 10px;width: 100%;height: 100%;z-index: -1;}
 .app-only .guidance{
     box-shadow: 0 0px 30px rgb(0 0 0 / 20%), 0 0px 30px rgb(0 0 0 / 20%);
-	/* 마스크 미사용 
+	/* 마스크 미사용
 	mask-image: linear-gradient(to top right, transparent 49.5%, white 50.5%), linear-gradient(to top left, transparent 49.5%, white 50.5%), linear-gradient(white, white), linear-gradient(white, white);
     -webkit-mask-image: linear-gradient(to top right, transparent 49.5%, white 50.5%), linear-gradient(to top left, transparent 49.5%, white 50.5%), linear-gradient(white, white), linear-gradient(white, white);
 	mask-size: 100% 0%, 2vh 2vh, calc(100% - 1.9vh) 100%, 100% calc(100% - 1.9vh);

+ 5 - 3
src/main/webapp/ux/pc/css/layout.css

@@ -1530,7 +1530,7 @@ ul.maintabs li [class^='box_depth'] {display:none; position:absolute; left:100%;
 	.faq .quick_list ul li {width: 19.99%; height: 49.9%; text-align: center; border-left: 1px solid #ddd; border-bottom: 1px solid #ddd;}
 	.faq .quick_list ul li:nth-child(1),.faq .quick_list ul li:nth-child(6) {border-left:none;}
 	.faq .quick_list ul li:nth-child(6),.faq .quick_list ul li:nth-child(7),.faq .quick_list ul li:nth-child(8),.faq .quick_list ul li:nth-child(9),.faq .quick_list ul li:nth-child(10) {border-bottom: none;}
-	.faq .quick_list ul li a {display: flex; display: -ms-flexbox; justify-content: center; width:100%; height: 100%; line-height:26px; font-size:16px; font-weight: 200; align-items: center; color:#222; letter-spacing:-0.025em;padding: 0 25px;}
+	.faq .quick_list ul li a {display: flex; display: -ms-flexbox; justify-content: center; word-break: keep-all; overflow: hidden; width:100%; height: 100%; line-height:26px; font-size:16px; font-weight: 200; align-items: center; color:#222; letter-spacing:-0.025em;padding: 0 15px;}
 	.faq .search_wrap {margin-bottom:60px;}
 	.faq .search_wrap .faq_search {height:190px; background:#f5f5f5; padding:50px; box-sizing:border-box; text-align:center;}
 	.faq .search_wrap .faq_search .search_box {display:inline-block; position:relative; width:600px; padding-right:50px; border-bottom:2px solid #222; box-sizing: border-box; text-align:left;}
@@ -1541,7 +1541,7 @@ ul.maintabs li [class^='box_depth'] {display:none; position:absolute; left:100%;
 	.faq .fold_nav {width:100%;}
 	.faq .fold_nav ul {display: flex; display: -ms-flexbox; flex-wrap: wrap; margin-top:-12px}
 	.faq .fold_nav ul li {margin:12px 12px 0 0;}
-	.faq .fold_nav ul li a {display:inline-block;padding:15px 22px 13px;border: 1px solid #ddd;font-size: 16px;font-weight: 300;line-height: 1; letter-spacing:-0.025em;}
+	.faq .fold_nav ul li a {display:inline-block;padding:15px 22px;border: 1px solid #ddd;font-size: 16px;font-weight: 300;line-height: 1; letter-spacing:-0.025em;}
 	.faq .fold_nav ul li a.on {position: relative; background: #222; color:#fff; border: 1px solid #222;}
 	.faq .fold_nav ul li a.on::after {content:''; position: absolute; width:0; height: 0; bottom:-1px; right:-1px; border-bottom: 13px solid #fff; border-left: 13px solid transparent;}
 	.faq .foldGroup {margin-top:50px}
@@ -1813,7 +1813,7 @@ ul.maintabs li [class^='box_depth'] {display:none; position:absolute; left:100%;
 	.stamp_event .event_benefit {margin-top:80px;}
 	.stamp_event .event_benefit .title {color:#222; font-size:30px; font-weight:500; text-align:center;}
 	.stamp_event .event_benefit .benefit_con {margin-top:40px; text-align:center;}
-	.stamp_event .event_benefit .benefit_con ul{display: flex;margin: -6px auto;width: 1200px;background: #f5f5f5;}
+	.stamp_event .event_benefit .benefit_con ul{margin: -6px auto;width: 1200px;background: #f5f5f5;display: -webkit-box;display: -ms-flexbox;display: flex;-webkit-box-pack: center;-ms-flex-pack: center;justify-content: center;}
 	.stamp_event .event_benefit .benefit_con li{width: 24%;height: 125px;margin:40px 0;position:relative;}
 	.stamp_event .event_benefit .benefit_con li::after{content: ''; display: inline-block;width: 1px;height: 100%;padding: 0;margin: 0;background: #e4e4e4;position: absolute;right: 0;top: 0;}
 	.stamp_event .event_benefit .benefit_con li:last-child::after{content: ''; display: inline-block; width:0;}
@@ -2582,6 +2582,8 @@ ul.maintabs li [class^='box_depth'] {display:none; position:absolute; left:100%;
 	.pd_detail .thumb {display:block; position:relative; width:100%; height:0px; line-height:0; font-size:0; padding-top:150%; overflow:hidden;background:#f5f5f5;background: #ffffff;border: 1px solid #f5f5f5;box-sizing: content-box;}
 	.pd_detail .thumb img,
 	.pd_detail .thumb video {position:absolute; left:0; top:50%; width:100%; transform:translateY(-50%) ; z-index:2;}
+	.pd_detail .movbox {position: relative;height: 0;padding-top: 100%;padding-bottom:50.25%;overflow: hidden;transition: all 300ms ease;transform: scale(1);}
+	.pd_detail .movbox iframe{position: absolute;left: 0;right: 0;top: 0;bottom: 0;width: 100%;height: 100%;z-index: 1;}
 	.pd_detail .btn_popup {display:inline-block; padding:0px; box-sizing:border-box;}
 	.pd_detail .btn_popup span {color:#888; font-size:12px; font-weight:200; border-bottom:1px solid #888; /*vertical-align:top;*/}
 

+ 14 - 7
src/main/webapp/ux/style24_link.js

@@ -138,7 +138,7 @@ var cfnGoToPage = function(page, ithrCd) {
  * @since  : 2021/02/09
  * @author : jsshin
  */
-var cfnOpenCellphoneCertify = function (redirectUrl, custparams) {
+var cfnOpenCellphoneCertify = function (redirectUrl, custParams) {
 	var actionUrl = _frontUrl + "/customer/nice/cellphone/form";
 	var popupWidth = 420;
 	var popupHeight = 720;
@@ -150,8 +150,8 @@ var cfnOpenCellphoneCertify = function (redirectUrl, custparams) {
 		console.log('redirectUrl', redirectUrl);
 		if (!gagajf.isNull(redirectUrl)) {
 			actionUrl = actionUrl + "?redirectUrl=" + redirectUrl;
-			if (!gagajf.isNull(custparams)) {
-				actionUrl = actionUrl + "&custparams=" + custparams;
+			if (!gagajf.isNull(custParams)) {
+				actionUrl = actionUrl + "&custParams=" + custParams;
 			}
 			document.location.href = actionUrl;
 		}
@@ -695,7 +695,7 @@ function cfGoodsQng(goodsCd) {
 	var Param = new Object();
 	var str = '<div class="pd_pop full_pop pd_qnalist_pop" id="layer_goods_qna"></div>';
 	if ("P" != _frontGb){
-		str = '<div class="modal pop_full fade pd_pop pd_qnalist_pop"  data-id="layer_infinite" id="layer_goods_qna" tabindex="-1" role="dialog" aria-labelledby="exampleFullLabel" aria-hidden="true"></div>';
+		str = '<div class="modal pop_full fade pd_pop pd_qnalist_pop" id="layer_goods_qna" tabindex="-1" role="dialog" aria-labelledby="exampleFullLabel" aria-hidden="true"></div>';
 	}
 
 	if ($('#layer_goods_qna').length == 0) {
@@ -963,6 +963,7 @@ function cfnPutWishList(a) {
 				//		}
 				//	});
 				}
+				fnGetWishList();
 			} else if (result.status == "중복") {
 				Msg = '이미 등록 되어있습니다.';
 			} else {
@@ -984,6 +985,7 @@ function cfnPutWishList(a) {
 			if (result.status == "200") {
 				Msg = '삭제 되었습니다.';
 				$(a).removeClass('active');
+				fnGetWishList();
 			} else {
 				Msg = '오류로 인해 처리되지 않았습니다.';
 			}
@@ -1013,8 +1015,9 @@ function cfnPutWishList(a) {
  * @since  : 2021/03/22
  * @author : gagamel
  */
-var cfnGoToCategoryMain = function(cateGb, cate1No) {
+var cfnGoToCategoryMain = function(cateGb, cate1No, brandGroupNo) {
 	var params = '?cateGb=' + cateGb + '&cate1No=' + cate1No;
+	if (typeof (brandGroupNo) != 'undefined') params += '&brandGroupNo=' + brandGroupNo;
 	cfnGoToPage(_PAGE_CATE_MAIN + params);
 }
 
@@ -1109,8 +1112,12 @@ var cfnGoToLookbookList = function (lookbookGb, brandGroupNo) {
  * @author : bin2107
  */
 var cfnGoToLookbookDetail = function (lookbookGb, lookbookSq, brandGroupNo) {
-	var params = '?lookbookGb='+lookbookGb+'lookbookSq=' + lookbookSq;
-	if (typeof (brandGroupNo) != 'undefined') params += '&brandCd=' + brandGroupNo;
+	var params = '?lookbookGb='+lookbookGb+'&lookbookSq=' + lookbookSq;
+	if(lookbookGb=='BL'){
+		if (typeof (brandGroupNo) != 'undefined') params += '&brandCd=' + brandGroupNo + '&brandGroupNo=' + brandGroupNo;
+	}else {
+		if (typeof (brandGroupNo) != 'undefined') params += '&brandCd=' + brandGroupNo;
+	}
 
 	cfnGoToPage(_PAGE_LOOKBOOK_DETAIL + params);
 }

Некоторые файлы не были показаны из-за большого количества измененных файлов