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

Merge branch 'develop' into order

card007 5 лет назад
Родитель
Сommit
f41102e6e2
44 измененных файлов с 3047 добавлено и 1672 удалено
  1. 49 4
      src/main/java/com/style24/front/biz/dao/TsfReviewDao.java
  2. 9 8
      src/main/java/com/style24/front/biz/service/TsfCustomerService.java
  3. 4 2
      src/main/java/com/style24/front/biz/service/TsfGoodsService.java
  4. 55 2
      src/main/java/com/style24/front/biz/service/TsfReviewService.java
  5. 215 16
      src/main/java/com/style24/front/biz/thirdparty/Yes24Login.java
  6. 52 42
      src/main/java/com/style24/front/biz/web/TsfCustomerController.java
  7. 28 5
      src/main/java/com/style24/front/biz/web/TsfDisplayController.java
  8. 135 4
      src/main/java/com/style24/front/biz/web/TsfGoodsController.java
  9. 27 22
      src/main/java/com/style24/front/biz/web/TsfIndexController.java
  10. 49 8
      src/main/java/com/style24/front/biz/web/TsfMypageController.java
  11. 2 0
      src/main/java/com/style24/persistence/domain/Counsel.java
  12. 6 0
      src/main/java/com/style24/persistence/domain/CustSnsInfo.java
  13. 12 0
      src/main/java/com/style24/persistence/domain/Goods.java
  14. 10 1
      src/main/java/com/style24/persistence/domain/Review.java
  15. 17 3
      src/main/java/com/style24/persistence/mybatis/shop/TsfCounsel.xml
  16. 2 1
      src/main/java/com/style24/persistence/mybatis/shop/TsfDisplay.xml
  17. 5 0
      src/main/java/com/style24/persistence/mybatis/shop/TsfGoods.xml
  18. 239 16
      src/main/java/com/style24/persistence/mybatis/shop/TsfReview.xml
  19. 11 0
      src/main/resources/config/application.yml
  20. 4 0
      src/main/webapp/WEB-INF/views/web/SigninFormWeb.html
  21. 0 45
      src/main/webapp/WEB-INF/views/web/Yes24CallBackFormWeb.html
  22. 2 2
      src/main/webapp/WEB-INF/views/web/common/fragments/GnbWeb.html
  23. 15 13
      src/main/webapp/WEB-INF/views/web/customer/CertificationFormWeb.html
  24. 126 0
      src/main/webapp/WEB-INF/views/web/customer/ConsentUseInfoFormWeb.html
  25. 8 7
      src/main/webapp/WEB-INF/views/web/customer/IdFindFormWeb.html
  26. 35 59
      src/main/webapp/WEB-INF/views/web/customer/JoinFormWeb.html
  27. 6 0
      src/main/webapp/WEB-INF/views/web/customer/JoinTypeFormWeb.html
  28. 8 10
      src/main/webapp/WEB-INF/views/web/customer/PasswordCampaignFormWeb.html
  29. 1 1
      src/main/webapp/WEB-INF/views/web/customer/PasswordFindFormWeb.html
  30. 159 0
      src/main/webapp/WEB-INF/views/web/display/BrandMainFormWeb.html
  31. 6 50
      src/main/webapp/WEB-INF/views/web/display/CategoryMainFormWeb.html
  32. 322 287
      src/main/webapp/WEB-INF/views/web/goods/GoodsDealDetailFormWeb.html
  33. 16 141
      src/main/webapp/WEB-INF/views/web/goods/GoodsDeliveryFormWeb.html
  34. 157 0
      src/main/webapp/WEB-INF/views/web/goods/GoodsDetailDeliveryFormWeb.html
  35. 63 22
      src/main/webapp/WEB-INF/views/web/goods/GoodsDetailFormWeb.html
  36. 144 0
      src/main/webapp/WEB-INF/views/web/goods/GoodsDetailQnaFormWeb.html
  37. 659 0
      src/main/webapp/WEB-INF/views/web/goods/GoodsDetailReviewFormWeb.html
  38. 105 78
      src/main/webapp/WEB-INF/views/web/goods/GoodsIncludeFormWeb.html
  39. 12 121
      src/main/webapp/WEB-INF/views/web/goods/GoodsQnaFormWeb.html
  40. 9 633
      src/main/webapp/WEB-INF/views/web/goods/GoodsReviewFormWeb.html
  41. 0 21
      src/main/webapp/WEB-INF/views/web/mypage/MypageReviewCreateFormWeb.html
  42. 233 47
      src/main/webapp/WEB-INF/views/web/mypage/MypageReviewFormWeb.html
  43. 1 1
      src/main/webapp/ux/pc/css/common.css
  44. 29 0
      src/main/webapp/ux/style24_link.js

+ 49 - 4
src/main/java/com/style24/front/biz/dao/TsfReviewDao.java

@@ -53,13 +53,22 @@ public interface TsfReviewDao {
 	Collection<Goods> getReviewGoodsOptionList(Review review);
 	
 	/**
-	 * 상품평 옵션 목록
+	 * 상품평 옵션 목록 - 입점용
+	 * @param review
+	 * @return 
+	 * @author eskim
+	 * @since 2021. 3. 26
+	 */
+	Collection<Goods> getReviewOption1List(String goodsCd);
+	
+	/**
+	 * 상품평 옵션 목록  - 자사용
 	 * @param review
 	 * @return 
 	 * @author eskim
 	 * @since 2021. 3. 19
 	 */
-	Collection<Goods> getReviewOptionList(String goodsCd);
+	Collection<Goods> getReviewOption2List(String goodsCd);
 	
 	/**
 	 * 마이페이지 작성가능한 리뷰 건수
@@ -87,6 +96,42 @@ public interface TsfReviewDao {
 	 * @since 2021. 3. 25
 	 */
 	void saveMypageReview(Review review);
-
-
+	
+	/**
+	 * 마이페이지 작성한 리뷰 건수
+	 * @param review
+	 * @return 
+	 * @author sowon
+	 * @since 2021. 3. 26
+	 */
+	int getAlreadyReviewCount(Review review);
+	
+	/**
+	 * 마이페이지 작성한 리뷰 목록
+	 * @param review
+	 * @return 
+	 * @author sowon
+	 * @since 2021. 3. 26
+	 */
+	Collection<Review> getAlreadyReviewList(Review review);
+	
+	/**
+	 * 마이페이지 작성한 리뷰 이미지 목록 
+	 * @param review
+	 * @return 
+	 * @author sowon
+	 * @since 2021. 3. 26
+	 */
+	Collection<Review> getReviewAttach(Review review);
+	
+	/**
+	 * 마이페이지 어드민이 댓글 단 리뷰 건수
+	 * @param review
+	 * @return 
+	 * @author sowon
+	 * @since 2021. 3. 26
+	 */
+	Review getAdminConfirmCount(Review review);
+	
+	
 }

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

