Browse Source

Merge remote-tracking branch 'origin/develop' into xodud1202

xodud lee 4 năm trước cách đây
mục cha
commit
0bdb55a4fd
65 tập tin đã thay đổi với 1259 bổ sung931 xóa
  1. 1 1
      src/main/java/com/style24/front/biz/dao/TsfCustomerDao.java
  2. 11 0
      src/main/java/com/style24/front/biz/dao/TsfWishlistDao.java
  3. 1 1
      src/main/java/com/style24/front/biz/service/TsfCustomerService.java
  4. 6 4
      src/main/java/com/style24/front/biz/service/TsfOrderService.java
  5. 19 0
      src/main/java/com/style24/front/biz/service/TsfWishlistService.java
  6. 445 259
      src/main/java/com/style24/front/biz/thirdparty/EigeneaiApi.java
  7. 2 2
      src/main/java/com/style24/front/biz/thirdparty/SearchEngineDiquest.java
  8. 15 1
      src/main/java/com/style24/front/biz/thirdparty/Yes24Login.java
  9. 3 3
      src/main/java/com/style24/front/biz/web/TsfDisplayController.java
  10. 13 285
      src/main/java/com/style24/front/biz/web/TsfGoodsController.java
  11. 25 4
      src/main/java/com/style24/front/biz/web/TsfMypageController.java
  12. 5 2
      src/main/java/com/style24/front/biz/web/TsfPlanningController.java
  13. 1 1
      src/main/java/com/style24/persistence/domain/Social.java
  14. 21 2
      src/main/java/com/style24/persistence/domain/eigene/Eigeneai.java
  15. 2 2
      src/main/java/com/style24/persistence/mybatis/shop/TsfCustomer.xml
  16. 2 2
      src/main/java/com/style24/persistence/mybatis/shop/TsfDisplay.xml
  17. 6 8
      src/main/java/com/style24/persistence/mybatis/shop/TsfGoods.xml
  18. 1 1
      src/main/java/com/style24/persistence/mybatis/shop/TsfOrder.xml
  19. 21 3
      src/main/java/com/style24/persistence/mybatis/shop/TsfOrderChange.xml
  20. 1 1
      src/main/java/com/style24/persistence/mybatis/shop/TsfPlanning.xml
  21. 4 11
      src/main/java/com/style24/persistence/mybatis/shop/TsfReview.xml
  22. 10 0
      src/main/java/com/style24/persistence/mybatis/shop/TsfWishlist.xml
  23. BIN
      src/main/webapp/WEB-INF/lib/Istyle.jar
  24. 8 3
      src/main/webapp/WEB-INF/views/mob/app/NoticeFormMob.html
  25. 1 1
      src/main/webapp/WEB-INF/views/mob/callcenter/FaqFormMob.html
  26. 5 3
      src/main/webapp/WEB-INF/views/mob/common/fragments/FooterMob.html
  27. 46 17
      src/main/webapp/WEB-INF/views/mob/display/BrandMainFormMob.html
  28. 1 1
      src/main/webapp/WEB-INF/views/mob/display/LookbookDetailFormMob.html
  29. 31 27
      src/main/webapp/WEB-INF/views/mob/display/MallMainFormMob.html
  30. 1 1
      src/main/webapp/WEB-INF/views/mob/goods/GoodsDealDescFormMob.html
  31. 26 1
      src/main/webapp/WEB-INF/views/mob/goods/GoodsDealDetailFormMob.html
  32. 22 24
      src/main/webapp/WEB-INF/views/mob/goods/GoodsDetailFormMob.html
  33. 38 10
      src/main/webapp/WEB-INF/views/mob/goods/GoodsOtherFormMob.html
  34. 10 1
      src/main/webapp/WEB-INF/views/mob/mypage/MypageCreCancelDetailFormMob.html
  35. 13 1
      src/main/webapp/WEB-INF/views/mob/mypage/MypageCreListInfoMob.html
  36. 0 14
      src/main/webapp/WEB-INF/views/mob/mypage/MypageOrderListInfoMob.html
  37. 0 1
      src/main/webapp/WEB-INF/views/mob/mypage/MypageReturnFormMob.html
  38. 0 1
      src/main/webapp/WEB-INF/views/mob/mypage/NoMemberReturnFormMob.html
  39. 5 5
      src/main/webapp/WEB-INF/views/mob/planning/PlanningShotGuideFormMob.html
  40. 1 1
      src/main/webapp/WEB-INF/views/mob/social/SocialMainFormMob.html
  41. 1 1
      src/main/webapp/WEB-INF/views/web/callcenter/FaqFormWeb.html
  42. 4 2
      src/main/webapp/WEB-INF/views/web/common/fragments/FooterWeb.html
  43. 13 2
      src/main/webapp/WEB-INF/views/web/common/fragments/GnbWeb.html
  44. 6 3
      src/main/webapp/WEB-INF/views/web/customer/PrivacyPolicyFormWeb.html
  45. 50 24
      src/main/webapp/WEB-INF/views/web/display/BrandMainFormWeb.html
  46. 4 4
      src/main/webapp/WEB-INF/views/web/display/LookbookDetailFormWeb.html
  47. 56 30
      src/main/webapp/WEB-INF/views/web/display/MallMainFormWeb.html
  48. 1 1
      src/main/webapp/WEB-INF/views/web/display/SearchLayerWeb.html
  49. 1 2
      src/main/webapp/WEB-INF/views/web/goods/GoodsDealDescFormWeb.html
  50. 69 41
      src/main/webapp/WEB-INF/views/web/goods/GoodsDealDetailFormWeb.html
  51. 107 32
      src/main/webapp/WEB-INF/views/web/goods/GoodsDetailFormWeb.html
  52. 11 11
      src/main/webapp/WEB-INF/views/web/goods/GoodsOtherFormWeb.html
  53. 7 1
      src/main/webapp/WEB-INF/views/web/mypage/MypageCreCancelDetailFormWeb.html
  54. 10 1
      src/main/webapp/WEB-INF/views/web/mypage/MypageCreListFormWeb.html
  55. 0 7
      src/main/webapp/WEB-INF/views/web/mypage/MypageOrderListFormWeb.html
  56. 0 1
      src/main/webapp/WEB-INF/views/web/mypage/MypageReturnFormWeb.html
  57. 0 1
      src/main/webapp/WEB-INF/views/web/mypage/NoMemberReturnFormWeb.html
  58. 1 1
      src/main/webapp/WEB-INF/views/web/social/SocialMainFormWeb.html
  59. 73 42
      src/main/webapp/biz/goods.js
  60. 1 1
      src/main/webapp/biz/search.js
  61. BIN
      src/main/webapp/images/mo/ico_btn_narrow.png
  62. 4 4
      src/main/webapp/ux/mo/css/common_m.css
  63. 7 6
      src/main/webapp/ux/mo/css/layout_m.css
  64. 2 1
      src/main/webapp/ux/pc/css/common.css
  65. 8 7
      src/main/webapp/ux/pc/css/layout.css

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

@@ -64,7 +64,7 @@ public interface TsfCustomerDao {
 	 * @author jsshin
 	 * @since 2021. 02. 24
 	 */
-	Customer getCusomterActiveAndDormant(Customer customer);
+	Customer getCustomerActiveAndDormant(Customer customer);
 
 	/**
 	 * SNS 정보로 고객 테이블 조회

+ 11 - 0
src/main/java/com/style24/front/biz/dao/TsfWishlistDao.java

@@ -43,4 +43,15 @@ public interface TsfWishlistDao {
 	 * @date 2021. 5. 13
 	 */
 	Collection<Goods> getQuickWishList(WishList wishList);
+	
+	/**
+	 * 위시리스트 상품여부용
+	 *
+	 * @param 
+	 * @return
+	 * @author eskim
+	 * @date 2021. 6. 30
+	 */
+	int getWishListGoodsCount(WishList wishList);
+	
 }

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

@@ -83,7 +83,7 @@ public class TsfCustomerService {
 		TsfSession.setAttribute("maskingYn", "Y");
 		customer.setSiteCd(TscConstants.Site.STYLE24.value());
 		customer.encryptData(); // 데이터 암호하
-		return customerDao.getCusomterActiveAndDormant(customer);
+		return customerDao.getCustomerActiveAndDormant(customer);
 	}
 
 	/**

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

@@ -150,10 +150,12 @@ public class TsfOrderService {
 				&& !TscConstants.OrderDetailStat.DEPOSIT_WAIT.value().equals(tmpOrder.getOrdDtlStat())
 				&& !TscConstants.OrderDetailStat.PAYMENT_COMPLETE.value().equals(tmpOrder.getOrdDtlStat())
 				&& !TscConstants.OrderDetailStat.GOODS_PREPARE.value().equals(tmpOrder.getOrdDtlStat())) {
-				// 2021.06.28 취소수량 존재 시 전체취소 불가 처리
-				if (tmpOrder.getCnclRtnQty() > 0) {
-					allCanYn = "N";
-				}
+				allCanYn = "N";
+			}
+
+			// 2021.06.28 취소수량 존재 시 전체취소 불가 처리
+			if ("Y".equals(allCanYn) && tmpOrder.getCnclRtnQty() > 0) {
+				allCanYn = "N";
 			}
 
 			// 전체 구매확정 가능 여부 설정

+ 19 - 0
src/main/java/com/style24/front/biz/service/TsfWishlistService.java

@@ -67,4 +67,23 @@ public class TsfWishlistService {
 		wishList.setCustNo(login.getCustNo());
 		return wishListDao.getQuickWishList(wishList);
 	}
+	
+	/**
+	 * 위시리스트 상품여부용 
+	 *
+	 * @param 
+	 * @return
+	 * @author eskim
+	 * @date 2021. 6. 30
+	 */
+	public int getWishListGoodsCount(String goodsCd){
+		WishList wishList = new WishList();
+		Login login = TsfSession.getInfo();
+		wishList.setCustNo(login.getCustNo());
+		wishList.setGoodsCd(goodsCd);
+		return wishListDao.getWishListGoodsCount(wishList);
+	}
+	
+	
+	
 }

+ 445 - 259
src/main/java/com/style24/front/biz/thirdparty/EigeneaiApi.java

