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

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

xodud lee 5 лет назад
Родитель
Сommit
97850f4157
42 измененных файлов с 705 добавлено и 235 удалено
  1. 10 2
      src/main/java/com/style24/front/biz/dao/TsfCommonDao.java
  2. 10 0
      src/main/java/com/style24/front/biz/dao/TsfPlanningDao.java
  3. 12 5
      src/main/java/com/style24/front/biz/service/TsfCommonService.java
  4. 7 6
      src/main/java/com/style24/front/biz/service/TsfCustomerService.java
  5. 1 0
      src/main/java/com/style24/front/biz/service/TsfDisplayService.java
  6. 12 0
      src/main/java/com/style24/front/biz/service/TsfPlanningService.java
  7. 11 14
      src/main/java/com/style24/front/biz/thirdparty/SearchEngineDiquest.java
  8. 11 2
      src/main/java/com/style24/front/biz/web/TsfCustomerController.java
  9. 37 9
      src/main/java/com/style24/front/biz/web/TsfDisplayController.java
  10. 2 6
      src/main/java/com/style24/front/biz/web/TsfGoodsController.java
  11. 1 0
      src/main/java/com/style24/front/biz/web/TsfOrderController.java
  12. 8 2
      src/main/java/com/style24/front/biz/web/TsfPlanningController.java
  13. 1 0
      src/main/java/com/style24/persistence/domain/Contents.java
  14. 22 21
      src/main/java/com/style24/persistence/domain/searchengine/GoodsListResponse.java
  15. 9 0
      src/main/java/com/style24/persistence/mybatis/shop/TsfCommon.xml
  16. 77 7
      src/main/java/com/style24/persistence/mybatis/shop/TsfCoupon.xml
  17. 75 37
      src/main/java/com/style24/persistence/mybatis/shop/TsfDisplay.xml
  18. 3 10
      src/main/java/com/style24/persistence/mybatis/shop/TsfGoods.xml
  19. 23 0
      src/main/java/com/style24/persistence/mybatis/shop/TsfPlanning.xml
  20. 3 2
      src/main/webapp/WEB-INF/views/mob/SigninFormMob.html
  21. 1 1
      src/main/webapp/WEB-INF/views/mob/common/fragments/GnbMob.html
  22. 1 0
      src/main/webapp/WEB-INF/views/mob/display/LookbookDetailFormMob.html
  23. 3 0
      src/main/webapp/WEB-INF/views/mob/display/MallMainFormMob.html
  24. 1 1
      src/main/webapp/WEB-INF/views/mob/goods/GoodsDetailFormMob.html
  25. 19 1
      src/main/webapp/WEB-INF/views/mob/goods/GoodsIncludeFormMob.html
  26. 18 1
      src/main/webapp/WEB-INF/views/mob/goods/GoodsReviewFormMob.html
  27. 5 4
      src/main/webapp/WEB-INF/views/mob/goods/GoodsSizeInfoFormMob.html
  28. 12 0
      src/main/webapp/WEB-INF/views/mob/order/OrderFormMob.html
  29. 46 12
      src/main/webapp/WEB-INF/views/mob/order/OrderGiftInfoMob.html
  30. 26 1
      src/main/webapp/WEB-INF/views/web/common/fragments/FooterWeb.html
  31. 3 2
      src/main/webapp/WEB-INF/views/web/display/CategoryMainFormWeb.html
  32. 1 0
      src/main/webapp/WEB-INF/views/web/display/LookbookDetailFormWeb.html
  33. 28 7
      src/main/webapp/WEB-INF/views/web/display/SearchGoodsListFormWeb.html
  34. 2 1
      src/main/webapp/WEB-INF/views/web/goods/GoodsDealDetailFormWeb.html
  35. 73 5
      src/main/webapp/WEB-INF/views/web/goods/GoodsDetailFormWeb.html
  36. 1 1
      src/main/webapp/WEB-INF/views/web/goods/GoodsDetailReviewFormWeb.html
  37. 20 1
      src/main/webapp/WEB-INF/views/web/goods/GoodsIncludeFormWeb.html
  38. 2 2
      src/main/webapp/WEB-INF/views/web/goods/GoodsReviewDetailFormWeb.html
  39. 3 3
      src/main/webapp/WEB-INF/views/web/goods/GoodsReviewFormWeb.html
  40. 7 5
      src/main/webapp/WEB-INF/views/web/goods/GoodsSizeInfoFormWeb.html
  41. 96 62
      src/main/webapp/WEB-INF/views/web/planning/PlanningDetailFormWeb.html
  42. 2 2
      src/main/webapp/ux/style24_link.js

+ 10 - 2
src/main/java/com/style24/front/biz/dao/TsfCommonDao.java

@@ -62,7 +62,7 @@ public interface TsfCommonDao {
 //	 * @since 2020. 08. 10
 //	 */
 //	void saveMobileDevice(TsfMobileDevice mobileDevice);
-	
+
 	/**
 	 * 주문배송지정보수정
 	 *
@@ -72,7 +72,7 @@ public interface TsfCommonDao {
 	 * @since 2021. 04. 02
 	 */
 	int updateDeliverAddr(Order order);
-	
+
 	/**
 	 * 주문배송지정보수정
 	 *
@@ -83,4 +83,12 @@ public interface TsfCommonDao {
 	 */
 	int updateDeliverAddrDelvMemo(Order order);
 
+	/**
+	 * 검색엔진 연동 여부
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 6. 3
+	 */
+	String getSearchEngineSyncYn();
+
 }

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

@@ -492,4 +492,14 @@ public interface TsfPlanningDao {
 	 */
 	Integer getShotPlanSq(Plan plan);
 	
+	/**
+	 * 기획전 컨텐츠 정보 
+	 *
+	 * @param 기획전 번호
+	 * @return
+	 * @author sowon
+	 * @date 2021. 6. 3
+	 */
+	Collection<Plan> getPlanContentInfo(Plan plan);
+	
 }

+ 12 - 5
src/main/java/com/style24/front/biz/service/TsfCommonService.java

@@ -84,7 +84,7 @@ public class TsfCommonService {
 //	public void saveMobileDevice(TsfMobileDevice mobileDevice) {
 //		commonDao.saveMobileDevice(mobileDevice);
 //	}
-	
+
 	/**
 	 * 주문배송지정보수정
 	 *
@@ -97,7 +97,7 @@ public class TsfCommonService {
 	public int updateDeliverAddr(Order order) {
 		return commonDao.updateDeliverAddr(order);
 	}
-	
+
 	/**
 	 * 주문배송지정보수정
 	 *
@@ -110,8 +110,15 @@ public class TsfCommonService {
 	public int updateDeliverAddrDelvMemo(Order order) {
 		return commonDao.updateDeliverAddrDelvMemo(order);
 	}
-	
-	
-	
+
+	/**
+	 * 검색엔진 연동 여부
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 6. 3
+	 */
+	public String getSearchEngineSyncYn() {
+		return commonDao.getSearchEngineSyncYn();
+	}
 
 }

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

@@ -8,6 +8,7 @@ import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpSession;
 
 import com.style24.core.biz.service.TscKakaotalkService;
+import com.style24.core.biz.service.TscMailService;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.core.env.Environment;
@@ -66,10 +67,10 @@ public class TsfCustomerService {
 	private TscKakaotalkService kakaotalkService;
 
 	@Autowired
-	private ObjectMapper objectMapper;
+	private TscMailService mailService;
 
 	@Autowired
-	private Environment env;
+	private ObjectMapper objectMapper;
 
 	/**
 	 * 고객아이디 찾기
@@ -296,7 +297,7 @@ public class TsfCustomerService {
 			// 이메일 발송
 			try {
 				if (StringUtils.isNotBlank(customer.getEmail())) {
-					// TODO : 2021.02.23 이메일 모듈 개발 필요 jsshin
+					mailService.sendJoinCongrat(customer, coupon, customer.getCustNo());
 				}
 			} catch (Exception e) {
 				log.error("error", e);
@@ -351,16 +352,16 @@ public class TsfCustomerService {
 					kakaotalkService.sendJoinCongrat(customer, coupon, customer.getCustNo());
 				}
 			} catch (Exception e) {
-				//log.error("error", e);
+				log.error("error", e);
 			}
 
 			// 이메일 발송
 			try {
 				if (StringUtils.isNotBlank(customer.getEmail())) {
-					// TODO : 2021.02.23 이메일 모듈 개발 필요 jsshin
+					mailService.sendJoinCongrat(customer, coupon, customer.getCustNo());
 				}
 			} catch (Exception e) {
-				//log.error("error", e);
+				log.error("error", e);
 			}
 		}
 

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

@@ -411,6 +411,7 @@ public class TsfDisplayService {
 			tempContents.setMaxRow(20);
 			tempContents.setCustNo(TsfSession.isLogin() ? TsfSession.getInfo().getCustNo() : 0);
 			if ("SMM007".equals(data.getContentsLoc())) {
+				data.setFrontGb(TsfSession.getFrontGb());
 				data.setBannerList(displayDao.getContentsBannerList(data));
 			}
 			data.setGoodsList(goodsDao.getContentsCategoryGoodsList(tempContents));

+ 12 - 0
src/main/java/com/style24/front/biz/service/TsfPlanningService.java

@@ -683,4 +683,16 @@ public class TsfPlanningService {
 		return planningDao.getShotPlanSq(plan);
 	}
 	
+	/**
+	 * 기획전 컨텐츠 정보 
+	 *
+	 * @param 기획전 번호
+	 * @return
+	 * @author sowon
+	 * @date 2021. 6. 3
+	 */
+	 public Collection<Plan> getPlanContentInfo(Plan plan) {
+		 return planningDao.getPlanContentInfo(plan);
+	 }
+	
 }

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

@@ -16,11 +16,11 @@ import com.diquest.ir.common.exception.IRException;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.google.gson.Gson;
 import com.style24.front.biz.dao.TsfDisplayDao;
-import com.style24.front.support.security.session.TsfSession;
 import com.style24.persistence.domain.Cate1;
 import com.style24.persistence.domain.searchengine.CateResponse;
 import com.style24.persistence.domain.searchengine.Filter;
 import com.style24.persistence.domain.searchengine.FilterResponse;
+import com.style24.persistence.domain.searchengine.GoodsListResponse;
 import com.style24.persistence.domain.searchengine.SearchEngine;
 
 import istyle.AutoSearch;