@@ -286,8 +286,9 @@ public class TsfCustomerService {
 	 */
 	public boolean saveJoinCustomerSns (Customer customer) {
 		boolean isJoin = true;
+		String snsId = customer.getSnsType().equals(TscConstants.SnsType.YES24.value()) ? customer.getMemNo() : customer.getSnsId();
 		customer.setEncodedPasswd(" ");
-		customer.setCustId(customer.getSnsType()+"_"+customer.getSnsId());
+		customer.setCustId(customer.getSnsType()+"_"+snsId);
 		customer.encryptData();
 
 		customer.setSiteCd(TscConstants.Site.STYLE24.value());
@@ -520,7 +521,7 @@ public class TsfCustomerService {
 	 * @author jsshin
 	 * @since 2021. 02. 26
 	 */
-	Customer getCusomterSnsFind(CustSnsInfo custSnsInfo) {
+	public Customer getCusomterSnsFind(CustSnsInfo custSnsInfo) {
 		return customerDao.getCusomterSnsFind(custSnsInfo);
 	}
 
@@ -532,7 +533,7 @@ public class TsfCustomerService {
 	 * @author jsshin
 	 * @since 2021. 03. 02
 	 */
-	String getMaxCustIdById(String custId) {
+	public String getMaxCustIdById(String custId) {
 		Customer customer = new Customer();
 		customer.setSiteCd(TscConstants.Site.STYLE24.value());
 		customer.setCustId(custId);
@@ -550,7 +551,7 @@ public class TsfCustomerService {
 	 * @author jsshin
 	 * @since 2021. 03. 02
 	 */
-	String getMaxCustIdByEmail(String email) {
+	public String getMaxCustIdByEmail(String email) {
 		Customer customer = new Customer();
 		customer.setSiteCd(TscConstants.Site.STYLE24.value());
 		customer.setEmail(email);
@@ -569,7 +570,7 @@ public class TsfCustomerService {
 	 * @author jsshin
 	 * @since 2021. 03. 02
 	 */
-	String getMaxCustIdByCellPhnno(String cellPhnno) {
+	public String getMaxCustIdByCellPhnno(String cellPhnno) {
 		Customer customer = new Customer();
 		customer.setSiteCd(TscConstants.Site.STYLE24.value());
 		customer.setCellPhnno(cellPhnno);
@@ -589,7 +590,7 @@ public class TsfCustomerService {
 	 * @author jsshin
 	 * @since 2021. 03. 02
 	 */
-	String getMaxCustIdByCi(String ci) {
+	public String getMaxCustIdByCi(String ci) {
 		Customer customer = new Customer();
 		customer.setSiteCd(TscConstants.Site.STYLE24.value());
 		customer.setCi(ci);
@@ -742,6 +743,7 @@ public class TsfCustomerService {
 
 	/**
 	 * 비밀번호 맞는지 확인
+	 *
 	 * @param customer - 고객정보
 	 * @return boolean
 	 * @author jsshin
@@ -762,6 +764,7 @@ public class TsfCustomerService {
 
 	/**
 	 * 본인인증을 통한 이름, 휴대전화번호 수정
+	 *
 	 * @param customer - 고객정보
 	 * @return GagaMap
 	 * @author jsshin
@@ -883,8 +886,6 @@ public class TsfCustomerService {
 	 * @since 2021. 03. 24
 	 */
 	public GagaMap saveCustomerSecede(Customer customer) {
-		GagaMap result = new GagaMap();
-
 		return coreCustomerService.saveCustomerSecede(customer);
 	}
 

+ 4 - 2
src/main/java/com/style24/front/biz/service/TsfGoodsService.java

@@ -698,7 +698,7 @@ public class TsfGoodsService {
 
 		Collection<Goods> goodsList = new ArrayList<>();
 
-		if (cate.getContentsLoc().equals("SCM001")) { // 신상품인 경우
+		if (cate.getContentsLoc().equals("SCM002") || cate.getContentsLoc().equals("SBM007") || cate.getContentsLoc().equals("SBM013")) { // 신상품인 경우
 			goodsList = goodsDao.getContentsCategoryGoodsList(cate);
 
 			// 조회된 데이터가 없거나 건수가 20개 미만이면 신규상품(=정상상품) 조회
@@ -715,11 +715,13 @@ public class TsfGoodsService {
 				}
 				goodsList.addAll(goodsDao.getContentsCategoryNewGoodsList(cate));
 			}
-		} else if (cate.getContentsLoc().equals("SCM002")) { // 베스트상품인 경우
+		} else if (cate.getContentsLoc().equals("SCM003") || cate.getContentsLoc().equals("SBM008")) { // 베스트상품인 경우
 			// TODO: 추천솔루션
 
 			// 추천솔루션 데이터가 없으면 베스트로 등록된 상품 조회
 			goodsList = goodsDao.getContentsCategoryGoodsList(cate);
+		}else{
+			goodsList = goodsDao.getContentsCategoryGoodsList(cate);
 		}
 
 		return goodsList;

+ 55 - 2
src/main/java/com/style24/front/biz/service/TsfReviewService.java

@@ -1,5 +1,6 @@
 package com.style24.front.biz.service;
 
+import java.util.ArrayList;
 import java.util.Collection;
 
 import org.springframework.beans.factory.annotation.Autowired;
@@ -62,8 +63,14 @@ public class TsfReviewService {
 	 * @author eskim
 	 * @since 2021. 3. 19
 	 */
-	public Collection<Goods> getReviewOptionList(String goodsCd) {
-		 return reviewDao.getReviewOptionList(goodsCd);
+	public Collection<Goods> getReviewOptionList(Goods goods) {
+		Collection<Goods> result = new ArrayList<Goods>();
+		if ("Y".equals(goods.getSelfGoodsYn())) {
+			result = reviewDao.getReviewOption1List(goods.getGoodsCd());
+		}else {
+			result = reviewDao.getReviewOption2List(goods.getGoodsCd());
+		}
+		 return result;
 	}
 	
 	/**
@@ -103,4 +110,50 @@ public class TsfReviewService {
 		reviewDao.saveMypageReview(review);
 	}
 	
+	/**
+	 * 마이페이지 작성한 리뷰 건수
+	 * @param review
+	 * @return 
+	 * @author sowon
+	 * @since 2021. 3. 26
+	 */
+	public int getAlreadyReviewCount(Review review) {
+		return reviewDao.getAlreadyReviewCount(review);
+	}
+	
+	/**
+	 * 마이페이지 작성한 리뷰 목록
+	 * @param review
+	 * @return 
+	 * @author sowon
+	 * @since 2021. 3. 26
+	 */
+	public Collection<Review> getAlreadyReviewList(Review review){
+		return reviewDao.getAlreadyReviewList(review);
+	}
+	
+	/**
+	 * 마이페이지 작성한 리뷰 이미지 목록
+	 * @param review
+	 * @return 
+	 * @author sowon
+	 * @since 2021. 3. 26
+	 */
+	public Collection<Review> getReviewAttach(Review review){
+		return reviewDao.getReviewAttach(review);
+	}
+	
+	/**
+	 * 마이페이지 어드민이 댓글 단 리뷰 건수
+	 * @param review
+	 * @return 
+	 * @author sowon
+	 * @since 2021. 3. 26
+	 */
+	public Review getAdminConfirmCount(Review review) {
+		return reviewDao.getAdminConfirmCount(review);
+	}
+	
+	
+	
 }

+ 215 - 16
src/main/java/com/style24/front/biz/thirdparty/Yes24Login.java

@@ -2,13 +2,34 @@ package com.style24.front.biz.thirdparty;
 
 import com.gagaframework.web.parameter.GagaMap;
 import com.gagaframework.web.util.GagaFileUtil;
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import com.google.gson.JsonObject;
+import com.style24.core.support.env.TscConstants;
 import com.style24.core.support.util.CryptoUtils;
 import com.style24.front.support.security.session.TsfSession;
+import com.style24.persistence.domain.CustSnsInfo;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.core.env.Environment;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
 import org.springframework.stereotype.Component;
+import org.springframework.util.LinkedMultiValueMap;
+import org.springframework.util.MultiValueMap;
 import org.springframework.web.client.RestTemplate;
+import org.w3c.dom.Document;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.xml.sax.InputSource;
+
+import javax.annotation.PostConstruct;
+import javax.xml.parsers.DocumentBuilderFactory;
+import java.io.StringReader;
+import java.net.URI;
 
 
 /**
@@ -29,6 +50,35 @@ public class Yes24Login {
 
 	public static final String PROTOCOL = "http://";
 
+	private String id;
+	private String type;
+	private String requestUrl;
+	private String callBackUrl;
+	private String userInfoUrl;
+	private String linkUrl;
+	private String unlinkUrl;
+
+	@PostConstruct
+	public void init() {
+		id = env.getProperty("yes24.id");
+		type = env.getProperty("yes24.type");
+		requestUrl = env.getProperty("yes24.login.requestUrl");
+		callBackUrl = env.getProperty("yes24.login.callbackUrl");
+		userInfoUrl = env.getProperty("yes24.userInfoUrl");
+		linkUrl = env.getProperty("yes24.linkUrl");
+		unlinkUrl = env.getProperty("yes24.unlinkUrl");
+
+		log.debug("\n\n---- YES24 initialization started ----");
+		log.info("id: [{}]", id);
+		log.info("type: [{}]", type);
+		log.info("requestUrl: [{}]", requestUrl);
+		log.info("callBackUrl: [{}]", callBackUrl);
+		log.info("userInfoUrl: [{}]", userInfoUrl);
+		log.info("linkUrl: [{}]", linkUrl);
+		log.info("unlinkUrl: [{}]", unlinkUrl);
+		log.debug("\n--- YES24 initialization completed ----\n");
+	}
+
 	/**
 	 * YES24 로그인 화면
 	 * @param state - 콜백 시 해당 값으로 비교 및 모바일을 redirect 값이 있음
@@ -37,13 +87,14 @@ public class Yes24Login {
 	 * @since 2021. 03. 03
 	 */
 	public String getAuthorizeUrl(String state) {
-		String authorizeUrl = "https://www.yes24.com/Templates/FTLoginPartner.aspx";
-		String callBackUrl = "/signin/yes24LoginCallback";
-		String id = TsfSession.getFrontGb().equals("P") ? "PID" : "MID";
+		String idGb = TsfSession.getFrontGb().equals("P") ? "PID" : "MID";
 		StringBuilder apiUrlBuilder = new StringBuilder();
 		String redirectUri = GagaFileUtil.getConcatenationPath(PROTOCOL + TsfSession.getHttpServletRequest().getServerName(), callBackUrl);
-		apiUrlBuilder.append(authorizeUrl)
-				.append("?"+id+"=101582")
+		apiUrlBuilder.append(requestUrl)
+				.append("?")
+				.append(idGb)
+				.append("=")
+				.append(id)
 				.append("&ReturnURL=")
 				.append(redirectUri);
 		log.info("apiUrlBuilder ===> {}", apiUrlBuilder.toString());
@@ -51,32 +102,180 @@ public class Yes24Login {
 	}
 
 	/**
-	 * YES24 정보
+	 * YES24 고객 정보
+	 *
 	 * @param inpin - yes24 전달 해준 암호화된 : "요청날짜|CI"
 	 * @return String - 호출 url정보
 	 * @author jsshin
 	 * @since 2021. 03. 03
 	 */
-	public GagaMap getAccessInfo(String inpin) {
+	public GagaMap getUserInfo(String inpin) {
 		GagaMap result = new GagaMap();
-		//1. ipin 복호화
+
+		// 1. ipin 복호화
 		String decryptIpin = CryptoUtils.decryptAES(inpin);
-		log.info("decryptIpin {}", decryptIpin);
 
-		//2. ipin 값에서 ci 값 분리
-		String decryptIpinValues[] = decryptIpin.split("|");
-		log.info("decryptIpinValues.length {}", decryptIpinValues.length);
-		log.info("decryptIpinValues0 {}", decryptIpinValues[0]);
-		log.info("decryptIpinValues1 {}", decryptIpinValues[1]);
+		// 2. ipin 값에서 ci 값 분리
+		String decryptIpinValues[] = decryptIpin.split("\\|");
 
-		//3. ci값 추출 후 통신
-		String encryptCi = CryptoUtils.encryptAES(decryptIpinValues[0]);
+		// 3. Ci 다시 암호화
+		String encryptCi = CryptoUtils.encryptAES(decryptIpinValues[1]);
+		try {
+			MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
+			params.add("str_ci", encryptCi);
+			params.add("str_Type", type);
 
+			// Header
+			HttpHeaders headers = new HttpHeaders();
+			headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
 
+			HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<>(params, headers);
+			URI url = URI.create(userInfoUrl);
+
+			// POST방식으로 호출
+			ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, request, String.class);
+			log.info("getUserInfo responseEntity.getStatusCode(): {} ", responseEntity.getStatusCode());
+			String responseEntityBody = responseEntity.getBody();
+			log.info("getUserInfo responseEntity.getBody(): {} ", responseEntityBody);
+
+			// 4. XML 데이터 파싱
+			result = getCustInfoXmlParsing(responseEntityBody);
+		} catch (Exception e) {
+			log.error(e.getMessage());
+		}
 
 		return result;
 	}
 
+	/**
+	 * YES24 고객 정보
+	 *
+	 * @param responseEntityBody - yes24 전달 고객정보 XML
+	 * @return GagaMap - 고객정보
+	 * @author jsshin
+	 * @since 2021. 03. 26
+	 */
+	public GagaMap getCustInfoXmlParsing(String responseEntityBody) throws Exception{
+		InputSource is = new InputSource(new StringReader(responseEntityBody));
+		Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(is);
+		Node node = document.getDocumentElement();
+		NodeList nodeList = node.getChildNodes();
+		GagaMap nodeMap = new GagaMap();
+		for(int i = 0; i < nodeList.getLength(); i++) {
+			Node item = nodeList.item(i);
+			if (!"#text".equals(item.getNodeName())) {
+				nodeMap.setString(item.getNodeName(), item.getTextContent());
+			}
+		}
+		GagaMap resultMap = new GagaMap();
+		String memNo = nodeMap.getString("str_MEM_NO");
+		String snsId = nodeMap.getString("str_MEM_ID");
+		String custNm = nodeMap.getString("str_MEM_NM");
+		String email = nodeMap.getString("str_MEM_EML");
+		String cellphnno = nodeMap.getString("str_ADDR_MOB_NO").replaceAll("-","");
+		String birthYmd = nodeMap.getString("str_BIRTH_DM").replaceAll("-","");
+		String sexGb = nodeMap.getString("str_SEX").equals("M")? TscConstants.Gender.MALE.value() : TscConstants.Gender.FEMALE.value();
+		String ci = nodeMap.getString("str_IPIN_CI");
+		String homeZipcode = nodeMap.getString("str_ADDR_ZIP");
+		String homeBaseAddr = nodeMap.getString("str_ADDR_ADDR1");
+		String homeDtlAddr = nodeMap.getString("str_ADDR_ADDR2");
+
+		resultMap.setString("memNo", memNo);
+		resultMap.setString("snsId", snsId);
+		resultMap.setString("custNm", custNm);
+		resultMap.setString("email", email);
+		resultMap.setString("ci", ci);
+		resultMap.setString("cellPhnno", cellphnno);
+		resultMap.setString("birthYmd", birthYmd);
+		resultMap.setString("sexGb", sexGb);
+		resultMap.setString("homeZipcode", homeZipcode);
+		resultMap.setString("homeBaseAddr", homeBaseAddr);
+		resultMap.setString("homeDtlAddr",homeDtlAddr);
+
+		return resultMap;
+	}
+
+	/**
+	 * YES24 고객 연동처리
+	 *
+	 * @param  custSnsInfo - 고객정보
+	 * @return String - 호출 url정보
+	 * @author jsshin
+	 * @since 2021. 03. 03
+	 */
+	public void saveLink(CustSnsInfo custSnsInfo) {
+		// 1. Ci 다시 암호화
+		String encryptCi = CryptoUtils.encryptAES(custSnsInfo.getCi());
+		String joinGb = TsfSession.getFrontGb().equals("P") ? "P" : "M";
+
+		try {
+			MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
+			params.add("str_ci", encryptCi);
+			params.add("mem_id", custSnsInfo.getSnsId());
+			params.add("partner_id", custSnsInfo.getSnsType()+'_'+custSnsInfo.getMemNo());
+			params.add("join_gb", joinGb);
+			params.add("str_Type", type);
+
+			// Header
+			HttpHeaders headers = new HttpHeaders();
+			headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
+
+			HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<>(params, headers);
+			URI url = URI.create(linkUrl);
+
+			// POST방식으로 호출
+			ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, request, String.class);
+			log.info("saveLink responseEntity.getStatusCode(): {} ", responseEntity.getStatusCode());
+			String responseEntityBody = responseEntity.getBody();
+			log.info("saveLink responseEntity.getBody(): {} ", responseEntityBody);
+
+		} catch (Exception e) {
+			log.error(e.getMessage());
+		}
+	}
+
+
+	/**
+	 * YES24 고객 연동해지
+	 *
+	 * @param  custSnsInfo - 고객정보
+	 * @return String - 호출 url정보
+	 * @author jsshin
+	 * @since 2021. 03. 03
+	 */
+	public void saveUnLink(CustSnsInfo custSnsInfo) {
+		String joinGb = TsfSession.getFrontGb().equals("P") ? "P" : "M";
+
+		// 1. Ci 다시 암호화
+		String encryptCi = CryptoUtils.encryptAES(custSnsInfo.getCi());
+
+		try {
+			MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
+			params.add("str_ci", encryptCi);
+			params.add("mem_id", custSnsInfo.getSnsId());
+			params.add("partner_id", custSnsInfo.getSnsType()+'_'+custSnsInfo.getMemNo());
+			params.add("join_gb", joinGb);
+			params.add("str_Type", type);
+
+			// Header
+			HttpHeaders headers = new HttpHeaders();
+			headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
+
+			HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<>(params, headers);
+			URI url = URI.create(unlinkUrl);
+
+			// POST방식으로 호출
+			ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, request, String.class);
+			log.info("getUserInfo responseEntity.getStatusCode(): {} ", responseEntity.getStatusCode());
+			String responseEntityBody = responseEntity.getBody();
+			log.info("getUserInfo responseEntity.getBody(): {} ", responseEntityBody);
+
+
+		} catch (Exception e) {
+			log.error(e.getMessage());
+		}
+	}
+
 
 
 

+ 52 - 42
src/main/java/com/style24/front/biz/web/TsfCustomerController.java

@@ -3,10 +3,14 @@ package com.style24.front.biz.web;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpSession;
 
+import com.style24.front.biz.thirdparty.Yes24Login;
+import com.style24.persistence.domain.CustSnsInfo;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpRequest;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -55,6 +59,9 @@ public class TsfCustomerController extends TsfBaseController {
 	@Autowired
 	private NiceCertify niceCertify;
 
+	@Autowired
+	private Yes24Login yes24Login;
+
 	/**
 	 * 아이디 찾기 화면
 	 *
@@ -303,48 +310,6 @@ public class TsfCustomerController extends TsfBaseController {
 		return result;
 	}
 
-	/**
-	 * 이용약관 화면
-	 *
-	 * @return ModelAndView
-	 * @author jsshin
-	 * @since 2021. 02. 19
-	 */
-	@GetMapping("/licensing/layer/form")
-	public ModelAndView getLicensingLayerForm() {
-		ModelAndView mav = new ModelAndView();
-
-		return mav;
-	}
-
-	/**
-	 * 개인정보취급방침 화면
-	 *
-	 * @return ModelAndView
-	 * @author jsshin
-	 * @since 2021. 02. 19
-	 */
-	@GetMapping("/privacy/layer/form")
-	public ModelAndView getPrivacyLayerForm() {
-		ModelAndView mav = new ModelAndView();
-
-		return mav;
-	}
-
-	/**
-	 * 마케팅 동의 화면
-	 *
-	 * @return ModelAndView
-	 * @author jsshin
-	 * @since 2021. 02. 19
-	 */
-	@GetMapping("/marketing/layer/form")
-	public ModelAndView getMarketingLayerForm() {
-		ModelAndView mav = new ModelAndView();
-
-		return mav;
-	}
-
 	/**
 	 * 회원가입 유형 화면
 	 *
@@ -829,4 +794,49 @@ public class TsfCustomerController extends TsfBaseController {
 		return mav;
 	}
 
+	/**
+	 * 정보 이용동의 화면 - Yes24 사용
+	 *
+	 * @return ModelAndView
+	 * @author jsshin
+	 * @since 2021. 03. 25
+	 */
+	@PostMapping("/consent/useinfo/layer")
+	public ModelAndView cnstentUseInfoLayer() {
+		ModelAndView mav = new ModelAndView();
+
+		mav.addObject("custNm", "신주승");
+
+		mav.setViewName(super.getDeviceViewName("customer/ConsentUseInfoForm"));
+
+		return mav;
+	}
+
+	/**
+	 * 정보 이용동의 화면 - 연동 처리
+	 *
+	 * @return ModelAndView
+	 * @author jsshin
+	 * @since 2021. 03. 25
+	 */
+	@PostMapping("/peristalsis/yes24")
+	@ResponseBody
+	public GagaMap peristalsisYes24(HttpSession session, HttpServletRequest request) {
+		CustSnsInfo custSnsInfo = (CustSnsInfo) session.getAttribute("custSnsInfo");
+		session.removeAttribute("custSnsInfo"); // YES24 세션 지움
+
+		// 1. SNS처리
+		GagaMap resultMap = customerService.customerSnsProcessing(custSnsInfo);
+		String custStat = resultMap.getString("custStat");
+		// 2.신규가입 및 연동이면 바로 로그인 처리
+		if ("NEW_CUST".equals(custStat)) {
+			customerService.getLogin(Integer.parseInt(resultMap.getString("custNo")), request);
+		}
+		// 3.YES24 연동처리
+		if ("NEW_CUST".equals(custStat) || "SUCC_CUST".equals(custStat)) {
+			yes24Login.saveLink(custSnsInfo);
+		}
+
+		return resultMap;
+	}
 }

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

@@ -15,6 +15,7 @@ import com.style24.persistence.domain.GnbTab;
 import com.style24.persistence.domain.Cate4Srch;
 import com.style24.persistence.domain.GoodsSearch;
 import com.style24.persistence.domain.BrandGroup;
+import com.style24.persistence.domain.Goods;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.mobile.device.Device;
@@ -213,7 +214,6 @@ public class TsfDisplayController extends TsfBaseController {
 		for (MainLayout brandMain : mainLayoutCollection) {
 			String contentsLoc = brandMain.getContentsLoc();
 			Contents contents = new Contents();
-
 			contents.setContentsLoc(contentsLoc);
 			contents.setPreview(paramMap.get("preview"));
 			contents.setViewDt(paramMap.get("viewDt"));
@@ -226,12 +226,32 @@ public class TsfDisplayController extends TsfBaseController {
 			brandMain.setCate4Srch(cate4Srch);
 
 			if ("C".equals(brandMain.getContentsYn())) {
+				if(contentsLoc.equals("SBM013")){
+					cate4Srch.setBrandGroupNo(brandMain.getBrandGroupNo());
+					cate4Srch.setMaxRow(5);
+					Collection<Goods> goodsList = goodsService.getContentsCategoryGoodsList(cate4Srch);
+					brandMain.setGoodsList(goodsList);
+				}
 				brandMain.setContentsList(displayService.getContentsList(contents));
+			}else{
+				cate4Srch.setBrandGroupNo(brandMain.getBrandGroupNo());
+				if(cate4Srch.getContentsLoc().equals("SBM008")){
+					cate4Srch.setMaxRow(10);
+				}else if(cate4Srch.getContentsLoc().equals("SBM013")){
+					cate4Srch.setMaxRow(50);
+				}else{	// SBM007, SBM009
+					cate4Srch.setMaxRow(20);
+				}
+				Collection<Goods> goodsList = goodsService.getContentsCategoryGoodsList(cate4Srch);
+				brandMain.setGoodsList(goodsList);
+
+				if("A".equals(brandMain.getContentsYn())){
+					brandMain.setContentsList(displayService.getContentsList(contents));
+				}
 			}
 
 			// 룩북일때
 			if("SBM010".equals(brandMain.getContentsLoc()) || "SBMM010".equals(brandMain.getContentsLoc())){
-				Lookbook lookbookMst = new Lookbook();
 				Lookbook lookbook = new Lookbook();
 				lookbook.setBrandCd(paramMap.get("brandGroupNo"));
 				lookbook.setMainDispYn("Y");
@@ -240,7 +260,7 @@ public class TsfDisplayController extends TsfBaseController {
 			}
 			brandMainLayoutList.add(brandMain);
 		}
-		log.info("brandMainLayoutList::{}", brandMainLayoutList);
+		//log.info("brandMainLayoutList::{}", brandMainLayoutList);
 		mav.addObject("brandMainLayoutList", brandMainLayoutList);
 		mav.setViewName(super.getDeviceViewName("display/BrandMainForm"));
 
@@ -274,14 +294,17 @@ public class TsfDisplayController extends TsfBaseController {
 		ModelAndView mav = new ModelAndView(super.getDeviceViewName("display/CategoryMainForm"));
 
 		// 기획전
+		Contents contents = new Contents();
+		contents.setContentsLoc("SCM001");
+		mav.addObject("planningList",displayService.getContentsList(contents));
 
 		// 신상품
-		cate.setContentsLoc("SCM001");
+		cate.setContentsLoc("SCM002");
 		cate.setMaxRow(20);
 		mav.addObject("newGoodsList", goodsService.getContentsCategoryGoodsList(cate));
 
 		// 베스트품
-		cate.setContentsLoc("SCM002");
+		cate.setContentsLoc("SCM003");
 		cate.setMaxRow(20);
 		mav.addObject("bestGoodsList", goodsService.getContentsCategoryGoodsList(cate));
 

+ 135 - 4
src/main/java/com/style24/front/biz/web/TsfGoodsController.java

@@ -160,9 +160,20 @@ public class TsfGoodsController extends TsfBaseController {
 		// 상품 공지
 		mav.addObject("goodsNoticeList", goodsService.getGoodsNoticeList(paramsGoods));
 
+		int goodsReviewCnt = 0;
 		if (TscConstants.GoodsType.DEAL.value().equals(goods.getGoodsType())) {	// 딜상품
 			// 딜 구성상품 정보
 			mav.addObject("goodsDealComposeList", goodsService.getGoodsDealComposeList(paramsGoods));
+
+			// 딜용 상품평건수
+			Review review = new Review();
+			review.setGoodsCd(goods.getGoodsCd());
+			review.setGoodsType(goods.getGoodsType());
+			goodsReviewCnt = reviewService.getReviewTotalCount(review);
+
+			// 딜용상품평건수
+			mav.addObject("goodsReviewCnt", goodsReviewCnt);
+			
 		} else {
 			if (TscConstants.GoodsType.NORMAL.value().equals(goods.getGoodsType())) {	// 일반상품
 				//if ("Y".equals(goods.getSelfGoodsYn())) {  // 자사상품
@@ -195,8 +206,11 @@ public class TsfGoodsController extends TsfBaseController {
 		Counsel counsel = new Counsel();
 		counsel.setRelGoodsCd(goods.getGoodsCd());
 		counsel.setSiteCd(TscConstants.Site.STYLE24.value());
+		counsel.setGoodsType(goods.getGoodsType());	 // 딜상품(G056_D)일 경우 구성상품의 상품평수 
 		int goodsQnaCnt = counselService.getGoodsQnaTotalCount(counsel);
 		mav.addObject("goodsQnaCnt", goodsQnaCnt);
+		
+		
 //
 //		// 상품포인트사용방법
 //		mav.addObject("goodsPointMothod", envsetService.getPointMothod(TscConstants.Site.STYLE24.value())); // A:정액, R:정율
@@ -452,9 +466,6 @@ public class TsfGoodsController extends TsfBaseController {
 		setGoods(paramsGoods);
 		Goods goods = goodsService.getGoodsInfo(paramsGoods);
 
-		// 배송업체명, 반품비, 교환비, 주소
-		mav.addObject("deliveryInfo", goodsService.getGoodsDeliveryInfo(goodsCd));
-
 		// 상품 기본정보
 		mav.addObject("goodsInfo", goods);
 
@@ -659,7 +670,7 @@ public class TsfGoodsController extends TsfBaseController {
 		mav.addObject("photoReviewList", reviewService.getReviewList(review));	//포토상품평
 
 		// 상품평에 등록된 사이즈 정보
-		mav.addObject("reviewOptionList", reviewService.getReviewOptionList(goods.getGoodsCd()));
+		mav.addObject("reviewOptionList", reviewService.getReviewOptionList(goods));
 
 		// 유야동: 베이비(07), 키즈여아(08), 키즈남아(09), 키즈공통(10), 주니어여야(11), 주니어남아(12), 주니어공통(13), 성인G: 유아동 제외 전체
 		// 유야동 키 공통코드 G091, 성인 키 공통코드 G090
@@ -1066,5 +1077,125 @@ public class TsfGoodsController extends TsfBaseController {
 		return mav;
 	}
 	
+	/**
+	 * 상품상세 -  ajax 구성상품 배송정보
+	 * @return
+	 * @author eskim
+	 * @since 2021. 3. 26
+	 */
+	@PostMapping("/detail/delivery/frame")
+	public ModelAndView goodsDetailDeliveryForm(Goods paramsGoods) {
+		ModelAndView mav = new ModelAndView();
+		// 상품관련 기본값 설정(회원 등급, 앱, PC/모바일 등)
+		setGoods(paramsGoods);
+		
+		Goods goods = goodsService.getGoodsInfo(paramsGoods);
+
+		// 배송업체명, 반품비, 교환비, 주소
+		mav.addObject("deliveryInfo", goodsService.getGoodsDeliveryInfo(goods.getGoodsCd()));
+
+		// 상품 기본정보
+		mav.addObject("goodsInfo", goods);
+
+		
+		mav.setViewName(super.getDeviceViewName("goods/GoodsDetailDeliveryForm"));
+		return mav;
+	}
 	
+	/**
+	 * 상품상세 -  ajax 구성상품 문의정보
+	 * @return
+	 * @author eskim
+	 * @since 2021. 3. 26
+	 */
+	@PostMapping("/detail/qna/frame")
+	public ModelAndView goodsDetailQnaForm(Goods paramsGoods) {
+		ModelAndView mav = new ModelAndView();
+		// 상품관련 기본값 설정(회원 등급, 앱, PC/모바일 등)
+		setGoods(paramsGoods);
+		
+//		Goods goods = goodsService.getGoodsInfo(paramsGoods);
+//
+//		// 상품 기본정보
+//		mav.addObject("goodsInfo", goods);
+		
+		// 상품 기본정보
+		mav.addObject("goodsInfo", paramsGoods);
+		
+		mav.setViewName(super.getDeviceViewName("goods/GoodsDetailQnaForm"));
+		return mav;
+	}
+	
+	/**
+	 * 상품상세 -  ajax 구성상품 상품평정보
+	 * @return
+	 * @author eskim
+	 * @since 2021. 3. 26
+	 */
+	@PostMapping("/detail/review/frame")
+	public ModelAndView goodsDetailReviewForm(Goods paramsGoods) {
+		ModelAndView mav = new ModelAndView();
+		// 상품관련 기본값 설정(회원 등급, 앱, PC/모바일 등)
+		setGoods(paramsGoods);
+		Goods goods = goodsService.getGoodsInfo(paramsGoods);
+
+		// 상품 기본정보
+		mav.addObject("goodsInfo", goods);
+
+		// 상품평 포인트
+		GagaMap reviewPoint = new GagaMap();
+		reviewPoint.set("textReviewPoint", envsetService.getTextReviewPoint(TscConstants.Site.STYLE24.value()));	//텍스트상품평포인트
+		reviewPoint.set("photoReviewPoint", envsetService.getPhotoReviewPoint(TscConstants.Site.STYLE24.value()));	//포토상품평포인트
+		reviewPoint.set("bestReviewPoint", envsetService.getBestReviewPoint(TscConstants.Site.STYLE24.value()));	//베스트상품평포인트
+		mav.addObject("reviewPoint", reviewPoint);
+
+		Review review = new Review();
+		review.setGoodsCd(goods.getGoodsCd());
+		mav.addObject("reviewCount", reviewService.getReviewTotalCount(review));	// 전체상품평 건수 
+		review.setRownum(1);
+		review.setGoodsType(goods.getGoodsType());
+		mav.addObject("reviewList", reviewService.getReviewList(review));	// 전체상품평 유무 확인
+		review.setBestYn("Y");
+		review.setRownum(0);	// 전체 조회
+		mav.addObject("bestReviewList", reviewService.getReviewList(review));	//베스트상품평
+		review.setPhotoYn("Y");
+		review.setBestYn("");
+		review.setRownum(0);	// 전체 조회
+		mav.addObject("photoReviewList", reviewService.getReviewList(review));	//포토상품평
+
+		// 상품평에 등록된 사이즈 정보
+		mav.addObject("reviewOptionList", reviewService.getReviewOptionList(goods));
+
+		// 유야동: 베이비(07), 키즈여아(08), 키즈남아(09), 키즈공통(10), 주니어여야(11), 주니어남아(12), 주니어공통(13), 성인G: 유아동 제외 전체
+		// 유야동 키 공통코드 G091, 성인 키 공통코드 G090
+		String[] arrItem = {"07", "08", "09", "10", "11", "12", "13"};
+		ArrayList<String> itemList = new ArrayList<>(Arrays.asList(arrItem));
+
+		// 키전체 
+		Collection<CommonCode> reviewHeightList = new ArrayList<CommonCode>();
+		log.info("goods.getItemkindCd().substring(0, 2) => {} ", goods.getItemkindCd().substring(0, 2));
+		if (itemList.contains(goods.getItemkindCd().substring(0, 2))) {
+			reviewHeightList = rendererService.getAvailCommonCodeList("G091");
+		} else {
+			reviewHeightList = rendererService.getAvailCommonCodeList("G090");
+		}
+
+		// 상품평 키
+		mav.addObject("reviewHeightList", reviewHeightList);
+
+		// 유야동 몸무게 공통코드 G093, 성인 몸무게 공통코드 G092
+		// 몸무게
+		Collection<CommonCode> reviewWeightList = new ArrayList<CommonCode>();
+		if (itemList.contains(goods.getItemkindCd().substring(0, 2))) {
+			reviewWeightList = rendererService.getAvailCommonCodeList("G093");
+		} else {
+			reviewWeightList = rendererService.getAvailCommonCodeList("G092");
+		}
+
+		// 상품평 몸무게
+		mav.addObject("reviewWeightList", reviewWeightList);
+		
+		mav.setViewName(super.getDeviceViewName("goods/GoodsDetailReviewForm"));
+		return mav;
+	}
 }

+ 27 - 22
src/main/java/com/style24/front/biz/web/TsfIndexController.java

@@ -12,6 +12,7 @@ import com.style24.front.biz.thirdparty.Yes24Login;
 import com.style24.front.support.controller.TsfBaseController;
 import com.style24.front.support.security.session.TsfSession;
 import com.style24.persistence.domain.CustSnsInfo;
+import com.style24.persistence.domain.Customer;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -328,34 +329,38 @@ public class TsfIndexController extends TsfBaseController {
 		GagaMap userInfo = new GagaMap();
 
 		if (StringUtils.isNotBlank(ipin)) {
-
+			userInfo = yes24Login.getUserInfo(ipin);
+			userInfo.setString("snsType", TscConstants.SnsType.YES24.value());
+			isSnsLoing = true;
 		}
 
 
 		GagaMap resultMap = new GagaMap();
 
 		// SNS 로그인 성공시 정보 세션 저장
-//		if (isSnsLoing) {
-//			CustSnsInfo custSnsInfo = objectMapper.convertValue(userInfo, CustSnsInfo.class);
-//			log.info("custSnsInfo ==> {}", custSnsInfo.toString());
-//
-//			//SNS 로그인 처리
-//			resultMap = customerService.customerSnsProcessing(custSnsInfo);
-//			resultMap.setString("snsId", custSnsInfo.getSnsId());
-//			resultMap.setString("snsType", custSnsInfo.getSnsType());
-//
-//			String custStat = resultMap.getString("custStat");
-//
-//			// 신규가입 이면 바로 로그인 처리
-//			if ("NEW_CUST".equals(custStat)) {
-//				customerService.getLogin(Integer.parseInt(resultMap.getString("custNo")), request);
-//			}
-//
-//			// 가입 폼으로 이동
-//			if ("EMPTY_PHONE_CUST".equals(custStat)) {
-//				session.setAttribute("custSnsInfo", custSnsInfo);
-//			}
-//		}
+		if (isSnsLoing) {
+			CustSnsInfo custSnsInfo = objectMapper.convertValue(userInfo, CustSnsInfo.class);
+			log.info("custSnsInfo ==> {}", custSnsInfo.toString());
+
+			resultMap.setString("snsId", custSnsInfo.getSnsId());
+			resultMap.setString("snsType", custSnsInfo.getSnsType());
+
+			Customer custInfo = customerService.getCusomterSnsFind(custSnsInfo);
+
+			if (custInfo != null) {
+				resultMap.setString("custStat", "SUCC_CUST");
+			} else {
+				session.setAttribute("custSnsInfo", custSnsInfo);
+				resultMap.setString("custNm", custSnsInfo.getCustNm());
+				resultMap.setString("custStat", "NEED_AGREE_CUST");
+			}
+		}
+
+		// RememberMe 값이 있고 true이면
+		if (StringUtils.isNotBlank(TsfSession.getAttribute("rememberMe")) && Boolean.valueOf(TsfSession.getAttribute("rememberMe"))) {
+			userInfo.setBoolean("rememberMe", true);
+		}
+
 		mav.addObject("resultMap", resultMap);
 		mav.setViewName(super.getDeviceViewName("SnsCallBackForm"));
 

+ 49 - 8
src/main/java/com/style24/front/biz/web/TsfMypageController.java

@@ -941,26 +941,37 @@ public class TsfMypageController extends TsfBaseController {
 		review.setSiteCd(TscConstants.Site.STYLE24.value());
 		// 작성가능한 리뷰 카운트
 		mav.addObject("completeReviewCount", reviewService.getCompleteReviewCount(review));
-		// 작성가능한 리뷰 목록
-		//mav.addObject("completeReviewList", reviewService.getCompleteReviewList(review));
+		
+		// 작성한 리뷰 카운트
+		mav.addObject("alreadyReviewCount", reviewService.getAlreadyReviewCount(review));
+		
+		// 관리자 댓글확인 카운트
+		mav.addObject("adminCount", reviewService.getAdminConfirmCount(review));
+		
+		// 리뷰 이미지/동영상
+		mav.addObject("alreadyReviewAttach", reviewService.getReviewAttach(review));
+		
 		mav.setViewName(super.getDeviceViewName("mypage/MypageReviewForm"));
 
 		return mav;
 	}
 	
 	/**
-	 * 마이페이지 리뷰 목록
+	 * 마이페이지 작성가능한 리뷰 목록
 	 * @param review
 	 * @return
 	 * @author sowon
 	 * @since 2021. 03. 25
 	 */
-	@PostMapping("/review/list")
+	@PostMapping("/complete/review/list")
 	@ResponseBody
-	public GagaMap getMypageReviewList(@RequestBody Review review) {
+	public GagaMap getMypageCompleteReviewList(@RequestBody Review review) {
 
 		review.setSiteCd(TscConstants.Site.STYLE24.value());
 
+		if (TsfSession.isLogin()) {
+			review.setCustNo(TsfSession.getInfo().getCustNo());
+		}
 		GagaMap result = new GagaMap();
 
 		TscPageRequest pageable = new TscPageRequest((review.getPageNo() > 0 ? review.getPageNo() - 1 : 0), review.getPageSize(), review.getPageUnit());
@@ -969,14 +980,44 @@ public class TsfMypageController extends TsfBaseController {
 		log.info("pageable: {}", pageable);
 		log.info("totalCount {}", pageable.getTotalCount());
 		
+		result.set("paging", review);
+		result.set("completeReviewCount", reviewService.getCompleteReviewCount(review));
+		result.set("dataList1", reviewService.getCompleteReviewList(review));
+
+		return result;
+	}
+	
+	/**
+	 * 마이페이지 작성한 리뷰 목록
+	 * @param review
+	 * @return
+	 * @author sowon
+	 * @since 2021. 03. 26
+	 */
+	@PostMapping("/already/review/list")
+	@ResponseBody
+	public GagaMap getMypageAlreadyReviewList(@RequestBody Review review) {
+
+		review.setSiteCd(TscConstants.Site.STYLE24.value());
 
+		GagaMap result = new GagaMap();
 		if (TsfSession.isLogin()) {
 			review.setCustNo(TsfSession.getInfo().getCustNo());
 		}
 
-		result.set("paging", review);
-		result.set("completeReviewCount", reviewService.getCompleteReviewCount(review));
-		result.set("dataList", reviewService.getCompleteReviewList(review));
+		TscPageRequest pageable2 = new TscPageRequest((review.getPageNo2() > 0 ? review.getPageNo2() - 1 : 0), review.getPageSize2(), review.getPageUnit2());
+		pageable2.setTotalCount(reviewService.getAlreadyReviewCount(review));
+		
+		review.setPageable2(pageable2);
+		log.info("pageable2: {}", pageable2);
+		log.info("totalCount2 {}", pageable2.getTotalCount());
+		
+
+	
+		result.set("paging2", review);
+		result.set("alreadyReviewCount", reviewService.getAlreadyReviewCount(review));
+		result.set("dataList2", reviewService.getAlreadyReviewList(review));
+		
 
 		return result;
 	}

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

@@ -53,6 +53,8 @@ public class Counsel extends TscBaseDomain {
 	private String secretYn;		// 비밀글여부(상품문의에서만 사용)
 	private String delYn;			// 삭제여부
 	private int selfGb;				// 내문의 1: , 그외 0
+	
+	private String goodsType; 		// 상품타입
 
 	// 1:1문의(총, 답변완료, 처리중) 건수
 	private int totCnt;		// 총건수

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

@@ -34,5 +34,11 @@ public class CustSnsInfo extends TscBaseDomain {
 	private String sexGb;
 	private Integer custNo;
 
+	// Yes24 데이터
+	private String memNo;
+	private String homeZipcode;
+	private String homeBaseAddr;
+	private String homeDtlAddr;
+
 	private String requestGb;
 }

+ 12 - 0
src/main/java/com/style24/persistence/domain/Goods.java

@@ -121,21 +121,33 @@ public class Goods extends TscBaseDomain {
 	private int scoreSize1;
 	private int scoreSize2;
 	private int scoreSize3;
+	private String scoreSize;
 	private int scoreColor1;
 	private int scoreColor2;
 	private int scoreColor3;
+	private String scoreColor;
 	private int scoreFit1;
 	private int scoreFit2;
 	private int scoreFit3;
+	private String scoreFit;
 	private int scoreThick1;
 	private int scoreThick2;
 	private int scoreThick3;
+	private String scoreThick;
 	private int scoreWeight1;
 	private int scoreWeight2;
 	private int scoreWeight3;
+	private String scoreWeight;
 	private int scoreBall1;
 	private int scoreBall2;
 	private int scoreBall3;
+	private String scoreBall;
+	private String reviewContent;
+	private String admRplDt;
+	private String admRpl;
+	private int height;				// 키
+	private int weight;				// 몸무게
+	private Integer reviewSq;
 	private String goodsStatNm;
 
 	private String sizeGb;		// 사이즈구분(T:상의, B:하의, S:신발)

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

@@ -73,6 +73,8 @@ public class Review extends TscBaseDomain {
 	private int reviewWeightEd;	// 상품평 검색조건 몸무게 구간종료	50
 	
 	private String reviewSysImg;	// 리뷰대표이미지
+	private String sysFileNm;		//시스템 파일명
+	private String orgFileNm;		// 원본 파일명
 	private String goodsImageYn;	// 이미지 여부
 	private int rankno;				// 리뷰 순서
 	private Integer planSq;			// 기획전 번호
@@ -80,7 +82,8 @@ public class Review extends TscBaseDomain {
 	private String goodsNm;			// 상품이름
 	private int currPrice;		// 현재가
 	private String fileGb;			// 첨부파일 종류
-	private int cnt;				// 리뷰 카운트
+	private int cnt;				// 작성가능한 리뷰 카운트
+	private int count;				// 작성한 리뷰 카운트
 	private String siteCd;
 	
 	// Masking
@@ -95,10 +98,16 @@ public class Review extends TscBaseDomain {
 	// Pagination
 	@JsonInclude(JsonInclude.Include.NON_EMPTY)
 	private TscPageRequest pageable;
+	@JsonInclude(JsonInclude.Include.NON_EMPTY)
+	private TscPageRequest pageable2;
 
 	private int pageNo = 1;							// 페이지번호
 	private int pageSize = 10;						// 페이지목록수
 	private int pageUnit = 10;						// 페이지번호수
 	
+	private int pageNo2 = 1;							// 페이지번호
+	private int pageSize2 = 10;						// 페이지목록수
+	private int pageUnit2 = 10;						// 페이지번호수
+	
 	
 }

+ 17 - 3
src/main/java/com/style24/persistence/mybatis/shop/TsfCounsel.xml

@@ -271,8 +271,22 @@
 		SELECT COUNT(*) AS CNT
 		FROM   TB_COUNSEL A
 		     , TB_GOODS G
-		WHERE  A.REL_GOODS_CD = G.GOODS_CD
-		<if test="custNo != null and custNo != '' ">
+		<if test="goodsType != null and goodsType = 'G056_D'">
+		     , TB_GOODS_COMPOSE C
+		</if>
+		WHERE  1 = 1
+		<choose>
+		    <when test="goodsType != null and goodsType = 'G056_D'">
+		AND    A.REL_GOODS_CD = G.GOODS_CD
+		AND    G.GOODS_CD = C.COMPS_GOODS_CD
+		AND    C.GOODS_CD = #{relGoodsCd}
+		    </when>
+		    <otherwise>
+		AND    A.REL_GOODS_CD = G.GOODS_CD
+		AND    A.REL_GOODS_CD = #{relGoodsCd}
+		    </otherwise>
+		</choose>
+		<if test="custNo != null and custNo > 0 ">
 		AND    A.CUST_NO = #{custNo}
 		</if>
 		<if test="relGoodsCd != null and relGoodsCd != '' ">
@@ -309,7 +323,7 @@
 		FROM   TB_COUNSEL A
 		     , TB_GOODS G
 		WHERE  A.REL_GOODS_CD = G.GOODS_CD
-		<if test="custNo != null and custNo != '' ">
+		<if test="custNo != null and custNo > 0 ">
 		AND    A.CUST_NO = #{custNo}
 		</if>
 		<if test="relGoodsCd != null and relGoodsCd != '' ">

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

@@ -448,7 +448,7 @@
 		<if test="brandGroupNo != null and brandGroupNo !=''">
 			AND    BRAND_GROUP_NO  = #{brandGroupNo}
 		</if>
-		AND 	CONTENTS_LOC IN ('SMM001','SMM002','SMM005','SMM008','SBM004','SBM005','SBM006','SBM010')
+		AND 	CONTENTS_LOC IN ('SMM001','SMM002','SMM005','SMM008','SBM004','SBM005','SBM006','SBM007','SBM008','SBM009','SBM010','SBM013')
 		ORDER BY DISP_ORD, COL_NO
 	</select>
 
@@ -456,6 +456,7 @@
 	<select id="getCate4srch" parameterType="Cate4Srch" resultType="Cate4Srch">
 		/* TsfDisplay.getCate4srch */
 		SELECT SITE_CD
+		    , CATE_GB
 			, LEAF_CATE_NO
 			, CATE_TYPE
 			, CATE1_NO

+ 5 - 0
src/main/java/com/style24/persistence/mybatis/shop/TsfGoods.xml

@@ -282,6 +282,7 @@
 		        END ) AS STOCK_QTY
 		     , SOLDOUT_YN
 		     , DISP_ORD
+		     , SELF_GOODS_YN
 		FROM (
 		      SELECT O.GOODS_CD
 		           , O.OPT_CD
@@ -292,6 +293,7 @@
 		           , O.SOLDOUT_YN
 		           , O.DISP_ORD
 		           , G.MIN_ORD_QTY
+		           , G.SELF_GOODS_YN
 		      FROM TB_GOODS G
 		      INNER JOIN TB_OPTION O ON G.GOODS_CD = O.GOODS_CD
 		                             AND O.OPT_CD1 = #{optCd1}
@@ -405,6 +407,7 @@
 		     , G.ORDER_MADE_YN
 		     , G.LIST_PRICE
 		     , G.GOODS_STAT
+		     , G.SELF_GOODS_YN
 		     , FN_GET_BENEFIT_PRICE(#{frontGb},G.GOODS_CD, G.CURR_PRICE,#{custGb}) AS CURR_PRICE
 		     , (CASE WHEN D.DISP_NM_LANG = 'EN' THEN D.BRAND_GROUP_ENM ELSE D.BRAND_GROUP_KNM END) AS BRAND_GROUP_NM
 		     , (SELECT MAX(SYS_IMG_NM) FROM TB_GOODS_IMG WHERE GOODS_CD = G.GOODS_CD AND COLOR_CD = G.MAIN_COLOR_CD AND DEFAULT_IMG_YN = 'Y') AS SYS_IMG_NM
@@ -429,6 +432,7 @@
 		AND C.USE_YN = 'Y'
 		ORDER BY C.DISP_ORD
 		) Z
+		LIMIT 200
 	</select>
 	
 	<!-- 구성 상품 정보 -->
@@ -1077,6 +1081,7 @@
 		            </if>
 		            AND    G.GOODS_STAT = 'G008_90' /*승인완료상품*/
 		            AND    G.FORMAL_GB = 'G009_10' /*정상상품*/
+		            AND    G.SELF_MALL_YN = 'Y'   /*몰노출상품*/
 		            AND    GS.STOCK_QTY <![CDATA[>]]> 0 /*재고있는상품*/
 		            AND    B.USE_YN = 'Y'
 		            AND    BG.USE_YN = 'Y'

+ 239 - 16
src/main/java/com/style24/persistence/mybatis/shop/TsfReview.xml

@@ -31,7 +31,20 @@
 		                              AND R.ORD_DTL_NO  = OD.ORD_DTL_NO
 		                              AND R.GOODS_CD = OD.GOODS_CD
 		INNER JOIN TB_CUSTOMER C ON R.REG_NO  = C.CUST_NO
+		<if test="goodsType != null and goodsType = 'G056_D'">
+		INNER JOIN TB_GOODS_COMPOSE GC ON R.GOODS_CD  = GC.COMPS_GOODS_CD
+		</if>
+		WHERE 1 = 1
+		<choose>
+		    <when test="goodsType != null and goodsType = 'G056_D'">
+		AND    R.GOODS_CD = GC.COMPS_GOODS_CD
+		AND    GC.GOODS_CD = #{goodsCd}
+		    </when>
+		    <otherwise>
 		AND R.GOODS_CD = #{goodsCd}
+		    </otherwise>
+		</choose>
+		
 		<if test='bestYn != null and bestYn == "Y"'>
 		AND R.BEST_YN = 'Y'
 		</if>
@@ -169,6 +182,7 @@
 		                              AND R.ORD_DTL_NO  = OD.ORD_DTL_NO 
 		                              AND R.GOODS_CD = OD.GOODS_CD
 		INNER JOIN TB_CUSTOMER C ON R.REG_NO  = C.CUST_NO
+		WHERE 1 = 1
 		AND R.GOODS_CD = #{goodsCd}
 		<if test="reviewSq != null and reviewSq != ''" >
 		AND R.REVIEW_SQ = #{reviewSq}
@@ -262,18 +276,37 @@
 		AND R.GOODS_CD = #{goodsCd}
 	</select>
 	
-	<!-- 상품평 옵션 목록 -->
-	<select id="getReviewOptionList" parameterType="String" resultType="Goods">
-		/* TsfReivew.getReviewOptionList */
-		SELECT DISTINCT ODI.OPT_CD2
-		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
-		                              AND R.GOODS_CD  = OD.GOODS_CD 
-		INNER JOIN TB_ORDER_DETAIL_ITEM ODI ON OD.ORD_NO = ODI.ORD_NO 
+	<!-- 상품평 옵션 목록 - 입점 -->
+	<select id="getReviewOption1List" parameterType="String" resultType="Goods">
+		/* TsfReivew.getReviewOption1List */
+		SELECT OPT_CD1 AS OPT_CD
+		FROM (
+		    SELECT DISTINCT ODI.OPT_CD1
+		    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
+		                                  AND R.GOODS_CD  = OD.GOODS_CD 
+		    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
+		    WHERE R.GOODS_CD = #{goodsCd}
+		) Z
+	</select>
+	
+	<select id="getReviewOption2List" parameterType="String" resultType="Goods">
+		/* TsfReivew.getReviewOption2List */
+		SELECT OPT_CD2 AS OPT_CD
+		FROM (
+		    SELECT DISTINCT ODI.OPT_CD2
+		    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
+		                                  AND R.GOODS_CD  = OD.GOODS_CD 
+		    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
-		WHERE R.GOODS_CD = #{goodsCd}
+		    INNER JOIN TB_GOODS G ON ODI.ITEM_CD = G.GOODS_CD
+		    WHERE R.GOODS_CD = #{goodsCd}
+		) Z    
 	</select>
 
 	<!-- 마이페이지 작성가능한 리뷰 -->
@@ -308,7 +341,7 @@
 			      ,I.SIZE_GB 
 			      ,DATEDIFF( DATE_ADD(O.PAY_DT,INTERVAL 90 DAY),NOW()) AS REMAIN_DT -- 남은시간
 			FROM TB_ORDER O INNER JOIN TB_ORDER_DETAIL OD ON O.ORD_NO = OD.ORD_NO 
-								 			 	AND OD.ORD_DTL_STAT = 'G013_70' -- 구매 확정인것만
+								 			 	 AND OD.ORD_DTL_STAT = 'G013_70' -- 구매 확정인것만
 			                INNER JOIN TB_ORDER_DETAIL_ITEM ODI ON OD.ORD_DTL_NO = ODI.ORD_DTL_NO 
 			                  					 AND OD.ORD_DTL_NO = ODI.ORD_DTL_NO
 			                  	                 AND ODI.ORD_DTL_STAT = 'G013_70'
@@ -317,8 +350,8 @@
 			                LEFT JOIN TB_ITEMKIND I ON G.ITEMKIND_CD = I.ITEMKIND_CD 
 			WHERE 1=1
 				AND O.PAY_DT <![CDATA[>]]>  DATE_FORMAT(DATE_ADD(CURRENT_DATE(), INTERVAL -90 DAY), '%Y%M%D%H%I%S') <!--  60 일이내것만 -->
-				AND O.ORD_NO NOT IN (SELECT R.ORD_NO FROM TB_REVIEW R WHERE R.DEL_YN = 'N')
-				AND O.CUST_NO = #{custNo}
+				AND O.ORD_NO NOT IN (SELECT R.ORD_NO FROM TB_REVIEW R WHERE R.DEL_YN = 'N' AND DISP_YN = 'Y')
+				AND O.CUST_NO =#{custNo}
 				AND O.DISP_YN = 'Y'
 				AND O.SITE_CD = #{siteCd}
 				<if test="ordNo!=null and ordNo != ''">
@@ -382,7 +415,7 @@
 			      ,B.BRAND_ENM 
 			      ,DATEDIFF( DATE_ADD(O.PAY_DT,INTERVAL 90 DAY),NOW()) AS DT -- 남은시간
 			FROM TB_ORDER O INNER JOIN TB_ORDER_DETAIL OD ON O.ORD_NO = OD.ORD_NO 
-								 			 AND OD.ORD_DTL_STAT = 'G013_70'--  구매 확정인것만
+								 				 AND OD.ORD_DTL_STAT = 'G013_70'--  구매 확정인것만
 			                INNER JOIN TB_ORDER_DETAIL_ITEM ODI ON OD.ORD_DTL_NO = ODI.ORD_DTL_NO 
 			                  					 AND OD.ORD_DTL_NO = ODI.ORD_DTL_NO
 			                  	                 AND ODI.ORD_DTL_STAT = 'G013_70'
@@ -390,7 +423,7 @@
 			                INNER JOIN TB_BRAND B ON B.BRAND_CD = G.BRAND_CD
 			WHERE 1=1
 				AND O.PAY_DT <![CDATA[>]]>  DATE_FORMAT(DATE_ADD(CURRENT_DATE(), INTERVAL -90 DAY), '%Y%M%D%H%I%S') <!--  60 일이내것만 -->
-				AND O.ORD_NO NOT IN (SELECT R.ORD_NO FROM TB_REVIEW R WHERE R.DEL_YN = 'N')
+				AND O.ORD_NO NOT IN (SELECT R.ORD_NO FROM TB_REVIEW R WHERE R.DEL_YN = 'N' AND DISP_YN = 'Y')
 				AND O.CUST_NO = #{custNo}
 				AND O.DISP_YN = 'Y'
 				AND O.SITE_CD = #{siteCd}
@@ -482,4 +515,194 @@
 			               ,UPD_DT         =  now()     
 			                           
 	</select>
+	
+	<select id="getAlreadyReviewCount" parameterType="Review" resultType="int">
+		/* TsfReivew.getAlreadyReviewCount */
+		SELECT COUNT(*) AS COUNT
+		FROM TB_REVIEW R
+		WHERE 1=1
+		 AND CUST_NO = 100011
+		 AND DEL_YN = 'N'
+		 AND DISP_YN = 'Y'
+	</select>
+	
+	<select id="getAlreadyReviewList" parameterType="Review" resultType="Goods">
+		/* TsfReivew.getAlreadyReviewList */
+		SELECT F.*
+			  , (SELECT MAX(SYS_IMG_NM) FROM TB_GOODS_IMG  WHERE GOODS_CD = F.GOODS_CD AND COLOR_CD = F.MAIN_COLOR_CD AND DEFAULT_IMG_YN = 'Y' ) AS SYS_IMG_NM
+		FROM
+		(
+			SELECT O.ORD_NO 
+			      ,O.ORD_NM
+			      ,DATE_FORMAT(O.PAY_DT, '%Y-%m-%d') AS PAY_DT 
+			      ,O.CUST_NO 
+			      ,OD.ORD_DTL_NO
+			      ,OD.ORD_EXCH_GB 
+			      ,OD.GOODS_CD 
+			      ,OD.REAL_ORD_AMT 
+			      ,OD.SAVE_PNT_AMT 
+			      ,OD.GFCD_USE_AMT 
+			      ,ODI.ORD_DTL_ITEM_SQ 
+			      ,ODI.ITEM_CD 
+			      ,ODI.OPT_CD 
+			      ,ODI.OPT_CD1
+			      ,ODI.OPT_CD2
+			      ,ODI.ITEM_QTY 
+			      ,ODI.ITEM_PRICE
+			      ,G.GOODS_NM 
+			      ,G.MAIN_COLOR_CD
+			      ,B.BRAND_ENM 
+			      ,I.ITEMKIND_NM 
+			      ,I.ITEMKIND_CD 
+			      ,I.SIZE_GB 
+			      ,R.REVIEW_SQ
+			      ,R.REVIEW_GB
+			      ,R.REVIEW_CONTENT
+			      ,R.SCORE
+			      ,R.HEIGHT
+			      ,R.WEIGHT
+			      ,(CASE R.SCORE_SIZE   WHEN 1 THEN '작음' 
+	      								WHEN 2 THEN '딱맞음'
+	      								WHEN 3 THEN '큼'
+	      													END) AS SCORE_SIZE
+			      ,(CASE R.SCORE_COLOR  WHEN 1 THEN '밝음' 
+			      						WHEN 2 THEN '똑같음'
+			      						WHEN 3 THEN '어두움'   
+			      						 					END) AS SCORE_COLOR
+			      ,(CASE R.SCORE_FIT    WHEN 1 THEN '슬림' 
+			      						WHEN 2 THEN '레귤러' 
+			      						WHEN 3 THEN '오버' 
+			      											END) AS SCORE_FIT
+			      ,(CASE R.SCORE_THICK  WHEN 1 THEN '얇음' 
+			      						WHEN 2 THEN '적당함' 
+			      						WHEN 3 THEN '도톰함'
+			      											END) AS SCORE_THICK
+			      ,(CASE R.SCORE_WEIGHT WHEN 1 THEN '가벼움' 
+			      						WHEN 2 THEN '적당함'
+			      						WHEN 3 THEN '무거움'
+			      											END) AS SCORE_WEIGHT
+			      ,(CASE R.SCORE_BALL   WHEN 1 THEN '작음'
+			      						WHEN 2 THEN '딱맞음'
+		                                WHEN 3 THEN '큼' 
+		                                					END) AS SCORE_BALL
+			      ,R.GIVE_DUE_PNT
+			      ,R.PNT_GIVE_STAT
+			      ,R.BEST_YN
+			      ,R.GIVE_DUE_BPNT
+			      ,R.BPNT_GIVE_YN
+			      ,R.DISP_YN
+			      ,R.DEL_YN
+			      ,R.CONFIRM_YN
+			      ,R.CONFIRM_UNO
+			      ,R.CONFIRM_DT
+			      ,R.REG_NO
+			      ,DATE_FORMAT(R.REG_DT , '%Y-%m-%d') AS REG_DT
+			      ,R.UPD_NO
+			      ,DATE_FORMAT(R.UPD_DT , '%Y-%m-%d') AS UPD_DT
+			      ,R.ADM_RPL
+			      ,R.ADM_RPL_REG_NO
+			      ,DATE_FORMAT(R.ADM_RPL_DT , '%Y-%m-%d %H:%i:%s') AS ADM_RPL_DT
+			      ,DATEDIFF( DATE_ADD(O.PAY_DT,INTERVAL 90 DAY),NOW()) AS REMAIN_DT -- 남은시간
+			FROM TB_ORDER O INNER JOIN TB_ORDER_DETAIL OD ON O.ORD_NO = OD.ORD_NO 
+			                INNER JOIN TB_ORDER_DETAIL_ITEM ODI ON OD.ORD_DTL_NO = ODI.ORD_DTL_NO 
+			                  					 AND OD.ORD_DTL_NO = ODI.ORD_DTL_NO
+			                INNER JOIN TB_GOODS G ON G.GOODS_CD = OD.GOODS_CD 
+			                INNER JOIN TB_BRAND B ON B.BRAND_CD = G.BRAND_CD
+			                INNER JOIN TB_REVIEW R ON R.ORD_NO = O.ORD_NO 
+			                              		AND R.ORD_NO = O.ORD_NO
+			                              		AND R.ORD_DTL_NO = OD.ORD_DTL_NO 
+			                              		AND R.DEL_YN = 'N'
+			                              		AND R.DISP_YN = 'Y'
+			                LEFT JOIN TB_ITEMKIND I ON G.ITEMKIND_CD = I.ITEMKIND_CD 
+			WHERE 1=1
+				AND O.CUST_NO = 100011
+				AND O.DISP_YN = 'Y'
+				AND O.SITE_CD = #{siteCd}
+			GROUP BY O.ORD_NO 
+			      ,O.ORD_NM 
+			      ,O.PAY_DT 
+			      ,O.CUST_NO 
+			      ,OD.ORD_DTL_NO
+			      ,OD.ORD_EXCH_GB 
+			      ,OD.GOODS_CD 
+			      ,OD.REAL_ORD_AMT 
+			      ,OD.SAVE_PNT_AMT 
+			      ,OD.GFCD_USE_AMT 
+			      ,ODI.ORD_DTL_ITEM_SQ 
+			      ,ODI.ITEM_CD 
+			      ,ODI.OPT_CD 
+			      ,ODI.OPT_CD1
+			      ,ODI.OPT_CD2
+			      ,ODI.ITEM_QTY 
+			      ,ODI.ITEM_PRICE
+			      ,G.GOODS_NM 
+			      ,G.MAIN_COLOR_CD
+			      ,B.BRAND_ENM 
+		)F
+		ORDER BY F.PAY_DT DESC
+	</select>
+	
+	<select id="getReviewAttach" parameterType="Review" resultType="Review">
+		/* TsfReivew.getReviewAttach */
+		SELECT R.REVIEW_SQ
+			 , R.GOODS_CD
+			 , R.REVIEW_GB
+			 , R.CUST_NO
+			 , R.ORD_NO
+			 , R.ORD_DTL_NO
+			 , R.REVIEW_TITLE
+			 , R.REVIEW_CONTENT
+			 , R.SCORE
+			 , R.HEIGHT
+			 , R.WEIGHT
+			 , R.SCORE_SIZE
+			 , R.SCORE_COLOR
+			 , R.SCORE_FIT
+			 , R.SCORE_THICK
+			 , R.SCORE_WEIGHT
+			 , R.SCORE_BALL
+			 , R.GIVE_DUE_PNT
+			 , R.PNT_GIVE_STAT
+			 , R.BEST_YN
+			 , R.GIVE_DUE_BPNT
+			 , R.BPNT_GIVE_YN
+			 , R.DISP_YN
+			 , R.DEL_YN
+			 , R.CONFIRM_YN
+			 , R.CONFIRM_UNO
+			 , R.CONFIRM_DT
+			 , R.REG_NO
+			 , R.REG_DT
+			 , R.UPD_NO
+			 , R.UPD_DT
+			 , R.ADM_RPL
+			 , R.ADM_RPL_REG_NO
+			 , R.ADM_RPL_DT
+			 , RA.RV_ATC_SQ
+			 , RA.REVIEW_SQ
+			 , RA.FILE_GB
+			 , RA.ORG_FILE_NM
+			 , RA.SYS_FILE_NM
+			 , RA.DEL_YN
+		FROM TB_REVIEW R LEFT JOIN TB_REVIEW_ATTACH RA ON R.REVIEW_SQ = RA.REVIEW_SQ 
+		WHERE 1=1
+		 AND R.REVIEW_SQ = RA.REVIEW_SQ 
+		 AND R.CUST_NO = 100011
+		 AND R.DEL_YN = 'N'
+		 AND R.DISP_YN = 'Y'
+		 AND RA.DEL_YN = 'N'
+	</select>
+	
+	<select id="getAdminConfirmCount" parameterType="Review" resultType="Review">
+		/* TsfReivew.getAlreadyReviewCount */
+		SELECT COUNT(*) AS COUNT
+		     , R.REVIEW_SQ 
+		FROM TB_REVIEW R
+		WHERE 1=1
+		 AND CUST_NO = 100011
+		 AND DEL_YN = 'N'
+		 AND DISP_YN = 'Y' 
+		 AND ADM_RPL IS NOT NULL
+		ORDER BY  R.ADM_RPL_DT DESC, R.REVIEW_SQ LIMIT 1
+	</select>
 </mapper>

+ 11 - 0
src/main/resources/config/application.yml

@@ -97,6 +97,17 @@ kakao:
     paymentOrderUrl : https://kapi.kakao.com/v1/payment/order
     cancelPaymentUrl : https://kapi.kakao.com/v1/payment/cancel
 
+#YES24 API
+yes24 :
+    id : 101582
+    type : ISTYLE
+    login.requestUrl: https://www.yes24.com/Templates/FTLoginPartner.aspx
+    login.callbackUrl: /signin/yes24LoginCallback
+    userInfoUrl : https://wsyes24.yes24.com/Yes_Mem.asmx/Yes_Mem_Search_By_CI
+    linkUrl : https://wsyes24.yes24.com/Yes_Mem.asmx/Yes_Partner_Insert
+    unlinkUrl : https://wsyes24.yes24.com/Yes_Mem.asmx/Yes_Partner_Remove
+
+
 # SPEEDY Image Upload
 speedy:
     ftp:

+ 4 - 0
src/main/webapp/WEB-INF/views/web/SigninFormWeb.html

@@ -276,6 +276,10 @@
 			cfnGoToPage(_PAGE_CUSTOMER_JOIN_COMPLETE);
 		}
 
+		if (userInfo.custStat === 'NEED_AGREE_CUST'){
+			cfnConsentUseInfo(userInfo.custNm);
+		}
+
 
 		if (userInfo.custStat === 'SUCC_CUST') {
 			let params = {};

+ 0 - 45
src/main/webapp/WEB-INF/views/web/Yes24CallBackFormWeb.html

@@ -1,45 +0,0 @@
-<!DOCTYPE html>
-<html lang="ko"
-	xmlns:th="http://www.thymeleaf.org">
-<!--
- *******************************************************************************
- * @source  : Yes24CallBackFormWeb.html
- * @desc    : Yes24 동의화면 Page
- *============================================================================
- * STYLE24
- * Copyright(C) 2020 TSIT, All rights reserved.
- *============================================================================
- * VER  DATE         AUTHOR      DESCRIPTION
- * ===  ===========  ==========  =============================================
- * 1.0  2021.02.15   gagamel     최초 작성
- *******************************************************************************
- -->
-<head th:replace="~{web/common/fragments/HeadWeb :: head}"></head>
-<th:block th:replace="~{web/common/fragments/VariablesWeb :: variables}"></th:block>
-<th:block th:replace="~{web/common/fragments/ScriptsWeb :: scripts}"></th:block>
-<body>
-
-
-<script th:inline="javascript">
-/*<![CDATA[*/
-
-	// const resultMap = [[${resultMap}]];
-	// if (gagajf.isNull(resultMap.snsId) && gagajf.isNull(resultMap.snsType)){
-	// 	mcxDialog.alertC("인증에 실패하였습니다.<br> 로그인 정보를 확인해주시기 바랍니다.", {
-	// 		sureBtnText: "확인",
-	// 		sureBtnClick: function() {
-	// 			self.close();
-	// 		}
-	// 	});
-	// } else {
-	// 	opener.fnSnsSigninCallback(resultMap);
-	// 	self.close();
-	// }
-
-
-/*]]>*/
-</script>
-
-
-</body>
-</html>

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

@@ -187,12 +187,12 @@
 			let tag = '';
 			if (cate1 != null) {
 				tag += '<li class="has_depth">\n'; //depth_menu 있을 시 has_depth 클래스 추가
-				tag += '	<a href="javascript:void(0);" onclick="cfnGoToCategoryMain(\'' + cate1.cate1Gb + '\',' + cate1.cate1No + ');">' + cate1.cate1Nm + '</a>\n';
+				tag += '	<a href="javascript:void(0);" onclick="cfnGoToCategoryMain(\'' + cate1.cateGb + '\',' + cate1.cate1No + ');">' + cate1.cate1Nm + '</a>\n';
 				tag += '	<div class="depth_menu category">\n';
 				tag += '		<div class="head_category">\n';
 				tag += '			<div class="tit">\n';
 				tag += '				<p>' + cate1.cate1Nm + '</p>\n';
-				tag += '				<a href="javascript:void(0);" onclick="cfnGoToItemkindMain(\'' + cate1.cate1Gb + '\',' + cate1.cate1No + ');" class="more">전체보기</a>\n';
+				tag += '				<a href="javascript:void(0);" onclick="cfnGoToItemkindMain(\'' + cate1.cateGb + '\',' + cate1.cate1No + ');" class="more">전체보기</a>\n';
 				tag += '			</div>\n';
 				if (cate1.leafYn == 'N' && cate1.cate2List.length > 0) {
 					tag += '			<div class="menu">\n';

+ 15 - 13
src/main/webapp/WEB-INF/views/web/customer/CertificationFormWeb.html

@@ -5,15 +5,15 @@
 	layout:decorator="web/common/layout/DefaultLayoutWeb">
 <!--
  *******************************************************************************
- * @source  : DormantCertifyFormWeb.html
- * @desc    : 휴면회원 본인인증 Page
+ * @source  : CertificationFormWeb.html
+ * @desc    : 본인인증 확인 Page
  *============================================================================
  * STYLE24
  * Copyright(C) 2021 TSIT, All rights reserved.
  *============================================================================
  * VER  DATE         AUTHOR      DESCRIPTION
  * ===  ===========  ==========  =============================================
- * 1.0  2021.02.05   jsshin     최초 작성
+ * 1.0  2021.03.11   jsshin     최초 작성
  *******************************************************************************
  -->
 <body>
@@ -21,21 +21,23 @@
 <th:block layout:fragment="content">
 <div id="container" class="container mb">
 	<div class="wrap">
-		<div class="content dormant"> <!-- 페이지특정 클래스 = dormant -->
+		<div class="content authentic"> <!-- 페이지특정 클래스 = dormant -->
 			<div class="cont_head">
-				<h4>본인인증</h4>
+				<h4>본인 인증 확인</h4>
 			</div>
 			<div class="cont_body">
 				<form class="form_wrap form_col_c form_full" role="form">
-					<div class="form_info">
-						<span class="ico_content_dormant"></span>
-						<p class="c_primary">본인인증이 필요한 고객이므로 본인인증 해주시기 바랍니다.</p>
-					</div>
-					<div class="btn_group_block">
-						<div class="ui_row">
+					<div class="find_result clear">
+						<div class="form_info">
+							<p>
+								본인 인증 후에 STYLE24의<br>
+								다양한 서비스를 이용하실 수 있습니다.
+							</p>
+						</div>
+						<div class="btn_group_block btn_group_md ui_row">
 							<div class="ui_col_12">
-								<button type="button" class="btn btn_default btn_block" onclick="cfnOpenCellphoneCertify();">
-									<span><i class="ico ico_phone"></i>휴대폰인증</span>
+								<button class="btn btn_primary btn_block" onclick="cfnOpenCellphoneCertify();">
+									<span>휴대폰 본인인증</span>
 								</button>
 							</div>
 						</div>

+ 126 - 0
src/main/webapp/WEB-INF/views/web/customer/ConsentUseInfoFormWeb.html

@@ -0,0 +1,126 @@
+<!DOCTYPE html>
+<html lang="ko"
+	  xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : ConsentUseInfoFormWeb.html
+ * @desc    : 정보이용동의팝업
+ *            Yes24 간편가입에 사용됨
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2021 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.03.25   jsshin       최초 작성
+ *******************************************************************************
+ -->
+<div class="modal-dialog" role="document">
+	<div class="modal-content">
+		<div class="modal-header">
+			<h5 class="modal-title" id="mbAgreeLabel">STYLE24 로그인 정보 이용동의</h5>
+		</div>
+		<div class="modal-body">
+			<div class="pop_cont">
+				<div class="agree_info">
+					<p>계정 연동 시, STYLE24 휴면계정은 휴면해제 후 이용 가능합니다.</p>
+					<div class="info_txt">
+						<ul>
+							<li>“<span class="mb_name">회원명</span>” 님의 <em>CI, 이름, 성별, 생년월일, 핸드폰번호, 이메일 정보</em>를 로그인 연동을 위해 아이스타일24에 제공합니다.</li>
+							<li>정보제공 동의 시 YES24 계정으로 로그인 가능하며, 간편하게 회원가입이 가능합니다.</li>
+						</ul>
+					</div>
+				</div>
+			</div>
+		</div>
+		<div class="modal-footer">
+			<div class="btn_group_block ui_row">
+				<div class="ui_col_6">
+					<button type="button" id="btnAgree" class="btn btn_primary btn_block">
+						<span>동의하기</span>
+					</button>
+				</div>
+				<div class="ui_col_6">
+					<button type="button" id="btnClose" class="btn btn_dark btn_block" >
+						<span>닫기</span>
+					</button>
+				</div>
+			</div>
+		</div>
+	</div>
+</div>
+<script th:inline="javascript">
+	/*<![CDATA[*/
+	$('#btnAgree').on('click', function () {
+		let jsonData = JSON.stringify({});
+		gagajf.ajaxJsonSubmit('/customer/peristalsis/yes24', jsonData, fnPeristalsisCallback)
+	});
+
+	var fnPeristalsisCallback = function (userInfo) {
+		if (userInfo.custStat === 'DUP_PHONE_CUST') {
+			mcxDialog.alert("이미 사용 중인 휴대전화번호 입니다.");
+			return;
+		}
+		if (userInfo.custStat === 'DUP_EMAIL_CUST') {
+			mcxDialog.alert("이미 사용 중인 이메일 입니다.");
+			return;
+		}
+		if (userInfo.custStat === 'EMPTY_PHONE_CUST') {
+			cfnGoToPage(_PAGE_CUSTOMER_SNS_JOIN);
+			$.modal.close();
+		}
+		// Ci이 조회 시 있음
+		if (userInfo.custStat === 'SECEDE_CUST') {
+			mcxDialog.alert("탈퇴 회원 입니다.");
+			return;
+		}
+		if (userInfo.custStat === 'DORMANT_CUST') {
+			cfnGoToPage(_PAGE_CUSTOMER_DORMANT);
+			$.modal.close();
+		}
+		if (userInfo.custStat === 'FAIL_CUST') {
+			mcxDialog.alert("회원가입에 실패 했습니다.<br> 고객센터에 문의 하시기 바랍니다.");
+			return;
+		}
+		if (userInfo.custStat === 'NEW_CUST') {
+			cfnGoToPage(_PAGE_CUSTOMER_JOIN_COMPLETE);
+			$.modal.close();
+		}
+
+		if (userInfo.custStat === 'SUCC_CUST') {
+			cfnGoToPage(_PAGE_MAIN);
+			$.modal.close();
+		}
+		if (userInfo.custStat === 'SUCC_CUST') {
+			let params = {};
+			params.snsType = userInfo.snsType;
+			params.snsId = [[${snsLoginPrefix}]] + userInfo.snsId;
+			$.post(_frontUrl + '/login'
+				, $.param(params)
+				, function(result) {
+					fnReloadAfterLogin(result);
+				}
+				, "json");
+		}
+	}
+	var fnReloadAfterLogin = function(result) {
+		if (result.status === 'OK') {
+			document.location.href = result.returnUrl;
+		} else if (result.status === 'EMAIL_DUP') {
+
+		} else if(result.status === 'DORMANT_CUST') {
+			cfnGoToPage(_PAGE_CUSTOMER_DORMANT);
+		} else if(result.status === 'SECEDE_CUST') {
+
+		}
+		$.modal.close();
+	};
+
+	$("#btnClose").click(function() {
+		cfnGoToPage(_PAGE_CUSTOMER_JOIN);
+		$.modal.close();
+	});
+
+	/*]]>*/
+</script>
+</html>

+ 8 - 7
src/main/webapp/WEB-INF/views/web/customer/IdFindFormWeb.html

@@ -41,7 +41,7 @@
 						<div class="registration_tap">
 							<div class="form_group" style="display: block;">
 								<!-- 아이디찾기일경우 -->
-								<div class="form_field">
+								<div id="searchDiv" class="form_field">
 									<div>
 										<input type="radio" name="rdi-mbCertify1" id="rdi-mbCertify11" checked="checked"/>
 										<label for="rdi-mbCertify11"><span>회원정보인증</span></label>
@@ -254,6 +254,8 @@
 		// 찾기결과
 		var fnInfoConfirmCallBack = function (result) {
 			$('#searchDiv').hide();
+			$('.regist_box').hide();
+			$('.form_field').hide();
 			if (result.isFind) {
 				fnGetDisplaySucc(result.authMethod, result);
 			} else {
@@ -265,9 +267,6 @@
 		var fnGetDisplaySucc = function (authMethod, custInfo) {
 			$('#resultId').text(custInfo.maskingCustId);
 			$('#joinDt').text(fnToDateFormat(custInfo.joinDt));
-			$('.registration_nav').hide();
-			$('.regist_box').hide();
-			$('.form_field').hide();
 			let joinPath = fnSnsJoinPath(custInfo); // 가입경로 : 직접이면 표시 안함, 간편가입 연동 표시
 			if (!gagajf.isNull(joinPath)) {
 				$('#liJoinPath').show();
@@ -278,8 +277,6 @@
 
 		// 찾기실패
 		var fnGetDisplayFail = function (authMethod) {
-			$('.form_head').hide();
-			$('.registration_nav').hide();
 			if (authMethod === 'custInfo') {
 				$('#failCustId').show();
 			}
@@ -306,7 +303,11 @@
 				}
 				snsType += 'KAKAO';
 			}
-			snsType += ' 연동';
+			if (!gagajf.isNull(snsType)) {
+				snsType += '연동';
+			} else {
+				snsType += 'STYLE24';
+			}
 			return snsType;
 		};
 

+ 35 - 59
src/main/webapp/WEB-INF/views/web/customer/JoinFormWeb.html

@@ -36,7 +36,7 @@
 						<label class="input_label sr-only">아이디</label>
 						<div class="input_wrap form_full">
 							<input type="text" id="custId" name="custId" placeholder="아이디(4~12자)" class="form_control" required="required" data-valid-type="alphaNumeric" data-valid-name="아이디" minlength="4" maxlength="12"/>
-							<span class="usable" style="display:block;"></span><!-- display:block / display:none 으로 control -->
+							<span class="usable" style="display:block;"></span>
 						</div>
 						<div id="dupCustIdDiv" class="help_block hide">
 							<p class="t_err">이미 가입된 아이디입니다.다른 아이디를 입력하여 주세요.</p>
@@ -125,32 +125,36 @@
 					</div>
 					<div class="form_field">
 						<label class="input_label sr-only">휴대폰번호</label>
-						<div class="input_wrap form_full">
-							<input type="text" id="cellPhnno" name="cellPhnno" placeholder="휴대폰 인증 해주세요." class="form_control" minlength="10" maxlength="11" required="required" data-valid-type="numeric" data-valid-name="휴대폰" readonly="readonly"/>
-							<!-- case (휴대폰번호 형식이 맞지 않을경우,이미 가입되어있는 핸드폰번호일경우) -->
-							<div class="help_block">
-								<!-- 휴대폰번호 형식이 맞지 않을경우 -->
-								<p id="failPhnno" class="t_err hide">휴대폰번호를 형식에 맞게 정확히 입력해주세요</p>
-								<!-- //휴대폰번호 형식이 맞지 않을경우 -->
-								<!-- 이미 가입되어있는 핸드폰번호일경우 -->
-								<p id="dupPhnno" class="t_err hide">I***D로 가입한 이력이 있습니다.</p>
-								<div id="dupPhnnoDiv" class="mt20 hide">
-									<button type="button" class="btn btn_default btn_sm" onclick="cfnGoToPage(_PAGE_LOGIN);">
-										<span>로그인</span>
-									</button>
-									<button type="button" class="btn btn_default btn_sm" onclick="cfnGoToPage(_PAGE_CUSTOMER_ID_FIND);">
-										<span>아이디 찾기</span>
-									</button>
+						<div class="ui_row">
+							<div class="ui_col_9">
+								<div class="input_wrap">
+									<input type="text" id="cellPhnno" name="cellPhnno" placeholder="휴대폰 인증 해주세요." class="form_control" minlength="10" maxlength="11" required="required" data-valid-type="numeric" data-valid-name="휴대폰" readonly="readonly"/>
 								</div>
-								<div class="mt20">
-									<button type="button" id="btnCellPhoneCertify" class="btn btn_default btn_sm">
-										<span>휴대폰 인증</span>
-									</button>
-								</div>
-								<!-- //이미 가입되어있는 핸드폰번호일경우 -->
 							</div>
-							<!-- //case (휴대폰번호 형식이 맞지 않을경우,이미 가입되어있는 핸드폰번호일경우) -->
+							<div class="ui_col_3">
+								<button type="button" id="btnCellPhoneCertify" class="btn btn_dark btn_block">
+									<span>본인인증</span>
+								</button>
+							</div>
 						</div>
+						<!-- case (휴대폰번호 형식이 맞지 않을경우,이미 가입되어있는 핸드폰번호일경우) -->
+						<div class="help_block">
+							<!-- 휴대폰번호 형식이 맞지 않을경우 -->
+							<p id="failPhnno" class="t_err hide">휴대폰번호를 형식에 맞게 정확히 입력해주세요</p>
+							<!-- //휴대폰번호 형식이 맞지 않을경우 -->
+							<!-- 이미 가입되어있는 핸드폰번호일경우 -->
+							<p id="dupPhnno" class="t_err hide">I***D로 가입한 이력이 있습니다.</p>
+							<div id="dupPhnnoDiv" class="mt20 hide">
+								<button type="button" class="btn btn_default btn_sm" onclick="cfnGoToPage(_PAGE_LOGIN);">
+									<span>로그인</span>
+								</button>
+								<button type="button" class="btn btn_default btn_sm" onclick="cfnGoToPage(_PAGE_CUSTOMER_ID_FIND);">
+									<span>아이디 찾기</span>
+								</button>
+							</div>
+							<!-- //이미 가입되어있는 핸드폰번호일경우 -->
+						</div>
+						<!-- //case (휴대폰번호 형식이 맞지 않을경우,이미 가입되어있는 핸드폰번호일경우) -->
 					</div>
 					<div class="mt40">
 						<button type="button" id="btnJoin" class="btn btn_primary btn_block" disabled="disabled">
@@ -195,7 +199,7 @@
 	var fnIdConfirmCallBack = function (result) {
 		const $dupCustIdDiv = $('#dupCustIdDiv');
 		const $custId = $('#custId');
-		const $usable = $('.usable');
+		const $usable = $('span > .usable');
 
 		if (result.isFind) { // 중복된 아이디가 존재
 			$custId.addClass('err');
@@ -348,30 +352,6 @@
 		fnPossibleJoin();
 	};
 
-	//	휴대폰 확인
-	$('#cellPhnno').on('blur', function () {
-		const $failPhnno = $('#failPhnno');
-		let cellPhnno = $(this).val();
-		let validation;
-
-		if (!gagajf.isNull(cellPhnno)) {
-			if (cellPhnno.length > 9) {
-				$failPhnno.hide();
-				validation = true;
-			} else {
-				$failPhnno.show();
-				validation = false;
-			}
-			if (validation) {
-				let custInfo = {};
-				custInfo.cellPhnno = cellPhnno;
-				let jsonData = JSON.stringify(custInfo);
-				gagajf.ajaxJsonSubmit('/customer/cellphnno/check', jsonData, fnPhoneConfirmCallBack);
-			}
-		}
-	});
-
-
 	//휴대폰 인증
 	$('#btnCellPhoneCertify').on('click', function () {
 		cfnOpenCellphoneCertify();
@@ -396,27 +376,23 @@
 		$cellPhnno.val(result.cellPhnno);
 
 		if (result.isFind) { // 가입된 고객 정보가 있으면
-			let msg = result.maskingCustId+"로 가입된 이력이 있습니다.";
+			let msg = '';
 			if (result.custStat === 'G104_30') {
-				msg += "<br/> 탈퇴한 회원입니다. 탈퇴 후 60일 동안 재가입이 불가능합니다.";
-			}
-			if (result.custStat === 'G104_20') {
-				msg += "<br/> 휴면회원입니다. 해당 아이디로 휴면해제하시면 되겠습니다.";
+				msg = "탈퇴한 회원입니다. 탈퇴 후 60일 동안 재가입이 불가능합니다.";
+			} else {
+				msg = result.maskingCustId+"로 가입된 이력이 있습니다.";
 			}
 			$dupPhnno.html(msg);
 			$dupPhnno.show();
 			$dupPhnnoDiv.show();
-			$btnCellPhoneCertify.hide();
-			$btnCellPhoneCertify.text('휴대폰 인증');
-			$btnCellPhoneCertify.attr('disabled', false);
 			authCheck = false;
 		} else {
 			$dupPhnno.hide();
 			$dupPhnnoDiv.hide();
-			$btnCellPhoneCertify.text('인증완료');
-			$btnCellPhoneCertify.attr('disabled', true);
 			authCheck = true;
 		}
+		$btnCellPhoneCertify.find('span').text('인증완료');
+		$btnCellPhoneCertify.attr('disabled', true);
 		fnPossibleJoin();
 	};
 

+ 6 - 0
src/main/webapp/WEB-INF/views/web/customer/JoinTypeFormWeb.html

@@ -52,6 +52,7 @@
 							</li>
 							<li>
 								<a href="javascript:void(0)" onclick="cfnLoginYes24();">
+<!--									<a href="javascript:void(0)" onclick="cfnConsentUseInfo('신주승')">-->
 									<i class="ico ico_snslogin yes24"></i>
 									<span>YES24</span>
 								</a>
@@ -126,6 +127,11 @@
 		}
 	};
 
+	$('#btnClose').on('click', function () {
+		$('#layer_consent_useinfo').modal('hide');
+		//cfCloseLayer('layer_consent_useinfo');
+	});
+
 	$(document).ready(function() {
 
 	});

+ 8 - 10
src/main/webapp/WEB-INF/views/web/customer/PasswordCampaignFormWeb.html

@@ -28,16 +28,14 @@
 			<div class="cont_body">
 				<form class="form_wrap form_col_c" role="form">
 					<div class="form_info">
-						<span class="ico_content_security"></span>
-						<p class="">고객님! <span class="c_primary">비밀번호 변경</span>으로 <br>소중한 개인정보를 지켜주세요!</p>
-						<p class="c_primary mt5">고객님은 3개월동안 비밀번호를 변경하지 않으셨습니다!</p>
+						<p class="">고객님! <span class="c_primary">비밀번호 변경</span>으로 소중한 개인정보를 지켜주세요!</p>
+						<p class="t_info mt10">고객님은 3개월동안 비밀번호를 변경하지 않으셨습니다!</p>
 					</div>
-					<div class="form_summary t_c">
-						<p class="t_info mt10">장기간 비밀번호를 변경하지 않고 동일한 비밀번호를 사용중인 경우,
-							<br> 개인정보를 안전하게 보호하고, 개인정보 도용으로 인한 피해를 방지하기 위해
-							<br>주기적으로 비밀번호를 변경하도록 안내해드리고 있습니다.
-						</p>
-						<p class="t_info mt10">고객님의 소중한 정보 보호를 위해 적극적인 참여 부탁 드립니다.</p>
+					<div class="info_txt">
+						<ul>
+							<li>장기간 비밀번호를 변경하지 않고 동일한 비밀번호를 사용중인 경우, <br> 개인정보를 안전하게 보호하고, 개인정보 도용으로 인한 피해를 방지하기 위해 <br>주기적으로 비밀번호를 변경하도록 안내해드리고 있습니다.</li>
+							<li>고객님의 소중한 정보 보호를 위해 적극적인 참여 부탁 드립니다.</li>
+						</ul>
 					</div>
 					<div class="btn_group_block btn_group_md ui_row">
 						<div class="ui_col_6">
@@ -46,7 +44,7 @@
 							</button>
 						</div>
 						<div class="ui_col_6">
-							<button type="button" class="btn btn_dark btn_block" id="btnPwdNext">
+							<button type="button" class="btn btn_default btn_block" id="btnPwdNext">
 								<span>30일간 보지않기</span>
 							</button>
 						</div>

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

@@ -90,7 +90,7 @@
 									<!-- 휴대폰인증 -->
 									<div class="regist_box">
 										<div class="txt">
-											<p>회원님의 명의로 등록된 휴대폰으로<br>본인확인을 진행합니다.</p>
+											<p>회원님의 명의로 등록된 휴대폰으로 본인확인을 진행합니다.</p>
 										</div>
 										<div class="ui_row mt20">
 											<div class="ui_col_12">

+ 159 - 0
src/main/webapp/WEB-INF/views/web/display/BrandMainFormWeb.html

@@ -81,6 +81,42 @@
 					</th:block>
 				</th:block>
 
+				<!-- new_item -->
+				<th:block th:if="${contentsLoc=='007'}">
+					<div class="content wide new_item">
+						<div class="cont_head">
+							<p class="displayH t_c" th:text="${contentsTitle}"></p>
+						</div>
+						<div class="cont_body" th:if="${brandMainLayoutData.goodsList != null}">
+							<div class="swiper-container post-trendy">
+								<div class="swiper-wrapper">
+									<th:block th:each="goodsData, goodsStat : ${brandMainLayoutData.goodsList}">
+										<div class="swiper-slide">
+											<div class="item_prod">
+												<div class="item_state">
+													<a href="javascript:void(0);" class="itemLink" th:onclick="cfnGoToGoodsDetail([[${goodsData.goodsCd}]], '', '', 'SBM007');">
+														<div class=" itemPic">
+															<img alt="BLUE-a" class=" vLHTC pd_img" th:src="${@environment.getProperty('upload.goods.view') + '/' + goodsData.sysImgNm}">
+															<button type="button" class="itemLike" th:classappend="${goodsData.likeIt}">관심상품 추가</button>
+														</div>
+														<p class="itemBrand" th:text="${goodsData.brandGroupNm}"></p>
+														<div class=" itemName" th:text="${goodsData.goodsFullNm}"></div>
+														<p class="itemPrice" th:text="${#numbers.formatInteger(goodsData.currPrice,1,'COMMA')+'원'}"></p>
+														<div class="itemComment">#가을느낌 물씬!</div>
+													</a>
+												</div>
+											</div>
+										</div>
+									</th:block>
+								</div>
+							</div>
+							<div class="swiper-pagination"></div>
+							<div class="swiper-button-prev"></div>
+							<div class="swiper-button-next"></div>
+						</div>
+					</div>
+				</th:block>
+
 				<!-- 가로 긴 배너 슬라이드 -->
 				<!-- 브랜드 배너 -->
 				<th:block th:if="${contentsLoc=='006'}">
@@ -113,6 +149,46 @@
 					</div>
 				</th:block>
 
+				<!-- best_item -->
+				<th:block th:if="${contentsLoc=='008'}">
+					<div class="content best_item">
+						<div class="cont_head">
+							<p class="displayH t_c" th:text="${contentsTitle}"></p>
+						</div>
+						<div class="cont_body" th:if="${brandMainLayoutData.goodsList != null}">
+							<div class="swiper-container">
+								<div class="swiper-wrapper">
+									<th:block th:each="goodsData, goodsStat : ${brandMainLayoutData.goodsList}">
+										<div class="swiper-slide">
+											<div class="item_prod sUiXc">
+												<div class="item_state">
+													<a href="javascript:void(0);" class="itemLink" th:onclick="cfnGoToGoodsDetail([[${goodsData.goodsCd}]], '', '', 'SBM008');">
+														<div class="shape ranker"><span th:text="${goodsStat.index+1}"></span></div>
+														<div class="itemPic">
+															<img alt="BLACK-a" class="vLHTC pd_img" th:src="${@environment.getProperty('upload.goods.view') + '/' + goodsData.sysImgNm}">
+															<button type="button" class="itemLike" th:classappend="${goodsData.likeIt}">관심상품 추가</button>
+														</div>
+														<p class="itemBrand" th:text="${goodsData.brandGroupNm}"></p>
+														<div class="itemName" th:text="${goodsData.goodsFullNm}"></div>
+														<p class="itemPrice" th:text="${#numbers.formatInteger(goodsData.currPrice,1,'COMMA')}">
+															<span class="itemPrice_original" th:text="${#numbers.formatInteger(goodsData.listPrice,1,'COMMA')}"></span>
+															<span class="itemPercent" th:if="${goodsData.currPrice != goodsData.listPrice}" th:text="${(goodsData.listPrice == 0 ? 0 : #numbers.formatDecimal((goodsData.listPrice - goodsData.currPrice) / (goodsData.listPrice * 1.0) * 100, 1, 0)) + '%'}">10%</span>
+														</p>
+														<div class="itemComment">#가을느낌 물씬!!</div>
+													</a>
+												</div>
+											</div>
+										</div>
+									</th:block>
+								</div>
+							</div>
+							<div class="swiper-pagination"></div>
+							<div class="swiper-button-prev"></div>
+							<div class="swiper-button-next"></div>
+						</div>
+					</div>
+				</th:block>
+
 				<!-- LOOKBOOK -->
 				<th:block th:if="${contentsLoc=='010'}">
 					<div class="content br_lookbook" th:if="${brandMainLayoutData.lookbookList != null and !brandMainLayoutData.lookbookList.empty}">
@@ -147,7 +223,90 @@
 								<div class="swiper-button-next"></div>
 							</div>
 							<div class="swiper-pagination"></div>
+						</div>
+					</div>
+				</th:block>
 
+				<!-- MD’s PICK -->
+				<th:block th:if="${contentsLoc=='009'}">
+					<div class="content md_item">
+						<div class="cont_head">
+							<p class="displayH t_c" th:text="${contentsTitle}"></p>
+						</div>
+						<div class="cont_body" th:if="${brandMainLayoutData.goodsList != null}">
+							<div class="swiper-container">
+								<div class="swiper-wrapper">
+									<th:block th:each="goodsData, goodsStat : ${brandMainLayoutData.goodsList}">
+									<div class="swiper-slide">
+										<div class="item_prod sUiXc">
+											<div class="item_state">
+												<a href="javascript:void(0);" class="itemLink" th:onclick="cfnGoToGoodsDetail([[${goodsData.goodsCd}]], '', '', 'SBM009');">
+													<div class="itemPic">
+														<img alt="BLACK-a" class=" vLHTC pd_img" th:src="${@environment.getProperty('upload.goods.view') + '/' + goodsData.sysImgNm}">
+														<button type="button" class="itemLike" th:classappend="${goodsData.likeIt}">관심상품 추가</button>
+													</div>
+													<p class=" itemBrand" th:text="${goodsData.brandGroupNm}">BRAND NAME</p>
+													<div class=" itemName" th:text="${goodsData.goodsFullNm}">남성 로고 자카드 방풍 패딩 스웨터 가디건 자카드 방풍 패딩 스웨터 가디건 자카드 방풍 패딩 스웨터 가디건</div>
+													<p class="itemPrice" th:text="${#numbers.formatInteger(goodsData.currPrice,1,'COMMA')}">80,100
+														<span class="itemPrice_original" th:text="${#numbers.formatInteger(goodsData.listPrice,1,'COMMA')}">89,000</span>
+														<span class=" itemPercent" th:if="${goodsData.currPrice != goodsData.listPrice}" th:text="${(goodsData.listPrice == 0 ? 0 : #numbers.formatDecimal((goodsData.listPrice - goodsData.currPrice) / (goodsData.listPrice * 1.0) * 100, 1, 0)) + '%'}">10%</span>
+													</p>
+													<div class="itemComment" th:text="${goodsData.goodsTnm}">#베이직 셔츠의 정수1</div>
+												</a>
+											</div>
+										</div>
+									</div>
+									</th:block>
+								</div>
+							</div>
+							<div class="swiper-pagination"></div>
+							<div class="swiper-button-prev"></div>
+							<div class="swiper-button-next"></div>
+						</div>
+					</div>
+				</th:block>
+
+				<!-- brand_product -->
+				<th:block th:if="${contentsLoc=='013'}">
+					<div class="content brand_product">
+						<div class="cont_head">
+							<p class="displayH t_c" th:text="${contentsTitle}"></p>
+						</div>
+						<div class="cont_body" th:if="${brandMainLayoutData.goodsList != null}">
+							<div class="itemsGrp">
+								<th:block th:each="goodsData, goodsStat : ${brandMainLayoutData.goodsList}">
+									<div class="item_prod" th:if="${goodsStat.index<5}">
+										<div class="item_state">
+											<a href="javascript:void(0);" class="itemLink" th:onclick="cfnGoToGoodsDetail([[${goodsData.goodsCd}]], '', '', 'SBM013');">
+												<div class="itemPic">
+													<img alt="BLACK-a" class=" vLHTC pd_img" th:src="${@environment.getProperty('upload.goods.view') + '/' + goodsData.sysImgNm}">
+													<button type="button" class="itemLike" th:classappend="${goodsData.likeIt}">관심상품 추가</button>
+												</div>
+												<p class=" itemBrand" th:text="${goodsData.brandGroupNm}"></p>
+												<div class="itemName" th:text="${goodsData.goodsFullNm}"></div>
+												<p class="itemPrice" th:text="${#numbers.formatInteger(goodsData.currPrice,1,'COMMA')}">80,100
+													<span class="itemPrice_original" th:text="${#numbers.formatInteger(goodsData.listPrice,1,'COMMA')}">89,000</span>
+													<span class=" itemPercent" th:if="${goodsData.currPrice != goodsData.listPrice}" th:text="${(goodsData.listPrice == 0 ? 0 : #numbers.formatDecimal((goodsData.listPrice - goodsData.currPrice) / (goodsData.listPrice * 1.0) * 100, 1, 0)) + '%'}">10%</span>
+												</p>
+												<div class="itemcolorchip">
+													<span class="chip_color35" value="ABM">BEIGE</span>
+													<span class="chip_color54" value="BDS">BLACK</span>
+													<span class="chip_color40" value="YBR">WHITE</span>
+												</div>
+												<p class="itemBadge">
+													<span class="badge13">쿠폰할인</span>
+													<span class="badge13">단독특가</span>
+													<span class="badge13">무료배송</span>
+												</p>
+												<div class="itemComment">#가을느낌 물씬!</div>
+											</a>
+										</div>
+									</div>
+								</th:block>
+							</div>
+							<div class="btn_wrap">
+								<button type="button" class="btn btn_md"><span>더 많은 상품보기</span></button>
+							</div>
 						</div>
 					</div>
 				</th:block>

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

@@ -35,62 +35,18 @@
 					<h3 class="cate1Nm">여성</h3>
 				</div>
 			</div>
-			<div class="cont_body">
+			<div class="cont_body" th:if="${planningList != null}">
 				<div class="dp_sum_slide dp_inner">
 					<div class="swiper-container">
 						<div class="swiper-wrapper">
-							<div class="swiper-slide">
-								<a href="">
-									<div class="img">
-										<img src="/images/pc/thumb/dp_submain_img01.jpg" alt="서브메인 썸네일"/>
-									</div>
-									<div class="txt">
-										<p class="subject">포근한 새해를 위한 필수템<br>겨울신상 세일</p>
-										<span>시간이 지나면서 빛을 더하는 아우터</span>
-									</div>
-								</a>
-							</div>
-							<div class="swiper-slide">
-								<a href="">
-									<div class="img">
-										<img src="/images/pc/thumb/dp_submain_img02.jpg" alt="서브메인 썸네일"/>
-									</div>
-									<div class="txt">
-										<p class="subject">겨울정기 가격제안전</p>
-										<span>전 브랜드 시즌오프 모아보기</span>
-									</div>
-								</a>
-							</div>
-							<div class="swiper-slide">
-								<a href="">
-									<div class="img">
-										<img src="/images/pc/thumb/dp_submain_img03.jpg" alt="서브메인 썸네일"/>
-									</div>
-									<div class="txt">
-										<p class="subject">추위를 물리치는 현명한 방법은?<br>패딩과 니트</p>
-										<span>모두에게  잘 어울리는 겨울 아이템</span>
-									</div>
-								</a>
-							</div>
-							<div class="swiper-slide">
-								<a href="">
-									<div class="img">
-										<img src="/images/pc/thumb/dp_submain_img03.jpg" alt="서브메인 썸네일"/>
-									</div>
-									<div class="txt">
-										<p class="subject">추위를 물리치는 현명한 방법은?<br>패딩과 니트</p>
-										<span>모두에게  잘 어울리는 겨울 아이템</span>
-									</div>
-								</a>
-							</div>
-							<div class="swiper-slide">
-								<a href="">
+							<div class="swiper-slide" th:each="item, status : ${planningList}">
+								<a th:href="${item.strVar1}">
 									<div class="img">
-										<img src="/images/pc/thumb/dp_submain_img03.jpg" alt="서브메인 썸네일"/>
+										<img  th:src="${@environment.getProperty('domain.image') + '/' + item.imgPath1}" alt="서브메인 썸네일"/>
 									</div>
 									<div class="txt">
-										<p class="subject">추위를 물리치는 현명한 방법은?<br>패딩과 니트</p>
-										<span>모두에게  잘 어울리는 겨울 아이템</span>
+										<p class="subject" th:text="${item.strTitle1}"></p>
+										<span th:text="${item.subText1}"></span>
 									</div>
 								</a>
 							</div>

+ 322 - 287
src/main/webapp/WEB-INF/views/web/goods/GoodsDealDetailFormWeb.html

@@ -92,7 +92,7 @@
 							<div class="descript_box">
 								<div class="desc_top">
 									<button type="button" class="itemShare">상품 공유하기</button>
-									<button type="button" class="itemLike">관심상품 추가</button>
+									<button type="button" class="itemLike" th:classappend="${goodsInfo.wishYn == 'Y'}? 'likeit' : ''"  onclick="cfnPutWishList(this);" th:attr="goodsCd=${params.goodsCd}, ithrCd=${params.ithrCd}, contentsLoc=${params.contentsLoc}, planDtlSq=${params.planDtlSq}">관심상품 추가</button>
 								</div>
 								<div class="desc_info">
 									<div class="title_blk">
@@ -147,84 +147,69 @@
 							</div>
 							<div class="option_box">
 								<div class="opt_select">
-									<form class="form_wrap">
-										<div class="form_field">
-											<div class="select_custom deal_opt_item">
-												<div class="combo">
-													<div class="select">
+									<div class="form_field">
+										<div class="select_custom deal_opt_item">
+											<div class="combo">
+												<div class="select">
+													<div class="item_prod">
+														<div class="item_state">
+															<a href="javascript:void(0);" class="itemLink">
+																<div class="itemPic">
+																	<img alt="" class="vLHTC pd_img" th:src="${imgGoodsUrl+'/'+goodsInfo.sysImgNm}" th:onerror="'this.src=\''+@{${uxImgUrl}+ '/images/pc/thumb/bg_item_none.png'}+'\';'">
+																</div>
+																<div class="itemName">선택</div>
+															</a>
+														</div>
+													</div>
+												</div>
+												<ul class="list" th:if="${goodsDealComposeList  != null and !goodsDealComposeList.empty}">
+													<th:block th:each="goodsInfo, status : ${goodsDealComposeList}" th:attr="aria-disabled=${(goodsInfo.goodsStat != 'G008_90' or goodsInfo.stockQty <= 0)? 'true':''}, data-soldout=${(goodsInfo.stockQty <= 0)? 'true':''}">
+													<li th:onclick="fnOption1('Up', [[${goodsInfo.compsGoodsCd}]], [[${goodsInfo.currPrice}]] , [[${goodsInfo.selfGoodsYn}]]);"
+															th:attr="aria-disabled=${(goodsInfo.goodsStat != 'G008_90' or goodsInfo.stockQty <= 0)? 'true':''}, data-soldout=${(goodsInfo.stockQty <= 0)? 'true':''}">
 														<div class="item_prod">
-															<div class="item_state">
-																<a href="javascript:void(0);" class="itemLink">
+															<div class="item_state" >
+																<a href="javascript:void(0);" class="itemLink" >
 																	<div class="itemPic">
 																		<img alt="" class="vLHTC pd_img" th:src="${imgGoodsUrl+'/'+goodsInfo.sysImgNm}" th:onerror="'this.src=\''+@{${uxImgUrl}+ '/images/pc/thumb/bg_item_none.png'}+'\';'">
 																	</div>
-																	<div class="itemName">선택</div>
+																	<p class="itemBrand" th:text="${goodsInfo.brandGroupNm}">NBA 키즈</p>
+																	<div class="itemName" ><span class="tit_option" th:text="${'[상품'+status.count+']'}">[상품1]</span><th:block th:text="${goodsInfo.goodsFullNm}"></th:block></div>
+																	<p class="itemPrice" ><th:block th:text="${#numbers.formatInteger(goodsInfo.currPrice, 0,'COMMA')}"> 134,100</th:block>
+																		<span class="itemPrice_original" th:if="${goodsInfo.listPrice > goodsInfo.currPrice}" th:text="${#numbers.formatInteger(goodsInfo.listPrice, 0,'COMMA')}">149,000</span>
+																		<span class="itemPercent" th:if="${goodsInfo.dcRate > 0}" th:text="|${#numbers.formatDecimal(goodsInfo.dcRate,0,0)}%|">30%</span>
+																	</p>
 																</a>
+																<input type="hidden" name="selectGoods" th:attr="goodsNm=${'[상품'+status.count+']' +goodsInfo.goodsFullNm}, currPrice=${goodsInfo.currPrice}, goodsCd=${goodsInfo.compsGoodsCd}" />
 															</div>
 														</div>
-													</div>
-													<ul class="list" th:if="${goodsDealComposeList  != null and !goodsDealComposeList.empty}">
-														<th:block th:each="goodsInfo, status : ${goodsDealComposeList}" th:attr="aria-disabled=${(goodsInfo.goodsStat != 'G008_90' or goodsInfo.stockQty <= 0)? 'true':''}, data-soldout=${(goodsInfo.stockQty <= 0)? 'true':''}">
-														<li th:onclick="fnOption1('Up', [[${goodsInfo.compsGoodsCd}]]);">
-															<div class="item_prod">
-																<div class="item_state" >
-																	<a href="javascript:void(0);" class="itemLink" >
-																		<div class="itemPic">
-																			<img alt="" class="vLHTC pd_img" th:src="${imgGoodsUrl+'/'+goodsInfo.sysImgNm}" th:onerror="'this.src=\''+@{${uxImgUrl}+ '/images/pc/thumb/bg_item_none.png'}+'\';'">
-																		</div>
-																		<p class="itemBrand" th:text="${goodsInfo.brandGroupNm}">NBA 키즈</p>
-																		<div class="itemName" ><span class="tit_option" th:text="${'[상품'+status.count+']'}">[상품1]</span><th:block th:text="${goodsInfo.goodsFullNm}"></th:block></div>
-																		<p class="itemPrice"><th:block th:text="${#numbers.formatInteger(goodsInfo.currPrice, 0,'COMMA')}"> 134,100</th:block>
-																			<span class="itemPrice_original" th:if="${goodsInfo.listPrice > goodsInfo.currPrice}" th:text="${#numbers.formatInteger(goodsInfo.listPrice, 0,'COMMA')}">149,000</span>
-																			<span class="itemPercent" th:if="${goodsInfo.dcRate > 0}" th:text="|${#numbers.formatDecimal(goodsInfo.dcRate,0,0)}%|">30%</span>
-																		</p>
-																	</a>
-																</div>
-															</div>
-														</li>
-														</th:block> 
-													</ul>
-												</div>
+													</li>
+													</th:block> 
+												</ul>
 											</div>
 										</div>
-										<div class="form_field">
-											<div class="select_custom deal_opt1" disabled>
-												<div class="combo">
-													<div class="select">선택</div>
-													<ul class="list" id="goodsDealOptUp1">
-														<!--  옵션 1 -->
-													</ul>
-												</div>
+									</div>
+									<div class="form_field">
+										<div class="select_custom deal_opt1" disabled>
+											<div class="combo">
+												<div class="select">선택</div>
+												<ul class="list" id="goodsDealOptUp1">
+													<!--  옵션 1 -->
+												</ul>
 											</div>
 										</div>
-										<div class="form_field">
-											<div class="select_custom deal_opt2" disabled>
-												<div class="combo">
-													<div class="select">선택</div>
-													<ul class="list" id="goodsDealOptUp2">
-														<!--  옵션 2 -->
-													</ul>
-												</div>
+									</div>
+									<div class="form_field">
+										<div class="select_custom deal_opt2" disabled>
+											<div class="combo">
+												<div class="select">선택</div>
+												<ul class="list" id="goodsDealOptUp2">
+													<!--  옵션 2 -->
+												</ul>
 											</div>
 										</div>
-									</form>
+									</div>
 								</div>
 								<div class="opt_result">
-									<div class="result_item">
-										<div class="opt_header">
-											<span class="item_name">[상품1] 남성 테이퍼드핏 기모면 올밴딩 팬트</span>
-											<span class="item_option">다크그레이/XXL</span>
-										</div>
-										<div class="number_count">
-											<span class="minus"><em class="sr-only">감소</em></span>
-											<input type="text" name="" maxlength="3" style='ime-mode:disabled' value="1" />
-											<span class="plus"><em class="sr-only">추가</em></span>
-										</div>
-										<div class="item_price">
-											<p><em>99,999,999</em>원</p>
-										</div>
-										<button type="button" class="btn_delete_item"><span>삭제</span></button>
-									</div>
 								</div>
 							</div>
 							<div class="price_box">
@@ -239,17 +224,19 @@
 							</div>
 							<div class="btn_box">
 								<div class="btn_group_block ui_row">
+								<th:block  th:if="${goodsInfo.stockQty > 0}">
 									<div class="ui_col_6">
 										<button type="button" class="btn btn_dark btn_block" id="btnGoodsWish" onclick="fnAddCart('C');"><span>쇼핑백</span></button>
 									</div>
 									<div class="ui_col_6">
 										<button type="button" class="btn btn_primary btn_block" id="btnGoodsCart" onclick="fnAddCart('O');"><span>바로구매</span></button>
 									</div>
-								</div>
-								<div class="btn_group_block ui_row">
+								</th:block>
+								<th:block  th:unless="${goodsInfo.stockQty > 0}">
 									<div class="ui_col_12">
-										<button type="button" class="btn btn_dark btn_block" disabled><span>SOLD OUT</span></button>
+										<button type="button" class="btn btn_dark btn_block" disabled=""><span>SOLD OUT</span></button>
 									</div>
+								</th:block>
 								</div>
 							</div>
 						</div>
@@ -293,54 +280,84 @@
 	}
 	
 	// 옵션1 조회
-	var fnOption1 = function(flag, goodsCd){
-		let selfGoodsYn = $("#cartForm  input[name=selfGoodsYn]").val();
+	var fnOption1 = function(flag, goodsCd, currPrice, selfGoodsYn){
 		let data = {goodsCd : goodsCd
 					};
 		let jsonData = JSON.stringify(data);
-	
+		
+		$('.form_field .select_custom.deal_opt1').find('.combo .select').html('선택');
+		$('.form_field .select_custom.deal_opt2').attr('disabled', true);
+		$('.form_field .select_custom.deal_opt2').find('.combo .select').html('선택');
+		
 		gagajf.ajaxJsonSubmit('/goods/detail/option1/list', jsonData, function(result) {
 			
 			if (result.dataList != null && result.dataList.length > 0) {
-				let tag = "";
+				
+				let tagUpS = "";
+				let tagDownS = "";
+				let tagUp = "";
+				let tagDown = "";
 				let $objUp = null;
 				let $objDown = null;
 				let qty = 1;
 				$.each(result.dataList, function(idx, item) {
+					let tag1 = "";
+					let tag2 = "";
 					if (idx == 0){
-						$objUp = $('#goodsDealOptUp1');
-						$objUp.append('');
-						$objDown = $('#goodsDealOptDown1');
-						$objDown.append('');
+						$objUp = $('.pd_detail .opt_select .select_custom.deal_opt1');
+						//$objUp = $('.form_field .select_custom.deal_opt1');
+						$objUp.html('');
+						$objDown = $('.pd_desc_wrap .opt_select .select_custom.deal_opt1');
+						$objDown.html('');
+						$('.form_field .select_custom.deal_opt1').attr('disabled', false);
 						
-						$('.form_field .select_custom.deal_opt1').attr('disabled', false)
-						tag += '<li class="selected" id="goodsOpt1">선택</li>\n';	
+						//------
+						tag1 += '<div class="combo">\n';
+						tag1 += '<div class="select">선택</div>\n';
+						tag1 += '<ul class="list">\n';
+						//------
+						tag1 += '<li class="selected" id="goodsOpt1">선택</li>\n';	
 					}
 					let soldoutYn = ""; 
 					if (item.stockQty <= 0) soldoutYn = "true";
-					tag += '<li aria-disabled="'+soldoutYn+'" data-soldout="'+soldoutYn +'" onclick="fnOption2(\''+flag+'\', \''+ item.goodsCd+'\' , \''+ item.optCd1+'\' , \''+ qty+'\', \''+ item.minOrdQty+'\', \''+ item.maxOrdQty+'\')">\n';
-					tag += '<div>'+ item.optCd1+'</div>\n';
+					tagUp = '<li aria-disabled="'+soldoutYn+'" data-soldout="'+soldoutYn +'" onclick="fnOption2(this, \'Up\')">\n';
+					tagDown = '<li aria-disabled="'+soldoutYn+'" data-soldout="'+soldoutYn +'" onclick="fnOption2(this, \'Down\')">\n';
+					tag2 += '<div>'+ item.optCd1+'</div>\n';
 					if (item.addPrice > 0){
-						tag += '<div>'+ item.addPrice.addComma() +'원</div>\n';	
+						tag2 += '<div>'+ item.addPrice.addComma() +'원</div>\n';	
 					}
-					tag += '<input type="hidden" name="opt1" value="'+ item.goodsCd+'|'+item.optCd1 +'|'+qty +'" addPrice="'+item.addPrice+'"  optCd1="'+item.optCd1+'" />\n';
-					tag += '</li>\n';
+					tag2 += '<input type="hidden" name="opt1" value="'+ goodsCd +'" currPrice="'+ currPrice+'" optCd1="'+item.optCd1+'"  minOrdQty="'+item.minOrdQty+'"  maxOrdQty="'+item.maxOrdQty+'"   selfGoodsYn="'+selfGoodsYn+'" />\n';
+					tag2 += '</li>\n';
+					
+					tagUpS += tag1+tagUp+tag2;
+					tagDownS += tag1+tagDown+tag2;
 				});
 				
-				$objUp.append(tag);
-				$objDown.append(tag);
+				if (!gagajf.isNull(tagUpS)){
+					//------
+					tagUpS += '</ul>\n';
+					tagUpS += '</div>\n';
+					tagDownS += '</ul>\n';
+					tagDownS += '</div>\n';
+					//------	
+				}
+				
+				
+				$objUp.append(tagUpS);
+				$objDown.append(tagDownS);
 				var detail_deal_option02 = new sCombo('.pd_detail .opt_select .select_custom.deal_opt1');
 				var desc_option02 = new sCombo('.pd_desc_wrap .opt_select .select_custom.deal_opt1');
 				//var pop_desc_option02 = new sCombo('.pd_detail .opt_select .select_custom.deal_opt1');
 			}
 			
+			// 상품 선태값 적용
 			let $obj = null;
 			let $taget = null;
 			// 하단 우측 상품선택영역  Up/ Down
 			if (flag  == "Up"){
 				$obj = $('.pd_detail .opt_select .select_custom.deal_opt_item').find('.combo .select'); 
 				$taget = $('.pd_desc_wrap .opt_select .select_custom.deal_opt_item').find('.combo .select');
-			}else if (flag  == "Down"){
+			}else{
 				$taget = $('.pd_detail .opt_select .select_custom.deal_opt_item').find('.combo .select');
 				$obj = $('.pd_desc_wrap .opt_select .select_custom.deal_opt_item').find('.combo .select');
 			}
@@ -352,87 +369,115 @@
 	}
 	
 	// 옵션2 조회
-	var fnOption2 = function(flag, goodsCd, optCd1, qty, minOrdQty, maxOrdQty ){
-		let selfGoodsYn = $("#cartForm  input[name=selfGoodsYn]").val();
+	var fnOption2 = function(obj, flag){
+		let $obj = $(obj);
+		let $target = $obj.find('input[name="opt1"]');
+		let goodsCd = $target.val();
+		let currPrice = $target.attr("currPrice");
+		let optCd1 = $target.attr("optCd1");
+		let minOrdQty = $target.attr("minOrdQty");
+		let maxOrdQty = $target.attr("maxOrdQty");
+		let selfGoodsYn = $target.attr("selfGoodsYn");
+		
 		let data = {goodsCd : goodsCd
 					,optCd1 : optCd1
 					};
 		let jsonData = JSON.stringify(data);
-	
+		
 		gagajf.ajaxJsonSubmit('/goods/detail/option2/list', jsonData, function(result) {
 			
 			if (result.dataList != null && result.dataList.length > 0) {
-				let tag = "";
+				let tagUpS = "";
+				let tagDownS = "";
+				let tagUp = "";
+				let tagDown = "";
 				let $objUp = null;
 				let $objDown = null;
 				$.each(result.dataList, function(idx, item) {
+					let tag1 = "";
+					let tag2 = "";
 					if (idx == 0){
-						$objUp = $('#goodsDealOptUp2');
-						$objUp.append('');
-						$objDown = $('#goodsDealOptDown2');
-						$objDown.append('');
-						$('.form_field .select_custom.deal_opt2').attr('disabled', false)
-						tag += '<li class="selected" id="goodsOpt2">선택</li>\n';	
+						//$objUp = $('#goodsDealOptUp2');
+						$objUp = $('.pd_detail .form_field .select_custom.deal_opt2');
+						$objUp.html('');
+						$objDown = $('.pd_desc_wrap .opt_select .select_custom.deal_opt2');
+						$objDown.html('');
+						$('.form_field .select_custom.deal_opt2').attr('disabled', false);
+						//------
+						tag1 += '<div class="combo">\n';
+						tag1 += '<div class="select">선택</div>\n';
+						tag1 += '<ul class="list">\n';
+						//------
+						tag1 += '<li class="selected" id="goodsOpt2">선택</li>\n';	
 					}
 					let soldoutYn = ""; 
 					if ("Y" == item.soldoutYn || item.stockQty <= 0)soldoutYn = "true";
-					tag += '<li aria-disabled="'+soldoutYn+'" data-soldout="'+soldoutYn +'" onclick="fnViewStock(this, \''+ flag +'\' , \''+ item.goodsCd+'\' , \''+ item.optCd+'\' , \''+ item.optCd1+'\' , \''+ item.optCd2+'\', \''+ minOrdQty+'\', \''+ maxOrdQty+'\')">\n';
-					tag += '<div>'+ item.optCd2+'</div>\n';
+					tagUp = '<li aria-disabled="'+soldoutYn+'" data-soldout="'+soldoutYn +'" onclick="fnViewStock(this, \'Up\' )">\n';
+					tagDown = '<li aria-disabled="'+soldoutYn+'" data-soldout="'+soldoutYn +'" onclick="fnViewStock(this, \'Down\' )">\n';
+					tag2 += '<div>'+ item.optCd2+'</div>\n';
 					if (item.addPrice > 0){
-						tag += '<div>'+ item.addPrice.addComma() +'원</div>\n';	
+						tag2 += '<div>'+ item.addPrice.addComma() +'원</div>\n';	
 					}
-					tag += '<input type="hidden" name="opt2" value="'+ item.goodsCd+'|'+item.optCd +'|'+qty +'" id="'+item.optCd+'" addPrice="'+item.addPrice+'"  optCd="'+item.optCd+'"  optCd1="'+item.optCd1+'"  optCd2="'+item.optCd2+'"  />\n';
-					tag += '</li>\n';
+					tag2 += '<input type="hidden" name="opt2" value="'+ goodsCd +'" currPrice="'+ currPrice+'" addPrice="'+item.addPrice+'"  optCd="'+item.optCd+'"  optCd1="'+item.optCd1+'"  optCd2="'+item.optCd2+'"  minOrdQty="'+minOrdQty+'"  maxOrdQty="'+maxOrdQty+'" selfGoodsYn="'+selfGoodsYn+'"/>\n';
+					tag2 += '</li>\n';
+					
+					tagUpS += tag1+tagUp+tag2;
+					tagDownS += tag1+tagDown+tag2;
 				});
 				
-				$objUp.append(tag);
-				$objDown.append(tag);
+				if (!gagajf.isNull(tagUpS)){
+					//------
+					tagUpS += '</ul>\n';
+					tagUpS += '</div>\n';
+					tagDownS += '</ul>\n';
+					tagDownS += '</div>\n';
+					//------	
+				}
+				
+				
+				$objUp.append(tagUpS);
+				$objDown.append(tagDownS);
 				var detail_deal_option03 = new sCombo('.pd_detail .opt_select .select_custom.deal_opt2');
 				var desc_option03 = new sCombo('.pd_desc_wrap .opt_select .select_custom.deal_opt2');
 				//var pop_desc_option03 = new sCombo('.pd_detail .opt_select .select_custom.deal_opt2');
 				
 			}
 			
-			let $obj = null;
-			let $taget = null;
+			// 옵션 1 선태값 적용
+			let $obj2 = null;
+			let $taget2 = null;
 			// 하단 우측 상품선택영역  Up/ Down
 			if (flag  == "Up"){
-				$obj = $('.pd_detail .opt_select .select_custom.deal_opt1').find('.combo .select'); 
-				$taget = $('.pd_desc_wrap .opt_select .select_custom.deal_opt1').find('.combo .select');
-			}else if (flag  == "Down"){
-				$taget = $('.pd_detail .opt_select .select_custom.deal_opt1').find('.combo .select');
-				$obj = $('.pd_desc_wrap .opt_select .select_custom.deal_opt1').find('.combo .select');
+				$obj2 = $('.pd_detail .opt_select .select_custom.deal_opt1').find('.combo .select'); 
+				$taget2 = $('.pd_desc_wrap .opt_select .select_custom.deal_opt1').find('.combo .select');
+			}else{
+				$obj2 = $('.pd_desc_wrap .opt_select .select_custom.deal_opt1').find('.combo .select');
+				$taget2 = $('.pd_detail .opt_select .select_custom.deal_opt1').find('.combo .select');
 			}
 			
-			let goodsDealInfo = $obj.html();
-			$taget.html(goodsDealInfo);
+			let goodsDealInfo = $obj2.html();
+			$taget2.html(goodsDealInfo);
 			
 		});	
 	}
 	
 	//사이즈 클릭시 - 단품
-	var fnViewStock = function(obj, flag, goodsCd, optCd, optCd1, optCd2,  minOrdQty, maxOrdQty) {
+	var fnViewStock = function(obj, flag ) {
+		
 		let $obj = $(obj);
-		let selfGoodsYn = $("#cartForm  input[name=selfGoodsYn]").val();
-		let $target = null;
-		if (selfGoodsYn == "Y"){
-			$target = $obj.parent().parent().children('input[name="opt"]');
-			$target.prop("checked",true);
-			$("#selectOptCd1").html(optCd2);
-		}else{
-			$target = $obj.find('input[name="opt2"]');
-		}
+		let $target = $obj.find('input[name="opt2"]');
+		let goodsCd = $target.val();
+		let currPrice = $target.attr("currPrice");
+		let optCd = $target.attr("optCd");
+		let optCd1 = $target.attr("optCd1");
+		let optCd2 = $target.attr("optCd2");
+		let minOrdQty = $target.attr("minOrdQty");
+		let maxOrdQty = $target.attr("maxOrdQty");
 		let addPrice  = $target.attr("addPrice");
-		$("#selectOptCd1addPrice").html('');
-		if (Number(addPrice) > 0) $("#selectOptCd1addPrice").html("(+" + addPrice.addComma() + ")");
-		
-		$("#cartForm  input[name=optCd]").val(optCd);
-		$("#cartForm  input[name=optCd1]").val(optCd1);
-		$("#cartForm  input[name=optCd2]").val(optCd2);
-		$("#cartForm  input[name=addPrice]").val(addPrice);
-		$("#cartForm  input[name=ordQty]").val("");
-		
+		let selfGoodsYn  = $target.attr("selfGoodsYn");
+		let optQty = minOrdQty;
 		let maxCnt = maxOrdQty;
+		
 		let params = new Object();
 		params.goodsCd = goodsCd;
 		params.optCd = optCd;
@@ -440,88 +485,98 @@
 		params.optCd2 = optCd2;
 		params.selfGoodsYn = selfGoodsYn;
 		
+		// 중복선택 확인  opt_result
+		var overlap = 0;
+		$('.pd_detail .opt_result .number_count').each(function() {
+			if ($('input[name="coption"]', this).val() == optCd) {
+				++overlap;
+			}
+		});
+		if (overlap > 0) {
+			mcxDialog.alert("이미 선택하신 옵션입니다.");
+			return false;
+		}
+		
 		$.get("/goods/detail/ajaxGoodsStockQty", $.param(params), function(result) {
 			let itemCnt = eval(result); //해당 아이템에 선택되어진 사이즈의 수량
-
+			
 			if (maxCnt > itemCnt) {
 				maxCnt = itemCnt;
 			}
 
 			if (minOrdQty > itemCnt) {
-				$target.prop("disabled", true);
+				alert("무슨작업을 해야할가요?");
+				return false; 		//무슨작업을 해야하나?
+			}
+			
+			//상품정보
+			let $selObj = null;
+			if (flag  == "Up"){
+				$selObj = $('.pd_detail .opt_select .select_custom.deal_opt_item');
 			}else{
-				$("#cartForm  input[name=ordQty]").val(minOrdQty);
-				$("#cartForm  input[name=maxOrdQty]").val(maxCnt);
-				$("#cartForm  input[name=minOrdQty]").val(minOrdQty);
-				$("#cartForm  input[name=cea]").val(minOrdQty);
-				$("#cartForm  input[name=cea]").attr("readonly",false);
-				$("#cartForm  input[name=stock]").val(itemCnt);
-
-				fnSetTotalPrice();
+				$selObj = $('.pd_desc_wrap .opt_select .select_custom.deal_opt_item');
 			}
+			let $goodsObj =$selObj.find('.combo .select').find('input[name=selectGoods]');
+			let goodsNm =  $goodsObj.attr('goodsnm');
+			let goodsCd =  $goodsObj.attr('goodscd');
+			let price = parseInt(currPrice)+ parseInt(addPrice);
 			
+			let tag = "";
+			tag += '<div class="result_item result_'+optCd+'">\n';
+			tag += '	<div class="opt_header">\n';
+			tag += '		<span class="item_name">'+goodsNm+'</span>\n';
+			tag += '		<span class="item_option">'+optCd1+'/'+optCd2+'</span>\n';
+			tag += '	</div>\n';
+			tag += '	<div class="number_count">\n';
+			tag += '		<span class="minus min_val" onclick="fnAdjustOrderEa(this);" adjust="-"><em class="sr-only">감소</em></span>\n';
+			tag += '		<input type="text" name="cea" optCd="'+optCd+'" maxlength="3" style="ime-mode:disabled" value="' +optQty+'" onblur="fnChangeOrderEa(this)" minOrdQty="'+minOrdQty+'" maxOrdQty="'+maxOrdQty+'" data-valid-type="numeric">\n';
+			tag += '		<input type="hidden" name="coption" value="'+optCd+'"  goodsCd="'+goodsCd+'"  price="'+currPrice+'"  addPrice="'+addPrice+'">\n';
+			tag += '		<span class="plus" onclick="fnAdjustOrderEa(this);" adjust="+"><em class="sr-only">추가</em></span>\n';
+			tag += '	</div>\n';
+			tag += '	<div class="item_price">\n';
+			tag += '		<p><em id="goodsPrice">'+price.addComma() +'</em>원</p>\n';
+			tag += '	</div>\n';
+			tag += '	<button type="button" class="btn_delete_item" onclick="fnSelectGoodsDel(\''+optCd+'\')"><span>삭제</span></button>\n';
+			tag += '</div>\n';
 			
-			// opt_result
-			/* <div class="result_item">
-				<div class="opt_header">
-					<span class="item_name">[상품1] 남성 테이퍼드핏 기모면 올밴딩 팬트</span>
-					<span class="item_option">다크그레이/XXL</span>
-				</div>
-				<div class="number_count">
-					<span class="minus min_val"><em class="sr-only">감소</em></span>
-					<input type="text" name="" maxlength="3" style="ime-mode:disabled" value="1">
-					<span class="plus"><em class="sr-only">추가</em></span>
-				</div>
-				<div class="item_price">
-					<p><em>99,999,999</em>원</p>
-				</div>
-				<button type="button" class="btn_delete_item"><span>삭제</span></button>
-			</div> */
-			let $obj = null;
-			let $taget = null;
+			
+			let $objUp = null;
+			let $objDown = null;
+			// 하단 우측 상품선택영역  Up/ Down
+			$objUp = $('.pd_detail .opt_result'); 
+			$objDown = $('.pd_desc_wrap .opt_result');
+			
+			$objUp.append(tag);
+			$objDown.append(tag);
+			
+			// 옵션 2 선태값 적용
+			let $obj2 = null;
+			let $taget2 = null;
 			// 하단 우측 상품선택영역  Up/ Down
 			if (flag  == "Up"){
-				$obj = $('.pd_detail .opt_select .select_custom.deal_opt2').find('.combo .select'); 
-				$taget = $('.pd_desc_wrap .opt_select .select_custom.deal_opt2').find('.combo .select');
-			}else if (flag  == "Down"){
-				$taget = $('.pd_detail .opt_select .select_custom.deal_opt2').find('.combo .select');
-				$obj = $('.pd_desc_wrap .opt_select .select_custom.deal_opt2').find('.combo .select');
+				$obj2 = $('.pd_detail .opt_select .select_custom.deal_opt2').find('.combo .select'); 
+				$taget2 = $('.pd_desc_wrap .opt_select .select_custom.deal_opt2').find('.combo .select');
+			}else{
+				$obj2 = $('.pd_desc_wrap .opt_select .select_custom.deal_opt2').find('.combo .select');
+				$taget2 = $('.pd_detail .opt_select .select_custom.deal_opt2').find('.combo .select');
+				
 			}
 			
-			let goodsDealInfo = $obj.html();
-			$taget.html(goodsDealInfo);
+			let goodsDealInfo = $obj2.html();
+			$taget2.html(goodsDealInfo);
 			
+			fnSetTotalPrice();
 			
 		}, "text");
 	}
 	
 	// 수량 변경 클릭
 	var fnAdjustOrderEa = function(obj) {
-
-		if("G056_N" == $("#cartForm  input[name=goodsType]").val()){
-			if(gagajf.isNull($("#cartForm  input[name=optCd2]").val())){
-				mcxDialog.alert("사이즈를 선택하세요.");
-				return false;
-			}
-		}else{
-			let target=$('.select_custom.item_opt2');
-			let targetSize = target.length;	//구성품 갯수
-			let itemSize = 0;
-			target.each(function(){
-				if (typeof ($(this).find('.select').find('input[name=opt2]').val()) != 'undefined' &&  !gagajf.isNull($(this).find('.select').find('input[name=opt2]').val())){
-					itemSize ++;
-				}
-			});
-			
-			if (targetSize != itemSize){
-				mcxDialog.alert("구성상품들의 옵션을 선택하세요.");
-				return false;
-			}
-		}
-
+		
 		let $obj = $(obj);
 		let $target = $obj.parent().children('input[name="cea"]');
-		let minOrdQty = parseInt($("#cartForm  input[name=minOrdQty]").val());
+		let minOrdQty = parseInt( $target.attr('minOrdQty'));
+		let maxOrdQty = parseInt( $target.attr('maxOrdQty'));
 		let ea =parseInt($target.val());
 
 		if ($obj.attr('adjust') == '-') --ea;
@@ -530,62 +585,52 @@
 		//var maxOrdQty = $("#cartForm  input[name=maxOrdQty]").val();
 
 		//if (maxOrdQty && ea > maxOrdQty) ea = maxOrdQty;
-		if (ea.toString().length > parseInt($target.attr('maxlength'))) --ea;
+		if (ea.toString().length > maxOrdQty) --ea;
 		if (ea < 1) ea = minOrdQty;
 
 		$target.val(ea);
 
-		fnChangeOrderEa();
+		fnChangeOrderEa($target[0]);
 	}
 
 	//옵션 갯수 변경
-	var fnChangeOrderEa = function() {
-
-		if("G056_N" == $("#cartForm  input[name=goodsType]").val()){
-			if(gagajf.isNull($("#cartForm  input[name=optCd2]").val())){
-				mcxDialog.alert("사이즈를 선택하세요.");
-				return false;
-			}
-		}else{
-			
-			let target=$('.select_custom.item_opt2');
-			let targetSize = target.length;	//구성품 갯수
-			let itemSize = 0;
-			target.each(function(){
-				if (typeof ($(this).find('.select').find('input[name=opt2]').val()) != 'undefined' &&  !gagajf.isNull($(this).find('.select').find('input[name=opt2]').val())){
-					itemSize ++;
-				}
-			});
-			
-			if (targetSize != itemSize){
-				mcxDialog.alert("구성상품들의 옵션을 선택하세요.");
-				return false;
-			}
-		}
-
-		//let f = document.cartForm;
-		let ea = parseInt($("#cartForm  input[name=cea]").val());
-		let buymin = parseInt($("#cartForm  input[name=minOrdQty]").val());
-		let buymax = parseInt($("#cartForm  input[name=maxOrdQty]").val());
+	var fnChangeOrderEa = function(obj) { 
+		let $obj = $(obj);
+		let ea = parseInt($obj.val());
+		let maxOrdQty = parseInt($(obj).attr('maxOrdQty'));
+		let minOrdQty = parseInt($(obj).attr('minOrdQty'));
+		let optCd =  $(obj).attr('optCd');
 		let alertMsg = '';
-		if (ea < buymin) {
-			alertMsg ="최소 주문 가능 수량은 "+buymin+"개 입니다.";
-			ea = buymin;
+		if (ea < minOrdQty) {
+			mcxDialog.alert("최소 주문 가능 수량은 "+minOrdQty+"개 입니다.");
+			ea = minOrdQty;
 		}
 
-		if (ea > buymax) {
-			alertMsg = "최대 주문 가능 수량은 "+buymax+"개 입니다.";
-			ea = buymax;
+		if (ea > maxOrdQty) {
+			mcxDialog.alert("최대 주문 가능 수량은 "+maxOrdQty+"개 입니다.");
+			ea = maxOrdQty;
 		}
 
-		$("#cartForm  input[name=cea]").val(ea);
-		$("#cartForm  input[name=ordQty]").val(ea);
-
+		obj.value = ea;
+		
 		if (alertMsg != ''){
 			mcxDialog.alert(alertMsg);
-			//return;
+			return false;
 		}
-
+		
+		if (ea <= 1){
+			$('.number_count').find('.minus').addClass('min_val');	
+		}else{
+			$('.number_count').find('.minus').removeClass('min_val');
+		}
+		
+		let addPrice = parseInt($obj.parent().find('input[name="coption"]').attr('addprice'));
+		let goodsPrice = parseInt($obj.parent().find('input[name="coption"]').attr('price'));
+		let totalPrice = ((goodsPrice+addPrice) * ea);
+		//$obj.parent().parent().find('#goodsPrice').text(totalPrice.addComma());
+		$('.opt_result .result_'+optCd+' .number_count').find('input[name=cea]').val(ea);
+		$('.opt_result .result_'+optCd+' .item_price').find('em').text(totalPrice.addComma());
+		
 		fnSetTotalPrice();
 	}
 	
@@ -596,16 +641,10 @@
 		let totalEa = 0;
 		let totalPrice = 0;
 		
-		$('input[name="cea"]').each(function() {
+		$('input[name="cea"]', document.cartForm).each(function() {
 			let ea = parseInt($(this).val());
-			let addPrice = 0;
 			let target=$('.select_custom.item_opt2');
-			target.each(function() {
-				if (typeof ($(this).find('input[name=opt2]').val()) != 'undefined' && !gagajf.isNull($(this).find('input[name=opt2]').val())){
-					addPrice += Number($(this).find('input[name=opt2]').attr('addPrice'));	
-				}
-			});	
-			
+			let addPrice = parseInt($(this).parent().find('input[name="coption"]').attr('addprice'));
 			let goodsPrice = parseInt($(this).parent().find('input[name="coption"]').attr('price'));
 
 			totalEa += ea;
@@ -614,8 +653,8 @@
 			}
 		});
 
-		$('#goodsTotalQty').html(totalEa.addComma());
-		$('#goodsTotalPrice').html(totalPrice.addComma());
+		$('.price_box .number  span').html(totalEa.addComma());
+		$('.price_box .price > span').html(totalPrice.addComma());
 		
 	}
 	
@@ -641,65 +680,47 @@
 		}
 		
 		let params = [];
-		let goodsType = $("#cartForm  input[name=goodsType]").val();
-
-		if (goodsType == 'G056_N'){
-			if (gagajf.isNull($("#cartForm  input[name=optCd2]").val())) {
-				mcxDialog.alert("사이즈를 선택하세요.");
-				return;
-			}
 		
-			let obj = new Object();
-			obj.goodsCd = $("#cartForm  input[name=goodsCd]").val();
-			obj.optCd = $("#cartForm  input[name=optCd]").val();
-			obj.goodsQty = $("#cartForm  input[name=ordQty]").val();
-			obj.goodsType = $("#cartForm  input[name=goodsType]").val();
+		let target = $('#cartForm input[name=cea]');
+		let targetSize = target.length;	//선택성품 갯수
+		if (target.length <= 0){
+			mcxDialog.alert("구성상품들의 옵션을 선택하세요.");
+			return false;
+		}
+		
+		target.each(function() {
+			
+			let ea = parseInt($(this).val());
+			let goodsCd = $(this).parent().find('input[name="coption"]').attr('goodscd');
+			let optCd = $(this).parent().find('input[name="coption"]').val();
+			let addPrice = parseInt($(this).parent().find('input[name="coption"]').attr('addprice'));
+			let goodsPrice = parseInt($(this).parent().find('input[name="coption"]').attr('price'));
+			
+			var obj = new Object();
 			obj.cartGb = btnType;
+			obj.goodsType = $("#cartForm  input[name=goodsType]").val();
+			obj.goodsCd = goodsCd;
+			obj.optCd = optCd;
+			obj.goodsQty = ea;
 			obj.afLinkCd =$("#cartForm  input[name=afLinkCd]").val();
 			obj.ithrCd =$("#cartForm  input[name=ithrCd]").val();
 			obj.contentsLoc =$("#cartForm  input[name=contentsLoc]").val();
 			obj.planDtlSq = $("#cartForm  input[name=planDtlSq]").val();
 			params.push(obj);
-
-		}else if (goodsType == 'G056_S'){  //수정요
-		
-			let target=$('.select_custom.item_opt2');
-			let targetSize = target.length;	//구성품 갯수
-			let itemSize = 0;
-			target.each(function(){
-				if (typeof ($(this).find('.select').find('input[name=opt2]').val()) != 'undefined' &&  !gagajf.isNull($(this).find('.select').find('input[name=opt2]').val())){
-					itemSize ++;
-				}
-			});
-			
-			if (targetSize != itemSize){
-				mcxDialog.alert("구성상품들의 옵션을 선택하세요.");
-				return false;
-			}
 			
-			target.each(function() {
-				var arrInfo = $(this).find('input[name=opt2]').val().split('|');	// 상품코드|사이즈|구성수량
-				
-				var obj = new Object();
-				obj.cartGb = btnType;
-				obj.goodsType = $("#cartForm  input[name=goodsType]").val();
-				obj.goodsCd = $("#cartForm  input[name=goodsCd]").val();
-				obj.itemCd = arrInfo[0];
-				obj.optCd = arrInfo[1];
-				obj.goodsQty = $("#cartForm  input[name=ordQty]").val();
-				obj.afLinkCd =$("#cartForm  input[name=afLinkCd]").val();
-				obj.ithrCd =$("#cartForm  input[name=ithrCd]").val();
-				obj.contentsLoc =$("#cartForm  input[name=contentsLoc]").val();
-				obj.planDtlSq = $("#cartForm  input[name=planDtlSq]").val();
-				params.push(obj);
-				
-			});
-		}
+		});
+		
 		
 		// 장바구니담기
 		cfnAddCart(params);
 	}
 	
+	// 선택상품 삭제
+	var fnSelectGoodsDel = function(optCd){
+		$('.result_'+optCd).remove();
+		fnSetTotalPrice();
+	}
+	
 	$(document).ready( function() {
 		
 		$('.timer_box').css('display', 'none');
@@ -811,8 +832,8 @@
 			//$('.pd_delivery .cont_body').load('pd_delivery_pop.html');
 			
 			return false;
-		});						
-					
+		});
+		
 		//슬라이드 - 이 상품과 함께 본 상품 
 		var otherItemSwiper = new Swiper('.pd .pd_clickother .area_slider .swiper-container', {
 			slidesPerView: 5,
@@ -900,6 +921,20 @@
 		$("meta[property='eg:locale']").attr('content',"KR");
 		$("meta[property='eg:isNew']").attr('content',([[${goodsInfo.formalGb}]] == 'G009_10')? 'True' :'False');
 		$("meta[property='eg:etc1']").attr('content', [[${goodsInfo.selfGoodsYn}]]);
+		
+		
+		// 탭별 선택시 기본 상품 설정
+		let selIdx = 0;
+		$('.tab_detail_cont.pd_delivery').find('.combo .list li').each(function() { 
+			if (typeof ($(this).attr('aria-disabled')) == 'undefined' || !$(this).attr('aria-disabled')){
+				return false;
+			}
+			iselIdxdx ++;
+		});
+		$('.tab_detail_cont.pd_delivery').find('.combo .list li').eq(selIdx).trigger("click");
+		$('.tab_detail_cont.pd_qnalist').find('.combo .list li').eq(selIdx).trigger("click");
+		$('.tab_detail_cont.pd_review').find('.combo .list li').eq(selIdx).trigger("click");
+		
 	});
 	
 /*]]>*/

+ 16 - 141
src/main/webapp/WEB-INF/views/web/goods/GoodsDeliveryFormWeb.html

@@ -38,151 +38,26 @@
 		</div>
 		<!-- //해당 상품 -->
 	</div>
-	<div class="full_pop_container">
-		<div class="pd_delivery">
-			<div class="table_box">
-				<h6>배송안내</h6>
-				<div class="tbl type1">
-					<table>
-						<colgroup>
-							<col width="220">
-							<col width="*">
-						</colgroup>
-						<tbody>
-							<tr>
-								<th>
-									구분
-								</th>
-								<td>
-									<th:block th:if="${goodsInfo.quikDelvYn = 'Y'}" >총알배송(오전 10시까지 주문 시)</th:block>
-									<th:block th:unless="${goodsInfo.quikDelvYn = 'Y'}" >일반배송</th:block>
-									
-									 
-								</td>
-							</tr>
-							<tr>
-								<th>
-									배송비
-								</th>
-								<td>
-									<th:block th:text="${#numbers.formatInteger(goodsInfo.delvFee, 0,'COMMA')}" ></th:block>원
-									<th:block th:if="${goodsInfo.minOrdAmt > 0}">(<th:block th:text="${#numbers.formatInteger(goodsInfo.minOrdAmt, 0,'COMMA')}" ></th:block>원 이상 무료배송)</th:block>
-									<th:block  th:if="${goodsInfo.delvFee <= 0}">무료배송</th:block>
-								</td>
-							</tr>
-							<tr>
-								<th>
-									배송업체
-								</th>
-								<td>
-									<th:block th:if="${deliveryInfo != null}" th:text="${deliveryInfo.shipCompNm}" ></th:block>
-								</td>
-							</tr>
-							<tr>
-								<th>
-									기간
-								</th>
-								<td>
-									총알배송  :  오늘 밤 12시까지 도착 (토/일/공휴일 제외)<br>
-									일반배송  :  결제 완료 후 2~3일 이내 (일/공휴일 제외)<br>
-									단, 제주도나 도서 지방은 별도요금이 부과될 수 있습니다. 날씨나 택배사 사정에 따라 배송이 지연될 수 있습니다.
-								</td>
-							</tr>
-						</tbody>
-					</table>
-				</div>
-			</div>
-			<div class="table_box">
-				<h6>반품/교환안내</h6>
-				<div class="tbl type1">
-					<table>
-						<colgroup>
-							<col width="220">
-							<col width="*">
-						</colgroup>
-						<tbody>
-							<tr>
-								<th>
-									반품/교환 배송업체
-								</th>
-								<td>
-									<th:block  th:if="${deliveryInfo != null}" th:text="${deliveryInfo.shipCompNm}" ></th:block>
-								</td>
-							</tr>
-							<tr>
-								<th>
-									반품배송비
-								</th>
-								<td>
-									<th:block  th:if="${deliveryInfo != null and deliveryInfo.delvFeeCd != null}" th:text="${#numbers.formatInteger(deliveryInfo.rtnDelvFee, 0,'COMMA')}" ></th:block>원(최소 배송비가 무료인 경우 왕복 배송비 <th:block th:if="${deliveryInfo != null and deliveryInfo.delvFeeCd != null}" th:text="${#numbers.formatInteger((deliveryInfo.rtnDelvFee+deliveryInfo.delvFee), 0,'COMMA')}" ></th:block>원 부과)
-								</td>
-							</tr>
-							<tr>
-								<th>
-									교환배송비
-								</th>
-								<td>
-									<th:block  th:if="${deliveryInfo != null and deliveryInfo.delvFeeCd != null}" th:text="${#numbers.formatInteger((deliveryInfo.rtnDelvFee+deliveryInfo.delvFee), 0,'COMMA')}" ></th:block>원
-								</td>
-							</tr>
-							<tr>
-								<th>
-									반품/교환 주소
-								</th>
-								<td>
-									<th:block th:if="${deliveryInfo != null and deliveryInfo.delvFeeCd != null}" th:text="${deliveryInfo.rtnLocZipcode +' '+ deliveryInfo.rtnLocBaseAddr +' '+ deliveryInfo.rtnLocDtlAddr }"></th:block>
-								</td>
-							</tr>
-							<tr>
-								<th>
-									반품/교환 신청
-								</th>
-								<td>
-									반품/교환시 먼저 고객센터(1544-5336)나 일대일 문의로 반품/교환 신청 후 상품을 발송 해 주시기 바랍니다.<br>
-									마이페이지 > 나의쇼핑 > 정상주문내역에서 하실 수 있습니다.<br>
-									반품/교환 신청시 상품의 반송입고 확인 후 환불/교환 처리해 드립니다.
-								</td>
-							</tr>
-							<tr>
-								<th>
-									반품시기
-								</th>
-								<td>
-									상품의 반품/교환은 상품 수령 후 7일 이내 가능합니다.<br>
-									단 상품을 수령하셨을 때의 상태를 그대로 보존해주셔야 합니다.
-								</td>
-							</tr>
-							<tr>
-								<th>
-									반품/교환 불가사유
-								</th>
-								<td>
-									반품/교환 가능기간을 초과하였을 경우.<br>
-									상품 및 구성품을 분실하였거나 취급 부주의로 인한 파손/고장/오염된 경우.<br>
-									고객님의 요청에 따른 주문제작 상품의 경우.<br>
-									상품을 착용 또는 설치하였거나, 상품의 일부를 소비하였을 경우.<br>
-									상품의 포장을 개봉하여 사용 및 설치가 완료 되거나 상품의 가치가 훼손되었을 경우.<br>
-									구매한 상품의 구성품(세트, 기프트상품, 부속품, 의류부착 악세사리 등) 이 누락 된 경우.<br>
-									신발, 그릇류의 박스포장을 포함, 상품이 판매할 수 없게 훼손 된 경우(신발박스 등의 파손, 박스포장 위 송장 부착, 박스 훼손/파손/찢어짐, 택 분실 등)
-								</td>
-							</tr>
-							<tr th:if="${deliveryInfo != null and deliveryInfo.delvFeeCd != null}">
-								<th>
-									기타사항
-								</th>
-								<td  th:if="${not #strings.isEmpty(deliveryInfo.note)}" th:utext="${#strings.unescapeJava(#strings.escapeJava(deliveryInfo.note))}">
-									상품에 따라 반송주소/방법이 각각 다를 수 있습니다.<br>
-								</td>
-							</tr>
-						</tbody>
-					</table>
-				</div>
-			</div> 
-		</div>	
+	<div class="full_pop_container" id="goodsDealDelivery">
 	</div>
 </div>
 <script th:inline="javascript">
 /*<![CDATA[*/
+		
+	// 구성 상품 상세 배송정보
+	var fnGoodsDetailDelivery = function(params) {
+		gagajf.ajaxSubmit("/goods/detail/delivery/frame", "html", "goodsDealDelivery", params);
+	}
+	
+	$(document).ready( function() {
+
+		// 배송정보 
+		var params = new Object();
+		let goodsCd = [[${goodsInfo.goodsCd}]]
+		params.goodsCd = goodsCd;
+		fnGoodsDetailDelivery(params);  // ajax html
+		
+	});
 	
 /*]]>*/
 </script>

+ 157 - 0
src/main/webapp/WEB-INF/views/web/goods/GoodsDetailDeliveryFormWeb.html

@@ -0,0 +1,157 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : GoodsDetailDeliveryFormWeb.html
+ * @desc	: 딜 구상상품 배송정보 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE		 AUTHOR		 DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.03.26   eskim	   최초 작성
+ *******************************************************************************
+ -->
+ <div class="pd_delivery">
+	<div class="table_box">
+		<h6>배송안내</h6>
+		<div class="tbl type1">
+			<table>
+				<colgroup>
+					<col width="220">
+					<col width="*">
+				</colgroup>
+				<tbody>
+					<tr>
+						<th>
+							구분
+						</th>
+						<td>
+							<th:block th:if="${goodsInfo.quikDelvYn = 'Y'}" >총알배송(오전 10시까지 주문 시)</th:block>
+							<th:block th:unless="${goodsInfo.quikDelvYn = 'Y'}" >일반배송</th:block>
+							
+							 
+						</td>
+					</tr>
+					<tr>
+						<th>
+							배송비
+						</th>
+						<td>
+							<th:block th:text="${#numbers.formatInteger(goodsInfo.delvFee, 0,'COMMA')}" ></th:block>원
+							<th:block th:if="${goodsInfo.minOrdAmt > 0}">(<th:block th:text="${#numbers.formatInteger(goodsInfo.minOrdAmt, 0,'COMMA')}" ></th:block>원 이상 무료배송)</th:block>
+							<th:block  th:if="${goodsInfo.delvFee <= 0}">무료배송</th:block>
+						</td>
+					</tr>
+					<tr>
+						<th>
+							배송업체
+						</th>
+						<td>
+							<th:block th:if="${deliveryInfo != null}" th:text="${deliveryInfo.shipCompNm}" ></th:block>
+						</td>
+					</tr>
+					<tr>
+						<th>
+							기간
+						</th>
+						<td>
+							총알배송  :  오늘 밤 12시까지 도착 (토/일/공휴일 제외)<br>
+							일반배송  :  결제 완료 후 2~3일 이내 (일/공휴일 제외)<br>
+							단, 제주도나 도서 지방은 별도요금이 부과될 수 있습니다. 날씨나 택배사 사정에 따라 배송이 지연될 수 있습니다.
+						</td>
+					</tr>
+				</tbody>
+			</table>
+		</div>
+	</div>
+	<div class="table_box">
+		<h6>반품/교환안내</h6>
+		<div class="tbl type1">
+			<table>
+				<colgroup>
+					<col width="220">
+					<col width="*">
+				</colgroup>
+				<tbody>
+					<tr>
+						<th>
+							반품/교환 배송업체
+						</th>
+						<td>
+							<th:block  th:if="${deliveryInfo != null}" th:text="${deliveryInfo.shipCompNm}" ></th:block>
+						</td>
+					</tr>
+					<tr>
+						<th>
+							반품배송비
+						</th>
+						<td>
+							<th:block  th:if="${deliveryInfo != null and deliveryInfo.delvFeeCd != null}" th:text="${#numbers.formatInteger(deliveryInfo.rtnDelvFee, 0,'COMMA')}" ></th:block>원(최소 배송비가 무료인 경우 왕복 배송비 <th:block th:if="${deliveryInfo != null and deliveryInfo.delvFeeCd != null}" th:text="${#numbers.formatInteger((deliveryInfo.rtnDelvFee+deliveryInfo.delvFee), 0,'COMMA')}" ></th:block>원 부과)
+						</td>
+					</tr>
+					<tr>
+						<th>
+							교환배송비
+						</th>
+						<td>
+							<th:block  th:if="${deliveryInfo != null and deliveryInfo.delvFeeCd != null}" th:text="${#numbers.formatInteger((deliveryInfo.rtnDelvFee+deliveryInfo.delvFee), 0,'COMMA')}" ></th:block>원
+						</td>
+					</tr>
+					<tr>
+						<th>
+							반품/교환 주소
+						</th>
+						<td>
+							<th:block th:if="${deliveryInfo != null and deliveryInfo.delvFeeCd != null}" th:text="${deliveryInfo.rtnLocZipcode +' '+ deliveryInfo.rtnLocBaseAddr +' '+ deliveryInfo.rtnLocDtlAddr }"></th:block>
+						</td>
+					</tr>
+					<tr>
+						<th>
+							반품/교환 신청
+						</th>
+						<td>
+							반품/교환시 먼저 고객센터(1544-5336)나 일대일 문의로 반품/교환 신청 후 상품을 발송 해 주시기 바랍니다.<br>
+							마이페이지 > 나의쇼핑 > 정상주문내역에서 하실 수 있습니다.<br>
+							반품/교환 신청시 상품의 반송입고 확인 후 환불/교환 처리해 드립니다.
+						</td>
+					</tr>
+					<tr>
+						<th>
+							반품시기
+						</th>
+						<td>
+							상품의 반품/교환은 상품 수령 후 7일 이내 가능합니다.<br>
+							단 상품을 수령하셨을 때의 상태를 그대로 보존해주셔야 합니다.
+						</td>
+					</tr>
+					<tr>
+						<th>
+							반품/교환 불가사유
+						</th>
+						<td>
+							반품/교환 가능기간을 초과하였을 경우.<br>
+							상품 및 구성품을 분실하였거나 취급 부주의로 인한 파손/고장/오염된 경우.<br>
+							고객님의 요청에 따른 주문제작 상품의 경우.<br>
+							상품을 착용 또는 설치하였거나, 상품의 일부를 소비하였을 경우.<br>
+							상품의 포장을 개봉하여 사용 및 설치가 완료 되거나 상품의 가치가 훼손되었을 경우.<br>
+							구매한 상품의 구성품(세트, 기프트상품, 부속품, 의류부착 악세사리 등) 이 누락 된 경우.<br>
+							신발, 그릇류의 박스포장을 포함, 상품이 판매할 수 없게 훼손 된 경우(신발박스 등의 파손, 박스포장 위 송장 부착, 박스 훼손/파손/찢어짐, 택 분실 등)
+						</td>
+					</tr>
+					<tr th:if="${deliveryInfo != null and deliveryInfo.delvFeeCd != null}">
+						<th>
+							기타사항
+						</th>
+						<td  th:if="${not #strings.isEmpty(deliveryInfo.note)}" th:utext="${#strings.unescapeJava(#strings.escapeJava(deliveryInfo.note))}">
+							상품에 따라 반송주소/방법이 각각 다를 수 있습니다.<br>
+						</td>
+					</tr>
+				</tbody>
+			</table>
+		</div>
+	</div> 
+</div>	
+</html>

+ 63 - 22
src/main/webapp/WEB-INF/views/web/goods/GoodsDetailFormWeb.html

@@ -94,7 +94,7 @@
 								<div class="desc_top">
 									<a href="javascript:void(0);" class="btn_brand" th:onclick="cfnGoToBrandMain([[${goodsInfo.brandGroupNo}]])" th:text="${goodsInfo.brandGroupNm}">NBA 키즈</a>
 									<button type="button" class="itemShare">상품 공유하기</button>
-									<button type="button" class="itemLike" th:classappend="${goodsInfo.wishYn == 'Y'}? 'active' : ''"  onclick="cfnPutWishList(this);" th:attr="goodsCd=${params.goodsCd}, ithrCd=${params.ithrCd}, contentsLoc=${params.contentsLoc}, planDtlSq=${params.planDtlSq}">관심상품 추가</button>
+									<button type="button" class="itemLike" th:classappend="${goodsInfo.wishYn == 'Y'}? 'likeit' : ''"  onclick="cfnPutWishList(this);" th:attr="goodsCd=${params.goodsCd}, ithrCd=${params.ithrCd}, contentsLoc=${params.contentsLoc}, planDtlSq=${params.planDtlSq}">관심상품 추가</button>
 								</div>
 								<div class="desc_info">
 									<div class="title_blk">
@@ -189,8 +189,9 @@
 									<div class="form_field">
 										<div  th:each="goodsOption2, status : ${goodsOption2List}">
 											<input type="radio" name="opt"  th:id="${goodsOption2.optCd}" th:disabled="${goodsOption2.soldoutYn == 'Y' or goodsOption2.stockQty <= 0}" 
-													th:attr="addPrice=${goodsOption2.addPrice}, optCd1=${goodsOption2.optCd1}, optCd2=${goodsOption2.optCd2}, optCd=${goodsOption2.optCd}">
-											<label th:for="${goodsOption2.optCd}"><span th:text="${goodsOption2.optCd2}" th:onclick="fnViewStock(this, [[${goodsInfo.goodsCd}]],[[${goodsOption2.optCd}]],[[${goodsOption2.optCd1}]],[[${goodsOption2.optCd2}]],[[${goodsInfo.minOrdQty}]], [[${goodsInfo.maxOrdQty}]] )">100</span></label>
+													th:attr="addPrice=${goodsOption2.addPrice}, optCd1=${goodsOption2.optCd1}, optCd2=${goodsOption2.optCd2}, optCd=${goodsOption2.optCd}"
+													th:onclick="fnViewStock(this, [[${goodsInfo.goodsCd}]],[[${goodsOption2.optCd}]],[[${goodsOption2.optCd1}]],[[${goodsOption2.optCd2}]],[[${goodsInfo.minOrdQty}]], [[${goodsInfo.maxOrdQty}]] )" />
+											<label th:for="${goodsOption2.optCd}"><span th:text="${goodsOption2.optCd2}" >100</span></label>
 										</div>
 									</div>
 								</div>
@@ -325,9 +326,7 @@
 									<li th:if="${reviewDisplayYn == 'Y'}">
 										<div class="ex_review">
 											<a href="javascript:void(0);" id="btn_pdReview_pop" th:onclick="cfGoodsReview([[${goodsInfo.goodsCd}]])">	
-												<span class="tit">리뷰<em class="number">(
-												<th:block  th:text="${(goodsInfo.reviewRegCnt <= 9999) ? #numbers.formatInteger(goodsInfo.reviewRegCnt, 0,'COMMA')  : '9,999+'}"></th:block>
-												)</em></span>
+												<span class="tit">리뷰<em class="number">(<th:block  th:text="${(goodsInfo.reviewRegCnt <= 9999) ? #numbers.formatInteger(goodsInfo.reviewRegCnt, 0,'COMMA')  : '9,999+'}"></th:block>)</em></span>
 												<div class="star_score" th:if="${goodsInfo.reviewRegCnt  > 0 }">
 													<span class="star" th:with="starScore=${#numbers.formatDecimal((goodsInfo.score*100/5), 0,0)}">
 														<em class="progbar" th:style="${'width:'+starScore+'%;' }"></em> <!-- 평점 style로 표기 -->
@@ -362,7 +361,7 @@
 									<li>
 										<div class="ex_qna">
 											<a href="javascript:void(0);" id="btn_pdQnaList_pop" th:onclick="cfGoodsQng([[${goodsInfo.goodsCd}]])" >
-												<span class="tit">문의<em class="number">(<th:block th:text="${#numbers.formatInteger(goodsQnaCnt, 0,'COMMA')}" ></th:block><th:block th:if="${goodsQnaCnt > 0}" th:text="${'+'}"></th:block>)</em></span>
+												<span class="tit">문의<em class="number">(<th:block  th:text="${(goodsQnaCnt <= 9999) ? #numbers.formatInteger(goodsQnaCnt, 0,'COMMA')  : '9,999+'}"></th:block>)</em></span>
 											</a>
 										</div>
 									</li>
@@ -789,7 +788,8 @@
 		let selfGoodsYn = $("#cartForm  input[name=selfGoodsYn]").val();
 		let $target = null;
 		if (selfGoodsYn == "Y"){
-			$target = $obj.parent().parent().children('input[name="opt"]');
+			//$target = $obj.parent().parent().children('input[name="opt"]');
+			$target = $obj;
 			$target.prop("checked",true);
 			$("#selectOptCd1").html(optCd2);
 		}else{
@@ -987,6 +987,12 @@
 			mcxDialog.alert(alertMsg);
 			//return;
 		}
+		
+		if (ea <= 1){
+			$('.number_count').find('.minus').addClass('min_val');	
+		}else{
+			$('.number_count').find('.minus').removeClass('min_val');
+		}
 
 		fnSetTotalPrice();
 	}
@@ -1152,6 +1158,7 @@
 		}
 	}
 	
+
 	// 옵션2 조회
 	var fnOption2 = function(ridx, goodsCd, optCd1, qty, minOrdQty, maxOrdQty ){
 		let selfGoodsYn = $("#cartForm  input[name=selfGoodsYn]").val();
@@ -1166,11 +1173,36 @@
 			if (result.dataList != null && result.dataList.length > 0) {
 				let tag = "";
 				let $obj = null;
-				$.each(result.dataList, function(idx, item) {
+				
+				if (selfGoodsYn == "Y"){
+					if (ridx == 1){
+						$obj = $('.opt_set_select .select_custom.item_opt2.item_opt2_1');	
+					}else if (ridx == 2){
+						$obj = $('.opt_set_select .select_custom.item_opt2.item_opt2_2');	
+					}else if (ridx == 3){
+						$obj = $('.opt_set_select .select_custom.item_opt2.item_opt2_3');
+					}else if (ridx == 4){
+						$obj = $('.opt_set_select .select_custom.item_opt2.item_opt2_4');
+					}else{
+						$obj = $('.opt_set_select .select_custom.item_opt2.item_opt2_5');
+					}
+					
+				}else{
+					$obj = $('.form_field .select_custom.item_opt2.item_opt2_1');
+				}	
+				
+				$.each(result.dataList, function(idx, item) {debugger;
 					if (idx == 0){
-						$obj = $('#goodsOpt2'+item.goodsCd);
-						$obj.append('');
+						//$obj = $('#goodsOpt2'+item.goodsCd);
+						//$obj = $('.form_field .select_custom.item_opt2.item_opt2_1');
+						
+						$obj.html('');
 						$('.form_field .select_custom.item_opt2.' +item.goodsCd ).attr('disabled', false)
+						//------
+						tag += '<div class="combo">\n';
+						tag += '<div class="select">선택</div>\n';
+						tag += '<ul class="list">\n';
+						//------
 						tag += '<li class="selected" id="goodsOpt2'+item.goodsCd+'">선택</li>\n';	
 					}
 					let soldoutYn = ""; 
@@ -1188,22 +1220,31 @@
 					tag += '</li>\n';
 				});
 				
+				if (!gagajf.isNull(tag)){
+					//------
+					tag += '</ul>\n';
+					tag += '</div>\n';
+					//------	
+				}
+				
+				
 				$obj.append(tag);
-				if (ridx == 1){
-					if (selfGoodsYn == "Y"){
+				if (selfGoodsYn == "Y"){
+					if (ridx == 1){
 						var opt_selecter02_1 = new sCombo('.opt_set_select .select_custom.item_opt2.item_opt2_1');	
+					}else if (ridx == 2){
+						var opt_selecter02_2 = new sCombo('.opt_set_select .select_custom.item_opt2.item_opt2_2');	
+					}else if (ridx == 3){
+						var opt_selecter02_3 = new sCombo('.opt_set_select .select_custom.item_opt2.item_opt2_3');
+					}else if (ridx == 4){
+						var opt_selecter02_4 = new sCombo('.opt_set_select .select_custom.item_opt2.item_opt2_4');
 					}else{
-						var opt_selecter02 = new sCombo('.opt_select .select_custom.item_opt2.item_opt2_1');
+						var opt_selecter02_5 = new sCombo('.opt_set_select .select_custom.item_opt2.item_opt2_5');
 					}
-				}else if (ridx == 2){
-					var opt_selecter02_2 = new sCombo('.opt_set_select .select_custom.item_opt2.item_opt2_2');	
-				}else if (ridx == 3){
-					var opt_selecter02_3 = new sCombo('.opt_set_select .select_custom.item_opt2.item_opt2_3');
-				}else if (ridx == 4){
-					var opt_selecter02_4 = new sCombo('.opt_set_select .select_custom.item_opt2.item_opt2_4');
+					
 				}else{
-					var opt_selecter02_5 = new sCombo('.opt_set_select .select_custom.item_opt2.item_opt2_5');
-				}
+					var opt_selecter02 = new sCombo('.opt_select .select_custom.item_opt2.item_opt2_1');
+				}	
 			}
 			
 		});

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

@@ -0,0 +1,144 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : GoodsDetailQnaFormWeb.html
+ * @desc	: 상품 문의정보 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE		 AUTHOR		 DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.03.26   eskim	   최초 작성
+ *******************************************************************************
+ -->
+	<!-- 상품문의 리스트 내용 -->
+	<div class="pd_qnalist">
+	<form id="goodsQnaForm" name="goodsQnaForm" action="#" th:action="@{'/goods/qna/list'}">
+	<input type="hidden" name="pageNo" value ="1"/>
+	<input type="hidden" name="pageSize" value ="20"/>
+	<input type="hidden" name="relGoodsCd" th:value ="${goodsInfo.goodsCd}"/>
+		<div class="info_txt">
+			<ul>
+				<li>상품에 대해 궁금한 점이 있으시다면 문의해주세요.</li>
+				<li>배송, 주문/결제, 취소/반품/교환/환불, 회원, 쿠폰/포인트, 이벤트 등의 자세한 문의사항은 고객센터 > 1:1문의를 이용하여 주시기 바랍니다.</li>
+			</ul>			  
+			<div class="btn_box">
+				<button type="button" class="btn btn_default" onclick="cfnGoToPage(_PAGE_GOODS_QNA);"><span>고객센터 1:1문의</span></button>
+				<button type="button" class="btn btn_dark" th:onclick="cfGoodsQngCreate([[${goodsInfo.goodsCd}]] )"><span>상품 문의하기</span></button>
+			</div>	 
+		</div>
+		<div class="qna_list">
+			<!-- 나열조건결과 있을 때 노출 내용 -->
+			<div class="form_field">
+				<input id="except_secret" name="except_secret" type="checkbox"  onclick="fnGetList();"><label for="except_secret"><span>비밀글제외</span></label>
+				<input  type="hidden" name="secretYn" >
+			</div>
+			<div class="ui_row">
+				<div class="foldGroup case1">
+					<ul id="ulGoodsQna">
+					</ul>
+				</div>
+			</div>
+			<div class="ui_foot">
+				<div class="ui_row">
+					<ul class="pageNav" id="pageNav">
+					</ul>
+				</div>			
+			</div>
+			<!-- //나열조건결과 있을 때 노출 내용 -->
+			<!-- 나열조건결과 없을 때 노출 내용 -->
+			<div class="nodata" style="display:none;">
+				<div class="txt_box">
+					<p>
+						등록된 상품문의가 없습니다.
+					</p>
+				</div>
+			</div>
+			<!-- //나열조건결과 없을 때 노출 내용 -->
+		</div>
+	</form>	
+	</div>
+<script src="/ux/plugins/gaga/gaga.paging.js"></script>
+<script th:inline="javascript">
+/*<![CDATA[*/
+	
+	var fnGetList = function() {
+
+		$('#goodsQnaForm  input[name="secretYn"]').val('');
+		if ($("#goodsQnaForm input:checkbox[name=except_secret]").is(':checked')){
+			$('#goodsQnaForm  input[name="secretYn"]').val('N');
+		}
+		// Initialize a pagination
+		gagaPaging.init('goodsQnaForm', fnGetListCallback, 'pageNav', 20);
+
+		// Load data
+		gagaPaging.load(1);
+	}
+	
+	var fnGetListCallback = function(result) {
+		$('#ulGoodsQna').html('');
+		$('#goodsQnaForm').find('.nodata').hide();
+		// 목록
+		if (result.dataList != null && result.dataList.length > 0) {
+			
+			$.each(result.dataList, function(idx, item) {
+				let tag = '<li class="'+ (item.selfGb == 1 ? "my_qna" : "") +'">\n';  // <!-- 내가 쓴 글에 클래스 my_qna 추가 -->
+				tag += '	<div class="fold_head">\n';
+				tag += '		<a href="javascript:void(0)">\n';
+				tag += '			<div>\n';
+				tag += '				<span class="fold_state ' + (item.ansStat == "G060_10" ? "doing" : "done") + '">' + item.ansStatNm + '</span>\n'; //답변완료 : done / 처리중 : doing
+				tag += '				<div class="fold_tit">\n';
+				tag += '					<span>' + item.questContent + '</span>\n';
+				if (item.selfGb == 1){
+				tag += '					<i class="ico ico_myqna"></i>\n';	//내가 쓴 글에 추가되는 아이콘
+				}
+				if (item.secretYn == "Y"){
+				tag += '					<i class="ico ico_secret"></i>\n';	//비밀글에 추가되는 아이콘
+				}
+				tag += '				</div>\n';
+				tag += '				<div class="data">\n';
+				tag += '					<span class="wr_id">'+ item.maskingCustId+'</span>\n';
+				tag += '					<span class="wr_data">' + item.questDt + '</span>\n';
+				tag += '				</div>\n';
+				tag += '			</div>\n';
+				tag += '		</a>\n';
+				tag += '	</div>\n';
+				tag += '	<div class="fold_cont" style="display: none;">\n';
+				tag += '		<div class="fold_detail">\n'; //문의 내용
+				tag += '			<div>\n';
+				tag += '				<p>' + item.questContent + '</p>\n';
+				tag += '			</div>\n';
+				tag += '		</div>\n';
+				
+				if (item.ansStat == 'G060_20') { // 답변완료 상태일 때
+					tag += '	<div class="fold_answer">\n'; //문의 답변
+					tag += '		<div class="answer_head">답변이 등록되었습니다.</div>\n';
+					tag += '		<div class="answer_body">' + item.ansContent + '</div>\n';
+					tag += '		<span class="data">' + item.ansDt + '</span>\n';
+					tag += '	</div>\n';
+				}
+				
+				tag += '	</div>\n';
+				tag += '</li>\n';
+				
+				$('#ulGoodsQna').append(tag);
+			});
+		} else {
+			$('#goodsQnaForm').find('.nodata').show();
+			$('#goodsQnaForm').find('.ui_foot').hide();
+		}
+
+		// Create pagination
+		gagaPaging.createPagination(result.paging.pageable);
+	}
+	
+	$(document).ready(function() {
+		fnGetList();
+	});
+	
+/*]]>*/
+</script>	
+ </html>

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

@@ -0,0 +1,659 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : GoodsDetailReviewFormWeb.html
+ * @desc	: 상품평 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE		 AUTHOR		 DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.03.26   eskim	   최초 작성
+ *******************************************************************************
+ -->
+<!-- 상품리뷰 리스트 내용 -->
+ <div class="pd_review">
+	<!-- 등록리뷰 없을 시 -->
+	<div class="area_rv_empty" th:if="${reviewList == null or reviewList.empty}">
+		<div class="txt_box">
+			<p>
+				지금 첫 리뷰를 작성하고<br>
+				<span class="c_primary">스타일포인트 적립</span> 받으세요!
+			</p>
+			<dl>
+				<div>
+					<dt>일반리뷰</dt>
+					<dd th:text="|${#numbers.formatInteger(reviewPoint.textReviewPoint, 0,'COMMA')}P|">0P</dd>
+				</div>
+				<div>
+					<dt>포토/영상 리뷰</dt>
+					<dd th:text="|${#numbers.formatInteger(reviewPoint.photoReviewPoint, 0,'COMMA')}P|">0P</dd>
+				</div>
+				<div>
+					<dt>베스트 리뷰</dt>
+					<dd th:text="|${#numbers.formatInteger(reviewPoint.bestReviewPoint, 0,'COMMA')}P|">0P</dd>
+				</div>
+			</dl>
+		</div>
+		<div class="btn_box">
+			<button class="btn btn_dark"><span>지금 리뷰 작성하기</span></button>
+		</div>
+	</div>
+	<!-- //등록리뷰 없을 시 -->
+	<!-- 등록리뷰 있을 시 -->
+	<div class="area_rv_average" th:if="${reviewList != null and !reviewList.empty}">
+		<h6 class="sr-only">구매평점</h6>
+		<div class="star_score">
+			<span class="tit">구매평점</span>
+			<span class="score" th:text="${goodsInfo.score}">4.3</span>
+			<span class="star" th:with="starScore=${#numbers.formatDecimal((goodsInfo.score*100/5), 0,0)}">
+				<em class="progbar" th:style="${'width:'+starScore+'%;' }"></em> <!-- 평점 style로 표기 -->
+			</span>
+		</div>
+		<!-- 착용정보 있을 시 노출 -->
+		<th:block th:if="${not #strings.isEmpty(goodsInfo.sizeGb)}">
+		<div class="average">
+			<div class="part_average">
+				<span class="tit">사이즈</span>
+				<dl th:with="scoreSize1=${#numbers.formatDecimal((goodsInfo.scoreSize1*100/goodsInfo.reviewRegCnt), 0,0)}
+							, scoreSize2=${#numbers.formatDecimal((goodsInfo.scoreSize2*100/goodsInfo.reviewRegCnt), 0,0)}
+							, scoreSize3=${#numbers.formatDecimal((goodsInfo.scoreSize3*100/goodsInfo.reviewRegCnt), 0,0)}">
+					<div th:class="${(scoreSize1 >= scoreSize2 and scoreSize1 >= scoreSize3) ? 'on' : ''}">
+						<dt>작음</dt>
+						<dd>
+							<span class="ratio">
+								<em class="progbar"></em>
+							</span>
+							<span class="percent"><th:block th:text="${scoreSize1}"></th:block>%</span>
+						</dd>
+					</div> 
+					<div th:class="${(scoreSize2 >= scoreSize1 and scoreSize2 >= scoreSize3) ? 'on' : ''}">
+						<dt>딱맞음</dt>
+						<dd>
+							<span class="ratio">
+								<em class="progbar"></em>
+							</span>
+							<span class="percent"><th:block th:text="${scoreSize2}"></th:block>%</span>
+						</dd>
+					</div>
+					<div th:class="${(scoreSize3 >= scoreSize1 and scoreSize3 >= scoreSize2) ? 'on' : ''}">
+						<dt>큼</dt>
+						<dd>
+							<span class="ratio">
+								<em class="progbar"></em>
+							</span>
+							<span class="percent"><th:block th:text="${scoreSize3}"></th:block>%</span>
+						</dd>
+					</div>
+				</dl>
+			</div>
+			<div class="part_average">
+				<span class="tit">컬러</span>
+				<dl th:with="scoreColor1=${#numbers.formatDecimal((goodsInfo.scoreColor1*100/goodsInfo.reviewRegCnt), 0,0)}
+							, scoreColor2=${#numbers.formatDecimal((goodsInfo.scoreColor2*100/goodsInfo.reviewRegCnt), 0,0)}
+							, scoreColor3=${#numbers.formatDecimal((goodsInfo.scoreColor3*100/goodsInfo.reviewRegCnt), 0,0)}">
+					<div th:class="${(scoreColor1 >= scoreColor2 and scoreColor1 >= scoreColor3) ? 'on' : ''}">
+						<dt>밝음</dt>
+						<dd>
+							<span class="ratio">
+								<em class="progbar"></em>
+							</span>
+							<span class="percent"><th:block th:text="${scoreColor1}"></th:block>%</span>
+						</dd>
+					</div> 
+					<div th:class="${(scoreColor2 >= scoreColor1 and scoreColor2 >= scoreColor3) ? 'on' : ''}">
+						<dt>똑같음</dt>
+						<dd>
+							<span class="ratio">
+								<em class="progbar"></em>
+							</span>
+							<span class="percent"><th:block th:text="${scoreColor2}"></th:block>%</span>
+						</dd>
+					</div>
+					<div th:class="${(scoreColor3 >= scoreColor1 and scoreColor3 >= scoreColor2) ? 'on' : ''}">
+						<dt>어두움</dt>
+						<dd>
+							<span class="ratio">
+								<em class="progbar"></em>
+							</span>
+							<span class="percent"><th:block th:text="${scoreColor3}"></th:block>%</span>
+						</dd>
+					</div>
+				</dl>
+			</div>
+			<th:block th:if="${goodsInfo.sizeGb == 'T' or goodsInfo.sizeGb == 'B'}">
+			<div class="part_average">
+				<span class="tit">핏</span>
+				<dl th:with="scoreFit1=${#numbers.formatDecimal((goodsInfo.scoreFit1*100/goodsInfo.reviewRegCnt), 0,0)}
+							, scoreFit2=${#numbers.formatDecimal((goodsInfo.scoreFit2*100/goodsInfo.reviewRegCnt), 0,0)}
+							, scoreFit3=${#numbers.formatDecimal((goodsInfo.scoreFit3*100/goodsInfo.reviewRegCnt), 0,0)}">
+					<div th:class="${(scoreFit1 >= scoreFit2 and scoreFit1 >= scoreFit3) ? 'on' : ''}">
+						<dt>슬림</dt>
+						<dd>
+							<span class="ratio">
+								<em class="progbar"></em>
+							</span>
+							<span class="percent"><th:block th:text="${scoreFit1}"></th:block>%</span>
+						</dd>
+					</div> 
+					<div th:class="${(scoreFit2 >= scoreFit1 and scoreFit2 >= scoreFit3) ? 'on' : ''}">
+						<dt>레귤러</dt>
+						<dd>
+							<span class="ratio">
+								<em class="progbar"></em>
+							</span>
+							<span class="percent"><th:block th:text="${scoreFit2}"></th:block>%</span>
+						</dd>
+					</div>
+					<div th:class="${(scoreFit3 >= scoreFit1 and scoreFit3 >= scoreFit2) ? 'on' : ''}">
+						<dt>오버</dt>
+						<dd>
+							<span class="ratio">
+								<em class="progbar"></em>
+							</span>
+							<span class="percent"><th:block th:text="${scoreFit3}"></th:block>%</span>
+						</dd>
+					</div>
+				</dl>
+			</div>
+			<div class="part_average">
+				<span class="tit">두께감</span>
+				<dl th:with="scoreThick1=${#numbers.formatDecimal((goodsInfo.scoreThick1*100/goodsInfo.reviewRegCnt), 0,0)}
+							, scoreThick2=${#numbers.formatDecimal((goodsInfo.scoreThick2*100/goodsInfo.reviewRegCnt), 0,0)}
+							, scoreThick3=${#numbers.formatDecimal((goodsInfo.scoreThick3*100/goodsInfo.reviewRegCnt), 0,0)}">
+					<div th:class="${(scoreThick1 >= scoreThick2 and scoreThick1 >= scoreThick3) ? 'on' : ''}">
+						<dt>얇음</dt>
+						<dd>
+							<span class="ratio">
+								<em class="progbar"></em>
+							</span>
+							<span class="percent"><th:block th:text="${scoreThick1}"></th:block>%</span>
+						</dd>
+					</div> 
+					<div th:class="${(scoreThick2 >= scoreThick1 and scoreThick2 >= scoreThick3) ? 'on' : ''}">
+						<dt>적당함</dt>
+						<dd>
+							<span class="ratio">
+								<em class="progbar"></em>
+							</span>
+							<span class="percent"><th:block th:text="${scoreThick2}"></th:block>%</span>
+						</dd>
+					</div>
+					<div th:class="${(scoreThick3 >= scoreThick1 and scoreThick3 >= scoreThick2) ? 'on' : ''}">
+						<dt>도톰함</dt>
+						<dd>
+							<span class="ratio">
+								<em class="progbar"></em>
+							</span>
+							<span class="percent"><th:block th:text="${scoreThick3}"></th:block>%</span>
+						</dd>
+					</div>
+				</dl>
+			</div>
+			</th:block>
+			<th:block  th:if="${goodsInfo.sizeGb == 'S'}">
+			<div class="part_average">
+				<span class="tit">무게감</span>
+				<dl th:with="scoreWeight1=${#numbers.formatDecimal((goodsInfo.scoreWeight1*100/goodsInfo.reviewRegCnt), 0,0)}
+							, scoreWeight2=${#numbers.formatDecimal((goodsInfo.scoreWeight2*100/goodsInfo.reviewRegCnt), 0,0)}
+							, scoreWeight3=${#numbers.formatDecimal((goodsInfo.scoreWeight3*100/goodsInfo.reviewRegCnt), 0,0)}">
+					<div th:class="${(scoreWeight1 >= scoreWeight2 and scoreWeight1 >= scoreWeight3) ? 'on' : ''}">
+						<dt>가벼움</dt>
+						<dd>
+							<span class="ratio">
+								<em class="progbar"></em>
+							</span>
+							<span class="percent"><th:block th:text="${scoreWeight1}"></th:block>%</span>
+						</dd>
+					</div> 
+					<div th:class="${(scoreWeight2 >= scoreWeight1 and scoreWeight2 >= scoreWeight3) ? 'on' : ''}">
+						<dt>적당함</dt>
+						<dd>
+							<span class="ratio">
+								<em class="progbar"></em>
+							</span>
+							<span class="percent"><th:block th:text="${scoreWeight2}"></th:block>%</span>
+						</dd>
+					</div>
+					<div th:class="${(scoreWeight3 >= scoreWeight1 and scoreWeight3 >= scoreWeight2) ? 'on' : ''}">
+						<dt>무거움</dt>
+						<dd>
+							<span class="ratio">
+								<em class="progbar"></em>
+							</span>
+							<span class="percent"><th:block th:text="${scoreWeight3}"></th:block>%</span>
+						</dd>
+					</div>
+				</dl>
+			</div>
+			<div class="part_average">
+				<span class="tit">볼너비</span>
+				<dl th:with="scoreBall1=${#numbers.formatDecimal((goodsInfo.scoreBall1*100/goodsInfo.reviewRegCnt), 0,0)}
+							, scoreBall2=${#numbers.formatDecimal((goodsInfo.scoreBall2*100/goodsInfo.reviewRegCnt), 0,0)}
+							, scoreBall3=${#numbers.formatDecimal((goodsInfo.scoreBall3*100/goodsInfo.reviewRegCnt), 0,0)}">
+					<div th:class="${(scoreBall1 >= scoreBall2 and scoreBall1 >= scoreBall3) ? 'on' : ''}">
+						<dt>작음</dt>
+						<dd>
+							<span class="ratio">
+								<em class="progbar"></em>
+							</span>
+							<span class="percent"><th:block th:text="${scoreBall1}"></th:block>%</span>
+						</dd>
+					</div> 
+					<div th:class="${(scoreBall2 >= scoreBall1 and scoreBall2 >= scoreBall3) ? 'on' : ''}">
+						<dt>딱맞음</dt>
+						<dd>
+							<span class="ratio">
+								<em class="progbar"></em>
+							</span>
+							<span class="percent"><th:block th:text="${scoreBall2}"></th:block>%</span>
+						</dd>
+					</div>
+					<div th:class="${(scoreBall3 >= scoreBall1 and scoreBall3 >= scoreBall2) ? 'on' : ''}">
+						<dt>큼</dt>
+						<dd>
+							<span class="ratio">
+								<em class="progbar"></em>
+							</span>
+							<span class="percent"><th:block th:text="${scoreBall3}"></th:block>%</span>
+						</dd>
+					</div>
+				</dl>
+			</div>
+			</th:block>
+		</div>
+		</th:block>
+		<!-- //착용정보 있을 시 노출 -->
+		<div class="info_review">
+			<p>
+				<i class="ico_point"></i>상품 리뷰 작성 시 <span>스타일포인트 추가 적립!</span>
+			</p>
+			<dl>
+				<div>
+					<dt>일반리뷰</dt>
+					<dd th:text="|${#numbers.formatInteger(reviewPoint.textReviewPoint, 0,'COMMA')}P|">0P</dd>
+				</div>
+				<div>
+					<dt>포토/영상 리뷰</dt>
+					<dd th:text="|${#numbers.formatInteger(reviewPoint.photoReviewPoint, 0,'COMMA')}P|">0P</dd>
+				</div>
+				<div>
+					<dt>베스트 리뷰</dt>
+					<dd th:text="|${#numbers.formatInteger(reviewPoint.bestReviewPoint, 0,'COMMA')}P|">0P</dd>
+				</div>
+			</dl>
+		</div>
+	</div>
+	<div class="area_rv_best" th:if="${bestReviewList != null and !bestReviewList.empty}">
+		<h6>베스트 리뷰</h6>
+		<div class="btn_arrow">	
+			<div class="swiper-button-prev"></div>  
+			<div class="swiper-button-next"></div>
+		</div>
+		<div class="swiper-container">
+			<div class="swiper-wrapper">
+				<div class="swiper-slide" th:each="bestReview, status : ${bestReviewList}" >
+					<div class="best_review">
+						<a href="javascript:void(0);" th:onclick="cfGoodsReviewDetail([[${goodsInfo.goodsCd}]], 'Y', '', [[${bestReview.reviewSq}]])" >
+							<div class="pic" th:if="${bestReview.reviewAttachList != null and !bestReview.reviewAttachList.empty}">
+								<th:block th:each="reviewAttach, attachStatus : ${bestReview.reviewAttachList}">
+								<span class="thumb" th:classAppend="${(reviewAttach.fileGb == 'M') ? 'mov' :''}" th:style="${'background-image:url('+imgUrl+ reviewAttach.sysFileNm+');'}"></span><!-- 동영상의 썸네일일 경우 mov 클래스 추가 -->
+								</th:block>
+							</div>
+							<div class="pic" th:unless="${bestReview.reviewAttachList != null and !bestReview.reviewAttachList.empty}">
+								<span class="thumb" th:style="${'background-image:url('+imgGoodsUrl+ '/'+goodsInfo.sysImgNm+');'}">
+								</span>
+							</div>
+							<div class="star_score" th:with="starScore=${#numbers.formatDecimal((bestReview.score*100/5), 0,0)}">
+								<span class="star">
+									<em class="progbar" th:style="${'width:'+starScore+'%;' }"></em> <!-- 평점 style로 표기 -->
+								</span>
+								<em class="ico ico_besttag"></em>
+							</div>
+							<div class="txt_best_review">
+								<p th:text="${bestReview.reviewContent}">옷</p>
+							</div>
+						</a>
+					</div>
+				</div>
+			</div>
+			<div class="swiper-pagination"></div>
+		</div>
+	</div>
+	<div class="area_rv_photo"  th:if="${photoReviewList != null and !photoReviewList.empty}">
+		<h6>포토/영상 리뷰</h6>
+		<div class="photo_list">
+			<ul>
+				<li  th:each="photoReview, status : ${photoReviewList}" >
+					<th:block th:if="${photoReview.reviewAttachList != null and !photoReview.reviewAttachList.empty}">
+					<th:block th:each="reviewAttach, attachStatus : ${photoReview.reviewAttachList}" th:if="${attachStatus.first}">
+					
+					<a href="javascript:void(0);" th:onclick="cfGoodsReviewDetail([[${goodsInfo.goodsCd}]], '', 'Y', [[${photoReview.reviewSq}]])">
+						<div class="pic">
+							<span class="thumb" th:classAppend="${(reviewAttach.fileGb == 'M') ? 'mov' :''}" th:style="${'background-image:url('+imgUrl+ reviewAttach.sysFileNm+');'}"></span><!-- 동영상의 썸네일일 경우 mov 클래스 추가 -->
+						</div>
+					</a>
+					</th:block>
+					</th:block>
+				</li>
+				
+			</ul>
+			<!-- 포토영상 게시글 최대 7개 & 버튼노출 -->
+			<th:block th:if="${#lists.size(photoReviewList) >= 1}"> <!-- 나중에 8로 수정 -->
+			<button type="button" id="btn_more_photoreview" th:onclick="cfGoodsReviewPhoto([[${goodsInfo.goodsCd}]])" ><span>더 보기</span></button>
+			<!-- //포토영상 게시글 최대 7개 & 버튼노출 -->
+			</th:block>
+		</div>
+	</div>
+	<div class="area_rv_all">
+	<form id="goodsReviewForm" name="goodsReviewForm" action="#" th:action="@{'/goods/review/list'}">
+	<input type="hidden" name="pageNo" value ="1"/>
+	<input type="hidden" name="pageSize" value ="1"/>
+	<input type="hidden" name="goodsCd" th:value ="${goodsInfo.goodsCd}"/>
+	<input type="hidden" name="goodsType" th:value ="${goodsInfo.goodsType}"/>
+	<input type="hidden" name="reviewScore" />
+	<input type="hidden" name="reviewOption" />
+	<input type="hidden" name="reviewHeight" />
+	<input type="hidden" name="reviewWeight" />
+	
+		<h6>전체리뷰<span>(<span id="reviewCount" th:text="${(reviewCount <= 9999) ? #numbers.formatInteger(reviewCount, 0,'COMMA') : '9,999+'}">9,999+</span>)</span></h6>
+		<div class="selection">
+			<div class="form_field">
+				<div class="select_custom sort_opt1">
+					<div class="combo">
+						<div class="select">평점 전체<input type="hidden" name="selScore" value=""/></div>
+						<ul class="list" onclick="jfReviewSearch();" >
+							<!-- 선택처리 class="selected" -->
+							<li class="selected" >평점 전체<input type="hidden" name="selScore" value=""/></li> 
+							<li>5점&nbsp;&starf;&starf;&starf;&starf;&starf;<input type="hidden" name="selScore" value="5"/></li>
+							<li>4점&nbsp;&starf;&starf;&starf;&starf;<input type="hidden" name="selScore" value="4" scoreId="4"/></li>
+							<li>3점&nbsp;&starf;&starf;&starf;<input type="hidden" name="selScore" value="3"/></li>
+							<li>2점&nbsp;&starf;&starf;<input type="hidden" name="selScore" value="2"/></li>
+							<li>1점&nbsp;&starf;<input type="hidden" name="selScore" value="1"/></li>
+						</ul>
+					</div>
+				</div>
+				<div class="select_custom sort_opt2" th:if="${reviewOptionList != null and !reviewOptionList.empty}">
+					<div class="combo">
+						<th:block th:if="${(goodsInfo.selfGoodsYn == 'Y')}">
+						<div class="select">사이즈 전체<input type="hidden" name="selOption" value=""/></div>
+						</th:block>
+						<th:block th:unless="${(goodsInfo.selfGoodsYn == 'Y')}">
+						<div class="select">옵션 전체<input type="hidden" name="selOption" value=""/></div>
+						</th:block>
+						<ul class="list" onclick="jfReviewSearch();">
+							<!-- 선택처리 class="selected" -->
+							<li class="selected" th:text="${(goodsInfo.selfGoodsYn == 'Y')? '사이즈 전체' :'옵션 전체'}">사이즈 전체</li> 
+							<li th:each="reviewOption, status : ${reviewOptionList}" >
+							<th:block th:text="${reviewOption.optCd2}"></th:block>
+							<input type="hidden" name="selOption" th:value="${reviewOption.optCd2}"/>
+							</li>
+						</ul>
+					</div>
+				</div>
+				<div class="select_custom sort_opt3" th:if="${reviewHeightList != null and !reviewHeightList.empty}">
+					<div class="combo">
+						<div class="select">키 전체<input type="hidden" name="selHeight" value=""/></div>
+						<ul class="list" onclick="jfReviewSearch();">
+							<!-- 선택처리 class="selected" -->
+							<li class="selected">키 전체<input type="hidden" name="selHeight" value=""/></li> 
+							<li th:each="reviewHeight, status : ${reviewHeightList}" >
+							<th:block th:text="${reviewHeight.cdNm}"></th:block>
+							<input type="hidden" name="selHeight" th:value="${reviewHeight.cd}"/>
+							</li>
+						</ul>
+					</div>
+				</div>
+				<div class="select_custom sort_opt4" th:if="${reviewWeightList != null and !reviewWeightList.empty}">
+					<div class="combo">
+						<div class="select">몸무게 전체<input type="hidden" name="selWeight" value=""/></div>
+						<ul class="list" onclick="jfReviewSearch();">
+							<!-- 선택처리 class="selected" -->
+							<li class="selected">몸무게 전체<input type="hidden" name="selWeight" value=""/></li> 
+							<li th:each="reviewWeight, status : ${reviewWeightList}" >
+							<th:block th:text="${reviewWeight.cdNm}"></th:block>
+							<input type="hidden" name="selWeight" th:value="${reviewWeight.cd}"/>
+							</li>
+							
+						</ul>
+					</div>
+				</div>
+			</div>
+		</div>
+		<!-- 나열조건결과 있을 때 노출 내용 -->
+		<div class="review_list">
+			<ul  id="ulGoodsReview">
+			</ul>
+		</div>
+		<div class="ui_row">
+			<ul class="pageNav" id="pageNav">
+			</ul>
+		</div>
+		<!-- //나열조건결과 있을 때 노출 내용 -->
+		<!-- 나열조건결과 없을 때 노출 내용 -->
+		<div class="nodata"  style="display:none;">
+			<div class="txt_box">
+				<p>
+					선택하신 조건에 맞는 리뷰가 없습니다.<br>
+					조건을 변경해 보세요.
+				</p>
+			</div>
+			<div class="btn_box" th:if="${reviewCount> 0}">
+				<button type="button" class="btn btn_default" onclick="jfReviewSearchInit();"><span>선택한 조건 초기화</span></button>
+			</div>
+		</div>
+		<!-- //나열조건결과 없을 때 노출 내용 -->
+	</form>	
+	</div>
+	<!-- //등록리뷰 있을 시 -->
+</div>
+<script src="/ux/plugins/gaga/gaga.paging.js"></script>
+<script th:inline="javascript">
+/*<![CDATA[*/
+	
+	var fnGetList = function() {
+
+		/* $('#goodsReviewForm  input[name="secretYn"]').val('');
+		if ($("#goodsReviewForm input:checkbox[name=except_secret]").is(':checked')){
+			$('#goodsReviewForm  input[name="secretYn"]').val('N');
+		} */
+		// Initialize a pagination
+		gagaPaging.init('goodsReviewForm', fnGetListCallback, 'pageNav', 1);
+
+		// Load data
+		gagaPaging.load(1);
+	}
+	
+	var fnGetListCallback = function(result) {
+		$('#ulGoodsReview').html('');
+		$('#goodsReviewForm').find('.nodata').hide();
+		$('#goodsReviewForm').find('.ui_row').show();
+		// 목록
+		if (result.dataList != null && result.dataList.length > 0) {
+			
+			$.each(result.dataList, function(idx, item) {
+				let tag = '<li>\n';
+				tag += '<div class="review">\n';
+				tag += '	<div class="info_box">\n';
+				tag += '		<div class="star_score">\n';
+				tag += '			<span class="star">\n';
+				tag += '				<em class="progbar" style="width:'+(item.score*20)+'%;"></em>\n'; //<!-- 평점 style로 표기 -->
+				tag += '			</span>\n';
+				tag += '		</div>\n';
+				tag += '		<div class="writer">\n';
+				tag += '			<span class="wr_id">'+ item.maskingCustId +'</span>\n';
+				tag += '			<span class="wr_date">' + item.regDt + '</span>\n';
+				tag += '		</div>\n';
+				tag += '	</div>\n';
+				tag += '	<div class="response_box">\n';
+				tag += '		<div>\n';
+				tag += '			<dl>\n';
+				tag += '				<div>\n';
+				tag += '					<dt>구매옵션</dt>\n';
+				if (item.goodsOptionList != null && item.goodsOptionList.length > 0){
+					$.each(item.goodsOptionList, function(gIdx, goodsOption){
+				tag += '					<dd>'+ goodsOption.optCd1 +' / '+ goodsOption.optCd2 +'</dd>\n';		
+					});
+				}
+				tag += '				</div>\n';
+				tag += '			</dl>\n';
+				tag += '		</div>\n';
+				tag += '		<div>\n';
+				tag += '			<dl>\n';
+				tag += '				<div>\n';
+				tag += '					<dt>키/몸무게</dt>\n';
+				tag += '					<dd>'+ item.height +'cm/'+ item.weight +'kg</dd>\n';
+				tag += '				</div>\n';
+				if (!gagajf.isNull(item.sizeGb) ){	// 사이즈구분값이 있을경우 노출
+					tag += '				<div>\n';
+					tag += '					<dt>사이즈</dt>\n';
+					tag += '					<dd>'+ item.scoreSizeNm +'</dd>\n';
+					tag += '				</div>\n';
+					tag += '				<div>\n';
+					tag += '					<dt>컬러</dt>\n';
+					tag += '					<dd>'+ item.scoreColorNm +'</dd>\n';
+					tag += '				</div>\n';
+				if (item.sizeGb == 'T' || item.sizeGb == 'B'){
+					tag += '				<div>\n';
+					tag += '					<dt>핏</dt>\n';
+					tag += '					<dd>'+ item.scoreFitNm +'</dd>\n';
+					tag += '				</div>\n';
+					tag += '				<div>\n';
+					tag += '					<dt>두께감</dt>\n';
+					tag += '					<dd>'+ item.scoreThickNm +'</dd>\n';
+					tag += '				</div>\n';	
+				}
+				if (item.sizeGb == 'S' ){
+					tag += '				<div>\n';
+					tag += '					<dt>무게감</dt>\n';
+					tag += '					<dd>'+ item.scoreWeightNm +'</dd>\n';
+					tag += '				</div>\n';
+					tag += '				<div>\n';
+					tag += '					<dt>볼너비</dt>\n';
+					tag += '					<dd>'+ item.scoreBallNm +'</dd>\n';
+					tag += '				</div>\n';	
+				}
+				}
+				tag += '			</dl>\n';
+				tag += '		</div>\n';
+				tag += '	</div>\n';
+				tag += '	<div class="photo_box">\n';
+				tag += '		<div class="photo_list">\n';
+				tag += '			<ul>\n';
+				if (item.reviewAttachList != null && item.reviewAttachList.length > 0){
+					var fileGbClass = '';
+					$.each(item.reviewAttachList, function(aIdx, reviewAttach){
+						fileGbClass = '';
+						if (reviewAttach == "M") fileGbClass = "mov";
+				tag += '				<li>\n';
+				tag += '					<a href="javascript:void();" onclick="cfGoodsReviewDetail(\''+item.goodsCd+'\',\'\', \'Y\',\''+item.reviewSq+'\');">\n';
+				tag += '						<div class="pic">\n';
+				tag += '							<span class="thumb '+ fileGbClass +'" style="background-image:url('+ _imgUrl + reviewAttach.sysFileNm +');"></span>\n'; //<!-- 동영상의 썸네일일 경우 mov 클래스 추가 -->
+				tag += '						</div>\n';
+				tag += '					</a>\n';
+				tag += '				</li>\n';		
+					});	
+				}
+				tag += '			</ul>\n';
+				tag += '		</div>\n';
+				tag += '	</div>\n';
+				tag += '	<div class="txt_review_box">\n';
+				tag += '		<p>' + item.reviewContent +'</p>\n';
+				tag += '	</div>\n';
+				if (!gagajf.isNull(item.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">'+item.admRplDt+'</span>\n';
+					tag += '			</div>\n';
+					tag += '			<div class="reply_txt">\n';
+					tag += '				<p>' + item.admRpl+'</p>\n';
+					tag += '			</div>\n';
+					tag += '		</div>\n';
+					tag += '	</div>\n';	
+				}
+				tag += '</div>\n';
+				tag += '</li>\n';
+				
+				$('#ulGoodsReview').append(tag);
+			});
+		} else {
+			$('#goodsReviewForm').find('.nodata').show();
+			$('#goodsReviewForm').find('.ui_row').hide();
+		}
+
+		// Create pagination
+		gagaPaging.createPagination(result.paging.pageable);
+	}
+	
+	// 상품평 검색조건 클릭시
+	var jfReviewSearch = function(){
+		let reviewScore = $('#goodsReviewForm').find('.select_custom.sort_opt1').find('.select input[name=selScore]').val();
+		let reviewOption = $('#goodsReviewForm').find('.select_custom.sort_opt2').find('.select input[name=selOption]').val();
+		let reviewHeight = $('#goodsReviewForm').find('.select_custom.sort_opt3').find('.select input[name=selHeight]').val();
+		let reviewWeight = $('#goodsReviewForm').find('.select_custom.sort_opt4').find('.select input[name=selWeight]').val();
+		
+		let changFlag = false;
+		if ($('#goodsReviewForm input[name=reviewScore]').val() != reviewScore){
+			changFlag = true;
+		}else if ($('#goodsReviewForm input[name=reviewOption]').val() != reviewOption){
+			changFlag = true;
+		}else if ($('#goodsReviewForm input[name=reviewHeight]').val() != reviewHeight){
+			changFlag = true;
+		}else if ($('#goodsReviewForm input[name=reviewWeight]').val() != reviewWeight){
+			changFlag = true;
+		}
+		
+		$('#goodsReviewForm input[name=reviewScore]').val(reviewScore);
+		$('#goodsReviewForm input[name=reviewOption]').val(reviewOption);
+		$('#goodsReviewForm input[name=reviewHeight]').val(reviewHeight);
+		$('#goodsReviewForm input[name=reviewWeight]').val(reviewWeight);
+		
+		if (changFlag) fnGetList();
+		
+	}
+	
+	// 상품평 초기화
+	var jfReviewSearchInit = function(){
+		
+		$('#goodsReviewForm').find('.select_custom.sort_opt1').find('.list li').eq(0).trigger('click')
+		$('#goodsReviewForm').find('.select_custom.sort_opt2').find('.list li').eq(0).trigger('click')
+		$('#goodsReviewForm').find('.select_custom.sort_opt3').find('.list li').eq(0).trigger('click')
+		$('#goodsReviewForm').find('.select_custom.sort_opt4').find('.list li').eq(0).trigger('click')
+		
+		$('#goodsReviewForm input[name=reviewScore]').val('');
+		$('#goodsReviewForm input[name=reviewOption]').val('');
+		$('#goodsReviewForm input[name=reviewHeight]').val('');
+		$('#goodsReviewForm input[name=reviewWeight]').val('');
+		
+		fnGetList();
+	}
+	
+	$(document).ready( function() {
+
+		var sort_selecter01 = new sCombo('.area_rv_all .selection .select_custom.sort_opt1');
+		var sort_selecter02 = new sCombo('.area_rv_all .selection .select_custom.sort_opt2');
+		var sort_selecter03 = new sCombo('.area_rv_all .selection .select_custom.sort_opt3');
+		var sort_selecter04 = new sCombo('.area_rv_all .selection .select_custom.sort_opt4');
+	
+		//착용정보 통계
+		$('.average .part_average .percent').each(function(){
+			var reviewRatio = $(this).text();
+			if (reviewRatio == '0%'){
+				$(this).parents('div dl dd').find('.ratio .progbar').attr('style', 'width:0; margin-left:-8px');
+			} else {
+				$(this).parents('div dl dd').find('.ratio .progbar').attr('style', 'width:' + reviewRatio);
+			}
+		});
+		
+		fnGetList();
+		
+	});
+	
+/*]]>*/
+</script>
+ </html>

+ 105 - 78
src/main/webapp/WEB-INF/views/web/goods/GoodsIncludeFormWeb.html

@@ -84,8 +84,8 @@
 				<div class="tab_detail_nav">
 					<ul>
 						<li class="active"><a href="javascript:void(0)">상세정보</a></li>
-						<li><a href="javascript:void(0)">리뷰<em>(9,999+)</em></a></li>
-						<li><a href="javascript:void(0)">문의<em>(9,999+)</em></a></li>
+						<li><a href="javascript:void(0)">리뷰<em>(<th:block  th:text="${(goodsReviewCnt <= 9999) ? #numbers.formatInteger(goodsReviewCnt, 0,'COMMA')  : '9,999+'}"></th:block>)</em></a></li>
+						<li><a href="javascript:void(0)">문의<em>(<th:block  th:text="${(goodsQnaCnt <= 9999) ? #numbers.formatInteger(goodsQnaCnt, 0,'COMMA')  : '9,999+'}"></th:block>)</em></a></li>
 						<li><a href="javascript:void(0)">배송/교환/반품</em></a></li>
 					</ul>
 				</div>
@@ -94,7 +94,7 @@
 				<div class="tab_detail_cont pd_dealitem" style="display:block;" >
 					<div class="itemsGrp" th:if="${goodsDealComposeList  != null and !goodsDealComposeList.empty}">
 						<!--  반복 -->
-						<div class="item_prod" th:each="goodsInfo, status : ${goodsDealComposeList}" th:attr="aria-disabled=${(goodsInfo.stockQty <= 0)? 'true':''}, data-soldout=${(goodsInfo.stockQty <= 0)? 'true':''}">
+						<div class="item_prod" th:each="goodsInfo, status : ${goodsDealComposeList}">
 							<div class="item_state">
 								<a href="javascript:void(0);" class="itemLink" th:onclick="cfGoodsDeailDetail([[${goodsInfo.goodsCd}]],[[${goodsInfo.compsGoodsCd}]])">
 									<div class="shape ranker">
@@ -128,29 +128,31 @@
 											<div class="item_state">
 												<a href="javascript:void(0)" class="itemLink">
 													<div class="itemPic">
-														<img alt="" class="vLHTC pd_img" src="/images/pc/thumb/tmp_pdDetail1.jpg">
+														<img alt="" class="vLHTC pd_img" th:src="${imgGoodsUrl+'/'+goodsInfo.sysImgNm}" th:onerror="'this.src=\''+@{${uxImgUrl}+ '/images/pc/thumb/bg_item_none.png'}+'\';'">
 													</div>
 													<div class="itemName">선택</div>
 												</a>
 											</div>
 										</div>
 									</div>
-									<ul class="list">
-										<!-- 선택처리 class="selected" / 선택불가 aria-disabled="true" / 품절표기 data-soldout="true" 추가  -->
-										<li class="selected">
+									<ul class="list" th:if="${goodsDealComposeList  != null and !goodsDealComposeList.empty}">
+										<li th:each="goodsInfo, status : ${goodsDealComposeList}" 
+											th:attr="aria-disabled=${(goodsInfo.goodsStat != 'G008_90' or goodsInfo.stockQty <= 0)? 'true':''}, data-soldout=${(goodsInfo.stockQty <= 0)? 'true':''}"
+											th:onclick="fnSelGoodsDealReview([[${goodsInfo.compsGoodsCd}]])" >
 											<div class="item_prod">
 												<div class="item_state">
 													<a href="#none" class="itemLink">
 														<div class="itemPic">
-															<img alt="" class="vLHTC pd_img" src="/images/pc/thumb/tmp_pdDetail1.jpg">
+															<img alt="" class="vLHTC pd_img" th:src="${imgGoodsUrl+'/'+goodsInfo.sysImgNm}" th:onerror="'this.src=\''+@{${uxImgUrl}+ '/images/pc/thumb/bg_item_none.png'}+'\';'">
 														</div>
-														<p class="itemBrand">NBA 키즈</p>
-														<div class="itemName">유니 삼단블록 플리스 집업 유니 삼단블록 플리스 집업 유니 삼단블록 플리스 집업</div>
-														<p class="itemPrice">134,100
-															<span class="itemPrice_original">149,000</span>
-															<span class="itemPercent">30%</span>
+														<p class="itemBrand" th:text="${goodsInfo.brandGroupNm}">BRAND NAME1</p>
+														<div class="itemName" th:text="${goodsInfo.goodsFullNm}">남성 </div>
+														<p class="itemPrice"><th:block th:text="${#numbers.formatInteger(goodsInfo.currPrice, 0,'COMMA')}"> 134,100</th:block>
+															<span class="itemPrice_original" th:if="${goodsInfo.listPrice > goodsInfo.currPrice}" th:text="${#numbers.formatInteger(goodsInfo.listPrice, 0,'COMMA')}">149,000</span>
+															<span class="itemPercent" th:if="${goodsInfo.dcRate > 0}" th:text="|${#numbers.formatDecimal(goodsInfo.dcRate,0,0)}%|">30%</span>
 														</p>
 													</a>
+													<input type="hidden" name="selectGoods" th:value="${goodsInfo.compsGoodsCd}" />
 												</div>
 											</div>
 										</li> 
@@ -160,8 +162,7 @@
 						</div>
 						<!-- //아이템선택 -->
 					</div>
-					<div class="cont_body">
-						아이템별 상품리뷰 목록
+					<div class="cont_body" id="goodsDealReview">
 					</div>
 				</div>
 				<!-- //상품리뷰 리스트 -->
@@ -178,41 +179,41 @@
 											<div class="item_state">
 												<a href="javascript:void(0)" class="itemLink">
 													<div class="itemPic">
-														<img alt="" class="vLHTC pd_img" src="/images/pc/thumb/tmp_pdDetail1.jpg">
+														<img alt="" class="vLHTC pd_img" th:src="${imgGoodsUrl+'/'+goodsInfo.sysImgNm}" th:onerror="'this.src=\''+@{${uxImgUrl}+ '/images/pc/thumb/bg_item_none.png'}+'\';'">
 													</div>
 													<div class="itemName">선택</div>
 												</a>
 											</div>
 										</div>
 									</div>
-									<ul class="list">
-										<!-- 선택처리 class="selected" / 선택불가 aria-disabled="true" / 품절표기 data-soldout="true" 추가  -->
-										<li class="selected">
+									<ul class="list" th:if="${goodsDealComposeList  != null and !goodsDealComposeList.empty}">
+										<li th:each="goodsInfo, status : ${goodsDealComposeList}" 
+											th:attr="aria-disabled=${(goodsInfo.goodsStat != 'G008_90' or goodsInfo.stockQty <= 0)? 'true':''}, data-soldout=${(goodsInfo.stockQty <= 0)? 'true':''}"
+											th:onclick="fnSelGoodsDealQna([[${goodsInfo.compsGoodsCd}]])" >
 											<div class="item_prod">
 												<div class="item_state">
 													<a href="#none" class="itemLink">
 														<div class="itemPic">
-															<img alt="" class="vLHTC pd_img" src="/images/pc/thumb/tmp_pdDetail1.jpg">
+															<img alt="" class="vLHTC pd_img" th:src="${imgGoodsUrl+'/'+goodsInfo.sysImgNm}" th:onerror="'this.src=\''+@{${uxImgUrl}+ '/images/pc/thumb/bg_item_none.png'}+'\';'">
 														</div>
-														<p class="itemBrand">NBA 키즈</p>
-														<div class="itemName">유니 삼단블록 플리스 집업 유니 삼단블록 플리스 집업 유니 삼단블록 플리스 집업</div>
-														<p class="itemPrice">134,100
-															<span class="itemPrice_original">149,000</span>
-															<span class="itemPercent">30%</span>
+														<p class="itemBrand" th:text="${goodsInfo.brandGroupNm}">BRAND NAME1</p>
+														<div class="itemName" th:text="${goodsInfo.goodsFullNm}">남성 </div>
+														<p class="itemPrice"><th:block th:text="${#numbers.formatInteger(goodsInfo.currPrice, 0,'COMMA')}"> 134,100</th:block>
+															<span class="itemPrice_original" th:if="${goodsInfo.listPrice > goodsInfo.currPrice}" th:text="${#numbers.formatInteger(goodsInfo.listPrice, 0,'COMMA')}">149,000</span>
+															<span class="itemPercent" th:if="${goodsInfo.dcRate > 0}" th:text="|${#numbers.formatDecimal(goodsInfo.dcRate,0,0)}%|">30%</span>
 														</p>
 													</a>
+													<input type="hidden" name="selectGoods" th:value="${goodsInfo.compsGoodsCd}" />
 												</div>
 											</div>
 										</li> 
-										
 									</ul>
 								</div>
 							</div>
 						</div>
 						<!-- //아이템선택 -->
 					</div>
-					<div class="cont_body">
-						아이템별 상품문의 목록
+					<div class="cont_body" id="goodsDealQna">
 					</div>
 				</div>
 				<!-- //상품문의 리스트 -->
@@ -229,29 +230,31 @@
 											<div class="item_state">
 												<a href="javascript:void(0)" class="itemLink">
 													<div class="itemPic">
-														<img alt="" class="vLHTC pd_img" src="/images/pc/thumb/tmp_pdDetail1.jpg">
+														<img alt="" class="vLHTC pd_img" th:src="${imgGoodsUrl+'/'+goodsInfo.sysImgNm}" th:onerror="'this.src=\''+@{${uxImgUrl}+ '/images/pc/thumb/bg_item_none.png'}+'\';'">
 													</div>
 													<div class="itemName">선택</div>
 												</a>
 											</div>
 										</div>
 									</div>
-									<ul class="list">
-										<!-- 선택처리 class="selected" / 선택불가 aria-disabled="true" / 품절표기 data-soldout="true" 추가  -->
-										<li class="selected">
+									<ul class="list" th:if="${goodsDealComposeList  != null and !goodsDealComposeList.empty}">
+										<li th:each="goodsInfo, status : ${goodsDealComposeList}" 
+											th:attr="aria-disabled=${(goodsInfo.goodsStat != 'G008_90' or goodsInfo.stockQty <= 0)? 'true':''}, data-soldout=${(goodsInfo.stockQty <= 0)? 'true':''}"
+											th:onclick="fnSelGoodsDealDelivery([[${goodsInfo.compsGoodsCd}]])" >
 											<div class="item_prod">
 												<div class="item_state">
 													<a href="#none" class="itemLink">
 														<div class="itemPic">
-															<img alt="" class="vLHTC pd_img" src="/images/pc/thumb/tmp_pdDetail1.jpg">
+															<img alt="" class="vLHTC pd_img" th:src="${imgGoodsUrl+'/'+goodsInfo.sysImgNm}" th:onerror="'this.src=\''+@{${uxImgUrl}+ '/images/pc/thumb/bg_item_none.png'}+'\';'">
 														</div>
-														<p class="itemBrand">NBA 키즈</p>
-														<div class="itemName">유니 삼단블록 플리스 집업 유니 삼단블록 플리스 집업 유니 삼단블록 플리스 집업</div>
-														<p class="itemPrice">134,100
-															<span class="itemPrice_original">149,000</span>
-															<span class="itemPercent">30%</span>
+														<p class="itemBrand" th:text="${goodsInfo.brandGroupNm}">BRAND NAME1</p>
+														<div class="itemName" th:text="${goodsInfo.goodsFullNm}">남성 </div>
+														<p class="itemPrice"><th:block th:text="${#numbers.formatInteger(goodsInfo.currPrice, 0,'COMMA')}"> 134,100</th:block>
+															<span class="itemPrice_original" th:if="${goodsInfo.listPrice > goodsInfo.currPrice}" th:text="${#numbers.formatInteger(goodsInfo.listPrice, 0,'COMMA')}">149,000</span>
+															<span class="itemPercent" th:if="${goodsInfo.dcRate > 0}" th:text="|${#numbers.formatDecimal(goodsInfo.dcRate,0,0)}%|">30%</span>
 														</p>
 													</a>
+													<input type="hidden" name="selectGoods" th:value="${goodsInfo.compsGoodsCd}" />
 												</div>
 											</div>
 										</li> 
@@ -261,8 +264,7 @@
 						</div>
 						<!-- //아이템선택 -->
 					</div>
-					<div class="cont_body">
-						아이템별 배송/교환/반품 정보
+					<div class="cont_body" id="goodsDealDelivery">
 					</div>
 				</div>
 				<!-- //배송/교환/반품 정보 -->
@@ -288,7 +290,8 @@
 											</div>
 											<ul class="list" th:if="${goodsDealComposeList  != null and !goodsDealComposeList.empty}">
 												<th:block th:each="goodsInfo, status : ${goodsDealComposeList}" th:attr="aria-disabled=${(goodsInfo.goodsStat != 'G008_90' or goodsInfo.stockQty <= 0)? 'true':''}, data-soldout=${(goodsInfo.stockQty <= 0)? 'true':''}">
-												<li  th:onclick="fnOption1('Down', [[${goodsInfo.compsGoodsCd}]]);">
+												<li  th:onclick="fnOption1('Down', [[${goodsInfo.compsGoodsCd}]], [[${goodsInfo.currPrice}]] , [[${goodsInfo.selfGoodsYn}]]);"
+														th:attr="aria-disabled=${(goodsInfo.goodsStat != 'G008_90')? 'true':''}, data-soldout=${(goodsInfo.goodsStat != 'G008_90')? 'true':''}">
 													<div class="item_prod">
 														<div class="item_state">
 															<a href="javascript:void(0);" class="itemLink">
@@ -302,6 +305,7 @@
 																	<span class="itemPercent" th:if="${goodsInfo.dcRate > 0}" th:text="|${#numbers.formatDecimal(goodsInfo.dcRate,0,0)}%|">30%</span>
 																</p>
 															</a>
+															<input type="hidden" name="selectGoods" th:attr="goodsNm=${'[상품'+status.count+']' +goodsInfo.goodsFullNm}, currPrice=${goodsInfo.currPrice}, goodsCd=${goodsInfo.compsGoodsCd}" />
 														</div>
 													</div>
 												</li>
@@ -332,61 +336,33 @@
 								</div>
 						</div>
 						<div class="opt_result">
-							<div class="result_item">
-								<div class="opt_header">
-									<span class="item_name">[상품1] 남성 테이퍼드핏 기모면 올밴딩 팬트</span>
-									<span class="item_option">다크그레이/XXL</span>
-								</div>
-								<div class="number_count">
-									<span class="minus min_val"><em class="sr-only">감소</em></span>
-									<input type="text" name="" maxlength="3" style="ime-mode:disabled" value="1">
-									<span class="plus"><em class="sr-only">추가</em></span>
-								</div>
-								<div class="item_price">
-									<p><em>99,999,999</em>원</p>
-								</div>
-								<button type="button" class="btn_delete_item"><span>삭제</span></button>
-							</div>
-							<div class="result_item">
-								<div class="opt_header">
-									<span class="item_name">[상품1] 남성 테이퍼드핏 기모면 올밴딩 팬트</span>
-									<span class="item_option">블루그레이/S</span>
-								</div>
-								<div class="number_count">
-									<span class="minus min_val"><em class="sr-only">감소</em></span>
-									<input type="text" name="" maxlength="3" style="ime-mode:disabled" value="1">
-									<span class="plus"><em class="sr-only">추가</em></span>
-								</div>
-								<div class="item_price">
-									<p><em>99,999,999</em>원</p>
-								</div>
-								<button type="button" class="btn_delete_item"><span>삭제</span></button>
-							</div>
 						</div>
 					</div>
 					<div class="price_box">
 						<p class="number">
-							총&nbsp;<span>99</span>개
+							총&nbsp;<span>0</span>개
 						</p>
 						<p class="price">
 							<span>
-								99,999,999<em>원</em>
+								0<em>원</em>
 							</span>
 						</p>
 					</div>
 					<div class="btn_box">
 						<div class="btn_group_block ui_row">
+						<th:block  th:if="${goodsInfo.stockQty > 0}">
 							<div class="ui_col_6">
-								<button type="button" id="btn_add_cart" class="btn btn_dark btn_block"><span>쇼핑백</span></button>
+								<button type="button" class="btn btn_dark btn_block" id="btnGoodsWish" onclick="fnAddCart('C');"><span>쇼핑백</span></button>
 							</div>
 							<div class="ui_col_6">
-								<button type="button"  class="btn btn_primary btn_block" id=""><span>바로구매</span></button>
+								<button type="button" class="btn btn_primary btn_block" id="btnGoodsCart" onclick="fnAddCart('O');"><span>바로구매</span></button>
 							</div>
-						</div>
-						<div class="btn_group_block ui_row">
+						</th:block>
+						<th:block  th:unless="${goodsInfo.stockQty > 0}">
 							<div class="ui_col_12">
-								<button type="button" class="btn btn_dark btn_block" id="" disabled=""><span>SOLD OUT</span></button>
+								<button type="button" class="btn btn_dark btn_block" disabled=""><span>SOLD OUT</span></button>
 							</div>
+						</th:block>
 						</div>
 					</div>
 				</div>
@@ -397,7 +373,58 @@
 <script th:inline="javascript">
 /*<![CDATA[*/
 		
+	// 구성 상품 상세 상품평
+	var fnGoodsDetailReview = function(params) {
+		gagajf.ajaxSubmit("/goods/detail/review/frame", "html", "goodsDealReview", params);
+	}
 	
+	// 상품평 상품선택시
+	var fnSelGoodsDealReview = function(goodsCd){
+		var params = new Object();
+		params.goodsCd = goodsCd;
+		fnGoodsDetailReview(params);  // ajax html
+	}
+	
+	// 구성 상품 상세 문의
+	var fnGoodsDetailQna = function(params) {
+		gagajf.ajaxSubmit("/goods/detail/qna/frame", "html", "goodsDealQna", params);
+	}
+	
+	// 문의 상품선택시
+	var fnSelGoodsDealQna = function(goodsCd){
+		var params = new Object();
+		params.goodsCd = goodsCd;
+		fnGoodsDetailQna(params);  // ajax html
+	}
+	
+	// 구성 상품 상세 배송정보
+	var fnGoodsDetailDelivery = function(params) {
+		gagajf.ajaxSubmit("/goods/detail/delivery/frame", "html", "goodsDealDelivery", params);
+	}
+	
+	// 배송정보 상품선택시
+	var fnSelGoodsDealDelivery = function(goodsCd){
+		var params = new Object();
+		params.goodsCd = goodsCd;
+		fnGoodsDetailDelivery(params);  // ajax html
+	}
+
+	$(document).ready( function() {
+
+		//var params = new Object();
+		//let goodsCd = $('.tab_detail_cont.pd_delivery').find('.combo .select').find('input[name=selectGoods]').val();
+		//params.goodsCd = goodsCd;
+		
+		// 배송정보 
+		//fnGoodsDetailDelivery(params);  // ajax html
+		
+		// 상품문의
+		//fnGoodsDetailQna(params);  // ajax html
+		
+		// 상품평
+		//fnGoodsDetailReview(params);  // ajax html
+		
+	});
 /*]]>*/
 </script>
 

+ 12 - 121
src/main/webapp/WEB-INF/views/web/goods/GoodsQnaFormWeb.html

@@ -38,134 +38,25 @@
 		</div>
 		<!-- //해당 상품 -->
 	</div>
-	<div class="full_pop_container">
-		<!-- 상품문의 리스트 내용 -->
-		<div class="pd_qnalist">
-		<form id="goodsQnaForm" name="goodsQnaForm" action="#" th:action="@{'/goods/qna/list'}">
-		<input type="hidden" name="pageNo" value ="1"/>
-		<input type="hidden" name="pageSize" value ="20"/>
-		<input type="hidden" name="relGoodsCd" th:value ="${goodsInfo.goodsCd}"/>
-			<div class="info_txt">
-				<ul>
-					<li>상품에 대해 궁금한 점이 있으시다면 문의해주세요.</li>
-					<li>배송, 주문/결제, 취소/반품/교환/환불, 회원, 쿠폰/포인트, 이벤트 등의 자세한 문의사항은 고객센터 > 1:1문의를 이용하여 주시기 바랍니다.</li>
-				</ul>			  
-				<div class="btn_box">
-					<button type="button" class="btn btn_default" onclick="cfnGoToPage(_PAGE_GOODS_QNA);"><span>고객센터 1:1문의</span></button>
-					<button type="button" class="btn btn_dark" th:onclick="cfGoodsQngCreate([[${goodsInfo.goodsCd}]] )"><span>상품 문의하기</span></button>
-				</div>	 
-			</div>
-			<div class="qna_list">
-				<!-- 나열조건결과 있을 때 노출 내용 -->
-				<div class="form_field">
-					<input id="except_secret" name="except_secret" type="checkbox"  onclick="fnGetList();"><label for="except_secret"><span>비밀글제외</span></label>
-					<input  type="hidden" name="secretYn" >
-				</div>
-				<div class="ui_row">
-					<div class="foldGroup case1">
-						<ul id="ulGoodsQna">
-						</ul>
-					</div>
-				</div>
-				<div class="ui_foot">
-					<div class="ui_row">
-						<ul class="pageNav" id="pageNav">
-						</ul>
-					</div>			
-				</div>
-				<!-- //나열조건결과 있을 때 노출 내용 -->
-				<!-- 나열조건결과 없을 때 노출 내용 -->
-				<div class="nodata" style="display:none;">
-					<div class="txt_box">
-						<p>
-							등록된 상품문의가 없습니다.
-						</p>
-					</div>
-				</div>
-				<!-- //나열조건결과 없을 때 노출 내용 -->
-			</div>
-		</form>	
-		</div>
+	<div class="full_pop_container" id="goodsDealQna">
 	</div>
 </div>
-<script src="/ux/plugins/gaga/gaga.paging.js"></script>
 <script th:inline="javascript">
 /*<![CDATA[*/
-	
-	var fnGetList = function() {
-
-		$('#goodsQnaForm  input[name="secretYn"]').val('');
-		if ($("#goodsQnaForm input:checkbox[name=except_secret]").is(':checked')){
-			$('#goodsQnaForm  input[name="secretYn"]').val('N');
-		}
-		// Initialize a pagination
-		gagaPaging.init('goodsQnaForm', fnGetListCallback, 'pageNav', 20);
-
-		// Load data
-		gagaPaging.load(1);
+	// 구성 상품 상세 문의
+	var fnGoodsDetailQna = function(params) {
+		gagajf.ajaxSubmit("/goods/detail/qna/frame", "html", "goodsDealQna", params);
 	}
 	
-	var fnGetListCallback = function(result) {
-		$('#ulGoodsQna').html('');
-		$('.nodata').hide();
-		// 목록
-		if (result.dataList != null && result.dataList.length > 0) {
-			
-			$.each(result.dataList, function(idx, item) {
-				let tag = '<li class="'+ (item.selfGb == 1 ? "my_qna" : "") +'">\n';  // <!-- 내가 쓴 글에 클래스 my_qna 추가 -->
-				tag += '	<div class="fold_head">\n';
-				tag += '		<a href="javascript:void(0)">\n';
-				tag += '			<div>\n';
-				tag += '				<span class="fold_state ' + (item.ansStat == "G060_10" ? "doing" : "done") + '">' + item.ansStatNm + '</span>\n'; //답변완료 : done / 처리중 : doing
-				tag += '				<div class="fold_tit">\n';
-				tag += '					<span>' + item.questContent + '</span>\n';
-				if (item.selfGb == 1){
-				tag += '					<i class="ico ico_myqna"></i>\n';	//내가 쓴 글에 추가되는 아이콘
-				}
-				if (item.secretYn == "Y"){
-				tag += '					<i class="ico ico_secret"></i>\n';	//비밀글에 추가되는 아이콘
-				}
-				tag += '				</div>\n';
-				tag += '				<div class="data">\n';
-				tag += '					<span class="wr_id">'+ item.maskingCustId+'</span>\n';
-				tag += '					<span class="wr_data">' + item.questDt + '</span>\n';
-				tag += '				</div>\n';
-				tag += '			</div>\n';
-				tag += '		</a>\n';
-				tag += '	</div>\n';
-				tag += '	<div class="fold_cont" style="display: none;">\n';
-				tag += '		<div class="fold_detail">\n'; //문의 내용
-				tag += '			<div>\n';
-				tag += '				<p>' + item.questContent + '</p>\n';
-				tag += '			</div>\n';
-				tag += '		</div>\n';
-				
-				if (item.ansStat == 'G060_20') { // 답변완료 상태일 때
-					tag += '	<div class="fold_answer">\n'; //문의 답변
-					tag += '		<div class="answer_head">답변이 등록되었습니다.</div>\n';
-					tag += '		<div class="answer_body">' + item.ansContent + '</div>\n';
-					tag += '		<span class="data">' + item.ansDt + '</span>\n';
-					tag += '	</div>\n';
-				}
-				
-				tag += '	</div>\n';
-				tag += '</li>\n';
-				
-				$('#ulGoodsQna').append(tag);
-			});
-		} else {
-			$('.nodata').show();
-			$('.ui_foot').hide();
-		}
+	$(document).ready( function() {
 
-		// Create pagination
-		gagaPaging.createPagination(result.paging.pageable);
-	}
-	
-	$(document).ready(function() {
-		fnGetList();
-	});
-	
+		// 상품평정보 
+		var params = new Object();
+		let goodsCd = [[${goodsInfo.goodsCd}]]
+		params.goodsCd = goodsCd;
+		fnGoodsDetailQna(params);  // ajax html
+		
+	});	
 /*]]>*/
 </script>
 

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

@@ -38,650 +38,26 @@
 		</div>
 		<!-- //해당 상품 -->
 	</div>
-	<div class="full_pop_container">
-		 <!-- 상품리뷰 리스트 내용 -->
-		 <div class="pd_review">
-			<!-- 등록리뷰 없을 시 -->
-			<div class="area_rv_empty" th:if="${reviewList == null or reviewList.empty}">
-				<div class="txt_box">
-					<p>
-						지금 첫 리뷰를 작성하고<br>
-						<span class="c_primary">스타일포인트 적립</span> 받으세요!
-					</p>
-					<dl>
-						<div>
-							<dt>일반리뷰</dt>
-							<dd th:text="|${#numbers.formatInteger(reviewPoint.textReviewPoint, 0,'COMMA')}P|">0P</dd>
-						</div>
-						<div>
-							<dt>포토/영상 리뷰</dt>
-							<dd th:text="|${#numbers.formatInteger(reviewPoint.photoReviewPoint, 0,'COMMA')}P|">0P</dd>
-						</div>
-						<div>
-							<dt>베스트 리뷰</dt>
-							<dd th:text="|${#numbers.formatInteger(reviewPoint.bestReviewPoint, 0,'COMMA')}P|">0P</dd>
-						</div>
-					</dl>
-				</div>
-				<div class="btn_box">
-					<button class="btn btn_dark"><span>지금 리뷰 작성하기</span></button>
-				</div>
-			</div>
-			<!-- //등록리뷰 없을 시 -->
-			<!-- 등록리뷰 있을 시 -->
-			<div class="area_rv_average" th:if="${reviewList != null and !reviewList.empty}">
-				<h6 class="sr-only">구매평점</h6>
-				<div class="star_score">
-					<span class="tit">구매평점</span>
-					<span class="score" th:text="${goodsInfo.score}">4.3</span>
-					<span class="star" th:with="starScore=${#numbers.formatDecimal((goodsInfo.score*100/5), 0,0)}">
-						<em class="progbar" th:style="${'width:'+starScore+'%;' }"></em> <!-- 평점 style로 표기 -->
-					</span>
-				</div>
-				<!-- 착용정보 있을 시 노출 -->
-				<th:block th:if="${not #strings.isEmpty(goodsInfo.sizeGb)}">
-				<div class="average">
-					<div class="part_average">
-						<span class="tit">사이즈</span>
-						<dl th:with="scoreSize1=${#numbers.formatDecimal((goodsInfo.scoreSize1*100/goodsInfo.reviewRegCnt), 0,0)}
-									, scoreSize2=${#numbers.formatDecimal((goodsInfo.scoreSize2*100/goodsInfo.reviewRegCnt), 0,0)}
-									, scoreSize3=${#numbers.formatDecimal((goodsInfo.scoreSize3*100/goodsInfo.reviewRegCnt), 0,0)}">
-							<div th:class="${(scoreSize1 >= scoreSize2 and scoreSize1 >= scoreSize3) ? 'on' : ''}">
-								<dt>작음</dt>
-								<dd>
-									<span class="ratio">
-										<em class="progbar"></em>
-									</span>
-									<span class="percent"><th:block th:text="${scoreSize1}"></th:block>%</span>
-								</dd>
-							</div> 
-							<div th:class="${(scoreSize2 >= scoreSize1 and scoreSize2 >= scoreSize3) ? 'on' : ''}">
-								<dt>딱맞음</dt>
-								<dd>
-									<span class="ratio">
-										<em class="progbar"></em>
-									</span>
-									<span class="percent"><th:block th:text="${scoreSize2}"></th:block>%</span>
-								</dd>
-							</div>
-							<div th:class="${(scoreSize3 >= scoreSize1 and scoreSize3 >= scoreSize2) ? 'on' : ''}">
-								<dt>큼</dt>
-								<dd>
-									<span class="ratio">
-										<em class="progbar"></em>
-									</span>
-									<span class="percent"><th:block th:text="${scoreSize3}"></th:block>%</span>
-								</dd>
-							</div>
-						</dl>
-					</div>
-					<div class="part_average">
-						<span class="tit">컬러</span>
-						<dl th:with="scoreColor1=${#numbers.formatDecimal((goodsInfo.scoreColor1*100/goodsInfo.reviewRegCnt), 0,0)}
-									, scoreColor2=${#numbers.formatDecimal((goodsInfo.scoreColor2*100/goodsInfo.reviewRegCnt), 0,0)}
-									, scoreColor3=${#numbers.formatDecimal((goodsInfo.scoreColor3*100/goodsInfo.reviewRegCnt), 0,0)}">
-							<div th:class="${(scoreColor1 >= scoreColor2 and scoreColor1 >= scoreColor3) ? 'on' : ''}">
-								<dt>밝음</dt>
-								<dd>
-									<span class="ratio">
-										<em class="progbar"></em>
-									</span>
-									<span class="percent"><th:block th:text="${scoreColor1}"></th:block>%</span>
-								</dd>
-							</div> 
-							<div th:class="${(scoreColor2 >= scoreColor1 and scoreColor2 >= scoreColor3) ? 'on' : ''}">
-								<dt>똑같음</dt>
-								<dd>
-									<span class="ratio">
-										<em class="progbar"></em>
-									</span>
-									<span class="percent"><th:block th:text="${scoreColor2}"></th:block>%</span>
-								</dd>
-							</div>
-							<div th:class="${(scoreColor3 >= scoreColor1 and scoreColor3 >= scoreColor2) ? 'on' : ''}">
-								<dt>어두움</dt>
-								<dd>
-									<span class="ratio">
-										<em class="progbar"></em>
-									</span>
-									<span class="percent"><th:block th:text="${scoreColor3}"></th:block>%</span>
-								</dd>
-							</div>
-						</dl>
-					</div>
-					<th:block th:if="${goodsInfo.sizeGb == 'T' or goodsInfo.sizeGb == 'B'}">
-					<div class="part_average">
-						<span class="tit">핏</span>
-						<dl th:with="scoreFit1=${#numbers.formatDecimal((goodsInfo.scoreFit1*100/goodsInfo.reviewRegCnt), 0,0)}
-									, scoreFit2=${#numbers.formatDecimal((goodsInfo.scoreFit2*100/goodsInfo.reviewRegCnt), 0,0)}
-									, scoreFit3=${#numbers.formatDecimal((goodsInfo.scoreFit3*100/goodsInfo.reviewRegCnt), 0,0)}">
-							<div th:class="${(scoreFit1 >= scoreFit2 and scoreFit1 >= scoreFit3) ? 'on' : ''}">
-								<dt>슬림</dt>
-								<dd>
-									<span class="ratio">
-										<em class="progbar"></em>
-									</span>
-									<span class="percent"><th:block th:text="${scoreFit1}"></th:block>%</span>
-								</dd>
-							</div> 
-							<div th:class="${(scoreFit2 >= scoreFit1 and scoreFit2 >= scoreFit3) ? 'on' : ''}">
-								<dt>레귤러</dt>
-								<dd>
-									<span class="ratio">
-										<em class="progbar"></em>
-									</span>
-									<span class="percent"><th:block th:text="${scoreFit2}"></th:block>%</span>
-								</dd>
-							</div>
-							<div th:class="${(scoreFit3 >= scoreFit1 and scoreFit3 >= scoreFit2) ? 'on' : ''}">
-								<dt>오버</dt>
-								<dd>
-									<span class="ratio">
-										<em class="progbar"></em>
-									</span>
-									<span class="percent"><th:block th:text="${scoreFit3}"></th:block>%</span>
-								</dd>
-							</div>
-						</dl>
-					</div>
-					<div class="part_average">
-						<span class="tit">두께감</span>
-						<dl th:with="scoreThick1=${#numbers.formatDecimal((goodsInfo.scoreThick1*100/goodsInfo.reviewRegCnt), 0,0)}
-									, scoreThick2=${#numbers.formatDecimal((goodsInfo.scoreThick2*100/goodsInfo.reviewRegCnt), 0,0)}
-									, scoreThick3=${#numbers.formatDecimal((goodsInfo.scoreThick3*100/goodsInfo.reviewRegCnt), 0,0)}">
-							<div th:class="${(scoreThick1 >= scoreThick2 and scoreThick1 >= scoreThick3) ? 'on' : ''}">
-								<dt>얇음</dt>
-								<dd>
-									<span class="ratio">
-										<em class="progbar"></em>
-									</span>
-									<span class="percent"><th:block th:text="${scoreThick1}"></th:block>%</span>
-								</dd>
-							</div> 
-							<div th:class="${(scoreThick2 >= scoreThick1 and scoreThick2 >= scoreThick3) ? 'on' : ''}">
-								<dt>적당함</dt>
-								<dd>
-									<span class="ratio">
-										<em class="progbar"></em>
-									</span>
-									<span class="percent"><th:block th:text="${scoreThick2}"></th:block>%</span>
-								</dd>
-							</div>
-							<div th:class="${(scoreThick3 >= scoreThick1 and scoreThick3 >= scoreThick2) ? 'on' : ''}">
-								<dt>도톰함</dt>
-								<dd>
-									<span class="ratio">
-										<em class="progbar"></em>
-									</span>
-									<span class="percent"><th:block th:text="${scoreThick3}"></th:block>%</span>
-								</dd>
-							</div>
-						</dl>
-					</div>
-					</th:block>
-					<th:block  th:if="${goodsInfo.sizeGb == 'S'}">
-					<div class="part_average">
-						<span class="tit">무게감</span>
-						<dl th:with="scoreWeight1=${#numbers.formatDecimal((goodsInfo.scoreWeight1*100/goodsInfo.reviewRegCnt), 0,0)}
-									, scoreWeight2=${#numbers.formatDecimal((goodsInfo.scoreWeight2*100/goodsInfo.reviewRegCnt), 0,0)}
-									, scoreWeight3=${#numbers.formatDecimal((goodsInfo.scoreWeight3*100/goodsInfo.reviewRegCnt), 0,0)}">
-							<div th:class="${(scoreWeight1 >= scoreWeight2 and scoreWeight1 >= scoreWeight3) ? 'on' : ''}">
-								<dt>가벼움</dt>
-								<dd>
-									<span class="ratio">
-										<em class="progbar"></em>
-									</span>
-									<span class="percent"><th:block th:text="${scoreWeight1}"></th:block>%</span>
-								</dd>
-							</div> 
-							<div th:class="${(scoreWeight2 >= scoreWeight1 and scoreWeight2 >= scoreWeight3) ? 'on' : ''}">
-								<dt>적당함</dt>
-								<dd>
-									<span class="ratio">
-										<em class="progbar"></em>
-									</span>
-									<span class="percent"><th:block th:text="${scoreWeight2}"></th:block>%</span>
-								</dd>
-							</div>
-							<div th:class="${(scoreWeight3 >= scoreWeight1 and scoreWeight3 >= scoreWeight2) ? 'on' : ''}">
-								<dt>무거움</dt>
-								<dd>
-									<span class="ratio">
-										<em class="progbar"></em>
-									</span>
-									<span class="percent"><th:block th:text="${scoreWeight3}"></th:block>%</span>
-								</dd>
-							</div>
-						</dl>
-					</div>
-					<div class="part_average">
-						<span class="tit">볼너비</span>
-						<dl th:with="scoreBall1=${#numbers.formatDecimal((goodsInfo.scoreBall1*100/goodsInfo.reviewRegCnt), 0,0)}
-									, scoreBall2=${#numbers.formatDecimal((goodsInfo.scoreBall2*100/goodsInfo.reviewRegCnt), 0,0)}
-									, scoreBall3=${#numbers.formatDecimal((goodsInfo.scoreBall3*100/goodsInfo.reviewRegCnt), 0,0)}">
-							<div th:class="${(scoreBall1 >= scoreBall2 and scoreBall1 >= scoreBall3) ? 'on' : ''}">
-								<dt>작음</dt>
-								<dd>
-									<span class="ratio">
-										<em class="progbar"></em>
-									</span>
-									<span class="percent"><th:block th:text="${scoreBall1}"></th:block>%</span>
-								</dd>
-							</div> 
-							<div th:class="${(scoreBall2 >= scoreBall1 and scoreBall2 >= scoreBall3) ? 'on' : ''}">
-								<dt>딱맞음</dt>
-								<dd>
-									<span class="ratio">
-										<em class="progbar"></em>
-									</span>
-									<span class="percent"><th:block th:text="${scoreBall2}"></th:block>%</span>
-								</dd>
-							</div>
-							<div th:class="${(scoreBall3 >= scoreBall1 and scoreBall3 >= scoreBall2) ? 'on' : ''}">
-								<dt>큼</dt>
-								<dd>
-									<span class="ratio">
-										<em class="progbar"></em>
-									</span>
-									<span class="percent"><th:block th:text="${scoreBall3}"></th:block>%</span>
-								</dd>
-							</div>
-						</dl>
-					</div>
-					</th:block>
-				</div>
-				</th:block>
-				<!-- //착용정보 있을 시 노출 -->
-				<div class="info_review">
-					<p>
-						<i class="ico_point"></i>상품 리뷰 작성 시 <span>스타일포인트 추가 적립!</span>
-					</p>
-					<dl>
-						<div>
-							<dt>일반리뷰</dt>
-							<dd th:text="|${#numbers.formatInteger(reviewPoint.textReviewPoint, 0,'COMMA')}P|">0P</dd>
-						</div>
-						<div>
-							<dt>포토/영상 리뷰</dt>
-							<dd th:text="|${#numbers.formatInteger(reviewPoint.photoReviewPoint, 0,'COMMA')}P|">0P</dd>
-						</div>
-						<div>
-							<dt>베스트 리뷰</dt>
-							<dd th:text="|${#numbers.formatInteger(reviewPoint.bestReviewPoint, 0,'COMMA')}P|">0P</dd>
-						</div>
-					</dl>
-				</div>
-			</div>
-			<div class="area_rv_best" th:if="${bestReviewList != null and !bestReviewList.empty}">
-				<h6>베스트 리뷰</h6>
-				<div class="btn_arrow">	
-					<div class="swiper-button-prev"></div>  
-					<div class="swiper-button-next"></div>
-				</div>
-				<div class="swiper-container">
-					<div class="swiper-wrapper">
-						<div class="swiper-slide" th:each="bestReview, status : ${bestReviewList}" >
-							<div class="best_review">
-								<a href="javascript:void(0);" th:onclick="cfGoodsReviewDetail([[${goodsInfo.goodsCd}]], 'Y', '', [[${bestReview.reviewSq}]])" >
-									<div class="pic" th:if="${bestReview.reviewAttachList != null and !bestReview.reviewAttachList.empty}">
-										<th:block th:each="reviewAttach, attachStatus : ${bestReview.reviewAttachList}">
-										<span class="thumb" th:classAppend="${(reviewAttach.fileGb == 'M') ? 'mov' :''}" th:style="${'background-image:url('+imgUrl+ reviewAttach.sysFileNm+');'}"></span><!-- 동영상의 썸네일일 경우 mov 클래스 추가 -->
-										</th:block>
-									</div>
-									<div class="pic" th:unless="${bestReview.reviewAttachList != null and !bestReview.reviewAttachList.empty}">
-										<span class="thumb" th:style="${'background-image:url('+imgGoodsUrl+ '/'+goodsInfo.sysImgNm+');'}">
-										</span>
-									</div>
-									<div class="star_score" th:with="starScore=${#numbers.formatDecimal((bestReview.score*100/5), 0,0)}">
-										<span class="star">
-											<em class="progbar" th:style="${'width:'+starScore+'%;' }"></em> <!-- 평점 style로 표기 -->
-										</span>
-										<em class="ico ico_besttag"></em>
-									</div>
-									<div class="txt_best_review">
-										<p th:text="${bestReview.reviewContent}">옷</p>
-									</div>
-								</a>
-							</div>
-						</div>
-					</div>
-					<div class="swiper-pagination"></div>
-				</div>
-			</div>
-			<div class="area_rv_photo"  th:if="${photoReviewList != null and !photoReviewList.empty}">
-				<h6>포토/영상 리뷰</h6>
-				<div class="photo_list">
-					<ul>
-						<li  th:each="photoReview, status : ${photoReviewList}" >
-							<th:block th:if="${photoReview.reviewAttachList != null and !photoReview.reviewAttachList.empty}">
-							<th:block th:each="reviewAttach, attachStatus : ${photoReview.reviewAttachList}" th:if="${attachStatus.first}">
-							
-							<a href="javascript:void(0);" th:onclick="cfGoodsReviewDetail([[${goodsInfo.goodsCd}]], '', 'Y', [[${photoReview.reviewSq}]])">
-								<div class="pic">
-									<span class="thumb" th:classAppend="${(reviewAttach.fileGb == 'M') ? 'mov' :''}" th:style="${'background-image:url('+imgUrl+ reviewAttach.sysFileNm+');'}"></span><!-- 동영상의 썸네일일 경우 mov 클래스 추가 -->
-								</div>
-							</a>
-							</th:block>
-							</th:block>
-						</li>
-						
-					</ul>
-					<!-- 포토영상 게시글 최대 7개 & 버튼노출 -->
-					<th:block th:if="${#lists.size(photoReviewList) >= 1}"> <!-- 나중에 8로 수정 -->
-					<button type="button" id="btn_more_photoreview" th:onclick="cfGoodsReviewPhoto([[${goodsInfo.goodsCd}]])" ><span>더 보기</span></button>
-					<!-- //포토영상 게시글 최대 7개 & 버튼노출 -->
-					</th:block>
-				</div>
-			</div>
-			<div class="area_rv_all">
-			<form id="goodsReviewForm" name="goodsReviewForm" action="#" th:action="@{'/goods/review/list'}">
-			<input type="hidden" name="pageNo" value ="1"/>
-			<input type="hidden" name="pageSize" value ="1"/>
-			<input type="hidden" name="goodsCd" th:value ="${goodsInfo.goodsCd}"/>
-			<input type="hidden" name="goodsType" th:value ="${goodsInfo.goodsType}"/>
-			<input type="hidden" name="reviewScore" />
-			<input type="hidden" name="reviewOption" />
-			<input type="hidden" name="reviewHeight" />
-			<input type="hidden" name="reviewWeight" />
-			
-				<h6>전체리뷰<span>(<span id="reviewCount" th:text="${(reviewCount <= 9999) ? #numbers.formatInteger(reviewCount, 0,'COMMA') : '9,999+'}">9,999+</span>)</span></h6>
-				<div class="selection">
-					<div class="form_field">
-						<div class="select_custom sort_opt1">
-							<div class="combo">
-								<div class="select">평점 전체<input type="hidden" name="selScore" value=""/></div>
-								<ul class="list" onclick="jfReviewSearch();" >
-									<!-- 선택처리 class="selected" -->
-									<li class="selected" >평점 전체<input type="hidden" name="selScore" value=""/></li> 
-									<li>5점&nbsp;&starf;&starf;&starf;&starf;&starf;<input type="hidden" name="selScore" value="5"/></li>
-									<li>4점&nbsp;&starf;&starf;&starf;&starf;<input type="hidden" name="selScore" value="4" scoreId="4"/></li>
-									<li>3점&nbsp;&starf;&starf;&starf;<input type="hidden" name="selScore" value="3"/></li>
-									<li>2점&nbsp;&starf;&starf;<input type="hidden" name="selScore" value="2"/></li>
-									<li>1점&nbsp;&starf;<input type="hidden" name="selScore" value="1"/></li>
-								</ul>
-							</div>
-						</div>
-						<div class="select_custom sort_opt2" th:if="${reviewOptionList != null and !reviewOptionList.empty}">
-							<div class="combo">
-								<th:block th:if="${(goodsInfo.selfGoodsYn == 'Y')}">
-								<div class="select">사이즈 전체<input type="hidden" name="selOption" value=""/></div>
-								</th:block>
-								<th:block th:unless="${(goodsInfo.selfGoodsYn == 'Y')}">
-								<div class="select">옵션 전체<input type="hidden" name="selOption" value=""/></div>
-								</th:block>
-								<ul class="list" onclick="jfReviewSearch();">
-									<!-- 선택처리 class="selected" -->
-									<li class="selected" th:text="${(goodsInfo.selfGoodsYn == 'Y')? '사이즈 전체' :'옵션 전체'}">사이즈 전체</li> 
-									<li th:each="reviewOption, status : ${reviewOptionList}" >
-									<th:block th:text="${reviewOption.optCd2}"></th:block>
-									<input type="hidden" name="selOption" th:value="${reviewOption.optCd2}"/>
-									</li>
-								</ul>
-							</div>
-						</div>
-						<div class="select_custom sort_opt3" th:if="${reviewHeightList != null and !reviewHeightList.empty}">
-							<div class="combo">
-								<div class="select">키 전체<input type="hidden" name="selHeight" value=""/></div>
-								<ul class="list" onclick="jfReviewSearch();">
-									<!-- 선택처리 class="selected" -->
-									<li class="selected">키 전체<input type="hidden" name="selHeight" value=""/></li> 
-									<li th:each="reviewHeight, status : ${reviewHeightList}" >
-									<th:block th:text="${reviewHeight.cdNm}"></th:block>
-									<input type="hidden" name="selHeight" th:value="${reviewHeight.cd}"/>
-									</li>
-								</ul>
-							</div>
-						</div>
-						<div class="select_custom sort_opt4" th:if="${reviewWeightList != null and !reviewWeightList.empty}">
-							<div class="combo">
-								<div class="select">몸무게 전체<input type="hidden" name="selWeight" value=""/></div>
-								<ul class="list" onclick="jfReviewSearch();">
-									<!-- 선택처리 class="selected" -->
-									<li class="selected">몸무게 전체<input type="hidden" name="selWeight" value=""/></li> 
-									<li th:each="reviewWeight, status : ${reviewWeightList}" >
-									<th:block th:text="${reviewWeight.cdNm}"></th:block>
-									<input type="hidden" name="selWeight" th:value="${reviewWeight.cd}"/>
-									</li>
-									
-								</ul>
-							</div>
-						</div>
-					</div>
-				</div>
-				<!-- 나열조건결과 있을 때 노출 내용 -->
-				<div class="review_list">
-					<ul  id="ulGoodsReview">
-					</ul>
-				</div>
-				<div class="ui_row">
-					<ul class="pageNav" id="pageNav">
-					</ul>
-				</div>
-				<!-- //나열조건결과 있을 때 노출 내용 -->
-				<!-- 나열조건결과 없을 때 노출 내용 -->
-				<div class="nodata"  style="display:none;">
-					<div class="txt_box">
-						<p>
-							선택하신 조건에 맞는 리뷰가 없습니다.<br>
-							조건을 변경해 보세요.
-						</p>
-					</div>
-					<div class="btn_box">
-						<button type="button" class="btn btn_default" onclick="jfReviewSearchInit();"><span>선택한 조건 초기화</span></button>
-					</div>
-				</div>
-				<!-- //나열조건결과 없을 때 노출 내용 -->
-			</form>	
-			</div>
-			<!-- //등록리뷰 있을 시 -->
-		</div>
+	<div class="full_pop_container" id="goodsDealReview">
 	</div>			
 </div>
-<script src="/ux/plugins/gaga/gaga.paging.js"></script>
 <script th:inline="javascript">
 /*<![CDATA[*/
 	
-	var fnGetList = function() {
-
-		/* $('#goodsReviewForm  input[name="secretYn"]').val('');
-		if ($("#goodsReviewForm input:checkbox[name=except_secret]").is(':checked')){
-			$('#goodsReviewForm  input[name="secretYn"]').val('N');
-		} */
-		// Initialize a pagination
-		gagaPaging.init('goodsReviewForm', fnGetListCallback, 'pageNav', 1);
-
-		// Load data
-		gagaPaging.load(1);
-	}
-	
-	var fnGetListCallback = function(result) {
-		$('#ulGoodsReview').html('');
-		$('.nodata').hide();
-		$('.ui_row').show();
-		// 목록
-		if (result.dataList != null && result.dataList.length > 0) {
-			
-			$.each(result.dataList, function(idx, item) {
-				let tag = '<li>\n';
-				tag += '<div class="review">\n';
-				tag += '	<div class="info_box">\n';
-				tag += '		<div class="star_score">\n';
-				tag += '			<span class="star">\n';
-				tag += '				<em class="progbar" style="width:'+(item.score*20)+'%;"></em>\n'; //<!-- 평점 style로 표기 -->
-				tag += '			</span>\n';
-				tag += '		</div>\n';
-				tag += '		<div class="writer">\n';
-				tag += '			<span class="wr_id">'+ item.maskingCustId +'</span>\n';
-				tag += '			<span class="wr_date">' + item.regDt + '</span>\n';
-				tag += '		</div>\n';
-				tag += '	</div>\n';
-				tag += '	<div class="response_box">\n';
-				tag += '		<div>\n';
-				tag += '			<dl>\n';
-				tag += '				<div>\n';
-				tag += '					<dt>구매옵션</dt>\n';
-				if (item.goodsOptionList != null && item.goodsOptionList.length > 0){
-					$.each(item.goodsOptionList, function(gIdx, goodsOption){
-				tag += '					<dd>'+ goodsOption.optCd1 +' / '+ goodsOption.optCd2 +'</dd>\n';		
-					});
-				}
-				tag += '				</div>\n';
-				tag += '			</dl>\n';
-				tag += '		</div>\n';
-				tag += '		<div>\n';
-				tag += '			<dl>\n';
-				tag += '				<div>\n';
-				tag += '					<dt>키/몸무게</dt>\n';
-				tag += '					<dd>'+ item.height +'cm/'+ item.weight +'kg</dd>\n';
-				tag += '				</div>\n';
-				if (!gagajf.isNull(item.sizeGb) ){	// 사이즈구분값이 있을경우 노출
-					tag += '				<div>\n';
-					tag += '					<dt>사이즈</dt>\n';
-					tag += '					<dd>'+ item.scoreSizeNm +'</dd>\n';
-					tag += '				</div>\n';
-					tag += '				<div>\n';
-					tag += '					<dt>컬러</dt>\n';
-					tag += '					<dd>'+ item.scoreColorNm +'</dd>\n';
-					tag += '				</div>\n';
-				if (item.sizeGb == 'T' || item.sizeGb == 'B'){
-					tag += '				<div>\n';
-					tag += '					<dt>핏</dt>\n';
-					tag += '					<dd>'+ item.scoreFitNm +'</dd>\n';
-					tag += '				</div>\n';
-					tag += '				<div>\n';
-					tag += '					<dt>두께감</dt>\n';
-					tag += '					<dd>'+ item.scoreThickNm +'</dd>\n';
-					tag += '				</div>\n';	
-				}
-				if (item.sizeGb == 'S' ){
-					tag += '				<div>\n';
-					tag += '					<dt>무게감</dt>\n';
-					tag += '					<dd>'+ item.scoreWeightNm +'</dd>\n';
-					tag += '				</div>\n';
-					tag += '				<div>\n';
-					tag += '					<dt>볼너비</dt>\n';
-					tag += '					<dd>'+ item.scoreBallNm +'</dd>\n';
-					tag += '				</div>\n';	
-				}
-				}
-				tag += '			</dl>\n';
-				tag += '		</div>\n';
-				tag += '	</div>\n';
-				tag += '	<div class="photo_box">\n';
-				tag += '		<div class="photo_list">\n';
-				tag += '			<ul>\n';
-				if (item.reviewAttachList != null && item.reviewAttachList.length > 0){
-					var fileGbClass = '';
-					$.each(item.reviewAttachList, function(aIdx, reviewAttach){
-						fileGbClass = '';
-						if (reviewAttach == "M") fileGbClass = "mov";
-				tag += '				<li>\n';
-				tag += '					<a href="javascript:void();" onclick="cfGoodsReviewDetail(\''+item.goodsCd+'\',\'\', \'Y\',\''+item.reviewSq+'\');">\n';
-				tag += '						<div class="pic">\n';
-				tag += '							<span class="thumb '+ fileGbClass +'" style="background-image:url('+ _imgUrl + reviewAttach.sysFileNm +');"></span>\n'; //<!-- 동영상의 썸네일일 경우 mov 클래스 추가 -->
-				tag += '						</div>\n';
-				tag += '					</a>\n';
-				tag += '				</li>\n';		
-					});	
-				}
-				tag += '			</ul>\n';
-				tag += '		</div>\n';
-				tag += '	</div>\n';
-				tag += '	<div class="txt_review_box">\n';
-				tag += '		<p>' + item.reviewContent +'</p>\n';
-				tag += '	</div>\n';
-				if (!gagajf.isNull(item.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">'+item.admRplDt+'</span>\n';
-					tag += '			</div>\n';
-					tag += '			<div class="reply_txt">\n';
-					tag += '				<p>' + item.admRpl+'</p>\n';
-					tag += '			</div>\n';
-					tag += '		</div>\n';
-					tag += '	</div>\n';	
-				}
-				tag += '</div>\n';
-				tag += '</li>\n';
-				
-				$('#ulGoodsReview').append(tag);
-			});
-		} else {
-			$('.nodata').show();
-			$('.ui_row').hide();
-		}
-
-		// Create pagination
-		gagaPaging.createPagination(result.paging.pageable);
-	}
-	
-	// 상품평 검색조건 클릭시
-	var jfReviewSearch = function(){
-		let reviewScore = $('#goodsReviewForm').find('.select_custom.sort_opt1').find('.select input[name=selScore]').val();
-		let reviewOption = $('#goodsReviewForm').find('.select_custom.sort_opt2').find('.select input[name=selOption]').val();
-		let reviewHeight = $('#goodsReviewForm').find('.select_custom.sort_opt3').find('.select input[name=selHeight]').val();
-		let reviewWeight = $('#goodsReviewForm').find('.select_custom.sort_opt4').find('.select input[name=selWeight]').val();
-		
-		let changFlag = false;
-		if ($('#goodsReviewForm input[name=reviewScore]').val() != reviewScore){
-			changFlag = true;
-		}else if ($('#goodsReviewForm input[name=reviewOption]').val() != reviewOption){
-			changFlag = true;
-		}else if ($('#goodsReviewForm input[name=reviewHeight]').val() != reviewHeight){
-			changFlag = true;
-		}else if ($('#goodsReviewForm input[name=reviewWeight]').val() != reviewWeight){
-			changFlag = true;
-		}
-		
-		$('#goodsReviewForm input[name=reviewScore]').val(reviewScore);
-		$('#goodsReviewForm input[name=reviewOption]').val(reviewOption);
-		$('#goodsReviewForm input[name=reviewHeight]').val(reviewHeight);
-		$('#goodsReviewForm input[name=reviewWeight]').val(reviewWeight);
-		
-		if (changFlag) fnGetList();
-		
-	}
-	
-	// 상품평 초기화
-	var jfReviewSearchInit = function(){
-		
-		$('#goodsReviewForm').find('.select_custom.sort_opt1').find('.list li').eq(0).trigger('click')
-		$('#goodsReviewForm').find('.select_custom.sort_opt2').find('.list li').eq(0).trigger('click')
-		$('#goodsReviewForm').find('.select_custom.sort_opt3').find('.list li').eq(0).trigger('click')
-		$('#goodsReviewForm').find('.select_custom.sort_opt4').find('.list li').eq(0).trigger('click')
-		
-		$('#goodsReviewForm input[name=reviewScore]').val('');
-		$('#goodsReviewForm input[name=reviewOption]').val('');
-		$('#goodsReviewForm input[name=reviewHeight]').val('');
-		$('#goodsReviewForm input[name=reviewWeight]').val('');
-		
-		fnGetList();
+	// 구성 상품 상세 상품평
+	var fnGoodsDetailReview = function(params) {
+		gagajf.ajaxSubmit("/goods/detail/review/frame", "html", "goodsDealReview", params);
 	}
 	
 	$(document).ready( function() {
 
-		var sort_selecter01 = new sCombo('.area_rv_all .selection .select_custom.sort_opt1');
-		var sort_selecter02 = new sCombo('.area_rv_all .selection .select_custom.sort_opt2');
-		var sort_selecter03 = new sCombo('.area_rv_all .selection .select_custom.sort_opt3');
-		var sort_selecter04 = new sCombo('.area_rv_all .selection .select_custom.sort_opt4');
-	
-		//착용정보 통계
-		$('.average .part_average .percent').each(function(){
-			var reviewRatio = $(this).text();
-			if (reviewRatio == '0%'){
-				$(this).parents('div dl dd').find('.ratio .progbar').attr('style', 'width:0; margin-left:-8px');
-			} else {
-				$(this).parents('div dl dd').find('.ratio .progbar').attr('style', 'width:' + reviewRatio);
-			}
-		});
-		
-		fnGetList();
+		// 상품평정보 
+		var params = new Object();
+		let goodsCd = [[${goodsInfo.goodsCd}]]
+		params.goodsCd = goodsCd;
+		fnGoodsDetailReview(params);  // ajax html
 		
 	});
-
-	
 	
 /*]]>*/
 </script>	

+ 0 - 21
src/main/webapp/WEB-INF/views/web/mypage/MypageReviewCreateFormWeb.html

@@ -341,27 +341,6 @@
 															<div class="imgUpload">
 																<label for="fileAdd" class="fileAdd">첫번째업로드</label>
 																<input type="file" id="fileAdd" name="files[]">
-																<input type="hidden" name="file1OrgFileNm"/>
-																<input type="hidden" name="file1SysFileNm"/>
-																<input type="hidden" name="file2OrgFileNm"/>
-																<input type="hidden" name="file2SysFileNm"/>
-																<input type="hidden" name="file3OrgFileNm"/>
-																<input type="hidden" name="file3SysFileNm"/>
-																<input type="hidden" name="file4OrgFileNm"/>
-																<input type="hidden" name="file4SysFileNm"/>
-																<input type="hidden" name="file5OrgFileNm"/>
-																<input type="hidden" name="file5SysFileNm"/>
-																<input type="hidden" name="file6OrgFileNm"/>
-																<input type="hidden" name="file6SysFileNm"/>
-																<input type="hidden" name="file7OrgFileNm"/>
-																<input type="hidden" name="file7SysFileNm"/>
-																<input type="hidden" name="file8OrgFileNm"/>
-																<input type="hidden" name="file8SysFileNm"/>
-																<input type="hidden" name="file9OrgFileNm"/>
-																<input type="hidden" name="file9SysFileNm"/>
-																<input type="hidden" name="file10OrgFileNm"/>
-																<input type="hidden" name="file10SysFileNm"/>
-																
 															</div>
 														</div>
 														<!-- //이미지첨부 -->

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

@@ -49,54 +49,81 @@
 								<div>
 									<ul>
 										<li id="completeReview"><a href="javascript:void(0);" >작성 가능한 리뷰<span th:text="'('+${#numbers.formatInteger(completeReviewCount,0,'COMMA')}+')'"></span></a></li>
-										<li id="alreadyReview"><a href="javascript:void(0);" >내가 쓴 리뷰<span>(2,405)</span></a></li>
+										<li id="alreadyReview"><a href="javascript:void(0);" >내가 쓴 리뷰<span th:text="'('+${#numbers.formatInteger(alreadyReviewCount,0,'COMMA')}+')'"></span></a></li>
 									</ul>
 								</div>
 							</div>
-							<div class="area_list" id="completeList">
-			
-								<!-- //주문번호 기준 상품 내역 -->	
-								<!-- 데이터 없을 시 -->
-																											
+							<div class="check_notice" th:if="${adminCount.count>0}">
+								<p>
+									관리자가 댓글을 남긴 상품평이 있습니다.
+									<a href="javascript:void(0);" th:onclick="fnMove([[${adminCount.reviewSq}]])">
+										바로 확인
+									</a>
+								</p>
 							</div>
-									<div class="nodata">
-									<div class="txt_box">
-										<p>
-											작성 가능한 리뷰가 없습니다.<br>
-										</p>
-									</div>
-								</div>
-								<!-- //데이터 없을 시 -->		
-						</div>
-						<div class="sec_foot">
-							<div class="ui_row">
-								<ul class="pageNav" id="paging">
-								
-								</ul>
+							<div class="area_list" id="reviewList"></div>
+							<div class="sec_foot" id="comNav">
+								<div class="ui_row">
+									<ul class="pageNav" id="paging">
+									
+									</ul>
+								</div>																					
 							</div>
+							<div class="sec_foot" id="alrNav">
+								<div class="ui_row">
+									<ul class="pageNav" id="paging2">
+									
+									</ul>
+								</div>																					
+							</div>
+							<div class="nodata">
+								<div class="txt_box">
+									<p>
+										작성 가능한 리뷰가 없습니다.<br>
+									</p>
+								</div>
+							</div> 
+						
 						</div>
-						<form id="searchForm" name="searchForm" th:action="@{'/mypage/review/list'}" th:method="post">
-							<input type="hidden" name="pageNo" value="1" />
-							<input type="hidden" name="pageSize" value="10" />
-						</form>
+						
+						
 					</div>
 					<!-- // CONT-BODY -->					
 				</div>
 			</div>
+			<form id="searchForm1" name="searchForm1" th:action="@{'/mypage/complete/review/list'}" th:method="post">
+				<input type="hidden" name="pageNo" value="1" />
+				<input type="hidden" name="pageSize" value="10" />
+			</form>
+			<form id="searchForm2" name="searchForm2" th:action="@{'/mypage/already/review/list'}" th:method="post">
+				<input type="hidden" name="pageNo2" value="1" />
+				<input type="hidden" name="pageSize2" value="10" />
+			</form>
 
 	<script src="/ux/plugins/gaga/gaga.paging.js"></script>
 	<script th:inline="javascript">
+	let imageUrl = [[${@environment.getProperty('upload.goods.view')}]];
+	let reviewUrl =[[${@environment.getProperty('upload.image.view')}]];
+	let attachList = [[${alreadyReviewAttach}]];
 	// 작성가능한 리뷰 클릭 시 
 	$("#completeReview").click(function() {
 		$("#alreadyReview").removeClass("active");
 		$("#completeReview").addClass("active");
-		
+		$(".check_notice").hide();
+		$("#alrNav").hide();
+		$("#comNav").show();
+		gagaPaging.init('searchForm1', fnSearchCallback1, 'paging', 10);
+		gagaPaging.load(1);
 	})
 	
 	$("#alreadyReview").click(function() {
 		$("#completeReview").removeClass("active");
 		$("#alreadyReview").addClass("active");
-		
+		$(".check_notice").show();
+		$("#comNav").hide();
+		$("#alrNav").show();
+		gagaPaging.init('searchForm2', fnSearchCallback2, 'paging2', 10);
+		gagaPaging.load(1);
 	})
 	
 	$(document).ready(function() {
@@ -106,26 +133,20 @@
 
 		// 마이페이지 location 설정
 		fnSetMypageLocation('리뷰', '_PAGE_MYPAGE_REVIEW');
-		
-		// Initialize a pagination
-		gagaPaging.init('searchForm', fnSearchCallback, 'paging', 10);
-		
-		// Load data
-		gagaPaging.load(1);
-		
+				
 		// 작성가능한 리뷰표시
 		$("#completeReview").trigger('click');
-
 	
 	});
 	
 	// 주문 목록 조회 콜백
-	var fnSearchCallback = function(result) {
-		$('.nodata').css("display","none");
-		let imageUrl = [[${@environment.getProperty('upload.goods.view')}]];
-		$('#completeList').html('');
-		if (result.dataList != null && result.dataList.length > 0) {
-			$.each(result.dataList, function(idx, item) {
+	var fnSearchCallback1 = function(result) {
+		$('.nodata').hide();
+		
+		$('#reviewList').html('');
+		
+		if (result.dataList1 != null && result.dataList1.length > 0) {
+			$.each(result.dataList1, function(idx, item) {
 				let html = '';
 				html += '<div class="part_goods">                                                                                                  ';
 				html += '	<div class="goods_cont">                                                                                              ';
@@ -135,7 +156,7 @@
 				html += '					<div class="gd_item">	                                                                              ';
 				html += '						<a href="">                                                                                       ';
 				html += '							<span class="thumb">                                                                          ';
-				html += '								<img th:src="' + imageUrl + '/' + item.sysImgNm + '"  width="100%" alt="">  ';
+				html += '								<img src="' + imageUrl + '/' + item.sysImgNm + '"  width="100%" alt="">  ';
 				html += '							</span>                                                                                       ';
 				html += '							<p>                                                                                           ';
 				html += '								<span class="buy_date"><em>'+item.payDt+'</em>&nbsp;구매</span>             ';
@@ -165,25 +186,190 @@
 				html += '		</div>                                                                                                            ';
 				html += '	</div>                                                                                                                ';
 				html += '</div>                                                                                                                    ';
-				$('#completeList').append(html);
+				$('#reviewList').append(html);
 			})
 		}else{
-			$('.nodata').css("display","block");
+			$('.nodata').show();
 		}
-
 		// Create pagination
 		gagaPaging.createPagination(result.paging.pageable);
 	}
 	
+	// 주문 목록 조회 콜백
+	var fnSearchCallback2 = function(result) {
+		$('.nodata').hide();
+		
+		$('#reviewList').html('');
+		
+		if (result.dataList2 != null && result.dataList2.length > 0) {
+			$.each(result.dataList2, function(idx, item) {
+				let html = '';
+				html+='<div class="part_goods">';
+				html+='		<div class="goods_cont">';
+				html+='			<div class="goods_info">';
+				html+='				<div class="order_desc">';
+				html+='					<div class="goods_box">';
+				html+='						<div class="gd_item">	';
+				html+='							<a href="">';
+				html+='								<span class="thumb">';
+				html+='									<img src="' + imageUrl + '/' + item.sysImgNm + '" width="100%" alt="">';
+				html+='								</span>';
+				html+='								<p>';
+				html+='									<span class="buy_date"><em>'+item.payDt+'</em>&nbsp;구매</span>';
+				html+='								</p>';
+				html+='								<p>';
+				html+='									<span class="brand">'+item.brandEnm+'</span>';
+				html+='								</p>';
+				html+='								<p>';
+				html+='									<span class="name">'+item.goodsNm+'</span>																';
+				html+='								</p>';
+				html+='							</a>';
+				html+='						</div>';
+				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+='							</div>';
+				html+='						</div>';
+				html+='					</div>';
+				html+='					<div class="button_box">';
+				if (item.admRpl == null || item.admRpl == '') {
+					html+='						<p><button type="button" class="btn btn_default btn_sm"><span>리뷰 수정</span></button></p>';
+				}
+				html+='						<p><button type="button" class="btn btn_default btn_sm"><span>리뷰 삭제</span></button></p>';
+				html+='					</div>';
+				html+='				</div>';
+				html+='				<div class="order_review">';
+				html+='					<div class="review">';
+				html+='						<div class="info_box">';
+				html+='							<div class="star_score">';
+				html+='								<span class="star">';
+				html+='									<em class="progbar" style="width:'+(item.score*20)+'%;"></em>';
+				html+='								</span>';
+				html+='							</div>';
+				html+='							<div class="writer">';
+				html+='								<span class="wr_date">'+item.regDt+'</span>';
+				html+='							</div>';
+				html+='						</div>';
+				html+='						<div class="response_box">';
+				html+='							<div>';
+				html+='								<dl>';
+				html+='									<div>';
+				html+='										<dt>구매옵션</dt>';
+				html+='										<dd>'+item.optCd1+' / '+item.optCd2+'</dd>';
+				html+='									</div>';
+				html+='								</dl>';
+				html+='							</div>';
+				html+='							<div>';
+				html+='								<dl>';
+				html+='									<div>';
+				html+='										<dt>키/몸무게</dt>';
+				html+='										<dd>'+item.weight+'cm/'+item.height+'kg</dd>';
+				html+='									</div>';
+				if (item.sizeGb == 'T' || item.sizeGb == 'B' || item.sizeGb == 'S') {
+					html+='									<div>';
+					html+='										<dt>사이즈</dt>';
+					html+='										<dd>'+item.scoreSize+'</dd>';
+					html+='									</div>';
+					html+='									<div>';
+					html+='										<dt>컬러</dt>';
+					html+='										<dd>'+item.scoreColor+'</dd>';
+					html+='									</div>';
+				}
+				if (item.sizeGb == 'T' || item.sizeGb == 'B') {
+					html+='									<div>';
+					html+='										<dt>핏</dt>';
+					html+='										<dd>'+item.scoreFit+'</dd>';
+					html+='									</div>';
+					html+='									<div>';
+					html+='										<dt>두께감</dt>';
+					html+='										<dd>'+item.scoreThick+'</dd>';
+					html+='									</div>';
+				}
+				if (item.sizeGb == 'S') {
+					html+='									<div>';
+					html+='										<dt>무게감</dt>';
+					html+='										<dd>'+item.scoreWeight+'</dd>';
+					html+='									</div>';
+					html+='									<div>';
+					html+='										<dt>볼넓이</dt>';
+					html+='										<dd>'+item.scoreBall+'</dd>';
+					html+='									</div>';
+				}
+				html+='								</dl>';
+				html+='							</div>';
+				html+='						</div>';
+				if (attachList != null && attachList.length >0) {
+					for (var i = 0; i < attachList.length; i++) {
+						if (attachList[i].reviewSq == item.reviewSq) {
+							html+='						<div class="photo_box">';
+							html+='							<div class="photo_list">';
+							html+='								<ul>';
+							html+='									<li>';
+							html+='										<a href="">';
+							html+='											<div class="pic">';
+							if (attachList[i].fileGb == 'M') {
+								html+='												<span class="thumb mov" style="background-image:url(' + reviewUrl + '/' + attachList[i].sysFileNm + ');"></span>';
+							}else{
+								html+='												<span class="thumb" style="background-image:url(' + reviewUrl + '/' + attachList[i].sysFileNm + ');"></span>';
+							}
+							html+='											</div>';
+							html+='										</a>';
+							html+='									</li>';
+							html+='								</ul>';
+							html+='							</div>';
+							html+='						</div>';
+						}
+					}
+					
+				}
+				html+='						<div class="txt_review_box" id="admin_'+item.reviewSq+'">';
+				html+='							<p>'+item.reviewContent+'</p>';
+				html+='						</div>';
+				
+				if (item.admRpl != null && item.admRpl != '') {
+					html+='						<div class="reply_box" >';
+					html+='							<div class="reply">';
+					html+='								<div class="reply_writer">';
+					html+='									<span class="wr_name">관리자</span>';
+					html+='									<span class="wr_date">'+item.admRplDt+'</span>';
+					html+='								</div>';
+					html+='								<div class="reply_txt">';
+					html+='									<p>'+item.admRpl+'</p>';
+					html+='								</div>';
+					html+='							</div>';
+					html+='						</div>';
+				}
+				
+				html+='					</div>';
+				html+='				</div>';
+				html+='			</div>';
+				html+='		</div>';
+				html+='</div>	';
+	
+				
+				$('#reviewList').append(html);
+			})
+		}else{
+			$('.nodata').show();
+		}
+		// Create pagination
+		gagaPaging.createPagination(result.paging2.pageable2);
+		
+	}
+	
 	var fnReviewCreate = function(obj1,obj2,obj3) {
 		let ordNo = obj1;
 		let ordDtlNo = obj2;
 		let goodsCd = obj3;
 		
-
-		
 		cfnGoToPage(_PAGE_MYPAGE_CREATE_REVIEW + ordNo +'/'+ordDtlNo+'/'+goodsCd);
-		
+	}
+	
+	var fnMove = function(obj) {
+	  	 var offset = $("#admin_" + obj).offset();
+	  	 console.log(offset);
+        $('html, body').animate({scrollTop : offset.top}, 400);
 	}
 	</script>
 	</th:block>

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

@@ -1227,7 +1227,7 @@ input[type="file"] {
 .quick_menu_group .area > div:first-child span:first-child a{margin-left:0}
 .quick_menu_group .area > div:first-child span:first-child a:after{display:none}
 .quick_menu_group .area > div:first-child span a:after{position:absolute;top:13px;left:0;width:1px;height:13px;background:#959596;content:''}
-.quick_menu_group .inr a{margin-left:16px;color:#eeeeee;}*/
+.quick_menu_group .inr a{margin-left:16px;color:#eeeeee;}
 
 
 

+ 29 - 0
src/main/webapp/ux/style24_link.js

@@ -27,6 +27,7 @@ const _PAGE_CUSTOMER_SECEDE_COMPLETE = _frontUrl + "/customer/secede/complete/fo
 const _PAGE_CUSTOMER_CERTIFICATION = _frontUrl + "/customer/certification/form"						// 고객 > 본인인증화면
 const _PAGE_USE_TERMS = _frontUrl + "/customer/use/terms/form";										// Footer > 이용약관
 const _PAGE_PRIVACY_POLICY = _frontUrl + "/customer/privacy/policy/form";							// Footer > 개인정보취급방침
+const _PAGE_CUSTOMER_CONSENT_USERINFO = _frontUrl + "/customer/consent/useinfo/layer";				// 정보 이용동의 : Yes24 로그인
 
 //== 상품상세 ==/
 const _PAGE_GOODS_DETAIL = _frontUrl + "/goods/detail/form?goodsCd=";								// 상품 상세
@@ -629,6 +630,12 @@ function cfGoodsQng(goodsCd) {
 * </pre>
 */
 function cfGoodsQngCreate(goodsCd) {
+	
+	if (!cfCheckLogin()) {
+		cfnGoToPage(_PAGE_LOGIN);
+		return false;
+	}
+	
 	var Param = new Object();
 	var str = '<div class="modal fade pd_pop pd_qnawrite_pop" id="layer_goods_qna_reg" tabindex="-1" role="dialog" aria-labelledby="pdQnaWriteLabel" aria-hidden="true"></div>';
 
@@ -697,6 +704,26 @@ function cfGoodsDeailDetail(goodsCd, compsGoodsCd) {
 	cfOpenFullLayer(_PAGE_DEAL_GOODS_DETAIL_LAYER + goodsCd +'/'+compsGoodsCd, 'layer_goods_deal_detail');
 }
 
+
+/**
+ * @type   : function
+ * @access : public
+ * @desc   : 딜구성상품상세 full 팝업
+ * @param  : custNm - 고객명
+ * <pre>
+ *		cfnConsentUseInfo(custNm);
+ * </pre>
+ */
+function cfnConsentUseInfo(custNm) {
+	let str = '<div class="modal fade mbAgree_pop" id="layer_consent_useinfo" tabIndex="-1" role="dialog" aria-labelledby="mbAgreeLabel" aria-hidden="true"></div>';
+
+	if ($('#layer_consent_useinfo').length == 0) {
+		$('body').append(str);
+	}
+
+	cfOpenLayer(_PAGE_CUSTOMER_CONSENT_USERINFO, 'layer_consent_useinfo');
+}
+
 /**
  * @type   : function
  * @access : public
@@ -876,3 +903,5 @@ var cfnGoToBrandMain = function(brandGroupNo) {
 	var params = '?brandGroupNo=' + brandGroupNo;
 	cfnGoToPage(_PAGE_BRAND_MAIN + params);
 }
+
+