Ver Fonte

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

card007 há 5 anos atrás
pai
commit
0c0295f729
22 ficheiros alterados com 1080 adições e 325 exclusões
  1. 66 0
      src/main/java/com/style24/front/biz/dao/TsfDeliveryDao.java
  2. 115 0
      src/main/java/com/style24/front/biz/service/TsfDeliveryService.java
  3. 122 0
      src/main/java/com/style24/front/biz/web/TsfDeliveryController.java
  4. 23 6
      src/main/java/com/style24/front/biz/web/TsfDisplayController.java
  5. 49 31
      src/main/java/com/style24/front/biz/web/TsfGoodsController.java
  6. 7 2
      src/main/java/com/style24/persistence/domain/Goods.java
  7. 16 15
      src/main/java/com/style24/persistence/domain/Review.java
  8. 44 0
      src/main/java/com/style24/persistence/domain/SweetTracker.java
  9. 104 0
      src/main/java/com/style24/persistence/mybatis/shop/TsfDelivery.xml
  10. 13 0
      src/main/java/com/style24/persistence/mybatis/shop/TsfDisplay.xml
  11. 10 7
      src/main/java/com/style24/persistence/mybatis/shop/TsfGoods.xml
  12. 38 24
      src/main/java/com/style24/persistence/mybatis/shop/TsfReview.xml
  13. 85 8
      src/main/webapp/WEB-INF/views/web/common/fragments/GnbWeb.html
  14. 48 36
      src/main/webapp/WEB-INF/views/web/display/CategoryGoodsListFormWeb.html
  15. 5 5
      src/main/webapp/WEB-INF/views/web/display/CategoryMainFormWeb.html
  16. 1 1
      src/main/webapp/WEB-INF/views/web/display/OutletMainFormWeb.html
  17. 1 1
      src/main/webapp/WEB-INF/views/web/goods/GoodsDetailQnaFormWeb.html
  18. 1 1
      src/main/webapp/WEB-INF/views/web/goods/GoodsDetailReviewFormWeb.html
  19. 248 169
      src/main/webapp/WEB-INF/views/web/goods/GoodsReviewDetailFormWeb.html
  20. 3 3
      src/main/webapp/WEB-INF/views/web/mypage/MypageReviewFormWeb.html
  21. 75 10
      src/main/webapp/biz/goods.js
  22. 6 6
      src/main/webapp/ux/style24_link.js

+ 66 - 0
src/main/java/com/style24/front/biz/dao/TsfDeliveryDao.java

@@ -0,0 +1,66 @@
+package com.style24.front.biz.dao;
+
+import java.util.Collection;
+
+import com.style24.core.support.annotation.ShopDs;
+import com.style24.persistence.domain.SweetTracker;
+
+/**
+ * 배송 Dao
+ *
+ * @author moon
+ * @since 2021. 04. 25
+ */
+@ShopDs
+public interface TsfDeliveryDao {
+
+	
+	/**
+	 * 배송완료 상태값 변경 
+	 * @param SweetTracker
+	 * @return
+	 * @author moon
+	 * @since 2021. 04. 14
+	 */
+	void updateTbOrderDtlStat(SweetTracker sweetTracker);	
+	
+	/**
+	 * 스윗트래커 배송상태 등록 
+	 * @param SweetTracker
+	 * @return
+	 * @author moon
+	 * @since 2021. 04. 14
+	 */
+	void insertTbSweetTracker(SweetTracker sweetTracker);
+	
+	/**
+	 * 주문상세번호 조회  
+	 * @param SweetTracker
+	 * @return Collection<SweetTracker>
+	 * @author moon
+	 * @since 2021. 04. 14
+	 */	
+	Collection<SweetTracker> getOrdDtlNoList(SweetTracker sweetTracker);
+	
+	/**
+	 * 주문변경번호 조회  
+	 * @param SweetTracker
+	 * @return Collection<SweetTracker>
+	 * @author moon
+	 * @since 2021. 04. 14
+	 */	
+	Collection<SweetTracker> getOrdChgSqList(SweetTracker sweetTracker);
+	
+	/**
+	 * 주문변경 상태값 변경 
+	 * @param SweetTracker
+	 * @return
+	 * @author moon
+	 * @since 2021. 04. 14
+	 */
+	void updateOrdChgSqStat(SweetTracker sweetTracker);		
+	
+
+	int saveTemp(SweetTracker sweetTracker);			
+	
+}

+ 115 - 0
src/main/java/com/style24/front/biz/service/TsfDeliveryService.java

@@ -0,0 +1,115 @@
+package com.style24.front.biz.service;
+
+import java.util.Collection;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.style24.core.biz.dao.TscOrderChangeDao;
+import com.style24.core.biz.dao.TscOrderDao;
+import com.style24.core.support.message.TscMessageByLocale;
+import com.style24.core.support.env.TscConstants.OrderDetailStat;
+import com.style24.core.support.env.TscConstants.OrderChangeStat;
+
+import com.style24.front.biz.dao.TsfDeliveryDao;
+import com.style24.persistence.domain.Order;
+import com.style24.persistence.domain.SweetTracker;
+import com.style24.persistence.domain.OrderChange;
+
+
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * 배송 Service
+ *
+ * @author moon
+ * @since 2021. 04. 13
+ */
+@Service
+@Slf4j
+public class TsfDeliveryService {
+
+	@Autowired
+	private TscMessageByLocale message;
+
+	@Autowired
+	private TscOrderChangeDao orderChangeDao;
+	
+	@Autowired
+	private TsfDeliveryDao deliveryDao;
+
+	@Autowired
+	private TscOrderDao orderDao;	
+	
+	/**
+	 * 스윗트래커 배송상태 등록 및 주문상세상태 변경 
+	 * @param  SweetTracker
+	 * @return 
+	 * @author moon
+	 * @since  2021. 04. 13
+	 */
+	@Transactional("shopTxnManager")
+	public void saveDelvStat(SweetTracker sweetTracker) {
+
+		// 배송완료건 상태값 변경   
+		if(6 == sweetTracker.getLevel()) {
+			// 주문상세번호 조회 
+			Collection<SweetTracker> list = deliveryDao.getOrdDtlNoList(sweetTracker);
+			for(SweetTracker data : list) {
+				// 주문상태값 변경
+				data.setUpdNo(0);
+				data.setRegNo(0);
+				data.setOrdDtlStat(OrderDetailStat.DELIVERY_COMPLETE.value());  // 배송완료 G013_60
+				deliveryDao.updateTbOrderDtlStat(data);
+				// 주문상세이력
+				Order order = new Order();
+				order.setOrdDtlNo(data.getOrdDtlNo());
+				order.setUpdNo(0);
+				order.setRegNo(0);
+				orderDao.createOrderDetailHst(order);				
+			}
+			
+			// 주문변경번호 조회 
+			Collection<SweetTracker> chgList = deliveryDao.getOrdChgSqList(sweetTracker);
+			for(SweetTracker chgSq : chgList ) {
+				
+				// 주문상세변경 상태값 변경 
+				chgSq.setUpdNo(0);
+				chgSq.setRegNo(0);
+				chgSq.setChgStat(OrderChangeStat.WITHDRAW_GOODS_CHECK.value());  // 상품검수중  G685_31
+				deliveryDao.updateOrdChgSqStat(chgSq);
+				
+				// 주문상세변경 이력 
+				OrderChange ordChg = new OrderChange();
+				ordChg.setRegNo(0);
+				ordChg.setUpdNo(0);
+				ordChg.setOrdChgSq(chgSq.getOrdChgSq()); 
+				ordChg.setOrdDtlNo(chgSq.getOrdDtlNo()); 
+				orderChangeDao.createOrderChangeDetailHst(ordChg);
+			}
+		}
+		
+		// 	TB_SWEET_TRACKER 등록 
+		sweetTracker.setDelvLevel(sweetTracker.getLevel()+"");
+		sweetTracker.setDelvWhere(sweetTracker.getWhere());
+		deliveryDao.insertTbSweetTracker(sweetTracker);
+	}
+	
+	/**
+	 * 스윗트래커 배송상태 등록 및 주문상세상태 변경 
+	 * @param  SweetTracker
+	 * @return 
+	 * @author moon
+	 * @since  2021. 04. 13
+	 */
+	@Transactional("shopTxnManager")
+	public int saveTemp(String msg) {
+		int rtn=0;
+		SweetTracker tmp = new SweetTracker();
+		tmp.setMan(msg);
+		deliveryDao.saveTemp(tmp);
+		return rtn;
+	}
+
+}

+ 122 - 0
src/main/java/com/style24/front/biz/web/TsfDeliveryController.java

@@ -0,0 +1,122 @@
+package com.style24.front.biz.web;
+
+import javax.servlet.http.HttpServletResponse;
+
+import java.nio.charset.StandardCharsets;
+import java.util.Enumeration;
+import javax.servlet.ServletInputStream;
+import javax.servlet.http.HttpServletRequest;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.util.StreamUtils;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import com.gagaframework.web.parameter.GagaMap;
+import com.gagaframework.web.parameter.GagaMapList;
+import com.style24.persistence.domain.SweetTracker;
+import com.style24.front.biz.service.TsfDeliveryService;
+import com.style24.front.support.controller.TsfBaseController;
+import com.google.gson.JsonObject;
+
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * 배송 Controller
+ *
+ * @author moon
+ * @since 2021. 04. 25
+ */
+@Controller
+@RequestMapping("/delivery")
+@Slf4j
+public class TsfDeliveryController extends TsfBaseController {
+
+
+	@Autowired
+	private TsfDeliveryService deliveryService;
+
+	/**
+	 * 스윗트래커 
+	 *
+	 * @param String
+	 * @return  
+	 * @author moon
+	 * @since 2021. 04. 13
+	 */
+	@PostMapping(value = "/sweettracker/response" )
+	@ResponseBody
+	public String sweetTrackerResponse(SweetTracker  sweetTracker) throws Exception {
+		
+		deliveryService.saveTemp("들어옴");
+		
+		String msg = "";
+//		Enumeration  enums = request.getParameterNames();
+//		while (enums.hasMoreElements()) {
+//			String name = (String) enums.nextElement();
+//			log.info("name: "+name);
+//			msg = msg+ name+": "+request.getParameter(name)+" ";
+//		}
+//		
+//		deliveryService.saveTemp(msg);
+//		
+//		String fid  = request.getParameter("fid");
+//		String courier_code  = request.getParameter("courier_code");
+//		String invoice_no  = request.getParameter("invoice_no");
+//		String level  = request.getParameter("level");
+//		String time_trans  = request.getParameter("time_trans");
+//		String time_sweet  = request.getParameter("time_sweet");
+//		String where  = request.getParameter("where");
+//		String telno_office  = request.getParameter("telno_office");
+//		String telno_man  = request.getParameter("telno_man");
+//		String details  = request.getParameter("details");
+//		String recv_addr  = request.getParameter("recv_addr");
+//		String recv_name  = request.getParameter("recv_name");
+//		String send_name  = request.getParameter("send_name");
+//		String man  = request.getParameter("man");
+//		String estmate  = request.getParameter("estmate");
+//		
+//		String msg2 = "fid: "+fid+" courier_code:"+courier_code+" invoice_no:"+invoice_no+" level:"+level+" time_trans:"+time_trans;
+//		
+//		deliveryService.saveTemp(msg2);
+//		
+//		
+//		
+//		SweetTracker  sweetTracker = new SweetTracker();
+//		sweetTracker.setFid(request.getParameter("fid"));
+//		sweetTracker.setCourier_code(request.getParameter("courier_code"));
+//		sweetTracker.setInvoice_no(request.getParameter("invoice_no"));
+//		sweetTracker.setLevel(Integer.parseInt(request.getParameter("level")));
+//		sweetTracker.setTime_trans(request.getParameter("time_trans"));
+//		sweetTracker.setTime_sweet(request.getParameter("time_sweet"));
+//		sweetTracker.setWhere(request.getParameter("where"));
+//		sweetTracker.setTelno_office(request.getParameter("telno_office"));
+//		sweetTracker.setTelno_man(request.getParameter("telno_man"));
+//		sweetTracker.setDetails(request.getParameter("details"));
+//		sweetTracker.setRecv_addr(request.getParameter("recv_addr"));
+//		sweetTracker.setRecv_name(request.getParameter("recv_name"));
+//		sweetTracker.setSend_name(request.getParameter("send_name"));
+//		sweetTracker.setMan(request.getParameter("man"));
+//		sweetTracker.setEstmate(request.getParameter("estmate"));
+//		
+		
+		deliveryService.saveTemp(sweetTracker.toString());
+		
+		JsonObject rtn = new JsonObject();
+		
+		
+		try {
+			deliveryService.saveDelvStat(sweetTracker);
+			
+			rtn.addProperty("code", true); 
+			rtn.addProperty("message", "success"); 
+		} catch(Exception e) {
+			rtn.addProperty("code", false); 
+			rtn.addProperty("message", "fail - invalid fid"); 
+		}
+		
+		return rtn.toString();
+	}	
+}

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

