Jelajahi Sumber

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

jsshin 5 tahun lalu
induk
melakukan
22f71d3d29
78 mengubah file dengan 2103 tambahan dan 221 penghapusan
  1. 60 0
      src/main/java/com/style24/front/biz/dao/TsfPlanningDao.java
  2. 34 0
      src/main/java/com/style24/front/biz/dao/TsfReinboundDao.java
  3. 43 3
      src/main/java/com/style24/front/biz/service/TsfDisplayService.java
  4. 91 0
      src/main/java/com/style24/front/biz/service/TsfPlanningService.java
  5. 47 0
      src/main/java/com/style24/front/biz/service/TsfReinboundService.java
  6. 47 0
      src/main/java/com/style24/front/biz/web/TsfDisplayController.java
  7. 137 77
      src/main/java/com/style24/front/biz/web/TsfMypageController.java
  8. 43 9
      src/main/java/com/style24/front/biz/web/TsfPlanningController.java
  9. 6 0
      src/main/java/com/style24/persistence/domain/Cate4Srch.java
  10. 8 0
      src/main/java/com/style24/persistence/domain/Contents.java
  11. 9 4
      src/main/java/com/style24/persistence/domain/Plan.java
  12. 13 9
      src/main/java/com/style24/persistence/domain/ReinboundInform.java
  13. 6 6
      src/main/java/com/style24/persistence/mybatis/shop/TsfCoupon.xml
  14. 16 4
      src/main/java/com/style24/persistence/mybatis/shop/TsfGoods.xml
  15. 99 2
      src/main/java/com/style24/persistence/mybatis/shop/TsfPlanning.xml
  16. 59 0
      src/main/java/com/style24/persistence/mybatis/shop/TsfReinbound.xml
  17. 6 0
      src/main/java/com/style24/persistence/mybatis/shop/TsfReview.xml
  18. 15 8
      src/main/webapp/WEB-INF/views/mob/common/fragments/GnbSubMob.html
  19. 48 0
      src/main/webapp/WEB-INF/views/mob/common/layout/MypageLayoutMob.html
  20. 6 3
      src/main/webapp/WEB-INF/views/mob/goods/GoodsDetailQnaFormMob.html
  21. 1 1
      src/main/webapp/WEB-INF/views/mob/goods/GoodsQnaFormMob.html
  22. 172 0
      src/main/webapp/WEB-INF/views/mob/mypage/RestockFormMob.html
  23. 54 27
      src/main/webapp/WEB-INF/views/web/common/fragments/BrandGnbWeb.html
  24. 6 0
      src/main/webapp/WEB-INF/views/web/common/layout/MypageLayoutWeb.html
  25. 48 0
      src/main/webapp/WEB-INF/views/web/common/layout/PlanningLayoutWeb.html
  26. 362 0
      src/main/webapp/WEB-INF/views/web/display/BestMainFormWeb.html
  27. 0 2
      src/main/webapp/WEB-INF/views/web/display/CategoryGoodsListFormWeb.html
  28. 356 0
      src/main/webapp/WEB-INF/views/web/display/LookbookDetailFormWeb.html
  29. 8 1
      src/main/webapp/WEB-INF/views/web/mypage/MypageReviewFormWeb.html
  30. 202 0
      src/main/webapp/WEB-INF/views/web/mypage/RestockFormWeb.html
  31. 61 38
      src/main/webapp/WEB-INF/views/web/planning/PlanningDetailFormWeb.html
  32. 2 4
      src/main/webapp/biz/goodsSession.js
  33. 10 5
      src/main/webapp/biz/mypage.js
  34. TEMPAT SAMPAH
      src/main/webapp/images/mo/ico_admin2.png
  35. TEMPAT SAMPAH
      src/main/webapp/images/mo/ico_btn_more_w.png
  36. TEMPAT SAMPAH
      src/main/webapp/images/mo/ico_btn_search_w.png
  37. TEMPAT SAMPAH
      src/main/webapp/images/mo/ico_btn_store_w.png
  38. TEMPAT SAMPAH
      src/main/webapp/images/mo/ico_cate_arrow.png
  39. TEMPAT SAMPAH
      src/main/webapp/images/mo/ico_like03.png
  40. TEMPAT SAMPAH
      src/main/webapp/images/mo/ico_picker.png
  41. TEMPAT SAMPAH
      src/main/webapp/images/mo/ico_restock_past.png
  42. TEMPAT SAMPAH
      src/main/webapp/images/mo/ico_restock_ready.png
  43. TEMPAT SAMPAH
      src/main/webapp/images/mo/ico_restock_remain.png
  44. TEMPAT SAMPAH
      src/main/webapp/images/mo/ico_sch_del_w.png
  45. TEMPAT SAMPAH
      src/main/webapp/images/mo/ico_tabbar.png
  46. TEMPAT SAMPAH
      src/main/webapp/images/mo/info_size_bag.png
  47. TEMPAT SAMPAH
      src/main/webapp/images/mo/info_size_pants.png
  48. TEMPAT SAMPAH
      src/main/webapp/images/mo/info_size_shoe.png
  49. TEMPAT SAMPAH
      src/main/webapp/images/mo/info_size_top.png
  50. TEMPAT SAMPAH
      src/main/webapp/images/mo/info_size_underwear.png
  51. TEMPAT SAMPAH
      src/main/webapp/images/mo/logo_STYLE24.png
  52. TEMPAT SAMPAH
      src/main/webapp/images/mo/logo_STYLE24_b.png
  53. TEMPAT SAMPAH
      src/main/webapp/images/mo/pd_arrow.png
  54. TEMPAT SAMPAH
      src/main/webapp/images/mo/thumb/brand01.png
  55. TEMPAT SAMPAH
      src/main/webapp/images/mo/thumb/brand02.png
  56. TEMPAT SAMPAH
      src/main/webapp/images/mo/thumb/brand03.png
  57. TEMPAT SAMPAH
      src/main/webapp/images/mo/thumb/brand04.png
  58. TEMPAT SAMPAH
      src/main/webapp/images/mo/thumb/brand05.png
  59. TEMPAT SAMPAH
      src/main/webapp/images/mo/thumb/brand06.png
  60. TEMPAT SAMPAH
      src/main/webapp/images/mo/thumb/brand07.png
  61. TEMPAT SAMPAH
      src/main/webapp/images/mo/thumb/brand08.png
  62. TEMPAT SAMPAH
      src/main/webapp/images/mo/thumb/brand09.png
  63. TEMPAT SAMPAH
      src/main/webapp/images/mo/thumb/brand10.png
  64. TEMPAT SAMPAH
      src/main/webapp/images/mo/thumb/brand11.png
  65. TEMPAT SAMPAH
      src/main/webapp/images/mo/thumb/brand12.png
  66. TEMPAT SAMPAH
      src/main/webapp/images/mo/thumb/brand13.png
  67. TEMPAT SAMPAH
      src/main/webapp/images/mo/thumb/brand14.png
  68. TEMPAT SAMPAH
      src/main/webapp/images/mo/thumb/brand15.png
  69. TEMPAT SAMPAH
      src/main/webapp/images/mo/thumb/brand16.png
  70. TEMPAT SAMPAH
      src/main/webapp/images/mo/thumb/ev_list_img05.jpg
  71. TEMPAT SAMPAH
      src/main/webapp/images/mo/thumb/ev_list_img06.jpg
  72. TEMPAT SAMPAH
      src/main/webapp/images/mo/thumb/ev_list_img07.jpg
  73. TEMPAT SAMPAH
      src/main/webapp/images/mo/thumb/ev_list_img08.jpg
  74. TEMPAT SAMPAH
      src/main/webapp/images/mo/thumb/thumb_notice1.jpg
  75. 1 1
      src/main/webapp/ux/mo/css/layout_m.css
  76. 2 2
      src/main/webapp/ux/mo/js/common_m.js
  77. 18 10
      src/main/webapp/ux/plugins/gaga/gaga.infinite.scrollLayer.js
  78. 7 5
      src/main/webapp/ux/style24_link.js

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