@@ -1,260 +1,446 @@
-package com.style24.front.biz.thirdparty;
-
-import java.io.UnsupportedEncodingException;
-import java.net.URI;
-import java.net.URLEncoder;
-import java.util.ArrayList;
-import java.util.Collection;
-
-import javax.annotation.PostConstruct;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.http.HttpStatus;
-import org.springframework.http.ResponseEntity;
-import org.springframework.stereotype.Component;
-import org.springframework.web.client.RestTemplate;
-
-import com.google.gson.Gson;
-import com.style24.persistence.domain.eigene.Eigeneai;
-import com.style24.persistence.domain.eigene.Eigeneai.Result;
-
-import lombok.extern.slf4j.Slf4j;
-
-/**
- * 추천솔루션 - Eigene.ai
- *
- * @author gagamel
- * @since 2021. 5. 14
- */
-@Component
-@Slf4j
-public class EigeneaiApi {
-
-	private String apiUrl = "https://api.eigene.io/rec";
-	private String rtsApiUrl = "https://rts-api.eigene.io/api";
-	private String cuid = "1252aed4-78dc-46e8-b784-94ac42e86dd4";
-
-	@Autowired
-	private RestTemplate restTemplate;
-
-	@PostConstruct
-	public void init() {
-		log.debug("\n\n---- Eigene.ai initialization started ----");
-		log.debug("apiUrl: [{}]", apiUrl);
-		log.debug("cuid: [{}]", cuid);
-		log.debug("\n--- Eigene.ai initialization completed ----\n");
-	}
-
-	/**
-	 * 주간베스트추천상품 목록
-	 * @param size - 결과에 포함할 상품수
-	 * @param cate1No - 카테고리1번호
-	 * @return
-	 * @author gagamel
-	 * @since 2021. 5. 14
-	 */
-	public Eigeneai getWeeklyBestGoodsList(int size, Integer cate1No) {
-		String requestUrl = apiUrl + "/m060?cuid=" + cuid + "&size=" + size + "&incids=" + cate1No;
-		return this.getRecommendationGoodsList(requestUrl);
-	}
-
-	/**
-	 * 카테고리별 주간베스트추천상품 목록
-	 * @param size - 결과에 포함할 상품수
-	 * @return
-	 * @author gagamel
-	 * @since 2021. 5. 14
-	 */
-	public Eigeneai getCategoryWeeklyBestGoodsList(int size) {
-		// TODO: 카테고리ID는 어떻게 조회? 아이겐 미개발
-		String requestUrl = apiUrl + "/m008?cuid=" + cuid + "&cids=" + "" + "&size=" + size;
-		return this.getRecommendationGoodsList(requestUrl);
-	}
-
-	/**
-	 * 월간클릭베스트추천상품 목록
-	 * @param size - 결과에 포함할 상품수
-	 * @return
-	 * @author gagamel
-	 * @since 2021. 5. 14
-	 */
-	public Collection<Result> getMonthlyClickBestGoodsList(int size, Integer brandGroupNo) {
-		String requestUrl = apiUrl + "/m062?cuid=" + cuid + "&cids=" + "" + "&size=" + size + "&bids=" + brandGroupNo;
-
-		Eigeneai eigeneai = this.getRecommendationGoodsList(requestUrl);
-		if (eigeneai.getResults() != null && !eigeneai.getResults().isEmpty()) {
-			return eigeneai.getResults();
-		}
-
-		return new ArrayList<Result>();
-	}
-
-	/**
-	 * 실시간베스트상품 목록
-	 * @param size - 결과에 포함할 상품수
-	 * @return
-	 * @author gagamel
-	 * @since 2021. 5. 14
-	 */
-	public Eigeneai getRealtimeBestGoodsList(int size) {
-		String requestUrl = apiUrl + "/stats-transition?cuid=" + cuid + "&size=" + size;
-		return this.getRecommendationGoodsList(requestUrl);
-	}
-
-	/**
-	 * 매출급상승 카테고리별 상품 목록
-	 * @param size - 결과에 포함할 상품수
-	 * @return
-	 * @author gagamel
-	 * @since 2021. 5. 14
-	 */
-	public Eigeneai getSalesSoaringGoodsList() {
-		// TODO: 매출급상승 카테고리 5개 조회 후 카테고리별 상품 7개 조회
-		String requestUrl = apiUrl + "/m010?cuid=" + cuid + "&size=5";
-		return this.getRecommendationGoodsList(requestUrl);
-	}
-
-	/**
-	 * 고객의 최근검색어별 상품 목록
-	 * @param size - 결과에 포함할 상품수
-	 * @return
-	 * @author gagamel
-	 * @since 2021. 5. 14
-	 */
-	public Collection<Eigeneai> getCustomerKeywordGoodsList() {
-		Collection<Eigeneai> dataList = new ArrayList<>();
-
-		// 고객별 최근검색어 목록. TODO: 아이겐에서 미개발
-		String requestUrl = apiUrl + "/m010?cuid=" + cuid + "&size=5";
-		Eigeneai eigeneai = this.getRecommendationGoodsList(requestUrl);
-
-		Collection<Eigeneai.Result> resultList = eigeneai.getResults();
-		if (resultList == null || resultList.isEmpty()) {
-			return dataList;
-		}
-
-		// 고객별 최근검색어 기준 검색어연관상품 목록 조회
-		for (Eigeneai.Result result : resultList) {
-			dataList.add(this.getKeywordGoodsList(result.getCategoryId(), 10));
-		}
-
-		return dataList;
-	}
-
-	/**
-	 * 검색어연관상품 목록
-	 * @param keyword - 키워드
-	 * @param size - 결과에 포함할 상품수
-	 * @return
-	 * @author gagamel
-	 * @since 2021. 5. 14
-	 */
-	public Eigeneai getKeywordGoodsList(String keyword, int size) {
-		String requestUrl = apiUrl + "/s001?cuid=" + cuid + "&size=" + size;
-		try {
-			requestUrl += "&st=" + URLEncoder.encode(keyword, "UTF-8");
-		} catch (UnsupportedEncodingException e) {
-			// TODO Auto-generated catch block
-			e.printStackTrace();
-		}
-		return this.getRecommendationGoodsList(requestUrl);
-	}
-
-	/**
-	 * 실시간 많이 조회되고 있는 상품 목록
-	 * @param size - 결과에 포함할 상품수
-	 * @return
-	 * @author gagamel
-	 * @since 2021. 5. 14
-	 */
-	public Collection<Result> getRealtimeGoodsList(int size) {
-		String requestUrl = rtsApiUrl + "/stream?cuid=" + cuid + "&size=" + size + "&type=view";
-
-		Eigeneai eigeneai = this.getRecommendationGoodsList(requestUrl);
-		if (eigeneai.getResults() != null && !eigeneai.getResults().isEmpty()) {
-			return eigeneai.getResults();
-		}
-
-		return new ArrayList<Result>();
-	}
-
-	/**
-	 * 연관상품 목록
-	 * @param goodsCd - 상품코드
-	 * @param size - 결과에 포함할 상품수
-	 * @return
-	 * @author gagamel
-	 * @since 2021. 5. 14
-	 */
-	public Eigeneai getRelatedGoodsList(String goodsCd, int size) {
-		String requestUrl = apiUrl + "/a003?cuid=" + cuid + "&iids=" + goodsCd + "&size=" + size;
-		return this.getRecommendationGoodsList(requestUrl);
-	}
-
-	/**
-	 * 브랜드 연관상품 목록
-	 * @param size - 결과에 포함할 상품수
-	 * @return
-	 * @author gagamel
-	 * @since 2021. 5. 14
-	 */
-	public Eigeneai getBrandRelatedGoodsList(int size) {
-		// TODO: 아이겐 미개발 (a004&cids=category3 or a002&inbids=brandId)
-		String requestUrl = apiUrl + "/a004?cuid=" + cuid + "&cids=" + "" + "&size=" + size;
-		return this.getRecommendationGoodsList(requestUrl);
-	}
-
-	/**
-	 * 동일 카테고리 연관상품 목록
-	 * @param goodsCd - 상품코드
-	 * @param size - 결과에 포함할 상품수
-	 * @return
-	 * @author gagamel
-	 * @since 2021. 5. 14
-	 */
-	public Eigeneai getSameCategoryRelatedGoodsList(String goodsCd, int size) {
-		String requestUrl = apiUrl + "/a002?cuid=" + cuid + "&iids=" + goodsCd + "&size=" + size;
-		return this.getRecommendationGoodsList(requestUrl);
-	}
-
-	/**
-	 * 상품의 실시간 조회수
-	 * @param goodsCd - 상품코드
-	 * @return
-	 * @author gagamel
-	 * @since 2021. 5. 14
-	 */
-	public Eigeneai getRealtimeViewCount(String goodsCd) {
-		// TODO: 아이겐 미개발 (건수를 가져오는 걸로 해야하지 않을까?)
-		String requestUrl = apiUrl + "/stat?cuid=" + cuid + "&cids=" + goodsCd;
-		Eigeneai eigeneai = this.getRecommendationGoodsList(requestUrl);
-		return eigeneai;
-	}
-
-	/**
-	 * 추천상품 목록
-	 * @param requestUrl - Reqeust URL
-	 * @return
-	 * @author gagamel
-	 * @since 2021. 5. 14
-	 */
-	private Eigeneai getRecommendationGoodsList(String requestUrl) {
-		log.info("requestUrl: {}", requestUrl);
-		URI url = URI.create(requestUrl);
-
-		// GET방식으로 호출
-		ResponseEntity<String> responseEntity = restTemplate.getForEntity(url, String.class);
-		log.info("responseEntity.getStatusCode(): {} ", responseEntity.getStatusCode());
-
-		String responseJson = responseEntity.getBody();
-		log.info("responseEntity.getBody(): {}", responseJson);
-
-		if (!responseEntity.getStatusCode().equals(HttpStatus.OK)) {
-			return null;
-		}
-
-		Gson gson = new Gson();
-		return gson.fromJson(responseJson, Eigeneai.class);
-	}
-
+package com.style24.front.biz.thirdparty;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URI;
+import java.net.URLEncoder;
+import java.util.ArrayList;
+import java.util.Collection;
+
+import javax.annotation.PostConstruct;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Component;
+import org.springframework.web.client.RestTemplate;
+
+import com.google.gson.Gson;
+import com.style24.persistence.domain.eigene.Eigeneai;
+import com.style24.persistence.domain.eigene.Eigeneai.Item;
+import com.style24.persistence.domain.eigene.Eigeneai.Result;
+
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * 추천솔루션 - Eigene.ai
+ *
+ * @author gagamel
+ * @since 2021. 5. 14
+ */
+@Component
+@Slf4j
+public class EigeneaiApi {
+
+	private String apiUrl = "https://api.eigene.io/rec";
+	private String rtsApiUrl = "https://rts-api.eigene.io/api";
+	private String cuid = "1252aed4-78dc-46e8-b784-94ac42e86dd4";
+
+	@Autowired
+	private RestTemplate restTemplate;
+
+	@PostConstruct
+	public void init() {
+		log.debug("\n\n---- Eigene.ai initialization started ----");
+		log.debug("apiUrl: [{}]", apiUrl);
+		log.debug("cuid: [{}]", cuid);
+		log.debug("\n--- Eigene.ai initialization completed ----\n");
+	}
+
+	/**
+	 * 카테고리별 주간판매베스트추천상품 목록
+	 * 사용되는 화면 영역)
+	 * 		메인 > 베스트 영역
+	 * 		카테고리메인 > 베스트 상품
+	 * 		베스트 > 카테고리별 베스트
+	 * @param size - 결과에 포함할 상품수
+	 * @param cate1No - 카테고리번호1
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 5. 14
+	 */
+	public Collection<Result> getCategoryWeeklySellBestGoodsList(int size, Integer cate1No) {
+		String requestUrl = apiUrl + "/m060?cuid=" + cuid + "&size=" + size + "&incids=" + cate1No;
+
+		Eigeneai eigeneai = this.getEigeneaiInfo(requestUrl);
+		if (eigeneai.getResults() != null && !eigeneai.getResults().isEmpty()) {
+			return eigeneai.getResults();
+		}
+
+		return new ArrayList<Result>();
+	}
+
+//	/**
+//	 * 매출급상승 카테고리 목록
+//	 * 사용되는 화면 영역)
+//	 * 		메인 > MD추천상품
+//	 * @return
+//	 * @author gagamel
+//	 * @since 2021. 6. 30
+//	 */
+//	public Collection<Result> getSoaringSalesCategoryList() {
+//		String requestUrl = apiUrl + "/m063?cuid=" + cuid;
+//
+//		Eigeneai eigeneai = this.getEigeneaiInfo(requestUrl);
+//		if (eigeneai.getResults() != null && !eigeneai.getResults().isEmpty()) {
+//			return eigeneai.getResults();
+//		}
+//
+//		return new ArrayList<Result>();
+//	}
+//
+//	/**
+//	 * MD추천상품 목록. 매출급상승 카테고리별 상품 목록
+//	 * 사용되는 화면 영역)
+//	 * 		메인 > MD추천상품
+//	 * @param size - 결과에 포함할 상품수
+//	 * @param cateId - 카테고리ID
+//	 * @return
+//	 * @author gagamel
+//	 * @since 2021. 6. 30
+//	 */
+//	public Collection<GagaMap> getMdRecommendGoodsList(int size, String cateId) {
+//		// 1.매출급상승 카테고리 목록
+//		String requestUrl = apiUrl + "/m063?cuid=" + cuid;
+//		Eigeneai eigeneai = this.getEigeneaiInfo(requestUrl);
+//		if (eigeneai.getResults() != null && !eigeneai.getResults().isEmpty()) {
+//			Collection<Result> cateList = eigeneai.getResults();
+//
+//			if (cateList != null && !cateList.isEmpty()) {
+//				for (Result cateInfo : cateList) {
+//					if (StringUtils.isNotBlank(cateInfo.getCategoryId())) {
+//						GagaMap dataMap = new GagaMap();
+//						dataMap.setString("styleNm", cateInfo.getCategoryId());
+//
+//						// 2.카테고리별 상품 목록
+//						requestUrl = apiUrl + "/c001?cuid=" + cuid + "&size=" + size + "&cids=" + cateInfo.getCategoryId();
+//						eigeneai = this.getEigeneaiInfo(requestUrl);
+//						if (eigeneai.getResults() != null && !eigeneai.getResults().isEmpty()) {
+//							dataMap.set("", eigeneai.getResults());
+//						}
+//					}
+//				}
+//			}
+//		}
+//
+//		return new ArrayList<GagaMap>();
+//	}
+
+	/**
+	 * 주간판매베스트추천상품 목록
+	 * 사용되는 화면 영역)
+	 * 		베스트 > 전체 베스트
+	 * @param size - 결과에 포함할 상품수
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 5. 14
+	 */
+	public Collection<Result> getWeeklySellBestGoodsList(int size) {
+		String requestUrl = apiUrl + "/m061?cuid=" + cuid + "&size=" + size;
+
+		Eigeneai eigeneai = this.getEigeneaiInfo(requestUrl);
+		if (eigeneai.getResults() != null && !eigeneai.getResults().isEmpty()) {
+			return eigeneai.getResults();
+		}
+
+		return new ArrayList<Result>();
+	}
+
+	/**
+	 * 브랜드 주간판매베스트추천상품 목록
+	 * 사용되는 화면 영역)
+	 * 		브랜드메인 > 베스트 상품
+	 * @param size - 결과에 포함할 상품수
+	 * @param brandGroupNo - 브랜드그룹번호
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 6. 30
+	 */
+	public Collection<Result> getBrandWeeklySellBestGoodsList(int size, Integer brandGroupNo) {
+		String requestUrl = apiUrl + "/m061?cuid=" + cuid + "&size=" + size + "&bids=" + brandGroupNo;
+
+		Eigeneai eigeneai = this.getEigeneaiInfo(requestUrl);
+		if (eigeneai.getResults() != null && !eigeneai.getResults().isEmpty()) {
+			return eigeneai.getResults();
+		}
+
+		return new ArrayList<Result>();
+	}
+
+	/**
+	 * 아울렛 주간판매베스트추천상품 목록
+	 * 사용되는 화면 영역)
+	 * 		아울렛메인 > 베스트
+	 * @param size - 결과에 포함할 상품수
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 6. 30
+	 */
+	public Collection<Result> getOutletWeeklySellBestGoodsList(int size) {
+		String requestUrl = apiUrl + "/m064?cuid=" + cuid + "&size=" + size;
+
+		Eigeneai eigeneai = this.getEigeneaiInfo(requestUrl);
+		if (eigeneai.getResults() != null && !eigeneai.getResults().isEmpty()) {
+			return eigeneai.getResults();
+		}
+
+		return new ArrayList<Result>();
+	}
+
+	/**
+	 * 브랜드 월간클릭베스트추천상품 목록
+	 * 사용되는 화면 영역)
+	 * 		브랜드메인 > MD Pick
+	 * @param size - 결과에 포함할 상품수
+	 * @param brandGroupNo - 브랜드그룹번호
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 6. 30
+	 */
+	public Collection<Result> getBrandMonthlyClickBestGoodsList(int size, Integer brandGroupNo) {
+		String requestUrl = apiUrl + "/m062?cuid=" + cuid + "&size=" + size + "&bids=" + brandGroupNo;
+
+		Eigeneai eigeneai = this.getEigeneaiInfo(requestUrl);
+		if (eigeneai.getResults() != null && !eigeneai.getResults().isEmpty()) {
+			return eigeneai.getResults();
+		}
+
+		return new ArrayList<Result>();
+	}
+
+	/**
+	 * 아울렛 월간클릭베스트추천상품 목록
+	 * 사용되는 화면 영역)
+	 * 		아울렛메인 > MD Pick
+	 * @param size - 결과에 포함할 상품수
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 6. 30
+	 */
+	public Collection<Result> getOutletMonthlyClickBestGoodsList(int size) {
+		String requestUrl = apiUrl + "/m065?cuid=" + cuid + "&cids=" + "" + "&size=" + size;
+
+		Eigeneai eigeneai = this.getEigeneaiInfo(requestUrl);
+		if (eigeneai.getResults() != null && !eigeneai.getResults().isEmpty()) {
+			return eigeneai.getResults();
+		}
+
+		return new ArrayList<Result>();
+	}
+
+	/**
+	 * 실시간 많이 조회되고 있는 상품 목록
+	 * 사용되는 화면 영역)
+	 * 		퀵메뉴 > 쇼핑백 (담은 상품 없는 경우)
+	 * 		쇼핑백 > 추천상품 (담은 상품 없는 경우)
+	 * 		검색 > 검색 시작화면
+	 * @param size - 결과에 포함할 상품수
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 6. 30
+	 */
+	public Collection<Item> getRealtimeViewGoodsList(int size) {
+		String requestUrl = rtsApiUrl + "/stream?cuid=" + cuid + "&size=" + size + "&type=view";
+
+		Eigeneai eigeneai = this.getEigeneaiInfo(requestUrl);
+		if (eigeneai.getItems() != null && !eigeneai.getItems().isEmpty()) {
+			return eigeneai.getItems();
+		}
+
+		return new ArrayList<Item>();
+	}
+
+	/**
+	 * 실시간 많이 조회되고 있는 베스트 상품 목록
+	 * 사용되는 화면 영역)
+	 * 		베스트 > 베스트상품_실시간 베스트
+	 * @param size - 결과에 포함할 상품수
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 6. 30
+	 */
+	public Collection<Item> getRealtimeViewBestGoodsList(int size) {
+		String requestUrl = rtsApiUrl + "/stats-transition?cuid=" + cuid + "&size=" + size + "&type=view&interval=5&span=10";
+
+		Eigeneai eigeneai = this.getEigeneaiInfo(requestUrl);
+		if (eigeneai.getItems() != null && !eigeneai.getItems().isEmpty()) {
+			return eigeneai.getItems();
+		}
+
+		return new ArrayList<Item>();
+	}
+
+	/**
+	 * 매출급상승 카테고리별 상품 목록
+	 * @param size - 결과에 포함할 상품수
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 5. 14
+	 */
+	public Eigeneai getSalesSoaringGoodsList() {
+		// TODO: 매출급상승 카테고리 5개 조회 후 카테고리별 상품 7개 조회
+		String requestUrl = apiUrl + "/m010?cuid=" + cuid + "&size=5";
+		return this.getEigeneaiInfo(requestUrl);
+	}
+
+	/**
+	 * 고객의 최근검색어별 상품 목록
+	 * 사용되는 화면 영역)
+	 * 		검색 > 검색결과 추천상품
+	 * 		메인 > 당신을 위한 제안 > 검색어 연관상품 추천
+	 * @param size - 결과에 포함할 상품수
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 5. 14
+	 */
+	public Collection<Eigeneai> getCustomerKeywordGoodsList() {
+		Collection<Eigeneai> dataList = new ArrayList<>();
+
+		// 고객별 최근검색어 목록. TODO: 아이겐에서 미개발
+		String requestUrl = apiUrl + "/m010?cuid=" + cuid + "&size=5";
+		Eigeneai eigeneai = this.getEigeneaiInfo(requestUrl);
+
+		Collection<Eigeneai.Result> resultList = eigeneai.getResults();
+		if (resultList == null || resultList.isEmpty()) {
+			return dataList;
+		}
+
+		try {
+			// 고객별 최근검색어 기준 검색어연관상품 목록 조회
+			for (Eigeneai.Result result : resultList) {
+				dataList.add(this.getKeywordGoodsList(10, result.getCategoryId()));
+			}
+		} catch (UnsupportedEncodingException e) {
+			// Do nothing
+		}
+
+		return dataList;
+	}
+
+	/**
+	 * 검색어 연관상품 목록
+	 * 사용되는 화면 영역)
+	 * 		검색 > 검색결과 추천상품
+	 * @param size - 결과에 포함할 상품수
+	 * @param keyword - 키워드
+	 * @exception UnsupportedEncodingException
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 5. 14
+	 */
+	private Eigeneai getKeywordGoodsList(int size, String keyword) throws UnsupportedEncodingException {
+		String requestUrl = apiUrl + "/s003?cuid=" + cuid + "&size=" + size + "&st=" + URLEncoder.encode(keyword, "UTF-8") + "&cps=true&cpt=m004";
+		return this.getEigeneaiInfo(requestUrl);
+	}
+
+	/**
+	 * 연관상품 목록
+	 * 사용되는 화면 영역)
+	 * 		쇼핑백 > 추천상품 (담은 상품이 있는 경우)
+	 * 		상품상세 > 함께 본 상품
+	 * @param goodsCd - 상품코드
+	 * @param size - 결과에 포함할 상품수
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 5. 14
+	 */
+	public Collection<Result> getRelatedGoodsList(String goodsCd, int size) {
+		String requestUrl = apiUrl + "/a037?cuid=" + cuid + "&size=" + size + "&iids=" + goodsCd + "&cps=true&cpt=m001";
+
+		Eigeneai eigeneai = this.getEigeneaiInfo(requestUrl);
+		if (eigeneai.getResults() != null && !eigeneai.getResults().isEmpty()) {
+			return eigeneai.getResults();
+		}
+
+		return new ArrayList<Result>();
+	}
+
+	/**
+	 * 브랜드 연관상품 목록
+	 * 사용되는 화면 영역)
+	 * 		상품상세 > 브랜드연관상품
+	 * @param size - 결과에 포함할 상품수
+	 * @param goodsCd - 상품코드
+	 * @param brandGroupNo - 브랜드그룹번호
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 5. 14
+	 */
+	public Collection<Result> getBrandRelatedGoodsList(int size, String goodsCd, Integer brandGroupNo) {
+		String requestUrl = apiUrl + "/a038?cuid=" + cuid + "&size=" + size + "&iids=" + goodsCd + "&cps=true&cpt=c001&cpcids=" + brandGroupNo;
+
+		Eigeneai eigeneai = this.getEigeneaiInfo(requestUrl);
+		if (eigeneai.getResults() != null && !eigeneai.getResults().isEmpty()) {
+			return eigeneai.getResults();
+		}
+
+		return new ArrayList<Result>();
+	}
+
+	/**
+	 * 동일 카테고리 연관상품 목록
+	 * 사용되는 화면 영역)
+	 * 		상품상세 > 비슷한 상품
+	 * @param size - 결과에 포함할 상품수
+	 * @param goodsCd - 상품코드
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 5. 14
+	 */
+	public Collection<Result> getSameCategoryRelatedGoodsList(int size, String goodsCd) {
+		String requestUrl = apiUrl + "/a039?cuid=" + cuid + "&size=" + size + "&iids=" + goodsCd + "&cps=true&cpt=m002";
+
+		Eigeneai eigeneai = this.getEigeneaiInfo(requestUrl);
+		if (eigeneai.getResults() != null && !eigeneai.getResults().isEmpty()) {
+			return eigeneai.getResults();
+		}
+
+		return new ArrayList<Result>();
+	}
+
+	/**
+	 * 상품의 실시간 조회수
+	 * 사용되는 화면 영역)
+	 * 		상품상세 > 실시간 뷰
+	 * @param goodsCd - 상품코드
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 5. 14
+	 */
+	public int getRealtimeViewCount(String goodsCd) {
+		String requestUrl = rtsApiUrl + "/stat?cuid=" + cuid + "&itemid=" + goodsCd + "&type=view";
+
+		Eigeneai eigeneai = this.getEigeneaiInfo(requestUrl);
+		if (eigeneai.getItem() != null) {
+			return eigeneai.getItem().getCount();
+		}
+
+		return 0;
+	}
+
+	/**
+	 * 아이겐 정보 조회
+	 * @param requestUrl - Reqeust URL
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 5. 14
+	 */
+	private Eigeneai getEigeneaiInfo(String requestUrl) {
+		log.info("requestUrl: {}", requestUrl);
+		URI url = URI.create(requestUrl);
+
+		// GET방식으로 호출
+		ResponseEntity<String> responseEntity = restTemplate.getForEntity(url, String.class);
+		log.info("responseEntity.getStatusCode(): {} ", responseEntity.getStatusCode());
+
+		String responseJson = responseEntity.getBody();
+		log.info("responseEntity.getBody(): {}", responseJson);
+
+		if (!responseEntity.getStatusCode().equals(HttpStatus.OK)) {
+			return null;
+		}
+
+		Gson gson = new Gson();
+		return gson.fromJson(responseJson, Eigeneai.class);
+	}
+
 }

+ 2 - 2
src/main/java/com/style24/front/biz/thirdparty/SearchEngineDiquest.java

@@ -189,7 +189,7 @@ public class SearchEngineDiquest {
 
 			if (jsonObj.get("returnCode").toString().equals("1")) { // 성공
 				result = response.getResponse();
-//				log.info("///[getFilterList] result: {}", result);
+				log.info("///[getFilterList] result: {}", result);
 			}
 		} catch (Exception e) {
 			e.printStackTrace();
@@ -222,7 +222,7 @@ public class SearchEngineDiquest {
 			if (jsonObj.get("returnCode").toString().equals("1")) { // 성공
 				Gson gson = new Gson();
 				result = gson.fromJson(jsonObj.toJSONString(), GoodsListResponse.class);
-//				log.info("///[getGoodsList] result: {}", result);
+				log.info("///[getGoodsList] result: {}", result);
 			}
 		} catch (Exception e) {
 			e.printStackTrace();

+ 15 - 1
src/main/java/com/style24/front/biz/thirdparty/Yes24Login.java

@@ -188,7 +188,8 @@ public class Yes24Login {
 		String snsId = nodeMap.getString("str_MEM_ID");
 		String custNm = nodeMap.getString("str_MEM_NM");
 		String email = nodeMap.getString("str_MEM_EML");
-		String cellphnno = nodeMap.getString("str_ADDR_MOB_NO");
+		String telNo = nodeMap.getString("str_ADDR_TEL_NO");     // YES24 회원정보가 - 필수전화
+		String mobNo = nodeMap.getString("str_ADDR_MOB_NO"); // YES24 회원정보가 - 휴대전화 
 		String birthYmd = nodeMap.getString("str_BIRTH_DM").replaceAll("-","");
 		String sexGb = nodeMap.getString("str_SEX").equals("M")? TscConstants.Gender.MALE.value() : TscConstants.Gender.FEMALE.value();
 		String ci = nodeMap.getString("str_IPIN_CI");
@@ -196,6 +197,8 @@ public class Yes24Login {
 		String homeBaseAddr = nodeMap.getString("str_ADDR_ADDR1");
 		String homeDtlAddr = nodeMap.getString("str_ADDR_ADDR2");
 
+		String cellphnno = getValidationCellphone(telNo,mobNo);
+		
 		resultMap.setString("memNo", memNo);
 		resultMap.setString("snsId", snsId);
 		resultMap.setString("custNm", custNm);
@@ -291,6 +294,17 @@ public class Yes24Login {
 			log.error(e.getMessage());
 		}
 	}
+	
+	private String getValidationCellphone (String telNo, String mobNo) {
+		String result = "";
+		String regExp = "^01(?:0|1|[6-9])[.-]?(\\d{3}|\\d{4})[.-]?(\\d{4})$";
+		if(telNo.matches(regExp)) {
+			return telNo;
+		} else if(mobNo.matches(regExp)) {
+			return mobNo;
+		}
+		return result;
+	}
 
 
 

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

@@ -1181,15 +1181,15 @@ public class TsfDisplayController extends TsfBaseController {
 	}
 
 	/**
-	 * 주간베스트추천상품 목록
+	 * 주간판매베스트추천상품 목록
 	 * @return
 	 * @author gagamel
 	 * @since 2021. 6. 29
 	 */
 	@GetMapping("/weekly/best/list")
 	@ResponseBody
-	public Collection<Result> getWeeklyBestGoodsList() {
-		return eigeneaiApi.getWeeklyBestGoodsList(30, 1100).getResults();
+	public Collection<Result> getWeeklySellBestGoodsList() {
+		return eigeneaiApi.getWeeklySellBestGoodsList(30);
 	}
 
 }

+ 13 - 285
src/main/java/com/style24/front/biz/web/TsfGoodsController.java

@@ -51,7 +51,7 @@ import com.style24.persistence.domain.ReinboundInform;
 import com.style24.persistence.domain.Review;
 import com.style24.persistence.domain.SizeInfo;
 import com.style24.persistence.domain.WishList;
-import com.style24.persistence.domain.eigene.Eigeneai;
+import com.style24.persistence.domain.eigene.Eigeneai.Result;
 
 import lombok.extern.slf4j.Slf4j;
 
@@ -239,45 +239,7 @@ public class TsfGoodsController extends TsfBaseController {
 			// pc 추천 영역
 			if ("P".equals(paramsGoods.getFrontGb())) {
 				// 이상픔과 함께본 상품
-				paramsGoods.setMaxRownum(15);
-				String[] arrGoodsCd = {
-					"B192DO995P",
-					"L191TJ571P",
-					"L191WB304P",
-					"B192DO996P",
-					"L191WB305P",
-					"B192SH720P",
-					"L191WB703P",
-					"10813858",
-					"10813859",
-					"L171JP121P",
-					"10813860",
-					"L171JP721P",
-					"10813862",
-					"L171TJ501P",
-					"10814432",
-					"10813855",
-					"L171TJ561P",
-					"B172SH710P",
-					"B192SH730P"};
-
-				StringBuilder sql = new StringBuilder();
-				if (arrGoodsCd.length > 0) {
-					int idx = 1;
-					for (String goodsCd : arrGoodsCd) {
-						if (!StringUtils.isBlank(goodsCd)) {
-							if (idx > 1) {
-								sql.append("UNION ALL ");
-							}
-							sql.append("SELECT '").append(goodsCd).append("' AS GOODS_CD, ").append(idx++).append(" AS DISP_ORD FROM DUAL\r\n");
-						}
-					}
-					paramsGoods.setGoodsSql(sql.toString());
-				}
-
-				paramsGoods.setArrGoodsCd(arrGoodsCd);
-				mav.addObject("togetherGoodsList", goodsService.getRecommendGoodsList(paramsGoods));
-
+				mav.addObject("togetherGoodsList", eigeneaiApi.getRelatedGoodsList(goods.getGoodsCd(),15));
 			}
 
 		} else {
@@ -346,124 +308,17 @@ public class TsfGoodsController extends TsfBaseController {
 			// pc 추천 영역
 			if ("P".equals(paramsGoods.getFrontGb())) {
 				// 이상픔과 함께본 상품
-				paramsGoods.setMaxRownum(15);
-				String[] arrGoodsCd = {
-					"B192DO995P",
-					"L191TJ571P",
-					"L191WB304P",
-					"B192DO996P",
-					"L191WB305P",
-					"B192SH720P",
-					"L191WB703P",
-					"10813858",
-					"10813859",
-					"L171JP121P",
-					"10813860",
-					"L171JP721P",
-					"10813862",
-					"L171TJ501P",
-					"10814432",
-					"10813855",
-					"L171TJ561P",
-					"B172SH710P",
-					"B192SH730P"};
-
-				StringBuilder sql = new StringBuilder();
-				if (arrGoodsCd.length > 0) {
-					int idx = 1;
-					for (String goodsCd : arrGoodsCd) {
-						if (!StringUtils.isBlank(goodsCd)) {
-							if (idx > 1) {
-								sql.append("UNION ALL ");
-							}
-							sql.append("SELECT '").append(goodsCd).append("' AS GOODS_CD, ").append(idx++).append(" AS DISP_ORD FROM DUAL\r\n");
-						}
-					}
-					paramsGoods.setGoodsSql(sql.toString());
-				}
-
-				paramsGoods.setArrGoodsCd(arrGoodsCd);
-				mav.addObject("togetherGoodsList", goodsService.getRecommendGoodsList(paramsGoods));
+//				log.info("[상품상세  이상픔과 함께본 상품] =={}", eigeneaiApi.getRelatedGoodsList(goods.getGoodsCd(),15));
+				mav.addObject("togetherGoodsList", eigeneaiApi.getRelatedGoodsList(goods.getGoodsCd(),15));
 
 				// 브랜드 추천 상품
-				paramsGoods.setMaxRownum(15);
-				String[] arrBrandGoodsCd = {
-					"L191WB304P",
-					"B192DO996P",
-					"L191WB305P",
-					"B192DO995P",
-					"L191TJ571P",
-					"B192SH720P",
-					"L191WB703P",
-					"10813858",
-					"10813859",
-					"L171JP121P",
-					"10813860",
-					"L171JP721P",
-					"10813862",
-					"L171TJ501P",
-					"10814432",
-					"10813855",
-					"L171TJ561P",
-					"B172SH710P",
-					"B192SH730P"};
-
-				StringBuilder brandSql = new StringBuilder();
-				if (arrGoodsCd.length > 0) {
-					int idx = 1;
-					for (String goodsCd : arrBrandGoodsCd) {
-						if (!StringUtils.isBlank(goodsCd)) {
-							if (idx > 1) {
-								brandSql.append("UNION ALL ");
-							}
-							brandSql.append("SELECT '").append(goodsCd).append("' AS GOODS_CD, ").append(idx++).append(" AS DISP_ORD FROM DUAL\r\n");
-						}
-					}
-					paramsGoods.setGoodsSql(brandSql.toString());
-				}
-
-				paramsGoods.setArrGoodsCd(arrBrandGoodsCd);
-				mav.addObject("recommendGoodsList", goodsService.getRecommendGoodsList(paramsGoods));
+//				log.info("[상품상세  브랜드 추천 상품] =={}", eigeneaiApi.getBrandRelatedGoodsList(15,goods.getGoodsCd(), goods.getBrandGroupNo()));
+				mav.addObject("recommendGoodsList", eigeneaiApi.getBrandRelatedGoodsList(15,goods.getGoodsCd(), goods.getBrandGroupNo()));
 
 				// 비슷한 상품
-				paramsGoods.setMaxRownum(15);
-				String[] arrLikeGoodsCd = {
-					"B192DO995P",
-					"L191TJ571P",
-					"L191WB304P",
-					"L171TJ561P",
-					"B172SH710P",
-					"B192SH730P",
-					"B192DO996P",
-					"L191WB305P",
-					"B192SH720P",
-					"L191WB703P",
-					"10813858",
-					"10813859",
-					"L171JP121P",
-					"10813860",
-					"L171JP721P",
-					"10813862",
-					"L171TJ501P",
-					"10814432",
-					"10813855"};
-
-				StringBuilder likeSql = new StringBuilder();
-				if (arrGoodsCd.length > 0) {
-					int idx = 1;
-					for (String goodsCd : arrLikeGoodsCd) {
-						if (!StringUtils.isBlank(goodsCd)) {
-							if (idx > 1) {
-								likeSql.append("UNION ALL ");
-							}
-							likeSql.append("SELECT '").append(goodsCd).append("' AS GOODS_CD, ").append(idx++).append(" AS DISP_ORD FROM DUAL\r\n");
-						}
-					}
-					paramsGoods.setGoodsSql(likeSql.toString());
-				}
+//				log.info("[상품상세  비슷한 상품] =={}", eigeneaiApi.getSameCategoryRelatedGoodsList(15,goods.getGoodsCd()));
+				mav.addObject("likeGoodsList", eigeneaiApi.getSameCategoryRelatedGoodsList(15,goods.getGoodsCd()));
 
-				paramsGoods.setArrGoodsCd(arrLikeGoodsCd);
-				mav.addObject("likeGoodsList", goodsService.getRecommendGoodsList(paramsGoods));
 			}
 
 			// 상품 공통 베너
@@ -1148,51 +1003,10 @@ public class TsfGoodsController extends TsfBaseController {
 	 */
 	@PostMapping("/detail/together/frame")
 	public ModelAndView goodsTogetherForm(@RequestBody Goods goods) {
-
 		ModelAndView mav = new ModelAndView();
-		// 상품관련 기본값 설정(회원 등급, 앱, PC/모바일 등)
-		setGoods(goods);
-		goods.setMaxRownum(15);
-		String[] arrGoodsCd = {"10813855",
-			"L171TJ561P",
-			"B172SH710P",
-			"B192DO995P",
-			"L191TJ571P",
-			"L191WB304P",
-			"B192DO996P",
-			"L191WB305P",
-			"B192SH720P",
-			"L191WB703P",
-			"10813858",
-			"10813859",
-			"L171JP121P",
-			"10813860",
-			"L171JP721P",
-			"10813862",
-			"L171TJ501P",
-			"10814432",
-			"B192SH730P"};
-
-		StringBuilder sql = new StringBuilder();
-		if (arrGoodsCd.length > 0) {
-			int idx = 1;
-			for (String goodsCd : arrGoodsCd) {
-				if (!StringUtils.isBlank(goodsCd)) {
-					if (idx > 1) {
-						sql.append("UNION ALL ");
-					}
-					sql.append("SELECT '").append(goodsCd).append("' AS GOODS_CD, ").append(idx++).append(" AS DISP_ORD FROM DUAL\r\n");
-				}
-			}
-			goods.setGoodsSql(sql.toString());
-		}
-
-		goods.setArrGoodsCd(arrGoodsCd);
-		mav.addObject("goodsList", goodsService.getRecommendGoodsList(goods));
-		//log.info("goodsTogetherForm = goods{}", goods);
+		mav.addObject("goodsList", eigeneaiApi.getRelatedGoodsList(goods.getGoodsCd(),15));
 		goods.setIthrCd("IN15_03");
 		mav.addObject("params", goods);
-
 		mav.setViewName(super.getDeviceViewName("goods/GoodsOtherForm"));
 		return mav;
 	}
@@ -1206,53 +1020,10 @@ public class TsfGoodsController extends TsfBaseController {
 	 */
 	@PostMapping("/detail/recommend/frame")
 	public ModelAndView goodsRecommendForm(@RequestBody Goods goods) {
-
 		ModelAndView mav = new ModelAndView();
-		// 상품관련 기본값 설정(회원 등급, 앱, PC/모바일 등)
-		setGoods(goods);
-		goods.setMaxRownum(15);
-
-		String[] arrGoodsCd = {"10813855",
-			"L171TJ561P",
-			"B172SH710P",
-			"B192DO995P",
-			"L191TJ571P",
-			"L191WB304P",
-			"B192DO996P",
-			"L191WB305P",
-			"B192SH720P",
-			"L191WB703P",
-			"10813858",
-			"10813859",
-			"L171JP121P",
-			"10813860",
-			"L171JP721P",
-			"10813862",
-			"L171TJ501P",
-			"10814432",
-			"B192SH730P"};
-
-		StringBuilder sql = new StringBuilder();
-		if (arrGoodsCd.length > 0) {
-			int idx = 1;
-			for (String goodsCd : arrGoodsCd) {
-				if (!StringUtils.isBlank(goodsCd)) {
-					if (idx > 1) {
-						sql.append("UNION ALL ");
-					}
-					sql.append("SELECT '").append(goodsCd).append("' AS GOODS_CD, ").append(idx++).append(" AS DISP_ORD FROM DUAL\r\n");
-				}
-			}
-			goods.setGoodsSql(sql.toString());
-		}
-
-		goods.setArrGoodsCd(arrGoodsCd);
-
-		mav.addObject("goodsList", goodsService.getRecommendGoodsList(goods));
-		//log.info("goodsRecommendForm = goods{}", goods);
+		mav.addObject("goodsList", eigeneaiApi.getBrandRelatedGoodsList(15,goods.getGoodsCd(), goods.getBrandGroupNo()));
 		goods.setIthrCd("IN15_04");
 		mav.addObject("params", goods);
-
 		mav.setViewName(super.getDeviceViewName("goods/GoodsOtherForm"));
 		return mav;
 	}
@@ -1266,53 +1037,10 @@ public class TsfGoodsController extends TsfBaseController {
 	 */
 	@PostMapping("/detail/like/frame")
 	public ModelAndView goodsLikeForm(@RequestBody Goods goods) {
-
 		ModelAndView mav = new ModelAndView();
-		// 상품관련 기본값 설정(회원 등급, 앱, PC/모바일 등)
-		setGoods(goods);
-		goods.setMaxRownum(15);
-
-		String[] arrGoodsCd = {"10813855",
-			"L171TJ561P",
-			"B172SH710P",
-			"B192DO995P",
-			"L191TJ571P",
-			"L191WB304P",
-			"B192DO996P",
-			"L191WB305P",
-			"B192SH720P",
-			"L191WB703P",
-			"10813858",
-			"10813859",
-			"L171JP121P",
-			"10813860",
-			"L171JP721P",
-			"10813862",
-			"L171TJ501P",
-			"10814432",
-			"B192SH730P"};
-
-		StringBuilder sql = new StringBuilder();
-		if (arrGoodsCd.length > 0) {
-			int idx = 1;
-			for (String goodsCd : arrGoodsCd) {
-				if (!StringUtils.isBlank(goodsCd)) {
-					if (idx > 1) {
-						sql.append("UNION ALL ");
-					}
-					sql.append("SELECT '").append(goodsCd).append("' AS GOODS_CD, ").append(idx++).append(" AS DISP_ORD FROM DUAL\r\n");
-				}
-			}
-			goods.setGoodsSql(sql.toString());
-		}
-
-		goods.setArrGoodsCd(arrGoodsCd);
-
-		mav.addObject("goodsList", goodsService.getRecommendGoodsList(goods));
-		//log.info("goodsLikeForm = goods{}", goods);
+		mav.addObject("goodsList", eigeneaiApi.getSameCategoryRelatedGoodsList(15,goods.getGoodsCd()));
 		goods.setIthrCd("IN15_05");
 		mav.addObject("params", goods);
-
 		mav.setViewName(super.getDeviceViewName("goods/GoodsOtherForm"));
 		return mav;
 	}
@@ -1801,8 +1529,8 @@ public class TsfGoodsController extends TsfBaseController {
 	 */
 	@GetMapping("/same/category/goods/list/{goodsCd}")
 	@ResponseBody
-	public Eigeneai getSameCategoryGoodsList(@PathVariable String goodsCd) {
-		return eigeneaiApi.getSameCategoryRelatedGoodsList(goodsCd, 10);
+	public Collection<Result> getSameCategoryGoodsList(@PathVariable String goodsCd) {
+		return eigeneaiApi.getSameCategoryRelatedGoodsList(10, goodsCd);
 	}
 
 }

+ 25 - 4
src/main/java/com/style24/front/biz/web/TsfMypageController.java

@@ -21,10 +21,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.gagaframework.web.util.GagaCookieUtil;
 import com.style24.core.biz.service.TscCouponService;
 import com.style24.core.biz.service.TscCustomerService;
 import com.style24.core.biz.service.TscEnvsetService;
@@ -74,6 +70,11 @@ 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;
+import com.gagaframework.web.util.GagaCookieUtil;
+
 /**
  * 마이페이지 Controller
  * 
@@ -2659,4 +2660,24 @@ public class TsfMypageController extends TsfBaseController {
 		
 		return super.ok(env.getProperty("SUCC_0005"));
 	}
+	
+	
+	/**
+	 * 위시리스트 상품여부 
+	 * 
+	 * @return
+	 * @author eskim
+	 * @since 2021. 6. 30
+	 */
+	@GetMapping("/wish/list/check/{goodsCd}")
+	@ResponseBody
+	public String getAjaxWishListCheck(@PathVariable(value = "goodsCd") String goodsCd) {
+		String result = "N";
+		if (wishListService.getWishListGoodsCount(goodsCd) > 0) {
+			result = "Y";
+		}
+		return result;
+	}
+	
+	
 }

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

@@ -734,8 +734,9 @@ public class TsfPlanningController extends TsfBaseController {
 				        cal.setTime(new Date());
 				        DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
 				        int usableDay = tPlan.getPntUsableDay();
-				       cal.add(Calendar.DATE, +usableDay);
+				        cal.add(Calendar.DATE, +usableDay);
 				        point.setExpBeDt(df.format(cal.getTime()));
+				        point.setSignGb("+");
 						corePointService.saveCustomerPoint(point);
 						String msg =  "축하합니다. " + toNumFormat(pointAmt) + " 포인트가 지급 되었습니다!";
 						result.set("msg", msg);
@@ -773,8 +774,9 @@ public class TsfPlanningController extends TsfBaseController {
 				        cal.setTime(new Date());
 				        DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
 				        int usableDay = tPlan.getPntUsableDay();
-				       cal.add(Calendar.DATE, +usableDay);
+				        cal.add(Calendar.DATE, +usableDay);
 				        point.setExpBeDt(df.format(cal.getTime()));
+				        point.setSignGb("+");
 						corePointService.saveCustomerPoint(point);
 						
 						CustCoupon coupon = new CustCoupon();
@@ -790,6 +792,7 @@ public class TsfPlanningController extends TsfBaseController {
 						coreCouponService.saveCouponIssue(coupon);
 						String msg =  "축하합니다. " + toNumFormat(pointAmt) + " 포인트와 " + toNumFormat(coupon.getDcVal()) +coupon.getDcWay() + " 할인쿠폰이 지급 되었습니다!";
 						result.set("msg", msg);
+						break;
 					}
 
 				}else {

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

@@ -93,7 +93,7 @@ public class Social extends TscBaseDomain{
 		// Pagination
 		private TscPageRequest pageable;
 		private int pageNo = 1;
-		private int pageSize = 10;
+		private int pageSize = 50;
 		private int pageUnit = 10;
 		
 }

+ 21 - 2
src/main/java/com/style24/persistence/domain/eigene/Eigeneai.java

@@ -16,8 +16,10 @@ import lombok.Data;
 public class Eigeneai implements Serializable {
 
 	private String recType;					// 추천영역코드
-	private Collection<Product> products;	// 인풋상품정보
-	private Collection<Result> results;		// 결과상품정보
+	private Collection<Product> products;	// 인풋상품정보 목록
+	private Collection<Result> results;		// 결과상품정보 목록
+	private Collection<Item> items;			// 실시간상품정보 목록
+	private Item item;						// 실시간상품정보
 
 	// 인풋상품정보
 	@Data
@@ -31,6 +33,8 @@ public class Eigeneai implements Serializable {
 		private String category3;		// 3레벨카테고리
 		private double originalPrice;	// 정상가
 		private double salePrice;		// 판매가
+		private String brandId;			// 브랜드ID(브랜드그룹번호)
+		private String brandName;		// 브랜드명
 	}
 
 	// 결과상품정보
@@ -43,4 +47,19 @@ public class Eigeneai implements Serializable {
 		private Product product;	// 상품정보
 	}
 
+	// 실시간 상품정보
+	@Data
+	public class Item {
+		private int count;				// view건수
+		private String itemId;			// 상품코드
+		private String imageUrl;		// 상품이미지URL
+		private String itemName;		// 상품명
+		private String itemUrl;			// 상품상세페이지URL
+		private String categoryId;		// 카테고리ID
+		private double originalPrice;	// 정상가
+		private double salePrice;		// 판매가
+		private String brandId;			// 브랜드ID(브랜드그룹번호)
+		private String brandName;		// 브랜드명
+	}
+
 }

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

@@ -289,8 +289,8 @@
 	</insert>
 
 	<!--활동, 휴면 회원만 조회-->
-	<select id="getCusomterActiveAndDormant" parameterType="Customer" resultType="Customer">
-		/* TsfCustomer.getCusomterActiveAndDormant */
+	<select id="getCustomerActiveAndDormant" parameterType="Customer" resultType="Customer">
+		/* TsfCustomer.getCustomerActiveAndDormant */
 		SELECT C.CUST_NO
 		     , C.CUST_ID
 		     , C.EMAIL

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

@@ -1221,8 +1221,8 @@
 		                  , A.MAIN_PIMG AS IMG_PATH1
 		                  , CONCAT('/planning/detail/form?planSq=',A.PLAN_SQ) AS STR_VAR1
 		                  , A.PLAN_NM AS STR_TITLE1
-		                  , A.DTL_TITLE1 AS STR_TITLE2
-		                  , '' AS SUB_TEXT1
+		                  , '' AS STR_TITLE2
+		                  , A.DTL_TITLE1 AS SUB_TEXT1
 		                  , '' AS SUB_TEXT2
 		            FROM  TB_PLAN A
 		            INNER JOIN TB_PLAN_CATE B ON A.PLAN_SQ = B.PLAN_SQ

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

@@ -845,8 +845,7 @@
 		WITH  TAB_MASTER_GOODS AS (
 		SELECT  Z.*
 		FROM (
-		    SELECT @rownum := @rownum + 1 AS RNUM
-		         , B.GOODS_CD
+		    SELECT B.GOODS_CD
 		         , G.GOODS_NM
 		         , G.GOODS_GB
 		         , G.FOREIGN_BUY_YN
@@ -861,7 +860,6 @@
 		         , G.CURR_PRICE
 		         , GS.STOCK_QTY
 		    FROM TB_TMTB A
-		    JOIN ( SELECT @rownum := 0) R
 		    INNER JOIN TB_TMTB_APPLY_GOODS B ON A.TMTB_SQ  = B.TMTB_SQ
 		                                     AND B.DEL_YN = 'N'
 		                                     AND B.GOODS_GB IN ( 'G800_10', 'G800_20')  -- 기본과 적용상품
@@ -899,8 +897,8 @@
 		    AND A.TMTB_SQ = #{tmtbSq}
 		    </otherwise>
 		    </choose>
+		    LIMIT #{maxRownum}
 		    ) Z
-		WHERE RNUM <![CDATA[<= ]]>#{maxRownum}
 		)
 		, TAB_GOODS AS (
 		    SELECT G.GOODS_CD
@@ -1482,7 +1480,7 @@
 		                <when test="contentsLoc == 'SMM009' or contentsLoc == 'SMM007' or contentsLoc == 'SMM012' or contentsLoc == 'SMM003' or contentsLoc == 'SBM007' or contentsLoc == 'SBM008' or contentsLoc == 'SBM009' or contentsLoc == 'SBM017' or contentsLoc == 'SBM018' or contentsLoc == 'SBM019' or contentsLoc == 'SOM003' or contentsLoc == 'SCM002' or contentsLoc == 'SCM003'"> <!-- md추천 -->
 		                    FROM	TB_CONTENTS CT
 		                    , TB_CONTENTS_GOODS CTG
-		                    , TB_GOODS G USE INDEX (`PRIMARY`, IX_GOODS_11)
+		                    , TB_GOODS G 
 		                    , TB_GOODS_STOCK S
 		                    , TB_BRAND B
 		                    , TB_BRAND_GROUP BG
@@ -1842,10 +1840,10 @@
 		         , G.GOODS_TNM          /*상품타이틀명*/
 		         , G.MAIN_COLOR_CD      /*대표색상코드*/
 		         , G.LIST_PRICE         /*정상가(최초판매가)*/
-		         , G.CURR_PRICE         /*현재판매가*/
+		, G.CURR_PRICE         /*현재판매가*/
 		         , G.REG_DT             /*등록일시*/
 		    FROM   (
-		            SELECT CASE WHEN BG.DISP_NM_LANG = 'EN' THEN
+		            SELECT DISTINCT CASE WHEN BG.DISP_NM_LANG = 'EN' THEN
 		                            BG.BRAND_GROUP_ENM
 		                        ELSE
 		                            BG.BRAND_GROUP_KNM
@@ -1864,7 +1862,7 @@
 		                 , G.REG_DT                                                 /*등록일시*/
 		            FROM   TB_CATE_4SRCH C4
 		                 , TB_CATE_GOODS CG
-		                 , TB_GOODS G USE INDEX (IX_GOODS_12)
+		                 , TB_GOODS G
 		                 , TB_GOODS_STOCK GS
 		                 , TB_BRAND B
 		                 , TB_BRAND_GROUP BG

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

@@ -108,7 +108,7 @@
 		                 WHERE Z.SHIP_COMP_CD = OD.SHIP_COMP_CD)                        AS SHIP_COMP_NM
 		             , OD.INVOICE_NO
 		             , OD.SUPPLY_COMP_CD
-		             , OD.DELV_FEE_CD
+		             , IF(G.SELF_GOODS_YN = 'Y', 'WMS', OD.DELV_FEE_CD)                 AS DELV_FEE_CD
 		             , OD.SHOT_DELV_YN
 		             , OD.CHANGEABLE_YN
 		             , OD.RETURNABLE_YN

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

@@ -146,15 +146,22 @@
 			</otherwise>
 		</choose>
 		<if test="delvFeeCd != null and delvFeeCd != ''">
+			<choose>
+				<when test="delvFeeCd == 'WMS'">
+		           AND G.SELF_GOODS_YN = 'Y'
+				</when>
+				<otherwise>
 		           AND OD.DELV_FEE_CD = #{delvFeeCd}
+				</otherwise>
+			</choose>
 		</if>
 		           AND O.DISP_YN = 'Y'
 		           AND OD.ORD_QTY - OD.CNCL_RTN_QTY > 0
 		       ) Z
 		 GROUP BY Z.ORD_NO, Z.ORD_DT, Z.ORD_NM, Z.ORD_PHNNO, Z.GIFT_ADDR_INP_YN, Z.ORD_DTL_NO, Z.ORD_EXCH_GB
 		        , Z.GOODS_CD, Z.GOODS_NM, Z.LIST_PRICE, Z.SYS_IMG_NM, Z.ORD_DTL_STAT, Z.ORD_QTY, Z.CNCL_RTN_QTY, Z.ORD_AMT, Z.REAL_ORD_AMT
-		        , Z.SAVE_PNT_AMT, Z.CNCL_RTN_AMT, Z.PNT_DC_AMT, Z.GFCD_USE_AMT, Z.SHIP_COMP_CD, Z.GIFT_PACK_YN, Z.SHIP_COMP_NM, Z.INVOICE_NO
-		        , Z.SUPPLY_COMP_CD, Z.DELV_FEE_CD, Z.SHOT_DELV_YN, Z.CHANGEABLE_YN, Z.SELF_GOODS_YN, Z.BRAND_NM
+		        , Z.SAVE_PNT_AMT, Z.CNCL_RTN_AMT, Z.PNT_DC_AMT, Z.GFCD_USE_AMT, Z.SHIP_COMP_CD, Z.GIFT_PACK_YN , Z.SHIP_COMP_NM
+		        , Z.INVOICE_NO, Z.SUPPLY_COMP_CD, Z.DELV_FEE_CD, Z.SHOT_DELV_YN, Z.CHANGEABLE_YN, Z.SELF_GOODS_YN, Z.BRAND_NM
 		        , Z.ORD_REQ_CHG_QTY, Z.ORD_CAN_CHG_QTY, Z.BANK_CD, Z.ACCOUNT_NO, Z.ACCOUNT_NM
 		 ORDER BY Z.ORD_NO DESC, Z.ORD_DTL_STAT, Z.SELF_GOODS_YN DESC, Z.SHOT_DELV_YN DESC, Z.SUPPLY_COMP_CD, Z.DELV_FEE_CD
 	</select>
@@ -303,7 +310,14 @@
 		           AND O.ORD_NO = #{ordNo}
 		</if>
 		<if test="delvFeeCd != null and delvFeeCd != ''">
+			<choose>
+				<when test="delvFeeCd == 'WMS'">
+		           AND G.SELF_GOODS_YN = 'Y'
+				</when>
+				<otherwise>
 		           AND OD.DELV_FEE_CD = #{delvFeeCd}
+				</otherwise>
+			</choose>
 		</if>
 		<choose>
 			<when test="chgGb == 'G680_30'">
@@ -456,6 +470,8 @@
 		     , Z.ADD_PAY_COST
 		     , Z.SYS_IMG_NM
 		     , Z.GIFT_PACK_YN
+		     , Z.GIFT_ADDR_INP_YN
+		     , Z.GIFT_CANCEL_DAY
 		     , Z.REFUND_AMT
 		  FROM (SELECT OC.ORD_CHG_SQ
 		             , OC.CHG_GB
@@ -486,6 +502,8 @@
 		             , CASE WHEN G1.GOODS_TYPE != 'G056_S' AND G1.SELF_GOODS_YN = 'Y' THEN (SELECT MAX(SYS_IMG_NM) FROM TB_GOODS_IMG WHERE GOODS_CD = G1.GOODS_CD AND COLOR_CD = ODI.OPT_CD1 AND DEFAULT_IMG_YN = 'Y')
 		                    ELSE (SELECT MAX(SYS_IMG_NM) FROM TB_GOODS_IMG WHERE GOODS_CD = G1.GOODS_CD AND COLOR_CD = IFNULL(G1.MAIN_COLOR_CD,'XX') AND DEFAULT_IMG_YN = 'Y') END AS SYS_IMG_NM
 		             , OD.GIFT_PACK_YN
+		             , OD.GIFT_ADDR_INP_YN
+		             , TIMESTAMPDIFF(DAY, O.ORD_DT, OCDH.REG_DT)                        AS GIFT_CANCEL_DAY
 		             , R.REFUND_AMT
 		          FROM TB_ORDER_CHANGE OC
 		         INNER JOIN TB_ORDER_CHANGE_DETAIL OCD
@@ -598,7 +616,7 @@
 		</if>
 		  ) Z
 		 GROUP BY Z.ORD_CHG_SQ, Z.CHG_GB, Z.CHG_QTY, Z.ORD_DT, Z.CHG_DATE, Z.CHG_TIME, Z.CHG_ORD_DTL_NO, Z.CHG_STAT, Z.CHG_STAT_NM, Z.ORD_NO, Z.ORD_DTL_NO, Z.GOODS_CD, Z.BRAND_NM
-		        , Z.SHOT_DELV_YN, Z.SELF_GOODS_YN, Z.GOODS_NM, Z.GOODS_TYPE, Z.LIST_PRICE, Z.ADD_PAY_COST, Z.SYS_IMG_NM, Z.GIFT_PACK_YN, Z.REFUND_AMT
+		        , Z.SHOT_DELV_YN, Z.SELF_GOODS_YN, Z.GOODS_NM, Z.GOODS_TYPE, Z.LIST_PRICE, Z.ADD_PAY_COST, Z.SYS_IMG_NM, Z.GIFT_PACK_YN, Z.GIFT_ADDR_INP_YN, Z.GIFT_CANCEL_DAY, Z.REFUND_AMT
 		 ORDER BY Z.ORD_CHG_SQ DESC
 	</select>
 

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

@@ -834,7 +834,7 @@
 		<if test="cpnId != null and cpnId != ''">
 		AND C.CPN_ID  = #{cpnId}
 		</if>
-		AND C.CPN_TYPE IN ('G230_11','G230_30')
+		AND C.CPN_TYPE IN ('G230_11','G230_30','G230_20')
 		AND NOW() BETWEEN C.DOWN_STDT AND C.DOWN_EDDT
 		AND NOW()  <![CDATA[<=]]>  IF (C.PD_GB = 'D', CONCAT(CURRENT_DATE + INTERVAL C.AVAIL_DAYS DAY, ' 23:59:59'), C.AVAIL_EDDT)
 		AND (CASE WHEN 'P' = #{frontGb} THEN C.DC_PVAL

+ 4 - 11
src/main/java/com/style24/persistence/mybatis/shop/TsfReview.xml

@@ -566,8 +566,10 @@
 		               END                                                             AS BRAND_NM
 		             , B.BRAND_ENM
 				     , FN_GET_CODE_NM('G013', OD.ORD_DTL_STAT)							AS ORD_DTL_STAT_NM
-					 , IFNULL(OCD.ORD_REQ_CHG_QTY, 0) AS ORD_REQ_CHG_QTY
-					 , OD.ORD_QTY - OD.CNCL_RTN_QTY - IFNULL(OCD.ORD_REQ_CHG_QTY, 0)    AS ORD_CAN_CHG_QTY
+					 -- , IFNULL(OCD.ORD_REQ_CHG_QTY, 0) AS ORD_REQ_CHG_QTY
+					 -- , OD.ORD_QTY - OD.CNCL_RTN_QTY - IFNULL(OCD.ORD_REQ_CHG_QTY, 0)    AS ORD_CAN_CHG_QTY
+					 , IFNULL((SELECT SUM(OCD.CHG_QTY) FROM TB_ORDER_CHANGE_DETAIL OCD WHERE OCD.ORD_DTL_NO = OD.ORD_DTL_NO GROUP BY OCD.ORD_DTL_NO), 0) AS ORD_REQ_CHG_QTY
+		             , OD.ORD_QTY - OD.CNCL_RTN_QTY - IFNULL((SELECT SUM(OCD.CHG_QTY) FROM TB_ORDER_CHANGE_DETAIL OCD WHERE OCD.ORD_DTL_NO = OD.ORD_DTL_NO GROUP BY OCD.ORD_DTL_NO), 0) AS ORD_CAN_CHG_QTY
 					 , I.ITEMKIND_NM 
 		   	         , I.ITEMKIND_CD 
 			         , I.SIZE_GB 
@@ -624,15 +626,6 @@
 			                                      AND R.ORD_DTL_NO = OD.ORD_DTL_NO
 			                                      AND R.DEL_YN = 'N'
 			      </if>
-				  LEFT OUTER JOIN (SELECT OD.ORD_DTL_NO
-										, SUM(OCD.CHG_QTY) AS ORD_REQ_CHG_QTY
-									 FROM TB_ORDER_CHANGE_DETAIL OCD
-									INNER JOIN TB_ORDER_DETAIL OD
-									   ON OCD.ORD_DTL_NO = OD.ORD_DTL_NO
-									WHERE OCD.DEL_YN = 'N'
-									GROUP BY OCD.ORD_DTL_NO
-								  ) OCD
-				    ON OD.ORD_DTL_NO = OCD.ORD_DTL_NO
 				LEFT OUTER JOIN TB_COLOR C ON ODI.OPT_CD1 = C.COLOR_CD
 		                                   AND C.USE_YN = 'Y'
 				  WHERE 1=1

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

@@ -296,4 +296,14 @@
 		    )Z
 		    ORDER BY FIELD(Z.STOCK_QTY_SUM, 1, 2 ,3 ,4 ,5) DESC ,Z.REG_DT DESC
 	</select>
+	
+	<!-- 위시리스트 상품여부용-->
+	<select id="getWishListGoodsCount" parameterType="WishList" resultType="int">
+		/* TsfWishlist.getWishListGoodsCount*/
+		SELECT COUNT(*)
+		FROM TB_WISHLIST
+		WHERE CUST_NO = #{custNo}
+		AND GOODS_CD = #{goodsCd}
+	</select>
+	
 </mapper>

BIN
src/main/webapp/WEB-INF/lib/Istyle.jar


+ 8 - 3
src/main/webapp/WEB-INF/views/mob/app/NoticeFormMob.html

@@ -41,11 +41,16 @@
 	});
 
 	var pushListInfo = function (pushList) {
+		let orgPushList;
+		//IOS는 앱에서 BASE64로 인코딩 한후 전달 한다.
 		if (_osType === 'I') {
-			alert(pushList);
+  			orgPushList = window.atob(pushList);
+		} else if (_osType === 'A') {
+			orgPushList = pushList;
 		}
-		if (!gagajf.isNull(pushList)) {
-			let pushListJosn = JSON.parse(pushList);
+
+		if (!gagajf.isNull(orgPushList)) {
+			let pushListJosn = JSON.parse(orgPushList);
 			let html = '';
 			$.each(pushListJosn.pushList, function(idx, item) {
 				html += '<div class="inner">\n';

+ 1 - 1
src/main/webapp/WEB-INF/views/mob/callcenter/FaqFormMob.html

@@ -134,7 +134,7 @@
 				tag += '	</div>\n';
 				tag += '	<div class="fold_cont">\n';
 				tag += '		<div class="fold_answer">\n';
-				tag += '			<div class="answer_body">' + item.answer + '</div>\n';
+				tag += '			<div class="answer_body">' + item.answer.escapeHtml().replace(/\n/g,'<br/>') + '</div>\n';
 				tag += '		</div>\n';
 				tag += '	</div>\n';
 				tag += '</li>\n';

+ 5 - 3
src/main/webapp/WEB-INF/views/mob/common/fragments/FooterMob.html

@@ -202,14 +202,16 @@
 		$("#hstrFull").removeClass('on');
 		return false;
 	}
-	
+
+	// 210521_ 수정 : 현재 선택된 on만 오픈.
 	$(document).on('click','.hasCate a',function(e){
-		$(this).next('.depthCate').slideToggle(300);
 		$(this).toggleClass('on');
+		$(this).next('.depthCate').slideToggle(300);
+		$(this).parents('li').siblings('li').find('a').removeClass('on');
+		$(this).parents('li').siblings('li').find('.depthCate').slideUp(300);
 		return false;
 	});
 	
-	
 	// 퀵메뉴카테고리
 	let fnGetQuickMenuCategory = function(cate1) {
 		let tag = '';

+ 46 - 17
src/main/webapp/WEB-INF/views/mob/display/BrandMainFormMob.html

@@ -142,9 +142,9 @@
 											</a>
 										</div>
 									</th:block>
-									<!-- Add Pagination -->
-									<div class="swiper-pagination"></div>
 								</div>
+								<!-- Add Pagination -->
+								<div class="swiper-pagination"></div>
 							</div>
 						</div>
 					</div>
@@ -214,7 +214,7 @@
 															<th:block th:if="${LookbookData.lookbookGoodsList != null and !LookbookData.lookbookGoodsList.empty}" th:each="lookbookGoods, status : ${LookbookData.lookbookGoodsList}">
 																<div class="item_picker" th:style="${'left:'+lookbookGoods.xlim+'%; top:'+lookbookGoods.ylim+'%;'}">
 																	<div>
-																		<button type="button" th:onclick="fnGoodsPopup([[${lookbookGoods.sysImgNm}]],[[${lookbookGoods.brandGroupNm}]],[[${lookbookGoods.goodsFullNm}]],[[${lookbookGoods.listPrice}]],[[${lookbookGoods.currPrice}]],[[${lookbookGoods.dcRate}]],[[${lookbookGoods.goodsCd}]])"><span class="ico ico_picker"></span></button>
+																		<button type="button" th:onclick="fnGoodsPopup([[${lookbookGoods.sysImgNm}]],[[${lookbookGoods.brandGroupNm}]],[[${lookbookGoods.goodsFullNm}]],[[${lookbookGoods.listPrice}]],[[${lookbookGoods.currPrice}]],[[${lookbookGoods.dcRate}]],[[${lookbookGoods.goodsCd}]],[[${lookbookGoods.stockQty}]],[[${lookbookGoods.soldoutYn}]])"><span class="ico ico_picker"></span></button>
 																		<div class="pick_descr">
 																			<a href="javascript:void(0);"></a>
 																		</div>
@@ -431,7 +431,7 @@
 	var goodsImgUrl = [[${@environment.getProperty('upload.goods.view')}]];
 
 	// 픽커모달
-	var fnGoodsPopup = function(obj1,obj2,obj3,obj4,obj5,obj6,obj7){
+	var fnGoodsPopup = function(obj1,obj2,obj3,obj4,obj5,obj6,obj7,obj8,obj9){
 		$("#reco_pop .modal-dialog").remove();
 		var tag = '';
 
@@ -443,7 +443,11 @@
 		tag += '		<div class="modal-body">\n';
 		tag += '			<div class="itemsGrp rowtype">\n';
 		tag += '				<div class="item_prod">\n';
-		tag += '					<div class="item_state">\n';
+		tag += '					<div class="item_state';
+		if(obj8 < 1 || obj9 == 'Y'){
+			tag += ' soldout';
+		}
+		tag += '">\n';
 		tag += '						<a href="javascript:void(0);" class="itemLink" onclick="cfnGoToGoodsDetail(\''+obj7+'\',\'\',\'\')">\n';
 		tag += '							<div class="itemPic">\n';
 		tag += '								<img class="vLHTC pd_img" src="'+goodsImgUrl+'/'+obj1+'?RS=260" alt="" onerror="noneImg(this)">\n';
@@ -504,12 +508,15 @@
 		});
 	});
 
+	//210624_ 추가 : 슬라이드 속성 추가.
 	// 서브비주얼 슬라이드
 	var myArray = ["01", "02", "03"];
 	var submainVisualSwiper = new Swiper('.swiper-container.submain_visual', {
 		//210414_자동롤링 추가
+		speed: 1000,
 		autoplay : {
 			delay : 3000,   // 시간 설정
+			disableOnInteraction: false,
 		},
 		pagination: {
 			el: '.swiper-pagination',
@@ -520,20 +527,36 @@
 		}
 	});
 
-	//  이미지배너 슬라이드
-	var imgBannerSwiper = new Swiper('.swiper-container.br_second_slide', {
-		//210414_자동롤링 추가
-		autoplay : {
-			delay : 3000,   // 시간 설정
-		},
-		pagination: {
-			el: '.swiper-pagination',
-		},
-	});
+	// post-bnnWide (210602_ 교체)
+	// 와이드배너 슬라이드 카운팅
+	var pickbnnWdCont = $('.post-bnnWide .swiper-slide');
+	var pickbnnWdLength = pickbnnWdCont.length;
+	if (pickbnnWdLength < 2) {
+		var post_bnnWide = new Swiper ('.swiper-container.post-bnnWide', {
+			speed: 1000,
+			loop: false,
+			autoplay: false,
+			pagination: false,
+		});
+	} else {
+		var post_bnnWide = new Swiper ('.swiper-container.post-bnnWide', {
+			loop: true,
+			slidesPerView: 1,
+			speed: 1000,
+			autoplay: {
+				delay: 4000,
+				disableOnInteraction: false,
+			},
+			pagination: {
+				el: '.swiper-pagination',
+			},
+		});
+	}
 
 	// 뉴아이템 슬라이드
 	var newItemSwiper = new Swiper('.new_item .area_slider .swiper-container', {
 		slidesPerView: 1,
+		speed: 1000,
 		pagination: {
 			el: '.swiper-pagination',
 		},
@@ -541,19 +564,22 @@
 
 	// 베스트아이템 슬라이드
 	var bestItemSwiper = new Swiper('.best_item .area_slider .swiper-container', {
-		slidesPerView: 2,
+		slidesPerView: 2.22,
+		speed: 1000,
 		spaceBetween: 8,
 	});
 
 	// 엠디픽 슬라이드
 	var mdItemSwiper = new Swiper('.md_item .area_slider .swiper-container', {
-		slidesPerView: 2,
+		slidesPerView: 2.22,
+		speed: 1000,
 		spaceBetween: 8,
 	});
 
 	// 스페셜샵 슬라이드
 	var specialShopSwiper = new Swiper('.special_shop .area_slider .swiper-container', {
 		slidesPerView: 1,
+		speed: 1000,
 		spaceBetween: 10,
 	});
 
@@ -561,6 +587,7 @@
 	var rcmdPicimgSwiper = new Swiper('.recommendedArea .area_slider .swiper-container', {
 		slidesPerView: 1,
 		spaceBetween: 0,
+		speed: 1000,
 		pagination: {
 			el: '.swiper-pagination',
 			type: 'fraction',
@@ -569,8 +596,10 @@
 
 	// 유튜브 슬라이드
 	var swiperYoutu = new Swiper('.swiper-container.br_youtube_slide', {
+		speed: 1000,
 		pagination: {
 			el: '.swiper-pagination',
+			clickable:true,
 		},
 	});
 

+ 1 - 1
src/main/webapp/WEB-INF/views/mob/display/LookbookDetailFormMob.html

@@ -209,7 +209,7 @@
 		tag +='			<div class="itemsGrp rowtype">\n';
 		tag +='				<div class="item_prod">\n';
 		tag +='					<div class="item_state';
-		if(obj9 == 'Y'){
+		if(obj8 < 1 || obj9 == 'Y'){
 			tag += ' soldout';
 		}
 		tag +='">\n';

+ 31 - 27
src/main/webapp/WEB-INF/views/mob/display/MallMainFormMob.html

@@ -58,7 +58,7 @@
 
 					<th:block th:if="${contentsLoc=='002'}">
 						<!-- 2. 스타일리포트 -->
-						<div class="inner bg_gray">
+						<div class="inner bg_gray" th:if="${mainData.ContentsList != null and !mainData.ContentsList.empty}">
 							<div class="main_stylereport">
 								<th:block th:if="${mainData.contentsTitle != null and !mainData.contentsTitle.empty}">
 									<div class="titWrap">
@@ -795,6 +795,8 @@
 		}
 		// 컨텐츠 호출
 		$(document).ready(function() {
+			post_visual.slideTo(2, 0, false); // 접속 시, 슬라이드페이지 이동
+
 			// 몰메인 띠배너 표출
 			$("#divTopbanner").show();
 
@@ -862,10 +864,12 @@
 				$("#pickBtn"+(idx+1)).click();
 			}
 		}
+
 		/*]]>*/
 	</script>
 
 	<script type="text/javascript">
+		//210624_ 추가 : 슬라이드 속성 추가.
 		// post-visual
 		// 비주얼 슬라이드 카운팅
 		var pickvisualCont = $('.post-visual .swiper-slide');
@@ -875,6 +879,7 @@
 			var post_visual = new Swiper('.swiper-container.post-visual', {
 				autoplay: false,
 				loop:false,
+				speed:1000,
 				// pagination: false,
 				pagination: {
 					el: '.swiper-pagination',
@@ -884,8 +889,10 @@
 		} else {
 			var post_visual = new Swiper('.swiper-container.post-visual', {
 				slideTo: 2,
+				speed:1000,
 				autoplay: {
 					delay: 3000,
+					disableOnInteraction: false,
 				},
 				loop:true,
 				pagination: {
@@ -898,6 +905,7 @@
 
 		// post-trendy
 		var post_trendy = new Swiper('.swiper-container.post-trendy', {
+			speed:1000,
 			pagination: {
 				el: '.swiper-pagination',
 			},
@@ -905,7 +913,7 @@
 
 		// post-it
 		var post_it = new Swiper('.swiper-container.post-it', {
-			slidesPerView: 2,
+			slidesPerView: 2.22,
 			spaceBetween: 8,
 			observer: true,
 			observeParents: true,
@@ -924,6 +932,7 @@
 		// post-stylereport
 		var post_stylereport = new Swiper('.swiper-container.post-stylereport', {
 			slidesPerView: 1,
+			speed:1000,
 			pagination: {
 				el: '.swiper-pagination',
 			},
@@ -945,7 +954,7 @@
 		//post-pick-head
 		var Head_pick = new Swiper(".pick-head", {
 			slidesPerView: "auto",
-			spaceBetween: 20,
+			spaceBetween: 0,
 			autoHeight: true,
 			preventClicks: true,
 			preventClicksPropagation: false,
@@ -979,7 +988,7 @@
 			}
 
 			setTimeout(function(){snbwrap.css({
-				"transform": "translate3d("+ (pos*-2) +"px, 0, 0)",
+				"transform": "translate3d("+ (pos*-1) +"px, 0, 0)",
 				"transition-duration": "500ms"
 			})}, 200);
 		}
@@ -995,9 +1004,10 @@
 		var post_pick = new Swiper(".pick-cont .swiper-container", {
 			//slidesPerView: 1,
 			watchOverflow:true, //210520_ 추가 : 슬라이드 1개일 경우 롤링 제거.
+			speed: 1000,
 			//210520_ 추가 : 자동재생 시간 추가.
 			autoplay: {
-				delay: 4000,
+				delay: 3000,
 				disableOnInteraction: false,
 			},
 			observer: true,
@@ -1044,9 +1054,9 @@
 			var post_bnnWide = new Swiper ('.swiper-container.post-bnnWide', {
 				loop: true,
 				slidesPerView: 1,
-				speed : 1500,
+				speed : 1000,
 				autoplay: {
-					delay: 4000,
+					delay: 3000,
 					disableOnInteraction: false,
 				},
 				pagination: {
@@ -1062,6 +1072,7 @@
 		if (pickbnnEvLength < 2) {
 			var post_bnnEvent = new Swiper ('.swiper-container.post-bnnEvent', {
 				loop: false,
+				speed : 1000,
 				autoplay: false,
 				pagination:false,
 			});
@@ -1069,9 +1080,9 @@
 			var post_bnnEvent = new Swiper ('.swiper-container.post-bnnEvent', {
 				loop: true,
 				slidesPerView: 1,
-				speed : 1500,
+				speed : 1000,
 				autoplay: {
-					delay: 4000,
+					delay: 3000,
 					disableOnInteraction: false,
 				},
 				pagination: {
@@ -1086,7 +1097,6 @@
 			pagination: {
 				el: '.swiper-pagination',
 			},
-			//autoHeight: true,
 			autoplay: {
 				delay: 24700,
 				disableOnInteraction: false,
@@ -1180,33 +1190,27 @@
 		}
 		var stopInter = startTimeInterval();
 
+
+		//setTimeout(function () {
+		//		foryouInterval(foryouIndex);
+		//		if (foryouIndex >= 5) foryouIndex = 0;
+		//		foryouIndex++;
+		//}, 2000);
+
+
+
 		var post_sug_items = new Swiper ('.swiper-container.post-sug-items', {
 			slidesPerView: 3,
 			spaceBetween: 10,
-			speed : 800,
-			//autoplay: {
-			//	delay: 3000,
-			//	disableOnInteraction: false,
-			//},
+			speed : 1000,
 		});
 
 		// post-tv
 		var post_tv = new Swiper ('.post-tv', {
 			loop: true,
-			// slidesPerView: 2,
-			// spaceBetween: 20,
 			centeredSlides: true,
-			speed : 800,
-			// effect: 'fade',
+			speed : 1000,
 			autoplay: false,
-			//autoplay: {
-			//	delay: 10000,
-			//	disableOnInteraction: false,
-			//},
-			// navigation: {
-			// 	nextEl: '.main_tv .swiper-button-next',
-			// 	prevEl: '.main_tv .swiper-button-prev',
-			// },
 			pagination: {
 				el: '.main_tv .swiper-pagination',
 				clickable: true,

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

@@ -355,7 +355,7 @@
 	   $(".pd_descrp .cont_body").find('img').each(function() {
 			let tmpImgSrc = $(this).attr('src');
 			if (tmpImgSrc.indexOf('Upload') == 1 ){  // /Upload
-				$(this).attr('src' , tmpImgSrc.replace('/Upload', _imgUrl+"/Local"));
+				$(this).attr('src' , tmpImgSrc.replace('/Upload', _imgUrl+"/Local").replace('/Upload/Local', "/Local"));
 			}
 			
 		});

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

@@ -478,9 +478,34 @@
 				if (result != null) {
 					$("#goodsTogetherbArea").css("display", "block");
 					$("#goodsTogetherbArea").html(result);
+					
+					// 위시처리- 로그인 되어 있을시
+			  		if (cfCheckLogin()) {
+			  			//이상품과 함께본 상품
+						let targetT = $('#goodsTogetherbArea').find('.item_state').find('button');
+						//let targetTSize = targetT.length;
+						targetT.each(function(){
+							let goodsCd = $(this).attr('goodscd');
+							var $this = $(this);
+							let url = "/mypage/wish/list/check/"+goodsCd;
+							var result = '';
+							$.ajax({
+								type: 'get'
+								, async: false
+								, url: url
+								, success: function (data) {
+									//likeit active
+									if ("Y" == data){
+										$this.addClass('likeit').addClass('active');
+									}
+								}
+							});
+						});
+			  		}
 				}
 			}
 		});
+	
 	}
 	
 	//구성상품 조회
@@ -1570,7 +1595,7 @@
 			}
 			// 광고 스크립트용
 			
-			var snsGoodsImg = _uploadGoodsUrl + [[${goodsInfo.sysImgNm}]];
+			var snsGoodsImg = _uploadGoodsUrl + "/"+ [[${goodsInfo.sysImgNm}]];
 			var snsUrl = location.protocol + _PAGE_GOODS_DETAIL + params.goodsCd +'&colorCd =' + params.colorCd  ;
 			var snsGoodsFullNm = [[${goodsInfo.goodsFullNm}]];
 			

+ 22 - 24
src/main/webapp/WEB-INF/views/mob/goods/GoodsDetailFormMob.html

@@ -340,10 +340,10 @@
 					<div style="height:4rem"></div><!-- 여백용 html -->
 					<th:block th:utext="${#strings.unescapeJava(#strings.escapeJava(goodsInfo.goodsTopDesc))}"></th:block>
 				</div>
-				<th:block th:if="${goodsInfo.tobeFormYn == 'N' and goodsInfo.goodsDesc != null  and !goodsInfo.goodsDesc.empty}" >	
+				<th:block th:if="${goodsInfo.tobeFormYn == 'N' and goodsInfo.goodsDesc != null  and !goodsInfo.goodsDesc.empty}" >
+				<div style="height:4rem"></div><!-- 여백용 html -->	
 				<div class="mdhtml_box"	>
-						<div style="height:4rem"></div><!-- 여백용 html -->
-						<div id="goodsDescHtml"></div>
+					<div id="goodsDescHtml"></div>
 				</div>
 				</th:block>
 					
@@ -434,9 +434,11 @@
 				<th:block th:if="${goodsInfo.goodsType == 'G056_S' and goodsComposeList != null and !goodsComposeList.empty}">
 				<th:block  th:each="goodsCompose, status : ${goodsComposeList}">
 					<th:block th:if="${ goodsCompose.tobeFormYn == 'N' and goodsCompose.goodsDesc != null  and !goodsCompose.goodsDesc.empty}" >
+					<div style="height:4rem"></div><!-- 여백용 html -->
 					<div class="mdhtml_box"	>
-						<div style="height:4rem"></div><!-- 여백용 html -->
-						<div th:id="${'goodsDescHtml_' + goodsCompose.compsGoodsCd}"></div>
+						<div class="mdhtml_box"	>
+							<div th:id="${'goodsDescHtml_' + goodsCompose.compsGoodsCd}"></div>
+						</div>
 					</div>
 					</th:block>
 					
@@ -2818,7 +2820,7 @@
 		}
 		// 광고 스크립트용
 		
-		var snsGoodsImg = _uploadGoodsUrl + [[${goodsInfo.sysImgNm}]];
+		var snsGoodsImg = _uploadGoodsUrl + "/" + [[${goodsInfo.sysImgNm}]];
 		var snsUrl = location.protocol + _PAGE_GOODS_DETAIL + params.goodsCd +'&colorCd =' + params.colorCd  ;
 		var snsGoodsFullNm = [[${goodsInfo.goodsFullNm}]];
 		
@@ -2886,6 +2888,14 @@
 			$('.modal.photo_comment_popup .pop_detail').toggleClass('active');
 		});
 		
+		// 상품상세 asis html  이지미 경로 수정
+		$(".pd_descrp .cont_body").find('img').each(function() {
+			let tmpImgSrc = $(this).attr('src');
+			if (tmpImgSrc.indexOf('Upload') == 1 ){  // /Upload
+				$(this).attr('src' , tmpImgSrc.replace('/Upload', _imgUrl+"/Local").replace('/Upload/Local', "/Local"));
+			}
+		});
+		 
 	});
 	
 
@@ -2927,18 +2937,6 @@
 	let vh = window.innerHeight * 0.01;
 	document.documentElement.style.setProperty('--vh', `${vh}px`);
 	
-	 // 상품상세 asis html  이지미 경로 수정
-	window.onload = function(){
-   	 $(".pd_descrp .cont_body").find('img').each(function() {
-			let tmpImgSrc = $(this).attr('src');
-			if (tmpImgSrc.indexOf('Upload') == 1 ){  // /Upload
-				$(this).attr('src' , tmpImgSrc.replace('/Upload', _imgUrl+"/Local"));
-			}
-			
-		});
-		
-	};
-	
    	let goodsVideoList = [[${goodsVideoList}]];
 	let videoFlag = false;
 	if (goodsVideoList != null){
@@ -2974,8 +2972,8 @@
 				$(window).scroll(function(){
 					var scrollTop= $(window).scrollTop();
 					var movHeight = $(".movbox").outerHeight()/2.5;
-					console.log(movHeight);
-					console.log(scrollTop);
+					//console.log(movHeight);
+					//console.log(scrollTop);
 					if (scrollTop > movHeight){
 						controller.pause();
 						return false;
@@ -3021,10 +3019,10 @@
         }
     });
    
-    window.onscroll = function() {
-		document.getElementsByClassName('.modal.pd_pop.pd_review_pop .pd_review .area_rv_empty .btn_group_flex').style.top =
-		window.pageYOffset + 'px';
-	};
+    //window.onscroll = function() {
+	//	document.getElementsByClassName('.modal.pd_pop.pd_review_pop .pd_review .area_rv_empty .btn_group_flex').style.top =
+	//	window.pageYOffset + 'px';
+	//};
 /*]]>*/
 </script>
 

+ 38 - 10
src/main/webapp/WEB-INF/views/mob/goods/GoodsOtherFormMob.html

@@ -23,20 +23,20 @@
 	<div class="area_slider">
 		<div class="swiper-container">
 			<div class="swiper-wrapper">
-				<div class="swiper-slide" th:each="goodsInfo, status : ${goodsList}">
+				<div class="swiper-slide" th:each="result, status : ${goodsList}">
 					<div class="item_prod">
 						<div class="item_state">
-							<button type="button" class="itemLike" th:classappend="${goodsInfo.wishYn == 'Y'}? 'likeit active' : ''"  onclick="cfnPutWishList(this);" th:attr="goodsCd=${goodsInfo.goodsCd}, ithrCd=${params.ithrCd}, contentsLoc='', planDtlSq=''">관심상품 추가</button>
-							<a href="javascript:void(0);" th:onclick="cfnGoToGoodsDetail([[${goodsInfo.goodsCd}]], '',[[${params.ithrCd}]],'','','pc_detail');" class="itemLink" >
+							<button type="button" class="itemLike" th:classappend="${result.product.itemId == 'Y'}? 'likeit active' : ''"  onclick="cfnPutWishList(this);" th:attr="goodsCd=${result.product.itemId}, ithrCd=${params.ithrCd}, contentsLoc='', planDtlSq=''">관심상품 추가</button>
+							<a href="javascript:void(0);" th:onclick="cfnGoToGoodsDetail([[${result.product.itemId}]], '',[[${params.ithrCd}]],'','','pc_detail');" class="itemLink" >
 								<div class="itemPic">
-									<img alt="" class="vLHTC pd_img" th:src="${imgGoodsUrl+'/'+goodsInfo.sysImgNm+'?RS=156'}" th:onerror="'this.src=\''+@{${uxImgUrl}+ '/images/pc/thumb/bg_item_none.png'}+'\';'">
+									<img alt="" class="vLHTC pd_img" th:src="${result.product.itemImage+'?RS=156'}" th:onerror="'this.src=\''+@{${uxImgUrl}+ '/images/pc/thumb/bg_item_none.png'}+'\';'">
 								</div>
-								<p class="itemBrand" th:text="${goodsInfo.brandGroupNm}">BRAND NAME1</p>
-								<div class="itemName" th:text="${goodsInfo.goodsFullNm}">남성 로고 자카드 방풍 패딩</div>
+								<p class="itemBrand" th:text="${result.product.brandName}">BRAND NAME1</p>
+								<div class="itemName" th:text="${result.product.itemName}">남성 로고 자카드 방풍 패딩</div>
 								<p class="itemPrice">
-									<span class="itemPrice_original" th:if="${goodsInfo.listPrice > goodsInfo.currPrice}"  th:text="${#numbers.formatInteger(goodsInfo.listPrice, 0,'COMMA')}">1,000,000</span>
-									<th:block th:text="${#numbers.formatInteger(goodsInfo.currPrice, 0,'COMMA')}"></th:block>
-									<span class="itemPercent" th:if="${goodsInfo.dcRate > 0}" th:text="|${#numbers.formatDecimal(goodsInfo.dcRate,0,0)}%|">30%</span>
+									<span class="itemPrice_original" th:if="${result.product.originalPrice != result.product.salePrice}" th:text="${#numbers.formatInteger(result.product.originalPrice, 0,'COMMA')}">1,000,000</span>
+									<th:block th:text="${#numbers.formatInteger(result.product.salePrice, 0,'COMMA')}"></th:block>
+									<span class="itemPercent" th:if="${result.product.originalPrice != result.product.salePrice}"  th:text="${(result.product.originalPrice == 0 ? 0 : #numbers.formatDecimal((result.product.originalPrice - result.product.salePrice) / (result.product.originalPrice * 1.0) * 100, 1, 0)) + '%'}">0%</span>
 								</p>
 							</a>
 						</div>
@@ -77,9 +77,37 @@
 			slidesPerView: 3,
 			spaceBetween: 8,
 		});	 
-		
 	});
 	
+	window.onload = function(){
+		
+		// 위시처리- 로그인 되어 있을시
+//		if (cfCheckLogin()) {
+//			//이상품과 함께본 상품
+//			let targetT = $('#goodsTogetherbArea').find('.item_state').find('.itemLike');
+//			let targetTSize = targetT.length;
+//			
+//			targetT.each(function(){
+//				let goodsCd = $(this).attr('goodscd');
+//				let url = "/mypage/wish/list/check/"+goodsCd;
+//				var result = '';
+//				$.ajax({
+//					type: 'get'
+//					, async: false
+//					, url: url
+//					, success: function (data) {
+//						//likeit active
+//						if ("Y" == data){
+//							$(this).addClass('likeit').addClass('active');
+//						}
+//					}
+//				});
+//			});
+//			
+//		}
+	};
+	
+	
 /*]]>*/
 </script>	
 

+ 10 - 1
src/main/webapp/WEB-INF/views/mob/mypage/MypageCreCancelDetailFormMob.html

@@ -39,7 +39,11 @@
 				<th:block th:if="${cancelDetailList.cancelDetailList}" th:each="cancelDtl, status : ${cancelDetailList.cancelDetailList}" th:with="imageUrl=${@environment.getProperty('upload.goods.view')}">
 					<div class="goods_section">
 						<div class="goods_status">
-							<p class="dlvr_staus" 	th:if="${cancelDtl.chgStat == 'G685_17' or cancelDtl.chgStat == 'G685_18'}">주문취소</p>
+							<!-- 2021.07.01 선물하기 기간완료 처리 -->
+							<th:block th:if="${cancelDtl.chgStat == 'G685_17' or cancelDtl.chgStat == 'G685_18'}">
+								<p class="dlvr_staus"	th:if="${cancelDtl.giftPackYn == 'Y' and cancelDtl.giftAddrInpYn == 'N' and cancelDtl.giftCancelDay >= 3}">선물취소</p>
+								<p class="dlvr_staus"	th:unless="${cancelDtl.giftPackYn == 'Y' and cancelDtl.giftAddrInpYn == 'N' and cancelDtl.giftCancelDay >= 3}">주문취소</p>
+							</th:block>
 							<p class="dlvr_staus" 	th:unless="${cancelDtl.chgStat == 'G685_17' or cancelDtl.chgStat == 'G685_18'}" th:text="${cancelDtl.chgStatNm}"></p>
 							<p class="dlvr_desc" 	th:text="|${cancelDtl.chgDate} ${cancelDtl.chgTime}|"></p>
 						</div>
@@ -96,6 +100,11 @@
 								</button>
 							</div>
 						</div>
+						<th:block th:if="${cancelDtl.giftPackYn == 'Y' and cancelDtl.giftAddrInpYn == 'N' and cancelDtl.giftCancelDay >= 3 and cancelDtl.chgStat == 'G685_18'}">
+							<div class="goods_txt">
+								<p class="cf_txt cf_desc">주소 입력 기한이 경과되어 선물이 취소 되었습니다.</p>
+							</div>
+						</th:block>
 					</div>
 				</th:block>
 			</div>

+ 13 - 1
src/main/webapp/WEB-INF/views/mob/mypage/MypageCreListInfoMob.html

@@ -20,7 +20,11 @@
 					<div class="goods_section">
 						<div class="goods_status">
 							<!-- 상태값 처리 -->
-							<p class="dlvr_staus" th:if="${cre.chgStat == 'G685_17' or cre.chgStat == 'G685_18'}">주문취소</p>
+							<th:block th:if="${cre.chgStat == 'G685_17' or cre.chgStat == 'G685_18'}">
+								<!-- 2021.07.01 선물하기 기간완료 처리 -->
+								<p class="dlvr_staus" th:if="${cre.giftPackYn == 'Y' and cre.giftAddrInpYn == 'N' and cre.giftCancelDay >= 3}">선물취소</p>
+								<p class="dlvr_staus" th:unless="${cre.giftPackYn == 'Y' and cre.giftAddrInpYn == 'N' and cre.giftCancelDay >= 3}">주문취소</p>
+							</th:block>
 							<th:block th:if="${cre.chgStat == 'G685_40'}" th:each="exchange, index : ${creList.exchangeOptionList}">
 								<p class="dlvr_staus" th:if="${cre.chgOrdDtlNo == exchange.ordDtlNo && (exchange.ordDtlStat == 'G013_20' or exchange.ordDtlStat == 'G013_30' or exchange.ordDtlStat == 'G013_35' or exchange.ordDtlStat == 'G013_40' or exchange.ordDtlStat == 'G013_50')}">교환진행중</p>
 								<p class="dlvr_staus" th:if="${cre.chgOrdDtlNo == exchange.ordDtlNo && (exchange.ordDtlStat == 'G013_60' or exchange.ordDtlStat == 'G013_70')}">교환완료</p>
@@ -157,6 +161,14 @@
 						<!-- //취소,반품,교환 상태별 버튼기능정의 -->
 						
 						<!-- 취소,반품,교환 상태별 문구정의 -->
+						<!-- 선물취소 -->
+						<!-- 2021.07.01 선물하기 기간완료 처리 -->
+						<th:block th:if="${cre.giftPackYn == 'Y' and cre.giftAddrInpYn == 'N' and cre.giftCancelDay >= 3 and cre.chgStat == 'G685_18'}">
+							<div class="goods_txt">
+								<p class="cf_txt cf_desc">주소 입력 기한이 경과되어 선물이 취소 되었습니다.</p>
+							</div>
+						</th:block>
+						<!-- //선물취소 -->
 						<!-- 교환접수 -->
 						<th:block th:if="${cre.chgStat} == 'G685_20'">
 							<div class="goods_txt">

+ 0 - 14
src/main/webapp/WEB-INF/views/mob/mypage/MypageOrderListInfoMob.html

@@ -33,12 +33,6 @@
 									<p class="dlvr_staus">선물 완료</p>
 								</th:block>
 								<!-- //배송지등록완료, 결제전취소, 결제후취소 아닐경우 -->
-								
-								<!-- 선물 취소 -->
-								<th:block th:if="${ordDtl.ordDtlStat} == 'G013_98' and ${ordDtl.ordDtlStat} == 'G013_99'">
-									<p class="dlvr_staus">선물 취소</p>
-								</th:block>
-								<!-- //선물 취소 -->
 							</th:block>
 							<!-- //선물배송일때 -->
 							
@@ -480,14 +474,6 @@
 								</th:block>
 							</th:block>
 							<!-- //배송지등록완료, 결제전취소, 결제후취소 아닐경우 -->
-							
-							<!-- 선물 취소 -->
-							<th:block th:if="${ordDtl.ordDtlStat} == 'G013_98' and ${ordDtl.ordDtlStat} == 'G013_99'">
-								<div class="goods_txt">
-									<p class="cf_txt cf_desc">주소 입력 기한이 경과되어 선물이 취소 되었습니다.</p>
-								</div>
-							</th:block>
-							<!-- //선물 취소 -->
 						</th:block>
 						<!-- //선물배송일때 -->
 						<!-- //상태문구정리 -->

+ 0 - 1
src/main/webapp/WEB-INF/views/mob/mypage/MypageReturnFormMob.html

@@ -651,7 +651,6 @@ var fnChangeReturnQty = function(param) {
 
 		let data 				= {};
 		data.ordNo 				= oneData.ordNo;
-		data.delvFeeCd 			= oneData.delvFeeCd;
 		data.chgGb 				= 'G680_30';
 		data.ordDtlNoArr 		= ordDtlNoArr;
 		data.cnclRtnReqQtyArr 	= cnclRtnReqQtyArr;

+ 0 - 1
src/main/webapp/WEB-INF/views/mob/mypage/NoMemberReturnFormMob.html

@@ -656,7 +656,6 @@ var fnChangeReturnQty = function(param) {
 
 		let data 				= {};
 		data.ordNo 				= oneData.ordNo;
-		data.delvFeeCd 			= oneData.delvFeeCd;
 		data.chgGb 				= 'G680_30';
 		data.ordDtlNoArr 		= ordDtlNoArr;
 		data.cnclRtnReqQtyArr 	= cnclRtnReqQtyArr;

+ 5 - 5
src/main/webapp/WEB-INF/views/mob/planning/PlanningShotGuideFormMob.html

@@ -171,8 +171,8 @@ let shotBrandGoodsList = [[${shotBrandGoodsList}]];
 if(shotBrandList.length>0){
 	var html = '';
 	$.each(shotBrandList, function(idx, item)  {
-		html += '<div class="inner" id="type'+idx+'">';
-		html += '	<div class="dp_listItems_wrap type1">';
+		html += '<div class="inner">';
+		html += '	<div class="dp_listItems_wrap type'+(idx+1)+'">';
 		html += '		<h2 class="dp_subtitle">'+item.brandNm+'</h2>';
 		html += '			<div class="itemsGrp">';
 		$.each(shotBrandGoodsList, function(idx2, item2)  {
@@ -324,12 +324,12 @@ var fnOpenDaumAddr = function() {
 }
 
 var fnCornerClick = function (result1,result2) {
-	var num = result1 - 1;
+	var num = result1;
 	$("#filter").text(result2);
 	//var offset = $('.dp_listItems_cont.type'+(result1)).offset(); //선택한 태그의 위치를 반환
-	var offset = $('#type'+num).offset(); //선택한 태그의 위치를 반환
+	var offset = $('.dp_listItems_wrap.type'+result1).offset(); //선택한 태그의 위치를 반환
 	//animate()메서드를 이용해서 선택한 태그의 스크롤 위치를 지정해서 0.4초 동안 부드럽게 해당 위치로 이동함 
-	$('html').animate({scrollTop : offset.top}, 400);
+	$('html').animate({scrollTop :  offset.top - 60}, 400);
 	
 }
 

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

@@ -59,7 +59,7 @@
 		</main>
 <form id="socialForm" name="socialForm" action="#" th:action="@{'/social/list'}">
 	<input type="hidden" name="pageNo" id="pageNo" value ="1"/>
-	<input type="hidden" name="pageSize" value ="10"/>
+	<input type="hidden" name="pageSize" value ="50"/>
 </form>
 <script src="/ux/plugins/gaga/gaga.infinite.scrollSession.js"></script>
 <script src="/ux/plugins/jquery/jquery.history.min.js"></script>

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

@@ -222,7 +222,7 @@
 		let answer = $(obj).data('answer');
 		if (!gagajf.isNull(answer)) {
 			$('#faqTypeNm').html('[' + answer.substring(0, answer.indexOf('|')) + ']');
-			$('#faqAnswer').html('<span>답변 내용은 아래와 같습니다.</span>' + answer.substring(answer.indexOf('|') + 1));
+			$('#faqAnswer').html('<span>답변 내용은 아래와 같습니다.</span>' + answer.substring(answer.indexOf('|') + 1).escapeHtml().replace(/\n/g,'<br/>'));
 		}
 	}
 /*]]>*/

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

@@ -1215,12 +1215,14 @@
 							
 							$.each(result, function (idx, item) {
 								tag += '	<div class="item_prod">';	
-								tag += '		<div class="item_state">';	
 								if (item.stockQtySum>0 && item.stockQtySum<=5) {
+									tag += '		<div class="item_state soldout">';	
 									tag += '			<div class="shape"><span>곧 품절돼요!</span></div>';
 								}
 								if (item.stockQtySum<=0) {
-									tag += '			<div class="shape"><span>품절</span></div>';
+									tag += '		<div class="item_state soldout">';	
+								}else{
+									tag += '		<div class="item_state soldout">';	
 								}
 								tag += '			<button type="button" class="itemLike active" goodsCd="'+item.goodsCd+'" onclick="fnWishDelete(this);">관심상품 추가</button>';
 								tag += '			<a href="javascript:void(0);" onclick="cfnGoToGoodsDetail(\''+item.goodsCd+'\',\'\',\'IN22_02\')" class=" itemLink">';	

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

@@ -438,7 +438,7 @@
 									tag +=' 	<button class="btn_toggle_bnr">열기</button>';
 								}
 								tag +='</div>';
-								if(item.strVar8=='Y'){
+								// if(item.strVar8=='Y'){
 									tag+='<div class="close_bnr_area">';
 									tag+=' 	<form class="form_wrap">';
 									tag+=' 		<div class="form_field">';
@@ -447,7 +447,7 @@
 									tag+=' 	</form>';
 									tag+=' 	<button id="btn_close_bnr" class="btn_close" onclick="fnGnbTobBannerClose(1);"><span>닫기</span></button>';
 									tag+='</div>';
-								}
+								// }
 							}else if(item.contentsType == 'IMG'){
 								tag+='<div class="bnrtype_img" style="background-color:#'+item.strVar5+';">';
 								tag+=' 	<a href="'+item.strVar1+'" target="">';
@@ -493,6 +493,14 @@
 							if(bannerYn=="Y"){
 								$('#divTopbanner').html(tag);
 							}
+
+							// if(item.contentsType == 'OPEN'){
+							// 	if(item.strVar7!='IMG'){
+							// 		var countdown = document.getElementById("testOpen");
+							// 		var vvv = ""+item.html+"";
+							// 		countdown.innerHTML = vvv;
+							// 	}
+							// }
 						}
 					});
 				}
@@ -514,6 +522,8 @@
 			if (categoryWidth > 994 ){
 				bdList_index[i].style.display="none";
 				mrList_index[i].style.display="block";
+			}else if(categoryWidth < 993 ){
+				$('.more_category').css('display', 'none');
 			}
 			categoryWidth = $('#divGnbTab').outerWidth();
 		}
@@ -532,6 +542,7 @@
 			$('body').toggleClass('lock');
 			$('.bnrtype_open').toggleClass('fixed');
 			$(this).text($(this).text() == '열기' ? '닫기' : '열기');
+			$(this).text() == '열기' ? $('.close_bnr_area').show() : $('.close_bnr_area').hide();
 		});
 		
 		// GNB toggle

+ 6 - 3
src/main/webapp/WEB-INF/views/web/customer/PrivacyPolicyFormWeb.html

@@ -43,7 +43,11 @@
 						<div class="form_field">
 							<div class="select_custom prvs_detail">
 								<div class="combo">
-									<div class="select">개인정보 처리방침 v1.0</div>
+									<th:block th:if="${clauseList}" th:each="oneData, status : ${clauseList}">
+											<th:block th:if="${status.first}">
+												<div class="select" th:text="${oneData.clauseTitle}"></div>
+											</th:block>
+									</th:block>
 									<ul class="list" style="display: none;">
 										<th:block th:if="${clauseList}" th:each="oneData, status : ${clauseList}">
 											<li th:text="${oneData.clauseTitle}" th:onclick="fnGetCaluseInfo([[${oneData.clauseSq}]]);"></li>
@@ -73,7 +77,7 @@
 		$.get('/customer/privacy/policy/info/' + clauseSq
 			, function (data) {
 			if(!gagajf.isNull(data.clauseContent)) {
-				$('.cont_body').html(data.clauseContent);
+				$('.cont_body').html(data.clauseContent.replaceAll('&lt;','<').replaceAll('&gt;', '>').replaceAll('&quot;', '"'));
 				$("html, body").animate({scrollTop : $("#container").offset().top},100)
 			}
 		});
@@ -90,7 +94,6 @@
 		});
 
 		$(window).scroll(function(){
-			var scroll = $(this).scrollTop();
 			var headerH = $(".header").height();
 			if ($(window).scrollTop() > headerH){
 				$(".header").addClass("minify");

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

@@ -568,10 +568,10 @@ $(document).ready( function() {
 			slidesPerView: 'auto',
 			centeredSlides: true,
 			speed : 1000,
-			//autoplay: {
-			//	delay: 7000, //210422_수정 : delay 시간 늘림.
-			//	disableOnInteraction: false,
-			//},
+			autoplay: {
+				delay: 7000, //210422_수정 : delay 시간 늘림.
+				disableOnInteraction: false,
+			},
 			navigation: {
 				nextEl: '.brand_main .brand_visual .swiper-button-next',
 				prevEl: '.brand_main .brand_visual .swiper-button-prev',
@@ -659,7 +659,7 @@ $(document).ready( function() {
 			loop: false,
 			watchOverflow : true, //210503_추가 : 슬라이드 1개일때 롤링 막는 기능 추가.
 			slidesPerView: 1,
-			speed : 1500,
+			speed : 1000,
 			navigation: {
 				nextEl: '.main_1stage .swiper-button-next',
 				prevEl: '.main_1stage .swiper-button-prev',
@@ -670,7 +670,7 @@ $(document).ready( function() {
 		var br_bn_slide = new Swiper ('.brand_main .main_1stage .post-bnnWide', {
 			loop: true,
 			slidesPerView: 1,
-			speed : 1500,
+			speed : 1000,
 			navigation: {
 				nextEl: '.main_1stage .swiper-button-next',
 				prevEl: '.main_1stage .swiper-button-prev',
@@ -688,6 +688,7 @@ $(document).ready( function() {
 		slidesPerView: 5,
 		slidesPerGroup:5, //210429_추가 : slidesPerGroup 추가.
 		spaceBetween: 22,
+		speed : 1000,
 		pagination: {
 			el: '.best_item .swiper-pagination',
 			clickable: true,
@@ -705,6 +706,7 @@ $(document).ready( function() {
 		slidesPerView: 5,
 		slidesPerGroup:5, //210429_추가 : slidesPerGroup 추가.
 		spaceBetween: 22,
+		speed : 1000,
 		pagination: {
 			el: '.md_item .swiper-pagination',
 			clickable: true,
@@ -743,6 +745,7 @@ $(document).ready( function() {
 			slidesPerView: 'auto',
 			freeMode: true,
 			spaceBetween: 20,
+			speed:1000,
 			scrollbar: {
 				el: $('.spe' + index).siblings('.swiper-scrollbar'),
 				hide: false,
@@ -764,7 +767,7 @@ $(document).ready( function() {
 		loop: true,
 		slidesPerView: 'auto',
 		spaceBetween: 20,
-		speed : 800,
+		speed : 1000,
 		autoWidth: true,
 		autoHeight: true,
 		centeredSlides: true,
@@ -787,23 +790,46 @@ $(document).ready( function() {
 	});
 
 
-	/* SLIDE - BRAND_TV */
-	var main_tv_slide = new Swiper ('.brand_main .main_tv .post-tv', {
-		loop: true,
-		slidesPerView: 'auto',
-		spaceBetween: 170,
-		centeredSlides: true,
-		speed : 800,
-		autoplay: false,
-		navigation: {
-			nextEl: '.brand_main .main_tv .swiper-button-next',
-			prevEl: '.brand_main .main_tv .swiper-button-prev',
-		},
-		pagination: {
-			el: '.brand_main .main_tv .swiper-pagination',
-			clickable: true,
-		},
-	});
+	/* SLIDE - MAIN_TV */
+	//210629_ 수정 : 슬라이드 1개일 때, loop랑 롤링 제거.
+	var mainTvCont = $('.main_tv .swiper-slide');
+	var mainTvLength = mainTvCont.length;
+	if (mainTvLength < 2) {
+		var main_tv_slide = new Swiper ('.main_tv .post-tv', {
+			loop: false,
+			watchOverflow:true,
+			slidesPerView: 'auto',
+			spaceBetween: 170,
+			centeredSlides: true,
+			speed : 1000,
+			autoplay: false,
+			navigation: {
+				nextEl: '.main_tv .swiper-button-next',
+				prevEl: '.main_tv .swiper-button-prev',
+			},
+			pagination: {
+				el: '.main_tv .swiper-pagination',
+				clickable: true,
+			},
+		});
+	}else{
+		var main_tv_slide = new Swiper ('.main_tv .post-tv', {
+			loop: true,
+			slidesPerView: 'auto',
+			spaceBetween: 170,
+			centeredSlides: true,
+			speed : 1000,
+			autoplay: false,
+			navigation: {
+				nextEl: '.main_tv .swiper-button-next',
+				prevEl: '.main_tv .swiper-button-prev',
+			},
+			pagination: {
+				el: '.main_tv .swiper-pagination',
+				clickable: true,
+			},
+		});
+	}
 
 	// 브랜드메인 배너 <br> 처리
 	$('.bMainTitle').each(function (){

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

@@ -211,7 +211,7 @@
 		tag += '			<div class="itemsGrp">\n';
 		tag += '				<div class="item_prod">\n';
 		tag += '					<div class="item_state';
-		if(obj9 == 'Y'){
+		if(obj8 < 1 || obj9 == 'Y'){
 			tag += ' soldout';
 		}
 		tag += '">\n';
@@ -221,10 +221,10 @@
 		tag += '							</div>\n';
 		tag += '							<p class="itemBrand">'+obj2+'</p>\n';
 		tag += '							<div class="itemName">'+obj3+'</div>\n';
-		tag += '							<span class="itemPrice_original">'+obj4.addComma()+'</span>\n';
-		if(obj4 != obj5){
-			tag += '							<p class="itemPrice">'+obj5.addComma()+'\n';
+		if(obj4 != obj5) {
+			tag += '							<span class="itemPrice_original">' + obj4.addComma() + '</span>\n';
 		}
+		tag += '							<p class="itemPrice">'+obj5.addComma()+'\n';
 		if(obj6>0){
 			tag += '								<span class="itemPercent">'+obj6+'%</span>\n';
 		}

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

@@ -76,7 +76,7 @@
 
 				<!-- 2. 스타일리포트 -->
 				<th:block th:if="${contentsLoc=='002'}">
-					<div class="content main_stylereport">
+					<div class="content main_stylereport" th:if="${mainLayoutData.ContentsList != null and !mainLayoutData.ContentsList.empty}">
 						<th:block th:if="${mainLayoutData.contentsTitle != null and !mainLayoutData.contentsTitle.empty}">
 						<div class="cont_head">
 							<p class="displayH t_c" th:text="${mainLayoutData.contentsTitle}"></p>
@@ -1031,7 +1031,7 @@ if ( (navigator.appName == 'Netscape' && agent.indexOf('trident') != -1) || (age
 		// Navigation arrows
 		//autoplay: false,
 		autoplay: {
-			delay: 2000,
+			delay: 3000,
 			disableOnInteraction: false,
 		},
 		navigation: {
@@ -1059,7 +1059,7 @@ if ( (navigator.appName == 'Netscape' && agent.indexOf('trident') != -1) || (age
 		speed : 1000,
 		// Navigation arrows
 		autoplay: {
-			delay: 2000,
+			delay: 3000,
 			disableOnInteraction: false,
 		},
 		navigation: {
@@ -1087,16 +1087,17 @@ $(document).on('click','.main_visual .slide-curb-play',function(e){
 	$('.main_visual .slide-curb-pause').show();
 });
 
+//210624_ 수정 : autoplay delay 변경.
 /* SLIDE - MAIN_TRENDY */
 var main_trendy_slide = new Swiper('.main_trendy .post-trendy', {
 	watchSlidesProgress: true,
 	watchSlidesVisibility: true,
 	allowTouchMove: false,
-	loof: false,
+	loop: false,
 	loopAdditionalSlides : 1,
 	speed : 1000,
 	autoplay: {
-		delay: 1500,
+		delay: 3000,
 		disableOnInteraction:false,
 	},
 	navigation: {
@@ -1187,6 +1188,7 @@ var main_deal_slide = new Swiper ('.main_deal .post-deal', {
 	},
 });
 
+//210604_ 수정 : 브랜드 PICK 네비게이션 수정.
 /* 브랜드 PICK 갯수체크 210430_수정 */
 var pickCont = $('.post-pick-nav .swiper-slide');
 var pickLength = pickCont.length;
@@ -1232,9 +1234,9 @@ if (pickLength < 7) { //210614_ 수정 : 슬라이드 갯수 7개 미만일시 
 }
 
 //210622_ 삭제 : 슬라이드 주석 삭제.
-var pickForCont = $('.post-pick-for .swiper-slide');
+var pickForCont = $('.post-pick-for > .swiper-wrapper > .swiper-slide');
 var pickForLength = pickForCont.length;
-if (pickForLength < 2) {
+if (pickForLength < 7) {
 	var main_pick_post = new Swiper('.main_pick .post-pick-for', { //thumbs
 		initialSlide: 0,
 		slidesPerView: 1,
@@ -1265,10 +1267,10 @@ if (pickForLength < 2) {
 var main_pick_lookbook = new Swiper ('.main_pick .post-lookbook', {
 	slidesPerView: 1,
 	speed : 1000,
-	// loop: true,
+	loop: false,
 	watchOverflow: true, //loop와 함께 사용 불가.
 	autoplay: {
-		delay: 2000,
+		delay: 3000,
 		disableOnInteraction: false,
 	},
 	pagination: {
@@ -1284,12 +1286,12 @@ if (pickBnnLength < 2) {
 	/* SLIDE - MAIN_BANNER WIDE */
 	var main_bnnWide_slide = new Swiper ('.main_1stage .post-bnnWide', {
 		slidesPerView: 1,
-		speed : 1500,
+		speed : 1000,
 		initialSlide: 0,
 		loop: false,
 		watchOverflow: true, //loop와 함께 사용 불가.
 		autoplay: {
-			delay: 4000,
+			delay: 3000,
 			disableOnInteraction: false,
 		},
 		navigation: {
@@ -1303,12 +1305,12 @@ if (pickBnnLength < 2) {
 	/* SLIDE - MAIN_BANNER WIDE */
 	var main_bnnWide_slide = new Swiper ('.main_1stage .post-bnnWide', {
 		slidesPerView: 1,
-		speed : 1500,
+		speed : 1000,
 		initialSlide: 0,
 		loop: true,
 		watchOverflow: true, //loop와 함께 사용 불가.
 		autoplay: {
-			delay: 4000,
+			delay: 3000,
 			disableOnInteraction: false,
 		},
 		navigation: {
@@ -1336,7 +1338,7 @@ function init(){
 	var main_recomm_slide = new Swiper ('.main_recomm .post-recomm', {
 		slidesPerView: 5,
 		slidesPerGroup: 5,
-		speed : 1500,
+		speed : 1000,
 		spaceBetween: 20,
 		loop : true,
 		pagination: {
@@ -1434,22 +1436,45 @@ $(".fy_nav ul li").click(function(){
 ti = startTimeInterval();
 
 /* SLIDE - MAIN_TV */
-var main_tv_slide = new Swiper ('.main_tv .post-tv', {
-	loop: true,
-	slidesPerView: 'auto',
-	spaceBetween: 170,
-	centeredSlides: true,
-	speed : 800,
-	autoplay: false,
-	navigation: {
-		nextEl: '.main_tv .swiper-button-next',
-		prevEl: '.main_tv .swiper-button-prev',
-	},
-	pagination: {
-		el: '.main_tv .swiper-pagination',
-		clickable: true,
-	},
-});
+//210629_ 수정 : 슬라이드 1개일 때, loop랑 롤링 제거.
+var mainTvCont = $('.main_tv .swiper-slide');
+var mainTvLength = mainTvCont.length;
+if (mainTvLength < 2) {
+	var main_tv_slide = new Swiper ('.main_tv .post-tv', {
+		loop: false,
+		watchOverflow:true,
+		slidesPerView: 'auto',
+		spaceBetween: 170,
+		centeredSlides: true,
+		speed : 1000,
+		autoplay: false,
+		navigation: {
+			nextEl: '.main_tv .swiper-button-next',
+			prevEl: '.main_tv .swiper-button-prev',
+		},
+		pagination: {
+			el: '.main_tv .swiper-pagination',
+			clickable: true,
+		},
+	});
+}else{
+	var main_tv_slide = new Swiper ('.main_tv .post-tv', {
+		loop: true,
+		slidesPerView: 'auto',
+		spaceBetween: 170,
+		centeredSlides: true,
+		speed : 1000,
+		autoplay: false,
+		navigation: {
+			nextEl: '.main_tv .swiper-button-next',
+			prevEl: '.main_tv .swiper-button-prev',
+		},
+		pagination: {
+			el: '.main_tv .swiper-pagination',
+			clickable: true,
+		},
+	});
+}
 
 $(document).ready(function() {
 	// 몰메인 <br> 태그
@@ -1509,6 +1534,7 @@ $(document).ready(function() {
 			$(this).append(tag);
 		}
 	});
+
 });
 /*]]>*/
 </script>

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

@@ -479,7 +479,7 @@
 						}
 						tag += item.currPrice.addComma();
 						if (item.listPrice != item.currPrice) {
-							tag += '				<span class="itemPercent">' + (item.listPrice - item.currPrice) / (item.listPrice * 1.0) * 100 + '%</span>\n';
+							tag += '				<span class="itemPercent">' + Math.round((item.listPrice - item.currPrice) / (item.listPrice * 1.0) * 100) + '%</span>\n';
 						}
 						tag += '			</p>\n';
 						tag += '		</a>\n';

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

@@ -312,9 +312,8 @@
    	 $(".pd_descrp_pop .cont_body").find('img').each(function() {
 			let tmpImgSrc = $(this).attr('src');
 			if (tmpImgSrc.indexOf('Upload') == 1 ){  // /Upload
-				$(this).attr('src' , tmpImgSrc.replace('/Upload', _imgUrl+"/Local"));
+				$(this).attr('src' , tmpImgSrc.replace('/Upload', _imgUrl+"/Local").replace('/Upload/Local', "/Local"));
 			}
-			
 		});
    //210526_ 추가 : 이미지 style 속성 제거
 	$(".mdhtml_box style").remove();$(".mdhtml_box img").removeAttr("style");

+ 69 - 41
src/main/webapp/WEB-INF/views/web/goods/GoodsDealDetailFormWeb.html

@@ -365,20 +365,22 @@
 				<div class="area_slider">
 					<div class="swiper-container">
 						<div class="swiper-wrapper">
-							<div class="swiper-slide" th:each="goodsInfo, status : ${togetherGoodsList}">
+							<div class="swiper-slide" th:each="result, status : ${togetherGoodsList}">
 								<div class="item_prod">
 									<div class="item_state">
-										<button type="button" class="itemLike" th:classappend="${goodsInfo.wishYn == 'Y'}? 'active' : ''"  onclick="cfnPutWishList(this);" th:attr="goodsCd=${goodsInfo.goodsCd}, ithrCd='IN15_03', contentsLoc='', planDtlSq=''">관심상품 추가</button>
-										<a href="javascript:void(0);" th:onclick="cfnGoToGoodsDetail([[${goodsInfo.goodsCd}]], '','IN15_03','','','pc_detail');" class="itemLink" >
+										<button type="button" class="itemLike" th:classappend="${result.product.itemId == 'Y'}? 'active' : ''"  onclick="cfnPutWishList(this);" th:attr="goodsCd=${result.product.itemId}, ithrCd='IN15_03', contentsLoc='', planDtlSq=''">관심상품 추가</button>
+										<a href="javascript:void(0);" th:onclick="cfnGoToGoodsDetail([[${result.product.itemId}]], '','IN15_03','','','pc_detail');" class="itemLink" >
 											<div class="itemPic">
-												<img alt="" class="vLHTC pd_img" th:src="${imgGoodsUrl+'/'+goodsInfo.sysImgNm +'?RS=300'}" th:onerror="'this.src=\''+@{${uxImgUrl}+ '/images/pc/thumb/bg_item_none.png'}+'\';'">
+												<img alt="" class="vLHTC pd_img" th:src="${result.product.itemImage +'?RS=300'}" th:onerror="'this.src=\''+@{${uxImgUrl}+ '/images/pc/thumb/bg_item_none.png'}+'\';'">
 											</div>
-											<p class="itemBrand" th:text="${goodsInfo.brandGroupNm}">BRAND NAME1</p>
-											<div class="itemName" th:text="${goodsInfo.goodsFullNm}">남성 로고 자카드 방풍 패딩</div>
+											<p class="itemBrand" th:text="${result.product.brandName}">BRAND NAME1</p>
+											<div class="itemName" th:text="${result.product.itemName}">남성 로고 자카드 방풍 패딩</div>
 											<p class="itemPrice">
-												<th:block th:text="${#numbers.formatInteger(goodsInfo.currPrice, 0,'COMMA')}"></th:block>
-												<span class="itemPrice_original" th:if="${goodsInfo.listPrice > goodsInfo.currPrice}"  th:text="${#numbers.formatInteger(goodsInfo.listPrice, 0,'COMMA')}">1,000,000</span>
-												<span class="itemPercent" th:if="${goodsInfo.dcRate > 0}" th:text="|${#numbers.formatDecimal(goodsInfo.dcRate,0,0)}%|">30%</span>
+												<th:block th:text="${#numbers.formatInteger(result.product.salePrice, 0,'COMMA')}"></th:block>
+												<th:block th:if="${result.product.originalPrice != result.product.salePrice}">
+												<span class="itemPrice_original" th:if="${result.product.originalPrice > result.product.salePrice}"  th:text="${#numbers.formatInteger(result.product.originalPrice, 0,'COMMA')}">1,000,000</span>
+												<span class="itemPercent" th:if="${result.product.salePrice != result.product.originalPrice}" th:text="${(result.product.originalPrice == 0 ? 0 : #numbers.formatDecimal((result.product.originalPrice - result.product.salePrice) / (result.product.originalPrice * 1.0) * 100, 1, 0)) + '%'}">0%</span>
+												</th:block>
 											</p>
 										</a>
 									</div>
@@ -1438,39 +1440,65 @@
 		
 	});
 
-function buy_nc_req(cartSqArr) {
-	let data = {  cartSqArr : cartSqArr
-		, backUrl : location.href
-		, goodsUrl : _PAGE_GOODS_DETAIL
-	};
-	let jsonData = JSON.stringify(data);
-
-	$.ajax( {
-		type		: "POST",
-		url 		: "/pg/nPayReq",
-		dataType 	: 'json',
-		data		: jsonData,
-		beforeSend : function(xhr, settings) {
-			xhr.setRequestHeader("AJAX"			, "true");
-			xhr.setRequestHeader('Accept'		, 'application/json');
-			xhr.setRequestHeader('Content-Type'	, 'application/json');
-		},
-		error: function(xhr, status, error) {
-			mcxDialog.alert(status + '; ' + error);
-		},
-		success : function(result) {
-			if (result.state == "sucess") {
-				window.open('about:blank', 'popupView');
-				document.nPayForm.target = 'popupView';
-				document.nPayForm.action = result.npayOrderUrl + "/" + result.orderKey + "/" + result.resultNo;
-				document.nPayForm.submit();
-			} else {
-				mcxDialog.alert(result.message);
+	function buy_nc_req(cartSqArr) {
+		let data = {  cartSqArr : cartSqArr
+			, backUrl : location.href
+			, goodsUrl : _PAGE_GOODS_DETAIL
+		};
+		let jsonData = JSON.stringify(data);
+	
+		$.ajax( {
+			type		: "POST",
+			url 		: "/pg/nPayReq",
+			dataType 	: 'json',
+			data		: jsonData,
+			beforeSend : function(xhr, settings) {
+				xhr.setRequestHeader("AJAX"			, "true");
+				xhr.setRequestHeader('Accept'		, 'application/json');
+				xhr.setRequestHeader('Content-Type'	, 'application/json');
+			},
+			error: function(xhr, status, error) {
+				mcxDialog.alert(status + '; ' + error);
+			},
+			success : function(result) {
+				if (result.state == "sucess") {
+					window.open('about:blank', 'popupView');
+					document.nPayForm.target = 'popupView';
+					document.nPayForm.action = result.npayOrderUrl + "/" + result.orderKey + "/" + result.resultNo;
+					document.nPayForm.submit();
+				} else {
+					mcxDialog.alert(result.message);
+				}
 			}
-		}
-	});
+		});
+		
+	}
 	
-}
+	window.onload = function(){
+		// 위시처리- 로그인 되어 있을시
+  		if (cfCheckLogin()) {
+  			//이상품과 함께본 상품
+  			let targetT = $('#goodsTogetherbArea').find('.item_state').find('button');
+  			//let targetTSize = targetT.length;
+  			targetT.each(function(){
+  				let goodsCd = $(this).attr('goodscd');
+  				var $this = $(this);
+  				let url = "/mypage/wish/list/check/"+goodsCd;
+  				var result = '';
+  				$.ajax({
+  					type: 'get'
+  					, async: false
+  					, url: url
+  					, success: function (data) {
+  						//likeit active
+  						if ("Y" == data){
+  							$this.addClass('likeit').addClass('active');
+  						}
+  					}
+  				});
+  			});
+  		}
+	}
 	
 	// 광고 스크립트용
 	var goodsNavigation = [[${goodsNavigation}]];
@@ -1505,7 +1533,7 @@ function buy_nc_req(cartSqArr) {
 	}
 	// 광고 스크립트용
 	
-	var snsGoodsImg = _uploadGoodsUrl + [[${goodsInfo.sysImgNm}]];
+	var snsGoodsImg = _uploadGoodsUrl + "/"+  [[${goodsInfo.sysImgNm}]];
 	var snsUrl = location.protocol + _PAGE_GOODS_DETAIL + params.goodsCd;
 	if (typeof (params.colorCd) != 'undefined') snsUrl += "&colorCd=" + params.colorCd;
 	var snsGoodsFullNm = [[${goodsInfo.goodsFullNm}]];

+ 107 - 32
src/main/webapp/WEB-INF/views/web/goods/GoodsDetailFormWeb.html

@@ -825,7 +825,9 @@
 				<th:block  th:each="goodsCompose, status : ${goodsComposeList}">
 					<th:block th:if="${ goodsCompose.tobeFormYn == 'N' and goodsCompose.goodsDesc != null  and !goodsCompose.goodsDesc.empty}" >
 						<div style="height:100px"></div>
+						<div class="mdhtml_box">
 						<div th:id="${'goodsDescHtml_' + goodsCompose.compsGoodsCd}"></div>
+						</div>
 					</th:block>
 
 					<th:block th:if="${goodsCompose.tobeFormYn == 'Y'}">
@@ -1159,20 +1161,22 @@
 				<div class="area_slider">
 					<div class="swiper-container">
 						<div class="swiper-wrapper">
-							<div class="swiper-slide" th:each="goodsInfo, status : ${togetherGoodsList}">
+							<div class="swiper-slide" th:each="result, status : ${togetherGoodsList}">
 								<div class="item_prod">
 									<div class="item_state">
-										<button type="button" class="itemLike" th:classappend="${goodsInfo.wishYn == 'Y'}? 'active' : ''"  onclick="cfnPutWishList(this);" th:attr="goodsCd=${goodsInfo.goodsCd}, ithrCd='IN15_03', contentsLoc='', planDtlSq=''">관심상품 추가</button>
-										<a href="javascript:void(0);" th:onclick="cfnGoToGoodsDetail([[${goodsInfo.goodsCd}]], '','IN15_03','','','pc_detail');" class="itemLink" >
+										<button type="button" class="itemLike" th:classappend="${result.product.itemId == 'Y'}? 'active' : ''"  onclick="cfnPutWishList(this);" th:attr="goodsCd=${result.product.itemId}, ithrCd='IN15_03', contentsLoc='', planDtlSq=''">관심상품 추가</button>
+										<a href="javascript:void(0);" th:onclick="cfnGoToGoodsDetail([[${result.product.itemId}]], '','IN15_03','','','pc_detail');" class="itemLink" >
 											<div class="itemPic">
-												<img alt="" class="vLHTC pd_img" th:src="${imgGoodsUrl+'/'+goodsInfo.sysImgNm +'?RS=300'}" th:onerror="'this.src=\''+@{${uxImgUrl}+ '/images/pc/thumb/bg_item_none.png'}+'\';'">
+												<img alt="" class="vLHTC pd_img" th:src="${result.product.itemImage +'?RS=300'}" th:onerror="'this.src=\''+@{${uxImgUrl}+ '/images/pc/thumb/bg_item_none.png'}+'\';'">
 											</div>
-											<p class="itemBrand" th:text="${goodsInfo.brandGroupNm}">BRAND NAME1</p>
-											<div class="itemName" th:text="${goodsInfo.goodsFullNm}">남성 로고 자카드 방풍 패딩</div>
+											<p class="itemBrand" th:text="${result.product.brandName}">BRAND NAME1</p>
+											<div class="itemName" th:text="${result.product.itemName}">남성 로고 자카드 방풍 패딩</div>
 											<p class="itemPrice">
-												<th:block th:text="${#numbers.formatInteger(goodsInfo.currPrice, 0,'COMMA')}"></th:block>
-												<span class="itemPrice_original" th:if="${goodsInfo.listPrice > goodsInfo.currPrice}"  th:text="${#numbers.formatInteger(goodsInfo.listPrice, 0,'COMMA')}">1,000,000</span>
-												<span class="itemPercent" th:if="${goodsInfo.dcRate > 0}" th:text="|${#numbers.formatDecimal(goodsInfo.dcRate,0,0)}%|">30%</span>
+												<th:block th:text="${#numbers.formatInteger(result.product.salePrice, 0,'COMMA')}"></th:block>
+												<th:block th:if="${result.product.originalPrice != result.product.salePrice}">
+												<span class="itemPrice_original" th:if="${result.product.originalPrice > result.product.salePrice}"  th:text="${#numbers.formatInteger(result.product.originalPrice, 0,'COMMA')}">1,000,000</span>
+												<span class="itemPercent" th:if="${result.product.salePrice != result.product.originalPrice}" th:text="${(result.product.originalPrice == 0 ? 0 : #numbers.formatDecimal((result.product.originalPrice - result.product.salePrice) / (result.product.originalPrice * 1.0) * 100, 1, 0)) + '%'}">0%</span>
+												</th:block>
 											</p>
 										</a>
 									</div>
@@ -1284,20 +1288,22 @@
 				<div class="area_slider">
 					<div class="swiper-container">
 						<div class="swiper-wrapper">
-							<div class="swiper-slide" th:each="goodsInfo, status : ${recommendGoodsList}">
+							<div class="swiper-slide" th:each="result, status : ${recommendGoodsList}">
 								<div class="item_prod">
 									<div class="item_state">
-										<button type="button" class="itemLike" th:classappend="${goodsInfo.wishYn == 'Y'}? 'active' : ''"  onclick="cfnPutWishList(this);" th:attr="goodsCd=${goodsInfo.goodsCd}, ithrCd='IN15_04', contentsLoc='', planDtlSq=''">관심상품 추가</button>
-										<a href="javascript:void(0);" th:onclick="cfnGoToGoodsDetail([[${goodsInfo.goodsCd}]], '','IN15_04','','','pc_detail');" class="itemLink" >
+										<button type="button" class="itemLike" th:classappend="${result.product.itemId == 'Y'}? 'active' : ''"  onclick="cfnPutWishList(this);" th:attr="goodsCd=${result.product.itemId}, ithrCd='IN15_03', contentsLoc='', planDtlSq=''">관심상품 추가</button>
+										<a href="javascript:void(0);" th:onclick="cfnGoToGoodsDetail([[${result.product.itemId}]], '','IN15_03','','','pc_detail');" class="itemLink" >
 											<div class="itemPic">
-												<img alt="" class="vLHTC pd_img" th:src="${imgGoodsUrl+'/'+goodsInfo.sysImgNm +'?RS=300'}" th:onerror="'this.src=\''+@{${uxImgUrl}+ '/images/pc/thumb/bg_item_none.png'}+'\';'">
+												<img alt="" class="vLHTC pd_img" th:src="${result.product.itemImage +'?RS=300'}" th:onerror="'this.src=\''+@{${uxImgUrl}+ '/images/pc/thumb/bg_item_none.png'}+'\';'">
 											</div>
-											<p class="itemBrand" th:text="${goodsInfo.brandGroupNm}">BRAND NAME1</p>
-											<div class="itemName" th:text="${goodsInfo.goodsFullNm}">남성 로고 자카드 방풍 패딩</div>
+											<p class="itemBrand" th:text="${result.product.brandName}">BRAND NAME1</p>
+											<div class="itemName" th:text="${result.product.itemName}">남성 로고 자카드 방풍 패딩</div>
 											<p class="itemPrice">
-												<th:block th:text="${#numbers.formatInteger(goodsInfo.currPrice, 0,'COMMA')}"></th:block>
-												<span class="itemPrice_original" th:if="${goodsInfo.listPrice > goodsInfo.currPrice}"  th:text="${#numbers.formatInteger(goodsInfo.listPrice, 0,'COMMA')}">1,000,000</span>
-												<span class="itemPercent" th:if="${goodsInfo.dcRate > 0}" th:text="|${#numbers.formatDecimal(goodsInfo.dcRate,0,0)}%|">30%</span>
+												<th:block th:text="${#numbers.formatInteger(result.product.salePrice, 0,'COMMA')}"></th:block>
+												<th:block th:if="${result.product.originalPrice != result.product.salePrice}">
+												<span class="itemPrice_original" th:if="${result.product.originalPrice > result.product.salePrice}"  th:text="${#numbers.formatInteger(result.product.originalPrice, 0,'COMMA')}">1,000,000</span>
+												<span class="itemPercent" th:if="${result.product.salePrice != result.product.originalPrice}" th:text="${(result.product.originalPrice == 0 ? 0 : #numbers.formatDecimal((result.product.originalPrice - result.product.salePrice) / (result.product.originalPrice * 1.0) * 100, 1, 0)) + '%'}">0%</span>
+												</th:block>
 											</p>
 										</a>
 									</div>
@@ -1326,20 +1332,22 @@
 				<div class="area_slider">
 					<div class="swiper-container">
 						<div class="swiper-wrapper">
-							<div class="swiper-slide" th:each="goodsInfo, status : ${likeGoodsList}">
+							<div class="swiper-slide" th:each="result, status : ${likeGoodsList}">
 								<div class="item_prod">
 									<div class="item_state">
-										<button type="button" class="itemLike" th:classappend="${goodsInfo.wishYn == 'Y'}? 'active' : ''"  onclick="cfnPutWishList(this);" th:attr="goodsCd=${goodsInfo.goodsCd}, ithrCd='IN15_05', contentsLoc='', planDtlSq=''">관심상품 추가</button>
-										<a href="javascript:void(0);" th:onclick="cfnGoToGoodsDetail([[${goodsInfo.goodsCd}]], '','IN15_05','','','pc_detail');" class="itemLink" >
+										<button type="button" class="itemLike" th:classappend="${result.product.itemId == 'Y'}? 'active' : ''"  onclick="cfnPutWishList(this);" th:attr="goodsCd=${result.product.itemId}, ithrCd='IN15_03', contentsLoc='', planDtlSq=''">관심상품 추가</button>
+										<a href="javascript:void(0);" th:onclick="cfnGoToGoodsDetail([[${result.product.itemId}]], '','IN15_03','','','pc_detail');" class="itemLink" >
 											<div class="itemPic">
-												<img alt="" class="vLHTC pd_img" th:src="${imgGoodsUrl+'/'+goodsInfo.sysImgNm +'?RS=300'}" th:onerror="'this.src=\''+@{${uxImgUrl}+ '/images/pc/thumb/bg_item_none.png'}+'\';'">
+												<img alt="" class="vLHTC pd_img" th:src="${result.product.itemImage +'?RS=300'}" th:onerror="'this.src=\''+@{${uxImgUrl}+ '/images/pc/thumb/bg_item_none.png'}+'\';'">
 											</div>
-											<p class="itemBrand" th:text="${goodsInfo.brandGroupNm}">BRAND NAME1</p>
-											<div class="itemName" th:text="${goodsInfo.goodsFullNm}">남성 로고 자카드 방풍 패딩</div>
+											<p class="itemBrand" th:text="${result.product.brandName}">BRAND NAME1</p>
+											<div class="itemName" th:text="${result.product.itemName}">남성 로고 자카드 방풍 패딩</div>
 											<p class="itemPrice">
-												<th:block th:text="${#numbers.formatInteger(goodsInfo.currPrice, 0,'COMMA')}"></th:block>
-												<span class="itemPrice_original" th:if="${goodsInfo.listPrice > goodsInfo.currPrice}"  th:text="${#numbers.formatInteger(goodsInfo.listPrice, 0,'COMMA')}">1,000,000</span>
-												<span class="itemPercent" th:if="${goodsInfo.dcRate > 0}" th:text="|${#numbers.formatDecimal(goodsInfo.dcRate,0,0)}%|">30%</span>
+												<th:block th:text="${#numbers.formatInteger(result.product.salePrice, 0,'COMMA')}"></th:block>
+												<th:block th:if="${result.product.originalPrice != result.product.salePrice}">
+												<span class="itemPrice_original" th:if="${result.product.originalPrice > result.product.salePrice}"  th:text="${#numbers.formatInteger(result.product.originalPrice, 0,'COMMA')}">1,000,000</span>
+												<span class="itemPercent" th:if="${result.product.salePrice != result.product.originalPrice}" th:text="${(result.product.originalPrice == 0 ? 0 : #numbers.formatDecimal((result.product.originalPrice - result.product.salePrice) / (result.product.originalPrice * 1.0) * 100, 1, 0)) + '%'}">0%</span>
+												</th:block>
 											</p>
 										</a>
 									</div>
@@ -2717,14 +2725,81 @@
      window.onload = function(){
     	 $(".pd_descrp .cont_body").find('img').each(function() {
  			let tmpImgSrc = $(this).attr('src');
- 			if (tmpImgSrc.indexOf('/Upload') == 0 ){  // /Upload
- 				$(this).attr('src' , tmpImgSrc.replace('/Upload', _imgUrl+"/Local"));
- 			}
+ 			if (tmpImgSrc.indexOf('Upload') == 1 ){  // /Upload
+				$(this).attr('src' , tmpImgSrc.replace('/Upload', _imgUrl+"/Local").replace('/Upload/Local', "/Local"));
+			}
  			
  		});
+    	
+    	 
+     	// 위시처리- 로그인 되어 있을시
+  		if (cfCheckLogin()) {
+  			//이상품과 함께본 상품
+  			let targetT = $('#goodsTogetherbArea').find('.item_state').find('button');
+  			//let targetTSize = targetT.length;
+  			targetT.each(function(){
+  				let goodsCd = $(this).attr('goodscd');
+  				var $this = $(this);
+  				let url = "/mypage/wish/list/check/"+goodsCd;
+  				var result = '';
+  				$.ajax({
+  					type: 'get'
+  					, async: false
+  					, url: url
+  					, success: function (data) {
+  						//likeit active
+  						if ("Y" == data){
+  							$this.addClass('likeit').addClass('active');
+  						}
+  					}
+  				});
+  			});
+  			
+  			//브랜드 추천상품
+  			let targetR = $('#goodsRecommendbArea').find('.item_state').find('button');
+  			//let targetRSize = targetT.length;
+  			targetR.each(function(){
+  				let goodsCd = $(this).attr('goodscd');
+  				var $this = $(this);
+  				let url = "/mypage/wish/list/check/"+goodsCd;
+  				var result = '';
+  				$.ajax({
+  					type: 'get'
+  					, async: false
+  					, url: url
+  					, success: function (data) {
+  						//likeit active
+  						if ("Y" == data){
+  							$this.addClass('likeit').addClass('active');
+  						}
+  					}
+  				});
+  			});
+  			
+  			//비슷한 상품
+  			let targetL = $('#goodsLikebArea').find('.item_state').find('button');
+  			//let targetTSize = targetT.length;
+  			targetL.each(function(){
+  				let goodsCd = $(this).attr('goodscd');
+  				var $this = $(this);
+  				let url = "/mypage/wish/list/check/"+goodsCd;
+  				var reLult = '';
+  				$.ajax({
+  					type: 'get'
+  					, async: false
+  					, url: url
+  					, success: function (data) {
+  						//likeit active
+  						if ("Y" == data){
+  							$this.addClass('likeit').addClass('active');
+  						}
+  					}
+  				});
+  			});
+  		}
  	}
      
-
+   
 	// 광고 스크립트용
 	var goodsNavigation = [[${goodsNavigation}]];
 	var cate1Nm = "";
@@ -2759,7 +2834,7 @@
 	// 광고 스크립트용
 	
      
-	var snsGoodsImg = _uploadGoodsUrl + [[${goodsInfo.sysImgNm}]];
+	var snsGoodsImg = _uploadGoodsUrl + "/" + [[${goodsInfo.sysImgNm}]];
 	var snsUrl = location.protocol + _PAGE_GOODS_DETAIL + params.goodsCd;
 	if (typeof (params.colorCd) != 'undefined') snsUrl += "&colorCd=" + params.colorCd;
 	var snsGoodsFullNm = [[${goodsInfo.goodsFullNm}]];

+ 11 - 11
src/main/webapp/WEB-INF/views/web/goods/GoodsOtherFormWeb.html

@@ -17,7 +17,6 @@
  <th:block th:if="${goodsList != null and !goodsList.empty}">
 <div class="cont_head">
 	<h3 class="subH1 t_c mb40">
-		<th:block th:if="${params.goodsOtherGb =='tmtb'}" th:text="${'함께하면 할인되는 다다익선 상품'}"></th:block>
 		<th:block th:if="${params.goodsOtherGb =='together'}" th:text="${'이 상품과 함께 본 상품'}"></th:block>
 		<th:block th:if="${params.goodsOtherGb =='recommend'}" th:text="${params.brandGroupNm +' 추천상품'}"></th:block>
 		<th:block th:if="${params.goodsOtherGb =='like'}" th:text="${'이 상품과 비슷한 상품'}"></th:block>
@@ -28,21 +27,22 @@
 	<div class="area_slider">
 		<div class="swiper-container">
 			<div class="swiper-wrapper">
-				<div class="swiper-slide" th:each="goodsInfo, status : ${goodsList}">
+				<div class="swiper-slide" th:each="result, status : ${goodsList}">
 					<div class="item_prod">
 						<div class="item_state">
-							<button type="button" class="itemLike" th:classappend="${goodsInfo.wishYn == 'Y'}? 'active' : ''"  onclick="cfnPutWishList(this);" th:attr="goodsCd=${goodsInfo.goodsCd}, ithrCd=${params.ithrCd}, contentsLoc=${params.contentsLoc}, planDtlSq=''">관심상품 추가</button>
-							<a href="javascript:void(0);" th:onclick="cfnGoToGoodsDetail([[${goodsInfo.goodsCd}]], '',[[${params.ithrCd}]],[[${params.contentsLoc}]],'','pc_detail');" class="itemLink" >
+							<button type="button" class="itemLike" th:classappend="${result.product.itemId == 'Y'}? 'active' : ''"  onclick="cfnPutWishList(this);" th:attr="goodsCd=${result.product.itemId}, ithrCd='IN15_03', contentsLoc='', planDtlSq=''">관심상품 추가</button>
+							<a href="javascript:void(0);" th:onclick="cfnGoToGoodsDetail([[${result.product.itemId}]], '','IN15_03','','','pc_detail');" class="itemLink" >
 								<div class="itemPic">
-									<img alt="" class="vLHTC pd_img" th:src="${imgGoodsUrl+'/'+goodsInfo.sysImgNm +'?RS=300'}" th:onerror="'this.src=\''+@{${uxImgUrl}+ '/images/pc/thumb/bg_item_none.png'}+'\';'">
-									
+									<img alt="" class="vLHTC pd_img" th:src="${result.product.itemImage +'?RS=300'}" th:onerror="'this.src=\''+@{${uxImgUrl}+ '/images/pc/thumb/bg_item_none.png'}+'\';'">
 								</div>
-								<p class="itemBrand" th:text="${goodsInfo.brandGroupNm}">BRAND NAME1</p>
-								<div class="itemName" th:text="${goodsInfo.goodsFullNm}">남성 로고 자카드 방풍 패딩</div>
+								<p class="itemBrand" th:text="${result.product.brandName}">BRAND NAME1</p>
+								<div class="itemName" th:text="${result.product.itemName}">남성 로고 자카드 방풍 패딩</div>
 								<p class="itemPrice">
-									<th:block th:text="${#numbers.formatInteger(goodsInfo.currPrice, 0,'COMMA')}"></th:block>
-									<span class="itemPrice_original" th:if="${goodsInfo.listPrice > goodsInfo.currPrice}"  th:text="${#numbers.formatInteger(goodsInfo.listPrice, 0,'COMMA')}">1,000,000</span>
-									<span class="itemPercent" th:if="${goodsInfo.dcRate > 0}" th:text="|${#numbers.formatDecimal(goodsInfo.dcRate,0,0)}%|">30%</span>
+									<th:block th:text="${#numbers.formatInteger(result.product.salePrice, 0,'COMMA')}"></th:block>
+									<th:block th:if="${result.product.originalPrice != result.product.salePrice}">
+									<span class="itemPrice_original" th:text="${#numbers.formatInteger(result.product.originalPrice, 0,'COMMA')}">1,000,000</span>
+									<span class="itemPercent" th:text="${(result.product.originalPrice == 0 ? 0 : #numbers.formatDecimal((result.product.originalPrice - result.product.salePrice) / (result.product.originalPrice * 1.0) * 100, 1, 0)) + '%'}">0%</span>
+									</th:block>
 								</p>
 							</a>
 						</div>

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

@@ -79,7 +79,10 @@
 										</div>
 										<div class="status_box">
 											<p>
-												<th:block th:if="${cancelDtl.chgStat == 'G685_17' or cancelDtl.chgStat == 'G685_18'}" th:text="|주문취소|"></th:block>
+												<th:block th:if="${cancelDtl.chgStat == 'G685_17' or cancelDtl.chgStat == 'G685_18'}">
+													<th:block th:if="${cancelDtl.giftPackYn == 'Y' and cancelDtl.giftAddrInpYn == 'N' && cancelDtl.giftCancelDay >= 3}" th:text="|선물취소|"></th:block>
+													<th:block th:unless="${cancelDtl.giftPackYn == 'Y' and cancelDtl.giftAddrInpYn == 'N' && cancelDtl.giftCancelDay >= 3}" th:text="|주문취소|"></th:block>
+												</th:block>
 												<th:block th:unless="${cancelDtl.chgStat == 'G685_17' or cancelDtl.chgStat == 'G685_18'}" th:text="${cancelDtl.chgStatNm}"></th:block>
 												<span class="date" th:text="${cancelDtl.chgDate}"></span>
 												<span class="time" th:text="${cancelDtl.chgTime}"></span>
@@ -89,6 +92,9 @@
 											<p><button type="button" class="btn btn_default btn_sm" onclick="cfnGoToPage(_PAGE_ONETOONE_QNA);"><span>1:1 문의</span></button></p>
 										</div>
 									</div>
+
+									<!-- 선물취소 -->
+									<div class="order_text" th:if="${cancelDtl.giftPackYn == 'Y' && cancelDtl.giftAddrInpYn == 'N' && cancelDtl.giftCancelDay >= 3 && cancelDtl.chgStat == 'G685_18'}"><p>주소 입력 기한이 경과되어 선물이 취소 되었습니다.</p></div>
 								</div>
 							</th:block>
 							<!-- //주문상품 -->

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

@@ -423,7 +423,12 @@
 					tag += '										<div class="status_box">\n';
 					tag += '											<p>\n';
 					if (cre.chgStat == 'G685_17' || cre.chgStat == 'G685_18') {
-						tag += '												주문취소\n';
+						// 2021.07.01 선물하기 기간완료 처리
+						if (cre.giftPackYn == 'Y' && cre.giftAddrInpYn == 'N' && cre.giftCancelDay >= 3) {
+							tag += '												선물취소\n';
+						} else {
+							tag += '												주문취소\n';
+						}
 					} else if (cre.chgStat == 'G685_40') {
 						$.each(creList.exchangeOptionList, function(index, exchange) {
 							if (cre.chgOrdDtlNo == exchange.ordDtlNo && (exchange.ordDtlStat == 'G013_20' || exchange.ordDtlStat == 'G013_30' || exchange.ordDtlStat == 'G013_35' || exchange.ordDtlStat == 'G013_40' || exchange.ordDtlStat == 'G013_50')) {
@@ -467,6 +472,10 @@
 					//}
 					// cre.chgGb == 'G680_30' : 반품
 					// cre.chgGb == 'G680_40' : 교환
+					// 2021.07.01 선물하기 기간완료 처리
+					if (cre.giftPackYn == 'Y' && cre.giftAddrInpYn == 'N' && cre.giftCancelDay >= 3 && cre.chgStat == 'G685_18') {
+						tag += '									<div class="order_text"><p>주소 입력 기한이 경과되어 선물이 취소 되었습니다.</p></div>\n';
+					}
 					// 교환접수
 					if (cre.chgStat == 'G685_20') {
 						tag += '									<div class="order_text"><p>교환 신청이 접수 되었습니다. 신속하게 처리하여 드리겠습니다.</p></div>\n';

+ 0 - 7
src/main/webapp/WEB-INF/views/web/mypage/MypageOrderListFormWeb.html

@@ -474,8 +474,6 @@
 							tag += '											<p>주소 입력 대기중</p>\n';
 						} else if (ordDtl.giftAddrInpYn == 'Y' && ordDtl.ordDtlStat != 'G013_98' && ordDtl.ordDtlStat != 'G013_99') {
 							tag += '											<p>선물 완료</p>\n';
-						} else if (ordDtl.ordDtlStat == 'G013_98' || ordDtl.ordDtlStat == 'G013_99' || ordDtl.giftLimitDay < 0) {
-							tag += '											<p>선물 취소</p>\n';
 						}
 					} else if (ordDtl.ordDtlStat == 'G013_10') {
 						tag += '											<p>주문접수</p>\n';
@@ -572,11 +570,6 @@
 						if (ordDtl.giftAddrInpYn == 'Y' && ordDtl.ordDtlStat != 'G013_98' && ordDtl.ordDtlStat != 'G013_99') {
 							tag += '									<div class="order_text"><p>' + ordDtl.recipNm + '님께 선물이 발송되었습니다.</p></div>\n';
 						}
-						
-						// 선물 취소
-						if (ordDtl.ordDtlStat == 'G013_98' && ordDtl.ordDtlStat == 'G013_99') {
-							tag += '									<div class="order_text"><p>주소 입력 기한이 경과되어 선물이 취소 되었습니다.</p></div>\n';
-						}
 					} else {
 						// 주문 접수
 						if (ordDtl.ordDtlStat == 'G013_10') {

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

@@ -497,7 +497,6 @@
 
 			let data = {};
 			data.ordNo = oneData.ordNo;
-			data.delvFeeCd = oneData.delvFeeCd;
 			data.chgGb = 'G680_30';
 			data.ordDtlNoArr = ordDtlNoArr;
 			data.cnclRtnReqQtyArr = cnclRtnReqQtyArr;

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

@@ -500,7 +500,6 @@
 			data.ordNm = oneData.ordNm;
 			data.ordPhnno = oneData.ordPhnno;
 			data.chgGb = 'G680_30';
-			data.delvFeeCd = oneData.delvFeeCd;
 			data.ordDtlNoArr = ordDtlNoArr;
 			data.cnclRtnReqQtyArr = cnclRtnReqQtyArr;
 			

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

@@ -73,7 +73,7 @@
     </div>   
 <form id="socialForm" name="socialForm" action="#" th:action="@{'/social/list'}">
 	<input type="hidden" name="pageNo" id="pageNo" value ="1"/>
-	<input type="hidden" name="pageSize" value ="10"/>
+	<input type="hidden" name="pageSize" value ="50"/>
 </form>
 <script src="/ux/plugins/gaga/gaga.infinite.scrollSession.js"></script>
 <script src="/ux/plugins/jquery/jquery.history.min.js"></script>

+ 73 - 42
src/main/webapp/biz/goods.js

@@ -18,20 +18,29 @@ var fnGoodsTogetherSearch = function(params) {
 				$("#goodsTogetherbArea").css("display", "block");
 				$("#goodsTogetherbArea").html(result);
 				
-				/*var otherItemSwiper1 = new Swiper('.pd .pd_clickother .area_slider .swiper-container', {
-				     slidesPerView: 5,
-				     slidesToScroll: 5,
-				     slidesPerGroup: 5,
-				     spaceBetween: 20,
-				     navigation: {
-				         nextEl: '.pd_clickother .swiper-button-next',
-				         prevEl: '.pd_clickother .swiper-button-prev',
-				     },
-				     pagination: {
-				         el: '.pd_clickother .swiper-pagination',
-				         clickable: true,
-				     },
-				 });   */
+				// 위시처리- 로그인 되어 있을시
+		  		if (cfCheckLogin()) {
+		  			//이상품과 함께본 상품
+					let targetT = $('#goodsTogetherbArea').find('.item_state').find('button');
+					//let targetTSize = targetT.length;
+					targetT.each(function(){
+						let goodsCd = $(this).attr('goodscd');
+						var $this = $(this);
+						let url = "/mypage/wish/list/check/"+goodsCd;
+						var result = '';
+						$.ajax({
+							type: 'get'
+							, async: false
+							, url: url
+							, success: function (data) {
+								//likeit active
+								if ("Y" == data){
+									$this.addClass('likeit').addClass('active');
+								}
+							}
+						});
+					});
+		  		}
 			}
 		}
 	});
@@ -55,19 +64,29 @@ var fnGoodsRecommendSearch = function(params) {
 			if (result != null) {
 				$("#goodsRecommendbArea").css("display", "block");
 				$("#goodsRecommendbArea").html(result);
-				/* var relateItemSwiper = new Swiper('.pd .pd_brand .area_slider .swiper-container', {
-		                slidesPerView: 5,
-		                spaceBetween: 20,
-		                slidesPerGroup: 5,
-		                navigation: {
-		                    nextEl: '.pd_brand .swiper-button-next',
-		                    prevEl: '.pd_brand .swiper-button-prev',
-		                },
-		                pagination: {
-		                    el: '.pd_brand .swiper-pagination',
-		                    clickable: true,
-		                },
-		            });  */
+				// 위시처리- 로그인 되어 있을시
+		  		if (cfCheckLogin()) {
+			  		//브랜드 추천상품
+		  			let targetR = $('#goodsRecommendbArea').find('.item_state').find('button');
+		  			//let targetRSize = targetT.length;
+		  			targetR.each(function(){
+		  				let goodsCd = $(this).attr('goodscd');
+		  				var $this = $(this);
+		  				let url = "/mypage/wish/list/check/"+goodsCd;
+		  				var result = '';
+		  				$.ajax({
+		  					type: 'get'
+		  					, async: false
+		  					, url: url
+		  					, success: function (data) {
+		  						//likeit active
+		  						if ("Y" == data){
+		  							$this.addClass('likeit').addClass('active');
+		  						}
+		  					}
+		  				});
+		  			});
+		  		}
 			}
 		}
 	});
@@ -91,19 +110,29 @@ var fnGoodsLikeSearch = function(params) {
 			if (result != null) {
 				$("#goodsLikebArea").css("display", "block");
 				$("#goodsLikebArea").html(result);
-				/*var relateItemSwiper = new Swiper('.pd .pd_relate .area_slider .swiper-container', {
-	                slidesPerView: 5,
-	                spaceBetween: 20,
-	                slidesPerGroup: 5,
-	                navigation: {
-	                    nextEl: '.pd_relate .swiper-button-next',
-	                    prevEl: '.pd_relate .swiper-button-prev',
-	                },
-	                pagination: {
-	                    el: '.pd_relate .swiper-pagination',
-	                    clickable: true,
-	                },
-	            });      */
+				// 위시처리- 로그인 되어 있을시
+		  		if (cfCheckLogin()) {
+		  			//비슷한 상품
+		  			let targetL = $('#goodsLikebArea').find('.item_state').find('button');
+		  			//let targetTSize = targetT.length;
+		  			targetL.each(function(){
+		  				let goodsCd = $(this).attr('goodscd');
+		  				var $this = $(this);
+		  				let url = "/mypage/wish/list/check/"+goodsCd;
+		  				var reLult = '';
+		  				$.ajax({
+		  					type: 'get'
+		  					, async: false
+		  					, url: url
+		  					, success: function (data) {
+		  						//likeit active
+		  						if ("Y" == data){
+		  							$this.addClass('likeit').addClass('active');
+		  						}
+		  					}
+		  				});
+		  			});
+		  		}
 			}
 		}
 	});
@@ -209,7 +238,7 @@ var fnCreateGoodsList = function(result, ithrCd, contentLoc, goodsUrl, lastPage,
 		// 	categoryGoodsList.push(item.goodsCd);
 		// }
 		if(!gagajf.isNull(item.goodsCd)) {
-			tag += '<div class="item_prod" id="' + item.goodsCd + item.mainColorCd + '">';
+			tag += '<div class="item_prod" id="' + item.goodsCd + item.colorCd + '">';
 			tag += '	<div class="item_state';
 			if (!gagajf.isNull(item.sizes)) {
 				var sizeArr = item.sizes.split(",");
@@ -237,7 +266,7 @@ var fnCreateGoodsList = function(result, ithrCd, contentLoc, goodsUrl, lastPage,
 			} else {
 				tag += ' onClick="cfnPutWishList(this);" goodsCd=\'' + item.goodsCd + '\', ithrCd=\'\', contentsLoc=\'\', planDtlSq=\'\'>관심상품 추가</button>';
 			}
-			tag += '<a href="javascript:void(0);" class="itemLink" onclick="fnClickGoodsCd(\'' + item.goodsCd + '\',\'' + item.mainColorCd + '\');">';
+			tag += '<a href="javascript:void(0);" class="itemLink" onclick="fnClickGoodsCd(\'' + item.goodsCd + '\',\'' + item.colorCd + '\');">';
 			tag += '			<div class="itemPic">';
 			if (!gagajf.isNull(item.videos)) {
 				var videoArr = item.videos.split(",");
@@ -765,6 +794,7 @@ var fnDeleteFilterSlider = function (obj, gubun, minVal, maxVal){
 
 // 정렬 순서
 var fnSortingChange = function (obj, sortingType, stat, appGb){
+	console.log('here sort');
 	fnCategoryGoodsInfiniteScrollInit();
 	if(stat != 'back'){
 		if($("#searchGoodsForm input[name=sortingType]").val()==sortingType){
@@ -796,6 +826,7 @@ var fnSortingChange = function (obj, sortingType, stat, appGb){
 
 	$('#endPage').hide();
 	$('#noFilterData').hide();
+	console.log('here sort2');
 	fnGoodsListSearch();
 }
 

+ 1 - 1
src/main/webapp/biz/search.js

@@ -46,7 +46,7 @@ var fnCreateGoodsList = function(result, ithrCd, contentLoc, goodsUrl, lastPage,
 			}else{
 				tag += ' onClick="cfnPutWishList(this);" goodsCd=\''+item.goodsCd+'\', ithrCd=\'\', contentsLoc=\'\', planDtlSq=\'\'>관심상품 추가</button>';
 			}
-			tag += '<a href="javascript:void(0);" class="itemLink" onclick="fnClickGoodsCd(\''+item.goodsCd+'\',\'\');">';
+			tag += '<a href="javascript:void(0);" class="itemLink" onclick="fnClickGoodsCd(\''+item.goodsCd+'\',\'' + item.colorCd + '\');">';
 			tag += '			<div class="itemPic">';
 			if(!gagajf.isNull(item.videos)){
 				var videoArr = item.videos.split(",");

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


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

@@ -232,7 +232,7 @@ select,
 /* form style (hyangah_0223_수정중 - input[type="text"] padding 수정) */
 input,  textarea {font-size:1.2rem; font-family:'Noto Sans KR', 'LATO', sans-serif; color:#666666; vertical-align:middle;}
 select{font-size:1.2rem; font-family:'Noto Sans KR', 'LATO', sans-serif; color:#666666; vertical-align:middle;}
-input[type="text"], input[type="password"] {padding:0 1.5rem; border:0.1rem solid #dddddd;box-sizing: border-box;}
+input[type="text"], input[type="password"] {padding:0 1.5rem; border:0.1rem solid #dddddd;box-sizing: border-box; -webkit-appearance: none; -webkit-border-radius: 0;}
 input[type="text"]:focus, input[type="password"]:focus,
 input[type="text"].active, input[type="password"].active {border-color: #aaaaaa;} 
 input[type="text"]:disabled, input[type="password"]:disabled, input[type="select"]:disabled,
@@ -670,7 +670,7 @@ body.gnb_on {height: 100vh;overflow: hidden !important;}
 
 /* header, htop, btn_gnb, header.main, hmenu, bng, bnb */
 header {
-  position: fixed;left: 0;top: 0; width: 100%;z-index: 80;
+  position: fixed;left: 0;top: 0; width: 100%;z-index: 101;
   /*position: sticky;*/width: 100%;transition: top 0.3s;/* background-color: #fff; */ transform: translate3d(0,0,0);
 } /* 210526_ main.container 여백 때문에 sticky 속성 주석. */
 header::after{content: '';display: block;clear: both;}
@@ -852,7 +852,7 @@ header .hmenus .bnb ul > li > a{display: block; padding: 0.8rem 0; font-size: 1.
 /* gnb */
 body.header-show .app .gnb{top: 5.0rem;}
 .app .gnb {position: -webkit-sticky; position: sticky; top: 0; padding-right: 3.0rem; background-color: #fefefe; z-index: 9; /*background-color: #000; transition: top 0.3s;*/ width: 100%;}
-.app .gnb {background-color:#fefefe; position:relative; z-index:79;} /* layout_m 재확인 */
+.app .gnb {background-color:#fefefe; position:relative; z-index:100;} /* layout_m 재확인 */
 .app .gnb.expand{padding-right: 3.0rem;}
 
 .app .gnb .gnb-inner{position: relative; width: 100%; padding: 0.9rem 1.0rem; overflow-x: scroll;}
@@ -880,7 +880,7 @@ section.main, section.ev_list, section.dp_exhibition, section.dp_lookbook, secti
 section.main.scr, section.ev_list.scr, section.dp_exhibition.scr, section.dp_lookbook.scr, section.dp_outlets.scr, section.dp_submain.scr, section.dp_hotdeal.scr, section.br_main.scr, section.dp_best.scr, section.br_lookbook.scr {margin-top: 5.5rem;}
 
 /* .tabbar */
-.tabbar{-webkit-transform: translate(0, 8.0rem);-ms-transform: translate(0, 8.0rem);-moz-transform: translate(0, 8.0rem); transform: translate(0, 8.0rem);transition-duration: 0.25s; position: fixed;width: 100%;bottom: 0;background-color: #f8f8f8;z-index: 20; padding-bottom: constant(safe-area-inset-bottom);padding-bottom: env(safe-area-inset-bottom);}
+.tabbar{-webkit-transform: translate(0, 8.0rem);-ms-transform: translate(0, 8.0rem);-moz-transform: translate(0, 8.0rem); transform: translate(0, 8.0rem);transition-duration: 0.25s; position: fixed;width: 100%;bottom: 0;background-color: #f8f8f8;z-index: 100; padding-bottom: constant(safe-area-inset-bottom);padding-bottom: env(safe-area-inset-bottom);}
 .tabbar.fixed{-webkit-transform: translate(0, 0);-ms-transform: translate(0, 0);-moz-transform: translate(0, 0);transform: translate(0, 0);}
 .tabbar .tabbar-inner{display: -webkit-box;display: -moz-box;display: -webkit-flex;display: -ms-flexbox;display: flex; -webkit-box-pack: justify;-moz-box-pack: justify;-ms-flex-pack: justify;-webkit-justify-content: space-between;justify-content: space-between; padding: 0.6rem 2.0rem;}
 .tabbar .tabbar-inner [class*=btn-]{display: block;width: 4.2rem; height: 3.0666rem; font-size: 0;position: relative;background: url(/images/mo/ico_tabbar.png) no-repeat center;background-size: 18.0rem 2.16rem;padding: 0rem 1rem;}

+ 7 - 6
src/main/webapp/ux/mo/css/layout_m.css

@@ -155,7 +155,7 @@
 .cs_contactUs_my .select,
 .cs_contactUs_my input[type="text"] {width:100%; font-weight:200; box-sizing:border-box; color:#222; font-size:1.2rem; font-weight:300;}	
 .cs_contactUs_my input[type="text"]::placeholder,
-.cs_contactUs_my .form_control {height:4.2rem; color:#222; font-size:1.4rem;}
+.cs_contactUs_my .form_control {height:4.2rem; color:#222; font-size:1.4rem; line-height: 4.5rem;}
 .cs_contactUs_my .input_label {line-height:4.2rem;}
 .cs_contactUs_my .contactus_cnt {color:#888}
 .cs_contactUs_my .select {height:4.2rem; font-size:1.2rem;}
@@ -399,7 +399,8 @@
 /* 슬라이드아이템*/
 .item_prod {display: inline-block;width: 100%;font-size: 0;vertical-align: top;color: rgb(31, 31, 31);position: relative;letter-spacing: -0.025em;}
 .item_prod .item_state {position: relative; padding:0; box-sizing: border-box;}
-.item_prod .item_state.soldout::before {content: 'SOLD OUT';position: absolute;top: 25%;left: 50%;transform: translate(-50%, 0%);width:100%;height: auto;font-size: 1.5rem;font-weight: 500;color: #fff;z-index: 30;text-align: center;}
+/* .item_prod .item_state.soldout::before {content: 'SOLD OUT';position: absolute;top: 25%;left: 50%;transform: translate(-50%, 0%);width:100%;height: auto;font-size: 1.5rem;font-weight: 500;color: #fff;z-index: 30;text-align: center;} */
+.item_state.soldout .itemPic:after {content: 'SOLD OUT';position: absolute;top: 50%;left: 50%;transform: translate(-50%, -50%);width:100%;height: auto;font-size: 1.5rem;font-weight: 500;color: #fff;z-index: 30;text-align: center; opacity: 1; background: transparent;}
 .item_prod .item_state.soldout .itemPic:before {content:''; position: absolute; top: 50%; left: 50%;  background: rgba(0,0,0,.7); width: 100%; height: 100%; transform:translate(-50%, -50%); z-index: 20; text-align: center;}
 .item_prod .item_state.AD .itemPic:before {content:'AD'; position: absolute; bottom: 0.666rem; right: 0.666rem; font-size: 1rem; font-weight: 300; letter-spacing: -0.025em; color:#888888; width: auto; height: auto; line-height: 1rem; z-index: 21; text-align: right;}
 
@@ -418,7 +419,7 @@
 .item_prod .itemPic .pd_img {position: absolute;width: 100%;height: auto;top: 50%;left: 0;transform: translateY(-50%);}
 .item_prod .itemPic .pd_mov {position: absolute;width: 100%;height: 100%;top: 50%;left: 0;transform: translateY(-50%);z-index: 2;}
 .item_prod .itemBrand {display: inline-block; margin: 0 0.5rem 0.3rem; font-size: 1rem;font-weight: 300;color: rgb(137, 137, 137); text-overflow:ellipsis;white-space:nowrap;word-wrap:normal;width:10rem;overflow:hidden;}
-.item_prod .itemComment{margin: 0.8rem 0.5rem 0.4rem;line-height: 1; height: 1.2rem; font-size: 1.1rem;font-weight: 300;color: #fd4802;overflow: hidden;text-overflow: ellipsis;white-space: nowrap;}
+.item_prod .itemComment{margin: 0.8rem 0.5rem 0.4rem; height: 1.3rem; font-size: 1.1rem;font-weight: 300;color: #fd4802;overflow: hidden;text-overflow: ellipsis;white-space: nowrap;}
 .item_prod .itemName {margin: 0 0.5rem 0.8rem; font-size: 1.1rem; font-weight:300; color: rgb(31, 31, 31); height: 3rem; max-height: 3rem; position: relative; overflow: hidden; white-space: normal; overflow-wrap: break-word; display: block; letter-spacing: -0.025rem;}
 /*.item_prod .itemName {display: -webkit-box;text-overflow: ellipsis;-webkit-line-clamp: 2;-webkit-box-orient: vertical;}*/
 .item_prod .itemName .tit_option{font-weight:500;}
@@ -1686,6 +1687,7 @@
 .dp .dp_util li a.refresh{color:#888!important;}
 .dp .dp_util li a.refresh:after{content:''; position:relative; top:0.1rem;  margin-left:0.8rem; display:inline-block; width:1.1rem; height:1.1rem; background: url(/images/mo/icon_best_refresh.png) center center no-repeat; background-size:contain;}
 .dp .count_wrap {padding:2rem 0;}
+.dp .count_wrap.fixed {position: fixed; top: 5.5rem; left: 0; width: 100%; padding: 2rem; background: #fff; z-index: 100;}
 .dp .count_wrap:after{display:block; content:''; clear:both;}
 .dp .count_wrap div:nth-child(1) {float:left;}
 .dp .count_wrap div:nth-child(1) p {font-size:1.2rem; color:#888;}
@@ -1728,7 +1730,7 @@
 .dp .dp_outlets .outlets_visual .txtWrap.w {color: #fff;}
 .dp .dp_outlets .outlets_visual .txtWrap p {font-size: 3rem; font-weight: 500; line-height: 1.2; display: -webkit-box;text-overflow: ellipsis;-webkit-line-clamp: 2;-webkit-box-orient: vertical; overflow:hidden;}
 .dp .dp_outlets .outlets_visual .txtWrap p.txt_xs {font-size: 1.4rem; margin-top: 1.6rem; font-weight: 300; -webkit-line-clamp: 1;}
-.dp .dp_outlets .dp_cate_list {margin:-1.2rem 0;}
+.dp .dp_outlets .dp_cate_list {margin:-1.2rem 0; border-top: 0.1rem solid #ddd;}
 .dp .dp_outlets .dp_cate_list:after {content:''; display: block; clear: both;}
 .dp .dp_outlets .dp_cate_list a {position:relative; float:left; width:50%; line-height:5rem; padding:0 3rem 0 2rem; font-size:1.3rem; font-weight: 500; color: #222; text-align: left; background: #fff url(/images/mo/ico_more_lg.png) no-repeat right 2rem center; border-bottom:0.1rem solid #ddd; box-sizing:border-box; }
 .dp .dp_outlets .dp_cate_list a:nth-child(2n){ border-left:0.1rem solid #ddd;}
@@ -1819,7 +1821,7 @@
 .dp_hotdeal .itemsGrp.rowtype .item_prod .shape:after{display:none;}
 .dp_hotdeal .itemsGrp.rowtype .item_prod .itemPic::after {background: #f5f5f5; opacity:1; z-index: 7;}
 .dp_hotdeal .itemsGrp.rowtype .item_prod .itemPic .pd_img {z-index: 8;}
-.dp_hotdeal .itemsGrp.rowtype .item_prod.sold_out .itemPic:before {content:'SOLD OUT'; position: absolute; top: 50%; left: 50%; font-size:1.4rem; color:#fff; font-weight:600; background: rgba(0,0,0,.5); width: 100%; height: 100%; transform:translate(-50%, -50%); line-height:23.4rem;; z-index: 99; text-align: center;}
+.dp_hotdeal .itemsGrp.rowtype .item_prod.sold_out .itemPic:before {content:'SOLD OUT'; position: absolute; top: 50%; left: 50%; font-size:1.4rem; color:#fff; font-weight:600; background: rgba(0,0,0,.5); width: 100%; height: 100%; transform:translate(-50%, -50%); line-height:23.4rem;; z-index: 98; text-align: center;}
 .dp_hotdeal .itemsGrp.rowtype .item_prod .shape{position:relative;}
 .dp_hotdeal .itemsGrp.rowtype .item_prod .itemBrand {margin:1.5rem 0 0.5rem;}
 .dp_hotdeal .itemsGrp.rowtype .item_prod .itemComment {position: relative; top:-6rem; margin:0;}
@@ -2581,7 +2583,6 @@
 
 
 .sch .sch_result .item_prod{width:100%;}
-.sch .sch_result .item_prod .itemName{margin-top:1rem; color:#535353}
 .sch .sch_result .item_prod .rank::after{background-color:#fd4802;}
 .sch .sch_result .item_prod .rank > span{font-size:0.9rem;}
 .sch .sch_result .item_prod .itemPic.ver{padding-top:99%; margin-top:3rem;}

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

@@ -794,7 +794,8 @@ content: "〉";font-size: 12px;padding-left: 8px;
 
 .item_prod {width: 20%;display: inline-block;font-size: 0px;vertical-align: top;color: rgb(31, 31, 31);position: relative;letter-spacing: -0.2px;}
 .item_state {position: relative; padding: 0px 10px 60px; box-sizing: border-box;}
-.item_state.soldout .itemPic:before {content:'SOLD OUT'; position: absolute; top: 50%; left: 50%; font-size: 28px; font-weight: 500; color:#fff; background: rgba(0,0,0,.7); width: 100%; height: 100%; transform:translate(-50%, -50%); line-height: 420px; z-index: 20; text-align: center;}
+.item_state.soldout .itemPic:after {content: 'SOLD OUT';position: absolute;top: 50%;left: 50%;transform: translate(-50%, -50%);width:100%;height: auto;font-size: 18px;font-weight: 500;color: #fff;z-index: 30;text-align: center; opacity: 1; background: transparent;}
+.item_state.soldout .itemPic:before {content:''; position: absolute; top: 50%; left: 50%; font-size: 28px; font-weight: 500; color:#fff; background: rgba(0,0,0,.7); width: 100%; height: 100%; transform:translate(-50%, -50%); line-height: 420px; z-index: 20; text-align: center;}
 .item_state.AD .itemPic:before {content:'AD'; position: absolute; bottom: 20px; right: 20px; font-size: 14px; font-weight: 300; letter-spacing: -0.025em; color:#888888; width: auto; height: auto; line-height: 14px; z-index: 21; text-align: right;}
 @media (max-width: 1919px) and (min-width: 1401px){/* .item_state {padding-left: 6px;padding-right: 6px;} */}
 .hgbgCa {width: 100%;height: 100%;}

+ 8 - 7
src/main/webapp/ux/pc/css/layout.css

@@ -333,7 +333,7 @@ ul.maintabs li [class^='box_depth'] {display:none; position:absolute; left:100%;
 .partners_pop .tbl.type2 table td {font-size: 14px; font-weight: 300; color:#666;}
 
 /* 퀵메뉴 */
-#quick_menu {position:fixed; bottom:0; right:0; z-index:100; /*padding-left: 60px;*/}
+#quick_menu {position:fixed; bottom:0; right:0; z-index:102; /*padding-left: 60px;*/}
 #quick_menu.active {right: 0;}
 #quick_menu:before {content:''; position: fixed; bottom: 0; left: 0; width: 100%; height: 100%; background: rgba(0,0,0,.5); display: none;}
 #quick_menu.active:before {display: block;}
@@ -362,12 +362,13 @@ ul.maintabs li [class^='box_depth'] {display:none; position:absolute; left:100%;
 /* 퀵메뉴_최근 본 상품 */
 #quick_menu .history .itemsGrp {margin:0 -7px;}
 #quick_menu .history .item_prod {width: 50%;}
-#quick_menu .history .item_state {padding:0 7px 14px;}
+#quick_menu .history .item_state {padding:0; margin:0 7px 14px;}
 #quick_menu .history .itemPic {margin-bottom: 0;}
 #quick_menu .history .no_item {display: none;}
 #quick_menu .history .quick_body.nodata .item_prod, #quick_menu .quick_con .quick_body.nodata .product_count {display: none;}
 #quick_menu .history .quick_body.nodata .item_prod {display: none;}
 #quick_menu .history .quick_body.nodata .no_item {display: block; line-height: 700px; text-align: center; font-size: 16px; color: #888;}
+#quick_menu .itemsGrp:not(.rowtype) .item_prod .item_state.soldout::before {top: 50%; transform:translate(-50%, -50%);}
 
 /* 퀵메뉴_쇼핑백 */
 .itemsGrp {margin-bottom:0;}
@@ -393,9 +394,9 @@ ul.maintabs li [class^='box_depth'] {display:none; position:absolute; left:100%;
 #quick_menu .shopingbag .itemsGrp .item_prod .itemLike {z-index: 99;}
 #quick_menu .shopingbag .itemsGrp .item_prod .itemPic {position: absolute; top: 0; left: 0; margin-bottom: 0; width: 120px; padding-top: 180px;}
 #quick_menu .shopingbag .itemsGrp .item_prod .itemPic .shape {z-index: 89;}
-#quick_menu .shopingbag .itemsGrp .item_prod .itemPic::after {background: #f9f9f9; opacity:1; z-index: 87;}
-#quick_menu .shopingbag .itemsGrp .item_prod .itemPic .pd_img {z-index: 88;}
-#quick_menu .shopingbag .itemsGrp .item_state.soldout .itemPic:before {content:'SOLD OUT'; position: absolute; top: 50%; left: 50%; font-size: 20px; color:#fff; background: rgba(0,0,0,.5); width: 100%; height: 100%; transform:translate(-50%, -50%); line-height: 420px; z-index: 1; text-align: center;}
+/* #quick_menu .shopingbag .itemsGrp .item_prod .itemPic::after {background: #f9f9f9; opacity:1; z-index: 87;}
+ #quick_menu .shopingbag .itemsGrp .item_prod .itemPic .pd_img {z-index: 88;}
+ #quick_menu .shopingbag .itemsGrp .item_state.soldout .itemPic:before {content:'SOLD OUT'; position: absolute; top: 50%; left: 50%; font-size: 20px; color:#fff; background: rgba(0,0,0,.5); width: 100%; height: 100%; transform:translate(-50%, -50%); line-height: 420px; z-index: 1; text-align: center;} */
 #quick_menu .shopingbag .itemsGrp .item_prod .itemBrand {margin:0px 0 15px; font-size: 12px; line-height:14px; font-weight: 300;}
 #quick_menu .shopingbag .itemsGrp .item_prod .itemComment {font-size: 12px;margin-left: 0;}
 #quick_menu .shopingbag .itemsGrp .item_prod .itemName {margin:0px 0 13px; font-size: 14px; font-weight: 300; line-height: 1.5; max-height:44px; overflow:hidden;}
@@ -3804,7 +3805,7 @@ ul.maintabs li [class^='box_depth'] {display:none; position:absolute; left:100%;
 	.sch_result .cont_body .sch_result_cont .exhi_list .item_prod:nth-child(5n+0) {margin-right: 0;}
 	.sch_result .cont_body .sch_result_cont .exhi_list .item_prod:nth-child(6n+0) {margin-right: 20px;}
 	.sch_result .cont_body .sch_result_cont .exhi_list .itemsGrp {margin-bottom: 80px;}
-	.sch_result .cont_body .sch_result_cont .exhi_list .itemsGrp .exhi_item {float:left; width: calc((100% - 60px)/4); overflow: hidden; margin:0 20px 80px 0;}
+	.sch_result .cont_body .sch_result_cont .exhi_list .itemsGrp .exhi_item {float:left; width: calc((100% - 60px)/4); overflow: hidden; margin:0 20px 80px 0; min-height:717px;}
 	.sch_result .cont_body .sch_result_cont .exhi_list .itemsGrp .exhi_item:nth-child(4n) {margin:0 0 40px 0;}
 	.sch_result .cont_body .sch_result_cont .exhi_list .itemsGrp .exhi_item .exhi_item_img {width: 100%; height: auto; overflow: hidden;} 
 	.sch_result .cont_body .sch_result_cont .exhi_list .itemsGrp .exhi_item .exhi_item_img img {position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); width: 100%; height:auto;}
@@ -4471,7 +4472,7 @@ ul.maintabs li [class^='box_depth'] {display:none; position:absolute; left:100%;
 	.hookGrp .hook_list ul li a:hover span:after,
 	.hookGrp .hook_list ul li a:focus span:after{content: '';display: block; color: #fd4802; box-sizing: border-box; border-bottom: 1px solid #fd4802;}
 	.hookGrp .hook_cont {font-size:16px;color:#666666;line-height:26px;letter-spacing:-0.025em;}
-	.hookGrp .hook_cont div{margin-top: 0px;}
+	.hookGrp .hook_cont div{margin-top: 62px;}
 	
 	.hookGrp .hook_cont h4 {font-size:24px;font-weight:500;color:#222222;line-height:26px;letter-spacing:-0.025em;}
 	.hookGrp .hook_cont p {font-size:16px;color:#666666;line-height:26px;letter-spacing:-0.025em;}