Переглянути джерело

Merge branch 'develop' into eskim

eskim 5 роки тому
батько
коміт
7cd6096647
100 змінених файлів з 4610 додано та 1279 видалено
  1. 40 0
      src/main/java/com/style24/front/biz/dao/TsfOrderChangeDao.java
  2. 10 0
      src/main/java/com/style24/front/biz/dao/TsfOrderDao.java
  3. 30 0
      src/main/java/com/style24/front/biz/dao/TsfPlanningDao.java
  4. 34 0
      src/main/java/com/style24/front/biz/dao/TsfReinboundDao.java
  5. 27 10
      src/main/java/com/style24/front/biz/service/TsfCartService.java
  6. 43 3
      src/main/java/com/style24/front/biz/service/TsfDisplayService.java
  7. 123 4
      src/main/java/com/style24/front/biz/service/TsfOrderChangeService.java
  8. 65 52
      src/main/java/com/style24/front/biz/service/TsfOrderService.java
  9. 57 3
      src/main/java/com/style24/front/biz/service/TsfPlanningService.java
  10. 47 0
      src/main/java/com/style24/front/biz/service/TsfReinboundService.java
  11. 19 0
      src/main/java/com/style24/front/biz/web/TsfCartController.java
  12. 6 3
      src/main/java/com/style24/front/biz/web/TsfCustomerController.java
  13. 47 0
      src/main/java/com/style24/front/biz/web/TsfDisplayController.java
  14. 272 82
      src/main/java/com/style24/front/biz/web/TsfMypageController.java
  15. 66 74
      src/main/java/com/style24/front/biz/web/TsfOrderController.java
  16. 9 2
      src/main/java/com/style24/front/biz/web/TsfPlanningController.java
  17. 2 0
      src/main/java/com/style24/persistence/domain/Cart.java
  18. 6 0
      src/main/java/com/style24/persistence/domain/Cate4Srch.java
  19. 8 0
      src/main/java/com/style24/persistence/domain/Contents.java
  20. 7 2
      src/main/java/com/style24/persistence/domain/Plan.java
  21. 13 9
      src/main/java/com/style24/persistence/domain/ReinboundInform.java
  22. 1 0
      src/main/java/com/style24/persistence/mybatis/shop/TsfCart.xml
  23. 6 6
      src/main/java/com/style24/persistence/mybatis/shop/TsfCoupon.xml
  24. 16 4
      src/main/java/com/style24/persistence/mybatis/shop/TsfGoods.xml
  25. 25 0
      src/main/java/com/style24/persistence/mybatis/shop/TsfOrder.xml
  26. 390 5
      src/main/java/com/style24/persistence/mybatis/shop/TsfOrderChange.xml
  27. 42 3
      src/main/java/com/style24/persistence/mybatis/shop/TsfPlanning.xml
  28. 59 0
      src/main/java/com/style24/persistence/mybatis/shop/TsfReinbound.xml
  29. 6 0
      src/main/java/com/style24/persistence/mybatis/shop/TsfReview.xml
  30. 2 0
      src/main/resources/i18n/messages/message_ko_KR.properties
  31. 3 0
      src/main/webapp/WEB-INF/views/mob/SigninFormMob.html
  32. 4 3
      src/main/webapp/WEB-INF/views/mob/cart/CartChangeOptionPopupMob.html
  33. 141 120
      src/main/webapp/WEB-INF/views/mob/cart/CartListAjaxFormMob.html
  34. 24 0
      src/main/webapp/WEB-INF/views/mob/cart/CartListFormMob.html
  35. 5 10
      src/main/webapp/WEB-INF/views/mob/common/fragments/GnbSubMob.html
  36. 48 0
      src/main/webapp/WEB-INF/views/mob/common/layout/MypageLayoutMob.html
  37. 1 1
      src/main/webapp/WEB-INF/views/mob/customer/IdFindFormMob.html
  38. 85 0
      src/main/webapp/WEB-INF/views/mob/customer/JoinTypeFormMob.html
  39. 256 0
      src/main/webapp/WEB-INF/views/mob/customer/PasswordChangeFormMob.html
  40. 238 167
      src/main/webapp/WEB-INF/views/mob/customer/PasswordFindFormMob.html
  41. 172 0
      src/main/webapp/WEB-INF/views/mob/mypage/RestockFormMob.html
  42. 22 0
      src/main/webapp/WEB-INF/views/mob/order/OrderEmptyMob.html
  43. 18 11
      src/main/webapp/WEB-INF/views/mob/order/OrderFormMob.html
  44. 25 3
      src/main/webapp/WEB-INF/views/mob/order/OrderNoMemberMob.html
  45. 96 110
      src/main/webapp/WEB-INF/views/web/cart/CartListAjaxFormWeb.html
  46. 54 27
      src/main/webapp/WEB-INF/views/web/common/fragments/BrandGnbWeb.html
  47. 1 23
      src/main/webapp/WEB-INF/views/web/common/fragments/FooterWeb.html
  48. 6 0
      src/main/webapp/WEB-INF/views/web/common/layout/MypageLayoutWeb.html
  49. 48 0
      src/main/webapp/WEB-INF/views/web/common/layout/PlanningLayoutWeb.html
  50. 1 1
      src/main/webapp/WEB-INF/views/web/customer/PasswordChangeFormWeb.html
  51. 87 88
      src/main/webapp/WEB-INF/views/web/customer/PasswordFindFormWeb.html
  52. 362 0
      src/main/webapp/WEB-INF/views/web/display/BestMainFormWeb.html
  53. 0 2
      src/main/webapp/WEB-INF/views/web/display/CategoryGoodsListFormWeb.html
  54. 356 0
      src/main/webapp/WEB-INF/views/web/display/LookbookDetailFormWeb.html
  55. 81 406
      src/main/webapp/WEB-INF/views/web/mypage/MypageCreCancelDetailFormWeb.html
  56. 353 0
      src/main/webapp/WEB-INF/views/web/mypage/MypageCreExchangeDetailFormWeb.html
  57. 18 5
      src/main/webapp/WEB-INF/views/web/mypage/MypageCreListFormWeb.html
  58. 342 0
      src/main/webapp/WEB-INF/views/web/mypage/MypageCreReturnDetailFormWeb.html
  59. 1 1
      src/main/webapp/WEB-INF/views/web/mypage/MypageExchangeFormWeb.html
  60. 1 1
      src/main/webapp/WEB-INF/views/web/mypage/MypageOrderDetailFormWeb.html
  61. 8 1
      src/main/webapp/WEB-INF/views/web/mypage/MypageReviewFormWeb.html
  62. 202 0
      src/main/webapp/WEB-INF/views/web/mypage/RestockFormWeb.html
  63. 22 0
      src/main/webapp/WEB-INF/views/web/order/OrderEmptyWeb.html
  64. 3 0
      src/main/webapp/WEB-INF/views/web/order/OrderFormWeb.html
  65. 33 25
      src/main/webapp/WEB-INF/views/web/planning/PlanningDetailFormWeb.html
  66. 2 4
      src/main/webapp/biz/goodsSession.js
  67. 13 8
      src/main/webapp/biz/mypage.js
  68. BIN
      src/main/webapp/images/mo/ico_admin2.png
  69. BIN
      src/main/webapp/images/mo/ico_btn_more_w.png
  70. BIN
      src/main/webapp/images/mo/ico_btn_search_w.png
  71. BIN
      src/main/webapp/images/mo/ico_btn_store_w.png
  72. BIN
      src/main/webapp/images/mo/ico_cate_arrow.png
  73. BIN
      src/main/webapp/images/mo/ico_like03.png
  74. BIN
      src/main/webapp/images/mo/ico_picker.png
  75. BIN
      src/main/webapp/images/mo/ico_restock_past.png
  76. BIN
      src/main/webapp/images/mo/ico_restock_ready.png
  77. BIN
      src/main/webapp/images/mo/ico_restock_remain.png
  78. BIN
      src/main/webapp/images/mo/ico_sch_del_w.png
  79. BIN
      src/main/webapp/images/mo/ico_tabbar.png
  80. BIN
      src/main/webapp/images/mo/info_size_bag.png
  81. BIN
      src/main/webapp/images/mo/info_size_pants.png
  82. BIN
      src/main/webapp/images/mo/info_size_shoe.png
  83. BIN
      src/main/webapp/images/mo/info_size_top.png
  84. BIN
      src/main/webapp/images/mo/info_size_underwear.png
  85. BIN
      src/main/webapp/images/mo/logo_STYLE24.png
  86. BIN
      src/main/webapp/images/mo/logo_STYLE24_b.png
  87. BIN
      src/main/webapp/images/mo/pd_arrow.png
  88. BIN
      src/main/webapp/images/mo/thumb/brand01.png
  89. BIN
      src/main/webapp/images/mo/thumb/brand02.png
  90. BIN
      src/main/webapp/images/mo/thumb/brand03.png
  91. BIN
      src/main/webapp/images/mo/thumb/brand04.png
  92. BIN
      src/main/webapp/images/mo/thumb/brand05.png
  93. BIN
      src/main/webapp/images/mo/thumb/brand06.png
  94. BIN
      src/main/webapp/images/mo/thumb/brand07.png
  95. BIN
      src/main/webapp/images/mo/thumb/brand08.png
  96. BIN
      src/main/webapp/images/mo/thumb/brand09.png
  97. BIN
      src/main/webapp/images/mo/thumb/brand10.png
  98. BIN
      src/main/webapp/images/mo/thumb/brand11.png
  99. BIN
      src/main/webapp/images/mo/thumb/brand12.png
  100. BIN
      src/main/webapp/images/mo/thumb/brand13.png

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

@@ -128,4 +128,44 @@ public interface TsfOrderChangeDao {
 	 */
 	Collection<OrderChange> getCreCancelDetailInfo(OrderChange orderChange);
 
+	/**
+	 * 마이페이지 반품 상세 정보 조회
+	 *
+	 * @param OrderChange
+	 * @return Collection<OrderChange>
+	 * @author card007
+	 * @since 2021. 04. 13
+	 */
+	Collection<OrderChange> getCreReturnDetailInfo(OrderChange orderChange);
+
+	/**
+	 * 마이페이지 교환 상세 정보 조회
+	 *
+	 * @param OrderChange
+	 * @return Collection<OrderChange>
+	 * @author card007
+	 * @since 2021. 04. 13
+	 */
+	Collection<OrderChange> getCreExchangeDetailInfo(OrderChange orderChange);
+
+	/**
+	 * 마이페이지 회수지 수정
+	 *
+	 * @param OrderChange
+	 * @return int
+	 * @author card007
+	 * @since 2021. 04. 13
+	 */
+	int updateChgerAddr(OrderChange orderChange);
+
+	/**
+	 * 마이페이지 반품메모 수정
+	 *
+	 * @param OrderChange
+	 * @return int
+	 * @author card007
+	 * @since 2021. 04. 13
+	 */
+	int updateChgerRtnMemo(OrderChange orderChange);
+
 }

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

@@ -118,4 +118,14 @@ public interface TsfOrderDao {
 	 */
 	int getCheckCustCpnSq(Order order);
 	
+	/**
+	 * 사은품 수량 및 사용여부 체크
+	 * 
+	 * @param order
+	 * @return int
+	 * @author jsh77b
+	 * @since 2021.04.13
+	 */
+	int getCheckFreegiftVal(Order order);
+	
 }

+ 30 - 0
src/main/java/com/style24/front/biz/dao/TsfPlanningDao.java

@@ -382,4 +382,34 @@ public interface TsfPlanningDao {
 	 */
 	void deleteEntryReply(Plan plan);
 	
+	/**
+	 * 기획전/이벤트 댓글 이미지 저장
+	 *
+	 * @param Plan
+	 * @return 
+	 * @author sowon
+	 * @date 2021. 4. 13
+	 */
+	void saveEntryReplyAttach(Plan plan);
+	
+	/**
+	 * 기획전/이벤트 댓글 이미지 리스트
+	 *
+	 * @param Plan
+	 * @return Collection<Plan>
+	 * @author sowon
+	 * @date 2021. 4. 8
+	 */
+	Collection<Plan> getEntryReplyAttachList(Plan plan);
+	
+	/**
+	 * 기획전/이벤트 댓글 이미지 삭제
+	 *
+	 * @param Plan
+	 * @return 
+	 * @author sowon
+	 * @date 2021. 4. 13
+	 */
+	void deleteEntryReplyAttach(Plan plan);
+	
 }

+ 34 - 0
src/main/java/com/style24/front/biz/dao/TsfReinboundDao.java

@@ -0,0 +1,34 @@
+package com.style24.front.biz.dao;
+
+import java.util.Collection;
+
+import com.style24.core.support.annotation.ShopDs;
+import com.style24.persistence.domain.ReinboundInform;
+
+/**
+ * 재입고알림 Dao
+ *
+ * @author gagamel
+ * @since 2021. 4. 13
+ */
+@ShopDs
+public interface TsfReinboundDao {
+
+	/**
+	 * 재입고알림 목록
+	 * @param custNo - 고객번호
+	 * @return
+	 * @author gagamel
+	 * @date 2021. 4. 13
+	 */
+	Collection<ReinboundInform> getReinboundInformList(Integer custNo);
+
+	/**
+	 * 재입고알림 연장 처리
+	 * @param params - 재입고알림 정보
+	 * @author gagamel
+	 * @date 2021. 4. 13
+	 */
+	void updateReinboundInformContinue(ReinboundInform params);
+
+}

+ 27 - 10
src/main/java/com/style24/front/biz/service/TsfCartService.java

@@ -78,7 +78,15 @@ public class TsfCartService {
 			goodsType = params.iterator().next().getCartCompsList().iterator().next().getGoodsType();
 			cartGb    = params.iterator().next().getCartCompsList().iterator().next().getCartGb();
 		}
-
+		
+		// 2021.04.13 jsh77b 주문서에서 유효성 체크를 위해서 추가
+		String checkGb = "";
+		if (params.iterator().next().getCheckGb() == null) {
+			checkGb = "C";
+		} else {
+			checkGb = params.iterator().next().getCheckGb();
+		}
+		
 		// 장바구니 상품 및 재고 가능 여부 체크
 		if(TscConstants.GoodsType.SET.value().equals(goodsType)) {
 			for (Cart goodsParams : params) {
@@ -124,7 +132,7 @@ public class TsfCartService {
 					}
 
 					// 금일 주문 수량 체크
-					if (!StringUtils.isEmpty(param.getCartGb()) && "O".equals(param.getCartGb())) {
+					if (!StringUtils.isEmpty(param.getCartGb()) && ("O".equals(param.getCartGb()) || "G".equals(param.getCartGb()))) {
 						int goodsCartCnt = 0;
 						if(param.getCustNo() != 0) {
 							goodsCartCnt = cartDao.getGoodsTodayOrderCnt(param);
@@ -136,9 +144,14 @@ public class TsfCartService {
 						}
 					}
 				}
-
-				saveSetTypeCartInfo(params, cartSqList);
+				
+				// 2021.04.13 jsh77b 주문서에서 유효성 체크를 위해서 추가
+				if ("C".equals(checkGb)) {
+					saveSetTypeCartInfo(params, cartSqList);
+				}
 			}
+
+			saveSetTypeCartInfo(params, cartSqList);
 		} else {
 			for (Cart param : params) {
 				param.setCustNo(login.getCustNo());
@@ -182,7 +195,7 @@ public class TsfCartService {
 				}
 
 				// 금일 주문 수량 체크
-				if (!StringUtils.isEmpty(param.getCartGb()) && "O".equals(param.getCartGb())) {
+				if (!StringUtils.isEmpty(param.getCartGb()) && ("O".equals(param.getCartGb()) || "G".equals(param.getCartGb()))) {
 					int goodsCartCnt = 0;
 					if(param.getCustNo() != 0) {
 						goodsCartCnt = cartDao.getGoodsTodayOrderCnt(param);
@@ -194,8 +207,11 @@ public class TsfCartService {
 					}
 				}
 			}
-
-			saveNormalDealCartInfo(params, cartSqList);
+			
+			// 2021.04.13 jsh77b 주문서에서 유효성 체크를 위해서 추가
+			if ("C".equals(checkGb)) {
+				saveNormalDealCartInfo(params, cartSqList);
+			}
 		}
 
 		result.put("cartSqList", cartSqList);
@@ -269,6 +285,8 @@ public class TsfCartService {
 				} else {
 					cart.setCartGb(TscConstants.CartGb.MOB_ORDER.value());
 				}
+			} else if (!StringUtils.isEmpty(cartInfos.iterator().next().getCartGb()) && "G".equals(cartInfos.iterator().next().getCartGb())) {
+				cart.setCartGb(TscConstants.CartGb.GIFT.value());
 			} else {
 				cart.setCartGb(TscConstants.CartGb.CREATE_ORDER.value());
 			}
@@ -336,6 +354,8 @@ public class TsfCartService {
 			} else {
 				cart.setCartGb(TscConstants.CartGb.MOB_ORDER.value());
 			}
+		} else if (!StringUtils.isEmpty(params.iterator().next().getCartGb()) && "G".equals(params.iterator().next().getCartGb())) {
+			cart.setCartGb(TscConstants.CartGb.GIFT.value());
 		} else {
 			cart.setCartGb(TscConstants.CartGb.CREATE_ORDER.value());
 		}
@@ -759,8 +779,6 @@ public class TsfCartService {
 
 				// 배송 상품 존재 여부
 				lastCompCheck.setDelvYn(delvYn);
-
-				log.info("CHECK CART_SQ ::: {} / {} / {}", lastCompCheck.getCartSq(), lastCompCheck.getDelvYn(), lastCompCheck.getAddDelvFeeYn());
 			}
 		}
 
@@ -1042,7 +1060,6 @@ public class TsfCartService {
 			// 장바구니 보유 CART_SQ 쿼리
 			for(int i = 0 ; i < param.getCartDtlSqArr().length ; i++) {
 				sb.append("SELECT CD.CART_SQ \n FROM TB_CART C \n INNER JOIN TB_CART_DETAIL CD \n ON C.CART_SQ = CD.CART_SQ \n WHERE C.CUST_NO = ");
-				// TODO 로그인 정보 확인
 				if (param.getCustNo() == 0) {
 					sb.append(param.getCustNo()).append("\n AND JSESSION_ID = '").append(param.getJsessionId()).append("'");
 				} else {

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

@@ -278,10 +278,9 @@ public class TsfDisplayService {
 		Cate4Srch cate = new Cate4Srch();
 		cate.setSiteCd(TscConstants.Site.STYLE24.value()); // 사이트코드
 
-		// 카테고리구분
 		if (defaultCateYn.equals("Y")) { // 기본카테고리이면
 			cate.setCateGb(TsfConstants.CateGb.BYITEM.value());
-		} else {
+		} else { // 별도카테고리이면
 			cate.setCateGb(TsfConstants.CateGb.BYBRAND.value());
 		}
 
@@ -379,6 +378,47 @@ public class TsfDisplayService {
 		return contentsList;
 	}
 
+	/**
+	 * BEST ITEM 카테고리 목록
+	 * @param
+	 * @return
+	 * @author bin2107
+	 * @date 2021. 4. 13
+	 */
+	public Collection<Contents> getBestItemCategoryList(Contents contents) {
+		return displayDao.getBestItemCategoryList(contents);
+	}
+
+	/**
+	 * BEST ITEM 카테고리별 상품 리스트
+	 * @param
+	 * @return
+	 * @author bin2107
+	 * @date 2021. 4. 13
+	 */
+	public Collection<Goods> getBestItemCategoryGoodsList(Contents contents) {
+		Cate4Srch cate4Srch = new Cate4Srch();
+
+		cate4Srch.setContentsLoc(contents.getContentsLoc());
+		cate4Srch.setPageable(contents.getPageable());
+		cate4Srch.setPageNo(contents.getPageNo());
+		cate4Srch.setPageSize(contents.getPageSize());
+		cate4Srch.setPageUnit(contents.getPageUnit());
+		cate4Srch.setCustNo(TsfSession.isLogin() ? TsfSession.getInfo().getCustNo() : 0);
+		cate4Srch.setCate1No(contents.getCateNo());
+		cate4Srch.setSiteCd(TscConstants.Site.STYLE24.value());
+		cate4Srch.setCateGb("G032_101");
+
+		Collection<Goods> goodsList = goodsDao.getContentsCategoryGoodsList(cate4Srch);
+
+		if(goodsList.size() < 100){
+			// TODO 추천솔루션
+		}
+
+		return goodsList;
+	}
+
+
 	/**
 	 * 상품카테고리 필터 목록
 	 * @param
@@ -432,7 +472,7 @@ public class TsfDisplayService {
 	 * @author bin2107
 	 * @since 2021. 4. 12
 	 */
-	public Collection<BrandGroup> getAllBrandList(BrandGroup brandGroup){
+	public Collection<BrandGroup> getAllBrandList(BrandGroup brandGroup) {
 		return displayDao.getAllBrandList(brandGroup);
 	}
 

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

@@ -329,7 +329,6 @@ public class TsfOrderChangeService {
 	public GagaMap getCreCancelDetailInfo(OrderChange orderChange) {
 		GagaMap map = new GagaMap();
 		Collection<OrderChange> result = new ArrayList<>();
-		List<Integer> ordDtlNoList = new ArrayList<>();
 
 		for (OrderChange tmpOrderChange : orderChangeDao.getCreCancelDetailInfo(orderChange)) {
 			// 세트상품 옵션별 배열로 담기
@@ -346,12 +345,13 @@ public class TsfOrderChangeService {
 				tmpOrderChange.setOptCd2Arr(arr4);
 			}
 
-			ordDtlNoList.add(tmpOrderChange.getOrdDtlNo());
 			result.add(tmpOrderChange);
 		}
 
-		OrderChange oneData = result.iterator().next();
-		oneData.setOrdDtlNoArr(ordDtlNoList.stream().mapToInt(Integer::intValue).toArray());
+		OrderChange oneData = new OrderChange();
+		if (result.size() > 0) {
+			oneData = result.iterator().next();
+		}
 
 		map.set("oneData", oneData);
 		map.set("cancelDetailList", result);
@@ -359,4 +359,123 @@ public class TsfOrderChangeService {
 		return map;
 	}
 
+	/**
+	 * 마이페이지 반품 상세 정보 조회
+	 *
+	 * @param OrderChange
+	 * @return Collection<OrderChange>
+	 * @author card007
+	 * @since 2021. 04. 13
+	 */
+	public GagaMap getCreReturnDetailInfo(OrderChange orderChange) {
+		GagaMap map = new GagaMap();
+		Collection<OrderChange> result = new ArrayList<>();
+
+		for (OrderChange tmpOrderChange : orderChangeDao.getCreReturnDetailInfo(orderChange)) {
+			// 세트상품 옵션별 배열로 담기
+			if (tmpOrderChange.getItemNm().contains("!@!")) {
+				tmpOrderChange.setItemNmArr(tmpOrderChange.getItemNm().split("!@!"));
+				tmpOrderChange.setColorNmArr(tmpOrderChange.getColorNm().split(","));
+				tmpOrderChange.setOptCd1Arr(tmpOrderChange.getOptCd1().split(","));
+				tmpOrderChange.setOptCd2Arr(tmpOrderChange.getOptCd2().split(","));
+			} else {
+				String[] arr = {tmpOrderChange.getItemNm()}, arr2 = {tmpOrderChange.getColorNm()}, arr3 = {tmpOrderChange.getOptCd1()}, arr4 = {tmpOrderChange.getOptCd2()};
+				tmpOrderChange.setItemNmArr(arr);
+				tmpOrderChange.setColorNmArr(arr2);
+				tmpOrderChange.setOptCd1Arr(arr3);
+				tmpOrderChange.setOptCd2Arr(arr4);
+			}
+
+			result.add(tmpOrderChange);
+		}
+
+		OrderChange oneData = new OrderChange();
+		if (result.size() > 0) {
+			oneData = result.iterator().next();
+		}
+
+		map.set("oneData", oneData);
+		map.set("returnDetailList", result);
+
+		return map;
+	}
+
+	/**
+	 * 마이페이지 교환 상세 정보 조회
+	 *
+	 * @param OrderChange
+	 * @return Collection<OrderChange>
+	 * @author card007
+	 * @since 2021. 04. 13
+	 */
+	public GagaMap getCreExchangeDetailInfo(OrderChange orderChange) {
+		GagaMap map = new GagaMap();
+		Collection<OrderChange> result = new ArrayList<>();
+
+		for (OrderChange tmpOrderChange : orderChangeDao.getCreExchangeDetailInfo(orderChange)) {
+			// 세트상품 옵션별 배열로 담기
+			if (tmpOrderChange.getItemNm().contains("!@!")) {
+				tmpOrderChange.setItemNmArr(tmpOrderChange.getItemNm().split("!@!"));
+				tmpOrderChange.setColorNmArr(tmpOrderChange.getColorNm().split(","));
+				tmpOrderChange.setOptCd1Arr(tmpOrderChange.getOptCd1().split(","));
+				tmpOrderChange.setOptCd2Arr(tmpOrderChange.getOptCd2().split(","));
+			} else {
+				String[] arr = {tmpOrderChange.getItemNm()}, arr2 = {tmpOrderChange.getColorNm()}, arr3 = {tmpOrderChange.getOptCd1()}, arr4 = {tmpOrderChange.getOptCd2()};
+				tmpOrderChange.setItemNmArr(arr);
+				tmpOrderChange.setColorNmArr(arr2);
+				tmpOrderChange.setOptCd1Arr(arr3);
+				tmpOrderChange.setOptCd2Arr(arr4);
+			}
+
+			// 교환상품 옵션 정보 조회 및 설정
+			OrderChange changeOptionInfo = orderChangeDao.getExchangeGoodsOptionInfoList(tmpOrderChange);
+			if (changeOptionInfo.getItemNm().contains("!@!")) {
+				tmpOrderChange.setChgItemNmArr(changeOptionInfo.getItemNm().split("!@!"));
+				tmpOrderChange.setChgColorNmArr(changeOptionInfo.getColorNm().split(","));
+				tmpOrderChange.setChgOptCd1Arr(changeOptionInfo.getOptCd1().split(","));
+				tmpOrderChange.setChgOptCd2Arr(changeOptionInfo.getOptCd2().split(","));
+			} else {
+				tmpOrderChange.setChgItemNm(changeOptionInfo.getItemNm());
+				tmpOrderChange.setChgColorNm(changeOptionInfo.getColorNm());
+				tmpOrderChange.setChgOptCd1(changeOptionInfo.getOptCd1());
+				tmpOrderChange.setChgOptCd2(changeOptionInfo.getOptCd2());
+			}
+
+			result.add(tmpOrderChange);
+		}
+
+		OrderChange oneData = new OrderChange();
+		if (result.size() > 0) {
+			oneData = result.iterator().next();
+		}
+
+		map.set("oneData", oneData);
+		map.set("exchangeDetailList", result);
+
+		return map;
+	}
+
+	/**
+	 * 마이페이지 회수지 수정
+	 *
+	 * @param OrderChange
+	 * @return int
+	 * @author card007
+	 * @since 2021. 04. 13
+	 */
+	public int updateChgerAddr(OrderChange orderChange) {
+		return orderChangeDao.updateChgerAddr(orderChange);
+	}
+
+	/**
+	 * 마이페이지 반품메모 수정
+	 *
+	 * @param OrderChange
+	 * @return int
+	 * @author card007
+	 * @since 2021. 04. 13
+	 */
+	public int updateChgerRtnMemo(OrderChange orderChange) {
+		return orderChangeDao.updateChgerRtnMemo(orderChange);
+	}
 }

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

@@ -20,6 +20,7 @@ import com.style24.core.biz.service.TscNaverPayService;
 import com.style24.core.support.env.TscConstants;
 import com.style24.front.biz.dao.TsfOrderDao;
 import com.style24.front.support.security.session.TsfSession;
+import com.style24.persistence.domain.Cart;
 import com.style24.persistence.domain.Coupon;
 import com.style24.persistence.domain.GoodsStock;
 import com.style24.persistence.domain.KakaoPay;
@@ -56,6 +57,9 @@ public class TsfOrderService {
 	
 	@Autowired
 	private TsfGoodsService goodsService;
+	
+	@Autowired
+	private TsfCartService cartService;
 
 	/**
 	 * 마이페이지 주문 정보 조회
@@ -454,51 +458,71 @@ public class TsfOrderService {
 	 * @author jsh77b
 	 * @since 2021. 03. 09
 	 */
-	public void orderValidationCheck(Order order) {
+	public String orderValidationCheck(Order order) {
 		// 1. 주문상세체크
 		Collection<Order> orderDetailList = order.getOrderDetailList();
 		
-		String goodsCd		= "";
-		String goodsType	= "";
-		String itemCd 		= "";
-		String optCd 		= "";
-		int goodsQty		= 0;
 		int custCpnSq		= 0;
 		int usPntAmt		= 0;
 		int usGfcdAmt		= 0;
 		
+		String resultStr	= "SUCCESS";
+		
 		for (Order orderDetail : orderDetailList) {
 			
-			// 2.1 상품 재고 확인
-			GoodsStock checkParam = new GoodsStock();
+			// TODO
+			// 2.1 상품 재고 확인 (상품정보유효성체크)
+			Collection<Cart> params = new ArrayList<Cart>();
+			Cart cart = new Cart();
+			cart.setGoodsCd(orderDetail.getGoodsCd());
+			cart.setGoodsType(orderDetail.getGoodsType());
+			cart.setGoodsQty(orderDetail.getGoodsQty());
+			cart.setCheckGb("O");
 			
-			for (int i=0 ; i<orderDetail.getItemCdArr().length ; i++) {
-				goodsCd 	= orderDetail.getGoodsCd();
-				goodsType	= orderDetail.getGoodsType();
-				itemCd 		= orderDetail.getItemCdArr()[i];
-				optCd 		= orderDetail.getOptCdArr()[i];
-				goodsQty	= orderDetail.getGoodsQty();
-								
-				checkParam.setGoodsCd(goodsCd);
-				checkParam.setItemCd(itemCd);
-				checkParam.setOptCd(optCd); 
-				checkParam.setGoodsQty(goodsQty);
-				checkParam.setGoodsType(goodsType);
+			// 세트상품
+			if ("G056_S".equals(orderDetail.getGoodsType())) {
+				
+				Collection<Cart> cartCompsList = new ArrayList<Cart>();
 				
-				// TODO 2021.03.29 재고체크 
-				//String stockResult = goodsService.getCheckStock(checkParam);
-				//if (!"SUCCESS".equals(stockResult)) {
-					//throw new IllegalArgumentException(stockResult);
-				//}
+				// 세트상품일때 구성상품정보 추가 
+				for (int i=0 ; i<orderDetail.getItemCdArr().length ; i++) {
+					Cart itemCart = new Cart();
+					itemCart.setGoodsCd(orderDetail.getGoodsCd());
+					itemCart.setGoodsType(orderDetail.getGoodsType());
+					itemCart.setItemCd(orderDetail.getItemCdArr()[i]);
+					itemCart.setOptCd(orderDetail.getOptCdArr()[i]);
+					itemCart.setGoodsQty(orderDetail.getGoodsQty());
+					itemCart.setCartGb("O");
+					cartCompsList.add(itemCart);
+				}
+				// 구성상품정보추가
+				cart.setCartCompsList(cartCompsList);
+			}
+			else {
+				cart.setItemCd(orderDetail.getItemCdArr()[0]);
+				cart.setOptCd(orderDetail.getOptCdArr()[0]);
+				cart.setGoodsQty(orderDetail.getGoodsQty());
+				cart.setCartGb("O");
 			}
+						
+			// 유효성체크 목록 담기 1개 기준 체크
+			params.add(cart);
 			
+			GagaMap resultMap = cartService.saveCartInfo(params);
+			
+			if (!"SUCCESS".equals(resultMap.get("message").toString())) {
+				resultStr = resultMap.get("message").toString();
+				return resultStr;
+			}
+
 			// 2.2 보유 상품쿠폰체크
 			custCpnSq = orderDetail.getGoodsCpnSq();
 			if (custCpnSq > 0) {
 				orderDetail.setCustCpnSq(custCpnSq);
 				orderDetail.setCustNo(order.getCustNo());
 				if (orderDao.getCheckCustCpnSq(orderDetail) < 1) {
-					throw new IllegalArgumentException("보유하신 상품쿠폰이 존재하지 않습니다.");
+					resultStr = "보유하신 상품쿠폰이 존재하지 않습니다.";
+					return resultStr;
 				}
 			}
 			
@@ -508,7 +532,8 @@ public class TsfOrderService {
 				orderDetail.setCustCpnSq(custCpnSq);
 				orderDetail.setCustNo(order.getCustNo());
 				if (orderDao.getCheckCustCpnSq(orderDetail) < 1) {
-					throw new IllegalArgumentException("보유하신 장바구니쿠폰이 존재하지 않습니다.");
+					resultStr = "보유하신 장바구니쿠폰이 존재하지 않습니다.";
+					return resultStr;
 				}
 			}
 			
@@ -535,13 +560,15 @@ public class TsfOrderService {
 		// 3. 보유포인트금액 > 포인트사용금액 체크
 		int rmPntAmt = coreOrderDao.getCustPointInfo(order);
 		if (rmPntAmt < usPntAmt) {
-			throw new IllegalArgumentException("보유하신 포인트 금액이 부족합니다.");
+			resultStr = "보유하신 포인트 금액이 부족합니다.";
+			return resultStr;
 		}
 		
 		// 4. 보유상품권금액 > 상품권사용금액 체크
 		int rmGfcdAmt = coreOrderDao.getGiftcardInfo(order);
 		if (rmGfcdAmt < usGfcdAmt) {
-			throw new IllegalArgumentException("보유하신 상품권 금액이 부족합니다.");
+			resultStr = "보유하신 상품권 금액이 부족합니다.";
+			return resultStr;
 		}
 		
 		// 5. 장바구니 보유쿠폰 체크 (배송목록체크)
@@ -553,36 +580,22 @@ public class TsfOrderService {
 					delvFeeCd.setCustCpnSq(custCpnSq);
 					delvFeeCd.setCustNo(order.getCustNo());
 					if (orderDao.getCheckCustCpnSq(delvFeeCd) < 1) {
-						throw new IllegalArgumentException("보유하신 배송비쿠폰이 존재하지 않습니다.");
+						resultStr = "보유하신 배송비쿠폰이 존재하지 않습니다.";
+						return resultStr;
 					}
 				}
 			}
 		}
 		
-
 		// TODO 5. 사은품채고체크
+		int rtnCnt = orderDao.getCheckFreegiftVal(order);
+		if (rtnCnt > 0) {
+			resultStr = "선택하신 사은품의 재고가 부족 합니다.";
+			return resultStr;
+		}
+		
+		return resultStr;
 		
 	}
 	
-	// public ModelAndView getOrderList(Order order) {
-	// 	ModelAndView mav = new ModelAndView();
-	// 	// 페이징 처리 및 주문정보 조회
-	// 	List<Integer> ordNoList = new ArrayList<>();
-	//
-	// 	for (Order tmpOrder : this.getPagingOrdNoList(order)) {
-	// 		ordNoList.add(tmpOrder.getOrdNo());
-	// 	}
-	//
-	// 	if (ordNoList.size() > 0) {
-	// 		order.setOrdNoList(ordNoList.stream().mapToInt(Integer::intValue).toArray());
-	// 	}
-	//
-	// 	mav.addObject("orderList", this.getOrderListForMypage(order));
-	// 	mav.addObject("orderInfo", order);
-	//
-	// 	mav.setViewName(super.getDeviceViewName("mypage/MypageOrderList"));
-	// }
-	
-	
-	
 }

+ 57 - 3
src/main/java/com/style24/front/biz/service/TsfPlanningService.java

@@ -1,14 +1,18 @@
 package com.style24.front.biz.service;
 
+import java.io.File;
 import java.util.Collection;
 import java.util.Iterator;
 import java.util.Map;
 
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.env.Environment;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import com.gagaframework.web.util.GagaDateUtil;
+import com.gagaframework.web.util.GagaFileUtil;
 import com.style24.front.biz.dao.TsfCommonDao;
 import com.style24.front.biz.dao.TsfPlanningDao;
 import com.style24.front.support.security.session.TsfSession;
@@ -38,6 +42,9 @@ public class TsfPlanningService {
 
 	@Autowired
 	private TsfCommonDao commonDao;
+	
+	@Autowired
+	private Environment env;
 
 	/**
 	 * 기획전 카테고리 목록
@@ -524,7 +531,7 @@ public class TsfPlanningService {
 
 
 	/**
-	 * 기획전/이벤트 댓글 저장
+	 * 기획전/이벤트 댓글,이미지 저장
 	 *
 	 * @param Plan
 	 * @return 
@@ -532,8 +539,42 @@ public class TsfPlanningService {
 	 * @date 2021. 4. 13
 	 */
 	public void saveEntryReply(Plan plan) {
-		plan.setCustNo(TsfSession.getInfo().getCustNo());
+		int custNo = TsfSession.getInfo().getCustNo();
+		plan.setCustNo(custNo);
 		planningDao.saveEntryReply(plan);
+		
+		//이미지등록
+		Plan filePlan = new Plan();
+		if(!StringUtils.isAllEmpty(plan.getMultiReplyOrgFile())) {
+			filePlan.setRegNo(custNo);
+			filePlan.setPlanEntrySq(plan.getPlanEntrySq());
+			//파일아이템 등록
+			String[] fileItemVal1 = plan.getMultiReplyOrgFile();
+			int ind = 1;
+			for (int j = 0; j < fileItemVal1.length; j++) {
+				String imgInd = String.valueOf(ind);
+				if (ind < 10) {
+					imgInd = "0" + imgInd;
+				}
+				String planUploadPath = env.getProperty("upload.default.target.path");
+				String yearMonth = GagaDateUtil.getToday().substring(0, 6);
+				planUploadPath = GagaFileUtil.getConcatenationPath(planUploadPath, "/reply");
+				File newFile = new File(GagaFileUtil.getConcatenationPath(planUploadPath, fileItemVal1[j]));
+				planUploadPath = GagaFileUtil.getConcatenationPath(planUploadPath, yearMonth);
+				String newFilename = "REPLY_" + GagaDateUtil.getTodayDateTime() + "_" + imgInd + "." + org.springframework.util.StringUtils.getFilenameExtension(fileItemVal1[j]);
+				File uniqueFile = GagaFileUtil.getUniqueFile(new File(GagaFileUtil.getConcatenationPath(planUploadPath, newFilename)));
+				// Rename a file
+				File path = new File(planUploadPath);
+				if (!path.exists()) {
+					path.mkdir();
+				}
+				newFile.renameTo(uniqueFile);
+				filePlan.setOrgFileNm("/reply/" + yearMonth + "/" + newFilename);
+				filePlan.setSysFileNm("/reply/" + yearMonth + "/" + newFilename);
+				planningDao.saveEntryReplyAttach(filePlan);
+				ind++;
+			}
+		}
 	}
 	
 	/**
@@ -549,7 +590,7 @@ public class TsfPlanningService {
 	}
 	
 	/**
-	 * 기획전/이벤트 댓글 삭제
+	 * 기획전/이벤트 댓글, 이미지 삭제
 	 *
 	 * @param Plan
 	 * @return 
@@ -558,5 +599,18 @@ public class TsfPlanningService {
 	 */
 	public void deleteEntryReply(Plan plan) {
 		planningDao.deleteEntryReply(plan);
+		planningDao.deleteEntryReplyAttach(plan);
+	}
+	
+	/**
+	 * 기획전/이벤트 댓글 이미지 리스트
+	 *
+	 * @param Plan
+	 * @return Collection<Plan>
+	 * @author sowon
+	 * @date 2021. 4. 8
+	 */
+	public Collection<Plan> getEntryReplyAttachList(Plan plan){
+		return planningDao.getEntryReplyAttachList(plan);
 	}
 }

+ 47 - 0
src/main/java/com/style24/front/biz/service/TsfReinboundService.java

@@ -0,0 +1,47 @@
+package com.style24.front.biz.service;
+
+import java.util.Collection;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import com.style24.front.biz.dao.TsfReinboundDao;
+import com.style24.persistence.domain.ReinboundInform;
+
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * 재입고알림 Service
+ *
+ * @author gagamel
+ * @since 2021. 4. 13
+ */
+@Service
+@Slf4j
+public class TsfReinboundService {
+
+	@Autowired
+	private TsfReinboundDao reinboundDao;
+
+	/**
+	 * 재입고알림 목록
+	 * @param custNo - 고객번호
+	 * @return
+	 * @author gagamel
+	 * @date 2021. 4. 13
+	 */
+	public Collection<ReinboundInform> getReinboundInformList(Integer custNo) {
+		return reinboundDao.getReinboundInformList(custNo);
+	}
+
+	/**
+	 * 재입고알림 연장 처리
+	 * @param params - 재입고알림 정보
+	 * @author gagamel
+	 * @date 2021. 4. 13
+	 */
+	public void updateReinboundInformContinue(ReinboundInform params) {
+		reinboundDao.updateReinboundInformContinue(params);
+	}
+
+}

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

@@ -34,6 +34,7 @@ import com.style24.front.support.security.session.TsfSession;
 import com.style24.persistence.domain.Cart;
 import com.style24.persistence.domain.Coupon;
 import com.style24.persistence.domain.Goods;
+import com.style24.persistence.domain.Login;
 import com.style24.persistence.domain.Order;
 import com.style24.persistence.domain.Payment;
 import com.style24.persistence.domain.WishList;
@@ -150,6 +151,24 @@ public class TsfCartController extends TsfBaseController {
 		return super.getDeviceViewName("cart/CartListAjaxForm");
 	}
 
+	/**
+	 * 장바구니 로그인 정보 조회
+	 * @param param
+	 * @return
+	 */
+	@ResponseBody
+	@PostMapping("/login/info")
+	public Login selectLoginInfo(Order param) {
+		Login result = new Login();
+		if(TsfSession.isLogin()) {
+			result = TsfSession.getInfo();
+		} else {
+			result.setCustNo(0);
+		}
+
+		return result;
+	}
+
 	/**
 	 * 장바구니 체크박스 change시에 계산로직 진행
 	 * @param param

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

@@ -138,12 +138,15 @@ public class TsfCustomerController extends TsfBaseController {
 	 * @author jsshin
 	 * @since 2021. 02. 05
 	 */
-	@GetMapping("/password/find/form")
-	public ModelAndView pwdFindForm() {
+	@RequestMapping("/password/find/form")
+	public ModelAndView pwdFindForm(@RequestParam(value = "sEncData", required = false) String sEncData
+			, @RequestParam(value = "authMethod", required = false) String authMethod) {
+
 		ModelAndView mav = new ModelAndView();
+		mav.addObject("sEncData", sEncData);
+		mav.addObject("authMethod", authMethod);
 
 		mav.setViewName(super.getDeviceViewName("customer/PasswordFindForm"));
-
 		return mav;
 	}
 

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

@@ -146,6 +146,7 @@ public class TsfDisplayController extends TsfBaseController {
 			}
 
 			if (contentsLoc.equals("SMM004")) {
+				contents.setPageGb("MALL");
 				mainLayout.setBestItemList(displayService.getBestItemForGoods(contents));
 			}
 
@@ -617,4 +618,50 @@ public class TsfDisplayController extends TsfBaseController {
 		return displayService.getBrandCategoryList(brandGroupNo);
 	}
 
+	/**
+	 * 베스트 메인
+	 * @param
+	 * @return
+	 * @author bin2107
+	 * @since 2021. 4. 13
+	 */
+	@GetMapping("/best/main/form")
+	public ModelAndView bestMain(Contents contents) {
+		ModelAndView mav = new ModelAndView(super.getDeviceViewName("display/BestMainForm"));
+
+		contents.setContentsLoc("SCM003");
+		mav.addObject("bestCateList", displayService.getBestItemCategoryList(contents));
+
+		return mav;
+	}
+
+	/**
+	 * 베스트 메인 상품 리스트 조회
+	 * @param
+	 * @return
+	 * @author bin2107
+	 * @since 2021. 4. 13
+	 */
+	@PostMapping("/best/main/goods/list")
+	@ResponseBody
+	public GagaMap getBestMainGoodsList(@RequestBody Contents contents) {
+		GagaMap result = new GagaMap();
+		TscPageRequest pageable = new TscPageRequest((contents.getPageNo() > 0 ? contents.getPageNo() - 1 : 0), contents.getPageSize(), contents.getPageUnit());
+
+		contents.setContentsLoc("SCM003");
+		contents.setPageGb("BEST");
+		MainLayout mainLayout = new MainLayout();
+		mainLayout.setGoodsList(displayService.getBestItemCategoryGoodsList(contents));
+
+		int totalCnt = mainLayout.getGoodsList().size();
+		pageable.setTotalCount(totalCnt);
+		contents.setPageable(pageable);
+
+		result.set("paging", contents);
+		result.set("totalCnt", totalCnt);
+		result.set("endRow", pageable.getEndRow());
+		result.set("dataList", displayService.getBestItemCategoryGoodsList(contents));
+		return result;
+	}
+
 }

+ 272 - 82
src/main/java/com/style24/front/biz/web/TsfMypageController.java

@@ -17,9 +17,6 @@ import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.ResponseBody;
 import org.springframework.web.servlet.ModelAndView;
 
-import com.gagaframework.web.parameter.GagaMap;
-import com.gagaframework.web.rest.server.GagaResponse;
-import com.gagaframework.web.rest.server.GagaResponseStatus;
 import com.style24.core.biz.service.TscCouponService;
 import com.style24.core.biz.service.TscCustomerService;
 import com.style24.core.biz.service.TscKakaoPayService;
@@ -37,6 +34,7 @@ import com.style24.front.biz.service.TsfGiftcardService;
 import com.style24.front.biz.service.TsfOrderChangeService;
 import com.style24.front.biz.service.TsfOrderService;
 import com.style24.front.biz.service.TsfPointService;
+import com.style24.front.biz.service.TsfReinboundService;
 import com.style24.front.biz.service.TsfRendererService;
 import com.style24.front.biz.service.TsfReviewService;
 import com.style24.front.biz.service.TsfWishlistService;
@@ -54,11 +52,16 @@ import com.style24.persistence.domain.Goods;
 import com.style24.persistence.domain.Order;
 import com.style24.persistence.domain.OrderChange;
 import com.style24.persistence.domain.Point;
+import com.style24.persistence.domain.ReinboundInform;
 import com.style24.persistence.domain.Review;
 import com.style24.persistence.domain.WishList;
 
 import lombok.extern.slf4j.Slf4j;
 
+import com.gagaframework.web.parameter.GagaMap;
+import com.gagaframework.web.rest.server.GagaResponse;
+import com.gagaframework.web.rest.server.GagaResponseStatus;
+
 /**
  * 마이페이지 Controller
  * 
@@ -120,7 +123,7 @@ public class TsfMypageController extends TsfBaseController {
 
 	@Autowired
 	private TscCouponService coreCouponService;
-	
+
 	@Autowired
 	private TsfCartService cartService;
 
@@ -130,6 +133,9 @@ public class TsfMypageController extends TsfBaseController {
 	@Autowired
 	private TscKcpService kcpService;
 
+	@Autowired
+	private TsfReinboundService reinboundService;
+
 	/**
 	 * 마이페이지 메인 화면
 	 *
@@ -372,7 +378,7 @@ public class TsfMypageController extends TsfBaseController {
 
 		// 교환 가능 리스트 조회
 		GagaMap map = orderChangeService.getReturnListForMypage(order);
-		Order oneData = (Order) map.get("oneData");
+		Order oneData = (Order)map.get("oneData");
 		mav.addObject("exchangeList", map);
 		mav.addObject("oneData", oneData);
 
@@ -573,7 +579,7 @@ public class TsfMypageController extends TsfBaseController {
 
 		// 반품 가능 리스트 조회
 		GagaMap map = orderChangeService.getReturnListForMypage(order);
-		Order oneData = (Order) map.get("oneData");
+		Order oneData = (Order)map.get("oneData");
 		mav.addObject("returnList", map);
 		mav.addObject("oneData", oneData);
 
@@ -609,7 +615,7 @@ public class TsfMypageController extends TsfBaseController {
 	@PostMapping("/return")
 	@ResponseBody
 	public GagaMap rtnReq(@RequestBody OrderChange orderChange) {
-		if (orderChange== null) {
+		if (orderChange == null) {
 			throw new IllegalStateException(message.getMessage("FAIL_1001"));
 		}
 
@@ -623,36 +629,36 @@ public class TsfMypageController extends TsfBaseController {
 
 		// 2. 환불 사전 정보 조회
 		GagaMap refundPreInfo = orderChangeService.getRefundPreInfo(orderChange);
-		List<Order> returnReqList = (List<Order>) refundPreInfo.get("cnclReqList");
+		List<Order> returnReqList = (List<Order>)refundPreInfo.get("cnclReqList");
 		String allCanYn = refundPreInfo.getString("allCanYn");
 
 		// 2. 환불금액계산
 		GagaMap result = coreOrderRefundService.cnclRtnRefundAmt(returnReqList);
 
 		// 3. 주문변경 기본정보 설정
-		result.set("ordNo"			, orderChange.getOrdNo());				// 주문번호
-		result.set("ordChgSq"		, orderChange.getOrdChgSq());			// 주문변경번호
-		result.set("chgReason"		, orderChange.getChgReason());			// 변경사유
-		result.set("chgMemo"		, orderChange.getChgMemo());			// 변경메모
+		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("accountNo", orderChange.getAccountNo());			// 환불계좌번호
+		result.set("accountNm", orderChange.getAccountNm());			// 환불계좌예금주명
+		result.set("bankCd", orderChange.getBankCd());				// 환불계좌은행코드
 
-		result.set("allCanYn"		, allCanYn);							// 무통장입금전 전체취소 여부 
-		result.set("isCustomer"		, orderChange.getIsCustomer());			// 변경사유 (고객, 회사)
-		result.set("wdGb"			, orderChange.getWdGb());				// 회수방법
-		result.set("wdInvoiceNo"	, orderChange.getWdInvoiceNo());		// 회수송장번호
+		result.set("allCanYn", allCanYn);							// 무통장입금전 전체취소 여부 
+		result.set("isCustomer", orderChange.getIsCustomer());			// 변경사유 (고객, 회사)
+		result.set("wdGb", orderChange.getWdGb());				// 회수방법
+		result.set("wdInvoiceNo", orderChange.getWdInvoiceNo());		// 회수송장번호
 
 		// 4. 주문변경 회수지정보 추가
-		result.set("chgerNm"		, orderChange.getChgerNm());			// 변경자명
-		result.set("chgerEmail"		, orderChange.getChgerEmail());			// 변경자이메일주소
-		result.set("chgerZipcode"	, orderChange.getChgerZipcode());		// 회수지우편번호
-		result.set("chgerBaseAddr"	, orderChange.getChgerBaseAddr());		// 회수지기본주소
-		result.set("chgerDtlAddr"	, orderChange.getChgerDtlAddr());		// 회수지상세주소
-		result.set("chgerPhnno"		, orderChange.getChgerPhnno());			// 변경자핸드폰번호
-		result.set("chgerTelno"		, orderChange.getChgerTelno());			// 변경자전화번호
-		result.set("chgerRtnMemo"	, orderChange.getChgerRtnMemo());		// 반품메모
+		result.set("chgerNm", orderChange.getChgerNm());			// 변경자명
+		result.set("chgerEmail", orderChange.getChgerEmail());			// 변경자이메일주소
+		result.set("chgerZipcode", orderChange.getChgerZipcode());		// 회수지우편번호
+		result.set("chgerBaseAddr", orderChange.getChgerBaseAddr());		// 회수지기본주소
+		result.set("chgerDtlAddr", orderChange.getChgerDtlAddr());		// 회수지상세주소
+		result.set("chgerPhnno", orderChange.getChgerPhnno());			// 변경자핸드폰번호
+		result.set("chgerTelno", orderChange.getChgerTelno());			// 변경자전화번호
+		result.set("chgerRtnMemo", orderChange.getChgerRtnMemo());		// 반품메모
 
 		// 5. 주문변경 DB 등록 (TB_ORDER_CHANGE, TB_ORDER_CHANGE_DETAIL, TB_REFUND)
 		coreOrderChangeService.rtnReq(result, custNo);
@@ -682,7 +688,7 @@ public class TsfMypageController extends TsfBaseController {
 
 		// 취소 가능 리스트 조회
 		GagaMap map = orderChangeService.getCancelListForMypage(order);
-		Order oneData = (Order) map.get("oneData");
+		Order oneData = (Order)map.get("oneData");
 		mav.addObject("cancelList", map);
 		mav.addObject("oneData", oneData);
 
@@ -727,37 +733,35 @@ public class TsfMypageController extends TsfBaseController {
 
 		// 2. 환불 사전 정보 조회
 		GagaMap refundPreInfo = orderChangeService.getRefundPreInfo(orderChange);
-		List<Order> cnclReqList = (List<Order>) refundPreInfo.get("cnclReqList");
+		List<Order> cnclReqList = (List<Order>)refundPreInfo.get("cnclReqList");
 		String allCanYn = refundPreInfo.getString("allCanYn");
-		
 
 		// 2. 환불금액계산
 		// 2021.01.19 취소신청정보를 목록 (주문상세번호, 취소/반품수량) 으로 표현
 		GagaMap result = coreOrderRefundService.cnclRtnRefundAmt(cnclReqList);
 
 		// 무통장입금전 전체취소 여부
-		
 
 		// 3. 주문변경 기본정보 설정
-		result.set("ordNo"			, orderChange.getOrdNo());				// 주문번호
-		result.set("ordChgSq"		, orderChange.getOrdChgSq());			// 주문변경번호
-		result.set("chgReason"		, orderChange.getChgReason());			// 변경사유
-		result.set("chgMemo"		, orderChange.getChgMemo());			// 변경메모
+		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("accountNo", orderChange.getAccountNo());			// 환불계좌번호
+		result.set("accountNm", orderChange.getAccountNm());			// 환불계좌예금주명
+		result.set("bankCd", orderChange.getBankCd());				// 환불계좌은행코드
 
-		result.set("allCanYn"		, allCanYn);							// 무통장입금전 전체취소 여부
-		result.set("isCustomer"		, orderChange.getIsCustomer());			// 변경사유 (고객, 회사)
+		result.set("allCanYn", allCanYn);							// 무통장입금전 전체취소 여부
+		result.set("isCustomer", orderChange.getIsCustomer());			// 변경사유 (고객, 회사)
 
 		// 4. 주문변경 회수지정보 추가
-		result.set("chgerNm"		, orderChange.getChgerNm());			// 변경자명
-		result.set("chgerEmail"		, orderChange.getChgerEmail());			// 변경자이메일주소
-		result.set("chgerPhnno"		, orderChange.getChgerPhnno());			// 변경자핸드폰번호
-		result.set("chgerTelno"		, orderChange.getChgerTelno());			// 변경자전화번호
+		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("reqGbn", orderChange.getReqGbn());				// 신청구분
 
 		// 5. 주문변경 DB 등록 (TB_ORDER_CHANGE, TB_ORDER_CHANGE_DETAIL)
 		coreOrderChangeService.cnclComplete(result, custNo);
@@ -801,7 +805,7 @@ public class TsfMypageController extends TsfBaseController {
 
 		// 계좌주명 설정
 		mav.addObject("accountNm", orderChange.getAccountNm());
-		
+
 		// 주문번호 설정
 		mav.addObject("ordNo", orderChange.getOrdNo());
 
@@ -889,7 +893,11 @@ public class TsfMypageController extends TsfBaseController {
 		mav.addObject("custNo", custNo);
 
 		// 취소상세 데이터 조회
-		mav.addObject("cancelDetailList", orderChangeService.getCreCancelDetailInfo(orderChange));
+		orderChange.setCustNo(custNo);
+		GagaMap map = orderChangeService.getCreCancelDetailInfo(orderChange);
+		OrderChange oneData = (OrderChange) map.get("oneData");
+		mav.addObject("cancelDetailList", map);
+		mav.addObject("oneData", oneData);
 
 		// 주문 결제정보 조회
 		Order order = new Order();
@@ -901,6 +909,71 @@ public class TsfMypageController extends TsfBaseController {
 		return mav;
 	}
 
+	/**
+	 * 마이페이지 취반교 반품 상세 화면
+	 *
+	 * @return ModelAndView
+	 * @author card007
+	 * @since 2021. 04. 13
+	 */
+	@PostMapping({"/cre/return/detail/form"})
+	public ModelAndView mypageCreReturnDetailForm(OrderChange orderChange) {
+		ModelAndView mav = new ModelAndView();
+
+		// 고객번호 설정
+		int custNo = TsfSession.getInfo().getCustNo();
+		mav.addObject("custNo", custNo);
+
+		// 로그인여부 설정
+		mav.addObject("isLogin", TsfSession.isLogin());
+
+		// 취소상세 데이터 조회
+		orderChange.setCustNo(custNo);
+		GagaMap map = orderChangeService.getCreReturnDetailInfo(orderChange);
+		OrderChange oneData = (OrderChange) map.get("oneData");
+		mav.addObject("returnDetailList", map);
+		mav.addObject("oneData", oneData);
+
+		// 주문 결제정보 조회
+		Order order = new Order();
+		order.setOrdNo(orderChange.getOrdNo());
+		mav.addObject("paymentInfo", orderService.getPaymentInfoForMypage(order));
+
+		mav.setViewName(super.getDeviceViewName("mypage/MypageCreReturnDetailForm"));
+
+		return mav;
+	}
+
+	/**
+	 * 마이페이지 취반교 교환 상세 화면
+	 *
+	 * @return ModelAndView
+	 * @author card007
+	 * @since 2021. 04. 13
+	 */
+	@PostMapping({"/cre/exchange/detail/form"})
+	public ModelAndView mypageCreExchangeDetailForm(OrderChange orderChange) {
+		ModelAndView mav = new ModelAndView();
+
+		// 고객번호 설정
+		int custNo = TsfSession.getInfo().getCustNo();
+		mav.addObject("custNo", custNo);
+
+		// 로그인여부 설정
+		mav.addObject("isLogin", TsfSession.isLogin());
+
+		// 취소상세 데이터 조회
+		orderChange.setCustNo(custNo);
+		GagaMap map = orderChangeService.getCreExchangeDetailInfo(orderChange);
+		OrderChange oneData = (OrderChange) map.get("oneData");
+		mav.addObject("exchangeDetailList", map);
+		mav.addObject("oneData", oneData);
+
+		mav.setViewName(super.getDeviceViewName("mypage/MypageCreExchangeDetailForm"));
+
+		return mav;
+	}
+
 	/**
 	 * 마이페이지 STYLE24 포인트화면
 	 *
@@ -981,8 +1054,8 @@ public class TsfMypageController extends TsfBaseController {
 
 		// 2. 환불 사전 정보 조회
 		GagaMap refundPreInfo = orderChangeService.getRefundPreInfo(orderChange);
-		List<Order> cnclReqList = (List<Order>) refundPreInfo.get("cnclReqList");
-		
+		List<Order> cnclReqList = (List<Order>)refundPreInfo.get("cnclReqList");
+
 		return coreOrderRefundService.cnclRtnRefundAmt(cnclReqList);
 	}
 
@@ -998,6 +1071,14 @@ public class TsfMypageController extends TsfBaseController {
 	@ResponseBody
 	public GagaMap changeDelveryAddr(@RequestBody Order order) {
 		GagaMap result = new GagaMap();
+		result.set("status", GagaResponseStatus.SUCCESS.getCode());
+		result.set("message", message.getMessage("DELV_0001"));
+
+		if (TsfSession.isLogin()) {
+			order.setCustNo(TsfSession.getInfo().getCustNo());
+		} else {
+			order.setCustNo(0);
+		}
 
 		try {
 			commonService.updateDeliverAddr(order);
@@ -1010,9 +1091,6 @@ public class TsfMypageController extends TsfBaseController {
 			result.set("message", message.getMessage("FAIL_0002"));
 		}
 
-		result.set("status", GagaResponseStatus.SUCCESS.getCode());
-		result.set("message", message.getMessage("DELV_0002"));
-
 		return result;
 	}
 
@@ -1028,6 +1106,8 @@ public class TsfMypageController extends TsfBaseController {
 	@ResponseBody
 	public GagaMap changeDelveryAddrDelvMemo(@RequestBody Order order) {
 		GagaMap result = new GagaMap();
+		result.set("status", GagaResponseStatus.SUCCESS.getCode());
+		result.set("message", message.getMessage("DELV_0002"));
 
 		if (TsfSession.isLogin()) {
 			order.setCustNo(TsfSession.getInfo().getCustNo());
@@ -1042,8 +1122,62 @@ public class TsfMypageController extends TsfBaseController {
 			result.set("message", message.getMessage("FAIL_0002"));
 		}
 
+		return result;
+	}
+
+	/**
+	 * 마이페이지 회수지 정보 수정
+	 *
+	 * @param Order
+	 * @return GagaMap
+	 * @author card007
+	 * @since 2021. 04. 13
+	 */
+	@PostMapping("/change/chger/addr")
+	@ResponseBody
+	public GagaMap changeChgerAddr(@RequestBody OrderChange orderChange) {
+		GagaMap result = new GagaMap();
 		result.set("status", GagaResponseStatus.SUCCESS.getCode());
-		result.set("message", message.getMessage("DELV_0002"));
+		result.set("message", message.getMessage("DELV_0003"));
+
+		try {
+			orderChange.setUpdNo(TsfSession.getInfo().getCustNo());
+			orderChangeService.updateChgerAddr(orderChange);
+
+			// TODO
+			// WMS IF TABLE 내 정보 업데이트 처리 필요
+		} catch (Exception e) {
+			result.set("status", GagaResponseStatus.FAIL.getCode());
+			result.set("message", message.getMessage("FAIL_0002"));
+		}
+
+		return result;
+	}
+
+	/**
+	 * 마이페이지 반품메모 수정
+	 *
+	 * @param Order
+	 * @return GagaMap
+	 * @author card007
+	 * @since 2021. 04. 13
+	 */
+	@PostMapping("/change/chger/rtn/memo")
+	@ResponseBody
+	public GagaMap changeChgerRtnMemo(@RequestBody OrderChange orderChange) {
+		GagaMap result = new GagaMap();
+		result.set("status", GagaResponseStatus.SUCCESS.getCode());
+		result.set("message", message.getMessage("DELV_0004"));
+
+		try {
+			orderChange.setUpdNo(TsfSession.getInfo().getCustNo());
+			orderChangeService.updateChgerRtnMemo(orderChange);
+
+			// TODO
+			// WMS IF TABLE 내 정보 업데이트 처리 필요
+		} catch (Exception e) {
+			throw new IllegalStateException(message.getMessage("FAIL_0002"));
+		}
 
 		return result;
 	}
@@ -1096,11 +1230,11 @@ public class TsfMypageController extends TsfBaseController {
 	 * @since 2021. 03. 12
 	 */
 	@GetMapping("/gift/card/form")
-	public ModelAndView mypageGiftcardForm(GiftCard giftcard,Device device) {
+	public ModelAndView mypageGiftcardForm(GiftCard giftcard, Device device) {
 		ModelAndView mav = new ModelAndView();
 		// 상품권 기본정보
 		mav.addObject("giftcardInfo", giftcardService.getGiftcardInfo(giftcard));
-		
+
 		// 최근 12개월 년,월
 		mav.addObject("date", giftcardService.getRecentlyDate());
 		mav.setViewName(super.getDeviceViewName("mypage/MypageGiftcardForm"));
@@ -1196,7 +1330,7 @@ public class TsfMypageController extends TsfBaseController {
 		mav.setViewName(super.getDeviceViewName("mypage/MypageCouponDetailForm"));
 		return mav;
 	}
-	
+
 	/**
 	 * 마이페이지 리뷰화면
 	 *
@@ -1207,26 +1341,26 @@ public class TsfMypageController extends TsfBaseController {
 	@GetMapping("/review/form")
 	public ModelAndView mypageReviewForm(Review review, Device device) {
 		ModelAndView mav = new ModelAndView();
-		
+
 		review.setCustNo(TsfSession.getInfo().getCustNo());
 		review.setSiteCd(TscConstants.Site.STYLE24.value());
 		// 작성가능한 리뷰 카운트
 		mav.addObject("completeReviewCount", reviewService.getCompleteReviewCount(review));
-		
+
 		// 작성한 리뷰 카운트
 		mav.addObject("alreadyReviewCount", reviewService.getAlreadyReviewCount(review));
-		
+
 		// 관리자 댓글확인 
 		mav.addObject("adminCount", reviewService.getAdminConfirmCount(review));
-		
+
 		// 리뷰 이미지/동영상
 		mav.addObject("alreadyReviewAttach", reviewService.getReviewAttach(review));
-		
+
 		mav.setViewName(super.getDeviceViewName("mypage/MypageReviewForm"));
 
 		return mav;
 	}
-	
+
 	/**
 	 * 마이페이지 작성가능한 리뷰 목록
 	 * @param review
@@ -1250,14 +1384,14 @@ public class TsfMypageController extends TsfBaseController {
 		review.setPageable(pageable);
 		log.info("pageable: {}", pageable);
 		log.info("totalCount {}", pageable.getTotalCount());
-		
+
 		result.set("paging", review);
 		result.set("completeReviewCount", reviewService.getCompleteReviewCount(review));
 		result.set("dataList1", reviewService.getCompleteReviewList(review));
 
 		return result;
 	}
-	
+
 	/**
 	 * 마이페이지 작성한 리뷰 목록
 	 * @param review
@@ -1278,21 +1412,18 @@ public class TsfMypageController extends TsfBaseController {
 
 		TscPageRequest pageable2 = new TscPageRequest((review.getPageNo2() > 0 ? review.getPageNo2() - 1 : 0), review.getPageSize2(), review.getPageUnit2());
 		pageable2.setTotalCount(reviewService.getAlreadyReviewCount(review));
-		
+
 		review.setPageable2(pageable2);
 		log.info("pageable2: {}", pageable2);
 		log.info("totalCount2 {}", pageable2.getTotalCount());
-		
 
-	
 		result.set("paging2", review);
 		result.set("alreadyReviewCount", reviewService.getAlreadyReviewCount(review));
 		result.set("dataList2", reviewService.getAlreadyReviewList(review));
-		
 
 		return result;
 	}
-	
+
 	/**
 	 * 마이페이지 리뷰작성화면
 	 *
@@ -1300,27 +1431,45 @@ public class TsfMypageController extends TsfBaseController {
 	 * @author sowon	
 	 * @since 2021. 03. 25
 	 */
+	@PostMapping("/review/create/form")
+	public ModelAndView mypageReviewCreateForm(Review review) {
+		ModelAndView mav = new ModelAndView();
+		
+		review.setCustNo(TsfSession.getInfo().getCustNo());
+		review.setSiteCd(TscConstants.Site.STYLE24.value());
+		
+		mav.addObject("reviewStat", review.getReviewStat());
+		mav.addObject("reviewInfo", reviewService.getReviewGoodsInfo(review));
+		
+		mav.setViewName(super.getDeviceViewName("mypage/MypageReviewCreateForm"));
+
+		return mav;
+	}
+	
+	/*
 	@GetMapping("/review/create/form/{ordNo}/{ordDtlNo}/{goodsCd}/{reviewStat}")
-	public ModelAndView mypageReviewCreateForm(@PathVariable(value = "ordNo") Integer ordNo,@PathVariable(value = "ordDtlNo") Integer ordDtlNo
-			,@PathVariable(value = "goodsCd") String goodsCd, @PathVariable(value = "reviewStat") String reviewStat, Device device) {
+	public ModelAndView mypageReviewCreateForm(@PathVariable(value = "ordNo") Integer ordNo, @PathVariable(value = "ordDtlNo") Integer ordDtlNo, @PathVariable(value = "goodsCd") String goodsCd, @PathVariable(value = "reviewStat") String reviewStat, Device device) {
 		Review review = new Review();
 		ModelAndView mav = new ModelAndView();
-		
+
 		review.setCustNo(TsfSession.getInfo().getCustNo());
 		review.setSiteCd(TscConstants.Site.STYLE24.value());
 		review.setOrdNo(ordNo);
 		review.setOrdDtlNo(ordDtlNo);
 		review.setGoodsCd(goodsCd);
 		review.setReviewStat(reviewStat);
-		
+
 		mav.addObject("reviewStat", reviewStat);
 		mav.addObject("reviewInfo", reviewService.getReviewGoodsInfo(review));
-		
+
 		mav.setViewName(super.getDeviceViewName("mypage/MypageReviewCreateForm"));
 
 		return mav;
 	}
+
+	*/
 	
+
 	/**
 	 * 마이페이지 리뷰 저장
 	 * @param review
@@ -1334,16 +1483,16 @@ public class TsfMypageController extends TsfBaseController {
 
 		GagaMap result = new GagaMap();
 		review.setCustNo(TsfSession.getInfo().getCustNo());
-		if(reviewService.reviewDeleteConfirm(review).getCount() > 0) {
+		if (reviewService.reviewDeleteConfirm(review).getCount() > 0) {
 			review.setReviewSq(reviewService.reviewDeleteConfirm(review).getReviewSq());
 		}
-		
+
 		reviewService.saveMypageReview(review);
 		result.set("status", "200");
 
 		return result;
 	}
-	
+
 	/**
 	 * 마이페이지 리뷰 삭제처리
 	 *
@@ -1358,12 +1507,12 @@ public class TsfMypageController extends TsfBaseController {
 	public GagaMap mypageReviewDelete(@RequestBody Review review) throws Exception {
 		GagaMap result = new GagaMap();
 		reviewService.reviewDelete(review);
-		
+
 		result.set("status", "200");
 
 		return result;
 	}
-	
+
 	/**
 	 * 마이페이지 위시리스트화면
 	 *
@@ -1402,7 +1551,6 @@ public class TsfMypageController extends TsfBaseController {
 		return wishList;
 	}
 
-
 	/*신주승 시작*/
 
 	/**
@@ -1532,7 +1680,6 @@ public class TsfMypageController extends TsfBaseController {
 		return customerService.updateCustomerAuth(customer);
 	}
 
-
 	/**
 	 * 마이페이지 - 확인(수정)
 	 *
@@ -1560,7 +1707,7 @@ public class TsfMypageController extends TsfBaseController {
 		custAccount.setIpAddress(TsfSession.getIpAddress());
 		boolean isValid = false;
 		GagaMap result = kcpService.checkAccount(custAccount);
-		if("0000".equals(result.get("resCd"))) {
+		if ("0000".equals(result.get("resCd"))) {
 			isValid = true;
 		}
 		result.set("isValid", isValid);
@@ -1747,4 +1894,47 @@ public class TsfMypageController extends TsfBaseController {
 	}
 
 	/*신주승 끝*/
+
+	/**
+	 * 마이페이지 - 재입고알림
+	 * @return ModelAndView
+	 * @author gagamel
+	 * @since 2021. 4. 13
+	 */
+	@GetMapping("/restock/form")
+	public ModelAndView restockForm() {
+		ModelAndView mav = new ModelAndView();
+		mav.setViewName(super.getDeviceViewName("mypage/RestockForm"));
+		return mav;
+	}
+
+	/**
+	 * 마이페이지 - 재입고알림 목록
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 4. 13
+	 */
+	@GetMapping("/restock/list")
+	@ResponseBody
+	public Collection<ReinboundInform> getRestockList() {
+		return reinboundService.getReinboundInformList(TsfSession.getInfo().getCustNo());
+	}
+
+	/**
+	 * 마이페이지 - 재입고알림 목록
+	 * @param params - 재입고알림 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 4. 13
+	 */
+	@PostMapping("/restock/continue/update")
+	@ResponseBody
+	public GagaResponse updateRestockContinue(@RequestBody ReinboundInform params) {
+		params.setCustNo(TsfSession.getInfo().getCustNo());
+		params.setUpdNo(TsfSession.getInfo().getCustNo());
+		reinboundService.updateReinboundInformContinue(params);
+
+		return super.ok("알림 기한을 15일로 연장하였습니다.");
+	}
+
 }

+ 66 - 74
src/main/java/com/style24/front/biz/web/TsfOrderController.java

@@ -73,29 +73,26 @@ public class TsfOrderController extends TsfBaseController {
 	 * @since 2021. 02. 02
 	 */
 	@RequestMapping(value = "/noMember")
-	public ModelAndView orderNoMember(Order order, RedirectAttributes redirectAttributes) {
+	public ModelAndView orderNoMember(Order order, @RequestParam(value = "sEncData", required = false) String sEncData
+			, @RequestParam(value = "authMethod", required = false) String authMethod) {
 		ModelAndView mav = new ModelAndView();
 		
 		// 비회원 주문시 로직 정리
-		// @ web 인 경우에는 고객정보 입력 화면 후 주문서 이동 후 본인인중
-		// @ web 의 경우에는 입력한 고객정보와 인증받은 고객정보가 다른경우 고객정보 업데이트
-		// @ mobile 인 경우에는 본인인증 후 주문서 이동
-		// 배송완료 후 14일 자동구매확정
-		
-		// TODO 임시 장바구니
-		// 2. 장바구니시퀀스 배열 등록 (장바구니 상품 정보 조회)
-		//int[] arr = {20,12};
-		//order.setCartSqArr(arr);		// 장바구니시퀀스
-		//order.setShotDelvUseYn("Y");	// 장바구니총알배송사용여부
-		
-		// 1.1 카트시퀀스가 정보가 없을때 처리 장바구니로 이동 
+		// @ WEB 인 경우에는 고객정보 입력 화면 후 주문서 이동 후 본인인중
+		// @ WEB 의 경우에는 입력한 고객정보와 인증받은 고객정보가 다른경우 고객정보 업데이트
+		// @ MOBILE 인 경우에는 본인인증 후 주문서 이동
+		
+		// 1. 카트시퀀스가 정보가 없을때 처리 장바구니로 이동
 		if (order.getCartSqArr() == null) {
-			mav.setViewName("redirect:/cart/list/form");						// 비회원주문서화면
+			mav.setViewName("redirect:/cart/list/form");						// 장바구니화면이동
 			return mav;
 		}
 		
-		mav.addObject("order" 	, order);										// 주문정보
-		mav.addObject("isLogin"	, TsfSession.isLogin());						// 로그인여부
+		mav.addObject("order" 			, order);								// 주문정보
+		mav.addObject("isLogin"			, TsfSession.isLogin());				// 로그인여부
+		mav.addObject("sEncData"		, sEncData);
+		mav.addObject("authMethod"		, authMethod);
+		
 		mav.setViewName(super.getDeviceViewName("order/OrderNoMember"));		// 비회원주문서화면
 
 		return mav;
@@ -132,48 +129,33 @@ public class TsfOrderController extends TsfBaseController {
 		// 1.비회주문, 회원 주문 판단 로직,  고객정보 세션 판단
 		// 세션고객정보가 존재하면 회원주문 없으면 비회원 주문
 		
-		// 1.0 requestUri check
+		// 1.1 referer 체크 (order/noMember)
 		String refererStr = "";
 		if (request.getHeader("referer") != null) {
 			refererStr = request.getHeader("referer").toString();
 			if (refererStr.indexOf("style24.com/order/noMember") < 0) {
-				mav.setViewName("redirect:/cart/list/form");		// 비회원주문서화면
+				mav.setViewName("redirect:/cart/list/form");	// 장바구니화면이동
 				return mav;
 			}
 		} else {
-			mav.setViewName("redirect:/cart/list/form");		// 비회원주문서화면
+			mav.setViewName("redirect:/cart/list/form");		// 장바구니화면이동
 			return mav;
 		}
 
-		// 1.1 카트시퀀스가 정보가 없을때 처리 장바구니로 이동 
+		// 1.2 카트시퀀스가 정보가 없을때 처리 장바구니로 이동 
 		if (order.getCartSqArr() == null) {
-			mav.setViewName("redirect:/cart/list/form");		// 비회원주문서화면
+			mav.setViewName("redirect:/cart/list/form");		// 장바구니화면이동
 			return mav;
 		}
 
-		// 1.2 로그인체크 후 custNo 설정
+		// 1.3 로그인체크 후 custNo 설정
 		if (TsfSession.isLogin()) {
-			order.setCustNo(TsfSession.getInfo().getCustNo()); // 고객번호등록
+			order.setCustNo(TsfSession.getInfo().getCustNo());
 		} else {
 			order.setJsessionId(TsfSession.getSessionId());
 			order.setCustNo(0);
 		}
 		
-		// TODO
-		//int[] arr = {1,2,158,150,149,159,148,153,20,12};
-		//order.setCartSqArr(arr);		// 장바구니시퀀스
-		//order.setShotDelvUseYn("Y");	// 장바구니총알배송사용여부
-
-		/*int[] arr = {1,2,158,150,149,159,148,153,20,12};
-		order.setCartSqArr(arr);		// 장바구니시퀀스
-		order.setShotDelvUseYn("Y");	// 장바구니총알배송사용여부*/
-		
-		// 1.1 카트시퀀스가 정보가 없을때 처리 장바구니로 이동 
-		if (order.getCartSqArr() == null) {
-			mav.setViewName("redirect:/cart/list/form");		// 비회원주문서화면
-			return mav;
-		}
-		
 		// 2. 로그인정보 체크 후 비회원 고객정보 설정
 		if (TsfSession.isLogin()) {
 			order.setCustNm("");
@@ -186,7 +168,7 @@ public class TsfOrderController extends TsfBaseController {
 			order.setRecipBaseAddr("기본주소없음");
 			order.setRecipDtlAddr("상제주소없음");
 		} else {
-			// 2021.04.08 휴대폰번호 하이픈 처리
+			// 2021.04.08 휴대폰번호 하이픈 처리 (비회원인경우)
 			order.setHypenCellPhone();
 		}
 
@@ -196,24 +178,23 @@ public class TsfOrderController extends TsfBaseController {
 		}
 		order.setShotDelvYn(order.getShotDelvUseYn());
 
-		// TODO 임시 장바구니
-		// 3. 장바구니상품시퀀스 상품목록조회		
-		// 3.1 즉시할인, 다다익선 할인금액 정보 적용 정보
+		// 3. 장바구니상품시퀀스 상품목록조회
+		// 3.1 즉시할인, 다다익선 할인금액 정보 적용 상품 정보
 		Collection<Order> tmtbGoodsApplyList = cartService.getMoreBetterAmtList(order);
 		
-		// 3.1.1 상품목록이 없으면 장바구니이동 
+		// 3.2 상품조회목록이 없으면 장바구니이동 
 		if (tmtbGoodsApplyList.size() < 1) {
-			mav.setViewName("redirect:/cart/list/form");		// 비회원주문서화면
+			mav.setViewName("redirect:/cart/list/form");		// 장바구니화면이동
 			return mav;
 		}
 		
-		// 3.2 배송정보조회(장바구니상품목록)
+		// 3.3 배송정보조회(장바구니상품목록)
 		GagaMap delvOrderMap = coreOrderService.getCartDelvGoodsCntList(tmtbGoodsApplyList, order);
 		
-		// 3.3 할인정보조회(상품금액, 선포인트, 다다익선할인금액)
+		// 3.4 할인정보조회(상품금액, 선포인트, 다다익선할인금액)
 		GagaMap goodsDcAmtMap = coreOrderService.getGoodsDcAmt(tmtbGoodsApplyList);
 
-		// 4. 화면설정설정
+		// 4. 화면설정
 		// 4.1 배송정보설정
 		mav.addObject("cartGoodsList"		, tmtbGoodsApplyList);						// 장바구니상품목록(즉시할인, 다다익선적용)
 		
@@ -239,11 +220,11 @@ public class TsfOrderController extends TsfBaseController {
 		// 4.3 주문정보
 		mav.addObject("order" 				, order);									// 주문정보(고객정보, 배송지정보, 총알배송사용여부)
 		
-		// 4.5 해외구매대행, 주문제작
+		// 4.4 해외구매대행, 주문제작
 		mav.addObject("foreignBuyYn"		, delvOrderMap.get("foreignBuyYn"));		// 해외구매대행여부
 		mav.addObject("orderMadeYn"			, delvOrderMap.get("orderMadeYn"));			// 주문제작여부
 		
-		// 4.6 로그인여부
+		// 4.5 로그인여부
 		mav.addObject("isLogin"				, TsfSession.isLogin());					// 로그인여부
 		
 		mav.setViewName(super.getDeviceViewName("order/OrderForm"));
@@ -275,10 +256,10 @@ public class TsfOrderController extends TsfBaseController {
 		
 		// 2. 로그인체크 후 고객정보 설정
 		if (TsfSession.isLogin()) {
-			// 2.1 주문고객 정보조회
+			// 2.1 주문고객 정보조회 (회원정보)
 			custemerInfo = coreOrderService.getCustemerInfo(order);
 		} else {
-			// 2.1 주문고객 정보조회
+			// 2.1 주문고객 정보조회 (비회원주문서화면정보)
 			custemerInfo.setCustNm(order.getCustNm());
 			custemerInfo.setCellPhnno(order.getCellPhnno());
 			custemerInfo.setEmail(order.getEmail());
@@ -331,11 +312,12 @@ public class TsfOrderController extends TsfBaseController {
 						deliveryAddrInfo = deliveryAddr;
 					}
 				}
-				// 회원 배송지 번가 존재하지 않으면 기본배송지 설정
+				// 회원 배송지 번가 존재하지 않으면 기본배송지 설정
 				else {
 					if (index == 0) {
 						deliveryAddrInfo = deliveryAddr;
-					
+						
+						// 배송지목록에 정보가 없으면 아래의 문구 노출
 						if (deliveryAddrInfo.getRecipZipcode() == null || "".equals(deliveryAddrInfo.getRecipZipcode())) {
 							deliveryAddrInfo.setDelvAddrNm(deliveryAddrInfo.getCustNm());
 							
@@ -389,12 +371,12 @@ public class TsfOrderController extends TsfBaseController {
 	}
 	
 	/**
-	 * 배송정보조회
+	 * 해외통관번호등록화면
 	 *
 	 * @param
 	 * @return
 	 * @author jsh77b
-	 * @since 2021. 02. 17
+	 * @since 2021. 04. 01
 	 */
 	@ResponseBody
 	@PostMapping("/entryInfo")
@@ -408,12 +390,12 @@ public class TsfOrderController extends TsfBaseController {
 	}
 	
 	/**
-	 * 배송정보조회
+	 * 주문제작상품동의화면
 	 *
 	 * @param
 	 * @return
 	 * @author jsh77b
-	 * @since 2021. 02. 17
+	 * @since 2021. 04. 01
 	 */
 	@ResponseBody
 	@PostMapping("/madeInfo")
@@ -445,13 +427,14 @@ public class TsfOrderController extends TsfBaseController {
 			order.setCustNo(0); // 고객번호등록
 			order.setJsessionId(TsfSession.getSessionId());
 		}
-
+		
+		// 2. 즉시할인, 다다익선 할인금액 정보 적용 상품 정보
 		Collection<Order> tmtbGoodsApplyList = cartService.getMoreBetterAmtList(order);
 
-		// 3.2 배송정보조회(장바구니상품목록)
+		// 3. 배송정보조회(장바구니상품목록)
 		GagaMap delvOrderMap = coreOrderService.getCartDelvGoodsCntList(tmtbGoodsApplyList, order);
 		
-		// 3.3 할인정보조회(상품금액, 선포인트, 다다익선할인금액)
+		// 4. 할인정보조회(상품금액, 선포인트, 다다익선할인금액)
 		GagaMap goodsDcAmtMap = coreOrderService.getGoodsDcAmt(tmtbGoodsApplyList);
 				
 		ModelAndView mav = new ModelAndView();
@@ -497,9 +480,8 @@ public class TsfOrderController extends TsfBaseController {
 			order.setJsessionId(TsfSession.getSessionId());
 		}
 		
-		// 2. 로그인체크 후 정보 설정
+		// 2. 로그인체크 후 정보 설정 로그인후 사은품정보조회
 		if (TsfSession.isLogin()) {
-			// 3. 사은품 정보 (장바구니상품 사음품 적용 정보 조회)
 			resultMap = coreFreegiftService.getOrderFreegift(order);
 		} 
 		
@@ -630,7 +612,7 @@ public class TsfOrderController extends TsfBaseController {
 		// 2. 로그인체크 후 정보 설정
 		if (TsfSession.isLogin()) {
 			
-		} 
+		}
 
 		ModelAndView mav = new ModelAndView();
 		mav.addObject("order" 			, order);					// 파라미터
@@ -652,8 +634,7 @@ public class TsfOrderController extends TsfBaseController {
 	@ResponseBody
 	public ModelAndView createOrder(@RequestBody Order order) {
 		ModelAndView mav = new ModelAndView();
-		
-		// TODO 주문 시작 데이터 처리 
+		 
 		// 2021.03.09 주문데이타 등록 
 		// 1. 로그인체크 후 custNo 설정
 		if (TsfSession.isLogin()) {
@@ -666,7 +647,14 @@ public class TsfOrderController extends TsfBaseController {
 		
 		// TODO
 		// 2. 주문정보유효성체크
-		orderService.orderValidationCheck(order);
+		String resultStr = orderService.orderValidationCheck(order);
+		
+		// 유효성체크 실패
+		if (!"SUCCESS".equals(resultStr)) {
+			mav.addObject("message", resultStr);
+			mav.setViewName(super.getDeviceViewName("order/OrderEmpty"));
+			return mav;
+		}
 		
 		// 3. 주문기본정보등록(주문접수)
 		coreOrderService.createPreOrder(order);
@@ -682,7 +670,6 @@ public class TsfOrderController extends TsfBaseController {
 		log.info("order.getOrdPhnno()          ::: {}", order.getOrdPhnno());
 		log.info("order.getCustNo()            ::: {}", order.getCustNo());
 		log.info("order.getFreegiftValArr()    ::: {}", order.getFreegiftValArr());
-		log.info("order.getFreegiftValArr()    ::: {}", order.getFreegiftValArr());
 		log.info("order.getFreegiftSqArr()     ::: {}", order.getFreegiftSqArr());
 		log.info("order.getSexGb()             ::: {}", order.getSexGb());
 		log.info("order.getBirthYmd()          ::: {}", order.getBirthYmd());
@@ -709,6 +696,7 @@ public class TsfOrderController extends TsfBaseController {
 		Payment payment = orderService.setPgDataInfo(order);
 		mav.addObject("payment"				, payment);
 		mav.addObject("orderDetailList"		, order.getOrderDetailList());
+		mav.addObject("message"				, resultStr);
 		mav.setViewName(super.getDeviceViewName("pg/kcpOrder"));
 
 		return mav;
@@ -754,10 +742,9 @@ public class TsfOrderController extends TsfBaseController {
 		
 		// TODO 4. 보증보험 API 연동
 		
-		// 2021.03.16 주문완료화면이동처리
-		//mav.addObject("payment", param);
-		//mav.setViewName(super.getDeviceViewName("pg/kcpOrder"));
 		
+		
+		// 2021.03.16 주문완료화면이동처리
 		mav.setViewName("redirect:/order/complete?ordNo=" + order.getOrdNo());
 		
 		return mav;
@@ -820,6 +807,10 @@ public class TsfOrderController extends TsfBaseController {
 		mav.addObject("isLogin"				, TsfSession.isLogin());				// 로그인여부
 		mav.addObject("delvAddrSq"			, resultMap.get("delvAddrSq"));			// 배송지번호
 		
+		// TODO 주문정보 알림톡전송
+		
+		
+		
 		// TODO 주문정보조회
 		mav.setViewName(super.getDeviceViewName("order/OrderComplete"));
 		return mav;
@@ -859,7 +850,7 @@ public class TsfOrderController extends TsfBaseController {
 	}
 	
 	/**
-	 * 쿠폰변경팝업 (상품, 장바구니)
+	 * 쿠폰변경팝업 (상품, 장바구니 쿠폰)
 	 *
 	 * @param
 	 * @return
@@ -921,7 +912,7 @@ public class TsfOrderController extends TsfBaseController {
 	}
 	
 	/**
-	 * 쿠폰변경팝업 (배송비)
+	 * 쿠폰변경팝업 (배송비쿠폰)
 	 *
 	 * @param
 	 * @return
@@ -955,12 +946,13 @@ public class TsfOrderController extends TsfBaseController {
 			
 			GagaMap delvOrderMap = coreOrderService.getCartDelvGoodsCntList(tmtbGoodsApplyList, order);
 			
-			// 2.7 배송비쿠폰목록 조회
+			// 2.2 배송비쿠폰목록 조회
 			delvCpnList = coreOrderService.getDelvCpnList(order);
 			
+			// 2.3 배송정책단위목록
 			delvFeeCdList = (Collection<Order>) delvOrderMap.get("delvFeeCdList");
 			
-			// 2.8 배송비쿠폰(배송업체기준)
+			// 2.4 배송비쿠폰(배송업체기준)
 			delvCpnList = coreOrderService.getDelvCpnApplyList(delvFeeCdList, delvCpnList);
 		} 
 

+ 9 - 2
src/main/java/com/style24/front/biz/web/TsfPlanningController.java

@@ -5,6 +5,7 @@ import java.util.Collection;
 import java.util.Map;
 
 import com.style24.front.biz.service.TsfCustomerService;
+import com.style24.front.biz.service.TsfDisplayService;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.mobile.device.Device;
@@ -69,6 +70,9 @@ public class TsfPlanningController extends TsfBaseController {
 	@Autowired
 	private TsfCustomerService customerService;
 
+	@Autowired
+	private TsfDisplayService displayService;
+
 	/**
 	 * 기획전 메인 화면
 	 * @param cateNo - 카테고리번호
@@ -226,8 +230,10 @@ public class TsfPlanningController extends TsfBaseController {
 			mav.setViewName(super.getDeviceViewName("planning/PlanningEventAttendForm"));
 			return mav;
 		}
-		
-		
+
+		// 브랜드그룹 정보 : 브랜드메인 링크에 설정된 기획전으로 들어올때 GNB 변경때문에 사용
+		mav.addObject("brandGroupInfo", displayService.getGnbBrandGroup(plan.getBrandGroupNo()));
+
 		mav.setViewName(super.getDeviceViewName("planning/PlanningDetailForm"));
 		return mav;
 	}
@@ -254,6 +260,7 @@ public class TsfPlanningController extends TsfBaseController {
 		result.set("paging", plan);
 		result.set("replyList",planningService.getReplyList(plan));
 		result.set("replyCount",planningService.getEntryReplyCount(plan));
+		result.set("replyAttachList",planningService.getEntryReplyAttachList(plan));
 		return result;
 	}
 	

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

@@ -91,4 +91,6 @@ public class Cart extends TscBaseDomain {
 
 	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
 	private Cart[] cartGoodsList;		// 장바구니 단품코드
+	
+	private String checkGb; 		// 2021.04.13 jsh77b 추가 장바구니화면 체크 C, 주문서화면 체크 O
 }

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

@@ -2,6 +2,7 @@ package com.style24.persistence.domain;
 
 import com.style24.persistence.TscBaseDomain;
 
+import com.style24.persistence.TscPageRequest;
 import lombok.Data;
 
 /**
@@ -51,4 +52,9 @@ public class Cate4Srch extends TscBaseDomain {
 	private String preview;			// 미리보기 여부 (Y:미리보기)
 
 	private String filterGb;		// 필터 구분값
+
+	private TscPageRequest pageable;				// 페이징
+	private int pageNo = 1;
+	private int pageSize = 50;
+	private int pageUnit = 10;
 }

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

@@ -1,6 +1,7 @@
 package com.style24.persistence.domain;
 
 import com.style24.persistence.TscBaseDomain;
+import com.style24.persistence.TscPageRequest;
 import lombok.Data;
 
 import java.util.Collection;
@@ -65,10 +66,17 @@ public class Contents extends TscBaseDomain {
 	private String cateGb;
 	private String cateNm;
 
+	private String pageGb;	// 호출페이지 구분(MALL:몰메인, BEST:베스트메인)
+
 	//private String contentsTitle;		// 메인 타이틀(md가 설정한)
 
 	private Collection<Cate1> cateList;	// 카테고리목록
 
 	private Collection<Goods> goodsList;	// 카테고리목록
 	private Collection<Contents> bannerList;	// 카테고리목록
+
+	private TscPageRequest pageable;				// 페이징
+	private int pageNo = 1;
+	private int pageSize = 50;
+	private int pageUnit = 10;
 }

+ 7 - 2
src/main/java/com/style24/persistence/domain/Plan.java

@@ -123,7 +123,7 @@ public class Plan extends TscBaseDomain {
 	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
 	private String[] answer;
 	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
-	private String[] sysFileNm;
+	//private String[] sysFileNm;
 
 	//private Collection<TsaPlanQuestAnswer> planQuestAnswerList; // 고시항목
 
@@ -268,8 +268,13 @@ public class Plan extends TscBaseDomain {
 	private String entryVal7;			//참여값7
 	private String entryVal8;			//참여값8
 	private Integer planEntrySq;		//참여일련번호
+	private String orgFileNm;
+	private String sysFileNm;
 	
-	
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] multiReplyOrgFile;			//댓글 이미지
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] multiReplySysFile;			//댓글 이미지
 	
 	// Pagination
 	private TscPageRequest pageable;

+ 13 - 9
src/main/java/com/style24/persistence/domain/ReinboundInform.java

@@ -14,13 +14,17 @@ import lombok.Data;
 @Data
 public class ReinboundInform extends TscBaseDomain {
 
-	private Integer rinbdInfoSq;
-	private Integer custNo;
-	private String goodsCd;
-	private String optCd;
-	private String optCd1;
-	private String optCd2;
-	private String reqDt;
-	private String informDt;
-	
+	private Integer rinbdInfoSq;	// 재입고알림번호
+	private Integer custNo;			// 고객번호
+	private String goodsCd;			// 상품코드
+	private String goodsNm;			// 상품명
+	private String brandEnm;		// 브랜드영문명
+	private String optCd;			// 옵션코드
+	private String optCd1;			// 옵션코드1
+	private String optCd2;			// 옵션코드2
+	private String reqDt;			// 요청일시
+	private int pastDays;			// 경과일수
+	private String informDt;		// 알림일시
+	private String sysImgNm;		// 상품이미지명
+
 }

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

@@ -1002,6 +1002,7 @@
 		/* TsfCart.selectCartDelvGoodsOptionImgList : 장바구니 입점업체 상품 이미지 리스트 조회 */
 		SELECT GI.GOODS_CD
 			 , GI.COLOR_CD
+			 , GI.DEFAULT_IMG_YN
 			 , GI.SYS_IMG_NM
 		FROM   TB_GOODS G
 		INNER  JOIN TB_GOODS_IMG GI

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

@@ -488,6 +488,9 @@
 												     , AVAIL_STDT 
 												     , AVAIL_EDDT 
 												     FROM TB_CUST_COUPON
+												     WHERE CUST_NO = #{custNo}
+					                                     AND USED_DT IS NULL
+					                                     AND NOW() BETWEEN AVAIL_STDT AND AVAIL_EDDT
 												GROUP BY 
 												       CUST_NO
 												     , CPN_ID
@@ -497,9 +500,6 @@
 											)A ON TC.CPN_ID = A.CPN_ID 
 				WHERE 1=1
 					AND TC.CPN_STAT = 'G232_11'  /*쿠폰 상태 - 진행*/
-					AND A.CUST_NO = #{custNo}
-					AND A.USED_DT IS NULL
-					AND NOW() BETWEEN A.AVAIL_STDT AND A.AVAIL_EDDT
 			)Z
 			UNION 
 			SELECT F.*
@@ -556,6 +556,9 @@
 												     , AVAIL_STDT 
 												     , AVAIL_EDDT 
 												     FROM TB_CUST_COUPON
+												     WHERE CUST_NO = #{custNo}
+					                                   AND USED_DT IS NULL
+					                                   AND AVAIL_EDDT BETWEEN DATE_ADD(NOW(), INTERVAL -3 MONTH) AND AVAIL_EDDT
 												GROUP BY 
 												       CUST_NO
 												     , CPN_ID
@@ -565,9 +568,6 @@
 											)A ON TC.CPN_ID = A.CPN_ID 
 				WHERE 1=1
 					AND TC.CPN_STAT = 'G232_11'  /*쿠폰 상태 - 진행*/
-					AND A.CUST_NO = #{custNo}
-					AND A.USED_DT IS NULL
-					AND A.AVAIL_EDDT BETWEEN DATE_ADD(NOW(), INTERVAL -3 MONTH) AND A.AVAIL_EDDT
 			)F
 		)T
 		ORDER BY T.USER_YN DESC, T.AVAIL_EDDT

+ 16 - 4
src/main/java/com/style24/persistence/mybatis/shop/TsfGoods.xml

@@ -1069,7 +1069,13 @@
 		            AND    B.USE_YN = 'Y'
 		            AND    BG.USE_YN = 'Y'
 		           ) G
-		    WHERE  G.NUMB <![CDATA[<=]]> #{maxRow}
+		    WHERE  1=1
+		<if test="pageable != null and pageable.endRow != null and pageable.endRow > 0">
+			AND  G.NUMB BETWEEN #{pageable.startRow} AND #{pageable.endRow}
+		</if>
+		<if test="maxRow != null and maxRow !=''">
+			AND  G.NUMB <![CDATA[<=]]> #{maxRow}
+		</if>
 		)
 		, TAB_GOODS_IMG AS (
 		    /* 상품의 이미지 */
@@ -1214,7 +1220,13 @@
 		            AND    B.USE_YN = 'Y'
 		            AND    BG.USE_YN = 'Y'
 		           ) G
-		    WHERE  G.NUMB <![CDATA[<=]]> #{maxRow}
+		    WHERE  1=1
+		<if test="pageable != null and pageable.endRow != null and pageable.endRow > 0">
+			AND  G.NUMB BETWEEN #{pageable.startRow} AND #{pageable.endRow}
+		</if>
+		<if test="maxRow != null and maxRow !=''">
+			AND  G.NUMB <![CDATA[<=]]> #{maxRow}
+		</if>
 		)
 		, TAB_GOODS_IMG AS (
 		    /* 상품의 이미지 */
@@ -1285,7 +1297,7 @@
 		                             AND W.CUST_NO = #{custNo}
 		</if>
 	</select>
-	
-	
+
+
 	
 </mapper>

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

@@ -466,4 +466,29 @@
 		AND    USED_DT IS NULL
 	</select>
 	
+	<!-- 사은품 수량 및 사용여부 체크 -->
+	<select id="getCheckFreegiftVal" parameterType="Order" resultType="int">
+		/* TsfOrder.getCheckFreegiftVal */
+		SELECT SUM(CNT) CNT
+		FROM (
+		    SELECT COUNT(1) AS CNT
+		    FROM   TB_FREEGIFT_VAL FV
+		    WHERE  1=1
+		    AND    FV.FREEGIFT_VAL_SQ IN
+		<foreach collection="freegiftValArr" item="item" index="index"  open="(" close=")" separator=",">
+			#{item}
+		</foreach> 
+		    AND    FV.ITEM_QTY <![CDATA[>=]]> FV.LEFT_QTY
+		    UNION  ALL
+		    SELECT COUNT(1) AS CNT
+		    FROM   TB_FREEGIFT_VAL FV
+		    WHERE  1=1
+		    AND    FV.FREEGIFT_VAL_SQ IN
+		<foreach collection="freegiftValArr" item="item" index="index"  open="(" close=")" separator=",">
+			#{item}
+		</foreach> 
+		    AND    FV.DEL_YN = 'Y'
+		) A
+	</select>
+	
 </mapper>

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

@@ -768,6 +768,8 @@
 		     , Z.ORD_NO
 		     , Z.ORD_AMT
 		     , Z.ORD_QTY
+		     , Z.CNCL_RTN_QTY
+		     , Z.CNCL_RTN_AMT
 		     , Z.CPN1_DC_AMT
 		     , Z.REAL_ORD_AMT
 		     , Z.PNT_DC_AMT
@@ -779,7 +781,8 @@
 		     , Z.SELF_GOODS_YN
 		     , Z.GOODS_NM
 		     , Z.GOODS_TYPE
-		     , Z.LIST_PRICE
+		     , Z.PRICE_ORG
+		     , Z.PRICE_SALE
 		     , Z.ADD_PAY_COST
 		     , Z.SYS_IMG_NM
 		     , Z.GIFT_PACK_YN
@@ -795,6 +798,10 @@
 		     , Z.RF_CNCL_AMT
 		     , Z.RF_DELIVERY_FEE
 		     , Z.RF_REAL_CNCL_AMT
+		     , Z.PG_GB
+		     , Z.PAY_STAT
+		     , Z.PAY_MEANS
+		     , Z.PAY_MEANS_NM
 		  FROM (SELECT OC.ORD_CHG_SQ
 		             , OC.CHG_GB
 		             , OCD.CHG_QTY
@@ -808,6 +815,8 @@
 		             , OD.ORD_NO
 		             , OD.ORD_AMT
 		             , OD.ORD_QTY
+		             , OD.CNCL_RTN_QTY
+		             , OD.CNCL_RTN_AMT
 		             , OD.CPN1_DC_AMT
 		             , OD.REAL_ORD_AMT
 		             , OD.PNT_DC_AMT
@@ -824,7 +833,8 @@
 		             , ODI.ORD_DTL_ITEM_SQ
 		             , ODI.OPT_CD1
 		             , ODI.OPT_CD2
-		             , G1.LIST_PRICE
+		             , ((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
 		             , 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
@@ -841,6 +851,10 @@
 		             , R.RF_CNCL_AMT
 		             , R.RF_DELIVERY_FEE
 		             , R.RF_REAL_CNCL_AMT
+		             , P.PG_GB
+		             , P.PAY_STAT
+		             , P.PAY_MEANS
+		             , FN_GET_CODE_NM('G014', P.PAY_MEANS)                              AS PAY_MEANS_NM
 		          FROM TB_ORDER_CHANGE OC
 		         INNER JOIN TB_ORDER_CHANGE_DETAIL OCD
 		            ON OC.ORD_CHG_SQ = OCD.ORD_CHG_SQ
@@ -868,6 +882,9 @@
 		           AND C.USE_YN = 'Y'
 		          LEFT OUTER JOIN TB_REFUND R
 		            ON R.ORD_CHG_SQ = OC.ORD_CHG_SQ
+		         INNER JOIN TB_PAYMENT P
+		            ON P.ORD_NO = O.ORD_NO
+		           AND P.PAY_GB = 'O'
 		         WHERE OCD.DEL_YN = 'N'
 		           AND O.DISP_YN = 'Y'
 		<choose>
@@ -884,11 +901,379 @@
 		</if>
 		  ) Z
 		 GROUP BY Z.ORD_CHG_SQ, Z.CHG_GB, Z.CHG_QTY, Z.ORD_DT, Z.CHG_DATE, Z.CHG_TIME, Z.CHG_DT, Z.COMPLETE_DT, Z.CHG_STAT
-				, Z.CHG_STAT_NM, Z.ORD_NO, Z.ORD_AMT, Z.ORD_QTY, Z.CPN1_DC_AMT, Z.REAL_ORD_AMT, Z.PNT_DC_AMT
+				, Z.CHG_STAT_NM, Z.ORD_NO, Z.ORD_AMT, Z.ORD_QTY, Z.CNCL_RTN_QTY, Z.CNCL_RTN_AMT, Z.CPN1_DC_AMT, Z.REAL_ORD_AMT, Z.PNT_DC_AMT
 				, Z.GFCD_USE_AMT, Z.ORD_DTL_NO, Z.GOODS_CD, Z.BRAND_NM, Z.SHOT_DELV_YN, Z.SELF_GOODS_YN, Z.GOODS_NM
-				, Z.GOODS_TYPE, Z.LIST_PRICE, Z.ADD_PAY_COST, Z.SYS_IMG_NM, Z.GIFT_PACK_YN, Z.REFUND_AMT, Z.RF_CPN1_AMT, Z.RF_TMTB1_AMT
+				, Z.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.RF_DELIVERY_FEE, Z.RF_REAL_CNCL_AMT, Z.PG_GB, Z.PAY_STAT, Z.PAY_MEANS, Z.PAY_MEANS_NM
 		 ORDER BY Z.ORD_CHG_SQ DESC
 	</select>
+
+	<!-- 마이페이지 반품 상세 정보 조회 -->
+	<select id="getCreReturnDetailInfo" parameterType="OrderChange" resultType="OrderChange">
+		/* TsfOrderChange.getCreReturnDetailInfo */
+		SELECT GROUP_CONCAT(Z.ITEM_NM ORDER BY Z.ORD_DTL_ITEM_SQ SEPARATOR '!@!')       AS ITEM_NM
+		     , GROUP_CONCAT(Z.COLOR_NM ORDER BY Z.ORD_DTL_ITEM_SQ)                      AS COLOR_NM
+		     , GROUP_CONCAT(Z.OPT_CD1 ORDER BY Z.ORD_DTL_ITEM_SQ)                       AS OPT_CD1
+		     , GROUP_CONCAT(Z.OPT_CD2 ORDER BY Z.ORD_DTL_ITEM_SQ)                       AS OPT_CD2
+		     , Z.ORD_CHG_SQ
+		     , Z.CHG_GB
+		     , Z.CHG_QTY
+		     , Z.ORD_DT
+		     , Z.CHG_DATE
+		     , Z.CHG_TIME
+		     , Z.CHG_DT
+		     , Z.COMPLETE_DT
+		     , Z.CHG_STAT
+		     , Z.CHG_STAT_NM
+		     , Z.ORD_NO
+		     , Z.ORD_AMT
+		     , Z.ORD_QTY
+		     , Z.CNCL_RTN_QTY
+		     , Z.CNCL_RTN_AMT
+		     , Z.CPN1_DC_AMT
+		     , Z.REAL_ORD_AMT
+		     , Z.PNT_DC_AMT
+		     , Z.GFCD_USE_AMT
+		     , Z.ORD_DTL_NO
+		     , Z.GOODS_CD
+		     , Z.BRAND_NM
+		     , Z.SHOT_DELV_YN
+		     , Z.SELF_GOODS_YN
+		     , Z.GOODS_NM
+		     , Z.GOODS_TYPE
+		     , Z.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_STAT
+		     , Z.PAY_MEANS
+		     , Z.PAY_MEANS_NM
+		     , Z.WD_GB
+		     , Z.CHGER_NM
+		     , Z.CHGER_PHNNO
+		     , Z.CHGER_BASE_ADDR
+		     , Z.CHGER_DTL_ADDR
+		     , Z.CHGER_RTN_MEMO
+		     , Z.WD_INVOICE_NO
+		     , Z.SHIP_COMP_CD
+		     , Z.SHIP_COMP_NM
+		  FROM (SELECT OC.ORD_CHG_SQ
+		             , OC.CHG_GB
+		             , OCD.CHG_QTY
+		             , DATE_FORMAT(O.ORD_DT, '%Y.%m.%d')                                AS ORD_DT
+		             , DATE_FORMAT(OCDH.REG_DT, '%Y.%m.%d')                             AS CHG_DATE
+		             , DATE_FORMAT(OCDH.REG_DT,'%H:%i:%S')                              AS CHG_TIME
+		             , DATE_FORMAT(OCD.REG_DT, '%Y.%m.%d')                              AS CHG_DT
+		             , DATE_FORMAT(OCD.COMPLETE_DT, '%Y.%m.%d')                         AS COMPLETE_DT
+		             , OCD.CHG_STAT
+		             , FN_GET_CODE_NM('G685', OCD.CHG_STAT)                             AS CHG_STAT_NM
+		             , OD.ORD_NO
+		             , OD.ORD_AMT
+		             , OD.ORD_QTY
+		             , OD.CNCL_RTN_QTY
+		             , OD.CNCL_RTN_AMT
+		             , OD.CPN1_DC_AMT
+		             , OD.REAL_ORD_AMT
+		             , OD.PNT_DC_AMT
+		             , OD.GFCD_USE_AMT
+		             , OCD.ORD_DTL_NO
+		             , G1.GOODS_CD
+		             , CONCAT(B.BRAND_ENM, ' ', B.BRAND_KNM)                            AS BRAND_NM
+		             , OD.SHOT_DELV_YN
+		             , G1.SELF_GOODS_YN
+		             , G1.GOODS_NM
+		             , IFNULL(C.COLOR_KNM, ODI.OPT_CD1)                                 AS COLOR_NM
+		             , G2.GOODS_NM                                                      AS ITEM_NM
+		             , G1.GOODS_TYPE
+		             , ODI.ORD_DTL_ITEM_SQ
+		             , ODI.OPT_CD1
+		             , ODI.OPT_CD2
+		             , ((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
+		             , OC.ADD_PAY_COST
+		             , CASE WHEN G1.GOODS_TYPE != 'G056_S' AND G1.SELF_GOODS_YN = 'Y' THEN (SELECT MAX(SYS_IMG_NM) FROM TB_GOODS_IMG WHERE GOODS_CD = G1.GOODS_CD AND COLOR_CD = ODI.OPT_CD1 AND DEFAULT_IMG_YN = 'Y')
+		                    ELSE (SELECT MAX(SYS_IMG_NM) FROM TB_GOODS_IMG WHERE GOODS_CD = G1.GOODS_CD AND COLOR_CD = IFNULL(G1.MAIN_COLOR_CD,'XX') AND DEFAULT_IMG_YN = 'Y') END AS SYS_IMG_NM
+		             , OD.GIFT_PACK_YN
+		             , R.REFUND_AMT
+		             , R.RF_CPN1_AMT
+		             , R.RF_TMTB1_AMT
+		             , R.RF_TMTB2_AMT
+		             , R.RF_GOODS_CPN_AMT
+		             , R.RF_CART_CPN_AMT
+		             , R.RF_PNT_AMT
+		             , R.RF_PRE_PNT_AMT
+		             , R.RF_GFCD_USE_AMT
+		             , R.RF_CNCL_AMT
+		             , R.RF_DELIVERY_FEE
+		             , R.RF_REAL_CNCL_AMT
+		             , P.PG_GB
+		             , P.PAY_STAT
+		             , P.PAY_MEANS
+		             , FN_GET_CODE_NM('G014', P.PAY_MEANS)                              AS PAY_MEANS_NM
+		             , OC.WD_GB
+		             , OC.CHGER_NM
+		             , OC.CHGER_PHNNO
+		             , OC.CHGER_BASE_ADDR
+		             , OC.CHGER_DTL_ADDR
+		             , OC.CHGER_RTN_MEMO
+		             , OC.WD_INVOICE_NO
+		             , OC.SHIP_COMP_CD
+		             , (SELECT SHIP_COMP_NM
+		                  FROM TB_SHIP_COMPANY SC
+		                 WHERE SC.SHIP_COMP_CD = OC.SHIP_COMP_CD)                       AS SHIP_COMP_NM
+		          FROM TB_ORDER_CHANGE OC
+		         INNER JOIN TB_ORDER_CHANGE_DETAIL OCD
+		            ON OC.ORD_CHG_SQ = OCD.ORD_CHG_SQ
+		         INNER JOIN TB_ORDER_CHANGE_DETAIL_HST OCDH
+		            ON OCD.ORD_CHG_SQ = OCDH.ORD_CHG_SQ
+		           AND OCD.ORD_DTL_NO = OCDH.ORD_DTL_NO
+		           AND OCD.CHG_STAT = OCDH.CHG_STAT
+		         INNER JOIN TB_ORDER_DETAIL OD
+		            ON OCD.ORD_DTL_NO = OD.ORD_DTL_NO
+		           AND OD.ORD_DTL_STAT NOT IN ('G013_00', 'G013_11', 'G013_25')
+		         INNER JOIN TB_ORDER O
+		            ON OD.ORD_NO = O.ORD_NO
+		         INNER JOIN TB_ORDER_DETAIL_ITEM ODI
+		            ON OD.ORD_NO = ODI.ORD_NO
+		           AND OD.ORD_DTL_NO = ODI.ORD_DTL_NO
+		           AND OD.ORD_DTL_STAT NOT IN ('G013_00', 'G013_11', 'G013_25')
+		         INNER JOIN TB_GOODS G1
+		            ON OD.GOODS_CD = G1.GOODS_CD
+		         INNER JOIN TB_GOODS G2
+		            ON ODI.ITEM_CD = G2.GOODS_CD
+		         INNER JOIN TB_BRAND B
+		            ON G1.BRAND_CD = B.BRAND_CD
+		          LEFT OUTER JOIN TB_COLOR C
+		            ON C.COLOR_CD = IFNULL(NULLIF(ODI.OPT_CD1,'') , G1.MAIN_COLOR_CD)
+		           AND C.USE_YN = 'Y'
+		          LEFT OUTER JOIN TB_REFUND R
+		            ON R.ORD_CHG_SQ = OC.ORD_CHG_SQ
+		         INNER JOIN TB_PAYMENT P
+		            ON P.ORD_NO = O.ORD_NO
+		           AND P.PAY_GB = 'O'
+		         WHERE OCD.DEL_YN = 'N'
+		           AND O.DISP_YN = 'Y'
+		<choose>
+			<when test="custNo != null and custNo != ''">
+			       AND O.CUST_NO = #{custNo}
+			</when>
+			<otherwise>
+			       AND O.ORD_NO = #{ordNo}
+			       AND O.ORD_NM = #{orderNm}
+			</otherwise>
+		</choose>
+		<if test="ordChgSq != null and ordChgSq != ''">
+			       AND OC.ORD_CHG_SQ = #{ordChgSq}
+		</if>
+		       ) Z
+		 GROUP BY Z.ORD_CHG_SQ, Z.CHG_GB, Z.CHG_QTY, Z.ORD_DT, Z.CHG_DATE, Z.CHG_TIME, Z.CHG_DT, Z.COMPLETE_DT, Z.CHG_STAT
+		        , Z.CHG_STAT_NM, Z.ORD_NO, Z.ORD_AMT, Z.ORD_QTY, Z.CNCL_RTN_QTY, Z.CNCL_RTN_AMT, Z.CPN1_DC_AMT, Z.REAL_ORD_AMT, Z.PNT_DC_AMT
+		        , Z.GFCD_USE_AMT, Z.ORD_DTL_NO, Z.GOODS_CD, Z.BRAND_NM, Z.SHOT_DELV_YN, Z.SELF_GOODS_YN, Z.GOODS_NM
+		        , Z.GOODS_TYPE, Z.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_STAT, Z.PAY_MEANS, Z.PAY_MEANS_NM, Z.WD_GB, Z.CHGER_NM, Z.CHGER_PHNNO, Z.CHGER_BASE_ADDR
+		        , Z.CHGER_DTL_ADDR, Z.CHGER_RTN_MEMO, Z.WD_INVOICE_NO, Z.SHIP_COMP_CD, Z.SHIP_COMP_NM
+		 ORDER BY Z.ORD_CHG_SQ DESC
+	</select>
+
+	<!-- 마이페이지 교환 상세 정보 조회 -->
+	<select id="getCreExchangeDetailInfo" parameterType="OrderChange" resultType="OrderChange">
+		/* TsfOrderChange.getCreCancelDetailInfo */
+		SELECT GROUP_CONCAT(Z.ITEM_NM ORDER BY Z.ORD_DTL_ITEM_SQ SEPARATOR '!@!')       AS ITEM_NM
+		     , GROUP_CONCAT(Z.COLOR_NM ORDER BY Z.ORD_DTL_ITEM_SQ)                      AS COLOR_NM
+		     , GROUP_CONCAT(Z.OPT_CD1 ORDER BY Z.ORD_DTL_ITEM_SQ)                       AS OPT_CD1
+		     , GROUP_CONCAT(Z.OPT_CD2 ORDER BY Z.ORD_DTL_ITEM_SQ)                       AS OPT_CD2
+		     , Z.ORD_CHG_SQ
+		     , Z.CHG_GB
+		     , Z.CHG_QTY
+		     , Z.ORD_DT
+		     , Z.CHG_DATE
+		     , Z.CHG_TIME
+		     , Z.CHG_DT
+		     , Z.COMPLETE_DT
+		     , Z.CHG_STAT
+		     , Z.CHG_STAT_NM
+		     , Z.ORD_NO
+		     , Z.ORD_AMT
+		     , Z.ORD_QTY
+		     , Z.CNCL_RTN_QTY
+		     , Z.CNCL_RTN_AMT
+		     , Z.CPN1_DC_AMT
+		     , Z.REAL_ORD_AMT
+		     , Z.PNT_DC_AMT
+		     , Z.GFCD_USE_AMT
+		     , Z.ORD_DTL_NO
+		     , Z.GOODS_CD
+		     , Z.BRAND_NM
+		     , Z.SHOT_DELV_YN
+		     , Z.SELF_GOODS_YN
+		     , Z.GOODS_NM
+		     , Z.GOODS_TYPE
+		     , Z.PRICE_ORG
+		     , Z.PRICE_SALE
+		     , Z.ADD_PAY_COST
+		     , Z.SYS_IMG_NM
+		     , Z.GIFT_PACK_YN
+		     , Z.WD_GB
+		     , Z.CHGER_NM
+		     , Z.CHGER_PHNNO
+		     , Z.CHGER_BASE_ADDR
+		     , Z.CHGER_DTL_ADDR
+		     , Z.CHG_MEMO
+		     , Z.WD_INVOICE_NO
+		     , Z.SHIP_COMP_CD
+		     , Z.SHIP_COMP_NM
+		     , Z.DELV_ADDR_SQ
+		     , Z.RECIP_NM
+		     , Z.RECIP_PHNNO
+		     , Z.RECIP_BASE_ADDR
+		     , Z.RECIP_DTL_ADDR
+		     , Z.DELV_MEMO
+		  FROM (SELECT OC.ORD_CHG_SQ
+		             , OC.CHG_GB
+		             , OCD.CHG_QTY
+		             , DATE_FORMAT(O.ORD_DT, '%Y.%m.%d')                                AS ORD_DT
+		             , DATE_FORMAT(OCDH.REG_DT, '%Y.%m.%d')                             AS CHG_DATE
+		             , DATE_FORMAT(OCDH.REG_DT,'%H:%i:%S')                              AS CHG_TIME
+		             , DATE_FORMAT(OCD.REG_DT, '%Y.%m.%d')                              AS CHG_DT
+		             , DATE_FORMAT(OCD.COMPLETE_DT, '%Y.%m.%d')                         AS COMPLETE_DT
+		             , OCD.CHG_STAT
+		             , FN_GET_CODE_NM('G685', OCD.CHG_STAT)                             AS CHG_STAT_NM
+		             , OD.ORD_NO
+		             , OD.ORD_AMT
+		             , OD.ORD_QTY
+		             , OD.CNCL_RTN_QTY
+		             , OD.CNCL_RTN_AMT
+		             , OD.CPN1_DC_AMT
+		             , OD.REAL_ORD_AMT
+		             , OD.PNT_DC_AMT
+		             , OD.GFCD_USE_AMT
+		             , OCD.ORD_DTL_NO
+		             , G1.GOODS_CD
+		             , CONCAT(B.BRAND_ENM, ' ', B.BRAND_KNM)                            AS BRAND_NM
+		             , OD.SHOT_DELV_YN
+		             , G1.SELF_GOODS_YN
+		             , G1.GOODS_NM
+		             , IFNULL(C.COLOR_KNM, ODI.OPT_CD1)                                 AS COLOR_NM
+		             , G2.GOODS_NM                                                      AS ITEM_NM
+		             , G1.GOODS_TYPE
+		             , ODI.ORD_DTL_ITEM_SQ
+		             , ODI.OPT_CD1
+		             , ODI.OPT_CD2
+		             , ((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
+		             , OC.ADD_PAY_COST
+		             , CASE WHEN G1.GOODS_TYPE != 'G056_S' AND G1.SELF_GOODS_YN = 'Y' THEN (SELECT MAX(SYS_IMG_NM) FROM TB_GOODS_IMG WHERE GOODS_CD = G1.GOODS_CD AND COLOR_CD = ODI.OPT_CD1 AND DEFAULT_IMG_YN = 'Y')
+		                    ELSE (SELECT MAX(SYS_IMG_NM) FROM TB_GOODS_IMG WHERE GOODS_CD = G1.GOODS_CD AND COLOR_CD = IFNULL(G1.MAIN_COLOR_CD,'XX') AND DEFAULT_IMG_YN = 'Y') END AS SYS_IMG_NM
+		             , OD.GIFT_PACK_YN
+		             , OC.WD_GB
+		             , OC.CHGER_NM
+		             , OC.CHGER_PHNNO
+		             , OC.CHGER_BASE_ADDR
+		             , OC.CHGER_DTL_ADDR
+		             , OC.CHG_MEMO
+		             , OC.WD_INVOICE_NO
+		             , OC.SHIP_COMP_CD
+		             , (SELECT SHIP_COMP_NM
+		                  FROM TB_SHIP_COMPANY SC
+		                 WHERE SC.SHIP_COMP_CD = OC.SHIP_COMP_CD)                       AS SHIP_COMP_NM
+		             , DA.DELV_ADDR_SQ
+		             , DA.RECIP_NM
+		             , DA.RECIP_PHNNO
+		             , DA.RECIP_BASE_ADDR
+		             , DA.RECIP_DTL_ADDR
+		             , DA.DELV_MEMO
+		          FROM TB_ORDER_CHANGE OC
+		         INNER JOIN TB_ORDER_CHANGE_DETAIL OCD
+		            ON OC.ORD_CHG_SQ = OCD.ORD_CHG_SQ
+		         INNER JOIN TB_ORDER_CHANGE_DETAIL_HST OCDH
+		            ON OCD.ORD_CHG_SQ = OCDH.ORD_CHG_SQ
+		           AND OCD.ORD_DTL_NO = OCDH.ORD_DTL_NO
+		           AND OCD.CHG_STAT = OCDH.CHG_STAT
+		         INNER JOIN TB_ORDER_DETAIL OD
+		            ON OCD.ORD_DTL_NO = OD.ORD_DTL_NO
+		           AND OD.ORD_DTL_STAT NOT IN ('G013_00', 'G013_11', 'G013_25')
+		         INNER JOIN TB_ORDER_DETAIL OD2
+		            ON OCD.CHG_ORD_DTL_NO = OD2.ORD_DTL_NO
+		           AND OD2.ORD_EXCH_GB = 'E'
+		          LEFT OUTER JOIN TB_DELIVERY_ADDR DA
+		            ON OD2.DELV_ADDR_SQ = DA.DELV_ADDR_SQ
+		         INNER JOIN TB_ORDER O
+		            ON OD.ORD_NO = O.ORD_NO
+		         INNER JOIN TB_ORDER_DETAIL_ITEM ODI
+		            ON OD.ORD_NO = ODI.ORD_NO
+		           AND OD.ORD_DTL_NO = ODI.ORD_DTL_NO
+		           AND OD.ORD_DTL_STAT NOT IN ('G013_00', 'G013_11', 'G013_25')
+		         INNER JOIN TB_GOODS G1
+		            ON OD.GOODS_CD = G1.GOODS_CD
+		         INNER JOIN TB_GOODS G2
+		            ON ODI.ITEM_CD = G2.GOODS_CD
+		         INNER JOIN TB_BRAND B
+		            ON G1.BRAND_CD = B.BRAND_CD
+		          LEFT OUTER JOIN TB_COLOR C
+		            ON C.COLOR_CD = IFNULL(NULLIF(ODI.OPT_CD1,'') , G1.MAIN_COLOR_CD)
+		           AND C.USE_YN = 'Y'
+		         WHERE OCD.DEL_YN = 'N'
+		           AND O.DISP_YN = 'Y'
+		<choose>
+			<when test="custNo != null and custNo != ''">
+			       AND O.CUST_NO = #{custNo}
+			</when>
+			<otherwise>
+			       AND O.ORD_NO = #{ordNo}
+			       AND O.ORD_NM = #{orderNm}
+			</otherwise>
+		</choose>
+		<if test="ordChgSq != null and ordChgSq != ''">
+			       AND OC.ORD_CHG_SQ = #{ordChgSq}
+		</if>
+		       ) Z
+		 GROUP BY Z.ORD_CHG_SQ, Z.CHG_GB, Z.CHG_QTY, Z.ORD_DT, Z.CHG_DATE, Z.CHG_TIME, Z.CHG_DT, Z.COMPLETE_DT, Z.CHG_STAT
+		        , Z.CHG_STAT_NM, Z.ORD_NO, Z.ORD_AMT, Z.ORD_QTY, Z.CNCL_RTN_QTY, Z.CNCL_RTN_AMT, Z.CPN1_DC_AMT, Z.REAL_ORD_AMT, Z.PNT_DC_AMT
+		        , Z.GFCD_USE_AMT, Z.ORD_DTL_NO, Z.GOODS_CD, Z.BRAND_NM, Z.SHOT_DELV_YN, Z.SELF_GOODS_YN, Z.GOODS_NM
+		        , Z.GOODS_TYPE, Z.PRICE_ORG, Z.PRICE_SALE, Z.ADD_PAY_COST, Z.SYS_IMG_NM, Z.GIFT_PACK_YN, Z.WD_GB, Z.CHGER_NM, Z.CHGER_PHNNO, Z.CHGER_BASE_ADDR
+		        , Z.CHGER_DTL_ADDR, Z.CHG_MEMO, Z.WD_INVOICE_NO, Z.SHIP_COMP_CD, Z.SHIP_COMP_NM, Z.DELV_ADDR_SQ, Z.RECIP_NM, Z.RECIP_PHNNO
+		        , Z.RECIP_BASE_ADDR, Z.RECIP_DTL_ADDR, Z.DELV_MEMO
+		 ORDER BY Z.ORD_CHG_SQ DESC
+	</select>
+	
+	<!-- 마이페이지 회수지 수정 -->
+	<update id="updateChgerAddr" parameterType="OrderChange">
+		/* TsfOrderChange.updateChgerAddr */
+		UPDATE TB_ORDER_CHANGE
+		   SET CHGER_NM = #{chgerNm}
+		     , CHGER_PHNNO = #{chgerPhnno}
+		     , CHGER_ZIPCODE = #{chgerZipcode}
+		     , CHGER_BASE_ADDR = #{chgerBaseAddr}
+		     , CHGER_DTL_ADDR = #{chgerDtlAddr}
+		     , CHGER_RTN_MEMO = #{chgerRtnMemo}
+		     , UPD_NO = #{updNo}
+		     , UPD_DT = NOW()
+		 WHERE ORD_CHG_SQ = #{ordChgSq}
+	</update>
+	
+	<!-- 마이페이지 반품메모 수정 -->
+	<update id="updateChgerRtnMemo" parameterType="OrderChange">
+		/* TsfOrderChange.updateChgerRtnMemo */
+		UPDATE TB_ORDER_CHANGE
+		   SET CHGER_RTN_MEMO = #{chgerRtnMemo}
+		     , UPD_NO = #{updNo}
+		     , UPD_DT = NOW()
+		 WHERE ORD_CHG_SQ = #{ordChgSq}
+	</update>
 </mapper>

+ 42 - 3
src/main/java/com/style24/persistence/mybatis/shop/TsfPlanning.xml

@@ -1142,7 +1142,8 @@
 	<insert id="saveAttendEntry" parameterType="Plan">
 		/* TsfPlanning.saveAttendEntry */	
 		INSERT INTO TB_PLAN_ENTRY
-		        (PLAN_SQ
+		        ( 
+		        , PLAN_SQ
 		        , ENTRY_CUST_NO
 		        , ENTRY_DT
 		        , ENTRY_VAL1
@@ -1234,10 +1235,10 @@
 		<include refid="selectForPagingFooter"/>
 	</select>
 	
-	<insert id="saveEntryReply" parameterType="Plan">
+	<insert id="saveEntryReply" parameterType="Plan" useGeneratedKeys="true" keyProperty="planEntrySq">
 		/* TsfPlanning.saveEntryReply */	
 		INSERT INTO TB_PLAN_ENTRY
-		(
+		( 
 		  PLAN_SQ
 		, ENTRY_CUST_NO
 		, ENTRY_DT
@@ -1288,4 +1289,42 @@
 		WHERE PLAN_ENTRY_SQ = #{planEntrySq}		
 	</delete>
 	
+	<insert id="saveEntryReplyAttach" parameterType="Plan">
+		/* TsfPlanning.saveEntryReplyAttach */	
+		INSERT INTO TB_PLAN_ENTRY_ATTACH
+		(
+		   PLAN_ENTRY_SQ
+		 , ORG_FILE_NM
+		 , SYS_FILE_NM
+		 , REG_NO
+		 , REG_DT
+		 )
+		VALUES
+		(
+		  #{planEntrySq}
+		, #{orgFileNm}
+		, #{sysFileNm}
+		, #{regNo}
+		, CURRENT_TIMESTAMP
+		)
+	</insert>
+	
+	<select id="getEntryReplyAttachList" resultType="Plan" parameterType="Plan">
+		/* TsfPlanning.getEntryReplyAttach */	
+		SELECT PEA.PLAN_ENTRY_SQ
+		      ,PEA.ORG_FILE_NM 
+		      ,PEA.SYS_FILE_NM 
+		FROM TB_PLAN_ENTRY PE INNER JOIN TB_PLAN_ENTRY_ATTACH PEA 
+		                                    ON PE.PLAN_ENTRY_SQ = PEA.PLAN_ENTRY_SQ 
+		WHERE 1=1
+		   AND PE.PLAN_SQ = #{planSq}
+	</select>
+	
+	<delete id="deleteEntryReplyAttach" parameterType="Plan">
+		/* TsfPlanning.deleteEntryReplyAttach */	
+		DELETE 
+		FROM TB_PLAN_ENTRY_ATTACH
+		WHERE PLAN_ENTRY_SQ= #{planEntrySq}
+	</delete>
+	
 </mapper>

+ 59 - 0
src/main/java/com/style24/persistence/mybatis/shop/TsfReinbound.xml

@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.style24.front.biz.dao.TsfReinboundDao">
+
+	<!-- 페이징을 위한 select절 상단 -->
+	<sql id="selectForPagingHeader">
+		SELECT *
+		FROM   (
+	</sql>
+
+	<!-- 페이징을 위한 select절 하단 -->
+	<sql id="selectForPagingFooter">
+		       ) ORIGINAL
+		WHERE  NUMB BETWEEN #{pageable.startRow} AND #{pageable.endRow}
+	</sql>
+	
+	<!-- 재입고알림 목록 -->
+	<select id="getReinboundInformList" parameterType="Integer" resultType="ReinboundInform">
+		/* TsfReinbound.getReinboundInformList */
+		SELECT RI.RINBD_INFO_SQ                                   /*재입고알림번호*/
+		     , RI.GOODS_CD                                        /*상품코드*/
+		     , G.GOODS_NM                                         /*상품명*/
+		     , RI.OPT_CD                                          /*옵션코드*/
+		     , RI.OPT_CD1                                         /*옵션코드1*/
+		     , RI.OPT_CD2                                         /*옵션코드2*/
+		     , B.BRAND_ENM                                        /*브랜드영문명*/
+		     , DATE_FORMAT(RI.REQ_DT,'%Y.%m.%d')    AS REQ_DT     /*요청일자*/
+		     , DATEDIFF(CURRENT_DATE(),RI.REQ_DT)   AS PAST_DAYS  /*경과일수*/
+		     , DATE_FORMAT(RI.INFORM_DT,'%Y.%m.%d') AS INFORM_DT  /*알림일자*/
+		     , (SELECT MAX(SYS_IMG_NM)
+		        FROM   TB_GOODS_IMG
+		        WHERE  GOODS_CD = G.GOODS_CD
+		        AND    COLOR_CD = G.MAIN_COLOR_CD
+		        AND    DEFAULT_IMG_YN = 'Y' /*기본이미지만*/
+		       )                                    AS SYS_IMG_NM /*상품이미지명*/
+		FROM   TB_REINBOUND_INFORM RI
+		     , TB_GOODS G
+		     , TB_BRAND B
+		WHERE  RI.GOODS_CD = G.GOODS_CD
+		AND    G.BRAND_CD = B.BRAND_CD
+		AND    RI.CUST_NO = #{custNo}
+		AND    G.GOODS_STAT IN ('G008_70','G008_90') /*일시품절,승인완료*/
+		AND    NOW() BETWEEN G.SELL_STDT AND G.SELL_EDDT /*유효한판매기간*/
+		AND    G.SELF_MALL_YN = 'Y' /*자사몰에노출하는넘만*/
+		ORDER  BY RI.INFORM_DT DESC, PAST_DAYS, RI.RINBD_INFO_SQ
+	</select>
+	
+	<!-- 재입고알림 연장 -->
+	<update id="updateReinboundInformContinue" parameterType="ReinboundInform">
+		/* TsfReinbound.updateReinboundInformContinue */
+		UPDATE TB_REINBOUND_INFORM
+		SET    REQ_DT = NOW()
+		     , UPD_NO = #{updNo}
+		     , UPD_DT = NOW()
+		WHERE  RINBD_INFO_SQ = #{rinbdInfoSq}
+		AND    CUST_NO = #{custNo} /*보안상추가*/
+	</update>
+	
+</mapper>

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

@@ -336,6 +336,7 @@
 	<!-- 마이페이지 작성가능한 리뷰 -->
 	<select id="getCompleteReviewList" parameterType="Review" resultType="Review">
 		/* TsfReivew.getCompleteReviewList */
+		<include refid="selectForPagingHeader"/>
 		SELECT GROUP_CONCAT(Z.ITEM_NM ORDER BY Z.ORD_DTL_ITEM_SQ SEPARATOR '!@!') AS ITEM_NM
 		     , GROUP_CONCAT(Z.COLOR_NM ORDER BY Z.ORD_DTL_ITEM_SQ) AS COLOR_NM
 		     , GROUP_CONCAT(Z.OPT_CD1 ORDER BY Z.ORD_DTL_ITEM_SQ) AS OPT_CD1
@@ -376,6 +377,7 @@
 		   	 , Z.ITEMKIND_CD 
              , Z.SIZE_GB 
              , Z.REMAIN_DT
+             , RANK() OVER(ORDER BY Z.PAY_DT DESC) AS RNUM
 		  FROM (SELECT O.ORD_NO
 					 , DATE_FORMAT(O.ORD_DT, '%Y.%m.%d') AS ORD_DT
 					 , DATE_FORMAT(O.PAY_DT, '%Y-%m-%d') AS PAY_DT 
@@ -455,6 +457,7 @@
 				, Z.SUPPLY_COMP_CD, Z.DELV_FEE_CD, Z.SHOT_DELV_YN, Z.CHANGEABLE_YN, Z.SELF_GOODS_YN, Z.BRAND_NM, Z.BRAND_ENM, Z.ORD_DTL_STAT_NM
 				, Z.ORD_REQ_CHG_QTY, Z.ORD_CAN_CHG_QTY
 		ORDER BY Z.ORD_NO DESC, Z.ORD_DTL_STAT, Z.SELF_GOODS_YN DESC, Z.SHOT_DELV_YN DESC, Z.SUPPLY_COMP_CD
+		<include refid="selectForPagingFooter"/>
 	</select>
 	
 	<!-- 마이페이지 리뷰작성 상품데이타 -->
@@ -815,6 +818,7 @@
 	
 	<select id="getAlreadyReviewList" parameterType="Review" resultType="Goods">
 		/* TsfReivew.getAlreadyReviewList */
+		<include refid="selectForPagingHeader"/>
 		SELECT F.*
 			  , (SELECT MAX(SYS_IMG_NM) FROM TB_GOODS_IMG  WHERE GOODS_CD = F.GOODS_CD AND COLOR_CD = F.MAIN_COLOR_CD AND DEFAULT_IMG_YN = 'Y' ) AS SYS_IMG_NM
 		FROM
@@ -890,6 +894,7 @@
 			      ,R.ADM_RPL_REG_NO
 			      ,DATE_FORMAT(R.ADM_RPL_DT , '%Y-%m-%d %H:%i:%s') AS ADM_RPL_DT
 			      ,DATEDIFF( DATE_ADD(O.PAY_DT,INTERVAL 90 DAY),NOW()) AS REMAIN_DT -- 남은시간
+			      , RANK() OVER(ORDER BY O.PAY_DT DESC) AS RNUM
 			FROM TB_ORDER O INNER JOIN TB_ORDER_DETAIL OD ON O.ORD_NO = OD.ORD_NO 
 			                INNER JOIN TB_ORDER_DETAIL_ITEM ODI ON OD.ORD_DTL_NO = ODI.ORD_DTL_NO 
 			                  					 AND OD.ORD_DTL_NO = ODI.ORD_DTL_NO
@@ -927,6 +932,7 @@
 			      ,B.BRAND_ENM 
 		)F
 		ORDER BY F.PAY_DT DESC
+		<include refid="selectForPagingFooter"/>
 	</select>
 	
 	<select id="getReviewAttach" parameterType="Review" resultType="Review">

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

@@ -105,4 +105,6 @@ CANCEL_0001=\uC8FC\uBB38 \uCDE8\uC18C\uAC00 \uC644\uB8CC\uB418\uC5C8\uC2B5\uB2C8
 #\uBC30\uC1A1
 DELV_0001=\uC815\uC0C1\uC801\uC73C\uB85C \uBC30\uC1A1\uC9C0\uAC00 \uC218\uC815\uB418\uC5C8\uC2B5\uB2C8\uB2E4.
 DELV_0002=\uC815\uC0C1\uC801\uC73C\uB85C \uBC30\uC1A1\uBA54\uBAA8\uAC00 \uC218\uC815\uB418\uC5C8\uC2B5\uB2C8\uB2E4.
+DELV_0003=\uC815\uC0C1\uC801\uC73C\uB85C \uD68C\uC218\uC9C0\uAC00 \uC218\uC815\uB418\uC5C8\uC2B5\uB2C8\uB2E4.
+DELV_0004=\uC815\uC0C1\uC801\uC73C\uB85C \uBC18\uD488\uBA54\uBAA8\uAC00 \uC218\uC815\uB418\uC5C8\uC2B5\uB2C8\uB2E4.
 

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

@@ -47,6 +47,9 @@
 						</div>
 						<div class="right">
 							<ul>
+								<li>
+									<a href="javascript:void(0)" onclick="cfnGoToPage(_PAGE_CUSTOMER_JOIN_TYPE);">회원가입</a>
+								</li>
 								<li>
 									<a href="javascript:void(0)" onclick="cfnGoToPage(_PAGE_CUSTOMER_ID_FIND);">아이디찾기</a>
 								</li>

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

@@ -14,7 +14,7 @@
 					<div class="goods_detail">
 						<a href="javascript:;">
 							<th:block th:if="${setType.equals(cart.goodsType) or cart.selfGoodsYn.equals('N')}">
-								<span class="thumb_box" th:each="img, index : ${cart.cartImgList}">
+								<span class="thumb_box" th:each="img, index : ${cart.cartImgList}" th:if="${'Y'.equals(img.defaultImgYn)}">
 									<img th:src="${cart.imgPath + '/' + img.sysImgNm} + '?RS=100'" src="/" th:onerror="'this.src=\''+@{${uxImgUrl}+ '/images/pc/thumb/bg_item_none.png'}+'\';'"  th:alt="${img.sysImgNm}" alt="" />
 								</span>
 							</th:block>
@@ -22,7 +22,7 @@
 								<th:block th:each="comp, status : ${cart.cartCompsList}">
 									<th:block th:each="color, index : ${comp.cartColorList}">
 										<th:block th:if="${color.cartOptCd1 != null and color.cartOptCd1.equals(color.optCd1)}">
-											<span class="thumb_box" th:each="img, index : ${color.cartImgList}" th:if="${img.colorCd == color.cartOptCd1}">
+											<span class="thumb_box" th:each="img, index : ${color.cartImgList}" th:if="${img.colorCd == color.cartOptCd1 and 'Y'.equals(img.defaultImgYn)}">
 												<img th:src="${cart.imgPath + '/' + img.sysImgNm} + '?RS=100'" src="/" th:onerror="'this.src=\''+@{${uxImgUrl}+ '/images/pc/thumb/bg_item_none.png'}+'\';'"  th:alt="${img.sysImgNm}" alt="" />
 											</span>
 										</th:block>
@@ -217,7 +217,7 @@
 			</div>
 		</div>
 		<div class="btn_group_block">
-			<button class="btn btn_dark btn_block" th:onclick="|fnChangeCartOption(${cart.cartSq})|"><span>옵션변경</span></button>
+			<button class="btn btn_dark btn_block" th:onclick="|fnChangeCartOption(${cart.cartSq}); return false;|"><span>옵션변경</span></button>
 		</div>
 	</div>
 </div>
@@ -377,6 +377,7 @@
 			success : function(result) {
 				mcxDialog.alert(result.message);
 				$(".closeCartOptionModal").trigger("click");
+				$("body").css("overflow", "");
 				if(result.status == "SUCCESS") {
 					let data = {shotDelvUseYn : $("input[name=shotDelvUseYn]:checked").val()};
 					getCartList(data);

+ 141 - 120
src/main/webapp/WEB-INF/views/mob/cart/CartListAjaxFormMob.html

@@ -15,6 +15,9 @@
  -->
 <body>
 <th:block layout:fragment="content">
+	<!-- 즉시구매 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">
@@ -125,10 +128,8 @@
 									<p class="point"><span th:text="${#numbers.formatInteger(cart.savePntAmt, 1, 'COMMA')}"></span>P 적립예정</p>
 								</div>
 								<div class="od_exinfo">
-									<span th:if="${cart.qtyTmtbSq > 0 and cart.applyQtySectionYn == 'Y'}" class="btn_moresale order_badge order_bullet_badge">다다익선 할인 적용</span>
-									<span th:if="${cart.amtTmtbSq > 0 and cart.applyAmtSectionYn == 'Y'}" class="btn_moresale order_badge order_bullet_badge">다다익선 할인 적용</span>
-									<a th:if="${cart.qtyTmtbSq > 0 and cart.applyQtySectionYn == 'N'}" href="javascript:;" id="btn_moresale_pop" class="btn_moresale btn_moresale_pop order_badge order_bullet_badge">다다익선 할인 대상</a>
-									<a th:if="${cart.amtTmtbSq > 0 and cart.applyAmtSectionYn == 'N'}" href="javascript:;" id="btn_moresale_pop" class="btn_moresale btn_moresale_pop order_badge order_bullet_badge">다다익선 할인 대상</a>
+									<span th:if="${(cart.qtyTmtbSq > 0 and cart.applyQtySectionYn == 'Y') or (cart.amtTmtbSq > 0 and cart.applyAmtSectionYn == 'Y')}" class="applyTmtb btn_moresale order_badge order_bullet_badge">다다익선 할인 적용</span>
+									<a th:if="${(cart.qtyTmtbSq > 0 and cart.applyQtySectionYn == 'N') or (cart.amtTmtbSq > 0 and cart.applyAmtSectionYn == 'N')}" href="javascript:;" id="btn_moresale_pop" class="notApplyTmtb btn_moresale btn_moresale_pop order_badge order_bullet_badge">다다익선 할인 대상</a>
 								</div>
 							</div>
 						</div>
@@ -148,7 +149,7 @@
 							<div><button type="button" class="btn btn_default btn_option_pop01" th:onclick="|fnChangeCartOptCd(${cart.cartSq})|" th:disabled="${cart.ordCanYn.equals('N')}"><span>옵션/수량변경</span></button></div> <!-- 옵션변경_팝업01 호출 -->
 							<div>
 								<button th:if="${cart.soldoutYn.equals('Y') or cart.ordCanYn.equals('N')}" type="button" class="btn btn_primary_line" disabled=""><span>구매 불가</span></button>
-								<button th:if="${cart.soldoutYn.equals('N') and cart.ordCanYn.equals('Y')}" type="button" class="btn btn_primary_line"><span>바로주문</span></button>
+								<button th:if="${cart.soldoutYn.equals('N') and cart.ordCanYn.equals('Y')}" type="button" class="btn btn_primary_line" th:onclick="|fnSubmitNoMember(${cart.cartSq})|"><span>바로주문</span></button>
 							</div> <!-- 210406_ID 추가 -->
 						</div>
 
@@ -225,10 +226,8 @@
 									<p class="point"><span th:text="${#numbers.formatInteger(cart.savePntAmt, 1, 'COMMA')}"></span>P 적립예정</p>
 								</div>
 								<div class="od_exinfo">
-									<span th:if="${cart.qtyTmtbSq > 0 and cart.applyQtySectionYn == 'Y'}" class="btn_moresale order_badge order_bullet_badge">다다익선 할인 적용</span>
-									<span th:if="${cart.amtTmtbSq > 0 and cart.applyAmtSectionYn == 'Y'}" class="btn_moresale order_badge order_bullet_badge">다다익선 할인 적용</span>
-									<a th:if="${cart.qtyTmtbSq > 0 and cart.applyQtySectionYn == 'N'}" href="javascript:;" id="btn_moresale_pop" class="btn_moresale btn_moresale_pop order_badge order_bullet_badge">다다익선 할인 대상</a>
-									<a th:if="${cart.amtTmtbSq > 0 and cart.applyAmtSectionYn == 'N'}" href="javascript:;" id="btn_moresale_pop" class="btn_moresale btn_moresale_pop order_badge order_bullet_badge">다다익선 할인 대상</a>
+									<span th:if="${(cart.qtyTmtbSq > 0 and cart.applyQtySectionYn == 'Y') or (cart.amtTmtbSq > 0 and cart.applyAmtSectionYn == 'Y')}" class="applyTmtb btn_moresale order_badge order_bullet_badge">다다익선 할인 적용</span>
+									<a th:if="${(cart.qtyTmtbSq > 0 and cart.applyQtySectionYn == 'N') or (cart.amtTmtbSq > 0 and cart.applyAmtSectionYn == 'N')}" href="javascript:;" id="btn_moresale_pop" class="notApplyTmtb btn_moresale btn_moresale_pop order_badge order_bullet_badge">다다익선 할인 대상</a>
 								</div>
 							</div>
 						</div>
@@ -248,7 +247,7 @@
 							<div><button type="button" class="btn btn_default btn_option_pop01" th:onclick="|fnChangeCartOptCd(${cart.cartSq})|" th:disabled="${cart.ordCanYn.equals('N')}"><span>옵션/수량변경</span></button></div> <!-- 옵션변경_팝업01 호출 -->
 							<div>
 								<button th:if="${cart.soldoutYn.equals('Y') or cart.ordCanYn.equals('N')}" type="button" class="btn btn_primary_line" disabled=""><span>구매 불가</span></button>
-								<button th:if="${cart.soldoutYn.equals('N') and cart.ordCanYn.equals('Y')}" type="button" class="btn btn_primary_line"><span>바로주문</span></button>
+								<button th:if="${cart.soldoutYn.equals('N') and cart.ordCanYn.equals('Y')}" type="button" class="btn btn_primary_line" th:onclick="|fnSubmitNoMember(${cart.cartSq})|"><span>바로주문</span></button>
 							</div> <!-- 210406_ID 추가 -->
 						</div>
 
@@ -273,13 +272,13 @@
 				<!-- 일반 배송 -->
 
 				<!-- 자사 배송비 -->
-				<div class="goods_txt selfGoodsDelv" th:classappend="|delv_${order.cartDelvFeeCd}|">
-					<span class="dlvr_fee" th:if="${order.wmsDelvFee == 0}">배송비 무료</span>
-					<span class="dlvr_fee" th:if="${order.wmsDelvFee > 0}">배송비&nbsp;<em th:text="${#numbers.formatInteger(order.wmsDelvFee, 1, 'COMMA')}"></em>원</span>
+				<div class="goods_txt selfGoodsDelv delvArea" th:classappend="|delv_${order.cartDelvFeeCd}|" th:style="${'Y'.equals(order.delvYn) ? 'display:block' : 'display:none'}">
+					<span class="dlvr_fee delvFeeArea" th:if="${order.wmsDelvFee == 0}">배송비 무료</span>
+					<span class="dlvr_fee delvFeeArea" th:if="${order.wmsDelvFee > 0}">배송비&nbsp;<em th:text="${#numbers.formatInteger(order.wmsDelvFee, 1, 'COMMA')}"></em>원</span>
 					<span>STYLE24  배송</span>
 				</div>
 
-				<div class="goods_dlvr_save" th:if="${order.wmsDelvFee > 0}">
+				<div class="goods_dlvr_save" th:style="${'Y'.equals(order.delvYn) and order.wmsDelvFee > 0 ? 'display:block' : 'display:none'}">
 					<a href="javascript:;" id="btn_dlvrSave_pop" class="btn_popup_save">배송비 SAVE 상품 보기</a>
 				</div>
 			</div>
@@ -293,7 +292,7 @@
 					<div class="goods_date">업체직 배송</div>
 				</div>
 				<!-- 업체직배송 -->
-				<div class="goods_area">
+				<div class="goods_area delvList">
 					<div class="goods_section delvCartInfo cartInfo" th:each="cart, status : ${order.delvCartList}">
 						<input type="hidden" name="applyQtySectionYn" th:value="${cart.applyQtySectionYn}" />
 						<input type="hidden" name="applyAmtSectionYn" th:value="${cart.applyAmtSectionYn}" />
@@ -345,10 +344,8 @@
 									<p class="point"><span th:text="${#numbers.formatInteger(cart.savePntAmt, 1, 'COMMA')}"></span>P 적립예정</p>
 								</div>
 								<div class="od_exinfo">
-									<span th:if="${cart.qtyTmtbSq > 0 and cart.applyQtySectionYn == 'Y'}" class="btn_moresale order_badge order_bullet_badge">다다익선 할인 적용</span>
-									<span th:if="${cart.amtTmtbSq > 0 and cart.applyAmtSectionYn == 'Y'}" class="btn_moresale order_badge order_bullet_badge">다다익선 할인 적용</span>
-									<a th:if="${cart.qtyTmtbSq > 0 and cart.applyQtySectionYn == 'N'}" href="javascript:;" id="btn_moresale_pop" class="btn_moresale btn_moresale_pop order_badge order_bullet_badge">다다익선 할인 대상</a>
-									<a th:if="${cart.amtTmtbSq > 0 and cart.applyAmtSectionYn == 'N'}" href="javascript:;" id="btn_moresale_pop" class="btn_moresale btn_moresale_pop order_badge order_bullet_badge">다다익선 할인 대상</a>
+									<span th:if="${(cart.qtyTmtbSq > 0 and cart.applyQtySectionYn == 'Y') or (cart.amtTmtbSq > 0 and cart.applyAmtSectionYn == 'Y')}" class="applyTmtb btn_moresale order_badge order_bullet_badge">다다익선 할인 적용</span>
+									<a th:if="${(cart.qtyTmtbSq > 0 and cart.applyQtySectionYn == 'N') or (cart.amtTmtbSq > 0 and cart.applyAmtSectionYn == 'N')}" href="javascript:;" id="btn_moresale_pop" class="notApplyTmtb btn_moresale btn_moresale_pop order_badge order_bullet_badge">다다익선 할인 대상</a>
 								</div>
 							</div>
 						</div>
@@ -368,7 +365,7 @@
 							<div><button type="button" class="btn btn_default" th:onclick="|fnChangeCartOptCd(${cart.cartSq})|" th:disabled="${cart.ordCanYn.equals('N')}"><span>옵션/수량변경</span></button></div>
 							<div>
 								<button th:if="${cart.soldoutYn.equals('Y') or cart.ordCanYn.equals('N')}" type="button" class="btn btn_primary_line" disabled=""><span>구매 불가</span></button>
-								<button th:if="${cart.soldoutYn.equals('N') and cart.ordCanYn.equals('Y')}" type="button" class="btn btn_primary_line"><span>바로주문</span></button>
+								<button th:if="${cart.soldoutYn.equals('N') and cart.ordCanYn.equals('Y')}" type="button" class="btn btn_primary_line" th:onclick="|fnSubmitNoMember(${cart.cartSq})|"><span>바로주문</span></button>
 							</div>
 						</div>
 
@@ -390,13 +387,13 @@
 						</div>
 
 						<!-- 입점업체 배송비 -->
-						<div class="goods_txt" th:if="${'Y'.equals(cart.addDelvFeeYn)}" th:classappend="|delv_${cart.delvFeeCd}|">
-							<span class="dlvr_fee" th:if="${order.wmsDelvFee == 0}">배송비 무료</span>
-							<span class="dlvr_fee" th:if="${order.wmsDelvFee > 0}">배송비&nbsp;<em th:text="${#numbers.formatInteger(order.wmsDelvFee, 1, 'COMMA')}"></em>원</span>
+						<div class="goods_txt delvArea" th:if="${'Y'.equals(cart.addDelvFeeYn)}" th:classappend="|delv_${cart.delvFeeCd}|" th:style="${'Y'.equals(cart.delvYn) ? 'display:block' : 'display:none'}">
+							<span class="dlvr_fee delvFeeArea" th:if="${order.wmsDelvFee == 0}">배송비 무료</span>
+							<span class="dlvr_fee delvFeeArea" th:if="${order.wmsDelvFee > 0}">배송비&nbsp;<em th:text="${#numbers.formatInteger(order.wmsDelvFee, 1, 'COMMA')}"></em>원</span>
 							<span th:text="|${cart.supplyCompNm} 업체직배송|"></span>
 						</div>
 
-						<div class="goods_dlvr_save" th:if="${'Y'.equals(cart.addDelvFeeYn) and cart.delvFee > 0}">
+						<div class="goods_dlvr_save" th:if="${'Y'.equals(cart.addDelvFeeYn)}" th:style="${'Y'.equals(cart.delvYn) and cart.delvFee > 0 ? 'display:block' : 'display:none'}">
 							<a href="javascript:;" id="btn_dlvrSave_pop" class="btn_popup_save">배송비 SAVE 상품 보기</a>
 						</div>
 					</div>
@@ -410,7 +407,7 @@
 				<div class="tit_box">
 					<h3>결제 정보</h3>
 					<span>
-						<em class="number" th:text="${order.totCartCnt}"></em>개의 상품
+						<em class="number checkSelectCartListCnt" th:text="${order.totCartCnt}"></em>개의 상품
 					</span>
 				</div>
 				<div class="od_amount_box">
@@ -620,7 +617,7 @@
 			</div>
 			<div class="od_calc_wrap" id="bottomOrderArea">
 				<button type="button" class="btn btn_dark"><span>합계 <em class="realOrderAmtText" th:text="${#numbers.formatInteger(order.sumRealPayAmt + order.totDelvFee, 1, 'COMMA')}">0</em>원</span></button>
-				<button type="button" id="btn_purchase" class="btn btn_primary"><span>구매하기 (<em class="realOrderQtyText" th:text="${order.totCartCnt}"></em>개)</span></button> <!-- 210406_ID 추가 -->
+				<button type="button" id="btn_purchase" class="btn btn_primary" onclick="fnSubmitNoMember('all'); return false;"><span>구매하기 (<em class="realOrderQtyText" th:text="${order.totCartCnt}"></em>개)</span></button> <!-- 210406_ID 추가 -->
 			</div>
 		</div>
 
@@ -629,9 +626,12 @@
 			<div class="modal-dialog" role="document">
 				<div class="modal-content">
 					<div class="modal-header">
-						<h5 class="modal-title" id="couponInfoLabel"></h5>
+						<h5 class="modal-title" id="couponInfoLabel">사용안내</h5>
 					</div>
 					<div class="modal-body">
+						<div class="pop_head">
+							<h6 class="serialCpnNm"></h6>
+						</div>
 						<div class="pop_cont">
 							<dl>
 								<div>
@@ -664,21 +664,29 @@
 		<!-- //옵션변경 팝업 -->
 
 		<script th:inline="javascript">
-			let sumRealPayAmt = [[${order.sumRealPayAmt + order.totDelvFee}]];
-			let totDcAmt = [[${order.totDcAmt}]];
-			let loginInfo = [[${loginInfo}]];
-			let orderFlag = true;
+			var sumRealPayAmt = [[${order.sumRealPayAmt + order.totDelvFee}]];
+			var totDcAmt = [[${order.totDcAmt}]];
+			var loginInfo = new Object();
+			var orderFlag = true;
+
+			function setLoginInfo() {
+				gagajf.ajaxJsonSubmit("/cart/login/info", null, function (result) {
+					loginInfo = result;
+
+					if (!loginInfo || loginInfo.custNo == null || loginInfo.custNo == 0) {
+						$("#cartListForm .area_salecoupon").hide();
+					}
+				});
+			};
 
 			$(document).ready(function() {
+				setLoginInfo();
+
 				if([[${!order.shotCanYn.equals('Y')}]]) {
 					//$(".shotDelvSelect").hide();
 				}
 
 				$("#cartListForm .area_salecoupon .coupon_box").hide();
-
-				if(!loginInfo || loginInfo.custNo == null || loginInfo.custNo == 0) {
-					$("#cartListForm .area_salecoupon").parent().hide();
-				}
 			});
 
 			function cancelCartCpn() {
@@ -766,7 +774,7 @@
 							}
 							refValComment += "일부상품, 특가상품 제외";
 
-							$(".cartCpnInfoModal .modal-header").html('<h5 class="modal-title" id="couponInfoLabel">' + cpnInfo.cpnNm + '</h5>');
+							$(".cartCpnInfoModal .modal-body .pop_head h6").text(cpnInfo.cpnNm);
 
 							if(conditionComment != "") { $(".cartCpnInfoModal .cpnCondition").html(conditionComment); }
 							else { $(".cartCpnInfoModal .cartCpnCondition").hide(); }
@@ -795,8 +803,13 @@
 					cartArr.push($(this).val());
 				});
 
+				if(cartArr.length == 0) {
+					cartArr.push(0);
+					$("#cartListForm .part_goods .goods_dlvr_save").hide();
+				}
+
 				// 선택된 장바구니 정보 가공
-				let data = {	cartSqArr : cartArr }
+				let data = {	cartSqArr : cartArr, shotDelvUseYn : $("input[name=shotDelvUseYn]:checked").val() }
 				let jsonData = JSON.stringify(data);
 
 				$.ajax( {
@@ -821,41 +834,37 @@
 				$("#cartListForm .applyTmtb").hide();
 				$("#cartListForm .notApplyTmtb").hide();
 
+				// 배송비 정보 0원으로 모두 변경 (체크 되지 않은 업체는 0원처리)
+				$("#cartListForm .delvArea .delvFeeArea").text("배송비 0원");
+
 				// 장바구니 각 상품 가격 정보 할인 전으로 변경
 				$("#cartListForm .cartInfo input[name=cartSq]").each(function() {
-					if($(this).parent().find(".calc_box .price_org").text() != "") {
-						$(this).parent().find(".calc_box .price_sale").text($(this).parent().find(".calc_box .price_org").text());
-						$(this).parent().find(".calc_box .price_org").remove();
+					if($(this).parent().find(".od_calc .sale_price>del>em").text() != "") {
+						$(this).parent().find(".od_calc .selling_price>em").text($(this).parent().find(".od_calc .sale_price>del>em").text());
+						$(this).parent().find(".od_calc .sale_price").hide();
 					}
 				});
 
-				$("#cartListForm").find(".delvFeeArea").html("<div class='info_dlvr'><span class='dlvr_fee'>배송비 무료</span></div>");
 				for(let i = 0 ; i < shotList.length ; i++) {
 					cartList.push(shotList[i]);
 					$("#cartListForm .shotCartInfo input[name=cartSq]").each(function() {
 						if(shotList[i].cartSq == $(this).val()) {
 							let shot = shotList[i];
-							$(this).parent().find(".od_moresale .applyTmtbNm > ul").html("");
-							$(this).parent().find(".od_moresale .notApplyTmtbNm > ul").html("");
 
 							// 다다익선 적용 정보 생성성
-							if(shot.qtyTmtbSq > 0 && shot.applyQtySectionYn == "Y") {
+							if((shot.qtyTmtbSq > 0 && shot.applyQtySectionYn == "Y") || (shot.amtTmtbSq > 0 && shot.applyAmtSectionYn == "Y")) {
 								$(this).parent().find(".applyTmtb").show();
 							}
-							if(shot.amtTmtbSq > 0 && shot.applyAmtSectionYn == "Y") {
-								$(this).parent().find(".applyTmtb").show();
-							}
-							if(shot.qtyTmtbSq > 0 && shot.applyQtySectionYn == "N") {
-								$(this).parent().find(".notApplyTmtb").show();
-							}
-							if(shot.amtTmtbSq > 0 && shot.applyAmtSectionYn == "N") {
+
+							if((shot.qtyTmtbSq > 0 && shot.applyQtySectionYn == "N") || (shot.amtTmtbSq > 0 && shot.applyAmtSectionYn == "N")) {
 								$(this).parent().find(".notApplyTmtb").show();
 							}
 
 							// 다다익선 할인가 적용
 							if(shot.tmtbDcAmt < shot.currPrice) {
-								$(this).parent().find(".calc_box .price_sale").text(Number(shot.tmtbDcAmt).toLocaleString() + " 원");
-								$(this).parent().find(".calc_box").prepend("<p><span class='price_org'><em>" + Number(shot.currPrice).toLocaleString() + "</em>원</span></p>");
+								$(this).parent().find(".od_calc .selling_price>em").text(Number(shot.tmtbDcAmt).toLocaleString());
+								$(this).parent().find(".od_calc .sale_price>del>em").text(Number(shot.currPrice).toLocaleString());
+								$(this).parent().find(".od_calc .sale_price").show();
 								$(this).parent().find("input[name=tmtbDcAmt]").val(shot.tmtbDcAmt);
 							}
 						}
@@ -871,23 +880,18 @@
 							$(this).parent().find(".od_moresale .notApplyTmtbNm > ul").html("");
 
 							// 다다익선 적용 정보 생성성
-							if(wms.qtyTmtbSq > 0 && wms.applyQtySectionYn == "Y") {
-								$(this).parent().find(".applyTmtb").show();
-							}
-							if(wms.amtTmtbSq > 0 && wms.applyAmtSectionYn == "Y") {
+							if((wms.qtyTmtbSq > 0 && wms.applyQtySectionYn == "Y") || (wms.amtTmtbSq > 0 && wms.applyAmtSectionYn == "Y")) {
 								$(this).parent().find(".applyTmtb").show();
 							}
-							if(wms.qtyTmtbSq > 0 && wms.applyQtySectionYn == "N") {
-								$(this).parent().find(".notApplyTmtb").show();
-							}
-							if(wms.amtTmtbSq > 0 && wms.applyAmtSectionYn == "N") {
+							if((wms.qtyTmtbSq > 0 && wms.applyQtySectionYn == "N") || (wms.amtTmtbSq > 0 && wms.applyAmtSectionYn == "N")) {
 								$(this).parent().find(".notApplyTmtb").show();
 							}
 
 							// 다다익선 할인가 적용
 							if(wms.tmtbDcAmt < wms.currPrice) {
-								$(this).parent().find(".calc_box .price_sale").text(Number(wms.tmtbDcAmt).toLocaleString() + " 원");
-								$(this).parent().find(".calc_box").prepend("<p><span class='price_org'><em>" + Number(wms.currPrice).toLocaleString() + "</em>원</span></p>");
+								$(this).parent().find(".od_calc .selling_price>em").text(Number(wms.tmtbDcAmt).toLocaleString());
+								$(this).parent().find(".od_calc .sale_price>del>em").text(Number(wms.currPrice).toLocaleString());
+								$(this).parent().find(".od_calc .sale_price").show();
 								$(this).parent().find("input[name=tmtbDcAmt]").val(wms.tmtbDcAmt);
 							}
 						}
@@ -895,11 +899,14 @@
 				}
 
 				// 자사 상품 배송비
-				if(order.wmsDelvFee == 0) {
-					$(".selfGoodsDelv").html("<span class='dlvr_fee'>배송비 무료</span>");
-				} else {
-					let html = "<span class='dlvr_fee'>배송비 <em>" + Number(order.wmsDelvFee).toLocaleString() + "</em> 원</span><a href='#' class='btn_popup_save'>배송비 SAVE 상품 보기</a>";
-					$(".selfGoodsDelv").html(html);
+				if(order.delvYn == "Y") {
+					if (order.wmsDelvFee == 0) {
+						$(".selfGoodsDelv").html("<span class='dlvr_fee delvFeeArea'>배송비 무료</span>");
+					} else {
+						let html = "<span class='dlvr_fee delvFeeArea'>배송비 <em>" + Number(order.wmsDelvFee).toLocaleString() + "</em> 원</span><span>STYLE24  배송</span>";
+						$(".selfGoodsDelv").parent().find(".goods_dlvr_save").show();
+						$(".selfGoodsDelv").html(html);
+					}
 				}
 
 				for(let i = 0 ; i < delvList.length ; i++) {
@@ -911,29 +918,25 @@
 							$(this).parent().find(".od_moresale .notApplyTmtbNm > ul").html("");
 
 							// 다다익선 적용 정보 생성성
-							if(delv.qtyTmtbSq > 0 && delv.applyQtySectionYn == "Y") {
+							if((delv.qtyTmtbSq > 0 && delv.applyQtySectionYn == "Y") || (delv.amtTmtbSq > 0 && delv.applyAmtSectionYn == "Y")) {
 								$(this).parent().find(".applyTmtb").show();
 							}
-							if(delv.amtTmtbSq > 0 && delv.applyAmtSectionYn == "Y") {
-								$(this).parent().find(".applyTmtb").show();
-							}
-							if(delv.qtyTmtbSq > 0 && delv.applyQtySectionYn == "N") {
+							if((delv.qtyTmtbSq > 0 && delv.applyQtySectionYn == "N") || (delv.amtTmtbSq > 0 && delv.applyAmtSectionYn == "N")) {
 								$(this).parent().find(".notApplyTmtb").show();
 							}
-							if(delv.amtTmtbSq > 0 && delv.applyAmtSectionYn == "N") {
-							}
 
 							// 다다익선 할인가 적용
 							if(delv.tmtbDcAmt < delv.currPrice) {
-								$(this).parent().find(".calc_box .price_sale").text(Number(delv.tmtbDcAmt).toLocaleString() + " 원");
-								$(this).parent().find(".calc_box").prepend("<p><span class='price_org'><em>" + Number(delv.currPrice).toLocaleString() + "</em>원</span></p>");
+								$(this).parent().find(".od_calc .selling_price>em").text(Number(delv.tmtbDcAmt).toLocaleString());
+								$(this).parent().find(".od_calc .sale_price>del>em").text(Number(delv.currPrice).toLocaleString());
 								$(this).parent().find("input[name=tmtbDcAmt]").val(delv.tmtbDcAmt);
 							}
 
 							if(delv.delvFee == 0) {
-								$(".delvList").find(".delv_" + delv.delvFeeCd).html("<span class='dlvr_fee'>배송비 무료</span><span class='dlvr_fee'><em>" + delv.supplyCompNm + "</em> 업체직배송</span>");
+								$(".delvList").find(".delv_" + delv.delvFeeCd).html("<span class='dlvr_fee delvFeeArea'>배송비 무료</span><span class='dlvr_fee'><em>" + delv.supplyCompNm + "</em> 업체직배송</span>");
 							} else {
-								let html = "<div className='order_delivery'><span class='dlvr_fee'>배송비 <em>" + Number(delv.delvFee).toLocaleString() + "</em>원</span><span class='dlvr_shop'><em>" + delv.supplyCompNm + "</em> 업체직배송</span><a href='#' className='btn_popup_save'>배송비 SAVE 상품 보기</a></div>";
+								let html = "<span class='dlvr_fee delvFeeArea'>배송비 <em>" + Number(delv.delvFee).toLocaleString() + "</em>원</span><span class='dlvr_shop'><em>" + delv.supplyCompNm + "</em> 업체직배송</span>";
+								$(".delvList").find(".delv_" + delv.delvFeeCd).parent().find(".goods_dlvr_save").show();
 								$(".delvList").find(".delv_" + delv.delvFeeCd).html(html);
 							}
 						}
@@ -1070,9 +1073,11 @@
 				let cartSqArr = [];
 				orderFlag = true;
 
-				if($("#cartListForm input[name=cartSqArr]:checked").length < 1) {
-					mcxDialog.alert("구매하실 상품을 선택해주세요.");
-					return false;
+				if(cartSq == 'all') {
+					if($("#cartListForm input[name=cartSqArr]:checked").length < 1) {
+						mcxDialog.alert("구매하실 상품을 선택해주세요.");
+						return false;
+					}
 				}
 
 				if(loginInfo == null || loginInfo.custNo == null || loginInfo.custNo == 0) {
@@ -1173,42 +1178,10 @@
 			$("#od_item_all").on("change", function() {
 				if($("#od_item_all").is(":checked")) {
 					$("input[name=cartSqArr]").prop("checked", true);
-					changeCartSqArr();
 				} else {
 					$("input[name=cartSqArr]").prop("checked", false);
-					// 하단 합계금액, 구매하기 수량 변경
-					$("#cartListForm .realOrderAmtText").text("0");
-					$("#cartListForm .realOrderQtyText").text("0");
-					$("#cartListForm .area_order .number").text("0");
-					$("#cartListForm .od_amount_box .sumListPrice").text("0");
-					$("#cartListForm .od_amount_box .totDelvFee").text("0");
-					$("#cartListForm .od_amount_box .totDcAmt").text("0");
-					$("#cartListForm .totalprice_box .sumRealPayAmt").text("0");
 				}
-			});
-
-			//수량조절 이벤트
-			$(document).on('click','.optModifyPop01 .number_count .minus',function(e){
-				var $input = $(this).parent().find('input');
-				var count = parseInt($input.val()) - 1;
-				count = count < 1 ? 1 : count;
-				$input.val(count);
-				$input.change();
-				//수량1개 이하 감소버튼 비활성화
-				if ($input.val() == 1) {
-					$('.optModifyPop01 .number_count .minus').addClass('min_val');
-				}
-				return false;
-			}).on('click','.optModifyPop01 .number_count .plus',function(e){
-				var $input = $(this).parent().find('input');
-				$input.val(parseInt($input.val()) + 1);
-				$input.change();
-				//수량2개 이상부터 감소버튼 활성화
-				$('.optModifyPop01 .number_count .minus').removeClass('min_val');
-				return false;
-			}).on('keyup','.optModifyPop01 .number_count input[type=text]',function(e){
-				//텍스트, 0 입력금지
-				$(this).val($(this).val().replace(/[^1-9]/g,""));
+				changeCartSqArr();
 			});
 
 			/* 팝업 - 옵션변경 > 컬러선택 표기 */
@@ -1220,11 +1193,59 @@
 				return false;
 			});
 
-			/* 쿠폰정보 닫기 */
-			function cancelCartCpn() {
-				$("#cartListForm #sumRealPayAmt").text(Number(sumRealPayAmt).toLocaleString());
-				$("#cartListForm #totDcAmt").text(Number(totDcAmt).toLocaleString());
-				$("#cartListForm .area_salecoupon .coupon_box").hide();
+			function deleteCartAjax(cartArr, menu) {
+				if(cartArr.length < 1) {
+					mcxDialog.alert("삭제하실 상품을 선택해 주세요.");
+					return false;
+				}
+
+				let data = {
+					cartSqArr : cartArr
+				}
+
+				let jsonData = JSON.stringify(data);
+
+				$.ajax( {
+					type: "POST",
+					url : '/cart/deleteCart',
+					contentType: 'application/json',
+					dataType : 'json',
+					data : jsonData,
+					success : function(result) {
+						mcxDialog.alert("삭제 되었습니다.");
+						let data = {shotDelvUseYn : $("input[name=shotDelvUseYn]:checked").val()};
+						getCartList(data);
+					}
+				});
+			}
+
+			function deleteCart(gbn, menu) {
+				let cartArr = [];
+				let confirmMessage = "";
+				if(gbn == "SELECT") {
+					$("#cartListForm input[name=cartSqArr]:checked").each(function () {
+						cartArr.push($(this).val());
+					});
+
+					if(cartArr.length < 1) {
+						mcxDialog.alert("선택된 상품이 없습니다.");
+						return false;
+					}
+
+					confirmMessage = "총 " + cartArr.length + "개의 상품을 삭제합니다.";
+				} else {
+					cartArr.push(gbn);
+					deleteCartAjax(cartArr, menu);
+					return false;
+				}
+
+				mcxDialog.confirm(confirmMessage, {
+					cancelBtnText: "취소/닫기",			//취소 또는 닫기 버튼명
+					sureBtnText  : "확인",				//처리문 버튼명
+					sureBtnClick : function () {
+						deleteCartAjax(cartArr, menu);
+					}
+				});
 			}
 		</script>
 	</form>

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

@@ -154,6 +154,30 @@
 			$("body").css({"overflow":"visible"});
 		});
 
+		//수량조절 이벤트
+		$(document).on('click','.optModifyPop01 .number_count .minus',function(e){
+			var $input = $(this).parent().find('input');
+			var count = parseInt($input.val()) - 1;
+			count = count < 1 ? 1 : count;
+			$input.val(count);
+			$input.change();
+			//수량1개 이하 감소버튼 비활성화
+			if ($input.val() == 1) {
+				$('.optModifyPop01 .number_count .minus').addClass('min_val');
+			}
+			return false;
+		}).on('click','.optModifyPop01 .number_count .plus',function(e){
+			var $input = $(this).parent().find('input');
+			$input.val(parseInt($input.val()) + 1);
+			$input.change();
+			//수량2개 이상부터 감소버튼 활성화
+			$('.optModifyPop01 .number_count .minus').removeClass('min_val');
+			return false;
+		}).on('keyup','.optModifyPop01 .number_count input[type=text]',function(e){
+			//텍스트, 0 입력금지
+			$(this).val($(this).val().replace(/[^1-9]/g,""));
+		});
+
 		//팝업 - 쿠폰사용안내
 		$(document).on('click','#btn_couponInfo_pop',function(e){
 			//$("#couponInfoPop .modal-content").load("popup_couponInfo.html");

+ 5 - 10
src/main/webapp/WEB-INF/views/mob/common/fragments/GnbSubMob.html

@@ -15,18 +15,13 @@
  *******************************************************************************
  -->
 <th:block th:fragment="gnb">
+	<a href="#mainCon" class="skipNav">본문바로가기</a>
 	<header class=""> <!-- 서브페이지에서는 <header>의 클래스.main 제거 -->
-		<a href="#mainCon" class="skipNav">본문바로가기</a>
-		
-		<section class="htop" id="htopSub" style="background: #fff;">
+		<section class="htop" id="htopSub">
 			<button class="btn_back" title="이전페이지로">
-				<span>
-					<i class="gl1"></i>
-					<i class="gl2"></i>
-					<i class="gl3"></i>
-				</span>
+				<span><i class="gl1"></i><i class="gl2"></i><i class="gl3"></i></span>
 			</button>
-			<h1 id="htopTitle">고객센터</h1>
+			<h1 id="htopTitle"></h1>
 		</section>
 	</header>
 	
@@ -38,4 +33,4 @@
 
 </th:block>
 
-</html>
+</html>

+ 48 - 0
src/main/webapp/WEB-INF/views/mob/common/layout/MypageLayoutMob.html

@@ -0,0 +1,48 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org"
+	xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout">
+
+<head th:replace="~{mob/common/fragments/HeadMob :: head}"></head>
+
+<body>
+
+	<th:block th:replace="~{mob/common/fragments/VariablesMob :: variables}"></th:block>
+	
+	<div class="app">
+		<!-- GNB -->
+		<th:block th:replace="~{mob/common/fragments/GnbSubMob :: gnb}"></th:block>
+		<!--// GNB -->
+
+		<!-- CONTENT AREA -->
+		<th:block layout:fragment="content"></th:block>
+		<!-- // CONTENT AREA -->
+
+		<!-- Footer -->
+		<th:block th:replace="~{mob/common/fragments/FooterMob :: footer}"></th:block>
+
+		<th:block th:replace="~{mob/common/fragments/ScriptsMob :: scripts}"></th:block>
+
+<script th:inline="javascript">
+/*<![CDATA[*/
+	var fnSetCallcenterGnb = function(lnbLvl) {
+		let tag = '';
+		tag += '<ul>\n';
+		tag += '	<li><a href=javascript:void(0);" onclick="cfnGoToPage(_PAGE_FAQ);"' + (lnbLvl == 1 ? ' class="on"' : '') + '>FAQ</a></li>\n';
+		tag += '	<li><a href="javascript:void(0);" onclick="cfnGoToPage(_PAGE_ONETOONE_QNA);"' + (lnbLvl == 2 ? ' class="on"' : '') + '>1:1문의</a></li>\n';
+		tag += '	<li><a href="javascript:void(0);" onclick="cfnGoToPage(_PAGE_GOODS_QNA);"' + (lnbLvl == 3 ? ' class="on"' : '') + '>상품문의</a></li>\n';
+		tag += '	<li><a href="javascript:void(0);" onclick="cfnGoToPage(_PAGE_NOTICE);"' + (lnbLvl == 4 ? ' class="on"' : '') + '>공지</a></li>\n';
+		tag += '</ul>\n';
+		$('#callcenterGnb').html(tag);
+	}
+	
+	$(document).ready(function() {
+		
+	});
+/*]]>*/
+</script>
+
+	</div>
+	
+</body>
+</html>

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

@@ -92,7 +92,7 @@
 									</div>
 								</div>
 							</div>
-							<div class="form_group hide" style="display: none;">
+							<div class="form_group" style="display: none;">
 								<div class="form_wrap form_full">
 									<div>
 										<div class="txt">

+ 85 - 0
src/main/webapp/WEB-INF/views/mob/customer/JoinTypeFormMob.html

@@ -0,0 +1,85 @@
+<!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    : 회원가입 유형 화면
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2021 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.04.13   jsshin     최초 작성
+ *******************************************************************************
+ -->
+
+<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>
+			</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>
+
+		</section>
+		<!-- ★ 컨텐츠 종료 -->
+
+</main>
+
+<script th:inline="javascript">
+	/*<![CDATA[*/
+
+
+		$(document).ready(function(){
+
+		});
+
+	/*]]>*/
+</script>
+</th:block>
+</body>
+</html>

+ 256 - 0
src/main/webapp/WEB-INF/views/mob/customer/PasswordChangeFormMob.html

@@ -0,0 +1,256 @@
+<!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  : PasswordChangeFormMob.html
+ * @desc    : 비밀번호 변경 화면 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.04.13   jsshin     최초 작성
+ *******************************************************************************
+ -->
+<body>
+<th:block layout:fragment="content">
+	<main class="container mb">
+		<!-- ★ 컨텐츠 시작 -->
+		<section class="content mb_idInquiry_5">
+			<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 th:if="${pageGb == 'find'}" class="title">아이디&#47;비밀번호찾기</h2>
+				<h2 th:if="${pageGb == 'temp'}" class="title">비밀번호 변경</h2>
+			</div>
+			<div class="inner">
+				<form id="resetPasswordForm" name="resetPasswordForm" class="form_wrap form_full" role="form" method="post">
+					<input type="hidden" name="custId" th:value="${custId}"/>
+					<div class="form_head">
+						<h2 class="sr-only">비밀번호재설정</h2>
+					</div>
+					<!-- 비밀번호 재설정 -->
+					<div class="find_result clear">
+						<div class="form_info">
+							<span class="ico_content_security"></span>
+							<p>안전을 위해 비밀번호를 변경하신 후<br> 이용이 가능합니다.</p>
+						</div>
+						<div class="form_field mt40">
+							<label class="input_label sr-only">신규 비밀번호</label>
+							<div class="ui_col_12">
+								<input type="password" id="passwd" name="passwd" placeholder="신규 비밀번호" class="form_control" minlength="8" maxlength="20"/>
+								<!-- 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" style="display: none;">
+										<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="ui_col_12">
+								<input type="password" id="confirmPassword" name="confirmPassword" placeholder="비밀번호 확인" class="form_control" minlength="8" maxlength="20"/>
+								<!-- case (비밀번호확인 틀렸을경우,비밀번호 일치할경우) -->
+								<div class="help_block">
+									<!-- 비밀번호확인 틀렸을경우 -->
+									<p id="misPwd" class="t_err" style="display: none;">
+										새 비밀번호가 일치하지 않습니다.
+									</p>
+									<!-- //비밀번호확인 틀렸을경우 -->
+									<!-- 비밀번호 일치할경우 -->
+									<p id="avlConPwd" class="mt10" style="display: none;">
+										<span class="c_black2">
+											<i class="ico ico_check black mr5"></i>새 비밀번호가 일치합니다.
+										</span>
+									</p>
+									<!-- //비밀번호 일치할경우 -->
+								</div>
+								<!-- //case (비밀번호확인 틀렸을경우,비밀번호 일치할경우) -->
+							</div>
+						</div>
+						<div class="btn_group_block btn_group_md ui_row">
+							<div class="ui_col_12">
+								<button type="button" id="btnSavePassword" class="btn btn_dark" disabled="disabled">
+									<span th:if="${pageGb == 'find'}">변경 후 다시 로그인</span>
+									<span th:if="${pageGb == 'temp'}">변경하기</span>
+								</button>
+							</div>
+						</div>
+					</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 pageGb = [[${pageGb}]];
+
+	// 비밀번호 입력
+	$('#resetPasswordForm input[name=passwd]').on('focusout keyup keydown', function () {
+		fnCheckPassword();
+	});
+
+	// 비밀번호 확인 입력
+	$('#resetPasswordForm 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 = $('#resetPasswordForm input[name=custId]').val();
+		let password = $('#resetPasswordForm input[name=passwd]').val();
+		let confirmPassword = $('#resetPasswordForm 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 (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');
+		const $btnSavePassword = $('#btnSavePassword');
+		let password = $('#resetPasswordForm input[name=passwd]').val();
+		let confirmPassword = $('#resetPasswordForm input[name=confirmPassword]').val();
+		let sameConfirmPwd = fnValidationPwdSameConfirmPwd(password, confirmPassword);
+
+		if (sameConfirmPwd) {
+			$misPwd.hide();
+			$avlConPwd.show();
+			$btnSavePassword.attr('disabled', false);
+		} else {
+			$avlConPwd.hide();
+			$misPwd.show();
+			$btnSavePassword.attr('disabled', true);
+		}
+
+	};
+
+	// 패스워드 저장
+	$('#btnSavePassword').on('click', function () {
+		let resetPasswordForm = $('#resetPasswordForm').serializeObject();
+
+		if (gagajf.isNull(resetPasswordForm.passwd)) {
+			mcxDialog.alert('신규 비밀번호를 입력하신 후 다시 시도해주세요.');
+			return;
+		}
+
+		if (gagajf.isNull(resetPasswordForm.confirmPassword)) {
+			mcxDialog.alert('비밀번호 확인을 입력하신 후 다시 시도해주세요.');
+			return;
+		}
+
+		if (resetPasswordForm.passwd != resetPasswordForm.confirmPassword) {
+			mcxDialog.alert('비밀번호가 일치하지 않습니다. 다시 확인해주세요.');
+			return;
+		}
+
+		fnCheckPassword();
+		fnCheckConfirmPassword();
+		let jsonData = JSON.stringify(resetPasswordForm);
+		gagajf.ajaxJsonSubmit('/customer/password/reset', jsonData, fnSavePasswordCallback);
+	});
+
+	var fnSavePasswordCallback = function (result) {
+		if (result.isSuccess) {
+		mcxDialog.alertC('비밀번호 변경이 완료 되었습니다.', {
+			sureBtnText: "확인",
+			sureBtnClick: function() {
+				if (pageGb === 'find') {
+					cfnGoToPage(_PAGE_LOGIN);
+				} else if (pageGb === 'temp') {
+					cfnGoToPage(_PAGE_MAIN);
+				}
+			}
+		});
+		} else {
+			mcxDialog.alert('비밀번호 변경이 실패 되었습니다.')
+		}
+	};
+/*]]>*/
+</script>
+</th:block>
+</body>
+</html>

+ 238 - 167
src/main/webapp/WEB-INF/views/mob/customer/PasswordFindFormMob.html

@@ -17,194 +17,265 @@
  *******************************************************************************
  -->
 <body>
-	<div class="app">
-
-		<a href="#mainCon" class="skipNav">본문바로가기</a>
-		<header></header>
-
-		<main role="" id="" class="container mb">
-			
-			<!-- ★ 컨텐츠 시작 -->
-			<section class="content mb_idInquiry_1">
-				<div class="inner">
-                    <div class="close">
-                        <a href="#none" class="btn_close"><span></span><span></span></a>
-                    </div>
+<th:block layout:fragment="content">
+    <main class="container mb">
+    <!-- ★ 컨텐츠 시작 -->
+        <section class="content mb_idInquiry_1">
+            <div class="inner">
+                <div class="close">
+                    <a href="javascript:void(0);" class="btn_close" onclick="cfnGoToPage(_PAGE_MAIN);"><span></span><span></span></a>
                 </div>
-				<div class="inner">
-					<h2 class="title">아이디/비밀번호찾기</h2>
-				</div>
-				<div class="inner">
-                        <div class="registration_nav">
-                            <ul class="tab_btn">
-                                <li class="active">아이디찾기</li>
-                                <li>비밀번호찾기</li>
+            </div>
+            <div class="inner">
+                <h2 class="title">아이디/비밀번호찾기</h2>
+            </div>
+            <div class="inner">
+                <div class="registration_nav">
+                    <ul class="tab_btn">
+                        <li onclick="cfnGoToPage(_PAGE_CUSTOMER_ID_FIND);">아이디찾기</li>
+                        <li class="active">비밀번호찾기</li>
+                    </ul>
+                </div>
+                <div class="registration_tap">
+                    <div class="form_group">
+                        <!-- 라디오탭 -->
+                        <div class="radio_nav">
+                            <ul class="form_field">
+                                <li class="ui_col_4 active">
+                                    <input type="radio" name="radio1" id="rdi1-1" value="1" checked><label for="rdi1-1"> <span>회원정보인증</span> </label>
+                                </li>
+                                <li class="ui_col_4">
+                                    <input type="radio" name="radio1" id="rdi1-2" value="2"><label for="rdi1-2"> <span>휴대폰인증</span> </label>
+                                </li>
+                                <li class="ui_col_4">
+                                    <input type="radio" name="radio1" id="rdi1-3" value="3"><label for="rdi1-3"> <span>아이핀인증</span> </label>
+                                </li>
                             </ul>
                         </div>
-                        <div class="registration_tap">
+                         <!-- //라디오탭 -->
+                          <!-- 라디오탭 -->
+                        <div class="radio_tap">
                             <div class="form_group">
-                                <!-- 라디오탭 -->
-                                <div class="radio_nav">
-                                    <ul class="form_field">
-                                        <li class="ui_col_4 active">
-                                            <input type="radio" name="radio1" id="rdi1-1" value="1" checked><label for="rdi1-1"> <span>회원정보인증</span> </label>
-                                        </li>
-                                        <li class="ui_col_4">
-                                            <input type="radio" name="radio1" id="rdi1-2" value="2"><label for="rdi1-2"> <span>휴대폰인증</span> </label>
-                                        </li>
-                                        <li class="ui_col_4">
-                                            <input type="radio" name="radio1" id="rdi1-3" value="3"><label for="rdi1-3"> <span>아이핀인증</span> </label> 
-                                        </li>
-                                    </ul>
-                                </div>
-                                 <!-- //라디오탭 -->
-                                  <!-- 라디오탭 -->
-                                <div class="radio_tap">
-                                    <div class="form_group">
-                                        <form class="form_wrap form_full">
-                                            <div>
-                                                <div class="form_field mt0"><input type="text" placeholder="이름" class="form_control"></div>
-                                                <div class="form_field"><input type="password" placeholder="생년월일 8자리(예:19880912)" class="form_control"></div>
-                                                <div class="form_field"><input type="text" placeholder="이메일" class="form_control"></div>
-                                                <div class="ui_row mt20"><button class="btn btn_dark">확인</button></div>
-                                            </div>
-                                        </form>
-                                    </div>
-                                    <div class="form_group">
-                                        <form class="form_wrap form_full">
-                                            <div>
-                                                <div class="txt">
-                                                    회원님의 명의로 등록된 휴대폰으로<br>
-                                                    본인확인을 진행합니다.
-                                                </div>
-                                                <div class="ui_row mt20"><button class="btn btn_dark">본인명의 휴대폰으로 인증</button></div>
-                                            </div>
-                                        </form>
+                                <form id="searchCustInfo" name="searchCustInfo" class="form_wrap form_full" method="post">
+                                    <div>
+                                        <div class="form_field mt0">
+                                            <input type="text" name="custId" placeholder="아이디" id="custId" class="form_control" minlength="4" maxlength="12"/>
+                                        </div>
+                                        <div class="form_field">
+                                            <input type="text" name="custNm" placeholder="이름" id="custNm" class="form_control" maxlength="30"/>
+                                        </div>
+                                        <div class="form_field">
+                                            <input type="text" name="email" placeholder="이메일" id="email" class="form_control" maxlength="30"/>
+                                        </div>
+                                        <div class="ui_row mt20">
+                                            <button type="button" id="btnInfoConfirm" class="btn btn_dark">확인</button>
+                                        </div>
                                     </div>
-                                    <div class="form_group">
-                                        <form class="form_wrap form_full">
-                                            <div>
-                                                <div class="txt">
-                                                    아이핀 인증을 통해 찾을 수 있습니다.
-                                                </div>
-                                                <div class="ui_row mt20"><button class="btn btn_dark">아이핀 인증</button></div>
-                                            </div>
-                                        </form>
+                                </form>
+                            </div>
+                            <div class="form_group" style="display: none;">
+                                <div class="form_wrap form_full">
+                                    <div>
+                                        <div class="txt">
+                                            회원님의 명의로 등록된 휴대폰으로<br>
+                                            본인확인을 진행합니다.
+                                        </div>
+                                        <div class="ui_row mt20">
+                                            <button type="button" id="btnCellPhoneCertify" class="btn btn_dark">본인명의 휴대폰으로 인증</button>
+                                        </div>
                                     </div>
                                 </div>
-                                 <!-- //라디오탭 -->
-                                
                             </div>
-                            <div class="form_group">
-                                <!-- 라디오탭 -->
-                                <div class="radio_nav">
-                                    <ul class="form_field">
-                                        <li class="ui_col_4 active">
-                                            <input type="radio" name="radios" id="rdi-4" value="4" checked><label for="rdi-4"> <span>회원정보인증</span> </label>
-                                        </li>
-                                        <li class="ui_col_4">
-                                            <input type="radio" name="radios" id="rdi-5" value="5"><label for="rdi-5"> <span>휴대폰인증</span> </label>
-                                        </li>
-                                        <li class="ui_col_4">
-                                            <input type="radio" name="radios" id="rdi-6" value="6"><label for="rdi-6"> <span>아이핀인증</span> </label> 
-                                        </li>
-                                    </ul>
-                                </div>
-                                 <!-- //라디오탭 -->
-                                  <!-- 라디오탭 -->
-                                <div class="radio_tap">
-                                    <div class="form_group">
-                                         <form class="form_wrap form_full">
-                                            <div>
-                                                <div class="form_field mt0"><input type="text" placeholder="이름" class="form_control"></div>
-                                                <div class="form_field"><input type="password" placeholder="생년월일 8자리(예:19880912)" class="form_control"></div>
-                                                <div class="form_field"><input type="text" placeholder="이메일" class="form_control"></div>
-                                                <div class="ui_row mt20"><button class="btn btn_dark">확인</button></div>
-                                            </div>
-                                        </form>
-                                    </div>
-                                    <div class="form_group">
-                                        <form class="form_wrap form_full">
-                                            <div>
-                                                <div class="txt">
-                                                    회원님의 명의로 등록된 휴대폰으로<br>
-                                                    본인확인을 진행합니다.
-                                                </div>
-                                                <div class="ui_row mt20"><button class="btn btn_dark">본인명의 휴대폰으로 인증</button></div>
-                                            </div>
-                                        </form>
-                                    </div>
-                                    <div class="form_group">
-                                        <form class="form_wrap form_full">
-                                            <div>
-                                                <div class="txt">
-                                                    아이핀 인증을 통해 찾을 수 있습니다.
-                                                </div>
-                                                <div class="ui_row mt20"><button class="btn btn_dark">아이핀 인증</button></div>
-                                            </div>
-                                        </form>
+                            <div class="form_group" style="display: none;">
+                                <div class="form_wrap form_full">
+                                    <div>
+                                        <div class="txt">
+                                            아이핀 인증을 통해 찾을 수 있습니다.
+                                        </div>
+                                        <div class="ui_row mt20">
+                                            <button type="button" id="btnIpinCertify" class="btn btn_dark">아이핀 인증</button>
+                                        </div>
                                     </div>
                                 </div>
-                                 <!-- //라디오탭 -->
-                                
                             </div>
                         </div>
+                         <!-- //라디오탭 -->
+                    </div>
+                </div>
+                <!-- 임시비밀번호 발급 -->
+                <div id="sendEmailDiv" class="find_result clear" style="display: none;">
+                    <div class="form_info">
+                        <span class="ico_content_mail"></span>
+                        <p>아래의 이메일로 임시비밀번호가 발급되었습니다.</p>
+                        <p class="t_info mt10">
+                            로그인 시 비밀번호를 새로 설정하신 후 이용하실 수 있습니다.
+                        </p>
+                    </div>
+                    <div class="form_print_bar mt40">
+                        <p id="sendEmail" class="c_primary bold" data-font="lato"></p>
+                    </div>
+                    <div class="btn_group_block btn_group_md ui_row">
+                        <div class="ui_col_12">
+                            <button type="button" class="btn btn_dark btn_block" onclick="cfnGoToPage(_PAGE_LOGIN);">
+                                <span>로그인 하기</span>
+                            </button>
+                        </div>
+                    </div>
+                </div>
+                <!-- //임시비밀번호 발급 -->
+                <!-- 회원정보로 비밀번호 찾기 실패일경우 -->
+                <div id="failCustId" class="form_wrap form_full" style="display: none;">
+                    <div class="find_result clear">
+                        <div class="form_info">
+                            <span class="ico_content_none"></span>
+                            <p>입력한 정보와 일치하는 아이디가 존재하지 않습니다.</p>
+                            <p class="t_info mt10">
+                                정확한 확인을 위해 휴대폰 인증/아이핀 인증을 통한<br>아이디 찾기를 진행해 주세요.
+                            </p>
+                        </div>
+                        <div class="btn_group_block btn_group_md ui_row">
+                            <div class="ui_col_6">
+                                <button type="button" class="btn btn_primary" onclick="cfnGoToPage(_PAGE_CUSTOMER_JOIN);">
+                                    <span>회원가입</span>
+                                </button>
+                            </div>
+                            <div class="ui_col_6">
+                                <button type="button" class="btn btn_dark" onclick="cfnGoToPage(_PAGE_CUSTOMER_ID_FIND);">
+                                    <span>다시 찾기</span>
+                                </button>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+                <!-- //회원정보로 비밀번호 찾기 실패일경우 -->
+                <!-- 휴대폰,아이핀 본인인증으로 비밀번호찾기 실패일경우 -->
+                <div id="failAuthentication" class="form_wrap form_full" style="display: none;">
+                    <div class="find_result clear">
+                        <div class="form_info">
+                            <span class="ico_content_none"></span>
+                            <p>입력한 정보와 일치하는 아이디가 존재하지 않습니다.</p>
+                            <p class="t_info mt10">
+                                <span class="c_primary">STYLE24의 새로운 가족이 되어 주세요!</span>
+                            </p>
+                        </div>
+                        <div class="btn_group_block btn_group_md ui_row">
+                            <div class="ui_col_12">
+                                <button type="button" class="btn btn_primary" onclick="cfnGoToPage(_PAGE_CUSTOMER_JOIN);">
+                                    <span>회원가입</span>
+                                </button>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+                <!-- //휴대폰,아이핀 본인인증으로 비밀번호찾기 실패일경우 -->
+             </div>
+        </section>
+        <!-- ★ 컨텐츠 종료 -->
+    </main>
+<script th:src="@{'/biz/customer.js?v=' + ${#calendars.format(#calendars.createNow(), 'yyyyMMddHHmmss')}}" src="/biz/customer.js"></script>
+<script th:inline="javascript">
+/*<![CDATA[*/
+	const sEncData = [[${sEncData}]];   //인증 후 해당 페이지로 리다이렉트함
+	const authMethod = [[${authMethod}]]; //인증 후 해당 페이지로 리다이렉트함
 
-			</section>
-			<!-- ★ 컨텐츠 종료 -->	
+    $('#btnInfoConfirm').on('click', function () {
+        let custInfo = $('#searchCustInfo').serializeObject();
 
-		</main>
+        if(gagajf.isNull(custInfo.custId)) {
+            mcxDialog.alert("아이디를 입력해주세요.");
+            return;
+        }
 
-		<footer></footer>
+        if (gagajf.isNull(custInfo.custNm)) {
+            mcxDialog.alert('이름을 형식에 맞게 입력해주세요.');
+            return;
+        }
 
-	</div>
+        if (gagajf.isNull(custInfo.email)) {
+            mcxDialog.alert('이메일을 입력하여 주세요.');
+            return;
+        }
 
-    <script>
-        $(document).ready(function () {
-            /* 아이디/비밀번호 찾기_taps */
-            $('.registration_tap > .form_group').hide();	
-            $('.registration_tap > .form_group').eq(0).show();
-            $(document).on('click','.registration_nav > ul > li',function(e){
-                $(this).addClass('active').siblings().removeClass('active');
-                $('.registration_tap > .form_group').hide();		
-                $('.registration_tap > .form_group').eq($(this).index()).show();
-                return false;
-            });
+        if (!fnCheckValidationEmail(custInfo.email)) {
+            mcxDialog.alert('이메일 형식에 맞게 입력해주세요.');
+            return;
+        }
 
-            /* 회원정보인증/휴대폰인증/아이핀인증_taps */
-            $('.radio_tap > .form_group').hide();	
-            $('.radio_tap > .form_group').eq(0).show();
-            $('.radio_tap').each(function(){
-                $(this).find('.form_group').hide();
-                $(this).find('.form_group').eq(0).show();
-            });
+        custInfo.authMethod = 'custInfo';
+        let jsonData = JSON.stringify(custInfo);
+        //console.log('jsonData', jsonData);
+        gagajf.ajaxJsonSubmit('/customer/password/find/custinfo', jsonData, fnInfoConfirmCallBack);
+    });
 
-            $(document).on('click','.radio_nav > ul > li',function(e){
-                $(this).addClass('active').siblings().removeClass('active');
-                $(this).find('input').prop("checked", true);
-                $(this).parent().parent().parent().find('.radio_tap > .form_group').hide();		
-                $(this).parent().parent().parent().find('.radio_tap > .form_group').eq($(this).index()).show();
-                return false;
-            });
-        });
-    </script>
+    // 휴대폰 인증
+    $('#btnCellPhoneCertify').on('click', function () {
+        cfnOpenCellphoneCertify(_PAGE_CUSTOMER_PWD_FIND);
+    });
 
-    <script type="text/javascript">
-        $(document).ready(function(){
-            setHtop();
-        });
+    // 아이핀 인증
+    $('#btnIpinCertify').on('click', function () {
+        cfnOpenIpinCertify(_PAGE_CUSTOMER_PWD_FIND);
+    });
 
-        function setHtop() {
-            if($('header').hasClass('main')) {
-                $('#htopMain').show();
-                $('#htopSub').hide();
-            } else {
-                $('#htopMain').hide();
-                $('#gnb').hide();
-                $('#htopSub').show();
-            }
+        // 찾기결과
+    var fnInfoConfirmCallBack = function (result) {
+        $('#btnInfoConfirm').hide();
+        $('.form_field').hide();
+        $('.registration_cont').hide();
+        $('.registration_nav').hide();
+        $('#searchDiv').hide();
+        if (result.isFind) {
+            fnGetDisplaySucc(result.authMethod, result);
+        } else {
+            fnGetDisplayFail(result.authMethod);
         }
-    </script>
-</body>
+    };
 
+    // 찾기성공
+    var fnGetDisplaySucc = function (authMethod, custInfo) {
+        if (custInfo.authMethod === 'custInfo') {
+            $('#sendEmail').text(custInfo.maskingEmail)
+            $('#sendEmailDiv').show();
+        }
+        if (authMethod === 'mobile' || authMethod === 'ipin') {
+            cfnGoToPage(_PAGE_CUSTOMER_PWD_CHANGE_FIND);
+        }
+    };
+
+    // 나이스 본인인증 후 콜백
+    var fnNiceCallBack = function(encData, authMethod) {
+        if (!gagajf.isNull(encData)) {
+            let custInfo = {};
+            custInfo.encData = encData;
+            custInfo.authMethod = authMethod;
+            let jsonData = JSON.stringify(custInfo);
+            gagajf.ajaxJsonSubmit('/customer/password/find/certify', jsonData, fnInfoConfirmCallBack)
+        }
+    };
+
+    $(document).ready(function () {
+        if (!gagajf.isNull(sEncData)) {
+            fnNiceCallBack(sEncData, authMethod);
+        }
+
+        /* 회원정보인증/휴대폰인증/아이핀인증_taps */
+        $('.radio_tap > .form_group').hide();
+        $('.radio_tap > .form_group').eq(0).show();
+        $('.radio_tap').each(function(){
+            $(this).find('.form_group').hide();
+            $(this).find('.form_group').eq(0).show();
+        });
+
+        $(document).on('click','.radio_nav > ul > li',function(e){
+            $(this).addClass('active').siblings().removeClass('active');
+            $(this).find('input').prop("checked", true);
+            $(this).parent().parent().parent().find('.radio_tap > .form_group').hide();
+            $(this).parent().parent().parent().find('.radio_tap > .form_group').eq($(this).index()).show();
+            return false;
+        });
+    });
+/*]]>*/
+</script>
+</th:block>
+</body>
 </html>

+ 172 - 0
src/main/webapp/WEB-INF/views/mob/mypage/RestockFormMob.html

@@ -0,0 +1,172 @@
+<!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  : RestockFormMob.html
+ * @desc    : 마이페이지 > 재입고알림내역 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.04.13   gagamel     최초 작성
+ *******************************************************************************
+ -->
+<body>
+
+<th:block layout:fragment="content">
+	<main role="" id="" class="container my">
+		<section class="content restock">
+			<div class="inner bg_gray">
+				<div class="announce_txt">
+					<div class="announce_list">
+						<ul>
+							<li>재입고 알림 신청한 내역을 확인 하실 수 있습니다.</li>
+							<li>알림을 요청한 날로 부터 15일 안에 입고시 알림을 SMS, 알림톡으로 보내드립니다.</li>
+							<li>알림 요청이 완료 또는 경과된 알림은 완료 시점부터 15일 후 삭제됩니다.</li>
+						</ul>
+					</div>
+				</div>
+			</div>
+			
+			<div class="inner">
+				<div class="part_goods" id="restockGoods" style="display: none;">
+<!-- 					<div class="goods_section"> -->
+<!-- 						<div class="goods_detail"> -->
+<!-- 							<a href=""> -->
+<!-- 								<div class="thumb_box"> -->
+<!-- 									<img src="/images/mo/thumb/prod3.jpg" alt="prod3"/> -->
+<!-- 								</div> -->
+<!-- 								<div class="info_box"> -->
+<!-- 									<div class="od_name"> -->
+<!-- 										<span class="restock_ready"><em>2021.03.25</em> 알림</span> -->
+<!-- 										<span class="restock_remain"><em>15</em>일 남음</span> -->
+<!-- 										<span class="restock_past">알림 요청일 경과</span> -->
+<!-- 										<div class="brand"> -->
+<!-- 											<span>Mollimelli 몰리멜리</span> -->
+<!-- 										</div> -->
+<!-- 										<div class="name">몰리겨울상하복 균일가 택1 유아동/상하복/기모상하복/상하의세트 몰리겨울상하복 균일가 택1</div> -->
+<!-- 									</div> -->
+<!-- 									<div class="od_opt"> -->
+<!-- 										<div class="option"><em>Black</em><em>XXL</em></div> -->
+<!-- 										<div class="option"><em>White</em><em>L</em></div> -->
+<!-- 									</div> -->
+<!-- 								</div> -->
+<!-- 							</a> -->
+<!-- 						</div> -->
+<!-- 						<div class="btn_group_flex"> -->
+<!-- 							<div><button type="button" class="btn btn_primary"><span>바로구매</span></button></div> -->
+<!-- 							<div><button type="button" id="btn_alarm_restock" class="btn btn_default"><span>알림연장</span></button></div> -->
+<!-- 						</div> -->
+<!-- 					</div> -->
+				</div>
+				
+				<!-- 데이터 없을 시 -->
+				<div class="nodata" id="restockNodata" style="display: none;">
+					<div class="txt_box">
+						<p>재입고 알림 내역이 없습니다.</p>
+					</div>
+				</div>
+			</div>
+		</section>
+	</main>
+	
+<script th:inline="javascript">
+/*<![CDATA[*/
+	let fnGetList = function() {
+		$.getJSON('/mypage/restock/list', function (result, status) {
+			if (status == 'success') {
+				if (result.length > 0) {
+					$('#restockGoods').html('');
+					
+					$.each(result, function (idx, item) {
+						let tag = '<div class="goods_section">\n';
+						tag += '	<div class="goods_detail">\n';
+						tag += '		<a href="">\n';
+						tag += '			<div class="thumb_box">\n';
+						tag += '				<img src="' + _uploadGoodsUrl + '/' + item.sysImgNm + '" alt="">\n';
+						tag += '			</div>\n';
+						tag += '			<div class="info_box">\n';
+						tag += '				<div class="od_name">\n';
+						
+						if (!gagajf.isNull(item.informDt)) {
+							tag += '					<span class="restock_ready"><em>' + item.informDt + '</em> 알림</span>\n';
+						} else {
+							if (item.pastDays > 15) {
+								tag += '					<span class="restock_past">알림 요청일 경과</span>\n';
+							} else {
+								tag += '					<span class="restock_remain"><em>' + (15 - Number(item.pastDays)) + '</em>일 남음</span>\n';
+							}
+						}
+						
+						tag += '					<div class="brand">\n';
+						tag += '						<span>' + item.brandEnm + '</span>\n';
+						tag += '					</div>\n';
+						tag += '					<div class="name">' + item.goodsNm + '</div>\n';
+						tag += '				</div>\n';
+						tag += '				<div class="od_opt">\n';
+						tag += '					<div class="option"><em>' + item.optCd1 + '</em><em>' + item.optCd2 + '</em></div>\n';
+						tag += '				</div>\n';
+						tag += '			</div>\n';
+						tag += '		</a>\n';
+						tag += '	</div>\n';
+						tag += '	<div class="btn_group_flex">\n';
+						
+						if (!gagajf.isNull(item.informDt)) {
+							tag += '		<div><button type="button" class="btn btn_primary" onclick="cfnGoToGoodsDetail(\'' + item.goodsCd + '\');"><span>바로구매</span></button></div>\n';
+						} else {
+							tag += '		<div><button type="button" class="btn btn_default" onclick="fnUpdateRestockContinue(' + item.rinbdInfoSq + ');"><span>알림연장</span></button></div>\n';
+						}
+						
+						tag += '	</div>\n';
+						tag += '</div>\n';
+						
+						$('#restockGoods').append(tag);
+						$('#restockGoods').show();
+						$('#restockNodata').hide();
+					});
+				} else {
+					// 데이터 없을 시
+					$('#restockGoods').hide();
+					$('#restockNodata').show();
+				}
+			}
+		});
+	}
+	
+	// 알림 연장
+	let fnUpdateRestockContinue = function(rinbdInfoSq) {
+		mcxDialog.confirm("알림을 연장하시겠습니까?", {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function() {
+				let params = new Object();
+				params.rinbdInfoSq = rinbdInfoSq;
+				
+				var jsonData = JSON.stringify(params);
+				gagajf.ajaxJsonSubmit('/mypage/restock/continue/update'
+						, jsonData
+						, function() {
+							fnGetList();
+						});
+			}
+		});
+	}
+
+	$(document).ready(function() {
+		// 타이틀명
+		$('#htopTitle').text('재입고 알림');
+		
+		fnGetList();
+	});
+/*]]>*/
+</script>
+
+</th:block>
+
+</body>
+</html>

+ 22 - 0
src/main/webapp/WEB-INF/views/mob/order/OrderEmptyMob.html

@@ -0,0 +1,22 @@
+<!DOCTYPE html>
+<html lang="ko" xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : OrderEmptyMob.html
+ * @desc    : 주문/결제 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.02.01   jsh77b     최초 작성
+ *******************************************************************************
+ -->
+<body>
+<script th:inline="javascript">
+var message	= [[${message}]];
+alert(message);
+</script>
+</body>
+</html>

+ 18 - 11
src/main/webapp/WEB-INF/views/mob/order/OrderFormMob.html

@@ -996,17 +996,24 @@ var paymentInfoSet = function() {
 							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);
+							// 유효성체크 통과
+							if (result.message == "SUCCESS") {
+								// 결재정보로드
+								$("#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);
+								}
+								return;
+							} else {
+								alert(result.message);
+								return false;
 							}
 						}
 					});

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

@@ -50,16 +50,25 @@
 					<div class="form_field">
 						<label class="input_label sr-only">이름(주문자명)</label>
 						<div class="input_wrap"> 
-							<input type="text" class="form_control" name="custNm" placeholder="이름(주문자명)" >
+							<input type="text" class="form_control" name="custNm" placeholder="이름(주문자명)" readonly>
 						</div>
 					</div>
 					
+					<!-- 휴대폰 인증 입력 전 -->
 					<div class="form_field">
 						<label class="input_label sr-only">휴대폰 번호</label>
 						<div class="input_wrap"> 
-							<input type="text" class="form_control" name="cellPhnno" placeholder="휴대폰 번호" onfocus="this.blur();" readonly="readonly">
+							<input type="text" class="form_control" name="cellPhnno" placeholder="휴대폰 인증을 해주세요" readonly>
+							<button type="button" class="btn btn_dark btn_hp_certi beforeAuth" id="btnCellPhoneCertify">
+								<span>본인인증</span>
+							</button>
+							<button type="button" class="btn btn_dark btn_hp_certi afterAuth">
+									<span>인증완료</span>
+							</button>
 						</div>
 					</div>
+					<!-- //휴대폰 인증 입력 전 -->
+					
 					<div class="form_field">
 						<label class="input_label sr-only">이메일주소</label>
 						<div class="input_wrap"> 
@@ -121,10 +130,18 @@
 
 
 <script th:inline="javascript">
+var cartSqArr 		= [[${order.cartSqArr}]];
+const sEncData 		= [[${sEncData}]];   //인증 후 해당 페이지로 리다이렉트함
+const authMethod 	= [[${authMethod}]]; //인증 후 해당 페이지로 리다이렉트함
+
 // 컨텐츠 호출
 $(document).ready( function() {
 	// 1. 타이틀설정
 	$("#htopTitle").text("비회원 주문하기");
+	
+	if (!gagajf.isNull(sEncData)) {
+		fnNiceCallBack(sEncData, authMethod);
+	}
 });
 	
 // 주문하기버튼
@@ -181,8 +198,13 @@ $("#btn_order").on("click", function() {
 	$("#orderForm").submit();
 });
 
+// 휴대폰 인증
+$('#btnCellPhoneCertify').on('click', function () {
+	cfnOpenCellphoneCertify("/order/noMember?cartSqArr="+cartSqArr);
+});
+
 // 나이스 본인인증 후 콜백
-var fnNiceCallBack = function(encData) {
+var fnNiceCallBack = function(encData, authMethod) {
 	if (!gagajf.isNull(encData)) {
 		let custInfo 		= {};
 		custInfo.encData 	= encData;

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

@@ -140,10 +140,8 @@
 												</div>
 												<div class="gd_exinfo">
 													<p th:if="${!#strings.isEmpty(cart.delvResDt)}"><span class="tag primary_line">총알배송</span><span th:text="|${cart.delvResDt} 배송예정|"></span></p>
-													<p th:if="${cart.qtyTmtbSq > 0 and cart.applyQtySectionYn == 'Y'}" class="applyTmtb"><span class="tag primary">SALE</span>다다익선 할인 적용</p>
-													<p th:if="${cart.qtyTmtbSq > 0 and cart.applyQtySectionYn == 'N'}" class="notApplyTmtb"><a href="" class="btn_moresale"><span class="tag primary">SALE</span>다다익선 상품보기</a></p>
-													<p th:if="${cart.amtTmtbSq > 0 and cart.applyAmtSectionYn == 'Y'}" class="applyTmtb"><span class="tag primary">SALE</span>다다익선 할인 적용</p>
-													<p th:if="${cart.amtTmtbSq > 0 and cart.applyAmtSectionYn == 'N'}" class="notApplyTmtb"><a href="" class="btn_moresale"><span class="tag primary">SALE</span>다다익선 상품보기</a></p>
+													<p th:if="${(cart.qtyTmtbSq > 0 and cart.applyQtySectionYn == 'Y') or (cart.amtTmtbSq > 0 and cart.applyAmtSectionYn == 'Y')}" class="applyTmtb"><span class="tag primary">SALE</span>다다익선 할인 적용</p>
+													<p th:if="${(cart.qtyTmtbSq > 0 and cart.applyQtySectionYn == 'N') or (cart.amtTmtbSq > 0 and cart.applyAmtSectionYn == 'N')}" class="notApplyTmtb"><a href="" class="btn_moresale"><span class="tag primary">SALE</span>다다익선 상품보기</a></p>
 													<p th:if="${cart.soldoutYn.equals('Y') and cart.ordCanYn.equals('Y')}">품절된 상품입니다.</p>
 													<p th:if="${cart.ordCanYn.equals('N')}">해당 상품은 구매 불가능한 상품입니다.</p>
 													<p th:if="${cart.soldoutYn.equals('N') and cart.ordCanYn.equals('Y') and cart.goodsQty < cart.minOrdQty}" th:text="|해당 상품은 최소 ${cart.minOrdQty}개부터 구매 가능합니다.|"></p>
@@ -249,10 +247,8 @@
 												<div class="gd_exinfo">
 													<div class="gd_exinfo">
 														<p th:if="${!#strings.isEmpty(cart.delvResDt)}" th:text="|${cart.delvResDt} 배송예정|"></p>
-														<p th:if="${cart.qtyTmtbSq > 0 and cart.applyQtySectionYn == 'Y'}" class="applyTmtb"><span class="tag primary">SALE</span>다다익선 할인 적용</p>
-														<p th:if="${cart.qtyTmtbSq > 0 and cart.applyQtySectionYn == 'N'}" class="notApplyTmtb"><a href="" class="btn_moresale"><span class="tag primary">SALE</span>다다익선 상품보기</a></p>
-														<p th:if="${cart.amtTmtbSq > 0 and cart.applyAmtSectionYn == 'Y'}" class="applyTmtb"><span class="tag primary">SALE</span>다다익선 할인 적용</p>
-														<p th:if="${cart.amtTmtbSq > 0 and cart.applyAmtSectionYn == 'N'}" class="notApplyTmtb"><a href="" class="btn_moresale"><span class="tag primary">SALE</span>다다익선 상품보기</a></p>
+														<p th:if="${(cart.qtyTmtbSq > 0 and cart.applyQtySectionYn == 'Y') or (cart.amtTmtbSq > 0 and cart.applyAmtSectionYn == 'Y')}" class="applyTmtb"><span class="tag primary">SALE</span>다다익선 할인 적용</p>
+														<p th:if="${(cart.qtyTmtbSq > 0 and cart.applyQtySectionYn == 'N') or (cart.amtTmtbSq > 0 and cart.applyAmtSectionYn == 'N')}" class="notApplyTmtb"><a href="" class="btn_moresale"><span class="tag primary">SALE</span>다다익선 상품보기</a></p>
 														<p th:if="${cart.soldoutYn.equals('Y') and cart.ordCanYn.equals('Y')}">품절된 상품입니다.</p>
 														<p th:if="${cart.ordCanYn.equals('N')}">해당 상품은 구매 불가능한 상품입니다.</p>
 														<p th:if="${cart.soldoutYn.equals('N') and cart.ordCanYn.equals('Y') and cart.goodsQty < cart.minOrdQty}" th:text="|해당 상품은 최소 ${cart.minOrdQty}개부터 구매 가능합니다.|"></p>
@@ -369,10 +365,8 @@
 												</div>
 												<div class="gd_exinfo">
 													<p th:if="${!#strings.isEmpty(cart.delvResDt)}" th:text="|${cart.delvResDt} 배송예정|"></p>
-													<p th:if="${cart.qtyTmtbSq > 0 and cart.applyQtySectionYn == 'Y'}" class="applyTmtb"><span class="tag primary">SALE</span>다다익선 할인 적용</p>
-													<p th:if="${cart.qtyTmtbSq > 0 and cart.applyQtySectionYn == 'N'}" class="notApplyTmtb"><a href="" class="btn_moresale"><span class="tag primary">SALE</span>다다익선 상품보기</a></p>
-													<p th:if="${cart.amtTmtbSq > 0 and cart.applyAmtSectionYn == 'Y'}" class="applyTmtb"><span class="tag primary">SALE</span>다다익선 할인 적용</p>
-													<p th:if="${cart.amtTmtbSq > 0 and cart.applyAmtSectionYn == 'N'}" class="notApplyTmtb"><a href="" class="btn_moresale"><span class="tag primary">SALE</span>다다익선 상품보기</a></p>
+													<p th:if="${(cart.qtyTmtbSq > 0 and cart.applyQtySectionYn == 'Y') or (cart.amtTmtbSq > 0 and cart.applyAmtSectionYn == 'Y')}" class="applyTmtb"><span class="tag primary">SALE</span>다다익선 할인 적용</p>
+													<p th:if="${(cart.qtyTmtbSq > 0 and cart.applyQtySectionYn == 'N') or (cart.amtTmtbSq > 0 and cart.applyAmtSectionYn == 'N')}" class="notApplyTmtb"><a href="" class="btn_moresale"><span class="tag primary">SALE</span>다다익선 상품보기</a></p>
 													<p th:if="${cart.soldoutYn.equals('Y') and cart.ordCanYn.equals('Y')}">품절된 상품입니다.</p>
 													<p th:if="${cart.ordCanYn.equals('N')}">해당 상품은 구매 불가능한 상품입니다.</p>
 													<p th:if="${cart.soldoutYn.equals('N') and cart.ordCanYn.equals('Y') and cart.goodsQty < cart.minOrdQty}" th:text="|해당 상품은 최소 ${cart.minOrdQty}개부터 구매 가능합니다.|"></p>
@@ -546,28 +540,36 @@
 	<script th:inline="javascript">
 		let sumRealPayAmt = [[${order.sumRealPayAmt + order.totDelvFee}]];
 		let totDcAmt = [[${order.totDcAmt}]];
-		let loginInfo = [[${loginInfo}]];
+		let loginInfo = new Object();
 		let orderFlag = true;
 
-		function NotApplyTmtbCartList() {
-			let tmtbSq = 0;
-			let tmtbNm = "";
-			let goodsList = {
-				brandNm : "",
-				goodsNm : "",
-				currPrice : 0,
-				imgPath : ""
-			}
-		}
+		function setLoginInfo() {
+			gagajf.ajaxJsonSubmit("/cart/login/info", null, function (result) {
+				loginInfo = result;
+
+				if (!loginInfo || loginInfo.custNo == null || loginInfo.custNo == 0) {
+					$("#cartListForm .area_salecoupon").hide();
+				}
+			});
+		};
 
 		$(document).ready(function() {
+			setLoginInfo();
+
+			if([[${!order.shotCanYn.equals('Y')}]]) {
+				$(".shotDelvSelect").hide();
+			}
+
+			$("#cartListForm .area_salecoupon .coupon_box").hide();
+
+			/* 딜 및 일반 상품 */
 			/*let compsList = [];
 			let temp 			= new Object;
 			temp.goodsCd 		= "AOW13QDM76";
 			temp.optCd 			= "13256848-2";
 			temp.goodsQty 		= 3;
 			temp.goodsType 		= "G056_N";
-			temp.cartGb 		= "O";
+			temp.cartGb 		= "G";
 			temp.afLinkCd 		= "afLinkCd";
 			temp.ithrCd 		= "G027_ZZZ";
 			temp.contentsLoc 	= "G028_YYY";
@@ -579,23 +581,14 @@
 			temp.optCd 			= "13256848-6";
 			temp.goodsQty 		= 3;
 			temp.goodsType 		= "G056_N";
-			temp.cartGb 		= "O";
+			temp.cartGb 		= "G";
 			temp.afLinkCd 		= "afLinkCd";
 			temp.ithrCd 		= "G027_ZZZ";
 			temp.contentsLoc 	= "G028_YYY";
 			temp.planDtlSq 		= "123";
 			compsList.push(temp);
-			cfnAddCart(compsList);*/
-
-			if([[${!order.shotCanYn.equals('Y')}]]) {
-				$(".shotDelvSelect").hide();
-			}
-
-			$("#cartListForm .area_salecoupon .coupon_box").hide();
 
-			if(!loginInfo || loginInfo.custNo == null || loginInfo.custNo == 0) {
-				$("#cartListForm .area_salecoupon").hide();
-			}
+			cfnAddCart(compsList);*/
 
 			/* 세트상품 장바구니 */
 			/*let goodsList = {
@@ -605,24 +598,36 @@
 
 			let compsList = [];
 			let temp = new Object;
-			temp.goodsCd = "STYS00000005";
-			temp.itemCd = "A83F-DP568S";
-			temp.optCd = "14019445-1";
+			temp.goodsCd = "STYS00000009";
+			temp.itemCd = "ELW23ZVE83";
+			temp.optCd = "13520522-3";
 			temp.goodsQty = 3;
 			temp.goodsType = "G056_S";
-			temp.cartGb = "C";
+			temp.cartGb = "G";
 			temp.afLinkCd = "aaaa";
 			temp.ithrCd = "12311";
 			temp.contentsLoc = "afasd";
 			temp.planDtlSq = "44";
 			compsList.push(temp);
 			temp = new Object;
-			temp.goodsCd = "STYS00000005";
-			temp.itemCd = "A83F-TS517S";
-			temp.optCd = "11867579-1";
+			temp.goodsCd = "STYS00000009";
+			temp.itemCd = "EMF11QPT46";
+			temp.optCd = "10195722-4";
 			temp.goodsQty = 3;
 			temp.goodsType = "G056_S";
-			temp.cartGb = "C";
+			temp.cartGb = "G";
+			temp.afLinkCd = "aaaa";
+			temp.ithrCd = "12311";
+			temp.contentsLoc = "afasd";
+			temp.planDtlSq = "44";
+			compsList.push(temp);
+			temp = new Object;
+			temp.goodsCd = "STYS00000009";
+			temp.itemCd = "EMF11QTS37";
+			temp.optCd = "10702803-2";
+			temp.goodsQty = 3;
+			temp.goodsType = "G056_S";
+			temp.cartGb = "G";
 			temp.afLinkCd = "aaaa";
 			temp.ithrCd = "12311";
 			temp.contentsLoc = "afasd";
@@ -637,24 +642,36 @@
 				cartCompsList : new Array()
 			}
 			temp = new Object;
-			temp.goodsCd = "STYS00000005";
-			temp.itemCd = "A83F-DP568S";
-			temp.optCd = "14019445-3";
-			temp.goodsQty = 3;
+			temp.goodsCd = "STYS00000009";
+			temp.itemCd = "ELW23ZVE83";
+			temp.optCd = "13520522-1";
+			temp.goodsQty = 2;
 			temp.goodsType = "G056_S";
-			temp.cartGb = "C";
+			temp.cartGb = "G";
 			temp.afLinkCd = "aaaa";
 			temp.ithrCd = "12311";
 			temp.contentsLoc = "afasd";
 			temp.planDtlSq = "44";
 			compsList2.push(temp);
 			temp = new Object;
-			temp.goodsCd = "STYS00000005";
-			temp.itemCd = "A83F-TS517S";
-			temp.optCd = "14024048-1";
-			temp.goodsQty = 3;
+			temp.goodsCd = "STYS00000009";
+			temp.itemCd = "EMF11QPT46";
+			temp.optCd = "10195722-2";
+			temp.goodsQty = 2;
+			temp.goodsType = "G056_S";
+			temp.cartGb = "G";
+			temp.afLinkCd = "aaaa";
+			temp.ithrCd = "12311";
+			temp.contentsLoc = "afasd";
+			temp.planDtlSq = "44";
+			compsList2.push(temp);
+			temp = new Object;
+			temp.goodsCd = "STYS00000009";
+			temp.itemCd = "EMF11QTS37";
+			temp.optCd = "10702803-1";
+			temp.goodsQty = 2;
 			temp.goodsType = "G056_S";
-			temp.cartGb = "C";
+			temp.cartGb = "G";
 			temp.afLinkCd = "aaaa";
 			temp.ithrCd = "12311";
 			temp.contentsLoc = "afasd";
@@ -797,8 +814,13 @@
 				cartArr.push($(this).val());
 			});
 
+			if(cartArr.length == 0) {
+				cartArr.push(0);
+				$("#cartListForm .goods_foot .btn_popup_save").hide();
+			}
+
 			// 선택된 장바구니 정보 가공
-			let data = {	cartSqArr : cartArr }
+			let data = {	cartSqArr : cartArr, shotDelvUseYn : $("input[name=shotDelvUseYn]:checked").val() }
 			let jsonData = JSON.stringify(data);
 
 			$.ajax( {
@@ -826,16 +848,6 @@
 			// 배송비 정보 0원으로 모두 변경 (체크 되지 않은 업체는 0원처리)
 			$("#cartListForm .goods_foot .delvFeeArea").text("배송비 0원");
 
-			/*$("#cartListForm .goods_foot").each(function() {
-				alert($(this).parent().find("input[name=supplyCompNm]").val());
-				let compNm = $(this).parent().find("input[name=supplyCompNm]").val();
-				let html = "<span class='dlvr_fee delvFeeArea'>배송비 <em>0</em>원</span>";
-				if(compNm != "WMS") {
-					html += "<span class='dlvr_shop'><em>" + compNm + "</em> 업체직배송</span>";
-				};
-				$(this).find(".order_delivery").html(html);
-			});*/
-
 			// 장바구니 각 상품 가격 정보 할인 전으로 변경
 			$("#cartListForm .cartInfo input[name=cartSq]").each(function() {
 				if($(this).parent().find(".calc_box .price_org").text() != "") {
@@ -846,7 +858,6 @@
 
 			// $("#cartListForm").find(".delvFeeArea").html("<div class='info_dlvr'><span class='dlvr_fee'>배송비 무료</span></div>");
 			for(let i = 0 ; i < shotList.length ; i++) {
-				cartList.push(shotList[i]);
 				$("#cartListForm .shotCartInfo input[name=cartSq]").each(function() {
 					if(shotList[i].cartSq == $(this).val()) {
 						let shot = shotList[i];
@@ -854,16 +865,10 @@
 						$(this).parent().find(".od_moresale .notApplyTmtbNm > ul").html("");
 
 						// 다다익선 적용 정보 생성성
-						if(shot.qtyTmtbSq > 0 && shot.applyQtySectionYn == "Y") {
+						if((shot.qtyTmtbSq > 0 && shot.applyQtySectionYn == "Y") || shot.amtTmtbSq > 0 && shot.applyAmtSectionYn == "Y") {
 							$(this).parent().find(".applyTmtb").show();
 						}
-						if(shot.amtTmtbSq > 0 && shot.applyAmtSectionYn == "Y") {
-							$(this).parent().find(".applyTmtb").show();
-						}
-						if(shot.qtyTmtbSq > 0 && shot.applyQtySectionYn == "N") {
-							$(this).parent().find(".notApplyTmtb").show();
-						}
-						if(shot.amtTmtbSq > 0 && shot.applyAmtSectionYn == "N") {
+						if((shot.qtyTmtbSq > 0 && shot.applyQtySectionYn == "N") || shot.amtTmtbSq > 0 && shot.applyAmtSectionYn == "N") {
 							$(this).parent().find(".notApplyTmtb").show();
 						}
 
@@ -878,17 +883,16 @@
 			}
 
 			// 자사 상품 배송비
-			if(order.delvYn == "N" || order.delvYn == null) {
-
-			} else if(order.wmsDelvFee == 0) {
-				$(".selfGoodsDelv").html("<span class='dlvr_fee'>배송비 무료</span>");
-			} else {
-				let html = "<span class='dlvr_fee'>배송비 <em>" + Number(order.wmsDelvFee).toLocaleString() + "</em> 원</span><a href='#' class='btn_popup_save'>배송비 SAVE 상품 보기</a>";
-				$(".selfGoodsDelv").html(html);
+			if(order.delvYn == "Y") {
+				if (order.wmsDelvFee == 0) {
+					$(".selfGoodsDelv").html("<span class='dlvr_fee delvFeeArea'>배송비 무료</span>");
+				} else {
+					let html = "<span class='dlvr_fee delvFeeArea'>배송비 <em>" + Number(order.wmsDelvFee).toLocaleString() + "</em> 원</span><a href='#' class='btn_popup_save'>배송비 SAVE 상품 보기</a>";
+					$(".selfGoodsDelv").html(html);
+				}
 			}
 
 			for(let i = 0 ; i < wmsList.length ; i++) {
-				cartList.push(wmsList[i]);
 				$("#cartListForm .wmsCartInfo input[name=cartSq]").each(function() {
 					if(wmsList[i].cartSq == $(this).val()) {
 						let wms = wmsList[i];
@@ -896,16 +900,10 @@
 						$(this).parent().find(".od_moresale .notApplyTmtbNm > ul").html("");
 
 						// 다다익선 적용 정보 생성성
-						if(wms.qtyTmtbSq > 0 && wms.applyQtySectionYn == "Y") {
+						if((wms.qtyTmtbSq > 0 && wms.applyQtySectionYn == "Y") || (wms.amtTmtbSq > 0 && wms.applyAmtSectionYn == "Y")) {
 							$(this).parent().find(".applyTmtb").show();
 						}
-						if(wms.amtTmtbSq > 0 && wms.applyAmtSectionYn == "Y") {
-							$(this).parent().find(".applyTmtb").show();
-						}
-						if(wms.qtyTmtbSq > 0 && wms.applyQtySectionYn == "N") {
-							$(this).parent().find(".notApplyTmtb").show();
-						}
-						if(wms.amtTmtbSq > 0 && wms.applyAmtSectionYn == "N") {
+						if((wms.qtyTmtbSq > 0 && wms.applyQtySectionYn == "N") || (wms.amtTmtbSq > 0 && wms.applyAmtSectionYn == "N")) {
 							$(this).parent().find(".notApplyTmtb").show();
 						}
 
@@ -920,7 +918,6 @@
 			}
 
 			for(let i = 0 ; i < delvList.length ; i++) {
-				cartList.push(delvList[i]);
 				$("#cartListForm .delvList .delvCartInfo input[name=cartSq]").each(function() {
 					if(delvList[i].cartSq == $(this).val()) {
 						let delv = delvList[i];
@@ -928,17 +925,12 @@
 						$(this).parent().find(".od_moresale .notApplyTmtbNm > ul").html("");
 
 						// 다다익선 적용 정보 생성성
-						if(delv.qtyTmtbSq > 0 && delv.applyQtySectionYn == "Y") {
-							$(this).parent().find(".applyTmtb").show();
-						}
-						if(delv.amtTmtbSq > 0 && delv.applyAmtSectionYn == "Y") {
+						if((delv.qtyTmtbSq > 0 && delv.applyQtySectionYn == "Y") || (delv.amtTmtbSq > 0 && delv.applyAmtSectionYn == "Y")) {
 							$(this).parent().find(".applyTmtb").show();
 						}
-						if(delv.qtyTmtbSq > 0 && delv.applyQtySectionYn == "N") {
+						if((delv.qtyTmtbSq > 0 && delv.applyQtySectionYn == "N") || (delv.amtTmtbSq > 0 && delv.applyAmtSectionYn == "N")) {
 							$(this).parent().find(".notApplyTmtb").show();
 						}
-						if(delv.amtTmtbSq > 0 && delv.applyAmtSectionYn == "N") {
-						}
 
 						// 다다익선 할인가 적용
 						if(delv.tmtbDcAmt < delv.currPrice) {
@@ -951,7 +943,7 @@
 						if(delv.delvFee == 0) {
 							$(".delvList").find(".delv_" + delv.delvFeeCd).html("<span class='dlvr_fee delvFeeArea'>배송비 무료</span><span class='dlvr_fee'><em>" + delv.supplyCompNm + "</em> 업체직배송</span>");
 						} else {
-							let html = "<div className='order_delivery'><span class='dlvr_fee delvFeeArea'>배송비 <em>" + Number(delv.delvFee).toLocaleString() + "</em>원</span><span class='dlvr_shop'><em>" + delv.supplyCompNm + "</em> 업체직배송</span><a href='#' className='btn_popup_save'>배송비 SAVE 상품 보기</a></div>";
+							let html = "<span class='dlvr_fee delvFeeArea'>배송비 <em>" + Number(delv.delvFee).toLocaleString() + "</em>원</span><span class='dlvr_shop'><em>" + delv.supplyCompNm + "</em> 업체직배송</span><a href='#' class='btn_popup_save'>배송비 SAVE 상품 보기</a>";
 							$(".delvList").find(".delv_" + delv.delvFeeCd).html(html);
 						}
 					}
@@ -1103,9 +1095,11 @@
 			let cartSqArr = [];
 			orderFlag = true;
 
-			if($("#cartListForm input[name=cartSqArr]:checked").length < 1) {
-				mcxDialog.alert("구매하실 상품을 선택해주세요.");
-				return false;
+			if(cartSq == 'all') {
+				if ($("#cartListForm input[name=cartSqArr]:checked").length < 1) {
+					mcxDialog.alert("구매하실 상품을 선택해주세요.");
+					return false;
+				}
 			}
 
 			if(loginInfo == null || loginInfo.custNo == null || loginInfo.custNo == 0) {
@@ -1190,18 +1184,10 @@
 		$("#od_item_all").on("change", function() {
 			if($("#od_item_all").is(":checked")) {
 				$("input[name=cartSqArr]").prop("checked", true);
-				changeCartSqArr();
 			} else {
 				$("input[name=cartSqArr]").prop("checked", false);
-				// 하단 합계금액, 구매하기 수량 변경
-				$("#cartListForm .realOrderAmtText").text("0");
-				$("#cartListForm .realOrderQtyText").text("0");
-				$("#cartListForm .area_order .number").text("0");
-				$("#cartListForm .od_amount_box .sumListPrice").text("0");
-				$("#cartListForm .od_amount_box .totDelvFee").text("0");
-				$("#cartListForm .od_amount_box .totDcAmt").text("0");
-				$("#cartListForm .totalprice_box .sumRealPayAmt").text("0");
 			}
+			changeCartSqArr();
 		});
 	</script>
 </div>

+ 54 - 27
src/main/webapp/WEB-INF/views/web/common/fragments/BrandGnbWeb.html

@@ -77,34 +77,61 @@
 	let fnGetGnbCategory = function(cate1) {
 		let tag = '';
 		if (cate1 != null) {
-			tag += '<li>\n';
-			tag += '	<a href="javascript:void(0);" onclick="cfnGoToGoodsList([[${brandGroupInfo.brandGroupNo}]],\'' + cate1.cateGb + '\',' + cate1.cate1No + ');">' + cate1.cate1Nm + '</a>\n';
-			if (cate1.leafYn == 'N' && cate1.cate2List.length > 0) {
-				tag += '	<ul class="box_depth2">\n';
-				$.each(cate1.cate2List, function(idx2, cate2) {
-					tag += '		<li>\n';
-					tag += '			<a href="javascript:void(0);" onclick="cfnGoToGoodsList([[${brandGroupInfo.brandGroupNo}]],\'' + cate2.cateGb + '\',' + cate2.cate1No + ',' + cate2.cate2No + ');">' + cate2.cate2Nm + '</a>\n';
-					if (cate2.leafYn == 'N' && cate2.cate3List != null && cate2.cate3List.length > 0) {
-						tag += '			<ul class="box_depth3">\n';
-						$.each(cate2.cate3List, function(idx3, cate3) {
-							tag += '				<li>\n';
-							tag += '					<a href="javascript:void(0);" onclick="cfnGoToGoodsList([[${brandGroupInfo.brandGroupNo}]],\'' + cate3.cateGb + '\',' + cate3.cate1No + ',' + cate3.cate2No + ',' + cate3.cate3No + ');">' + cate3.cate3Nm + '</a>\n';
-							if (cate3.leafYn == 'N' && cate3.cate4List != null && cate3.cate4List.length > 0) {
-								tag += '					<ul class="box_depth3">\n';
-								$.each(cate3.cate4List, function(idx4, cate4) {
-									tag += '						<li><a href="javascript:void(0);" onclick="cfnGoToGoodsList([[${brandGroupInfo.brandGroupNo}]],\'' + cate4.cateGb + '\',' + cate4.cate1No + ',' + cate4.cate2No + ',' + cate4.cate3No + ',' + cate4.cate4No + ');">' + cate4.cate4Nm + '</a></li>\n';
-								});
-								tag += '					</ul>\n';
-							}
-							tag += '				</li>\n';
-						});
-						tag += '			</ul>\n';
-					}
-					tag += '		</li>\n';
-				});
-				tag += '	</ul>\n';
+			if (cate1.cateGb == 'G032_101') { // 카테고리구분이 BYITEM 이면
+				tag += '<li>\n';
+				tag += '	<a href="javascript:void(0);" onclick="cfnGoToGoodsList([[${brandGroupInfo.brandGroupNo}]],\'' + cate1.cateGb + '\',' + cate1.cate1No + ');">' + cate1.cate1Nm + '</a>\n';
+			
+				if (cate1.leafYn == 'N' && cate1.cate2List.length > 0) {
+					tag += '	<ul class="box_depth2">\n';
+					$.each(cate1.cate2List, function(idx2, cate2) {
+						tag += '		<li>\n';
+						tag += '			<a href="javascript:void(0);" onclick="cfnGoToGoodsList([[${brandGroupInfo.brandGroupNo}]],\'' + cate2.cateGb + '\',' + cate2.cate1No + ',' + cate2.cate2No + ');">' + cate2.cate2Nm + '</a>\n';
+						if (cate2.leafYn == 'N' && cate2.cate3List != null && cate2.cate3List.length > 0) {
+							tag += '			<ul class="box_depth3">\n';
+							$.each(cate2.cate3List, function(idx3, cate3) {
+								tag += '				<li>\n';
+								tag += '					<a href="javascript:void(0);" onclick="cfnGoToGoodsList([[${brandGroupInfo.brandGroupNo}]],\'' + cate3.cateGb + '\',' + cate3.cate1No + ',' + cate3.cate2No + ',' + cate3.cate3No + ');">' + cate3.cate3Nm + '</a>\n';
+								if (cate3.leafYn == 'N' && cate3.cate4List != null && cate3.cate4List.length > 0) {
+									tag += '					<ul class="box_depth3">\n';
+									$.each(cate3.cate4List, function(idx4, cate4) {
+										tag += '						<li><a href="javascript:void(0);" onclick="cfnGoToGoodsList([[${brandGroupInfo.brandGroupNo}]],\'' + cate4.cateGb + '\',' + cate4.cate1No + ',' + cate4.cate2No + ',' + cate4.cate3No + ',' + cate4.cate4No + ');">' + cate4.cate4Nm + '</a></li>\n';
+									});
+									tag += '					</ul>\n';
+								}
+								tag += '				</li>\n';
+							});
+							tag += '			</ul>\n';
+						}
+						tag += '		</li>\n';
+					});
+					tag += '	</ul>\n';
+				}
+				tag += '</li>\n';
+			} else { // 카테고리구분이 BYBRAND 이면
+				if (cate1.leafYn == 'N' && cate1.cate2List.length > 0) {
+					$.each(cate1.cate2List, function(idx2, cate2) {
+						tag += '		<li>\n';
+						tag += '			<a href="javascript:void(0);" onclick="cfnGoToGoodsList([[${brandGroupInfo.brandGroupNo}]],\'' + cate2.cateGb + '\',' + cate2.cate1No + ',' + cate2.cate2No + ');">' + cate2.cate2Nm + '</a>\n';
+						if (cate2.leafYn == 'N' && cate2.cate3List != null && cate2.cate3List.length > 0) {
+							tag += '			<ul class="box_depth2">\n';
+							$.each(cate2.cate3List, function(idx3, cate3) {
+								tag += '				<li>\n';
+								tag += '					<a href="javascript:void(0);" onclick="cfnGoToGoodsList([[${brandGroupInfo.brandGroupNo}]],\'' + cate3.cateGb + '\',' + cate3.cate1No + ',' + cate3.cate2No + ',' + cate3.cate3No + ');">' + cate3.cate3Nm + '</a>\n';
+								if (cate3.leafYn == 'N' && cate3.cate4List != null && cate3.cate4List.length > 0) {
+									tag += '					<ul class="box_depth3">\n';
+									$.each(cate3.cate4List, function(idx4, cate4) {
+										tag += '						<li><a href="javascript:void(0);" onclick="cfnGoToGoodsList([[${brandGroupInfo.brandGroupNo}]],\'' + cate4.cateGb + '\',' + cate4.cate1No + ',' + cate4.cate2No + ',' + cate4.cate3No + ',' + cate4.cate4No + ');">' + cate4.cate4Nm + '</a></li>\n';
+									});
+									tag += '					</ul>\n';
+								}
+								tag += '				</li>\n';
+							});
+							tag += '			</ul>\n';
+						}
+						tag += '		</li>\n';
+					});
+				}
 			}
-			tag += '</li>\n';
 		}
 		return tag;
 	}

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

@@ -990,7 +990,7 @@
 				if(menu == "cart") {
 					let data = {shotDelvUseYn : $("input[name=shotDelvUseYn]:checked").val()};
 					getCartList(data);
-				} else if (menu = "quick") {
+				} else if (menu == "quick") {
 					fnGetCartGoodsList();
 				}
 			}
@@ -1011,24 +1011,6 @@
 			}
 
 			confirmMessage = "총 " + cartArr.length + "개의 상품을 삭제합니다.";
-		/*} else if(gbn == "DELV_SELECT") {
-			$("#cartListForm .delvList input[name=cartSqArr]:checked").each(function () {
-				cartArr.push($(this).val());
-			});
-
-			confirmMessage = "총 " + cartArr.length + "개의 상품을 삭제합니다.";
-		} else if(gbn == "WMS_ALL") {
-			$("#cartListForm .wmsList input[name=cartSqArr]").each(function() {
-				cartArr.push($(this).val());
-			});
-
-			confirmMessage = "총알배송상품을 전부 삭제하시겠습니까?";
-		} else if(gbn == "DELV_ALL") {
-			$("#cartListForm .delvList input[name=cartSqArr]").each(function() {
-				cartArr.push($(this).val());
-			});
-
-			confirmMessage = "업체직배송 상품을 전부 삭제하시겠습니까?";*/
 		} else {
 			cartArr.push(gbn);
 			deleteCartAjax(cartArr, menu);
@@ -1044,10 +1026,6 @@
 		});
 	}
 
-	function quickCartOrder() {
-
-	}
-
 	// 장바구니
 	let fnGetCartGoodsList = function() {
 		$.getJSON('/cart/quick/cart/list', function(order, status) {

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

@@ -30,6 +30,12 @@
 		<!-- CONTENT AREA -->
 		<th:block layout:fragment="content"></th:block>
 		<!-- // CONTENT AREA -->
+		<form id="createReview" name="createReview" th:action="@{'/mypage/review/create/form'}" th:method="post">
+			<input type="hidden" name="ordNo"/>
+			<input type="hidden" name="ordDtlNo"/>
+			<input type="hidden" name="goodsCd"/>
+			<input type="hidden" name="reviewStat"/>
+		</form>
 	</div>
 </div>
 

+ 48 - 0
src/main/webapp/WEB-INF/views/web/common/layout/PlanningLayoutWeb.html

@@ -0,0 +1,48 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org"
+	xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout">
+
+<head th:replace="~{web/common/fragments/HeadWeb :: head}"></head>
+
+<body>
+
+<div class="skipComment">
+	<a href="#content">본문 바로가기</a>
+	<a href="#gnb">주메뉴 바로가기</a>
+	<a href="#footer">하단메뉴 바로가기</a>
+</div>
+	
+<th:block th:replace="~{web/common/fragments/VariablesWeb :: variables}"></th:block>
+
+
+<!-- GNB -->
+<th:block th:if="${brandGroupInfo == null }">
+	<header id="header" th:replace="~{web/common/fragments/GnbWeb :: gnb}"></header>
+</th:block>
+<th:block th:if="${brandGroupInfo != null }">
+	<header id="header" th:replace="~{web/common/fragments/BrandGnbWeb :: gnb}"></header>
+</th:block>
+
+
+<!--// GNB -->
+
+<!-- CONTENT AREA -->
+<th:block layout:fragment="content"></th:block>
+<!-- // CONTENT AREA -->
+
+<!-- Footer -->
+<footer id="footer" th:replace="~{web/common/fragments/FooterWeb :: footer}"></footer>
+
+<th:block th:replace="~{web/common/fragments/ScriptsWeb :: scripts}"></th:block>
+
+<script th:inline="javascript">
+/*<![CDATA[*/
+	$(document).ready(function() {
+		$("#container").css('backgroundColor','#fff');
+	});
+/*]]>*/
+</script>
+
+</body>
+</html>

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

@@ -28,9 +28,9 @@
 			</div>
 			<div class="cont_body show">
 				<form id="resetPasswordForm" name="resetPasswordForm" class="form_wrap form_col_c" role="form" method="post">
+					<input type="hidden" name="custId" th:value="${custId}"/>
 					<!-- 비밀번호 재설정 -->
 					<div class="find_result clear" >
-						<input type="hidden" name="custId" th:value="${custId}"/>
 						<div class="form_info">
 							<span class="ico_content_security"></span>
 							<p>안전을 위해 비밀번호를 변경하신 후 이용이 가능합니다.</p>

+ 87 - 88
src/main/webapp/WEB-INF/views/web/customer/PasswordFindFormWeb.html

@@ -186,110 +186,109 @@
 			</div>
 		</div>
 	</div>
-	<script th:src="@{'/biz/customer.js?v=' + ${#calendars.format(#calendars.createNow(), 'yyyyMMddHHmmss')}}" src="/biz/customer.js"></script>
-	<script th:inline="javascript">
-		/*<![CDATA[*/
+<script th:src="@{'/biz/customer.js?v=' + ${#calendars.format(#calendars.createNow(), 'yyyyMMddHHmmss')}}" src="/biz/customer.js"></script>
+<script th:inline="javascript">
+/*<![CDATA[*/
 
-		$('#btnInfoConfirm').on('click', function () {
-			let custInfo = $('#searchCustInfo').serializeObject();
+	$('#btnInfoConfirm').on('click', function () {
+		let custInfo = $('#searchCustInfo').serializeObject();
 
-			if(gagajf.isNull(custInfo.custId)) {
-				mcxDialog.alert("아이디를 입력해주세요.");
-				return;
-			}
+		if(gagajf.isNull(custInfo.custId)) {
+			mcxDialog.alert("아이디를 입력해주세요.");
+			return;
+		}
 
-			if (gagajf.isNull(custInfo.custNm)) {
-				mcxDialog.alert('이름을 형식에 맞게 입력해주세요.');
-				return;
-			}
+		if (gagajf.isNull(custInfo.custNm)) {
+			mcxDialog.alert('이름을 형식에 맞게 입력해주세요.');
+			return;
+		}
 
-			if (gagajf.isNull(custInfo.email)) {
-				mcxDialog.alert('이메일을 입력하여 주세요.');
-				return;
-			}
+		if (gagajf.isNull(custInfo.email)) {
+			mcxDialog.alert('이메일을 입력하여 주세요.');
+			return;
+		}
 
-			if (!fnCheckValidationEmail(custInfo.email)) {
-				mcxDialog.alert('이메일 형식에 맞게 입력해주세요.');
-				return;
-			}
+		if (!fnCheckValidationEmail(custInfo.email)) {
+			mcxDialog.alert('이메일 형식에 맞게 입력해주세요.');
+			return;
+		}
 
-			custInfo.authMethod = 'custInfo';
-			let jsonData = JSON.stringify(custInfo);
-			//console.log('jsonData', jsonData);
-			gagajf.ajaxJsonSubmit('/customer/password/find/custinfo', jsonData, fnInfoConfirmCallBack);
-		});
+		custInfo.authMethod = 'custInfo';
+		let jsonData = JSON.stringify(custInfo);
+		//console.log('jsonData', jsonData);
+		gagajf.ajaxJsonSubmit('/customer/password/find/custinfo', jsonData, fnInfoConfirmCallBack);
+	});
 
-		// 휴대폰 인증
-		$('#btnCellPhoneCertify').on('click', function () {
-			cfnOpenCellphoneCertify();
-		});
+	// 휴대폰 인증
+	$('#btnCellPhoneCertify').on('click', function () {
+		cfnOpenCellphoneCertify();
+	});
 
-		// 아이핀 인증
-		$('#btnIpinCertify').on('click', function () {
-			cfnOpenIpinCertify();
-		});
+	// 아이핀 인증
+	$('#btnIpinCertify').on('click', function () {
+		cfnOpenIpinCertify();
+	});
 
-		// 찾기결과
-		var fnInfoConfirmCallBack = function (result) {
-			$('.form_field').hide();
-			$('.registration_cont').hide();
-			$('.registration_nav').hide();
-			$('#searchDiv').hide();
-			if (result.isFind) {
-				fnGetDisplaySucc(result.authMethod, result);
-			} else {
-				fnGetDisplayFail(result.authMethod);
-			}
-		};
+	// 찾기결과
+	var fnInfoConfirmCallBack = function (result) {
+		$('.form_field').hide();
+		$('.registration_cont').hide();
+		$('.registration_nav').hide();
+		$('#searchDiv').hide();
+		if (result.isFind) {
+			fnGetDisplaySucc(result.authMethod, result);
+		} else {
+			fnGetDisplayFail(result.authMethod);
+		}
+	};
 
-		// 찾기성공
-		var fnGetDisplaySucc = function (authMethod, custInfo) {
-			if (custInfo.authMethod === 'custInfo') {
-				$('#sendEmail').text(custInfo.maskingEmail)
-				$('#sendEmailDiv').show();
-			}
-			if (authMethod === 'mobile' || authMethod === 'ipin') {
-				cfnGoToPage(_PAGE_CUSTOMER_PWD_CHANGE_FIND);
-			}
-		};
+	// 찾기성공
+	var fnGetDisplaySucc = function (authMethod, custInfo) {
+		if (custInfo.authMethod === 'custInfo') {
+			$('#sendEmail').text(custInfo.maskingEmail)
+			$('#sendEmailDiv').show();
+		}
+		if (authMethod === 'mobile' || authMethod === 'ipin') {
+			cfnGoToPage(_PAGE_CUSTOMER_PWD_CHANGE_FIND);
+		}
+	};
 
-		// 찾기실패
-		var fnGetDisplayFail = function (authMethod) {
-			$('.form_head').hide();
-			$('.registration_nav').hide();
-			if (authMethod === 'custInfo') {
-				$('#failCustId').show();
-			}
-			if (authMethod === 'mobile' || authMethod === 'ipin') {
-				$('#failAuthentication').show();
-			}
+	// 찾기실패
+	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)) {
-				let custInfo = {};
-				custInfo.encData = encData;
-				custInfo.authMethod = authMethod;
-				let jsonData = JSON.stringify(custInfo);
-				gagajf.ajaxJsonSubmit('/customer/password/find/certify', jsonData, fnInfoConfirmCallBack)
-			}
-		};
+	// 나이스 본인인증 후 콜백
+	var fnNiceCallBack = function(encData, authMethod) {
+		if (!gagajf.isNull(encData)) {
+			let custInfo = {};
+			custInfo.encData = encData;
+			custInfo.authMethod = authMethod;
+			let jsonData = JSON.stringify(custInfo);
+			gagajf.ajaxJsonSubmit('/customer/password/find/certify', jsonData, fnInfoConfirmCallBack)
+		}
+	};
 
-		$(document).ready( function() {
-			$(document).on('click','.mb .registration_tap > .form_group >.form_field > div',function(e){
-				$(this).find('input').prop('checked', true);
-				$(this).parents('.form_group').find('.regist_box').removeClass('on');
-				$(this).parents('.form_group').find('.regist_box').eq($(this).index()).addClass('on');
-				return false;
-			});
-			$('#searchCustInfo')[0].reset();
+	$(document).ready( function() {
+		$(document).on('click','.mb .registration_tap > .form_group >.form_field > div',function(e){
+			$(this).find('input').prop('checked', true);
+			$(this).parents('.form_group').find('.regist_box').removeClass('on');
+			$(this).parents('.form_group').find('.regist_box').eq($(this).index()).addClass('on');
+			return false;
 		});
+		$('#searchCustInfo')[0].reset();
+	});
 
-
-		/*]]>*/
-	</script>
+/*]]>*/
+</script>
 
 </th:block>
 

+ 362 - 0
src/main/webapp/WEB-INF/views/web/display/BestMainFormWeb.html

@@ -0,0 +1,362 @@
+<!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  : BestMainFormWeb.html
+ * @desc    : 베스트메인 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.04.13   bin2107     최초 작성
+ *******************************************************************************
+ -->
+<body>
+
+<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>
+				<li class="bread_2depth">베스트</li>
+			</ul>
+		</div>
+		<div class="wrap">
+			<div class="content wide dp_best"> <!-- 페이지특정 클래스 = dp_best -->
+				<div class="cont_head">
+					<div>
+						<h3>베스트</h3>
+					</div>
+				</div>
+				<div class="cont_body">
+					<div class="taps">
+						<div>
+							<ul id="cateListArea">
+								<li class="active" id="li0"><a href="javascript:void(0);" onclick="fnBestListSearch(this,0);">전체</a></li>
+								<th:block th:each="item, stat : ${bestCateList}">
+									<li class="" th:id="${'li'+item.cateNo}"><a href="javascript:void(0);" th:onclick="fnBestListSearch(this,[[${item.cateNo}]]);" th:text="${item.cateNm}"></a></li>
+								</th:block>
+							</ul>
+						</div>
+					</div>
+					<!-- 지금 많이 보고 있어요 -->
+					<div class="dp_best_live">
+						<div class="sec_head">
+							<p class="dp_live_txt"><img src="/images/pc/dp_best_livetxt.jpg" alt="STYLE24 실시간 베스트 상품!   "></p>
+							<p class="displayH">지금 많이 <br> <span>보고 있어요</span></p>
+							<button type="button"><span><em class="time">17:30</em> 기준</span></button>
+						</div>
+						<div class="sec_body">
+							<div class="swiper-container dp_live_slider">
+								<div class="swiper-wrapper">
+									<div class="swiper-slide">
+										<div class="item_prod">
+											<div class="item_state">
+												<button type="button" class="itemLike">관심상품 추가</button>
+												<a href="#none" class="itemLink">
+													<div class="itemPic">
+														<img alt="" class="vLHTC pd_img" src="/images/pc/thumb/tmp_pdTogether1.jpg">
+													</div>
+													<div class="itemName">남성 로고 자카드 방풍 패딩 남성 로고 자카드 방풍 패딩 남성 로고 자카드 방풍 패딩</div>
+													<div class="viewCount"><span>508</span>명 보는중</div>
+												</a>
+											</div>
+										</div>
+									</div>
+									<div class="swiper-slide">
+										<div class="item_prod">
+											<div class="item_state">
+												<button type="button" class="itemLike">관심상품 추가</button>
+												<a href="#none" class="itemLink">
+													<div class="itemPic">
+														<img alt="" class="vLHTC pd_img" src="/images/pc/thumb/tmp_pdTogether1.jpg">
+													</div>
+													<div class="itemName">남성 로고 자카드 방풍 패딩 남성 로고 자카드 방풍 패딩 남성 로고 자카드 방풍 패딩</div>
+													<div class="viewCount"><span>508</span>명 보는중</div>
+												</a>
+											</div>
+										</div>
+									</div>
+									<div class="swiper-slide">
+										<div class="item_prod">
+											<div class="item_state">
+												<button type="button" class="itemLike">관심상품 추가</button>
+												<a href="#none" class="itemLink">
+													<div class="itemPic">
+														<img alt="" class="vLHTC pd_img" src="/images/pc/thumb/tmp_pdTogether1.jpg">
+													</div>
+													<div class="itemName">남성 로고 자카드 방풍 패딩 남성 로고 자카드 방풍 패딩 남성 로고 자카드 방풍 패딩</div>
+													<div class="viewCount"><span>508</span>명 보는중</div>
+												</a>
+											</div>
+										</div>
+									</div>
+									<div class="swiper-slide">
+										<div class="item_prod">
+											<div class="item_state">
+												<button type="button" class="itemLike">관심상품 추가</button>
+												<a href="#none" class="itemLink">
+													<div class="itemPic">
+														<img alt="" class="vLHTC pd_img" src="/images/pc/thumb/tmp_pdTogether1.jpg">
+													</div>
+													<div class="itemName">남성 로고 자카드 방풍 패딩 남성 로고 자카드 방풍 패딩 남성 로고 자카드 방풍 패딩</div>
+													<div class="viewCount"><span>508</span>명 보는중</div>
+												</a>
+											</div>
+										</div>
+									</div>
+									<div class="swiper-slide">
+										<div class="item_prod">
+											<div class="item_state">
+												<button type="button" class="itemLike">관심상품 추가</button>
+												<a href="#none" class="itemLink">
+													<div class="itemPic">
+														<img alt="" class="vLHTC pd_img" src="/images/pc/thumb/tmp_pdTogether1.jpg">
+													</div>
+													<div class="itemName">남성 로고 자카드 방풍 패딩 남성 로고 자카드 방풍 패딩 남성 로고 자카드 방풍 패딩</div>
+													<div class="viewCount"><span>508</span>명 보는중</div>
+												</a>
+											</div>
+										</div>
+									</div>
+									<div class="swiper-slide">
+										<div class="item_prod">
+											<div class="item_state">
+												<button type="button" class="itemLike">관심상품 추가</button>
+												<a href="#none" class="itemLink">
+													<div class="itemPic">
+														<img alt="" class="vLHTC pd_img" src="/images/pc/thumb/tmp_pdTogether1.jpg">
+													</div>
+													<div class="itemName">남성 로고 자카드 방풍 패딩 남성 로고 자카드 방풍 패딩 남성 로고 자카드 방풍 패딩</div>
+													<div class="viewCount"><span>508</span>명 보는중</div>
+												</a>
+											</div>
+										</div>
+									</div>
+									<div class="swiper-slide">
+										<div class="item_prod">
+											<div class="item_state">
+												<button type="button" class="itemLike">관심상품 추가</button>
+												<a href="#none" class="itemLink">
+													<div class="itemPic">
+														<img alt="" class="vLHTC pd_img" src="/images/pc/thumb/tmp_pdTogether1.jpg">
+													</div>
+													<div class="itemName">남성 로고 자카드 방풍 패딩 남성 로고 자카드 방풍 패딩 남성 로고 자카드 방풍 패딩</div>
+													<div class="viewCount"><span>508</span>명 보는중</div>
+												</a>
+											</div>
+										</div>
+									</div>
+									<div class="swiper-slide">
+										<div class="item_prod">
+											<div class="item_state">
+												<button type="button" class="itemLike">관심상품 추가</button>
+												<a href="#none" class="itemLink">
+													<div class="itemPic">
+														<img alt="" class="vLHTC pd_img" src="/images/pc/thumb/tmp_pdTogether1.jpg">
+													</div>
+													<div class="itemName">남성 로고 자카드 방풍 패딩 남성 로고 자카드 방풍 패딩 남성 로고 자카드 방풍 패딩</div>
+													<div class="viewCount"><span>508</span>명 보는중</div>
+												</a>
+											</div>
+										</div>
+									</div>
+								</div>
+								<div class="swiper-controls">
+									<div class="swiper-scrollbar"></div>
+								</div>
+							</div>
+						</div>
+					</div>
+					<!-- 지금 많이 보고 있어요 -->
+				</div>
+			</div>
+			<div class="content dp_best_top100">
+				<div class="cont_head">
+					<div>
+						<h3>베스트 TOP100</h3>
+					</div>
+				</div>
+				<div class="cont_body">
+					<div class="ui_row">
+						<div class="ui_col_12">
+							<form class="form_wrap">
+								<div class="form_field">
+									<div class="select_custom select_sex">
+										<div class="combo">
+											<div class="select">구매 성별 전체</div>
+											<ul class="list">
+												<!-- 선택처리 class="selected" / 선택불가 aria-disabled="true" 추가  -->
+												<li class="selected">전체</li>
+												<li>남성</li>
+												<li>여성</li>
+											</ul>
+										</div>
+									</div>
+									<div class="select_custom select_age">
+										<div class="combo">
+											<div class="select">구매 연령 전체</div>
+											<ul class="list">
+												<!-- 선택처리 class="selected" / 선택불가 aria-disabled="true" 추가  -->
+												<li class="selected">전체</li>
+												<li>10대</li>
+												<li>20대</li>
+												<li>30대</li>
+												<li>40대</li>
+												<li>50대 이상</li>
+											</ul>
+										</div>
+									</div>
+								</div>
+							</form>
+						</div>
+					</div>
+
+					<div id="infiniteContainer">
+						<div id="listBoxOuter" class="itemsGrp">
+							<ul class="productlist quarter" >
+							</ul>
+						</div>
+					</div>
+					<div class="list_content">
+						<div class="itemsGrp" id="listBox"> <!-- itemsGrp rank hot deal -->
+							<!--<div class="item_prod">
+								<div class="item_state">
+									<button type="button" class="itemLike">관심상품 추가</button>
+									<a href="#none" class="itemLink">
+										<div class="rank ranker"><span>1</span></div>
+										<div class="itemPic">
+											<img alt="BLUE-a" class=" vLHTC pd_img" src="/images/pc/thumb/prod1.jpg">
+										</div>
+										<p class="itemBrand">BRAND NAME</p>
+										<div class="itemName">남성 헤링본 기모 팬츠 헤링본 기모 팬츠</div>
+										<p class="itemPrice">80,100
+											<span class="itemPrice_original">89,000</span>
+											<span class=" itemPercent">10%</span>
+										</p>
+										<div class="itemcolorchip">
+											<span class="chip_color35" value="ABM">BEIGE</span>
+											<span class="chip_color54" value="BDS">BLACK</span>
+											<span class="chip_color40" value="YBR">WHITE</span>
+										</div>
+										<p class="itemBadge">
+											<span class="badge13">베스트 </span>
+										</p>
+										<div class="itemComment">#주문 폭주 상품</div>
+									</a>
+								</div>
+							</div>-->
+						</div>
+					</div>
+				</div>
+			</div>
+			<div class="last_page" id="divLastPage" style="display: none;">
+				<span>마지막 페이지입니다.</span>
+			</div>
+		</div>
+	</div>
+
+	<form id="bestGoodsForm" name="bestGoodsForm">
+		<input type="hidden" name="pageNo" id="pageNo" value ="1"/>
+		<input type="hidden" name="pageSize" value ="30"/>
+		<input type="hidden" name="cateNo" value=""/>
+		<input type="hidden" name="sortGb"/>
+	</form>
+
+	<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:inline="javascript">
+/*<![CDATA[*/
+	var bestCateList = [[${bestCateList}]];
+
+	$(document).ready( function() {
+		// 베스트TOP100 정렬
+		var select_sex = new sCombo('.select_sex.select_custom');
+		var select_age = new sCombo('.select_age.select_custom');
+
+		/* SLIDE - 지금많이 보고있어요 */
+		var dp_live_slide = new Swiper ('.dp_best_live .dp_live_slider', {
+			slidesPerView: 6,
+			spaceBetween: 20,
+			speed : 1000,
+			freeMode: true,
+			autoplay: false,
+			scrollbar: {
+				el: '.dp_best_live .swiper-scrollbar',
+				hide: false,
+			},
+		});
+	});
+
+	var fnBestListSearch = function (obj, cateNo){
+		if(gagajf.isNull(cateNo)){
+			cateNo = 0;
+		}
+
+		$.each($("#cateListArea").find('li'), function() {
+			$(this).removeClass();
+		});
+		$("#li"+cateNo).addClass('active');
+		$("#bestGoodsForm input[name=cateNo]").val(cateNo);
+		fnCategoryGoodsInfiniteScrollInit();
+		gagaInfiniteScroll.getHistory();
+	}
+
+	// 상품 검색
+	var fnGetInfiniteScrollDataList = function (pageNum){
+		$("#bestGoodsForm input[name=pageNo]").val(pageNum+1);
+		gagajf.ajaxFormSubmit("/display/best/main/goods/list", document.bestGoodsForm,  gagaInfiniteScroll.jsonToHtml);
+	}
+
+	var fnDrawInfiniteScrollData = function (result){
+		let totalCnt = result.totalCnt;
+		gagaInfiniteScroll.pageStatus.totalCount = result.totalCnt;
+		var ithrCd = '';
+		var contentLoc = '';
+
+		if (result.dataList != null && result.dataList.length > 0) {
+			var goodsUrl = [[${@environment.getProperty('upload.goods.view')}]];;
+			let lastPage = result.paging.pageable.pageNo;
+			let endRow = result.endRow - result.paging.pageable.pageSize;
+			var htm = fnCreateGoodsList(result, ithrCd, contentLoc, goodsUrl, lastPage, endRow);
+			gagaInfiniteScroll.draw(htm);
+		}else{
+			if($("#bestGoodsForm input[name=pageNo]").val()==1){
+				$('#listBox').html('<li class="none">상품정보가 존재하지 않습니다.</li>');
+			}
+			$("#divLastPage").show();
+			gagaInfiniteScroll.draw('not');
+		}
+	}
+
+	// 사파리 - event.persisted || 크롬 - window.performance.navigation.type 이 1이면 새로고침, 2면 페이지 이동을 통한 캐쉬페이징
+	$(window).on("pageshow", function(event) {
+		if ( (event.originalEvent && event.originalEvent.persisted) || (window.performance && window.performance.navigation.type == 2)) {
+			var historyData = sessionStorage.getItem(document.location.href);
+			if(historyData!=null){
+				historyData = JSON.parse(historyData);
+			}else{
+				historyData = {};
+			}
+			fnBestListSearch();
+		}else{
+			fnCategoryGoodsInfiniteScrollInit();
+
+			fnBestListSearch();
+		}
+	});
+
+/*]]>*/
+</script>
+
+</th:block>
+
+</body>
+</html>

+ 0 - 2
src/main/webapp/WEB-INF/views/web/display/CategoryGoodsListFormWeb.html

@@ -361,7 +361,6 @@
 		}
 
 		var fnDrawInfiniteScrollData = function (result){
-			console.log('fnDrawInfiniteScrollData');
 			let totalCnt = result.totalCnt;
 			$("#totCntId").text(totalCnt.addComma());
 			gagaInfiniteScroll.pageStatus.totalCount = result.totalCnt;
@@ -373,7 +372,6 @@
 				let lastPage = result.paging.pageable.pageNo;
 				let endRow = result.endRow - result.paging.pageable.pageSize;
 				var htm = fnCreateGoodsList(result, ithrCd, contentLoc, goodsUrl, lastPage, endRow);
-				console.log('1234');
 				gagaInfiniteScroll.draw(htm);
 			}else {
 				if($("#searchForm input[name=pageNo]").val()==1){

+ 356 - 0
src/main/webapp/WEB-INF/views/web/display/LookbookDetailFormWeb.html

@@ -0,0 +1,356 @@
+<!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  : LookbookDetailFormWeb.html
+ * @desc    : 룩북 상세 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.04.06   bin2107     최초 작성
+ *******************************************************************************
+ -->
+<body>
+
+<th:block layout:fragment="content">
+	<div id="container" class="container br">
+		<div class="breadcrumb">
+			<ul>
+				<li class="bread_home"><a href="index.html">홈</a></li>
+				<li class="bread_2depth" th:text="${lookbookInfo.brandNm}">TBJ</li>
+				<li class="bread_3depth">룩북</li>
+			</ul>
+		</div>
+		<div class="wrap">
+			<div class="content br_lookbook_view cont_visual" th:if="${lookbookDetailList != null}"> <!-- 페이지특정 클래스 = br_lookbook_view -->
+				<div class="cont_head">
+					<h3 class="displayH t_c" th:text="${lookbookInfo.title}">2020 F/W COLLECTION</h3>
+				</div>
+				<div class="cont_body">
+					<div class="area_slider">
+						<div class="swiper-container">
+							<div class="swiper-wrapper">
+								<th:block th:each="item, stat : ${lookbookDetailList}">
+									<div class="swiper-slide">
+										<div class="bt_lb_item">
+											<img class="vLHTC lb_img" th:src="${@environment.getProperty('domain.image')+item.sysFileNm}" alt="BLUE-a" />
+											<th:block th:if="${item.lookbookGoodsList != null and !item.lookbookGoodsList.empty}" th:each="goodsItem, goodsStatus : ${item.lookbookGoodsList}">
+												<div class="item_picker" th:style="${'left:'+goodsItem.xlim+'%; top:'+goodsItem.ylim+'%;'}">
+													<button type="button" th:onclick="fnLookbookGoodsPopup([[${goodsItem.sysImgNm}]],[[${goodsItem.brandGroupNm}]],[[${goodsItem.goodsNm}]],[[${goodsItem.listPrice}]],[[${goodsItem.currPrice}]],[[${goodsItem.dcRate}]],[[${goodsItem.goodsCd}]])"><span class="ico ico_picker"></span></button>
+												</div>
+											</th:block>
+										</div>
+									</div>
+								</th:block>
+							</div>
+							<div class="swiper-button-prev"></div>
+							<div class="swiper-button-next"></div>
+						</div>
+					</div>
+					<!--<th:block th:each="item, stat : ${lookbookDetailList}">
+					<div class="text_cont" th:text="${item.imgDesc}">
+						국내 대표 패션기업 한세엠케이의 스타일리시 어반 캐주얼 브랜드 앤듀(ANDEW)가 중성적이고 시크한 감각을 극대화한 2020 F/W 시즌 룩북을 공개했다.<br>
+						앤듀는 올 하반기 정소현, 안재형, 고웅호 등 글로벌 런웨이 무대에서 활약중인 전문 패션 모델들과 함께 성별의 경계를 뛰어넘어 개개인의 개성을 드러내는 젠더뉴트럴 패션을 앤듀만의 감각으로 새롭게 전개한다. 중성적인 매력을 자아내는 3명의 모델들은 각자의 개성과 매력을 뽐내며 세련미를 더한 젠더리스 감성을 한층 더 완성도 있게 소화해 눈길을 끈다. 공개된 룩북에서는 따뜻하고 부드러운 파스텔톤, 차분한 모노크롬 컬러로 극명하게 상반된 분위기를  연출하며 각기 다른 유니섹스 스타일을 선보였다. 격식을 갖추되 포멀하진 않게 자연스럽게 떨어지는 핏과 힙한 디자인을 통해 앤듀만의 젠더뉴트럴 캐주얼룩을 연출한 것. 또한, 이번 시즌에도 패션업계에 불고 있는 ‘필(必)환경’  트렌드에 따라 그린슈머들을 사로잡을 다양한 친환경적인 제품들을 주력으로 출시하며 지속가능한 패션을 실천할 계획이다. 버려진 페트병이나 플라스틱을 활용해 친환경 재생 섬유인 리사이클 페트(PET)원사로 의상을 제작하고, 동물친화적 비건 소재를 활용해 가치소비가 가능할 수 있도록 구성했다.
+					</div>
+					</th:block>-->
+					<div class="text_cont">
+						국내 대표 패션기업 한세엠케이의 스타일리시 어반 캐주얼 브랜드 앤듀(ANDEW)가 중성적이고 시크한 감각을 극대화한 2020 F/W 시즌 룩북을 공개했다.<br>
+						앤듀는 올 하반기 정소현, 안재형, 고웅호 등 글로벌 런웨이 무대에서 활약중인 전문 패션 모델들과 함께 성별의 경계를 뛰어넘어 개개인의 개성을 드러내는 젠더뉴트럴 패션을 앤듀만의 감각으로 새롭게 전개한다. 중성적인 매력을 자아내는 3명의 모델들은 각자의 개성과 매력을 뽐내며 세련미를 더한 젠더리스 감성을 한층 더 완성도 있게 소화해 눈길을 끈다. 공개된 룩북에서는 따뜻하고 부드러운 파스텔톤, 차분한 모노크롬 컬러로 극명하게 상반된 분위기를  연출하며 각기 다른 유니섹스 스타일을 선보였다. 격식을 갖추되 포멀하진 않게 자연스럽게 떨어지는 핏과 힙한 디자인을 통해 앤듀만의 젠더뉴트럴 캐주얼룩을 연출한 것. 또한, 이번 시즌에도 패션업계에 불고 있는 ‘필(必)환경’  트렌드에 따라 그린슈머들을 사로잡을 다양한 친환경적인 제품들을 주력으로 출시하며 지속가능한 패션을 실천할 계획이다. 버려진 페트병이나 플라스틱을 활용해 친환경 재생 섬유인 리사이클 페트(PET)원사로 의상을 제작하고, 동물친화적 비건 소재를 활용해 가치소비가 가능할 수 있도록 구성했다.
+					</div>
+				</div>
+			</div>
+			<div class="content br_lookbook_view cont_items" th:if="${lookbookDetailList != null}">
+
+				<div class="cont_head">
+					<h3>룩북 속 상품<span class="number">(9,999)</span></h3>
+					<button class="btn btn_primary"><span>모두 쇼핑백 담기</span></button>
+				</div>
+				<div class="cont_body">
+					<div class="area_slider">
+						<div class="swiper-container">
+							<div class="swiper-wrapper">
+								<div class="swiper-slide">
+									<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_pdTogether1.jpg">
+												</div>
+												<p class="itemBrand">BRAND NAME1</p>
+												<div class="itemName">남성 로고 자카드 방풍 패딩</div>
+												<p class="itemPrice">80,100
+													<span class="itemPrice_original">89,000</span>
+													<span class="itemPercent">10%</span>
+												</p>
+											</a>
+										</div>
+									</div>
+								</div>
+								<div class="swiper-slide">
+									<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_pdTogether1.jpg">
+												</div>
+												<p class="itemBrand">BRAND NAME1</p>
+												<div class="itemName">남성 로고 자카드 방풍 패딩 스웨터 가디건 자카드 방풍 패딩 스웨터 가디건 자카드 방풍 패딩 스웨터 가디건</div>
+												<p class="itemPrice">80,100
+													<span class="itemPrice_original">89,000</span>
+													<span class="itemPercent">10%</span>
+												</p>
+											</a>
+										</div>
+									</div>
+								</div>
+								<div class="swiper-slide">
+									<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_pdTogether1.jpg">
+												</div>
+												<p class="itemBrand">BRAND NAME1</p>
+												<div class="itemName">남성 로고 자카드 방풍 패딩 스웨터 가디건 자카드 방풍 패딩 스웨터 가디건 자카드 방풍 패딩 스웨터 가디건</div>
+												<p class="itemPrice">80,100
+													<span class="itemPrice_original">89,000</span>
+													<span class="itemPercent">10%</span>
+												</p>
+											</a>
+										</div>
+									</div>
+								</div>
+								<div class="swiper-slide">
+									<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_pdTogether1.jpg">
+												</div>
+												<p class="itemBrand">BRAND NAME1</p>
+												<div class="itemName">남성 로고 자카드 방풍 패딩 스웨터 가디건 자카드 방풍 패딩 스웨터 가디건 자카드 방풍 패딩 스웨터 가디건</div>
+												<p class="itemPrice">80,100
+													<span class="itemPrice_original">89,000</span>
+													<span class="itemPercent">10%</span>
+												</p>
+											</a>
+										</div>
+									</div>
+								</div>
+								<div class="swiper-slide">
+									<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_pdTogether1.jpg">
+												</div>
+												<p class="itemBrand">BRAND NAME1</p>
+												<div class="itemName">남성 로고 자카드 방풍 패딩 스웨터 가디건 자카드 방풍 패딩 스웨터 가디건 자카드 방풍 패딩 스웨터 가디건</div>
+												<p class="itemPrice">80,100
+													<span class="itemPrice_original">89,000</span>
+													<span class="itemPercent">10%</span>
+												</p>
+											</a>
+										</div>
+									</div>
+								</div>
+								<div class="swiper-slide">
+									<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_pdTogether1.jpg">
+												</div>
+												<p class="itemBrand">BRAND NAME1</p>
+												<div class="itemName">남성 로고 자카드 방풍 패딩 스웨터 가디건 자카드 방풍 패딩 스웨터 가디건 자카드 방풍 패딩 스웨터 가디건</div>
+												<p class="itemPrice">80,100
+													<span class="itemPrice_original">89,000</span>
+													<span class="itemPercent">10%</span>
+												</p>
+											</a>
+										</div>
+									</div>
+								</div>
+								<div class="swiper-slide">
+									<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_pdTogether1.jpg">
+												</div>
+												<p class="itemBrand">BRAND NAME1</p>
+												<div class="itemName">남성 로고 자카드 방풍 패딩 스웨터 가디건 자카드 방풍 패딩 스웨터 가디건 자카드 방풍 패딩 스웨터 가디건</div>
+												<p class="itemPrice">80,100
+													<span class="itemPrice_original">89,000</span>
+													<span class="itemPercent">10%</span>
+												</p>
+											</a>
+										</div>
+									</div>
+								</div>
+								<div class="swiper-slide">
+									<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_pdTogether1.jpg">
+												</div>
+												<p class="itemBrand">BRAND NAME1</p>
+												<div class="itemName">남성 로고 자카드 방풍 패딩 스웨터 가디건 자카드 방풍 패딩 스웨터 가디건 자카드 방풍 패딩 스웨터 가디건</div>
+												<p class="itemPrice">80,100
+													<span class="itemPrice_original">89,000</span>
+													<span class="itemPercent">10%</span>
+												</p>
+											</a>
+										</div>
+									</div>
+								</div>
+							</div>
+							<!-- Add Scrollbar -->
+							<div class="swiper-scrollbar"></div>
+						</div>
+					</div>
+				</div>
+			</div>
+			<div class="content br_lookbook_view cont_others" th:if="${otherLookbookList}">
+				<div class="cont_head">
+					<h3 class="subH1 t_c mb40">다른 룩북 보기</h3>
+					<button onclick="cfnGoToLookbookList();"><span>전체보기</span></button>
+				</div>
+				<div class="cont_body">
+					<div class="area_slider">
+						<div class="swiper-container">
+							<div class="swiper-wrapper">
+								<th:block th:if="${otherLookbookList}" th:each="oneData, status : ${otherLookbookList}">
+									<div class="swiper-slide">
+										<a th:href="|javascript:cfnGoToLookbookDetail('${oneData.lookbookSq}','${oneData.brandCd}')|">
+											<div class="thumb">
+												<img th:src="${@environment.getProperty('domain.image')+oneData.sysFileNm}" alt="" style="height:307px;">
+											</div>
+											<div class="txt">
+												<p class="title" th:text="${oneData.title}">2020 F/W COLLECTION 2020</p>
+											</div>
+										</a>
+									</div>
+								</th:block>
+							</div>
+						</div>
+						<!-- Add Arrows -->
+						<div class="swiper-button-next"></div>
+						<div class="swiper-button-prev"></div>
+					</div>
+				</div>
+			</div>
+		</div>
+	</div>
+
+	<!-- 상단_LOOKBOOK_picker_상품_팝업 -->
+	<div class="modal fade br_pop lookbook_item_pop" id="lookbookItemPop" tabindex="-1" role="dialog" aria-labelledby="lookbook_item_label" aria-hidden="true">
+		<div class="modal-dialog" role="document">
+			<div class="modal-content">
+				<div class="modal-header">
+					<h5 class="modal-title sr-only" id="lookbook_item_label">상품정보</h5>
+				</div>
+				<div class="modal-body">
+					<div class="itemsGrp">
+						<div class="item_prod">
+							<div class="item_state">
+								<div class="itemLink">
+									<div class="itemPic">
+										<img alt="BLACK-a" class=" vLHTC pd_img" src="/images/pc/thumb/ev_list_img05.jpg">
+									</div>
+									<p class="itemBrand">BRAND NAME</p>
+									<div class="itemName">[온라인 단독] 여성 니트 후드 경량 다운 점퍼 여성 니트 후드 경량 다운 점퍼 여성 니트 후드 경량 다운 점퍼</div>
+									<span class="itemPrice_original">89,000</span>
+									<p class="itemPrice">80,100
+										<span class="itemPercent">10%</span>
+									</p>
+									<button type="button" class="btn btn_default"><span>자세히 보기</span></button>
+								</div>
+							</div>
+						</div>
+					</div>
+				</div>
+			</div>
+		</div>
+	</div>
+	<!-- //상단_LOOKBOOK_picker_상품_팝업 -->
+
+	<script th:inline="javascript">
+/*<![CDATA[*/
+	var fnTest = function (){
+		console.log('18');
+	}
+	var goodsImgUrl = [[${@environment.getProperty('upload.goods.view')}]];
+	var fnLookbookGoodsPopup = function(obj1,obj2,obj3,obj4,obj5,obj6,obj7){
+	$("#lookbookItemPop").modal("show");
+	$("#lookbookItemPop").find(".pd_img").attr('src',goodsImgUrl+'/'+obj1);
+	$("#lookbookItemPop").find(".itemBrand").text(obj2);
+	$("#lookbookItemPop").find(".itemName").text(obj3);
+	$("#lookbookItemPop").find(".itemPrice_original").text(obj4);
+	$("#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 */
+		var lookbook_visual_slide = new Swiper('.br_lookbook_view.cont_visual .swiper-container', {
+			loop: true,
+			slidesPerView: 'auto',
+			spaceBetween: 20,
+			speed : 800,
+			autoWidth: true,
+			autoHeight: true,
+			centeredSlides: true,
+			autoplay: false,
+			navigation: {
+				nextEl: '.br_lookbook_view.cont_visual .swiper-button-next',
+				prevEl: '.br_lookbook_view.cont_visual .swiper-button-prev',
+			},
+			pagination: {
+				el: '.br_lookbook_view.cont_visual .swiper-pagination',
+				clickable: true,
+			},
+		}, fnTest());
+
+		/* 슬라이드 - 룩북 속 상품 */
+		var togetherItemSwiper = new Swiper('.br_lookbook_view.cont_items .swiper-container', {
+			slidesPerView: 6,
+			spaceBetween: 20,
+			scrollbar: {
+				el: '.br_lookbook_view.cont_items .swiper-scrollbar',
+				hide: true,
+			},
+		});
+
+
+		var br_ohter_slide = new Swiper('.br_lookbook_view.cont_others .swiper-container', {
+			slidesPerView: 5,
+			spaceBetween: 20,
+			navigation: {
+				nextEl: '.br_lookbook_view.cont_others .swiper-button-next',
+				prevEl: '.br_lookbook_view.cont_others .swiper-button-prev',
+			},
+		});
+
+		// 슬라이드 - 상단_LOOKBOOK > picker - 룩북_피커_상품정보 팝업
+		$(document).on('click','#btn_picker_item01',function(e){
+			$("#lookbookItemPop").modal("show");
+			return false;
+		});
+	});
+
+/*]]>*/
+</script>
+
+</th:block>
+
+</body>
+</html>

+ 81 - 406
src/main/webapp/WEB-INF/views/web/mypage/MypageCreCancelDetailFormWeb.html

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

+ 353 - 0
src/main/webapp/WEB-INF/views/web/mypage/MypageCreExchangeDetailFormWeb.html

@@ -0,0 +1,353 @@
+<!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  : MypageCreExchangeDetailFormWeb.html
+ * @desc    : 마이페이지 > 취소/반품/교환내역 > 교환상세 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2021 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.04.13   card007     최초 작성
+ *******************************************************************************
+ -->
+<body>
+
+<th:block layout:fragment="content">
+	<div class="content myOrderView"> <!-- 페이지특정 클래스 = myOrderView -->
+		<div class="cont_body">
+			<!-- CONT-BODY -->
+			<div class="lnb">
+				<div class="lnb_tit">
+					<h2>마이페이지</h2>
+				</div>
+				<div class="lnb_list">
+					<ul id="mypageLnbList"></ul>
+				</div>
+			</div>
+			<div class="cont">
+				<div class="sec_head">
+					<h3 class="subH1">교환상세</h3>
+					<span class="order_number">주문번호&nbsp;:&nbsp;<em th:text="${oneData.ordNo}"></em></span>
+				</div>
+				<div class="sec_body">
+					<div class="part_goods">
+						<div class="goods_head">
+							<p th:unless="${oneData.giftPackYn == 'Y'}">주문일 <span th:text="${oneData.ordDt}"></span></p>
+							<p th:if="${oneData.giftPackYn == 'Y'}">선물일 <span th:text="${oneData.ordDt}"></span></p>
+							<a href="javascript:void(0)" th:attr="ordNo=${oneData.ordNo}" onclick="fnGoToOrderDetail(this);">상세보기</a>
+						</div>
+						<div class="goods_cont">
+							<!-- 주문상품 -->
+							<th:block th:if="${exchangeDetailList.exchangeDetailList}" th:each="exchangeDtl, status : ${exchangeDetailList.exchangeDetailList}" th:with="imageUrl=${@environment.getProperty('upload.goods.view')}">
+								<div class="goods_info">
+									<div class="order_desc">
+										<div class="goods_box">
+											<div class="gd_item">
+												<a href="javascript:void(0)" th:attr="goodsCd=${exchangeDtl.goodsCd}" onclick="fnGoToGoodsDetail(this)">
+													<span class="thumb">
+														<img th:src="${imageUrl + '/' + exchangeDtl.sysImgNm}" width="100%" alt="">
+													</span>
+													<p>
+														<span class="brand" th:text="${exchangeDtl.brandNm}"></span>
+														<span class="tag primary" th:if="${exchangeDtl.shotDelvYn == 'Y'}">총알배송</span>
+														<span class="tag" th:if="${exchangeDtl.shotDelvYn == 'N' and exchangeDtl.selfGoodsYn == 'Y'}">STYLE24 일반배송</span>
+														<span class="tag" th:if="${exchangeDtl.selfGoodsYn == 'N'}">업체직배송</span>
+													</p>
+													<p>
+														<span class="name" th:text="${exchangeDtl.goodsNm}"></span>
+													</p>
+												</a>
+											</div>
+											<div class="gd_opt">
+												<div class="option_wrap">
+													<span class="title sr-only">주문 옵션</span>
+													<span class="option" th:if="${exchangeDtl.goodsType == 'G056_S'}" th:each="option, status : ${exchangeDtl.colorNmArr}" th:text="|${exchangeDtl.itemNmArr[status.index]} / ${option} / ${exchangeDtl.optCd2Arr[status.index]}|"></span>
+													<span class="option" th:unless="${exchangeDtl.goodsType == 'G056_S'}" th:text="|${exchangeDtl.colorNm} / ${exchangeDtl.optCd2}|"></span>
+												</div>
+											</div>
+											<div class="gd_calc">
+												<p>
+													<span class="count"><em th:text="${exchangeDtl.chgQty}"></em>개</span>
+												</p>
+												<p>
+													<span class="price_org" th:if="${exchangeDtl.priceOrg > exchangeDtl.priceSale}"><em th:text="${#numbers.formatInteger(exchangeDtl.priceOrg, 1, 'COMMA')}"></em>원</span>
+													<span class="price_sale"><em th:text="${#numbers.formatInteger(exchangeDtl.priceSale, 1, 'COMMA')}"></em>원</span>
+												</p>
+											</div>
+											<div class="gd_opt">
+												<div class="option_wrap">
+													<span class="title">교환 옵션</span>
+													<span class="option" th:if="${exchangeDtl.goodsType == 'G056_S'}" th:each="option, status : ${exchangeDtl.chgColorNmArr}" th:text="|${exchangeDtl.chgItemNmArr[status.index]} / ${option} / ${exchangeDtl.chgOptCd2Arr[status.index]}|"></span>
+													<span class="option" th:unless="${exchangeDtl.goodsType == 'G056_S'}" th:text="|${exchangeDtl.chgColorNm} / ${exchangeDtl.chgOptCd2}|"></span>
+												</div>
+											</div>
+										</div>
+										<div class="status_box">
+											<p>
+												<th:block th:text="${exchangeDtl.chgStatNm}"></th:block>
+												<span class="date" th:text="${exchangeDtl.chgDate}"></span>
+												<span class="time" th:text="${exchangeDtl.chgTime}"></span>
+											</p>
+										</div>
+										<div class="button_box">
+											<p th:if="${exchangeDtl.chgStat == 'G685_20' or exchangeDtl.chgStat == 'G685_21'}"><button type="button" class="btn btn_default btn_sm" th:attr="ordChgSq=${exchangeDtl.ordChgSq}" onclick="fnCreCancel(this);"><span>신청취소</span></button></p>
+											<p th:if="${exchangeDtl.chgStat == 'G685_32' or exchangeDtl.chgStat == 'G685_21'}"><button type="button" class="btn btn_default btn_sm" th:attr="ordChgSq=${exchangeDtl.ordChgSq}" onclick="fnCrePayAddCost(this);"><span>결제하기</span></button></p>
+											<p><button type="button" class="btn btn_default btn_sm" onclick="cfnGoToPage(_PAGE_ONETOONE_QNA_REG);"><span>1:1 문의</span></button></p>
+										</div>
+									</div>
+									<!-- 교환결제대기 -->
+									<div class="order_text" th:if="${exchangeDtl.chgStat == 'G685_21' or (exchangeDtl.chgGb == 'G680_40' and exchangeDtl.chgStat == 'G685_32')}"><p th:text="|${exchangeDtl.addPayCost}|원 결제 후 교환 가능합니다."></p></div>
+									<!-- 교환접수 -->
+									<div class="order_text" th:if="${exchangeDtl.chgStat == 'G685_20'}"><p>교환 신청이 접수 되었습니다. 신속하게 처리하여 드리겠습니다.</p></div>
+									<!-- 회수요청 -->
+									<div class="order_text" th:if="${exchangeDtl.chgStat == 'G685_30'}"><p>고객님이 요청하신 회수지로 상품을 회수 중에 있습니다.</p></div>
+									<!-- 교환상품검수중 -->
+									<div class="order_text" th:if="${exchangeDtl.chgStat == 'G685_31' and exchangeDtl.chgGb == 'G680_40'}"><p>고객님이 교환하신 상품을 검수 중에 있습니다.</p></div>
+									<!-- 교환완료 -->
+									<div class="order_text" th:if="${exchangeDtl.chgStat == 'G685_40' and (exchangeDtl.chgOrdDtlStat == 'G013_60' or exchangeDtl.chgOrdDtlStat == 'G013_70')}"><p>반품이 완료되었습니다.</p></div>
+									<!-- 교환철회 -->
+									<div class="order_text" th:if="${exchangeDtl.chgStat == 'G685_49'}"><p>요청하신 교환을 취소하였습니다.</p></div>
+								</div>
+							</th:block>
+							<!-- //주문상품 -->
+						</div>
+					</div>
+					<h4 class="subH3">상세 정보</h4>
+					<div class="tbl type1">
+						<table>
+							<colgroup>
+								<col width="210">
+								<col width="*">
+							</colgroup>
+							<tbody>
+								<tr>
+									<th>교환접수 일자</th>
+									<td th:text="${oneData.chgDt}"></td>
+								</tr>
+								<tr>
+									<th>교환완료 일자</th>
+									<td th:text="${oneData.completeDt}"></td>
+								</tr>
+							</tbody>
+						</table>
+					</div>
+					<h4 class="subH3">교환 상품 배송지</h4>
+					<div class="tbl type1">
+						<table>
+							<colgroup>
+								<col width="210">
+								<col width="*">
+							</colgroup>
+							<tbody>
+								<tr>
+									<th>
+										배송지 정보
+									</th>
+									<td>
+										<div class="block_line">
+											<ul>
+												<li>
+													<span id="recipNm" th:text="${oneData.recipNm}"></span>
+												</li>
+												<li>
+													<span id="recipPhnno" th:text="${oneData.recipPhnno}"></span>
+												</li>
+												<li>
+													<span>서울시 영등포구 은행로 11, 8층 (여의도동, 일신빌딩)</span>
+													<button type="button" class="btn btn_default btn_sm" th:if="${oneData.chgOrdDtlStat == 'G013_20' or oneData.chgOrdDtlStat == 'G013_25' or oneData.chgOrdDtlStat == 'G013_30' or oneData.chgOrdDtlStat == 'G013_35' or oneData.chgOrdDtlStat == 'G013_40'}" onclick="fnChangeAddr('recip');"><span>배송지 변경</span></button>
+												</li>
+												<li>
+													배송요청 사항&nbsp;:&nbsp;<span>직접 받고 부재 시 문 앞</span>
+													<button type="button" class="btn_underline" th:if="${oneData.chgOrdDtlStat == 'G013_20' or oneData.chgOrdDtlStat == 'G013_25' or oneData.chgOrdDtlStat == 'G013_30' or oneData.chgOrdDtlStat == 'G013_35' or oneData.chgOrdDtlStat == 'G013_40'}" onclick="fnChangeMemo('recip')"><span>변경하기</span></button>
+												</li>
+											</ul>
+										</div>
+									</td>
+								</tr>
+							</tbody>
+						</table>
+					</div>
+					<th:block th:if="${oneData.wdGb == 'W'}">
+						<h4 class="subH3">상품 회수지</h4>
+						<div class="tbl type1">
+							<table>
+								<colgroup>
+									<col width="210">
+									<col width="*">
+								</colgroup>
+								<tbody>
+									<tr>
+										<th>회수 진행 여부</th>
+										<td>회수요청</td>
+									</tr>
+									<tr>
+										<th>회수지 정보</th>
+										<td>
+											<div class="block_line">
+												<ul>
+													<li>
+														<span id="chgerNm" th:text="${oneData.chgerNm}"></span>
+													</li>
+													<li>
+														<span id="chgerPhnno" th:text="${oneData.chgerPhnno}"></span>
+													</li>
+													<li>
+														<span id="chgerAddr" th:text="|${oneData.chgerBaseAddr} ${oneData.chgerDtlAddr}|"></span>
+														<button type="button" class="btn btn_default btn_sm" th:if="${oneData.chgStat == 'G685_20' or oneData.chgStat == 'G685_21'}" onclick="fnChangeAddr('chger');"><span>회수지 변경</span></button>
+													</li>
+													<li>
+														배송요청 사항&nbsp;:&nbsp;<span id="delvMemo" th:text="${oneData.delvMemo}"></span>
+														<button type="button" class="btn_underline" th:if="${oneData.chgStat == 'G685_20' or oneData.chgStat == 'G685_21'}" onclick="fnChangeMemo('chger');"><span>변경하기</span></button>
+													</li>
+												</ul>
+											</div>
+										</td>
+									</tr>
+									<tr th:if="${not #strings.isEmpty(oneData.wdInvoiceNo) and not #strings.isEmpty(oneData.shipCompNm)}">
+										<th>회수 정보</th>
+										<td>
+											<th:block th:text="|${oneData.shipCompNm} / ${oneData.wdInvoiceNo}|"></th:block>
+											<button type="button" class="btn btn_default btn_sm" onclick="fnGoToWithdrawDelivery()"><span>회수조회</span></button>
+										</td>
+									</tr>
+								</tbody>
+							</table>
+						</div>
+					</th:block>
+					<div class="btn_footer_area">
+						<button type="button" class="btn btn_dark btn_md" onclick="cfnGoToPage(_PAGE_MYPAGE_CRE_LIST);"><span>확인</span></button>
+					</div>
+				</div>
+			</div>
+			<!-- // CONT-BODY -->
+		</div>
+	</div>
+<script src="/ux/plugins/gaga/gaga.paging.js"></script>
+<script th:inline="javascript">
+	/*<![CDATA[*/
+	let addrGb = '';
+	let memoGb = '';
+
+	$(document).ready(function() {
+		// 마이페이지 LNB 설정
+		fnSetMypageLnbList(2);
+		
+		// 마이페이지 location 설정
+		fnSetMypageLocation('취소/반품/환불내역', '_PAGE_MYPAGE_CRE_LIST', '반품 상세');
+	});
+	
+	// 배송메모 및 반품메모 변경 처리
+	var fnChangeMemo = function(param) {
+		memoGb = param;
+		fnChangeDeliveryMemo();
+	}
+	
+	// 배송지 및 교환지 변경 처리
+	var fnChangeAddr = function(param) {
+		addrGb = param;
+		fnChangeDeliveryAddr();
+	}
+	
+	// 배송지 및 회수지 정보 설정
+	var delvAddrSet = function(delvObj) {
+		let url = '';
+		let ordChgSq = oneData.ordChgSq;
+		let delvAddrSq = oneData.delvAddrSq;
+		let recipNm = delvObj.recipNm;
+		let recipPhnno = delvObj.recipPhnno;
+		let recipZipcode = delvObj.recipZipcode;
+		let recipBaseAddr = delvObj.recipBaseAddr;
+		let recipDtlAddr = delvObj.recipDtlAddr;
+		let delvMemo = delvObj.delvMemo;
+		let recipAddr = recipBaseAddr + ' ' + recipDtlAddr;
+
+		let data = {};
+
+		if (addrGb == 'chger') {
+			url = '/mypage/change/chger/addr';
+			data.ordChgSq = ordChgSq;
+			data.chgerNm = recipNm;
+			data.chgerPhnno = recipPhnno;
+			data.chgerZipcode = recipZipcode;
+			data.chgerBaseAddr = recipBaseAddr;
+			data.chgerDtlAddr = recipDtlAddr;
+			data.chgerRtnMemo = delvMemo;
+		} else {
+			url = '/mypage/change/delvery/addr';
+			data.delvAddrSq = delvAddrSq;
+			data.recipNm = recipNm;
+			data.recipPhnno = recipPhnno;
+			data.recipZipcode = recipZipcode;
+			data.recipBaseAddr = recipBaseAddr;
+			data.recipDtlAddr = recipDtlAddr;
+			data.delvMemo = delvMemo;
+		}
+
+		let jsonData = JSON.stringify(data);
+
+		gagajf.ajaxJsonSubmit(url, jsonData, function (result) {
+			if (result.status == '200') {
+				if (addrGb == 'chger') {
+					$('#chgerNm').text(recipNm);
+					$('#chgerPhnno').text(recipPhnno);
+					$('#chgerAddr').text(recipAddr);
+					$('#chgerRtnMemo').text(delvMemo);
+				} else {
+					$('#recipNm').text(recipNm);
+					$('#recipPhnno').text(recipPhnno);
+					$('#recipAddr').text(recipAddr);
+					$('#delvMemo').text(delvMemo);
+				}
+			}
+		});
+	}
+	
+	// 배송메모 설정
+	var delvMemoSet = function(delvMemoObj) {
+		let url = '';
+		let ordChgSq = oneData.ordChgSq;
+		let delvAddrSq = oneData.delvAddrSq;
+		let delvMemo = delvMemoObj.delvMemo;
+		
+		let data = {};
+		
+		if (memoGb == 'chger') {
+			url = '/mypage/change/chger/rtn/memo';
+			data.ordChgSq = ordChgSq;
+			data.chgerRtnMemo = delvMemo;
+		} else {
+			url = 'change/delvery/memo';
+			data.delvAddrSq = delvAddrSq;
+			data.delvMemo = delvMemo;
+		}
+		
+		let jsonData = JSON.stringify(data);
+		
+		gagajf.ajaxJsonSubmit(url, jsonData, function(result) {
+			if (result.status == '200') {
+				if (memoGb == 'chger') {
+					$("#chgerRtnMemo").text(delvMemo);
+				} else {
+					$("#delvMemo").text(delvMemo);
+				}
+			}
+		});
+	}
+
+	var fnGoToWithdrawDelivery = function(param) {
+		// TODO
+		// 회수조회 페이지 이동
+	}
+/*]]>*/
+</script>
+
+</th:block>
+
+</body>
+</html>

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

@@ -154,12 +154,15 @@
 				</form>
 				<form id="exchangeForm" name="exchangeForm" action="#" th:action="@{'/mypage/cre/exchange/detail/form'}" th:method="post">
 					<input type="hidden" name="ordChgSq"/>
+					<input type="hidden" name="ordNo"/>
 				</form>
 				<form id="returnForm" name="returnForm" action="#" th:action="@{'/mypage/cre/return/detail/form'}" th:method="post">
 					<input type="hidden" name="ordChgSq"/>
+					<input type="hidden" name="ordNo"/>
 				</form>
 				<form id="cancelForm" name="cancelForm" th:action="@{'/mypage/cre/cancel/detail/form'}" th:method="post">
 					<input type="hidden" name="ordChgSq"/>
+					<input type="hidden" name="ordNo"/>
 				</form>
 			</div>
 			<!-- // CONT-BODY -->
@@ -289,7 +292,7 @@
 				} else {
 					tag += '								<p>주문일 <span>' + creList.ordDt + '</span></p>\n';
 				}
-				tag += '								<a href="javascript:void(0)" ordChgSq="' + creList.ordChgSq + '" chgGb="' + creList.oneData.chgGb + '" onclick="fnGoToCreDetail(this)">상세보기</a>\n';
+				tag += '								<a href="javascript:void(0)" ordChgSq="' + creList.ordChgSq + '" chgGb="' + creList.oneData.chgGb + '" ordNo ="' + creList.oneData.ordNo + '" onclick="fnGoToCreDetail(this)">상세보기</a>\n';
 				tag += '							</div>\n';
 				tag += '							<div class="goods_cont">\n';
 				$.each(creList.creList, function (index, cre) {
@@ -464,11 +467,21 @@
 	var fnGoToCreDetail = function(param) {
 		let ordChgSq = $(param).attr('ordChgSq');
 		let chgGb = $(param).attr('chgGb');
+		let ordNo = $(param).attr('ordNo');
 		
-		console.log('ordChgSq : ' + ordChgSq);
-		console.log('chgGb : ' + chgGb);
-		// TODO
-		// 취반교 상세 페이지 이동
+		if (chgGb == 'G680_20') {
+			$('#cancelForm input[name=ordChgSq]').val(ordChgSq);
+			$('#cancelForm input[name=ordNo]').val(ordNo);
+			document.cancelForm.submit();
+		} else if (chgGb == 'G680_30') {
+			$('#returnForm input[name=ordChgSq]').val(ordChgSq);
+			$('#returnForm input[name=ordNo]').val(ordNo);
+			document.returnForm.submit();
+		} else if (chgGb == 'G680_40') {
+			$('#exchangeForm input[name=ordChgSq]').val(ordChgSq);
+			$('#exchangeForm input[name=ordNo]').val(ordNo);
+			document.exchangeForm.submit();
+		}
 	}
 	
 	// 취반교 신청 취소 버튼 클릭 이벤트

+ 342 - 0
src/main/webapp/WEB-INF/views/web/mypage/MypageCreReturnDetailFormWeb.html

@@ -0,0 +1,342 @@
+<!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  : MypageCreReturnDetailFormWeb.html
+ * @desc    : 마이페이지 > 취소/반품/교환내역 > 반품상세 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2021 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.04.13   card007     최초 작성
+ *******************************************************************************
+ -->
+<body>
+
+<th:block layout:fragment="content">
+	<div class="content myOrderView"> <!-- 페이지특정 클래스 = myOrderView -->
+		<div class="cont_body">
+			<!-- CONT-BODY -->
+			<div class="lnb">
+				<div class="lnb_tit">
+					<h2>마이페이지</h2>
+				</div>
+				<div class="lnb_list">
+					<ul id="mypageLnbList"></ul>
+				</div>
+			</div>
+			<div class="cont">
+				<div class="sec_head">
+					<h3 class="subH1">반품상세</h3>
+					<span class="order_number">주문번호&nbsp;:&nbsp;<em th:text="${oneData.ordNo}"></em></span>
+				</div>
+				<div class="sec_body">
+					<div class="part_goods">
+						<div class="goods_head">
+							<p th:unless="${oneData.giftPackYn == 'Y'}">주문일 <span th:text="${oneData.ordDt}"></span></p>
+							<p th:if="${oneData.giftPackYn == 'Y'}">선물일 <span th:text="${oneData.ordDt}"></span></p>
+							<a href="javascript:void(0)" th:attr="ordNo=${oneData.ordNo}" onclick="fnGoToOrderDetail(this);">상세보기</a>
+						</div>
+						<div class="goods_cont">
+							<!-- 주문상품 -->
+							<th:block th:if="${returnDetailList.returnDetailList}" th:each="returnDtl, status : ${returnDetailList.returnDetailList}" th:with="imageUrl=${@environment.getProperty('upload.goods.view')}">
+								<div class="goods_info">
+									<div class="order_desc">
+										<div class="goods_box">
+											<div class="gd_item">
+												<a href="javascript:void(0)" th:attr="goodsCd=${returnDtl.goodsCd}" onclick="fnGoToGoodsDetail(this)">
+													<span class="thumb">
+														<img th:src="${imageUrl + '/' + returnDtl.sysImgNm}" width="100%" alt="">
+													</span>
+													<p>
+														<span class="brand" th:text="${returnDtl.brandNm}"></span>
+														<span class="tag primary" th:if="${returnDtl.shotDelvYn == 'Y'}">총알배송</span>
+														<span class="tag" th:if="${returnDtl.shotDelvYn == 'N' and returnDtl.selfGoodsYn == 'Y'}">STYLE24 일반배송</span>
+														<span class="tag" th:if="${returnDtl.selfGoodsYn == 'N'}">업체직배송</span>
+													</p>
+													<p>
+														<span class="name" th:text="${returnDtl.goodsNm}"></span>
+													</p>
+												</a>
+											</div>
+											<div class="gd_opt">
+												<div class="option_wrap">
+													<span class="title sr-only">주문 옵션</span>
+													<span class="option" th:if="${returnDtl.goodsType == 'G056_S'}" th:each="option, status : ${returnDtl.colorNmArr}" th:text="|${returnDtl.itemNmArr[status.index]} / ${option} / ${returnDtl.optCd2Arr[status.index]}|"></span>
+													<span class="option" th:unless="${returnDtl.goodsType == 'G056_S'}" th:text="|${returnDtl.colorNm} / ${returnDtl.optCd2}|"></span>
+												</div>
+											</div>
+											<div class="gd_calc">
+												<p>
+													<span class="count"><em th:text="${returnDtl.chgQty}"></em>개</span>
+												</p>
+												<p>
+													<span class="price_org" th:if="${returnDtl.priceOrg > returnDtl.priceSale}"><em th:text="${#numbers.formatInteger(returnDtl.priceOrg, 1, 'COMMA')}"></em>원</span>
+													<span class="price_sale"><em th:text="${#numbers.formatInteger(returnDtl.priceSale, 1, 'COMMA')}"></em>원</span>
+												</p>
+											</div>
+										</div>
+										<div class="status_box">
+											<p>
+												<th:block th:text="${returnDtl.chgStatNm}"></th:block>
+												<span class="date" th:text="${returnDtl.chgDate}"></span>
+												<span class="time" th:text="${returnDtl.chgTime}"></span>
+											</p>
+										</div>
+										<div class="button_box">
+											<p th:if="${returnDtl.chgStat == 'G685_50' or returnDtl.chgStat == 'G685_51'}"><button type="button" class="btn btn_default btn_sm" th:attr="ordChgSq=${returnDtl.ordChgSq}" onclick="fnCreCancel(this);"><span>신청취소</span></button></p>
+											<p th:if="${returnDtl.chgStat == 'G685_32' or returnDtl.chgStat == 'G685_51'}"><button type="button" class="btn btn_default btn_sm" th:attr="ordChgSq=${returnDtl.ordChgSq}" onclick="fnCrePayAddCost(this);"><span>결제하기</span></button></p>
+											<p><button type="button" class="btn btn_default btn_sm" onclick="cfnGoToPage(_PAGE_ONETOONE_QNA_REG);"><span>1:1 문의</span></button></p>
+										</div>
+									</div>
+									<!-- 반품결제대기 -->
+									<div class="order_text" th:if="${returnDtl.chgStat == 'G685_51' or (returnDtl.chgGb == 'G680_30' and returnDtl.chgStat == 'G685_32')}"><p th:text="|${returnDtl.addPayCost}|원 결제 후 반품 가능합니다."></p></div>
+									<!-- 교환접수 -->
+									<div class="order_text" th:if="${returnDtl.chgStat == 'G685_50'}"><p>반품 신청이 접수 되었습니다. 신속하게 처리하여 드리겠습니다.</p></div>
+									<!-- 회수요청 -->
+									<div class="order_text" th:if="${returnDtl.chgStat == 'G685_30'}"><p>고객님이 요청하신 회수지로 상품을 회수 중에 있습니다.</p></div>
+									<!-- 반품상품검수중 -->
+									<div class="order_text" th:if="${returnDtl.chgStat == 'G685_31' and returnDtl.chgGb == 'G680_30'}"><p>고객님이 반품하신 상품을 검수 중에 있습니다.</p></div>
+									<!-- 반품진행중 -->
+									<div class="order_text" th:if="${returnDtl.chgStat == 'G685_33'}"><p>환불을 진행하고 있습니다(영업일 최대 3일 내 환불 예정)</p></div>
+									<!-- 반품완료 -->
+									<div class="order_text" th:if="${returnDtl.chgStat == 'G685_60'}"><p>반품이 완료되었습니다.</p></div>
+									<!-- 반품철회 -->
+									<div class="order_text" th:if="${returnDtl.chgStat == 'G685_69'}"><p>요청하신 반품을 취소하였습니다.</p></div>
+								</div>
+							</th:block>
+							<!-- //주문상품 -->
+						</div>
+					</div>
+					<h4 class="subH3">상세 정보</h4>
+					<div class="tbl type1">
+						<table>
+							<colgroup>
+								<col width="210">
+								<col width="*">
+							</colgroup>
+							<tbody>
+								<tr>
+									<th>반품접수 일자</th>
+									<td th:text="${oneData.chgDt}"></td>
+								</tr>
+								<tr>
+									<th>반품완료 일자</th>
+									<td th:text="${oneData.completeDt}"></td>
+								</tr>
+							</tbody>
+						</table>
+					</div>
+					<th:block th:if="${oneData.wdGb == 'W'}">
+						<h4 class="subH3">상품 회수지</h4>
+						<div class="tbl type1">
+							<table>
+								<colgroup>
+									<col width="210">
+									<col width="*">
+								</colgroup>
+								<tbody>
+									<tr>
+										<th>회수 진행 여부</th>
+										<td>회수요청</td>
+									</tr>
+									<tr>
+										<th>회수지 정보</th>
+										<td>
+											<div class="block_line">
+												<ul>
+													<li>
+														<span id="chgerNm" th:text="${oneData.chgerNm}"></span>
+													</li>
+													<li>
+														<span id="chgerPhnno" th:text="${oneData.chgerPhnno}"></span>
+													</li>
+													<li>
+														<span id="chgerAddr" th:text="|${oneData.chgerBaseAddr} ${oneData.chgerDtlAddr}|"></span>
+														<button type="button" class="btn btn_default btn_sm" th:if="${oneData.chgStat == 'G685_50' or oneData.chgStat == 'G685_51'}" onclick="fnChangeDeliveryAddr();"><span>회수지 변경</span></button>
+													</li>
+													<li>
+														배송요청 사항&nbsp;:&nbsp;<span id="chgerRtnMemo" th:text="${oneData.chgerRtnMemo}"></span>
+														<button type="button" class="btn_underline" th:if="${oneData.chgStat == 'G685_50' or oneData.chgStat == 'G685_51'}" onclick="fnChangeDeliveryMemo(this)"><span>변경하기</span></button>
+													</li>
+												</ul>
+											</div>
+										</td>
+									</tr>
+									<tr th:if="${not #strings.isEmpty(oneData.wdInvoiceNo) and not #strings.isEmpty(oneData.shipCompNm)}">
+										<th>회수 정보</th>
+										<td>
+											<th:block th:text="|${oneData.shipCompNm} / ${oneData.wdInvoiceNo}|"></th:block>
+											<button type="button" class="btn btn_default btn_sm" onclick="fnGoToWithdrawDelivery()"><span>회수조회</span></button>
+										</td>
+									</tr>
+								</tbody>
+							</table>
+						</div>
+					</th:block>
+					<h4 class="subH3">환불정보</h4>
+					<div class="tbl type6">
+						<table>
+							<colgroup>
+								<col width="50%">
+								<col width="50%">
+							</colgroup>
+							<tbody>
+								<tr>
+									<td>
+										<dl>
+											<div>
+												<dt>환불 예정 금액</dt>
+												<dd>
+													<div class="price">
+														<span class="return_total_price"><em th:text="${#numbers.formatInteger(oneData.refundAmt + oneData.rfPntAmt + oneData.rfGfcdUseAmt, 1, 'COMMA')}"></em>원</span>
+													</div>
+												</dd>
+											</div>
+											<div class="include_item"> <!-- 할인항목 표기 class명 include_item -->
+												<dt>상품 취소 금액</dt>
+												<dd><em th:text="${#numbers.formatInteger(oneData.rfCnclAmt, 1, 'COMMA')}"></em>원</dd>
+											</div>
+											<div class="include_item">
+												<dt>배송비</dt>
+												<dd><em th:text="${#numbers.formatInteger(oneData.rfDeliveryFee, 1, 'COMMA')}"></em>원</dd>
+											</div>
+											<div class="include_item">
+												<dt>할인 금액 차감</dt>
+												<dd><em th:text="${#numbers.formatInteger((oneData.rfCpn1Amt + oneData.rfTmtb1Amt + oneData.rfTmtb2Amt + oneData.rfGoodsCpnAmt + oneData.rfCartCpnAmt + oneData.rfPrePntAmt) * -1, 1, 'COMMA')}"></em>원</dd>
+											</div>
+										</dl>
+									</td>
+									<td>
+										<dl>
+											<div>
+												<dt>결제 금액 환불</dt>
+												<dd>
+													<em th:text="${#numbers.formatInteger(oneData.refundAmt, 1, 'COMMA')}"></em>원
+												</dd>
+											</div>
+											<div>
+												<dt>포인트 환불</dt>
+												<dd>
+													<em th:text="${#numbers.formatInteger(oneData.rfPntAmt, 1, 'COMMA')}"></em>P
+												</dd>
+											</div>
+											<div>
+												<dt>상품권 환불</dt>
+												<dd>
+													<em  th:text="${#numbers.formatInteger(oneData.rfGfcdUseAmt, 1, 'COMMA')}"></em>원
+												</dd>
+											</div>
+											<div>
+												<dt>환불 수단</dt>
+												<dd th:if="${oneData.pgGb == 'KCP'}" th:text="${oneData.payMeansNm}"></dd>
+												<dd th:if="${oneData.pgGb == 'NAVER'}">네이버페이</dd>
+												<dd th:if="${oneData.pgGb == 'KAKAO'}">카카오페이</dd>
+												<dd th:if="${oneData.pgGb == 'PAYCO'}">PAYCO</dd>
+											</div>
+											<div th:if="${oneData.pgGb == 'KCP' and oneData.payStat == 'G685_60' and oneData.payMeans == 'G014_30'}">
+												<dt class="sr-only">영수증 확인</dt>
+												<dd><button type="button" class="btn btn_default btn_sm" onclick="fnReceipt('cancel')"><span>취소 전표 보기</span></button></dd>
+											</div>
+										</dl>
+									</td>
+								</tr>
+							</tbody>
+						</table>
+					</div>
+					<div class="txt_info">
+						<ul>
+							<li>
+								카드사로 결제 취소 요청이 전달된 후 환불까지는 평일 기준 3 ~7일이 소요될 수 있습니다.
+							</li>
+						</ul>
+					</div>
+					<div class="btn_footer_area">
+						<button type="button" class="btn btn_dark btn_md" onclick="cfnGoToPage(_PAGE_MYPAGE_CRE_LIST);"><span>확인</span></button>
+					</div>
+				</div>
+			</div>
+			<!-- // CONT-BODY -->
+		</div>
+	</div>
+<script src="/ux/plugins/gaga/gaga.paging.js"></script>
+<script th:inline="javascript">
+	/*<![CDATA[*/
+	let oneData = [[${oneData}]];
+	var isLogin = [[${isLogin}]];
+
+	$(document).ready(function() {
+		// 마이페이지 LNB 설정
+		fnSetMypageLnbList(2);
+		
+		// 마이페이지 location 설정
+		fnSetMypageLocation('취소/반품/환불내역', '_PAGE_MYPAGE_CRE_LIST', '반품 상세');
+	});
+
+	var fnGoToWithdrawDelivery = function(param) {
+		// TODO
+		// 회수조회 페이지 이동
+	}
+
+	// 회수지 정보 설정
+	var delvAddrSet = function(delvObj) {
+		let ordChgSq = oneData.ordChgSq;
+		let chgerNm = delvObj.recipNm;
+		let chgerPhnno = delvObj.recipPhnno;
+		let chgerZipcode = delvObj.recipZipcode;
+		let chgerBaseAddr = delvObj.recipBaseAddr;
+		let chgerDtlAddr = delvObj.recipDtlAddr;
+		let chgerRtnMemo = delvObj.delvMemo;
+		let chgerAddr = chgerBaseAddr + ' ' + chgerDtlAddr;
+
+		let data = {};
+		data.ordChgSq = ordChgSq;
+		data.chgerNm = chgerNm;
+		data.chgerPhnno = chgerPhnno;
+		data.chgerZipcode = chgerZipcode;
+		data.chgerBaseAddr = chgerBaseAddr;
+		data.chgerDtlAddr = chgerDtlAddr;
+		data.chgerRtnMemo = chgerRtnMemo;
+
+		let jsonData = JSON.stringify(data);
+
+		gagajf.ajaxJsonSubmit('/mypage/change/chger/addr', jsonData, function(result) {
+			if (result.status == '200') {
+				$('#chgerNm').text(chgerNm);
+				$('#chgerPhnno').text(chgerPhnno);
+				$('#chgerAddr').text(chgerAddr);
+				$('#chgerRtnMemo').text(chgerRtnMemo);
+			}
+		});
+	}
+	
+	// 배송메모 설정
+	var delvMemoSet = function(delvMemoObj) {
+		let ordChgSq = oneData.ordChgSq;
+		let delvMemo = delvMemoObj.delvMemo;
+
+		let data = {};
+		data.ordChgSq = ordChgSq;
+		data.chgerRtnMemo = delvMemo;
+		
+		let jsonData = JSON.stringify(data);
+		
+		gagajf.ajaxJsonSubmit('/mypage/change/chger/rtn/memo', jsonData, function(result) {
+			if (result.status == '200') {
+				$("#chgerRtnMemo").text(delvMemo);
+			}
+		});
+		
+	}
+/*]]>*/
+</script>
+
+</th:block>
+
+</body>
+</html>

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

@@ -265,7 +265,7 @@
 													</li>
 													<li>
 														배송요청 사항&nbsp;:&nbsp;<span id="delvMemo" th:text="${deliveryAddrInfo.delvMemo}"></span>
-														<button type="button" class="btn_underline" onclick="fnChangeDeliveryMemo()"><span>변경하기</span></button>
+														<button type="button" class="btn_underline" onclick="fnChangeDeliveryMemo(this)"><span>변경하기</span></button>
 													</li>
 												</ul>
 											</div>

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

@@ -354,7 +354,7 @@
 													</li>
 													<li>
 														배송요청 사항&nbsp;:&nbsp;<span id="delvMemo" th:text="${deliveryAddrInfo.delvMemo}"></span>
-														<button type="button" class="btn_underline" th:if="${allCanYn == 'Y'}" onclick="fnChangeDeliveryMemo()"><span>변경하기</span></button>
+														<button type="button" class="btn_underline" th:if="${allCanYn == 'Y'}" onclick="fnChangeDeliveryMemo(this)"><span>변경하기</span></button>
 													</li>
 												</ul>
 											</div>

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

@@ -412,7 +412,14 @@
 		let ordDtlNo = obj2;
 		let goodsCd = obj3;
 		let reviewStat = 'u';
-		cfnGoToPage(_PAGE_MYPAGE_CREATE_REVIEW + ordNo +'/'+ordDtlNo+'/'+goodsCd+'/'+reviewStat);
+		
+		$('#createReview input[name=ordNo]').val(ordNo);
+		$('#createReview input[name=ordDtlNo]').val(ordDtlNo);
+		$('#createReview input[name=goodsCd]').val(goodsCd);
+		$('#createReview input[name=reviewStat]').val(reviewStat);
+		
+		document.createReview.submit();
+		// cfnGoToPage(_PAGE_MYPAGE_CREATE_REVIEW + ordNo +'/'+ordDtlNo+'/'+goodsCd+'/'+reviewStat);
 	}
 	</script>
 	</th:block>

+ 202 - 0
src/main/webapp/WEB-INF/views/web/mypage/RestockFormWeb.html

@@ -0,0 +1,202 @@
+<!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  : RestockForm.html
+ * @desc    : 마이페이지 > 재입고알림내역 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2021 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.04.13   csh9191     최초 작성
+ *******************************************************************************
+ -->
+<body>
+
+<th:block layout:fragment="content">
+	<div class="content restock">
+		<div class="cont_body">
+			<!-- CONT-BODY -->
+			<div class="lnb">
+				<div class="lnb_tit">
+					<h2>마이페이지</h2>
+				</div>
+				<div class="lnb_list">
+					<ul id="mypageLnbList"></ul>
+				</div>
+			</div>
+			<div class="cont">
+				<div class="sec_head">
+					<h3 class="subH1">재입고 알림내역</h3>
+				</div>
+				<div class="sec_body">
+					<div class="com_info_txt">
+						<p class="tit">재입고 알림 안내</p>
+						<ul>
+							<li>재입고 알림을 신청한 내역을 확인 하실 수 있습니다.</li>
+							<li>알림을 요청한 날로 부터 15일 안에 입고 시 알림을 SMS, 알림톡으로 보내드립니다.</li>
+							<li>알림 요청이 완료 또는 경과된 알림은 완료 시점부터 15일후 삭제됩니다.</li>
+						</ul>
+					</div>
+					<div class="area_list">
+						<!-- 주문번호 기준 상품 내역 -->
+						<div class="part_goods" id="restockGoods" style="display: none;">
+<!-- 							<div class="goods_cont"> -->
+<!-- 								<div class="goods_info"> -->
+<!-- 									<div class="order_desc"> -->
+<!-- 										<div class="goods_box"> -->
+<!-- 											<div class="gd_item"> -->
+<!-- 												<a href=""> -->
+<!-- 													<span class="thumb"> -->
+<!-- 														<img src="/images/pc/thumb/tmp_pdClickother1.jpg" width="100%" alt=""/> -->
+<!-- 													</span> -->
+<!-- 													<p> -->
+<!-- 														<span class="brand">Mollimelli 몰리멜리</span> -->
+<!-- 													</p> -->
+<!-- 													<p> -->
+<!-- 														<span class="name">남성 세미오버핏 이중지 심플 기본 와이넥 컬러가디건</span> -->
+<!-- 													</p> -->
+<!-- 												</a> -->
+<!-- 											</div> -->
+<!-- 											<div class="gd_opt"> -->
+<!-- 												<div class="option_wrap"> -->
+<!-- 													<span class="title sr-only">주문 옵션</span> -->
+<!-- 													<span class="option">BLACK&nbsp;/&nbsp;XXL</span> -->
+<!-- 												</div> -->
+<!-- 											</div> -->
+<!-- 										</div> -->
+<!-- 										<div class="status_box"> -->
+<!-- 											<p> -->
+<!-- 												<span class="restock_ready"><em>2021.03.07</em> 알림</span> -->
+<!-- 												<span class="restock_remain"><em>15</em>일 남음</span> -->
+<!-- 												<span class="restock_past">알림요청일 경과</span> -->
+<!-- 											</p> -->
+<!-- 										</div> -->
+<!-- 										<div class="button_box"> -->
+<!-- 											<p><button type="button" class="btn btn_primary btn_sm"><span>바로구매</span></button></p> -->
+<!-- 											<p><button type="button" id="btn_restock_push" class="btn btn_default btn_sm"><span>알림 연장</span></button></p> -->
+<!-- 										</div> -->
+<!-- 									</div> -->
+<!-- 								</div> -->
+<!-- 							</div> -->
+						</div>
+						<!-- //주문번호 기준 상품 내역 -->
+						<!-- 데이터 없을 시 -->
+						<div class="nodata" id="restockNodata" style="display: none;">
+							<div class="txt_box">
+								<p>재입고 알림 내역이 없습니다.</p>
+							</div>
+						</div>
+						<!-- 데이터 없을 시 -->
+					</div>
+				</div>
+			</div>
+			<!-- // CONT-BODY -->
+		</div>
+	</div>
+	
+<script th:inline="javascript">
+	$(document).ready(function() {
+		// 마이페이지 LNB 설정
+		fnSetMypageLnbList(3);
+		
+		// 마이페이지 location 설정
+		fnSetMypageLocation('재입고 알림 내역', '_PAGE_MYPAGE_RESTOCK');
+		
+		fnGetList();
+	});
+	
+	var fnGetList = function() {
+		$.getJSON('/mypage/restock/list', function (result, status) {
+			if (status == 'success') {
+				if (result.length > 0) {
+					$('#restockGoods').html('');
+					
+					$.each(result, function (idx, item) {
+						let tag = '<div class="goods_cont">\n';
+						tag += '	<div class="goods_info">\n';
+						tag += '		<div class="order_desc">\n';
+						tag += '			<div class="goods_box">\n';
+						tag += '				<div class="gd_item">\n';
+						tag += '					<a href="">\n';
+						tag += '						<span class="thumb">\n';
+						tag += '							<img src="' + _uploadGoodsUrl + '/' + item.sysImgNm + '" width="100%" alt="">\n';
+						tag += '						</span>\n';
+						tag += '						<p><span class="brand">' + item.brandEnm + '</span></p>\n';
+						tag += '						<p><span class="name">' + item.goodsNm + '</span></p>\n';
+						tag += '					</a>\n';
+						tag += '				</div>\n';
+						tag += '				<div class="gd_opt">\n';
+						tag += '					<div class="option_wrap">\n';
+						tag += '						<span class="title sr-only">주문 옵션</span>\n';
+						tag += '						<span class="option">' + item.optCd1 + '&nbsp;/&nbsp;' + item.optCd2 + '</span>\n';
+						tag += '					</div>\n';
+						tag += '				</div>\n';
+						tag += '			</div>\n';
+						tag += '			<div class="status_box">\n';
+						
+						if (!gagajf.isNull(item.informDt)) {
+							tag += '				<p><span class="restock_ready"><em>' + item.informDt + '</em> 알림</span></p>\n';
+						} else {
+							if (item.pastDays > 15) {
+								tag += '				<p><span class="restock_past">알림 요청일 경과</span></p>\n';
+							} else {
+								tag += '				<p><span class="restock_remain"><em>' + (15 - Number(item.pastDays)) + '</em>일 남음</span></p>\n';
+							}
+						}
+						
+						tag += '			</div>\n';
+						tag += '			<div class="button_box">\n';
+						
+						if (!gagajf.isNull(item.informDt)) {
+							tag += '				<p><button type="button" class="btn btn_primary btn_sm" onclick="cfnGoToGoodsDetail(\'' + item.goodsCd + '\');"><span>바로구매</span></button></p>\n';
+						} else {
+							tag += '				<p><button type="button" class="btn btn_default btn_sm" onclick="fnUpdateRestockContinue(' + item.rinbdInfoSq + ');"><span>알림 연장</span></button></p>\n';
+						}
+						
+						tag += '			</div>\n';
+						tag += '		</div>\n';
+						tag += '	</div>\n';
+						tag += '</div>\n';
+						
+						$('#restockGoods').append(tag);
+						$('#restockGoods').show();
+						$('#restockNodata').hide();
+					});
+				} else {
+					// 데이터 없을 시
+					$('#restockGoods').hide();
+					$('#restockNodata').show();
+				}
+			}
+		});
+	}
+	
+	// 알림 연장
+	let fnUpdateRestockContinue = function(rinbdInfoSq) {
+		mcxDialog.confirm("알림을 연장하시겠습니까?", {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function() {
+				let params = new Object();
+				params.rinbdInfoSq = rinbdInfoSq;
+				
+				var jsonData = JSON.stringify(params);
+				gagajf.ajaxJsonSubmit('/mypage/restock/continue/update'
+						, jsonData
+						, function() {
+							fnGetList();
+						});
+			}
+		});
+	}
+</script>
+</th:block>
+
+</body>
+</html>

+ 22 - 0
src/main/webapp/WEB-INF/views/web/order/OrderEmptyWeb.html

@@ -0,0 +1,22 @@
+<!DOCTYPE html>
+<html lang="ko" xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : OrderEmptyWeb.html
+ * @desc    : 주문/결제 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.02.01   jsh77b     최초 작성
+ *******************************************************************************
+ -->
+<body>
+<script th:inline="javascript">
+var message	= [[${message}]];
+alert(message);
+</script>
+</body>
+</html>

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

@@ -1015,6 +1015,8 @@ var paymentInfoSet = function() {
 							,"goodsCd"			: $(this).parent().find(".goodsCd").text()
 							,"itemCdArr"		: $(this).parent().find(".itemCd").text().split(",")
 							,"optCdArr"			: $(this).parent().find(".optCd").text().split(",")
+							,"optCd1Arr"		: $(this).parent().find(".optCd1").text().split(",")
+							,"optCd2Arr"		: $(this).parent().find(".optCd2").text().split(",")
 							,"itemQtyArr"		: $(this).parent().find(".itemQtyr").text().split(",")
 							,"goodsType"		: $(this).parent().find(".goodsType").text()
 							,"entryNo"			: entryNo
@@ -1093,6 +1095,7 @@ var paymentInfoSet = function() {
 							} else if (pgGb == "KCP" || pgGb == "PAYCO") {
 								jsf__pay(document.order_info);
 							}
+							return;
 						}
 					});
 				});

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

@@ -1,7 +1,7 @@
 <!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">
+	layout:decorator="web/common/layout/PlanningLayoutWeb">
 <!--
  *******************************************************************************
  * @source  : PlanningDetailFormWeb.html
@@ -126,12 +126,8 @@
 								<div class="cmt_thumb">
 									<div class="form_field">
 										<div class="imgUpload">
-											<label for="fileAdd" class="fileAdd">업로드</label>
-											<input type="file" id="fileAdd" name="files" />
-											<th:block th:each="num: ${#numbers.sequence(1,10)}">
-											<input type="hidden" th:id="${'orgFileNm' + num}" name="orgFileNm" >
-											<input type="hidden" th:id="${'sysFileNm' + num}" name="sysFileNm">
-											</th:block>
+											<label for="fileAdd" class="fileAdd" id="fileAdd_reply">업로드</label>
+											<input type="file" id="fileAdd" name="files"/>
 										</div>
 									</div>
 								</div>
@@ -288,6 +284,7 @@ let goods4 = [[${goods4Info}]];
 let template =[[${templateOrd}]];
 let replyList = [[${replyList}]];
 let replyCount = [[${replyCount}]];
+let replyAttachList = [[${replyAttachList}]];
 let _mall = [[${@environment.getProperty('domain.front')}]];
 let goodsView =[[${@environment.getProperty('upload.goods.view')}]]
 let imgUrl=[[${@environment.getProperty('upload.image.view')}]];
@@ -773,7 +770,14 @@ var fnSearchCallback = function (result) {
 				 html += '		</div>';
 				 html += '		<div class="cmt_cont">';
 				 html += '			<div class="img_wrap clear">';
-				// html += '				<span class="pics"><img class="picsThumbs" src="/images/pc/thumb/ev_list_img01.jpg" alt="썸네일"></span>';
+				 if (result.replyAttachList.length>0) {
+					for (var i = 0; i < result.replyAttachList.length; i++) {
+						if(result.replyAttachList[i].planEntrySq == item.planEntrySq){
+							html += '				<span class="pics"><img class="picsThumbs" src="'+ imgUrl +'/'+result.replyAttachList[i].sysFileNm +'"></span>';
+						}
+					}	
+				 }
+				
 				 html += '			</div>';
 				 html += '			<p>'+item.entryVal1+'</p>';
 				 if (item.entryCustNo == result.custNo) {
@@ -819,12 +823,11 @@ var fnDelReply = function(obj) {
 }
 $('#fileAdd').on('change', function() { fnChooseFile(this); });
 
-var fnChooseFile = function(obj,fileNo) {
-	console.log($(".pics").length);
+var fnChooseFile = function(obj) {
+	var picLength = $(".pics").length;
+	
 	// multiple 속성이 있으면 files에는 다수의 객체가 할당됨
 	var file = obj.files[0];
-	
-	
 
 	if (!gagajf.isNull(file.name)) {
 		var extension = "\.(jpg|jpeg|png)$";
@@ -833,13 +836,11 @@ var fnChooseFile = function(obj,fileNo) {
 				sureBtnText: "확인",
 				sureBtnClick: function() {
 					$(obj).parent('.imgUpload').find('.removes').trigger('click');
-					console.log('file.size1', file.size);
 				}
 			});
 			return false;
 		}
 	}
-	console.log('file.size2', file.size);
 	// 이거 왜 안먹히지 
 	if (!gagajf.isNull(file.size) && Number(file.size) > (10 * 1000000)) {
 		mcxDialog.alertC('이미지는 최대 10MB 이하 파일만 가능합니다.', {
@@ -856,15 +857,16 @@ var fnChooseFile = function(obj,fileNo) {
 			, file
 			, function(result) {
 				// 업로드한 파일명 설정
-				$('#orgFileNm' + fileNo).val(result.oldFileName);
-				$('#sysFileNm' + fileNo).val(result.newFileName);
+				$(".pics").children().eq(0).append("<input type='hidden' name='orgFileNm' id='orgFileNm"+(picLength+1)+"' value='"+result.oldFileName+"'>");
+				$(".pics").children().eq(0).append("<input type='hidden' name='sysFileNm' id='sysFileNm"+(picLength+1)+"' value='"+result.newFileName+"'>");
 			}
 	); 
 }
 
-
 // 댓글 등록 버튼 클릭 시 
 var fnReplySave = function() {
+	var fileLength = $("input[name='sysFileNm']").length;
+
 	var content = $('#replyText').val();
 	if (content.length < 2){
 		mcxDialog.alert("최소 2자 이상 입력해주세요.");
@@ -878,8 +880,17 @@ var fnReplySave = function() {
 		return;
 	}
 	
+	//파일관련 데이터 담기
+	var multiReplyOrgFile = [];
+	var multiReplySysFile = [];
+	for (var i = 0; i < fileLength; i++) {
+		multiReplyOrgFile.push($(".pics").eq(i).find('input[name="orgFileNm"]').val());
+		multiReplySysFile.push($(".pics").eq(i).find('input[name="sysFileNm"]').val());
+	}
 	data = {entryVal1 : content,
-			planSq : plan.planSq};
+			planSq : plan.planSq,
+			multiReplyOrgFile : multiReplyOrgFile,
+			multiReplySysFile : multiReplySysFile};
 	var jsonData = JSON.stringify(data);
 
 	mcxDialog.confirm("댓글을 등록 하시겠습니까?", {
@@ -896,6 +907,8 @@ var fnReplySave = function() {
 }
 
 
+
+
 $(document).ready( function() {
 	ajaxReplyList();
 	//공유 버튼 토글 
@@ -1017,10 +1030,6 @@ $(document).ready( function() {
 		}
 		
 		var maxFileLength = 10; /* 최대 파일 갯수를 입력해 주세요 */
-		var imgFiles=$('.imgUpload .pics');
-		if (imgFiles.length == 10) {
-			$('#fileAdd').hide();
-		}
 		if (imgFiles.length >= maxFileLength) {
 			alert('이미지는 최대' + maxFileLength +'장 까지 첨부 가능합니다.');
 			$('#fileAdd').attr("disabled",true);
@@ -1041,9 +1050,8 @@ $(document).ready( function() {
 	});
 	
 	//팝업 - 댓글 이미지 슬라이드
-	$(document).on('click','.cmt_cont .img_wrap .pics',function(e){
+	 $(document).on('click','.cmt_cont .img_wrap .pics',function(e){
 		$("#thumbImgPop .swiper-wrapper").empty();
-
 		var popSlideIndex = $(this).index();
 		contactPopSwiper.slideTo(popSlideIndex);
 		contactPopSwiper.update();
@@ -1060,7 +1068,7 @@ $(document).ready( function() {
 		$('#thumbImgPop').modal("show");
 		
 		return false;
-	});        
+	});         
 	
 	 /* SLIDE - 댓글 이미지 팝업 */
 	var contactPopSwiper = new Swiper('.thumb_img_pop .swiper-container', {

+ 2 - 4
src/main/webapp/biz/goodsSession.js

@@ -3,8 +3,6 @@ var categoryGoodsList = [];
 var cnt = 1;
 var email = '';
 var fnCreateGoodsList = function(result, ithrCd, contentLoc, goodsUrl, lastPage, endRow) {
-	console.log('fnCreateGoodsList');
-
 	var tag = '';
 	var rank = 0;
 	if(lastPage!='1'){
@@ -48,7 +46,7 @@ var fnCreateGoodsList = function(result, ithrCd, contentLoc, goodsUrl, lastPage,
 		tag += '	</div>';
 		tag += '</div>';
 	});
-	console.log('fnCreateGoodsList11');
+
 	if (cnt == 1) {
 		// <!-- Criteo 카테고리/리스팅 태그 -->
 		window.criteo_q = window.criteo_q || [];
@@ -62,7 +60,7 @@ var fnCreateGoodsList = function(result, ithrCd, contentLoc, goodsUrl, lastPage,
 		// <!-- END 카테고리/리스팅 태그 -->
 		cnt++;
 	}
-	console.log('fnCreateGoodsList1122233');
+
 	return tag;
 }
 

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

@@ -242,11 +242,11 @@ var fnChangeDeliveryAddr = function(param) {
 }
 
 // 배송메모 설정 팝업
-var fnChangeDeliveryMemo = function() {
+var fnChangeDeliveryMemo = function(param) {
 	var data = {};
-	data.delvMemo = $('input[name=delvMemo]').val();
+	data.delvMemo = $(param).parent().find('span').eq(0).text();
 	data.ordNo = oneData.ordNo;
-	
+
 	$.ajax({
 		type		: "POST",
 		url 		: "/common/delvMemoChangePop",
@@ -352,9 +352,14 @@ var cfnGetTextLength = function(obj, maxLen, dpLoc) {
 // 리뷰작성 페이지 이동
 var fnReviewCreate = function(obj1,obj2,obj3) {
 	let ordNo = obj1;
-	let ordDtlNo = obj2;
-	let goodsCd = obj3;
-	let reviewStat = 'c';
-	
-	cfnGoToPage(_PAGE_MYPAGE_CREATE_REVIEW + ordNo +'/'+ordDtlNo+'/'+goodsCd+'/'+reviewStat);
+		let ordDtlNo = obj2;
+		let goodsCd = obj3;
+		let reviewStat = 'c';
+		
+		$('#createReview input[name=ordNo]').val(ordNo);
+		$('#createReview input[name=ordDtlNo]').val(ordDtlNo);
+		$('#createReview input[name=goodsCd]').val(goodsCd);
+		$('#createReview input[name=reviewStat]').val(reviewStat);
+		
+		document.createReview.submit();
 }

BIN
src/main/webapp/images/mo/ico_admin2.png


BIN
src/main/webapp/images/mo/ico_btn_more_w.png


BIN
src/main/webapp/images/mo/ico_btn_search_w.png


BIN
src/main/webapp/images/mo/ico_btn_store_w.png


BIN
src/main/webapp/images/mo/ico_cate_arrow.png


BIN
src/main/webapp/images/mo/ico_like03.png


BIN
src/main/webapp/images/mo/ico_picker.png


BIN
src/main/webapp/images/mo/ico_restock_past.png


BIN
src/main/webapp/images/mo/ico_restock_ready.png


BIN
src/main/webapp/images/mo/ico_restock_remain.png


BIN
src/main/webapp/images/mo/ico_sch_del_w.png


BIN
src/main/webapp/images/mo/ico_tabbar.png


BIN
src/main/webapp/images/mo/info_size_bag.png


BIN
src/main/webapp/images/mo/info_size_pants.png


BIN
src/main/webapp/images/mo/info_size_shoe.png


BIN
src/main/webapp/images/mo/info_size_top.png


BIN
src/main/webapp/images/mo/info_size_underwear.png


BIN
src/main/webapp/images/mo/logo_STYLE24.png


BIN
src/main/webapp/images/mo/logo_STYLE24_b.png


BIN
src/main/webapp/images/mo/pd_arrow.png


BIN
src/main/webapp/images/mo/thumb/brand01.png


BIN
src/main/webapp/images/mo/thumb/brand02.png


BIN
src/main/webapp/images/mo/thumb/brand03.png


BIN
src/main/webapp/images/mo/thumb/brand04.png


BIN
src/main/webapp/images/mo/thumb/brand05.png


BIN
src/main/webapp/images/mo/thumb/brand06.png


BIN
src/main/webapp/images/mo/thumb/brand07.png


BIN
src/main/webapp/images/mo/thumb/brand08.png


BIN
src/main/webapp/images/mo/thumb/brand09.png


BIN
src/main/webapp/images/mo/thumb/brand10.png


BIN
src/main/webapp/images/mo/thumb/brand11.png


BIN
src/main/webapp/images/mo/thumb/brand12.png


BIN
src/main/webapp/images/mo/thumb/brand13.png


Деякі файли не було показано, через те що забагато файлів було змінено