@@ -352,4 +352,64 @@ public interface TsfPlanningDao {
 	 */
 	Collection<Plan> getReplyList(Plan plan);
 	
+	/**
+	 * 기획전/이벤트 댓글 저장
+	 *
+	 * @param Plan
+	 * @return 
+	 * @author sowon
+	 * @date 2021. 4. 13
+	 */
+	void saveEntryReply(Plan plan);
+	
+	/**
+	 * 기획전/이벤트 댓글 카운트
+	 *
+	 * @param Plan
+	 * @return int
+	 * @author sowon
+	 * @date 2021. 4. 13
+	 */
+	int getEntryReplyCount(Plan plan);
+	
+	/**
+	 * 기획전/이벤트 댓글 삭제
+	 *
+	 * @param Plan
+	 * @return 
+	 * @author sowon
+	 * @date 2021. 4. 13
+	 */
+	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);
+
+}

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

+ 91 - 0
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;
 
 	/**
 	 * 기획전 카테고리 목록
@@ -522,4 +529,88 @@ public class TsfPlanningService {
 		return planningDao.getReplyList(plan);
 	}
 
+
+	/**
+	 * 기획전/이벤트 댓글,이미지 저장
+	 *
+	 * @param Plan
+	 * @return 
+	 * @author sowon
+	 * @date 2021. 4. 13
+	 */
+	public void saveEntryReply(Plan plan) {
+		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++;
+			}
+		}
+	}
+	
+	/**
+	 * 기획전/이벤트 댓글 카운트
+	 *
+	 * @param Plan
+	 * @return int
+	 * @author sowon
+	 * @date 2021. 4. 13
+	 */
+	public int getEntryReplyCount(Plan plan) {
+		return planningDao.getEntryReplyCount(plan);
+	}
+	
+	/**
+	 * 기획전/이벤트 댓글, 이미지 삭제
+	 *
+	 * @param Plan
+	 * @return 
+	 * @author sowon
+	 * @date 2021. 4. 13
+	 */
+	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);
+	}
+
+}

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