@@ -102,7 +102,6 @@ public class SearchEngineDiquest {
 		paramMap.put("adminPort", port);
 //		paramMap.put("cate1No", 1300);
 //		paramMap.put("brandGroupNo", 0);
-		paramMap.put("frontGb", TsfSession.getFrontGb());
 //		paramMap.put("keyword", "키즈");
 //		paramMap.put("formalGb", "G009_20");
 
@@ -144,7 +143,6 @@ public class SearchEngineDiquest {
 		Map<String, Object> paramMap = this.convertObjectToMap(params);
 		paramMap.put("adminIp", ipAddr);
 		paramMap.put("adminPort", port);
-		paramMap.put("frontGb", TsfSession.getFrontGb());
 		log.info("///[getFilterList] paramMap: {}", paramMap);
 
 		try {
@@ -172,25 +170,24 @@ public class SearchEngineDiquest {
 	 * @author gagamel
 	 * @since 2021. 5. 31
 	 */
-	@SuppressWarnings("unchecked")
-	public SearchEngine getGoodsList(SearchEngine params) {
-		SearchEngine result = new SearchEngine();
+	public GoodsListResponse getGoodsList(SearchEngine params) {
+		GoodsListResponse result = new GoodsListResponse();
 
 		Map<String, Object> paramMap = this.convertObjectToMap(params);
 		paramMap.put("adminIp", ipAddr);
 		paramMap.put("adminPort", port);
-		log.info("{}", paramMap);
+		paramMap.put("pageNumber", "1");
+		paramMap.put("rowsPerPage", "30");
+		log.info("///[getGoodsList] paramMap: {}", paramMap);
 
 		try {
 			JSONObject jsonObj = SearchService.getGoodsList(paramMap);
-			log.info("jsonObj.toJSONString(): {}", jsonObj.toJSONString());
+			log.info("///[getGoodsList] jsonObj: {}", jsonObj.toJSONString());
 
-			Gson gson = new Gson();
-			Map<String, Object> resMap = gson.fromJson(jsonObj.toJSONString(), Map.class);
-			log.info("{}", resMap);
-
-			if (resMap.get("returnCode").equals("1")) { // 성공
-				result = gson.fromJson(resMap.get("response").toString(), SearchEngine.class);
+			if (jsonObj.get("returnCode").toString().equals("1")) { // 성공
+				Gson gson = new Gson();
+				result = gson.fromJson(jsonObj.toJSONString(), GoodsListResponse.class);
+				log.info("///[getGoodsList] result: {}", result);
 			}
 		} catch (Exception e) {
 			e.printStackTrace();

+ 11 - 2
src/main/java/com/style24/front/biz/web/TsfCustomerController.java

@@ -3,6 +3,7 @@ package com.style24.front.biz.web;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpSession;
 
+import com.style24.core.biz.service.TscMailService;
 import com.style24.front.biz.service.TsfCouponService;
 import com.style24.persistence.domain.Coupon;
 import org.apache.commons.lang3.StringUtils;
@@ -57,6 +58,9 @@ public class TsfCustomerController extends TsfBaseController {
 	@Autowired
 	private TscKakaotalkService kakaotalkService;
 
+	@Autowired
+	private TscMailService mailService;
+
 	@Autowired
 	private NiceCertify niceCertify;
 
@@ -187,8 +191,13 @@ public class TsfCustomerController extends TsfBaseController {
 			// 비밀번호 수정
 			customerService.saveCustomerPassword(customer);
 
-			if (StringUtils.isNotBlank(customer.getCellPhnno())) {
-				kakaotalkService.sendCustomerTempPassword(customer, customer.getCustNo());
+			if (StringUtils.isNotBlank(customer.getEmail())) {
+				try {
+					mailService.sendCustomerTempPassword(customer, customer.getCustNo());
+				} catch (Exception e) {
+					log.error(e.getMessage());
+				}
+
 			}
 		}
 

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

@@ -25,6 +25,7 @@ import com.style24.core.biz.service.TscEnvsetService;
 import com.style24.core.biz.service.TscLookbookService;
 import com.style24.core.support.env.TscConstants;
 import com.style24.core.support.message.TscMessageByLocale;
+import com.style24.front.biz.service.TsfCommonService;
 import com.style24.front.biz.service.TsfDisplayService;
 import com.style24.front.biz.service.TsfGoodsService;
 import com.style24.front.biz.service.TsfPlanningService;
@@ -47,6 +48,7 @@ import com.style24.persistence.domain.Plan;
 import com.style24.persistence.domain.Popup;
 import com.style24.persistence.domain.Social;
 import com.style24.persistence.domain.searchengine.Filter;
+import com.style24.persistence.domain.searchengine.GoodsListResponse;
 import com.style24.persistence.domain.searchengine.SearchEngine;
 
 import lombok.extern.slf4j.Slf4j;
@@ -89,6 +91,9 @@ public class TsfDisplayController extends TsfBaseController {
 	@Autowired
 	private SearchEngineDiquest diquest;
 
+	@Autowired
+	private TsfCommonService commonService;
+
 	/**
 	 * PC보기. 모바일에서 <PC> 형태로 볼 때
 	 * @return
@@ -948,18 +953,29 @@ public class TsfDisplayController extends TsfBaseController {
 		SearchEngine params = new SearchEngine();
 		params.setKeyword(keyword);
 		params.setBrandGroupNo(brandGroupNo == null ? 0 : brandGroupNo);
+		params.setFrontGb(TsfSession.getFrontGb());
 
 		ModelAndView mav = new ModelAndView(super.getDeviceViewName("display/SearchGoodsListForm"));
 
 //		mav.addObject("cateInfo", params);
 
-		// 상품검색키워드 카테고리 목록
-		mav.addObject("cateList", diquest.getCategoryList(params));
-//		mav.addObject("cateList", displayService.getKeywordCategoryList(params.getKeyword()));
+		Collection<Filter> filterList = new ArrayList<Filter>();
 
-		// 상품리스트 카테고리별 필터 목록
-		Collection<Filter> filterList = diquest.getFilterList(params);
-//		Collection<Filter> filterList = displayService.getSearchGoodsListCategoryFilterList(params);
+		// 검색엔진 연동 여부
+		String syncYn = commonService.getSearchEngineSyncYn();
+		if (syncYn.equals("Y")) { // 검색엔진을 통한 상품리스트 조회
+			// 상품검색키워드 카테고리 목록
+			mav.addObject("cateList", diquest.getCategoryList(params));
+
+			// 상품리스트 카테고리별 필터 목록
+			filterList = diquest.getFilterList(params);
+		} else { // DB를 통한 상품리스트 조회
+			// 상품검색키워드 카테고리 목록
+			mav.addObject("cateList", displayService.getKeywordCategoryList(params.getKeyword()));
+
+			// 상품리스트 카테고리별 필터 목록
+			filterList = displayService.getSearchGoodsListCategoryFilterList(params);
+		}
 
 		// 필터 설정
 		mav.addObject("filterBrandList", displayService.getCategoryFilterList(filterList, "BRAND"));
@@ -994,10 +1010,22 @@ public class TsfDisplayController extends TsfBaseController {
 		params.setFrontGb(TsfSession.getFrontGb());
 		params.setCustGb(TsfSession.getCustGb());
 
-		pageable.setTotalCount(goodsService.getSearchGoodsCount(params));
-		params.setPageable(pageable);
+		Collection<SearchEngine> dataList = new ArrayList<SearchEngine>();
+
+		// 검색엔진 연동 여부
+		String syncYn = commonService.getSearchEngineSyncYn();
+		if (syncYn.equals("Y")) { // 검색엔진을 통한 상품리스트 조회
+			GoodsListResponse response = diquest.getGoodsList(params);
+			pageable.setTotalCount(response.getTotalCount());
+			dataList = response.getResponse();
+		} else { // DB를 통한 상품리스트 조회
+			pageable.setTotalCount(goodsService.getSearchGoodsCount(params));
+			params.setPageable(pageable);
+			dataList = goodsService.getSearchGoodsList(params);
+		}
+
 		result.set("paging", pageable);
-		result.set("dataList", goodsService.getSearchGoodsList(params));
+		result.set("dataList", dataList);
 
 		return result;
 	}

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

@@ -295,11 +295,7 @@ public class TsfGoodsController extends TsfBaseController {
 			contents.setPreview(paramsGoods.getPreview());
 			contents.setViewDt(paramsGoods.getViewDt());
 			contents.setMaxRow(1);
-			if ("P".equals(paramsGoods.getFrontGb())) {
-				contents.setCateNo(1714);
-			} else {
-				contents.setCateNo(1724);
-			}
+			contents.setCateNo(1714);
 			mav.addObject("goodsBannerList", displayService.getContentsList(contents));
 		}
 
@@ -1457,7 +1453,7 @@ public class TsfGoodsController extends TsfBaseController {
 	 * @since 2021. 3. 26
 	 */
 	@PostMapping("/detail/review/frame")
-	public ModelAndView goodsDetailReviewForm(Goods paramsGoods) {
+	public ModelAndView goodsDetailReviewForm(@RequestBody Goods paramsGoods) {
 		ModelAndView mav = new ModelAndView();
 		// 상품관련 기본값 설정(회원 등급, 앱, PC/모바일 등)
 		setGoods(paramsGoods);

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

@@ -480,6 +480,7 @@ public class TsfOrderController extends TsfBaseController {
 		ModelAndView mav = new ModelAndView();
 		mav.addObject("order"				, order);									// 파라미터
 		mav.addObject("isLogin"				, TsfSession.isLogin());					// 로그인여부
+		mav.addObject("frontGb"				, TsfSession.getFrontGb());					// 디바이스구분
 		mav.setViewName(super.getDeviceViewName("order/OrderGiftInfo"));
 		
 		return mav;

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

@@ -198,11 +198,15 @@ public class TsfPlanningController extends TsfBaseController {
 		mav.addObject("fsrcInfoBtm", planningService.getPlanFsrcInfo(plan));
 
 		// 리뷰
+		plan.setTmplType("G082_10");
 		mav.addObject("reviewInfo", planningService.getPlanReviewInfo(review));
+		mav.addObject("reviewContent", planningService.getPlanContentInfo(plan));
 
 		// 쿠폰
+		plan.setTmplType("G082_20");
 		mav.addObject("couponInfo", planningService.getPlanCouponInfo(coupon));
-
+		mav.addObject("couponContent", planningService.getPlanContentInfo(plan));
+		
 		// 이미지
 		mav.addObject("imageInfo", planningService.getPlanImageInfo(plan));
 		
@@ -213,15 +217,17 @@ public class TsfPlanningController extends TsfBaseController {
 		// 상품1열 전시
 		plan.setTmplType("G082_50");
 		mav.addObject("goods1Info", planningService.getPlanGoodsDisplayList(plan));
+		mav.addObject("goods1Content", planningService.getPlanContentInfo(plan));
 
 		// 상품2열 전시
 		plan.setTmplType("G082_51");
-
 		mav.addObject("goods2Info", planningService.getPlanGoodsDisplayList(plan));
+		mav.addObject("goods2Content", planningService.getPlanContentInfo(plan));
 
 		// 상품4열 전시
 		plan.setTmplType("G082_52");
 		mav.addObject("goods4Info", planningService.getPlanGoodsDisplayList(plan));
+		mav.addObject("goods4Content", planningService.getPlanContentInfo(plan));
 		
 		// 코너 목록
 		mav.addObject("planCornerList", planningService.getPlanCornerList(plan));

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

@@ -75,6 +75,7 @@ public class Contents extends TscBaseDomain {
 	private String bannerGb;		// admin:수동설정, plan:기획전
 
 	private String pageGb;	// 호출페이지 구분(MALL:몰메인, BEST:베스트메인)
+	private String frontGb; // 몰메인 브랜드픽에서 사용
 
 	//private String contentsTitle;		// 메인 타이틀(md가 설정한)
 

+ 22 - 21
src/main/java/com/style24/persistence/domain/searchengine/GoodsListResponse.java

@@ -17,26 +17,27 @@ public class GoodsListResponse implements Serializable {
 
 	private Integer returnCode;				// 응답코드(양수: 정상, 음수: 오류)
 	private int totalCount;					// 상품전체건수
-	private Collection<Goods> response;
-
-	@Data
-	public class Goods {
-		private String brandGroupNm;	// 브랜드그룹명
-		private String goodsCd;			// 상품코드
-		private String goodsFullNm;		// 상품FULL명
-		private String goodsTnm;		// 상품타이틀명
-		private int listPrice;			// 정상가
-		private int currPrice;			// 현재판매가(=혜택가)
-		private String sysImgNm;		// 상품시스템파일명(썸네일 기본 이미지)
-		private String sysImgNm2;		// 상품시스템파일명2(썸네일 마우스오버 이미지)
-		private String videos;			// 동영상들(,로 연결된 문자열. 동영상구분:미디어컨텐츠 또는 유튜브동영상ID, ...)
-		private String colorChips;		// 컬러칩들(,로 연결된 문자열. 색상코드:컬러칩, ...)
-		private String sizes;			// 사이즈들(,로 연결된 문자열. 사이즈코드:품절여부, ...)
-		private String benefits;		// 혜택들(,로 연결된 문자열. 혜택구분:혜택명, ...)
-
-		private String likeIt;			// 좋아요(위시리스트에담긴상품)
-		private String mainColorCd;		// 메인컬러
-		private String selfGoodsYn;		// 자사상품여부
-	}
+	private Collection<SearchEngine> response;
+//	private Collection<Goods> response;
+//
+//	@Data
+//	public class Goods {
+//		private String brandGroupNm;	// 브랜드그룹명
+//		private String goodsCd;			// 상품코드
+//		private String goodsFullNm;		// 상품FULL명
+//		private String goodsTnm;		// 상품타이틀명
+//		private int listPrice;			// 정상가
+//		private int currPrice;			// 현재판매가(=혜택가)
+//		private String sysImgNm;		// 상품시스템파일명(썸네일 기본 이미지)
+//		private String sysImgNm2;		// 상품시스템파일명2(썸네일 마우스오버 이미지)
+//		private String videos;			// 동영상들(,로 연결된 문자열. 동영상구분:미디어컨텐츠 또는 유튜브동영상ID, ...)
+//		private String colorChips;		// 컬러칩들(,로 연결된 문자열. 색상코드:컬러칩, ...)
+//		private String sizes;			// 사이즈들(,로 연결된 문자열. 사이즈코드:품절여부, ...)
+//		private String benefits;		// 혜택들(,로 연결된 문자열. 혜택구분:혜택명, ...)
+//
+//		private String likeIt;			// 좋아요(위시리스트에담긴상품)
+//		private String mainColorCd;		// 메인컬러
+//		private String selfGoodsYn;		// 자사상품여부
+//	}
 
 }

+ 9 - 0
src/main/java/com/style24/persistence/mybatis/shop/TsfCommon.xml

@@ -78,5 +78,14 @@
 		WHERE  1=1
 		AND    DELV_ADDR_SQ         = #{delvAddrSq}
 	</update>
+	
+	<!-- 검색엔진 연동 여부 -->
+	<select id="getSearchEngineSyncYn" resultType="String">
+		/* TsfCommon.getSearchEngineSyncYn */
+		SELECT UPPER(IFNULL(USE_YN,'N')) AS SYNC_YN
+		FROM   TB_COMMON_CODE
+		WHERE  CD_GB = 'G085'
+		AND    CD = 'SEARCHSYNCYN'
+	</select>
 
 </mapper>

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

@@ -160,23 +160,92 @@
 	<!--회원가입 쿠폰-->
 	<select id="getJoinCoupon" parameterType="Coupon" resultType="Coupon">
 		/* TsfCoupon.getJoinCoupon */
+		WITH TAB_COUPON_REFVAL1 AS (
+		    SELECT CR.CPN_ID
+		         , CR.CPN_TARGET
+		         , CASE WHEN CR.CPN_TARGET = 'G260_10' /*상품*/ THEN (SELECT GOODS_NM FROM TB_GOODS WHERE GOODS_CD = CR.REF_VAL AND GOODS_STAT = 'G008_90')
+		                WHEN CR.CPN_TARGET = 'G260_11' /*카테고리*/ THEN
+		                    CASE WHEN IFNULL((SELECT COUNT(1) FROM TB_CATE_4SRCH WHERE CATE1_NO = CR.REF_VAL),0) > 0
+		                              THEN (SELECT CATE1_NM FROM TB_CATE_4SRCH WHERE CATE1_NO = CR.REF_VAL LIMIT 1)
+		                         WHEN IFNULL((SELECT COUNT(1) FROM TB_CATE_4SRCH WHERE CATE2_NO = CR.REF_VAL),0) > 0
+		                              THEN (SELECT CONCAT(CATE1_NM,' > ',CATE2_NM) FROM TB_CATE_4SRCH WHERE CATE2_NO = CR.REF_VAL LIMIT 1)
+		                         WHEN IFNULL((SELECT COUNT(1) FROM TB_CATE_4SRCH WHERE CATE3_NO = CR.REF_VAL),0) > 0 THEN (SELECT CONCAT(CATE1_NM,' > ',CATE2_NM) FROM TB_CATE_4SRCH WHERE CATE3_NO = CR.REF_VAL LIMIT 1)
+		                         WHEN IFNULL((SELECT COUNT(1) FROM TB_CATE_4SRCH WHERE CATE4_NO = CR.REF_VAL),0) > 0 THEN (SELECT CONCAT(CATE1_NM,' > ',CATE2_NM) FROM TB_CATE_4SRCH WHERE CATE4_NO = CR.REF_VAL LIMIT 1)
+		                    END
+		                WHEN CR.CPN_TARGET = 'G260_12' /*브랜드*/ THEN (SELECT BRAND_KNM FROM TB_BRAND WHERE BRAND_CD = CR.REF_VAL AND USE_YN = 'Y')
+		                WHEN CR.CPN_TARGET = 'G260_13' /*업체*/ THEN (SELECT SUPPLY_COMP_NM FROM TB_SUPPLY_COMPANY WHERE SUPPLY_COMP_CD = CR.REF_VAL AND USE_YN = 'Y' AND SUPPLY_STAT = 'G010_30')
+		           END AS REF_VAL
+		         , RANK() OVER(PARTITION BY CR.CPN_ID, CR.CPN_TARGET ORDER BY REF_VAL) AS RK
+		    FROM   TB_COUPON_REFVAL CR
+		    WHERE  CR.CPN_TARGET != 'G260_14' /*제외상품아닌넘*/
+		    AND    CR.CPN_ID = (
+		                        SELECT GRADE_CPN_ID1
+		                        FROM   TB_CUST_GRADE_POLICY
+		                        WHERE  GRADE_CD = #{custGrade}
+		                        AND    USE_YN = 'Y'
+                                )
+		)
+		, TAB_COUPON_REFVAL2 AS (
+		    SELECT CPN_ID
+		         , CPN_TARGET
+		         , GROUP_CONCAT(REF_VAL ORDER BY RK ASC SEPARATOR '/' ) AS REF_VAL
+		         , (SELECT COUNT(*)
+		            FROM   TAB_COUPON_REFVAL1
+		            WHERE  CPN_ID = CR.CPN_ID
+		            AND    CPN_TARGET = CR.CPN_TARGET)                  AS CNT
+		    FROM   TAB_COUPON_REFVAL1 CR
+		    WHERE  1 = 1
+		    AND    (
+		            (CPN_TARGET != 'G260_12' AND RK = 1) /*브랜드 외는 1개만 노출*/
+		            OR
+		            (CPN_TARGET = 'G260_12' AND RK <![CDATA[<=]]> 2) /*브랜드만 2개 노출*/
+		           )
+		    GROUP  BY CPN_ID, CPN_TARGET
+		)
 		SELECT CP.CPN_ID
 		     , CP.END_ALIM_YN
 		     , CASE WHEN #{frontGb} = 'P' THEN CP.DC_PVAL
 		            WHEN #{frontGb} = 'M' THEN CP.DC_MVAL
 		            WHEN #{frontGb} = 'A' THEN CP.DC_AVAL
 		            ELSE CP.DC_AVAL                                              END AS DC_VAL
+		     , CASE WHEN CP.DC_WAY = 'G240_10' THEN '원'
+		            ELSE '%'
+		       END                                                                   AS DC_WAY
 		     , CASE WHEN CP.PD_GB = 'D' THEN DATE_FORMAT(NOW(), '%Y%m%d%H%i%S')
-		            ELSE DATE_FORMAT(CP.AVAIL_STDT, '%Y%m%d%H%i%S')              END AS AVAIL_STDT
+		            ELSE DATE_FORMAT(CP.AVAIL_STDT, '%Y%m%d%H%i%S')                END AS AVAIL_STDT
 		     , CASE WHEN CP.PD_GB = 'D' THEN DATE_FORMAT(CONCAT(CURRENT_DATE + INTERVAL CP.AVAIL_DAYS DAY, ' 23:59:59'), '%Y%m%d%H%i%S')
-		            ELSE  DATE_FORMAT(CP.AVAIL_EDDT, '%Y%m%d%H%i%S')             END AS AVAIL_EDDT
+		            ELSE  DATE_FORMAT(CP.AVAIL_EDDT, '%Y%m%d%H%i%S')               END AS AVAIL_EDDT
+		     , CASE WHEN CP.PD_GB = 'D' THEN DATE_FORMAT(NOW(), '%Y.%m.%d %H:%i')
+		            ELSE DATE_FORMAT(CP.AVAIL_STDT, '%Y.%m.%d %H:%i')              END AS AVAIL_STDT_TIME
+		     , CASE WHEN CP.PD_GB = 'D' THEN DATE_FORMAT(CONCAT(CURRENT_DATE + INTERVAL CP.AVAIL_DAYS DAY, ' 23:59:59'), '%Y.%m.%d %H:%i')
+		            ELSE  DATE_FORMAT(CP.AVAIL_EDDT, '%Y.%m.%d %H:%i')             END AS AVAIL_EDDT_TIME
 		     , CP.CPN_NM
+		     , CONCAT(CASE WHEN CP.BUY_LIMIT_AMT = 0 THEN ''
+		                    ELSE CONCAT(FORMAT(CP.BUY_LIMIT_AMT , 0),'원 이상 구매 시 ')
+		              END
+		             ,CASE WHEN CP.MAX_DC_AMT = 0 THEN ''
+		                   ELSE CONCAT('최대 ',FORMAT(CP.MAX_DC_AMT , 0),'원 할인')
+		              END
+		             )                                                                     AS USE_CONDITION
+		     , CASE WHEN CP.CUST_PUB_LIMIT_QTY = 0 THEN ''
+		            ELSE CONCAT('1인당 최대',CP.CUST_PUB_LIMIT_QTY,'매')
+		       END                                                                         AS ISSUE_CONDITION
+		     , CONCAT(CR.REF_VAL, CASE WHEN CR.CPN_TARGET = 'G260_10' AND CR.CNT > 1 THEN ' 외'
+		                               WHEN CR.CPN_TARGET = 'G260_11' AND CR.CNT > 1 THEN ' 외'
+		                               WHEN CR.CPN_TARGET = 'G260_12' AND CR.CNT > 2 THEN ' 외'
+		                               WHEN CR.CPN_TARGET = 'G260_13' AND CR.CNT > 1 THEN ' 외'
+		                               ELSE ''
+		                          END)                                                     AS TGT_CONDITION
 		FROM  TB_CUST_GRADE_POLICY CGP
 		INNER JOIN
 		      TB_COUPON CP
 		ON    CGP.GRADE_CPN_ID1 = CP.CPN_ID
+		INNER JOIN
+		      TAB_COUPON_REFVAL2 CR
+		ON    CP.CPN_ID = CR.CPN_ID
 		WHERE CGP.GRADE_CD = #{custGrade}
 		AND   CP.SITE_CD = #{siteCd}
+		AND   CGP.USE_YN = 'Y'
 	</select>
 	
 	<!--상품 쿠폰 조회-->
@@ -1001,9 +1070,10 @@
 		            GROUP  BY CC.CPN_ID, DATE_FORMAT(CC.AVAIL_STDT,'%Y.%m.%d %H:%i'), DATE_FORMAT(CC.AVAIL_EDDT,'%Y.%m.%d %H:%i')
 		           ) CC
 		         , TB_COUPON C
-		    WHERE  CC.CPN_ID = C.CPN_ID
+		    WHERE  CC.CPN_ID  = C.CPN_ID
 		    AND    C.CPN_STAT = 'G232_11' /*진행중인쿠폰*/
-		    AND    C.SITE_CD = #{siteCd}
+		    AND    C.SITE_CD  = #{siteCd}
+		    AND    C.CPN_ID   = #{cpnId}
 		)
 		, TAB_COUPON_REFVAL1 AS (
 		    SELECT CR.CPN_ID
@@ -1018,10 +1088,10 @@
 		                WHEN CR.CPN_TARGET = 'G260_12' /*브랜드*/ THEN (SELECT BRAND_KNM FROM TB_BRAND WHERE BRAND_CD = CR.REF_VAL AND USE_YN = 'Y')
 		                WHEN CR.CPN_TARGET = 'G260_13' /*업체*/ THEN (SELECT SUPPLY_COMP_NM FROM TB_SUPPLY_COMPANY WHERE SUPPLY_COMP_CD = CR.REF_VAL AND USE_YN = 'Y' AND SUPPLY_STAT = 'G010_30')
 		           END AS REF_VAL
-		         , RANK() OVER(PARTITION BY CR.CPN_ID, CR.CPN_TARGET ORDER BY REF_VAL) AS RK
-		    FROM   TAB_COUPON C LEFT OUTER JOIN TB_COUPON_REFVAL CR
-		             ON  C.CPN_ID = CR.CPN_ID
+		         , RANK() OVER(PARTITION BY CR.CPN_ID, CR.CPN_TARGET ORDER BY CR.REF_VAL) AS RK
+		    FROM     TB_COUPON_REFVAL CR
 		    WHERE    CR.CPN_TARGET != 'G260_14' /*제외상품아닌넘*/
+		    AND      CR.CPN_ID = #{cpnId}
 		)
 		, TAB_COUPON_REFVAL2 AS (
 		    SELECT CPN_ID

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

@@ -719,44 +719,82 @@
 	<!-- 몰메인 브랜드픽 조회 -->
 	<select id="getContentsBannerList" parameterType="Contents" resultType="Contents">
 		/* TsfDisplay.getContentsBannerList */
-		SELECT   CASE B.M WHEN 1 THEN A.IMG_PATH1
-						  WHEN 2 THEN A.IMG_PATH2
-						  WHEN 3 THEN A.IMG_PATH3
-						  WHEN 4 THEN A.IMG_PATH4
-						  WHEN 5 THEN A.IMG_PATH5 END IMG_PATH1
-			 ,CASE B.M WHEN 1 THEN A.STR_VAR1
-					   WHEN 2 THEN A.STR_VAR2
-					   WHEN 3 THEN A.STR_VAR3
-					   WHEN 4 THEN A.STR_VAR4
-					   WHEN 5 THEN A.STR_VAR5 END STR_VAR1
-			 ,CASE B.M WHEN 1 THEN A.STR_TITLE1
-					   WHEN 2 THEN A.STR_TITLE2
-					   WHEN 3 THEN A.STR_TITLE3
-					   WHEN 4 THEN A.STR_TITLE4
-					   WHEN 5 THEN '' END STR_TITLE1
-			 ,CASE B.M WHEN 1 THEN A.SUB_TEXT1
-					   WHEN 2 THEN A.SUB_TEXT2
-					   WHEN 3 THEN A.SUB_TEXT3
-					   WHEN 4 THEN A.SUB_TEXT4
-					   WHEN 5 THEN '' END SUB_TEXT1
+		SELECT BRAND_GROUP_NO
+			 , IMG_PATH1
+			 , IMG_PATH2
+			 , STR_VAR1
+			 , STR_VAR2
+			 , STR_TITLE1
+			 , STR_TITLE2
+			 , SUB_TEXT1
+			 , SUB_TEXT2
 		FROM (
-			  (SELECT	BRAND_GROUP_NO
-					, IMG_PATH1 , IMG_PATH2 , IMG_PATH3 , IMG_PATH4, IMG_PATH5
-					, STR_VAR1 , STR_VAR2 , STR_VAR3 , STR_VAR4 , STR_VAR5
-					, STR_TITLE1 , STR_TITLE2 , STR_TITLE3 , STR_TITLE4
-					, SUB_TEXT1 , SUB_TEXT2 , SUB_TEXT3 , SUB_TEXT4
-			   FROM	TB_CONTENTS
-			   WHERE	CONTENTS_LOC = #{contentsLoc}
-				 AND		BRAND_GROUP_NO = #{brandGroupNo}
-			  ) A
-				 ,(
-			  SELECT 1 M
-			  UNION ALL SELECT 2
-			  UNION ALL SELECT 3
-			  UNION ALL SELECT 4
-			  UNION ALL SELECT 5
-				 ) B
-				 )
+				 SELECT BRAND_GROUP_NO
+					  , IMG_PATH1
+					  , IMG_PATH2
+					  , STR_VAR1
+					  , STR_VAR2
+					  , STR_TITLE1
+					  , STR_TITLE2
+					  , SUB_TEXT1
+					  , SUB_TEXT2
+				 FROM TB_CONTENTS
+				 WHERE 1 = 1
+				   AND CONTENTS_LOC = #{contentsLoc}
+				   AND NOW() BETWEEN DISP_STDT AND DISP_EDDT
+				   AND USE_YN = 'Y'
+				   AND BRAND_GROUP_NO = #{brandGroupNo}
+				 UNION ALL
+				 SELECT BRAND_GROUP_NO
+					  , IMG_PATH1
+					  , IMG_PATH2
+					  , STR_VAR1
+					  , STR_VAR2
+					  , STR_TITLE1
+					  , STR_TITLE2
+					  , SUB_TEXT1
+					  , SUB_TEXT2
+				 FROM (
+						  SELECT BRAND_CD                      AS BRAND_GROUP_NO
+							   , ORG_TNFILE_NM                 AS IMG_PATH1
+							   , ''                            AS IMG_PATH2
+							   , CONCAT('/display/lookbook/detail/form?lookbookGb=L&amp;lookbookSq=',LOOKBOOK_SQ ,'&amp;brandCd=',BRAND_CD) AS STR_VAR1
+							   , ''                            AS STR_VAR2
+							   , TITLE                         AS STR_TITLE1
+							   , ''                            AS STR_TITLE2
+							   , ''                            AS SUB_TEXT1
+							   , ''                            AS SUB_TEXT2
+						  FROM TB_LOOKBOOK
+						  WHERE 1 = 1
+							AND BRAND_CD = #{brandGroupNo}
+							AND NOW() BETWEEN DISP_STDT AND DISP_EDDT
+							AND DISP_YN = 'Y'
+						  ORDER BY REG_DT DESC
+						  LIMIT 1
+					  ) A
+				 UNION ALL
+				 SELECT PB.BRAND_GROUP_NO
+					  , P.MAIN_PIMG                                        AS IMG_PATH1
+					  , ''                                                 AS IMG_PATH2
+					  , CONCAT('/planning/detail/form?planSq=', P.PLAN_SQ) AS STR_VAR1
+					  , ''                                                 AS STR_VAR2
+					  , P.DTL_TITLE1                                       AS STR_TITLE1
+					  , P.DTL_TITLE2                                       AS STR_TITLE2
+					  , ''                                                 AS SUB_TEXT1
+					  , ''                                                 AS SUB_TEXT2
+				 FROM TB_PLAN P
+						  INNER JOIN TB_PLAN_BRAND PB ON P.PLAN_SQ = PB.PLAN_SQ AND PB.DISP_YN = 'Y'
+				 WHERE 1 = 1
+				   AND BRAND_GROUP_NO = #{brandGroupNo}
+				   AND NOW() BETWEEN DISP_STDT AND DISP_EDDT
+				   AND PLAN_GB = 'P'
+				   AND DEL_YN = 'N'
+				   AND OPEN_YN = 'Y'
+				<if test="frontGb != null and frontGb != ''">
+				   AND FRONT_GB LIKE CONCAT('%',#{frontGb},'%')
+				</if>
+			 ) AS Z
+		LIMIT 5
 	</select>
 
 	<!-- 상품리스트 카테고리별 필터 목록 -->

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

@@ -765,7 +765,7 @@
 		INNER JOIN TB_NOTICE_GOODS B ON A.NOTICE_SQ = B.NOTICE_SQ
 		                             AND B.GOODS_CD = #{goodsCd}
 		WHERE  A.NOTICE_TYPE = 'G047_30'
-		AND NOW() BETWEEN A.NOTICE_STDT AND A.NOTICE_EDDT
+		AND CURRENT_DATE() BETWEEN A.NOTICE_STDT AND A.NOTICE_EDDT
 		AND A.USE_YN  = 'Y'
 		ORDER  BY A.NOTICE_SQ DESC
 	</select>
@@ -878,7 +878,7 @@
 		    AND A.TMTB_SQ IN (SELECT TMTB_SQ FROM TB_TMTB_APPLY_GOODS WHERE GOODS_CD = #{goodsCd} AND DEL_YN = 'N' AND GOODS_GB IN ( 'G800_10', 'G800_20')) -- 기본과 적용상품
 		    AND A.TMTB_SQ NOT IN (SELECT TMTB_SQ FROM TB_TMTB_APPLY_GOODS WHERE GOODS_CD = #{goodsCd} AND DEL_YN = 'N' AND GOODS_GB = 'G800_30') -- 제외상품
 		     ]]>
-		    ORDER BY A.TMTB_SQ DESC
+		    -- ORDER BY A.TMTB_SQ DESC
 		    ) Z
 		WHERE RNUM <![CDATA[<= ]]>#{maxRownum}
 		)
@@ -1538,14 +1538,7 @@
 		    </otherwise>
 		</choose>
 		<if test="pageable != null and pageable.endRow != null and pageable.endRow > 0">
-		    <choose>
-		        <when test="pageGb == 'BEST' and pageable.endRow >= 100">
-		    LIMIT 100
-		        </when>
-		        <otherwise>
-		    LIMIT #{pageable.limitStartRow} , #{pageable.pageSize}
-		        </otherwise>
-		    </choose>
+			LIMIT #{pageable.limitStartRow} , #{pageable.pageSize}
 		</if>
 		<if test="maxRow != null and maxRow !=''">
 		    LIMIT #{maxRow}

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

@@ -1695,4 +1695,27 @@
 		ORDER BY REG_DT DESC LIMIT 1
 	</select>
 	
+	<select id="getPlanContentInfo" resultType="Plan" parameterType="Plan">
+		/* TsfPlanning.getPlanContentInfo */	
+		SELECT PLAN_SQ 
+		     , PLAN_CONT_SQ 
+		     , TITLE 
+		     , LINK_URL 
+		     , LINK_OPEN_GB 
+		     , CPN_NOTE0 
+		     , CPN_NOTE1 
+		     , CPN_NOTE2 
+		     , CPN_NOTE3 
+		     , CPN_NOTE4 
+		     , CPN_NOTE5 
+		     , CPN_NOTE6 
+		     , CPN_NOTE7 
+		     , CPN_NOTE8 
+		     , CPN_NOTE9 
+		FROM TB_PLAN_CONTENTS
+		WHERE PLAN_SQ = #{planSq}
+		AND TMPL_TYPE = #{tmplType}
+		AND DISP_YN = 'Y'
+	</select>
+	
 </mapper>

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

@@ -201,13 +201,14 @@
 		}
 		// 비밀번호 틀린 경우
 		if (!gagajf.isNull(result.message)) {
-			grecaptcha.reset(); // 리캡챠 리셋
 			let loginFailCnt = Number(result.loginFailInfo.loginFailCnt);
 			$("#err_msg").html(result.message);
 			$("#login_fail_cnt").html(loginFailCnt);
 			$("#login_remain_cnt").html(10 - loginFailCnt);
 			$(".t_err_login_fail").show();
-
+			if (loginFailCnt >= 5) {
+				grecaptcha.reset();
+			}
 			// 비밀번호 5회 이상 틀린 경우 캡챠 노출
 			if (loginFailCnt >= 5 && loginFailCnt < 10) {
 				$('#recaptcha').show();

+ 1 - 1
src/main/webapp/WEB-INF/views/mob/common/fragments/GnbMob.html

@@ -61,7 +61,7 @@
 	</div>
 
 	<!-- 210510_추가 : 띠배너 추가. -->
-	<div class="bnrtype_banner" id="divTopbanner">
+	<div class="bnrtype_banner" id="divTopbanner" style="display:none;">
 <!--		<a href="javascript:;" target="">-->
 <!--			&lt;!&ndash; 텍스트 영역 &ndash;&gt;-->
 <!--			<div>-->

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

@@ -241,6 +241,7 @@
 		let goodsIdx = 0;
 
 		$target.each(function(){
+			params = [];
 			goodsIdx ++;
 			if ($(this).hasClass('unable')) {
 

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

@@ -791,6 +791,9 @@
 		}
 		// 컨텐츠 호출
 		$(document).ready(function() {
+			// 몰메인 띠배너 표출
+			$("#divTopbanner").show();
+
 			setHtop();
 			let randomNum = Math.floor( ( Math.random() * 4 ) );
 			$(".it_nav .btn").eq(randomNum).trigger('click');

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

@@ -2189,10 +2189,10 @@
 		let $target = $obj.parent().parent().parent().find('.swiper-container').find('.item_prod');
 		let goodsSize = $target.length;
 		let btnType = "C";
-		let params = [];
 		let goodsIdx = 0;
 		
 		$target.each(function(){
+			let params = [];
 			goodsIdx ++; 
 			if ($(this).hasClass('unable')) {
 				

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

@@ -321,7 +321,25 @@
 	
 	// 구성 상품 상세 상품평
 	var fnGoodsDetailReview = function(params) {
-		gagajf.ajaxSubmit("/goods/detail/review/frame", "html", "goodsDealReview", params);
+		//gagajf.ajaxSubmit("/goods/detail/review/frame", "html", "goodsDealReview", params);
+		$.ajax( {
+			type		: "POST",
+			url 		: '/goods/detail/review/frame',
+			data		: JSON.stringify(params),
+			dataType 	: 'html',
+			beforeSend : function(xhr, settings) {
+				xhr.setRequestHeader("AJAX"			, "true");
+				xhr.setRequestHeader('Accept'		, 'application/json');
+				xhr.setRequestHeader('Content-Type'	, 'application/json');
+			},
+			success 	: function(result) {
+				if (result != null) {
+					$("#goodsDealReview").css("display", "block");
+					$("#goodsDealReview").html(result);
+				}
+			}
+		});
+		
 	}
 	
 	// 상품평 상품선택시

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

@@ -45,7 +45,24 @@
 	
 	// 구성 상품 상세 상품평
 	var fnGoodsDetailReview = function(params) {
-		gagajf.ajaxSubmit("/goods/detail/review/frame", "html", "goodsDealReview", params);
+		// gagajf.ajaxSubmit("/goods/detail/review/frame", "html", "goodsDealReview", params);
+		$.ajax( {
+			type		: "POST",
+			url 		: '/goods/detail/review/frame',
+			data		: JSON.stringify(params),
+			dataType 	: 'html',
+			beforeSend : function(xhr, settings) {
+				xhr.setRequestHeader("AJAX"			, "true");
+				xhr.setRequestHeader('Accept'		, 'application/json');
+				xhr.setRequestHeader('Content-Type'	, 'application/json');
+			},
+			success 	: function(result) {
+				if (result != null) {
+					$("#goodsDealReview").css("display", "block");
+					$("#goodsDealReview").html(result);
+				}
+			}
+		});
 	}
 	
 	$(document).ready( function() {

+ 5 - 4
src/main/webapp/WEB-INF/views/mob/goods/GoodsSizeInfoFormMob.html

@@ -51,7 +51,7 @@
 											</thead>
 											<tbody>
 												<th:block th:each="measurement, status : ${measurementList}" th:if="${status.first}">
-												<th:block th:if="${typeCd == '상의'}">
+												<th:block th:if="${measurement.typecd == '상의'}">
 												<tr>
 													<td scope="col">가슴둘레</td>
 												</tr>
@@ -65,8 +65,7 @@
 													<td scope="col">총길이</td>
 												</tr>
 												</th:block>
-												<th:block th:unless="${typeCd == '상의'}">
-												</th:block>
+												<th:block th:unless="${measurement.typecd == '상의'}">
 												<tr>
 													<td scope="col">허리둘레</td>
 												</tr>
@@ -119,7 +118,8 @@
 												</tr>
 											</thead>
 											<tbody>
-												<tr th:each="measurement, status : ${measurementList}" th:if="${not status.first}">
+												<th:block th:each="measurement, status : ${measurementList}" th:with="count=${(measurement.typecd =='상의')? 4: 5}">
+												<tr th:if="${not status.first and status.index <= count}">
 													<td th:if="${measurement.size1}" th:text="${measurement.size1}">95</td>
 													<td th:if="${measurement.size2}" th:text="${measurement.size2}">95</td>
 													<td th:if="${measurement.size3}" th:text="${measurement.size3}">95</td>
@@ -133,6 +133,7 @@
 													<td th:if="${measurement.size11}" th:text="${measurement.size11}">95</td>
 													<td th:if="${measurement.size12}" th:text="${measurement.size12}">95</td>
 												</tr>
+												</th:block>
 											</tbody>
 										</table>
 									</div>

+ 12 - 0
src/main/webapp/WEB-INF/views/mob/order/OrderFormMob.html

@@ -576,6 +576,12 @@ var orderGiftInfoSet = function() {
 				} else {
 					$(this).parent().parent().find("input[name=recipNm]").attr("readOnly", true);
 					$(this).parent().parent().find("input[name=recipPhnno]").attr("readOnly", true);
+					
+					// 2021.06.03
+					window.style24.getContact();
+					// 데이타테스트
+					//var obj = {"contact" : {"name" : "홍길동", "phnno" : "010-1234-0000"}}
+					//contactInfo(obj);
 				}
 			});
 			
@@ -585,6 +591,12 @@ var orderGiftInfoSet = function() {
 	});
 }
 
+// 2021.06.03 어플 callback 함수 호출
+var contactInfo = function(jsonString) {
+	$("#orderForm #orderGiftInfo input[name=recipNm]").val(jsonString.contact.name);
+	$("#orderForm #orderGiftInfo input[name=recipPhnno]").val(jsonString.contact.phnno);
+}
+
 // 1.4.2 배송정보로드
 var deliveryAddrInfoSet = function(delvObj, temp) {
 	

+ 46 - 12
src/main/webapp/WEB-INF/views/mob/order/OrderGiftInfoMob.html

@@ -27,22 +27,56 @@
 						</div>
 					</a>
 				</div>
+				
 				<div class="fold_cont" style="display: none;">
-					<div class="inner"><!-- 210419_ : 모바일웹에서만 .inner 사용 -->
-						<div class="form_field">
-							<div class="input_wrap">
-								<input type="text" name="recipNm" class="form_control" value="" maxlength="10" placeholder="받는 분">
+					<!-- 210419_ : 모바일웹에서만 .inner 사용 -->
+					<th:block th:unless="${frontGb} == 'A'">
+						<div class="inner">
+							<div class="form_field">
+								<div class="input_wrap">
+									<input type="text" name="recipNm" class="form_control" value="" maxlength="10" placeholder="받는 분">
+								</div>
+								<div class="input_wrap">
+									<input type="text" name="recipPhnno" class="form_control" value="" minlength="10" maxlength="14" placeholder="받는 분 휴대폰번호">
+									<p class="desc_txt">선물이 타인에게 전송될수 있으니 받으실분 연락처를 정확하게 입력해주세요.</p> <!-- 210421_삭제 : 전화번호를 텍스트 삭제 -->
+								</div>
+								<div class="textarea_wrap">
+									<textarea class="doc_review" name="review" id="giftMsg" placeholder="선물 메시지 입력&#13;&#10;(미 입력시 ‘감사합니다’로 발송됩니다.)"></textarea>
+									<p class="txt_cnt"><span id="review_cnt" class="c_primary">0</span>/200</p>
+								</div>
 							</div>
-							<div class="input_wrap">
-								<input type="text" name="recipPhnno" class="form_control" value="" minlength="10" maxlength="14" placeholder="받는 분 휴대폰번호">
-								<p class="desc_txt">선물이 타인에게 전송될수 있으니 받으실분 연락처를 정확하게 입력해주세요.</p> <!-- 210421_삭제 : 전화번호를 텍스트 삭제 -->
-							</div>
-							<div class="textarea_wrap">
-								<textarea class="doc_review" name="review" id="giftMsg" placeholder="선물 메시지 입력&#13;&#10;(미 입력시 ‘감사합니다’로 발송됩니다.)"></textarea>
-								<p class="txt_cnt"><span id="review_cnt" class="c_primary">0</span>/200</p>
+						</div>
+					</th:block>
+					
+					<!-- 210419_ : APP 전용 : 탭 전체/ '연락처불러오기'는 모바일웹에서 사용하지않음. -->
+					<th:block th:if="${frontGb} == 'A'">
+						<div class="tabWrap">
+							<ul class="tabIndex">
+								<li class="" value="Call"><a href="javascript:void(0);"><span>연락처 불러오기</span></a></li>
+								<li class="active" value="Direct"><a href="javascript:void(0);"><span>직접입력</span></a></li>
+							</ul>
+							
+							<div class="tabContents">
+								<div class="form_field">
+									<div class="tab_cont active">
+										<div class="input_wrap">
+											<input type="text" name="recipNm" class="form_control" value="" maxlength="10" placeholder="받는 분">
+										</div>
+										<div class="form_field">
+											<div class="input_wrap">
+												<input type="text" name="recipPhnno" class="form_control" value="" minlength="10" maxlength="14" placeholder="받으실분 휴대폰번호">
+												<p class="desc_txt">선물이 타인에게 전송될수 있으니 전화번호를 받으실분 연락처를 정확하게 입력해주세요.</p>
+											</div>
+											<div class="textarea_wrap">
+												<textarea class="doc_review" name="review" id="giftMsg" placeholder="선물 메시지 입력&#13;&#10;(미 입력시 ‘감사합니다’로 발송됩니다.)"></textarea>
+												<p class="txt_cnt"><span id="review_cnt" class="c_primary">0</span>/200</p>
+											</div>
+										</div>
+									</div>
+								</div>
 							</div>
 						</div>
-					</div>
+					</th:block>
 				</div>
 				<!-- //주문고객정보 -->
 			</li>

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

@@ -928,12 +928,16 @@
 						
 						let allCate = [[${allCateList}]];
 						$.each(result, function(idx, item) {
-							if (item.contentsType == 'C' || item.contentsType == 'O') { // 컨텐츠유형:카테고리, 아울렛
+							if (item.contentsType == 'C' ) { // 컨텐츠유형:카테고리, 아울렛
 								$.each(allCate, function(allCateIdx, allCateItem) {
 									if (item.cate1No == allCateItem.cate1No) {
 										$('#ulQuickMenuCate').append(fnGetQuickMenuCategory(allCateItem));
 									}
 								});
+							}else if(item.contentsType == 'O'){
+								// $('#ulQuickMenuCate').append('<li><a href="' + item.linkUrl + '"><span>' + item.gtabNm + '</span></a></li>');
+								let outletCate = fnGetQuickOutletCategory(item.gtabNm);
+								$('#ulQuickMenuCate').append(outletCate);
 							} else if (item.contentsType == 'L') { // 컨텐츠유형:링크
 								$('#ulQuickMenuCate').append('<li><a href="' + item.linkUrl + '"><span>' + item.gtabNm + '</span></a></li>');
 							}
@@ -942,6 +946,27 @@
 				}
 			});
 	}
+
+	// 퀵 아울렛
+	let fnGetQuickOutletCategory = function (outletNm){
+		let formalGb = 'G009_20';
+		let cateGb = 'G032_101';
+		var tag = '';
+
+		tag += '<li class="has_children">\n';
+		tag += '<a href="javascript:void(0);"><span>'+outletNm+'</span></a>\n';
+		tag += '<ul class="quick_depth">\n';
+		tag += '<li><a href="javascript:void(0);" onclick="cfnGoToOutletMain(\'G032_103\');"><span>메인</span></a></li>\n';
+		tag += '<li><a href="javascript:void(0);" onclick="cfnGoToGoodsList(0,\'' + cateGb + '\',\'\',\'\',\'\',\'\',\'\',\'' + formalGb + '\');"><span>전체</span></a></li>\n';
+		let allCate = [[${allCateList}]];
+		$.each(allCate, function(allCateIdx, allCateItem) {
+			tag += '<li><a href="javascript:void(0);" onclick="cfnGoToGoodsList(0,\'' + allCateItem.cateGb + '\',' + allCateItem.cate1No + ',\'\',\'\',\'\',\'\',\'' + formalGb + '\');"><span>' + allCateItem.cate1Nm + '</span></a></li>\n';
+		});
+		tag += '</ul>\n';
+		tag += '</li>\n';
+
+		return tag;
+	}
 	
 	// 최근본상품
 	let fnGetRecentlyGoods = function() {

+ 3 - 2
src/main/webapp/WEB-INF/views/web/display/CategoryMainFormWeb.html

@@ -24,7 +24,7 @@
 	<div class="breadcrumb"> 
 		<ul>
 			<li class="bread_home"><a href="javascript:void(0);" onclick="cfnGoToPage(_PAGE_MAIN);">홈</a></li>
-			<li class="bread_2depth cate1Nm">여성1</li>
+			<li class="bread_2depth cateMainNm">여성1</li>
 		</ul> 
 	</div>
 
@@ -241,7 +241,8 @@
 					});
 				}
 				$('.dp_cate_list').html(tag);
-				$('.cate1Nm').html(cate1.cate1Nm+'메인');
+				$('.cateMainNm').html(cate1.cate1Nm+'메인');
+				$('.cate1Nm').html(cate1.cate1Nm);
 			}
 		});
 	}

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

@@ -248,6 +248,7 @@
 		let goodsIdx = 0;
 		
 		$target.each(function(){
+			params = [];
 			goodsIdx ++;
 			if ($(this).find('.item_state').hasClass('soldout')) {
 				

+ 28 - 7
src/main/webapp/WEB-INF/views/web/display/SearchGoodsListFormWeb.html

@@ -36,7 +36,7 @@
 								<fieldset>
 									<legend>결과 내 재검색</legend>
 									<input type="text" id="search" name="search" value="티비제이 제기장 스웨터" placeholder="" class="search_input" title="검색어 입력" maxlength="100">
-									<button type="button" class="sch_btn"><span>검색</span></button>
+									<button type="button" class="sch_btn" onclick="fnSearchData();"><span>검색</span></button>
 								</fieldset>
 							</form>
 							<div class="autokeyword">
@@ -77,7 +77,7 @@
 						</div>
 					</div>
 					<!-- 결과내 재검색 결과 없을 시 노출 -->
-					<div class="nodata">
+					<div class="nodata" style="display: none;">
 						<div class="txt_box">
 							<p>
 								<span>‘티비제이 제기장 스웨터’</span>대한<br>
@@ -103,7 +103,7 @@
 					<!-- 검색결과 : 상품 -->
 					<div class="sch_result_cont" style="display:block;">
 						<!-- 통합 상품 검색결과 없을 시 노출 -->
-						<div class="nodata">
+						<div class="nodata" style="display:none;">
 							<div class="txt_box">
 								<p>
 									<span>‘티비제이 제기장 스웨터’</span> 에 대한 상품 검색결과가 없습니다.
@@ -112,7 +112,7 @@
 						</div>
 						<!-- //통합 상품 검색결과 없을 시 노출 -->
 						<!-- 추천상품 노출 -->
-						<div class="sch_recommend">
+						<div class="sch_recommend" style="display:none;">
 							<h3>이런 상품은 어떤가요?</h3>
 							<div class="itemsGrp">
 								<div class="item_prod">
@@ -921,7 +921,7 @@
 								</div>
 								<div class="area_list">
 									<!-- 검색필터 결과 없을 시 노출 -->
-									<div class="nodata">
+									<div class="nodata" style="display:none;">
 										<div class="txt_box">
 											<p>
 												선택하신 조건에 맞는 상품이 없습니다. <br>
@@ -1300,7 +1300,7 @@
 					<!-- 검색결과 : 기획전 -->
 					<div class="sch_result_cont">
 						<!-- 기획전 검색결과 없을 시 노출 -->
-						<div class="nodata">
+						<div class="nodata" style="display:none;">
 							<div class="txt_box">
 								<p>
 									<span>‘티비제이 제기장 스웨터’</span> 에 대한 기획전 검색결과가 없습니다.
@@ -1539,7 +1539,7 @@
 					<!-- 검색결과 : 이벤트 -->
 					<div class="sch_result_cont">
 						<!-- 이벤트 검색결과 없을 시 노출 -->
-						<div class="nodata">
+						<div class="nodata" style="display:none;">
 							<div class="txt_box">
 								<p>
 									<span>‘티비제이 제기장 스웨터’</span> 에 대한 이벤트 검색결과가 없습니다.
@@ -1681,7 +1681,21 @@
 		</div>
 	</div>
 
+	<form id="searchGoodsForm" name="searchGoodsForm">
+		<input type="hidden" name="pageNo" id="pageNo" value ="1"/>
+		<input type="hidden" name="pageSize" value ="30"/>
+		<input type="hidden" name="keyword" value ="티셔츠"/>
+	</form>
+	
 	<script th:inline="javascript">
+		// 상품 검색
+		var fnGetInfiniteScrollDataList = function (pageNum) {
+			$("#searchGoodsForm input[name=pageNo]").val(pageNum + 1);
+			gagajf.ajaxFormSubmit("/display/search/goods/list", document.searchGoodsForm, function(result) {
+				console.log(result);
+			}, true);
+		}
+	
 		$(document).ready( function() {
 			fnCreateSearchCategoryList();
 			// fnCreateSearchFilter();
@@ -1748,6 +1762,8 @@
 				$(this).parent('li').siblings('li').find('.sub_cate').hide();
 				$(this).parent('li').children(".sub_cate").toggle();
 			});
+			
+			fnGetInfiniteScrollDataList(1);
 		});
 
 		// 좌측 카테고리 생성
@@ -1763,6 +1779,11 @@
 				});
 			}
 		}
+
+		// 검색
+		let fnSearchData = function (){
+
+		}
 	</script>
 
 </th:block>

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

@@ -1181,8 +1181,9 @@ function buy_nc_req(cartSqArr) {
 			cateNm += ' > ' + cate4Nm;
 		}
 		if (!gagajf.isNull(cate5Nm)) {
-			cateNm += ' > ' + cate5Nm */;
+			cateNm += ' > ' + cate5Nm ;
 		}
+		*/
 	}
 	// 광고 스크립트용
 	

+ 73 - 5
src/main/webapp/WEB-INF/views/web/goods/GoodsDetailFormWeb.html

@@ -1564,9 +1564,9 @@
 		let $target = $obj.parent().find('.li_item').find('.item_prod');
 		let goodsSize = $target.length;
 		let btnType = "C";
-		let params = [];
 		let goodsIdx = 0;
 		$target.each(function(){
+			let params = [];
 			goodsIdx ++; 
 			if ($(this).hasClass('unable')) {
 				
@@ -1996,6 +1996,33 @@
 	
 	// 상품평 레이어 호출후 콜백에서 호출하므로 여기에 있어야함
 	var fnReviewLayerCollBack = function(){
+		
+		// 상품평정보 
+		var params = new Object();
+		let goodsCd = [[${goodsInfo.goodsCd}]];
+		params.goodsCd = goodsCd;
+
+		//gagajf.ajaxSubmit("/goods/detail/review/frame", "html", "goodsDealReview", params);
+
+		$.ajax( {
+			type		: "POST",
+			url 		: '/goods/detail/review/frame',
+			data		: JSON.stringify(params),
+			dataType 	: 'html',
+			beforeSend : function(xhr, settings) {
+				xhr.setRequestHeader("AJAX"			, "true");
+				xhr.setRequestHeader('Accept'		, 'application/json');
+				xhr.setRequestHeader('Content-Type'	, 'application/json');
+			},
+			success 	: function(result) {
+				if (result != null) {
+					$("#goodsDealReview").css("display", "block");
+					$("#goodsDealReview").html(result);
+					fnGetList();
+				}
+			}
+		});
+		
 		//슬라이드 - 베스트리뷰
 		var bestReviewtSwiper = new Swiper('.area_rv_best .swiper-container', {
 			slidesPerView: 2,
@@ -2012,10 +2039,53 @@
 		
 	}
 	
+	// 상품평 상세 레이어 호출후 콜백에서 호출하므로 여기에 있어야함
+	var fnReviewDetailLayerCollBack = function(){debugger;
+		
+		fnReviewDetail();
+	       
+		 //슬라이드 - 상품 베스트 리뷰 자세히보기 영역 
+	    var photoReviewDetailSwiper = new Swiper('.pd_photoreviewdetail_pop .swiper-container.detail', {
+	        effect :'fade',
+	        slidesPerView: 1,
+	        spaceBetween: 0,
+	        simulateTouch:false,
+	        navigation: {
+	            nextEl: '.pd_photoreviewdetail_pop .swiper-button-next',
+	            prevEl: '.pd_photoreviewdetail_pop .swiper-button-prev',
+	        },
+	    });   
+
+	    $('.pd_photoreviewdetail_pop .swiper-slide').each(function(index, element){
+	        var $this = $(this);
+	        
+	        var thumbCount = $this.find('.thumblist ul li').length;
+	        var thumbUlWidth = $this.find('.thumblist ul li').width() * thumbCount;
+	        var thumbMargin = 8 * thumbCount;
+	        var thumbListWidth = thumbUlWidth + thumbMargin;
+
+	        $this.find('.thumblist ul').attr('style', 'width:' + thumbListWidth + 'px;');
+	        
+	    });
+
+	    $(document).on('click','.pd_photoreviewdetail_pop .thumblist ul li',function(e){
+
+	        $(this).parents(".swiper-slide").find(".review > .pic > .thumb").empty();
+	        $(this).parents(".swiper-slide").find(".thumblist ul li .pic").removeClass('active');
+	        $(this).find(".pic").addClass('active');
+
+	        var thumbIndex = $(this).index();
+	        thumbContentHtml = $(this).find('.pic .thumb').html();
+	        $(this).parents(".swiper-slide").find(".review > .pic > .thumb").append(thumbContentHtml);
+
+	        return false;
+	    });
+	}
+	
 	// 상품문의 레이어 호출후 콜백에서 호출하므로 여기에 있어야함
 	var fnQnaLayerCollBack = function(){
 		
-		// 상품평정보 
+		// 상품문의정보 
 		var params = new Object();
 		let goodsCd = [[${goodsInfo.goodsCd}]];
 		params.goodsCd = goodsCd;
@@ -2039,9 +2109,7 @@
 					fnGoodsQnaList();
 				}
 			}
-		});
-		
-		
+		});		
 	}
 	
 	 $(document).on('click','.option_box [class^="opt_"] .select_custom .select',function(e){

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

@@ -683,7 +683,7 @@
 				$(this).parents('div dl dd').find('.ratio .progbar').attr('style', 'width:' + reviewRatio);
 			}
 		});
-			fnGetList();	
+			//fnGetList();	
 		
 	});
 	

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

@@ -623,7 +623,26 @@
 	
 	// 구성 상품 상세 상품평
 	var fnGoodsDetailReview = function(params) {
-		gagajf.ajaxSubmit("/goods/detail/review/frame", "html", "goodsDealReview", params);
+		//gagajf.ajaxSubmit("/goods/detail/review/frame", "html", "goodsDealReview", params);
+		$.ajax( {
+			type		: "POST",
+			url 		: '/goods/detail/review/frame',
+			data		: JSON.stringify(params),
+			dataType 	: 'html',
+			beforeSend : function(xhr, settings) {
+				xhr.setRequestHeader("AJAX"			, "true");
+				xhr.setRequestHeader('Accept'		, 'application/json');
+				xhr.setRequestHeader('Content-Type'	, 'application/json');
+			},
+			success 	: function(result) {
+				if (result != null) {
+					$("#goodsDealReview").css("display", "block");
+					$("#goodsDealReview").html(result);
+					fnGetList();
+				}
+			}
+		});
+		
 	}
 	
 	// 상품평 상품선택시

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

@@ -257,7 +257,7 @@
 		fnReviewDetail();
 	}
 	
-	$(document).ready( function() {
+	//$(document).ready( function() {
 		
 		fnReviewDetail();
        
@@ -297,7 +297,7 @@
 
 	        return false;
 	    });
-	});		
+	//});		
 
 	 
 /*]]>*/

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

@@ -43,8 +43,8 @@
 </div>
 <script th:inline="javascript">
 /*<![CDATA[*/
-	
-	// 구성 상품 상세 상품평
+/*	
+ 	// 구성 상품 상세 상품평
 	var fnGoodsDetailReview = function(params) {
 		gagajf.ajaxSubmit("/goods/detail/review/frame", "html", "goodsDealReview", params);
 	}
@@ -57,7 +57,7 @@
 		params.goodsCd = goodsCd;
 		fnGoodsDetailReview(params);  // ajax html
 		
-	});
+	}); */
 	
 /*]]>*/
 </script>	

+ 7 - 5
src/main/webapp/WEB-INF/views/web/goods/GoodsSizeInfoFormWeb.html

@@ -51,7 +51,7 @@
 											</thead>
 											<tbody>
 												<th:block th:each="measurement, status : ${measurementList}" th:if="${status.first}">
-												<th:block th:if="${typeCd == '상의'}">
+												<th:block th:if="${measurement.typecd == '상의'}">
 												<tr>
 													<td scope="col">가슴둘레</td>
 												</tr>
@@ -65,8 +65,7 @@
 													<td scope="col">총길이</td>
 												</tr>
 												</th:block>
-												<th:block th:unless="${typeCd == '상의'}">
-												</th:block>
+												<th:block th:unless="${measurement.typecd == '상의'}">
 												<tr>
 													<td scope="col">허리둘레</td>
 												</tr>
@@ -83,6 +82,7 @@
 													<td scope="col">총길이</td>
 												</tr>
 												</th:block>
+												</th:block>
 											</tbody>
 										</table>
 									</div>
@@ -103,7 +103,7 @@
 												<col th:if="${measurement.size12}" th:attr="width=${typeWith+'%'}">
 											</colgroup>
 											<thead>
-												<tr th:each="measurement, status : ${measurementList}" th:if="${status.first}" th:with="sizeCount=${measurement.sizeCount}">
+												<tr th:each="measurement, status : ${measurementList}" th:if="${status.first}" >
 													<th scope="col" th:if="${measurement.size1}" th:text="${measurement.size1}">M</th>
 													<th scope="col" th:if="${measurement.size2}" th:text="${measurement.size2}">M</th>
 													<th scope="col" th:if="${measurement.size3}" th:text="${measurement.size3}">M</th>
@@ -119,7 +119,8 @@
 												</tr>
 											</thead>
 											<tbody>
-												<tr th:each="measurement, status : ${measurementList}" th:if="${not status.first}">
+												<th:block th:each="measurement, status : ${measurementList}" th:with="count=${(measurement.typecd =='상의')? 4: 5}">
+												<tr th:if="${not status.first and status.index <= count}">
 													<td th:if="${measurement.size1}" th:text="${measurement.size1}">95</td>
 													<td th:if="${measurement.size2}" th:text="${measurement.size2}">95</td>
 													<td th:if="${measurement.size3}" th:text="${measurement.size3}">95</td>
@@ -133,6 +134,7 @@
 													<td th:if="${measurement.size11}" th:text="${measurement.size11}">95</td>
 													<td th:if="${measurement.size12}" th:text="${measurement.size12}">95</td>
 												</tr>
+												</th:block>
 											</tbody>
 										</table>
 									</div>

+ 96 - 62
src/main/webapp/WEB-INF/views/web/planning/PlanningDetailFormWeb.html

@@ -90,25 +90,25 @@
             
             <th:block th:each="a, template : ${templateOrd}">
 				<th:block th:if="${a.tmplType == 'G082_10'}">
-						<div class="content wide dp_review" th:id="${a.tmplType}"></div> <!-- //리뷰 -->
+						<div class="content wide dp_review" th:id="${a.tmplType}" style="display: none"></div> <!-- //리뷰 -->
 					</th:block>
 				<th:block th:if="${a.tmplType == 'G082_20'}">
-						 <div class="content wide dp_coupon" th:id="${a.tmplType}"></div>  <!-- //할인쿠폰 -->
+						 <div class="content wide dp_coupon" th:id="${a.tmplType}" style="display: none"></div>  <!-- //할인쿠폰 -->
 					</th:block>
 				<th:block th:if="${a.tmplType == 'G082_30'}">
-						<div class="content dp_mid_banner" th:id="${a.tmplType}"></div> <!-- //이미지-->
+						<div class="content dp_mid_banner" th:id="${a.tmplType}" style="display: none"></div> <!-- //이미지-->
 					</th:block>
 				<th:block th:if="${a.tmplType == 'G082_50'}">
-						<div class="content dp_special" th:id="${a.tmplType + a.planContSq}"></div>
+						<div class="content dp_special" th:id="${a.tmplType + a.planContSq}" style="display: none"></div>
 				</th:block>
 				<th:block th:if="${a.tmplType == 'G082_51'}">
-						<div class="content dp_special" th:id="${a.tmplType + a.planContSq}"></div>
+						<div class="content dp_special" th:id="${a.tmplType + a.planContSq}" style="display: none"></div>
 				</th:block>
 				<th:block th:if="${a.tmplType == 'G082_52'}">
-						<div class="content dp_special" th:id="${a.tmplType + a.planContSq}"></div>
+						<div class="content dp_special" th:id="${a.tmplType + a.planContSq}" style="display: none"></div>
 				</th:block>
 				<th:block th:if="${a.tmplType == 'G082_60'}">
-						<div class="content dp_announce" th:id="${a.tmplType}"></div>
+						<div class="content dp_announce" th:id="${a.tmplType}" style="display: none"></div>
 				</th:block>
 			</th:block>
 			
@@ -245,13 +245,18 @@
 <script src="/ux/plugins/gaga/gaga.paging.js"></script>
 <script th:inline="javascript">
 let review = [[${reviewInfo}]];
+let reviewContent = [[${reviewContent}]];
 let coupon = [[${couponInfo}]];
+let couponContent = [[${couponContent}]];
 let plan = [[${planInfo}]];
 let image = [[${imageInfo}]];
 let notice = [[${noticeInfo}]];
 let goods1 = [[${goods1Info}]];
+let goods1Content = [[${goods1Content}]];
 let goods2 = [[${goods2Info}]];
+let goods2Content = [[${goods2Content}]];
 let goods4 = [[${goods4Info}]];
+let goods4Content = [[${goods4Content}]];
 let template =[[${templateOrd}]];
 let replyList = [[${replyList}]];
 let replyCount = [[${replyCount}]];
@@ -260,6 +265,8 @@ let planCornerGoodsList = [[${planCornerGoodsList}]];
 let planCornerList = [[${planCornerList}]];
 
 if(notice.length>0){
+	$("#G082_60").show();
+	
 	var html = '';
 	
 	html += '    <div class="cont_head">\n';
@@ -284,6 +291,7 @@ if(notice.length>0){
 	html += '    </div>\n';
 
 	$("#G082_60").append(html);
+	
 }
 
 
@@ -308,12 +316,8 @@ if(planCornerList.length>0){
 		html += '                 <h4>'+item.cornerNm+'</h4>\n';
 		html += '             </div>\n';
 		html += '             <div class="itemsGrp';
-		if (item.cornerDispType == 'G045_1') {
-			html += ' cut1';
-		}else if(item.cornerDispType == 'G045_2'){
+		if(item.cornerDispType == 'G045_2'){
 			html += ' cut2';
-		}else if(item.cornerDispType == 'G045_3'){
-			html += ' cut3';
 		}else if(item.cornerDispType == 'G045_4'){
 			html += ' cut4';
 		}else if(item.cornerDispType == 'G045_5'){
@@ -396,13 +400,13 @@ if(planCornerList.length>0){
 	
 }
 
-if(review.length>0){
-	
+if(review.length>0 || reviewContent[0].title != ''){
+	$("#G082_10").show();
 	var html = '';
 	
 	html += ' <div class="cont_head">\n';
 	html += ' 	<div>\n';
-	html += '		<h4>'+review[0].title+'</h4>\n';
+	html += '		<h4>'+reviewContent[0].title+'</h4>\n';
 	html += ' 	</div>\n';
 	html += '	<div class="cont_body">\n';
 	html += ' 		<div class="review_list">\n';
@@ -410,9 +414,19 @@ if(review.length>0){
 		html += '		<div class="reviw_box">\n'
 		html += '			<div class="best_review">\n';
 		if(item.reviewSysImg!= null){
-			html += '				<a href="javascript:void();" id="btn_pdBestReview_pop" onclick="cfGoodsReviewDetail(\''+item.goodsCd+'\',\'Y\', \'Y\',\''+item.reviewSq+'\');">\n';
+			if (item.bestYn == 'Y') {
+				html += '				<a href="javascript:void();" id="btn_pdBestReview_pop" onclick="cfGoodsReviewDetail(\''+item.goodsCd+'\',\'Y\', \'Y\',\''+item.reviewSq+'\');">\n';
+			}else{
+				html += '				<a href="javascript:void();" id="btn_pdBestReview_pop" onclick="cfGoodsReviewDetail(\''+item.goodsCd+'\',\'N\', \'Y\',\''+item.reviewSq+'\');">\n';
+			}
+			
 		}else{
-			html += '				<a href="javascript:void();" id="btn_pdBestReview_pop" onclick="cfGoodsReviewDetail(\''+item.goodsCd+'\',\'Y\', \'N\',\''+item.reviewSq+'\');">\n';
+			if (item.bestYn == 'Y') {
+				html += '				<a href="javascript:void();" id="btn_pdBestReview_pop" onclick="cfGoodsReviewDetail(\''+item.goodsCd+'\',\'Y\', \'N\',\''+item.reviewSq+'\');">\n';
+			}else{
+				html += '				<a href="javascript:void();" id="btn_pdBestReview_pop" onclick="cfGoodsReviewDetail(\''+item.goodsCd+'\',\'N\', \'N\',\''+item.reviewSq+'\');">\n';
+			}
+			
 		}
 		
 		html += '					<div class="pic">\n';
@@ -464,35 +478,40 @@ if(review.length>0){
 	html += '</div>\n';
 
 	$("#G082_10").append(html);
+
+	
 }
 
 if(image.length>0){
-	var html = '';
 	
-	html += '<div class="cont_body">\n     ';
-	html += '    <div class="mid_banner">\n';
-	html += '        <div class="swiper-container">\n';
-	html += '            <div class="swiper-wrapper">\n';
-	for (var i = 0; i < image.length; i++) {
-		html += '                	<div class="swiper-slide">\n';
-		if (image[i].linkOpenGb == 'M') {
-			html += '                    	<a href="'+image[i].linkUrl+'" target="_self"><img alt="" src="'+ _uploadImageUrl + image[i].itemVal +'"></a>\n';
-		}else{
-			html += '                    	<a href="'+image[i].linkUrl+'" target="_blank"><img alt="" src="'+ _uploadImageUrl + image[i].itemVal +'"></a>\n';
+	if (image[0].itemVal != null && image[0].itemVal != '') {
+		$("#G082_30").show();
+		var html = '';
+		
+		html += '<div class="cont_body">\n     ';
+		html += '    <div class="mid_banner">\n';
+		html += '        <div class="swiper-container">\n';
+		html += '            <div class="swiper-wrapper">\n';
+		for (var i = 0; i < image.length; i++) {
+			html += '                	<div class="swiper-slide">\n';
+			if (image[i].linkOpenGb == 'M') {
+				html += '                    	<a href="'+image[i].linkUrl+'" target="_self"><img alt="" src="'+ _uploadImageUrl + image[i].itemVal +'"></a>\n';
+			}else{
+				html += '                    	<a href="'+image[i].linkUrl+'" target="_blank"><img alt="" src="'+ _uploadImageUrl + image[i].itemVal +'"></a>\n';
+			}
+			
+			html += '                	</div>\n';
 		}
+		html += '            </div>\n';
+		html += '        </div>\n';
+		html += '        <div class="swiper-button-prev"></div>\n';
+		html += '        <div class="swiper-button-next"></div>\n';
+		html += '        <div class="swiper-pagination"></div>\n';
+		html += '    </div>\n';
+		html += '</div>\n';
 		
-		html += '                	</div>\n';
+		$("#G082_30").append(html);
 	}
-	html += '            </div>\n';
-	html += '        </div>\n';
-	html += '        <div class="swiper-button-prev"></div>\n';
-	html += '        <div class="swiper-button-next"></div>\n';
-	html += '        <div class="swiper-pagination"></div>\n';
-	html += '    </div>\n';
-	html += '</div>\n';
-	
-	
-	$("#G082_30").append(html);
 }
 
 if(goods1.length>0){
@@ -502,7 +521,6 @@ if(goods1.length>0){
 		if(template[j].tmplType == 'G082_50'){
 			array.push(template[j].planContSq);
 		}
-		
 	}	
 	
 	for (var i = 0; i < template.length; i++) {
@@ -529,6 +547,11 @@ if(goods1.length>0){
 			html += '        <ul>\n';
 		$.each(goods1, function(idx, item)  {
 			if (item.planContSq == template[i].planContSq) {
+				if (item.goodsCd == null && item.goodsCd == '') {
+					$("#G082_50" +array[0]).hide();
+				}else{
+					$("#G082_50" +array[0]).show();
+				}
 				html += '            <li>\n';
 				html += '                <div class="dp_listItems">\n';
 				html += '                    <div class="dp_listItems_img">\n';
@@ -599,6 +622,11 @@ if(goods2.length>0){
 			html += '            <div class="swiper-wrapper">\n';
 			$.each(goods2, function(idx, item) {
 				if (item.planContSq == template[i].planContSq) {
+					if (item.goodsCd == null && item.goodsCd == '') {
+						$("#G082_51" +array[0]).hide();
+					}else{
+						$("#G082_51" +array[0]).show();
+					}
 					html += '                <div class="swiper-slide">\n';
 					html += '                    <div class="item_prod">\n';
 					html += '                        <div class="item_state">\n';
@@ -671,6 +699,11 @@ if(goods4.length>0){
 			html += '            <div class="swiper-wrapper">\n';
 			$.each(goods4, function(idx, item) {
 				if (item.planContSq == template[i].planContSq) {
+					if (item.goodsCd == null && item.goodsCd == '') {
+						$("#G082_52" +array[0]).hide();
+					}else{
+						$("#G082_52" +array[0]).show();
+					}
 					html += '                <div class="swiper-slide">\n';
 					html += '                    <div class="item_prod">\n';
 					html += '                        <div class="item_state">\n';
@@ -711,12 +744,13 @@ if(goods4.length>0){
 	}
 }
 
-if(coupon.length>0){
+if(coupon.length>0 || (couponContent[0].title != '' && couponContent[0].title != null) || (couponContent[0].cpnNote0 != '' && couponContent[0].cpnNote0 != null)){
+	$("#G082_20").show();
 	var html = '';
 	 
 	html += '<div class="cont_head">\n';
 	html += '	<div>\n';
-	html += '		<h4>'+coupon[0].title+'</h4>\n';
+	html += '		<h4>'+couponContent[0].title+'</h4>\n';
 	html += '	</div>\n';
 	html += '</div>\n';
 	html += '<div class="cont_body">\n';
@@ -753,7 +787,7 @@ if(coupon.length>0){
 	html += '		</ul>\n';
 	html += '	</div>\n';
 	html += '</div>\n';
-	if(coupon[0].cpnNote0 != null && coupon[0].cpnNote0 != ''){
+	if(couponContent[0].cpnNote0 != null && couponContent[0].cpnNote0 != ''){
 		html += '<div class="content dp_announce line">\n                                                 ';
 		html += '    <div class="cont_head">\n                                                       ';
 		html += '        <div>\n                                                                     ';
@@ -768,25 +802,25 @@ if(coupon.length>0){
 		html += '            </div>\n                                                                ';
 		html += '            <div class="announce_list">\n                                           ';
 		html += '               <ul>\n';
-		html += '                  <li>' + coupon[0].cpnNote0 +'</li>\n';
-		if(coupon[0].cpnNote1 != null && coupon[0].cpnNote1 != '')
-			html += '                  <li>' + coupon[0].cpnNote1 +'</li>\n';
-		if(coupon[0].cpnNote2 != null && coupon[0].cpnNote2 != '')
-			html += '                  <li>' + coupon[0].cpnNote2 +'</li>\n';
-		if(coupon[0].cpnNote3 != null && coupon[0].cpnNote3 != '')
-			html += '                  <li>' + coupon[0].cpnNote3 +'</li>\n';	
-		if(coupon[0].cpnNote4 != null && coupon[0].cpnNote4 != '')
-			html += '                  <li>' + coupon[0].cpnNote4 +'</li>\n';
-		if(coupon[0].cpnNote5 != null && coupon[0].cpnNote5 != '')
-			html += '                  <li>' + coupon[0].cpnNote5 +'</li>\n';
-		if(coupon[0].cpnNote6 != null && coupon[0].cpnNote6 != '')
-			html += '                  <li>' + coupon[0].cpnNote6 +'</li>\n';
-		if(coupon[0].cpnNote7 != null && coupon[0].cpnNote7 != '')
-			html += '                  <li>' + coupon[0].cpnNote7 +'</li>\n';
-		if(coupon[0].cpnNote8 != null && coupon[0].cpnNote8 != '')
-			html += '                  <li>' + coupon[0].cpnNote8 +'</li>\n';
-		if(coupon[0].cpnNote9 != null && coupon[0].cpnNote9 != '')
-			html += '                  <li>' + coupon[0].cpnNote9 +'</li>\n';
+		html += '                  <li>' + couponContent[0].cpnNote0 +'</li>\n';
+		if(couponContent[0].cpnNote1 != null && couponContent[0].cpnNote1 != '')
+			html += '                  <li>' + couponContent[0].cpnNote1 +'</li>\n';
+		if(couponContent[0].cpnNote2 != null && couponContent[0].cpnNote2 != '')
+			html += '                  <li>' + couponContent[0].cpnNote2 +'</li>\n';
+		if(couponContent[0].cpnNote3 != null && couponContent[0].cpnNote3 != '')
+			html += '                  <li>' + couponContent[0].cpnNote3 +'</li>\n';	
+		if(couponContent[0].cpnNote4 != null && couponContent[0].cpnNote4 != '')
+			html += '                  <li>' + couponContent[0].cpnNote4 +'</li>\n';
+		if(couponContent[0].cpnNote5 != null && couponContent[0].cpnNote5 != '')
+			html += '                  <li>' + couponContent[0].cpnNote5 +'</li>\n';
+		if(couponContent[0].cpnNote6 != null && couponContent[0].cpnNote6 != '')
+			html += '                  <li>' + couponContent[0].cpnNote6 +'</li>\n';
+		if(couponContent[0].cpnNote7 != null && couponContent[0].cpnNote7 != '')
+			html += '                  <li>' + couponContent[0].cpnNote7 +'</li>\n';
+		if(couponContent[0].cpnNote8 != null && couponContent[0].cpnNote8 != '')
+			html += '                  <li>' + couponContent[0].cpnNote8 +'</li>\n';
+		if(couponContent[0].cpnNote9 != null && couponContent[0].cpnNote9 != '')
+			html += '                  <li>' + couponContent[0].cpnNote9 +'</li>\n';
 		html += '               </ul>\n';
 		html += '            </div>                                                                '; 
 		html += '        </div>                                                                    '; 

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

@@ -891,8 +891,8 @@ function cfGoodsReviewDetail(goodsCd, bestYn, photoYn, reviewSq, attachSq) {
 	params += '&bestYn=' + bestYn;
 	params += '&photoYn=' + photoYn;
 	if (typeof (attachSq) != 'undefined') params += "&attachSq=" + attachSq;
-	
-	cfnOpenLayer(_PAGE_GOODS_REVIEW_DETAIL_LAYER+params, 'layer_review_best');
+
+	cfnOpenLayer(_PAGE_GOODS_REVIEW_DETAIL_LAYER+params, 'layer_review_best',  null, fnReviewDetailLayerCollBack);
 }
 
 /**