@@ -381,14 +381,31 @@ public class TsfDisplayController extends TsfBaseController {
 				mav.addObject("planningList", displayService.getContentsList(contents));
 			} else if ("SCM002".equals(cateMain.getContentsLoc())) {
 				// 신상품
-				cate.setContentsLoc("SCM002");
-				cate.setMaxRow(20);
-				mav.addObject("newGoodsList", goodsService.getContentsCategoryGoodsList(cate));
+				Contents contents = new Contents();
+				contents.setContentsLoc("SCM002");
+				contents.setCateNo(cate.getCate1No());
+				contents.setMaxRow(1);
+				Collection<Contents> conList = displayService.getContentsList(contents);
+				mav.addObject("newGoodsList", null);
+
+				for(Contents contentsData : conList){
+					cate.setContentsLoc("SCM002");
+					cate.setMaxRow(20);
+					mav.addObject("newGoodsList", goodsService.getContentsCategoryGoodsList(cate));
+				}
 			} else if ("SCM003".equals(cateMain.getContentsLoc())) {
 				// 베스트품
-				cate.setContentsLoc("SCM003");
-				cate.setMaxRow(20);
-				mav.addObject("bestGoodsList", goodsService.getContentsCategoryGoodsList(cate));
+				Contents contents = new Contents();
+				contents.setContentsLoc("SCM003");
+				contents.setCateNo(cate.getCate1No());
+				contents.setMaxRow(1);
+				Collection<Contents> conList = displayService.getContentsList(contents);
+				mav.addObject("bestGoodsList", null);
+				for(Contents contentsData : conList){
+					cate.setContentsLoc("SCM003");
+					cate.setMaxRow(Integer.parseInt(contentsData.getStrVar1()));
+					mav.addObject("bestGoodsList", goodsService.getContentsCategoryGoodsList(cate));
+				}
 			}
 
 			cateMainLayoutList.add(cateMain);

+ 49 - 31
src/main/java/com/style24/front/biz/web/TsfGoodsController.java