+ 137 - 77
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());
 
@@ -981,8 +985,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);
 	}
 
@@ -1096,11 +1100,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 +1200,7 @@ public class TsfMypageController extends TsfBaseController {
 		mav.setViewName(super.getDeviceViewName("mypage/MypageCouponDetailForm"));
 		return mav;
 	}
-	
+
 	/**
 	 * 마이페이지 리뷰화면
 	 *
@@ -1207,26 +1211,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 +1254,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 +1282,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 +1301,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 +1353,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 +1377,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 +1421,6 @@ public class TsfMypageController extends TsfBaseController {
 		return wishList;
 	}
 
-
 	/*신주승 시작*/
 
 	/**
@@ -1532,7 +1550,6 @@ public class TsfMypageController extends TsfBaseController {
 		return customerService.updateCustomerAuth(customer);
 	}
 
-
 	/**
 	 * 마이페이지 - 확인(수정)
 	 *
@@ -1560,7 +1577,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 +1764,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일로 연장하였습니다.");
+	}
+
 }

+ 43 - 9
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;
 	}
@@ -241,22 +247,50 @@ public class TsfPlanningController extends TsfBaseController {
 	 */
 	@PostMapping("/reply/list")
 	@ResponseBody
-	public GagaMap getReplyList(Plan plan) {
+	public GagaMap getReplyList(@RequestBody Plan plan) {
 		GagaMap result = new GagaMap();
-		plan.setPlanSq(plan.getPlanSq());
-		
-		result.set("replyList",planningService.getReplyList(plan));
 		if (TsfSession.isLogin()) {
 			result.set("custNo",TsfSession.getInfo().getCustNo());
 		}
 		TscPageRequest pageable = new TscPageRequest((plan.getPageNo() > 0 ? plan.getPageNo() - 1 : 0), plan.getPageSize(), plan.getPageUnit());
-		//pageable.setTotalCount(reviewService.getCompleteReviewCount(review));
-		pageable.setTotalCount(10);
+		pageable.setTotalCount(planningService.getEntryReplyCount(plan));
 		plan.setPageable(pageable);
 		log.info("pageable: {}", pageable);
 		log.info("totalCount {}", pageable.getTotalCount());
-		
 		result.set("paging", plan);
+		result.set("replyList",planningService.getReplyList(plan));
+		result.set("replyCount",planningService.getEntryReplyCount(plan));
+		result.set("replyAttachList",planningService.getEntryReplyAttachList(plan));
+		return result;
+	}
+	
+	/**
+	 * 기획전/이벤트 댓글 저장
+	 *
+	 * @return
+	 * @author sowon	
+	 * @since 2021. 04. 13
+	 */
+	@PostMapping("/reply/save")
+	@ResponseBody
+	public GagaMap saveEntryReply(@RequestBody Plan plan) {
+		GagaMap result = new GagaMap();
+		planningService.saveEntryReply(plan);
+		return result;
+	}
+	
+	/**
+	 * 기획전/이벤트 댓글 삭제
+	 *
+	 * @return
+	 * @author sowon	
+	 * @since 2021. 04. 13
+	 */
+	@PostMapping("/reply/delete")
+	@ResponseBody
+	public GagaMap deleteEntryReply(@RequestBody Plan plan) {
+		GagaMap result = new GagaMap();
+		planningService.deleteEntryReply(plan);
 		return result;
 	}
 

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

+ 9 - 4
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; // 고시항목
 
@@ -267,14 +267,19 @@ public class Plan extends TscBaseDomain {
 	private String entryVal6;			//참여값6
 	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;
 	private int pageNo = 1;
-	private int pageSize = 50;
+	private int pageSize = 10;
 	private int pageUnit = 10;
 
 	private String condition; // 키워드 종류

+ 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;		// 상품이미지명
+
 }

+ 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

@@ -1060,7 +1060,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 (
 		    /* 상품의 이미지 */
@@ -1205,7 +1211,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 (
 		    /* 상품의 이미지 */
@@ -1276,7 +1288,7 @@
 		                             AND W.CUST_NO = #{custNo}
 		</if>
 	</select>
-	
-	
+
+
 	
 </mapper>

+ 99 - 2
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
@@ -1204,6 +1205,7 @@
 	<!-- 댓글 리스트  (수정필)-->
 	<select id="getReplyList" resultType="Plan" parameterType="Plan">
 		/* TsfPlanning.getReplyList */	
+		<include refid="selectForPagingHeader"/>
 		SELECT Z.*
 		      ,(SELECT CUST_ID FROM TB_CUSTOMER WHERE CUST_NO = Z.ENTRY_CUST_NO) AS CUST_ID
 		FROM 
@@ -1224,10 +1226,105 @@
 			     , PE.REG_DT
 			     , PE.UPD_NO
 			     , PE.UPD_DT
+			     , RANK() OVER(ORDER BY REG_DT DESC) AS NUMB
 			FROM TB_PLAN_ENTRY PE
 			WHERE 1=1
 		    AND PE.PLAN_SQ = #{planSq}
-		    ORDER BY REG_NO DESC
+		    ORDER BY REG_DT DESC
 		)Z
+		<include refid="selectForPagingFooter"/>
 	</select>
+	
+	<insert id="saveEntryReply" parameterType="Plan" useGeneratedKeys="true" keyProperty="planEntrySq">
+		/* TsfPlanning.saveEntryReply */	
+		INSERT INTO TB_PLAN_ENTRY
+		( 
+		  PLAN_SQ
+		, ENTRY_CUST_NO
+		, ENTRY_DT
+		, ENTRY_VAL1
+		, ENTRY_VAL2
+		, ENTRY_VAL3
+		, ENTRY_VAL4
+		, ENTRY_VAL5
+		, ENTRY_VAL6
+		, ENTRY_VAL7
+		, ENTRY_VAL8
+		, REG_NO
+		, REG_DT
+		, UPD_NO
+		, UPD_DT
+		)
+		VALUES(
+		  #{planSq}
+		, #{custNo}
+		, CURRENT_TIMESTAMP
+		, #{entryVal1}
+		, #{entryVal2}
+		, #{entryVal3}
+		, #{entryVal4}
+		, #{entryVal5}
+		, #{entryVal6}
+		, #{entryVal7}
+		, #{entryVal8}
+		, #{custNo}
+		, CURRENT_TIMESTAMP
+		, #{custNo}
+		, CURRENT_TIMESTAMP
+		)	
+	</insert>
+	
+	<select id="getEntryReplyCount" resultType="int" parameterType="Plan">
+		/* TsfPlanning.getEntryReplyCount */		
+		SELECT COUNT(*) AS COUNT
+		FROM TB_PLAN_ENTRY
+		WHERE PLAN_SQ = #{planSq}
+	</select>
+	
+	
+	<delete id="deleteEntryReply" parameterType="Plan">
+		/* TsfPlanning.deleteEntryReply */
+		DELETE 
+		FROM TB_PLAN_ENTRY
+		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">

+ 15 - 8
src/main/webapp/WEB-INF/views/mob/common/fragments/GnbSubMob.html

@@ -15,18 +15,25 @@
  *******************************************************************************
  -->
 <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>
+			<div class="button_wrap">
+				<button class="home" onclick="cfnGoToPage(_PAGE_MAIN);">
+					<img src="/images/mo/ico_btn_home.png" alt="홈"/>
+				</button>
+				<button class="search" onclick="cfnGoToPage(_PAGE_SEARCH);">
+					<img src="/images/mo/ico_btn_search.png" alt="검색"/>
+				</button>
+				<button class="store" onclick="cfnGoToPage(_PAGE_CART);">
+					<img src="/images/mo/ico_btn_store.png" alt="쇼핑백"/>
+					<span>99+</span>
+				</button>
+			</div>
 		</section>
 	</header>
 	

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

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

@@ -17,7 +17,7 @@
 <!-- 상품문의 리스트 내용 -->
 <form id="goodsQnaForm" name="goodsQnaForm" action="#" th:action="@{'/goods/qna/list'}">
 <input type="hidden" name="pageNo"  value ="1"/>
-<input type="hidden" name="pageSize" value ="3"/>
+<input type="hidden" name="pageSize" value ="20"/>
 <input type="hidden" name="relGoodsCd" th:value ="${goodsInfo.goodsCd}"/>
 <div class="pd_qnalist">
 	<div class="info_txt">
@@ -62,10 +62,12 @@
 </div>
 </form>
 <script src="/ux/plugins/jquery/jquery.history.min.js"></script>
-<script src="/ux/plugins/gaga/gaga.infinite.scroll.js"></script>
+<script src="/ux/plugins/gaga/gaga.infinite.scrollLayer.js"></script>
 <script th:inline="javascript">
 /*<![CDATA[*/
 	
+	$(function() { gagaInfiniteScroll.getHistory(); });
+	
 	// 상품 검색
 	var fnGetInfiniteScrollDataList = function(pageNum) {
 	
@@ -171,9 +173,10 @@
 	}
 	
 	$(document).ready( function() {
-		fnGoodsQnaListSearch();
+		//fnGoodsQnaListSearch();
 	});
 	
+	
 /*]]>*/
 </script>	
  </html>

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

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

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

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

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

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

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

+ 61 - 38
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
@@ -49,7 +49,7 @@
 												th:attr="onclick=|sendSns('facebook', '${stylelUrl+'/planning/detail/form?planSq='+planInfo.planSq}', '${planInfo.planNm}', '', '');|">
 												<span>페이스북</span>
 											</button>
-											<button type="button" class="tw"
+											<button type="button" class="tw" 
 												th:attr="onclick=|sendSns('twitter', '${stylelUrl+'/planning/detail/form?planSq='+planInfo.planSq}', '${planInfo.planNm+ '#style24몰'}', '', '');|">
 												<span>트위터</span>
 											</button>
@@ -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>
@@ -287,6 +283,8 @@ let goods2 = [[${goods2Info}]];
 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')}]];
@@ -753,9 +751,6 @@ var fnTextConfirm = function() {
 var ajaxReplyList = function () {
 	gagaPaging.init('searchForm', fnSearchCallback, 'paging', 10);
 	gagaPaging.load(1);
-	 /* $.getJSON('/planning/reply/list?planSq='+plan.planSq, function(result, status) { */
-		
-	/*  }); */
 }
 
 var fnSearchCallback = function (result) {
@@ -763,7 +758,7 @@ var fnSearchCallback = function (result) {
 	 if (result!=null) {
 		 var html = '';
 		 html += '<div class="cmt_list_tit">';
-		 html += '	<strong>댓글</strong><span class="cnt">('+result.replyList.length.addComma()+')</span>';
+		 html += '	<strong>댓글</strong><span class="cnt">('+result.replyCount.addComma()+')</span>';
 		 html += '</div>';
 		 if (result.replyList.length>0) {
 			 html += '<ul class="cmt_list">';
@@ -775,15 +770,19 @@ 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>';
-				 html += '				<span class="pics"><img class="picsThumbs" src="/images/pc/thumb/ev_list_img02.jpg" alt="썸네일"></span>';
-				 html += '				<span class="pics"><img class="picsThumbs" src="/images/pc/thumb/ev_list_img03.jpg" alt="썸네일"></span>';
-				 html += '				<span class="pics"><img class="picsThumbs" src="/images/pc/thumb/ev_list_img04.jpg" alt="썸네일"></span>';
+				 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) {
-					 html += '			<button class="btn btn_default btn_del"><span>삭제</span></button>';
-				}
+					 html += '			<button class="btn btn_default btn_del" value="'+item.planEntrySq+'" onclick="fnDelReply(this.value)"><span>삭제</span></button>';
+				 }
 				 html += '		</div>';
 				 html += '	</li>';
 			 });
@@ -805,14 +804,30 @@ var fnSearchCallback = function (result) {
 	gagaPaging.createPagination(result.paging.pageable);
 }
 
+// 댓글 삭제
+var fnDelReply = function(obj) {
+	
+	data = {planEntrySq : obj};
+	var jsonData = JSON.stringify(data);
+
+	mcxDialog.confirm("댓글을 삭제 하시겠습니까?", {
+		cancelBtnText : "취소",
+		sureBtnText : "확인",
+		sureBtnClick : function() {
+
+		gagajf.ajaxJsonSubmit('/planning/reply/delete', jsonData,function() {
+			ajaxReplyList();	
+			});
+		}
+	})
+}
 $('#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)$";
@@ -821,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 이하 파일만 가능합니다.', {
@@ -844,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자 이상 입력해주세요.");
@@ -866,7 +880,17 @@ var fnReplySave = function() {
 		return;
 	}
 	
-	data = {content : content};
+	//파일관련 데이터 담기
+	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,
+			multiReplyOrgFile : multiReplyOrgFile,
+			multiReplySysFile : multiReplySysFile};
 	var jsonData = JSON.stringify(data);
 
 	mcxDialog.confirm("댓글을 등록 하시겠습니까?", {
@@ -875,12 +899,16 @@ var fnReplySave = function() {
 		sureBtnClick : function() {
 
 		gagajf.ajaxJsonSubmit('/planning/reply/save', jsonData,function() {
-						
-		});
-	}
+			ajaxReplyList();	
+			$('#replyText').val('');
+			});
+		}
+	})
 }
 
 
+
+
 $(document).ready( function() {
 	ajaxReplyList();
 	//공유 버튼 토글 
@@ -1002,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);
@@ -1026,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();
@@ -1045,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;
 }
 

+ 10 - 5
src/main/webapp/biz/mypage.js

@@ -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();
 }

TEMPAT SAMPAH
src/main/webapp/images/mo/ico_admin2.png


TEMPAT SAMPAH
src/main/webapp/images/mo/ico_btn_more_w.png


TEMPAT SAMPAH
src/main/webapp/images/mo/ico_btn_search_w.png


TEMPAT SAMPAH
src/main/webapp/images/mo/ico_btn_store_w.png


TEMPAT SAMPAH
src/main/webapp/images/mo/ico_cate_arrow.png


TEMPAT SAMPAH
src/main/webapp/images/mo/ico_like03.png


TEMPAT SAMPAH
src/main/webapp/images/mo/ico_picker.png


TEMPAT SAMPAH
src/main/webapp/images/mo/ico_restock_past.png


TEMPAT SAMPAH
src/main/webapp/images/mo/ico_restock_ready.png


TEMPAT SAMPAH
src/main/webapp/images/mo/ico_restock_remain.png


TEMPAT SAMPAH
src/main/webapp/images/mo/ico_sch_del_w.png