@@ -215,7 +215,9 @@ public class TsfGoodsController extends TsfBaseController {
 				// 상품 옵션1(색상) 정보
 				mav.addObject("goodsOption1List", goodsService.getGoodsOption1List(paramsGoods));
 				// 상품 옵션2(사이즈) 정보
-				if (StringUtils.isEmpty(paramsGoods.getMastrGoodsCd())) paramsGoods.setMastrGoodsCd(goods.getGoodsCd());
+				if (StringUtils.isEmpty(paramsGoods.getMastrGoodsCd())) {
+					paramsGoods.setMastrGoodsCd(goods.getGoodsCd());
+				}
 				mav.addObject("goodsOption2List", goodsService.getGoodsOption2List(paramsGoods));
 //				} else {
 //					mav.addObject("goodsOptionList", goodsService.getGoodsOptionList(paramsGoods));
@@ -241,11 +243,10 @@ public class TsfGoodsController extends TsfBaseController {
 			// 다다익선
 			paramsGoods.setMaxRownum(1);
 			mav.addObject("tmtbList", goodsService.getTmtbList(paramsGoods));
-			
+
 			// 사은품
 			paramsGoods.setMaxRownum(1);
 			mav.addObject("freeGoodsList", goodsService.getFreeGoodsList(paramsGoods));
-			
 
 			// 베스트 상품평
 			Review review = new Review();
@@ -256,14 +257,14 @@ public class TsfGoodsController extends TsfBaseController {
 				review.setRownum(1);
 			}
 			mav.addObject("bestReviewList", reviewService.getReviewList(review));
-			
+
 			if (!"P".equals(goods.getFrontGb())) {
 				paramsGoods.setMaxRownum(20);
-				mav.addObject("goodsList", goodsService.getTmtbGoodsList(paramsGoods));	
+				mav.addObject("goodsList", goodsService.getTmtbGoodsList(paramsGoods));
 			}
-			
+
 		}
-		
+
 		// 상품 문의건수
 		Counsel counsel = new Counsel();
 		counsel.setRelGoodsCd(goods.getGoodsCd());
@@ -288,10 +289,9 @@ public class TsfGoodsController extends TsfBaseController {
 		boolean isSslServer = Boolean.parseBoolean(hasSsl);
 		//log.info("isSslServer: [{}]", isSslServer);
 		setTodayGoodsCd(paramsGoods);
-		
+
 		mav.addObject("params", paramsGoods);
 		mav.addObject("afLinkCd", afLinkCd);	// 파라미터 제휴코드
-		
 
 		if (TscConstants.GoodsType.DEAL.value().equals(goods.getGoodsType())) {
 			if ("Y".equals(mobileYn)) {
@@ -670,7 +670,9 @@ public class TsfGoodsController extends TsfBaseController {
 
 		// 자사 일반상품- 옵션2(사이즈) 정보
 		paramsGoods.setOptCd1(colorCd);
-		if (StringUtils.isEmpty(paramsGoods.getMastrGoodsCd())) paramsGoods.setMastrGoodsCd(goods.getGoodsCd());
+		if (StringUtils.isEmpty(paramsGoods.getMastrGoodsCd())) {
+			paramsGoods.setMastrGoodsCd(goods.getGoodsCd());
+		}
 		mav.addObject("goodsOption2List", goodsService.getGoodsOption2List(paramsGoods));
 
 		mav.setViewName(super.getDeviceViewName("goods/GoodsInstockAlarmForm"));
@@ -841,13 +843,12 @@ public class TsfGoodsController extends TsfBaseController {
 	 */
 	@PostMapping("/review/detail/layer")
 	public ModelAndView goodsReviewDetailForm(Review review) {
-		//log.info("goodsReviewDetailForm {}", review);
+		log.info("goodsReviewDetailForm {}", review);
 		ModelAndView mav = new ModelAndView();
 		// 상품관련 기본값 설정(회원 등급, 앱, PC/모바일 등)
 		Goods paramsGoods = new Goods();
 		paramsGoods.setGoodsCd(review.getGoodsCd());
 		setGoods(paramsGoods);
-		// Goods goods = goodsService.getGoodsInfo(paramsGoods);
 
 		// 상품 기본정보
 		mav.addObject("params", paramsGoods);
@@ -860,6 +861,21 @@ public class TsfGoodsController extends TsfBaseController {
 		return mav;
 	}
 
+	/**
+	 * 상품상세 -  상품평 상세 레이어
+	 * @return
+	 * @author eskim
+	 * @since 2021. 3. 8
+	 */
+	@PostMapping("/review/detail/list")
+	@ResponseBody
+	public GagaMap getReviewDetailList(@RequestBody Review review) {
+		log.info("getReviewDetailList {}", review);
+		GagaMap result = new GagaMap();
+		result.set("reviewList", reviewService.getReviewList(review));
+		return result;
+	}
+
 	/**
 	 * 상품상세 - 다다익선 상품
 	 * 
@@ -896,7 +912,7 @@ public class TsfGoodsController extends TsfBaseController {
 		// 상품관련 기본값 설정(회원 등급, 앱, PC/모바일 등)
 		setGoods(goods);
 		goods.setMaxRownum(15);
-		String [] arrGoodsCd= {"10813855",
+		String[] arrGoodsCd = {"10813855",
 			"L171TJ561P",
 			"B172SH710P",
 			"B192DO995P",
@@ -915,7 +931,7 @@ public class TsfGoodsController extends TsfBaseController {
 			"L171TJ501P",
 			"10814432",
 			"B192SH730P"};
-		
+
 		StringBuilder sql = new StringBuilder();
 		if (arrGoodsCd.length > 0) {
 			int idx = 1;
@@ -928,8 +944,8 @@ public class TsfGoodsController extends TsfBaseController {
 				}
 			}
 			goods.setGoodsSql(sql.toString());
-		}	
-		
+		}
+
 		goods.setArrGoodsCd(arrGoodsCd);
 		mav.addObject("goodsList", goodsService.getRecommendGoodsList(goods));
 		//log.info("goodsTogetherForm = goods{}", goods);
@@ -953,8 +969,8 @@ public class TsfGoodsController extends TsfBaseController {
 		// 상품관련 기본값 설정(회원 등급, 앱, PC/모바일 등)
 		setGoods(goods);
 		goods.setMaxRownum(15);
-		
-		String [] arrGoodsCd= {"10813855",
+
+		String[] arrGoodsCd = {"10813855",
 			"L171TJ561P",
 			"B172SH710P",
 			"B192DO995P",
@@ -973,7 +989,7 @@ public class TsfGoodsController extends TsfBaseController {
 			"L171TJ501P",
 			"10814432",
 			"B192SH730P"};
-		
+
 		StringBuilder sql = new StringBuilder();
 		if (arrGoodsCd.length > 0) {
 			int idx = 1;
@@ -986,10 +1002,10 @@ public class TsfGoodsController extends TsfBaseController {
 				}
 			}
 			goods.setGoodsSql(sql.toString());
-		}	
-		
+		}
+
 		goods.setArrGoodsCd(arrGoodsCd);
-		
+
 		mav.addObject("goodsList", goodsService.getRecommendGoodsList(goods));
 		//log.info("goodsRecommendForm = goods{}", goods);
 		mav.addObject("params", goods);
@@ -1012,8 +1028,8 @@ public class TsfGoodsController extends TsfBaseController {
 		// 상품관련 기본값 설정(회원 등급, 앱, PC/모바일 등)
 		setGoods(goods);
 		goods.setMaxRownum(15);
-		
-		String [] arrGoodsCd= {"10813855",
+
+		String[] arrGoodsCd = {"10813855",
 			"L171TJ561P",
 			"B172SH710P",
 			"B192DO995P",
@@ -1032,7 +1048,7 @@ public class TsfGoodsController extends TsfBaseController {
 			"L171TJ501P",
 			"10814432",
 			"B192SH730P"};
-		
+
 		StringBuilder sql = new StringBuilder();
 		if (arrGoodsCd.length > 0) {
 			int idx = 1;
@@ -1045,10 +1061,10 @@ public class TsfGoodsController extends TsfBaseController {
 				}
 			}
 			goods.setGoodsSql(sql.toString());
-		}	
-		
+		}
+
 		goods.setArrGoodsCd(arrGoodsCd);
-		
+
 		mav.addObject("goodsList", goodsService.getRecommendGoodsList(goods));
 		//log.info("goodsLikeForm = goods{}", goods);
 		mav.addObject("params", goods);
@@ -1134,7 +1150,9 @@ public class TsfGoodsController extends TsfBaseController {
 
 		//log.info("goods = {}", goods);
 		GagaMap result = new GagaMap();
-		if (StringUtils.isEmpty(goods.getMastrGoodsCd())) goods.setMastrGoodsCd(goods.getGoodsCd());
+		if (StringUtils.isEmpty(goods.getMastrGoodsCd())) {
+			goods.setMastrGoodsCd(goods.getGoodsCd());
+		}
 		result.set("dataList", goodsService.getGoodsOption2List(goods));
 
 		return result;
@@ -1396,7 +1414,7 @@ public class TsfGoodsController extends TsfBaseController {
 		wishList = wishListService.getWishListGoodsList(wish);
 		return wishList;
 	}
-	
+
 	/**
 	 * ep 쿠폰 목록
 	 *
@@ -1411,7 +1429,7 @@ public class TsfGoodsController extends TsfBaseController {
 		// 상품관련 기본값 설정(회원 등급, 앱, PC/모바일 등)
 		Goods paramsGoods = new Goods();
 		setGoods(paramsGoods);
-		
+
 		// 순서중요 setGoods 이후에 설정
 		paramsGoods.setAfLinkCd(paramMap.get("afLinkCd"));
 		paramsGoods.setGoodsCd(paramMap.get("goodsCd"));

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

@@ -149,7 +149,7 @@ public class Goods extends TscBaseDomain {
 	private Integer reviewSq;
 	private String goodsStatNm;
 	private String regDtMonth;
-	
+
 	private int goodsQnaCnt;	// 상품문의건수
 
 	private String sizeGb;		// 사이즈구분(T:상의, B:하의, S:신발)
@@ -159,10 +159,11 @@ public class Goods extends TscBaseDomain {
 
 	private String skuModelNo;		// SKUModelNo(WMS)
 	private String compsGoodsCd;	// 세트 구성품 상품번호
-	private String mastrGoodsCd; 	
+	private String mastrGoodsCd;
 	private String optCd;			// 옵션코드
 	private String optCd1;			// 옵션코드1
 	private String optCd2;			// 옵션코드2
+	private String optCd1Nm;
 	private int qty;				// 세트 상품 구성 수량
 	private String itemCd;			// 단품코드
 
@@ -196,5 +197,9 @@ public class Goods extends TscBaseDomain {
 	private String goodsSql;	// 오늘본상품SQL
 
 	private String likeIt;			// 위시리스트에담긴상품
+	private String videoVal;
+	private String colorChips;
+	private String sizes;
+	private String icon;
 
 }

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

@@ -50,9 +50,9 @@ public class Review extends TscBaseDomain {
 	private String admRpl;			// 관리자댓글
 	private int admRplRegNo;		// 댓글등록자번호
 	private String admRplDt;		// 관리자댓글등록일시
-	private String frontGb;			
+	private String frontGb;
 	private String custGb;
-	
+
 	private String custId;			// 고객ID
 	private String sysImgNm;		// 상품대표이미지
 	private String sizeGb;			// 사이즈구분(T:상의, B:하의, S:신발)
@@ -67,7 +67,7 @@ public class Review extends TscBaseDomain {
 	private String selfGoodsYn;		// 자사상품여부
 	private int iscore;				// 구매평점(상품상세용)
 	private int rownum;
-	
+
 	private String reviewScore;		// 상품평 검색조건 평점
 	private String reviewOption;	// 상품평 검색조건 옵션
 	private String reviewHeight;	// 상품평 검색조건 키	0-150
@@ -76,7 +76,7 @@ public class Review extends TscBaseDomain {
 	private String reviewWeight;	// 상품평 검색조건 몸무게	0-50
 	private int reviewWeightSt;	// 상품평 검색조건 몸무게 구간시작	0
 	private int reviewWeightEd;	// 상품평 검색조건 몸무게 구간종료	50
-	
+
 	private String reviewSysImg;	// 리뷰대표이미지
 	private String sysFileNm;		//시스템 파일명
 	private String orgFileNm;		// 원본 파일명
@@ -97,11 +97,12 @@ public class Review extends TscBaseDomain {
 	private String brandEnm;
 	private String optCd1;
 	private String optCd2;
+	private String optCd1Nm;
 	private String remainDt;
 	private String itemNm;
-	private String colorNm;	
-	
-	
+	private String colorNm;
+	private int prevReviewSq;
+	private int nextReviewSq;
 
 	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
 	private String[] orgFileNmArr;
@@ -119,17 +120,18 @@ public class Review extends TscBaseDomain {
 	private String[] optCd2Arr;		// 옵션코드
 	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
 	private String[] itemQtyArr;	// 구성상품번호
+
 	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
-	
+
 	// Masking
 	public String getMaskingCustId() {
-		return (this.custId != null) ?  MaskingUtils.id(this.custId) : this.custId;
+		return (this.custId != null) ? MaskingUtils.id(this.custId) : this.custId;
 	}
-	
+
 	Collection<ReviewAttach> reviewAttachList;	//상품평 첨부파일목록
-	
+
 	Collection<Goods> goodsOptionList;			//상품평 상품 옵션목록
-	
+
 	// Pagination
 	@JsonInclude(JsonInclude.Include.NON_EMPTY)
 	private TscPageRequest pageable;
@@ -139,10 +141,9 @@ public class Review extends TscBaseDomain {
 	private int pageNo = 1;							// 페이지번호
 	private int pageSize = 5;						// 페이지목록수
 	private int pageUnit = 10;						// 페이지번호수
-	
+
 	private int pageNo2 = 1;							// 페이지번호
 	private int pageSize2 = 5;						// 페이지목록수
 	private int pageUnit2 = 10;						// 페이지번호수
-	
-	
+
 }

+ 44 - 0
src/main/java/com/style24/persistence/domain/SweetTracker.java

@@ -0,0 +1,44 @@
+package com.style24.persistence.domain;
+
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Data;
+
+/**
+ * 스윗트래커 Domain
+ * 
+ * @author moon
+ * @since 2021. 04. 13
+ */
+@SuppressWarnings("serial")
+@Data
+public class SweetTracker extends TscBaseDomain {
+
+	private String fid;            // 식별값
+	private String invoice_no;	   // 운송장번호
+	private String time_trans; 	   // 택배사 처리시간
+	private String time_sweet; 	   // 스윗트래커 등록시간
+	private String where; 		   // 택배 위치
+	private String telno_office;   // 사업소 기반 전화번호
+	private String telno_man; 	   // 배송기사 전화번호
+	private String details; 	   // 배송상세 정보
+	private String recv_addr; 	   // 수취인 주소
+	private String recv_name; 	   // 수취인 이름
+	private String send_name; 	   // 발신인 이름
+	private String man; 		   // 배송기사 이름
+	private String estmate;        // 배송예정 시간
+	private String delvLevel;
+	private String delvWhere; 
+	private String chgStat;
+	private String ordDtlStat; 
+	private String courier_code;
+	private String secret_value;
+	
+	
+	private Integer level; 	  // 배송단계(1~6단계)
+	private Integer ordDtlNo;
+	private Integer ordChgSq;
+	private Integer tmp_sq;
+	
+
+}

+ 104 - 0
src/main/java/com/style24/persistence/mybatis/shop/TsfDelivery.xml

@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.style24.front.biz.dao.TsfDeliveryDao">
+
+	<!-- 스윗트래커정보 등록   -->
+	<insert id="insertTbSweetTracker" parameterType="SweetTracker" >
+		/*TssDelivery.insertTbSweetTracker*/
+		INSERT INTO TB_SWEET_TRACKER 
+		(
+			  SHIP_COMP_CD		-- 택배사코드
+			, INVOICE_NO		-- 운송장번호			
+			, DELV_LEVEL		-- 배송단계  			
+			, TIME_TRANS		-- 택배사 처리시간		
+			, TIME_SWEET		-- 스윗트래커 등록시간	
+			, DELV_WHERE		-- 택배 위치			
+			, TELNO_OFFICE		-- 사업소 기반 전화번호	
+			, TELNO_MAN			-- 배송기사 전화번호		
+			, DETAILS			-- 배송상세 정보		
+			, RECV_ADDR			-- 수취인 주소			
+			, RECV_NAME			-- 수취인 이름			
+			, SEND_NAME			-- 발신인 이름			
+			, MAN				-- 배송기사 이름		
+			, ESTMATE			-- 배송예정 시간		
+			, REG_DT			-- 등록일시
+		)
+		VALUES
+		(
+			  #{courier_code}
+			, #{invoice_no}		-- 운송장번호			
+			, #{delvLevel}		-- 배송단계  			
+			, #{time_trans}		-- 택배사 처리시간		
+			, #{time_sweet}		-- 스윗트래커 등록시간	
+			, #{delvWhere}		-- 택배 위치			
+			, #{telno_office}	-- 사업소 기반 전화번호	
+			, #{telno_man}		-- 배송기사 전화번호		
+			, #{details}		-- 배송상세 정보		
+			, #{recv_addr}		-- 수취인 주소			
+			, #{recv_name}		-- 수취인 이름			
+			, #{send_name}		-- 발신인 이름			
+			, #{man}			-- 배송기사 이름		
+			, #{estmate}		-- 배송예정 시간		
+			, NOW()
+		) ON DUPLICATE KEY
+		  UPDATE
+		  REG_DT = NOW()
+	</insert>
+
+	<!-- 주문상세번호 조회 -->	
+	<select id="getOrdDtlNoList" resultType="SweetTracker">
+		/*TssDelivery.getOrdDtlNoList*/
+		SELECT ORD_DTL_NO FROM TB_ORDER_DETAIL WHERE INVOICE_NO = #{invoice_no}
+		
+	</select>
+	
+	<!-- 주문상세 상태값 변경    -->
+	<update id="updateTbOrderDtlStat" parameterType="SweetTracker" >
+		/*TssDelivery.updateTbOrderDtlStat*/
+		UPDATE TB_ORDER_DETAIL SET
+			  ORD_DTL_STAT = #{ordDtlStat}
+			, UPD_NO       = #{regNo}
+			, UPD_DT       = NOW()
+		WHERE ORD_DTL_NO   = #{ordDtlNo}
+	</update>	
+	
+	
+	<!-- 주문변경번호 조회 -->	
+	<select id="getOrdChgSqList" resultType="SweetTracker">
+		/*TssDelivery.getOrdChgSqList*/
+		SELECT A.ORD_CHG_SQ , B.ORD_DTL_NO
+		  FROM TB_ORDER_CHANGE A 
+		  JOIN TB_ORDER_CHANGE_DETAIL B ON A.ORD_CHG_SQ = B.ORD_CHG_SQ 
+		 WHERE A.WD_INVOICE_NO  =  #{invoice_no}
+		   AND B.DEL_YN = 'N'
+	</select>
+	
+	<!-- 주문상세 상태값 변경    -->
+	<update id="updateOrdChgSqStat" parameterType="SweetTracker" >
+		/*TssDelivery.updateOrdChgSqStat*/
+		UPDATE TB_ORDER_CHANGE_DETAIL SET
+			  CHG_STAT = #{chgStat}  -- G685_31
+			, UPD_NO   = #{regNo}
+			, UPD_DT   = NOW()
+		WHERE ORD_CHG_SQ = #{ordChgSq}
+		  AND ORD_DTL_NO = #{ordDtlNo}
+	</update>	
+
+	
+	<!-- 주문상세 상태값 변경    -->
+	<insert id="saveTemp" parameterType="SweetTracker" keyProperty="tmp_sq">
+		/*TssDelivery.saveTemp*/
+		insert into tb_sw_temp 
+		(
+			  msg
+			, reg_dt 
+		)values
+		(
+			#{man}
+			, now()
+		)
+	</insert>	
+	
+	
+
+</mapper>

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

@@ -1019,6 +1019,19 @@
 		AND    OPT_CD1 = G.MAIN_COLOR_CD
 		AND    DISP_YN = 'Y'
 		) AS SIZES /*사이즈*/
+		, (
+		SELECT GROUP_CONCAT(CONCAT(BENEFIT_GB,':',BENEFIT_NM) ORDER BY NUMB SEPARATOR ',')
+		FROM   (
+		SELECT GB.BENEFIT_GB
+		, CASE WHEN GB.BENEFIT_GB = '10' THEN '쿠폰할인'
+		       WHEN GB.BENEFIT_GB = '20' THEN '무료배송'
+		       WHEN GB.BENEFIT_GB = '30' THEN '사은품'
+		       ELSE '신상' END AS BENEFIT_NM
+		, RANK() OVER(ORDER BY GB.BENEFIT_GB, GB.GOODS_CD) AS NUMB
+		FROM   TB_GOODS_BENEFIT GB
+		WHERE  GB.GOODS_CD = G.GOODS_CD
+		) Z
+		) AS ICON
 		, FORMAL_GB
 		, REG_DT
 		, NUMB

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

@@ -744,7 +744,7 @@
 		         , FN_GET_BENEFIT_PRICE(#{frontGb},G.GOODS_CD, G.CURR_PRICE,#{custGb}) AS CURR_PRICE
 		         , (SELECT MAX(SYS_IMG_NM) FROM TB_GOODS_IMG WHERE GOODS_CD = G.GOODS_CD AND COLOR_CD = IFNULL(G.MAIN_COLOR_CD,'XX') AND DEFAULT_IMG_YN = 'Y') AS SYS_IMG_NM
 		         , (SELECT MAX(SYS_IMG_NM) FROM TB_GOODS_IMG WHERE GOODS_CD = G.GOODS_CD AND COLOR_CD = IFNULL(G.MAIN_COLOR_CD,'XX') AND MOUSEOVER_IMG_YN = 'Y') AS SYS_IMG_NM2
-		         , (CASE WHEN G.GOODS_CD IS NULL THEN 'N' ELSE 'Y' END) AS WISH_YN
+		         , (CASE WHEN W.GOODS_CD IS NULL THEN 'N' ELSE 'Y' END) AS WISH_YN
 		    FROM TAB_MASTER_GOODS G
 		    LEFT OUTER JOIN TB_WISHLIST W ON G.GOODS_CD = W.GOODS_CD
 		                                  AND IFNULL(#{custNo}, 0) = W.CUST_NO
@@ -835,7 +835,7 @@
 		         , FN_GET_BENEFIT_PRICE(#{frontGb},G.GOODS_CD, G.CURR_PRICE,#{custGb}) AS CURR_PRICE
 		         , (SELECT MAX(SYS_IMG_NM) FROM TB_GOODS_IMG WHERE GOODS_CD = G.GOODS_CD AND COLOR_CD = IFNULL(G.MAIN_COLOR_CD,'XX') AND DEFAULT_IMG_YN = 'Y') AS SYS_IMG_NM
 		         , (SELECT MAX(SYS_IMG_NM) FROM TB_GOODS_IMG WHERE GOODS_CD = G.GOODS_CD AND COLOR_CD = IFNULL(G.MAIN_COLOR_CD,'XX') AND MOUSEOVER_IMG_YN = 'Y') AS SYS_IMG_NM2
-		         , (CASE WHEN G.GOODS_CD IS NULL THEN 'N' ELSE 'Y' END) AS WISH_YN
+		         , (CASE WHEN W.GOODS_CD IS NULL THEN 'N' ELSE 'Y' END) AS WISH_YN
 		    FROM TAB_MASTER_GOODS G
 		    LEFT OUTER JOIN TB_WISHLIST W ON G.GOODS_CD = W.GOODS_CD
 		                                  AND IFNULL(#{custNo}, 0) = W.CUST_NO
@@ -1129,11 +1129,14 @@
 		                 , ROW_NUMBER() OVER(ORDER BY GS.SELL_WEEK_QTY DESC
 		                                            , G.GOODS_CD) AS NUMB
 		                     </when>
-							 <when test="contentsLoc == 'SMM009' or contentsLoc == 'SMM007'"> <!-- md추천 -->
-						 , ROW_NUMBER() OVER(ORDER BY CTG.DISP_ORD
-								 , G.REG_DT DESC
-								 , G.GOODS_CD) AS NUMB
-							 </when>
+		                     <when test="contentsLoc == 'SMM009' or contentsLoc == 'SMM007'"> <!-- md추천 -->
+		                 , ROW_NUMBER() OVER(ORDER BY CTG.DISP_ORD
+		                 , G.REG_DT DESC
+		                 , G.GOODS_CD) AS NUMB
+		                     </when>
+		                     <when test="contentsLoc == 'SCM002' or contentsLoc == 'SCM003'"> <!-- md추천 -->
+		                  , ROW_NUMBER() OVER(ORDER BY CG.DISP_ORD ,G.UPD_DT DESC, G.CURR_PRICE DESC, G.GOODS_CD ASC) AS NUMB
+		                     </when>
 		                     <otherwise>
 		                 , ROW_NUMBER() OVER(ORDER BY CG.DISP_ORD
 		                                            , G.REG_DT DESC

+ 38 - 24
src/main/java/com/style24/persistence/mybatis/shop/TsfReview.xml

@@ -146,42 +146,42 @@
 		     , C.CUST_ID 
 		     , (SELECT MAX(SYS_IMG_NM) FROM TB_GOODS_IMG WHERE GOODS_CD = G.GOODS_CD AND COLOR_CD = IFNULL(G.MAIN_COLOR_CD,'XX') AND DEFAULT_IMG_YN = 'Y') AS SYS_IMG_NM
 		     , (SELECT TI.SIZE_GB FROM TB_ITEMKIND TI WHERE TI.ITEMKIND_CD = G.ITEMKIND_CD) AS SIZE_GB
-		     , (SELECT MAX(REVIEW_SQ) 
-		        FROM TB_REVIEW R
-		        WHERE REVIEW_SQ <![CDATA[<]]> #{reviewSq} 
-		        AND GOODS_CD = R.GOODS_CD 
-		        AND DEL_YN = 'N'
+		     , (SELECT MAX(RP.REVIEW_SQ) 
+		        FROM TB_REVIEW RP
+		        WHERE RP.REVIEW_SQ <![CDATA[<]]> #{reviewSq} 
+		        AND RP.GOODS_CD = R.GOODS_CD 
+		        AND RP.DEL_YN = 'N'
 		        <if test='bestYn != null and bestYn == "Y"'>
-		        AND BEST_YN = 'Y'
+		        AND RP.BEST_YN = 'Y'
 		        </if>
 		        <if test='photoYn != null and photoYn == "Y"'>
 		        AND EXISTS (SELECT 1 
-		                    FROM TB_REVIEW_ATTACH 
-		                    WHERE DEL_YN = 'N' 
-		                    AND REVIEW_SQ = R.REVIEW_SQ
-		                    AND (FILE_GB  = 'I'
+		                    FROM TB_REVIEW_ATTACH RPA
+		                    WHERE RPA.DEL_YN = 'N' 
+		                    AND RPA.REVIEW_SQ = RP.REVIEW_SQ
+		                    AND (RPA.FILE_GB  = 'I'
 		                         OR
-		                         FILE_GB = 'M' AND R.CONFIRM_YN = 'Y'
+		                         RPA.FILE_GB = 'M' AND RP.CONFIRM_YN = 'Y'  AND  RPA.KMC_KEY IS NOT NULL
 		                        )
 		                    )
 		        </if>
 		        ) AS PREV_REVIEW_SQ
-		     , (SELECT MIN(REVIEW_SQ) 
-		        FROM TB_REVIEW 
-		        WHERE REVIEW_SQ > #{reviewSq}
-		        AND GOODS_CD = R.GOODS_CD 
-		        AND DEL_YN = 'N'
+		     , (SELECT MIN(RN.REVIEW_SQ) 
+		        FROM TB_REVIEW RN
+		        WHERE RN.REVIEW_SQ > #{reviewSq}
+		        AND RN.GOODS_CD = R.GOODS_CD 
+		        AND RN.DEL_YN = 'N'
 		        <if test='bestYn != null and bestYn == "Y"'>
-		        AND BEST_YN = 'Y'
+		        AND RN.BEST_YN = 'Y'
 		        </if>
 		        <if test='photoYn != null and photoYn == "Y"'>
 		        AND EXISTS (SELECT 1 
-		                    FROM TB_REVIEW_ATTACH 
-		                    WHERE DEL_YN = 'N' 
-		                    AND REVIEW_SQ = R.REVIEW_SQ
-		                    AND (FILE_GB  = 'I'
+		                    FROM TB_REVIEW_ATTACH RNA
+		                    WHERE RNA.DEL_YN = 'N' 
+		                    AND RNA.REVIEW_SQ = RN.REVIEW_SQ
+		                    AND (RNA.FILE_GB  = 'I'
 		                         OR
-		                         FILE_GB = 'M' AND R.CONFIRM_YN = 'Y'
+		                         RNA.FILE_GB = 'M' AND RN.CONFIRM_YN = 'Y'  AND  RNA.KMC_KEY IS NOT NULL
 		                        )
 		                    )
 		        </if>
@@ -208,7 +208,7 @@
 		            AND REVIEW_SQ = R.REVIEW_SQ
 		            AND (FILE_GB  = 'I'
 		                 OR
-		                 FILE_GB = 'M' AND R.CONFIRM_YN = 'Y' AND  KMC_EKY IS NOT NULL
+		                 FILE_GB = 'M' AND R.CONFIRM_YN = 'Y' AND  KMC_KEY IS NOT NULL
 		                )
 		            )
 		</if>
@@ -274,7 +274,7 @@
 		AND R.REVIEW_SQ = #{reviewSq}
 		AND (A.FILE_GB  = 'I'
 		     OR
-		     A.FILE_GB = 'M' AND R.CONFIRM_YN = 'Y' AND  A.KMC_EKY IS NOT NULL
+		     A.FILE_GB = 'M' AND R.CONFIRM_YN = 'Y' AND  A.KMC_KEY IS NOT NULL
 		    )
 	</select>
 	
@@ -289,6 +289,7 @@
 		     , ODI.ITEM_CD 
 		     , ODI.OPT_CD1 
 		     , ODI.OPT_CD2
+		     , IFNULL(C.COLOR_KNM, ODI.OPT_CD1) AS OPT_CD1_NM
 		FROM TB_REVIEW R 
 		INNER JOIN TB_ORDER_DETAIL OD ON R.ORD_NO = OD.ORD_NO 
 		                              AND R.ORD_DTL_NO  = OD.ORD_DTL_NO
@@ -296,6 +297,8 @@
 		INNER JOIN TB_ORDER_DETAIL_ITEM ODI ON OD.ORD_NO = ODI.ORD_NO 
 		                                    AND OD.ORD_DTL_NO  = ODI.ORD_DTL_NO
 		INNER JOIN TB_GOODS G ON ODI.ITEM_CD = G.GOODS_CD
+		LEFT OUTER JOIN TB_COLOR C ON ODI.OPT_CD1 = C.COLOR_CD
+		                           AND C.USE_YN = 'Y'
 		WHERE R.REVIEW_SQ = #{reviewSq} 
 		AND R.GOODS_CD = #{goodsCd}
 	</select>
@@ -341,6 +344,7 @@
 		     , GROUP_CONCAT(Z.COLOR_NM ORDER BY Z.ORD_DTL_ITEM_SQ) AS COLOR_NM
 		     , GROUP_CONCAT(Z.OPT_CD1 ORDER BY Z.ORD_DTL_ITEM_SQ) AS OPT_CD1
 		     , GROUP_CONCAT(Z.OPT_CD2 ORDER BY Z.ORD_DTL_ITEM_SQ) AS OPT_CD2
+		     , GROUP_CONCAT(Z.OPT_CD1_NM ORDER BY Z.ORD_DTL_ITEM_SQ) AS OPT_CD1_NM
 		     , Z.ORD_NO
 		     , Z.ORD_DT
 		     , Z.PAY_DT
@@ -392,6 +396,7 @@
 		             , ODI.ORD_DTL_ITEM_SQ
 					 , ODI.OPT_CD1
 					 , ODI.OPT_CD2
+					 , IFNULL(C.COLOR_KNM, ODI.OPT_CD1) AS OPT_CD1_NM
 					 , G.LIST_PRICE
 		             , G.GOODS_TYPE
 		             , CASE WHEN G.GOODS_TYPE != 'G056_S' AND G.SELF_GOODS_YN = 'Y' THEN (SELECT MAX(SYS_IMG_NM) FROM TB_GOODS_IMG WHERE GOODS_CD = G.GOODS_CD AND COLOR_CD = ODI.OPT_CD1 AND DEFAULT_IMG_YN = 'Y')
@@ -444,6 +449,8 @@
 									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
 				AND O.PAY_DT >  DATE_FORMAT(DATE_ADD(CURRENT_DATE(), INTERVAL -90 DAY), '%Y%M%D%H%I%S') 
 				AND O.ORD_NO NOT IN (SELECT R.ORD_NO FROM TB_REVIEW R WHERE R.DEL_YN = 'N' AND DISP_YN = 'Y')
@@ -467,6 +474,7 @@
 		     , GROUP_CONCAT(Z.COLOR_NM ORDER BY Z.ORD_DTL_ITEM_SQ) AS COLOR_NM
 		     , GROUP_CONCAT(Z.OPT_CD1 ORDER BY Z.ORD_DTL_ITEM_SQ) AS OPT_CD1
 		     , GROUP_CONCAT(Z.OPT_CD2 ORDER BY Z.ORD_DTL_ITEM_SQ) AS OPT_CD2
+		     , GROUP_CONCAT(Z.OPT_CD1_NM ORDER BY Z.ORD_DTL_ITEM_SQ) AS OPT_CD1_NM
 		     , Z.ORD_NO
 		     , Z.ORD_DT
 		     , Z.PAY_DT
@@ -549,6 +557,7 @@
 		             , ODI.ORD_DTL_ITEM_SQ
 					 , ODI.OPT_CD1
 					 , ODI.OPT_CD2
+					 , IFNULL(C.COLOR_KNM, ODI.OPT_CD1) AS OPT_CD1_NM
 					 , G.LIST_PRICE
 		             , G.GOODS_TYPE
 		             , CASE WHEN G.GOODS_TYPE != 'G056_S' AND G.SELF_GOODS_YN = 'Y' THEN (SELECT MAX(SYS_IMG_NM) FROM TB_GOODS_IMG WHERE GOODS_CD = G.GOODS_CD AND COLOR_CD = ODI.OPT_CD1 AND DEFAULT_IMG_YN = 'Y')
@@ -638,6 +647,8 @@
 									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
 				AND O.PAY_DT >  DATE_FORMAT(DATE_ADD(CURRENT_DATE(), INTERVAL -90 DAY), '%Y%M%D%H%I%S') 
 				<choose>
@@ -838,6 +849,7 @@
 			      ,ODI.OPT_CD 
 			      ,ODI.OPT_CD1
 			      ,ODI.OPT_CD2
+			      ,IFNULL(C.COLOR_KNM, ODI.OPT_CD1) AS OPT_CD1_NM
 			      ,ODI.ITEM_QTY 
 			      ,ODI.ITEM_PRICE
 			      ,G.GOODS_NM 
@@ -906,6 +918,8 @@
 			                              		AND R.DEL_YN = 'N'
 			                              		AND R.DISP_YN = 'Y'
 			                LEFT JOIN TB_ITEMKIND I ON G.ITEMKIND_CD = I.ITEMKIND_CD 
+			                LEFT OUTER JOIN TB_COLOR C ON ODI.OPT_CD1 = C.COLOR_CD
+		                                               AND C.USE_YN = 'Y'
 			WHERE 1=1
 				AND O.CUST_NO = #{custNo}
 				AND O.DISP_YN = 'Y'

+ 85 - 8
src/main/webapp/WEB-INF/views/web/common/fragments/GnbWeb.html

@@ -666,7 +666,7 @@
 						
 						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) {
 										let gnbCate = fnGetGnbCategory(allCateItem);
@@ -675,6 +675,13 @@
 										$('#ulGnbTab').append(gnbCate);
 									}
 								});
+							} else if(item.contentsType == 'O'){
+								let outletCate = fnGetOutletCategory(item.gtabNm);
+
+								$('#divGnbTab').append(outletCate);
+								// $('#divGnbTab').append('<li><a href="' + item.linkUrl + '">' + item.gtabNm + '</a></li>');
+								$('#ulGnbTab').append('<li><a href="' + item.linkUrl + '">' + item.gtabNm + '</a></li>');
+								fnGetOutletLeafCategory();
 							} else if (item.contentsType == 'L') { // 컨텐츠유형:링크
 								$('#divGnbTab').append('<li><a href="' + item.linkUrl + '">' + item.gtabNm + '</a></li>');
 								$('#ulGnbTab').append('<li><a href="' + item.linkUrl + '">' + item.gtabNm + '</a></li>');
@@ -685,6 +692,76 @@
 			});
 	}
 
+	// OUTLET 탭 생성
+	var fnGetOutletCategory = function (outletNm){
+		var tag = '';
+		tag += '<li class="has_depth">\n'; //depth_menu 있을 시 has_depth 클래스 추가
+		tag += '	<a href="javascript:void(0);" onclick="cfnGoToOutletMain(\'G032_103\',\'1713\')">' + outletNm + '</a>\n';
+		tag += '	<div class="depth_menu category">\n';
+		tag += '		<div class="head_category">\n';
+		tag += '			<div class="tit">\n';
+		tag += '				<p>' + outletNm + '</p>\n';
+		tag += '				<a href="javascript:void(0);" onclick="cfnGoToOutletMain(\'G032_103\',\'1713\')" class="more">전체보기</a>\n';
+		tag += '			</div>\n';
+		let allCate = [[${allCateList}]];
+		tag += '			<div class="menu">\n';
+		tag += '				<ul class="maintabs" >\n';
+		$.each(allCate, function(allCateIdx, allCateItem) {
+			tag += '					<li id="cate'+allCateItem.cate1No+'">\n';
+			tag += '						<a href="javascript:void(0);" onclick="cfnGoToCategoryMain(\'' + allCateItem.cateGb + '\',' + allCateItem.cate1No + ');">' + allCateItem.cate1Nm + '</a>\n';
+			tag += '					</li>\n';
+		});
+		tag += '				</ul>\n';
+		tag += '			</div>\n';
+		tag += '		</div>\n';
+		tag += '	<div class="head_banner" id="outlet'+allCateItem.cate1No+'">\n';
+		tag += '	</div>';
+		tag += '	</div>\n';
+		tag += '</li>\n';
+		return tag;
+	}
+
+	var fnGetOutletLeafCategory = function(){
+		let allCate = [[${allCateList}]];
+		$.each(allCate, function(allCateIdx, allCateItem) {
+			let gnbCate = fnGetOutletLeafData(allCateIdx,allCateItem);
+			$('#cate'+allCateItem.cate1No).append(gnbCate);
+		});
+	}
+
+	var fnGetOutletLeafData= function (idx, cate1){
+		let tag2 = '';
+
+		if (cate1 != null) {
+			if (cate1.leafYn == 'N' && cate1.cate2List.length > 0) {
+				tag2 += '<ul class="box_depth2">';
+				$.each(cate1.cate2List, function(idx2, cate2) {
+					tag2 += '					<li>\n';
+					tag2 += '						<a href="javascript:void(0);" onclick="cfnGoToGoodsList(0,\'' + cate2.cateGb + '\',' + cate2.cate1No + ',' + cate2.cate2No + ');">' + cate2.cate2Nm + '</a>\n';
+					if (cate2.leafYn == 'N' && cate2.cate3List != null && cate2.cate3List.length > 0) {
+						tag2 += '						<ul class="box_depth2">\n';
+						$.each(cate2.cate3List, function(idx3, cate3) {
+							tag2 += '							<li>\n';
+							tag2 += '								<a href="javascript:void(0);" onclick="cfnGoToGoodsList(0,\'' + cate3.cateGb + '\',' + cate3.cate1No + ',' + cate3.cate2No + ',' + cate3.cate3No + ');">' + cate3.cate3Nm + '</a>\n';
+							if (cate3.leafYn == 'N' && cate3.cate4List != null && cate3.cate4List.length > 0) {
+								tag2 += '								<ul class="box_depth3">\n';
+								$.each(cate3.cate4List, function(idx4, cate4) {
+									tag2 += '									<li><a href="javascript:void(0);" onclick="cfnGoToGoodsList(0,\'' + cate4.cateGb + '\',' + cate4.cate1No + ',' + cate4.cate2No + ',' + cate4.cate3No + ',' + cate4.cate4No + ');">' + cate4.cate4Nm + '</a></li>\n';
+								});
+								tag2 += '								</ul>\n';
+							}
+							tag2 += '							</li>\n';
+						});
+						tag2 += '						</ul>\n';
+					}
+					tag2 += '					</li>\n';
+				});
+				tag2 += '</ul>';
+			}
+		}
+		return tag2;
+	}
+
 	// GNB탭 > 브랜드 생성
 	let fnCreateGnbBrandGroup = function() {
 		$.getJSON('/display/gnb/brand/group/list'
@@ -705,14 +782,14 @@
 								tag += '	<p>' + item.title + '</p>\n';
 								tag += '	<div class="brand_list swiper-container">\n';
 								tag += '		<ul class="clear swiper-wrapper">\n';
-							} else {
-								tag += '			<li class="swiper-slide">\n';
-								tag += '				<a href="javascript:void(0);" onclick="cfnGoToBrandMain(' + item.brandGroupNo + ');">\n';
-								tag += '					<img src="' + _uploadDefaultUrl + item.logoFileNm + '" alt=""/>\n';
-								tag += '					<span><em>' + item.brandGroupNm + '</em></span>\n';
-								tag += '				</a>\n';
-								tag += '			</li>\n';
 							}
+							tag += '			<li class="swiper-slide">\n';
+							tag += '				<a href="javascript:void(0);" onclick="cfnGoToBrandMain(' + item.brandGroupNo + ');">\n';
+							tag += '					<img src="' + _uploadDefaultUrl + item.logoFileNm + '" alt=""/>\n';
+							tag += '					<span><em>' + item.brandGroupNm + '</em></span>\n';
+							tag += '				</a>\n';
+							tag += '			</li>\n';
+
 							prevTitle = item.title;
 						});
 						tag += '		</ul>\n';

+ 48 - 36
src/main/webapp/WEB-INF/views/web/display/CategoryGoodsListFormWeb.html

@@ -385,6 +385,7 @@
 				let endRow = result.endRow - result.paging.pageable.pageSize;
 				var htm = fnCreateGoodsList(result, ithrCd, contentLoc, goodsUrl, lastPage, endRow);
 				gagaInfiniteScroll.draw(htm);
+				fnImgOnoff();
 			}else {
 				if($("#searchForm input[name=pageNo]").val()==1){
 					$('#listBox').html('<li class="none">상품정보가 존재하지 않습니다.</li>');
@@ -507,6 +508,53 @@
 			return tag;
 		}
 
+		var fnImgOnoff = function (){
+			var nowMov = $('.itemPic').children('.pd_mov');
+			var nowImg = $('.itemPic').children('.pd_img');
+			var ogrSrc;
+			var overSrc;
+			var srcName = nowImg.attr('src');
+			overSrc = srcName.substring(0, srcName.lastIndexOf('.'));
+
+			var img1;
+			var img2;
+
+			$(nowMov).on('mouseover', function() {
+				// [on] size opt
+				$(this).siblings(".itemOpt").stop().animate({"bottom": 0}, 400,"swing");
+				// [on] mov none
+				$(this).css("opacity","0");
+				// return false;
+			});
+			$(nowMov).on('mouseleave', function() {
+				// [off] size opt
+				$(this).siblings(".itemOpt").stop().animate({"bottom": -120}, 400,"swing");
+				// [off] mov block
+				$(this).css("opacity","1");
+				// return false;
+			});
+			$(nowImg).on('mouseover', function() {
+				img1 = $(this).attr('src');
+				img2 = $(this).attr('data-img');
+				// [on] size opt
+				$(this).siblings(".itemOpt").stop().animate({"bottom": 0}, 400,"swing");
+				// [on] re-Name
+				// ogrSrc = $(this).attr('src').substring(0, srcName.lastIndexOf('.'));
+				// overSrc = $(this).attr('src').substring(0, srcName.lastIndexOf('.'));
+				// $(this).attr('src', overSrc+ '_onhover.' + /[^.]+$/.exec(srcName));
+				$(this).attr('src',img2);
+				// return false;
+			});
+			$(nowImg).on('mouseleave', function() {
+				// [off] size opt
+				$(this).siblings(".itemOpt").stop().animate({"bottom": -120}, 400,"swing");
+				// [off] re-Name
+				// $(this).attr('src', overSrc + '.' + /[^.]+$/.exec(srcName));
+				$(this).attr('src', img1);
+				// return false;
+			});
+		}
+
 		// 사파리 - event.persisted || 크롬 - window.performance.navigation.type 이 1이면 새로고침, 2면 페이지 이동을 통한 캐쉬페이징
 		$(window).on("pageshow", function(event) {
 			$('#filterForm input[name=brand]:checked').each(function(){
@@ -566,43 +614,7 @@
 	<script>
 		//(진행 중)
 		$(document).ready( function() {
-			var nowMov = $('.itemPic').children('.pd_mov');
-			var nowImg = $('.itemPic').children('.pd_img');
-			var ogrSrc;
-			var overSrc;
-			var srcName = nowImg.attr('src');
-			overSrc = srcName.substring(0, srcName.lastIndexOf('.'));
 
-			$(nowMov).on('mouseover', function() {
-				// [on] size opt
-				$(this).siblings(".itemOpt").stop().animate({"bottom": 0}, 400,"swing");
-				// [on] mov none
-				$(this).css("opacity","0");
-				// return false;
-			});
-			$(nowMov).on('mouseleave', function() {
-				// [off] size opt
-				$(this).siblings(".itemOpt").stop().animate({"bottom": -120}, 400,"swing");
-				// [off] mov block
-				$(this).css("opacity","1");
-				// return false;
-			});
-			$(nowImg).on('mouseover', function() {
-				// [on] size opt
-				$(this).siblings(".itemOpt").stop().animate({"bottom": 0}, 400,"swing");
-				// [on] re-Name
-				ogrSrc = $(this).attr('src').substring(0, srcName.lastIndexOf('.'));
-				overSrc = $(this).attr('src').substring(0, srcName.lastIndexOf('.'));
-				$(this).attr('src', overSrc+ '_onhover.' + /[^.]+$/.exec(srcName));
-				// return false;
-			});
-			$(nowImg).on('mouseleave', function() {
-				// [off] size opt
-				$(this).siblings(".itemOpt").stop().animate({"bottom": -120}, 400,"swing");
-				// [off] re-Name
-				$(this).attr('src', overSrc + '.' + /[^.]+$/.exec(srcName));
-				// return false;
-			});
 		});
 	</script>
 

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

@@ -29,7 +29,7 @@
 	</div>
 
 	<div class="wrap">
-		<th:block th:if="${cateMainLayoutList}" th:each="mainLayoutData, mainStat : ${cateMainLayoutList}" th:with="contentsLoc=${#strings.replace(mainLayoutData.contentsLoc,'SCM','')},contentsTitle=${brandMainLayoutData.contentsTitle}">
+		<th:block th:if="${cateMainLayoutList}" th:each="mainLayoutData, mainStat : ${cateMainLayoutList}" th:with="contentsLoc=${#strings.replace(mainLayoutData.contentsLoc,'SCM','')},contentsTitle=${mainLayoutData.contentsTitle}">
 			<th:block th:if="${contentsLoc=='001'}">
 				<div class="content dp_submain" > <!-- 페이지특정 클래스 = dp_list -->
 					<div class="cont_head">
@@ -89,9 +89,9 @@
 						<div class="swiper-container post-trendy">
 							<div class="swiper-wrapper">
 								<div class="swiper-slide" th:each="item, status : ${newGoodsList}">
-									<div class="item_prod">
+									<div class="item_prod" th:if="${status.count<21}">
 										<div class="item_state">
-											<button type="button" class="itemLike" th:classappend="${item.likeIt}">관심상품 추가</button>
+											<button type="button" class="itemLike" th:classappend="${item.likeIt == 'likeit'}? 'likeit' : ''"  onclick="cfnPutWishList(this);" th:attr="goodsCd=${item.goodsCd}, ithrCd='', contentsLoc='SCM001', planDtlSq=''">관심상품 추가</button>
 											<a href="javascript:void(0);" class="itemLink" th:onclick="cfnGoToGoodsDetail([[${item.goodsCd}]], '', '', 'SCM001');">
 												<div class=" itemPic">
 													<img class="vLHTC pd_img" th:src="${@environment.getProperty('upload.goods.view') + '/' + item.sysImgNm}" th:alt="${item.goodsCd}"/>
@@ -123,9 +123,9 @@
 							<div class="itemsGrp"> <!-- itemsGrp rank hot deal -->
 								<div class="item_prod" th:each="item, status : ${bestGoodsList}">
 									<div class="item_state" >
-										<button type="button" class="itemLike" th:classappend="${item.likeIt}">관심상품 추가</button>
+										<button type="button" class="itemLike" th:classappend="${item.likeIt == 'likeit'}? 'likeit' : ''"  onclick="cfnPutWishList(this);" th:attr="goodsCd=${item.goodsCd}, ithrCd='', contentsLoc='SCM002', planDtlSq=''">관심상품 추가</button>
 										<a href="javascript:void(0);" class="itemLink" th:onclick="cfnGoToGoodsDetail([[${item.goodsCd}]], '', '', 'SCM002');">
-											<div class="rank ranker"><span th:text="${status.index+1}">1</span></div>
+											<div class="rank" th:classappend="${status.count==1}?'ranker'"><span th:text="${status.index+1}">1</span></div>
 											<div class="itemPic">
 												<img class="vLHTC pd_img" th:src="${@environment.getProperty('upload.goods.view') + '/' + item.sysImgNm}" th:alt="${item.goodsCd}"/>
 											</div>

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

@@ -133,7 +133,7 @@
 								<div class="item_state">
 									<button type="button" class="itemLike" th:classappend="${item.likeIt == 'likeit'}? 'likeit' : ''"  onclick="cfnPutWishList(this);" th:attr="goodsCd=${item.goodsCd}, ithrCd='', contentsLoc='SOM003', planDtlSq=''">관심상품 추가</button>
 									<a href="javascript:void(0);" class="itemLink" th:onclick="cfnGoToGoodsDetail([[${item.goodsCd}]], '', '', 'SOM003');">
-										<div class="rank ranker"><span>1</span></div>
+										<div class="rank" th:classappend="${status.count==1}?'ranker'"><span th:text="${status.index+1}">1</span></div>
 										<div class="itemPic">
 											<img alt="BLUE-a" class=" vLHTC pd_img" th:src="${@environment.getProperty('upload.goods.view') + '/' + item.sysImgNm}">
 										</div>

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

@@ -65,7 +65,7 @@
 <script th:inline="javascript">
 /*<![CDATA[*/
 	
-	var fnGetList = function() {debugger;
+	var fnGetList = function() {
 		
 		// 상품문의창 닫기
 		//$("#layer_goods_qna_reg").modal("hide");

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

@@ -547,7 +547,7 @@
 					var fileGbClass = '';
 					$.each(item.reviewAttachList, function(aIdx, reviewAttach){
 						fileGbClass = '';
-						if (reviewAttach == "M") fileGbClass = "mov";
+						if (reviewAttach.fileGb == "M") fileGbClass = "mov";
 				tag += '				<li>\n';
 				tag += '					<a href="javascript:void();" onclick="cfGoodsReviewDetail(\''+item.goodsCd+'\',\'\', \'Y\',\''+item.reviewSq+'\');">\n';
 				tag += '						<div class="pic">\n';

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

@@ -25,191 +25,270 @@
 			<button type="button" id="btn_pdPhotoReviewList_pop" th:onclick="cfGoodsReviewPhoto([[${params.goodsCd}]])"  class="btn_more"><span>전체보기</span></button>
 			</th:block>
 		</div>
-		<div class="modal-body" th:if="${reviewList != null and !reviewList.empty}">
-			<div class="pop_cont">
-				<div class="swiper-container detail">
-					<div class="swiper-wrapper">
-						<div class="swiper-slide"  th:each="review, status : ${reviewList}" >
-							<!-- 리뷰내용 -->
-							<div class="review" th:classAppend="${(review.reviewAttachList == null or review.reviewAttachList.empty) ? 'empty_photo' :''}" >  <!-- 첨부이미지 없을 시 empty_photo 클래스 추가 --> 
-								<div class="pic">
-									<th:block th:if="${review.reviewAttachList != null and !review.reviewAttachList.empty}" >
-										<th:block th:each="reviewAttach, attachStatus : ${review.reviewAttachList}" th:if="${attachStatus.first}">
-									<span class="thumb" th:classAppend="${(reviewAttach.fileGb == 'M') ? 'mov' :''}" ><!-- 동영상의 썸네일일 경우 mov 클래스 추가-->
-										<th:block th:if="${reviewAttach.fileGb == 'M'}">
-										<video poster="http://cdn.011st.com/11dims/resize/1999x1999/quality/75/11src/review/10201202/3121412332/2e66698576d64c5c9977a6fe6606008d.jpg" muted="muted" preload="metadata" controls="controls">
-											<source src="http://snsvideo.11st.co.kr/movie/item/www/675/67518524_06_1_C1.mp4" type="video/mp4">
-										</video>
-										</th:block>
-										<th:block th:unless="${reviewAttach.fileGb == 'M'}">
-										<img th:src="${imgUrl+'/'+reviewAttach.sysFileNm}" alt="">
-										</th:block>
-									</span>
-										</th:block>
-									</th:block>
-									<th:block th:unless="${review.reviewAttachList != null and !review.reviewAttachList.empty}">
-									<span class="thumb">
-										<img th:src="${imgGoodsUrl+'/'+review.sysImgNm+'?RS=365'}" alt="" th:onerror="'this.src=\''+@{${uxImgUrl}+ '/images/pc/thumb/bg_item_none.png'}+'\';'">
-									</span>
-									</th:block>
-								</div>
-								<div class="review_cont">
-									<div class="box_wrap">
-										<div class="star_box">
-											<div class="star_score" th:with="starScore=${#numbers.formatDecimal((review.iscore*100/5), 0,0)}">
-												<span class="star">
-													<em class="progbar" th:style="${'width:'+starScore+'%;' }"></em> <!-- 평점 style로 표기 -->
-												</span>
-											</div>
-										</div>
-										<div class="response_box">
-											<div class="full" th:if="${review.goodsOptionList != null and !review.goodsOptionList.empty}">
-												<dl>
-													<div th:each="reviewGoods, goodsStatus : ${review.goodsOptionList}" >
-														<dt>구매옵션</dt>
-														<dd th:text="${reviewGoods.optCd1 +' / '+ reviewGoods.optCd2}">베이지 / 100</dd>
-													</div>
-												</dl>
-											</div>
-											<div class="full">
-												<dl>
-													<div>
-														<dt>키/몸무게</dt>
-														<dd><th:block th:if="${not #strings.isEmpty(review.height)}" th:text="|${review.height}cm / |"></th:block> 
-															<th:block th:if="${not #strings.isEmpty(review.weight)}" th:text="|${review.weight}kg|"></th:block>
-														</dd>
-													</div>
-												</dl>
-											</div>
-											<div th:if="${not #strings.isEmpty(review.sizeGb)}">  <!-- 사이즈구분(T:상의, B:하의, S:신발) -->
-												<dl > 
-													<div>
-														<dt>사이즈</dt>
-														<dd th:text="${review.scoreSizeNm}">작음</dd>
-													</div>
-													<div>
-														<dt>컬러</dt>
-														<dd th:text="${review.scoreColorNm}">밝음</dd>
-													</div>
-													<th:block th:if="${review.sizeGb == 'T' or review.sizeGb == 'B'}">
-													<div>
-														<dt>핏</dt>
-														<dd th:text="${review.scoreFitNm}">레귤러</dd>
-													</div>
-													<div>
-														<dt>두께감</dt>
-														<dd th:text="${review.scoreThickNm}">적당함</dd>
-													</div>
-													</th:block>
-													<th:block th:unless="${review.sizeGb == 'T' or review.sizeGb == 'B'}">
-													<div>
-														<dt>무게감</dt>
-														<dd th:text="${review.scoreWeightNm}">레귤러</dd>
-													</div>
-													<div>
-														<dt>볼너비</dt>
-														<dd th:text="${review.scoreBallNm}">적당함</dd>
-													</div>
-													</th:block>
-												</dl>
-											</div>
-										</div>
-										<div class="txt_review_box">
-											<p th:utext="${#strings.unescapeJava(#strings.escapeJava(review.reviewContent))}">슬림</p>
-										</div>
-										<div class="writer_box">
-											<div class="writer">
-												<span class="wr_id" th:text="${review.maskingCustId}">ab2****</span>
-												<span class="wr_date" th:text="${review.regDt}">2020.07.15</span>
-											</div>
-										</div>
-										<div class="reply_box" th:if="${not #strings.isEmpty(review.admRpl)}">
-											<div class="reply">
-												<div class="reply_writer">
-													<span class="wr_name">관리자</span>
-													<span class="wr_date" th:text="${review.admRplDt}" >2020.07.15</span>
-												</div>
-												<div class="reply_txt">
-													<p th:utext="${#strings.unescapeJava(#strings.escapeJava(review.admRpl))}">
-														안녕하세요, 스타일24 관리자입니다.
-													</p>
-												</div>
-											</div>
-										</div>
-									</div>
-								</div>
-								<!-- 첨부이미지 썸네일 리스트 -->
-								<div class="thumblist" th:if="${review.reviewAttachList != null and !review.reviewAttachList.empty and #lists.size(review.reviewAttachList) >= 2}">
-									<ul>
-										<li th:each="reviewAttach, attachStatus : ${review.reviewAttachList}">
-											<div class="pic" th:classAppend="${(attachStatus.first) ? 'active' :''}" ><!-- 활성화시 active 클래스 추가 -->
-												<span class="thumb" th:classAppend="${(reviewAttach.fileGb == 'M') ? 'mov' :''}"  th:style="${'background-image:url('+imgUrl+ reviewAttach.sysFileNm+');'}" ></span><!-- 동영상의 썸네일일 경우 mov 클래스 추가 -->
-											</div>
-										</li>
-									</ul>
-								</div>
-								<!-- //첨부이미지 썸네일 리스트 -->
-							</div>
-							<!-- //리뷰내용 -->
-						</div>
-					</div>
-				</div>
-				<div class="swiper-button-next"></div>
-				<div class="swiper-button-prev"></div>
-			</div>
+		<div class="modal-body" id="reviewBody">
 		</div>
 	</div>
 </div>
+<form name="reviewDetailForm" id="reviewDetailForm" method="post">
+<input type="hidden" name="goodsCd" th:value="${review.goodsCd}" />
+<input type="hidden" name="bestYn" th:value="${review.bestYn}" />
+<input type="hidden" name="photoYn" th:value="${review.photoYn}" />
+<input type="hidden" name="reviewSq" th:value="${review.reviewSq}" />
+</form>
 <a href="javascript:void(0);" rel="modal:close" onclick="cfCloseLayer('layer_review_best')" class="close-modal">Close</a> 
 <script th:inline="javascript">
 /*<![CDATA[*/
 	
-	 $(document).ready( function() {
+	var fnReviewDetail = function() {
+		
+		var params = new Object();
+		params.goodsCd = $('#reviewDetailForm input[name=goodsCd]').val();
+		params.reviewSq = $('#reviewDetailForm input[name=reviewSq]').val();
+		params.bestYn =$('#reviewDetailForm input[name=bestYn]').val();
+		params.photoYn = $('#reviewDetailForm input[name=photoYn]').val();
+		
+		gagajf.ajaxSubmit("/goods/review/detail/list", "json", fnReviewDetailCallback, params);
+	}
 
-		//슬라이드 - 상품 베스트 리뷰 자세히보기 영역 
-		var bestReviewDetailSwiper = new Swiper('.pd_bestreviewdetail_pop .swiper-container.detail', {
-			observer: true,
-			observeParents: true,		
-			effect :'fade',
-			slidesPerView: 1,
-			spaceBetween: 0,
-			simulateTouch:false,
-			navigation: {
-				nextEl: '.pd_bestreviewdetail_pop .swiper-button-next',
-				prevEl: '.pd_bestreviewdetail_pop .swiper-button-prev',
-			}
-		});
+	var fnReviewDetailCallback = function(result) {
+		$('#reviewBody').html('');
+		// 목록
+		if (result.reviewList != null && result.reviewList.length > 0) {
+			let fileGbClass = '';
+			$.each(result.reviewList, function(idx, review) {
+				let tag = '';
+				tag +='<div class="pop_cont">\n';
+				tag +='<div class="swiper-container detail">\n';
+				tag +='<div class="swiper-wrapper">\n';
+				tag +='<div class="swiper-slide">\n';
+				
+				let reviewClass = 'empty_photo';
+				if (review.reviewAttachList != null && review.reviewAttachList.length > 0){
+					reviewClass = '';
+				}
+				tag +='<div class="review" class="'+reviewClass+'" >\n';  <!-- 첨부이미지 없을 시 empty_photo 클래스 추가 --> 
+				tag +='	<div class="pic">\n';
+				if (review.reviewAttachList != null && review.reviewAttachList.length > 0){
+					$.each(review.reviewAttachList, function(aIdx, reviewAttach){
+						fileGbClass = '';
+						if (reviewAttach.fileGb == "M") fileGbClass = "mov";
+				tag +='		<span class="thumb" class="'+fileGbClass+'">\n';<!-- 동영상의 썸네일일 경우 mov 클래스 추가-->
+						if (reviewAttach.fileGb == "M") {
+				tag +='			<video poster="http://cdn.011st.com/11dims/resize/1999x1999/quality/75/11src/review/10201202/3121412332/2e66698576d64c5c9977a6fe6606008d.jpg" muted="muted" preload="metadata" controls="controls">\n';
+				tag +='				<source src="http://snsvideo.11st.co.kr/movie/item/www/675/67518524_06_1_C1.mp4" type="video/mp4">\n';
+				tag +='			</video>\n';
+						}else{
+				tag +='			<img src="'+ _imgUrl + reviewAttach.sysFileNm +'" alt="">\n';	
+						}
+				tag +='		</span>\n';
+						return false;
+					});	
+				}else{
+				tag +='		<span class="thumb">\n';
+				tag +='			<img src="'+_uploadGoodsUrl +'/'+review.sysImgNm+'?RS=365" alt="" onerror="' + _uximgUrl + '/images/pc/thumb/bg_item_none.png"  />\n';
+				tag +='		</span>\n';	
+				}
+				tag +='	</div>\n';
+				tag +='	<div class="review_cont">\n';
+				tag +='		<div class="box_wrap">\n';
+				tag +='			<div class="star_box">\n';
+				tag +='				<div class="star_score">\n';
+				tag +='					<span class="star">\n';
+				tag +='						<em class="progbar" style="width:'+(review.iscore*20)+'%;"></em>\n'; <!-- 평점 style로 표기 -->
+				tag +='					</span>\n';
+				tag +='				</div>\n';
+				tag +='			</div>\n';
+				tag +='			<div class="response_box">\n';
+				tag +='				<div class="full">\n';
+				tag +='					<dl>\n';
+				if (review.goodsOptionList != null && review.goodsOptionList.length > 0){
+					$.each(review.goodsOptionList, function(aIdx, reviewGoods){
+				tag +='						<div>\n';
+				tag +='							<dt>구매옵션</dt>\n';
+				tag +='							<dd>'+ reviewGoods.optCd1Nm +' / '+ reviewGoods.optCd2+'</dd>\n';
+				tag +='						</div>\n';
+					});		
+				}
+				tag +='					</dl>\n';
+				tag +='				</div>\n';
+				tag +='				<div class="full">\n';
+				tag +='					<dl>\n';
+				tag +='						<div>\n';
+				tag +='							<dt>키/몸무게</dt>\n';
+				tag +='							<dd>'+review.height+' / '+review.weight +' \n';
+				tag +='							</dd>\n';
+				tag +='						</div>\n';
+				tag +='					</dl>\n';
+				tag +='				</div>\n';
+				if (!gagajf.isNull(review.sizeGb)){  <!-- 사이즈구분(T:상의, B:하의, S:신발) -->
+				tag +='				<div>\n'; 
+				tag +='					<dl > \n';
+				tag +='						<div>\n';
+				tag +='							<dt>사이즈</dt>\n';
+				tag +='							<dd>'+review.scoreSizeNm+'</dd>\n';
+				tag +='						</div>\n';
+				tag +='						<div>\n';
+				tag +='							<dt>컬러</dt>\n';
+				tag +='							<dd>'+review.scoreColorNm+'</dd>\n';
+				tag +='						</div>\n';
+					if (review.sizeGb == 'T' || review.sizeGb == 'B'){
+				tag +='						<div>\n';
+				tag +='							<dt>핏</dt>\n';
+				tag +='							<dd>'+review.scoreFitNm+'</dd>\n';
+				tag +='						</div>\n';
+				tag +='						<div>\n';
+				tag +='							<dt>두께감</dt>\n';
+				tag +='							<dd>'+ review.scoreThickNm+'</dd>\n';
+				tag +='						</div>\n';
+					}
+					if (review.sizeGb == 'S'){
+				tag +='						<div>\n';
+				tag +='							<dt>무게감</dt>\n';
+				tag +='							<dd>'+review.scoreWeightNm+'</dd>\n';
+				tag +='						</div>\n';
+				tag +='						<div>\n';
+				tag +='							<dt>볼너비</dt>\n';
+				tag +='							<dd>'+review.scoreBallNm+'</dd>\n';
+				tag +='						</div>\n';
+					}
+				tag +='					</dl>\n';
+				tag +='				</div>\n';
+				}
+				tag +='			</div>\n';
+				tag +='			<div class="txt_review_box">\n';
+				tag +='				<p>' + review.reviewContent +'</p>\n';
+				tag +='			</div>\n';
+				tag +='			<div class="writer_box">\n';
+				tag += '			<div class="writer">\n';
+				tag += '				<span class="wr_id">'+ review.maskingCustId +'</span>\n';
+				tag += '				<span class="wr_date">' + review.regDt + '</span>\n';
+				tag += '			</div>\n'
+				tag +='			</div>\n';
+				if (!gagajf.isNull(review.admRpl)){
+				tag += '		<div class="reply_box">\n';
+				tag += '			<div class="reply">\n';
+				tag += '				<div class="reply_writer">\n';
+				tag += '					<span class="wr_name">관리자</span>\n';
+				tag += '					<span class="wr_date">'+review.admRplDt+'</span>\n';
+				tag += '				</div>\n';
+				tag += '				<div class="reply_txt">\n';
+				tag += '					<p>' + review.admRpl+'</p>\n';
+				tag += '				</div>\n';
+				tag += '			</div>\n';
+				tag += '		</div>\n';	
+				}
+				tag +='		</div>\n';
+				tag +='	</div>\n';
+				if (review.reviewAttachList != null && review.reviewAttachList.length >= 2){
+				tag +='	<div class="thumblist">\n';
+				tag +='		<ul>\n';
+					let activeClass = '';
+					$.each(review.reviewAttachList, function(aIdx, reviewAttach){
+						activeClass = '';
+						if (aIdx == 0){
+							activeClass = 'active';
+						}
+						fileGbClass = '';
+						if (reviewAttach.fileGb == "M") fileGbClass = "mov";
+				tag +='			<li>\n';
+				tag +='				<div class="pic '+activeClass+'"> \n'; <!-- 활성화시 active 클래스 추가 -->
+				tag +='					<span class="thumb" class="'+fileGbClass+'" style="background-image:url('+ _imgUrl + reviewAttach.sysFileNm +');\" >\n';<!-- 동영상의 썸네일일 경우 mov 클래스 추가 -->
+				tag +='					<img src="'+ _imgUrl + reviewAttach.sysFileNm +'" alt="">\n';
+				tag +='					</span>\n';
+				tag +='				</div>\n';
+				tag +='			</li>\n';
+					});
+				tag +='		</ul>\n';
+				tag +='	</div>\n';
+				}
+				tag +='</div>\n';
+				
+				tag +='</div>\n';
+				tag +='</div>\n';
+				tag +='</div>\n';
+				if (gagajf.isNull(review.nextReviewSq) || review.nextReviewSq <= 0) {
+					tag +='<div class="swiper-button-next swiper-button-disabled" id="reviewBodyNext" ></div>\n';
+				}else{
+					tag +='<div class="swiper-button-next" id="reviewBodyNext" onclick="fnReviewNext('+review.nextReviewSq+')"></div>\n';	
+				}
+				
+				if (gagajf.isNull(review.prevReviewSq) || review.prevReviewSq <= 0) {
+					tag +='<div class="swiper-button-prev swiper-button-disabled" id="reviewBodyPrev"  ></div>\n';
+				}else{
+					tag +='<div class="swiper-button-prev" id="reviewBodyPrev" onclick="fnReviewNext('+review.prevReviewSq+')"></div>\n';	
+				}
+				tag +='</div>\n';
+				
+				$('#reviewBody').append(tag);
+				
+				 $('.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;
 
-	   /* $('.pd_bestreviewdetail_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;');
+				        
+				    });
 
-		   $this.find('.thumblist ul').attr('style', 'width:' + thumbListWidth + 'px;');
-		   
-	   }); */
+			});
+		}
+		
+	}
+	
+	// 다른 상품평 보기
+	var fnReviewNext = function(reviewSq){
+		if (gagajf.isNull(reviewSq)) return false;
+		
+		$('#reviewDetailForm input[name=reviewSq]').val(reviewSq);
+		fnReviewDetail();
+	}
+	
+	$(document).ready( function() {
+		
+		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;
 
-		$(document).on('click','.pd_bestreviewdetail_pop .thumblist ul li',function(e){
+	        $this.find('.thumblist ul').attr('style', 'width:' + thumbListWidth + 'px;');
+	        
+	    });
 
-			$(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');
+	    $(document).on('click','.pd_photoreviewdetail_pop .thumblist ul li',function(e){
 
-			var thumbIndex = $(this).index();
-			var thumbImg = $(this).find('.pic .thumb').attr('style');
-			var thumbImgSrc = thumbImg.split("background-image:url(")[1];
-			thumbImgHtml = "<img src="+ thumbImgSrc +" alt=''>";
-			$(this).parents(".swiper-slide").find(".review > .pic > .thumb").append(thumbImgHtml);
-			
-			return false;
-		});
+	        $(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;
+	    });
 	});		
 
-	
+	 
 /*]]>*/
 </script>	
  </html>

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

@@ -186,7 +186,7 @@
 						html += '							<span class="option">' + item.itemNmArr[index2] + ' / ' + option + ' / ' + item.optCd2Arr[index2] + '</span>\n';
 					})
 				}else{
-					html += '							<span class="option">'+item.optCd1+'&nbsp;/&nbsp;'+item.optCd2+'</span>     ';
+					html += '							<span class="option">'+item.optCd1Nm+'&nbsp;/&nbsp;'+item.optCd2+'</span>     ';
 				}
 				
 				
@@ -246,7 +246,7 @@
 				html+='						<div class="gd_opt">';
 				html+='							<div class="option_wrap">';
 				html+='								<span class="title sr-only">주문 옵션</span>';
-				html+='								<span class="option">'+item.optCd1+'&nbsp;/&nbsp;'+item.optCd2+'</span>';
+				html+='								<span class="option">'+item.optCd1Nm+'&nbsp;/&nbsp;'+item.optCd2+'</span>';
 				html+='							</div>';
 				html+='						</div>';
 				html+='					</div>';
@@ -274,7 +274,7 @@
 				html+='								<dl>';
 				html+='									<div>';
 				html+='										<dt>구매옵션</dt>';
-				html+='										<dd>'+item.optCd1+' / '+item.optCd2+'</dd>';
+				html+='										<dd>'+item.optCd1Nm+' / '+item.optCd2+'</dd>';
 				html+='									</div>';
 				html+='								</dl>';
 				html+='							</div>';

+ 75 - 10
src/main/webapp/biz/goods.js

@@ -176,8 +176,6 @@ var fnCreateGoodsList = function(result, ithrCd, contentLoc, goodsUrl, lastPage,
 		tag += '		<a href="#none" class="itemLink">';
 		// tag += '			<div class="rank ranker"><span>'+(rank+(idx+1))+'</span></div>';
 		tag += '			<div class="itemPic">';
-		tag += '				<img alt="BLUE-a" class=" vLHTC pd_img" src="'+goodsUrl+'/'+item.sysImgNm+'">';
-		tag += '			</div>';
 		if(!gagajf.isNull(item.videoVal)){
 			var videoArr = item.videoVal.split(",");
 			var videoGb = '';
@@ -188,11 +186,54 @@ var fnCreateGoodsList = function(result, ithrCd, contentLoc, goodsUrl, lastPage,
 				videoUrl = videoInfo[1];
 			}
 			if(videoGb=='Y'){
-				tag += '<iframe id="child" className="pd_mov" src="https://www.youtube.com/embed/'+videoUrl+'"></iframe>';
+				tag += '<iframe id="child" class="pd_mov" src="https://www.youtube.com/embed/'+videoUrl+'"></iframe>';
 			}else{
-				tag += '<iframe id="child" className="pd_mov" src="http://v.kr.kollus.com/'+videoUrl+'"></iframe>';
+				tag += '<iframe id="child" class="pd_mov" src="http://v.kr.kollus.com/'+videoUrl+'"></iframe>';
 			}
 		}
+		tag += '		<img class=" vLHTC pd_img" src="'+goodsUrl+'/'+item.sysImgNm+'" data-img="'+goodsUrl+'/'+item.sysImgNm2+'">';
+		if(!gagajf.isNull(item.sizes)){
+			var sizeArr = item.sizes.split(",");
+			var minSize;
+			var maxSize;
+			var sizeVal = '';
+			var soldOutYn = '';
+			tag +='<div class="itemOpt">';
+			tag +='	<p>SIZE</p>';
+
+			if(sizeArr.length>5){
+				for(let i=0; i<sizeArr.length; i++){
+					var sizeInfo = sizeArr[i].split(":");
+					sizeVal = sizeInfo[0];
+					soldOutYn = sizeInfo[1];
+					if(i==0){
+						minSize = sizeVal;
+					}else if(i==sizeArr.length-1){
+						maxSize = sizeVal;
+					}
+				}
+				tag +='	<div class="exc">';
+				tag +='		<span>'+minSize+'</span> ~ <span>'+maxSize+'</span> 사이즈가 있습니다.';
+				tag +='	</div>';
+			}else{
+				tag += '<ul>';
+				for(let i=0; i<sizeArr.length; i++){
+					var sizeInfo = sizeArr[i].split(":");
+					sizeVal = sizeInfo[0];
+					soldOutYn = sizeInfo[1];
+					if(soldOutYn=='N'){
+						tag +='		<li>'+sizeVal+'</li>';
+					}else{
+						tag +='		<li className="none">'+sizeVal+'</li>';
+					}
+				}
+				tag += '</ul>';
+			}
+			tag += '			</div>';
+		}
+
+		tag += '			</div>';
+
 		tag += '			<p class="itemBrand">'+item.brandGroupNm+'</p>';
 		tag += '			<div class="itemName">'+item.goodsFullNm+'</div>';
 		tag += '			<p class="itemPrice">'+item.currPrice.addComma();
@@ -204,13 +245,37 @@ var fnCreateGoodsList = function(result, ithrCd, contentLoc, goodsUrl, lastPage,
 		}
 		tag += '			</p>';
 		tag += '			<div class="itemcolorchip">';
-		tag += '				<span class="chip_color35" value="ABM">BEIGE</span>';
-		tag += '				<span class="chip_color54" value="BDS">BLACK</span>';
-		tag += '				<span class="chip_color40" value="YBR">WHITE</span>';
+		if(!gagajf.isNull(item.colorChips)){
+			var colorArr = item.colorChips.split(",");
+			var colorCd = '';
+			var rgbColor = '';
+			for(let i=0; i<colorArr.length; i++){
+				var colorInfo = colorArr[i].split(":");
+				colorCd = colorInfo[0];
+				rgbColor = colorInfo[1];
+				if(rgbColor=='#FFFFFF'){
+					tag += '	<span class="chip_color" style="background-color: '+rgbColor+';border:1px solid #aaa;" value="'+colorCd+'">'+colorCd+'</span>';
+				}else{
+					tag += '	<span class="chip_color" style="background-color: '+rgbColor+'" value="'+colorCd+'">'+colorCd+'</span>';
+				}
+			}
+		}
 		tag += '			</div>';
-		tag += '			<p class="itemBadge">';
-		tag += '				<span class="badge13">베스트 </span>';
-		tag += '			</p>';
+
+		if(!gagajf.isNull(item.icon)){
+			var iconArr = item.icon.split(",");
+			var iconGb = '';
+			var iconNm = '';
+			tag += '	<p class="itemBadge">';
+			for(let i=0; i<iconArr.length; i++){
+				var iconInfo = iconArr[i].split(":");
+				iconGb = iconInfo[0];
+				iconNm = iconInfo[1];
+				tag += '	<span class="badge13" value="'+iconGb+'">'+iconNm+' </span>';
+			}
+			tag += '	</p>';
+		}
+
 		if(item.goodsTnm != null){
 			tag += '			<div class="itemComment">'+item.goodsTnm+'</div>';
 		}

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

@@ -607,12 +607,12 @@ function cfGoodsReviewDetail(goodsCd, bestYn, photoYn, reviewSq) {
 		$('body').append(str);
 	}
 	
-	var params = new Object();
-	params.goodsCd = goodsCd;
-	params.bestYn = bestYn;
-	params.photoYn = photoYn;
-	params.reviewSq = reviewSq;
-	cfOpenLayer(_PAGE_GOODS_REVIEW_DETAIL_LAYER, 'layer_review_best' ,params );
+	var params = '?goodsCd=' + goodsCd;
+	params += '&reviewSq=' + reviewSq;
+	params += '&bestYn=' + bestYn;
+	params += '&photoYn=' + photoYn;debugger;
+	
+	cfOpenLayer(_PAGE_GOODS_REVIEW_DETAIL_LAYER+params, 'layer_review_best');
 }
 
 /**