TEMPAT SAMPAH
src/main/webapp/images/mo/ico_tabbar.png


TEMPAT SAMPAH
src/main/webapp/images/mo/info_size_bag.png


TEMPAT SAMPAH
src/main/webapp/images/mo/info_size_pants.png


TEMPAT SAMPAH
src/main/webapp/images/mo/info_size_shoe.png


TEMPAT SAMPAH
src/main/webapp/images/mo/info_size_top.png


TEMPAT SAMPAH
src/main/webapp/images/mo/info_size_underwear.png


TEMPAT SAMPAH
src/main/webapp/images/mo/logo_STYLE24.png


TEMPAT SAMPAH
src/main/webapp/images/mo/logo_STYLE24_b.png


TEMPAT SAMPAH
src/main/webapp/images/mo/pd_arrow.png


TEMPAT SAMPAH
src/main/webapp/images/mo/thumb/brand01.png


TEMPAT SAMPAH
src/main/webapp/images/mo/thumb/brand02.png


TEMPAT SAMPAH
src/main/webapp/images/mo/thumb/brand03.png


TEMPAT SAMPAH
src/main/webapp/images/mo/thumb/brand04.png


TEMPAT SAMPAH
src/main/webapp/images/mo/thumb/brand05.png


TEMPAT SAMPAH
src/main/webapp/images/mo/thumb/brand06.png


TEMPAT SAMPAH
src/main/webapp/images/mo/thumb/brand07.png


TEMPAT SAMPAH
src/main/webapp/images/mo/thumb/brand08.png


TEMPAT SAMPAH
src/main/webapp/images/mo/thumb/brand09.png


TEMPAT SAMPAH
src/main/webapp/images/mo/thumb/brand10.png


TEMPAT SAMPAH
src/main/webapp/images/mo/thumb/brand11.png


TEMPAT SAMPAH
src/main/webapp/images/mo/thumb/brand12.png


TEMPAT SAMPAH
src/main/webapp/images/mo/thumb/brand13.png


TEMPAT SAMPAH
src/main/webapp/images/mo/thumb/brand14.png


TEMPAT SAMPAH
src/main/webapp/images/mo/thumb/brand15.png


TEMPAT SAMPAH
src/main/webapp/images/mo/thumb/brand16.png


TEMPAT SAMPAH
src/main/webapp/images/mo/thumb/ev_list_img05.jpg


TEMPAT SAMPAH
src/main/webapp/images/mo/thumb/ev_list_img06.jpg


TEMPAT SAMPAH
src/main/webapp/images/mo/thumb/ev_list_img07.jpg


TEMPAT SAMPAH
src/main/webapp/images/mo/thumb/ev_list_img08.jpg


TEMPAT SAMPAH
src/main/webapp/images/mo/thumb/thumb_notice1.jpg


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

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

+ 2 - 2
src/main/webapp/ux/mo/js/common_m.js

@@ -79,7 +79,7 @@ $(document).ready(function() {
             lastScrollTop = st;
 
             var posiGap = $(window).scrollTop();
-            //console.log(posiGap);
+            console.log(posiGap);
 
         });
 
@@ -668,7 +668,7 @@ $(document).ready(function () {
             popOpenScroll();
             //$('.btPop_body .lap span').css('color', 'red')
             //console.log($(this)[0]);
-            //console.log();
+            console.log();
             $('.container').addClass('btPop_open');
             // autome.style.top  = autotop /10 + "vh";
             if (autotop > 251) {

+ 18 - 10
src/main/webapp/ux/plugins/gaga/gaga.infinite.scroll.js → src/main/webapp/ux/plugins/gaga/gaga.infinite.scrollLayer.js

@@ -9,17 +9,21 @@
  *
  * 사용 예)
  * 		// HTML 태그는 다음과 같은 구조로 되어 있어야 하며
- * 		// id 명칭은 infiniteContainer, listBoxOuter, listBox 가 필요하다.
- * 		<section id="infiniteContainer">
- * 			<div id="listBoxOuter">
- * 				<ul id="listBox">
- * 				</ul>
+ * 		// data-id는 layer_infinite,layer_infinite_item 가 필요하고  id 명칭은 infiniteContainer, listBoxOuter, listBox 가 필요하다.
+ * 		<div id="layer_goods_qna" data-id="" > 레어팝업
+ * 			<div class="modal-body" id="goodsDealQna" data-id="layer_infinite_item" >
+ * 				<section id="infiniteContainer">
+ * 					<div id="listBoxOuter">
+ * 						<ul id="listBox">
+ * 						</ul>
+ *					</div>
+ *				</section>
  *			</div>
- *		</section>
+ *		</div>
  *
  * 		// JQUERY History 파일과 인피니트 스크롤 관련 자바스크립트 파일을 import 되어 있어야 한다.
  * 		<script type="text/javascript" src="/ux/plugins/jquery.history.min.js"></script>
- * 		<script type="text/javascript" src="/ux/plugins/gaga.infinite.scroll.js"></script>
+ * 		<script type="text/javascript" src="/ux/plugins/gaga.infinite.scrollLyer.js"></script>
  *
  * 		<script type="text/javascript">
  * 			// 인피니트 스크롤에 대한 History 정보를 가져오기 위해 함수를 호출한다.
@@ -59,8 +63,7 @@ var gagaInfiniteScroll = {
 	},
 	scrollCheck : function() {
 		var obj = this.obj, stat = this.pageStatus;
-
-		if (obj.$window.scrollTop() >= obj.$ajaxBox.offset().top + obj.$ajaxBox.height() - obj.$window.height()) { // 더보기
+		if ($('[data-id="layer_infinite"]').scrollTop() + $('[data-id="layer_infinite"]').height() >= $('[data-id="layer_infinite_item"]').height() ) { // 더보기
 			if (stat.loadAlign == 'not') {
 				var pageLen = this.pageStatus.pageNum.length - 1;
 				var nextPageNum = this.pageStatus.pageNum[pageLen] + 1;
@@ -68,6 +71,7 @@ var gagaInfiniteScroll = {
 				this.pageStatus.loadPage = nextPageNum;
 				stat.loadAlign = 'next';
 				this.getDataList();
+				
 			};
 		}
 	},
@@ -103,7 +107,11 @@ var gagaInfiniteScroll = {
 			gagaInfiniteScroll.draw(historyData.data.htm);
 		};
 
-		$(window).on('scroll', function() {
+//		$(window).on('scroll', function() {
+//			gagaInfiniteScroll.scrollCheck();
+//		});
+		
+		$('[data-id="layer_infinite"]').on('scroll', function() {
 			gagaInfiniteScroll.scrollCheck();
 		});
 	},

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

@@ -10,6 +10,7 @@ const _PAGE_ALL_BRAND = _frontUrl + "/display/all/brand/form";			// 전체 브
 const _PAGE_CATE_MAIN = _frontUrl + "/display/category/main/form";		// 카테고리메인
 const _PAGE_BRAND_MAIN = _frontUrl + "/display/brand/main/form";		// 브랜드메인
 const _PAGE_CATE_GOODS_LIST = _frontUrl + "/display/category/goods/list/form";	// 카테고리 상품목록
+const _PAGE_BEST_MAIN = _frontUrl + "/display/best/main/form";		// 베스트메인
 
 //== 고객 ==/
 const _PAGE_CUSTOMER_JOIN_TYPE = _frontUrl + "/customer/join/type/form";							// 고객 > 회원가입 유형
@@ -682,7 +683,7 @@ function cfGoodsQng(goodsCd) {
 	var Param = new Object();
 	var str = '<div class="pd_pop full_pop pd_qnalist_pop" id="layer_goods_qna"></div>';
 	if ("P" != _frontGb){
-		str = '<div class="modal pop_full fade pd_pop pd_qnalist_pop" id="layer_goods_qna" tabindex="-1" role="dialog" aria-labelledby="exampleFullLabel" aria-hidden="true"></div>';
+		str = '<div class="modal pop_full fade pd_pop pd_qnalist_pop"  data-id="layer_infinite" id="layer_goods_qna" tabindex="-1" role="dialog" aria-labelledby="exampleFullLabel" aria-hidden="true"></div>';
 	}
 
 	if ($('#layer_goods_qna').length == 0) {
@@ -1060,9 +1061,10 @@ var cfnGoToBrandMain = function(brandGroupNo) {
  * @since  : 2021/03/29
  * @author : sowon
  */
-var cfnGoToPlanDetail = function (planSq) {
-
-    cfnGoToPage(_PAGE_PLANNING_DETAIL + '?planSq=' + planSq);
+var cfnGoToPlanDetail = function (planSq , brandGroupNo) {
+	var params = '?planSq='+planSq;
+	if (typeof (brandGroupNo) != 'undefined') params += '&brandGroupNo=' + brandGroupNo;
+    cfnGoToPage(_PAGE_PLANNING_DETAIL + params);
 }
 
 /**
@@ -1078,7 +1080,7 @@ var cfnGoToPlanDetail = function (planSq) {
  */
 var cfnGoToLookbookList = function (lookbookGb, brandGroupNo) {
 	var params = '?lookbookGb='+lookbookGb;
-	if (typeof (brandGroupNo) != 'undefined') params += '?brandCd=' + brandGroupNo;
+	if (typeof (brandGroupNo) != 'undefined') params += '&brandCd=' + brandGroupNo;
 
 	cfnGoToPage(_PAGE_LOOKBOOK_MAIN + params);
 }